from lslopt.lslparse import parser,EParseSyntax,EParseUEOF,EParseAlreadyDefined,\ EParseUndefined,EParseTypeMismatch,EParseReturnShouldBeEmpty,EParseReturnIsEmpty,\ EParseInvalidField,EParseFunctionMismatch,EParseDeclarationScope,\ EParseDuplicateLabel,fieldpos from lslopt.lsloutput import outscript from lslopt.lsloptimizer import optimizer from lslopt import lslfuncs import unittest import os class UnitTestCase(unittest.TestCase): pass class Test01_LibraryLoader(UnitTestCase): def test_coverage(self): os.remove('builtins.txt') f = open('builtins.txt', 'wb') f.write(r'''const key a="\t" event ev(integer i) event ev(integer i) quaternion x(integer i) void x(integer i) blah const vector a = <4,5,3,2> const vector a = <4,5,3,2 const vector a = const vector a = <4,x,3> const vector a = <3,4,x> const rotation a = <3,4,4,x> const list l = [] const quaternion q=<1,2,3,4> const string v=" const string q="\t" ''') f.close() parser() f = open('builtins.txt.dat', 'rb') b = f.read() f.close() os.remove('builtins.txt') f = open('builtins.txt', 'wb') f.write(b) f.close() parser() class Test02_Parser(UnitTestCase): def setUp(self): self.parser = parser() self.outscript = outscript() def test_coverage(self): try: os.remove('overwritten.lsl') except OSError: pass f = open('overwritten.lsl', 'wb') f.write('/*Autogenerated*/default{timer(){}}') f.close() del f self.parser.parsefile('overwritten.lsl') self.outscript.output(self.parser.parse("""default{touch(integer n){jump n;@n;}}""")) self.assertRaises(EParseUndefined, self.parser.parse, """default{touch(integer n){jump k;n;}}""") self.outscript.output(self.parser.parse("""default{touch(integer n){n;}}""")) print self.outscript.output(self.parser.parse(r"""string x=""; vector V=ZERO_VECTOR; vector W = <1,2,3>; quaternion Q = <1,2,3,4>; float f; float ff = f; list L = []; list L2 = [2,3,4,5,-6]; list L3 = [2,3,f,5,-6.0]; rotation QQ = ; integer fn(integer x){ if (1) for (f=3,f=4,f=5;3;f++,f++) do while(0); while(0); else if (2) return 2; else; fn(3); integer j = 3||4&&5|6^7&8.==9!=10.e+01f<11<=12>13.>=14<<15>>16== ++f+-f++; j *= 3.0; // LSL allows this 1+((float)2+(integer)(1+1)); 12345678901;0x000000012345678901;0x000; 2*(V*V/4)*V*--V.x*V.x++; L+L2;L+1;1+L; <0,0,0.>0>0>*<0,0,0==0>2,3>>3>3.>%<3,4,5>; f -= TRUE-(integer)-1; f *= !FALSE; V %= (ZERO_VECTOR+-ZERO_VECTOR)*(ZERO_ROTATION+-ZERO_ROTATION); 1e37;1.1e22;1.; print(V *= 3); fwd("","",""); L"\n\t\rxxxx";@lbl;jump lbl; {f;} [1,2,3]; } fwd(string a,string b,string c){} default{touch(integer n){n;state default;state another;return;}timer(){}} state another{timer(){}}//""")) self.assertRaises(EParseUEOF, self.parser.parse, '') self.assertRaises(EParseUEOF, self.parser.parse, 'default') self.assertRaises(EParseSyntax, self.parser.parse, 'x') self.outscript.output(self.parser.parse('integer x=TRUE;integer y=x;integer j=FALSE;default{timer(){}}')) self.assertRaises(EParseSyntax, self.parser.parse, ';') self.assertRaises(EParseSyntax, self.parser.parse, 'f(){}g(integer x,key y){{}}h(;){}') self.assertRaises(EParseSyntax, self.parser.parse, 'f(){}g(integer x,key y){}h()}') self.assertRaises(EParseUEOF, self.parser.parse, 'integer "') self.assertRaises(EParseSyntax, self.parser.parse, 'default{timer(){}}state blah{timer(){}}state ;') self.assertRaises(EParseSyntax, self.parser.parse, 'default{timer(integer x){}}') self.assertRaises(EParseSyntax, self.parser.parse, 'default{timer(integer x){(integer)x=0}}') self.assertRaises(EParseSyntax, self.parser.parse, 'default{timer(){state;}}') self.assertRaises(EParseAlreadyDefined, self.parser.parse, 'default{timer(integer x,integer x){}}') self.assertRaises(EParseSyntax, self.parser.parse, 'x;') self.assertRaises(EParseSyntax, self.parser.parse, '1e;') self.assertRaises(EParseSyntax, self.parser.parse, 'integer x=-TRUE;') self.assertRaises(EParseSyntax, self.parser.parse, 'integer x=-3;integer y=-x;') self.assertRaises(EParseAlreadyDefined, self.parser.parse, '''float x=3;float x;''') self.assertRaises(EParseAlreadyDefined, self.parser.parse, '''default{timer(){}} state blah{timer(){}} state blah{}''') self.assertRaises(EParseAlreadyDefined, self.parser.parse, '''default{timer(){@x;@x;}}''') self.assertRaises(EParseAlreadyDefined, self.parser.parse, '''default{timer(){integer x;@x;}}''') self.assertRaises(EParseAlreadyDefined, self.parser.parse, '''default{timer(){@x;integer x;}}''') self.assertRaises(EParseUEOF, self.parser.parse, 'float x=3+3;', set(('extendedglobalexpr',))) self.assertRaises(EParseUndefined, self.parser.parse, '''float x=-2147483648;float y=z;''') self.assertRaises(EParseUndefined, self.parser.parse, '''float z(){;}float y=z;''') self.assertRaises(EParseUndefined, self.parser.parse, '''float y=z;float z;''') self.assertRaises(EParseUndefined, self.parser.parse, '''default{timer(){state blah;}}''') self.assertRaises(EParseUndefined, self.parser.parse, '''f(){k;}''') self.assertRaises(EParseReturnShouldBeEmpty, self.parser.parse, '''default{timer(){return 1;}}''') self.assertRaises(EParseReturnIsEmpty, self.parser.parse, '''integer f(){return;}''') self.assertRaises(EParseFunctionMismatch, self.parser.parse, '''f(integer i){f("");}''') self.assertRaises(EParseFunctionMismatch, self.parser.parse, '''f(integer i){f(1,2);}''') self.assertRaises(EParseFunctionMismatch, self.parser.parse, '''f(integer i){f(f(1));}''') self.assertRaises(EParseFunctionMismatch, self.parser.parse, '''f(integer i){f();}''') self.assertRaises(EParseDeclarationScope, self.parser.parse, '''f(){if (1) integer i;}''') self.assertRaises(EParseTypeMismatch, self.parser.parse, '''f(){[f()];}''') self.assertRaises(EParseTypeMismatch, self.parser.parse, '''f(){3.||2;}''') self.assertRaises(EParseTypeMismatch, self.parser.parse, '''f(){3||2.;}''') self.assertRaises(EParseTypeMismatch, self.parser.parse, '''f(){3.|2;}''') self.assertRaises(EParseTypeMismatch, self.parser.parse, '''f(){3|2.;}''') self.assertRaises(EParseTypeMismatch, self.parser.parse, '''f(){3.&2;}''') self.assertRaises(EParseTypeMismatch, self.parser.parse, '''f(){3&2.;}''') self.assertRaises(EParseTypeMismatch, self.parser.parse, '''f(){3.^2;}''') self.assertRaises(EParseTypeMismatch, self.parser.parse, '''f(){3^2.;}''') self.assertRaises(EParseTypeMismatch, self.parser.parse, '''f(){f()!=2;}''') self.assertRaises(EParseTypeMismatch, self.parser.parse, '''f(){2!=f();}''') self.assertRaises(EParseTypeMismatch, self.parser.parse, '''f(){3.<"";}''') self.assertRaises(EParseTypeMismatch, self.parser.parse, '''f(){""<"".;}''') self.assertRaises(EParseTypeMismatch, self.parser.parse, '''f(){3.<<2;}''') self.assertRaises(EParseTypeMismatch, self.parser.parse, '''f(){3>>2.;}''') self.assertRaises(EParseTypeMismatch, self.parser.parse, '''f(){""-(key)"";}''') self.assertRaises(EParseTypeMismatch, self.parser.parse, '''f(){""+f();}''') self.assertRaises(EParseTypeMismatch, self.parser.parse, '''f(){""+(key)"";}''') self.assertRaises(EParseTypeMismatch, self.parser.parse, '''f(){(key)""+"";}''') self.assertRaises(EParseTypeMismatch, self.parser.parse, '''f(){(key)""+(key)"";}''') self.assertRaises(EParseTypeMismatch, self.parser.parse, '''f(){key k;k+k;}''') self.assertRaises(EParseTypeMismatch, self.parser.parse, '''f(){3/<1,2,3>;}''') self.assertRaises(EParseTypeMismatch, self.parser.parse, '''f(){3/<1,2,3,4>;}''') self.assertRaises(EParseTypeMismatch, self.parser.parse, '''f(){""*3;}''') self.assertRaises(EParseTypeMismatch, self.parser.parse, '''f(){""%4;}''') self.assertRaises(EParseTypeMismatch, self.parser.parse, '''f(){3%<2,3,4>;}''') self.assertRaises(EParseTypeMismatch, self.parser.parse, '''f(){""%4;}''') self.assertRaises(EParseTypeMismatch, self.parser.parse, '''f(){float i;i%=2;}''') self.assertRaises(EParseTypeMismatch, self.parser.parse, '''f(){float i;i&=2;}''', ['extendedassignment']) self.assertRaises(EParseTypeMismatch, self.parser.parse, '''f(){(vector)4;}''') self.assertRaises(EParseTypeMismatch, self.parser.parse, '''f(){key k;k+=k;}''') self.assertRaises(EParseTypeMismatch, self.parser.parse, '''f(){string i;i++;}''') self.assertRaises(EParseTypeMismatch, self.parser.parse, '''f(){string i;(i-=i);}''') self.assertRaises(EParseTypeMismatch, self.parser.parse, '''f(){string i;(i*=i);}''') self.assertRaises(EParseTypeMismatch, self.parser.parse, '''f(){string i;-i;}''') self.assertRaises(EParseTypeMismatch, self.parser.parse, '''f(){string i;~i;}''') self.assertRaises(EParseTypeMismatch, self.parser.parse, '''f(){string i;!i;}''') self.assertRaises(EParseTypeMismatch, self.parser.parse, '''f(){string i;++i;}''') self.assertRaises(EParseTypeMismatch, self.parser.parse, '''g(){integer k;k=g();}''') self.assertRaises(EParseTypeMismatch, self.parser.parse, '''g(){@x;x;}default{}state x{}''') self.assertRaises(EParseTypeMismatch, self.parser.parse, '''g(){print(g());}default{}state x{}''') self.assertRaises(EParseUndefined, self.parser.parse, '''g(){integer k;k();}''') self.assertRaises(EParseUndefined, self.parser.parse, '''g(){++x;}state x{}''') self.assertRaises(EParseUndefined, self.parser.parse, '''g(){print(x);}state x{}''') self.assertRaises(EParseUEOF, self.parser.parse, '''f(){(integer)''') self.assertRaises(EParseInvalidField, self.parser.parse, '''f(){vector v;v.s;}''') self.assertRaises(EParseDuplicateLabel, self.parser.parse, 'f(){@x;{@x;}}') self.assertRaises(EParseSyntax, self.parser.parse, '''f(){<1,2,3,4==5>;}''') self.assertRaises(EParseSyntax, self.parser.parse, '''#blah;\ndefault{timer(){}}''') self.assertRaises(EParseTypeMismatch, self.parser.parse, '''f(){<1,2,3,4>"">;}''') self.assertRaises(EParseTypeMismatch, self.parser.parse, '''f(){<1,2,3,"">"">;}''') self.assertRaises(EParseTypeMismatch, self.parser.parse, '''f(){string i;(i&=i);}''', set(('extendedassignment'))) self.assertRaises(EParseUndefined, self.parser.parse, '''key a=b;key b;default{timer(){}}''', ['extendedglobalexpr']) # Force a list constant down its throat, to test coverage of LIST_VALUE self.parser.constants['LISTCONST']=[1,2,3] print self.outscript.output(self.parser.parse('default{timer(){LISTCONST;}}')) print self.outscript.output(self.parser.parse('''string s="1" "2";default{timer(){}}''', ['allowmultistrings'])) # the one below doesn't work because it uses extended global expr. print self.outscript.output(self.parser.parse(''' float f=2+2; #blah; string s = "1" "2"; list L = [(key)""]; default{timer(){ 1+([]+(integer)~1); list a; float f; a = 3; a += 3; f += 4; f += -4.3; integer i; i *= 1.3; i |= i; "a" "b" "c"; "a"+(key)"b"; (key)"a" + "b"; i>>=i; {@x;{@x;jump x;}jump x;} }}''', ['explicitcast','extendedtypecast','extendedassignment', 'extendedglobalexpr', 'allowmultistrings', 'allowkeyconcat', 'skippreproc', 'duplabels'] )) print self.parser.scopeindex #self.assertRaises(EParseUnexpected, self.parser.PopScope) self.assertEqual(fieldpos("a,b",",",3),-1) self.assertEqual(self.outscript.Value2LSL(lslfuncs.Key(u'')), '((key)"")') self.assertRaises(AssertionError, self.outscript.Value2LSL, '') def tearDown(self): del self.parser del self.outscript class Test03_Optimizer(UnitTestCase): def setUp(self): self.parser = parser() self.opt = optimizer() self.outscript = outscript() def test_coverage(self): p = self.parser.parse(''' float f=2+llAbs(-2); float g = f; string s = "1" "2"; list L = [(key)""]; list L1 = L; list L2 = [1,2,3,4,5,6.0]; list L3 = []; list L4 = [1,2,3,4,5,6.0,""]+[]; integer RemovesInt = 0; vector AddsVector; vector v=<1,2,f>; float ffff2 = v.x; vector vvvv = <1,2,llGetNumberOfSides()>; float ffff=vvvv.x; vector vvvv2=vvvv; float ffff3 = v.z; integer fn(){return fn();} default{touch(integer n){ 1+([]+(integer)~1); list a; float f; vector v=<1,2,f>;<1,2,3>;<1,2,3,4>;v.x; v-<0,0,0>;<0,0,0>-v;v+<0,0,0>;<0,0,0>+v; []+f; integer j = 3||4&&5|6^7&8.==9!=10.e+01f<11<=12>13.>=14<<15>>16==0&&3== ++f-f++-(3 + llFloor(f)<<3 << 32) - 2 - 0; integer k = 2 + (3 * 25 - 4)/2 % 9; a = 3; a += !3; f += 4; f += -4.3; integer i; i = llGetListLength(L); i *= -3.0; print(3+2); for(i=3,i;1;){} i |= !i; "a" "b" "c"; "a"+(key)"b"; (key)"a" + "b"; llUnescapeURL("%09"); i>>=i; if (1) do while (0); while (0); if (0); if (0);else; for(;0;); if (i) if (i); else ; while (i) ; do ; while (i); for(;i;); do while (1); while(1); for(;1;); for (i=0,i;0;);for(i=0,i=0;0;);return; (i-i)+(i-3)+(-i+i)+(-i-i)+(i+1)+(-i+1)+(i-1)+(-i-1)+(0.0+i); ((-i)+j);((-i)+i);i-2;-i-2;2-i; }}''', ['explicitcast','extendedtypecast','extendedassignment', 'extendedglobalexpr', 'allowmultistrings', 'allowkeyconcat'] ) self.opt.optimize(p) self.opt.optimize(p, ()) print self.outscript.output(p) p = self.parser.parse('''string s = llUnescapeURL("%09");default{timer(){float f=llSqrt(-1); integer i;-(-(0.0+i));!!(!~~(!(i)));[]+i;}}''', ['extendedtypecast','extendedassignment', 'extendedglobalexpr', 'allowmultistrings', 'allowkeyconcat'] ) self.opt.optimize(p, ['optimize','foldtabs']) print self.outscript.output(p) p = self.parser.parse( '''integer i1; integer i2; integer i3; integer i4; integer i5; string s1; string s2; string s3; string s4; string s5; f1(){jump x; @x;} f2(){integer i3; i4=0; s3=""; f1(); state another;} default { timer() { state another; } } state another { timer() { state default; } touch(integer num_det) {} } ''', ['optimize', 'shrinknames'] ) self.opt.optimize(p, ['optimize','shrinknames']) print self.outscript.output(p) p = self.parser.parse( '''integer i1; integer i2; integer i3; integer i4; integer i5; string a1; string a2; string a3; string a4; string a5; string b1; string b2; string b3; string b4; string b5; string c1; string c2; string c3; string c4; string c5; string d1; string d2; string d3; string d4; string d5; string e1; string e2; string e3; string e4; string e5; string f1; string f2; string f3; string f4; string f5; string g1; string g2; string g3; string g4; string g5; string h1; string h2; string h3; string h4; string h5; string j1; string j2; string j3; string j4; string j5; string k1; string k2; string k3; string k4; string k5; string l1; string l2; string l3; string l4; string l5; string m1; string m2; string m3; string m4; string m5; string n1; string n2; string n3; string n4; string n5; string o1; string o2; string o3; string o4; string o5; string p1; string p2; string p3; string p4; string p5; string s1; string s2; string s3; string s4; string s5; key k0000; key k0001; key k0002; key k0003; key k0004; key k0005; key k0006; key k0007; key k0008; key k0009; key k0010; key k0011; key k0012; key k0013; key k0014; key k0015; key k0016; key k0017; key k0018; key k0019; key k0020; key k0021; key k0022; key k0023; key k0024; key k0025; key k0026; key k0027; key k0028; key k0029; key k0030; key k0031; key k0032; key k0033; key k0034; key k0035; key k0036; key k0037; key k0038; key k0039; key k0040; key k0041; key k0042; key k0043; key k0044; key k0045; key k0046; key k0047; key k0048; key k0049; key k0050; key k0051; key k0052; key k0053; key k0054; key k0055; key k0056; key k0057; key k0058; key k0059; key k0060; key k0061; key k0062; key k0063; key k0064; key k0065; key k0066; key k0067; key k0068; key k0069; key k0070; key k0071; key k0072; key k0073; key k0074; key k0075; key k0076; key k0077; key k0078; key k0079; key k0080; key k0081; key k0082; key k0083; key k0084; key k0085; key k0086; key k0087; key k0088; key k0089; key k0090; key k0091; key k0092; key k0093; key k0094; key k0095; key k0096; key k0097; key k0098; key k0099; key k0100; key k0101; key k0102; key k0103; key k0104; key k0105; key k0106; key k0107; key k0108; key k0109; key k0110; key k0111; key k0112; key k0113; key k0114; key k0115; key k0116; key k0117; key k0118; key k0119; key k0120; key k0121; key k0122; key k0123; key k0124; key k0125; key k0126; key k0127; key k0128; key k0129; key k0130; key k0131; key k0132; key k0133; key k0134; key k0135; key k0136; key k0137; key k0138; key k0139; key k0140; key k0141; key k0142; key k0143; key k0144; key k0145; key k0146; key k0147; key k0148; key k0149; key k0150; key k0151; key k0152; key k0153; key k0154; key k0155; key k0156; key k0157; key k0158; key k0159; key k0160; key k0161; key k0162; key k0163; key k0164; key k0165; key k0166; key k0167; key k0168; key k0169; key k0170; key k0171; key k0172; key k0173; key k0174; key k0175; key k0176; key k0177; key k0178; key k0179; key k0180; key k0181; key k0182; key k0183; key k0184; key k0185; key k0186; key k0187; key k0188; key k0189; key k0190; key k0191; key k0192; key k0193; key k0194; key k0195; key k0196; key k0197; key k0198; key k0199; key k0200; key k0201; key k0202; key k0203; key k0204; key k0205; key k0206; key k0207; key k0208; key k0209; key k0210; key k0211; key k0212; key k0213; key k0214; key k0215; key k0216; key k0217; key k0218; key k0219; key k0220; key k0221; key k0222; key k0223; key k0224; key k0225; key k0226; key k0227; key k0228; key k0229; key k0230; key k0231; key k0232; key k0233; key k0234; key k0235; key k0236; key k0237; key k0238; key k0239; key k0240; key k0241; key k0242; key k0243; key k0244; key k0245; key k0246; key k0247; key k0248; key k0249; key k0250; key k0251; key k0252; key k0253; key k0254; key k0255; key k0256; key k0257; key k0258; key k0259; key k0260; key k0261; key k0262; key k0263; key k0264; key k0265; key k0266; key k0267; key k0268; key k0269; key k0270; key k0271; key k0272; key k0273; key k0274; key k0275; key k0276; key k0277; key k0278; key k0279; key k0280; key k0281; key k0282; key k0283; key k0284; key k0285; key k0286; key k0287; key k0288; key k0289; key k0290; key k0291; key k0292; key k0293; key k0294; key k0295; key k0296; key k0297; key k0298; key k0299; key k0300; key k0301; key k0302; key k0303; key k0304; key k0305; key k0306; key k0307; key k0308; key k0309; key k0310; key k0311; key k0312; key k0313; key k0314; key k0315; key k0316; key k0317; key k0318; key k0319; key k0320; key k0321; key k0322; key k0323; key k0324; key k0325; key k0326; key k0327; key k0328; key k0329; key k0330; key k0331; key k0332; key k0333; key k0334; key k0335; key k0336; key k0337; key k0338; key k0339; key k0340; key k0341; key k0342; key k0343; key k0344; key k0345; key k0346; key k0347; key k0348; key k0349; key k0350; key k0351; key k0352; key k0353; key k0354; key k0355; key k0356; key k0357; key k0358; key k0359; key k0360; key k0361; key k0362; key k0363; key k0364; key k0365; key k0366; key k0367; key k0368; key k0369; key k0370; key k0371; key k0372; key k0373; key k0374; key k0375; key k0376; key k0377; key k0378; key k0379; key k0380; key k0381; key k0382; key k0383; key k0384; key k0385; key k0386; key k0387; key k0388; key k0389; key k0390; key k0391; key k0392; key k0393; key k0394; key k0395; key k0396; key k0397; key k0398; key k0399; key k0400; key k0401; key k0402; key k0403; key k0404; key k0405; key k0406; key k0407; key k0408; key k0409; key k0410; key k0411; key k0412; key k0413; key k0414; key k0415; key k0416; key k0417; key k0418; key k0419; key k0420; key k0421; key k0422; key k0423; key k0424; key k0425; key k0426; key k0427; key k0428; key k0429; key k0430; key k0431; key k0432; key k0433; key k0434; key k0435; key k0436; key k0437; key k0438; key k0439; key k0440; key k0441; key k0442; key k0443; key k0444; key k0445; key k0446; key k0447; key k0448; key k0449; key k0450; key k0451; key k0452; key k0453; key k0454; key k0455; key k0456; key k0457; key k0458; key k0459; key k0460; key k0461; key k0462; key k0463; key k0464; key k0465; key k0466; key k0467; key k0468; key k0469; key k0470; key k0471; key k0472; key k0473; key k0474; key k0475; key k0476; key k0477; key k0478; key k0479; key k0480; key k0481; key k0482; key k0483; key k0484; key k0485; key k0486; key k0487; key k0488; key k0489; key k0490; key k0491; key k0492; key k0493; key k0494; key k0495; key k0496; key k0497; key k0498; key k0499; key k0500; key k0501; key k0502; key k0503; key k0504; key k0505; key k0506; key k0507; key k0508; key k0509; key k0510; key k0511; key k0512; key k0513; key k0514; key k0515; key k0516; key k0517; key k0518; key k0519; key k0520; key k0521; key k0522; key k0523; key k0524; key k0525; key k0526; key k0527; key k0528; key k0529; key k0530; key k0531; key k0532; key k0533; key k0534; key k0535; key k0536; key k0537; key k0538; key k0539; key k0540; key k0541; key k0542; key k0543; key k0544; key k0545; key k0546; key k0547; key k0548; key k0549; key k0550; key k0551; key k0552; key k0553; key k0554; key k0555; key k0556; key k0557; key k0558; key k0559; key k0560; key k0561; key k0562; key k0563; key k0564; key k0565; key k0566; key k0567; key k0568; key k0569; key k0570; key k0571; key k0572; key k0573; key k0574; key k0575; key k0576; key k0577; key k0578; key k0579; key k0580; key k0581; key k0582; key k0583; key k0584; key k0585; key k0586; key k0587; key k0588; key k0589; key k0590; key k0591; key k0592; key k0593; key k0594; key k0595; key k0596; key k0597; key k0598; key k0599; key k0600; key k0601; key k0602; key k0603; key k0604; key k0605; key k0606; key k0607; key k0608; key k0609; key k0610; key k0611; key k0612; key k0613; key k0614; key k0615; key k0616; key k0617; key k0618; key k0619; key k0620; key k0621; key k0622; key k0623; key k0624; key k0625; key k0626; key k0627; key k0628; key k0629; key k0630; key k0631; key k0632; key k0633; key k0634; key k0635; key k0636; key k0637; key k0638; key k0639; key k0640; key k0641; key k0642; key k0643; key k0644; key k0645; key k0646; key k0647; key k0648; key k0649; key k0650; key k0651; key k0652; key k0653; key k0654; key k0655; key k0656; key k0657; key k0658; key k0659; key k0660; key k0661; key k0662; key k0663; key k0664; key k0665; key k0666; key k0667; key k0668; key k0669; key k0670; key k0671; key k0672; key k0673; key k0674; key k0675; key k0676; key k0677; key k0678; key k0679; key k0680; key k0681; key k0682; key k0683; key k0684; key k0685; key k0686; key k0687; key k0688; key k0689; key k0690; key k0691; key k0692; key k0693; key k0694; key k0695; key k0696; key k0697; key k0698; key k0699; key k0700; key k0701; key k0702; key k0703; key k0704; key k0705; key k0706; key k0707; key k0708; key k0709; key k0710; key k0711; key k0712; key k0713; key k0714; key k0715; key k0716; key k0717; key k0718; key k0719; key k0720; key k0721; key k0722; key k0723; key k0724; key k0725; key k0726; key k0727; key k0728; key k0729; key k0730; key k0731; key k0732; key k0733; key k0734; key k0735; key k0736; key k0737; key k0738; key k0739; key k0740; key k0741; key k0742; key k0743; key k0744; key k0745; key k0746; key k0747; key k0748; key k0749; key k0750; key k0751; key k0752; key k0753; key k0754; key k0755; key k0756; key k0757; key k0758; key k0759; key k0760; key k0761; key k0762; key k0763; key k0764; key k0765; key k0766; key k0767; key k0768; key k0769; key k0770; key k0771; key k0772; key k0773; key k0774; key k0775; key k0776; key k0777; key k0778; key k0779; key k0780; key k0781; key k0782; key k0783; key k0784; key k0785; key k0786; key k0787; key k0788; key k0789; key k0790; key k0791; key k0792; key k0793; key k0794; key k0795; key k0796; key k0797; key k0798; key k0799; key k0800; key k0801; key k0802; key k0803; key k0804; key k0805; key k0806; key k0807; key k0808; key k0809; key k0810; key k0811; key k0812; key k0813; key k0814; key k0815; key k0816; key k0817; key k0818; key k0819; key k0820; key k0821; key k0822; key k0823; key k0824; key k0825; key k0826; key k0827; key k0828; key k0829; key k0830; key k0831; key k0832; key k0833; key k0834; key k0835; key k0836; key k0837; key k0838; key k0839; key k0840; key k0841; key k0842; key k0843; key k0844; key k0845; key k0846; key k0847; key k0848; key k0849; key k0850; key k0851; key k0852; key k0853; key k0854; key k0855; key k0856; key k0857; key k0858; key k0859; key k0860; key k0861; key k0862; key k0863; key k0864; key k0865; key k0866; key k0867; key k0868; key k0869; key k0870; key k0871; key k0872; key k0873; key k0874; key k0875; key k0876; key k0877; key k0878; key k0879; key k0880; key k0881; key k0882; key k0883; key k0884; key k0885; key k0886; key k0887; key k0888; key k0889; key k0890; key k0891; key k0892; key k0893; key k0894; key k0895; key k0896; key k0897; key k0898; key k0899; key k0900; key k0901; key k0902; key k0903; key k0904; key k0905; key k0906; key k0907; key k0908; key k0909; key k0910; key k0911; key k0912; key k0913; key k0914; key k0915; key k0916; key k0917; key k0918; key k0919; key k0920; key k0921; key k0922; key k0923; key k0924; key k0925; key k0926; key k0927; key k0928; key k0929; key k0930; key k0931; key k0932; key k0933; key k0934; key k0935; key k0936; key k0937; key k0938; key k0939; key k0940; key k0941; key k0942; key k0943; key k0944; key k0945; key k0946; key k0947; key k0948; key k0949; key k0950; key k0951; key k0952; key k0953; key k0954; key k0955; key k0956; key k0957; key k0958; key k0959; key k0960; key k0961; key k0962; key k0963; key k0964; key k0965; key k0966; key k0967; key k0968; key k0969; key k0970; key k0971; key k0972; key k0973; key k0974; key k0975; key k0976; key k0977; key k0978; key k0979; key k0980; key k0981; key k0982; key k0983; key k0984; key k0985; key k0986; key k0987; key k0988; key k0989; key k0990; key k0991; key k0992; key k0993; key k0994; key k0995; key k0996; key k0997; key k0998; key k0999; key k1000; key k1001; key k1002; key k1003; key k1004; key k1005; key k1006; key k1007; key k1008; key k1009; key k1010; key k1011; key k1012; key k1013; key k1014; key k1015; key k1016; key k1017; key k1018; key k1019; key k1020; key k1021; key k1022; key k1023; key k1024; key k1025; key k1026; key k1027; key k1028; key k1029; key k1030; key k1031; key k1032; key k1033; key k1034; key k1035; key k1036; key k1037; key k1038; key k1039; key k1040; key k1041; key k1042; key k1043; key k1044; key k1045; key k1046; key k1047; key k1048; key k1049; key k1050; key k1051; key k1052; key k1053; key k1054; key k1055; key k1056; key k1057; key k1058; key k1059; key k1060; key k1061; key k1062; key k1063; key k1064; key k1065; key k1066; key k1067; key k1068; key k1069; key k1070; key k1071; key k1072; key k1073; key k1074; key k1075; key k1076; key k1077; key k1078; key k1079; key k1080; key k1081; key k1082; key k1083; key k1084; key k1085; key k1086; key k1087; key k1088; key k1089; key k1090; key k1091; key k1092; key k1093; key k1094; key k1095; key k1096; key k1097; key k1098; key k1099; key k1100; key k1101; key k1102; key k1103; key k1104; key k1105; key k1106; key k1107; key k1108; key k1109; key k1110; key k1111; key k1112; key k1113; key k1114; key k1115; key k1116; key k1117; key k1118; key k1119; key k1120; key k1121; key k1122; key k1123; key k1124; key k1125; key k1126; key k1127; key k1128; key k1129; key k1130; key k1131; key k1132; key k1133; key k1134; key k1135; key k1136; key k1137; key k1138; key k1139; key k1140; key k1141; key k1142; key k1143; key k1144; key k1145; key k1146; key k1147; key k1148; key k1149; key k1150; key k1151; key k1152; key k1153; key k1154; key k1155; key k1156; key k1157; key k1158; key k1159; key k1160; key k1161; key k1162; key k1163; key k1164; key k1165; key k1166; key k1167; key k1168; key k1169; key k1170; key k1171; key k1172; key k1173; key k1174; key k1175; key k1176; key k1177; key k1178; key k1179; key k1180; key k1181; key k1182; key k1183; key k1184; key k1185; key k1186; key k1187; key k1188; key k1189; key k1190; key k1191; key k1192; key k1193; key k1194; key k1195; key k1196; key k1197; key k1198; key k1199; key k1200; key k1201; key k1202; key k1203; key k1204; key k1205; key k1206; key k1207; key k1208; key k1209; key k1210; key k1211; key k1212; key k1213; key k1214; key k1215; key k1216; key k1217; key k1218; key k1219; key k1220; key k1221; key k1222; key k1223; key k1224; key k1225; key k1226; key k1227; key k1228; key k1229; key k1230; key k1231; key k1232; key k1233; key k1234; key k1235; key k1236; key k1237; key k1238; key k1239; key k1240; key k1241; key k1242; key k1243; key k1244; key k1245; key k1246; key k1247; key k1248; key k1249; key k1250; key k1251; key k1252; key k1253; key k1254; key k1255; key k1256; key k1257; key k1258; key k1259; key k1260; key k1261; key k1262; key k1263; key k1264; key k1265; key k1266; key k1267; key k1268; key k1269; key k1270; key k1271; key k1272; key k1273; key k1274; key k1275; key k1276; key k1277; key k1278; key k1279; key k1280; key k1281; key k1282; key k1283; key k1284; key k1285; key k1286; key k1287; key k1288; key k1289; key k1290; key k1291; key k1292; key k1293; key k1294; key k1295; key k1296; key k1297; key k1298; key k1299; key k1300; key k1301; key k1302; key k1303; key k1304; key k1305; key k1306; key k1307; key k1308; key k1309; key k1310; key k1311; key k1312; key k1313; key k1314; key k1315; key k1316; key k1317; key k1318; key k1319; key k1320; key k1321; key k1322; key k1323; key k1324; key k1325; key k1326; key k1327; key k1328; key k1329; key k1330; key k1331; key k1332; key k1333; key k1334; key k1335; key k1336; key k1337; key k1338; key k1339; key k1340; key k1341; key k1342; key k1343; key k1344; key k1345; key k1346; key k1347; key k1348; key k1349; key k1350; key k1351; key k1352; key k1353; key k1354; key k1355; key k1356; key k1357; key k1358; key k1359; key k1360; key k1361; key k1362; key k1363; key k1364; key k1365; key k1366; key k1367; key k1368; key k1369; key k1370; key k1371; key k1372; key k1373; key k1374; key k1375; key k1376; key k1377; key k1378; key k1379; key k1380; key k1381; key k1382; key k1383; key k1384; key k1385; key k1386; key k1387; key k1388; key k1389; key k1390; key k1391; key k1392; key k1393; key k1394; key k1395; key k1396; key k1397; key k1398; key k1399; key k1400; key k1401; key k1402; key k1403; key k1404; key k1405; key k1406; key k1407; key k1408; key k1409; key k1410; key k1411; key k1412; key k1413; key k1414; key k1415; key k1416; key k1417; key k1418; key k1419; key k1420; key k1421; key k1422; key k1423; key k1424; key k1425; key k1426; key k1427; key k1428; key k1429; key k1430; key k1431; key k1432; key k1433; key k1434; key k1435; key k1436; key k1437; key k1438; key k1439; key k1440; key k1441; key k1442; key k1443; key k1444; key k1445; key k1446; key k1447; key k1448; key k1449; key k1450; key k1451; key k1452; key k1453; key k1454; key k1455; key k1456; key k1457; key k1458; key k1459; key k1460; key k1461; key k1462; key k1463; key k1464; key k1465; key k1466; key k1467; key k1468; key k1469; key k1470; key k1471; key k1472; key k1473; key k1474; key k1475; key k1476; key k1477; key k1478; key k1479; key k1480; key k1481; key k1482; key k1483; key k1484; key k1485; key k1486; key k1487; key k1488; key k1489; key k1490; key k1491; key k1492; key k1493; key k1494; key k1495; key k1496; key k1497; key k1498; key k1499; key k1500; key k1501; key k1502; key k1503; key k1504; key k1505; key k1506; key k1507; key k1508; key k1509; key k1510; key k1511; key k1512; key k1513; key k1514; key k1515; key k1516; key k1517; key k1518; key k1519; key k1520; key k1521; key k1522; key k1523; key k1524; key k1525; key k1526; key k1527; key k1528; key k1529; key k1530; key k1531; key k1532; key k1533; key k1534; key k1535; key k1536; key k1537; key k1538; key k1539; key k1540; key k1541; key k1542; key k1543; key k1544; key k1545; key k1546; key k1547; key k1548; key k1549; key k1550; key k1551; key k1552; key k1553; key k1554; key k1555; key k1556; key k1557; key k1558; key k1559; key k1560; key k1561; key k1562; key k1563; key k1564; key k1565; key k1566; key k1567; key k1568; key k1569; key k1570; key k1571; key k1572; key k1573; key k1574; key k1575; key k1576; key k1577; key k1578; key k1579; key k1580; key k1581; key k1582; key k1583; key k1584; key k1585; key k1586; key k1587; key k1588; key k1589; key k1590; key k1591; key k1592; key k1593; key k1594; key k1595; key k1596; key k1597; key k1598; key k1599; key k1600; key k1601; key k1602; key k1603; key k1604; key k1605; key k1606; key k1607; key k1608; key k1609; key k1610; key k1611; key k1612; key k1613; key k1614; key k1615; key k1616; key k1617; key k1618; key k1619; key k1620; key k1621; key k1622; key k1623; key k1624; key k1625; key k1626; key k1627; key k1628; key k1629; key k1630; key k1631; key k1632; key k1633; key k1634; key k1635; key k1636; key k1637; key k1638; key k1639; key k1640; key k1641; key k1642; key k1643; key k1644; key k1645; key k1646; key k1647; key k1648; key k1649; key k1650; key k1651; key k1652; key k1653; key k1654; key k1655; key k1656; key k1657; key k1658; key k1659; key k1660; key k1661; key k1662; key k1663; key k1664; key k1665; key k1666; key k1667; key k1668; key k1669; key k1670; key k1671; key k1672; key k1673; key k1674; key k1675; key k1676; key k1677; key k1678; key k1679; key k1680; key k1681; key k1682; key k1683; key k1684; key k1685; key k1686; key k1687; key k1688; key k1689; key k1690; key k1691; key k1692; key k1693; key k1694; key k1695; key k1696; key k1697; key k1698; key k1699; key k1700; key k1701; key k1702; key k1703; key k1704; key k1705; key k1706; key k1707; key k1708; key k1709; key k1710; key k1711; key k1712; key k1713; key k1714; key k1715; key k1716; key k1717; key k1718; key k1719; key k1720; key k1721; key k1722; key k1723; key k1724; key k1725; key k1726; key k1727; key k1728; key k1729; key k1730; key k1731; key k1732; key k1733; key k1734; key k1735; key k1736; key k1737; key k1738; key k1739; key k1740; key k1741; key k1742; key k1743; key k1744; key k1745; key k1746; key k1747; key k1748; key k1749; key k1750; key k1751; key k1752; key k1753; key k1754; key k1755; key k1756; key k1757; key k1758; key k1759; key k1760; key k1761; key k1762; key k1763; key k1764; key k1765; key k1766; key k1767; key k1768; key k1769; key k1770; key k1771; key k1772; key k1773; key k1774; key k1775; key k1776; key k1777; key k1778; key k1779; key k1780; key k1781; key k1782; key k1783; key k1784; key k1785; key k1786; key k1787; key k1788; key k1789; key k1790; key k1791; key k1792; key k1793; key k1794; key k1795; key k1796; key k1797; key k1798; key k1799; key k1800; key k1801; key k1802; key k1803; key k1804; key k1805; key k1806; key k1807; key k1808; key k1809; key k1810; key k1811; key k1812; key k1813; key k1814; key k1815; key k1816; key k1817; key k1818; key k1819; key k1820; key k1821; key k1822; key k1823; key k1824; key k1825; key k1826; key k1827; key k1828; key k1829; key k1830; key k1831; key k1832; key k1833; key k1834; key k1835; key k1836; key k1837; key k1838; key k1839; key k1840; key k1841; key k1842; key k1843; key k1844; key k1845; key k1846; key k1847; key k1848; key k1849; key k1850; key k1851; key k1852; key k1853; key k1854; key k1855; key k1856; key k1857; key k1858; key k1859; key k1860; key k1861; key k1862; key k1863; key k1864; key k1865; key k1866; key k1867; key k1868; key k1869; key k1870; key k1871; key k1872; key k1873; key k1874; key k1875; key k1876; key k1877; key k1878; key k1879; key k1880; key k1881; key k1882; key k1883; key k1884; key k1885; key k1886; key k1887; key k1888; key k1889; key k1890; key k1891; key k1892; key k1893; key k1894; key k1895; key k1896; key k1897; key k1898; key k1899; key k1900; key k1901; key k1902; key k1903; key k1904; key k1905; key k1906; key k1907; key k1908; key k1909; key k1910; key k1911; key k1912; key k1913; key k1914; key k1915; key k1916; key k1917; key k1918; key k1919; key k1920; key k1921; key k1922; key k1923; key k1924; key k1925; key k1926; key k1927; key k1928; key k1929; key k1930; key k1931; key k1932; key k1933; key k1934; key k1935; key k1936; key k1937; key k1938; key k1939; key k1940; key k1941; key k1942; key k1943; key k1944; key k1945; key k1946; key k1947; key k1948; key k1949; key k1950; key k1951; key k1952; key k1953; key k1954; key k1955; key k1956; key k1957; key k1958; key k1959; key k1960; key k1961; key k1962; key k1963; key k1964; key k1965; key k1966; key k1967; key k1968; key k1969; key k1970; key k1971; key k1972; key k1973; key k1974; key k1975; key k1976; key k1977; key k1978; key k1979; key k1980; key k1981; key k1982; key k1983; key k1984; key k1985; key k1986; key k1987; key k1988; key k1989; key k1990; key k1991; key k1992; key k1993; key k1994; key k1995; key k1996; key k1997; key k1998; key k1999; key k2000; key k2001; key k2002; key k2003; key k2004; key k2005; key k2006; key k2007; key k2008; key k2009; key k2010; key k2011; key k2012; key k2013; key k2014; key k2015; key k2016; key k2017; key k2018; key k2019; key k2020; key k2021; key k2022; key k2023; key k2024; key k2025; key k2026; key k2027; key k2028; key k2029; key k2030; key k2031; key k2032; key k2033; key k2034; key k2035; key k2036; key k2037; key k2038; key k2039; key k2040; key k2041; key k2042; key k2043; key k2044; key k2045; key k2046; key k2047; key k2048; key k2049; key k2050; key k2051; key k2052; key k2053; key k2054; key k2055; key k2056; key k2057; key k2058; key k2059; key k2060; key k2061; key k2062; key k2063; key k2064; key k2065; key k2066; key k2067; key k2068; key k2069; key k2070; key k2071; key k2072; key k2073; key k2074; key k2075; key k2076; key k2077; key k2078; key k2079; key k2080; key k2081; key k2082; key k2083; key k2084; key k2085; key k2086; key k2087; key k2088; key k2089; key k2090; key k2091; key k2092; key k2093; key k2094; key k2095; key k2096; key k2097; key k2098; key k2099; key k2100; key k2101; key k2102; key k2103; key k2104; key k2105; key k2106; key k2107; key k2108; key k2109; key k2110; key k2111; key k2112; key k2113; key k2114; key k2115; key k2116; key k2117; key k2118; key k2119; key k2120; key k2121; key k2122; key k2123; key k2124; key k2125; key k2126; key k2127; key k2128; key k2129; key k2130; key k2131; key k2132; key k2133; key k2134; key k2135; key k2136; key k2137; key k2138; key k2139; key k2140; key k2141; key k2142; key k2143; key k2144; key k2145; key k2146; key k2147; key k2148; key k2149; key k2150; key k2151; key k2152; key k2153; key k2154; key k2155; key k2156; key k2157; key k2158; key k2159; key k2160; key k2161; key k2162; key k2163; key k2164; key k2165; key k2166; key k2167; key k2168; key k2169; key k2170; key k2171; key k2172; key k2173; key k2174; key k2175; key k2176; key k2177; key k2178; key k2179; key k2180; key k2181; key k2182; key k2183; key k2184; key k2185; key k2186; key k2187; key k2188; key k2189; key k2190; key k2191; key k2192; key k2193; key k2194; key k2195; key k2196; key k2197; key k2198; key k2199; key k2200; key k2201; key k2202; key k2203; key k2204; key k2205; key k2206; key k2207; key k2208; key k2209; key k2210; key k2211; key k2212; key k2213; key k2214; key k2215; key k2216; key k2217; key k2218; key k2219; key k2220; key k2221; key k2222; key k2223; key k2224; key k2225; key k2226; key k2227; key k2228; key k2229; key k2230; key k2231; key k2232; key k2233; key k2234; key k2235; key k2236; key k2237; key k2238; key k2239; key k2240; key k2241; key k2242; key k2243; key k2244; key k2245; key k2246; key k2247; key k2248; key k2249; key k2250; key k2251; key k2252; key k2253; key k2254; key k2255; key k2256; key k2257; key k2258; key k2259; key k2260; key k2261; key k2262; key k2263; key k2264; key k2265; key k2266; key k2267; key k2268; key k2269; key k2270; key k2271; key k2272; key k2273; key k2274; key k2275; key k2276; key k2277; key k2278; key k2279; key k2280; key k2281; key k2282; key k2283; key k2284; key k2285; key k2286; key k2287; key k2288; key k2289; key k2290; key k2291; key k2292; key k2293; key k2294; key k2295; key k2296; key k2297; key k2298; key k2299; key k2300; key k2301; key k2302; key k2303; key k2304; key k2305; key k2306; key k2307; key k2308; key k2309; key k2310; key k2311; key k2312; key k2313; key k2314; key k2315; key k2316; key k2317; key k2318; key k2319; key k2320; key k2321; key k2322; key k2323; key k2324; key k2325; key k2326; key k2327; key k2328; key k2329; key k2330; key k2331; key k2332; key k2333; key k2334; key k2335; key k2336; key k2337; key k2338; key k2339; key k2340; key k2341; key k2342; key k2343; key k2344; key k2345; key k2346; key k2347; key k2348; key k2349; key k2350; key k2351; key k2352; key k2353; key k2354; key k2355; key k2356; key k2357; key k2358; key k2359; key k2360; key k2361; key k2362; key k2363; key k2364; key k2365; key k2366; key k2367; key k2368; key k2369; key k2370; key k2371; key k2372; key k2373; key k2374; key k2375; key k2376; key k2377; key k2378; key k2379; key k2380; key k2381; key k2382; key k2383; key k2384; key k2385; key k2386; key k2387; key k2388; key k2389; key k2390; key k2391; key k2392; key k2393; key k2394; key k2395; key k2396; key k2397; key k2398; key k2399; key k2400; key k2401; key k2402; key k2403; key k2404; key k2405; key k2406; key k2407; key k2408; key k2409; key k2410; key k2411; key k2412; key k2413; key k2414; key k2415; key k2416; key k2417; key k2418; key k2419; key k2420; key k2421; key k2422; key k2423; key k2424; key k2425; key k2426; key k2427; key k2428; key k2429; key k2430; key k2431; key k2432; key k2433; key k2434; key k2435; key k2436; key k2437; key k2438; key k2439; key k2440; key k2441; key k2442; key k2443; key k2444; key k2445; key k2446; key k2447; key k2448; key k2449; key k2450; key k2451; key k2452; key k2453; key k2454; key k2455; key k2456; key k2457; key k2458; key k2459; key k2460; key k2461; key k2462; key k2463; key k2464; key k2465; key k2466; key k2467; key k2468; key k2469; key k2470; key k2471; key k2472; key k2473; key k2474; key k2475; key k2476; key k2477; key k2478; key k2479; key k2480; key k2481; key k2482; key k2483; key k2484; key k2485; key k2486; key k2487; key k2488; key k2489; key k2490; key k2491; key k2492; key k2493; key k2494; key k2495; key k2496; key k2497; key k2498; key k2499; key k2500; key k2501; key k2502; key k2503; key k2504; key k2505; key k2506; key k2507; key k2508; key k2509; key k2510; key k2511; key k2512; key k2513; key k2514; key k2515; key k2516; key k2517; key k2518; key k2519; key k2520; key k2521; key k2522; key k2523; key k2524; key k2525; key k2526; key k2527; key k2528; key k2529; key k2530; key k2531; key k2532; key k2533; key k2534; key k2535; key k2536; key k2537; key k2538; key k2539; key k2540; key k2541; key k2542; key k2543; key k2544; key k2545; key k2546; key k2547; key k2548; key k2549; key k2550; key k2551; key k2552; key k2553; key k2554; key k2555; key k2556; key k2557; key k2558; key k2559; key k2560; key k2561; key k2562; key k2563; key k2564; key k2565; key k2566; key k2567; key k2568; key k2569; key k2570; key k2571; key k2572; key k2573; key k2574; key k2575; key k2576; key k2577; key k2578; key k2579; key k2580; key k2581; key k2582; key k2583; key k2584; key k2585; key k2586; key k2587; key k2588; key k2589; key k2590; key k2591; key k2592; key k2593; key k2594; key k2595; key k2596; key k2597; key k2598; key k2599; key k2600; key k2601; key k2602; key k2603; key k2604; key k2605; key k2606; key k2607; key k2608; key k2609; key k2610; key k2611; key k2612; key k2613; key k2614; key k2615; key k2616; key k2617; key k2618; key k2619; key k2620; key k2621; key k2622; key k2623; key k2624; key k2625; key k2626; key k2627; key k2628; key k2629; key k2630; key k2631; key k2632; key k2633; key k2634; key k2635; key k2636; key k2637; key k2638; key k2639; key k2640; key k2641; key k2642; key k2643; key k2644; key k2645; key k2646; key k2647; key k2648; key k2649; key k2650; key k2651; key k2652; key k2653; key k2654; key k2655; key k2656; key k2657; key k2658; key k2659; key k2660; key k2661; key k2662; key k2663; key k2664; key k2665; key k2666; key k2667; key k2668; key k2669; key k2670; key k2671; key k2672; key k2673; key k2674; key k2675; key k2676; key k2677; key k2678; key k2679; key k2680; key k2681; key k2682; key k2683; key k2684; key k2685; key k2686; key k2687; key k2688; key k2689; key k2690; key k2691; key k2692; key k2693; key k2694; key k2695; key k2696; key k2697; key k2698; key k2699; key k2700; key k2701; key k2702; key k2703; key k2704; key k2705; key k2706; key k2707; key k2708; key k2709; key k2710; key k2711; key k2712; key k2713; key k2714; key k2715; key k2716; key k2717; key k2718; key k2719; key k2720; key k2721; key k2722; key k2723; key k2724; key k2725; key k2726; key k2727; key k2728; key k2729; key k2730; key k2731; key k2732; key k2733; key k2734; key k2735; key k2736; key k2737; key k2738; key k2739; key k2740; key k2741; key k2742; key k2743; key k2744; key k2745; key k2746; key k2747; key k2748; key k2749; key k2750; key k2751; key k2752; key k2753; key k2754; key k2755; key k2756; key k2757; key k2758; key k2759; key k2760; key k2761; key k2762; key k2763; key k2764; key k2765; key k2766; key k2767; key k2768; key k2769; key k2770; key k2771; key k2772; key k2773; key k2774; key k2775; key k2776; key k2777; key k2778; key k2779; key k2780; key k2781; key k2782; key k2783; key k2784; key k2785; key k2786; key k2787; key k2788; key k2789; key k2790; key k2791; key k2792; key k2793; key k2794; key k2795; key k2796; key k2797; key k2798; key k2799; key k2800; key k2801; key k2802; key k2803; key k2804; key k2805; key k2806; key k2807; key k2808; key k2809; key k2810; key k2811; key k2812; key k2813; key k2814; key k2815; key k2816; key k2817; key k2818; key k2819; key k2820; key k2821; key k2822; key k2823; key k2824; key k2825; key k2826; key k2827; key k2828; key k2829; key k2830; key k2831; key k2832; key k2833; key k2834; key k2835; key k2836; key k2837; key k2838; key k2839; key k2840; key k2841; key k2842; key k2843; key k2844; key k2845; key k2846; key k2847; key k2848; key k2849; key k2850; key k2851; key k2852; key k2853; key k2854; key k2855; key k2856; key k2857; key k2858; key k2859; key k2860; key k2861; key k2862; key k2863; key k2864; key k2865; key k2866; key k2867; key k2868; key k2869; key k2870; key k2871; key k2872; key k2873; key k2874; key k2875; key k2876; key k2877; key k2878; key k2879; key k2880; key k2881; key k2882; key k2883; key k2884; key k2885; key k2886; key k2887; key k2888; key k2889; key k2890; key k2891; key k2892; key k2893; key k2894; key k2895; key k2896; key k2897; key k2898; key k2899; key k2900; key k2901; key k2902; key k2903; key k2904; key k2905; key k2906; key k2907; key k2908; key k2909; key k2910; key k2911; key k2912; key k2913; key k2914; key k2915; key k2916; key k2917; key k2918; key k2919; key k2920; key k2921; key k2922; key k2923; key k2924; key k2925; key k2926; key k2927; key k2928; key k2929; key k2930; key k2931; key k2932; key k2933; key k2934; key k2935; key k2936; key k2937; key k2938; key k2939; key k2940; key k2941; key k2942; key k2943; key k2944; key k2945; key k2946; key k2947; key k2948; key k2949; key k2950; key k2951; key k2952; key k2953; key k2954; key k2955; key k2956; key k2957; key k2958; key k2959; key k2960; key k2961; key k2962; key k2963; key k2964; key k2965; key k2966; key k2967; key k2968; key k2969; key k2970; key k2971; key k2972; key k2973; key k2974; key k2975; key k2976; key k2977; key k2978; key k2979; key k2980; key k2981; key k2982; key k2983; key k2984; key k2985; key k2986; key k2987; key k2988; key k2989; key k2990; key k2991; key k2992; key k2993; key k2994; key k2995; key k2996; key k2997; key k2998; key k2999; key k3000; key k3001; key k3002; key k3003; key k3004; key k3005; key k3006; key k3007; key k3008; key k3009; key k3010; key k3011; key k3012; key k3013; key k3014; key k3015; key k3016; key k3017; key k3018; key k3019; key k3020; key k3021; key k3022; key k3023; key k3024; key k3025; key k3026; key k3027; key k3028; key k3029; key k3030; key k3031; key k3032; key k3033; key k3034; key k3035; key k3036; key k3037; key k3038; key k3039; key k3040; key k3041; key k3042; key k3043; key k3044; key k3045; key k3046; key k3047; key k3048; key k3049; key k3050; key k3051; key k3052; key k3053; key k3054; key k3055; key k3056; key k3057; key k3058; key k3059; key k3060; key k3061; key k3062; key k3063; key k3064; key k3065; key k3066; key k3067; key k3068; key k3069; key k3070; key k3071; key k3072; key k3073; key k3074; key k3075; key k3076; key k3077; key k3078; key k3079; key k3080; key k3081; key k3082; key k3083; key k3084; key k3085; key k3086; key k3087; key k3088; key k3089; key k3090; key k3091; key k3092; key k3093; key k3094; key k3095; key k3096; key k3097; key k3098; key k3099; key k3100; key k3101; key k3102; key k3103; key k3104; key k3105; key k3106; key k3107; key k3108; key k3109; key k3110; key k3111; key k3112; key k3113; key k3114; key k3115; key k3116; key k3117; key k3118; key k3119; key k3120; key k3121; key k3122; key k3123; key k3124; key k3125; key k3126; key k3127; key k3128; key k3129; key k3130; key k3131; key k3132; key k3133; key k3134; key k3135; key k3136; key k3137; key k3138; key k3139; key k3140; key k3141; key k3142; key k3143; key k3144; key k3145; key k3146; key k3147; key k3148; key k3149; key k3150; key k3151; key k3152; key k3153; key k3154; key k3155; key k3156; key k3157; key k3158; key k3159; key k3160; key k3161; key k3162; key k3163; key k3164; key k3165; key k3166; key k3167; key k3168; key k3169; key k3170; key k3171; key k3172; key k3173; key k3174; key k3175; key k3176; key k3177; key k3178; key k3179; key k3180; key k3181; key k3182; key k3183; key k3184; key k3185; key k3186; key k3187; key k3188; key k3189; key k3190; key k3191; key k3192; key k3193; key k3194; key k3195; key k3196; key k3197; key k3198; key k3199; key k3200; key k3201; key k3202; key k3203; key k3204; key k3205; key k3206; key k3207; key k3208; key k3209; key k3210; key k3211; key k3212; key k3213; key k3214; key k3215; key k3216; key k3217; key k3218; key k3219; key k3220; key k3221; key k3222; key k3223; key k3224; key k3225; key k3226; key k3227; key k3228; key k3229; key k3230; key k3231; key k3232; key k3233; key k3234; key k3235; key k3236; key k3237; key k3238; key k3239; key k3240; key k3241; key k3242; key k3243; key k3244; key k3245; key k3246; key k3247; key k3248; key k3249; key k3250; key k3251; key k3252; key k3253; key k3254; key k3255; key k3256; key k3257; key k3258; key k3259; key k3260; key k3261; key k3262; key k3263; key k3264; key k3265; key k3266; key k3267; key k3268; key k3269; key k3270; key k3271; key k3272; key k3273; key k3274; key k3275; key k3276; key k3277; key k3278; key k3279; key k3280; key k3281; key k3282; key k3283; key k3284; key k3285; key k3286; key k3287; key k3288; key k3289; key k3290; key k3291; key k3292; key k3293; key k3294; key k3295; key k3296; key k3297; key k3298; key k3299; key k3300; key k3301; key k3302; key k3303; key k3304; key k3305; key k3306; key k3307; key k3308; key k3309; key k3310; key k3311; key k3312; key k3313; key k3314; key k3315; key k3316; key k3317; key k3318; key k3319; key k3320; key k3321; key k3322; key k3323; key k3324; key k3325; key k3326; key k3327; key k3328; key k3329; key k3330; key k3331; key k3332; key k3333; key k3334; key k3335; key k3336; key k3337; key k3338; key k3339; key k3340; key k3341; key k3342; key k3343; key k3344; key k3345; key k3346; key k3347; key k3348; key k3349; key k3350; key k3351; key k3352; key k3353; key k3354; key k3355; key k3356; key k3357; key k3358; key k3359; key k3360; key k3361; key k3362; key k3363; key k3364; key k3365; key k3366; key k3367; key k3368; key k3369; key k3370; key k3371; key k3372; key k3373; key k3374; key k3375; key k3376; key k3377; key k3378; key k3379; key k3380; key k3381; key k3382; key k3383; key k3384; key k3385; key k3386; key k3387; key k3388; key k3389; key k3390; key k3391; key k3392; key k3393; key k3394; key k3395; key k3396; key k3397; key k3398; key k3399; fn1(){jump x; @x;} fn2(){integer i3; i4=0; s3=""; fn1(); state another;} default { timer() { state another; } state_exit() {} } state another { timer() { state default; } touch(integer num_det) {} } ''', ['optimize', 'shrinknames'] ) self.opt.optimize(p, ['optimize','shrinknames']) print self.outscript.output(p) p = self.parser.parse( '''integer i1; integer i2; f(integer a, integer b, integer c, integer d, integer e){} default{timer(){}} ''', ['optimize', 'shrinknames'] ) self.opt.optimize(p, ['optimize','shrinknames']) print self.outscript.output(p) def test_regression(self): p = self.parser.parse(''' integer a; x() { if (1) { string s = "x"; s = s + (string)a; } } default { timer() { } } ''', ['extendedassignment']) self.opt.optimize(p) out = self.outscript.output(p) self.assertEqual(out, 'integer a;\nx()\n{\n {\n ' 'string s = "x";\n s = s + (string)a;\n }\n}\n' 'default\n{\n timer()\n {\n }\n}\n' ) p = self.parser.parse( '''key k = "blah"; list L = [k, "xxxx", 1.0]; float f; integer i = 0; vector v = ; default{timer(){}} ''', ['extendedassignment']) self.opt.optimize(p) out = self.outscript.output(p) self.assertEqual(out, 'key k = "blah";\nlist L = [k, "xxxx", 1.];\n' 'float f = 0;\ninteger i;\nvector v = <0, 3, 4>;\n' 'default\n{\n timer()\n {\n }\n}\n' ) p = self.parser.parse('list L;float f=llList2Float(L, 0);default{timer(){}}', ['extendedglobalexpr']) self.opt.optimize(p) out = self.outscript.output(p) print out self.assertEqual(out, 'list L;\nfloat f = 0;\n' 'default\n{\n timer()\n {\n }\n}\n') self.assertRaises(EParseAlreadyDefined, self.parser.parse, 'default { timer() {} timer() {} }') def tearDown(self): del self.parser del self.opt del self.outscript if __name__ == '__main__': unittest.main()