[Scummvm-git-logs] scummvm master -> 4c92044e36a255a2dc2be5aeee10102a21ff62ef

djsrv dservilla at gmail.com
Tue Jul 7 21:01:42 UTC 2020


This automated email contains information about 5 new commits which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .

Summary:
59baadaefc DIRECTOR: LINGO: Fix builtin method calls
8ea0b01c87 DIRECTOR: LINGO: Remove debug lines
b2c20a07f7 DIRECTOR: LINGO: Refactor Object
3f0a33e5e8 DIRECTOR: LINGO: Allow method calls on any objtype
4c92044e36 DIRECTOR: LINGO: Stub window/stage methods


Commit: 59baadaefc2812676e296b6f19ef29bb7cf3f305
    https://github.com/scummvm/scummvm/commit/59baadaefc2812676e296b6f19ef29bb7cf3f305
Author: djsrv (dservilla at gmail.com)
Date: 2020-07-07T16:53:31-04:00

Commit Message:
DIRECTOR: LINGO: Fix builtin method calls

Changed paths:
    engines/director/lingo/lingo-code.cpp


diff --git a/engines/director/lingo/lingo-code.cpp b/engines/director/lingo/lingo-code.cpp
index df012d0f60..de14da35ac 100644
--- a/engines/director/lingo/lingo-code.cpp
+++ b/engines/director/lingo/lingo-code.cpp
@@ -1420,16 +1420,11 @@ void LC::call(const Symbol &funcSym, int nargs) {
 	if (funcSym.type == BLTIN || funcSym.type == FBLTIN || funcSym.type == RBLTIN) {
 		int stackSize = g_lingo->_stack.size() - nargs;
 
-		Datum target;
-		if (funcSym.ctx) {
-			target = funcSym.target;
-		}
-
-		if (target.type == OBJECT) {
+		if (funcSym.target) {
 			// Only need to update the me obj
 			// Pushing an entire stack frame is not necessary
 			Datum retMe = g_lingo->_currentMe;
-			g_lingo->_currentMe = target;
+			g_lingo->_currentMe = funcSym.target;
 			(*funcSym.u.bltin)(nargs);
 			g_lingo->_currentMe = retMe;
 		} else {


Commit: 8ea0b01c87f805b61a78c836d3c5200a4ccb3507
    https://github.com/scummvm/scummvm/commit/8ea0b01c87f805b61a78c836d3c5200a4ccb3507
Author: djsrv (dservilla at gmail.com)
Date: 2020-07-07T16:59:44-04:00

Commit Message:
DIRECTOR: LINGO: Remove debug lines

Changed paths:
    engines/director/lingo/lingo.cpp


diff --git a/engines/director/lingo/lingo.cpp b/engines/director/lingo/lingo.cpp
index 584419ba33..3d5daeacb2 100644
--- a/engines/director/lingo/lingo.cpp
+++ b/engines/director/lingo/lingo.cpp
@@ -689,8 +689,6 @@ Datum::Datum(const Datum &d) {
 }
 
 Datum& Datum::operator=(const Datum &d) {
-	if (d.type == OBJECT)
-		warning("%p = REFCOUNT %d", (void *)this, *refCount);
 	if (this != &d && refCount != d.refCount) {
 		reset();
 		type = d.type;
@@ -731,7 +729,6 @@ Datum::Datum(Object *val) {
 	lazy = false;
 	refCount = val->refCount;
 	*refCount += 1;
-	warning("%p create REFCOUNT %d", (void *)this, *refCount);
 }
 
 void Datum::reset() {


Commit: b2c20a07f710a450f4dd1c772425994e43038006
    https://github.com/scummvm/scummvm/commit/b2c20a07f710a450f4dd1c772425994e43038006
Author: djsrv (dservilla at gmail.com)
Date: 2020-07-07T16:59:55-04:00

Commit Message:
DIRECTOR: LINGO: Refactor Object

This turns Object into a template so any type can easily act as a Lingo
object. For example, script objects no longer own a script context.
They *are* script contexts, and there are custom getters/setters for
methods and properties.

Changed paths:
    engines/director/cast.cpp
    engines/director/lingo/lingo-builtins.cpp
    engines/director/lingo/lingo-bytecode.cpp
    engines/director/lingo/lingo-code.cpp
    engines/director/lingo/lingo-codegen.cpp
    engines/director/lingo/lingo-events.cpp
    engines/director/lingo/lingo-gr.cpp
    engines/director/lingo/lingo-gr.h
    engines/director/lingo/lingo-gr.y
    engines/director/lingo/lingo-object.cpp
    engines/director/lingo/lingo-object.h
    engines/director/lingo/lingo.cpp
    engines/director/lingo/lingo.h
    engines/director/lingo/xlibs/fileio.cpp
    engines/director/lingo/xlibs/fileio.h
    engines/director/movie.cpp


diff --git a/engines/director/cast.cpp b/engines/director/cast.cpp
index 498362aad1..53c9b4680e 100644
--- a/engines/director/cast.cpp
+++ b/engines/director/cast.cpp
@@ -39,6 +39,7 @@
 #include "director/stxt.h"
 #include "director/util.h"
 #include "director/lingo/lingo.h"
+#include "director/lingo/lingo-object.h"
 
 namespace Director {
 
diff --git a/engines/director/lingo/lingo-builtins.cpp b/engines/director/lingo/lingo-builtins.cpp
index d0ece1c429..e90620acb3 100644
--- a/engines/director/lingo/lingo-builtins.cpp
+++ b/engines/director/lingo/lingo-builtins.cpp
@@ -1288,7 +1288,7 @@ void LB::b_return(int nargs) {
 	CFrame *fp = g_lingo->_callstack.back();
 	// Do not allow a factory's mNew method to return a value
 	// Otherwise do not touch the top of the stack, it will be returned
-	if (g_lingo->_currentMe.type == OBJECT && g_lingo->_currentMe.u.obj->type == kFactoryObj && fp->sp.name->equalsIgnoreCase("mNew")) {
+	if (g_lingo->_currentMe.type == OBJECT && g_lingo->_currentMe.u.obj->getObjType() == kFactoryObj && fp->sp.name->equalsIgnoreCase("mNew")) {
 		g_lingo->pop();
 	}
 	LC::c_procret();
@@ -1327,8 +1327,8 @@ void LB::b_factory(int nargs) {
 	Datum factoryName = g_lingo->pop();
 	factoryName.type = VAR;
 	Datum o = g_lingo->varFetch(factoryName, true);
-	if (o.type == OBJECT && (o.u.obj->type & (kFactoryObj | kXObj))
-			&& o.u.obj->name->equalsIgnoreCase(*factoryName.u.s) && o.u.obj->inheritanceLevel == 1) {
+	if (o.type == OBJECT && (o.u.obj->getObjType() & (kFactoryObj | kXObj))
+			&& o.u.obj->getName().equalsIgnoreCase(*factoryName.u.s) && o.u.obj->getInheritanceLevel() == 1) {
 		g_lingo->push(o);
 	} else {
 		g_lingo->push(Datum(0));
@@ -1357,7 +1357,7 @@ void LB::b_objectp(int nargs) {
 	Datum d = g_lingo->pop();
 	Datum res;
 	if (d.type == OBJECT) {
-		res = !d.u.obj->disposed;
+		res = !d.u.obj->isDisposed();
 	} else {
 		res = 0;
 	}
@@ -2200,7 +2200,7 @@ void LB::b_script(int nargs) {
 		}
 
 		if (script) {
-			g_lingo->push(Datum(script->getParentScript()));
+			g_lingo->push(script);
 			return;
 		}
 	}
diff --git a/engines/director/lingo/lingo-bytecode.cpp b/engines/director/lingo/lingo-bytecode.cpp
index aca410f484..e901c1c3b9 100644
--- a/engines/director/lingo/lingo-bytecode.cpp
+++ b/engines/director/lingo/lingo-bytecode.cpp
@@ -317,7 +317,7 @@ void LC::cb_objectcall() {
 	Datum d = g_lingo->pop();
 	Datum nargs = g_lingo->pop();
 
-	Object *target = nullptr;
+	AbstractObject *target = nullptr;
 
 	if (d.type == INT) {
 		if (g_lingo->_callstack.empty()) {
@@ -381,7 +381,7 @@ void LC::cb_objectcall() {
 		}
 		Symbol method = target->getMethod(methodName.asString());
 		if (method.type != VOID) {
-			if (target->type == kFactoryObj && method.type == HANDLER) {
+			if (target->getObjType() == kFactoryObj && method.type == HANDLER) {
 				// For kFactoryObj handlers the target is the first argument
 				g_lingo->push(method.target);
 				nargs.u.i += 1;
@@ -909,7 +909,6 @@ ScriptContext *Lingo::compileLingoV4(Common::SeekableSubReadStreamEndian &stream
 		debugC(1, kDebugCompile, "Add V4 bytecode for factory '%s' with id %d", factoryName.c_str(), castId);
 
 		codeFactory(factoryName);
-		_assemblyContext = _currentFactory->ctx;
 	} else {
 		debugC(1, kDebugCompile, "Add V4 bytecode for type %s with id %d", scriptType2str(scriptType), castId);
 
@@ -936,11 +935,7 @@ ScriptContext *Lingo::compileLingoV4(Common::SeekableSubReadStreamEndian &stream
 		if (0 <= index && index < (int16)archive->names.size()) {
 			const char *name = archive->names[index].c_str();
 			debugC(5, kDebugLoading, "%d: %s", i, name);
-			if (scriptFlags & kScriptFlagFactoryDef) {
-				_currentFactory->properties[name] = Datum();
-			} else {
-				_assemblyContext->_propNames.push_back(name);
-			}
+			_assemblyContext->_properties[name] = Datum();
 		} else {
 			warning("Property %d has unknown name id %d, skipping define", i, index);
 		}
@@ -1437,15 +1432,16 @@ ScriptContext *Lingo::compileLingoV4(Common::SeekableSubReadStreamEndian &stream
 
 	free(codeStore);
 	_assemblyContext = nullptr;
-	_currentFactory = nullptr;
 
 	return sc;
 }
 
 void LingoArchive::addCodeV4(Common::SeekableSubReadStreamEndian &stream, const Common::String &archName) {
 	ScriptContext *ctx = g_lingo->compileLingoV4(stream, this, archName);
-	if (ctx)
-		scriptContexts[ctx->_type][ctx->_id] = ctx;
+	if (ctx) {
+		scriptContexts[ctx->_scriptType][ctx->_id] = ctx;
+		*ctx->_refCount += 1;
+	}
 }
 
 void LingoArchive::addNamesV4(Common::SeekableSubReadStreamEndian &stream) {
diff --git a/engines/director/lingo/lingo-code.cpp b/engines/director/lingo/lingo-code.cpp
index de14da35ac..88791df635 100644
--- a/engines/director/lingo/lingo-code.cpp
+++ b/engines/director/lingo/lingo-code.cpp
@@ -1330,15 +1330,15 @@ void LC::call(const Common::String &name, int nargs) {
 	// Script/Xtra method call
 	if (nargs > 0) {
 		Datum d = g_lingo->peek(nargs - 1);
-		if (d.type == OBJECT && (d.u.obj->type & (kScriptObj | kXtraObj))) {
+		if (d.type == OBJECT && (d.u.obj->getObjType() & (kScriptObj | kXtraObj))) {
 			debugC(3, kDebugLingoExec, "Method called on object: <%s>", d.asString(true).c_str());
-			Object *target = d.u.obj;
+			AbstractObject *target = d.u.obj;
 			if (name.equalsIgnoreCase("birth") || name.equalsIgnoreCase("new")) {
 				target = target->clone();
 			}
 			funcSym = target->getMethod(name);
 			if (funcSym.type != VOID) {
-				if (target->type == kScriptObj && funcSym.type == HANDLER) {
+				if (target->getObjType() == kScriptObj && funcSym.type == HANDLER) {
 					// For kScriptObj handlers the target is the first argument
 					g_lingo->_stack[g_lingo->_stack.size() - nargs] = funcSym.target;
 				} else {
@@ -1360,15 +1360,15 @@ void LC::call(const Common::String &name, int nargs) {
 		Datum objName(name);
 		objName.type = VAR;
 		Datum d = g_lingo->varFetch(objName);
-		if (d.type == OBJECT && (d.u.obj->type & (kFactoryObj | kXObj))) {
+		if (d.type == OBJECT && (d.u.obj->getObjType() & (kFactoryObj | kXObj))) {
 			debugC(3, kDebugLingoExec, "Method called on object: <%s>", d.asString(true).c_str());
-			Object *target = d.u.obj;
+			AbstractObject *target = d.u.obj;
 			Datum methodName = g_lingo->_stack[g_lingo->_stack.size() - nargs];
 			if (methodName.u.s->equalsIgnoreCase("mNew")) {
 				target = target->clone();
 			}
 			funcSym = target->getMethod(*methodName.u.s);
-			if (target->type == kScriptObj && funcSym.type == HANDLER) {
+			if (target->getObjType() == kScriptObj && funcSym.type == HANDLER) {
 				// For kFactoryObj handlers the target is the first argument
 				g_lingo->_stack[g_lingo->_stack.size() - nargs] = funcSym.target;
 			} else {
@@ -1510,7 +1510,7 @@ void LC::c_procret() {
 	}
 
 	CFrame *fp = g_lingo->_callstack.back();
-	if (g_lingo->_currentMe.type == OBJECT && g_lingo->_currentMe.u.obj->type == kFactoryObj && fp->sp.name->equalsIgnoreCase("mNew")) {
+	if (g_lingo->_currentMe.type == OBJECT && g_lingo->_currentMe.u.obj->getObjType() == kFactoryObj && fp->sp.name->equalsIgnoreCase("mNew")) {
 		// Return the newly created object after executing mNew
 		g_lingo->push(g_lingo->_currentMe);
 	}
diff --git a/engines/director/lingo/lingo-codegen.cpp b/engines/director/lingo/lingo-codegen.cpp
index 5eb42296bc..f7cb85b084 100644
--- a/engines/director/lingo/lingo-codegen.cpp
+++ b/engines/director/lingo/lingo-codegen.cpp
@@ -87,7 +87,7 @@ Symbol ScriptContext::define(Common::String &name, int nargs, ScriptData *code,
 
 	if (!g_lingo->_eventHandlerTypeIds.contains(name)) {
 		_functionHandlers[name] = sym;
-		if (_type == kMovieScript && _archive && !_archive->functionHandlers.contains(name)) {
+		if (_scriptType == kMovieScript && _archive && !_archive->functionHandlers.contains(name)) {
 			_archive->functionHandlers[name] = sym;
 		}
 	} else {
@@ -97,9 +97,9 @@ Symbol ScriptContext::define(Common::String &name, int nargs, ScriptData *code,
 	return sym;
 }
 
-Symbol Lingo::codeDefine(Common::String &name, int start, int nargs, Object *factory, int end, bool removeCode) {
-	debugC(1, kDebugCompile, "codeDefine(\"%s\"(len: %d), %d, %d, \"%s\", %d)",
-			name.c_str(), _currentAssembly->size() - 1, start, nargs, (factory ? factory->name->c_str() : ""), end);
+Symbol Lingo::codeDefine(Common::String &name, int start, int nargs, int end, bool removeCode) {
+	debugC(1, kDebugCompile, "codeDefine(\"%s\"(len: %d), %d, %d, %d)",
+			name.c_str(), _currentAssembly->size() - 1, start, nargs, end);
 
 	if (end == -1)
 		end = _currentAssembly->size();
@@ -115,8 +115,7 @@ Symbol Lingo::codeDefine(Common::String &name, int start, int nargs, Object *fac
 			varNames->push_back(Common::String(it->_key));
 	}
 
-	ScriptContext *ctx = factory ? factory->ctx : _assemblyContext;
-	Symbol sym = ctx->define(name, nargs, code, argNames, varNames);
+	Symbol sym = _assemblyContext->define(name, nargs, code, argNames, varNames);
 
 	if (debugChannelSet(1, kDebugCompile)) {
 		debug("Function vars");
@@ -287,12 +286,9 @@ void Lingo::varCreate(const Common::String &name, bool global, DatumHash *localv
 void Lingo::codeFactory(Common::String &name) {
 	// FIXME: The factory's context should not be tied to the LingoArchive
 	// but bytecode needs it to resolve names
-	ScriptContext *ctx = new ScriptContext(name, _assemblyArchive);
-	Object *obj = new Object(name, kFactoryObj, ctx);
-
-	_currentFactory = obj;
+	_assemblyContext->setFactory(true);
 	if (!_globalvars.contains(name)) {
-		_globalvars[name] = obj;
+		_globalvars[name] = _assemblyContext;
 	} else {
 		warning("Factory '%s' already defined", name.c_str());
 	}
diff --git a/engines/director/lingo/lingo-events.cpp b/engines/director/lingo/lingo-events.cpp
index 9055127243..5b0d8d4650 100644
--- a/engines/director/lingo/lingo-events.cpp
+++ b/engines/director/lingo/lingo-events.cpp
@@ -23,6 +23,7 @@
 #include "director/director.h"
 #include "director/lingo/lingo.h"
 #include "director/lingo/lingo-code.h"
+#include "director/lingo/lingo-object.h"
 #include "director/cast.h"
 #include "director/movie.h"
 #include "director/frame.h"
diff --git a/engines/director/lingo/lingo-gr.cpp b/engines/director/lingo/lingo-gr.cpp
index 38837d1d4c..78c0eed3b4 100644
--- a/engines/director/lingo/lingo-gr.cpp
+++ b/engines/director/lingo/lingo-gr.cpp
@@ -117,7 +117,7 @@ static void startDef() {
 			(*g_lingo->_methodVars)[i->_key] = i->_value;
 	}
 	if (g_lingo->_inFactory) {
-		for (DatumHash::iterator i = g_lingo->_currentFactory->properties.begin(); i != g_lingo->_currentFactory->properties.end(); ++i) {
+		for (DatumHash::iterator i = g_lingo->_assemblyContext->_properties.begin(); i != g_lingo->_assemblyContext->_properties.end(); ++i) {
 			(*g_lingo->_methodVars)[i->_key] = kVarInstance;
 		}
 	}
@@ -166,14 +166,8 @@ static VarType globalCheck() {
 static void mVar(Common::String *s, VarType type) {
 	if (!g_lingo->_methodVars->contains(*s)) {
 		(*g_lingo->_methodVars)[*s] = type;
-		if (type == kVarProperty) {
-			g_lingo->_assemblyContext->_propNames.push_back(*s);
-		} else if (type == kVarInstance) {
-			if (g_lingo->_inFactory) {
-				g_lingo->_currentFactory->properties[*s] = Datum();
-			} else {
-				warning("Instance var '%s' defined outside factory", s->c_str());
-			}
+		if (type == kVarProperty || type == kVarInstance) {
+			g_lingo->_assemblyContext->_properties[*s] = Datum();
 		} else if (type == kVarGlobal) {
 			g_lingo->varCreate(*s, true);
 		}
@@ -181,7 +175,7 @@ static void mVar(Common::String *s, VarType type) {
 }
 
 
-#line 185 "engines/director/lingo/lingo-gr.cpp"
+#line 179 "engines/director/lingo/lingo-gr.cpp"
 
 # ifndef YY_CAST
 #  ifdef __cplusplus
@@ -317,7 +311,7 @@ extern int yydebug;
 #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
 union YYSTYPE
 {
-#line 168 "engines/director/lingo/lingo-gr.y"
+#line 162 "engines/director/lingo/lingo-gr.y"
 
 	Common::String *s;
 	int i;
@@ -332,7 +326,7 @@ union YYSTYPE
 		Common::String *prop;
 	} objectprop;
 
-#line 336 "engines/director/lingo/lingo-gr.cpp"
+#line 330 "engines/director/lingo/lingo-gr.cpp"
 
 };
 typedef union YYSTYPE YYSTYPE;
@@ -497,20 +491,19 @@ enum yysymbol_kind_t
   YYSYMBOL_defn = 144,                     /* defn  */
   YYSYMBOL_145_15 = 145,                   /* $@15  */
   YYSYMBOL_146_16 = 146,                   /* $@16  */
-  YYSYMBOL_147_17 = 147,                   /* $@17  */
-  YYSYMBOL_on = 148,                       /* on  */
-  YYSYMBOL_149_18 = 149,                   /* $@18  */
-  YYSYMBOL_argdef = 150,                   /* argdef  */
-  YYSYMBOL_endargdef = 151,                /* endargdef  */
-  YYSYMBOL_argstore = 152,                 /* argstore  */
-  YYSYMBOL_macro = 153,                    /* macro  */
-  YYSYMBOL_arglist = 154,                  /* arglist  */
-  YYSYMBOL_nonemptyarglist = 155,          /* nonemptyarglist  */
-  YYSYMBOL_list = 156,                     /* list  */
-  YYSYMBOL_valuelist = 157,                /* valuelist  */
-  YYSYMBOL_linearlist = 158,               /* linearlist  */
-  YYSYMBOL_proplist = 159,                 /* proplist  */
-  YYSYMBOL_proppair = 160                  /* proppair  */
+  YYSYMBOL_on = 147,                       /* on  */
+  YYSYMBOL_148_17 = 148,                   /* $@17  */
+  YYSYMBOL_argdef = 149,                   /* argdef  */
+  YYSYMBOL_endargdef = 150,                /* endargdef  */
+  YYSYMBOL_argstore = 151,                 /* argstore  */
+  YYSYMBOL_macro = 152,                    /* macro  */
+  YYSYMBOL_arglist = 153,                  /* arglist  */
+  YYSYMBOL_nonemptyarglist = 154,          /* nonemptyarglist  */
+  YYSYMBOL_list = 155,                     /* list  */
+  YYSYMBOL_valuelist = 156,                /* valuelist  */
+  YYSYMBOL_linearlist = 157,               /* linearlist  */
+  YYSYMBOL_proplist = 158,                 /* proplist  */
+  YYSYMBOL_proppair = 159                  /* proppair  */
 };
 typedef enum yysymbol_kind_t yysymbol_kind_t;
 
@@ -820,16 +813,16 @@ union yyalloc
 /* YYFINAL -- State number of the termination state.  */
 #define YYFINAL  125
 /* YYLAST -- Last index in YYTABLE.  */
-#define YYLAST   2602
+#define YYLAST   2593
 
 /* YYNTOKENS -- Number of terminals.  */
 #define YYNTOKENS  102
 /* YYNNTS -- Number of nonterminals.  */
-#define YYNNTS  59
+#define YYNNTS  58
 /* YYNRULES -- Number of rules.  */
-#define YYNRULES  182
+#define YYNRULES  181
 /* YYNSTATES -- Number of states.  */
-#define YYNSTATES  382
+#define YYNSTATES  381
 
 #define YYMAXUTOK   341
 
@@ -886,25 +879,25 @@ static const yytype_int8 yytranslate[] =
   /* YYRLINE[YYN] -- Source line where rule number YYN was defined.  */
 static const yytype_int16 yyrline[] =
 {
-       0,   220,   220,   221,   223,   224,   225,   227,   234,   238,
-     249,   256,   259,   266,   269,   276,   283,   290,   297,   303,
-     310,   321,   332,   339,   347,   348,   349,   351,   352,   357,
-     370,   374,   377,   369,   404,   408,   411,   403,   438,   445,
-     451,   437,   481,   489,   492,   493,   495,   497,   499,   506,
-     514,   515,   517,   523,   527,   531,   535,   538,   540,   541,
-     542,   544,   547,   550,   554,   558,   562,   570,   576,   577,
-     578,   589,   590,   591,   594,   597,   603,   603,   608,   611,
-     614,   620,   621,   622,   623,   624,   625,   626,   627,   628,
-     629,   630,   631,   632,   633,   634,   635,   636,   637,   638,
-     639,   640,   641,   642,   644,   645,   646,   647,   648,   649,
-     650,   651,   653,   656,   658,   659,   660,   661,   669,   670,
-     670,   671,   671,   672,   672,   673,   676,   679,   680,   682,
-     685,   689,   692,   696,   699,   710,   711,   712,   713,   717,
-     721,   726,   727,   729,   733,   737,   741,   741,   771,   771,
-     771,   777,   778,   778,   784,   792,   798,   798,   801,   802,
-     803,   805,   806,   807,   809,   811,   819,   820,   821,   823,
-     824,   826,   828,   829,   830,   831,   833,   834,   836,   837,
-     839,   843,   847
+       0,   214,   214,   215,   217,   218,   219,   221,   228,   232,
+     243,   250,   253,   260,   263,   270,   277,   284,   291,   297,
+     304,   315,   326,   333,   341,   342,   343,   345,   346,   351,
+     364,   368,   371,   363,   398,   402,   405,   397,   432,   439,
+     445,   431,   475,   483,   486,   487,   489,   491,   493,   500,
+     508,   509,   511,   517,   521,   525,   529,   532,   534,   535,
+     536,   538,   541,   544,   548,   552,   556,   564,   570,   571,
+     572,   583,   584,   585,   588,   591,   597,   597,   602,   605,
+     608,   614,   615,   616,   617,   618,   619,   620,   621,   622,
+     623,   624,   625,   626,   627,   628,   629,   630,   631,   632,
+     633,   634,   635,   636,   638,   639,   640,   641,   642,   643,
+     644,   645,   647,   650,   652,   653,   654,   655,   663,   664,
+     664,   665,   665,   666,   666,   667,   670,   673,   674,   676,
+     679,   683,   686,   690,   693,   704,   705,   706,   707,   711,
+     715,   720,   721,   723,   727,   731,   735,   735,   765,   765,
+     771,   772,   772,   778,   786,   792,   792,   794,   795,   796,
+     798,   799,   800,   802,   804,   812,   813,   814,   816,   817,
+     819,   821,   822,   823,   824,   826,   827,   829,   830,   832,
+     836,   840
 };
 #endif
 
@@ -941,10 +934,9 @@ yysymbol_name (yysymbol_kind_t yysymbol)
   "elseifstmt", "jumpifz", "jump", "varassign", "if", "lbl", "stmtlist",
   "simpleexpr", "expr", "$@10", "chunkexpr", "reference", "proc", "$@11",
   "$@12", "$@13", "globallist", "propertylist", "instancelist", "gotofunc",
-  "gotomovie", "playfunc", "$@14", "defn", "$@15", "$@16", "$@17", "on",
-  "$@18", "argdef", "endargdef", "argstore", "macro", "arglist",
-  "nonemptyarglist", "list", "valuelist", "linearlist", "proplist",
-  "proppair", YY_NULLPTR
+  "gotomovie", "playfunc", "$@14", "defn", "$@15", "$@16", "on", "$@17",
+  "argdef", "endargdef", "argstore", "macro", "arglist", "nonemptyarglist",
+  "list", "valuelist", "linearlist", "proplist", "proppair", YY_NULLPTR
   };
   return yy_sname[yysymbol];
 }
@@ -969,12 +961,12 @@ static const yytype_int16 yytoknum[] =
 };
 #endif
 
-#define YYPACT_NINF (-328)
+#define YYPACT_NINF (-325)
 
 #define yypact_value_is_default(Yyn) \
   ((Yyn) == YYPACT_NINF)
 
-#define YYTABLE_NINF (-173)
+#define YYTABLE_NINF (-172)
 
 #define yytable_value_is_error(Yyn) \
   0
@@ -983,45 +975,45 @@ static const yytype_int16 yytoknum[] =
      STATE-NUM.  */
 static const yytype_int16 yypact[] =
 {
-     786,   -86,  -328,  -328,    52,  -328,   612,   334,    52,   -34,
-     515,  -328,  -328,  -328,  -328,  -328,   -30,  -328,  1782,  -328,
-    -328,  -328,    -2,  2020,   -13,   128,    28,    51,  2056,  1818,
-    -328,  2056,  2056,  2056,  2056,  2056,  2056,  2056,  -328,  -328,
-    2056,  2056,  2056,   427,    80,    17,  -328,  -328,  -328,  -328,
-    2056,  -328,  2496,  -328,  -328,  -328,  -328,  -328,  -328,  -328,
-    -328,  -328,  -328,  -328,  -328,    -7,  2020,  1898,  2496,    12,
-    1898,    12,  -328,    52,  1934,  2496,    64,   699,  -328,  -328,
-     124,  2056,  -328,   121,  -328,  2077,  -328,   170,  -328,   172,
-     400,   180,  -328,    19,    52,    52,    41,    58,   155,  -328,
-    2413,  2077,  -328,   183,  -328,  2110,  2143,  2176,  2209,  2463,
-    2374,   184,   185,  -328,  -328,  2426,   -55,   111,   112,  -328,
-    2496,   114,   117,   118,  -328,  -328,   786,  2496,  2056,  2056,
-    2056,  2056,  2056,  2056,  2056,  2056,  2056,  2056,  2056,  2056,
-    2056,  2056,  2056,  2056,  2056,   191,  1934,   400,  2426,    60,
-    2056,    78,  -328,    91,    93,  2056,    12,   191,  -328,   120,
-    2496,  2056,  -328,  -328,    52,   -18,    25,    39,   -23,  2056,
-    2056,  2056,    89,   173,  2056,  2056,  2056,  2056,  2056,  2056,
-    -328,  -328,   123,  2056,  2056,  2056,  2056,  2056,  2056,  2056,
-    2056,  2056,  2056,  -328,  -328,  -328,   129,  -328,  -328,  2056,
-    2056,  2056,  -328,  2056,    59,  -328,   167,    16,    16,    16,
-      16,  2509,  2509,  -328,    27,    16,    16,    16,    16,    27,
-     -54,   -54,  -328,  -328,  -328,   -74,  -328,  2496,  -328,  -328,
-    -328,  -328,  2496,   -43,   200,  2496,  -328,   186,  -328,  -328,
-    -328,  -328,  -328,  -328,  2056,  2056,  2496,  2496,    16,  2056,
-    2056,   202,  2496,    16,  2496,    16,  2496,  2496,   204,  2496,
-    2242,  2496,  2275,  2496,  2308,  2496,  2341,  2496,  2496,  1702,
-    -328,   206,  2496,  2496,  2496,  2496,   133,   111,   112,  -328,
-    -328,  -328,   209,  2056,  -328,  -328,   191,  2056,  2496,   240,
-    -328,  2496,    16,    52,  -328,  2056,  2056,  2056,  2056,  -328,
-    1203,  -328,  1119,  -328,  -328,   103,  -328,    61,  2496,  -328,
-    -328,  -328,  -328,    90,  2496,  2496,  2496,  2496,  -328,  -328,
-    -328,   150,  -328,   870,  -328,   953,  -328,  -328,  -328,  -328,
-    1286,  2056,  2056,  -328,    56,   211,  -328,  -328,   187,   207,
-     157,  2496,    16,  -328,  2056,  -328,   161,  -328,   148,  1036,
-    -328,  2056,   194,  -328,  1369,  2496,  -328,   222,  -328,  2496,
-    2056,   165,   198,  -328,  -328,  -328,  2496,  -328,  -328,  1453,
-    -328,  -328,  1119,  -328,  -328,  -328,  -328,  1536,  -328,  -328,
-    1619,  -328
+     785,   -79,  -325,  -325,    52,  -325,   611,   333,    52,   -39,
+     514,  -325,  -325,  -325,  -325,  -325,    -4,  -325,  1781,  -325,
+    -325,  -325,    -2,  1933,    98,   124,    29,    31,  2013,  1817,
+    -325,  2013,  2013,  2013,  2013,  2013,  2013,  2013,  -325,  -325,
+    2013,  2013,  2013,   426,    50,   -15,  -325,  -325,  -325,  -325,
+    2013,  -325,  2487,  -325,  -325,  -325,  -325,  -325,  -325,  -325,
+    -325,  -325,  -325,  -325,  -325,   -44,  1933,   233,  2487,   -10,
+     233,   -10,  -325,    52,  1897,  2487,    14,   698,  -325,  -325,
+      68,  2013,  -325,    74,  -325,  2068,  -325,    95,  -325,   119,
+     399,   121,  -325,   -43,    52,    52,    24,    32,   114,  -325,
+    2404,  2068,  -325,   166,  -325,  2101,  2134,  2167,  2200,  2454,
+    2365,   170,   184,  -325,  -325,  2417,   -87,   110,   112,  -325,
+    2487,   115,   116,   118,  -325,  -325,   785,  2487,  2013,  2013,
+    2013,  2013,  2013,  2013,  2013,  2013,  2013,  2013,  2013,  2013,
+    2013,  2013,  2013,  2013,  2013,   186,  1897,   399,  2417,    62,
+    2013,    78,  -325,   102,   108,  2013,   -10,   186,  -325,   120,
+    2487,  2013,  -325,  -325,    52,    25,    30,    39,   -18,  2013,
+    2013,  2013,    93,   172,  2013,  2013,  2013,  2013,  2013,  2013,
+    -325,  -325,   122,  2013,  2013,  2013,  2013,  2013,  2013,  2013,
+    2013,  2013,  2013,  -325,  -325,  -325,   123,  -325,  -325,  2013,
+    2013,  2013,  -325,  2013,    91,  -325,   165,   -50,   -50,   -50,
+     -50,  2500,  2500,  -325,    18,   -50,   -50,   -50,   -50,    18,
+      -1,    -1,  -325,  -325,  -325,   -36,  -325,  2487,  -325,  -325,
+    -325,  -325,  2487,    63,   196,  2487,   186,   180,  -325,  -325,
+    -325,  -325,  -325,  -325,  2013,  2013,  2487,  2487,   -50,  2013,
+    2013,   198,  2487,   -50,  2487,   -50,  2487,  2487,   199,  2487,
+    2233,  2487,  2266,  2487,  2299,  2487,  2332,  2487,  2487,  1701,
+    -325,   202,  2487,  2487,  2487,  2487,   128,   110,   112,  -325,
+    -325,  -325,   204,  2013,  -325,  -325,    92,  2013,  2487,  2034,
+    -325,  2487,   -50,    52,  -325,  2013,  2013,  2013,  2013,  -325,
+    1202,  -325,  1118,  -325,  -325,   111,  -325,  -325,  2487,  -325,
+    -325,  -325,  -325,    99,  2487,  2487,  2487,  2487,  -325,  -325,
+    -325,   145,  -325,   869,  -325,   952,  -325,  -325,  -325,  -325,
+    1285,  2013,  2013,  -325,   153,   206,  1035,  -325,   182,   203,
+     148,  2487,   -50,  -325,  2013,  -325,   156,  -325,   143,  -325,
+    2013,   189,  -325,  1368,  2487,  -325,   219,  -325,  2487,  2013,
+     162,   197,  -325,  -325,  -325,  2487,  -325,  -325,  1452,  -325,
+    -325,  1118,  -325,  -325,  -325,  -325,  1535,  -325,  -325,  1618,
+    -325
 };
 
   /* YYDEFACT[STATE-NUM] -- Default reduction number in state STATE-NUM.
@@ -1030,66 +1022,66 @@ static const yytype_int16 yypact[] =
 static const yytype_uint8 yydefact[] =
 {
        0,     0,    61,    66,     0,    62,     0,     0,     0,     0,
-       0,    64,    63,   146,   152,    80,   118,   119,     0,   135,
+       0,    64,    63,   146,   151,    80,   118,   119,     0,   135,
       56,   148,     0,     0,     0,     0,     0,     0,     0,     0,
-     123,     0,     0,     0,     0,     0,     0,     0,   121,   156,
+     123,     0,     0,     0,     0,     0,     0,     0,   121,   155,
        0,     0,     0,     0,     0,     2,    81,    27,     6,    28,
        0,    71,    25,   113,    72,    26,   115,   116,     5,    57,
-      24,    69,    70,    65,    67,    65,     0,     0,   167,   126,
-       0,    74,   112,     0,     0,   169,   165,     0,    57,   117,
+      24,    69,    70,    65,    67,    65,     0,     0,   166,   126,
+       0,    74,   112,     0,     0,   168,   164,     0,    57,   117,
        0,     0,   136,     0,   137,   138,   140,     0,    42,     0,
-     114,     0,    57,     0,     0,     0,     0,     0,     0,   151,
+     114,     0,    57,     0,     0,     0,     0,     0,     0,   150,
      128,   143,   145,     0,    95,     0,     0,     0,     0,     0,
-       0,     0,     0,   100,   101,     0,    65,    64,    63,   173,
-     176,     0,   175,   174,   178,     1,     0,    53,     0,     0,
+       0,     0,     0,   100,   101,     0,    65,    64,    63,   172,
+     175,     0,   174,   173,   177,     1,     0,    53,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,   158,     0,     0,   167,     0,
-       0,     0,    79,    65,     0,     0,   147,   158,   129,   120,
-     142,     0,   139,   149,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,   157,     0,     0,   166,     0,
+       0,     0,    79,    65,     0,     0,   147,   157,   129,   120,
+     142,     0,   139,    57,     0,     0,     0,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
      144,   133,   124,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,    47,    47,   131,   122,   157,    68,     0,
-       0,     0,   171,     0,     0,     3,     0,    91,    92,    89,
+       0,     0,     0,    47,    47,   131,   122,   156,    68,     0,
+       0,     0,   170,     0,     0,     3,     0,    91,    92,    89,
       90,    93,    94,    86,    97,    98,    99,    88,    87,    96,
-      82,    83,    84,    85,   159,     0,   125,   168,    73,    75,
-      76,    78,   170,     0,     0,   141,    57,     0,     7,     8,
+      82,    83,    84,    85,   158,     0,   125,   167,    73,    75,
+      76,    78,   169,     0,     0,   141,   157,     0,     7,     8,
       10,    11,    12,    13,     0,     0,    53,    17,    15,     0,
        0,     0,    16,    14,    22,    23,    43,   127,     0,   104,
        0,   106,     0,   108,     0,   110,     0,   102,   103,     0,
-      58,     0,   182,   181,   180,   177,     0,     0,     0,   179,
-      58,   164,     0,     0,   164,   130,   158,     0,    38,    30,
+      58,     0,   181,   180,   179,   176,     0,     0,     0,   178,
+      58,   163,     0,     0,   163,   130,     0,     0,    38,    30,
       46,    18,    19,     0,   134,     0,     0,     0,     0,    57,
-       0,   132,     0,    58,   160,     0,    58,     0,     9,    57,
+       0,   132,     0,    58,   159,     0,    58,   163,     9,    57,
       55,    55,    58,     0,   105,   107,   109,   111,    45,    59,
-      60,     0,    50,     0,    77,     0,   164,    39,    31,    35,
-       0,     0,     0,    44,    57,   161,    58,    53,     0,     0,
-       0,    20,    21,    58,     0,    51,     0,   162,   154,     0,
-      40,     0,     0,    29,     0,    53,    48,     0,    46,    32,
-       0,     0,     0,   163,    58,    53,    36,    49,    58,     0,
-      46,    53,     0,    41,    58,    46,    52,     0,    58,    33,
-       0,    37
+      60,     0,    50,     0,    77,     0,    58,    39,    31,    35,
+       0,     0,     0,    44,    57,   160,     0,    53,     0,     0,
+       0,    20,    21,    58,     0,    51,     0,   161,   153,    40,
+       0,     0,    29,     0,    53,    48,     0,    46,    32,     0,
+       0,     0,   162,    58,    53,    36,    49,    58,     0,    46,
+      53,     0,    41,    58,    46,    52,     0,    58,    33,     0,
+      37
 };
 
   /* YYPGOTO[NTERM-NUM].  */
 static const yytype_int16 yypgoto[] =
 {
-    -328,   125,  -328,  -328,   -17,    15,  -328,  -328,  -328,  -328,
-    -328,  -328,  -328,  -328,  -328,  -308,    62,  -328,  -328,  -328,
-    -163,  -327,   -58,  -328,   -76,   -81,     3,    -6,  -328,  -328,
-      38,  -328,  -328,  -328,  -328,  -328,  -328,  -328,  -328,   -11,
-    -328,  -328,  -328,  -328,  -328,  -328,  -328,  -328,  -147,  -328,
-    -279,  -328,    26,   -29,  -328,  -328,  -328,  -328,    53
+    -325,   126,  -325,  -325,   -21,    13,  -325,  -325,  -325,  -325,
+    -325,  -325,  -325,  -325,  -325,  -285,    59,  -325,  -325,  -325,
+    -163,  -324,   -56,  -325,   -73,  1700,     3,    -6,  -325,  -325,
+      37,  -325,  -325,  -325,  -325,  -325,  -325,  -325,  -325,   -27,
+    -325,  -325,  -325,  -325,  -325,  -325,  -325,  -154,  -325,  -269,
+    -325,    26,   -20,  -325,  -325,  -325,  -325,    60
 };
 
   /* YYDEFGOTO[NTERM-NUM].  */
 static const yytype_int16 yydefgoto[] =
 {
-      -1,    44,    45,    46,    47,   320,   310,   338,   365,   311,
-     339,   371,   309,   337,   358,   312,   269,    49,   334,   345,
+      -1,    44,    45,    46,    47,   320,   310,   338,   364,   311,
+     339,   370,   309,   337,   357,   312,   269,    49,   334,   345,
      206,   322,   328,    50,   145,   300,    51,    52,   283,    53,
       54,    55,    80,   111,   103,   159,   196,   182,    56,    86,
-      57,    77,    58,    87,   236,    78,    59,   112,   225,   348,
-     303,    60,   154,    76,    61,   121,   122,   123,   124
+      57,    77,    58,    87,    78,    59,   112,   225,   348,   303,
+      60,   154,    76,    61,   121,   122,   123,   124
 };
 
   /* YYTABLE[YYPACT[STATE-NUM]] -- What to do in state STATE-NUM.  If
@@ -1097,532 +1089,530 @@ static const yytype_int16 yydefgoto[] =
      number is the opposite.  If YYTABLE_NINF, syntax error.  */
 static const yytype_int16 yytable[] =
 {
-      68,    68,   157,   340,    75,   306,     8,    64,   238,    62,
-     233,    72,    85,    73,   134,    48,   169,    90,   102,   244,
-      79,   281,   100,   101,   282,   104,   105,   106,   107,   108,
-     109,   110,    69,    71,   113,   114,   115,   120,   143,   144,
-     245,   146,    91,    92,   127,   376,   199,   336,    88,     8,
-     364,   240,   284,     1,    98,   282,    32,    33,    34,    35,
-     147,   148,   374,     8,   148,   242,     2,   378,   148,     3,
-       4,    68,   170,     5,   162,   160,   152,    99,    63,    11,
-     125,    12,   171,   290,   134,   276,   277,   135,   278,   146,
-     180,   343,   344,   149,   174,   134,   151,   172,   173,    32,
-      33,    34,    35,   156,   175,   140,   141,   142,   143,   144,
-     150,   176,   126,    32,    33,    34,    35,   141,   142,   143,
-     144,   177,   207,   208,   209,   210,   211,   212,   213,   214,
-     215,   216,   217,   218,   219,   220,   221,   222,   223,   307,
-      68,    48,   249,   331,   227,    93,    94,    95,    42,   232,
-     158,    43,   250,   332,    96,   235,   326,   226,   150,   282,
-     286,    97,   155,   246,   247,   248,   161,   237,   252,   253,
-     254,   255,   256,   257,   350,   228,   150,   259,   260,   261,
-     262,   263,   264,   265,   266,   267,   268,   146,   229,   230,
-     231,   150,   362,   272,   273,   274,   163,   275,   164,   302,
-     324,   155,   370,   239,   241,   243,   168,   178,   375,   181,
-     195,   197,   200,   201,   202,   203,   204,   224,   234,   280,
-     251,   258,   323,   318,   321,   325,   285,   271,   293,   287,
-     294,   330,   301,   327,   199,   304,   333,   347,   288,   289,
-     351,   352,   353,   291,   292,   356,   357,   360,   363,   367,
-     368,   205,   299,   329,   305,   349,   270,   279,   346,     0,
-       0,     0,   354,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,   -34,     0,     0,    75,   361,     0,
-       0,   308,     0,   369,     0,     0,     0,   372,     0,   314,
-     315,   316,   317,   377,     0,     0,   313,   380,     0,     0,
-       0,   128,   129,   130,   131,   132,   133,     0,   134,     0,
-       0,   135,   136,   137,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,   341,   342,   138,   139,   140,
-     141,   142,   143,   144,  -166,     1,     0,     0,   355,     0,
-       0,     0,     0,     0,     0,   359,     0,     0,     2,     0,
-       0,     3,     4,     0,   366,     5,  -166,     7,     8,     9,
-      65,    11,     0,    12,  -166,  -166,     0,    15,  -166,  -166,
-    -166,  -166,  -166,  -166,  -166,  -166,     0,  -166,     0,  -166,
-    -166,  -166,     0,    66,  -166,    25,  -166,  -166,  -166,  -166,
-       0,     0,  -166,  -166,  -166,  -166,  -166,  -166,  -166,  -166,
-    -166,    31,  -166,  -166,  -166,  -166,  -166,  -166,    32,    33,
-      34,    35,    36,  -166,  -166,  -166,  -166,     0,  -166,  -166,
-    -166,  -166,  -166,  -166,    40,    41,  -166,  -166,     1,  -166,
-      70,  -166,  -166,    43,  -166,     0,     0,     0,     0,     0,
-       0,     2,     0,   165,     3,     4,     0,     0,     5,     0,
-       7,     8,     9,   116,   117,     0,   118,     0,     0,     0,
-      15,   128,   129,   130,   131,   132,   133,     0,   134,   166,
-     167,   135,   136,   137,     0,     0,    66,     0,    25,     0,
-       0,     0,     0,     0,     0,     0,     0,   138,   139,   140,
-     141,   142,   143,   144,    31,     0,     0,     0,     0,     0,
-       0,    32,    33,    34,    35,    36,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,   -65,     1,    40,    41,     0,
-       0,     0,     0,    42,     0,     0,    43,  -172,   119,     2,
-       0,     0,     3,     4,     0,     0,     5,   -65,     7,     8,
-       9,    65,    11,     0,    12,   -65,   -65,     0,    15,     0,
-     -65,   -65,   -65,   -65,   -65,   -65,   -65,     0,     0,     0,
-       0,   -65,     0,     0,    66,   -65,    25,     0,     0,   -65,
-       0,     0,     0,   -65,   -65,   -65,   -65,   -65,   -65,   -65,
-     -65,   -65,    31,   -65,     0,     0,   -65,   -65,   -65,    32,
-      33,    34,    35,    36,     0,     0,   -65,   -65,     0,   -65,
-     -65,   -65,   -65,   -65,   -65,    40,    41,   -65,   -65,     0,
-     -65,    74,  -166,     1,    43,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     2,     0,     0,     3,
-       4,     0,     0,     5,  -166,     7,     8,     9,    65,    11,
-       0,    12,  -166,  -166,     0,    15,     0,  -166,  -166,  -166,
-    -166,  -166,  -166,  -166,     0,     0,     0,     0,  -166,     0,
-       0,    66,  -166,    25,     0,     0,  -166,     0,     0,     0,
-    -166,  -166,  -166,     0,     0,     0,     0,     0,     0,    31,
-       0,     0,     0,     0,     0,     0,    32,    33,    34,    35,
-      36,     0,     0,  -166,  -166,     0,  -166,  -166,  -166,  -166,
-       1,     0,    40,    41,     0,     0,     0,  -166,    67,     0,
-    -166,    43,     0,     2,     0,     0,     3,     4,     0,     0,
-       5,  -166,     7,     8,     9,    65,    11,     0,    12,  -166,
-    -166,     0,    15,     0,  -166,  -166,  -166,  -166,  -166,  -166,
-    -166,     0,     0,     0,     0,  -166,     0,     0,    66,  -166,
-      25,     0,     0,  -166,     0,     0,     0,  -166,  -166,  -166,
-       0,     0,     0,     0,     0,     0,    31,     0,     0,     0,
-       0,     0,     0,    32,    33,    34,    35,    36,     0,     0,
-    -166,  -166,     0,  -166,  -166,  -166,    -4,     1,     0,    40,
-      41,     0,     0,     0,  -166,    42,     0,  -166,    43,     0,
-       2,     0,     0,     3,     4,     0,     0,     5,     6,     7,
-       8,     9,    10,    11,     0,    12,     0,    13,    14,    15,
-       0,     0,     0,    16,    17,    18,    19,    20,     0,     0,
-      21,     0,    22,     0,     0,    23,    24,    25,     0,     0,
-      26,     0,     0,    27,    28,    29,    30,     0,     0,     0,
-       0,     0,     0,    31,     0,     0,     0,     0,     0,     0,
-      32,    33,    34,    35,    36,     0,     0,    37,    38,    39,
-    -155,     1,     0,     0,     0,     0,    40,    41,     0,     0,
-       0,    -4,    42,     0,     2,    43,     0,     3,     4,     0,
-       0,     5,     6,     7,     8,     9,    10,    11,     0,    12,
-     335,    13,     0,    15,     0,     0,     0,    16,    17,    18,
-      19,    20,     0,     0,     0,     0,    22,     0,     0,    23,
-      24,    25,     0,     0,    26,     0,     0,     0,    28,    29,
-      30,     0,     0,     0,     0,     0,     0,    31,     0,     0,
-       0,     0,     0,     0,    32,    33,    34,    35,    36,     0,
-       0,    37,    38,  -153,     1,     0,     0,     0,     0,     0,
-      40,    41,     0,     0,     0,   319,    42,     2,     0,    43,
-       3,     4,     0,     0,     5,     6,     7,     8,     9,    10,
-      11,     0,    12,     0,    13,     0,    15,     0,     0,     0,
-      16,    17,    18,    19,    20,     0,     0,     0,     0,    22,
-       0,     0,    23,    24,    25,     0,     0,    26,     0,     0,
-       0,    28,    29,    30,     0,     0,     0,     0,     0,     0,
-      31,     0,     0,     0,     0,     0,     0,    32,    33,    34,
-      35,    36,     0,     0,    37,    38,  -150,     1,     0,     0,
-       0,     0,     0,    40,    41,     0,     0,     0,   319,    42,
-       2,     0,    43,     3,     4,     0,     0,     5,     6,     7,
-       8,     9,    10,    11,     0,    12,     0,    13,     0,    15,
-       0,     0,     0,    16,    17,    18,    19,    20,     0,     0,
-       0,     0,    22,     0,     0,    23,    24,    25,     0,     0,
-      26,     0,     0,     0,    28,    29,    30,     0,     0,     0,
-       0,     0,     0,    31,     0,     0,     0,     0,     0,     0,
-      32,    33,    34,    35,    36,     0,     0,    37,    38,     0,
-       1,     0,     0,     0,     0,     0,    40,    41,     0,     0,
-       0,   319,    42,     2,     0,    43,     3,     4,     0,     0,
-       5,     6,     7,     8,     9,    10,    11,     0,    12,     0,
-      13,     0,    15,     0,   -54,   -54,    16,    17,    18,    19,
-      20,     0,     0,     0,     0,    22,     0,     0,    23,    24,
-      25,     0,     0,    26,     0,     0,     0,    28,    29,    30,
-       0,     0,     0,     0,     0,     0,    31,     0,     0,     0,
-       0,     0,     0,    32,    33,    34,    35,    36,     0,     0,
-      37,    38,     0,   -54,     1,     0,     0,     0,     0,    40,
-      41,     0,     0,     0,   319,    42,     0,     2,    43,     0,
-       3,     4,     0,     0,     5,     6,     7,     8,     9,    10,
-      11,     0,    12,     0,    13,     0,    15,     0,     0,     0,
-      16,    17,    18,    19,    20,     0,     0,     0,     0,    22,
-       0,     0,    23,    24,    25,     0,     0,    26,     0,     0,
-       0,    28,    29,    30,     0,     0,     0,     0,     0,     0,
+      68,    68,   102,   233,    75,   157,   340,    64,    73,   146,
+     170,    72,    85,    48,   199,   306,    62,    90,   134,   169,
+     171,   135,   100,   101,   244,   104,   105,   106,   107,   108,
+     109,   110,    69,    71,   113,   114,   115,   120,   326,   140,
+     141,   142,   143,   144,   127,   245,    79,   375,    88,     8,
+     125,   238,   146,     1,     8,    98,   240,    99,   162,   281,
+     147,   148,   282,     8,   148,   242,     2,   134,   148,     3,
+       4,    68,   363,     5,   180,   160,   152,   174,    63,    11,
+     126,    12,   286,   290,   373,   176,   134,   175,   150,   377,
+     236,   143,   144,   149,   158,   177,   151,   172,   173,    32,
+      33,    34,    35,   156,    32,    33,    34,    35,   141,   142,
+     143,   144,   155,    32,    33,    34,    35,   276,   277,   161,
+     278,   163,   207,   208,   209,   210,   211,   212,   213,   214,
+     215,   216,   217,   218,   219,   220,   221,   222,   223,    48,
+      68,    93,    94,    95,   227,   164,   249,   168,    42,   232,
+      96,    43,   331,    91,    92,   235,   250,    97,   284,   226,
+     150,   282,   332,   246,   247,   248,   178,   237,   252,   253,
+     254,   255,   256,   257,   349,   228,   150,   259,   260,   261,
+     262,   263,   264,   265,   266,   267,   268,   307,   343,   344,
+     282,   361,   181,   272,   273,   274,   195,   275,   146,   229,
+     230,   369,   239,   241,   243,   231,   150,   374,   324,   155,
+     197,   200,   224,   201,   203,   202,   204,   280,   234,   251,
+     258,   271,   285,   287,   293,   294,   318,   321,   301,   199,
+     304,   333,   347,   352,     1,   350,   327,   351,   288,   289,
+     355,   356,   359,   291,   292,   362,   366,     2,   299,   367,
+       3,     4,   205,   270,     5,   329,     7,     8,     9,    65,
+      11,   346,    12,   305,   279,     0,    15,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,    75,     0,     0,
+     360,   308,    66,     0,    25,     0,     0,     0,     0,   314,
+     315,   316,   317,     0,     0,     0,   313,     0,     0,     0,
       31,     0,     0,     0,     0,     0,     0,    32,    33,    34,
-      35,    36,     0,     0,    37,    38,     0,     1,     0,   -57,
-       0,     0,     0,    40,    41,     0,     0,     0,   319,    42,
-       2,     0,    43,     3,     4,     0,     0,     5,     6,     7,
-       8,     9,    10,    11,     0,    12,     0,    13,     0,    15,
-       0,     0,     0,    16,    17,    18,    19,    20,     0,     0,
-       0,     0,    22,     0,     0,    23,    24,    25,     0,     0,
-      26,     0,     0,     0,    28,    29,    30,     0,     0,     0,
-       0,     0,     0,    31,     0,     0,     0,     0,     0,     0,
-      32,    33,    34,    35,    36,     0,     0,    37,    38,     0,
-       1,   -54,     0,     0,     0,     0,    40,    41,     0,     0,
-       0,   319,    42,     2,     0,    43,     3,     4,     0,     0,
-       5,     6,     7,     8,     9,    10,    11,     0,    12,     0,
-      13,     0,    15,     0,     0,     0,    16,    17,    18,    19,
-      20,     0,     0,     0,     0,    22,     0,     0,    23,    24,
-      25,     0,     0,    26,     0,     0,     0,    28,    29,    30,
-       0,     0,     0,     0,     0,     0,    31,     0,     0,     0,
-       0,     0,     0,    32,    33,    34,    35,    36,     0,     0,
-      37,    38,     0,   -57,     1,     0,     0,     0,     0,    40,
-      41,     0,     0,     0,   319,    42,     0,     2,    43,     0,
-       3,     4,     0,     0,     5,     6,     7,     8,     9,    10,
-      11,     0,    12,     0,    13,     0,    15,     0,     0,     0,
-      16,    17,    18,    19,    20,     0,     0,     0,     0,    22,
-       0,     0,    23,    24,    25,     0,     0,    26,     0,     0,
-       0,    28,    29,    30,     0,     0,     0,     0,     0,     0,
-      31,     0,     0,     0,     0,     0,     0,    32,    33,    34,
-      35,    36,     0,     0,    37,    38,     0,     1,   373,     0,
-       0,     0,     0,    40,    41,     0,     0,     0,   319,    42,
-       2,     0,    43,     3,     4,     0,     0,     5,     6,     7,
-       8,     9,    10,    11,     0,    12,     0,    13,     0,    15,
-       0,     0,     0,    16,    17,    18,    19,    20,     0,     0,
-       0,     0,    22,     0,     0,    23,    24,    25,     0,     0,
-      26,     0,     0,     0,    28,    29,    30,     0,     0,     0,
-       0,     0,     0,    31,     0,     0,     0,     0,     0,     0,
-      32,    33,    34,    35,    36,     0,     0,    37,    38,     0,
-       1,   379,     0,     0,     0,     0,    40,    41,     0,     0,
-       0,   319,    42,     2,     0,    43,     3,     4,     0,     0,
-       5,     6,     7,     8,     9,    10,    11,     0,    12,     0,
+      35,    36,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,    40,    41,   341,   342,     0,     0,    42,
+    -165,  -165,    43,  -165,     1,     0,     0,     0,   354,     0,
+       0,     0,     0,     0,   358,     0,     0,     2,     0,     0,
+       3,     4,     0,   365,     5,  -165,     7,     8,     9,    65,
+      11,     0,    12,  -165,  -165,     0,    15,  -165,  -165,  -165,
+    -165,  -165,  -165,  -165,  -165,     0,  -165,     0,  -165,  -165,
+    -165,     0,    66,  -165,    25,  -165,  -165,  -165,  -165,     0,
+       0,  -165,  -165,  -165,  -165,  -165,  -165,  -165,  -165,  -165,
+      31,  -165,  -165,  -165,  -165,  -165,  -165,    32,    33,    34,
+      35,    36,  -165,  -165,  -165,  -165,     0,  -165,  -165,  -165,
+    -165,  -165,  -165,    40,    41,  -165,  -165,     1,  -165,    70,
+    -165,  -165,    43,  -165,     0,     0,     0,     0,     0,     0,
+       2,     0,   165,     3,     4,     0,     0,     5,     0,     7,
+       8,     9,   116,   117,     0,   118,     0,     0,     0,    15,
+     128,   129,   130,   131,   132,   133,     0,   134,   166,   167,
+     135,   136,   137,     0,     0,    66,     0,    25,     0,     0,
+       0,     0,     0,     0,     0,     0,   138,   139,   140,   141,
+     142,   143,   144,    31,     0,     0,     0,     0,     0,     0,
+      32,    33,    34,    35,    36,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,   -65,     1,    40,    41,     0,     0,
+       0,     0,    42,     0,     0,    43,  -171,   119,     2,     0,
+       0,     3,     4,     0,     0,     5,   -65,     7,     8,     9,
+      65,    11,     0,    12,   -65,   -65,     0,    15,     0,   -65,
+     -65,   -65,   -65,   -65,   -65,   -65,     0,     0,     0,     0,
+     -65,     0,     0,    66,   -65,    25,     0,     0,   -65,     0,
+       0,     0,   -65,   -65,   -65,   -65,   -65,   -65,   -65,   -65,
+     -65,    31,   -65,     0,     0,   -65,   -65,   -65,    32,    33,
+      34,    35,    36,     0,     0,   -65,   -65,     0,   -65,   -65,
+     -65,   -65,   -65,   -65,    40,    41,   -65,   -65,     0,   -65,
+      74,  -165,     1,    43,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     2,     0,     0,     3,     4,
+       0,     0,     5,  -165,     7,     8,     9,    65,    11,     0,
+      12,  -165,  -165,     0,    15,     0,  -165,  -165,  -165,  -165,
+    -165,  -165,  -165,     0,     0,     0,     0,  -165,     0,     0,
+      66,  -165,    25,     0,     0,  -165,     0,     0,     0,  -165,
+    -165,  -165,     0,     0,     0,     0,     0,     0,    31,     0,
+       0,     0,     0,     0,     0,    32,    33,    34,    35,    36,
+       0,     0,  -165,  -165,     0,  -165,  -165,  -165,  -165,     1,
+       0,    40,    41,     0,     0,     0,  -165,    67,     0,  -165,
+      43,     0,     2,     0,     0,     3,     4,     0,     0,     5,
+    -165,     7,     8,     9,    65,    11,     0,    12,  -165,  -165,
+       0,    15,     0,  -165,  -165,  -165,  -165,  -165,  -165,  -165,
+       0,     0,     0,     0,  -165,     0,     0,    66,  -165,    25,
+       0,     0,  -165,     0,     0,     0,  -165,  -165,  -165,     0,
+       0,     0,     0,     0,     0,    31,     0,     0,     0,     0,
+       0,     0,    32,    33,    34,    35,    36,     0,     0,  -165,
+    -165,     0,  -165,  -165,  -165,    -4,     1,     0,    40,    41,
+       0,     0,     0,  -165,    42,     0,  -165,    43,     0,     2,
+       0,     0,     3,     4,     0,     0,     5,     6,     7,     8,
+       9,    10,    11,     0,    12,     0,    13,    14,    15,     0,
+       0,     0,    16,    17,    18,    19,    20,     0,     0,    21,
+       0,    22,     0,     0,    23,    24,    25,     0,     0,    26,
+       0,     0,    27,    28,    29,    30,     0,     0,     0,     0,
+       0,     0,    31,     0,     0,     0,     0,     0,     0,    32,
+      33,    34,    35,    36,     0,     0,    37,    38,    39,  -154,
+       1,     0,     0,     0,     0,    40,    41,     0,     0,     0,
+      -4,    42,     0,     2,    43,     0,     3,     4,     0,     0,
+       5,     6,     7,     8,     9,    10,    11,     0,    12,   335,
       13,     0,    15,     0,     0,     0,    16,    17,    18,    19,
       20,     0,     0,     0,     0,    22,     0,     0,    23,    24,
       25,     0,     0,    26,     0,     0,     0,    28,    29,    30,
        0,     0,     0,     0,     0,     0,    31,     0,     0,     0,
        0,     0,     0,    32,    33,    34,    35,    36,     0,     0,
-      37,    38,     0,     1,   381,     0,     0,     0,     0,    40,
+      37,    38,  -152,     1,     0,     0,     0,     0,     0,    40,
       41,     0,     0,     0,   319,    42,     2,     0,    43,     3,
        4,     0,     0,     5,     6,     7,     8,     9,    10,    11,
        0,    12,     0,    13,     0,    15,     0,     0,     0,    16,
-      17,    18,    19,     0,     0,     0,     0,     0,     0,     0,
-       0,    23,     0,    25,     0,     0,     0,     0,     0,     0,
+      17,    18,    19,    20,     0,     0,     0,     0,    22,     0,
+       0,    23,    24,    25,     0,     0,    26,     0,     0,     0,
+      28,    29,    30,     0,     0,     0,     0,     0,     0,    31,
+       0,     0,     0,     0,     0,     0,    32,    33,    34,    35,
+      36,     0,     0,    37,    38,  -149,     1,     0,     0,     0,
+       0,     0,    40,    41,     0,     0,     0,   319,    42,     2,
+       0,    43,     3,     4,     0,     0,     5,     6,     7,     8,
+       9,    10,    11,     0,    12,     0,    13,     0,    15,     0,
+       0,     0,    16,    17,    18,    19,    20,     0,     0,     0,
+       0,    22,     0,     0,    23,    24,    25,     0,     0,    26,
+       0,     0,     0,    28,    29,    30,     0,     0,     0,     0,
+       0,     0,    31,     0,     0,     0,     0,     0,     0,    32,
+      33,    34,    35,    36,     0,     0,    37,    38,     0,     1,
+       0,     0,     0,     0,     0,    40,    41,     0,     0,     0,
+     319,    42,     2,     0,    43,     3,     4,     0,     0,     5,
+       6,     7,     8,     9,    10,    11,     0,    12,     0,    13,
+       0,    15,     0,   -54,   -54,    16,    17,    18,    19,    20,
+       0,     0,     0,     0,    22,     0,     0,    23,    24,    25,
+       0,     0,    26,     0,     0,     0,    28,    29,    30,     0,
+       0,     0,     0,     0,     0,    31,     0,     0,     0,     0,
+       0,     0,    32,    33,    34,    35,    36,     0,     0,    37,
+      38,     0,   -54,     1,     0,     0,     0,     0,    40,    41,
+       0,     0,     0,   319,    42,     0,     2,    43,     0,     3,
+       4,     0,     0,     5,     6,     7,     8,     9,    10,    11,
+       0,    12,     0,    13,     0,    15,     0,     0,     0,    16,
+      17,    18,    19,    20,     0,     0,     0,     0,    22,     0,
+       0,    23,    24,    25,     0,     0,    26,     0,     0,     0,
+      28,    29,    30,     0,     0,     0,     0,     0,     0,    31,
+       0,     0,     0,     0,     0,     0,    32,    33,    34,    35,
+      36,     0,     0,    37,    38,     0,     1,     0,   -57,     0,
+       0,     0,    40,    41,     0,     0,     0,   319,    42,     2,
+       0,    43,     3,     4,     0,     0,     5,     6,     7,     8,
+       9,    10,    11,     0,    12,     0,    13,     0,    15,     0,
+       0,     0,    16,    17,    18,    19,    20,     0,     0,     0,
+       0,    22,     0,     0,    23,    24,    25,     0,     0,    26,
+       0,     0,     0,    28,    29,    30,     0,     0,     0,     0,
+       0,     0,    31,     0,     0,     0,     0,     0,     0,    32,
+      33,    34,    35,    36,     0,     0,    37,    38,     0,     1,
+     -54,     0,     0,     0,     0,    40,    41,     0,     0,     0,
+     319,    42,     2,     0,    43,     3,     4,     0,     0,     5,
+       6,     7,     8,     9,    10,    11,     0,    12,     0,    13,
+       0,    15,     0,     0,     0,    16,    17,    18,    19,    20,
+       0,     0,     0,     0,    22,     0,     0,    23,    24,    25,
+       0,     0,    26,     0,     0,     0,    28,    29,    30,     0,
+       0,     0,     0,     0,     0,    31,     0,     0,     0,     0,
+       0,     0,    32,    33,    34,    35,    36,     0,     0,    37,
+      38,     0,   -57,     1,     0,     0,     0,     0,    40,    41,
+       0,     0,     0,   319,    42,     0,     2,    43,     0,     3,
+       4,     0,     0,     5,     6,     7,     8,     9,    10,    11,
+       0,    12,     0,    13,     0,    15,     0,     0,     0,    16,
+      17,    18,    19,    20,     0,     0,     0,     0,    22,     0,
+       0,    23,    24,    25,     0,     0,    26,     0,     0,     0,
       28,    29,    30,     0,     0,     0,     0,     0,     0,    31,
        0,     0,     0,     0,     0,     0,    32,    33,    34,    35,
-      36,     0,     0,     1,    38,     0,     0,     0,     0,     0,
-       0,     0,    40,    41,     0,     0,     2,     0,    42,     3,
-       4,    43,     0,     5,     0,     7,     8,     9,    65,    11,
-       0,    12,     0,     0,     0,    15,     0,     0,     0,     1,
-       0,     0,     0,     0,     0,     0,     0,    81,    82,    83,
-      84,    66,     2,    25,     0,     3,     4,     0,     0,     5,
-       0,     7,     8,     9,    65,    11,     0,    12,     0,    31,
-       0,    15,     0,     0,     0,     0,    32,    33,    34,    35,
-      36,     0,     0,    81,     0,    83,     0,    66,     0,    25,
-       0,     0,    40,    41,     0,     0,     0,     0,    42,     0,
-       0,    43,     0,     0,     0,    31,     0,     0,     0,     0,
-       0,     0,    32,    33,    34,    35,    36,     0,     0,     1,
-       0,     0,     0,     0,     0,     0,     0,     0,    40,    41,
-       0,     0,     2,     0,    42,     3,     4,    43,     0,     5,
-       0,     7,     8,     9,    65,    11,     0,    12,     0,     0,
-       0,    15,     0,     0,     0,     1,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,    66,     2,    25,
-       0,     3,     4,     0,     0,     5,     0,     7,     8,     9,
-     153,    11,     0,    12,     0,    31,     0,    15,     0,     0,
-       0,     0,    32,    33,    34,    35,    36,     0,     0,     0,
-       0,     0,     0,    66,     0,    25,     0,     0,    40,    41,
-       0,     0,     0,     0,    42,  -166,  -166,    43,     0,     0,
-       0,    31,     0,     0,     0,     0,     0,     0,    32,    33,
-      34,    35,    36,     0,     0,     0,     0,     0,     0,     0,
-       0,     1,     0,     0,    40,    41,     0,     0,     0,     0,
-      42,  -166,  -166,    43,     2,     0,     0,     3,     4,     0,
-      89,     5,     0,     7,     8,     9,    65,    11,     0,    12,
-       0,     0,     0,    15,     0,     0,     0,     1,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,    66,
-       2,    25,     0,     3,     4,     0,     0,     5,     0,     7,
-       8,     9,    65,    11,     0,    12,     0,    31,     0,    15,
-       0,     0,     0,     0,    32,    33,    34,    35,    36,     0,
-       0,     0,     0,     0,     0,    66,     0,    25,     0,     0,
-      40,    41,     0,     0,     0,     0,    42,     0,     0,    43,
-       0,     0,    81,    31,    83,     0,     0,     0,     0,     0,
-      32,    33,    34,    35,    36,     0,     0,     0,   128,   129,
-     130,   131,   132,   133,     0,   134,    40,    41,   135,   136,
-     137,     0,    42,     0,     0,    43,     0,   183,     0,     0,
-       0,     0,     0,   184,   138,   139,   140,   141,   142,   143,
+      36,     0,     0,    37,    38,     0,     1,   372,     0,     0,
+       0,     0,    40,    41,     0,     0,     0,   319,    42,     2,
+       0,    43,     3,     4,     0,     0,     5,     6,     7,     8,
+       9,    10,    11,     0,    12,     0,    13,     0,    15,     0,
+       0,     0,    16,    17,    18,    19,    20,     0,     0,     0,
+       0,    22,     0,     0,    23,    24,    25,     0,     0,    26,
+       0,     0,     0,    28,    29,    30,     0,     0,     0,     0,
+       0,     0,    31,     0,     0,     0,     0,     0,     0,    32,
+      33,    34,    35,    36,     0,     0,    37,    38,     0,     1,
+     378,     0,     0,     0,     0,    40,    41,     0,     0,     0,
+     319,    42,     2,     0,    43,     3,     4,     0,     0,     5,
+       6,     7,     8,     9,    10,    11,     0,    12,     0,    13,
+       0,    15,     0,     0,     0,    16,    17,    18,    19,    20,
+       0,     0,     0,     0,    22,     0,     0,    23,    24,    25,
+       0,     0,    26,     0,     0,     0,    28,    29,    30,     0,
+       0,     0,     0,     0,     0,    31,     0,     0,     0,     0,
+       0,     0,    32,    33,    34,    35,    36,     0,     0,    37,
+      38,     0,     1,   380,     0,     0,     0,     0,    40,    41,
+       0,     0,     0,   319,    42,     2,     0,    43,     3,     4,
+       0,     0,     5,     6,     7,     8,     9,    10,    11,     0,
+      12,     0,    13,     0,    15,     0,     0,     0,    16,    17,
+      18,    19,     0,     0,     0,     0,     0,     0,     0,     0,
+      23,     0,    25,     0,     0,     0,     0,     0,     0,    28,
+      29,    30,     0,     0,     0,     0,     0,     0,    31,     0,
+       0,     0,     0,     0,     0,    32,    33,    34,    35,    36,
+       0,     0,     1,    38,     0,     0,     0,     0,     0,     0,
+       0,    40,    41,     0,     0,     2,     0,    42,     3,     4,
+      43,     0,     5,     0,     7,     8,     9,    65,    11,     0,
+      12,     0,     0,     0,    15,     0,     0,     0,     1,     0,
+       0,     0,     0,     0,     0,     0,    81,    82,    83,    84,
+      66,     2,    25,     0,     3,     4,     0,     0,     5,     0,
+       7,     8,     9,    65,    11,     0,    12,     0,    31,     0,
+      15,     0,     0,     0,     0,    32,    33,    34,    35,    36,
+       0,     0,    81,     0,    83,     0,    66,     0,    25,     0,
+       0,    40,    41,     0,     0,     0,     0,    42,     0,     0,
+      43,     0,     0,     0,    31,     0,     0,     0,     0,     0,
+       0,    32,    33,    34,    35,    36,     0,     0,     1,     0,
+       0,     0,     0,     0,     0,     0,     0,    40,    41,     0,
+       0,     2,     0,    42,     3,     4,    43,     0,     5,     0,
+       7,     8,     9,   153,    11,     0,    12,     0,     0,     0,
+      15,     0,     0,     0,     1,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,    66,     2,    25,     0,
+       3,     4,     0,    89,     5,     0,     7,     8,     9,    65,
+      11,     0,    12,     0,    31,     0,    15,     0,     0,     0,
+       0,    32,    33,    34,    35,    36,     0,     0,     0,     0,
+     302,     0,    66,     0,    25,     0,     0,    40,    41,     0,
+       0,     0,     0,    42,  -165,  -165,    43,     0,     0,     0,
+      31,     0,     0,   323,     0,     0,   325,    32,    33,    34,
+      35,    36,   330,     0,     1,     0,     0,     0,     0,     0,
+       0,     0,     0,    40,    41,     0,   336,     2,     0,    42,
+       3,     4,    43,     0,     5,     0,     7,     8,     9,    65,
+      11,     0,    12,   353,     0,     0,    15,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,    66,   368,    25,     0,     0,   371,   -34,     0,
+       0,     0,     0,   376,     0,     0,     0,   379,     0,     0,
+      31,     0,     0,     0,     0,     0,     0,    32,    33,    34,
+      35,    36,     0,     0,     0,   128,   129,   130,   131,   132,
+     133,     0,   134,    40,    41,   135,   136,   137,     0,    42,
+       0,     0,    43,    81,     0,    83,     0,     0,     0,     0,
+       0,   138,   139,   140,   141,   142,   143,   144,     0,   128,
+     129,   130,   131,   132,   133,     0,   134,     0,     0,   135,
+     136,   137,     0,     0,     0,     0,     0,     0,   183,     0,
+       0,     0,     0,     0,   184,   138,   139,   140,   141,   142,
+     143,   144,   128,   129,   130,   131,   132,   133,     0,   134,
+       0,     0,   135,   136,   137,     0,     0,     0,     0,     0,
+       0,   185,     0,     0,     0,     0,     0,   186,   138,   139,
+     140,   141,   142,   143,   144,   128,   129,   130,   131,   132,
+     133,     0,   134,     0,     0,   135,   136,   137,     0,     0,
+       0,     0,     0,     0,   187,     0,     0,     0,     0,     0,
+     188,   138,   139,   140,   141,   142,   143,   144,   128,   129,
+     130,   131,   132,   133,     0,   134,     0,     0,   135,   136,
+     137,     0,     0,     0,     0,     0,     0,   189,     0,     0,
+       0,     0,     0,   190,   138,   139,   140,   141,   142,   143,
      144,   128,   129,   130,   131,   132,   133,     0,   134,     0,
        0,   135,   136,   137,     0,     0,     0,     0,     0,     0,
-     185,     0,     0,     0,     0,     0,   186,   138,   139,   140,
+     295,     0,     0,     0,     0,     0,     0,   138,   139,   140,
      141,   142,   143,   144,   128,   129,   130,   131,   132,   133,
        0,   134,     0,     0,   135,   136,   137,     0,     0,     0,
-       0,     0,     0,   187,     0,     0,     0,     0,     0,   188,
+       0,     0,     0,   296,     0,     0,     0,     0,     0,     0,
      138,   139,   140,   141,   142,   143,   144,   128,   129,   130,
      131,   132,   133,     0,   134,     0,     0,   135,   136,   137,
-       0,     0,     0,     0,     0,     0,   189,     0,     0,     0,
-       0,     0,   190,   138,   139,   140,   141,   142,   143,   144,
+       0,     0,     0,     0,     0,     0,   297,     0,     0,     0,
+       0,     0,     0,   138,   139,   140,   141,   142,   143,   144,
      128,   129,   130,   131,   132,   133,     0,   134,     0,     0,
-     135,   136,   137,     0,     0,     0,     0,     0,     0,   295,
+     135,   136,   137,     0,     0,     0,     0,     0,     0,   298,
        0,     0,     0,     0,     0,     0,   138,   139,   140,   141,
      142,   143,   144,   128,   129,   130,   131,   132,   133,     0,
      134,     0,     0,   135,   136,   137,     0,     0,     0,     0,
-       0,     0,   296,     0,     0,     0,     0,     0,     0,   138,
+       0,     0,     0,     0,     0,     0,     0,     0,   193,   138,
      139,   140,   141,   142,   143,   144,   128,   129,   130,   131,
      132,   133,     0,   134,     0,     0,   135,   136,   137,     0,
-       0,     0,     0,     0,     0,   297,     0,     0,     0,     0,
-       0,     0,   138,   139,   140,   141,   142,   143,   144,   128,
-     129,   130,   131,   132,   133,     0,   134,     0,     0,   135,
-     136,   137,     0,     0,     0,     0,     0,     0,   298,     0,
-       0,     0,     0,     0,     0,   138,   139,   140,   141,   142,
-     143,   144,   128,   129,   130,   131,   132,   133,     0,   134,
-       0,     0,   135,   136,   137,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,   193,   138,   139,
-     140,   141,   142,   143,   144,   128,   129,   130,   131,   132,
-     133,     0,   134,     0,     0,   135,   136,   137,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,   138,   139,   140,   141,   142,   143,   144,   179,   194,
-       0,     0,     0,     0,   128,   129,   130,   131,   132,   133,
-       0,   134,     0,     0,   135,   136,   137,   128,   129,   130,
-     131,   132,   133,     0,   134,     0,     0,   135,   136,   137,
-     138,   139,   140,   141,   142,   143,   144,     0,     0,     0,
-       0,     0,     0,   138,   139,   140,   141,   142,   143,   144,
-       0,     0,     0,   198,   128,   129,   130,   131,   132,   133,
-       0,   134,     0,     0,   135,   136,   137,     0,     0,     0,
-       0,     0,   191,   192,     0,     0,     0,     0,     0,     0,
-     138,   139,   140,   141,   142,   143,   144,   128,   129,   130,
-     131,   132,   133,     0,   134,     0,     0,   135,   136,   137,
-     128,   129,   130,   131,     0,     0,     0,   134,     0,     0,
-     135,   136,   137,   138,   139,   140,   141,   142,   143,   144,
-       0,     0,     0,     0,     0,     0,   138,   139,   140,   141,
-     142,   143,   144
+       0,     0,   138,   139,   140,   141,   142,   143,   144,   179,
+     194,     0,     0,     0,     0,   128,   129,   130,   131,   132,
+     133,     0,   134,     0,     0,   135,   136,   137,   128,   129,
+     130,   131,   132,   133,     0,   134,     0,     0,   135,   136,
+     137,   138,   139,   140,   141,   142,   143,   144,     0,     0,
+       0,     0,     0,     0,   138,   139,   140,   141,   142,   143,
+     144,     0,     0,     0,   198,   128,   129,   130,   131,   132,
+     133,     0,   134,     0,     0,   135,   136,   137,     0,     0,
+       0,     0,     0,   191,   192,     0,     0,     0,     0,     0,
+       0,   138,   139,   140,   141,   142,   143,   144,   128,   129,
+     130,   131,   132,   133,     0,   134,     0,     0,   135,   136,
+     137,   128,   129,   130,   131,     0,     0,     0,   134,     0,
+       0,   135,   136,   137,   138,   139,   140,   141,   142,   143,
+     144,     0,     0,     0,     0,     0,     0,   138,   139,   140,
+     141,   142,   143,   144
 };
 
 static const yytype_int16 yycheck[] =
 {
-       6,     7,    78,   330,    10,   284,    24,     4,    26,    95,
-     157,     8,    18,    47,    68,     0,    92,    23,    29,    42,
-      50,    95,    28,    29,    98,    31,    32,    33,    34,    35,
-      36,    37,     6,     7,    40,    41,    42,    43,    92,    93,
-      63,    96,    55,    56,    50,   372,   101,   326,    50,    24,
-     358,    26,    95,     1,    26,    98,    74,    75,    76,    77,
-      66,    67,   370,    24,    70,    26,    14,   375,    74,    17,
-      18,    77,    53,    21,    85,    81,    73,    26,    26,    27,
-       0,    29,    63,   246,    68,    26,    27,    71,    29,    96,
-     101,    35,    36,    67,    53,    68,    70,    94,    95,    74,
-      75,    76,    77,    77,    63,    89,    90,    91,    92,    93,
-      98,    53,    95,    74,    75,    76,    77,    90,    91,    92,
-      93,    63,   128,   129,   130,   131,   132,   133,   134,   135,
-     136,   137,   138,   139,   140,   141,   142,   143,   144,   286,
-     146,   126,    53,    53,   150,    17,    18,    19,    96,   155,
-      26,    99,    63,    63,    26,   161,    95,    97,    98,    98,
-     236,    33,    98,   169,   170,   171,    45,   164,   174,   175,
+       6,     7,    29,   157,    10,    78,   330,     4,    47,    96,
+      53,     8,    18,     0,   101,   284,    95,    23,    68,    92,
+      63,    71,    28,    29,    42,    31,    32,    33,    34,    35,
+      36,    37,     6,     7,    40,    41,    42,    43,   307,    89,
+      90,    91,    92,    93,    50,    63,    50,   371,    50,    24,
+       0,    26,    96,     1,    24,    26,    26,    26,    85,    95,
+      66,    67,    98,    24,    70,    26,    14,    68,    74,    17,
+      18,    77,   357,    21,   101,    81,    73,    53,    26,    27,
+      95,    29,   236,   246,   369,    53,    68,    63,    98,   374,
+     163,    92,    93,    67,    26,    63,    70,    94,    95,    74,
+      75,    76,    77,    77,    74,    75,    76,    77,    90,    91,
+      92,    93,    98,    74,    75,    76,    77,    26,    27,    45,
+      29,    26,   128,   129,   130,   131,   132,   133,   134,   135,
+     136,   137,   138,   139,   140,   141,   142,   143,   144,   126,
+     146,    17,    18,    19,   150,    26,    53,    26,    96,   155,
+      26,    99,    53,    55,    56,   161,    63,    33,    95,    97,
+      98,    98,    63,   169,   170,   171,    52,   164,   174,   175,
      176,   177,   178,   179,   337,    97,    98,   183,   184,   185,
-     186,   187,   188,   189,   190,   191,   192,    96,    97,    98,
-      97,    98,   355,   199,   200,   201,    26,   203,    26,   280,
-      97,    98,   365,   165,   166,   167,    26,    52,   371,    26,
-      26,    26,   101,   101,   100,    98,    98,    26,    98,    52,
-      47,    98,   303,   299,   300,   306,    26,    98,    26,    43,
-      26,   312,    26,   309,   101,    26,    86,    26,   244,   245,
-      53,    34,    85,   249,   250,    84,    98,    53,    26,    84,
-      52,   126,   269,   311,   283,   336,   194,   204,   334,    -1,
-      -1,    -1,   343,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    34,    -1,    -1,   283,   354,    -1,
-      -1,   287,    -1,   364,    -1,    -1,    -1,   368,    -1,   295,
-     296,   297,   298,   374,    -1,    -1,   293,   378,    -1,    -1,
-      -1,    61,    62,    63,    64,    65,    66,    -1,    68,    -1,
-      -1,    71,    72,    73,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,   331,   332,    87,    88,    89,
-      90,    91,    92,    93,     0,     1,    -1,    -1,   344,    -1,
-      -1,    -1,    -1,    -1,    -1,   351,    -1,    -1,    14,    -1,
-      -1,    17,    18,    -1,   360,    21,    22,    23,    24,    25,
-      26,    27,    -1,    29,    30,    31,    -1,    33,    34,    35,
-      36,    37,    38,    39,    40,    41,    -1,    43,    -1,    45,
-      46,    47,    -1,    49,    50,    51,    52,    53,    54,    55,
+     186,   187,   188,   189,   190,   191,   192,    95,    35,    36,
+      98,   354,    26,   199,   200,   201,    26,   203,    96,    97,
+      98,   364,   165,   166,   167,    97,    98,   370,    97,    98,
+      26,   101,    26,   101,    98,   100,    98,    52,    98,    47,
+      98,    98,    26,    43,    26,    26,   299,   300,    26,   101,
+      26,    86,    26,    85,     1,    53,   309,    34,   244,   245,
+      84,    98,    53,   249,   250,    26,    84,    14,   269,    52,
+      17,    18,   126,   194,    21,   311,    23,    24,    25,    26,
+      27,   334,    29,   283,   204,    -1,    33,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,   283,    -1,    -1,
+     353,   287,    49,    -1,    51,    -1,    -1,    -1,    -1,   295,
+     296,   297,   298,    -1,    -1,    -1,   293,    -1,    -1,    -1,
+      67,    -1,    -1,    -1,    -1,    -1,    -1,    74,    75,    76,
+      77,    78,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    90,    91,   331,   332,    -1,    -1,    96,
+      97,    98,    99,     0,     1,    -1,    -1,    -1,   344,    -1,
+      -1,    -1,    -1,    -1,   350,    -1,    -1,    14,    -1,    -1,
+      17,    18,    -1,   359,    21,    22,    23,    24,    25,    26,
+      27,    -1,    29,    30,    31,    -1,    33,    34,    35,    36,
+      37,    38,    39,    40,    41,    -1,    43,    -1,    45,    46,
+      47,    -1,    49,    50,    51,    52,    53,    54,    55,    -1,
+      -1,    58,    59,    60,    61,    62,    63,    64,    65,    66,
+      67,    68,    69,    70,    71,    72,    73,    74,    75,    76,
+      77,    78,    79,    80,    81,    82,    -1,    84,    85,    86,
+      87,    88,    89,    90,    91,    92,    93,     1,    95,    96,
+      97,    98,    99,   100,    -1,    -1,    -1,    -1,    -1,    -1,
+      14,    -1,    43,    17,    18,    -1,    -1,    21,    -1,    23,
+      24,    25,    26,    27,    -1,    29,    -1,    -1,    -1,    33,
+      61,    62,    63,    64,    65,    66,    -1,    68,    69,    70,
+      71,    72,    73,    -1,    -1,    49,    -1,    51,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    87,    88,    89,    90,
+      91,    92,    93,    67,    -1,    -1,    -1,    -1,    -1,    -1,
+      74,    75,    76,    77,    78,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,     0,     1,    90,    91,    -1,    -1,
+      -1,    -1,    96,    -1,    -1,    99,   100,   101,    14,    -1,
+      -1,    17,    18,    -1,    -1,    21,    22,    23,    24,    25,
+      26,    27,    -1,    29,    30,    31,    -1,    33,    -1,    35,
+      36,    37,    38,    39,    40,    41,    -1,    -1,    -1,    -1,
+      46,    -1,    -1,    49,    50,    51,    -1,    -1,    54,    -1,
       -1,    -1,    58,    59,    60,    61,    62,    63,    64,    65,
-      66,    67,    68,    69,    70,    71,    72,    73,    74,    75,
-      76,    77,    78,    79,    80,    81,    82,    -1,    84,    85,
-      86,    87,    88,    89,    90,    91,    92,    93,     1,    95,
-      96,    97,    98,    99,   100,    -1,    -1,    -1,    -1,    -1,
-      -1,    14,    -1,    43,    17,    18,    -1,    -1,    21,    -1,
-      23,    24,    25,    26,    27,    -1,    29,    -1,    -1,    -1,
-      33,    61,    62,    63,    64,    65,    66,    -1,    68,    69,
-      70,    71,    72,    73,    -1,    -1,    49,    -1,    51,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    87,    88,    89,
-      90,    91,    92,    93,    67,    -1,    -1,    -1,    -1,    -1,
-      -1,    74,    75,    76,    77,    78,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,     0,     1,    90,    91,    -1,
-      -1,    -1,    -1,    96,    -1,    -1,    99,   100,   101,    14,
+      66,    67,    68,    -1,    -1,    71,    72,    73,    74,    75,
+      76,    77,    78,    -1,    -1,    81,    82,    -1,    84,    85,
+      86,    87,    88,    89,    90,    91,    92,    93,    -1,    95,
+      96,     0,     1,    99,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    14,    -1,    -1,    17,    18,
+      -1,    -1,    21,    22,    23,    24,    25,    26,    27,    -1,
+      29,    30,    31,    -1,    33,    -1,    35,    36,    37,    38,
+      39,    40,    41,    -1,    -1,    -1,    -1,    46,    -1,    -1,
+      49,    50,    51,    -1,    -1,    54,    -1,    -1,    -1,    58,
+      59,    60,    -1,    -1,    -1,    -1,    -1,    -1,    67,    -1,
+      -1,    -1,    -1,    -1,    -1,    74,    75,    76,    77,    78,
+      -1,    -1,    81,    82,    -1,    84,    85,    86,     0,     1,
+      -1,    90,    91,    -1,    -1,    -1,    95,    96,    -1,    98,
+      99,    -1,    14,    -1,    -1,    17,    18,    -1,    -1,    21,
+      22,    23,    24,    25,    26,    27,    -1,    29,    30,    31,
+      -1,    33,    -1,    35,    36,    37,    38,    39,    40,    41,
+      -1,    -1,    -1,    -1,    46,    -1,    -1,    49,    50,    51,
+      -1,    -1,    54,    -1,    -1,    -1,    58,    59,    60,    -1,
+      -1,    -1,    -1,    -1,    -1,    67,    -1,    -1,    -1,    -1,
+      -1,    -1,    74,    75,    76,    77,    78,    -1,    -1,    81,
+      82,    -1,    84,    85,    86,     0,     1,    -1,    90,    91,
+      -1,    -1,    -1,    95,    96,    -1,    98,    99,    -1,    14,
       -1,    -1,    17,    18,    -1,    -1,    21,    22,    23,    24,
-      25,    26,    27,    -1,    29,    30,    31,    -1,    33,    -1,
-      35,    36,    37,    38,    39,    40,    41,    -1,    -1,    -1,
+      25,    26,    27,    -1,    29,    -1,    31,    32,    33,    -1,
+      -1,    -1,    37,    38,    39,    40,    41,    -1,    -1,    44,
       -1,    46,    -1,    -1,    49,    50,    51,    -1,    -1,    54,
-      -1,    -1,    -1,    58,    59,    60,    61,    62,    63,    64,
-      65,    66,    67,    68,    -1,    -1,    71,    72,    73,    74,
-      75,    76,    77,    78,    -1,    -1,    81,    82,    -1,    84,
-      85,    86,    87,    88,    89,    90,    91,    92,    93,    -1,
-      95,    96,     0,     1,    99,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    14,    -1,    -1,    17,
-      18,    -1,    -1,    21,    22,    23,    24,    25,    26,    27,
-      -1,    29,    30,    31,    -1,    33,    -1,    35,    36,    37,
-      38,    39,    40,    41,    -1,    -1,    -1,    -1,    46,    -1,
-      -1,    49,    50,    51,    -1,    -1,    54,    -1,    -1,    -1,
-      58,    59,    60,    -1,    -1,    -1,    -1,    -1,    -1,    67,
-      -1,    -1,    -1,    -1,    -1,    -1,    74,    75,    76,    77,
-      78,    -1,    -1,    81,    82,    -1,    84,    85,    86,     0,
-       1,    -1,    90,    91,    -1,    -1,    -1,    95,    96,    -1,
-      98,    99,    -1,    14,    -1,    -1,    17,    18,    -1,    -1,
+      -1,    -1,    57,    58,    59,    60,    -1,    -1,    -1,    -1,
+      -1,    -1,    67,    -1,    -1,    -1,    -1,    -1,    -1,    74,
+      75,    76,    77,    78,    -1,    -1,    81,    82,    83,     0,
+       1,    -1,    -1,    -1,    -1,    90,    91,    -1,    -1,    -1,
+      95,    96,    -1,    14,    99,    -1,    17,    18,    -1,    -1,
       21,    22,    23,    24,    25,    26,    27,    -1,    29,    30,
-      31,    -1,    33,    -1,    35,    36,    37,    38,    39,    40,
-      41,    -1,    -1,    -1,    -1,    46,    -1,    -1,    49,    50,
-      51,    -1,    -1,    54,    -1,    -1,    -1,    58,    59,    60,
-      -1,    -1,    -1,    -1,    -1,    -1,    67,    -1,    -1,    -1,
-      -1,    -1,    -1,    74,    75,    76,    77,    78,    -1,    -1,
-      81,    82,    -1,    84,    85,    86,     0,     1,    -1,    90,
-      91,    -1,    -1,    -1,    95,    96,    -1,    98,    99,    -1,
-      14,    -1,    -1,    17,    18,    -1,    -1,    21,    22,    23,
-      24,    25,    26,    27,    -1,    29,    -1,    31,    32,    33,
-      -1,    -1,    -1,    37,    38,    39,    40,    41,    -1,    -1,
-      44,    -1,    46,    -1,    -1,    49,    50,    51,    -1,    -1,
-      54,    -1,    -1,    57,    58,    59,    60,    -1,    -1,    -1,
-      -1,    -1,    -1,    67,    -1,    -1,    -1,    -1,    -1,    -1,
-      74,    75,    76,    77,    78,    -1,    -1,    81,    82,    83,
-       0,     1,    -1,    -1,    -1,    -1,    90,    91,    -1,    -1,
-      -1,    95,    96,    -1,    14,    99,    -1,    17,    18,    -1,
-      -1,    21,    22,    23,    24,    25,    26,    27,    -1,    29,
-      30,    31,    -1,    33,    -1,    -1,    -1,    37,    38,    39,
-      40,    41,    -1,    -1,    -1,    -1,    46,    -1,    -1,    49,
-      50,    51,    -1,    -1,    54,    -1,    -1,    -1,    58,    59,
-      60,    -1,    -1,    -1,    -1,    -1,    -1,    67,    -1,    -1,
-      -1,    -1,    -1,    -1,    74,    75,    76,    77,    78,    -1,
-      -1,    81,    82,     0,     1,    -1,    -1,    -1,    -1,    -1,
-      90,    91,    -1,    -1,    -1,    95,    96,    14,    -1,    99,
-      17,    18,    -1,    -1,    21,    22,    23,    24,    25,    26,
-      27,    -1,    29,    -1,    31,    -1,    33,    -1,    -1,    -1,
-      37,    38,    39,    40,    41,    -1,    -1,    -1,    -1,    46,
-      -1,    -1,    49,    50,    51,    -1,    -1,    54,    -1,    -1,
-      -1,    58,    59,    60,    -1,    -1,    -1,    -1,    -1,    -1,
-      67,    -1,    -1,    -1,    -1,    -1,    -1,    74,    75,    76,
-      77,    78,    -1,    -1,    81,    82,     0,     1,    -1,    -1,
-      -1,    -1,    -1,    90,    91,    -1,    -1,    -1,    95,    96,
-      14,    -1,    99,    17,    18,    -1,    -1,    21,    22,    23,
-      24,    25,    26,    27,    -1,    29,    -1,    31,    -1,    33,
-      -1,    -1,    -1,    37,    38,    39,    40,    41,    -1,    -1,
-      -1,    -1,    46,    -1,    -1,    49,    50,    51,    -1,    -1,
-      54,    -1,    -1,    -1,    58,    59,    60,    -1,    -1,    -1,
-      -1,    -1,    -1,    67,    -1,    -1,    -1,    -1,    -1,    -1,
-      74,    75,    76,    77,    78,    -1,    -1,    81,    82,    -1,
-       1,    -1,    -1,    -1,    -1,    -1,    90,    91,    -1,    -1,
-      -1,    95,    96,    14,    -1,    99,    17,    18,    -1,    -1,
-      21,    22,    23,    24,    25,    26,    27,    -1,    29,    -1,
-      31,    -1,    33,    -1,    35,    36,    37,    38,    39,    40,
-      41,    -1,    -1,    -1,    -1,    46,    -1,    -1,    49,    50,
-      51,    -1,    -1,    54,    -1,    -1,    -1,    58,    59,    60,
-      -1,    -1,    -1,    -1,    -1,    -1,    67,    -1,    -1,    -1,
-      -1,    -1,    -1,    74,    75,    76,    77,    78,    -1,    -1,
-      81,    82,    -1,    84,     1,    -1,    -1,    -1,    -1,    90,
-      91,    -1,    -1,    -1,    95,    96,    -1,    14,    99,    -1,
-      17,    18,    -1,    -1,    21,    22,    23,    24,    25,    26,
-      27,    -1,    29,    -1,    31,    -1,    33,    -1,    -1,    -1,
-      37,    38,    39,    40,    41,    -1,    -1,    -1,    -1,    46,
-      -1,    -1,    49,    50,    51,    -1,    -1,    54,    -1,    -1,
-      -1,    58,    59,    60,    -1,    -1,    -1,    -1,    -1,    -1,
-      67,    -1,    -1,    -1,    -1,    -1,    -1,    74,    75,    76,
-      77,    78,    -1,    -1,    81,    82,    -1,     1,    -1,    86,
-      -1,    -1,    -1,    90,    91,    -1,    -1,    -1,    95,    96,
-      14,    -1,    99,    17,    18,    -1,    -1,    21,    22,    23,
-      24,    25,    26,    27,    -1,    29,    -1,    31,    -1,    33,
-      -1,    -1,    -1,    37,    38,    39,    40,    41,    -1,    -1,
-      -1,    -1,    46,    -1,    -1,    49,    50,    51,    -1,    -1,
-      54,    -1,    -1,    -1,    58,    59,    60,    -1,    -1,    -1,
-      -1,    -1,    -1,    67,    -1,    -1,    -1,    -1,    -1,    -1,
-      74,    75,    76,    77,    78,    -1,    -1,    81,    82,    -1,
-       1,    85,    -1,    -1,    -1,    -1,    90,    91,    -1,    -1,
-      -1,    95,    96,    14,    -1,    99,    17,    18,    -1,    -1,
-      21,    22,    23,    24,    25,    26,    27,    -1,    29,    -1,
       31,    -1,    33,    -1,    -1,    -1,    37,    38,    39,    40,
       41,    -1,    -1,    -1,    -1,    46,    -1,    -1,    49,    50,
       51,    -1,    -1,    54,    -1,    -1,    -1,    58,    59,    60,
       -1,    -1,    -1,    -1,    -1,    -1,    67,    -1,    -1,    -1,
       -1,    -1,    -1,    74,    75,    76,    77,    78,    -1,    -1,
-      81,    82,    -1,    84,     1,    -1,    -1,    -1,    -1,    90,
-      91,    -1,    -1,    -1,    95,    96,    -1,    14,    99,    -1,
-      17,    18,    -1,    -1,    21,    22,    23,    24,    25,    26,
-      27,    -1,    29,    -1,    31,    -1,    33,    -1,    -1,    -1,
-      37,    38,    39,    40,    41,    -1,    -1,    -1,    -1,    46,
-      -1,    -1,    49,    50,    51,    -1,    -1,    54,    -1,    -1,
-      -1,    58,    59,    60,    -1,    -1,    -1,    -1,    -1,    -1,
-      67,    -1,    -1,    -1,    -1,    -1,    -1,    74,    75,    76,
-      77,    78,    -1,    -1,    81,    82,    -1,     1,    85,    -1,
-      -1,    -1,    -1,    90,    91,    -1,    -1,    -1,    95,    96,
-      14,    -1,    99,    17,    18,    -1,    -1,    21,    22,    23,
-      24,    25,    26,    27,    -1,    29,    -1,    31,    -1,    33,
-      -1,    -1,    -1,    37,    38,    39,    40,    41,    -1,    -1,
-      -1,    -1,    46,    -1,    -1,    49,    50,    51,    -1,    -1,
-      54,    -1,    -1,    -1,    58,    59,    60,    -1,    -1,    -1,
-      -1,    -1,    -1,    67,    -1,    -1,    -1,    -1,    -1,    -1,
-      74,    75,    76,    77,    78,    -1,    -1,    81,    82,    -1,
-       1,    85,    -1,    -1,    -1,    -1,    90,    91,    -1,    -1,
-      -1,    95,    96,    14,    -1,    99,    17,    18,    -1,    -1,
-      21,    22,    23,    24,    25,    26,    27,    -1,    29,    -1,
-      31,    -1,    33,    -1,    -1,    -1,    37,    38,    39,    40,
-      41,    -1,    -1,    -1,    -1,    46,    -1,    -1,    49,    50,
-      51,    -1,    -1,    54,    -1,    -1,    -1,    58,    59,    60,
-      -1,    -1,    -1,    -1,    -1,    -1,    67,    -1,    -1,    -1,
-      -1,    -1,    -1,    74,    75,    76,    77,    78,    -1,    -1,
-      81,    82,    -1,     1,    85,    -1,    -1,    -1,    -1,    90,
+      81,    82,     0,     1,    -1,    -1,    -1,    -1,    -1,    90,
       91,    -1,    -1,    -1,    95,    96,    14,    -1,    99,    17,
       18,    -1,    -1,    21,    22,    23,    24,    25,    26,    27,
       -1,    29,    -1,    31,    -1,    33,    -1,    -1,    -1,    37,
-      38,    39,    40,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    49,    -1,    51,    -1,    -1,    -1,    -1,    -1,    -1,
+      38,    39,    40,    41,    -1,    -1,    -1,    -1,    46,    -1,
+      -1,    49,    50,    51,    -1,    -1,    54,    -1,    -1,    -1,
+      58,    59,    60,    -1,    -1,    -1,    -1,    -1,    -1,    67,
+      -1,    -1,    -1,    -1,    -1,    -1,    74,    75,    76,    77,
+      78,    -1,    -1,    81,    82,     0,     1,    -1,    -1,    -1,
+      -1,    -1,    90,    91,    -1,    -1,    -1,    95,    96,    14,
+      -1,    99,    17,    18,    -1,    -1,    21,    22,    23,    24,
+      25,    26,    27,    -1,    29,    -1,    31,    -1,    33,    -1,
+      -1,    -1,    37,    38,    39,    40,    41,    -1,    -1,    -1,
+      -1,    46,    -1,    -1,    49,    50,    51,    -1,    -1,    54,
+      -1,    -1,    -1,    58,    59,    60,    -1,    -1,    -1,    -1,
+      -1,    -1,    67,    -1,    -1,    -1,    -1,    -1,    -1,    74,
+      75,    76,    77,    78,    -1,    -1,    81,    82,    -1,     1,
+      -1,    -1,    -1,    -1,    -1,    90,    91,    -1,    -1,    -1,
+      95,    96,    14,    -1,    99,    17,    18,    -1,    -1,    21,
+      22,    23,    24,    25,    26,    27,    -1,    29,    -1,    31,
+      -1,    33,    -1,    35,    36,    37,    38,    39,    40,    41,
+      -1,    -1,    -1,    -1,    46,    -1,    -1,    49,    50,    51,
+      -1,    -1,    54,    -1,    -1,    -1,    58,    59,    60,    -1,
+      -1,    -1,    -1,    -1,    -1,    67,    -1,    -1,    -1,    -1,
+      -1,    -1,    74,    75,    76,    77,    78,    -1,    -1,    81,
+      82,    -1,    84,     1,    -1,    -1,    -1,    -1,    90,    91,
+      -1,    -1,    -1,    95,    96,    -1,    14,    99,    -1,    17,
+      18,    -1,    -1,    21,    22,    23,    24,    25,    26,    27,
+      -1,    29,    -1,    31,    -1,    33,    -1,    -1,    -1,    37,
+      38,    39,    40,    41,    -1,    -1,    -1,    -1,    46,    -1,
+      -1,    49,    50,    51,    -1,    -1,    54,    -1,    -1,    -1,
       58,    59,    60,    -1,    -1,    -1,    -1,    -1,    -1,    67,
       -1,    -1,    -1,    -1,    -1,    -1,    74,    75,    76,    77,
-      78,    -1,    -1,     1,    82,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    90,    91,    -1,    -1,    14,    -1,    96,    17,
-      18,    99,    -1,    21,    -1,    23,    24,    25,    26,    27,
-      -1,    29,    -1,    -1,    -1,    33,    -1,    -1,    -1,     1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    45,    46,    47,
-      48,    49,    14,    51,    -1,    17,    18,    -1,    -1,    21,
-      -1,    23,    24,    25,    26,    27,    -1,    29,    -1,    67,
-      -1,    33,    -1,    -1,    -1,    -1,    74,    75,    76,    77,
-      78,    -1,    -1,    45,    -1,    47,    -1,    49,    -1,    51,
-      -1,    -1,    90,    91,    -1,    -1,    -1,    -1,    96,    -1,
-      -1,    99,    -1,    -1,    -1,    67,    -1,    -1,    -1,    -1,
-      -1,    -1,    74,    75,    76,    77,    78,    -1,    -1,     1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    90,    91,
-      -1,    -1,    14,    -1,    96,    17,    18,    99,    -1,    21,
-      -1,    23,    24,    25,    26,    27,    -1,    29,    -1,    -1,
-      -1,    33,    -1,    -1,    -1,     1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    49,    14,    51,
-      -1,    17,    18,    -1,    -1,    21,    -1,    23,    24,    25,
-      26,    27,    -1,    29,    -1,    67,    -1,    33,    -1,    -1,
-      -1,    -1,    74,    75,    76,    77,    78,    -1,    -1,    -1,
-      -1,    -1,    -1,    49,    -1,    51,    -1,    -1,    90,    91,
-      -1,    -1,    -1,    -1,    96,    97,    98,    99,    -1,    -1,
-      -1,    67,    -1,    -1,    -1,    -1,    -1,    -1,    74,    75,
-      76,    77,    78,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,     1,    -1,    -1,    90,    91,    -1,    -1,    -1,    -1,
-      96,    97,    98,    99,    14,    -1,    -1,    17,    18,    -1,
-      20,    21,    -1,    23,    24,    25,    26,    27,    -1,    29,
-      -1,    -1,    -1,    33,    -1,    -1,    -1,     1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    49,
-      14,    51,    -1,    17,    18,    -1,    -1,    21,    -1,    23,
-      24,    25,    26,    27,    -1,    29,    -1,    67,    -1,    33,
-      -1,    -1,    -1,    -1,    74,    75,    76,    77,    78,    -1,
-      -1,    -1,    -1,    -1,    -1,    49,    -1,    51,    -1,    -1,
-      90,    91,    -1,    -1,    -1,    -1,    96,    -1,    -1,    99,
-      -1,    -1,    45,    67,    47,    -1,    -1,    -1,    -1,    -1,
-      74,    75,    76,    77,    78,    -1,    -1,    -1,    61,    62,
-      63,    64,    65,    66,    -1,    68,    90,    91,    71,    72,
-      73,    -1,    96,    -1,    -1,    99,    -1,    47,    -1,    -1,
+      78,    -1,    -1,    81,    82,    -1,     1,    -1,    86,    -1,
+      -1,    -1,    90,    91,    -1,    -1,    -1,    95,    96,    14,
+      -1,    99,    17,    18,    -1,    -1,    21,    22,    23,    24,
+      25,    26,    27,    -1,    29,    -1,    31,    -1,    33,    -1,
+      -1,    -1,    37,    38,    39,    40,    41,    -1,    -1,    -1,
+      -1,    46,    -1,    -1,    49,    50,    51,    -1,    -1,    54,
+      -1,    -1,    -1,    58,    59,    60,    -1,    -1,    -1,    -1,
+      -1,    -1,    67,    -1,    -1,    -1,    -1,    -1,    -1,    74,
+      75,    76,    77,    78,    -1,    -1,    81,    82,    -1,     1,
+      85,    -1,    -1,    -1,    -1,    90,    91,    -1,    -1,    -1,
+      95,    96,    14,    -1,    99,    17,    18,    -1,    -1,    21,
+      22,    23,    24,    25,    26,    27,    -1,    29,    -1,    31,
+      -1,    33,    -1,    -1,    -1,    37,    38,    39,    40,    41,
+      -1,    -1,    -1,    -1,    46,    -1,    -1,    49,    50,    51,
+      -1,    -1,    54,    -1,    -1,    -1,    58,    59,    60,    -1,
+      -1,    -1,    -1,    -1,    -1,    67,    -1,    -1,    -1,    -1,
+      -1,    -1,    74,    75,    76,    77,    78,    -1,    -1,    81,
+      82,    -1,    84,     1,    -1,    -1,    -1,    -1,    90,    91,
+      -1,    -1,    -1,    95,    96,    -1,    14,    99,    -1,    17,
+      18,    -1,    -1,    21,    22,    23,    24,    25,    26,    27,
+      -1,    29,    -1,    31,    -1,    33,    -1,    -1,    -1,    37,
+      38,    39,    40,    41,    -1,    -1,    -1,    -1,    46,    -1,
+      -1,    49,    50,    51,    -1,    -1,    54,    -1,    -1,    -1,
+      58,    59,    60,    -1,    -1,    -1,    -1,    -1,    -1,    67,
+      -1,    -1,    -1,    -1,    -1,    -1,    74,    75,    76,    77,
+      78,    -1,    -1,    81,    82,    -1,     1,    85,    -1,    -1,
+      -1,    -1,    90,    91,    -1,    -1,    -1,    95,    96,    14,
+      -1,    99,    17,    18,    -1,    -1,    21,    22,    23,    24,
+      25,    26,    27,    -1,    29,    -1,    31,    -1,    33,    -1,
+      -1,    -1,    37,    38,    39,    40,    41,    -1,    -1,    -1,
+      -1,    46,    -1,    -1,    49,    50,    51,    -1,    -1,    54,
+      -1,    -1,    -1,    58,    59,    60,    -1,    -1,    -1,    -1,
+      -1,    -1,    67,    -1,    -1,    -1,    -1,    -1,    -1,    74,
+      75,    76,    77,    78,    -1,    -1,    81,    82,    -1,     1,
+      85,    -1,    -1,    -1,    -1,    90,    91,    -1,    -1,    -1,
+      95,    96,    14,    -1,    99,    17,    18,    -1,    -1,    21,
+      22,    23,    24,    25,    26,    27,    -1,    29,    -1,    31,
+      -1,    33,    -1,    -1,    -1,    37,    38,    39,    40,    41,
+      -1,    -1,    -1,    -1,    46,    -1,    -1,    49,    50,    51,
+      -1,    -1,    54,    -1,    -1,    -1,    58,    59,    60,    -1,
+      -1,    -1,    -1,    -1,    -1,    67,    -1,    -1,    -1,    -1,
+      -1,    -1,    74,    75,    76,    77,    78,    -1,    -1,    81,
+      82,    -1,     1,    85,    -1,    -1,    -1,    -1,    90,    91,
+      -1,    -1,    -1,    95,    96,    14,    -1,    99,    17,    18,
+      -1,    -1,    21,    22,    23,    24,    25,    26,    27,    -1,
+      29,    -1,    31,    -1,    33,    -1,    -1,    -1,    37,    38,
+      39,    40,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      49,    -1,    51,    -1,    -1,    -1,    -1,    -1,    -1,    58,
+      59,    60,    -1,    -1,    -1,    -1,    -1,    -1,    67,    -1,
+      -1,    -1,    -1,    -1,    -1,    74,    75,    76,    77,    78,
+      -1,    -1,     1,    82,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    90,    91,    -1,    -1,    14,    -1,    96,    17,    18,
+      99,    -1,    21,    -1,    23,    24,    25,    26,    27,    -1,
+      29,    -1,    -1,    -1,    33,    -1,    -1,    -1,     1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    45,    46,    47,    48,
+      49,    14,    51,    -1,    17,    18,    -1,    -1,    21,    -1,
+      23,    24,    25,    26,    27,    -1,    29,    -1,    67,    -1,
+      33,    -1,    -1,    -1,    -1,    74,    75,    76,    77,    78,
+      -1,    -1,    45,    -1,    47,    -1,    49,    -1,    51,    -1,
+      -1,    90,    91,    -1,    -1,    -1,    -1,    96,    -1,    -1,
+      99,    -1,    -1,    -1,    67,    -1,    -1,    -1,    -1,    -1,
+      -1,    74,    75,    76,    77,    78,    -1,    -1,     1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    90,    91,    -1,
+      -1,    14,    -1,    96,    17,    18,    99,    -1,    21,    -1,
+      23,    24,    25,    26,    27,    -1,    29,    -1,    -1,    -1,
+      33,    -1,    -1,    -1,     1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    49,    14,    51,    -1,
+      17,    18,    -1,    20,    21,    -1,    23,    24,    25,    26,
+      27,    -1,    29,    -1,    67,    -1,    33,    -1,    -1,    -1,
+      -1,    74,    75,    76,    77,    78,    -1,    -1,    -1,    -1,
+     280,    -1,    49,    -1,    51,    -1,    -1,    90,    91,    -1,
+      -1,    -1,    -1,    96,    97,    98,    99,    -1,    -1,    -1,
+      67,    -1,    -1,   303,    -1,    -1,   306,    74,    75,    76,
+      77,    78,   312,    -1,     1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    90,    91,    -1,   326,    14,    -1,    96,
+      17,    18,    99,    -1,    21,    -1,    23,    24,    25,    26,
+      27,    -1,    29,   343,    -1,    -1,    33,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    49,   363,    51,    -1,    -1,   367,    34,    -1,
+      -1,    -1,    -1,   373,    -1,    -1,    -1,   377,    -1,    -1,
+      67,    -1,    -1,    -1,    -1,    -1,    -1,    74,    75,    76,
+      77,    78,    -1,    -1,    -1,    61,    62,    63,    64,    65,
+      66,    -1,    68,    90,    91,    71,    72,    73,    -1,    96,
+      -1,    -1,    99,    45,    -1,    47,    -1,    -1,    -1,    -1,
+      -1,    87,    88,    89,    90,    91,    92,    93,    -1,    61,
+      62,    63,    64,    65,    66,    -1,    68,    -1,    -1,    71,
+      72,    73,    -1,    -1,    -1,    -1,    -1,    -1,    47,    -1,
+      -1,    -1,    -1,    -1,    53,    87,    88,    89,    90,    91,
+      92,    93,    61,    62,    63,    64,    65,    66,    -1,    68,
+      -1,    -1,    71,    72,    73,    -1,    -1,    -1,    -1,    -1,
+      -1,    47,    -1,    -1,    -1,    -1,    -1,    53,    87,    88,
+      89,    90,    91,    92,    93,    61,    62,    63,    64,    65,
+      66,    -1,    68,    -1,    -1,    71,    72,    73,    -1,    -1,
+      -1,    -1,    -1,    -1,    47,    -1,    -1,    -1,    -1,    -1,
+      53,    87,    88,    89,    90,    91,    92,    93,    61,    62,
+      63,    64,    65,    66,    -1,    68,    -1,    -1,    71,    72,
+      73,    -1,    -1,    -1,    -1,    -1,    -1,    47,    -1,    -1,
       -1,    -1,    -1,    53,    87,    88,    89,    90,    91,    92,
       93,    61,    62,    63,    64,    65,    66,    -1,    68,    -1,
       -1,    71,    72,    73,    -1,    -1,    -1,    -1,    -1,    -1,
-      47,    -1,    -1,    -1,    -1,    -1,    53,    87,    88,    89,
+      47,    -1,    -1,    -1,    -1,    -1,    -1,    87,    88,    89,
       90,    91,    92,    93,    61,    62,    63,    64,    65,    66,
       -1,    68,    -1,    -1,    71,    72,    73,    -1,    -1,    -1,
-      -1,    -1,    -1,    47,    -1,    -1,    -1,    -1,    -1,    53,
+      -1,    -1,    -1,    47,    -1,    -1,    -1,    -1,    -1,    -1,
       87,    88,    89,    90,    91,    92,    93,    61,    62,    63,
       64,    65,    66,    -1,    68,    -1,    -1,    71,    72,    73,
       -1,    -1,    -1,    -1,    -1,    -1,    47,    -1,    -1,    -1,
-      -1,    -1,    53,    87,    88,    89,    90,    91,    92,    93,
+      -1,    -1,    -1,    87,    88,    89,    90,    91,    92,    93,
       61,    62,    63,    64,    65,    66,    -1,    68,    -1,    -1,
       71,    72,    73,    -1,    -1,    -1,    -1,    -1,    -1,    47,
       -1,    -1,    -1,    -1,    -1,    -1,    87,    88,    89,    90,
       91,    92,    93,    61,    62,    63,    64,    65,    66,    -1,
       68,    -1,    -1,    71,    72,    73,    -1,    -1,    -1,    -1,
-      -1,    -1,    47,    -1,    -1,    -1,    -1,    -1,    -1,    87,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    53,    87,
       88,    89,    90,    91,    92,    93,    61,    62,    63,    64,
       65,    66,    -1,    68,    -1,    -1,    71,    72,    73,    -1,
-      -1,    -1,    -1,    -1,    -1,    47,    -1,    -1,    -1,    -1,
-      -1,    -1,    87,    88,    89,    90,    91,    92,    93,    61,
-      62,    63,    64,    65,    66,    -1,    68,    -1,    -1,    71,
-      72,    73,    -1,    -1,    -1,    -1,    -1,    -1,    47,    -1,
-      -1,    -1,    -1,    -1,    -1,    87,    88,    89,    90,    91,
-      92,    93,    61,    62,    63,    64,    65,    66,    -1,    68,
-      -1,    -1,    71,    72,    73,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    53,    87,    88,
-      89,    90,    91,    92,    93,    61,    62,    63,    64,    65,
-      66,    -1,    68,    -1,    -1,    71,    72,    73,    -1,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    87,    88,    89,    90,    91,    92,    93,    55,    95,
-      -1,    -1,    -1,    -1,    61,    62,    63,    64,    65,    66,
-      -1,    68,    -1,    -1,    71,    72,    73,    61,    62,    63,
-      64,    65,    66,    -1,    68,    -1,    -1,    71,    72,    73,
-      87,    88,    89,    90,    91,    92,    93,    -1,    -1,    -1,
-      -1,    -1,    -1,    87,    88,    89,    90,    91,    92,    93,
-      -1,    -1,    -1,    97,    61,    62,    63,    64,    65,    66,
-      -1,    68,    -1,    -1,    71,    72,    73,    -1,    -1,    -1,
-      -1,    -1,    79,    80,    -1,    -1,    -1,    -1,    -1,    -1,
-      87,    88,    89,    90,    91,    92,    93,    61,    62,    63,
-      64,    65,    66,    -1,    68,    -1,    -1,    71,    72,    73,
-      61,    62,    63,    64,    -1,    -1,    -1,    68,    -1,    -1,
-      71,    72,    73,    87,    88,    89,    90,    91,    92,    93,
-      -1,    -1,    -1,    -1,    -1,    -1,    87,    88,    89,    90,
-      91,    92,    93
+      -1,    -1,    87,    88,    89,    90,    91,    92,    93,    55,
+      95,    -1,    -1,    -1,    -1,    61,    62,    63,    64,    65,
+      66,    -1,    68,    -1,    -1,    71,    72,    73,    61,    62,
+      63,    64,    65,    66,    -1,    68,    -1,    -1,    71,    72,
+      73,    87,    88,    89,    90,    91,    92,    93,    -1,    -1,
+      -1,    -1,    -1,    -1,    87,    88,    89,    90,    91,    92,
+      93,    -1,    -1,    -1,    97,    61,    62,    63,    64,    65,
+      66,    -1,    68,    -1,    -1,    71,    72,    73,    -1,    -1,
+      -1,    -1,    -1,    79,    80,    -1,    -1,    -1,    -1,    -1,
+      -1,    87,    88,    89,    90,    91,    92,    93,    61,    62,
+      63,    64,    65,    66,    -1,    68,    -1,    -1,    71,    72,
+      73,    61,    62,    63,    64,    -1,    -1,    -1,    68,    -1,
+      -1,    71,    72,    73,    87,    88,    89,    90,    91,    92,
+      93,    -1,    -1,    -1,    -1,    -1,    -1,    87,    88,    89,
+      90,    91,    92,    93
 };
 
   /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing
@@ -1634,40 +1624,40 @@ static const yytype_uint8 yystos[] =
       41,    44,    46,    49,    50,    51,    54,    57,    58,    59,
       60,    67,    74,    75,    76,    77,    78,    81,    82,    83,
       90,    91,    96,    99,   103,   104,   105,   106,   107,   119,
-     125,   128,   129,   131,   132,   133,   140,   142,   144,   148,
-     153,   156,    95,    26,   128,    26,    49,    96,   129,   154,
-      96,   154,   128,    47,    96,   129,   155,   143,   147,    50,
+     125,   128,   129,   131,   132,   133,   140,   142,   144,   147,
+     152,   155,    95,    26,   128,    26,    49,    96,   129,   153,
+      96,   153,   128,    47,    96,   129,   154,   143,   146,    50,
      134,    45,    46,    47,    48,   129,   141,   145,    50,    20,
      129,    55,    56,    17,    18,    19,    26,    33,    26,    26,
      129,   129,   141,   136,   129,   129,   129,   129,   129,   129,
-     129,   135,   149,   129,   129,   129,    26,    27,    29,   101,
-     129,   157,   158,   159,   160,     0,    95,   129,    61,    62,
+     129,   135,   148,   129,   129,   129,    26,    27,    29,   101,
+     129,   156,   157,   158,   159,     0,    95,   129,    61,    62,
       63,    64,    65,    66,    68,    71,    72,    73,    87,    88,
-      89,    90,    91,    92,    93,   126,    96,   129,   129,   154,
-      98,   154,   128,    26,   154,    98,   154,   126,    26,   137,
+      89,    90,    91,    92,    93,   126,    96,   129,   129,   153,
+      98,   153,   128,    26,   153,    98,   153,   126,    26,   137,
      129,    45,   141,    26,    26,    43,    69,    70,    26,   126,
       53,    63,   128,   128,    53,    63,    53,    63,    52,    55,
      141,    26,   139,    47,    53,    47,    53,    47,    53,    47,
       53,    79,    80,    53,    95,    26,   138,    26,    97,   101,
      101,   101,   100,    98,    98,   103,   122,   129,   129,   129,
      129,   129,   129,   129,   129,   129,   129,   129,   129,   129,
-     129,   129,   129,   129,    26,   150,    97,   129,    97,    97,
-      98,    97,   129,   150,    98,   129,   146,   128,    26,   132,
+     129,   129,   129,   129,    26,   149,    97,   129,    97,    97,
+      98,    97,   129,   149,    98,   129,   126,   128,    26,   132,
       26,   132,    26,   132,    42,    63,   129,   129,   129,    53,
       63,    47,   129,   129,   129,   129,   129,   129,    98,   129,
      129,   129,   129,   129,   129,   129,   129,   129,   129,   118,
-     118,    98,   129,   129,   129,   129,    26,    27,    29,   160,
-      52,    95,    98,   130,    95,    26,   126,    43,   129,   129,
+     118,    98,   129,   129,   129,   129,    26,    27,    29,   159,
+      52,    95,    98,   130,    95,    26,   149,    43,   129,   129,
      122,   129,   129,    26,    26,    47,    47,    47,    47,   106,
-     127,    26,   127,   152,    26,   155,   152,   150,   129,   114,
+     127,    26,   127,   151,    26,   154,   151,    95,   129,   114,
      108,   111,   117,   128,   129,   129,   129,   129,   126,    95,
-     107,   126,   123,   127,    97,   127,    95,   126,   124,   124,
-     127,    53,    63,    86,   120,    30,   152,   115,   109,   112,
-     123,   129,   129,    35,    36,   121,   126,    26,   151,   127,
-     122,    53,    34,    85,   127,   129,    84,    98,   116,   129,
-      53,   126,   122,    26,   117,   110,   129,    84,    52,   127,
-     122,   113,   127,    85,   117,   122,   123,   127,   117,    85,
-     127,    85
+     107,   126,   123,   127,    97,   127,   151,   126,   124,   124,
+     127,    53,    63,    86,   120,    30,   127,   115,   109,   112,
+     123,   129,   129,    35,    36,   121,   126,    26,   150,   122,
+      53,    34,    85,   127,   129,    84,    98,   116,   129,    53,
+     126,   122,    26,   117,   110,   129,    84,    52,   127,   122,
+     113,   127,    85,   117,   122,   123,   127,   117,    85,   127,
+      85
 };
 
   /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives.  */
@@ -1687,11 +1677,11 @@ static const yytype_uint8 yyr1[] =
      131,   131,   132,   132,   133,   133,   133,   133,   133,   134,
      133,   135,   133,   136,   133,   133,   133,   133,   133,   137,
      137,   138,   138,   139,   139,   140,   140,   140,   140,   140,
-     140,   141,   141,   142,   142,   142,   143,   142,   145,   146,
-     144,   144,   147,   144,   144,   144,   149,   148,   150,   150,
-     150,   151,   151,   151,   152,   153,   154,   154,   154,   155,
-     155,   156,   157,   157,   157,   157,   158,   158,   159,   159,
-     160,   160,   160
+     140,   141,   141,   142,   142,   142,   143,   142,   145,   144,
+     144,   146,   144,   144,   144,   148,   147,   149,   149,   149,
+     150,   150,   150,   151,   152,   153,   153,   153,   154,   154,
+     155,   156,   156,   156,   156,   157,   157,   158,   158,   159,
+     159,   159
 };
 
   /* YYR2[YYN] -- Number of symbols on the right hand side of rule YYN.  */
@@ -1711,11 +1701,11 @@ static const yytype_int8 yyr2[] =
        4,     6,     2,     1,     2,     1,     1,     2,     1,     0,
        3,     0,     3,     0,     3,     4,     2,     4,     2,     1,
        3,     1,     3,     1,     3,     1,     2,     2,     2,     3,
-       2,     3,     2,     2,     3,     2,     0,     3,     0,     0,
-       9,     2,     0,     7,     8,     6,     0,     3,     0,     1,
-       3,     0,     1,     3,     0,     2,     0,     1,     3,     1,
-       3,     3,     0,     1,     1,     1,     1,     3,     1,     3,
-       3,     3,     3
+       2,     3,     2,     2,     3,     2,     0,     3,     0,     8,
+       2,     0,     7,     8,     6,     0,     3,     0,     1,     3,
+       0,     1,     3,     0,     2,     0,     1,     3,     1,     3,
+       3,     0,     1,     1,     1,     1,     3,     1,     3,     3,
+       3,     3
 };
 
 
@@ -1987,75 +1977,75 @@ yydestruct (const char *yymsg,
   switch (yykind)
     {
     case 22: /* BLTIN  */
-#line 216 "engines/director/lingo/lingo-gr.y"
+#line 210 "engines/director/lingo/lingo-gr.y"
             { delete ((*yyvaluep).s); }
-#line 1993 "engines/director/lingo/lingo-gr.cpp"
+#line 1983 "engines/director/lingo/lingo-gr.cpp"
         break;
 
     case 23: /* FBLTIN  */
-#line 216 "engines/director/lingo/lingo-gr.y"
+#line 210 "engines/director/lingo/lingo-gr.y"
             { delete ((*yyvaluep).s); }
-#line 1999 "engines/director/lingo/lingo-gr.cpp"
+#line 1989 "engines/director/lingo/lingo-gr.cpp"
         break;
 
     case 24: /* RBLTIN  */
-#line 216 "engines/director/lingo/lingo-gr.y"
+#line 210 "engines/director/lingo/lingo-gr.y"
             { delete ((*yyvaluep).s); }
-#line 2005 "engines/director/lingo/lingo-gr.cpp"
+#line 1995 "engines/director/lingo/lingo-gr.cpp"
         break;
 
     case 25: /* THEFBLTIN  */
-#line 216 "engines/director/lingo/lingo-gr.y"
+#line 210 "engines/director/lingo/lingo-gr.y"
             { delete ((*yyvaluep).s); }
-#line 2011 "engines/director/lingo/lingo-gr.cpp"
+#line 2001 "engines/director/lingo/lingo-gr.cpp"
         break;
 
     case 26: /* ID  */
-#line 216 "engines/director/lingo/lingo-gr.y"
+#line 210 "engines/director/lingo/lingo-gr.y"
             { delete ((*yyvaluep).s); }
-#line 2017 "engines/director/lingo/lingo-gr.cpp"
+#line 2007 "engines/director/lingo/lingo-gr.cpp"
         break;
 
     case 27: /* STRING  */
-#line 216 "engines/director/lingo/lingo-gr.y"
+#line 210 "engines/director/lingo/lingo-gr.y"
             { delete ((*yyvaluep).s); }
-#line 2023 "engines/director/lingo/lingo-gr.cpp"
+#line 2013 "engines/director/lingo/lingo-gr.cpp"
         break;
 
     case 28: /* HANDLER  */
-#line 216 "engines/director/lingo/lingo-gr.y"
+#line 210 "engines/director/lingo/lingo-gr.y"
             { delete ((*yyvaluep).s); }
-#line 2029 "engines/director/lingo/lingo-gr.cpp"
+#line 2019 "engines/director/lingo/lingo-gr.cpp"
         break;
 
     case 29: /* SYMBOL  */
-#line 216 "engines/director/lingo/lingo-gr.y"
+#line 210 "engines/director/lingo/lingo-gr.y"
             { delete ((*yyvaluep).s); }
-#line 2035 "engines/director/lingo/lingo-gr.cpp"
+#line 2025 "engines/director/lingo/lingo-gr.cpp"
         break;
 
     case 30: /* ENDCLAUSE  */
-#line 216 "engines/director/lingo/lingo-gr.y"
+#line 210 "engines/director/lingo/lingo-gr.y"
             { delete ((*yyvaluep).s); }
-#line 2041 "engines/director/lingo/lingo-gr.cpp"
+#line 2031 "engines/director/lingo/lingo-gr.cpp"
         break;
 
     case 31: /* tPLAYACCEL  */
-#line 216 "engines/director/lingo/lingo-gr.y"
+#line 210 "engines/director/lingo/lingo-gr.y"
             { delete ((*yyvaluep).s); }
-#line 2047 "engines/director/lingo/lingo-gr.cpp"
+#line 2037 "engines/director/lingo/lingo-gr.cpp"
         break;
 
     case 32: /* tMETHOD  */
-#line 216 "engines/director/lingo/lingo-gr.y"
+#line 210 "engines/director/lingo/lingo-gr.y"
             { delete ((*yyvaluep).s); }
-#line 2053 "engines/director/lingo/lingo-gr.cpp"
+#line 2043 "engines/director/lingo/lingo-gr.cpp"
         break;
 
-    case 148: /* on  */
-#line 216 "engines/director/lingo/lingo-gr.y"
+    case 147: /* on  */
+#line 210 "engines/director/lingo/lingo-gr.y"
             { delete ((*yyvaluep).s); }
-#line 2059 "engines/director/lingo/lingo-gr.cpp"
+#line 2049 "engines/director/lingo/lingo-gr.cpp"
         break;
 
       default:
@@ -2334,7 +2324,7 @@ yyreduce:
   switch (yyn)
     {
   case 7:
-#line 227 "engines/director/lingo/lingo-gr.y"
+#line 221 "engines/director/lingo/lingo-gr.y"
                                         {
 		g_lingo->code1(LC::c_varpush);
 		g_lingo->codeString((yyvsp[0].s)->c_str());
@@ -2342,19 +2332,19 @@ yyreduce:
 		g_lingo->code1(LC::c_assign);
 		(yyval.code) = (yyvsp[-2].code);
 		delete (yyvsp[0].s); }
-#line 2346 "engines/director/lingo/lingo-gr.cpp"
+#line 2336 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 8:
-#line 234 "engines/director/lingo/lingo-gr.y"
+#line 228 "engines/director/lingo/lingo-gr.y"
                                                 {
 		g_lingo->code1(LC::c_assign);
 		(yyval.code) = (yyvsp[-2].code); }
-#line 2354 "engines/director/lingo/lingo-gr.cpp"
+#line 2344 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 9:
-#line 238 "engines/director/lingo/lingo-gr.y"
+#line 232 "engines/director/lingo/lingo-gr.y"
                                                                 {
 		if (!(yyvsp[-3].s)->equalsIgnoreCase("menu")) {
 			warning("LEXER: keyword 'menu' expected");
@@ -2366,11 +2356,11 @@ yyreduce:
 		g_lingo->codeInt((yyvsp[-4].e)[1]);
 		g_lingo->code1(LC::c_assign);
 		(yyval.code) = (yyvsp[0].code); }
-#line 2370 "engines/director/lingo/lingo-gr.cpp"
+#line 2360 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 10:
-#line 249 "engines/director/lingo/lingo-gr.y"
+#line 243 "engines/director/lingo/lingo-gr.y"
                                         {
 		g_lingo->code1(LC::c_varpush);
 		g_lingo->codeString((yyvsp[0].s)->c_str());
@@ -2378,19 +2368,19 @@ yyreduce:
 		g_lingo->code1(LC::c_after);
 		(yyval.code) = (yyvsp[-2].code);
 		delete (yyvsp[0].s); }
-#line 2382 "engines/director/lingo/lingo-gr.cpp"
+#line 2372 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 11:
-#line 256 "engines/director/lingo/lingo-gr.y"
+#line 250 "engines/director/lingo/lingo-gr.y"
                                                 {
 		g_lingo->code1(LC::c_after);
 		(yyval.code) = (yyvsp[-2].code); }
-#line 2390 "engines/director/lingo/lingo-gr.cpp"
+#line 2380 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 12:
-#line 259 "engines/director/lingo/lingo-gr.y"
+#line 253 "engines/director/lingo/lingo-gr.y"
                                         {
 		g_lingo->code1(LC::c_varpush);
 		g_lingo->codeString((yyvsp[0].s)->c_str());
@@ -2398,19 +2388,19 @@ yyreduce:
 		g_lingo->code1(LC::c_before);
 		(yyval.code) = (yyvsp[-2].code);
 		delete (yyvsp[0].s); }
-#line 2402 "engines/director/lingo/lingo-gr.cpp"
+#line 2392 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 13:
-#line 266 "engines/director/lingo/lingo-gr.y"
+#line 260 "engines/director/lingo/lingo-gr.y"
                                                 {
 		g_lingo->code1(LC::c_before);
 		(yyval.code) = (yyvsp[-2].code); }
-#line 2410 "engines/director/lingo/lingo-gr.cpp"
+#line 2400 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 14:
-#line 269 "engines/director/lingo/lingo-gr.y"
+#line 263 "engines/director/lingo/lingo-gr.y"
                                                 {
 		g_lingo->code1(LC::c_varpush);
 		g_lingo->codeString((yyvsp[-2].s)->c_str());
@@ -2418,11 +2408,11 @@ yyreduce:
 		g_lingo->code1(LC::c_assign);
 		(yyval.code) = (yyvsp[0].code);
 		delete (yyvsp[-2].s); }
-#line 2422 "engines/director/lingo/lingo-gr.cpp"
+#line 2412 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 15:
-#line 276 "engines/director/lingo/lingo-gr.y"
+#line 270 "engines/director/lingo/lingo-gr.y"
                                         {
 		g_lingo->code1(LC::c_intpush);
 		g_lingo->codeInt(0); // Put dummy id
@@ -2430,11 +2420,11 @@ yyreduce:
 		g_lingo->codeInt((yyvsp[-2].e)[0]);
 		g_lingo->codeInt((yyvsp[-2].e)[1]);
 		(yyval.code) = (yyvsp[0].code); }
-#line 2434 "engines/director/lingo/lingo-gr.cpp"
+#line 2424 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 16:
-#line 283 "engines/director/lingo/lingo-gr.y"
+#line 277 "engines/director/lingo/lingo-gr.y"
                                                 {
 		g_lingo->code1(LC::c_varpush);
 		g_lingo->codeString((yyvsp[-2].s)->c_str());
@@ -2442,11 +2432,11 @@ yyreduce:
 		g_lingo->code1(LC::c_assign);
 		(yyval.code) = (yyvsp[0].code);
 		delete (yyvsp[-2].s); }
-#line 2446 "engines/director/lingo/lingo-gr.cpp"
+#line 2436 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 17:
-#line 290 "engines/director/lingo/lingo-gr.y"
+#line 284 "engines/director/lingo/lingo-gr.y"
                                         {
 		g_lingo->code1(LC::c_intpush);
 		g_lingo->codeInt(0); // Put dummy id
@@ -2454,33 +2444,33 @@ yyreduce:
 		g_lingo->codeInt((yyvsp[-2].e)[0]);
 		g_lingo->codeInt((yyvsp[-2].e)[1]);
 		(yyval.code) = (yyvsp[0].code); }
-#line 2458 "engines/director/lingo/lingo-gr.cpp"
+#line 2448 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 18:
-#line 297 "engines/director/lingo/lingo-gr.y"
+#line 291 "engines/director/lingo/lingo-gr.y"
                                                         {
 		g_lingo->code1(LC::c_swap);
 		g_lingo->code1(LC::c_theentityassign);
 		g_lingo->codeInt((yyvsp[-3].e)[0]);
 		g_lingo->codeInt((yyvsp[-3].e)[1]);
 		(yyval.code) = (yyvsp[0].code); }
-#line 2469 "engines/director/lingo/lingo-gr.cpp"
+#line 2459 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 19:
-#line 303 "engines/director/lingo/lingo-gr.y"
+#line 297 "engines/director/lingo/lingo-gr.y"
                                                         {
 		g_lingo->code1(LC::c_swap);
 		g_lingo->code1(LC::c_theentityassign);
 		g_lingo->codeInt((yyvsp[-3].e)[0]);
 		g_lingo->codeInt((yyvsp[-3].e)[1]);
 		(yyval.code) = (yyvsp[0].code); }
-#line 2480 "engines/director/lingo/lingo-gr.cpp"
+#line 2470 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 20:
-#line 310 "engines/director/lingo/lingo-gr.y"
+#line 304 "engines/director/lingo/lingo-gr.y"
                                                                         {
 		if (!(yyvsp[-3].s)->equalsIgnoreCase("menu")) {
 			warning("LEXER: keyword 'menu' expected");
@@ -2492,11 +2482,11 @@ yyreduce:
 		g_lingo->codeInt((yyvsp[-6].e)[0]);
 		g_lingo->codeInt((yyvsp[-6].e)[1]);
 		(yyval.code) = (yyvsp[0].code); }
-#line 2496 "engines/director/lingo/lingo-gr.cpp"
+#line 2486 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 21:
-#line 321 "engines/director/lingo/lingo-gr.y"
+#line 315 "engines/director/lingo/lingo-gr.y"
                                                                         {
 		if (!(yyvsp[-3].s)->equalsIgnoreCase("menu")) {
 			warning("LEXER: keyword 'menu' expected");
@@ -2508,11 +2498,11 @@ yyreduce:
 		g_lingo->codeInt((yyvsp[-6].e)[0]);
 		g_lingo->codeInt((yyvsp[-6].e)[1]);
 		(yyval.code) = (yyvsp[0].code); }
-#line 2512 "engines/director/lingo/lingo-gr.cpp"
+#line 2502 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 22:
-#line 332 "engines/director/lingo/lingo-gr.y"
+#line 326 "engines/director/lingo/lingo-gr.y"
                                         {
 		g_lingo->code1(LC::c_objectpropassign);
 		g_lingo->codeString((yyvsp[-2].objectprop).obj->c_str());
@@ -2520,11 +2510,11 @@ yyreduce:
 		delete (yyvsp[-2].objectprop).obj;
 		delete (yyvsp[-2].objectprop).prop;
 		(yyval.code) = (yyvsp[0].code); }
-#line 2524 "engines/director/lingo/lingo-gr.cpp"
+#line 2514 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 23:
-#line 339 "engines/director/lingo/lingo-gr.y"
+#line 333 "engines/director/lingo/lingo-gr.y"
                                         {
 		g_lingo->code1(LC::c_objectpropassign);
 		g_lingo->codeString((yyvsp[-2].objectprop).obj->c_str());
@@ -2532,11 +2522,11 @@ yyreduce:
 		delete (yyvsp[-2].objectprop).obj;
 		delete (yyvsp[-2].objectprop).prop;
 		(yyval.code) = (yyvsp[0].code); }
-#line 2536 "engines/director/lingo/lingo-gr.cpp"
+#line 2526 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 29:
-#line 357 "engines/director/lingo/lingo-gr.y"
+#line 351 "engines/director/lingo/lingo-gr.y"
                                                                                                 {
 		inst start = 0, end = 0;
 		WRITE_UINT32(&start, (yyvsp[-6].code) - (yyvsp[-1].code) + 1);
@@ -2544,32 +2534,32 @@ yyreduce:
 		(*g_lingo->_currentAssembly)[(yyvsp[-4].code)] = end;		/* end, if cond fails */
 		(*g_lingo->_currentAssembly)[(yyvsp[-1].code)] = start;	/* looping back */
 		endRepeat((yyvsp[-1].code) + 1, (yyvsp[-6].code));	}
-#line 2548 "engines/director/lingo/lingo-gr.cpp"
+#line 2538 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 30:
-#line 370 "engines/director/lingo/lingo-gr.y"
+#line 364 "engines/director/lingo/lingo-gr.y"
                                 { g_lingo->code1(LC::c_varpush);
 				  g_lingo->codeString((yyvsp[-2].s)->c_str());
 				  mVar((yyvsp[-2].s), globalCheck()); }
-#line 2556 "engines/director/lingo/lingo-gr.cpp"
+#line 2546 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 31:
-#line 374 "engines/director/lingo/lingo-gr.y"
+#line 368 "engines/director/lingo/lingo-gr.y"
                                 { g_lingo->code1(LC::c_eval);
 				  g_lingo->codeString((yyvsp[-4].s)->c_str()); }
-#line 2563 "engines/director/lingo/lingo-gr.cpp"
+#line 2553 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 32:
-#line 377 "engines/director/lingo/lingo-gr.y"
+#line 371 "engines/director/lingo/lingo-gr.y"
                                 { g_lingo->code1(LC::c_le); }
-#line 2569 "engines/director/lingo/lingo-gr.cpp"
+#line 2559 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 33:
-#line 377 "engines/director/lingo/lingo-gr.y"
+#line 371 "engines/director/lingo/lingo-gr.y"
                                                                                                       {
 
 		int nextPos = g_lingo->_currentAssembly->size();
@@ -2590,32 +2580,32 @@ yyreduce:
 		(*g_lingo->_currentAssembly)[pos] = loop;		/* final count value */
 		(*g_lingo->_currentAssembly)[(yyvsp[-3].code)] = end;	/* end, if cond fails */
 		endRepeat(pos + 1, nextPos); }
-#line 2594 "engines/director/lingo/lingo-gr.cpp"
+#line 2584 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 34:
-#line 404 "engines/director/lingo/lingo-gr.y"
+#line 398 "engines/director/lingo/lingo-gr.y"
                                 { g_lingo->code1(LC::c_varpush);
 				  g_lingo->codeString((yyvsp[-2].s)->c_str());
 				  mVar((yyvsp[-2].s), globalCheck()); }
-#line 2602 "engines/director/lingo/lingo-gr.cpp"
+#line 2592 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 35:
-#line 408 "engines/director/lingo/lingo-gr.y"
+#line 402 "engines/director/lingo/lingo-gr.y"
                                 { g_lingo->code1(LC::c_eval);
 				  g_lingo->codeString((yyvsp[-4].s)->c_str()); }
-#line 2609 "engines/director/lingo/lingo-gr.cpp"
+#line 2599 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 36:
-#line 411 "engines/director/lingo/lingo-gr.y"
+#line 405 "engines/director/lingo/lingo-gr.y"
                                 { g_lingo->code1(LC::c_ge); }
-#line 2615 "engines/director/lingo/lingo-gr.cpp"
+#line 2605 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 37:
-#line 412 "engines/director/lingo/lingo-gr.y"
+#line 406 "engines/director/lingo/lingo-gr.y"
                                                                 {
 
 		int nextPos = g_lingo->_currentAssembly->size();
@@ -2636,32 +2626,32 @@ yyreduce:
 		(*g_lingo->_currentAssembly)[pos] = loop;		/* final count value */
 		(*g_lingo->_currentAssembly)[(yyvsp[-3].code)] = end;	/* end, if cond fails */
 		endRepeat(pos + 1, nextPos); }
-#line 2640 "engines/director/lingo/lingo-gr.cpp"
+#line 2630 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 38:
-#line 438 "engines/director/lingo/lingo-gr.y"
+#line 432 "engines/director/lingo/lingo-gr.y"
                                 { g_lingo->code1(LC::c_stackpeek);
 				  g_lingo->codeInt(0);
 				  Common::String count("count");
 				  g_lingo->codeFunc(&count, 1);
 				  g_lingo->code1(LC::c_intpush);	// start counter
 				  g_lingo->codeInt(1); }
-#line 2651 "engines/director/lingo/lingo-gr.cpp"
+#line 2641 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 39:
-#line 445 "engines/director/lingo/lingo-gr.y"
+#line 439 "engines/director/lingo/lingo-gr.y"
                                 { g_lingo->code1(LC::c_stackpeek);	// get counter
 				  g_lingo->codeInt(0);
 				  g_lingo->code1(LC::c_stackpeek);	// get array size
 				  g_lingo->codeInt(2);
 				  g_lingo->code1(LC::c_le); }
-#line 2661 "engines/director/lingo/lingo-gr.cpp"
+#line 2651 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 40:
-#line 451 "engines/director/lingo/lingo-gr.y"
+#line 445 "engines/director/lingo/lingo-gr.y"
                                 { g_lingo->code1(LC::c_stackpeek);	// get list
 				  g_lingo->codeInt(2);
 				  g_lingo->code1(LC::c_stackpeek);	// get counter
@@ -2672,11 +2662,11 @@ yyreduce:
 				  g_lingo->codeString((yyvsp[-6].s)->c_str());
 				  mVar((yyvsp[-6].s), globalCheck());
 				  g_lingo->code1(LC::c_assign); }
-#line 2676 "engines/director/lingo/lingo-gr.cpp"
+#line 2666 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 41:
-#line 461 "engines/director/lingo/lingo-gr.y"
+#line 455 "engines/director/lingo/lingo-gr.y"
                                                         {
 
 		int nextPos = g_lingo->_currentAssembly->size();
@@ -2696,11 +2686,11 @@ yyreduce:
 		(*g_lingo->_currentAssembly)[jump + 1] = loop;		/* final count value */
 		(*g_lingo->_currentAssembly)[(yyvsp[-4].code)] = end;		/* end, if cond fails */
 		endRepeat(end2, nextPos); }
-#line 2700 "engines/director/lingo/lingo-gr.cpp"
+#line 2690 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 42:
-#line 481 "engines/director/lingo/lingo-gr.y"
+#line 475 "engines/director/lingo/lingo-gr.y"
                         {
 		if (g_lingo->_repeatStack.size()) {
 			g_lingo->code2(LC::c_jump, 0);
@@ -2709,43 +2699,43 @@ yyreduce:
 		} else {
 			warning("# LINGO: next repeat not inside repeat block");
 		} }
-#line 2713 "engines/director/lingo/lingo-gr.cpp"
+#line 2703 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 43:
-#line 489 "engines/director/lingo/lingo-gr.y"
+#line 483 "engines/director/lingo/lingo-gr.y"
                               {
 		g_lingo->code1(LC::c_whencode);
 		g_lingo->codeString((yyvsp[-2].s)->c_str()); }
-#line 2721 "engines/director/lingo/lingo-gr.cpp"
+#line 2711 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 44:
-#line 492 "engines/director/lingo/lingo-gr.y"
+#line 486 "engines/director/lingo/lingo-gr.y"
                                                           { g_lingo->code1(LC::c_telldone); }
-#line 2727 "engines/director/lingo/lingo-gr.cpp"
+#line 2717 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 45:
-#line 493 "engines/director/lingo/lingo-gr.y"
+#line 487 "engines/director/lingo/lingo-gr.y"
                                                     { g_lingo->code1(LC::c_telldone); }
-#line 2733 "engines/director/lingo/lingo-gr.cpp"
+#line 2723 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 46:
-#line 495 "engines/director/lingo/lingo-gr.y"
+#line 489 "engines/director/lingo/lingo-gr.y"
                                 { startRepeat(); }
-#line 2739 "engines/director/lingo/lingo-gr.cpp"
+#line 2729 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 47:
-#line 497 "engines/director/lingo/lingo-gr.y"
+#line 491 "engines/director/lingo/lingo-gr.y"
                                 { g_lingo->code1(LC::c_tell); }
-#line 2745 "engines/director/lingo/lingo-gr.cpp"
+#line 2735 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 48:
-#line 499 "engines/director/lingo/lingo-gr.y"
+#line 493 "engines/director/lingo/lingo-gr.y"
                                                                                          {
 		inst else1 = 0, end3 = 0;
 		WRITE_UINT32(&else1, (yyvsp[-3].code) + 1 - (yyvsp[-6].code) + 1);
@@ -2753,11 +2743,11 @@ yyreduce:
 		(*g_lingo->_currentAssembly)[(yyvsp[-6].code)] = else1;		/* elsepart */
 		(*g_lingo->_currentAssembly)[(yyvsp[-3].code)] = end3;		/* end, if cond fails */
 		g_lingo->processIf((yyvsp[-3].code), (yyvsp[-1].code)); }
-#line 2757 "engines/director/lingo/lingo-gr.cpp"
+#line 2747 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 49:
-#line 506 "engines/director/lingo/lingo-gr.y"
+#line 500 "engines/director/lingo/lingo-gr.y"
                                                                                                           {
 		inst else1 = 0, end = 0;
 		WRITE_UINT32(&else1, (yyvsp[-5].code) + 1 - (yyvsp[-8].code) + 1);
@@ -2765,107 +2755,107 @@ yyreduce:
 		(*g_lingo->_currentAssembly)[(yyvsp[-8].code)] = else1;		/* elsepart */
 		(*g_lingo->_currentAssembly)[(yyvsp[-5].code)] = end;		/* end, if cond fails */
 		g_lingo->processIf((yyvsp[-5].code), (yyvsp[-1].code)); }
-#line 2769 "engines/director/lingo/lingo-gr.cpp"
+#line 2759 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 52:
-#line 517 "engines/director/lingo/lingo-gr.y"
+#line 511 "engines/director/lingo/lingo-gr.y"
                                                                 {
 		inst else1 = 0;
 		WRITE_UINT32(&else1, (yyvsp[0].code) + 1 - (yyvsp[-3].code) + 1);
 		(*g_lingo->_currentAssembly)[(yyvsp[-3].code)] = else1;	/* end, if cond fails */
 		g_lingo->codeLabel((yyvsp[0].code)); }
-#line 2779 "engines/director/lingo/lingo-gr.cpp"
+#line 2769 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 53:
-#line 523 "engines/director/lingo/lingo-gr.y"
+#line 517 "engines/director/lingo/lingo-gr.y"
                                 {
 		g_lingo->code2(LC::c_jumpifz, 0);
 		(yyval.code) = g_lingo->_currentAssembly->size() - 1; }
-#line 2787 "engines/director/lingo/lingo-gr.cpp"
+#line 2777 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 54:
-#line 527 "engines/director/lingo/lingo-gr.y"
+#line 521 "engines/director/lingo/lingo-gr.y"
                                 {
 		g_lingo->code2(LC::c_jump, 0);
 		(yyval.code) = g_lingo->_currentAssembly->size() - 1; }
-#line 2795 "engines/director/lingo/lingo-gr.cpp"
+#line 2785 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 55:
-#line 531 "engines/director/lingo/lingo-gr.y"
+#line 525 "engines/director/lingo/lingo-gr.y"
                                         {
 		g_lingo->code1(LC::c_assign);
 		(yyval.code) = g_lingo->_currentAssembly->size() - 1; }
-#line 2803 "engines/director/lingo/lingo-gr.cpp"
+#line 2793 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 56:
-#line 535 "engines/director/lingo/lingo-gr.y"
+#line 529 "engines/director/lingo/lingo-gr.y"
                                                 {
 		g_lingo->codeLabel(0); }
-#line 2810 "engines/director/lingo/lingo-gr.cpp"
+#line 2800 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 57:
-#line 538 "engines/director/lingo/lingo-gr.y"
+#line 532 "engines/director/lingo/lingo-gr.y"
                                 { (yyval.code) = g_lingo->_currentAssembly->size(); }
-#line 2816 "engines/director/lingo/lingo-gr.cpp"
+#line 2806 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 58:
-#line 540 "engines/director/lingo/lingo-gr.y"
+#line 534 "engines/director/lingo/lingo-gr.y"
                                                 { (yyval.code) = g_lingo->_currentAssembly->size(); }
-#line 2822 "engines/director/lingo/lingo-gr.cpp"
+#line 2812 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 61:
-#line 544 "engines/director/lingo/lingo-gr.y"
+#line 538 "engines/director/lingo/lingo-gr.y"
                         {
 		(yyval.code) = g_lingo->code1(LC::c_intpush);
 		g_lingo->codeInt((yyvsp[0].i)); }
-#line 2830 "engines/director/lingo/lingo-gr.cpp"
+#line 2820 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 62:
-#line 547 "engines/director/lingo/lingo-gr.y"
+#line 541 "engines/director/lingo/lingo-gr.y"
                         {
 		(yyval.code) = g_lingo->code1(LC::c_floatpush);
 		g_lingo->codeFloat((yyvsp[0].f)); }
-#line 2838 "engines/director/lingo/lingo-gr.cpp"
+#line 2828 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 63:
-#line 550 "engines/director/lingo/lingo-gr.y"
+#line 544 "engines/director/lingo/lingo-gr.y"
                         {											// D3
 		(yyval.code) = g_lingo->code1(LC::c_symbolpush);
 		g_lingo->codeString((yyvsp[0].s)->c_str());
 		delete (yyvsp[0].s); }
-#line 2847 "engines/director/lingo/lingo-gr.cpp"
+#line 2837 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 64:
-#line 554 "engines/director/lingo/lingo-gr.y"
+#line 548 "engines/director/lingo/lingo-gr.y"
                                 {
 		(yyval.code) = g_lingo->code1(LC::c_stringpush);
 		g_lingo->codeString((yyvsp[0].s)->c_str());
 		delete (yyvsp[0].s); }
-#line 2856 "engines/director/lingo/lingo-gr.cpp"
+#line 2846 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 65:
-#line 558 "engines/director/lingo/lingo-gr.y"
+#line 552 "engines/director/lingo/lingo-gr.y"
                         {
 		(yyval.code) = g_lingo->code1(LC::c_eval);
 		g_lingo->codeString((yyvsp[0].s)->c_str());
 		delete (yyvsp[0].s); }
-#line 2865 "engines/director/lingo/lingo-gr.cpp"
+#line 2855 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 66:
-#line 562 "engines/director/lingo/lingo-gr.y"
+#line 556 "engines/director/lingo/lingo-gr.y"
                         {
 		(yyval.code) = g_lingo->code1(LC::c_intpush);
 		g_lingo->codeInt(0); // Put dummy id
@@ -2874,28 +2864,28 @@ yyreduce:
 		WRITE_UINT32(&e, (yyvsp[0].e)[0]);
 		WRITE_UINT32(&f, (yyvsp[0].e)[1]);
 		g_lingo->code2(e, f); }
-#line 2878 "engines/director/lingo/lingo-gr.cpp"
+#line 2868 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 67:
-#line 570 "engines/director/lingo/lingo-gr.y"
+#line 564 "engines/director/lingo/lingo-gr.y"
                                      {
 		(yyval.code) = g_lingo->code1(LC::c_theentitypush);
 		inst e = 0, f = 0;
 		WRITE_UINT32(&e, (yyvsp[-1].e)[0]);
 		WRITE_UINT32(&f, (yyvsp[-1].e)[1]);
 		g_lingo->code2(e, f); }
-#line 2889 "engines/director/lingo/lingo-gr.cpp"
+#line 2879 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 68:
-#line 576 "engines/director/lingo/lingo-gr.y"
+#line 570 "engines/director/lingo/lingo-gr.y"
                                                 { (yyval.code) = (yyvsp[-1].code); }
-#line 2895 "engines/director/lingo/lingo-gr.cpp"
+#line 2885 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 70:
-#line 578 "engines/director/lingo/lingo-gr.y"
+#line 572 "engines/director/lingo/lingo-gr.y"
                                 {
 		// Director parser till D3 was forgiving for any hanging parentheses
 		if (g_lingo->_ignoreError) {
@@ -2906,280 +2896,280 @@ yyreduce:
 			yyerrok;
 		}
 	}
-#line 2910 "engines/director/lingo/lingo-gr.cpp"
+#line 2900 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 71:
-#line 589 "engines/director/lingo/lingo-gr.y"
+#line 583 "engines/director/lingo/lingo-gr.y"
                  { (yyval.code) = (yyvsp[0].code); }
-#line 2916 "engines/director/lingo/lingo-gr.cpp"
+#line 2906 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 73:
-#line 591 "engines/director/lingo/lingo-gr.y"
+#line 585 "engines/director/lingo/lingo-gr.y"
                                  {
 		g_lingo->codeFunc((yyvsp[-3].s), (yyvsp[-1].narg));
 		delete (yyvsp[-3].s); }
-#line 2924 "engines/director/lingo/lingo-gr.cpp"
+#line 2914 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 74:
-#line 594 "engines/director/lingo/lingo-gr.y"
+#line 588 "engines/director/lingo/lingo-gr.y"
                                 {
 		g_lingo->codeFunc((yyvsp[-1].s), (yyvsp[0].narg));
 		delete (yyvsp[-1].s); }
-#line 2932 "engines/director/lingo/lingo-gr.cpp"
+#line 2922 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 75:
-#line 597 "engines/director/lingo/lingo-gr.y"
+#line 591 "engines/director/lingo/lingo-gr.y"
                                       {
 			g_lingo->code1(LC::c_lazyeval);
 			g_lingo->codeString((yyvsp[-1].s)->c_str());
 			g_lingo->codeFunc((yyvsp[-3].s), 1);
 			delete (yyvsp[-3].s);
 			delete (yyvsp[-1].s); }
-#line 2943 "engines/director/lingo/lingo-gr.cpp"
+#line 2933 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 76:
-#line 603 "engines/director/lingo/lingo-gr.y"
+#line 597 "engines/director/lingo/lingo-gr.y"
                                       { g_lingo->code1(LC::c_lazyeval); g_lingo->codeString((yyvsp[-1].s)->c_str()); }
-#line 2949 "engines/director/lingo/lingo-gr.cpp"
+#line 2939 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 77:
-#line 604 "engines/director/lingo/lingo-gr.y"
+#line 598 "engines/director/lingo/lingo-gr.y"
                                                     {
 			g_lingo->codeFunc((yyvsp[-6].s), (yyvsp[-1].narg) + 1);
 			delete (yyvsp[-6].s);
 			delete (yyvsp[-4].s); }
-#line 2958 "engines/director/lingo/lingo-gr.cpp"
+#line 2948 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 78:
-#line 608 "engines/director/lingo/lingo-gr.y"
+#line 602 "engines/director/lingo/lingo-gr.y"
                                 {
 		(yyval.code) = g_lingo->codeFunc((yyvsp[-3].s), (yyvsp[-1].narg));
 		delete (yyvsp[-3].s); }
-#line 2966 "engines/director/lingo/lingo-gr.cpp"
+#line 2956 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 79:
-#line 611 "engines/director/lingo/lingo-gr.y"
+#line 605 "engines/director/lingo/lingo-gr.y"
                                         {
 		(yyval.code) = g_lingo->codeFunc((yyvsp[-2].s), 1);
 		delete (yyvsp[-2].s); }
-#line 2974 "engines/director/lingo/lingo-gr.cpp"
+#line 2964 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 80:
-#line 614 "engines/director/lingo/lingo-gr.y"
+#line 608 "engines/director/lingo/lingo-gr.y"
                         {
 		g_lingo->code1(LC::c_objectproppush);
 		g_lingo->codeString((yyvsp[0].objectprop).obj->c_str());
 		g_lingo->codeString((yyvsp[0].objectprop).prop->c_str());
 		delete (yyvsp[0].objectprop).obj;
 		delete (yyvsp[0].objectprop).prop; }
-#line 2985 "engines/director/lingo/lingo-gr.cpp"
+#line 2975 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 82:
-#line 621 "engines/director/lingo/lingo-gr.y"
+#line 615 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->code1(LC::c_add); }
-#line 2991 "engines/director/lingo/lingo-gr.cpp"
+#line 2981 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 83:
-#line 622 "engines/director/lingo/lingo-gr.y"
+#line 616 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->code1(LC::c_sub); }
-#line 2997 "engines/director/lingo/lingo-gr.cpp"
+#line 2987 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 84:
-#line 623 "engines/director/lingo/lingo-gr.y"
+#line 617 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->code1(LC::c_mul); }
-#line 3003 "engines/director/lingo/lingo-gr.cpp"
+#line 2993 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 85:
-#line 624 "engines/director/lingo/lingo-gr.y"
+#line 618 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->code1(LC::c_div); }
-#line 3009 "engines/director/lingo/lingo-gr.cpp"
+#line 2999 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 86:
-#line 625 "engines/director/lingo/lingo-gr.y"
+#line 619 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->code1(LC::c_mod); }
-#line 3015 "engines/director/lingo/lingo-gr.cpp"
+#line 3005 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 87:
-#line 626 "engines/director/lingo/lingo-gr.y"
+#line 620 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->code1(LC::c_gt); }
-#line 3021 "engines/director/lingo/lingo-gr.cpp"
+#line 3011 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 88:
-#line 627 "engines/director/lingo/lingo-gr.y"
+#line 621 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->code1(LC::c_lt); }
-#line 3027 "engines/director/lingo/lingo-gr.cpp"
+#line 3017 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 89:
-#line 628 "engines/director/lingo/lingo-gr.y"
+#line 622 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->code1(LC::c_eq); }
-#line 3033 "engines/director/lingo/lingo-gr.cpp"
+#line 3023 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 90:
-#line 629 "engines/director/lingo/lingo-gr.y"
+#line 623 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->code1(LC::c_neq); }
-#line 3039 "engines/director/lingo/lingo-gr.cpp"
+#line 3029 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 91:
-#line 630 "engines/director/lingo/lingo-gr.y"
+#line 624 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->code1(LC::c_ge); }
-#line 3045 "engines/director/lingo/lingo-gr.cpp"
+#line 3035 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 92:
-#line 631 "engines/director/lingo/lingo-gr.y"
+#line 625 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->code1(LC::c_le); }
-#line 3051 "engines/director/lingo/lingo-gr.cpp"
+#line 3041 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 93:
-#line 632 "engines/director/lingo/lingo-gr.y"
+#line 626 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->code1(LC::c_and); }
-#line 3057 "engines/director/lingo/lingo-gr.cpp"
+#line 3047 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 94:
-#line 633 "engines/director/lingo/lingo-gr.y"
+#line 627 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->code1(LC::c_or); }
-#line 3063 "engines/director/lingo/lingo-gr.cpp"
+#line 3053 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 95:
-#line 634 "engines/director/lingo/lingo-gr.y"
+#line 628 "engines/director/lingo/lingo-gr.y"
                                         { g_lingo->code1(LC::c_not); }
-#line 3069 "engines/director/lingo/lingo-gr.cpp"
+#line 3059 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 96:
-#line 635 "engines/director/lingo/lingo-gr.y"
+#line 629 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->code1(LC::c_ampersand); }
-#line 3075 "engines/director/lingo/lingo-gr.cpp"
+#line 3065 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 97:
-#line 636 "engines/director/lingo/lingo-gr.y"
+#line 630 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->code1(LC::c_concat); }
-#line 3081 "engines/director/lingo/lingo-gr.cpp"
+#line 3071 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 98:
-#line 637 "engines/director/lingo/lingo-gr.y"
+#line 631 "engines/director/lingo/lingo-gr.y"
                                         { g_lingo->code1(LC::c_contains); }
-#line 3087 "engines/director/lingo/lingo-gr.cpp"
+#line 3077 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 99:
-#line 638 "engines/director/lingo/lingo-gr.y"
+#line 632 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->code1(LC::c_starts); }
-#line 3093 "engines/director/lingo/lingo-gr.cpp"
+#line 3083 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 100:
-#line 639 "engines/director/lingo/lingo-gr.y"
+#line 633 "engines/director/lingo/lingo-gr.y"
                                         { (yyval.code) = (yyvsp[0].code); }
-#line 3099 "engines/director/lingo/lingo-gr.cpp"
+#line 3089 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 101:
-#line 640 "engines/director/lingo/lingo-gr.y"
+#line 634 "engines/director/lingo/lingo-gr.y"
                                         { (yyval.code) = (yyvsp[0].code); g_lingo->code1(LC::c_negate); }
-#line 3105 "engines/director/lingo/lingo-gr.cpp"
+#line 3095 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 102:
-#line 641 "engines/director/lingo/lingo-gr.y"
+#line 635 "engines/director/lingo/lingo-gr.y"
                                         { g_lingo->code1(LC::c_intersects); }
-#line 3111 "engines/director/lingo/lingo-gr.cpp"
+#line 3101 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 103:
-#line 642 "engines/director/lingo/lingo-gr.y"
+#line 636 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->code1(LC::c_within); }
-#line 3117 "engines/director/lingo/lingo-gr.cpp"
+#line 3107 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 104:
-#line 644 "engines/director/lingo/lingo-gr.y"
+#line 638 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->code1(LC::c_charOf); }
-#line 3123 "engines/director/lingo/lingo-gr.cpp"
+#line 3113 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 105:
-#line 645 "engines/director/lingo/lingo-gr.y"
+#line 639 "engines/director/lingo/lingo-gr.y"
                                         { g_lingo->code1(LC::c_charToOf); }
-#line 3129 "engines/director/lingo/lingo-gr.cpp"
+#line 3119 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 106:
-#line 646 "engines/director/lingo/lingo-gr.y"
+#line 640 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->code1(LC::c_itemOf); }
-#line 3135 "engines/director/lingo/lingo-gr.cpp"
+#line 3125 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 107:
-#line 647 "engines/director/lingo/lingo-gr.y"
+#line 641 "engines/director/lingo/lingo-gr.y"
                                         { g_lingo->code1(LC::c_itemToOf); }
-#line 3141 "engines/director/lingo/lingo-gr.cpp"
+#line 3131 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 108:
-#line 648 "engines/director/lingo/lingo-gr.y"
+#line 642 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->code1(LC::c_lineOf); }
-#line 3147 "engines/director/lingo/lingo-gr.cpp"
+#line 3137 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 109:
-#line 649 "engines/director/lingo/lingo-gr.y"
+#line 643 "engines/director/lingo/lingo-gr.y"
                                         { g_lingo->code1(LC::c_lineToOf); }
-#line 3153 "engines/director/lingo/lingo-gr.cpp"
+#line 3143 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 110:
-#line 650 "engines/director/lingo/lingo-gr.y"
+#line 644 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->code1(LC::c_wordOf); }
-#line 3159 "engines/director/lingo/lingo-gr.cpp"
+#line 3149 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 111:
-#line 651 "engines/director/lingo/lingo-gr.y"
+#line 645 "engines/director/lingo/lingo-gr.y"
                                         { g_lingo->code1(LC::c_wordToOf); }
-#line 3165 "engines/director/lingo/lingo-gr.cpp"
+#line 3155 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 112:
-#line 653 "engines/director/lingo/lingo-gr.y"
+#line 647 "engines/director/lingo/lingo-gr.y"
                                         {
 		g_lingo->codeFunc((yyvsp[-1].s), 1);
 		delete (yyvsp[-1].s); }
-#line 3173 "engines/director/lingo/lingo-gr.cpp"
+#line 3163 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 114:
-#line 658 "engines/director/lingo/lingo-gr.y"
+#line 652 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->code1(LC::c_printtop); }
-#line 3179 "engines/director/lingo/lingo-gr.cpp"
+#line 3169 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 117:
-#line 661 "engines/director/lingo/lingo-gr.y"
+#line 655 "engines/director/lingo/lingo-gr.y"
                                                 {
 		if (g_lingo->_repeatStack.size()) {
 			g_lingo->code2(LC::c_jump, 0);
@@ -3188,260 +3178,254 @@ yyreduce:
 		} else {
 			warning("# LINGO: exit repeat not inside repeat block");
 		} }
-#line 3192 "engines/director/lingo/lingo-gr.cpp"
+#line 3182 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 118:
-#line 669 "engines/director/lingo/lingo-gr.y"
+#line 663 "engines/director/lingo/lingo-gr.y"
                                                         { g_lingo->code1(LC::c_procret); }
-#line 3198 "engines/director/lingo/lingo-gr.cpp"
+#line 3188 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 119:
-#line 670 "engines/director/lingo/lingo-gr.y"
+#line 664 "engines/director/lingo/lingo-gr.y"
                                                         { inArgs(); }
-#line 3204 "engines/director/lingo/lingo-gr.cpp"
+#line 3194 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 120:
-#line 670 "engines/director/lingo/lingo-gr.y"
+#line 664 "engines/director/lingo/lingo-gr.y"
                                                                                  { inLast(); }
-#line 3210 "engines/director/lingo/lingo-gr.cpp"
+#line 3200 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 121:
-#line 671 "engines/director/lingo/lingo-gr.y"
+#line 665 "engines/director/lingo/lingo-gr.y"
                                                         { inArgs(); }
-#line 3216 "engines/director/lingo/lingo-gr.cpp"
+#line 3206 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 122:
-#line 671 "engines/director/lingo/lingo-gr.y"
+#line 665 "engines/director/lingo/lingo-gr.y"
                                                                                    { inLast(); }
-#line 3222 "engines/director/lingo/lingo-gr.cpp"
+#line 3212 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 123:
-#line 672 "engines/director/lingo/lingo-gr.y"
+#line 666 "engines/director/lingo/lingo-gr.y"
                                                         { inArgs(); }
-#line 3228 "engines/director/lingo/lingo-gr.cpp"
+#line 3218 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 124:
-#line 672 "engines/director/lingo/lingo-gr.y"
+#line 666 "engines/director/lingo/lingo-gr.y"
                                                                                    { inLast(); }
-#line 3234 "engines/director/lingo/lingo-gr.cpp"
+#line 3224 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 125:
-#line 673 "engines/director/lingo/lingo-gr.y"
+#line 667 "engines/director/lingo/lingo-gr.y"
                                         {
 		g_lingo->codeFunc((yyvsp[-3].s), (yyvsp[-1].narg));
 		delete (yyvsp[-3].s); }
-#line 3242 "engines/director/lingo/lingo-gr.cpp"
+#line 3232 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 126:
-#line 676 "engines/director/lingo/lingo-gr.y"
+#line 670 "engines/director/lingo/lingo-gr.y"
                                                 {
 		g_lingo->codeFunc((yyvsp[-1].s), (yyvsp[0].narg));
 		delete (yyvsp[-1].s); }
-#line 3250 "engines/director/lingo/lingo-gr.cpp"
+#line 3240 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 127:
-#line 679 "engines/director/lingo/lingo-gr.y"
+#line 673 "engines/director/lingo/lingo-gr.y"
                                         { g_lingo->code1(LC::c_open); }
-#line 3256 "engines/director/lingo/lingo-gr.cpp"
+#line 3246 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 128:
-#line 680 "engines/director/lingo/lingo-gr.y"
+#line 674 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->code2(LC::c_voidpush, LC::c_open); }
-#line 3262 "engines/director/lingo/lingo-gr.cpp"
+#line 3252 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 129:
-#line 682 "engines/director/lingo/lingo-gr.y"
+#line 676 "engines/director/lingo/lingo-gr.y"
                                                 {
 		mVar((yyvsp[0].s), kVarGlobal);
 		delete (yyvsp[0].s); }
-#line 3270 "engines/director/lingo/lingo-gr.cpp"
+#line 3260 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 130:
-#line 685 "engines/director/lingo/lingo-gr.y"
+#line 679 "engines/director/lingo/lingo-gr.y"
                                                 {
 		mVar((yyvsp[0].s), kVarGlobal);
 		delete (yyvsp[0].s); }
-#line 3278 "engines/director/lingo/lingo-gr.cpp"
+#line 3268 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 131:
-#line 689 "engines/director/lingo/lingo-gr.y"
+#line 683 "engines/director/lingo/lingo-gr.y"
                                                 {
 		mVar((yyvsp[0].s), kVarProperty);
 		delete (yyvsp[0].s); }
-#line 3286 "engines/director/lingo/lingo-gr.cpp"
+#line 3276 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 132:
-#line 692 "engines/director/lingo/lingo-gr.y"
+#line 686 "engines/director/lingo/lingo-gr.y"
                                         {
 		mVar((yyvsp[0].s), kVarProperty);
 		delete (yyvsp[0].s); }
-#line 3294 "engines/director/lingo/lingo-gr.cpp"
+#line 3284 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 133:
-#line 696 "engines/director/lingo/lingo-gr.y"
+#line 690 "engines/director/lingo/lingo-gr.y"
                                                 {
 		mVar((yyvsp[0].s), kVarInstance);
 		delete (yyvsp[0].s); }
-#line 3302 "engines/director/lingo/lingo-gr.cpp"
+#line 3292 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 134:
-#line 699 "engines/director/lingo/lingo-gr.y"
+#line 693 "engines/director/lingo/lingo-gr.y"
                                         {
 		mVar((yyvsp[0].s), kVarInstance);
 		delete (yyvsp[0].s); }
-#line 3310 "engines/director/lingo/lingo-gr.cpp"
+#line 3300 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 135:
-#line 710 "engines/director/lingo/lingo-gr.y"
+#line 704 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->code1(LC::c_gotoloop); }
-#line 3316 "engines/director/lingo/lingo-gr.cpp"
+#line 3306 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 136:
-#line 711 "engines/director/lingo/lingo-gr.y"
+#line 705 "engines/director/lingo/lingo-gr.y"
                                                         { g_lingo->code1(LC::c_gotonext); }
-#line 3322 "engines/director/lingo/lingo-gr.cpp"
+#line 3312 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 137:
-#line 712 "engines/director/lingo/lingo-gr.y"
+#line 706 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->code1(LC::c_gotoprevious); }
-#line 3328 "engines/director/lingo/lingo-gr.cpp"
+#line 3318 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 138:
-#line 713 "engines/director/lingo/lingo-gr.y"
+#line 707 "engines/director/lingo/lingo-gr.y"
                                                         {
 		g_lingo->code1(LC::c_intpush);
 		g_lingo->codeInt(1);
 		g_lingo->code1(LC::c_goto); }
-#line 3337 "engines/director/lingo/lingo-gr.cpp"
+#line 3327 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 139:
-#line 717 "engines/director/lingo/lingo-gr.y"
+#line 711 "engines/director/lingo/lingo-gr.y"
                                         {
 		g_lingo->code1(LC::c_intpush);
 		g_lingo->codeInt(3);
 		g_lingo->code1(LC::c_goto); }
-#line 3346 "engines/director/lingo/lingo-gr.cpp"
+#line 3336 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 140:
-#line 721 "engines/director/lingo/lingo-gr.y"
+#line 715 "engines/director/lingo/lingo-gr.y"
                                                 {
 		g_lingo->code1(LC::c_intpush);
 		g_lingo->codeInt(2);
 		g_lingo->code1(LC::c_goto); }
-#line 3355 "engines/director/lingo/lingo-gr.cpp"
+#line 3345 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 143:
-#line 729 "engines/director/lingo/lingo-gr.y"
+#line 723 "engines/director/lingo/lingo-gr.y"
                                         { // "play #done" is also caught by this
 		g_lingo->code1(LC::c_intpush);
 		g_lingo->codeInt(1);
 		g_lingo->code1(LC::c_play); }
-#line 3364 "engines/director/lingo/lingo-gr.cpp"
+#line 3354 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 144:
-#line 733 "engines/director/lingo/lingo-gr.y"
+#line 727 "engines/director/lingo/lingo-gr.y"
                                         {
 		g_lingo->code1(LC::c_intpush);
 		g_lingo->codeInt(3);
 		g_lingo->code1(LC::c_play); }
-#line 3373 "engines/director/lingo/lingo-gr.cpp"
+#line 3363 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 145:
-#line 737 "engines/director/lingo/lingo-gr.y"
+#line 731 "engines/director/lingo/lingo-gr.y"
                                                 {
 		g_lingo->code1(LC::c_intpush);
 		g_lingo->codeInt(2);
 		g_lingo->code1(LC::c_play); }
-#line 3382 "engines/director/lingo/lingo-gr.cpp"
+#line 3372 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 146:
-#line 741 "engines/director/lingo/lingo-gr.y"
+#line 735 "engines/director/lingo/lingo-gr.y"
                      { g_lingo->codeSetImmediate(true); }
-#line 3388 "engines/director/lingo/lingo-gr.cpp"
+#line 3378 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 147:
-#line 741 "engines/director/lingo/lingo-gr.y"
+#line 735 "engines/director/lingo/lingo-gr.y"
                                                                   {
 		g_lingo->codeSetImmediate(false);
 		g_lingo->codeFunc((yyvsp[-2].s), (yyvsp[0].narg));
 		delete (yyvsp[-2].s); }
-#line 3397 "engines/director/lingo/lingo-gr.cpp"
+#line 3387 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 148:
-#line 771 "engines/director/lingo/lingo-gr.y"
+#line 765 "engines/director/lingo/lingo-gr.y"
              { startDef(); }
-#line 3403 "engines/director/lingo/lingo-gr.cpp"
+#line 3393 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 149:
-#line 771 "engines/director/lingo/lingo-gr.y"
-                                { g_lingo->_currentFactory = NULL; }
-#line 3409 "engines/director/lingo/lingo-gr.cpp"
-    break;
-
-  case 150:
-#line 772 "engines/director/lingo/lingo-gr.y"
+#line 766 "engines/director/lingo/lingo-gr.y"
                                                                         {
 		g_lingo->code1(LC::c_procret);
-		g_lingo->codeDefine(*(yyvsp[-6].s), (yyvsp[-4].code), (yyvsp[-3].narg));
+		g_lingo->codeDefine(*(yyvsp[-5].s), (yyvsp[-4].code), (yyvsp[-3].narg));
 		endDef();
-		delete (yyvsp[-6].s); }
-#line 3419 "engines/director/lingo/lingo-gr.cpp"
+		delete (yyvsp[-5].s); }
+#line 3403 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 151:
-#line 777 "engines/director/lingo/lingo-gr.y"
+  case 150:
+#line 771 "engines/director/lingo/lingo-gr.y"
                         { g_lingo->codeFactory(*(yyvsp[0].s)); delete (yyvsp[0].s); }
-#line 3425 "engines/director/lingo/lingo-gr.cpp"
+#line 3409 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 152:
-#line 778 "engines/director/lingo/lingo-gr.y"
+  case 151:
+#line 772 "engines/director/lingo/lingo-gr.y"
                   { startDef(); (*g_lingo->_methodVars)["me"] = kVarArgument; }
-#line 3431 "engines/director/lingo/lingo-gr.cpp"
+#line 3415 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 153:
-#line 779 "engines/director/lingo/lingo-gr.y"
+  case 152:
+#line 773 "engines/director/lingo/lingo-gr.y"
                                                                         {
 		g_lingo->code1(LC::c_procret);
-		g_lingo->codeDefine(*(yyvsp[-6].s), (yyvsp[-4].code), (yyvsp[-3].narg) + 1, g_lingo->_currentFactory);
+		g_lingo->codeDefine(*(yyvsp[-6].s), (yyvsp[-4].code), (yyvsp[-3].narg) + 1);
 		endDef();
 		delete (yyvsp[-6].s); }
-#line 3441 "engines/director/lingo/lingo-gr.cpp"
+#line 3425 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 154:
-#line 784 "engines/director/lingo/lingo-gr.y"
+  case 153:
+#line 778 "engines/director/lingo/lingo-gr.y"
                                                                    {	// D3
 		g_lingo->code1(LC::c_procret);
 		g_lingo->codeDefine(*(yyvsp[-7].s), (yyvsp[-6].code), (yyvsp[-5].narg));
@@ -3450,70 +3434,69 @@ yyreduce:
 		checkEnd((yyvsp[-1].s), (yyvsp[-7].s)->c_str(), false);
 		delete (yyvsp[-7].s);
 		delete (yyvsp[-1].s); }
-#line 3454 "engines/director/lingo/lingo-gr.cpp"
+#line 3438 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 155:
-#line 792 "engines/director/lingo/lingo-gr.y"
+  case 154:
+#line 786 "engines/director/lingo/lingo-gr.y"
                                                {	// D4. No 'end' clause
 		g_lingo->code1(LC::c_procret);
 		g_lingo->codeDefine(*(yyvsp[-5].s), (yyvsp[-4].code), (yyvsp[-3].narg));
 		endDef();
 		delete (yyvsp[-5].s); }
-#line 3464 "engines/director/lingo/lingo-gr.cpp"
+#line 3448 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 156:
-#line 798 "engines/director/lingo/lingo-gr.y"
+  case 155:
+#line 792 "engines/director/lingo/lingo-gr.y"
          { startDef(); }
-#line 3470 "engines/director/lingo/lingo-gr.cpp"
+#line 3454 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 157:
-#line 798 "engines/director/lingo/lingo-gr.y"
-                                {
-		(yyval.s) = (yyvsp[0].s); g_lingo->_currentFactory = NULL; }
-#line 3477 "engines/director/lingo/lingo-gr.cpp"
+  case 156:
+#line 792 "engines/director/lingo/lingo-gr.y"
+                                { (yyval.s) = (yyvsp[0].s); }
+#line 3460 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 158:
-#line 801 "engines/director/lingo/lingo-gr.y"
+  case 157:
+#line 794 "engines/director/lingo/lingo-gr.y"
                                         { (yyval.narg) = 0; }
-#line 3483 "engines/director/lingo/lingo-gr.cpp"
+#line 3466 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 159:
-#line 802 "engines/director/lingo/lingo-gr.y"
+  case 158:
+#line 795 "engines/director/lingo/lingo-gr.y"
                                                         { g_lingo->codeArg((yyvsp[0].s)); mVar((yyvsp[0].s), kVarArgument); (yyval.narg) = 1; delete (yyvsp[0].s); }
-#line 3489 "engines/director/lingo/lingo-gr.cpp"
+#line 3472 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 160:
-#line 803 "engines/director/lingo/lingo-gr.y"
+  case 159:
+#line 796 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->codeArg((yyvsp[0].s)); mVar((yyvsp[0].s), kVarArgument); (yyval.narg) = (yyvsp[-2].narg) + 1; delete (yyvsp[0].s); }
-#line 3495 "engines/director/lingo/lingo-gr.cpp"
+#line 3478 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 162:
-#line 806 "engines/director/lingo/lingo-gr.y"
+  case 161:
+#line 799 "engines/director/lingo/lingo-gr.y"
                                                         { delete (yyvsp[0].s); }
-#line 3501 "engines/director/lingo/lingo-gr.cpp"
+#line 3484 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 163:
-#line 807 "engines/director/lingo/lingo-gr.y"
+  case 162:
+#line 800 "engines/director/lingo/lingo-gr.y"
                                                 { delete (yyvsp[0].s); }
-#line 3507 "engines/director/lingo/lingo-gr.cpp"
+#line 3490 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 164:
-#line 809 "engines/director/lingo/lingo-gr.y"
+  case 163:
+#line 802 "engines/director/lingo/lingo-gr.y"
                                         { inDef(); }
-#line 3513 "engines/director/lingo/lingo-gr.cpp"
+#line 3496 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 165:
-#line 811 "engines/director/lingo/lingo-gr.y"
+  case 164:
+#line 804 "engines/director/lingo/lingo-gr.y"
                                         {
 		g_lingo->code1(LC::c_call);
 		g_lingo->codeString((yyvsp[-1].s)->c_str());
@@ -3521,122 +3504,122 @@ yyreduce:
 		WRITE_UINT32(&numpar, (yyvsp[0].narg));
 		g_lingo->code1(numpar);
 		delete (yyvsp[-1].s); }
-#line 3525 "engines/director/lingo/lingo-gr.cpp"
+#line 3508 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 166:
-#line 819 "engines/director/lingo/lingo-gr.y"
+  case 165:
+#line 812 "engines/director/lingo/lingo-gr.y"
                                         { (yyval.narg) = 0; }
-#line 3531 "engines/director/lingo/lingo-gr.cpp"
+#line 3514 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 167:
-#line 820 "engines/director/lingo/lingo-gr.y"
+  case 166:
+#line 813 "engines/director/lingo/lingo-gr.y"
                                                         { (yyval.narg) = 1; }
-#line 3537 "engines/director/lingo/lingo-gr.cpp"
+#line 3520 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 168:
-#line 821 "engines/director/lingo/lingo-gr.y"
+  case 167:
+#line 814 "engines/director/lingo/lingo-gr.y"
                                                 { (yyval.narg) = (yyvsp[-2].narg) + 1; }
-#line 3543 "engines/director/lingo/lingo-gr.cpp"
+#line 3526 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 169:
-#line 823 "engines/director/lingo/lingo-gr.y"
+  case 168:
+#line 816 "engines/director/lingo/lingo-gr.y"
                                         { (yyval.narg) = 1; }
-#line 3549 "engines/director/lingo/lingo-gr.cpp"
+#line 3532 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 170:
-#line 824 "engines/director/lingo/lingo-gr.y"
+  case 169:
+#line 817 "engines/director/lingo/lingo-gr.y"
                                         { (yyval.narg) = (yyvsp[-2].narg) + 1; }
-#line 3555 "engines/director/lingo/lingo-gr.cpp"
+#line 3538 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 171:
-#line 826 "engines/director/lingo/lingo-gr.y"
+  case 170:
+#line 819 "engines/director/lingo/lingo-gr.y"
                                         { (yyval.code) = (yyvsp[-1].code); }
-#line 3561 "engines/director/lingo/lingo-gr.cpp"
+#line 3544 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 172:
-#line 828 "engines/director/lingo/lingo-gr.y"
+  case 171:
+#line 821 "engines/director/lingo/lingo-gr.y"
                                         { (yyval.code) = g_lingo->code2(LC::c_arraypush, 0); }
-#line 3567 "engines/director/lingo/lingo-gr.cpp"
+#line 3550 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 173:
-#line 829 "engines/director/lingo/lingo-gr.y"
+  case 172:
+#line 822 "engines/director/lingo/lingo-gr.y"
                                                         { (yyval.code) = g_lingo->code2(LC::c_proparraypush, 0); }
-#line 3573 "engines/director/lingo/lingo-gr.cpp"
+#line 3556 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 174:
-#line 830 "engines/director/lingo/lingo-gr.y"
+  case 173:
+#line 823 "engines/director/lingo/lingo-gr.y"
                          { (yyval.code) = g_lingo->code1(LC::c_proparraypush); (yyval.code) = g_lingo->codeInt((yyvsp[0].narg)); }
-#line 3579 "engines/director/lingo/lingo-gr.cpp"
+#line 3562 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 175:
-#line 831 "engines/director/lingo/lingo-gr.y"
+  case 174:
+#line 824 "engines/director/lingo/lingo-gr.y"
                      { (yyval.code) = g_lingo->code1(LC::c_arraypush); (yyval.code) = g_lingo->codeInt((yyvsp[0].narg)); }
-#line 3585 "engines/director/lingo/lingo-gr.cpp"
+#line 3568 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 176:
-#line 833 "engines/director/lingo/lingo-gr.y"
+  case 175:
+#line 826 "engines/director/lingo/lingo-gr.y"
                                                 { (yyval.narg) = 1; }
-#line 3591 "engines/director/lingo/lingo-gr.cpp"
+#line 3574 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 177:
-#line 834 "engines/director/lingo/lingo-gr.y"
+  case 176:
+#line 827 "engines/director/lingo/lingo-gr.y"
                                         { (yyval.narg) = (yyvsp[-2].narg) + 1; }
-#line 3597 "engines/director/lingo/lingo-gr.cpp"
+#line 3580 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 178:
-#line 836 "engines/director/lingo/lingo-gr.y"
+  case 177:
+#line 829 "engines/director/lingo/lingo-gr.y"
                                                 { (yyval.narg) = 1; }
-#line 3603 "engines/director/lingo/lingo-gr.cpp"
+#line 3586 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 179:
-#line 837 "engines/director/lingo/lingo-gr.y"
+  case 178:
+#line 830 "engines/director/lingo/lingo-gr.y"
                                         { (yyval.narg) = (yyvsp[-2].narg) + 1; }
-#line 3609 "engines/director/lingo/lingo-gr.cpp"
+#line 3592 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 180:
-#line 839 "engines/director/lingo/lingo-gr.y"
+  case 179:
+#line 832 "engines/director/lingo/lingo-gr.y"
                           {
 		g_lingo->code1(LC::c_symbolpush);
 		g_lingo->codeString((yyvsp[-2].s)->c_str());
 		delete (yyvsp[-2].s); }
-#line 3618 "engines/director/lingo/lingo-gr.cpp"
+#line 3601 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 181:
-#line 843 "engines/director/lingo/lingo-gr.y"
+  case 180:
+#line 836 "engines/director/lingo/lingo-gr.y"
                                 {
 		g_lingo->code1(LC::c_stringpush);
 		g_lingo->codeString((yyvsp[-2].s)->c_str());
 		delete (yyvsp[-2].s); }
-#line 3627 "engines/director/lingo/lingo-gr.cpp"
+#line 3610 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 182:
-#line 847 "engines/director/lingo/lingo-gr.y"
+  case 181:
+#line 840 "engines/director/lingo/lingo-gr.y"
                         {
 		g_lingo->code1(LC::c_stringpush);
 		g_lingo->codeString((yyvsp[-2].s)->c_str());
 		delete (yyvsp[-2].s); }
-#line 3636 "engines/director/lingo/lingo-gr.cpp"
+#line 3619 "engines/director/lingo/lingo-gr.cpp"
     break;
 
 
-#line 3640 "engines/director/lingo/lingo-gr.cpp"
+#line 3623 "engines/director/lingo/lingo-gr.cpp"
 
       default: break;
     }
@@ -3835,7 +3818,7 @@ yyreturn:
   return yyresult;
 }
 
-#line 853 "engines/director/lingo/lingo-gr.y"
+#line 846 "engines/director/lingo/lingo-gr.y"
 
 
 int yyreport_syntax_error(const yypcontext_t *ctx) {
diff --git a/engines/director/lingo/lingo-gr.h b/engines/director/lingo/lingo-gr.h
index 0e8ad2b57f..4988e0b597 100644
--- a/engines/director/lingo/lingo-gr.h
+++ b/engines/director/lingo/lingo-gr.h
@@ -146,7 +146,7 @@ extern int yydebug;
 #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
 union YYSTYPE
 {
-#line 168 "engines/director/lingo/lingo-gr.y"
+#line 162 "engines/director/lingo/lingo-gr.y"
 
 	Common::String *s;
 	int i;
diff --git a/engines/director/lingo/lingo-gr.y b/engines/director/lingo/lingo-gr.y
index e4e9dc4445..14a5c655e0 100644
--- a/engines/director/lingo/lingo-gr.y
+++ b/engines/director/lingo/lingo-gr.y
@@ -100,7 +100,7 @@ static void startDef() {
 			(*g_lingo->_methodVars)[i->_key] = i->_value;
 	}
 	if (g_lingo->_inFactory) {
-		for (DatumHash::iterator i = g_lingo->_currentFactory->properties.begin(); i != g_lingo->_currentFactory->properties.end(); ++i) {
+		for (DatumHash::iterator i = g_lingo->_assemblyContext->_properties.begin(); i != g_lingo->_assemblyContext->_properties.end(); ++i) {
 			(*g_lingo->_methodVars)[i->_key] = kVarInstance;
 		}
 	}
@@ -149,14 +149,8 @@ static VarType globalCheck() {
 static void mVar(Common::String *s, VarType type) {
 	if (!g_lingo->_methodVars->contains(*s)) {
 		(*g_lingo->_methodVars)[*s] = type;
-		if (type == kVarProperty) {
-			g_lingo->_assemblyContext->_propNames.push_back(*s);
-		} else if (type == kVarInstance) {
-			if (g_lingo->_inFactory) {
-				g_lingo->_currentFactory->properties[*s] = Datum();
-			} else {
-				warning("Instance var '%s' defined outside factory", s->c_str());
-			}
+		if (type == kVarProperty || type == kVarInstance) {
+			g_lingo->_assemblyContext->_properties[*s] = Datum();
 		} else if (type == kVarGlobal) {
 			g_lingo->varCreate(*s, true);
 		}
@@ -768,7 +762,7 @@ playfunc: tPLAY expr 			{ // "play #done" is also caught by this
 //
 // See also:
 //   on keyword
-defn: tMACRO { startDef(); } ID { g_lingo->_currentFactory = NULL; }
+defn: tMACRO { startDef(); } ID
 			lbl argdef '\n' argstore stmtlist 		{
 		g_lingo->code1(LC::c_procret);
 		g_lingo->codeDefine(*$ID, $lbl, $argdef);
@@ -778,7 +772,7 @@ defn: tMACRO { startDef(); } ID { g_lingo->_currentFactory = NULL; }
 	| tMETHOD { startDef(); (*g_lingo->_methodVars)["me"] = kVarArgument; }
 			lbl argdef '\n' argstore stmtlist 		{
 		g_lingo->code1(LC::c_procret);
-		g_lingo->codeDefine(*$tMETHOD, $lbl, $argdef + 1, g_lingo->_currentFactory);
+		g_lingo->codeDefine(*$tMETHOD, $lbl, $argdef + 1);
 		endDef();
 		delete $tMETHOD; }
 	| on lbl argdef '\n' argstore stmtlist ENDCLAUSE endargdef {	// D3
@@ -795,8 +789,7 @@ defn: tMACRO { startDef(); } ID { g_lingo->_currentFactory = NULL; }
 		endDef();
 		delete $on; }
 
-on:  tON { startDef(); } ID 	{
-		$$ = $ID; g_lingo->_currentFactory = NULL; }
+on:  tON { startDef(); } ID 	{ $$ = $ID; }
 
 argdef:  /* nothing */ 			{ $$ = 0; }
 	| ID						{ g_lingo->codeArg($ID); mVar($ID, kVarArgument); $$ = 1; delete $ID; }
diff --git a/engines/director/lingo/lingo-object.cpp b/engines/director/lingo/lingo-object.cpp
index a77363b5b9..2af923deb1 100644
--- a/engines/director/lingo/lingo-object.cpp
+++ b/engines/director/lingo/lingo-object.cpp
@@ -31,7 +31,7 @@
 
 namespace Director {
 
-static struct MethodProto {
+static struct PredefinedProto {
 	const char *name;
 	void (*func)(int);
 	int minArgs;	// -1 -- arglist
@@ -60,7 +60,7 @@ static struct MethodProto {
 };
 
 void Lingo::initMethods() {
-	for (MethodProto *mtd = predefinedMethods; mtd->name; mtd++) {
+	for (PredefinedProto *mtd = predefinedMethods; mtd->name; mtd++) {
 		if (mtd->version > _vm->getVersion())
 			continue;
 
@@ -110,183 +110,144 @@ void Lingo::openXLib(const Common::String &name, ObjectType type) {
 	}
 }
 
-Object::Object(const Common::String &objName, ObjectType objType, ScriptContext *objCtx) {
-	name = new Common::String(objName);
-	type = objType;
-	disposed = false;
-	inheritanceLevel = 1;
-	refCount = new int;
-	*refCount = 0;
-	ctx = objCtx;
-	if (ctx)
-		ctx->setTarget(this);
-
-	if (objType == kFactoryObj) {
-		objArray = new Common::HashMap<uint32, Datum>;
-	} else {
-		objArray = nullptr;
-	}
+// Initialization/disposal
+
+void LM::m_new(int nargs) {
+	// This is usually overridden by a user-defined mNew
+	g_lingo->printSTUBWithArglist("m_new", nargs);
+	g_lingo->push(g_lingo->_currentMe);
 }
 
-Object::Object(const Object &obj) {
-	name = new Common::String(*obj.name);
-	type = obj.type;
-	disposed = obj.disposed;
-	inheritanceLevel = obj.inheritanceLevel + 1;
-	properties = obj.properties;
-	refCount = new int;
-	*refCount = 0;
-	if (obj.ctx) {
-		ctx = new ScriptContext(*obj.ctx);
-		ctx->setTarget(this);
-	} else {
-		ctx = nullptr;
-	}
+void LM::m_dispose(int nargs) {
+	g_lingo->_currentMe.u.obj->dispose();
+}
 
-	if (obj.objArray) {
-		objArray = new Common::HashMap<uint32, Datum>(*obj.objArray);
-	} else {
-		objArray = nullptr;
-	}
+/* ScriptContext */
+
+ScriptContext::ScriptContext(Common::String name, LingoArchive *archive, ScriptType type, uint16 id)
+	: Object(name), _archive(archive), _scriptType(type), _id(id) {
+	_objType = kScriptObj;
 }
 
-Object::~Object() {
-	delete name;
-	delete objArray;
-	delete refCount;
-	delete ctx;
+ScriptContext::ScriptContext(const ScriptContext &sc) : Object(sc) {
+	_scriptType = sc._scriptType;
+	_functionNames = sc._functionNames;
+	for (SymbolHash::iterator it = sc._functionHandlers.begin(); it != sc._functionHandlers.end(); ++it) {
+		_functionHandlers[it->_key] = it->_value;
+		_functionHandlers[it->_key].ctx = this;
+	}
+	for (Common::HashMap<uint32, Symbol>::iterator it = sc._eventHandlers.begin(); it != sc._eventHandlers.end(); ++it) {
+		_eventHandlers[it->_key] = it->_value;
+		_eventHandlers[it->_key].ctx = this;
+	}
+	_constants = sc._constants;
+	_properties = sc._properties;
+
+	_archive = sc._archive;
+	_id = sc._id;
 }
 
-Object *Object::clone() {
-	return new Object(*this);
+ScriptContext::~ScriptContext() {}
+
+Common::String ScriptContext::asString() {
+	return Common::String::format("script: #%s %d %p", _name.c_str(), _inheritanceLevel, (void *)this);
 }
 
-Symbol Object::getMethod(const Common::String &methodName) {
-	if (disposed) {
-		error("Method '%s' called on disposed object <%s>", methodName.c_str(), Datum(this).asString(true).c_str());
-	}
+Symbol ScriptContext::getMethod(const Common::String &methodName) {
+	Symbol sym;
 
-	// instance method (factory, script object, and Xtra)
-	if ((type & (kFactoryObj | kScriptObj | kXtraObj)) && ctx->_functionHandlers.contains(methodName)) {
-		return ctx->_functionHandlers[methodName];
+	if (_functionHandlers.contains(methodName)) {
+		sym = _functionHandlers[methodName];
+		sym.target = this;
+		return sym;
 	}
 
-	if ((type & (kFactoryObj | kXObj)) && methodName.hasPrefixIgnoreCase("m")) {
-		// factory or XObject
-		Common::String shortName = methodName.substr(1);
-		if (type == kXObj && ctx->_functionHandlers.contains(shortName) && inheritanceLevel > 1) {
-			// instance method (XObject)
-			return ctx->_functionHandlers[shortName];
-		}
-		if (g_lingo->_methods.contains(shortName) && (type & g_lingo->_methods[shortName].targetType)) {
-			// predefined method
-			Symbol sym = g_lingo->_methods[shortName];
-			sym.target = this;
-			return sym;
-		}
-	} else {
-		// script object, Xtra, etc.
-		if (g_lingo->_methods.contains(methodName) && (type & g_lingo->_methods[methodName].targetType)) {
-			// predefined method
-			Symbol sym = g_lingo->_methods[methodName];
-			sym.target = this;
-			return sym;
-		}
-		if (properties.contains("ancestor") && properties["ancestor"].type == OBJECT
-				&& (properties["ancestor"].u.obj->type & (kScriptObj | kXtraObj))) {
+	sym = Object::getMethod(methodName);
+	if (sym.type != VOID)
+		return sym;
+
+	if (_objType == kScriptObj) {
+		if (_properties.contains("ancestor") && _properties["ancestor"].type == OBJECT
+				&& (_properties["ancestor"].u.obj->getObjType() & (kScriptObj | kXtraObj))) {
 			// ancestor method
-			debugC(3, kDebugLingoExec, "Calling method '%s' on ancestor: <%s>", methodName.c_str(), properties["ancestor"].asString(true).c_str());
-			return properties["ancestor"].u.obj->getMethod(methodName);
+			debugC(3, kDebugLingoExec, "Calling method '%s' on ancestor: <%s>", methodName.c_str(), _properties["ancestor"].asString(true).c_str());
+			return _properties["ancestor"].u.obj->getMethod(methodName);
 		}
 	}
 
-	return Symbol();
+	return sym;
 }
 
-// Property access
-
-bool Object::hasProp(const Common::String &propName) {
-	if (disposed) {
+bool ScriptContext::hasProp(const Common::String &propName) {
+	if (_disposed) {
 		error("Property '%s' accessed on disposed object <%s>", propName.c_str(), Datum(this).asString(true).c_str());
 	}
-	if (properties.contains(propName)) {
+	if (_properties.contains(propName)) {
 		return true;
 	}
-	if (type & (kScriptObj | kXtraObj)) {
-		if (properties.contains("ancestor") && properties["ancestor"].type == OBJECT
-				&& (properties["ancestor"].u.obj->type & (kScriptObj | kXtraObj))) {
-			return properties["ancestor"].u.obj->hasProp(propName);
+	if (_objType == kScriptObj) {
+		if (_properties.contains("ancestor") && _properties["ancestor"].type == OBJECT
+				&& (_properties["ancestor"].u.obj->getObjType() & (kScriptObj | kXtraObj))) {
+			return _properties["ancestor"].u.obj->hasProp(propName);
 		}
 	}
 	return false;
 }
 
-Datum Object::getProp(const Common::String &propName) {
-	if (disposed) {
+Datum ScriptContext::getProp(const Common::String &propName) {
+	if (_disposed) {
 		error("Property '%s' accessed on disposed object <%s>", propName.c_str(), Datum(this).asString(true).c_str());
 	}
-	if (properties.contains(propName)) {
-		return properties[propName];
+	if (_properties.contains(propName)) {
+		return _properties[propName];
 	}
-	if (type & (kScriptObj | kXtraObj)) {
-		if (properties.contains("ancestor") && properties["ancestor"].type == OBJECT
-				&& (properties["ancestor"].u.obj->type & (kScriptObj | kXtraObj))) {
-			debugC(3, kDebugLingoExec, "Getting prop '%s' from ancestor: <%s>", propName.c_str(), properties["ancestor"].asString(true).c_str());
-			return properties["ancestor"].u.obj->getProp(propName);
+	if (_objType == kScriptObj) {
+		if (_properties.contains("ancestor") && _properties["ancestor"].type == OBJECT
+				&& (_properties["ancestor"].u.obj->getObjType() & (kScriptObj | kXtraObj))) {
+			debugC(3, kDebugLingoExec, "Getting prop '%s' from ancestor: <%s>", propName.c_str(), _properties["ancestor"].asString(true).c_str());
+			return _properties["ancestor"].u.obj->getProp(propName);
 		}
 	}
-	return properties[propName]; // return new property
+	return _properties[propName]; // return new property
 }
 
-bool Object::setProp(const Common::String &propName, const Datum &value) {
-	if (disposed) {
+bool ScriptContext::setProp(const Common::String &propName, const Datum &value) {
+	if (_disposed) {
 		error("Property '%s' accessed on disposed object <%s>", propName.c_str(), Datum(this).asString(true).c_str());
 	}
-	if (properties.contains(propName)) {
-		properties[propName] = value;
+	if (_properties.contains(propName)) {
+		_properties[propName] = value;
 		return true;
 	}
-	if (type & (kScriptObj | kXtraObj)) {
-		if (properties.contains("ancestor") && properties["ancestor"].type == OBJECT
-				&& (properties["ancestor"].u.obj->type & (kScriptObj | kXtraObj))) {
-			debugC(3, kDebugLingoExec, "Getting prop '%s' from ancestor: <%s>", propName.c_str(), properties["ancestor"].asString(true).c_str());
-			return properties["ancestor"].u.obj->setProp(propName, value);
+	if (_objType == kScriptObj) {
+		if (_properties.contains("ancestor") && _properties["ancestor"].type == OBJECT
+				&& (_properties["ancestor"].u.obj->getObjType() & (kScriptObj | kXtraObj))) {
+			debugC(3, kDebugLingoExec, "Getting prop '%s' from ancestor: <%s>", propName.c_str(), _properties["ancestor"].asString(true).c_str());
+			return _properties["ancestor"].u.obj->setProp(propName, value);
 		}
 	}
 	return false;
 }
 
-// Initialization/disposal
-
-void LM::m_new(int nargs) {
-	// This is usually overridden by a user-defined mNew
-	g_lingo->printSTUBWithArglist("m_new", nargs);
-	g_lingo->push(g_lingo->_currentMe);
-}
-
-void LM::m_dispose(int nargs) {
-	g_lingo->_currentMe.u.obj->disposed = true;
-}
-
 // Object array
 
 void LM::m_get(int nargs) {
-	Object *me = g_lingo->_currentMe.u.obj;
+	ScriptContext *me = static_cast<ScriptContext *>(g_lingo->_currentMe.u.obj);
 	Datum indexD = g_lingo->pop();
 	uint index = MAX(0, indexD.asInt());
-	if (me->objArray->contains(index)) {
-		g_lingo->push((*me->objArray)[index]);
+	if (me->_objArray.contains(index)) {
+		g_lingo->push(me->_objArray[index]);
 	} else {
 		g_lingo->push(Datum(0));
 	}
 }
 
 void LM::m_put(int nargs) {
-	Object *me = g_lingo->_currentMe.u.obj;
+	ScriptContext *me = static_cast<ScriptContext *>(g_lingo->_currentMe.u.obj);
 	Datum value = g_lingo->pop();
 	Datum indexD = g_lingo->pop();
 	uint index = MAX(0, indexD.asInt());
-	(*me->objArray)[index] = value;
+	me->_objArray[index] = value;
 }
 
 // Other
@@ -294,7 +255,7 @@ void LM::m_put(int nargs) {
 void LM::m_perform(int nargs) {
 	// Lingo doesn't seem to bother cloning the object when
 	// mNew is called with mPerform
-	Object *me = g_lingo->_currentMe.u.obj;
+	AbstractObject *me = g_lingo->_currentMe.u.obj;
 	Datum methodName = g_lingo->_stack.remove_at(g_lingo->_stack.size() - nargs); // Take method name out of stack
 	nargs -= 1;
 	Symbol funcSym = me->getMethod(*methodName.u.s);
@@ -308,19 +269,15 @@ void LM::m_describe(int nargs) {
 }
 
 void LM::m_instanceRespondsTo(int nargs) {
-	Object *me = g_lingo->_currentMe.u.obj;
+	AbstractObject *me = g_lingo->_currentMe.u.obj;
 	Datum d = g_lingo->pop();
 	Common::String methodName = d.asString();
 
-	if (me->ctx->_functionHandlers.contains(methodName)) {
+	if (g_lingo->_methods.contains(methodName) && (me->getObjType() & g_lingo->_methods[methodName].type)) {
 		g_lingo->push(Datum(1));
-		return;
-	}
-	if (g_lingo->_methods.contains(methodName) && (me->type & g_lingo->_methods[methodName].type)) {
-		g_lingo->push(Datum(1));
-		return;
+	} else {
+		g_lingo->push(Datum(0));
 	}
-	g_lingo->push(Datum(0));
 }
 
 void LM::m_messageList(int nargs) {
@@ -329,24 +286,21 @@ void LM::m_messageList(int nargs) {
 }
 
 void LM::m_name(int nargs) {
-	Object *me = g_lingo->_currentMe.u.obj;
-	g_lingo->push(Datum(*me->name));
+	AbstractObject *me = g_lingo->_currentMe.u.obj;
+	g_lingo->push(me->getName());
 }
 
 void LM::m_respondsTo(int nargs) {
-	Object *me = g_lingo->_currentMe.u.obj;
+	AbstractObject *me = g_lingo->_currentMe.u.obj;
 	Datum d = g_lingo->pop();
 	Common::String methodName = d.asString();
 
-	if (me->ctx->_functionHandlers.contains(methodName) && me->inheritanceLevel > 1) {
-		g_lingo->push(Datum(1));
-		return;
-	}
-	if (g_lingo->_methods.contains(methodName) && (me->type & g_lingo->_methods[methodName].type)) {
+	// TODO: Check inheritance level
+	if (g_lingo->_methods.contains(methodName) && (me->getObjType() & g_lingo->_methods[methodName].type)) {
 		g_lingo->push(Datum(1));
-		return;
+	} else {
+		g_lingo->push(Datum(0));
 	}
-	g_lingo->push(Datum(0));
 }
 
 } // End of namespace Director
diff --git a/engines/director/lingo/lingo-object.h b/engines/director/lingo/lingo-object.h
index 49206f698c..6cb4bca131 100644
--- a/engines/director/lingo/lingo-object.h
+++ b/engines/director/lingo/lingo-object.h
@@ -23,30 +23,176 @@
 #ifndef DIRECTOR_LINGO_OBJECT_H
 #define DIRECTOR_LINGO_OBJECT_H
 
+#include "director/lingo/lingo-gr.h"
+
 namespace Director {
 
-struct Object {
-	Common::String *name;
-	ObjectType type;
-	bool disposed;
+struct MethodProto {
+	const char *name;
+	void (*func)(int);
+	int minArgs;	// -1 -- arglist
+	int maxArgs;
+	int version;
+};
+
+class AbstractObject {
+public:
+	virtual ~AbstractObject() {};
+
+	virtual Common::String getName() const = 0;
+	virtual ObjectType getObjType() const = 0;
+	virtual bool isDisposed() const = 0;
+	virtual int *getRefCount() const = 0;
+	virtual int getInheritanceLevel() const = 0;
+
+	virtual Common::String asString() = 0;
+	virtual AbstractObject *clone() = 0;
+	virtual void dispose() = 0;
+	virtual Symbol getMethod(const Common::String &methodName) = 0;
+	virtual bool hasProp(const Common::String &propName) = 0;
+	virtual Datum getProp(const Common::String &propName) = 0;
+	virtual bool setProp(const Common::String &propName, const Datum &value) = 0;
+};
+
+template <typename Derived>
+class Object : public AbstractObject {
+public:
+	int *_refCount;
+
+protected:
+	Object(Common::String objName) {
+		_name = objName;
+		_objType = kNoneObj;
+		_disposed = false;
+		_inheritanceLevel = 1;
+		_refCount = new int;
+		*_refCount = 0;
+	};
+
+	Object(const Object &obj) {
+		_name = obj._name;
+		_objType = obj._objType;
+		_disposed = obj._disposed;
+		_inheritanceLevel = obj._inheritanceLevel + 1;
+		_refCount = new int;
+		*_refCount = 0;
+	};
+
+public:
+	static void initMethods(MethodProto protos[]) {
+		_methods = new SymbolHash;
+		for (MethodProto *mtd = protos; mtd->name; mtd++) {
+			if (mtd->version > g_lingo->_vm->getVersion())
+				continue;
+
+			Symbol sym;
+			sym.name = new Common::String(mtd->name);
+			sym.type = FBLTIN;
+			sym.nargs = mtd->minArgs;
+			sym.maxArgs = mtd->maxArgs;
+			sym.u.bltin = mtd->func;
+			(*_methods)[mtd->name] = sym;
+		}
+	}
+
+	virtual ~Object() {
+		delete _refCount;
+	};
+
+	virtual Common::String getName() const { return _name; };
+	virtual ObjectType getObjType() const { return _objType; };
+	virtual bool isDisposed() const { return _disposed; };
+	virtual int *getRefCount() const { return _refCount; };
+	virtual int getInheritanceLevel() const { return _inheritanceLevel; };
+
+	virtual Common::String asString() {
+		return Common::String::format("object: #%s %d %p", _name.c_str(), _inheritanceLevel, (void *)this);
+	};
+
+	virtual AbstractObject *clone() {
+		return new Derived(static_cast<Derived const &>(*this));
+	};
+
+	virtual void dispose() {
+		_disposed = true;
+	};
+
+	virtual Symbol getMethod(const Common::String &methodName) {
+		if (_disposed) {
+			error("Method '%s' called on disposed object <%s>", methodName.c_str(), asString().c_str());
+		}
+
+		Common::String methodId;
+		if ((_objType & (kFactoryObj | kXObj)) && methodName.hasPrefixIgnoreCase("m")) {
+			methodId = methodName.substr(1);
+		} else {
+			methodId = methodName;
+		}
+
+
+		Symbol sym;
+		if (_methods && _methods->contains(methodId)) {
+			sym = (*_methods)[methodId];
+			sym.target = this;
+			return sym;
+		}
+		if (g_lingo->_methods.contains(methodId) && (g_lingo->_methods[methodId].targetType & _objType)) {
+			sym = g_lingo->_methods[methodId];
+			sym.target = this;
+			return sym;
+		}
+
+		return sym;
+	};
+
+	virtual bool hasProp(const Common::String &propName) {
+		return false;
+	};
+	virtual Datum getProp(const Common::String &propName) {
+		return Datum();
+	};
+	virtual bool setProp(const Common::String &propName, const Datum &value) {
+		return false;
+	};
+
+protected:
+	static SymbolHash *_methods;
+	Common::String _name;
+	ObjectType _objType;
+	bool _disposed;
+	int _inheritanceLevel; // 1 for original object
+};
+
+template<typename Derived>
+SymbolHash *Object<Derived>::_methods = nullptr;
+
+class ScriptContext : public Object<ScriptContext> {
+public:
+	LingoArchive *_archive;
+	ScriptType _scriptType;
+	uint16 _id;
+	Common::Array<Common::String> _functionNames; // used by cb_localcall
+	SymbolHash _functionHandlers;
+	Common::HashMap<uint32, Symbol> _eventHandlers;
+	Common::Array<Datum> _constants;
+	DatumHash _properties;
+	Common::HashMap<uint32, Datum> _objArray;
 
-	DatumHash properties;
-	int *refCount;
-	ScriptContext *ctx;
-	int inheritanceLevel; // 1 for original object
+public:
+	ScriptContext(Common::String name, LingoArchive *archive = nullptr, ScriptType type = kNoneScript, uint16 id = 0);
+	ScriptContext(const ScriptContext &sc);
+	virtual ~ScriptContext();
 
-	// used only for factories
-	Common::HashMap<uint32, Datum> *objArray;
+	bool isFactory() const { return _objType == kFactoryObj; };
+	void setFactory(bool flag) { _objType = flag ? kFactoryObj : kScriptObj; }
 
-	Object(const Common::String &objName, ObjectType objType, ScriptContext *objCtx = nullptr);
-	Object(const Object &obj);
-	virtual ~Object();
+	virtual Common::String asString();
+	virtual Symbol getMethod(const Common::String &methodName);
+	virtual bool hasProp(const Common::String &propName);
+	virtual Datum getProp(const Common::String &propName);
+	virtual bool setProp(const Common::String &propName, const Datum &value);
 
-	virtual Object *clone();
-	Symbol getMethod(const Common::String &methodName);
-	bool hasProp(const Common::String &propName);
-	Datum getProp(const Common::String &propName);
-	bool setProp(const Common::String &propName, const Datum &value);
+	Symbol define(Common::String &name, int nargs, ScriptData *code, Common::Array<Common::String> *argNames, Common::Array<Common::String> *varNames);
 };
 
 namespace LM {
diff --git a/engines/director/lingo/lingo.cpp b/engines/director/lingo/lingo.cpp
index 3d5daeacb2..db1b5d74d8 100644
--- a/engines/director/lingo/lingo.cpp
+++ b/engines/director/lingo/lingo.cpp
@@ -281,6 +281,7 @@ void LingoArchive::addCode(const char *code, ScriptType type, uint16 id, const c
 
 	ScriptContext *sc = g_lingo->compileLingo(code, this, type, id, contextName);
 	scriptContexts[type][id] = sc;
+	*sc->_refCount += 1;
 }
 
 ScriptContext *Lingo::compileAnonymous(const char *code) {
@@ -292,7 +293,7 @@ ScriptContext *Lingo::compileAnonymous(const char *code) {
 
 ScriptContext *Lingo::compileLingo(const char *code, LingoArchive *archive, ScriptType type, uint16 id, const Common::String &scriptName, bool anonymous) {
 	_assemblyArchive = archive;
-	ScriptContext *sc = _assemblyContext = new ScriptContext(scriptName, archive, type, id);
+	ScriptContext *mainContext = _assemblyContext = new ScriptContext(scriptName, archive, type, id);
 	_currentAssembly = new ScriptData;
 
 	_methodVars = new VarTypeHash;
@@ -318,12 +319,19 @@ ScriptContext *Lingo::compileLingo(const char *code, LingoArchive *archive, Scri
 		do {
 			Common::String chunk(begin, end);
 
-			if (chunk.hasPrefixIgnoreCase("factory") || chunk.hasPrefixIgnoreCase("method"))
+			if (chunk.hasPrefixIgnoreCase("factory")) {
 				_inFactory = true;
-			else if (chunk.hasPrefixIgnoreCase("macro") || chunk.hasPrefixIgnoreCase("on"))
+				_assemblyContext = new ScriptContext(scriptName, archive, type, id);
+			} else if (chunk.hasPrefixIgnoreCase("method")) {
+				_inFactory = true;
+				// remain in factory context
+			} else if (chunk.hasPrefixIgnoreCase("macro") || chunk.hasPrefixIgnoreCase("on")) {
 				_inFactory = false;
-			else
+				_assemblyContext = mainContext;
+			} else {
 				_inFactory = false;
+				_assemblyContext = mainContext;
+			}
 
 			debugC(1, kDebugCompile, "Code chunk:\n#####\n%s#####", chunk.c_str());
 
@@ -381,7 +389,7 @@ ScriptContext *Lingo::compileLingo(const char *code, LingoArchive *archive, Scri
 	currentFunc.type = HANDLER;
 	currentFunc.u.defn = _currentAssembly;
 	Common::String typeStr = Common::String(scriptType2str(type));
-	currentFunc.name = new Common::String("[" + typeStr + " " + _assemblyContext->_name + "]");
+	currentFunc.name = new Common::String("[" + typeStr + " " + _assemblyContext->getName() + "]");
 	currentFunc.ctx = _assemblyContext;
 	currentFunc.archive = archive;
 	currentFunc.anonymous = anonymous;
@@ -418,7 +426,7 @@ ScriptContext *Lingo::compileLingo(const char *code, LingoArchive *archive, Scri
 	_assemblyContext->_eventHandlers[kEventNone] = currentFunc;
 	_assemblyContext = nullptr;
 	_assemblyArchive = nullptr;
-	return sc;
+	return mainContext;
 }
 
 void Lingo::printStack(const char *s, uint pc) {
@@ -723,11 +731,11 @@ Datum::Datum(const Common::String &val) {
 	*refCount = 1;
 }
 
-Datum::Datum(Object *val) {
+Datum::Datum(AbstractObject *val) {
 	u.obj = val;
 	type = OBJECT;
 	lazy = false;
-	refCount = val->refCount;
+	refCount = val->getRefCount();
 	*refCount += 1;
 }
 
@@ -886,9 +894,9 @@ Common::String Datum::asString(bool printonly) {
 		break;
 	case OBJECT:
 		if (!printonly) {
-			s = Common::String::format("#%s", u.obj->name->c_str());
+			s = Common::String::format("#%s", u.obj->getName().c_str());
 		} else {
-			s = Common::String::format("object: #%s %d %p", u.obj->name->c_str(), u.obj->inheritanceLevel, (void *)u.obj);
+			s = u.obj->asString();
 		}
 		break;
 	case VOID:
@@ -1044,27 +1052,6 @@ int Datum::compareTo(Datum &d, bool ignoreCase) {
 	}
 }
 
-void ScriptContext::setTarget(Object *target) {
-	_target = target;
-	for (SymbolHash::iterator it = _functionHandlers.begin(); it != _functionHandlers.end(); ++it) {
-		it->_value.target = target;
-	}
-	for (Common::HashMap<uint32, Symbol>::iterator it = _eventHandlers.begin(); it != _eventHandlers.end(); ++it) {
-		it->_value.target = target;
-	}
-}
-
-Datum ScriptContext::getParentScript() {
-	if (_parentScript.type != OBJECT) {
-		_parentScript.type = OBJECT;
-		_parentScript.u.obj = new Object(_name, kScriptObj, new ScriptContext(*this));
-		for (Common::Array<Common::String>::iterator it = _propNames.begin(); it != _propNames.end(); ++it) {
-			_parentScript.u.obj->properties[*it] = Datum();
-		}
-	}
-	return _parentScript;
-}
-
 void Lingo::parseMenu(const char *code) {
 	warning("STUB: parseMenu");
 }
@@ -1156,9 +1143,10 @@ void Lingo::printAllVars() {
 	}
 	debugN("\n");
 
-	if (_currentMe.type == OBJECT) {
+	if (_currentMe.type == OBJECT && _currentMe.u.obj->getObjType() & (kFactoryObj | kScriptObj)) {
+		ScriptContext *script = static_cast<ScriptContext *>(_currentMe.u.obj);
 		debugN("  Instance/property vars: ");
-		for (DatumHash::iterator i = _currentMe.u.obj->properties.begin(); i != _currentMe.u.obj->properties.end(); ++i) {
+		for (DatumHash::iterator i = script->_properties.begin(); i != script->_properties.end(); ++i) {
 			debugN("%s, ", (*i)._key.c_str());
 		}
 		debugN("\n");
@@ -1279,7 +1267,7 @@ Datum Lingo::varFetch(Datum &var, bool global, DatumHash *localvars) {
 
 		// For kScriptObj handlers the target is an argument
 		// (and can be renamed from 'me)
-		if (_currentMe.type == OBJECT && _currentMe.u.obj->type != kScriptObj && name.equalsIgnoreCase("me")) {
+		if (_currentMe.type == OBJECT && _currentMe.u.obj->getObjType() != kScriptObj && name.equalsIgnoreCase("me")) {
 			result = _currentMe;
 			return result;
 		}
diff --git a/engines/director/lingo/lingo.h b/engines/director/lingo/lingo.h
index 3c1dbf9d50..196af0244d 100644
--- a/engines/director/lingo/lingo.h
+++ b/engines/director/lingo/lingo.h
@@ -42,7 +42,7 @@ struct TheEntityField;
 struct LingoArchive;
 struct LingoV4Bytecode;
 struct LingoV4TheEntity;
-struct Object;
+class AbstractObject;
 class ScriptContext;
 class DirectorEngine;
 class Frame;
@@ -97,7 +97,7 @@ struct Symbol {	/* symbol table entry */
 	Common::Array<Common::String> *varNames;
 	ScriptContext *ctx;		/* optional script context to execute with */
 	LingoArchive *archive; 	/* optional archive to execute with */
-	Object *target;			/* optional method target */
+	AbstractObject *target;			/* optional method target */
 	bool anonymous;
 
 	Symbol();
@@ -117,7 +117,7 @@ struct Datum {	/* interpreter stack type */
 		Common::String *s;	/* STRING, VAR, OBJECT */
 		DatumArray *farr;	/* ARRAY, POINT, RECT */
 		PropertyArray *parr; /* PARRAY */
-		Object *obj;
+		AbstractObject *obj;
 	} u;
 
 	int *refCount;
@@ -128,7 +128,7 @@ struct Datum {	/* interpreter stack type */
 	Datum(int val);
 	Datum(double val);
 	Datum(const Common::String &val);
-	Datum(Object *val);
+	Datum(AbstractObject *val);
 	void reset();
 
 	~Datum() {
@@ -171,49 +171,6 @@ typedef Common::HashMap<Common::String, VarType, Common::IgnoreCase_Hash, Common
 typedef Common::HashMap<Common::String, TheEntity *, Common::IgnoreCase_Hash, Common::IgnoreCase_EqualTo> TheEntityHash;
 typedef Common::HashMap<Common::String, TheEntityField *, Common::IgnoreCase_Hash, Common::IgnoreCase_EqualTo> TheEntityFieldHash;
 
-class ScriptContext {
-public:
-	Common::String _name;
-	LingoArchive *_archive;
-	ScriptType _type;
-	uint16 _id;
-	Common::Array<Common::String> _functionNames; // used by cb_localcall
-	SymbolHash _functionHandlers;
-	Common::HashMap<uint32, Symbol> _eventHandlers;
-	Common::Array<Datum> _constants;
-	Common::Array<Common::String> _propNames;
-
-	ScriptContext(Common::String name, LingoArchive *archive = nullptr, ScriptType type = kNoneScript, uint16 id = 0)
-		: _name(name), _archive(archive), _type(type), _id(id), _target(nullptr) {}
-	ScriptContext(const ScriptContext &sc) {
-		_type = sc._type;
-		_name = sc._name;
-		_functionNames = sc._functionNames;
-		for (SymbolHash::iterator it = sc._functionHandlers.begin(); it != sc._functionHandlers.end(); ++it) {
-			_functionHandlers[it->_key] = it->_value;
-			_functionHandlers[it->_key].ctx = this;
-		}
-		for (Common::HashMap<uint32, Symbol>::iterator it = sc._eventHandlers.begin(); it != sc._eventHandlers.end(); ++it) {
-			_eventHandlers[it->_key] = it->_value;
-			_eventHandlers[it->_key].ctx = this;
-		}
-		_constants = sc._constants;
-		_propNames = sc._propNames;
-
-		_archive = sc._archive;
-		_id = sc._id;
-	}
-
-	Object *getTarget() const { return _target; }
-	void setTarget(Object *target);
-	Datum getParentScript();
-	Symbol define(Common::String &name, int nargs, ScriptData *code, Common::Array<Common::String> *argNames, Common::Array<Common::String> *varNames);
-
-private:
-	Datum _parentScript;
-	Object *_target;
-};
-
 struct CFrame {	/* proc/func call stack frame */
 	Symbol	sp;	/* symbol table entry */
 	int		retpc;	/* where to resume after return */
@@ -410,7 +367,7 @@ public:
 	int code3(inst code_1, inst code_2, inst code_3) { int o = code1(code_1); code1(code_2); code1(code_3); return o; }
 	int code4(inst code_1, inst code_2, inst code_3, inst code_4) { int o = code1(code_1); code1(code_2); code1(code_3); code1(code_4); return o; }
 	void codeArg(Common::String *s);
-	Symbol codeDefine(Common::String &s, int start, int nargs, Object *obj = nullptr, int end = -1, bool removeCode = true);
+	Symbol codeDefine(Common::String &s, int start, int nargs, int end = -1, bool removeCode = true);
 	void codeFactory(Common::String &s);
 	int codeFloat(double f);
 	int codeFunc(Common::String *s, int numpar);
@@ -434,7 +391,6 @@ public:
 	int _errorbytenumber;
 	bool _ignoreError;
 	bool _inFactory;
-	Object *_currentFactory;
 	Common::Array<RepeatBlock *> _repeatStack;
 
 	Common::Array<Common::String *> _argstack;
diff --git a/engines/director/lingo/xlibs/fileio.cpp b/engines/director/lingo/xlibs/fileio.cpp
index 2cbab90aee..774f92c841 100644
--- a/engines/director/lingo/xlibs/fileio.cpp
+++ b/engines/director/lingo/xlibs/fileio.cpp
@@ -28,43 +28,33 @@
 #include "director/director.h"
 #include "director/lingo/lingo.h"
 #include "director/lingo/lingo-object.h"
-#include "director/lingo/lingo-gr.h"
 #include "director/lingo/xlibs/fileio.h"
 
 namespace Director {
 
 static const char *xlibName = "FileIO";
 
-static struct MethodProto {
-	const char *name;
-	void (*func)(int);
-	int minArgs;	// -1 -- arglist
-	int maxArgs;
-	int type;
-	int version;
-} xlibMethods[] = {
-	{ "delete",					FileIO::m_delete,			 0, 0,	kXObj | kXtraObj,		2 },	// D2
-	{ "dispose",				FileIO::m_dispose,			 0, 0,	kXObj,					2 },	// D2
-	{ "fileName",				FileIO::m_fileName,			 0, 0,	kXObj | kXtraObj,		2 },	// D2
-	{ "getLength",				FileIO::m_getLength,		 0, 0,	kXObj | kXtraObj,		2 },	// D2
-	{ "getPosition",			FileIO::m_getPosition,		 0, 0,	kXObj | kXtraObj,		2 },	// D2
-	{ "new",					FileIO::m_new,				 2, 2,	kXObj | kXtraObj,		2 },	// D2
-	{ "readChar",				FileIO::m_readChar,			 0, 0,	kXObj | kXtraObj,		2 },	// D2
-	{ "readLine",				FileIO::m_readLine,			 0, 0,	kXObj | kXtraObj,		2 },	// D2
-	{ "readToken",				FileIO::m_readToken,		 2, 2,	kXObj | kXtraObj,		2 },	// D2
-	{ "readWord",				FileIO::m_readWord,			 0, 0,	kXObj | kXtraObj,		2 },	// D2
-	{ "setPosition",			FileIO::m_setPosition,		 1, 1,	kXObj | kXtraObj,		2 },	// D2
-	{ "writeChar",				FileIO::m_writeChar,		 1, 1,	kXObj | kXtraObj,		2 },	// D2
-	{ "writeString",			FileIO::m_writeString,		 1, 1,	kXObj | kXtraObj,		2 },	// D2
-	{ 0, 0, 0, 0, 0, 0 }
+static MethodProto xlibMethods[] = {
+	{ "delete",					FileIO::m_delete,			 0, 0,	2 },	// D2
+	{ "fileName",				FileIO::m_fileName,			 0, 0,	2 },	// D2
+	{ "getLength",				FileIO::m_getLength,		 0, 0,	2 },	// D2
+	{ "getPosition",			FileIO::m_getPosition,		 0, 0,	2 },	// D2
+	{ "new",					FileIO::m_new,				 2, 2,	2 },	// D2
+	{ "readChar",				FileIO::m_readChar,			 0, 0,	2 },	// D2
+	{ "readLine",				FileIO::m_readLine,			 0, 0,	2 },	// D2
+	{ "readToken",				FileIO::m_readToken,		 2, 2,	2 },	// D2
+	{ "readWord",				FileIO::m_readWord,			 0, 0,	2 },	// D2
+	{ "setPosition",			FileIO::m_setPosition,		 1, 1,	2 },	// D2
+	{ "writeChar",				FileIO::m_writeChar,		 1, 1,	2 },	// D2
+	{ "writeString",			FileIO::m_writeString,		 1, 1,	2 },	// D2
+	{ 0, 0, 0, 0, 0 }
 };
 
 void FileIO::initialize(int type) {
+	FileObject::initMethods(xlibMethods);
 	if (type & kXObj) {
 		if (!g_lingo->_globalvars.contains(xlibName)) {
-			ScriptContext *ctx = new ScriptContext(Common::String(xlibName));
-			FileObject *xobj = new FileObject(kXObj, ctx);
-			xobj->initMethods();
+			FileObject *xobj = new FileObject(kXObj);
 			g_lingo->_globalvars[xlibName] = xobj;
 		} else {
 			warning("FileIO XObject already initialized");
@@ -77,50 +67,54 @@ void FileIO::initialize(int type) {
 
 // Initialization/disposal
 
-void FileObject::initMethods() {
-	for (MethodProto *mtd = xlibMethods; mtd->name; mtd++) {
-		if (mtd->version > g_lingo->_vm->getVersion() || !(type & mtd->type))
-			continue;
-
-		Symbol sym;
-		sym.name = new Common::String(mtd->name);
-		sym.type = FBLTIN;
-		sym.nargs = mtd->minArgs;
-		sym.maxArgs = mtd->maxArgs;
-		sym.targetType = mtd->type;
-		sym.u.bltin = mtd->func;
-		ctx->_functionHandlers[mtd->name] = sym;
-	}
+FileObject::FileObject(ObjectType objType) : Object("FileIO") {
+	_objType = objType;
+	_filename = nullptr;
+	_inFile = nullptr;
+	_inStream = nullptr;
+	_outFile = nullptr;
+	_outStream = nullptr;
 }
 
-Object *FileObject::clone() {
-	return new FileObject(*this);
+FileObject::FileObject(const FileObject &obj) : Object(obj) {
+	_filename = nullptr;
+	_inFile = nullptr;
+	_inStream = nullptr;
+	_outFile = nullptr;
+	_outStream = nullptr;
 }
 
-void FileObject::dispose() {
-	disposed = true;
+FileObject::~FileObject() {
+	clear();
+}
 
-	if (filename) {
-		delete filename;
-		filename = nullptr;
+void FileObject::clear() {
+	if (_filename) {
+		delete _filename;
+		_filename = nullptr;
 	}
-	if (inFile) {
-		delete inFile;
-		if (inStream != inFile)
-			delete inStream;
-		inFile = nullptr;
-		inStream = nullptr;
+	if (_inFile) {
+		delete _inFile;
+		if (_inStream != _inFile)
+			delete _inStream;
+		_inFile = nullptr;
+		_inStream = nullptr;
 	}
-	if (outFile) {
-		outFile->write(outStream->getData(), outStream->size());
-		outFile->finalize();
-		delete outFile;
-		delete outStream;
-		outFile = nullptr;
-		outStream = nullptr;
+	if (_outFile) {
+		_outFile->write(_outStream->getData(), _outStream->size());
+		_outFile->finalize();
+		delete _outFile;
+		delete _outStream;
+		_outFile = nullptr;
+		_outStream = nullptr;
 	}
 }
 
+void FileObject::dispose() {
+	_disposed = true;
+	clear();
+}
+
 void FileIO::saveFileError() {
 	Common::SaveFileManager *saves = g_system->getSavefileManager();
 	if (saves->getError().getCode()) {
@@ -154,39 +148,39 @@ void FileIO::m_new(int nargs) {
 	}
 
 	if (option.equalsIgnoreCase("read")) {
-		me->inFile = saves->openForLoading(filename);
-		me->inStream = me->inFile;
-		if (!me->inFile) {
+		me->_inFile = saves->openForLoading(filename);
+		me->_inStream = me->_inFile;
+		if (!me->_inFile) {
 			saveFileError();
 			delete me;
 			return;
 		}
 	} else if (option.equalsIgnoreCase("write")) {
 		// OutSaveFile is not seekable so create a separate seekable stream
-		// which will be written to the outfile upon disposal
-		me->outFile = saves->openForSaving(filename, false);
-		me->outStream = new Common::MemoryWriteStreamDynamic(DisposeAfterUse::YES);
-		if (!me->outFile) {
+		// which will be written to the _outFile upon disposal
+		me->_outFile = saves->openForSaving(filename, false);
+		me->_outStream = new Common::MemoryWriteStreamDynamic(DisposeAfterUse::YES);
+		if (!me->_outFile) {
 			saveFileError();
 			delete me;
 			return;
 		}
 	} else if (option.equalsIgnoreCase("append")) {
-		Common::InSaveFile *inFile = saves->openForLoading(filename);
-		if (!inFile) {
+		Common::InSaveFile *_inFile = saves->openForLoading(filename);
+		if (!_inFile) {
 			saveFileError();
 			delete me;
 			return;
 		}
-		me->outStream = new Common::MemoryWriteStreamDynamic(DisposeAfterUse::YES);
-		byte b = inFile->readByte();
-		while (!inFile->eos() && !inFile->err()) {
-			me->outStream->writeByte(b);
-			b = inFile->readByte();
+		me->_outStream = new Common::MemoryWriteStreamDynamic(DisposeAfterUse::YES);
+		byte b = _inFile->readByte();
+		while (!_inFile->eos() && !_inFile->err()) {
+			me->_outStream->writeByte(b);
+			b = _inFile->readByte();
 		}
-		delete inFile;
-		me->outFile = saves->openForSaving(filename, false);
-		if (!me->outFile) {
+		delete _inFile;
+		me->_outFile = saves->openForSaving(filename, false);
+		if (!me->_outFile) {
 			saveFileError();
 			delete me;
 			return;
@@ -195,28 +189,23 @@ void FileIO::m_new(int nargs) {
 		error("Unsupported FileIO option: '%s'", option.c_str());
 	}
 
-	me->filename = new Common::String(filename);
+	me->_filename = new Common::String(filename);
 
 	g_lingo->push(g_lingo->_currentMe);
 }
 
-void FileIO::m_dispose(int nargs) {
-	FileObject *me = static_cast<FileObject *>(g_lingo->_currentMe.u.obj);
-	me->dispose();
-}
-
 // Read
 
 void FileIO::m_readChar(int nargs) {
 	FileObject *me = static_cast<FileObject *>(g_lingo->_currentMe.u.obj);
 
-	if (!me->inStream || me->inStream->eos() || me->inStream->err()) {
+	if (!me->_inStream || me->_inStream->eos() || me->_inStream->err()) {
 		g_lingo->push(Datum(kErrorEOF));
 		return;
 	}
 
-	int ch = me->inStream->readByte();
-	if (me->inStream->eos() || me->inStream->err()) {
+	int ch = me->_inStream->readByte();
+	if (me->_inStream->eos() || me->_inStream->err()) {
 		ch = kErrorEOF;
 	}
 	g_lingo->push(Datum(ch));
@@ -255,7 +244,7 @@ void FileIO::m_readToken(int nargs) {
 	Common::String skipString = d1.asString();
 	Common::String breakString = d2.asString();
 
-	if (!me->inStream || me->inStream->eos() || me->inStream->err()) {
+	if (!me->_inStream || me->_inStream->eos() || me->_inStream->err()) {
 		g_lingo->push(Datum(""));
 		return;
 	}
@@ -263,8 +252,8 @@ void FileIO::m_readToken(int nargs) {
 	Common::String tok = "";
 	char ch;
 	do {
-		ch = me->inStream->readByte();
-		if (me->inStream->eos() || me->inStream->err()) {
+		ch = me->_inStream->readByte();
+		if (me->_inStream->eos() || me->_inStream->err()) {
 			g_lingo->push(Datum(tok));
 			return;
 		}
@@ -272,9 +261,9 @@ void FileIO::m_readToken(int nargs) {
 
 	while (!charInMatchString(ch, breakString)) {
 		tok += ch;
-		ch = me->inStream->readByte();
+		ch = me->_inStream->readByte();
 
-		if (me->inStream->eos() || me->inStream->err()) {
+		if (me->_inStream->eos() || me->_inStream->err()) {
 			g_lingo->push(Datum(tok));
 			return;
 		}
@@ -284,7 +273,7 @@ void FileIO::m_readToken(int nargs) {
 	if (skipString.size() == 0) {
 		tok += ch;
 	} else {
-		me->inStream->seek(-1, SEEK_CUR);
+		me->_inStream->seek(-1, SEEK_CUR);
 	}
 
 	g_lingo->push(Datum(tok));
@@ -296,12 +285,12 @@ void FileIO::m_writeChar(int nargs) {
 	FileObject *me = static_cast<FileObject *>(g_lingo->_currentMe.u.obj);
 	Datum d = g_lingo->pop();
 
-	if (!me->outStream) {
+	if (!me->_outStream) {
 		g_lingo->push(Datum(kErrorReadOnly));
 		return;
 	}
 
-	me->outStream->writeByte(d.asInt());
+	me->_outStream->writeByte(d.asInt());
 	g_lingo->push(Datum(kErrorNone));
 }
 
@@ -309,12 +298,12 @@ void FileIO::m_writeString(int nargs) {
 	FileObject *me = static_cast<FileObject *>(g_lingo->_currentMe.u.obj);
 	Datum d = g_lingo->pop();
 
-	if (!me->outStream) {
+	if (!me->_outStream) {
 		g_lingo->push(Datum(kErrorReadOnly));
 		return;
 	}
 
-	me->outStream->writeString(d.asString());
+	me->_outStream->writeString(d.asString());
 	g_lingo->push(Datum(kErrorNone));
 }
 
@@ -323,10 +312,10 @@ void FileIO::m_writeString(int nargs) {
 void FileIO::m_getPosition(int nargs) {
 	FileObject *me = static_cast<FileObject *>(g_lingo->_currentMe.u.obj);
 
-	if (me->inStream) {
-		g_lingo->push(Datum((int)me->inStream->pos()));
-	} else if (me->outStream) {
-		g_lingo->push(Datum((int)me->outStream->pos()));
+	if (me->_inStream) {
+		g_lingo->push(Datum((int)me->_inStream->pos()));
+	} else if (me->_outStream) {
+		g_lingo->push(Datum((int)me->_outStream->pos()));
 	} else {
 		warning("FileIO: No file open");
 		g_lingo->push(Datum(kErrorFileNotOpen));
@@ -338,20 +327,20 @@ void FileIO::m_setPosition(int nargs) {
 	Datum d = g_lingo->pop();
 	int pos = d.asInt();
 
-	if (me->inStream) {
-		if (pos <= me->inStream->size()) {
-			me->inStream->seek(pos, SEEK_SET);
+	if (me->_inStream) {
+		if (pos <= me->_inStream->size()) {
+			me->_inStream->seek(pos, SEEK_SET);
 			g_lingo->push(Datum(kErrorNone));
 		} else {
-			me->inStream->seek(me->inStream->size(), SEEK_SET);
+			me->_inStream->seek(me->_inStream->size(), SEEK_SET);
 			g_lingo->push(Datum(kErrorInvalidPos));
 		}
-	} else if (me->outStream) {
-		if (pos <= me->outStream->size()) {
-			me->outStream->seek(pos, SEEK_SET);
+	} else if (me->_outStream) {
+		if (pos <= me->_outStream->size()) {
+			me->_outStream->seek(pos, SEEK_SET);
 			g_lingo->push(Datum(kErrorNone));
 		} else {
-			me->outStream->seek(me->outStream->size(), SEEK_SET);
+			me->_outStream->seek(me->_outStream->size(), SEEK_SET);
 			g_lingo->push(Datum(kErrorInvalidPos));
 		}
 	} else {
@@ -363,10 +352,10 @@ void FileIO::m_setPosition(int nargs) {
 void FileIO::m_getLength(int nargs) {
 	FileObject *me = static_cast<FileObject *>(g_lingo->_currentMe.u.obj);
 
-	if (me->inStream) {
-		g_lingo->push(Datum((int)me->inStream->size()));
-	} else if (me->outStream) {
-		g_lingo->push(Datum((int)me->outStream->size()));
+	if (me->_inStream) {
+		g_lingo->push(Datum((int)me->_inStream->size()));
+	} else if (me->_outStream) {
+		g_lingo->push(Datum((int)me->_outStream->size()));
 	} else {
 		warning("FileIO: No file open");
 		g_lingo->push(Datum(kErrorFileNotOpen));
@@ -376,8 +365,8 @@ void FileIO::m_getLength(int nargs) {
 void FileIO::m_fileName(int nargs) {
 	FileObject *me = static_cast<FileObject *>(g_lingo->_currentMe.u.obj);
 
-	if (me->filename) {
-		g_lingo->push(Datum(*me->filename));
+	if (me->_filename) {
+		g_lingo->push(Datum(*me->_filename));
 	} else {
 		warning("FileIO: No file open");
 		g_lingo->push(Datum(kErrorFileNotOpen));
@@ -387,8 +376,8 @@ void FileIO::m_fileName(int nargs) {
 void FileIO::m_delete(int nargs) {
 	FileObject *me = static_cast<FileObject *>(g_lingo->_currentMe.u.obj);
 
-	if (me->filename) {
-		Common::String filename = *me->filename;
+	if (me->_filename) {
+		Common::String filename = *me->_filename;
 		me->dispose();
 		if (g_system->getSavefileManager()->removeSavefile(filename)) {
 			g_lingo->push(Datum(kErrorNone));
diff --git a/engines/director/lingo/xlibs/fileio.h b/engines/director/lingo/xlibs/fileio.h
index 2788abd4c1..5be0af4fb2 100644
--- a/engines/director/lingo/xlibs/fileio.h
+++ b/engines/director/lingo/xlibs/fileio.h
@@ -50,36 +50,21 @@ enum FileIOError {
 	kErrorDirectoryNotFound = -120
 };
 
-struct FileObject : Object {
-	Common::String *filename;
-	Common::InSaveFile *inFile;
-	Common::SeekableReadStream *inStream;
-	Common::OutSaveFile *outFile;
-	Common::MemoryWriteStreamDynamic *outStream;
+class FileObject : public Object<FileObject> {
+public:
+	Common::String *_filename;
+	Common::InSaveFile *_inFile;
+	Common::SeekableReadStream *_inStream;
+	Common::OutSaveFile *_outFile;
+	Common::MemoryWriteStreamDynamic *_outStream;
 
-	FileObject(ObjectType objType, ScriptContext *objCtx) : Object("FileIO", objType, objCtx) {
-		filename = nullptr;
-		inFile = nullptr;
-		inStream = nullptr;
-		outFile = nullptr;
-		outStream = nullptr;
-	}
+public:
+	FileObject(ObjectType objType);
+	FileObject(const FileObject &obj);
+	virtual ~FileObject();
 
-	FileObject(const FileObject &obj) : Object(obj) {
-		filename = nullptr;
-		inFile = nullptr;
-		inStream = nullptr;
-		outFile = nullptr;
-		outStream = nullptr;
-	}
-
-	virtual ~FileObject() {
-		dispose();
-	}
-
-	void initMethods();
-	virtual Object *clone();
-	void dispose();
+	void clear();
+	virtual void dispose();
 };
 
 namespace FileIO {
diff --git a/engines/director/movie.cpp b/engines/director/movie.cpp
index 961da7bdbc..16f4fa0a16 100644
--- a/engines/director/movie.cpp
+++ b/engines/director/movie.cpp
@@ -30,6 +30,7 @@
 #include "director/score.h"
 #include "director/stage.h"
 #include "director/lingo/lingo.h"
+#include "director/lingo/lingo-object.h"
 
 namespace Director {
 


Commit: 3f0a33e5e8862aae5a5ef564511e52969d6a18bd
    https://github.com/scummvm/scummvm/commit/3f0a33e5e8862aae5a5ef564511e52969d6a18bd
Author: djsrv (dservilla at gmail.com)
Date: 2020-07-07T16:59:55-04:00

Commit Message:
DIRECTOR: LINGO: Allow method calls on any objtype

Changed paths:
    engines/director/lingo/lingo-code.cpp


diff --git a/engines/director/lingo/lingo-code.cpp b/engines/director/lingo/lingo-code.cpp
index 88791df635..15e655acb5 100644
--- a/engines/director/lingo/lingo-code.cpp
+++ b/engines/director/lingo/lingo-code.cpp
@@ -1330,7 +1330,7 @@ void LC::call(const Common::String &name, int nargs) {
 	// Script/Xtra method call
 	if (nargs > 0) {
 		Datum d = g_lingo->peek(nargs - 1);
-		if (d.type == OBJECT && (d.u.obj->getObjType() & (kScriptObj | kXtraObj))) {
+		if (d.type == OBJECT && !(d.u.obj->getObjType() & (kFactoryObj | kXObj))) {
 			debugC(3, kDebugLingoExec, "Method called on object: <%s>", d.asString(true).c_str());
 			AbstractObject *target = d.u.obj;
 			if (name.equalsIgnoreCase("birth") || name.equalsIgnoreCase("new")) {


Commit: 4c92044e36a255a2dc2be5aeee10102a21ff62ef
    https://github.com/scummvm/scummvm/commit/4c92044e36a255a2dc2be5aeee10102a21ff62ef
Author: djsrv (dservilla at gmail.com)
Date: 2020-07-07T16:59:55-04:00

Commit Message:
DIRECTOR: LINGO: Stub window/stage methods

Changed paths:
    engines/director/director.cpp
    engines/director/lingo/lingo-builtins.cpp
    engines/director/lingo/lingo-builtins.h
    engines/director/lingo/lingo-object.cpp
    engines/director/lingo/lingo-object.h
    engines/director/lingo/lingo-the.cpp
    engines/director/stage.cpp
    engines/director/stage.h
    engines/director/types.h


diff --git a/engines/director/director.cpp b/engines/director/director.cpp
index 3f870fd9a8..264ed8b2ec 100644
--- a/engines/director/director.cpp
+++ b/engines/director/director.cpp
@@ -134,6 +134,7 @@ Common::Error DirectorEngine::run() {
 	_wm->setEngine(this);
 
 	_currentStage = new Stage(_wm->getNextId(), false, false, false, _wm, this);
+	*_currentStage->_refCount += 1;
 
 	if (!debugChannelSet(-1, kDebugDesktop))
 		_currentStage->disableBorder();
diff --git a/engines/director/lingo/lingo-builtins.cpp b/engines/director/lingo/lingo-builtins.cpp
index e90620acb3..e455c37249 100644
--- a/engines/director/lingo/lingo-builtins.cpp
+++ b/engines/director/lingo/lingo-builtins.cpp
@@ -230,12 +230,6 @@ static struct BuiltinProto {
 	{ "mciwait",		LB::b_mciwait,		1, 1, false, 4, BLTIN },	//			D4 c
 	{ "sound",			LB::b_sound,		2, 3, false, 3, BLTIN },	//		D3 c
 	{ "soundBusy",		LB::b_soundBusy,	1, 1, true,  3, FBLTIN },	//		D3 f
-	// Window
-	{ "close",			LB::b_close,		1, 1, false, 4, BLTIN },	//			D4 c
-	{ "forget",			LB::b_forget,		1, 1, false, 4, BLTIN },	//			D4 c
-	{ "inflate",		LB::b_inflate,		3, 3, true,  4, FBLTIN },	//			D4 f
-	{ "moveToBack",		LB::b_moveToBack,	1, 1, false, 4, BLTIN },	//			D4 c
-	{ "moveToFront",	LB::b_moveToFront,	1, 1, false, 4, BLTIN },	//			D4 c
 	// Constants
 	{ "backspace",		LB::b_backspace,	0, 0, false, 2, FBLTIN },	// D2
 	{ "empty",			LB::b_empty,		0, 0, false, 2, FBLTIN },	// D2
@@ -1919,36 +1913,6 @@ void LB::b_updateStage(int nargs) {
 }
 
 
-///////////////////
-// Window
-///////////////////
-
-void LB::b_close(int nargs) {
-	g_lingo->printSTUBWithArglist("b_close", nargs);
-	g_lingo->dropStack(nargs);
-}
-
-void LB::b_forget(int nargs) {
-	g_lingo->printSTUBWithArglist("b_forget", nargs);
-	g_lingo->dropStack(nargs);
-}
-
-void LB::b_inflate(int nargs) {
-	g_lingo->printSTUBWithArglist("b_inflate", nargs);
-	g_lingo->dropStack(nargs);
-}
-
-void LB::b_moveToBack(int nargs) {
-	g_lingo->printSTUBWithArglist("b_moveToBack", nargs);
-	g_lingo->dropStack(nargs);
-}
-
-void LB::b_moveToFront(int nargs) {
-	g_lingo->printSTUBWithArglist("b_moveToFront", nargs);
-	g_lingo->dropStack(nargs);
-}
-
-
 ///////////////////
 // Point
 ///////////////////
diff --git a/engines/director/lingo/lingo-builtins.h b/engines/director/lingo/lingo-builtins.h
index cc7315cdb4..e63f632432 100644
--- a/engines/director/lingo/lingo-builtins.h
+++ b/engines/director/lingo/lingo-builtins.h
@@ -166,11 +166,6 @@ namespace LB {
 	void b_rect(int nargs);
 	void b_union(int nargs);
 
-	void b_close(int nargs);
-	void b_forget(int nargs);
-	void b_inflate(int nargs);
-	void b_moveToBack(int nargs);
-	void b_moveToFront(int nargs);
 	void b_window(int nargs);
 
 	void b_beep(int nargs);
diff --git a/engines/director/lingo/lingo-object.cpp b/engines/director/lingo/lingo-object.cpp
index 2af923deb1..26fef19b34 100644
--- a/engines/director/lingo/lingo-object.cpp
+++ b/engines/director/lingo/lingo-object.cpp
@@ -23,6 +23,7 @@
 #include "common/endian.h"
 
 #include "director/director.h"
+#include "director/stage.h"
 #include "director/lingo/lingo.h"
 #include "director/lingo/lingo-code.h"
 #include "director/lingo/lingo-object.h"
@@ -59,6 +60,16 @@ static struct PredefinedProto {
 	{ 0, 0, 0, 0, 0, 0 }
 };
 
+static MethodProto windowMethods[] = {
+	// window / stage
+	{ "close",					LM::m_close,				 0, 0,	4 },			// D4
+	{ "forget",					LM::m_forget,				 0, 0,	4 },			// D4
+	{ "open",					LM::m_open,					 0, 0,	4 },			// D4
+	{ "moveToBack",				LM::m_moveToBack,			 0, 0,	4 },			// D4
+	{ "moveToFront",			LM::m_moveToFront,			 0, 0,	4 },			// D4
+	{ 0, 0, 0, 0, 0 }
+};
+
 void Lingo::initMethods() {
 	for (PredefinedProto *mtd = predefinedMethods; mtd->name; mtd++) {
 		if (mtd->version > _vm->getVersion())
@@ -73,6 +84,7 @@ void Lingo::initMethods() {
 		sym.u.bltin = mtd->func;
 		_methods[mtd->name] = sym;
 	}
+	Stage::initMethods(windowMethods);
 }
 
 static struct XLibProto {
@@ -303,4 +315,26 @@ void LM::m_respondsTo(int nargs) {
 	}
 }
 
+// Window
+
+void LM::m_close(int nargs) {
+	g_lingo->printSTUBWithArglist("m_close", nargs);
+}
+
+void LM::m_forget(int nargs) {
+	g_lingo->printSTUBWithArglist("m_forget", nargs);
+}
+
+void LM::m_open(int nargs) {
+	g_lingo->printSTUBWithArglist("m_open", nargs);
+}
+
+void LM::m_moveToBack(int nargs) {
+	g_lingo->printSTUBWithArglist("m_moveToBack", nargs);
+}
+
+void LM::m_moveToFront(int nargs) {
+	g_lingo->printSTUBWithArglist("m_moveToFront", nargs);
+}
+
 } // End of namespace Director
diff --git a/engines/director/lingo/lingo-object.h b/engines/director/lingo/lingo-object.h
index 6cb4bca131..df54d20bde 100644
--- a/engines/director/lingo/lingo-object.h
+++ b/engines/director/lingo/lingo-object.h
@@ -23,6 +23,8 @@
 #ifndef DIRECTOR_LINGO_OBJECT_H
 #define DIRECTOR_LINGO_OBJECT_H
 
+// FIXME: Basic Lingo types like Datum should probably be in a separate, smaller header
+#include "director/lingo/lingo.h"
 #include "director/lingo/lingo-gr.h"
 
 namespace Director {
@@ -208,6 +210,13 @@ namespace LM {
 	void m_put(int nargs);
 	void m_respondsTo(int nargs);
 
+	// window
+	void m_close(int nargs);
+	void m_forget(int nargs);
+	void m_moveToBack(int nargs);
+	void m_moveToFront(int nargs);
+	void m_open(int nargs);
+
 } // End of namespace LM
 
 } // End of namespace Director
diff --git a/engines/director/lingo/lingo-the.cpp b/engines/director/lingo/lingo-the.cpp
index ba8442a208..e824f7c58e 100644
--- a/engines/director/lingo/lingo-the.cpp
+++ b/engines/director/lingo/lingo-the.cpp
@@ -547,6 +547,9 @@ Datum Lingo::getTheEntity(int entity, Datum &id, int field) {
 	case kTheSprite:
 		d = getTheSprite(id, field);
 		break;
+	case kTheStage:
+		d = _vm->getStage();
+		break;
 	case kTheStageBottom:
 		d.type = INT;
 		d.u.i = _vm->getCurrentMovie()->_movieRect.bottom;
diff --git a/engines/director/stage.cpp b/engines/director/stage.cpp
index 6c135af3f4..010f78d2c4 100644
--- a/engines/director/stage.cpp
+++ b/engines/director/stage.cpp
@@ -39,7 +39,7 @@
 namespace Director {
 
 Stage::Stage(int id, bool scrollable, bool resizable, bool editable, Graphics::MacWindowManager *wm, DirectorEngine *vm)
-	: MacWindow(id, scrollable, resizable, editable, wm) {
+	: MacWindow(id, scrollable, resizable, editable, wm), Object("Stage") {
 	_vm = vm;
 	_stageColor = 0;
 	_puppetTransition = nullptr;
@@ -49,6 +49,8 @@ Stage::Stage(int id, bool scrollable, bool resizable, bool editable, Graphics::M
 	_macBinary = nullptr;
 	_nextMovie.frameI = -1;
 	_newMovieStarted = true;
+
+	_objType = kWindowObj;
 }
 
 Stage::~Stage() {
diff --git a/engines/director/stage.h b/engines/director/stage.h
index b9a055783d..dfc209829a 100644
--- a/engines/director/stage.h
+++ b/engines/director/stage.h
@@ -24,6 +24,7 @@
 #define DIRECTOR_STAGE_H
 
 #include "graphics/macgui/macwindow.h"
+#include "director/lingo/lingo-object.h"
 
 namespace Common {
 class Error;
@@ -41,7 +42,7 @@ struct Channel;
 struct MacShape;
 struct TransParams;
 
-class Stage : public Graphics::MacWindow {
+class Stage : public Graphics::MacWindow, public Object<Stage> {
  public:
 	Stage(int id, bool scrollable, bool resizable, bool editable, Graphics::MacWindowManager *wm, DirectorEngine *vm);
 	~Stage();
diff --git a/engines/director/types.h b/engines/director/types.h
index d8e8dd2c15..e07863d04b 100644
--- a/engines/director/types.h
+++ b/engines/director/types.h
@@ -75,7 +75,8 @@ enum ObjectType {
 	kXObj = 1 << 1,
 	kScriptObj = 1 << 2,
 	kXtraObj = 1 << 3,
-	kAllObj = kFactoryObj | kXObj | kScriptObj | kXtraObj
+	kAllObj = kFactoryObj | kXObj | kScriptObj | kXtraObj,
+	kWindowObj = 1 << 4
 };
 
 enum ShapeType {




More information about the Scummvm-git-logs mailing list