commit 85dfe4b676a10313c8e0796bbda1cf9d7ea05cc0 Author: albertodemichelis Date: Tue Dec 22 03:14:21 2015 +0800 first commit diff --git a/COMPILE b/COMPILE new file mode 100644 index 0000000..e5e5c95 --- /dev/null +++ b/COMPILE @@ -0,0 +1,41 @@ +Squirrel 3.1 stable +-------------------------------------------------------- +What is in this distribution? + +squirrel + static library implementing the compiler and interpreter of the language + +sqstdlib + the standard utility libraries + +sq + stand alone interpreter + +doc + The manual + +etc + a minimalistic embedding sample + +samples + samples programs + + +HOW TO COMPILE +--------------------------------------------------------- +GCC USERS +......................................................... +There is a very simple makefile that compiles all libraries and exes +from the root of the project run 'make' + +for 32 bits systems + + $ make + +for 64 bits systems + + $ make sq64 + +VISUAL C++ USERS +......................................................... +Open squirrel.dsw from the root project directory and build(dho!) \ No newline at end of file diff --git a/COPYRIGHT b/COPYRIGHT new file mode 100644 index 0000000..0c67223 --- /dev/null +++ b/COPYRIGHT @@ -0,0 +1,21 @@ +Copyright (c) 2003-2015 Alberto Demichelis + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +----------------------------------------------------- +END OF COPYRIGHT diff --git a/HISTORY b/HISTORY new file mode 100644 index 0000000..39b2f19 --- /dev/null +++ b/HISTORY @@ -0,0 +1,509 @@ +***version 3.1 stable*** +-added slice range for tolower and toupper +-added startswith() and endswith() in string lib +-added SQ_EXCLUDE_DEFAULT_MEMFUNCTIONS to exclude default mem fuction from compilation +-added sq_getreleasehook +-added thread.wakeupthrow() +-added sq_pushthread +-fixed optimizer bug in compound arith oprators(+=,-= etc...) +-fixed sq_getrefvmcount() (thx Gerrit) +-fixed sq_getrefcount() when no references were added with sq_addref() (thx Gerrit) +-fixed weakref comparison in 32bit builds using doubles(thx Domingo) +-fixed compiler bug(thx Peter) +-fixed some error in the documentation(thx Alexander) +-fixed some error reporting in compiler(thx Alexander) +-fixed incorrect optional semicolon after "if block"(thx Alexander) +-fixed crash bug in compiler related to compound arith operators(+=,-= etc...) (thx Jeff1) + +***2015-01-10 *** +***version 3.1 RC 1*** +-added new header sqconfig.h for all optional type declarations(unicode, 64bits etc..) +-added sq_setsharedforeignptr sq_getsharedforeignptr +-added sq_setsharedreleasehook sq_getsharedreleasehook +-added escape() in sqstd string library +-added __LINE__ and __FILE__ (thx mingodad) +-widechar support on gcc builds +-now boolean can be used in constants +-reduced dependencies on C runtime library +-newthread and sq_newthread() no longer reinitialize the root table on friend VMs(thx Lucas Cardellini) +-exceptions in the _inherited metamethod are propagated(thx Lucas Cardellini) +-'in' operator performance improvement(thx unagipai and mingodad) +-fixes crash in compiler when trying to write 'base' +-fixed bug in switch statement when using locals as case values (thx mingodad) +-fixed bug in print()(thx Lucas Cardellini) + +***2013-08-30 *** +***version 3.1 beta 1*** +-added new scoping rule(root attached to closures) +-added closure.setroot() closure.getroot() +-added sq_setclosureroot() and sq_getclosureroot() +-added sq_setvmreleasehook() and sq_getvmreleasehook() +-added documentaion for sq_getbase() +-now string.tointeger() accepts an optional parameter 'base' +-now format accepts zeroes in the format string (thx mingodad) +-fixed bug in sqstd_createfile() (thx mingodad) +-minor buxfixes + +***2012-11-10 *** +***version 3.0.4 stable*** +-sq_deleteslot slot now pops the key in case of failure +-fixed bug when _get metamethod throws null +-fixed a bug in rstrip +-added some error handling +-minor bugfixes + +***2012-06-19 *** +***version 3.1.0 alpha 1*** +-changed in and instanceof operator precendence +-root object in closures +-added closure.setroot closure.getroot +-added sq_setclosureroot and sq_getclosureroot + +***version 3.0.3 stable*** +-improved error messages for _cmp(when a non integer value is returned) (thx Yexo) +-added class.newmember() built in method (thx Nam) +-added class.rawnewmember() built in method (thx Nam) +-added sq_rawnewmember() (thx Nam) +-added sq_getversion() +-added sq_typeof() +-added sq_getclosurename() +-added file.close() in stdlib +-documented closure.getinfos() built-in method +-fixed string iteration doesn't return negative numbers for characters > 127 +-fixed bug in tofloat() when converting a string with scientific notation without a decimal point (thx wr2) +-fixed potential infinite loop in array.sort() when the _cmp function is inconsistent (thx Yexo) +-fixed obscure bug in the compiler(thx yishin) +-fixed some minor bug + +***2011-11-28 *** +***version 3.0.2 stable*** +-added sq_gethash API +-now array.sort() is implemented with heapsort +-now floats in scientific notation also accept numbers with no '.' (eg. 1e+6 or 1e6) +-fixed some warning +-fixed some documentation +-fixed bug in GC + +***2011-09-08 *** +***version 3.0.1 stable*** +-added # as alternative symbol for "line comment"(mostly useful for shell scripts) +-added sq_throwobject() to throw an arbitrary object from the C API +-added alignement flag for userdata types, SQ_ALIGNMENT (thx Shigemasa) +-added rawset() and rawget() to class and instance default delegate +-changed bytecode format now ensures matching integer size and float size +-now inherited classes also inherit userdatasize +-added SQUIRREL_VERSION_NUMBER in squirrel.h and _versionnumber_ global symbol +-fixed sq_getmemberhandle +-fixed sq_getrefcount +-refactored some sqstdio code +-refactored some clone code +-refactored some stuff in the string lib +-added -s and -fno-exceptions in GCC makefile(better performance when using GCC) + +***2011-03-13 *** +***version 3.0 stable*** +-added sq_getcallee() +-sq_getfreevariable() also works for native closures +-minior optimizations +-removed several warning when compiling with GCC 4.x +-fixed some errors in the documentation +-fixed bug when using SQUSEDOUBLE and 32bits intengers +-fixed bug when invoking generators with closure.call() (thx huntercool) + +***2010-12-19 *** +***version 3.0 release candidate 1(RC 1)*** +-improved metamethods error handling +-added parameter 'isstatic' to _newmember metamethod(thx G.Meyer) +-added sq_getrefcount() to return number of refences from C++(thx G.Meyer) + +***2010-11-07 *** +***version 3.0 beta 3*** +-license changed to "MIT license" +-added sq_resurrectunreachable() and resurrectunreachable() +-added callee() built in function, returns the current running closure +-added thread.getstackinfos() +-added sq_objtouserpointer() +-added sq_newtableex() +-various refactoring and optimizations +-fixed several 64bits issues regarding integer to string conversions +-fixed some bugs when SQUSEDOUBLE is used in 32bits systems + +***2010-08-18 *** +***version 3.0 beta 2.1*** +-fixed bug in class constructor +-fixed bug in compound arith + +***2010-08-12 *** +***version 3.0 beta 2*** +-class methods can be added or replaced after the class as been instantiated +-JSON compliant table syntax, this is currently an experimental feature (thx atai) +-sq_getsize() now returns userdatasize for classes and instances +-now setroottable() and setconsttable() return the previous value of the respective table +-fixed bug in compound arith operators when used on a free variable (thx ellon) +-fixed some x64 minor bugs +-fixed minor bug in the compiler +-refactored some VM internals +-documented sq_getmemberhandle, sq_getbyhandle, sq_setbyhandle to set and get value from classes + +***2009-11-15 *** +***version 3.0 beta 1*** +-various refactoring and optimizations +-fixed bug in free variables (thx mokehehe) +-fixed bug in functions with default parameters (thx ara & Yexo) +-fixed bug in exception handling +-improved error propagation in _set and _get metamethods ( and 'throw null' for clean failure) +-added sq_getmemberhandle, sq_getbyhandle, sq_setbyhandle to set and get value from classes + +***2009-06-30 *** +***version 3.0 alpha 2*** +-added real free variables(thx Paul Ruizendaal) +-added refactored function call implementation and compiler(thx Paul Ruizendaal) +-added sq_getfunctioninfo +-added compile time flag SQUSEDOUBLE to use double precision floats +-added global slot _floatsize_ int the base lib to recognize single precision and double precision builds +-sq_wakeupvm can now resume the vm with an exception +-added sqstd_format +-now blobs can be cloned +-generators can now be instantiated by calling sq_call() or closure.call() +-fixed debughook bug +-fixed cooroutine error propagation + +***2008-07-23 *** +***version 3.0 alpha 1*** +-first branch from 2.x source tree +-added 'base' keyword +-removed 'delegate' keyword +-now compiled scripts are vararg functions +-added setdelegate() and getdelegate() table builtin methods +-added <=> 3 ways compare operator +-added lambda expression @(a,b) a + b +-added local function statement +-added array built-in map(),reduce(),apply(),filter() and find() +-generators hold only a weak reference of the enviroment object +-removed 'vargv' and 'vargc' keywords +-now var args are passed as an array called vargv(as a paramter) +-removed 'parent' keyword +-added class getbase() built in method +-instanceof doesn't throw an exception if the left expression is not a class +-lexical scoping for free variables(free variables are no longer in the second parameter list) +-sq_setprintfunc accept error func +-sq_geterrorfunc() +-added sq_arrayremove() and sq_arrayinsert() +-error() built in function(works like print but prints using the errorfunc) +-added native debug hook + +***2008-02-17 *** +***version 2.2 stable*** +-added _newslot metamethod in classes +-added enums added constants +-added sq_pushconsttable, sq_setconsttable +-added default param +-added octal literals(thx Dinosaur) +-fixed debug hook, 'calls' and 'returns' are properly notified in the same number. +-fixed a coroutine bug + +***2007-07-29 *** +***version 2.1.2 stable*** +-new behaviour for generators iteration using foreach +now when a generator is iterated by foreach the value returned by a 'return val' statement +will terminate the iteration but will not be returned as foreach iteration +-added sq_setclassudsize() +-added sq_clear() +-added table.clear(), array.clear() +-fixed sq_cmp() (thx jyuill) +-fixed minor bugs + +***2006-08-21 *** +***version 2.1.1 stable*** +-vm refactoring +-optimized internal function memory layout +-new global symbol _version_ (is the version string) +-code size optimization for float literals(on 32bits float builts) +-now the raw ref API(sq_addref etc...) is fully reentrant. +-fixed a bug in sq_getdelegate() now pushes null if the object doesn't have a delegate(thx MatzeB) +-improved C reference performances in NO_GARBAGE_COLLECTOR builds +-sq_getlocal() now enumerates also outer values. +-fixed regexp library for GCC users. + +***2006-03-19 *** +***version 2.1 stable*** +-added static class fields, new keyword static +-added 64bits architecture support +-added global slot _intsize_ int the base lib to recognize 32bits and 64bits builds +-added functions with fixed environment, closure.bindenv() built-in function +-all types except userdata and null implement the tostring() method +-string concatenation now invokes metamethod _tostring +-new metamethods for class objects _newmember and _inherited +-sq_call() sq_resume() sq_wakeupvm() have a new signature +-new C referencing implementation(scales more with the amount of references) +-refactored hash table +-new api functions sq_newslot(),sq_tobool(),sq_getbase(), sq_instanceof(), sq_bindenv() +-the api func sq_createslot was deprecated but still supported in form of C macro on top of sq_newslot +-sq_setreleasehook() now also works for classes +-stream.readstr() and stream.writestr() have been deprecated(this affects file and blob) +-fixed squirrel.h undeclared api calls +-fixed few minor bugs +-SQChar is now defined as wchar_t +-removed warning when building with -Wall -pedantic for GCC users +-added new std io function writeclosuretofile() +-added new std string functions strip(),rstrip(),lstrip() and split() +-regular expressions operators (+,*) now have more POSIX greedyness behaviour +-class constructors are now invoked as normal functions + +***2005-10-02 *** +***version 2.0.5 stable*** +-fixed some 64bits incompatibilities (thx sarge) +-fixed minor bug in the stdlib format() function (thx Rick) +-fixed a bug in dofile() that was preventing to compile empty files +-added new API sq_poptop() & sq_getfreevariable() +-some performance improvements + +***2005-08-14 *** +***version 2.0.4 stable*** +-weak references and related API calls +-added sq_objtobool() +-class instances memory policies improved(1 mem allocation for the whole instance) +-typetags are now declared as SQUserPointer instead of unsigned int +-first pass for 64bits compatibility +-fixed minor bug in the stdio stream +-fixed a bug in format() +-fixed bug in string.tointeger() and string.tofloat() + +***2005-06-24 *** +***version 2.0.3 stable*** +-dofile() and loadfile() in the iolib now can decode ASCII, UTF8 files UCS2 big-endian and little-endian +-sq_setparamscheck() : now typemesk can check for null +-added string escape sequence \xhhhh +-fixed some C++ standard incompatibilities + +***2005-05-15 *** +***version 2.0.2 stable*** +-performances improvements (expecially for GCC users) +-removed all dependencies from C++ exception handling +-various bugfixes + +***2005-04-12 *** +***version 2.0.1 stable*** +-various bugfixes +-sq_setparamscheck() now allows spaces in the typemask + +***2005-04-03 *** +***version 2.0 stable*** +-added API sq_gettypetag() +-added built-in function to the bool type(tointeger, tostring etc...) + +***2005-02-27 *** +***version 2.0 release candidate 1(RC 1)*** +-added API sq_reseterror() +-modified sq_release() +-now class instances can be cloned +-various bufixes + +***2005-01-26 *** +***version 2.0 beta 1*** +-added bool type +-class properties can be redefined in a derived class +-added ops *= /= and %= +-new syntax for class attributes declaration instead of ( and ) +-increased the max number of literals per function from 65535 to 16777215 +-now free variables have proper lexical scoping +-added API sq_createinstance(), sq_pushbool(), sq_getbool() +-added built-in function type() +-added built-in function obj.rawin(key) in table,class and instance +-sq_rawget() and sq_rawset() now work also on classes and instances +-the VM no longer uses C++ exception handling (more suitable for embedded devices) +-various bufixes + +***2004-12-21 *** +***version 2.0 alpha 2*** +-globals scoping changed, now if :: is omitted the VM automatically falls back on the root table +-various bufixes +-added class level attributes + +***2004-12-12 *** +***version 2.0 alpha 1*** +-codebase branch from version 1.x +-added classes +-added functions with variable number of parameters(vargc & vargv and the ...) +-0 and 0.0 are now considered 'false' by all conditional statements(if,while,for,?,do-while) +-added new api functions sq_newclass() sq_setinstanceup() sq_getinstanceup() sq_getattributes() sq_setattributes() +-modified api sq_settypetag() + +***2004-11-01 *** +***version 1.0 stable*** +-fixed some minor bug +-improved operator 'delete' performances +-added scientific notation for float numbers( eg. 2.e16 or 2.e-2) + +***2004-08-30 *** +***version 1.0 release candidate 2(RC 2)*** +-fixed bug in the vm(thx Pierre Renaux) +-fixed bug in the optimizer(thx Pierre Renaux) +-fixed some bug in the documentation(thx JD) +-added new api functions for raw object handling +-removed nested multiline comments +-reduced memory footprint in C references + +***2004-08-23 *** +***version 1.0 release candidate 1(RC 1)*** +-fixed division by zero +-the 'in' operator and obj.rawget() do not query the default delegate anymore +-added function sq_getprintfunc() +-added new standard library 'auxlib'(implements default error handlers) + +***2004-07-12 *** +***version 1.0 beta 4*** +-fixed a bug in the integer.tochar() built-in method +-fixed unary minus operator +-fixed bug in dofile() +-fixed inconsistency between != and == operators(on float/integer comparison) +-added javascript style unsigned right shift operator '>>>' +-added array(size) constructor built-in function +-array.resize(size,[fill]) built-in function accepts an optional 'fill' value +-improved debug API, added sq_getclosureinfo() and sq_setnativeclosurename() + +***2004-05-23 *** +***version 1.0 beta 3*** +-minor vm bug fixes +-string allocation is now faster +-tables and array memory usage is now less conservative(they shrink) +-added regular expression routines in the standard library +-The 'c' expression now accepts only 1 character(thx irbrian) +-multiline strings <[ ]> have been substituted with C# style verbatim strings (eg. @"string") +-added new keyword 'parent' for accessing the delegate of tables and unserdata +-The metamethod '_clone' has been renamed '_cloned' +-the _delslot metamethod's behaviour and prototype have been changed +-new default function in the integer and float object 'tochar()' +-the built-in function chcode2string has been removed +-the default method [table].getdelegate() has been removed +-new api sq_rawdeleteslot() +-new table built-in method rawdelete(key) +-the dynamic mudule loading has been removed from the standard distribution +-some optimizations in the VM + +***2004-04-21 *** +***version 1.0 beta 2*** +-minor compiler/parser bug fixes +-sq_newclosure has a different prototype, the "paramscheck" of paramter has been moved to the new function sq_setparamscheck() +-sq_setparamscheck allows to add automatic parameters type checking in native closures +-sq_compile() lost the lineinfo parameter +-new api sq_enabledebuginfo() globally sets compiler's debug info generation +-added consistency check on bytecode serialization +-fixed += operator, now works on strings like + +-added global slot in the base lib _charsize_ to recognize unicode builds from ascii builds runtime +-added registry table +-new api call sq_pushregistrytable() +-added type tag to the userdata type sq_settypetag() +-sq_getuserdata now queries the userdata typetag +-the built in function collect_garbage() as been renamed collectgarbage() for consistency reasons +-new standard libraries(sqlibs are now obsolete) + +***2004-02-20 *** +***version 1.0 beta 1*** +-fixed a bug in the compiler (thanks Martin Kofler) +-fixed bug in the switch case statement +-fixed the _unm metamethod +-fixed minor bugs in the API +-fixed automatic stack resizing +-first beta version + first pass code clean up in the VM and base lib + first pass code coverege test has been done on VM and built-in lib +-new VM creation API sq_open() sq_close() (sq_newvm and sq_releasevm are now obsolete) +-new api allows to specifiy a "print" function to output text(sq_printfunc) +-added some small optimizations +-new cooperative multi-threading capabilities in the base library(coroutines), VMs are now a built in type("thread") +-new built in functions have been added for manipulating the new "thread" type +-friend virtual machines share the same root table, error handler and debug hook by default +-new compile time options + +***2004-01-19 *** +***version 0.9 alpha*** +-fixed a garbage collection bug +-fixed some API bugs(thanks to Joshua Jensen) +-fixed tail calls (in the version 0.8 the tail call optimization was erroneously disabled) +-new function parameters semantic, now passing a wrong number of parameters generates an exception +-native closures have now a built in parameter number checking +-sq_rawget and sq_rawset now work also on arrays +-sq_getsize now woks also on userdata +-the userdata release hook prototype is changed(now passes the size of the userdata) +-the lexer reader function now returns an integer instead of a char that allows better error checking on the input(thx Joshua Jensen) +-faster compiler +-try/catch blocks do not cause any runtime memory allocation anymore + +***2003-12-06 *** +***version 0.8 alpha*** +-fixed a bug that was preventing to have callable userdata throught the metamethod _call +-fixed a garbage collection bug +-fixed == operator now can compare correctly different types +-new built in method getstackinfos(level) +-improved line informations precision for the debug hook +-new api call sq_compilebuffer() +-new built-in api function compilestring() +-new syntactic sugar for function declarations inside tables +-the debug API has been finalized + +***2003-11-17 *** +***version 0.7 alpha*** +-fixed critical bug SQInteger the tail call system +-fixed bug in the continue statement code generation +-fixed func call param issue(thanks to Rewoonenco Andrew) +-added _delslot metamethod(thanks to Rewoonenco Andrew) +-new multiline string expression ( delimited by <[ and ]> ) +-normal strings ("") do not allow embedded new line anymore +-reduced vm memory footprint(C refs are shared between friend VMs) +-new api method sq_deleteslot() +-new debug hook event 'r' is triggered when a function returns + +***2003-11-04 *** +***version 0.6 alpha*** +-fixed switch statement(was executing the default case after a break) +-sq_call() doesn't pop the closure (just the params) +-the vm execution can be suspended from the C API anytime (micro-threads) +-new api calls sq_suspendvm() sq_wakeupvm() sq_getvmstate() and sq_reservestack() + +***2003-10-13 *** +***version 0.5 alpha*** +-fixed some minor bug +-tested with non ASCII identifiers in unicode mode(I've tried chinese chars) +-added built-in function string.find() +-the built-in function array.sort() optionally accepts a cmp(a,b) function +-the debug hook function now has a new prototype debug_hook(event_type,sourcefile,line,functionname) +-fixed some debug info imprecision + +***2003-10-01 *** +***version 0.4 alpha*** +-faster VM +-sq_call will pop arguments and closure also in case of failure +-fixed a bug in sq_remove +-now the VM detects delegation cycles(and throws an exception) +-new operators ++ and -- +-new operator ',' comma operator +-fixed some expression precedence issue +-fixed bug in sq_arraypop + +***2003-09-15 *** +***version 0.3 alpha*** +-fixed a bug in array::insert() +-optional Unicode core(define SQUNICODE or _UNICODE on Win32) +-sq_compiler uses a new reader function SQLEXREADFUNC +-the debug hook passes 'l' instead of 'line' for line callbacks + and 'c' instead of 'call' for call callbacks +-new array.extend() bulit-in function +-new API sq_clone() + +***2003-09-10 *** +***version 0.2 pre-alpha*** +-new completely reentrant VM (sq_open and sq_close are now obsolete) +-sq_newvm() has a new prototype +-allocators are now global and linked in the VM +-_newslot meta method added +-rawset creates a slot if doesn't exists +-the compiler error callback pass the vm handle(thanks Pierre Renaux) +-sq_setforeignptr() sq_getforeingptr() are now public +-sq_resume() now is possible to resume generators from C +-sq_getlasterror() retrieve the last thrown error +-improved docs + +***2003-09-06 *** +***version 0.1 pre-alpha*** +first release diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..8218f5b --- /dev/null +++ b/Makefile @@ -0,0 +1,18 @@ + +SQUIRREL=. +MAKE=make + +sq32: + cd squirrel; $(MAKE) + cd sqstdlib; $(MAKE) + cd sq; $(MAKE) + +sqprof: + cd squirrel; $(MAKE) sqprof + cd sqstdlib; $(MAKE) sqprof + cd sq; $(MAKE) sqprof + +sq64: + cd squirrel; $(MAKE) sq64 + cd sqstdlib; $(MAKE) sq64 + cd sq; $(MAKE) sq64 diff --git a/README b/README new file mode 100644 index 0000000..22cde50 --- /dev/null +++ b/README @@ -0,0 +1,23 @@ +The programming language SQUIRREL 3.1 stable + +-------------------------------------------------- +The project has been compiled and run on Windows(x86 and x64) and +Linux(x86 and x64) and Solaris(x86 and x64). + +Has been tested with the following compilers: + MS Visual C++ 6.0,7.0,7.1,8.0,9.0,10.0 (32 and 64bits) + MinGW gcc 3.2 (mingw special 20020817-1) + Cygnus gcc 3.2 + Linux gcc 3.2.3 + Linux gcc 4.0.0 (x86 & 64bits) + Solaris gcc 4.0.0 (x86 & 64bits) + + +Feedback and suggestions are appreciated +project page - http://www.squirrel-lang.org +community forums - http://forum.squirrel-lang.org +wiki - http://wiki.squirrel-lang.org +author - alberto@demichelis.net + +END OF README + diff --git a/doc/sqstdlib3.chm b/doc/sqstdlib3.chm new file mode 100644 index 0000000..87d41db Binary files /dev/null and b/doc/sqstdlib3.chm differ diff --git a/doc/sqstdlib3.pdf b/doc/sqstdlib3.pdf new file mode 100644 index 0000000..652b3e6 --- /dev/null +++ b/doc/sqstdlib3.pdf @@ -0,0 +1,1714 @@ +%PDF-1.3 +%ª«¬­ +4 0 obj +<< /Type /Info +/Producer (FOP 0.20.5) >> +endobj +5 0 obj +<< /Length 202 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +Gaqco]+T]L&4QJD`Kj?1As\1(;F`;Y446,)+Ajos3^t[uHgsDgnb\U9a7]Gg'lb.8D\'ai&]L@hi?LQm&;F!4VnJ+G4Jpr@uH`d&8+f/1TXdFOAZ'p:!np8O9ZQ>rZ/<)]jLbg5.b0l7t$~> +endstream +endobj +6 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 5 0 R +>> +endobj +7 0 obj +<< /Length 1340 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +GasIhgN';b'Rf^+W&uA+L'&i1jp`&8cQG3oSkNlS%k+RR'[e&3tS?h7LiJmX8:L'Rcni'n#4Zb-@ip)ZS8$h9]+q)/Bo90Q[JjQ+nDn+'4o.,^rX_NU^,A:.Dhc)!#*PE?Ze6?Hsg>LZ2FL.gX:0:IZ\QeiBXI=c]R(JM3QscdS-g#mIH>c1c\07;@]j>G6Re6mOD_%r$+ml>XTjR/7X#FnkL>IZ2O>hP!$s,<'/HoF<%bM;9-**n%=l?X',9^"B?l]mn\B,Ti.gU&IDs'Bd26Q0a$'6`I6,2`3)+r;Ng,jh%uXSjk0J*)V&;@qoA>&JIqQk&[S$N2g3H%Pe8tGM)_ht*c!Mg`/(pm!fF?X6`eNjS"qGKgG)ZbgZWP"]?\5^[&j1a?uK+>9"C$kVOE".g]'%(0gZJY)J22:Ch:5`PbE6!D?)!F2b2.8L0BAaqnTIERU;P=J'NZIQ@.23Fm_&`;M?6U"J#3:JUboB_cbZq2Z`ZM@RL;;cb;P=V?3HXIhT=oPX8e&E;G\)eWE1d]\`RK-*r+c$?LB<8i^@rX"lilGkX?^rRkX59*nB0KpM6_NdEq(+0]Hot3.t.u-%^=sGRdBIN4=8EedCWaB9AO;/cpBPmY<'fWF1a?fU'&&0\.G0=c-9!m><$\FB"@l3((Q=R;SqAV)LlE]3aI46LNUUm%Tgni>.Ze)XDq,BKf-[N=gOUI<;6"GK.erU/r5BN2PpXL7^F::-_;\..Hr8OQEIF1;\V]!?5`93H%@a_6]s-S](j)Dq1nluOC##PNQC7A6n5Yj]?1k1F@6YN;NEg`SdLVE,jY$-LnVqYn3DVD\EH7@UYpS7X\;uW*An#E>q`W$kV0."c7pLeE!D[f57+mcN3"i:QRX8~> +endstream +endobj +8 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 7 0 R +>> +endobj +9 0 obj +<< /Length 71 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +Garg^iGoCd.c`?]8EV`b1=.gR0K1`91K?+0ZOMGdU/Zh'Y!=Te%#&:?HH*JE! +endstream +endobj +10 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 9 0 R +>> +endobj +11 0 obj +<< /Length 1268 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +Gb"/l9llag*6.GrMEQ\].Jq-.1!(]3FJdNRGjG!P8dl^SK@iclkmOSG`N7'NULNdf%fY*'\qfHgs">p9rSGRf:8he]TCd&J%N5!hEJctQ4D$[nFTX]:P4U-_k=IlX,`tMZ0[I'-8Hh+GDd%qZkqnHuq:m1/8H3aNBh>7%>c"rNI9"G4!E]%Sor,GQ[EFKLEr>!5RV1ku1!J[">)[LdQDZ(AZ"SMnF:K7[&(YL"Sih@?_dYQ66a;V0KGKphJGmDPR!m]1&6$;::9so\3Ac^l)c#B;Pb4J\#A;Y$W(RQ&UoR9%$#(fuX)"1.[US3=q!6:BL_$D'Nab1m5S3'.j>(-K2V%ZT.js5TnF&m@bGa!H7>`gffOPKSLfQ#R&k8,73C^7Ja**UoS4"a'fV\%@8@Sjp-\@p)jq12&5T-FWj@;?VtM\8@XLrF\\_YREC<_3)bCJ_h\)IDn"?"hB\S!Y>Y0@O"aNGik]p!!G>4g+6sW7q\*j+j3:#R&j^jXL=N,T6bM+OJscaZ$@a6m0hn!!9h[g8oO+CJJ[^0ch89KM)h=#7q15T+2DLl^MIUn`Tti[`nEh04BSY]tJom)&h"pb@cXo4X]>nG4M[/pIl5daI.Eu0n;O08t4qe!j->01^BZHkY8DpYgBF(PAnEGq95.?Z+:JO&[[Q>XR`%sMV<*psF5[C2>cfuGt0)E8nSjUL\AS>CYBTe1/SV"/'h"8>TcMFRh]#*ULo4ip=:9hm66ulLVarfY.c"I"XJ*HZd~> +endstream +endobj +12 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 11 0 R +/Annots 13 0 R +>> +endobj +13 0 obj +[ +14 0 R +16 0 R +18 0 R +20 0 R +22 0 R +24 0 R +26 0 R +28 0 R +30 0 R +32 0 R +34 0 R +36 0 R +38 0 R +40 0 R +42 0 R +44 0 R +46 0 R +48 0 R +50 0 R +52 0 R +54 0 R +56 0 R +58 0 R +60 0 R +62 0 R +64 0 R +66 0 R +68 0 R +70 0 R +72 0 R +74 0 R +76 0 R +78 0 R +80 0 R +82 0 R +84 0 R +86 0 R +88 0 R +] +endobj +14 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 120.0 655.001 179.44 645.001 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 15 0 R +/H /I +>> +endobj +16 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 120.0 644.001 228.88 634.001 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 17 0 R +/H /I +>> +endobj +18 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 144.0 633.001 194.83 623.001 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 19 0 R +/H /I +>> +endobj +20 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 168.0 622.001 231.06 612.001 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 21 0 R +/H /I +>> +endobj +22 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 168.0 611.001 205.5 601.001 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 23 0 R +/H /I +>> +endobj +24 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 144.0 600.001 169.28 590.001 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 25 0 R +/H /I +>> +endobj +26 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 168.0 589.001 219.11 579.001 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 27 0 R +/H /I +>> +endobj +28 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 168.0 578.001 210.5 568.001 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 29 0 R +/H /I +>> +endobj +30 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 168.0 567.001 292.71 557.001 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 31 0 R +/H /I +>> +endobj +32 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 120.0 556.001 196.66 546.001 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 33 0 R +/H /I +>> +endobj +34 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 144.0 545.001 194.83 535.001 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 35 0 R +/H /I +>> +endobj +36 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 168.0 534.001 231.06 524.001 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 37 0 R +/H /I +>> +endobj +38 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 168.0 523.001 225.77 513.001 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 39 0 R +/H /I +>> +endobj +40 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 144.0 512.001 169.28 502.001 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 41 0 R +/H /I +>> +endobj +42 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 168.0 501.001 219.11 491.001 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 43 0 R +/H /I +>> +endobj +44 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 168.0 490.001 214.39 480.001 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 45 0 R +/H /I +>> +endobj +46 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 120.0 479.001 198.32 469.001 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 47 0 R +/H /I +>> +endobj +48 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 144.0 468.001 194.83 458.001 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 49 0 R +/H /I +>> +endobj +50 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 168.0 457.001 231.06 447.001 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 51 0 R +/H /I +>> +endobj +52 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 144.0 446.001 169.28 436.001 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 53 0 R +/H /I +>> +endobj +54 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 168.0 435.001 219.11 425.001 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 55 0 R +/H /I +>> +endobj +56 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 120.0 424.001 206.66 414.001 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 57 0 R +/H /I +>> +endobj +58 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 144.0 413.001 194.83 403.001 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 59 0 R +/H /I +>> +endobj +60 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 168.0 402.001 231.06 392.001 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 61 0 R +/H /I +>> +endobj +62 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 144.0 391.001 169.28 381.001 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 63 0 R +/H /I +>> +endobj +64 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 168.0 380.001 219.11 370.001 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 65 0 R +/H /I +>> +endobj +66 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 120.0 369.001 201.66 359.001 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 67 0 R +/H /I +>> +endobj +68 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 144.0 358.001 194.83 348.001 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 69 0 R +/H /I +>> +endobj +70 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 168.0 347.001 231.06 337.001 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 71 0 R +/H /I +>> +endobj +72 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 168.0 336.001 220.49 326.001 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 73 0 R +/H /I +>> +endobj +74 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 144.0 325.001 169.28 315.001 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 75 0 R +/H /I +>> +endobj +76 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 168.0 314.001 219.11 304.001 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 77 0 R +/H /I +>> +endobj +78 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 168.0 303.001 212.45 293.001 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 79 0 R +/H /I +>> +endobj +80 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 168.0 292.001 247.16 282.001 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 81 0 R +/H /I +>> +endobj +82 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 120.0 281.001 194.43 271.001 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 83 0 R +/H /I +>> +endobj +84 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 144.0 270.001 169.28 260.001 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 85 0 R +/H /I +>> +endobj +86 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 168.0 259.001 226.6 249.001 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 87 0 R +/H /I +>> +endobj +88 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 120.0 248.001 142.77 238.001 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 89 0 R +/H /I +>> +endobj +90 0 obj +<< /Length 971 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +Gas1_9lHOU&A@P9n8Y3KKWesRgleV$dR2K`83JdmGer`M1,^j6$2sN;0Z5l'C8I3YH"NZH4C`H)D/MO-.#bjW+[T>Bn^2%a+?K1_oT0L)u?7'<'Uc<.IgYI(MXYSh0b7UseQ*4HA+>@ot>=.0YoI#q_d9RA:nfmE="Y]=WF]2C+F1.:S5Ptjk"\nDH/A/3%'Eaf\B&b/"qbEg=^47!#no2XVcga.TRAe30!LU%FfUH]Br5g^OuBPH.:?gGZ2J7ZhGJGWph&\0A'BQ7^Ea[i-@JF\X6RMQf*R;fF,"?Bp.'LHK8,r^ZQ>M<6J\)!\Q:IU03Ya@FDimSA(MM0+Zi+>n^7Y#om:hK)RFBB:X,nb=qJ6YCaT.u>UW24(%@8__iKUmj!F:YFl!J*m_#m,Pn9Tm.FO0TlR(S*ujDD!hQN/CC3L,\uI2JA^tAI5M1_nLm$C8>#~> +endstream +endobj +91 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 90 0 R +>> +endobj +92 0 obj +<< /Length 2083 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +Gau`Uhf%7-&:Vr4+loI0eh[)=$,[h8@NDb@D5`@U1ju$.3n>WNY!f\>rq]L'U[BPbEI^1d!Kt&>ms+b$hFB&6=')m",;5!EQ:9YFHf]Sb=+TP(T>4Zc_Y;J0(MUPSp.R^AYask)\7pQ0VJZ:H.-CDtTUA,k1rnN+qje3<\;K8CLZDb8c\l&3h$N(1iIk5rA[Gg\t$K]rH3F[^GJE@ci-o9W5?NJ)%:g_,>s>E>UnQM%0&leZ@jH,RIpud66mK:";sXK&@&88`gtY"9NG/D-[7X>(,W8iRljkFs@0*)F(P0&W,^'AmeUY[3PmY+.*`-nC!L.ML_/a.Ense3C#tYg1aLhGCq#F8S"DY\`?$F?hCuo!^JHsXSg't5\&#n;i]fn4T/ea.%7Nutfhi("INMFD>kE>`A+rM+ZndhR]WV`=7)So/K\9Q3!&!lmUfl5ZfeZ4p8-@3XQN?Ld]PkpY.g0$#:mUdlt/'8.l!NPCDp5am!!2=_Bl>+3120L'l2HmRZqht$:0E]G,cmK9)F-Pr"a?PgTaB<`a]@%O04b3`6;L-/TAFRpW%J"hLtL7C3.-l2gg:$q*9h;2^Q]("sg`7>7bc3IID(WRE"WRo%=Z=-`k6DI9SDRmW>MjT!9soB\5AEf\)>i;+(k%4rpWk\>*Rd)mtrZV8[",NO)%J\ZIoIJM%OLRa&PF2ke7Rnrr4VKGl2*,si=!;6gr]QY[jFPV&RMa)MF9]%2a]Y"9tW6po'#Phg',SjpQO[No).J<;iH6%V?qVjS`(,/O^;>agHSb1W<"W!0U>knB+4'4aN9?:Dss+PV<%.R[:8:K.KYY'nBi$5?68@'N[b8J"lB8$Z*JF($YiF)^q8KBn5-(7DXZ(noEf[a_=UR]\RQr6dqe%(!ME]udD*1N(*T0;5ep:h=6kFfI$)DG@;MMX:/N4YKI!la+%r#-]'@4h4C%id963q3e6(+#Uo-tgrGejS2;RLuZ]'d=2L"aZ_oG&,K2P?*S#W'TYuWs^[59F!96,BbL^$MEOEG`s3tg;^f&`L2Yq)J.r/7serVV.S,I/6]fiY.h^O/&mO7EF<\:nL49(C6c9AqXa">C>R?#Vk]IS/-=5g1#=^i8Gd=dO@K-Y0P:Zc~> +endstream +endobj +93 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 92 0 R +>> +endobj +94 0 obj +<< /Length 1696 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +Gatm=95iiK&AJ$C\>M;OU51"m7uL[hBRqa3'Erkgmm4B28#RuMP+3Znoqb&[*%E/O7=lL'de!6G3#^(TJ(^urIRe(2_B<*%McI8NXjB*CIpt(r2\Ql/$!M8nlYi7[`ERN#rk@7g+k3epCXf"UNSS2js3%?,heNWai[bEjo[2O!+/?[)VL)p$;3[@>%q&2W,q)<`1rjk,!fYTb]I.*E!hqLiem4a`+O9Xic"jPn*G^0`FPg4PZ21C8gubg-KZA/lO_#L:=XJ2d<7ghhYqVi*B:d(#Kg)T'TjZ']Qp$@!_LMF4Fu&P8g?[_5NpQN@1+2uXY@VL>dA-o@_5.Rg/.<)Ud8d8SXA^P9QTlC$6%U\2C?/1c5t165Hc.'f>_cd$SLn#7o0H54qWkN'7npKJhc&#@\gJqIc4F.V:DPNgL1bbWpXR^(hA)VPf@ud3:h%]EBlU)W&jD*fuH)Vno^r5<'AkQC;>g`r9r]7*%c)2lQAT;&g'@^[\0`Q1]?n)[VFIOYZPVJ!$(=&dLB)_eADWHG^_Uofa4IJMoI=\[cN0lqeIo/5NrbnO)/u]QRXM(lR(>)#/AR[&e>%N5^WB-o$t/qH+)SMh11e=msK&9WuM$7W6D\gE$Sg<(u?%N2%gDQ-SHp`*da%&dRbaggO09o$2%qJqK:)o!4!T/lE[^eBj#AZ3KY?51E)3,Cg"[(H(*cPRroXJg!V!*uri?D-5srh:qMUN0fO&LuF0;0RQ_XN93;6pU0PqG%`fd@r;WlS#''c<]OJh0:E!C&!7e/Ka1HRK]MU8f,lJ76?"GHfM')ejF)ZHo@F0+!r-\pL4uM\Y%07n-dG(B9u)USP:)]d:i3*PJ)PS%(_k6![,_EjD@S:aX&Y"VT-b)c:3(tC:o3#fQ;1?Kcs'j(`Y)C#mIQuSjjD$EBE";IECdf"CTY@U+$@VCkM5.492-oH7;-je67JtKMac5#2FT'qFc\<6;U?ab5N15O^IFt[ +endstream +endobj +95 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 94 0 R +>> +endobj +96 0 obj +<< /Length 1321 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +GatU3968iG&AII3n0iK!Qls1GHE'(#<#oUTgIa(i-Ncr5KSCZg'!gQsqLTt@/1",eh!r2`Yl!ei]AGq6o?$YGEBG%k`-:@c`-'WEm'u+@b]T6';5eDU:jUIBV_sCWY2&P.^]Bnl./^X@B7qKaEX9ep;Xe]RBX$5Mmh&j'uRB4]FLObiZ&E+!H$"rr2QZEVB0PHiN>_]&1<*Ff*JlY(#%+q3JPV%:@Y?hZ8T%G'R@>IY5MCQ!&38RN8p>Z6D6b.Z0CSYM_)Rcru??%aI7d5h93;9c7\A$WaPb=.WC[9tK0@(ur2,HjV^tWB-.h0;=4=4ng6Qf3CZBmI"J#!(nkfAYr^^7q4m?1`M+#6L*UXfS):hc)*aVH=%L2&Is^d/#3TXd\#jYsMng$k.l%.ao8aTf+Io*%e3H='AEKJ^/2_q661$b/N9BoT,3odF_NmR._6_i-dV.`TFl.Sk5>UL&I!$-*UI\ePo0dIRK"7T,`-P*Zb#`!u,&-WXX&N!.P2%=?!Cb#b!@PhnZhA".F.=h&aQqeii,W@S"fZoPri[pBMl^A5H:J(8dE!mp8DNK!GB&,qDSonP$gs?G$d'PJ,bs`U-)HN;KOucA(-W&.SM,25a,L,"WKhB@:VP"EHA])N/.15r.5]uDNUqmX4@'sPQ=1'a_].Ts:nZN#M0nk/,tjJ[W=mgMlp'BV^s"_45$`ei-]ptl`2M@Grd7*[gr+aScGA1RZ>_V'@a]HP8e)q<-[:=?A6mi3TN;am208;Z3s"[^6#3="j8G2MnJ`E]QBM*C3L(oH.Agh=C~> +endstream +endobj +97 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 96 0 R +>> +endobj +98 0 obj +<< /Length 1803 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +Gb!;d>>OTD&:WeDj:Mrj34DUWT*bXbMWtIjBcfrIL#":!24H-l_E"O/^32WDa'S3977V*HKJHms(XJ&\hr]<0E-=ZuO8?fhB$1;6HTIgkci9q6Z\3s&((`OsAo$l0_s-R=p!)T\GFJ;9rSb#1>aAB0jSe&^Ic^iEAT+pjUlf6S8$3fLKC5Tcl`OV6kSjDilUU%XjAfM>KNG"Yau_2'.B?'6D:^IO.2#b1p/M@FX5+$??'8#!0e9i,eXs?XP_IKr>E+9I]:@a8bZ#3AO%r6-i[db)@58*[R`(<83@d$Ud$"dX@N'NI&(GRR9ba42U<7K^.16.$U\#bh^a-A:OB33beK?t_XZr.Ni<9C'+DS*l[+s!Vmbjr]9Qin'`G,J=@9"3VM&e]6h6db/>'kEF$gY*0n5>?(bYOCm3DgqY=="0+VK_iF/bOfgab4DKJ3tn(>?EA0Z@`P>oJu\EbEFN^T\oX%Q,bbk*H.,ahOD`]icre1,NdfW%>/=#L'7VhqDq5jK7k<:INCh9&#iKZ:Z$l%5`eqo*'bJ:"10#-V@VoiQmE,pO[,T30p[bD!HY+-J/]081cq_3#rYI;ohc<1Z.nd&1M9.M"]bF=4I(j.J+kf%$6TFSjfB'YJ'H1'mP)L*.AREdFgebG#,cI[LntKAA$Wbat>0gD2T?E?+&20'2>4%0$mUoV#QG/U>8k[&eF)@N[8%!c=de%Q@AgC<'YUmPXfJjoeE.9T*%:"4uio0C3)'VB8*m5oE.-a5MgB]kqjf7Z.H2H6?%nFQkYEu*pNMD'5l.Ok33`b2.JV\o^qeAOYqU;cINcBkDNGpg,&u5?sBX.M1/fRcEf.;-m(-P`)oOimDKF-0R1*OZ?C6j;&k<)%a2ne$iX1Z/@Co7sd$fd>%E%4ss=NJVd?jJM$"lC/[6d,U_&L-;`[\$XOf&;2,"eRP:h^5:3+CjNqo:EAX_\$oAVp)i4=^"4/Ld$+ucO7Vs8Y`ca]XOsFpTX4:4>2X[&lXF3/Xi4]0BE/npg#G3e&X@('ch1^*02Iq9@r3E@spaV$LK3Mq_l:O\19-WPkiZ4g=J-PYnITKV6F4!nUYtoY((^[O",95+*E8/A9'5OmF=ljX;-E?;-u2,;t\O`L3qjihXoXWkJ#^CW+E""OlbraNmGKQ$2=9)rD7kC%S6dE@r:EOCnRE.~> +endstream +endobj +99 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 98 0 R +>> +endobj +100 0 obj +<< /Length 1110 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +Gasao968f@&AI`d4M:kYM==.B\$pIBBfbL##Ym%LP7\phVN0b/EZY2PPpP0gL^>(3ptK*A9<1iLcN`E&lifTD]kfLo^&(+Rq>(nP6!+LBIY`T4QT]T.L4VT#nOJ$HH"V-T#?j2g>H1PVVeG'!2c[+\N#,5UA4]ip!eL5JA=8(hE1,]3:i(X`L6ILrr]hK$%R%-\GA%;K5P[p9JV>@;2H?P,(CqYc\jd-egt8fJ`on9!D2:-chqrA7]^O"F6Yt$7B<2IHP^I*3'@bX4=YXfGYQ]d]!&"p5:\)OA,ST.!je)N%`XtEqYrp4\i8iQ]H?%-+AJIA[Zt@Hs2Iml`c4a_N)[Eg0pIL"6rlOA_0.F5nDW*kBojAkldmJI?q>+%Q=L=+9EcY`1n;PdRSXnd^>1/FI!]D7f4n:RH5TqYF,(*fKAcRs@_F@VLNMWugR`uq3`Eed9'$3f^ZYD"/R%T=O\!."kG5`40jP`'AIBFhf0At2VYT6RUA5/NnahI\G\S7fVm8@8Lp6\H+_'@^=O0uU>:H/,W\D%6AO]3,Q%i=ptXD"t>EMQUtP.m]G7Id[j."J`1=iq_s'@X`ZpFd!dJDb#(6W@J.QNeH^[%oF&-3EZd*c=aUf2`DQ)5JQMY#uZ-Jbdb#f`=&XFT$P,eMaJFJEmC_O\qn#5Us6ItQE.WuBF"XWJ9-_N+d.X;AG?GRc/D.q9/pu,"Je,ugdd80^\)Kcd<=&8c!BFg,Qi!tPjDW1$%2\Z&[cY=9pX+stU_5HguH8c~> +endstream +endobj +101 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 100 0 R +>> +endobj +102 0 obj +<< /Length 1445 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +Gatm<9=(*G']/^gclIE[<4L`)>_I.G<_6E-JA'$cmmlM%#q/s=Fn/M$kLuOeJgM@OJ`sq_DqnZT,:uLk'5s1+=mE,7bJ',a`8G1uU-W,P[3(URB;rk*j\TBc:b;scias'hP]tJYt^$VHC"6SRXg9UEj[P;JT3"HU]P0S.ag*N"\ojQp@k''(cc5AINUqVTEfTSEfu.Yl1[&24FG-A2m+qR:]d]2/jZS=7+S,GkJ,KE?i!>J?5n-IjN_Zk:hpc@c@SUT_UR[4d6bdkW6Tb4Jj)MlaFcnnlS0JbFYO2^?p.8eMg`4j^mh-6pJc;E5U&mJLc8UHshu1c3Hi;9:ggONfci7CB]iH4TS5Kp0jTH5<6N('pl!M9#h`h@=k"7--I74I#EcF0#Y,1X1R"2CY(?LNLY9rU$E#n\nCZ$pn8C"I!Ekc#.7)C[E`+.E[d@daDg@R^pTfCsJ0TdLcu>CK.'f"3)KUT%s2epH!-];3jn9I"^^E*c-3-Qp=DVQrduY^S:$F$]fB&"Xm+dRfEI511H"FL&;D8;\2uJS\,?K-2;S*&R$3BfcC+HehLRXMm`Pm8A^SZB5F&gnEq[W#GC+9-.t6pc[_M.Wb,INa1tPF5H_o-q=NL;,Wq@N@5V]bJeNtXGXoNa`36WF9orV'sM;qF^#=_e^Pp'Wk13aj;48NX:S-Zfj;d^lCf2L9$TVG689b`B(d"De79eDPXmg?!c:[>#?JgM>6H\R/$J8+:"PWo)L$6"u."loP1.l]WNfG2g@`Jbgp_0XX6j9o[eFR^-6pf(rN2U[_GokHF,^KOW[jpkkcL#/R7,Z5cn07+oZG]Q+qM2=6`n)CCS&2*jqLB)_^EH*,US6t;1mUaI<9)kAWgQ&`pHWcq)@3n4Ab/+D3s6586mMo3tINQ5P.oku]-,^-Hs`]u@%hF%#l6Iht;OHWa99B:n!GSG=D#^M^bqqO^rnGR&NYd)-l2fE=od]_EMp[55[X7@[WLtO5kr>sU08p]1Qn'10AI#s,>:7dsAe,csi(e(o`US>U$ItpNe"9~> +endstream +endobj +103 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 102 0 R +>> +endobj +104 0 obj +<< /Length 1752 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +Gb!kuhiFNj&:Vr4_:rRu4V$KoR.dL`[F/*Ue4P"uS5(>\4]I#S5^'R0f67K1*YU5t\o1TE-oNm\^):eV2f0;HqhkYDI=@S0\PnpFi_a=,d/P:S$s%LSW[L:Um6GuIJ,RKJ/op!%CmBC,O1&HAOX(aid`=,D(GJ8J7+_q6r4,K3,9/md+en_+*"#(/FTH&!5GWZZVb+4=,u(lm]jF#CaigMu(?@Ur#L"mY/RXOuj`3$GpZ0P.C,fktS?`"]IEMt_1bakk'[@?@_K5@F$2&Lt"n[nh$%DoB*[+J["S!^WNIQ*M4a!12`B\"HDH4.>5:[('ho(Il6Vs"\d/"g?jbJn82^piB.,>J2XH%iMS_Y0_PVD3'^1@%`9b+J:ro--\U$I]C]WEqVE7Dbrg&;7_-bX>YpI=/0fAh\^4m42-F[$<=lu<%cP'1V7\qOJ2_8RW=-t@b3\Zdm:MolI%7Wt6PthnDVJ%M*sUgo[olDE]b#"aCNHHpa?.(,)"f2]jL[5/JrgPtUnuO?Q^"f!Mrf8o6ZSqaP6,,h*a/o_'F:"1NN+]d)kqh+4/`BiWW(g`e-^rcB&lX\P]NJ;[f,BhJkFS/?B6jNkfPUgAD"[JWJ^i\%at%X'[)F5iL>\%D#D4?o&`@43>7*GFj-V]g!T`)3<_Kdt.6N3JGb+1t:0\Q\8HF'eMomPF:X:5pNm2@Xh)jCZhn7Jgc",JKp3!dJU%+(WbJqZm*f]8Q@'T2N-fY8.&_DQFVE$X>?%mZg%]56f8kJNRQPX`ZU7P)ae,o8+_;;1"b9q(B*3OToe$GC]>P0MV1l2.kKJB2QBL-P3i<=`tq[%B^b;&'mjZ0]\'_nOnmEu2aA=D'HHd5U.5>c+N2U2q!&6bPOnUmck]I609lUj'jMgNI"k'5!\WN,`21@]ASfb$aNFSr5;fjGi6p:sa[aV%(/#KtWMYk="Q2I]DQf#>'c'F>f7<,a)Ni7%3-9h`V3W=%IBtnitJ9RUZrJL5!6'V*k'TD4VUP,aO1:ZY8eU@/8o4RlM*:1*iBL(ek(R:GcPC&0[,-LsFk77RZe\]bS3^KjB;SbjcU5bFRoTp9fpB5'Dh_qNRh&dpZ$erE(M"'&.&GY%];D28Q]mAHV8J8oC$$R\WCh6/,*_$8mCKFX]fO8R31$nE^Bao`2O-DsIE8TsCn>1_P64M?;9:I\pHoGqV`!@KE@uX_V_3lJK-.=p4i3`ApAS2"FP3Qm(=>6A-iq>kiTJ4]kc`W7&Zd?HH@3OA~> +endstream +endobj +105 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 104 0 R +>> +endobj +106 0 obj +<< /Length 1223 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +Gb!;c92jS!&AI=/pf?TTR3-B7ujSa8:?*-:^qs!2?k9N;(^`]1D@'H#k!3.+J&?[?)KL(9CoK)cPF#lHE3'B>qGCs6gqGdP.lB+4ZU'"A?;p($UJhQ[mEq+Lb>g8T1XS7in\0*IF\G3W+j`GflG]IhDo_j"nGSe4(Z?,b]pLEZID,R>H#SRV;lR+?+R:j_@03:n&X.;oK#?4(?;dF#[]B4uCq*C>dDW[\E&rXSj8t.Vr9E,?,Na47h4d>ir(RcXc.+T?GZMd!oUb>8gl_-#Zr3o0V;#dql+"]'(pgl"@UD>1-u^YLF&_';\.&0Hu%sRn'VPrlZ<^@`7>mXZd!B11`9;V5g`W,(5(7o\Y?S>@MTHI6T%4bDDpaN0fY^F(6U?9-L0aaM[/"tXQ8Bq.PL'nF!V`7^fVQLXd4UI'L'r:6OXOTRp+nNNfQ`d\tdYIeGH2n=Be,LPQiae>cohLK'-TcD5sr4?d*P)/+.^`k,ebKVnr'"FmCY+8E[OKn>\@raK:_o1so#>Ia\)r,Eb=Zc"s,?O6WEO)-K/)o._mNpk*Li4iiA78_.Y>Nj.?JcZ;$NISs9;,(LeheEg%BZ5.>!>j#NhgaZ?BjCK\*RJVBBFG08lBQ[mU$&`pQUYEf9c3-Yg[e2kC#@^@L!AsL2$ZN0WQe:IPn?HfHGF%!S"ZRYJA1j-"l[,8!?oW`\9K)Xh'*gk:JK#!Y4;;6eKTBDYp[it0DY=\5C:/'@-fh+H48t:?*32QqPMAdL;.:YTG^m/L]NW:T$O:isUnlQO-^C$sKn?jbqWhKoHemdH0Yi'1N>)C*#7&;R<(jh2c\[i/js_Qn,=7T2Z=BFW@iP'(+m))NOUj~> +endstream +endobj +107 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 106 0 R +>> +endobj +108 0 obj +<< /Length 452 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +GasId3H)bg']/F34MlWRF#G&$5c&3#^h'K+38bck85dKYkc\n7A31>@AU2VBG)eP=RegFA4pXOAO`X0W%YV4bG=3!N`?]\[mS4Y48]Pg]^JN0hlBZdT(I1)P;aGO(0I](iR6I4X"9q:kVV,'?aMHBK,j*JE[P)i0M\6$^C*@lt/kT&KHC,lqtSlK9ifY1qS]ZVKpW]55f>K9"KcKV0\IDB58DGH._p?-.>)B2$KfM.@*MDGe^.q;%Jk+2lbY<)G(D%L!sX@&:#!N5kD:ZgBXqNoAl\5(8"p6>q/L%GU`D!Jh~> +endstream +endobj +109 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 108 0 R +>> +endobj +110 0 obj +<< /Length 1150 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +GauHLac>C>&A@rkG]X&P)XaCTVp$7i&g0Gkpm0$QG%e>b/T+1PFT6d3D9F9f7@[a40ORusCO**UO!T9Xbhi:H#a\r$+H,oOP0JptMB>:r#>2?T5YFH[2>M=mn]>Wp+!/KJ2[0U^$Vfardd+l9:D\J&rDU:*Q-8+&lN?s@/:PDD'O_\c@Jh9,j80"^,qr7;K(fMb70/]Pb/q:[qE;$ThfN9Gg<\m<^.VOoXt*S?^-$k(f0d19bJnaf/hb5TS.HuAbIUr<@UGf'3"!02qQeE:?ImlRf=pM*j,qCpGtLKcQ#-UN^9QZ3N)27hLMCl2<$#oUGi"]/q!(g?8I_);s4bk^+(g&X$TG*DTE[>>M8XtZ[X#DH/o.U@dpU:mh1IC7i&X';@C(W,;Q>S$[f7cWFHjF9gcQe"..R?(FSLjAeK>tOU59-"'4Ias!$)pU\ptiEaVNB_@3YqQN91VaG%kr'IFVSB!FY0atG_WD9G8e\!^2@`b*UXhb9Rjk/L.%mIT(%(?%5dbKAQmj+cU'>\Nt@>];kF-Imks8qr86!PfP1rf8m?u;9>Oorcr]Ih2WH/He"?QKA\0d),2]%5Vn&X9rRg@0pig=QA4C-PGd8E.,@jQ26$Tad+esV#0l`mgI]bK5pg9J"fOQF`Y@-=hf<_IY8mRDNCWBKFhuVBO,r^%h?5bs^niLBn0W.0)\d?V0f6R,aGE>\'O0hEVO^^'g+Rl3q],`,)>O3B@IpO8BfVmh,ae`H2$K[fd=-2IS[X[(FQ:V6tZ7M!'6%paQ%hcEis-[\[GlQ$Fmt\mKq='0\+bjO#E$!j8VYDZdZC_"YqlgoUe>PT5pKcf]:kfAQW]p@$_UpmH^Dp)BYQ~> +endstream +endobj +111 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 110 0 R +>> +endobj +112 0 obj +<< /Length 1243 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +Gasap?#uJp'Rf_Zi6chK<^IFNmSg\kB=$(R1l9uOb^(W]A!o#.i!A,LrUgmIL+<=ma\2oT4nn!lUFZ/rC@T=LmLY>]Ze@"8'.o#mbo^q]>J:g(779,9`;+>N^8M!Jt1"T[k/eK%:H7B=>/9-Inij@L[YSDUt:V_"VQo\X5c)gPK8pTD4D@kJu$BM#e:-WJL)B*a2@Sbn"9$N^WrL,@H@#@n%=T?c4'Amp?UgS(,b5=j!3&U`L-kY>iCd[."PRI:RB8d6%FQ[.JH7I(R4t$1[F-H5WkE6n&nRCf\A#.AoAZU,##+HF6_oh,.+?LdT5:S`-Rh%[@P9f&W8Wh;8jpaL"&P]7W^!J?T);#Xc8sP^N4kNrKd]pr3rap#ZHj4N-0?7^*:E_B0'50U/2CoE\mgo%Ver"JPV"9k'"VREgs"m_@SW3,BlVG!VPNTS9?bp!r@q+.)Ft^]`2-l!j+6)^6]qgH<_?5"1"o:'q7&boW\Drl\)!g[Ym$(ObW.s]9D7t^PK+Kcenhuej.a#;MM+u,rH="kY;,.F75uok"4N5DSkkMdF+(;n0'$qRiE0b;_H'QJ/OhUYEj);:UC0p[9L?78AO33/DB;#l>YWL3_>:CXE.\M7?JieLq=iqJkM(cIRu^qE9TM>AX*`.aFF@a>gc12;*UR6%_)?u(^-cD(*G!oL`ITg?EK8rQKI#H@#4P/!R%mZ_h('Hi1QR^tWYXRDp.Y38Ck0`U,(c/lQ[:_+/%qAU2HKJppmtOh+'[1(Ki1>`nX-OW/ZR-<)4& +endstream +endobj +113 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 112 0 R +>> +endobj +114 0 obj +<< /Length 1631 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +Gau0D9lJcG&A@7.kS=D:=HV*GM`kmg?S,)^GN1h;iZ)X"ZAD,:.oAme?b_gOR6t2A($mOk'I'YI(q7\tQ73,:j=I=fC,\=[lmMS;I8TOW9GDh[1*u")gdoR#OU3ZP%t.V":'_(0i-k*C\G.F&>JV-sIWI6BUSV(@JofU+CS5%"RMqcJln%563i*6mOfLj2V;u]pW66@a0p&I-``Ujm++kNcm)tM4u*1)WJ5\P,q1qO-o\^ih&M;Mq-)LMn,R],/8nt>h,[PN-*9+VHLa")4#YWnk'.o9oX$k[;"D+A=]pY]PkhZC7ZrI'QO:ViYgKPHir4:1>sID/&b+K8"8B%lI9Mjq;\-3Di'o,NB>d%mqo&uOKSg(M70(!Vq!kfI6bRGc]hoN/=i`=WZU.[\VK=e:pN0jd\a-1h3(rKRi9iE2=K5cOj?hE)OBO5@1Uo<'I_<6XQam1-<\kJF:=_.2[#gDG!W_XX:#l(A"%.3+\BD2mV`.K$YT#Hgi&GjuK-'f,5jcmun?l6X;K?m6BD/nqiIP?iN/CK1g"tuLka9%1mqg^AbP?M$E$,YPdSAbS?A+b+JKHXe]_U"`:?Igq5P2=`0_u>XiqJ\?McLM)^7Ql#WOa>Xn)Yd7qJM6h1qa/3Q0GCE7EpeJL]"h\md2%K,b,!>sHiao<9I]Or6=L[jZW+9S&2[APW^#KN&A?X\LhI1cP`%hPE"R[7#3t.c:qk5Xbs43tD-&[W>QHV=\d#+JQ60tf)k]__+YApo_c'TKf$CG'BWd*R_9F^g"]6p>KQ]t(\^G?lABPj\@TH3%cQm;W]A3*V&u)=[r]/C"<3!![;9"ua>eM&1WrLnWm3J-"4a]-"%LnN,$4j^^Yo,0QaZ@%%a_pWKt%L]UH'\T@7JbE==kIG:t]KdP@f)"tpJfB+_8tMs_*p9_nYgLandlBOfYn>]-.Im"UY9:8dW@#SZ$`p34a[lbTD'6]CG=o$+7<\iq<$MLXYX4eD0AWA7=N@N?"p)q@>'=:d'JGCiZ'ZDb7E&Jde=ca>lJd^kt5)hu(>li1T;h`11'3*>%X0!Q1$hY.'kG_hC:0Fk`lnmEg[#N1!o/)^W]&NJ(7fu@.N-$AO>d6J'N.1NrrEepnV$~> +endstream +endobj +115 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 114 0 R +>> +endobj +116 0 obj +<< /Length 586 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +GasIe9iJn_&A@g>j9Q!+dO$EnRklb`kQ*):`,Pj5R\:EhU5o5!e'Gs9o[M.Z]sfZ,41RtrET4ZX&>U?STFXh(q"Aoj)i!:r'rl8#m.pQH?o19?eO\W>"*Z,#F!!P[1MgZLpA.K^cl;d*3-co;\1m_#'dsUkW=:`4m88]GW=YQS!KIYu/3ZHB]G=`6+T-2XLCfqA&\68?A`AUeOarZ?/:Y*``i%)F(C+0T[qBamalK?oM#7B3(%9rR\%MJ4q]1dLm#alJkJiIlYUtXFD]'?A6_Ph"pZdf/"XDfbpu,L7R<%\`n+BH"ll3\"qG$+lpDJuY>d`5lF>g*C6UF:Tcf@id3XDI3S!;2b*;^lrCu=fC(5L[WQoaet<_gMdR]SB$m*bObkks'o5MU9OZd$c:5@1k\Y(hq,4mE\QZbr5Cp>#)`c[M+B,rfT8dG.e\gXCS<0KS_X[A0TrnIe67jJ2Q;8DI@o:Mk>`3GJctB=4t6R2IEUCE[MZ^&^uf5(`~> +endstream +endobj +117 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 116 0 R +>> +endobj +118 0 obj +<< /Length 1636 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +GatmhRC7h6'o?f@D#<+6Z5u-NrO6aj&e]nrS"o_GIFOge$@`9T#6S/&g_hI':t)%=CIa8#noXfZ#h9>"lJZU<_*8+cO4'F;3jflC_:QM4c4%\S+;_ac9Zt0ED7CaDJjYq;=M('PXSkpHMQn$BHQ%VL3L-:22U.,o.J=SXP:\E/b&Z]=_;[,mA&tLdC)1F.X&K;012&s:<>`MZ(8U(:dmC3I5@2F*!r>H(4@u2,'tL->RC1ecmj[(nPm4*OGK]U0h3`s?Ycm%%*&Ln;M!nZ6`_Af2ql4f:\P'gi%qRF8E-:_\JrTon>+,b.A=)I^!L8FEm7>jYJ[\ln\h,^UaRSVa0!Y(-41F+iNnR"%D73h53A9L+o9F^#pZL'$*>i6@T87?;qPp=V>S[BZfn9f6;m[0!HOdP9o*SC"h"O?0s3g+d;Eb%R9I])%]^l=U/8N/#e5c3KOUFgc$0YnK<4J>k)!<*,t0@Ed^CA9^W>0S`onjm>s-f3YtbCeE]0!GeK+S&p\bpm.=_pQas\>8'MdYd0R5#+9G>_5&HKA\JY2%S9Qhdlk/UI(1o^ILK(+i_+i*sZAHd`A'@R.0[=W_;p`-DaKJO+sFe!+ShW6eWmI;"=)t<0j7'lNtB_Fh-TMis>/Fa+D9M_1$Qpi.#D4T5fs;q.3fR&ek0A)RDeZ<6fFm0;2*lfsj>LpC9BnEhuB[Bio=$"pb5^j3Z'kR2LUS_kdp\HhHr?J;WL8)7mN2`hhT1qD.@LR2EuR/a,&?^OTjMbWFcrjaK"9n<*Wd9^&8%Yqr9=g^Kk4&N"_[u+[1B1NZBeA[09!IJD<^O*-Mo?]GsFQ,5V4P*#2f:6`'gDW!l(eYJsEW_gFOrMEVo@Nem8po\XXbqCo8HH`0@16'+8J%b3;(q$D<00[DLr1<,iLi\Q\l;ur;D,JtGG!k-lm3WAI2(#P>9?aGc>G-s +endstream +endobj +119 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 118 0 R +>> +endobj +120 0 obj +<< /Length 1676 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +Gatm\qFj(Go5NP>-Qhf67(%'LB/Eqj?';W;/3\%L:e#8TS&H?>fUaWZKiJIt"-Jd=P)oa/DA5leGZ!2,qtki3rC@9W(j*_-S5leg8Q`8glpj$-oDn/c,907%l9hob[e/:[Up0J4WL66?W_0/=LZ4b=+\BWai*qQ4jd_BHuaCHWZa?cUogosd4e!$E?T&4"!q&Joa[\fp./2_?<)-Z=6(U3M_4L"mJf!X\'$4Y4ruAbn2;"H\3ZI1/A*8h%s4UeQ.p@Qd9!ocYjAlXB`JXRn;'G`\jZI1/A*.qupUMc6X2E?QJglXAR)K_-LV%cj1G*Y[`ZdN"2LX0e[aDI6p[hf+435NOTUsZi,iAYW?fT,4efQT%pj-iT\.8A[L'6u1q#(#'743WqrO1.1n@Qn4",=Eb4BLn@QkZS;Wk)@kLr^Nh!X8:0pn.)"Fag=%fM%@n;7\.-c5uX,]r#$J-"eaQ/(gZ$hGfLSe`9cJ4FtMuXXJU7"'!NYAF_>DpoK$112dHrSk>`+15;^'R6suSKpg&`!e`Bs[$LD:9N@@sC*:8uTV(i,a%m,pf?jAe8P>YW0o`@EJ;43%ri_-XUELY!ILDAa8>c=%5hkdn"VF"MRaMi\iiq+N`?K7$B@\+''.h'>;nQs@Bea2:i/T[kNSN%Zu6/OaCa5^-',U%M$RG$F3ItT]shNPP=B5?hCT'?$PeC:n=<+.uCK_unq%HC3h\1KUglW26>;i`-__nm`IKdO@q;N4HoPN=\G26:tkS&(PiJB>X>;HZ8&fSGG/9m/e*rpR',ELc>Z[ca+QE@,Jn4$"u))]dfZUO$1.7"NnZ(I0&Wrc37;9RH-]\i8KrkfOn&gg2Efko_sgl,gftgaGZ:.k0PT-kiK=6_&Ztl8ip'icP?_m#a)E8)C;<3`3]U6cd&Hl@]qd)^+.*%R)^7bHFi)d/_.LForG*`s*rfV?%$$2*`THBLnAl,28J_g!7N:$LD;QPRfZbS2C1ALoN[3E9JPpVuILQFdg0(c/ZaEXue%JN0dbF_iMpH-h&5[]7ND?GqF76ERU`&V +endstream +endobj +121 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 120 0 R +>> +endobj +122 0 obj +<< /Length 1856 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +GauHL>Ar7S'Roe[&.B8W0o$>i;&9oKQ4>@0T`pb#mDC-C:i&0-+A8[Z-Y\A7pDoB\8BI+_Cr"DQl7b=:T'LUuDE0_,O0OCUA6[7E`3p^6fWsHXS<4/K(ffFS`p'$pi.r4rB0SV/dbN"^+:GaT&@PP@;4M/^MW(SKJ07@>.2ZaD8s&(@MMO-J1[Ve&ipVcK\*CS_mo-*gXn/WOP:XfsZocUE,*Hc[?HQq>]k7jI2UrO['JX1PAfAoUR_COGCm1Tp'Y0.&p"'3HFgclbm*iI@#OLPG\uFj2+1JCu/6H%%H0l+T;WQAH:u=UR,Tmg!jjN\O54C\>I2"_[7fdRg`/5+P^k%`m$dFta:6K-j+iPrUINeAAT1PA'C+G=a*d`+YfcXsna9fJS8Y*p!i'qHQq(Hj%8iK'XNKLqC]L=1AL'eWZY+hdL9RL*TpEG#0G3BG4MrC-\)Sh+Bhn&/Y$FVkj6t^FAT'+)FKG)iA'-:gKGP"7)[H;O1k_G5MW^l43_n3^i3pbrT@G=]5q(K$p<,:]7FC6FDRKCH1qS[lIU&EA\UrldW35&WkYN(B6*c&1d\O^gGQDhrej):NGL)/Y2`B?jeENGXMR)K@-_,F!/_kn0,D2.1A>,6%Z3D,\CCi/*qHXB(/AueY4jlkb5N`5bhON.?R@7IiPnqMmr,'/VLPSK.+CqWV2hZ>t^%%VgR_QB^AtC,5<'Jas1#$#oV3kDc+!T#QQ&>H:9k(aHB#CPaZKg.RQ:""RdSW#b-:^?c%Ae/D`"fD8c.gjU3teo^4DGAe'5cm25'G1Zo6Mtf@7P:,&7OUZJ41UB-f5"?H*@K\I1=@`(p]+Eog686F1>mPC&Z!(@k`T]YV_`a4b\APalE_2jGe9[@&l9B'mWBR/Nq#)@CbeDe@=XMoq]aamr_ic6ts&b1IE?cR^O`?#@7mdT:AK-dBO^qLjSM:o:s2Ne,K.hQXYi77m5L2CW],r.[[W7>Yj3.[At-6R=uXl6,E%`\=RYoS(-Od:Uhk(bF9jOk.Kf:F>4,YHtE,UX>XE.0pAnP`>9,a1q>OL(1X:L:NG;uhd##eqQLq[s1[6#4/1)4[Y'4HP\BdFmIdBXS"%S3T0K>4Grc*BKWlg]Efqcj>5a?kY+Q^moE[!`BR!&[MdNTbg:0hH&'5L6rq?.418gKMdA"Vd[p,%,PLtYK62_mTel(+A4(P*X*Gf-/W&D]9Hq-Q,e:i;skoWUq3!'~> +endstream +endobj +123 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 122 0 R +>> +endobj +124 0 obj +<< /Length 1732 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +GatU4997gc&AJ$C#W[0_Xs-d4p6K*=VUu[:?#MB=&TD=8<[16E7IR"d^(a/$,?aR^KeFElk*m`2`r)J%p$,,HhiL59#RN!!4Oa!.o-g&B1=Wjb.J![r`!.Z21n!+YrVIni\LWh:FsX\);=*>(DC?qjWA]gVl.2mfAdr@G_u[K07Z+/u3'-OLi.^?gl0sk>c5785mur2rMOo3I**)0GNPI%DGqs0;,n2PO+bb?ac1rLgeVgDXp8mD?=KM<)9pSEK!'bM=^]hc9KoR"pgN'HnicPimc2UX"1/2uC)bXMU(G#t51g_:gZYGh3X;RNN="G<@UuXB-MEml?0mj4mj`lh#M0&"2O[)=RCB"b9#Z@/V1Q_k'G@?=2,_h,$MVA]3_BuA!Crd5"6M>/ln$1+%uH>$0@kWQ/A+7J7t6KCt7R/&$A!pL8B^kko\:UJ1N\3<>=Y/jotUPgLXM0L+dQU7Jc\\&,uk:\SP_lYi?q2]&?#B[8N2!PEbC3_3@*=4GR/&EWs^fHeQM;sqOAKD3l\;o9N*Ti;-<+?g@JKq,9*34jP)t([>Alc;+ndB9e1<@hP08W=0,!DT3"5gIkc78r(dc^e'WqqD=lS,PJHDJ$Q4A@#(39o:;iG"T/+R-c+`*HIfp!(D7/1_1W@4?7CPL)g101Z$Q;ePgDUK\AQfTRTLT\G`!rWB*9j_\58oMe[lg@SGeC_4(U+Du;:mYj72pk`Vll:'U?A91*j9mBb$mchM7q#%W4gVh4<6ZAdEMdY'-L%-C.+CB&WNlp&%6tR[kP_hm<7!i`^c&5P^)Ol=uJ4(%$lJDs&0#B;':;k*n08pFX6V85jLan7J[P#](b1~> +endstream +endobj +125 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 124 0 R +>> +endobj +126 0 obj +<< /Length 1345 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +Gb!Slc#]@8&AS+Gi0\Ui"X3EdhU6*Jn!:u&QVN9C&MrHt/*%N@^OH:k["'ilBeN15>-YiueUGZPh/7,uHj@:)FgfuCF^?uYETKE.#`7VS&:4\K3JklgEU3A6"`XBJ2UgE=>oS(pF_GL-*Z<,R4J>`b?lm5'[(^5"Q%8e!B9G\Dj!_0:r0s3#O)T=*CAbg*cd_.O#1^Hq=\"UDcbJV:k$G6DZY/=F8rX_.i8fnM-Q:3).q/H@VT5Z;UYd7G0K9QRrqQN'5WBuE%BJ"_W:X%12B%AF^2:7DCQ9MT2cgmqM>AQ$Fm4&NlQc9+QYUBNMfJuM(S+_2%Q;b5\$Mk%<,n'``c]";[Hg!&:,LH3YD`lh4-&65E%T:tB>(3Q$5&I3GqO*lc4koDbq2dVmh'!3Sq:EqN@$B8XCU&iW-c[%uB$0gT-QT\1r*<4XsI\n:9I&W0)Uc)FraYHWoI8jD(d?^(0pTYbp:[nS0ToChB^M+AR#ds:74($8j.32_34KK\gf4+7FNoB\k:m3:`H9'-ouq7\s4_=@KPK!^]X"F!nm&X\drP#2Sn.>ct8<`(@YGf6.7?9d3P-"gP/WE7B;*U)m>@)hbUo_P4=brHM%_"9d58If^9g3LjPL]3>(UDD-E&2B]PqGb6`]nlCY_t_o^a4pXI1)W)4l'LPoGT=uJ#>"lA_@qXskic?a+teM[>"J2%]9[_9E9k!BO@J%>g_L6H(mOqAJ*%(;2=ZVp&\4j"\/ +endstream +endobj +127 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 126 0 R +>> +endobj +128 0 obj +<< /Length 1562 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +Gb!Sl997ge%)1n+pc'j;23oi/g=n/>^b0d@e$u'0fK`nArRe"IIV$3haKa2m;(O.E[_IlJX2_TFZE'hlhFrY_&HBIaE_`a@uL3^r4DlhEQ39mYA7MnBUn?AK`7IhQ%Ir21:>9DcN^7XIl,Bj2h#IbPtgqb#_r<(Y!c$U`f4>?2J0_@W0#-?9RG>+O%nKE?'!2(mBY@/j^7k6?:RMWX$<9?6;@rFrF^Mb0pY+WuCPRgk>IHtK&:659*2qW7#igm&:Oa+%`-F(G6B>b&JuNRA=Fl')>gG1%Vi(Dd;M[Aea-pVaSE9?@&r!lg[p2+f=+b.0R5a-XA2cVG:%\.I0T#>BT!PlEGN\#+Nj#R0XB;7^Q.l4%!TGj\W=]F),kG(j&MFJD_#/Z_&!3VQ!80-3BN6Q70dp$t5>$OHY2>%"U+dB4*ho+.#%FZL66;-'g?7g6QdHhY/`?(-Apn4pUI!CAhM@Wal_UL8.I_$Z)61la1;)+XKMX]/'#J2o/tlj8>,:$*5A//Q;<,sRKp.#_0?>1_f?I+@U"iqUVtOm,0_QmuG[D<],,cJk(g(Ga:Fl?G-G.N^Z1^/4&epBbMQ0q+!In<\7O"XaPM`>*>P_9=!_#6,&OOH80%FMgQ2][=Sa?,)`PX.n/u`m::.?iJ4(&#BhK+:FLJPX5G2Jd"rH"bPMf'>3_;'TP(,qZ1a\UX?:h([%)X>P?U_Xhb.U:gE+3OA%Xlp?Ihj[FJmU\XX-3A:_Bu+!d/2q>i%d,h*@>Rn02u3,MX7S!c`(i0lYe/,f+^KT>$:\]u7!/;N7V3dfES'd0@JU[qQK";]Ffo9Zj&Lofh+V>#%ahl8N#6/]dVWZ3@]%EAjVI"[TsSQ/neD8!_l9.HgGe/@G+MD7_tfnF%LbF+Em[nnM*R@/W66"[J:R">>LSk4Xrr!X%FHP_n0rpck3G,['3da9h[hA0cZ"3XG,5jY4p^j:U"!^/Qqi%>Q&Z'Lq;S/pLC0_e6&2_`V#LH)!&=3~> +endstream +endobj +129 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 128 0 R +>> +endobj +130 0 obj +<< /Length 468 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +Gasal_,>n>'YO#P3O[4h#m:g#SZst3j.S@im=E^4AgRsE"C(o_5`n0DWuWh]Kt$r&fe?jkh3;;8Y`BAH4H.i46.e@(OYjM%E>nTt6#;J97e>:`5E+!,N19@bN@Xg52b"1nSh46tZi)S3!BspI)fEJXe:R:4]+^@2gkhlV]W+B!H<)0Z6sr?3^aE^gRVSfprN?S?%!2f`C@-1]=h&c3=4PK2B(F4D#Qo$g@CgG/\H+'JnG!?kG(,Ol97o>GLt-TI-@dglMKYi#hbaI\-*V0,SXWf(BJ;6FgC#IhGW?`IN=EFaVGl/p4Xq[jY=s#L:-D]!9gec8V5RC3g:Q?h)ZWE:5%D0Yd=Nq"q9V;].9;cgK2nT=U>g.41m8[K4$/MIq`+RNXe17Z5=2`ZZ)oiQKfATMXS3_\D&*Gkmu9,:F)J?]CY)4ae=$:s^FlC4puf's'DjBhIG4&qLh$8c0D"dr~> +endstream +endobj +131 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 130 0 R +>> +endobj +132 0 obj +<< /Length 907 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +GatU2hf$st&:X(TiQ"t#cTgFmT%LE,+ct=^]MO8Jla@C>dO!2Wq!2o4Vfiu^l\>8a]A.hlqhUR+1N\(-/-KW,RquH6l>lY*HBduj7;e+68Jq--I7"kb]#1/D*<7W5$-2jt6Jgm42V%L<*&H%R?&?D.N$ii*1:38'Tn%`7^fh+3%S@%.PFK[>m"F@h5N%uikg1X^#C_n8'NF]YR(cUt3\:j2X$BnpKE3R^\WH1sb=h"MTE0bke,*2W4k91!ZT0qZ2[EqAu#p@e(;[nhuE$(B#rLA]-(cLPGhW$-Cdd0BTLB&K^97[:pN^9[<0^Ci;.!.BW,;1-cqb?rmL9M)4qOUkY:.0AB[RId84'7J/:eCRCB/6<(N>g4\N_GPTrS&$&]D4s%$79#mNOhY7VD#OR/=A1Rd%![D,s-e(d7GB8[s8bmasaE/spV7n^=;K_qFFEGd'-AKTC"M(-*DUk79;*7_4TG4dAR1?p^k3D-0eaaBeF#8f*lZ="M5V;pt_MF$NelRS\8[s&&C5Oo)bPlC^a&7^k~> +endstream +endobj +133 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 132 0 R +>> +endobj +134 0 obj +<< /Length 1382 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +Gat=l95iQS&BF89'KjB#bAq6f4PEM-UhGWDeY,6*(pl[k6tfF@R5jE.cUak=%h?!hiI_PJI^?ZXqCd-'?N'M^-Ql;sGd?2.ZK-#EOpq@mU*7boAb&e,SZJHHIpThCDp*&XahPso=6*o/1:0Z;TqmJ&a99(1db_Mq9#bARq=8c2]L`m@A/CKgFV^N[q"$@A)L_<&MKSU8ra`q1DFVFg'j3MSmQU-.9MXc5N'?Fu)F(8+c@DIAQD%]V$J0JHE"9Ei$V,IkXU4#1(AnDOU9&.?+VUTLC1fN&B8O"JtYJUhQHYSn]sb?ds%OKG7hDUL1/\bd\Y1]$R5J@u6?D8e%ouojf](%*%i6>BIR=SPO$g.GJDWP+"BpRUS?72?QQ_0(g(-V\H[3Y\X?XNPfjd>9.%95Df+@F++LA+-.fCK@HYV(bB9u\SKSi(Qr"\co`s&rkn0>U]SPenfb_/VQb9i"0:'m([Nf=(AVqHqs4.R[suFQSdT0WEh"b_AJBXOdJrJ;Y/0f%(oV7!bJR0;MHOW/ATFSWAuXI8$Q,I>VCRQ_!Y&cDj.>M7q0M]p2*t!Kd(Xa.!bH9&`85_C#'-VZg.@p;BPE+EE)*IM_-bU<#*agHX-\MOn>46X69PfoCZ_Gf*bCo;hZ;s'!)0sM%X$'S[$lW+B%*fT=08gOc&1&TK-<Q)+D>6f=AJL8Vo>J_>snXbo8^RG;6$[r=A?C@2~> +endstream +endobj +135 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 134 0 R +/Annots 136 0 R +>> +endobj +136 0 obj +[ +] +endobj +137 0 obj +<< /Length 605 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +Gat=i95E<:&:j6K'fm\g.XI%)lPaH0]bLr=Pd5PcZ=EB6,AYEphcK\gGO0#'D=Bj2kkdIebt*n@o'iF\B9\Ok8f4N@:0;a#d3YqRphN=FSj3-Z0Q*YThHL"V,G>2GRc2,mPq(1%3E6%W7q*jjm1C<)C-,7@Ebp3jaUkZRFlrT[MgGZ1QF;C^\M9qNo'@]Ft1lJ$7p#Bq,pKPQD(?Lg1O5CAXhChMENC^XtDk<:/O=J,-[W&^k!j9DCk\IdM3gVY?BZ&E5_*&T_fig=DKnq52]F&"Oj6`]a`gsGbW2:l&`Z3-o+q0U#3;)KB^nl-\4!1b>&4?d6G":/oI8KX8uRRK52tKSEE)=%po,VB0iU9UZNB;?ccF"f,f'tG,O@')lBW%/)&7aqq#'%9bCMVJ)5N-.I@fhaI^)4)!K%s0L`/4JuQlo&$f&t`,(0\2bq?'#VULp69]bk$6RDB=#D[YPtT"H$rWRJN^S>rf/=a4TF!g#M75(6N~> +endstream +endobj +138 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 137 0 R +/Annots 139 0 R +>> +endobj +139 0 obj +[ +] +endobj +142 0 obj +<< + /Title (\376\377\0\123\0\161\0\165\0\151\0\162\0\162\0\145\0\154\0\40\0\123\0\164\0\141\0\156\0\144\0\141\0\162\0\144\0\40\0\114\0\151\0\142\0\162\0\141\0\162\0\171\0\40\0\63\0\56\0\61) + /Parent 140 0 R + /Next 144 0 R + /A 141 0 R +>> endobj +144 0 obj +<< + /Title (\376\377\0\124\0\141\0\142\0\154\0\145\0\40\0\157\0\146\0\40\0\103\0\157\0\156\0\164\0\145\0\156\0\164\0\163) + /Parent 140 0 R + /Prev 142 0 R + /Next 145 0 R + /A 143 0 R +>> endobj +145 0 obj +<< + /Title (\376\377\0\103\0\150\0\141\0\160\0\164\0\145\0\162\0\240\0\61\0\56\0\240\0\111\0\156\0\164\0\162\0\157\0\144\0\165\0\143\0\164\0\151\0\157\0\156) + /Parent 140 0 R + /Prev 144 0 R + /Next 146 0 R + /A 15 0 R +>> endobj +146 0 obj +<< + /Title (\376\377\0\103\0\150\0\141\0\160\0\164\0\145\0\162\0\240\0\62\0\56\0\240\0\124\0\150\0\145\0\40\0\111\0\156\0\160\0\165\0\164\0\57\0\117\0\165\0\164\0\160\0\165\0\164\0\40\0\154\0\151\0\142\0\162\0\141\0\162\0\171) + /Parent 140 0 R + /First 147 0 R + /Last 150 0 R + /Prev 145 0 R + /Next 154 0 R + /Count -7 + /A 17 0 R +>> endobj +147 0 obj +<< + /Title (\376\377\0\123\0\161\0\165\0\151\0\162\0\162\0\145\0\154\0\40\0\101\0\120\0\111) + /Parent 146 0 R + /First 148 0 R + /Last 149 0 R + /Next 150 0 R + /Count -2 + /A 19 0 R +>> endobj +148 0 obj +<< + /Title (\376\377\0\107\0\154\0\157\0\142\0\141\0\154\0\40\0\163\0\171\0\155\0\142\0\157\0\154\0\163) + /Parent 147 0 R + /Next 149 0 R + /A 21 0 R +>> endobj +149 0 obj +<< + /Title (\376\377\0\106\0\151\0\154\0\145\0\40\0\143\0\154\0\141\0\163\0\163) + /Parent 147 0 R + /Prev 148 0 R + /A 23 0 R +>> endobj +150 0 obj +<< + /Title (\376\377\0\103\0\40\0\101\0\120\0\111) + /Parent 146 0 R + /First 151 0 R + /Last 153 0 R + /Prev 147 0 R + /Count -3 + /A 25 0 R +>> endobj +151 0 obj +<< + /Title (\376\377\0\111\0\156\0\151\0\164\0\151\0\141\0\154\0\151\0\172\0\141\0\164\0\151\0\157\0\156) + /Parent 150 0 R + /Next 152 0 R + /A 27 0 R +>> endobj +152 0 obj +<< + /Title (\376\377\0\106\0\151\0\154\0\145\0\40\0\157\0\142\0\152\0\145\0\143\0\164) + /Parent 150 0 R + /Prev 151 0 R + /Next 153 0 R + /A 29 0 R +>> endobj +153 0 obj +<< + /Title (\376\377\0\123\0\143\0\162\0\151\0\160\0\164\0\40\0\154\0\157\0\141\0\144\0\151\0\156\0\147\0\40\0\141\0\156\0\144\0\40\0\163\0\145\0\162\0\151\0\141\0\154\0\151\0\172\0\141\0\164\0\151\0\157\0\156) + /Parent 150 0 R + /Prev 152 0 R + /A 31 0 R +>> endobj +154 0 obj +<< + /Title (\376\377\0\103\0\150\0\141\0\160\0\164\0\145\0\162\0\240\0\63\0\56\0\240\0\124\0\150\0\145\0\40\0\102\0\154\0\157\0\142\0\40\0\154\0\151\0\142\0\162\0\141\0\162\0\171) + /Parent 140 0 R + /First 155 0 R + /Last 158 0 R + /Prev 146 0 R + /Next 161 0 R + /Count -6 + /A 33 0 R +>> endobj +155 0 obj +<< + /Title (\376\377\0\123\0\161\0\165\0\151\0\162\0\162\0\145\0\154\0\40\0\101\0\120\0\111) + /Parent 154 0 R + /First 156 0 R + /Last 157 0 R + /Next 158 0 R + /Count -2 + /A 35 0 R +>> endobj +156 0 obj +<< + /Title (\376\377\0\107\0\154\0\157\0\142\0\141\0\154\0\40\0\163\0\171\0\155\0\142\0\157\0\154\0\163) + /Parent 155 0 R + /Next 157 0 R + /A 37 0 R +>> endobj +157 0 obj +<< + /Title (\376\377\0\124\0\150\0\145\0\40\0\142\0\154\0\157\0\142\0\40\0\143\0\154\0\141\0\163\0\163) + /Parent 155 0 R + /Prev 156 0 R + /A 39 0 R +>> endobj +158 0 obj +<< + /Title (\376\377\0\103\0\40\0\101\0\120\0\111) + /Parent 154 0 R + /First 159 0 R + /Last 160 0 R + /Prev 155 0 R + /Count -2 + /A 41 0 R +>> endobj +159 0 obj +<< + /Title (\376\377\0\111\0\156\0\151\0\164\0\151\0\141\0\154\0\151\0\172\0\141\0\164\0\151\0\157\0\156) + /Parent 158 0 R + /Next 160 0 R + /A 43 0 R +>> endobj +160 0 obj +<< + /Title (\376\377\0\102\0\154\0\157\0\142\0\40\0\157\0\142\0\152\0\145\0\143\0\164) + /Parent 158 0 R + /Prev 159 0 R + /A 45 0 R +>> endobj +161 0 obj +<< + /Title (\376\377\0\103\0\150\0\141\0\160\0\164\0\145\0\162\0\240\0\64\0\56\0\240\0\124\0\150\0\145\0\40\0\115\0\141\0\164\0\150\0\40\0\154\0\151\0\142\0\162\0\141\0\162\0\171) + /Parent 140 0 R + /First 162 0 R + /Last 164 0 R + /Prev 154 0 R + /Next 166 0 R + /Count -4 + /A 47 0 R +>> endobj +162 0 obj +<< + /Title (\376\377\0\123\0\161\0\165\0\151\0\162\0\162\0\145\0\154\0\40\0\101\0\120\0\111) + /Parent 161 0 R + /First 163 0 R + /Last 163 0 R + /Next 164 0 R + /Count -1 + /A 49 0 R +>> endobj +163 0 obj +<< + /Title (\376\377\0\107\0\154\0\157\0\142\0\141\0\154\0\40\0\163\0\171\0\155\0\142\0\157\0\154\0\163) + /Parent 162 0 R + /A 51 0 R +>> endobj +164 0 obj +<< + /Title (\376\377\0\103\0\40\0\101\0\120\0\111) + /Parent 161 0 R + /First 165 0 R + /Last 165 0 R + /Prev 162 0 R + /Count -1 + /A 53 0 R +>> endobj +165 0 obj +<< + /Title (\376\377\0\111\0\156\0\151\0\164\0\151\0\141\0\154\0\151\0\172\0\141\0\164\0\151\0\157\0\156) + /Parent 164 0 R + /A 55 0 R +>> endobj +166 0 obj +<< + /Title (\376\377\0\103\0\150\0\141\0\160\0\164\0\145\0\162\0\240\0\65\0\56\0\240\0\124\0\150\0\145\0\40\0\123\0\171\0\163\0\164\0\145\0\155\0\40\0\154\0\151\0\142\0\162\0\141\0\162\0\171) + /Parent 140 0 R + /First 167 0 R + /Last 169 0 R + /Prev 161 0 R + /Next 171 0 R + /Count -4 + /A 57 0 R +>> endobj +167 0 obj +<< + /Title (\376\377\0\123\0\161\0\165\0\151\0\162\0\162\0\145\0\154\0\40\0\101\0\120\0\111) + /Parent 166 0 R + /First 168 0 R + /Last 168 0 R + /Next 169 0 R + /Count -1 + /A 59 0 R +>> endobj +168 0 obj +<< + /Title (\376\377\0\107\0\154\0\157\0\142\0\141\0\154\0\40\0\163\0\171\0\155\0\142\0\157\0\154\0\163) + /Parent 167 0 R + /A 61 0 R +>> endobj +169 0 obj +<< + /Title (\376\377\0\103\0\40\0\101\0\120\0\111) + /Parent 166 0 R + /First 170 0 R + /Last 170 0 R + /Prev 167 0 R + /Count -1 + /A 63 0 R +>> endobj +170 0 obj +<< + /Title (\376\377\0\111\0\156\0\151\0\164\0\151\0\141\0\154\0\151\0\172\0\141\0\164\0\151\0\157\0\156) + /Parent 169 0 R + /A 65 0 R +>> endobj +171 0 obj +<< + /Title (\376\377\0\103\0\150\0\141\0\160\0\164\0\145\0\162\0\240\0\66\0\56\0\240\0\124\0\150\0\145\0\40\0\123\0\164\0\162\0\151\0\156\0\147\0\40\0\154\0\151\0\142\0\162\0\141\0\162\0\171) + /Parent 140 0 R + /First 172 0 R + /Last 175 0 R + /Prev 166 0 R + /Next 179 0 R + /Count -7 + /A 67 0 R +>> endobj +172 0 obj +<< + /Title (\376\377\0\123\0\161\0\165\0\151\0\162\0\162\0\145\0\154\0\40\0\101\0\120\0\111) + /Parent 171 0 R + /First 173 0 R + /Last 174 0 R + /Next 175 0 R + /Count -2 + /A 69 0 R +>> endobj +173 0 obj +<< + /Title (\376\377\0\107\0\154\0\157\0\142\0\141\0\154\0\40\0\163\0\171\0\155\0\142\0\157\0\154\0\163) + /Parent 172 0 R + /Next 174 0 R + /A 71 0 R +>> endobj +174 0 obj +<< + /Title (\376\377\0\122\0\145\0\147\0\145\0\170\0\160\0\40\0\143\0\154\0\141\0\163\0\163) + /Parent 172 0 R + /Prev 173 0 R + /A 73 0 R +>> endobj +175 0 obj +<< + /Title (\376\377\0\103\0\40\0\101\0\120\0\111) + /Parent 171 0 R + /First 176 0 R + /Last 178 0 R + /Prev 172 0 R + /Count -3 + /A 75 0 R +>> endobj +176 0 obj +<< + /Title (\376\377\0\111\0\156\0\151\0\164\0\151\0\141\0\154\0\151\0\172\0\141\0\164\0\151\0\157\0\156) + /Parent 175 0 R + /Next 177 0 R + /A 77 0 R +>> endobj +177 0 obj +<< + /Title (\376\377\0\106\0\157\0\162\0\155\0\141\0\164\0\164\0\151\0\156\0\147) + /Parent 175 0 R + /Prev 176 0 R + /Next 178 0 R + /A 79 0 R +>> endobj +178 0 obj +<< + /Title (\376\377\0\122\0\145\0\147\0\165\0\154\0\141\0\162\0\40\0\105\0\170\0\160\0\145\0\163\0\163\0\151\0\157\0\156\0\163) + /Parent 175 0 R + /Prev 177 0 R + /A 81 0 R +>> endobj +179 0 obj +<< + /Title (\376\377\0\103\0\150\0\141\0\160\0\164\0\145\0\162\0\240\0\67\0\56\0\240\0\124\0\150\0\145\0\40\0\101\0\165\0\170\0\40\0\154\0\151\0\142\0\162\0\141\0\162\0\171) + /Parent 140 0 R + /First 180 0 R + /Last 180 0 R + /Prev 171 0 R + /Next 182 0 R + /Count -2 + /A 83 0 R +>> endobj +180 0 obj +<< + /Title (\376\377\0\103\0\40\0\101\0\120\0\111) + /Parent 179 0 R + /First 181 0 R + /Last 181 0 R + /Count -1 + /A 85 0 R +>> endobj +181 0 obj +<< + /Title (\376\377\0\105\0\162\0\162\0\157\0\162\0\40\0\150\0\141\0\156\0\144\0\154\0\151\0\156\0\147) + /Parent 180 0 R + /A 87 0 R +>> endobj +182 0 obj +<< + /Title (\376\377\0\111\0\156\0\144\0\145\0\170) + /Parent 140 0 R + /Prev 179 0 R + /A 89 0 R +>> endobj +183 0 obj +<< /Type /Font +/Subtype /Type1 +/Name /F11 +/BaseFont /Courier-Bold +/Encoding /WinAnsiEncoding >> +endobj +184 0 obj +<< /Type /Font +/Subtype /Type1 +/Name /F1 +/BaseFont /Helvetica +/Encoding /WinAnsiEncoding >> +endobj +185 0 obj +<< /Type /Font +/Subtype /Type1 +/Name /F10 +/BaseFont /Courier-Oblique +/Encoding /WinAnsiEncoding >> +endobj +186 0 obj +<< /Type /Font +/Subtype /Type1 +/Name /F5 +/BaseFont /Times-Roman +/Encoding /WinAnsiEncoding >> +endobj +187 0 obj +<< /Type /Font +/Subtype /Type1 +/Name /F3 +/BaseFont /Helvetica-Bold +/Encoding /WinAnsiEncoding >> +endobj +188 0 obj +<< /Type /Font +/Subtype /Type1 +/Name /F9 +/BaseFont /Courier +/Encoding /WinAnsiEncoding >> +endobj +189 0 obj +<< /Type /Font +/Subtype /Type1 +/Name /F6 +/BaseFont /Times-Italic +/Encoding /WinAnsiEncoding >> +endobj +190 0 obj +<< /Type /Font +/Subtype /Type1 +/Name /F7 +/BaseFont /Times-Bold +/Encoding /WinAnsiEncoding >> +endobj +1 0 obj +<< /Type /Pages +/Count 28 +/Kids [6 0 R 8 0 R 10 0 R 12 0 R 91 0 R 93 0 R 95 0 R 97 0 R 99 0 R 101 0 R 103 0 R 105 0 R 107 0 R 109 0 R 111 0 R 113 0 R 115 0 R 117 0 R 119 0 R 121 0 R 123 0 R 125 0 R 127 0 R 129 0 R 131 0 R 133 0 R 135 0 R 138 0 R ] >> +endobj +2 0 obj +<< /Type /Catalog +/Pages 1 0 R + /Outlines 140 0 R + /PageMode /UseOutlines + >> +endobj +3 0 obj +<< +/Font << /F1 184 0 R /F11 183 0 R /F10 185 0 R /F5 186 0 R /F3 187 0 R /F9 188 0 R /F6 189 0 R /F7 190 0 R >> +/ProcSet [ /PDF /ImageC /Text ] >> +endobj +15 0 obj +<< +/S /GoTo +/D [91 0 R /XYZ 115.0 725.0 null] +>> +endobj +17 0 obj +<< +/S /GoTo +/D [93 0 R /XYZ 115.0 725.0 null] +>> +endobj +19 0 obj +<< +/S /GoTo +/D [93 0 R /XYZ 115.0 666.009 null] +>> +endobj +21 0 obj +<< +/S /GoTo +/D [93 0 R /XYZ 115.0 632.684 null] +>> +endobj +23 0 obj +<< +/S /GoTo +/D [93 0 R /XYZ 115.0 233.665 null] +>> +endobj +25 0 obj +<< +/S /GoTo +/D [97 0 R /XYZ 115.0 725.0 null] +>> +endobj +27 0 obj +<< +/S /GoTo +/D [97 0 R /XYZ 115.0 691.675 null] +>> +endobj +29 0 obj +<< +/S /GoTo +/D [97 0 R /XYZ 115.0 471.376 null] +>> +endobj +31 0 obj +<< +/S /GoTo +/D [99 0 R /XYZ 115.0 653.0 null] +>> +endobj +33 0 obj +<< +/S /GoTo +/D [103 0 R /XYZ 115.0 725.0 null] +>> +endobj +35 0 obj +<< +/S /GoTo +/D [103 0 R /XYZ 115.0 655.009 null] +>> +endobj +37 0 obj +<< +/S /GoTo +/D [103 0 R /XYZ 115.0 621.684 null] +>> +endobj +39 0 obj +<< +/S /GoTo +/D [103 0 R /XYZ 115.0 347.085 null] +>> +endobj +41 0 obj +<< +/S /GoTo +/D [105 0 R /XYZ 115.0 177.98 null] +>> +endobj +43 0 obj +<< +/S /GoTo +/D [105 0 R /XYZ 115.0 144.655 null] +>> +endobj +45 0 obj +<< +/S /GoTo +/D [107 0 R /XYZ 115.0 570.14 null] +>> +endobj +47 0 obj +<< +/S /GoTo +/D [111 0 R /XYZ 115.0 725.0 null] +>> +endobj +49 0 obj +<< +/S /GoTo +/D [111 0 R /XYZ 115.0 655.009 null] +>> +endobj +51 0 obj +<< +/S /GoTo +/D [111 0 R /XYZ 115.0 621.684 null] +>> +endobj +53 0 obj +<< +/S /GoTo +/D [113 0 R /XYZ 115.0 415.7 null] +>> +endobj +55 0 obj +<< +/S /GoTo +/D [113 0 R /XYZ 115.0 382.375 null] +>> +endobj +57 0 obj +<< +/S /GoTo +/D [115 0 R /XYZ 115.0 725.0 null] +>> +endobj +59 0 obj +<< +/S /GoTo +/D [115 0 R /XYZ 115.0 655.009 null] +>> +endobj +61 0 obj +<< +/S /GoTo +/D [115 0 R /XYZ 115.0 621.684 null] +>> +endobj +63 0 obj +<< +/S /GoTo +/D [115 0 R /XYZ 115.0 145.225 null] +>> +endobj +65 0 obj +<< +/S /GoTo +/D [115 0 R /XYZ 115.0 111.9 null] +>> +endobj +67 0 obj +<< +/S /GoTo +/D [119 0 R /XYZ 115.0 725.0 null] +>> +endobj +69 0 obj +<< +/S /GoTo +/D [119 0 R /XYZ 115.0 666.009 null] +>> +endobj +71 0 obj +<< +/S /GoTo +/D [119 0 R /XYZ 115.0 632.684 null] +>> +endobj +73 0 obj +<< +/S /GoTo +/D [121 0 R /XYZ 115.0 145.54 null] +>> +endobj +75 0 obj +<< +/S /GoTo +/D [123 0 R /XYZ 115.0 229.92 null] +>> +endobj +77 0 obj +<< +/S /GoTo +/D [123 0 R /XYZ 115.0 196.595 null] +>> +endobj +79 0 obj +<< +/S /GoTo +/D [125 0 R /XYZ 115.0 611.0 null] +>> +endobj +81 0 obj +<< +/S /GoTo +/D [125 0 R /XYZ 115.0 284.841 null] +>> +endobj +83 0 obj +<< +/S /GoTo +/D [133 0 R /XYZ 115.0 725.0 null] +>> +endobj +85 0 obj +<< +/S /GoTo +/D [133 0 R /XYZ 115.0 666.009 null] +>> +endobj +87 0 obj +<< +/S /GoTo +/D [133 0 R /XYZ 115.0 632.684 null] +>> +endobj +89 0 obj +<< +/S /GoTo +/D [135 0 R /XYZ 67.0 725.0 null] +>> +endobj +140 0 obj +<< + /First 142 0 R + /Last 182 0 R +>> endobj +141 0 obj +<< +/S /GoTo +/D [10 0 R /XYZ 115.0 725.0 null] +>> +endobj +143 0 obj +<< +/S /GoTo +/D [12 0 R /XYZ 115.0 715.0 null] +>> +endobj +xref +0 191 +0000000000 65535 f +0000054455 00000 n +0000054721 00000 n +0000054814 00000 n +0000000015 00000 n +0000000071 00000 n +0000000364 00000 n +0000000470 00000 n +0000001902 00000 n +0000002008 00000 n +0000002169 00000 n +0000002276 00000 n +0000003637 00000 n +0000003760 00000 n +0000004046 00000 n +0000054980 00000 n +0000004182 00000 n +0000055045 00000 n +0000004318 00000 n +0000055110 00000 n +0000004454 00000 n +0000055177 00000 n +0000004590 00000 n +0000055244 00000 n +0000004725 00000 n +0000055311 00000 n +0000004861 00000 n +0000055376 00000 n +0000004997 00000 n +0000055443 00000 n +0000005132 00000 n +0000055510 00000 n +0000005268 00000 n +0000055575 00000 n +0000005404 00000 n +0000055641 00000 n +0000005540 00000 n +0000055709 00000 n +0000005676 00000 n +0000055777 00000 n +0000005812 00000 n +0000055845 00000 n +0000005948 00000 n +0000055912 00000 n +0000006084 00000 n +0000055980 00000 n +0000006220 00000 n +0000056047 00000 n +0000006356 00000 n +0000056113 00000 n +0000006492 00000 n +0000056181 00000 n +0000006628 00000 n +0000056249 00000 n +0000006764 00000 n +0000056315 00000 n +0000006900 00000 n +0000056383 00000 n +0000007036 00000 n +0000056449 00000 n +0000007172 00000 n +0000056517 00000 n +0000007308 00000 n +0000056585 00000 n +0000007444 00000 n +0000056653 00000 n +0000007580 00000 n +0000056719 00000 n +0000007716 00000 n +0000056785 00000 n +0000007852 00000 n +0000056853 00000 n +0000007988 00000 n +0000056921 00000 n +0000008124 00000 n +0000056988 00000 n +0000008260 00000 n +0000057055 00000 n +0000008396 00000 n +0000057123 00000 n +0000008532 00000 n +0000057189 00000 n +0000008668 00000 n +0000057257 00000 n +0000008804 00000 n +0000057323 00000 n +0000008940 00000 n +0000057391 00000 n +0000009075 00000 n +0000057459 00000 n +0000009211 00000 n +0000010274 00000 n +0000010382 00000 n +0000012558 00000 n +0000012666 00000 n +0000014455 00000 n +0000014563 00000 n +0000015977 00000 n +0000016085 00000 n +0000017981 00000 n +0000018089 00000 n +0000019293 00000 n +0000019403 00000 n +0000020942 00000 n +0000021052 00000 n +0000022898 00000 n +0000023008 00000 n +0000024325 00000 n +0000024435 00000 n +0000024980 00000 n +0000025090 00000 n +0000026334 00000 n +0000026444 00000 n +0000027781 00000 n +0000027891 00000 n +0000029616 00000 n +0000029726 00000 n +0000030405 00000 n +0000030515 00000 n +0000032245 00000 n +0000032355 00000 n +0000034125 00000 n +0000034235 00000 n +0000036185 00000 n +0000036295 00000 n +0000038121 00000 n +0000038231 00000 n +0000039670 00000 n +0000039780 00000 n +0000041436 00000 n +0000041546 00000 n +0000042107 00000 n +0000042217 00000 n +0000043217 00000 n +0000043327 00000 n +0000044803 00000 n +0000044929 00000 n +0000044950 00000 n +0000045648 00000 n +0000045774 00000 n +0000057524 00000 n +0000057578 00000 n +0000045795 00000 n +0000057644 00000 n +0000046049 00000 n +0000046250 00000 n +0000046486 00000 n +0000046833 00000 n +0000047031 00000 n +0000047199 00000 n +0000047343 00000 n +0000047499 00000 n +0000047668 00000 n +0000047833 00000 n +0000048107 00000 n +0000048407 00000 n +0000048605 00000 n +0000048773 00000 n +0000048940 00000 n +0000049096 00000 n +0000049265 00000 n +0000049415 00000 n +0000049715 00000 n +0000049913 00000 n +0000050066 00000 n +0000050222 00000 n +0000050376 00000 n +0000050688 00000 n +0000050886 00000 n +0000051039 00000 n +0000051195 00000 n +0000051349 00000 n +0000051661 00000 n +0000051859 00000 n +0000052027 00000 n +0000052183 00000 n +0000052339 00000 n +0000052508 00000 n +0000052668 00000 n +0000052860 00000 n +0000053154 00000 n +0000053295 00000 n +0000053448 00000 n +0000053563 00000 n +0000053676 00000 n +0000053785 00000 n +0000053901 00000 n +0000054012 00000 n +0000054126 00000 n +0000054233 00000 n +0000054345 00000 n +trailer +<< +/Size 191 +/Root 2 0 R +/Info 4 0 R +>> +startxref +57710 +%%EOF diff --git a/doc/squirrel3.chm b/doc/squirrel3.chm new file mode 100644 index 0000000..dabd0f1 Binary files /dev/null and b/doc/squirrel3.chm differ diff --git a/doc/squirrel3.pdf b/doc/squirrel3.pdf new file mode 100644 index 0000000..0cab441 --- /dev/null +++ b/doc/squirrel3.pdf @@ -0,0 +1,6712 @@ +%PDF-1.3 +%ª«¬­ +4 0 obj +<< /Type /Info +/Producer (FOP 0.20.5) >> +endobj +5 0 obj +<< /Length 243 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +Gaqco]5GJN&4QKpMCG*Jam=@[&d8W<1grJ1_H6oAjG1#F^)n`B'%V.pRWIme'^o68b$YJni^j[o`**_BK`i;iK!YkBH#S>=$l3:[LLU:190%(b"tSg6aJj8XBTu0ZbpUfle\&h- +endstream +endobj +6 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 5 0 R +>> +endobj +7 0 obj +<< /Length 1402 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +GasIh?#u`2'Rf^W:jL2_)+Hm@j:)i6mio8laegunJCqfs6J;I!49'c!k3KG`POc\6\=][;?])BYpqG0%ALrlg58oKVO+AL7fM@VDFX3$Dl"DEEWZq6dl*#I&a+^<o_f;-Qs8X9orV3pdsC-ELIK.r%_HA#Q'mBqHNN?A#8IR;H1V-(!E+0lLNuB.as4J36c.L7kYq?0CamP7i[_o$?Y;j)n4,T^H#%EnqgTF'RpaCI;4U?HHC0\ig1d%JO@oa`&beMd[b6T[Fl>fr%fW@a1V(p=*:?.l=ctVW$=`LWNY&,FII?pUebN,S!LUo3'ED*3WVrTAOY.Gq]\RhNpJ1g59]W\#"agc6c_\F`XpT)U@9"q+'r!rV0@!E;:@pfG)[_qle0VO]P94SFc^-f,&kDAj-o0D:'KtpBTL^h=fJgSkcil59[A3-#Z_jK!s=dC2;d\Pl-!&\JSN[E2dg9\jD;29s?o2-b]"*^j5aGsP)E$+W.8'-6Lq&AKE=mHf4O10iG8rAVeX.u4UA;X.'?3me-0\PmLXlB_1)>:@?MCI2V[UUP/jYGN5NG89+WZK/9V;057L<+N\11-D+,eUNn=cb%3C7qhAKAq3=i_;=EiG@CVoXks6XrV:lMI(?IXG)VD,qpi(/>'=F'u6tV=9dInLGGGp9"1Y%0qS2t2H1R'6**;%-n8p@[p`Xqk,i&@CQ/`7/UZUb%%j:!/KEMhR??=r\A^_b!.)3F;0":G;W4~> +endstream +endobj +8 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 7 0 R +>> +endobj +9 0 obj +<< /Length 71 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +Garg^iGoCd.c`?]8EV`b1=.gR0K1`91K?+0ZOMGdU/Zh'Y!=Te%#&:?HH*JE! +endstream +endobj +10 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 9 0 R +>> +endobj +11 0 obj +<< /Length 1795 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +Gb"/l:NN$a(rl%A.6)Io_&N"O">fEg:?,+'9J^Oom@icqYk"4h#$21hrU#LG]4`5/\eE,Gh8d8-O9&"0pQ9^n830u!St.ZmLcGp8`Pp&B<\r`[oe1:fSU4*C7.Z63cJm"Bqd^;Rc_Tls;Bb1b:UkID>jP_0..U9ujk=kVE>CdjYP'!reShGE]Ql$$\ffqiS-[QUQH]"pHsM3l.PFf,XHG=jo"((]JM,J31k,a]5bNNn37g])-+]j89Q]Pe/bN7Ob3gI3o2QO/F9rKVYouE^@mU5"3[,KnM88G!i^Ij0e[R;.Gl[jI#]p'r`]rd[?M&Nm`W)QMfPT"H$aDrA8Lo3JO%7MD1qN[*hHMpa]Ea:=!e6hbo\=]!"]Dm'u?Q/amhJDij+#b2,?o@qB->_.Pr\'`3M&1/QJ7C>l>7c/0kK(HB+bAbN4Kn>C?9"=a!J(`QL=O,LSXrus2Kj%oD\N`goH4HKdH;.j)FDo#?,h/a'-GGNG8paS0F`dt[2br+ah1bKDOr6IW;[B-Ba+hGH8IVfqW360IaC=1;D"B'+H3(b#D!AVL=O,H%%`AM-"FW#%'*#dTHg:!]jQt6k57ll+5C]?iHKPjQ-9oJY`oNS/jQ)WUXg-ccn\8.]TGe9c7QJuCX2CY0akrKH@?Fh)l)@U>;1Df#aK.[UY5SH_gE$Z:hb/F&5[^bB3`UHhGJrb?#pP_1d,Rg-0u^cpm-F"/1V@()dj3j&.%n^$/mu#=m@e/XjaT$Zf4o-[6%uWU9PXA!_n<%6]>1q^t2"pD1':Yk`l@'5YjnW4XeqJ]#iD[pSrX8$Z67LkdN6*k/XHC(@Y*%0-Ml-lSBQ)Hi(e--JpBY0I,Y_`&.j-tsnCUgGfBb>NSSb02i,Oc]WpNh,klLZ!>.1Pr6UJrc5DW@_;r,`>[8Ys+&m>6b4h)F"8gh/TAP?FZ&aHk>Krj3OXtDTK(%I!T7L15u?d%[6U>/%5q)V7M)@`+(opncdI0hZGiuZmY5>g@F(m4[?"ZTSlh@=>?5AOWm!9mHg=1EqH7PciMK_!Ed)%8lQmN&hSi0-/Cc:tSN4dELdHK+H+OHIu:B)Y``/Ag4JSYMmbqq?(]EWp68AcSk=Y@.l=^g[#c*N7igLY7*)1<'0_DE7oTsubuQSOcZ.*&3(+OGf+hC(>E,.NiI1UHW(*>SbZIC\W2Xm3Q(bl4/Yc>'6*OL=Fo1A;f,fW.S8k@4/>ltg\9`dlB +endstream +endobj +12 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 11 0 R +/Annots 13 0 R +>> +endobj +13 0 obj +[ +14 0 R +16 0 R +18 0 R +20 0 R +22 0 R +24 0 R +26 0 R +28 0 R +30 0 R +32 0 R +34 0 R +36 0 R +38 0 R +40 0 R +42 0 R +44 0 R +46 0 R +48 0 R +50 0 R +52 0 R +54 0 R +56 0 R +58 0 R +60 0 R +62 0 R +64 0 R +66 0 R +68 0 R +70 0 R +72 0 R +74 0 R +76 0 R +78 0 R +80 0 R +82 0 R +84 0 R +86 0 R +88 0 R +90 0 R +92 0 R +94 0 R +96 0 R +98 0 R +100 0 R +102 0 R +104 0 R +106 0 R +108 0 R +110 0 R +112 0 R +114 0 R +116 0 R +118 0 R +] +endobj +14 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 120.0 655.001 179.44 645.001 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 15 0 R +/H /I +>> +endobj +16 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 120.0 644.001 184.15 634.001 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 17 0 R +/H /I +>> +endobj +18 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 144.0 633.001 211.48 623.001 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 19 0 R +/H /I +>> +endobj +20 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 168.0 622.001 209.1 612.001 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 21 0 R +/H /I +>> +endobj +22 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 168.0 611.001 209.1 601.001 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 23 0 R +/H /I +>> +endobj +24 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 168.0 600.001 207.43 590.001 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 25 0 R +/H /I +>> +endobj +26 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 168.0 589.001 219.38 579.001 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 27 0 R +/H /I +>> +endobj +28 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 168.0 578.001 198.55 568.001 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 29 0 R +/H /I +>> +endobj +30 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 168.0 567.001 211.34 557.001 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 31 0 R +/H /I +>> +endobj +32 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 144.0 556.001 233.7 546.001 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 33 0 R +/H /I +>> +endobj +34 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 168.0 545.001 196.32 535.001 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 35 0 R +/H /I +>> +endobj +36 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 168.0 534.001 188.56 524.001 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 37 0 R +/H /I +>> +endobj +38 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 168.0 523.001 192.45 513.001 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 39 0 R +/H /I +>> +endobj +40 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 168.0 512.001 185.78 502.001 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 41 0 R +/H /I +>> +endobj +42 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 168.0 501.001 187.45 491.001 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 43 0 R +/H /I +>> +endobj +44 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 168.0 490.001 190.77 480.001 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 45 0 R +/H /I +>> +endobj +46 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 168.0 479.001 191.32 469.001 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 47 0 R +/H /I +>> +endobj +48 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 168.0 468.001 203.56 458.001 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 49 0 R +/H /I +>> +endobj +50 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 168.0 457.001 189.67 447.001 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 51 0 R +/H /I +>> +endobj +52 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 168.0 446.001 224.94 436.001 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 53 0 R +/H /I +>> +endobj +54 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 168.0 435.001 207.98 425.001 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 55 0 R +/H /I +>> +endobj +56 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 168.0 424.001 203.54 414.001 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 57 0 R +/H /I +>> +endobj +58 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 168.0 413.001 196.32 403.001 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 59 0 R +/H /I +>> +endobj +60 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 168.0 402.001 238.24 392.001 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 61 0 R +/H /I +>> +endobj +62 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 144.0 391.001 218.72 381.001 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 63 0 R +/H /I +>> +endobj +64 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 168.0 380.001 206.32 370.001 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 65 0 R +/H /I +>> +endobj +66 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 144.0 369.001 187.89 359.001 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 67 0 R +/H /I +>> +endobj +68 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 168.0 358.001 191.89 348.001 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 69 0 R +/H /I +>> +endobj +70 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 168.0 347.001 268.01 337.001 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 71 0 R +/H /I +>> +endobj +72 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 168.0 336.001 193.0 326.001 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 73 0 R +/H /I +>> +endobj +74 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 168.0 325.001 190.21 315.001 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 75 0 R +/H /I +>> +endobj +76 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 168.0 314.001 202.44 304.001 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 77 0 R +/H /I +>> +endobj +78 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 168.0 303.001 191.88 293.001 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 79 0 R +/H /I +>> +endobj +80 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 168.0 292.001 188.0 282.001 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 81 0 R +/H /I +>> +endobj +82 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 168.0 281.001 276.3 271.001 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 83 0 R +/H /I +>> +endobj +84 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 168.0 270.001 250.49 260.001 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 85 0 R +/H /I +>> +endobj +86 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 168.0 259.001 236.6 249.001 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 87 0 R +/H /I +>> +endobj +88 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 168.0 248.001 202.99 238.001 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 89 0 R +/H /I +>> +endobj +90 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 168.0 237.001 191.33 227.001 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 91 0 R +/H /I +>> +endobj +92 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 168.0 226.001 189.11 216.001 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 93 0 R +/H /I +>> +endobj +94 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 168.0 215.001 190.22 205.001 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 95 0 R +/H /I +>> +endobj +96 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 168.0 204.001 251.6 194.001 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 97 0 R +/H /I +>> +endobj +98 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 144.0 193.001 192.33 183.001 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 99 0 R +/H /I +>> +endobj +100 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 168.0 182.001 290.1 172.001 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 101 0 R +/H /I +>> +endobj +102 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 168.0 171.001 207.43 161.001 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 103 0 R +/H /I +>> +endobj +104 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 168.0 160.001 238.26 150.001 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 105 0 R +/H /I +>> +endobj +106 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 168.0 149.001 189.66 139.001 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 107 0 R +/H /I +>> +endobj +108 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 168.0 138.001 238.81 128.001 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 109 0 R +/H /I +>> +endobj +110 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 144.0 127.001 170.66 117.001 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 111 0 R +/H /I +>> +endobj +112 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 168.0 116.001 219.67 106.001 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 113 0 R +/H /I +>> +endobj +114 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 168.0 105.001 218.83 95.001 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 115 0 R +/H /I +>> +endobj +116 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 168.0 94.001 218.84 84.001 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 117 0 R +/H /I +>> +endobj +118 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 144.0 83.001 171.21 73.001 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 119 0 R +/H /I +>> +endobj +120 0 obj +<< /Length 2042 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +Gb"/l?#SIU(kqGW.ss4m(\L1YPcWVMBoui;=R0i@_dLh(D$uUW=!).g?U&tlU_>cR\datmP5rQ8eT.J$kNF4;8D_W^5JH8i@SNupHo84LlOb"=jYn%j`l`odZ)>M\cf=O;2m3VNk@(*janV.GH2536dh91p!eETGfsPhT&8s?'F$0J*)i?GP%)jF:%&NZ]qYWVTO[qofOE#=+RfS)cMdD^Aj&n%VcPKGX4l*(>iIO5rTiTT"l'A^Bm3R0"WZY8VX_;.A>H5^t9iNZDXq0ZOnR@J._])j,l9>:4&uk&(?2hJ5=T9T)ARKmHjd0g6Z`J#%Em("WjVJr[NIa@X5W]##h#cZ?/eq;6[JV(7)N&)ORo0ho#7tPke0A\ilm4e2@AG3?9#!p'[bHM[:44'(&Els=oVnYPist0t8`)r\bF5?7Fn3][JO&Bf8'Rp1+)H+62No@12jBm2:-bIFV]N5YH;(H7b&X3R\lRb-4nX5R5hAOgrArd2[<2--6#C-Nes`./jh6*-9*^#5h^uJ/`F/&p=K>r7<`3SWRX8Dm51_)dDn'YZh(6.q=&M7H-'F8d]e7/JPBAoFEDAe'3J3X41*Z\0"J:!*]OfTlsLr2e\.`pER%=6hqTRS)qB;s@W-#;h&g3f)V;0QbRf/rY:K0Z+$TVE:O4P,E"VL?MqAjGL*a'k@V#QbHhG)G_5[<"urf7'(GUDEJ`\WWq._e[IbOU_G`"mm#M3Yft'*I%BP7WQ1L#)HYP$O"%]g:7IWG)mNhF!/gEe'9)Ie+Cl7BtQk]X!Nk[$ser;&Ent'F9hFUf87/Z\onYM@]9bI#kVsD_K:fWU#bAf9'W5i;29ZeQUO&45]r`=&]gnn!_+n4#m+B\olu(j_hea5"I1(%mh,c7G3\T,_Mt/3@Tf6oXJo9M\O3n0&-t*Xn$$nQEY0,9PQ69;PBu$$0k-[Kf<%_Ie_+&X"U)D9lELJ(j>-[Y4/o*2,*rT;>p]0R"Z8'&eVW5D^b#]sL^Z[ugo6If+EHUcdGD"_seRLpCP!.iF^H?;BH#8=j^))#Q)S]7r11'f]r3i_B>\F&SNib]8sq5[=dp++Xq$K^`cLERLRl@L*eDXZqWrV_<:ELZdo`usIs\6lF-pm/_WW3^iJc:#P4R88MFQ;ZYepWu6W@82I=?[DQYQqS_&Ief4"ncQcd0Zu]($8q-s8I._!/b4f*tW*.e>$i_@pJVb;>le,Z2\fA/KTO=GX*BJT:aWD1;YTKB*BD0s;;*=EU"Mb$f!r^kWPG4Ji>8Yu.sQ_]H@J:dNSfe.F_BJc9<$dVd$-3X'\.%icV^SJgJ1R@f5gC7'iu/:dd&%@CJQ]Vk@(G9T'tptb<#l3N\i#(b'PG2d/*ih,K%fNfsqDA;;hp@#S0!-'b*BR$nJ4DuNq59G:l=l]1RRB>^/1?E"HZW0mQa/dUkUYGV$)lbii]R8])L$1Fc')f^0\WWpk^>U/PKds+1(:l-7.Gt0E/"dY0O)m?nmI,PSDtGsi6\[T~> +endstream +endobj +121 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 120 0 R +/Annots 122 0 R +>> +endobj +122 0 obj +[ +123 0 R +125 0 R +127 0 R +129 0 R +131 0 R +133 0 R +135 0 R +137 0 R +139 0 R +141 0 R +143 0 R +145 0 R +147 0 R +149 0 R +151 0 R +153 0 R +155 0 R +157 0 R +159 0 R +161 0 R +163 0 R +165 0 R +167 0 R +169 0 R +171 0 R +173 0 R +175 0 R +177 0 R +179 0 R +181 0 R +183 0 R +185 0 R +187 0 R +189 0 R +191 0 R +193 0 R +195 0 R +197 0 R +199 0 R +201 0 R +203 0 R +205 0 R +207 0 R +209 0 R +211 0 R +213 0 R +215 0 R +217 0 R +219 0 R +221 0 R +223 0 R +225 0 R +227 0 R +229 0 R +231 0 R +233 0 R +235 0 R +237 0 R +] +endobj +123 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 144.0 719.0 183.45 709.0 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 124 0 R +/H /I +>> +endobj +125 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 168.0 708.0 250.49 698.0 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 126 0 R +/H /I +>> +endobj +127 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 168.0 697.0 224.39 687.0 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 128 0 R +/H /I +>> +endobj +129 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 168.0 686.0 318.27 676.0 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 130 0 R +/H /I +>> +endobj +131 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 168.0 675.0 249.93 665.0 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 132 0 R +/H /I +>> +endobj +133 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 168.0 664.0 224.37 654.0 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 134 0 R +/H /I +>> +endobj +135 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 168.0 653.0 223.82 643.0 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 136 0 R +/H /I +>> +endobj +137 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 144.0 642.0 174.0 632.0 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 138 0 R +/H /I +>> +endobj +139 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 168.0 631.0 236.6 621.0 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 140 0 R +/H /I +>> +endobj +141 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 168.0 620.0 228.83 610.0 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 142 0 R +/H /I +>> +endobj +143 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 168.0 609.0 212.98 599.0 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 144 0 R +/H /I +>> +endobj +145 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 168.0 598.0 222.44 588.0 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 146 0 R +/H /I +>> +endobj +147 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 144.0 587.0 187.87 577.0 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 148 0 R +/H /I +>> +endobj +149 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 144.0 576.0 251.78 566.0 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 150 0 R +/H /I +>> +endobj +151 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 168.0 565.0 207.45 555.0 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 152 0 R +/H /I +>> +endobj +153 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 168.0 554.0 223.55 544.0 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 154 0 R +/H /I +>> +endobj +155 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 168.0 543.0 254.94 533.0 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 156 0 R +/H /I +>> +endobj +157 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 144.0 532.0 176.21 522.0 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 158 0 R +/H /I +>> +endobj +159 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 168.0 521.0 223.27 511.0 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 160 0 R +/H /I +>> +endobj +161 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 144.0 510.0 214.24 500.0 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 162 0 R +/H /I +>> +endobj +163 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 144.0 499.0 187.88 489.0 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 164 0 R +/H /I +>> +endobj +165 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 144.0 488.0 198.44 478.0 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 166 0 R +/H /I +>> +endobj +167 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 168.0 477.0 184.11 467.0 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 168 0 R +/H /I +>> +endobj +169 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 168.0 466.0 185.22 456.0 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 170 0 R +/H /I +>> +endobj +171 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 168.0 455.0 204.11 445.0 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 172 0 R +/H /I +>> +endobj +173 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 168.0 444.0 199.67 434.0 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 174 0 R +/H /I +>> +endobj +175 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 168.0 433.0 187.44 423.0 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 176 0 R +/H /I +>> +endobj +177 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 168.0 422.0 186.89 412.0 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 178 0 R +/H /I +>> +endobj +179 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 168.0 411.0 188.56 401.0 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 180 0 R +/H /I +>> +endobj +181 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 168.0 400.0 185.78 390.0 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 182 0 R +/H /I +>> +endobj +183 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 168.0 389.0 203.56 379.0 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 184 0 R +/H /I +>> +endobj +185 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 168.0 378.0 190.78 368.0 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 186 0 R +/H /I +>> +endobj +187 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 168.0 367.0 198.55 357.0 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 188 0 R +/H /I +>> +endobj +189 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 168.0 356.0 190.22 346.0 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 190 0 R +/H /I +>> +endobj +191 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 168.0 345.0 187.44 335.0 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 192 0 R +/H /I +>> +endobj +193 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 168.0 334.0 199.66 324.0 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 194 0 R +/H /I +>> +endobj +195 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 168.0 323.0 193.0 313.0 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 196 0 R +/H /I +>> +endobj +197 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 168.0 312.0 203.56 302.0 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 198 0 R +/H /I +>> +endobj +199 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 168.0 301.0 208.55 291.0 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 200 0 R +/H /I +>> +endobj +201 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 168.0 290.0 222.43 280.0 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 202 0 R +/H /I +>> +endobj +203 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 144.0 279.0 214.84 269.0 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 204 0 R +/H /I +>> +endobj +205 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 168.0 268.0 231.06 258.0 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 206 0 R +/H /I +>> +endobj +207 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 168.0 257.0 237.7 247.0 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 208 0 R +/H /I +>> +endobj +209 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 120.0 246.0 210.83 236.0 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 210 0 R +/H /I +>> +endobj +211 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 144.0 235.0 232.04 225.0 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 212 0 R +/H /I +>> +endobj +213 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 144.0 224.0 177.88 214.0 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 214 0 R +/H /I +>> +endobj +215 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 144.0 213.0 271.76 203.0 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 216 0 R +/H /I +>> +endobj +217 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 144.0 202.0 222.04 192.0 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 218 0 R +/H /I +>> +endobj +219 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 144.0 191.0 281.49 181.0 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 220 0 R +/H /I +>> +endobj +221 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 144.0 180.0 215.93 170.0 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 222 0 R +/H /I +>> +endobj +223 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 144.0 169.0 222.61 159.0 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 224 0 R +/H /I +>> +endobj +225 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 144.0 158.0 184.27 148.0 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 226 0 R +/H /I +>> +endobj +227 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 168.0 147.0 223.27 137.0 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 228 0 R +/H /I +>> +endobj +229 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 168.0 136.0 245.5 126.0 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 230 0 R +/H /I +>> +endobj +231 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 144.0 125.0 237.88 115.0 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 232 0 R +/H /I +>> +endobj +233 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 144.0 114.0 218.45 104.0 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 234 0 R +/H /I +>> +endobj +235 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 144.0 103.0 216.22 93.0 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 236 0 R +/H /I +>> +endobj +237 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 144.0 92.0 222.04 82.0 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 238 0 R +/H /I +>> +endobj +239 0 obj +<< /Length 907 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +Gb"/k:Qq5$(rl#n$BBE\,pWLRTPG[bPYn'-"6YRU^H\!MLMD*_gi>Df"`"^;hL(fNXPd""N8UApT`G1b(KFq')Tih02`K"*OiKPW=O_HJb.-c*u5X7U7aTXB#?!s2+2^7?]]nuM<_ZKrACA!dVAS[pfIWAf"jP-?1.;h%KQ?Qa0WY6_M%g3.Dkc_oHHHkG>\/,+hlmkj=U]*[P.Xoce6[>M3l!]F<5WSuQW(hSeZh-?nN>f,[4^;Jgf-_"1"E[dg1nppo!^MP)U]tMY@1j8t4W#<7CS[_]LWulO1c"$rdD"O15.C)*>:p(P`QpS?*RV$F!sE_6F=cF6f3J(!^]_XEfQSRgr+,eD:U#9&or*CkY(rUs0Jt;oG>-<7dLKXHBrZiVQZqNsjSXOYSdErQ%[ps'_RAs:Yf"'aecPt7%r.GYRFJ(cAEkMpSGsEk[1*6AoF.\lY3IHg2f\'a#&e82GQBb>-VGdcMnc*h<=Pr7/b%G"#4Fp"2%eU2UD2ru~> +endstream +endobj +240 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 239 0 R +/Annots 241 0 R +>> +endobj +241 0 obj +[ +242 0 R +244 0 R +246 0 R +248 0 R +250 0 R +252 0 R +254 0 R +256 0 R +258 0 R +260 0 R +262 0 R +264 0 R +266 0 R +268 0 R +270 0 R +272 0 R +274 0 R +] +endobj +242 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 144.0 719.0 269.81 709.0 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 243 0 R +/H /I +>> +endobj +244 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 144.0 708.0 250.64 698.0 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 245 0 R +/H /I +>> +endobj +246 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 144.0 697.0 214.54 687.0 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 247 0 R +/H /I +>> +endobj +248 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 144.0 686.0 398.68 676.0 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 249 0 R +/H /I +>> +endobj +250 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 144.0 675.0 208.69 665.0 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 251 0 R +/H /I +>> +endobj +252 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 120.0 664.0 189.14 654.0 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 253 0 R +/H /I +>> +endobj +254 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 144.0 653.0 209.82 643.0 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 255 0 R +/H /I +>> +endobj +256 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 144.0 642.0 181.78 632.0 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 257 0 R +/H /I +>> +endobj +258 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 144.0 631.0 212.6 621.0 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 259 0 R +/H /I +>> +endobj +260 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 144.0 620.0 259.81 610.0 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 261 0 R +/H /I +>> +endobj +262 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 144.0 609.0 164.56 599.0 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 263 0 R +/H /I +>> +endobj +264 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 144.0 598.0 229.83 588.0 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 265 0 R +/H /I +>> +endobj +266 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 144.0 587.0 233.15 577.0 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 267 0 R +/H /I +>> +endobj +268 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 144.0 576.0 226.77 566.0 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 269 0 R +/H /I +>> +endobj +270 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 144.0 565.0 217.59 555.0 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 271 0 R +/H /I +>> +endobj +272 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 144.0 554.0 208.14 544.0 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 273 0 R +/H /I +>> +endobj +274 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 120.0 543.0 142.77 533.0 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 275 0 R +/H /I +>> +endobj +276 0 obj +<< /Length 726 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +GarnUa_oie&A@B[G]]$LeRgDR-:i[\&erluk^f$h'G2r)76,M*^=3orJdV[t]]Y^AbjZ&`9CL%sN2"8:o,*aP(Eh^k-nrCIAW\(-1b\b`a\^+,YJX:s3t:Hb*MY1WM``CcF9qgsr[,"8oh]?P`?"f7b4"JO'++i*c()"M9Xe&2d'@SZspI@s151\p$6mJ`H'sV)ou[_OOOjS5:cXJ-e>?WeR)X!OZLG[.YAT(=^G::sIotd8u3KH?5I>Ot?dh%H/#U+m9^-EM05Z%u[1'd@m8Fh_J/IZ#3uCo^qV%P='?J;I-ce)2n?Df"0]5)L>%)_!J!KLHRfW(iU&`$>$QefQE-RGgs[WPL6jFN^%mOWKr;'gKXg!o>VGLG7J/l_'91H4EF)E-L!L9$Vt=\I5XRD#jj9*0F-ouns[1p?IQ%ZYW,Ao6#rI-i^pKK\!ap\,G&Z3GfXn[\;KkGNDO1.srTF3.qt`_q=*mt^X>mN'P^(uOsiRuW-RnE.8`?f]S*p^\5kD&i~> +endstream +endobj +277 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 276 0 R +>> +endobj +278 0 obj +<< /Length 1542 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +Gasap>Ar7S'Roe[:]iOGPF0o!OsRrqT`MG&.u*k6BkG^)AJ(1V=/+]abP'[\M3N:]aE-=,F!8lkj5EN(_eeoCehLtWKqW##dYVZh-^J1uT4J-`1(?I,ORECnCh5`!rg_q)-fmF"C'Ocs68S1l;]GE&=[r7B*4'49QbrT4b^L-14i9$DBT]GjA_E'ZpK_;5Oj#]+B[t&k)UIXdQX";pWb!g38L5hFH:8ZQRZK!Ol%2l]G#V\cn[$e$97W5-0]P!m^*@dP-/,aUE&CMNGd(&%WT,2Op=Tm.4&PJ&8X!VO_]4e)lL,`3DC(mFK'.+ca8FXR'/D0J5G!'s1WsD9M8kNKA?1O$P3o+pPJ\[+q>mlQ^LMA9KY6rA/HKZCj:7Uk//L*6asW##@'uehs5E'&'H^i)$9ioBFg^\:^hI'A5_qlpBT[@A%DkHg2HQHh64Cf!7Q4%A:W)lnT\dVoLkc9@7^X^VX8g(m%$UbS3_WV#%&!9="J3U`D_6.7^G,fBK.[+PM10"lLm\jV2K&f=0T)qLrYe^6R?'N[]7Uq.`'4I(L_g,ZW2c7WSWsD^idAGeD9E2.$D0Y>h"G#?fc3@M0JoGW5^@Uq^=jmBu"9!O.]`g)L#3l*gndCQZ"nKn +endstream +endobj +279 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 278 0 R +>> +endobj +280 0 obj +<< /Length 1625 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +Gau0D=`<=Y&:XAW&@)geZ8G!Ae5`0WAf#5*MkWHKUG$U.BUO$se_s'i-3krg:O'MWdoq0[EiH`r5PtBclHIN%^0Yj]%"6&Vb=-(5`["V;03u&^l*5P'QSUU28g_PYo"lP[+K&Da]\PFKIGiR=d1SNMBD6+tgs5nR*o^JNlHhO7L6kK'NTR0/i:PSN#oDIE6k!m+69h&qs:a7[KJ%0O3K#V(_F#V)JtOEB$MU>WD.3E4BqPHB(,uK`C)BpugS>Q%,Yba'mVqnJJaWPUh\Pf!nR&0L%4Qa$EO^5fb`H+G'7giV5AFE]/pZ9=u2N:O.,'CF5^iV+hIsbGGAHMuuJjmV8/0qi:73dnp*0AA/+hPCET>ks#ssk6OssP1M$bE*Rs0QH;nek048Iid.F5L:'%#E7S_"X%h%&>!JE&'OT1'K6bE+EP?]uMK7pH5&^&[99phYXX9@/M;:G'"%GE(@_8TX)(>*9C"Oh1KW%`5;SJffnkj'^WG1$SEV!SGC:7iB9;H@25H5'[g_Y";O4A]C+f2e5gZAP;kLF\(;,n#cMT?Af^laF4IN?'U)m[-f$eRq$=dc7sKPlj27%.^6>],jBUEYkL7)M?YXX-j!Kmom#f8A]gi!C)s--.i&H%(FB6A+>oKTZaj$#R9JZF57q8_ZE8THZ4Tl`3t[j`"[-Y"L=D74a>:C.u'QO*DC[W.:iA?;408/US8C#g7C_DMai6NjIn0gb!+1MU\G8;oklM9LGd-fk*deU+P>m_K`h5hY*8&b%J,]Ssj,6W<8RuLR%bZisp-W)`;5t%EB]"4mT8Rm-=FH^jVib#6N%L/^ko.0#_U0MAMM\`K>O"6m@CBmcKSB>IF?KqA2aE+m'I%49o#2^dEP0fI]nP5]5=b<")B$!Too\#o!3XaI23Ju55ZpFtc5.=":YA2mHh@5dD"r4,1e2:5XdKdeKpO1niU@aJ"[P>n%J`M1YKte/I:;>pT0*RT9ITZ_0FPEgN#R%msdE6QPbX&],+[3Cs7V'C!]o\bEU^GGAP..Dgb7*h\?@CM?~> +endstream +endobj +281 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 280 0 R +>> +endobj +282 0 obj +<< /Length 1836 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +Gau0D=c_;q&:WMD+o#VmOUYC$jT5IGoDm]>GY*$9ql@sqV>4T:LgJPUZ3]tNsLh+ci'n3?DoE*t;NO9A3ph0=G,XXc$m]shE*/DR5McF:1=2-3a3ZsFoMQ\ak6FtTD5/d/4,LUVI+kAR!lH7ROF7]0h:C:%7^K("sMpYJ-kqH*/5o"aa+PRROb^+;Y(RV)%JeujCtFjENiQ:nO+@XmXudC,Q$I\M_F3U3sn:)QbA[lJ&7Z6WSCBMEt!#?M3<^d2\te5"1c9,h3a\is9ZTWke6:"rrLGKb)^hn%;JQ84DXAhVY'@W&=KC.A+9hbh-MV@<&0X2nC>B=g7Gqn3;jALQInlE"9'+^D8XZNNo/X>8]%Pc\OXq@Xf$[BJH"[-:>I9S,V[>;5#/JD*+K3B'X;.:+eC+A+j?PiL@//4l5BIQW'K'(^?3Bp>d7K-X)\m&0^,#P>+D![`Y0HbgtC(!82Z:88B2a76%O?&-AZ9IV;HpF&,m?-A>ID;XDJ=Edi59MZ;\B?'STK3&@7;ZCR#RD-#V+H.lApfOhR2o@)bN@&X3_U'ksG7+):I6S"Br/*YdYNgY:M,LgC_Q@=9?j0i0/r:&OP5&qBV,R$RnJ7$8.OpN;?-07(?bFV(.Lri2?\ULb2>Udl_TXs8lN=.eqXje/HD;P&'pc2p+MW;N/B33aS1WR%pb!]'o9SAY+_g.(Q+uo^(r]QRO4"d5e'Jf71%S\)4bDTu%C5=)7`S#.9K-[NDkWFq=Igl92_7'ls<0=3!!=7Yb#H)K)8En64<[&dY5;LqRYO?deq6h0RhZE@cWGnj0n,=kLV\fI%G/]hObcKgp_Z`2eq]&m?2oqS)C(c:SK(Mqm)>F@[@5/NR68[(GO*76+g2=jT;e5dIk:CkB`;U[K//DDpcgZ_9'n(bH-sirEQsA$^_N$Q-?,Hl12mW(^PeAXJ($GcmrrIpWNC0RJ4YF76itE#%)$T:*b$`b(0dOG#f.m9-riH-e*0c*-6!S$S[MIa>)?=4Ni4IPIauJpq=9Q]0NOVV_6pBW*D\=&of>TmJ<5qd(@qdEO[]+M"/i!XgT,WKG_1ff`SDib_QejXbDFeRQRktn`dK%mQ#H-ai(VX'(gmpgKV2V-4\*P2Td*`mCA*HV[CM0k%:JJA`qcs6g/;D`0g(#]-OOK05QOJP%AN=St3[0^PL+M7f.Z<-A6IW3e3W$&'$9<&Rn2'SnTV42fQ4n&VEc$M=R;qG5.P@Sb./!"H>4oFQ6lAGD:jj`eI]g2l21[BTi$t/*%nL%A!e5#eFf-SjjOe<*c7[t^^;jS,#rgbXAt_>Dq"_OrPg9[o$Z@3*,n5gp.+p09nMMQpS=tTWW9Is(NNO)f8@mq_sD*O6mKq\J[.K?=R59]Gi5Ro[>*2;Ob5"VUk_GR8stbJaO^`9X`WX.)OFBM2U!LTae.4lbhdM?uO09?l<"W1V[#:\mGMrdY6A3e?0"_]4'p"S9&\^YaED]3CodG?1*HW=44K6\/a^5e3,U0o;F3-M`cG!C)E3CkTi0d(^5#e8#~> +endstream +endobj +283 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 282 0 R +>> +endobj +284 0 obj +<< /Length 1506 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +Gasap95iQE&AJ$C#e@mi-EJW\M8G%DfE/[?"W$SZaapm7Rp1_k.6*4Sg,@Ha>"WUL#3"8\NE20\nZTIW,ON_Ob7BPEED_s\19jYCgFj#Es"kW[39e,EkeW*PoTNK1'r-F1fupE;7/4;e'\ipSZ[*aFpoge,O4UP4*jWmS8B6O>nD-Ub,1mI@ME;;9.l29@j1P]$ZmP"TL!nr;Bs=NP_O0fi^q;YW=`,1i1SJ2U(Tj2"l=W,X1-T5C?h`%c^%a5iJ9XF"'\Z*cl0f5@Q\hsXo.ts,G;E37N>dHNtF`?%jF/X,<2H!Hh3)FJodWkkpe/5pT?*BBHpkWIsG`B5p_C_fU5@6"40I8+V'&+So._c\F`g+o$*+oDQJ?--3g^n$Gf::Q\l*/U#$`8Fi0+Kum9P]:*"1Fm*j\R!&nf'Z?EZ&A^2f(l)g1;o0miWZPLaQ^IEP;/B0q*Wdq2b#u&hEWa>g%@'7onqc-k_9"Lp<)LT[O)<8#8c=UPrlRFDlk4Ic\3V)-pMWplK+I2rAT,fe<8!7?B\%qpORULl&..YhVr)"nh^7&I5@fq,b<2MFPX>:+.m/+&VLZ>?X=9#P50(4-ebS;u/58u97burDFYCRX%1MMT%%=8=\2,tRO+@#O:ZrODNP^bhRK.6q"3&*+ZDuR="DXMGAW;\:=DI,g8)48F&ZZ.e%`H*n]-PU&(+(>sdci36^4pS:CRn\E#Pf-_"pXLVReSN#=7PTbr=uC])GK!iS1k\F+Sl=_f>(ZERQ9^`D\!ClTDoaRB3WB:OF"2?'\mt6^-38QYV3%Nse3V3IU.)o;m\2`*b`7NpnDB:YO3RIfi7Q3dHQ.p??3fm1+Q_7Tf0M]so<%tg"<%&F$4@\SZ!o.-.;!I+kiqkoohb,P20P.hT_5->j_eB3(ok?@-3gOV1*SjF3eE?k'lYFK'04*kUP/lC-T\:c3f)X%rJiIfWg2A?;0XoT-+>hQHI9/7@lB\QsQ8WSQf.c#)`uN/7XB7@T[eo_FYpEGpXgp-Rad^IWQL0%$-_d`ZnY;Q8%HP@:`mOIB!?cjV!7AH`TrKpEEN +endstream +endobj +285 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 284 0 R +>> +endobj +286 0 obj +<< /Length 2391 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +Gat$:?#SIUn3+NQfLljMAbBb//bZDlmEbk9[aj[bRUVpA3n>L5/gVn8^E:EVMFU*q3s5h6-f4S68\\P;]_[]n;96U^\[_uugP[Hcoj8D$nUSj$Qpl;)g]_&fhDMt3Y(N'\=g00]WnX]>m91&8=2FuR-$V'mLKGS=8)?(FHV6o5KMe4oMN)>5"B!J(K'#WG&+$Wi'oNLqrutX?GV@T'fnEVK--MKc6=r*]5#oHiC_#jDY@TfKf5Gs'A"6g]O9Ft]h-RH"14jtRqsBXBPd8o;3[Cqj^-'u@W@fP&ZkNF2FGJ[OBVQFp+*DYTM2>JZd`_G/7tl#^nY:s#c1Ul4B"G(lGQFUiF[B*@k@`hA/IE8[nW`>#d!lDW@lfC\:]dk9jGJ=@R>bpPTi)nLTQUmUQaL]IWk5fb\4UT&(*&/nO)Bq3"(3XkT'3H:2nFBl,U0T#ZD5lo8/Z3rdQsM>*GRGRK.P3:99a*p1#6nNS#5CG2clUS.6$NX^pqn1cbH4kr_I3MOd-+$rc5&p9Q`P'iIVeI6>;80Xs-4daFGCU(_4*jfBKFGL!l.p,NXAFkk\U^%\Vl2@cQ&!;619qi*HtD9d^s'f?+?HcT#c`;FsU(@"[(Ar&XPNThg9nTK2`C;6V1ZaQKdqliu9g]dETl,6A(Q/CY,2euL#]q[cVC'AS8_E5U[MA)iW\lesfM9aDY"T.I&f_<[J3ZO?i`&=G#Ju]=rk4KWOFj^B#0tdlRV'i$4UGQQZ]dge6NIbki(QRQ0mSpFNGXpEOJCb.2PY)=M_rq`^QZ7U*hPM;JJ!b,S7,:K;DFX&iQrm(a4R'9QDm=&SQkiQps=>?:]`HMlnEMu4dsrGA:rl'Z6)0NGB"8_IBDOD`uJi''';[4ets80`&5qtNR9$p0M,cQCuG@<&2?dLc$B([8;<^MU1uDUb/@J!H(q\P)Y_P!hFlsgL4du,cNd`GiWPlClABU)mI?"4`;H9!(8Z)85+KO#8X#*E_mgk*;u[-)A9Du*oEk_/A2/i>59\t*&s6\o>>[d$V^h%fH!-?%HTjD-:+V4$B2U%lA/-)bS!0%"qb?tuE$s4u*OH]RI`Da\Jm@ae7-:74hn#X[:"2=6HT_>=B9p(.;PMD2kN'\U(6UHX,sboOf15k'+F]7U`t'0S0C86c#g1Zlem_3ToN:J569S6+^oGm4)hd.9U[II,o%QBR0aDN[Q@2M=T(Gh_JkTc4P3RhGkV-/El/%`e)'0Fc'2arG$XOmE5$`Z@dF=OCjW28[1PV,aTUong,Z;eu"sYYQ++3S2;c`9`E5&l4$tO\K/Y*27qE'?"l$GC>7`K$)l$*dJB;kdpFqoA$!,o>4#0p2Q*9*r:_2B%&95'L,@d%P=>`545OTo0YGkppQX[hkNN'LI9_;cJet2MVi0`6&N9U?PXe0&-TI.,#8D^&SF_NM+Bs?n6n$&`P^1/[HlB@:P/f@2@BSH3@I0H!1K0o/!A'u9[E-qONbV7^/AI"S&ti+FUsrN[P'lVOdL#WeF@fGOE+OAXmJ7@f2L"8Zce#$2D;S`Omn\TT`M]iulkS1^gU"N8_W.q@AFCVU>~> +endstream +endobj +287 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 286 0 R +/Annots 288 0 R +>> +endobj +288 0 obj +[ +289 0 R +291 0 R +292 0 R +294 0 R +296 0 R +298 0 R +] +endobj +289 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 505.14 636.561 540.12 626.561 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 290 0 R +/H /I +>> +endobj +291 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 120.0 625.561 132.22 615.561 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 290 0 R +/H /I +>> +endobj +292 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 191.92 564.122 298.56 554.122 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 293 0 R +/H /I +>> +endobj +294 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 161.11 452.244 231.35 442.244 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 295 0 R +/H /I +>> +endobj +296 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 262.228 364.919 301.678 354.919 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 297 0 R +/H /I +>> +endobj +298 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 305.57 298.919 343.89 288.919 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 299 0 R +/H /I +>> +endobj +300 0 obj +<< /Length 1278 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +GatU3c*,SU&ARtCLq()u$RUnoI!!=2Bj#/H4fml8Kd,TT:2^>eOc!OY=%\abK;1Lt`p@`PPPiB[)HU3ep;/_j1e/oHuIkAH@L,>=%':o9Q73l\5slaEor)sN"\2"a]W)t@j5-c3)NO_>hV?NF)*X.?r@rpS<&Z&bgmm&WTXCEL!cRBr$:U=>]5]P\GQ?T\6XaS;n/Ph<4TheY$Ig!iLe+Gp474j/(M9in``erl[\/E`&Lc!6knAtW2Z^KJZT-T[p8>ffg?S>=ad)9$>FjY._G+)[%!@9n;_&RYm_XbmG*W,BbZG%tYAJmnN!m7MJ=od4SeWJ4J;(^QXe;pWfT#:l]4ZHig&("t-?2(ks(ebTPrCscnX;:HEDO)]=JGoKLCH.3mm7p%TBH(98WUAjCkkbs5+4o&rM9JT:nPE&\0qiK1Pn7ZSOG2'Ld*bH+Rlg@rDoV'W4aGhS?&,>VK6L_heZV2A7lc%%Cbn^@`rWB.`mP"G;nWE:9pU"`:Gl85S6(T$)jU&9\1hg!N[$d1#3Z.Ru2%I,O@TUN@/g`CG(\:csoAc90QomL70?%'X1CpfQ5Y2bR]j\@*3!DOTECD_[q%S8NTlP9Eq/UGE!"hLC#>.J`RPJm7:1>+9>ph1OF%*qb,>DuEH;,5juqSD/?mcB@V(9]ZLko`_tWh49NQlp32@07IB@-+(jLD^1kLr`Tp6jH.DWq0V`a%k"m.Z82>~> +endstream +endobj +301 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 300 0 R +>> +endobj +302 0 obj +<< /Length 1782 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +Gat$9bAQ&on=Hfp\d-t\_W^qhO9O?GF6II(r,Ce*/XJF#FI`.PNB/\'O\\1V6@?(o9$DbWJd?I1EOB=qhhDi=eX-f'@.gHWD)$:njSpjPc])EJ?1&k,0FS&`e_N`VPms.T0[?ZC?;UjRo2ku/S6BL>10NAPdOdqFL']i3(#BHDHO;7(f?s^]r5HpX66&e2TeQ%)e&E]g)Bf')-q/`kkjFYo%t_=X3$DGa_t;%:J',ELoktDpust=bo3"o@&RTO=GlL+9"NpdVZ^1Ad)Nur,Me[`c!iZ7edYn@FEp&u\9YTs]X!p.oS"LYi@hfTC.S]QB=CFE\h;U"f'$j*![BA'g7qpI;id`I&EUR=Z7lWI%T.38MTA5_Uu3"c/(lIR,?pEAY*BX)j:0hE`KhZr9s)>LZSV$S-sf*2")fLG.jV;R^+^\3>T0)>?D=/>2md1_q\RcA1NRO"3moK9[OInjIj"&-e5%)*>H[d>:?*UM]@CmIm'pRjf4`/@AP7hYtgZTeiL"2g9_(/>(bO?`Ek.3bDKFn8@sVX[6Qq.)RAcD`rJp%m8_5-D)"[eT=A=K$JKH1&S6OEr['m!Qkg%FES6;[]5U>Vq>m3di*'$$OE?as3%SZh0a&.uB91G%4hQqr0*Nlq'EmsT5bL54+mj8KtPiI8*d=kno)Ea,PBG$6ee,B+gjnql>s\Xk'mi4Y[q7\$0qlJN"dc+DA(]BBZOXs&ic?e()OkIhcZ#rGmCVEEK4%d5J76>-..9)Kb##GXd#KuEF-.+CB>/8WLs*[>tA(gIm,#2"f:=UJa+lj2DFLh4_R!s(oGi759"F;acoW4Cf%WCNAfs'=i6'N\m?>'oSD("=!*q_<+Mus_Ghp=@Dq8@KS)d6Hrg>tX,cJ":g&F+,QneU%.8Uh^Pe4\Q[%)TAq"2Q6nJPt1/m`\MM-+^a(35;blRmX_fCs=6>Y;8L@6@]>.LoLK4NUlkc-4uV)*no\F)5A;t@5^5(*_:_u=V=o3\cWtNRg(qCL%5Gu\3ZrGL=peB0eN;G,EUQ1qmq;<*Ka2ei(5X_nf&b:a1s&3q^f?ffN'B3L``E<8C3i6co]AO231#;-RHi.cg%#?6MF4H:omYkm:Z-#ejrMDW#H'$D'Gt5_])^cTP=',DHU:HR4\9A9>,fOQ:tXmIFB.Q7bg%d]4K.]R%p@NY;brnFlJa4okL:^Nf01b&e_864\B;fWJL^8`g^'s'C)@TBI!)&J?l#H[;Phb]1l!Dp7ap@S#8$]6aI-)ZX2ofJ(NJbNOEbD+R"~> +endstream +endobj +303 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 302 0 R +>> +endobj +304 0 obj +<< /Length 1410 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +Gasapfl#P('Rf^W#^rt;2CoYA9;`Z#"ZjHkD#h?$`IPCr=H-""Znr5Lr;0;7.:1]5@g!'^Y3o&V9D\6ppAQ]\O:\ZR%9D-j#7iU'@/WTIQm*Ng3'ie7@!)ah/Y;Z]+d^%>@.dOS&Zp_oMDfN&KQ_qqM%D&.Z)J\iI(3MfG7j8W/`sa13=r8.!6JSP+lZs\q'ELe,AZ\!o%o/kbKcY@8C_sIXj=gq&&>VQ]=c6Yj[D1Kgf1CD6[%^jlj-*1Ze8olg009?6Chl_]O%Q0dX!sZ`Y$(m[JkTS&r'SDV\,Z+r1_u(_L!*nplB,6]jH_R@#rnInZgDLY^LjocA\No1QEXnZ*?#D0>Qf:c&"(h?rXuKV65>2lOq#fO\I.@j+U0/N3Fg"geB&1WhhEoWE";5Cc!Lo@dHKo9U$,\_O)K5A#$dhhquM=O:r=kj8r,#jk8>%SO8[Dld=*8<-j6\+XIE+KLY$Z;rAkT\I09LPPbNgW2q-4mnJ%g>i_J)/*N[:fEc!Y;&0o?"b-B)hUWN3&c$HMKXI%C8@1;JnDG;HJJ-iCYF'$nMYK2]d57,?I7(>Q.)XBE%LulNQhJDqiPDJKtj+r!oq=l0q)1R`(RPZtZ47hA$aa$6VLf/%6caTX'N9oK;A#CDDh,"`,DCA"7"9m<(dIbsT'!(_C^6=suMe7EjJ'8M"d/Wj^>pLjhTki`ejn3=R3(MKKs*%7tL_#iR=_\!rZIYQm$.YVVF'69V^85u%Z@o^h%AItjAWF,!$I4S=a6#@C>ToD~> +endstream +endobj +305 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 304 0 R +>> +endobj +306 0 obj +<< /Length 1371 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +Gat%#95iiK&AJ$C#enq\'Sb+qid,ZK?jj@*V1Xb]"WQQd+mU2r>bmH*O\IB@o5gLkF5"EN"Ys6ZIqA.!.@;k@sa);4Po^kLnPd@Di6.1T'8[1(fKXN<:Dh(1ejZe/#,D!!2(n+:9R7ZoR5Qn`nT`b.3S;?<]#r`<&_s-($j;>ZTk_oF*XZiVK^upUA^b^)JUN/$Q1A&P%sbSIsg<)nZGFXUSXp`U6V1jfEe^XGOG-!mYZum*(@b0YRTJZrs\t7;a7TG4&q1MR%FootnQ-P\4W[3ht=BUV\uW!=QN?9U']^Slu*_8%duVM>DGj8'Oj77a.]+A/D8X)[?7iS:SCV0Qd2pA1UYeFPRaDKZoMYu$Gs,Cqo#oQF+O"#ql<.DTqVJMam&6%8\MQ\(iXl"\@]USm@"9JXFZ4QqI6[=[/>D4sMIlQ%TII$n%"=\4Kdam3TK#lOjL)I18CF:c9MrMEo-l0(s]qjo[2io0&u-$4#B7BcCp:.eN\jpPe8JOt^6'!!@r2,#SY[W8KKR4Og$tQ]WSc"0_N%9/^)W-q%+%#JA^S.bJMiN<`Fdm@l&R@aGR8>\a]GaUoBHKm;oe1LW83Zc2ItaU,.6Hb0lSl8_MD>2npCt[KE*#]kLGj*ZhSt]WcqVl^Ds_WZu`"e(bKiHf+Q8!_S2A&`R3!#FK=sqAh&nNksLe`,1uR9fD"*O\7*V:0R=da%8j:u=g)3Z9=]Or?QipM@kISC^?9"'?3I?2F6Br,+6Rj*nSUN=M`opQk1=!RF\mJ2V>_XjZCeF;OF#5rc<66E>%nH!%C)-He9?=EPh*[P?_XWrh^rg9f=8OZ&;Yf;$Q8;r/H%;M_p\2\BmL'E)Oem83O^4%o5%\9?`a'L:M]A-NN!Fj>s?`C%>=mqut?T?Ha-'J;";.0BF2qSqb_lQN3VOG`?8?S\pa_-es?B:MSX\]T8WHDO2/U;O%^pgR\0]&q3sL;9YJ(b#ikJW%SVd3/)G%?g;@8VZg[&2d'ts[5nqgYeVftr39fe5fp>FrISY@n1+uTg@mju`l'dYQSf]T_+N=pgReSi;I9dc@qcgas%6;7jl$lo@HN*~> +endstream +endobj +307 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 306 0 R +>> +endobj +308 0 obj +<< /Length 1300 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +GatU3997gc&AJ$Ckb^5#0VTiXZ.lr;fG#clV?M&i@/Ia)Bs1>r>Y9n*IJii$+si6`\_8lB?pP98^7"dV1R-cCX1'1,KcT5Va^O:5`tc$&nV8^_8n$qn#_uGY=IYekTa`MSg!j\PmB#@r@I%&U6uF90Hc+2FG!Y>e-m6ZoZ_ljG@"Y#diRh9u>i^XlGe:Xr>AjR5Sdch@I`%aQ])e+#K6/i*HH>0($%"<2O:UjQI`Tfj)TI]:']L%P+9m1)C"m/5J>j#[FOQQI&c/1Q;ec.&a@aHd;fQkJb<:A<8Mut"QYH*"c@;"`TOPuFa+.I7@GU(*frJN2R[.P;W"l>?n;<1o,>]GT)Jp_BC>br0RYL45=SFWhaZ7Oc(it1&C1"DprfX4WG2<,2R3dg1Youf-J4lCU&%ulH/rBS'XKt&GHYSkaKt]H#(#)^(Lih'k=&pGu7pmcaYb7%;FBi.0MR2E9,iV#p!gVmoA,1Sa-&E_=3-7kfRKeGiWR8G^2[PKVl*7]V2$6GKfJ=fJmf_D]h@&7#+Q+V-m)EaNCU[CS$RqOoaX,Q]:st#+?082d;T^jIUThgtTB`F:,S"^@/ugLqPNG*l\fn18RF=Se$(E8A/(%l1XNjZiTL`@Q(,6/&>?m&Gt$YHFu:Z>25*t!=jJ%l39`,S/E8uAUGC>*JTO$W@#o'0#3Ai6P8WRZ5_h4b3QJ'CpeO&QgojaSt?j4,Lq_*4jhU&;Pg%14fcY[*e&V=n8%UbdkA1"7a3^WlQ$'!8S]Jsj0V>d3/s6eeX>gf\VNSi"U.ipORX4tX3kE2N69g.H%>K>YH!fNnG#W'H6bmbW1sptgECE>qt/aUUH`/Vn'sSXY,A8o^'*sn7/A5oED_qS)nK>4/^>/.pk\l>)1F:.f)H^:D@dsUp2r+lY+u5J_*"u@Ddg-DkGO).7.GU&r5Y&X^Uj,3ICoX$gDb*$q6>ZeCN-/*f"rPME?ssO#F]\1^ULq[Q]dn*n`U+A?Ni!Cs$!@RGKbOf8]@M*;CES(QhJUhB&<\o7#sU5n*HUurW?spf50fErI*$UHfJ02qG-,qDc?0/gL&]XDJ"b9q[j/A\PdOK,Ti]H`Gdq5,%f/\R'^p<+;=WjHfElkA7oC*6;ai?Dp8/R42f*he95?_GZrl$f3YQ.80f"7D_0Bjl+Tb3P1?2i=-i]*j^U\0^KWd/`L1jNrO.$=Qq5+#`@_akdI94KJY/)c/WVJHZ?Z\,(%4BW4\*5:`'_6Ca4MM_!NBa4kP~> +endstream +endobj +309 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 308 0 R +/Annots 310 0 R +>> +endobj +310 0 obj +[ +311 0 R +] +endobj +311 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 138.6 526.402 182.47 516.402 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 290 0 R +/H /I +>> +endobj +312 0 obj +<< /Length 1256 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +GauHK95iQE&AJ$CkZ$;%_MY-78k!f7G>k/m]e!okLSb1jE;9q1Ne.[f9T(#)[8"mCQGi'9:naq!q9GNPi0EE10J0MJ$s1M@gu2H(V/["_-c33F"3&9C#H91,8[Zid.8-n@+Pu:-r<$$4"aR4/-qgF&54(.!AKMC6aiCeOjV5XJ?g&0%4c]_^%I:.EQ;b!LBjIIpA"b!MN?c,4J2)1'm8LF71UTT4%.,J-f=b-"!TSJiUP&G/#65-;YrT8t=(?1cdE4VR/$NS"g?a^,PEGfMf*X*0)Td?X,j-%9?h((Q#9=f[S:jbhG&VLc;r&D45"PkrlWtM524f1X:A.t,E/.`;PmoFd*"=Z:T2I9)WgaT=#CJbU\GGV#SS03)FQrV*CVKcL[;bQj8+!nq,^&h\(E1_@uA9sk*5+qekKGM)#;fZ6Bs#HNIp$4V%lS=:E/&:>\_qs/b-a@IMlC%n)!qQ>0Y*KI\r%Q'=cLd*ZmoPtDfNP<,ShVmW$)Kn^hLGZd,EOWIBBtmruIQ"sF**QdBgS#ECfaJCpOPY0Sa6_gnmbQZ)_EtRb- +endstream +endobj +313 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 312 0 R +/Annots 314 0 R +>> +endobj +314 0 obj +[ +315 0 R +317 0 R +] +endobj +315 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 218.85 467.243 326.63 457.243 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 316 0 R +/H /I +>> +endobj +317 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 240.51 337.644 348.29 327.644 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 316 0 R +/H /I +>> +endobj +318 0 obj +<< /Length 1687 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +Gau/Y?#SIUn3+NQ.o7LoD+<$aP,LeNX?["!`AV3Zb>9lNm0Jh#Q]gCihiACAh,1H;4=p!Fh3%I1_38eL-g+i8LUtEHB$1k>=e/C0Ps=P1Y9h2k7q1c-f$6Km/>MXpaSFGUr?f(lT$-8P@ZU;=UKibJW>E#8Zf[h]ntG,+_!7Y/4oiaj3a\.f?8eT\QQB$@;Nc]:SJ2[HSVX".J2\eAX/.hA!'mXL"5]YO`_/IY7N_H"O1o\*.qK>9bjP(;e@de,MX:UmRT!=&rh:1)IJXe?mK1O,bRn.^'6=06fi&cD6*dJ3J,(DjZ)1Z9EeuX,03dc_&`(P&UAJr'SR.u=QCVF_s?qhq^bSCaS9jdIF&TOR2nU7r]Q,bUNr@j5%?;;[PL#:;,m\(]ZiYAJE%4U/NoF8[?5sslG2Pe70uEte\]oid?0t)fnR]IP2k*G'QKflq*S#-S-RKK7TJ5GoTiFq0L,>J%4@S`e"J6p<,uX8q!;p,k,Hu/;4[%?rQ6Z((W2nO?S6,%@hI.#C&Akh`F'L!C91?ET)eY@K2YiS3cEkX5lun'J#X(%j3>]?!&-pJsr5Erb:+@,'@%0o08!c_Q,X2T,(i,br3:ecs]'dV4Hs--MoCFT)]$s\RBV]6UKJ@Rc-YoJm^jXYmOA8,P7)m6%X9_1VRKPa\T's9*7"kF*AuZpbcc#,uHQ(A.?07u(4Iau/(N"g#/g[2s24CnQ_ujE42(Y+9BnlSQ\1ugGa,4(Ie4rU>'r@5kr`+]ba.-NTE<(%t*o%rPJ.>il7QFqG1EO[5Au^00C-b5P!]E^S%lf;^38douaV/UD40?,W_FsD/'jeAf8Bc#Xmb"#Xm`\ZFs7'UB!uSF.r#ZPU7XmN,:ur]\//Tn4%4+K,VAuj;o=Dj2tUr@[D+:6.^6"CBVFr+%Fitq/XT2=r;Rfm/OD0?arEE_UXN6/b2V").Khe>9!=o^B;-NEVESei9AVlMWt7!.IYKYgU=rhE-oj1D1T9>/n;8ooGoVr\Wt;!Ds0gYafV1).OtG=qC^O-kLufS]lVZQpT^H8aKBqV]N(NLH!a'5ii#X6-O>[qm$c?Vcp8I)'>X6@e&*j=FXqrb>j;6mq?Qfu[%_O-e!ecn8*[#J1T]gf^6HEH3l$Zg#F88\IsW9F-W[s,-GU(p_l)CrQ-!OQ4Z: +endstream +endobj +319 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 318 0 R +/Annots 320 0 R +>> +endobj +320 0 obj +[ +321 0 R +] +endobj +321 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 385.406 628.28 412.066 618.28 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 322 0 R +/H /I +>> +endobj +323 0 obj +<< /Length 1343 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +Gatm;95iTD&AIV:;"bITJ4#5*4d][de3FDKkbZDXZ8p8i,n"!O)i:'&8FkY2M<&\FdpBX<$lCe,SC]^;)qOL#?Jm*ZIlP8T'G`,`\4G1pabS@;/9sUg;0pqqT)Q]mX-KS94Xo)(a8e#uP-sYiT^JXQ:nV^bq;W(b$j&\,ai@rjLX(u.Qm'WJR%qj.+Sno@'Sm<8o)#boRqo8lB]8R`bT)k;ALPlld?7j\g1R!P52WM*4o:r-"[>[E!ja^N"[?VmjOHiG'J/;"CrS8q;&86V;!N50(TQd+=;=WHs0Q_@?31;X9@(9DjQkEhrr1a&YG/R>"nP$^D^U`/7Ec"t--!6a2lBlPJJ%/7g73GsQYPEeK,:ol/N@VD`mP26X."K6^hR6FmpleO9jmQ4`2mifs.pUo'4K+T%J%(dQbn)r'*h,O2ukf?KLROg;40E!$j1K*&lSs$cZ$2t]n+FI+C6:snJ^NiNaX(jp2gIOTQnpbQ0`-Rh3BnR!D+4E7.QJ]ef?IqG=SXMVqr!_(!_9QIZSVqb%!)HNcR]22$2ZhM+in"1%2!iC'g_ja'Oa3#h&Ur(q[HYFI9<-nlQWR78KLu]`e%UYn1!VD24J7,5fFgt.]%r?$e;[A;pjR;MY8CIUPD^Inguu@fQa4APM-bElFPO:pQI[W=A+tCECJ\'"h':10VKQjeTNDEYS.OEDi-me:4Qi.GWe5Emgbkp2M)*Ae>GQccF*@*fB\7P2BlM5=o4(t[&b!#,U1khqTt/AX!?eb%i/)"-JH%:U7,!legm>ekmMWWek\m./B6HMqn,>]+iA*hYc(eQg@SFQ+Q&ceQgf`tcb[@p\7f-R*MS%o<+P#96K!.YtL:dpCSEQbcgnAr,J"0'o(Onro5LQd`s146%_3a-Md@hC)Veg_1PkA+2YX_@%6W+FaeY1l&'bLrdBT&.E^4^j:Zjt6N6U++#J~> +endstream +endobj +324 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 323 0 R +>> +endobj +325 0 obj +<< /Length 1643 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +Gat=,99Z,/&AJ$CY_UFI`Yp*6O57'>[8k/I-aS$5dca^^1s3PiLrPRhXTG5+"5C'P1ic:mCTDBa?sCY'aQR<>(X6YpOl;7&Dek1_(]I=B6\eVUObPgp)'EkJJtuNX+f"%rR8FFa?)c:\N3g4VFYk/_J/+FLo%)oZ&1OS3ZrJk>]D2)jQKuVClS\NM:VDeW1!OQf/L$^kp72]mkf;Hqld+IBgIAf]AXuMRn$DkNZe@VtP#NG2"&dq$]<>,.Q!W0l,%nS5MP)_gKT$0d*)=Q?p\hRX)sg=KV5Fr#i^9DWK3UqL'a`NAjTNk#(;#+=,Y%LBPAo2:FfiQh+I.N'79bMpfNcm8rM[X:?q1K0.?NTWQ)+3U3pW]Ti$ga].6/(<"84L&UU=__1C16Lhd)U:8$iCo5/OsUo5&QJuZe\e:PcnH6KHH_!0g-p2U!dT_`)j/Y&d+u#/C?(FiEHtnjiWQj8::ZU%aB!AGG]/[$2tA\=D+LTA27%n5Cq['6TlYA;^2A7:rer`XQ4f%CC"XZ%pS^Nh1PP7fPrLe'!pu9pdk&sG&g+?,N;@:U9[IOrq=0OOJZI%TP??I""@F]CGYcrno9LcB`oC)EsZEZL"rLa\2mOLs):g$1dTAG-VMYTD>B;1QXDiMnV1.>Z_5m,K[kkV.J+^m0[&5tQ-3ZN?8;Y.$L:oLLRg*mA;AjF:BRe'#]X>C.oSY1KNSgcRj^M4UD"Z4tf#tsK@9OXbX!XjVk[m&J!PhS4k)0Uhm:gIR6,R[&XXhX.3%3"QrN3i%.%l,Qo%KAk(t\6ddpMu*mnKs13:bpkjqu^aVsf$p\**I$I^\/V*ASH/VLp+rS5D_FHD+(=He&-,e:5BXC&@`h8o,q,*d+5pLSo[,nC?knSWH75r%q^!G?OrSgALsS@.L +endstream +endobj +326 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 325 0 R +>> +endobj +327 0 obj +<< /Length 1006 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +Gau0B95g:b&AJ$C+CFK6mWotj66[M7Wfc"&X/\]R3#pL-Yu*6O)!@SLs1PbCGS^V_3)l3j5/oDMIJ`EUh?:O^/\r4=#[>,n%pR3uYqZ*37AsJPQm,;,?u8Vn`?r]ac%Yi<`H#a=3RQm!TeWF/`!c@gk1ZWA'Kn\Eakru[<.6l%j]6VtpU^er/mXO6EHkoGLP.P6P:]n_+C2Xlp(\7W4Ph)/"?_m$QXfktpI90&@ql.EpqOr/]dk^\q>`M;dQ4bbSjni8JnP@Vhip>61[6;6&;,NgJ;0d$5:+XJm?!EL\;P44PC%k*LTQa0PT8%HCH+1'1e]TS]9/D^]8*j=Ve'.BV@RHq4X +endstream +endobj +328 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 327 0 R +>> +endobj +329 0 obj +<< /Length 1416 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +GatU3?]Us?&:`$(TKFMuf"o@ZY\G8kf3>4%[8jVsqQO+n]\k('&tHl#ZK^VfHNu70Ts1Utjb4S!rr$Fk1V$^c(AEB44leWhmDO'h'C9u5_[\">1\:siTsHpBO4+>r`I-h'@'U-tB_q5[,k@J'(<]4>71!N;8#__t:2L/g["sCU.Eh*gAm]+dd?>3rcD!Ndr:.BfW_6Bsf?I97>A.C!ba^%nrM^Ik1;_WcMrX26EB^#B=hKP8:BX$?h^qH8;&\-3:qr%;1HP6+<>(PokuO[\4P/G)Q?H;-.MKiI05e2O`I2jQ8&p9)TiFpY87g";i0RcHj4/PVA3RbN4nVCGL.!GIC,N.bgfl"Rk5u>.S$++nG2TffHS;3W+9ultNJW#+7GJNo`#fPCF,IA-_03teH?AUXm`sXLr5F*LbsW+g.*sYr^Od@4J/UZcLdn/>=.L'9`Vl'u4=^iDWn6B[,fe%i%aBiA_T.i[@)u+<^QTXfG-!D48[%&;Z3*'4)SRuY]s;Q%SHA`'#.2Nu^[\#YdhQChf34U>?Kpu(T^Wqf@CHMi#D\,:Ct-AF.%pon3p8Pg)8D&:D]hp,_^K1@k-)g0bJ+K0\5EDN`3A4OBKc28oV+hBLYA"48puAf-sAnUjnVs>#M%t:4Y&%ec&CcSdcSVfRq?NCC9mHVPrr\b/U>B3b#HD'OfCDn(lX6_4'ffM60S^6Go_652TZ*)2UC6p&I1T*DY(stNM)..jL(-I)-nYVBdg)^keB?=^M#s^h!%%COKj^nTVoklZrGYZcI@.#N6^;@-S>gT6NSPt!!'W?U&%:Ht.V0@&V*rnL4HaAl/u\n%@W^Ce-)gR(\e'":-"2V(!7MF(@q1>A,pJ^]a,l]Ih1>4N*_)303>JQ=C>X?;DiIF>JcYbgl3DP<"h3c_%6UJ%QCuV?#fF)G,H[IRpO9c[]XQ[&/E3]8R`.$tl5ku)`B($h*XND,!"m!9TbM4SbKLODer.0VYl/=[$"GC9.8Mj&aXM/qNNF7BXT\0+Q"u^@71gSl%F8>,#Sqo/kDrF1Dr9H5A$ZJT;MV(tC>k`S"0Ba>48a(]q,76tXT)*p=IW^W._fE@F)p\b-\"nZf"K0Ji +endstream +endobj +330 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 329 0 R +/Annots 331 0 R +>> +endobj +331 0 obj +[ +332 0 R +334 0 R +] +endobj +332 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 237.19 355.941 281.07 345.941 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 333 0 R +/H /I +>> +endobj +334 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 404.65 334.941 459.09 324.941 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 335 0 R +/H /I +>> +endobj +336 0 obj +<< /Length 1472 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +Gasap95iiM%)1n+(qHFGVQ(rW-e#uY5(MJD@WS$_6#i.=W$5e`-YY<&s#u;d7C:+<(Bm^!,,pV;8^X/3ZcBhTJ:o>/P$k\eKu&4mK2DU,+p:^e?phXg/M_#/>[#n-("a;e`"U&JVf+uTse;MBa*V[cECU-gZ+^m'0'HL=&R>;Xd[FFID>E5gIq"/$YAj.PaV.4OGapXFZRKlP[7n\MQ?R^:VT-,g/F6O0<$Ssf01NmX!A,cQi!F&FU6#\/OGU<"?SaPa_Skb\U;BV(JOm@X:"Wcu<;QHLn=SXJ]BojBInY*9XPF$Fbj0&#ien9iRDL@TVVH`!f`(\=6=FX%XUIM`Q%SG;T]Srk:71XdurC,=.slamrV0*6q22'lh_dp1e*>Lc4Ec4J*+fscqb`ApP,U\J,P\l#BRUrl*;8;[Ph@G5W9(750-9?!js!#FAWH>a3Ml?)8U8Hg>91Ea#M8&`R,:Bi"7F+cnsr:uDC?tL9+&fb*tr`<4](_pasbl"p*-HG3U]nQ(fW,/d=(X;Y*2uo.EZWRA0E#4Ep>[@Bo0gn)GTLY+T3j2jT/q@[L;B70@ePfQH[L[VSDoaOe.A3]s8C"e>1XoIB=qIuL?XFT$XME\hiW.fsf*_*!>`<6dIeM7C"[\NW]4ks6IJWqQ14A1>6;_V0XA%q*#tjhO+?>c)P@p3#.ffc(HqTas<.iHh)7F;oA+L[CeqWkY)gJ`LY,)7aR.nIZ$_<8YJV@aipcEc"grA68Po)O0QHqh!``)Ei62TD^nk2ZNGk.T'*2>X'p08%9j\^FU9?+C^-P8fS7WCVPnC'`@ic5s4IL-=c(9dBnJUlf).\'<,$iW27q#'U"_,KLM/E$e&9=FHQOIYQCQ>!n^Eq4e./u'gA,7h_8aQbl!3#qNf7jX(7@u%`=5D#qSXY<9r[aR!qTuK,6,%pP/)\tSqUpiVA2>'UD=GF-A^&;M?,f\[2KFUH"E;@G/`SDS;Ghl2/.)78F?gIhX)s3[h(In.Y!f4^!26'O"XloY@'\H8_9(];`WdcHRG`,)-#\,TVg$iBSud5s8MY\O1dEQ"\_Nl40Qa;R>`17sipT[MN_Yf%*C^lIjHF6`qL2a8]Dh^6u1`(1%bdh9Fu'*U8o!_/Au8m.4trP_f;?/kD_EoI/@;")SZi.eY7$B>]M$\j$Upjm5J\DMJtf?>,jU90WHVJ\Ga~> +endstream +endobj +337 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 336 0 R +/Annots 338 0 R +>> +endobj +338 0 obj +[ +339 0 R +] +endobj +339 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 331.6 602.236 401.86 592.236 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 340 0 R +/H /I +>> +endobj +341 0 obj +<< /Length 1270 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +Gat=+95iiK&AJ$C#WXnYb_Xafh*(*W]"n#9TO$I7*%74uLm9EEU=)aPrU1auPW>&+\1Iab1F(1thg@f>+4lGJc[j,aOp$oVhCX+n^S%//J(.+.n\$ml#Yi#*_0]:5d$h`#\)*mhrY>>TO8?'^]ESnh>!j:*,YKBJUMdbF^d8ZZ9A]M,;e#8:@E9(7TuDH!UA!>>Pi+.Ra'9n*^p>0&H'@ogtXshrk;T=43L?joO^-Q!dKLP;UB2./B_q6c:AWLHp`D`&3qNiXi2K?ik>f.cph%Cfs]9%f&SAFkB`O,,T1^3Sc=K_1aGK[[SjtVN\EgS-e?..=&U'ZcS[1\f;PFG^7N?:`=@q<`'kZk)d/Vp6juSj3dl)8#`DKbZ]cra@M2*f`TL)Uo:66)3J]?$<\-fKD35Q.fh#HgV\US^dF-LkAbArM6b_u=ZA&_.4`tbuY.I&mIenC;(YGk<@Z,:eg$lYm9?YK-GGmJ_d\kg,C`W!XY#gh#$tFTMCnP&BmEMpf4n6r4Zg%`X&B_^4Yo7J_`fAui3mLqAM3$CYE("24&fFQ!3*]\9=qV4WD7hRoW(W72JI6)H@3I+0$=n93&Y/!!:%kUJM(%V5N?PPg*I2s&gOW_$A.m;LrZd%()b&F;T5c//>p!o$WBRrCT!'t44/gRXIhBk5*dYuQ*#5BoZ&r,e:"?&)e3K;1'BP9^l!-'#<#.W(1/iQS]T_AqF=M\+W.1OaXYcOu/7C/5SnL;&N8W/S_a1KlkXI.W]"lt(2:#m]F8&P@e*!PD*qQH$V%$?'%=AJV.gdKCN8M>jA9O?M;s39C7H4itKkp;ZjU\NRa8_W&YUPA]P?9ItsR//*PKbo0iaZ`7!Ge:r`Mi[0qGhYkJ@hEt%AX`7Bf6D2l.^00V<3eJ/_.9\l5"nuNc6T(m:,<^N+(172h>~> +endstream +endobj +342 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 341 0 R +/Annots 343 0 R +>> +endobj +343 0 obj +[ +344 0 R +] +endobj +344 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 138.6 533.515 207.77 523.515 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 345 0 R +/H /I +>> +endobj +346 0 obj +<< /Length 1041 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +Gat%"a_oie&A@rkFK:&6[(&\:g)^m63>@CqZfp9C@g"(>$/K=]A_Mj&o[0^lYjZck^kGcU^1qp10Na:AbjnmRPpi'[?Z2Cg%(b,2!6'0.QA$:m2ns1@!orK#6Ts]$WP<":=]F#6_>#nEfpadX))uFo$E%]/#6Nt+o,t\4VklUE"Q?r3qMjkn#nh>phk43P8);JL+(lM*:GmecJ1Nps+cK?1Mf(n.(6g#sAA;A-,]4T'9kiYuM-ClF>2H/cY(e0/MOZ#9+-g4B_g<;GR8&f*a^$AE''F>&H>qN-Jr2St;;OX)Ur,Z`K6)]9rI^,3*i'4TUGSG#:jnoh,Xsa]YZ"_5NpO)3<'.NK_NPr`Jg3nbf:G;n&/E'pCVY!Fk87XUfRHp@=[^eNFC")LL\W\)/lVQgF-U?-LBsRpnm#3Wq["NB;\cu%VFc]BTaG>3(H_Gob^"5"V\q^1.]Q/G%G-VG*WPtQ=KU83qB]Dg428^gR%;0@kb&`#cJ#fE%p!)nEQqf.[F>ZtLZY%6J#?_O-njc3Wpm"9%^kN'AFC9i@Uc91GH'OE:3+%h*`Wbh6FFNIM>->*iMO]>LGab2OQ`=1c5)$Qnf1qP(2g1r7k'!L,)"R&0bjIB(eT$jMOn,Hi_2?^i^6l)N<=F(X1phA&JKCV?&oRbZ0EV[j*tts$@@&0c,f0be__.o0E1=;rk,@`FW![(@[1b^PU^H)q_>_Q2;qdN$,XLk/kPZ+pcE!(75E^8EiXosP],?QIqn$7gPmE.3%)0.oH3j]Vca~> +endstream +endobj +347 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 346 0 R +>> +endobj +348 0 obj +<< /Length 1875 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +GatU4997gc&AIV:0RS]nX"^:)g9ub@8C6L"`'=i1d*a[dZ&kdk-*>cIqVOr'PW4mRDh)5H"_TY3c@#6Ad-nGfmllIVllpY]4l!TKiuMI:iX`5s-^c^_&<9iHe*>-=M:8>1FbT6bDnStrh/!I6#l6;I(`mJ.pLdBIUnrFU,->#>Y%lXH$LM2%gJ>[=It\!cVl@%>YU]@"BU$HVo6b-"a0*QhI:aIoe.:#Q[5kS%YW:$_1U8O1c)nS+NcLUj+)Le1E,lS7o4Bi(5\@nK`;rTk5[!gV>K8_$jVr`d6!F_!3<=@>j;B'ID,qWdYG.;aC>IW9V4F%08bd;ni9YnXG[c!_)q0;EC_3&<(!XdD:\0`g(uj?TKR:IH(!tJHS-%mIFUM/[S%fP%R26%[rHuVl_dE]==l'IJt02rU93DBs[m\1#AjT##!O.D=FL\hOQ?^tp@mmJ)(hUsPaejNL->_a^FR@+$_Z)k+c]8)P=J4d@R2m7cr@)kQ?[Fq2aUcYkMC"$Z5ip7XfbP/?Z$H99LY>tK^'oRY.cSW513>7.I"N7^H')s2o5(+$9e]`>5"IDcj."m1M5WE3_qp`h*=q60+"fS1B2]@uM.I8<,nbGN(qW/-U$H2_RsAD_g:?`r[ru!]4.bIoJJ1),'0D&U^)ph&Y``890Raq7e4o+=Qk8S1_b;'&>pqs&p5tD'V+?PQNr[Qjjn'[?L6Hm(cMIQq-NrKN3"`_XTdFnpS').j)2NHLjc$m]H6ku$d:5]1*uDsg1_c!_+5Gb/sq)Fa8J*a@b,mP+C3Y="u/bdS;sLC42i(Q2-+WPh0oT??p+s>cNHQ%kr1AXD]HY3JhnooHIfLj"=P4Z,R31?,;DgWKk)t.IU>3_j@`4kp.Dk8EX,>="&'C-Qi~> +endstream +endobj +349 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 348 0 R +>> +endobj +350 0 obj +<< /Length 1935 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +Gau0D997gc&AIV:&C?&R;2::4GLA(k'O;hM;4rGj*o\/QRBkA>6q*@,21ki%;BdEIAD'^]'FQI(7\&G]2\2(#^UedjjBIY(Cho-$HTGi)Km_0Uf`(V-tkA*a,]ebcVIhG9HaifI0QaD"M45AYRCCa[AQb\&dO$i\r1@Or\A=)Q&;J'hdNbJZ?O7)j&s'M4kc@QEu<5c`AP:mTQJW'4@b?`/_7c@C.X^XW`T2#+0:ikV2NFpTEOpq3R"R917dSR-PlJQh++8IYr`eE\@/U4/"'S[og4At`d\;I/jU.#,_]?kjBDUR]DZU5tf7](KF$$9iIA3Red'O&h5O'-d;?bUeCc+ekJEt'*Vn#A4&ECt!%"$1^R"EdC(?RE`GTB22u_-7m>B^W>7I6B3$?fF#n3[d-as3p4Pp7AZaKk09Zp([i,i=l0=a)b;Ln2-fVN(3E#![uKr&FGq#'7'7PD""'OE85q*R`fT1*LFnY[2?C*qf*qr/WpWaVk9`in]*YD>>FK0C]P0(?HV8]`)_R6_8fWAFWft_Vb_dF9df@]T80JZ!#+66ZFqVDH7_pd824%3=lN*a`$-t'q0$!VXAD!Ykr^U*luY8Vp3\qd,=kgs',%sXfD"S91qti,bg(PB9nR<9d!.pKlS?./5+J8dMd@AHfrf&l`fgo*^fJaQ<#9+208?R,XRP4]r,3&CpMDJJ&37G5+ItNJH(SDF)F8Q9Yi-#n"h10a6#sjC7IE9/Z:8IMqM:L+dU,K"IqOV)_5Fck!`m>&]d<+X)Jtlq=^UYH[q>IEf8VIlT59%T)B5(?kti4ZQ=E4p>TpZ-).CJqptJR2[+NaGp4tgu'SG^3bUmIk:US^uGX_a\+Y5Z4qr_CABe0?-i@![k?86p&[$(\\.+)j4m!sG6f">gJE<'.@/(WJ\5-;e_JNiOPi[tGWM[(25cH2*#o,/Hh(U^]cXX1c?O&X'U:Z-l&4R2>5Xq&jh,DbYSnCeKm.ppUd5a2!UaTml!XAS`&Bu%g*o=JC3icY+hbC?qVf@NX2bt0bURUM!<#O@C.W/kRM**d?,A$&9m]qAtpL^F!C9G$Y,l1![dH'"Jq508J(k(;hVKm&=rP$[O^su4P7)DU$J;AIe$=;'Tdnc6emd\HHnBKj?:1n@Y$!i1PNkgZPBHf]2UpHgVOIBK4H?gtP1#rn_=:]NK-H4*L+@C%u$^t0lY/-Z1%-V6siJhj:d5-A--S/J[+oeQC<^-ZiEnK`=$q/O92f9iWR$3N\`m`?%8B]T7jSrPk,'iFu60P>kqWGU=l=+jjC?"VakRL"!@t!nE2[@fH8]^]-$)uS56jiR5]'5`[L7@"Yo[O3mNMu@n&PGn)7(nJ!mJ/g)jiL(Z@R12fHhg/*+7:>T+*3?WMBCePDe%LGr#C,V?3pjibcGW0Q64)8dPTif%R6SB@,Vcpo)0iIA,m]&4T=l:HIG-BlhD`d?5_F:%SNj5k]&&gdY9E~> +endstream +endobj +351 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 350 0 R +>> +endobj +352 0 obj +<< /Length 1785 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +GasI)bAQ>un=HfpEesl[N%!tZ`>7YQ%F@8GW,Lubcn]0R,>24'8n&M3miB*cOY+U-?uq(?H#mT]0?]j*kJX&HELgZaj#Yp6lF?>W%eY687]o6*l7D\T\![l+LN6g,Ip\Eds^%:&_I^KEoAiECG&dR7/?TlBgF)Vh9661:r836%n6%To[&h6n!(#N4`apSS*_)E,ZQ!M-RBnQZ#?"Q^%NE<8.?g!"\'k@f6L_jP1,Hjtk$NT#;ZfEl[Qp_NX!pV_5Up\XV/?Tp!rhKQXiBp0j@PXUP[VKcIHXV*Z`kkkkHO!MT)9MLJ?r9D`63GVA(>DE8;kf1A8edD=cBO+tF"fq#"&,=@%ae;38%pAkH4J0Qpl[$kCYA=W:?(5.+Z\+?q6Kh?/0h1B![8]cZ@k8mW:_hIcTuJ$cRHM62=4oK_4$An&<$)Q$]@Fr(fPNN^tFX9q\M8^H%H6g=i19!)CAu!b*jn_Kbbp&0slnpM,gUjG[7r)u"7W#Ec@Y4gR@bOVODuI%4V+M[T_e:"E7u&c[qYZh.lq7ge&s[u6*0K8F:X@9F[/"E@3D[gooJ5/;j'dYHN(57!ISFVn;2p/$$ZtSCC_!H"ZV."i-[*=>0Td\QdjO8KW44[6AoV$tTI!+*<"Dg?503P0iTA%+4KiicA7+@(J.@4sc?K++JZ3@A5KV:0[%]a;H:D4@lfsWu4-o,e=X1gqLVE;]Rt=2C'!n;W3]e6CWVXqQjIV]@Ee(ZJ,OgGRLtg@7@m!st<%n=.bo7-[5;"NZj>X8O^Knaak:#;"2uhZ\=\a,S07lLE$fFuXB[:p[X4f7<9ab_tpnY!B5BCQ9(a)1f4_?_Q%trtCLB~> +endstream +endobj +353 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 352 0 R +>> +endobj +354 0 obj +<< /Length 1360 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +Gasap8WVUa'YaHG#eneX*0.OCESMi\$rj<<>e17N>N.$0$0%Z7*qh6b:H70l8L8@V,)GBISeU![BHGB,:H\XhNZgmDK_U/@8L^oHZ(IFZ&r;Q?7YOsk,R?W$oIFL;n$DL9/KclB\9m:f\W+8i9Bd7B)1f4RrKjV4:/q@K=0!]h>$.c;;=)5j:EmWT7P%pP(QR*R++rF.(X$dY3&;2tg&-``:MKl8BQ.I$qCn_JnQp(bYW\)CAM!AmsM$ZETG>/]Q8?;S]&F&L;?><>MgplC(0W=$[QE2gNUgb,mY:SdUkFe#:)X":jb2QND]Cq16(9!3e.5&7n(Y))1Q,OR2oXV=$%0)ElLiWUrD.TJ`M=e%7-P`.k^FE4aSf.<7a.>/*M=47p;&oJMs-hAF-TaE%&I"D<7//u@;+bWs^HY$;i'@Sg(K,Sdgjrs/_h)_I\Ii;#Zf$oF'&R.6XDWE9QZrD:QYVpF8jIXmJmq&3$scj.]D+@ZclE^q^j!'8&.tW:5%1XKDJ'6:!dqVg4pAk>A1rKX$:="bnkj/rq`_Ld]h\!EDn,YHPh_R^_+mNej='F-%16'$DAW&D*`s%53'i2-20,Jp#Cqct-q.l7=`364%D^744"VZk!#cf`%MjbB*)jobZ/aK$JiD$(4H+n14hp,R:[JufJ1@:2Un/"]b;s%toP/#6A;6I*cB"#h_2\DX-K9QPi2OGgPqKE\^WQ'!&T5;?M%i_=%G34QSjk$/?B"hd4oYf:0$jqi#.G^tU^5]Nb@F2K9(+Q%'G]$Z>_A[k4PoD(gcWOHjc`q60>%:nV`gK+or4\9;!/MGFV>-7/3ip:02oAi!n^GIG7.mQ/K55h\0qEf5?[Hhlsqe_>]sKjb*neV&]'Rb@:?r`GJf3jn=mmDdYFNNKW9rRcmR_`Y\5LhKLI!.0B\;#~> +endstream +endobj +355 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 354 0 R +>> +endobj +356 0 obj +<< /Length 2193 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +GatqnF!L\Sj%m+hq5gXZiP@k9AM\(K[d2E90)4r-=>^C="uXL3OYqPDp_n=K%54]SB?)(X2cI5#`.(V%$kWr^T+>u+NF=nJ,a379GqjZgG:[[[(jb*0!p#7idD:mK&:u,@"b&,dDbbPF8^/t^r@j5%Rr>)O#oMK)^.,(G:nk[IA^f#kL%J_SlFJTK[n%mf[Q>I2_^EOQ(ld;!rO.ci`f10H)uoW;\:Jch\KfAK_NMB,euG5/D(0t1['l*mW[Y%D0+-S]^k*CEjuN9jl#1]AA!b7'c4=i_^-QJ$lCd1!g'^-+NZlesQr4t?UpJ-'i0L@`S?bE(Ra:nq;PiVS?XpcgU01&)0LWBaUF@12-%ub41^<)%7K\St81O(';QZ:SmDDnuqoIdY(kM$afZCE%s`i,t>#dq;qMHO(J&u!Zi<>0sdPfTGj-@;b`q,nfCCY%iDV%LV7\3B/=^!J/oEAH0*(8hK14=f2oMX??E(hMotNEkr9KN<^`=)!%2(d%CWhKfaOaAl+:nbR:8#s9q[W,D3UD!5B8+e1LQ[c>]t2?DGG%+k'!lmfa8Tk#^fm*S;EIVY+R/^))b0L6XiS7=5JM[;i0TO^bTY\t?=ooI?cfO+_?ARf7DYk2pu'0bC842Pi.7VWmISS7FpRa5Kq5bH-i^RFd4b7-TF[&2)qFn]><)VlauW`4Kl?Hs#A)+$m36R"&-c5q]*6e)9.o2QX\&_+A[#R\Xhd@qj&OE$"US^G)geT6>^aiUhs]Imc,SPMqNMbFiNaQ0]XpSAe?%fG]Bm$9c@,FK=KL,I=X9)'e;O_1hk*ue29r8=iqt(gbq^!s84+/=M6Ub?fm$td#1J.(pegWp?S0>HpgN;gDhWqfKuHO3^C.31L@fYS?KW?(j%pek&-56(HgAOLn,GbQ1Jm+>uMb\e@$OR(Wt'L+LVA2N,0HIT=[>?o2-@E2FfuqQm(%O;-a3p+%3c[-tFe:FI/E`fR4MkF4\X//@C\euOMCqiEXE^8EQ`K#4SjB@uo7A&M\FbH%fL(g1.NY7379;`AJKB,JDW(;m@GSiH_O*I?Y,qDHC!+qrB/.:j2ao0scBc#8>;,&i*uL&iD>um4YQKj@D:G@/[^iZjbW[XmD`EVkGoN]a_P7scG%s%50S;S$`P-9G,5nbg*u3/CFqA0ih6S)%!h-;`ShKFM*qkS`f28.X.a=@TQtM'lq[jH``De)F,8&4E.@d-7T+*4XLaQXJ;U`U^K8)So'3jelP?U8^ofL@dTV9(5DSN;p!?ro)_^pe2=52&jj's0S=m._mG +endstream +endobj +357 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 356 0 R +/Annots 358 0 R +>> +endobj +358 0 obj +[ +359 0 R +] +endobj +359 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 340.168 141.254 409.338 131.254 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 345 0 R +/H /I +>> +endobj +360 0 obj +<< /Length 1932 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +GatTIgMYb(oK?QTAIjc_PS$JmXR$"q_ZHnM)n$[;6er"#Tkq0Cj@YZmXOt;V:aAJ%QCK'bJ:QhH>^5[lI_3,"]h^cW,Mu^9(V[Ah^n)'dfY^*$A"TD2H]+Hhi@6?.QEI^?Wu]rs=ES[Uo9o>6ng3*,0C8MK/=3]2pX*3X)i0CbK'&a>pMEG5bpC?!THmAKGB`qA(W%T5^0E:KbN8)GEQ4@i9GM&DY2-^d6<"Ul&OdsG9KZNc/R)E%q,>TfZsc:MkGq(Vg0ADRPK"NHmi7Xfa`I42cshSOH&%KU@-D'KEu=YRe:6I_/L[8?S8^*;!_G[,MMBC[YDUM=IXO4kp>tu<8j)NER9ALkI"]rE,;4pSmZ\X:,rr*R4aTPDS&%M&aM9$3q@'hGXs*Ls0EZ)=j.cC)WkX\_Ji`>1[^<'#uC,E?O:GMmQTm\e>d$,rne[!skRnb$lll6N%H-mqSu$C9Urk@VapFGd1fpG;1s:Yc98g_irc[E+OrLQ*XO%CW99"<"?m0MsUZ="4&`'0egp"8;2b@9eQ3)BC9=mLJ2#l/1<]ihPntpPXrXk`P1eNlQR.1(4F,9a92)`fE:DKh`N@?=>7N#W.s#+eG;/l.gK!kdu"Tk#)H4DCJcs)*Apo0p4T5"peP0%h"5nL,QTb"/gSl/Oq4QcB"bE]W(7;4bP\&WkaZ^>/1^emVdVHg#[LTEL8'kM+tt3g9)=lPOV0bk]I_>B+=.U,JuI#NeBGI/eeDmG`F+R$ZuV^1^9P^2DmZ35cCC?+1XYaGj1*.mf\R.Y@*X[))_BP>m*TE^$`_uL(@d=.c5+cLd@S2T,%Ab#Sdo.G5(e1EhrqD_dSr?$i[B%f^F-Qg_m*cg7X-7u.UN!rI7EEkS\RGmUeWo`U,l;+hdLZU9mU'6q'eMq"-3]e9VP(@2S8h15paD#P^@Z`tei_tUUP]A#"(+2bFZWFTaTnE;.t3A4S6UAN.mWb\$S/Dp?sW3NeI415:]`U,::$P7[Oe?NI5?Kd/=YB5qDJ\E;9u]+?DJONO[uYZ^g9uOa_ni!^W8.4t"P8_-;Yk_hc=N7&Lu>OI3:?hAbA!R*470"lYe[mCi3]P5t3q>DB:rP2Tmoi^OV,iR'UJj\;J8ILfV//MV(8]3dhK!d!H134(8Cn\#*.(>Adq#<_B;u\Lgp([9VftEcJ=.j(ggY;)\?*pGo%7;.pE6mrH%W**I@9M4.FQPD34l2uTo.r5U.'Z:D<`Za,an5L'6J$oOl2qTG:#'au*>LgT"JPRn\1&UmT8;>5a*`SoJcK0d;#o!b6W"J.;,rZ=kuf>Y]Fojalq&Q +endstream +endobj +361 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 360 0 R +>> +endobj +362 0 obj +<< /Length 1921 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +Gat=,h2gPR&:`TP,.\RU@_HbFae&@UCV/"qC8H*9qG@#r^d*2hjrC_oWp9Uj-Q^rG7RK;7t'BDo?EipD==Fdl[REZiCl%+59MEJk'QRCE?SAaR!A@^?Z.#>h=g`#CMA>SX??*4b4$]]@W$eid(rYstIh-odqk.oB>>*`ktTdF@^:NaK/[CC+%AS>fa9#K;8;*p]%,"`iq-`*Vo2I<;QjuO:`(EPdfIN+L0Zis1/upGp0WuI-5llc7#I[OJBS:hm7Y>H;qDpIPs/:aOMF.2.VV"p&1lhqjOK-df8&irI35FP5A'O.Zpm!V-D^:LH(Q'6a*#SY6o\AaL]HnS7RSs>WG+nG;`^.G,?Db6PP56RIUV7B]u*\6gH.G/?jP9B(i0YKB`@(;%/5tGF)L`KtS\5)#r$+H;qNL#tps3]gS,i+-I&$#\UKp`3[?$`:gi]+(&_Lo"B;0lO.lX8%!Na'GDbn^'R&^jklq]!tDKfc0^Gm%#2L\LpOa9%$X)%$U^PQk_%qgk55s0<]_ajgDslKJ`SU>e316@2tPWtlLOK^75Gbn5+k%LJt-rD.im&m\EcI#]U;4[.i(G)rhL/$MG>XB?mGkaSuD)Jc"erNC3-f<1CUC0G+H&n#Gg<$H_.EGt]6;)QN4NP1b^3k1noLXdtTTsu9jC9m%8TqK`#H8bu?qB6F`G^'h,UB&GhP%8Wj[f=\=7l_(j0#En:T6jZ?;-hYG!JFSa,/LKX&/^t)`/1Vh60-(-&56n#=7X7?g>+SjFuWIjNS:-BEE*(31LX!Fnn'Y&mg.6R_Q!"_*3<6jT\@%EQUX\CPZ[kFbj[+ahn617l[1-;\_?HHMpbqLen2"br/:\A$Dp4dTUTVjE[Wap"9qh=H7?#Zd6p`=@>ok[*rI9uTDqj4'qOA>q;okg)CO)DF!SK?:t&.H'W_ohm*?:=bHO7q*4#a^dDa(D?lc87\bS"mY1>RQacm8F5=UQYH%r9fL=ag$C>N@9XQ!FM>E/'5KLh/@M0k/4<,qiL(*@2`k@dXeZt@-.+'[X?_0&s7.[ +endstream +endobj +363 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 362 0 R +/Annots 364 0 R +>> +endobj +364 0 obj +[ +365 0 R +] +endobj +365 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 240.6 363.66 309.77 353.66 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 345 0 R +/H /I +>> +endobj +366 0 obj +<< /Length 1596 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +Gatm<95ilL%)1n+(jegUC_Y(`1IVi![R#*J"c<`86`10KXVnb:Z"@Q-fq@PYY<7uMa(UtG-isMu78i1oP+q)fF`I:T">BseYhEE:_fDUEq'`mft\#1ITOuY=H!2>dttR\/d8A\t.t4%j\uI$r^&GHU^\<-4J93pg$/Dm(uPn?CHJi3Z#o*K9ToqeO"k'L&tBg#*A,8S1CFXC(D""*tmEh+WI^ic?__m#qFAS?V4:K,@El_W:ZNd>\+'Prt*QP)Ca(.-m^;^n9-5EcnjfHq>('lc@j'40/1Okm`5G]b8q>f1s/Fn;@!G>!0`To;cRCldeT:pdLd:HgA5Q4IGS'/e'T!FOf>4,GB[Fha4FB75%!`cU4c5Q,AJ=Of0B$nM_^A096Wo.1QWh-EFRuW&f3QYcjS.Z+?G:3&GaUC=1o-Z36smd6GC.@EaJ!)H0%uMEe'&I$2dnm9[Mil.@Oqb!;e;G.?d=5;O(F\&o_)r0iqOu%W](H"Vm;FW5sECH8ZXMP_1/_8qo;T5Zk[ATKj\SVUTn0HeGS9J7NS,6gJ^\iR#9)LDsam_onsVUUM?H^*h_Cq;"jPo+q6)GNrEGmmVr\%W'M[PfD";jqs3pKjZU-_'3N:aC?bVXhTS=]Ub_?F67i`SrO-"GL+Ck4cPh<9?sAmVH&OEE,GcF)iN='eLb],aq8]]HDX&S$m?63b`VQ7PYVVZg@'M7\Y5DE!aW7(,_QurP^MWmk58&!%_CQO0QFr!$]fJ&6a`g9PJLT,QWf)A1EJ&MCL@7Y+2R.oqUtdbW*rC/!q)n)Q_0)@i@7*I8+eJkpVV;6%0kn]kXB(LMX&I!bVtI<0udBc-WiqVD6:t[uIT^@g'bTa,G44p_]iiB0MjF4E:""mk7LJ;Mb5u=-IW&VkAt^SAkeA\G(`!%!<$X7_-/969Y$ODK@_3`'a!L8ITs8=]([VW+2jI:QD"F5fs;?2H.8e377JUk0pafVg$_9I9$kXbo(GVkmCSe=M<0MHg!EeRkAi::soc@,^Dr!qY#+&fTGZF]fXIh=_ZOMqbV@Q5=A6h/,dYeBi1idR_n]"#K^0g]M^CkS4S`O351% +endstream +endobj +367 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 366 0 R +>> +endobj +368 0 obj +<< /Length 1586 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +Gatm<95iiK&AJ$C#eAI$H5Vjp_fF-+h/*8\!dc?Hk[hF5BT'=L8>8aSNh)pE]d&@hWE<%rT^[Xkik2uC%Yt%fSD;rt%X+!#/@Q;EfhJ^2_@J_q<6W]8#`$\\F1t@u\TQb-f0c,cc+)Jcf[+)Cf$#\sXPeieUoYsqP3(7iCEGb]dU\Q?oPAbDIM@juZFE*m>(!)T0pg#0gE6;UUDORPhEUs##Y#jVpAL1iSF.'0)#5)WJQQ09!Y*?])#F4(+k^oti,>/8Iu[CU7WbK&fb+iaqNL`_4E/uq-pK/Pa8[aK^/#l_9arGHn%MWdkSf/`RlML7Ot_l"oq,]+bd;qsu,1Wu:Q)'[01`U]"B@GO)MlD`+(7o?(79Z;a_?*/kXkuqLK(6)AS+bJH.lBGL]]HR%J>-Wj]:420Y)$&DIi;A'G&lB[l7t"2s*$Jd![ob1U`KMI7fJKi^$RN+>RH\bAloJ/6(+p=pXH0GBn;SpoGB^CrO[qhT4Cboo2MJh3lFTnL16'3K?F2/Y-?=WO"Zkt]'EH*I(IW>"[@coA1rRFYmgO2t@OG[G3XsZ_M*=%\T4B)Fg/X>+_iJQO4Keo7?$iXYMaF,0WS)6s8;E!JF983/XBH9U@WP(8L2koq2WC-51BeMO?Js%g?#m\a,FDI,JILF)ne&&t?/J%NQ0WN(q>T/Q/9S%n[NCqSqsR'1uX`\iQO2X:jh`p$oSO@tinn2@Q-99-g_,92ib[]=HP;`E;7.?qn63!?P#Scdl?)>s46#!0V^?4g;)bf)k[jUU]Olg8h?Sg/&5bbMjn8*E$ZKZ*,+3VE0ACB&26.L1]#70%Od`//XSn>/kX6ftmRD*.cK.4VZ,PO]JkSJrLSlY=)]hXU0);(_qD\Ys4n7KVYd\>f;UufO""c!JMlD8oQXV#RsJ*ciMKU_IMUTNkf6G8?uMqO%eu%.-5_uLABN6T]tZZ'3$V#4Eoc'U=Gi]YPHo!2u!3m.pa_3>sqo8c6E\cO9.BX?AmG,L]VV!TKrbhacD2=W_7kGe]>[(uRF6O6>56FoSn?r71_7d/8e%%m;#S\S;Re4-D\[amYE(bMKQqi9Wo%WX3+fC7iC:qp;5lhj&#uqi*mEcsBqCNXDI\mg8&hjWlUMrWV1G"&o~> +endstream +endobj +369 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 368 0 R +/Annots 370 0 R +>> +endobj +370 0 obj +[ +371 0 R +] +endobj +371 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 154.932 320.761 209.372 310.761 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 335 0 R +/H /I +>> +endobj +372 0 obj +<< /Length 2236 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +Gat%%95bb.&AJ$C#enfCAS+O%1Th5pckO`u5Z+48<(4'T-u#.c=5AXKVr+:4^D%;'mC=uR7V+4t#@l3jK+GUeM%)+oLpNrSj>,02Y_#o8N00HrK1!t0UY^@mHQ.E.+gDP$T])_*d>OZu2_T.FMWe/KB-Wi.Tj59ACK\CW%nGiQ6=ts-*u6jK]&EX_:0_)QllK\;+G6X`!$mY+25%rObntfYJ3b&.eDJboqiA2WhO`LIDfIE\nd]7;uoP,njO_&C3-\_n>9dm`c&:tD-(f%Ec*nRSdj(hc&m!GP7ec8K+,2m?'EFWSJ\kpLX8"8L.Vf*+Go+Mm3XWGoPrt4$?ZQ-kb8f)16pnKc)b!<83?ePj-%^FXj)"CY$%!3q6:Dnr4r=m+"B"Sd]4'7feY;5.kHR`\=lM49Buu/5i&_lbYIhAc0msYd%_AI7O#)?I!u'mlKI2[#4QI(#q3c^#(8-2LMmB\oLT[`hd/;M\[-F?X@)u.dltIX#>Z;5VWS3K1=-bf-rmfTqktopsdX7pd5m%gV.N2?5W94`eEE_5g1U!scT3_(&oUdj2)"oLg2C$U'OY+W"Zf2Q]']2.GLZ7_6:[Nt)DAZaqk`k>d>0B^uCVh^K?kiL3s4`p\(raGnf%`R2*bEQ7?s\@."YeUUZ!Y>j)3GI_#JD'RrQC[sa.[WZf#@/V[!JR_gqed]_OFO&pP*<0Kl@P[iDb6U[E$Rm6.&D]j'a%%@pSKer,D(GoYp]"AJ2KaWK&e.L4qlB66/YWB7XI23c``r!l7V'G!eJ%]KB(tk`MJ@VV"/G)uEbl4QL^Eb"H>JDO(!A,XoL/rEAQ-.\MRbQ+-pc>/jV?K,W_jYT1k,\E9ej<5#&kCeOc+]D]frm9JK`(_Jp)(>6hZb2h:1>reXh9PAeBVZ2hZhX(VX9JVIFUr1.1@IkWji2,fSfG%Ie>j#%TS(Zs1NMDT@'X,RfLQWIE;+E8T!b1$@2`(qbrg0#g!PM^gZT^E@@36C"rpY*+q%g'_WKSQ&jof_?BGk@$;!S<@nH'gdULNSASk_Pa]$PDgTm9iD_i+R^G\rP[Sf8^$:8:;Ynd"A0m(76Fo.`KWOqAeW%RX@aX.NU&X/HJR)jidQd! +endstream +endobj +373 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 372 0 R +>> +endobj +374 0 obj +<< /Length 1502 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +GauHL997gc&AJ$C#W]8]@[ATC005"4RNMdf6\$Ap2*K;AD6oqUIO!C,M_[BKe5f-SXPJebl(k>pVmSoqp7$k5:)p5DWfhRsW[0t(b,&e,F,8%C1t!A=+\]FJo$MH4lS4j#ZOe;XHtg[!`BWmRMLSHQ`6iTP.aQ^Pmh7e-Y]*s<>?Q^SVca*r&M@>+>mQbN=ar.PM.ORcr/YNQ?[6#jjE/YbjM5JZ@icY%N?8OaS+nP\F.Jaua=-=n`"[*%!FEmn[S*ClRgCn,JFE/ag$Rhs^PnkOL2CQ&*;9]SjV)isr<.,&`W_XOEq/er+t2Uq6NZkqP>OXmS.k(I)QW[SF2dM'mXP4U7b0m`;r+3`e[gq8EMaH1]H2\:h&P0@f=sM^dDE1?Ve#8Q]iOauL>cbLra>QmpA31"f^7><\Z\_3<$OO$j[P7jBbVIuD_or0a#?_mV(;SnQ!if&4'5oY4$qW@@fASEi>\S3#3D&i4Km=*0gX"\q]1)MHq*uf\bL47VF:@kIA_QPf:%%KKdrN6CMun$r"`c_$So[d<&T+AXXZ,.U:?U:d:,p9QYh=C32k-oQC:bX$_#=#Xj,:qNM*483Y7%i=j(e,7s.=gG<2>ahp;67ZfLeV&gVn)hpFCWjgLMj +endstream +endobj +375 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 374 0 R +>> +endobj +376 0 obj +<< /Length 2595 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +Gat=-h/D>`&V&,6@I-WG7De7mf&lh5=6uV^TN;g:=qmfbR?N'e!1jsec\kTir_oI7NrH@MbDqD$s$8J\OQN6A],C-/o_05g!#bDXsQb;*>XMHi'Yip%%kVoiWG@@9V(1-\/Jh7ck3/:85W=)72e,\02uX+*&amXBs^Hd-1"Ya85\Es(48ctDmkg@cQ5]IS&Yo8:#1F"Q[::s9Lmp-b='f*'4_Z;Dd@XI6Y>F_H%6h!92>BL?B\m6PI1%WXu"1S2RlK.*u9Y2ibJ76mD0DlU)u<8BBXU6577]$+#JOqP5ea_'aj`p7jQ>RG7U3e))e31X>o<^/[FFb_q5.IOV>?Tm"`iq;O)HNXkD*\`%XN,s06T/W@ct#mbC;M$`4OtcZ&!D/6L@qdif`$l]B)J&bX0fQ>=li3b3b:OJXR]0E`37::(fN?Bf[co$-Rk`>p$@ID_4!bLT%>'iVtV-1'<,o4^h@#ZI,6qG:5P[O^[s`3%s'Y6:=ms4LAl.A^iAYnO.NR?I+>\01COP'em%cC67k1D?i$O?SpX(;hnZi#/Z;#M'JTE\o2u[,'Q"Np[qX-gAY1oq7$RNg;Rk1nOqO-!s(1#SQ73DoieT!(VfNA7$&]meJZ09"*Ld\eqS(hMHiAXF3IeJs4t5Qmj)ZS`9\*$QXOb1*emJL=utEl83j"BCe]^X]Z(#@A:#-XQ(7?O1[V`;7s,r\U>Rn<.;`%8[Z!j-Nc%n*H.K]K@jh9kBXd9g4\sfInVTP,RTN#BTPhubO?Vd!Xa.CO3[(K,0ZN^\@tJs[TtuXW<=kX2PiU-ok3?^b_HR8@_)7/1W`b)c=Su,M8Z;gM-Z0B*&Z@"^/W:05ia;Q[h@Bpl^4e_@:3R*IS0LBRE\#Z4+b#q$0?j_VZ`R$jucCB0Si)^7F=e0.5)TYaJs%65?Wg*g$Ob*R1M84l"aGS\rffhh[Cm&9r\/Vr<;Uk8UlZpYm9QtBBnd_3oNsiG4R>SaH),11RTiK/(sCbqK+9R7s>b1=#@B/JR$C"LSj3\EK%Np::O?$)Hk!m4.!CqAXm&1$)!]:h+$*RXP"]O>^MdunD#HjBbmQu3iol#4qg4:=TdEeWt.HnR1Pk"eCD'G"ABPQ?n)``ZNeB!ur5sA]ZpM*bfU.'8Co&k46jD[[mE[pe&Y[;L&+!sbIiGEX<$&:S`>AaR\h]>1toY6@;-Xj1V*@<>E5P+s%fJ5W_J4U?bfhhAF7\GDb"4Y_>JeZYYUDVUj,]Ek'-P@Iu[6M5j*%ej=nJ'0'$eKbITK63S11EcA'im?#^2JUQiOFHC(_3V[(+Qr-'(:c\>rX:N't,HOBs9&K&R_)950.?jj!241R"nIi\/Xj(1RnHEDB,c(CpuOqW!&hoFO*+"/nIgLR+ZEe$?SZco:jPNKk*Xtk.[olS0t8#7akao#".A`eYpBM$nY=S3PesKiFZ]l#%Ja&*A]8>E==^Rir>8iSP@UTl2Er-23F/WZo(+<^.@`?,f9MYTsjAr\4Pc-1Ee=i#r`e'-`km7Y=>3\(-(ai1uDL13POgOAXE@K<35.'Wo&u^H>bL`P4.tn&oCc(m,kd0N)Af^&$@2pCFEp:"Lp(@[O] +endstream +endobj +377 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 376 0 R +>> +endobj +378 0 obj +<< /Length 1908 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +GauHL997gc&AIV:&:C`!]?:p\ac\R'+TWK(]bPK^F]$4@5DB;#5O%2m^hI:ilHb16bq=*EN,ae$hI`UMokUd;$DmNg:XOu?T%jHm5'(Wi-2>^"BS,1_5h-9dcW^;dDYR<9*/R3CL3@Ke27l:[\ks6Y;`k>MY.1=]\fr0lFJ;pkjmAYUe?aX%n4Cj/2CtiFTA0m@3$["d3Qfm&`mIUifQdsFLhPl8+9#eoY8e7q!'q*WP>_G?)2Z3DMRoP`r]1makG`j?Bd&rY2`F^N#AXAR])<.O+^rVfV!#_+R3bjDTEqQ>6f?;hrb:ai@W>G3=e?-mpfC9TA;nJ:F*P7<3>To+m!HRh8H*Ra7cCdcACKXBpc/EG2-1T,57Q*2KXR?j_L8irnO^0+Xgl(44t*]QCd3b'*?qIaJ%UD91G=t'1;mAU9Xm#\)hDmVb&1Y+LJea&q]%P;O_WnRUk9b_as98WoW3i*DgOX?i#5jg*II>_B^(Si,iT;6oiMeDO7\D8V[LO.1`u5)CoJSR>c2nmb+2qPC%iJQFLX'LINErbDES0o0i*:a.+]!AR-]AF_<,aDp$&YYb=L(qc&fF@)-gh]:iY^X7I,eO4j`N\!#;1-:\a=M2GLsCS<*]D+d'/1@s"^K^HmDMpYEpDS;nCQdaV+F9od"gur9J[Db1-EadhpZk)*T4]DDB2e-N&B#P8uQ*;PJ6.!7"hT&ctH^KG$.$/M6l`eR=kiJaG8$TBe\g1D_*M4';KnNe#-1,%Tslj5$iIi3KVGoI9hE:2WHge/gWOW(\6kfYo5V+%de-F%=!0c`AgOCmT'jR4QkV[[i"]uK^9#[KAXPJ4pY8\I"UL9,/ECNMCX\hp)h;[ccg$kDFE];ue1<)9dVAUpgu-/5~> +endstream +endobj +379 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 378 0 R +>> +endobj +380 0 obj +<< /Length 1951 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +Gat=,;/b2I&:Vs/&H%[o9c-_A,qJ4$>*W9DdoCRAFd#`ps@XAam],MZAn4s-)[E9bQaIEKn6h'>XHRdVsYKHb#0aZTqGE!5-dcK7cs%e,*\3@SNnHh7O3p!V,n4:5Dofn@M83HM"!5JS6\R:9d7HZ[-!'P+BueKM;dS(]YSqrH=rP2NFeX&lD=b>9O6]+hbr>hrJV\7"M!O?5gJ;WoFik*bR$W7qk+TcT!-qmf])57URf]0QRoU)ES+FRIq6acZ,H/ct%iRn4mogctQ-5@Q3BnJkH'"jY5p%6WN^'S_^g=*O?_-:;=Z^4g4'koed6,5+Q+JYqIG7LP]5:E64i_LE74"05D/=2G`!>A#h9032RX"!qB2"'ACMmXF*8OnMe[n_,^qM,JhdIYR:;e.6K"f'oTcFM;uj6ME>6N(YX_iJN43'GD$4'$LLK#2hjt)+VEpVHUl]q,TZJJW/6?8BIuPWD@30MmA7)J((aqDSWuC>QM"(_kGK'99%L)/>b!r3Ch,=&)NC:mWiHM>BZ*99g7VgnU,6hF.WgJVEDk=QW4Zt[036n"j]J_Q\1N*(n*738XtG;r95*0>UR#!;qc_kFra%g@#7O?)L4n1*VchVjbT:AU"TI&h!3/c,R=4cjJG0Q^[=bA)CdT,E'4&SJSQ*nE3ru[dAS4LaS_".u#KK37r"^=!V@&\l:<.q"c+pA2mZW;h9VY/85+V"8#i%WSJjL77Nr22^1"i)&/e6,%sZR0C(;Z<]":2c27DQos*e+L;*jVckBR36h\+:5[hR1olfku+XN8]%"=A;&Mm#LgZ%?Grj:B2:1FY.O1TB;UKRlVS%ii)/A0XMV/qecSP!Cj^?L1&0^M,j]9Cl=^G@95bj3I)B<[Zp-S5sHj".X)rWaN0>'p~> +endstream +endobj +381 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 380 0 R +>> +endobj +382 0 obj +<< /Length 1468 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +GatU395iQE&AJ$C#X'J!_MA`9d`l3YVV(@fQ='&g`^HC_m@t#\Qh[oD"'Xd>-iCiDUH+&;7kT?\H75!J=5K_#U31R6Um_&hFR0?T3K&=a:tAj*#X4ASH*N-aHkSb;RMpS/P:Pp1A!l-uko;DeN!Ar3"]u=s\R,Cl74iE^j;R0c.h-D=DbRr-_1,#Y-WWn]K%G5)>s,Vji:)bY#(O.'-B>9n=&:[8+C;`l,cmCujJ4(FL@sUYaed@gBlP&_D^m%rY&7=M,8Lbs!`806-)edL7&pdLDm\:8`qq"^=Tli;N)aOtQt5<5eXi4XY6r#&WhmQLNQq^Sjsu%sdEfAJ!-L&.bkBIue#Kuo(s^Yhhj%K,),80G.;C#JYupOM8l!tA]5nJUQYFHqP)LmB#'E'WO&cf17(QEVL0^]7C2(Y+.&5YH3:(M:jca!Lpi!S\UGrBZ1(Vm3tY8F3'(bX36hLi#4`uhfM90`U:eW/-4rKkma$=Weo3'@HTQ26[NX0q<=.=^Bf,b7G;ZGSNn/_\5//dsZso@>.gg"B:!Mab.V^hhM&9Ys?^uboY);NDVp:`5%=YRBq*Ft[#;H1(@8(K4"rj7S__slgVKQ)LH(`.0;ef)K8D4h^mJcBeh6NQ;]I.aHM;59"MJ]k=C<^k7\<%2.DN`f^He7B(SekU=j^Dsd$"sseWoJ"ME7^kX&Bi_/s!d2`fs+q:WgQI4q[YIki8FWG-n3h"S)ir#6HV>B@>Y(,!pQ5%d`#!G[l<7'bVWUb=?BRI/[fCR_9`Wt.0[.!c!nXb4V@>Jc_GXK=ZQuebZa7l9_?5nN=@uuYa>b$GlO$72p,u2m&*1]T-kE9n+80f(A64A;#H+E_$J!9W!Ift?O+Pf*./'3Bjn]0Y,El:;uSI@r5B0(JiH?h)U\SLDhbo;HF^_cOGrh+!2E^1$mN\&WY;J51J~> +endstream +endobj +383 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 382 0 R +>> +endobj +384 0 obj +<< /Length 1501 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +GatU3>DqN"'RnB30_7+'4'GdQ-+gKdkUp.S@35iMI;$cr3(iP>0<(di3\C6dHfUYQNgs6#JKPsRI7H>bn&QS/X1+_L+N+NjS&5R_>F87KobHQ$mF.a^k$@Y^5mE`!XQZ6GhImHBjIo;(/A#:MYah,M?X65N@5`Qc4rOf]CQZRFpgSFH0X:AU"LpZp#e!0TRVeP,;:84AEs=r!S7,;SD:QUPQljUrB!1=\T1Y6f]q'B!)mSa+Md>QIT>4.&\$o:2gtB*4[H">&at^>k+D@/M2lteBHh/;&`$r%\BQd`Vib]jU`Z0hT+1qNVWXHii<9M`0BtGW2,Y_Q.gDR96l:&)i_FG`"8le%,^3M9p>df?Pk/=tYo%5#R;s,>;-RchKPMfL@/ZM_c5tC^7bBbM'Bq3^Id)rZ;TJ!JiH#o.1>"u&0@]72t8UqOf7^n&(lS\U(g#e^ZCq31Vok'4J47FnqB/_Bag!R-2Aq.H-'o,jeLPk_XJPdA@>WAu&04GB1G&t]ao>920Qb&_T""C(QdCAU!X%nlMHFSTkJW1muO=!1c\:-U.m,(GfgT%3KZ^a+@0fc=G-hW[fon%W75r<_\FJ15(,XNr>]j3I1.WCOO>5pYp#W3#,L[^oERuOVac#t@F/(sXd3+1("W(8de_JGRNeIKpl>d%X"ua\lEK:QNX9_K:ODHaabLm^$oto`r4:\T&Hi#bIV#;D$DgWKkhpcd$R^m%ql,i&^\iX*#J;&?jK0j',oI`Q-*r(\pY=A"dQN#SJ;ttCK~> +endstream +endobj +385 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 384 0 R +>> +endobj +386 0 obj +<< /Length 1302 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +Gb"/'9p;&+&A@sBE:_:#d0L%ME(s>Qf\9I&[baWu7bI'8E.f'@rr!0IOMER2U\;"$2&CB[[CT`>Hf4_0gH9o(6-'%`K3bp:_.aPe;#c4M6N@9##G.f"7L>YT6173PE29gTrJ4>4P'f4!rk/knM!Ct2Zh[n3u%;/@VV<44fNL9T#^7"^_:YPK4K6P-`gF6+t@QI!G&FlRVTp%Drs;l7i&1s1k-7Y^QZgW8XuAe!FX._g4(Kp7k(pCG;2nC"q;k=$W7rXh-ImVHL/0;9kp>J6-FEnqh#:#r]pmGY\Q*>L">U\SmE=mu>BJ]WjOlH>DHMYrnV%R1C;+d[TDYTnrm@Iss'?Rul9roH3'O_$hRt/b8dLq)uc8kNO\-7OHXTCe3cGhhZTDqZMWR;.d@GMHa@clhlfG$popAptrp7oD]<5qC(s9LR417W98NMds:k6L0hO07mEW\<:N=!epA#A"t7BI4gEB#>8"Y/i;S8t0&h\/;u0/YXA,-Q!%(8mE5ZhijZ3o*Uu:M'fI=PrFf00'f4"8?CrN4c3T$`s><-m>lIr03T7H)d3-YPtZQ$ck`$aaIuj>3t9S6p#.A?2/L;$8S2(,`oden@CN"tNW'@P';kYu>'FDIk$GE@'9:OrG/.c7LDr]NbrpXb2Q`QD67ilY%f[VY#fF?$0GV(,?>*s!+m2X;2bp&O;`/'W]>KkNX(Z58*"*>~> +endstream +endobj +387 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 386 0 R +>> +endobj +388 0 obj +<< /Length 1090 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +Gatm:a_oie&A@rkGU_PN.3i`)<5^d"BFhckd&ec+`hmSs''3k"PJ8cYR8e$(D@m_iamj39%;3c&A9%?t!5p%@5dFSs@)"rL0HUEWL&p35K2K]TP(W5HF^AmRXLJ9q5k$dP&SGgfb+^%_N,?dC[.W*J@9o4Cus7k-h7"\J;NV,,(R3RnQeA]$aS1oVV:86RG;BM;jab.EOJo&FPs-q>tMWMa!D@Fm8Q1/U\?rU0(D_3(l?n`mcuo*(fL3+5.e"Y^eBARSIc:C$_,#Ne)d*Lmj6351W[j^+7F"ui0<`QruWOVi*C8;n]!.0uU*P*rLOK&,G@i\>FP]9&d7lKj+ZW_EtIRbT7a&=c1d'6bHa*d@8#Sami'#Nt`ebkV81&B!pE&ah9i("B"84K3>%?-@qE.kkaggn0OFaFGj?7/L$>u=5!3ESRJ'ZX@J&LM*,F"bi[:$M4NaqqI6F]e>l()'%jGD7+m_h`ol_eQ$;G"@R$A<.n_5c(@WG,#hO9/fDVQ4M6$8L^=mG/oB<"fUR"dKM_DdHbZ/XlmmUcHKP.bZVoPc^nTD#>hq`p1"CoZ7Ad$N>0l]92'7/Pl]t>=-UlbN)57(0\nq;+(:*T#g2eI=HC]~> +endstream +endobj +389 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 388 0 R +>> +endobj +390 0 obj +<< /Length 1567 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +Gasaq95iiK&AJ$CW2D[A_UXR=FN>an>I:j@^9&1Z>,#kW-.,@`8^h$R;NsRIQ7X>3UD\+or8oHCm5A=#:P&k'3"L2Q9c0BY;%TbB-pTKm!u+(`B/%sq_:S'uab8`^4Zru+K&'d+'F%F5:+=:^.Z-).b@?'caGA7;Sc'\];t(Ep%&C`5j%NWLFMueijL,U([;.^07uJFBMi;'W3F3*90rO,G'>:!BS\dWb0j8AB3Yi,Ht*7h(l(oa/7"h+kEH)GmJb4)GbK=(+$>;jLs\)'=kKdBBjSt:opLl`RSHE>$R`7?XlGo2s--aJd0h=RZuX;@_e7"/!3j@*Um,8-c`%qgDIAS,Qt8Y@d.U-mPoAYICI&Yd1l8CC-]^Ml'LcnXTCED)4T`10*D,N+tQiX(#@"AYD../?EMX5&BBRY^t=KJOp=Y']1I)$*O4B99mbW:(m(^]tc<,E7?tQOEXrRA@YXc;p./"eh]Kii5?KOU8kBQOQJh'WadL%6'NWr)/m_@9iEkO_<'A;Dasat=%#?u?"(>""Ju;CRN8Fm24/GZZ^)_J6hX=A!DF.016gQ&i.T<\q,`].T6p("D(qT]&@rsK%n&8a<@gULoN'F]kL;hOa5SDqo,M'!fE\No9=On+HP:PlRnB?9>Dg0arW'F*>^i`Am6i28,G/HnsG)4,bdA]msb50TY^@`9=Z=]ikpD1]`/;,','fgB61LiZC>Q+Br6'S-$I0eq@]`Y8iZ0l(c=P`6o=M72tC1qs)qgn9nMd\_Lo;/0JruYQ/iT.'`->*cj&&Z^ig,a0-=)u8BOd>JScR`,Z\R`s=HM1=\!D=??/H*bmI5WtHT+mT28'C5a@Oj"(H%Aag19aG^pp])AVtk&&(IY6c<%VB?X,7EI$'(Li2fCdUQ)Q&nL?bSgD:-53;<.B"i=f?PTO(oe]D?[-e#s*$*L%q*eau)++%oT~> +endstream +endobj +391 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 390 0 R +>> +endobj +392 0 obj +<< /Length 1267 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +Gau`S>E@5o&:X)OLj7UU`+F(/ZA8aI37:+PiCF\:"ut_Gg]<1K)hUI2Y#Fkq<"0)S[[A(ofnl)H`lOJX-Ml7=2*_:5Mtu5,ttV[of(1ik^6S&0kZ_kNcklWfD4O)o@_g2QO;_L_9(ih+#c"""XDj"EtuW.DTr^E%[:9RV(C7BXj6;0pq[t*AEPYfV#uHiidcJ/n06)LL-OV50R,rWT^PIh>)$s2._7"p04;gn@<`/P\t=dsS8B%][o`K?!ZWQo$kIGgBnYM+?4u4(ET4H\GRhLjJq@\.%Wre(4C@.GFpTgN3:>i47dg;p7(UG`d\nUR+[Krcsp9=\Dn4J5%!X=b>12sE3M$u$:/o&CF"!e&N>7S4'FEVFG823h?oOM+U$YYG32iY53%5!ZnQ$C<0hW[qUH[S6GMjkZLeTq.gW"G;Ur)3N#)4N!sU;Y;3D/>uM`DNG$qN>aLr#sWrk-o,Q0sVtC`6RJ4^pL[?Zo6KRs<^@0e7!+5B=XBZl'^G8kfaqVjkJArW;SXO.q;*i?PC9YVck."AC&#/HbL7?34RU\(/7N*[h*c-Se;>(GE*)'("b#fIG'I2=g\gb8SO+JJ_D&dLBAGm3I&;F&%=FBB=61?:i60cHmQDJ'oX8iCR$7CD4@`,SgJ,mJe-Y(0C_l8+345a"Zi'7<^IQBc=?RLUga6!s!V9p)O%oT0_g#n9qA>c-WTh;HR$BT9N-Zk1`8pB[)mmW*qMlC)!(s_%rI2OVCI]]-M>c;ABYgRNut9m#$$&rSELath-GOkBk..N$*RerD[[L@5>X'p'Q<6FadG1EHGgeCq>,u>'Y8_kIRjA45aU(8rDTKM7kZUF.&ZORLc7fE"Tt\Kr[mG:nH,VpeE/B't$KsYK.aWu2#&GKNb;0+]h9E:5b'JohmG`W%pt^,d?%9*Q.lNOY`psnEhEC\SYZ%\'>J8k<1*(1/2[a**bMMs$OP0o$^$&+#c<-gd\iEuIrm:8epI".67X=&t9g8X>p'&5~> +endstream +endobj +393 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 392 0 R +>> +endobj +394 0 obj +<< /Length 1452 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +Gau`T9lK&M&A@sB#e=aQlnTdXIE8+oaT=*A/rI0Pe3uXGPbV9VZ6Y]O>4fRr1+.-uoT+6pAnC*0*Mf\6<-ec91G[grdn!ntU<"P/3NXPX]7JpJ"*=k\'\ua6:3k)!/U>H^cBLh3_I3s/T;a5C"??gLi4'5V"=O^QE7AisRcT;1gZ*$kID*0n^>$OH::*n**SSK.&lBDg@[6_84G1#aUGPA)2Ondc3U/D71cs,og#+CSbZ`RC%T.%q[6l$jV1c,$bSkaO"QKh/?08g*fDH-RS/l9C[0b:7P]+C"22l=2^fV@.E)P*]O4i0o23[s/6\g(?V4)sMWIC3u%@t&#^@iJ.k]"[rWCCh5%c1/"l45G84"s?S5gE]cUL82U^,5lE37_0/&)G8h7]t>lk(H$kLtE(PH!NWh5uma)^hL4\]AEJ2EjaJ^7GTA?^"[4HAA3JEI]6(_%hl^=qr*qLWboPdIN.:Y3L3$\iT6.=P#[D3/(e*i1FT8`too5ue'-L$,%B,L9$=LT4Q*YMk4:-C_>%j'?$%7QH39aM4)YSY1I"Ggh`]u8.UjBL7fkHI4&ckM96>mm!.8"^]EYr_$c'>Ts+`oe(,l9HV$%@-L=O2Pd*=M]hR++!Yg<*k&-;CShL/)e!,M.\p3]6*4qbPD3'4"O;>:2NgZg?isQ_2"IhG)S/+GTWF_-:9;+aO.=n3N7&;fb:FRWgX,acB3gM0'U\QD=7D2B?KqFZ"%7d#*T71BOj2PnQkF\[BnSF`BCKmMoq4"uZ@QW+pXU\0Ua.`7:E5m\5*W#n1u11:W:i@!=7n#6P)6Y7VfAA)ZC7Q,mqbpf[FMQm[$)WCGk1D=URGm/\R;^@VR+[Ve!enC,&NM).Y:2nP*23Uh,F-)l5t$#)+\N7+j0]O_7`W^B^J,UeRifG<%qmE?OJeB-_b`L1R7n%RoMaWP$Zc*GhU,X[Wp[GY^D'3hL#d&T5WnN(b`kA:E0dk2&WO&V,t*L^2f[,X!ELYb=h5E@5G#gK/%fNfjd$;Au;HV\;"h+p:L?9U63NHD``&g_lGe17)6qf+V/omWdPJYl^[-!=4V19:@=aGs.+ld* +endstream +endobj +395 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 394 0 R +>> +endobj +396 0 obj +<< /Length 833 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +Gb!#[9on!^&A@Zc,#08gY/b_FpkmQaoN!iYh)uTo!bt97`b`'_^(,_HU#`8dLPe_[najtO@m?G_1AgVb!l,'H8NOaT2M2"a*s=j/+NFTc&!B&@K7!56_UiFPM%Y.[ka#jf;4N]u873.:p67qF#jfOi"u8F7*1aL#.))+D>:GB=)`GZ>J4C+E?>iu=D.0`X5R8d8:tP3sEX3)@$\1M9i`'E.\cBMeiplk.8i60q9nSLg;??`6IoZ)CZkn~> +endstream +endobj +397 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 396 0 R +>> +endobj +398 0 obj +<< /Length 1575 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +GauHL99Z,/&AJ$CE8-f'/BcM0@lBUS8oCX!D7g)k)I$>qH*NaW^Q4HZh:OFDZDkC5)tiN4ou$BD]DD(MotnKT]PY%`]Yc5k!rWp]@FR$<0_3-*gRc(@LI-k7B[l.kq]+_&^\/_u&WjN$L5Q00..PN8JcdjN@%p&`!S')[kiKte>p(TBMG(d#jIBAj:8"Q*4hD8<$:a+NeB9W^]])aO&T\\,Cec3&rX#PF^$jhOmq]:^E'S1me;:$X;.YLiapHLBhO/2ZhEKb53-HpH(>+kAL4B\1:;J]4UuMsS6VLYk1@.c,[Ol-DuDNtO`]9a"N`:5E%d_p6c-*oQc0VMKA_aJM/[VKAU?JOP=SkSFK^\VRWC7?X>/He04:]CZ:6u?K.+JfE&Pth.;(LsFq;tA048$OL90n2JoWf**'#<5Tn(b\M`roqOCo'aG1FYI]rpB>2W]mGY_fj-cIPQ_E`(>'$0CT;R/O(S28Vkt+.2me=``gg)*m79[U<$`K?_LL>a4_Ia:"RIWccOKQ+WBg?X^UQd2mr`cCoBZBPaP&jr[uCe6UhO'7-WM#4c"LN&k"&ZU(s;<2%\ZqUXs!$@VMcQg4C6[d3:H[)LO9\tS:oInu2LpFX@L5,@1c<]\a'88T*'AE/!i'R(*LK.I$=iRUW)-csFDuIbNMhtku[]V!_8N&OuD&7/0gUrX4qJb9/!>0BJ(XR#BQ#ig?UR2U[=hA^s#-K?\o.Z%Gno2*"b*Lh7e%(e5UZ#BCD>'$nc/"!u$:h=**%Xn>kp=\ip)pML4(R=n_kuc+(RUu;JN7bu=f5+3'r-ePH(G2u?CH,kP"g1$:fo)XscW5HD!B_*jOPP)`Fg':6NeSJ=!qLR&rgg491=*.OnO%`3,>O8[!G:L_iG+,_W"o`~> +endstream +endobj +399 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 398 0 R +>> +endobj +400 0 obj +<< /Length 1300 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +Gb!;d9on$e&A@sB#eARq33#MtpXTg"\!$X_G6$lsF(hYKlQ[AK),f'>"AVFu>OZ?&BH],7aD'L7"\.BkGLLX_E'VAk@"s5(a;nplcbq4!7+]OJq2`,a&O7d15(anJ$2%D&f"YE!.ml*'.8P\'g,p)[^RM(5r(^P@3!ea[>2)&4NeWl>d?V/YDI!K$M+n>lt3(?mmtPBq7%"J6:l+Zq[Ns<5><;X(oq.4*4m'b*Jn.gRf*+`Z9[MD)@)g)5t``1!oGq+O2Y!LF*Ru4A.&X!*F*_[6Y'(pZom_uITV-o;`$@;!o51C-j5KkNe&nhGiaO^o)$2LocqdjXr;;g-6&aF*a+^Ebk+WrPE4g1po'1X2sbipMTih\m7X?Vg,X8NbD;j\Bi?3k/j'k/7I9[]4k[XOSj$J6!'1&.2s:7bU;VDV&''7G5M';aVUA#5j+gi(j0D/35:-p\MfYuIe(WR*.JfY./9p'U!8I^'1FScBINe,4(%YS"`J+/Jl\+hfmJ07gnBqaYYWJ%&c?SlH6e;NY.4/^bNn_a3-@4BQ1$&nckgZZn`$5Pn$8N(b)(0.M9Y)=)Y5%^cH:_ejSG)_1pP"5%;jo[3Elm5Q'"Q17>V8's6d@*K]fJ"'rRS-=?[\.MJ*RQS]D!3=%(_8rFs3'$(\eUh.qPZk<13X`XJN<;<6h0%h;E'i+6q@a)"Ids%SX1u7G`3_HF#KR>h!Bp/+W2<=uqIB24BBDd"d(9+mJ~> +endstream +endobj +401 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 400 0 R +>> +endobj +402 0 obj +<< /Length 1701 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +GauHLhfGPN&:X@\_;%]MBoW6!)qsUPk;p<%orT7L`A]_2Q5qh"E<;Z+Sc8'm>+o4`32R5Rj<=AcAUit!Q->$6jP,`P(C#?HX`foDgJ:-hd!q`*7\+K97Xhl>^op"9Mg_QI6#ua(3^s6g%EXWq5Y6pK&6%"A:tc'[TSB_]8L"OgEq+L.c$b#?khd;r_EQ0-(S7nnZ7+Qq2503.DH/UTFUu?LS%M@:Xolp2iRMN%[5#EEs;1k?#h@LP^qh/juj`W>h_'gH/_Z`sgZ]Le1cU>>D-H:H\=g0JeE:.!jE7N@2]niWDR,2-_Y"?^St'7i$DF&q@=_&>:A6,q";JsZAs*q;2!KH2COGIY*W^\!9foTK4t;B:aXkgOgI6`!I$=%Yb_kg3$YEZ=7%)B+BEnujVq8AE8d]a%\F5>(*1kQ6.mlp:0tW;/0/K>C#u;p6jURu"FoY'?B+&IHS(+1b$6A>"usa&Z>%8fn;5;M_XNEXF1fJ5O7'f&u/oN_DJ_b(ctim*54UUBOE]]\lJC$Tt,hq]Lrif"NObA0Dk?+Gt%Z?0'GAi$05m#?ItOdn2Zg3at9r38n^Z+\p.h*Np(m2FunTOnFd`1PgT\Ef1I*cRG&'*LfG$Hrf7j?Y9#(StiiiRgPDPRfUKPLmpQeOj^?dEUSXM#n[;N/e3m@i,$#Uij.5MiXrQBmX,H`9F,u8rMh0kmLK;bO%lJ?l?0Dd^r_F/cm6D%.0a7Ko+b$V_"mKiq_JO0jNWF[-WTIJ!";FM@:X@A-iTo.>[A7UVQDP^>h3Db);K7..-hNikge0#Sac"Y#cW?/u,eO$WYtfZ/dAj^u@&a"637o!W*tCFp(sbN(hQ7gKcRc/c+)8;>[uM>G_@ZUJ?>PaR@+cga$A(D*cbOGl\I[b!*[RpJ[sILe[S,ifAhb(0G2B#b);,Jp?bQ7RNjl$\su21]WABT#KN@"5Eh9r;d+5Gh.^L1r<#6`$L:[4gdY'kb1/L/F)Du!Sn4mg"%S!\%Q7gnqU/#q8m3Qm@"&kB7B5fo28BU7J4\j6MA:2T\jg1g?(>U+bZI/#2EZ%)0s.?+_a!DK5(3B;T9*Y9mW8>9A7QMaOT[RrtB*ML2tWDj(\^=57JWqH9%rc.%/[>1)k;Y]AX,4WejOM#I.Mp?+_T4pq(i2'+,YkoWd,nYQ~> +endstream +endobj +403 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 402 0 R +>> +endobj +404 0 obj +<< /Length 1937 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +Gb"/(9on$e&A@P90QQ\9i$]3a=]TlBd4O'N>8ZQI%K]h2D)O02OHR*MmmCh@8n,)e6]>o"/Kg@\&n*e-Hi@^RQqHl(;L_452$)27E50Z:HMl&%XLY5mpB0hdFq.b*Q$bnCSMs(^F8Y:E.[J+[_`1]BkZ=r3,am)>&jU:B!o*'InO6^cIT`>'+dW]!l3VO%YH_L6_`CR6rEPJpeklRP.Y%5j+QSX5/1)2Uk_Kl+dSH<)_A+(L%;1[,H>e`E-M)''EgIU,[d2;&Vin9b(+,F22\J!A;ce%H,)p\e&u4?Z(KCpJ-b8KUi3:Qh5"B[s5-\)N"-SAA0(F=-iUNC=@#,3_f:'Z:?OS_Ik5]li@12*-ful$S<;S%!4A4Y+uCBai1)+VP:J'\a&04%O"a,I[dDCG5]%n]VjkBXuP`im]`(+O+E7S!N-hmcV`@e"&(!9+m%73X0>M/iH@D/VL]'$erP.:+>Fj+A*6X%CgliM57,_T)?m0Y4#:nG=`W^[OpFDjFU7nYgNg"+0b,@!4H27FIB?Eg1"T!kA,kQm*e0W];np>g\fp64.6D5!8gRO@:'p4@0)gDo6;i4m`n\o?0)`$b[i;r77e'R3KADTbW8HkKZ(+aZ*4$T8PW;3aKl"MRENS3rfb($W!/Fk[38t)6b8I4no^mf_Sk79P4#7cR>`$*MO:nm=UDi1WpS]FW&OGi6AVo%r,7P^X'HhWmN-[;1-,rZ=6FK2%EV+,UY-d^hC;8S+KWq>@_B"n$^VM;6KSKL_rg)@#.=U5)Xj*3eSU?!gH[D(e\Ejk`]5f2<\BX!.%@.S-7(da/Gn\)De\_Z;6%F,$8(qR?2FJ;,hkTL;-DKB):eI&mkr_kN*8^df;r+<8!Pi0DXf2tmSPCAQFoDhj`\>eibUVQCAKgP%OV691E\t:f\pAEX?\Tj.1f7@'9([D!oV3LE5M;62U\=-k?;;RULb&k;\[:O$5CC_/G->FFB=j^H#!GX#<0K5RUQP&=ZWq_esc=;>$"F7@WI)Kp/fYV1teXL0)JCeUhY8^mFlg>`+e5j@D&4G)p,fN>iNnsRlnuO7#Ql/Sl#)'r.l3!;VYTcYB9i%&`J1;$Uj'&$g99tdJ"DAnK<,PU'9P<"T:&i!GVWcl!(s_^'-'bon4f.!=M^3FJ:X_QPSPH(.c"R"+i>W!dMa[m+WP0(8A^M?]@S+q"'JUkghM<.+8-=.e^Uor4>=Z,j5a-`9:jUp:B4c1BWK]l&'ub!Gg&9<%Gq`\C^C%$@LI(-dlq$U'!ih>#pn8]p`i^>FpRH)LJN_*&(RDOO67@:ID\Y4hTnX6-$p;oACDEUZg83ghaa7l;eErLsWTmd4-afF"$]Fr4Kc@!e7_2^DA.mOQslBq%!(aA@)6j+*[2*UX##rG8X!F.eii$)Ojl-EG4QeNGk][,9G[Adr3MZrEbJ9`%"QK:=E:cNHb^~> +endstream +endobj +405 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 404 0 R +>> +endobj +406 0 obj +<< /Length 1766 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +GatmO9&DBjR$oMHfOt(k`0A;n8Zhf[N$MXQ7PRGp\iZF@9E^jfN)+^:(t;6#'einft3X4lt,_b1.Rj#IH&LR*"GhP#Xe\GsMSK=]ReD$V>TG!27fG:Yt(Ijc$9b7d#ReLf'J7"'7$97`G/J%sip3WQ:Z'g-S[78AX$4Z.ZW63.35^/X]\)82/kFg2^M%;-8\i0B?,8H3JBoQ!i"fNg6r5V*:/`6+J62"B:@tI1G&8/Cje10l@rA.`qVF/??a,`_6_4k`"IIAIPn@)++e)SJ0:A0Xh+ae=tccA'M[IZ7:bG+:>QNP3j\ZP>Z#AERo&SX*"-6'[(33<%]Fs&uE9N7:fbEYW`)\S's(09c.Mj$_XOhX$(/`#&UHa)Rr4kg^mbEB5l&?5bLnq!CXG,!W.6R"&`2S]T).LQ_!HE/-B_K23N1b940+@Ai=I[NPWI,NCbTbINUND5*+p`f@>F9D.\KcS?Y`\BZiF_76fTqeV?iZ!s#$)JE?d26;&![MY!RC:MuSAINtX::9igPO:S-@]_A$S$O))=@m@CHrbU,sAPT?i#Xmu*^)6(&^/(ble+@FekqJWirT:rJblu>-P?Cu2B'h95R'Bed,oR]VF9*X_B]^\U],q)6LfB:O[$OJcPEhi3t;NO`%eo9Bi8)4`8g,&1K-Xs]u7$7&h2ntC8!^bKc#WU31T+,*8AQD9hnA0f'96D,P=3=O4aO2kk(gt`\/Nm6sO6:_1GUOG2"_Ds@l+l10DSGD>Fo"apl4IJYC<+%, +endstream +endobj +407 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 406 0 R +>> +endobj +408 0 obj +<< /Length 1408 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +Gb"/'?Z4[W&:aGP&GkAhE)haX/?=gP[\A0hi3tZoBT'=,fT[a\Fn=ujR2#*\bEaml!t#`.&Dg9.]Ka0C,P,V0q=$o:Kn1=jbO$SEG*C8\jA4unUh-D(n\`j\*keJ,MOo#cX<(^#lg"#fHhNb4V0$1BD97&=)G*d@XFBfuPGI#[&1+ES7Na*1^XGQfJD=2e&LlA-Xnkj<'e;Vfej)P-0[GI*QOWeK*D_I][GX,Sjm9d+<"pW;Y%>(IRg1o$[1:>Qg,p]9EFu#CBH*9d8H#c69,$#2:"aDuB'\"Wkq7?S]X@0">X_(;E)\Y%U>c:HbBB,pH-).h*,i)(7?'I&_6OX)_S\[[dtqM?0JQfW/8Qe*"j?l''Xe6["e;-Em'pYmal;ZD$;o@"Z_qptV"^AA&U@*V\WtbW1s[hJ?d/I"#QeIS$]GS-^iAiO)`l[H[$dAfeNr3B#3ED5O<,5(7PMmFkp7%m!U4'/e#/)RN'"`gr-S8!lG)oLS&n0=lB=YG_L,mGb27W8?dK[f/HunMeQSj](e"mL;5k2Ue/f2BO;4U"BQU!;A;XNM8>KO^I)E*KLNQUl.#td0C(rfuIZ6*aQH/n%TVet#lF6mfiX#:os/LetdU,A@jC_W(0R*Uf=$scCC'Z`/)S2]ge<$dBeIZQ\.R4ECL4HICaM0t?nH#5;=h"rCY!F:!TJ:uCEb%5p@TM:q%K_h6:oug^EbTJDCK,),j"5mu:![3MT[,Z['\2+5ND\!CI#8c@$_^2uIg*^S-lT1L(WLogAJhR*BRpuCN_`3A,4jQ?egba?T1)>;8i*sc(Z2I5@Z'?2T;Aej,]?)?SaDB$;eG=9[2;qKML6R8\%o47f:*9.7RPUBL/;-#T!>4AN9=Z;B'Y5Wshh8lg1s(me)0J]Bu!n<_XIAtkB'Z?al]`W9HA8%50-.T>Z?)k*sh-o9S>lQ*k0u=/N#?+#nbAPXMj.$Ag,^K8Ij>JC/b\u="IJjM^:"5B9ZoD1$nLB.Z3tk/5KinKcKH?mtLp4(9pm=Dg3pu1`@+&TCK`g@Ub&QNA!a6Tr.\PanY=rN.dl"Eqdh'F5D[mh?QI+KK_3Kp#:PhLN9u(l,$-gp(#W3)t0I?mmcsKGZS'G:V1a(gO\=\N,#H7mP#`b;MhE.o=!lq'$mYM3+k'drur++qhr%b:Q3J4B1iXlP>L*^N:UtU(nkKtNnXLo1"$I]knt>Q0.27Ms1525j3UT_*NEBME`Fi448EsgC"_f'8``>dM3NUAL+KTl#Kh6"h6Hssjq?agB6F'G+M9hYr)bJ1(SL"72X8aC~> +endstream +endobj +409 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 408 0 R +>> +endobj +410 0 obj +<< /Length 1111 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +Gau`S95g=S&AIV:5^Nef,nr%oV,At/g-]e\NSl*71qucPJl'=h?sH>hC9hFt'niKsXg>A%Xi"3G"^,0iTHrcR)$5YC3$%Bra7k])jRC4s5)r7W)#nmJ;&D8a*(ZV/=&iusNg&m#`GeR,5[(E)R#AMNKo0F!:Si<+X%uHq1,"K(]#G^S'<"4'S."st%-`G;86`"cSKqN\Fh]7Rf/kq=-PZe[B\@7)BroFRKrF65`[jP6j(m\"QB>?-PPV?r-)7uuOtgOs+r6V/Q'H@eJJ^+"AfTIm-jN]B:ls7)bh8CCo:M=\2l^i[`$Tl5mZY%dZN;]qP6^!>I%jE_I3Ci=qHR]855#:YpR^n.$:):/RTr_'8$=cC%Am*-!>(2.]KC@%)"8AqCYi^qG9,6$-ciMKq+P8'H>NJftDEl>NSCYW?;7m7'o\?n&=8k8Z5XU@(3JBH'YXeWmomka,4]:\%JOOl3,Vh_aqJ2q&>-sug44Dh]k?F-Wu)NNt>b?>BS@Q<^>IR%j$n^a'.[$FogV*L**d""Fb-Q?P:),5<**]=:TH!e7hI].gY!H(`$`0U@-&,jp-^j;(%rQrE(=4)d\B.+4;7rdU7,@3u3j5obX(,JJ2]iCSJDj@7XSFlEU?s61,\CM(*qtIn!R/^*,-[b1*oJUdY8=Jd[i5^[,Rc*NC3A+Z=+84rtoH(C3@JV"e(o3q5`I`]YaR)"?P?I7.R:n1Y`k1f%l0S\f3E/"6%:@?/@SV%eXKk\roJkS7V22L+rhqcNE%H.H4G`ZT3IfVUF64!~> +endstream +endobj +411 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 410 0 R +>> +endobj +412 0 obj +<< /Length 2885 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +Gat%%968iI'#+6Ek[p_>iUA9oPEY&"VS)$2-Lp0&hJtn-,[j"O$p_t_rqZfO+M0qgEQ5`NqhRb;]@#Gb52;e.rm,6i`a4s"Mu1bU^Y#+\$fCjeM_t)(`A1YCb;`e_mhc!a]@aC"iTe\I?'qMG.e?`b`ED94pi=.373S\597Qco$Di"CB(=ctrP-R^b=1?Y"jE^YJjJ$$b@U#DkmCJ(h[/,`P6>4WqgPb/dl_Q%XB`'h3`fe8-[g40aX%ki@c#5l;CEo(`FM7m>t?o<%Wu'7S9:R?Fh_1kY[l:mAR"T.h^\G$nmY3eQ(`FMm;r`l/pem?'UqLhfX<9>dLE6bD"mn0)3isPR]-LRgsCKi_4FXY/%s?3a\-6*6KXJ(?b]ucD(Ha@=@\[[gXZ.sn=^iTj!`"C,N!T(J!s=Yig5NHpTFb!q7aC3B=fkLBcI(Hf<^8JH]Kp_Ic)O<1o4*%IrF$PV$\DgN6Oih6>21t1@k2G[u`PWY5N(d%uZ+%a[#^t23h]j3/g4T@622fLl]gpMH++E/5/M_tGI4)tW)(g_bmhg?Te!tj"JULWf1(q(4Bl(E[+\I;_U6!pk)sp>Y^OG1T7_!#E4X?nraCSMClmmq91cn0i6r)??PEDS#aD[S",tZ./)snBs]H2Y9ojC+Z,*Obh6B\jSem_oGK%!9@M(SE(ags^bJ':LrB)tV4:-i@/"T]#O@WLaF-M)uJ<]7$2)jec[[1V.oNG$l=UkN]nbDJlpcPJ4:bB>Xm\T"o1G-H-2$+0@r;0rr_Xj'"qJ%#$T"@=i.ga]b)C,JUEXen9se[eHjH6cJj)@fFOL7EgRrr-R7[),%tg%4$L[^u`?F(LC$Sp\L(ft*FMAp"m4O*O=.'Wi:*bB$O1](]`hHfmVU@-3pJq>:dgXMf?iYg9YA$Q/d9$`=,1Len9$XJb^.`>(K"face:p9toa`sLd=O>c?cQ.iZ=UISJNM?K&bW=$DI,JT6DDZ]SO4kNJR:G1cWK+KalOWKa]Fku!LK=)e+510V6Q5iH=QeX"@9Lg'$2IaCn]h%'[2!lO0Tj)Y!SoB#=7VO(8(n)5:fG"pkI5u2iX(`Prrl_H0q:UE>>5179Q#]$(:Wq"BZTf_XN+0r=?i:bF!CjToqA$CU1m=oJO=Ue=Yf,]DidN7dghc!(>3d:hqLFoLh["A`KSoC.*>7h@3Vbma3(WqZamLF+!/X4?fg1#B4PQOkf[(D!Pk_j%]AFqm9C\:37f_U&\hRB*k)bMd[V"9@PXr;c[EOHH=d881Rs#m!br)`o(Fh-88BjM79LIeg@0:QZ3!/Sehr(Vfp'TN9j4/32>9?@%,C?D7I;9"(;b/9<"*c01^79B%&c9)Qp!BOSb-;JR+`rc/'pHg);G?FC"bhK4Y$2Q+=J:P$(8qWSPZ85LYi;2T5`991ts@WL#obUXhsAq"[rP%fnP<8I.ec3\&h?i^]#JU@^;Z='UOlqhN$>8(BZq.)%E$eB8P3KtDiD9>H]+Urb5QtW"JNM)Hg87WP#Znn=AJiH&=F:*C\4/]Lu(gh=[#cD4Fh,/bK0NV@:qBjY?omnj&nF?GQlJq9VjmE#GLEA]"SRLPg78M8raM&3PK.+a1Tef4$AeNa_2;=.rBe(2(;!C5l8/)iIU+?SYIK:R<@Cg%J2^XrA*(j-pp8mK"CZt`PU?8V;8BRen7'%)p#*X.Q9]]+L\B5F^m]dVG:sj-pUKBBDG5m:T:GAM2$KWHg<=kU.klKh18c#hK%G,5H2&6$SBD`uM8%_gq<&PM,Kn@-p%@,E;Iags,ZQp_=cdkgMZ#Xaf;A=)bfeuK[WX0jT,(o7!)nQH_gjJT`#dbJ/aAu-3VdK0pAg^=)YtD*ju2(!C/(QE;I9rNGlqF[FCa;qOGWZ)8'RMeNjj]Xru7TbXOKY<2(rOK*J3;4rQ09YD7TCme5Y#@,4=4A;n1hFc,llI&,4P5B!,gUhk8'3&,OmuDto/MnSu\N"!^Zr(B~> +endstream +endobj +413 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 412 0 R +>> +endobj +414 0 obj +<< /Length 2143 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +Gat%$968iG&AJ$Ckg\7E:%S>!)%$Q4l-j\Lp:>15f:6_b@>9"f+o*/T>A+r06AGpCojW*9=K;^(aB\jEikpNML-I\P3pAf*d8DN4P0$a_!>JEHRZ_SD&9fqjG'25rEtnm]]Z%QNjNL3$+URY"bZi?Z7Y@g2(ZC4lsG\)l3A5t2_63aX;@]J$>Ih3)EA2\[mX0m7rrf>m&CNp=C^(LIaXZ*,VJ9RRM8BDR0G&L>(*3D/[k%YCMNa#9hFbEC5XAQ:/E[)r'DQ8+<3aBR"J1_%VrAhl/"YT^"(V2=#7hq`am\a?XAQ%fsckZ9,hn=cm1<(gKlCc$(G0@IJB\GoU7YWf/>!Cn*5OL[9kG\EgJ[F=a]1^NPT0*j`:2DAq/=YZE6hOX1WiQ?1K)+s)oZT>oWLTS;ImY0'^QE'IQD[pQ(,f/8DXP)B0*KK,D.t&*ne44`o9372F4,hARAc@_/>0)\+Ri[]2EEY+(4._eI1K4<;"@T@KUro8'hl\1P%:t$8ii-.O$kYQ*:G*+D;O?6l7.[FPXlA;lQndG"@Gk^TTFYuqK>P329@]UYn!X/9-_H]I_\--GA,Oe@H^(1pRY=7WRr^tI4jg0!mc3Q817!IQQahD:EL+reDW3Xpn$7:"chKS_rs%*po3M&TbVg4H>BNp/@7!!4tPbn&HVZtM;W7[liA:GX:dq*Hlu;59TF?9;Icic41#'dRO3>TO:=#rpM-@F1$7^N+BCE8%'Hp1D"[tJ9pZCGliu1g):*C'J-,m7PpXm3"i$!'97/iL$bZ]m]7rA;*SnnGL0Hg'n%_ok[qcp`JkiVHl_?DFhB"V/A&SIf`r0hr;jcO19B-iL_$b%O-M/nY=Y6641s\R'mn-%,BM&4)G[bk,~> +endstream +endobj +415 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 414 0 R +>> +endobj +416 0 obj +<< /Length 1792 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +Gau0D95iQE&AI=/#X(2+=qrJ`&+n?S$(?:9C#$D'(PQ\SNj,hMLm!tiYMYHjM^+^Ulie0=:ulTXRr=&!Tl4OE+7>Oc*8@`1lRU$0>S5/1+0c*R-Nf.X,d:lbld*\C;KcnO$"ZIqHb!6FYp+/d3f:B:E@6Z1BkqTPG-BGC$HGe6Vrid?p[&qEi4?rui\B?4i`*1-F.__'mPf%4,P7LO_DVT''PoBXtg]@k_mbY.1+AN&Ub,O*"Bi7@bin`j_@"A&_(bRId=YT@K=BM^2sQ]m0#got3OZ3.%Jf,Ngq2qAMTRqq[B6EMU#>K\:ena/@UggL!]X$9JZ\*C*FQ$;/Wu)_&;"#&XZ#3ek/f73YAm5:<;#j)or5EtpqVd<*P.5oXs-c":6mlBuJma35UA(qKrR#oehu'\!@C1'Eb+S3/8u]IUN@hjGZ+HEH@\@Q9H^!0.Uu>q#5Sd#SqHlkq"t&ht.OXD1AiF`l4SpGNA-BV-#m7de,1"C>.DM2?].X%48nIiN4!TO,]'K'F9,QOJh9O#0S1M07r%b/XeT;Xd$0=_Lo;Xcg=?Y]60\aCPbXU$);)@7[akm37EdfnG5sWM8OrA.>I/h]p=F\;ZP^fu*.8p@M6/7D[HJ`_YJ?H]X?3;_pgS*s(T-gB;eakp^U(^1%'Eb;%2@eh*dJ;3R%AQnP`:V/X3gX]QA,^XZ$,lbsO6'EHTS]_@T"=A8`'P/"$1/?:!c92L@kOlMQ^*\kro&7h*[A"SR]A9>,SJ;SMg7LnLNHJPY9qaNj"]obE,F?%k@pHG,YSaf<1p.8Sac$:WT)netQ'5e9,h9de[PF4'"o(+_1;ZmmCY$n1&40FbuT+QS\mt2!jWf8#*>fC*iL&M9(N%1f5YHlI&1k/6*NNT1spH08G/A%`0a)0\k&ED#<:9'p275>GEiA@p6^A@Aqk@S7Z3F)1Aj$(#YtFLpQe*R>%"8;X02bColqBmB'DDb/X$rVX"4h?t=j8L^RA38mi0!kIhMfK^Sb8hr63b'=mb)RbrR>T44!L\Qf)AD/frin8=/)8^:rBoqCJ?MT[f%!MM1mt~> +endstream +endobj +417 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 416 0 R +>> +endobj +418 0 obj +<< /Length 1823 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +GatmD&S?Q+msCN^&lDIfFVE<:1c,jMkkdnBXQRe?$u>AhU)`PkZYX0d^AJ-U$:p9Tc%HR*0*^#)-X])rYj-h>$PjH9W._@fT^YJ;k-M(Te(@X)$-S$QWYZC1oFGjFGHYi:mcX@f)F7[h\\,P6$@k&0nAS/<0'"EZhZtZciJ%XsBY(6^E\VB>f!,9E3'D]/jUT**OB[W"JC/P0:@!2e'I7DkUd@?3)mOifp:9ouGS8g&C[8B"$OVHKJe1Ya]'4HFD4HC1o85m`PH-7"@N7&u=?;0X$C9QH$!Le)$erq6t:SWOC%mhek.H@h#0UJam\ZHnfYEW-Tf2`T"M;jqW#cCjso,"%Bm"*;C(cK!6W`H6FLrh%Eoi*?mpir*uea-@4TiFMYbP%+H/)H;;1LAn)C=@>IMerTc6iUFdBV$#IcS;aB;BG&f'bku_V+]&U9JlrZ]nN8q:qL2aZWR\WV>_%`AIl=IMO/IF@FS2OHCF&MM81Po$R-i=Q>8X_XIunu.pBO660u5H='R:a$Q6UW-26(t;OpG,t^6XZIXuA.8U41Er)s)+%V-dE,'8Cfn=C+X)Wf6[bdA6B(/=(sLb`%n?i*t9C//Ph@bre'4:>\\O*_U#/N@[SB_+Hgq1HbrajW;8oVs0dkF9F_XejnEo&VN$9?.+.^a3%QA3qrPU$"h#YTd$88:pLh'io28BLJh"O]^6b!LoY4j*#+k7#dXFkhZ.WFH#5VF:[!,9k@*/K#10lC,M&igD=\)bS7_:i[5QJ3([s-)2T\dVp=R9Aj+pGW@G<.asLM5g^K@l\'GBAlWQ-Xtms8J"O8V+CuHj&4,.VE,?o(-J-b;E5#e@mSu2eN[:*oihrpbL'er+OU!0@9gEdmQpj'5mVnl$.VO4)%Mk&O;"DP9p+gI,9Gr\`>jUsDeFj11lmfD4f*I<&fe%_C6;hsd:F*("N@qeYo.86N(YH=%=/hE?+q;^BGr?%qUU9'E2W>h(e#`p;@A:m7oY:0Q"K#>ap/ureRP&Y'Hr2?7)f'1QP*E$UJGWclE6p"SaB!?E4YUjG;fHF:%,bcQK\J,;K5_@e.GOGmO\*Sg?$NCg;";#i!AiRkog06gCmY/hf\-)XLO=]l(7Xnn>U>Z6I +endstream +endobj +419 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 418 0 R +>> +endobj +420 0 obj +<< /Length 1862 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +Gat$9CN%rcn9]V<4q4sZd\>T%ciJ"GTH;NO*+p3E%g=1TYqT=&,WSRWm(\Sq.Ij3):58m"mrWcd2t-ZnF1/Re%;[6;fHb+,EIW]PPQ/N)[KP"d/JP_7AoIT%\[c$"Df2a:;r`jMMN?%c;6XLk4]`FO0&>(Z4l[Ojq6mqXQ#eB,Qf8hq*eaiG]]X:,afT(_lTl+_;K!`T'"2>mM)?W_=ph8h`m/dG>58P70/Zj1@`3&&7*0Z7&%;m?1O4,CiSd;4\/!*K0j&9W1ht'MK0g/rrjtTq)UrRDV.p[6s@<_q'7A?oa;0el>mdLH6esSsDGVUHp>H&EjHq1m`)R!%50-k8GX6T`E%C"-+^H'`9Q-1(E%?hSW4SW*o`Y\9U'276pr%aK`bEHpjs>,10brm8UfNSR/5"7=0,>#C3!j*V"tdoMfam*3P"NL8/X(%e`?&2pG'JFWRM]$FgoPZ%e:?HWe-4S;$;Yn;IQZ_Mg*.n$Ol^r7Gd68'^c`YAKTrYXI1d(,]:4`/9"[0:@tUFj?.cb7i9qRbQi,;[EC;rM552.Z8CAId(VFm^&$pMXY.1DdJ4(V%gbXN;>`rnNRKK/WNGk"A/s@BOH("Y+)5iJ&dlF"<-^Um7,oCd5dmWo>7aUcT;n,-2K@?(FQmceKhS'K'W6_)bN(8-:(Hg.=(.M?bf7/QI9O82%OR#nTIn`[tQb?P+)i0ni'm&;(B%S7[8H344fE"H-@s-,nakMIhBYL#of?ALh3Q7QaX2iDT4Pg0,(F2<;;E%22=i_#lFRs8\hTIHsTG'N7?PLdJRC?AZ!Tg+B54@3b5E[F)-*7n%Tsf4s*D6Z#@_QCsD_rU_$0FU!q#Bp/2YhN(pV`(N;N(F\NVdWU>)u.]LB>p]ominOE(JI1KVVc(6a7[Al%8#B/MdS+aO7C4i`q:ilMD$(_nl:rP96823##,qR6l[o]1l48p0f-h(NDJA/=KHK0(?2SLK%i=W@8V9B*E?Q&&(-k%*E=+cV>HNc/GL;62eNZlQ`o-+^)52lj1.mOMR7p~> +endstream +endobj +421 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 420 0 R +>> +endobj +422 0 obj +<< /Length 1995 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +Gat=,h/D%+&:`#5iO:k#UPP)3NtrS:"pp`,9p*B]*p0/h,q@ImM_6;%m=.>uUr8H@a^1*bnBSZWhYh\CeGJpljUGN=gThX]oZUW(SY:`hrm1^,Or;o4Kn@9i^\DS9MWB/)iC&^a0<6*F$l+sgn,6jSZnC>f@pjBRmAo#\):!P7i$F$0&*tuYl9I>^du*_En9RhOl>eg,b@sst@.TfI2>B1)#BG;If"V`)j[Z8-"lan&Cn4(8@`T<`V=5SqP=&j#Cr!R/#jH0$pC$:Roo$<'8Q#b$I'PrX7V$Nc97mpkDbQeca'5bMd8%Yur+Tr$7=^mZi\]-^]sMED@M$WHMDnru:rL`&1^\B:K]`=o^M6p)b2SS+CVq*+X>nk=J]RoSIT+Vs1E0ADqu(e!uOI\,pl<@Q(OiR=on:N`16LV-#uA1b"\tQ/^Zcnc":(-(U8.OVNG?ZUZt63U4-(>/2t4cA^]L3\c@F.0par8ul:bH(Puu;3(g*j8TSSio3I;?H269:kcT)0\3bA[]H?$3?LSOGl0A@,]o_)3pi]V]\0/<^hBg.o&[dJ05-!..ljk70ScSII^p)H4IB&$\R=FKF1UgcN&/j!.pju.aGb_?"QU"i%ajF33-0Sj$;KC7BC-3bP&?I;C%s8\Wr6M\#R$U3r4a_*1u]&f!h:>2WpRkLWB;<[gs#$Ish':$FJX)Zi&CI*Y,Dmq83uOGSsVI_Q7sUP2nl/hefcU8gTkYfJJO?+/-\b6HkAsMXErgH+1(3>+M8U+M(.jK:X6J]b-48^2&>>l^X8Za7m-)fdDXc('Y=J?pLAOVGe=X"[<_%:f3'PlNrHVq\Bf5RO8PJ1teP3rFoJu$u@5%=jRsP8:^"QX#ZgUCCUVcb>CX[CY`'5;?nNLc<#bL"JBfdVI`?oO7<=OZ9B$E0/V&goj8[lc<4:k1#"R6V]2_\Z<-17d$ZJ_Yk;YZ]*T3%Y*0O7CUNQi78[9^8rdXC!ChtRRq5%JJ$&7N3.Zq0TDD7t@*@q:-j'7A3!tsd/]1>IeV%aKIS39o0&3q"ERg3dfmDm1(/%GH;4$.%]p3mG*cXY5_CS(2:0]pBRh3#pD$1Nm9?E%PC.HEd$gmPm`Sd`B!'V.>[)6Ps67B_5r&6;9NYN!bY2U$g%?Z4dD>5'Eo1b@YS@!$6fscUXEjL-`>cioc\,r:23f\jNKmn0Y+V6;JmYfm_M&bORO"j^6"=-`pHtOkc"5@o*o^B5^etStmJ$s<0Gq7J+=`T?MHUZ#D5CAON:0>Uk["a&jrJ7.fo"r=1K:b,'r8Xb[Ou8l'a3aAp;\08,L8\Os!T6^?6I2n_nN?MA8<-U-r%Y`4R1TBXr\E$23PNpXH>@:m7c;FjRq&nH7$ZG]lkOQn*\)Nq\'bVnFF.Q:&7C#"qbsmE;P4W +endstream +endobj +423 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 422 0 R +>> +endobj +424 0 obj +<< /Length 1331 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +Gasb[CN#t;'SaC"=.i*L'(,CG\MHtOJYXRWX_TjRfrD'QLtH4XWX[5Raf_ZCpC=ofK:/sLA.:56k*\$o).'J_cMj0LQ)D^YHfMp!CNO)OOjldDNjEV01q1R'aH;XIADF_d$bUZ5sgg?W7Q]cf9EGGSh]oDe7u!*VH%t_OG8s[nRfm;5q)iCbBWlpaaPV3=#`(.Kh^OX]tro]B\P\:K%Qm9aG8>H6p?1GiHJ8C,3qdK4ln1H(#!_?VlEKi%]%RQH9f@@S'=TTC)gC&Zg!Sg]u[m<4qqVf51]FcVYe;Ik?@\ohNYodq<#k6OUKjaM`YSBbRbMNQDiG2pj*h[hi'ZsZ.`<#lHSa-;j0,cB)TXLT*meNVT1DfaI@.fDF/>G&0&n0aMBJ10e9l2kkD843lF^D>HaA^S7YV\Yoe4X8jMc4Jr'VH/!<*us4:[uA&6"pBY?N7bsYP;X_(2+G:AXWem8U6Q)-L3W`bQ>ZXtU2Aa)+\b&SN;Z&@;!:0s4:Ks,k!BTi-'/JeX%CE;YQF].goRm@;1.lrKc^/!1hW:`V=KfiL!g]&0D,4aO;D-D5k[ks4YR`FHu+f2dOgat[c=n4ULT6@)DA,S;$rp9cF0%G+*[2luplWqA7^pBC'.khJj`=f%3c>CDK3lfGt#9aZ+3VrY7saHER*eU3KkS':>2 +endstream +endobj +425 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 424 0 R +>> +endobj +426 0 obj +<< /Length 1272 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +GauHK>Ar7S'Roe[csngj1au9\oP#0U1dfm2Z-ntN#\]].KZ]HF8aa/us*^[kRE)'Cs*nR0-+Le[GG2je,Rm"?$TSbu),9mAf/KjEXn6A]c)Jp5bPYqN(F^,0nT@U(g07b;7W$U?NC14R>)Lp()p7rcsdk74!2,G`&E/51t6AS#lg+,rZNMQLZ_[8n)!OH.K1LFV#iqCQ[bU;L.@Pi)s7Q6&V^p>h?KTn'jAG0iO5CZS.r%``Xm6*C(XAenek%SEGd3T!BK(GB:>,P(#VSZZIL=EJ0Q%c_[2Gq)`[P:Z8OEAIMh'@iL@J!JKBTfDKSBn(XpjIX)pSj&Ieg&[k2)E^V)@:/]CAGrt_?fu]LBM/YORB4^(S@S`AJf`5G?CFS@bW:JCNWRs,J2L,J>bcKM(HXn7)oG)_dn9L,CjN[Qek#pRj"[+p/*Itmh,-mu_IE6fEXu@"+P%>qhBQt"YMSPHSKWM)3Ndi2ETRUU$FZ/A=!Z2kDWXhOmqRfUML'CoT_YBki_Gb+qo$dafhjI_!@\4g?PQU@W*d#d`^$Hms +endstream +endobj +427 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 426 0 R +>> +endobj +428 0 obj +<< /Length 2156 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +Gau0Dh/h=/%"HT1iQ%a\-l++3f(,'4mPS3qD&R&6R!1^IU*DP$kj$'g\(gpHn4SFF`QkpXq9DJq,RF;J![)EY-^Sb(JNIt.KB_r;3-[Q*#=J9s".':*3$aM'%]6;Cn#'*52Rjl\@%TWgaqE262`.S'-'ndBTm8X:(BrVtOr&:HdK,d?Em"$=CrJ$T:K7FgBPu@)n:pk*WZCJ;uS/?pjq0"jU^la&.Y7N:CsE=.qln.!^$*h:Db/S3e5?OTifRmpE*kSpt,DW@g22-JUOF-6eL%f*@H5m5XF>1=g@&,1T+G#$ShG*;/H/MjG\0l?='f#19kHZG`@ZJ0"Efq6SfBi<_p7$@H_K3.>e%CAjsY6o*D"p1c.EH[q;qV7p$9`\c/d-n\oMk@6"XchpPbc=j(cX4eXb[r@Klg(!X"@ddcbr7,(3)e:kC$^r1ZcOa%-2UJUf,Vlds?"3WT;JYD'MT`hQZENo]N3,HFl\:t$%u"sLsWd0G3h]#c;0%_V9qdXM&)Ig1^cK!#^R5pP+;*/^3.\)%+n$,$>ZHUqPE#PB;YWJqulq`+:^+SBOY--Mdt"!"BdDs[7,7UH<)%A%\:BU[oZ4PC(1piUF\U<$ks\M,GH#!PG)"+%RCUu+I"`RFAU:#?`r'+?)B1@N?o54aBlYfkX`_3JRgNheHN#=+tq\Eg*YEG/0Lf>X-Qe[N`XV6`bF4?cKjSt.nSn6Zr5FQ]U=Y&bM_uqCf.TcBmsSi=jb4;jZ&+l4-7XS1cu[3Zdk$cRBPOOC>"&_0G*_3n/,D<1e#^,OOXQ>9*D9_n@>tYaj=!M9;+Q60):Aj9$&0%JJ+fd!D;Mu&cm5O@T8"@9T$.7Y%SR_`EIF6@YH?\k,V+S%]>1t\@0s*K,qD=nRVk6M7F!r9cAr0f\*OthA)a<.lI<0bHBGJBs&S9QF9H\)%O'l"Y2&PdFSfV-Q:Q8eIt[9EQiKYoeXj,T>K3PDUGml!-=qJFlDO:6l4ke.u7g$QH2kBr&Vs'/OBDoSmC,p3HC-P9e0Bg*Cj!=oPleKuicQi!qSEcV8R\prb`iZ<$W6Rej9tkA>lIPM5:MDCW2jtdbW]k+uD.f=[7Eai6P"eR*f-fb#8m^jGVO[Cl%dHW*VAGCX6abcS>kJ99M`C%a*EB*&)E+jj8]m&<3X40jR2)@CetCgrGhFV5?Z66*32g,[FTLPIG9^.a#geh2g!"`UZ_DuMdU?Ir<(:tjt-~> +endstream +endobj +429 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 428 0 R +>> +endobj +430 0 obj +<< /Length 2135 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +Gat%$h/h=/%"HT1Tr21:f;SP3Fa70=FR?MC^YHNH],iQO2HO%%7*9602n;eINr!Hs\gcAn>-.9Sp?$0:[N^jmQS=)f1T&-4A^*I;S^\MZU72?EZfSI6FrX#A0Gm/Ln`/ebP]\+2>Jeo]c(q^YY[BnHEktl@YD>M8SW";1!JTb/i"r>sG;bncG.3p-t0$E<[[OK7$FjFcUieCOP85s3ScJZZ1XbqU+g.3spVL#\^P$=99.-?lQM"k%1hmQ$Osm\sM:#tIIe&G'YgE)s'c2iZa;`GmP4(G=.ZnZ#+QP@#6[:#+hVkcUFK.C=sdn@N7SGW1"Z1/)=gP&!mn#Ve;C-^j^]Es'W`b'>Q]Iu!EW8rm&Go]HE+2e-5c-+?GfdEgETprp1:L3roTj6P%V(^`EY>.%LJ^&caK,lj+eNp:mUU>HUWe_;GYLB/W1M-t;=Zuie(H]U+u^"k8(-qKr2GAIXLoJW!%g"8hD#:Z;2K#qC>ppjP9^M493"bi%H$Z06S-Cm]8nKg5@aU8o>o)=IF:YKhb?f3CO<`?f5I+(5KWoR,&oCcqf@4\2FJZ/V.T=kl"/&nKs%*C&nuE*qXNJDAAQ8h:;nqL=pC,'_')(W3[(nFX*hF/4U30=b8')gr#8nHebSJ3kILs$+,;qfZmD@%$(JW(;3ISf80/+9c].>j?J--NAuZpXDQ8h2fKr?!+?a*fFKS9<-Iu]/&m@S[e7;-V6"gm5MAe%bL+BO,&2lMFeu$gFA5fQXoR3sLc+LgN)#`"#;s\0u`EBZbFC,GPmmN3?p_#$t3?dh)!X;J/cJ#MI_dSXXj5E]&:<8rVT!HHp)fJ^)`oidm'1#[AR\IR`Z485t"^.e&M(StVq'V%j4E]&0=h'aJ=#@tN&F4Q37)k2`aRs&<*O=Z$lecW!QC&%Gf@;FR0EYE#k4XO&Y,paFMdO%GG(FsG^4bjO"=qH@*4^CqL9P)LB+2pJN-B#aO,kqH"(UeW)Jlp82rBa"kg'YrV@RcXh9mWgc2g)X&ddbXP$f>Q)F8.hTPZ5$kJ4q[;9EiKe"m4HT)`Kt1^>?SeS5hD0f<8KKi5=Jc+FB36pWl:k0jDSmAUbD!i`"bF[FFXr#D4,nqKpBcs5U6/D[Bi'mV%=4]:j'1iY\U]QhEIm<2_phfetQL?25*<^H)aMf@0L6&;GaW*j:6s"Z<=rZ,HDB0sjN3';6[e2)FI2`T6>7B9"281dL%Qm.E)"h1fq6,B?FM61nN8i;N@e!=Ml)pZ#!UR7^Cmh(/m)a(LhNGB=&O5/]ZWYoPjTSIYs+q&u)E`6ml=4c>K_GgRdV;%LX=[<\\X!pHhh)tip:lHhFhh`QUNe953q/eUW$D&c?]`jpbD?rE"FCe?Y@f(S@L<=]MHE;c\4`e-Lh:=a9G:BXB.qA`LVT(LIIPLTX/!E-0cBc'q6i.bTVcZtWIJ0QnqN,?kSlIOFmB@FST?LI!`FJk;-%km\$Ql[n@#bl+1l`,Z%#c*85EgM"R`fd+FWfP3$A_']5QQfB]31>H*+/km9Z"Op#P[]'hD;p@f2fmf2.g`2i@GK-q_[X!$FA&ut"WaZV:MN8*+Kfq&->XT(=O5.o[GIbaTU% +endstream +endobj +431 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 430 0 R +>> +endobj +432 0 obj +<< /Length 1381 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +Gb!Skh/D%+&:aF]+o%nZjtMrHl6ASlX?_ZRkR+,*[thO#BSj0RaHTE@p4B"i]*1P6K4P32;FkV&mN)1:t-'^09"[7kX_\"X0mNr,jRLGu>i.5nm<3=WZTs8$J)0?e6@Ue;N)?Q9DR%c\?Z"('=g^fP.VKYmgT=5/eJSe98IKq@L/&A[^7?1/>5_1IX&428A=q#Qdf`4iRZQnuo?#\!jn=&]&**d2_,!^M$Lh0H69+/i><-=c"RXN'lbY@dYTa@/6LTbC]dDY\nC2S?d/n)Le'$]PkF3e\9(P5I`h4,/Vgf'^Q"B!O&I=*+5I7fIQM;*l'?elD8nBZrj='P&aS*^6sq8"g/qF:is9GQ>QTq"_Z/5:>QYb7;ma*8^jIn36mjGp#3uefP@,^bA+<5d"RK#hZ-m^3)Vta@3muD2Fa+W-PGud[mD>\n=]8)7V1hglJ0XZpniT7J]Wn)`,m@REtu+la7/c#O@=uhCa6?`lPFrEKDmO-)VOK)Ln.s'<'-&*><]@qSW#+1G/4k,-5:`f;rB?<-8\?WH17#MMIO$aI:BQJ*l/K`2M*%+#Y+3>D#!P)71Ms9RA"QmiQ]*3'RHkSq"ke9)r]If\MC,X5T]6)D[c6@U:6B+jf:9d4mYGJRcDE!mk&Z)d@;)RYIM$Y4/re[$S&S,tF44s>>19Jn.?802ME5!l9i=tcMBkliSX:QtA(t693?t*H&@t`&Wiknh5%GY]]<%1-b@P.<+AbGA/uM:A6;B**'T-4@<16j+_RZ9K2V!kJf5,`-93KStJ\m:25'6\]']g1=4N(h#c/ppl-qAUBR!o<~> +endstream +endobj +433 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 432 0 R +>> +endobj +434 0 obj +<< /Length 1042 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +Gb!#[bAs(+']&X:[)=c&U)+*hQ8\^bWmSVW3XJk<="V4\+M[+'mYu5T"TK$N/E[Jb99NUja/"!YKBV%m#XOrtYI;Xu=*K'lj^H'@*<7,0p9*KC.i?pQPDrCXD+sP+-SOI?bZYbMc=%%BBA\&D\[53OsYjR,)-B'EUfDb!9aB:N&k/;u+AUrl<#hhNNYSoZ`/q"1d4nZ\."?HmYJZtor#,KLaVZW#lp_%9JIrXKLS1SM\`['FtFs47rZ0138H+AouC4?[J1UT@b;QiL&a5KZs:lGpUgBT&GkJi`K[qiCU^-=g*-aVM!mF.V@L4_6#l[:Me>!'#!Hcsh8S1DFB\,)T]"tA\_9PHA!\%md&*YUj2:h31A,SJdjoq=F4rSO,gX29D%:4$Q(eB@O-"l(%Pb(WOR?\UEM1k[j^)pLd^l'KWsuO14:U>L=c$3M>cknfU#@g_/J_Y#+be1`_FfL.)>TeYF=4sSc,)*7`HX*q2Minee/LN,8sF+WB2Y_j@i1Ilkqfs++-l\8k#'\AWElT_+gc]oYu/_+KDJ/TQY&@Nhqg7eU"7:5mVDVFd)P70d(?@t#0h0S0ntRl6f`hIp%Ot"E\R]"KWgK8aTY*M3c4l!@O]0:ZqI7#Q\;utiO*"9'-ZhFVY-kk@U7_5dEHWN&G[Pk6#7@#b0d:l0$Pc3H1ZDaTUtp_%ijh_6@<[i&$.^U_"uK.]@^G]$ZR_]:t5>K.cDS,0p/pq5'9ch@B#SNF0n)9sjc]n9F7^G&3<\>JgV]=UsCI1SHL$2GAbA4BD~> +endstream +endobj +435 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 434 0 R +>> +endobj +436 0 obj +<< /Length 1000 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +GauHK?#SFN'Rf.Gj:S34=:V!4ar`G_g-;r<"JB=N)rp[3lO/3['/&:FOn$K]IS).J95k2ZR!c^9$M`ZO@5`,]na4f]aLGX?*\_sp3TpJIZ:TZm=`Fa:1kd9j=Rr9!hp\H-p"C:;-!p(O-ULu1"`a%'I-=Z,D6sf7Y`o8fFfiSF52^OTM-"DJuSfF\lA!$>m!T(We]FX!]D^Y&7Q*='ij.!Vm;IhV^!O;`7*Y!G[_gg6>Zj)o:H@E:#**d#fuKCh+:_p[-AH;3DQ@)ODgHj)g,2Dk'0h+I$=d_"*5uDpP_En]D[G22DBB0>hWN[!e`J%2R/q;FrSZpI2t,'uEMKEC3()$.C3JQ%upFfR8uSb3/$UmX"6F7kG(%$j$ZV;(.ZM:J_:MFpQ<5B7Zs0'N4a6(XM6Mbl]-p5hp/H:nd:@Zl97W)u+J4%VXS3_Hf'[IN(^Z:oU?Pn\YO^X4jl%64Wa?7Y`Ps> +endstream +endobj +437 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 436 0 R +>> +endobj +438 0 obj +<< /Length 1342 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +Gat=+>B?8p&:XAW@/A;^-<8HI>L$//EDPD)1JLR>d[\DjOCM%&8-O/mrUgml8-00+3kT.Fm^K7ImO.7I4F-f)\dih5lbn^Bn3s#F>*/[)/:Ob$U%8WE1=1[PH=Dp3_>Z`0p5(Zl%u4aj1Hm&AXTVX'PKKb@2J$?3dtcW,kNN/*JCoRcaas!Np?qd'G5^l`*A;AKGk8QCfBMtYoP0%e#kigFNaWcV3<,*c.-:e(l+9qXNFW=c6)a[1?#K%86!V,/?E:Oeo5$(dGXIBQZ8J'V%;\Kn-)4IgTgc"W`DT(B@)Hk3cX)X*VP`j=%-Mn7/a4*.Q&ksoe7d1(*`7;;X1ZbdYB_\&m0qRPXNCuF%9`>"B#4+p(@tu0mb%s6U&iEq2()IBqqc2qOj,e*<.Y:3nU>_*U:::FT+:+#O>JsNuMPlRg66:q>,o6,S]jrtAX:9r0.\b!^TB!kJ:cL/9Gd2sXh4_k4qsoGu,$_@B(>3kZ@E^U:qSp)N(h!EL/B:%6(RtbpQ)Ll9s%SR5@i-="8@Xm;W>:02O*6'.qjneu-#93f^pN,SH9Ka6HePa;pW+G1+Zq,Pe_YYK0>m6&B+9?)<@4Zl:bE/LFc8jO2bZY=Wd-t2CI3sR=7+kY1'2qFfaIf;lB9bho#'$WeB%BX`PF$IrYJh'P@itC8'T>mg8tu2b,Q.X[J(N*~> +endstream +endobj +439 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 438 0 R +>> +endobj +440 0 obj +<< /Length 1228 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +Gatm;9lnc;&A@7.G^;smW7I;P_26IaTa[KcD;[_t7S/iu1pL7X.?n2#/3B0a.]LlP\QG?WIB1oQ-i8!@3]Wr9$pb_(QD6.D)8RHF58ZXb)<28/(^H7In9nOK[41^Va2&_30[YB1\UI#Tnf-I$=ft/,%B=B=;dgKQph^i)0#2Jr,FElDiC4,qE7_b8Pm/([YR3I?e-d6@J:d;X/GWnSXJ&+!(1g>k`Fg^APY(a';dP?8?2r2L\g,\5$i>=lV0'VbPB*(V;RrqV?OP[.?u6Q9YN\Qd"Y?ZW&;P*1)XI_p``Nk4=4pKMCb<6LAn14SmeG#n"C+;7+.eEgDrs"*S+m[YlN&;Xc^p[S+NlhT)]LX-^IN:4k+KMMUcl32>3Hpo3R%rTU5I!p:C(#m5H6kl*hB6g@0^+uLGfj?HsIb,pCSt2;jkc)Bmd^c6T'%.i",=iiCa`c_JqI1pZiqJYha/s,aB']cR\XX=2ceLCgbfh2r8PJ3dBu`bh;>C(i6Y>,'F+(NqP?EldeUZVjDF(-oi=2S+Y"=@barU.*Lk[[uH'oIXlN1+Z14Y=Sdg/8F.-&c]6^CttJJ.g:'d4&/enj]SGo_9hpOr2-Z&;m7J'eL:gnH"XZG3sMk`DITWetl_&DY2a`543#CU'*/n#g;%[4YU3:a8H.E+aWhX5hQ.3Dp/$Me4(Uii.k,J-8t@Ie94d'LtWCr^sEX-6UUo?"/nAuZ,*R`&$g>(_YrFGL>%h)qJnKG8_,Bc=s.8?OCn7sGC6m0K&Om]7!f?q3S9X0&CoRGKF@?(?(g+d +endstream +endobj +441 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 440 0 R +>> +endobj +442 0 obj +<< /Length 1273 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +GatU4gMYb*&:O:SkcHSDAk@lEW9huVd9om0BeF.,l=*%@FA12M>`(Gd^Fq1\&h2:iPTi@XNon?L3JWb^UndZc1dDVf+C0q6n1m<21k-o=GV>"!"t0u0Fn"d-_\HMd/Q?^M%_`24-Y&'BA)%nJOV(!_2>lq5rp06p_oL)!2re9Y_7d\(Y44f=>[U#^0(`$Y;bTh_c..a!m=+N4o^spZrN$K+-6IpMd"%?rBN@_.Mp_Le6Y\'E`&rip=KA*CmN+M`8r'V8eU^@V?f:Z[a`5-N/o;G]lI-M5s"B%sk?4K9T<1M04L[0[U``-l_(M)#D,8Mu#hl[G&]0kV-;hg.HD77bn_[uj>,=q2"_$e2PAc>eNSNr@RF5NU;#/gkB[9#=q>?$0,C?kjfg?sc27K+,Z!K^q$WcknGt";&#\aWOn\:t@B$'1e3=#))gq0jsLQM-f;_<`uH5C=a?TE[T-\o?753nN)9O2Uc[u-=uRJEEu#kmhLf8,7afRaBHJ?K#r2`%npm/+f113&o4Y!lk?!&"OU)5r&(`oC=TRkE[<:5Rf0Ms5mj+8So+m"cpNaWbk_<&1bHME#LIfGf!-aE@6b>8!f;QG7BV;kaYqi`F3GIlOs)Ng/P^sYIIGk/Va15_]/ItCU$crhl*AXCGghEQE+Ig,l;3O!oHFQ-#U+*JWYO$=E.sc.Z6d^2m[h&F\PSa]KW6XCULE]OSn19PVPs03>e<\rNB$6=psQ4<]+tA;L+ZBO2DK>]O[+:Zl%nX\)KnV[bg`#(4&2IU)@:C26[uZi\).(ppnsBq&6_48*A3G9KpP1:c>74J\G2AZCRe77Rpb295Z&cZnFamChEB@]g%[@X:[2BL\m/j1>O.a#?gdtXCG=h_oNaMk.eg0)eJ<@fOf3nO@-+W).(qL9`'Ah,c)$&p-EIZ=-cm^bj]K3/C*bftCl7gS_JG1M.F^,FCNOP5%L>>N!7MY%7J~> +endstream +endobj +443 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 442 0 R +>> +endobj +444 0 obj +<< /Length 1627 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +GatU4968iG&AII3BQCC?2GEVboTWnQM-J"r3L?b0JL*kH=<\FjZK$FAO8shX"j'_"^?dKH%IAP*5E?"](XWe@a;^.O")g.@i1VOun.>J^0_'ODPMp14r9&lQ`-NYgLSoT#I6QU&U/Itsf63`^6PNRaJ:ZD)sAntXc!]>1!EBah>X15rQA_D2$b?lW$IU5J:-n`AgNW5q4QGeeme6YNH?A\%rT1Cj[8P#4;''$">hc@34>4Wh;bZ&o*X!b:6/X+=PRa(&5e.U8#3`Y@7^EG5=V\=&)";MCG]i-A2pG"d[%s62Fag"'Z&cQ$pf4g%(>i0[hIi'@1bJ%F7OsT5%T0DIAEt@9D!MUc9C?#'Y^G,G6G8QEQ(9"?D7aH5m,7F(T6mG1B-!fsd!jP^?.u&!E$a*b2=-:.(&/&ITbM&.%"&afn-s:.*7+gVXZE[$f[XiL"&7X-5Zd/P_h4Z+:W&3NIaHWUN^4YX3:&F,5q&(/fOGP?.-fGWnZZ.%U&_$lRp*t>VpcOD1nPS"_4?>q8h@@C__i]7Q?*"q]DRn5@`Hg/WqBPFSMJ[$:%M[lQZ()U"tjOZWB`MKHk,PP8[pA0oc1gu28"XM@9J<;SLN@BWr;>.Bls$59E%^7h6Cp!Z[sXDeEJ-.g$bnW#0eI(Sdj>.3Z\_V3Vk_s&2V$N*7'ljl+*KQ@rO_h2Ag]@G!4c0V'(5TnD0Af$+XW;.p)biXDD/-`HTIpl(),sC&;M[dlT_?JR3A%?C@?.Y4oGW-gYT[~> +endstream +endobj +445 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 444 0 R +>> +endobj +446 0 obj +<< /Length 1355 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +GauHK>Ar7S'Roe[csmNlW[L^\Y>7mOU=hSLM;@Q-/csV$/Kp;@;Nd5OfRMcj7>mC(3H>H8IQ=4MPs"7,`2i"\m76&#NpTrlmDQ8Q'4a,m6Pa_.c-UHI'O&](qYSg7E0AV3o&?"8p!$\>$F\#iNEa;'!#n5"$pQ=]^0]^Rc9M@)qp]p*346T'6gMWSET&oTcUA^M0QheP=q\QEV-;JgT?S`KXg>tUj>()d5CN@uRn>)@m/HgN1cJ&jVoHXJsLO0GYZV-#uqA$^Y4bi-!+o`A>7""jX!K=[39:HEfq4bak,$C>K[C@-ACmQ_!^GVD*5`n+/n7^R=/mb;0)@u2n$7+I'5]2c=g2]ja3p_+(4%V0".M=t70i!p<0&s*B4S;hl4kEb<9ik87AM>%Cat<`mhbf+]"B"!o:P1'UODtG00TB\.gj%L+..sg_Ck0]74DTkM48TG^aM[Ke)gOq_\HY7R$*ooH,dHV%OPS;SP3l1/N'$1>L9+YU=o(oi_o;;e\<%OsqD`3J20<*ff[^E3g:f-7?S`-7$oI%*TcrItBt,C$BS<+=h'e_$GGtfJ=,+&I(`pa]XnDk@K+N!Q2kG<3^2f%<4dSBKA-OG/EEmApmiQtT)8+JqoNT!C#$"$1!$][dT+Pr0W8Sr,An.#c*MY*kY.@UfM-G6F9L.<+aa%9$CF%_9*%6RG@b6nCkH_;4`:ZqJ%>V#i`FA"WJGKR_u(S4E8rHj,TC+>S,K2?ji%sV+@l2~> +endstream +endobj +447 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 446 0 R +>> +endobj +448 0 obj +<< /Length 1876 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +GatTIfl#S7m+l$B8%W^Sh+.($U^iP3.:RX&'W?pt/<.;/?:T/91rLo>a]t3"t74aao7cb9a2*.b9W:#MpUdLcoKKjGq)pY?s03%S[PJm44cd609nkLmYK0,5aE$-Ae<-BM3lMYHtBJC;`6"],a68Arcr0j!3;UR>#=S'b,$#Z7eU8S\mT#CmX!6[eHo`G69q3cH?^DXMqMf82"_27uK3+1]d\3#elBNS'R$AfhsDK_&pjtDg1**XnL5klF(X*]ZtdtEe,RW@k#!\m1<."Cg5KG4s&TIg2#UAtD,!RSQ![k"OiDu_f4!O+#%T^pdAVk"[^)]3.VbfFjX.'1@;J'7[;[n;i1dYa%n+U,np]Vo%h4#n(pYh*QV1l/G.Yr*=&S#1Umm+]qQ]k5f)c==!cT[5b`7T[!Ybj>!U@+fGrdZF7#[-min-F$&:iJu)GjLhZ`1NjXEd-geTdAdbkK-Sn@?MZgT5fPa]\,p2\lT]WFiI#fE70Jfhn38=@NlWYm/U&p3kPsI#>$%[[Uao&#?U\7Ne`khl;u.nR]CC^Q1N\k).Gm;]!/s*k\MIH$=^]@38%e'1M+m#Lt\*:(ts*e.6Zi6@!KfY&6J;hdD37QBVsX+jH#!PGEcrb"eU@^2Bs!.2*B)Xu9p"oj"9!#QBfQTbSusYsV0'X#R^THaP#mDCRjRZCFFJF>IDnYL#1C26&t7FL?&3FKSZ@Pk4.*=u<%OI"q(oasK1R^&FM56'ZQsdFp".I=bMV0(qVsHm"_Th=P@@]J4uR!.*Tj'0VOtGCk^hS6fVY>.0CbPi[<`AahHmtR1.(gF*o!P.)6`.HHV*JRR`XC)M]\06YV;AgDCbp7[[>j/^72hNJs/7.(X7T&[9o$<>`eQQ(M=WKGtVncR2Hc431*!8GFOG0:ZO6>ik-G$onm-7JM+]]?Uf/0_b[BG^.1/4IYUac9k=1j-,N=(M+,lm*iDGm+15l.8^.j(Y6M]aj]+JHU206lkd1s)dK\eCh@h4<08`U3H1R4)IGC/gb2B%g?:mu'is:h`7g-CA&E#?p^h3YH7VWcCgJU?3Zc,A&'h7fEMe1#&H;e6OPg,VZ6C\(F]L[a-\Qk]9>]pYsB"@`1Y:U,Kiik`,.C#&&-2FcI=f9SQZai9*/QUZenYM[_5`.n]I*UL8eU=bS1W3sX##\)*S0s8WU56;uZ6^lgom@e1`mFSsF$8B\S[NF3qroM7P)hsp?b>j-:"],:HF&Kc0%U'Z(/?#MA#R[%0'.5'jhdeApHjJB-uEf_n%#=EeMfKjc1M@_(W)P45XS3X#q"6%Sn#I/Y]hJ@AMmu(Xl%>k8>?ILY_*T""EplYs`hg5+g*@BVPQ\p$YnRZ9ogg1b=iG(@u@HcGH8<4CJoIh^":nn~> +endstream +endobj +449 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 448 0 R +>> +endobj +450 0 obj +<< /Length 1636 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +Gau0D=`<(R&:WMDTsq**>7l!.5p#=.79u]SD/]:!/IJYHg*NJ'9hA+8?XHDN`=Z0u,q&g>RN^kP*8c^']9p;/-*`PA44YUF3S%es/;O6m(32KKKNpT*etTDJRQiqthE?;d[(*F@[MHVt6%fHa5q5?Y<;l_j=qs,fP?")`KFQAOT!0/&L@B6_ldNc7qo?ah:Oi@mA_eKTl"&p0f76DmZ>K[@o^MGfZaYH`?]U69b8]]"nQj$6^aaJSS%-BoG4^Z8R^b%(c0CAKLnXBLpQ&f4CBl/B(NE_S>`CI/l=f^e=F&>3Dq]"OSAm+T0q;hhaC\ie$B;3E3029044IVpTE,Th)OXP,@5N0tQaMPI`i;H3"*bS,j30P8bWTGteJ2GFK\pSi^M[In^eBsqQrODeGEqGKe,L(.t;-#:]2TiF+@r@gQ*==M"*is'pPKRHGA%8O[je+14/aR:gD/85Bjhs50"p@F]*SY3"ea5nqsj5ig'GeIH\`Q6p@ZOLV*h5NR!:QQip^*X1-QM3u&TJiklfi>Cqq@6Gq%K+]K.;.a9RuUBRlT_,Z)s"FMLoG+33^,6gHJi"m7Hl0!RRbemQRJ@q2\6&$iXR>j'&,)n63=+WC[;dfgJYXH0Vmlpiqa-D%\25rpMA>'(@/11PnVkKD#$61X4Lh!b%;0jgBG*D&q8ab*/!;N%dH_`>R^O*b8D+MD0^-Dp='_7>dkLVm6n^VA*f)^#qrgu/[K2t*5'A!P=15><-3P1bn!L)K171(r?+#:bsai"HiASm=dV9`@J0cK%\t6kokmLimf*A`e%\243@tPR23.J9Q?=UD)c@;\nDK`ZlODM,;dd0g4e=q#m6uAtk@h\ipII7:%2D+?8%SVB6)ABYGpiQA.O[\a0nU0lpWDdmOss"E5B#03$F'0mU],Fe;GfZo->fX/fc@+@9VC_R\dIq$eIWf7B`lRe3!c!*,BsYn_=q#ok6KqhjbT,1kJ3M/^%C,:i9ZD\d^HZ1)4\64A31]Dph6JVCH)((V.A1HXIbA6i^JO59-=[9*&TPZCU%ZRpg7I3RsC-?!N`9R$s'8@h[W++#L-psi##^h`2EfsLCVOMq'43+S@f-P&CQ0fM.TT'#7_FiF(Jf2oX&1._M=C[bl!1(ae/Nd#N'I:nqi0YArg^9DN)3d1o%%;YW'->2SNZUs"dF+0';0oOCoj@FfDf6]3(u$GO$@hp4?74Znn4f:7.@E(*qL#h8VVg^UP`L)sC(Cu[ks&gcl4a~> +endstream +endobj +451 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 450 0 R +>> +endobj +452 0 obj +<< /Length 1377 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +GatU3>Ar7S'Roe[csm-!Z:L+hFA71g!@Q2+'LNkV3QR;M+/.=fEK4.@$0Nj0@;ga6Q&*ten[Gdu"3TRao$[&b0#s_dP?LplfJ;aOAJtbQ\A>7S>65ZV!f1\:8s*,hLbkj:6'D,0JLW1Ok`!,FU_gXqsWjq!u;L,%R<3NuVf?_38o!j8+7tj6<\L5lq%mL/Q:'!\8it%`?e.L3KMpSS)+cum#6-G:-.^!fs[E2RE(6C^H?n7c0%$0olrQ!h4s-lE;oFtg\o1=Zb)_&c$Xt)LPtBdnlP4;pCq;ei#XcC2J,g[d:q0:&T&`-Bc!ZjF`MfVG$1c0USkPj'CBo]'L=2u3H/o1`7Aq'C5MlU_0Q(OBuu?"H3"Y3Bl,gJjqX;>iN="_>3:(@)N357!(Psg,@B(*06+QCH1r[i\^g?WL&OSY3C;WEfH"SXXJe`VX0DZkk_Nk@";SC6Z-,X'p(.J[p!"XM%!@3ib_]9c5%\l,753cc9ku(eNi'Prs!6W>l?PD5(ieQ1lpnOeCksk:c^`?IqX7^=U8CT_=h&-epSYF"ieF+(9/t&jK41UB.ndrf^4h-M3Rd3Y9_B>>?`Fq*2@d^rEl9n'%6DaM9GCmE'KEAkPEcs/>e`Gm9St,*F&8=Xa+e3)';urL&*,>FjLqCTP,`=S`QtguG^~> +endstream +endobj +453 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 452 0 R +>> +endobj +454 0 obj +<< /Length 981 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +Gau0C?#Q2d'Re<2i%^KT(Oq%KVc@K>:7JW!fj<6D,)qej238_(gA_$ZU"Bp?QrF_P`ghDDotC+Pk&N4<^SV#?5o<;XUG,f/?kDT."q[&`;2>42K#oM;5*eNPA9Mr.]HnO2rGe?7Z3)27U(.+Gr.FqB2,#`3a0XGLCCn$jf@p\bP%o25%%of6ca5:OGO'qNuF>Xq!n!6m(K^emuA*lZZi/"FfQq)**]DK:aeRi&@jkJd&=Fh.9^;=2dc9L/f*Y\fuWC=)c6K_r]pCXF>L`Y,Vh`gA5Z`m(!p5KsIhqg2,:etZ^8Z["M'Y9+rqVgdHj-)OT?\Je8^pQsT;O@eqmInD3B'(jUH#uO1(QF:AQ,mJ^P`Wk:['sZ^TSl\&Gja&s\rkESHT]i>aQ2,>Otk"c8!q4b0s/*H7B08^'KUP*,$l-t*P&FGN>%M_;Ih+r$3#J@4hdE*1.i!WfdAC/Z[SoF%N=OR.DT!_4h[gAB@LQ$HJPG\"_Zq@9OL`PW4%MAh[4#*Q@am:aQ?l7FLh8Z1Y_30D@[:u&E/t*Rkcn&prWM@ZgYuATo#;:8ga,4IISaaQ0+Ka%m,rXGI!Q3#ON4fYrcs#YS^+r/0fT:\:;115EW[&?k&'a?d8=PD@H--QjY@K8)\VfhP(POit1KoqF?Lolk)'JrrC?u@/9~> +endstream +endobj +455 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 454 0 R +>> +endobj +456 0 obj +<< /Length 1458 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +GatU4h/f>L&:aF]_;%\IR7)g`pi-,[S&nCR\^!'hmp;GX#D96pZ#Bh*D?'GG+J^k1rlC)tTTs\M]<#&J'ms--hLEJHK3dP!MeqN:Wu6(cq83]6#BDSe'8/_cZ#TcQH@!*a2-VeTmG%n`CN>]kNiujq#SPMs7*\^X/T-F&R?s0QXAe23Y$_W==EZsp7V1RHL=S.!p!M7e>N]TCnj7aYY#8tI5F>a^<OrN!^e@%sH]eXajaVIhG=_ftr;'J&U=aGTQ]*O:GkM%4MEMfq1LW.$Q.gc[b[*LHZA(tt&70eP\@fH]`D(+TS+\qN9bO,GmJ'I0-.#_33Sdc>aX*b?*0mcThWdP*(l,Ikt\/Y.61Zr\J5*K`GV!Yj"&g'T,C@mM.D@/\2f[`gWdZN)73m$f[0&f;@UAhCUI9frn,$bB.(c_h&(=$7FiSO\g^^A84e]2=\q1LQCU_BDJWfTUFR=Y?`C"lU&&8>&WQ(:Z4TBJsR6mnR=$nnNBmV3"N^7.k[N&@!)/5A\;!;<-IZHrJtino'idXXQ[0Lq9;8GJSB.0sa7-dh?LW;flm,7Qs5'(%onae.Nap\Pt^d5Nc]0pIb$4![<;lJ/FSS[Me0gCS_Y8og.MCHEZ-\4)eV>,4E>8D,_cfO3Smn*+;5>:YTpEOiKRN\?,cf/p6:JE[JqgO]9J8en22AP@>4d3srp'gbd2X&#?MQGO[<%p>1?l":Fmdk(-fGq8Vj-L[j3f,74n4)o$J[Li^=QN'l-.a%#SB`=lT1F +endstream +endobj +457 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 456 0 R +>> +endobj +458 0 obj +<< /Length 1303 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +GatU4969,O%)2U?kSC)&bD7A8C/;t$RAQ271lf#2VULZ=3`]`h=c#aos*\Up#gnkg]Aj8""!7OTr':-+RU"[[(:K?B7B;8^]hGYAb7D%cZW$_/KO/J,c:")lT.d=m1aH%L3K<.SEHcTTVoSW"l0Eb>C&Mm;^M>6(J-!eNcXLMp$9+c:1`Ot"m^dr$"PI3##-ob(?WJU@D78`QFnYo*ZAAr0=nLe`)=g4'op->l8@,u@Nbg$e9O:S'([4DZI2i^DS8>3.]p6RJ\sfiGHApP3I`2`?jp%VCO5:UhF#*R$:?V3akOFiEQLC3:m8861nAAOu\O8HHHgF#t3!%PPHLZkPIpmk5G-FKs_70S'\+K38!(=trloX.;eGq\rTf.mC(UL\pRc]E%.62F]1&cU!ZGW4!@TfQ\JeUr,OI,s0oCL?2?7UZf'"i.Yog%AC5)7!Y._gs"o-'>)Oe&geq7?!MmTomR*K]afAtmp^QgIKNM3Pg<`Dd!+k%]sZ#A/aqOCm?<';([tUn7EStrYe"Cm/?Sh4/K!Q.lL\hh[M7jJg7c[g'XA45hoT+t..&7 +endstream +endobj +459 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 458 0 R +>> +endobj +460 0 obj +<< /Length 1273 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +Gb!;d968Q9&AI=/pdc9AXbRuJ-TZo(9Ztd>j['j)8X74],.Fl,_S8ULAS^Z]M,W?JjunaQD;@\Q_SPJKV/^(lSC\@t>RZ):'S47g;=i-YS/&Q=2S$u$;Q`6':edfSU7>\1F.ZPbrTcaF>ij&.7D"23maiVS5iZW3H2,Yu?@[787KM&W0MD-MQfM1E&%KX@M^bDsh?*!RGNgEMbt7cX%.ile1?TuU5HCqi[rJK'^t$c2:$ijF3$!HB@!ZIj^0M(A"()6^@eaF!RAP4Q^rB"'.+p8#BFKbBaK9j5\m5P!#DUY)pe4Iq,*;7OZsjT+j$s8+6\+-Ur\K(e=^>luoK-4cS69"om&;')uXO"eGq[Z$hkLH1&DUM*GWI8!Ob"sI/dOiL@rVO87)#Q7N,<.c4;j-;h/U;PgV7/"3lKAFFP-#`_;9%Wc6<>pNJ)V`qpG^$r2OY6hfJn0g/OLr><=`hHlXDD:Yd4Vn0P:#c1C)Q4%Q)A0#C9M/n._>jM3tCu?MLFADGOR"WFR2kLU%KgK690E1^uYN<(guO?�DgR/o4P&/%j:#4QH]*IOuDfMSu7N8qrABV"JWS>H3#-K;Rm:mk!jk[IJST2eeni02e-*/MLhJ!-+"FBV,o+2Gklr]8i0K#86c=9@\.A9^ad57TKrSo2Vk,_&QW`008T&HW0F^aj*7Mu:C_VqJA8jpu&:`KVi8W_4T%V1uIfRFEBk5r&7\S_trs;1?MHko5E&:J#M;fQrh*Y#nXosgGBV[WAZZ2m:e(buo`KuB#bL'.%Q^uqP%CQ3b7n8[\OtK1-Ei\cbAD2.EHXu1QJ]%QL50]7ZZ$g[JqL34bARh[EdJh)bL6iN!(c>YKhL6L`n1gPV +endstream +endobj +461 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 460 0 R +>> +endobj +462 0 obj +<< /Length 1267 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +Gau`T>>O!-'RoMSa;ZgM-GJRsSj3A)$)Bl1?FFQ'WRFoNh.>14;RqrsQGm"OUbbs%b&5HX/d@12JV\2Nt"Z/KrMn94Bl1k'hb^AE)'Apn^dXhj7;NBoW;a=)#PU^WV,(gp_"lN]Ml+#(r3Bk4J]6uuDY]51lI!Wp@J8)'Wp95C-r:UKX.BWhFB1qQ2Y>W+Gbalse$5an,lD=9^%VaEg>DQ)url^hCk?<2.*EkS6U_'%TVij\_bs@MJRhAN:-a^t_J:l:_[s(#ga],?[HjGW2Z7(Y2taZAK..)KfmNbjI4sLfA&g89[berdZl%978Q>OaaqMV3&Pc)!k*NWA?+]W)S47YKMlc'Mhp#QdO`][(s/"fr0Ml+2keCKJXd"uA;"[%^[OJb3!s/^gHaAp@#Q!VDlgKQc:UKYhP8jVWlE[OuY@%$9EAPETQFYufH8_'9/jYP)'fRuE?H>DT%*Yb*i9.h^U5>f/Y!QrtULr)^7(=j;A!d]<$^IYs:ihVXs]2T]SBU&TEO#F$%T]%sHBK>=\:ps)BXG.A>sB%lq7R8'HH@.)'[$_*ZPMs4t3_3`bI*]U6roRiMbe`B3U0EKO*,LdZHd6M^pkfi&(~> +endstream +endobj +463 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 462 0 R +>> +endobj +464 0 obj +<< /Length 1526 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +Gau0DgMZ%0&:O:SkV4M!XXI&Up*i;@fG$o^Z(8Tc76t.b-,c+^PjI6(I4:='8$_4!##0Vu1ZBAq%Yn\mgs8H^55Q+9Cr_tr7ujtq+j8iZa?je3$m!qhTf(S,Ip[%!,9'f`?>I5!Q?`%e"/BqmortXe`d2:.*9F9!ZM4Am?!f8<_?!RW%d6l^f[CSnOA]]j2mSu0EW/=ZJL/ZqN7H-U$G+8D@,VK*fr1>?F-K**(qtljnrL!]TJ`bBG0g"kDel1XF)CnDl^>YaF%On>FV&@?J*CWdW4"K-o.+roL/C29O:4+V#-ZVBfA;i.[+"f*H@DWc*k\G-::W,$tRSoYujeAaT6qTHr4Vol!@'P"Yn:*SXMWpeJt_.VoGtRDj2ST$BaaJ==oXR/i*"(1gNX78&8oM/IgZ@mAOk\YuuGcNIS0gY<'Y+?nT80T%^>`P#"9!>,9@DtDuX(fOOr-RhEa]:WeQ#K?GD/PT5l:PmUghf/LDVUg/=^upNRLU`0#1K=%+M/$lfnM4DCptr$HGoO>_;jNS/=nei:NFP'@0+lgILVg"+KmFK"f2+QAX0<0o$EM1NA,&rVQh3pMl]&(J+g&3"dN?#`_="ocZQ-Uhb%ib^=7pb0H@<\:A_Ybm0jQ^pKm-,/F<)$>q:?b/*Jb5M9G@XKm..>G_$<;STOYFaNHElS$=*k.dqp7+qb'Mdo!)eLUpV>se'fr6_As?2"Xk>,hF[g$*)su(jHgoW^)b^)Z:^%nf\['#h3^XFIKpCi.Q*MO?4&#PiDi@5o>8Tc['Yh]c4%*c.@Y7BATU]K6C"ic[fQr#mWM%p`(9@*&Pp`lJtON9A]RYU3GpZKR7cM(-,6)6=DF?]$4sLp%tommF]I12_K)ld;#b.$'KkSUf@_r4RGDJsCdAS8[n'$Mk]H1%k)h_'?Kg"5nR"]09B1Oo=0@:i[-"0[`\Ie%*/&m@AL28L13lbQJ1K\LN>'I?etRr8Glh.*p:kI!(_(l/l^+OGh94glbs*]G^-7p21ndRb.*lu7!WfaCU\LFj;SHdRKcUF&ks#nkbD?~> +endstream +endobj +465 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 464 0 R +>> +endobj +466 0 obj +<< /Length 1398 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +Gau0D>?BiC&:Vs/n0@R9KdFpOmF,q`S>BdiJaC+8Sin8p&spN@8_JgsqT?6_N?+E4clO7taE,hSVbc?#S;^4g64`t7pEoKomk%#]oCX4!E#Ru[fI$sFhIQ$PGpFL,<#p>S86Dl6AbhLI9X/ufm@r77\4"Bo?f'kqdHP36=SjB*b:#tZkgA\Kf2%!Fo?l+Pirgdi<547+^o60H#DZVV.u-4Z9]/Oh(&6i@D)^?iS<1l?5uFuYa);?g"CH-qq6DF:c2Oe5'dX,_N,+?@X6\5mdgnC8T.VdH1YO3h(iKR&54+aJ"`pLYpefB6p?9uMeX,lC*WGA;h3Q-cg@BZ.T5UmXF2\r#fVNEXFF3q,)^ogXUtQt%;.'Ii*2RMa>!`YI\_Dga(QDD<#OF@3M]#H0CmV"L-7+>8m,>&XK?=U1oq@J8b).1KRQWsO""EJRdsL.lGF6ac(_9>-B[Ae]@q0^H^]f?Zc=_On1:sTG8aBOK2&#^qM;M1sj2tkgV'&<+dWdT8EVFZO8"=U3<9$H?S3r8ka+anMWd8%91)GMF:SH06d`iT'b@'I)TF2iYbIWpVP_NA2KOJ("r&@lKB-C*%)DY9QWP*FZtDQ6c]p&-tllWqP&Q;@8%0n#k+RN`$$D9pi3;(jM?&3,DhehNINnG&.Bf85^-0kYq!O]OUiI52nmAAMY$/05;7'T$g%1f>g^e]8/hFt0T-*=N4cL9$b\EVhZNuK\dT)hQd*&c6Xk]@J907\;^rN;Go%$7s;`uWc['LCN%B<)G/guKqh%:kjt-W'4[>HQ\**]UGg-6dGgiaa,H,S<B\H4nXCSTaD%<6RV.g%*Xs+7bZ%CHE+gr/o:[GPH"II!k6$UT6o+"#[iH4-VSkZ%E;BQs?*M.2>MLiJe>7o,Opqm!?,N3hI\.p(O!KM;*kt:LWZ>qgor[Gl,&fm&g^gt?E+BDb3JBg:Dn[DL`N?IJ:>sR=Ili?o*O'ng.ah)pqH=jq^it_L*PFC[\2j;HUgP^5$`lZS`VSmBcJd#?Oft@YoV9dq5g7a+8lCKs?cXr8Jj%;^@Ws=T`tbKEs5nP-F-b.R!"Olh.7qJJ3=mQU&G@R^%rV>?ZTSNd/nJ$g*DdY8r1Hesj[TNYko)?Y^*P&A".q#^M.5WgBa=&3d6K3/m8$Y&r]%CDYIPto?;[?dB.3`Gr1a4aJjQF!5N=neXf$XL51tC?~> +endstream +endobj +467 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 466 0 R +>> +endobj +468 0 obj +<< /Length 990 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +Gb!#[9lnc;'YNU1pt0aT[6AHDWFaeW9GpC\EhNp%-;%`ocbMD"KoXrjLkJ?(#(d&:5B0Lje"g5a&#LjpmZR_X\iQMMD_7:&/)2.g]KKpk+/3$7B_4A*AE/q7>5/$"eb[(O\!q/[5"!*1ocJsG#:2oZL4^((!T8Rf^-;cliG.ouQ#7[1>@17Cb!0;o1Mt,&7:]aEG+]N"eb;WRi&pf$B&Q*'MDi`b9LGr;0dDbdFO2oO]fhf[Kg:YiLj5F".MRc9bGL?%cLJ1b=3c.^M/],H?>KVIlMt/5CP/BnKgZ,cCGIkKPJrCQi,rs_bUa)>W_trn3(!1ogqF/!DSen,-<"i1SBa[aT=4^eLBs`c*5KBl0_T>S]T7]eeank?5&?UnQRd>aG<@Gq7uU6">aI'+MU9!G6!r:$fJ1(DWW]_52]BNc#f)(E,$C++V\nP,F:Q&YUh*%\P/AV1io(!Z-9XTR5I=A>\OP6R5\D\Q66M_h\!2A)82KX^IhYQM:tP)Pf6s'm%(G<]8"8?.>oWU@_G^Klpm97M^aQ=Z;'b_fB>&NZ[I50$'QdM>;i#'SuCssQ&(H\iTFS6\!Edo*JGipl;>FS'Re,YWZ+!D_SYXfT3WkD=:To&t0(=i*lTEYM1UnpKan%ZW7SiT +endstream +endobj +469 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 468 0 R +>> +endobj +470 0 obj +<< /Length 1303 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +GauHL;0/3d&:XAWi9fl+U*:ic\j!MXkqnr9Vb*D*WB3%r/]Y4.\3SL)hk'n"((^N0k5$F,GJ@E8bP)=X>L(N[ZQD!T\XR$R7BXNf8%q@6[B!?-FLJO!ffSDR$PsRVm=La0=T!PM!fm-A`20(Xna#r)_1d0FXo'4$iEun;?5^cq$_6=lo4=NlpubE7q9qXlibm_&Fd=,#GF=.>']@.2qXWq$!b$n""EiKnJTuVIZBJZp\"P]*gB#X]p7#=MX8.AtI3Wb5IS%e1]bah[=r;n5c2*N4;'%$gZ)GZm9g"LubJj<>Z8]r!Rq!L-.dj-JC%eHm#e/\5?Au-2R_\Vqe\-EZVT"5:%Rdq.,#p3RqZ:rJ*_%)&3't3FZ;G-)!!iUp*,jp!2G^99&l<:XP3Zl[,&chO[e>R%j/\!%c>TG^P?Gr;E=AE$rE"G]r&_Ijpu1-k3S=Q6H_YR!$,B\UJQsOb.U?\B-dt0Z)ND$9JPaYq[ft($_o:<'BO/@@\4t)a!fi5>nj=E)R!_,J8K)QX\A$(ji$G$os030Qo"0n3#R=U1O1uN<0:VF#fo&(rWci3>EOJ,;pl%m"m`;7f/pOBBqchIPU[R^VoU&.(jY'C?(BiOF'"B3b1K``Wq`(\:pCH!g852j`;)-n(a.CeZ6ljA,/]tuXtFa,A5TNRV.l,/`Pu=['<+V:-9Y'cS=&t[3gue9,U=c\2?eLP5OBPcS.=e"?XFt7[9Qr$BbAr5kUH&8k0QW_.3U&-KmF(Lrj/1/N#Su;l7%D]+8+.D/uWl.J.JDd6bKls21ac?etc?$C/X`9Wk6t!'A3'1@Tr/60a5qM!4V)a(E)_>aElhhm2s9q4qX7jh=JN/\i9:?!`=js&f`+>3=fO?J[%8W=#q?edb\%kmKWhl9H]/g9,lW#QE=b%Kl-"'Z#QoqhrqV+@PS3)VGXOdE\"Cu@+]i\7;lT3Vp&p6\aKtZ;r.aalQ^gMU\3]s-$s6G-~> +endstream +endobj +471 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 470 0 R +>> +endobj +472 0 obj +<< /Length 1292 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +GatU49lo&I&A@C2n9/]5h'Qr6c5i3XXSa-[C$rUNTG*tn4A]B]=jf&21&`dZ7/gMa8%\+['](UElFVTdp_Oi(,]Cs4+XC'[S6,miub9fno`Ua@Y`^uZlQg:/=WaBmC61A]Q]OUU%b!:-h+7jCts_FS;i'dl"7smB=%$1q'ee$iQ569j5h3t7P[Z+3,0USYAZ%3n(oWQb2m++<>AmL';Z:s!n*+&*,ubTZg6;`_Jtg.U**&h(Y!95a"JVgi))_0\FoG>IXRJ%SokmY0bK67R`3n)-2U.lVuM&:-]16P+Q^5=MNt:hFGLtI,7`+LXMT.;DVV.PmQJ$h:HOEmJ+i-nf,rM>?5!eLesVhod@(AgcH_PFlH[%GKJCZ8;q3t7FtnmN`5WedK?3Q:;GJ=%C]a.hGS?:j#+dAq@0QrJc^$d.6N]5e?H3@4)#aDKUH>O!8%*\^DLD\^_QQB%%Y1R@Q+udE/DZ[eBm_*8'p/fn5J^4[tPOn(e?Na8m]?Tp2QWF`VEm8i+MijUt$*3;D1SL4N;_bW,$N)_JA8%R1R2FYnT@?ONin9bAP)q\[A&Ud?)f>RK\Dd]fLVfBASQr_D.PXcdF8X@j3BDkVp#@@GFEgYEFsF%g.mb*[Mo+@&`V;j4l_A863<`M5Q[1cM*(mnl$sKe%%-_eTp\sPhrmuL0[])XGX*J0enh2V]+*C];;u[G-k+&\>j^QBWJHu;`G&NDXktO4J1S%!NIlhI2>F_G;>SLMkqi)!5[ZSC7,Kp[d.Zs15b?+-4`jbUXRP!jkITJ)L?HW9(c8#KNP3ODQme$Mm[$_qfBpq8"ksUi#s,5:s8eM5XV.48TUd*'TndTAA#tsDV&2s[f,Q-]XC-I@PdHE$d8DaGUIJBu~> +endstream +endobj +473 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 472 0 R +>> +endobj +474 0 obj +<< /Length 1253 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +GauHK9lK&M&A@sBka2>Z,?!#mHYSEIR\JWoA=[%qU7c)O-K7j^,hmHkI4:$d-SfO3-rB\*dPGfr_`*Y+h/m[aO*qQ9aS2QiM=3#Df^mW(HT7#7@[%LY@rM5+rGhN%\&\C/cTb,G^3mZgDBci=\lro]G4#7m9n-#:@>E@,"N9c&0]bqomCUJoXE\.iWn`VcSRe#m(gZ*nnZIE;Vc>ld$^10TW3H5$E[r4'iCqd.6)UQbDZs^3t041k;-LLXjJ[M%!nEkXM>\HI2:Q-JrTCVq6anJfKEO.H:><@Th758[rGIa*qA&QFO@Gg)^h3A`&>D.GY2/Ss-St8.EqYP2s!kXfb+3pCjaZ-.G0K<4O=iF#m5PZ@>\4Nq]PB0"aD7P68U&ngiP\L@5b)0c6mY]GcbAY9*p;U)kQ/>s:O-!I6GBqK`L*X,2nKH_G'h]&1:0l2Ud/po&(8^d2m`V8iffV+*fMFt*q`\o@]eR;!i:_Foip7!;r6^0FP@>7KtQq?$PXdO&:1[1@Gb]S!6@gOhi!'rOKZLdU]TD%RtC+="DtN2P%VEY=`L[("^eNT-03K,m8s4MOIWqub&q$U&GUZ($4`k)J:Cp;^'?q@85h<1^pXiS'R`TfHU8%P1A;T~> +endstream +endobj +475 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 474 0 R +>> +endobj +476 0 obj +<< /Length 860 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +Gatn%gQ'uA&;KY!$=>D`CZ8:PZr]\"<2rtKOS5PNb.%I/5u15=+e<p:J/Z*)l.P%!;.p@,69!cLi51FE96g\"JhJY6%iqT+sdSl6t[-)G'euQb@N)Ho%=$@^Yd;(`W`>LDu63_,.G2t+b?oqPNVL]M=I/+#2LKTA)]Hr:l7LR&h\>jK[B.?$3q;$,-\B&Z`>BM]LrKY.s2N%+7)5`HL!^0KeTB!hq3bHm,BC-+[]ZCsBI;+Q(.hheLXlY\0ZBkgNp%\JM`i+2*66JS-gfBI(!gh#)6sXO5\Y#KMR2!if/?N&pNr(I9_\u3oB6m(ML>C2#9EmMCF<%[p]uo_nt2\;2`5iFr<8u;+rtARg:$1;.Q1MN#;3c+b8hq?$.B_`B3@1fBBTX&,?Vh^DFZ5dq*_5UQ`2$73oFI$P,N8;3cANMRnH]MQK02ZBC8cL6sbfZ,I.Ga-Dq5\7$';b6qg$`6p1s*-^Oho-h1jYr+F=hCL+<8\Dd;J+u'+*F+K(8At$iR#B'0+N@S$IH$pZ$3t:AcEU:D$bd)\G5~> +endstream +endobj +477 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 476 0 R +>> +endobj +478 0 obj +<< /Length 1270 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +GatU3gMWKG&:O:Sn7Yl4AT&F>Vl"Ue<(W?7:1'Hi,50_[[;j@Ko^_Z\@+cRi&jTHmLqtl[/j",d3F@_OI0^kS\Xp-0O$%&26B3GnOFqNOEf.(_7F#B2HlYEliml!Cjt&\f,DL*r9(#7\lRn]0CR]8QK4G5:67igfgNDDHZeBqCZH6tAd"]m7)H;Brq1O5_Hb]1=]kiBVJ)PP`H@*?I::X=/cE@[F%_nuT?_&@ff,*1=hsfh.8Ci)Au#MO+=pJLc3n%:H64B/\/RqpiYk#IP@Sc]"C&>F=X5gO5^0A9Mks,)"^,;#\Ho!jT5hI;mS0A@E@-u(W&29QkF/FFmc+LB&NB?>j=70n$alHhle>iqj;=c[Gik6mr>6MU_Irt-i):u2Bl77I[+DFN[!<4)J0&LkRclX8u^FUC;>T'AnPS[pr>J.:I_B[Q+`9(jfLR.h_Mq7?dEf!DMc5P?7<)BbBP:?&EFDqOq)3bdVm.M]>.+oG&k0c\Epp]TTkq3u](#&?;OmYCj6SMqF2[lb)REod>/f2ioXW.FJZa)WsNiXdCh6]2JLgW$FPlNaMoe'SLL+3htC3F_`S"JAT`5G)4%E.#Imk8>3Skt0tLB6t*3[N=)iA#7%.QNZVo<04-U>:qNELe0E7Of?Y$#9#g7^<*1nI34R)1X\Kh(Eo6!#C>(=N_X^PUqCK4l8JCTM_hs;qRsZFiK[tpDpa;'b6?YQL#/S)C8EaDS)&"R0jIu4A:ann1-#c%>b%]4=hAD!jg\;AG^Pj"!HOH-;IV>GQ/2+)GSd9Y&,[\ohnkO-k'M.b5lDsYKgr-=>Y;`gd.UE48%^IQ0+/mebCT>NbMBr7mfT^qn'[q%7Wgt^>EQB+;D?0n$*=J-n=,Niim9MjIBZ\M7P\&j%@7>>:Lr&<-UH7+V<8/=ge(1mY$*JXA=!@o>+0u6>\*KGL]Fg.e\!-R>Fu%VY.JN__o'!E<9)7 +endstream +endobj +479 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 478 0 R +>> +endobj +480 0 obj +<< /Length 1373 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +Gau0C95iTD&AIV:cn,Q#bG*j.:CU^,/lEh#jn@%8"hip`$IMHQagL1,qGJL`%^k(_)l)mk*7'$(jN#sJq)QHLR.[$eWg'&6Z&TR]jrO]4Q2/TqXb'cn:l`[)5Z>;MEVMY;'%VouHUN.c3t6e]6j9n"9mcW@:-P-TcH[*.i:V[D`jKM&d(\\#KMnE1n1Ds[.GT14e'#U0gjCI/jUE(m_DPcTM.M^QX[c/5uh@Z7ep+KK1uip1DC&-CIfJd(sbDn$CfW:Tkl55(>BKM@*D[^Bp0a!CXjNe]s83-/d8'P>QJbj=kR'/2k:r1mlP:jj1Q*&+phBoBiAFA3'+crs,s7@46e5N3U?rq>dFro$5I:p0B>(\qZ9(kg\c$2\X:Hr8m>qanY]eL<_k./bE_=FWAOTmtMJp)E_ih(RZR5*]B;\q+nO2D#b#$jkjs!ctoGc$n?:__mfX2QUmR5!UM5:3L!9iM7MWgD+QBKl7!I2kBVW"`RM45o@$Bn.T*(F(dT+[,K]Fm&/eFimkCUV""_62D**s+N/qj:NgLlWk&Pg=pIn]i`esQ?HPlk0.qR\KU)[80Q=OPQPLu!hbru,AdS[#V?UN=]>C8LdLo9NJpGCWk5@4t1Q:ZkOj4Z+o2d`dnUo[;e0ue:GCX5k=FeS[S\B)B/qLXZ\Us://hp[dW&gBJXd5dTYOqiI4RCtnAg9o^l>[7R0Fp]E<(F+%YmFfRD4D,e&W!s"_9Ws-Tt,9o;FE3Y*VE]X2U.4-_d2t>$MA\Q:Z=9;mj>`*FB#f8H1==p#D%7kT/=fiGF"[=WG#(eX)j7e1IJI)_1J:e4BT?r46kH~> +endstream +endobj +481 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 480 0 R +>> +endobj +482 0 obj +<< /Length 2268 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +GatU5h/D=3%"I_Q&a\W5U%N6FG3f\4co^$+h0OilRi=&__nf'37&XVYCo8BPlR.Or6p#ER0]YYe8u*ku+t;^2m,4dKZUs)%ra`H"n0b8h@,f@:0F:'7S-GZG%48F+jR:!eMouW4?dE@TPCFpch^)bD(f%t+9t[FFeU7DJn@$PFEQ@62ea.$Wjr82kA:$(6&.N/T++Cl6pj.+/q;M7t:IgV41f>l[GK4lSF`CHjI)Tko&rR"#?s]*mMn9JEk_EI_G@u<M/@Xl+DN@4?&!m8e"SWM&@US9HjpM@+950MsI'k5+TDaA1Qp7DVIs&X2Q3--?7Tb;P2qCbsCq6?0q-oq.-kbRDrYYGG6&?8k+'$gmE'FI"=Eh_Oo/,$p;A-a!W*]nm"O"mF_'onp3o/$[Fb';qfA7W1J*UBCH4IAdEK0)1(L!5]Y^HV.9Wk^\XoT@H/o>44adl?%M&"$M,d,.a\"G6tj%jl@QM]HL4=*T%EoL:d%ibS%7W]MH/NPS&$NAIS,rBdF0;aG8HbGGmME8*8cE3f,]_Aan]d?S[R8Di-V]6"+>5l:nl`MSLPs9=r@TZ,eY@,>B1j6hm=k\0RMYNn>[s,j;;iibYYI;9TedUkj&EcdZ@@VaXJ=dfWZh+/i>L&0;^h/u+,*K6"H3d2kc9V-K(h"jqikb3*i[D4s]+jlUPN19H\[>S=bcX!VDslLPCXM[Bfijab[C0A[%.U!#:/eL3cI]kH"BV8,J:ac@pEnj0uHM3NhP]>M[4Ni#JKTT"oo"-T=&HbAUJp&O.q2]s'=kl'\c9q?g13b-6-$EaBJ)0.(QWq,bHVZk?S5(*.g"g@h@[lL8?BrIQGq3e/XlT,GD8fb7"MoF!;+hXl]g06L;\F!K8TeUimoimeY_!`+rnXc$9;7TG6I2Ma"bY)@%nGlNF!mpm\*jf>V`$HACL(G(WS(_F^c<"'Xipg31)-DCMSpqrp2Mha/U(2UE\_O:3ZTZ>&JLqA6I#X3Q)?[Zn[b0Z_+M<2h4hQ(d3#=h?hYMqfA]oAB-^T1U4Pikn0oG-pk`%4F$';df+en92knOdeI87NXmmgL"@'d)Wqf\=4hPUq!hpQ^OQPcK6\BSCG48LI)X5R65[!cHH74: +endstream +endobj +483 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 482 0 R +>> +endobj +484 0 obj +<< /Length 2021 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +Gasaqh/D%+&:`#5@H=,*#+*`HV=(<7;D_Ue2Mnc,Gpm?o[Y;es/(."JFoV=eOqLPIPnjB%*VmAhLOk4Ycgub9KHKpkop=fFEf+<(-!XXko";.4@q900/AU75N'`/t/@#@-440bHb(QBB/smj)n49C_X?T*%sroK[CU<,r28'JnkhVrn`P)IQgX=\!"j2,:B"S5q*nPub8qT),h+.\mdm6g`W5sQj@r=gTeWqVA>ljZ+=W'%h'%LF"P\&YPfB0[QMe9jl?lS296of%X$r"Cij'9Vp);0(=;pebjMHjQ=*KXsc"iMh7JDs6L0<'4E:%%R"63,f2Pp.[5'krEcFar[j6GW,W;:\6^@8;3>.[^@:Et:LO9koN&[>737n_OtcU81m(e'TuNA90U](RL]U&rA1+b*0Y2Z%_TnL>_B<_CY/sU>QA2Cf2hWYgp"`TFZpH[4^7Lu``$q)%2D+(^6e4tTICnJa5\[=hQ^?bNmptU)GS%mrate[`]=I?AS]"Hm&]TliaiD#_qs3"kX&"6D@J1`Y(N,@t#YM$`rbE[/W6+`m'URd[58(u2eN\raOgBPNG(aHLrA6i8fj`KkurpZ!8^$nQJ'Y`<#jT'o$ieR]Z]@/>`ing+kT@`YH[o7eui^+'=)is:@pi?]h-,&.=,,21or:W?_?_GK:B.j:U)@QKU%XMF-6&FkTA]D%6*q12Q/Mi0mM@rWN#6Qs%0T7'Z,@bGH_nK(Gh;'ZHD9P-."Xj:n1hTZ)LDaq/XSY7a"(r&r.!6.k\jX5RN[g'EcS*M21J>1E(&-bUgH8EHU.CEB4(-N?2p!H"P@b'9WU(0u%&2Ai.4cU[+XpZXK4H%t.55Zg,pW!sZYS4K]`TjuE&JD8'hHc\b*L)IKEM,,[j6+b'RfmOY2TYuL&$[C5)+rYt6o_]sotqs(KitkUEnnbqP^5hZpj-js[FDoW2$q<p>e;rqs+tsFG[3@gUk+Ak78q%[RF+KLA[&Vt +endstream +endobj +485 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 484 0 R +>> +endobj +486 0 obj +<< /Length 1301 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +Gau0C9lK&M&A@sBkZ0'%)"Bs8m[b',_5?&-DA$k@FV2tYmAQ/dKTt8h7K7]`M%U\oEo[uD>t!u&S)J>]L:Wh50!6QCoRZJUeg'),N1f@7#C:>%WlZqa+:c';f)'T;EI-W8LOP(#kHA^@en0;ZH^!Q-_h=GHO&,4_n"u_SQhSsi?bZG#5FF%S2p'!>Sg^g&Eu<$[0/c&j?m\W%:;#Jsfh^G664>!>j)WL_?QTDD)3sRIOn5K2@tT-rO2:3A^]6g2gV5fU6qE.W(_F3LYSFVen1Dg*PAFa+*gpC@(9P,%#(bV>_=Bp'`WUa0#E1>B-ah&\)DReB?L"X^V.gM:+::80%=A_3JpH\0mHA:s+lPh;#_E&LYen2=g]7gS7JT,DqlYK&hsEH9.Y49(-@3GgbCa>NrqaiZ]'6B/VSs.76qqgZ:%,iFRVC^!22#h[[oRM#b2pN).IG+XEQ<)`rht_Ak"\qU0;$eoW/.G_g7;@K]BYiqAG,+i86`@^mRr.Gu&PA@7)j1,pWp9I`Z(lA]V%F:4EX1.3q'@LgHZbo?`5^2'Cb[nEE0rPZh`JuuKCI)1*nc4Gp7dS4>oPLVtT%([3[DPq+CUgqs*bg;NsrX4GrbSG.t\SZ\lH!Lj+6DWnT\`mr,[;\XbJpdmcZ7%BMHtG=;9Xidu]Wm8GfITrHKog9=oWkKkuA%4TX.>b^?^sn;ehhmA4g=%[XJr\6ribrISmcG`n=c66B6bXP1Gc1Oq&e4fI,M)(3kFBAE>Kc"jX$#Mlu4QHau\B9k[70p0X#KD'9LDk-RtU!"_uX831[U(jSLd24WmnPBjH(^28L@OWWGU2#17)?d9J,&)[JECq$J=Gk,QJqaO2I6+W;gM)g#L.-r +endstream +endobj +487 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 486 0 R +>> +endobj +488 0 obj +<< /Length 1547 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +GatU4>>sQ?'RnB3n0=>%@p?Z":Se.l3nnA"CgT)k*TJR+i`JLPe(oL\h/")nE^H)N`CDu`bBFZ'(UM<>aRMFFEu+)0k<.(:>5Xc0`?E`i)FdH-H(:,sMR53#a)S;+Fb&<>j;=(AspTs/h@.Z7(&b1/q(10I@iJU%%n0jne/GX+:05n2qIu8?OIQ#Ndf5Q<[,C;J>e[%>kt#i2_rb)5"XC#.7,+9%DgNQWk>qml5mN.+MmOW`Q>,9O^?1lGd<8L6kJpCC+KNjAY?F1@bd$Y'!)b0_J2C,!aN6n6#E6G`?82L]m)\L'E.(m#"-*im+^Qefh8$Y#9,\DPL3U7VkA3kk+e&>.Op3eG&5X$/Pr!A\ei],,JF(O=bZ;cgfiE?MCO"?65m:2M7F!U"",*a7E2m7WSLA2&E;]o-)%kPaTPVf4n!j5oP8*!^"IsiXj-OC)fF[H$^1ISR"KJC$XNOd"RVOpmDh]t=bQs`E)8b#3ro@[A.R(K_6Bq/cIW@50'd)6?UF^b+YF4CIV)?Tg7@9cfe-M-0%l]PV4th4hOi%nZ."^;&![LX5\pgYYrgHn'Z`bVgMJdgn;F3\1VO[>S>'^^W2Qo,:>>5D!DO>%Q+=%bLe**TT7,sU'!)m?,l04C)V=fg3gTOC3>@l\LEO8#*)C3[aFL2W8=7QWj?I.bLaG#IYS;aBr;@8&,Dmob];P.ErWW),Wh!O&4AXJPEo9s&e##GN6qPI':I&15Ej8\c#C5k8Gr&euJPpb4N.?>QuOYXu7=EMoIu]%oKbeH1ljUs"3O#\`&FKmJ.e$c>ab(riM\A;;4c@A'BK51(,forpORY8#FmIo&l=S.\q>kl+.s!g4YJ8/r\l83^n1ZNBg@X<@&.8S.#=ORO_YT-sFb%]k[4UUU0LmA\[9"e`lM_a$0s=fDIL:*tj,>k7aiND5QTs?E"TI>tCFF&#iQ_W?"(=''UDuA_iBrGWo*5alt=>HGkO-094%HW_U!5b7'Z:8/3k@*)?a)[.J7B4Bp+Wc'<<7'..=>TIOkijbp#OcZs,_o_`C&-B01?TOcf=%:?hY/:Z +endstream +endobj +489 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 488 0 R +>> +endobj +490 0 obj +<< /Length 1397 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +GatU4hfGPN&:X@\_5#gX#X[P&or6P7VWh>u)TV)8IFF(ZWWK4+7mT8Q+:un@@*6'h$C8aW0DD!A9FVY6G2f+M_&u_J;QL_/,`qiQ_WY(;ZV0J7CI_55CW"rt)fs2)EVAmF'*(iQL`p8j!,hQ?4CbT_PCd%*A7.(Yg\s#!t5SY0!?rgRUG8D77 +endstream +endobj +491 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 490 0 R +>> +endobj +492 0 obj +<< /Length 1335 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +GatU4hf##E&:WNOK"`P/f"hR^j/P:"VaPBea38oe*ma#;jDqf@\Af##Ja4l=$eO&_T]>SbkeK19S"Y`?%%ZM*q>]g1_p&WMGJ6&[%u[LMi`iID)VZBj!-WapG57"mB>(f\>V7m&)"S7=p,Wr@^g$H80*"f5FcM0Ic1/bq/C,WgKTNEp5gZ($r:ZE'P#dgPJot^)g;8Jt5mU]^6]nN4V2K*pTAsG1_M2ue%&(bHr-\5+rq>=Lh;-W+Iim"-=+T+nS/jec^Qpk3E^C?=`5(\XKR7Tt6u6MdQ7=%&V=pmHYntl:`9NGiW[=.ffTB^6k*eb>W-)EZR5M6/nn!o0_T8n%;YdfEYP\6>U*alQ%.-&9Os%]V%Nu$hWsIJDl"XUC"crKJ^n4NpfYmje'2!_*@ct@'S6,?MDb#GSXEW0?07FUe#e-8s[s(pJ%l_\,73DA\Q&._3n@I.P_7rt8qqK;gaHXn^FWf?l"d50NeFaO0pd#15/8,?pBX^XG&=&pSl!qn/8!ZC2QlM+0ncDHWb7L$dfl5YZ$Mm3Dk?gc$\FGNoB-*-9$B%M0s$npRdRVD6D^+Ql>VECfGBne`:h9G/Q.5#[.4ueluo-%oFFA=Y0OV86m!8F$V<20AKW$SM9.W*8]DtK$_'8n-8=fLI^c-h!7H.hJk5A3r=amSQJ7T"@q#G/W5&sC4b8lk7eF:cs_;JC3Yj,[Y,Ifu`B%8:))?lfUZ_ji@sQ-nmEo^:5Z]0t*st@H7T4UU$4oJMKH<*=Z1Hd$cKg%;^[JGm;:UsIho>sdjSL'[kOq3tb3$Uq$SaCf-hP9OaMmWq45W8,_Natb>&s@9\fX7&^jY:N&lfKg+Gf&;P#\88qUna585cFhp,tNiUB!dt11O67,=6O>Z/@&LolO9]3sBUQ)H5B/).)HU:gI2a^(AaqbDKD\0\mFTEHmpgb%l+/jk#Xki],)oc@X,fd7JZ`DD"?+EV@4>!Ict)2a;TC/7`#heW[,ac]4.tpj+Wo5tXr,:\iOo-`]u%OZCW^=^:qMABDrd\gSsWe;+58jKfMtJW! +endstream +endobj +493 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 492 0 R +>> +endobj +494 0 obj +<< /Length 1335 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +GauHLac>C>&A@rkFE@V!N_#:9P#DSK5rtC+j(37W\WgIg4`L6?oZqk5EA>YNmm!mHWT=1qd>HmSXLHuq:hI2dmVdg2ZZKL),>J-8uW6a>W%=H=f(O/=+;0>0h>]M5+>77Am[aJQ/[Qp&GD-1WrtLb?70?D#?+#ga7OBLgMHHBIQG1>r7<#L_/11#-KCH5RpUI]EZ@C^30$;#E2p4DKfL=gO>%)?0W+R;Kl6Y/(9MkmZR*l9;5kMGI!.oZEBN?Bj12mS\tufE_Dj3ZK3DMFH-(?DuXDFk15VnKJ$csBnMg<3;AmJXnQ0RLpgHFNXuhWhi'18D=cY\OBTmsFDCJbSfi(@E4!j%DGEttbP'G1r(4))PP_(_*P3at^3U_R5HuUC4F$,rW6<#'.`cHk1loaU%njmH#/OCFmebsl>8d'1+tk?7i=-UGR]-mM.-3%$/EB7`o-#(&une&]!&.e7q?)i`JV><3'T?(k<.(_MuQl^mIXg,O!\X+>BeeU6!7s>lmR@d,n:>lC]%"FNAt9?Y9n/7]Y'3l`r>?e-#5R45g/hq+l:/#(&5kul[;bnN8@^83!*5t70+VIF\mij1SXX!^RXdQoK1T`%ILVQ/@TZr2V, +endstream +endobj +495 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 494 0 R +>> +endobj +496 0 obj +<< /Length 990 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +GauHK>>O!-'RnB3aCC?eM='=KhO]H))ACTN2XG!K;[+jRcifkXgTR65VQjp,2?AC*@`RYZkPi$K:V=A.k2QFFIPUKrs2)[&TRPP6V"to3"Q@Et(B1M"'T5ps'd%Yt?,-JAVk`_6oon)Bb2P3XdtKd9ZJMNPKCZ2cYofl@8No?p(lO^,g?u4!r\XU7!QZKM/<*7-eld..SjTfhWOi_OX'r-tWQP/rgKGdrH@Hnm$i"]$]ks=>m"<6)g_-o/q!ena5L+VQfgbb%$MD-&Cj//-k82lNtWc(\n3223s:)_Hs6fi8/)TRf0\:"ie>"-3:H-^u@R,HQ;5o2dD0.Y!X?2u=jX"Su_BX(mbrs$>ed_@ZR&`A]DXe(=[!EF_kqqD&Ij%+eu`(W^aSI)cVlA;_WT@Q]7?G"RWF/"fr"7KZoOT~> +endstream +endobj +497 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 496 0 R +>> +endobj +498 0 obj +<< /Length 1122 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +Gau0C>>O!-'RoMSakhKl(@)UM8&_Aj't`ndeqaE90SK+:*>FBOUj%)>8!3SBn])[E`'iJ=Im4Pst`JWV+FQI?n,56WMT3gMbIFrj:`hc6nd03/XToW+Y?oO7PA6#_`QaRbVdN6Eis"tY[/4Cj_,DTMXnKVhW5"[i]o+UIVj[p\.!Nj;hTMb.`]]WjS7^qfI0uuLr)-mXcef0rDlK(r0`J%)b\7l$1`&k05IsB3t6+SnQ601p0ro@\8CTgaerSIp1?"gqXW[ImaC8S4Z5-:1jQVnID;P4X0"+..'C1W$Ee*fA>;lbB`s_Cj)E5)3HH#roT,[O(L4C:d=6<0m*3%>]s9m*c.h-\2<(qX`L>fITpY@TcO8I?nT]4EB$U,LGQ:0s9__6cEGUEAitU'`=WWSFN$lJU!"Sp/;.\Ab/DES#TEJ'oC't<2;;`X\VKVfdse +endstream +endobj +499 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 498 0 R +>> +endobj +500 0 obj +<< /Length 1365 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +GauHLD/[lW&H:NnOcPtg6Cdec-RK9W";9Gr?Pl+4j0W6/ga22kr]PGkfGESTBgHR`e?eV848[=tgj2/V]mc"^$TYY*c1@?5/SE.FkV'5<'%4`QEGZCmo?>aAR@e^T`fj@fgg",lgjK&W(FU*kf`P"aLN,XBYl*pq6U0,Rb%Fe^o/TW8$/Gk",ZG>e8:t7,1Q_Q]gbID:3I^ojq(mB#gY%7'.*gU1r*7`2D/iL;ep'PJjOk.1F$7#9=s<**+-Ea0R=(BrEs#LM]H+!F1\KF+I^c4nG>t4p=Q%l(E3pdX7c`8tk`8?L&F].I[U3T-%3Eu=MharN:"I2s"f\ljC/767H<4iSU`R[:12RpM-Ir#1HG%u2L,9&EcW#P2.oXtUQYA,P$n.//'OI!:PS)\!WIe@L\S/fc!OeSWZ;f6m5j*9^g#c3VU^AfXdku#_h7VFuIf2YP*_?SJiihU^NuSIL,TT.+A*EuZl>^XuH\m^@&2qm3:^g1OBmnl\0ZZOBY"*NY_XZEsNr.I^n?]u-U*R\bXU8)H/!?m>mV!s=rX+=Gi=[eX!SY='5a/3q;:6,OJ\k+j[K.f6gD,(^_o)(LE$BT&Hs80fbAfc`?uHM'Q@p(@I=U)eeH2Q3OZnR%!+cEt:u\p7H%"mpn+Pi9'Ga$ai\^O@VJ_Ic:$>C3DD-f_jA-oe$&ZSY=$2GU^!O)q7BJ,]46YFo&]MS[oF7or5/uh+=rpDq",1e_8gSDac&-Q-'S?)C?U#A?4K[#&/GVe%ls/`lRS0AhE'Z7c5iA`f"b&UEL4WgCeFb^.D!uoOU7E!UluO?b@&6t)@WK'H^$e#<),SQ%`T/<87fNdQd_/XX/_.]fh/%&\QjM6$@[5;-#h'6IiSfHX3#]_B';k(a''sSSjRE5+s%/Ti:.:YC3gK6gmQVK&i%nS.99.!/WImiLns'Kig7")Y]bqA(*V#DDE"f0,`Xu-0c#]$.,C15VV,aZXQ4q>LZ!NP%T8pJ;=Y&p"Nh8cPrAR6?N)([q`3[HJI+j3eA7+/+o`_6*_\=]"Oaa/Cdtlf/?tG8C.$[YP'MkEDjS6/&:S@:cMS_;R4H.PtmAYr:g?sM1dMUHIS/b/]^h<^bUi3'>q$6qIC\JMkYh(&F'42p]#,Ml_jT~> +endstream +endobj +501 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 500 0 R +>> +endobj +502 0 obj +<< /Length 1313 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +Gau`SD/\/e&H;*)Tl4e!<"UES0AWN@8@ApIYU&YNX@5G0[&[=_.4(nb^E4b"]!G'fZEp82'(D:#kO*T8kGYl]g#Y)4M!'*0Hp.(kc&=WRqB6@=S'B%G>nT0hh"g-p6hsQlEaJWOm)I=D%a2!,KL0J.=m1Dm/pT'a+fdOkp[XbtIDpQN,]!l<)#eu6qu5aGmcrWcIk%@if/e?H1"[(k+4C8/6+f(AVMn\r@%WC5,X'fYm7gH9NK=]G>GA%T5nIb8'&Og`E]nHM_bd%bVUWOf&f/N9(fJjF=f?ARVFf.QW*Ci#])Fdhc9Ph9jB(i6Q\)2?RGtT6uJG^_`E;/ms<)anP"J)4o6mXqGcoC[Rp;NqL57="HF20KVDA&9:XJ,;1sZ@8>KH$\[&:qUO(:lL+>qI.g"8ZECt2]?Hu9g/BLNSFu5lp3)H1FH'(rIc-]\d(i9;Ge2*+h4e(KTlf@j3W\B\In_MRAX8;BYh'cU]10s6]EE(j3R)Xt%Om]Y">Q_qWjOd0p#?E'eCbbe6d,g#pb.E23SV',=qW0dqA9&%k2_^8@'=Am&C:(i;Bn\`mf[;<^rXI%^`[c_*/!=6Fl,(^cj5Nhb48giT!dDOegNCF33)gaW)Sli'%GjmjkrIH9K#R\^)2ORb+F,R$,%%]70lkJ/qQf@F`?*S;#YA5OFP0igkbj&>j4Am&WF$%(rr[HfFEb?\Dq6.qUr[P\e!sm`KXsd73-t%oeQ4SMFsXKXlb2Qo,Nk[;Vgbg9_/cU#L\ZYi(eN*g%O5DTkkH1YD!6JT\g46aIjq@=/j$PYLqics_uWgh +endstream +endobj +503 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 502 0 R +>> +endobj +504 0 obj +<< /Length 1286 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +GauHL>>O!-'RoMSM"WSb6&6OCQgJ?knR!LefL^aVk*13X3G1s;XI[Dl]?JL&mW@h`o7;SXc?M\enLEU5#qL7,[Fr=,hDSaHUg)aE^XQWS57F+IR74-XrcaZO'9%j/QjOEk%'gjWUUe:1;q<>l^m-NrsgLkKj3JGrZg'1h=JHO=Ud>0_k@a;ABjCU?jj#XTQo@$R,nMqC8R\EWJimCFNi[KBDdF!-9*=_Gk,\)mK(tN[5SukBhrRiEh9+&H_'Bc9+8*:[9OgK-C%IQhfQY&?p;i;?*#?HF\Zbbna0[^)$#TkIs6r72mK,c1k_2WK`E?St8]RLp([hIdgLYA?D3PG:r24j@bT[YXG_$;d4q)oB!G.BFCO%Z\tcr+Geqaqh"[O0tqB(@)f*sGPZeT8)>('2"g>&!8.>3j=Jft)4[OOO"sC8RHR.Pofj/=poem74EbbPY&jeU3[SbXjmJ)PCu.[a(/a#i!GqE@m2"f7l@_]O7H.:A\9)2EFjKU\NX`-.-Sl?ck=FR%RJ=q +endstream +endobj +505 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 504 0 R +>> +endobj +506 0 obj +<< /Length 1398 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +GatU4gMYb*&:O:Sk\V7]<^_eUE;S.X#r[\o:rhk81rVeiWC4-G\ItI/J%l[HM'JIHAHr5;%69pdkO8oElZdGmlW_H8*@jl4NqG@tQG``aL"pu.FBfc=)GV%gl&n[5X7,gRrVu(kp#?.(%S*EnnH,6)Xr"/o;i*W"0eZ%K=M'p(!6'JQ`D#4t`h[]Z9WKg4jPNs&6,/P^TQS^1j0"+'la26b3]uI>(1HE1\-&2bIh0KO69@.Ksp$9@DkF(kgf$H+9"X,rq/KV*R@\YW9%Qsrt[`7CE'Ut#'D[us5n_rKf)b3._NPMQnp@ll"081a'OP$BTij`l!KKBs;MRmT@Smac;Zc,Ac.sFISU4j]6K"TY;MiIO.3=/sK1L$DsVNRnh\4h$el'k&a4hCO>GR!XrYe2&M+eeS*+g7jAF&'AIL5'[n5E?9U5"J]-L]IE`UrbJ9@\JSBUdW8$25+KB!E'E2#g1TThq$IPdDFr.-3VtYAoBI;U74KAEks4le"L^0A.pNa]?`$8.b),c:*H!5^\^\X&X!@nC,s"8dReq61g_![p`Ai7/lMD9$1r@X[m&f:?Jg_a?)*Z:KtN6l=tNXudaN5f*7GkZC'HHhL76LV;Y!N0h`leR`G9R2=/%6Soq&.SH'oCsO&`rG](:@7#Rp&fs0N)QH`o[V[i"C->7V8bP&Q)4K]T[%7M~> +endstream +endobj +507 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 506 0 R +>> +endobj +508 0 obj +<< /Length 1863 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +GauHL9lK&M&A@7.ka2?Q%'"Wt`mmrGtL[bm/?G?%/*Bk(/^r,lCd_cUX7C"ncQQp"`'180[#7j,f7c6F%(:hj%?*$cGV.*D?=\0OH3L$kK)CAt*JL6QI7<%T#s)JZj[A&>"5]c?:8VTj]MX1.,+BfB!Fm`%'#.S!bbM5VZJdS[8].*kN6[Oqu.qCgWKSbAM[Ka^aNRkn%^2H.TX?[;@a:t]b+HDhI%%1F&.$q8]]C!LC-V$]-.f:i@a"_cU*ASIti5bBouFEEQ@UZ+2/!(fOY[%g@mdB:0%^N/pcmhf8!rt9XQpnKrn+9qZ*8FoNkfQu2FnV"FRo<6g,nGnB>RSto\m*O7mTu'\j=rYLP29I[..do9:FBB)AP[H6V;:9AeP=B@!8sXVJ=p;1'\goA9k\<^/A/1;>!Ba(&=VYabOG66Fh5<8me!S.VZMk])^r(CL`N(jimmFG#)Yn&u6B*Z@o%Oq]0)?H';BjOsDK1"GkhGkNg,*Ete@l2bh;M%'S["`5"cfgP:X\KRscWq?\''HWtc[9I>E!=U/2RKi&4Ashq^k+Ia.L_(bM\[[PkT\@&AGUIinQd49,"Y?AU2^ek63tseBP=W[\A,PA!)&jRL1ED53"\'Yn&&Wp8d+3p6e/Y&o_%UH%QK>lV_gdZA/qeDGP74G7G6m04p/KQk[$"h`WpqK9kI.o.S5l!7!8-5h(Ie4Pt!1NgRS1BX&B@[96f1On?f"4N>*)aOFgmq;NtCj[KGD]6[%(S0>/#L\&Nk9ZClg1.h,X$_?TNhh1>?Z%^6i,?3&d"\se':QNs-DSP+TsU-&k%W'BBZ^4is^,oMTj=s!E=A(+sf/o\jGa'djC/0+jJJ"N6%3[`\lD0A:sN4@:&+ns+3+1c&=+G)I8kDF05d3F/hARo"e9E0s(,;UQ4mWn`[e<;G@7qlLN.\Yu4_+M"fI[^4K>i!(gI_`QYShOqsE@0HL:gF"`7p1"+W6Z.Y+jeZg6jYm8/EpGTrc_OO[)9ALWO3Q=-ilf_U165h[h>YU%T"Y6D^SQ830/o0Y_[/Y,,rCD\aokVHJ]=+Fh?6Jt:lR=cKiKQa#PR`]a_iM8D",p\rWE>*bmri,t\304!TW_U-u4CH.A+?df'-7BKM7:Y*J1186Hg30nt%YE&Rd`OFl+BHQAFV[DKD3R3*F_jTFfp/>="UnjTMph"jo/`[6sD:0VCSi-p^Hckr?sia?RCht^dd+b':+a`<%,c5/!]n:*W(3Lb/[i;SK!frIiS.DP>igb;)TQ1=kMjj&HB=H_h4@%;1"qA+N2*`Y\"E@LNBZUd:\'7[V-~> +endstream +endobj +509 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 508 0 R +>> +endobj +510 0 obj +<< /Length 1455 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +Gau0DD/\/e&H;*)ToT\FZD'b#Yktd-.@-[Fk1JLVV'olDEjWoN9?D>Imn8e-G`jMjF;TT4]]7ghI(?kEb2$OtrZcS,llt%aU_DA59X*Q7+7*AR$=uakKHk-7FoIfSB6RpTh`1'k\$;Rnp=8d/6n#c/Mr+\7d,D>K*d%])=Xs?_OcMK%NR*DR6Hh!$Y5/0n)Lp?:0+pW]VpUGWecNS'O8_4?hVOqYLeei88ItGWpI&C:7R+W3Z*^e'0NndU-oBoT?FR_7$tgI*7D,WOk%2fr!N1dZrUH\#`?CmrQ%BlkLRdfN`XLdmS!0eH_;XmW"i>?(b>iQbHYttlFuqC)p7GV$KZK$.HNe&NK%6DqWlZP5B>o\%/d':^&44!?>gmd".&(PqP\n9E.LC`=9:YuajDP7e:l8tk$+T20R56OpCK1b4-Z<:&%@XIr#n"d#D;UC&_W6<_It=;RXUME!r4^7(\C[,VG1a+fZ:Q=b&c3_@EH"AHO(6#Qd*!KLao]u;GK9iW9+29:!j%&U-VC(N141e>h$"WmWabX.;G3.aFgel79me%XJG.X6([8'n=:YRngfc)Z2buL[;m-kY=;BYU-ns>_[8oMo['Ts$'a&%S>Z>##Cq6a#XfQn5+VED/WDF'np)'KKar.0SLe7ij/NHC2Pp]Q8k7RcZ_9bI)@mst.),U]M_#Oim_fX,,\"@fb^d8Af`Eokhb[k0SjalfH?.tk<'"$d9B8LjUgBk28`%Igg+\XOCNn4rAI)A=-s%JfO+*CuC';eqDJG<9aPl,PJ?_5tOo;P%C?\#_+S_k3uaM:"%Z\ACcK6[O/Z+!sUaumV2DIH +endstream +endobj +511 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 510 0 R +>> +endobj +512 0 obj +<< /Length 1412 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +Gau`TgMYb*&:O:SkV3)N7FYW!V\Vh-??C`miqB2t(:6fhg;oF-d:rRRV0F$&<+dP1uT!'c;CHq)*?$n+8_]^rjQYn$`[pO97V:\QO8#9D%hH,k5QAu5`u]I'U+rAE#X8b'&9LW?e.ahl!Y4)'^)9`)Bs>YTBgp.$1a\Z#q;^je!(9[9aUaK^*(9O)W:g'QZ2eoBNGRZog\OO:/CS#aK^P:d]oMD4$b@0.Y^q&3J%0q)oPnJ58Q()E_9I&E@??7h>[<;>(V2>Z\LR>CqHbsVps?)kSsKRB_poA*9nW1GPpo.aK:Vr(;TO(46C+_$i1^@abZ.>*=W1uaYdV/e9gBC]2/q8F%53tp:AR\_>2scaq'MP0UbE)0a9h[rA#k>Dq;d"q@0R-;`Z@MrPpWHI\(F+m#COuq3p(TDa#A4q@K$(P\&T$7=<6\]^MR&:[^'<.O"('9aWBY7fcD!Di,V>HQoF]X8@!i$+Igsi\0XjU2]I)`4EF,nRAlY28l^jqe8n&eK(ZQiM`qQAG$5_l>08%J1S)Hj9+9$reE$H?[Kr#KGU?W[LgObP+A4QDR;;mIr^XC&i`LtU5$J.u"AfT\JrSfnT)CY9MJ.S:1mX;pbu-$kQhm*e=e7qcrS*4V[JQ8QNKMBcDT??lZ)5CR'5lQ6388ulR:%uso.""\*e+gl-4?)YeHq\6Qb]gG+!E_t8B<7OkV_SY82<)Wu1!.f(Drhg#9\`I8NDNISC`I_lkF55s$@RTA>)ibree],K/*Xc__^=`?1i?Y^)u9XQ.\N&;3:9V),()!NH>J3X8Ea6=jD3FFAGM[hp6_X^gZpJJot(6=:GXqP=B4kX(B'L#9>&^[uKWdl<_C_Il#LPSY`W5?ebpOmc<9gJ->U%+lou42LfDVC%?7,UX&#(*h+6G#>RAdeHu!I2]HOOm'mX%+J'+`bL/~> +endstream +endobj +513 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 512 0 R +>> +endobj +514 0 obj +<< /Length 1196 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +GauHK95iQ=%)1n+pt,SK-HYgGgM$gPXMY5nBtDJK$q`([?n!U+D:E+r&hNY9Jr$OBHQ]M:SMBXHOV3XZuEL+rNn:_?NmSR6O+t8^8db?k;gjgMsjR[[#6K4rQhP7JpjbmS'Wm0)K^!9o0\7N^gk.fHJL`=XTUc3K":dH937X:`I;&TU1Ie`YtEo//%]VJfY*44Pr&:Q6O5)We%OR:Z8G:1$n(&X'[Qs"8RegYC,f5PeidpQJ$@`\dTij\:%4ITMI(%LWg)F#(YV4ZXSGoj1A;RDH:01!_Bp=rg0tgK#cFRi;`r?2QH(*M0e?;B3OYP>NZ&Cc!L(KJI)KGlY*gAGMM'&/)G"eGJFTX/VXsFhi6P/)Cn:NgJ&7>EV!=HB"GWH`bCt*X?<':H)eD*e9h'[5D3$7$D,7\fCcD-XT._p&M:oV2.1WmoH!$Vs87G\dX'JFg/V;6"6)pAq1B_F,X-[l<7k."->X0>!o/6PH(O)V_?H`(Qap-nrrK,&._u~> +endstream +endobj +515 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 514 0 R +>> +endobj +516 0 obj +<< /Length 1503 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +Gatm<>>sQ?'RnB3n0<$?k[lnoT9_'&g"C5/&DDofkpVBT>_8NS*>nY=.pK<%,Qp]m%PKlcGE.^/m?9Q&Nm97[6nq;:*)2bE*8QZHK[h0$;MoFX@YQRtVN9-n8*;ObSH^6gG^92X8%[BE[ra=5.\g@o]P('XpLF]Oe/TqgV4$7:F1\tEraG:V%YV5g-Oc,D]s"!0UlmHiZRd%cl7/o;GK9-SE5`tk%]3@<)k1]XP-qog2m1r%/X2`FirPGe@-&D52e)c*Z3sWLX1>^+H`h5O/tu`d+d[Ht(V]::gto6kNDCK[04JD(INtbXg8)sB>u2(JVo6G1U(WNmO]D@nX`F>#lWMu3E==\[3]5IZoM4L%9RRj,\oFY&M!A;)[+lF<4Z`nVQ"[8kS?LOFRRt-:Ml6,3!`QEABETHM*kd4Fn(#W&]O,KU]XS2DKctW:4PCf^SrI0'LRI-3N1JpMbh2Cp*X\!O'.5$LJFa^Wf=HZp?>8"hbZ@h[>9o/KU=&_$Q>?U)4iq^J1l.(M6j1%qdB/I2i3SWMl8:K/L.5N(:JSG.QcP!aMR(SRIIkcW=-_Y1TWPCdIUnFprp&3:`e#sS&?I+pr!a5#/7M7k"n-[)Tl^RTebpc,Zchq@+ggkV39WX-h*b"5EAT\bt"ZBE0HncF&M$G`4@Cp_u_N3#jcA5Z0!pk^oI,umCQ'Mprn;si_&Y?0 +endstream +endobj +517 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 516 0 R +>> +endobj +518 0 obj +<< /Length 1187 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +Gau0C968f@&AI`dHn0:O`Hq=0SsiD09r=HcE-`t(NWC$QJ5'jDV#S071"KfECcCa#Oi?at%t2&??+R_-CI?!#dP]YFl.Vke2-p-aL.SgfklbEfF4].?rl0l02,ALf]GkNK2"t&7@_G_n'cg4hR'oul1`kN2N(-m@^O6u5kGFh"oUe_ais:5rH3GKuEhQ*a>W)36"]+6(#2A@&M4m.@05n$X]$d(WEk.$q4Tf)]-jW7:J9R,\H_F\7dpIJ,]O#pCI$H/C`ie+Rj"C@WhG%f06Y#pq(TWp=IW*lNFFbQX`#kj9TUcA6_GnSo/-g!U.h(T].`3(Sc>d_.a`T.F(?n@2Iu:QEZ)58p4S9IYG_`@UCkaLR;]$$8=6'2(Xuo$uCrTp!XVruF+,NuT3GDkdF=,Uk\d=Gdb!S@Y/j,L0hOi_#&\#jn/Y!C?-\+#Yr8,In;TB$,P0;L)Y,>@FI3/!!`[C_eLg]YI5ViIhSZTOMR1,2RUaRfXmSs2jQAQ.)5*7bG=9\"4Q.lVkR6sS^X\Z\d#)ETriab"RUj2Ii^mhJL9pQiVml=LPjB%L60s@?R9iWsreb1W84Pe#N39PAF:fcO\V.;))U>8A)[22%Q3=OKDoRmiUoTm5+%;0AdKlZ?:'(YVB>9smV1J!l'.gV?g'DtT:f^n5$^ljL6T,>O[8WLJ*Zl'q>33.[32n9riLf5W%(3#AL!JNc2&o][Q/HSeRp3A]'ni9Uo$gJSMA8MMT[<7.*Mi#hJYcteSlo$YuD'8_KR>ZeWMmd&oA/-s.ZAl.<_^&?;I"!;TB)ufEG]XL+=4EMd1Ea +endstream +endobj +519 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 518 0 R +>> +endobj +520 0 obj +<< /Length 1068 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +GauHL>>O!-'RoMSaCCWknL]dGSlS6:d%md#HQ(@tZ38=u"HkIGIm<+2a#GB!K)/rKSGVjN3R,d?*6hao5l_oiRR$%^JfH1ga?d3W@%o1!RSp+\Rh+S3nb3Pn0dD>[t7mRk>KnVp"O9quc,[j.B+BrQ0KTY&_Ds#HgFp23b-mFJ?ld1@m@l,if'iP"#U0\Zk;.ZuYrC?5'isZNWO]Mlpqt1TkOR?qnoArNCGS;VNLSAm%:[6Z*ibKlMj[I)RNqG]!5jPN-%IR'>W#bF]UXFW0##WV:JYNI%iMIGn3JYpd`[9(SO_:0CR%)(!C?R0eOYUf:i5Lqg>1X/IaB.5O]lO5+q#GLS^hS%:\t!r#h$$rc$&^L\O&^8[du$P='O7LDTBjjip0[n1B6WT$OZ@+R8[YR^iC\$?jEFiIg<([/li/a[*%I[-i&sE3M-VY"#&q]gi!01T3"65\LaZb`].Ln_Rbe%_\RB"V@Dt3;L?3k<:8M=_Nkfn'i;8(q9(lsTgBlq/.)T,=>^,lg+=E=@e,T\$se$LnF2pL\tX;p>i[eo#3/6U:6,]->I3[P:6:U*?4mU!W)EaR"2nm0/_5^2dB,^+D[>J%5iWkNWa,K-&%0W^~> +endstream +endobj +521 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 520 0 R +>> +endobj +522 0 obj +<< /Length 1131 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +GauHK966RV&AJ$CE,46C'I:Vt4k6*6RS;GT$0e;SFGMMX)@Wd%mHMBhGSg`i[NV&\HkG[mZ28sMAJ>Qu/o1WY^bgXV?lG(.BUJ]&%>Y@bCE`aa,?PdI:6m%4(F1Am]cS.WNSo]K6F/Ca%"3m=*)@E#^)MP@?(HHPL;p3&(@!8c`Gq;'hWu7qa>XiHb:HD6%br,YV1"qlF-qi+p@+PFF7D@'dofQcQGM:Yl.E3H5fk4G:W5De@VEWqoJ2THc,or%Z])-\N?k/B,*\m%aX.]lQI@gA'[LdB11/Fn$,P6jlYB=0Ii]$t<8FS&LG#e?>b4Z=U;Vilj2!.*'VWkQE-OGp'j*:aUM&W8iDI9LE2f`CI!4K;+p4Oe`W]+CC\Hp-04CHS(njZ62>sdC$sZofgl:d5p.\2L!tjs1a2El"rc#Gj/a+YWPG:sG$pP^sF8[j("r?!GXm#UQVliJ8#+f+7YHrIsM!`Pi/Tgu7R3CW?Q6jlG05kdTYJ5Q!W*R.OB+;S#TJ#lGHlM!):m#*D,WDBb$/*5RSh+R5QHB>FTpt0&oLV7`/3^P3`;@a^$O]=M@1Q'7%kB89q;riK,gs:?DNEq4/3+eH+-5S0\Mu]n'\4DY#Hl[4Z&"_cGo[aV6*ZGU.J@7&EdZdQ7T#>1O:a'0&9`TmDf=l;Q6cbBlQF/Ya1\(HWnI!rgABSna8ra,g_\XI5Mn?I5GHi*(K:#)K7%WS'BmD"kR,6,r$u\qfu8mF#Al$To9fgpN>1JciV>'Q!,kqnGWWRmWLX@5KP-H#N7B")i"b&BsSZJ3Wo80R);Y3:kPb_>Fp[S>D\hmjTlq64X*i&UjB>g[=N?pELQM@d7+*,3/-q5;;Bs1ZP82S\Won'JFqX+/1!^3f~> +endstream +endobj +523 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 522 0 R +>> +endobj +524 0 obj +<< /Length 1258 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +Gb!ks96[-h']/^gY]P1P)?`C"G*Skp1ikEHj*8/7HZEXA@ld_:"Ct:(lRRXI"Ap.O]'N2dEo2pRk[H97/LFgP^6_Q%huhlSKRh-2lKl]X@,>L92n?-r@4QpCUdZDl#DZQ;PegG_ZstEFEr>n=nR0OHCcZi;8pJ^86(miU^p1B$H%/SiY7H4bX=dS(ZZU]YrT,Up>2m[6`ZU#,pg]_i>3Pni#^[r47Pr\83j@X+W!4C`W@k*`hV[-qI%4IpcFeARD\]-6R,bncT)IGKN1L:'Ko[nn[7(g%[@HAAYB*n.s01UQZko[>Vj*\B+l!15V*$>s!:C31W->MEK'lac7.l`mPlEj(d^D%X7e*lkO!GVTIq3A&k$5o6iigNajloGp_T8b/_+]U);6op?0PJ8bC>DFG-<3!"+]A$UEg$lM>H==G<'8jr#L2UZL:Y`!.jl#V_,suO_<:.[I!5,%-aOSLV]Yt+ZHibCU>bguD66sabRATP[HYHZ*GZ,gWuLT'3Ss+'p:Q_2>B@[bj(mE&e%/r\+Ib01ocECgjQa\n4'#\_O6^]k)@Er0;,A;,[ASno&PB3eTUZE#[>iY#nlj78!89>44S0FrgCWX%o:[#h!>C[j"j$j;Wjb=.4f3>g9g^)D)(re]?c"HdCD\bhD-q7^Sj8N:LLG0Paq(FE983@:L#_oPo:lcP9@DPd\(r/tgd\tM)qki)Qb5Q(FKqM4rbkVWAX.$3+fIhGDjk\*9b>_=U@SjlCdp2\hXWS#hqKcYs]QA?Y$;HY;:-o6JS/E]CetA\]b2JD9k)G8O+fT4B>2OR)1TH&WSAfYZ=oVO4XmHte<_2Lg7\@/kfGc;OX!Z$$Z>,\J'tEO[!`P0JMK&TJ#1?[.pa5Kc`7"QYn/pr^VEHThbXs[?4hMnJ_DEWcu75p>\"3nef1Z*j)[#NY^Lf-]q]BU6[L +endstream +endobj +525 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 524 0 R +>> +endobj +526 0 obj +<< /Length 1718 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +Gat=,=`<=Y&:Vs/d$pRM;03o);g4@s.<^8:icH92U7c)?-6e?T-$^(:rU6RR8fYtFdCsTiF*nsJ%dMO&ibic+Ic4Dp$eKH9a,85SS(KW?N,@ooZm5]Bgfa-L5M_V)!V<:Djh[#4,bWt!31BgXcAq)Bo'Q671%ja[nGUMm?e-=K!gE5,5-C7Ibh4dCKcId*bmP)K+nJ'Vk*&8=t3X*Da)@GTXD/1(gTnA/aBRi`Z#u1hI)4L%^+mEnN'5>Y)LSe[a\s"D);p%/hjV#m&_%H>fRS'9S/3dgNOXXZfYK)?&D_chQ/41A2PK0_Z=5X<"_P2TWA#fZ(YfI*Bj)ffmg'LjOW7O*%RH9NQjuXsAPC55V4\5dQjge2$!6\jlp*%MhFmGBWT_BT3P;e]FB%AY8Sh1FroTum/"GoD.8r[a%9ajRXFF$mGX5Ctr02,;(_U.ibe=O/['.@km;FlBk%;[l`Sib$8@)W\!Wn@`WS=4.YB(sa\[U,5C/([(!fji*I/l0]!?grXqes,u:Ufk?Bb!LnfO<\'GV'+CI=D+,i1\2K9d^KiGq&W>R*oEKcLY!G'/%f]M)bT"H\`h#HmAXUQ;6i5D*f!Z'ZNoN,*)(LQZZ/2WShm6iTf5ZY's2"N9SZe%Q_4[X7aC3u;gk-17s.X2.D[Ce!;iPm;LgE0TZJf)[O/b-E,!7(:]nGs&IL<"]#0Ksl2tNmIV>HbGXotr#;:%O.+5OV5/;CNkNuuSQebDbP?lQefPROp_5ruUTmed0"Cbca/mI$/$q`nR9K)a].B+Um,;iX?G\-;;*ku[9s*4UTWE/rC%j4Z\M4odt*^F6%DO:q1L(X/GN'.3V'l!k^/,<;o/3026RdkYrSg\!@0fc;3M:NgE3gO=dc.HC>p])p!EV0ba>_VA-Y;"8o.QOCK(67\0\7;~> +endstream +endobj +527 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 526 0 R +>> +endobj +528 0 obj +<< /Length 1160 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +GatU2968Q9&AI=/pstaF?-AO@E2#^mJO7JRoKX9`9pA$Za%g1lSc4!.YV"P5'+0q]G.me?\#\%sXsUj*O0Jj.gT`*sSms?u^iK2\=MPZo&@clhXNB2mH+M2?m*,<;9g3VG!%P1p_f'k^:VUtp;T-Wdcg]t#6Y]=XKn4&^Andr=Z#36JX>q*2Q&^ka[S$_)Q'h9IZB<_\T(%>1cZa,M=tN?95lj*&;8VbL1f+=i!SX,#D96jH-G'A`_$=T?A-R=(7QYqY]aKk,-$f(V0e1R3[WT*_eSVUW3M`lur6\W2.0o'Wj+-1k2QQgY)%]=EJ05Bufq]4OA&=j#/#pR5./H`B?dq^`MUt`"cD;1H8.O5cIU9>,A(lo5-O"7!)*qM>]-.0I^/[UcLDZVRCL*7+6)(0L4-X\.$@,2tgX>^^X3:(rm@!`8PtC`A-0[$dl.=[^oUaQM;SD2'FoX*B"ip<3Hmc9%PVtcpD_^mXKKO-S`)_V0Z.g$4E5_qNq*L!uQ,n2q`"hX(8>*$F`aO6-A[`5.!YAi#PR--=[X:d%+V_gMs;]^C+hkC49!-(MAd'+]pHA[XME&/.G,?"42T&A3IHs3]P^b9@'DCjZm8]<`T%(1]M1k?Q?)dhI);.qU,]2rTS,eq6CTdBSao@09eXGl<"-sm4KFr0pI;u\5Oaip_<,ZM7aHeN1ZLi/0(@MGNL*MfW/bR46GUWPgV>ZGog=cZ7Q(NP_"Z^k3ku$I0u`Ak[g*0]0>TsP3"ij=ZXJCpS4H$G!Nge[6N~> +endstream +endobj +529 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 528 0 R +>> +endobj +530 0 obj +<< /Length 1687 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +Gat=m>Ar7S'Z],&.J26mS'%ca",:7;>$u[pL?37m$6^]it+pd*4r;@/JF-Z@dGk_1^:RF\2JgZVK4-FFKBL:X4-94^jOqhPsM*-(=-%E],X^17rpW5YAj6m55MH#PaM#\P=16ODA"TE`'X\:O@&XcGs9+Z,#,4`)lNX3Bq^1VIkp$P8^%dpOCloN[4pV:m^=4[$$\OVl[VL3Z\S`P@tiEHGP4:?P>Sl@r(s67i8'/YN]rLC,eA!C9?&am0?>tE)#3U0bb*_j7s.d.&dmWU2;#MH.aQSM>CVamGQ@h+hlUj4\s6jRd'eS*K'&HUR.7eBcoA7m)>*4)U`X$&OIONDOepf>7bbT'KhKC3T(B0nYVd;9l]-nKPAMr,=R>rgNKK!qruptTC/sM(9>gkWc#Z+;grJW"Ir!B2,f%ZYlE$hAeH8*a413]8rG0>?U/EB]CYrQl)UN]R?aaeGK7OonT3L)'$rd1oC-/LqtRAa)*&d+s]Lu&r@ISKS#=%Kj/*4U#BMEZ65Cp(kQY/[se>g@p+PkbB+%h;E?:h/p$6$G).&\p)^0e(J%+K%Om+"P#!=^07sa3A8D@1ZAH$P6u*#T8"G=1/>3jhqRG]@IDebR"^^ob@g[c%uc1o`[aE,J?'(;hU[A,Uu-L@2p.H]D!R%G,k5+/gflZmXnQ"iiDiNpeW^r&S,'nX3FCqF?s"HaT'D#UdDSpU1W/O\(r8U8qo')[sK.#J$\'GVtUX6kXX01DcHXK%h`3=o4e#(=l_I;gA.!ZHjIQNJ8Y"&SqfGpC&p\_"3p_0-h,mXj-T;bP9M;hlC]5nVroAMcM=hP[qaIW[9i70Fh9B;3o<=mDaX/GpJ&KAF,j5rhFj%_@EUH]R'4*TO*C$:ee[+VO\iQjE(R<0#;8Gs-hN^G#SPQ(6KE7oE[oPtoUXRR\-!oGA3MS0N.JgZ`?r`3'87d,-$/Q@J;5gF5]"Rc2bet2DDT3JKGlLr4jX>'`)Tkn+^kaudTES76'r?]Y`n1I73/X,AkuBDO1>P9OU+dH#Di_uoR1RA1EAJ3D"gHpYk_[WN#H85pGQ/_u`]q*AjT<()m2$ZPN1D`gFgARToBtRW[LUG"%k]p[_@kW+P>HT%?N;CKZhQa$TQ36~> +endstream +endobj +531 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 530 0 R +/Annots 532 0 R +>> +endobj +532 0 obj +[ +] +endobj +533 0 obj +<< /Length 1648 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +Gat=l?#SIU'Sc)J.s.0ZX!<'l^oe$G6bBJVsh%cf)J%A;0@Fc[4.(`.O9pVDHPb^I-U(aq8AI/[%63PW_'9VU'W>a;_'q4Cd"%a&0d!iZH)Yg8If`GY?M#;Q;m<7[[N&/,f`&N(DCMd]@9lOq`_3&$XWU9bq6tHoSWP^dGG"khPitTWUorQ\RUGpet@5"Sglif#(U`kb0_Vd1-?qcaE?J2ld:PV5'hi]f<(Im+f]f9s<5"%F`ZbQ6N'aa3;PD=0P.6'k16eeuB0!A`S>\n?>;4?Aj=s(D8*hlPda"88A<*(+!@\5@1A:iJ,gM$Y2ZMg-C$K8%Vme]hPXrgPk12Tt[HTN9#=_V4CeCJ8-jD1X&HkG\P2[>!f7P0B(qLW5*30DLo7b+n&GQs?$H-[5nM^70Qd>/GG\eu`ZN\BkTRVmEKnWV?0og_4YKs)f6fmM%FLGUTbQ`XUUXRW)ToPm@@-Z8>cM]D[TA=m@(GVHZh-L87H?Spn7FQ/@(*+*I8]2kt]p(Sak!gn5+-M-6;lSnf/:kg-$!H!2=[8&.+XU6o[S,;sQOU@0WE?+"(kI*Kf*b=ILkVT9MU@G`!+O#(YT8_LP#S)#L*NJZ3-*`uKV!pRsAnPs-B>QCjon\Y3ja]=lAe9VU,1%;^"i:3*Yh-SUYVZ!*Lk?1['dA6pJKJ0pPjV99q+>?Dkfhf8@ff]Y*n[sVTAP(/K;E9c4\$5^4dBp:BU+@AkEUbUqL>fk?fDHK4uZG0m7NH>_UXk>lClfm8NG#'T!c!:h".\)7<_-UjBDGQd2c)2@ns^cD\L@$3`hpi_fUjKmf%EX3f73iDfg9kB$o0DNZ]VRC:/i:L9*Jd2@HV4MnH;a$(O>=ma-JS8*JWXi[ND^cBA;))N>#b`-(?gmc/=u"npSRY7B*Zdba_4_mQP!2n=qmi/q.?;VWTmK?0)C`;uHp3U)_4.f77cj1k9%bheUDRp^)b0T%[JaGZ0Y8M!>S8<:YT(EFndLb1L5N]b5K]"6TR.oh6e\W;QoW"j,.=s`O>aUg#&"K"AH.IAiR1&J_;L@l>9<6"a"LC"(#);1Qo4#SS=l)YO__FT3L;;>JZghr.-(Ol.ZaNlAdr0/J\FFO"&]4WuilA@hgO<\4T1%6hle*iZ;b>Sh=ZR>HPuC4reul+bG23^B5s,fZHDUOT)Wi;0j,>ESL\&^[k54[alf%/E)dnt.CO<1PrEl=`c-9TSn!C2BA[\]cAk+mtr6a)GQ_9r;HR'd_mH9EZkbs23lBM8M$NNhW~> +endstream +endobj +534 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 533 0 R +/Annots 535 0 R +>> +endobj +535 0 obj +[ +] +endobj +536 0 obj +<< /Length 1681 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +Gat%e9on$e&;KZQ'fm[,]+t"@COcP$DZtM=MLr;$O01#`Uh&rff9c+ZM<NHQ2LbU'3dX1I_`RAW4JaT=o-GQ7B?Sa,Rt$qnee4R)&KASEmAE!Q;P]9*nl'ghlK.I)4,p&WjC:&dke>)b"@*H5`k?#MI:31da-G[*ubKQt8m^n_OW@7M$inp&/;\rpV[XatkH"I?rg;ukX,F?fk#P^rGR%TI8h:Z?udeB9$bl5WBs+oEXD.Kbc(cG6#_9$nFf)7GEYJnddLQfG,bUgNhqo6nqa"pLLH+t)sOn$1_`h2hug2Pq[VB-d2,+Z-02ke-9h_4mC7ZaV*r`oW0@CS6L:G-**Sd[_T4O57,d>3b=@Jl5,Cj/a6LYJR6=l3>tTndmc1&&J4joK%TR;L*6M'\?i8cD!)Re5LW4ePkFB0Tsp]H#bO/&51iDBA9+oM'H.JqC`JO;2D6Tt>HE?&Kj'%o*.SnA'-?*e*<$(/mV8@OVp_:W/2Ib073K/B]!\h#^%^rG3UlNU4(A%9"`.9=8>;c+D/!L3las^p\!]^cdas_J12t^k0V_J.U@&5tJF.G0H%O4T:e,s9f#eR>RVFJ_E!u\h+p7rJHA&c#!LXt;/rX9YYgmkr(.L?[l[\gLT6*b][[i:k:fAP.B=a%Lpa?-V%G+=a*#;C$=S=1iF)Hg'f_#Z(JEII4,NA;$<]H)S`%R'r%XrcnJ0+=Hmi3BAUSF)%E=H<2.BV_WRZL$?uFEQNK^1GC`i1WqB;/X&,&'tXJ/hfa.0jc$qAK6+BfN#Da*:^?`>'E.Qj(2U]j!=NNFlhnTXG$V@'20-uZlMJ^_'b&k"S\;![TBBV@B$N%DA8:!=q\913Fn<(7VC>LfY10l8jg2!TCVi^"g,Sq3;?*S+]:2HshJ;7;D`;#FIi`t6gK#YmngJSQ`\$HSB2j!.r42X1rP",lD2$'eDuL$_n*NESYj3%W;nB2 +endstream +endobj +537 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 536 0 R +/Annots 538 0 R +>> +endobj +538 0 obj +[ +] +endobj +539 0 obj +<< /Length 975 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +Gat%c9okbt&;KZL'c_FoQMB4s\l)UEDjAaOH[M&rc#%Pu1V:Nb;a/+\Z+kD/S>Ajaa*L_/X/K/S'^l[sVU3/BK1"@#h$18u82/,$k9`KjT@uQ#q$s5Yd;;d"UDqE?H*(KFI`d&_b[]ufe_R.Z;38!g>7OoM3-h4e&:'K)T=JW-)"&a?sG2K`bCFJkE`ak`u``,$b'%UC>%d8!hFM0=oJdm5;i$n8*le_s5jhOAT?Is.OZ66uNG62V?.3>OeD#61ako)Fs'c8*\m2)WRE71+<8Rf[qi_C(+aXV@G:qs+g^0pfL:R\8>SF=&,e=h^#TN:.?.pU3)tXWH=*H#=dF)RNXcMO,+?ilgYldGp_M+eVcYF:ZT7AGV/?Vn3=U.VChHpI_ig] +endstream +endobj +540 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 539 0 R +/Annots 541 0 R +>> +endobj +541 0 obj +[ +] +endobj +544 0 obj +<< + /Title (\376\377\0\123\0\161\0\165\0\151\0\162\0\162\0\145\0\154\0\40\0\63\0\56\0\61\0\40\0\122\0\145\0\146\0\145\0\162\0\145\0\156\0\143\0\145\0\40\0\115\0\141\0\156\0\165\0\141\0\154) + /Parent 542 0 R + /Next 546 0 R + /A 543 0 R +>> endobj +546 0 obj +<< + /Title (\376\377\0\124\0\141\0\142\0\154\0\145\0\40\0\157\0\146\0\40\0\103\0\157\0\156\0\164\0\145\0\156\0\164\0\163) + /Parent 542 0 R + /Prev 544 0 R + /Next 547 0 R + /A 545 0 R +>> endobj +547 0 obj +<< + /Title (\376\377\0\103\0\150\0\141\0\160\0\164\0\145\0\162\0\240\0\61\0\56\0\240\0\111\0\156\0\164\0\162\0\157\0\144\0\165\0\143\0\164\0\151\0\157\0\156) + /Parent 542 0 R + /Prev 546 0 R + /Next 548 0 R + /A 15 0 R +>> endobj +548 0 obj +<< + /Title (\376\377\0\103\0\150\0\141\0\160\0\164\0\145\0\162\0\240\0\62\0\56\0\240\0\124\0\150\0\145\0\40\0\154\0\141\0\156\0\147\0\165\0\141\0\147\0\145) + /Parent 542 0 R + /First 549 0 R + /Last 688 0 R + /Prev 547 0 R + /Next 715 0 R + /Count -130 + /A 17 0 R +>> endobj +549 0 obj +<< + /Title (\376\377\0\114\0\145\0\170\0\151\0\143\0\141\0\154\0\40\0\163\0\164\0\162\0\165\0\143\0\164\0\165\0\162\0\145) + /Parent 548 0 R + /First 550 0 R + /Last 555 0 R + /Next 556 0 R + /Count -6 + /A 19 0 R +>> endobj +550 0 obj +<< + /Title (\376\377\0\111\0\144\0\145\0\156\0\164\0\151\0\146\0\151\0\145\0\162\0\163) + /Parent 549 0 R + /Next 551 0 R + /A 21 0 R +>> endobj +551 0 obj +<< + /Title (\376\377\0\113\0\145\0\171\0\167\0\157\0\162\0\144\0\163) + /Parent 549 0 R + /Prev 550 0 R + /Next 552 0 R + /A 23 0 R +>> endobj +552 0 obj +<< + /Title (\376\377\0\117\0\160\0\145\0\162\0\141\0\164\0\157\0\162\0\163) + /Parent 549 0 R + /Prev 551 0 R + /Next 553 0 R + /A 25 0 R +>> endobj +553 0 obj +<< + /Title (\376\377\0\117\0\164\0\150\0\145\0\162\0\40\0\164\0\157\0\153\0\145\0\156\0\163) + /Parent 549 0 R + /Prev 552 0 R + /Next 554 0 R + /A 27 0 R +>> endobj +554 0 obj +<< + /Title (\376\377\0\114\0\151\0\164\0\145\0\162\0\141\0\154\0\163) + /Parent 549 0 R + /Prev 553 0 R + /Next 555 0 R + /A 29 0 R +>> endobj +555 0 obj +<< + /Title (\376\377\0\103\0\157\0\155\0\155\0\145\0\156\0\164\0\163) + /Parent 549 0 R + /Prev 554 0 R + /A 31 0 R +>> endobj +556 0 obj +<< + /Title (\376\377\0\126\0\141\0\154\0\165\0\145\0\163\0\40\0\141\0\156\0\144\0\40\0\104\0\141\0\164\0\141\0\40\0\164\0\171\0\160\0\145\0\163) + /Parent 548 0 R + /First 557 0 R + /Last 570 0 R + /Prev 549 0 R + /Next 571 0 R + /Count -14 + /A 33 0 R +>> endobj +557 0 obj +<< + /Title (\376\377\0\111\0\156\0\164\0\145\0\147\0\145\0\162) + /Parent 556 0 R + /Next 558 0 R + /A 35 0 R +>> endobj +558 0 obj +<< + /Title (\376\377\0\106\0\154\0\157\0\141\0\164) + /Parent 556 0 R + /Prev 557 0 R + /Next 559 0 R + /A 37 0 R +>> endobj +559 0 obj +<< + /Title (\376\377\0\123\0\164\0\162\0\151\0\156\0\147) + /Parent 556 0 R + /Prev 558 0 R + /Next 560 0 R + /A 39 0 R +>> endobj +560 0 obj +<< + /Title (\376\377\0\116\0\165\0\154\0\154) + /Parent 556 0 R + /Prev 559 0 R + /Next 561 0 R + /A 41 0 R +>> endobj +561 0 obj +<< + /Title (\376\377\0\102\0\157\0\157\0\154) + /Parent 556 0 R + /Prev 560 0 R + /Next 562 0 R + /A 43 0 R +>> endobj +562 0 obj +<< + /Title (\376\377\0\124\0\141\0\142\0\154\0\145) + /Parent 556 0 R + /Prev 561 0 R + /Next 563 0 R + /A 45 0 R +>> endobj +563 0 obj +<< + /Title (\376\377\0\101\0\162\0\162\0\141\0\171) + /Parent 556 0 R + /Prev 562 0 R + /Next 564 0 R + /A 47 0 R +>> endobj +564 0 obj +<< + /Title (\376\377\0\106\0\165\0\156\0\143\0\164\0\151\0\157\0\156) + /Parent 556 0 R + /Prev 563 0 R + /Next 565 0 R + /A 49 0 R +>> endobj +565 0 obj +<< + /Title (\376\377\0\103\0\154\0\141\0\163\0\163) + /Parent 556 0 R + /Prev 564 0 R + /Next 566 0 R + /A 51 0 R +>> endobj +566 0 obj +<< + /Title (\376\377\0\103\0\154\0\141\0\163\0\163\0\40\0\151\0\156\0\163\0\164\0\141\0\156\0\143\0\145) + /Parent 556 0 R + /Prev 565 0 R + /Next 567 0 R + /A 53 0 R +>> endobj +567 0 obj +<< + /Title (\376\377\0\107\0\145\0\156\0\145\0\162\0\141\0\164\0\157\0\162) + /Parent 556 0 R + /Prev 566 0 R + /Next 568 0 R + /A 55 0 R +>> endobj +568 0 obj +<< + /Title (\376\377\0\125\0\163\0\145\0\162\0\144\0\141\0\164\0\141) + /Parent 556 0 R + /Prev 567 0 R + /Next 569 0 R + /A 57 0 R +>> endobj +569 0 obj +<< + /Title (\376\377\0\124\0\150\0\162\0\145\0\141\0\144) + /Parent 556 0 R + /Prev 568 0 R + /Next 570 0 R + /A 59 0 R +>> endobj +570 0 obj +<< + /Title (\376\377\0\127\0\145\0\141\0\153\0\40\0\122\0\145\0\146\0\145\0\162\0\145\0\156\0\143\0\145\0\163) + /Parent 556 0 R + /Prev 569 0 R + /A 61 0 R +>> endobj +571 0 obj +<< + /Title (\376\377\0\105\0\170\0\145\0\143\0\165\0\164\0\151\0\157\0\156\0\40\0\103\0\157\0\156\0\164\0\145\0\170\0\164) + /Parent 548 0 R + /First 572 0 R + /Last 572 0 R + /Prev 556 0 R + /Next 573 0 R + /Count -1 + /A 63 0 R +>> endobj +572 0 obj +<< + /Title (\376\377\0\126\0\141\0\162\0\151\0\141\0\142\0\154\0\145\0\163) + /Parent 571 0 R + /A 65 0 R +>> endobj +573 0 obj +<< + /Title (\376\377\0\123\0\164\0\141\0\164\0\145\0\155\0\145\0\156\0\164\0\163) + /Parent 548 0 R + /First 574 0 R + /Last 602 0 R + /Prev 571 0 R + /Next 603 0 R + /Count -22 + /A 67 0 R +>> endobj +574 0 obj +<< + /Title (\376\377\0\102\0\154\0\157\0\143\0\153) + /Parent 573 0 R + /Next 575 0 R + /A 69 0 R +>> endobj +575 0 obj +<< + /Title (\376\377\0\103\0\157\0\156\0\164\0\162\0\157\0\154\0\40\0\106\0\154\0\157\0\167\0\40\0\123\0\164\0\141\0\164\0\145\0\155\0\145\0\156\0\164\0\163) + /Parent 573 0 R + /First 577 0 R + /Last 585 0 R + /Prev 574 0 R + /Next 586 0 R + /Count -5 + /A 71 0 R +>> endobj +577 0 obj +<< + /Title (\376\377\0\164\0\162\0\165\0\145\0\40\0\141\0\156\0\144\0\40\0\146\0\141\0\154\0\163\0\145) + /Parent 575 0 R + /Next 579 0 R + /A 576 0 R +>> endobj +579 0 obj +<< + /Title (\376\377\0\151\0\146\0\57\0\145\0\154\0\163\0\145) + /Parent 575 0 R + /Prev 577 0 R + /Next 581 0 R + /A 578 0 R +>> endobj +581 0 obj +<< + /Title (\376\377\0\167\0\150\0\151\0\154\0\145) + /Parent 575 0 R + /Prev 579 0 R + /Next 583 0 R + /A 580 0 R +>> endobj +583 0 obj +<< + /Title (\376\377\0\144\0\157\0\57\0\167\0\150\0\151\0\154\0\145) + /Parent 575 0 R + /Prev 581 0 R + /Next 585 0 R + /A 582 0 R +>> endobj +585 0 obj +<< + /Title (\376\377\0\163\0\167\0\151\0\164\0\143\0\150) + /Parent 575 0 R + /Prev 583 0 R + /A 584 0 R +>> endobj +586 0 obj +<< + /Title (\376\377\0\114\0\157\0\157\0\160\0\163) + /Parent 573 0 R + /First 588 0 R + /Last 590 0 R + /Prev 575 0 R + /Next 591 0 R + /Count -2 + /A 73 0 R +>> endobj +588 0 obj +<< + /Title (\376\377\0\146\0\157\0\162) + /Parent 586 0 R + /Next 590 0 R + /A 587 0 R +>> endobj +590 0 obj +<< + /Title (\376\377\0\146\0\157\0\162\0\145\0\141\0\143\0\150) + /Parent 586 0 R + /Prev 588 0 R + /A 589 0 R +>> endobj +591 0 obj +<< + /Title (\376\377\0\142\0\162\0\145\0\141\0\153) + /Parent 573 0 R + /Prev 586 0 R + /Next 592 0 R + /A 75 0 R +>> endobj +592 0 obj +<< + /Title (\376\377\0\143\0\157\0\156\0\164\0\151\0\156\0\165\0\145) + /Parent 573 0 R + /Prev 591 0 R + /Next 593 0 R + /A 77 0 R +>> endobj +593 0 obj +<< + /Title (\376\377\0\162\0\145\0\164\0\165\0\162\0\156) + /Parent 573 0 R + /Prev 592 0 R + /Next 594 0 R + /A 79 0 R +>> endobj +594 0 obj +<< + /Title (\376\377\0\171\0\151\0\145\0\154\0\144) + /Parent 573 0 R + /Prev 593 0 R + /Next 595 0 R + /A 81 0 R +>> endobj +595 0 obj +<< + /Title (\376\377\0\114\0\157\0\143\0\141\0\154\0\40\0\166\0\141\0\162\0\151\0\141\0\142\0\154\0\145\0\163\0\40\0\144\0\145\0\143\0\154\0\141\0\162\0\141\0\164\0\151\0\157\0\156) + /Parent 573 0 R + /Prev 594 0 R + /Next 596 0 R + /A 83 0 R +>> endobj +596 0 obj +<< + /Title (\376\377\0\106\0\165\0\156\0\143\0\164\0\151\0\157\0\156\0\40\0\144\0\145\0\143\0\154\0\141\0\162\0\141\0\164\0\151\0\157\0\156) + /Parent 573 0 R + /Prev 595 0 R + /Next 597 0 R + /A 85 0 R +>> endobj +597 0 obj +<< + /Title (\376\377\0\103\0\154\0\141\0\163\0\163\0\40\0\144\0\145\0\143\0\154\0\141\0\162\0\141\0\164\0\151\0\157\0\156) + /Parent 573 0 R + /Prev 596 0 R + /Next 598 0 R + /A 87 0 R +>> endobj +598 0 obj +<< + /Title (\376\377\0\164\0\162\0\171\0\57\0\143\0\141\0\164\0\143\0\150) + /Parent 573 0 R + /Prev 597 0 R + /Next 599 0 R + /A 89 0 R +>> endobj +599 0 obj +<< + /Title (\376\377\0\164\0\150\0\162\0\157\0\167) + /Parent 573 0 R + /Prev 598 0 R + /Next 600 0 R + /A 91 0 R +>> endobj +600 0 obj +<< + /Title (\376\377\0\143\0\157\0\156\0\163\0\164) + /Parent 573 0 R + /Prev 599 0 R + /Next 601 0 R + /A 93 0 R +>> endobj +601 0 obj +<< + /Title (\376\377\0\145\0\156\0\165\0\155) + /Parent 573 0 R + /Prev 600 0 R + /Next 602 0 R + /A 95 0 R +>> endobj +602 0 obj +<< + /Title (\376\377\0\145\0\170\0\160\0\162\0\145\0\163\0\163\0\151\0\157\0\156\0\40\0\163\0\164\0\141\0\164\0\145\0\155\0\145\0\156\0\164) + /Parent 573 0 R + /Prev 601 0 R + /A 97 0 R +>> endobj +603 0 obj +<< + /Title (\376\377\0\105\0\170\0\160\0\162\0\145\0\163\0\163\0\151\0\157\0\156\0\163) + /Parent 548 0 R + /First 604 0 R + /Last 632 0 R + /Prev 573 0 R + /Next 633 0 R + /Count -17 + /A 99 0 R +>> endobj +604 0 obj +<< + /Title (\376\377\0\101\0\163\0\163\0\151\0\147\0\156\0\155\0\145\0\156\0\164\0\50\0\75\0\51\0\40\0\46\0\40\0\156\0\145\0\167\0\40\0\163\0\154\0\157\0\164\0\50\0\74\0\55\0\51) + /Parent 603 0 R + /Next 605 0 R + /A 101 0 R +>> endobj +605 0 obj +<< + /Title (\376\377\0\117\0\160\0\145\0\162\0\141\0\164\0\157\0\162\0\163) + /Parent 603 0 R + /First 607 0 R + /Last 627 0 R + /Prev 604 0 R + /Next 628 0 R + /Count -11 + /A 103 0 R +>> endobj +607 0 obj +<< + /Title (\376\377\0\77\0\72\0\40\0\117\0\160\0\145\0\162\0\141\0\164\0\157\0\162) + /Parent 605 0 R + /Next 609 0 R + /A 606 0 R +>> endobj +609 0 obj +<< + /Title (\376\377\0\101\0\162\0\151\0\164\0\150\0\155\0\145\0\164\0\151\0\143) + /Parent 605 0 R + /Prev 607 0 R + /Next 611 0 R + /A 608 0 R +>> endobj +611 0 obj +<< + /Title (\376\377\0\122\0\145\0\154\0\141\0\164\0\151\0\157\0\156\0\141\0\154) + /Parent 605 0 R + /Prev 609 0 R + /Next 613 0 R + /A 610 0 R +>> endobj +613 0 obj +<< + /Title (\376\377\0\63\0\40\0\167\0\141\0\171\0\163\0\40\0\143\0\157\0\155\0\160\0\141\0\162\0\145) + /Parent 605 0 R + /Prev 611 0 R + /Next 615 0 R + /A 612 0 R +>> endobj +615 0 obj +<< + /Title (\376\377\0\114\0\157\0\147\0\151\0\143\0\141\0\154) + /Parent 605 0 R + /Prev 613 0 R + /Next 617 0 R + /A 614 0 R +>> endobj +617 0 obj +<< + /Title (\376\377\0\151\0\156\0\40\0\157\0\160\0\145\0\162\0\141\0\164\0\157\0\162) + /Parent 605 0 R + /Prev 615 0 R + /Next 619 0 R + /A 616 0 R +>> endobj +619 0 obj +<< + /Title (\376\377\0\151\0\156\0\163\0\164\0\141\0\156\0\143\0\145\0\157\0\146\0\40\0\157\0\160\0\145\0\162\0\141\0\164\0\157\0\162) + /Parent 605 0 R + /Prev 617 0 R + /Next 621 0 R + /A 618 0 R +>> endobj +621 0 obj +<< + /Title (\376\377\0\164\0\171\0\160\0\145\0\157\0\146\0\40\0\157\0\160\0\145\0\162\0\141\0\164\0\157\0\162) + /Parent 605 0 R + /Prev 619 0 R + /Next 623 0 R + /A 620 0 R +>> endobj +623 0 obj +<< + /Title (\376\377\0\143\0\157\0\155\0\155\0\141\0\40\0\157\0\160\0\145\0\162\0\141\0\164\0\157\0\162) + /Parent 605 0 R + /Prev 621 0 R + /Next 625 0 R + /A 622 0 R +>> endobj +625 0 obj +<< + /Title (\376\377\0\102\0\151\0\164\0\167\0\151\0\163\0\145\0\40\0\117\0\160\0\145\0\162\0\141\0\164\0\157\0\162\0\163) + /Parent 605 0 R + /Prev 623 0 R + /Next 627 0 R + /A 624 0 R +>> endobj +627 0 obj +<< + /Title (\376\377\0\117\0\160\0\145\0\162\0\141\0\164\0\157\0\162\0\163\0\40\0\160\0\162\0\145\0\143\0\145\0\144\0\145\0\156\0\143\0\145) + /Parent 605 0 R + /Prev 625 0 R + /A 626 0 R +>> endobj +628 0 obj +<< + /Title (\376\377\0\124\0\141\0\142\0\154\0\145\0\40\0\143\0\157\0\156\0\163\0\164\0\162\0\165\0\143\0\164\0\157\0\162) + /Parent 603 0 R + /First 630 0 R + /Last 630 0 R + /Prev 605 0 R + /Next 631 0 R + /Count -1 + /A 105 0 R +>> endobj +630 0 obj +<< + /Title (\376\377\0\124\0\141\0\142\0\154\0\145\0\40\0\167\0\151\0\164\0\150\0\40\0\112\0\123\0\117\0\116\0\40\0\163\0\171\0\156\0\164\0\141\0\170) + /Parent 628 0 R + /A 629 0 R +>> endobj +631 0 obj +<< + /Title (\376\377\0\143\0\154\0\157\0\156\0\145) + /Parent 603 0 R + /Prev 628 0 R + /Next 632 0 R + /A 107 0 R +>> endobj +632 0 obj +<< + /Title (\376\377\0\101\0\162\0\162\0\141\0\171\0\40\0\143\0\157\0\156\0\163\0\164\0\162\0\165\0\143\0\164\0\157\0\162) + /Parent 603 0 R + /Prev 631 0 R + /A 109 0 R +>> endobj +633 0 obj +<< + /Title (\376\377\0\124\0\141\0\142\0\154\0\145\0\163) + /Parent 548 0 R + /First 634 0 R + /Last 636 0 R + /Prev 603 0 R + /Next 637 0 R + /Count -3 + /A 111 0 R +>> endobj +634 0 obj +<< + /Title (\376\377\0\103\0\157\0\156\0\163\0\164\0\162\0\165\0\143\0\164\0\151\0\157\0\156) + /Parent 633 0 R + /Next 635 0 R + /A 113 0 R +>> endobj +635 0 obj +<< + /Title (\376\377\0\123\0\154\0\157\0\164\0\40\0\143\0\162\0\145\0\141\0\164\0\151\0\157\0\156) + /Parent 633 0 R + /Prev 634 0 R + /Next 636 0 R + /A 115 0 R +>> endobj +636 0 obj +<< + /Title (\376\377\0\123\0\154\0\157\0\164\0\40\0\144\0\145\0\154\0\145\0\164\0\151\0\157\0\156) + /Parent 633 0 R + /Prev 635 0 R + /A 117 0 R +>> endobj +637 0 obj +<< + /Title (\376\377\0\101\0\162\0\162\0\141\0\171\0\163) + /Parent 548 0 R + /Prev 633 0 R + /Next 638 0 R + /A 119 0 R +>> endobj +638 0 obj +<< + /Title (\376\377\0\106\0\165\0\156\0\143\0\164\0\151\0\157\0\156\0\163) + /Parent 548 0 R + /First 639 0 R + /Last 648 0 R + /Prev 637 0 R + /Next 649 0 R + /Count -8 + /A 124 0 R +>> endobj +639 0 obj +<< + /Title (\376\377\0\106\0\165\0\156\0\143\0\164\0\151\0\157\0\156\0\40\0\144\0\145\0\143\0\154\0\141\0\162\0\141\0\164\0\151\0\157\0\156) + /Parent 638 0 R + /First 641 0 R + /Last 643 0 R + /Next 644 0 R + /Count -2 + /A 126 0 R +>> endobj +641 0 obj +<< + /Title (\376\377\0\104\0\145\0\146\0\141\0\165\0\154\0\164\0\40\0\120\0\141\0\162\0\141\0\155\0\141\0\164\0\145\0\162\0\163) + /Parent 639 0 R + /Next 643 0 R + /A 640 0 R +>> endobj +643 0 obj +<< + /Title (\376\377\0\106\0\165\0\156\0\143\0\164\0\151\0\157\0\156\0\40\0\167\0\151\0\164\0\150\0\40\0\166\0\141\0\162\0\151\0\141\0\142\0\154\0\145\0\40\0\156\0\165\0\155\0\142\0\145\0\162\0\40\0\157\0\146\0\40\0\160\0\141\0\162\0\141\0\155\0\141\0\164\0\145\0\162\0\163) + /Parent 639 0 R + /Prev 641 0 R + /A 642 0 R +>> endobj +644 0 obj +<< + /Title (\376\377\0\106\0\165\0\156\0\143\0\164\0\151\0\157\0\156\0\40\0\143\0\141\0\154\0\154\0\163) + /Parent 638 0 R + /Prev 639 0 R + /Next 645 0 R + /A 128 0 R +>> endobj +645 0 obj +<< + /Title (\376\377\0\102\0\151\0\156\0\144\0\151\0\156\0\147\0\40\0\141\0\156\0\40\0\145\0\156\0\166\0\151\0\162\0\157\0\156\0\155\0\145\0\156\0\164\0\40\0\164\0\157\0\40\0\141\0\40\0\146\0\165\0\156\0\143\0\164\0\151\0\157\0\156) + /Parent 638 0 R + /Prev 644 0 R + /Next 646 0 R + /A 130 0 R +>> endobj +646 0 obj +<< + /Title (\376\377\0\114\0\141\0\155\0\142\0\144\0\141\0\40\0\145\0\170\0\160\0\162\0\145\0\163\0\163\0\151\0\157\0\156\0\163) + /Parent 638 0 R + /Prev 645 0 R + /Next 647 0 R + /A 132 0 R +>> endobj +647 0 obj +<< + /Title (\376\377\0\106\0\162\0\145\0\145\0\40\0\166\0\141\0\162\0\151\0\141\0\142\0\154\0\145\0\163) + /Parent 638 0 R + /Prev 646 0 R + /Next 648 0 R + /A 134 0 R +>> endobj +648 0 obj +<< + /Title (\376\377\0\124\0\141\0\151\0\154\0\40\0\162\0\145\0\143\0\165\0\162\0\163\0\151\0\157\0\156) + /Parent 638 0 R + /Prev 647 0 R + /A 136 0 R +>> endobj +649 0 obj +<< + /Title (\376\377\0\103\0\154\0\141\0\163\0\163\0\145\0\163) + /Parent 548 0 R + /First 650 0 R + /Last 657 0 R + /Prev 638 0 R + /Next 658 0 R + /Count -6 + /A 138 0 R +>> endobj +650 0 obj +<< + /Title (\376\377\0\103\0\154\0\141\0\163\0\163\0\40\0\144\0\145\0\143\0\154\0\141\0\162\0\141\0\164\0\151\0\157\0\156) + /Parent 649 0 R + /First 652 0 R + /Last 654 0 R + /Next 655 0 R + /Count -2 + /A 140 0 R +>> endobj +652 0 obj +<< + /Title (\376\377\0\123\0\164\0\141\0\164\0\151\0\143\0\40\0\166\0\141\0\162\0\151\0\141\0\142\0\154\0\145\0\163) + /Parent 650 0 R + /Next 654 0 R + /A 651 0 R +>> endobj +654 0 obj +<< + /Title (\376\377\0\103\0\154\0\141\0\163\0\163\0\40\0\141\0\164\0\164\0\162\0\151\0\142\0\165\0\164\0\145\0\163) + /Parent 650 0 R + /Prev 652 0 R + /A 653 0 R +>> endobj +655 0 obj +<< + /Title (\376\377\0\103\0\154\0\141\0\163\0\163\0\40\0\151\0\156\0\163\0\164\0\141\0\156\0\143\0\145\0\163) + /Parent 649 0 R + /Prev 650 0 R + /Next 656 0 R + /A 142 0 R +>> endobj +656 0 obj +<< + /Title (\376\377\0\111\0\156\0\150\0\145\0\162\0\151\0\164\0\141\0\156\0\143\0\145) + /Parent 649 0 R + /Prev 655 0 R + /Next 657 0 R + /A 144 0 R +>> endobj +657 0 obj +<< + /Title (\376\377\0\115\0\145\0\164\0\141\0\155\0\145\0\164\0\150\0\157\0\144\0\163) + /Parent 649 0 R + /Prev 656 0 R + /A 146 0 R +>> endobj +658 0 obj +<< + /Title (\376\377\0\107\0\145\0\156\0\145\0\162\0\141\0\164\0\157\0\162\0\163) + /Parent 548 0 R + /Prev 649 0 R + /Next 659 0 R + /A 148 0 R +>> endobj +659 0 obj +<< + /Title (\376\377\0\103\0\157\0\156\0\163\0\164\0\141\0\156\0\164\0\163\0\40\0\46\0\40\0\105\0\156\0\165\0\155\0\145\0\162\0\141\0\164\0\151\0\157\0\156\0\163) + /Parent 548 0 R + /First 660 0 R + /Last 662 0 R + /Prev 658 0 R + /Next 663 0 R + /Count -3 + /A 150 0 R +>> endobj +660 0 obj +<< + /Title (\376\377\0\103\0\157\0\156\0\163\0\164\0\141\0\156\0\164\0\163) + /Parent 659 0 R + /Next 661 0 R + /A 152 0 R +>> endobj +661 0 obj +<< + /Title (\376\377\0\105\0\156\0\165\0\155\0\145\0\162\0\141\0\164\0\151\0\157\0\156\0\163) + /Parent 659 0 R + /Prev 660 0 R + /Next 662 0 R + /A 154 0 R +>> endobj +662 0 obj +<< + /Title (\376\377\0\111\0\155\0\160\0\154\0\145\0\155\0\145\0\156\0\164\0\141\0\164\0\151\0\157\0\156\0\40\0\156\0\157\0\164\0\145\0\163) + /Parent 659 0 R + /Prev 661 0 R + /A 156 0 R +>> endobj +663 0 obj +<< + /Title (\376\377\0\124\0\150\0\162\0\145\0\141\0\144\0\163) + /Parent 548 0 R + /First 664 0 R + /Last 664 0 R + /Prev 659 0 R + /Next 665 0 R + /Count -1 + /A 158 0 R +>> endobj +664 0 obj +<< + /Title (\376\377\0\125\0\163\0\151\0\156\0\147\0\40\0\164\0\150\0\162\0\145\0\141\0\144\0\163) + /Parent 663 0 R + /A 160 0 R +>> endobj +665 0 obj +<< + /Title (\376\377\0\127\0\145\0\141\0\153\0\40\0\122\0\145\0\146\0\145\0\162\0\145\0\156\0\143\0\145\0\163) + /Parent 548 0 R + /First 667 0 R + /Last 667 0 R + /Prev 663 0 R + /Next 668 0 R + /Count -1 + /A 162 0 R +>> endobj +667 0 obj +<< + /Title (\376\377\0\110\0\141\0\156\0\144\0\154\0\151\0\156\0\147\0\40\0\167\0\145\0\141\0\153\0\40\0\162\0\145\0\146\0\145\0\162\0\145\0\156\0\143\0\145\0\163\0\40\0\145\0\170\0\160\0\154\0\151\0\143\0\151\0\164\0\154\0\171) + /Parent 665 0 R + /A 666 0 R +>> endobj +668 0 obj +<< + /Title (\376\377\0\104\0\145\0\154\0\145\0\147\0\141\0\164\0\151\0\157\0\156) + /Parent 548 0 R + /Prev 665 0 R + /Next 669 0 R + /A 164 0 R +>> endobj +669 0 obj +<< + /Title (\376\377\0\115\0\145\0\164\0\141\0\155\0\145\0\164\0\150\0\157\0\144\0\163) + /Parent 548 0 R + /First 670 0 R + /Last 687 0 R + /Prev 668 0 R + /Next 688 0 R + /Count -18 + /A 166 0 R +>> endobj +670 0 obj +<< + /Title (\376\377\0\137\0\163\0\145\0\164) + /Parent 669 0 R + /Next 671 0 R + /A 168 0 R +>> endobj +671 0 obj +<< + /Title (\376\377\0\137\0\147\0\145\0\164) + /Parent 669 0 R + /Prev 670 0 R + /Next 672 0 R + /A 170 0 R +>> endobj +672 0 obj +<< + /Title (\376\377\0\137\0\156\0\145\0\167\0\163\0\154\0\157\0\164) + /Parent 669 0 R + /Prev 671 0 R + /Next 673 0 R + /A 172 0 R +>> endobj +673 0 obj +<< + /Title (\376\377\0\137\0\144\0\145\0\154\0\163\0\154\0\157\0\164) + /Parent 669 0 R + /Prev 672 0 R + /Next 674 0 R + /A 174 0 R +>> endobj +674 0 obj +<< + /Title (\376\377\0\137\0\141\0\144\0\144) + /Parent 669 0 R + /Prev 673 0 R + /Next 675 0 R + /A 176 0 R +>> endobj +675 0 obj +<< + /Title (\376\377\0\137\0\163\0\165\0\142) + /Parent 669 0 R + /Prev 674 0 R + /Next 676 0 R + /A 178 0 R +>> endobj +676 0 obj +<< + /Title (\376\377\0\137\0\155\0\165\0\154) + /Parent 669 0 R + /Prev 675 0 R + /Next 677 0 R + /A 180 0 R +>> endobj +677 0 obj +<< + /Title (\376\377\0\137\0\144\0\151\0\166) + /Parent 669 0 R + /Prev 676 0 R + /Next 678 0 R + /A 182 0 R +>> endobj +678 0 obj +<< + /Title (\376\377\0\137\0\155\0\157\0\144\0\165\0\154\0\157) + /Parent 669 0 R + /Prev 677 0 R + /Next 679 0 R + /A 184 0 R +>> endobj +679 0 obj +<< + /Title (\376\377\0\137\0\165\0\156\0\155) + /Parent 669 0 R + /Prev 678 0 R + /Next 680 0 R + /A 186 0 R +>> endobj +680 0 obj +<< + /Title (\376\377\0\137\0\164\0\171\0\160\0\145\0\157\0\146) + /Parent 669 0 R + /Prev 679 0 R + /Next 681 0 R + /A 188 0 R +>> endobj +681 0 obj +<< + /Title (\376\377\0\137\0\143\0\155\0\160) + /Parent 669 0 R + /Prev 680 0 R + /Next 682 0 R + /A 190 0 R +>> endobj +682 0 obj +<< + /Title (\376\377\0\137\0\143\0\141\0\154\0\154) + /Parent 669 0 R + /Prev 681 0 R + /Next 683 0 R + /A 192 0 R +>> endobj +683 0 obj +<< + /Title (\376\377\0\137\0\143\0\154\0\157\0\156\0\145\0\144) + /Parent 669 0 R + /Prev 682 0 R + /Next 684 0 R + /A 194 0 R +>> endobj +684 0 obj +<< + /Title (\376\377\0\137\0\156\0\145\0\170\0\164\0\151) + /Parent 669 0 R + /Prev 683 0 R + /Next 685 0 R + /A 196 0 R +>> endobj +685 0 obj +<< + /Title (\376\377\0\137\0\164\0\157\0\163\0\164\0\162\0\151\0\156\0\147) + /Parent 669 0 R + /Prev 684 0 R + /Next 686 0 R + /A 198 0 R +>> endobj +686 0 obj +<< + /Title (\376\377\0\137\0\151\0\156\0\150\0\145\0\162\0\151\0\164\0\145\0\144) + /Parent 669 0 R + /Prev 685 0 R + /Next 687 0 R + /A 200 0 R +>> endobj +687 0 obj +<< + /Title (\376\377\0\137\0\156\0\145\0\167\0\155\0\145\0\155\0\142\0\145\0\162) + /Parent 669 0 R + /Prev 686 0 R + /A 202 0 R +>> endobj +688 0 obj +<< + /Title (\376\377\0\102\0\165\0\151\0\154\0\164\0\55\0\151\0\156\0\40\0\146\0\165\0\156\0\143\0\164\0\151\0\157\0\156\0\163) + /Parent 548 0 R + /First 689 0 R + /Last 690 0 R + /Prev 669 0 R + /Count -14 + /A 204 0 R +>> endobj +689 0 obj +<< + /Title (\376\377\0\107\0\154\0\157\0\142\0\141\0\154\0\40\0\163\0\171\0\155\0\142\0\157\0\154\0\163) + /Parent 688 0 R + /Next 690 0 R + /A 206 0 R +>> endobj +690 0 obj +<< + /Title (\376\377\0\104\0\145\0\146\0\141\0\165\0\154\0\164\0\40\0\144\0\145\0\154\0\145\0\147\0\141\0\164\0\145\0\163) + /Parent 688 0 R + /First 692 0 R + /Last 714 0 R + /Prev 689 0 R + /Count -12 + /A 208 0 R +>> endobj +692 0 obj +<< + /Title (\376\377\0\111\0\156\0\164\0\145\0\147\0\145\0\162) + /Parent 690 0 R + /Next 694 0 R + /A 691 0 R +>> endobj +694 0 obj +<< + /Title (\376\377\0\106\0\154\0\157\0\141\0\164) + /Parent 690 0 R + /Prev 692 0 R + /Next 696 0 R + /A 693 0 R +>> endobj +696 0 obj +<< + /Title (\376\377\0\102\0\157\0\157\0\154) + /Parent 690 0 R + /Prev 694 0 R + /Next 698 0 R + /A 695 0 R +>> endobj +698 0 obj +<< + /Title (\376\377\0\123\0\164\0\162\0\151\0\156\0\147) + /Parent 690 0 R + /Prev 696 0 R + /Next 700 0 R + /A 697 0 R +>> endobj +700 0 obj +<< + /Title (\376\377\0\124\0\141\0\142\0\154\0\145) + /Parent 690 0 R + /Prev 698 0 R + /Next 702 0 R + /A 699 0 R +>> endobj +702 0 obj +<< + /Title (\376\377\0\101\0\162\0\162\0\141\0\171) + /Parent 690 0 R + /Prev 700 0 R + /Next 704 0 R + /A 701 0 R +>> endobj +704 0 obj +<< + /Title (\376\377\0\106\0\165\0\156\0\143\0\164\0\151\0\157\0\156) + /Parent 690 0 R + /Prev 702 0 R + /Next 706 0 R + /A 703 0 R +>> endobj +706 0 obj +<< + /Title (\376\377\0\103\0\154\0\141\0\163\0\163) + /Parent 690 0 R + /Prev 704 0 R + /Next 708 0 R + /A 705 0 R +>> endobj +708 0 obj +<< + /Title (\376\377\0\103\0\154\0\141\0\163\0\163\0\40\0\111\0\156\0\163\0\164\0\141\0\156\0\143\0\145) + /Parent 690 0 R + /Prev 706 0 R + /Next 710 0 R + /A 707 0 R +>> endobj +710 0 obj +<< + /Title (\376\377\0\107\0\145\0\156\0\145\0\162\0\141\0\164\0\157\0\162) + /Parent 690 0 R + /Prev 708 0 R + /Next 712 0 R + /A 709 0 R +>> endobj +712 0 obj +<< + /Title (\376\377\0\124\0\150\0\162\0\145\0\141\0\144) + /Parent 690 0 R + /Prev 710 0 R + /Next 714 0 R + /A 711 0 R +>> endobj +714 0 obj +<< + /Title (\376\377\0\127\0\145\0\141\0\153\0\40\0\122\0\145\0\146\0\145\0\162\0\145\0\156\0\143\0\145) + /Parent 690 0 R + /Prev 712 0 R + /A 713 0 R +>> endobj +715 0 obj +<< + /Title (\376\377\0\103\0\150\0\141\0\160\0\164\0\145\0\162\0\240\0\63\0\56\0\240\0\105\0\155\0\142\0\145\0\144\0\144\0\151\0\156\0\147\0\40\0\123\0\161\0\165\0\151\0\162\0\162\0\145\0\154) + /Parent 542 0 R + /First 716 0 R + /Last 734 0 R + /Prev 548 0 R + /Next 735 0 R + /Count -19 + /A 210 0 R +>> endobj +716 0 obj +<< + /Title (\376\377\0\115\0\145\0\155\0\157\0\162\0\171\0\40\0\155\0\141\0\156\0\141\0\147\0\145\0\155\0\145\0\156\0\164) + /Parent 715 0 R + /Next 717 0 R + /A 212 0 R +>> endobj +717 0 obj +<< + /Title (\376\377\0\125\0\156\0\151\0\143\0\157\0\144\0\145) + /Parent 715 0 R + /Prev 716 0 R + /Next 718 0 R + /A 214 0 R +>> endobj +718 0 obj +<< + /Title (\376\377\0\123\0\161\0\165\0\151\0\162\0\162\0\145\0\154\0\40\0\157\0\156\0\40\0\66\0\64\0\40\0\142\0\151\0\164\0\163\0\40\0\141\0\162\0\143\0\150\0\151\0\164\0\145\0\143\0\164\0\165\0\162\0\145\0\163) + /Parent 715 0 R + /Prev 717 0 R + /Next 719 0 R + /A 216 0 R +>> endobj +719 0 obj +<< + /Title (\376\377\0\125\0\163\0\145\0\162\0\144\0\141\0\164\0\141\0\40\0\141\0\154\0\151\0\147\0\156\0\155\0\145\0\156\0\164) + /Parent 715 0 R + /Prev 718 0 R + /Next 720 0 R + /A 218 0 R +>> endobj +720 0 obj +<< + /Title (\376\377\0\123\0\164\0\141\0\156\0\144\0\55\0\141\0\154\0\157\0\156\0\145\0\40\0\126\0\115\0\40\0\167\0\151\0\164\0\150\0\157\0\165\0\164\0\40\0\143\0\157\0\155\0\160\0\151\0\154\0\145\0\162) + /Parent 715 0 R + /Prev 719 0 R + /Next 721 0 R + /A 220 0 R +>> endobj +721 0 obj +<< + /Title (\376\377\0\105\0\162\0\162\0\157\0\162\0\40\0\143\0\157\0\156\0\166\0\145\0\156\0\164\0\151\0\157\0\156\0\163) + /Parent 715 0 R + /Prev 720 0 R + /Next 722 0 R + /A 222 0 R +>> endobj +722 0 obj +<< + /Title (\376\377\0\111\0\156\0\151\0\164\0\151\0\141\0\154\0\151\0\172\0\151\0\156\0\147\0\40\0\123\0\161\0\165\0\151\0\162\0\162\0\145\0\154) + /Parent 715 0 R + /Prev 721 0 R + /Next 723 0 R + /A 224 0 R +>> endobj +723 0 obj +<< + /Title (\376\377\0\124\0\150\0\145\0\40\0\123\0\164\0\141\0\143\0\153) + /Parent 715 0 R + /First 724 0 R + /Last 725 0 R + /Prev 722 0 R + /Next 726 0 R + /Count -2 + /A 226 0 R +>> endobj +724 0 obj +<< + /Title (\376\377\0\123\0\164\0\141\0\143\0\153\0\40\0\151\0\156\0\144\0\145\0\170\0\145\0\163) + /Parent 723 0 R + /Next 725 0 R + /A 228 0 R +>> endobj +725 0 obj +<< + /Title (\376\377\0\123\0\164\0\141\0\143\0\153\0\40\0\155\0\141\0\156\0\151\0\160\0\165\0\154\0\141\0\164\0\151\0\157\0\156) + /Parent 723 0 R + /Prev 724 0 R + /A 230 0 R +>> endobj +726 0 obj +<< + /Title (\376\377\0\122\0\165\0\156\0\164\0\151\0\155\0\145\0\40\0\145\0\162\0\162\0\157\0\162\0\40\0\150\0\141\0\156\0\144\0\154\0\151\0\156\0\147) + /Parent 715 0 R + /Prev 723 0 R + /Next 727 0 R + /A 232 0 R +>> endobj +727 0 obj +<< + /Title (\376\377\0\103\0\157\0\155\0\160\0\151\0\154\0\151\0\156\0\147\0\40\0\141\0\40\0\163\0\143\0\162\0\151\0\160\0\164) + /Parent 715 0 R + /Prev 726 0 R + /Next 728 0 R + /A 234 0 R +>> endobj +728 0 obj +<< + /Title (\376\377\0\103\0\141\0\154\0\154\0\151\0\156\0\147\0\40\0\141\0\40\0\146\0\165\0\156\0\143\0\164\0\151\0\157\0\156) + /Parent 715 0 R + /Prev 727 0 R + /Next 729 0 R + /A 236 0 R +>> endobj +729 0 obj +<< + /Title (\376\377\0\103\0\162\0\145\0\141\0\164\0\145\0\40\0\141\0\40\0\103\0\40\0\146\0\165\0\156\0\143\0\164\0\151\0\157\0\156) + /Parent 715 0 R + /Prev 728 0 R + /Next 730 0 R + /A 238 0 R +>> endobj +730 0 obj +<< + /Title (\376\377\0\124\0\141\0\142\0\154\0\145\0\163\0\40\0\141\0\156\0\144\0\40\0\141\0\162\0\162\0\141\0\171\0\163\0\40\0\155\0\141\0\156\0\151\0\160\0\165\0\154\0\141\0\164\0\151\0\157\0\156) + /Parent 715 0 R + /Prev 729 0 R + /Next 731 0 R + /A 243 0 R +>> endobj +731 0 obj +<< + /Title (\376\377\0\125\0\163\0\145\0\162\0\144\0\141\0\164\0\141\0\40\0\141\0\156\0\144\0\40\0\125\0\163\0\145\0\162\0\120\0\157\0\151\0\156\0\164\0\145\0\162\0\163) + /Parent 715 0 R + /Prev 730 0 R + /Next 732 0 R + /A 245 0 R +>> endobj +732 0 obj +<< + /Title (\376\377\0\124\0\150\0\145\0\40\0\162\0\145\0\147\0\151\0\163\0\164\0\162\0\171\0\40\0\164\0\141\0\142\0\154\0\145) + /Parent 715 0 R + /Prev 731 0 R + /Next 733 0 R + /A 247 0 R +>> endobj +733 0 obj +<< + /Title (\376\377\0\115\0\141\0\156\0\164\0\141\0\151\0\156\0\151\0\156\0\147\0\40\0\163\0\164\0\162\0\157\0\156\0\147\0\40\0\162\0\145\0\146\0\145\0\162\0\145\0\156\0\143\0\145\0\163\0\40\0\164\0\157\0\40\0\123\0\161\0\165\0\151\0\162\0\162\0\145\0\154\0\40\0\166\0\141\0\154\0\165\0\145\0\163\0\40\0\146\0\162\0\157\0\155\0\40\0\164\0\150\0\145\0\40\0\103\0\40\0\101\0\120\0\111) + /Parent 715 0 R + /Prev 732 0 R + /Next 734 0 R + /A 249 0 R +>> endobj +734 0 obj +<< + /Title (\376\377\0\104\0\145\0\142\0\165\0\147\0\40\0\111\0\156\0\164\0\145\0\162\0\146\0\141\0\143\0\145) + /Parent 715 0 R + /Prev 733 0 R + /A 251 0 R +>> endobj +735 0 obj +<< + /Title (\376\377\0\103\0\150\0\141\0\160\0\164\0\145\0\162\0\240\0\64\0\56\0\240\0\101\0\120\0\111\0\40\0\122\0\145\0\146\0\145\0\162\0\145\0\156\0\143\0\145) + /Parent 542 0 R + /First 736 0 R + /Last 745 0 R + /Prev 715 0 R + /Next 746 0 R + /Count -10 + /A 253 0 R +>> endobj +736 0 obj +<< + /Title (\376\377\0\126\0\151\0\162\0\164\0\165\0\141\0\154\0\40\0\115\0\141\0\143\0\150\0\151\0\156\0\145) + /Parent 735 0 R + /Next 737 0 R + /A 255 0 R +>> endobj +737 0 obj +<< + /Title (\376\377\0\103\0\157\0\155\0\160\0\151\0\154\0\145\0\162) + /Parent 735 0 R + /Prev 736 0 R + /Next 738 0 R + /A 257 0 R +>> endobj +738 0 obj +<< + /Title (\376\377\0\123\0\164\0\141\0\143\0\153\0\40\0\117\0\160\0\145\0\162\0\141\0\164\0\151\0\157\0\156\0\163) + /Parent 735 0 R + /Prev 737 0 R + /Next 739 0 R + /A 259 0 R +>> endobj +739 0 obj +<< + /Title (\376\377\0\117\0\142\0\152\0\145\0\143\0\164\0\40\0\143\0\162\0\145\0\141\0\164\0\151\0\157\0\156\0\40\0\141\0\156\0\144\0\40\0\150\0\141\0\156\0\144\0\154\0\151\0\156\0\147) + /Parent 735 0 R + /Prev 738 0 R + /Next 740 0 R + /A 261 0 R +>> endobj +740 0 obj +<< + /Title (\376\377\0\103\0\141\0\154\0\154\0\163) + /Parent 735 0 R + /Prev 739 0 R + /Next 741 0 R + /A 263 0 R +>> endobj +741 0 obj +<< + /Title (\376\377\0\117\0\142\0\152\0\145\0\143\0\164\0\163\0\40\0\155\0\141\0\156\0\151\0\160\0\165\0\154\0\141\0\164\0\151\0\157\0\156) + /Parent 735 0 R + /Prev 740 0 R + /Next 742 0 R + /A 265 0 R +>> endobj +742 0 obj +<< + /Title (\376\377\0\102\0\171\0\164\0\145\0\143\0\157\0\144\0\145\0\40\0\163\0\145\0\162\0\151\0\141\0\154\0\151\0\172\0\141\0\164\0\151\0\157\0\156) + /Parent 735 0 R + /Prev 741 0 R + /Next 743 0 R + /A 267 0 R +>> endobj +743 0 obj +<< + /Title (\376\377\0\122\0\141\0\167\0\40\0\157\0\142\0\152\0\145\0\143\0\164\0\40\0\150\0\141\0\156\0\144\0\154\0\151\0\156\0\147) + /Parent 735 0 R + /Prev 742 0 R + /Next 744 0 R + /A 269 0 R +>> endobj +744 0 obj +<< + /Title (\376\377\0\107\0\141\0\162\0\142\0\141\0\147\0\145\0\40\0\103\0\157\0\154\0\154\0\145\0\143\0\164\0\157\0\162) + /Parent 735 0 R + /Prev 743 0 R + /Next 745 0 R + /A 271 0 R +>> endobj +745 0 obj +<< + /Title (\376\377\0\104\0\145\0\142\0\165\0\147\0\40\0\151\0\156\0\164\0\145\0\162\0\146\0\141\0\143\0\145) + /Parent 735 0 R + /Prev 744 0 R + /A 273 0 R +>> endobj +746 0 obj +<< + /Title (\376\377\0\111\0\156\0\144\0\145\0\170) + /Parent 542 0 R + /Prev 735 0 R + /A 275 0 R +>> endobj +747 0 obj +<< /Type /Font +/Subtype /Type1 +/Name /F11 +/BaseFont /Courier-Bold +/Encoding /WinAnsiEncoding >> +endobj +748 0 obj +<< /Type /Font +/Subtype /Type1 +/Name /F1 +/BaseFont /Helvetica +/Encoding /WinAnsiEncoding >> +endobj +749 0 obj +<< /Type /Font +/Subtype /Type1 +/Name /F10 +/BaseFont /Courier-Oblique +/Encoding /WinAnsiEncoding >> +endobj +750 0 obj +<< /Type /Font +/Subtype /Type1 +/Name /F5 +/BaseFont /Times-Roman +/Encoding /WinAnsiEncoding >> +endobj +751 0 obj +<< /Type /Font +/Subtype /Type1 +/Name /F3 +/BaseFont /Helvetica-Bold +/Encoding /WinAnsiEncoding >> +endobj +752 0 obj +<< /Type /Font +/Subtype /Type1 +/Name /F9 +/BaseFont /Courier +/Encoding /WinAnsiEncoding >> +endobj +753 0 obj +<< /Type /Font +/Subtype /Type1 +/Name /F6 +/BaseFont /Times-Italic +/Encoding /WinAnsiEncoding >> +endobj +754 0 obj +<< /Type /Font +/Subtype /Type1 +/Name /F7 +/BaseFont /Times-Bold +/Encoding /WinAnsiEncoding >> +endobj +1 0 obj +<< /Type /Pages +/Count 118 +/Kids [6 0 R 8 0 R 10 0 R 12 0 R 121 0 R 240 0 R 277 0 R 279 0 R 281 0 R 283 0 R 285 0 R 287 0 R 301 0 R 303 0 R 305 0 R 307 0 R 309 0 R 313 0 R 319 0 R 324 0 R 326 0 R 328 0 R 330 0 R 337 0 R 342 0 R 347 0 R 349 0 R 351 0 R 353 0 R 355 0 R 357 0 R 361 0 R 363 0 R 367 0 R 369 0 R 373 0 R 375 0 R 377 0 R 379 0 R 381 0 R 383 0 R 385 0 R 387 0 R 389 0 R 391 0 R 393 0 R 395 0 R 397 0 R 399 0 R 401 0 R 403 0 R 405 0 R 407 0 R 409 0 R 411 0 R 413 0 R 415 0 R 417 0 R 419 0 R 421 0 R 423 0 R 425 0 R 427 0 R 429 0 R 431 0 R 433 0 R 435 0 R 437 0 R 439 0 R 441 0 R 443 0 R 445 0 R 447 0 R 449 0 R 451 0 R 453 0 R 455 0 R 457 0 R 459 0 R 461 0 R 463 0 R 465 0 R 467 0 R 469 0 R 471 0 R 473 0 R 475 0 R 477 0 R 479 0 R 481 0 R 483 0 R 485 0 R 487 0 R 489 0 R 491 0 R 493 0 R 495 0 R 497 0 R 499 0 R 501 0 R 503 0 R 505 0 R 507 0 R 509 0 R 511 0 R 513 0 R 515 0 R 517 0 R 519 0 R 521 0 R 523 0 R 525 0 R 527 0 R 529 0 R 531 0 R 534 0 R 537 0 R 540 0 R ] >> +endobj +2 0 obj +<< /Type /Catalog +/Pages 1 0 R + /Outlines 542 0 R + /PageMode /UseOutlines + >> +endobj +3 0 obj +<< +/Font << /F1 748 0 R /F11 747 0 R /F10 749 0 R /F5 750 0 R /F3 751 0 R /F9 752 0 R /F6 753 0 R /F7 754 0 R >> +/ProcSet [ /PDF /ImageC /Text ] >> +endobj +15 0 obj +<< +/S /GoTo +/D [277 0 R /XYZ 115.0 725.0 null] +>> +endobj +17 0 obj +<< +/S /GoTo +/D [279 0 R /XYZ 115.0 725.0 null] +>> +endobj +19 0 obj +<< +/S /GoTo +/D [279 0 R /XYZ 115.0 666.009 null] +>> +endobj +21 0 obj +<< +/S /GoTo +/D [279 0 R /XYZ 115.0 632.684 null] +>> +endobj +23 0 obj +<< +/S /GoTo +/D [279 0 R /XYZ 115.0 519.385 null] +>> +endobj +25 0 obj +<< +/S /GoTo +/D [279 0 R /XYZ 115.0 337.946 null] +>> +endobj +27 0 obj +<< +/S /GoTo +/D [279 0 R /XYZ 115.0 207.507 null] +>> +endobj +29 0 obj +<< +/S /GoTo +/D [279 0 R /XYZ 115.0 122.068 null] +>> +endobj +31 0 obj +<< +/S /GoTo +/D [281 0 R /XYZ 115.0 433.98 null] +>> +endobj +33 0 obj +<< +/S /GoTo +/D [283 0 R /XYZ 115.0 714.0 null] +>> +endobj +35 0 obj +<< +/S /GoTo +/D [283 0 R /XYZ 115.0 637.675 null] +>> +endobj +37 0 obj +<< +/S /GoTo +/D [283 0 R /XYZ 115.0 508.076 null] +>> +endobj +39 0 obj +<< +/S /GoTo +/D [283 0 R /XYZ 115.0 398.197 null] +>> +endobj +41 0 obj +<< +/S /GoTo +/D [285 0 R /XYZ 115.0 725.0 null] +>> +endobj +43 0 obj +<< +/S /GoTo +/D [285 0 R /XYZ 115.0 623.981 null] +>> +endobj +45 0 obj +<< +/S /GoTo +/D [285 0 R /XYZ 115.0 512.962 null] +>> +endobj +47 0 obj +<< +/S /GoTo +/D [285 0 R /XYZ 115.0 363.643 null] +>> +endobj +49 0 obj +<< +/S /GoTo +/D [285 0 R /XYZ 115.0 243.904 null] +>> +endobj +51 0 obj +<< +/S /GoTo +/D [285 0 R /XYZ 115.0 182.465 null] +>> +endobj +53 0 obj +<< +/S /GoTo +/D [285 0 R /XYZ 115.0 110.026 null] +>> +endobj +55 0 obj +<< +/S /GoTo +/D [287 0 R /XYZ 115.0 682.0 null] +>> +endobj +57 0 obj +<< +/S /GoTo +/D [287 0 R /XYZ 115.0 620.561 null] +>> +endobj +59 0 obj +<< +/S /GoTo +/D [287 0 R /XYZ 115.0 559.122 null] +>> +endobj +61 0 obj +<< +/S /GoTo +/D [287 0 R /XYZ 115.0 508.683 null] +>> +endobj +63 0 obj +<< +/S /GoTo +/D [287 0 R /XYZ 115.0 447.244 null] +>> +endobj +65 0 obj +<< +/S /GoTo +/D [287 0 R /XYZ 115.0 293.919 null] +>> +endobj +67 0 obj +<< +/S /GoTo +/D [303 0 R /XYZ 115.0 635.98 null] +>> +endobj +69 0 obj +<< +/S /GoTo +/D [303 0 R /XYZ 115.0 486.795 null] +>> +endobj +71 0 obj +<< +/S /GoTo +/D [303 0 R /XYZ 115.0 406.496 null] +>> +endobj +73 0 obj +<< +/S /GoTo +/D [307 0 R /XYZ 115.0 725.0 null] +>> +endobj +75 0 obj +<< +/S /GoTo +/D [307 0 R /XYZ 115.0 252.809 null] +>> +endobj +77 0 obj +<< +/S /GoTo +/D [307 0 R /XYZ 115.0 161.51 null] +>> +endobj +79 0 obj +<< +/S /GoTo +/D [309 0 R /XYZ 115.0 704.0 null] +>> +endobj +81 0 obj +<< +/S /GoTo +/D [309 0 R /XYZ 115.0 601.701 null] +>> +endobj +83 0 obj +<< +/S /GoTo +/D [309 0 R /XYZ 115.0 521.402 null] +>> +endobj +85 0 obj +<< +/S /GoTo +/D [309 0 R /XYZ 115.0 330.083 null] +>> +endobj +87 0 obj +<< +/S /GoTo +/D [309 0 R /XYZ 115.0 220.204 null] +>> +endobj +89 0 obj +<< +/S /GoTo +/D [313 0 R /XYZ 115.0 725.0 null] +>> +endobj +91 0 obj +<< +/S /GoTo +/D [313 0 R /XYZ 115.0 632.701 null] +>> +endobj +93 0 obj +<< +/S /GoTo +/D [313 0 R /XYZ 115.0 552.402 null] +>> +endobj +95 0 obj +<< +/S /GoTo +/D [313 0 R /XYZ 115.0 462.243 null] +>> +endobj +97 0 obj +<< +/S /GoTo +/D [313 0 R /XYZ 115.0 332.644 null] +>> +endobj +99 0 obj +<< +/S /GoTo +/D [313 0 R /XYZ 115.0 241.345 null] +>> +endobj +101 0 obj +<< +/S /GoTo +/D [313 0 R /XYZ 115.0 208.02 null] +>> +endobj +103 0 obj +<< +/S /GoTo +/D [319 0 R /XYZ 115.0 612.28 null] +>> +endobj +105 0 obj +<< +/S /GoTo +/D [326 0 R /XYZ 115.0 138.122 null] +>> +endobj +107 0 obj +<< +/S /GoTo +/D [330 0 R /XYZ 115.0 453.24 null] +>> +endobj +109 0 obj +<< +/S /GoTo +/D [330 0 R /XYZ 115.0 297.941 null] +>> +endobj +111 0 obj +<< +/S /GoTo +/D [337 0 R /XYZ 115.0 725.0 null] +>> +endobj +113 0 obj +<< +/S /GoTo +/D [337 0 R /XYZ 115.0 647.675 null] +>> +endobj +115 0 obj +<< +/S /GoTo +/D [337 0 R /XYZ 115.0 597.236 null] +>> +endobj +117 0 obj +<< +/S /GoTo +/D [337 0 R /XYZ 115.0 263.477 null] +>> +endobj +119 0 obj +<< +/S /GoTo +/D [342 0 R /XYZ 115.0 695.14 null] +>> +endobj +124 0 obj +<< +/S /GoTo +/D [342 0 R /XYZ 115.0 528.515 null] +>> +endobj +126 0 obj +<< +/S /GoTo +/D [342 0 R /XYZ 115.0 452.19 null] +>> +endobj +128 0 obj +<< +/S /GoTo +/D [349 0 R /XYZ 115.0 425.044 null] +>> +endobj +130 0 obj +<< +/S /GoTo +/D [349 0 R /XYZ 115.0 150.585 null] +>> +endobj +132 0 obj +<< +/S /GoTo +/D [351 0 R /XYZ 115.0 644.866 null] +>> +endobj +134 0 obj +<< +/S /GoTo +/D [351 0 R /XYZ 115.0 237.107 null] +>> +endobj +136 0 obj +<< +/S /GoTo +/D [353 0 R /XYZ 115.0 654.42 null] +>> +endobj +138 0 obj +<< +/S /GoTo +/D [353 0 R /XYZ 115.0 442.521 null] +>> +endobj +140 0 obj +<< +/S /GoTo +/D [353 0 R /XYZ 115.0 366.196 null] +>> +endobj +142 0 obj +<< +/S /GoTo +/D [361 0 R /XYZ 115.0 566.96 null] +>> +endobj +144 0 obj +<< +/S /GoTo +/D [363 0 R /XYZ 115.0 191.786 null] +>> +endobj +146 0 obj +<< +/S /GoTo +/D [369 0 R /XYZ 115.0 377.2 null] +>> +endobj +148 0 obj +<< +/S /GoTo +/D [373 0 R /XYZ 115.0 583.12 null] +>> +endobj +150 0 obj +<< +/S /GoTo +/D [375 0 R /XYZ 115.0 714.0 null] +>> +endobj +152 0 obj +<< +/S /GoTo +/D [375 0 R /XYZ 115.0 648.675 null] +>> +endobj +154 0 obj +<< +/S /GoTo +/D [375 0 R /XYZ 115.0 343.916 null] +>> +endobj +156 0 obj +<< +/S /GoTo +/D [377 0 R /XYZ 115.0 512.68 null] +>> +endobj +158 0 obj +<< +/S /GoTo +/D [377 0 R /XYZ 115.0 203.921 null] +>> +endobj +160 0 obj +<< +/S /GoTo +/D [379 0 R /XYZ 115.0 725.0 null] +>> +endobj +162 0 obj +<< +/S /GoTo +/D [381 0 R /XYZ 115.0 458.5 null] +>> +endobj +164 0 obj +<< +/S /GoTo +/D [383 0 R /XYZ 115.0 401.381 null] +>> +endobj +166 0 obj +<< +/S /GoTo +/D [385 0 R /XYZ 115.0 685.28 null] +>> +endobj +168 0 obj +<< +/S /GoTo +/D [387 0 R /XYZ 115.0 725.0 null] +>> +endobj +170 0 obj +<< +/S /GoTo +/D [387 0 R /XYZ 115.0 632.701 null] +>> +endobj +172 0 obj +<< +/S /GoTo +/D [387 0 R /XYZ 115.0 530.402 null] +>> +endobj +174 0 obj +<< +/S /GoTo +/D [387 0 R /XYZ 115.0 418.103 null] +>> +endobj +176 0 obj +<< +/S /GoTo +/D [387 0 R /XYZ 115.0 316.804 null] +>> +endobj +178 0 obj +<< +/S /GoTo +/D [387 0 R /XYZ 115.0 236.505 null] +>> +endobj +180 0 obj +<< +/S /GoTo +/D [387 0 R /XYZ 115.0 186.066 null] +>> +endobj +182 0 obj +<< +/S /GoTo +/D [387 0 R /XYZ 115.0 135.627 null] +>> +endobj +184 0 obj +<< +/S /GoTo +/D [389 0 R /XYZ 115.0 725.0 null] +>> +endobj +186 0 obj +<< +/S /GoTo +/D [389 0 R /XYZ 115.0 684.561 null] +>> +endobj +188 0 obj +<< +/S /GoTo +/D [389 0 R /XYZ 115.0 604.262 null] +>> +endobj +190 0 obj +<< +/S /GoTo +/D [389 0 R /XYZ 115.0 523.963 null] +>> +endobj +192 0 obj +<< +/S /GoTo +/D [389 0 R /XYZ 115.0 357.164 null] +>> +endobj +194 0 obj +<< +/S /GoTo +/D [389 0 R /XYZ 115.0 276.865 null] +>> +endobj +196 0 obj +<< +/S /GoTo +/D [389 0 R /XYZ 115.0 196.566 null] +>> +endobj +198 0 obj +<< +/S /GoTo +/D [391 0 R /XYZ 115.0 725.0 null] +>> +endobj +200 0 obj +<< +/S /GoTo +/D [391 0 R /XYZ 115.0 622.701 null] +>> +endobj +202 0 obj +<< +/S /GoTo +/D [391 0 R /XYZ 115.0 510.402 null] +>> +endobj +204 0 obj +<< +/S /GoTo +/D [391 0 R /XYZ 115.0 409.103 null] +>> +endobj +206 0 obj +<< +/S /GoTo +/D [391 0 R /XYZ 115.0 354.778 null] +>> +endobj +208 0 obj +<< +/S /GoTo +/D [395 0 R /XYZ 115.0 270.96 null] +>> +endobj +210 0 obj +<< +/S /GoTo +/D [413 0 R /XYZ 115.0 725.0 null] +>> +endobj +212 0 obj +<< +/S /GoTo +/D [413 0 R /XYZ 115.0 601.009 null] +>> +endobj +214 0 obj +<< +/S /GoTo +/D [413 0 R /XYZ 115.0 343.684 null] +>> +endobj +216 0 obj +<< +/S /GoTo +/D [413 0 R /XYZ 115.0 278.359 null] +>> +endobj +218 0 obj +<< +/S /GoTo +/D [413 0 R /XYZ 115.0 213.034 null] +>> +endobj +220 0 obj +<< +/S /GoTo +/D [415 0 R /XYZ 115.0 714.0 null] +>> +endobj +222 0 obj +<< +/S /GoTo +/D [415 0 R /XYZ 115.0 626.675 null] +>> +endobj +224 0 obj +<< +/S /GoTo +/D [415 0 R /XYZ 115.0 490.91 null] +>> +endobj +226 0 obj +<< +/S /GoTo +/D [415 0 R /XYZ 115.0 276.125 null] +>> +endobj +228 0 obj +<< +/S /GoTo +/D [415 0 R /XYZ 115.0 188.8 null] +>> +endobj +230 0 obj +<< +/S /GoTo +/D [417 0 R /XYZ 115.0 512.0 null] +>> +endobj +232 0 obj +<< +/S /GoTo +/D [419 0 R /XYZ 115.0 331.24 null] +>> +endobj +234 0 obj +<< +/S /GoTo +/D [419 0 R /XYZ 115.0 171.055 null] +>> +endobj +236 0 obj +<< +/S /GoTo +/D [421 0 R /XYZ 115.0 143.206 null] +>> +endobj +238 0 obj +<< +/S /GoTo +/D [423 0 R /XYZ 115.0 481.68 null] +>> +endobj +243 0 obj +<< +/S /GoTo +/D [427 0 R /XYZ 115.0 616.26 null] +>> +endobj +245 0 obj +<< +/S /GoTo +/D [429 0 R /XYZ 115.0 383.52 null] +>> +endobj +247 0 obj +<< +/S /GoTo +/D [431 0 R /XYZ 115.0 674.14 null] +>> +endobj +249 0 obj +<< +/S /GoTo +/D [431 0 R /XYZ 115.0 556.955 null] +>> +endobj +251 0 obj +<< +/S /GoTo +/D [431 0 R /XYZ 115.0 307.985 null] +>> +endobj +253 0 obj +<< +/S /GoTo +/D [435 0 R /XYZ 115.0 725.0 null] +>> +endobj +255 0 obj +<< +/S /GoTo +/D [435 0 R /XYZ 115.0 687.009 null] +>> +endobj +257 0 obj +<< +/S /GoTo +/D [449 0 R /XYZ 115.0 493.0 null] +>> +endobj +259 0 obj +<< +/S /GoTo +/D [453 0 R /XYZ 115.0 460.14 null] +>> +endobj +261 0 obj +<< +/S /GoTo +/D [457 0 R /XYZ 115.0 293.28 null] +>> +endobj +263 0 obj +<< +/S /GoTo +/D [489 0 R /XYZ 115.0 400.14 null] +>> +endobj +265 0 obj +<< +/S /GoTo +/D [495 0 R /XYZ 115.0 534.14 null] +>> +endobj +267 0 obj +<< +/S /GoTo +/D [517 0 R /XYZ 115.0 725.0 null] +>> +endobj +269 0 obj +<< +/S /GoTo +/D [517 0 R /XYZ 115.0 195.235 null] +>> +endobj +271 0 obj +<< +/S /GoTo +/D [525 0 R /XYZ 115.0 556.14 null] +>> +endobj +273 0 obj +<< +/S /GoTo +/D [525 0 R /XYZ 115.0 141.095 null] +>> +endobj +275 0 obj +<< +/S /GoTo +/D [531 0 R /XYZ 67.0 725.0 null] +>> +endobj +290 0 obj +<< +/S /GoTo +/D [373 0 R /XYZ 115.0 549.795 null] +>> +endobj +293 0 obj +<< +/S /GoTo +/D [429 0 R /XYZ 115.0 350.195 null] +>> +endobj +295 0 obj +<< +/S /GoTo +/D [381 0 R /XYZ 115.0 425.175 null] +>> +endobj +297 0 obj +<< +/S /GoTo +/D [342 0 R /XYZ 115.0 495.19 null] +>> +endobj +299 0 obj +<< +/S /GoTo +/D [287 0 R /XYZ 115.0 264.48 null] +>> +endobj +316 0 obj +<< +/S /GoTo +/D [375 0 R /XYZ 115.0 680.675 null] +>> +endobj +322 0 obj +<< +/S /GoTo +/D [337 0 R /XYZ 115.0 701.675 null] +>> +endobj +333 0 obj +<< +/S /GoTo +/D [383 0 R /XYZ 115.0 368.056 null] +>> +endobj +335 0 obj +<< +/S /GoTo +/D [385 0 R /XYZ 115.0 651.955 null] +>> +endobj +340 0 obj +<< +/S /GoTo +/D [326 0 R /XYZ 115.0 108.683 null] +>> +endobj +345 0 obj +<< +/S /GoTo +/D [391 0 R /XYZ 115.0 375.778 null] +>> +endobj +542 0 obj +<< + /First 544 0 R + /Last 746 0 R +>> endobj +543 0 obj +<< +/S /GoTo +/D [10 0 R /XYZ 115.0 725.0 null] +>> +endobj +545 0 obj +<< +/S /GoTo +/D [12 0 R /XYZ 115.0 715.0 null] +>> +endobj +576 0 obj +<< +/S /GoTo +/D [303 0 R /XYZ 115.0 345.057 null] +>> +endobj +578 0 obj +<< +/S /GoTo +/D [303 0 R /XYZ 115.0 286.861 null] +>> +endobj +580 0 obj +<< +/S /GoTo +/D [305 0 R /XYZ 115.0 725.0 null] +>> +endobj +582 0 obj +<< +/S /GoTo +/D [305 0 R /XYZ 115.0 499.904 null] +>> +endobj +584 0 obj +<< +/S /GoTo +/D [305 0 R /XYZ 115.0 303.108 null] +>> +endobj +587 0 obj +<< +/S /GoTo +/D [307 0 R /XYZ 115.0 705.561 null] +>> +endobj +589 0 obj +<< +/S /GoTo +/D [307 0 R /XYZ 115.0 470.465 null] +>> +endobj +606 0 obj +<< +/S /GoTo +/D [319 0 R /XYZ 115.0 582.841 null] +>> +endobj +608 0 obj +<< +/S /GoTo +/D [319 0 R /XYZ 115.0 505.785 null] +>> +endobj +610 0 obj +<< +/S /GoTo +/D [319 0 R /XYZ 115.0 264.849 null] +>> +endobj +612 0 obj +<< +/S /GoTo +/D [319 0 R /XYZ 115.0 155.793 null] +>> +endobj +614 0 obj +<< +/S /GoTo +/D [324 0 R /XYZ 115.0 704.0 null] +>> +endobj +616 0 obj +<< +/S /GoTo +/D [324 0 R /XYZ 115.0 522.364 null] +>> +endobj +618 0 obj +<< +/S /GoTo +/D [324 0 R /XYZ 115.0 316.848 null] +>> +endobj +620 0 obj +<< +/S /GoTo +/D [324 0 R /XYZ 115.0 228.792 null] +>> +endobj +622 0 obj +<< +/S /GoTo +/D [326 0 R /XYZ 115.0 725.0 null] +>> +endobj +624 0 obj +<< +/S /GoTo +/D [326 0 R /XYZ 115.0 538.204 null] +>> +endobj +626 0 obj +<< +/S /GoTo +/D [326 0 R /XYZ 115.0 398.568 null] +>> +endobj +629 0 obj +<< +/S /GoTo +/D [328 0 R /XYZ 115.0 122.48 null] +>> +endobj +640 0 obj +<< +/S /GoTo +/D [347 0 R /XYZ 115.0 277.9 null] +>> +endobj +642 0 obj +<< +/S /GoTo +/D [349 0 R /XYZ 115.0 714.0 null] +>> +endobj +651 0 obj +<< +/S /GoTo +/D [357 0 R /XYZ 115.0 653.42 null] +>> +endobj +653 0 obj +<< +/S /GoTo +/D [357 0 R /XYZ 115.0 439.49 null] +>> +endobj +666 0 obj +<< +/S /GoTo +/D [383 0 R /XYZ 115.0 653.42 null] +>> +endobj +691 0 obj +<< +/S /GoTo +/D [395 0 R /XYZ 115.0 209.521 null] +>> +endobj +693 0 obj +<< +/S /GoTo +/D [397 0 R /XYZ 115.0 609.0 null] +>> +endobj +695 0 obj +<< +/S /GoTo +/D [397 0 R /XYZ 115.0 372.804 null] +>> +endobj +697 0 obj +<< +/S /GoTo +/D [397 0 R /XYZ 115.0 178.608 null] +>> +endobj +699 0 obj +<< +/S /GoTo +/D [399 0 R /XYZ 115.0 365.0 null] +>> +endobj +701 0 obj +<< +/S /GoTo +/D [401 0 R /XYZ 115.0 504.0 null] +>> +endobj +703 0 obj +<< +/S /GoTo +/D [405 0 R /XYZ 115.0 542.0 null] +>> +endobj +705 0 obj +<< +/S /GoTo +/D [407 0 R /XYZ 115.0 422.94 null] +>> +endobj +707 0 obj +<< +/S /GoTo +/D [409 0 R /XYZ 115.0 523.0 null] +>> +endobj +709 0 obj +<< +/S /GoTo +/D [409 0 R /XYZ 115.0 222.804 null] +>> +endobj +711 0 obj +<< +/S /GoTo +/D [411 0 R /XYZ 115.0 714.0 null] +>> +endobj +713 0 obj +<< +/S /GoTo +/D [411 0 R /XYZ 115.0 360.804 null] +>> +endobj +xref +0 755 +0000000000 65535 f +0000250925 00000 n +0000251917 00000 n +0000252010 00000 n +0000000015 00000 n +0000000071 00000 n +0000000405 00000 n +0000000511 00000 n +0000002005 00000 n +0000002111 00000 n +0000002272 00000 n +0000002379 00000 n +0000004267 00000 n +0000004390 00000 n +0000004791 00000 n +0000252176 00000 n +0000004927 00000 n +0000252242 00000 n +0000005063 00000 n +0000252308 00000 n +0000005199 00000 n +0000252376 00000 n +0000005334 00000 n +0000252444 00000 n +0000005469 00000 n +0000252512 00000 n +0000005605 00000 n +0000252580 00000 n +0000005741 00000 n +0000252648 00000 n +0000005877 00000 n +0000252716 00000 n +0000006013 00000 n +0000252783 00000 n +0000006148 00000 n +0000252849 00000 n +0000006284 00000 n +0000252917 00000 n +0000006420 00000 n +0000252985 00000 n +0000006556 00000 n +0000253053 00000 n +0000006692 00000 n +0000253119 00000 n +0000006828 00000 n +0000253187 00000 n +0000006964 00000 n +0000253255 00000 n +0000007100 00000 n +0000253323 00000 n +0000007236 00000 n +0000253391 00000 n +0000007372 00000 n +0000253459 00000 n +0000007508 00000 n +0000253527 00000 n +0000007644 00000 n +0000253593 00000 n +0000007780 00000 n +0000253661 00000 n +0000007916 00000 n +0000253729 00000 n +0000008052 00000 n +0000253797 00000 n +0000008188 00000 n +0000253865 00000 n +0000008324 00000 n +0000253933 00000 n +0000008460 00000 n +0000254000 00000 n +0000008596 00000 n +0000254068 00000 n +0000008732 00000 n +0000254136 00000 n +0000008867 00000 n +0000254202 00000 n +0000009003 00000 n +0000254270 00000 n +0000009139 00000 n +0000254337 00000 n +0000009275 00000 n +0000254403 00000 n +0000009410 00000 n +0000254471 00000 n +0000009545 00000 n +0000254539 00000 n +0000009681 00000 n +0000254607 00000 n +0000009816 00000 n +0000254675 00000 n +0000009952 00000 n +0000254741 00000 n +0000010088 00000 n +0000254809 00000 n +0000010224 00000 n +0000254877 00000 n +0000010360 00000 n +0000254945 00000 n +0000010495 00000 n +0000255013 00000 n +0000010631 00000 n +0000255081 00000 n +0000010768 00000 n +0000255149 00000 n +0000010906 00000 n +0000255217 00000 n +0000011044 00000 n +0000255286 00000 n +0000011182 00000 n +0000255354 00000 n +0000011320 00000 n +0000255423 00000 n +0000011458 00000 n +0000255490 00000 n +0000011596 00000 n +0000255559 00000 n +0000011733 00000 n +0000255628 00000 n +0000011869 00000 n +0000255697 00000 n +0000012005 00000 n +0000014141 00000 n +0000014267 00000 n +0000014752 00000 n +0000255765 00000 n +0000014886 00000 n +0000255834 00000 n +0000015020 00000 n +0000255902 00000 n +0000015154 00000 n +0000255971 00000 n +0000015288 00000 n +0000256040 00000 n +0000015422 00000 n +0000256109 00000 n +0000015556 00000 n +0000256178 00000 n +0000015690 00000 n +0000256246 00000 n +0000015823 00000 n +0000256315 00000 n +0000015956 00000 n +0000256384 00000 n +0000016090 00000 n +0000256452 00000 n +0000016224 00000 n +0000256521 00000 n +0000016358 00000 n +0000256588 00000 n +0000016492 00000 n +0000256656 00000 n +0000016626 00000 n +0000256723 00000 n +0000016760 00000 n +0000256792 00000 n +0000016894 00000 n +0000256861 00000 n +0000017028 00000 n +0000256929 00000 n +0000017162 00000 n +0000256998 00000 n +0000017296 00000 n +0000257065 00000 n +0000017430 00000 n +0000257132 00000 n +0000017564 00000 n +0000257201 00000 n +0000017698 00000 n +0000257269 00000 n +0000017832 00000 n +0000257336 00000 n +0000017966 00000 n +0000257405 00000 n +0000018100 00000 n +0000257474 00000 n +0000018234 00000 n +0000257543 00000 n +0000018368 00000 n +0000257612 00000 n +0000018502 00000 n +0000257681 00000 n +0000018636 00000 n +0000257750 00000 n +0000018770 00000 n +0000257819 00000 n +0000018904 00000 n +0000257886 00000 n +0000019038 00000 n +0000257955 00000 n +0000019172 00000 n +0000258024 00000 n +0000019306 00000 n +0000258093 00000 n +0000019440 00000 n +0000258162 00000 n +0000019574 00000 n +0000258231 00000 n +0000019707 00000 n +0000258300 00000 n +0000019841 00000 n +0000258367 00000 n +0000019975 00000 n +0000258436 00000 n +0000020109 00000 n +0000258505 00000 n +0000020243 00000 n +0000258574 00000 n +0000020377 00000 n +0000258643 00000 n +0000020510 00000 n +0000258711 00000 n +0000020644 00000 n +0000258778 00000 n +0000020778 00000 n +0000258847 00000 n +0000020912 00000 n +0000258916 00000 n +0000021046 00000 n +0000258985 00000 n +0000021180 00000 n +0000259054 00000 n +0000021314 00000 n +0000259121 00000 n +0000021448 00000 n +0000259190 00000 n +0000021582 00000 n +0000259258 00000 n +0000021716 00000 n +0000259327 00000 n +0000021850 00000 n +0000259394 00000 n +0000021983 00000 n +0000259461 00000 n +0000022117 00000 n +0000259529 00000 n +0000022251 00000 n +0000259598 00000 n +0000022384 00000 n +0000259667 00000 n +0000022516 00000 n +0000023516 00000 n +0000023642 00000 n +0000023799 00000 n +0000259735 00000 n +0000023933 00000 n +0000259803 00000 n +0000024067 00000 n +0000259871 00000 n +0000024201 00000 n +0000259939 00000 n +0000024335 00000 n +0000260008 00000 n +0000024469 00000 n +0000260077 00000 n +0000024603 00000 n +0000260144 00000 n +0000024737 00000 n +0000260213 00000 n +0000024871 00000 n +0000260280 00000 n +0000025004 00000 n +0000260348 00000 n +0000025138 00000 n +0000260416 00000 n +0000025272 00000 n +0000260484 00000 n +0000025406 00000 n +0000260552 00000 n +0000025540 00000 n +0000260619 00000 n +0000025674 00000 n +0000260688 00000 n +0000025808 00000 n +0000260756 00000 n +0000025942 00000 n +0000260825 00000 n +0000026076 00000 n +0000026895 00000 n +0000027005 00000 n +0000028641 00000 n +0000028751 00000 n +0000030470 00000 n +0000030580 00000 n +0000032510 00000 n +0000032620 00000 n +0000034220 00000 n +0000034330 00000 n +0000036815 00000 n +0000036941 00000 n +0000037010 00000 n +0000260891 00000 n +0000037149 00000 n +0000037287 00000 n +0000260960 00000 n +0000037426 00000 n +0000261029 00000 n +0000037565 00000 n +0000261098 00000 n +0000037706 00000 n +0000261166 00000 n +0000037845 00000 n +0000039217 00000 n +0000039327 00000 n +0000041203 00000 n +0000041313 00000 n +0000042817 00000 n +0000042927 00000 n +0000044392 00000 n +0000044502 00000 n +0000045896 00000 n +0000046022 00000 n +0000046051 00000 n +0000046189 00000 n +0000047539 00000 n +0000047665 00000 n +0000047702 00000 n +0000261234 00000 n +0000047841 00000 n +0000047980 00000 n +0000049761 00000 n +0000049887 00000 n +0000049916 00000 n +0000261303 00000 n +0000050055 00000 n +0000051492 00000 n +0000051602 00000 n +0000053339 00000 n +0000053449 00000 n +0000054549 00000 n +0000054659 00000 n +0000056169 00000 n +0000056295 00000 n +0000056332 00000 n +0000261372 00000 n +0000056471 00000 n +0000261441 00000 n +0000056610 00000 n +0000058176 00000 n +0000058302 00000 n +0000058331 00000 n +0000261510 00000 n +0000058469 00000 n +0000059833 00000 n +0000059959 00000 n +0000059988 00000 n +0000261579 00000 n +0000060126 00000 n +0000061261 00000 n +0000061371 00000 n +0000063340 00000 n +0000063450 00000 n +0000065479 00000 n +0000065589 00000 n +0000067468 00000 n +0000067578 00000 n +0000069032 00000 n +0000069142 00000 n +0000071429 00000 n +0000071555 00000 n +0000071584 00000 n +0000071725 00000 n +0000073751 00000 n +0000073861 00000 n +0000075876 00000 n +0000076002 00000 n +0000076031 00000 n +0000076167 00000 n +0000077857 00000 n +0000077967 00000 n +0000079647 00000 n +0000079773 00000 n +0000079802 00000 n +0000079943 00000 n +0000082273 00000 n +0000082383 00000 n +0000083979 00000 n +0000084089 00000 n +0000086778 00000 n +0000086888 00000 n +0000088890 00000 n +0000089000 00000 n +0000091045 00000 n +0000091155 00000 n +0000092717 00000 n +0000092827 00000 n +0000094422 00000 n +0000094532 00000 n +0000095928 00000 n +0000096038 00000 n +0000097222 00000 n +0000097332 00000 n +0000098993 00000 n +0000099103 00000 n +0000100464 00000 n +0000100574 00000 n +0000102120 00000 n +0000102230 00000 n +0000103156 00000 n +0000103266 00000 n +0000104935 00000 n +0000105045 00000 n +0000106439 00000 n +0000106549 00000 n +0000108344 00000 n +0000108454 00000 n +0000110485 00000 n +0000110595 00000 n +0000112455 00000 n +0000112565 00000 n +0000114067 00000 n +0000114177 00000 n +0000115382 00000 n +0000115492 00000 n +0000118471 00000 n +0000118581 00000 n +0000120818 00000 n +0000120928 00000 n +0000122814 00000 n +0000122924 00000 n +0000124841 00000 n +0000124951 00000 n +0000126907 00000 n +0000127017 00000 n +0000129106 00000 n +0000129216 00000 n +0000130641 00000 n +0000130751 00000 n +0000132117 00000 n +0000132227 00000 n +0000134477 00000 n +0000134587 00000 n +0000136816 00000 n +0000136926 00000 n +0000138401 00000 n +0000138511 00000 n +0000139647 00000 n +0000139757 00000 n +0000140851 00000 n +0000140961 00000 n +0000142397 00000 n +0000142507 00000 n +0000143829 00000 n +0000143939 00000 n +0000145306 00000 n +0000145416 00000 n +0000147137 00000 n +0000147247 00000 n +0000148696 00000 n +0000148806 00000 n +0000150776 00000 n +0000150886 00000 n +0000152616 00000 n +0000152726 00000 n +0000154197 00000 n +0000154307 00000 n +0000155381 00000 n +0000155491 00000 n +0000157043 00000 n +0000157153 00000 n +0000158550 00000 n +0000158660 00000 n +0000160027 00000 n +0000160137 00000 n +0000161498 00000 n +0000161608 00000 n +0000163228 00000 n +0000163338 00000 n +0000164830 00000 n +0000164940 00000 n +0000166023 00000 n +0000166133 00000 n +0000167530 00000 n +0000167640 00000 n +0000169026 00000 n +0000169136 00000 n +0000170483 00000 n +0000170593 00000 n +0000171546 00000 n +0000171656 00000 n +0000173020 00000 n +0000173130 00000 n +0000174597 00000 n +0000174707 00000 n +0000177069 00000 n +0000177179 00000 n +0000179294 00000 n +0000179404 00000 n +0000180799 00000 n +0000180909 00000 n +0000182550 00000 n +0000182660 00000 n +0000184151 00000 n +0000184261 00000 n +0000185690 00000 n +0000185800 00000 n +0000187229 00000 n +0000187339 00000 n +0000188422 00000 n +0000188532 00000 n +0000189748 00000 n +0000189858 00000 n +0000191317 00000 n +0000191427 00000 n +0000192834 00000 n +0000192944 00000 n +0000194324 00000 n +0000194434 00000 n +0000195926 00000 n +0000196036 00000 n +0000197993 00000 n +0000198103 00000 n +0000199652 00000 n +0000199762 00000 n +0000201268 00000 n +0000201378 00000 n +0000202668 00000 n +0000202778 00000 n +0000204375 00000 n +0000204485 00000 n +0000205766 00000 n +0000205876 00000 n +0000207038 00000 n +0000207148 00000 n +0000208373 00000 n +0000208483 00000 n +0000209835 00000 n +0000209945 00000 n +0000211757 00000 n +0000211867 00000 n +0000213121 00000 n +0000213231 00000 n +0000215012 00000 n +0000215138 00000 n +0000215159 00000 n +0000216901 00000 n +0000217027 00000 n +0000217048 00000 n +0000218823 00000 n +0000218949 00000 n +0000218970 00000 n +0000220038 00000 n +0000220164 00000 n +0000261648 00000 n +0000261702 00000 n +0000220185 00000 n +0000261768 00000 n +0000220439 00000 n +0000220640 00000 n +0000220876 00000 n +0000221155 00000 n +0000221383 00000 n +0000221534 00000 n +0000221682 00000 n +0000221836 00000 n +0000222007 00000 n +0000222155 00000 n +0000222288 00000 n +0000222554 00000 n +0000222681 00000 n +0000222811 00000 n +0000222947 00000 n +0000223071 00000 n +0000223195 00000 n +0000223325 00000 n +0000223455 00000 n +0000223603 00000 n +0000223733 00000 n +0000223916 00000 n +0000224070 00000 n +0000224218 00000 n +0000224354 00000 n +0000224528 00000 n +0000224771 00000 n +0000224895 00000 n +0000225098 00000 n +0000225213 00000 n +0000261834 00000 n +0000225491 00000 n +0000261903 00000 n +0000225659 00000 n +0000261972 00000 n +0000225801 00000 n +0000262039 00000 n +0000225932 00000 n +0000262108 00000 n +0000226080 00000 n +0000226202 00000 n +0000262177 00000 n +0000226374 00000 n +0000262246 00000 n +0000226478 00000 n +0000226606 00000 n +0000226736 00000 n +0000226884 00000 n +0000227020 00000 n +0000227150 00000 n +0000227410 00000 n +0000227629 00000 n +0000227830 00000 n +0000227983 00000 n +0000228113 00000 n +0000228243 00000 n +0000228367 00000 n +0000228571 00000 n +0000228780 00000 n +0000229023 00000 n +0000262315 00000 n +0000229221 00000 n +0000262384 00000 n +0000229370 00000 n +0000262453 00000 n +0000229531 00000 n +0000262522 00000 n +0000229692 00000 n +0000262591 00000 n +0000229874 00000 n +0000262658 00000 n +0000230017 00000 n +0000262727 00000 n +0000230183 00000 n +0000262796 00000 n +0000230397 00000 n +0000262865 00000 n +0000230587 00000 n +0000262932 00000 n +0000230771 00000 n +0000263001 00000 n +0000230973 00000 n +0000231178 00000 n +0000263070 00000 n +0000231422 00000 n +0000231622 00000 n +0000231753 00000 n +0000231940 00000 n +0000232119 00000 n +0000232277 00000 n +0000232455 00000 n +0000232618 00000 n +0000232755 00000 n +0000232952 00000 n +0000263138 00000 n +0000233199 00000 n +0000263205 00000 n +0000233392 00000 n +0000233731 00000 n +0000233915 00000 n +0000234227 00000 n +0000234435 00000 n +0000234619 00000 n +0000234788 00000 n +0000234973 00000 n +0000263272 00000 n +0000235202 00000 n +0000263340 00000 n +0000235383 00000 n +0000235564 00000 n +0000235754 00000 n +0000235921 00000 n +0000236073 00000 n +0000236234 00000 n +0000236518 00000 n +0000236658 00000 n +0000236831 00000 n +0000237036 00000 n +0000237221 00000 n +0000237369 00000 n +0000263408 00000 n +0000237601 00000 n +0000237879 00000 n +0000238040 00000 n +0000238250 00000 n +0000238360 00000 n +0000238485 00000 n +0000238634 00000 n +0000238783 00000 n +0000238908 00000 n +0000239033 00000 n +0000239158 00000 n +0000239283 00000 n +0000239426 00000 n +0000239551 00000 n +0000239694 00000 n +0000239819 00000 n +0000239950 00000 n +0000240093 00000 n +0000240230 00000 n +0000240385 00000 n +0000240546 00000 n +0000240692 00000 n +0000240927 00000 n +0000241096 00000 n +0000263476 00000 n +0000241326 00000 n +0000263545 00000 n +0000241454 00000 n +0000263612 00000 n +0000241585 00000 n +0000263681 00000 n +0000241710 00000 n +0000263750 00000 n +0000241847 00000 n +0000263817 00000 n +0000241978 00000 n +0000263884 00000 n +0000242109 00000 n +0000263951 00000 n +0000242258 00000 n +0000264019 00000 n +0000242389 00000 n +0000264086 00000 n +0000242573 00000 n +0000264155 00000 n +0000242728 00000 n +0000264222 00000 n +0000242865 00000 n +0000243034 00000 n +0000243349 00000 n +0000243536 00000 n +0000243679 00000 n +0000243972 00000 n +0000244180 00000 n +0000244463 00000 n +0000244665 00000 n +0000244891 00000 n +0000245087 00000 n +0000245250 00000 n +0000245443 00000 n +0000245674 00000 n +0000245881 00000 n +0000246088 00000 n +0000246300 00000 n +0000246578 00000 n +0000246827 00000 n +0000247034 00000 n +0000247498 00000 n +0000247673 00000 n +0000247958 00000 n +0000248133 00000 n +0000248282 00000 n +0000248478 00000 n +0000248744 00000 n +0000248875 00000 n +0000249095 00000 n +0000249327 00000 n +0000249540 00000 n +0000249742 00000 n +0000249917 00000 n +0000250033 00000 n +0000250146 00000 n +0000250255 00000 n +0000250371 00000 n +0000250482 00000 n +0000250596 00000 n +0000250703 00000 n +0000250815 00000 n +trailer +<< +/Size 755 +/Root 2 0 R +/Info 4 0 R +>> +startxref +264291 +%%EOF diff --git a/etc/minimal.c b/etc/minimal.c new file mode 100644 index 0000000..d72100a --- /dev/null +++ b/etc/minimal.c @@ -0,0 +1,78 @@ +#include +#include + +#include +#include +#include + +#ifdef _MSC_VER +#pragma comment (lib ,"squirrel.lib") +#pragma comment (lib ,"sqstdlib.lib") +#endif + +#ifdef SQUNICODE + +#define scvprintf vfwprintf +#else + +#define scvprintf vfprintf +#endif + +void printfunc(HSQUIRRELVM v,const SQChar *s,...) +{ + va_list vl; + va_start(vl, s); + scvprintf(stdout, s, vl); + va_end(vl); +} + +void errorfunc(HSQUIRRELVM v,const SQChar *s,...) +{ + va_list vl; + va_start(vl, s); + scvprintf(stderr, s, vl); + va_end(vl); +} + +void call_foo(HSQUIRRELVM v, int n,float f,const SQChar *s) +{ + SQInteger top = sq_gettop(v); //saves the stack size before the call + sq_pushroottable(v); //pushes the global table + sq_pushstring(v,_SC("foo"),-1); + if(SQ_SUCCEEDED(sq_get(v,-2))) { //gets the field 'foo' from the global table + sq_pushroottable(v); //push the 'this' (in this case is the global table) + sq_pushinteger(v,n); + sq_pushfloat(v,f); + sq_pushstring(v,s,-1); + sq_call(v,4,SQFalse,SQTrue); //calls the function + } + sq_settop(v,top); //restores the original stack size +} + +int main(int argc, char* argv[]) +{ + HSQUIRRELVM v; + v = sq_open(1024); // creates a VM with initial stack size 1024 + + //REGISTRATION OF STDLIB + //sq_pushroottable(v); //push the root table where the std function will be registered + //sqstd_register_iolib(v); //registers a library + // ... call here other stdlibs string,math etc... + //sq_pop(v,1); //pops the root table + //END REGISTRATION OF STDLIB + + sqstd_seterrorhandlers(v); //registers the default error handlers + + sq_setprintfunc(v, printfunc,errorfunc); //sets the print function + + sq_pushroottable(v); //push the root table(were the globals of the script will be stored) + if(SQ_SUCCEEDED(sqstd_dofile(v, _SC("test.nut"), SQFalse, SQTrue))) // also prints syntax errors if any + { + call_foo(v,1,2.5,_SC("teststring")); + } + + sq_pop(v,1); //pops the root table + sq_close(v); + + return 0; +} diff --git a/etc/test.nut b/etc/test.nut new file mode 100644 index 0000000..3049fbb --- /dev/null +++ b/etc/test.nut @@ -0,0 +1,4 @@ +function foo(i, f, s) +{ + print("Called foo(), i="+i+", f="+f+", s='"+s+"'\n"); +} diff --git a/include/sqconfig.h b/include/sqconfig.h new file mode 100644 index 0000000..6c64926 --- /dev/null +++ b/include/sqconfig.h @@ -0,0 +1,146 @@ + +#ifdef _SQ64 + +#ifdef _MSC_VER +typedef __int64 SQInteger; +typedef unsigned __int64 SQUnsignedInteger; +typedef unsigned __int64 SQHash; /*should be the same size of a pointer*/ +#else +typedef long long SQInteger; +typedef unsigned long long SQUnsignedInteger; +typedef unsigned long long SQHash; /*should be the same size of a pointer*/ +#endif +typedef int SQInt32; +typedef unsigned int SQUnsignedInteger32; +#else +typedef int SQInteger; +typedef int SQInt32; /*must be 32 bits(also on 64bits processors)*/ +typedef unsigned int SQUnsignedInteger32; /*must be 32 bits(also on 64bits processors)*/ +typedef unsigned int SQUnsignedInteger; +typedef unsigned int SQHash; /*should be the same size of a pointer*/ +#endif + + +#ifdef SQUSEDOUBLE +typedef double SQFloat; +#else +typedef float SQFloat; +#endif + +#if defined(SQUSEDOUBLE) && !defined(_SQ64) || !defined(SQUSEDOUBLE) && defined(_SQ64) +#ifdef _MSC_VER +typedef __int64 SQRawObjectVal; //must be 64bits +#else +typedef long long SQRawObjectVal; //must be 64bits +#endif +#define SQ_OBJECT_RAWINIT() { _unVal.raw = 0; } +#else +typedef SQUnsignedInteger SQRawObjectVal; //is 32 bits on 32 bits builds and 64 bits otherwise +#define SQ_OBJECT_RAWINIT() +#endif + +#ifndef SQ_ALIGNMENT // SQ_ALIGNMENT shall be less than or equal to SQ_MALLOC alignments, and its value shall be power of 2. +#if defined(SQUSEDOUBLE) || defined(_SQ64) +#define SQ_ALIGNMENT 8 +#else +#define SQ_ALIGNMENT 4 +#endif +#endif + +typedef void* SQUserPointer; +typedef SQUnsignedInteger SQBool; +typedef SQInteger SQRESULT; + +#ifdef SQUNICODE +#include +#include + + +typedef wchar_t SQChar; + + +#define scstrcmp wcscmp +#ifdef _MSC_VER +#define scsprintf _snwprintf +#else +#define scsprintf snwprintf +#endif +#define scstrlen wcslen +#define scstrtod wcstod +#ifdef _SQ64 +#define scstrtol wcstoll +#else +#define scstrtol wcstol +#endif +#define scstrtoul wcstoul +#define scvsprintf vswprintf +#define scstrstr wcsstr +#define scprintf wprintf + +#ifdef _WIN32 +#define WCHAR_SIZE 2 +#define WCHAR_SHIFT_MUL 1 +#define MAX_CHAR 0xFFFF +#else +#define WCHAR_SIZE 4 +#define WCHAR_SHIFT_MUL 2 +#define MAX_CHAR 0xFFFFFFFF +#endif + +#define _SC(a) L##a + + +#define scisspace iswspace +#define scisdigit iswdigit +#define scisprint iswprint +#define scisxdigit iswxdigit +#define scisalpha iswalpha +#define sciscntrl iswcntrl +#define scisalnum iswalnum + + +#define sq_rsl(l) ((l)<=0) + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*_SQUIRREL_H_*/ diff --git a/samples/ackermann.nut b/samples/ackermann.nut new file mode 100644 index 0000000..8a165d9 --- /dev/null +++ b/samples/ackermann.nut @@ -0,0 +1,23 @@ +/* +* +* Original Javascript version by David Hedbor(http://www.bagley.org/~doug/shootout/) +* +*/ + +function Ack(M, N) { + if (M == 0) return( N + 1 ); + if (N == 0) return( Ack(M - 1, 1) ); + return( Ack(M - 1, Ack(M, (N - 1))) ); +} + +local n; + +if(vargv.len()!=0) { + n = vargv[0].tointeger(); + if(n < 1) n = 1; +} else { + n = 1; +} +print("n="+n+"\n"); +print("Ack(3,"+ n+ "):"+ Ack(3, n)); + diff --git a/samples/array.nut b/samples/array.nut new file mode 100644 index 0000000..97e0750 --- /dev/null +++ b/samples/array.nut @@ -0,0 +1,29 @@ +/* +* +* Original Javascript version by David Hedbor(http://www.bagley.org/~doug/shootout/) +* +*/ +local n, i, k; + +if(vargv.len()!=0) { + n = vargv[0].tointeger(); + if(n < 1) n = 1; +} else { + n = 1; +} + +local x = []; x.resize(n); +local y = []; y.resize(n); + +for (i = 0; i < n; i+=1) { + x[i] = i + 1; + y[i] = 0; +} + +for (k = 0 ; k < n; k+=1) { + for (i = n-1; i >= 0; i-=1) { + y[i] = y[i]+ x[i]; + } +} +print(y[0].tostring()+" "+y[n-1]); + diff --git a/samples/class.nut b/samples/class.nut new file mode 100644 index 0000000..3836031 --- /dev/null +++ b/samples/class.nut @@ -0,0 +1,49 @@ +////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////// +class BaseVector { + constructor(...) + { + if(vargv.len() >= 3) { + x = vargv[0]; + y = vargv[1]; + z = vargv[2]; + } + } + + + x = 0; + y = 0; + z = 0; +} + +class Vector3 extends BaseVector { + function _add(other) + { + if(other instanceof this.getclass()) + return ::Vector3(x+other.x,y+other.y,z+other.z); + else + throw "wrong parameter"; + } + function Print() + { + ::print(x+","+y+","+z+"\n"); + } +} + +local v0 = Vector3(1,2,3) +local v1 = Vector3(11,12,13) +local v2 = v0 + v1; +v2.Print(); + +FakeNamespace <- { + Utils = {} +} + +class FakeNamespace.Utils.SuperClass { + constructor() + { + ::print("FakeNamespace.Utils.SuperClass") + } +} + +local testy = FakeNamespace.Utils.SuperClass(); \ No newline at end of file diff --git a/samples/classattributes.nut b/samples/classattributes.nut new file mode 100644 index 0000000..d1ca5f4 --- /dev/null +++ b/samples/classattributes.nut @@ -0,0 +1,35 @@ +class Foo { + //constructor + constructor(a) + { + testy = ["stuff",1,2,3]; + } + //attributes of PrintTesty + + function PrintTesty() + { + foreach(i,val in testy) + { + ::print("idx = "+i+" = "+val+" \n"); + } + } + //attributes of testy + + testy = null; + +} + +foreach(member,val in Foo) +{ + ::print(member+"\n"); + local attr; + if((attr = Foo.getattributes(member)) != null) { + foreach(i,v in attr) + { + ::print("\t"+i+" = "+(typeof v)+"\n"); + } + } + else { + ::print("\t\n") + } +} \ No newline at end of file diff --git a/samples/coroutines.nut b/samples/coroutines.nut new file mode 100644 index 0000000..f8bcf3a --- /dev/null +++ b/samples/coroutines.nut @@ -0,0 +1,25 @@ +function coroutine_test(a,b) +{ + ::print(a+" "+b+"\n"); + local ret = ::suspend("suspend 1"); + ::print("the coroutine says "+ret+"\n"); + ret = ::suspend("suspend 2"); + ::print("the coroutine says "+ret+"\n"); + ret = ::suspend("suspend 3"); + ::print("the coroutine says "+ret+"\n"); + return "I'm done" +} + +local coro = ::newthread(coroutine_test); + +local susparam = coro.call("test","coroutine"); //starts the coroutine + +local i = 1; +do +{ + ::print("suspend passed ["+susparam+"]\n") + susparam = coro.wakeup("ciao "+i); + ++i; +}while(coro.getstatus()=="suspended") + +::print("return passed ["+susparam+"]\n") \ No newline at end of file diff --git a/samples/delegation.nut b/samples/delegation.nut new file mode 100644 index 0000000..2f5a1fa --- /dev/null +++ b/samples/delegation.nut @@ -0,0 +1,54 @@ + +PEntity <- { + name="noname" + pos={x=0,y=0,z=0} + type="entity" + //methamethod + _typeof=function() + { + return type; + } +} + +function PEntity::PrintPos() +{ + ::print("x="+pos.x+" y="+pos.y+" z="+pos.z+"\n"); +} + +function PEntity::new(name,pos) +{ + local newentity=clone ::PEntity; + if(name) + newentity.name=name; + if(pos) + newentity.pos=pos; + return newentity; +} + +PPlayer <- { + model="warrior.mdl" + weapon="fist" + health=100 + armor=0 + //overrides the parent type + type="player" +} + +function PPlayer::new(name,pos) +{ + local p = clone ::PPlayer; + local newplayer = ::PEntity.new(name,pos); + newplayer.setdelegate(p); + return newplayer; +} + +local player=PPlayer.new("godzilla",{x=10,y=20,z=30}); + +::print("PLAYER NAME"+player.name+"\n"); +::print("ENTITY TYPE"+typeof player+"\n"); + +player.PrintPos(); + +player.pos.x=123; + +player.PrintPos(); \ No newline at end of file diff --git a/samples/fibonacci.nut b/samples/fibonacci.nut new file mode 100644 index 0000000..be6dd50 --- /dev/null +++ b/samples/fibonacci.nut @@ -0,0 +1,15 @@ +/* +* +* Original Javascript version by David Hedbor(http://www.bagley.org/~doug/shootout/) +* +*/ + +function fib(n) +{ + if (n < 2) return 1 + return fib(n-2) + fib(n-1) +} + +local n = vargv.len()!=0?vargv[0].tointeger():1 + +print(fib(n)+"\n") diff --git a/samples/flow.nut b/samples/flow.nut new file mode 100644 index 0000000..45f4d10 --- /dev/null +++ b/samples/flow.nut @@ -0,0 +1,33 @@ +function min(x,y) + return xy?x:y; + +if(min(100,200)>max(50,20)) + print("I'm useless statement just to show up the if/else\n"); +else + print("squirrel!!\n"); + +print("\n") + +function typy(obj) +{ + switch(typeof obj) + { + case "integer": + case "float": + return "is a number"; + case "table": + case "array": + return "is a container"; + default: + return "is other stuff" + } +} + +local a=1,b={},c=function(a,b){return a+b;} + +print("a "+typy(a)+"\n"); +print("b "+typy(b)+"\n"); +print("c "+typy(c)+"\n"); \ No newline at end of file diff --git a/samples/generators.nut b/samples/generators.nut new file mode 100644 index 0000000..8548a6d --- /dev/null +++ b/samples/generators.nut @@ -0,0 +1,42 @@ +/* +*Random number function from The Great Computer Language shootout +*converted to a generator func +*/ + +function gen_random(max) { + local last=42 + local IM = 139968; + local IA = 3877; + local IC = 29573; + for(;;){ //loops forever + yield (max * (last = (last * IA + IC) % IM) / IM); + } +} + +local randtor=gen_random(100); + +print("RAND NUMBERS \n") + +for(local i=0;i<10;i+=1) + print(">"+resume randtor+"\n"); + +print("FIBONACCI \n") +function fiboz(n) +{ + local prev=0; + local curr=1; + yield 1; + + for(local i=0;i"+val+"\n"); +} \ No newline at end of file diff --git a/samples/hello.nut b/samples/hello.nut new file mode 100644 index 0000000..1dc45ac --- /dev/null +++ b/samples/hello.nut @@ -0,0 +1 @@ +print("Hello World!") \ No newline at end of file diff --git a/samples/list.nut b/samples/list.nut new file mode 100644 index 0000000..df6e02e --- /dev/null +++ b/samples/list.nut @@ -0,0 +1,40 @@ +/*translation of the list test from The Great Computer Language Shootout +*/ + +function compare_arr(a1,a2) +{ + foreach(i,val in a1) + if(val!=a2[i])return null; + return 1; +} + +function test() +{ + local size=10000 + local l1=[]; l1.resize(size); + for(local i=0;i0) + l3.append(l2.pop()); + while(l3.len()>0) + l2.append(l3.pop()); + l1.reverse(); + + if(compare_arr(l1,l2)) + return l1.len(); + return null; +} + +local n = vargv.len()!=0?vargv[0].tointeger():1 +for(local i=0;i\n"); +else + print("\n"); diff --git a/samples/methcall.nut b/samples/methcall.nut new file mode 100644 index 0000000..7fe9236 --- /dev/null +++ b/samples/methcall.nut @@ -0,0 +1,68 @@ +/*translation of the methcall test from The Great Computer Language Shootout +*/ + +class Toggle { + bool=null +} + +function Toggle::constructor(startstate) { + bool = startstate +} + +function Toggle::value() { + return bool; +} + +function Toggle::activate() { + bool = !bool; + return this; +} + +class NthToggle extends Toggle { + count_max=null + count=0 +} + +function NthToggle::constructor(start_state,max_counter) +{ + base.constructor(start_state); + count_max = max_counter +} + +function NthToggle::activate () +{ + ++count; + if (count >= count_max ) { + base.activate(); + count = 0; + } + return this; +} + + +function main() { + local n = vargv.len()!=0?vargv[0].tointeger():1 + + + + local val = 1; + local toggle = Toggle(val); + local i = n; + while(i--) { + val = toggle.activate().value(); + + } + print(toggle.value() ? "true\n" : "false\n"); + + val = 1; + local ntoggle = NthToggle(val, 3); + i = n; + while(i--) { + val = ntoggle.activate().value(); + } + print(ntoggle.value() ? "true\n" : "false\n"); + +} +local start=clock(); +main(); +print("TIME="+(clock()-start)+"\n"); \ No newline at end of file diff --git a/samples/tailstate.nut b/samples/tailstate.nut new file mode 100644 index 0000000..56829dd --- /dev/null +++ b/samples/tailstate.nut @@ -0,0 +1,24 @@ +function state1() +{ + ::suspend("state1"); + return state2(); +} + +function state2() +{ + ::suspend("state2"); + return state3(); +} + +function state3() +{ + ::suspend("state3"); + return state1(); +} + +local statethread = ::newthread(state1) + +::print(statethread.call()+"\n"); + +for(local i = 0; i < 10000; i++) + ::print(statethread.wakeup()+"\n"); diff --git a/sq/Makefile b/sq/Makefile new file mode 100644 index 0000000..3d0aff0 --- /dev/null +++ b/sq/Makefile @@ -0,0 +1,21 @@ +SQUIRREL= .. + + +OUT= $(SQUIRREL)/bin/sq +INCZ= -I$(SQUIRREL)/include -I. -I$(SQUIRREL)/sqlibs +LIBZ= -L$(SQUIRREL)/lib +LIB= -lsquirrel -lsqstdlib + +OBJS= sq.o + +SRCS= sq.c + + +sq32: + g++ -O2 -fno-exceptions -fno-rtti -o $(OUT) $(SRCS) $(INCZ) $(LIBZ) $(LIB) + +sqprof: + g++ -O2 -pg -fno-exceptions -fno-rtti -pie -gstabs -g3 -o $(OUT) $(SRCS) $(INCZ) $(LIBZ) $(LIB) + +sq64: + g++ -O2 -m64 -fno-exceptions -fno-rtti -D_SQ64 -o $(OUT) $(SRCS) $(INCZ) $(LIBZ) $(LIB) diff --git a/sq/sq.c b/sq/sq.c new file mode 100644 index 0000000..7994d2c --- /dev/null +++ b/sq/sq.c @@ -0,0 +1,350 @@ +/* see copyright notice in squirrel.h */ + +#include +#include +#include +#include + +#if defined(_MSC_VER) && defined(_DEBUG) +#include +#include +#endif +#include +#include +#include +#include +#include +#include +#include + +#ifdef SQUNICODE +#define scfprintf fwprintf +#define scvprintf vfwprintf +#else +#define scfprintf fprintf +#define scvprintf vfprintf +#endif + + +void PrintVersionInfos(); + +#if defined(_MSC_VER) && defined(_DEBUG) +int MemAllocHook( int allocType, void *userData, size_t size, int blockType, + long requestNumber, const unsigned char *filename, int lineNumber) +{ + //if(requestNumber==769)_asm int 3; + return 1; +} +#endif + + +SQInteger quit(HSQUIRRELVM v) +{ + int *done; + sq_getuserpointer(v,-1,(SQUserPointer*)&done); + *done=1; + return 0; +} + +void printfunc(HSQUIRRELVM v,const SQChar *s,...) +{ + va_list vl; + va_start(vl, s); + scvprintf(stdout, s, vl); + va_end(vl); +} + +void errorfunc(HSQUIRRELVM v,const SQChar *s,...) +{ + va_list vl; + va_start(vl, s); + scvprintf(stderr, s, vl); + va_end(vl); +} + +void PrintVersionInfos() +{ + scfprintf(stdout,_SC("%s %s (%d bits)\n"),SQUIRREL_VERSION,SQUIRREL_COPYRIGHT,((int)(sizeof(SQInteger)*8))); +} + +void PrintUsage() +{ + scfprintf(stderr,_SC("usage: sq .\n") + _SC("Available options are:\n") + _SC(" -c compiles the file to bytecode(default output 'out.cnut')\n") + _SC(" -o specifies output file for the -c option\n") + _SC(" -c compiles only\n") + _SC(" -d generates debug infos\n") + _SC(" -v displays version infos\n") + _SC(" -h prints help\n")); +} + +#define _INTERACTIVE 0 +#define _DONE 2 +#define _ERROR 3 +//<> this func is a mess +int getargs(HSQUIRRELVM v,int argc, char* argv[],SQInteger *retval) +{ + int i; + int compiles_only = 0; + static SQChar temp[500]; + const SQChar *ret=NULL; + char * output = NULL; + int lineinfo=0; + *retval = 0; + if(argc>1) + { + int arg=1,exitloop=0; + + while(arg < argc && !exitloop) + { + + if(argv[arg][0]=='-') + { + switch(argv[arg][1]) + { + case 'd': //DEBUG(debug infos) + sq_enabledebuginfo(v,1); + break; + case 'c': + compiles_only = 1; + break; + case 'o': + if(arg < argc) { + arg++; + output = argv[arg]; + } + break; + case 'v': + PrintVersionInfos(); + return _DONE; + + case 'h': + PrintVersionInfos(); + PrintUsage(); + return _DONE; + default: + PrintVersionInfos(); + scprintf(_SC("unknown prameter '-%c'\n"),argv[arg][1]); + PrintUsage(); + *retval = -1; + return _ERROR; + } + }else break; + arg++; + } + + // src file + + if(arg")); + for(;;) { + int c; + if(done)return; + c = getchar(); + if (c == _SC('\n')) { + if (i>0 && buffer[i-1] == _SC('\\')) + { + buffer[i-1] = _SC('\n'); + } + else if(blocks==0)break; + buffer[i++] = _SC('\n'); + } + else if (c==_SC('}')) {blocks--; buffer[i++] = (SQChar)c;} + else if(c==_SC('{') && !string){ + blocks++; + buffer[i++] = (SQChar)c; + } + else if(c==_SC('"') || c==_SC('\'')){ + string=!string; + buffer[i++] = (SQChar)c; + } + else if (i >= MAXINPUT-1) { + scfprintf(stderr, _SC("sq : input line too long\n")); + break; + } + else{ + buffer[i++] = (SQChar)c; + } + } + buffer[i] = _SC('\0'); + + if(buffer[0]==_SC('=')){ + scsprintf(sq_getscratchpad(v,MAXINPUT),(size_t)MAXINPUT,_SC("return (%s)"),&buffer[1]); + memcpy(buffer,sq_getscratchpad(v,-1),(scstrlen(sq_getscratchpad(v,-1))+1)*sizeof(SQChar)); + retval=1; + } + i=scstrlen(buffer); + if(i>0){ + SQInteger oldtop=sq_gettop(v); + if(SQ_SUCCEEDED(sq_compilebuffer(v,buffer,i,_SC("interactive console"),SQTrue))){ + sq_pushroottable(v); + if(SQ_SUCCEEDED(sq_call(v,1,retval,SQTrue)) && retval){ + scprintf(_SC("\n")); + sq_pushroottable(v); + sq_pushstring(v,_SC("print"),-1); + sq_get(v,-2); + sq_pushroottable(v); + sq_push(v,-4); + sq_call(v,2,SQFalse,SQTrue); + retval=0; + scprintf(_SC("\n")); + } + } + + sq_settop(v,oldtop); + } + } +} + +int main(int argc, char* argv[]) +{ + HSQUIRRELVM v; + SQInteger retval = 0; + const SQChar *filename=NULL; +#if defined(_MSC_VER) && defined(_DEBUG) + _CrtSetAllocHook(MemAllocHook); +#endif + + v=sq_open(1024); + sq_setprintfunc(v,printfunc,errorfunc); + + sq_pushroottable(v); + + sqstd_register_bloblib(v); + sqstd_register_iolib(v); + sqstd_register_systemlib(v); + sqstd_register_mathlib(v); + sqstd_register_stringlib(v); + + //aux library + //sets error handlers + sqstd_seterrorhandlers(v); + + //gets arguments + switch(getargs(v,argc,argv,&retval)) + { + case _INTERACTIVE: + Interactive(v); + break; + case _DONE: + case _ERROR: + default: + break; + } + + sq_close(v); + +#if defined(_MSC_VER) && defined(_DEBUG) + _getch(); + _CrtMemDumpAllObjectsSince( NULL ); +#endif + return retval; +} + diff --git a/sq/sq.dsp b/sq/sq.dsp new file mode 100644 index 0000000..0234f8c --- /dev/null +++ b/sq/sq.dsp @@ -0,0 +1,101 @@ +# Microsoft Developer Studio Project File - Name="sq" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Console Application" 0x0103 + +CFG=sq - Win32 Debug +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "sq.mak". +!MESSAGE +!MESSAGE You can specify a configuration when running NMAKE +!MESSAGE by defining the macro CFG on the command line. For example: +!MESSAGE +!MESSAGE NMAKE /f "sq.mak" CFG="sq - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "sq - Win32 Release" (based on "Win32 (x86) Console Application") +!MESSAGE "sq - Win32 Debug" (based on "Win32 (x86) Console Application") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_LocalPath ".." +CPP=cl.exe +RSC=rc.exe + +!IF "$(CFG)" == "sq - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release" +# PROP Intermediate_Dir "Release" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c +# ADD CPP /nologo /W3 /GX /O2 /I "..\include" /I "..\sqstdlib" /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c +# ADD BASE RSC /l 0x410 /d "NDEBUG" +# ADD RSC /l 0x410 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 +# ADD LINK32 squirrel.lib sqstdlib.lib /nologo /subsystem:console /machine:I386 /out:"../bin/sq.exe" /libpath:"../lib" + +!ELSEIF "$(CFG)" == "sq - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "Debug" +# PROP BASE Intermediate_Dir "Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "Debug" +# PROP Intermediate_Dir "Debug" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c +# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /I "..\include" /I "..\sqstdlib" /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c +# ADD BASE RSC /l 0x410 /d "_DEBUG" +# ADD RSC /l 0x410 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept +# ADD LINK32 squirrel.lib sqstdlib.lib /nologo /subsystem:console /debug /machine:I386 /out:"../bin/sq.exe" /pdbtype:sept /libpath:"../lib" + +!ENDIF + +# Begin Target + +# Name "sq - Win32 Release" +# Name "sq - Win32 Debug" +# Begin Group "Source Files" + +# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" +# Begin Source File + +SOURCE=.\sq.c +# End Source File +# End Group +# Begin Group "Header Files" + +# PROP Default_Filter "h;hpp;hxx;hm;inl" +# End Group +# Begin Group "Resource Files" + +# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" +# End Group +# End Target +# End Project diff --git a/sqstdlib/Makefile b/sqstdlib/Makefile new file mode 100644 index 0000000..10f6384 --- /dev/null +++ b/sqstdlib/Makefile @@ -0,0 +1,41 @@ +SQUIRREL= .. + + +OUT= $(SQUIRREL)/lib/libsqstdlib.a +INCZ= -I$(SQUIRREL)/include -I. -Iinclude + +OBJS= \ + sqstdblob.o \ + sqstdio.o \ + sqstdstream.o \ + sqstdmath.o \ + sqstdsystem.o \ + sqstdstring.o \ + sqstdaux.o \ + sqstdrex.o + +SRCS= \ + sqstdblob.cpp \ + sqstdio.cpp \ + sqstdstream.cpp \ + sqstdmath.cpp \ + sqstdsystem.cpp \ + sqstdstring.cpp \ + sqstdaux.cpp \ + sqstdrex.cpp + + +sq32: + gcc -O2 -fno-exceptions -fno-rtti -Wall -fno-strict-aliasing -c $(SRCS) $(INCZ) + ar rc $(OUT) *.o + rm *.o + +sqprof: + gcc -O2 -pg -fno-exceptions -fno-rtti -pie -gstabs -g3 -Wall -fno-strict-aliasing -c $(SRCS) $(INCZ) + ar rc $(OUT) *.o + rm *.o + +sq64: + gcc -O2 -m64 -fno-exceptions -D_SQ64 -fno-rtti -Wall -fno-strict-aliasing -c $(SRCS) $(INCZ) + ar rc $(OUT) *.o + rm *.o diff --git a/sqstdlib/sqstdaux.cpp b/sqstdlib/sqstdaux.cpp new file mode 100644 index 0000000..0ec4c50 --- /dev/null +++ b/sqstdlib/sqstdaux.cpp @@ -0,0 +1,130 @@ +/* see copyright notice in squirrel.h */ +#include +#include +#include + +void sqstd_printcallstack(HSQUIRRELVM v) +{ + SQPRINTFUNCTION pf = sq_geterrorfunc(v); + if(pf) { + SQStackInfos si; + SQInteger i; + SQFloat f; + const SQChar *s; + SQInteger level=1; //1 is to skip this function that is level 0 + const SQChar *name=0; + SQInteger seq=0; + pf(v,_SC("\nCALLSTACK\n")); + while(SQ_SUCCEEDED(sq_stackinfos(v,level,&si))) + { + const SQChar *fn=_SC("unknown"); + const SQChar *src=_SC("unknown"); + if(si.funcname)fn=si.funcname; + if(si.source)src=si.source; + pf(v,_SC("*FUNCTION [%s()] %s line [%d]\n"),fn,src,si.line); + level++; + } + level=0; + pf(v,_SC("\nLOCALS\n")); + + for(level=0;level<10;level++){ + seq=0; + while((name = sq_getlocal(v,level,seq))) + { + seq++; + switch(sq_gettype(v,-1)) + { + case OT_NULL: + pf(v,_SC("[%s] NULL\n"),name); + break; + case OT_INTEGER: + sq_getinteger(v,-1,&i); + pf(v,_SC("[%s] %d\n"),name,i); + break; + case OT_FLOAT: + sq_getfloat(v,-1,&f); + pf(v,_SC("[%s] %.14g\n"),name,f); + break; + case OT_USERPOINTER: + pf(v,_SC("[%s] USERPOINTER\n"),name); + break; + case OT_STRING: + sq_getstring(v,-1,&s); + pf(v,_SC("[%s] \"%s\"\n"),name,s); + break; + case OT_TABLE: + pf(v,_SC("[%s] TABLE\n"),name); + break; + case OT_ARRAY: + pf(v,_SC("[%s] ARRAY\n"),name); + break; + case OT_CLOSURE: + pf(v,_SC("[%s] CLOSURE\n"),name); + break; + case OT_NATIVECLOSURE: + pf(v,_SC("[%s] NATIVECLOSURE\n"),name); + break; + case OT_GENERATOR: + pf(v,_SC("[%s] GENERATOR\n"),name); + break; + case OT_USERDATA: + pf(v,_SC("[%s] USERDATA\n"),name); + break; + case OT_THREAD: + pf(v,_SC("[%s] THREAD\n"),name); + break; + case OT_CLASS: + pf(v,_SC("[%s] CLASS\n"),name); + break; + case OT_INSTANCE: + pf(v,_SC("[%s] INSTANCE\n"),name); + break; + case OT_WEAKREF: + pf(v,_SC("[%s] WEAKREF\n"),name); + break; + case OT_BOOL:{ + SQBool bval; + sq_getbool(v,-1,&bval); + pf(v,_SC("[%s] %s\n"),name,bval == SQTrue ? _SC("true"):_SC("false")); + } + break; + default: assert(0); break; + } + sq_pop(v,1); + } + } + } +} + +static SQInteger _sqstd_aux_printerror(HSQUIRRELVM v) +{ + SQPRINTFUNCTION pf = sq_geterrorfunc(v); + if(pf) { + const SQChar *sErr = 0; + if(sq_gettop(v)>=1) { + if(SQ_SUCCEEDED(sq_getstring(v,2,&sErr))) { + pf(v,_SC("\nAN ERROR HAS OCCURED [%s]\n"),sErr); + } + else{ + pf(v,_SC("\nAN ERROR HAS OCCURED [unknown]\n")); + } + sqstd_printcallstack(v); + } + } + return 0; +} + +void _sqstd_compiler_error(HSQUIRRELVM v,const SQChar *sErr,const SQChar *sSource,SQInteger line,SQInteger column) +{ + SQPRINTFUNCTION pf = sq_geterrorfunc(v); + if(pf) { + pf(v,_SC("%s line = (%d) column = (%d) : error %s\n"),sSource,line,column,sErr); + } +} + +void sqstd_seterrorhandlers(HSQUIRRELVM v) +{ + sq_setcompilererrorhandler(v,_sqstd_compiler_error); + sq_newclosure(v,_sqstd_aux_printerror,0); + sq_seterrorhandler(v); +} diff --git a/sqstdlib/sqstdblob.cpp b/sqstdlib/sqstdblob.cpp new file mode 100644 index 0000000..59cff0d --- /dev/null +++ b/sqstdlib/sqstdblob.cpp @@ -0,0 +1,277 @@ +/* see copyright notice in squirrel.h */ +#include +#include +#include +#include +#include +#include "sqstdstream.h" +#include "sqstdblobimpl.h" + +#define SQSTD_BLOB_TYPE_TAG (SQSTD_STREAM_TYPE_TAG | 0x00000002) + +//Blob + + +#define SETUP_BLOB(v) \ + SQBlob *self = NULL; \ + { if(SQ_FAILED(sq_getinstanceup(v,1,(SQUserPointer*)&self,(SQUserPointer)SQSTD_BLOB_TYPE_TAG))) \ + return sq_throwerror(v,_SC("invalid type tag")); } \ + if(!self || !self->IsValid()) \ + return sq_throwerror(v,_SC("the blob is invalid")); + + +static SQInteger _blob_resize(HSQUIRRELVM v) +{ + SETUP_BLOB(v); + SQInteger size; + sq_getinteger(v,2,&size); + if(!self->Resize(size)) + return sq_throwerror(v,_SC("resize failed")); + return 0; +} + +static void __swap_dword(unsigned int *n) +{ + *n=(unsigned int)(((*n&0xFF000000)>>24) | + ((*n&0x00FF0000)>>8) | + ((*n&0x0000FF00)<<8) | + ((*n&0x000000FF)<<24)); +} + +static void __swap_word(unsigned short *n) +{ + *n=(unsigned short)((*n>>8)&0x00FF)| ((*n<<8)&0xFF00); +} + +static SQInteger _blob_swap4(HSQUIRRELVM v) +{ + SETUP_BLOB(v); + SQInteger num=(self->Len()-(self->Len()%4))>>2; + unsigned int *t=(unsigned int *)self->GetBuf(); + for(SQInteger i = 0; i < num; i++) { + __swap_dword(&t[i]); + } + return 0; +} + +static SQInteger _blob_swap2(HSQUIRRELVM v) +{ + SETUP_BLOB(v); + SQInteger num=(self->Len()-(self->Len()%2))>>1; + unsigned short *t = (unsigned short *)self->GetBuf(); + for(SQInteger i = 0; i < num; i++) { + __swap_word(&t[i]); + } + return 0; +} + +static SQInteger _blob__set(HSQUIRRELVM v) +{ + SETUP_BLOB(v); + SQInteger idx,val; + sq_getinteger(v,2,&idx); + sq_getinteger(v,3,&val); + if(idx < 0 || idx >= self->Len()) + return sq_throwerror(v,_SC("index out of range")); + ((unsigned char *)self->GetBuf())[idx] = (unsigned char) val; + sq_push(v,3); + return 1; +} + +static SQInteger _blob__get(HSQUIRRELVM v) +{ + SETUP_BLOB(v); + SQInteger idx; + sq_getinteger(v,2,&idx); + if(idx < 0 || idx >= self->Len()) + return sq_throwerror(v,_SC("index out of range")); + sq_pushinteger(v,((unsigned char *)self->GetBuf())[idx]); + return 1; +} + +static SQInteger _blob__nexti(HSQUIRRELVM v) +{ + SETUP_BLOB(v); + if(sq_gettype(v,2) == OT_NULL) { + sq_pushinteger(v, 0); + return 1; + } + SQInteger idx; + if(SQ_SUCCEEDED(sq_getinteger(v, 2, &idx))) { + if(idx+1 < self->Len()) { + sq_pushinteger(v, idx+1); + return 1; + } + sq_pushnull(v); + return 1; + } + return sq_throwerror(v,_SC("internal error (_nexti) wrong argument type")); +} + +static SQInteger _blob__typeof(HSQUIRRELVM v) +{ + sq_pushstring(v,_SC("blob"),-1); + return 1; +} + +static SQInteger _blob_releasehook(SQUserPointer p, SQInteger size) +{ + SQBlob *self = (SQBlob*)p; + self->~SQBlob(); + sq_free(self,sizeof(SQBlob)); + return 1; +} + +static SQInteger _blob_constructor(HSQUIRRELVM v) +{ + SQInteger nparam = sq_gettop(v); + SQInteger size = 0; + if(nparam == 2) { + sq_getinteger(v, 2, &size); + } + if(size < 0) return sq_throwerror(v, _SC("cannot create blob with negative size")); + //SQBlob *b = new SQBlob(size); + + SQBlob *b = new (sq_malloc(sizeof(SQBlob)))SQBlob(size); + if(SQ_FAILED(sq_setinstanceup(v,1,b))) { + b->~SQBlob(); + sq_free(b,sizeof(SQBlob)); + return sq_throwerror(v, _SC("cannot create blob")); + } + sq_setreleasehook(v,1,_blob_releasehook); + return 0; +} + +static SQInteger _blob__cloned(HSQUIRRELVM v) +{ + SQBlob *other = NULL; + { + if(SQ_FAILED(sq_getinstanceup(v,2,(SQUserPointer*)&other,(SQUserPointer)SQSTD_BLOB_TYPE_TAG))) + return SQ_ERROR; + } + //SQBlob *thisone = new SQBlob(other->Len()); + SQBlob *thisone = new (sq_malloc(sizeof(SQBlob)))SQBlob(other->Len()); + memcpy(thisone->GetBuf(),other->GetBuf(),thisone->Len()); + if(SQ_FAILED(sq_setinstanceup(v,1,thisone))) { + thisone->~SQBlob(); + sq_free(thisone,sizeof(SQBlob)); + return sq_throwerror(v, _SC("cannot clone blob")); + } + sq_setreleasehook(v,1,_blob_releasehook); + return 0; +} + +#define _DECL_BLOB_FUNC(name,nparams,typecheck) {_SC(#name),_blob_##name,nparams,typecheck} +static SQRegFunction _blob_methods[] = { + _DECL_BLOB_FUNC(constructor,-1,_SC("xn")), + _DECL_BLOB_FUNC(resize,2,_SC("xn")), + _DECL_BLOB_FUNC(swap2,1,_SC("x")), + _DECL_BLOB_FUNC(swap4,1,_SC("x")), + _DECL_BLOB_FUNC(_set,3,_SC("xnn")), + _DECL_BLOB_FUNC(_get,2,_SC("xn")), + _DECL_BLOB_FUNC(_typeof,1,_SC("x")), + _DECL_BLOB_FUNC(_nexti,2,_SC("x")), + _DECL_BLOB_FUNC(_cloned,2,_SC("xx")), + {0,0,0,0} +}; + + + +//GLOBAL FUNCTIONS + +static SQInteger _g_blob_casti2f(HSQUIRRELVM v) +{ + SQInteger i; + sq_getinteger(v,2,&i); + sq_pushfloat(v,*((SQFloat *)&i)); + return 1; +} + +static SQInteger _g_blob_castf2i(HSQUIRRELVM v) +{ + SQFloat f; + sq_getfloat(v,2,&f); + sq_pushinteger(v,*((SQInteger *)&f)); + return 1; +} + +static SQInteger _g_blob_swap2(HSQUIRRELVM v) +{ + SQInteger i; + sq_getinteger(v,2,&i); + short s=(short)i; + sq_pushinteger(v,(s<<8)|((s>>8)&0x00FF)); + return 1; +} + +static SQInteger _g_blob_swap4(HSQUIRRELVM v) +{ + SQInteger i; + sq_getinteger(v,2,&i); + unsigned int t4 = (unsigned int)i; + __swap_dword(&t4); + sq_pushinteger(v,(SQInteger)t4); + return 1; +} + +static SQInteger _g_blob_swapfloat(HSQUIRRELVM v) +{ + SQFloat f; + sq_getfloat(v,2,&f); + __swap_dword((unsigned int *)&f); + sq_pushfloat(v,f); + return 1; +} + +#define _DECL_GLOBALBLOB_FUNC(name,nparams,typecheck) {_SC(#name),_g_blob_##name,nparams,typecheck} +static SQRegFunction bloblib_funcs[]={ + _DECL_GLOBALBLOB_FUNC(casti2f,2,_SC(".n")), + _DECL_GLOBALBLOB_FUNC(castf2i,2,_SC(".n")), + _DECL_GLOBALBLOB_FUNC(swap2,2,_SC(".n")), + _DECL_GLOBALBLOB_FUNC(swap4,2,_SC(".n")), + _DECL_GLOBALBLOB_FUNC(swapfloat,2,_SC(".n")), + {0,0} +}; + +SQRESULT sqstd_getblob(HSQUIRRELVM v,SQInteger idx,SQUserPointer *ptr) +{ + SQBlob *blob; + if(SQ_FAILED(sq_getinstanceup(v,idx,(SQUserPointer *)&blob,(SQUserPointer)SQSTD_BLOB_TYPE_TAG))) + return -1; + *ptr = blob->GetBuf(); + return SQ_OK; +} + +SQInteger sqstd_getblobsize(HSQUIRRELVM v,SQInteger idx) +{ + SQBlob *blob; + if(SQ_FAILED(sq_getinstanceup(v,idx,(SQUserPointer *)&blob,(SQUserPointer)SQSTD_BLOB_TYPE_TAG))) + return -1; + return blob->Len(); +} + +SQUserPointer sqstd_createblob(HSQUIRRELVM v, SQInteger size) +{ + SQInteger top = sq_gettop(v); + sq_pushregistrytable(v); + sq_pushstring(v,_SC("std_blob"),-1); + if(SQ_SUCCEEDED(sq_get(v,-2))) { + sq_remove(v,-2); //removes the registry + sq_push(v,1); // push the this + sq_pushinteger(v,size); //size + SQBlob *blob = NULL; + if(SQ_SUCCEEDED(sq_call(v,2,SQTrue,SQFalse)) + && SQ_SUCCEEDED(sq_getinstanceup(v,-1,(SQUserPointer *)&blob,(SQUserPointer)SQSTD_BLOB_TYPE_TAG))) { + sq_remove(v,-2); + return blob->GetBuf(); + } + } + sq_settop(v,top); + return NULL; +} + +SQRESULT sqstd_register_bloblib(HSQUIRRELVM v) +{ + return declare_stream(v,_SC("blob"),(SQUserPointer)SQSTD_BLOB_TYPE_TAG,_SC("std_blob"),_blob_methods,bloblib_funcs); +} + diff --git a/sqstdlib/sqstdblobimpl.h b/sqstdlib/sqstdblobimpl.h new file mode 100644 index 0000000..b2291b7 --- /dev/null +++ b/sqstdlib/sqstdblobimpl.h @@ -0,0 +1,108 @@ +/* see copyright notice in squirrel.h */ +#ifndef _SQSTD_BLOBIMPL_H_ +#define _SQSTD_BLOBIMPL_H_ + +struct SQBlob : public SQStream +{ + SQBlob(SQInteger size) { + _size = size; + _allocated = size; + _buf = (unsigned char *)sq_malloc(size); + memset(_buf, 0, _size); + _ptr = 0; + _owns = true; + } + virtual ~SQBlob() { + sq_free(_buf, _allocated); + } + SQInteger Write(void *buffer, SQInteger size) { + if(!CanAdvance(size)) { + GrowBufOf(_ptr + size - _size); + } + memcpy(&_buf[_ptr], buffer, size); + _ptr += size; + return size; + } + SQInteger Read(void *buffer,SQInteger size) { + SQInteger n = size; + if(!CanAdvance(size)) { + if((_size - _ptr) > 0) + n = _size - _ptr; + else return 0; + } + memcpy(buffer, &_buf[_ptr], n); + _ptr += n; + return n; + } + bool Resize(SQInteger n) { + if(!_owns) return false; + if(n != _allocated) { + unsigned char *newbuf = (unsigned char *)sq_malloc(n); + memset(newbuf,0,n); + if(_size > n) + memcpy(newbuf,_buf,n); + else + memcpy(newbuf,_buf,_size); + sq_free(_buf,_allocated); + _buf=newbuf; + _allocated = n; + if(_size > _allocated) + _size = _allocated; + if(_ptr > _allocated) + _ptr = _allocated; + } + return true; + } + bool GrowBufOf(SQInteger n) + { + bool ret = true; + if(_size + n > _allocated) { + if(_size + n > _size * 2) + ret = Resize(_size + n); + else + ret = Resize(_size * 2); + } + _size = _size + n; + return ret; + } + bool CanAdvance(SQInteger n) { + if(_ptr+n>_size)return false; + return true; + } + SQInteger Seek(SQInteger offset, SQInteger origin) { + switch(origin) { + case SQ_SEEK_SET: + if(offset > _size || offset < 0) return -1; + _ptr = offset; + break; + case SQ_SEEK_CUR: + if(_ptr + offset > _size || _ptr + offset < 0) return -1; + _ptr += offset; + break; + case SQ_SEEK_END: + if(_size + offset > _size || _size + offset < 0) return -1; + _ptr = _size + offset; + break; + default: return -1; + } + return 0; + } + bool IsValid() { + return _buf?true:false; + } + bool EOS() { + return _ptr == _size; + } + SQInteger Flush() { return 0; } + SQInteger Tell() { return _ptr; } + SQInteger Len() { return _size; } + SQUserPointer GetBuf(){ return _buf; } +private: + SQInteger _size; + SQInteger _allocated; + SQInteger _ptr; + unsigned char *_buf; + bool _owns; +}; + +#endif //_SQSTD_BLOBIMPL_H_ diff --git a/sqstdlib/sqstdio.cpp b/sqstdlib/sqstdio.cpp new file mode 100644 index 0000000..a246bfd --- /dev/null +++ b/sqstdlib/sqstdio.cpp @@ -0,0 +1,485 @@ +/* see copyright notice in squirrel.h */ +#include +#include +#include +#include +#include "sqstdstream.h" + +#define SQSTD_FILE_TYPE_TAG (SQSTD_STREAM_TYPE_TAG | 0x00000001) +//basic API +SQFILE sqstd_fopen(const SQChar *filename ,const SQChar *mode) +{ +#ifndef SQUNICODE + return (SQFILE)fopen(filename,mode); +#else + return (SQFILE)_wfopen(filename,mode); +#endif +} + +SQInteger sqstd_fread(void* buffer, SQInteger size, SQInteger count, SQFILE file) +{ + SQInteger ret = (SQInteger)fread(buffer,size,count,(FILE *)file); + return ret; +} + +SQInteger sqstd_fwrite(const SQUserPointer buffer, SQInteger size, SQInteger count, SQFILE file) +{ + return (SQInteger)fwrite(buffer,size,count,(FILE *)file); +} + +SQInteger sqstd_fseek(SQFILE file, SQInteger offset, SQInteger origin) +{ + SQInteger realorigin; + switch(origin) { + case SQ_SEEK_CUR: realorigin = SEEK_CUR; break; + case SQ_SEEK_END: realorigin = SEEK_END; break; + case SQ_SEEK_SET: realorigin = SEEK_SET; break; + default: return -1; //failed + } + return fseek((FILE *)file,(long)offset,(int)realorigin); +} + +SQInteger sqstd_ftell(SQFILE file) +{ + return ftell((FILE *)file); +} + +SQInteger sqstd_fflush(SQFILE file) +{ + return fflush((FILE *)file); +} + +SQInteger sqstd_fclose(SQFILE file) +{ + return fclose((FILE *)file); +} + +SQInteger sqstd_feof(SQFILE file) +{ + return feof((FILE *)file); +} + +//File +struct SQFile : public SQStream { + SQFile() { _handle = NULL; _owns = false;} + SQFile(SQFILE file, bool owns) { _handle = file; _owns = owns;} + virtual ~SQFile() { Close(); } + bool Open(const SQChar *filename ,const SQChar *mode) { + Close(); + if( (_handle = sqstd_fopen(filename,mode)) ) { + _owns = true; + return true; + } + return false; + } + void Close() { + if(_handle && _owns) { + sqstd_fclose(_handle); + _handle = NULL; + _owns = false; + } + } + SQInteger Read(void *buffer,SQInteger size) { + return sqstd_fread(buffer,1,size,_handle); + } + SQInteger Write(void *buffer,SQInteger size) { + return sqstd_fwrite(buffer,1,size,_handle); + } + SQInteger Flush() { + return sqstd_fflush(_handle); + } + SQInteger Tell() { + return sqstd_ftell(_handle); + } + SQInteger Len() { + SQInteger prevpos=Tell(); + Seek(0,SQ_SEEK_END); + SQInteger size=Tell(); + Seek(prevpos,SQ_SEEK_SET); + return size; + } + SQInteger Seek(SQInteger offset, SQInteger origin) { + return sqstd_fseek(_handle,offset,origin); + } + bool IsValid() { return _handle?true:false; } + bool EOS() { return Tell()==Len()?true:false;} + SQFILE GetHandle() {return _handle;} +private: + SQFILE _handle; + bool _owns; +}; + +static SQInteger _file__typeof(HSQUIRRELVM v) +{ + sq_pushstring(v,_SC("file"),-1); + return 1; +} + +static SQInteger _file_releasehook(SQUserPointer p, SQInteger size) +{ + SQFile *self = (SQFile*)p; + self->~SQFile(); + sq_free(self,sizeof(SQFile)); + return 1; +} + +static SQInteger _file_constructor(HSQUIRRELVM v) +{ + const SQChar *filename,*mode; + bool owns = true; + SQFile *f; + SQFILE newf; + if(sq_gettype(v,2) == OT_STRING && sq_gettype(v,3) == OT_STRING) { + sq_getstring(v, 2, &filename); + sq_getstring(v, 3, &mode); + newf = sqstd_fopen(filename, mode); + if(!newf) return sq_throwerror(v, _SC("cannot open file")); + } else if(sq_gettype(v,2) == OT_USERPOINTER) { + owns = !(sq_gettype(v,3) == OT_NULL); + sq_getuserpointer(v,2,&newf); + } else { + return sq_throwerror(v,_SC("wrong parameter")); + } + + f = new (sq_malloc(sizeof(SQFile)))SQFile(newf,owns); + if(SQ_FAILED(sq_setinstanceup(v,1,f))) { + f->~SQFile(); + sq_free(f,sizeof(SQFile)); + return sq_throwerror(v, _SC("cannot create blob with negative size")); + } + sq_setreleasehook(v,1,_file_releasehook); + return 0; +} + +static SQInteger _file_close(HSQUIRRELVM v) +{ + SQFile *self = NULL; + if(SQ_SUCCEEDED(sq_getinstanceup(v,1,(SQUserPointer*)&self,(SQUserPointer)SQSTD_FILE_TYPE_TAG)) + && self != NULL) + { + self->Close(); + } + return 0; +} + +//bindings +#define _DECL_FILE_FUNC(name,nparams,typecheck) {_SC(#name),_file_##name,nparams,typecheck} +static SQRegFunction _file_methods[] = { + _DECL_FILE_FUNC(constructor,3,_SC("x")), + _DECL_FILE_FUNC(_typeof,1,_SC("x")), + _DECL_FILE_FUNC(close,1,_SC("x")), + {0,0,0,0}, +}; + + + +SQRESULT sqstd_createfile(HSQUIRRELVM v, SQFILE file,SQBool own) +{ + SQInteger top = sq_gettop(v); + sq_pushregistrytable(v); + sq_pushstring(v,_SC("std_file"),-1); + if(SQ_SUCCEEDED(sq_get(v,-2))) { + sq_remove(v,-2); //removes the registry + sq_pushroottable(v); // push the this + sq_pushuserpointer(v,file); //file + if(own){ + sq_pushinteger(v,1); //true + } + else{ + sq_pushnull(v); //false + } + if(SQ_SUCCEEDED( sq_call(v,3,SQTrue,SQFalse) )) { + sq_remove(v,-2); + return SQ_OK; + } + } + sq_settop(v,top); + return SQ_ERROR; +} + +SQRESULT sqstd_getfile(HSQUIRRELVM v, SQInteger idx, SQFILE *file) +{ + SQFile *fileobj = NULL; + if(SQ_SUCCEEDED(sq_getinstanceup(v,idx,(SQUserPointer*)&fileobj,(SQUserPointer)SQSTD_FILE_TYPE_TAG))) { + *file = fileobj->GetHandle(); + return SQ_OK; + } + return sq_throwerror(v,_SC("not a file")); +} + + + +#define IO_BUFFER_SIZE 2048 +struct IOBuffer { + unsigned char buffer[IO_BUFFER_SIZE]; + SQInteger size; + SQInteger ptr; + SQFILE file; +}; + +SQInteger _read_byte(IOBuffer *iobuffer) +{ + if(iobuffer->ptr < iobuffer->size) { + + SQInteger ret = iobuffer->buffer[iobuffer->ptr]; + iobuffer->ptr++; + return ret; + } + else { + if( (iobuffer->size = sqstd_fread(iobuffer->buffer,1,IO_BUFFER_SIZE,iobuffer->file )) > 0 ) + { + SQInteger ret = iobuffer->buffer[0]; + iobuffer->ptr = 1; + return ret; + } + } + + return 0; +} + +SQInteger _read_two_bytes(IOBuffer *iobuffer) +{ + if(iobuffer->ptr < iobuffer->size) { + if(iobuffer->size < 2) return 0; + SQInteger ret = *((wchar_t*)&iobuffer->buffer[iobuffer->ptr]); + iobuffer->ptr += 2; + return ret; + } + else { + if( (iobuffer->size = sqstd_fread(iobuffer->buffer,1,IO_BUFFER_SIZE,iobuffer->file )) > 0 ) + { + if(iobuffer->size < 2) return 0; + SQInteger ret = *((wchar_t*)&iobuffer->buffer[0]); + iobuffer->ptr = 2; + return ret; + } + } + + return 0; +} + +static SQInteger _io_file_lexfeed_PLAIN(SQUserPointer iobuf) +{ + IOBuffer *iobuffer = (IOBuffer *)iobuf; + return _read_byte(iobuffer); + +} + +#ifdef SQUNICODE +static SQInteger _io_file_lexfeed_UTF8(SQUserPointer iobuf) +{ + IOBuffer *iobuffer = (IOBuffer *)iobuf; +#define READ(iobuf) \ + if((inchar = (unsigned char)_read_byte(iobuf)) == 0) \ + return 0; + + static const SQInteger utf8_lengths[16] = + { + 1,1,1,1,1,1,1,1, /* 0000 to 0111 : 1 byte (plain ASCII) */ + 0,0,0,0, /* 1000 to 1011 : not valid */ + 2,2, /* 1100, 1101 : 2 bytes */ + 3, /* 1110 : 3 bytes */ + 4 /* 1111 :4 bytes */ + }; + static unsigned char byte_masks[5] = {0,0,0x1f,0x0f,0x07}; + unsigned char inchar; + SQInteger c = 0; + READ(iobuffer); + c = inchar; + // + if(c >= 0x80) { + SQInteger tmp; + SQInteger codelen = utf8_lengths[c>>4]; + if(codelen == 0) + return 0; + //"invalid UTF-8 stream"; + tmp = c&byte_masks[codelen]; + for(SQInteger n = 0; n < codelen-1; n++) { + tmp<<=6; + READ(iobuffer); + tmp |= inchar & 0x3F; + } + c = tmp; + } + return c; +} +#endif + +static SQInteger _io_file_lexfeed_UCS2_LE(SQUserPointer iobuf) +{ + SQInteger ret; + IOBuffer *iobuffer = (IOBuffer *)iobuf; + if( (ret = _read_two_bytes(iobuffer)) > 0 ) + return ret; + return 0; +} + +static SQInteger _io_file_lexfeed_UCS2_BE(SQUserPointer iobuf) +{ + SQInteger c; + IOBuffer *iobuffer = (IOBuffer *)iobuf; + if( (c = _read_two_bytes(iobuffer)) > 0 ) { + c = ((c>>8)&0x00FF)| ((c<<8)&0xFF00); + return c; + } + return 0; +} + +SQInteger file_read(SQUserPointer file,SQUserPointer buf,SQInteger size) +{ + SQInteger ret; + if( ( ret = sqstd_fread(buf,1,size,(SQFILE)file ))!=0 )return ret; + return -1; +} + +SQInteger file_write(SQUserPointer file,SQUserPointer p,SQInteger size) +{ + return sqstd_fwrite(p,1,size,(SQFILE)file); +} + +SQRESULT sqstd_loadfile(HSQUIRRELVM v,const SQChar *filename,SQBool printerror) +{ + SQFILE file = sqstd_fopen(filename,_SC("rb")); + + SQInteger ret; + unsigned short us; + unsigned char uc; + SQLEXREADFUNC func = _io_file_lexfeed_PLAIN; + if(file){ + ret = sqstd_fread(&us,1,2,file); + if(ret != 2) { + //probably an empty file + us = 0; + } + if(us == SQ_BYTECODE_STREAM_TAG) { //BYTECODE + sqstd_fseek(file,0,SQ_SEEK_SET); + if(SQ_SUCCEEDED(sq_readclosure(v,file_read,file))) { + sqstd_fclose(file); + return SQ_OK; + } + } + else { //SCRIPT + + switch(us) + { + //gotta swap the next 2 lines on BIG endian machines + case 0xFFFE: func = _io_file_lexfeed_UCS2_BE; break;//UTF-16 little endian; + case 0xFEFF: func = _io_file_lexfeed_UCS2_LE; break;//UTF-16 big endian; + case 0xBBEF: + if(sqstd_fread(&uc,1,sizeof(uc),file) == 0) { + sqstd_fclose(file); + return sq_throwerror(v,_SC("io error")); + } + if(uc != 0xBF) { + sqstd_fclose(file); + return sq_throwerror(v,_SC("Unrecognozed ecoding")); + } +#ifdef SQUNICODE + func = _io_file_lexfeed_UTF8; +#else + func = _io_file_lexfeed_PLAIN; +#endif + break;//UTF-8 ; + default: sqstd_fseek(file,0,SQ_SEEK_SET); break; // ascii + } + IOBuffer buffer; + buffer.ptr = 0; + buffer.size = 0; + buffer.file = file; + if(SQ_SUCCEEDED(sq_compile(v,func,&buffer,filename,printerror))){ + sqstd_fclose(file); + return SQ_OK; + } + } + sqstd_fclose(file); + return SQ_ERROR; + } + return sq_throwerror(v,_SC("cannot open the file")); +} + +SQRESULT sqstd_dofile(HSQUIRRELVM v,const SQChar *filename,SQBool retval,SQBool printerror) +{ + if(SQ_SUCCEEDED(sqstd_loadfile(v,filename,printerror))) { + sq_push(v,-2); + if(SQ_SUCCEEDED(sq_call(v,1,retval,SQTrue))) { + sq_remove(v,retval?-2:-1); //removes the closure + return 1; + } + sq_pop(v,1); //removes the closure + } + return SQ_ERROR; +} + +SQRESULT sqstd_writeclosuretofile(HSQUIRRELVM v,const SQChar *filename) +{ + SQFILE file = sqstd_fopen(filename,_SC("wb+")); + if(!file) return sq_throwerror(v,_SC("cannot open the file")); + if(SQ_SUCCEEDED(sq_writeclosure(v,file_write,file))) { + sqstd_fclose(file); + return SQ_OK; + } + sqstd_fclose(file); + return SQ_ERROR; //forward the error +} + +SQInteger _g_io_loadfile(HSQUIRRELVM v) +{ + const SQChar *filename; + SQBool printerror = SQFalse; + sq_getstring(v,2,&filename); + if(sq_gettop(v) >= 3) { + sq_getbool(v,3,&printerror); + } + if(SQ_SUCCEEDED(sqstd_loadfile(v,filename,printerror))) + return 1; + return SQ_ERROR; //propagates the error +} + +SQInteger _g_io_writeclosuretofile(HSQUIRRELVM v) +{ + const SQChar *filename; + sq_getstring(v,2,&filename); + if(SQ_SUCCEEDED(sqstd_writeclosuretofile(v,filename))) + return 1; + return SQ_ERROR; //propagates the error +} + +SQInteger _g_io_dofile(HSQUIRRELVM v) +{ + const SQChar *filename; + SQBool printerror = SQFalse; + sq_getstring(v,2,&filename); + if(sq_gettop(v) >= 3) { + sq_getbool(v,3,&printerror); + } + sq_push(v,1); //repush the this + if(SQ_SUCCEEDED(sqstd_dofile(v,filename,SQTrue,printerror))) + return 1; + return SQ_ERROR; //propagates the error +} + +#define _DECL_GLOBALIO_FUNC(name,nparams,typecheck) {_SC(#name),_g_io_##name,nparams,typecheck} +static SQRegFunction iolib_funcs[]={ + _DECL_GLOBALIO_FUNC(loadfile,-2,_SC(".sb")), + _DECL_GLOBALIO_FUNC(dofile,-2,_SC(".sb")), + _DECL_GLOBALIO_FUNC(writeclosuretofile,3,_SC(".sc")), + {0,0} +}; + +SQRESULT sqstd_register_iolib(HSQUIRRELVM v) +{ + SQInteger top = sq_gettop(v); + //create delegate + declare_stream(v,_SC("file"),(SQUserPointer)SQSTD_FILE_TYPE_TAG,_SC("std_file"),_file_methods,iolib_funcs); + sq_pushstring(v,_SC("stdout"),-1); + sqstd_createfile(v,stdout,SQFalse); + sq_newslot(v,-3,SQFalse); + sq_pushstring(v,_SC("stdin"),-1); + sqstd_createfile(v,stdin,SQFalse); + sq_newslot(v,-3,SQFalse); + sq_pushstring(v,_SC("stderr"),-1); + sqstd_createfile(v,stderr,SQFalse); + sq_newslot(v,-3,SQFalse); + sq_settop(v,top); + return SQ_OK; +} diff --git a/sqstdlib/sqstdlib.dsp b/sqstdlib/sqstdlib.dsp new file mode 100644 index 0000000..7453243 --- /dev/null +++ b/sqstdlib/sqstdlib.dsp @@ -0,0 +1,131 @@ +# Microsoft Developer Studio Project File - Name="sqstdlib" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Static Library" 0x0104 + +CFG=sqstdlib - Win32 Release +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "sqstdlib.mak". +!MESSAGE +!MESSAGE You can specify a configuration when running NMAKE +!MESSAGE by defining the macro CFG on the command line. For example: +!MESSAGE +!MESSAGE NMAKE /f "sqstdlib.mak" CFG="sqstdlib - Win32 Release" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "sqstdlib - Win32 Release" (based on "Win32 (x86) Static Library") +!MESSAGE "sqstdlib - Win32 Debug" (based on "Win32 (x86) Static Library") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_LocalPath ".." +CPP=cl.exe +RSC=rc.exe + +!IF "$(CFG)" == "sqstdlib - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release" +# PROP Intermediate_Dir "Release" +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_MBCS" /D "_LIB" /YX /FD /c +# ADD CPP /nologo /W3 /GX /O2 /I "..\include" /D "WIN32" /D "NDEBUG" /D "_MBCS" /D "_LIB" /YX /FD /c +# ADD BASE RSC /l 0x410 /d "NDEBUG" +# ADD RSC /l 0x410 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LIB32=link.exe -lib +# ADD BASE LIB32 /nologo +# ADD LIB32 /nologo /out:"..\lib\sqstdlib.lib" + +!ELSEIF "$(CFG)" == "sqstdlib - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "Debug" +# PROP BASE Intermediate_Dir "Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "Debug" +# PROP Intermediate_Dir "Debug" +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_MBCS" /D "_LIB" /YX /FD /GZ /c +# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /I "..\include" /D "WIN32" /D "_DEBUG" /D "_MBCS" /D "_LIB" /YX /FD /GZ /c +# ADD BASE RSC /l 0x410 /d "_DEBUG" +# ADD RSC /l 0x410 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LIB32=link.exe -lib +# ADD BASE LIB32 /nologo +# ADD LIB32 /nologo /out:"..\lib\sqstdlib.lib" + +!ENDIF + +# Begin Target + +# Name "sqstdlib - Win32 Release" +# Name "sqstdlib - Win32 Debug" +# Begin Group "Source Files" + +# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" +# Begin Source File + +SOURCE=.\sqstdblob.cpp +# End Source File +# Begin Source File + +SOURCE=.\sqstdio.cpp +# End Source File +# Begin Source File + +SOURCE=.\sqstdmath.cpp +# End Source File +# Begin Source File + +SOURCE=.\sqstdrex.cpp +# End Source File +# Begin Source File + +SOURCE=.\sqstdstream.cpp +# End Source File +# Begin Source File + +SOURCE=.\sqstdstring.cpp +# End Source File +# Begin Source File + +SOURCE=.\sqstdaux.cpp +# End Source File +# Begin Source File + +SOURCE=.\sqstdsystem.cpp +# End Source File +# End Group +# Begin Group "Header Files" + +# PROP Default_Filter "h;hpp;hxx;hm;inl" +# Begin Source File + +SOURCE=.\sqstdblobimpl.h +# End Source File +# Begin Source File + +SOURCE=.\sqstdstream.h +# End Source File +# End Group +# End Target +# End Project diff --git a/sqstdlib/sqstdmath.cpp b/sqstdlib/sqstdmath.cpp new file mode 100644 index 0000000..ef50359 --- /dev/null +++ b/sqstdlib/sqstdmath.cpp @@ -0,0 +1,107 @@ +/* see copyright notice in squirrel.h */ +#include +#include +#include +#include + +#define SINGLE_ARG_FUNC(_funcname) static SQInteger math_##_funcname(HSQUIRRELVM v){ \ + SQFloat f; \ + sq_getfloat(v,2,&f); \ + sq_pushfloat(v,(SQFloat)_funcname(f)); \ + return 1; \ +} + +#define TWO_ARGS_FUNC(_funcname) static SQInteger math_##_funcname(HSQUIRRELVM v){ \ + SQFloat p1,p2; \ + sq_getfloat(v,2,&p1); \ + sq_getfloat(v,3,&p2); \ + sq_pushfloat(v,(SQFloat)_funcname(p1,p2)); \ + return 1; \ +} + +static SQInteger math_srand(HSQUIRRELVM v) +{ + SQInteger i; + if(SQ_FAILED(sq_getinteger(v,2,&i))) + return sq_throwerror(v,_SC("invalid param")); + srand((unsigned int)i); + return 0; +} + +static SQInteger math_rand(HSQUIRRELVM v) +{ + sq_pushinteger(v,rand()); + return 1; +} + +static SQInteger math_abs(HSQUIRRELVM v) +{ + SQInteger n; + sq_getinteger(v,2,&n); + sq_pushinteger(v,(SQInteger)abs((int)n)); + return 1; +} + +SINGLE_ARG_FUNC(sqrt) +SINGLE_ARG_FUNC(fabs) +SINGLE_ARG_FUNC(sin) +SINGLE_ARG_FUNC(cos) +SINGLE_ARG_FUNC(asin) +SINGLE_ARG_FUNC(acos) +SINGLE_ARG_FUNC(log) +SINGLE_ARG_FUNC(log10) +SINGLE_ARG_FUNC(tan) +SINGLE_ARG_FUNC(atan) +TWO_ARGS_FUNC(atan2) +TWO_ARGS_FUNC(pow) +SINGLE_ARG_FUNC(floor) +SINGLE_ARG_FUNC(ceil) +SINGLE_ARG_FUNC(exp) + +#define _DECL_FUNC(name,nparams,tycheck) {_SC(#name),math_##name,nparams,tycheck} +static SQRegFunction mathlib_funcs[] = { + _DECL_FUNC(sqrt,2,_SC(".n")), + _DECL_FUNC(sin,2,_SC(".n")), + _DECL_FUNC(cos,2,_SC(".n")), + _DECL_FUNC(asin,2,_SC(".n")), + _DECL_FUNC(acos,2,_SC(".n")), + _DECL_FUNC(log,2,_SC(".n")), + _DECL_FUNC(log10,2,_SC(".n")), + _DECL_FUNC(tan,2,_SC(".n")), + _DECL_FUNC(atan,2,_SC(".n")), + _DECL_FUNC(atan2,3,_SC(".nn")), + _DECL_FUNC(pow,3,_SC(".nn")), + _DECL_FUNC(floor,2,_SC(".n")), + _DECL_FUNC(ceil,2,_SC(".n")), + _DECL_FUNC(exp,2,_SC(".n")), + _DECL_FUNC(srand,2,_SC(".n")), + _DECL_FUNC(rand,1,NULL), + _DECL_FUNC(fabs,2,_SC(".n")), + _DECL_FUNC(abs,2,_SC(".n")), + {0,0}, +}; +#undef _DECL_FUNC + +#ifndef M_PI +#define M_PI (3.14159265358979323846) +#endif + +SQRESULT sqstd_register_mathlib(HSQUIRRELVM v) +{ + SQInteger i=0; + while(mathlib_funcs[i].name!=0) { + sq_pushstring(v,mathlib_funcs[i].name,-1); + sq_newclosure(v,mathlib_funcs[i].f,0); + sq_setparamscheck(v,mathlib_funcs[i].nparamscheck,mathlib_funcs[i].typemask); + sq_setnativeclosurename(v,-1,mathlib_funcs[i].name); + sq_newslot(v,-3,SQFalse); + i++; + } + sq_pushstring(v,_SC("RAND_MAX"),-1); + sq_pushinteger(v,RAND_MAX); + sq_newslot(v,-3,SQFalse); + sq_pushstring(v,_SC("PI"),-1); + sq_pushfloat(v,(SQFloat)M_PI); + sq_newslot(v,-3,SQFalse); + return SQ_OK; +} diff --git a/sqstdlib/sqstdrex.cpp b/sqstdlib/sqstdrex.cpp new file mode 100644 index 0000000..2f91792 --- /dev/null +++ b/sqstdlib/sqstdrex.cpp @@ -0,0 +1,630 @@ +/* see copyright notice in squirrel.h */ +#include +#include +#include +#include +#include + +#ifdef _DEBUG +#include + +static const SQChar *g_nnames[] = +{ + _SC("NONE"),_SC("OP_GREEDY"), _SC("OP_OR"), + _SC("OP_EXPR"),_SC("OP_NOCAPEXPR"),_SC("OP_DOT"), _SC("OP_CLASS"), + _SC("OP_CCLASS"),_SC("OP_NCLASS"),_SC("OP_RANGE"),_SC("OP_CHAR"), + _SC("OP_EOL"),_SC("OP_BOL"),_SC("OP_WB") +}; + +#endif + +#define OP_GREEDY (MAX_CHAR+1) // * + ? {n} +#define OP_OR (MAX_CHAR+2) +#define OP_EXPR (MAX_CHAR+3) //parentesis () +#define OP_NOCAPEXPR (MAX_CHAR+4) //parentesis (?:) +#define OP_DOT (MAX_CHAR+5) +#define OP_CLASS (MAX_CHAR+6) +#define OP_CCLASS (MAX_CHAR+7) +#define OP_NCLASS (MAX_CHAR+8) //negates class the [^ +#define OP_RANGE (MAX_CHAR+9) +#define OP_CHAR (MAX_CHAR+10) +#define OP_EOL (MAX_CHAR+11) +#define OP_BOL (MAX_CHAR+12) +#define OP_WB (MAX_CHAR+13) + +#define SQREX_SYMBOL_ANY_CHAR ('.') +#define SQREX_SYMBOL_GREEDY_ONE_OR_MORE ('+') +#define SQREX_SYMBOL_GREEDY_ZERO_OR_MORE ('*') +#define SQREX_SYMBOL_GREEDY_ZERO_OR_ONE ('?') +#define SQREX_SYMBOL_BRANCH ('|') +#define SQREX_SYMBOL_END_OF_STRING ('$') +#define SQREX_SYMBOL_BEGINNING_OF_STRING ('^') +#define SQREX_SYMBOL_ESCAPE_CHAR ('\\') + + +typedef int SQRexNodeType; + +typedef struct tagSQRexNode{ + SQRexNodeType type; + SQInteger left; + SQInteger right; + SQInteger next; +}SQRexNode; + +struct SQRex{ + const SQChar *_eol; + const SQChar *_bol; + const SQChar *_p; + SQInteger _first; + SQInteger _op; + SQRexNode *_nodes; + SQInteger _nallocated; + SQInteger _nsize; + SQInteger _nsubexpr; + SQRexMatch *_matches; + SQInteger _currsubexp; + void *_jmpbuf; + const SQChar **_error; +}; + +static SQInteger sqstd_rex_list(SQRex *exp); + +static SQInteger sqstd_rex_newnode(SQRex *exp, SQRexNodeType type) +{ + SQRexNode n; + n.type = type; + n.next = n.right = n.left = -1; + if(type == OP_EXPR) + n.right = exp->_nsubexpr++; + if(exp->_nallocated < (exp->_nsize + 1)) { + SQInteger oldsize = exp->_nallocated; + exp->_nallocated *= 2; + exp->_nodes = (SQRexNode *)sq_realloc(exp->_nodes, oldsize * sizeof(SQRexNode) ,exp->_nallocated * sizeof(SQRexNode)); + } + exp->_nodes[exp->_nsize++] = n; + SQInteger newid = exp->_nsize - 1; + return (SQInteger)newid; +} + +static void sqstd_rex_error(SQRex *exp,const SQChar *error) +{ + if(exp->_error) *exp->_error = error; + longjmp(*((jmp_buf*)exp->_jmpbuf),-1); +} + +static void sqstd_rex_expect(SQRex *exp, SQInteger n){ + if((*exp->_p) != n) + sqstd_rex_error(exp, _SC("expected paren")); + exp->_p++; +} + +static SQChar sqstd_rex_escapechar(SQRex *exp) +{ + if(*exp->_p == SQREX_SYMBOL_ESCAPE_CHAR){ + exp->_p++; + switch(*exp->_p) { + case 'v': exp->_p++; return '\v'; + case 'n': exp->_p++; return '\n'; + case 't': exp->_p++; return '\t'; + case 'r': exp->_p++; return '\r'; + case 'f': exp->_p++; return '\f'; + default: return (*exp->_p++); + } + } else if(!scisprint(*exp->_p)) sqstd_rex_error(exp,_SC("letter expected")); + return (*exp->_p++); +} + +static SQInteger sqstd_rex_charclass(SQRex *exp,SQInteger classid) +{ + SQInteger n = sqstd_rex_newnode(exp,OP_CCLASS); + exp->_nodes[n].left = classid; + return n; +} + +static SQInteger sqstd_rex_charnode(SQRex *exp,SQBool isclass) +{ + SQChar t; + if(*exp->_p == SQREX_SYMBOL_ESCAPE_CHAR) { + exp->_p++; + switch(*exp->_p) { + case 'n': exp->_p++; return sqstd_rex_newnode(exp,'\n'); + case 't': exp->_p++; return sqstd_rex_newnode(exp,'\t'); + case 'r': exp->_p++; return sqstd_rex_newnode(exp,'\r'); + case 'f': exp->_p++; return sqstd_rex_newnode(exp,'\f'); + case 'v': exp->_p++; return sqstd_rex_newnode(exp,'\v'); + case 'a': case 'A': case 'w': case 'W': case 's': case 'S': + case 'd': case 'D': case 'x': case 'X': case 'c': case 'C': + case 'p': case 'P': case 'l': case 'u': + { + t = *exp->_p; exp->_p++; + return sqstd_rex_charclass(exp,t); + } + case 'b': + case 'B': + if(!isclass) { + SQInteger node = sqstd_rex_newnode(exp,OP_WB); + exp->_nodes[node].left = *exp->_p; + exp->_p++; + return node; + } //else default + default: + t = *exp->_p; exp->_p++; + return sqstd_rex_newnode(exp,t); + } + } + else if(!scisprint(*exp->_p)) { + + sqstd_rex_error(exp,_SC("letter expected")); + } + t = *exp->_p; exp->_p++; + return sqstd_rex_newnode(exp,t); +} +static SQInteger sqstd_rex_class(SQRex *exp) +{ + SQInteger ret = -1; + SQInteger first = -1,chain; + if(*exp->_p == SQREX_SYMBOL_BEGINNING_OF_STRING){ + ret = sqstd_rex_newnode(exp,OP_NCLASS); + exp->_p++; + }else ret = sqstd_rex_newnode(exp,OP_CLASS); + + if(*exp->_p == ']') sqstd_rex_error(exp,_SC("empty class")); + chain = ret; + while(*exp->_p != ']' && exp->_p != exp->_eol) { + if(*exp->_p == '-' && first != -1){ + SQInteger r; + if(*exp->_p++ == ']') sqstd_rex_error(exp,_SC("unfinished range")); + r = sqstd_rex_newnode(exp,OP_RANGE); + if(exp->_nodes[first].type>*exp->_p) sqstd_rex_error(exp,_SC("invalid range")); + if(exp->_nodes[first].type == OP_CCLASS) sqstd_rex_error(exp,_SC("cannot use character classes in ranges")); + exp->_nodes[r].left = exp->_nodes[first].type; + SQInteger t = sqstd_rex_escapechar(exp); + exp->_nodes[r].right = t; + exp->_nodes[chain].next = r; + chain = r; + first = -1; + } + else{ + if(first!=-1){ + SQInteger c = first; + exp->_nodes[chain].next = c; + chain = c; + first = sqstd_rex_charnode(exp,SQTrue); + } + else{ + first = sqstd_rex_charnode(exp,SQTrue); + } + } + } + if(first!=-1){ + SQInteger c = first; + exp->_nodes[chain].next = c; + chain = c; + first = -1; + } + /* hack? */ + exp->_nodes[ret].left = exp->_nodes[ret].next; + exp->_nodes[ret].next = -1; + return ret; +} + +static SQInteger sqstd_rex_parsenumber(SQRex *exp) +{ + SQInteger ret = *exp->_p-'0'; + SQInteger positions = 10; + exp->_p++; + while(isdigit(*exp->_p)) { + ret = ret*10+(*exp->_p++-'0'); + if(positions==1000000000) sqstd_rex_error(exp,_SC("overflow in numeric constant")); + positions *= 10; + }; + return ret; +} + +static SQInteger sqstd_rex_element(SQRex *exp) +{ + SQInteger ret = -1; + switch(*exp->_p) + { + case '(': { + SQInteger expr; + exp->_p++; + + + if(*exp->_p =='?') { + exp->_p++; + sqstd_rex_expect(exp,':'); + expr = sqstd_rex_newnode(exp,OP_NOCAPEXPR); + } + else + expr = sqstd_rex_newnode(exp,OP_EXPR); + SQInteger newn = sqstd_rex_list(exp); + exp->_nodes[expr].left = newn; + ret = expr; + sqstd_rex_expect(exp,')'); + } + break; + case '[': + exp->_p++; + ret = sqstd_rex_class(exp); + sqstd_rex_expect(exp,']'); + break; + case SQREX_SYMBOL_END_OF_STRING: exp->_p++; ret = sqstd_rex_newnode(exp,OP_EOL);break; + case SQREX_SYMBOL_ANY_CHAR: exp->_p++; ret = sqstd_rex_newnode(exp,OP_DOT);break; + default: + ret = sqstd_rex_charnode(exp,SQFalse); + break; + } + + + SQBool isgreedy = SQFalse; + unsigned short p0 = 0, p1 = 0; + switch(*exp->_p){ + case SQREX_SYMBOL_GREEDY_ZERO_OR_MORE: p0 = 0; p1 = 0xFFFF; exp->_p++; isgreedy = SQTrue; break; + case SQREX_SYMBOL_GREEDY_ONE_OR_MORE: p0 = 1; p1 = 0xFFFF; exp->_p++; isgreedy = SQTrue; break; + case SQREX_SYMBOL_GREEDY_ZERO_OR_ONE: p0 = 0; p1 = 1; exp->_p++; isgreedy = SQTrue; break; + case '{': + exp->_p++; + if(!isdigit(*exp->_p)) sqstd_rex_error(exp,_SC("number expected")); + p0 = (unsigned short)sqstd_rex_parsenumber(exp); + /*******************************/ + switch(*exp->_p) { + case '}': + p1 = p0; exp->_p++; + break; + case ',': + exp->_p++; + p1 = 0xFFFF; + if(isdigit(*exp->_p)){ + p1 = (unsigned short)sqstd_rex_parsenumber(exp); + } + sqstd_rex_expect(exp,'}'); + break; + default: + sqstd_rex_error(exp,_SC(", or } expected")); + } + /*******************************/ + isgreedy = SQTrue; + break; + + } + if(isgreedy) { + SQInteger nnode = sqstd_rex_newnode(exp,OP_GREEDY); + exp->_nodes[nnode].left = ret; + exp->_nodes[nnode].right = ((p0)<<16)|p1; + ret = nnode; + } + + if((*exp->_p != SQREX_SYMBOL_BRANCH) && (*exp->_p != ')') && (*exp->_p != SQREX_SYMBOL_GREEDY_ZERO_OR_MORE) && (*exp->_p != SQREX_SYMBOL_GREEDY_ONE_OR_MORE) && (*exp->_p != '\0')) { + SQInteger nnode = sqstd_rex_element(exp); + exp->_nodes[ret].next = nnode; + } + + return ret; +} + +static SQInteger sqstd_rex_list(SQRex *exp) +{ + SQInteger ret=-1,e; + if(*exp->_p == SQREX_SYMBOL_BEGINNING_OF_STRING) { + exp->_p++; + ret = sqstd_rex_newnode(exp,OP_BOL); + } + e = sqstd_rex_element(exp); + if(ret != -1) { + exp->_nodes[ret].next = e; + } + else ret = e; + + if(*exp->_p == SQREX_SYMBOL_BRANCH) { + SQInteger temp,tright; + exp->_p++; + temp = sqstd_rex_newnode(exp,OP_OR); + exp->_nodes[temp].left = ret; + tright = sqstd_rex_list(exp); + exp->_nodes[temp].right = tright; + ret = temp; + } + return ret; +} + +static SQBool sqstd_rex_matchcclass(SQInteger cclass,SQChar c) +{ + switch(cclass) { + case 'a': return isalpha(c)?SQTrue:SQFalse; + case 'A': return !isalpha(c)?SQTrue:SQFalse; + case 'w': return (isalnum(c) || c == '_')?SQTrue:SQFalse; + case 'W': return (!isalnum(c) && c != '_')?SQTrue:SQFalse; + case 's': return isspace(c)?SQTrue:SQFalse; + case 'S': return !isspace(c)?SQTrue:SQFalse; + case 'd': return isdigit(c)?SQTrue:SQFalse; + case 'D': return !isdigit(c)?SQTrue:SQFalse; + case 'x': return isxdigit(c)?SQTrue:SQFalse; + case 'X': return !isxdigit(c)?SQTrue:SQFalse; + case 'c': return iscntrl(c)?SQTrue:SQFalse; + case 'C': return !iscntrl(c)?SQTrue:SQFalse; + case 'p': return ispunct(c)?SQTrue:SQFalse; + case 'P': return !ispunct(c)?SQTrue:SQFalse; + case 'l': return islower(c)?SQTrue:SQFalse; + case 'u': return isupper(c)?SQTrue:SQFalse; + } + return SQFalse; /*cannot happen*/ +} + +static SQBool sqstd_rex_matchclass(SQRex* exp,SQRexNode *node,SQChar c) +{ + do { + switch(node->type) { + case OP_RANGE: + if(c >= node->left && c <= node->right) return SQTrue; + break; + case OP_CCLASS: + if(sqstd_rex_matchcclass(node->left,c)) return SQTrue; + break; + default: + if(c == node->type)return SQTrue; + } + } while((node->next != -1) && (node = &exp->_nodes[node->next])); + return SQFalse; +} + +static const SQChar *sqstd_rex_matchnode(SQRex* exp,SQRexNode *node,const SQChar *str,SQRexNode *next) +{ + + SQRexNodeType type = node->type; + switch(type) { + case OP_GREEDY: { + //SQRexNode *greedystop = (node->next != -1) ? &exp->_nodes[node->next] : NULL; + SQRexNode *greedystop = NULL; + SQInteger p0 = (node->right >> 16)&0x0000FFFF, p1 = node->right&0x0000FFFF, nmaches = 0; + const SQChar *s=str, *good = str; + + if(node->next != -1) { + greedystop = &exp->_nodes[node->next]; + } + else { + greedystop = next; + } + + while((nmaches == 0xFFFF || nmaches < p1)) { + + const SQChar *stop; + if(!(s = sqstd_rex_matchnode(exp,&exp->_nodes[node->left],s,greedystop))) + break; + nmaches++; + good=s; + if(greedystop) { + //checks that 0 matches satisfy the expression(if so skips) + //if not would always stop(for instance if is a '?') + if(greedystop->type != OP_GREEDY || + (greedystop->type == OP_GREEDY && ((greedystop->right >> 16)&0x0000FFFF) != 0)) + { + SQRexNode *gnext = NULL; + if(greedystop->next != -1) { + gnext = &exp->_nodes[greedystop->next]; + }else if(next && next->next != -1){ + gnext = &exp->_nodes[next->next]; + } + stop = sqstd_rex_matchnode(exp,greedystop,s,gnext); + if(stop) { + //if satisfied stop it + if(p0 == p1 && p0 == nmaches) break; + else if(nmaches >= p0 && p1 == 0xFFFF) break; + else if(nmaches >= p0 && nmaches <= p1) break; + } + } + } + + if(s >= exp->_eol) + break; + } + if(p0 == p1 && p0 == nmaches) return good; + else if(nmaches >= p0 && p1 == 0xFFFF) return good; + else if(nmaches >= p0 && nmaches <= p1) return good; + return NULL; + } + case OP_OR: { + const SQChar *asd = str; + SQRexNode *temp=&exp->_nodes[node->left]; + while( (asd = sqstd_rex_matchnode(exp,temp,asd,NULL)) ) { + if(temp->next != -1) + temp = &exp->_nodes[temp->next]; + else + return asd; + } + asd = str; + temp = &exp->_nodes[node->right]; + while( (asd = sqstd_rex_matchnode(exp,temp,asd,NULL)) ) { + if(temp->next != -1) + temp = &exp->_nodes[temp->next]; + else + return asd; + } + return NULL; + break; + } + case OP_EXPR: + case OP_NOCAPEXPR:{ + SQRexNode *n = &exp->_nodes[node->left]; + const SQChar *cur = str; + SQInteger capture = -1; + if(node->type != OP_NOCAPEXPR && node->right == exp->_currsubexp) { + capture = exp->_currsubexp; + exp->_matches[capture].begin = cur; + exp->_currsubexp++; + } + SQInteger tempcap = exp->_currsubexp; + do { + SQRexNode *subnext = NULL; + if(n->next != -1) { + subnext = &exp->_nodes[n->next]; + }else { + subnext = next; + } + if(!(cur = sqstd_rex_matchnode(exp,n,cur,subnext))) { + if(capture != -1){ + exp->_matches[capture].begin = 0; + exp->_matches[capture].len = 0; + } + return NULL; + } + } while((n->next != -1) && (n = &exp->_nodes[n->next])); + + exp->_currsubexp = tempcap; + if(capture != -1) + exp->_matches[capture].len = cur - exp->_matches[capture].begin; + return cur; + } + case OP_WB: + if((str == exp->_bol && !isspace(*str)) + || (str == exp->_eol && !isspace(*(str-1))) + || (!isspace(*str) && isspace(*(str+1))) + || (isspace(*str) && !isspace(*(str+1))) ) { + return (node->left == 'b')?str:NULL; + } + return (node->left == 'b')?NULL:str; + case OP_BOL: + if(str == exp->_bol) return str; + return NULL; + case OP_EOL: + if(str == exp->_eol) return str; + return NULL; + case OP_DOT:{ + str++; + } + return str; + case OP_NCLASS: + case OP_CLASS: + if(sqstd_rex_matchclass(exp,&exp->_nodes[node->left],*str)?(type == OP_CLASS?SQTrue:SQFalse):(type == OP_NCLASS?SQTrue:SQFalse)) { + str++; + return str; + } + return NULL; + case OP_CCLASS: + if(sqstd_rex_matchcclass(node->left,*str)) { + str++; + return str; + } + return NULL; + default: /* char */ + if(*str != node->type) return NULL; + str++; + return str; + } + return NULL; +} + +/* public api */ +SQRex *sqstd_rex_compile(const SQChar *pattern,const SQChar **error) +{ + SQRex *exp = (SQRex *)sq_malloc(sizeof(SQRex)); + exp->_eol = exp->_bol = NULL; + exp->_p = pattern; + exp->_nallocated = (SQInteger)scstrlen(pattern) * sizeof(SQChar); + exp->_nodes = (SQRexNode *)sq_malloc(exp->_nallocated * sizeof(SQRexNode)); + exp->_nsize = 0; + exp->_matches = 0; + exp->_nsubexpr = 0; + exp->_first = sqstd_rex_newnode(exp,OP_EXPR); + exp->_error = error; + exp->_jmpbuf = sq_malloc(sizeof(jmp_buf)); + if(setjmp(*((jmp_buf*)exp->_jmpbuf)) == 0) { + SQInteger res = sqstd_rex_list(exp); + exp->_nodes[exp->_first].left = res; + if(*exp->_p!='\0') + sqstd_rex_error(exp,_SC("unexpected character")); +#ifdef _DEBUG + { + SQInteger nsize,i; + SQRexNode *t; + nsize = exp->_nsize; + t = &exp->_nodes[0]; + scprintf(_SC("\n")); + for(i = 0;i < nsize; i++) { + if(exp->_nodes[i].type>MAX_CHAR) + scprintf(_SC("[%02d] %10s "),i,g_nnames[exp->_nodes[i].type-MAX_CHAR]); + else + scprintf(_SC("[%02d] %10c "),i,exp->_nodes[i].type); + scprintf(_SC("left %02d right %02d next %02d\n"),exp->_nodes[i].left,exp->_nodes[i].right,exp->_nodes[i].next); + } + scprintf(_SC("\n")); + } +#endif + exp->_matches = (SQRexMatch *) sq_malloc(exp->_nsubexpr * sizeof(SQRexMatch)); + memset(exp->_matches,0,exp->_nsubexpr * sizeof(SQRexMatch)); + } + else{ + sqstd_rex_free(exp); + return NULL; + } + return exp; +} + +void sqstd_rex_free(SQRex *exp) +{ + if(exp) { + if(exp->_nodes) sq_free(exp->_nodes,exp->_nallocated * sizeof(SQRexNode)); + if(exp->_jmpbuf) sq_free(exp->_jmpbuf,sizeof(jmp_buf)); + if(exp->_matches) sq_free(exp->_matches,exp->_nsubexpr * sizeof(SQRexMatch)); + sq_free(exp,sizeof(SQRex)); + } +} + +SQBool sqstd_rex_match(SQRex* exp,const SQChar* text) +{ + const SQChar* res = NULL; + exp->_bol = text; + exp->_eol = text + scstrlen(text); + exp->_currsubexp = 0; + res = sqstd_rex_matchnode(exp,exp->_nodes,text,NULL); + if(res == NULL || res != exp->_eol) + return SQFalse; + return SQTrue; +} + +SQBool sqstd_rex_searchrange(SQRex* exp,const SQChar* text_begin,const SQChar* text_end,const SQChar** out_begin, const SQChar** out_end) +{ + const SQChar *cur = NULL; + SQInteger node = exp->_first; + if(text_begin >= text_end) return SQFalse; + exp->_bol = text_begin; + exp->_eol = text_end; + do { + cur = text_begin; + while(node != -1) { + exp->_currsubexp = 0; + cur = sqstd_rex_matchnode(exp,&exp->_nodes[node],cur,NULL); + if(!cur) + break; + node = exp->_nodes[node].next; + } + text_begin++; + } while(cur == NULL && text_begin != text_end); + + if(cur == NULL) + return SQFalse; + + --text_begin; + + if(out_begin) *out_begin = text_begin; + if(out_end) *out_end = cur; + return SQTrue; +} + +SQBool sqstd_rex_search(SQRex* exp,const SQChar* text, const SQChar** out_begin, const SQChar** out_end) +{ + return sqstd_rex_searchrange(exp,text,text + scstrlen(text),out_begin,out_end); +} + +SQInteger sqstd_rex_getsubexpcount(SQRex* exp) +{ + return exp->_nsubexpr; +} + +SQBool sqstd_rex_getsubexp(SQRex* exp, SQInteger n, SQRexMatch *subexp) +{ + if( n<0 || n >= exp->_nsubexpr) return SQFalse; + *subexp = exp->_matches[n]; + return SQTrue; +} + diff --git a/sqstdlib/sqstdstream.cpp b/sqstdlib/sqstdstream.cpp new file mode 100644 index 0000000..1b7a08f --- /dev/null +++ b/sqstdlib/sqstdstream.cpp @@ -0,0 +1,336 @@ +/* see copyright notice in squirrel.h */ +#include +#include +#include +#include +#include +#include +#include +#include "sqstdstream.h" +#include "sqstdblobimpl.h" + +#define SETUP_STREAM(v) \ + SQStream *self = NULL; \ + if(SQ_FAILED(sq_getinstanceup(v,1,(SQUserPointer*)&self,(SQUserPointer)SQSTD_STREAM_TYPE_TAG))) \ + return sq_throwerror(v,_SC("invalid type tag")); \ + if(!self || !self->IsValid()) \ + return sq_throwerror(v,_SC("the stream is invalid")); + +SQInteger _stream_readblob(HSQUIRRELVM v) +{ + SETUP_STREAM(v); + SQUserPointer data,blobp; + SQInteger size,res; + sq_getinteger(v,2,&size); + if(size > self->Len()) { + size = self->Len(); + } + data = sq_getscratchpad(v,size); + res = self->Read(data,size); + if(res <= 0) + return sq_throwerror(v,_SC("no data left to read")); + blobp = sqstd_createblob(v,res); + memcpy(blobp,data,res); + return 1; +} + +#define SAFE_READN(ptr,len) { \ + if(self->Read(ptr,len) != len) return sq_throwerror(v,_SC("io error")); \ + } +SQInteger _stream_readn(HSQUIRRELVM v) +{ + SETUP_STREAM(v); + SQInteger format; + sq_getinteger(v, 2, &format); + switch(format) { + case 'l': { + SQInteger i; + SAFE_READN(&i, sizeof(i)); + sq_pushinteger(v, i); + } + break; + case 'i': { + SQInt32 i; + SAFE_READN(&i, sizeof(i)); + sq_pushinteger(v, i); + } + break; + case 's': { + short s; + SAFE_READN(&s, sizeof(short)); + sq_pushinteger(v, s); + } + break; + case 'w': { + unsigned short w; + SAFE_READN(&w, sizeof(unsigned short)); + sq_pushinteger(v, w); + } + break; + case 'c': { + char c; + SAFE_READN(&c, sizeof(char)); + sq_pushinteger(v, c); + } + break; + case 'b': { + unsigned char c; + SAFE_READN(&c, sizeof(unsigned char)); + sq_pushinteger(v, c); + } + break; + case 'f': { + float f; + SAFE_READN(&f, sizeof(float)); + sq_pushfloat(v, f); + } + break; + case 'd': { + double d; + SAFE_READN(&d, sizeof(double)); + sq_pushfloat(v, (SQFloat)d); + } + break; + default: + return sq_throwerror(v, _SC("invalid format")); + } + return 1; +} + +SQInteger _stream_writeblob(HSQUIRRELVM v) +{ + SQUserPointer data; + SQInteger size; + SETUP_STREAM(v); + if(SQ_FAILED(sqstd_getblob(v,2,&data))) + return sq_throwerror(v,_SC("invalid parameter")); + size = sqstd_getblobsize(v,2); + if(self->Write(data,size) != size) + return sq_throwerror(v,_SC("io error")); + sq_pushinteger(v,size); + return 1; +} + +SQInteger _stream_writen(HSQUIRRELVM v) +{ + SETUP_STREAM(v); + SQInteger format, ti; + SQFloat tf; + sq_getinteger(v, 3, &format); + switch(format) { + case 'l': { + SQInteger i; + sq_getinteger(v, 2, &ti); + i = ti; + self->Write(&i, sizeof(SQInteger)); + } + break; + case 'i': { + SQInt32 i; + sq_getinteger(v, 2, &ti); + i = (SQInt32)ti; + self->Write(&i, sizeof(SQInt32)); + } + break; + case 's': { + short s; + sq_getinteger(v, 2, &ti); + s = (short)ti; + self->Write(&s, sizeof(short)); + } + break; + case 'w': { + unsigned short w; + sq_getinteger(v, 2, &ti); + w = (unsigned short)ti; + self->Write(&w, sizeof(unsigned short)); + } + break; + case 'c': { + char c; + sq_getinteger(v, 2, &ti); + c = (char)ti; + self->Write(&c, sizeof(char)); + } + break; + case 'b': { + unsigned char b; + sq_getinteger(v, 2, &ti); + b = (unsigned char)ti; + self->Write(&b, sizeof(unsigned char)); + } + break; + case 'f': { + float f; + sq_getfloat(v, 2, &tf); + f = (float)tf; + self->Write(&f, sizeof(float)); + } + break; + case 'd': { + double d; + sq_getfloat(v, 2, &tf); + d = tf; + self->Write(&d, sizeof(double)); + } + break; + default: + return sq_throwerror(v, _SC("invalid format")); + } + return 0; +} + +SQInteger _stream_seek(HSQUIRRELVM v) +{ + SETUP_STREAM(v); + SQInteger offset, origin = SQ_SEEK_SET; + sq_getinteger(v, 2, &offset); + if(sq_gettop(v) > 2) { + SQInteger t; + sq_getinteger(v, 3, &t); + switch(t) { + case 'b': origin = SQ_SEEK_SET; break; + case 'c': origin = SQ_SEEK_CUR; break; + case 'e': origin = SQ_SEEK_END; break; + default: return sq_throwerror(v,_SC("invalid origin")); + } + } + sq_pushinteger(v, self->Seek(offset, origin)); + return 1; +} + +SQInteger _stream_tell(HSQUIRRELVM v) +{ + SETUP_STREAM(v); + sq_pushinteger(v, self->Tell()); + return 1; +} + +SQInteger _stream_len(HSQUIRRELVM v) +{ + SETUP_STREAM(v); + sq_pushinteger(v, self->Len()); + return 1; +} + +SQInteger _stream_flush(HSQUIRRELVM v) +{ + SETUP_STREAM(v); + if(!self->Flush()) + sq_pushinteger(v, 1); + else + sq_pushnull(v); + return 1; +} + +SQInteger _stream_eos(HSQUIRRELVM v) +{ + SETUP_STREAM(v); + if(self->EOS()) + sq_pushinteger(v, 1); + else + sq_pushnull(v); + return 1; +} + + SQInteger _stream__cloned(HSQUIRRELVM v) + { + return sq_throwerror(v,_SC("this object cannot be cloned")); + } + +static SQRegFunction _stream_methods[] = { + _DECL_STREAM_FUNC(readblob,2,_SC("xn")), + _DECL_STREAM_FUNC(readn,2,_SC("xn")), + _DECL_STREAM_FUNC(writeblob,-2,_SC("xx")), + _DECL_STREAM_FUNC(writen,3,_SC("xnn")), + _DECL_STREAM_FUNC(seek,-2,_SC("xnn")), + _DECL_STREAM_FUNC(tell,1,_SC("x")), + _DECL_STREAM_FUNC(len,1,_SC("x")), + _DECL_STREAM_FUNC(eos,1,_SC("x")), + _DECL_STREAM_FUNC(flush,1,_SC("x")), + _DECL_STREAM_FUNC(_cloned,0,NULL), + {0,0} +}; + +void init_streamclass(HSQUIRRELVM v) +{ + sq_pushregistrytable(v); + sq_pushstring(v,_SC("std_stream"),-1); + if(SQ_FAILED(sq_get(v,-2))) { + sq_pushstring(v,_SC("std_stream"),-1); + sq_newclass(v,SQFalse); + sq_settypetag(v,-1,(SQUserPointer)SQSTD_STREAM_TYPE_TAG); + SQInteger i = 0; + while(_stream_methods[i].name != 0) { + SQRegFunction &f = _stream_methods[i]; + sq_pushstring(v,f.name,-1); + sq_newclosure(v,f.f,0); + sq_setparamscheck(v,f.nparamscheck,f.typemask); + sq_newslot(v,-3,SQFalse); + i++; + } + sq_newslot(v,-3,SQFalse); + sq_pushroottable(v); + sq_pushstring(v,_SC("stream"),-1); + sq_pushstring(v,_SC("std_stream"),-1); + sq_get(v,-4); + sq_newslot(v,-3,SQFalse); + sq_pop(v,1); + } + else { + sq_pop(v,1); //result + } + sq_pop(v,1); +} + +SQRESULT declare_stream(HSQUIRRELVM v,const SQChar* name,SQUserPointer typetag,const SQChar* reg_name,SQRegFunction *methods,SQRegFunction *globals) +{ + if(sq_gettype(v,-1) != OT_TABLE) + return sq_throwerror(v,_SC("table expected")); + SQInteger top = sq_gettop(v); + //create delegate + init_streamclass(v); + sq_pushregistrytable(v); + sq_pushstring(v,reg_name,-1); + sq_pushstring(v,_SC("std_stream"),-1); + if(SQ_SUCCEEDED(sq_get(v,-3))) { + sq_newclass(v,SQTrue); + sq_settypetag(v,-1,typetag); + SQInteger i = 0; + while(methods[i].name != 0) { + SQRegFunction &f = methods[i]; + sq_pushstring(v,f.name,-1); + sq_newclosure(v,f.f,0); + sq_setparamscheck(v,f.nparamscheck,f.typemask); + sq_setnativeclosurename(v,-1,f.name); + sq_newslot(v,-3,SQFalse); + i++; + } + sq_newslot(v,-3,SQFalse); + sq_pop(v,1); + + i = 0; + while(globals[i].name!=0) + { + SQRegFunction &f = globals[i]; + sq_pushstring(v,f.name,-1); + sq_newclosure(v,f.f,0); + sq_setparamscheck(v,f.nparamscheck,f.typemask); + sq_setnativeclosurename(v,-1,f.name); + sq_newslot(v,-3,SQFalse); + i++; + } + //register the class in the target table + sq_pushstring(v,name,-1); + sq_pushregistrytable(v); + sq_pushstring(v,reg_name,-1); + sq_get(v,-2); + sq_remove(v,-2); + sq_newslot(v,-3,SQFalse); + + sq_settop(v,top); + return SQ_OK; + } + sq_settop(v,top); + return SQ_ERROR; +} diff --git a/sqstdlib/sqstdstream.h b/sqstdlib/sqstdstream.h new file mode 100644 index 0000000..1595251 --- /dev/null +++ b/sqstdlib/sqstdstream.h @@ -0,0 +1,18 @@ +/* see copyright notice in squirrel.h */ +#ifndef _SQSTD_STREAM_H_ +#define _SQSTD_STREAM_H_ + +SQInteger _stream_readblob(HSQUIRRELVM v); +SQInteger _stream_readline(HSQUIRRELVM v); +SQInteger _stream_readn(HSQUIRRELVM v); +SQInteger _stream_writeblob(HSQUIRRELVM v); +SQInteger _stream_writen(HSQUIRRELVM v); +SQInteger _stream_seek(HSQUIRRELVM v); +SQInteger _stream_tell(HSQUIRRELVM v); +SQInteger _stream_len(HSQUIRRELVM v); +SQInteger _stream_eos(HSQUIRRELVM v); +SQInteger _stream_flush(HSQUIRRELVM v); + +#define _DECL_STREAM_FUNC(name,nparams,typecheck) {_SC(#name),_stream_##name,nparams,typecheck} +SQRESULT declare_stream(HSQUIRRELVM v,const SQChar* name,SQUserPointer typetag,const SQChar* reg_name,SQRegFunction *methods,SQRegFunction *globals); +#endif /*_SQSTD_STREAM_H_*/ diff --git a/sqstdlib/sqstdstring.cpp b/sqstdlib/sqstdstring.cpp new file mode 100644 index 0000000..4e3160f --- /dev/null +++ b/sqstdlib/sqstdstring.cpp @@ -0,0 +1,488 @@ +/* see copyright notice in squirrel.h */ +#include +#include +#include +#include +#include +#include +#include + +#define MAX_FORMAT_LEN 20 +#define MAX_WFORMAT_LEN 3 +#define ADDITIONAL_FORMAT_SPACE (100*sizeof(SQChar)) + +static SQBool isfmtchr(SQChar ch) +{ + switch(ch) { + case '-': case '+': case ' ': case '#': case '0': return SQTrue; + } + return SQFalse; +} + +static SQInteger validate_format(HSQUIRRELVM v, SQChar *fmt, const SQChar *src, SQInteger n,SQInteger &width) +{ + SQChar *dummy; + SQChar swidth[MAX_WFORMAT_LEN]; + SQInteger wc = 0; + SQInteger start = n; + fmt[0] = '%'; + while (isfmtchr(src[n])) n++; + while (scisdigit(src[n])) { + swidth[wc] = src[n]; + n++; + wc++; + if(wc>=MAX_WFORMAT_LEN) + return sq_throwerror(v,_SC("width format too long")); + } + swidth[wc] = '\0'; + if(wc > 0) { + width = scstrtol(swidth,&dummy,10); + } + else + width = 0; + if (src[n] == '.') { + n++; + + wc = 0; + while (scisdigit(src[n])) { + swidth[wc] = src[n]; + n++; + wc++; + if(wc>=MAX_WFORMAT_LEN) + return sq_throwerror(v,_SC("precision format too long")); + } + swidth[wc] = '\0'; + if(wc > 0) { + width += scstrtol(swidth,&dummy,10); + + } + } + if (n-start > MAX_FORMAT_LEN ) + return sq_throwerror(v,_SC("format too long")); + memcpy(&fmt[1],&src[start],((n-start)+1)*sizeof(SQChar)); + fmt[(n-start)+2] = '\0'; + return n; +} + +SQRESULT sqstd_format(HSQUIRRELVM v,SQInteger nformatstringidx,SQInteger *outlen,SQChar **output) +{ + const SQChar *format; + SQChar *dest; + SQChar fmt[MAX_FORMAT_LEN]; + sq_getstring(v,nformatstringidx,&format); + SQInteger format_size = sq_getsize(v,nformatstringidx); + SQInteger allocated = (sq_getsize(v,nformatstringidx)+2)*sizeof(SQChar); + dest = sq_getscratchpad(v,allocated); + SQInteger n = 0,i = 0, nparam = nformatstringidx+1, w = 0; + //while(format[n] != '\0') + while(n < format_size) + { + if(format[n] != '%') { + assert(i < allocated); + dest[i++] = format[n]; + n++; + } + else if(format[n+1] == '%') { //handles %% + dest[i++] = '%'; + n += 2; + } + else { + n++; + if( nparam > sq_gettop(v) ) + return sq_throwerror(v,_SC("not enough paramters for the given format string")); + n = validate_format(v,fmt,format,n,w); + if(n < 0) return -1; + SQInteger addlen = 0; + SQInteger valtype = 0; + const SQChar *ts; + SQInteger ti; + SQFloat tf; + switch(format[n]) { + case 's': + if(SQ_FAILED(sq_getstring(v,nparam,&ts))) + return sq_throwerror(v,_SC("string expected for the specified format")); + addlen = (sq_getsize(v,nparam)*sizeof(SQChar))+((w+1)*sizeof(SQChar)); + valtype = 's'; + break; + case 'i': case 'd': case 'o': case 'u': case 'x': case 'X': +#ifdef _SQ64 + { + size_t flen = scstrlen(fmt); + SQInteger fpos = flen - 1; + SQChar f = fmt[fpos]; + SQChar *prec = (SQChar *)_PRINT_INT_PREC; + while(*prec != _SC('\0')) { + fmt[fpos++] = *prec++; + } + fmt[fpos++] = f; + fmt[fpos++] = _SC('\0'); + } +#endif + case 'c': + if(SQ_FAILED(sq_getinteger(v,nparam,&ti))) + return sq_throwerror(v,_SC("integer expected for the specified format")); + addlen = (ADDITIONAL_FORMAT_SPACE)+((w+1)*sizeof(SQChar)); + valtype = 'i'; + break; + case 'f': case 'g': case 'G': case 'e': case 'E': + if(SQ_FAILED(sq_getfloat(v,nparam,&tf))) + return sq_throwerror(v,_SC("float expected for the specified format")); + addlen = (ADDITIONAL_FORMAT_SPACE)+((w+1)*sizeof(SQChar)); + valtype = 'f'; + break; + default: + return sq_throwerror(v,_SC("invalid format")); + } + n++; + allocated += addlen + sizeof(SQChar); + dest = sq_getscratchpad(v,allocated); + switch(valtype) { + case 's': i += scsprintf(&dest[i],allocated,fmt,ts); break; + case 'i': i += scsprintf(&dest[i],allocated,fmt,ti); break; + case 'f': i += scsprintf(&dest[i],allocated,fmt,tf); break; + }; + nparam ++; + } + } + *outlen = i; + dest[i] = '\0'; + *output = dest; + return SQ_OK; +} + +static SQInteger _string_format(HSQUIRRELVM v) +{ + SQChar *dest = NULL; + SQInteger length = 0; + if(SQ_FAILED(sqstd_format(v,2,&length,&dest))) + return -1; + sq_pushstring(v,dest,length); + return 1; +} + +static void __strip_l(const SQChar *str,const SQChar **start) +{ + const SQChar *t = str; + while(((*t) != '\0') && scisspace(*t)){ t++; } + *start = t; +} + +static void __strip_r(const SQChar *str,SQInteger len,const SQChar **end) +{ + if(len == 0) { + *end = str; + return; + } + const SQChar *t = &str[len-1]; + while(t >= str && scisspace(*t)) { t--; } + *end = t + 1; +} + +static SQInteger _string_strip(HSQUIRRELVM v) +{ + const SQChar *str,*start,*end; + sq_getstring(v,2,&str); + SQInteger len = sq_getsize(v,2); + __strip_l(str,&start); + __strip_r(str,len,&end); + sq_pushstring(v,start,end - start); + return 1; +} + +static SQInteger _string_lstrip(HSQUIRRELVM v) +{ + const SQChar *str,*start; + sq_getstring(v,2,&str); + __strip_l(str,&start); + sq_pushstring(v,start,-1); + return 1; +} + +static SQInteger _string_rstrip(HSQUIRRELVM v) +{ + const SQChar *str,*end; + sq_getstring(v,2,&str); + SQInteger len = sq_getsize(v,2); + __strip_r(str,len,&end); + sq_pushstring(v,str,end - str); + return 1; +} + +static SQInteger _string_split(HSQUIRRELVM v) +{ + const SQChar *str,*seps; + SQChar *stemp; + sq_getstring(v,2,&str); + sq_getstring(v,3,&seps); + SQInteger sepsize = sq_getsize(v,3); + if(sepsize == 0) return sq_throwerror(v,_SC("empty separators string")); + SQInteger memsize = (sq_getsize(v,2)+1)*sizeof(SQChar); + stemp = sq_getscratchpad(v,memsize); + memcpy(stemp,str,memsize); + SQChar *start = stemp; + SQChar *end = stemp; + sq_newarray(v,0); + while(*end != '\0') + { + SQChar cur = *end; + for(SQInteger i = 0; i < sepsize; i++) + { + if(cur == seps[i]) + { + *end = 0; + sq_pushstring(v,start,-1); + sq_arrayappend(v,-2); + start = end + 1; + break; + } + } + end++; + } + if(end != start) + { + sq_pushstring(v,start,-1); + sq_arrayappend(v,-2); + } + return 1; +} + +static SQInteger _string_escape(HSQUIRRELVM v) +{ + const SQChar *str; + SQChar *dest,*resstr; + SQInteger size; + sq_getstring(v,2,&str); + size = sq_getsize(v,2); + if(size == 0) { + sq_push(v,2); + return 1; + } + SQInteger destcharsize = (size * 6); //assumes every char could be escaped + resstr = dest = (SQChar *)sq_getscratchpad(v,destcharsize * sizeof(SQChar)); + SQChar c; + SQChar escch; + SQInteger escaped = 0; + for(int n = 0; n < size; n++){ + c = *str++; + escch = 0; + if(scisprint(c) || c == 0) { + switch(c) { + case '\a': escch = 'a'; break; + case '\b': escch = 'b'; break; + case '\t': escch = 't'; break; + case '\n': escch = 'n'; break; + case '\v': escch = 'v'; break; + case '\f': escch = 'f'; break; + case '\r': escch = 'r'; break; + case '\\': escch = '\\'; break; + case '\"': escch = '\"'; break; + case '\'': escch = '\''; break; + case 0: escch = '0'; break; + } + if(escch) { + *dest++ = '\\'; + *dest++ = escch; + escaped++; + } + else { + *dest++ = c; + } + } + else { + dest += scsprintf(dest,destcharsize,_SC("\\x%x"),c); + escaped++; + } + } + + if(escaped) { + sq_pushstring(v,resstr,dest - resstr); + } + else { + sq_push(v,2); //nothing escaped + } + return 1; +} + +static SQInteger _string_startswith(HSQUIRRELVM v) +{ + const SQChar *str,*cmp; + sq_getstring(v,2,&str); + sq_getstring(v,3,&cmp); + SQInteger len = sq_getsize(v,2); + SQInteger cmplen = sq_getsize(v,3); + SQBool ret = SQFalse; + if(cmplen <= len) { + ret = memcmp(str,cmp,sq_rsl(cmplen)) == 0 ? SQTrue : SQFalse; + } + sq_pushbool(v,ret); + return 1; +} + +static SQInteger _string_endswith(HSQUIRRELVM v) +{ + const SQChar *str,*cmp; + sq_getstring(v,2,&str); + sq_getstring(v,3,&cmp); + SQInteger len = sq_getsize(v,2); + SQInteger cmplen = sq_getsize(v,3); + SQBool ret = SQFalse; + if(cmplen <= len) { + ret = memcmp(&str[len - cmplen],cmp,sq_rsl(cmplen)) == 0 ? SQTrue : SQFalse; + } + sq_pushbool(v,ret); + return 1; +} + +#define SETUP_REX(v) \ + SQRex *self = NULL; \ + sq_getinstanceup(v,1,(SQUserPointer *)&self,0); + +static SQInteger _rexobj_releasehook(SQUserPointer p, SQInteger size) +{ + SQRex *self = ((SQRex *)p); + sqstd_rex_free(self); + return 1; +} + +static SQInteger _regexp_match(HSQUIRRELVM v) +{ + SETUP_REX(v); + const SQChar *str; + sq_getstring(v,2,&str); + if(sqstd_rex_match(self,str) == SQTrue) + { + sq_pushbool(v,SQTrue); + return 1; + } + sq_pushbool(v,SQFalse); + return 1; +} + +static void _addrexmatch(HSQUIRRELVM v,const SQChar *str,const SQChar *begin,const SQChar *end) +{ + sq_newtable(v); + sq_pushstring(v,_SC("begin"),-1); + sq_pushinteger(v,begin - str); + sq_rawset(v,-3); + sq_pushstring(v,_SC("end"),-1); + sq_pushinteger(v,end - str); + sq_rawset(v,-3); +} + +static SQInteger _regexp_search(HSQUIRRELVM v) +{ + SETUP_REX(v); + const SQChar *str,*begin,*end; + SQInteger start = 0; + sq_getstring(v,2,&str); + if(sq_gettop(v) > 2) sq_getinteger(v,3,&start); + if(sqstd_rex_search(self,str+start,&begin,&end) == SQTrue) { + _addrexmatch(v,str,begin,end); + return 1; + } + return 0; +} + +static SQInteger _regexp_capture(HSQUIRRELVM v) +{ + SETUP_REX(v); + const SQChar *str,*begin,*end; + SQInteger start = 0; + sq_getstring(v,2,&str); + if(sq_gettop(v) > 2) sq_getinteger(v,3,&start); + if(sqstd_rex_search(self,str+start,&begin,&end) == SQTrue) { + SQInteger n = sqstd_rex_getsubexpcount(self); + SQRexMatch match; + sq_newarray(v,0); + for(SQInteger i = 0;i < n; i++) { + sqstd_rex_getsubexp(self,i,&match); + if(match.len > 0) + _addrexmatch(v,str,match.begin,match.begin+match.len); + else + _addrexmatch(v,str,str,str); //empty match + sq_arrayappend(v,-2); + } + return 1; + } + return 0; +} + +static SQInteger _regexp_subexpcount(HSQUIRRELVM v) +{ + SETUP_REX(v); + sq_pushinteger(v,sqstd_rex_getsubexpcount(self)); + return 1; +} + +static SQInteger _regexp_constructor(HSQUIRRELVM v) +{ + const SQChar *error,*pattern; + sq_getstring(v,2,&pattern); + SQRex *rex = sqstd_rex_compile(pattern,&error); + if(!rex) return sq_throwerror(v,error); + sq_setinstanceup(v,1,rex); + sq_setreleasehook(v,1,_rexobj_releasehook); + return 0; +} + +static SQInteger _regexp__typeof(HSQUIRRELVM v) +{ + sq_pushstring(v,_SC("regexp"),-1); + return 1; +} + +#define _DECL_REX_FUNC(name,nparams,pmask) {_SC(#name),_regexp_##name,nparams,pmask} +static SQRegFunction rexobj_funcs[]={ + _DECL_REX_FUNC(constructor,2,_SC(".s")), + _DECL_REX_FUNC(search,-2,_SC("xsn")), + _DECL_REX_FUNC(match,2,_SC("xs")), + _DECL_REX_FUNC(capture,-2,_SC("xsn")), + _DECL_REX_FUNC(subexpcount,1,_SC("x")), + _DECL_REX_FUNC(_typeof,1,_SC("x")), + {0,0} +}; +#undef _DECL_REX_FUNC + +#define _DECL_FUNC(name,nparams,pmask) {_SC(#name),_string_##name,nparams,pmask} +static SQRegFunction stringlib_funcs[]={ + _DECL_FUNC(format,-2,_SC(".s")), + _DECL_FUNC(strip,2,_SC(".s")), + _DECL_FUNC(lstrip,2,_SC(".s")), + _DECL_FUNC(rstrip,2,_SC(".s")), + _DECL_FUNC(split,3,_SC(".ss")), + _DECL_FUNC(escape,2,_SC(".s")), + _DECL_FUNC(startswith,3,_SC(".ss")), + _DECL_FUNC(endswith,3,_SC(".ss")), + {0,0} +}; +#undef _DECL_FUNC + + +SQInteger sqstd_register_stringlib(HSQUIRRELVM v) +{ + sq_pushstring(v,_SC("regexp"),-1); + sq_newclass(v,SQFalse); + SQInteger i = 0; + while(rexobj_funcs[i].name != 0) { + SQRegFunction &f = rexobj_funcs[i]; + sq_pushstring(v,f.name,-1); + sq_newclosure(v,f.f,0); + sq_setparamscheck(v,f.nparamscheck,f.typemask); + sq_setnativeclosurename(v,-1,f.name); + sq_newslot(v,-3,SQFalse); + i++; + } + sq_newslot(v,-3,SQFalse); + + i = 0; + while(stringlib_funcs[i].name!=0) + { + sq_pushstring(v,stringlib_funcs[i].name,-1); + sq_newclosure(v,stringlib_funcs[i].f,0); + sq_setparamscheck(v,stringlib_funcs[i].nparamscheck,stringlib_funcs[i].typemask); + sq_setnativeclosurename(v,-1,stringlib_funcs[i].name); + sq_newslot(v,-3,SQFalse); + i++; + } + return 1; +} diff --git a/sqstdlib/sqstdsystem.cpp b/sqstdlib/sqstdsystem.cpp new file mode 100644 index 0000000..b7b1196 --- /dev/null +++ b/sqstdlib/sqstdsystem.cpp @@ -0,0 +1,146 @@ +/* see copyright notice in squirrel.h */ +#include +#include +#include +#include +#include + +#ifdef SQUNICODE +#include +#define scgetenv _wgetenv +#define scsystem _wsystem +#define scasctime _wasctime +#define scremove _wremove +#define screname _wrename +#else +#define scgetenv getenv +#define scsystem system +#define scasctime asctime +#define scremove remove +#define screname rename +#endif + +static SQInteger _system_getenv(HSQUIRRELVM v) +{ + const SQChar *s; + if(SQ_SUCCEEDED(sq_getstring(v,2,&s))){ + sq_pushstring(v,scgetenv(s),-1); + return 1; + } + return 0; +} + + +static SQInteger _system_system(HSQUIRRELVM v) +{ + const SQChar *s; + if(SQ_SUCCEEDED(sq_getstring(v,2,&s))){ + sq_pushinteger(v,scsystem(s)); + return 1; + } + return sq_throwerror(v,_SC("wrong param")); +} + + +static SQInteger _system_clock(HSQUIRRELVM v) +{ + sq_pushfloat(v,((SQFloat)clock())/(SQFloat)CLOCKS_PER_SEC); + return 1; +} + +static SQInteger _system_time(HSQUIRRELVM v) +{ + SQInteger t = (SQInteger)time(NULL); + sq_pushinteger(v,t); + return 1; +} + +static SQInteger _system_remove(HSQUIRRELVM v) +{ + const SQChar *s; + sq_getstring(v,2,&s); + if(scremove(s)==-1) + return sq_throwerror(v,_SC("remove() failed")); + return 0; +} + +static SQInteger _system_rename(HSQUIRRELVM v) +{ + const SQChar *oldn,*newn; + sq_getstring(v,2,&oldn); + sq_getstring(v,3,&newn); + if(screname(oldn,newn)==-1) + return sq_throwerror(v,_SC("rename() failed")); + return 0; +} + +static void _set_integer_slot(HSQUIRRELVM v,const SQChar *name,SQInteger val) +{ + sq_pushstring(v,name,-1); + sq_pushinteger(v,val); + sq_rawset(v,-3); +} + +static SQInteger _system_date(HSQUIRRELVM v) +{ + time_t t; + SQInteger it; + SQInteger format = 'l'; + if(sq_gettop(v) > 1) { + sq_getinteger(v,2,&it); + t = it; + if(sq_gettop(v) > 2) { + sq_getinteger(v,3,(SQInteger*)&format); + } + } + else { + time(&t); + } + tm *date; + if(format == 'u') + date = gmtime(&t); + else + date = localtime(&t); + if(!date) + return sq_throwerror(v,_SC("crt api failure")); + sq_newtable(v); + _set_integer_slot(v, _SC("sec"), date->tm_sec); + _set_integer_slot(v, _SC("min"), date->tm_min); + _set_integer_slot(v, _SC("hour"), date->tm_hour); + _set_integer_slot(v, _SC("day"), date->tm_mday); + _set_integer_slot(v, _SC("month"), date->tm_mon); + _set_integer_slot(v, _SC("year"), date->tm_year+1900); + _set_integer_slot(v, _SC("wday"), date->tm_wday); + _set_integer_slot(v, _SC("yday"), date->tm_yday); + return 1; +} + + + +#define _DECL_FUNC(name,nparams,pmask) {_SC(#name),_system_##name,nparams,pmask} +static SQRegFunction systemlib_funcs[]={ + _DECL_FUNC(getenv,2,_SC(".s")), + _DECL_FUNC(system,2,_SC(".s")), + _DECL_FUNC(clock,0,NULL), + _DECL_FUNC(time,1,NULL), + _DECL_FUNC(date,-1,_SC(".nn")), + _DECL_FUNC(remove,2,_SC(".s")), + _DECL_FUNC(rename,3,_SC(".ss")), + {0,0} +}; +#undef _DECL_FUNC + +SQInteger sqstd_register_systemlib(HSQUIRRELVM v) +{ + SQInteger i=0; + while(systemlib_funcs[i].name!=0) + { + sq_pushstring(v,systemlib_funcs[i].name,-1); + sq_newclosure(v,systemlib_funcs[i].f,0); + sq_setparamscheck(v,systemlib_funcs[i].nparamscheck,systemlib_funcs[i].typemask); + sq_setnativeclosurename(v,-1,systemlib_funcs[i].name); + sq_newslot(v,-3,SQFalse); + i++; + } + return 1; +} diff --git a/squirrel.dsw b/squirrel.dsw new file mode 100644 index 0000000..db43df6 --- /dev/null +++ b/squirrel.dsw @@ -0,0 +1,77 @@ +Microsoft Developer Studio Workspace File, Format Version 6.00 +# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE! + +############################################################################### + +Project: "sq"=.\sq\sq.dsp - Package Owner=<4> + +Package=<5> +{{{ + begin source code control + . + end source code control +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name sqlibs + End Project Dependency + Begin Project Dependency + Project_Dep_Name squirrel + End Project Dependency + Begin Project Dependency + Project_Dep_Name sqstdlib + End Project Dependency +}}} + +############################################################################### + +Project: "sqstdlib"=.\sqstdlib\sqstdlib.dsp - Package Owner=<4> + +Package=<5> +{{{ + begin source code control + "$/squirrel", HAAAAAAA + . + end source code control +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "squirrel"=.\squirrel\squirrel.dsp - Package Owner=<4> + +Package=<5> +{{{ + begin source code control + "$/squirrel", HAAAAAAA + . + end source code control +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Global: + +Package=<5> +{{{ + begin source code control + "$/squirrel", HAAAAAAA + . + end source code control +}}} + +Package=<3> +{{{ +}}} + +############################################################################### + diff --git a/squirrel/Makefile b/squirrel/Makefile new file mode 100644 index 0000000..d5de81a --- /dev/null +++ b/squirrel/Makefile @@ -0,0 +1,52 @@ +SQUIRREL= .. + + +OUT= $(SQUIRREL)/lib/libsquirrel.a +INCZ= -I$(SQUIRREL)/include -I. -Iinclude +DEFS= +LIB= + +OBJS= \ + sqapi.o \ + sqbaselib.o \ + sqfuncstate.o \ + sqdebug.o \ + sqlexer.o \ + sqobject.o \ + sqcompiler.o \ + sqstate.o \ + sqtable.o \ + sqmem.o \ + sqvm.o \ + sqclass.o + +SRCS= \ + sqapi.cpp \ + sqbaselib.cpp \ + sqfuncstate.cpp \ + sqdebug.cpp \ + sqlexer.cpp \ + sqobject.cpp \ + sqcompiler.cpp \ + sqstate.cpp \ + sqtable.cpp \ + sqmem.cpp \ + sqvm.cpp \ + sqclass.cpp + + + +sq32: + gcc -O2 -fno-exceptions -fno-rtti -Wall -fno-strict-aliasing -c $(SRCS) $(INCZ) $(DEFS) + ar rc $(OUT) *.o + rm *.o + +sqprof: + gcc -O2 -pg -fno-exceptions -fno-rtti -pie -gstabs -g3 -Wall -fno-strict-aliasing -c $(SRCS) $(INCZ) $(DEFS) + ar rc $(OUT) *.o + rm *.o + +sq64: + gcc -O2 -m64 -D_SQ64 -fno-exceptions -fno-rtti -Wall -fno-strict-aliasing -c $(SRCS) $(INCZ) $(DEFS) + ar rc $(OUT) *.o + rm *.o diff --git a/squirrel/sqapi.cpp b/squirrel/sqapi.cpp new file mode 100644 index 0000000..93c86b0 --- /dev/null +++ b/squirrel/sqapi.cpp @@ -0,0 +1,1595 @@ +/* + see copyright notice in squirrel.h +*/ +#include "sqpcheader.h" +#include "sqvm.h" +#include "sqstring.h" +#include "sqtable.h" +#include "sqarray.h" +#include "sqfuncproto.h" +#include "sqclosure.h" +#include "squserdata.h" +#include "sqcompiler.h" +#include "sqfuncstate.h" +#include "sqclass.h" + +static bool sq_aux_gettypedarg(HSQUIRRELVM v,SQInteger idx,SQObjectType type,SQObjectPtr **o) +{ + *o = &stack_get(v,idx); + if(type(**o) != type){ + SQObjectPtr oval = v->PrintObjVal(**o); + v->Raise_Error(_SC("wrong argument type, expected '%s' got '%.50s'"),IdType2Name(type),_stringval(oval)); + return false; + } + return true; +} + +#define _GETSAFE_OBJ(v,idx,type,o) { if(!sq_aux_gettypedarg(v,idx,type,&o)) return SQ_ERROR; } + +#define sq_aux_paramscheck(v,count) \ +{ \ + if(sq_gettop(v) < count){ v->Raise_Error(_SC("not enough params in the stack")); return SQ_ERROR; }\ +} + + +SQInteger sq_aux_invalidtype(HSQUIRRELVM v,SQObjectType type) +{ + scsprintf(_ss(v)->GetScratchPad(100), 100 *sizeof(SQChar), _SC("unexpected type %s"), IdType2Name(type)); + return sq_throwerror(v, _ss(v)->GetScratchPad(-1)); +} + +HSQUIRRELVM sq_open(SQInteger initialstacksize) +{ + SQSharedState *ss; + SQVM *v; + sq_new(ss, SQSharedState); + ss->Init(); + v = (SQVM *)SQ_MALLOC(sizeof(SQVM)); + new (v) SQVM(ss); + ss->_root_vm = v; + if(v->Init(NULL, initialstacksize)) { + return v; + } else { + sq_delete(v, SQVM); + return NULL; + } + return v; +} + +HSQUIRRELVM sq_newthread(HSQUIRRELVM friendvm, SQInteger initialstacksize) +{ + SQSharedState *ss; + SQVM *v; + ss=_ss(friendvm); + + v= (SQVM *)SQ_MALLOC(sizeof(SQVM)); + new (v) SQVM(ss); + + if(v->Init(friendvm, initialstacksize)) { + friendvm->Push(v); + return v; + } else { + sq_delete(v, SQVM); + return NULL; + } +} + +SQInteger sq_getvmstate(HSQUIRRELVM v) +{ + if(v->_suspended) + return SQ_VMSTATE_SUSPENDED; + else { + if(v->_callsstacksize != 0) return SQ_VMSTATE_RUNNING; + else return SQ_VMSTATE_IDLE; + } +} + +void sq_seterrorhandler(HSQUIRRELVM v) +{ + SQObject o = stack_get(v, -1); + if(sq_isclosure(o) || sq_isnativeclosure(o) || sq_isnull(o)) { + v->_errorhandler = o; + v->Pop(); + } +} + +void sq_setnativedebughook(HSQUIRRELVM v,SQDEBUGHOOK hook) +{ + v->_debughook_native = hook; + v->_debughook_closure.Null(); + v->_debughook = hook?true:false; +} + +void sq_setdebughook(HSQUIRRELVM v) +{ + SQObject o = stack_get(v,-1); + if(sq_isclosure(o) || sq_isnativeclosure(o) || sq_isnull(o)) { + v->_debughook_closure = o; + v->_debughook_native = NULL; + v->_debughook = !sq_isnull(o); + v->Pop(); + } +} + +void sq_close(HSQUIRRELVM v) +{ + SQSharedState *ss = _ss(v); + _thread(ss->_root_vm)->Finalize(); + sq_delete(ss, SQSharedState); +} + +SQInteger sq_getversion() +{ + return SQUIRREL_VERSION_NUMBER; +} + +SQRESULT sq_compile(HSQUIRRELVM v,SQLEXREADFUNC read,SQUserPointer p,const SQChar *sourcename,SQBool raiseerror) +{ + SQObjectPtr o; +#ifndef NO_COMPILER + if(Compile(v, read, p, sourcename, o, raiseerror?true:false, _ss(v)->_debuginfo)) { + v->Push(SQClosure::Create(_ss(v), _funcproto(o), _table(v->_roottable)->GetWeakRef(OT_TABLE))); + return SQ_OK; + } + return SQ_ERROR; +#else + return sq_throwerror(v,_SC("this is a no compiler build")); +#endif +} + +void sq_enabledebuginfo(HSQUIRRELVM v, SQBool enable) +{ + _ss(v)->_debuginfo = enable?true:false; +} + +void sq_notifyallexceptions(HSQUIRRELVM v, SQBool enable) +{ + _ss(v)->_notifyallexceptions = enable?true:false; +} + +void sq_addref(HSQUIRRELVM v,HSQOBJECT *po) +{ + if(!ISREFCOUNTED(type(*po))) return; +#ifdef NO_GARBAGE_COLLECTOR + __AddRef(po->_type,po->_unVal); +#else + _ss(v)->_refs_table.AddRef(*po); +#endif +} + +SQUnsignedInteger sq_getrefcount(HSQUIRRELVM v,HSQOBJECT *po) +{ + if(!ISREFCOUNTED(type(*po))) return 0; +#ifdef NO_GARBAGE_COLLECTOR + return po->_unVal.pRefCounted->_uiRef; +#else + return _ss(v)->_refs_table.GetRefCount(*po); +#endif +} + +SQBool sq_release(HSQUIRRELVM v,HSQOBJECT *po) +{ + if(!ISREFCOUNTED(type(*po))) return SQTrue; +#ifdef NO_GARBAGE_COLLECTOR + bool ret = (po->_unVal.pRefCounted->_uiRef <= 1) ? SQTrue : SQFalse; + __Release(po->_type,po->_unVal); + return ret; //the ret val doesn't work(and cannot be fixed) +#else + return _ss(v)->_refs_table.Release(*po); +#endif +} + +SQUnsignedInteger sq_getvmrefcount(HSQUIRRELVM v, const HSQOBJECT *po) +{ + if (!ISREFCOUNTED(type(*po))) return 0; + return po->_unVal.pRefCounted->_uiRef; +} + +const SQChar *sq_objtostring(const HSQOBJECT *o) +{ + if(sq_type(*o) == OT_STRING) { + return _stringval(*o); + } + return NULL; +} + +SQInteger sq_objtointeger(const HSQOBJECT *o) +{ + if(sq_isnumeric(*o)) { + return tointeger(*o); + } + return 0; +} + +SQFloat sq_objtofloat(const HSQOBJECT *o) +{ + if(sq_isnumeric(*o)) { + return tofloat(*o); + } + return 0; +} + +SQBool sq_objtobool(const HSQOBJECT *o) +{ + if(sq_isbool(*o)) { + return _integer(*o); + } + return SQFalse; +} + +SQUserPointer sq_objtouserpointer(const HSQOBJECT *o) +{ + if(sq_isuserpointer(*o)) { + return _userpointer(*o); + } + return 0; +} + +void sq_pushnull(HSQUIRRELVM v) +{ + v->PushNull(); +} + +void sq_pushstring(HSQUIRRELVM v,const SQChar *s,SQInteger len) +{ + if(s) + v->Push(SQObjectPtr(SQString::Create(_ss(v), s, len))); + else v->PushNull(); +} + +void sq_pushinteger(HSQUIRRELVM v,SQInteger n) +{ + v->Push(n); +} + +void sq_pushbool(HSQUIRRELVM v,SQBool b) +{ + v->Push(b?true:false); +} + +void sq_pushfloat(HSQUIRRELVM v,SQFloat n) +{ + v->Push(n); +} + +void sq_pushuserpointer(HSQUIRRELVM v,SQUserPointer p) +{ + v->Push(p); +} + +void sq_pushthread(HSQUIRRELVM v, HSQUIRRELVM thread) +{ + v->Push(thread); +} + +SQUserPointer sq_newuserdata(HSQUIRRELVM v,SQUnsignedInteger size) +{ + SQUserData *ud = SQUserData::Create(_ss(v), size + SQ_ALIGNMENT); + v->Push(ud); + return (SQUserPointer)sq_aligning(ud + 1); +} + +void sq_newtable(HSQUIRRELVM v) +{ + v->Push(SQTable::Create(_ss(v), 0)); +} + +void sq_newtableex(HSQUIRRELVM v,SQInteger initialcapacity) +{ + v->Push(SQTable::Create(_ss(v), initialcapacity)); +} + +void sq_newarray(HSQUIRRELVM v,SQInteger size) +{ + v->Push(SQArray::Create(_ss(v), size)); +} + +SQRESULT sq_newclass(HSQUIRRELVM v,SQBool hasbase) +{ + SQClass *baseclass = NULL; + if(hasbase) { + SQObjectPtr &base = stack_get(v,-1); + if(type(base) != OT_CLASS) + return sq_throwerror(v,_SC("invalid base type")); + baseclass = _class(base); + } + SQClass *newclass = SQClass::Create(_ss(v), baseclass); + if(baseclass) v->Pop(); + v->Push(newclass); + return SQ_OK; +} + +SQBool sq_instanceof(HSQUIRRELVM v) +{ + SQObjectPtr &inst = stack_get(v,-1); + SQObjectPtr &cl = stack_get(v,-2); + if(type(inst) != OT_INSTANCE || type(cl) != OT_CLASS) + return sq_throwerror(v,_SC("invalid param type")); + return _instance(inst)->InstanceOf(_class(cl))?SQTrue:SQFalse; +} + +SQRESULT sq_arrayappend(HSQUIRRELVM v,SQInteger idx) +{ + sq_aux_paramscheck(v,2); + SQObjectPtr *arr; + _GETSAFE_OBJ(v, idx, OT_ARRAY,arr); + _array(*arr)->Append(v->GetUp(-1)); + v->Pop(); + return SQ_OK; +} + +SQRESULT sq_arraypop(HSQUIRRELVM v,SQInteger idx,SQBool pushval) +{ + sq_aux_paramscheck(v, 1); + SQObjectPtr *arr; + _GETSAFE_OBJ(v, idx, OT_ARRAY,arr); + if(_array(*arr)->Size() > 0) { + if(pushval != 0){ v->Push(_array(*arr)->Top()); } + _array(*arr)->Pop(); + return SQ_OK; + } + return sq_throwerror(v, _SC("empty array")); +} + +SQRESULT sq_arrayresize(HSQUIRRELVM v,SQInteger idx,SQInteger newsize) +{ + sq_aux_paramscheck(v,1); + SQObjectPtr *arr; + _GETSAFE_OBJ(v, idx, OT_ARRAY,arr); + if(newsize >= 0) { + _array(*arr)->Resize(newsize); + return SQ_OK; + } + return sq_throwerror(v,_SC("negative size")); +} + + +SQRESULT sq_arrayreverse(HSQUIRRELVM v,SQInteger idx) +{ + sq_aux_paramscheck(v, 1); + SQObjectPtr *o; + _GETSAFE_OBJ(v, idx, OT_ARRAY,o); + SQArray *arr = _array(*o); + if(arr->Size() > 0) { + SQObjectPtr t; + SQInteger size = arr->Size(); + SQInteger n = size >> 1; size -= 1; + for(SQInteger i = 0; i < n; i++) { + t = arr->_values[i]; + arr->_values[i] = arr->_values[size-i]; + arr->_values[size-i] = t; + } + return SQ_OK; + } + return SQ_OK; +} + +SQRESULT sq_arrayremove(HSQUIRRELVM v,SQInteger idx,SQInteger itemidx) +{ + sq_aux_paramscheck(v, 1); + SQObjectPtr *arr; + _GETSAFE_OBJ(v, idx, OT_ARRAY,arr); + return _array(*arr)->Remove(itemidx) ? SQ_OK : sq_throwerror(v,_SC("index out of range")); +} + +SQRESULT sq_arrayinsert(HSQUIRRELVM v,SQInteger idx,SQInteger destpos) +{ + sq_aux_paramscheck(v, 1); + SQObjectPtr *arr; + _GETSAFE_OBJ(v, idx, OT_ARRAY,arr); + SQRESULT ret = _array(*arr)->Insert(destpos, v->GetUp(-1)) ? SQ_OK : sq_throwerror(v,_SC("index out of range")); + v->Pop(); + return ret; +} + +void sq_newclosure(HSQUIRRELVM v,SQFUNCTION func,SQUnsignedInteger nfreevars) +{ + SQNativeClosure *nc = SQNativeClosure::Create(_ss(v), func,nfreevars); + nc->_nparamscheck = 0; + for(SQUnsignedInteger i = 0; i < nfreevars; i++) { + nc->_outervalues[i] = v->Top(); + v->Pop(); + } + v->Push(SQObjectPtr(nc)); +} + +SQRESULT sq_getclosureinfo(HSQUIRRELVM v,SQInteger idx,SQUnsignedInteger *nparams,SQUnsignedInteger *nfreevars) +{ + SQObject o = stack_get(v, idx); + if(type(o) == OT_CLOSURE) { + SQClosure *c = _closure(o); + SQFunctionProto *proto = c->_function; + *nparams = (SQUnsignedInteger)proto->_nparameters; + *nfreevars = (SQUnsignedInteger)proto->_noutervalues; + return SQ_OK; + } + else if(type(o) == OT_NATIVECLOSURE) + { + SQNativeClosure *c = _nativeclosure(o); + *nparams = (SQUnsignedInteger)c->_nparamscheck; + *nfreevars = c->_noutervalues; + return SQ_OK; + } + return sq_throwerror(v,_SC("the object is not a closure")); +} + +SQRESULT sq_setnativeclosurename(HSQUIRRELVM v,SQInteger idx,const SQChar *name) +{ + SQObject o = stack_get(v, idx); + if(sq_isnativeclosure(o)) { + SQNativeClosure *nc = _nativeclosure(o); + nc->_name = SQString::Create(_ss(v),name); + return SQ_OK; + } + return sq_throwerror(v,_SC("the object is not a nativeclosure")); +} + +SQRESULT sq_setparamscheck(HSQUIRRELVM v,SQInteger nparamscheck,const SQChar *typemask) +{ + SQObject o = stack_get(v, -1); + if(!sq_isnativeclosure(o)) + return sq_throwerror(v, _SC("native closure expected")); + SQNativeClosure *nc = _nativeclosure(o); + nc->_nparamscheck = nparamscheck; + if(typemask) { + SQIntVec res; + if(!CompileTypemask(res, typemask)) + return sq_throwerror(v, _SC("invalid typemask")); + nc->_typecheck.copy(res); + } + else { + nc->_typecheck.resize(0); + } + if(nparamscheck == SQ_MATCHTYPEMASKSTRING) { + nc->_nparamscheck = nc->_typecheck.size(); + } + return SQ_OK; +} + +SQRESULT sq_bindenv(HSQUIRRELVM v,SQInteger idx) +{ + SQObjectPtr &o = stack_get(v,idx); + if(!sq_isnativeclosure(o) && + !sq_isclosure(o)) + return sq_throwerror(v,_SC("the target is not a closure")); + SQObjectPtr &env = stack_get(v,-1); + if(!sq_istable(env) && + !sq_isclass(env) && + !sq_isinstance(env)) + return sq_throwerror(v,_SC("invalid environment")); + SQWeakRef *w = _refcounted(env)->GetWeakRef(type(env)); + SQObjectPtr ret; + if(sq_isclosure(o)) { + SQClosure *c = _closure(o)->Clone(); + __ObjRelease(c->_env); + c->_env = w; + __ObjAddRef(c->_env); + if(_closure(o)->_base) { + c->_base = _closure(o)->_base; + __ObjAddRef(c->_base); + } + ret = c; + } + else { //then must be a native closure + SQNativeClosure *c = _nativeclosure(o)->Clone(); + __ObjRelease(c->_env); + c->_env = w; + __ObjAddRef(c->_env); + ret = c; + } + v->Pop(); + v->Push(ret); + return SQ_OK; +} + +SQRESULT sq_getclosurename(HSQUIRRELVM v,SQInteger idx) +{ + SQObjectPtr &o = stack_get(v,idx); + if(!sq_isnativeclosure(o) && + !sq_isclosure(o)) + return sq_throwerror(v,_SC("the target is not a closure")); + if(sq_isnativeclosure(o)) + { + v->Push(_nativeclosure(o)->_name); + } + else { //closure + v->Push(_closure(o)->_function->_name); + } + return SQ_OK; +} + +SQRESULT sq_setclosureroot(HSQUIRRELVM v,SQInteger idx) +{ + SQObjectPtr &c = stack_get(v,idx); + SQObject o = stack_get(v, -1); + if(!sq_isclosure(c)) return sq_throwerror(v, _SC("closure expected")); + if(sq_istable(o)) { + _closure(c)->SetRoot(_table(o)->GetWeakRef(OT_TABLE)); + v->Pop(); + return SQ_OK; + } + return sq_throwerror(v, _SC("ivalid type")); +} + +SQRESULT sq_getclosureroot(HSQUIRRELVM v,SQInteger idx) +{ + SQObjectPtr &c = stack_get(v,idx); + if(!sq_isclosure(c)) return sq_throwerror(v, _SC("closure expected")); + v->Push(_closure(c)->_root->_obj); + return SQ_OK; +} + +SQRESULT sq_clear(HSQUIRRELVM v,SQInteger idx) +{ + SQObject &o=stack_get(v,idx); + switch(type(o)) { + case OT_TABLE: _table(o)->Clear(); break; + case OT_ARRAY: _array(o)->Resize(0); break; + default: + return sq_throwerror(v, _SC("clear only works on table and array")); + break; + + } + return SQ_OK; +} + +void sq_pushroottable(HSQUIRRELVM v) +{ + v->Push(v->_roottable); +} + +void sq_pushregistrytable(HSQUIRRELVM v) +{ + v->Push(_ss(v)->_registry); +} + +void sq_pushconsttable(HSQUIRRELVM v) +{ + v->Push(_ss(v)->_consts); +} + +SQRESULT sq_setroottable(HSQUIRRELVM v) +{ + SQObject o = stack_get(v, -1); + if(sq_istable(o) || sq_isnull(o)) { + v->_roottable = o; + v->Pop(); + return SQ_OK; + } + return sq_throwerror(v, _SC("ivalid type")); +} + +SQRESULT sq_setconsttable(HSQUIRRELVM v) +{ + SQObject o = stack_get(v, -1); + if(sq_istable(o)) { + _ss(v)->_consts = o; + v->Pop(); + return SQ_OK; + } + return sq_throwerror(v, _SC("ivalid type, expected table")); +} + +void sq_setforeignptr(HSQUIRRELVM v,SQUserPointer p) +{ + v->_foreignptr = p; +} + +SQUserPointer sq_getforeignptr(HSQUIRRELVM v) +{ + return v->_foreignptr; +} + +void sq_setsharedforeignptr(HSQUIRRELVM v,SQUserPointer p) +{ + _ss(v)->_foreignptr = p; +} + +SQUserPointer sq_getsharedforeignptr(HSQUIRRELVM v) +{ + return _ss(v)->_foreignptr; +} + +void sq_setvmreleasehook(HSQUIRRELVM v,SQRELEASEHOOK hook) +{ + v->_releasehook = hook; +} + +SQRELEASEHOOK sq_getvmreleasehook(HSQUIRRELVM v) +{ + return v->_releasehook; +} + +void sq_setsharedreleasehook(HSQUIRRELVM v,SQRELEASEHOOK hook) +{ + _ss(v)->_releasehook = hook; +} + +SQRELEASEHOOK sq_getsharedreleasehook(HSQUIRRELVM v) +{ + return _ss(v)->_releasehook; +} + +void sq_push(HSQUIRRELVM v,SQInteger idx) +{ + v->Push(stack_get(v, idx)); +} + +SQObjectType sq_gettype(HSQUIRRELVM v,SQInteger idx) +{ + return type(stack_get(v, idx)); +} + +SQRESULT sq_typeof(HSQUIRRELVM v,SQInteger idx) +{ + SQObjectPtr &o = stack_get(v, idx); + SQObjectPtr res; + if(!v->TypeOf(o,res)) { + return SQ_ERROR; + } + v->Push(res); + return SQ_OK; +} + +SQRESULT sq_tostring(HSQUIRRELVM v,SQInteger idx) +{ + SQObjectPtr &o = stack_get(v, idx); + SQObjectPtr res; + if(!v->ToString(o,res)) { + return SQ_ERROR; + } + v->Push(res); + return SQ_OK; +} + +void sq_tobool(HSQUIRRELVM v, SQInteger idx, SQBool *b) +{ + SQObjectPtr &o = stack_get(v, idx); + *b = SQVM::IsFalse(o)?SQFalse:SQTrue; +} + +SQRESULT sq_getinteger(HSQUIRRELVM v,SQInteger idx,SQInteger *i) +{ + SQObjectPtr &o = stack_get(v, idx); + if(sq_isnumeric(o)) { + *i = tointeger(o); + return SQ_OK; + } + return SQ_ERROR; +} + +SQRESULT sq_getfloat(HSQUIRRELVM v,SQInteger idx,SQFloat *f) +{ + SQObjectPtr &o = stack_get(v, idx); + if(sq_isnumeric(o)) { + *f = tofloat(o); + return SQ_OK; + } + return SQ_ERROR; +} + +SQRESULT sq_getbool(HSQUIRRELVM v,SQInteger idx,SQBool *b) +{ + SQObjectPtr &o = stack_get(v, idx); + if(sq_isbool(o)) { + *b = _integer(o); + return SQ_OK; + } + return SQ_ERROR; +} + +SQRESULT sq_getstring(HSQUIRRELVM v,SQInteger idx,const SQChar **c) +{ + SQObjectPtr *o = NULL; + _GETSAFE_OBJ(v, idx, OT_STRING,o); + *c = _stringval(*o); + return SQ_OK; +} + +SQRESULT sq_getthread(HSQUIRRELVM v,SQInteger idx,HSQUIRRELVM *thread) +{ + SQObjectPtr *o = NULL; + _GETSAFE_OBJ(v, idx, OT_THREAD,o); + *thread = _thread(*o); + return SQ_OK; +} + +SQRESULT sq_clone(HSQUIRRELVM v,SQInteger idx) +{ + SQObjectPtr &o = stack_get(v,idx); + v->PushNull(); + if(!v->Clone(o, stack_get(v, -1))){ + v->Pop(); + return SQ_ERROR; + } + return SQ_OK; +} + +SQInteger sq_getsize(HSQUIRRELVM v, SQInteger idx) +{ + SQObjectPtr &o = stack_get(v, idx); + SQObjectType type = type(o); + switch(type) { + case OT_STRING: return _string(o)->_len; + case OT_TABLE: return _table(o)->CountUsed(); + case OT_ARRAY: return _array(o)->Size(); + case OT_USERDATA: return _userdata(o)->_size; + case OT_INSTANCE: return _instance(o)->_class->_udsize; + case OT_CLASS: return _class(o)->_udsize; + default: + return sq_aux_invalidtype(v, type); + } +} + +SQHash sq_gethash(HSQUIRRELVM v, SQInteger idx) +{ + SQObjectPtr &o = stack_get(v, idx); + return HashObj(o); +} + +SQRESULT sq_getuserdata(HSQUIRRELVM v,SQInteger idx,SQUserPointer *p,SQUserPointer *typetag) +{ + SQObjectPtr *o = NULL; + _GETSAFE_OBJ(v, idx, OT_USERDATA,o); + (*p) = _userdataval(*o); + if(typetag) *typetag = _userdata(*o)->_typetag; + return SQ_OK; +} + +SQRESULT sq_settypetag(HSQUIRRELVM v,SQInteger idx,SQUserPointer typetag) +{ + SQObjectPtr &o = stack_get(v,idx); + switch(type(o)) { + case OT_USERDATA: _userdata(o)->_typetag = typetag; break; + case OT_CLASS: _class(o)->_typetag = typetag; break; + default: return sq_throwerror(v,_SC("invalid object type")); + } + return SQ_OK; +} + +SQRESULT sq_getobjtypetag(const HSQOBJECT *o,SQUserPointer * typetag) +{ + switch(type(*o)) { + case OT_INSTANCE: *typetag = _instance(*o)->_class->_typetag; break; + case OT_USERDATA: *typetag = _userdata(*o)->_typetag; break; + case OT_CLASS: *typetag = _class(*o)->_typetag; break; + default: return SQ_ERROR; + } + return SQ_OK; +} + +SQRESULT sq_gettypetag(HSQUIRRELVM v,SQInteger idx,SQUserPointer *typetag) +{ + SQObjectPtr &o = stack_get(v,idx); + if(SQ_FAILED(sq_getobjtypetag(&o,typetag))) + return sq_throwerror(v,_SC("invalid object type")); + return SQ_OK; +} + +SQRESULT sq_getuserpointer(HSQUIRRELVM v, SQInteger idx, SQUserPointer *p) +{ + SQObjectPtr *o = NULL; + _GETSAFE_OBJ(v, idx, OT_USERPOINTER,o); + (*p) = _userpointer(*o); + return SQ_OK; +} + +SQRESULT sq_setinstanceup(HSQUIRRELVM v, SQInteger idx, SQUserPointer p) +{ + SQObjectPtr &o = stack_get(v,idx); + if(type(o) != OT_INSTANCE) return sq_throwerror(v,_SC("the object is not a class instance")); + _instance(o)->_userpointer = p; + return SQ_OK; +} + +SQRESULT sq_setclassudsize(HSQUIRRELVM v, SQInteger idx, SQInteger udsize) +{ + SQObjectPtr &o = stack_get(v,idx); + if(type(o) != OT_CLASS) return sq_throwerror(v,_SC("the object is not a class")); + if(_class(o)->_locked) return sq_throwerror(v,_SC("the class is locked")); + _class(o)->_udsize = udsize; + return SQ_OK; +} + + +SQRESULT sq_getinstanceup(HSQUIRRELVM v, SQInteger idx, SQUserPointer *p,SQUserPointer typetag) +{ + SQObjectPtr &o = stack_get(v,idx); + if(type(o) != OT_INSTANCE) return sq_throwerror(v,_SC("the object is not a class instance")); + (*p) = _instance(o)->_userpointer; + if(typetag != 0) { + SQClass *cl = _instance(o)->_class; + do{ + if(cl->_typetag == typetag) + return SQ_OK; + cl = cl->_base; + }while(cl != NULL); + return sq_throwerror(v,_SC("invalid type tag")); + } + return SQ_OK; +} + +SQInteger sq_gettop(HSQUIRRELVM v) +{ + return (v->_top) - v->_stackbase; +} + +void sq_settop(HSQUIRRELVM v, SQInteger newtop) +{ + SQInteger top = sq_gettop(v); + if(top > newtop) + sq_pop(v, top - newtop); + else + while(top++ < newtop) sq_pushnull(v); +} + +void sq_pop(HSQUIRRELVM v, SQInteger nelemstopop) +{ + assert(v->_top >= nelemstopop); + v->Pop(nelemstopop); +} + +void sq_poptop(HSQUIRRELVM v) +{ + assert(v->_top >= 1); + v->Pop(); +} + + +void sq_remove(HSQUIRRELVM v, SQInteger idx) +{ + v->Remove(idx); +} + +SQInteger sq_cmp(HSQUIRRELVM v) +{ + SQInteger res; + v->ObjCmp(stack_get(v, -1), stack_get(v, -2),res); + return res; +} + +SQRESULT sq_newslot(HSQUIRRELVM v, SQInteger idx, SQBool bstatic) +{ + sq_aux_paramscheck(v, 3); + SQObjectPtr &self = stack_get(v, idx); + if(type(self) == OT_TABLE || type(self) == OT_CLASS) { + SQObjectPtr &key = v->GetUp(-2); + if(type(key) == OT_NULL) return sq_throwerror(v, _SC("null is not a valid key")); + v->NewSlot(self, key, v->GetUp(-1),bstatic?true:false); + v->Pop(2); + } + return SQ_OK; +} + +SQRESULT sq_deleteslot(HSQUIRRELVM v,SQInteger idx,SQBool pushval) +{ + sq_aux_paramscheck(v, 2); + SQObjectPtr *self; + _GETSAFE_OBJ(v, idx, OT_TABLE,self); + SQObjectPtr &key = v->GetUp(-1); + if(type(key) == OT_NULL) return sq_throwerror(v, _SC("null is not a valid key")); + SQObjectPtr res; + if(!v->DeleteSlot(*self, key, res)){ + v->Pop(); + return SQ_ERROR; + } + if(pushval) v->GetUp(-1) = res; + else v->Pop(); + return SQ_OK; +} + +SQRESULT sq_set(HSQUIRRELVM v,SQInteger idx) +{ + SQObjectPtr &self = stack_get(v, idx); + if(v->Set(self, v->GetUp(-2), v->GetUp(-1),DONT_FALL_BACK)) { + v->Pop(2); + return SQ_OK; + } + return SQ_ERROR; +} + +SQRESULT sq_rawset(HSQUIRRELVM v,SQInteger idx) +{ + SQObjectPtr &self = stack_get(v, idx); + if(type(v->GetUp(-2)) == OT_NULL) { + v->Pop(2); + return sq_throwerror(v, _SC("null key")); + } + switch(type(self)) { + case OT_TABLE: + _table(self)->NewSlot(v->GetUp(-2), v->GetUp(-1)); + v->Pop(2); + return SQ_OK; + break; + case OT_CLASS: + _class(self)->NewSlot(_ss(v), v->GetUp(-2), v->GetUp(-1),false); + v->Pop(2); + return SQ_OK; + break; + case OT_INSTANCE: + if(_instance(self)->Set(v->GetUp(-2), v->GetUp(-1))) { + v->Pop(2); + return SQ_OK; + } + break; + case OT_ARRAY: + if(v->Set(self, v->GetUp(-2), v->GetUp(-1),false)) { + v->Pop(2); + return SQ_OK; + } + break; + default: + v->Pop(2); + return sq_throwerror(v, _SC("rawset works only on array/table/class and instance")); + } + v->Raise_IdxError(v->GetUp(-2));return SQ_ERROR; +} + +SQRESULT sq_newmember(HSQUIRRELVM v,SQInteger idx,SQBool bstatic) +{ + SQObjectPtr &self = stack_get(v, idx); + if(type(self) != OT_CLASS) return sq_throwerror(v, _SC("new member only works with classes")); + if(type(v->GetUp(-3)) == OT_NULL) return sq_throwerror(v, _SC("null key")); + if(!v->NewSlotA(self,v->GetUp(-3),v->GetUp(-2),v->GetUp(-1),bstatic?true:false,false)) + return SQ_ERROR; + return SQ_OK; +} + +SQRESULT sq_rawnewmember(HSQUIRRELVM v,SQInteger idx,SQBool bstatic) +{ + SQObjectPtr &self = stack_get(v, idx); + if(type(self) != OT_CLASS) return sq_throwerror(v, _SC("new member only works with classes")); + if(type(v->GetUp(-3)) == OT_NULL) return sq_throwerror(v, _SC("null key")); + if(!v->NewSlotA(self,v->GetUp(-3),v->GetUp(-2),v->GetUp(-1),bstatic?true:false,true)) + return SQ_ERROR; + return SQ_OK; +} + +SQRESULT sq_setdelegate(HSQUIRRELVM v,SQInteger idx) +{ + SQObjectPtr &self = stack_get(v, idx); + SQObjectPtr &mt = v->GetUp(-1); + SQObjectType type = type(self); + switch(type) { + case OT_TABLE: + if(type(mt) == OT_TABLE) { + if(!_table(self)->SetDelegate(_table(mt))) return sq_throwerror(v, _SC("delagate cycle")); v->Pop();} + else if(type(mt)==OT_NULL) { + _table(self)->SetDelegate(NULL); v->Pop(); } + else return sq_aux_invalidtype(v,type); + break; + case OT_USERDATA: + if(type(mt)==OT_TABLE) { + _userdata(self)->SetDelegate(_table(mt)); v->Pop(); } + else if(type(mt)==OT_NULL) { + _userdata(self)->SetDelegate(NULL); v->Pop(); } + else return sq_aux_invalidtype(v, type); + break; + default: + return sq_aux_invalidtype(v, type); + break; + } + return SQ_OK; +} + +SQRESULT sq_rawdeleteslot(HSQUIRRELVM v,SQInteger idx,SQBool pushval) +{ + sq_aux_paramscheck(v, 2); + SQObjectPtr *self; + _GETSAFE_OBJ(v, idx, OT_TABLE,self); + SQObjectPtr &key = v->GetUp(-1); + SQObjectPtr t; + if(_table(*self)->Get(key,t)) { + _table(*self)->Remove(key); + } + if(pushval != 0) + v->GetUp(-1) = t; + else + v->Pop(); + return SQ_OK; +} + +SQRESULT sq_getdelegate(HSQUIRRELVM v,SQInteger idx) +{ + SQObjectPtr &self=stack_get(v,idx); + switch(type(self)){ + case OT_TABLE: + case OT_USERDATA: + if(!_delegable(self)->_delegate){ + v->PushNull(); + break; + } + v->Push(SQObjectPtr(_delegable(self)->_delegate)); + break; + default: return sq_throwerror(v,_SC("wrong type")); break; + } + return SQ_OK; + +} + +SQRESULT sq_get(HSQUIRRELVM v,SQInteger idx) +{ + SQObjectPtr &self=stack_get(v,idx); + if(v->Get(self,v->GetUp(-1),v->GetUp(-1),0,DONT_FALL_BACK)) + return SQ_OK; + v->Pop(); + return SQ_ERROR; +} + +SQRESULT sq_rawget(HSQUIRRELVM v,SQInteger idx) +{ + SQObjectPtr &self=stack_get(v,idx); + switch(type(self)) { + case OT_TABLE: + if(_table(self)->Get(v->GetUp(-1),v->GetUp(-1))) + return SQ_OK; + break; + case OT_CLASS: + if(_class(self)->Get(v->GetUp(-1),v->GetUp(-1))) + return SQ_OK; + break; + case OT_INSTANCE: + if(_instance(self)->Get(v->GetUp(-1),v->GetUp(-1))) + return SQ_OK; + break; + case OT_ARRAY:{ + SQObjectPtr& key = v->GetUp(-1); + if(sq_isnumeric(key)){ + if(_array(self)->Get(tointeger(key),v->GetUp(-1))) { + return SQ_OK; + } + } + else { + v->Pop(); + return sq_throwerror(v,_SC("invalid index type for an array")); + } + } + break; + default: + v->Pop(); + return sq_throwerror(v,_SC("rawget works only on array/table/instance and class")); + } + v->Pop(); + return sq_throwerror(v,_SC("the index doesn't exist")); +} + +SQRESULT sq_getstackobj(HSQUIRRELVM v,SQInteger idx,HSQOBJECT *po) +{ + *po=stack_get(v,idx); + return SQ_OK; +} + +const SQChar *sq_getlocal(HSQUIRRELVM v,SQUnsignedInteger level,SQUnsignedInteger idx) +{ + SQUnsignedInteger cstksize=v->_callsstacksize; + SQUnsignedInteger lvl=(cstksize-level)-1; + SQInteger stackbase=v->_stackbase; + if(lvl_callsstack[(cstksize-i)-1]; + stackbase-=ci._prevstkbase; + } + SQVM::CallInfo &ci=v->_callsstack[lvl]; + if(type(ci._closure)!=OT_CLOSURE) + return NULL; + SQClosure *c=_closure(ci._closure); + SQFunctionProto *func=c->_function; + if(func->_noutervalues > (SQInteger)idx) { + v->Push(*_outer(c->_outervalues[idx])->_valptr); + return _stringval(func->_outervalues[idx]._name); + } + idx -= func->_noutervalues; + return func->GetLocal(v,stackbase,idx,(SQInteger)(ci._ip-func->_instructions)-1); + } + return NULL; +} + +void sq_pushobject(HSQUIRRELVM v,HSQOBJECT obj) +{ + v->Push(SQObjectPtr(obj)); +} + +void sq_resetobject(HSQOBJECT *po) +{ + po->_unVal.pUserPointer=NULL;po->_type=OT_NULL; +} + +SQRESULT sq_throwerror(HSQUIRRELVM v,const SQChar *err) +{ + v->_lasterror=SQString::Create(_ss(v),err); + return SQ_ERROR; +} + +SQRESULT sq_throwobject(HSQUIRRELVM v) +{ + v->_lasterror = v->GetUp(-1); + v->Pop(); + return SQ_ERROR; +} + + +void sq_reseterror(HSQUIRRELVM v) +{ + v->_lasterror.Null(); +} + +void sq_getlasterror(HSQUIRRELVM v) +{ + v->Push(v->_lasterror); +} + +SQRESULT sq_reservestack(HSQUIRRELVM v,SQInteger nsize) +{ + if (((SQUnsignedInteger)v->_top + nsize) > v->_stack.size()) { + if(v->_nmetamethodscall) { + return sq_throwerror(v,_SC("cannot resize stack while in a metamethod")); + } + v->_stack.resize(v->_stack.size() + ((v->_top + nsize) - v->_stack.size())); + } + return SQ_OK; +} + +SQRESULT sq_resume(HSQUIRRELVM v,SQBool retval,SQBool raiseerror) +{ + if(type(v->GetUp(-1))==OT_GENERATOR){ + v->PushNull(); //retval + if(!v->Execute(v->GetUp(-2),0,v->_top,v->GetUp(-1),raiseerror,SQVM::ET_RESUME_GENERATOR)) + {v->Raise_Error(v->_lasterror); return SQ_ERROR;} + if(!retval) + v->Pop(); + return SQ_OK; + } + return sq_throwerror(v,_SC("only generators can be resumed")); +} + +SQRESULT sq_call(HSQUIRRELVM v,SQInteger params,SQBool retval,SQBool raiseerror) +{ + SQObjectPtr res; + if(v->Call(v->GetUp(-(params+1)),params,v->_top-params,res,raiseerror?true:false)){ + + if(!v->_suspended) { + v->Pop(params);//pop closure and args + } + if(retval){ + v->Push(res); return SQ_OK; + } + return SQ_OK; + } + else { + v->Pop(params); + return SQ_ERROR; + } + if(!v->_suspended) + v->Pop(params); + return sq_throwerror(v,_SC("call failed")); +} + +SQRESULT sq_suspendvm(HSQUIRRELVM v) +{ + return v->Suspend(); +} + +SQRESULT sq_wakeupvm(HSQUIRRELVM v,SQBool wakeupret,SQBool retval,SQBool raiseerror,SQBool throwerror) +{ + SQObjectPtr ret; + if(!v->_suspended) + return sq_throwerror(v,_SC("cannot resume a vm that is not running any code")); + SQInteger target = v->_suspended_target; + if(wakeupret) { + if(target != -1) { + v->GetAt(v->_stackbase+v->_suspended_target)=v->GetUp(-1); //retval + } + v->Pop(); + } else if(target != -1) { v->GetAt(v->_stackbase+v->_suspended_target).Null(); } + SQObjectPtr dummy; + if(!v->Execute(dummy,-1,-1,ret,raiseerror,throwerror?SQVM::ET_RESUME_THROW_VM : SQVM::ET_RESUME_VM)) { + return SQ_ERROR; + } + if(retval) + v->Push(ret); + return SQ_OK; +} + +void sq_setreleasehook(HSQUIRRELVM v,SQInteger idx,SQRELEASEHOOK hook) +{ + if(sq_gettop(v) >= 1){ + SQObjectPtr &ud=stack_get(v,idx); + switch( type(ud) ) { + case OT_USERDATA: _userdata(ud)->_hook = hook; break; + case OT_INSTANCE: _instance(ud)->_hook = hook; break; + case OT_CLASS: _class(ud)->_hook = hook; break; + default: break; //shutup compiler + } + } +} + +SQRELEASEHOOK sq_getreleasehook(HSQUIRRELVM v,SQInteger idx) +{ + if(sq_gettop(v) >= 1){ + SQObjectPtr &ud=stack_get(v,idx); + switch( type(ud) ) { + case OT_USERDATA: return _userdata(ud)->_hook; break; + case OT_INSTANCE: return _instance(ud)->_hook; break; + case OT_CLASS: return _class(ud)->_hook; break; + default: break; //shutup compiler + } + } + return NULL; +} + +void sq_setcompilererrorhandler(HSQUIRRELVM v,SQCOMPILERERROR f) +{ + _ss(v)->_compilererrorhandler = f; +} + +SQRESULT sq_writeclosure(HSQUIRRELVM v,SQWRITEFUNC w,SQUserPointer up) +{ + SQObjectPtr *o = NULL; + _GETSAFE_OBJ(v, -1, OT_CLOSURE,o); + unsigned short tag = SQ_BYTECODE_STREAM_TAG; + if(_closure(*o)->_function->_noutervalues) + return sq_throwerror(v,_SC("a closure with free valiables bound it cannot be serialized")); + if(w(up,&tag,2) != 2) + return sq_throwerror(v,_SC("io error")); + if(!_closure(*o)->Save(v,up,w)) + return SQ_ERROR; + return SQ_OK; +} + +SQRESULT sq_readclosure(HSQUIRRELVM v,SQREADFUNC r,SQUserPointer up) +{ + SQObjectPtr closure; + + unsigned short tag; + if(r(up,&tag,2) != 2) + return sq_throwerror(v,_SC("io error")); + if(tag != SQ_BYTECODE_STREAM_TAG) + return sq_throwerror(v,_SC("invalid stream")); + if(!SQClosure::Load(v,up,r,closure)) + return SQ_ERROR; + v->Push(closure); + return SQ_OK; +} + +SQChar *sq_getscratchpad(HSQUIRRELVM v,SQInteger minsize) +{ + return _ss(v)->GetScratchPad(minsize); +} + +SQRESULT sq_resurrectunreachable(HSQUIRRELVM v) +{ +#ifndef NO_GARBAGE_COLLECTOR + _ss(v)->ResurrectUnreachable(v); + return SQ_OK; +#else + return sq_throwerror(v,_SC("sq_resurrectunreachable requires a garbage collector build")); +#endif +} + +SQInteger sq_collectgarbage(HSQUIRRELVM v) +{ +#ifndef NO_GARBAGE_COLLECTOR + return _ss(v)->CollectGarbage(v); +#else + return -1; +#endif +} + +SQRESULT sq_getcallee(HSQUIRRELVM v) +{ + if(v->_callsstacksize > 1) + { + v->Push(v->_callsstack[v->_callsstacksize - 2]._closure); + return SQ_OK; + } + return sq_throwerror(v,_SC("no closure in the calls stack")); +} + +const SQChar *sq_getfreevariable(HSQUIRRELVM v,SQInteger idx,SQUnsignedInteger nval) +{ + SQObjectPtr &self=stack_get(v,idx); + const SQChar *name = NULL; + switch(type(self)) + { + case OT_CLOSURE:{ + SQClosure *clo = _closure(self); + SQFunctionProto *fp = clo->_function; + if(((SQUnsignedInteger)fp->_noutervalues) > nval) { + v->Push(*(_outer(clo->_outervalues[nval])->_valptr)); + SQOuterVar &ov = fp->_outervalues[nval]; + name = _stringval(ov._name); + } + } + break; + case OT_NATIVECLOSURE:{ + SQNativeClosure *clo = _nativeclosure(self); + if(clo->_noutervalues > nval) { + v->Push(clo->_outervalues[nval]); + name = _SC("@NATIVE"); + } + } + break; + default: break; //shutup compiler + } + return name; +} + +SQRESULT sq_setfreevariable(HSQUIRRELVM v,SQInteger idx,SQUnsignedInteger nval) +{ + SQObjectPtr &self=stack_get(v,idx); + switch(type(self)) + { + case OT_CLOSURE:{ + SQFunctionProto *fp = _closure(self)->_function; + if(((SQUnsignedInteger)fp->_noutervalues) > nval){ + *(_outer(_closure(self)->_outervalues[nval])->_valptr) = stack_get(v,-1); + } + else return sq_throwerror(v,_SC("invalid free var index")); + } + break; + case OT_NATIVECLOSURE: + if(_nativeclosure(self)->_noutervalues > nval){ + _nativeclosure(self)->_outervalues[nval] = stack_get(v,-1); + } + else return sq_throwerror(v,_SC("invalid free var index")); + break; + default: + return sq_aux_invalidtype(v,type(self)); + } + v->Pop(); + return SQ_OK; +} + +SQRESULT sq_setattributes(HSQUIRRELVM v,SQInteger idx) +{ + SQObjectPtr *o = NULL; + _GETSAFE_OBJ(v, idx, OT_CLASS,o); + SQObjectPtr &key = stack_get(v,-2); + SQObjectPtr &val = stack_get(v,-1); + SQObjectPtr attrs; + if(type(key) == OT_NULL) { + attrs = _class(*o)->_attributes; + _class(*o)->_attributes = val; + v->Pop(2); + v->Push(attrs); + return SQ_OK; + }else if(_class(*o)->GetAttributes(key,attrs)) { + _class(*o)->SetAttributes(key,val); + v->Pop(2); + v->Push(attrs); + return SQ_OK; + } + return sq_throwerror(v,_SC("wrong index")); +} + +SQRESULT sq_getattributes(HSQUIRRELVM v,SQInteger idx) +{ + SQObjectPtr *o = NULL; + _GETSAFE_OBJ(v, idx, OT_CLASS,o); + SQObjectPtr &key = stack_get(v,-1); + SQObjectPtr attrs; + if(type(key) == OT_NULL) { + attrs = _class(*o)->_attributes; + v->Pop(); + v->Push(attrs); + return SQ_OK; + } + else if(_class(*o)->GetAttributes(key,attrs)) { + v->Pop(); + v->Push(attrs); + return SQ_OK; + } + return sq_throwerror(v,_SC("wrong index")); +} + +SQRESULT sq_getmemberhandle(HSQUIRRELVM v,SQInteger idx,HSQMEMBERHANDLE *handle) +{ + SQObjectPtr *o = NULL; + _GETSAFE_OBJ(v, idx, OT_CLASS,o); + SQObjectPtr &key = stack_get(v,-1); + SQTable *m = _class(*o)->_members; + SQObjectPtr val; + if(m->Get(key,val)) { + handle->_static = _isfield(val) ? SQFalse : SQTrue; + handle->_index = _member_idx(val); + v->Pop(); + return SQ_OK; + } + return sq_throwerror(v,_SC("wrong index")); +} + +SQRESULT _getmemberbyhandle(HSQUIRRELVM v,SQObjectPtr &self,const HSQMEMBERHANDLE *handle,SQObjectPtr *&val) +{ + switch(type(self)) { + case OT_INSTANCE: { + SQInstance *i = _instance(self); + if(handle->_static) { + SQClass *c = i->_class; + val = &c->_methods[handle->_index].val; + } + else { + val = &i->_values[handle->_index]; + + } + } + break; + case OT_CLASS: { + SQClass *c = _class(self); + if(handle->_static) { + val = &c->_methods[handle->_index].val; + } + else { + val = &c->_defaultvalues[handle->_index].val; + } + } + break; + default: + return sq_throwerror(v,_SC("wrong type(expected class or instance)")); + } + return SQ_OK; +} + +SQRESULT sq_getbyhandle(HSQUIRRELVM v,SQInteger idx,const HSQMEMBERHANDLE *handle) +{ + SQObjectPtr &self = stack_get(v,idx); + SQObjectPtr *val = NULL; + if(SQ_FAILED(_getmemberbyhandle(v,self,handle,val))) { + return SQ_ERROR; + } + v->Push(_realval(*val)); + return SQ_OK; +} + +SQRESULT sq_setbyhandle(HSQUIRRELVM v,SQInteger idx,const HSQMEMBERHANDLE *handle) +{ + SQObjectPtr &self = stack_get(v,idx); + SQObjectPtr &newval = stack_get(v,-1); + SQObjectPtr *val = NULL; + if(SQ_FAILED(_getmemberbyhandle(v,self,handle,val))) { + return SQ_ERROR; + } + *val = newval; + v->Pop(); + return SQ_OK; +} + +SQRESULT sq_getbase(HSQUIRRELVM v,SQInteger idx) +{ + SQObjectPtr *o = NULL; + _GETSAFE_OBJ(v, idx, OT_CLASS,o); + if(_class(*o)->_base) + v->Push(SQObjectPtr(_class(*o)->_base)); + else + v->PushNull(); + return SQ_OK; +} + +SQRESULT sq_getclass(HSQUIRRELVM v,SQInteger idx) +{ + SQObjectPtr *o = NULL; + _GETSAFE_OBJ(v, idx, OT_INSTANCE,o); + v->Push(SQObjectPtr(_instance(*o)->_class)); + return SQ_OK; +} + +SQRESULT sq_createinstance(HSQUIRRELVM v,SQInteger idx) +{ + SQObjectPtr *o = NULL; + _GETSAFE_OBJ(v, idx, OT_CLASS,o); + v->Push(_class(*o)->CreateInstance()); + return SQ_OK; +} + +void sq_weakref(HSQUIRRELVM v,SQInteger idx) +{ + SQObject &o=stack_get(v,idx); + if(ISREFCOUNTED(type(o))) { + v->Push(_refcounted(o)->GetWeakRef(type(o))); + return; + } + v->Push(o); +} + +SQRESULT sq_getweakrefval(HSQUIRRELVM v,SQInteger idx) +{ + SQObjectPtr &o = stack_get(v,idx); + if(type(o) != OT_WEAKREF) { + return sq_throwerror(v,_SC("the object must be a weakref")); + } + v->Push(_weakref(o)->_obj); + return SQ_OK; +} + +SQRESULT sq_getdefaultdelegate(HSQUIRRELVM v,SQObjectType t) +{ + SQSharedState *ss = _ss(v); + switch(t) { + case OT_TABLE: v->Push(ss->_table_default_delegate); break; + case OT_ARRAY: v->Push(ss->_array_default_delegate); break; + case OT_STRING: v->Push(ss->_string_default_delegate); break; + case OT_INTEGER: case OT_FLOAT: v->Push(ss->_number_default_delegate); break; + case OT_GENERATOR: v->Push(ss->_generator_default_delegate); break; + case OT_CLOSURE: case OT_NATIVECLOSURE: v->Push(ss->_closure_default_delegate); break; + case OT_THREAD: v->Push(ss->_thread_default_delegate); break; + case OT_CLASS: v->Push(ss->_class_default_delegate); break; + case OT_INSTANCE: v->Push(ss->_instance_default_delegate); break; + case OT_WEAKREF: v->Push(ss->_weakref_default_delegate); break; + default: return sq_throwerror(v,_SC("the type doesn't have a default delegate")); + } + return SQ_OK; +} + +SQRESULT sq_next(HSQUIRRELVM v,SQInteger idx) +{ + SQObjectPtr o=stack_get(v,idx),&refpos = stack_get(v,-1),realkey,val; + if(type(o) == OT_GENERATOR) { + return sq_throwerror(v,_SC("cannot iterate a generator")); + } + int faketojump; + if(!v->FOREACH_OP(o,realkey,val,refpos,0,666,faketojump)) + return SQ_ERROR; + if(faketojump != 666) { + v->Push(realkey); + v->Push(val); + return SQ_OK; + } + return SQ_ERROR; +} + +struct BufState{ + const SQChar *buf; + SQInteger ptr; + SQInteger size; +}; + +SQInteger buf_lexfeed(SQUserPointer file) +{ + BufState *buf=(BufState*)file; + if(buf->size<(buf->ptr+1)) + return 0; + return buf->buf[buf->ptr++]; +} + +SQRESULT sq_compilebuffer(HSQUIRRELVM v,const SQChar *s,SQInteger size,const SQChar *sourcename,SQBool raiseerror) { + BufState buf; + buf.buf = s; + buf.size = size; + buf.ptr = 0; + return sq_compile(v, buf_lexfeed, &buf, sourcename, raiseerror); +} + +void sq_move(HSQUIRRELVM dest,HSQUIRRELVM src,SQInteger idx) +{ + dest->Push(stack_get(src,idx)); +} + +void sq_setprintfunc(HSQUIRRELVM v, SQPRINTFUNCTION printfunc,SQPRINTFUNCTION errfunc) +{ + _ss(v)->_printfunc = printfunc; + _ss(v)->_errorfunc = errfunc; +} + +SQPRINTFUNCTION sq_getprintfunc(HSQUIRRELVM v) +{ + return _ss(v)->_printfunc; +} + +SQPRINTFUNCTION sq_geterrorfunc(HSQUIRRELVM v) +{ + return _ss(v)->_errorfunc; +} + +void *sq_malloc(SQUnsignedInteger size) +{ + return SQ_MALLOC(size); +} + +void *sq_realloc(void* p,SQUnsignedInteger oldsize,SQUnsignedInteger newsize) +{ + return SQ_REALLOC(p,oldsize,newsize); +} + +void sq_free(void *p,SQUnsignedInteger size) +{ + SQ_FREE(p,size); +} diff --git a/squirrel/sqarray.h b/squirrel/sqarray.h new file mode 100644 index 0000000..c3a57ab --- /dev/null +++ b/squirrel/sqarray.h @@ -0,0 +1,94 @@ +/* see copyright notice in squirrel.h */ +#ifndef _SQARRAY_H_ +#define _SQARRAY_H_ + +struct SQArray : public CHAINABLE_OBJ +{ +private: + SQArray(SQSharedState *ss,SQInteger nsize){_values.resize(nsize); INIT_CHAIN();ADD_TO_CHAIN(&_ss(this)->_gc_chain,this);} + ~SQArray() + { + REMOVE_FROM_CHAIN(&_ss(this)->_gc_chain,this); + } +public: + static SQArray* Create(SQSharedState *ss,SQInteger nInitialSize){ + SQArray *newarray=(SQArray*)SQ_MALLOC(sizeof(SQArray)); + new (newarray) SQArray(ss,nInitialSize); + return newarray; + } +#ifndef NO_GARBAGE_COLLECTOR + void Mark(SQCollectable **chain); + SQObjectType GetType() {return OT_ARRAY;} +#endif + void Finalize(){ + _values.resize(0); + } + bool Get(const SQInteger nidx,SQObjectPtr &val) + { + if(nidx>=0 && nidx<(SQInteger)_values.size()){ + SQObjectPtr &o = _values[nidx]; + val = _realval(o); + return true; + } + else return false; + } + bool Set(const SQInteger nidx,const SQObjectPtr &val) + { + if(nidx>=0 && nidx<(SQInteger)_values.size()){ + _values[nidx]=val; + return true; + } + else return false; + } + SQInteger Next(const SQObjectPtr &refpos,SQObjectPtr &outkey,SQObjectPtr &outval) + { + SQUnsignedInteger idx=TranslateIndex(refpos); + while(idx<_values.size()){ + //first found + outkey=(SQInteger)idx; + SQObjectPtr &o = _values[idx]; + outval = _realval(o); + //return idx for the next iteration + return ++idx; + } + //nothing to iterate anymore + return -1; + } + SQArray *Clone(){SQArray *anew=Create(_opt_ss(this),0); anew->_values.copy(_values); return anew; } + SQInteger Size() const {return _values.size();} + void Resize(SQInteger size) + { + SQObjectPtr _null; + Resize(size,_null); + } + void Resize(SQInteger size,SQObjectPtr &fill) { _values.resize(size,fill); ShrinkIfNeeded(); } + void Reserve(SQInteger size) { _values.reserve(size); } + void Append(const SQObject &o){_values.push_back(o);} + void Extend(const SQArray *a); + SQObjectPtr &Top(){return _values.top();} + void Pop(){_values.pop_back(); ShrinkIfNeeded(); } + bool Insert(SQInteger idx,const SQObject &val){ + if(idx < 0 || idx > (SQInteger)_values.size()) + return false; + _values.insert(idx,val); + return true; + } + void ShrinkIfNeeded() { + if(_values.size() <= _values.capacity()>>2) //shrink the array + _values.shrinktofit(); + } + bool Remove(SQInteger idx){ + if(idx < 0 || idx >= (SQInteger)_values.size()) + return false; + _values.remove(idx); + ShrinkIfNeeded(); + return true; + } + void Release() + { + sq_delete(this,SQArray); + } + + SQObjectPtrVec _values; +}; +#endif //_SQARRAY_H_ diff --git a/squirrel/sqbaselib.cpp b/squirrel/sqbaselib.cpp new file mode 100644 index 0000000..d01fe4b --- /dev/null +++ b/squirrel/sqbaselib.cpp @@ -0,0 +1,1266 @@ +/* + see copyright notice in squirrel.h +*/ +#include "sqpcheader.h" +#include "sqvm.h" +#include "sqstring.h" +#include "sqtable.h" +#include "sqarray.h" +#include "sqfuncproto.h" +#include "sqclosure.h" +#include "sqclass.h" +#include +#include +#include + +static bool str2num(const SQChar *s,SQObjectPtr &res,SQInteger base) +{ + SQChar *end; + const SQChar *e = s; + SQBool isfloat = SQFalse; + SQChar c; + while((c = *e) != _SC('\0')) + { + if(c == _SC('.') || c == _SC('E')|| c == _SC('e')) { //e and E is for scientific notation + isfloat = SQTrue; + break; + } + e++; + } + if(isfloat){ + SQFloat r = SQFloat(scstrtod(s,&end)); + if(s == end) return false; + res = r; + } + else{ + SQInteger r = SQInteger(scstrtol(s,&end,(int)base)); + if(s == end) return false; + res = r; + } + return true; +} + +static SQInteger base_dummy(HSQUIRRELVM v) +{ + return 0; +} + +#ifndef NO_GARBAGE_COLLECTOR +static SQInteger base_collectgarbage(HSQUIRRELVM v) +{ + sq_pushinteger(v, sq_collectgarbage(v)); + return 1; +} +static SQInteger base_resurectureachable(HSQUIRRELVM v) +{ + sq_resurrectunreachable(v); + return 1; +} +#endif + +static SQInteger base_getroottable(HSQUIRRELVM v) +{ + v->Push(v->_roottable); + return 1; +} + +static SQInteger base_getconsttable(HSQUIRRELVM v) +{ + v->Push(_ss(v)->_consts); + return 1; +} + + +static SQInteger base_setroottable(HSQUIRRELVM v) +{ + SQObjectPtr o = v->_roottable; + if(SQ_FAILED(sq_setroottable(v))) return SQ_ERROR; + v->Push(o); + return 1; +} + +static SQInteger base_setconsttable(HSQUIRRELVM v) +{ + SQObjectPtr o = _ss(v)->_consts; + if(SQ_FAILED(sq_setconsttable(v))) return SQ_ERROR; + v->Push(o); + return 1; +} + +static SQInteger base_seterrorhandler(HSQUIRRELVM v) +{ + sq_seterrorhandler(v); + return 0; +} + +static SQInteger base_setdebughook(HSQUIRRELVM v) +{ + sq_setdebughook(v); + return 0; +} + +static SQInteger base_enabledebuginfo(HSQUIRRELVM v) +{ + SQObjectPtr &o=stack_get(v,2); + + sq_enabledebuginfo(v,SQVM::IsFalse(o)?SQFalse:SQTrue); + return 0; +} + +static SQInteger __getcallstackinfos(HSQUIRRELVM v,SQInteger level) +{ + SQStackInfos si; + SQInteger seq = 0; + const SQChar *name = NULL; + + if (SQ_SUCCEEDED(sq_stackinfos(v, level, &si))) + { + const SQChar *fn = _SC("unknown"); + const SQChar *src = _SC("unknown"); + if(si.funcname)fn = si.funcname; + if(si.source)src = si.source; + sq_newtable(v); + sq_pushstring(v, _SC("func"), -1); + sq_pushstring(v, fn, -1); + sq_newslot(v, -3, SQFalse); + sq_pushstring(v, _SC("src"), -1); + sq_pushstring(v, src, -1); + sq_newslot(v, -3, SQFalse); + sq_pushstring(v, _SC("line"), -1); + sq_pushinteger(v, si.line); + sq_newslot(v, -3, SQFalse); + sq_pushstring(v, _SC("locals"), -1); + sq_newtable(v); + seq=0; + while ((name = sq_getlocal(v, level, seq))) { + sq_pushstring(v, name, -1); + sq_push(v, -2); + sq_newslot(v, -4, SQFalse); + sq_pop(v, 1); + seq++; + } + sq_newslot(v, -3, SQFalse); + return 1; + } + + return 0; +} +static SQInteger base_getstackinfos(HSQUIRRELVM v) +{ + SQInteger level; + sq_getinteger(v, -1, &level); + return __getcallstackinfos(v,level); +} + +static SQInteger base_assert(HSQUIRRELVM v) +{ + if(SQVM::IsFalse(stack_get(v,2))){ + return sq_throwerror(v,_SC("assertion failed")); + } + return 0; +} + +static SQInteger get_slice_params(HSQUIRRELVM v,SQInteger &sidx,SQInteger &eidx,SQObjectPtr &o) +{ + SQInteger top = sq_gettop(v); + sidx=0; + eidx=0; + o=stack_get(v,1); + if(top>1){ + SQObjectPtr &start=stack_get(v,2); + if(type(start)!=OT_NULL && sq_isnumeric(start)){ + sidx=tointeger(start); + } + } + if(top>2){ + SQObjectPtr &end=stack_get(v,3); + if(sq_isnumeric(end)){ + eidx=tointeger(end); + } + } + else { + eidx = sq_getsize(v,1); + } + return 1; +} + +static SQInteger base_print(HSQUIRRELVM v) +{ + const SQChar *str; + if(SQ_SUCCEEDED(sq_tostring(v,2))) + { + if(SQ_SUCCEEDED(sq_getstring(v,-1,&str))) { + if(_ss(v)->_printfunc) _ss(v)->_printfunc(v,_SC("%s"),str); + return 0; + } + } + return SQ_ERROR; +} + +static SQInteger base_error(HSQUIRRELVM v) +{ + const SQChar *str; + if(SQ_SUCCEEDED(sq_tostring(v,2))) + { + if(SQ_SUCCEEDED(sq_getstring(v,-1,&str))) { + if(_ss(v)->_errorfunc) _ss(v)->_errorfunc(v,_SC("%s"),str); + return 0; + } + } + return SQ_ERROR; +} + +static SQInteger base_compilestring(HSQUIRRELVM v) +{ + SQInteger nargs=sq_gettop(v); + const SQChar *src=NULL,*name=_SC("unnamedbuffer"); + SQInteger size; + sq_getstring(v,2,&src); + size=sq_getsize(v,2); + if(nargs>2){ + sq_getstring(v,3,&name); + } + if(SQ_SUCCEEDED(sq_compilebuffer(v,src,size,name,SQFalse))) + return 1; + else + return SQ_ERROR; +} + +static SQInteger base_newthread(HSQUIRRELVM v) +{ + SQObjectPtr &func = stack_get(v,2); + SQInteger stksize = (_closure(func)->_function->_stacksize << 1) +2; + HSQUIRRELVM newv = sq_newthread(v, (stksize < MIN_STACK_OVERHEAD + 2)? MIN_STACK_OVERHEAD + 2 : stksize); + sq_move(newv,v,-2); + return 1; +} + +static SQInteger base_suspend(HSQUIRRELVM v) +{ + return sq_suspendvm(v); +} + +static SQInteger base_array(HSQUIRRELVM v) +{ + SQArray *a; + SQObject &size = stack_get(v,2); + if(sq_gettop(v) > 2) { + a = SQArray::Create(_ss(v),0); + a->Resize(tointeger(size),stack_get(v,3)); + } + else { + a = SQArray::Create(_ss(v),tointeger(size)); + } + v->Push(a); + return 1; +} + +static SQInteger base_type(HSQUIRRELVM v) +{ + SQObjectPtr &o = stack_get(v,2); + v->Push(SQString::Create(_ss(v),GetTypeName(o),-1)); + return 1; +} + +static SQInteger base_callee(HSQUIRRELVM v) +{ + if(v->_callsstacksize > 1) + { + v->Push(v->_callsstack[v->_callsstacksize - 2]._closure); + return 1; + } + return sq_throwerror(v,_SC("no closure in the calls stack")); +} + +static SQRegFunction base_funcs[]={ + //generic + {_SC("seterrorhandler"),base_seterrorhandler,2, NULL}, + {_SC("setdebughook"),base_setdebughook,2, NULL}, + {_SC("enabledebuginfo"),base_enabledebuginfo,2, NULL}, + {_SC("getstackinfos"),base_getstackinfos,2, _SC(".n")}, + {_SC("getroottable"),base_getroottable,1, NULL}, + {_SC("setroottable"),base_setroottable,2, NULL}, + {_SC("getconsttable"),base_getconsttable,1, NULL}, + {_SC("setconsttable"),base_setconsttable,2, NULL}, + {_SC("assert"),base_assert,2, NULL}, + {_SC("print"),base_print,2, NULL}, + {_SC("error"),base_error,2, NULL}, + {_SC("compilestring"),base_compilestring,-2, _SC(".ss")}, + {_SC("newthread"),base_newthread,2, _SC(".c")}, + {_SC("suspend"),base_suspend,-1, NULL}, + {_SC("array"),base_array,-2, _SC(".n")}, + {_SC("type"),base_type,2, NULL}, + {_SC("callee"),base_callee,0,NULL}, + {_SC("dummy"),base_dummy,0,NULL}, +#ifndef NO_GARBAGE_COLLECTOR + {_SC("collectgarbage"),base_collectgarbage,0, NULL}, + {_SC("resurrectunreachable"),base_resurectureachable,0, NULL}, +#endif + {0,0} +}; + +void sq_base_register(HSQUIRRELVM v) +{ + SQInteger i=0; + sq_pushroottable(v); + while(base_funcs[i].name!=0) { + sq_pushstring(v,base_funcs[i].name,-1); + sq_newclosure(v,base_funcs[i].f,0); + sq_setnativeclosurename(v,-1,base_funcs[i].name); + sq_setparamscheck(v,base_funcs[i].nparamscheck,base_funcs[i].typemask); + sq_newslot(v,-3, SQFalse); + i++; + } + + sq_pushstring(v,_SC("_versionnumber_"),-1); + sq_pushinteger(v,SQUIRREL_VERSION_NUMBER); + sq_newslot(v,-3, SQFalse); + sq_pushstring(v,_SC("_version_"),-1); + sq_pushstring(v,SQUIRREL_VERSION,-1); + sq_newslot(v,-3, SQFalse); + sq_pushstring(v,_SC("_charsize_"),-1); + sq_pushinteger(v,sizeof(SQChar)); + sq_newslot(v,-3, SQFalse); + sq_pushstring(v,_SC("_intsize_"),-1); + sq_pushinteger(v,sizeof(SQInteger)); + sq_newslot(v,-3, SQFalse); + sq_pushstring(v,_SC("_floatsize_"),-1); + sq_pushinteger(v,sizeof(SQFloat)); + sq_newslot(v,-3, SQFalse); + sq_pop(v,1); +} + +static SQInteger default_delegate_len(HSQUIRRELVM v) +{ + v->Push(SQInteger(sq_getsize(v,1))); + return 1; +} + +static SQInteger default_delegate_tofloat(HSQUIRRELVM v) +{ + SQObjectPtr &o=stack_get(v,1); + switch(type(o)){ + case OT_STRING:{ + SQObjectPtr res; + if(str2num(_stringval(o),res,10)){ + v->Push(SQObjectPtr(tofloat(res))); + break; + }} + return sq_throwerror(v, _SC("cannot convert the string")); + break; + case OT_INTEGER:case OT_FLOAT: + v->Push(SQObjectPtr(tofloat(o))); + break; + case OT_BOOL: + v->Push(SQObjectPtr((SQFloat)(_integer(o)?1:0))); + break; + default: + v->PushNull(); + break; + } + return 1; +} + +static SQInteger default_delegate_tointeger(HSQUIRRELVM v) +{ + SQObjectPtr &o=stack_get(v,1); + SQInteger base = 10; + if(sq_gettop(v) > 1) { + sq_getinteger(v,2,&base); + } + switch(type(o)){ + case OT_STRING:{ + SQObjectPtr res; + if(str2num(_stringval(o),res,base)){ + v->Push(SQObjectPtr(tointeger(res))); + break; + }} + return sq_throwerror(v, _SC("cannot convert the string")); + break; + case OT_INTEGER:case OT_FLOAT: + v->Push(SQObjectPtr(tointeger(o))); + break; + case OT_BOOL: + v->Push(SQObjectPtr(_integer(o)?(SQInteger)1:(SQInteger)0)); + break; + default: + v->PushNull(); + break; + } + return 1; +} + +static SQInteger default_delegate_tostring(HSQUIRRELVM v) +{ + if(SQ_FAILED(sq_tostring(v,1))) + return SQ_ERROR; + return 1; +} + +static SQInteger obj_delegate_weakref(HSQUIRRELVM v) +{ + sq_weakref(v,1); + return 1; +} + +static SQInteger obj_clear(HSQUIRRELVM v) +{ + return sq_clear(v,-1); +} + + +static SQInteger number_delegate_tochar(HSQUIRRELVM v) +{ + SQObject &o=stack_get(v,1); + SQChar c = (SQChar)tointeger(o); + v->Push(SQString::Create(_ss(v),(const SQChar *)&c,1)); + return 1; +} + + + +///////////////////////////////////////////////////////////////// +//TABLE DEFAULT DELEGATE + +static SQInteger table_rawdelete(HSQUIRRELVM v) +{ + if(SQ_FAILED(sq_rawdeleteslot(v,1,SQTrue))) + return SQ_ERROR; + return 1; +} + + +static SQInteger container_rawexists(HSQUIRRELVM v) +{ + if(SQ_SUCCEEDED(sq_rawget(v,-2))) { + sq_pushbool(v,SQTrue); + return 1; + } + sq_pushbool(v,SQFalse); + return 1; +} + +static SQInteger container_rawset(HSQUIRRELVM v) +{ + return sq_rawset(v,-3); +} + + +static SQInteger container_rawget(HSQUIRRELVM v) +{ + return SQ_SUCCEEDED(sq_rawget(v,-2))?1:SQ_ERROR; +} + +static SQInteger table_setdelegate(HSQUIRRELVM v) +{ + if(SQ_FAILED(sq_setdelegate(v,-2))) + return SQ_ERROR; + sq_push(v,-1); // -1 because sq_setdelegate pops 1 + return 1; +} + +static SQInteger table_getdelegate(HSQUIRRELVM v) +{ + return SQ_SUCCEEDED(sq_getdelegate(v,-1))?1:SQ_ERROR; +} + +SQRegFunction SQSharedState::_table_default_delegate_funcz[]={ + {_SC("len"),default_delegate_len,1, _SC("t")}, + {_SC("rawget"),container_rawget,2, _SC("t")}, + {_SC("rawset"),container_rawset,3, _SC("t")}, + {_SC("rawdelete"),table_rawdelete,2, _SC("t")}, + {_SC("rawin"),container_rawexists,2, _SC("t")}, + {_SC("weakref"),obj_delegate_weakref,1, NULL }, + {_SC("tostring"),default_delegate_tostring,1, _SC(".")}, + {_SC("clear"),obj_clear,1, _SC(".")}, + {_SC("setdelegate"),table_setdelegate,2, _SC(".t|o")}, + {_SC("getdelegate"),table_getdelegate,1, _SC(".")}, + {0,0} +}; + +//ARRAY DEFAULT DELEGATE/////////////////////////////////////// + +static SQInteger array_append(HSQUIRRELVM v) +{ + return sq_arrayappend(v,-2); +} + +static SQInteger array_extend(HSQUIRRELVM v) +{ + _array(stack_get(v,1))->Extend(_array(stack_get(v,2))); + return 0; +} + +static SQInteger array_reverse(HSQUIRRELVM v) +{ + return sq_arrayreverse(v,-1); +} + +static SQInteger array_pop(HSQUIRRELVM v) +{ + return SQ_SUCCEEDED(sq_arraypop(v,1,SQTrue))?1:SQ_ERROR; +} + +static SQInteger array_top(HSQUIRRELVM v) +{ + SQObject &o=stack_get(v,1); + if(_array(o)->Size()>0){ + v->Push(_array(o)->Top()); + return 1; + } + else return sq_throwerror(v,_SC("top() on a empty array")); +} + +static SQInteger array_insert(HSQUIRRELVM v) +{ + SQObject &o=stack_get(v,1); + SQObject &idx=stack_get(v,2); + SQObject &val=stack_get(v,3); + if(!_array(o)->Insert(tointeger(idx),val)) + return sq_throwerror(v,_SC("index out of range")); + return 0; +} + +static SQInteger array_remove(HSQUIRRELVM v) +{ + SQObject &o = stack_get(v, 1); + SQObject &idx = stack_get(v, 2); + if(!sq_isnumeric(idx)) return sq_throwerror(v, _SC("wrong type")); + SQObjectPtr val; + if(_array(o)->Get(tointeger(idx), val)) { + _array(o)->Remove(tointeger(idx)); + v->Push(val); + return 1; + } + return sq_throwerror(v, _SC("idx out of range")); +} + +static SQInteger array_resize(HSQUIRRELVM v) +{ + SQObject &o = stack_get(v, 1); + SQObject &nsize = stack_get(v, 2); + SQObjectPtr fill; + if(sq_isnumeric(nsize)) { + if(sq_gettop(v) > 2) + fill = stack_get(v, 3); + _array(o)->Resize(tointeger(nsize),fill); + return 0; + } + return sq_throwerror(v, _SC("size must be a number")); +} + +static SQInteger __map_array(SQArray *dest,SQArray *src,HSQUIRRELVM v) { + SQObjectPtr temp; + SQInteger size = src->Size(); + for(SQInteger n = 0; n < size; n++) { + src->Get(n,temp); + v->Push(src); + v->Push(temp); + if(SQ_FAILED(sq_call(v,2,SQTrue,SQFalse))) { + return SQ_ERROR; + } + dest->Set(n,v->GetUp(-1)); + v->Pop(); + } + return 0; +} + +static SQInteger array_map(HSQUIRRELVM v) +{ + SQObject &o = stack_get(v,1); + SQInteger size = _array(o)->Size(); + SQObjectPtr ret = SQArray::Create(_ss(v),size); + if(SQ_FAILED(__map_array(_array(ret),_array(o),v))) + return SQ_ERROR; + v->Push(ret); + return 1; +} + +static SQInteger array_apply(HSQUIRRELVM v) +{ + SQObject &o = stack_get(v,1); + if(SQ_FAILED(__map_array(_array(o),_array(o),v))) + return SQ_ERROR; + return 0; +} + +static SQInteger array_reduce(HSQUIRRELVM v) +{ + SQObject &o = stack_get(v,1); + SQArray *a = _array(o); + SQInteger size = a->Size(); + if(size == 0) { + return 0; + } + SQObjectPtr res; + a->Get(0,res); + if(size > 1) { + SQObjectPtr other; + for(SQInteger n = 1; n < size; n++) { + a->Get(n,other); + v->Push(o); + v->Push(res); + v->Push(other); + if(SQ_FAILED(sq_call(v,3,SQTrue,SQFalse))) { + return SQ_ERROR; + } + res = v->GetUp(-1); + v->Pop(); + } + } + v->Push(res); + return 1; +} + +static SQInteger array_filter(HSQUIRRELVM v) +{ + SQObject &o = stack_get(v,1); + SQArray *a = _array(o); + SQObjectPtr ret = SQArray::Create(_ss(v),0); + SQInteger size = a->Size(); + SQObjectPtr val; + for(SQInteger n = 0; n < size; n++) { + a->Get(n,val); + v->Push(o); + v->Push(n); + v->Push(val); + if(SQ_FAILED(sq_call(v,3,SQTrue,SQFalse))) { + return SQ_ERROR; + } + if(!SQVM::IsFalse(v->GetUp(-1))) { + _array(ret)->Append(val); + } + v->Pop(); + } + v->Push(ret); + return 1; +} + +static SQInteger array_find(HSQUIRRELVM v) +{ + SQObject &o = stack_get(v,1); + SQObjectPtr &val = stack_get(v,2); + SQArray *a = _array(o); + SQInteger size = a->Size(); + SQObjectPtr temp; + for(SQInteger n = 0; n < size; n++) { + bool res = false; + a->Get(n,temp); + if(SQVM::IsEqual(temp,val,res) && res) { + v->Push(n); + return 1; + } + } + return 0; +} + + +static bool _sort_compare(HSQUIRRELVM v,SQObjectPtr &a,SQObjectPtr &b,SQInteger func,SQInteger &ret) +{ + if(func < 0) { + if(!v->ObjCmp(a,b,ret)) return false; + } + else { + SQInteger top = sq_gettop(v); + sq_push(v, func); + sq_pushroottable(v); + v->Push(a); + v->Push(b); + if(SQ_FAILED(sq_call(v, 3, SQTrue, SQFalse))) { + if(!sq_isstring( v->_lasterror)) + v->Raise_Error(_SC("compare func failed")); + return false; + } + if(SQ_FAILED(sq_getinteger(v, -1, &ret))) { + v->Raise_Error(_SC("numeric value expected as return value of the compare function")); + return false; + } + sq_settop(v, top); + return true; + } + return true; +} + +static bool _hsort_sift_down(HSQUIRRELVM v,SQArray *arr, SQInteger root, SQInteger bottom, SQInteger func) +{ + SQInteger maxChild; + SQInteger done = 0; + SQInteger ret; + SQInteger root2; + while (((root2 = root * 2) <= bottom) && (!done)) + { + if (root2 == bottom) { + maxChild = root2; + } + else { + if(!_sort_compare(v,arr->_values[root2],arr->_values[root2 + 1],func,ret)) + return false; + if (ret > 0) { + maxChild = root2; + } + else { + maxChild = root2 + 1; + } + } + + if(!_sort_compare(v,arr->_values[root],arr->_values[maxChild],func,ret)) + return false; + if (ret < 0) { + if (root == maxChild) { + v->Raise_Error(_SC("inconsistent compare function")); + return false; // We'd be swapping ourselve. The compare function is incorrect + } + + _Swap(arr->_values[root],arr->_values[maxChild]); + root = maxChild; + } + else { + done = 1; + } + } + return true; +} + +static bool _hsort(HSQUIRRELVM v,SQObjectPtr &arr, SQInteger l, SQInteger r,SQInteger func) +{ + SQArray *a = _array(arr); + SQInteger i; + SQInteger array_size = a->Size(); + for (i = (array_size / 2); i >= 0; i--) { + if(!_hsort_sift_down(v,a, i, array_size - 1,func)) return false; + } + + for (i = array_size-1; i >= 1; i--) + { + _Swap(a->_values[0],a->_values[i]); + if(!_hsort_sift_down(v,a, 0, i-1,func)) return false; + } + return true; +} + +static SQInteger array_sort(HSQUIRRELVM v) +{ + SQInteger func = -1; + SQObjectPtr &o = stack_get(v,1); + if(_array(o)->Size() > 1) { + if(sq_gettop(v) == 2) func = 2; + if(!_hsort(v, o, 0, _array(o)->Size()-1, func)) + return SQ_ERROR; + + } + return 0; +} + +static SQInteger array_slice(HSQUIRRELVM v) +{ + SQInteger sidx,eidx; + SQObjectPtr o; + if(get_slice_params(v,sidx,eidx,o)==-1)return -1; + SQInteger alen = _array(o)->Size(); + if(sidx < 0)sidx = alen + sidx; + if(eidx < 0)eidx = alen + eidx; + if(eidx < sidx)return sq_throwerror(v,_SC("wrong indexes")); + if(eidx > alen)return sq_throwerror(v,_SC("slice out of range")); + SQArray *arr=SQArray::Create(_ss(v),eidx-sidx); + SQObjectPtr t; + SQInteger count=0; + for(SQInteger i=sidx;iGet(i,t); + arr->Set(count++,t); + } + v->Push(arr); + return 1; + +} + +SQRegFunction SQSharedState::_array_default_delegate_funcz[]={ + {_SC("len"),default_delegate_len,1, _SC("a")}, + {_SC("append"),array_append,2, _SC("a")}, + {_SC("extend"),array_extend,2, _SC("aa")}, + {_SC("push"),array_append,2, _SC("a")}, + {_SC("pop"),array_pop,1, _SC("a")}, + {_SC("top"),array_top,1, _SC("a")}, + {_SC("insert"),array_insert,3, _SC("an")}, + {_SC("remove"),array_remove,2, _SC("an")}, + {_SC("resize"),array_resize,-2, _SC("an")}, + {_SC("reverse"),array_reverse,1, _SC("a")}, + {_SC("sort"),array_sort,-1, _SC("ac")}, + {_SC("slice"),array_slice,-1, _SC("ann")}, + {_SC("weakref"),obj_delegate_weakref,1, NULL }, + {_SC("tostring"),default_delegate_tostring,1, _SC(".")}, + {_SC("clear"),obj_clear,1, _SC(".")}, + {_SC("map"),array_map,2, _SC("ac")}, + {_SC("apply"),array_apply,2, _SC("ac")}, + {_SC("reduce"),array_reduce,2, _SC("ac")}, + {_SC("filter"),array_filter,2, _SC("ac")}, + {_SC("find"),array_find,2, _SC("a.")}, + {0,0} +}; + +//STRING DEFAULT DELEGATE////////////////////////// +static SQInteger string_slice(HSQUIRRELVM v) +{ + SQInteger sidx,eidx; + SQObjectPtr o; + if(SQ_FAILED(get_slice_params(v,sidx,eidx,o)))return -1; + SQInteger slen = _string(o)->_len; + if(sidx < 0)sidx = slen + sidx; + if(eidx < 0)eidx = slen + eidx; + if(eidx < sidx) return sq_throwerror(v,_SC("wrong indexes")); + if(eidx > slen) return sq_throwerror(v,_SC("slice out of range")); + v->Push(SQString::Create(_ss(v),&_stringval(o)[sidx],eidx-sidx)); + return 1; +} + +static SQInteger string_find(HSQUIRRELVM v) +{ + SQInteger top,start_idx=0; + const SQChar *str,*substr,*ret; + if(((top=sq_gettop(v))>1) && SQ_SUCCEEDED(sq_getstring(v,1,&str)) && SQ_SUCCEEDED(sq_getstring(v,2,&substr))){ + if(top>2)sq_getinteger(v,3,&start_idx); + if((sq_getsize(v,1)>start_idx) && (start_idx>=0)){ + ret=scstrstr(&str[start_idx],substr); + if(ret){ + sq_pushinteger(v,(SQInteger)(ret-str)); + return 1; + } + } + return 0; + } + return sq_throwerror(v,_SC("invalid param")); +} + +#define STRING_TOFUNCZ(func) static SQInteger string_##func(HSQUIRRELVM v) \ +{\ + SQInteger sidx,eidx; \ + SQObjectPtr str; \ + if(SQ_FAILED(get_slice_params(v,sidx,eidx,str)))return -1; \ + SQInteger slen = _string(str)->_len; \ + if(sidx < 0)sidx = slen + sidx; \ + if(eidx < 0)eidx = slen + eidx; \ + if(eidx < sidx) return sq_throwerror(v,_SC("wrong indexes")); \ + if(eidx > slen) return sq_throwerror(v,_SC("slice out of range")); \ + SQInteger len=_string(str)->_len; \ + const SQChar *sthis=_stringval(str); \ + SQChar *snew=(_ss(v)->GetScratchPad(sq_rsl(len))); \ + memcpy(snew,sthis,sq_rsl(len));\ + for(SQInteger i=sidx;iPush(SQString::Create(_ss(v),snew,len)); \ + return 1; \ +} + + +STRING_TOFUNCZ(tolower) +STRING_TOFUNCZ(toupper) + +SQRegFunction SQSharedState::_string_default_delegate_funcz[]={ + {_SC("len"),default_delegate_len,1, _SC("s")}, + {_SC("tointeger"),default_delegate_tointeger,-1, _SC("sn")}, + {_SC("tofloat"),default_delegate_tofloat,1, _SC("s")}, + {_SC("tostring"),default_delegate_tostring,1, _SC(".")}, + {_SC("slice"),string_slice,-1, _SC("s n n")}, + {_SC("find"),string_find,-2, _SC("s s n")}, + {_SC("tolower"),string_tolower,-1, _SC("s n n")}, + {_SC("toupper"),string_toupper,-1, _SC("s n n")}, + {_SC("weakref"),obj_delegate_weakref,1, NULL }, + {0,0} +}; + +//INTEGER DEFAULT DELEGATE////////////////////////// +SQRegFunction SQSharedState::_number_default_delegate_funcz[]={ + {_SC("tointeger"),default_delegate_tointeger,1, _SC("n|b")}, + {_SC("tofloat"),default_delegate_tofloat,1, _SC("n|b")}, + {_SC("tostring"),default_delegate_tostring,1, _SC(".")}, + {_SC("tochar"),number_delegate_tochar,1, _SC("n|b")}, + {_SC("weakref"),obj_delegate_weakref,1, NULL }, + {0,0} +}; + +//CLOSURE DEFAULT DELEGATE////////////////////////// +static SQInteger closure_pcall(HSQUIRRELVM v) +{ + return SQ_SUCCEEDED(sq_call(v,sq_gettop(v)-1,SQTrue,SQFalse))?1:SQ_ERROR; +} + +static SQInteger closure_call(HSQUIRRELVM v) +{ + return SQ_SUCCEEDED(sq_call(v,sq_gettop(v)-1,SQTrue,SQTrue))?1:SQ_ERROR; +} + +static SQInteger _closure_acall(HSQUIRRELVM v,SQBool raiseerror) +{ + SQArray *aparams=_array(stack_get(v,2)); + SQInteger nparams=aparams->Size(); + v->Push(stack_get(v,1)); + for(SQInteger i=0;iPush(aparams->_values[i]); + return SQ_SUCCEEDED(sq_call(v,nparams,SQTrue,raiseerror))?1:SQ_ERROR; +} + +static SQInteger closure_acall(HSQUIRRELVM v) +{ + return _closure_acall(v,SQTrue); +} + +static SQInteger closure_pacall(HSQUIRRELVM v) +{ + return _closure_acall(v,SQFalse); +} + +static SQInteger closure_bindenv(HSQUIRRELVM v) +{ + if(SQ_FAILED(sq_bindenv(v,1))) + return SQ_ERROR; + return 1; +} + +static SQInteger closure_getroot(HSQUIRRELVM v) +{ + if(SQ_FAILED(sq_getclosureroot(v,-1))) + return SQ_ERROR; + return 1; +} + +static SQInteger closure_setroot(HSQUIRRELVM v) +{ + if(SQ_FAILED(sq_setclosureroot(v,-2))) + return SQ_ERROR; + return 1; +} + +static SQInteger closure_getinfos(HSQUIRRELVM v) { + SQObject o = stack_get(v,1); + SQTable *res = SQTable::Create(_ss(v),4); + if(type(o) == OT_CLOSURE) { + SQFunctionProto *f = _closure(o)->_function; + SQInteger nparams = f->_nparameters + (f->_varparams?1:0); + SQObjectPtr params = SQArray::Create(_ss(v),nparams); + SQObjectPtr defparams = SQArray::Create(_ss(v),f->_ndefaultparams); + for(SQInteger n = 0; n_nparameters; n++) { + _array(params)->Set((SQInteger)n,f->_parameters[n]); + } + for(SQInteger j = 0; j_ndefaultparams; j++) { + _array(defparams)->Set((SQInteger)j,_closure(o)->_defaultparams[j]); + } + if(f->_varparams) { + _array(params)->Set(nparams-1,SQString::Create(_ss(v),_SC("..."),-1)); + } + res->NewSlot(SQString::Create(_ss(v),_SC("native"),-1),false); + res->NewSlot(SQString::Create(_ss(v),_SC("name"),-1),f->_name); + res->NewSlot(SQString::Create(_ss(v),_SC("src"),-1),f->_sourcename); + res->NewSlot(SQString::Create(_ss(v),_SC("parameters"),-1),params); + res->NewSlot(SQString::Create(_ss(v),_SC("varargs"),-1),f->_varparams); + res->NewSlot(SQString::Create(_ss(v),_SC("defparams"),-1),defparams); + } + else { //OT_NATIVECLOSURE + SQNativeClosure *nc = _nativeclosure(o); + res->NewSlot(SQString::Create(_ss(v),_SC("native"),-1),true); + res->NewSlot(SQString::Create(_ss(v),_SC("name"),-1),nc->_name); + res->NewSlot(SQString::Create(_ss(v),_SC("paramscheck"),-1),nc->_nparamscheck); + SQObjectPtr typecheck; + if(nc->_typecheck.size() > 0) { + typecheck = + SQArray::Create(_ss(v), nc->_typecheck.size()); + for(SQUnsignedInteger n = 0; n_typecheck.size(); n++) { + _array(typecheck)->Set((SQInteger)n,nc->_typecheck[n]); + } + } + res->NewSlot(SQString::Create(_ss(v),_SC("typecheck"),-1),typecheck); + } + v->Push(res); + return 1; +} + + + +SQRegFunction SQSharedState::_closure_default_delegate_funcz[]={ + {_SC("call"),closure_call,-1, _SC("c")}, + {_SC("pcall"),closure_pcall,-1, _SC("c")}, + {_SC("acall"),closure_acall,2, _SC("ca")}, + {_SC("pacall"),closure_pacall,2, _SC("ca")}, + {_SC("weakref"),obj_delegate_weakref,1, NULL }, + {_SC("tostring"),default_delegate_tostring,1, _SC(".")}, + {_SC("bindenv"),closure_bindenv,2, _SC("c x|y|t")}, + {_SC("getinfos"),closure_getinfos,1, _SC("c")}, + {_SC("getroot"),closure_getroot,1, _SC("c")}, + {_SC("setroot"),closure_setroot,2, _SC("ct")}, + {0,0} +}; + +//GENERATOR DEFAULT DELEGATE +static SQInteger generator_getstatus(HSQUIRRELVM v) +{ + SQObject &o=stack_get(v,1); + switch(_generator(o)->_state){ + case SQGenerator::eSuspended:v->Push(SQString::Create(_ss(v),_SC("suspended")));break; + case SQGenerator::eRunning:v->Push(SQString::Create(_ss(v),_SC("running")));break; + case SQGenerator::eDead:v->Push(SQString::Create(_ss(v),_SC("dead")));break; + } + return 1; +} + +SQRegFunction SQSharedState::_generator_default_delegate_funcz[]={ + {_SC("getstatus"),generator_getstatus,1, _SC("g")}, + {_SC("weakref"),obj_delegate_weakref,1, NULL }, + {_SC("tostring"),default_delegate_tostring,1, _SC(".")}, + {0,0} +}; + +//THREAD DEFAULT DELEGATE +static SQInteger thread_call(HSQUIRRELVM v) +{ + SQObjectPtr o = stack_get(v,1); + if(type(o) == OT_THREAD) { + SQInteger nparams = sq_gettop(v); + _thread(o)->Push(_thread(o)->_roottable); + for(SQInteger i = 2; i<(nparams+1); i++) + sq_move(_thread(o),v,i); + if(SQ_SUCCEEDED(sq_call(_thread(o),nparams,SQTrue,SQTrue))) { + sq_move(v,_thread(o),-1); + sq_pop(_thread(o),1); + return 1; + } + v->_lasterror = _thread(o)->_lasterror; + return SQ_ERROR; + } + return sq_throwerror(v,_SC("wrong parameter")); +} + +static SQInteger thread_wakeup(HSQUIRRELVM v) +{ + SQObjectPtr o = stack_get(v,1); + if(type(o) == OT_THREAD) { + SQVM *thread = _thread(o); + SQInteger state = sq_getvmstate(thread); + if(state != SQ_VMSTATE_SUSPENDED) { + switch(state) { + case SQ_VMSTATE_IDLE: + return sq_throwerror(v,_SC("cannot wakeup a idle thread")); + break; + case SQ_VMSTATE_RUNNING: + return sq_throwerror(v,_SC("cannot wakeup a running thread")); + break; + } + } + + SQInteger wakeupret = sq_gettop(v)>1?SQTrue:SQFalse; + if(wakeupret) { + sq_move(thread,v,2); + } + if(SQ_SUCCEEDED(sq_wakeupvm(thread,wakeupret,SQTrue,SQTrue,SQFalse))) { + sq_move(v,thread,-1); + sq_pop(thread,1); //pop retval + if(sq_getvmstate(thread) == SQ_VMSTATE_IDLE) { + sq_settop(thread,1); //pop roottable + } + return 1; + } + sq_settop(thread,1); + v->_lasterror = thread->_lasterror; + return SQ_ERROR; + } + return sq_throwerror(v,_SC("wrong parameter")); +} + +static SQInteger thread_wakeupthrow(HSQUIRRELVM v) +{ + SQObjectPtr o = stack_get(v,1); + if(type(o) == OT_THREAD) { + SQVM *thread = _thread(o); + SQInteger state = sq_getvmstate(thread); + if(state != SQ_VMSTATE_SUSPENDED) { + switch(state) { + case SQ_VMSTATE_IDLE: + return sq_throwerror(v,_SC("cannot wakeup a idle thread")); + break; + case SQ_VMSTATE_RUNNING: + return sq_throwerror(v,_SC("cannot wakeup a running thread")); + break; + } + } + + sq_move(thread,v,2); + sq_throwobject(thread); + SQBool rethrow_error = SQTrue; + if(sq_gettop(v) > 2) { + sq_getbool(v,3,&rethrow_error); + } + if(SQ_SUCCEEDED(sq_wakeupvm(thread,SQFalse,SQTrue,SQTrue,SQTrue))) { + sq_move(v,thread,-1); + sq_pop(thread,1); //pop retval + if(sq_getvmstate(thread) == SQ_VMSTATE_IDLE) { + sq_settop(thread,1); //pop roottable + } + return 1; + } + sq_settop(thread,1); + if(rethrow_error) { + v->_lasterror = thread->_lasterror; + return SQ_ERROR; + } + return SQ_OK; + } + return sq_throwerror(v,_SC("wrong parameter")); +} + +static SQInteger thread_getstatus(HSQUIRRELVM v) +{ + SQObjectPtr &o = stack_get(v,1); + switch(sq_getvmstate(_thread(o))) { + case SQ_VMSTATE_IDLE: + sq_pushstring(v,_SC("idle"),-1); + break; + case SQ_VMSTATE_RUNNING: + sq_pushstring(v,_SC("running"),-1); + break; + case SQ_VMSTATE_SUSPENDED: + sq_pushstring(v,_SC("suspended"),-1); + break; + default: + return sq_throwerror(v,_SC("internal VM error")); + } + return 1; +} + +static SQInteger thread_getstackinfos(HSQUIRRELVM v) +{ + SQObjectPtr o = stack_get(v,1); + if(type(o) == OT_THREAD) { + SQVM *thread = _thread(o); + SQInteger threadtop = sq_gettop(thread); + SQInteger level; + sq_getinteger(v,-1,&level); + SQRESULT res = __getcallstackinfos(thread,level); + if(SQ_FAILED(res)) + { + sq_settop(thread,threadtop); + if(type(thread->_lasterror) == OT_STRING) { + sq_throwerror(v,_stringval(thread->_lasterror)); + } + else { + sq_throwerror(v,_SC("unknown error")); + } + } + if(res > 0) { + //some result + sq_move(v,thread,-1); + sq_settop(thread,threadtop); + return 1; + } + //no result + sq_settop(thread,threadtop); + return 0; + + } + return sq_throwerror(v,_SC("wrong parameter")); +} + +SQRegFunction SQSharedState::_thread_default_delegate_funcz[] = { + {_SC("call"), thread_call, -1, _SC("v")}, + {_SC("wakeup"), thread_wakeup, -1, _SC("v")}, + {_SC("wakeupthrow"), thread_wakeupthrow, -2, _SC("v.b")}, + {_SC("getstatus"), thread_getstatus, 1, _SC("v")}, + {_SC("weakref"),obj_delegate_weakref,1, NULL }, + {_SC("getstackinfos"),thread_getstackinfos,2, _SC("vn")}, + {_SC("tostring"),default_delegate_tostring,1, _SC(".")}, + {0,0}, +}; + +static SQInteger class_getattributes(HSQUIRRELVM v) +{ + return SQ_SUCCEEDED(sq_getattributes(v,-2))?1:SQ_ERROR; +} + +static SQInteger class_setattributes(HSQUIRRELVM v) +{ + return SQ_SUCCEEDED(sq_setattributes(v,-3))?1:SQ_ERROR; +} + +static SQInteger class_instance(HSQUIRRELVM v) +{ + return SQ_SUCCEEDED(sq_createinstance(v,-1))?1:SQ_ERROR; +} + +static SQInteger class_getbase(HSQUIRRELVM v) +{ + return SQ_SUCCEEDED(sq_getbase(v,-1))?1:SQ_ERROR; +} + +static SQInteger class_newmember(HSQUIRRELVM v) +{ + SQInteger top = sq_gettop(v); + SQBool bstatic = SQFalse; + if(top == 5) + { + sq_tobool(v,-1,&bstatic); + sq_pop(v,1); + } + + if(top < 4) { + sq_pushnull(v); + } + return SQ_SUCCEEDED(sq_newmember(v,-4,bstatic))?1:SQ_ERROR; +} + +static SQInteger class_rawnewmember(HSQUIRRELVM v) +{ + SQInteger top = sq_gettop(v); + SQBool bstatic = SQFalse; + if(top == 5) + { + sq_tobool(v,-1,&bstatic); + sq_pop(v,1); + } + + if(top < 4) { + sq_pushnull(v); + } + return SQ_SUCCEEDED(sq_rawnewmember(v,-4,bstatic))?1:SQ_ERROR; +} + +SQRegFunction SQSharedState::_class_default_delegate_funcz[] = { + {_SC("getattributes"), class_getattributes, 2, _SC("y.")}, + {_SC("setattributes"), class_setattributes, 3, _SC("y..")}, + {_SC("rawget"),container_rawget,2, _SC("y")}, + {_SC("rawset"),container_rawset,3, _SC("y")}, + {_SC("rawin"),container_rawexists,2, _SC("y")}, + {_SC("weakref"),obj_delegate_weakref,1, NULL }, + {_SC("tostring"),default_delegate_tostring,1, _SC(".")}, + {_SC("instance"),class_instance,1, _SC("y")}, + {_SC("getbase"),class_getbase,1, _SC("y")}, + {_SC("newmember"),class_newmember,-3, _SC("y")}, + {_SC("rawnewmember"),class_rawnewmember,-3, _SC("y")}, + {0,0} +}; + + +static SQInteger instance_getclass(HSQUIRRELVM v) +{ + if(SQ_SUCCEEDED(sq_getclass(v,1))) + return 1; + return SQ_ERROR; +} + +SQRegFunction SQSharedState::_instance_default_delegate_funcz[] = { + {_SC("getclass"), instance_getclass, 1, _SC("x")}, + {_SC("rawget"),container_rawget,2, _SC("x")}, + {_SC("rawset"),container_rawset,3, _SC("x")}, + {_SC("rawin"),container_rawexists,2, _SC("x")}, + {_SC("weakref"),obj_delegate_weakref,1, NULL }, + {_SC("tostring"),default_delegate_tostring,1, _SC(".")}, + {0,0} +}; + +static SQInteger weakref_ref(HSQUIRRELVM v) +{ + if(SQ_FAILED(sq_getweakrefval(v,1))) + return SQ_ERROR; + return 1; +} + +SQRegFunction SQSharedState::_weakref_default_delegate_funcz[] = { + {_SC("ref"),weakref_ref,1, _SC("r")}, + {_SC("weakref"),obj_delegate_weakref,1, NULL }, + {_SC("tostring"),default_delegate_tostring,1, _SC(".")}, + {0,0} +}; + diff --git a/squirrel/sqclass.cpp b/squirrel/sqclass.cpp new file mode 100644 index 0000000..21ad93e --- /dev/null +++ b/squirrel/sqclass.cpp @@ -0,0 +1,210 @@ +/* + see copyright notice in squirrel.h +*/ +#include "sqpcheader.h" +#include "sqvm.h" +#include "sqtable.h" +#include "sqclass.h" +#include "sqfuncproto.h" +#include "sqclosure.h" + + + +SQClass::SQClass(SQSharedState *ss,SQClass *base) +{ + _base = base; + _typetag = 0; + _hook = NULL; + _udsize = 0; + _locked = false; + _constructoridx = -1; + if(_base) { + _constructoridx = _base->_constructoridx; + _udsize = _base->_udsize; + _defaultvalues.copy(base->_defaultvalues); + _methods.copy(base->_methods); + _COPY_VECTOR(_metamethods,base->_metamethods,MT_LAST); + __ObjAddRef(_base); + } + _members = base?base->_members->Clone() : SQTable::Create(ss,0); + __ObjAddRef(_members); + + INIT_CHAIN(); + ADD_TO_CHAIN(&_sharedstate->_gc_chain, this); +} + +void SQClass::Finalize() { + _attributes.Null(); + _NULL_SQOBJECT_VECTOR(_defaultvalues,_defaultvalues.size()); + _methods.resize(0); + _NULL_SQOBJECT_VECTOR(_metamethods,MT_LAST); + __ObjRelease(_members); + if(_base) { + __ObjRelease(_base); + } +} + +SQClass::~SQClass() +{ + REMOVE_FROM_CHAIN(&_sharedstate->_gc_chain, this); + Finalize(); +} + +bool SQClass::NewSlot(SQSharedState *ss,const SQObjectPtr &key,const SQObjectPtr &val,bool bstatic) +{ + SQObjectPtr temp; + bool belongs_to_static_table = type(val) == OT_CLOSURE || type(val) == OT_NATIVECLOSURE || bstatic; + if(_locked && !belongs_to_static_table) + return false; //the class already has an instance so cannot be modified + if(_members->Get(key,temp) && _isfield(temp)) //overrides the default value + { + _defaultvalues[_member_idx(temp)].val = val; + return true; + } + if(belongs_to_static_table) { + SQInteger mmidx; + if((type(val) == OT_CLOSURE || type(val) == OT_NATIVECLOSURE) && + (mmidx = ss->GetMetaMethodIdxByName(key)) != -1) { + _metamethods[mmidx] = val; + } + else { + SQObjectPtr theval = val; + if(_base && type(val) == OT_CLOSURE) { + theval = _closure(val)->Clone(); + _closure(theval)->_base = _base; + __ObjAddRef(_base); //ref for the closure + } + if(type(temp) == OT_NULL) { + bool isconstructor; + SQVM::IsEqual(ss->_constructoridx, key, isconstructor); + if(isconstructor) { + _constructoridx = (SQInteger)_methods.size(); + } + SQClassMember m; + m.val = theval; + _members->NewSlot(key,SQObjectPtr(_make_method_idx(_methods.size()))); + _methods.push_back(m); + } + else { + _methods[_member_idx(temp)].val = theval; + } + } + return true; + } + SQClassMember m; + m.val = val; + _members->NewSlot(key,SQObjectPtr(_make_field_idx(_defaultvalues.size()))); + _defaultvalues.push_back(m); + return true; +} + +SQInstance *SQClass::CreateInstance() +{ + if(!_locked) Lock(); + return SQInstance::Create(_opt_ss(this),this); +} + +SQInteger SQClass::Next(const SQObjectPtr &refpos, SQObjectPtr &outkey, SQObjectPtr &outval) +{ + SQObjectPtr oval; + SQInteger idx = _members->Next(false,refpos,outkey,oval); + if(idx != -1) { + if(_ismethod(oval)) { + outval = _methods[_member_idx(oval)].val; + } + else { + SQObjectPtr &o = _defaultvalues[_member_idx(oval)].val; + outval = _realval(o); + } + } + return idx; +} + +bool SQClass::SetAttributes(const SQObjectPtr &key,const SQObjectPtr &val) +{ + SQObjectPtr idx; + if(_members->Get(key,idx)) { + if(_isfield(idx)) + _defaultvalues[_member_idx(idx)].attrs = val; + else + _methods[_member_idx(idx)].attrs = val; + return true; + } + return false; +} + +bool SQClass::GetAttributes(const SQObjectPtr &key,SQObjectPtr &outval) +{ + SQObjectPtr idx; + if(_members->Get(key,idx)) { + outval = (_isfield(idx)?_defaultvalues[_member_idx(idx)].attrs:_methods[_member_idx(idx)].attrs); + return true; + } + return false; +} + +/////////////////////////////////////////////////////////////////////// +void SQInstance::Init(SQSharedState *ss) +{ + _userpointer = NULL; + _hook = NULL; + __ObjAddRef(_class); + _delegate = _class->_members; + INIT_CHAIN(); + ADD_TO_CHAIN(&_sharedstate->_gc_chain, this); +} + +SQInstance::SQInstance(SQSharedState *ss, SQClass *c, SQInteger memsize) +{ + _memsize = memsize; + _class = c; + SQUnsignedInteger nvalues = _class->_defaultvalues.size(); + for(SQUnsignedInteger n = 0; n < nvalues; n++) { + new (&_values[n]) SQObjectPtr(_class->_defaultvalues[n].val); + } + Init(ss); +} + +SQInstance::SQInstance(SQSharedState *ss, SQInstance *i, SQInteger memsize) +{ + _memsize = memsize; + _class = i->_class; + SQUnsignedInteger nvalues = _class->_defaultvalues.size(); + for(SQUnsignedInteger n = 0; n < nvalues; n++) { + new (&_values[n]) SQObjectPtr(i->_values[n]); + } + Init(ss); +} + +void SQInstance::Finalize() +{ + SQUnsignedInteger nvalues = _class->_defaultvalues.size(); + __ObjRelease(_class); + _NULL_SQOBJECT_VECTOR(_values,nvalues); +} + +SQInstance::~SQInstance() +{ + REMOVE_FROM_CHAIN(&_sharedstate->_gc_chain, this); + if(_class){ Finalize(); } //if _class is null it was already finalized by the GC +} + +bool SQInstance::GetMetaMethod(SQVM *v,SQMetaMethod mm,SQObjectPtr &res) +{ + if(type(_class->_metamethods[mm]) != OT_NULL) { + res = _class->_metamethods[mm]; + return true; + } + return false; +} + +bool SQInstance::InstanceOf(SQClass *trg) +{ + SQClass *parent = _class; + while(parent != NULL) { + if(parent == trg) + return true; + parent = parent->_base; + } + return false; +} diff --git a/squirrel/sqclass.h b/squirrel/sqclass.h new file mode 100644 index 0000000..4e40d55 --- /dev/null +++ b/squirrel/sqclass.h @@ -0,0 +1,162 @@ +/* see copyright notice in squirrel.h */ +#ifndef _SQCLASS_H_ +#define _SQCLASS_H_ + +struct SQInstance; + +struct SQClassMember { + SQObjectPtr val; + SQObjectPtr attrs; + void Null() { + val.Null(); + attrs.Null(); + } +}; + +typedef sqvector SQClassMemberVec; + +#define MEMBER_TYPE_METHOD 0x01000000 +#define MEMBER_TYPE_FIELD 0x02000000 + +#define _ismethod(o) (_integer(o)&MEMBER_TYPE_METHOD) +#define _isfield(o) (_integer(o)&MEMBER_TYPE_FIELD) +#define _make_method_idx(i) ((SQInteger)(MEMBER_TYPE_METHOD|i)) +#define _make_field_idx(i) ((SQInteger)(MEMBER_TYPE_FIELD|i)) +#define _member_type(o) (_integer(o)&0xFF000000) +#define _member_idx(o) (_integer(o)&0x00FFFFFF) + +struct SQClass : public CHAINABLE_OBJ +{ + SQClass(SQSharedState *ss,SQClass *base); +public: + static SQClass* Create(SQSharedState *ss,SQClass *base) { + SQClass *newclass = (SQClass *)SQ_MALLOC(sizeof(SQClass)); + new (newclass) SQClass(ss, base); + return newclass; + } + ~SQClass(); + bool NewSlot(SQSharedState *ss, const SQObjectPtr &key,const SQObjectPtr &val,bool bstatic); + bool Get(const SQObjectPtr &key,SQObjectPtr &val) { + if(_members->Get(key,val)) { + if(_isfield(val)) { + SQObjectPtr &o = _defaultvalues[_member_idx(val)].val; + val = _realval(o); + } + else { + val = _methods[_member_idx(val)].val; + } + return true; + } + return false; + } + bool GetConstructor(SQObjectPtr &ctor) + { + if(_constructoridx != -1) { + ctor = _methods[_constructoridx].val; + return true; + } + return false; + } + bool SetAttributes(const SQObjectPtr &key,const SQObjectPtr &val); + bool GetAttributes(const SQObjectPtr &key,SQObjectPtr &outval); + void Lock() { _locked = true; if(_base) _base->Lock(); } + void Release() { + if (_hook) { _hook(_typetag,0);} + sq_delete(this, SQClass); + } + void Finalize(); +#ifndef NO_GARBAGE_COLLECTOR + void Mark(SQCollectable ** ); + SQObjectType GetType() {return OT_CLASS;} +#endif + SQInteger Next(const SQObjectPtr &refpos, SQObjectPtr &outkey, SQObjectPtr &outval); + SQInstance *CreateInstance(); + SQTable *_members; + SQClass *_base; + SQClassMemberVec _defaultvalues; + SQClassMemberVec _methods; + SQObjectPtr _metamethods[MT_LAST]; + SQObjectPtr _attributes; + SQUserPointer _typetag; + SQRELEASEHOOK _hook; + bool _locked; + SQInteger _constructoridx; + SQInteger _udsize; +}; + +#define calcinstancesize(_theclass_) \ + (_theclass_->_udsize + sq_aligning(sizeof(SQInstance) + (sizeof(SQObjectPtr)*(_theclass_->_defaultvalues.size()>0?_theclass_->_defaultvalues.size()-1:0)))) + +struct SQInstance : public SQDelegable +{ + void Init(SQSharedState *ss); + SQInstance(SQSharedState *ss, SQClass *c, SQInteger memsize); + SQInstance(SQSharedState *ss, SQInstance *c, SQInteger memsize); +public: + static SQInstance* Create(SQSharedState *ss,SQClass *theclass) { + + SQInteger size = calcinstancesize(theclass); + SQInstance *newinst = (SQInstance *)SQ_MALLOC(size); + new (newinst) SQInstance(ss, theclass,size); + if(theclass->_udsize) { + newinst->_userpointer = ((unsigned char *)newinst) + (size - theclass->_udsize); + } + return newinst; + } + SQInstance *Clone(SQSharedState *ss) + { + SQInteger size = calcinstancesize(_class); + SQInstance *newinst = (SQInstance *)SQ_MALLOC(size); + new (newinst) SQInstance(ss, this,size); + if(_class->_udsize) { + newinst->_userpointer = ((unsigned char *)newinst) + (size - _class->_udsize); + } + return newinst; + } + ~SQInstance(); + bool Get(const SQObjectPtr &key,SQObjectPtr &val) { + if(_class->_members->Get(key,val)) { + if(_isfield(val)) { + SQObjectPtr &o = _values[_member_idx(val)]; + val = _realval(o); + } + else { + val = _class->_methods[_member_idx(val)].val; + } + return true; + } + return false; + } + bool Set(const SQObjectPtr &key,const SQObjectPtr &val) { + SQObjectPtr idx; + if(_class->_members->Get(key,idx) && _isfield(idx)) { + _values[_member_idx(idx)] = val; + return true; + } + return false; + } + void Release() { + _uiRef++; + if (_hook) { _hook(_userpointer,0);} + _uiRef--; + if(_uiRef > 0) return; + SQInteger size = _memsize; + this->~SQInstance(); + SQ_FREE(this, size); + } + void Finalize(); +#ifndef NO_GARBAGE_COLLECTOR + void Mark(SQCollectable ** ); + SQObjectType GetType() {return OT_INSTANCE;} +#endif + bool InstanceOf(SQClass *trg); + bool GetMetaMethod(SQVM *v,SQMetaMethod mm,SQObjectPtr &res); + + SQClass *_class; + SQUserPointer _userpointer; + SQRELEASEHOOK _hook; + SQInteger _memsize; + SQObjectPtr _values[1]; +}; + +#endif //_SQCLASS_H_ diff --git a/squirrel/sqclosure.h b/squirrel/sqclosure.h new file mode 100644 index 0000000..9b70c7b --- /dev/null +++ b/squirrel/sqclosure.h @@ -0,0 +1,201 @@ +/* see copyright notice in squirrel.h */ +#ifndef _SQCLOSURE_H_ +#define _SQCLOSURE_H_ + + +#define _CALC_CLOSURE_SIZE(func) (sizeof(SQClosure) + (func->_noutervalues*sizeof(SQObjectPtr)) + (func->_ndefaultparams*sizeof(SQObjectPtr))) + +struct SQFunctionProto; +struct SQClass; +struct SQClosure : public CHAINABLE_OBJ +{ +private: + SQClosure(SQSharedState *ss,SQFunctionProto *func){_function = func; __ObjAddRef(_function); _base = NULL; INIT_CHAIN();ADD_TO_CHAIN(&_ss(this)->_gc_chain,this); _env = NULL; _root=NULL;} +public: + static SQClosure *Create(SQSharedState *ss,SQFunctionProto *func,SQWeakRef *root){ + SQInteger size = _CALC_CLOSURE_SIZE(func); + SQClosure *nc=(SQClosure*)SQ_MALLOC(size); + new (nc) SQClosure(ss,func); + nc->_outervalues = (SQObjectPtr *)(nc + 1); + nc->_defaultparams = &nc->_outervalues[func->_noutervalues]; + nc->_root = root; + __ObjAddRef(nc->_root); + _CONSTRUCT_VECTOR(SQObjectPtr,func->_noutervalues,nc->_outervalues); + _CONSTRUCT_VECTOR(SQObjectPtr,func->_ndefaultparams,nc->_defaultparams); + return nc; + } + void Release(){ + SQFunctionProto *f = _function; + SQInteger size = _CALC_CLOSURE_SIZE(f); + _DESTRUCT_VECTOR(SQObjectPtr,f->_noutervalues,_outervalues); + _DESTRUCT_VECTOR(SQObjectPtr,f->_ndefaultparams,_defaultparams); + __ObjRelease(_function); + this->~SQClosure(); + sq_vm_free(this,size); + } + void SetRoot(SQWeakRef *r) + { + __ObjRelease(_root); + _root = r; + __ObjAddRef(_root); + } + SQClosure *Clone() + { + SQFunctionProto *f = _function; + SQClosure * ret = SQClosure::Create(_opt_ss(this),f,_root); + ret->_env = _env; + if(ret->_env) __ObjAddRef(ret->_env); + _COPY_VECTOR(ret->_outervalues,_outervalues,f->_noutervalues); + _COPY_VECTOR(ret->_defaultparams,_defaultparams,f->_ndefaultparams); + return ret; + } + ~SQClosure(); + + bool Save(SQVM *v,SQUserPointer up,SQWRITEFUNC write); + static bool Load(SQVM *v,SQUserPointer up,SQREADFUNC read,SQObjectPtr &ret); +#ifndef NO_GARBAGE_COLLECTOR + void Mark(SQCollectable **chain); + void Finalize(){ + SQFunctionProto *f = _function; + _NULL_SQOBJECT_VECTOR(_outervalues,f->_noutervalues); + _NULL_SQOBJECT_VECTOR(_defaultparams,f->_ndefaultparams); + } + SQObjectType GetType() {return OT_CLOSURE;} +#endif + SQWeakRef *_env; + SQWeakRef *_root; + SQClass *_base; + SQFunctionProto *_function; + SQObjectPtr *_outervalues; + SQObjectPtr *_defaultparams; +}; + +////////////////////////////////////////////// +struct SQOuter : public CHAINABLE_OBJ +{ + +private: + SQOuter(SQSharedState *ss, SQObjectPtr *outer){_valptr = outer; _next = NULL; INIT_CHAIN(); ADD_TO_CHAIN(&_ss(this)->_gc_chain,this); } + +public: + static SQOuter *Create(SQSharedState *ss, SQObjectPtr *outer) + { + SQOuter *nc = (SQOuter*)SQ_MALLOC(sizeof(SQOuter)); + new (nc) SQOuter(ss, outer); + return nc; + } + ~SQOuter() { REMOVE_FROM_CHAIN(&_ss(this)->_gc_chain,this); } + + void Release() + { + this->~SQOuter(); + sq_vm_free(this,sizeof(SQOuter)); + } + +#ifndef NO_GARBAGE_COLLECTOR + void Mark(SQCollectable **chain); + void Finalize() { _value.Null(); } + SQObjectType GetType() {return OT_OUTER;} +#endif + + SQObjectPtr *_valptr; /* pointer to value on stack, or _value below */ + SQInteger _idx; /* idx in stack array, for relocation */ + SQObjectPtr _value; /* value of outer after stack frame is closed */ + SQOuter *_next; /* pointer to next outer when frame is open */ +}; + +////////////////////////////////////////////// +struct SQGenerator : public CHAINABLE_OBJ +{ + enum SQGeneratorState{eRunning,eSuspended,eDead}; +private: + SQGenerator(SQSharedState *ss,SQClosure *closure){_closure=closure;_state=eRunning;_ci._generator=NULL;INIT_CHAIN();ADD_TO_CHAIN(&_ss(this)->_gc_chain,this);} +public: + static SQGenerator *Create(SQSharedState *ss,SQClosure *closure){ + SQGenerator *nc=(SQGenerator*)SQ_MALLOC(sizeof(SQGenerator)); + new (nc) SQGenerator(ss,closure); + return nc; + } + ~SQGenerator() + { + REMOVE_FROM_CHAIN(&_ss(this)->_gc_chain,this); + } + void Kill(){ + _state=eDead; + _stack.resize(0); + _closure.Null();} + void Release(){ + sq_delete(this,SQGenerator); + } + + bool Yield(SQVM *v,SQInteger target); + bool Resume(SQVM *v,SQObjectPtr &dest); +#ifndef NO_GARBAGE_COLLECTOR + void Mark(SQCollectable **chain); + void Finalize(){_stack.resize(0);_closure.Null();} + SQObjectType GetType() {return OT_GENERATOR;} +#endif + SQObjectPtr _closure; + SQObjectPtrVec _stack; + SQVM::CallInfo _ci; + ExceptionsTraps _etraps; + SQGeneratorState _state; +}; + +#define _CALC_NATVIVECLOSURE_SIZE(noutervalues) (sizeof(SQNativeClosure) + (noutervalues*sizeof(SQObjectPtr))) + +struct SQNativeClosure : public CHAINABLE_OBJ +{ +private: + SQNativeClosure(SQSharedState *ss,SQFUNCTION func){_function=func;INIT_CHAIN();ADD_TO_CHAIN(&_ss(this)->_gc_chain,this); _env = NULL;} +public: + static SQNativeClosure *Create(SQSharedState *ss,SQFUNCTION func,SQInteger nouters) + { + SQInteger size = _CALC_NATVIVECLOSURE_SIZE(nouters); + SQNativeClosure *nc=(SQNativeClosure*)SQ_MALLOC(size); + new (nc) SQNativeClosure(ss,func); + nc->_outervalues = (SQObjectPtr *)(nc + 1); + nc->_noutervalues = nouters; + _CONSTRUCT_VECTOR(SQObjectPtr,nc->_noutervalues,nc->_outervalues); + return nc; + } + SQNativeClosure *Clone() + { + SQNativeClosure * ret = SQNativeClosure::Create(_opt_ss(this),_function,_noutervalues); + ret->_env = _env; + if(ret->_env) __ObjAddRef(ret->_env); + ret->_name = _name; + _COPY_VECTOR(ret->_outervalues,_outervalues,_noutervalues); + ret->_typecheck.copy(_typecheck); + ret->_nparamscheck = _nparamscheck; + return ret; + } + ~SQNativeClosure() + { + __ObjRelease(_env); + REMOVE_FROM_CHAIN(&_ss(this)->_gc_chain,this); + } + void Release(){ + SQInteger size = _CALC_NATVIVECLOSURE_SIZE(_noutervalues); + _DESTRUCT_VECTOR(SQObjectPtr,_noutervalues,_outervalues); + this->~SQNativeClosure(); + sq_free(this,size); + } + +#ifndef NO_GARBAGE_COLLECTOR + void Mark(SQCollectable **chain); + void Finalize() { _NULL_SQOBJECT_VECTOR(_outervalues,_noutervalues); } + SQObjectType GetType() {return OT_NATIVECLOSURE;} +#endif + SQInteger _nparamscheck; + SQIntVec _typecheck; + SQObjectPtr *_outervalues; + SQUnsignedInteger _noutervalues; + SQWeakRef *_env; + SQFUNCTION _function; + SQObjectPtr _name; +}; + + + +#endif //_SQCLOSURE_H_ diff --git a/squirrel/sqcompiler.cpp b/squirrel/sqcompiler.cpp new file mode 100644 index 0000000..869c2bb --- /dev/null +++ b/squirrel/sqcompiler.cpp @@ -0,0 +1,1577 @@ +/* + see copyright notice in squirrel.h +*/ +#include "sqpcheader.h" +#ifndef NO_COMPILER +#include +#include +#include "sqopcodes.h" +#include "sqstring.h" +#include "sqfuncproto.h" +#include "sqcompiler.h" +#include "sqfuncstate.h" +#include "sqlexer.h" +#include "sqvm.h" +#include "sqtable.h" + +#define EXPR 1 +#define OBJECT 2 +#define BASE 3 +#define LOCAL 4 +#define OUTER 5 + +struct SQExpState { + SQInteger etype; /* expr. type; one of EXPR, OBJECT, BASE, OUTER or LOCAL */ + SQInteger epos; /* expr. location on stack; -1 for OBJECT and BASE */ + bool donot_get; /* signal not to deref the next value */ +}; + +#define MAX_COMPILER_ERROR_LEN 256 + +struct SQScope { + SQInteger outers; + SQInteger stacksize; +}; + +#define BEGIN_SCOPE() SQScope __oldscope__ = _scope; \ + _scope.outers = _fs->_outers; \ + _scope.stacksize = _fs->GetStackSize(); + +#define RESOLVE_OUTERS() if(_fs->GetStackSize() != _scope.stacksize) { \ + if(_fs->CountOuters(_scope.stacksize)) { \ + _fs->AddInstruction(_OP_CLOSE,0,_scope.stacksize); \ + } \ + } + +#define END_SCOPE_NO_CLOSE() { if(_fs->GetStackSize() != _scope.stacksize) { \ + _fs->SetStackSize(_scope.stacksize); \ + } \ + _scope = __oldscope__; \ + } + +#define END_SCOPE() { SQInteger oldouters = _fs->_outers;\ + if(_fs->GetStackSize() != _scope.stacksize) { \ + _fs->SetStackSize(_scope.stacksize); \ + if(oldouters != _fs->_outers) { \ + _fs->AddInstruction(_OP_CLOSE,0,_scope.stacksize); \ + } \ + } \ + _scope = __oldscope__; \ + } + +#define BEGIN_BREAKBLE_BLOCK() SQInteger __nbreaks__=_fs->_unresolvedbreaks.size(); \ + SQInteger __ncontinues__=_fs->_unresolvedcontinues.size(); \ + _fs->_breaktargets.push_back(0);_fs->_continuetargets.push_back(0); + +#define END_BREAKBLE_BLOCK(continue_target) {__nbreaks__=_fs->_unresolvedbreaks.size()-__nbreaks__; \ + __ncontinues__=_fs->_unresolvedcontinues.size()-__ncontinues__; \ + if(__ncontinues__>0)ResolveContinues(_fs,__ncontinues__,continue_target); \ + if(__nbreaks__>0)ResolveBreaks(_fs,__nbreaks__); \ + _fs->_breaktargets.pop_back();_fs->_continuetargets.pop_back();} + +class SQCompiler +{ +public: + SQCompiler(SQVM *v, SQLEXREADFUNC rg, SQUserPointer up, const SQChar* sourcename, bool raiseerror, bool lineinfo) + { + _vm=v; + _lex.Init(_ss(v), rg, up,ThrowError,this); + _sourcename = SQString::Create(_ss(v), sourcename); + _lineinfo = lineinfo;_raiseerror = raiseerror; + _scope.outers = 0; + _scope.stacksize = 0; + _compilererror[0] = _SC('\0'); + } + static void ThrowError(void *ud, const SQChar *s) { + SQCompiler *c = (SQCompiler *)ud; + c->Error(s); + } + void Error(const SQChar *s, ...) + { + va_list vl; + va_start(vl, s); + scvsprintf(_compilererror, MAX_COMPILER_ERROR_LEN, s, vl); + va_end(vl); + longjmp(_errorjmp,1); + } + void Lex(){ _token = _lex.Lex();} + SQObject Expect(SQInteger tok) + { + + if(_token != tok) { + if(_token == TK_CONSTRUCTOR && tok == TK_IDENTIFIER) { + //do nothing + } + else { + const SQChar *etypename; + if(tok > 255) { + switch(tok) + { + case TK_IDENTIFIER: + etypename = _SC("IDENTIFIER"); + break; + case TK_STRING_LITERAL: + etypename = _SC("STRING_LITERAL"); + break; + case TK_INTEGER: + etypename = _SC("INTEGER"); + break; + case TK_FLOAT: + etypename = _SC("FLOAT"); + break; + default: + etypename = _lex.Tok2Str(tok); + } + Error(_SC("expected '%s'"), etypename); + } + Error(_SC("expected '%c'"), tok); + } + } + SQObjectPtr ret; + switch(tok) + { + case TK_IDENTIFIER: + ret = _fs->CreateString(_lex._svalue); + break; + case TK_STRING_LITERAL: + ret = _fs->CreateString(_lex._svalue,_lex._longstr.size()-1); + break; + case TK_INTEGER: + ret = SQObjectPtr(_lex._nvalue); + break; + case TK_FLOAT: + ret = SQObjectPtr(_lex._fvalue); + break; + } + Lex(); + return ret; + } + bool IsEndOfStatement() { return ((_lex._prevtoken == _SC('\n')) || (_token == SQUIRREL_EOB) || (_token == _SC('}')) || (_token == _SC(';'))); } + void OptionalSemicolon() + { + if(_token == _SC(';')) { Lex(); return; } + if(!IsEndOfStatement()) { + Error(_SC("end of statement expected (; or lf)")); + } + } + void MoveIfCurrentTargetIsLocal() { + SQInteger trg = _fs->TopTarget(); + if(_fs->IsLocal(trg)) { + trg = _fs->PopTarget(); //pops the target and moves it + _fs->AddInstruction(_OP_MOVE, _fs->PushTarget(), trg); + } + } + bool Compile(SQObjectPtr &o) + { + _debugline = 1; + _debugop = 0; + + SQFuncState funcstate(_ss(_vm), NULL,ThrowError,this); + funcstate._name = SQString::Create(_ss(_vm), _SC("main")); + _fs = &funcstate; + _fs->AddParameter(_fs->CreateString(_SC("this"))); + _fs->AddParameter(_fs->CreateString(_SC("vargv"))); + _fs->_varparams = true; + _fs->_sourcename = _sourcename; + SQInteger stacksize = _fs->GetStackSize(); + if(setjmp(_errorjmp) == 0) { + Lex(); + while(_token > 0){ + Statement(); + if(_lex._prevtoken != _SC('}') && _lex._prevtoken != _SC(';')) OptionalSemicolon(); + } + _fs->SetStackSize(stacksize); + _fs->AddLineInfos(_lex._currentline, _lineinfo, true); + _fs->AddInstruction(_OP_RETURN, 0xFF); + _fs->SetStackSize(0); + o =_fs->BuildProto(); +#ifdef _DEBUG_DUMP + _fs->Dump(_funcproto(o)); +#endif + } + else { + if(_raiseerror && _ss(_vm)->_compilererrorhandler) { + _ss(_vm)->_compilererrorhandler(_vm, _compilererror, type(_sourcename) == OT_STRING?_stringval(_sourcename):_SC("unknown"), + _lex._currentline, _lex._currentcolumn); + } + _vm->_lasterror = SQString::Create(_ss(_vm), _compilererror, -1); + return false; + } + return true; + } + void Statements() + { + while(_token != _SC('}') && _token != TK_DEFAULT && _token != TK_CASE) { + Statement(); + if(_lex._prevtoken != _SC('}') && _lex._prevtoken != _SC(';')) OptionalSemicolon(); + } + } + void Statement(bool closeframe = true) + { + _fs->AddLineInfos(_lex._currentline, _lineinfo); + switch(_token){ + case _SC(';'): Lex(); break; + case TK_IF: IfStatement(); break; + case TK_WHILE: WhileStatement(); break; + case TK_DO: DoWhileStatement(); break; + case TK_FOR: ForStatement(); break; + case TK_FOREACH: ForEachStatement(); break; + case TK_SWITCH: SwitchStatement(); break; + case TK_LOCAL: LocalDeclStatement(); break; + case TK_RETURN: + case TK_YIELD: { + SQOpcode op; + if(_token == TK_RETURN) { + op = _OP_RETURN; + } + else { + op = _OP_YIELD; + _fs->_bgenerator = true; + } + Lex(); + if(!IsEndOfStatement()) { + SQInteger retexp = _fs->GetCurrentPos()+1; + CommaExpr(); + if(op == _OP_RETURN && _fs->_traps > 0) + _fs->AddInstruction(_OP_POPTRAP, _fs->_traps, 0); + _fs->_returnexp = retexp; + _fs->AddInstruction(op, 1, _fs->PopTarget(),_fs->GetStackSize()); + } + else{ + if(op == _OP_RETURN && _fs->_traps > 0) + _fs->AddInstruction(_OP_POPTRAP, _fs->_traps ,0); + _fs->_returnexp = -1; + _fs->AddInstruction(op, 0xFF,0,_fs->GetStackSize()); + } + break;} + case TK_BREAK: + if(_fs->_breaktargets.size() <= 0)Error(_SC("'break' has to be in a loop block")); + if(_fs->_breaktargets.top() > 0){ + _fs->AddInstruction(_OP_POPTRAP, _fs->_breaktargets.top(), 0); + } + RESOLVE_OUTERS(); + _fs->AddInstruction(_OP_JMP, 0, -1234); + _fs->_unresolvedbreaks.push_back(_fs->GetCurrentPos()); + Lex(); + break; + case TK_CONTINUE: + if(_fs->_continuetargets.size() <= 0)Error(_SC("'continue' has to be in a loop block")); + if(_fs->_continuetargets.top() > 0) { + _fs->AddInstruction(_OP_POPTRAP, _fs->_continuetargets.top(), 0); + } + RESOLVE_OUTERS(); + _fs->AddInstruction(_OP_JMP, 0, -1234); + _fs->_unresolvedcontinues.push_back(_fs->GetCurrentPos()); + Lex(); + break; + case TK_FUNCTION: + FunctionStatement(); + break; + case TK_CLASS: + ClassStatement(); + break; + case TK_ENUM: + EnumStatement(); + break; + case _SC('{'):{ + BEGIN_SCOPE(); + Lex(); + Statements(); + Expect(_SC('}')); + if(closeframe) { + END_SCOPE(); + } + else { + END_SCOPE_NO_CLOSE(); + } + } + break; + case TK_TRY: + TryCatchStatement(); + break; + case TK_THROW: + Lex(); + CommaExpr(); + _fs->AddInstruction(_OP_THROW, _fs->PopTarget()); + break; + case TK_CONST: + { + Lex(); + SQObject id = Expect(TK_IDENTIFIER); + Expect('='); + SQObject val = ExpectScalar(); + OptionalSemicolon(); + SQTable *enums = _table(_ss(_vm)->_consts); + SQObjectPtr strongid = id; + enums->NewSlot(strongid,SQObjectPtr(val)); + strongid.Null(); + } + break; + default: + CommaExpr(); + _fs->DiscardTarget(); + //_fs->PopTarget(); + break; + } + _fs->SnoozeOpt(); + } + void EmitDerefOp(SQOpcode op) + { + SQInteger val = _fs->PopTarget(); + SQInteger key = _fs->PopTarget(); + SQInteger src = _fs->PopTarget(); + _fs->AddInstruction(op,_fs->PushTarget(),src,key,val); + } + void Emit2ArgsOP(SQOpcode op, SQInteger p3 = 0) + { + SQInteger p2 = _fs->PopTarget(); //src in OP_GET + SQInteger p1 = _fs->PopTarget(); //key in OP_GET + _fs->AddInstruction(op,_fs->PushTarget(), p1, p2, p3); + } + void EmitCompoundArith(SQInteger tok, SQInteger etype, SQInteger pos) + { + /* Generate code depending on the expression type */ + switch(etype) { + case LOCAL:{ + SQInteger p2 = _fs->PopTarget(); //src in OP_GET + SQInteger p1 = _fs->PopTarget(); //key in OP_GET + _fs->PushTarget(p1); + //EmitCompArithLocal(tok, p1, p1, p2); + _fs->AddInstruction(ChooseArithOpByToken(tok),p1, p2, p1, 0); + _fs->SnoozeOpt(); + } + break; + case OBJECT: + case BASE: + { + SQInteger val = _fs->PopTarget(); + SQInteger key = _fs->PopTarget(); + SQInteger src = _fs->PopTarget(); + /* _OP_COMPARITH mixes dest obj and source val in the arg1 */ + _fs->AddInstruction(_OP_COMPARITH, _fs->PushTarget(), (src<<16)|val, key, ChooseCompArithCharByToken(tok)); + } + break; + case OUTER: + { + SQInteger val = _fs->TopTarget(); + SQInteger tmp = _fs->PushTarget(); + _fs->AddInstruction(_OP_GETOUTER, tmp, pos); + _fs->AddInstruction(ChooseArithOpByToken(tok), tmp, val, tmp, 0); + _fs->PopTarget(); + _fs->PopTarget(); + _fs->AddInstruction(_OP_SETOUTER, _fs->PushTarget(), pos, tmp); + } + break; + } + } + void CommaExpr() + { + for(Expression();_token == ',';_fs->PopTarget(), Lex(), CommaExpr()); + } + void Expression() + { + SQExpState es = _es; + _es.etype = EXPR; + _es.epos = -1; + _es.donot_get = false; + LogicalOrExp(); + switch(_token) { + case _SC('='): + case TK_NEWSLOT: + case TK_MINUSEQ: + case TK_PLUSEQ: + case TK_MULEQ: + case TK_DIVEQ: + case TK_MODEQ:{ + SQInteger op = _token; + SQInteger ds = _es.etype; + SQInteger pos = _es.epos; + if(ds == EXPR) Error(_SC("can't assign expression")); + else if(ds == BASE) Error(_SC("'base' cannot be modified")); + Lex(); Expression(); + + switch(op){ + case TK_NEWSLOT: + if(ds == OBJECT || ds == BASE) + EmitDerefOp(_OP_NEWSLOT); + else //if _derefstate != DEREF_NO_DEREF && DEREF_FIELD so is the index of a local + Error(_SC("can't 'create' a local slot")); + break; + case _SC('='): //ASSIGN + switch(ds) { + case LOCAL: + { + SQInteger src = _fs->PopTarget(); + SQInteger dst = _fs->TopTarget(); + _fs->AddInstruction(_OP_MOVE, dst, src); + } + break; + case OBJECT: + case BASE: + EmitDerefOp(_OP_SET); + break; + case OUTER: + { + SQInteger src = _fs->PopTarget(); + SQInteger dst = _fs->PushTarget(); + _fs->AddInstruction(_OP_SETOUTER, dst, pos, src); + } + } + break; + case TK_MINUSEQ: + case TK_PLUSEQ: + case TK_MULEQ: + case TK_DIVEQ: + case TK_MODEQ: + EmitCompoundArith(op, ds, pos); + break; + } + } + break; + case _SC('?'): { + Lex(); + _fs->AddInstruction(_OP_JZ, _fs->PopTarget()); + SQInteger jzpos = _fs->GetCurrentPos(); + SQInteger trg = _fs->PushTarget(); + Expression(); + SQInteger first_exp = _fs->PopTarget(); + if(trg != first_exp) _fs->AddInstruction(_OP_MOVE, trg, first_exp); + SQInteger endfirstexp = _fs->GetCurrentPos(); + _fs->AddInstruction(_OP_JMP, 0, 0); + Expect(_SC(':')); + SQInteger jmppos = _fs->GetCurrentPos(); + Expression(); + SQInteger second_exp = _fs->PopTarget(); + if(trg != second_exp) _fs->AddInstruction(_OP_MOVE, trg, second_exp); + _fs->SetIntructionParam(jmppos, 1, _fs->GetCurrentPos() - jmppos); + _fs->SetIntructionParam(jzpos, 1, endfirstexp - jzpos + 1); + _fs->SnoozeOpt(); + } + break; + } + _es = es; + } + template void INVOKE_EXP(T f) + { + SQExpState es = _es; + _es.etype = EXPR; + _es.epos = -1; + _es.donot_get = false; + (this->*f)(); + _es = es; + } + template void BIN_EXP(SQOpcode op, T f,SQInteger op3 = 0) + { + Lex(); + INVOKE_EXP(f); + SQInteger op1 = _fs->PopTarget();SQInteger op2 = _fs->PopTarget(); + _fs->AddInstruction(op, _fs->PushTarget(), op1, op2, op3); + } + void LogicalOrExp() + { + LogicalAndExp(); + for(;;) if(_token == TK_OR) { + SQInteger first_exp = _fs->PopTarget(); + SQInteger trg = _fs->PushTarget(); + _fs->AddInstruction(_OP_OR, trg, 0, first_exp, 0); + SQInteger jpos = _fs->GetCurrentPos(); + if(trg != first_exp) _fs->AddInstruction(_OP_MOVE, trg, first_exp); + Lex(); INVOKE_EXP(&SQCompiler::LogicalOrExp); + _fs->SnoozeOpt(); + SQInteger second_exp = _fs->PopTarget(); + if(trg != second_exp) _fs->AddInstruction(_OP_MOVE, trg, second_exp); + _fs->SnoozeOpt(); + _fs->SetIntructionParam(jpos, 1, (_fs->GetCurrentPos() - jpos)); + break; + }else return; + } + void LogicalAndExp() + { + BitwiseOrExp(); + for(;;) switch(_token) { + case TK_AND: { + SQInteger first_exp = _fs->PopTarget(); + SQInteger trg = _fs->PushTarget(); + _fs->AddInstruction(_OP_AND, trg, 0, first_exp, 0); + SQInteger jpos = _fs->GetCurrentPos(); + if(trg != first_exp) _fs->AddInstruction(_OP_MOVE, trg, first_exp); + Lex(); INVOKE_EXP(&SQCompiler::LogicalAndExp); + _fs->SnoozeOpt(); + SQInteger second_exp = _fs->PopTarget(); + if(trg != second_exp) _fs->AddInstruction(_OP_MOVE, trg, second_exp); + _fs->SnoozeOpt(); + _fs->SetIntructionParam(jpos, 1, (_fs->GetCurrentPos() - jpos)); + break; + } + + default: + return; + } + } + void BitwiseOrExp() + { + BitwiseXorExp(); + for(;;) if(_token == _SC('|')) + {BIN_EXP(_OP_BITW, &SQCompiler::BitwiseXorExp,BW_OR); + }else return; + } + void BitwiseXorExp() + { + BitwiseAndExp(); + for(;;) if(_token == _SC('^')) + {BIN_EXP(_OP_BITW, &SQCompiler::BitwiseAndExp,BW_XOR); + }else return; + } + void BitwiseAndExp() + { + EqExp(); + for(;;) if(_token == _SC('&')) + {BIN_EXP(_OP_BITW, &SQCompiler::EqExp,BW_AND); + }else return; + } + void EqExp() + { + CompExp(); + for(;;) switch(_token) { + case TK_EQ: BIN_EXP(_OP_EQ, &SQCompiler::CompExp); break; + case TK_NE: BIN_EXP(_OP_NE, &SQCompiler::CompExp); break; + case TK_3WAYSCMP: BIN_EXP(_OP_CMP, &SQCompiler::CompExp,CMP_3W); break; + default: return; + } + } + void CompExp() + { + ShiftExp(); + for(;;) switch(_token) { + case _SC('>'): BIN_EXP(_OP_CMP, &SQCompiler::ShiftExp,CMP_G); break; + case _SC('<'): BIN_EXP(_OP_CMP, &SQCompiler::ShiftExp,CMP_L); break; + case TK_GE: BIN_EXP(_OP_CMP, &SQCompiler::ShiftExp,CMP_GE); break; + case TK_LE: BIN_EXP(_OP_CMP, &SQCompiler::ShiftExp,CMP_LE); break; + case TK_IN: BIN_EXP(_OP_EXISTS, &SQCompiler::ShiftExp); break; + case TK_INSTANCEOF: BIN_EXP(_OP_INSTANCEOF, &SQCompiler::ShiftExp); break; + default: return; + } + } + void ShiftExp() + { + PlusExp(); + for(;;) switch(_token) { + case TK_USHIFTR: BIN_EXP(_OP_BITW, &SQCompiler::PlusExp,BW_USHIFTR); break; + case TK_SHIFTL: BIN_EXP(_OP_BITW, &SQCompiler::PlusExp,BW_SHIFTL); break; + case TK_SHIFTR: BIN_EXP(_OP_BITW, &SQCompiler::PlusExp,BW_SHIFTR); break; + default: return; + } + } + SQOpcode ChooseArithOpByToken(SQInteger tok) + { + switch(tok) { + case TK_PLUSEQ: case '+': return _OP_ADD; + case TK_MINUSEQ: case '-': return _OP_SUB; + case TK_MULEQ: case '*': return _OP_MUL; + case TK_DIVEQ: case '/': return _OP_DIV; + case TK_MODEQ: case '%': return _OP_MOD; + default: assert(0); + } + return _OP_ADD; + } + SQInteger ChooseCompArithCharByToken(SQInteger tok) + { + SQInteger oper; + switch(tok){ + case TK_MINUSEQ: oper = '-'; break; + case TK_PLUSEQ: oper = '+'; break; + case TK_MULEQ: oper = '*'; break; + case TK_DIVEQ: oper = '/'; break; + case TK_MODEQ: oper = '%'; break; + default: oper = 0; //shut up compiler + assert(0); break; + }; + return oper; + } + void PlusExp() + { + MultExp(); + for(;;) switch(_token) { + case _SC('+'): case _SC('-'): + BIN_EXP(ChooseArithOpByToken(_token), &SQCompiler::MultExp); break; + default: return; + } + } + + void MultExp() + { + PrefixedExpr(); + for(;;) switch(_token) { + case _SC('*'): case _SC('/'): case _SC('%'): + BIN_EXP(ChooseArithOpByToken(_token), &SQCompiler::PrefixedExpr); break; + default: return; + } + } + //if 'pos' != -1 the previous variable is a local variable + void PrefixedExpr() + { + SQInteger pos = Factor(); + for(;;) { + switch(_token) { + case _SC('.'): + pos = -1; + Lex(); + + _fs->AddInstruction(_OP_LOAD, _fs->PushTarget(), _fs->GetConstant(Expect(TK_IDENTIFIER))); + if(_es.etype==BASE) { + Emit2ArgsOP(_OP_GET); + pos = _fs->TopTarget(); + _es.etype = EXPR; + _es.epos = pos; + } + else { + if(NeedGet()) { + Emit2ArgsOP(_OP_GET); + } + _es.etype = OBJECT; + } + break; + case _SC('['): + if(_lex._prevtoken == _SC('\n')) Error(_SC("cannot brake deref/or comma needed after [exp]=exp slot declaration")); + Lex(); Expression(); Expect(_SC(']')); + pos = -1; + if(_es.etype==BASE) { + Emit2ArgsOP(_OP_GET); + pos = _fs->TopTarget(); + _es.etype = EXPR; + _es.epos = pos; + } + else { + if(NeedGet()) { + Emit2ArgsOP(_OP_GET); + } + _es.etype = OBJECT; + } + break; + case TK_MINUSMINUS: + case TK_PLUSPLUS: + { + if(IsEndOfStatement()) return; + SQInteger diff = (_token==TK_MINUSMINUS) ? -1 : 1; + Lex(); + switch(_es.etype) + { + case EXPR: Error(_SC("can't '++' or '--' an expression")); break; + case OBJECT: + case BASE: + if(_es.donot_get == true) { Error(_SC("can't '++' or '--' an expression")); break; } //mmh dor this make sense? + Emit2ArgsOP(_OP_PINC, diff); + break; + case LOCAL: { + SQInteger src = _fs->PopTarget(); + _fs->AddInstruction(_OP_PINCL, _fs->PushTarget(), src, 0, diff); + } + break; + case OUTER: { + SQInteger tmp1 = _fs->PushTarget(); + SQInteger tmp2 = _fs->PushTarget(); + _fs->AddInstruction(_OP_GETOUTER, tmp2, _es.epos); + _fs->AddInstruction(_OP_PINCL, tmp1, tmp2, 0, diff); + _fs->AddInstruction(_OP_SETOUTER, tmp2, _es.epos, tmp2); + _fs->PopTarget(); + } + } + } + return; + break; + case _SC('('): + switch(_es.etype) { + case OBJECT: { + SQInteger key = _fs->PopTarget(); /* location of the key */ + SQInteger table = _fs->PopTarget(); /* location of the object */ + SQInteger closure = _fs->PushTarget(); /* location for the closure */ + SQInteger ttarget = _fs->PushTarget(); /* location for 'this' pointer */ + _fs->AddInstruction(_OP_PREPCALL, closure, key, table, ttarget); + } + break; + case BASE: + //Emit2ArgsOP(_OP_GET); + _fs->AddInstruction(_OP_MOVE, _fs->PushTarget(), 0); + break; + case OUTER: + _fs->AddInstruction(_OP_GETOUTER, _fs->PushTarget(), _es.epos); + _fs->AddInstruction(_OP_MOVE, _fs->PushTarget(), 0); + break; + default: + _fs->AddInstruction(_OP_MOVE, _fs->PushTarget(), 0); + } + _es.etype = EXPR; + Lex(); + FunctionCallArgs(); + break; + default: return; + } + } + } + SQInteger Factor() + { + //_es.etype = EXPR; + switch(_token) + { + case TK_STRING_LITERAL: + _fs->AddInstruction(_OP_LOAD, _fs->PushTarget(), _fs->GetConstant(_fs->CreateString(_lex._svalue,_lex._longstr.size()-1))); + Lex(); + break; + case TK_BASE: + Lex(); + _fs->AddInstruction(_OP_GETBASE, _fs->PushTarget()); + _es.etype = BASE; + _es.epos = _fs->TopTarget(); + return (_es.epos); + break; + case TK_IDENTIFIER: + case TK_CONSTRUCTOR: + case TK_THIS:{ + SQObject id; + SQObject constant; + + switch(_token) { + case TK_IDENTIFIER: id = _fs->CreateString(_lex._svalue); break; + case TK_THIS: id = _fs->CreateString(_SC("this"),4); break; + case TK_CONSTRUCTOR: id = _fs->CreateString(_SC("constructor"),11); break; + } + + SQInteger pos = -1; + Lex(); + if((pos = _fs->GetLocalVariable(id)) != -1) { + /* Handle a local variable (includes 'this') */ + _fs->PushTarget(pos); + _es.etype = LOCAL; + _es.epos = pos; + } + + else if((pos = _fs->GetOuterVariable(id)) != -1) { + /* Handle a free var */ + if(NeedGet()) { + _es.epos = _fs->PushTarget(); + _fs->AddInstruction(_OP_GETOUTER, _es.epos, pos); + /* _es.etype = EXPR; already default value */ + } + else { + _es.etype = OUTER; + _es.epos = pos; + } + } + + else if(_fs->IsConstant(id, constant)) { + /* Handle named constant */ + SQObjectPtr constval; + SQObject constid; + if(type(constant) == OT_TABLE) { + Expect('.'); + constid = Expect(TK_IDENTIFIER); + if(!_table(constant)->Get(constid, constval)) { + constval.Null(); + Error(_SC("invalid constant [%s.%s]"), _stringval(id), _stringval(constid)); + } + } + else { + constval = constant; + } + _es.epos = _fs->PushTarget(); + + /* generate direct or literal function depending on size */ + SQObjectType ctype = type(constval); + switch(ctype) { + case OT_INTEGER: EmitLoadConstInt(_integer(constval),_es.epos); break; + case OT_FLOAT: EmitLoadConstFloat(_float(constval),_es.epos); break; + case OT_BOOL: _fs->AddInstruction(_OP_LOADBOOL, _es.epos, _integer(constval)); break; + default: _fs->AddInstruction(_OP_LOAD,_es.epos,_fs->GetConstant(constval)); break; + } + _es.etype = EXPR; + } + else { + /* Handle a non-local variable, aka a field. Push the 'this' pointer on + * the virtual stack (always found in offset 0, so no instruction needs to + * be generated), and push the key next. Generate an _OP_LOAD instruction + * for the latter. If we are not using the variable as a dref expr, generate + * the _OP_GET instruction. + */ + _fs->PushTarget(0); + _fs->AddInstruction(_OP_LOAD, _fs->PushTarget(), _fs->GetConstant(id)); + if(NeedGet()) { + Emit2ArgsOP(_OP_GET); + } + _es.etype = OBJECT; + } + return _es.epos; + } + break; + case TK_DOUBLE_COLON: // "::" + _fs->AddInstruction(_OP_LOADROOT, _fs->PushTarget()); + _es.etype = OBJECT; + _token = _SC('.'); /* hack: drop into PrefixExpr, case '.'*/ + _es.epos = -1; + return _es.epos; + break; + case TK_NULL: + _fs->AddInstruction(_OP_LOADNULLS, _fs->PushTarget(),1); + Lex(); + break; + case TK_INTEGER: EmitLoadConstInt(_lex._nvalue,-1); Lex(); break; + case TK_FLOAT: EmitLoadConstFloat(_lex._fvalue,-1); Lex(); break; + case TK_TRUE: case TK_FALSE: + _fs->AddInstruction(_OP_LOADBOOL, _fs->PushTarget(),_token == TK_TRUE?1:0); + Lex(); + break; + case _SC('['): { + _fs->AddInstruction(_OP_NEWOBJ, _fs->PushTarget(),0,0,NOT_ARRAY); + SQInteger apos = _fs->GetCurrentPos(),key = 0; + Lex(); + while(_token != _SC(']')) { + Expression(); + if(_token == _SC(',')) Lex(); + SQInteger val = _fs->PopTarget(); + SQInteger array = _fs->TopTarget(); + _fs->AddInstruction(_OP_APPENDARRAY, array, val, AAT_STACK); + key++; + } + _fs->SetIntructionParam(apos, 1, key); + Lex(); + } + break; + case _SC('{'): + _fs->AddInstruction(_OP_NEWOBJ, _fs->PushTarget(),0,NOT_TABLE); + Lex();ParseTableOrClass(_SC(','),_SC('}')); + break; + case TK_FUNCTION: FunctionExp(_token);break; + case _SC('@'): FunctionExp(_token,true);break; + case TK_CLASS: Lex(); ClassExp();break; + case _SC('-'): + Lex(); + switch(_token) { + case TK_INTEGER: EmitLoadConstInt(-_lex._nvalue,-1); Lex(); break; + case TK_FLOAT: EmitLoadConstFloat(-_lex._fvalue,-1); Lex(); break; + default: UnaryOP(_OP_NEG); + } + break; + case _SC('!'): Lex(); UnaryOP(_OP_NOT); break; + case _SC('~'): + Lex(); + if(_token == TK_INTEGER) { EmitLoadConstInt(~_lex._nvalue,-1); Lex(); break; } + UnaryOP(_OP_BWNOT); + break; + case TK_TYPEOF : Lex() ;UnaryOP(_OP_TYPEOF); break; + case TK_RESUME : Lex(); UnaryOP(_OP_RESUME); break; + case TK_CLONE : Lex(); UnaryOP(_OP_CLONE); break; + case TK_MINUSMINUS : + case TK_PLUSPLUS :PrefixIncDec(_token); break; + case TK_DELETE : DeleteExpr(); break; + case _SC('('): Lex(); CommaExpr(); Expect(_SC(')')); + break; + case TK___LINE__: EmitLoadConstInt(_lex._currentline,-1); Lex(); break; + case TK___FILE__: _fs->AddInstruction(_OP_LOAD, _fs->PushTarget(), _fs->GetConstant(_sourcename)); Lex(); break; + default: Error(_SC("expression expected")); + } + _es.etype = EXPR; + return -1; + } + void EmitLoadConstInt(SQInteger value,SQInteger target) + { + if(target < 0) { + target = _fs->PushTarget(); + } + if(value <= INT_MAX && value > INT_MIN) { //does it fit in 32 bits? + _fs->AddInstruction(_OP_LOADINT, target,value); + } + else { + _fs->AddInstruction(_OP_LOAD, target, _fs->GetNumericConstant(value)); + } + } + void EmitLoadConstFloat(SQFloat value,SQInteger target) + { + if(target < 0) { + target = _fs->PushTarget(); + } + if(sizeof(SQFloat) == sizeof(SQInt32)) { + _fs->AddInstruction(_OP_LOADFLOAT, target,*((SQInt32 *)&value)); + } + else { + _fs->AddInstruction(_OP_LOAD, target, _fs->GetNumericConstant(value)); + } + } + void UnaryOP(SQOpcode op) + { + PrefixedExpr(); + SQInteger src = _fs->PopTarget(); + _fs->AddInstruction(op, _fs->PushTarget(), src); + } + bool NeedGet() + { + switch(_token) { + case _SC('='): case _SC('('): case TK_NEWSLOT: case TK_MODEQ: case TK_MULEQ: + case TK_DIVEQ: case TK_MINUSEQ: case TK_PLUSEQ: + return false; + case TK_PLUSPLUS: case TK_MINUSMINUS: + if (!IsEndOfStatement()) { + return false; + } + break; + } + return (!_es.donot_get || ( _es.donot_get && (_token == _SC('.') || _token == _SC('[')))); + } + void FunctionCallArgs() + { + SQInteger nargs = 1;//this + while(_token != _SC(')')) { + Expression(); + MoveIfCurrentTargetIsLocal(); + nargs++; + if(_token == _SC(',')){ + Lex(); + if(_token == ')') Error(_SC("expression expected, found ')'")); + } + } + Lex(); + for(SQInteger i = 0; i < (nargs - 1); i++) _fs->PopTarget(); + SQInteger stackbase = _fs->PopTarget(); + SQInteger closure = _fs->PopTarget(); + _fs->AddInstruction(_OP_CALL, _fs->PushTarget(), closure, stackbase, nargs); + } + void ParseTableOrClass(SQInteger separator,SQInteger terminator) + { + SQInteger tpos = _fs->GetCurrentPos(),nkeys = 0; + while(_token != terminator) { + bool hasattrs = false; + bool isstatic = false; + //check if is an attribute + if(separator == ';') { + if(_token == TK_ATTR_OPEN) { + _fs->AddInstruction(_OP_NEWOBJ, _fs->PushTarget(),0,NOT_TABLE); Lex(); + ParseTableOrClass(',',TK_ATTR_CLOSE); + hasattrs = true; + } + if(_token == TK_STATIC) { + isstatic = true; + Lex(); + } + } + switch(_token) { + case TK_FUNCTION: + case TK_CONSTRUCTOR:{ + SQInteger tk = _token; + Lex(); + SQObject id = tk == TK_FUNCTION ? Expect(TK_IDENTIFIER) : _fs->CreateString(_SC("constructor")); + Expect(_SC('(')); + _fs->AddInstruction(_OP_LOAD, _fs->PushTarget(), _fs->GetConstant(id)); + CreateFunction(id); + _fs->AddInstruction(_OP_CLOSURE, _fs->PushTarget(), _fs->_functions.size() - 1, 0); + } + break; + case _SC('['): + Lex(); CommaExpr(); Expect(_SC(']')); + Expect(_SC('=')); Expression(); + break; + case TK_STRING_LITERAL: //JSON + if(separator == ',') { //only works for tables + _fs->AddInstruction(_OP_LOAD, _fs->PushTarget(), _fs->GetConstant(Expect(TK_STRING_LITERAL))); + Expect(_SC(':')); Expression(); + break; + } + default : + _fs->AddInstruction(_OP_LOAD, _fs->PushTarget(), _fs->GetConstant(Expect(TK_IDENTIFIER))); + Expect(_SC('=')); Expression(); + } + if(_token == separator) Lex();//optional comma/semicolon + nkeys++; + SQInteger val = _fs->PopTarget(); + SQInteger key = _fs->PopTarget(); + SQInteger attrs = hasattrs ? _fs->PopTarget():-1; + assert((hasattrs && (attrs == key-1)) || !hasattrs); + unsigned char flags = (hasattrs?NEW_SLOT_ATTRIBUTES_FLAG:0)|(isstatic?NEW_SLOT_STATIC_FLAG:0); + SQInteger table = _fs->TopTarget(); //<AddInstruction(_OP_NEWSLOT, 0xFF, table, key, val); + } + else { + _fs->AddInstruction(_OP_NEWSLOTA, flags, table, key, val); //this for classes only as it invokes _newmember + } + } + if(separator == _SC(',')) //hack recognizes a table from the separator + _fs->SetIntructionParam(tpos, 1, nkeys); + Lex(); + } + void LocalDeclStatement() + { + SQObject varname; + Lex(); + if( _token == TK_FUNCTION) { + Lex(); + varname = Expect(TK_IDENTIFIER); + Expect(_SC('(')); + CreateFunction(varname,false); + _fs->AddInstruction(_OP_CLOSURE, _fs->PushTarget(), _fs->_functions.size() - 1, 0); + _fs->PopTarget(); + _fs->PushLocalVariable(varname); + return; + } + + do { + varname = Expect(TK_IDENTIFIER); + if(_token == _SC('=')) { + Lex(); Expression(); + SQInteger src = _fs->PopTarget(); + SQInteger dest = _fs->PushTarget(); + if(dest != src) _fs->AddInstruction(_OP_MOVE, dest, src); + } + else{ + _fs->AddInstruction(_OP_LOADNULLS, _fs->PushTarget(),1); + } + _fs->PopTarget(); + _fs->PushLocalVariable(varname); + if(_token == _SC(',')) Lex(); else break; + } while(1); + } + void IfBlock() + { + if (_token == _SC('{')) + { + BEGIN_SCOPE(); + Lex(); + Statements(); + Expect(_SC('}')); + if (true) { + END_SCOPE(); + } + else { + END_SCOPE_NO_CLOSE(); + } + } + else { + //BEGIN_SCOPE(); + Statement(); + if (_lex._prevtoken != _SC('}') && _lex._prevtoken != _SC(';')) OptionalSemicolon(); + //END_SCOPE(); + } + } + void IfStatement() + { + SQInteger jmppos; + bool haselse = false; + Lex(); Expect(_SC('(')); CommaExpr(); Expect(_SC(')')); + _fs->AddInstruction(_OP_JZ, _fs->PopTarget()); + SQInteger jnepos = _fs->GetCurrentPos(); + + + + IfBlock(); + // + /*static int n = 0; + if (_token != _SC('}') && _token != TK_ELSE) { + printf("IF %d-----------------------!!!!!!!!!\n", n); + if (n == 5) + { + printf("asd"); + } + n++; + //OptionalSemicolon(); + }*/ + + + SQInteger endifblock = _fs->GetCurrentPos(); + if(_token == TK_ELSE){ + haselse = true; + //BEGIN_SCOPE(); + _fs->AddInstruction(_OP_JMP); + jmppos = _fs->GetCurrentPos(); + Lex(); + //Statement(); if(_lex._prevtoken != _SC('}')) OptionalSemicolon(); + IfBlock(); + //END_SCOPE(); + _fs->SetIntructionParam(jmppos, 1, _fs->GetCurrentPos() - jmppos); + } + _fs->SetIntructionParam(jnepos, 1, endifblock - jnepos + (haselse?1:0)); + } + void WhileStatement() + { + SQInteger jzpos, jmppos; + jmppos = _fs->GetCurrentPos(); + Lex(); Expect(_SC('(')); CommaExpr(); Expect(_SC(')')); + + BEGIN_BREAKBLE_BLOCK(); + _fs->AddInstruction(_OP_JZ, _fs->PopTarget()); + jzpos = _fs->GetCurrentPos(); + BEGIN_SCOPE(); + + Statement(); + + END_SCOPE(); + _fs->AddInstruction(_OP_JMP, 0, jmppos - _fs->GetCurrentPos() - 1); + _fs->SetIntructionParam(jzpos, 1, _fs->GetCurrentPos() - jzpos); + + END_BREAKBLE_BLOCK(jmppos); + } + void DoWhileStatement() + { + Lex(); + SQInteger jmptrg = _fs->GetCurrentPos(); + BEGIN_BREAKBLE_BLOCK() + BEGIN_SCOPE(); + Statement(); + END_SCOPE(); + Expect(TK_WHILE); + SQInteger continuetrg = _fs->GetCurrentPos(); + Expect(_SC('(')); CommaExpr(); Expect(_SC(')')); + _fs->AddInstruction(_OP_JZ, _fs->PopTarget(), 1); + _fs->AddInstruction(_OP_JMP, 0, jmptrg - _fs->GetCurrentPos() - 1); + END_BREAKBLE_BLOCK(continuetrg); + } + void ForStatement() + { + Lex(); + BEGIN_SCOPE(); + Expect(_SC('(')); + if(_token == TK_LOCAL) LocalDeclStatement(); + else if(_token != _SC(';')){ + CommaExpr(); + _fs->PopTarget(); + } + Expect(_SC(';')); + _fs->SnoozeOpt(); + SQInteger jmppos = _fs->GetCurrentPos(); + SQInteger jzpos = -1; + if(_token != _SC(';')) { CommaExpr(); _fs->AddInstruction(_OP_JZ, _fs->PopTarget()); jzpos = _fs->GetCurrentPos(); } + Expect(_SC(';')); + _fs->SnoozeOpt(); + SQInteger expstart = _fs->GetCurrentPos() + 1; + if(_token != _SC(')')) { + CommaExpr(); + _fs->PopTarget(); + } + Expect(_SC(')')); + _fs->SnoozeOpt(); + SQInteger expend = _fs->GetCurrentPos(); + SQInteger expsize = (expend - expstart) + 1; + SQInstructionVec exp; + if(expsize > 0) { + for(SQInteger i = 0; i < expsize; i++) + exp.push_back(_fs->GetInstruction(expstart + i)); + _fs->PopInstructions(expsize); + } + BEGIN_BREAKBLE_BLOCK() + Statement(); + SQInteger continuetrg = _fs->GetCurrentPos(); + if(expsize > 0) { + for(SQInteger i = 0; i < expsize; i++) + _fs->AddInstruction(exp[i]); + } + _fs->AddInstruction(_OP_JMP, 0, jmppos - _fs->GetCurrentPos() - 1, 0); + if(jzpos> 0) _fs->SetIntructionParam(jzpos, 1, _fs->GetCurrentPos() - jzpos); + END_SCOPE(); + + END_BREAKBLE_BLOCK(continuetrg); + } + void ForEachStatement() + { + SQObject idxname, valname; + Lex(); Expect(_SC('(')); valname = Expect(TK_IDENTIFIER); + if(_token == _SC(',')) { + idxname = valname; + Lex(); valname = Expect(TK_IDENTIFIER); + } + else{ + idxname = _fs->CreateString(_SC("@INDEX@")); + } + Expect(TK_IN); + + //save the stack size + BEGIN_SCOPE(); + //put the table in the stack(evaluate the table expression) + Expression(); Expect(_SC(')')); + SQInteger container = _fs->TopTarget(); + //push the index local var + SQInteger indexpos = _fs->PushLocalVariable(idxname); + _fs->AddInstruction(_OP_LOADNULLS, indexpos,1); + //push the value local var + SQInteger valuepos = _fs->PushLocalVariable(valname); + _fs->AddInstruction(_OP_LOADNULLS, valuepos,1); + //push reference index + SQInteger itrpos = _fs->PushLocalVariable(_fs->CreateString(_SC("@ITERATOR@"))); //use invalid id to make it inaccessible + _fs->AddInstruction(_OP_LOADNULLS, itrpos,1); + SQInteger jmppos = _fs->GetCurrentPos(); + _fs->AddInstruction(_OP_FOREACH, container, 0, indexpos); + SQInteger foreachpos = _fs->GetCurrentPos(); + _fs->AddInstruction(_OP_POSTFOREACH, container, 0, indexpos); + //generate the statement code + BEGIN_BREAKBLE_BLOCK() + Statement(); + _fs->AddInstruction(_OP_JMP, 0, jmppos - _fs->GetCurrentPos() - 1); + _fs->SetIntructionParam(foreachpos, 1, _fs->GetCurrentPos() - foreachpos); + _fs->SetIntructionParam(foreachpos + 1, 1, _fs->GetCurrentPos() - foreachpos); + END_BREAKBLE_BLOCK(foreachpos - 1); + //restore the local variable stack(remove index,val and ref idx) + _fs->PopTarget(); + END_SCOPE(); + } + void SwitchStatement() + { + Lex(); Expect(_SC('(')); CommaExpr(); Expect(_SC(')')); + Expect(_SC('{')); + SQInteger expr = _fs->TopTarget(); + bool bfirst = true; + SQInteger tonextcondjmp = -1; + SQInteger skipcondjmp = -1; + SQInteger __nbreaks__ = _fs->_unresolvedbreaks.size(); + _fs->_breaktargets.push_back(0); + while(_token == TK_CASE) { + if(!bfirst) { + _fs->AddInstruction(_OP_JMP, 0, 0); + skipcondjmp = _fs->GetCurrentPos(); + _fs->SetIntructionParam(tonextcondjmp, 1, _fs->GetCurrentPos() - tonextcondjmp); + } + //condition + Lex(); Expression(); Expect(_SC(':')); + SQInteger trg = _fs->PopTarget(); + SQInteger eqtarget = trg; + bool local = _fs->IsLocal(trg); + if(local) { + eqtarget = _fs->PushTarget(); //we need to allocate a extra reg + } + _fs->AddInstruction(_OP_EQ, eqtarget, trg, expr); + _fs->AddInstruction(_OP_JZ, eqtarget, 0); + if(local) { + _fs->PopTarget(); + } + + //end condition + if(skipcondjmp != -1) { + _fs->SetIntructionParam(skipcondjmp, 1, (_fs->GetCurrentPos() - skipcondjmp)); + } + tonextcondjmp = _fs->GetCurrentPos(); + BEGIN_SCOPE(); + Statements(); + END_SCOPE(); + bfirst = false; + } + if(tonextcondjmp != -1) + _fs->SetIntructionParam(tonextcondjmp, 1, _fs->GetCurrentPos() - tonextcondjmp); + if(_token == TK_DEFAULT) { + Lex(); Expect(_SC(':')); + BEGIN_SCOPE(); + Statements(); + END_SCOPE(); + } + Expect(_SC('}')); + _fs->PopTarget(); + __nbreaks__ = _fs->_unresolvedbreaks.size() - __nbreaks__; + if(__nbreaks__ > 0)ResolveBreaks(_fs, __nbreaks__); + _fs->_breaktargets.pop_back(); + } + void FunctionStatement() + { + SQObject id; + Lex(); id = Expect(TK_IDENTIFIER); + _fs->PushTarget(0); + _fs->AddInstruction(_OP_LOAD, _fs->PushTarget(), _fs->GetConstant(id)); + if(_token == TK_DOUBLE_COLON) Emit2ArgsOP(_OP_GET); + + while(_token == TK_DOUBLE_COLON) { + Lex(); + id = Expect(TK_IDENTIFIER); + _fs->AddInstruction(_OP_LOAD, _fs->PushTarget(), _fs->GetConstant(id)); + if(_token == TK_DOUBLE_COLON) Emit2ArgsOP(_OP_GET); + } + Expect(_SC('(')); + CreateFunction(id); + _fs->AddInstruction(_OP_CLOSURE, _fs->PushTarget(), _fs->_functions.size() - 1, 0); + EmitDerefOp(_OP_NEWSLOT); + _fs->PopTarget(); + } + void ClassStatement() + { + SQExpState es; + Lex(); + es = _es; + _es.donot_get = true; + PrefixedExpr(); + if(_es.etype == EXPR) { + Error(_SC("invalid class name")); + } + else if(_es.etype == OBJECT || _es.etype == BASE) { + ClassExp(); + EmitDerefOp(_OP_NEWSLOT); + _fs->PopTarget(); + } + else { + Error(_SC("cannot create a class in a local with the syntax(class )")); + } + _es = es; + } + SQObject ExpectScalar() + { + SQObject val; + val._type = OT_NULL; val._unVal.nInteger = 0; //shut up GCC 4.x + switch(_token) { + case TK_INTEGER: + val._type = OT_INTEGER; + val._unVal.nInteger = _lex._nvalue; + break; + case TK_FLOAT: + val._type = OT_FLOAT; + val._unVal.fFloat = _lex._fvalue; + break; + case TK_STRING_LITERAL: + val = _fs->CreateString(_lex._svalue,_lex._longstr.size()-1); + break; + case TK_TRUE: + case TK_FALSE: + val._type = OT_BOOL; + val._unVal.nInteger = _token == TK_TRUE ? 1 : 0; + break; + case '-': + Lex(); + switch(_token) + { + case TK_INTEGER: + val._type = OT_INTEGER; + val._unVal.nInteger = -_lex._nvalue; + break; + case TK_FLOAT: + val._type = OT_FLOAT; + val._unVal.fFloat = -_lex._fvalue; + break; + default: + Error(_SC("scalar expected : integer,float")); + } + break; + default: + Error(_SC("scalar expected : integer,float or string")); + } + Lex(); + return val; + } + void EnumStatement() + { + Lex(); + SQObject id = Expect(TK_IDENTIFIER); + Expect(_SC('{')); + + SQObject table = _fs->CreateTable(); + SQInteger nval = 0; + while(_token != _SC('}')) { + SQObject key = Expect(TK_IDENTIFIER); + SQObject val; + if(_token == _SC('=')) { + Lex(); + val = ExpectScalar(); + } + else { + val._type = OT_INTEGER; + val._unVal.nInteger = nval++; + } + _table(table)->NewSlot(SQObjectPtr(key),SQObjectPtr(val)); + if(_token == ',') Lex(); + } + SQTable *enums = _table(_ss(_vm)->_consts); + SQObjectPtr strongid = id; + enums->NewSlot(SQObjectPtr(strongid),SQObjectPtr(table)); + strongid.Null(); + Lex(); + } + void TryCatchStatement() + { + SQObject exid; + Lex(); + _fs->AddInstruction(_OP_PUSHTRAP,0,0); + _fs->_traps++; + if(_fs->_breaktargets.size()) _fs->_breaktargets.top()++; + if(_fs->_continuetargets.size()) _fs->_continuetargets.top()++; + SQInteger trappos = _fs->GetCurrentPos(); + { + BEGIN_SCOPE(); + Statement(); + END_SCOPE(); + } + _fs->_traps--; + _fs->AddInstruction(_OP_POPTRAP, 1, 0); + if(_fs->_breaktargets.size()) _fs->_breaktargets.top()--; + if(_fs->_continuetargets.size()) _fs->_continuetargets.top()--; + _fs->AddInstruction(_OP_JMP, 0, 0); + SQInteger jmppos = _fs->GetCurrentPos(); + _fs->SetIntructionParam(trappos, 1, (_fs->GetCurrentPos() - trappos)); + Expect(TK_CATCH); Expect(_SC('(')); exid = Expect(TK_IDENTIFIER); Expect(_SC(')')); + { + BEGIN_SCOPE(); + SQInteger ex_target = _fs->PushLocalVariable(exid); + _fs->SetIntructionParam(trappos, 0, ex_target); + Statement(); + _fs->SetIntructionParams(jmppos, 0, (_fs->GetCurrentPos() - jmppos), 0); + END_SCOPE(); + } + } + void FunctionExp(SQInteger ftype,bool lambda = false) + { + Lex(); Expect(_SC('(')); + SQObjectPtr dummy; + CreateFunction(dummy,lambda); + _fs->AddInstruction(_OP_CLOSURE, _fs->PushTarget(), _fs->_functions.size() - 1, ftype == TK_FUNCTION?0:1); + } + void ClassExp() + { + SQInteger base = -1; + SQInteger attrs = -1; + if(_token == TK_EXTENDS) { + Lex(); Expression(); + base = _fs->TopTarget(); + } + if(_token == TK_ATTR_OPEN) { + Lex(); + _fs->AddInstruction(_OP_NEWOBJ, _fs->PushTarget(),0,NOT_TABLE); + ParseTableOrClass(_SC(','),TK_ATTR_CLOSE); + attrs = _fs->TopTarget(); + } + Expect(_SC('{')); + if(attrs != -1) _fs->PopTarget(); + if(base != -1) _fs->PopTarget(); + _fs->AddInstruction(_OP_NEWOBJ, _fs->PushTarget(), base, attrs,NOT_CLASS); + ParseTableOrClass(_SC(';'),_SC('}')); + } + void DeleteExpr() + { + SQExpState es; + Lex(); + es = _es; + _es.donot_get = true; + PrefixedExpr(); + if(_es.etype==EXPR) Error(_SC("can't delete an expression")); + if(_es.etype==OBJECT || _es.etype==BASE) { + Emit2ArgsOP(_OP_DELETE); + } + else { + Error(_SC("cannot delete an (outer) local")); + } + _es = es; + } + void PrefixIncDec(SQInteger token) + { + SQExpState es; + SQInteger diff = (token==TK_MINUSMINUS) ? -1 : 1; + Lex(); + es = _es; + _es.donot_get = true; + PrefixedExpr(); + if(_es.etype==EXPR) { + Error(_SC("can't '++' or '--' an expression")); + } + else if(_es.etype==OBJECT || _es.etype==BASE) { + Emit2ArgsOP(_OP_INC, diff); + } + else if(_es.etype==LOCAL) { + SQInteger src = _fs->TopTarget(); + _fs->AddInstruction(_OP_INCL, src, src, 0, diff); + + } + else if(_es.etype==OUTER) { + SQInteger tmp = _fs->PushTarget(); + _fs->AddInstruction(_OP_GETOUTER, tmp, _es.epos); + _fs->AddInstruction(_OP_INCL, tmp, tmp, 0, diff); + _fs->AddInstruction(_OP_SETOUTER, tmp, _es.epos, tmp); + } + _es = es; + } + void CreateFunction(SQObject &name,bool lambda = false) + { + SQFuncState *funcstate = _fs->PushChildState(_ss(_vm)); + funcstate->_name = name; + SQObject paramname; + funcstate->AddParameter(_fs->CreateString(_SC("this"))); + funcstate->_sourcename = _sourcename; + SQInteger defparams = 0; + while(_token!=_SC(')')) { + if(_token == TK_VARPARAMS) { + if(defparams > 0) Error(_SC("function with default parameters cannot have variable number of parameters")); + funcstate->AddParameter(_fs->CreateString(_SC("vargv"))); + funcstate->_varparams = true; + Lex(); + if(_token != _SC(')')) Error(_SC("expected ')'")); + break; + } + else { + paramname = Expect(TK_IDENTIFIER); + funcstate->AddParameter(paramname); + if(_token == _SC('=')) { + Lex(); + Expression(); + funcstate->AddDefaultParam(_fs->TopTarget()); + defparams++; + } + else { + if(defparams > 0) Error(_SC("expected '='")); + } + if(_token == _SC(',')) Lex(); + else if(_token != _SC(')')) Error(_SC("expected ')' or ','")); + } + } + Expect(_SC(')')); + for(SQInteger n = 0; n < defparams; n++) { + _fs->PopTarget(); + } + + SQFuncState *currchunk = _fs; + _fs = funcstate; + if(lambda) { + Expression(); + _fs->AddInstruction(_OP_RETURN, 1, _fs->PopTarget());} + else { + Statement(false); + } + funcstate->AddLineInfos(_lex._prevtoken == _SC('\n')?_lex._lasttokenline:_lex._currentline, _lineinfo, true); + funcstate->AddInstruction(_OP_RETURN, -1); + funcstate->SetStackSize(0); + + SQFunctionProto *func = funcstate->BuildProto(); +#ifdef _DEBUG_DUMP + funcstate->Dump(func); +#endif + _fs = currchunk; + _fs->_functions.push_back(func); + _fs->PopChildState(); + } + void ResolveBreaks(SQFuncState *funcstate, SQInteger ntoresolve) + { + while(ntoresolve > 0) { + SQInteger pos = funcstate->_unresolvedbreaks.back(); + funcstate->_unresolvedbreaks.pop_back(); + //set the jmp instruction + funcstate->SetIntructionParams(pos, 0, funcstate->GetCurrentPos() - pos, 0); + ntoresolve--; + } + } + void ResolveContinues(SQFuncState *funcstate, SQInteger ntoresolve, SQInteger targetpos) + { + while(ntoresolve > 0) { + SQInteger pos = funcstate->_unresolvedcontinues.back(); + funcstate->_unresolvedcontinues.pop_back(); + //set the jmp instruction + funcstate->SetIntructionParams(pos, 0, targetpos - pos, 0); + ntoresolve--; + } + } +private: + SQInteger _token; + SQFuncState *_fs; + SQObjectPtr _sourcename; + SQLexer _lex; + bool _lineinfo; + bool _raiseerror; + SQInteger _debugline; + SQInteger _debugop; + SQExpState _es; + SQScope _scope; + SQChar _compilererror[MAX_COMPILER_ERROR_LEN]; + jmp_buf _errorjmp; + SQVM *_vm; +}; + +bool Compile(SQVM *vm,SQLEXREADFUNC rg, SQUserPointer up, const SQChar *sourcename, SQObjectPtr &out, bool raiseerror, bool lineinfo) +{ + SQCompiler p(vm, rg, up, sourcename, raiseerror, lineinfo); + return p.Compile(out); +} + +#endif diff --git a/squirrel/sqcompiler.h b/squirrel/sqcompiler.h new file mode 100644 index 0000000..c553518 --- /dev/null +++ b/squirrel/sqcompiler.h @@ -0,0 +1,78 @@ +/* see copyright notice in squirrel.h */ +#ifndef _SQCOMPILER_H_ +#define _SQCOMPILER_H_ + +struct SQVM; + +#define TK_IDENTIFIER 258 +#define TK_STRING_LITERAL 259 +#define TK_INTEGER 260 +#define TK_FLOAT 261 +#define TK_BASE 262 +#define TK_DELETE 263 +#define TK_EQ 264 +#define TK_NE 265 +#define TK_LE 266 +#define TK_GE 267 +#define TK_SWITCH 268 +#define TK_ARROW 269 +#define TK_AND 270 +#define TK_OR 271 +#define TK_IF 272 +#define TK_ELSE 273 +#define TK_WHILE 274 +#define TK_BREAK 275 +#define TK_FOR 276 +#define TK_DO 277 +#define TK_NULL 278 +#define TK_FOREACH 279 +#define TK_IN 280 +#define TK_NEWSLOT 281 +#define TK_MODULO 282 +#define TK_LOCAL 283 +#define TK_CLONE 284 +#define TK_FUNCTION 285 +#define TK_RETURN 286 +#define TK_TYPEOF 287 +#define TK_UMINUS 288 +#define TK_PLUSEQ 289 +#define TK_MINUSEQ 290 +#define TK_CONTINUE 291 +#define TK_YIELD 292 +#define TK_TRY 293 +#define TK_CATCH 294 +#define TK_THROW 295 +#define TK_SHIFTL 296 +#define TK_SHIFTR 297 +#define TK_RESUME 298 +#define TK_DOUBLE_COLON 299 +#define TK_CASE 300 +#define TK_DEFAULT 301 +#define TK_THIS 302 +#define TK_PLUSPLUS 303 +#define TK_MINUSMINUS 304 +#define TK_3WAYSCMP 305 +#define TK_USHIFTR 306 +#define TK_CLASS 307 +#define TK_EXTENDS 308 +#define TK_CONSTRUCTOR 310 +#define TK_INSTANCEOF 311 +#define TK_VARPARAMS 312 +#define TK___LINE__ 313 +#define TK___FILE__ 314 +#define TK_TRUE 315 +#define TK_FALSE 316 +#define TK_MULEQ 317 +#define TK_DIVEQ 318 +#define TK_MODEQ 319 +#define TK_ATTR_OPEN 320 +#define TK_ATTR_CLOSE 321 +#define TK_STATIC 322 +#define TK_ENUM 323 +#define TK_CONST 324 + + + +typedef void(*CompilerErrorFunc)(void *ud, const SQChar *s); +bool Compile(SQVM *vm, SQLEXREADFUNC rg, SQUserPointer up, const SQChar *sourcename, SQObjectPtr &out, bool raiseerror, bool lineinfo); +#endif //_SQCOMPILER_H_ diff --git a/squirrel/sqdebug.cpp b/squirrel/sqdebug.cpp new file mode 100644 index 0000000..8c4de9e --- /dev/null +++ b/squirrel/sqdebug.cpp @@ -0,0 +1,118 @@ +/* + see copyright notice in squirrel.h +*/ +#include "sqpcheader.h" +#include +#include "sqvm.h" +#include "sqfuncproto.h" +#include "sqclosure.h" +#include "sqstring.h" + +SQRESULT sq_getfunctioninfo(HSQUIRRELVM v,SQInteger level,SQFunctionInfo *fi) +{ + SQInteger cssize = v->_callsstacksize; + if (cssize > level) { + SQVM::CallInfo &ci = v->_callsstack[cssize-level-1]; + if(sq_isclosure(ci._closure)) { + SQClosure *c = _closure(ci._closure); + SQFunctionProto *proto = c->_function; + fi->funcid = proto; + fi->name = type(proto->_name) == OT_STRING?_stringval(proto->_name):_SC("unknown"); + fi->source = type(proto->_sourcename) == OT_STRING?_stringval(proto->_sourcename):_SC("unknown"); + fi->line = proto->_lineinfos[0]._line; + return SQ_OK; + } + } + return sq_throwerror(v,_SC("the object is not a closure")); +} + +SQRESULT sq_stackinfos(HSQUIRRELVM v, SQInteger level, SQStackInfos *si) +{ + SQInteger cssize = v->_callsstacksize; + if (cssize > level) { + memset(si, 0, sizeof(SQStackInfos)); + SQVM::CallInfo &ci = v->_callsstack[cssize-level-1]; + switch (type(ci._closure)) { + case OT_CLOSURE:{ + SQFunctionProto *func = _closure(ci._closure)->_function; + if (type(func->_name) == OT_STRING) + si->funcname = _stringval(func->_name); + if (type(func->_sourcename) == OT_STRING) + si->source = _stringval(func->_sourcename); + si->line = func->GetLine(ci._ip); + } + break; + case OT_NATIVECLOSURE: + si->source = _SC("NATIVE"); + si->funcname = _SC("unknown"); + if(type(_nativeclosure(ci._closure)->_name) == OT_STRING) + si->funcname = _stringval(_nativeclosure(ci._closure)->_name); + si->line = -1; + break; + default: break; //shutup compiler + } + return SQ_OK; + } + return SQ_ERROR; +} + +void SQVM::Raise_Error(const SQChar *s, ...) +{ + va_list vl; + va_start(vl, s); + SQInteger buffersize = (SQInteger)scstrlen(s)+(NUMBER_MAX_CHAR*2); + scvsprintf(_sp(sq_rsl(buffersize)),buffersize, s, vl); + va_end(vl); + _lasterror = SQString::Create(_ss(this),_spval,-1); +} + +void SQVM::Raise_Error(const SQObjectPtr &desc) +{ + _lasterror = desc; +} + +SQString *SQVM::PrintObjVal(const SQObjectPtr &o) +{ + switch(type(o)) { + case OT_STRING: return _string(o); + case OT_INTEGER: + scsprintf(_sp(sq_rsl(NUMBER_MAX_CHAR+1)),sq_rsl(NUMBER_MAX_CHAR), _PRINT_INT_FMT, _integer(o)); + return SQString::Create(_ss(this), _spval); + break; + case OT_FLOAT: + scsprintf(_sp(sq_rsl(NUMBER_MAX_CHAR+1)), sq_rsl(NUMBER_MAX_CHAR), _SC("%.14g"), _float(o)); + return SQString::Create(_ss(this), _spval); + break; + default: + return SQString::Create(_ss(this), GetTypeName(o)); + } +} + +void SQVM::Raise_IdxError(const SQObjectPtr &o) +{ + SQObjectPtr oval = PrintObjVal(o); + Raise_Error(_SC("the index '%.50s' does not exist"), _stringval(oval)); +} + +void SQVM::Raise_CompareError(const SQObject &o1, const SQObject &o2) +{ + SQObjectPtr oval1 = PrintObjVal(o1), oval2 = PrintObjVal(o2); + Raise_Error(_SC("comparison between '%.50s' and '%.50s'"), _stringval(oval1), _stringval(oval2)); +} + + +void SQVM::Raise_ParamTypeError(SQInteger nparam,SQInteger typemask,SQInteger type) +{ + SQObjectPtr exptypes = SQString::Create(_ss(this), _SC(""), -1); + SQInteger found = 0; + for(SQInteger i=0; i<16; i++) + { + SQInteger mask = 0x00000001 << i; + if(typemask & (mask)) { + if(found>0) StringCat(exptypes,SQString::Create(_ss(this), _SC("|"), -1), exptypes); + found ++; + StringCat(exptypes,SQString::Create(_ss(this), IdType2Name((SQObjectType)mask), -1), exptypes); + } + } + Raise_Error(_SC("parameter %d has an invalid type '%s' ; expected: '%s'"), nparam, IdType2Name((SQObjectType)type), _stringval(exptypes)); +} diff --git a/squirrel/sqfuncproto.h b/squirrel/sqfuncproto.h new file mode 100644 index 0000000..cd48aa6 --- /dev/null +++ b/squirrel/sqfuncproto.h @@ -0,0 +1,154 @@ +/* see copyright notice in squirrel.h */ +#ifndef _SQFUNCTION_H_ +#define _SQFUNCTION_H_ + +#include "sqopcodes.h" + +enum SQOuterType { + otLOCAL = 0, + otOUTER = 1 +}; + +struct SQOuterVar +{ + + SQOuterVar(){} + SQOuterVar(const SQObjectPtr &name,const SQObjectPtr &src,SQOuterType t) + { + _name = name; + _src=src; + _type=t; + } + SQOuterVar(const SQOuterVar &ov) + { + _type=ov._type; + _src=ov._src; + _name=ov._name; + } + SQOuterType _type; + SQObjectPtr _name; + SQObjectPtr _src; +}; + +struct SQLocalVarInfo +{ + SQLocalVarInfo():_start_op(0),_end_op(0),_pos(0){} + SQLocalVarInfo(const SQLocalVarInfo &lvi) + { + _name=lvi._name; + _start_op=lvi._start_op; + _end_op=lvi._end_op; + _pos=lvi._pos; + } + SQObjectPtr _name; + SQUnsignedInteger _start_op; + SQUnsignedInteger _end_op; + SQUnsignedInteger _pos; +}; + +struct SQLineInfo { SQInteger _line;SQInteger _op; }; + +typedef sqvector SQOuterVarVec; +typedef sqvector SQLocalVarInfoVec; +typedef sqvector SQLineInfoVec; + +#define _FUNC_SIZE(ni,nl,nparams,nfuncs,nouters,nlineinf,localinf,defparams) (sizeof(SQFunctionProto) \ + +((ni-1)*sizeof(SQInstruction))+(nl*sizeof(SQObjectPtr)) \ + +(nparams*sizeof(SQObjectPtr))+(nfuncs*sizeof(SQObjectPtr)) \ + +(nouters*sizeof(SQOuterVar))+(nlineinf*sizeof(SQLineInfo)) \ + +(localinf*sizeof(SQLocalVarInfo))+(defparams*sizeof(SQInteger))) + + +struct SQFunctionProto : public CHAINABLE_OBJ +{ +private: + SQFunctionProto(SQSharedState *ss); + ~SQFunctionProto(); + +public: + static SQFunctionProto *Create(SQSharedState *ss,SQInteger ninstructions, + SQInteger nliterals,SQInteger nparameters, + SQInteger nfunctions,SQInteger noutervalues, + SQInteger nlineinfos,SQInteger nlocalvarinfos,SQInteger ndefaultparams) + { + SQFunctionProto *f; + //I compact the whole class and members in a single memory allocation + f = (SQFunctionProto *)sq_vm_malloc(_FUNC_SIZE(ninstructions,nliterals,nparameters,nfunctions,noutervalues,nlineinfos,nlocalvarinfos,ndefaultparams)); + new (f) SQFunctionProto(ss); + f->_ninstructions = ninstructions; + f->_literals = (SQObjectPtr*)&f->_instructions[ninstructions]; + f->_nliterals = nliterals; + f->_parameters = (SQObjectPtr*)&f->_literals[nliterals]; + f->_nparameters = nparameters; + f->_functions = (SQObjectPtr*)&f->_parameters[nparameters]; + f->_nfunctions = nfunctions; + f->_outervalues = (SQOuterVar*)&f->_functions[nfunctions]; + f->_noutervalues = noutervalues; + f->_lineinfos = (SQLineInfo *)&f->_outervalues[noutervalues]; + f->_nlineinfos = nlineinfos; + f->_localvarinfos = (SQLocalVarInfo *)&f->_lineinfos[nlineinfos]; + f->_nlocalvarinfos = nlocalvarinfos; + f->_defaultparams = (SQInteger *)&f->_localvarinfos[nlocalvarinfos]; + f->_ndefaultparams = ndefaultparams; + + _CONSTRUCT_VECTOR(SQObjectPtr,f->_nliterals,f->_literals); + _CONSTRUCT_VECTOR(SQObjectPtr,f->_nparameters,f->_parameters); + _CONSTRUCT_VECTOR(SQObjectPtr,f->_nfunctions,f->_functions); + _CONSTRUCT_VECTOR(SQOuterVar,f->_noutervalues,f->_outervalues); + //_CONSTRUCT_VECTOR(SQLineInfo,f->_nlineinfos,f->_lineinfos); //not required are 2 integers + _CONSTRUCT_VECTOR(SQLocalVarInfo,f->_nlocalvarinfos,f->_localvarinfos); + return f; + } + void Release(){ + _DESTRUCT_VECTOR(SQObjectPtr,_nliterals,_literals); + _DESTRUCT_VECTOR(SQObjectPtr,_nparameters,_parameters); + _DESTRUCT_VECTOR(SQObjectPtr,_nfunctions,_functions); + _DESTRUCT_VECTOR(SQOuterVar,_noutervalues,_outervalues); + //_DESTRUCT_VECTOR(SQLineInfo,_nlineinfos,_lineinfos); //not required are 2 integers + _DESTRUCT_VECTOR(SQLocalVarInfo,_nlocalvarinfos,_localvarinfos); + SQInteger size = _FUNC_SIZE(_ninstructions,_nliterals,_nparameters,_nfunctions,_noutervalues,_nlineinfos,_nlocalvarinfos,_ndefaultparams); + this->~SQFunctionProto(); + sq_vm_free(this,size); + } + + const SQChar* GetLocal(SQVM *v,SQUnsignedInteger stackbase,SQUnsignedInteger nseq,SQUnsignedInteger nop); + SQInteger GetLine(SQInstruction *curr); + bool Save(SQVM *v,SQUserPointer up,SQWRITEFUNC write); + static bool Load(SQVM *v,SQUserPointer up,SQREADFUNC read,SQObjectPtr &ret); +#ifndef NO_GARBAGE_COLLECTOR + void Mark(SQCollectable **chain); + void Finalize(){ _NULL_SQOBJECT_VECTOR(_literals,_nliterals); } + SQObjectType GetType() {return OT_FUNCPROTO;} +#endif + SQObjectPtr _sourcename; + SQObjectPtr _name; + SQInteger _stacksize; + bool _bgenerator; + SQInteger _varparams; + + SQInteger _nlocalvarinfos; + SQLocalVarInfo *_localvarinfos; + + SQInteger _nlineinfos; + SQLineInfo *_lineinfos; + + SQInteger _nliterals; + SQObjectPtr *_literals; + + SQInteger _nparameters; + SQObjectPtr *_parameters; + + SQInteger _nfunctions; + SQObjectPtr *_functions; + + SQInteger _noutervalues; + SQOuterVar *_outervalues; + + SQInteger _ndefaultparams; + SQInteger *_defaultparams; + + SQInteger _ninstructions; + SQInstruction _instructions[1]; +}; + +#endif //_SQFUNCTION_H_ diff --git a/squirrel/sqfuncstate.cpp b/squirrel/sqfuncstate.cpp new file mode 100644 index 0000000..b07380f --- /dev/null +++ b/squirrel/sqfuncstate.cpp @@ -0,0 +1,653 @@ +/* + see copyright notice in squirrel.h +*/ +#include "sqpcheader.h" +#ifndef NO_COMPILER +#include "sqcompiler.h" +#include "sqstring.h" +#include "sqfuncproto.h" +#include "sqtable.h" +#include "sqopcodes.h" +#include "sqfuncstate.h" + +#ifdef _DEBUG_DUMP +SQInstructionDesc g_InstrDesc[]={ + {_SC("_OP_LINE")}, + {_SC("_OP_LOAD")}, + {_SC("_OP_LOADINT")}, + {_SC("_OP_LOADFLOAT")}, + {_SC("_OP_DLOAD")}, + {_SC("_OP_TAILCALL")}, + {_SC("_OP_CALL")}, + {_SC("_OP_PREPCALL")}, + {_SC("_OP_PREPCALLK")}, + {_SC("_OP_GETK")}, + {_SC("_OP_MOVE")}, + {_SC("_OP_NEWSLOT")}, + {_SC("_OP_DELETE")}, + {_SC("_OP_SET")}, + {_SC("_OP_GET")}, + {_SC("_OP_EQ")}, + {_SC("_OP_NE")}, + {_SC("_OP_ADD")}, + {_SC("_OP_SUB")}, + {_SC("_OP_MUL")}, + {_SC("_OP_DIV")}, + {_SC("_OP_MOD")}, + {_SC("_OP_BITW")}, + {_SC("_OP_RETURN")}, + {_SC("_OP_LOADNULLS")}, + {_SC("_OP_LOADROOT")}, + {_SC("_OP_LOADBOOL")}, + {_SC("_OP_DMOVE")}, + {_SC("_OP_JMP")}, + {_SC("_OP_JCMP")}, + {_SC("_OP_JZ")}, + {_SC("_OP_SETOUTER")}, + {_SC("_OP_GETOUTER")}, + {_SC("_OP_NEWOBJ")}, + {_SC("_OP_APPENDARRAY")}, + {_SC("_OP_COMPARITH")}, + {_SC("_OP_INC")}, + {_SC("_OP_INCL")}, + {_SC("_OP_PINC")}, + {_SC("_OP_PINCL")}, + {_SC("_OP_CMP")}, + {_SC("_OP_EXISTS")}, + {_SC("_OP_INSTANCEOF")}, + {_SC("_OP_AND")}, + {_SC("_OP_OR")}, + {_SC("_OP_NEG")}, + {_SC("_OP_NOT")}, + {_SC("_OP_BWNOT")}, + {_SC("_OP_CLOSURE")}, + {_SC("_OP_YIELD")}, + {_SC("_OP_RESUME")}, + {_SC("_OP_FOREACH")}, + {_SC("_OP_POSTFOREACH")}, + {_SC("_OP_CLONE")}, + {_SC("_OP_TYPEOF")}, + {_SC("_OP_PUSHTRAP")}, + {_SC("_OP_POPTRAP")}, + {_SC("_OP_THROW")}, + {_SC("_OP_NEWSLOTA")}, + {_SC("_OP_GETBASE")}, + {_SC("_OP_CLOSE")}, +}; +#endif +void DumpLiteral(SQObjectPtr &o) +{ + switch(type(o)){ + case OT_STRING: scprintf(_SC("\"%s\""),_stringval(o));break; + case OT_FLOAT: scprintf(_SC("{%f}"),_float(o));break; + case OT_INTEGER: scprintf(_SC("{") _PRINT_INT_FMT _SC("}"),_integer(o));break; + case OT_BOOL: scprintf(_SC("%s"),_integer(o)?_SC("true"):_SC("false"));break; + default: scprintf(_SC("(%s %p)"),GetTypeName(o),(void*)_rawval(o));break; break; //shut up compiler + } +} + +SQFuncState::SQFuncState(SQSharedState *ss,SQFuncState *parent,CompilerErrorFunc efunc,void *ed) +{ + _nliterals = 0; + _literals = SQTable::Create(ss,0); + _strings = SQTable::Create(ss,0); + _sharedstate = ss; + _lastline = 0; + _optimization = true; + _parent = parent; + _stacksize = 0; + _traps = 0; + _returnexp = 0; + _varparams = false; + _errfunc = efunc; + _errtarget = ed; + _bgenerator = false; + _outers = 0; + _ss = ss; + +} + +void SQFuncState::Error(const SQChar *err) +{ + _errfunc(_errtarget,err); +} + +#ifdef _DEBUG_DUMP +void SQFuncState::Dump(SQFunctionProto *func) +{ + SQUnsignedInteger n=0,i; + SQInteger si; + scprintf(_SC("SQInstruction sizeof %d\n"),sizeof(SQInstruction)); + scprintf(_SC("SQObject sizeof %d\n"),sizeof(SQObject)); + scprintf(_SC("--------------------------------------------------------------------\n")); + scprintf(_SC("*****FUNCTION [%s]\n"),type(func->_name)==OT_STRING?_stringval(func->_name):_SC("unknown")); + scprintf(_SC("-----LITERALS\n")); + SQObjectPtr refidx,key,val; + SQInteger idx; + SQObjectPtrVec templiterals; + templiterals.resize(_nliterals); + while((idx=_table(_literals)->Next(false,refidx,key,val))!=-1) { + refidx=idx; + templiterals[_integer(val)]=key; + } + for(i=0;i>\n")); + n=0; + for(i=0;i<_parameters.size();i++){ + scprintf(_SC("[%d] "),n); + DumpLiteral(_parameters[i]); + scprintf(_SC("\n")); + n++; + } + scprintf(_SC("-----LOCALS\n")); + for(si=0;si_nlocalvarinfos;si++){ + SQLocalVarInfo lvi=func->_localvarinfos[si]; + scprintf(_SC("[%d] %s \t%d %d\n"),lvi._pos,_stringval(lvi._name),lvi._start_op,lvi._end_op); + n++; + } + scprintf(_SC("-----LINE INFO\n")); + for(i=0;i<_lineinfos.size();i++){ + SQLineInfo li=_lineinfos[i]; + scprintf(_SC("op [%d] line [%d] \n"),li._op,li._line); + n++; + } + scprintf(_SC("-----dump\n")); + n=0; + for(i=0;i<_instructions.size();i++){ + SQInstruction &inst=_instructions[i]; + if(inst.op==_OP_LOAD || inst.op==_OP_DLOAD || inst.op==_OP_PREPCALLK || inst.op==_OP_GETK ){ + + SQInteger lidx = inst._arg1; + scprintf(_SC("[%03d] %15s %d "),n,g_InstrDesc[inst.op].name,inst._arg0); + if(lidx >= 0xFFFFFFFF) + scprintf(_SC("null")); + else { + SQInteger refidx; + SQObjectPtr val,key,refo; + while(((refidx=_table(_literals)->Next(false,refo,key,val))!= -1) && (_integer(val) != lidx)) { + refo = refidx; + } + DumpLiteral(key); + } + if(inst.op != _OP_DLOAD) { + scprintf(_SC(" %d %d \n"),inst._arg2,inst._arg3); + } + else { + scprintf(_SC(" %d "),inst._arg2); + lidx = inst._arg3; + if(lidx >= 0xFFFFFFFF) + scprintf(_SC("null")); + else { + SQInteger refidx; + SQObjectPtr val,key,refo; + while(((refidx=_table(_literals)->Next(false,refo,key,val))!= -1) && (_integer(val) != lidx)) { + refo = refidx; + } + DumpLiteral(key); + scprintf(_SC("\n")); + } + } + } + else if(inst.op==_OP_LOADFLOAT) { + scprintf(_SC("[%03d] %15s %d %f %d %d\n"),n,g_InstrDesc[inst.op].name,inst._arg0,*((SQFloat*)&inst._arg1),inst._arg2,inst._arg3); + } + /* else if(inst.op==_OP_ARITH){ + scprintf(_SC("[%03d] %15s %d %d %d %c\n"),n,g_InstrDesc[inst.op].name,inst._arg0,inst._arg1,inst._arg2,inst._arg3); + }*/ + else { + scprintf(_SC("[%03d] %15s %d %d %d %d\n"),n,g_InstrDesc[inst.op].name,inst._arg0,inst._arg1,inst._arg2,inst._arg3); + } + n++; + } + scprintf(_SC("-----\n")); + scprintf(_SC("stack size[%d]\n"),func->_stacksize); + scprintf(_SC("--------------------------------------------------------------------\n\n")); +} +#endif + +SQInteger SQFuncState::GetNumericConstant(const SQInteger cons) +{ + return GetConstant(SQObjectPtr(cons)); +} + +SQInteger SQFuncState::GetNumericConstant(const SQFloat cons) +{ + return GetConstant(SQObjectPtr(cons)); +} + +SQInteger SQFuncState::GetConstant(const SQObject &cons) +{ + SQObjectPtr val; + if(!_table(_literals)->Get(cons,val)) + { + val = _nliterals; + _table(_literals)->NewSlot(cons,val); + _nliterals++; + if(_nliterals > MAX_LITERALS) { + val.Null(); + Error(_SC("internal compiler error: too many literals")); + } + } + return _integer(val); +} + +void SQFuncState::SetIntructionParams(SQInteger pos,SQInteger arg0,SQInteger arg1,SQInteger arg2,SQInteger arg3) +{ + _instructions[pos]._arg0=(unsigned char)*((SQUnsignedInteger *)&arg0); + _instructions[pos]._arg1=(SQInt32)*((SQUnsignedInteger *)&arg1); + _instructions[pos]._arg2=(unsigned char)*((SQUnsignedInteger *)&arg2); + _instructions[pos]._arg3=(unsigned char)*((SQUnsignedInteger *)&arg3); +} + +void SQFuncState::SetIntructionParam(SQInteger pos,SQInteger arg,SQInteger val) +{ + switch(arg){ + case 0:_instructions[pos]._arg0=(unsigned char)*((SQUnsignedInteger *)&val);break; + case 1:case 4:_instructions[pos]._arg1=(SQInt32)*((SQUnsignedInteger *)&val);break; + case 2:_instructions[pos]._arg2=(unsigned char)*((SQUnsignedInteger *)&val);break; + case 3:_instructions[pos]._arg3=(unsigned char)*((SQUnsignedInteger *)&val);break; + }; +} + +SQInteger SQFuncState::AllocStackPos() +{ + SQInteger npos=_vlocals.size(); + _vlocals.push_back(SQLocalVarInfo()); + if(_vlocals.size()>((SQUnsignedInteger)_stacksize)) { + if(_stacksize>MAX_FUNC_STACKSIZE) Error(_SC("internal compiler error: too many locals")); + _stacksize=_vlocals.size(); + } + return npos; +} + +SQInteger SQFuncState::PushTarget(SQInteger n) +{ + if(n!=-1){ + _targetstack.push_back(n); + return n; + } + n=AllocStackPos(); + _targetstack.push_back(n); + return n; +} + +SQInteger SQFuncState::GetUpTarget(SQInteger n){ + return _targetstack[((_targetstack.size()-1)-n)]; +} + +SQInteger SQFuncState::TopTarget(){ + return _targetstack.back(); +} +SQInteger SQFuncState::PopTarget() +{ + SQUnsignedInteger npos=_targetstack.back(); + assert(npos < _vlocals.size()); + SQLocalVarInfo &t = _vlocals[npos]; + if(type(t._name)==OT_NULL){ + _vlocals.pop_back(); + } + _targetstack.pop_back(); + return npos; +} + +SQInteger SQFuncState::GetStackSize() +{ + return _vlocals.size(); +} + +SQInteger SQFuncState::CountOuters(SQInteger stacksize) +{ + SQInteger outers = 0; + SQInteger k = _vlocals.size() - 1; + while(k >= stacksize) { + SQLocalVarInfo &lvi = _vlocals[k]; + k--; + if(lvi._end_op == UINT_MINUS_ONE) { //this means is an outer + outers++; + } + } + return outers; +} + +void SQFuncState::SetStackSize(SQInteger n) +{ + SQInteger size=_vlocals.size(); + while(size>n){ + size--; + SQLocalVarInfo lvi = _vlocals.back(); + if(type(lvi._name)!=OT_NULL){ + if(lvi._end_op == UINT_MINUS_ONE) { //this means is an outer + _outers--; + } + lvi._end_op = GetCurrentPos(); + _localvarinfos.push_back(lvi); + } + _vlocals.pop_back(); + } +} + +bool SQFuncState::IsConstant(const SQObject &name,SQObject &e) +{ + SQObjectPtr val; + if(_table(_sharedstate->_consts)->Get(name,val)) { + e = val; + return true; + } + return false; +} + +bool SQFuncState::IsLocal(SQUnsignedInteger stkpos) +{ + if(stkpos>=_vlocals.size())return false; + else if(type(_vlocals[stkpos]._name)!=OT_NULL)return true; + return false; +} + +SQInteger SQFuncState::PushLocalVariable(const SQObject &name) +{ + SQInteger pos=_vlocals.size(); + SQLocalVarInfo lvi; + lvi._name=name; + lvi._start_op=GetCurrentPos()+1; + lvi._pos=_vlocals.size(); + _vlocals.push_back(lvi); + if(_vlocals.size()>((SQUnsignedInteger)_stacksize))_stacksize=_vlocals.size(); + return pos; +} + + + +SQInteger SQFuncState::GetLocalVariable(const SQObject &name) +{ + SQInteger locals=_vlocals.size(); + while(locals>=1){ + SQLocalVarInfo &lvi = _vlocals[locals-1]; + if(type(lvi._name)==OT_STRING && _string(lvi._name)==_string(name)){ + return locals-1; + } + locals--; + } + return -1; +} + +void SQFuncState::MarkLocalAsOuter(SQInteger pos) +{ + SQLocalVarInfo &lvi = _vlocals[pos]; + lvi._end_op = UINT_MINUS_ONE; + _outers++; +} + +SQInteger SQFuncState::GetOuterVariable(const SQObject &name) +{ + SQInteger outers = _outervalues.size(); + for(SQInteger i = 0; iGetLocalVariable(name); + if(pos == -1) { + pos = _parent->GetOuterVariable(name); + if(pos != -1) { + _outervalues.push_back(SQOuterVar(name,SQObjectPtr(SQInteger(pos)),otOUTER)); //local + return _outervalues.size() - 1; + } + } + else { + _parent->MarkLocalAsOuter(pos); + _outervalues.push_back(SQOuterVar(name,SQObjectPtr(SQInteger(pos)),otLOCAL)); //local + return _outervalues.size() - 1; + + + } + } + return -1; +} + +void SQFuncState::AddParameter(const SQObject &name) +{ + PushLocalVariable(name); + _parameters.push_back(name); +} + +void SQFuncState::AddLineInfos(SQInteger line,bool lineop,bool force) +{ + if(_lastline!=line || force){ + SQLineInfo li; + li._line=line;li._op=(GetCurrentPos()+1); + if(lineop)AddInstruction(_OP_LINE,0,line); + if(_lastline!=line) { + _lineinfos.push_back(li); + } + _lastline=line; + } +} + +void SQFuncState::DiscardTarget() +{ + SQInteger discardedtarget = PopTarget(); + SQInteger size = _instructions.size(); + if(size > 0 && _optimization){ + SQInstruction &pi = _instructions[size-1];//previous instruction + switch(pi.op) { + case _OP_SET:case _OP_NEWSLOT:case _OP_SETOUTER:case _OP_CALL: + if(pi._arg0 == discardedtarget) { + pi._arg0 = 0xFF; + } + } + } +} + +void SQFuncState::AddInstruction(SQInstruction &i) +{ + SQInteger size = _instructions.size(); + if(size > 0 && _optimization){ //simple optimizer + SQInstruction &pi = _instructions[size-1];//previous instruction + switch(i.op) { + case _OP_JZ: + if( pi.op == _OP_CMP && pi._arg1 < 0xFF) { + pi.op = _OP_JCMP; + pi._arg0 = (unsigned char)pi._arg1; + pi._arg1 = i._arg1; + return; + } + break; + case _OP_SET: + case _OP_NEWSLOT: + if(i._arg0 == i._arg3) { + i._arg0 = 0xFF; + } + break; + case _OP_SETOUTER: + if(i._arg0 == i._arg2) { + i._arg0 = 0xFF; + } + break; + case _OP_RETURN: + if( _parent && i._arg0 != MAX_FUNC_STACKSIZE && pi.op == _OP_CALL && _returnexp < size-1) { + pi.op = _OP_TAILCALL; + } else if(pi.op == _OP_CLOSE){ + pi = i; + return; + } + break; + case _OP_GET: + if( pi.op == _OP_LOAD && pi._arg0 == i._arg2 && (!IsLocal(pi._arg0))){ + pi._arg1 = pi._arg1; + pi._arg2 = (unsigned char)i._arg1; + pi.op = _OP_GETK; + pi._arg0 = i._arg0; + + return; + } + break; + case _OP_PREPCALL: + if( pi.op == _OP_LOAD && pi._arg0 == i._arg1 && (!IsLocal(pi._arg0))){ + pi.op = _OP_PREPCALLK; + pi._arg0 = i._arg0; + pi._arg1 = pi._arg1; + pi._arg2 = i._arg2; + pi._arg3 = i._arg3; + return; + } + break; + case _OP_APPENDARRAY: { + SQInteger aat = -1; + switch(pi.op) { + case _OP_LOAD: aat = AAT_LITERAL; break; + case _OP_LOADINT: aat = AAT_INT; break; + case _OP_LOADBOOL: aat = AAT_BOOL; break; + case _OP_LOADFLOAT: aat = AAT_FLOAT; break; + default: break; + } + if(aat != -1 && pi._arg0 == i._arg1 && (!IsLocal(pi._arg0))){ + pi.op = _OP_APPENDARRAY; + pi._arg0 = i._arg0; + pi._arg1 = pi._arg1; + pi._arg2 = (unsigned char)aat; + pi._arg3 = MAX_FUNC_STACKSIZE; + return; + } + } + break; + case _OP_MOVE: + switch(pi.op) { + case _OP_GET: case _OP_ADD: case _OP_SUB: case _OP_MUL: case _OP_DIV: case _OP_MOD: case _OP_BITW: + case _OP_LOADINT: case _OP_LOADFLOAT: case _OP_LOADBOOL: case _OP_LOAD: + + if(pi._arg0 == i._arg1) + { + pi._arg0 = i._arg0; + _optimization = false; + //_result_elimination = false; + return; + } + } + + if(pi.op == _OP_MOVE) + { + pi.op = _OP_DMOVE; + pi._arg2 = i._arg0; + pi._arg3 = (unsigned char)i._arg1; + return; + } + break; + case _OP_LOAD: + if(pi.op == _OP_LOAD && i._arg1 < 256) { + pi.op = _OP_DLOAD; + pi._arg2 = i._arg0; + pi._arg3 = (unsigned char)i._arg1; + return; + } + break; + case _OP_EQ:case _OP_NE: + if(pi.op == _OP_LOAD && pi._arg0 == i._arg1 && (!IsLocal(pi._arg0) )) + { + pi.op = i.op; + pi._arg0 = i._arg0; + pi._arg1 = pi._arg1; + pi._arg2 = i._arg2; + pi._arg3 = MAX_FUNC_STACKSIZE; + return; + } + break; + case _OP_LOADNULLS: + if((pi.op == _OP_LOADNULLS && pi._arg0+pi._arg1 == i._arg0)) { + + pi._arg1 = pi._arg1 + 1; + pi.op = _OP_LOADNULLS; + return; + } + break; + case _OP_LINE: + if(pi.op == _OP_LINE) { + _instructions.pop_back(); + _lineinfos.pop_back(); + } + break; + } + } + _optimization = true; + _instructions.push_back(i); +} + +SQObject SQFuncState::CreateString(const SQChar *s,SQInteger len) +{ + SQObjectPtr ns(SQString::Create(_sharedstate,s,len)); + _table(_strings)->NewSlot(ns,(SQInteger)1); + return ns; +} + +SQObject SQFuncState::CreateTable() +{ + SQObjectPtr nt(SQTable::Create(_sharedstate,0)); + _table(_strings)->NewSlot(nt,(SQInteger)1); + return nt; +} + +SQFunctionProto *SQFuncState::BuildProto() +{ + + SQFunctionProto *f=SQFunctionProto::Create(_ss,_instructions.size(), + _nliterals,_parameters.size(),_functions.size(),_outervalues.size(), + _lineinfos.size(),_localvarinfos.size(),_defaultparams.size()); + + SQObjectPtr refidx,key,val; + SQInteger idx; + + f->_stacksize = _stacksize; + f->_sourcename = _sourcename; + f->_bgenerator = _bgenerator; + f->_name = _name; + + while((idx=_table(_literals)->Next(false,refidx,key,val))!=-1) { + f->_literals[_integer(val)]=key; + refidx=idx; + } + + for(SQUnsignedInteger nf = 0; nf < _functions.size(); nf++) f->_functions[nf] = _functions[nf]; + for(SQUnsignedInteger np = 0; np < _parameters.size(); np++) f->_parameters[np] = _parameters[np]; + for(SQUnsignedInteger no = 0; no < _outervalues.size(); no++) f->_outervalues[no] = _outervalues[no]; + for(SQUnsignedInteger nl = 0; nl < _localvarinfos.size(); nl++) f->_localvarinfos[nl] = _localvarinfos[nl]; + for(SQUnsignedInteger ni = 0; ni < _lineinfos.size(); ni++) f->_lineinfos[ni] = _lineinfos[ni]; + for(SQUnsignedInteger nd = 0; nd < _defaultparams.size(); nd++) f->_defaultparams[nd] = _defaultparams[nd]; + + memcpy(f->_instructions,&_instructions[0],_instructions.size()*sizeof(SQInstruction)); + + f->_varparams = _varparams; + + return f; +} + +SQFuncState *SQFuncState::PushChildState(SQSharedState *ss) +{ + SQFuncState *child = (SQFuncState *)sq_malloc(sizeof(SQFuncState)); + new (child) SQFuncState(ss,this,_errfunc,_errtarget); + _childstates.push_back(child); + return child; +} + +void SQFuncState::PopChildState() +{ + SQFuncState *child = _childstates.back(); + sq_delete(child,SQFuncState); + _childstates.pop_back(); +} + +SQFuncState::~SQFuncState() +{ + while(_childstates.size() > 0) + { + PopChildState(); + } +} + +#endif diff --git a/squirrel/sqfuncstate.h b/squirrel/sqfuncstate.h new file mode 100644 index 0000000..1da1321 --- /dev/null +++ b/squirrel/sqfuncstate.h @@ -0,0 +1,91 @@ +/* see copyright notice in squirrel.h */ +#ifndef _SQFUNCSTATE_H_ +#define _SQFUNCSTATE_H_ +/////////////////////////////////// +#include "squtils.h" + +struct SQFuncState +{ + SQFuncState(SQSharedState *ss,SQFuncState *parent,CompilerErrorFunc efunc,void *ed); + ~SQFuncState(); +#ifdef _DEBUG_DUMP + void Dump(SQFunctionProto *func); +#endif + void Error(const SQChar *err); + SQFuncState *PushChildState(SQSharedState *ss); + void PopChildState(); + void AddInstruction(SQOpcode _op,SQInteger arg0=0,SQInteger arg1=0,SQInteger arg2=0,SQInteger arg3=0){SQInstruction i(_op,arg0,arg1,arg2,arg3);AddInstruction(i);} + void AddInstruction(SQInstruction &i); + void SetIntructionParams(SQInteger pos,SQInteger arg0,SQInteger arg1,SQInteger arg2=0,SQInteger arg3=0); + void SetIntructionParam(SQInteger pos,SQInteger arg,SQInteger val); + SQInstruction &GetInstruction(SQInteger pos){return _instructions[pos];} + void PopInstructions(SQInteger size){for(SQInteger i=0;i _childstates; + SQInteger GetConstant(const SQObject &cons); +private: + CompilerErrorFunc _errfunc; + void *_errtarget; + SQSharedState *_ss; +}; + + +#endif //_SQFUNCSTATE_H_ + diff --git a/squirrel/sqlexer.cpp b/squirrel/sqlexer.cpp new file mode 100644 index 0000000..0771202 --- /dev/null +++ b/squirrel/sqlexer.cpp @@ -0,0 +1,491 @@ +/* + see copyright notice in squirrel.h +*/ +#include "sqpcheader.h" +#include +#include +#include "sqtable.h" +#include "sqstring.h" +#include "sqcompiler.h" +#include "sqlexer.h" + +#define CUR_CHAR (_currdata) +#define RETURN_TOKEN(t) { _prevtoken = _curtoken; _curtoken = t; return t;} +#define IS_EOB() (CUR_CHAR <= SQUIRREL_EOB) +#define NEXT() {Next();_currentcolumn++;} +#define INIT_TEMP_STRING() { _longstr.resize(0);} +#define APPEND_CHAR(c) { _longstr.push_back(c);} +#define TERMINATE_BUFFER() {_longstr.push_back(_SC('\0'));} +#define ADD_KEYWORD(key,id) _keywords->NewSlot( SQString::Create(ss, _SC(#key)) ,SQInteger(id)) + +SQLexer::SQLexer(){} +SQLexer::~SQLexer() +{ + _keywords->Release(); +} + +void SQLexer::Init(SQSharedState *ss, SQLEXREADFUNC rg, SQUserPointer up,CompilerErrorFunc efunc,void *ed) +{ + _errfunc = efunc; + _errtarget = ed; + _sharedstate = ss; + _keywords = SQTable::Create(ss, 37); + ADD_KEYWORD(while, TK_WHILE); + ADD_KEYWORD(do, TK_DO); + ADD_KEYWORD(if, TK_IF); + ADD_KEYWORD(else, TK_ELSE); + ADD_KEYWORD(break, TK_BREAK); + ADD_KEYWORD(continue, TK_CONTINUE); + ADD_KEYWORD(return, TK_RETURN); + ADD_KEYWORD(null, TK_NULL); + ADD_KEYWORD(function, TK_FUNCTION); + ADD_KEYWORD(local, TK_LOCAL); + ADD_KEYWORD(for, TK_FOR); + ADD_KEYWORD(foreach, TK_FOREACH); + ADD_KEYWORD(in, TK_IN); + ADD_KEYWORD(typeof, TK_TYPEOF); + ADD_KEYWORD(base, TK_BASE); + ADD_KEYWORD(delete, TK_DELETE); + ADD_KEYWORD(try, TK_TRY); + ADD_KEYWORD(catch, TK_CATCH); + ADD_KEYWORD(throw, TK_THROW); + ADD_KEYWORD(clone, TK_CLONE); + ADD_KEYWORD(yield, TK_YIELD); + ADD_KEYWORD(resume, TK_RESUME); + ADD_KEYWORD(switch, TK_SWITCH); + ADD_KEYWORD(case, TK_CASE); + ADD_KEYWORD(default, TK_DEFAULT); + ADD_KEYWORD(this, TK_THIS); + ADD_KEYWORD(class,TK_CLASS); + ADD_KEYWORD(extends,TK_EXTENDS); + ADD_KEYWORD(constructor,TK_CONSTRUCTOR); + ADD_KEYWORD(instanceof,TK_INSTANCEOF); + ADD_KEYWORD(true,TK_TRUE); + ADD_KEYWORD(false,TK_FALSE); + ADD_KEYWORD(static,TK_STATIC); + ADD_KEYWORD(enum,TK_ENUM); + ADD_KEYWORD(const,TK_CONST); + ADD_KEYWORD(__LINE__,TK___LINE__); + ADD_KEYWORD(__FILE__,TK___FILE__); + + _readf = rg; + _up = up; + _lasttokenline = _currentline = 1; + _currentcolumn = 0; + _prevtoken = -1; + _reached_eof = SQFalse; + Next(); +} + +void SQLexer::Error(const SQChar *err) +{ + _errfunc(_errtarget,err); +} + +void SQLexer::Next() +{ + SQInteger t = _readf(_up); + if(t > MAX_CHAR) Error(_SC("Invalid character")); + if(t != 0) { + _currdata = (LexChar)t; + return; + } + _currdata = SQUIRREL_EOB; + _reached_eof = SQTrue; +} + +const SQChar *SQLexer::Tok2Str(SQInteger tok) +{ + SQObjectPtr itr, key, val; + SQInteger nitr; + while((nitr = _keywords->Next(false,itr, key, val)) != -1) { + itr = (SQInteger)nitr; + if(((SQInteger)_integer(val)) == tok) + return _stringval(key); + } + return NULL; +} + +void SQLexer::LexBlockComment() +{ + bool done = false; + while(!done) { + switch(CUR_CHAR) { + case _SC('*'): { NEXT(); if(CUR_CHAR == _SC('/')) { done = true; NEXT(); }}; continue; + case _SC('\n'): _currentline++; NEXT(); continue; + case SQUIRREL_EOB: Error(_SC("missing \"*/\" in comment")); + default: NEXT(); + } + } +} +void SQLexer::LexLineComment() +{ + do { NEXT(); } while (CUR_CHAR != _SC('\n') && (!IS_EOB())); +} + +SQInteger SQLexer::Lex() +{ + _lasttokenline = _currentline; + while(CUR_CHAR != SQUIRREL_EOB) { + switch(CUR_CHAR){ + case _SC('\t'): case _SC('\r'): case _SC(' '): NEXT(); continue; + case _SC('\n'): + _currentline++; + _prevtoken=_curtoken; + _curtoken=_SC('\n'); + NEXT(); + _currentcolumn=1; + continue; + case _SC('#'): LexLineComment(); continue; + case _SC('/'): + NEXT(); + switch(CUR_CHAR){ + case _SC('*'): + NEXT(); + LexBlockComment(); + continue; + case _SC('/'): + LexLineComment(); + continue; + case _SC('='): + NEXT(); + RETURN_TOKEN(TK_DIVEQ); + continue; + case _SC('>'): + NEXT(); + RETURN_TOKEN(TK_ATTR_CLOSE); + continue; + default: + RETURN_TOKEN('/'); + } + case _SC('='): + NEXT(); + if (CUR_CHAR != _SC('=')){ RETURN_TOKEN('=') } + else { NEXT(); RETURN_TOKEN(TK_EQ); } + case _SC('<'): + NEXT(); + switch(CUR_CHAR) { + case _SC('='): + NEXT(); + if(CUR_CHAR == _SC('>')) { + NEXT(); + RETURN_TOKEN(TK_3WAYSCMP); + } + RETURN_TOKEN(TK_LE) + break; + case _SC('-'): NEXT(); RETURN_TOKEN(TK_NEWSLOT); break; + case _SC('<'): NEXT(); RETURN_TOKEN(TK_SHIFTL); break; + case _SC('/'): NEXT(); RETURN_TOKEN(TK_ATTR_OPEN); break; + } + RETURN_TOKEN('<'); + case _SC('>'): + NEXT(); + if (CUR_CHAR == _SC('=')){ NEXT(); RETURN_TOKEN(TK_GE);} + else if(CUR_CHAR == _SC('>')){ + NEXT(); + if(CUR_CHAR == _SC('>')){ + NEXT(); + RETURN_TOKEN(TK_USHIFTR); + } + RETURN_TOKEN(TK_SHIFTR); + } + else { RETURN_TOKEN('>') } + case _SC('!'): + NEXT(); + if (CUR_CHAR != _SC('=')){ RETURN_TOKEN('!')} + else { NEXT(); RETURN_TOKEN(TK_NE); } + case _SC('@'): { + SQInteger stype; + NEXT(); + if(CUR_CHAR != _SC('"')) { + RETURN_TOKEN('@'); + } + if((stype=ReadString('"',true))!=-1) { + RETURN_TOKEN(stype); + } + Error(_SC("error parsing the string")); + } + case _SC('"'): + case _SC('\''): { + SQInteger stype; + if((stype=ReadString(CUR_CHAR,false))!=-1){ + RETURN_TOKEN(stype); + } + Error(_SC("error parsing the string")); + } + case _SC('{'): case _SC('}'): case _SC('('): case _SC(')'): case _SC('['): case _SC(']'): + case _SC(';'): case _SC(','): case _SC('?'): case _SC('^'): case _SC('~'): + {SQInteger ret = CUR_CHAR; + NEXT(); RETURN_TOKEN(ret); } + case _SC('.'): + NEXT(); + if (CUR_CHAR != _SC('.')){ RETURN_TOKEN('.') } + NEXT(); + if (CUR_CHAR != _SC('.')){ Error(_SC("invalid token '..'")); } + NEXT(); + RETURN_TOKEN(TK_VARPARAMS); + case _SC('&'): + NEXT(); + if (CUR_CHAR != _SC('&')){ RETURN_TOKEN('&') } + else { NEXT(); RETURN_TOKEN(TK_AND); } + case _SC('|'): + NEXT(); + if (CUR_CHAR != _SC('|')){ RETURN_TOKEN('|') } + else { NEXT(); RETURN_TOKEN(TK_OR); } + case _SC(':'): + NEXT(); + if (CUR_CHAR != _SC(':')){ RETURN_TOKEN(':') } + else { NEXT(); RETURN_TOKEN(TK_DOUBLE_COLON); } + case _SC('*'): + NEXT(); + if (CUR_CHAR == _SC('=')){ NEXT(); RETURN_TOKEN(TK_MULEQ);} + else RETURN_TOKEN('*'); + case _SC('%'): + NEXT(); + if (CUR_CHAR == _SC('=')){ NEXT(); RETURN_TOKEN(TK_MODEQ);} + else RETURN_TOKEN('%'); + case _SC('-'): + NEXT(); + if (CUR_CHAR == _SC('=')){ NEXT(); RETURN_TOKEN(TK_MINUSEQ);} + else if (CUR_CHAR == _SC('-')){ NEXT(); RETURN_TOKEN(TK_MINUSMINUS);} + else RETURN_TOKEN('-'); + case _SC('+'): + NEXT(); + if (CUR_CHAR == _SC('=')){ NEXT(); RETURN_TOKEN(TK_PLUSEQ);} + else if (CUR_CHAR == _SC('+')){ NEXT(); RETURN_TOKEN(TK_PLUSPLUS);} + else RETURN_TOKEN('+'); + case SQUIRREL_EOB: + return 0; + default:{ + if (scisdigit(CUR_CHAR)) { + SQInteger ret = ReadNumber(); + RETURN_TOKEN(ret); + } + else if (scisalpha(CUR_CHAR) || CUR_CHAR == _SC('_')) { + SQInteger t = ReadID(); + RETURN_TOKEN(t); + } + else { + SQInteger c = CUR_CHAR; + if (sciscntrl((int)c)) Error(_SC("unexpected character(control)")); + NEXT(); + RETURN_TOKEN(c); + } + RETURN_TOKEN(0); + } + } + } + return 0; +} + +SQInteger SQLexer::GetIDType(const SQChar *s,SQInteger len) +{ + SQObjectPtr t; + if(_keywords->GetStr(s,len, t)) { + return SQInteger(_integer(t)); + } + return TK_IDENTIFIER; +} + + +SQInteger SQLexer::ReadString(SQInteger ndelim,bool verbatim) +{ + INIT_TEMP_STRING(); + NEXT(); + if(IS_EOB()) return -1; + for(;;) { + while(CUR_CHAR != ndelim) { + switch(CUR_CHAR) { + case SQUIRREL_EOB: + Error(_SC("unfinished string")); + return -1; + case _SC('\n'): + if(!verbatim) Error(_SC("newline in a constant")); + APPEND_CHAR(CUR_CHAR); NEXT(); + _currentline++; + break; + case _SC('\\'): + if(verbatim) { + APPEND_CHAR('\\'); NEXT(); + } + else { + NEXT(); + switch(CUR_CHAR) { + case _SC('x'): NEXT(); { + if(!isxdigit(CUR_CHAR)) Error(_SC("hexadecimal number expected")); + const SQInteger maxdigits = 4; + SQChar temp[maxdigits+1]; + SQInteger n = 0; + while(isxdigit(CUR_CHAR) && n < maxdigits) { + temp[n] = CUR_CHAR; + n++; + NEXT(); + } + temp[n] = 0; + SQChar *sTemp; + APPEND_CHAR((SQChar)scstrtoul(temp,&sTemp,16)); + } + break; + case _SC('t'): APPEND_CHAR(_SC('\t')); NEXT(); break; + case _SC('a'): APPEND_CHAR(_SC('\a')); NEXT(); break; + case _SC('b'): APPEND_CHAR(_SC('\b')); NEXT(); break; + case _SC('n'): APPEND_CHAR(_SC('\n')); NEXT(); break; + case _SC('r'): APPEND_CHAR(_SC('\r')); NEXT(); break; + case _SC('v'): APPEND_CHAR(_SC('\v')); NEXT(); break; + case _SC('f'): APPEND_CHAR(_SC('\f')); NEXT(); break; + case _SC('0'): APPEND_CHAR(_SC('\0')); NEXT(); break; + case _SC('\\'): APPEND_CHAR(_SC('\\')); NEXT(); break; + case _SC('"'): APPEND_CHAR(_SC('"')); NEXT(); break; + case _SC('\''): APPEND_CHAR(_SC('\'')); NEXT(); break; + default: + Error(_SC("unrecognised escaper char")); + break; + } + } + break; + default: + APPEND_CHAR(CUR_CHAR); + NEXT(); + } + } + NEXT(); + if(verbatim && CUR_CHAR == '"') { //double quotation + APPEND_CHAR(CUR_CHAR); + NEXT(); + } + else { + break; + } + } + TERMINATE_BUFFER(); + SQInteger len = _longstr.size()-1; + if(ndelim == _SC('\'')) { + if(len == 0) Error(_SC("empty constant")); + if(len > 1) Error(_SC("constant too long")); + _nvalue = _longstr[0]; + return TK_INTEGER; + } + _svalue = &_longstr[0]; + return TK_STRING_LITERAL; +} + +void LexHexadecimal(const SQChar *s,SQUnsignedInteger *res) +{ + *res = 0; + while(*s != 0) + { + if(scisdigit(*s)) *res = (*res)*16+((*s++)-'0'); + else if(scisxdigit(*s)) *res = (*res)*16+(toupper(*s++)-'A'+10); + else { assert(0); } + } +} + +void LexInteger(const SQChar *s,SQUnsignedInteger *res) +{ + *res = 0; + while(*s != 0) + { + *res = (*res)*10+((*s++)-'0'); + } +} + +SQInteger scisodigit(SQInteger c) { return c >= _SC('0') && c <= _SC('7'); } + +void LexOctal(const SQChar *s,SQUnsignedInteger *res) +{ + *res = 0; + while(*s != 0) + { + if(scisodigit(*s)) *res = (*res)*8+((*s++)-'0'); + else { assert(0); } + } +} + +SQInteger isexponent(SQInteger c) { return c == 'e' || c=='E'; } + + +#define MAX_HEX_DIGITS (sizeof(SQInteger)*2) +SQInteger SQLexer::ReadNumber() +{ +#define TINT 1 +#define TFLOAT 2 +#define THEX 3 +#define TSCIENTIFIC 4 +#define TOCTAL 5 + SQInteger type = TINT, firstchar = CUR_CHAR; + SQChar *sTemp; + INIT_TEMP_STRING(); + NEXT(); + if(firstchar == _SC('0') && (toupper(CUR_CHAR) == _SC('X') || scisodigit(CUR_CHAR)) ) { + if(scisodigit(CUR_CHAR)) { + type = TOCTAL; + while(scisodigit(CUR_CHAR)) { + APPEND_CHAR(CUR_CHAR); + NEXT(); + } + if(scisdigit(CUR_CHAR)) Error(_SC("invalid octal number")); + } + else { + NEXT(); + type = THEX; + while(isxdigit(CUR_CHAR)) { + APPEND_CHAR(CUR_CHAR); + NEXT(); + } + if(_longstr.size() > MAX_HEX_DIGITS) Error(_SC("too many digits for an Hex number")); + } + } + else { + APPEND_CHAR((int)firstchar); + while (CUR_CHAR == _SC('.') || scisdigit(CUR_CHAR) || isexponent(CUR_CHAR)) { + if(CUR_CHAR == _SC('.') || isexponent(CUR_CHAR)) type = TFLOAT; + if(isexponent(CUR_CHAR)) { + if(type != TFLOAT) Error(_SC("invalid numeric format")); + type = TSCIENTIFIC; + APPEND_CHAR(CUR_CHAR); + NEXT(); + if(CUR_CHAR == '+' || CUR_CHAR == '-'){ + APPEND_CHAR(CUR_CHAR); + NEXT(); + } + if(!scisdigit(CUR_CHAR)) Error(_SC("exponent expected")); + } + + APPEND_CHAR(CUR_CHAR); + NEXT(); + } + } + TERMINATE_BUFFER(); + switch(type) { + case TSCIENTIFIC: + case TFLOAT: + _fvalue = (SQFloat)scstrtod(&_longstr[0],&sTemp); + return TK_FLOAT; + case TINT: + LexInteger(&_longstr[0],(SQUnsignedInteger *)&_nvalue); + return TK_INTEGER; + case THEX: + LexHexadecimal(&_longstr[0],(SQUnsignedInteger *)&_nvalue); + return TK_INTEGER; + case TOCTAL: + LexOctal(&_longstr[0],(SQUnsignedInteger *)&_nvalue); + return TK_INTEGER; + } + return 0; +} + +SQInteger SQLexer::ReadID() +{ + SQInteger res; + INIT_TEMP_STRING(); + do { + APPEND_CHAR(CUR_CHAR); + NEXT(); + } while(scisalnum(CUR_CHAR) || CUR_CHAR == _SC('_')); + TERMINATE_BUFFER(); + res = GetIDType(&_longstr[0],_longstr.size() - 1); + if(res == TK_IDENTIFIER || res == TK_CONSTRUCTOR) { + _svalue = &_longstr[0]; + } + return res; +} diff --git a/squirrel/sqlexer.h b/squirrel/sqlexer.h new file mode 100644 index 0000000..01d2119 --- /dev/null +++ b/squirrel/sqlexer.h @@ -0,0 +1,47 @@ +/* see copyright notice in squirrel.h */ +#ifndef _SQLEXER_H_ +#define _SQLEXER_H_ + +#ifdef SQUNICODE +typedef SQChar LexChar; +#else +typedef unsigned char LexChar; +#endif + +struct SQLexer +{ + SQLexer(); + ~SQLexer(); + void Init(SQSharedState *ss,SQLEXREADFUNC rg,SQUserPointer up,CompilerErrorFunc efunc,void *ed); + void Error(const SQChar *err); + SQInteger Lex(); + const SQChar *Tok2Str(SQInteger tok); +private: + SQInteger GetIDType(const SQChar *s,SQInteger len); + SQInteger ReadString(SQInteger ndelim,bool verbatim); + SQInteger ReadNumber(); + void LexBlockComment(); + void LexLineComment(); + SQInteger ReadID(); + void Next(); + SQInteger _curtoken; + SQTable *_keywords; + SQBool _reached_eof; +public: + SQInteger _prevtoken; + SQInteger _currentline; + SQInteger _lasttokenline; + SQInteger _currentcolumn; + const SQChar *_svalue; + SQInteger _nvalue; + SQFloat _fvalue; + SQLEXREADFUNC _readf; + SQUserPointer _up; + LexChar _currdata; + SQSharedState *_sharedstate; + sqvector _longstr; + CompilerErrorFunc _errfunc; + void *_errtarget; +}; + +#endif diff --git a/squirrel/sqmem.cpp b/squirrel/sqmem.cpp new file mode 100644 index 0000000..3b5f2d7 --- /dev/null +++ b/squirrel/sqmem.cpp @@ -0,0 +1,11 @@ +/* + see copyright notice in squirrel.h +*/ +#include "sqpcheader.h" +#ifndef SQ_EXCLUDE_DEFAULT_MEMFUNCTIONS +void *sq_vm_malloc(SQUnsignedInteger size){ return malloc(size); } + +void *sq_vm_realloc(void *p, SQUnsignedInteger oldsize, SQUnsignedInteger size){ return realloc(p, size); } + +void sq_vm_free(void *p, SQUnsignedInteger size){ free(p); } +#endif diff --git a/squirrel/sqobject.cpp b/squirrel/sqobject.cpp new file mode 100644 index 0000000..753ae50 --- /dev/null +++ b/squirrel/sqobject.cpp @@ -0,0 +1,668 @@ +/* + see copyright notice in squirrel.h +*/ +#include "sqpcheader.h" +#include "sqvm.h" +#include "sqstring.h" +#include "sqarray.h" +#include "sqtable.h" +#include "squserdata.h" +#include "sqfuncproto.h" +#include "sqclass.h" +#include "sqclosure.h" + + +const SQChar *IdType2Name(SQObjectType type) +{ + switch(_RAW_TYPE(type)) + { + case _RT_NULL:return _SC("null"); + case _RT_INTEGER:return _SC("integer"); + case _RT_FLOAT:return _SC("float"); + case _RT_BOOL:return _SC("bool"); + case _RT_STRING:return _SC("string"); + case _RT_TABLE:return _SC("table"); + case _RT_ARRAY:return _SC("array"); + case _RT_GENERATOR:return _SC("generator"); + case _RT_CLOSURE: + case _RT_NATIVECLOSURE: + return _SC("function"); + case _RT_USERDATA: + case _RT_USERPOINTER: + return _SC("userdata"); + case _RT_THREAD: return _SC("thread"); + case _RT_FUNCPROTO: return _SC("function"); + case _RT_CLASS: return _SC("class"); + case _RT_INSTANCE: return _SC("instance"); + case _RT_WEAKREF: return _SC("weakref"); + case _RT_OUTER: return _SC("outer"); + default: + return NULL; + } +} + +const SQChar *GetTypeName(const SQObjectPtr &obj1) +{ + return IdType2Name(type(obj1)); +} + +SQString *SQString::Create(SQSharedState *ss,const SQChar *s,SQInteger len) +{ + SQString *str=ADD_STRING(ss,s,len); + return str; +} + +void SQString::Release() +{ + REMOVE_STRING(_sharedstate,this); +} + +SQInteger SQString::Next(const SQObjectPtr &refpos, SQObjectPtr &outkey, SQObjectPtr &outval) +{ + SQInteger idx = (SQInteger)TranslateIndex(refpos); + while(idx < _len){ + outkey = (SQInteger)idx; + outval = (SQInteger)((SQUnsignedInteger)_val[idx]); + //return idx for the next iteration + return ++idx; + } + //nothing to iterate anymore + return -1; +} + +SQUnsignedInteger TranslateIndex(const SQObjectPtr &idx) +{ + switch(type(idx)){ + case OT_NULL: + return 0; + case OT_INTEGER: + return (SQUnsignedInteger)_integer(idx); + default: assert(0); break; + } + return 0; +} + +SQWeakRef *SQRefCounted::GetWeakRef(SQObjectType type) +{ + if(!_weakref) { + sq_new(_weakref,SQWeakRef); +#if defined(SQUSEDOUBLE) && !defined(_SQ64) + _weakref->_obj._unVal.raw = 0; //clean the whole union on 32 bits with double +#endif + _weakref->_obj._type = type; + _weakref->_obj._unVal.pRefCounted = this; + } + return _weakref; +} + +SQRefCounted::~SQRefCounted() +{ + if(_weakref) { + _weakref->_obj._type = OT_NULL; + _weakref->_obj._unVal.pRefCounted = NULL; + } +} + +void SQWeakRef::Release() { + if(ISREFCOUNTED(_obj._type)) { + _obj._unVal.pRefCounted->_weakref = NULL; + } + sq_delete(this,SQWeakRef); +} + +bool SQDelegable::GetMetaMethod(SQVM *v,SQMetaMethod mm,SQObjectPtr &res) { + if(_delegate) { + return _delegate->Get((*_ss(v)->_metamethods)[mm],res); + } + return false; +} + +bool SQDelegable::SetDelegate(SQTable *mt) +{ + SQTable *temp = mt; + if(temp == this) return false; + while (temp) { + if (temp->_delegate == this) return false; //cycle detected + temp = temp->_delegate; + } + if (mt) __ObjAddRef(mt); + __ObjRelease(_delegate); + _delegate = mt; + return true; +} + +bool SQGenerator::Yield(SQVM *v,SQInteger target) +{ + if(_state==eSuspended) { v->Raise_Error(_SC("internal vm error, yielding dead generator")); return false;} + if(_state==eDead) { v->Raise_Error(_SC("internal vm error, yielding a dead generator")); return false; } + SQInteger size = v->_top-v->_stackbase; + + _stack.resize(size); + SQObject _this = v->_stack[v->_stackbase]; + _stack._vals[0] = ISREFCOUNTED(type(_this)) ? SQObjectPtr(_refcounted(_this)->GetWeakRef(type(_this))) : _this; + for(SQInteger n =1; n_stack[v->_stackbase+n]; + } + for(SQInteger j =0; j < size; j++) + { + v->_stack[v->_stackbase+j].Null(); + } + + _ci = *v->ci; + _ci._generator=NULL; + for(SQInteger i=0;i<_ci._etraps;i++) { + _etraps.push_back(v->_etraps.top()); + v->_etraps.pop_back(); + } + _state=eSuspended; + return true; +} + +bool SQGenerator::Resume(SQVM *v,SQObjectPtr &dest) +{ + if(_state==eDead){ v->Raise_Error(_SC("resuming dead generator")); return false; } + if(_state==eRunning){ v->Raise_Error(_SC("resuming active generator")); return false; } + SQInteger size = _stack.size(); + SQInteger target = &dest - &(v->_stack._vals[v->_stackbase]); + assert(target>=0 && target<=255); + if(!v->EnterFrame(v->_top, v->_top + size, false)) + return false; + v->ci->_generator = this; + v->ci->_target = (SQInt32)target; + v->ci->_closure = _ci._closure; + v->ci->_ip = _ci._ip; + v->ci->_literals = _ci._literals; + v->ci->_ncalls = _ci._ncalls; + v->ci->_etraps = _ci._etraps; + v->ci->_root = _ci._root; + + + for(SQInteger i=0;i<_ci._etraps;i++) { + v->_etraps.push_back(_etraps.top()); + _etraps.pop_back(); + } + SQObject _this = _stack._vals[0]; + v->_stack[v->_stackbase] = type(_this) == OT_WEAKREF ? _weakref(_this)->_obj : _this; + + for(SQInteger n = 1; n_stack[v->_stackbase+n] = _stack._vals[n]; + _stack._vals[n].Null(); + } + + _state=eRunning; + if (v->_debughook) + v->CallDebugHook(_SC('c')); + + return true; +} + +void SQArray::Extend(const SQArray *a){ + SQInteger xlen; + if((xlen=a->Size())) + for(SQInteger i=0;i_values[i]); +} + +const SQChar* SQFunctionProto::GetLocal(SQVM *vm,SQUnsignedInteger stackbase,SQUnsignedInteger nseq,SQUnsignedInteger nop) +{ + SQUnsignedInteger nvars=_nlocalvarinfos; + const SQChar *res=NULL; + if(nvars>=nseq){ + for(SQUnsignedInteger i=0;i=nop) + { + if(nseq==0){ + vm->Push(vm->_stack[stackbase+_localvarinfos[i]._pos]); + res=_stringval(_localvarinfos[i]._name); + break; + } + nseq--; + } + } + } + return res; +} + + +SQInteger SQFunctionProto::GetLine(SQInstruction *curr) +{ + SQInteger op = (SQInteger)(curr-_instructions); + SQInteger line=_lineinfos[0]._line; + SQInteger low = 0; + SQInteger high = _nlineinfos - 1; + SQInteger mid = 0; + while(low <= high) + { + mid = low + ((high - low) >> 1); + SQInteger curop = _lineinfos[mid]._op; + if(curop > op) + { + high = mid - 1; + } + else if(curop < op) { + if(mid < (_nlineinfos - 1) + && _lineinfos[mid + 1]._op >= op) { + break; + } + low = mid + 1; + } + else { //equal + break; + } + } + + while(mid > 0 && _lineinfos[mid]._op >= op) mid--; + + line = _lineinfos[mid]._line; + + return line; +} + +SQClosure::~SQClosure() +{ + __ObjRelease(_root); + __ObjRelease(_env); + __ObjRelease(_base); + REMOVE_FROM_CHAIN(&_ss(this)->_gc_chain,this); +} + +#define _CHECK_IO(exp) { if(!exp)return false; } +bool SafeWrite(HSQUIRRELVM v,SQWRITEFUNC write,SQUserPointer up,SQUserPointer dest,SQInteger size) +{ + if(write(up,dest,size) != size) { + v->Raise_Error(_SC("io error (write function failure)")); + return false; + } + return true; +} + +bool SafeRead(HSQUIRRELVM v,SQWRITEFUNC read,SQUserPointer up,SQUserPointer dest,SQInteger size) +{ + if(size && read(up,dest,size) != size) { + v->Raise_Error(_SC("io error, read function failure, the origin stream could be corrupted/trucated")); + return false; + } + return true; +} + +bool WriteTag(HSQUIRRELVM v,SQWRITEFUNC write,SQUserPointer up,SQUnsignedInteger32 tag) +{ + return SafeWrite(v,write,up,&tag,sizeof(tag)); +} + +bool CheckTag(HSQUIRRELVM v,SQWRITEFUNC read,SQUserPointer up,SQUnsignedInteger32 tag) +{ + SQUnsignedInteger32 t; + _CHECK_IO(SafeRead(v,read,up,&t,sizeof(t))); + if(t != tag){ + v->Raise_Error(_SC("invalid or corrupted closure stream")); + return false; + } + return true; +} + +bool WriteObject(HSQUIRRELVM v,SQUserPointer up,SQWRITEFUNC write,SQObjectPtr &o) +{ + SQUnsignedInteger32 _type = (SQUnsignedInteger32)type(o); + _CHECK_IO(SafeWrite(v,write,up,&_type,sizeof(_type))); + switch(type(o)){ + case OT_STRING: + _CHECK_IO(SafeWrite(v,write,up,&_string(o)->_len,sizeof(SQInteger))); + _CHECK_IO(SafeWrite(v,write,up,_stringval(o),sq_rsl(_string(o)->_len))); + break; + case OT_BOOL: + case OT_INTEGER: + _CHECK_IO(SafeWrite(v,write,up,&_integer(o),sizeof(SQInteger)));break; + case OT_FLOAT: + _CHECK_IO(SafeWrite(v,write,up,&_float(o),sizeof(SQFloat)));break; + case OT_NULL: + break; + default: + v->Raise_Error(_SC("cannot serialize a %s"),GetTypeName(o)); + return false; + } + return true; +} + +bool ReadObject(HSQUIRRELVM v,SQUserPointer up,SQREADFUNC read,SQObjectPtr &o) +{ + SQUnsignedInteger32 _type; + _CHECK_IO(SafeRead(v,read,up,&_type,sizeof(_type))); + SQObjectType t = (SQObjectType)_type; + switch(t){ + case OT_STRING:{ + SQInteger len; + _CHECK_IO(SafeRead(v,read,up,&len,sizeof(SQInteger))); + _CHECK_IO(SafeRead(v,read,up,_ss(v)->GetScratchPad(sq_rsl(len)),sq_rsl(len))); + o=SQString::Create(_ss(v),_ss(v)->GetScratchPad(-1),len); + } + break; + case OT_INTEGER:{ + SQInteger i; + _CHECK_IO(SafeRead(v,read,up,&i,sizeof(SQInteger))); o = i; break; + } + case OT_BOOL:{ + SQInteger i; + _CHECK_IO(SafeRead(v,read,up,&i,sizeof(SQInteger))); o._type = OT_BOOL; o._unVal.nInteger = i; break; + } + case OT_FLOAT:{ + SQFloat f; + _CHECK_IO(SafeRead(v,read,up,&f,sizeof(SQFloat))); o = f; break; + } + case OT_NULL: + o.Null(); + break; + default: + v->Raise_Error(_SC("cannot serialize a %s"),IdType2Name(t)); + return false; + } + return true; +} + +bool SQClosure::Save(SQVM *v,SQUserPointer up,SQWRITEFUNC write) +{ + _CHECK_IO(WriteTag(v,write,up,SQ_CLOSURESTREAM_HEAD)); + _CHECK_IO(WriteTag(v,write,up,sizeof(SQChar))); + _CHECK_IO(WriteTag(v,write,up,sizeof(SQInteger))); + _CHECK_IO(WriteTag(v,write,up,sizeof(SQFloat))); + _CHECK_IO(_function->Save(v,up,write)); + _CHECK_IO(WriteTag(v,write,up,SQ_CLOSURESTREAM_TAIL)); + return true; +} + +bool SQClosure::Load(SQVM *v,SQUserPointer up,SQREADFUNC read,SQObjectPtr &ret) +{ + _CHECK_IO(CheckTag(v,read,up,SQ_CLOSURESTREAM_HEAD)); + _CHECK_IO(CheckTag(v,read,up,sizeof(SQChar))); + _CHECK_IO(CheckTag(v,read,up,sizeof(SQInteger))); + _CHECK_IO(CheckTag(v,read,up,sizeof(SQFloat))); + SQObjectPtr func; + _CHECK_IO(SQFunctionProto::Load(v,up,read,func)); + _CHECK_IO(CheckTag(v,read,up,SQ_CLOSURESTREAM_TAIL)); + ret = SQClosure::Create(_ss(v),_funcproto(func),_table(v->_roottable)->GetWeakRef(OT_TABLE)); + //FIXME: load an root for this closure + return true; +} + +SQFunctionProto::SQFunctionProto(SQSharedState *ss) +{ + _stacksize=0; + _bgenerator=false; + INIT_CHAIN();ADD_TO_CHAIN(&_ss(this)->_gc_chain,this); +} + +SQFunctionProto::~SQFunctionProto() +{ + REMOVE_FROM_CHAIN(&_ss(this)->_gc_chain,this); +} + +bool SQFunctionProto::Save(SQVM *v,SQUserPointer up,SQWRITEFUNC write) +{ + SQInteger i,nliterals = _nliterals,nparameters = _nparameters; + SQInteger noutervalues = _noutervalues,nlocalvarinfos = _nlocalvarinfos; + SQInteger nlineinfos=_nlineinfos,ninstructions = _ninstructions,nfunctions=_nfunctions; + SQInteger ndefaultparams = _ndefaultparams; + _CHECK_IO(WriteTag(v,write,up,SQ_CLOSURESTREAM_PART)); + _CHECK_IO(WriteObject(v,up,write,_sourcename)); + _CHECK_IO(WriteObject(v,up,write,_name)); + _CHECK_IO(WriteTag(v,write,up,SQ_CLOSURESTREAM_PART)); + _CHECK_IO(SafeWrite(v,write,up,&nliterals,sizeof(nliterals))); + _CHECK_IO(SafeWrite(v,write,up,&nparameters,sizeof(nparameters))); + _CHECK_IO(SafeWrite(v,write,up,&noutervalues,sizeof(noutervalues))); + _CHECK_IO(SafeWrite(v,write,up,&nlocalvarinfos,sizeof(nlocalvarinfos))); + _CHECK_IO(SafeWrite(v,write,up,&nlineinfos,sizeof(nlineinfos))); + _CHECK_IO(SafeWrite(v,write,up,&ndefaultparams,sizeof(ndefaultparams))); + _CHECK_IO(SafeWrite(v,write,up,&ninstructions,sizeof(ninstructions))); + _CHECK_IO(SafeWrite(v,write,up,&nfunctions,sizeof(nfunctions))); + _CHECK_IO(WriteTag(v,write,up,SQ_CLOSURESTREAM_PART)); + for(i=0;iSave(v,up,write)); + } + _CHECK_IO(SafeWrite(v,write,up,&_stacksize,sizeof(_stacksize))); + _CHECK_IO(SafeWrite(v,write,up,&_bgenerator,sizeof(_bgenerator))); + _CHECK_IO(SafeWrite(v,write,up,&_varparams,sizeof(_varparams))); + return true; +} + +bool SQFunctionProto::Load(SQVM *v,SQUserPointer up,SQREADFUNC read,SQObjectPtr &ret) +{ + SQInteger i, nliterals,nparameters; + SQInteger noutervalues ,nlocalvarinfos ; + SQInteger nlineinfos,ninstructions ,nfunctions,ndefaultparams ; + SQObjectPtr sourcename, name; + SQObjectPtr o; + _CHECK_IO(CheckTag(v,read,up,SQ_CLOSURESTREAM_PART)); + _CHECK_IO(ReadObject(v, up, read, sourcename)); + _CHECK_IO(ReadObject(v, up, read, name)); + + _CHECK_IO(CheckTag(v,read,up,SQ_CLOSURESTREAM_PART)); + _CHECK_IO(SafeRead(v,read,up, &nliterals, sizeof(nliterals))); + _CHECK_IO(SafeRead(v,read,up, &nparameters, sizeof(nparameters))); + _CHECK_IO(SafeRead(v,read,up, &noutervalues, sizeof(noutervalues))); + _CHECK_IO(SafeRead(v,read,up, &nlocalvarinfos, sizeof(nlocalvarinfos))); + _CHECK_IO(SafeRead(v,read,up, &nlineinfos, sizeof(nlineinfos))); + _CHECK_IO(SafeRead(v,read,up, &ndefaultparams, sizeof(ndefaultparams))); + _CHECK_IO(SafeRead(v,read,up, &ninstructions, sizeof(ninstructions))); + _CHECK_IO(SafeRead(v,read,up, &nfunctions, sizeof(nfunctions))); + + + SQFunctionProto *f = SQFunctionProto::Create(_opt_ss(v),ninstructions,nliterals,nparameters, + nfunctions,noutervalues,nlineinfos,nlocalvarinfos,ndefaultparams); + SQObjectPtr proto = f; //gets a ref in case of failure + f->_sourcename = sourcename; + f->_name = name; + + _CHECK_IO(CheckTag(v,read,up,SQ_CLOSURESTREAM_PART)); + + for(i = 0;i < nliterals; i++){ + _CHECK_IO(ReadObject(v, up, read, o)); + f->_literals[i] = o; + } + _CHECK_IO(CheckTag(v,read,up,SQ_CLOSURESTREAM_PART)); + + for(i = 0; i < nparameters; i++){ + _CHECK_IO(ReadObject(v, up, read, o)); + f->_parameters[i] = o; + } + _CHECK_IO(CheckTag(v,read,up,SQ_CLOSURESTREAM_PART)); + + for(i = 0; i < noutervalues; i++){ + SQUnsignedInteger type; + SQObjectPtr name; + _CHECK_IO(SafeRead(v,read,up, &type, sizeof(SQUnsignedInteger))); + _CHECK_IO(ReadObject(v, up, read, o)); + _CHECK_IO(ReadObject(v, up, read, name)); + f->_outervalues[i] = SQOuterVar(name,o, (SQOuterType)type); + } + _CHECK_IO(CheckTag(v,read,up,SQ_CLOSURESTREAM_PART)); + + for(i = 0; i < nlocalvarinfos; i++){ + SQLocalVarInfo lvi; + _CHECK_IO(ReadObject(v, up, read, lvi._name)); + _CHECK_IO(SafeRead(v,read,up, &lvi._pos, sizeof(SQUnsignedInteger))); + _CHECK_IO(SafeRead(v,read,up, &lvi._start_op, sizeof(SQUnsignedInteger))); + _CHECK_IO(SafeRead(v,read,up, &lvi._end_op, sizeof(SQUnsignedInteger))); + f->_localvarinfos[i] = lvi; + } + _CHECK_IO(CheckTag(v,read,up,SQ_CLOSURESTREAM_PART)); + _CHECK_IO(SafeRead(v,read,up, f->_lineinfos, sizeof(SQLineInfo)*nlineinfos)); + + _CHECK_IO(CheckTag(v,read,up,SQ_CLOSURESTREAM_PART)); + _CHECK_IO(SafeRead(v,read,up, f->_defaultparams, sizeof(SQInteger)*ndefaultparams)); + + _CHECK_IO(CheckTag(v,read,up,SQ_CLOSURESTREAM_PART)); + _CHECK_IO(SafeRead(v,read,up, f->_instructions, sizeof(SQInstruction)*ninstructions)); + + _CHECK_IO(CheckTag(v,read,up,SQ_CLOSURESTREAM_PART)); + for(i = 0; i < nfunctions; i++){ + _CHECK_IO(_funcproto(o)->Load(v, up, read, o)); + f->_functions[i] = o; + } + _CHECK_IO(SafeRead(v,read,up, &f->_stacksize, sizeof(f->_stacksize))); + _CHECK_IO(SafeRead(v,read,up, &f->_bgenerator, sizeof(f->_bgenerator))); + _CHECK_IO(SafeRead(v,read,up, &f->_varparams, sizeof(f->_varparams))); + + ret = f; + return true; +} + +#ifndef NO_GARBAGE_COLLECTOR + +#define START_MARK() if(!(_uiRef&MARK_FLAG)){ \ + _uiRef|=MARK_FLAG; + +#define END_MARK() RemoveFromChain(&_sharedstate->_gc_chain, this); \ + AddToChain(chain, this); } + +void SQVM::Mark(SQCollectable **chain) +{ + START_MARK() + SQSharedState::MarkObject(_lasterror,chain); + SQSharedState::MarkObject(_errorhandler,chain); + SQSharedState::MarkObject(_debughook_closure,chain); + SQSharedState::MarkObject(_roottable, chain); + SQSharedState::MarkObject(temp_reg, chain); + for(SQUnsignedInteger i = 0; i < _stack.size(); i++) SQSharedState::MarkObject(_stack[i], chain); + for(SQInteger k = 0; k < _callsstacksize; k++) SQSharedState::MarkObject(_callsstack[k]._closure, chain); + END_MARK() +} + +void SQArray::Mark(SQCollectable **chain) +{ + START_MARK() + SQInteger len = _values.size(); + for(SQInteger i = 0;i < len; i++) SQSharedState::MarkObject(_values[i], chain); + END_MARK() +} +void SQTable::Mark(SQCollectable **chain) +{ + START_MARK() + if(_delegate) _delegate->Mark(chain); + SQInteger len = _numofnodes; + for(SQInteger i = 0; i < len; i++){ + SQSharedState::MarkObject(_nodes[i].key, chain); + SQSharedState::MarkObject(_nodes[i].val, chain); + } + END_MARK() +} + +void SQClass::Mark(SQCollectable **chain) +{ + START_MARK() + _members->Mark(chain); + if(_base) _base->Mark(chain); + SQSharedState::MarkObject(_attributes, chain); + for(SQUnsignedInteger i =0; i< _defaultvalues.size(); i++) { + SQSharedState::MarkObject(_defaultvalues[i].val, chain); + SQSharedState::MarkObject(_defaultvalues[i].attrs, chain); + } + for(SQUnsignedInteger j =0; j< _methods.size(); j++) { + SQSharedState::MarkObject(_methods[j].val, chain); + SQSharedState::MarkObject(_methods[j].attrs, chain); + } + for(SQUnsignedInteger k =0; k< MT_LAST; k++) { + SQSharedState::MarkObject(_metamethods[k], chain); + } + END_MARK() +} + +void SQInstance::Mark(SQCollectable **chain) +{ + START_MARK() + _class->Mark(chain); + SQUnsignedInteger nvalues = _class->_defaultvalues.size(); + for(SQUnsignedInteger i =0; i< nvalues; i++) { + SQSharedState::MarkObject(_values[i], chain); + } + END_MARK() +} + +void SQGenerator::Mark(SQCollectable **chain) +{ + START_MARK() + for(SQUnsignedInteger i = 0; i < _stack.size(); i++) SQSharedState::MarkObject(_stack[i], chain); + SQSharedState::MarkObject(_closure, chain); + END_MARK() +} + +void SQFunctionProto::Mark(SQCollectable **chain) +{ + START_MARK() + for(SQInteger i = 0; i < _nliterals; i++) SQSharedState::MarkObject(_literals[i], chain); + for(SQInteger k = 0; k < _nfunctions; k++) SQSharedState::MarkObject(_functions[k], chain); + END_MARK() +} + +void SQClosure::Mark(SQCollectable **chain) +{ + START_MARK() + if(_base) _base->Mark(chain); + SQFunctionProto *fp = _function; + fp->Mark(chain); + for(SQInteger i = 0; i < fp->_noutervalues; i++) SQSharedState::MarkObject(_outervalues[i], chain); + for(SQInteger k = 0; k < fp->_ndefaultparams; k++) SQSharedState::MarkObject(_defaultparams[k], chain); + END_MARK() +} + +void SQNativeClosure::Mark(SQCollectable **chain) +{ + START_MARK() + for(SQUnsignedInteger i = 0; i < _noutervalues; i++) SQSharedState::MarkObject(_outervalues[i], chain); + END_MARK() +} + +void SQOuter::Mark(SQCollectable **chain) +{ + START_MARK() + /* If the valptr points to a closed value, that value is alive */ + if(_valptr == &_value) { + SQSharedState::MarkObject(_value, chain); + } + END_MARK() +} + +void SQUserData::Mark(SQCollectable **chain){ + START_MARK() + if(_delegate) _delegate->Mark(chain); + END_MARK() +} + +void SQCollectable::UnMark() { _uiRef&=~MARK_FLAG; } + +#endif + diff --git a/squirrel/sqobject.h b/squirrel/sqobject.h new file mode 100644 index 0000000..e0e235e --- /dev/null +++ b/squirrel/sqobject.h @@ -0,0 +1,354 @@ +/* see copyright notice in squirrel.h */ +#ifndef _SQOBJECT_H_ +#define _SQOBJECT_H_ + +#include "squtils.h" + +#ifdef _SQ64 +#define UINT_MINUS_ONE (0xFFFFFFFFFFFFFFFF) +#else +#define UINT_MINUS_ONE (0xFFFFFFFF) +#endif + +#define SQ_CLOSURESTREAM_HEAD (('S'<<24)|('Q'<<16)|('I'<<8)|('R')) +#define SQ_CLOSURESTREAM_PART (('P'<<24)|('A'<<16)|('R'<<8)|('T')) +#define SQ_CLOSURESTREAM_TAIL (('T'<<24)|('A'<<16)|('I'<<8)|('L')) + +struct SQSharedState; + +enum SQMetaMethod{ + MT_ADD=0, + MT_SUB=1, + MT_MUL=2, + MT_DIV=3, + MT_UNM=4, + MT_MODULO=5, + MT_SET=6, + MT_GET=7, + MT_TYPEOF=8, + MT_NEXTI=9, + MT_CMP=10, + MT_CALL=11, + MT_CLONED=12, + MT_NEWSLOT=13, + MT_DELSLOT=14, + MT_TOSTRING=15, + MT_NEWMEMBER=16, + MT_INHERITED=17, + MT_LAST = 18 +}; + +#define MM_ADD _SC("_add") +#define MM_SUB _SC("_sub") +#define MM_MUL _SC("_mul") +#define MM_DIV _SC("_div") +#define MM_UNM _SC("_unm") +#define MM_MODULO _SC("_modulo") +#define MM_SET _SC("_set") +#define MM_GET _SC("_get") +#define MM_TYPEOF _SC("_typeof") +#define MM_NEXTI _SC("_nexti") +#define MM_CMP _SC("_cmp") +#define MM_CALL _SC("_call") +#define MM_CLONED _SC("_cloned") +#define MM_NEWSLOT _SC("_newslot") +#define MM_DELSLOT _SC("_delslot") +#define MM_TOSTRING _SC("_tostring") +#define MM_NEWMEMBER _SC("_newmember") +#define MM_INHERITED _SC("_inherited") + + +#define _CONSTRUCT_VECTOR(type,size,ptr) { \ + for(SQInteger n = 0; n < ((SQInteger)size); n++) { \ + new (&ptr[n]) type(); \ + } \ +} + +#define _DESTRUCT_VECTOR(type,size,ptr) { \ + for(SQInteger nl = 0; nl < ((SQInteger)size); nl++) { \ + ptr[nl].~type(); \ + } \ +} + +#define _COPY_VECTOR(dest,src,size) { \ + for(SQInteger _n_ = 0; _n_ < ((SQInteger)size); _n_++) { \ + dest[_n_] = src[_n_]; \ + } \ +} + +#define _NULL_SQOBJECT_VECTOR(vec,size) { \ + for(SQInteger _n_ = 0; _n_ < ((SQInteger)size); _n_++) { \ + vec[_n_].Null(); \ + } \ +} + +#define MINPOWER2 4 + +struct SQRefCounted +{ + SQUnsignedInteger _uiRef; + struct SQWeakRef *_weakref; + SQRefCounted() { _uiRef = 0; _weakref = NULL; } + virtual ~SQRefCounted(); + SQWeakRef *GetWeakRef(SQObjectType type); + virtual void Release()=0; + +}; + +struct SQWeakRef : SQRefCounted +{ + void Release(); + SQObject _obj; +}; + +#define _realval(o) (type((o)) != OT_WEAKREF?(SQObject)o:_weakref(o)->_obj) + +struct SQObjectPtr; + +#define __AddRef(type,unval) if(ISREFCOUNTED(type)) \ + { \ + unval.pRefCounted->_uiRef++; \ + } + +#define __Release(type,unval) if(ISREFCOUNTED(type) && ((--unval.pRefCounted->_uiRef)==0)) \ + { \ + unval.pRefCounted->Release(); \ + } + +#define __ObjRelease(obj) { \ + if((obj)) { \ + (obj)->_uiRef--; \ + if((obj)->_uiRef == 0) \ + (obj)->Release(); \ + (obj) = NULL; \ + } \ +} + +#define __ObjAddRef(obj) { \ + (obj)->_uiRef++; \ +} + +#define type(obj) ((obj)._type) +#define is_delegable(t) (type(t)&SQOBJECT_DELEGABLE) +#define raw_type(obj) _RAW_TYPE((obj)._type) + +#define _integer(obj) ((obj)._unVal.nInteger) +#define _float(obj) ((obj)._unVal.fFloat) +#define _string(obj) ((obj)._unVal.pString) +#define _table(obj) ((obj)._unVal.pTable) +#define _array(obj) ((obj)._unVal.pArray) +#define _closure(obj) ((obj)._unVal.pClosure) +#define _generator(obj) ((obj)._unVal.pGenerator) +#define _nativeclosure(obj) ((obj)._unVal.pNativeClosure) +#define _userdata(obj) ((obj)._unVal.pUserData) +#define _userpointer(obj) ((obj)._unVal.pUserPointer) +#define _thread(obj) ((obj)._unVal.pThread) +#define _funcproto(obj) ((obj)._unVal.pFunctionProto) +#define _class(obj) ((obj)._unVal.pClass) +#define _instance(obj) ((obj)._unVal.pInstance) +#define _delegable(obj) ((SQDelegable *)(obj)._unVal.pDelegable) +#define _weakref(obj) ((obj)._unVal.pWeakRef) +#define _outer(obj) ((obj)._unVal.pOuter) +#define _refcounted(obj) ((obj)._unVal.pRefCounted) +#define _rawval(obj) ((obj)._unVal.raw) + +#define _stringval(obj) (obj)._unVal.pString->_val +#define _userdataval(obj) ((SQUserPointer)sq_aligning((obj)._unVal.pUserData + 1)) + +#define tofloat(num) ((type(num)==OT_INTEGER)?(SQFloat)_integer(num):_float(num)) +#define tointeger(num) ((type(num)==OT_FLOAT)?(SQInteger)_float(num):_integer(num)) +///////////////////////////////////////////////////////////////////////////////////// +///////////////////////////////////////////////////////////////////////////////////// +#if defined(SQUSEDOUBLE) && !defined(_SQ64) || !defined(SQUSEDOUBLE) && defined(_SQ64) +#define SQ_REFOBJECT_INIT() SQ_OBJECT_RAWINIT() +#else +#define SQ_REFOBJECT_INIT() +#endif + +#define _REF_TYPE_DECL(type,_class,sym) \ + SQObjectPtr(_class * x) \ + { \ + SQ_OBJECT_RAWINIT() \ + _type=type; \ + _unVal.sym = x; \ + assert(_unVal.pTable); \ + _unVal.pRefCounted->_uiRef++; \ + } \ + inline SQObjectPtr& operator=(_class *x) \ + { \ + SQObjectType tOldType; \ + SQObjectValue unOldVal; \ + tOldType=_type; \ + unOldVal=_unVal; \ + _type = type; \ + SQ_REFOBJECT_INIT() \ + _unVal.sym = x; \ + _unVal.pRefCounted->_uiRef++; \ + __Release(tOldType,unOldVal); \ + return *this; \ + } + +#define _SCALAR_TYPE_DECL(type,_class,sym) \ + SQObjectPtr(_class x) \ + { \ + SQ_OBJECT_RAWINIT() \ + _type=type; \ + _unVal.sym = x; \ + } \ + inline SQObjectPtr& operator=(_class x) \ + { \ + __Release(_type,_unVal); \ + _type = type; \ + SQ_OBJECT_RAWINIT() \ + _unVal.sym = x; \ + return *this; \ + } +struct SQObjectPtr : public SQObject +{ + SQObjectPtr() + { + SQ_OBJECT_RAWINIT() + _type=OT_NULL; + _unVal.pUserPointer=NULL; + } + SQObjectPtr(const SQObjectPtr &o) + { + _type = o._type; + _unVal = o._unVal; + __AddRef(_type,_unVal); + } + SQObjectPtr(const SQObject &o) + { + _type = o._type; + _unVal = o._unVal; + __AddRef(_type,_unVal); + } + _REF_TYPE_DECL(OT_TABLE,SQTable,pTable) + _REF_TYPE_DECL(OT_CLASS,SQClass,pClass) + _REF_TYPE_DECL(OT_INSTANCE,SQInstance,pInstance) + _REF_TYPE_DECL(OT_ARRAY,SQArray,pArray) + _REF_TYPE_DECL(OT_CLOSURE,SQClosure,pClosure) + _REF_TYPE_DECL(OT_NATIVECLOSURE,SQNativeClosure,pNativeClosure) + _REF_TYPE_DECL(OT_OUTER,SQOuter,pOuter) + _REF_TYPE_DECL(OT_GENERATOR,SQGenerator,pGenerator) + _REF_TYPE_DECL(OT_STRING,SQString,pString) + _REF_TYPE_DECL(OT_USERDATA,SQUserData,pUserData) + _REF_TYPE_DECL(OT_WEAKREF,SQWeakRef,pWeakRef) + _REF_TYPE_DECL(OT_THREAD,SQVM,pThread) + _REF_TYPE_DECL(OT_FUNCPROTO,SQFunctionProto,pFunctionProto) + + _SCALAR_TYPE_DECL(OT_INTEGER,SQInteger,nInteger) + _SCALAR_TYPE_DECL(OT_FLOAT,SQFloat,fFloat) + _SCALAR_TYPE_DECL(OT_USERPOINTER,SQUserPointer,pUserPointer) + + SQObjectPtr(bool bBool) + { + SQ_OBJECT_RAWINIT() + _type = OT_BOOL; + _unVal.nInteger = bBool?1:0; + } + inline SQObjectPtr& operator=(bool b) + { + __Release(_type,_unVal); + SQ_OBJECT_RAWINIT() + _type = OT_BOOL; + _unVal.nInteger = b?1:0; + return *this; + } + + ~SQObjectPtr() + { + __Release(_type,_unVal); + } + + inline SQObjectPtr& operator=(const SQObjectPtr& obj) + { + SQObjectType tOldType; + SQObjectValue unOldVal; + tOldType=_type; + unOldVal=_unVal; + _unVal = obj._unVal; + _type = obj._type; + __AddRef(_type,_unVal); + __Release(tOldType,unOldVal); + return *this; + } + inline SQObjectPtr& operator=(const SQObject& obj) + { + SQObjectType tOldType; + SQObjectValue unOldVal; + tOldType=_type; + unOldVal=_unVal; + _unVal = obj._unVal; + _type = obj._type; + __AddRef(_type,_unVal); + __Release(tOldType,unOldVal); + return *this; + } + inline void Null() + { + SQObjectType tOldType = _type; + SQObjectValue unOldVal = _unVal; + _type = OT_NULL; + _unVal.raw = (SQRawObjectVal)NULL; + __Release(tOldType ,unOldVal); + } + private: + SQObjectPtr(const SQChar *){} //safety +}; + + +inline void _Swap(SQObject &a,SQObject &b) +{ + SQObjectType tOldType = a._type; + SQObjectValue unOldVal = a._unVal; + a._type = b._type; + a._unVal = b._unVal; + b._type = tOldType; + b._unVal = unOldVal; +} + +///////////////////////////////////////////////////////////////////////////////////// +#ifndef NO_GARBAGE_COLLECTOR +#define MARK_FLAG 0x80000000 +struct SQCollectable : public SQRefCounted { + SQCollectable *_next; + SQCollectable *_prev; + SQSharedState *_sharedstate; + virtual SQObjectType GetType()=0; + virtual void Release()=0; + virtual void Mark(SQCollectable **chain)=0; + void UnMark(); + virtual void Finalize()=0; + static void AddToChain(SQCollectable **chain,SQCollectable *c); + static void RemoveFromChain(SQCollectable **chain,SQCollectable *c); +}; + + +#define ADD_TO_CHAIN(chain,obj) AddToChain(chain,obj) +#define REMOVE_FROM_CHAIN(chain,obj) {if(!(_uiRef&MARK_FLAG))RemoveFromChain(chain,obj);} +#define CHAINABLE_OBJ SQCollectable +#define INIT_CHAIN() {_next=NULL;_prev=NULL;_sharedstate=ss;} +#else + +#define ADD_TO_CHAIN(chain,obj) ((void)0) +#define REMOVE_FROM_CHAIN(chain,obj) ((void)0) +#define CHAINABLE_OBJ SQRefCounted +#define INIT_CHAIN() ((void)0) +#endif + +struct SQDelegable : public CHAINABLE_OBJ { + bool SetDelegate(SQTable *m); + virtual bool GetMetaMethod(SQVM *v,SQMetaMethod mm,SQObjectPtr &res); + SQTable *_delegate; +}; + +SQUnsignedInteger TranslateIndex(const SQObjectPtr &idx); +typedef sqvector SQObjectPtrVec; +typedef sqvector SQIntVec; +const SQChar *GetTypeName(const SQObjectPtr &obj1); +const SQChar *IdType2Name(SQObjectType type); + + + +#endif //_SQOBJECT_H_ diff --git a/squirrel/sqopcodes.h b/squirrel/sqopcodes.h new file mode 100644 index 0000000..3f572a8 --- /dev/null +++ b/squirrel/sqopcodes.h @@ -0,0 +1,132 @@ +/* see copyright notice in squirrel.h */ +#ifndef _SQOPCODES_H_ +#define _SQOPCODES_H_ + +#define MAX_FUNC_STACKSIZE 0xFF +#define MAX_LITERALS ((SQInteger)0x7FFFFFFF) + +enum BitWiseOP { + BW_AND = 0, + BW_OR = 2, + BW_XOR = 3, + BW_SHIFTL = 4, + BW_SHIFTR = 5, + BW_USHIFTR = 6 +}; + +enum CmpOP { + CMP_G = 0, + CMP_GE = 2, + CMP_L = 3, + CMP_LE = 4, + CMP_3W = 5 +}; + +enum NewObjectType { + NOT_TABLE = 0, + NOT_ARRAY = 1, + NOT_CLASS = 2 +}; + +enum AppendArrayType { + AAT_STACK = 0, + AAT_LITERAL = 1, + AAT_INT = 2, + AAT_FLOAT = 3, + AAT_BOOL = 4 +}; + +enum SQOpcode +{ + _OP_LINE= 0x00, + _OP_LOAD= 0x01, + _OP_LOADINT= 0x02, + _OP_LOADFLOAT= 0x03, + _OP_DLOAD= 0x04, + _OP_TAILCALL= 0x05, + _OP_CALL= 0x06, + _OP_PREPCALL= 0x07, + _OP_PREPCALLK= 0x08, + _OP_GETK= 0x09, + _OP_MOVE= 0x0A, + _OP_NEWSLOT= 0x0B, + _OP_DELETE= 0x0C, + _OP_SET= 0x0D, + _OP_GET= 0x0E, + _OP_EQ= 0x0F, + _OP_NE= 0x10, + _OP_ADD= 0x11, + _OP_SUB= 0x12, + _OP_MUL= 0x13, + _OP_DIV= 0x14, + _OP_MOD= 0x15, + _OP_BITW= 0x16, + _OP_RETURN= 0x17, + _OP_LOADNULLS= 0x18, + _OP_LOADROOT= 0x19, + _OP_LOADBOOL= 0x1A, + _OP_DMOVE= 0x1B, + _OP_JMP= 0x1C, + //_OP_JNZ= 0x1D, + _OP_JCMP= 0x1D, + _OP_JZ= 0x1E, + _OP_SETOUTER= 0x1F, + _OP_GETOUTER= 0x20, + _OP_NEWOBJ= 0x21, + _OP_APPENDARRAY= 0x22, + _OP_COMPARITH= 0x23, + _OP_INC= 0x24, + _OP_INCL= 0x25, + _OP_PINC= 0x26, + _OP_PINCL= 0x27, + _OP_CMP= 0x28, + _OP_EXISTS= 0x29, + _OP_INSTANCEOF= 0x2A, + _OP_AND= 0x2B, + _OP_OR= 0x2C, + _OP_NEG= 0x2D, + _OP_NOT= 0x2E, + _OP_BWNOT= 0x2F, + _OP_CLOSURE= 0x30, + _OP_YIELD= 0x31, + _OP_RESUME= 0x32, + _OP_FOREACH= 0x33, + _OP_POSTFOREACH= 0x34, + _OP_CLONE= 0x35, + _OP_TYPEOF= 0x36, + _OP_PUSHTRAP= 0x37, + _OP_POPTRAP= 0x38, + _OP_THROW= 0x39, + _OP_NEWSLOTA= 0x3A, + _OP_GETBASE= 0x3B, + _OP_CLOSE= 0x3C +}; + +struct SQInstructionDesc { + const SQChar *name; +}; + +struct SQInstruction +{ + SQInstruction(){}; + SQInstruction(SQOpcode _op,SQInteger a0=0,SQInteger a1=0,SQInteger a2=0,SQInteger a3=0) + { op = _op; + _arg0 = (unsigned char)a0;_arg1 = (SQInt32)a1; + _arg2 = (unsigned char)a2;_arg3 = (unsigned char)a3; + } + + + SQInt32 _arg1; + unsigned char op; + unsigned char _arg0; + unsigned char _arg2; + unsigned char _arg3; +}; + +#include "squtils.h" +typedef sqvector SQInstructionVec; + +#define NEW_SLOT_ATTRIBUTES_FLAG 0x01 +#define NEW_SLOT_STATIC_FLAG 0x02 + +#endif // _SQOPCODES_H_ diff --git a/squirrel/sqpcheader.h b/squirrel/sqpcheader.h new file mode 100644 index 0000000..4d25712 --- /dev/null +++ b/squirrel/sqpcheader.h @@ -0,0 +1,20 @@ +/* see copyright notice in squirrel.h */ +#ifndef _SQPCHEADER_H_ +#define _SQPCHEADER_H_ + +#if defined(_MSC_VER) && defined(_DEBUG) +#include +#endif + +#include +#include +#include +#include +#include +#include +//squirrel stuff +#include +#include "sqobject.h" +#include "sqstate.h" + +#endif //_SQPCHEADER_H_ diff --git a/squirrel/sqstate.cpp b/squirrel/sqstate.cpp new file mode 100644 index 0000000..00cc31a --- /dev/null +++ b/squirrel/sqstate.cpp @@ -0,0 +1,658 @@ +/* + see copyright notice in squirrel.h +*/ +#include "sqpcheader.h" +#include "sqopcodes.h" +#include "sqvm.h" +#include "sqfuncproto.h" +#include "sqclosure.h" +#include "sqstring.h" +#include "sqtable.h" +#include "sqarray.h" +#include "squserdata.h" +#include "sqclass.h" + +//SQObjectPtr _null_; +//SQObjectPtr _true_(true); +//SQObjectPtr _false_(false); +//SQObjectPtr _one_((SQInteger)1); +//SQObjectPtr _minusone_((SQInteger)-1); + +SQSharedState::SQSharedState() +{ + _compilererrorhandler = NULL; + _printfunc = NULL; + _errorfunc = NULL; + _debuginfo = false; + _notifyallexceptions = false; + _foreignptr = NULL; + _releasehook = NULL; +} + +#define newsysstring(s) { \ + _systemstrings->push_back(SQString::Create(this,s)); \ + } + +#define newmetamethod(s) { \ + _metamethods->push_back(SQString::Create(this,s)); \ + _table(_metamethodsmap)->NewSlot(_metamethods->back(),(SQInteger)(_metamethods->size()-1)); \ + } + +bool CompileTypemask(SQIntVec &res,const SQChar *typemask) +{ + SQInteger i = 0; + + SQInteger mask = 0; + while(typemask[i] != 0) { + + switch(typemask[i]){ + case 'o': mask |= _RT_NULL; break; + case 'i': mask |= _RT_INTEGER; break; + case 'f': mask |= _RT_FLOAT; break; + case 'n': mask |= (_RT_FLOAT | _RT_INTEGER); break; + case 's': mask |= _RT_STRING; break; + case 't': mask |= _RT_TABLE; break; + case 'a': mask |= _RT_ARRAY; break; + case 'u': mask |= _RT_USERDATA; break; + case 'c': mask |= (_RT_CLOSURE | _RT_NATIVECLOSURE); break; + case 'b': mask |= _RT_BOOL; break; + case 'g': mask |= _RT_GENERATOR; break; + case 'p': mask |= _RT_USERPOINTER; break; + case 'v': mask |= _RT_THREAD; break; + case 'x': mask |= _RT_INSTANCE; break; + case 'y': mask |= _RT_CLASS; break; + case 'r': mask |= _RT_WEAKREF; break; + case '.': mask = -1; res.push_back(mask); i++; mask = 0; continue; + case ' ': i++; continue; //ignores spaces + default: + return false; + } + i++; + if(typemask[i] == '|') { + i++; + if(typemask[i] == 0) + return false; + continue; + } + res.push_back(mask); + mask = 0; + + } + return true; +} + +SQTable *CreateDefaultDelegate(SQSharedState *ss,SQRegFunction *funcz) +{ + SQInteger i=0; + SQTable *t=SQTable::Create(ss,0); + while(funcz[i].name!=0){ + SQNativeClosure *nc = SQNativeClosure::Create(ss,funcz[i].f,0); + nc->_nparamscheck = funcz[i].nparamscheck; + nc->_name = SQString::Create(ss,funcz[i].name); + if(funcz[i].typemask && !CompileTypemask(nc->_typecheck,funcz[i].typemask)) + return NULL; + t->NewSlot(SQString::Create(ss,funcz[i].name),nc); + i++; + } + return t; +} + +void SQSharedState::Init() +{ + _scratchpad=NULL; + _scratchpadsize=0; +#ifndef NO_GARBAGE_COLLECTOR + _gc_chain=NULL; +#endif + _stringtable = (SQStringTable*)SQ_MALLOC(sizeof(SQStringTable)); + new (_stringtable) SQStringTable(this); + sq_new(_metamethods,SQObjectPtrVec); + sq_new(_systemstrings,SQObjectPtrVec); + sq_new(_types,SQObjectPtrVec); + _metamethodsmap = SQTable::Create(this,MT_LAST-1); + //adding type strings to avoid memory trashing + //types names + newsysstring(_SC("null")); + newsysstring(_SC("table")); + newsysstring(_SC("array")); + newsysstring(_SC("closure")); + newsysstring(_SC("string")); + newsysstring(_SC("userdata")); + newsysstring(_SC("integer")); + newsysstring(_SC("float")); + newsysstring(_SC("userpointer")); + newsysstring(_SC("function")); + newsysstring(_SC("generator")); + newsysstring(_SC("thread")); + newsysstring(_SC("class")); + newsysstring(_SC("instance")); + newsysstring(_SC("bool")); + //meta methods + newmetamethod(MM_ADD); + newmetamethod(MM_SUB); + newmetamethod(MM_MUL); + newmetamethod(MM_DIV); + newmetamethod(MM_UNM); + newmetamethod(MM_MODULO); + newmetamethod(MM_SET); + newmetamethod(MM_GET); + newmetamethod(MM_TYPEOF); + newmetamethod(MM_NEXTI); + newmetamethod(MM_CMP); + newmetamethod(MM_CALL); + newmetamethod(MM_CLONED); + newmetamethod(MM_NEWSLOT); + newmetamethod(MM_DELSLOT); + newmetamethod(MM_TOSTRING); + newmetamethod(MM_NEWMEMBER); + newmetamethod(MM_INHERITED); + + _constructoridx = SQString::Create(this,_SC("constructor")); + _registry = SQTable::Create(this,0); + _consts = SQTable::Create(this,0); + _table_default_delegate = CreateDefaultDelegate(this,_table_default_delegate_funcz); + _array_default_delegate = CreateDefaultDelegate(this,_array_default_delegate_funcz); + _string_default_delegate = CreateDefaultDelegate(this,_string_default_delegate_funcz); + _number_default_delegate = CreateDefaultDelegate(this,_number_default_delegate_funcz); + _closure_default_delegate = CreateDefaultDelegate(this,_closure_default_delegate_funcz); + _generator_default_delegate = CreateDefaultDelegate(this,_generator_default_delegate_funcz); + _thread_default_delegate = CreateDefaultDelegate(this,_thread_default_delegate_funcz); + _class_default_delegate = CreateDefaultDelegate(this,_class_default_delegate_funcz); + _instance_default_delegate = CreateDefaultDelegate(this,_instance_default_delegate_funcz); + _weakref_default_delegate = CreateDefaultDelegate(this,_weakref_default_delegate_funcz); + +} + +SQSharedState::~SQSharedState() +{ + if(_releasehook) { _releasehook(_foreignptr,0); _releasehook = NULL; } + _constructoridx.Null(); + _table(_registry)->Finalize(); + _table(_consts)->Finalize(); + _table(_metamethodsmap)->Finalize(); + _registry.Null(); + _consts.Null(); + _metamethodsmap.Null(); + while(!_systemstrings->empty()) { + _systemstrings->back().Null(); + _systemstrings->pop_back(); + } + _thread(_root_vm)->Finalize(); + _root_vm.Null(); + _table_default_delegate.Null(); + _array_default_delegate.Null(); + _string_default_delegate.Null(); + _number_default_delegate.Null(); + _closure_default_delegate.Null(); + _generator_default_delegate.Null(); + _thread_default_delegate.Null(); + _class_default_delegate.Null(); + _instance_default_delegate.Null(); + _weakref_default_delegate.Null(); + _refs_table.Finalize(); +#ifndef NO_GARBAGE_COLLECTOR + SQCollectable *t = _gc_chain; + SQCollectable *nx = NULL; + if(t) { + t->_uiRef++; + while(t) { + t->Finalize(); + nx = t->_next; + if(nx) nx->_uiRef++; + if(--t->_uiRef == 0) + t->Release(); + t = nx; + } + } + assert(_gc_chain==NULL); //just to proove a theory + while(_gc_chain){ + _gc_chain->_uiRef++; + _gc_chain->Release(); + } +#endif + + sq_delete(_types,SQObjectPtrVec); + sq_delete(_systemstrings,SQObjectPtrVec); + sq_delete(_metamethods,SQObjectPtrVec); + sq_delete(_stringtable,SQStringTable); + if(_scratchpad)SQ_FREE(_scratchpad,_scratchpadsize); +} + + +SQInteger SQSharedState::GetMetaMethodIdxByName(const SQObjectPtr &name) +{ + if(type(name) != OT_STRING) + return -1; + SQObjectPtr ret; + if(_table(_metamethodsmap)->Get(name,ret)) { + return _integer(ret); + } + return -1; +} + +#ifndef NO_GARBAGE_COLLECTOR + +void SQSharedState::MarkObject(SQObjectPtr &o,SQCollectable **chain) +{ + switch(type(o)){ + case OT_TABLE:_table(o)->Mark(chain);break; + case OT_ARRAY:_array(o)->Mark(chain);break; + case OT_USERDATA:_userdata(o)->Mark(chain);break; + case OT_CLOSURE:_closure(o)->Mark(chain);break; + case OT_NATIVECLOSURE:_nativeclosure(o)->Mark(chain);break; + case OT_GENERATOR:_generator(o)->Mark(chain);break; + case OT_THREAD:_thread(o)->Mark(chain);break; + case OT_CLASS:_class(o)->Mark(chain);break; + case OT_INSTANCE:_instance(o)->Mark(chain);break; + case OT_OUTER:_outer(o)->Mark(chain);break; + case OT_FUNCPROTO:_funcproto(o)->Mark(chain);break; + default: break; //shutup compiler + } +} + + +void SQSharedState::RunMark(SQVM *vm,SQCollectable **tchain) +{ + SQVM *vms = _thread(_root_vm); + + vms->Mark(tchain); + + _refs_table.Mark(tchain); + MarkObject(_registry,tchain); + MarkObject(_consts,tchain); + MarkObject(_metamethodsmap,tchain); + MarkObject(_table_default_delegate,tchain); + MarkObject(_array_default_delegate,tchain); + MarkObject(_string_default_delegate,tchain); + MarkObject(_number_default_delegate,tchain); + MarkObject(_generator_default_delegate,tchain); + MarkObject(_thread_default_delegate,tchain); + MarkObject(_closure_default_delegate,tchain); + MarkObject(_class_default_delegate,tchain); + MarkObject(_instance_default_delegate,tchain); + MarkObject(_weakref_default_delegate,tchain); + +} + +SQInteger SQSharedState::ResurrectUnreachable(SQVM *vm) +{ + SQInteger n=0; + SQCollectable *tchain=NULL; + + RunMark(vm,&tchain); + + SQCollectable *resurrected = _gc_chain; + SQCollectable *t = resurrected; + //SQCollectable *nx = NULL; + + _gc_chain = tchain; + + SQArray *ret = NULL; + if(resurrected) { + ret = SQArray::Create(this,0); + SQCollectable *rlast = NULL; + while(t) { + rlast = t; + SQObjectType type = t->GetType(); + if(type != OT_FUNCPROTO && type != OT_OUTER) { + SQObject sqo; + sqo._type = type; + sqo._unVal.pRefCounted = t; + ret->Append(sqo); + } + t = t->_next; + n++; + } + + assert(rlast->_next == NULL); + rlast->_next = _gc_chain; + if(_gc_chain) + { + _gc_chain->_prev = rlast; + } + _gc_chain = resurrected; + } + + t = _gc_chain; + while(t) { + t->UnMark(); + t = t->_next; + } + + if(ret) { + SQObjectPtr temp = ret; + vm->Push(temp); + } + else { + vm->PushNull(); + } + return n; +} + +SQInteger SQSharedState::CollectGarbage(SQVM *vm) +{ + SQInteger n = 0; + SQCollectable *tchain = NULL; + + RunMark(vm,&tchain); + + SQCollectable *t = _gc_chain; + SQCollectable *nx = NULL; + if(t) { + t->_uiRef++; + while(t) { + t->Finalize(); + nx = t->_next; + if(nx) nx->_uiRef++; + if(--t->_uiRef == 0) + t->Release(); + t = nx; + n++; + } + } + + t = tchain; + while(t) { + t->UnMark(); + t = t->_next; + } + _gc_chain = tchain; + + return n; +} +#endif + +#ifndef NO_GARBAGE_COLLECTOR +void SQCollectable::AddToChain(SQCollectable **chain,SQCollectable *c) +{ + c->_prev = NULL; + c->_next = *chain; + if(*chain) (*chain)->_prev = c; + *chain = c; +} + +void SQCollectable::RemoveFromChain(SQCollectable **chain,SQCollectable *c) +{ + if(c->_prev) c->_prev->_next = c->_next; + else *chain = c->_next; + if(c->_next) + c->_next->_prev = c->_prev; + c->_next = NULL; + c->_prev = NULL; +} +#endif + +SQChar* SQSharedState::GetScratchPad(SQInteger size) +{ + SQInteger newsize; + if(size>0) { + if(_scratchpadsize < size) { + newsize = size + (size>>1); + _scratchpad = (SQChar *)SQ_REALLOC(_scratchpad,_scratchpadsize,newsize); + _scratchpadsize = newsize; + + }else if(_scratchpadsize >= (size<<5)) { + newsize = _scratchpadsize >> 1; + _scratchpad = (SQChar *)SQ_REALLOC(_scratchpad,_scratchpadsize,newsize); + _scratchpadsize = newsize; + } + } + return _scratchpad; +} + +RefTable::RefTable() +{ + AllocNodes(4); +} + +void RefTable::Finalize() +{ + RefNode *nodes = _nodes; + for(SQUnsignedInteger n = 0; n < _numofslots; n++) { + nodes->obj.Null(); + nodes++; + } +} + +RefTable::~RefTable() +{ + SQ_FREE(_buckets,(_numofslots * sizeof(RefNode *)) + (_numofslots * sizeof(RefNode))); +} + +#ifndef NO_GARBAGE_COLLECTOR +void RefTable::Mark(SQCollectable **chain) +{ + RefNode *nodes = (RefNode *)_nodes; + for(SQUnsignedInteger n = 0; n < _numofslots; n++) { + if(type(nodes->obj) != OT_NULL) { + SQSharedState::MarkObject(nodes->obj,chain); + } + nodes++; + } +} +#endif + +void RefTable::AddRef(SQObject &obj) +{ + SQHash mainpos; + RefNode *prev; + RefNode *ref = Get(obj,mainpos,&prev,true); + ref->refs++; +} + +SQUnsignedInteger RefTable::GetRefCount(SQObject &obj) +{ + SQHash mainpos; + RefNode *prev; + RefNode *ref = Get(obj,mainpos,&prev,true); + return ref->refs; +} + + +SQBool RefTable::Release(SQObject &obj) +{ + SQHash mainpos; + RefNode *prev; + RefNode *ref = Get(obj,mainpos,&prev,false); + if(ref) { + if(--ref->refs == 0) { + SQObjectPtr o = ref->obj; + if(prev) { + prev->next = ref->next; + } + else { + _buckets[mainpos] = ref->next; + } + ref->next = _freelist; + _freelist = ref; + _slotused--; + ref->obj.Null(); + //<>test for shrink? + return SQTrue; + } + } + else { + assert(0); + } + return SQFalse; +} + +void RefTable::Resize(SQUnsignedInteger size) +{ + RefNode **oldbucks = _buckets; + RefNode *t = _nodes; + SQUnsignedInteger oldnumofslots = _numofslots; + AllocNodes(size); + //rehash + SQUnsignedInteger nfound = 0; + for(SQUnsignedInteger n = 0; n < oldnumofslots; n++) { + if(type(t->obj) != OT_NULL) { + //add back; + assert(t->refs != 0); + RefNode *nn = Add(::HashObj(t->obj)&(_numofslots-1),t->obj); + nn->refs = t->refs; + t->obj.Null(); + nfound++; + } + t++; + } + assert(nfound == oldnumofslots); + SQ_FREE(oldbucks,(oldnumofslots * sizeof(RefNode *)) + (oldnumofslots * sizeof(RefNode))); +} + +RefTable::RefNode *RefTable::Add(SQHash mainpos,SQObject &obj) +{ + RefNode *t = _buckets[mainpos]; + RefNode *newnode = _freelist; + newnode->obj = obj; + _buckets[mainpos] = newnode; + _freelist = _freelist->next; + newnode->next = t; + assert(newnode->refs == 0); + _slotused++; + return newnode; +} + +RefTable::RefNode *RefTable::Get(SQObject &obj,SQHash &mainpos,RefNode **prev,bool add) +{ + RefNode *ref; + mainpos = ::HashObj(obj)&(_numofslots-1); + *prev = NULL; + for (ref = _buckets[mainpos]; ref; ) { + if(_rawval(ref->obj) == _rawval(obj) && type(ref->obj) == type(obj)) + break; + *prev = ref; + ref = ref->next; + } + if(ref == NULL && add) { + if(_numofslots == _slotused) { + assert(_freelist == 0); + Resize(_numofslots*2); + mainpos = ::HashObj(obj)&(_numofslots-1); + } + ref = Add(mainpos,obj); + } + return ref; +} + +void RefTable::AllocNodes(SQUnsignedInteger size) +{ + RefNode **bucks; + RefNode *nodes; + bucks = (RefNode **)SQ_MALLOC((size * sizeof(RefNode *)) + (size * sizeof(RefNode))); + nodes = (RefNode *)&bucks[size]; + RefNode *temp = nodes; + SQUnsignedInteger n; + for(n = 0; n < size - 1; n++) { + bucks[n] = NULL; + temp->refs = 0; + new (&temp->obj) SQObjectPtr; + temp->next = temp+1; + temp++; + } + bucks[n] = NULL; + temp->refs = 0; + new (&temp->obj) SQObjectPtr; + temp->next = NULL; + _freelist = nodes; + _nodes = nodes; + _buckets = bucks; + _slotused = 0; + _numofslots = size; +} +////////////////////////////////////////////////////////////////////////// +//SQStringTable +/* +* The following code is based on Lua 4.0 (Copyright 1994-2002 Tecgraf, PUC-Rio.) +* http://www.lua.org/copyright.html#4 +* http://www.lua.org/source/4.0.1/src_lstring.c.html +*/ + +SQStringTable::SQStringTable(SQSharedState *ss) +{ + _sharedstate = ss; + AllocNodes(4); + _slotused = 0; +} + +SQStringTable::~SQStringTable() +{ + SQ_FREE(_strings,sizeof(SQString*)*_numofslots); + _strings = NULL; +} + +void SQStringTable::AllocNodes(SQInteger size) +{ + _numofslots = size; + _strings = (SQString**)SQ_MALLOC(sizeof(SQString*)*_numofslots); + memset(_strings,0,sizeof(SQString*)*_numofslots); +} + +SQString *SQStringTable::Add(const SQChar *news,SQInteger len) +{ + if(len<0) + len = (SQInteger)scstrlen(news); + SQHash newhash = ::_hashstr(news,len); + SQHash h = newhash&(_numofslots-1); + SQString *s; + for (s = _strings[h]; s; s = s->_next){ + if(s->_len == len && (!memcmp(news,s->_val,sq_rsl(len)))) + return s; //found + } + + SQString *t = (SQString *)SQ_MALLOC(sq_rsl(len)+sizeof(SQString)); + new (t) SQString; + t->_sharedstate = _sharedstate; + memcpy(t->_val,news,sq_rsl(len)); + t->_val[len] = _SC('\0'); + t->_len = len; + t->_hash = newhash; + t->_next = _strings[h]; + _strings[h] = t; + _slotused++; + if (_slotused > _numofslots) /* too crowded? */ + Resize(_numofslots*2); + return t; +} + +void SQStringTable::Resize(SQInteger size) +{ + SQInteger oldsize=_numofslots; + SQString **oldtable=_strings; + AllocNodes(size); + for (SQInteger i=0; i_next; + SQHash h = p->_hash&(_numofslots-1); + p->_next = _strings[h]; + _strings[h] = p; + p = next; + } + } + SQ_FREE(oldtable,oldsize*sizeof(SQString*)); +} + +void SQStringTable::Remove(SQString *bs) +{ + SQString *s; + SQString *prev=NULL; + SQHash h = bs->_hash&(_numofslots - 1); + + for (s = _strings[h]; s; ){ + if(s == bs){ + if(prev) + prev->_next = s->_next; + else + _strings[h] = s->_next; + _slotused--; + SQInteger slen = s->_len; + s->~SQString(); + SQ_FREE(s,sizeof(SQString) + sq_rsl(slen)); + return; + } + prev = s; + s = s->_next; + } + assert(0);//if this fail something is wrong +} diff --git a/squirrel/sqstate.h b/squirrel/sqstate.h new file mode 100644 index 0000000..22b6198 --- /dev/null +++ b/squirrel/sqstate.h @@ -0,0 +1,136 @@ +/* see copyright notice in squirrel.h */ +#ifndef _SQSTATE_H_ +#define _SQSTATE_H_ + +#include "squtils.h" +#include "sqobject.h" +struct SQString; +struct SQTable; +//max number of character for a printed number +#define NUMBER_MAX_CHAR 50 + +struct SQStringTable +{ + SQStringTable(SQSharedState*ss); + ~SQStringTable(); + SQString *Add(const SQChar *,SQInteger len); + void Remove(SQString *); +private: + void Resize(SQInteger size); + void AllocNodes(SQInteger size); + SQString **_strings; + SQUnsignedInteger _numofslots; + SQUnsignedInteger _slotused; + SQSharedState *_sharedstate; +}; + +struct RefTable { + struct RefNode { + SQObjectPtr obj; + SQUnsignedInteger refs; + struct RefNode *next; + }; + RefTable(); + ~RefTable(); + void AddRef(SQObject &obj); + SQBool Release(SQObject &obj); + SQUnsignedInteger GetRefCount(SQObject &obj); +#ifndef NO_GARBAGE_COLLECTOR + void Mark(SQCollectable **chain); +#endif + void Finalize(); +private: + RefNode *Get(SQObject &obj,SQHash &mainpos,RefNode **prev,bool add); + RefNode *Add(SQHash mainpos,SQObject &obj); + void Resize(SQUnsignedInteger size); + void AllocNodes(SQUnsignedInteger size); + SQUnsignedInteger _numofslots; + SQUnsignedInteger _slotused; + RefNode *_nodes; + RefNode *_freelist; + RefNode **_buckets; +}; + +#define ADD_STRING(ss,str,len) ss->_stringtable->Add(str,len) +#define REMOVE_STRING(ss,bstr) ss->_stringtable->Remove(bstr) + +struct SQObjectPtr; + +struct SQSharedState +{ + SQSharedState(); + ~SQSharedState(); + void Init(); +public: + SQChar* GetScratchPad(SQInteger size); + SQInteger GetMetaMethodIdxByName(const SQObjectPtr &name); +#ifndef NO_GARBAGE_COLLECTOR + SQInteger CollectGarbage(SQVM *vm); + void RunMark(SQVM *vm,SQCollectable **tchain); + SQInteger ResurrectUnreachable(SQVM *vm); + static void MarkObject(SQObjectPtr &o,SQCollectable **chain); +#endif + SQObjectPtrVec *_metamethods; + SQObjectPtr _metamethodsmap; + SQObjectPtrVec *_systemstrings; + SQObjectPtrVec *_types; + SQStringTable *_stringtable; + RefTable _refs_table; + SQObjectPtr _registry; + SQObjectPtr _consts; + SQObjectPtr _constructoridx; +#ifndef NO_GARBAGE_COLLECTOR + SQCollectable *_gc_chain; +#endif + SQObjectPtr _root_vm; + SQObjectPtr _table_default_delegate; + static SQRegFunction _table_default_delegate_funcz[]; + SQObjectPtr _array_default_delegate; + static SQRegFunction _array_default_delegate_funcz[]; + SQObjectPtr _string_default_delegate; + static SQRegFunction _string_default_delegate_funcz[]; + SQObjectPtr _number_default_delegate; + static SQRegFunction _number_default_delegate_funcz[]; + SQObjectPtr _generator_default_delegate; + static SQRegFunction _generator_default_delegate_funcz[]; + SQObjectPtr _closure_default_delegate; + static SQRegFunction _closure_default_delegate_funcz[]; + SQObjectPtr _thread_default_delegate; + static SQRegFunction _thread_default_delegate_funcz[]; + SQObjectPtr _class_default_delegate; + static SQRegFunction _class_default_delegate_funcz[]; + SQObjectPtr _instance_default_delegate; + static SQRegFunction _instance_default_delegate_funcz[]; + SQObjectPtr _weakref_default_delegate; + static SQRegFunction _weakref_default_delegate_funcz[]; + + SQCOMPILERERROR _compilererrorhandler; + SQPRINTFUNCTION _printfunc; + SQPRINTFUNCTION _errorfunc; + bool _debuginfo; + bool _notifyallexceptions; + SQUserPointer _foreignptr; + SQRELEASEHOOK _releasehook; +private: + SQChar *_scratchpad; + SQInteger _scratchpadsize; +}; + +#define _sp(s) (_sharedstate->GetScratchPad(s)) +#define _spval (_sharedstate->GetScratchPad(-1)) + +#define _table_ddel _table(_sharedstate->_table_default_delegate) +#define _array_ddel _table(_sharedstate->_array_default_delegate) +#define _string_ddel _table(_sharedstate->_string_default_delegate) +#define _number_ddel _table(_sharedstate->_number_default_delegate) +#define _generator_ddel _table(_sharedstate->_generator_default_delegate) +#define _closure_ddel _table(_sharedstate->_closure_default_delegate) +#define _thread_ddel _table(_sharedstate->_thread_default_delegate) +#define _class_ddel _table(_sharedstate->_class_default_delegate) +#define _instance_ddel _table(_sharedstate->_instance_default_delegate) +#define _weakref_ddel _table(_sharedstate->_weakref_default_delegate) + +bool CompileTypemask(SQIntVec &res,const SQChar *typemask); + + +#endif //_SQSTATE_H_ diff --git a/squirrel/sqstring.h b/squirrel/sqstring.h new file mode 100644 index 0000000..235d190 --- /dev/null +++ b/squirrel/sqstring.h @@ -0,0 +1,31 @@ +/* see copyright notice in squirrel.h */ +#ifndef _SQSTRING_H_ +#define _SQSTRING_H_ + +inline SQHash _hashstr (const SQChar *s, size_t l) +{ + SQHash h = (SQHash)l; /* seed */ + size_t step = (l>>5)|1; /* if string is too long, don't hash all its chars */ + for (; l>=step; l-=step) + h = h ^ ((h<<5)+(h>>2)+(unsigned short)*(s++)); + return h; +} + +struct SQString : public SQRefCounted +{ + SQString(){} + ~SQString(){} +public: + static SQString *Create(SQSharedState *ss, const SQChar *, SQInteger len = -1 ); + SQInteger Next(const SQObjectPtr &refpos, SQObjectPtr &outkey, SQObjectPtr &outval); + void Release(); + SQSharedState *_sharedstate; + SQString *_next; //chain for the string table + SQInteger _len; + SQHash _hash; + SQChar _val[1]; +}; + + + +#endif //_SQSTRING_H_ diff --git a/squirrel/sqtable.cpp b/squirrel/sqtable.cpp new file mode 100644 index 0000000..60382fd --- /dev/null +++ b/squirrel/sqtable.cpp @@ -0,0 +1,221 @@ +/* +see copyright notice in squirrel.h +*/ +#include "sqpcheader.h" +#include "sqvm.h" +#include "sqtable.h" +#include "sqfuncproto.h" +#include "sqclosure.h" + +SQTable::SQTable(SQSharedState *ss,SQInteger nInitialSize) +{ + SQInteger pow2size=MINPOWER2; + while(nInitialSize>pow2size)pow2size=pow2size<<1; + AllocNodes(pow2size); + _usednodes = 0; + _delegate = NULL; + INIT_CHAIN(); + ADD_TO_CHAIN(&_sharedstate->_gc_chain,this); +} + +void SQTable::Remove(const SQObjectPtr &key) +{ + + _HashNode *n = _Get(key, HashObj(key) & (_numofnodes - 1)); + if (n) { + n->val.Null(); + n->key.Null(); + _usednodes--; + Rehash(false); + } +} + +void SQTable::AllocNodes(SQInteger nSize) +{ + _HashNode *nodes=(_HashNode *)SQ_MALLOC(sizeof(_HashNode)*nSize); + for(SQInteger i=0;i= oldsize-oldsize/4) /* using more than 3/4? */ + AllocNodes(oldsize*2); + else if (nelems <= oldsize/4 && /* less than 1/4? */ + oldsize > MINPOWER2) + AllocNodes(oldsize/2); + else if(force) + AllocNodes(oldsize); + else + return; + _usednodes = 0; + for (SQInteger i=0; ikey) != OT_NULL) + NewSlot(old->key,old->val); + } + for(SQInteger k=0;k_nodes; + _HashNode *src = _nodes; + _HashNode *dst = nt->_nodes; + SQInteger n = 0; + for(n = 0; n < _numofnodes; n++) { + dst->key = src->key; + dst->val = src->val; + if(src->next) { + assert(src->next > basesrc); + dst->next = basedst + (src->next - basesrc); + assert(dst != dst->next); + } + dst++; + src++; + } + assert(_firstfree > basesrc); + assert(_firstfree != NULL); + nt->_firstfree = basedst + (_firstfree - basesrc); + nt->_usednodes = _usednodes; +#else + SQInteger ridx=0; + SQObjectPtr key,val; + while((ridx=Next(true,ridx,key,val))!=-1){ + nt->NewSlot(key,val); + } +#endif + nt->SetDelegate(_delegate); + return nt; +} + +bool SQTable::Get(const SQObjectPtr &key,SQObjectPtr &val) +{ + if(type(key) == OT_NULL) + return false; + _HashNode *n = _Get(key, HashObj(key) & (_numofnodes - 1)); + if (n) { + val = _realval(n->val); + return true; + } + return false; +} +bool SQTable::NewSlot(const SQObjectPtr &key,const SQObjectPtr &val) +{ + assert(type(key) != OT_NULL); + SQHash h = HashObj(key) & (_numofnodes - 1); + _HashNode *n = _Get(key, h); + if (n) { + n->val = val; + return false; + } + _HashNode *mp = &_nodes[h]; + n = mp; + + + //key not found I'll insert it + //main pos is not free + + if(type(mp->key) != OT_NULL) { + n = _firstfree; /* get a free place */ + SQHash mph = HashObj(mp->key) & (_numofnodes - 1); + _HashNode *othern; /* main position of colliding node */ + + if (mp > n && (othern = &_nodes[mph]) != mp){ + /* yes; move colliding node into free position */ + while (othern->next != mp){ + assert(othern->next != NULL); + othern = othern->next; /* find previous */ + } + othern->next = n; /* redo the chain with `n' in place of `mp' */ + n->key = mp->key; + n->val = mp->val;/* copy colliding node into free pos. (mp->next also goes) */ + n->next = mp->next; + mp->key.Null(); + mp->val.Null(); + mp->next = NULL; /* now `mp' is free */ + } + else{ + /* new node will go into free position */ + n->next = mp->next; /* chain new position */ + mp->next = n; + mp = n; + } + } + mp->key = key; + + for (;;) { /* correct `firstfree' */ + if (type(_firstfree->key) == OT_NULL && _firstfree->next == NULL) { + mp->val = val; + _usednodes++; + return true; /* OK; table still has a free place */ + } + else if (_firstfree == _nodes) break; /* cannot decrement from here */ + else (_firstfree)--; + } + Rehash(true); + return NewSlot(key, val); +} + +SQInteger SQTable::Next(bool getweakrefs,const SQObjectPtr &refpos, SQObjectPtr &outkey, SQObjectPtr &outval) +{ + SQInteger idx = (SQInteger)TranslateIndex(refpos); + while (idx < _numofnodes) { + if(type(_nodes[idx].key) != OT_NULL) { + //first found + _HashNode &n = _nodes[idx]; + outkey = n.key; + outval = getweakrefs?(SQObject)n.val:_realval(n.val); + //return idx for the next iteration + return ++idx; + } + ++idx; + } + //nothing to iterate anymore + return -1; +} + + +bool SQTable::Set(const SQObjectPtr &key, const SQObjectPtr &val) +{ + _HashNode *n = _Get(key, HashObj(key) & (_numofnodes - 1)); + if (n) { + n->val = val; + return true; + } + return false; +} + +void SQTable::_ClearNodes() +{ + for(SQInteger i = 0;i < _numofnodes; i++) { _HashNode &n = _nodes[i]; n.key.Null(); n.val.Null(); } +} + +void SQTable::Finalize() +{ + _ClearNodes(); + SetDelegate(NULL); +} + +void SQTable::Clear() +{ + _ClearNodes(); + _usednodes = 0; + Rehash(true); +} diff --git a/squirrel/sqtable.h b/squirrel/sqtable.h new file mode 100644 index 0000000..b653b0d --- /dev/null +++ b/squirrel/sqtable.h @@ -0,0 +1,110 @@ +/* see copyright notice in squirrel.h */ +#ifndef _SQTABLE_H_ +#define _SQTABLE_H_ +/* +* The following code is based on Lua 4.0 (Copyright 1994-2002 Tecgraf, PUC-Rio.) +* http://www.lua.org/copyright.html#4 +* http://www.lua.org/source/4.0.1/src_ltable.c.html +*/ + +#include "sqstring.h" + + +#define hashptr(p) ((SQHash)(((SQInteger)p) >> 3)) + +inline SQHash HashObj(const SQObjectPtr &key) +{ + switch(type(key)) { + case OT_STRING: return _string(key)->_hash; + case OT_FLOAT: return (SQHash)((SQInteger)_float(key)); + case OT_BOOL: case OT_INTEGER: return (SQHash)((SQInteger)_integer(key)); + default: return hashptr(key._unVal.pRefCounted); + } +} + +struct SQTable : public SQDelegable +{ +private: + struct _HashNode + { + _HashNode() { next = NULL; } + SQObjectPtr val; + SQObjectPtr key; + _HashNode *next; + }; + _HashNode *_firstfree; + _HashNode *_nodes; + SQInteger _numofnodes; + SQInteger _usednodes; + +/////////////////////////// + void AllocNodes(SQInteger nSize); + void Rehash(bool force); + SQTable(SQSharedState *ss, SQInteger nInitialSize); + void _ClearNodes(); +public: + static SQTable* Create(SQSharedState *ss,SQInteger nInitialSize) + { + SQTable *newtable = (SQTable*)SQ_MALLOC(sizeof(SQTable)); + new (newtable) SQTable(ss, nInitialSize); + newtable->_delegate = NULL; + return newtable; + } + void Finalize(); + SQTable *Clone(); + ~SQTable() + { + SetDelegate(NULL); + REMOVE_FROM_CHAIN(&_sharedstate->_gc_chain, this); + for (SQInteger i = 0; i < _numofnodes; i++) _nodes[i].~_HashNode(); + SQ_FREE(_nodes, _numofnodes * sizeof(_HashNode)); + } +#ifndef NO_GARBAGE_COLLECTOR + void Mark(SQCollectable **chain); + SQObjectType GetType() {return OT_TABLE;} +#endif + inline _HashNode *_Get(const SQObjectPtr &key,SQHash hash) + { + _HashNode *n = &_nodes[hash]; + do{ + if(_rawval(n->key) == _rawval(key) && type(n->key) == type(key)){ + return n; + } + }while((n = n->next)); + return NULL; + } + //for compiler use + inline bool GetStr(const SQChar* key,SQInteger keylen,SQObjectPtr &val) + { + SQHash hash = _hashstr(key,keylen); + _HashNode *n = &_nodes[hash & (_numofnodes - 1)]; + _HashNode *res = NULL; + do{ + if(type(n->key) == OT_STRING && (scstrcmp(_stringval(n->key),key) == 0)){ + res = n; + break; + } + }while((n = n->next)); + if (res) { + val = _realval(res->val); + return true; + } + return false; + } + bool Get(const SQObjectPtr &key,SQObjectPtr &val); + void Remove(const SQObjectPtr &key); + bool Set(const SQObjectPtr &key, const SQObjectPtr &val); + //returns true if a new slot has been created false if it was already present + bool NewSlot(const SQObjectPtr &key,const SQObjectPtr &val); + SQInteger Next(bool getweakrefs,const SQObjectPtr &refpos, SQObjectPtr &outkey, SQObjectPtr &outval); + + SQInteger CountUsed(){ return _usednodes;} + void Clear(); + void Release() + { + sq_delete(this, SQTable); + } + +}; + +#endif //_SQTABLE_H_ diff --git a/squirrel/squirrel.dsp b/squirrel/squirrel.dsp new file mode 100644 index 0000000..4778b69 --- /dev/null +++ b/squirrel/squirrel.dsp @@ -0,0 +1,302 @@ +# Microsoft Developer Studio Project File - Name="squirrel" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Static Library" 0x0104 + +CFG=squirrel - Win32 Debug +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "squirrel.mak". +!MESSAGE +!MESSAGE You can specify a configuration when running NMAKE +!MESSAGE by defining the macro CFG on the command line. For example: +!MESSAGE +!MESSAGE NMAKE /f "squirrel.mak" CFG="squirrel - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "squirrel - Win32 Release" (based on "Win32 (x86) Static Library") +!MESSAGE "squirrel - Win32 Debug" (based on "Win32 (x86) Static Library") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_LocalPath ".." +CPP=cl.exe +RSC=rc.exe + +!IF "$(CFG)" == "squirrel - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release" +# PROP Intermediate_Dir "Release" +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_MBCS" /D "_LIB" /YX /FD /c +# ADD CPP /nologo /W3 /GX /O2 /I "..\include" /D "WIN32" /D "NDEBUG" /D "_MBCS" /D "_LIB" /D "GARBAGE_COLLECTOR" /YX /FD /c +# ADD BASE RSC /l 0x410 /d "NDEBUG" +# ADD RSC /l 0x410 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LIB32=link.exe -lib +# ADD BASE LIB32 /nologo +# ADD LIB32 /nologo /out:"..\lib\squirrel.lib" + +!ELSEIF "$(CFG)" == "squirrel - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "Debug" +# PROP BASE Intermediate_Dir "Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "Debug" +# PROP Intermediate_Dir "Debug" +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_MBCS" /D "_LIB" /YX /FD /GZ /c +# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /I "..\include" /D "WIN32" /D "_DEBUG" /D "_MBCS" /D "_LIB" /YX /FD /GZ /c +# ADD BASE RSC /l 0x410 /d "_DEBUG" +# ADD RSC /l 0x410 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LIB32=link.exe -lib +# ADD BASE LIB32 /nologo +# ADD LIB32 /nologo /out:"..\lib\squirrel.lib" + +!ENDIF + +# Begin Target + +# Name "squirrel - Win32 Release" +# Name "squirrel - Win32 Debug" +# Begin Group "Source Files" + +# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" +# Begin Source File + +SOURCE=.\sqapi.cpp + +!IF "$(CFG)" == "squirrel - Win32 Release" + +!ELSEIF "$(CFG)" == "squirrel - Win32 Debug" + +# ADD CPP /YX"stdafx.h" + +!ENDIF + +# End Source File +# Begin Source File + +SOURCE=.\sqbaselib.cpp + +!IF "$(CFG)" == "squirrel - Win32 Release" + +!ELSEIF "$(CFG)" == "squirrel - Win32 Debug" + +# ADD CPP /YX"stdafx.h" + +!ENDIF + +# End Source File +# Begin Source File + +SOURCE=.\sqcompiler.cpp + +!IF "$(CFG)" == "squirrel - Win32 Release" + +!ELSEIF "$(CFG)" == "squirrel - Win32 Debug" + +# ADD CPP /YX"stdafx.h" + +!ENDIF + +# End Source File +# Begin Source File + +SOURCE=.\sqdebug.cpp + +!IF "$(CFG)" == "squirrel - Win32 Release" + +!ELSEIF "$(CFG)" == "squirrel - Win32 Debug" + +# ADD CPP /YX"stdafx.h" + +!ENDIF + +# End Source File +# Begin Source File + +SOURCE=.\sqfuncstate.cpp + +!IF "$(CFG)" == "squirrel - Win32 Release" + +!ELSEIF "$(CFG)" == "squirrel - Win32 Debug" + +# ADD CPP /YX"stdafx.h" + +!ENDIF + +# End Source File +# Begin Source File + +SOURCE=.\sqlexer.cpp + +!IF "$(CFG)" == "squirrel - Win32 Release" + +!ELSEIF "$(CFG)" == "squirrel - Win32 Debug" + +# ADD CPP /YX"stdafx.h" + +!ENDIF + +# End Source File +# Begin Source File + +SOURCE=.\sqmem.cpp +# End Source File +# Begin Source File + +SOURCE=.\sqobject.cpp + +!IF "$(CFG)" == "squirrel - Win32 Release" + +!ELSEIF "$(CFG)" == "squirrel - Win32 Debug" + +# ADD CPP /YX"stdafx.h" + +!ENDIF + +# End Source File +# Begin Source File + +SOURCE=.\sqstate.cpp + +!IF "$(CFG)" == "squirrel - Win32 Release" + +!ELSEIF "$(CFG)" == "squirrel - Win32 Debug" + +# ADD CPP /YX"stdafx.h" + +!ENDIF + +# End Source File +# Begin Source File + +SOURCE=.\sqtable.cpp + +!IF "$(CFG)" == "squirrel - Win32 Release" + +!ELSEIF "$(CFG)" == "squirrel - Win32 Debug" + +# ADD CPP /YX"stdafx.h" + +!ENDIF + +# End Source File +# Begin Source File + +SOURCE=.\sqclass.cpp + +!IF "$(CFG)" == "squirrel - Win32 Release" + +!ELSEIF "$(CFG)" == "squirrel - Win32 Debug" + +# ADD CPP /YX"stdafx.h" + +!ENDIF + +# End Source File +# Begin Source File + +SOURCE=.\sqvm.cpp + +!IF "$(CFG)" == "squirrel - Win32 Release" + +!ELSEIF "$(CFG)" == "squirrel - Win32 Debug" + +# ADD CPP /YX"stdafx.h" + +!ENDIF + +# End Source File +# End Group +# Begin Group "Header Files" + +# PROP Default_Filter "h;hpp;hxx;hm;inl" +# Begin Source File + +SOURCE=.\sqarray.h +# End Source File +# Begin Source File + +SOURCE=.\sqclosure.h +# End Source File +# Begin Source File + +SOURCE=.\sqcompiler.h +# End Source File +# Begin Source File + +SOURCE=.\sqfuncproto.h +# End Source File +# Begin Source File + +SOURCE=.\sqfuncstate.h +# End Source File +# Begin Source File + +SOURCE=.\sqlexer.h +# End Source File +# Begin Source File + +SOURCE=.\sqobject.h +# End Source File +# Begin Source File + +SOURCE=.\sqopcodes.h +# End Source File +# Begin Source File + +SOURCE=.\sqpcheader.h +# End Source File +# Begin Source File + +SOURCE=.\sqstate.h +# End Source File +# Begin Source File + +SOURCE=.\sqstring.h +# End Source File +# Begin Source File + +SOURCE=.\sqtable.h +# End Source File +# Begin Source File + +SOURCE=.\squserdata.h +# End Source File +# Begin Source File + +SOURCE=.\squtils.h +# End Source File +# Begin Source File + +SOURCE=.\sqclass.h +# End Source File +# Begin Source File + +SOURCE=.\sqvm.h +# End Source File +# End Group +# End Target +# End Project diff --git a/squirrel/squserdata.h b/squirrel/squserdata.h new file mode 100644 index 0000000..dea27ae --- /dev/null +++ b/squirrel/squserdata.h @@ -0,0 +1,40 @@ +/* see copyright notice in squirrel.h */ +#ifndef _SQUSERDATA_H_ +#define _SQUSERDATA_H_ + +struct SQUserData : SQDelegable +{ + SQUserData(SQSharedState *ss){ _delegate = 0; _hook = NULL; INIT_CHAIN(); ADD_TO_CHAIN(&_ss(this)->_gc_chain, this); } + ~SQUserData() + { + REMOVE_FROM_CHAIN(&_ss(this)->_gc_chain, this); + SetDelegate(NULL); + } + static SQUserData* Create(SQSharedState *ss, SQInteger size) + { + SQUserData* ud = (SQUserData*)SQ_MALLOC(sq_aligning(sizeof(SQUserData))+size); + new (ud) SQUserData(ss); + ud->_size = size; + ud->_typetag = 0; + return ud; + } +#ifndef NO_GARBAGE_COLLECTOR + void Mark(SQCollectable **chain); + void Finalize(){SetDelegate(NULL);} + SQObjectType GetType(){ return OT_USERDATA;} +#endif + void Release() { + if (_hook) _hook((SQUserPointer)sq_aligning(this + 1),_size); + SQInteger tsize = _size; + this->~SQUserData(); + SQ_FREE(this, sq_aligning(sizeof(SQUserData)) + tsize); + } + + + SQInteger _size; + SQRELEASEHOOK _hook; + SQUserPointer _typetag; + //SQChar _val[1]; +}; + +#endif //_SQUSERDATA_H_ diff --git a/squirrel/squtils.h b/squirrel/squtils.h new file mode 100644 index 0000000..84a1176 --- /dev/null +++ b/squirrel/squtils.h @@ -0,0 +1,116 @@ +/* see copyright notice in squirrel.h */ +#ifndef _SQUTILS_H_ +#define _SQUTILS_H_ + +void *sq_vm_malloc(SQUnsignedInteger size); +void *sq_vm_realloc(void *p,SQUnsignedInteger oldsize,SQUnsignedInteger size); +void sq_vm_free(void *p,SQUnsignedInteger size); + +#define sq_new(__ptr,__type) {__ptr=(__type *)sq_vm_malloc(sizeof(__type));new (__ptr) __type;} +#define sq_delete(__ptr,__type) {__ptr->~__type();sq_vm_free(__ptr,sizeof(__type));} +#define SQ_MALLOC(__size) sq_vm_malloc((__size)); +#define SQ_FREE(__ptr,__size) sq_vm_free((__ptr),(__size)); +#define SQ_REALLOC(__ptr,__oldsize,__size) sq_vm_realloc((__ptr),(__oldsize),(__size)); + +#define sq_aligning(v) (((size_t)(v) + (SQ_ALIGNMENT-1)) & (~(SQ_ALIGNMENT-1))) + +//sqvector mini vector class, supports objects by value +template class sqvector +{ +public: + sqvector() + { + _vals = NULL; + _size = 0; + _allocated = 0; + } + sqvector(const sqvector& v) + { + copy(v); + } + void copy(const sqvector& v) + { + if(_size) { + resize(0); //destroys all previous stuff + } + //resize(v._size); + if(v._size > _allocated) { + _realloc(v._size); + } + for(SQUnsignedInteger i = 0; i < v._size; i++) { + new ((void *)&_vals[i]) T(v._vals[i]); + } + _size = v._size; + } + ~sqvector() + { + if(_allocated) { + for(SQUnsignedInteger i = 0; i < _size; i++) + _vals[i].~T(); + SQ_FREE(_vals, (_allocated * sizeof(T))); + } + } + void reserve(SQUnsignedInteger newsize) { _realloc(newsize); } + void resize(SQUnsignedInteger newsize, const T& fill = T()) + { + if(newsize > _allocated) + _realloc(newsize); + if(newsize > _size) { + while(_size < newsize) { + new ((void *)&_vals[_size]) T(fill); + _size++; + } + } + else{ + for(SQUnsignedInteger i = newsize; i < _size; i++) { + _vals[i].~T(); + } + _size = newsize; + } + } + void shrinktofit() { if(_size > 4) { _realloc(_size); } } + T& top() const { return _vals[_size - 1]; } + inline SQUnsignedInteger size() const { return _size; } + bool empty() const { return (_size <= 0); } + inline T &push_back(const T& val = T()) + { + if(_allocated <= _size) + _realloc(_size * 2); + return *(new ((void *)&_vals[_size++]) T(val)); + } + inline void pop_back() + { + _size--; _vals[_size].~T(); + } + void insert(SQUnsignedInteger idx, const T& val) + { + resize(_size + 1); + for(SQUnsignedInteger i = _size - 1; i > idx; i--) { + _vals[i] = _vals[i - 1]; + } + _vals[idx] = val; + } + void remove(SQUnsignedInteger idx) + { + _vals[idx].~T(); + if(idx < (_size - 1)) { + memmove(&_vals[idx], &_vals[idx+1], sizeof(T) * (_size - idx - 1)); + } + _size--; + } + SQUnsignedInteger capacity() { return _allocated; } + inline T &back() const { return _vals[_size - 1]; } + inline T& operator[](SQUnsignedInteger pos) const{ return _vals[pos]; } + T* _vals; +private: + void _realloc(SQUnsignedInteger newsize) + { + newsize = (newsize > 0)?newsize:4; + _vals = (T*)SQ_REALLOC(_vals, _allocated * sizeof(T), newsize * sizeof(T)); + _allocated = newsize; + } + SQUnsignedInteger _size; + SQUnsignedInteger _allocated; +}; + +#endif //_SQUTILS_H_ diff --git a/squirrel/sqvm.cpp b/squirrel/sqvm.cpp new file mode 100644 index 0000000..634f087 --- /dev/null +++ b/squirrel/sqvm.cpp @@ -0,0 +1,1744 @@ +/* + see copyright notice in squirrel.h +*/ +#include "sqpcheader.h" +#include +#include +#include "sqopcodes.h" +#include "sqvm.h" +#include "sqfuncproto.h" +#include "sqclosure.h" +#include "sqstring.h" +#include "sqtable.h" +#include "squserdata.h" +#include "sqarray.h" +#include "sqclass.h" + +#define TOP() (_stack._vals[_top-1]) + +bool SQVM::BW_OP(SQUnsignedInteger op,SQObjectPtr &trg,const SQObjectPtr &o1,const SQObjectPtr &o2) +{ + SQInteger res; + if((type(o1)|type(o2)) == OT_INTEGER) + { + SQInteger i1 = _integer(o1), i2 = _integer(o2); + switch(op) { + case BW_AND: res = i1 & i2; break; + case BW_OR: res = i1 | i2; break; + case BW_XOR: res = i1 ^ i2; break; + case BW_SHIFTL: res = i1 << i2; break; + case BW_SHIFTR: res = i1 >> i2; break; + case BW_USHIFTR:res = (SQInteger)(*((SQUnsignedInteger*)&i1) >> i2); break; + default: { Raise_Error(_SC("internal vm error bitwise op failed")); return false; } + } + } + else { Raise_Error(_SC("bitwise op between '%s' and '%s'"),GetTypeName(o1),GetTypeName(o2)); return false;} + trg = res; + return true; +} + +#define _ARITH_(op,trg,o1,o2) \ +{ \ + SQInteger tmask = type(o1)|type(o2); \ + switch(tmask) { \ + case OT_INTEGER: trg = _integer(o1) op _integer(o2);break; \ + case (OT_FLOAT|OT_INTEGER): \ + case (OT_FLOAT): trg = tofloat(o1) op tofloat(o2); break;\ + default: _GUARD(ARITH_OP((#op)[0],trg,o1,o2)); break;\ + } \ +} + +#define _ARITH_NOZERO(op,trg,o1,o2,err) \ +{ \ + SQInteger tmask = type(o1)|type(o2); \ + switch(tmask) { \ + case OT_INTEGER: { SQInteger i2 = _integer(o2); if(i2 == 0) { Raise_Error(err); SQ_THROW(); } trg = _integer(o1) op i2; } break;\ + case (OT_FLOAT|OT_INTEGER): \ + case (OT_FLOAT): trg = tofloat(o1) op tofloat(o2); break;\ + default: _GUARD(ARITH_OP((#op)[0],trg,o1,o2)); break;\ + } \ +} + +bool SQVM::ARITH_OP(SQUnsignedInteger op,SQObjectPtr &trg,const SQObjectPtr &o1,const SQObjectPtr &o2) +{ + SQInteger tmask = type(o1)|type(o2); + switch(tmask) { + case OT_INTEGER:{ + SQInteger res, i1 = _integer(o1), i2 = _integer(o2); + switch(op) { + case '+': res = i1 + i2; break; + case '-': res = i1 - i2; break; + case '/': if(i2 == 0) { Raise_Error(_SC("division by zero")); return false; } + res = i1 / i2; + break; + case '*': res = i1 * i2; break; + case '%': if(i2 == 0) { Raise_Error(_SC("modulo by zero")); return false; } + res = i1 % i2; + break; + default: res = 0xDEADBEEF; + } + trg = res; } + break; + case (OT_FLOAT|OT_INTEGER): + case (OT_FLOAT):{ + SQFloat res, f1 = tofloat(o1), f2 = tofloat(o2); + switch(op) { + case '+': res = f1 + f2; break; + case '-': res = f1 - f2; break; + case '/': res = f1 / f2; break; + case '*': res = f1 * f2; break; + case '%': res = SQFloat(fmod((double)f1,(double)f2)); break; + default: res = 0x0f; + } + trg = res; } + break; + default: + if(op == '+' && (tmask & _RT_STRING)){ + if(!StringCat(o1, o2, trg)) return false; + } + else if(!ArithMetaMethod(op,o1,o2,trg)) { + return false; + } + } + return true; +} + +SQVM::SQVM(SQSharedState *ss) +{ + _sharedstate=ss; + _suspended = SQFalse; + _suspended_target = -1; + _suspended_root = SQFalse; + _suspended_traps = -1; + _foreignptr = NULL; + _nnativecalls = 0; + _nmetamethodscall = 0; + _lasterror.Null(); + _errorhandler.Null(); + _debughook = false; + _debughook_native = NULL; + _debughook_closure.Null(); + _openouters = NULL; + ci = NULL; + _releasehook = NULL; + INIT_CHAIN();ADD_TO_CHAIN(&_ss(this)->_gc_chain,this); +} + +void SQVM::Finalize() +{ + if(_releasehook) { _releasehook(_foreignptr,0); _releasehook = NULL; } + if(_openouters) CloseOuters(&_stack._vals[0]); + _roottable.Null(); + _lasterror.Null(); + _errorhandler.Null(); + _debughook = false; + _debughook_native = NULL; + _debughook_closure.Null(); + temp_reg.Null(); + _callstackdata.resize(0); + SQInteger size=_stack.size(); + for(SQInteger i=0;i_gc_chain,this); +} + +bool SQVM::ArithMetaMethod(SQInteger op,const SQObjectPtr &o1,const SQObjectPtr &o2,SQObjectPtr &dest) +{ + SQMetaMethod mm; + switch(op){ + case _SC('+'): mm=MT_ADD; break; + case _SC('-'): mm=MT_SUB; break; + case _SC('/'): mm=MT_DIV; break; + case _SC('*'): mm=MT_MUL; break; + case _SC('%'): mm=MT_MODULO; break; + default: mm = MT_ADD; assert(0); break; //shutup compiler + } + if(is_delegable(o1) && _delegable(o1)->_delegate) { + + SQObjectPtr closure; + if(_delegable(o1)->GetMetaMethod(this, mm, closure)) { + Push(o1);Push(o2); + return CallMetaMethod(closure,mm,2,dest); + } + } + Raise_Error(_SC("arith op %c on between '%s' and '%s'"),op,GetTypeName(o1),GetTypeName(o2)); + return false; +} + +bool SQVM::NEG_OP(SQObjectPtr &trg,const SQObjectPtr &o) +{ + + switch(type(o)) { + case OT_INTEGER: + trg = -_integer(o); + return true; + case OT_FLOAT: + trg = -_float(o); + return true; + case OT_TABLE: + case OT_USERDATA: + case OT_INSTANCE: + if(_delegable(o)->_delegate) { + SQObjectPtr closure; + if(_delegable(o)->GetMetaMethod(this, MT_UNM, closure)) { + Push(o); + if(!CallMetaMethod(closure, MT_UNM, 1, temp_reg)) return false; + _Swap(trg,temp_reg); + return true; + + } + } + default:break; //shutup compiler + } + Raise_Error(_SC("attempt to negate a %s"), GetTypeName(o)); + return false; +} + +#define _RET_SUCCEED(exp) { result = (exp); return true; } +bool SQVM::ObjCmp(const SQObjectPtr &o1,const SQObjectPtr &o2,SQInteger &result) +{ + SQObjectType t1 = type(o1), t2 = type(o2); + if(t1 == t2) { + if(_rawval(o1) == _rawval(o2))_RET_SUCCEED(0); + SQObjectPtr res; + switch(t1){ + case OT_STRING: + _RET_SUCCEED(scstrcmp(_stringval(o1),_stringval(o2))); + case OT_INTEGER: + _RET_SUCCEED((_integer(o1)<_integer(o2))?-1:1); + case OT_FLOAT: + _RET_SUCCEED((_float(o1)<_float(o2))?-1:1); + case OT_TABLE: + case OT_USERDATA: + case OT_INSTANCE: + if(_delegable(o1)->_delegate) { + SQObjectPtr closure; + if(_delegable(o1)->GetMetaMethod(this, MT_CMP, closure)) { + Push(o1);Push(o2); + if(CallMetaMethod(closure,MT_CMP,2,res)) { + if(type(res) != OT_INTEGER) { + Raise_Error(_SC("_cmp must return an integer")); + return false; + } + _RET_SUCCEED(_integer(res)) + } + return false; + } + } + //continues through (no break needed) + default: + _RET_SUCCEED( _userpointer(o1) < _userpointer(o2)?-1:1 ); + } + assert(0); + //if(type(res)!=OT_INTEGER) { Raise_CompareError(o1,o2); return false; } + // _RET_SUCCEED(_integer(res)); + + } + else{ + if(sq_isnumeric(o1) && sq_isnumeric(o2)){ + if((t1==OT_INTEGER) && (t2==OT_FLOAT)) { + if( _integer(o1)==_float(o2) ) { _RET_SUCCEED(0); } + else if( _integer(o1)<_float(o2) ) { _RET_SUCCEED(-1); } + _RET_SUCCEED(1); + } + else{ + if( _float(o1)==_integer(o2) ) { _RET_SUCCEED(0); } + else if( _float(o1)<_integer(o2) ) { _RET_SUCCEED(-1); } + _RET_SUCCEED(1); + } + } + else if(t1==OT_NULL) {_RET_SUCCEED(-1);} + else if(t2==OT_NULL) {_RET_SUCCEED(1);} + else { Raise_CompareError(o1,o2); return false; } + + } + assert(0); + _RET_SUCCEED(0); //cannot happen +} + +bool SQVM::CMP_OP(CmpOP op, const SQObjectPtr &o1,const SQObjectPtr &o2,SQObjectPtr &res) +{ + SQInteger r; + if(ObjCmp(o1,o2,r)) { + switch(op) { + case CMP_G: res = (r > 0); return true; + case CMP_GE: res = (r >= 0); return true; + case CMP_L: res = (r < 0); return true; + case CMP_LE: res = (r <= 0); return true; + case CMP_3W: res = r; return true; + } + assert(0); + } + return false; +} + +bool SQVM::ToString(const SQObjectPtr &o,SQObjectPtr &res) +{ + switch(type(o)) { + case OT_STRING: + res = o; + return true; + case OT_FLOAT: + scsprintf(_sp(sq_rsl(NUMBER_MAX_CHAR+1)),sq_rsl(NUMBER_MAX_CHAR),_SC("%g"),_float(o)); + break; + case OT_INTEGER: + scsprintf(_sp(sq_rsl(NUMBER_MAX_CHAR+1)),sq_rsl(NUMBER_MAX_CHAR),_PRINT_INT_FMT,_integer(o)); + break; + case OT_BOOL: + scsprintf(_sp(sq_rsl(6)),sq_rsl(6),_integer(o)?_SC("true"):_SC("false")); + break; + case OT_TABLE: + case OT_USERDATA: + case OT_INSTANCE: + if(_delegable(o)->_delegate) { + SQObjectPtr closure; + if(_delegable(o)->GetMetaMethod(this, MT_TOSTRING, closure)) { + Push(o); + if(CallMetaMethod(closure,MT_TOSTRING,1,res)) {; + if(type(res) == OT_STRING) + return true; + } + else { + return false; + } + } + } + default: + scsprintf(_sp(sq_rsl((sizeof(void*)*2)+NUMBER_MAX_CHAR)),sq_rsl((sizeof(void*)*2)+NUMBER_MAX_CHAR),_SC("(%s : 0x%p)"),GetTypeName(o),(void*)_rawval(o)); + } + res = SQString::Create(_ss(this),_spval); + return true; +} + + +bool SQVM::StringCat(const SQObjectPtr &str,const SQObjectPtr &obj,SQObjectPtr &dest) +{ + SQObjectPtr a, b; + if(!ToString(str, a)) return false; + if(!ToString(obj, b)) return false; + SQInteger l = _string(a)->_len , ol = _string(b)->_len; + SQChar *s = _sp(sq_rsl(l + ol + 1)); + memcpy(s, _stringval(a), sq_rsl(l)); + memcpy(s + l, _stringval(b), sq_rsl(ol)); + dest = SQString::Create(_ss(this), _spval, l + ol); + return true; +} + +bool SQVM::TypeOf(const SQObjectPtr &obj1,SQObjectPtr &dest) +{ + if(is_delegable(obj1) && _delegable(obj1)->_delegate) { + SQObjectPtr closure; + if(_delegable(obj1)->GetMetaMethod(this, MT_TYPEOF, closure)) { + Push(obj1); + return CallMetaMethod(closure,MT_TYPEOF,1,dest); + } + } + dest = SQString::Create(_ss(this),GetTypeName(obj1)); + return true; +} + +bool SQVM::Init(SQVM *friendvm, SQInteger stacksize) +{ + _stack.resize(stacksize); + _alloccallsstacksize = 4; + _callstackdata.resize(_alloccallsstacksize); + _callsstacksize = 0; + _callsstack = &_callstackdata[0]; + _stackbase = 0; + _top = 0; + if(!friendvm) { + _roottable = SQTable::Create(_ss(this), 0); + sq_base_register(this); + } + else { + _roottable = friendvm->_roottable; + _errorhandler = friendvm->_errorhandler; + _debughook = friendvm->_debughook; + _debughook_native = friendvm->_debughook_native; + _debughook_closure = friendvm->_debughook_closure; + } + + + return true; +} + + +bool SQVM::StartCall(SQClosure *closure,SQInteger target,SQInteger args,SQInteger stackbase,bool tailcall) +{ + SQFunctionProto *func = closure->_function; + + SQInteger paramssize = func->_nparameters; + const SQInteger newtop = stackbase + func->_stacksize; + SQInteger nargs = args; + if(func->_varparams) + { + paramssize--; + if (nargs < paramssize) { + Raise_Error(_SC("wrong number of parameters")); + return false; + } + + //dumpstack(stackbase); + SQInteger nvargs = nargs - paramssize; + SQArray *arr = SQArray::Create(_ss(this),nvargs); + SQInteger pbase = stackbase+paramssize; + for(SQInteger n = 0; n < nvargs; n++) { + arr->_values[n] = _stack._vals[pbase]; + _stack._vals[pbase].Null(); + pbase++; + + } + _stack._vals[stackbase+paramssize] = arr; + //dumpstack(stackbase); + } + else if (paramssize != nargs) { + SQInteger ndef = func->_ndefaultparams; + SQInteger diff; + if(ndef && nargs < paramssize && (diff = paramssize - nargs) <= ndef) { + for(SQInteger n = ndef - diff; n < ndef; n++) { + _stack._vals[stackbase + (nargs++)] = closure->_defaultparams[n]; + } + } + else { + Raise_Error(_SC("wrong number of parameters")); + return false; + } + } + + if(closure->_env) { + _stack._vals[stackbase] = closure->_env->_obj; + } + + if(!EnterFrame(stackbase, newtop, tailcall)) return false; + + ci->_closure = closure; + ci->_literals = func->_literals; + ci->_ip = func->_instructions; + ci->_target = (SQInt32)target; + + if (_debughook) { + CallDebugHook(_SC('c')); + } + + if (closure->_function->_bgenerator) { + SQFunctionProto *f = closure->_function; + SQGenerator *gen = SQGenerator::Create(_ss(this), closure); + if(!gen->Yield(this,f->_stacksize)) + return false; + SQObjectPtr temp; + Return(1, target, temp); + STK(target) = gen; + } + + + return true; +} + +bool SQVM::Return(SQInteger _arg0, SQInteger _arg1, SQObjectPtr &retval) +{ + SQBool _isroot = ci->_root; + SQInteger callerbase = _stackbase - ci->_prevstkbase; + + if (_debughook) { + for(SQInteger i=0; i_ncalls; i++) { + CallDebugHook(_SC('r')); + } + } + + SQObjectPtr *dest; + if (_isroot) { + dest = &(retval); + } else if (ci->_target == -1) { + dest = NULL; + } else { + dest = &_stack._vals[callerbase + ci->_target]; + } + if (dest) { + if(_arg0 != 0xFF) { + *dest = _stack._vals[_stackbase+_arg1]; + } + else { + dest->Null(); + } + //*dest = (_arg0 != 0xFF) ? _stack._vals[_stackbase+_arg1] : _null_; + } + LeaveFrame(); + return _isroot ? true : false; +} + +#define _RET_ON_FAIL(exp) { if(!exp) return false; } + +bool SQVM::PLOCAL_INC(SQInteger op,SQObjectPtr &target, SQObjectPtr &a, SQObjectPtr &incr) +{ + SQObjectPtr trg; + _RET_ON_FAIL(ARITH_OP( op , trg, a, incr)); + target = a; + a = trg; + return true; +} + +bool SQVM::DerefInc(SQInteger op,SQObjectPtr &target, SQObjectPtr &self, SQObjectPtr &key, SQObjectPtr &incr, bool postfix,SQInteger selfidx) +{ + SQObjectPtr tmp, tself = self, tkey = key; + if (!Get(tself, tkey, tmp, 0, selfidx)) { return false; } + _RET_ON_FAIL(ARITH_OP( op , target, tmp, incr)) + if (!Set(tself, tkey, target,selfidx)) { return false; } + if (postfix) target = tmp; + return true; +} + +#define arg0 (_i_._arg0) +#define sarg0 ((SQInteger)*((signed char *)&_i_._arg0)) +#define arg1 (_i_._arg1) +#define sarg1 (*((SQInt32 *)&_i_._arg1)) +#define arg2 (_i_._arg2) +#define arg3 (_i_._arg3) +#define sarg3 ((SQInteger)*((signed char *)&_i_._arg3)) + +SQRESULT SQVM::Suspend() +{ + if (_suspended) + return sq_throwerror(this, _SC("cannot suspend an already suspended vm")); + if (_nnativecalls!=2) + return sq_throwerror(this, _SC("cannot suspend through native calls/metamethods")); + return SQ_SUSPEND_FLAG; +} + + +#define _FINISH(howmuchtojump) {jump = howmuchtojump; return true; } +bool SQVM::FOREACH_OP(SQObjectPtr &o1,SQObjectPtr &o2,SQObjectPtr +&o3,SQObjectPtr &o4,SQInteger arg_2,int exitpos,int &jump) +{ + SQInteger nrefidx; + switch(type(o1)) { + case OT_TABLE: + if((nrefidx = _table(o1)->Next(false,o4, o2, o3)) == -1) _FINISH(exitpos); + o4 = (SQInteger)nrefidx; _FINISH(1); + case OT_ARRAY: + if((nrefidx = _array(o1)->Next(o4, o2, o3)) == -1) _FINISH(exitpos); + o4 = (SQInteger) nrefidx; _FINISH(1); + case OT_STRING: + if((nrefidx = _string(o1)->Next(o4, o2, o3)) == -1)_FINISH(exitpos); + o4 = (SQInteger)nrefidx; _FINISH(1); + case OT_CLASS: + if((nrefidx = _class(o1)->Next(o4, o2, o3)) == -1)_FINISH(exitpos); + o4 = (SQInteger)nrefidx; _FINISH(1); + case OT_USERDATA: + case OT_INSTANCE: + if(_delegable(o1)->_delegate) { + SQObjectPtr itr; + SQObjectPtr closure; + if(_delegable(o1)->GetMetaMethod(this, MT_NEXTI, closure)) { + Push(o1); + Push(o4); + if(CallMetaMethod(closure, MT_NEXTI, 2, itr)) { + o4 = o2 = itr; + if(type(itr) == OT_NULL) _FINISH(exitpos); + if(!Get(o1, itr, o3, 0, DONT_FALL_BACK)) { + Raise_Error(_SC("_nexti returned an invalid idx")); // cloud be changed + return false; + } + _FINISH(1); + } + else { + return false; + } + } + Raise_Error(_SC("_nexti failed")); + return false; + } + break; + case OT_GENERATOR: + if(_generator(o1)->_state == SQGenerator::eDead) _FINISH(exitpos); + if(_generator(o1)->_state == SQGenerator::eSuspended) { + SQInteger idx = 0; + if(type(o4) == OT_INTEGER) { + idx = _integer(o4) + 1; + } + o2 = idx; + o4 = idx; + _generator(o1)->Resume(this, o3); + _FINISH(0); + } + default: + Raise_Error(_SC("cannot iterate %s"), GetTypeName(o1)); + } + return false; //cannot be hit(just to avoid warnings) +} + +#define COND_LITERAL (arg3!=0?ci->_literals[arg1]:STK(arg1)) + +#define SQ_THROW() { goto exception_trap; } + +#define _GUARD(exp) { if(!exp) { SQ_THROW();} } + +bool SQVM::CLOSURE_OP(SQObjectPtr &target, SQFunctionProto *func) +{ + SQInteger nouters; + SQClosure *closure = SQClosure::Create(_ss(this), func,_table(_roottable)->GetWeakRef(OT_TABLE)); + if((nouters = func->_noutervalues)) { + for(SQInteger i = 0; i_outervalues[i]; + switch(v._type){ + case otLOCAL: + FindOuter(closure->_outervalues[i], &STK(_integer(v._src))); + break; + case otOUTER: + closure->_outervalues[i] = _closure(ci->_closure)->_outervalues[_integer(v._src)]; + break; + } + } + } + SQInteger ndefparams; + if((ndefparams = func->_ndefaultparams)) { + for(SQInteger i = 0; i < ndefparams; i++) { + SQInteger spos = func->_defaultparams[i]; + closure->_defaultparams[i] = _stack._vals[_stackbase + spos]; + } + } + target = closure; + return true; + +} + + +bool SQVM::CLASS_OP(SQObjectPtr &target,SQInteger baseclass,SQInteger attributes) +{ + SQClass *base = NULL; + SQObjectPtr attrs; + if(baseclass != -1) { + if(type(_stack._vals[_stackbase+baseclass]) != OT_CLASS) { Raise_Error(_SC("trying to inherit from a %s"),GetTypeName(_stack._vals[_stackbase+baseclass])); return false; } + base = _class(_stack._vals[_stackbase + baseclass]); + } + if(attributes != MAX_FUNC_STACKSIZE) { + attrs = _stack._vals[_stackbase+attributes]; + } + target = SQClass::Create(_ss(this),base); + if(type(_class(target)->_metamethods[MT_INHERITED]) != OT_NULL) { + int nparams = 2; + SQObjectPtr ret; + Push(target); Push(attrs); + if(!Call(_class(target)->_metamethods[MT_INHERITED],nparams,_top - nparams, ret, false)) { + Pop(nparams); + return false; + } + Pop(nparams); + } + _class(target)->_attributes = attrs; + return true; +} + +bool SQVM::IsEqual(const SQObjectPtr &o1,const SQObjectPtr &o2,bool &res) +{ + if(type(o1) == type(o2)) { + res = (_rawval(o1) == _rawval(o2)); + } + else { + if(sq_isnumeric(o1) && sq_isnumeric(o2)) { + res = (tofloat(o1) == tofloat(o2)); + } + else { + res = false; + } + } + return true; +} + +bool SQVM::IsFalse(SQObjectPtr &o) +{ + if(((type(o) & SQOBJECT_CANBEFALSE) + && ( ((type(o) == OT_FLOAT) && (_float(o) == SQFloat(0.0))) )) +#if !defined(SQUSEDOUBLE) || (defined(SQUSEDOUBLE) && defined(_SQ64)) + || (_integer(o) == 0) ) //OT_NULL|OT_INTEGER|OT_BOOL +#else + || (((type(o) != OT_FLOAT) && (_integer(o) == 0))) ) //OT_NULL|OT_INTEGER|OT_BOOL +#endif + { + return true; + } + return false; +} +extern SQInstructionDesc g_InstrDesc[]; +bool SQVM::Execute(SQObjectPtr &closure, SQInteger nargs, SQInteger stackbase,SQObjectPtr &outres, SQBool raiseerror,ExecutionType et) +{ + if ((_nnativecalls + 1) > MAX_NATIVE_CALLS) { Raise_Error(_SC("Native stack overflow")); return false; } + _nnativecalls++; + AutoDec ad(&_nnativecalls); + SQInteger traps = 0; + CallInfo *prevci = ci; + + switch(et) { + case ET_CALL: { + temp_reg = closure; + if(!StartCall(_closure(temp_reg), _top - nargs, nargs, stackbase, false)) { + //call the handler if there are no calls in the stack, if not relies on the previous node + if(ci == NULL) CallErrorHandler(_lasterror); + return false; + } + if(ci == prevci) { + outres = STK(_top-nargs); + return true; + } + ci->_root = SQTrue; + } + break; + case ET_RESUME_GENERATOR: _generator(closure)->Resume(this, outres); ci->_root = SQTrue; traps += ci->_etraps; break; + case ET_RESUME_VM: + case ET_RESUME_THROW_VM: + traps = _suspended_traps; + ci->_root = _suspended_root; + _suspended = SQFalse; + if(et == ET_RESUME_THROW_VM) { SQ_THROW(); } + break; + } + +exception_restore: + // + { + for(;;) + { + const SQInstruction &_i_ = *ci->_ip++; + //dumpstack(_stackbase); + //scprintf("\n[%d] %s %d %d %d %d\n",ci->_ip-_closure(ci->_closure)->_function->_instructions,g_InstrDesc[_i_.op].name,arg0,arg1,arg2,arg3); + switch(_i_.op) + { + case _OP_LINE: if (_debughook) CallDebugHook(_SC('l'),arg1); continue; + case _OP_LOAD: TARGET = ci->_literals[arg1]; continue; + case _OP_LOADINT: +#ifndef _SQ64 + TARGET = (SQInteger)arg1; continue; +#else + TARGET = (SQInteger)((SQInt32)arg1); continue; +#endif + case _OP_LOADFLOAT: TARGET = *((SQFloat *)&arg1); continue; + case _OP_DLOAD: TARGET = ci->_literals[arg1]; STK(arg2) = ci->_literals[arg3];continue; + case _OP_TAILCALL:{ + SQObjectPtr &t = STK(arg1); + if (type(t) == OT_CLOSURE + && (!_closure(t)->_function->_bgenerator)){ + SQObjectPtr clo = t; + if(_openouters) CloseOuters(&(_stack._vals[_stackbase])); + for (SQInteger i = 0; i < arg3; i++) STK(i) = STK(arg2 + i); + _GUARD(StartCall(_closure(clo), ci->_target, arg3, _stackbase, true)); + continue; + } + } + case _OP_CALL: { + SQObjectPtr clo = STK(arg1); + switch (type(clo)) { + case OT_CLOSURE: + _GUARD(StartCall(_closure(clo), sarg0, arg3, _stackbase+arg2, false)); + continue; + case OT_NATIVECLOSURE: { + bool suspend; + _GUARD(CallNative(_nativeclosure(clo), arg3, _stackbase+arg2, clo,suspend)); + if(suspend){ + _suspended = SQTrue; + _suspended_target = sarg0; + _suspended_root = ci->_root; + _suspended_traps = traps; + outres = clo; + return true; + } + if(sarg0 != -1) { + STK(arg0) = clo; + } + } + continue; + case OT_CLASS:{ + SQObjectPtr inst; + _GUARD(CreateClassInstance(_class(clo),inst,clo)); + if(sarg0 != -1) { + STK(arg0) = inst; + } + SQInteger stkbase; + switch(type(clo)) { + case OT_CLOSURE: + stkbase = _stackbase+arg2; + _stack._vals[stkbase] = inst; + _GUARD(StartCall(_closure(clo), -1, arg3, stkbase, false)); + break; + case OT_NATIVECLOSURE: + bool suspend; + stkbase = _stackbase+arg2; + _stack._vals[stkbase] = inst; + _GUARD(CallNative(_nativeclosure(clo), arg3, stkbase, clo,suspend)); + break; + default: break; //shutup GCC 4.x + } + } + break; + case OT_TABLE: + case OT_USERDATA: + case OT_INSTANCE:{ + SQObjectPtr closure; + if(_delegable(clo)->_delegate && _delegable(clo)->GetMetaMethod(this,MT_CALL,closure)) { + Push(clo); + for (SQInteger i = 0; i < arg3; i++) Push(STK(arg2 + i)); + if(!CallMetaMethod(closure, MT_CALL, arg3+1, clo)) SQ_THROW(); + if(sarg0 != -1) { + STK(arg0) = clo; + } + break; + } + + //Raise_Error(_SC("attempt to call '%s'"), GetTypeName(clo)); + //SQ_THROW(); + } + default: + Raise_Error(_SC("attempt to call '%s'"), GetTypeName(clo)); + SQ_THROW(); + } + } + continue; + case _OP_PREPCALL: + case _OP_PREPCALLK: { + SQObjectPtr &key = _i_.op == _OP_PREPCALLK?(ci->_literals)[arg1]:STK(arg1); + SQObjectPtr &o = STK(arg2); + if (!Get(o, key, temp_reg,0,arg2)) { + SQ_THROW(); + } + STK(arg3) = o; + _Swap(TARGET,temp_reg);//TARGET = temp_reg; + } + continue; + case _OP_GETK: + if (!Get(STK(arg2), ci->_literals[arg1], temp_reg, 0,arg2)) { SQ_THROW();} + _Swap(TARGET,temp_reg);//TARGET = temp_reg; + continue; + case _OP_MOVE: TARGET = STK(arg1); continue; + case _OP_NEWSLOT: + _GUARD(NewSlot(STK(arg1), STK(arg2), STK(arg3),false)); + if(arg0 != 0xFF) TARGET = STK(arg3); + continue; + case _OP_DELETE: _GUARD(DeleteSlot(STK(arg1), STK(arg2), TARGET)); continue; + case _OP_SET: + if (!Set(STK(arg1), STK(arg2), STK(arg3),arg1)) { SQ_THROW(); } + if (arg0 != 0xFF) TARGET = STK(arg3); + continue; + case _OP_GET: + if (!Get(STK(arg1), STK(arg2), temp_reg, 0,arg1)) { SQ_THROW(); } + _Swap(TARGET,temp_reg);//TARGET = temp_reg; + continue; + case _OP_EQ:{ + bool res; + if(!IsEqual(STK(arg2),COND_LITERAL,res)) { SQ_THROW(); } + TARGET = res?true:false; + }continue; + case _OP_NE:{ + bool res; + if(!IsEqual(STK(arg2),COND_LITERAL,res)) { SQ_THROW(); } + TARGET = (!res)?true:false; + } continue; + case _OP_ADD: _ARITH_(+,TARGET,STK(arg2),STK(arg1)); continue; + case _OP_SUB: _ARITH_(-,TARGET,STK(arg2),STK(arg1)); continue; + case _OP_MUL: _ARITH_(*,TARGET,STK(arg2),STK(arg1)); continue; + case _OP_DIV: _ARITH_NOZERO(/,TARGET,STK(arg2),STK(arg1),_SC("division by zero")); continue; + case _OP_MOD: ARITH_OP('%',TARGET,STK(arg2),STK(arg1)); continue; + case _OP_BITW: _GUARD(BW_OP( arg3,TARGET,STK(arg2),STK(arg1))); continue; + case _OP_RETURN: + if((ci)->_generator) { + (ci)->_generator->Kill(); + } + if(Return(arg0, arg1, temp_reg)){ + assert(traps==0); + //outres = temp_reg; + _Swap(outres,temp_reg); + return true; + } + continue; + case _OP_LOADNULLS:{ for(SQInt32 n=0; n < arg1; n++) STK(arg0+n).Null(); }continue; + case _OP_LOADROOT: { + SQWeakRef *w = _closure(ci->_closure)->_root; + if(type(w->_obj) != OT_NULL) { + TARGET = w->_obj; + } else { + TARGET = _roottable; //shoud this be like this? or null + } + } + continue; + case _OP_LOADBOOL: TARGET = arg1?true:false; continue; + case _OP_DMOVE: STK(arg0) = STK(arg1); STK(arg2) = STK(arg3); continue; + case _OP_JMP: ci->_ip += (sarg1); continue; + //case _OP_JNZ: if(!IsFalse(STK(arg0))) ci->_ip+=(sarg1); continue; + case _OP_JCMP: + _GUARD(CMP_OP((CmpOP)arg3,STK(arg2),STK(arg0),temp_reg)); + if(IsFalse(temp_reg)) ci->_ip+=(sarg1); + continue; + case _OP_JZ: if(IsFalse(STK(arg0))) ci->_ip+=(sarg1); continue; + case _OP_GETOUTER: { + SQClosure *cur_cls = _closure(ci->_closure); + SQOuter *otr = _outer(cur_cls->_outervalues[arg1]); + TARGET = *(otr->_valptr); + } + continue; + case _OP_SETOUTER: { + SQClosure *cur_cls = _closure(ci->_closure); + SQOuter *otr = _outer(cur_cls->_outervalues[arg1]); + *(otr->_valptr) = STK(arg2); + if(arg0 != 0xFF) { + TARGET = STK(arg2); + } + } + continue; + case _OP_NEWOBJ: + switch(arg3) { + case NOT_TABLE: TARGET = SQTable::Create(_ss(this), arg1); continue; + case NOT_ARRAY: TARGET = SQArray::Create(_ss(this), 0); _array(TARGET)->Reserve(arg1); continue; + case NOT_CLASS: _GUARD(CLASS_OP(TARGET,arg1,arg2)); continue; + default: assert(0); continue; + } + case _OP_APPENDARRAY: + { + SQObject val; + val._unVal.raw = 0; + switch(arg2) { + case AAT_STACK: + val = STK(arg1); break; + case AAT_LITERAL: + val = ci->_literals[arg1]; break; + case AAT_INT: + val._type = OT_INTEGER; +#ifndef _SQ64 + val._unVal.nInteger = (SQInteger)arg1; +#else + val._unVal.nInteger = (SQInteger)((SQInt32)arg1); +#endif + break; + case AAT_FLOAT: + val._type = OT_FLOAT; + val._unVal.fFloat = *((SQFloat *)&arg1); + break; + case AAT_BOOL: + val._type = OT_BOOL; + val._unVal.nInteger = arg1; + break; + default: val._type = OT_INTEGER; assert(0); break; + + } + _array(STK(arg0))->Append(val); continue; + } + case _OP_COMPARITH: { + SQInteger selfidx = (((SQUnsignedInteger)arg1&0xFFFF0000)>>16); + _GUARD(DerefInc(arg3, TARGET, STK(selfidx), STK(arg2), STK(arg1&0x0000FFFF), false, selfidx)); + } + continue; + case _OP_INC: {SQObjectPtr o(sarg3); _GUARD(DerefInc('+',TARGET, STK(arg1), STK(arg2), o, false, arg1));} continue; + case _OP_INCL: { + SQObjectPtr &a = STK(arg1); + if(type(a) == OT_INTEGER) { + a._unVal.nInteger = _integer(a) + sarg3; + } + else { + SQObjectPtr o(sarg3); //_GUARD(LOCAL_INC('+',TARGET, STK(arg1), o)); + _ARITH_(+,a,a,o); + } + } continue; + case _OP_PINC: {SQObjectPtr o(sarg3); _GUARD(DerefInc('+',TARGET, STK(arg1), STK(arg2), o, true, arg1));} continue; + case _OP_PINCL: { + SQObjectPtr &a = STK(arg1); + if(type(a) == OT_INTEGER) { + TARGET = a; + a._unVal.nInteger = _integer(a) + sarg3; + } + else { + SQObjectPtr o(sarg3); _GUARD(PLOCAL_INC('+',TARGET, STK(arg1), o)); + } + + } continue; + case _OP_CMP: _GUARD(CMP_OP((CmpOP)arg3,STK(arg2),STK(arg1),TARGET)) continue; + case _OP_EXISTS: TARGET = Get(STK(arg1), STK(arg2), temp_reg, GET_FLAG_DO_NOT_RAISE_ERROR | GET_FLAG_RAW, DONT_FALL_BACK) ? true : false; continue; + case _OP_INSTANCEOF: + if(type(STK(arg1)) != OT_CLASS) + {Raise_Error(_SC("cannot apply instanceof between a %s and a %s"),GetTypeName(STK(arg1)),GetTypeName(STK(arg2))); SQ_THROW();} + TARGET = (type(STK(arg2)) == OT_INSTANCE) ? (_instance(STK(arg2))->InstanceOf(_class(STK(arg1)))?true:false) : false; + continue; + case _OP_AND: + if(IsFalse(STK(arg2))) { + TARGET = STK(arg2); + ci->_ip += (sarg1); + } + continue; + case _OP_OR: + if(!IsFalse(STK(arg2))) { + TARGET = STK(arg2); + ci->_ip += (sarg1); + } + continue; + case _OP_NEG: _GUARD(NEG_OP(TARGET,STK(arg1))); continue; + case _OP_NOT: TARGET = IsFalse(STK(arg1)); continue; + case _OP_BWNOT: + if(type(STK(arg1)) == OT_INTEGER) { + SQInteger t = _integer(STK(arg1)); + TARGET = SQInteger(~t); + continue; + } + Raise_Error(_SC("attempt to perform a bitwise op on a %s"), GetTypeName(STK(arg1))); + SQ_THROW(); + case _OP_CLOSURE: { + SQClosure *c = ci->_closure._unVal.pClosure; + SQFunctionProto *fp = c->_function; + if(!CLOSURE_OP(TARGET,fp->_functions[arg1]._unVal.pFunctionProto)) { SQ_THROW(); } + continue; + } + case _OP_YIELD:{ + if(ci->_generator) { + if(sarg1 != MAX_FUNC_STACKSIZE) temp_reg = STK(arg1); + _GUARD(ci->_generator->Yield(this,arg2)); + traps -= ci->_etraps; + if(sarg1 != MAX_FUNC_STACKSIZE) _Swap(STK(arg1),temp_reg);//STK(arg1) = temp_reg; + } + else { Raise_Error(_SC("trying to yield a '%s',only genenerator can be yielded"), GetTypeName(ci->_generator)); SQ_THROW();} + if(Return(arg0, arg1, temp_reg)){ + assert(traps == 0); + outres = temp_reg; + return true; + } + + } + continue; + case _OP_RESUME: + if(type(STK(arg1)) != OT_GENERATOR){ Raise_Error(_SC("trying to resume a '%s',only genenerator can be resumed"), GetTypeName(STK(arg1))); SQ_THROW();} + _GUARD(_generator(STK(arg1))->Resume(this, TARGET)); + traps += ci->_etraps; + continue; + case _OP_FOREACH:{ int tojump; + _GUARD(FOREACH_OP(STK(arg0),STK(arg2),STK(arg2+1),STK(arg2+2),arg2,sarg1,tojump)); + ci->_ip += tojump; } + continue; + case _OP_POSTFOREACH: + assert(type(STK(arg0)) == OT_GENERATOR); + if(_generator(STK(arg0))->_state == SQGenerator::eDead) + ci->_ip += (sarg1 - 1); + continue; + case _OP_CLONE: _GUARD(Clone(STK(arg1), TARGET)); continue; + case _OP_TYPEOF: _GUARD(TypeOf(STK(arg1), TARGET)) continue; + case _OP_PUSHTRAP:{ + SQInstruction *_iv = _closure(ci->_closure)->_function->_instructions; + _etraps.push_back(SQExceptionTrap(_top,_stackbase, &_iv[(ci->_ip-_iv)+arg1], arg0)); traps++; + ci->_etraps++; + } + continue; + case _OP_POPTRAP: { + for(SQInteger i = 0; i < arg0; i++) { + _etraps.pop_back(); traps--; + ci->_etraps--; + } + } + continue; + case _OP_THROW: Raise_Error(TARGET); SQ_THROW(); continue; + case _OP_NEWSLOTA: + _GUARD(NewSlotA(STK(arg1),STK(arg2),STK(arg3),(arg0&NEW_SLOT_ATTRIBUTES_FLAG) ? STK(arg2-1) : SQObjectPtr(),(arg0&NEW_SLOT_STATIC_FLAG)?true:false,false)); + continue; + case _OP_GETBASE:{ + SQClosure *clo = _closure(ci->_closure); + if(clo->_base) { + TARGET = clo->_base; + } + else { + TARGET.Null(); + } + continue; + } + case _OP_CLOSE: + if(_openouters) CloseOuters(&(STK(arg1))); + continue; + } + + } + } +exception_trap: + { + SQObjectPtr currerror = _lasterror; +// dumpstack(_stackbase); +// SQInteger n = 0; + SQInteger last_top = _top; + + if(_ss(this)->_notifyallexceptions || (!traps && raiseerror)) CallErrorHandler(currerror); + + while( ci ) { + if(ci->_etraps > 0) { + SQExceptionTrap &et = _etraps.top(); + ci->_ip = et._ip; + _top = et._stacksize; + _stackbase = et._stackbase; + _stack._vals[_stackbase + et._extarget] = currerror; + _etraps.pop_back(); traps--; ci->_etraps--; + while(last_top >= _top) _stack._vals[last_top--].Null(); + goto exception_restore; + } + else if (_debughook) { + //notify debugger of a "return" + //even if it really an exception unwinding the stack + for(SQInteger i = 0; i < ci->_ncalls; i++) { + CallDebugHook(_SC('r')); + } + } + if(ci->_generator) ci->_generator->Kill(); + bool mustbreak = ci && ci->_root; + LeaveFrame(); + if(mustbreak) break; + } + + _lasterror = currerror; + return false; + } + assert(0); +} + +bool SQVM::CreateClassInstance(SQClass *theclass, SQObjectPtr &inst, SQObjectPtr &constructor) +{ + inst = theclass->CreateInstance(); + if(!theclass->GetConstructor(constructor)) { + constructor.Null(); + } + return true; +} + +void SQVM::CallErrorHandler(SQObjectPtr &error) +{ + if(type(_errorhandler) != OT_NULL) { + SQObjectPtr out; + Push(_roottable); Push(error); + Call(_errorhandler, 2, _top-2, out,SQFalse); + Pop(2); + } +} + + +void SQVM::CallDebugHook(SQInteger type,SQInteger forcedline) +{ + _debughook = false; + SQFunctionProto *func=_closure(ci->_closure)->_function; + if(_debughook_native) { + const SQChar *src = type(func->_sourcename) == OT_STRING?_stringval(func->_sourcename):NULL; + const SQChar *fname = type(func->_name) == OT_STRING?_stringval(func->_name):NULL; + SQInteger line = forcedline?forcedline:func->GetLine(ci->_ip); + _debughook_native(this,type,src,line,fname); + } + else { + SQObjectPtr temp_reg; + SQInteger nparams=5; + Push(_roottable); Push(type); Push(func->_sourcename); Push(forcedline?forcedline:func->GetLine(ci->_ip)); Push(func->_name); + Call(_debughook_closure,nparams,_top-nparams,temp_reg,SQFalse); + Pop(nparams); + } + _debughook = true; +} + +bool SQVM::CallNative(SQNativeClosure *nclosure, SQInteger nargs, SQInteger newbase, SQObjectPtr &retval, bool &suspend) +{ + SQInteger nparamscheck = nclosure->_nparamscheck; + SQInteger newtop = newbase + nargs + nclosure->_noutervalues; + + if (_nnativecalls + 1 > MAX_NATIVE_CALLS) { + Raise_Error(_SC("Native stack overflow")); + return false; + } + + if(nparamscheck && (((nparamscheck > 0) && (nparamscheck != nargs)) || + ((nparamscheck < 0) && (nargs < (-nparamscheck))))) + { + Raise_Error(_SC("wrong number of parameters")); + return false; + } + + SQInteger tcs; + SQIntVec &tc = nclosure->_typecheck; + if((tcs = tc.size())) { + for(SQInteger i = 0; i < nargs && i < tcs; i++) { + if((tc._vals[i] != -1) && !(type(_stack._vals[newbase+i]) & tc._vals[i])) { + Raise_ParamTypeError(i,tc._vals[i],type(_stack._vals[newbase+i])); + return false; + } + } + } + + if(!EnterFrame(newbase, newtop, false)) return false; + ci->_closure = nclosure; + + SQInteger outers = nclosure->_noutervalues; + for (SQInteger i = 0; i < outers; i++) { + _stack._vals[newbase+nargs+i] = nclosure->_outervalues[i]; + } + if(nclosure->_env) { + _stack._vals[newbase] = nclosure->_env->_obj; + } + + _nnativecalls++; + SQInteger ret = (nclosure->_function)(this); + _nnativecalls--; + + suspend = false; + if (ret == SQ_SUSPEND_FLAG) { + suspend = true; + } + else if (ret < 0) { + LeaveFrame(); + Raise_Error(_lasterror); + return false; + } + if(ret) { + retval = _stack._vals[_top-1]; + } + else { + retval.Null(); + } + //retval = ret ? _stack._vals[_top-1] : _null_; + LeaveFrame(); + return true; +} + +#define FALLBACK_OK 0 +#define FALLBACK_NO_MATCH 1 +#define FALLBACK_ERROR 2 + +bool SQVM::Get(const SQObjectPtr &self, const SQObjectPtr &key, SQObjectPtr &dest, SQUnsignedInteger getflags, SQInteger selfidx) +{ + switch(type(self)){ + case OT_TABLE: + if(_table(self)->Get(key,dest))return true; + break; + case OT_ARRAY: + if (sq_isnumeric(key)) { if (_array(self)->Get(tointeger(key), dest)) { return true; } if ((getflags & GET_FLAG_DO_NOT_RAISE_ERROR) == 0) Raise_IdxError(key); return false; } + break; + case OT_INSTANCE: + if(_instance(self)->Get(key,dest)) return true; + break; + case OT_CLASS: + if(_class(self)->Get(key,dest)) return true; + break; + case OT_STRING: + if(sq_isnumeric(key)){ + SQInteger n = tointeger(key); + if(abs((int)n) < _string(self)->_len) { + if(n < 0) n = _string(self)->_len - n; + dest = SQInteger(_stringval(self)[n]); + return true; + } + if ((getflags & GET_FLAG_DO_NOT_RAISE_ERROR) == 0) Raise_IdxError(key); + return false; + } + break; + default:break; //shut up compiler + } + if ((getflags & GET_FLAG_RAW) == 0) { + switch(FallBackGet(self,key,dest)) { + case FALLBACK_OK: return true; //okie + case FALLBACK_NO_MATCH: break; //keep falling back + case FALLBACK_ERROR: return false; // the metamethod failed + } + if(InvokeDefaultDelegate(self,key,dest)) { + return true; + } + } +//#ifdef ROOT_FALLBACK + if(selfidx == 0) { + SQWeakRef *w = _closure(ci->_closure)->_root; + if(type(w->_obj) != OT_NULL) + { + if(Get(*((const SQObjectPtr *)&w->_obj),key,dest,0,DONT_FALL_BACK)) return true; + } + + } +//#endif + if ((getflags & GET_FLAG_DO_NOT_RAISE_ERROR) == 0) Raise_IdxError(key); + return false; +} + +bool SQVM::InvokeDefaultDelegate(const SQObjectPtr &self,const SQObjectPtr &key,SQObjectPtr &dest) +{ + SQTable *ddel = NULL; + switch(type(self)) { + case OT_CLASS: ddel = _class_ddel; break; + case OT_TABLE: ddel = _table_ddel; break; + case OT_ARRAY: ddel = _array_ddel; break; + case OT_STRING: ddel = _string_ddel; break; + case OT_INSTANCE: ddel = _instance_ddel; break; + case OT_INTEGER:case OT_FLOAT:case OT_BOOL: ddel = _number_ddel; break; + case OT_GENERATOR: ddel = _generator_ddel; break; + case OT_CLOSURE: case OT_NATIVECLOSURE: ddel = _closure_ddel; break; + case OT_THREAD: ddel = _thread_ddel; break; + case OT_WEAKREF: ddel = _weakref_ddel; break; + default: return false; + } + return ddel->Get(key,dest); +} + + +SQInteger SQVM::FallBackGet(const SQObjectPtr &self,const SQObjectPtr &key,SQObjectPtr &dest) +{ + switch(type(self)){ + case OT_TABLE: + case OT_USERDATA: + //delegation + if(_delegable(self)->_delegate) { + if(Get(SQObjectPtr(_delegable(self)->_delegate),key,dest,0,DONT_FALL_BACK)) return FALLBACK_OK; + } + else { + return FALLBACK_NO_MATCH; + } + //go through + case OT_INSTANCE: { + SQObjectPtr closure; + if(_delegable(self)->GetMetaMethod(this, MT_GET, closure)) { + Push(self);Push(key); + _nmetamethodscall++; + AutoDec ad(&_nmetamethodscall); + if(Call(closure, 2, _top - 2, dest, SQFalse)) { + Pop(2); + return FALLBACK_OK; + } + else { + Pop(2); + if(type(_lasterror) != OT_NULL) { //NULL means "clean failure" (not found) + return FALLBACK_ERROR; + } + } + } + } + break; + default: break;//shutup GCC 4.x + } + // no metamethod or no fallback type + return FALLBACK_NO_MATCH; +} + +bool SQVM::Set(const SQObjectPtr &self,const SQObjectPtr &key,const SQObjectPtr &val,SQInteger selfidx) +{ + switch(type(self)){ + case OT_TABLE: + if(_table(self)->Set(key,val)) return true; + break; + case OT_INSTANCE: + if(_instance(self)->Set(key,val)) return true; + break; + case OT_ARRAY: + if(!sq_isnumeric(key)) { Raise_Error(_SC("indexing %s with %s"),GetTypeName(self),GetTypeName(key)); return false; } + if(!_array(self)->Set(tointeger(key),val)) { + Raise_IdxError(key); + return false; + } + return true; + default: + Raise_Error(_SC("trying to set '%s'"),GetTypeName(self)); + return false; + } + + switch(FallBackSet(self,key,val)) { + case FALLBACK_OK: return true; //okie + case FALLBACK_NO_MATCH: break; //keep falling back + case FALLBACK_ERROR: return false; // the metamethod failed + } + if(selfidx == 0) { + if(_table(_roottable)->Set(key,val)) + return true; + } + Raise_IdxError(key); + return false; +} + +SQInteger SQVM::FallBackSet(const SQObjectPtr &self,const SQObjectPtr &key,const SQObjectPtr &val) +{ + switch(type(self)) { + case OT_TABLE: + if(_table(self)->_delegate) { + if(Set(_table(self)->_delegate,key,val,DONT_FALL_BACK)) return FALLBACK_OK; + } + //keps on going + case OT_INSTANCE: + case OT_USERDATA:{ + SQObjectPtr closure; + SQObjectPtr t; + if(_delegable(self)->GetMetaMethod(this, MT_SET, closure)) { + Push(self);Push(key);Push(val); + _nmetamethodscall++; + AutoDec ad(&_nmetamethodscall); + if(Call(closure, 3, _top - 3, t, SQFalse)) { + Pop(3); + return FALLBACK_OK; + } + else { + if(type(_lasterror) != OT_NULL) { //NULL means "clean failure" (not found) + //error + Pop(3); + return FALLBACK_ERROR; + } + } + } + } + break; + default: break;//shutup GCC 4.x + } + // no metamethod or no fallback type + return FALLBACK_NO_MATCH; +} + +bool SQVM::Clone(const SQObjectPtr &self,SQObjectPtr &target) +{ + SQObjectPtr temp_reg; + SQObjectPtr newobj; + switch(type(self)){ + case OT_TABLE: + newobj = _table(self)->Clone(); + goto cloned_mt; + case OT_INSTANCE: { + newobj = _instance(self)->Clone(_ss(this)); +cloned_mt: + SQObjectPtr closure; + if(_delegable(newobj)->_delegate && _delegable(newobj)->GetMetaMethod(this,MT_CLONED,closure)) { + Push(newobj); + Push(self); + if(!CallMetaMethod(closure,MT_CLONED,2,temp_reg)) + return false; + } + } + target = newobj; + return true; + case OT_ARRAY: + target = _array(self)->Clone(); + return true; + default: + Raise_Error(_SC("cloning a %s"), GetTypeName(self)); + return false; + } +} + +bool SQVM::NewSlotA(const SQObjectPtr &self,const SQObjectPtr &key,const SQObjectPtr &val,const SQObjectPtr &attrs,bool bstatic,bool raw) +{ + if(type(self) != OT_CLASS) { + Raise_Error(_SC("object must be a class")); + return false; + } + SQClass *c = _class(self); + if(!raw) { + SQObjectPtr &mm = c->_metamethods[MT_NEWMEMBER]; + if(type(mm) != OT_NULL ) { + Push(self); Push(key); Push(val); + Push(attrs); + Push(bstatic); + return CallMetaMethod(mm,MT_NEWMEMBER,5,temp_reg); + } + } + if(!NewSlot(self, key, val,bstatic)) + return false; + if(type(attrs) != OT_NULL) { + c->SetAttributes(key,attrs); + } + return true; +} + +bool SQVM::NewSlot(const SQObjectPtr &self,const SQObjectPtr &key,const SQObjectPtr &val,bool bstatic) +{ + if(type(key) == OT_NULL) { Raise_Error(_SC("null cannot be used as index")); return false; } + switch(type(self)) { + case OT_TABLE: { + bool rawcall = true; + if(_table(self)->_delegate) { + SQObjectPtr res; + if(!_table(self)->Get(key,res)) { + SQObjectPtr closure; + if(_delegable(self)->_delegate && _delegable(self)->GetMetaMethod(this,MT_NEWSLOT,closure)) { + Push(self);Push(key);Push(val); + if(!CallMetaMethod(closure,MT_NEWSLOT,3,res)) { + return false; + } + rawcall = false; + } + else { + rawcall = true; + } + } + } + if(rawcall) _table(self)->NewSlot(key,val); //cannot fail + + break;} + case OT_INSTANCE: { + SQObjectPtr res; + SQObjectPtr closure; + if(_delegable(self)->_delegate && _delegable(self)->GetMetaMethod(this,MT_NEWSLOT,closure)) { + Push(self);Push(key);Push(val); + if(!CallMetaMethod(closure,MT_NEWSLOT,3,res)) { + return false; + } + break; + } + Raise_Error(_SC("class instances do not support the new slot operator")); + return false; + break;} + case OT_CLASS: + if(!_class(self)->NewSlot(_ss(this),key,val,bstatic)) { + if(_class(self)->_locked) { + Raise_Error(_SC("trying to modify a class that has already been instantiated")); + return false; + } + else { + SQObjectPtr oval = PrintObjVal(key); + Raise_Error(_SC("the property '%s' already exists"),_stringval(oval)); + return false; + } + } + break; + default: + Raise_Error(_SC("indexing %s with %s"),GetTypeName(self),GetTypeName(key)); + return false; + break; + } + return true; +} + + + +bool SQVM::DeleteSlot(const SQObjectPtr &self,const SQObjectPtr &key,SQObjectPtr &res) +{ + switch(type(self)) { + case OT_TABLE: + case OT_INSTANCE: + case OT_USERDATA: { + SQObjectPtr t; + //bool handled = false; + SQObjectPtr closure; + if(_delegable(self)->_delegate && _delegable(self)->GetMetaMethod(this,MT_DELSLOT,closure)) { + Push(self);Push(key); + return CallMetaMethod(closure,MT_DELSLOT,2,res); + } + else { + if(type(self) == OT_TABLE) { + if(_table(self)->Get(key,t)) { + _table(self)->Remove(key); + } + else { + Raise_IdxError((SQObject &)key); + return false; + } + } + else { + Raise_Error(_SC("cannot delete a slot from %s"),GetTypeName(self)); + return false; + } + } + res = t; + } + break; + default: + Raise_Error(_SC("attempt to delete a slot from a %s"),GetTypeName(self)); + return false; + } + return true; +} + +bool SQVM::Call(SQObjectPtr &closure,SQInteger nparams,SQInteger stackbase,SQObjectPtr &outres,SQBool raiseerror) +{ +#ifdef _DEBUG +SQInteger prevstackbase = _stackbase; +#endif + switch(type(closure)) { + case OT_CLOSURE: + return Execute(closure, nparams, stackbase, outres, raiseerror); + break; + case OT_NATIVECLOSURE:{ + bool suspend; + return CallNative(_nativeclosure(closure), nparams, stackbase, outres,suspend); + + } + break; + case OT_CLASS: { + SQObjectPtr constr; + SQObjectPtr temp; + CreateClassInstance(_class(closure),outres,constr); + if(type(constr) != OT_NULL) { + _stack[stackbase] = outres; + return Call(constr,nparams,stackbase,temp,raiseerror); + } + return true; + } + break; + default: + return false; + } +#ifdef _DEBUG + if(!_suspended) { + assert(_stackbase == prevstackbase); + } +#endif + return true; +} + +bool SQVM::CallMetaMethod(SQObjectPtr &closure,SQMetaMethod mm,SQInteger nparams,SQObjectPtr &outres) +{ + //SQObjectPtr closure; + + _nmetamethodscall++; + if(Call(closure, nparams, _top - nparams, outres, SQFalse)) { + _nmetamethodscall--; + Pop(nparams); + return true; + } + _nmetamethodscall--; + //} + Pop(nparams); + return false; +} + +void SQVM::FindOuter(SQObjectPtr &target, SQObjectPtr *stackindex) +{ + SQOuter **pp = &_openouters; + SQOuter *p; + SQOuter *otr; + + while ((p = *pp) != NULL && p->_valptr >= stackindex) { + if (p->_valptr == stackindex) { + target = SQObjectPtr(p); + return; + } + pp = &p->_next; + } + otr = SQOuter::Create(_ss(this), stackindex); + otr->_next = *pp; + otr->_idx = (stackindex - _stack._vals); + __ObjAddRef(otr); + *pp = otr; + target = SQObjectPtr(otr); +} + +bool SQVM::EnterFrame(SQInteger newbase, SQInteger newtop, bool tailcall) +{ + if( !tailcall ) { + if( _callsstacksize == _alloccallsstacksize ) { + GrowCallStack(); + } + ci = &_callsstack[_callsstacksize++]; + ci->_prevstkbase = (SQInt32)(newbase - _stackbase); + ci->_prevtop = (SQInt32)(_top - _stackbase); + ci->_etraps = 0; + ci->_ncalls = 1; + ci->_generator = NULL; + ci->_root = SQFalse; + } + else { + ci->_ncalls++; + } + + _stackbase = newbase; + _top = newtop; + if(newtop + MIN_STACK_OVERHEAD > (SQInteger)_stack.size()) { + if(_nmetamethodscall) { + Raise_Error(_SC("stack overflow, cannot resize stack while in a metamethod")); + return false; + } + _stack.resize(_stack.size() + (MIN_STACK_OVERHEAD << 2)); + RelocateOuters(); + } + return true; +} + +void SQVM::LeaveFrame() { + SQInteger last_top = _top; + SQInteger last_stackbase = _stackbase; + SQInteger css = --_callsstacksize; + + /* First clean out the call stack frame */ + ci->_closure.Null(); + _stackbase -= ci->_prevstkbase; + _top = _stackbase + ci->_prevtop; + ci = (css) ? &_callsstack[css-1] : NULL; + + if(_openouters) CloseOuters(&(_stack._vals[last_stackbase])); + while (last_top >= _top) { + _stack._vals[last_top--].Null(); + } +} + +void SQVM::RelocateOuters() +{ + SQOuter *p = _openouters; + while (p) { + p->_valptr = _stack._vals + p->_idx; + p = p->_next; + } +} + +void SQVM::CloseOuters(SQObjectPtr *stackindex) { + SQOuter *p; + while ((p = _openouters) != NULL && p->_valptr >= stackindex) { + p->_value = *(p->_valptr); + p->_valptr = &p->_value; + _openouters = p->_next; + __ObjRelease(p); + } +} + +void SQVM::Remove(SQInteger n) { + n = (n >= 0)?n + _stackbase - 1:_top + n; + for(SQInteger i = n; i < _top; i++){ + _stack[i] = _stack[i+1]; + } + _stack[_top].Null(); + _top--; +} + +void SQVM::Pop() { + _stack[--_top].Null(); +} + +void SQVM::Pop(SQInteger n) { + for(SQInteger i = 0; i < n; i++){ + _stack[--_top].Null(); + } +} + +void SQVM::PushNull() { _stack[_top++].Null(); } +void SQVM::Push(const SQObjectPtr &o) { _stack[_top++] = o; } +SQObjectPtr &SQVM::Top() { return _stack[_top-1]; } +SQObjectPtr &SQVM::PopGet() { return _stack[--_top]; } +SQObjectPtr &SQVM::GetUp(SQInteger n) { return _stack[_top+n]; } +SQObjectPtr &SQVM::GetAt(SQInteger n) { return _stack[n]; } + +#ifdef _DEBUG_DUMP +void SQVM::dumpstack(SQInteger stackbase,bool dumpall) +{ + SQInteger size=dumpall?_stack.size():_top; + SQInteger n=0; + scprintf(_SC("\n>>>>stack dump<<<<\n")); + CallInfo &ci=_callsstack[_callsstacksize-1]; + scprintf(_SC("IP: %p\n"),ci._ip); + scprintf(_SC("prev stack base: %d\n"),ci._prevstkbase); + scprintf(_SC("prev top: %d\n"),ci._prevtop); + for(SQInteger i=0;i"));else scprintf(_SC(" ")); + scprintf(_SC("[%d]:"),n); + switch(type(obj)){ + case OT_FLOAT: scprintf(_SC("FLOAT %.3f"),_float(obj));break; + case OT_INTEGER: scprintf(_SC("INTEGER %d"),_integer(obj));break; + case OT_BOOL: scprintf(_SC("BOOL %s"),_integer(obj)?"true":"false");break; + case OT_STRING: scprintf(_SC("STRING %s"),_stringval(obj));break; + case OT_NULL: scprintf(_SC("NULL")); break; + case OT_TABLE: scprintf(_SC("TABLE %p[%p]"),_table(obj),_table(obj)->_delegate);break; + case OT_ARRAY: scprintf(_SC("ARRAY %p"),_array(obj));break; + case OT_CLOSURE: scprintf(_SC("CLOSURE [%p]"),_closure(obj));break; + case OT_NATIVECLOSURE: scprintf(_SC("NATIVECLOSURE"));break; + case OT_USERDATA: scprintf(_SC("USERDATA %p[%p]"),_userdataval(obj),_userdata(obj)->_delegate);break; + case OT_GENERATOR: scprintf(_SC("GENERATOR %p"),_generator(obj));break; + case OT_THREAD: scprintf(_SC("THREAD [%p]"),_thread(obj));break; + case OT_USERPOINTER: scprintf(_SC("USERPOINTER %p"),_userpointer(obj));break; + case OT_CLASS: scprintf(_SC("CLASS %p"),_class(obj));break; + case OT_INSTANCE: scprintf(_SC("INSTANCE %p"),_instance(obj));break; + case OT_WEAKREF: scprintf(_SC("WEAKERF %p"),_weakref(obj));break; + default: + assert(0); + break; + }; + scprintf(_SC("\n")); + ++n; + } +} + + + +#endif diff --git a/squirrel/sqvm.h b/squirrel/sqvm.h new file mode 100644 index 0000000..bdfa1bc --- /dev/null +++ b/squirrel/sqvm.h @@ -0,0 +1,214 @@ +/* see copyright notice in squirrel.h */ +#ifndef _SQVM_H_ +#define _SQVM_H_ + +#include "sqopcodes.h" +#include "sqobject.h" +#define MAX_NATIVE_CALLS 100 +#define MIN_STACK_OVERHEAD 15 + +#define SQ_SUSPEND_FLAG -666 +#define DONT_FALL_BACK 666 +//#define EXISTS_FALL_BACK -1 + +#define GET_FLAG_RAW 0x00000001 +#define GET_FLAG_DO_NOT_RAISE_ERROR 0x00000002 +//base lib +void sq_base_register(HSQUIRRELVM v); + +struct SQExceptionTrap{ + SQExceptionTrap() {} + SQExceptionTrap(SQInteger ss, SQInteger stackbase,SQInstruction *ip, SQInteger ex_target){ _stacksize = ss; _stackbase = stackbase; _ip = ip; _extarget = ex_target;} + SQExceptionTrap(const SQExceptionTrap &et) { (*this) = et; } + SQInteger _stackbase; + SQInteger _stacksize; + SQInstruction *_ip; + SQInteger _extarget; +}; + +#define _INLINE + +#define STK(a) _stack._vals[_stackbase+(a)] +#define TARGET _stack._vals[_stackbase+arg0] + +typedef sqvector ExceptionsTraps; + +struct SQVM : public CHAINABLE_OBJ +{ + struct CallInfo{ + //CallInfo() { _generator = NULL;} + SQInstruction *_ip; + SQObjectPtr *_literals; + SQObjectPtr _closure; + SQGenerator *_generator; + SQInt32 _etraps; + SQInt32 _prevstkbase; + SQInt32 _prevtop; + SQInt32 _target; + SQInt32 _ncalls; + SQBool _root; + }; + +typedef sqvector CallInfoVec; +public: + void DebugHookProxy(SQInteger type, const SQChar * sourcename, SQInteger line, const SQChar * funcname); + static void _DebugHookProxy(HSQUIRRELVM v, SQInteger type, const SQChar * sourcename, SQInteger line, const SQChar * funcname); + enum ExecutionType { ET_CALL, ET_RESUME_GENERATOR, ET_RESUME_VM,ET_RESUME_THROW_VM }; + SQVM(SQSharedState *ss); + ~SQVM(); + bool Init(SQVM *friendvm, SQInteger stacksize); + bool Execute(SQObjectPtr &func, SQInteger nargs, SQInteger stackbase, SQObjectPtr &outres, SQBool raiseerror, ExecutionType et = ET_CALL); + //starts a native call return when the NATIVE closure returns + bool CallNative(SQNativeClosure *nclosure, SQInteger nargs, SQInteger newbase, SQObjectPtr &retval,bool &suspend); + //starts a SQUIRREL call in the same "Execution loop" + bool StartCall(SQClosure *closure, SQInteger target, SQInteger nargs, SQInteger stackbase, bool tailcall); + bool CreateClassInstance(SQClass *theclass, SQObjectPtr &inst, SQObjectPtr &constructor); + //call a generic closure pure SQUIRREL or NATIVE + bool Call(SQObjectPtr &closure, SQInteger nparams, SQInteger stackbase, SQObjectPtr &outres,SQBool raiseerror); + SQRESULT Suspend(); + + void CallDebugHook(SQInteger type,SQInteger forcedline=0); + void CallErrorHandler(SQObjectPtr &e); + bool Get(const SQObjectPtr &self, const SQObjectPtr &key, SQObjectPtr &dest, SQUnsignedInteger getflags, SQInteger selfidx); + SQInteger FallBackGet(const SQObjectPtr &self,const SQObjectPtr &key,SQObjectPtr &dest); + bool InvokeDefaultDelegate(const SQObjectPtr &self,const SQObjectPtr &key,SQObjectPtr &dest); + bool Set(const SQObjectPtr &self, const SQObjectPtr &key, const SQObjectPtr &val, SQInteger selfidx); + SQInteger FallBackSet(const SQObjectPtr &self,const SQObjectPtr &key,const SQObjectPtr &val); + bool NewSlot(const SQObjectPtr &self, const SQObjectPtr &key, const SQObjectPtr &val,bool bstatic); + bool NewSlotA(const SQObjectPtr &self,const SQObjectPtr &key,const SQObjectPtr &val,const SQObjectPtr &attrs,bool bstatic,bool raw); + bool DeleteSlot(const SQObjectPtr &self, const SQObjectPtr &key, SQObjectPtr &res); + bool Clone(const SQObjectPtr &self, SQObjectPtr &target); + bool ObjCmp(const SQObjectPtr &o1, const SQObjectPtr &o2,SQInteger &res); + bool StringCat(const SQObjectPtr &str, const SQObjectPtr &obj, SQObjectPtr &dest); + static bool IsEqual(const SQObjectPtr &o1,const SQObjectPtr &o2,bool &res); + bool ToString(const SQObjectPtr &o,SQObjectPtr &res); + SQString *PrintObjVal(const SQObjectPtr &o); + + + void Raise_Error(const SQChar *s, ...); + void Raise_Error(const SQObjectPtr &desc); + void Raise_IdxError(const SQObjectPtr &o); + void Raise_CompareError(const SQObject &o1, const SQObject &o2); + void Raise_ParamTypeError(SQInteger nparam,SQInteger typemask,SQInteger type); + + void FindOuter(SQObjectPtr &target, SQObjectPtr *stackindex); + void RelocateOuters(); + void CloseOuters(SQObjectPtr *stackindex); + + bool TypeOf(const SQObjectPtr &obj1, SQObjectPtr &dest); + bool CallMetaMethod(SQObjectPtr &closure, SQMetaMethod mm, SQInteger nparams, SQObjectPtr &outres); + bool ArithMetaMethod(SQInteger op, const SQObjectPtr &o1, const SQObjectPtr &o2, SQObjectPtr &dest); + bool Return(SQInteger _arg0, SQInteger _arg1, SQObjectPtr &retval); + //new stuff + _INLINE bool ARITH_OP(SQUnsignedInteger op,SQObjectPtr &trg,const SQObjectPtr &o1,const SQObjectPtr &o2); + _INLINE bool BW_OP(SQUnsignedInteger op,SQObjectPtr &trg,const SQObjectPtr &o1,const SQObjectPtr &o2); + _INLINE bool NEG_OP(SQObjectPtr &trg,const SQObjectPtr &o1); + _INLINE bool CMP_OP(CmpOP op, const SQObjectPtr &o1,const SQObjectPtr &o2,SQObjectPtr &res); + bool CLOSURE_OP(SQObjectPtr &target, SQFunctionProto *func); + bool CLASS_OP(SQObjectPtr &target,SQInteger base,SQInteger attrs); + //return true if the loop is finished + bool FOREACH_OP(SQObjectPtr &o1,SQObjectPtr &o2,SQObjectPtr &o3,SQObjectPtr &o4,SQInteger arg_2,int exitpos,int &jump); + //_INLINE bool LOCAL_INC(SQInteger op,SQObjectPtr &target, SQObjectPtr &a, SQObjectPtr &incr); + _INLINE bool PLOCAL_INC(SQInteger op,SQObjectPtr &target, SQObjectPtr &a, SQObjectPtr &incr); + _INLINE bool DerefInc(SQInteger op,SQObjectPtr &target, SQObjectPtr &self, SQObjectPtr &key, SQObjectPtr &incr, bool postfix,SQInteger arg0); +#ifdef _DEBUG_DUMP + void dumpstack(SQInteger stackbase=-1, bool dumpall = false); +#endif + +#ifndef NO_GARBAGE_COLLECTOR + void Mark(SQCollectable **chain); + SQObjectType GetType() {return OT_THREAD;} +#endif + void Finalize(); + void GrowCallStack() { + SQInteger newsize = _alloccallsstacksize*2; + _callstackdata.resize(newsize); + _callsstack = &_callstackdata[0]; + _alloccallsstacksize = newsize; + } + bool EnterFrame(SQInteger newbase, SQInteger newtop, bool tailcall); + void LeaveFrame(); + void Release(){ sq_delete(this,SQVM); } +//////////////////////////////////////////////////////////////////////////// + //stack functions for the api + void Remove(SQInteger n); + + static bool IsFalse(SQObjectPtr &o); + + void Pop(); + void Pop(SQInteger n); + void Push(const SQObjectPtr &o); + void PushNull(); + SQObjectPtr &Top(); + SQObjectPtr &PopGet(); + SQObjectPtr &GetUp(SQInteger n); + SQObjectPtr &GetAt(SQInteger n); + + SQObjectPtrVec _stack; + + SQInteger _top; + SQInteger _stackbase; + SQOuter *_openouters; + SQObjectPtr _roottable; + SQObjectPtr _lasterror; + SQObjectPtr _errorhandler; + + bool _debughook; + SQDEBUGHOOK _debughook_native; + SQObjectPtr _debughook_closure; + + SQObjectPtr temp_reg; + + + CallInfo* _callsstack; + SQInteger _callsstacksize; + SQInteger _alloccallsstacksize; + sqvector _callstackdata; + + ExceptionsTraps _etraps; + CallInfo *ci; + SQUserPointer _foreignptr; + //VMs sharing the same state + SQSharedState *_sharedstate; + SQInteger _nnativecalls; + SQInteger _nmetamethodscall; + SQRELEASEHOOK _releasehook; + //suspend infos + SQBool _suspended; + SQBool _suspended_root; + SQInteger _suspended_target; + SQInteger _suspended_traps; +}; + +struct AutoDec{ + AutoDec(SQInteger *n) { _n = n; } + ~AutoDec() { (*_n)--; } + SQInteger *_n; +}; + +inline SQObjectPtr &stack_get(HSQUIRRELVM v,SQInteger idx){return ((idx>=0)?(v->GetAt(idx+v->_stackbase-1)):(v->GetUp(idx)));} + +#define _ss(_vm_) (_vm_)->_sharedstate + +#ifndef NO_GARBAGE_COLLECTOR +#define _opt_ss(_vm_) (_vm_)->_sharedstate +#else +#define _opt_ss(_vm_) NULL +#endif + +#define PUSH_CALLINFO(v,nci){ \ + SQInteger css = v->_callsstacksize; \ + if(css == v->_alloccallsstacksize) { \ + v->GrowCallStack(); \ + } \ + v->ci = &v->_callsstack[css]; \ + *(v->ci) = nci; \ + v->_callsstacksize++; \ +} + +#define POP_CALLINFO(v){ \ + SQInteger css = --v->_callsstacksize; \ + v->ci->_closure.Null(); \ + v->ci = css?&v->_callsstack[css-1]:NULL; \ +} +#endif //_SQVM_H_