From b56cd688ae1b9e831e1ccf2a2ff280fa7740f385 Mon Sep 17 00:00:00 2001 From: Paul Date: Wed, 20 Dec 2000 20:15:24 +0000 Subject: [PATCH] --- Utils/Scripter/codegen.cpp | 60 +- Utils/Scripter/codegen.h | 8 + Utils/Scripter/function.cpp | 6 +- Utils/Scripter/lexer.cpp | 674 ++++++++------- Utils/Scripter/lexer.l | 7 +- Utils/Scripter/parser.cpp | 591 ++++++++----- Utils/Scripter/parser.h | 35 +- Utils/Scripter/parser.v | 818 +++++++++++------- Utils/Scripter/parser.y | 22 +- Utils/Scripter/var.cpp | 7 + data/Scripts/test.scr | 78 +- source/script/function.cpp | 52 +- source/script/script.cpp | 32 +- source/script/script.h | 10 + tools/scripter.exe | Bin 229439 -> 233535 bytes .../spongebob project/spongebob project.dsp | 18 +- 16 files changed, 1569 insertions(+), 849 deletions(-) diff --git a/Utils/Scripter/codegen.cpp b/Utils/Scripter/codegen.cpp index bffe91dd9..d8e650df4 100644 --- a/Utils/Scripter/codegen.cpp +++ b/Utils/Scripter/codegen.cpp @@ -35,6 +35,7 @@ ------- */ #include +#include /* Data @@ -204,6 +205,7 @@ CTreeNode::CTreeNode(NodeType _type,int _data) int CTreeNode::generateCode(int _write) { int codeSize=0; + int tmp1,tmp2; switch(m_type) { @@ -248,11 +250,33 @@ int CTreeNode::generateCode(int _write) codeSize+=m_children[2]->generateCode(_write); break; + case WHILE_STMT: // while [expression, code] + tmp1=m_children[1]->generateCode(false); + tmp2=codeSize; + codeSize=m_children[0]->generateCode(_write); + codeSize+=emit(OP_PUSHVALUE,_write); + codeSize+=emit((signed short)tmp1+3,_write); + codeSize+=emit(OP_JMPF,_write); + codeSize+=m_children[1]->generateCode(_write); + codeSize+=emit(OP_PUSHVALUE,_write); + codeSize+=emit((signed short)-(codeSize-tmp2+2),_write); + codeSize+=emit(OP_JMP,_write); + break; + + case DOWHILE_STMT: // do [code] while [expression] + tmp1=m_children[0]->generateCode(false)+m_children[1]->generateCode(false)+3; + codeSize=m_children[0]->generateCode(_write); + codeSize+=m_children[1]->generateCode(_write); + codeSize+=emit(OP_PUSHVALUE,_write); + codeSize+=emit((signed short)-tmp1,_write); + codeSize+=emit(OP_JMPT,_write); + break; + case POP_STMT: // pop codeSize+=emit(OP_POP,_write); break; - case ASSIGN_EXPR: // assign [ variable, number ] + case ASSIGN_EXPR: // assign [variable, number] codeSize+=m_children[1]->generateCode(_write); codeSize+=emit(OP_PUSHVALUE,_write); codeSize+=emit(m_children[0]->getVariableIdx(),_write); @@ -260,17 +284,29 @@ int CTreeNode::generateCode(int _write) break; case EQUAL_EXPR: // == [variable, value] - codeSize+=m_children[0]->generateCode(_write); codeSize+=m_children[1]->generateCode(_write); + codeSize+=m_children[0]->generateCode(_write); codeSize+=emit(OP_IS_EQUAL_VALUE,_write); break; case NOTEQUAL_EXPR: // != [variable, value] - codeSize+=m_children[0]->generateCode(_write); codeSize+=m_children[1]->generateCode(_write); + codeSize+=m_children[0]->generateCode(_write); codeSize+=emit(OP_IS_NOTEQUAL_VALUE,_write); break; + case LESSTHAN_EXPR: // [variable, value] + codeSize+=m_children[1]->generateCode(_write); + codeSize+=m_children[0]->generateCode(_write); + codeSize+=emit(OP_IS_LESSTHAN_VALUE,_write); + break; + + case GREATERTHAN_EXPR: // [variable, value] + codeSize+=m_children[1]->generateCode(_write); + codeSize+=m_children[0]->generateCode(_write); + codeSize+=emit(OP_IS_GREATERTHAN_VALUE,_write); + break; + case VARIABLE_EXPR: // variable case VALUE_EXPR: // value if(m_numChildren) @@ -280,11 +316,18 @@ int CTreeNode::generateCode(int _write) break; case PLUS_EXPR: // + [value, value] - codeSize+=emitValue(m_children[0],_write); - codeSize+=emitValue(m_children[1],_write); + codeSize+=m_children[0]->generateCode(_write); + codeSize+=m_children[1]->generateCode(_write); codeSize+=emit(OP_ADD,_write); break; - + + case SUBTRACT_EXPR: // - [value, value] + codeSize+=m_children[0]->generateCode(_write); + codeSize+=m_children[1]->generateCode(_write); + codeSize+=emit(OP_NEG,_write); + codeSize+=emit(OP_ADD,_write); + break; + case FUNCTION_EXPR: // function [functionNumber] codeSize+=emit(OP_CALL_FUNCTION,_write); codeSize+=emit(getFunctionNumber(),_write); @@ -293,6 +336,7 @@ int CTreeNode::generateCode(int _write) default: printf("UNHANDLED CASE %d\n",m_type); + exit(-2); break; } @@ -316,7 +360,7 @@ int CTreeNode::emit(unsigned short _data,int _write) } int CTreeNode::emitValue(CTreeNode *_child,int _write) { - int codeSize; + int codeSize=0; switch(_child->getType()) { @@ -328,7 +372,7 @@ int CTreeNode::emitValue(CTreeNode *_child,int _write) break; default: printf("INTERNAL ERROR IN emitValue() :(\n"); - codeSize=0; + exit(-2); break; } return codeSize; diff --git a/Utils/Scripter/codegen.h b/Utils/Scripter/codegen.h index 58faf9eab..b127ee46d 100644 --- a/Utils/Scripter/codegen.h +++ b/Utils/Scripter/codegen.h @@ -35,15 +35,20 @@ typedef enum PAUSE_STMT, // pause IF_STMT, // if [expression, ifcode] IFELSE_STMT, // if [expression, ifcode, elsecode] + WHILE_STMT, // while [expression, code] + DOWHILE_STMT, // do [code] while [expression] POP_STMT, // pop // Expressions ASSIGN_EXPR, // assignment [variable, value] EQUAL_EXPR, // == [variable, value] NOTEQUAL_EXPR, // != [variable, value] + LESSTHAN_EXPR, // < [variable, value] + GREATERTHAN_EXPR, // > [variable, value] VARIABLE_EXPR, // variable VALUE_EXPR, // value PLUS_EXPR, // + [value, value] + SUBTRACT_EXPR, // - [value, value] FUNCTION_EXPR, // function [functionNumber] }NodeType; @@ -85,8 +90,11 @@ private: OP_JMPT, // jump, value OP_IS_EQUAL_VALUE, // value, value pushes result ( 0 or 1 ) to stack OP_IS_NOTEQUAL_VALUE, // value, value pushes result ( 0 or 1 ) to stack + OP_IS_LESSTHAN_VALUE, // value, value pushes result ( 0 or 1 ) to stack + OP_IS_GREATERTHAN_VALUE,// value, value pushes result ( 0 or 1 ) to stack OP_ASSIGN, // varidx, value OP_ADD, // value, value pushes result to stack + OP_NEG, // value pushes result to stack OP_PRINT, // value OP_CALL_FUNCTION, // functionNumber, argcount args pushes return value to stack }; diff --git a/Utils/Scripter/function.cpp b/Utils/Scripter/function.cpp index 39cd61513..198064e77 100644 --- a/Utils/Scripter/function.cpp +++ b/Utils/Scripter/function.cpp @@ -61,8 +61,10 @@ struct FunctionDef ---- */ static FunctionDef s_functionNames[]= { - { "setCharacterAnimation", 2, }, // character, animation - { "setText", 1, }, // textId + { "setCharacterAnimation", 2 }, // character,animation + { "setText", 1 }, // textId + { "drawSprite", 4 }, // frame,x,y,ot + { "getFrameTime", 0 }, // }; static int s_functionCount=sizeof(s_functionNames)/sizeof(FunctionDef); diff --git a/Utils/Scripter/lexer.cpp b/Utils/Scripter/lexer.cpp index 9ecdad5e2..f86cd46a3 100644 --- a/Utils/Scripter/lexer.cpp +++ b/Utils/Scripter/lexer.cpp @@ -125,136 +125,171 @@ return ELSE; case 6: { #line 71 "C:\\spongebob\\Utils\\scripter\\lexer.l" -return PAUSE; +return WHILE; #line 130 "C:\\spongebob\\Utils\\scripter\\lexer.cpp" } break; case 7: { #line 72 "C:\\spongebob\\Utils\\scripter\\lexer.l" -return PRINT; +return DO; #line 137 "C:\\spongebob\\Utils\\scripter\\lexer.cpp" } break; case 8: { #line 73 "C:\\spongebob\\Utils\\scripter\\lexer.l" -return ASSIGN; +return PAUSE; #line 144 "C:\\spongebob\\Utils\\scripter\\lexer.cpp" } break; case 9: { #line 74 "C:\\spongebob\\Utils\\scripter\\lexer.l" -return EQUAL; +return PRINT; #line 151 "C:\\spongebob\\Utils\\scripter\\lexer.cpp" } break; case 10: { #line 75 "C:\\spongebob\\Utils\\scripter\\lexer.l" -return NOTEQUAL; +return ASSIGN; #line 158 "C:\\spongebob\\Utils\\scripter\\lexer.cpp" } break; case 11: { #line 76 "C:\\spongebob\\Utils\\scripter\\lexer.l" -return PLUS; +return EQUAL; #line 165 "C:\\spongebob\\Utils\\scripter\\lexer.cpp" } break; case 12: { #line 77 "C:\\spongebob\\Utils\\scripter\\lexer.l" -return END_STMT; +return NOTEQUAL; #line 172 "C:\\spongebob\\Utils\\scripter\\lexer.cpp" } break; case 13: { #line 78 "C:\\spongebob\\Utils\\scripter\\lexer.l" -return OPEN_PAR; +return LESSTHAN; #line 179 "C:\\spongebob\\Utils\\scripter\\lexer.cpp" } break; case 14: { #line 79 "C:\\spongebob\\Utils\\scripter\\lexer.l" -return CLOSE_PAR; +return GREATERTHAN; #line 186 "C:\\spongebob\\Utils\\scripter\\lexer.cpp" } break; case 15: { #line 80 "C:\\spongebob\\Utils\\scripter\\lexer.l" -return BEGIN_CS; +return PLUS; #line 193 "C:\\spongebob\\Utils\\scripter\\lexer.cpp" } break; case 16: { #line 81 "C:\\spongebob\\Utils\\scripter\\lexer.l" -return END_CS; +return SUBTRACT; #line 200 "C:\\spongebob\\Utils\\scripter\\lexer.cpp" } break; case 17: { #line 82 "C:\\spongebob\\Utils\\scripter\\lexer.l" -return COMMA; +return END_STMT; #line 207 "C:\\spongebob\\Utils\\scripter\\lexer.cpp" } break; case 18: { -#line 85 "C:\\spongebob\\Utils\\scripter\\lexer.l" -yylval.variableIdx=lookupVarName(yytext+1);return VARIABLE; +#line 83 "C:\\spongebob\\Utils\\scripter\\lexer.l" +return OPEN_PAR; #line 214 "C:\\spongebob\\Utils\\scripter\\lexer.cpp" } break; case 19: { -#line 86 "C:\\spongebob\\Utils\\scripter\\lexer.l" -yylval.value=atoi(yytext);return VALUE; +#line 84 "C:\\spongebob\\Utils\\scripter\\lexer.l" +return CLOSE_PAR; #line 221 "C:\\spongebob\\Utils\\scripter\\lexer.cpp" } break; case 20: { -#line 89 "C:\\spongebob\\Utils\\scripter\\lexer.l" -yylval.functionNumber=lookupFunctionName(yytext+1);return FUNCTION; +#line 85 "C:\\spongebob\\Utils\\scripter\\lexer.l" +return BEGIN_CS; #line 228 "C:\\spongebob\\Utils\\scripter\\lexer.cpp" } break; case 21: { -#line 91 "C:\\spongebob\\Utils\\scripter\\lexer.l" - +#line 86 "C:\\spongebob\\Utils\\scripter\\lexer.l" +return END_CS; #line 235 "C:\\spongebob\\Utils\\scripter\\lexer.cpp" } break; case 22: { -#line 92 "C:\\spongebob\\Utils\\scripter\\lexer.l" - +#line 87 "C:\\spongebob\\Utils\\scripter\\lexer.l" +return COMMA; #line 242 "C:\\spongebob\\Utils\\scripter\\lexer.cpp" } break; case 23: { -#line 93 "C:\\spongebob\\Utils\\scripter\\lexer.l" - +#line 90 "C:\\spongebob\\Utils\\scripter\\lexer.l" +yylval.variableIdx=lookupVarName(yytext+1);return VARIABLE; #line 249 "C:\\spongebob\\Utils\\scripter\\lexer.cpp" } break; case 24: { -#line 95 "C:\\spongebob\\Utils\\scripter\\lexer.l" -unexpectedChar(); +#line 91 "C:\\spongebob\\Utils\\scripter\\lexer.l" +yylval.value=atoi(yytext);return VALUE; #line 256 "C:\\spongebob\\Utils\\scripter\\lexer.cpp" } break; + case 25: + { +#line 94 "C:\\spongebob\\Utils\\scripter\\lexer.l" +yylval.functionNumber=lookupFunctionName(yytext+1);return FUNCTION; +#line 263 "C:\\spongebob\\Utils\\scripter\\lexer.cpp" + } + break; + case 26: + { +#line 96 "C:\\spongebob\\Utils\\scripter\\lexer.l" + +#line 270 "C:\\spongebob\\Utils\\scripter\\lexer.cpp" + } + break; + case 27: + { +#line 97 "C:\\spongebob\\Utils\\scripter\\lexer.l" + +#line 277 "C:\\spongebob\\Utils\\scripter\\lexer.cpp" + } + break; + case 28: + { +#line 98 "C:\\spongebob\\Utils\\scripter\\lexer.l" + +#line 284 "C:\\spongebob\\Utils\\scripter\\lexer.cpp" + } + break; + case 29: + { +#line 100 "C:\\spongebob\\Utils\\scripter\\lexer.l" +unexpectedChar(); +#line 291 "C:\\spongebob\\Utils\\scripter\\lexer.cpp" + } + break; default: yyassert(0); break; @@ -268,7 +303,7 @@ unexpectedChar(); #pragma warn .rch // to the old state #endif #endif -#line 97 "C:\\spongebob\\Utils\\scripter\\lexer.l" +#line 102 "C:\\spongebob\\Utils\\scripter\\lexer.l" @@ -276,7 +311,7 @@ unexpectedChar(); // programs section -#line 280 "C:\\spongebob\\Utils\\scripter\\lexer.cpp" +#line 315 "C:\\spongebob\\Utils\\scripter\\lexer.cpp" void YYLEXNAME::yytables() { @@ -300,9 +335,9 @@ void YYLEXNAME::yytables() { 0, 0 }, { 0, 0 }, { 0, 0 }, - { 21, 21 }, - { 0, 33 }, - { 0, 44 }, + { 26, 26 }, + { 0, 40 }, + { 0, 54 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, @@ -323,7 +358,7 @@ void YYLEXNAME::yytables() { 0, 0 }, { 0, 0 }, { 0, 0 }, - { 21, 21 }, + { 26, 26 }, { 0, 0 }, { 0, 0 }, { 3, 1 }, @@ -338,269 +373,269 @@ void YYLEXNAME::yytables() { 0, 0 }, { 0, 0 }, { 0, 0 }, - { 33, 20 }, - { 31, 31 }, - { 31, 31 }, - { 31, 31 }, - { 31, 31 }, - { 31, 31 }, - { 31, 31 }, - { 31, 31 }, - { 31, 31 }, - { 31, 31 }, - { 31, 31 }, + { 40, 25 }, + { 38, 38 }, + { 38, 38 }, + { 38, 38 }, + { 38, 38 }, + { 38, 38 }, + { 38, 38 }, + { 38, 38 }, + { 38, 38 }, + { 38, 38 }, + { 38, 38 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, - { 29, 8 }, - { 30, 9 }, + { 37, 11 }, + { 36, 10 }, { 0, 0 }, { 0, 0 }, - { 31, 31 }, - { 31, 31 }, - { 31, 31 }, - { 31, 31 }, - { 31, 31 }, - { 31, 31 }, - { 31, 31 }, - { 31, 31 }, - { 31, 31 }, - { 31, 31 }, - { 31, 31 }, - { 31, 31 }, - { 31, 31 }, - { 31, 31 }, - { 31, 31 }, - { 31, 31 }, - { 31, 31 }, - { 31, 31 }, - { 31, 31 }, - { 31, 31 }, - { 31, 31 }, - { 31, 31 }, - { 31, 31 }, - { 31, 31 }, - { 31, 31 }, - { 31, 31 }, + { 38, 38 }, + { 38, 38 }, + { 38, 38 }, + { 38, 38 }, + { 38, 38 }, + { 38, 38 }, + { 38, 38 }, + { 38, 38 }, + { 38, 38 }, + { 38, 38 }, + { 38, 38 }, + { 38, 38 }, + { 38, 38 }, + { 38, 38 }, + { 38, 38 }, + { 38, 38 }, + { 38, 38 }, + { 38, 38 }, + { 38, 38 }, + { 38, 38 }, + { 38, 38 }, + { 38, 38 }, + { 38, 38 }, + { 38, 38 }, + { 38, 38 }, + { 38, 38 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, - { 31, 31 }, + { 38, 38 }, { 0, 0 }, - { 31, 31 }, - { 31, 31 }, - { 31, 31 }, - { 31, 31 }, - { 31, 31 }, - { 31, 31 }, - { 31, 31 }, - { 31, 31 }, - { 31, 31 }, - { 31, 31 }, - { 31, 31 }, - { 31, 31 }, - { 31, 31 }, - { 31, 31 }, - { 31, 31 }, - { 31, 31 }, - { 31, 31 }, - { 31, 31 }, - { 31, 31 }, - { 31, 31 }, - { 31, 31 }, - { 31, 31 }, - { 31, 31 }, - { 31, 31 }, - { 31, 31 }, - { 31, 31 }, - { 32, 32 }, - { 32, 32 }, - { 32, 32 }, - { 32, 32 }, - { 32, 32 }, - { 32, 32 }, - { 32, 32 }, - { 32, 32 }, - { 32, 32 }, - { 32, 32 }, - { 36, 27 }, - { 43, 41 }, - { 24, 4 }, - { 35, 26 }, - { 40, 36 }, - { 38, 34 }, - { 34, 24 }, - { 32, 32 }, - { 32, 32 }, - { 32, 32 }, - { 32, 32 }, - { 32, 32 }, - { 32, 32 }, - { 32, 32 }, - { 32, 32 }, - { 32, 32 }, - { 32, 32 }, - { 32, 32 }, - { 32, 32 }, - { 32, 32 }, - { 32, 32 }, - { 32, 32 }, - { 32, 32 }, - { 32, 32 }, - { 32, 32 }, - { 32, 32 }, - { 32, 32 }, - { 32, 32 }, - { 32, 32 }, - { 32, 32 }, - { 32, 32 }, - { 32, 32 }, - { 32, 32 }, - { 41, 37 }, - { 26, 6 }, - { 37, 28 }, - { 25, 5 }, - { 32, 32 }, - { 39, 35 }, - { 32, 32 }, - { 32, 32 }, - { 32, 32 }, - { 32, 32 }, - { 32, 32 }, - { 32, 32 }, - { 32, 32 }, - { 32, 32 }, - { 32, 32 }, - { 32, 32 }, - { 32, 32 }, - { 32, 32 }, - { 32, 32 }, - { 32, 32 }, - { 32, 32 }, - { 32, 32 }, - { 32, 32 }, - { 32, 32 }, - { 32, 32 }, - { 32, 32 }, - { 32, 32 }, - { 32, 32 }, - { 32, 32 }, - { 32, 32 }, - { 32, 32 }, - { 32, 32 }, - { 0, 17 }, - { 0, 17 }, - { 0, 17 }, - { 0, 17 }, - { 0, 17 }, - { 0, 17 }, - { 0, 17 }, - { 0, 17 }, - { 0, 17 }, - { 0, 17 }, - { 0, 19 }, - { 0, 19 }, - { 0, 19 }, - { 0, 19 }, - { 0, 19 }, - { 0, 19 }, - { 0, 19 }, - { 0, 19 }, - { 0, 19 }, - { 0, 19 }, - { 21, 2 }, - { 22, 2 }, - { 27, 7 }, - { 18, 18 }, - { 18, 18 }, - { 18, 18 }, - { 18, 18 }, - { 18, 18 }, - { 18, 18 }, - { 18, 18 }, - { 18, 18 }, - { 18, 18 }, - { 18, 18 }, - { 42, 40 }, + { 38, 38 }, + { 38, 38 }, + { 38, 38 }, + { 38, 38 }, + { 38, 38 }, + { 38, 38 }, + { 38, 38 }, + { 38, 38 }, + { 38, 38 }, + { 38, 38 }, + { 38, 38 }, + { 38, 38 }, + { 38, 38 }, + { 38, 38 }, + { 38, 38 }, + { 38, 38 }, + { 38, 38 }, + { 38, 38 }, + { 38, 38 }, + { 38, 38 }, + { 38, 38 }, + { 38, 38 }, + { 38, 38 }, + { 38, 38 }, + { 38, 38 }, + { 38, 38 }, + { 39, 39 }, + { 39, 39 }, + { 39, 39 }, + { 39, 39 }, + { 39, 39 }, + { 39, 39 }, + { 39, 39 }, + { 39, 39 }, + { 39, 39 }, + { 39, 39 }, + { 44, 34 }, + { 53, 50 }, + { 29, 4 }, + { 42, 31 }, + { 49, 44 }, + { 46, 41 }, + { 33, 8 }, + { 39, 39 }, + { 39, 39 }, + { 39, 39 }, + { 39, 39 }, + { 39, 39 }, + { 39, 39 }, + { 39, 39 }, + { 39, 39 }, + { 39, 39 }, + { 39, 39 }, + { 39, 39 }, + { 39, 39 }, + { 39, 39 }, + { 39, 39 }, + { 39, 39 }, + { 39, 39 }, + { 39, 39 }, + { 39, 39 }, + { 39, 39 }, + { 39, 39 }, + { 39, 39 }, + { 39, 39 }, + { 39, 39 }, + { 39, 39 }, + { 39, 39 }, + { 39, 39 }, + { 41, 29 }, + { 50, 45 }, + { 31, 6 }, + { 48, 43 }, + { 39, 39 }, + { 43, 32 }, + { 39, 39 }, + { 39, 39 }, + { 39, 39 }, + { 39, 39 }, + { 39, 39 }, + { 39, 39 }, + { 39, 39 }, + { 39, 39 }, + { 39, 39 }, + { 39, 39 }, + { 39, 39 }, + { 39, 39 }, + { 39, 39 }, + { 39, 39 }, + { 39, 39 }, + { 39, 39 }, + { 39, 39 }, + { 39, 39 }, + { 39, 39 }, + { 39, 39 }, + { 39, 39 }, + { 39, 39 }, + { 39, 39 }, + { 39, 39 }, + { 39, 39 }, + { 39, 39 }, + { 0, 22 }, + { 0, 22 }, + { 0, 22 }, + { 0, 22 }, + { 0, 22 }, + { 0, 22 }, + { 0, 22 }, + { 0, 22 }, + { 0, 22 }, + { 0, 22 }, + { 0, 24 }, + { 0, 24 }, + { 0, 24 }, + { 0, 24 }, + { 0, 24 }, + { 0, 24 }, + { 0, 24 }, + { 0, 24 }, + { 0, 24 }, + { 0, 24 }, + { 26, 2 }, + { 27, 2 }, + { 34, 9 }, + { 23, 23 }, + { 23, 23 }, + { 23, 23 }, + { 23, 23 }, + { 23, 23 }, + { 23, 23 }, + { 23, 23 }, + { 23, 23 }, + { 23, 23 }, + { 23, 23 }, + { 45, 35 }, + { 32, 7 }, + { 30, 5 }, + { 52, 49 }, + { 47, 42 }, + { 51, 48 }, + { 35, 9 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, - { 0, 0 }, - { 0, 0 }, - { 28, 7 }, - { 0, 0 }, - { 0, 0 }, - { 0, 0 }, - { 21, 2 }, - { 9, 2 }, - { 0, 0 }, - { 44, 2 }, - { 17, 2 }, - { 0, 0 }, - { 0, 0 }, - { 0, 0 }, - { 12, 2 }, - { 13, 2 }, - { 0, 0 }, - { 10, 2 }, - { 16, 2 }, - { 0, 0 }, - { 0, 0 }, - { 20, 2 }, - { 18, 2 }, - { 18, 2 }, - { 18, 2 }, - { 18, 2 }, - { 18, 2 }, - { 18, 2 }, - { 18, 2 }, - { 18, 2 }, - { 18, 2 }, - { 18, 2 }, - { 0, 0 }, + { 26, 2 }, { 11, 2 }, { 0, 0 }, + { 54, 2 }, + { 22, 2 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 17, 2 }, + { 18, 2 }, + { 0, 0 }, + { 14, 2 }, + { 21, 2 }, + { 15, 2 }, + { 0, 0 }, + { 25, 2 }, + { 23, 2 }, + { 23, 2 }, + { 23, 2 }, + { 23, 2 }, + { 23, 2 }, + { 23, 2 }, + { 23, 2 }, + { 23, 2 }, + { 23, 2 }, + { 23, 2 }, + { 0, 0 }, + { 16, 2 }, + { 12, 2 }, + { 10, 2 }, + { 13, 2 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 24, 2 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, { 8, 2 }, - { 0, 0 }, - { 0, 0 }, - { 0, 0 }, - { 0, 0 }, - { 0, 0 }, - { 0, 0 }, - { 0, 0 }, - { 0, 0 }, - { 0, 0 }, - { 0, 0 }, - { 0, 0 }, - { 0, 0 }, - { 0, 0 }, - { 0, 0 }, - { 0, 0 }, - { 0, 0 }, - { 0, 0 }, - { 0, 0 }, - { 0, 0 }, - { 0, 0 }, - { 0, 0 }, - { 0, 0 }, - { 0, 0 }, - { 0, 0 }, - { 0, 0 }, - { 0, 0 }, - { 0, 0 }, - { 0, 0 }, - { 0, 0 }, - { 0, 0 }, - { 0, 0 }, - { 0, 0 }, - { 0, 0 }, - { 19, 2 }, - { 0, 0 }, - { 0, 0 }, - { 0, 0 }, - { 0, 0 }, - { 0, 0 }, { 6, 2 }, { 0, 0 }, { 0, 0 }, @@ -612,69 +647,79 @@ void YYLEXNAME::yytables() { 0, 0 }, { 0, 0 }, { 0, 0 }, - { 7, 2 }, + { 9, 2 }, { 0, 0 }, { 0, 0 }, { 4, 2 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 7, 2 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 19, 2 }, { 0, 0 }, - { 14, 2 }, - { 0, 0 }, - { 15, 2 } + { 20, 2 } }; yytransition = transition; static const yystate_t YYNEARFAR YYBASED_CODE state[] = { { 0, 0, 0 }, { 2, 1, 0 }, - { -23, 210, 0 }, + { -28, 210, 0 }, { 0, 0, 2 }, - { 41, 20, 24 }, - { 0, 68, 24 }, - { 0, 60, 24 }, - { 0, 124, 24 }, - { 9, 1, 8 }, - { 0, 2, 24 }, - { 0, 0, 11 }, - { 0, 0, 12 }, + { 50, 20, 29 }, + { 0, 132, 29 }, + { 43, 61, 29 }, + { 0, 129, 29 }, + { 29, 29, 29 }, + { 0, 124, 29 }, + { 11, 2, 10 }, + { 0, 1, 29 }, { 0, 0, 13 }, { 0, 0, 14 }, { 0, 0, 15 }, { 0, 0, 16 }, { 0, 0, 17 }, - { 31, 151, 24 }, - { 0, 174, 19 }, - { 32, 161, 24 }, - { 0, 1, 24 }, - { 0, 1, 22 }, - { 0, 0, 23 }, - { 0, 0, 24 }, - { 0, 29, 0 }, + { 0, 0, 18 }, + { 0, 0, 19 }, + { 0, 0, 20 }, + { 0, 0, 21 }, + { 0, 0, 22 }, + { 38, 151, 29 }, + { 0, 174, 24 }, + { 39, 161, 29 }, + { 0, 1, 29 }, + { 0, 1, 27 }, + { 0, 0, 28 }, + { 0, 0, 29 }, + { 0, 56, 0 }, { 0, 0, 4 }, - { 36, 22, 0 }, + { 44, 22, 0 }, + { 35, 67, 0 }, + { 0, 0, 7 }, { 0, 17, 0 }, - { 0, 64, 0 }, - { 0, 0, 9 }, - { 0, 0, 10 }, - { 41, 1, 18 }, - { 41, 76, 20 }, - { -33, 1, 21 }, + { 0, 127, 0 }, + { 0, 0, 11 }, + { 0, 0, 12 }, + { 50, 1, 23 }, + { 50, 76, 25 }, + { -40, 1, 26 }, { 0, 27, 0 }, - { 40, 71, 0 }, + { 49, 135, 0 }, + { 0, 62, 0 }, { 0, 23, 0 }, - { 0, 57, 0 }, + { 0, 58, 0 }, { 0, 0, 3 }, { 0, 0, 5 }, - { 0, 131, 0 }, + { 49, 136, 0 }, + { 0, 134, 0 }, { 0, 19, 0 }, { 0, 0, 6 }, - { 0, 0, 7 }, - { -44, 2, 1 } + { 0, 0, 8 }, + { 0, 0, 9 }, + { -54, 2, 1 } }; yystate = state; @@ -703,6 +748,11 @@ void YYLEXNAME::yytables() 0, 0, 0, + 0, + 0, + 0, + 0, + 0, 0 }; yybackup = backup; diff --git a/Utils/Scripter/lexer.l b/Utils/Scripter/lexer.l index 533b209ac..5da2a75ca 100644 --- a/Utils/Scripter/lexer.l +++ b/Utils/Scripter/lexer.l @@ -68,17 +68,22 @@ YYSTYPE& yylval = *(YYSTYPE*)yyparserptr->yylvalptr; stop {return STOP;} if {return IF;} else {return ELSE;} +while {return WHILE;} +do {return DO;} pause {return PAUSE;} print {return PRINT;} = {return ASSIGN;} == {return EQUAL;} != {return NOTEQUAL;} +\< {return LESSTHAN;} +\> {return GREATERTHAN;} \+ {return PLUS;} +\- {return SUBTRACT;} ; {return END_STMT;} \( {return OPEN_PAR;} \) {return CLOSE_PAR;} \{ {return BEGIN_CS;} -\} {return END_CS;} +\} {return END_CS;} , {return COMMA;} diff --git a/Utils/Scripter/parser.cpp b/Utils/Scripter/parser.cpp index 5dc6a322e..fc3639c70 100644 --- a/Utils/Scripter/parser.cpp +++ b/Utils/Scripter/parser.cpp @@ -76,7 +76,7 @@ void YYPARSENAME::yyaction(int action) yyinitdebug((void YYFAR**)yya, 2); #endif { -#line 102 "C:\\spongebob\\Utils\\scripter\\parser.y" +#line 107 "C:\\spongebob\\Utils\\scripter\\parser.y" s_baseTreeNode=yyattribute(1 - 1).treenode; #line 82 "C:\\spongebob\\Utils\\scripter\\parser.cpp" } @@ -89,7 +89,7 @@ s_baseTreeNode=yyattribute(1 - 1).treenode; yyinitdebug((void YYFAR**)yya, 3); #endif { -#line 106 "C:\\spongebob\\Utils\\scripter\\parser.y" +#line 111 "C:\\spongebob\\Utils\\scripter\\parser.y" (*(YYSTYPE YYFAR*)yyvalptr).treenode=new CTreeNode(STMT_LIST,yyattribute(1 - 2).treenode,yyattribute(2 - 2).treenode); #line 95 "C:\\spongebob\\Utils\\scripter\\parser.cpp" } @@ -97,7 +97,7 @@ s_baseTreeNode=yyattribute(1 - 1).treenode; break; case 2: { -#line 107 "C:\\spongebob\\Utils\\scripter\\parser.y" +#line 112 "C:\\spongebob\\Utils\\scripter\\parser.y" (*(YYSTYPE YYFAR*)yyvalptr).treenode=new CTreeNode(EMPTY_STMT); #line 103 "C:\\spongebob\\Utils\\scripter\\parser.cpp" } @@ -109,7 +109,7 @@ s_baseTreeNode=yyattribute(1 - 1).treenode; yyinitdebug((void YYFAR**)yya, 2); #endif { -#line 111 "C:\\spongebob\\Utils\\scripter\\parser.y" +#line 116 "C:\\spongebob\\Utils\\scripter\\parser.y" (*(YYSTYPE YYFAR*)yyvalptr).treenode=new CTreeNode(EMPTY_STMT); #line 115 "C:\\spongebob\\Utils\\scripter\\parser.cpp" } @@ -122,7 +122,7 @@ s_baseTreeNode=yyattribute(1 - 1).treenode; yyinitdebug((void YYFAR**)yya, 3); #endif { -#line 112 "C:\\spongebob\\Utils\\scripter\\parser.y" +#line 117 "C:\\spongebob\\Utils\\scripter\\parser.y" (*(YYSTYPE YYFAR*)yyvalptr).treenode=new CTreeNode(STOP_STMT); #line 128 "C:\\spongebob\\Utils\\scripter\\parser.cpp" } @@ -135,7 +135,7 @@ s_baseTreeNode=yyattribute(1 - 1).treenode; yyinitdebug((void YYFAR**)yya, 3); #endif { -#line 113 "C:\\spongebob\\Utils\\scripter\\parser.y" +#line 118 "C:\\spongebob\\Utils\\scripter\\parser.y" (*(YYSTYPE YYFAR*)yyvalptr).treenode=new CTreeNode(PAUSE_STMT); #line 141 "C:\\spongebob\\Utils\\scripter\\parser.cpp" } @@ -148,7 +148,7 @@ s_baseTreeNode=yyattribute(1 - 1).treenode; yyinitdebug((void YYFAR**)yya, 6); #endif { -#line 114 "C:\\spongebob\\Utils\\scripter\\parser.y" +#line 119 "C:\\spongebob\\Utils\\scripter\\parser.y" (*(YYSTYPE YYFAR*)yyvalptr).treenode=new CTreeNode(PRINT_STMT,yyattribute(3 - 5).treenode); #line 154 "C:\\spongebob\\Utils\\scripter\\parser.cpp" } @@ -161,7 +161,7 @@ s_baseTreeNode=yyattribute(1 - 1).treenode; yyinitdebug((void YYFAR**)yya, 3); #endif { -#line 115 "C:\\spongebob\\Utils\\scripter\\parser.y" +#line 120 "C:\\spongebob\\Utils\\scripter\\parser.y" (*(YYSTYPE YYFAR*)yyvalptr).treenode=yyattribute(1 - 2).treenode; #line 167 "C:\\spongebob\\Utils\\scripter\\parser.cpp" } @@ -174,7 +174,7 @@ s_baseTreeNode=yyattribute(1 - 1).treenode; yyinitdebug((void YYFAR**)yya, 6); #endif { -#line 116 "C:\\spongebob\\Utils\\scripter\\parser.y" +#line 121 "C:\\spongebob\\Utils\\scripter\\parser.y" (*(YYSTYPE YYFAR*)yyvalptr).treenode=new CTreeNode(IF_STMT,yyattribute(3 - 5).treenode,yyattribute(5 - 5).treenode); #line 180 "C:\\spongebob\\Utils\\scripter\\parser.cpp" } @@ -187,7 +187,7 @@ s_baseTreeNode=yyattribute(1 - 1).treenode; yyinitdebug((void YYFAR**)yya, 8); #endif { -#line 117 "C:\\spongebob\\Utils\\scripter\\parser.y" +#line 122 "C:\\spongebob\\Utils\\scripter\\parser.y" (*(YYSTYPE YYFAR*)yyvalptr).treenode=new CTreeNode(IFELSE_STMT,yyattribute(3 - 7).treenode,yyattribute(5 - 7).treenode,yyattribute(7 - 7).treenode); #line 193 "C:\\spongebob\\Utils\\scripter\\parser.cpp" } @@ -196,12 +196,12 @@ s_baseTreeNode=yyattribute(1 - 1).treenode; case 10: { #ifdef YYDEBUG - YYSTYPE YYFAR* yya[4]; - yyinitdebug((void YYFAR**)yya, 4); + YYSTYPE YYFAR* yya[6]; + yyinitdebug((void YYFAR**)yya, 6); #endif { -#line 118 "C:\\spongebob\\Utils\\scripter\\parser.y" -(*(YYSTYPE YYFAR*)yyvalptr).treenode=new CTreeNode(STMT_LIST,yyattribute(2 - 3).treenode); +#line 123 "C:\\spongebob\\Utils\\scripter\\parser.y" +(*(YYSTYPE YYFAR*)yyvalptr).treenode=new CTreeNode(WHILE_STMT,yyattribute(3 - 5).treenode,yyattribute(5 - 5).treenode); #line 206 "C:\\spongebob\\Utils\\scripter\\parser.cpp" } } @@ -209,12 +209,12 @@ s_baseTreeNode=yyattribute(1 - 1).treenode; case 11: { #ifdef YYDEBUG - YYSTYPE YYFAR* yya[3]; - yyinitdebug((void YYFAR**)yya, 3); + YYSTYPE YYFAR* yya[8]; + yyinitdebug((void YYFAR**)yya, 8); #endif { -#line 119 "C:\\spongebob\\Utils\\scripter\\parser.y" -(*(YYSTYPE YYFAR*)yyvalptr).treenode=new CTreeNode(STMT_LIST,yyattribute(1 - 2).treenode,new CTreeNode(POP_STMT)); +#line 124 "C:\\spongebob\\Utils\\scripter\\parser.y" +(*(YYSTYPE YYFAR*)yyvalptr).treenode=new CTreeNode(DOWHILE_STMT,yyattribute(2 - 7).treenode,yyattribute(5 - 7).treenode); #line 219 "C:\\spongebob\\Utils\\scripter\\parser.cpp" } } @@ -226,8 +226,8 @@ s_baseTreeNode=yyattribute(1 - 1).treenode; yyinitdebug((void YYFAR**)yya, 4); #endif { -#line 124 "C:\\spongebob\\Utils\\scripter\\parser.y" -(*(YYSTYPE YYFAR*)yyvalptr).treenode=new CTreeNode(ASSIGN_EXPR,yyattribute(1 - 3).treenode,yyattribute(3 - 3).treenode); +#line 125 "C:\\spongebob\\Utils\\scripter\\parser.y" +(*(YYSTYPE YYFAR*)yyvalptr).treenode=new CTreeNode(STMT_LIST,yyattribute(2 - 3).treenode); #line 232 "C:\\spongebob\\Utils\\scripter\\parser.cpp" } } @@ -235,12 +235,12 @@ s_baseTreeNode=yyattribute(1 - 1).treenode; case 13: { #ifdef YYDEBUG - YYSTYPE YYFAR* yya[4]; - yyinitdebug((void YYFAR**)yya, 4); + YYSTYPE YYFAR* yya[3]; + yyinitdebug((void YYFAR**)yya, 3); #endif { -#line 129 "C:\\spongebob\\Utils\\scripter\\parser.y" -(*(YYSTYPE YYFAR*)yyvalptr).treenode=yyattribute(2 - 3).treenode; +#line 126 "C:\\spongebob\\Utils\\scripter\\parser.y" +(*(YYSTYPE YYFAR*)yyvalptr).treenode=new CTreeNode(STMT_LIST,yyattribute(1 - 2).treenode,new CTreeNode(POP_STMT)); #line 245 "C:\\spongebob\\Utils\\scripter\\parser.cpp" } } @@ -248,12 +248,12 @@ s_baseTreeNode=yyattribute(1 - 1).treenode; case 14: { #ifdef YYDEBUG - YYSTYPE YYFAR* yya[2]; - yyinitdebug((void YYFAR**)yya, 2); + YYSTYPE YYFAR* yya[4]; + yyinitdebug((void YYFAR**)yya, 4); #endif { -#line 130 "C:\\spongebob\\Utils\\scripter\\parser.y" -(*(YYSTYPE YYFAR*)yyvalptr).treenode=yyattribute(1 - 1).treenode; +#line 131 "C:\\spongebob\\Utils\\scripter\\parser.y" +(*(YYSTYPE YYFAR*)yyvalptr).treenode=new CTreeNode(ASSIGN_EXPR,yyattribute(1 - 3).treenode,yyattribute(3 - 3).treenode); #line 258 "C:\\spongebob\\Utils\\scripter\\parser.cpp" } } @@ -261,12 +261,12 @@ s_baseTreeNode=yyattribute(1 - 1).treenode; case 15: { #ifdef YYDEBUG - YYSTYPE YYFAR* yya[2]; - yyinitdebug((void YYFAR**)yya, 2); + YYSTYPE YYFAR* yya[4]; + yyinitdebug((void YYFAR**)yya, 4); #endif { -#line 131 "C:\\spongebob\\Utils\\scripter\\parser.y" -(*(YYSTYPE YYFAR*)yyvalptr).treenode=yyattribute(1 - 1).treenode; +#line 136 "C:\\spongebob\\Utils\\scripter\\parser.y" +(*(YYSTYPE YYFAR*)yyvalptr).treenode=yyattribute(2 - 3).treenode; #line 271 "C:\\spongebob\\Utils\\scripter\\parser.cpp" } } @@ -274,12 +274,12 @@ s_baseTreeNode=yyattribute(1 - 1).treenode; case 16: { #ifdef YYDEBUG - YYSTYPE YYFAR* yya[4]; - yyinitdebug((void YYFAR**)yya, 4); + YYSTYPE YYFAR* yya[2]; + yyinitdebug((void YYFAR**)yya, 2); #endif { -#line 135 "C:\\spongebob\\Utils\\scripter\\parser.y" -(*(YYSTYPE YYFAR*)yyvalptr).treenode=new CTreeNode(EQUAL_EXPR,yyattribute(1 - 3).treenode,yyattribute(3 - 3).treenode); +#line 137 "C:\\spongebob\\Utils\\scripter\\parser.y" +(*(YYSTYPE YYFAR*)yyvalptr).treenode=yyattribute(1 - 1).treenode; #line 284 "C:\\spongebob\\Utils\\scripter\\parser.cpp" } } @@ -287,12 +287,12 @@ s_baseTreeNode=yyattribute(1 - 1).treenode; case 17: { #ifdef YYDEBUG - YYSTYPE YYFAR* yya[4]; - yyinitdebug((void YYFAR**)yya, 4); + YYSTYPE YYFAR* yya[2]; + yyinitdebug((void YYFAR**)yya, 2); #endif { -#line 139 "C:\\spongebob\\Utils\\scripter\\parser.y" -(*(YYSTYPE YYFAR*)yyvalptr).treenode=new CTreeNode(NOTEQUAL_EXPR,yyattribute(1 - 3).treenode,yyattribute(3 - 3).treenode); +#line 138 "C:\\spongebob\\Utils\\scripter\\parser.y" +(*(YYSTYPE YYFAR*)yyvalptr).treenode=yyattribute(1 - 1).treenode; #line 297 "C:\\spongebob\\Utils\\scripter\\parser.cpp" } } @@ -304,8 +304,8 @@ s_baseTreeNode=yyattribute(1 - 1).treenode; yyinitdebug((void YYFAR**)yya, 2); #endif { -#line 144 "C:\\spongebob\\Utils\\scripter\\parser.y" -(*(YYSTYPE YYFAR*)yyvalptr).treenode=new CTreeNode(VARIABLE_EXPR,yyattribute(1 - 1).variableIdx); +#line 139 "C:\\spongebob\\Utils\\scripter\\parser.y" +(*(YYSTYPE YYFAR*)yyvalptr).treenode=yyattribute(1 - 1).treenode; #line 310 "C:\\spongebob\\Utils\\scripter\\parser.cpp" } } @@ -317,8 +317,8 @@ s_baseTreeNode=yyattribute(1 - 1).treenode; yyinitdebug((void YYFAR**)yya, 2); #endif { -#line 148 "C:\\spongebob\\Utils\\scripter\\parser.y" -(*(YYSTYPE YYFAR*)yyvalptr).treenode=new CTreeNode(VALUE_EXPR,yyattribute(1 - 1).value); +#line 140 "C:\\spongebob\\Utils\\scripter\\parser.y" +(*(YYSTYPE YYFAR*)yyvalptr).treenode=yyattribute(1 - 1).treenode; #line 323 "C:\\spongebob\\Utils\\scripter\\parser.cpp" } } @@ -326,12 +326,12 @@ s_baseTreeNode=yyattribute(1 - 1).treenode; case 20: { #ifdef YYDEBUG - YYSTYPE YYFAR* yya[2]; - yyinitdebug((void YYFAR**)yya, 2); + YYSTYPE YYFAR* yya[4]; + yyinitdebug((void YYFAR**)yya, 4); #endif { -#line 149 "C:\\spongebob\\Utils\\scripter\\parser.y" -(*(YYSTYPE YYFAR*)yyvalptr).treenode=new CTreeNode(VARIABLE_EXPR,yyattribute(1 - 1).variableIdx); +#line 144 "C:\\spongebob\\Utils\\scripter\\parser.y" +(*(YYSTYPE YYFAR*)yyvalptr).treenode=new CTreeNode(EQUAL_EXPR,yyattribute(1 - 3).treenode,yyattribute(3 - 3).treenode); #line 336 "C:\\spongebob\\Utils\\scripter\\parser.cpp" } } @@ -343,8 +343,8 @@ s_baseTreeNode=yyattribute(1 - 1).treenode; yyinitdebug((void YYFAR**)yya, 4); #endif { -#line 150 "C:\\spongebob\\Utils\\scripter\\parser.y" -(*(YYSTYPE YYFAR*)yyvalptr).treenode=new CTreeNode(PLUS_EXPR,yyattribute(1 - 3).treenode,yyattribute(3 - 3).treenode); +#line 148 "C:\\spongebob\\Utils\\scripter\\parser.y" +(*(YYSTYPE YYFAR*)yyvalptr).treenode=new CTreeNode(NOTEQUAL_EXPR,yyattribute(1 - 3).treenode,yyattribute(3 - 3).treenode); #line 349 "C:\\spongebob\\Utils\\scripter\\parser.cpp" } } @@ -352,12 +352,12 @@ s_baseTreeNode=yyattribute(1 - 1).treenode; case 22: { #ifdef YYDEBUG - YYSTYPE YYFAR* yya[2]; - yyinitdebug((void YYFAR**)yya, 2); + YYSTYPE YYFAR* yya[4]; + yyinitdebug((void YYFAR**)yya, 4); #endif { -#line 151 "C:\\spongebob\\Utils\\scripter\\parser.y" -(*(YYSTYPE YYFAR*)yyvalptr).treenode=yyattribute(1 - 1).treenode; +#line 152 "C:\\spongebob\\Utils\\scripter\\parser.y" +(*(YYSTYPE YYFAR*)yyvalptr).treenode=new CTreeNode(LESSTHAN_EXPR,yyattribute(1 - 3).treenode,yyattribute(3 - 3).treenode); #line 362 "C:\\spongebob\\Utils\\scripter\\parser.cpp" } } @@ -365,26 +365,117 @@ s_baseTreeNode=yyattribute(1 - 1).treenode; case 23: { #ifdef YYDEBUG - YYSTYPE YYFAR* yya[3]; - yyinitdebug((void YYFAR**)yya, 3); + YYSTYPE YYFAR* yya[4]; + yyinitdebug((void YYFAR**)yya, 4); #endif { #line 156 "C:\\spongebob\\Utils\\scripter\\parser.y" -if(yyattribute(1 - 2).functionNumber!=-1){m_functionNumber=yyattribute(1 - 2).functionNumber;m_functionArgs=getFunctionArgs(yyattribute(1 - 2).functionNumber);} +(*(YYSTYPE YYFAR*)yyvalptr).treenode=new CTreeNode(GREATERTHAN_EXPR,yyattribute(1 - 3).treenode,yyattribute(3 - 3).treenode); #line 375 "C:\\spongebob\\Utils\\scripter\\parser.cpp" } } break; case 24: { +#ifdef YYDEBUG + YYSTYPE YYFAR* yya[2]; + yyinitdebug((void YYFAR**)yya, 2); +#endif + { +#line 161 "C:\\spongebob\\Utils\\scripter\\parser.y" +(*(YYSTYPE YYFAR*)yyvalptr).treenode=new CTreeNode(VARIABLE_EXPR,yyattribute(1 - 1).variableIdx); +#line 388 "C:\\spongebob\\Utils\\scripter\\parser.cpp" + } + } + break; + case 25: + { +#ifdef YYDEBUG + YYSTYPE YYFAR* yya[2]; + yyinitdebug((void YYFAR**)yya, 2); +#endif + { +#line 165 "C:\\spongebob\\Utils\\scripter\\parser.y" +(*(YYSTYPE YYFAR*)yyvalptr).treenode=new CTreeNode(VALUE_EXPR,yyattribute(1 - 1).value); +#line 401 "C:\\spongebob\\Utils\\scripter\\parser.cpp" + } + } + break; + case 26: + { +#ifdef YYDEBUG + YYSTYPE YYFAR* yya[2]; + yyinitdebug((void YYFAR**)yya, 2); +#endif + { +#line 166 "C:\\spongebob\\Utils\\scripter\\parser.y" +(*(YYSTYPE YYFAR*)yyvalptr).treenode=new CTreeNode(VARIABLE_EXPR,yyattribute(1 - 1).variableIdx); +#line 414 "C:\\spongebob\\Utils\\scripter\\parser.cpp" + } + } + break; + case 27: + { +#ifdef YYDEBUG + YYSTYPE YYFAR* yya[4]; + yyinitdebug((void YYFAR**)yya, 4); +#endif + { +#line 169 "C:\\spongebob\\Utils\\scripter\\parser.y" +(*(YYSTYPE YYFAR*)yyvalptr).treenode=new CTreeNode(PLUS_EXPR,yyattribute(1 - 3).treenode,yyattribute(3 - 3).treenode); +#line 427 "C:\\spongebob\\Utils\\scripter\\parser.cpp" + } + } + break; + case 28: + { +#ifdef YYDEBUG + YYSTYPE YYFAR* yya[4]; + yyinitdebug((void YYFAR**)yya, 4); +#endif + { +#line 170 "C:\\spongebob\\Utils\\scripter\\parser.y" +(*(YYSTYPE YYFAR*)yyvalptr).treenode=new CTreeNode(SUBTRACT_EXPR,yyattribute(1 - 3).treenode,yyattribute(3 - 3).treenode); +#line 440 "C:\\spongebob\\Utils\\scripter\\parser.cpp" + } + } + break; + case 29: + { +#ifdef YYDEBUG + YYSTYPE YYFAR* yya[2]; + yyinitdebug((void YYFAR**)yya, 2); +#endif + { +#line 171 "C:\\spongebob\\Utils\\scripter\\parser.y" +(*(YYSTYPE YYFAR*)yyvalptr).treenode=yyattribute(1 - 1).treenode; +#line 453 "C:\\spongebob\\Utils\\scripter\\parser.cpp" + } + } + break; + case 30: + { +#ifdef YYDEBUG + YYSTYPE YYFAR* yya[3]; + yyinitdebug((void YYFAR**)yya, 3); +#endif + { +#line 176 "C:\\spongebob\\Utils\\scripter\\parser.y" +if(yyattribute(1 - 2).functionNumber!=-1){m_functionNumber=yyattribute(1 - 2).functionNumber;m_functionArgs=getFunctionArgs(yyattribute(1 - 2).functionNumber);} +#line 466 "C:\\spongebob\\Utils\\scripter\\parser.cpp" + } + } + break; + case 31: + { #ifdef YYDEBUG YYSTYPE YYFAR* yya[5]; yyinitdebug((void YYFAR**)yya, 5); #endif { -#line 157 "C:\\spongebob\\Utils\\scripter\\parser.y" +#line 177 "C:\\spongebob\\Utils\\scripter\\parser.y" (*(YYSTYPE YYFAR*)yyvalptr).treenode=new CTreeNode(STMT_LIST,m_functionArgs,new CTreeNode(FUNCTION_EXPR,m_functionNumber)); -#line 388 "C:\\spongebob\\Utils\\scripter\\parser.cpp" +#line 479 "C:\\spongebob\\Utils\\scripter\\parser.cpp" } } break; @@ -393,14 +484,14 @@ if(yyattribute(1 - 2).functionNumber!=-1){m_functionNumber=yyattribute(1 - 2).fu break; } } -#line 162 "C:\\spongebob\\Utils\\scripter\\parser.y" +#line 182 "C:\\spongebob\\Utils\\scripter\\parser.y" ///////////////////////////////////////////////////////////////////////////// // programs section -#line 404 "C:\\spongebob\\Utils\\scripter\\parser.cpp" +#line 495 "C:\\spongebob\\Utils\\scripter\\parser.cpp" void YYPARSENAME::yytables() { yyattribute_size = sizeof(YYSTYPE); @@ -413,20 +504,25 @@ void YYPARSENAME::yytables() { "STOP", 257 }, { "IF", 258 }, { "ELSE", 259 }, - { "PAUSE", 260 }, - { "PRINT", 261 }, - { "ASSIGN", 262 }, - { "EQUAL", 263 }, - { "NOTEQUAL", 264 }, - { "PLUS", 265 }, - { "END_STMT", 266 }, - { "OPEN_PAR", 267 }, - { "CLOSE_PAR", 268 }, - { "BEGIN_CS", 269 }, - { "END_CS", 270 }, - { "VARIABLE", 272 }, - { "VALUE", 273 }, - { "FUNCTION", 274 }, + { "WHILE", 260 }, + { "DO", 261 }, + { "PAUSE", 262 }, + { "PRINT", 263 }, + { "ASSIGN", 264 }, + { "EQUAL", 265 }, + { "NOTEQUAL", 266 }, + { "LESSTHAN", 267 }, + { "GREATERTHAN", 268 }, + { "PLUS", 269 }, + { "SUBTRACT", 270 }, + { "END_STMT", 271 }, + { "OPEN_PAR", 272 }, + { "CLOSE_PAR", 273 }, + { "BEGIN_CS", 274 }, + { "END_CS", 275 }, + { "VARIABLE", 277 }, + { "VALUE", 278 }, + { "FUNCTION", 279 }, { NULL, 0 } }; yysymbol = symbol; @@ -443,18 +539,25 @@ void YYPARSENAME::yytables() "statement: assign_expression END_STMT", "statement: IF OPEN_PAR expression CLOSE_PAR statement", "statement: IF OPEN_PAR expression CLOSE_PAR statement ELSE statement", + "statement: WHILE OPEN_PAR expression CLOSE_PAR statement", + "statement: DO statement WHILE OPEN_PAR expression CLOSE_PAR END_STMT", "statement: BEGIN_CS statement_list END_CS", "statement: function END_STMT", "assign_expression: variable ASSIGN value", "expression: OPEN_PAR expression CLOSE_PAR", "expression: equal_expression", "expression: notequal_expression", + "expression: lessthan_expression", + "expression: greaterthan_expression", "equal_expression: value EQUAL value", "notequal_expression: value NOTEQUAL value", + "lessthan_expression: value LESSTHAN value", + "greaterthan_expression: value GREATERTHAN value", "variable: VARIABLE", "value: VALUE", "value: VARIABLE", "value: value PLUS value", + "value: value SUBTRACT value", "value: function", "$$1:", "function: FUNCTION OPEN_PAR $$1 CLOSE_PAR" @@ -474,164 +577,226 @@ void YYPARSENAME::yytables() { 3, 2, 7 }, { 3, 5, 8 }, { 3, 7, 9 }, - { 3, 3, 10 }, - { 3, 2, 11 }, - { 4, 3, 12 }, - { 5, 3, 13 }, - { 5, 1, 14 }, - { 5, 1, 15 }, - { 6, 3, 16 }, - { 7, 3, 17 }, - { 8, 1, 18 }, - { 9, 1, 19 }, - { 9, 1, 20 }, - { 9, 3, 21 }, - { 9, 1, 22 }, - { 11, 0, 23 }, - { 10, 4, 24 } + { 3, 5, 10 }, + { 3, 7, 11 }, + { 3, 3, 12 }, + { 3, 2, 13 }, + { 4, 3, 14 }, + { 5, 3, 15 }, + { 5, 1, 16 }, + { 5, 1, 17 }, + { 5, 1, 18 }, + { 5, 1, 19 }, + { 6, 3, 20 }, + { 7, 3, 21 }, + { 8, 3, 22 }, + { 9, 3, 23 }, + { 10, 1, 24 }, + { 11, 1, 25 }, + { 11, 1, 26 }, + { 11, 3, 27 }, + { 11, 3, 28 }, + { 11, 1, 29 }, + { 13, 0, 30 }, + { 12, 4, 31 } }; yyreduction = reduction; static const yytokenaction_t YYNEARFAR YYBASED_CODE tokenaction[] = { - { 49, YYAT_SHIFT, 3 }, - { 49, YYAT_SHIFT, 4 }, - { 32, YYAT_SHIFT, 40 }, - { 49, YYAT_SHIFT, 5 }, - { 49, YYAT_SHIFT, 6 }, - { 32, YYAT_SHIFT, 41 }, - { 47, YYAT_SHIFT, 40 }, + { 67, YYAT_SHIFT, 3 }, + { 67, YYAT_SHIFT, 4 }, + { 68, YYAT_SHIFT, 70 }, + { 67, YYAT_SHIFT, 5 }, + { 67, YYAT_SHIFT, 6 }, + { 67, YYAT_SHIFT, 7 }, + { 67, YYAT_SHIFT, 8 }, { 2, YYAT_SHIFT, 3 }, { 2, YYAT_SHIFT, 4 }, - { 49, YYAT_SHIFT, 7 }, + { 65, YYAT_SHIFT, 68 }, { 2, YYAT_SHIFT, 5 }, { 2, YYAT_SHIFT, 6 }, - { 49, YYAT_SHIFT, 8 }, - { 30, YYAT_SHIFT, 38 }, - { 30, YYAT_SHIFT, 39 }, - { 49, YYAT_SHIFT, 9 }, { 2, YYAT_SHIFT, 7 }, - { 49, YYAT_SHIFT, 10 }, - { 30, YYAT_ERROR, 0 }, { 2, YYAT_SHIFT, 8 }, - { 46, YYAT_SHIFT, 40 }, - { 45, YYAT_SHIFT, 40 }, + { 67, YYAT_SHIFT, 9 }, + { 40, YYAT_SHIFT, 50 }, + { 40, YYAT_SHIFT, 51 }, + { 67, YYAT_SHIFT, 10 }, + { 57, YYAT_SHIFT, 67 }, + { 40, YYAT_SHIFT, 54 }, + { 67, YYAT_SHIFT, 11 }, { 2, YYAT_SHIFT, 9 }, - { 44, YYAT_SHIFT, 49 }, + { 67, YYAT_SHIFT, 12 }, + { 54, YYAT_SHIFT, 66 }, { 2, YYAT_SHIFT, 10 }, - { 40, YYAT_SHIFT, 25 }, - { 40, YYAT_SHIFT, 26 }, - { 40, YYAT_SHIFT, 10 }, - { 41, YYAT_SHIFT, 48 }, - { 36, YYAT_SHIFT, 43 }, - { 35, YYAT_SHIFT, 40 }, - { 34, YYAT_SHIFT, 42 }, - { 27, YYAT_SHIFT, 37 }, - { 24, YYAT_SHIFT, 24 }, - { 19, YYAT_SHIFT, 33 }, - { 14, YYAT_SHIFT, 23 }, - { 13, YYAT_SHIFT, 22 }, - { 12, YYAT_SHIFT, 21 }, - { 10, YYAT_SHIFT, 20 }, - { 6, YYAT_SHIFT, 18 }, - { 5, YYAT_SHIFT, 17 }, - { 4, YYAT_SHIFT, 16 }, - { 3, YYAT_SHIFT, 15 }, + { 63, YYAT_SHIFT, 50 }, + { 63, YYAT_SHIFT, 51 }, + { 2, YYAT_SHIFT, 11 }, + { 51, YYAT_ERROR, 0 }, + { 2, YYAT_SHIFT, 12 }, + { 36, YYAT_SHIFT, 46 }, + { 36, YYAT_SHIFT, 47 }, + { 36, YYAT_SHIFT, 48 }, + { 36, YYAT_SHIFT, 49 }, + { 53, YYAT_SHIFT, 28 }, + { 62, YYAT_SHIFT, 50 }, + { 62, YYAT_SHIFT, 51 }, + { 44, YYAT_SHIFT, 56 }, + { 36, YYAT_ERROR, 0 }, + { 53, YYAT_SHIFT, 29 }, + { 53, YYAT_SHIFT, 30 }, + { 53, YYAT_SHIFT, 12 }, + { 61, YYAT_SHIFT, 50 }, + { 61, YYAT_SHIFT, 51 }, + { 60, YYAT_SHIFT, 50 }, + { 60, YYAT_SHIFT, 51 }, + { 59, YYAT_SHIFT, 50 }, + { 59, YYAT_SHIFT, 51 }, + { 58, YYAT_SHIFT, 50 }, + { 58, YYAT_SHIFT, 51 }, + { 43, YYAT_SHIFT, 50 }, + { 43, YYAT_SHIFT, 51 }, + { 42, YYAT_SHIFT, 55 }, + { 39, YYAT_SHIFT, 53 }, + { 38, YYAT_SHIFT, 52 }, + { 31, YYAT_SHIFT, 45 }, + { 23, YYAT_SHIFT, 41 }, + { 20, YYAT_SHIFT, 39 }, + { 16, YYAT_SHIFT, 27 }, + { 15, YYAT_SHIFT, 26 }, + { 14, YYAT_SHIFT, 25 }, + { 12, YYAT_SHIFT, 24 }, + { 8, YYAT_SHIFT, 22 }, + { 7, YYAT_SHIFT, 21 }, + { 5, YYAT_SHIFT, 19 }, + { 4, YYAT_SHIFT, 18 }, + { 3, YYAT_SHIFT, 17 }, { 1, YYAT_ACCEPT, 0 } }; yytokenaction = tokenaction; - yytokenaction_size = 44; + yytokenaction_size = 68; static const yystateaction_t YYNEARFAR YYBASED_CODE stateaction[] = { { 0, 0, YYAT_REDUCE, 3 }, - { 43, 1, YYAT_ERROR, 0 }, + { 67, 1, YYAT_ERROR, 0 }, { -250, 1, YYAT_REDUCE, 1 }, - { -224, 1, YYAT_DEFAULT, 41 }, - { -226, 1, YYAT_DEFAULT, 10 }, - { -226, 1, YYAT_DEFAULT, 41 }, - { -228, 1, YYAT_DEFAULT, 10 }, + { -205, 1, YYAT_DEFAULT, 68 }, + { -207, 1, YYAT_DEFAULT, 39 }, + { -208, 1, YYAT_DEFAULT, 39 }, + { 0, 0, YYAT_DEFAULT, 67 }, + { -208, 1, YYAT_DEFAULT, 68 }, + { -210, 1, YYAT_DEFAULT, 39 }, { 0, 0, YYAT_REDUCE, 4 }, { 0, 0, YYAT_REDUCE, 3 }, - { 0, 0, YYAT_REDUCE, 19 }, - { -229, 1, YYAT_ERROR, 0 }, - { 0, 0, YYAT_REDUCE, 2 }, - { -229, 1, YYAT_DEFAULT, 41 }, - { -226, 1, YYAT_ERROR, 0 }, - { -231, 1, YYAT_DEFAULT, 41 }, - { 0, 0, YYAT_REDUCE, 5 }, - { 0, 0, YYAT_DEFAULT, 24 }, - { 0, 0, YYAT_REDUCE, 6 }, - { 0, 0, YYAT_DEFAULT, 40 }, - { -236, 1, YYAT_DEFAULT, 49 }, - { 0, 0, YYAT_REDUCE, 24 }, - { 0, 0, YYAT_REDUCE, 8 }, - { 0, 0, YYAT_DEFAULT, 40 }, - { 0, 0, YYAT_REDUCE, 12 }, - { -234, 1, YYAT_DEFAULT, 40 }, - { 0, 0, YYAT_REDUCE, 21 }, - { 0, 0, YYAT_REDUCE, 20 }, - { -236, 1, YYAT_DEFAULT, 36 }, - { 0, 0, YYAT_REDUCE, 15 }, - { 0, 0, YYAT_REDUCE, 16 }, - { -250, 1, YYAT_DEFAULT, 32 }, - { 0, 0, YYAT_REDUCE, 23 }, - { -263, 1, YYAT_DEFAULT, 36 }, - { 0, 0, YYAT_REDUCE, 11 }, - { -237, 1, YYAT_DEFAULT, 36 }, - { -235, 1, YYAT_REDUCE, 13 }, - { -239, 1, YYAT_ERROR, 0 }, - { 0, 0, YYAT_DEFAULT, 49 }, - { 0, 0, YYAT_DEFAULT, 40 }, - { 0, 0, YYAT_DEFAULT, 40 }, - { -247, 1, YYAT_ERROR, 0 }, - { -238, 1, YYAT_ERROR, 0 }, { 0, 0, YYAT_REDUCE, 25 }, + { -211, 1, YYAT_DEFAULT, 39 }, + { 0, 0, YYAT_REDUCE, 2 }, + { -211, 1, YYAT_DEFAULT, 68 }, + { -205, 1, YYAT_ERROR, 0 }, + { -213, 1, YYAT_DEFAULT, 68 }, + { 0, 0, YYAT_REDUCE, 5 }, + { 0, 0, YYAT_DEFAULT, 53 }, + { 0, 0, YYAT_DEFAULT, 53 }, + { -203, 1, YYAT_ERROR, 0 }, + { 0, 0, YYAT_REDUCE, 6 }, + { 0, 0, YYAT_DEFAULT, 51 }, + { -219, 1, YYAT_DEFAULT, 67 }, + { 0, 0, YYAT_REDUCE, 31 }, + { 0, 0, YYAT_REDUCE, 8 }, + { 0, 0, YYAT_DEFAULT, 51 }, { 0, 0, YYAT_REDUCE, 14 }, - { -236, 1, YYAT_REDUCE, 9 }, - { -244, 1, YYAT_REDUCE, 17 }, - { -245, 1, YYAT_REDUCE, 18 }, - { -259, 1, YYAT_REDUCE, 22 }, + { 0, 0, YYAT_DEFAULT, 53 }, + { 0, 0, YYAT_REDUCE, 27 }, + { 0, 0, YYAT_REDUCE, 26 }, + { -218, 1, YYAT_DEFAULT, 65 }, + { 0, 0, YYAT_REDUCE, 17 }, + { 0, 0, YYAT_REDUCE, 18 }, + { 0, 0, YYAT_REDUCE, 19 }, + { 0, 0, YYAT_REDUCE, 20 }, + { -235, 1, YYAT_DEFAULT, 40 }, + { 0, 0, YYAT_REDUCE, 30 }, + { -219, 1, YYAT_DEFAULT, 65 }, + { -219, 1, YYAT_ERROR, 0 }, + { -254, 1, YYAT_DEFAULT, 65 }, + { 0, 0, YYAT_REDUCE, 13 }, + { -221, 1, YYAT_DEFAULT, 65 }, + { -219, 1, YYAT_REDUCE, 15 }, + { -236, 1, YYAT_DEFAULT, 65 }, + { 0, 0, YYAT_DEFAULT, 67 }, + { 0, 0, YYAT_DEFAULT, 51 }, + { 0, 0, YYAT_DEFAULT, 51 }, + { 0, 0, YYAT_DEFAULT, 51 }, + { 0, 0, YYAT_DEFAULT, 51 }, + { 0, 0, YYAT_DEFAULT, 51 }, + { -244, 1, YYAT_DEFAULT, 53 }, + { 0, 0, YYAT_DEFAULT, 67 }, + { -238, 1, YYAT_DEFAULT, 39 }, + { -248, 1, YYAT_DEFAULT, 68 }, + { 0, 0, YYAT_REDUCE, 32 }, + { 0, 0, YYAT_REDUCE, 16 }, + { -241, 1, YYAT_REDUCE, 9 }, + { -221, 1, YYAT_REDUCE, 21 }, + { -223, 1, YYAT_REDUCE, 22 }, + { -225, 1, YYAT_REDUCE, 23 }, + { -227, 1, YYAT_REDUCE, 24 }, + { -234, 1, YYAT_REDUCE, 28 }, + { -244, 1, YYAT_REDUCE, 29 }, + { 0, 0, YYAT_REDUCE, 11 }, + { -264, 1, YYAT_ERROR, 0 }, { 0, 0, YYAT_REDUCE, 7 }, - { -257, 1, YYAT_DEFAULT, 41 }, - { 0, 0, YYAT_REDUCE, 10 } + { -257, 1, YYAT_DEFAULT, 68 }, + { -269, 1, YYAT_ERROR, 0 }, + { 0, 0, YYAT_REDUCE, 10 }, + { 0, 0, YYAT_REDUCE, 12 } }; yystateaction = stateaction; static const yynontermgoto_t YYNEARFAR YYBASED_CODE nontermgoto[] = { - { 49, 50 }, - { 49, 12 }, - { 24, 36 }, - { 24, 28 }, - { 24, 29 }, - { 49, 13 }, - { 24, 30 }, - { 49, 14 }, - { 40, 47 }, - { 40, 31 }, + { 53, 65 }, + { 53, 32 }, + { 53, 33 }, + { 53, 34 }, + { 53, 35 }, + { 52, 64 }, + { 53, 36 }, + { 67, 69 }, + { 67, 14 }, + { 51, 63 }, + { 51, 37 }, { 0, 1 }, { 0, 2 }, - { 39, 46 }, - { 38, 45 }, - { 37, 44 }, - { 22, 35 }, - { 20, 34 }, - { 19, 11 }, - { 18, 32 }, - { 16, 27 }, - { 8, 19 } + { 50, 62 }, + { 67, 15 }, + { 49, 61 }, + { 67, 16 }, + { 48, 60 }, + { 47, 59 }, + { 46, 58 }, + { 45, 57 }, + { 28, 44 }, + { 26, 43 }, + { 24, 42 }, + { 23, 13 }, + { 22, 40 }, + { 19, 38 }, + { 18, 31 }, + { 10, 23 }, + { 6, 20 } }; yynontermgoto = nontermgoto; - yynontermgoto_size = 21; + yynontermgoto_size = 30; static const yystategoto_t YYNEARFAR YYBASED_CODE stategoto[] = { - { 9, -1 }, + { 10, -1 }, { 0, -1 }, - { 0, 19 }, + { 0, 23 }, { 0, -1 }, { 0, -1 }, { 0, -1 }, + { 26, 67 }, { 0, -1 }, { 0, -1 }, - { 18, -1 }, + { 0, -1 }, + { 26, -1 }, { 0, -1 }, { 0, -1 }, { 0, -1 }, @@ -639,15 +804,17 @@ void YYPARSENAME::yytables() { 0, -1 }, { 0, -1 }, { 0, -1 }, - { 14, 24 }, + { 22, 53 }, + { 21, 53 }, { 0, -1 }, - { 9, 40 }, - { 14, 49 }, - { 5, -1 }, { 0, -1 }, - { 6, 40 }, + { 14, 51 }, + { 21, 67 }, + { 10, -1 }, { 0, -1 }, - { -3, 40 }, + { 11, 51 }, + { 0, -1 }, + { 16, 53 }, { 0, -1 }, { 0, -1 }, { 0, -1 }, @@ -660,10 +827,19 @@ void YYPARSENAME::yytables() { 0, -1 }, { 0, -1 }, { 0, -1 }, - { 11, 49 }, - { 4, 40 }, - { 3, 40 }, - { -1, -1 }, + { 0, -1 }, + { 0, -1 }, + { 0, -1 }, + { 0, -1 }, + { 17, 67 }, + { 8, 51 }, + { 7, 51 }, + { 6, 51 }, + { 4, 51 }, + { 2, 51 }, + { -2, -1 }, + { 2, 67 }, + { -5, 51 }, { 0, -1 }, { 0, -1 }, { 0, -1 }, @@ -672,7 +848,14 @@ void YYPARSENAME::yytables() { 0, -1 }, { 0, -1 }, { 0, -1 }, - { -3, -1 }, + { 0, -1 }, + { 0, -1 }, + { 0, -1 }, + { 0, -1 }, + { 0, -1 }, + { 4, -1 }, + { 0, -1 }, + { 0, -1 }, { 0, -1 } }; yystategoto = stategoto; diff --git a/Utils/Scripter/parser.h b/Utils/Scripter/parser.h index e54ddf7bd..18555d546 100644 --- a/Utils/Scripter/parser.h +++ b/Utils/Scripter/parser.h @@ -63,19 +63,24 @@ union tagYYSTYPE { #define STOP 257 #define IF 258 #define ELSE 259 -#define PAUSE 260 -#define PRINT 261 -#define ASSIGN 262 -#define EQUAL 263 -#define NOTEQUAL 264 -#define PLUS 265 -#define END_STMT 266 -#define OPEN_PAR 267 -#define CLOSE_PAR 268 -#define BEGIN_CS 269 -#define END_CS 270 -#define COMMA 271 -#define VARIABLE 272 -#define VALUE 273 -#define FUNCTION 274 +#define WHILE 260 +#define DO 261 +#define PAUSE 262 +#define PRINT 263 +#define ASSIGN 264 +#define EQUAL 265 +#define NOTEQUAL 266 +#define LESSTHAN 267 +#define GREATERTHAN 268 +#define PLUS 269 +#define SUBTRACT 270 +#define END_STMT 271 +#define OPEN_PAR 272 +#define CLOSE_PAR 273 +#define BEGIN_CS 274 +#define END_CS 275 +#define COMMA 276 +#define VARIABLE 277 +#define VALUE 278 +#define FUNCTION 279 #endif diff --git a/Utils/Scripter/parser.v b/Utils/Scripter/parser.v index 95f2ce3e3..0324a2a35 100644 --- a/Utils/Scripter/parser.v +++ b/Utils/Scripter/parser.v @@ -12,29 +12,38 @@ 8 | assign_expression END_STMT 9 | IF OPEN_PAR expression CLOSE_PAR statement 10 | IF OPEN_PAR expression CLOSE_PAR statement ELSE statement - 11 | BEGIN_CS statement_list END_CS - 12 | function END_STMT + 11 | WHILE OPEN_PAR expression CLOSE_PAR statement + 12 | DO statement WHILE OPEN_PAR expression CLOSE_PAR END_STMT + 13 | BEGIN_CS statement_list END_CS + 14 | function END_STMT - 13 assign_expression : variable ASSIGN value + 15 assign_expression : variable ASSIGN value - 14 expression : OPEN_PAR expression CLOSE_PAR - 15 | equal_expression - 16 | notequal_expression + 16 expression : OPEN_PAR expression CLOSE_PAR + 17 | equal_expression + 18 | notequal_expression + 19 | lessthan_expression + 20 | greaterthan_expression - 17 equal_expression : value EQUAL value + 21 equal_expression : value EQUAL value - 18 notequal_expression : value NOTEQUAL value + 22 notequal_expression : value NOTEQUAL value - 19 variable : VARIABLE + 23 lessthan_expression : value LESSTHAN value - 20 value : VALUE - 21 | VARIABLE - 22 | value PLUS value - 23 | function + 24 greaterthan_expression : value GREATERTHAN value - 24 $$1 : + 25 variable : VARIABLE - 25 function : FUNCTION OPEN_PAR $$1 CLOSE_PAR + 26 value : VALUE + 27 | VARIABLE + 28 | value PLUS value + 29 | value SUBTRACT value + 30 | function + + 31 $$1 : + + 32 function : FUNCTION OPEN_PAR $$1 CLOSE_PAR state 0 @@ -59,420 +68,649 @@ state 2 STOP shift 3 IF shift 4 - PAUSE shift 5 - PRINT shift 6 - END_STMT shift 7 - BEGIN_CS shift 8 - VARIABLE shift 9 - FUNCTION shift 10 + WHILE shift 5 + DO shift 6 + PAUSE shift 7 + PRINT shift 8 + END_STMT shift 9 + BEGIN_CS shift 10 + VARIABLE shift 11 + FUNCTION shift 12 . reduce 1 - statement goto 11 - assign_expression goto 12 - variable goto 13 - function goto 14 + statement goto 13 + assign_expression goto 14 + variable goto 15 + function goto 16 state 3 statement : STOP . END_STMT - END_STMT shift 15 + END_STMT shift 17 state 4 statement : IF . OPEN_PAR expression CLOSE_PAR statement statement : IF . OPEN_PAR expression CLOSE_PAR statement ELSE statement - OPEN_PAR shift 16 - - -state 5 - statement : PAUSE . END_STMT - - END_STMT shift 17 - - -state 6 - statement : PRINT . OPEN_PAR value CLOSE_PAR END_STMT - OPEN_PAR shift 18 +state 5 + statement : WHILE . OPEN_PAR expression CLOSE_PAR statement + + OPEN_PAR shift 19 + + +state 6 + statement : DO . statement WHILE OPEN_PAR expression CLOSE_PAR END_STMT + + STOP shift 3 + IF shift 4 + WHILE shift 5 + DO shift 6 + PAUSE shift 7 + PRINT shift 8 + END_STMT shift 9 + BEGIN_CS shift 10 + VARIABLE shift 11 + FUNCTION shift 12 + + statement goto 20 + assign_expression goto 14 + variable goto 15 + function goto 16 + + state 7 + statement : PAUSE . END_STMT + + END_STMT shift 21 + + +state 8 + statement : PRINT . OPEN_PAR value CLOSE_PAR END_STMT + + OPEN_PAR shift 22 + + +state 9 statement : END_STMT . (4) . reduce 4 -state 8 +state 10 statement : BEGIN_CS . statement_list END_CS statement_list : . (3) . reduce 3 - statement_list goto 19 - - -state 9 - variable : VARIABLE . (19) - - . reduce 19 - - -state 10 - function : FUNCTION . OPEN_PAR $$1 CLOSE_PAR - - OPEN_PAR shift 20 + statement_list goto 23 state 11 + variable : VARIABLE . (25) + + . reduce 25 + + +state 12 + function : FUNCTION . OPEN_PAR $$1 CLOSE_PAR + + OPEN_PAR shift 24 + + +state 13 statement_list : statement_list statement . (2) . reduce 2 -state 12 +state 14 statement : assign_expression . END_STMT - END_STMT shift 21 - - -state 13 - assign_expression : variable . ASSIGN value - - ASSIGN shift 22 - - -state 14 - statement : function . END_STMT - - END_STMT shift 23 + END_STMT shift 25 state 15 + assign_expression : variable . ASSIGN value + + ASSIGN shift 26 + + +state 16 + statement : function . END_STMT + + END_STMT shift 27 + + +state 17 statement : STOP END_STMT . (5) . reduce 5 -state 16 +state 18 statement : IF OPEN_PAR . expression CLOSE_PAR statement statement : IF OPEN_PAR . expression CLOSE_PAR statement ELSE statement - OPEN_PAR shift 24 - VARIABLE shift 25 - VALUE shift 26 - FUNCTION shift 10 + OPEN_PAR shift 28 + VARIABLE shift 29 + VALUE shift 30 + FUNCTION shift 12 - expression goto 27 - equal_expression goto 28 - notequal_expression goto 29 - value goto 30 - function goto 31 + expression goto 31 + equal_expression goto 32 + notequal_expression goto 33 + lessthan_expression goto 34 + greaterthan_expression goto 35 + value goto 36 + function goto 37 -state 17 +state 19 + statement : WHILE OPEN_PAR . expression CLOSE_PAR statement + + OPEN_PAR shift 28 + VARIABLE shift 29 + VALUE shift 30 + FUNCTION shift 12 + + expression goto 38 + equal_expression goto 32 + notequal_expression goto 33 + lessthan_expression goto 34 + greaterthan_expression goto 35 + value goto 36 + function goto 37 + + +state 20 + statement : DO statement . WHILE OPEN_PAR expression CLOSE_PAR END_STMT + + WHILE shift 39 + + +state 21 statement : PAUSE END_STMT . (6) . reduce 6 -state 18 +state 22 statement : PRINT OPEN_PAR . value CLOSE_PAR END_STMT - VARIABLE shift 25 - VALUE shift 26 - FUNCTION shift 10 + VARIABLE shift 29 + VALUE shift 30 + FUNCTION shift 12 - value goto 32 - function goto 31 + value goto 40 + function goto 37 -state 19 +state 23 statement_list : statement_list . statement statement : BEGIN_CS statement_list . END_CS STOP shift 3 IF shift 4 - PAUSE shift 5 - PRINT shift 6 - END_STMT shift 7 - BEGIN_CS shift 8 - END_CS shift 33 - VARIABLE shift 9 - FUNCTION shift 10 + WHILE shift 5 + DO shift 6 + PAUSE shift 7 + PRINT shift 8 + END_STMT shift 9 + BEGIN_CS shift 10 + END_CS shift 41 + VARIABLE shift 11 + FUNCTION shift 12 - statement goto 11 - assign_expression goto 12 - variable goto 13 - function goto 14 + statement goto 13 + assign_expression goto 14 + variable goto 15 + function goto 16 -state 20 +state 24 function : FUNCTION OPEN_PAR . $$1 CLOSE_PAR - $$1 : . (24) + $$1 : . (31) - . reduce 24 + . reduce 31 - $$1 goto 34 + $$1 goto 42 -state 21 +state 25 statement : assign_expression END_STMT . (8) . reduce 8 -state 22 +state 26 assign_expression : variable ASSIGN . value - VARIABLE shift 25 - VALUE shift 26 - FUNCTION shift 10 + VARIABLE shift 29 + VALUE shift 30 + FUNCTION shift 12 - value goto 35 - function goto 31 + value goto 43 + function goto 37 -state 23 - statement : function END_STMT . (12) +state 27 + statement : function END_STMT . (14) - . reduce 12 + . reduce 14 -state 24 +state 28 expression : OPEN_PAR . expression CLOSE_PAR - OPEN_PAR shift 24 - VARIABLE shift 25 - VALUE shift 26 - FUNCTION shift 10 + OPEN_PAR shift 28 + VARIABLE shift 29 + VALUE shift 30 + FUNCTION shift 12 - expression goto 36 - equal_expression goto 28 - notequal_expression goto 29 - value goto 30 - function goto 31 + expression goto 44 + equal_expression goto 32 + notequal_expression goto 33 + lessthan_expression goto 34 + greaterthan_expression goto 35 + value goto 36 + function goto 37 -state 25 - value : VARIABLE . (21) +state 29 + value : VARIABLE . (27) - . reduce 21 + . reduce 27 -state 26 - value : VALUE . (20) +state 30 + value : VALUE . (26) + + . reduce 26 + + +state 31 + statement : IF OPEN_PAR expression . CLOSE_PAR statement + statement : IF OPEN_PAR expression . CLOSE_PAR statement ELSE statement + + CLOSE_PAR shift 45 + + +state 32 + expression : equal_expression . (17) + + . reduce 17 + + +state 33 + expression : notequal_expression . (18) + + . reduce 18 + + +state 34 + expression : lessthan_expression . (19) + + . reduce 19 + + +state 35 + expression : greaterthan_expression . (20) . reduce 20 -state 27 - statement : IF OPEN_PAR expression . CLOSE_PAR statement - statement : IF OPEN_PAR expression . CLOSE_PAR statement ELSE statement - - CLOSE_PAR shift 37 - - -state 28 - expression : equal_expression . (15) - - . reduce 15 - - -state 29 - expression : notequal_expression . (16) - - . reduce 16 - - -state 30 +state 36 equal_expression : value . EQUAL value notequal_expression : value . NOTEQUAL value + lessthan_expression : value . LESSTHAN value + greaterthan_expression : value . GREATERTHAN value value : value . PLUS value + value : value . SUBTRACT value - EQUAL shift 38 - NOTEQUAL shift 39 - PLUS shift 40 - - -state 31 - value : function . (23) - - . reduce 23 - - -state 32 - statement : PRINT OPEN_PAR value . CLOSE_PAR END_STMT - value : value . PLUS value - - PLUS shift 40 - CLOSE_PAR shift 41 - - -state 33 - statement : BEGIN_CS statement_list END_CS . (11) - - . reduce 11 - - -state 34 - function : FUNCTION OPEN_PAR $$1 . CLOSE_PAR - - CLOSE_PAR shift 42 - - -state 35 - assign_expression : variable ASSIGN value . (13) - value : value . PLUS value - - PLUS shift 40 - . reduce 13 - - -state 36 - expression : OPEN_PAR expression . CLOSE_PAR - - CLOSE_PAR shift 43 + EQUAL shift 46 + NOTEQUAL shift 47 + LESSTHAN shift 48 + GREATERTHAN shift 49 + PLUS shift 50 + SUBTRACT shift 51 state 37 + value : function . (30) + + . reduce 30 + + +state 38 + statement : WHILE OPEN_PAR expression . CLOSE_PAR statement + + CLOSE_PAR shift 52 + + +state 39 + statement : DO statement WHILE . OPEN_PAR expression CLOSE_PAR END_STMT + + OPEN_PAR shift 53 + + +state 40 + statement : PRINT OPEN_PAR value . CLOSE_PAR END_STMT + value : value . PLUS value + value : value . SUBTRACT value + + PLUS shift 50 + SUBTRACT shift 51 + CLOSE_PAR shift 54 + + +state 41 + statement : BEGIN_CS statement_list END_CS . (13) + + . reduce 13 + + +state 42 + function : FUNCTION OPEN_PAR $$1 . CLOSE_PAR + + CLOSE_PAR shift 55 + + +state 43 + assign_expression : variable ASSIGN value . (15) + value : value . PLUS value + value : value . SUBTRACT value + + PLUS shift 50 + SUBTRACT shift 51 + . reduce 15 + + +state 44 + expression : OPEN_PAR expression . CLOSE_PAR + + CLOSE_PAR shift 56 + + +state 45 statement : IF OPEN_PAR expression CLOSE_PAR . statement statement : IF OPEN_PAR expression CLOSE_PAR . statement ELSE statement STOP shift 3 IF shift 4 - PAUSE shift 5 - PRINT shift 6 - END_STMT shift 7 - BEGIN_CS shift 8 - VARIABLE shift 9 - FUNCTION shift 10 + WHILE shift 5 + DO shift 6 + PAUSE shift 7 + PRINT shift 8 + END_STMT shift 9 + BEGIN_CS shift 10 + VARIABLE shift 11 + FUNCTION shift 12 - statement goto 44 - assign_expression goto 12 - variable goto 13 - function goto 14 - - -state 38 - equal_expression : value EQUAL . value - - VARIABLE shift 25 - VALUE shift 26 - FUNCTION shift 10 - - value goto 45 - function goto 31 - - -state 39 - notequal_expression : value NOTEQUAL . value - - VARIABLE shift 25 - VALUE shift 26 - FUNCTION shift 10 - - value goto 46 - function goto 31 - - -state 40 - value : value PLUS . value - - VARIABLE shift 25 - VALUE shift 26 - FUNCTION shift 10 - - value goto 47 - function goto 31 - - -state 41 - statement : PRINT OPEN_PAR value CLOSE_PAR . END_STMT - - END_STMT shift 48 - - -state 42 - function : FUNCTION OPEN_PAR $$1 CLOSE_PAR . (25) - - . reduce 25 - - -state 43 - expression : OPEN_PAR expression CLOSE_PAR . (14) - - . reduce 14 - - -44: shift-reduce conflict (shift 49, reduce 9) on ELSE -state 44 - statement : IF OPEN_PAR expression CLOSE_PAR statement . (9) - statement : IF OPEN_PAR expression CLOSE_PAR statement . ELSE statement - - ELSE shift 49 - . reduce 9 - - -state 45 - equal_expression : value EQUAL value . (17) - value : value . PLUS value - - PLUS shift 40 - . reduce 17 + statement goto 57 + assign_expression goto 14 + variable goto 15 + function goto 16 state 46 - notequal_expression : value NOTEQUAL value . (18) - value : value . PLUS value + equal_expression : value EQUAL . value - PLUS shift 40 - . reduce 18 + VARIABLE shift 29 + VALUE shift 30 + FUNCTION shift 12 + + value goto 58 + function goto 37 -47: shift-reduce conflict (shift 40, reduce 22) on PLUS state 47 - value : value PLUS value . (22) - value : value . PLUS value + notequal_expression : value NOTEQUAL . value - PLUS shift 40 - . reduce 22 + VARIABLE shift 29 + VALUE shift 30 + FUNCTION shift 12 + + value goto 59 + function goto 37 state 48 + lessthan_expression : value LESSTHAN . value + + VARIABLE shift 29 + VALUE shift 30 + FUNCTION shift 12 + + value goto 60 + function goto 37 + + +state 49 + greaterthan_expression : value GREATERTHAN . value + + VARIABLE shift 29 + VALUE shift 30 + FUNCTION shift 12 + + value goto 61 + function goto 37 + + +state 50 + value : value PLUS . value + + VARIABLE shift 29 + VALUE shift 30 + FUNCTION shift 12 + + value goto 62 + function goto 37 + + +state 51 + value : value SUBTRACT . value + + VARIABLE shift 29 + VALUE shift 30 + FUNCTION shift 12 + + value goto 63 + function goto 37 + + +state 52 + statement : WHILE OPEN_PAR expression CLOSE_PAR . statement + + STOP shift 3 + IF shift 4 + WHILE shift 5 + DO shift 6 + PAUSE shift 7 + PRINT shift 8 + END_STMT shift 9 + BEGIN_CS shift 10 + VARIABLE shift 11 + FUNCTION shift 12 + + statement goto 64 + assign_expression goto 14 + variable goto 15 + function goto 16 + + +state 53 + statement : DO statement WHILE OPEN_PAR . expression CLOSE_PAR END_STMT + + OPEN_PAR shift 28 + VARIABLE shift 29 + VALUE shift 30 + FUNCTION shift 12 + + expression goto 65 + equal_expression goto 32 + notequal_expression goto 33 + lessthan_expression goto 34 + greaterthan_expression goto 35 + value goto 36 + function goto 37 + + +state 54 + statement : PRINT OPEN_PAR value CLOSE_PAR . END_STMT + + END_STMT shift 66 + + +state 55 + function : FUNCTION OPEN_PAR $$1 CLOSE_PAR . (32) + + . reduce 32 + + +state 56 + expression : OPEN_PAR expression CLOSE_PAR . (16) + + . reduce 16 + + +57: shift-reduce conflict (shift 67, reduce 9) on ELSE +state 57 + statement : IF OPEN_PAR expression CLOSE_PAR statement . (9) + statement : IF OPEN_PAR expression CLOSE_PAR statement . ELSE statement + + ELSE shift 67 + . reduce 9 + + +state 58 + equal_expression : value EQUAL value . (21) + value : value . PLUS value + value : value . SUBTRACT value + + PLUS shift 50 + SUBTRACT shift 51 + . reduce 21 + + +state 59 + notequal_expression : value NOTEQUAL value . (22) + value : value . PLUS value + value : value . SUBTRACT value + + PLUS shift 50 + SUBTRACT shift 51 + . reduce 22 + + +state 60 + lessthan_expression : value LESSTHAN value . (23) + value : value . PLUS value + value : value . SUBTRACT value + + PLUS shift 50 + SUBTRACT shift 51 + . reduce 23 + + +state 61 + greaterthan_expression : value GREATERTHAN value . (24) + value : value . PLUS value + value : value . SUBTRACT value + + PLUS shift 50 + SUBTRACT shift 51 + . reduce 24 + + +62: shift-reduce conflict (shift 50, reduce 28) on PLUS +62: shift-reduce conflict (shift 51, reduce 28) on SUBTRACT +state 62 + value : value PLUS value . (28) + value : value . PLUS value + value : value . SUBTRACT value + + PLUS shift 50 + SUBTRACT shift 51 + . reduce 28 + + +63: shift-reduce conflict (shift 50, reduce 29) on PLUS +63: shift-reduce conflict (shift 51, reduce 29) on SUBTRACT +state 63 + value : value . PLUS value + value : value SUBTRACT value . (29) + value : value . SUBTRACT value + + PLUS shift 50 + SUBTRACT shift 51 + . reduce 29 + + +state 64 + statement : WHILE OPEN_PAR expression CLOSE_PAR statement . (11) + + . reduce 11 + + +state 65 + statement : DO statement WHILE OPEN_PAR expression . CLOSE_PAR END_STMT + + CLOSE_PAR shift 68 + + +state 66 statement : PRINT OPEN_PAR value CLOSE_PAR END_STMT . (7) . reduce 7 -state 49 +state 67 statement : IF OPEN_PAR expression CLOSE_PAR statement ELSE . statement STOP shift 3 IF shift 4 - PAUSE shift 5 - PRINT shift 6 - END_STMT shift 7 - BEGIN_CS shift 8 - VARIABLE shift 9 - FUNCTION shift 10 + WHILE shift 5 + DO shift 6 + PAUSE shift 7 + PRINT shift 8 + END_STMT shift 9 + BEGIN_CS shift 10 + VARIABLE shift 11 + FUNCTION shift 12 - statement goto 50 - assign_expression goto 12 - variable goto 13 - function goto 14 + statement goto 69 + assign_expression goto 14 + variable goto 15 + function goto 16 -state 50 +state 68 + statement : DO statement WHILE OPEN_PAR expression CLOSE_PAR . END_STMT + + END_STMT shift 70 + + +state 69 statement : IF OPEN_PAR expression CLOSE_PAR statement ELSE statement . (10) . reduce 10 -State 44 contains 1 shift-reduce conflict -State 47 contains 1 shift-reduce conflict +state 70 + statement : DO statement WHILE OPEN_PAR expression CLOSE_PAR END_STMT . (12) + + . reduce 12 -19 tokens, 12 nonterminals -26 grammar rules, 51 states +State 57 contains 1 shift-reduce conflict +State 62 contains 2 shift-reduce conflicts +State 63 contains 2 shift-reduce conflicts + + +24 tokens, 14 nonterminals +33 grammar rules, 71 states diff --git a/Utils/Scripter/parser.y b/Utils/Scripter/parser.y index 95d327029..4fa80350f 100644 --- a/Utils/Scripter/parser.y +++ b/Utils/Scripter/parser.y @@ -66,12 +66,17 @@ private: %token STOP %token IF %token ELSE +%token WHILE +%token DO %token PAUSE %token PRINT %token ASSIGN %token EQUAL %token NOTEQUAL +%token LESSTHAN +%token GREATERTHAN %token PLUS +%token SUBTRACT %token END_STMT %token OPEN_PAR %token CLOSE_PAR @@ -85,7 +90,7 @@ private: %type program statement_list statement %type assign_expression -%type expression equal_expression notequal_expression +%type expression equal_expression notequal_expression lessthan_expression greaterthan_expression %type variable %type value %type function @@ -115,6 +120,8 @@ statement |assign_expression END_STMT {$$=$1;} |IF OPEN_PAR expression CLOSE_PAR statement {$$=new CTreeNode(IF_STMT,$3,$5);} |IF OPEN_PAR expression CLOSE_PAR statement ELSE statement {$$=new CTreeNode(IFELSE_STMT,$3,$5,$7);} + |WHILE OPEN_PAR expression CLOSE_PAR statement {$$=new CTreeNode(WHILE_STMT,$3,$5);} + |DO statement WHILE OPEN_PAR expression CLOSE_PAR END_STMT {$$=new CTreeNode(DOWHILE_STMT,$2,$5);} |BEGIN_CS statement_list END_CS {$$=new CTreeNode(STMT_LIST,$2);} |function END_STMT {$$=new CTreeNode(STMT_LIST,$1,new CTreeNode(POP_STMT));} ; @@ -129,6 +136,8 @@ expression :OPEN_PAR expression CLOSE_PAR {$$=$2;} |equal_expression {$$=$1;} |notequal_expression {$$=$1;} + |lessthan_expression {$$=$1;} + |greaterthan_expression {$$=$1;} ; equal_expression @@ -139,6 +148,14 @@ notequal_expression :value NOTEQUAL value {$$=new CTreeNode(NOTEQUAL_EXPR,$1,$3);} ; +lessthan_expression + :value LESSTHAN value {$$=new CTreeNode(LESSTHAN_EXPR,$1,$3);} + ; + +greaterthan_expression + :value GREATERTHAN value {$$=new CTreeNode(GREATERTHAN_EXPR,$1,$3);} + ; + variable :VARIABLE {$$=new CTreeNode(VARIABLE_EXPR,$1);} // variable id @@ -147,7 +164,10 @@ variable value :VALUE {$$=new CTreeNode(VALUE_EXPR,$1);} |VARIABLE {$$=new CTreeNode(VARIABLE_EXPR,$1);} // variable value +// |PLUS value {$$=$2;} +// |SUBTRACT value {$$=new CTreeNode(STMT_LIST,$1,new CTreeNode( |value PLUS value {$$=new CTreeNode(PLUS_EXPR,$1,$3);} + |value SUBTRACT value {$$=new CTreeNode(SUBTRACT_EXPR,$1,$3);} |function {$$=$1;} ; diff --git a/Utils/Scripter/var.cpp b/Utils/Scripter/var.cpp index a33cadc02..e185d2104 100644 --- a/Utils/Scripter/var.cpp +++ b/Utils/Scripter/var.cpp @@ -57,9 +57,16 @@ static int s_numGlobalVarNames=sizeof(s_globalVarNames)/sizeof(char *); static char *s_localVarNames[]= { + "tmp0", "tmp1", "tmp2", "tmp3", + "tmp4", + "tmp5", + "tmp6", + "tmp7", + "tmp8", + "tmp9", }; static int s_numLocalVarNames=sizeof(s_localVarNames)/sizeof(char *); diff --git a/data/Scripts/test.scr b/data/Scripts/test.scr index 62587eea4..9d8f53cc3 100644 --- a/data/Scripts/test.scr +++ b/data/Scripts/test.scr @@ -1,10 +1,74 @@ -#include data/scripts/defs.scr +#include data/scripts/defs/defs.scr +#include data/scripts/defs/charanim.scr -//$tmp1=11; -//$tmp2=22; -//$tmp3=_setCharacterExpression(1,2); -//$tmp3=_setCharacterExpression($tmp1,$tmp2); -print($tmp3); -$tmp3=_setText(123); +//do +//{ +// print($tmp1); +// $tmp1=$tmp1+1; +// pause; +//} +//while($tmp1<1); +//print(112-_setText(1)); +//do +//{ +// print($tmp1); +// $tmp1=$tmp1+1; +// pause; +//} +//while($tmp1<2); +//print(222); +//stop; + + +//_setCharacterAnimation(CHAR_SPONGEBOB,ANIM_QUIET); +//_setText(123); +//pause; + +#define x $tmp1 +#define y $tmp2 +#define vx $tmp3 +#define vy $tmp4 +#define velocity 5 + +x=100; +y=100; +vx=velocity; +vy=velocity; +while(1==1) +{ + _drawSprite(0,x,y,100); + + $tmp0=_getFrameTime(); + print($tmp0); + do + { + x=x+vx; + if(x>512) + { + vx=0-velocity; + x=x-velocity; + } + else if(x<0) + { + vx=velocity; + x=x+velocity; + } + + y=y+vy; + if(y>256) + { + vy=0-velocity; + y=y-velocity; + } + else if(y<0) + { + vy=velocity; + y=y+velocity; + } + $tmp0=$tmp0-1; + } + while($tmp0>0); + pause; +} stop; \ No newline at end of file diff --git a/source/script/function.cpp b/source/script/function.cpp index ff05abe99..721e4c488 100644 --- a/source/script/function.cpp +++ b/source/script/function.cpp @@ -22,6 +22,10 @@ #include "system\dbg.h" #endif +#ifndef __SYSTEM_GSTATE_H__ +#include "system\gstate.h" +#endif + /* Std Lib ------- */ @@ -48,8 +52,10 @@ typedef struct Function Prototypes ------------------- */ -static signed short func_setCharacterExpression(unsigned short *_args); +static signed short func_setCharacterAnimation(unsigned short *_args); static signed short func_setText(unsigned short *_args); +static signed short func_drawSprite(unsigned short *_args); +static signed short func_getFrameTime(unsigned short *_args); /*---------------------------------------------------------------------- @@ -58,8 +64,10 @@ static signed short func_setText(unsigned short *_args); static FunctionDef s_functionDefs[]= { - { func_setCharacterExpression, 2 }, // character, expression + { func_setCharacterAnimation, 2 }, // character,animation { func_setText, 1 }, // textId + { func_drawSprite, 4 }, // frame,x,y,ot + { func_getFrameTime, 0 }, // }; static const int s_numFunctionDefs=sizeof(s_functionDefs)/sizeof(FunctionDef); @@ -86,10 +94,10 @@ signed short callFunction(int _functionNumber,int _argCount,unsigned short *_arg /*---------------------------------------------------------------------- Function: Purpose: - Params: + Params: character,animation Returns: ---------------------------------------------------------------------- */ -static signed short func_setCharacterExpression(unsigned short *_args) +static signed short func_setCharacterAnimation(unsigned short *_args) { return _args[0]; } @@ -98,7 +106,7 @@ static signed short func_setCharacterExpression(unsigned short *_args) /*---------------------------------------------------------------------- Function: Purpose: - Params: + Params: textid Returns: ---------------------------------------------------------------------- */ static signed short func_setText(unsigned short *_args) @@ -107,5 +115,39 @@ static signed short func_setText(unsigned short *_args) } +/*---------------------------------------------------------------------- + Function: + Purpose: + Params: frame,x,y,ot + Returns: + ---------------------------------------------------------------------- */ +#include "gfx\sprbank.h" +SpriteBank *sb=NULL; +static signed short func_drawSprite(unsigned short *_args) +{ + sFrameHdr *fh; + if(!sb) + { + sb=new ("sb") SpriteBank; + sb->load(UI_UIGFX_SPR); + } + fh=sb->getFrameHeader(_args[0]); + sb->printFT4(_args[0],_args[1]-(fh->W/2),_args[2]-(fh->H/2),0,0,_args[3]); + return 0; +} + + +/*---------------------------------------------------------------------- + Function: + Purpose: + Params: textid + Returns: + ---------------------------------------------------------------------- */ +static signed short func_getFrameTime(unsigned short *_args) +{ + return GameState::getFramesSinceLast(); +} + + /*=========================================================================== end */ diff --git a/source/script/script.cpp b/source/script/script.cpp index f288493e2..19aa0c1f9 100644 --- a/source/script/script.cpp +++ b/source/script/script.cpp @@ -42,7 +42,7 @@ ------------------- */ //#define FULL_CODE_OUTPUT -//#define SHOW_RUN_COUNT +//#define SHOW_RUN_COUNT /*---------------------------------------------------------------------- @@ -258,6 +258,24 @@ PAUL_DBGMSG("pc:0x%04d sp:%03d",m_pc*2,m_sp); #endif push(val1!=val2); break; + + case OP_IS_LESSTHAN_VALUE: // value, value pushes result ( 0 or 1 ) to stack + val1=pop(); + val2=pop(); +#ifdef FULL_CODE_OUTPUT + PAUL_DBGMSG("OP_IS_LESSTHAN_VALUE %d,%d",val1,val2); +#endif + push(val1val2); + break; case OP_ASSIGN: // varidx, value val1=pop(); @@ -276,7 +294,15 @@ PAUL_DBGMSG("pc:0x%04d sp:%03d",m_pc*2,m_sp); #endif push(val1+val2); break; - + + case OP_NEG: // value pushes result to stack + val1=pop(); +#ifdef FULL_CODE_OUTPUT + PAUL_DBGMSG("NEG %d",val1); +#endif + push(-val1); + break; + case OP_PRINT: // value val1=pop(); PAUL_DBGMSG("PRINT %d",val1); @@ -291,7 +317,7 @@ PAUL_DBGMSG("pc:0x%04d sp:%03d",m_pc*2,m_sp); ASSERT(val2&n&2y526OrI{9*rIwYMx2&wFtPVj%MMYk6exJ3^85p(i^Si(Q^ZcLZ_xy%u z?U%LJUVH7e*M8qKyjm6d>h925dBFI`&Eq)r)5wML!F(XcH3}Tppdink6NC7{e7!h| zA0bp}q~l)+QCpL{>1#C{*8?Q20v99J35kK0Y7LjbZ;kEUbGUukIy;ie&x1`k0*&H# ze812?M=Ru2MIA2VbbzIxe;J8tH<`wU2+qD}D2 z4?G}LhB&O59M{y62PbU`oYmQIJQ;8jM#4D|59fz&aL!P|!5lav2zP~uD+p)O!0aeK&+UOoQ=s2xYH@$GZ3q(A|FmwcR0;N z_#}jH+Dg>x2f-QKAI>PEtE7VGKtD}ua^Xx%htou5G6CNul1F$r%g{JY=J9Y|CIKS{ zz^SHeM~U-O5O7S>&s5Uwj3E^~kmP!YM4wB98!2B7B}^tMjTGeuatEpsa(S_;XQ1%( zyW*yv!+UnW>h+!~=zv~1cR}kZ&eSfR?m1Wp*)0Cl)6yq+7NI*%ahCS+6j;1yzVl>$ zMvMG+7t-Uzs)*PG!=GNSyFlk`U?EZDon7g3O8&{)=60ODoj&dMu z2O+WC|3QUiQHQ)0`I}}Tp(zy7P$-u|S_-96D1bu4C=^JcffVXSp!vVP$-;2uTrQ7g@H~T6VF6il14_FxeP!7U^-wf;7))Dcn)v?@B-ivK(zLF zdfU(eV$bNvA+5~ZPMPf%NCZhv<(8WWSJH86{DRV7)zs4czlql9(ZU&K%e|+zUu(;o zy5%8ntNi@$;<=vvg-@N#rvI@}wdsSD>}S)fDP6JYH-5Xprsr(D!8!w+oz@wS44u~b z>;`7j)Hxb{y@AnA=M9VsHZVrz$+6;ly)9t^BX0IFm?D2*nCXBayUj5TETcBj~Lv)cWg%Cv>Fd(KG@$vfs<)me!#$ zIm=QPMmmnGZb`=wG-K9mtLNC!4zKs6cYr*67N1}KG1pbpif-7@AQgMbt7WC~stC&Q!}JpOxvM zkjoS8S7u48dwiUmpQf9udOs$d+QznX}2#R!+Y26+Q z%a8v=yr-&VlF!QAK_S-;onM)%ZV3h5MpK!Ao`Sthw@u)JdcIeq*0Te-F@*)NGAY8@ z2b5hU>3W0Gt#eq*1hMga%~0d@v6MHlR30xTy1m>nKz zMFEO_IOt{-kp+5+s+exZD{>BX_ylc3DG)S}2}+Sp<6c92VBAdVTPVU=$^zUTB9a3U zch%%0NJ5j(g!WL#mU@Y<1!}xGM#6KqZEnELY@aFXzmeZD09`cD0#av zfhfY+GnL-<)sKn{OrQ@aqO+EDkWSA~1fmAIJ(NQ(LEKeiMv$Z|8>gM(kk^IpQ zBv2-TBoKUusxLyhJThFLK&rk71$`aDYKiof;8Rx(I73~x`vkhAWCa-nq6i7ZWOxx} zk_`VL4LwZ}s7vSe5RvSd#3V{bm?R>fsb~j5BEHW8V5hNMNS7e}&YsW>n*U3OA$gmgc z#}HGa_sOtYkzt-shOAqB=$*$-vQ%SPcejUvvh+QQ zs7XeUWFnu*&~zdz9tvz^IOTQKZxQ-bR@u18eyPilDKB+#Vv5 zOPN3k2$DeLa}Ka@@1US-M+4mJ6ip~7I$IH_rUe4A#@3TStT7i-8C|1{fhYx!=Q1c+ z$N3WJO1DiRN?7&eICnUBeutr^OmKK=F8P=q?j-GgEz<@@>hWCgF@2zu^7H0vm_DRX z)|~b6T-r(b0#SAex`HUR9*5_skLfrfjgbdbsY*Vmr~_*PD48OiO1_O)`9{P=6oJNr z-5w&6uYL!W)x;r4N+ur+Xf1${%X1j6Psh~59hfi)hgQFYNrGB^KLlc}{tP%nplxU) zte;&q`<1+5OdyJM3iJue>}>USD1uhkyFElCuVez55F~-fX9De@kjt^79-dDkwTlx9 zEi_dTsAiW>nY|T(1fM{Am8`Tub{?Zhr$AFw8JHPnQv~V?aeIhJ{;Ub?Yhn;=4sx7g z0VWX(xoY+)T+yd}?Zr?Sm5*ZThK4*_d`-3)oS~uB_o^D&rDUZ;0Ov7^bPDt`%Is{i zXDNav3w3)OL?usS5=A3ODk7f=4w)0~Hze$(Vn_UWF#Y-5yGj?_xrPBS=D!uLwaQm!}r)bwUsd zLd2^=*nL9$0!C28C+k&3Y*exum=F|E72#-=<3LKS0Yy-P{M)x+S))ggWFTLWfkH0N zCb-whKq$!YcdTEj|19;%P_D=@$0x&jC99FiKoMAnL(xPX%Ixew+bMz$)Whu|Dmj%2 zq(hJdBA*GggF>zyRd9U*sr`pg=s!Ibfof(#AU0|?f)SK*`W{s&cAEc@H}1(v3_@}i`9q?` z-oL2TRlN_XO&swJ@a#xZ8_6NR0}?3Z#k*CdtWd;{VmhG+XJ3!>hkWTvfx^@q?L0;y z&fcH)I-96yYgvTbLrD41*Q6j0K~fO;NX9%zA=eHYTyThT*Vt(Or>1dlCFzQx3J(=2 z7cd4Ln4F0L`HTSzxoXNma-D_=vV$9r+fc1UN+!uhE{mk4cz_|Wq?g-!uz)F*u z3yw8&j{*`0n7L;G8wZ*>L!6n*2G{`G07n7e0M^EvxxhhY?jgXS!DjAhz_6$UGgl8V z4>5D+09OFTLviM@brt`EX4}xTC9-n5cFMf2{tp~&&~e9t^ef77$A&6YLHLhy;!(8` zk$eE7S^r3fO0$K~S5=x?MEa>T)teAFdR5#xbdT`GZ8%AY5G{$lBj(~@;K9$;BMURs zQm3TVCiaSI7-{C@MRsN?>=c617g4%NY*h1J`OGhG4<)ZDDN%T@j1^Iuq!jVPr+#Ex zl{6~i+$a<=jkS}uvxsSwPDS)G)RKHp`)B5r%*n%I??Bp1jNqn;9ET%Ei;ZG0g;Sn8 z3K%L22Nf0t!-I>nov#>bBLXGk%a^D->8(m^EGU%FKHyzARP#F%TC^NOjSznv7Mqfw zqvIl-MV`R~*X=RmJj0nqE?3bFwhB#ObDs2x4SD;DrNevo0*yruQ7W9$&{<_Sqc~7M zJW>b=vxhn>+r#ZfxDn#}$wLPup+Nb_?W`euG8LjNy4|9fFgwZ_i6hm3pqcEYe4HZ@8(_o29IR8(9ZNJ$p?*$=zQbC;l~ZYr}KABqpA8v6zLcoNGu zv6dntmE{i~GM1AV%UMT>Q)?M#)2JN!1EB$ehUN~rhZ?g5s>vKf%%ZekKlmSnxby)D zAy}1y_J07`jf3scrU=Ujkb$Q9fIMn)nrY#d>(Xr@D(@n{grhb-FrBcPR9GCG!08`U@yGirK=|XT3+$jWpX=|z8HEP-WIGfTkg;71x&l05}FXAkx*7!s9OF5=lvA(F^$|^BgfVAl-KdC9|_AFrsf@geS(ka5Wj@xbu3R0HBYEt z5-SQdTLc`d$WQNe3FAx5bx^821};{2jO;BxvgY12BnTE;D$NqZZ=qR2S9Vo4l%XmG z?QDvfiOIsg2ywRFDNn;y3*ZRgM?gqA)--_U0UwM7ew>+`onhuG0AB%2BQnk0J%Cey zh%5zW!T&ozn~l4h9vMIIVnf;!aWuV^@mTg^q>>-8ku2ed(H>p57|Z61uJnBI_K`YA zkxpLu4jbN_m2F{m9o%sH$mT`v0=>niRn=t#g}ap|X^aeV9%4)bSKp>V+f~utoaZjl z7k3Wk-vAGCa3JzgKJs@v$qlxtq^FFVxLDfgLs79%nNLwup{VM4ilW%8nj!8UyGzK* z6Q6rELVC439}rQ6wPxiY);I<2*ty6r*u>@I`o*0kwymX1{mP1?6oooZE4M*3U8l@t zONi1Qfnwvh{=}3YHz1(QYl}E99lo6(#b-&)xAS9?Y5kHmh~r!Zvb#uj71dT(*3wO$ zy(a>6Z5OsN32xJB>cz&!xsr7yZ^#(Tiq^UcE~qOIXXORXUR)LcCzQcCD^GIvY2dWMmvR)G zG|tMSew>cV&x1kY9ek{22v|$ys?BVm}UMVB=lHanja1_{afY zBSgn71^dA;z*)JUvqy!!T5_qlEZkkRUp9c_nLGI5n&-}Vr7L&vBehE?>xgn>o#@ND z3t784D|h*4-6gL@j$6z5p_3y zj#L(aw+`gEEV^H{o7^D_kke{wrS|nMpqx5&jftGi0Zm_H!{RQu+&l?2TMW+9$W?qV z&56@qsc03SDSS0kZS@bt)~x=fz1_iP&U{vF+eV5^Q6qMWWQ!xRhul<1!7zr`xs7yP zhP6z)MYf)zF+hh)*xAl3LZex*y|KzKzrh9vEP_Yl{wjo$Li<< zu_Wc}L0I_7ubmWg%|$sA{qUH(+vOyNXluqgxDAI&UOC>6!bB9gKtND~t)Y9K__leS zW@%8KSeP3#qBIER;_|d$w@O3W_^B3;ryUWi{5Z2)ArO zc@nP@pk&G({hIjN_$M`+=22HQh*f!C_P2q7JLKqin1uWQGeJEGyLmSRkmns2tMjXc z-3_9)pjeo4UYt{qCzu+<#|nlBue>UrE?5$>{}oasE>Jq;HLr?eCdiuosDA9k{&TBH zw5VcM_^E<+@Z*|`XgMU0!ia=kLRY@>1ZIJ_;O}sa$GZw;rH%EOAe@5~Fa?IM*3Cy8%+Tt%hP-Jw(VWObDWU*nSS$H-S+MyoD|gGLOMOA&yXOn+ItchaU{6G%xY`TIFykIA?B51a$` z(ZE@V?FJ?*xrr&6X0vv8511yh%(_cFJb9#MMR1zGEMGuwXP$~gJr z4VX99iJPX}l<3Pc?*@XxP7JDSm8)J7jZ;gKeDojRd3_P5J26CW+YXr?nmRMamtkIK zvQMVMJH^1Fn;lz7@z8E%2WKBk+Ewdz&kR-qI&L(zsBJH)^o=PDnbOcCqpg|A>yWwm zc$r?lQbK7M7~7czyv6b>7Vx=}#GZK2L?=JnnV4>oPpGLy?XFx{32lPdEEP196-JXK zVG6ZY`FBMqw{gon(KM~E@M^J`Gi_`LtAiDW)V>D^HPbc<@Penu3g@ii@aaPnD4nbf zhUrqqU?#fOBHyh>NyRG{iB;2wX--3P_0#VPRTaZ3GutYrS^D-myoMywV|RmzpQ{+D z@{F~Lw_DCf@1Fr{89+FF%|3*&@zE8_PfZtRTa%+N`X$zPCN7>X{>^GMbo_=Peh-cW zItS{AgW_pxMKW5?rq71rC*-n{o3Ks9AsOi&#h4Q;wrHfXaG^!sY7uWQPEH2KR!*6| zG5=MjXp3#VU#5{3@on6QQl<;pV%7|E5CxNSkUvn&oe?QMHscu~V3Ig#W+tB}-ZyhV z2$DQC>oHJTi_gy@MxV?&$|z&Z;$yR45U%7Om^tS+O`sW>*O?Dk78LO;e9|oL zS$MA|U7sh$Eqcx{C67BC4aeDl@w&s6n~#{-v?zz4A`V$RgprjjUdM9ka>e%-&koE5 zLrbohTsoZ36&II|;ByZ=SQ;3>@P~5`Ji089XW@?A15e$Oq7B68X)})(8_VKZaN~F} z__l8}r6|AcwhJic%!<))y(@+g?m*)0!Mw0`w3xnfxG-U~Xj^F#mgb0?R}K~0Q^glo zntDX$P}5*EY;~K%EpoRU@!OR@3-70hpWG2A{4+)5%T2;tS>nKQtB{@|t}QnWo|UEM zXk$4hDpB;rQf3Xnnk@29qr_w7CR5n8w47hm0-{Xu&+@})gcny02tvJBQ)QNjU#_xs zM&Fz%&Rji?RW&?M+`jq&kPlollCKs^)}%V}C{v?FzGpbeq-#pRlFMfDVV9{`I^VX% z`LNSfYzLMowgew`tcv}Hut`4bKoxtAu*p7bh>AVpAatq^{rfOQh`oeO_hG+Ku@4Y7 z(}#Ua#nQ7oo7snbLB-xg*nA)MZz^^wVGDg&7qGpk&SQYCuGCdQ`(aMZ&NxonKV95y zPvDEhGxkwIz6`yJ#ej-|Sx;4&IXp931Mk$mW^ReY%=HKSg7Bw+?g&o-j0U^}*aPqY z?gYH+5SLZ#2n0jh&b)1F?-oW46W6a@EnFQVwyvGb@R#yL^PK}&FeYEL-MKn2AJnD! zV&k2U2_q6k$GUz(Sfcp1by32Y(caTf^4J4Aw1!Cs(+^ z^uQ$Xw#w0Lup7{cv`!M=u1o=vzqbqdQ=vHQUP3PMLvAe;J@;k@k}wx1i0|DSg>+I> zh{G66$e4+caEXB_Dj8v)qRvhfiycWJei(70=ys$tL5yNfRe11JN+gMgP88c5iinib zBgmI14 zDU;XBx#G<=Q(4+z1>eEe>Em+6%Qd;_jEjP4F)ISruqfW@fKL7$k56qIL8ZpOrN^jQ zbMnN6_w|YILLVWrT0dqk#te@UTg4IgM~g4q7il2snpQCNYz$CJ%rT3f-?zzMs%LUU z`~7!}yODG-n@aRNW6%@}6SmdgNQJ4j@1`OAByr-Vf)SObTe*NHB;h9H8Q*EXYKL5a?+EskmPCbO! z4ySCWZ6l`U&$bQ{ERTtS+j4|CkBJkv-AZ2lwq8LHwmE2q_2t^h;``eM3U8!{?b}N9 zRUx!kFB@UAhvbQK#eqU?Z}DEyl+4Y~<9K^dXBGvxih0f~T5#|c*1DzeLDwoGIcvV)T5{#~dWfALCG6-ea$Sgc`}SVF0$DCBy@Q?YnQO=RQh(Ho zf7{-RpDez#JvM#3T3*OmlxOwqpz@04B(=P~jHx0+v`UHdEP1_N?71V};h*IrJrle+ zf)@6^+MHC7ZXdq_0@D)PE^h zTZ~_+kNzcPjY@e5cIDFyJ+nkR+j^StFyD3%hW7G9NkUDa*z`~`KV9rC4Z`{%S6X74 z4hy?C0?$uNI*R4nGgvNHK})lddTq$=BJqT@4jD3bQihv$+7NzgXFr6$+qq?0D`bN? zj)fFRGBMEMPLnaH1IchDc$(#bggshs4{_MV-$;J%FEUs%XAj{b_cc=F*vLeC(v z<>5Y#nRdDk3}X|%&K+VwG%XhtU zC=*BBc2;Op8k)`iypI1NpxPeo<~_upR`je0x6xvxI9_rK3ONdOK?d>BN3w5LinUc? zWRbtsQ32t5m|$7tauq>k(ekT_gx4}LPJs}E5aUct^0-ZfXBLB zkpi})F>nkiXck)Gl9hyy0tVkTTK~o)j*HmD@)bSEK)uGL z=>G6Z;hhS&Kq;up=A!UTA?Famn|iKdA{JqceG>GBfD30n*yqa_gy}3NgH?QW7!>Us z$Jqmr<_&ND)RsOLMJA^~h-F|&LgZ%xlR0f1P}qJG%9(WurEnFdGOygwi>cJvXu{!2 z*r@K;>WjH>t$c7o>n{_53f4UU%#;}ps*lEWQ!x8GK7E{chq2-5g<<%WA>PMi1#oF+Xe`WaB_$>rjkFq1%upZrL*gWA}@D28CVhO5x>!Sz_}ZvtciA z{#khW-AplOZ-3#lfW0X8k9Pxy?mu?@N z(qp$CIR3;$-oG`PFsS;s##owN)zac2dud|U(*uP|%fy?W z9_Sd1Zi_DJJEQ7`6M}vqc89Q*KhC?9KxGS8F$-gU9W{F5`0zdCg9xssNDm^4BAJ?; zlDo`-C9^2AhYV&9Yl9f&o>qRI81PKoP^H1BTWPG}#d6%uzQ%6YO>Iq$2|iXi_-1j& zGx^4YO0D+!)#|1(;{IpM{mGg#3fk?lww(&iAwL?;7;*7Gj5*`AdzjG`wK?z7a&`=9 zZEl=2_nW(~Jy~5*!ACG^H29KzTWTif%4kg=V)puF7%`nO~AAh%z5?mOB z+fJGB=z+$wHkU%pUfzhY1rg%8f86D7o%;f>wazazU2V53Rb0J)WPgj#787mSi0e&j zYN~i*|6rfB{Nk589Gm$4MVZRF)%J&9%Cjk?aNj^lhva2i>UZM( z|4cO?q1bk@XQ$coa!!i)?mr_j-hA`V3?+HLfAUA8#L>?t8&@!#EfkvY8RPa*;@!`h zqQDWI2`iVE)C-4#4vW0-Ch@svlg3R|a`o}c6@%}ac8N=Gx{2)vKaNR!HPu` zb-*H06-Gn-7(F*qT==hELgPGf-M?ZS)L0peG)5s!^&_1>(!Wen(K|G3>D1<=>zr_B zL!5=ir|&!KQ=u%3KxvVCEg=rt<{_}=Q@I9a4lJ9R2g^QEg7bu_Sk7K3n(8zB&Eg># zq5q(@-cPp8$>PTP&HjSlZh9QrvsrE+U49KIHPXk; zYi&t4(B)o3N5k~T&C{}Mx*G_4T|-Eg_A$ouOE+}7pOVDB2YU&a!_p5fr5@laX`vg! zmJ6fzfQx+gOWt~U|)2az!#Fk{Q3(gpGg!8UPwgBsu%i&?eo`Sd7}9E z3**8z`QrvBir>Bv7q-A3*EUq_{o>%z)&?_o8n7Es(I8HLF)D&&!<<^F^V++!hDATQ z>&3p|oed*2XR*on$rl&(UZHFoW7)#2r*gGI>q%R+*zeGcA)j<^2iSd(5%aI}I}^>> z7P&vW#?v(?xkGl%6CXL$Pgly;pykzK!=YN#&3bs|f@FJ_(NLIr)YoiXeci%3(RTEP zwi%k>Zx^f)o9Gn*YDELD$iI|H4U+Sc7`79cJ1ue8VDXEW`h?QD#AQvwGLPmlG3dxx z!{r;wI5bF{edKSD_V*)YhD*llP4nS+vEpSDl_I@77gRsJJSOZks5;BK7$=T7Iw0++ zKklhGlG}fc@E%44w>7%hcF>>B5hp%))SOY}k4t8GO@0f&6V5Es9B1!E$}0@_4Iy4* zvRw>1mK-+6KmY3k#YxAeg~j>fYy-t7j}0{FfxC8*GIF5!=`s88>9nU4T+znUF z7#>e=!5J$o?>*SdpX}pky^G_#Mmv=eho+Sq?gU9YGRaS_#%O6>1?MO|g$y}N{6dbx zbsH&MTvrd*;ttsl&ng>o=+Oi=ESKFSmy6}ol&7G@t;0g6q!A&ks~WBHPb*nVzUE#g zyGt62W$kg$iJza0w9)~VU=NW0R*7CkCnDb_KKd80 zp~p6E!s~;2?p7LLp=~<_1i7}4c<<}cJ=HDQA|LveKH|RD^MvO{h~K|HNr>dc^fzLn zS`2Kfjs0pro4VUuZflJcGfrO#f;9H-)s^iyQOh}#A6n0fvF(PaM6vbEJ>iRSuwppw z8=7}o#F#g?2Y0gRh&=G}o5OiVr9X#fwlsjZgX)jB9&k_>tI(ecFi`+gadU(-i^7IV zye41)D#uBVE{dvErmZ8iMGpRi8o{vV62?F5gyC`(IevNW^UvcBp-fi!gO9Jx6hyg# z%6iMs{vn3H9Zz+oF~fMNRLpsM1ix6kPE{vN5g&OQ*V^;M zV{cDMoAa@mbDuh*L3z$5?P|TVQKLDHpOPs5h}|{WkX(y9rxrwOtKjShocqWuIg0qf z!pCN5UlAWi{yRl{bUcVXlep>dG6AW8BtRS>24Dc_K^i=bFQl;BOWex=>jAY$xpf-9 zbnYjV^7}_9bT@+F=M(P_MZ823uN^r+(F%%M9h?M!1+aO7X5f39CTgY~ZxW_E|In>| z@y}nL=)enbP)c#r`2+#}wCQ|uJcz-2FTDMLgMg!elYp~;3xIDyx@S6H7=f_c%Uv>a zIzTia>C%B$&OOTyK&ym#B&d#dIjku&Yw_NziZIwYP(wU$zAs-Y?ms^?3T^B*RJ+GR z#RB&Ku|A6L&rijP+qn1R`Jw}*?>F+%I(9-F(9{bSt5!f+Q!*ntEi^y)}K3TpP*n=f?WjHxqtp1_|XYwC@k(h)uEC-78&M(?A{s-XY zAWa=Qw|2)_Bq@tWtT9{$&)MnX@Gr+WC8Ikc2-(MsXYRCcf@e)XkeI`Vjp z+u1rO>;Vt7;LM69tyGM+Wkyq4Ez(>yZSSJP9wQeo>TJnK!B^T5!|Bx)8ptURh3jeqD)L2ObXO4U2=-Ie$zK}K`&aY*gi%VvRQhG+rAlQMGova z)Z3UH^xm&n9?Rs?K`ca>QR0!&-Xly{XS;dr5Vk=U6$D0j&rH4nJ)%rwtH-rK__u>2 zOS*_hd*? z+>=!drgj-Abb&%t6lPQfV4{PjklqN~K3EK;Q<&1(?jhJ+67EXcaS1p|Bfm3^Oc?PC zs&EuWnm9s^?yu0m+(2^<__Hbvg^A`Cx!(XrbByZC$W9~BppsFT$exsoyP>g)Z7ZTh zuiU4PVvcP{waVWdW>$wg7F@9uMvJ4Hh6zCj#idPSg!2c)T}=hUlURozUdG$1e#2yB z+=cd|B{A34~H}Cd?P_|87ne_Sv_c*H@niM__D8$7-QjXnxCG z(B2$!Dxen2KKAv`(_Y#~RsM>v-T}4(_5#lQD#kRY2r=_TYjdPvnlCPIUY@t5ok?nk zcdDS3#G`L8Vuje!JR1lS4(Fga=qPGwo&W@iMqlj|=z3{15Rl8*GQrW~IjFHxr?cZX zdUV0|K)Bk9#JZ_e1Dt;aP=G!}QxV|~*-i%rI0*@$z!qP^ShsN#C6u(|d>Gfi4LoTn zgm9XWEpW#cwO3*%+72C@+7Jx{eVQ*ciyyZ{;K=-kmSH2PBvuMGxVQ@<{wWQlkG{X- zDGk5^7!Jq*RQ@hb{(g8mXlU>+)Mgav@VyMoG$-`vU3IlcxUE4Sz_eY^u|{aV=ni4X zGy3Y|;TEy}`w@<0s#?WD{|Q04xwiMU?L_ZKMX+gR^8k@z$Hp?yMb--2CL$C8$W%n~rqb)XcYWuu2ODr3092;Bkh$@34? z{4hSix85CN+uKV#|4V(sUK*YRcagy==lqL$Lb$7derAcoOHQK}+}K5ccE0#b+l#); zxwiUV;%&cXreYmh(cSl!w^wy#2i;*a4C@qhoO~Yb;|^hr=r|dSKKZrZh)j~XVqV!I zaH8_r#33L1Cldfw$LvicWCEErne)Yj-!cSv%YIuNdXzG7wmR@d<^$({3*d!=y~K}x zA1YkvB?hz)j=B(<3tPTSmfB(Tx#+7kZJ`Hp z|LDbcAE`w9hKV;{d7%3)7W0&biC3v zWg#JMBZRtTnnZ{lf&9zecNmxkZ#Nv8+l{}M5B6(q=}R3yWzeHNbGbJnAOv73;7P#0 zfs27}2K<5WR}s>T?)>WBSZY_Ur}JFjGMg@2*j`8aygMJ2OY1a!E$z<=nzPGFY*i$$ zP-c>kJ*-*}Zj&glOS|&_$0ns`Xq!OF_`e$H_^*!p@MZ$ zPkaY~WO94t|6tKj)T#e1eoNtNm%?>~QV!K*`sk;kJH7xiUwWY@f2+!Lf3*}B z!4De@QfQ!@X`muOnRcD+>nb9tGI`uOR;}83(z*yfX9%eFoJ0<17P%aIJkVeM5j0qU z^>Bv}76R8-ON|kHG#c!W2)-{ZJS(TzI5Wlw`o&I+LheF6$Sh!I0O0`L)WoqoenB`$iVlXjk$-Nl0)&>uGq{N zv$~4dOI0Jb&Mb13s*P}mP{b8-5bmjf!<2x}seq%Mq1~mD-pI!ofw--~pwQE|oUw^* zC_R*AVyHFSWCeEM` zbWPT&sBpKDNKS3sdXh;2ZVGMqW@}#6cf2pQ$(pBR#T81}D}{OJhXx-)8+Vn823tJ# zC;kr3dAH6RRh`t#c%SWey z#BF4RC&F=1iKxHCP#O%S!*&w$5`Oc`NXCv{i#}W)%MZdJCB^c6skZ`&-g-2akME8c z7IAxymP+5nVwR~s^p632W;fNs`dn{ee-8P-#lk9W-^3|E_>3Y?4 z+EC(~R+h)vV8B@{S%XzJ4WP|1UPUl_`VMa^DA3hK$xdJ-)h)Imq!iUokiCJj)0GPw z@pU*gY5E}mqdI!4l#__Lp;TIt$j1w|YDrAwKZJj1MG}8b3;cgE!L1z0kHn;~dn8YD z!y6;{e*M^tIP-Xb^Gc9?I*j~ydjK}c&M*4A4K<~UC1Dgl2Bc$0@$t!>^Hc+qu41w> z8Y@G1Kt=Da*%U)4wnoweqxgJeet#4{It7_G=fA1d0l3ZPn=ycBbZWbg+!~e^eR<%LW=3sI<*gkdZ>g zWjZf5I(SA(jbo8Q(|D6Gb-t9GhLHg2v;@%oZ}&qVU9%sO9BKTJ$f;PvaTNjbeq5ib zyMwy+dD1Ise1i4K<+Mseqtgink3ClNn`O7#_R$hbfFK?{-Cv`_ymFhm8Nss~L_{Mvn%I+M4gD7mDpDzF3}8K}G9M1yGbe;1s014?Go+X_r1v z=X;I!sbE18<|!?@w9NuLD#Pi)9Q2h_0jH6dFm-gr!;ViXg55^K(#~54v@~ukKV;Cs z-b^u&3Xh%iwN`mfnW`7|HX6Fn$)i1zYb-xJm~MTr6mf;r&y!A!<=69zq?~d5S3!%Q zx-YdjBv(=J5hmR{jK6Gy*ZBb>b{LV^6_XRSFK!;H%$yVj2LsTjg zK?tka$3&2s2p6iQiX6Uppju{0Yq5OgX0=S^yLq9=k7e8GYU#Titm{#Lph$e_J%useQP+XdfGR_tC)1hD`l< zHa=U&^SQL`aTOeNRvz@)=eUawVh(DomYy8X->EL$FJbAP#}6NfqUbl^=nXE8@~LEt z`~)*nbf1n>jPKe!-kZX~-2EQLkMcc?A7Z18m7D+v>cp2K$Q0Q#*9FqPe15_(j71f6 z%=H;9#EWzp`qy^@6;`tn^~0B{C^s%yaB`;o_g?Hn3iv)#t}AQ2udJ~+4`#hwAtqT9 z7qDi;F-g1I@b+GCF7{m`z$7+SOVtH@e4=88>XEI7zI|bpi&;*cX9q=H)J5AY^0E2S zdj-7F@#K8PI!f9+`NHcs0#iq*{1J_>88s7d@# zTD9V0uULMKjaW2q(n*6fdlElTU2cs)&HT<2FvI(+=k{xA%T_e6Oyc_uSB#74hdNyc z-8_?3V-W42#_Nrago8{B@5E0En#{*^tA%249ViW(%=cNofQ{bMJq4HX>m;^Kq%+=Y zY-fCF6sL4_7AzAyMVGB0!A}x^gr=jmYlu3>^PwPjW>G$&Vz{$12B&&%qkVz&9LnyG zEKR?Vc#Hr8{$(a>G$Y!$Kx&!HwgVAUcsItqzfIu>1R)EVnP=H)vHX%zYMjC+$Ck2= z-mi{)i~I`lI7ttt@r!o!?7MVi-i`AZzrVWiPDc{NBI4RYgl&LY!2fvT4NCFyyMs04hn^cTh;l;K%gECLXajTr zv_R_t2EbsD-h6JNfk@q6Gu%SJ9KeeC($(qw%3!}|8q%E>ocj4a(2(jZ{Odl7dA41B zrB&80iuphsdeq8)$M?2V3s(%oGMYVfVZUN=FY6T2-)8VbQ*fS&fkIbY#(U^DaZE5j zcgRL$Li3+PgZqxTahrhOVx!l%*?jNbOfY5P zfV+JVLI_M< zQxSF)|&pUdZjLQc+p2Q7eU z8ka)nVc=UV4VuTNz?(OZ?>A{58;q3&QQ;&Sk#Sj|{20W1%xjPem-n;+sH0^IzFxnF zd|D3SF+P?<^tB;{`SE%Dq(Mjvb5=u&8%AYh&OGO>u+g+FCC}#*9B2s)gD?`h{MS(o zqlDf{Gd0C-7+48~rv%3_=tp%8!el0>B|ey~*wGB;JgYk6ku;C~wKQP~ooB>$oK0W1 zEhTA>d+j$fX}$CLK@&;7NW4(<$r^;PPtxmm)ELyYZ+h{$QB-Ng0=_TJI&0EyP?7Yv z1$@6q=-RD4eti|C_ZRRB!n^uUg@GAo&O+XNt&zJI@~LRthK2l4VL!(0h1dueOR0-+ ztguL0vWOpw*p@|nu^C&4psn@AD6QbqrrKOYo8NB!Thm&I4ar;~`_X5y`B|t;Gj1cr zi{)taXAJ3k@)t|}7W0Wik^dH#z9boB&F{LK#BELh8 z&1CSGknBElp>%gCA8#aas2q7CBtawec4pZYNC!*#*eN!!pbxGSuU7Ot6+m$ip|2aL ziSYtM_vf{E8Zy8EtI~=dUG#OB6irL`lH?Zy0dCBolUuke@+LBz^M@$Q+qSsYr!9S zGe58=uvYm9cGk|5COXCfelhT9d*{vktRYOH;qD!muXw$rQ?zpph4E!&xSO|!(EY-u zTJu6lSjxwZLAu_gq;0BZ)GVixXY-Z-nXxfbGlwWl-`Ie>3zqUT98}bs;R>l@NeUxu zW_;zdj8^<71h84MIztKEedj2Z|0XK2>P#njm$**3Q>yC=haQ_I!dj)_%lN1uGE~mq ztqy9KzKoAFD!X+<*`M;lcD8KCeYIV>dl?@i3|b=XT*jwPpr%D;V3^%M&sL zztvt7J({A6)XG>}LtiYnI9oMZ&~~uzp{QG+`d}K00_a!<18~8ue0dT~=l6?!8h*c6 zh<^!z=Pjr>TyKR@;Y*`A^<(zRK>FfVess5U;7g0ZzBazk^jb2OirMU8tg;AXBQ-7Z zOkhn5D=<8(Kg*ej7ieH}cV8Vw~feagq)bCG846mTu0JIk*a=N!N*H*Bsoe zEH0+5;0Mwbhc|u>a~Cj|zBuWPU&>rMi1o&=U~V~c?aW=r-1W?*$7$Ypx}@{QZ({Bi z=GHQIJ9DWWz47#v#2e3+5Ak%PZaZ^3s`Jv2%%PRN@ml86{OXO@Gna-pZ#)ft z-uP(dl0A6i$-wAWp5HA#w0jl*y+$fM$!m2za<6({JA8V8wBjTm?eO5|zh67tJ^=R9 z_sy$be0#R*<7WR4$s*5u=c;$^Yi{ZY|7Nf>G{v^s! zHP*&roDy@ee*%MF=y+QxLixV>Wi@t*k$#}YF0j~XHFlQ8j;OJdEVf^b9c8h{)!0E6 zt5swBS!{zEbL?eNyBgiaVz;QV?JPD&jcsAE$!csPi)E^@^(;1AjoDeuq{isi#w~JB zHMW$+v@CWwVPF9CzVEcO^(0>=?S7pPxaIz{Oc4cVE%JIbc+w)TQiDe=@-1rcAl~w+ z!TlE5q6YU`lI)sEU zp3EgQ?EcaZ_(SC%@Y_S8Tn{V%uMvX^mjhs*S`GdM&!mbXT^{64d~u(5H*y|0Lx2KOt6V2Xp`3 zUlKQf8_kX4`f^%sDA%7G$t7{axgq#*QC$}YM_2Iwm(UOtKZ+ZM;sf#TG!t1FiJYmk zEXRLWm;din9D7zr8_mB2hhGA1ApiH!8($*m0~mlO8d3k{-!N_<>f8;#cpt!}q9I10 zK~kWPft-Whd31eTZ|KkB~(;uj8DeGnXi5Kch9 ztd5FC`1+5I6QuuK7KZWNr6FGneWZl11^sLyicpCSotXr-#=h*Or(^UH(D(+J0EdgP zzG(g|7OsY?{BhiRgs8^UlXgdV_{@P zDvy?-PYiPjlg>gMx$fPtK{Ea%V~%72N)|6WjO@a1xR^xUYMz$glmPsP}D(aW=; zix`jO=I?Qd=uV0E`eVPSY+l*fPTO?EHrbafHesFK3Dz+ z`UYDUee&bdP+1rwZTv={{|?*rsp_WaWgYog{g%V$;je%%z+Vbq1AhU0x)YlNKLEZ3 zejxlp_}$=};p^b1!>9i_ngl-xz6pLX{BZd6J36{n{8-_?O{_ z!@mf>2mG_}=|7B~girrp^e}w-u3$ZU`oZD7@aaE-`aZRY+W}@k62Jgx!vuN(upO`z z5C=G?#YSR_HjhgOXaS9yJZ?W=9bhIP37`dB6o3b;1LOmAfL0##fU|&lz!tzdKsg{2 zfRA*jNhojxz^*kgwP3g!n3jg4uBL?_ilIP*z8e5-hcmYab9*v30v4k|&*=u&2)oh1 zc)P=m0zV#R9}Kq_b9*!1eV7}=Fn!tKQ9qQXbzt134@sn9u9p30jtMLrz}!IQc4IDj zI-?|4%jLq&XP5xy1~RuBb9IcqJDbr*F*k)_g1E8Bm8Z<~9M;1eWFmImS+X9Z8pn-i zm>{-D7{%Nah6%=?NVEic%Ci&;T0j2g8$OhgHovm#s-83b2_;BtSl3A!?`f< z?Czifcq11JHEJAkiVI8z2y%1qcA_+PnhN{)2mAh1~SLpbOXf ziACHF)ZxHMTK|Kvu;+}D@iU8a^JbdXE?H5r3}tcBDd5X)UA=6Hec5WeZOO{T%hr{z zUbbe<@;g?JQ^-sciwkmR78K7c%$?SikutN-3K0Jf8K)M^m~mY$so#&n>eRn3&&QGD z{AKX*mv;Urn55btg|pI%Rw0#~;GX%@O>68B{q|)m?WWmE($oEq@MLC})DLifZ%mQmk?o_G%XCW>! ze>%spIwGZD>Wl)Sm^4B9>}R33qZJF0DS&e;%v|ejSbP9Nd*Dl;@GXGWGBc60PXzGE zk6%m6t^I4-oA0QAy0f!Pc;HE&a#L&;ezcFv8@FIh`5h~7U3SwQH!Uc!OZ}@fAwlI! zR2(t#>y39Ud^^)6{&0Kyvv%saRm)tp{eD!iWVr!P!XD(Z3-x_O_ zl8YoB_Ks!tDHm6 z{4N9q1)hEn{|@6l=?Jgc;283?nHvM34|*zw49NYhnLN$_KNdjv_1~Gf4FLL3{3^mB z&0TTAk84rlG4KZfh>q~zsra+-&jWJTK-YHkUDJd^FAEwzFmUgzT<)1!(g~erT*O26 zTy7VDa&M`~<+fGiVsQ9E8*B;?d(qNO9*{@6uMN`#M83;r6e@)CB}WhRC2OM^u1oI) zy27q>MVK#D?W!M$e{4>I8dQG(d>Y%6-^<+^+l#5DJJl_&v+j%QK|-IG)huto zrz!kBHGT;`4GG_>@t@(--2SH;*PZXuEzs=a({V#rIU4hMYM(59x7K7cRzhY(LNvkQ zPr?8{G;_PlDK&uCRL!P9ca5g?B9S1ln_)r($udk6K5f4aTL%E_|< zksN)`mEPI-f2cqLQt_XkzRm3l!}1?c3)lpx0{DOG_n8^JX{mxYEj=_KL*o#1MS0va z08Z-hr4VuGXqKjf52a@f^f`y_a;{l=BS+J(-(Gx&b{Ak1z}y?FHGuC^-$xS6n!h{J zaptcBQV*XRw=sq$Vf^nq_%y!M!l$KFDSTQ?Wx|hu9}b@mCNB2L!{QQqANalDuY*sE zF*E!a_|fp!!PmjR3w}FfxEsCWH^89@xtg1Vk!|>)dQx8t z{L6q#fD3@LfEau+)Bw-}w15t@QxFVbus$N8N`p+w=Yb6x&Qh&G$9AM|)Ns2H-3NFD za2C)AXai`S*yjM^0Am38fMUQ+fR%vz06PKu01be102%NbKmgxxKn!3gU>*2PfIkax z6X0IJ&W)Ox-17*W1~dY$0Q5B)t~VeFkPRpX*Z_9}wg8?1908mLTm)PO`~bKD2)Yk> z@1s-AlK*EbCao*hOpronXvRpd6l*Mp@@Hro^bR{3_P$YXjGCM>ee}A~Z;tt3%qL?s zY2DI-)56js(xTG(r1ei5m^L^qF>ORzN?KZ4Mp{lXrG70!U}j%$+5|a$?3_{lNThfO`bH;HS(j8b4NWq zs%cbm%IK85l){vGDa%tJEd}Ru|&wercNcJn)C$itjelz=>?DN?lWPhCf8SPHZiuCr83r5XPS)1}y%E6R=sS{G~ zO07@*JT+j*j%ZBX~175PTk#*?(EsDD7bl zPFs|Wrl1WdJdRGG&+!c$@1A!rx%2tE{Ia+%(q#)3uezw$)MC}dZ|0BjGyRqRsR-O~ z+TO5Kpl?wnzKP>md)AZnVVK9lu||s;-O9{2r_33X9xMrt18OxvBb#8E?Qcie9Q&?a zXFsu5t&`_Cdm@kNVv$0l(Refo&hsV;(M&WKEkKLV5>$v*pjBusk~qLq-M8G;?glsB zYw!JyzE7)Y8%{&=Q1a5p4R0LH)qJ1?2 zU%|i0HW4jDchI9a1HXe;;E(YaxDg!gKY?Vky)iVCMvl0dZD+0JdO1mT^oRMyew=Ax z+L)eZwz*>(1kHklz`Cnp@UNgcs12If&bFK7wvQcVC)wq8mAz-3l7|pE9f8$vpw;Lj zRE_H6$+!gX#V7DJT#HlO(7o41kH{f%k^D^R(Oz^gO{HULHl0J)&`tCs zdWasS<@8$`&w4PAJ;(mSUS?S=oXXy38`*L8HM`3mux)%VA0&o}k#Lif#WeA#>?pfQ zB#rDNUzD%O>GEy4NG_FYW5xM z^Uy+6hN_T{lki+z0Gzplf5G>0lpE{Dg>Fl?joZ;Bu7O(SyKCLUZY$EA2$D?F$V{@5 zl#-+59(kHRPp8nC^bEa91rTmK`}PhLMS*NR0-_~>+E|^E&4)#K$b+k_b zS0>nV5j092rx=zFXaZc}n{bI6(BIK%^b@*^;&FTYe2BLKeLlmtaSQi(Kwy=7%WdQR z#T(?k;{CTb*_-RF2Z?C`h-@NXkke#1-Ag~GmGmZ!V=u7pSQFkFWH^P_7Zb!AP~8K; zM)wk-ZO7j=`<^J#fOZrtkR#)me5TOCaDTn^6hSU8S?MCO(B~*)k zNA++VZizeKE*N2kecT&Q#8dDLyc`$fHFy)=f$O`ST{0=t@=$B2VlOyCS z(vJ?I)$~`|6`bN2|B7GYH~7!|K5r=EL~CeD1Z~+;G( zBXgl$zLYm*m8_OEvR2kfN5!ZH>P3~JQdOGDfD1aOs?|MJryM`V@8I|Ir~9+~d49fM z;4k%ypv_9a7pnalzt*qwx0?Otr1{>o44w>fK;WIq$U6(i$wTj=GnEZBorRv)1e|rRIdWXl|Ha zOnvC))xk!%{e!`g;G5t^a69-hh_x+jCz}Xt7;6{V74{qZk4RI)Q*j7!up}UZ#)fD% z=-f*5AvyxxeGf$e_>bc`I3KUV>v0(_$A92h_XT&oTjrL#Ke`RQmR=(G*+4JN8wczt z^wxT1-Z$PqJWdQ5LMD+8^ht`TroHJ4bRwNfL%M)2207Y5chUWz0qt2A=Ci(R0DF-Q zX5kRF2>QP{kLL*-^JjoeAM#K6m%IXQu9pA7<3x8cRE&i?%MrOEPs|eY#K)o>?(U|z zBOaGsWDn`f=VV_wP^QXJ@^zUdr^!&xmhZ}yatjz#tZix!+iUg~)E@QlPfL`b&FG)N zwx&2f#1cP?Q}HOg7RR_v-B#e#t?P1ewh8=Ck*({q4wv%h~>?}La=Gy|h)D}gq z0bWR)j6BR6g5SU)i0Wn#)w8(3Ed&8dAb%wj$Yk*K>0}0(P3Dt@vi zOa3Iv_iq5qR_bWgokr<##qI}th!4Mqe7K_O6T8w8QN!Tli0wzBQP9R}G<`!-Zi z2+?7u{n#F~WwyfBM5;-Mir9tI7&S+&P&<%bgcwRfebH+u3xww#x}2_pJaLSkq8C6v zZbOsCvOlx16MG8a9l%o9FgBJ=06PuYT(*Q2v#o3o^u=jb!LG2ItQO?;CB6h|JIx>P z#=we+qSlYrjWyN2epU|zeH^ZH^jmta&ezNIM$pM~`WOA1PB2}~ZR4P*h~+y^P?!4j zWjcb60dvX?>1?`;uBAI@DgBaGz{zgW8hW2PtRZX0+Oj7YWdZ2@5SGDSXVcjhFsd#5 zOltU9Xv`6eIXg%0DDat8>N9+>^Kqnf@&aykC2qJ~l zGD-H7z2#zA1lW{>avkKdmI^7Zv`SJvA)hUPbXKO0tCL{H73zYztSVJEANj-=zV^5I zdtnB+=5GK&F4y1cqrsJ+0dz-atL&Y~J*P!Ek^iLWqvybMbI=;J4JG4Ypf4U|j4^JG zy98`&n;Yv5^_r8gJMoDn&yrrGADKr!01OV1bL1EDfLPj}X3!$Kk6xkQ(eLR4+J}u` znXHhlXS=~K&a+DPD<~(1V4lIVcrIX2!ng3_{0c;mSkX*mg3lcie;0pZrP_0LmNyhBi+XglZS~^KJE`8tA8jlNEr6ZGam0L4`m2Eg^V3rH$^T2kBvYiGEL) z>N0&?pM=U=n0BU%!6wDL4T0Mao(V<=`N2vEAgyf|n*RI;L+3Rs#W z7d?#zqYUt!g=jqr_o2o(0lT;l9)zd4Gu;}usrQ)oxHlN!$$?R6iMP_*?tSVV1+p{; z-XrodIRjkpMNiOsFr4fMg{Xw&mP>y$^{xx$Z>AW8Li;X`#jXB{jFqLb(fTOmPUFD;TF zfD9DLA_aC!6JZ8yI8J22mbXN;s1=TEAe+k8GC_6)#tL9-Z*aC02q~k%*>Yqa%yR|6 z-4eM|?tua9fGm||Fx{P$<+4Ivke6j8OnSHeUxaC*nyMBM$=a#})k$>)79a(u3!P{u z8P<6`pBM0@FufE5iPrH=0OCG=0AMTwLY?I0V8}viodjOdTlWXKO$NbD)oBn)N9%Dq zOJ{@l=IXr2h}|^$;ZG#;SpjPS`LHWToN&#Pcz7T!{9v2%lDRg#ojt^8-&sW5IjzL72aju)Bx*?EpYo#J{{!GBrP=@h delta 36000 zcmdqKdt8*&_6Pht&kQ)gAgGL@A`S`)ipu>q3=Amd1$031Qd($gBUyO?wUR~}DaVn* zww|YprzEXB<>}DT(#i_V!pw|1cCym4vU&(BEGsH<-tXGaGdSuwpWk`^dq3~+*|)XV zUVH7e*IxTN!)rTwzqY=2gEDN#AJ!Z}`m5Ahbz>(5wQRUuVJMNO1>C5y$D5 z>x6i=MT|18*9n`$fpA6=qFAFeI?%oXS>l$ML4C(oEnZuNtco{5gmBu}w_jZ(IW|k)nO$Kd_Zb#_%v4NAZD;F=j?M6X}j6epe7R(4M_TDGeggW~q z3qt#zEO@`>!%InpR|2Z-k@4{UH5A^fz2Lbiqbd#Fbb`GEy6x!%>kNT6+5qp#V0g6& z@aBz#w|^|WAG6{8NhLPw;jJ11FPc#1j)GS;(g}Ykm3ta&wWkxdJqTV%G`uD0@EXBv zd+|VcnS@eEb-z>uOAoV+ zeaH6IU-Wugi@G6P!Bf=PDxCO+9qBt#dgm^7zOQ}o+fxYK-74snLW2e2 zZ(eW5h}7n~=4x};YoYcrm1#}%#m3MXSjB>+N$iR9ksR=EH@LZyt}nLc5 z<(I2f@b;^e>E|^)DriH29zu_<;VMYF-1+lWgf_0dicq>r=**xMVLz7o>GFN6RYHSD zW^0L&LOCRrsVEOpFPvG!J{>$mdbyg_6k2JJ zIvuSA!lFiWmSA7xj-#;l+y;#C8M9`W*1xhGBkx7ZJ#Y-4pPrfPF6qQbbk_+O)UH>^ zj|{ta3XGkno)X^J`XTW)p;D?ZSIS7z8!vdhm0ac@{e*@KJ10yTFSO^OK&7s}vyO`!K2qx-svff^$^JEbsO5BgAqgh_3O0yx2mX6G{N->C4?$drRb@rs4|k* z(xufxA+Kc{#oXH-^sA+)(=#d7!$Iyo?Zs4yR9|$$PQ0%K6;wIM>8o?IS`d;)os`h( zq^Pp*M{3yxtxgJgo%IxR*EjgpskMwiXxK+E(U5cb5#ASGP(htf-KjNm1CX4s%$OKZ zC#9%Pou{6nN&&C4Q>&9gUS}P}+;tm)f}&iSP>Ir54+puW_9beaB?n8XotxD<(|mQV zQ_Er2LzPH4d7XMsJ!L4z&lBx)TAdW~I=4~Gy=}c;otkV31lj(C`KU6mzGxSh?Lf88 zmOHd|R;lFzc%76Gs)kiwB<`l1cS0KsrInJWo-&mEoB>5+fI^i4in+I~RSEG%YYY$w z46GssboE6Kat0m(6;(yQ?F4;QJ_2M@tnyj1p37z>(43?MK1P?R^s!Wea46BE_dAIW z^qzD57fJ~B$^cJ2At@P1yX($sOjF32uBVv0ez{7NGp%U{fuJ3)VcK?98tS)IAd_pz z7oY@&HmR1)UAIUr3p_AH385-i9fg((6$m8-VQn~w1HJ9$Xd1_I}6x>mQ`juOT)fx{N z`~+9NEhu2(2VOR;epCo~cisw61p-Zlp)zA>t)D}kV{Z(%Gzv~_71e_pP#=RgU3Z(W0S9M-$* zCa7g$r_nA-^r+$xjR)TI;go=08a(xcq%?g;jcU^vqL4GhA?~_KDp7wqI|&9sXR935 z$NB_4j~L>e`FGGHi#;XQ6As?P2ve%BivlKRJ%up&6yqYyOQY>8SQ%i}NBC$OdNAku zXgXD*FB2*RqW2N~6bO*VJ*zc&W$N z4+>RzP|RItBm3v;Ax-%KBYBKg8LGd4Bv<}vDnq|iYYe3!14TnQLzL)Y$cZ|8Y{g1S zz*Yo%>Iq5d%NaVNF?59VpL0}CAa{M1N)=M*nIs7WWAO-P2?%rBIV8EQcomc&p(Q?s z64j!;IYX47(a5{yhYpp85Kle9l@_Gkb%!|*&Q=~#c_5IxK1n6y&jW$LL!`#TStL0R z7L|uDt2Cj+szt*%50nt9hO0a*L!Du-K@dhyJ!L3X&O~!xO%lxrRVJF*+#y4qTQLz+ zb5HrI+7Em*_Xb~8QEFAR6?MHriJs;v-}W?@;L1x#yXy{W6;Y^GL@{^0S*7FOT7aC? z+&;vEzJA*=pz!9VsXUxor8PG~E!&6lK#3k5Sgi5Dm2wUxprN6jdO}jV+KHh98bcIv zhPF}6y)BZ6I<=`?GaCfM(5uCYh=$%_B>B+W1|-UBvN;8RY58cLPXD8_dzo$kALBfFhgtqiEI+vQ_n7!i(A zj;_>XVnhbUMPJ~#UZI3gwGR1D`||Yw!65f@y+SdeYAA8Ng{m&A?Cq&1pc2yVBnj=) zBt#+d1rLX~>kKN1zMguDl@j-yIldC5DwT&6D&M4)r;wMgr|;WQv&(r{`wBBGpQYm;_LwM($^>Bo|i z2lbmgUQllPO50u8(C`8^Z+Y^-0cS?r1m)tbTo?H6i}Ein=9{Kwt?b8V{mMQ^dHo(p z87-~gF=k6qYdHR;A6BxOM>TXNqK5Bpxx9w&7x5a}w6bphvW=A2kA5HY#{cf zLP5Y$hTTD_7sCk@X5%0$c2{;4^7$9g{VuV3l!Fk|f{y^^DKVC+sR-1g#x?@(##Y|% z{N&<|sCOKDH#H`;fwsM%tNg_IHte)v6Xvp#FI4w}DnibeoxR*iWrr|Z+Mt2Ju`7R9 z+pBHbNv5MY#@>ds{!(a2Rc}{Km$AwOzc<^PF>26O+Kyi9;6n28Gzq1is=&T8n>822 z4Ft0WcgY1;&4u1!_uhlq&Qp%Fm2K%6?AFZwlJpt7Co|gl#iwK(x^!*s@~-wNKx!`{ zOf&^L^ zl5d^nBojEvSu#=TtP~tNje_@-*Q*173~je^UQ0Owwd^w-FpKg&K-Aah%a}NLikOfR z)rvNs0`H~~M&)L+5UbR?Ex&@I#}BN2^(XLbl&ZsbBKmT4@a2Cx)ollrjb59ECtWVy2h_4 zug$2{=KT0lD?3*3tlnDIBEKxka1xgWfv>yhk^ z?KA=>+(;wP;3?|jwvZ0nwp@oM@kyc~*(Q7d_c2^picJ^;H#H94`*6Rc+JuNSn{YSW zakxS0s+*7S*>o8HQjxXUo`@yuP$^zAD9{KEHNl` zACj4(K_60OfN!iy?zrAlWVAcui^mz(UnDEDB1Mj`z4;U~WmrfmJAFDM3JX7j-HRAcT zn@zBnNtQR+gZA-K#oO$(Jwdv7lo?7Fgr0j#ov}fE?@_k8RMDM4^B0s2ox7VVAAmDy z^suI{9VJljQf1*B-XJ>mRaSGYz*&B`yAanP>Wo;bFH>IONEr0po=`9>xF`M4r+J92A2E*NpgJDu*-F0F-%t#u{n;8a8%j<%q;z zP}Dn}^Ux8cCsJ$ZS?xezX6`8n&B8)+9{p zuv5ywa!wAzx69K9s)-`^tYKZ{$-0JL3R&W;TgL*Mg9oi4OaoRqjy-@?3X0(>$SDF`$RoNt6t!>Y6!PCHvq#kt~A(6g0m9v@J+^#@*xXM$F9W9kc zWzeC{a|O#x!Iw-4W%@D>_o;Jb2mr`rd}H(33hhtwWH!GpR^2$`63?x zq>P?Iykc4}?UtcT`LKk^^O7Qu`DHfuWZqxGKAUHXu>A_z?!1P}R<+bK zUSo#&)k#2f7{|ggPAuRxx8p7AE9E+~V1j6SVP3-21&|pF;T5ng3%h}x(ame0X5fccY<1iNb z6+dxOF}>UTXl=ih{kR|=n1dG{J7cBO$*kZ`v-F3B-FRoIO+-V+pk3}nS zftOgLCNUT*xIzGGwkt8o?9V&R=KRZXll+o)AX%7o-2rsMFYAT{qg}kKmd#+pY8*Yu z-^V<%9Oop!X3p*9ZM$ zw94>Wg4%r0uQcdFf==*3-_@YS1fArAz6j_*YI6p_wKazIkbam86Erred-B;CXS`@- zLF-e3eFY}lS<(98)|;wr0&X2s5!}1VCd5?PgwGJ}h5IYqTW}$O{fzK-gg3&Kz-7YS zU&WqSzbz019S^25TkRdv!qMzt?Mi8EI!n5H3ePx|%GTdKj7Ou=*zUVm2BrbMB8{0{ zf0b@XV6VBNrThf;nQMTwB$ai!9+wWKu)GI{N{uP(l?~I)_7qLKU|67!1%Am`yONT^ z66Ynk@RA>hk+BM)m)6Nbgl(Xq<-MvHn%PW)EllLZu zW?ZV{ACuT;_l}PS#8C`SY3%=>D8hIRSVCh-HE)hNM1ic>ut{v$#`Iuc^2=-3GaJ*n zwHww0ti6VXx>Erxa9;w(T*GeRz(zk{%S85$J1>x!Ihn!wY#M+2rVs)~Wr9Q4 zRT5MZ;yyuj7qJI6C5HMzUN2&AZ_46~n3&TO9#Tx1#PPL7EX|{`NI89ieHj-fu!sFJ z!b2YP<=i*nfz4`(n2>!wVB!R}aI+;4Nry3u?c7XOAf=wHz@qxxz$}ty7JITjE1II4 z;VEB*{}<7+KKBg{1_tMEP9e*<&l=-P_9^6rC<_;?vyOrGErr*L8wu{e}Rw#@q7P&<8g9bM>*6?R((1oU2i1^Qpur zasur!&|pW?)mX_^HlHPk+3a3cG_GMdv4Gh}9qqM#Nz4x`{gN2`Hx6fiut%gfhp`8@ zj+P!8#@;}%Y#94->)JrnC!^Vc2S-b{N3*XUOoO%!ddMTK zyN^Bf&@rjuepdbPv(kL4 z9&?bbSVO7l5o#h_o%h>+r@67~w?d(wUw>n9YvfwtF}0x}c8zB-0x(spP{%nx%upk% zeXM`~72~PW2*(M^syo$9=0v?e- z$2}&Z-qV^-RjA{zUu%x4u*zT`3ke*c$4KDSdrHDfm9O|-(dZLSjwYS^HG2E}=-sKp zeAG?_aZ%u?hPG_SgIH2yl++Z&rZvW2){0=Y7`4LC(~6&YVYK41KKV?AIwttl`u2as zd|t!U`(ZX}u)bzIqjQ{sqW#gBD7`U`B|M%a=Cf-bAA$8l?c)o~`OvVt`c=|qrA)bn zui&uTI@e*MQ5(9$%A}oZQQ*#_A3{G0-toi3!A{)rJ%p@AhnG1!^Ahz{EG z`3wr}$wG2;C;?q9dP~cyd6f=FJg*aPRZIjgQ~IjNuI6xiqgp(Pt9697^Q_jVHh0+k zX|?<&q1pBNO*@G`t>}3b9#fWy(sv%j??m6c=XTY;ESB*iaj&@Y3qD*%z`@N8@ zdvcg@j!(7(c>2j`<0KW3$uUj7%vg?c(QP_Qk(vua)ns-f8XG88WY|feCzO0k=vMfvVSXs(Hc`rD-3(u-3T>p2G<1@_BM4G-n>G-D z#^~lLEdQUjGD4`-r@p_*bPjbx%H6K!D7*6HQtC=0a^Bh$N;!05fXw>haC51$QO%`8 zgw*C8-y<7GPu;E-WZklK?|c8eM)dEEcGzJ5-pHoeMeB{fTQ2nmtY9bajfMM$*==aW z;V2Zl-c^Icwb7oENU(s@HRGSurCJ9Sa?9iEpk|;`2Pxf`OIuI|S=fnv!@~|BLn|vP z==Q+pE&riw9?D_m&kr+g<;ac&e%vn1VVj?yXew57ZuZORmBYSyzSI=1=B)I~Y0PFN zFASIV+{9MCFx>eo*6_5v;>Y*6HpC7&8pxhd-t#S@TaDD56RKyy<~35Mk1h<~Nuei{ z>q3dq%_EdeT~67T)ImqtJjwOJ!u4TwFvr}vRh+_1`(sC`9Y(`SR~lZXT;Nv@)Y;8D zsIRFrL8nytWD&b@{{+)1uF;O&eyvK$Vh8uzhLSc}in^*|9L*}uem|UlWwP52nDPtt zJGs)~n(}tNP!$HgalVCvc26I7c!!0ns7hm(O5>0p4JXkUa1CjxPpNy8?m`;n7u==# z4k+aXAAOIBGTeOtYPI3E5^^oM;8wBuoi1Bo@5jy@xZPhncL!dsouBJ2Y3H&GcK3_P zLwj^_v?KB2m8un$!QOvyq)%IZ@+*BNo%MdHBv)OxIezoYxhvh@P?BAFs__g2&+S)O z-5cP%QcvTK$uFfvAfwD7pyD3Y4NGUAz0@D}=9iZ&YW9gsqe4{vmd1)+PBLxfFh_4l z!Z+L&rLj#fn+Jd*1`}p(cLg8j7}$1Y%p%tEa$-)ET57OgsdK6R?9%*v9Hp;NzB4&& znxlGHBgN zXQbh-=2$z~r|){&Q*^_n_OvggxV|F++T2k2+A*GSXavs44VFjlEVDPi=aF-hLs;0jhxy;(P3@=QnZa>&mPJN zYx0Nvn#g`V6dSg|A9gsAje31#?=yRC!U4DjxW#+f4X+RAN4(J$hQV7E#5)$_#Qpk^ z@Scv5I;?y$e&O}&2UV!srWjXExKPzsy1|Z_J!$$1>8VG!&;1^%Y-NUa_zo z?Kpdt%zx*rQ=eY&PHZ<}VTD$a;bnc^%%u*Q{w51+M&X`0`p{O?XADXLh9alc2nzP;I`M1$_Tx9W%kmMtnP@JYI*9&TwsZBWrTHtNKak6 zN3e-+4a+?14_h;Wbjp8?@E$CJr!=z6ampWW`Uv*eTQYoKQ88 zgf}Ui>?oNKugSiM4LX_>w%)(|wm3HT=(Mn6e^^!=d*SHth%~@1Z@d`CzB^hqmT#@1 z9Q63lQ_@uXIbFtseWyfZk{ z;SYOpnE$vX-8e~fN|VYQll<|v3}f@(IV8PeWHHCrN;_|3j~sVMe>3b2c(=DGJ&46g z+oKdb-xkxWiTK<+o}F$RJa-w!#m;?Dphogq6hj=ferGchr0)2p6qk}a^dLb@X?A8RT}Vcf9G}-QdU>NTE?t` zcZ_-?w2kP6o`8>CH~g~3Bk=8>(8CBymDpl>H-HVxSx@=dGUX(dDLUsdV4+if1~IIw z&Xg)G%Xv?}?pdsO%FmQ3`uBjxet55c=`K)_ssfbToKz4e0xuwfDa=8w^_s%5B}S@e zAIJ}U2tVJ4f6rz3%U7^j?~mwvMD2k2j)N4Dl!_tjzV{>hYFo1Fec+5C?7;iurCQw4 zygym`T4a;{6%}u_aa|AenkeE(904z4I3z=t98gC`_%J~5EzxzmA9i+veX$y=FEUwc zAx;EU2wDTqQ4ZR$sU&=3sDcFF7GC30_r6t$*gAu}8?!S^n?eQ-Bh~`e{ zRRPHJhIgEHWF?@=q>*4^F-Q^<6A}T*oi+-f87jzSy?|PTYI7xC)8oB5#O69<#@;Zj zHGp!68D;jb$RJBAbwsoVaP9$y-j;ezklmMmE9@V^ciMalt8I3dIwB=@=f8drMrTw7 z)z)<3K+Sn#LhqAY%8nhNKp5|xxHEh@4tgV6d^6L7Ha72rtsy;RVx_%*d@xqzSjILy zXruY73s~77-sdE#R~uUc%oM>&q@$n9O7VyqyeHrhs>elMl0>~)sc$5(U9o&bt&P}u z3g+KsC10q{_bYRce;H3G6)IH%uP78urGhI5DWCqz>?h->tzYpMy-t4g5BNw*R$EX@%L{N z#9r$)%BMSq^)-N?P&EQiXlYz}O@^tg&$;qoOoT!eOiyz@TYj#8uLpg+oEzSUXI(0A zIG?qgE5}j%fbT{pA`h#e5~J($E=+p?cvMC+CZ3ONJBBQE`GcjEJEHzrKD+h13?~(! zhjN~X`jdnKdsAcVu8yeu*=t%4`-LpGo@aH8M9v?`xuE4h1o~}Ms3VjXHrRU`>nKU{ zC|_9Nysosd4L#*sc2T@1m!Idc;om!_qm0+I6_wRBhuv2XDY&dgl1g=lN~aDzjq_ay<2vg2mblgq>7|O0x6c_a7CDY`ppUjA!$l!{PPYD2>(10iZjM z@M<@%V97sZPwawxaWRFjhuM|DgJebUxX>U~r?_e&g(_of-APn*7D)8HP>Rz9fv28g zr67x-Oga8CYx*I=dF16w#j`KTUj6EMgyRg=R8J*JmA|T}juW`u@KJI5iW`Nh!umQw z#MDVkEj(I0L25w1Mt}@7#jad;GtB~#btkqGp5t

C1=(+a>`7gWbwn=8^|=H^4b@7jUE|AUG3S@iVY}C~kqU8kFd0z4 zT;h{Gb$&?i4SHJqIX=b^a;(*}_s@?hMG36Lv`d(6^wO_PS^6UH8nA_=I?j=pBx ztSr~D>I-9}DW}=43mH=1)9loRqOoQ^;Kx>q4qFFiBGY#CAMHG79e^ydjUC}$(}Mu- z+=GqQ&%?{32{CqCFal3#IFR_md86Az@s6y<2m;ZoHyjF5yd%zIiX<2veH(XDw4<*l zG>Sm<IiKO*bOU>TN44Mm8_ig zTbr;3t`u$&ocmig@0V05d@9@WOMfY1D*M|nOUD;~$2m6N-$mMX8749T{YN%cR>cN zcSiz1pNr)HOB> zgvj_$(pyRlRhX5qbu?mhH8vpQ=4N96mv&M2DyicnPWK7;ma(=a+{QY)#yMlDY1Q-n zCj{*c@eoHdMjRS~6*r#;2-Rg(3()=5GDj03lyvzfig+M6wi67mfVD!2yb$GJW$QIj z1O|e?zU=R^CXVD8nCH4t3*mC>p;~2_D_H1mP>-Fu_l@5Q1AOb;4977&>+5ZbKZd$+ z=~fa^s@(Q>8VTXT~H`~|Isyted~R}SGd4&QorpPF*gnC&*~uGE8c;% zHQjV|%^`eH&?)-+=pRogCq$>{T~p-2q8L3ciI}dww(@$AA_n-(p?voY=KyWT^i3$F z1G#lcQ)P!JS|o%|h~f>s&r%V=(FoEgzQ3;|28hxry*yASj*`0da*<9PIbf@<02+Ok z^utqrvS(i|yL94&-s=K5g?q>-FAtDE(1|;Pj-dcnoBMS8YxUwlG3dOSKCP2?28j0s z&C^qMy;(2k1d1<*!kqBU;~Bfsy;GKYiEoJc@{wNR5;1@OID?ohiUsn5ATb7kOAVd~ z5=Tl&jr)%WiGcz0lDcfdQ8?poHsMaVf5CkLH}-d%&;mCH@f+c$!HtKz6>c@05D*{+ zs2?dn7Z9Ld4&=YVEr#0*ckp+coD?P|<#Z#_@TW~McjKYhMHr$#Y(gKnM-blucoCe* zi|^7QodKM^2tR;(O5Fc&nAj{zbBg78eZ)Z_Te+|*uW@V+kZb#hLqoKy%Si-yh5*{; zX)*ym=p()yR35}-IVNcTLw&`Q}f9~L1_9dTW+0^uG*flve&3%3Mr8(^p41jJuN zxYHoB2yx}0MR+5-4r8)s;Z3(reAgonHHiZXXys;Xpq*M#M_y&QV>j_DRhpIWWKErL ztwxJ>w|>iIWWs!8)|kXaqFr7-K#UlI?NivR#cg`m=OPZ&qg1OJ1TAU}*fT{A?Jt%` z@cFw6ir-Dz)qyej;0k$le{}YA`N95TdPuV>u_VX70QqEpF<)A|LmoIlob|ue(KtY~ zfYRv!;#dU6Nb$oEFy)D8;Y$?x`$#cSTpUeb`c6F_-?oW*wFRbOw+C4=+5H02>0Bh%AlyF(e7x*iJp~?@y!IG>GPK*Er!%Zt> z^H4Do9hN;*970RcnyC)K26I8bxCOK1nPdc-9poIsdRz;U!N!&kj1UYK-GdvvN}-YH z0k}s6x>_PgPa8d^X27q^zf?IWTsr@4G(bfE9x4u;BsQC2FLTqcB?fYxYV()YifIK;a$} zp|oz;a+q@gYASB{rqc22zZHF{jiuw&qPR;6dv(%yjKc^YKp%UNss>p+{3rTO!F7kh z8&>xKNNQc7(eZVVuV^@Zh1n-#-XSKE!p-kTG?I*Thg8DoqtPvPwUFyjL>Z@sXaC8x zoiXBDF~D`TV=kkJr+l)(!kf98z6<42@H_6c{AcjLU3Mcq58^;*aB2P0Xt8aW55 z*k#>Fu@o9tK2ppN1*W@5@subQbe-Hd61KoDw~Z8&uE+_E7tP2S8!r}#_Wf1yVx2Am zWvfk|k~RzPk!l=Gp|3&{#e~twu>|a({3&=1gwWLze)C%qrB~@A#^!=VF)|Y<9ur4A z6z=8`e~uwEC`z~EFpM^SCBsC@j!}y-+>|JefRXwzQ5-^}6+n#E?nE&zh$?LscOJCM zqsCyCS+T!kjF{U?)3Cu;YM3?s|0^0+y~t&y&Jyps&ZnpJQzgDOlRjN3njRe*eYBL9 zaWzNaP@1%%R5A0Tc{~r{`t&UxnNZ}?5G6f3771QNHtC#`Q+pS_;QqMfq%(<(cqFQ6sga=d) zx-^@@gkrNKAGeAVP`F>7n4XHln1u`~Hcu(Jv3{cDO zIB>>~V#TQLia;i?^ALWbb zAQxs6uR$=|Chmd~ciTjplW%0o&(ZFTqBzsTs|iC`-S03vzD)~eTkMtirls@pO-maAPA`V(oZ={QS44ChiYTFaMkHG?l?s;5R^65xC zNO^5DCqrb{j2DMGm#Ad5-YD-5dsT9ES*xz8yxm8;q_b36uM#DS5(MVTQi;t~iP6>x zS@cytnUlj&;sts=SaPA`UV5sy9o3g9cdnwU4Xpu`qz@3wio|u|G}&1sei=LsqWeORbDweY zkcnc#{%sRsiIF*Lk~jmw)04zK*G(!W$y&XplVA^;NV{980Iyd;8}{R zM(N3tD2q0JF9XSC<=A0$zXD1Gs{0c?`MJsB(iC2{(^b^Rtr@H|ZXggI$T#gIn+1J3ph-BjEyQ?sNz2Bq8UzjF(Q|VsS?}dDd?}dDVgEm%5JUqG}v=);p(v3rLv8+rNCys$Fs-}alPiY}u zVz3zB*a1*j-K}UJzFkG7aqWTyx&DJ)*oWA~!BelOtI$_hHcp87C|8k**Xyq3-H3ye zE>FZeySQQ0E*78?8&=3Ib}??Ws)pJjZasYsqg1(@mo(IGqokXL=mop--CVg(sc3Tk zd#x8LJPi zw-2q$V|;_SE%oJG;5Fhh*o>o19bS#gyGzA9vgAJL(W?SYde!_J-Xt)bJxc0{8DFFt zG2dFC%KyviVOp6OH`ce$q#K?)a0x}rZu-dsJQeqv6s|>Ns=U=9eB<0$CZ-RDl5E1J zd;RBsUN*-^&>VlhOdK*HVF*)znu2VoGcqyxCYSFaL&njxm}Glx5&L6^=P9Hb7o=#%qjiUY8gnmtn-MXOd^ z^_3|}HS)M5l*Opu3&@#XC1kCXM;<@Fr*76n2#hGICSXH^Wd}z>h(;YNF zY@ky=blxBgBzGw7Zi${erCf~abpV3F1)+RPxj1;Kom=ne^+jj#3l@$hl9}i=b#c06 z#VH?y1ix&qHxaVF*%Cm^Qe0$inRYk z!<8e5VRdIIf%_>!T3ak9&f?pF8M8zW?A~Xy#9_fGLTXmO_y}wI#w43(i%Bsv`9P0u zq|mOsN;D4ZvB))|mtbyY7RxJUi~T~+OvUMvsT&k_0<;C7AYOuC^518R@lpl09<#-< zv*pFX3l<4rJ5a_cz;AP?1#@o@|0%66mOF0{r}6_Vy8GY$`?C(=hOf1x-!e5H>CZ}k9fweDCb4jRN6Qx^=l<)>rz z9RTtCXBUdsVha&;qgWTCTX7%{wWiWe~oN zfMpPUZ%8GM1M|rvkQe5v1s7LYV-(J9^Hw`(x|WwO5#ycc379`92|WWaPzu(;SV~v_ zl)B2G5(tk9T43x4Tr$4u(I9H{U6#>-TB$bE5jT(gXKupcd(MWda3+1lc9ghn@mAf) zxy`>x9B~ct*B@{He7puD?&I{zoivQO{wThG>b;s(dCyJa5SndPWnLvB`LmnE=>Cwk zN8fT~6XkvmabEbP@lzeamDA}EZI>(g+YT{Joc@=kxIozfbG;P%-$J=+DNYln$&G*_ zb!@3vX2Z@QcuP|uDl0m*v7rFTj(0j9YhMkn!I(RA2Zn5GKw^nHyWr>u=`tk}!x@%* z=Y;9<^_Al2Q7FH}Z7eqft>a(H2gt>S!GQ^;y$Q>ldc3|vPhhQOTq*CZ6chWR8lmG0 zz;>$iLFas>SP=^N`nT|1w^JK86-<+_zgZlaPN1Whh<)6Bh;uG7Bg%2=YtDl|hott2 zCGtx*i*Y7mhw4!_fD`n=AeVJsv3%iXF=pyKkf0Cl6)#rzZ4IC_kTBFEsE6?s!|>HapG)|Sm7O$GCp|R&iDW7ihR=+u7f}UXm&LxsKxavNHTlTSMtuVPk`>L@vBd zjLks4(X8fetmW9eq*`Xv<^YA0u~9dNszl$s8)diOCeCnDRY${BR8^ByLfFIj>gNSZ zU9V8x3szdx$Q^4^H2NE<#`SOYpkHFwrSx!hW#y1#I}DarzIC}cAea~B&x=@FHGD)aH<`cRkFfV4&OOUuP5Y1R$$$>n0&R2qas|HH@+dljagKS3cy@LS}y z)9Wd^QLTw_C}cMUM=g5LamuiN_6mqTgqCpubQ%NuTenhNo(R?X_2l5@Ur$cL4`1V* z3mOjJTWwP5k};=Y%%2;`F{{M%UR~PSZ~iKA@bnF&EY-95i(_@|#|<^D?aUxe>#5cN zLLv?Bz;DmvPh9}^;6?f2$*rrzQNe^SRb#%1Vne?$Ved~U?IUPlTRE+;x&f4^G5gkh zDOG&UH@8Z>18cq$RbnibVZT-37HFkBxmvs%!Le!>m=*GG)i`rpA&*`y-mk5iQ=q4Q ztL7^NdH{T1)dRA)Mobula&(3mi=Udi;tWxquttob3o~^JUJq+>=^*pc6x^Y%EjF(a zhtti5H*OC1>9o}wSHXR{Y4XO=yJTBdMKf?WE+;8Ll3GScd z{weOC;r?0f(@xAAcaHm=+`qv6F79`)7(W%+0(#jSr{_LRuiiK#_sP6@cgn{3jA6mbl@b3#TE{T}GO=P%-slY$c*cS%ESO#}VAj;g+h z(EsKL+mHyqoxZGx1F*^L^9d1_HKX}(bQhiI*$ABws>&*(l=;4#V{hV}qO0bZP}Ps# zb619VN{%V-G+ty$MRB@S2YsyXOK=b%!E z@-G*~=w3wlS<%SBXv7kaVTrrsl&j_}IHoV+fXH+ZVKEc?4@>t^+XHF=u9`hU)qt?q z%1@QyCz?z4D7$uCWOFBu)fFJzG%;EKTms6yhH^3@Fgxy|?I_pFRkPi{+;$}p_`gmZ zrK>_1dri6nY~Uq7{nnj3o(dY(pMuKXaS{JgrqiW}*+u7SlGR^P-T(bXuQiMWZT5uD zL&;J{ER~$jOB&RY-p4L_I|ACj!Vd#@iq3XSMw|YDeAaT!Kwa5m7uo4+a`mZZ02bKC zy>Pp@t4!YUuBbN@7hm+gen1J8_q;1chP^YDQjxu3Ach>h=-pe;CsdT1-V*~Hv){Ss zo%_0{=$Kt8)}n{;yD?hypk2w(qWkR1Xf3+Ou9&sxF1upVqTB6Cuom5FSG>oF?t$fD zsB-6#i(XdHXSi&8Ukq@zsyUM==Vs*eXy&nF9{#U5?8+{V;;Gw;wTE5#i9=r>@sh%XrGJrJRd+vQSITYb z+gy5eX*~74mP+KQGg>N^r{336QTaT1SW8Cm)C*e5$Wyzul%A&^=BWddsPFPxFM9W% zUn_p!``+bWi2Ij+A?*qpAcp7UK-cN88s zwlhYE5QhGbf1IG^4Z+qVn!j040skwFEAX8EW7U_6`7=Rr%JGGlu>RLr^8bq1gD1aN zq8limDbWR!7dSXp7%Yqy67Wxk^ulmqkPt7#;wwda9H7@~hoT59H`0p?f3H!GbV>`?=hw|0@*)OxmJL975I7 z$0$GbvozE>RFFCNS;*NeH1fEp`E(v42>2l^e2DN69uuHLv5+@?s1F6f#(hB>Xu)7a zgd7rtVlecXSLCC5FmU39YdEG#F`MG}9-g4%KwLrdi%Ye`38c!VmvF)>$6JuVaCjonR0HRE=jHm z)I~0wSUzq1%*oTI5#cT2HbIz;hn%wzmcz}k31`Y|LNws(5t`vvAzoBGqX_82@BamV z{rpS#oe#*XyQB=cAy60LoK;XZxuCF^7xwW&gr-fOSyWnHP)zX~Z>zqw%A994CsXRu zr}M``o=_+h@qhaeiU?04r2m!H{Y{~uLwF2nx&}OqFaY5}g!pk6Vc(C1PJ#YK+GhOp zyaC}3WCS5xk907>k*5EQwjQAoVHLtqgbsxCKhdgyN9(DXNYira2r8t1YUcY?AioK) z4REK<7Yaw<9Edj{OhcG-zNk>>#(#d>2e+)VP{@MQ!?pcTDC~jT05=CN7S0IQO~2y{ zcMR?TToc^7?+fM3-=!j_P6&pANKjfmLL*F$4&yHXlIhL;FsO+Rqp%nJK2USgJW}|6 z+>d~-gZ>euKUe$#pr_~BEC?id9ryKu8S!`?58!?vha@J0I@;JPsMuicmVeU zIfP~!(r5BVa)@e1dhvKL;8dENK^O}^Ucg;8e1Zh=U;a<#@nFF4V}INqBseKSBZ~fQ zV=Vm9u-{Z{82nMNcmhl@jm=1ICu1NL8nLv+>knzszY7S4AHfGxUr3C`EZv8Pqd8bA zLoVv@6GRWa8YnWkPbx{jj%VmX&f9){WN|g=*3uQ$QX24BD!Zd zx@8!;Ed(lSMu!ZBW{}#_S6Ru?#3%oFQR*x9m6N^F(BZv7n6iREv^OdU&`<-BCitJ; zczK*xN)8V}rXE22e^7vNSdrwF%%kyJTby#gJ~pBA0X*(qU=x}uY{GiD=1P324q-T4 z(+xH`tU)&{rs}`>ud*kxu^28wBD0x?qE{Z)VWy!gsZod4AsGF+0^|mT`kEDx~ znWQU~vvj&+^6>y&;FfX0@@Bm*L=MyI64)N8K~3Ejpo>E)Nlkqgpfkx00XjX~E=H)J zp@F)fupVoE!?LBTs&cRtTpB&AptziyQ#91~A05j02C*lk*x{Wp>{H?VCD9ww@skAp^=eGua&wH;oCHQj$?*nVaj#X2 zt7hUquF6jtbTRTVgU&2>8g#L8#IILAnW|YzWc) zDu4KkWRfrZBALsG7y2x}LG6z#r=!cK7n@+aMa84OBX@Pb?Z4Zo3l0uEa2W5w56chq z*WK-G{|LWV4@VzT1q%C}vQZ$M_{1iB4oC3Z&+wm3;OIl?R}p{5FHP{@&)6ssP9gjP zj_@e`^yfATgv|&afGb!9wW(Tq+pXq_``G}U7#O$+H*S?v<%fspa{A3$S|H4WqteBd z1$Z@7u(whANH6b*)fse#-s7<>lbd68`T-U6E>QcJ0~r02P$A1NfBhBt_$s~NxRmd- zzp2)8y%sLh!aKBZqZa-}3wLSZKeez~3y&kDhtH?9^tW2rrG%FpK}d3Y0igt(7A<`YAsOWl zwe%MV$e5s4NG6`WkoEc8H{~fEYQ!iTfzgnmZHe8EuoC);RL3*g*|Dkf^NCho8-<{10MFV_KA{oJ=wC*c1`(@rR>N+)bb zayQ(oaL3_3h5H^(Sfvws!$rX*!A*cGgIfr9E8IPB55nz+YldrsQ{aAqlR!5dE(&fG z+*;6^h;SC%Lb$u&9<0*M6#j|G5x6sOzrz`;b;2OHM7TV-GB^j^9dMiBo`!n~?g-pT zxU+EI!~G5yyc%U!)3HMN|8E;6uU)8{C|_8pv&*k8)Mf0SaHFo-=yafC?@4(xWlHMw z^tI^^X6(xNTgH1CA7p%#aXRDkjIT1pYe0XZyA4Ph?xPIL7AbMeKJj%12czY z#$?82CS;Du9GPXwD$1Ikbx+otSyQrCTbz~+mWM2lTb{B^%$0Lr$Q8`kCZL|rGtXt7 z&m58!lNFbhkToVNIV;_nm7QhHDnRkcStVJeS>;)Cv*u?l$XcAWH0zeE6u%d7xqwgn0;#CKV+wO8z=IHs!gLrKt=-H`TF z+NrdN^vv`n=^NAQ(`(UPA7%U{^O4NSxzlpDTN|x0c_;Ed%KIj7WPVxxvHbV)g$i2z z3qnHD*rfSM^+{XPA4=bm@kGW)IiKd}EkPFNc}pv}inj{O1z`^m_a%RrJUOL4<$;u# z)ETK8Qy)#;mwGhyOzJPG#EqHDGbI%CrUs=&r=_ON zO1mL#f7+L6U1=HV3({AoH>JOko}N*WQJt|Vvf8rFQfJv_dDODkX_=HeKX+;Faq=k zO%HiIn7Kdm)y(NxPh>rp)t2=^mN(0q{eE_LwjpPH&ZL~5a~4>Zplv@`Mna|6=f0c! z|CDgSWMn^QATwyg|=&!r(KX;wI_xJJn?R(*( zO3+eQ>Vx{Q&O@R!oAc%#JJrs#?e<)s|C=L`-an&Daf}m3-Xi}bZR9jLPcD&P$#wK5 zI*4Y_5p*=nH;*o+E9nMWMmNza`Ubs%EV$ht>lgT|{4M?){?y=+V1BR!LVG$$VZ+%d z<}l4BvdL^QdzP(ZFS82vCTn7!u@lTe@=_7iV!e1-TrbmPz5GC)4u1?csF&4is#d+L z_Ns$;{$ns@H*6WNsn+^2y+K#$y*j~UAZG70)NrG4L@$`_W|yf)S~i*{tg*!$FgM#& zn{G2~rrl^a+j_glHrZy|Vo&rstGzGuqLJ$z?TmGDoLnc*dB~Xoqvbn0oqDIiX>^*L zW!`G9%-iX8!p)pKLbCk_{Aqp>nN@OZj6`ijq&Dt%e`VRy3yO})q3wi8lQS|$zrk!7Fka! zNiEqyc9T}pK~5q(E|5`l5`CCf(zoF3F8VVa<&Q(s&Gw)0*Tdg?{QZ8X|BXLB$PMNM z3xkrNJoqSR4Q^lySqUp=yV*h3$!=n~X?WBv;DSNP(~ADcK_v!yCh!!;~;BoP-285`G?bg%`tEH9$R~o>4ET z3LIUd`UnSiP7T(haA;gBovp{}9Q{XKj>Fro-_hUbQ~JE_(b4NnqDe;IjWDB)W2CWW zoO!^^HcQb^k?y{3inNk;vJP^qqxt@${@Z?|-|l~oe2)v#gAov1OVA!1WpP;7UHp0e zD(AwAnR2eYh@@|Tp3bWw<}NcIJsJ~f!Rb_xDpE~qu*Y>#WOF?-sgX31X3|0qkmKY8 z!t@OEpFuO}NIC{tMWKB~v*}oxLvv{!eTdGWX+aQJgzBRR)mMW&Hk}>iUHlKi6}}Kc zi@U@)F;Uzv9uzI&usANRpq2;A5z?1i_H|QdI?V}l*<6Rv>Amf2#wu<_*vxhQ;{5EyyQ|!EZ#ZhFS4o4( zFp@{6BWMc9Q{;WJm+U7;$=7Iyfi#QWjmMu3Zdic;ewLO*X$5VdZS)8|N{`dCw445q zM*Kwo_r8N#y%$I_2QaZgz9_3?jobl?w#v`sNqGTVdt;ay-WHAuU6iQ}CxlbNS>dv< z5T1A`tO&P-+r!3ie>gx*!NOir`&1hg;b}a1Moiy)(CB>ZMBAJzPLC7kCcCNb5SP2g zo#5uWQ{Bbx|Isr*WQj~x63fRPqvhND9rE=5r-RT1a6oeSMOcb;3|zV5a}-EVO##=P0yVs9n< zSOy#RBN;>hKFVRhgJeB@5w`mm9q51PU-SC~X+c&%!Et%Pf?zE|c~|gp@C6XHCrDyh zYyz8utSdy?)gkAu0XBzo9~`-tf5MORt2|NMEK)_f7%H*^7xP7Qk7yPeQn&>WnPP^R zEO=m|nPrv(qt2K_dnZ6D-#%$u?djfN$&QI|1WTeb#+inwTIsyu^mo%;i9MU_K8)J^ z!A0~(YV=gHqtLR$#Jl#g$rsr|Ex1wLHp94x-?iWS$*}~vu^!r~f#MIzqw=i03A$(wlU1s^Q;k*ks^}!OKrK_7)j!ZvIRLN4 zdbuvtMS2ZlqD_CN&*^S`Szp!Hbi~A)1Tz_2Jj>*p1;DaS(`|k<*G$C5+oAS8z*&hc zwPm&(E~&EBw#J^d-S)D*YOmQyUQDC|8(841a<*XC79otw-9Ja&=g2m={%d&tC-M&M z0fe|d_vfM0ZV7Hfxcq>@;||8z6kuclYh{D^5q^&MpmyU#KXJXt5szU9qGGdnPwW%F ziX@qdNufw?lW)qMa-ZxU4hyrw>EXigNp!`QuqONfsd*7lo~axaRceyTS4&l?+NPRR ztNK)Bq2;0&CqB|=wFdy*2=w^YoHM_eczYxIEXU^Al|YXjb~o_)H$5af=_s*0)Yl@X zz$wD|-gP>i@0<%rhkour_cnKmJJT(8OWabo4D0T2kGrSbi*9PvyW5-S^?0#lB*`VS z!T86>DH5T#10!?kOaRH>kPVk;jGqE98|UBeFT|ME=6Cs*{QkkfK(c#S18Zkruy0rj zAIv!)&!=F5dYnJQpMy@0K=s{xkk};lfGs!5Js3+?BOhu&jc3pr(M)9^gU3~&dK$E{ zL6xaZs!F|%64|NhF}pRXzpDf4us4i6OIdw^0?W2K2ovc%Ix*n!S>MYcZM9GZT zxq7mmp&!u;^isV-KLs7F)1?^AD)d%equk1{dAHyF|Tc5DmIfHvvOi^Z|WHx9bia>5lCk1taN*s7xH$7~&90I8h{@EnrI^ z&=m-uBDRJVqxVZ$8M?m$#8@3=HLMny)cdtiF+QNdZN!9^?d5qhyjhr7mUx9;kyq-K zdlg=dSLf~Wny`XvJR%ZAlIYe+z%6C+Oo1shYfOnLGZm)V)B?F0fLkr*5azzG%t^@f zG7K3Hi5A!**s$8x+FiE6-p~Z@I%GR+BqJ_DD<3S58