[
  {
    "path": "bin/build.bat",
    "content": "@echo off\r\nrpp.exe example\\run.h %1 -build"
  },
  {
    "path": "bin/build_run.bat",
    "content": "@echo off\r\nrem cd /d %~dp0\r\nrpp.exe example\\run.h %1"
  },
  {
    "path": "bin/check_all.bat",
    "content": "rjit example\\check.h"
  },
  {
    "path": "bin/compile_speed.bat",
    "content": "rpp example\\compile_speed.h\r\npause"
  },
  {
    "path": "bin/example/11_4.h",
    "content": "﻿\r\nvoid main()\r\n{\r\n\tputsl(XC_SY_DEFAULT)\t\r\n\tputsl(test())\r\n\tputsl(test2())\r\n}\r\n\r\nmac test() 123\r\n\r\nmac test2()\r\n{\r\n\t234\r\n}\r\n\r\nmac XC_SY_DEFAULT \r\n{\r\n\t(1+\r\n\t 2+\r\n\t 3)\r\n}"
  },
  {
    "path": "bin/example/11_5.h",
    "content": "﻿\r\nvoid main()\r\n{\r\n\tB 1 2\r\n\tC 1 [2 *3]\r\n\tC 1 [2*3*4]\r\n\tD 1 [2 3]\r\n\t\r\n\tv=array<int>[7,8,9]\r\n\tv.join('').printl\r\n\t\r\n\tv=E(1,2,3)\r\n\tv.join('').printl\r\n\t\r\n\tv=E(1,2,3,4)\r\n\tv.join('').printl\r\n}\r\n\r\nmac$ B _word _word\r\n{\r\n\trf.printl($0##$1)\r\n}\r\n\r\nmac$ C _word [ _mword ]\r\n{\r\n\tputsl($0+$1)\r\n}\r\n\r\nmac$ D _word [ _mword ]\r\n{\r\n\tputsl($0+$1=>0+$1=>1)\r\n}\r\n\r\nmac$ E ( _mword )\r\n{\r\n\tarray<int>[$0]\r\n}"
  },
  {
    "path": "bin/example/11_6.h",
    "content": "﻿\r\nvoid main()\r\n{\t\r\n\t==> 2 3 <==\r\n\t\r\n\t┏━━━━━┓\r\n\t┃ 1     2  ┃\r\n\t┃ 3     4  ┃  \r\n\t┗━━━━━┛\t\r\n}\r\n\r\nmac$ ==> _word _word <==\r\n{\r\n\tputsl(rstr($0)+rstr($1))\r\n}\r\n\r\nmac$ ┏━━━━━┓┃ _word _word ┃ ┃ _word _word ┃┗━━━━━┛\r\n{\r\n\tputsl(rstr($0)+'--'+rstr($1)+'--'+rstr($2)+'--'+rstr($3))\r\n}\r\n"
  },
  {
    "path": "bin/example/11_7.h",
    "content": "﻿/*\r\n对比宏和模板函数\r\n注意宏是无格式的，因此花括号和分号不可省略\r\n*/\r\n\r\nvoid main()\r\n{\r\n\tputsl fb<int>(1,2)\r\n\tputsl fb<double>(0.5,0.6)\r\n\r\n\tputsl fa_int(1,2)\r\n\tputsl fa_double(0.5,0.6)\t\r\n}\r\n\r\nT fb<T>(T a,T b)\r\n{\r\n\treturn a+b;\r\n}\r\n\r\nfa int\r\nfa double\r\n\r\ndefine$ fa _word\r\n{\r\n\t$0 fa_##$0($0 a,$0 b)\r\n\t{\r\n\t\treturn a+b;\r\n\t}\t\r\n}"
  },
  {
    "path": "bin/example/17_1.h",
    "content": "﻿/*\r\n闭包\r\n*/\r\n\r\nvoid main()\r\n{\r\n\tint a=2\r\n\tvoid[lambda(){puts a}]\r\n}"
  },
  {
    "path": "bin/example/17_2.h",
    "content": "﻿/*\r\n匿名函数\r\n*/\r\n\r\nvoid main()\r\n{\r\n\tp=lambda(int a,int b){\r\n\t\tputsl a+b\r\n\t}\r\n\t\r\n\tvoid[p,1,2]\r\n\t\r\n\tp=lambda(int,int a,int b){\r\n\t\treturn a+b\r\n\t}\r\n\t\r\n\tputsl int[p,1,2]\r\n}"
  },
  {
    "path": "bin/example/22_2.h",
    "content": "﻿main\r\n{\r\n\tstdcall[\"MessageBoxA\",0,\"abc\",\"123\",0]\r\n\tstdcall[\"MessageBoxW\",0,utf16c(\"abc\"),utf16c(\"123\"),0]\r\n\t@MessageBoxA(0,\"aaa\",\"bbb\",0)\r\n\t\r\n#ifdef _JIT\r\n\tvoid[rf.find_dll(\"MessageBoxA\"),0,\"111\",\"222\",0]\r\n#endif\r\n}"
  },
  {
    "path": "bin/example/28.h",
    "content": "﻿/*\r\n全局变量定义的时候不能使用类型推断\r\n*/\r\n\r\n\r\nint g_a=2\r\nrbuf<char> g_b(3)\r\n\r\nmain\r\n{\r\n\tputsl g_a\r\n\tb=g_b\r\n\tb.count.printl\r\n}"
  },
  {
    "path": "bin/example/34_2.h",
    "content": "﻿//嵌套类和嵌套命名空间\r\n\r\nnamespace A\r\n{\r\n}\r\n\r\nclass A.B\r\n{\r\n\tint m_b\r\n\t\r\n\tA.B()\r\n\t{\r\n\t\tputsl('constructor')\r\n\t}\r\n\r\n\tstatic void func()\r\n\t{\r\n\t\tputsl('func')\r\n\t}\r\n}\r\n\r\nnamespace A.B.C\r\n{\r\n\tvoid func()\r\n\t{\r\n\t\tputsl('func')\r\n\t}\r\n}\r\n\r\nvoid main()\r\n{\r\n\tA.B b\r\n\tb.m_b=3\r\n\tputsl(b.m_b)\r\n\tA.B.func()\r\n\tA.B.C.func()\r\n}"
  },
  {
    "path": "bin/example/36_6.h",
    "content": "﻿import rdic.h\r\n\r\nmain\r\n{\r\n\trdic<int> a\r\n\ta['abc']=3\r\n\ta['121213']=4\r\n\ta['1']=1\r\n\tfor i=1 to 1000\r\n\t\ta[i.torstr]=i\r\n\ta['121213'].printl\r\n}"
  },
  {
    "path": "bin/example/36_7.h",
    "content": "﻿/*\r\nread self\r\n*/\r\n\r\nimport \"rfile.h\"\r\n\r\nmain\r\n{\r\n\trfile file(\"example/36_7.h\")\r\n\tfile.read_all.sub(3).print\r\n\t//auto close file in destructor\r\n}"
  },
  {
    "path": "bin/example/42.h",
    "content": "﻿/*\r\nRPP不支持重载小括号，\r\n但是可以重载中括号实现C++的函数对象（仿函数）\r\n*/\r\n\r\nvoid main()\r\n{\r\n\tA<int,int> a=lambda(int,int n){return n*n}\r\n\tputs a[3]\r\n}\r\n\r\nclass A<T1,T2>\r\n{\r\n\tvoid* m_func\r\n\t\r\n\t=(void* p)\r\n\t{\r\n\t\tm_func=p\r\n\t}\r\n\t\r\n\tT1 [](T2 n)\r\n\t{\r\n\t\treturn T1[m_func,n]\r\n\t}\r\n}"
  },
  {
    "path": "bin/example/44.h",
    "content": "﻿/*\r\n惰性求值的方式实现短路求值\r\nRPP是同时支持call_by_name和call_by_need和call_by_value的语言\r\n该示例只能以JIT模式运行\r\n*/\r\n\r\nimport eval.h\r\n\r\nvoid main()\r\n{\r\n\tint* p=null\r\n\r\n\t//不能用 p!=null&&*p==2 因为 && 是非惰性的\r\n\tif and(p!=null,*p==2)\r\n\t\tputsl('and')\r\n\t\r\n\trbuf<int> v\r\n\r\n\t//不能用 v.empty||v[0]!=5 因为 || 是非惰性的\r\n\tif or(v.empty,v[0]!=5)\r\n\t\tputsl('or')\r\n\t\r\n\t//and和or是惰性的，可以带多个参数\r\n\tif and(2>1,p==null,v.empty,3!=4)\r\n\t\tputsl('true')\r\n\r\n\tif and(and(2>1),3!=4)\r\n\t\tputsl('true')\r\n\r\n\ta=1\r\n\tb=2\r\n\tc=3\r\n\r\n\tputsl and(and(a,b),c)\r\n\tputsl or(or(a,b),c)\r\n\r\n\ta=0\r\n\tb=1\r\n\tc=0\r\n\r\n\tputsl and(and(a,b),c)\r\n\tputsl or(or(a,b),c)\r\n\tputsl or(and(a,b),c)\r\n\tputsl and(or(a,b),c)\r\n}"
  },
  {
    "path": "bin/example/50.h",
    "content": "﻿\r\nmain\r\n{\r\n\ttest1\r\n\ttest2\r\n\ttest3\r\n\ttest4\r\n\ttest5\r\n\ttest6\r\n}\r\n\r\n//浮点测试\r\ntest1\r\n{\r\n\tputsl 0.2+0.3\r\n\tputsl 0.2*0.3\r\n\tputsl 0.2/0.3\r\n\tputsl 0.2-0.3\r\n\tputsl 0.2<0.3\r\n\tputsl 0.2>0.3\r\n\ta=99.2*20\r\n\tputsl a\r\n\tputsl(-2)\r\n}\r\n\r\n//逻辑运算测试\r\ntest2\r\n{\r\n\tputsl 0&&0\r\n\tputsl 1&&0\r\n\tputsl 0&&1\r\n\tputsl 1&&1\r\n\tputsl 0||0\r\n\tputsl 1||0\r\n\tputsl 0||1\r\n\tputsl 1||1\r\n}\r\n\r\n//自动类型转换测试\r\ntest3\r\n{\r\n\tuint a=1\r\n\tint c=5\r\n\tputsl a+sizeof(int)!=c\r\n}\r\n\r\n//64位运算测试\r\ntest4\r\n{\r\n\tint8 a=9\r\n\tint8 b=3\r\n\tputsl a/b\r\n\tputsl a*b\r\n\tputsl a%b\r\n\tputsl a-b\r\n\tputsl a<b\r\n\tputsl a>b\r\n}\r\n\r\ntest5\r\n{\r\n\tif (2)==2\r\n\t\tputsl('ok',,,)\r\n}\r\n\r\ntest6\r\n{\r\n\tputsl ORM[1,2]\r\n\tputsl ORM[1,2,4,8]\r\n\tputsl ORM[1]\r\n}"
  },
  {
    "path": "bin/example/51.h",
    "content": "﻿/*\r\n仅用位运算实现加减乘除，面试专用\r\n*/\r\n\r\nmain\r\n{\r\n\tfadd(1,2).printl\r\n\tfadd(19,29999).printl\r\n\r\n\tfsub(-1,3).printl\r\n\tfsub(19,2345).printl\r\n\r\n\tfmul(99,98).printl\r\n\tfmul(-29,235).printl\r\n\r\n\tfdiv(99,98).printl\r\n\tfdiv(9,3).printl\r\n\tfdiv(-9,3).printl\r\n\tfdiv(8,3).printl\r\n}\r\n\r\nint fadd(int x,int y)\r\n{\r\n\tfor\r\n\t\ta=AND(x,y)\r\n\t\tb=XOR(x,y)\r\n\t\tx=SHL(a,1)\r\n\t\ty=b\r\n\t\tifn a\r\n\t\t\tbreak\r\n\treturn b\r\n}\r\n\r\nint fneg(int x)\r\n{\r\n\treturn fadd(NOT(x),1)\r\n}\r\n\r\nint fsub(int x,int y)\r\n{\r\n\treturn fadd(x,fneg(y))\r\n}\r\n\r\nint fmul(int x,int y)\r\n{\r\n\tm=1\r\n\tz=0\r\n\tif x<0\r\n\t\tx=fneg(x)\r\n\t\ty=fneg(y)\r\n\tfor x>=m&&y\r\n\t\tif AND(x,m)\r\n\t\t\tz=fadd(y,z)\r\n\t\ty=SHL(y,1)\r\n\t\tm=SHL(m,1)\r\n\treturn z\r\n}\r\n\r\nint fdiv(int x,int y)\r\n{\r\n\tc=0\r\n\tsign=0\r\n\tif x<0\r\n\t\tx=fneg(x)\r\n\t\tsign=XOR(sign,1)\r\n\tif y<0\r\n\t\ty=fneg(y)\r\n\t\tsign=XOR(sign,1)\r\n\tif y\r\n\t\tfor x>=y\r\n\t\t\tx=fsub(x,y)\r\n\t\t\tc=fadd(c,1)\r\n\tif sign\r\n\t\tc=fneg(c)\r\n\treturn c\r\n}"
  },
  {
    "path": "bin/example/52.h",
    "content": "﻿/*\r\n全排列的非递归实现，支持去掉重复\r\n*/\r\n\r\nvoid main()\r\n{\r\n\trbuf<int> v\r\n\t#v.push(1,2,3,4)\r\n\tfor\r\n\t\tv.join('').printl\r\n\t\tifn next_permutation<int>(v)\r\n\t\t\tbreak\r\n}\r\n\r\nbool next_permutation<T>(rbuf<T>& v)\r\n{\r\n\tif v.count<=1\r\n\t\treturn false\r\n\tnext=v.count-1\r\n\tfor\r\n\t\ttemp=next\r\n\t\tnext--\r\n\t\tif v[next]<v[temp]\r\n\t\t\tmid=v.count-1\r\n\t\t\tfor !(v[next]<v[mid])\r\n\t\t\t\tmid--\r\n\t\t\tr_swap<T>(v[next],v[mid])\r\n\t\t\tr_reverse<T>(v,temp)\r\n\t\t\treturn true\r\n\t\tif next==0\r\n\t\t\tr_reverse<T>(v,0)\r\n\t\t\treturn false\r\n}"
  },
  {
    "path": "bin/example/53.h",
    "content": "﻿/*\r\nKMP算法\r\n*/\r\n\r\nvoid main()\r\n{\r\n\tputsl(find('abc123','c1'))\r\n\tputsl(find('abc123','c2'))\r\n}\r\n\r\nint find(rstr s,rstr p)\r\n{\r\n\tnext=get_next(p)\r\n\ti=0\r\n\tj=0\r\n\tfor i<s.count&&j<p.count\r\n\t\tif j==-1||s[i]==p[j]\r\n\t\t\ti++\r\n\t\t\tj++\r\n\t\telse\r\n\t\t\tj=next[j]\r\n\tif j==p.count\r\n\t\treturn i-j\r\n\treturn -1\r\n}\r\n\r\nrbuf<int> get_next(rstr p)\r\n{\r\n\trbuf<int> next(p.count)\r\n\tnext[0]=-1\r\n\tk=-1\r\n\tj=0\r\n\tfor j<p.count-1\r\n\t\tif k==-1||p[j]==p[k]\r\n\t\t\tj++\r\n\t\t\tk++\r\n\t\t\tif p[j]!=p[k]\r\n\t\t\t\tnext[j]=k\r\n\t\t\telse\r\n\t\t\t\tnext[j]=next[k]\r\n\t\telse\r\n\t\t\tk=next[k]\r\n\treturn next\r\n}"
  },
  {
    "path": "bin/example/54.h",
    "content": "﻿/*\r\n50行代码实现正则引擎，参考《代码之美》，可以轻松解决95％的正则问题\r\n\r\nc 匹配任意的字母c \r\n.（句点） 匹配任意的单个字符 \r\n^ 匹配输入字符串的开头 \r\n$ 匹配输入字符串的结尾 \r\n* 匹配前一个字符的零个或者多个出现\r\n*/\r\n\r\nmain\r\n{\r\n\tputsl match('.*txt','2343txt')\r\n\tputsl match('t.t','2343txt')\r\n}\r\n\r\nbool match(rstr reg,rstr text)\r\n{\r\n\tif reg.get(0)==`^\r\n\t\treturn match_here(reg.sub(1),text)\r\n\tfor\r\n\t\tif match_here(reg,text)\r\n\t\t\treturn true\r\n\t\tif text.empty\r\n\t\t\treturn false\r\n\t\ttext=text.sub(1)\r\n}\r\n\r\nbool match_here(rstr reg,rstr text)\r\n{\r\n\tif reg.empty\r\n\t\treturn true\r\n\tif reg.get(1)==`*\r\n\t\treturn match_star(reg.get(0),reg.sub(2),text)\r\n\tif reg.get(0)==`$&&reg.sub(1).empty\r\n\t\treturn text.empty\r\n\tif !text.empty&&(reg.get(0)==`.||reg.get(0)==text.get(0))\r\n\t\treturn match_here(reg.sub(1),text.sub(1))\r\n\treturn false\r\n}\r\n\r\nbool match_star(char c,rstr reg,rstr text)\r\n{\r\n\tfor\r\n\t\tif match_here(reg,text)\r\n\t\t\treturn true\r\n\t\tifn !text.empty&&(text.get(0)==c||c==`.)\r\n\t\t\treturn false\r\n\t\ttext=text.sub(1)\r\n}"
  },
  {
    "path": "bin/example/55.h",
    "content": "﻿/*\r\n栈排序与栈颠倒\r\n*/\r\n\r\nvoid main()\r\n{\r\n\trbuf<int> stack\r\n\t#stack.push(3,4,1,9,10,2)\r\n\tprint(stack)\r\n\tfunc(stack)\r\n\tprint(stack)\r\n\treverse(stack)\r\n\tprint(stack)\r\n\tsort(stack)\r\n\tprint(stack)\r\n}\r\n\r\nvoid print(rbuf<int>& stack)\r\n{\r\n\tfor i=0 to stack.count-1\r\n\t\tputsl(stack[i])\r\n\tputsl\r\n}\r\n\r\nvoid sort(rbuf<int>& stack)\r\n{\r\n\tif stack.empty\r\n\t\treturn\r\n\ta=stack.pop\r\n\tif stack.empty\r\n\t\tstack.push(a)\r\n\t\treturn\r\n\tsort(stack)\r\n\tb=stack.pop\r\n\tif a<b\r\n\t\tstack.push(a)\r\n\t\tsort(stack)\r\n\t\tstack.push(b)\r\n\telse\r\n\t\tstack.push(b)\r\n\t\tsort(stack)\r\n\t\tstack.push(a)\r\n}\r\n\r\nvoid func(rbuf<int>& stack)\r\n{\r\n\tif stack.count<=1\r\n\t\treturn\r\n\ta=stack.pop\r\n\tfunc(stack)\r\n\tb=stack.pop\r\n\tif a<b\r\n\t\tstack.push(a)\r\n\t\tfunc(stack)\r\n\t\tstack.push(b)\r\n\telse\r\n\t\tstack.push(b)\r\n\t\tstack.push(a)\r\n}\r\n\r\nvoid reverse(rbuf<int>& stack)\r\n{\r\n\tif stack.count<=1\r\n\t\treturn\r\n\ta=stack.pop\r\n\treverse(stack)\r\n\tb=stack.pop\r\n\treverse(stack)\r\n\tstack.push(a)\r\n\treverse(stack)\r\n\tstack.push(b)\r\n}"
  },
  {
    "path": "bin/example/56.h",
    "content": "﻿/*\r\n组合遍历\r\n*/\r\n\r\nmain\r\n{\r\n\tn=7\r\n\tsum=0\r\n\tfor i=0;i<n;i++\r\n\t\tfor j=i+1;j<n;j++\r\n\t\t\tfor k=j+1;k<n;k++\r\n\t\t\t\tsum++\r\n\tputsl(sum)\r\n\r\n\tputsl(A(3,6))\r\n\tputsl(A(6,6))\r\n\tputsl(C(3,7))\r\n}\r\n\r\nint A(int a,int b)\r\n{\r\n\ttemp=1\r\n\tfor i=0;i<a;i++\r\n\t\ttemp*=b-i\r\n\treturn temp\r\n}\r\n\r\nint C(int a,int b)\r\n{\r\n\treturn A(a,b)/A(a,a)\r\n} "
  },
  {
    "path": "bin/example/57.h",
    "content": "﻿/*\r\n4个线程并行计算1个数组的5个元素\r\n*/\r\n\r\nvoid main()\r\n{\r\n\tv=array<int>[1,2,3,4,5]\r\n\tv.join(' ').printl\r\n\tv.parallel(4,lambda(int& a){\r\n\t\ta*=3\r\n\t})\r\n\tv.join(' ').printl\r\n}"
  },
  {
    "path": "bin/example/answer/1.txt",
    "content": "3"
  },
  {
    "path": "bin/example/answer/10_1.txt",
    "content": "553628800553628800"
  },
  {
    "path": "bin/example/answer/10_2.txt",
    "content": "259"
  },
  {
    "path": "bin/example/answer/10_3.txt",
    "content": "1\r\nrp<char>\r\n47"
  },
  {
    "path": "bin/example/answer/11_1.txt",
    "content": "9\r\n5\r\n55\r\n3628800\r\n"
  },
  {
    "path": "bin/example/answer/11_2.txt",
    "content": "1\r\nabc\r\n98\r\n3\r\n"
  },
  {
    "path": "bin/example/answer/11_3.txt",
    "content": "1\r\nabc\r\n2\r\n5\r\n20\r\n100\r\n"
  },
  {
    "path": "bin/example/answer/11_4.txt",
    "content": "6\r\n123\r\n234\r\n"
  },
  {
    "path": "bin/example/answer/11_5.txt",
    "content": "12\r\n7\r\n25\r\n6\r\n789\r\n123\r\n1234\r\n"
  },
  {
    "path": "bin/example/answer/11_6.txt",
    "content": "23\r\n1--2--3--4\r\n"
  },
  {
    "path": "bin/example/answer/11_7.txt",
    "content": "3\r\n1.100000\r\n3\r\n1.100000\r\n"
  },
  {
    "path": "bin/example/answer/12.txt",
    "content": "3\r\n3\r\n3\r\n3\r\n"
  },
  {
    "path": "bin/example/answer/13.txt",
    "content": "33333"
  },
  {
    "path": "bin/example/answer/14_1.txt",
    "content": "123\r\n123\r\n2\r\n3\r\n99\r\n98\r\ntest\r\nmain\r\nC\r\n5\r\n"
  },
  {
    "path": "bin/example/answer/17_1.txt",
    "content": "2"
  },
  {
    "path": "bin/example/answer/17_2.txt",
    "content": "3\r\n3\r\n"
  },
  {
    "path": "bin/example/answer/18_1.txt",
    "content": "12"
  },
  {
    "path": "bin/example/answer/18_2.txt",
    "content": "12"
  },
  {
    "path": "bin/example/answer/19_1.txt",
    "content": "3\r\n6\r\n103\r\n10\r\n16\r\n"
  },
  {
    "path": "bin/example/answer/19_2.txt",
    "content": "3\r\n5\r\n"
  },
  {
    "path": "bin/example/answer/2.txt",
    "content": "3"
  },
  {
    "path": "bin/example/answer/20.txt",
    "content": "43"
  },
  {
    "path": "bin/example/answer/21_1.txt",
    "content": "02"
  },
  {
    "path": "bin/example/answer/21_2.txt",
    "content": "2222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222"
  },
  {
    "path": "bin/example/answer/22_1.txt",
    "content": "3\r\n3\r\n0\r\n1\r\n-1\r\n3\r\n"
  },
  {
    "path": "bin/example/answer/23_1.txt",
    "content": "uint\r\nuint\r\nuint\r\nrstr\r\nint\r\n97\r\n255\r\n"
  },
  {
    "path": "bin/example/answer/23_2.txt",
    "content": "2"
  },
  {
    "path": "bin/example/answer/23_3.txt",
    "content": "int\r\nint\r\n0\r\n"
  },
  {
    "path": "bin/example/answer/24.txt",
    "content": "411c12"
  },
  {
    "path": "bin/example/answer/25_1.txt",
    "content": "0000011111222223333344444"
  },
  {
    "path": "bin/example/answer/25_2.txt",
    "content": "000011112222000011112222000011112222000011112222000011112222"
  },
  {
    "path": "bin/example/answer/25_3.txt",
    "content": "000011112222000011112222000011112222000011112222000011112222"
  },
  {
    "path": "bin/example/answer/26_1.txt",
    "content": "func int\r\nfunc char\r\n"
  },
  {
    "path": "bin/example/answer/26_2.txt",
    "content": "22"
  },
  {
    "path": "bin/example/answer/27.txt",
    "content": "2253344"
  },
  {
    "path": "bin/example/answer/28.txt",
    "content": "2\r\n3\r\n"
  },
  {
    "path": "bin/example/answer/29.txt",
    "content": "23"
  },
  {
    "path": "bin/example/answer/3.txt",
    "content": "3"
  },
  {
    "path": "bin/example/answer/30_1.txt",
    "content": "i>=10\r\n1\r\n0\r\n"
  },
  {
    "path": "bin/example/answer/30_2.txt",
    "content": "3"
  },
  {
    "path": "bin/example/answer/31.txt",
    "content": "123\r\n123\r\nabc'123\r\nabc'123\r\n97\r\n97\r\n97\r\n100000000\r\n100000000\r\n10\r\n10\r\n10\r\n0.500000\r\n"
  },
  {
    "path": "bin/example/answer/32_1.txt",
    "content": "pass 1\r\npass 1\r\npass 1\r\npass 1\r\npass 1\r\npass 2\r\nother\r\npass 2\r\npass 2\r\npass 2\r\nother\r\nother\r\ndefault\r\ndefault\r\ndefault\r\n"
  },
  {
    "path": "bin/example/answer/32_2.txt",
    "content": "123456789123456789123456789123456789"
  },
  {
    "path": "bin/example/answer/32_3.txt",
    "content": "a less than b\r\na less than b\r\n0123456789"
  },
  {
    "path": "bin/example/answer/33_1.txt",
    "content": "23"
  },
  {
    "path": "bin/example/answer/33_2.txt",
    "content": "34"
  },
  {
    "path": "bin/example/answer/34_1.txt",
    "content": "2224"
  },
  {
    "path": "bin/example/answer/34_2.txt",
    "content": "constructor\r\nconstructor\r\n3\r\nfunc\r\nfunc\r\n"
  },
  {
    "path": "bin/example/answer/35.txt",
    "content": "3\r\n2\r\n1\r\n"
  },
  {
    "path": "bin/example/answer/36_1.txt",
    "content": "3\r\n2\r\n4\r\n3\r\n2\r\n4\r\n"
  },
  {
    "path": "bin/example/answer/36_10.txt",
    "content": "protected code"
  },
  {
    "path": "bin/example/answer/36_2.txt",
    "content": "1\r\n2\r\n3\r\n1\r\n3\r\n\r\n1\r\n3\r\n"
  },
  {
    "path": "bin/example/answer/36_3.txt",
    "content": "4\r\n"
  },
  {
    "path": "bin/example/answer/36_4.txt",
    "content": "321\r\n1343\r\nfj242i\r\n12\r\n\r\n12\r\n1343\r\n321\r\nfj242i\r\n\r\n12\r\n2\r\n"
  },
  {
    "path": "bin/example/answer/36_5.txt",
    "content": "3\r\n6\r\n123\r\n"
  },
  {
    "path": "bin/example/answer/36_6.txt",
    "content": "4\r\n"
  },
  {
    "path": "bin/example/answer/36_7.txt",
    "content": "/*\r\r\nread self\r\r\n*/\r\r\n\r\r\nimport \"rfile.h\"\r\r\n\r\r\nmain\r\r\n{\r\r\n\trfile file(\"example/36_7.h\")\r\r\n\tfile.read_all.sub(3).print\r\r\n\t//auto close file in destructor\r\r\n}"
  },
  {
    "path": "bin/example/answer/42.txt",
    "content": "9"
  },
  {
    "path": "bin/example/answer/44.txt",
    "content": "or\r\ntrue\r\ntrue\r\n1\r\n1\r\n0\r\n1\r\n0\r\n0\r\n"
  },
  {
    "path": "bin/example/answer/4_1.txt",
    "content": "3"
  },
  {
    "path": "bin/example/answer/4_2.txt",
    "content": "3\r\n3\r\n0\r\n4\r\n"
  },
  {
    "path": "bin/example/answer/50.txt",
    "content": "0.500000\r\n0.060000\r\n0.666667\r\n-0.100000\r\n1\r\n0\r\n1984.000000\r\n-2\r\n0\r\n0\r\n0\r\n1\r\n0\r\n1\r\n1\r\n1\r\n0\r\n3\r\n27\r\n0\r\n6\r\n0\r\n1\r\nok\r\n3\r\n15\r\n1\r\n"
  },
  {
    "path": "bin/example/answer/51.txt",
    "content": "3\r\n30018\r\n-4\r\n-2326\r\n9702\r\n-6815\r\n1\r\n3\r\n-3\r\n2\r\n"
  },
  {
    "path": "bin/example/answer/52.txt",
    "content": "1234\r\n1243\r\n1324\r\n1342\r\n1423\r\n1432\r\n2134\r\n2143\r\n2314\r\n2341\r\n2413\r\n2431\r\n3124\r\n3142\r\n3214\r\n3241\r\n3412\r\n3421\r\n4123\r\n4132\r\n4213\r\n4231\r\n4312\r\n4321\r\n"
  },
  {
    "path": "bin/example/answer/53.txt",
    "content": "2\r\n-1\r\n"
  },
  {
    "path": "bin/example/answer/54.txt",
    "content": "1\r\n1\r\n"
  },
  {
    "path": "bin/example/answer/55.txt",
    "content": "3\r\n4\r\n1\r\n9\r\n10\r\n2\r\n\r\n1\r\n2\r\n3\r\n4\r\n9\r\n10\r\n\r\n10\r\n9\r\n4\r\n3\r\n2\r\n1\r\n\r\n1\r\n2\r\n3\r\n4\r\n9\r\n10\r\n\r\n"
  },
  {
    "path": "bin/example/answer/56.txt",
    "content": "35\r\n120\r\n720\r\n35\r\n"
  },
  {
    "path": "bin/example/answer/57.txt",
    "content": "1 2 3 4 5\r\n3 6 9 12 15\r\n"
  },
  {
    "path": "bin/example/answer/5_1.txt",
    "content": "454545"
  },
  {
    "path": "bin/example/answer/5_2.txt",
    "content": "true232323233"
  },
  {
    "path": "bin/example/answer/6.txt",
    "content": "1abc\r\n123abc\r\n123abc\r\n"
  },
  {
    "path": "bin/example/answer/7.txt",
    "content": "-2-2-222"
  },
  {
    "path": "bin/example/answer/8.txt",
    "content": "3eax is not zero"
  },
  {
    "path": "bin/example/answer/9.txt",
    "content": "cab132\r\n123abc\r\n"
  },
  {
    "path": "bin/example/asm_opt.h",
    "content": "﻿/*\r\n汇编优化工具\r\n使汇编代码更具可读性，并提高汇编速度\r\n优化15000行大约需要30秒\r\n*/\r\n\r\nimport rfile.h\r\n\r\nmain\r\n{\r\n\t//name=getsl\r\n\tname='http.asm'\r\n\ts=rfile.read_all_n(name)\r\n\r\n\ts=s.replace('\\n','\\r\\n')\r\n\ts=s.replace('dword esp','esp')\r\n\ts=s.replace('dword ebp','ebp')\r\n\ts=s.replace('dword edi','edi')\r\n\ts=s.replace('dword esi','esi')\r\n\ts=s.replace('dword ebx','ebx')\r\n\ts=s.replace(',ecx',', ecx')\r\n\ts=s.replace('ebx,0','ebx , 0')\r\n\ts=s.replace('ecx,[','ecx , [')\r\n\ts=s.replace('mov dword [ edi ] , esi','mov [ edi ] , esi')\r\n\ts=opt_sym(s)\r\n\ts=line_del(s)\r\n\ts=opt_jmp(s)\r\n\ts=line_del(s)\r\n\ts=opt_two(s)\r\n\ts=line_del(s)\r\n\ts=sym_replace(s)\r\n\ts=line_del(s)\r\n\r\n\trfile.write_all_n(name,s)\t\r\n}\r\n\r\nrstr line_del(rstr& s)\r\n{\r\n\treturn s.replace('\\r\\n\\r\\n\\r\\n','\\r\\n\\r\\n')\r\n}\r\n\r\n//符号替换\r\nrstr sym_replace(rstr s)\r\n{\r\n\trbuf<rstr> arr\r\n\tr_split_e<rstr>(s,'\\r\\n',arr)\r\n\trstr ret\r\n\tfor i in arr\r\n\t\ttemp=arr[i]\r\n\t\tif temp.get_top==`:&&is_symbol(temp.sub(0,temp.count-1))\r\n\t\t\tret+=sym_trans(temp.sub(0,temp.count-1))+':'\r\n\t\t\tret+='\\r\\n'\r\n\t\t\tcontinue\r\n\t\tif (temp.sub(0,5)=='\tjmp '||\r\n\t\t\ttemp.sub(0,6)=='\tcall '||\r\n\t\t\ttemp.sub(0,5)=='\tjnz '||\r\n\t\t\ttemp.sub(0,4)=='\tjg '||\r\n\t\t\ttemp.sub(0,4)=='\tjl '||\r\n\t\t\ttemp.sub(0,5)=='\tjae '||\r\n\t\t\ttemp.sub(0,4)=='\tjz ')\r\n\t\t\tindex=temp.find(' ')\r\n\t\t\tsymbol=temp.sub(index+1)\r\n\t\t\tif is_symbol(symbol)\r\n\t\t\t\tret+=temp.sub(0,index+1)+sym_trans(symbol)\r\n\t\t\t\tret+='\\r\\n'\r\n\t\t\t\tcontinue\r\n\t\tret+=temp\r\n\t\tret+='\\r\\n'\r\n\treturn ret\r\n}\r\n\r\nrstr sym_trans(rstr s)\r\n{\r\n\trstr ret\r\n\tfor i in s\r\n\t\ttwo=s.sub(i,i+2)\r\n\t\tif two=='28'||two=='29'//()\r\n\t\t\ti++\r\n\t\t\tret+='_'\r\n\t\telif two=='2E'||two=='2C'||two=='5F'//.,_\r\n\t\t\ti++\r\n\t\t\tret+='_'\r\n\t\telif two=='26'\r\n\t\t\ti++\r\n\t\t\tret+='q'\r\n\t\telif two=='7E'\r\n\t\t\ti++\r\n\t\t\tret+='d'\r\n\t\telif two=='7C'\r\n\t\t\ti++\r\n\t\t\tret+='h'\r\n\t\telif two=='5B'\r\n\t\t\ti++\r\n\t\t\tret+='i'\r\n\t\telif two=='5D'\r\n\t\t\ti++\r\n\t\t\tret+='j'\r\n\t\telif two=='3D'//=\r\n\t\t\ti++\r\n\t\t\tret+='a'\r\n\t\telif two=='2B'\r\n\t\t\ti++\r\n\t\t\tret+='b'\r\n\t\telif two=='2D'//-\r\n\t\t\ti++\r\n\t\t\tret+='s'\r\n\t\telif two=='2A'//*\r\n\t\t\ti++\r\n\t\t\tret+='t'\r\n\t\telif two=='2F'\r\n\t\t\ti++\r\n\t\t\tret+='f'\r\n\t\telif two=='25'\r\n\t\t\ti++\r\n\t\t\tret+='e'\r\n\t\telif two=='21'//!\r\n\t\t\ti++\r\n\t\t\tret+='o'\r\n\t\telif two=='3E'//>\r\n\t\t\ti++\r\n\t\t\tret+='x'\r\n\t\telif two=='3C'//<\r\n\t\t\ti++\r\n\t\t\tret+='y'\r\n\t\telse\r\n\t\t\tret+=s[i]\r\n\treturn seq_replace(ret)\r\n}\r\n\r\nrstr seq_replace(rstr s)\r\n{\r\n\t//s=s.replace('__','_')\r\n\t//s=s.replace('__','_')\r\n\t//s=s.replace('__','_')\r\n\tif s.get_top==`_\r\n\t\ts.pop\r\n\tif s.get_top==`_\r\n\t\ts.pop\r\n\treturn s\r\n}\r\n\r\n//无引用符号删除\r\nrstr opt_sym(rstr s)\r\n{\r\n\trbuf<rstr> arr\r\n\tr_split_e<rstr>(s,'\\r\\n',arr)\r\n\trstr ret\r\n\tfor i in arr\r\n\t\ttemp=arr[i]\r\n\t\tfull=temp.sub(0,temp.count-1)\r\n\t\tif temp.get_top==`:&&is_symbol(full)\r\n\t\t\tsymbol=get_symbol(full)\r\n\t\t\tifn symbol.empty\r\n\t\t\t\tif get_count(arr,i,symbol,full)==1\r\n\t\t\t\t\tcontinue\r\n\t\tret+=temp\r\n\t\tret+='\\r\\n'\r\n\treturn ret\r\n}\r\n\r\n//jmp后接一个跳转符号\r\nrstr opt_jmp(rstr s)\r\n{\r\n\trbuf<rstr> arr\r\n\tr_split_e<rstr>(s,'\\r\\n',arr)\r\n\trstr ret\r\n\tfor i in arr\r\n\t\ttemp=arr[i]\r\n\t\ta=arr.get(i+1)\r\n\t\tfull=a.sub(0,a.count-1)\r\n\t\tif temp.sub(0,5)=='\tjmp '&&temp.sub(5)==full&&a.get_top==`:\r\n\t\t\tsymbol=get_symbol(full)\r\n\t\t\tifn symbol.empty\r\n\t\t\t\tif get_count(arr,i,symbol,full)==2\r\n\t\t\t\t\ti++\r\n\t\t\t\t\tcontinue\r\n\t\t\t\telse\r\n\t\t\t\t\tcontinue\r\n\t\tret+=temp\r\n\t\tret+='\\r\\n'\r\n\treturn ret\r\n}\r\n\r\n//连续2个jmp，后一个jmp不可能被执行\r\nrstr opt_two(rstr s)\r\n{\r\n\trbuf<rstr> arr\r\n\tr_split_e<rstr>(s,'\\r\\n',arr)\r\n\trstr ret\r\n\tfor i in arr\r\n\t\ttemp=arr[i]\r\n\t\ta=arr.get(i+1)\r\n\t\tif temp.sub(0,5)=='\tjmp '&&a.sub(0,5)=='\tjmp '\r\n\t\t\tret+=temp\r\n\t\t\tret+='\\r\\n'\r\n\t\t\ti++\r\n\t\t\tcontinue\r\n\t\tret+=temp\r\n\t\tret+='\\r\\n'\r\n\treturn ret\r\n}\r\n\r\nint get_count(rbuf<rstr>& arr,int i,rstr& symbol,rstr& full)\r\n{\r\n\tfor j=i-1;j>=0;j--\r\n\t\tif arr[j].sub(0,arr[j].count-1)==symbol&&`:==arr[j].get_top\r\n\t\t\tbreak\r\n\tfor k=i+1;k<arr.count;k++\r\n\t\tif arr[k].empty\r\n\t\t\tbreak\r\n\treturn find_count(arr,j,k,full)\r\n}\r\n\r\nrstr get_symbol(rstr s)\r\n{\r\n\tfor i=s.count-1;i>=0;i--\r\n\t\tif s[i]==`_&&s.sub(i+1).is_number\r\n\t\t\treturn s.sub(0,i)\r\n\treturn ''\r\n}\r\n\r\nint find_count(rbuf<rstr>& arr,int left,int right,rstr& symbol)\r\n{\r\n\tcount=0\r\n\tfor i=left;i<=right;i++\r\n\t\tcount+=find_count(arr[i],symbol)\r\n\treturn count\r\n}\r\n\r\nint find_count(rstr src,rstr dst)\r\n{\r\n\tcount=0\r\n\tfor i in src\r\n\t\tif src.sub(i,i+dst.count)==dst\r\n\t\t\tcount++\r\n\treturn count\t\r\n}\r\n\r\nbool is_symbol(rstr s)\r\n{\r\n\tfor i in s\r\n\t\tifn is_symbol(s[i])\r\n\t\t\treturn false\r\n\treturn true\r\n}\r\n\r\nbool is_symbol(char ch)\r\n{\r\n\treturn ch>=`A&&ch<=`Z||ch>=`a&&ch<=`z||ch>=`0&&ch<=`9||ch==`_\r\n}\r\n"
  },
  {
    "path": "bin/example/bf.h",
    "content": "﻿/*\r\nBF解释器增强版，支持32位运算\r\n这个语言并不像看上去那么简单，下面是一个BF版的Hello World：\r\n++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++.\r\n>+.+++++++..+++.>++.<<+++++++++++++++.>.+++.------.--------.>+.>.\r\n*/\r\n\r\nvoid main()\r\n{\r\n\tcode=getsl\r\n\trbuf<int> data(30000)\r\n\trf.memset(data.begin,0,data.size)\r\n\tpd=0\r\n\tfor pc=0;pc<code.count;pc++\r\n\t\tswitch code[pc]\r\n\t\tcase `>\r\n\t\t\tpd++\r\n\t\tcase `<\r\n\t\t\tpd--\r\n\t\tcase `+\r\n\t\t\tdata[pd]++\r\n\t\tcase `-\r\n\t\t\tdata[pd]--\r\n\t\tcase `.\r\n\t\t\tputs(rstr.format('%c',data[pd]))\r\n\t\tcase `,\r\n\t\t\tdata[pd]=rf.getch\r\n\t\tcase `[\r\n\t\t\tifn data[pd]\r\n\t\t\t\tpc=find< ++ >(pc,code,`[,`])\r\n\t\t\t\tcontinue//这里也可用continued\r\n\t\tcase `]\r\n\t\t\tif data[pd]\r\n\t\t\t\tpc=find< -- >(pc,code,`],`[)\r\n\t\t\t\tcontinue\r\n}\r\n\r\nint find<T>(int pc,rstr& code,int left,int right)\r\n{\r\n\tcount=0\r\n\tfor i=pc;;i T\r\n\t\tif code[i]==left\r\n\t\t\tcount++\r\n\t\telif code[i]==right\r\n\t\t\tcount--\r\n\t\tif count==0\r\n\t\t\treturn i\r\n}"
  },
  {
    "path": "bin/example/check.h",
    "content": "﻿/*\r\n分别以解释方式和编译方式运行example下所有例子，\r\n并与标准答案进行对比，以此来检验编译器的正确性。\r\n*/\r\n\r\nimport rdir.h\r\nimport rfile.h\r\n\r\nint g_sta_ok\r\nint g_total\r\n\r\nmain\r\n{\r\n\tuse_paral=rf.get_param.get_top=='-paral'\r\n\tg_sta_ok=1\r\n\tstart=rf.tick\r\n\tg_total=0\r\n\tv=rdir.get_file_bfs('./example/')\r\n\trbuf<rstr> vname\r\n\tfor i in v\r\n\t\tname=rdir.get_name(v[i])\r\n\t\tsuffix=rdir.get_suffix(name)\r\n\t\tif suffix!='h'\r\n\t\t\tcontinue\r\n\t\ta=name.sub(0,name.count-2)\r\n\t\tif is_ignore(a)\r\n\t\t\tcontinue\r\n\t\tvname.push(a)\r\n\trbuf<int> vtime\r\n\tnum=4\r\n\ttime=rf.tick\r\n\t\r\n\tif use_paral\r\n\t\tvname.parallel(num,lambda(rstr& b){\r\n\t\t\tcheck_interpret(b)\r\n\t\t})\r\n\telse\r\n\t\tfor i in vname\r\n\t\t\tcheck_interpret(vname[i])\r\n\t\t\t\r\n\tvtime.push(rf.tick-time)\r\n\ttime=rf.tick\r\n\t\r\n\tif use_paral\r\n\t\tvname.parallel(num,lambda(rstr& b){\r\n\t\t\tcheck_jit(b)\r\n\t\t})\r\n\telse\r\n\t\tfor i in vname\r\n\t\t\tcheck_jit(vname[i])\r\n\t\r\n\tvtime.push(rf.tick-time)\r\n\ttime=rf.tick\r\n\t\r\n\tif use_paral\r\n\t\tvname.parallel(num,lambda(rstr& b){\r\n\t\t\tcheck_pack(b)\r\n\t\t})\r\n\telse\r\n\t\tfor i in vname\r\n\t\t\tcheck_pack(vname[i])\r\n\t\r\n\tvtime.push(rf.tick-time)\r\n\ttime=rf.tick\r\n\t\r\n\tif use_paral\r\n\t\tvname.parallel(num,lambda(rstr& b){\r\n\t\t\tcheck_exe(b)\r\n\t\t})\r\n\telse\r\n\t\tfor i in vname\r\n\t\t\tcheck_exe(vname[i])\r\n\t\r\n\tvtime.push(rf.tick-time)\r\n\r\n\tputsl\r\n\tfor i in vtime\r\n\t\tputsl 'time'+i+': '+vtime[i]\r\n\tputsl\r\n\tputsl('total: '+g_total)\r\n\tputsl('time: '+(rf.tick-start))\r\n\tputsl('state: '+r_cond<rstr>(g_sta_ok,'ok','error'))\r\n\trf.getch\r\n}\r\n\r\nbool is_ignore(rstr a)\r\n{\r\n\tifn a.sub(0,1).is_number\r\n\t\treturn true\r\n\tif a=='14_2'||a=='22_2'||a=='36_8'||a=='36_9'\r\n\t\treturn true\r\n\tif a.sub(0,3)=='16_'\r\n\t\treturn true\r\n\tif a.sub(0,3)=='40_'\r\n\t\treturn true\r\n\treturn false\r\n}\r\n\r\ncheck_interpret(rstr a)\r\n{\r\n\tif a=='21_2'||a=='44'||a=='14_1'\r\n\t\treturn\r\n\trf.cmd('rpp example/'+a+'.h > example/answer/'+a+'_tmp.txt')\r\n\tcheck_interpret('example/answer/'+a+'_tmp.txt',\r\n\t\t'example/answer/'+a+'.txt')\r\n}\r\n\r\ncheck_jit(rstr a)\r\n{\r\n\trf.cmd('rjit example\\\\'+a+'.h > example/answer/'+a+'_tmp.txt')\r\n\tcheck_jit('example/answer/'+a+'_tmp.txt','example/answer/'+a+'.txt')\r\n}\r\n\r\ncheck_pack(rstr a)\r\n{\r\n\trf.cmd('rpack example\\\\'+a+'.h')\r\n\trf.cmd('example\\\\'+a+'.exe > example/answer/'+a+'_tmp.txt')\r\n\tcheck_pack('example/answer/'+a+'_tmp.txt','example/answer/'+a+'.txt')\r\n\trfile.remove('example\\\\'+a+'.exe')\r\n}\r\n\r\ncheck_exe(rstr a)\r\n{\r\n\tif a=='13'||a=='22_1'||a=='44'||a=='14_1'\r\n\t\t\treturn\r\n\trf.cmd('run example\\\\'+a+'.h > example/answer/'+a+'_tmp.txt')\r\n\tcheck_exe('example/answer/'+a+'_tmp.txt','example/answer/'+a+'.txt')\r\n}\r\n\r\ncheck_interpret(rstr a,rstr b)\r\n{\r\n\t//不严谨，应该使用互斥体\r\n\tg_total++\r\n\tcont=rfile.read_all_n(a);\r\n\tif cont.count>0&&cont==rfile.read_all_n(b)\r\n\t\tputs('ok ')\r\n\telse\r\n\t\tputs('* * * error ')\r\n\t\tg_sta_ok=0\r\n\tputsl('interpret '+a.sub(15)+' vs '+b.sub(15))\r\n\tifn rfile.remove(a)\r\n\t\tputsl('* * * error ')\r\n\t\tg_sta_ok=0\r\n}\r\n\r\ncheck_jit(rstr a,rstr b)\r\n{\r\n\tg_total++\r\n\tcont=rfile.read_all_n(a);\r\n\tif cont.count>0&&cont==rfile.read_all_n(b)\r\n\t\tputs('ok ')\r\n\telse\r\n\t\tputs('* * * error ')\r\n\t\tg_sta_ok=0\r\n\tputsl('jit '+a.sub(15)+' vs '+b.sub(15))\r\n\tifn rfile.remove(a)\r\n\t\tputsl('* * * error ')\r\n\t\tg_sta_ok=0\r\n}\r\n\r\ncheck_pack(rstr a,rstr b)\r\n{\r\n\tg_total++\r\n\tcont=rfile.read_all_n(a);\r\n\tif cont.count>0&&cont==rfile.read_all_n(b)\r\n\t\tputs('ok ')\r\n\telse\r\n\t\tputs('* * * error ')\r\n\t\tg_sta_ok=0\r\n\tputsl('pack '+a.sub(15)+' vs '+b.sub(15))\r\n\tifn rfile.remove(a)\r\n\t\tputsl('* * * error ')\r\n\t\tg_sta_ok=0\r\n}\r\n\r\ncheck_exe(rstr a,rstr b)\r\n{\r\n\tg_total++\r\n\tcont=rfile.read_all_n(a)\r\n\tcont=cont.sub(cont.find('\\x73\\x0d\\x0a')+3)//去掉golink打印的信息\r\n\tif cont.count>0&&cont==rfile.read_all_n(b)\r\n\t\tputs('ok ')\r\n\telse\r\n\t\tputs('* * * error ')\r\n\t\tg_sta_ok=0\r\n\tputsl('exe '+a.sub(15)+' vs '+b.sub(15))\r\n\tifn rfile.remove(a)\r\n\t\tputsl('* * * error ')\r\n\t\tg_sta_ok=0\r\n}"
  },
  {
    "path": "bin/example/code.h",
    "content": "﻿/*\r\n检查当前目录下文本文件的编码类型\r\n*/\r\n\r\nimport \"rdir.h\"\r\n\r\nmain\r\n{\r\n\tv=rdir.get_file_bfs('./')\r\n\tfor i in v\r\n\t{\r\n\t\tif v[i].get_top==`/\r\n\t\t\tcontinue\r\n\t\trfile file(v[i])\r\n\t\trbuf<char> buf(3)\r\n\t\tifn(file.read(3,buf.begin))\r\n\t\t\tbreak\r\n\t\ts=v[i]+' '\r\n\t\tif(buf[0]==0xff&&buf[1]==0xfe)\r\n\t\t\ts+='utf16'\r\n\t\telif(buf[0]==0xef&&buf[1]==0xbb&&buf[2]==0xbf)\r\n\t\t\ts+='utf8'\r\n\t\telse\r\n\t\t\ts+='gbk'\r\n\t\ts.printl\r\n\t}\r\n}"
  },
  {
    "path": "bin/example/compile_speed.h",
    "content": "﻿//1.h amd 3.45GHZ cost time 3600ms ,new version 2800ms 1.89 2609ms fix2 2516ms 2094ms\r\n//36_2.h cost time 5375ms (1.83 4985ms),new version 4438ms 1.89 4156ms 3375ms\r\nmain\r\n{\r\n\tstart=rf.tick\r\n\tfor i=1 to 10\r\n\t\t//rf.cmd(\"rpp example\\\\36_2.h\")\r\n\t\trf.cmd(\"rpp example\\\\1.h\")\r\n\tputsl\r\n\tputsl(rf.tick-start)\r\n}"
  },
  {
    "path": "bin/example/count.h",
    "content": "﻿/*\r\n统计当前目录下代码行数\r\n如果使用utf16统计更准确\r\n*/\r\n\r\nimport rdir.h\r\nimport rfile.h\r\n\r\nint g_sum=0\r\n\r\ncount_line(rstr name)\r\n{\r\n\ts=rfile.read_all_n(name)\r\n\tsum=1\r\n\tfor i=0;i<s.count;i++\r\n\t\tif s[i]==0xa\r\n\t\t\tsum++\r\n\tg_sum+=sum\r\n\tputs(name+': '+sum+' lines\\n')\r\n}\r\n\r\nmain\r\n{\r\n\tpath='./'\r\n#ifdef _RVM\r\n\tif rf.get_param.count==3\r\n\t\tpath=rf.get_param.top\r\n#endif\r\n\t\t\r\n\tv=rdir.get_file_bfs(path)\r\n\tfor i in v\r\n\t\tname=v[i]\r\n\t\tif name.sub(name.count-2)=='.h'\r\n\t\t\tcount_line(name)\r\n\t\telif name.sub(name.count-4)=='.cpp'\r\n\t\t\tcount_line(name)\r\n\tputs('total: '+g_sum)\r\n}"
  },
  {
    "path": "bin/example/find.h",
    "content": "﻿/*\r\n文件搜索工具\r\n*/\r\n\r\nimport rfile.h\r\nimport rdir.h\r\n\r\nvoid main()\r\n{\r\n\tdir=\\\\./\r\n\tarr=array<rstr>['cpp','h']\r\n\tstr='s_ret'\r\n\t//todo utf16转换\r\n\tv=rdir.get_file_bfs(dir)\r\n\tfor i in v\r\n\t\tname=rdir.get_name(v[i])\r\n\t\tsuffix=rdir.get_suffix(name)\r\n\t\tif(v[i].get_top()==`/)\r\n\t\t\tcontinue\r\n\t\tifn arr.exist(suffix)\r\n\t\t\tcontinue\r\n\t\ts=rfile.read_all_n(v[i])\r\n\t\tif s.find(str)<s.count\r\n\t\t\tputsl(v[i])\r\n}"
  },
  {
    "path": "bin/example/line_check.h",
    "content": "﻿/*\r\n检查代码每行是否超过92字符\r\nrpp -jit example\\line_check.h ../rpp/\r\n*/\r\n\r\nimport rdir.h\r\nimport rfile.h\r\n\r\nbool check_line(rstrw s)\r\n{\r\n\tcount=0\r\n\tfor i=0;i<s.count;i++\r\n\t\ttemp=s.sub(i,i+1).torstr.get(0)\r\n\t\tif rcode.is_utf8_3(temp)||rcode.is_utf8_2(temp)\r\n\t\t\tcount+=2\r\n\t\telif s[i]==r_char('\t').toint\r\n\t\t\tcount+=8\r\n\t\telse\r\n\t\t\tcount++\r\n\tif count<=92\r\n\t\treturn true\r\n\tputsl 'count '+count\r\n\tputsl(s.torstr)\r\n\treturn false\r\n}\r\n\r\nbool check_s(rstrw s)\r\n{\r\n\trstrw temp\r\n\tfor i=0;i<s.count;i++\r\n\t\tif s[i]==10&&s.get(i-1)!=13\r\n\t\t\treturn false//temp+=13.toushort\r\n\t\tif s[i]==13&&s.get(i+1)!=10\r\n\t\t\treturn false\r\n\t\ttemp+=s[i]\r\n\tv=r_split_e_r<rstrw>(temp,'\\r\\n')\r\n\tfor i in v\r\n\t\tifn check_line(v[i])\r\n\t\t\tputsl('line '+(i+1))\r\n\t\t\treturn false\r\n\treturn true\r\n}\r\n\r\nbool check_file(rstr name)\r\n{\r\n\trfile file(name)\r\n\trbuf<char> buf(3)\r\n\tifn(file.read(3,buf.begin))\r\n\t\treturn false\r\n\tok=false\r\n\tif(buf[0]==0xff&&buf[1]==0xfe)\r\n\t\ts=rfile.read_all_n(name).sub(2)\r\n\t\tok=check_s(rstrw(s.begin,s.count))\r\n\telif(buf[0]==0xef&&buf[1]==0xbb&&buf[2]==0xbf)\r\n\t\ts=rfile.read_all_n(name).sub(3)\r\n\t\tok=check_s(rstrw(s))\r\n\tif ok\r\n\t\treturn true\r\n\tputsl(name)\r\n\treturn false\r\n}\r\n\r\nvoid main()\r\n{\r\n\tif rf.get_param.count<3\r\n\t\treturn\r\n\tv=rdir.get_file_bfs(rf.get_param.top)\r\n\tfor i in v\r\n\t\tname=v[i]\r\n\t\tif name.sub(name.count-2)=='.h'\r\n\t\t\tifn check_file(name)\r\n\t\t\t\tbreak\r\n\t\telif name.sub(name.count-4)=='.cpp'\r\n\t\t\tifn check_file(name)\r\n\t\t\t\tbreak\r\n}"
  },
  {
    "path": "bin/example/lisp.h",
    "content": "﻿/*\r\n60行RPP实现的lisp解释器\r\n未处理lambda、上下文等，有待完善\r\n*/\r\n\r\nvoid main()\r\n{\r\n\tfor\r\n\t\tputsl(eval(getsl))\r\n}\r\n\r\nrstr eval(rstr s)\r\n{\r\n\treturn eval(tokenize(s).split(' '))\r\n}\r\n\r\nrstr eval(rbuf<rstr>& v)\r\n{\r\n\tif v.get(0)!='('\r\n\t\treturn v.get(0)\r\n\tnext=find(v.sub(2))+2\r\n\tswitch v.get(1)\r\n\tcase '+'\r\n\t\treturn eval(v.sub(2,next)).toint+eval(v.sub(next,v.count-1)).toint\r\n\tcase '-'\r\n\t\treturn eval(v.sub(2,next)).toint-eval(v.sub(next,v.count-1)).toint\r\n\tcase '*'\r\n\t\treturn eval(v.sub(2,next)).toint*eval(v.sub(next,v.count-1)).toint\r\n\tcase '/'\r\n\t\treturn eval(v.sub(2,next)).toint/eval(v.sub(next,v.count-1)).toint\r\n\treturn ''\r\n}\r\n\r\nint find(rbuf<rstr>& v)\r\n{\r\n\treturn r_cond(v.get(0)=='(',find_sbk(v)+1,1)\r\n}\r\n\r\nint find_sbk(rbuf<rstr>& v)\r\n{\r\n\tcount=0\r\n\tfor i in v\r\n\t\tif '('==v[i]\r\n\t\t\t++count\r\n\t\tif ')'==v[i]\r\n\t\t\t--count\r\n\t\tif 0==count\r\n\t\t\treturn i\r\n\treturn v.count\r\n}\r\n\r\nrstr tokenize(rstr s)\r\n{\r\n\trstr ret\r\n\tfor i in s\r\n\t\tif s[i]==`(\r\n\t\t\tret+=' ( '\r\n\t\telif s[i]==`)\r\n\t\t\tret+=' ) '\r\n\t\telif s[i]==0xa||s[i]==0xd||s[i]==9\r\n\t\t\tret+=' '\r\n\t\telse\r\n\t\t\tret+=s[i]\r\n\treturn ret\r\n}"
  },
  {
    "path": "bin/example/run.h",
    "content": "﻿/*\r\n编译生成exe并运行\r\n*/\r\n\r\nimport rfile.h\r\nimport rdir.h\r\n\r\nmain\r\n{\r\n\tv=rf.get_param\r\n\tif v.count<3\r\n\t\tputsl('invaild param')\r\n\t\treturn\r\n\ta=v[2]\r\n\tif rf.cmd('rpp.exe -win '+a)==0\r\n\t\tputsl('compile error')\r\n\t\treturn\r\n\tb=rdir.get_real_name(a)\r\n\tif rf.cmd('nasm\\\\nasm.exe -f win32 '+b+'.asm -o '+b+'.obj')==0\r\n\t\tclear(b)\r\n\t\tputsl('asm error')\r\n\t\treturn\r\n\tcmd='nasm\\\\GoLink.exe /console /mix /entry _main '\r\n\tcmd+=b+'.obj msvcrt.dll ws2_32.dll kernel32.dll user32.dll'\r\n\tif rf.cmd(cmd)==0\r\n\t\tclear(b)\r\n\t\tputsl('link error')\r\n\t\treturn\r\n\tclear(b)\r\n\tif v.count==3\r\n\t\trf.cmd(b+'.exe')\r\n\telif v.count==4&&v.get(3)=='-build'\r\n\t\t;\r\n\telif v.count==4&&v.get(3)=='-del'\r\n\t\trf.cmd(b+'.exe')\r\n\t\tifn rfile.remove(rcode.gbk_to_utf8(b)+'.exe')\r\n\t\t\t;//很可能是由于golink没有关闭EXE导致无法删除\r\n\telif v.count==4&&v.get(3)=='-check'\r\n\t\tifn rfile.remove(rcode.gbk_to_utf8(b)+'.exe')\r\n\t\t\tputsl 'delete error'\r\n}\r\n\r\nclear(rstr b)\r\n{\r\n\tb=rcode.gbk_to_utf8(b)\r\n\trfile.remove(b+'.asm')\r\n\trfile.remove(b+'.obj')\r\n}"
  },
  {
    "path": "bin/example/snake.h",
    "content": "﻿/*\r\n彩色版控制台贪食蛇\r\n该游戏只能以解释模式或JIT模式运行\r\n*/\r\n\r\nint g_std_out\r\nrbuf<int> g_arr\r\nint g_next\r\nint g_food\r\n\r\nvoid main()\r\n{\r\nbegin:\r\n\tinit\t\r\n\tstart=rf.tick\r\n\tfor\r\n\t\tkey\r\n\t\tif rf.tick-start<100\r\n\t\t\tcontinue\r\n\t\tstart=rf.tick\r\n\t\tifn check\r\n\t\t\tgoto begin\r\n\t\tg_arr.push_front(g_arr[0]+g_next)\r\n\t\tif g_food!=g_arr[0]\r\n\t\t\tg_arr.pop\r\n\t\telse\r\n\t\t\tfood\r\n\t\tupdate\r\n}\r\n\r\nvoid update()\r\n{\r\n\tfor i=0 to 199\r\n\t\tgotoxy(i%10*2,i/10)\r\n\t\tif g_arr.exist(i)\r\n\t\t\tout(\"■\")\r\n\t\telif i==g_food\r\n\t\t\tout(\"★\")\r\n\t\telse\r\n\t\t\tputs(\"  \")\r\n}\r\n\r\nvoid init()\r\n{\r\n\trf.srand\r\n\tg_std_out=rf.GetStdHandle(-11)\r\n\tg_next=10\r\n\tg_arr.clear\r\n\tg_arr.push(105)\r\n\tfood\r\n\r\n\tCONSOLE_CURSOR_INFO cur_info\r\n\tcur_info.dwSize=1\r\n\tcur_info.bVisible=0\r\n\trf.SetConsoleCursorInfo(g_std_out,&cur_info)\r\n\trf.cmd(\"mode con cols=20 lines=22\")//保留一行留给输入法\r\n\r\n\trf.SetConsoleTextAttribute(g_std_out,0x0a)\r\n\tgotoxy(0,20)\r\n\tputs(\" ******************\")\t\r\n}\r\n\r\nvoid key()\r\n{\r\n\tif rf.GetAsyncKeyState(0x26)\r\n\t\ttemp=-10\r\n\telif rf.GetAsyncKeyState(0x28)\r\n\t\ttemp=10\r\n\telif rf.GetAsyncKeyState(0x25)\r\n\t\ttemp=-1\r\n\telif rf.GetAsyncKeyState(0x27)\r\n\t\ttemp=1\r\n\telse\r\n\t\treturn\r\n\tif g_arr.count<2||g_arr.get(1)!=g_arr.get(0)+temp\r\n\t\tg_next=temp\r\n}\r\n\r\nbool check()\r\n{\r\n\ttemp=g_arr[0]+g_next\r\n\tif temp<0||temp>199||int.abs(temp%10-g_arr[0]%10)>1||g_arr.exist(temp)\r\n\t\trf.MessageBoxA(0,('over len '+g_arr.count).cstr,\"\",0)\r\n\t\treturn false\r\n\treturn true\r\n}\r\n\r\nvoid food()\r\n{\r\n\tg_food=rf.rand()%200\r\n\tif g_arr.exist(g_food)\r\n\t\tfood\r\n}\r\n\r\nvoid out(char* s)\r\n{\r\n\tputs(rcode.utf8_to_gbk(s))\r\n}\r\n\r\nvoid gotoxy(int x,int y)\r\n{\r\n\tCOORD pos\r\n\tpos.x=x\r\n\tpos.y=y\r\n\trf.SetConsoleCursorPosition(g_std_out,*(&pos).to<int*>)\r\n}\r\n\r\nstruct CONSOLE_CURSOR_INFO\r\n{\r\n\tint dwSize\r\n\tbool bVisible\r\n}\r\n\r\nstruct COORD\r\n{\r\n\tushort x\r\n\tushort y\r\n}"
  },
  {
    "path": "bin/example/time.h",
    "content": "﻿main\r\n{\r\n\ts=getsl\r\n\tstart=rf.tick\r\n\trf.cmd(s)\r\n\tputsl\r\n\tputsl(rf.tick-start)\r\n}"
  },
  {
    "path": "bin/gl/1.h",
    "content": "﻿/*\r\n下面是编译期计算示例，sum是一个宏，计算从0加到N\r\n*/\r\n\r\nimport rpp.h\r\n\r\nvoid main()\r\n{\r\n\tputsl sum(100)//输出5050\r\n\tputsl sum(10)//输出55\r\n}\r\n\r\nmacro void sum(rbuf<tword>& v,int index)\r\n{\r\n\tresult=0\r\n\tparam=v.get(index+2).val.toint\r\n\tfor i=0;i<=param;i++\r\n\t\tresult+=i\r\n\tv[index].val=result\r\n\tfor i=1;i<=3;i++\r\n\t\tv[index+i].val.clear\r\n}"
  },
  {
    "path": "bin/gl/2.h",
    "content": "﻿/*\r\nRPP的macro具有和Lisp宏一样强大的表达能力\r\n这种宏可以用写代码对代码进行变换，这就比C语言的宏强大得多\r\n下面是变参宏示例\r\n注意macro只能是全局的\r\n*/\r\n\r\nimport rpp.h\r\n\r\nvoid main()\r\n{\r\n\tputsl sum(98,56)\r\n\tputsl sum(1,2,3,4)\r\n\tputsl sum(43,534,65,645,54,2)\r\n}\r\n\r\nmacro void sum(rbuf<tword>& v,int index)\r\n{\r\n\tleft=index+1\r\n\tright=find_symm_sbk(v,left)\r\n\tresult=0\r\n\tfor i=index+2;i<right;i+=2\r\n\t\tresult+=v[i].val.toint\r\n\tfor i=index;i<=right;i++\r\n\t\tv[i].val.clear\r\n\tv[index].val=result\r\n}"
  },
  {
    "path": "bin/gl/3.h",
    "content": "﻿/*\r\n可以发挥想象力定制奇特的宏，\r\n比如宏可以引用整个函数的单词并进行替换，\r\n也可以定制自己的控制结构\r\n*/\r\n\r\nimport rpp.h\r\n\r\nvoid main()\r\n{\r\n\t5 times putsl('hello');\r\n\tsum=0;\r\n\t10 times sum+=2;\r\n\tputsl sum;\r\n}\r\n\r\nmacro void times(rbuf<tword>& v,int index)\r\n{\r\n\tcount=v[index-1].val.toint\r\n\tfor i=index;i<v.count;i++\r\n\t\tif v[i].val==';'\r\n\t\t\tbreak\r\n\tend=i\r\n\tfor i=0;i<count;i++\r\n\t\tv[index].multi+=vword_to_vstr(v.sub(index+1,end+1))\r\n\tfor i=index-1;i<=end;i++\r\n\t\tv[i].val.clear\r\n}"
  },
  {
    "path": "bin/gl/frame.h",
    "content": "﻿\r\nimport carray.h\r\n\r\ndefine M3DVector3f carray<float,3>\r\ndefine M3DVector4f carray<float,4>\r\ndefine M3DMatrix44f carray<float,16>\r\n\r\nclass GLFrame\r\n{\r\n\tM3DVector3f vOrigin\r\n\tM3DVector3f vForward\r\n\tM3DVector3f vUp\r\n\t\r\n\tGLFrame()\r\n\t{\r\n\t\tvOrigin[0]=0.0f\r\n\t\tvOrigin[1]=0.0f\r\n\t\tvOrigin[2]=0.0f\r\n\t\tvUp[0]=0.0f\r\n\t\tvUp[1]=1.0f\r\n\t\tvUp[2]=0.0f\r\n\t\tvForward[0]=0.0f\r\n\t\tvForward[1]=0.0f\r\n\t\tvForward[2]=-1.0f\r\n\t}\r\n\t\r\n\tvoid MoveForward(float fDelta)\r\n\t{\r\n\t\tvOrigin[0]+=vForward[0]*fDelta\r\n\t\tvOrigin[1]+=vForward[1]*fDelta\r\n\t\tvOrigin[2]+=vForward[2]*fDelta\r\n\t}\r\n\t\r\n\tvoid MoveRight(float fDelta)\r\n\t{\r\n\t\tM3DVector3f vCross\r\n\t\tm3dCrossProduct(vCross,vUp,vForward)\r\n\t\r\n\t\tvOrigin[0]+=vCross[0]*fDelta\r\n\t\tvOrigin[1]+=vCross[1]*fDelta\r\n\t\tvOrigin[2]+=vCross[2]*fDelta\r\n\t}\r\n\t\r\n\tstatic void m3dGetPlaneEquation(M3DVector4f& planeEq,M3DVector3f& p1,\r\n\t\tM3DVector3f& p2,M3DVector3f& p3)\r\n\t{\r\n\t\tM3DVector3f v1\r\n\t\tM3DVector3f v2\r\n\t\t\r\n\t\tv1[0]=p3[0]-p1[0]\r\n\t\tv1[1]=p3[1]-p1[1]\r\n\t\tv1[2]=p3[2]-p1[2]\r\n\t\t\r\n\t\tv2[0]=p2[0]-p1[0]\r\n\t\tv2[1]=p2[1]-p1[1]\r\n\t\tv2[2]=p2[2]-p1[2]\r\n\t\t\r\n\t\tm3dCrossProduct(*(&planeEq).to<M3DVector3f*>,v1,v2)\r\n\t\tm3dNormalizeVector(*(&planeEq).to<M3DVector3f*>)\r\n\t\tplaneEq[3]=-(planeEq[0]*p3[0]+planeEq[1]*p3[1]+planeEq[2]*p3[2])\r\n\t}\r\n\t\r\n\tstatic float m3dGetVectorLengthSquared(M3DVector3f& u)\r\n\t{ \r\n\t\treturn(u[0]*u[0])+(u[1]*u[1])+(u[2]*u[2])\r\n\t}\r\n\t\r\n\tstatic float m3dGetVectorLength(M3DVector3f& u)\r\n\t{ \r\n\t\treturn FL(math.sqrt(double(m3dGetVectorLengthSquared(u)))) \r\n\t}\r\n\t\r\n\tstatic void m3dNormalizeVector(M3DVector3f& u)\r\n\t{ \r\n\t\tm3dScaleVector3(u,1.0f/m3dGetVectorLength(u)) \r\n\t}\r\n\t\r\n\tstatic void m3dScaleVector3(M3DVector3f& v,float scale) \r\n\t{ \r\n\t\tv[0]*=scale \r\n\t\tv[1]*=scale \r\n\t\tv[2]*=scale \r\n\t}\r\n\t\r\n\tstatic void m3dCrossProduct(M3DVector3f& result,M3DVector3f& u,M3DVector3f& v)\r\n\t{\r\n\t\tresult[0]=u[1]*v[2]-v[1]*u[2]\r\n\t\tresult[1]=-u[0]*v[2]+v[0]*u[2]\r\n\t\tresult[2]=u[0]*v[1]-v[0]*u[1]\r\n\t}\r\n\t\r\n\tvoid ApplyCameraTransform(bool bRotOnly=false) \r\n\t{\r\n\t\tM3DMatrix44f m\r\n\t\tGetCameraOrientation(m)\r\n\t\t@glMultMatrixf(&m)\r\n\t\tif(!bRotOnly)\r\n\t\t{\r\n\t\t\t@glTranslatef(-vOrigin[0],-vOrigin[1],-vOrigin[2])\r\n\t\t}\r\n\t}\r\n\t\r\n\tstatic void m3dMakePlanarShadowMatrix(\r\n\t\tM3DMatrix44f& proj,\r\n\t\tM3DVector4f& planeEq, \r\n\t\tM3DVector4f& vLightPos)\r\n\t{\t\r\n\t\tfloat a=planeEq[0]\r\n\t\tfloat b=planeEq[1]\r\n\t\tfloat c=planeEq[2]\r\n\t\tfloat d=planeEq[3]\r\n\t\r\n\t\tfloat dx=-vLightPos[0]\r\n\t\tfloat dy=-vLightPos[1]\r\n\t\tfloat dz=-vLightPos[2]\r\n\t\r\n\t\tproj[0]=b*dy+c*dz\r\n\t\tproj[1]=-a*dy\r\n\t\tproj[2]=-a*dz\r\n\t\tproj[3]=0.0\r\n\t\r\n\t\tproj[4]=-b*dx\r\n\t\tproj[5]=a*dx+c*dz\r\n\t\tproj[6]=-b*dz\r\n\t\tproj[7]=0.0\r\n\t\r\n\t\tproj[8]=-c*dx\r\n\t\tproj[9]=-c*dy\r\n\t\tproj[10]=a*dx+b*dy\r\n\t\tproj[11]=0.0\r\n\t\r\n\t\tproj[12]=-d*dx\r\n\t\tproj[13]=-d*dy\r\n\t\tproj[14]=-d*dz\r\n\t\tproj[15]=a*dx+b*dy+c*dz\r\n\t}\r\n\t\r\n\tmac M(row,col) m[col*4+row]\r\n\t\r\n\tvoid GetCameraOrientation(M3DMatrix44f& m)\r\n\t {\r\n\t\tM3DVector3f x\r\n\t\tM3DVector3f z\r\n\r\n\t\tz[0]=-vForward[0]\r\n\t\tz[1]=-vForward[1]\r\n\t\tz[2]=-vForward[2]\r\n\r\n\t\tm3dCrossProduct(x,vUp,z)\r\n\t\t\r\n\t\tM(0,0)=x[0]\r\n\t\tM(0,1)=x[1]\r\n\t\tM(0,2)=x[2]\r\n\t\tM(0,3)=0.0\r\n\t\tM(1,0)=vUp[0]\r\n\t\tM(1,1)=vUp[1]\r\n\t\tM(1,2)=vUp[2]\r\n\t\tM(1,3)=0.0\r\n\t\tM(2,0)=z[0]\r\n\t\tM(2,1)=z[1]\r\n\t\tM(2,2)=z[2]\r\n\t\tM(2,3)=0.0\r\n\t\tM(3,0)=0.0\r\n\t\tM(3,1)=0.0\r\n\t\tM(3,2)=0.0\r\n\t\tM(3,3)=1.0\r\n\t }\r\n}"
  },
  {
    "path": "bin/gl/gl.h",
    "content": "﻿\r\nvoid init_glut()\r\n{\r\n\tv=rf.get_param\r\n\tnum=v.count\r\n\trbuf<char*> argv\r\n\tfor i=0;i<v.count;i++\r\n\t\targv.push(v[i].cstr)\r\n\r\n\t@glutInit(&num,argv.begin)\r\n}\r\n\r\nmac FL(a) double(a).tofloat\r\n\r\nmac D8(a) \r\n{\r\n\t*(&(a)).to<int*>,*((&(a)).to<int*>+1)\r\n}\r\n\r\nmac cd_protect\r\n{\r\n\tpush ebx;\r\n\tpush esi;\r\n\tpush edi;\r\n}\r\n\r\nmac cd_ret\r\n{\r\n\tpop edi;\r\n\tpop esi;\r\n\tpop ebx;\r\n\tpop ebp;\r\n\tretn;\r\n}\r\n\r\nmac GL_PI 3.1415926\r\n\r\n#define GL_POINTS 0x0000\r\n#define GL_LINES 0x0001\r\n#define GL_MODELVIEW 0x1700\r\n#define GL_PROJECTION 0x1701\r\n#define GLfloat float\r\n\r\n#define GL_COLOR_BUFFER_BIT 0x00004000\r\n#define GL_DEPTH_BUFFER_BIT 0x00000100\r\n\r\n#define GLUT_KEY_F1 0x0001\r\n#define GLUT_KEY_F2 0x0002\r\n#define GLUT_KEY_F3 0x0003\r\n#define GLUT_KEY_F4 0x0004\r\n#define GLUT_KEY_F5 0x0005\r\n#define GLUT_KEY_F6 0x0006\r\n#define GLUT_KEY_F7 0x0007\r\n#define GLUT_KEY_F8 0x0008\r\n#define GLUT_KEY_F9 0x0009\r\n#define GLUT_KEY_F10 0x000A\r\n#define GLUT_KEY_F11 0x000B\r\n#define GLUT_KEY_F12 0x000C\r\n#define GLUT_KEY_LEFT 0x0064\r\n#define GLUT_KEY_UP 0x0065\r\n#define GLUT_KEY_RIGHT 0x0066\r\n#define GLUT_KEY_DOWN 0x0067\r\n#define GLUT_KEY_PAGE_UP 0x0068\r\n#define GLUT_KEY_PAGE_DOWN 0x0069\r\n#define GLUT_KEY_HOME 0x006A\r\n#define GLUT_KEY_END 0x006B\r\n#define GLUT_KEY_INSERT 0x006C\r\n\r\n#define GLUT_LEFT_BUTTON 0x0000\r\n#define GLUT_MIDDLE_BUTTON 0x0001\r\n#define GLUT_RIGHT_BUTTON 0x0002\r\n#define GLUT_DOWN 0x0000\r\n#define GLUT_UP 0x0001\r\n#define GLUT_LEFT 0x0000\r\n#define GLUT_ENTERED 0x0001\r\n\r\n#define GLUT_RGB 0x0000\r\n#define GLUT_RGBA 0x0000\r\n#define GLUT_INDEX 0x0001\r\n#define GLUT_SINGLE 0x0000\r\n#define GLUT_DOUBLE 0x0002\r\n#define GLUT_ACCUM 0x0004\r\n#define GLUT_ALPHA 0x0008\r\n#define GLUT_DEPTH 0x0010\r\n#define GLUT_STENCIL 0x0020\r\n#define GLUT_MULTISAMPLE 0x0080\r\n#define GLUT_STEREO 0x0100\r\n#define GLUT_LUMINANCE 0x0200\r\n\r\n#define GLUT_MENU_NOT_IN_USE 0x0000\r\n#define GLUT_MENU_IN_USE 0x0001\r\n#define GLUT_NOT_VISIBLE 0x0000\r\n#define GLUT_VISIBLE 0x0001\r\n#define GLUT_HIDDEN 0x0000\r\n#define GLUT_FULLY_RETAINED 0x0001\r\n#define GLUT_PARTIALLY_RETAINED 0x0002\r\n#define GLUT_FULLY_COVERED 0x0003\r\n\r\n#define GL_LIGHT0 0x4000\r\n#define GL_LIGHT1 0x4001\r\n#define GL_LIGHT2 0x4002\r\n#define GL_LIGHT3 0x4003\r\n#define GL_LIGHT4 0x4004\r\n#define GL_LIGHT5 0x4005\r\n#define GL_LIGHT6 0x4006\r\n#define GL_LIGHT7 0x4007\r\n\r\n#define GL_AMBIENT 0x1200\r\n#define GL_DIFFUSE 0x1201\r\n#define GL_SPECULAR 0x1202\r\n#define GL_POSITION 0x1203\r\n#define GL_SPOT_DIRECTION 0x1204\r\n#define GL_SPOT_EXPONENT 0x1205\r\n#define GL_SPOT_CUTOFF 0x1206\r\n#define GL_CONSTANT_ATTENUATION 0x1207\r\n#define GL_LINEAR_ATTENUATION 0x1208\r\n#define GL_QUADRATIC_ATTENUATION 0x1209\r\n\r\n#define GL_DEPTH_TEST 0x0B71\r\n#define GL_LIGHTING 0x0B50\r\n\r\n#define GL_FRONT 0x0404\r\n#define GL_BACK 0x0405\r\n#define GL_CCW 0x0901\r\n#define GL_CULL_FACE 0x0B44\r\n#define GL_LIGHT_MODEL_AMBIENT 0x0B53\r\n#define GL_COLOR_MATERIAL 0x0B57\r\n#define GL_AMBIENT_AND_DIFFUSE 0x1602\r\n#define GL_SHININESS 0x1601"
  },
  {
    "path": "bin/gl/line.h",
    "content": "﻿/*\r\nRPP for OpenGL\r\n使用上下左右旋转，代码摘自《OpenGL超级宝典》\r\n该例子只能以JIT模式运行，并且需要最新的显卡驱动\r\n运行命令：rjit gl\\line.h\r\n*/\r\n\r\nimport math.h\r\nimport gl.h\r\n\r\ndouble g_x\r\ndouble g_y\r\n\r\nvoid main()\r\n{\r\n\tg_x=0\r\n\tg_y=0\r\n\t\r\n\tvoid* handle=@LoadLibraryA(\"gl/freeglut.dll\")\r\n\tif handle==null\r\n\t\treturn\r\n\tvoid[rf.find_dll(\"set_dll_list\")]\r\n\t\r\n\tinit_glut\r\n\t@glutInitWindowSize(800,600)\r\n\t@glutCreateWindow(\"line\")\r\n\t@glutInitDisplayMode(ORM[GLUT_DOUBLE,GLUT_RGBA,GLUT_DEPTH])\r\n\t@glutDisplayFunc(&render)\r\n\t\r\n\t@glutSpecialFunc(lambda(int key,int x,int y){\r\n\t\tcd_protect\r\n\t\tinput(key,x,y)\r\n\t\tcd_ret\r\n\t})\r\n\t@glutReshapeFunc(lambda(int w,int h){\r\n\t\tcd_protect\r\n\t\tchange(w,h)\r\n\t\tcd_ret\r\n\t})\r\n\t\r\n\tinit()\r\n\t\r\n\t@glutMainLoop()\r\n\t\r\n\t@FreeLibrary(handle)\r\n}\r\n\r\ncfunc void render()\r\n{\r\n\t@glClear(GL_COLOR_BUFFER_BIT)\r\n\t@glPushMatrix()\r\n\t@glRotatef(FL(g_x),1.0f,0.0f,0.0f)\r\n\t@glRotatef(FL(g_y),0.0f,1.0f,0.0f)\r\n\r\n\t@glBegin(GL_LINES)\r\n\tz=0.0\r\n\tfor angle=0.0;angle<=GL_PI;angle+=GL_PI/20.0\r\n\t\tx=50.0*math.sin(angle)\r\n\t\ty=50.0*math.cos(angle)\r\n\t\t@glVertex3f(FL(x),FL(y),FL(z))\r\n\t\tx=50.0*math.sin(angle+GL_PI)\r\n\t\ty=50.0*math.cos(angle+GL_PI)\t\r\n\t\t@glVertex3f(FL(x),FL(y),FL(z))\r\n\t@glEnd()\r\n\t\r\n\t@glPopMatrix()\r\n\t@glutSwapBuffers()\r\n}\r\n\r\nvoid input(int key,int x,int y)\r\n{\r\n\tswitch key\r\n\tcase GLUT_KEY_UP\r\n\t\tg_x-=5.0\r\n\tcase GLUT_KEY_DOWN\r\n\t\tg_x+=5.0\r\n\tcase GLUT_KEY_LEFT\r\n\t\tg_y-=5.0\r\n\tcase GLUT_KEY_RIGHT\r\n\t\tg_y+=5.0\r\n\t@glutPostRedisplay()\r\n}\r\n\r\nvoid change(int w,int h)\r\n{\r\n\trange=100.0\r\n\tif h==0\r\n\t\th=1\r\n\t@glViewport(0,0,w,h)\r\n\t@glMatrixMode(GL_PROJECTION)\r\n\t@glLoadIdentity()\r\n\tif w<=h\r\n\t\t@glOrtho(D8(-range),D8(range),D8(-range*h/w),\r\n\t\t\tD8(range*h/w),D8(-range),D8(range))\r\n\telse\r\n\t\t@glOrtho(D8(-range*w/h),D8(range*w/h),D8(-range),\r\n\t\t\tD8(range),D8(-range),D8(range))\r\n\t@glMatrixMode(GL_MODELVIEW)\r\n\t@glLoadIdentity()\r\n}\r\n\r\nvoid init()\r\n{\r\n\t@glClearColor(0.0f,0.0f,0.0f,0.0f)\r\n\t@glColor3f(0.0f,1.0f,0.0f)\r\n}"
  },
  {
    "path": "bin/gl/sphere.h",
    "content": "﻿/*\r\nRPP for OpenGL\r\n使用上下左右移动，代码摘自《OpenGL超级宝典》\r\n该例子只能以JIT模式运行，并且需要最新的显卡驱动\r\n运行命令：rjit gl\\sphere.h\r\n*/\r\n\r\nimport math.h\r\nimport gl.h\r\nimport frame.h\r\n\r\nM3DMatrix44f g_shadow_matrix\r\nGLFrame g_camera\r\ndouble g_y\r\ncarray<float,4> g_light_pos\r\ncarray<float,4> g_no_light\r\ncarray<float,4> g_low_light\r\ncarray<float,4> g_bright_light\r\n\r\nvoid main()\r\n{\r\n\tg_y=0\r\n\tg_light_pos=array<float>[-100.0f, 100.0f, 50.0f, 1.0f]\r\n\tg_no_light=array<float>[0.0f, 0.0f, 0.0f, 0.0f]\r\n\tg_low_light=array<float>[0.25f, 0.25f, 0.25f, 1.0f]\r\n\tg_bright_light=array<float>[1.0f, 1.0f, 1.0f, 1.0f]\r\n\t\r\n\tvoid* handle=@LoadLibraryA(\"gl/freeglut.dll\")\r\n\tif handle==null\r\n\t\treturn\r\n\tvoid[rf.find_dll(\"set_dll_list\")]\r\n\t\r\n\tinit_glut\r\n\t@glutInitWindowSize(800,600)\r\n\t@glutCreateWindow(\"sphere\")\r\n\t@glutInitDisplayMode(ORM[GLUT_DOUBLE,GLUT_RGBA,GLUT_DEPTH])\r\n\t@glutDisplayFunc(&render)\r\n\t\r\n\t@glutSpecialFunc(lambda(int key,int x,int y){\r\n\t\tcd_protect\r\n\t\tinput(key,x,y)\r\n\t\tcd_ret\r\n\t})\r\n\t@glutReshapeFunc(lambda(int w,int h){\r\n\t\tcd_protect\r\n\t\tchange(w,h)\r\n\t\tcd_ret\r\n\t})\r\n\t\r\n\tinit()\r\n\t\r\n\t@glutMainLoop()\r\n\t\r\n\t@FreeLibrary(handle)\r\n}\r\n\r\nvoid draw(int shadow)\r\n{\r\n\tif shadow==0\r\n\t\tg_y+=0.3f\r\n\telse\r\n\t\t@glColor3f(0.0f,0.0f,0.0f)\r\n\tif shadow==0\r\n\t\t@glColor3f(0.0f,1.0f,0.0f)\r\n\t@glPushMatrix()\r\n\t@glTranslatef(0.0f,0.1f,-2.5f)\r\n\tif shadow==0\r\n\t\t@glColor3f(0.0f,0.0f,1.0f)\r\n\t\r\n\t@glPushMatrix()\r\n\t@glRotatef(FL(-g_y*2.0f),0.0f,1.0f,0.0f)\r\n\t@glTranslatef(1.0f,0.0f,0.0f)\r\n\t@glutWireTorus(D8(0.1),D8(0.1),17,9)\r\n\t@glPopMatrix()\r\n\t\r\n\tif shadow==0\r\n\t\t@glColor3f(0.0f,1.0f,0.0f)\r\n\t\t@glMaterialfv(GL_FRONT,GL_SPECULAR,&g_bright_light)\r\n\t@glRotatef(g_y.tofloat,0.0f,1.0f,0.0f)\r\n\t@glutWireTorus(D8(0.15),D8(0.35),61,37)\r\n\t@glMaterialfv(GL_FRONT,GL_SPECULAR,&g_no_light)\r\n\t@glPopMatrix()\r\n}\r\n\r\ncfunc void render()\r\n{\r\n\t@glClear(ORM[GL_COLOR_BUFFER_BIT,GL_DEPTH_BUFFER_BIT])\r\n\t@glPushMatrix()\r\n\tg_camera.ApplyCameraTransform()\r\n\t\r\n\t@glLightfv(GL_LIGHT0,GL_POSITION,&g_light_pos)\r\n\t\r\n\t@glColor3f(0.60f,0.40f,0.10f)\r\n\t\r\n\t@glDisable(GL_DEPTH_TEST)\r\n\t@glDisable(GL_LIGHTING)\r\n\t@glPushMatrix()\r\n\t@glMultMatrixf(&g_shadow_matrix)\r\n\t\r\n\tdraw(1)\r\n\t\r\n\t@glPopMatrix()\r\n\t@glEnable(GL_LIGHTING)\r\n\t@glEnable(GL_DEPTH_TEST)\r\n\t\r\n\tdraw(0)\r\n\t@glPopMatrix()\r\n\t@glutSwapBuffers()\r\n\t@glutPostRedisplay()\r\n}\r\n\r\nvoid input(int key,int x,int y)\r\n{\r\n\tswitch key\r\n\tcase GLUT_KEY_UP\r\n\t\tg_camera.MoveForward(0.1f)\r\n\tcase GLUT_KEY_DOWN\r\n\t\tg_camera.MoveForward(-0.1f)\r\n\tcase GLUT_KEY_LEFT\r\n\t\tg_camera.MoveRight(0.1f)\r\n\tcase GLUT_KEY_RIGHT\r\n\t\tg_camera.MoveRight(-0.1f)\r\n\t@glutPostRedisplay()\r\n}\r\n\r\nvoid change(int w,int h)\r\n{\r\n\tif h==0\r\n\t\th=1\r\n\t@glViewport(0,0,w,h)\r\n\t@glMatrixMode(GL_PROJECTION)\r\n\t@glLoadIdentity()\r\n\t@gluPerspective(D8(35.0),D8(double(w)/h),D8(1.0f),D8(50.0f))\r\n\t@glMatrixMode(GL_MODELVIEW)\r\n\t@glLoadIdentity()\r\n}\r\n\r\nvoid init()\r\n{\r\n\tM3DVector3f vPoints0=array<float>[0.0f,-0.4f,0.0f]\r\n\tM3DVector3f vPoints1=array<float>[10.0f,-0.4f,0.0f]\r\n\tM3DVector3f vPoints2=array<float>[5.0f,-0.4f,-5.0f]\r\n\r\n\t@glClearColor(g_low_light[0],g_low_light[1],g_low_light[2],g_low_light[3])\r\n\t\r\n\t@glCullFace(GL_BACK)\r\n\t@glFrontFace(GL_CCW)\r\n\t@glEnable(GL_CULL_FACE)\r\n\t@glEnable(GL_DEPTH_TEST)\r\n\t\r\n\t@glLightModelfv(GL_LIGHT_MODEL_AMBIENT,&g_no_light)\r\n\t@glLightfv(GL_LIGHT0,GL_AMBIENT,&g_low_light)\r\n\t@glLightfv(GL_LIGHT0,GL_DIFFUSE,&g_bright_light)\r\n\t@glLightfv(GL_LIGHT0,GL_SPECULAR,&g_bright_light)\r\n\t@glEnable(GL_LIGHTING)\r\n\t@glEnable(GL_LIGHT0)\r\n\r\n\tM3DVector4f vPlaneEquation\r\n\tGLFrame.m3dGetPlaneEquation(vPlaneEquation,vPoints0,vPoints1,vPoints2)\r\n\r\n\tGLFrame.m3dMakePlanarShadowMatrix(g_shadow_matrix,vPlaneEquation,g_light_pos)\r\n\r\n\t@glEnable(GL_COLOR_MATERIAL)\r\n\t@glColorMaterial(GL_FRONT,GL_AMBIENT_AND_DIFFUSE)\r\n\t@glMateriali(GL_FRONT,GL_SHININESS,128)\r\n}"
  },
  {
    "path": "bin/ide/License.txt",
    "content": "License for Scintilla and SciTE\n\nCopyright 1998-2003 by Neil Hodgson <neilh@scintilla.org>\n\nAll Rights Reserved \n\nPermission to use, copy, modify, and distribute this software and its \ndocumentation for any purpose and without fee is hereby granted, \nprovided that the above copyright notice appear in all copies and that \nboth that copyright notice and this permission notice appear in \nsupporting documentation. \n\nNEIL HODGSON DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS \nSOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY \nAND FITNESS, IN NO EVENT SHALL NEIL HODGSON BE LIABLE FOR ANY \nSPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES \nWHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, \nWHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER \nTORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE \nOR PERFORMANCE OF THIS SOFTWARE. "
  },
  {
    "path": "bin/ide/SciTE.properties",
    "content": "# SciTE.properties is the per directory local options file and can be used to\r\n# override settings made in SciTEGlobal.properties, SciTEUser.properties and\r\n# SciTEDirectory.properties.\r\ncommand.build.directory.*.cxx=..\\win32\r\ncommand.build.directory.*.h=..\\win32\r\ncommand.build.*.cxx=nmake -f scite.mak DEBUG=1 QUIET=1\r\ncommand.build.*.h=nmake -f scite.mak DEBUG=1 QUIET=1\r\ncommand.go.*.cxx=..\\bin\\SciTE\r\ncommand.go.*.h=..\\bin\\SciTE\r\ncommand.go.needs.*.cxx=cmd /c cd ..\\win32 && nmake -f scite.mak DEBUG=1 QUIET=1\r\n"
  },
  {
    "path": "bin/ide/SciTEGlobal.properties",
    "content": "# Global initialisation file for SciTE\r\n# For Linux, place in $prefix/share/scite\r\n# For Windows, place in same directory as SciTE.EXE (or Sc1.EXE)\r\n# Documentation at http://www.scintilla.org/SciTEDoc.html\r\n\r\n# Globals\r\n\r\n# Window sizes and visibility\r\nif PLAT_WIN\r\n\tposition.left=0\r\n\tposition.top=0\r\nif PLAT_GTK\r\n\tposition.left=5\r\n\tposition.top=22\r\nposition.width=576\r\nposition.height=740\r\n#position.maximize=1\r\n#position.tile=1\r\n#full.screen.hides.menu=1\r\n#minimize.to.tray=1\r\nsplit.vertical=0\r\n#output.horizontal.size=200\r\n#output.vertical.size=60\r\n#output.initial.hide=1\r\n#horizontal.scrollbar=0\r\n#horizontal.scroll.width=10000\r\n#horizontal.scroll.width.tracking=0\r\n#output.horizontal.scrollbar=0\r\n#output.horizontal.scroll.width=10000\r\n#output.horizontal.scroll.width.tracking=0\r\n#output.scroll=0\r\n#error.select.line=1\r\n#end.at.last.line=0\r\ntabbar.visible=1\r\n#tabbar.hide.one=1\r\n#tabbar.multiline=1\r\n#toolbar.visible=1\r\n#toolbar.usestockicons=1\r\n#toolbar.large=1\r\n#menubar.detachable=1\r\n#undo.redo.lazy=1\r\nstatusbar.visible=1\r\n#fileselector.width=800\r\n#fileselector.height=600\r\n#fileselector.show.hidden=1\r\n#magnification=-1\r\n#output.magnification=-1\r\n\r\n# Sizes and visibility in edit pane\r\nline.margin.visible=1\r\nline.margin.width=4\r\nmargin.width=16\r\n#fold.margin.width=16\r\n#fold.margin.colour=#FF0000\r\n#fold.margin.highlight.colour=#0000FF\r\n#blank.margin.left=4\r\n#blank.margin.right=4\r\nbuffered.draw=1\r\n#phases.draw=2\r\nif PLAT_WIN\r\n\ttechnology=1\r\n#font.quality=3\r\nif PLAT_MAC\r\n\tfont.quality=3\r\n\r\n# Element styles\r\n#view.eol=1\r\n#control.char.symbol=.\r\ncaret.period=500\r\nview.whitespace=0\r\nview.indentation.whitespace=1\r\nview.indentation.guides=1\r\nview.indentation.examine=3\r\nhighlight.indentation.guides=1\r\n#caret.fore=#FF0000\r\n#caret.additional.blinks=0\r\n#caret.width=2\r\n#caret.line.back=#FFFED8\r\n#caret.line.back.alpha=63\r\nedge.column=200\r\nedge.mode=0\r\nedge.colour=#C0DCC0\r\nbraces.check=1\r\nbraces.sloppy=1\r\n#selection.fore=#006000\r\n# DADADA used as background because it yields standard silver C0C0C0\r\n# on low colour displays and a reasonable light grey on higher bit depths\r\nif PLAT_WINNT\r\n\tselection.alpha=32\r\n\tselection.back=#000000\r\nif PLAT_GTK\r\n\tselection.alpha=30\r\n\tselection.back=#000000\r\nif PLAT_MAC\r\n\tselection.alpha=32\r\n\tselection.back=#000000\r\n#selection.additional.fore=#0000A0\r\n#selection.additional.back=#000080\r\n#selection.additional.alpha=20\r\n#selection.rectangular.switch.mouse=1\r\n#selection.multiple=0\r\n#selection.additional.typing=0\r\n#virtual.space=3\r\n#rectangular.selection.modifier=4\r\n#whitespace.fore=#FF0000\r\n#whitespace.back=#FFF0F0\r\n#error.marker.fore=#0000A0\r\n#error.marker.back=#DADAFF\r\n#error.inline=1\r\nbookmark.fore=#BE0000\r\n#bookmark.back=#FFFFA0\r\n#bookmark.alpha=\r\n#find.mark=#0000FF\r\n#find.mark.indicator=style:compositionthick,colour:#FFB700,under\r\n#highlight.current.word=1\r\n#highlight.current.word.by.style=1\r\n#highlight.current.word.colour=#00D040\r\n#highlight.current.word.indicator=style:roundbox,colour:#0080FF,under,outlinealpha:140,fillalpha:80\r\n#indicators.alpha=63\r\n#indicators.under=1\r\n\r\n# Scripting\r\next.lua.startup.script=$(SciteUserHome)/SciTEStartup.lua\r\next.lua.auto.reload=1\r\n#ext.lua.reset=1\r\n\r\n# Checking\r\nare.you.sure=1\r\n#are.you.sure.for.build=1\r\n#save.all.for.build=1\r\n#quit.on.close.last=1\r\n#load.on.activate=1\r\n#save.on.deactivate=1\r\n#are.you.sure.on.reload=1\r\n#save.on.timer=20\r\n#reload.preserves.undo=1\r\n#check.if.already.open=1\r\n#temp.files.sync.load=1\r\ndefault.file.ext=.cxx\r\n#source.default.extensions=.h|.cxx|.bat\r\n#title.full.path=1\r\n#title.show.buffers=1\r\n#pathbar.visible=1\r\n#save.recent=1\r\n#save.session=1\r\n#session.bookmarks=1\r\n#session.folds=1\r\n#save.position=1\r\n#save.find=1\r\n#open.dialog.in.file.directory=1\r\n#strip.trailing.spaces=1\r\n#ensure.final.line.end=1\r\n#ensure.consistent.line.ends=1\r\n#save.deletes.first=1\r\n#save.check.modified.time=1\r\nbuffers=40\r\n#buffers.zorder.switching=1\r\napi.*=$(SciteDefaultHome)\\modules.api\r\n#locale.properties=locale.de.properties\r\n#translation.missing=***\r\n#read.only=1\r\n#background.open.size=20000\r\n#background.save.size=20000\r\nif PLAT_GTK\r\n\tbackground.save.size=10000000\r\n#max.file.size=1\r\n\r\n# Indentation\r\ntabsize=8\r\nindent.size=8\r\nuse.tabs=1\r\nindent.auto=1\r\nindent.automatic=1\r\nindent.opening=0\r\nindent.closing=0\r\n#tab.indents=0\r\n#backspace.unindents=0\r\n\r\n# Wrapping of long lines\r\nwrap=1\r\nwrap.style=2\r\ncache.layout=3\r\noutput.wrap=1\r\noutput.cache.layout=3\r\n#wrap.visual.flags=3\r\n#wrap.visual.flags.location=3\r\n#wrap.indent.mode=1\r\n#wrap.visual.startindent=4\r\n\r\n# Folding\r\n# enable folding, and show lines below when collapsed.\r\nfold=1\r\nfold.compact=1\r\nfold.flags=16\r\nfold.symbols=1\r\n#fold.highlight=1\r\n#fold.highlight.colour=#00C0C0\r\n#fold.on.open=1\r\nfold.comment=1\r\nfold.preprocessor=1\r\n\r\n# Find and Replace\r\n# Internal search always available with recursive capability so use in preference to external tool\r\nfind.command=\r\n# findstr is available on recent versions of Windows including 2000\r\n#if PLAT_WIN\r\n#\tfind.command=findstr /n /s $(find.what) $(find.files)\r\n#find.input=$(find.what)\r\n#if PLAT_GTK\r\n#\tfind.command=grep --line-number \"$(find.what)\" $(find.files)\r\nfind.files=*.c *.cxx *.h\r\n#find.in.files.close.on.find=0\r\n#find.in.dot=1\r\n#find.in.binary=1\r\n#find.in.directory=\r\n#find.close.on.find=0\r\n#find.replace.matchcase=1\r\n#find.replace.escapes=1\r\n#find.replace.regexp=1\r\n#find.replace.regexp.posix=1\r\n#find.replace.wrap=0\r\n#find.replacewith.focus=0\r\n#find.replace.advanced=1\r\nfind.use.strip=1\r\n#find.strip.incremental=1\r\n#find.indicator.incremental=style:compositionthick,colour:#FFB700,under\r\nreplace.use.strip=1\r\n#replace.strip.incremental=1\r\n#strip.button.height=24\r\n\r\n# Behaviour\r\n#eol.mode=LF\r\neol.auto=1\r\nclear.before.execute=0\r\n#vc.home.key=1\r\n#wrap.aware.home.end.keys=1\r\nautocompleteword.automatic=1\r\n#autocomplete.choose.single=1\r\n#autocomplete.*.fillups=([\r\nword.chars.d=.$(chars.alpha)$(chars.numeric)_#\r\nautocomplete.*.start.characters=$(word.chars.d)\r\ncaret.policy.xslop=1\r\ncaret.policy.width=20\r\ncaret.policy.xstrict=0\r\ncaret.policy.xeven=0\r\ncaret.policy.xjumps=0\r\ncaret.policy.yslop=1\r\ncaret.policy.lines=1\r\ncaret.policy.ystrict=1\r\ncaret.policy.yeven=1\r\ncaret.policy.yjumps=0\r\n#visible.policy.strict=1\r\n#visible.policy.slop=1\r\n#visible.policy.lines=4\r\n#time.commands=1\r\n#caret.sticky=1\r\n#properties.directory.enable=1\r\n\r\n# Status Bar\r\nstatusbar.number=4\r\nstatusbar.text.1=\\\r\nli=$(LineNumber) co=$(ColumnNumber) $(OverType) ($(EOLMode)) $(FileAttr)\r\nstatusbar.text.2=\\\r\n$(BufferLength) chars in $(NbOfLines) lines. Sel: $(SelLength) chars.\r\nstatusbar.text.3=\\\r\nNow is: Date=$(CurrentDate) Time=$(CurrentTime)\r\nstatusbar.text.4=\\\r\n$(FileNameExt) : $(FileDate) - $(FileTime) | $(FileAttr)\r\n\r\nif PLAT_WIN\r\n\tcommand.scite.help=\"file://$(SciteDefaultHome)\\SciTEDoc.html\"\r\n\tcommand.scite.help.subsystem=2\r\nif PLAT_GTK\r\n\tcommand.print.*=a2ps \"$(FileNameExt)\"\r\n\tcommand.scite.help=xdg-open \"file://$(SciteDefaultHome)/SciTEDoc.html\"\r\n\r\n# Internationalisation\r\n# Japanese input code page 932 and ShiftJIS character set 128\r\n#code.page=932\r\n#character.set=128\r\n# Unicode\r\ncode.page=65001\r\n#code.page=936\r\ncharacter.set=132\r\n#command.discover.properties=python /home/user/FileDetect.py \"$(FilePath)\"\r\n# Required for Unicode to work on GTK+:\r\n#LC_CTYPE=en_US.UTF-8\r\nif PLAT_GTK\r\n\toutput.code.page=65001\r\nif PLAT_MAC\r\n\toutput.code.page=65001\r\n\r\n# Export\r\n#export.keep.ext=1\r\nexport.html.wysiwyg=1\r\n#export.html.tabs=1\r\n#export.html.folding=1\r\nexport.html.styleused=1\r\n#export.html.title.fullpath=1\r\n#export.rtf.tabs=1\r\n#export.rtf.font.face=Arial\r\n#export.rtf.font.size=9\r\n#export.rtf.tabsize=8\r\n#export.rtf.wysiwyg=0\r\n#export.tex.title.fullpath=1\r\n# Magnification (added to default screen font size)\r\nexport.pdf.magnification=0\r\n# Font: Courier, Helvetica or Times (Courier line-wraps)\r\nexport.pdf.font=Helvetica\r\n# Page size (in points): width, height\r\n# E.g. Letter 612,792; A4 595,842; maximum 14400,14400\r\nexport.pdf.pagesize=595,842\r\n# Margins (in points): left, right, top, bottom\r\nexport.pdf.margins=72,72,72,72\r\nexport.xml.collapse.spaces=1\r\nexport.xml.collapse.lines=1\r\n\r\n# Define values for use in the imported properties files\r\nchars.alpha=abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ\r\nchars.numeric=0123456789\r\nchars.accented=\r\n# This is a better set for Russian:\r\n#chars.accented=娸\r\n\r\n# The open.filter setting is used in the file selector which has a menu of filters to apply\r\n# to the types of files seen when opening.\r\n# There is a limit (possibly 256 characters) to the length of a filter on Windows,\r\n# so not all source extensions can be in this setting.\r\nsource.files=*.asm;*.c;*.cc;*.cpp;*.cxx;*.cs;*.h;*.hh;*.hxx;*.hpp;\\\r\n*.idl;*.odl;*.rc;*.rc2;*.dlg;*.def;\\\r\n*.vb;*.vbs;*.bas;*.frm;*.cls;*.ctl;\\\r\n*.java;*.js;*.py;*.pyw;*.pl;*.rb;*.cgi;*.lua;*.conf;\\\r\nmake*;*.mak;\\\r\n*.properties;*.html;*.xml;*.iface;*.bat;*.e;*.m;*.mm;\\\r\n*.sh;*.patch\r\n\r\n# Each platform has a different idea of the most important filters\r\nif PLAT_WIN\r\n\tall.files=All Files (*.*)|*.*|\r\n\ttop.filters=All Source|$(source.files)|$(all.files)\r\nif PLAT_GTK\r\n\tall.files=All Files (*)|*|Hidden Files (.*)|.*|\r\n\ttop.filters=All Source|$(source.files)|$(all.files)\r\n# As OS X only greys out filtered files, show all as default\r\nif PLAT_MAC\r\n\tall.files=All Files (*.*)|*.*|\r\n\ttop.filters=$(all.files)All Source|$(source.files)|\r\n\r\nopen.filter=\\\r\n$(top.filters)\\\r\n$(filter.ada)\\\r\n$(filter.conf)\\\r\n$(filter.asm)\\\r\n$(filter.asn1)\\\r\n$(filter.ave)\\\r\n$(filter.baan)\\\r\n$(filter.bash)\\\r\n$(filter.caml)\\\r\n$(filter.cmake)\\\r\n$(filter.cpp)\\\r\n#$(filter.ch)\\\r\n$(filter.css)\\\r\n$(filter.d)\\\r\n$(filter.eiffel)\\\r\n$(filter.erlang)\\\r\n$(filter.fortran)\\\r\n$(filter.gap)\\\r\n#$(filter.hs)\\\r\n$(filter.idl)\\\r\n$(filter.inno)\\\r\n$(filter.java)\\\r\n$(filter.js)\\\r\n$(filter.kix)\\\r\n$(filter.lout)\\\r\n$(filter.lua)\\\r\n$(filter.matlab)\\\r\n$(filter.metapost)\\\r\n$(filter.mmixal)\\\r\n#$(filter.modula3)\\\r\n$(filter.nncrontab)\\\r\n$(filter.nsis)\\\r\n$(filter.opal)\\\r\n$(filter.pascal)\\\r\n$(filter.perl)\\\r\n$(filter.php)\\\r\n$(filter.pov)\\\r\n$(filter.powershell)\\\r\n$(filter.prg)\\\r\n$(filter.properties)\\\r\n$(filter.ps)\\\r\n$(filter.python)\\\r\n$(filter.r)\\\r\n$(filter.ruby)\\\r\n#$(filter.rust)\\\r\n$(filter.sql)\\\r\n$(filter.specman)\\\r\n$(filter.tcl)\\\r\n$(filter.tex)\\\r\n$(filter.text)\\\r\n$(filter.txt2tags)\\\r\n$(filter.vb)\\\r\n$(filter.web)\\\r\n$(filter.yaml)\\\r\n$(filter.verilog)\\\r\n$(filter.vhdl)\r\n\r\n#save.filter=$(open.filter)\r\n\r\n# Give symbolic names to the set of fonts used in the standard styles.\r\nif PLAT_WIN\r\n\tfont.base=font:Verdana,size:13\r\n\tfont.small=font:Verdana,size:13\r\n\tfont.comment=font:Georgia,size:10.1\r\n\tfont.code.comment.box=$(font.comment)\r\n\tfont.code.comment.line=$(font.comment)\r\n\tfont.code.comment.doc=$(font.comment)\r\n\tfont.code.comment.nested=$(font.comment)\r\n\tfont.text=font:Times New Roman,size:11\r\n\tfont.text.comment=font:Verdana,size:9\r\n\tfont.embedded.base=font:Verdana,size:9\r\n\tfont.embedded.comment=font:Comic Sans MS,size:8\r\n\tfont.monospace=font:Consolas,size:8.9\r\n\tfont.vbs=font:Lucida Sans Unicode,size:10\r\nif PLAT_GTK\r\n\tfont.base=font:Bitstream Vera Sans,size:9\r\n\tfont.small=font:Bitstream Vera Sans,size:8\r\n\tfont.comment=font:Bitstream Vera Serif,size:9\r\n\tfont.code.comment.box=$(font.comment)\r\n\tfont.code.comment.line=$(font.comment)\r\n\tfont.code.comment.doc=$(font.comment)\r\n\tfont.code.comment.nested=$(font.comment)\r\n\tfont.text=font:Bitstream Charter,size:10\r\n\tfont.text.comment=font:Serif,size:9\r\n\tfont.embedded.base=font:Serif,size:9\r\n\tfont.embedded.comment=font:Serif,size:9\r\n\tfont.monospace=font:Bitstream Vera Sans Mono,size:9\r\n\tfont.vbs=font:Bitstream Vera Sans Mono,size:9\r\nif PLAT_MAC\r\n\tfont.base=font:Verdana,size:12\r\n\tfont.small=font:Verdana,size:10\r\n\tfont.comment=font:Georgia,size:13\r\n\tfont.code.comment.box=$(font.comment)\r\n\tfont.code.comment.line=$(font.comment)\r\n\tfont.code.comment.doc=$(font.comment)\r\n\tfont.code.comment.nested=$(font.comment)\r\n\tfont.text=font:Times New Roman,size:13\r\n\tfont.text.comment=font:Verdana,size:11\r\n\tfont.embedded.base=font:Verdana,size:11\r\n\tfont.embedded.comment=font:Comic Sans MS,size:10\r\n\tfont.monospace=font:Courier New,size:12\r\n\tfont.vbs=font:Lucida Sans Unicode,size:12\r\nfont.js=$(font.comment)\r\n\r\n# Give symbolic names to the set of colours used in the standard styles.\r\ncolour.code.comment.box=fore:#007F00\r\ncolour.code.comment.line=fore:#007F00\r\ncolour.code.comment.doc=fore:#3F703F\r\ncolour.code.comment.nested=fore:#A0C0A0\r\ncolour.text.comment=fore:#0000FF,back:#D0F0D0\r\ncolour.other.comment=fore:#007F00\r\ncolour.embedded.comment=back:#E0EEFF\r\ncolour.embedded.js=back:#F0F0FF\r\ncolour.notused=back:#FF0000\r\n\r\ncolour.number=fore:#007F7F\r\ncolour.keyword=fore:#00007F\r\ncolour.string=fore:#7F007F\r\ncolour.char=fore:#7F007F\r\ncolour.operator=fore:#000000\r\ncolour.preproc=fore:#7F7F00\r\ncolour.error=fore:#FFFF00,back:#FF0000\r\n\r\n# Global default styles for all languages\r\n# Default\r\nstyle.*.32=$(font.monospace),size:15\r\n# Line number\r\nstyle.*.33=back:#C0C0C0,$(font.base)\r\n# Brace highlight\r\nstyle.*.34=fore:#0000FF,bold\r\n# Brace incomplete highlight\r\nstyle.*.35=fore:#FF0000,bold\r\n# Control characters\r\nstyle.*.36=\r\n# Indentation guides\r\nstyle.*.37=fore:#C0C0C0,back:#FFFFFF\r\n\r\n# Printing\r\n#print.colour.mode=1\r\nprint.magnification=-1\r\n# Windows-only setup: left, right, top, bottom margins, in local units:\r\n# hundredths of millimeters or thousandths of inches\r\nprint.margins=1500,1000,1000,1500\r\n# Header/footer:\r\nprint.header.format=$(FileNameExt) -- Printed on $(CurrentDate), $(CurrentTime) -- Page $(CurrentPage)\r\nprint.footer.format=$(FilePath) -- File date: $(FileDate) -- File time: $(FileTime)\r\n# Header/footer style\r\nprint.header.style=font:Arial,size:12,bold\r\nprint.footer.style=font:Arial Narrow,size:10,italics\r\n\r\n# Warnings - only works on Windows and needs to be pointed at files on machine\r\n#if PLAT_WIN\r\n#\twarning.findwrapped=100,E:\\Windows\\Media\\SFX\\Boing.wav\r\n#\twarning.notfound=0,Effect.wav\r\n#\twarning.wrongfile=0,Glass.wav\r\n#\twarning.executeok=0,Fanfare.wav\r\n#\twarning.executeko=100,GlassBreak.wav\r\n#\twarning.nootherbookmark=100,Boing2.wav\r\n\r\n# Define the Lexer menu,\r\n# Each item contains three parts: menu string | file extension | key\r\n# The only keys allowed currently are based on F-keys and alphabetic keys and look like\r\n# [Ctrl+][Shift+][Fn|a] such as F12 or Ctrl+Shift+D.\r\n# A '&' may be placed before a letter to be used as an accelerator. This does not work on GTK+.\r\n\r\nkeyText=Shift+F11\r\nkeyMake=Ctrl+Shift+F11\r\nkeyHTML=F12\r\nkeyXML=Shift+F12\r\n# On OS X, F11 is used by Expose, F12 by Dashbard\r\nif PLAT_MAC\r\n\tos.x.home.end.keys=1\r\n\tkeyText=Shift+F13\r\n\tkeyMake=Ctrl+Shift+F13\r\n\tkeyHTML=Ctrl+Shift+F14\r\n\tkeyXML=Shift+F14\r\n\r\ndefault.languages=\\\r\nText|txt|$(keyText)|\\\r\n&C / C++|c||\\\r\nLisp|lisp||\\\r\nPytho&n|py||\r\n\r\nmenu.language=$(default.languages)\r\n\r\n# User defined key commands\r\nuser.shortcuts=\\\r\nCtrl+Shift+V|IDM_PASTEANDDOWN|\\\r\nCtrl+PageUp|IDM_PREVFILE|\\\r\nCtrl+PageDown|IDM_NEXTFILE|\r\n\r\n#KeypadPlus|IDM_EXPAND|\\\r\n#KeypadMinus|IDM_BLOCK_COMMENT|\r\n\r\n#user.context.menu=\\\r\n#||\\\r\n#Next File|IDM_NEXTFILE|\\\r\n#Prev File|IDM_PREVFILE|\r\n\r\n# To keep menus short, these .properties files are not loaded by default.\r\nimports.exclude=abaqus asl asn1 au3 avenue avs baan blitzbasic bullant \\\r\ncobol cmake csound ecl escript flagship forth freebasic gap haskell inno \\\r\nkix latex lot lout metapost mmixal modula3 nimrod nncrontab nsis \\\r\nopal oscript powerpro powershell purebasic r rebol rust \\\r\nscriptol smalltalk sorcins spice specman \\\r\ntacl tal txt2tags verilog vhdl\r\n# Newly removed: ave baan escript lot metapost mmixal\r\n# The set of imports allowed can be set with\r\n#imports.include=ave\r\n\r\n# Import all the language specific properties files in this directory\r\nimport *\r\n\r\n"
  },
  {
    "path": "bin/ide/asm.properties",
    "content": "# Define SciTE settings for Assembler files (NASM)\r\n# Originally by Black Horus blackhorus@gmx.net 2002\r\n# Updated by Kein-Hong Man mkh@pl.jaring.my 2003-10\r\n# Updated by Marat Dukhan (mdukhan3.at.gatech.dot.edu) 10/4/2011\r\n\r\n# Nasm files\r\nfile.patterns.asm=*.asm\r\n#file.patterns.as=*.s\r\nfilter.asm=Assembler x86/x64(asm)|$(file.patterns.asm)|\r\nfilter.as=Assembler x86/x64(as)|$(file.patterns.as)|\r\n\r\nlexer.$(file.patterns.asm)=asm\r\nlexer.$(file.patterns.as)=as\r\n\r\n\r\nbcd_instruction=aaa aad aam aas daa das\r\nflow_instruction=ja jae jb jbe jc jcxz je jg jge jl jle jmp jna \\\r\n\tjnae jnb jnbe jnc jne jng jnge jnl jnle jno jnp jns jnz \\\r\n\tjo jp jpe jpo js jz \\\r\n\tjcxz jecxz jrcxz \\\r\n\tloop loope loopne loopz loopnz \\\r\n\tcall ret\r\n\r\nalu_instruction=add sub adc sbb neg cmp inc dec \\\r\n\tand or xor not test \\\r\n\tshl shr sal sar shld shrd rol ror rcl rcr \\\r\n\tcbw cwd cwde cdq cdqe cqo \\\r\n\tbsf bsr bt btc btr bts \\\r\n\tidiv imul div mul bswap \\\r\n\tnop\r\n\r\nmem_instruction=lea \\\r\n\tmov movsx movsxd movzx \\\r\n\txlatb bound \\\r\n\txchg xadd cmpxchg cmpxchg8b cmpxchg16b\r\n\r\nstack_instruction=push pop pushad popad pushf popf pushfd popfd pushfq popfq\r\n\r\npred_instruction=seta setae setb setbe setc sete setg setge setl \\\r\n\tsetle setna setnae setnb setnbe setnc setne setng setnge \\\r\n\tsetnl setnle setno setnp setns setnz seto setp setpe setpo \\\r\n\tsets setz \\\r\n\tsalc\r\n\r\nflag_instruction=clc cld stc std cmc lahf sahf\r\n\r\ncmov_instruction=cmovo cmovno cmovb cmovc cmovnae cmovae cmovnb \\\r\n\tcmovnc cmove cmovz cmovne cmovnz cmovbe cmovna cmova \\\r\n\tcmovnbe cmovs cmovns cmovp cmovpe cmovnp cmovpo cmovl \\\r\n\tcmovnge cmovge cmovnl cmovle cmovng cmovg cmovnle\r\n\r\nprefix_instruction=lock rep repe repz repne repnz\r\n\r\nstring_instruction=cmpsb cmpsw cmpsq \\\r\n\tmovsb movsw movsq \\\r\n\tscasb scasw scasd scasq \\\r\n\tstosb stosw stosd stosq\r\n\r\ninfo_instruction=cpuid rdtsc rdtscp rdpmc xgetbv\r\n\r\nlwp_instruction=llwpcb slwpcb lwpval lwpins\r\n\r\next_instruction=crc32 popcnt lzcnt tzcnt movbe pclmulqdq rdrand\r\n\r\nbmi1_instruction=andn bextr blsi blsmk blsr\r\n\r\nbmi2_instruction=bzhi mulx pdep pext rorx sarx shlx shrx\r\n\r\ntbm_instruction=blcfill blci blcic blcmsk blcs blsfill blsic t1mskc tzmsk\r\n\r\nfpu_instruction=f2xm1 fabs fadd faddp fbld fbstp fchs fclex fcom fcomp fcompp fdecstp \\\r\n\tfdisi fdiv fdivp fdivr fdivrp feni ffree fiadd ficom ficomp fidiv \\\r\n\tfidivr fild fimul fincstp finit fist fistp fisub fisubr fld fld1 \\\r\n\tfldcw fldenv fldenvw fldl2e fldl2t fldlg2 fldln2 fldpi fldz fmul \\\r\n\tfmulp fnclex fndisi fneni fninit fnop fnsave fnsavew fnstcw fnstenv \\\r\n\tfnstenvw fnstsw fpatan fprem fptan frndint frstor frstorw fsave \\\r\n\tfsavew fscale fsqrt fst fstcw fstenv fstenvw fstp fstsw fsub fsubp \\\r\n\tfsubr fsubrp ftst fwait fxam fxch fxtract fyl2x fyl2xp1 \\\r\n\tfsetpm fcos fldenvd fnsaved fnstenvd fprem1 frstord fsaved fsin fsincos \\\r\n\tfstenvd fucom fucomp fucompp fcomi fcomip fucomi fucomip ffreep \\\r\n\tfcmovb fcmove fcmovbe fcmovu fcmovnb fcmovne fcmovnbe fcmovnu\r\n\r\nmmx_instruction=movd movq \\\r\n\tpaddb paddw paddd paddsb paddsw paddusb paddusw \\\r\n\tpsubb psubw psubd psubsb psubsw psubusb psubusw \\\r\n\tpand pandn por pxor \\\r\n\tpcmpeqb pcmpeqd pcmpeqw pcmpgtb pcmpgtd pcmpgtw \\\r\n\tpmaddwd pmulhw pmullw \\\r\n\tpsllw pslld psllq psrlw psrld psrlq psraw psrad \\\r\n\tpackuswb packsswb packssdw \\\r\n\tpunpcklbw punpcklwd punpckldq punpckhbw punpckhwd punpckhdq \\\r\n\temms\r\n\r\nmmx2_instruction=pavgb pavgw \\\r\n\tpextrw pinsrw pmovmskb \\\r\n\tpmaxsw pmaxub pminsw pminub \\\r\n\tpmulhuw psadbw pshufw \\\r\n\tprefetchnta prefetcht0 prefetcht1 prefetcht2 \\\r\n\tmaskmovq movntq sfence\r\n\r\nemmx_instruction=paddsiw psubsiw \\\r\n\tpmulhrw pmachriw pmulhriw \\\r\n\tpmagw pdistib paveb \\\r\n\tpmvzb pmvnzb pmvlzb pmvgezb\r\n\r\nk3d_instruction=pfacc pfadd pfsub pfsubr pfmul \\\r\n\tpfcmpeq pfcmpge pfcmpgt \\\r\n\tpfmax pfmin \\\r\n\tpfrcp pfrcpit1 pfrcpit2 pfrsqit1 pfrsqrt \\\r\n\tpi2fd pf2id \\\r\n\tpavgusb pmulhrw \\\r\n\tfemms\r\n\r\nk3d2_instruction=pfnacc pfpnacc pi2fw pf2iw pswapd\r\n\r\nk3dgeode_instruction=pfrsqrtv pfrcpv\r\n\r\nk3dprefetch_instruction=prefetch prefetchw\r\n\r\nsse_instruction=addss addps subss subps \\\r\n\tmulss mulps divss divps sqrtss sqrtps \\\r\n\trcpss rcpps rsqrtss rsqrtps \\\r\n\tmaxss maxps minss minps \\\r\n\tcmpss comiss ucomiss cmpps \\\r\n\tcmpeqss cmpltss cmpless cmpunordss cmpneqss cmpnltss cmpnless cmpordss \\\r\n\tcmpeqps cmpltps cmpleps cmpunordps cmpneqps cmpnltps cmpnleps cmpordps \\\r\n\tandnps andps orps xorps \\\r\n\tcvtsi2ss cvtss2si cvttss2si \\\r\n\tcvtpi2ps cvtps2pi cvttps2pi \\\r\n\tmovss movlps movhps movlhps movhlps movaps movups movntps movmskps \\\r\n\tshufps unpckhps unpcklps \\\r\n\tldmxcsr stmxcsr\r\n\r\nsse2_instruction=addpd addsd subpd subsd \\\r\n\tmulsd mulpd divsd divpd sqrtsd sqrtpd \\\r\n\tmaxsd maxpd minsd minpd \\\r\n\tcmpsd comisd ucomisd cmppd \\\r\n\tcmpeqsd cmpltsd cmplesd cmpunordsd cmpneqsd cmpnltsd cmpnlesd cmpordsd \\\r\n\tcmpeqpd cmpltpd cmplepd cmpunordpd cmpneqpd cmpnltpd cmpnlepd cmpordpd \\\r\n\tandnpd andpd orpd xorpd \\\r\n\tcvtsd2ss cvtpd2ps cvtss2sd cvtps2pd \\\r\n\tcvtdq2ps cvtps2dq cvttps2dq \\\r\n\tcvtdq2pd cvtpd2dq cvttpd2dq \\\r\n\tcvtsi2sd cvtsd2si cvttsd2si \\\r\n\tcvtpi2pd cvtpd2pi cvttpd2pi \\\r\n\tmovsd movlpd movhpd movapd movupd movntpd movmskpd \\\r\n\tshufpd unpckhpd unpcklpd \\\r\n\tmovnti movdqa movdqu movntdq maskmovdqu \\\r\n\tmovdq2q movq2dq \\\r\n\tpaddq psubq pmuludq \\\r\n\tpslldq psrldq \\\r\n\tpunpcklqdq punpckhqdq \\\r\n\tpshufhw pshuflw pshufd \\\r\n\tlfence mfence\r\n\r\nsse3_instruction=addsubps addsubpd \\\r\n\thaddps haddpd hsubps hsubpd \\\r\n\tmovsldup movshdup movddup \\\r\n\tlddqu \\\r\n\tfisttp\r\n\r\nssse3_instruction=psignb psignw psignd \\\r\n\tpabsb pabsw pabsd \\\r\n\tpalignr pshufb \\\r\n\tpmulhrsw pmaddubsw \\\r\n\tphaddw phaddd phaddsw \\\r\n\tphsubw phsubd phsubsw\r\n\r\nsse4a_instruction=extrq insertq \\\r\n\tmovntsd movntss\r\n\r\nsse41_instruction=mpsadbw phminposuw \\\r\n\tpmuldq pmulld \\\r\n\tdpps dppd \\\r\n\tblendps blendpd blendvps blendvpd pblendvb pblendw \\\r\n\tpmaxsb pmaxuw pmaxsd pmaxud pminsb pminuw pminsd pminud \\\r\n\troundps roundss roundpd roundsd \\\r\n\tinsertps pinsrb pinsrd pinsrq \\\r\n\textractps pextrb pextrd pextrq \\\r\n\tpmovsxbw pmovsxbd pmovsxbq pmovsxwd pmovsxwq pmovsxdq \\\r\n\tpmovzxbw pmovzxbd pmovzxbq pmovzxwd pmovzxwq pmovzxdq \\\r\n\tptest \\\r\n\tpcmpeqq \\\r\n\tpackusdw \\\r\n\tmovntdqa\r\n\r\nsse42_instruction=pcmpgtq \\\r\n\tpcmpestri pcmpestrm pcmpistri pcmpistrm\r\n\r\naes_instruction=aesenc aesenclast aesdec aesdeclast aeskeygenassist aesimc\r\n\r\npadlock_instruction=xcryptcbc xcryptcfb xcryptctr xcryptecb xcryptofb \\\r\n\txsha1 xsha256 montmul xstore\r\n\r\n\r\navx_instruction=vaddss vaddps vaddsd vaddpd vsubss vsubps vsubsd vsubpd \\\r\n\tvaddsubps vaddsubpd \\\r\n\tvhaddps vhaddpd vhsubps vhsubpd \\\r\n\tvmulss vmulps vmulsd vmulpd \\\r\n\tvmaxss vmaxps vmaxsd vmaxpd vminss vminps vminsd vminpd \\\r\n\tvandps vandpd vandnps vandnpd vorps vorpd vxorps vxorpd \\\r\n\tvblendps vblendpd vblendvps vblendvpd \\\r\n\tvcmpss vcomiss vucomiss vcmpsd vcomisd vucomisd vcmpps vcmppd \\\r\n\tvcmpeqss vcmpltss vcmpless vcmpunordss vcmpneqss vcmpnltss vcmpnless vcmpordss \\\r\n\tvcmpeq_uqss vcmpngess vcmpngtss vcmpfalsess vcmpneq_oqss vcmpgess vcmpgtss vcmptruess \\\r\n\tvcmpeq_osss vcmplt_oqss vcmple_oqss vcmpunord_sss vcmpneq_usss vcmpnlt_uqss vcmpnle_uqss vcmpord_sss \\\r\n\tvcmpeq_usss vcmpnge_uqss vcmpngt_uqss vcmpfalse_osss vcmpneq_osss vcmpge_oqss vcmpgt_oqss vcmptrue_usss \\\r\n\tvcmpeqps vcmpltps vcmpleps vcmpunordps vcmpneqps vcmpnltps vcmpnleps vcmpordps \\\r\n\tvcmpeq_uqps vcmpngeps vcmpngtps vcmpfalseps vcmpneq_oqps vcmpgeps vcmpgtps vcmptrueps \\\r\n\tvcmpeq_osps vcmplt_oqps vcmple_oqps vcmpunord_sps vcmpneq_usps vcmpnlt_uqps vcmpnle_uqps vcmpord_sps \\\r\n\tvcmpeq_usps vcmpnge_uqps vcmpngt_uqps vcmpfalse_osps vcmpneq_osps vcmpge_oqps vcmpgt_oqps vcmptrue_usps \\\r\n\tvcmpeqsd vcmpltsd vcmplesd vcmpunordsd vcmpneqsd vcmpnltsd vcmpnlesd vcmpordsd \\\r\n\tvcmpeq_uqsd vcmpngesd vcmpngtsd vcmpfalsesd vcmpneq_oqsd vcmpgesd vcmpgtsd vcmptruesd \\\r\n\tvcmpeq_ossd vcmplt_oqsd vcmple_oqsd vcmpunord_ssd vcmpneq_ussd vcmpnlt_uqsd vcmpnle_uqsd vcmpord_ssd \\\r\n\tvcmpeq_ussd vcmpnge_uqsd vcmpngt_uqsd vcmpfalse_ossd vcmpneq_ossd vcmpge_oqsd vcmpgt_oqsd vcmptrue_ussd \\\r\n\tvcmpeqpd vcmpltpd vcmplepd vcmpunordpd vcmpneqpd vcmpnltpd vcmpnlepd vcmpordpd \\\r\n\tvcmpeq_uqpd vcmpngepd vcmpngtpd vcmpfalsepd vcmpneq_oqpd vcmpgepd vcmpgtpd vcmptruepd \\\r\n\tvcmpeq_ospd vcmplt_oqpd vcmple_oqpd vcmpunord_spd vcmpneq_uspd vcmpnlt_uqpd vcmpnle_uqpd vcmpord_spd \\\r\n\tvcmpeq_uspd vcmpnge_uqpd vcmpngt_uqpd vcmpfalse_ospd vcmpneq_ospd vcmpge_oqpd vcmpgt_oqpd vcmptrue_uspd \\\r\n\tvcvtsd2ss vcvtpd2ps vcvtss2sd vcvtps2pd \\\r\n\tvcvtsi2ss vcvtss2si vcvttss2si \\\r\n\tvcvtpi2ps vcvtps2pi vcvttps2pi \\\r\n\tvcvtdq2ps vcvtps2dq vcvttps2dq \\\r\n\tvcvtdq2pd vcvtpd2dq vcvttpd2dq \\\r\n\tvcvtsi2sd vcvtsd2si vcvttsd2si \\\r\n\tvcvtpi2pd vcvtpd2pi vcvttpd2pi \\\r\n\tvdivss vdivps vdivsd vdivpd vsqrtss vsqrtps vsqrtsd vsqrtpd \\\r\n\tvdpps vdppd \\\r\n\tvmaskmovps vmaskmovpd \\\r\n\tvmovss vmovsd vmovaps vmovapd vmovups vmovupd vmovntps vmovntpd \\\r\n\tvmovhlps vmovlhps vmovlps vmovlpd vmovhps vmovhpd \\\r\n\tvmovsldup vmovshdup vmovddup \\\r\n\tvmovmskps vmovmskpd \\\r\n\tvroundss vroundps vroundsd vroundpd \\\r\n\tvrcpss vrcpps vrsqrtss vrsqrtps \\\r\n\tvunpcklps vunpckhps vunpcklpd vunpckhpd \\\r\n\tvbroadcastss vbroadcastsd vbroadcastf128 \\\r\n\tvextractps vinsertps vextractf128 vinsertf128 \\\r\n\tvshufps vshufpd vpermilps vpermilpd vperm2f128 \\\r\n\tvtestps vtestpd \\\r\n\tvpaddb vpaddusb vpaddsb vpaddw vpaddusw vpaddsw vpaddd vpaddq \\\r\n\tvpsubb vpsubusb vpsubsb vpsubw vpsubusw vpsubsw vpsubd vpsubq \\\r\n\tvphaddw vphaddsw vphaddd vphsubw vphsubsw vphsubd \\\r\n\tvpsllw vpslld vpsllq vpsrlw vpsrld vpsrlq vpsraw vpsrad \\\r\n\tvpand vpandn vpor vpxor \\\r\n\tvpblendwb vpblendw \\\r\n\tvpsignb vpsignw vpsignd \\\r\n\tvpavgb vpavgw \\\r\n\tvpabsb vpabsw vpabsd \\\r\n\tvmovd vmovq vmovdqa vmovdqu vlddqu vmovntdq vmovntdqa vmaskmovdqu \\\r\n\tvpmovsxbw vpmovsxbd vpmovsxbq vpmovsxwd vpmovsxwq vpmovsxdq \\\r\n\tvpmovzxbw vpmovzxbd vpmovzxbq vpmovzxwd vpmovzxwq vpmovzxdq \\\r\n\tvpackuswb vpacksswb vpackusdw vpackssdw \\\r\n\tvpcmpeqb vpcmpeqw vpcmpeqd vpcmpeqq vpcmpgtb vpcmpgtw vpcmpgtd vpcmpgtq \\\r\n\tvpmaddubsw vpmaddwd \\\r\n\tvpmullw vpmulhuw vpmulhw vpmulhrsw vpmulld vpmuludq vpmuldq \\\r\n\tvpmaxub vpmaxsb vpmaxuw vpmaxsw vpmaxud vpmaxsd \\\r\n\tvpminub vpminsb vpminuw vpminsw vpminud vpminsd \\\r\n\tvpmovmskb vptest \\\r\n\tvpunpcklbw vpunpcklwd vpunpckldq vpunpcklqdq \\\r\n\tvpunpckhbw vpunpckhwd vpunpckhdq vpunpckhqdq \\\r\n\tvpslldq vpsrldq vpalignr \\\r\n\tvpshufb vpshuflw vpshufhw vpshufd \\\r\n\tvpextrb vpextrw vpextrd vpextrq vpinsrb vpinsrw vpinsrd vpinsrq \\\r\n\tvpsadbw vmpsadbw vphminposuw \\\r\n\tvpcmpestri vpcmpestrm vpcmpistri vpcmpistrm \\\r\n\tvpclmulqdq vaesenc vaesenclast vaesdec vaesdeclast vaeskeygenassist vaesimc \\\r\n\tvldmxcsr vstmxcsr vzeroall vzeroupper\r\n\r\navx2_instruction=vbroadcasti128 vpbroadcastb vpbroadcastw vpbroadcastd vpbroadcastq \\\r\n\tvpblendd \\\r\n\tvpermd vpermq vperm2i128 \\\r\n\tvextracti128 vinserti128 \\\r\n\tvpmaskmovd vpmaskmovq \\\r\n\tvpsllvd vpsllvq vpsravd vpsrlvd vpsrldq \\\r\n\tvpgatherdd vpgatherqd vgatherdq vgatherqq \\\r\n\tvpermps vpermpd \\\r\n\tvgatherdpd vgatherqpd vgatherdps vgatherqps\r\n\r\nxop_instruction=vfrczss vfrczps vfrczsd vfrczpd \\\r\n\tvpermil2ps vperlil2pd \\\r\n\tvtestps vtestpd \\\r\n\tvpcomub vpcomb vpcomuw vpcomw vpcomud vpcomd vpcomuq vpcomq \\\r\n\tvphaddubw vphaddbw vphaddubd vphaddbd vphaddubq vphaddbq \\\r\n\tvphadduwd vphaddwd vphadduwq vphaddwq vphaddudq vphadddq \\\r\n\tvphsubbw vphsubwd vphsubdq \\\r\n\tvpmacsdd vpmacssdd vpmacsdql vpmacssdql vpmacsdqh vpmacssdqh \\\r\n\tvpmacsww vpmacssww vpmacswd vpmacsswd \\\r\n\tvpmadcswd vpmadcsswd \\\r\n\tvpcmov vpperm \\\r\n\tvprotb vprotw vprotd vprotq \\\r\n\tvpshab vpshaw vpshad vpshaq \\\r\n\tvpshlb vpshlw vpshld vpshlq\r\n\r\ncvt16_instruction=vcvtph2ps vcvtps2ph\r\n\r\nfma4_instruction=vfmaddss vfmaddps vfmaddsd vfmaddpd \\\r\n\tvfmsubss vfmsubps vfmsubsd vfmsubpd \\\r\n\tvnfmaddss vnfmaddps vnfmaddsd vnfmaddpd \\\r\n\tvnfmsubss vnfmsubps vnfmsubsd vnfmsubpd \\\r\n\tvfmaddsubps vfmaddsubpd vfmsubaddps vfmsubaddpd\r\n\r\nfma3_instruction=vfmadd132ss vfmadd213ss vfmadd231ss \\\r\n\tvfmadd132ps vfmadd213ps vfmadd231ps \\\r\n\tvfmadd132sd vfmadd213sd vfmadd231sd \\\r\n\tvfmadd132pd vfmadd213pd vfmadd231pd \\\r\n\tvfmaddsub132ps vfmaddsub213ps vfmaddsub231ps \\\r\n\tvfmaddsub132pd vfmaddsub213pd vfmaddsub231pd \\\r\n\tvfmsubadd132ps vfmsubadd213ps vfmsubadd231ps \\\r\n\tvfmsubadd132pd vfmsubadd213pd vfmsubadd231pd \\\r\n\tvfmsub132ss vfmsub213ss vfmsub231ss \\\r\n\tvfmsub132ps vfmsub213ps vfmsub231ps \\\r\n\tvfmsub132sd vfmsub213sd vfmsub231sd \\\r\n\tvfmsub132pd vfmsub213pd vfmsub231pd \\\r\n\tvfnmadd132ss vfnmadd213ss vfnmadd231ss \\\r\n\tvfnmadd132ps vfnmadd213ps vfnmadd231ps \\\r\n\tvfnmadd132sd vfnmadd213sd vfnmadd231sd \\\r\n\tvfnmadd132pd vfnmadd213pd vfnmadd231pd \\\r\n\tvfnmsub132ss vfnmsub213ss vfnmsub231ss \\\r\n\tvfnmsub132ps vfnmsub213ps vfnmsub231ps \\\r\n\tvfnmsub132sd vfnmsub213sd vfnmsub231sd \\\r\n\tvfnmsub132pd vfnmsub213pd vfnmsub231pd\r\n\r\nregister=al ah bl bh cl ch dl dh \\\r\n\tax bx cx dx si di bp \\\r\n\teax ebx ecx edx esi edi ebx esp \\\r\n\tst0 st1 st2 st3 st4 st5 st6 st7 \\\r\n\tmm0 mm1 mm2 mm3 mm4 mm5 mm6 mm7 \\\r\n\txmm0 xmm1 xmm2 xmm3 xmm4 xmm5 xmm6 xmm7 \\\r\n\tymm0 ymm1 ymm2 ymm3 ymm4 ymm5 ymm6 ymm7 \\\r\n\tfs\r\n\r\nregister_64=sil dil bpl \\\r\n\tr8b r9b r10b r11b r12b r13b r14b r15b \\\r\n\tr8w r9w r10w r11w r12w r13w r14w r15w \\\r\n\trax rcx rdx rbx rsp rbp rsi rdi \\\r\n\tr8 r9 r10 r11 r12 r13 r14 r15 \\\r\n\txmm8 xmm9 xmm10 xmm11 xmm12 xmm13 xmm14 xmm15 \\\r\n\tymm8 ymm9 ymm10 ymm11 ymm12 ymm13 ymm14 ymm15 \\\r\n\tgs\r\n\r\ndirective_nasm=db dw dd dq dt do dy \\\r\n\tresb resw resd resq rest reso resy incbin equ times safeseh \\\r\n\t__utf16__ __utf32__ %+ \\\r\n\tdefault cpu float start imagebase osabi \\\r\n\t..start ..imagebase ..gotpc ..gotoff ..gottpoff ..got ..plt ..sym ..tlsie \\\r\n\tsection segment __sect__ group absolute \\\r\n\t.bss .comment .data .lbss .ldata .lrodata .rdata .rodata .tbss .tdata .text \\\r\n\talloc bss code exec data noalloc nobits noexec nowrite progbits rdata tls write \\\r\n\tprivate public common stack overlay class \\\r\n\textern global common import export \\\r\n\t%define %idefine %xdefine %ixdefine %assign %undef %? %?? \\\r\n\t%defstr %idefstr %deftok %ideftok \\\r\n\t%strcat %strlen %substr \\\r\n\t%macro %imacro %rmacro %exitmacro %endmacro %unmacro \\\r\n\t%if %ifn %elif %elifn %else %endif \\\r\n\t%ifdef %ifndef %elifdef %elifndef \\\r\n\t%ifmacro %ifnmacro %elifmacro %elifnmacro \\\r\n\t%ifctx %ifnctx %elifctx %elifnctx \\\r\n\t%ifidn %ifnidn %elifidn %elifnidn \\\r\n\t%ifidni %ifnidni %elifidni %elifnidni \\\r\n\t%ifid %ifnid %elifid %elifnid \\\r\n\t%ifnum %ifnnum %elifnum %elifnnum \\\r\n\t%ifstr %ifnstr %elifstr %elifnstr \\\r\n\t%iftoken %ifntoken %eliftoken %elifntoken \\\r\n\t%ifempty %elifempty %ifnempty %elifnempty \\\r\n\t%ifenv %ifnenv %elifenv %elifnenv \\\r\n\t%rep %exitrep %endrep \\\r\n\t%while %exitwhile %endwhile \\\r\n\t%include %pathsearch %depend %use \\\r\n\t%push %pop %repl %arg %local %stacksize flat flat64 large small \\\r\n\t%error %warning %fatal \\\r\n\t%00 .nolist %rotate %line %! %final %clear \\\r\n\tstruc endstruc istruc at iend \\\r\n\talign alignb sectalign \\\r\n\tbits use16 use32 use64 \\\r\n\t__nasm_major__ __nasm_minor__ __nasm_subminor__ ___nasm_patchlevel__ \\\r\n\t__nasm_version_id__ __nasm_ver__ \\\r\n\t__file__ __line__ __pass__ __bits__ __output_format__ \\\r\n\t__date__ __time__ __date_num__ __time_num__ __posix_time__ \\\r\n\t__utc_date__ __utc_time__ __utc_date_num__ __utc_time_num__ \\\r\n\t__float_daz__ __float_round__ __float__ \\\r\n\t__use_altreg__ altreg \\\r\n\t__use_smartalign__ smartalign __alignmode__ \\\r\n\t__use_fp__ __infinity__ __nan__ __qnan__ __snan__ \\\r\n\t__float8__ __float16__ __float32__ __float64__ __float80m__ __float80e__ __float128l__ __float128h__\r\n\r\ndirective_operand_nasm=a16 a32 a64 o16 o32 o64 strict \\\r\n\tbyte word dword qword tword oword yword nosplit \\\r\n\t%0 %1 %2 %3 %4 %5 %6 %7 %8 %9 \\\r\n\tabs rel \\\r\n\t$ $$ \\\r\n\tseg wrt\r\n\r\nkeywords.$(file.patterns.asm)=$(bcd_instruction) $(flow_instruction) $(alu_instruction) $(mem_instruction) $(stack_instruction) $(pred_instruction) $(flag_instruction) $(cmov_instruction) $(prefix_instruction) $(string_instruction) $(info_instruction) $(lwp_instruction) $(ext_instruction) $(bmi1_instruction) $(bmi2_instruction)\r\nkeywords2.$(file.patterns.asm)=$(fpu_instruction)\r\nkeywords3.$(file.patterns.asm)=$(register) $(register_64)\r\nkeywords4.$(file.patterns.asm)=$(directive_nasm)\r\nkeywords5.$(file.patterns.asm)=$(directive_operand_nasm)\r\nkeywords6.$(file.patterns.asm)=$(mmx_instruction) $(mmx2_instruction) $(emmx_instruction) $(k3d_instruction) $(k3d2_instruction) $(k3dgeode_instruction) $(k3dprefetch_instruction) $(sse_instruction) $(sse2_instruction) $(sse3_instruction) $(ssse3_instruction) $(sse4a_instruction) $(sse41_instruction) $(sse42_instruction) $(aes_instruction) $(padlock_instruction) $(avx_instruction) $(avx2_instruction) $(xop_instruction) $(cvt16_instruction) $(fma4_instruction) $(fma3_instruction)\r\n\r\nkeywords.$(file.patterns.as)=$(bcd_instruction) $(flow_instruction) $(alu_instruction) $(mem_instruction) $(stack_instruction) $(pred_instruction) $(flag_instruction) $(cmov_instruction) $(prefix_instruction) $(string_instruction) $(info_instruction) $(lwp_instruction) $(ext_instruction) $(bmi1_instruction) $(bmi2_instruction)\r\nkeywords2.$(file.patterns.as)=$(fpu_instruction)\r\nkeywords3.$(file.patterns.as)=$(register) $(register_64)\r\nkeywords4.$(file.patterns.as)=$(directive_nasm)\r\nkeywords5.$(file.patterns.as)=$(directive_operand_nasm)\r\nkeywords6.$(file.patterns.as)=$(mmx_instruction) $(mmx2_instruction) $(emmx_instruction) $(k3d_instruction) $(k3d2_instruction) $(k3dgeode_instruction) $(k3dprefetch_instruction) $(sse_instruction) $(sse2_instruction) $(sse3_instruction) $(ssse3_instruction) $(sse4a_instruction) $(sse41_instruction) $(sse42_instruction) $(aes_instruction) $(padlock_instruction) $(avx_instruction) $(avx2_instruction) $(xop_instruction) $(cvt16_instruction) $(fma4_instruction) $(fma3_instruction)\r\n\r\ncomment.block.asm=;\r\ncomment.block.as=#\r\n\r\n\r\n# Assembler Styles\r\n#style.asm.32=fore:#808080,font:Verdana,size:8\r\n#style.as.32=$(style.asm.32)\r\n# Default\r\nstyle.asm.0=\r\nstyle.asm.0=$(style.asm.0)\r\n# Comment\r\nstyle.asm.1=fore:#adadad\r\nstyle.as.1=$(style.asm.1)\r\n#$(colour.code.comment.line),font:Comic Sans MS,size:8\r\n# Number\r\nstyle.asm.2=fore:#ff0000\r\nstyle.as.2=$(style.asm.2)\r\n# String\r\nstyle.asm.3=$(colour.string)\r\nstyle.as.3=$(style.asm.3)\r\n# Operator\r\nstyle.asm.4=$(colour.operator),bold\r\nstyle.as.4=$(style.asm.4)\r\n# Identifier\r\nstyle.asm.5=\r\nstyle.as.5=$(style.asm.5)\r\n# CPU instruction\r\nstyle.asm.6=$(colour.keyword),bold\r\nstyle.as.6=$(style.asm.6)\r\n#fore:#0000ff\r\n# FPU instruction\r\nstyle.asm.7=fore:#0000ff\r\nstyle.as.7=$(style.asm.7)\r\n# Register\r\nstyle.asm.8=fore:#46aa03,bold\r\nstyle.as.8=$(style.asm.8)\r\n# assembler Directive\r\nstyle.asm.9=fore:#0000ff\r\nstyle.as.9=$(style.asm.9)\r\n# assembler Directive Operand\r\nstyle.asm.10=fore:#0000ff\r\nstyle.as.10=$(style.asm.10)\r\n# Comment block (GNU as /*...*/ syntax, unimplemented)\r\nstyle.asm.11=$(colour.code.comment.box),$(font.code.comment.box)\r\nstyle.as.11=$(style.asm.11)\r\n# Character/String (single quote) (also character prefix in GNU as)\r\nstyle.asm.12=$(colour.char)\r\nstyle.as.12=$(style.asm.12)\r\n# End of line where string is not closed\r\nstyle.asm.13=fore:#000000,back:#E0C0E0,eolfilled\r\nstyle.as.13=$(style.asm.13)\r\n# Extended instructions\r\nstyle.asm.14=fore:#B00040\r\nstyle.as.14=$(style.asm.14)\r\n\r\n\r\ncommand.compile.$(file.patterns.asm)=nasm $(FileNameExt)\r\n\r\ncommand.name.0.*.asm=Link\r\ncommand.0.*.asm=link $(FileName)\r\n\r\n\r\nstatement.indent.$(file.patterns.asm)=9 .if\r\nstatement.indent.$(file.patterns.as)=9 .if\r\n"
  },
  {
    "path": "bin/ide/cpp.properties",
    "content": "# Define SciTE settings for C++, C, C#, Ch, Java, IDL, JavaScript, Flash (ActionScript 2) files.\r\n\r\n# sma files are Small script (C-like)\r\nfile.patterns.cpp=*.c;*.cc;*.cpp;*.cxx;*.h;*.hh;*.hpp;*.hxx;*.ipp;*.m;*.mm;*.sma\r\nfile.patterns.cplusplus=*.cc;*.cpp;*.cxx\r\n# jad = decompiled class files; pde = Processing.org sketch files\r\nfile.patterns.java=*.java;*.jad;*.pde\r\nfile.patterns.javafx=*.fx\r\n# pln, inc and t are SilkTest (4Test) files.\r\nfile.patterns.test=*.pln;*.inc;*.t\r\n# es = JS dialect of Abobe for SVG\r\nfile.patterns.js=*.js;*.es\r\nfile.patterns.cs=*.cs\r\nfile.patterns.rc=*.rc;*.rc2;*.dlg\r\nfile.patterns.idl=*.idl;*.odl\r\nfile.patterns.flash=*.as;*.asc;*.jsfl\r\nfile.patterns.ch=*.ch;*.chf;*.chs\r\nfile.patterns.vala=*.vala\r\nfile.patterns.go=*.go\r\nfile.patterns.pike=*.pike\r\nfile.patterns.c.like=$(file.patterns.cpp);$(file.patterns.cs);$(file.patterns.idl);$(file.patterns.java);$(file.patterns.js);$(file.patterns.flash);$(file.patterns.ch);$(file.patterns.vala);$(file.patterns.pike)\r\n\r\nshbang.tcc=cpp\r\nshbang.tinycc=cpp\r\n\r\nfilter.cpp=C/C++ (c cc cpp cxx cs vala h hh hxx hpp ipp dlg rc rc2 mak)|\\\r\n$(file.patterns.cpp);$(file.patterns.cs);$(file.patterns.rc);$(file.patterns.vala);*.mak;make*|\r\nfilter.java=Java (java)|*.java|\r\nfilter.js=JavaScript (js es)|$(file.patterns.js)|\r\nfilter.idl=IDL (idl odl)|$(file.patterns.idl)|\r\nfilter.test=SilkTest (pln inc t)|$(file.patterns.test)|\r\nfilter.flash=Flash (as asc jsfl)|$(file.patterns.flash)|\r\nfilter.ch=Ch (ch chf chs)|$(file.patterns.ch)|\r\nfilter.go=Go (go)|$(file.patterns.go)|\r\nfilter.pike=Pike (pike)|$(file.patterns.pike)|\r\n\r\nlexer.$(file.patterns.java)=cpp\r\nlexer.$(file.patterns.javafx)=cpp\r\nlexer.$(file.patterns.cpp)=cpp\r\nlexer.$(file.patterns.rc)=cpp\r\nlexer.$(file.patterns.idl)=cpp\r\nlexer.$(file.patterns.cs)=cpp\r\nlexer.$(file.patterns.js)=cpp\r\nlexer.$(file.patterns.test)=cpp\r\nlexer.$(file.patterns.flash)=cpp\r\nlexer.$(file.patterns.ch)=cpp\r\nlexer.$(file.patterns.vala)=cpp\r\nlexer.$(file.patterns.go)=cpp\r\nlexer.$(file.patterns.pike)=cpp\r\n\r\nkeywordclass.cpp=and and_eq asm auto bitand bitor bool break \\\r\ncase catch char class compl const const_cast constexpr continue \\\r\ndefault delete do double dynamic_cast else enum explicit export extern false float for \\\r\nfriend goto if inline int long mutable namespace new not not_eq \\\r\noperator or or_eq private protected public \\\r\nregister reinterpret_cast return short signed sizeof static static_cast struct switch \\\r\ntemplate this throw true try typedef typeid typename union unsigned using \\\r\nvirtual void volatile wchar_t while xor xor_eq\r\n\r\ndirectives.objective.c=\\\r\n@class @defs @protocol @required @optional @end \\\r\n@interface @public @package @protected @private @property \\\r\n@implementation @synthesize @dynamic \\\r\n@throw @try @catch @finally \\\r\n@synchronized @autoreleasepool \\\r\n@selector @encode \\\r\n@compatibility_alias\r\n\r\n# Since Objective C and C++ share the .h extension, allow Objective C directives as keywords\r\n# For stricter display of pure C++, specify keywords.$(file.patterns.cpp)=$(keywordclass.cpp)\r\nkeywords.$(file.patterns.cpp)=$(keywordclass.cpp) $(directives.objective.c)\r\n\r\n# keywords2 is for highlighting user defined keywords or function calls or similar\r\n#keywords2.$(file.patterns.cpp)=file\r\n\r\n# keywords3 is for doc comment keywords, highlighted in style 17\r\n#CPP doxygen\r\nfile.patterns.doxygen.langs=$(file.patterns.cpp);$(file.patterns.java)\r\nkeywordclass.doxygen=a addindex addtogroup anchor arg attention \\\r\nauthor b brief bug c class code date def defgroup deprecated dontinclude \\\r\ne em endcode endhtmlonly endif endlatexonly endlink endverbatim enum example exception \\\r\nf$ f[ f] file fn hideinitializer htmlinclude htmlonly \\\r\nif image include ingroup internal invariant interface latexonly li line link \\\r\nmainpage name namespace nosubgrouping note overload \\\r\np page par param param[in] param[out] \\\r\npost pre ref relates remarks return retval \\\r\nsa section see showinitializer since skip skipline struct subsection \\\r\ntest throw throws todo typedef union until \\\r\nvar verbatim verbinclude version warning weakgroup $ @ \\ & < > # { }\r\nkeywords3.$(file.patterns.doxygen.langs)=$(keywordclass.doxygen)\r\n\r\n# keywords5 is for preprocessor definitions and will cause inactive code\r\n# to be greyed out. This setting is a space separated list of definitions\r\n# where a definition may be of the form NAME=VALUE or simply NAME.\r\n#keywords5.$(file.patterns.cpp)=_MSC_VER SCI_NAMESPACE GTK_MAJOR_VERSION=2\r\n\r\nword.chars.cxx=$(chars.alpha)$(chars.numeric)_#\r\nword.characters.$(file.patterns.cpp)=$(word.chars.cxx)\r\ncalltip.cpp.word.characters=$(chars.alpha)$(chars.numeric)_\r\ncomment.block.cpp=//~\r\n#comment.block.at.line.start.cpp=1\r\ncomment.stream.start.cpp=/*\r\ncomment.stream.end.cpp=*/\r\ncomment.box.start.cpp=/*\r\ncomment.box.middle.cpp= *\r\ncomment.box.end.cpp= */\r\n\r\n# Folding\r\n#fold.cpp.syntax.based=0\r\n#fold.cpp.comment.multiline=0\r\n#fold.cpp.comment.explicit=0\r\n#defaults for fold.cpp.explicit.start=//{ and fold.cpp.explicit.end=//}\r\n#  can be replaced by defining custom strings, e.g. //[ and //]\r\n#fold.cpp.explicit.start=//[\r\n#fold.cpp.explicit.end=//]\r\n#if fold strings are set to something like /*{{{ and /*}}} (Origami/WinF style fold strings), enable\r\n#  fold.cpp.explicit.anywhere, allowing explicit fold points being anywhere, not just in line comments\r\n#fold.cpp.explicit.anywhere=1\r\n#fold.at.else=1\r\n\r\nword.characters.$(file.patterns.javafx)=$(word.chars.cxx)$-\r\n\r\nfile.patterns.c.except.cpp=$(file.patterns.cs);$(file.patterns.idl);*.java;$(file.patterns.flash);$(file.patterns.ch)\r\nstatement.indent.$(file.patterns.c.except.cpp)=5 case default do else for if while\r\nstatement.indent.$(file.patterns.cpp)=5 case default do else for if private protected public while\r\nstatement.end.$(file.patterns.c.like)=10 ;\r\nstatement.lookback.$(file.patterns.c.like)=20\r\nblock.start.$(file.patterns.c.like)=10 {\r\nblock.end.$(file.patterns.c.like)=10 }\r\n\r\n#autocomplete.cpp.fillups=(\r\n\r\n#styling.within.preprocessor=1\r\npreprocessor.symbol.$(file.patterns.cpp)=#\r\npreprocessor.start.$(file.patterns.cpp)=if ifdef ifndef\r\npreprocessor.middle.$(file.patterns.cpp)=else elif\r\npreprocessor.end.$(file.patterns.cpp)=endif\r\n\r\npreprocessor.symbol.$(file.patterns.cs)=#\r\npreprocessor.start.$(file.patterns.cs)=if region\r\npreprocessor.middle.$(file.patterns.cs)=else elif\r\npreprocessor.end.$(file.patterns.cs)=endif endregion\r\n\r\nkeywordclass.ch=\\\r\nauto array bool break case char class complex ComplexInf ComplexNaN \\\r\nconst continue default delete \\\r\ndo double else enum export extern float for foreach goto if Inf inline int \\\r\nlong namespace NaN new NULL private public register restrict return short \\\r\nsigned sizeof static string_t struct switch this typedef union unsigned \\\r\nusing void volatile wchar_t while __declspec\r\nkeywords.$(file.patterns.ch)=$(keywordclass.ch)\r\nword.chars.ch=$(chars.alpha)$(chars.numeric)_#\r\nword.characters.$(file.patterns.ch)=$(word.chars.cxx)\r\ncomment.block.ch=//~\r\n#comment.block.at.line.start.ch=1\r\ncomment.stream.start.ch=/*\r\ncomment.stream.end.ch=*/\r\ncomment.box.start.ch=/*\r\ncomment.box.middle.ch= *\r\ncomment.box.end.ch= */\r\npreprocessor.symbol.$(file.patterns.ch)=#\r\npreprocessor.start.$(file.patterns.ch)=if ifdef ifndef\r\npreprocessor.middle.$(file.patterns.ch)=else elif\r\npreprocessor.end.$(file.patterns.ch)=endif\r\n\r\nkeywordclass.cs=abstract as ascending base bool break by byte case catch char checked \\\r\nclass const continue decimal default delegate descending do double else enum \\\r\nequals event explicit extern false finally fixed float for foreach from goto group if \\\r\nimplicit in int interface internal into is join lock let long namespace new null \\\r\nobject on operator orderby out override params private protected public \\\r\nreadonly ref return sbyte sealed select short sizeof stackalloc static \\\r\nstring struct switch this throw true try typeof uint ulong \\\r\nunchecked unsafe ushort using var virtual void volatile where while\r\nkeywords.$(file.patterns.cs)=$(keywordclass.cs)\r\nword.characters.$(file.patterns.cs)=$(word.chars.cxx)\r\n\r\nkeywordclass.go=\\\r\nbool byte break case chan complex64 complex128 const continue defer default  \\\r\nelse  for func go goto fallthrough false float32 float64 if import int interface int8 int16 int32 int64 \\\r\nlen map nil package range return select string struct switch true type \\\r\nuint uintptr uint8 uint16 uint32 uint64  var\r\nkeywords.$(file.patterns.go)=$(keywordclass.go)\r\n\r\nkeywordclass.rc=\\\r\nACCELERATORS ALT AUTO3STATE AUTOCHECKBOX AUTORADIOBUTTON \\\r\nBEGIN BITMAP BLOCK BUTTON CAPTION CHARACTERISTICS CHECKBOX CLASS \\\r\nCOMBOBOX CONTROL CTEXT CURSOR DEFPUSHBUTTON DIALOG DIALOGEX DISCARDABLE \\\r\nEDITTEXT END EXSTYLE FONT GROUPBOX ICON LANGUAGE LISTBOX LTEXT \\\r\nMENU MENUEX MENUITEM MESSAGETABLE POPUP \\\r\nPUSHBUTTON RADIOBUTTON RCDATA RTEXT SCROLLBAR SEPARATOR SHIFT STATE3 \\\r\nSTRINGTABLE STYLE TEXTINCLUDE VALUE VERSION VERSIONINFO VIRTKEY\r\nkeywords.$(file.patterns.rc)=$(keywordclass.rc)\r\n\r\nkeywordclass.idl=\\\r\naggregatable allocate appobject arrays async async_uuid \\\r\nauto_handle \\\r\nbindable boolean broadcast byte byte_count \\\r\ncall_as callback char coclass code comm_status \\\r\nconst context_handle context_handle_noserialize \\\r\ncontext_handle_serialize control cpp_quote custom \\\r\ndecode default defaultbind defaultcollelem \\\r\ndefaultvalue defaultvtable dispinterface displaybind dllname \\\r\ndouble dual \\\r\nenable_allocate encode endpoint entry enum error_status_t \\\r\nexplicit_handle \\\r\nfault_status first_is float \\\r\nhandle_t heap helpcontext helpfile helpstring \\\r\nhelpstringcontext helpstringdll hidden hyper \\\r\nid idempotent ignore iid_as iid_is immediatebind implicit_handle \\\r\nimport importlib in include in_line int __int64 __int3264 interface \\\r\nlast_is lcid length_is library licensed local long \\\r\nmax_is maybe message methods midl_pragma \\\r\nmidl_user_allocate midl_user_free min_is module ms_union \\\r\nncacn_at_dsp ncacn_dnet_nsp ncacn_http ncacn_ip_tcp \\\r\nncacn_nb_ipx ncacn_nb_nb ncacn_nb_tcp ncacn_np \\\r\nncacn_spx ncacn_vns_spp ncadg_ip_udp ncadg_ipx ncadg_mq \\\r\nncalrpc nocode nonbrowsable noncreatable nonextensible notify \\\r\nobject odl oleautomation optimize optional out out_of_line \\\r\npipe pointer_default pragma properties propget propput propputref \\\r\nptr public \\\r\nrange readonly ref represent_as requestedit restricted retval \\\r\nshape short signed size_is small source strict_context_handle \\\r\nstring struct switch switch_is switch_type \\\r\ntransmit_as typedef \\\r\nuidefault union unique unsigned user_marshal usesgetlasterror uuid \\\r\nv1_enum vararg version void wchar_t wire_marshal\r\n\r\nkeywordclass.msidl=handle\r\nkeywordclass.xpidl=attribute native noscript scriptable shared wstring inout\r\nkeywords.$(file.patterns.idl)=$(keywordclass.idl) $(keywordclass.xpidl)\r\n\r\n# http://java.sun.com/docs/books/tutorial/java/nutsandbolts/_keywords.html\r\nkeywordclass.java=abstract assert boolean break byte case catch char class \\\r\nconst continue default do double else enum extends final finally float for \\\r\ngoto if implements import instanceof int interface long \\\r\nnative new package private protected public \\\r\nreturn short static strictfp super switch synchronized this throw throws \\\r\ntransient try var void volatile while\r\nkeywords.$(file.patterns.java)=$(keywordclass.java)\r\n\r\nkeywordclass.javafx=abstract after and as assert at attribute before bind bound break \\\r\ncatch class continue def delete else exclusive extends false finally for from function \\\r\nif import indexof insert instanceof lazy mod new not null \\\r\nor override package private protected public-init public public-read \\\r\nreturn reverse sizeof static super then this throw true try typeof \\\r\nvar while\r\nkeywords.$(file.patterns.javafx)=$(keywordclass.javafx)\r\n# Base types and global functions (defined in javafx.lang.Builtins and javafx.lang.FX)\r\n# And now language words deprecated from their keyword status...\r\nkeywords2.$(file.patterns.javafx)=Boolean Duration Integer Number Object String Void \\\r\nCharacter Byte Short Long Float Double \\\r\nisInitialized isSameObject print println \\\r\nfirst in init into inverse last on postinit replace step trigger tween where with\r\n# I don't know what first and last nor trigger do. Neither lazy or typeof...\r\n\r\nkeywordclass.javascript=abstract boolean break byte case catch char class \\\r\nconst continue debugger default delete do double else enum export extends \\\r\nfinal finally float for function goto if implements import in instanceof \\\r\nint interface long native new package private protected public \\\r\nreturn short static super switch synchronized this throw throws \\\r\ntransient try typeof var void volatile while with\r\nkeywords.$(file.patterns.js)=$(keywordclass.javascript)\r\n\r\nkeywordclass.flash=add and break case catch class continue default delete do \\\r\ndynamic else eq extends false finally for function ge get gt if implements import in \\\r\ninstanceof interface intrinsic le lt ne new not null or private public return \\\r\nset static super switch this throw true try typeof undefined var void while with\r\n\r\nkeywordclass2.flash=Array Arguments Accessibility Boolean Button Camera Color \\\r\nContextMenu ContextMenuItem Date Error Function Key LoadVars LocalConnection Math \\\r\nMicrophone Mouse MovieClip MovieClipLoader NetConnection NetStream Number Object \\\r\nPrintJob Selection SharedObject Sound Stage String StyleSheet System TextField \\\r\nTextFormat TextSnapshot Video Void XML XMLNode XMLSocket \\\r\n_accProps _focusrect _global _highquality _parent _quality _root _soundbuftime \\\r\narguments asfunction call capabilities chr clearInterval duplicateMovieClip \\\r\nescape eval fscommand getProperty getTimer getURL getVersion gotoAndPlay gotoAndStop \\\r\nifFrameLoaded Infinity -Infinity int isFinite isNaN length loadMovie loadMovieNum \\\r\nloadVariables loadVariablesNum maxscroll mbchr mblength mbord mbsubstring MMExecute \\\r\nNaN newline nextFrame nextScene on onClipEvent onUpdate ord parseFloat parseInt play \\\r\nprevFrame prevScene print printAsBitmap printAsBitmapNum printNum random removeMovieClip \\\r\nscroll set setInterval setProperty startDrag stop stopAllSounds stopDrag substring \\\r\ntargetPath tellTarget toggleHighQuality trace unescape unloadMovie unLoadMovieNum updateAfterEvent\r\n\r\nkeywords.$(file.patterns.flash)=$(keywordclass.flash)\r\nkeywords2.$(file.patterns.flash)=$(keywordclass2.flash)\r\n\r\nkeywordclass.vala=if else switch case default break continue return yield for foreach in \\\r\ndo while try catch finally throw\r\n\r\nkeywordclass2.vala=namespace interface class struct enum delegate signal errordomain \\\r\nconstruct get set value base const static var dynamic weak unowned virtual abstract \\\r\noverride public protected private extern throws requires ensures yields out ref lock \\\r\nusing true false null delete generic new this typeof sizeof as owned int string char bool\r\n\r\nkeywords.$(file.patterns.vala)=$(keywordclass.vala)\r\nkeywords2.$(file.patterns.vala)=$(keywordclass2.vala)\r\n\r\nkeywordclass.pike=constant enum if do for while else foreach case switch break continue \\\r\nreturn typeof catch class lambda import inherit static void int string float mixed object \\\r\nfunction program array mapping multiset\r\nkeywords.$(file.patterns.pike)=$(keywordclass.pike)\r\n\r\n# Markers\r\n# keywords6.$(file.patterns.c.like)=FIXME TODO XXX HACK UnresolvedMergeConflict UNDONE\r\n\r\n#lexer.cpp.track.preprocessor=1\r\n#lexer.cpp.update.preprocessor=1\r\n#lexer.cpp.hashquoted.strings=1\r\n\r\n# C++ styles\r\n\r\n# Default\r\n#style.cpp.32=$(font.base)\r\n# White space\r\nstyle.cpp.0=fore:#808080\r\n# Comment: /* */.\r\nstyle.cpp.1=$(colour.code.comment.box),$(font.code.comment.box)\r\n# Line Comment: //.\r\nstyle.cpp.2=$(colour.code.comment.line),$(font.code.comment.line)\r\n# Doc comment: block comments beginning with /** or /*!\r\nstyle.cpp.3=$(colour.code.comment.doc),$(font.code.comment.doc)\r\n# Number\r\nstyle.cpp.4=$(colour.number)\r\n# Keyword\r\nstyle.cpp.5=$(colour.keyword),bold\r\n# Double quoted string\r\nstyle.cpp.6=$(colour.string)\r\n# Single quoted string\r\nstyle.cpp.7=$(colour.char)\r\n# UUIDs (only in IDL)\r\nstyle.cpp.8=fore:#804080\r\n# Preprocessor\r\nstyle.cpp.9=$(colour.preproc)\r\n# Operators\r\nstyle.cpp.10=$(colour.operator),bold\r\n# Identifiers\r\nstyle.cpp.11=\r\n# End of line where string is not closed\r\nstyle.cpp.12=fore:#000000,$(font.monospace),back:#E0C0E0,eolfilled\r\n# Verbatim strings for C#\r\nstyle.cpp.13=fore:#007F00,$(font.monospace),back:#E0FFE0,eolfilled\r\n# Regular expressions for JavaScript\r\nstyle.cpp.14=fore:#3F7F3F,$(font.monospace),back:#E0F0FF,eolfilled\r\n# Doc Comment Line: line comments beginning with /// or //!.\r\nstyle.cpp.15=$(colour.code.comment.doc),$(font.code.comment.doc)\r\n# Keywords2\r\nstyle.cpp.16=fore:#B00040\r\n# Comment keyword\r\nstyle.cpp.17=fore:#3060A0,$(font.code.comment.doc)\r\n# Comment keyword error\r\nstyle.cpp.18=fore:#804020,$(font.code.comment.doc)\r\n# Raw strings for C++0x\r\nstyle.cpp.20=$(colour.string),back:#FFF3FF,eolfilled\r\n# Triple-quoted strings for Vala\r\nstyle.cpp.21=$(font.monospace),fore:#007F00,back:#E0FFE0,eolfilled\r\n# Hash-quoted strings for Pike\r\nstyle.cpp.22=$(font.monospace),fore:#007F00,back:#E7FFD7,eolfilled\r\n# Preprocessor stream comment\r\nstyle.cpp.23=fore:#659900\r\n# Preprocessor stream doc comment\r\nstyle.cpp.24=$(colour.code.comment.doc)\r\n# User defined literals\r\nstyle.cpp.25=fore:#C06000\r\n# Task Marker\r\nstyle.cpp.26=fore:#BE07FF,$(font.code.comment.line)\r\n\r\n# Inactive states are 64 greater than their active counterparts\r\n\r\n# White space\r\nstyle.cpp.64=fore:#C0C0C0\r\n# Comment: /* */.\r\nstyle.cpp.65=$(style.cpp.1),fore:#90B090\r\n# Line Comment: //.\r\nstyle.cpp.66=$(style.cpp.2),fore:#90B090\r\n# Doc comment: block comments beginning with /** or /*!\r\nstyle.cpp.67=$(style.cpp.3),fore:#D0D0D0\r\n# Number\r\nstyle.cpp.68=$(style.cpp.4),fore:#90B0B0\r\n# Keyword\r\nstyle.cpp.69=$(style.cpp.5),fore:#9090B0\r\n# Double quoted string\r\nstyle.cpp.70=$(style.cpp.6),fore:#B090B0\r\n# Single quoted string\r\nstyle.cpp.71=$(style.cpp.7),fore:#B090B0\r\n# UUIDs (only in IDL)\r\nstyle.cpp.72=$(style.cpp.8),fore:#C0C0C0\r\n# Preprocessor\r\nstyle.cpp.73=$(style.cpp.9),fore:#B0B090\r\n# Operators\r\nstyle.cpp.74=$(style.cpp.10),fore:#B0B0B0\r\n# Identifiers\r\nstyle.cpp.75=$(style.cpp.11),fore:#B0B0B0\r\n# End of line where string is not closed\r\nstyle.cpp.76=$(style.cpp.12),fore:#000000\r\n# Verbatim strings for C#\r\nstyle.cpp.77=$(style.cpp.13),fore:#90B090\r\n# Regular expressions for JavaScript\r\nstyle.cpp.78=$(style.cpp.14),fore:#7FAF7F\r\n# Doc Comment Line: line comments beginning with /// or //!.\r\nstyle.cpp.79=$(style.cpp.15),fore:#C0C0C0\r\n# Keywords2\r\nstyle.cpp.80=$(style.cpp.16),fore:#C0C0C0\r\n# Comment keyword\r\nstyle.cpp.81=$(style.cpp.17),fore:#C0C0C0\r\n# Comment keyword error\r\nstyle.cpp.82=$(style.cpp.18),fore:#C0C0C0\r\n# Raw strings for C++0x\r\nstyle.cpp.84=$(style.cpp.20),fore:#B090B0\r\n# Triple-quoted strings for Vala\r\nstyle.cpp.85=$(style.cpp.21),fore:#90B090\r\n# Hash-quoted strings for Pike\r\nstyle.cpp.86=$(style.cpp.22),fore:#90B090\r\n# Preprocessor stream comment\r\nstyle.cpp.87=$(style.cpp.23),fore:#A0C090\r\n# Preprocessor stream doc comment\r\nstyle.cpp.88=$(style.cpp.23),fore:#C0C0C0\r\n# User defined literals\r\nstyle.cpp.89=fore:#D7A090\r\n# Task Marker\r\nstyle.cpp.90=fore:#C3A1CF,$(font.code.comment.line)\r\n\r\n# Braces are only matched in operator style\r\nbraces.cpp.style=10\r\n\r\nccopts=-pedantic -Os\r\ncc=g++ $(ccopts) -c $(FileNameExt) -o $(FileName).o\r\nccc=gcc $(ccopts) -c $(FileNameExt) -o $(FileName).o\r\n\r\nmake.command=make\r\n\r\ncommand.0.*=\"$(SciteDefaultHome)\\..\\rjit.bat\" \"$(FilePath)\"\r\ncommand.name.0.*=run rpp jit\r\ncommand.shortcut.0.*=F5\r\ncommand.save.before.0.*=1\r\n\r\ncommand.1.*=\"$(SciteDefaultHome)\\..\\rpp.exe\" \"$(FilePath)\"\r\ncommand.name.1.*=run rpp interpret\r\ncommand.shortcut.1.*=F6\r\ncommand.save.before.1.*=1\r\n\r\ncommand.2.*=\"$(SciteDefaultHome)\\..\\rpack.bat\" \"$(FilePath)\"\r\ncommand.name.2.*=build rpp jit\r\ncommand.shortcut.2.*=F7\r\ncommand.save.before.2.*=1\r\n\r\ncommand.3.*=\"$(SciteDefaultHome)\\..\\rjit_win.bat\" \"$(FilePath)\"\r\ncommand.name.3.*=run rpp jit win\r\ncommand.shortcut.3.*=Ctrl+F5\r\ncommand.save.before.3.*=1\r\n\r\ncommand.4.*=\"$(SciteDefaultHome)\\..\\rpack_win.bat\" \"$(FilePath)\"\r\ncommand.name.4.*=build rpp jit win\r\ncommand.shortcut.4.*=Ctrl+F7\r\ncommand.save.before.4.*=1"
  },
  {
    "path": "bin/ide/lisp.properties",
    "content": "# Define SciTE settings for lisp and Scheme files.\r\n\r\nfile.patterns.lisp=*.lsp;*.lisp\r\n\r\nfilter.lisp=LISP (lsp lisp)|$(file.patterns.lisp)|\r\n\r\nfile.patterns.scheme=*.scm;*.smd;*.ss\r\nfilter.scheme=Scheme (scm smd)|$(file.patterns.scheme)|\r\n\r\nlexer.$(file.patterns.lisp)=lisp\r\nlexer.$(file.patterns.scheme)=lisp\r\n\r\n# lisp build in functions, xlisp dialect\r\nkeywords.$(file.patterns.lisp)= not defun + - * / = < > <= >= princ \\\r\neval apply funcall quote identity function complement backquote lambda set setq setf \\\r\ndefun defmacro gensym make symbol intern symbol name symbol value symbol plist get \\\r\ngetf putprop remprop hash make array aref car cdr caar cadr cdar cddr caaar caadr cadar \\\r\ncaddr cdaar cdadr cddar cdddr caaaar caaadr caadar caaddr cadaar cadadr caddar cadddr \\\r\ncdaaar cdaadr cdadar cdaddr cddaar cddadr cdddar cddddr cons list append reverse last nth \\\r\nnthcdr member assoc subst sublis nsubst  nsublis remove length list length \\\r\nmapc mapcar mapl maplist mapcan mapcon rplaca rplacd nconc delete atom symbolp numberp \\\r\nboundp null listp consp minusp zerop plusp evenp oddp eq eql equal cond case and or let l if prog \\\r\nprog1 prog2 progn go return do dolist dotimes catch throw error cerror break \\\r\ncontinue errset baktrace evalhook truncate float rem min max abs sin cos tan expt exp sqrt \\\r\nrandom logand logior logxor lognot bignums logeqv lognand lognor \\\r\nlogorc2 logtest logbitp logcount integer length nil\r\n\r\nword.chars.lisp=$(chars.alpha)$(chars.numeric)_-<>.#+@$%^&=*!?\r\nword.characters.$(file.patterns.lisp)=$(word.chars.lisp)\r\n\r\n# Scheme functions, R5RS\r\nkeywords.$(file.patterns.scheme)= + - * / = < > <= >= => \\\r\nabs acos and angle append apply asin assoc assoc assq assv atan \\\r\nbegin boolean? \\\r\ncaar cadr call-with-current-continuation call/cc \\\r\ncall-with-input-file call-with-output-file call-with-values \\\r\ncar cdr \\\r\ncaar cadr cdar cddr \\\r\ncaaar caadr cadar caddr cdaar cdadr cddar cdddr \\\r\ncaaaar caaadr caadar caaddr cadaar cadadr caddar cadddr \\\r\ncdaaar cdaadr cdadar cdaddr cddaar cddadr cdddar cddddr \\\r\ncase ceiling char->integer \\\r\nchar-alphabetic? char-ci<=? char-ci<? char-ci=? char-ci>=? char-ci>? \\\r\nchar-downcase char-lower-case? char-numeric? char-ready? \\\r\nchar-upcase char-upper-case? char-whitespace? \\\r\nchar<=? char<? char=? char>=? char>? char? \\\r\nclose-input-port close-output-port complex? cond cons cos \\\r\ncurrent-input-port current-output-port \\\r\ndefine define-syntax delay denominator display do dynamic-wind \\\r\nelse eof-object? eq? equal? eqv? eval even? exact->inexact exact? \\\r\nexp expt \\\r\nfloor for-each force \\\r\ngcd \\\r\nif imag-part inexact->exact inexact? input-port? integer->char integer? interaction-environment \\\r\nlambda lcm length let let* let-syntax letrec letrec-syntax \\\r\nlist list->string list->vector list-ref list-tail list? load log \\\r\nmagnitude make-polar make-rectangular make-string make-vector \\\r\nmap max member memq memv min modulo \\\r\nnegative? newline not null-environment null? number->string number? numerator \\\r\nodd? open-input-file open-output-file or output-port? \\\r\npair? peek-char input-port? output-port? positive? procedure? \\\r\nquasiquote quote quotient \\\r\nrational? rationalize read read-char real-part real? remainder reverse round \\\r\nscheme-report-environment set! set-car! set-cdr! sin sqrt string \\\r\nstring->list string->number string->symbol string-append \\\r\nstring-ci<=? string-ci<? string-ci=? string-ci>=? string-ci>? \\\r\nstring-copy string-fill! string-length string-ref string-set! \\\r\nstring<=? string<? string=? string>=? string>? string? \\\r\nsubstring symbol->string symbol? syntax-rules \\\r\ntranscript-off transcript-on truncate \\\r\nunquote unquote-splicing \\\r\nvalues vector vector->list vector-fill! vector-length vector-ref vector-set! vector? \\\r\nwith-input-from-file with-output-to-file write write-char \\\r\nzero?\r\n\r\nword.chars.scheme=$(chars.alpha)$(chars.numeric)!$%&*/:<=>?^_~+-.@\r\nword.characters.$(file.patterns.scheme)=$(word.chars.scheme)\r\n\r\n\r\ncomment.block.lisp=;\r\ncomment.box.start.lisp=;;\r\ncomment.box.middle.lisp=;;\r\ncomment.box.end.lisp=;;\r\n\r\n\r\n# LISP styles\r\n\r\n# Default\r\nstyle.lisp.32=$(font.base)\r\n# White space\r\nstyle.lisp.0=fore:#808080\r\n# Line Comment\r\nstyle.lisp.1=$(colour.code.comment.box),$(font.code.comment.box)\r\n# Number\r\nstyle.lisp.2=$(colour.number)\r\n# Keyword\r\nstyle.lisp.3=$(colour.keyword),bold\r\n# String\r\nstyle.lisp.6=$(colour.string)\r\n# Operators\r\nstyle.lisp.10=$(colour.operator),bold\r\n# Identifiers\r\nstyle.lisp.9=\r\n# End of line where string is not closed\r\nstyle.lisp.8=fore:#000000,font:Verdana,size:9,back:#fefecc,eolfilled\r\n# Matched Operators\r\nstyle.lisp.34=fore:#0000FF,bold\r\nstyle.lisp.35=fore:#FF0000,bold\r\n# Braces are only matched in operator style\r\nbraces.lisp.style=10\r\n\r\n#command.go.$(file.patterns.scheme)=c:\\tools\\pscheme\\pscheme.exe /r $(FilePath)\r\ncommand.go.$(file.patterns.scheme)=c:\\tools\\gambit\\gsi.exe -f $(FilePath)\r\n#command.go.$(file.patterns.scheme)=c:\\tools\\plt\\mzscheme.exe -r $(FilePath)\r\ncommand.go.subsystem.$(file.patterns.scheme)=0\r\n"
  },
  {
    "path": "bin/ide/luaCOPYRIGHT",
    "content": "Lua License\n-----------\n\nLua is licensed under the terms of the MIT license reproduced below.\nThis means that Lua is free software and can be used for both academic\nand commercial purposes at absolutely no cost.\n\nFor details and rationale, see http://www.lua.org/license.html .\n\n===============================================================================\n\nCopyright (C) 1994-2008 Lua.org, PUC-Rio.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n===============================================================================\n\n(end of COPYRIGHT)\n"
  },
  {
    "path": "bin/ide/modules.api",
    "content": "rbool\r\nuchar\r\nushort\r\nshort\r\ntrue\r\nfalse\r\nnull\r\nelif\r\nelse\r\nif\r\nifn\r\nwhile\r\nfor\r\ndefault\r\nnamespace\r\nfriend\r\nclass\r\ngoto\r\nstruct\r\nstatic\r\noperator\r\nputs\r\nputsl\r\ngetsl\r\nfindf\r\nswitch\r\ncase\r\n\r\ncalle\r\ncall\r\nretn\r\nreti\r\n\r\npush\r\npop\r\n\r\njmp\r\njebxz\r\njebxnz\r\n\r\nhalt\r\nnop\r\n\r\nlea\r\nmov\r\nmov1\r\nmov8\r\n\r\nadd\r\nsub\r\nimul\r\nidiv\r\nimod\r\n\r\ncesb\r\ncnesb\r\ncgsb\r\ncgesb\r\nclsb\r\nclesb\r\n\r\nadd8\r\nsub8\r\nimul8\r\nidiv8\r\nimod8\r\ncgsb8\r\nclsb8\r\n\r\n_fadd8\r\n_fsub8\r\n_fmul8\r\n_fdiv8\r\n_fcgsb8\r\n_fclsb8\r\n\r\nband\r\nbor\r\nbnot\r\nbxor\r\nbshl\r\nbshr\r\nbsar\r\n\r\n_udiv\r\n_umod\r\n_ucgsb\r\n_ucgesb\r\n_uclsb\r\n_uclesb\r\n\r\nrn\r\n\r\nrd1\r\nrd2\r\nrd4\r\nrd8\r\nrdp\r\n\r\nesp\r\nebp\r\neax\r\nebx\r\necx\r\nedx\r\nesi\r\nedi\r\n\r\nvoid\r\nchar\r\nint\r\nuint\r\nint8\r\ndouble\r\nrp\r\nvar\r\nrbuf\r\nrstr\r\nrcs\r\n\r\nfunction\r\n\r\nbreak\r\ncontinue\r\ncontinued\r\nreturn\r\n\r\nthis\r\nsizeof\r\nmain\r\ninclude\r\nimport\r\nendif\r\nifdef\r\nifndef\r\ndefine\r\nenum\r\n\r\nto\r\nin\r\n\r\ntypeof\r\ns_ret\r\ns_off\r\ns_param\r\ns_local\r\nmac\r\n\r\nlambda\r\n\r\nr_ceil_div\r\nr_cond\r\ncdecl\r\nstdcall\r\narray\r\n_reti\r\nNOT\r\nAND\r\nOR\r\nXOR\r\nSHL\r\nSHR\r\nSAR\r\n\r\nr_new\r\nr_new_n\r\nr_delete\r\nr_delete_n\r\nr_swap\r\nr_reverse\r\nr_find_pos\r\nr_split\r\nr_split_e\r\nr_qsort\r\nr_find_pos_b\r\nrbufm\r\nrcode\r\nrdic\r\nrdir\r\nrf\r\nrff\r\nrfs\r\nrstrw\r\nrsock\r\nrset\r\nrmutex\r\nrlist\r\n"
  },
  {
    "path": "bin/ide/python.properties",
    "content": "# Define SciTE settings for Python files.\r\n\r\nfile.patterns.py=*.py;*.pyw\r\nfile.patterns.scons=SConstruct;SConscript\r\n\r\nshbang.python=py\r\n\r\nfilter.python=Python (py pyw)|$(file.patterns.py)|\r\n\r\nlexer.$(file.patterns.py)=python\r\nlexer.$(file.patterns.scons)=python\r\n\r\nkeywordclass.python2=and as assert break class continue def del elif \\\r\nelse except exec finally for from global if import in is lambda not \\\r\nor pass print raise return try while with yield\r\n\r\nkeywordclass.python3=False None True and as assert break class continue \\\r\ndef del elif else except finally for from global if import in is lambda \\\r\nnonlocal not or pass raise return try while with yield\r\n\r\nkeywordclass.python=$(keywordclass.python2)\r\n\r\n# Extra keywords for cython\r\nkeywordclass.cython=cdef cimport cpdef\r\n\r\nkeywords.$(file.patterns.py)=$(keywordclass.python) $(keywordclass.cython)\r\nkeywords.$(file.patterns.scons)=$(keywordclass.python)\r\n\r\n# If you uncomment the 3 lines below,\r\n# and put some words after \"keywordclass2.python=\",\r\n# those words will be styled by style.python.14\r\n\r\n#keywordclass2.python=\r\n#keywords2.$(file.patterns.py)=$(keywordclass2.python)\r\n#keywords2.$(file.patterns.scons)=$(keywordclass2.python)\r\n\r\n#~ statement.indent.$(file.patterns.py)=10 :\r\nstatement.indent.$(file.patterns.py)=5 class def elif else except finally \\\r\nfor if try while with\r\n\r\nstatement.lookback.$(file.patterns.py)=0\r\nblock.start.$(file.patterns.py)=\r\nblock.end.$(file.patterns.py)=\r\n\r\nview.indentation.examine.*.py=2\r\n\r\ntab.timmy.whinge.level=1\r\n\r\n#fold.quotes.python=1\r\n\r\ncomment.block.python=#~\r\n\r\nindent.python.colon=1\r\n\r\n# Python styles\r\n# White space\r\nstyle.python.0=fore:#808080\r\n# Comment\r\nstyle.python.1=fore:#007F00,$(font.comment)\r\n# Number\r\nstyle.python.2=fore:#007F7F\r\n# String\r\nstyle.python.3=fore:#7F007F,$(font.monospace)\r\n# Single quoted string\r\nstyle.python.4=fore:#7F007F,$(font.monospace)\r\n# Keyword\r\nstyle.python.5=fore:#00007F,bold\r\n# Triple quotes\r\nstyle.python.6=fore:#7F0000\r\n# Triple double quotes\r\nstyle.python.7=fore:#7F0000\r\n# Class name definition\r\nstyle.python.8=fore:#0000FF,bold\r\n# Function or method name definition\r\nstyle.python.9=fore:#007F7F,bold\r\n# Operators\r\nstyle.python.10=bold\r\n# Identifiers\r\nstyle.python.11=\r\n# Comment-blocks\r\nstyle.python.12=fore:#7F7F7F\r\n# End of line where string is not closed\r\nstyle.python.13=fore:#000000,$(font.monospace),back:#E0C0E0,eolfilled\r\n# Highlighted identifiers\r\nstyle.python.14=fore:#407090\r\n# Decorators\r\nstyle.python.15=fore:#805000\r\n# Matched Operators\r\nstyle.python.34=fore:#0000FF,bold\r\nstyle.python.35=fore:#FF0000,bold\r\n# Braces are only matched in operator style\r\nbraces.python.style=10\r\n\r\nif PLAT_WIN\r\n\tcommand.go.*.py=pythonw -u \"$(FileNameExt)\"\r\n\tcommand.go.subsystem.*.py=1\r\n\tcommand.go.*.pyw=pythonw -u \"$(FileNameExt)\"\r\n\tcommand.go.subsystem.*.pyw=1\r\n\tcommand.build.SConscript=scons.bat --up .\r\n\tcommand.build.SConstruct=scons.bat .\r\n\r\nif PLAT_GTK\r\n\tcommand.go.*.py=python -u \"$(FileNameExt)\"\r\n\tcommand.build.SConscript=scons --up .\r\n\tcommand.build.SConstruct=scons .\r\n\r\nif PLAT_MAC\r\n\tcommand.go.*.py=python -u \"$(FileNameExt)\"\r\n\tcommand.build.SConscript=scons --up .\r\n\tcommand.build.SConstruct=scons .\r\n\r\ncommand.name.1.$(file.patterns.py)=Syntax Check\r\ncommand.1.$(file.patterns.py)=python -c \"import py_compile; py_compile.compile(r'$(FilePath)')\"\r\n"
  },
  {
    "path": "bin/ide/scite.1",
    "content": ".TH SCITE 1 \"2001 February 26\"\n.SH NAME\nSciTE \\- a programmers text editor\n.SH SYNOPSIS\n.br\n.B SciTE\n[file ..]\n.SH DESCRIPTION\n.B SciTE\nis a graphical GTK+ based editor. It has support\nfor indenting, highlighting, and shortcuts in a myriad\nof languages and can be extended by editing object-oriented\nconfiguration files.\n.PP\nSupport is included for Java, C, C++, C#, Shell, Apache.\n.SH ON-LINE HELP\nType Alt-H or Click the Help Pulldown menu.\n.SH AUTHOR\nMost of\n.B SciTE\nwas made by Neil Hodgson, with a lot of help from others.\nSee Help\n.br\n.SH BUGS\nProbably.\n"
  },
  {
    "path": "bin/launch_ide.bat",
    "content": "start ide\\SciTE.exe"
  },
  {
    "path": "bin/line_check.bat",
    "content": "rpp -jit example\\line_check.h ../rpp/\r\nrpp -jit example\\line_check.h ../rlib/\r\nrpp -jit example\\line_check.h rsrc/\r\nrpp -jit example\\line_check.h example/\r\nrpp -jit example\\line_check.h gl/\r\npause"
  },
  {
    "path": "bin/nasm/bin.bat",
    "content": "@echo off\r\nrem cd /d %~dp0\r\n..\\rpp.exe bin.h %1"
  },
  {
    "path": "bin/nasm/bin.h",
    "content": "﻿\r\nimport rfile.h\r\n\r\nmain\r\n{\r\n\tv=rf.get_param\r\n\tif v.count<3\r\n\t\tputsl('invaild param')\r\n\t\treturn\r\n\ta=v[2]\r\n\tif rf.cmd('..\\\\rpp.exe -grub '+a)==0\r\n\t\tputsl('compile error')\r\n\t\treturn\r\n\tb=a.sub(0,a.count-2)\r\n\tif rf.cmd('nasm.exe '+b+'.asm -o '+b+'.bin')==0\r\n\t\tputsl('asm error')\r\n\trfile.remove(rcode.gbk_to_utf8(b)+'.asm')\r\n}"
  },
  {
    "path": "bin/nasm/cell.h",
    "content": "﻿/*\r\n裸机运行细胞自动机（生命游戏）\r\n*/\r\n\r\nimport rbufm.h\r\n\r\nmain\r\n{\r\n\trbufm<char> arr(25,80)\r\n\tchar* p=4194304\r\n\tfor i=0 to 24\r\n\t\tfor j=0 to 79\r\n\t\t\tarr[i,j]=(*p).toint%7\r\n\t\t\tp++\r\n\tchar col=0\r\n\tfor\r\n\t\tview(arr,col)\r\n\t\tdelay\r\n\t\ttrans(arr)\r\n}\r\n\r\nview(rbufm<char>& arr,char& col)\r\n{\r\n\tfor i=0 to 24\r\n\t\tfor j=0 to 79\r\n\t\t\tif arr[i,j]==1\r\n\t\t\t\trf.text(i*80+j,`*.tochar)//后面加上col可以变换颜色\r\n\t\t\telse\r\n\t\t\t\trf.text(i*80+j,` .tochar)\r\n\t\t\tcol++\r\n}\r\n\r\n//宏不能省略大括号\r\nmac addc(a,b)\r\n{\r\n\tif(a>=0&&a<25&&b>=0&&b<80)\r\n\t{\r\n\t\tif(arr[a,b]==1)\r\n\t\t{\r\n\t\t\tcount++;\r\n\t\t}\r\n\t}\r\n}\r\n\r\ntrans(rbufm<char>& arr)\r\n{\r\n\tfor i=0 to 24\r\n\t\tfor j=0 to 79\r\n\t\t\tcount=0\r\n\t\t\taddc(i-1,j-1)\r\n\t\t\taddc(i-1,j)\r\n\t\t\taddc(i-1,j+1)\r\n\t\t\taddc(i,j-1)\r\n\t\t\taddc(i,j+1)\r\n\t\t\taddc(i+1,j-1)\r\n\t\t\taddc(i+1,j)\r\n\t\t\taddc(i+1,j+1)\r\n\t\t\tif count==3\r\n\t\t\t\tarr[i,j]=1\r\n\t\t\telif count==2\r\n\t\t\t\t;\r\n\t\t\telse\r\n\t\t\t\tarr[i,j]=0\r\n}\r\n\r\ndelay\r\n{\r\n\tfor i=0 to 400_0000\r\n\t\t;\r\n}"
  },
  {
    "path": "bin/nasm/dec.inc",
    "content": "IMPORT GetCommandLineA\r\nIMPORT GetTickCount\r\nIMPORT Sleep\r\nIMPORT InitializeCriticalSection\r\nIMPORT DeleteCriticalSection\r\nIMPORT EnterCriticalSection\r\nIMPORT LeaveCriticalSection\r\nIMPORT _beginthreadex\r\nIMPORT WaitForSingleObject\r\nIMPORT CloseHandle\r\n\r\nIMPORT lstrlenW\r\nIMPORT FindClose\r\nIMPORT FindNextFileW\r\nIMPORT FindFirstFileW\r\n\r\nIMPORT WSAStartup\r\nIMPORT WSACleanup\r\nIMPORT socket\r\nIMPORT connect\r\nIMPORT closesocket\r\nIMPORT send\r\nIMPORT recv\r\nIMPORT bind\r\nIMPORT listen\r\nIMPORT accept\r\n\r\nIMPORT __iob_func\r\nIMPORT _fseeki64\r\nIMPORT _ftelli64\r\nIMPORT _wremove\r\nIMPORT _wrename\r\nIMPORT _wfopen\r\nIMPORT fopen\r\nIMPORT fclose\r\nIMPORT fread\r\nIMPORT fwrite\r\nIMPORT fseek\r\nIMPORT ftell\r\n\r\nIMPORT _time32\r\nIMPORT srand\r\nIMPORT rand\r\nIMPORT exit\r\nIMPORT system\r\nIMPORT malloc\r\nIMPORT free\r\nIMPORT memcpy\r\nIMPORT memset\r\nIMPORT strcpy\r\nIMPORT strlen\r\nIMPORT strcmp\r\nIMPORT sscanf\r\nIMPORT sprintf\r\n"
  },
  {
    "path": "bin/nasm/menu.lst",
    "content": "\r\ncolor black/cyan yellow/cyan\r\ntimeout 0\r\ndefault /default\r\n\r\ntitle rpp\r\nroot (hd0,0)\r\nkernel (hd0,0)/cell.bin\r\nboot\r\n\r\n\r\n\r\n"
  },
  {
    "path": "bin/nasm/windemos.inc",
    "content": "%ifndef __NASMX_DEMOS_INC__\r\n%define __NASMX_DEMOS_INC__\r\n\r\n;// nasmx.inc should always be the first file included.\r\n;// If you get the following nasm error:\r\n;//     fatal: unable to open include file 'nasmx.inc'\r\n;// then you need to specify the full directory path to the NASMX\r\n;// include directory using either the NASMENV environment variable or the\r\n;// -I include switch from the command line.\r\n;// For reference see the setpaths.bat file in the NASMX root directory.\r\n;//////////////////////////////////////////////////////////////\r\n;//\r\n;// NASMX Preprocessor\r\n;// Copyright (c) 2005-2013, The NASMX Project\r\n;//\r\n%ifndef __NASMX_INCLUDED__\r\n%define __NASMX_INCLUDED__\r\n\r\n;//////////////////////////////////////////////////////////////\r\n;//\r\n;// Check NASM Version\r\n;//\r\n%define __nxerrmsg \"NASM v2.09.08 or later required\"\r\n%ifdef __NASM_VERSION_ID__\r\n\t%if __NASM_VERSION_ID__ < 0x02090800\r\n\t\t%fatal __nxerrmsg\r\n\t%endif\r\n%else\r\n\t%fatal __nxerrmsg\r\n%endif\r\n%undef __nxerrmsg\r\n\r\n;//////////////////////////////////////////////////////////////\r\n;//\r\n;// Set a NASMX Definition\r\n;//\r\n%macro NASMX_DEFINE 1-2\r\n\t%if %0 > 1\r\n\t\t%ixdefine __NASMX_%[%1]__ %[2]\r\n\t%else\r\n\t\t%ixdefine __NASMX_%[%1]__\r\n\t%endif\r\n%endmacro\r\n\r\n\r\n;//////////////////////////////////////////////////////////////\r\n;//\r\n;// Get a NASMX Definition\r\n;//\r\n%macro NASMX_GET_DEFINE 2\r\n\t%ifdef __NASMX_%[%1]__\r\n\t\t%xdefine %[%2] __NASMX_%[%1]__\r\n\t%elifdef %2\r\n\t\t%undef %[%2]\r\n\t%endif\r\n%endmacro\r\n\r\n;//////////////////////////////////////////////////////////////\r\n;//\r\n;// Undefine a NASMX Definition\r\n;//\r\n%macro NASMX_UNDEF 1\r\n\t%ifdef __NASMX_%[%1]__\r\n\t\t%undef __NASMX_%[%1]__\r\n\t%else\r\n\t\t%warning NASMX Definition %[1] is not defined\r\n\t%endif\r\n%endmacro\r\n\r\n\r\n;//////////////////////////////////////////////////////////////\r\n;//\r\n;// Define NASMX Version\r\n;//\r\nNASMX_DEFINE VERSION,\"1.2\"\r\nNASMX_DEFINE VERSION_MAJOR, 1\r\nNASMX_DEFINE VERSION_MINOR, 2\r\nNASMX_DEFINE VERSION_REV, 12\r\nNASMX_DEFINE VERSION_ID, 0x0102000C\r\n\r\n\r\n;//////////////////////////////////////////////////////////////\r\n;//\r\n;// init NASMX context stack\r\n;//\r\n;%push __NASMX_CTX__\r\n\r\n\r\n;//////////////////////////////////////////////////////////////\r\n;//\r\n;// Set a Context Stack Value\r\n;//\r\n%macro NASMX_SET_CONTEXT_VALUE 2\r\n\t%xdefine %$$%1 %2\r\n%endmacro\r\n\r\n\r\n;//////////////////////////////////////////////////////////////\r\n;//\r\n;// native data sizes\r\n;// Must be defined here due to struc_size!\r\n%ixdefine byte_size    1\r\n%ixdefine word_size    2\r\n%ixdefine dword_size   4\r\n%ixdefine qword_size   8\r\n%ixdefine tword_size  10\r\n%ixdefine oword_size  16\r\n%ixdefine __m64_size   8\r\n%ixdefine __m128_size 16\r\n%ixdefine __m256_size 32\r\n%ixdefine __int64_size   8\r\n%ixdefine __int128_size 16\r\n%ixdefine __nxfloat_size     4\r\n%ixdefine __nxdouble_size    8\r\n%ixdefine __nxfloat32_size   4\r\n%ixdefine __nxfloat64_size   8\r\n%ixdefine __nxfloat80_size  10\r\n%ixdefine __nxfloat128_size 16\r\n;// native register sizes\r\n%idefine al_size  1\r\n%idefine bl_size  1\r\n%idefine cl_size  1\r\n%idefine dl_size  1\r\n%idefine ah_size  1\r\n%idefine bh_size  1\r\n%idefine ch_size  1\r\n%idefine dh_size  1\r\n%idefine ax_size  2\r\n%idefine bx_size  2\r\n%idefine cx_size  2\r\n%idefine dx_size  2\r\n%idefine di_size  2\r\n%idefine si_size  2\r\n%idefine sp_size  2\r\n%idefine bp_size  2\r\n%idefine bpl_size 1\r\n%idefine dil_size 1\r\n%idefine sil_size 1\r\n%idefine spl_size 1\r\n%idefine eax_size 4\r\n%idefine ebx_size 4\r\n%idefine ecx_size 4\r\n%idefine edx_size 4\r\n%idefine edi_size 4\r\n%idefine esi_size 4\r\n%idefine esp_size 4\r\n%idefine ebp_size 4\r\n%idefine rax_size 8\r\n%idefine rbx_size 8\r\n%idefine rcx_size 8\r\n%idefine rdx_size 8\r\n%idefine rdi_size 8\r\n%idefine rsi_size 8\r\n%idefine rsp_size 8\r\n%idefine rbp_size 8\r\n%idefine r8d_size  4\r\n%idefine r9d_size  4\r\n%idefine r10d_size 4\r\n%idefine r11d_size 4\r\n%idefine r12d_size 4\r\n%idefine r13d_size 4\r\n%idefine r14d_size 4\r\n%idefine r15d_size 4\r\n%idefine r8_size  8\r\n%idefine r9_size  8\r\n%idefine r10_size 8\r\n%idefine r11_size 8\r\n%idefine r12_size 8\r\n%idefine r13_size 8\r\n%idefine r14_size 8\r\n%idefine r15_size 8\r\n\r\n;// register aliases used to help with portability\r\n%ifidn __BITS__,64\r\n%ixdefine __AX rax\r\n%ixdefine __BX rbx\r\n%ixdefine __CX rcx\r\n%ixdefine __DX rdx\r\n%ixdefine __DI rdi\r\n%ixdefine __SI rsi\r\n%ixdefine __BP rbp\r\n%ixdefine __SP rsp\r\n%else\r\n%ixdefine __AX eax\r\n%ixdefine __BX ebx\r\n%ixdefine __CX ecx\r\n%ixdefine __DX edx\r\n%ixdefine __DI edi\r\n%ixdefine __SI esi\r\n%ixdefine __BP ebp\r\n%ixdefine __SP esp\r\n%endif\r\n;// register names used to help with macros invoke and uses\r\n%ixdefine __nx_reg_eax eax\r\n%ixdefine __nx_reg_ebx ebx\r\n%ixdefine __nx_reg_ecx ecx\r\n%ixdefine __nx_reg_edx edx\r\n%ixdefine __nx_reg_edi edi\r\n%ixdefine __nx_reg_esi esi\r\n%ixdefine __nx_reg_ebp ebp\r\n%ixdefine __nx_reg_esp esp\r\n%ixdefine __nx_reg_rax rax\r\n%ixdefine __nx_reg_rbx rbx\r\n%ixdefine __nx_reg_rcx rcx\r\n%ixdefine __nx_reg_rdx rdx\r\n%ixdefine __nx_reg_rdi rdi\r\n%ixdefine __nx_reg_rsi rsi\r\n%ixdefine __nx_reg_rbp rbp\r\n%ixdefine __nx_reg_rsp rsp\r\n%ixdefine __nx_reg_r8  r8\r\n%ixdefine __nx_reg_r9  r9\r\n%ixdefine __nx_reg_r10 r10\r\n%ixdefine __nx_reg_r11 r11\r\n%ixdefine __nx_reg_r12 r12\r\n%ixdefine __nx_reg_r13 r13\r\n%ixdefine __nx_reg_r14 r14\r\n%ixdefine __nx_reg_r15 r15\r\n\r\n\r\n;//////////////////////////////////////////////////////////////\r\n;//\r\n;// nasm storage types\r\n;//\r\n%ixdefine byte_reserve   RESB\r\n%ixdefine word_reserve   RESW\r\n%ixdefine dword_reserve  RESD\r\n%ixdefine qword_reserve  RESQ\r\n%ixdefine tword_reserve  REST\r\n%ixdefine oword_reserve  RESO\r\n%ixdefine __m64_reserve  RESQ\r\n%ixdefine __m128_reserve RESO\r\n%ixdefine __int64_reserve  RESQ\r\n%ixdefine __int128_reserve RESO\r\n%ixdefine __nxfloat_reserve    RESD\r\n%ixdefine __nxdouble_reserve   RESQ\r\n%ixdefine __nxfloat32_reserve  RESD\r\n%ixdefine __nxfloat64_reserve  RESQ\r\n%ixdefine __nxfloat80_reserve  RESO\r\n%ixdefine __nxfloat128_reserve RESO\r\n\r\n;//////////////////////////////////////////////////////////////\r\n;//\r\n;// nasm storage types\r\n;//\r\n%ixdefine byte_storage   DB\r\n%ixdefine word_storage   DW\r\n%ixdefine dword_storage  DD\r\n%ixdefine qword_storage  DQ\r\n%ixdefine tword_storage  DT\r\n%ixdefine oword_storage  DO\r\n%ixdefine __m64_storage  DQ\r\n%ixdefine __m128_storage DO\r\n%ixdefine __int64_storage  DQ\r\n%ixdefine __int128_storage DO\r\n%ixdefine __nxfloat_storage    DD\r\n%ixdefine __nxdouble_storage   DQ\r\n%ixdefine __nxfloat32_storage  DD\r\n%ixdefine __nxfloat64_storage  DQ\r\n%ixdefine __nxfloat80_storage  DO\r\n%ixdefine __nxfloat128_storage DO\r\n\r\n;//////////////////////////////////////////////////////////////\r\n;//\r\n;// nasmx classifcation of types\r\n;//\r\n;// Bits used to contain classification:\r\n;//  0-10 : size of type in bytes\r\n;//    11 : reserved (0)\r\n;// 12-15 : type   ( TODO: struc/union/class )\r\n;//         0 = int type\r\n;//         8 = (bit 15 set if float type, otherwise clear)\r\n;// \r\n%ixdefine byte_type   0x0001\r\n%ixdefine word_type   0x0002\r\n%ixdefine dword_type  0x0004\r\n%ixdefine qword_type  0x0008\r\n%ixdefine tword_type  0x000A\r\n%ixdefine oword_type  0x0010\r\n%ixdefine __m64_type  0x8008\r\n%ixdefine __m128_type 0x8010\r\n%ixdefine __m256_type 0x8020\r\n%ixdefine __int64_type  0x8008\r\n%ixdefine __int128_type 0x8010\r\n%ixdefine __nxfloat_type    0x8004\r\n%ixdefine __nxdouble_type   0x8008\r\n%ixdefine __nxfloat32_type  0x8004\r\n%ixdefine __nxfloat64_type  0x8008\r\n%ixdefine __nxfloat80_type  0x800A\r\n%ixdefine __nxfloat128_type 0x8010\r\n\r\n;// NASMX int types\r\n%ixdefine int8_t     byte\r\n%ixdefine uint8_t    byte\r\n%ixdefine int16_t    word\r\n%ixdefine uint16_t   word\r\n%ixdefine int32_t    dword\r\n%ixdefine uint32_t   dword\r\n%ixdefine long32_t   dword\r\n%ixdefine ulong32_t  dword\r\n%ixdefine int64_t    qword\r\n%ixdefine uint64_t   qword\r\n%ixdefine int80_t    tword\r\n%ixdefine uint80_t   tword\r\n%ixdefine int128_t   oword\r\n%ixdefine uint128_t  oword\r\n%ixdefine long64_t   qword\r\n%ixdefine ulong64_t  qword\r\n%ixdefine long128_t  oword\r\n%ixdefine ulong128_t oword\r\n;// NASMX Unicode Transformation Format types\r\n%ixdefine utf8_t     uint8_t\r\n%ixdefine utf16_t    uint16_t\r\n%ixdefine utf32_t    uint32_t\r\n;// C types\r\n;// The classification of long_t type  must be performed\r\n;// during __OUTPUT_FORMAT__ check as the actual sizes\r\n;// are different among operating systems.\r\n%ixdefine char_t     int8_t\r\n%ixdefine uchar_t    uint8_t\r\n%ixdefine short_t    int16_t\r\n%ixdefine ushort_t   uint16_t\r\n%ixdefine int_t      int32_t\r\n%ixdefine uint_t     uint32_t\r\n;// float types require special handling due to\r\n;// nasm FLOAT directives!\r\n%ixdefine float_t    __nxfloat\r\n%ixdefine double_t   __nxdouble\r\n%ixdefine float32_t  __nxfloat32\r\n%ixdefine float64_t  __nxfloat64\r\n%ixdefine float80_t  __nxfloat80\r\n%ixdefine float128_t __nxfloat128\r\n%idefine __float(v) dword __float32__(v)\r\n%idefine __double(v) qword __float64__(v)\r\n\r\n;// Map between native size and token.\r\n;// The define name was chosen as it will\r\n;// be displayed to the user if the macro\r\n;// nx_token_from_size() is called with\r\n;// an illegal value during assembly\r\n%ixdefine __nx_error_token_size_1  byte\r\n%ixdefine __nx_error_token_size_2  word\r\n%ixdefine __nx_error_token_size_4  dword\r\n%ixdefine __nx_error_token_size_8  qword\r\n%ixdefine __nx_error_token_size_10 tword\r\n%ixdefine __nx_error_token_size_16 xmm\r\n%ixdefine __nx_error_token_size_32 xmm\r\n\r\n%define typeof(x) ((x %+ _type >> 12) & 0x000F)\r\n%define sizeof(x) x %+ _size\r\n%define reserve(x) x %+ _reserve\r\n%define declare(x) x %+ _storage\r\n%define nx_token_from_size(x) __nx_error_token_size_ %+ x\r\n%idefine is_typeof_float(x) ((x %+ _type >> 15) & 0x0001)\r\n\r\n;//////////////////////////////////////////////////////////////\r\n;//\r\n;// NASMX ABI size and pointer types\r\n;//\r\n;//                 Windows     Linux       BSD\r\n;//        type     32   64     32   64     32   64\r\n;// sizeof(int)      4    4      4    4      4    4\r\n;// sizeof(long)     4    4      4    8      4    8\r\n;// sizeof(ptr)      4    8      4    8      4    8\r\n;// sizeof(size_t)   4    8      4    8      4    8\r\n%ixdefine size32_t dword\r\n%ixdefine size64_t qword\r\n%ixdefine size_t size%[__BITS__]_t\r\n%assign __NASMX_ABI_BITS__ sizeof(size_t) * 8\r\n%ifnidn __BITS__,__NASMX_ABI_BITS__\r\n\t%fatal unknown size_t: __BITS__\r\n%endif\r\n%ixdefine ptr32_t dword\r\n%ixdefine ptr64_t qword\r\n;// use for 32->64 bit expansion of either int or ptr\r\n%ixdefine ptrdiff_t ptr%[__BITS__]_t\r\n%ixdefine NASMX_PTR ptr%[__BITS__]_t\r\n;// remember: intptr's can be confusing when going\r\n;// from 32-bit to 64-bit as sizeof(ptr) is increased\r\n;// to 8 but sizeof(int) remains 4 potential allowing\r\n;// very large (long) ints when using intptrs as ints.\r\n%ixdefine intptr_t ptrdiff_t\r\n%ixdefine uintptr_t ptrdiff_t\r\n\r\n;//////////////////////////////////////////////////////////////\r\n;//\r\n;// Calling Convention Enumerations\r\n;// Used within IMPORT, PROTO, PROC, & INVOKE\r\n;//\r\n;// BIT\r\n;//   0-3: PREFIX - index into decorations (i.e. '_', '@', or '?' )\r\n;//        all bits clear if no prefix\r\n;//   4-7: SUFFIX - index into decorations (i.e. '@', '?', '$' )\r\n;//        all bits clear if no suffix\r\n;//  8-11: CALLCONV - calling convention enum\r\n;//    12: ARGROTATE - rotate direction of args pushed to stack\r\n;//        set if left rotation ( PASCAL = %rotate 1 ), clear if right rotation ( CDECL = %rotate -1)\r\n;//    13: RETPOPSARGS - stack adjustment responsibility\r\n;//        set if callee pops args ( PASCAL/STDCALL ), clear if caller adjusts stack ( CDECL )\r\n;//\r\n;// Notes:\r\n;//    You may create your own calling convention for your operating\r\n;//    system of choice by modifying the flags and macros.  However,\r\n;//    the standard calling conventions should continue to exist to\r\n;//    permit interfacing with system calls ( unless you're writing\r\n;//    an OS with a new ABI/API ;)\r\n;//\r\n%define __NASMX_DECLSPEC_CC_PREFIX_MASK__      0x0007\r\n%define __NASMX_DECLSPEC_CC_SUFFIX_MASK__      0x0070\r\n%define __NASMX_DECLSPEC_CC_ENUM_MASK__        0x0F00\r\n%define __NASMX_DECLSPEC_CC_ARGROTATE_MASK__   0x1000\r\n%define __NASMX_DECLSPEC_CC_RETPOPSARGS_MASK__ 0x2000\r\n\r\n;// universal calling conventions\r\n%idefine __NASMX_DECLSPEC_CALLCONV_NAKED__    0\r\n%idefine __NASMX_DECLSPEC_CALLCONV_PASCAL__   0x3100\r\n;// although currently specific to win32, the\r\n;// STDCALL calling convention can be useful\r\n%idefine __NASMX_DECLSPEC_CALLCONV_STDCALL__  0x2321\r\n;// The following 3 calling conventions are highly\r\n;// platform dependent and are defined within the\r\n;// OUTPUT_FORMAT check\r\n;// %idefine __NASMX_DECLSPEC_CALLCONV_CDECL__ 0x????\r\n;// %idefine __NASMX_DECLSPEC_CALLCONV_THISCALL__ 0x????\r\n;// %idefine __NASMX_DECLSPEC_CALLCONV_FASTCALL__ 0x????\r\n\r\n;// CALLCONV Enums\r\n;// coincidentally compatible with DotGNU\r\n;// System.Runtime.InteropServices.CallingConvention Enum\r\n%idefine __NASMX_DECLSPEC_CC_ENUM_NAKED__     0\r\n%idefine __NASMX_DECLSPEC_CC_ENUM_PASCAL__    1\r\n%idefine __NASMX_DECLSPEC_CC_ENUM_CDECL__     2\r\n%idefine __NASMX_DECLSPEC_CC_ENUM_STDCALL__   3\r\n%idefine __NASMX_DECLSPEC_CC_ENUM_THISCALL__  4\r\n%idefine __NASMX_DECLSPEC_CC_ENUM_FASTCALL__  5\r\n;// %idefine __NASMX_DECLSPEC_CALLCONV_CC_ENUM_RDFCALL__   6\r\n\r\n;// internal CALLCONV macros\r\n%define nx_declspec_cc_prefix(x)       (x & 0x0007)\r\n%define nx_declspec_cc_suffix(x)      ((x >> 4) & 0x0007)\r\n%define nx_declspec_cc_enum(x)        ((x >> 8) & 0x000F)\r\n%define nx_declspec_cc_argrotate(x)   ((x >> 12) & 0x0001)\r\n%define nx_declspec_cc_retpopsargs(x) ((x >> 13) & 0x0001)\r\n\r\n;// String containing chars that the prefix/suffix bits index into.\r\n;// If you are adding __thiscall convention for your compiler of\r\n;// choice make sure that the initial suffix char is present in\r\n;// the decorations string.\r\n%define __NASMX_DECLSPEC_CC_DECORATIONS__     '_@?$'\r\n;// The following formatted string is used by the nx_is* functions\r\n%define __NASMX_NUMALPHATOKEN__ '.+-0123456789EeABCDFabcdfGHIJKLMNOPQRSTUVWXYZghijklmnopqrstuvwxyz$@_'\r\n\r\n;//////////////////////////////////////////////////////////////\r\n;// internal macro call\r\n;// used by IMPORT, PROC, & INVOKE\r\n;// usage:\r\n;//    nx_callconv_decorate callconv, funcname, suffix\r\n;// examples:\r\n;//    nx_callconv_decorate __NASMX_DECLSPEC_CALLCONV_STDCALL__, WinProc, 16\r\n;//    nx_callconv_decorate __NASMX_DECLSPEC_CALLCONV_CDECL__, printf\r\n;//    nx_callconv_decorate __NASMX_DECLSPEC_CALLCONV_THISCALL__, ClassName.MethodName, 'Z1yi4p8aue'\r\n%macro nx_callconv_decorate 2-3.nolist 0\r\n\t%ifnum %1\r\n\t\t%assign %%__pidx nx_declspec_cc_prefix(%1)\r\n\t\t%assign %%__sidx nx_declspec_cc_suffix(%1)\r\n\t%else\r\n\t\t%fatal 'CALLCONV undefined:' %1\r\n\t%endif\r\n\t%ifnum %2\r\n\t\t%fatal 'internal error'\r\n\t%endif\r\n\r\n\t%if %%__pidx > 0\r\n\t\t%substr %%__sig __NASMX_DECLSPEC_CC_DECORATIONS__ %%__pidx\r\n\t\t%ifnum %2\r\n\t\t\t%fatal 'internal error'\r\n\t\t%elifid %2\r\n\t\t\t%defstr %%__func %2\r\n\t\t%eliftoken %2\r\n\t\t\t%defstr %%__func %2\r\n\t\t%else\r\n\t\t\t%define %%__func %2\r\n\t\t%endif\r\n\t\t%strcat %%__sig %%__sig,%%__func\r\n\t%else\r\n\t\t%ifstr %2\r\n\t\t\t%define %%__func %2\r\n\t\t%else\r\n\t\t\t%defstr %%__sig %2\r\n\t\t%endif\r\n\t%endif\r\n\t%if %%__sidx > 0\r\n\t\t%ifnum %3\r\n\t\t\t%defstr %%__suffix %3\r\n\t\t%elifid %3\r\n\t\t\t%defstr %%__suffix %3\r\n\t\t%else\r\n\t\t\t%ifstr %3\r\n\t\t\t\t%define %%__suffix %3\r\n\t\t\t%else\r\n\t\t\t\t%defstr %%__suffix %3\r\n\t\t\t%endif\r\n\t\t%endif\r\n\t\t%substr %%__stok __NASMX_DECLSPEC_CC_DECORATIONS__ %%__sidx\r\n\t\t%strcat %%__sig %%__sig,%%__stok,%%__suffix\r\n\t%endif\r\n\r\n\t%deftok %$__nxtok_decorated_name %%__sig\r\n\r\n%endmacro\r\n\r\n;//////////////////////////////////////////////////////////////\r\n;//\r\n;// Target Operating System Type definitions\r\n;//\r\n%define __NASMX_DECLSPEC_SYSTYPE_LINUX__   1\r\n%define __NASMX_DECLSPEC_SYSTYPE_MACHOS__  2\r\n%define __NASMX_DECLSPEC_SYSTYPE_BSD__     3\r\n%define __NASMX_DECLSPEC_SYSTYPE_WINDOWS__ 4\r\n\r\n;//////////////////////////////////////////////////////////////////\r\n;// Macro to control NASMX default behavior\r\n;// example usage:\r\n;//    NASMX_PRAGMA CALLSTACK, 32 ; Enable callstack optimization\r\n;//    NASMX_PRAGMA CALLSTACK, 0  ; Disable callstack optimization\r\n;//    NASMX_PRAGMA WARNING, DISABLE, ALL\r\n;//    NASMX_PRAGMA WARNING, DISABLE, 8001[, 8002, 8003]\r\n;//    NASMX_PRAGMA WARNING, ENABLE, ALL\r\n;// The macro will eventually allow us to enable/disable\r\n;// warnings generated by the NASMX macro type system\r\n%imacro NASMX_PRAGMA 1-*.nolist\r\n\t%ifidni WARNING,%1\r\n\t\t%warning actual pragma warnings currently unimplemented\r\n\t\t%ifidni ENABLE, %2\r\n\t\t\t;// assert: warnings are enabled if undefined\r\n\t\t\t%ifidni ALL,%3\r\n\t\t\t\t%ifdef __NASMX_PRAGMA_WARNING_8001__\r\n\t\t\t\t\t%undef __NASMX_PRAGMA_WARNING_8001__\r\n\t\t\t\t%endif\r\n\t\t\t\t%ifdef __NASMX_PRAGMA_WARNING_8002__\r\n\t\t\t\t\t%undef __NASMX_PRAGMA_WARNING_8002__\r\n\t\t\t\t%endif\r\n\t\t\t%else\r\n\t\t\t\t%rep %0-2\r\n\t\t\t\t\t%rotate 1\r\n\t\t\t\t\t%ifdef __NASMX_PRAGMA_WARNING_%1__\r\n\t\t\t\t\t\t%undef __NASMX_PRAGMA_WARNING_%1__\r\n\t\t\t\t\t%endif\r\n\t\t\t\t%endrep\r\n\t\t\t%endif\r\n\t\t%elifidni DISABLE, %2\r\n\t\t\t;// assert: warnings are disabled if defined\r\n\t\t\t%ifidni ALL,%3\r\n\t\t\t\t%ifndef __NASMX_PRAGMA_WARNING_8001__\r\n\t\t\t\t\t%define __NASMX_PRAGMA_WARNING_8001__\r\n\t\t\t\t%endif\r\n\t\t\t\t%ifndef __NASMX_PRAGMA_WARNING_8002__\r\n\t\t\t\t\t%define __NASMX_PRAGMA_WARNING_8002__\r\n\t\t\t\t%endif\r\n\t\t\t%else\r\n\t\t\t\t%rep %0-2\r\n\t\t\t\t\t%rotate 1\r\n\t\t\t\t\t%ifndef __NASMX_PRAGMA_WARNING_%3__\r\n\t\t\t\t\t\t%define __NASMX_PRAGMA_WARNING_%3__\r\n\t\t\t\t\t%endif\r\n\t\t\t\t%endrep\r\n\t\t\t%endif\r\n\t\t%else\r\n\t\t\t%error 'syntax: nasmx_pragma warning, [enable | disable], ...'\r\n\t\t%endif\r\n\t%elifidni CALLSTACK, %1\r\n\t\t;// This option is very useful with fastcall\r\n\t\t%ifdef NASMX_ENDPROC\r\n\t\t\t%error %1 pragma cannot be defined within procedure definition\r\n\t\t%endif\r\n\t\t%ifnum %2\r\n\t\t\t%assign %%__nx_stack_adjust %2\r\n\t\t\t%if %%__nx_stack_adjust > 0\r\n\t\t\t\t;// assert: turning on call stack feature\r\n\t\t\t\t%ifidni __OUTPUT_FORMAT__, win64\r\n\t\t\t\t\t;// assert: Win64 calling convention requires\r\n\t\t\t\t\t;// that the call stack be at least 32\r\n\t\t\t\t\t%if %%__nx_stack_adjust < 32\r\n\t\t\t\t\t\t%assign %%__nx_stack_adjust 32\r\n\t\t\t\t\t%endif\r\n\t\t\t\t%endif\r\n\t\t\t\t;// Note: x64 calling convention requires that\r\n\t\t\t\t;// the call stack be aligned to 16 bytes.\r\n\t\t\t\t;// Use 8 bytes for x86\r\n\t\t\t\t%assign %%__nx_align __NASMX_ABI_BITS__ / 4\r\n\t\t\t\t%assign %%__off (((%%__nx_stack_adjust + %%__nx_align) / %%__nx_align) * %%__nx_align)\r\n\t\t\t\t%assign %%__tmp (%%__nx_stack_adjust + %%__nx_align)\r\n\t\t\t\t%if (%%__off != %%__tmp)\r\n\t\t\t\t\t%assign %%__nx_stack_adjust %%__off\r\n\t\t\t\t%endif\r\n\t\t\t%endif\r\n\t\t\t;// This must be a global define since it is used within the procedure\r\n\t\t\t;// and during invoke and thus could be hidden by one or more user contexts\r\n\t\t\t%ifdef __NX_PROLOGUE_CALLSTACK_ADJUST__\r\n\t\t\t\t%undef __NX_PROLOGUE_CALLSTACK_ADJUST__\r\n\t\t\t%endif\r\n\t\t\t%if %%__nx_stack_adjust > 0\r\n\t\t\t\t%xdefine __NX_PROLOGUE_CALLSTACK_ADJUST__ %%__nx_stack_adjust\r\n\t\t\t%endif\r\n\t\t%else\r\n\t\t\t%error %1 pragma requires valid byte count\r\n\t\t%endif\r\n\t%else\r\n\t\t%error 'unknown nasmx_pragma:' %1\r\n\t%endif\r\n%endmacro\r\n\r\n;//////////////////////////////////////////////////////////////////\r\n;// Macro to override default ABI behavior (Declare Specialization)\r\n;// example usage:\r\n;//    NASMX_DECLSPEC CALLCONV, PASCAL\r\n;//    NASMX_DECLSPEC CALLCONV, STDCALL, DEFAULT\r\n;//    NASMX_DECLSPEC SYSTYPE, LINUX\r\n;//\r\n;// notes:\r\n;//    Make sure you understand the effects of using this command\r\n;//    before making a global declaration!  Unresolved linker errors\r\n;//    may haunt you!\r\n%imacro NASMX_DECLSPEC 1-8.nolist\r\n\t%ifidni %1,CALLCONV\r\n\t\t%if %0 < 2\r\n\t\t\t%error 'nasmx_declspec syntax'\r\n\t\t%endif\r\n\t\t%ifndef __NASMX_DECLSPEC_CALLCONV_%[%2]__\r\n\t\t\t%error 'unknown declspec calltype:' %2\r\n\t\t%endif\r\n\t\t%if %0 == 2\r\n\t\t\t%ixdefine __NASMX_DECLSPEC_CALLCONV_DEFAULT__ __NASMX_DECLSPEC_CALLCONV_%[%2]__\r\n\t\t%else\r\n\t\t\t%ifdef __NASMX_DECLSPEC_CALLCONV_%[%3]__\r\n\t\t\t\t%warning 'declspec redefining' %1 %2 %3\r\n\t\t\t%endif\r\n\t\t\t%ixdefine __NASMX_DECLSPEC_CALLCONV_%[%3]__ __NASMX_DECLSPEC_CALLCONV_%[%2]__\r\n\t\t%endif\r\n\t%else\r\n\t\t%ifidni %1,SYSTYPE\r\n\t\t\t%ifndef __NASMX_DECLSPEC_SYSTYPE_%[%2]__\r\n\t\t\t\t%error 'unknown declspec systype:' %2\r\n\t\t\t%endif\r\n\t\t\t%if %0 == 2\r\n\t\t\t\t%ixdefine __NASMX_DECLSPEC_SYSTYPE_DEFAULT__ __NASMX_DECLSPEC_SYSTYPE_%[%2]__\r\n\t\t\t%else\r\n\t\t\t\t%ifdef __NASMX_DECLSPEC_SYSTYPE_%[%3]__\r\n\t\t\t\t\t%warning 'declspec redefining' %1 %2 %3\r\n\t\t\t\t%endif\r\n\t\t\t\t%ixdefine __NASMX_DECLSPEC_SYSTYPE_%[%3]__ __NASMX_DECLSPEC_SYSTYPE_%[%2]__\r\n\t\t\t%endif\r\n\t\t%else\r\n\t\t\t%error 'unknown declspec:' %1\r\n\t\t%endif\r\n\t%endif\r\n%endmacro\r\n\r\n\r\n;//////////////////////////////////////////////////////////////////\r\n;// OUTPUT_FORMAT check\r\n;//\r\n;// All system specific defines are made here\r\n;//\r\n%ifidn\t __OUTPUT_FORMAT__,elf\r\n\t%idefine __NASMX_DECLSPEC_CALLCONV_CDECL__    0x0200\r\n\t%idefine __NASMX_DECLSPEC_CALLCONV_THISCALL__ 0x0410\r\n\t%idefine __NASMX_DECLSPEC_CALLCONV_FASTCALL__ 0x0500\r\n\t%define __NASMX_DECLSPEC_FASTCALL_MAXINTREGS__    2\r\n\t%define __NASMX_DECLSPEC_FASTCALL_MAXFLOATREGS__  0\r\n\t%define __NASMX_DECLSPEC_FASTCALL_REGINTARGS_4__ 'ECXEDX'\r\n\t%define __NASMX_DECLSPEC_FASTCALL_REGINTARGS_2__ 'CX DX '\r\n\t%ifdef FREEBSD\r\n\t\tNASMX_DECLSPEC SYSTYPE, BSD\r\n\t%elifdef NETBSD\r\n\t\tNASMX_DECLSPEC SYSTYPE, BSD\r\n\t%elifdef OPENBSD\r\n\t\tNASMX_DECLSPEC SYSTYPE, BSD\r\n\t%else\r\n\t\tNASMX_DECLSPEC SYSTYPE, LINUX\r\n\t%endif\r\n\tNASMX_DECLSPEC CALLCONV, CDECL, DEFAULT\r\n\t%idefine long_t long32_t\r\n\t%idefine ulong_t ulong32_t\r\n\t%idefine wchar_t dword\r\n\t%ifdef UNICODE\r\n\t\t%idefine NASMX_TCHAR wchar_t\r\n\t\t%idefine NASMX_TEXT(x) __utf32__(x)\r\n\t%else\r\n\t\t%idefine NASMX_TCHAR char_t\r\n\t\t%idefine NASMX_TEXT(x) x\r\n\t%endif\r\n%elifidn __OUTPUT_FORMAT__,elf32\r\n\t;// gcc does NOT prepend underscores to functions\r\n\t;// declared using cdecl\r\n\t%idefine __NASMX_DECLSPEC_CALLCONV_CDECL__    0x0200\r\n\t%idefine __NASMX_DECLSPEC_CALLCONV_THISCALL__ 0x0410\r\n\t%idefine __NASMX_DECLSPEC_CALLCONV_FASTCALL__ 0x0500\r\n\t%define __NASMX_DECLSPEC_FASTCALL_MAXINTREGS__    2\r\n\t%define __NASMX_DECLSPEC_FASTCALL_MAXFLOATREGS__  0\r\n\t%define __NASMX_DECLSPEC_FASTCALL_REGINTARGS_4__ 'ECXEDX'\r\n\t%define __NASMX_DECLSPEC_FASTCALL_REGINTARGS_2__ 'CX DX '\r\n\t%ifdef FREEBSD\r\n\t\tNASMX_DECLSPEC SYSTYPE, BSD\t\r\n\t%elifdef NETBSD\r\n\t\tNASMX_DECLSPEC SYSTYPE, BSD\t\r\n\t%elifdef OPENBSD\r\n\t\tNASMX_DECLSPEC SYSTYPE, BSD\t\r\n\t%else\r\n\t\tNASMX_DECLSPEC SYSTYPE, LINUX\r\n\t%endif\r\n\tNASMX_DECLSPEC CALLCONV, CDECL, DEFAULT\r\n\t%idefine long_t long32_t\r\n\t%idefine ulong_t ulong32_t\r\n\t%idefine wchar_t dword\r\n\t%ifdef UNICODE\r\n\t\t%idefine NASMX_TCHAR wchar_t\r\n\t\t%idefine NASMX_TEXT(x) __utf32__(x)\r\n\t%else\r\n\t\t%idefine NASMX_TCHAR char_t\r\n\t\t%idefine NASMX_TEXT(x) x\r\n\t%endif\r\n%elifidn __OUTPUT_FORMAT__,elf64\r\n\t%idefine __NASMX_DECLSPEC_CALLCONV_CDECL__    0x0200\r\n\t%idefine __NASMX_DECLSPEC_CALLCONV_THISCALL__ 0x0410\r\n\t%idefine __NASMX_DECLSPEC_CALLCONV_FASTCALL__ 0x0500\r\n\t%define __NASMX_DECLSPEC_FASTCALL_MAXINTREGS__    6\r\n\t%define __NASMX_DECLSPEC_FASTCALL_MAXFLOATREGS__  8\r\n\t%define __NASMX_DECLSPEC_FASTCALL_REGINTARGS_8__ 'RDIRSIRDXRCXR8 R9 '\r\n\t%define __NASMX_DECLSPEC_FASTCALL_REGINTARGS_4__ 'EDIESIEDXECXR8DR9D'\r\n\t%define __NASMX_DECLSPEC_FASTCALL_REGINTARGS_2__ 'DI SI DX CX R8WR9W'\r\n\t%ifdef FREEBSD\r\n\t\tNASMX_DECLSPEC SYSTYPE, BSD\t\r\n\t%elifdef NETBSD\r\n\t\tNASMX_DECLSPEC SYSTYPE, BSD\t\r\n\t%elifdef OPENBSD\r\n\t\tNASMX_DECLSPEC SYSTYPE, BSD\t\r\n\t%else\r\n\t\tNASMX_DECLSPEC SYSTYPE, LINUX\r\n\t%endif\r\n\tNASMX_DECLSPEC CALLCONV, FASTCALL, DEFAULT\r\n\t%idefine long_t long64_t\r\n\t%idefine ulong_t ulong64_t\r\n\t%idefine wchar_t dword\r\n\t%ifdef UNICODE\r\n\t\t%idefine NASMX_TCHAR wchar_t\r\n\t\t%idefine NASMX_TEXT(x) __utf32__(x)\r\n\t%else\r\n\t\t%idefine NASMX_TCHAR char_t\r\n\t\t%idefine NASMX_TEXT(x) x\r\n\t%endif\r\n%elifidn __OUTPUT_FORMAT__,macho\r\n\t%idefine __NASMX_DECLSPEC_CALLCONV_CDECL__    0x0201\r\n\t%idefine __NASMX_DECLSPEC_CALLCONV_THISCALL__ 0x0411\r\n\t%idefine __NASMX_DECLSPEC_CALLCONV_FASTCALL__ 0x0501\r\n\t%define __NASMX_DECLSPEC_FASTCALL_MAXINTREGS__    0\r\n\t%define __NASMX_DECLSPEC_FASTCALL_MAXFLOATREGS__  0\r\n\tNASMX_DECLSPEC SYSTYPE, MACHOS\r\n\tNASMX_DECLSPEC CALLCONV, CDECL, DEFAULT\r\n\t%idefine long_t long32_t\r\n\t%idefine ulong_t ulong32_t\r\n\t%idefine wchar_t dword\r\n\t%ifdef UNICODE\r\n\t\t%idefine NASMX_TCHAR wchar_t\r\n\t\t%idefine NASMX_TEXT(x) __utf32__(x)\r\n\t%else\r\n\t\t%idefine NASMX_TCHAR char_t\r\n\t\t%idefine NASMX_TEXT(x) x\r\n\t%endif\r\n%elifidn __OUTPUT_FORMAT__,macho32\r\n\t%idefine __NASMX_DECLSPEC_CALLCONV_CDECL__    0x0201\r\n\t%idefine __NASMX_DECLSPEC_CALLCONV_THISCALL__ 0x0411\r\n\t%idefine __NASMX_DECLSPEC_CALLCONV_FASTCALL__ 0x0501\r\n\t%define __NASMX_DECLSPEC_FASTCALL_MAXINTREGS__    0\r\n\t%define __NASMX_DECLSPEC_FASTCALL_MAXFLOATREGS__  0\r\n\tNASMX_DECLSPEC SYSTYPE, MACHOS\r\n\tNASMX_DECLSPEC CALLCONV, CDECL, DEFAULT\r\n\t%idefine long_t long32_t\r\n\t%idefine ulong_t ulong32_t\r\n\t%idefine wchar_t dword\r\n\t%ifdef UNICODE\r\n\t\t%idefine NASMX_TCHAR wchar_t\r\n\t\t%idefine NASMX_TEXT(x) __utf32__(x)\r\n\t%else\r\n\t\t%idefine NASMX_TCHAR char_t\r\n\t\t%idefine NASMX_TEXT(x) x\r\n\t%endif\r\n%elifidn __OUTPUT_FORAMT__,macho64\r\n\t%idefine __NASMX_DECLSPEC_CALLCONV_CDECL__    0x0201\r\n\t%idefine __NASMX_DECLSPEC_CALLCONV_THISCALL__ 0x0411\r\n\t%idefine __NASMX_DECLSPEC_CALLCONV_FASTCALL__ 0x0501\r\n\t%define __NASMX_DECLSPEC_FASTCALL_MAXINTREGS__    6\r\n\t%define __NASMX_DECLSPEC_FASTCALL_MAXFLOATREGS__  8\r\n\t%define __NASMX_DECLSPEC_FASTCALL_REGINTARGS_8__ 'RDIRSIRDXRCXR8 R9 '\r\n\t%define __NASMX_DECLSPEC_FASTCALL_REGINTARGS_4__ 'EDIESIEDXECXR8dR9d'\r\n\t%define __NASMX_DECLSPEC_FASTCALL_REGINTARGS_2__ 'DI SI DX CX R8wR9w'\r\n\tNASMX_DECLSPEC SYSTYPE, MACHOS\r\n\tNASMX_DECLSPEC CALLCONV, FASTCALL, DEFAULT\r\n\t%idefine long_t long64_t\r\n\t%idefine ulong_t ulong64_t\r\n\t%idefine wchar_t dword\r\n\t%ifdef UNICODE\r\n\t\t%idefine NASMX_TCHAR wchar_t\r\n\t\t%idefine NASMX_TEXT(x) __utf32__(x)\r\n\t%else\r\n\t\t%idefine NASMX_TCHAR char_t\r\n\t\t%idefine NASMX_TEXT(x) x\r\n\t%endif\r\n%elifidn __OUTPUT_FORMAT__,win32\r\n\t%idefine __NASMX_DECLSPEC_CALLCONV_CDECL__    0x0201\r\n\t%idefine __NASMX_DECLSPEC_CALLCONV_THISCALL__ 0x2423\r\n\t%idefine __NASMX_DECLSPEC_CALLCONV_FASTCALL__ 0x2522\r\n\t%define __NASMX_DECLSPEC_FASTCALL_MAXINTREGS__    2\r\n\t%define __NASMX_DECLSPEC_FASTCALL_MAXFLOATREGS__  0\r\n\t%define __NASMX_DECLSPEC_FASTCALL_REGINTARGS_4__ 'ECXEDX'\r\n\t%define __NASMX_DECLSPEC_FASTCALL_REGINTARGS_2__ 'CX DX '\r\n\tNASMX_DECLSPEC SYSTYPE, WINDOWS\r\n\tNASMX_DECLSPEC CALLCONV, STDCALL, DEFAULT\r\n\t%idefine long_t long32_t\r\n\t%idefine ulong_t ulong32_t\r\n\t%idefine wchar_t word\r\n\t%ifdef UNICODE\r\n\t\t%idefine NASMX_TCHAR wchar_t\r\n\t\t%idefine NASMX_TEXT(x) __utf16__(x)\r\n\t%else\r\n\t\t%idefine NASMX_TCHAR char_t\r\n\t\t%idefine NASMX_TEXT(x) x\r\n\t%endif\r\n%elifidn __OUTPUT_FORMAT__,win64\r\n\t%idefine __NASMX_DECLSPEC_CALLCONV_CDECL__    0x0201\r\n\t%idefine __NASMX_DECLSPEC_CALLCONV_THISCALL__ 0x2423\r\n\t%idefine __NASMX_DECLSPEC_CALLCONV_FASTCALL__ 0x0500\r\n\t%define __NASMX_DECLSPEC_FASTCALL_MAXINTREGS__    4\r\n\t%define __NASMX_DECLSPEC_FASTCALL_MAXFLOATREGS__  4\r\n\t%define __NASMX_DECLSPEC_FASTCALL_REGINTARGS_8__ 'RCXRDXR8 R9 '\r\n\t%define __NASMX_DECLSPEC_FASTCALL_REGINTARGS_4__ 'ECXEDXR8DR9D'\r\n\t%define __NASMX_DECLSPEC_FASTCALL_REGINTARGS_2__ 'CX DX R8WR9W'\r\n\tNASMX_DECLSPEC SYSTYPE, WINDOWS\r\n\tNASMX_DECLSPEC CALLCONV, FASTCALL, DEFAULT\r\n\t%idefine long_t long32_t\r\n\t%idefine ulong_t ulong32_t\r\n\t%idefine wchar_t word\r\n\t%ifdef UNICODE\r\n\t\t%idefine NASMX_TCHAR wchar_t\r\n\t\t%idefine NASMX_TEXT(x) __utf16__(x)\r\n\t%else\r\n\t\t%idefine NASMX_TCHAR char_t\r\n\t\t%idefine NASMX_TEXT(x) x\r\n\t%endif\r\n%else\r\n\t%idefine __NASMX_DECLSPEC_CALLCONV_CDECL__    0x0200\r\n\t%idefine __NASMX_DECLSPEC_CALLCONV_THISCALL__ 0x0410\r\n\t%idefine __NASMX_DECLSPEC_CALLCONV_FASTCALL__ 0x0500\r\n\t%define __NASMX_DECLSPEC_FASTCALL_MAXINTREGS__    0\r\n\t%define __NASMX_DECLSPEC_FASTCALL_MAXFLOATREGS__  0\r\n\tNASMX_DECLSPEC SYSTYPE, LINUX\r\n\tNASMX_DECLSPEC CALLCONV, CDECL, DEFAULT\r\n\t%if sizeof(size_t) == 32\r\n\t\t%idefine long_t long32_t\r\n\t\t%idefine ulong_t ulong32_t\r\n\t%else\r\n\t\t%idefine long_t long64_t\r\n\t\t%idefine ulong_t ulong64_t\r\n\t%endif\r\n\t%idefine wchar_t dword\r\n\t%ifdef UNICODE\r\n\t\t%idefine NASMX_TCHAR wchar_t\r\n\t\t%idefine NASMX_TEXT(x) __utf32__(x)\r\n\t%else\r\n\t\t%idefine NASMX_TCHAR char_t\r\n\t\t%idefine NASMX_TEXT(x) x\r\n\t%endif\r\n%endif\r\n\r\n;// pull in appropriate syscalls\r\n%if __NASMX_DECLSPEC_SYSTYPE_DEFAULT__ == __NASMX_DECLSPEC_SYSTYPE_BSD__\r\n    %ifdef FREEBSD\r\n\t%include 'bsd/syscalls.freebsd.inc'\r\n    %elifdef NETBSD\r\n\t%include 'bsd/syscalls.netbsd.inc'\r\n    %elifdef OPENBSD\r\n\t%include 'bsd/syscalls.openbsd.inc'\r\n    %endif\r\n%elif __NASMX_DECLSPEC_SYSTYPE_DEFAULT__ == __NASMX_DECLSPEC_SYSTYPE_LINUX__\r\n    %include 'linux/syscall.inc'\r\n%endif\r\n\r\n\r\n;//////////////////////////////////////////////////////////////\r\n;//\r\n;// NASMX_STRUC\r\n;//\r\n%imacro NASMX_STRUC 0-*.nolist __NX_ROOT, __NX_ROOT, __NX_CTX_STRUC\r\n\t%ifnidni %3,__NX_CTX_STRUC\r\n\t\t%ifnidni %3,__NX_CTX_UNION\r\n\t\t\t%fatal unknown arg: %{3}\r\n\t\t%endif\r\n\t%endif\r\n\t%ifctx __NX_CTX_STRUC\r\n\t\t%define %%__is_nested 1\r\n\t%elifctx __NX_CTX_UNION\r\n\t\t%define %%__is_nested 1\r\n\t%else\r\n\t\t%define %%__is_nested 0\r\n\t%endif\r\n\t%ifidni %1, __NX_ROOT\r\n\t\t%define %%__is_named 0\r\n\t%else\r\n\t\t%define %%__is_named 1\r\n\t%endif\r\n\t%if (%%__is_nested == 0)\r\n\t\t%if (%%__is_named == 0)\r\n\t\t\t%fatal root structure or union requires name\r\n\t\t%endif\r\n\t\t%push %3\r\n\t\t%xdefine %$__nx_name %1\r\n\t\t%assign %$__nx_size 0\r\n\t%else\r\n\t\t%if (%%__is_named == 0)\r\n\t\t\t%xdefine %%__tname %{$__nx_name}\r\n\t\t%else\r\n\t\t\t%xdefine %%__tname %{$__nx_name}.%1\r\n\t\t%endif\r\n\t\t;// the following 5 line sequence fails on 2.08.02\r\n\t\t%assign %%__tsize %$__nx_size\r\n\t\t%push %3\r\n\t\t%xdefine %$__nx_name %%__tname\r\n\t\t%assign %$__nx_size %%__tsize\r\n\t\t%if (%%__is_named == 1)\r\n\t\t\t%{$__nx_name} equ %$__nx_size\r\n\t\t%endif\r\n\t%endif\r\n\t%assign %$__nx_osize %$__nx_size\r\n\t%assign %$__nx_usize 0\r\n\t%define %$__nx_isnamed %%__is_named\r\n\t%if (%%__is_named == 1)\r\n\t\t%ifidni %3,__NX_CTX_STRUC\r\n\t\t\t%xdefine %{$__nx_name}_type struc_type\r\n\t\t%elifidni %3,__NX_CTX_UNION\r\n\t\t\t%xdefine %{$__nx_name}_type union_type\r\n\t\t%else\r\n\t\t\t%fatal unknown arg: %{3}\r\n\t\t%endif\r\n\t\t%xdefine %{$__nx_name}_reserve byte_reserve\r\n\t\t%xdefine %{$__nx_name}_storage byte_storage\r\n\t%endif\r\n%endmacro\r\n\r\n%imacro NASMX_UNION 0-*.nolist __NX_ROOT, __NX_ROOT, __NX_CTX_UNION\r\n\tNASMX_STRUC %1, __NX_ROOT, __NX_CTX_UNION\r\n%endmacro\r\n\r\n%imacro NASMX_ALIGN 1.nolist\r\n\t%ifnctx __NX_CTX_STRUC\r\n\t\t%ifnctx __NX_CTX_UNION\r\n\t\t\t%fatal corrupt context\r\n\t\t%endif\r\n\t%endif\r\n\t%if (%1 > 0)\r\n\t\t%assign %%__off (((%$__nx_size + %1) / %1) * %1)\r\n\t\t%assign %%__tmp (%$__nx_size + %1)\r\n\t\t%if (%%__off != %%__tmp)\r\n\t\t\t%assign %$__nx_size %%__off\r\n\t\t%endif\r\n\t%endif\r\n%endmacro\r\n\r\n;// usage:\r\n;//   NASMX_RESERVE hWnd, NASMX_PTR, 1\r\n%imacro NASMX_RESERVE 2-3.nolist 1\r\n\t%ifnctx __NX_CTX_STRUC\r\n\t\t%ifnctx __NX_CTX_UNION\r\n\t\t\t%fatal corrupt context\r\n\t\t%endif\r\n\t%endif\r\n\t%ifndef %{2}_size\r\n\t\t%fatal unknown size for %{$__nx_name} %{1}: %{2}\r\n\t%endif\r\n\t%assign %%__argsize %{2}_size\r\n\t%if (%%__argsize < 1)\r\n\t\t%fatal invalid arg size for %{$__nx_name} %{1}: %{2}\r\n\t%endif\r\n\t%ifndef %{2}_storage\r\n\t\t%fatal unknown storage tag for %{$__nx_name} %{1}\r\n\t%endif\r\n\r\n\t%assign %%__qty %{3}\r\n\t%if (%%__qty < 1)\r\n\t\t%fatal invalid arg qty  for %{$__nx_name} %{1}: %{3}\r\n\t%endif\r\n\r\n\t%assign %%__amt (%%__argsize * %%__qty)\r\n\r\n\t%xdefine %[%{$__nx_name}.%{1}]_size %%__amt\r\n\t%xdefine %[%{$__nx_name}.%{1}]_type %[%{2}]_type\r\n\t%xdefine %[%{$__nx_name}.%{1}]_reserve %[%{2}]_reserve\r\n\t%xdefine %[%{$__nx_name}.%{1}]_storage %[%{2}]_storage\r\n\t%[%{$__nx_name}.%{1}] equ %[%{$__nx_size}]\r\n\r\n\t%ifctx __NX_CTX_UNION\r\n\t\t;// update current union size\r\n\t\t%if (%%__amt > %$__nx_usize)\r\n\t\t\t%assign %$__nx_usize %%__amt\r\n\t\t%endif\r\n\t%else\r\n\t\t;// update running size\r\n\t\t%assign %$__nx_size (%$__nx_size + %%__amt)\r\n\t%endif\r\n%endmacro\r\n\r\n%imacro NASMX_ENDSTRUC 0.nolist\r\n\t%ifnctx __NX_CTX_STRUC\r\n\t\t%ifnctx __NX_CTX_UNION\r\n\t\t\t%fatal corrupt context\r\n\t\t%endif\r\n\t%endif\r\n\t%if ((%$__nx_size-%$__nx_osize) > %$__nx_usize)\r\n\t\t%assign %$__nx_usize %$__nx_size-%$__nx_osize\r\n\t%endif\r\n\t%if (%$__nx_isnamed == 1)\r\n\t\t%{$__nx_name}_size equ %$__nx_usize\r\n\t%endif\r\n\t%assign %%__usize %$__nx_usize\r\n\t%pop\r\n\t%ifctx __NX_CTX_STRUC\r\n\t\t%assign %$__nx_size (%$__nx_size + %%__usize)\r\n\t%elifctx __NX_CTX_UNION\r\n\t\t%assign %$__nx_size (%$__nx_size + %%__usize)\r\n\t\t%if ((%$__nx_size-%$__nx_osize) > %$__nx_usize)\r\n\t\t\t%assign %$__nx_usize %$__nx_size-%$__nx_osize\r\n\t\t%endif\r\n\t\t%assign %$__nx_size %$__nx_osize\r\n\t%endif\r\n%endmacro\r\n\r\n%idefine NASMX_ENDUNION NASMX_ENDSTRUC\r\n\r\n%imacro NASMX_ISTRUC 0-*.nolist __NX_ROOT, __NX_ROOT, __NX_CTX_ISTRUC\r\n\t%ifnidni %{3},__NX_CTX_ISTRUC\r\n\t\t%ifnidni %{3},__NX_CTX_IUNION\r\n\t\t\t%fatal unknown arg: %{3}\r\n\t\t%endif\r\n\t%endif\r\n\t%ifctx __NX_CTX_ISTRUC\r\n\t\t%define %%__is_nested 1\r\n\t%elifctx __NX_CTX_IUNION\r\n\t\t%define %%__is_nested 1\r\n\t%else\r\n\t\t%define %%__is_nested 0\r\n\t%endif\r\n\t%ifnidni %{1},__NX_ROOT\r\n\t\t%define %%__is_named 1\r\n\t%else\r\n\t\t%define %%__is_named 0\r\n\t%endif\r\n\t%if (%%__is_nested == 0)\r\n\t\t%if (%%__is_named == 0)\r\n\t\t\t%fatal root structure or union requires name\r\n\t\t%endif\r\n\t\t%ifidni %2, __NX_ROOT\r\n\t\t\t%fatal root structure or union requires base type\r\n\t\t%endif\r\n\t\t%push %3\r\n\t\t%xdefine %$__nx_istrucstart %{1}\r\n\t\t%xdefine %$__nx_name %{2}\r\n\t\t%[%$__nx_istrucstart]:\r\n\t%else\r\n\t\t%if (%%__is_named == 0)\r\n\t\t\t%xdefine %%__tname %{$__nx_name}\r\n\t\t%else\r\n\t\t\t%xdefine %%__tname %{$__nx_name}.%{1}\r\n\t\t\t%assign %%__off %%__tname\r\n\t\t\t%assign %%__times %%__off-($-%[%$__nx_istrucstart])\r\n\t\t\t%if (%%__times > 0)\r\n\t\t\t\ttimes %%__times db 0\r\n\t\t\t%endif\r\n\t\t%endif\r\n\t\t%push  %3\r\n\t\t%xdefine %$__nx_istrucstart %[%$$__nx_istrucstart]\r\n\t\t%xdefine %$__nx_name %%__tname\r\n\t%endif\r\n\t%define %$__nx_isnamed %%__is_named\r\n%endmacro\r\n\r\n%idefine NASMX_IUNION NASMX_ISTRUC\r\n\r\n%imacro NASMX_AT 1-2+.nolist\r\n\t%assign %%__ofs %{$__nx_name}.%{1}\r\n\t%assign %%__count %%__ofs-($-%$__nx_istrucstart)\r\n\t%if (%%__count > 0)\r\n\t\ttimes %%__count db 0\r\n\t%endif\r\n\t%{$__nx_name}.%{1}_storage %2\r\n%endmacro\r\n\r\n%imacro NASMX_IENDSTRUC 0.nolist\r\n\t;// assert: finish up struc if needed\r\n\t%if (%$__nx_isnamed == 1)\r\n\t\t%assign %%__times %{$__nx_name}_size-($-%$__nx_istrucstart)\r\n\t\t%if (%%__times > 0)\r\n\t\t\ttimes %%__times db 0\r\n\t\t%endif\r\n\t%endif\r\n\t%pop\r\n%endmacro\r\n\r\n%idefine NASMX_IENDUNION NASMX_IENDSTRUC\r\n\r\n\r\n;//////////////////////////////////////////////////////////////\r\n;// MACRO nx_isalnum\r\n;//\r\n;// Purpose\r\n;//    This macro is designed to return in the current context\r\n;//    stack variable %$__nx_isalnum_bool if the parameter is\r\n;//    alphanumeric.\r\n;//\r\n;// Usage:\r\n;//    nx_isalnum chr\r\n;//    nx_isalnum 'x'\r\n;//\r\n%macro nx_isalnum 1\r\n    %ifstr %1\r\n        %define %%__arg_chr %1\r\n    %else\r\n        %defstr %%__arg_chr %1\r\n    %endif\r\n    %assign %%__count 62\r\n    %assign %%__idx 3\r\n    %assign %$__nx_isalnum_bool 0\r\n    %rep %%__count\r\n        %assign %%__idx %%__idx + 1\r\n        %substr %%__chr __NASMX_NUMALPHATOKEN__ %%__idx, 1\r\n        %ifidn %%__chr, %%__arg_chr\r\n            %assign %$__nx_isalnum_bool %%__idx\r\n            %exitrep\r\n        %endif\r\n    %endrep\r\n%endmacro\r\n\r\n;//////////////////////////////////////////////////////////////\r\n;// MACRO nx_ishexchr\r\n;//\r\n;// Purpose\r\n;//    This macro is designed to return in the current context\r\n;//    stack variable %$__nx_ishexnum_bool if the parameter is\r\n;//    hexadecimal.\r\n;//\r\n;// Usage:\r\n;//    nx_ishexchr chr\r\n;//    nx_ishexchr 'f'\r\n;//\r\n%macro nx_ishexchr 1\r\n    %ifstr %1\r\n        %define %%__arg_chr %1\r\n    %else\r\n        %defstr %%__arg_chr %1\r\n    %endif\r\n    %assign %%__count 22\r\n    %assign %%__idx 3\r\n    %assign %$__nx_ishexchr_bool 0\r\n    %rep %%__count\r\n        %assign %%__idx %%__idx + 1\r\n        %substr %%__chr __NASMX_NUMALPHATOKEN__ %%__idx, 1\r\n        %ifidn %%__chr, %%__arg_chr\r\n            %assign %$__nx_ishexchr_bool %%__idx\r\n            %exitrep\r\n        %endif\r\n    %endrep\r\n%endmacro\r\n\r\n;//////////////////////////////////////////////////////////////\r\n;// MACRO nx_isfloattok\r\n;//\r\n;// Purpose\r\n;//    This macro is designed to return in the current context\r\n;//    stack variable %$__nx_isfloattok_bool if the parameter is\r\n;//    a float token.\r\n;//\r\n;// Usage:\r\n;//    %define PI 3.14159\r\n;//    nx_isfloattok PI\r\n;//    nx_isfloattok string\r\n;//\r\n%macro nx_isfloattok 1\r\n    %ifstr %1\r\n        %define %%__arg_str %1\r\n    %else\r\n\t%defstr %%__arg_str %1\r\n    %endif\r\n    %strlen %%__arg_len %%__arg_str\r\n    %assign %$__nx_isfloattok 0\r\n    %assign %%__found 0\r\n    %assign %%__arg_idx 0\r\n    %rep %%__arg_len\r\n        %assign %%__arg_idx %%__arg_idx + 1\r\n        %substr %%__arg_chr %%__arg_str %%__arg_idx, 1\r\n        %assign %%__found 0\r\n        %assign %%__idx 0\r\n        %rep 15\r\n            %assign %%__idx %%__idx + 1\r\n            %substr %%__chr __NASMX_NUMALPHATOKEN__ %%__idx, 1\r\n            %ifidn %%__chr, %%__arg_chr\r\n              %assign %%__found %%__idx\r\n              %exitrep\r\n        %endif\r\n        %endrep\r\n        %if %%__found == 0\r\n            %exitrep\r\n        %endif\r\n    %endrep\r\n    %assign %$__nx_isfloattok_bool %%__found\r\n%endmacro\r\n\r\n;//////////////////////////////////////////////////////////////\r\n;// MACRO nx_ishextok\r\n;//\r\n;// Purpose\r\n;//    This macro is designed to return in the current context\r\n;//    stack variable %$__nx_ishextok_bool if the parameter is\r\n;//    a hex token.  Note that this macro also returns true if\r\n;//    arg is an integer making it rather useful when we need\r\n;//    to move the number to a register\r\n;//\r\n;// Usage:\r\n;//    nx_ishextok token\r\n;//    nx_ishextok 0xFFF0\r\n;//\r\n%macro nx_ishextok 1\r\n    %ifstr %1\r\n        %define %%__arg_str %1\r\n    %else\r\n        %defstr %%__arg_str %1\r\n    %endif\r\n    %strlen %%__arg_len %%__arg_str\r\n    %assign %%__arg_idx 0\r\n    %assign %%__has_x 0\r\n    %rep %%__arg_len\r\n        %assign %%__arg_idx %%__arg_idx + 1\r\n        %substr %%__arg_chr %%__arg_str %%__arg_idx, 1\r\n        %assign %%__found 0\r\n        %ifidni %%__arg_chr, 'x'\r\n            %if %%__has_x == 0\r\n                %if %%__arg_idx < %%__arg_len\r\n                    %assign %%__has_x 1\r\n                    %assign %%__found 1\r\n                %else\r\n                    %exitrep\r\n                %endif\r\n            %else\r\n                %exitrep\r\n            %endif\r\n        %else\r\n            %assign %%__idx 1\r\n            %rep 24\r\n                %assign %%__idx %%__idx + 1\r\n                %substr %%__chr __NASMX_NUMALPHATOKEN__ %%__idx, 1\r\n                %ifidn %%__chr, %%__arg_chr\r\n                    %assign %%__found %%__idx\r\n                    %exitrep\r\n                %endif\r\n            %endrep\r\n        %endif\r\n        %if %%__found == 0\r\n            %exitrep\r\n        %endif\r\n    %endrep\r\n    %assign %$__nx_ishextok_bool %%__found\r\n%endmacro\r\n\r\n;//////////////////////////////////////////////////////////////\r\n;// MACRO nx_strtok\r\n;//\r\n;// Purpose\r\n;//    To parse a string and return delimited tokens\r\n;//    Functionality is similar to the C strtok function\r\n;//\r\n;// Usage:                        ; After call:\r\n;//    nx_strtok two tokens, ' '  ; %$__nx_token = two   , %$__nx_token_len = 3\r\n;//    nx_strtok NULL, ' :?;'     ; %$__nx_token = tokens, %$__nx_token_len = 6\r\n;//    nx_strtok NULL, ' :?;'     ; %$__nx_token = ''    , %$__nx_token_len = 0\r\n;//\r\n;// Notes:\r\n;//    The return value is stored on the context stack as\r\n;//    %$__nx_token thus it must only be called within a valid context.\r\n;//    The length is also returned as %$__nx_token_len.  Check this value\r\n;//    for 0 after call this macro before processing the return value.\r\n;//\r\n;//    Call more than once to get the next token in the sequence, if any.\r\n;//    This function must be called at least once with a valid string\r\n;//    or token to parse before passing in NULL (0) in subsequent calls.\r\n;//\r\n;//    Unfortunately, a side effect of using macros is that a comma which\r\n;//    appears in a token actually causes the single token to split into 2\r\n;//    tokens making it impossible to use this macro like:\r\n;//         %define mytoken $32,000\r\n;//         nx_strtok mytoken, ','\r\n%imacro nx_strtok 2.nolist\r\n\t%ifnum %1\r\n\t\t%assign %%__nx_null %1\r\n\t\t%if %%__nx_null == 0\r\n\t\t\t%define %%__arg_str %$__nxtok_next\r\n\t\t\t%assign %%__arg_len %$__nxtok_len\r\n\t\t%else\r\n\t\t\t%defstr %%__arg_str %1\r\n\t\t\t%strlen %%__arg_len %%__arg_str\r\n\t\t%endif\r\n\t%else\r\n\t\t%ifstr %1\r\n\t\t\t%define %%__arg_str %1\r\n\t\t%else\r\n\t\t\t%defstr %%__arg_str %1\r\n\t\t%endif\r\n\t\t%strlen %%__arg_len %%__arg_str\r\n\t%endif\r\n\r\n\t%if %%__arg_len == 0\r\n\t\t%define %$__nxtok_next ''\r\n\t\t%assign %$__nxtok_len 0\r\n\t\t%define %$__nx_token ''\r\n\t\t%assign %$__nx_token_len 0\r\n\t%else\r\n\t\t%ifstr %2\r\n\t\t\t%define %%__sep_str %2\r\n\t\t%else\r\n\t\t\t%defstr %%__sep_str %2\r\n\t\t%endif\r\n\t\t%strlen %%__sep_len %%__sep_str\r\n\r\n\t\t%assign %$__nx_token_len 0\r\n\t\t%assign %%__arg_idx 1\r\n\t\t%rep %%__arg_len\r\n\t\t\t%substr %%__arg_chr %%__arg_str %%__arg_idx\r\n\t\t\t%assign %%__sep_idx 1\r\n\t\t\t%rep %%__sep_len\r\n\t\t\t\t%substr %%__sep_chr %%__sep_str %%__sep_idx\r\n\t\t\t\t%ifidn %%__arg_chr, %%__sep_chr\r\n\t\t\t\t\t%assign %$__nx_token_len %%__arg_idx-1\r\n\t\t\t\t\t%exitrep\r\n\t\t\t\t%else\r\n\t\t\t\t\t%assign %%__sep_idx 1+%%__sep_idx\r\n\t\t\t\t%endif\r\n\t\t\t%endrep\r\n\t\t\t%if %$__nx_token_len != 0\r\n\t\t\t\t%exitrep\r\n\t\t\t%else\r\n\t\t\t\t%assign %%__arg_idx 1+%%__arg_idx\r\n\t\t\t%endif\r\n\t\t%endrep\r\n\t\t%if %$__nx_token_len == 0\r\n\t\t\t%deftok %$__nx_token %%__arg_str\r\n\t\t\t%assign %$__nx_token_len %%__arg_len\r\n\t\t\t%define %$__nxtok_next ''\r\n\t\t\t%assign %$__nxtok_len 0\r\n\t\t%else\r\n\t\t\t%substr %%__tokstr %%__arg_str 1,%$__nx_token_len\r\n\t\t\t%deftok %$__nx_token %%__tokstr\r\n\t\t\t%if %$__nx_token_len < %%__arg_len\r\n\t\t\t\t%rep %%__arg_len - %$__nx_token_len\r\n\t\t\t\t\t%substr %%__arg_chr %%__arg_str %%__arg_idx\r\n\t\t\t\t\t%assign %%__nx_found 0\r\n\t\t\t\t\t%assign %%__sep_idx 1\r\n\t\t\t\t\t%rep %%__sep_len\r\n\t\t\t\t\t\t%substr %%__sep_chr %%__sep_str %%__sep_idx\r\n\t\t\t\t\t\t%ifidn %%__arg_chr, %%__sep_chr\r\n\t\t\t\t\t\t\t%assign %%__nx_found 1\r\n\t\t\t\t\t\t\t%exitrep\r\n\t\t\t\t\t\t%else\r\n\t\t\t\t\t\t\t%assign %%__sep_idx 1+%%__sep_idx\r\n\t\t\t\t\t\t%endif\r\n\t\t\t\t\t%endrep\r\n\t\t\t\t\t%if %%__nx_found == 0\r\n\t\t\t\t\t\t%exitrep\r\n\t\t\t\t\t%else\r\n\t\t\t\t\t\t%assign %%__arg_idx 1+%%__arg_idx\r\n\t\t\t\t\t%endif\r\n\t\t\t\t%endrep\r\n\t\t\t\t%if %%__arg_idx <= %%__arg_len\r\n\t\t\t\t\t%assign %$__nxtok_len %%__arg_len-%%__arg_idx+1\r\n\t\t\t\t\t%substr %$__nxtok_next %%__arg_str %%__arg_idx,%$__nxtok_len\r\n\t\t\t\t%else\r\n\t\t\t\t\t%define %$__nxtok_next ''\r\n\t\t\t\t\t%assign %$__nxtok_len 0\r\n\t\t\t\t%endif\r\n\t\t\t%else\r\n\t\t\t\t%define %$__nxtok_next ''\r\n\t\t\t\t%assign %$__nxtok_len 0\r\n\t\t\t%endif\r\n\t\t%endif\r\n\t%endif\r\n\r\n%endmacro\r\n\r\n\r\n;//////////////////////////////////////////////////////////////\r\n;// MACRO nx_strchr\r\n;//\r\n;// Purpose\r\n;//    This macro is designed to find position of char within string.\r\n;//    It will update the current context stack variable %$__nx_strchr_pos\r\n;//    with the index position of the chr or 0 if chr not found\r\n;// Usage:\r\n;//    nx_strchr string, chr\r\n;//    nx_strchr [wc + hInstance], 'x'\r\n;//\r\n%macro nx_strchr 2\r\n\t%ifdef %$__nx_strchr_string\r\n\t\t%undef %$__nx_strchr_string\r\n\t%endif\r\n\t%ifstr %1\r\n\t\t%xdefine %$__nx_strchr_string %{1}\r\n\t%else\r\n\t\t%defstr %$__nx_strchr_string %{1}\r\n\t%endif\r\n\t%strlen %%__count %[%$__nx_strchr_string]\r\n\t%assign %%__idx 0\r\n\t%assign %%__found 0\r\n\t%rep %%__count\r\n\t\t%assign %%__idx %%__idx + 1\r\n\t\t%substr %%__chr %[%$__nx_strchr_string] %%__idx\r\n\t\t%ifidn %%__chr,%{2}\r\n\t\t\t%assign %%__found %%__idx\r\n\t\t\t%exitrep\r\n\t\t%endif\r\n\t%endrep\r\n\t%assign %$__nx_strchr_pos %%__found\r\n%endmacro\r\n\r\n\r\n;//////////////////////////////////////////////////////////////\r\n;// MACRO nx_strstr\r\n;//\r\n;// Purpose\r\n;//    This macro is designed to find position of substr within string.\r\n;//    It will update the current context stack variable %$__nx_strstr_pos\r\n;//    with the index position of the substr or 0 if not found\r\n;// Usage:\r\n;//    nx_strstr string, substr\r\n;//    nx_strstr [rpb + hInstance], rbp\r\n;//\r\n%macro nx_strstr 2\r\n\t%ifdef %$__nx_strstr_string\r\n\t\t%undef %$__nx_strstr_string\r\n\t%endif\r\n\t%ifstr %1\r\n\t\t%xdefine %$__nx_strstr_string %{1}\r\n\t%else\r\n\t\t%defstr %$__nx_strstr_string %{1}\r\n\t%endif\r\n\t%ifstr %2\r\n\t\t%xdefine %$__nx_strstr_substring %{2}\r\n\t%else\r\n\t\t%defstr %$__nx_strstr_substring %{2}\r\n\t%endif\r\n\t%strlen %%__count %[%$__nx_strstr_string]\r\n\t%substr %%__subchr %[%$__nx_strstr_substring] 1\r\n\t%strlen %%__sublen %[%$__nx_strstr_substring]\r\n\t%assign %%__idx 0\r\n\t%assign %%__found 0\r\n\t%rep %%__count\r\n\t\t%assign %%__idx %%__idx + 1\r\n\t\t%if ((%%__count - %%__idx + 1) < %%__sublen)\r\n\t\t\t%exitrep\r\n\t\t%endif\r\n\t\t%substr %%__chr %[%$__nx_strstr_string] %%__idx\r\n\t\t%ifidni %%__chr,%%__subchr\r\n\t\t\t%substr %%__tmpstr %$__nx_strstr_string %%__idx, %%__sublen\r\n\t\t\t%ifidni %%__tmpstr, %$__nx_strstr_substring\r\n\t\t\t\t%assign %%__found %%__idx\r\n\t\t\t\t%exitrep\r\n\t\t\t%endif\r\n\t\t%endif\r\n\t%endrep\r\n\t%assign %$__nx_strstr_pos %%__found\r\n\t%undef %$__nx_strstr_string\r\n\t%undef %$__nx_strstr_substring\r\n%endmacro\r\n\r\n\r\n;// small helper macro used to parse __nxsig@@ defines\r\n%macro nx_parse_tokens 1-100.nolist\r\n\t%ifdef __nx_token_0\r\n\t\t%undef __nx_token_0\r\n\t%endif\r\n\t%xdefine __nx_token_0 %0\r\n\t%assign %%__ctr 1\r\n\t%rep %0\r\n\t\t%ifdef __nx_token_%[%%__ctr]\r\n\t\t\t%undef __nx_token_%[%%__ctr]\r\n\t\t%endif\r\n\t\t%xdefine __nx_token_%[%%__ctr] %1\r\n\t\t%assign %%__ctr 1 + %%__ctr\r\n\t\t%rotate 1\r\n\t%endrep\r\n%endmacro\r\n\r\n\r\n;//////////////////////////////////////////////////////////////\r\n;// MACRO IMPORT\r\n;//\r\n;// Purpose\r\n;//    To define the signature and required syntax for\r\n;//    an external function\r\n;//\r\n;// usage:\r\n;//    IMPORT printf\r\n;//    IMPORT GetSystemWindowsDirectoryA, 8\r\n;//    IMPORT cdecl, myfunc, ptrdiff_t, dword, float_t\r\n;//\r\n%imacro IMPORT 1-100.nolist\r\n\t%push __NX_CTX_IMPORT__\r\n\r\n\t%assign %$__bytecount 0\r\n\t%ifndef __NASMX_DECLSPEC_CALLCONV_%[%1]__\r\n\t\t%assign %$__callconv __NASMX_DECLSPEC_CALLCONV_DEFAULT__\r\n\t\t%define %$__nx_proc %1\r\n\t\t%if %0 > 1\r\n\t\t\t%ifnum %2\r\n\t\t\t\t%ifidn __OUTPUT_FORMAT__,win32\r\n\t\t\t\t\t%assign %$__bytecount %2\r\n\t\t\t\t%endif\r\n\t\t\t\t%assign %$__repargs 0\r\n\t\t\t%else\r\n\t\t\t\t%assign %$__repargs %0-1\r\n\t\t\t%endif\r\n\t\t%else\r\n\t\t\t%assign %%__cc_enum nx_declspec_cc_enum(__NASMX_DECLSPEC_CALLCONV_DEFAULT__)\r\n\t\t\t%if %%__cc_enum == __NASMX_DECLSPEC_CC_ENUM_STDCALL__\r\n\t\t\t\t;// assert: no bytecount in import implies cdecl for win32\r\n\t\t\t\t%assign %$__callconv __NASMX_DECLSPEC_CALLCONV_CDECL__\r\n;\t\t\t%elif %%__cc_enum == __NASMX_DECLSPEC_CC_ENUM_FASTCALL__\r\n;\t\t\t\t;// assert: no bytecount in import implies cdecl for win32/win64 fastcall\r\n;\t\t\t\t%assign %$__callconv __NASMX_DECLSPEC_CALLCONV_CDECL__\r\n\t\t\t%endif\r\n\t\t\t%assign %$__repargs 0\r\n\t\t%endif\r\n\t%else\r\n\t\t%if %0 < 2\r\n\t\t\t%fatal usage: IMPORT [CALLCONV, ] FUNCNAME [,ARG1,ARG2,...]\r\n\t\t%endif\r\n\t\t%assign %$__callconv __NASMX_DECLSPEC_CALLCONV_%[%1]__\r\n\t\t%define %$__nx_proc %2\r\n\t\t%assign %$__repargs %0-2\r\n\t%endif\r\n\r\n\t%ifdef __nx_import_param_list\r\n\t\t%undef __nx_import_param_list\r\n\t%endif\r\n\t%assign %%__cc_enum nx_declspec_cc_enum(%[%$__callconv])\r\n\t%if %%__cc_enum != __NASMX_DECLSPEC_CC_ENUM_NAKED__\r\n\t\t;// assert: calc byte count for sig check\r\n\t\t%rep %$__repargs\r\n\t\t\t%rotate -1\r\n\t\t\t%ifnum %1\r\n\t\t\t\t%assign %$__bytecount %1\r\n\t\t\t\t%exitrep\r\n\t\t\t%else\r\n\t\t\t\tnx_strtok %1, ' '\r\n\t\t\t\t%assign %%__param_size sizeof(%$__nx_token)\r\n\t\t\t\t%if %%__param_size < sizeof(size_t)\r\n\t\t\t\t\t%assign %%__param_size sizeof(size_t)\r\n\t\t\t\t%endif\r\n\t\t\t\t%if %%__param_size > (sizeof(size_t) * 2)\r\n\t\t\t\t\t%error %1 exceeds allowable parameter size\r\n\t\t\t\t%endif\r\n\t\t\t\t%assign %$__bytecount %$__bytecount + %%__param_size\r\n\t\t\t\t%xdefine __nx_import_argtype %$__nx_token %+ _type\r\n\t\t\t\t%ifndef __nx_import_param_list\r\n\t\t\t\t\t%defstr __nx_import_param_list __nx_import_argtype\r\n\t\t\t\t%else\r\n\t\t\t\t\t%defstr __nx_import_argstr __nx_import_argtype\r\n\t\t\t\t\t%strcat __nx_import_param_list __nx_import_argstr,',',__nx_import_param_list\r\n\t\t\t\t\t%undef __nx_import_argstr\r\n\t\t\t\t%endif\r\n\t\t\t\t%undef __nx_import_argtype\r\n\t\t\t%endif\r\n\t\t%endrep\r\n\t%endif\r\n\tnx_callconv_decorate %$__callconv,%$__nx_proc,%$__bytecount\r\n\t%ifdef __nxsig@@%[%$__nxtok_decorated_name]\r\n\t\t%warning redefining import symbol %$__nx_proc as %[%$__nxtok_decorated_name]\r\n\t%endif\r\n\r\n\t%ifndef __nx_import_param_list\r\n\t\t%xdefine __nxsig@@%[%$__nxtok_decorated_name] %[%$__callconv],%[%$__bytecount]\r\n\t%else\r\n\t\t%deftok __nx_import_params __nx_import_param_list\r\n\t\t%xdefine __nxsig@@%[%$__nxtok_decorated_name] %[%$__callconv],%[%$__bytecount],__nx_import_params\r\n\t\t%undef __nx_import_params\r\n\t\t%undef __nx_import_param_list\r\n\t%endif\r\n\t%ifnidn %$__nx_proc,%$__nxtok_decorated_name\r\n\t\t%xdefine %[%$__nx_proc] %[%$__nxtok_decorated_name]\r\n\t%endif\r\n\r\n\t%pop\r\n%endmacro\r\n\r\n\r\n;//////////////////////////////////////////////////////////////\r\n;// MACRO PROTO\r\n;//\r\n;// usage:\r\n;//    PROTO [CALLCONV,] FUNCNAME [,ARGS...]\r\n;//\r\n;// examples:\r\n;// Using default calling convention:\r\n;//    PROTO WndProc, ptrdiff_t, dword, size_t, size_t\r\n;// Specifying a calling convention\r\n;//    PROTO cdecl, myfunc, ptrdiff_t, dword, float_t\r\n;//\r\n;// notes:\r\n;//    This macro must be used when defining procedures\r\n;//    that will be callable from other modules via\r\n;//    the import macro as the function name is made\r\n;//    global here.\r\n;//\r\n%imacro PROTO 1-100.nolist\r\n\t%push __NX_CTX_PROTO__\r\n\t%ifndef __NASMX_DECLSPEC_CALLCONV_%[%1]__\r\n\t\t%assign %$__callconv __NASMX_DECLSPEC_CALLCONV_DEFAULT__\r\n\t\t%define %$__proc %1\r\n\t\t%assign %$__repcnt %0-1\r\n\t%else\r\n\t\t%if %0 < 2\r\n\t\t\t%fatal usage: PROTO [CALLCONV, ] FUNCNAME [,ARG1,ARG2,...]\r\n\t\t%endif\r\n\t\t%assign %$__callconv __NASMX_DECLSPEC_CALLCONV_%[%1]__\r\n\t\t%define %$__proc %2\r\n\t\t%assign %$__repcnt %0-2\r\n\t%endif\r\n\t%ifdef __nx_proto_param_list\r\n\t\t%undef __nx_proto_param_list\r\n\t%endif\r\n\t%assign %$__bytecount 0\r\n\t%assign %%__cc_enum nx_declspec_cc_enum(%$__callconv)\r\n\t%if %%__cc_enum != __NASMX_DECLSPEC_CC_ENUM_NAKED__\r\n\t\t;// assert: calc byte count for sig check during invoke \r\n\t\t%rep %$__repcnt\r\n\t\t\t%rotate -1\r\n\t\t\t%ifnum %1\r\n\t\t\t\t%assign %$__bytecount %1\r\n\t\t\t\t%exitrep\r\n\t\t\t%else\r\n\t\t\t\tnx_strtok %1, ' '\r\n\t\t\t\t%assign %%__param_size %[%$__nx_token]_size\r\n\t\t\t\t%if %%__param_size < sizeof(size_t)\r\n\t\t\t\t\t%assign %%__param_size sizeof(size_t)\r\n\t\t\t\t%endif\r\n\t\t\t\t%if %%__param_size > (sizeof(size_t) * 2)\r\n\t\t\t\t\t%error %1 exceeds allowable parameter size\r\n\t\t\t\t%endif\r\n\t\t\t\t%assign %$__bytecount %$__bytecount + %%__param_size\r\n\t\t\t\t%xdefine __nx_proto_argtype %$__nx_token %+ _type\r\n\t\t\t\t%ifndef __nx_proto_param_list\r\n\t\t\t\t\t%defstr __nx_proto_param_list __nx_proto_argtype\r\n\t\t\t\t%else\r\n\t\t\t\t\t%defstr __nx_proto_argstr __nx_proto_argtype\r\n\t\t\t\t\t%strcat __nx_proto_param_list __nx_proto_argstr,',',__nx_proto_param_list\r\n\t\t\t\t\t%undef __nx_proto_argstr\r\n\t\t\t\t%endif\r\n\t\t\t\t%undef __nx_proto_argtype\r\n\t\t\t%endif\r\n\t\t%endrep\r\n\t%endif\r\n\r\n\t%ifndef %[%$__proc]\r\n\t\t%ifdef __nxsig@@%[%$__proc]\r\n\t\t\t%fatal global symbol %[%$__proc] already defined\r\n\t\t%endif\r\n\t\tnx_callconv_decorate %$__callconv,%$__proc,%$__bytecount\r\n\t\t%ifndef __nx_proto_param_list\r\n\t\t\t%xdefine __nxsig@@%[%$__nxtok_decorated_name] %[%$__callconv],%[%$__bytecount]\r\n\t\t%else\r\n\t\t\t%deftok __nx_proto_params __nx_proto_param_list\r\n\t\t\t%xdefine __nxsig@@%[%$__nxtok_decorated_name] %[%$__callconv],%[%$__bytecount],__nx_proto_params\r\n\t\t\t%undef __nx_proto_params\r\n\t\t\t%undef __nx_proto_param_list\r\n\t\t%endif\r\n\t\t%ifnidn %$__proc,%$__nxtok_decorated_name\r\n\t\t\t%xdefine %[%$__proc] %[%$__nxtok_decorated_name]\r\n\t\t%endif\r\n\t%endif\r\n\r\n\t%ifndef __nxsig_declared_%[%$__proc]\r\n\t\tglobal %[%$__proc]\r\n\t\t%xdefine __nxsig_declared_%[%$__proc] global\r\n\t%endif\r\n\r\n\t%pop\r\n%endmacro\r\n\r\n\r\n;//////////////////////////////////////////////////////////////\r\n;// MACRO ENTRY\r\n;//\r\n;// usage:\r\n;//    ENTRY progname\r\n;//\r\n;// examples:\r\n;//    ENTRY Demo1\r\n;//\r\n;// notes:\r\n;//    program entry is assumed to be cdecl unless system default\r\n;//    callconv specification is pascal.\r\n;//    When building on Win64 or using pascal callconv you must\r\n;//    change the makefile by removing the leading underscore\r\n;//    from the linker /entry line\r\n%imacro ENTRY 1.nolist\r\n\t%assign %%__cc_enum nx_declspec_cc_enum(__NASMX_DECLSPEC_CALLCONV_DEFAULT__)\r\n\t%if __NASMX_DECLSPEC_SYSTYPE_DEFAULT__ == __NASMX_DECLSPEC_SYSTYPE_WINDOWS__\r\n\t\t;// main(argc, argv)\r\n\t\t%assign %%__bytecount __NASMX_ABI_BITS__ / 4\r\n\t%else\r\n\t\t;// main(argc, argv, envp)\r\n\t\t%assign %%__bytecount (( __NASMX_ABI_BITS__ / 8 ) * 3)\r\n\t%endif\r\n\t\r\n\t%if %%__cc_enum > __NASMX_DECLSPEC_CC_ENUM_PASCAL__\r\n\t\t%assign %%__cc_prefix nx_declspec_cc_prefix(__NASMX_DECLSPEC_CALLCONV_DEFAULT__)\r\n\t\t%if %%__cc_prefix > 0\r\n\t\t\t%xdefine %[%1] _main\r\n\t\t\t%xdefine __nxsig@@_main  __NASMX_DECLSPEC_CALLCONV_CDECL__, %%__bytecount\r\n\t\t%else\r\n\t\t\t%xdefine %[%1] main\r\n\t\t\t%xdefine __nxsig@@main  __NASMX_DECLSPEC_CALLCONV_DEFAULT__, %%__bytecount\r\n\t\t%endif\r\n\t%else\r\n\t\t%xdefine %[%1] main\r\n\t\t%xdefine __nxsig@@main  __NASMX_DECLSPEC_CALLCONV_DEFAULT__, %%__bytecount\r\n\t%endif\r\n\t%xdefine __nxsig_declared_%[%1] global\r\n\tglobal %[%1]\r\n%endmacro\r\n\r\n;////////////////////////////////////////////////////////////////////////\r\n;//\r\n;// Internal macro used by invoke to detect argv addressing mode\r\n;// The context variable %$__nx_argv_mode_indirect will be set to\r\n;// the string index where '[' is found and is also used as a flag\r\n;// indicating retrieve the variable contents, not it's address.\r\n;// The context variable %$__nx_argv_mode_bp will be set to the\r\n;// the string index where the sign ( + or - ) is found and will\r\n;// be used as a flag indicating that argv mode is used.\r\n;// The context variables %$__nx_argv_mode_param_type, %$__nx_argv_mode_param_isfloat,\r\n;// %$__nx_argv_mode_param_size, and %$__nx_argv_mode_param_castsize are set according\r\n;// to the parameter list index supplied as the second argument to this macro.\r\n%xdefine __NX_ARGV_MODE_SIGN_ADD__ 1\r\n%xdefine __NX_ARGV_MODE_SIGN_SUB__ 2\r\n%macro nx_analyze_argv_mode 2\r\n\t%ifnum %2\r\n\t\t%ifdef __nx_token_%[%2]\r\n\t\t\t%assign %$__nx_argv_mode_param_type __nx_token_%[%2]\r\n\t\t\t%assign %$__nx_argv_mode_param_isfloat ((%$__nx_argv_mode_param_type >> 15) & 0x01)\r\n\t\t\t%assign %$__nx_argv_mode_param_size %$__nx_argv_mode_param_type & 0x7F\r\n\t\t%else\r\n\t\t\t%assign %$__nx_argv_mode_param_type sizeof(size_t)\r\n\t\t\t%assign %$__nx_argv_mode_param_isfloat 0\r\n\t\t\t%assign %$__nx_argv_mode_param_size sizeof(size_t)\r\n\t\t%endif\r\n\t%else\r\n\t\t%fatal internal error - unknown parameter\r\n\t%endif\r\n\r\n\t%assign %$__nx_argv_mode_bp 0\r\n\t%assign %$__nx_argv_mode_sign 0\r\n\t%assign %$__nx_argv_mode_castsize sizeof(size_t)\r\n\t%assign %$__nx_argv_mode_fp_isnum 0\r\n\t%assign %$__nx_argv_mode_fp_num 0\r\n\tnx_strchr %{1}, '['\r\n\t%assign %$__nx_argv_mode_indirect %$__nx_strchr_pos\r\n\t%if %$__nx_argv_mode_indirect == 0\r\n\t\tnx_strstr %{1}, __BP\r\n\t\t%if %$__nx_strstr_pos > 0\r\n\t\t\t;// assert: potentially loading variable address offset from reg bp\r\n\t\t\t;// quick check to help ensure that bp is a token\r\n\t\t\t%assign %$__nx_isalnum_bool 0\r\n\t\t\t%defstr %%__str %[%1]\r\n\t\t\t%if %$__nx_strstr_pos > 1\r\n\t\t\t\t%substr %%__sub %%__str %$__nx_strstr_pos-1, 1\r\n\t\t\t\tnx_isalnum %%__sub\r\n\t\t\t%endif\r\n\t\t\t%if %$__nx_isalnum_bool == 0\r\n\t\t\t\t%strlen %%__len %%__str\r\n\t\t\t\t%if %%__len > %$__nx_strchr_pos + 2\r\n\t\t\t\t\t%substr %%__sub %%__str %$__nx_strstr_pos+3, 1\r\n\t\t\t\t\tnx_isalnum %%__sub\r\n\t\t\t\t%endif\r\n\t\t\t%endif\r\n\t\t\t%if %$__nx_isalnum_bool == 0\r\n\t\t\t\t;// we must be given a positive or negative offset in order to \r\n\t\t\t\t;// generate code for local variable addressing\r\n\t\t\t\tnx_strchr %{1}, '+'\r\n\t\t\t\t%if %$__nx_strchr_pos == 0\r\n\t\t\t\t\tnx_strchr %{1}, '-'\r\n\t\t\t\t\t%if %$__nx_strchr_pos > 0\r\n\t\t\t\t\t\t%assign %$__nx_argv_mode_sign __NX_ARGV_MODE_SIGN_SUB__\r\n\t\t\t\t\t%endif\r\n\t\t\t\t%else\r\n\t\t\t\t\t%assign %$__nx_argv_mode_sign __NX_ARGV_MODE_SIGN_ADD__\r\n\t\t\t\t%endif\r\n\t\t\t\t%assign %$__nx_argv_mode_bp %$__nx_strchr_pos\r\n\t\t\t%endif\r\n\t\t\t%substr %%__off %%__str %$__nx_argv_mode_bp+1, -1\r\n\t\t\t%deftok %$__nx_argv_mode_bp_offset %%__off\r\n\t\t%elif %$__nx_argv_mode_param_isfloat > 0\r\n\t\t\t;// assert: check for float type and process\r\n\t\t\tnx_isfloattok %1\r\n\t\t\t%if %$__nx_isfloattok_bool != 0\r\n\t\t\t\t%assign %$__nx_argv_mode_fp_isnum 1\r\n\t\t\t\t%if %$__nx_argv_mode_param_size == 4\r\n\t\t\t\t\t%assign %$__nx_argv_mode_fp_num __float32__(%1)\r\n\t\t\t\t%else\r\n\t\t\t\t\t%assign %$__nx_argv_mode_fp_num __float64__(%1)\r\n\t\t\t\t%endif\r\n\t\t\t%else\r\n\t\t\t\tnx_strtok %1, ' '\r\n\t\t\t\t%ifndef __nx_reg_%[%$__nx_token]\r\n\t\t\t\t\t%iftoken %1\r\n\t\t\t\t\t\t%fatal expected floating point at arg %1\r\n\t\t\t\t\t%endif\r\n\t\t\t\t\t;// must check for casts which indicate\r\n\t\t\t\t\t;// __float() or __double() may have been used\r\n\t\t\t\t\t%ifdef %[%$__nx_token]_size\r\n\t\t\t\t\t\t%assign %%__size %[%$__nx_token]_size\r\n\t\t\t\t\t\tnx_strtok 0, ';'\r\n\t\t\t\t\t%else\r\n\t\t\t\t\t\t%assign %%__size %$__nx_argv_mode_param_size\r\n\t\t\t\t\t\tnx_strtok %1, ';'\r\n\t\t\t\t\t%endif\r\n\t\t\t\t\t%if %%__size > %$__nx_argv_mode_param_size\r\n\t\t\t\t\t\t%warning potential loss of precision from double to float for arg %1\r\n\t\t\t\t\t%endif\r\n\t\t\t\t\t%assign %$__nx_argv_mode_fp_isnum 1\r\n\t\t\t\t\t%assign %$__nx_argv_mode_fp_num %$__nx_token\r\n\t\t\t\t%endif\r\n\t\t\t%endif\r\n\t\t%endif\r\n\t%elif %$__nx_argv_mode_indirect > 3\r\n\t\t;// check for cast ( eg: dword[rbp+4] )\r\n\t\t%defstr %%__str %[%1]\r\n\t\t%substr %%__sub %%__str 1, %$__nx_argv_mode_indirect-1\r\n\t\t%deftok %%__tok %%__sub\r\n\t\t%ifdef %[%%__tok]_size\r\n\t\t\t%assign %$__nx_argv_mode_castsize %[%%__tok]_size\r\n\t\t%endif\r\n\t%endif\r\n%endmacro\r\n\r\n;//////////////////////////////////////////////////////////////\r\n;// MACRO INVOKE\r\n;//\r\n;// usage:\r\n;//    INVOKE func [, arg1] [,arg2]\r\n;//\r\n;// examples:\r\n;//    invoke malloc, 64\r\n;//\r\n;// notes:\r\n;//    when using bp offsets you should use qualifiers to ensure\r\n;//    they are passed properly, ie: invoke malloc, dword [argv(.x)]\r\n;//\r\n%imacro INVOKE 1-100.nolist\r\n\t%ifndef NASMX_ENDPROC\r\n\t\t;// assert: we cannot check for context in case we are in a switch\r\n\t\t;// so we use nasmx_endproc\r\n\t\t%fatal 'invoke must be contained within proc/endproc directives.'\r\n\t%endif\r\n\t%ifndef __NX_LOCALS_PRESENT__\r\n\t\t;// require locals directive to ensure stack\r\n\t\t;// frame initialized properly prior to invoke.\r\n\t\t%fatal 'missing locals directive'\r\n\t%endif\r\n\r\n\t%push _NX_CTX_INVOKE\r\n\t%assign %$args 0\r\n\t%assign %$__nx_intargs 0           ;// init int args counter\r\n\t%assign %$__nx_floatargs 0         ;// init float args counter\r\n\r\n\t;// Fix for v1.0rc2: an imported definition may be zero (0)\r\n\t;// for CDECL varargs or not properly defined, thus we must\r\n\t;// calculate a valid bytecount based upon given parameters\r\n\t;// in order to get a proper stack frame built if callstack\r\n\t;// not defined.\r\n\t%ifdef __nxsig@@%[%1]\r\n\t\tnx_parse_tokens __nxsig@@%[%1]\r\n\t\t%assign %$__nx_callconv __nx_token_1\r\n\t\t%assign %$__nx_protobytecount __nx_token_2\r\n\t\t%ifndef __nxsig_declared_%[%1]\r\n\t\t\t%ifndef __nxsig_defined_%[%1]\r\n\t\t\t\tEXTERN\t%[%1]\r\n\t\t\t\t%xdefine __nxsig_declared_%[%1] extern\r\n\t\t\t%endif\r\n\t\t%endif\r\n\t%else\r\n\t\t%assign %$__nx_callconv __NASMX_DECLSPEC_CALLCONV_DEFAULT__\r\n\t\t%assign %$__nx_protobytecount 0\r\n\t%endif\r\n\r\n\t%assign %%__repcnt %0 - 1\r\n\t%assign %$__nx_bytecount (( __NASMX_ABI_BITS__ / 8 ) * %%__repcnt)\r\n\t%if %$__nx_bytecount < %$__nx_protobytecount\r\n\t\t;// assert: possibly due to double param in\r\n\t\t;// 32bit mode or int128 in 64bit mode\r\n\t\t%assign %$__nx_bytecount %$__nx_protobytecount\r\n\t%endif\r\n\r\n\t%assign %%__nx_argrotate nx_declspec_cc_argrotate(%$__nx_callconv)\r\n\t%if %%__nx_argrotate > 0\r\n\t\t%assign %$__nx_argrotate 1\r\n\t%else\r\n\t\t%assign %$__nx_argrotate -1\r\n\t%endif\r\n\t%assign %$__nx_retpopsargs nx_declspec_cc_retpopsargs(%$__nx_callconv)\r\n\t%assign %%__cc_enum nx_declspec_cc_enum(%$__nx_callconv)\r\n\t%xdefine %$__nx_proc %1\r\n\t%if %%__cc_enum == __NASMX_DECLSPEC_CC_ENUM_FASTCALL__\r\n\t\t;// for fastcall, whenever CALLSTACK optimization is enabled,\r\n\t\t;// we use the stack built previously during locals/endlocals directive.\r\n\t\t%assign %$__nx_callstack_adjust 0\r\n\t\t%assign %$__nx_invoke_callstack_adjust %$__nx_bytecount\r\n\t\t%ifdef __NX_PROLOGUE_CALLSTACK_ADJUST__\r\n\t\t\t;// Verify that the CALLSTACK is sufficient for the\r\n\t\t\t;// number of parameter arguments we have been given.\r\n\t\t\t%assign %$__nx_callstack_adjust __NX_PROLOGUE_CALLSTACK_ADJUST__\r\n\t\t\t%if __NASMX_ABI_BITS__ < 64\r\n\t\t\t\t%if %$__nx_callstack_adjust < %$__nx_bytecount\r\n\t\t\t\t\t%assign %$__nx_callstack_adjust 0\r\n\t\t\t\t\t%warning insufficient callstack size for procedure %[%$__nx_proc], generating inefficient code...\r\n\t\t\t\t%endif\r\n\t\t\t%else\r\n\t\t\t\t%if __NASMX_DECLSPEC_SYSTYPE_DEFAULT__ == __NASMX_DECLSPEC_SYSTYPE_WINDOWS__\r\n\t\t\t\t\t%if %$__nx_callstack_adjust < %$__nx_bytecount\r\n\t\t\t\t\t\t;// Windows: always requires a stack adjustment\r\n\t\t\t\t\t\t%assign %$__nx_callstack_adjust 0\r\n\t\t\t\t\t\t%warning insufficient callstack size for procedure %[%$__nx_proc], generating inefficient code...\r\n\t\t\t\t\t%else\r\n\t\t\t\t\t\t;// A callstack defined for Win64 must be at least 32 bytes\r\n\t\t\t\t\t\t%if %$__nx_callstack_adjust < 32\r\n\t\t\t\t\t\t\t%assign %$__nx_callstack_adjust 0\r\n\t\t\t\t\t\t\t%warning insufficient callstack size for procedure %[%$__nx_proc], generating inefficient code...\r\n\t\t\t\t\t\t%else\r\n\t\t\t\t\t\t\t%assign %$__nx_invoke_callstack_adjust 0\r\n\t\t\t\t\t\t%endif\r\n\t\t\t\t\t%endif\r\n\t\t\t\t%else\r\n\t\t\t\t\t;// Linux: required when register allocation exhausted\r\n\t\t\t\t\t%if %%__repcnt > 6\r\n\t\t\t\t\t\t%assign %$__nx_invoke_callstack_adjust (( %%__repcnt - 6 ) * ( __NASMX_ABI_BITS__ / 8 ))\r\n\t\t\t\t\t\t%if %$__nx_invoke_callstack_adjust > %$__nx_callstack_adjust\r\n\t\t\t\t\t\t\t%assign %$__nx_callstack_adjust 0\r\n\t\t\t\t\t\t\t%warning insufficient callstack size for procedure %[%$__nx_proc], generating inefficient code...\r\n\t\t\t\t\t\t%else\r\n\t\t\t\t\t\t\t%assign %$__nx_invoke_callstack_adjust 0\r\n\t\t\t\t\t\t%endif\r\n\t\t\t\t\t%else\r\n\t\t\t\t\t\t%assign %$__nx_invoke_callstack_adjust 0\r\n\t\t\t\t\t%endif\r\n\t\t\t\t%endif\r\n\t\t\t%endif\r\n\t\t%else\r\n\t\t\t%if __NASMX_DECLSPEC_SYSTYPE_DEFAULT__ != __NASMX_DECLSPEC_SYSTYPE_WINDOWS__\r\n\t\t\t\t%if __NASMX_ABI_BITS__ > 32\r\n\t\t\t\t\t;// Make space for x64 args that could possibly get placed onto the stack\r\n\t\t\t\t\t%if %%__repcnt > 6\r\n\t\t\t\t\t\t;// TODO: Make more efficient by examining param types ( non-trivial ).\r\n\t\t\t\t\t\t%assign %$__nx_invoke_callstack_adjust (( %%__repcnt - 6 ) * ( __NASMX_ABI_BITS__ / 8 ))\r\n\t\t\t\t\t%else\r\n\t\t\t\t\t\t%assign %$__nx_invoke_callstack_adjust 0\r\n\t\t\t\t\t%endif\r\n\t\t\t\t%endif\r\n\t\t\t%endif\r\n\t\t%endif\r\n\r\n\t\t%assign %$__align 0\r\n\t\t%if %$__nx_invoke_callstack_adjust > 0\r\n\t\t\t;// assert: callstack not defined or insufficient, build it here\r\n\t\t\t%if __NASMX_ABI_BITS__ > 32\r\n\t\t\t\t%if __NASMX_DECLSPEC_SYSTYPE_DEFAULT__ == __NASMX_DECLSPEC_SYSTYPE_WINDOWS__\r\n\t\t\t\t\t;// Windows requires at least 32 bytes of shadow storage\r\n\t\t\t\t\t%if %$__nx_invoke_callstack_adjust < 32\r\n\t\t\t\t\t\t%assign %$__nx_invoke_callstack_adjust 32\r\n\t\t\t\t\t%endif\r\n\t\t\t\t%endif\r\n\t\t\t%endif\r\n\t\t\t;// first determine if an alignment adjustment is needed\r\n\t\t\t%assign %$__align __NASMX_ABI_BITS__ / 4\r\n\t\t\t%assign %%__off (((%$__nx_invoke_callstack_adjust + %$__align) / %$__align) * %$__align)\r\n\t\t\t%assign %%__tmp (%$__nx_invoke_callstack_adjust + %$__align)\r\n\t\t\t%if (%%__off != %%__tmp)\r\n\t\t\t\t;// for fastcalls that retpopsargs we need to account\r\n\t\t\t\t;// for the extra space when stack restored later on\r\n\t\t\t\t%assign %$__align __NASMX_ABI_BITS__ / 8\r\n\t\t\t\t%assign %$__nx_invoke_callstack_adjust %%__off\r\n\t\t\t%else\r\n\t\t\t\t%assign %$__align 0\r\n\t\t\t%endif\r\n\t\t\tsub __SP, %$__nx_invoke_callstack_adjust\r\n\t\t%endif\r\n\r\n\t\t;// the following variable is used as a flag to catch a very bad logic state\r\n\t\t;// in 64 bit code when using RAX as a paramater since RAX is used to spill\r\n\t\t;// parameters to the stack, potentially causing a very tough bug to find!\r\n\t\t%assign %%__reg_ax_used 0\r\n\r\n\t\t%assign %$__param_type_ctr 2    ; arg types follow cconv,bytecount\r\n\t\t%assign %$args 0\r\n\t\t%rep %%__repcnt\r\n\t\t\t%rotate 1\r\n\r\n\t\t\t;// set up internal vars used to determine if argv address mode used\r\n\t\t\t%assign %$__param_type_ctr %$__param_type_ctr + 1\r\n\t\t\tnx_analyze_argv_mode %1, %$__param_type_ctr\r\n\r\n\t\t\t%assign %%__argtostack 1  ;// assume we need to store on stack\r\n\t\t\t%if %$__nx_argv_mode_param_isfloat == 0\r\n\t\t\t\t%if %$__nx_intargs < __NASMX_DECLSPEC_FASTCALL_MAXINTREGS__\r\n\t\t\t\t\t%assign %%__argtostack 0\r\n\t\t\t\t\t%substr %%__regstr __NASMX_DECLSPEC_FASTCALL_REGINTARGS_%[%$__nx_argv_mode_castsize]__ (%$__nx_intargs * 3 + 1), 3\r\n\t\t\t\t\t%deftok %$arg_cur %%__regstr\r\n\t\t\t\t\t%undef %%__regstr\r\n\t\t\t\t\t%ifnum %1\r\n\t\t\t\t\t\t%if %1 == -1\r\n\t\t\t\t\t\t\tor %$arg_cur, %1\r\n\t\t\t\t\t\t%elif %1 == 0\r\n\t\t\t\t\t\t\txor %$arg_cur, %$arg_cur\r\n\t\t\t\t\t\t%else\r\n\t\t\t\t\t\t\tmov %$arg_cur, %1\r\n\t\t\t\t\t\t%endif\r\n\t\t\t\t\t%elifstr %1\r\n\t\t\t\t\t\tjmp %%endstr_%$args\r\n\t\t\t\t\t\t%%str_%$args: declare(NASMX_TCHAR) NASMX_TEXT(%1), 0\r\n\t\t\t\t\t\t%%endstr_%$args:\r\n\t\t\t\t\t\tlea %$arg_cur,[rel %%str_%$args]\r\n\t\t\t\t\t%else\r\n\t\t\t\t\t\t%if %$__nx_argv_mode_indirect > 0\r\n\t\t\t\t\t\t\tmov  %$arg_cur, %1\r\n\t\t\t\t\t\t%elif %$__nx_argv_mode_bp > 0\r\n\t\t\t\t\t\t\tmov  %$arg_cur, __BP\r\n\t\t\t\t\t\t\t%if %$__nx_argv_mode_sign == __NX_ARGV_MODE_SIGN_ADD__\r\n\t\t\t\t\t\t\t\tadd %$arg_cur, %$__nx_argv_mode_bp_offset\r\n\t\t\t\t\t\t\t%elif %$__nx_argv_mode_sign == __NX_ARGV_MODE_SIGN_SUB__\r\n\t\t\t\t\t\t\t\tsub %$arg_cur, %$__nx_argv_mode_bp_offset\r\n\t\t\t\t\t\t\t%else\r\n\t\t\t\t\t\t\t\t%fatal Unknown addressing mode for %{1}\r\n\t\t\t\t\t\t\t%endif\r\n\t\t\t\t\t\t%elifnidni %$arg_cur, %1\r\n\t\t\t\t\t\t\t;// if register parameter then guard against\r\n\t\t\t\t\t\t\t;// invalid register to register moves\r\n\t\t\t\t\t\t\t%ifdef __nx_reg_%[%1]\r\n\t\t\t\t\t\t\t\t%if %[%1]_size != __NASMX_ABI_BITS__ / 8\r\n\t\t\t\t\t\t\t\t\t%fatal %1 cannot be used as parameter for __NASMX_ABI_BITS__ bit mode\r\n\t\t\t\t\t\t\t\t%endif\r\n\t\t\t\t\t\t\t%endif\r\n\t\t\t\t\t\t\tmov  %$arg_cur, %1\r\n\t\t\t\t\t\t%endif\r\n\t\t\t\t\t%endif\r\n\t\t\t\t\t%if __NASMX_DECLSPEC_SYSTYPE_DEFAULT__ == __NASMX_DECLSPEC_SYSTYPE_WINDOWS__\r\n\t\t\t\t\t\t;// Windows fastcall uses one index for param count which\r\n\t\t\t\t\t\t;// indexes either int or float for purpose of preloading regs\r\n\t\t\t\t\t\t%assign %$__nx_floatargs 1 + %$__nx_floatargs\r\n\t\t\t\t\t\t;// TODO: optimize register spill for when required only\r\n\t\t\t\t\t\tmov [__SP + %$args], %$arg_cur\r\n\t\t\t\t\t\t;// Unlike Linux/BSD x64 all current 32-bit and 64-bit versions\r\n\t\t\t\t\t\t;// of Windows increase arg stack offset.\r\n\t\t\t\t\t\t%assign %$args %$args + sizeof(size_t)\r\n\t\t\t\t\t%else\r\n\t\t\t\t\t\t;// increase arg stack offset only for 32-bit non-Windows systems.\r\n\t\t\t\t\t\t%if __NASMX_ABI_BITS__ < 64\r\n\t\t\t\t\t\t\t%assign %$args %$args + sizeof(size_t)\r\n\t\t\t\t\t\t%endif\r\n\t\t\t\t\t%endif\r\n\t\t\t\t\t%assign %$__nx_intargs 1 + %$__nx_intargs\r\n\t\t\t\t\t%undef %$arg_cur\r\n\t\t\t\t%endif\r\n\t\t\t%elif %$__nx_floatargs < __NASMX_DECLSPEC_FASTCALL_MAXFLOATREGS__\r\n\t\t\t\t%assign %%__argtostack 0\r\n\t\t\t\t%if __NASMX_ABI_BITS__ > 32\r\n\t\t\t\t\t;// assert: use 64-bit registers\r\n\t\t\t\t\t%if __NASMX_DECLSPEC_SYSTYPE_DEFAULT__ == __NASMX_DECLSPEC_SYSTYPE_WINDOWS__\r\n\t\t\t\t\t\t%if   %$args == 0\r\n\t\t\t\t\t\t\t%xdefine %$arg_cur xmm0\r\n\t\t\t\t\t\t%elif %$args == 8\r\n\t\t\t\t\t\t\t%xdefine %$arg_cur xmm1\r\n\t\t\t\t\t\t%elif %$args == 16\r\n\t\t\t\t\t\t\t%xdefine %$arg_cur xmm2\r\n\t\t\t\t\t\t%elif %$args == 24\r\n\t\t\t\t\t\t\t%xdefine %$arg_cur xmm3\r\n\t\t\t\t\t\t%endif\r\n\t\t\t\t\t%else\r\n\t\t\t\t\t\t%if   %$__nx_floatargs == 0\r\n\t\t\t\t\t\t\t%xdefine %$arg_cur xmm0\r\n\t\t\t\t\t\t%elif %$__nx_floatargs == 1\r\n\t\t\t\t\t\t\t%xdefine %$arg_cur xmm1\r\n\t\t\t\t\t\t%elif %$__nx_floatargs == 2\r\n\t\t\t\t\t\t\t%xdefine %$arg_cur xmm2\r\n\t\t\t\t\t\t%elif %$__nx_floatargs == 3\r\n\t\t\t\t\t\t\t%xdefine %$arg_cur xmm3\r\n\t\t\t\t\t\t%elif  %$__nx_floatargs == 4\r\n\t\t\t\t\t\t\t%xdefine %$arg_cur xmm4\r\n\t\t\t\t\t\t%elif %$__nx_floatargs == 5\r\n\t\t\t\t\t\t\t%xdefine %$arg_cur xmm5\r\n\t\t\t\t\t\t%elif %$__nx_floatargs == 6\r\n\t\t\t\t\t\t\t%xdefine %$arg_cur xmm6\r\n\t\t\t\t\t\t%elif %$__nx_floatargs == 7\r\n\t\t\t\t\t\t\t%xdefine %$arg_cur xmm7\r\n\t\t\t\t\t\t%endif\r\n\t\t\t\t\t%endif\r\n\r\n\t\t\t\t\t%if %$__nx_argv_mode_indirect > 0\r\n\t\t\t\t\t\tnx_strtok %1, ' '\r\n\t\t\t\t\t\t%ifdef %[%$__nx_token]_size\r\n\t\t\t\t\t\t\tnx_strtok 0, ';'\r\n\t\t\t\t\t\t\tmovsd %$arg_cur, %$__nx_token\r\n\t\t\t\t\t\t%else\r\n\t\t\t\t\t\t\tmovsd %$arg_cur, %1\r\n\t\t\t\t\t\t%endif\r\n\t\t\t\t\t\tmovsd [__SP + %$args], %$arg_cur\r\n\t\t\t\t\t%elif %$__nx_argv_mode_bp > 0\r\n\t\t\t\t\t\tnx_strtok %1, ' '\r\n\t\t\t\t\t\t%ifdef __nx_reg_%[%$__nx_token]\r\n\t\t\t\t\t\t\tmovsd %$arg_cur, [%1]\r\n\t\t\t\t\t\t%elifdef %[%$__nx_token]_size\r\n\t\t\t\t\t\t\tnx_strtok 0, ';'\r\n\t\t\t\t\t\t\tmovsd %$arg_cur, [ %[%$__nx_token] ]\r\n\t\t\t\t\t\t%else\r\n\t\t\t\t\t\t\tmovsd %$arg_cur, [%1]\r\n\t\t\t\t\t\t%endif\r\n\t\t\t\t\t\tmovsd [__SP + %$args], %$arg_cur\r\n\t\t\t\t\t%else\r\n\t\t\t\t\t\t%if %$__nx_argv_mode_fp_isnum != 0\r\n\t\t\t\t\t\t\tmov rax, %$__nx_argv_mode_fp_num\r\n\t\t\t\t\t\t\tmov qword [__SP + %$args], rax\r\n\t\t\t\t\t\t\t%assign %%__reg_ax_used 1\r\n\t\t\t\t\t\t%else\r\n\t\t\t\t\t\t\tmov qword [__SP + %$args], %1\r\n\t\t\t\t\t\t%endif\r\n\t\t\t\t\t\tmovsd %$arg_cur, [__SP + %$args]\r\n\t\t\t\t\t%endif\r\n\t\t\t\t%else\r\n\t\t\t\t\t;// 32-bit fastcall float param\r\n\t\t\t\t\t%if %$__nx_argv_mode_param_size > 4\r\n\t\t\t\t\t\t;// assert: callee expecting double type which\r\n\t\t\t\t\t\t;// is always maintained on the stack\r\n\t\t\t\t\t\t%if %$__nx_argv_mode_fp_isnum != 0\r\n\t\t\t\t\t\t\t%assign %%__tmp (%$__nx_argv_mode_fp_num & 0x00000000FFFFFFFF)\r\n\t\t\t\t\t\t\tmov dword [__SP + %$args], %%__tmp\r\n\t\t\t\t\t\t\t%assign %%__tmp ((%$__nx_argv_mode_fp_num >> 32) & 0x00000000FFFFFFFF)\r\n\t\t\t\t\t\t\tmov dword [__SP+%$args+4], %%__tmp\r\n\t\t\t\t\t\t%else\r\n\t\t\t\t\t\t\tfld %1\r\n\t\t\t\t\t\t\tfstp qword [esp]\r\n\t\t\t\t\t\t%endif\r\n\t\t\t\t\t\t%assign %$args %$args + 8\r\n\t\t\t\t\t%else\r\n\t\t\t\t\t\t%if   %$args == 0\r\n\t\t\t\t\t\t\t%xdefine %$arg_cur ecx\r\n\t\t\t\t\t\t%elif %$args == 4\r\n\t\t\t\t\t\t\t%xdefine %$arg_cur edx\r\n\t\t\t\t\t\t%else\r\n\t\t\t\t\t\t\t%xdefine %$arg_cur __AX\r\n\t\t\t\t\t\t\t%assign %%__reg_ax_used 1\r\n\t\t\t\t\t\t%endif\r\n\t\t\t\t\t\t%if %$__nx_argv_mode_fp_isnum != 0\r\n\t\t\t\t\t\t\tmov %$arg_cur, %$__nx_argv_mode_fp_num\r\n\t\t\t\t\t\t%else\r\n\t\t\t\t\t\t\tmov %$arg_cur, %1\r\n\t\t\t\t\t\t%endif\r\n\t\t\t\t\t\tmov [__SP + %$args], %$arg_cur\r\n\t\t\t\t\t\t%assign %$args %$args + 4\r\n\t\t\t\t\t%endif\r\n\t\t\t\t%endif\r\n\t\t\t\t%if __NASMX_DECLSPEC_SYSTYPE_DEFAULT__ == __NASMX_DECLSPEC_SYSTYPE_WINDOWS__\r\n\t\t\t\t\t;// Windows fastcall uses one index for either\r\n\t\t\t\t\t;// int or float params for purpose of preloading regs\r\n\t\t\t\t\t%assign %$__nx_intargs 1 + %$__nx_intargs\r\n\t\t\t\t%endif\r\n\t\t\t\t%assign %$__nx_floatargs 1 + %$__nx_floatargs\r\n\t\t\t\t%undef %$arg_cur\r\n\t\t\t%endif\r\n\t\t\t%if %%__argtostack != 0\r\n\t\t\t\t;// assert: no available registers\r\n\t\t\t\t%if %$__nx_argv_mode_param_isfloat == 0\r\n\t\t\t\t\t%ifnum %1\r\n\t\t\t\t\t\t%if __NASMX_ABI_BITS__ > 32\r\n\t\t\t\t\t\t\t%assign %%__reg_ax_used 1\r\n\t\t\t\t\t\t\tmov __AX, %{1}\r\n\t\t\t\t\t\t\tmov size_t [__SP + %$args], __AX\r\n\t\t\t\t\t\t%else\r\n\t\t\t\t\t\t\tmov size_t [__SP + %$args], %{1}\r\n\t\t\t\t\t\t%endif\r\n\t\t\t\t\t%elifstr %1\r\n\t\t\t\t\t\tjmp %%endstr_%$args\r\n\t\t\t\t\t\t%%str_%$args: declare(NASMX_TCHAR) NASMX_TEXT(%1), 0\r\n\t\t\t\t\t\t%%endstr_%$args:\r\n\t\t\t\t\t\tlea __AX,[rel %%str_%$args]\r\n\t\t\t\t\t\tmov [__SP + %$args], __AX\r\n\t\t\t\t\t\t%assign %%__reg_ax_used 1\r\n\t\t\t\t\t%else\r\n\t\t\t\t\t\t%if %$__nx_argv_mode_indirect > 0\r\n\t\t\t\t\t\t\t%if %$__nx_argv_mode_castsize < 4\r\n\t\t\t\t\t\t\t\t%xdefine %$arg_cur AX\r\n\t\t\t\t\t\t\t%elif %$__nx_argv_mode_castsize < 8\r\n\t\t\t\t\t\t\t\t%xdefine %$arg_cur EAX\r\n\t\t\t\t\t\t\t%else\r\n\t\t\t\t\t\t\t\t%xdefine %$arg_cur RAX\r\n\t\t\t\t\t\t\t%endif\r\n\t\t\t\t\t\t\t%assign %%__reg_ax_used 1\r\n\t\t\t\t\t\t\tmov %$arg_cur, %{1}\r\n\t\t\t\t\t\t\tmov [__SP + %$args], __AX\r\n\t\t\t\t\t\t\t%undef %$arg_cur\r\n\t\t\t\t\t\t%elif %$__nx_argv_mode_bp > 0\r\n\t\t\t\t\t\t\t%assign %%__reg_ax_used 1\r\n\t\t\t\t\t\t\tmov  __AX, __BP\r\n\t\t\t\t\t\t\t%if %$__nx_argv_mode_sign == __NX_ARGV_MODE_SIGN_ADD__\r\n\t\t\t\t\t\t\t\tadd __AX, %$__nx_argv_mode_bp_offset\r\n\t\t\t\t\t\t\t%elif %$__nx_argv_mode_sign == __NX_ARGV_MODE_SIGN_SUB__\r\n\t\t\t\t\t\t\t\tsub __AX, %$__nx_argv_mode_bp_offset\r\n\t\t\t\t\t\t\t%else\r\n\t\t\t\t\t\t\t\t%fatal Unknown addressing mode for %{1}\r\n\t\t\t\t\t\t\t%endif\r\n\t\t\t\t\t\t\tmov [__SP + %$args], __AX\r\n\t\t\t\t\t\t%else\r\n\t\t\t\t\t\t\t%ifidni %1, __AX\r\n\t\t\t\t\t\t\t\t%if %%__reg_ax_used > 0\r\n\t\t\t\t\t\t\t\t\t%warning use of _AX as arg resulted in inconsistent logic state\r\n\t\t\t\t\t\t\t\t%endif\r\n\t\t\t\t\t\t\t%endif\r\n\t\t\t\t\t\t\tmov size_t [__SP + %$args], %{1}\r\n\t\t\t\t\t\t%endif\r\n\t\t\t\t\t%endif\r\n\t\t\t\t%else\r\n\t\t\t\t\t;// assert: processing float param\r\n\t\t\t\t\t%if %$__nx_argv_mode_indirect > 0\r\n\t\t\t\t\t\t%if %$__nx_argv_mode_castsize > %$__nx_argv_mode_param_size\r\n\t\t\t\t\t\t\t%warning potential loss of precision during conversion of double to float for %[%1]\r\n\t\t\t\t\t\t%endif\r\n\t\t\t\t\t\tfld __nx_error_token_size_%[%$__nx_argv_mode_castsize] %1\r\n\t\t\t\t\t\tfstp __nx_error_token_size_%[%$__nx_argv_mode_param_size] [__SP + %$args]\r\n\t\t\t\t\t%elif %$__nx_argv_mode_bp > 0\r\n\t\t\t\t\t\tfld __nx_error_token_size_%[%$__nx_argv_mode_param_size] [%1]\r\n\t\t\t\t\t\tfstp __nx_error_token_size_%[%$__nx_argv_mode_param_size] [__SP + %$args]\r\n\t\t\t\t\t%else\r\n\t\t\t\t\t\t%if %$__nx_argv_mode_fp_isnum != 0\r\n\t\t\t\t\t\t\t;// assert: arg is floating point constant\r\n\t\t\t\t\t\t\t%if %$__nx_argv_mode_param_size == 4\r\n\t\t\t\t\t\t\t\t;// assert: callee expecting float type\r\n\t\t\t\t\t\t\t\tmov dword [__SP + %$args], %$__nx_argv_mode_fp_num\r\n\t\t\t\t\t\t\t%else\r\n\t\t\t\t\t\t\t\t;// assert: callee expecting double type\r\n\t\t\t\t\t\t\t\t%assign %%__tmp (%$__nx_argv_mode_fp_num & 0x00000000FFFFFFFF)\r\n\t\t\t\t\t\t\t\tmov dword [__SP + %$args], %%__tmp\r\n\t\t\t\t\t\t\t\t%assign %%__tmp ((%$__nx_argv_mode_fp_num >> 32) & 0x00000000FFFFFFFF)\r\n\t\t\t\t\t\t\t\tmov dword [__SP+%$args+4], %%__tmp\r\n\t\t\t\t\t\t\t%endif\r\n\t\t\t\t\t\t%else\r\n\t\t\t\t\t\t\tmov __nx_error_token_size_%[%$__nx_argv_mode_param_size] [__SP + %$args], %1\r\n\t\t\t\t\t\t%endif\r\n\t\t\t\t\t%endif\r\n\t\t\t\t%endif\r\n\t\t\t\t%if %$__nx_argv_mode_param_size < sizeof(size_t)\r\n\t\t\t\t\t%assign %$args %$args + sizeof(size_t)\r\n\t\t\t\t%else\r\n\t\t\t\t\t%assign %$args %$args + %$__nx_argv_mode_param_size\r\n\t\t\t\t%endif\r\n\t\t\t%endif\r\n\t\t%endrep\r\n\t\t;// stack is set up, call the proc\r\n\t\tcall\t%$__nx_proc\r\n\t\t%if %$__nx_bytecount > 0\r\n\t\t\t%if %$__nx_callstack_adjust == 0\r\n\t\t\t\t%if %$__nx_retpopsargs == 0\r\n\t\t\t\t\t%if %$__nx_invoke_callstack_adjust > 0\r\n\t\t\t\t\t\tadd\t__SP, %$__nx_invoke_callstack_adjust\r\n\t\t\t\t\t%endif\r\n\t\t\t\t%elif %$__align > 0\r\n\t\t\t\t\tadd\t__SP, %$__align\r\n\t\t\t\t%endif\r\n\t\t\t%endif\r\n\t\t%endif\r\n\t%else\r\n\t\t;// arg types follow cconv,bytecount when defined\r\n\t\t%if %$__nx_argrotate > 0\r\n\t\t\t%assign %$__param_type_ctr 2    \r\n\t\t%else\r\n\t\t\t%assign %$__param_type_ctr %0+2\r\n\t\t%endif\r\n\r\n\t\t;// the following variable is used as a flag to catch a very bad logic state\r\n\t\t;// when using __AX as a paramater since __AX is used internally to spill certain\r\n\t\t;// parameters to the stack, potentially causing a very tough bug to find!\r\n\t\t%assign %%__reg_ax_used 0\r\n\r\n\t\t%rep %%__repcnt\r\n\t\t\t%rotate %$__nx_argrotate\r\n\r\n\t\t\t;// set up internal vars used to determine if argv address mode used\r\n\t\t\t%assign %$__param_type_ctr %$__param_type_ctr + %$__nx_argrotate\r\n\t\t\tnx_analyze_argv_mode %{1}, %$__param_type_ctr\r\n\r\n\t\t\t%if %$__nx_argv_mode_param_isfloat == 0\r\n\t\t\t\t%ifstr\t%1\r\n\t\t\t\t\tjmp\t%%endstr_%$args\r\n\t\t\t\t\t%%str_%$args: declare(NASMX_TCHAR) NASMX_TEXT(%{1}), 0\r\n\t\t\t\t\t%%endstr_%$args:\r\n\t\t\t\t\tpush size_t %%str_%$args\r\n\t\t\t\t%elifnum %1\r\n\t\t\t\t\tpush size_t %1\r\n\t\t\t\t%elif %$__nx_argv_mode_indirect > 0\r\n\t\t\t\t\tpush size_t %1\r\n\t\t\t\t%elif %$__nx_argv_mode_bp > 0\r\n\t\t\t\t\t%assign %%__reg_ax_used 1\r\n\t\t\t\t\tmov  __AX, __BP\r\n\t\t\t\t\t%if %$__nx_argv_mode_sign == __NX_ARGV_MODE_SIGN_ADD__\r\n\t\t\t\t\t\tadd __AX, %$__nx_argv_mode_bp_offset\r\n\t\t\t\t\t%elif %$__nx_argv_mode_sign == __NX_ARGV_MODE_SIGN_SUB__\r\n\t\t\t\t\t\tsub __AX, %$__nx_argv_mode_bp_offset\r\n\t\t\t\t\t%else\r\n\t\t\t\t\t\t%fatal Unknown addressing mode for %{1}\r\n\t\t\t\t\t%endif\r\n\t\t\t\t\tpush __AX\r\n\t\t\t\t%else\r\n\t\t\t\t\t%ifidni %1, __AX\r\n\t\t\t\t\t\t%if %%__reg_ax_used > 0\r\n\t\t\t\t\t\t\t%warning use of _AX as arg resulted in inconsistent logic state\r\n\t\t\t\t\t\t%endif\r\n\t\t\t\t\t%endif\r\n\t\t\t\t\tpush size_t %1\r\n\t\t\t\t%endif\r\n\t\t\t\t%assign %$args %$args + __BITS__ / 8\r\n\t\t\t%else\r\n\t\t\t\t;// process float param\r\n\t\t\t\t%if %$__nx_argv_mode_param_size < sizeof(size_t)\r\n\t\t\t\t\t;// if passing a float in 64-bit mode\r\n\t\t\t\t\tsub __SP, sizeof(size_t)\r\n\t\t\t\t\t%assign %$args %$args + sizeof(size_t)\r\n\t\t\t\t%else\r\n\t\t\t\t\t;// may be passing double in 32-bit mode\r\n\t\t\t\t\tsub  __SP, %$__nx_argv_mode_param_size\r\n\t\t\t\t\t%assign %$args %$args + %$__nx_argv_mode_param_size\r\n\t\t\t\t%endif\r\n\t\t\t\t%if %$__nx_argv_mode_indirect > 0\r\n\t\t\t\t\t%if %$__nx_argv_mode_castsize > %$__nx_argv_mode_param_size\r\n\t\t\t\t\t\t%warning potential loss of precision during conversion of double to float for %[%1]\r\n\t\t\t\t\t%endif\r\n\t\t\t\t\tfld __nx_error_token_size_%[%$__nx_argv_mode_castsize] %1\r\n\t\t\t\t\tfstp __nx_error_token_size_%[%$__nx_argv_mode_param_size] [__SP]\r\n\t\t\t\t%elif %$__nx_argv_mode_bp > 0\r\n\t\t\t\t\tfld __nx_error_token_size_%[%$__nx_argv_mode_param_size] [%1]\r\n\t\t\t\t\tfstp __nx_error_token_size_%[%$__nx_argv_mode_param_size] [__SP]\r\n\t\t\t\t%else\r\n\t\t\t\t\t%if %$__nx_argv_mode_fp_isnum != 0\r\n\t\t\t\t\t\t%if %$__nx_argv_mode_param_size == 4\r\n\t\t\t\t\t\t\t;// assert: callee expecting float type\r\n\t\t\t\t\t\t\tmov dword [__SP], %$__nx_argv_mode_fp_num\r\n\t\t\t\t\t\t%else\r\n\t\t\t\t\t\t\t;// assert: callee expecting double type\r\n\t\t\t\t\t\t\t%assign %%__tmp (%$__nx_argv_mode_fp_num & 0x00000000FFFFFFFF)\r\n\t\t\t\t\t\t\tmov dword [__SP], %%__tmp\r\n\t\t\t\t\t\t\t%assign %%__tmp ((%$__nx_argv_mode_fp_num >> 32) & 0x00000000FFFFFFFF)\r\n\t\t\t\t\t\t\tmov dword [__SP+4], %%__tmp\r\n\t\t\t\t\t\t%endif\r\n\t\t\t\t\t%else\r\n\t\t\t\t\t\tmov [__SP], %1\r\n\t\t\t\t\t%endif\r\n\t\t\t\t%endif\r\n\t\t\t%endif\r\n\t\t%endrep\r\n\t\tcall %$__nx_proc\r\n\t\t%if %$args > 0\r\n\t\t\t%if %$__nx_retpopsargs == 0\r\n\t\t\t\tadd\t__SP, %$args\r\n\t\t\t%endif\r\n\t\t%endif\r\n\t%endif\r\n\r\n\t;// cleanup global arg token defs\r\n\t%assign %%__ctr 1\r\n\t%rep 16\r\n\t\t%ifdef __nx_token_%[%%__ctr]\r\n\t\t\t%undef __nx_token_%[%%__ctr]\r\n\t\t%endif\r\n\t\t%assign %%__ctr %%__ctr + 1\r\n\t%endrep\r\n\r\n\t;// restore context stack\r\n\t%pop\r\n%endmacro\r\n\r\n\r\n;//////////////////////////////////////////////////////////////\r\n;// MACRO PROC\r\n;//\r\n;// usage:\r\n;//    PROC [CALLCONV,] funcname [ arg, arg, ...]\r\n;//\r\n;// examples:\r\n;//    Using default calling convention:\r\n;//       proc funcname, arg1, arg2\r\n;//    Specifying calling convention:\r\n;//       proc cdecl, fprintf\r\n;//\r\n;// notes:\r\n;//   The calling convention, if specified, must match either\r\n;//   the prototype or import specification.\r\n;//   Also remember that, when invoked during a fastcall, the\r\n;//   register parameters are not automatically spilled, only\r\n;//   the space assigned on the stack is allocated.\r\n;//   This allows the user to determine whether or not to use\r\n;//   the spill area if needed.\r\n;//\r\n%imacro PROC 1-100.nolist\r\n\t%ifdef NASMX_ENDPROC\r\n\t\t%fatal 'missing endproc directive.'\r\n\t%endif\r\n\t%push __NX_CTX_PROC__\r\n\t%assign %$__nx_locnt 0             ;// init locals offset\r\n\t%assign %$__nx_arg_bias 0          ;// init 64-bit bias\r\n\t%assign %$__nx_uses_stack_adjust 0 ;// init regs used save area\r\n\t%assign %$__nx_intargs 0           ;// init int args counter\r\n\t%assign %$__nx_floatargs 0         ;// init float args counter\r\n\t%assign %$__nx_uses_count 0        ;// init regs used counter\r\n\t%assign %$__nx_argcount 0          ;// init proc args counter\r\n\t%assign %$__nx_bytecount 0         ;// init total args byte count\r\n\t%assign %$__nx_protobytecount -1   ;// >= 0 if defined\r\n\t%ifndef __NASMX_DECLSPEC_CALLCONV_%[%1]__\r\n\t\t;// check for prototyped func\r\n\t\t%ifdef __nxsig@@%[%1]\r\n\t\t\tnx_parse_tokens __nxsig@@%[%1]\r\n\t\t\t%assign %$__nx_callconv __nx_token_1\r\n\t\t\t%assign %$__nx_protobytecount __nx_token_2\r\n\t\t%else\r\n\t\t\t%assign %$__nx_callconv __NASMX_DECLSPEC_CALLCONV_DEFAULT__\r\n\t\t%endif\r\n\t\t%define %$__nx_proc %1\r\n\t\t%assign %$__nx_repcnt %0-1\r\n\t%else\r\n\t\t%if %0 < 2\r\n\t\t\t%fatal 'usage: PROC [CALLCONV, ] FUNCNAME [,ARG1,ARG2,...]'\r\n\t\t%endif\r\n\t\t%assign %$__nx_callconv __NASMX_DECLSPEC_CALLCONV_%[%1]__\r\n\t\t%define %$__nx_proc %2\r\n\t\t%assign %$__nx_repcnt %0-2\r\n\t\t;// check for prototyped func\r\n\t\t%ifdef __nxsig@@%[%2]\r\n\t\t\tnx_parse_tokens __nxsig@@%[%2]\r\n\t\t\t%if %$__nx_callconv != __nx_token_1\r\n\t\t\t\t%fatal calling convention mismatch for %$__nx_proc\r\n\t\t\t%endif\r\n\t\t\t%assign %$__nx_protobytecount __nx_token_2\r\n\t\t%endif\r\n\t%endif\r\n\r\n\t%assign %$__nx_cc_enum nx_declspec_cc_enum(%[%$__nx_callconv])\r\n\t\r\n\t;// v1.0rc2 - we must always calculate a true bytecount such that\r\n\t;// the implementation of main(), or imported functions that are\r\n\t;// defined with a 0 bytecount, are defined properly\r\n\t%ifdef __nx_proto_param_list\r\n\t\t%undef __nx_proto_param_list\r\n\t%endif\r\n\t%rep %0-%$__nx_repcnt\r\n\t\t%rotate 1\r\n\t%endrep\r\n\t;// The signature must be defined in full before use because once the\r\n\t;// procedure has been defined we are not able to easily redefine it.\r\n\t;// Due to dependency on the X64_SPILL_OFFSET we cannot simply use one\r\n\t;// rep loop to generate equate offsets\r\n\t;// Thus the rep loop is required twice:\r\n\t;//     First, to build the parameter type list and x64 spill area size\r\n\t;//     Then, later on, to build the parameter offset equates.\r\n\t%rep %$__nx_repcnt\r\n\t\tnx_strtok %1, ' '\r\n\t\t;// assert: calculate bytecount in this loop to account\r\n\t\t;// for param types double/int128 rather than the simple logic of\r\n\t\t;// %assign %$__nx_bytecount %$__nx_repcnt * sizeof(size_t)\r\n\t\t;// Also build the parameter type list here in case the procedure\r\n\t\t;// has not been prototyped or imported.\r\n\t\t%xdefine __nx_proto_argtype %$__nx_token %+ _type\r\n\t\t%assign %%__param_type __nx_proto_argtype\r\n\t\t%assign %%__param_size (%%__param_type & 0x7F)\r\n\t\t%if %%__param_size < sizeof(size_t)\r\n\t\t\t%assign %$__nx_bytecount %$__nx_bytecount + sizeof(size_t)\r\n\t\t%elif %%__param_size <= __NASMX_ABI_BITS__ / 4\r\n\t\t\t%assign %$__nx_bytecount %$__nx_bytecount + %%__param_size\r\n\t\t%else\r\n\t\t\t%error parameter exceeds allowable size: %1\r\n\t\t%endif\r\n\t\t%ifndef __nx_proto_param_list\r\n\t\t\t%defstr __nx_proto_param_list __nx_proto_argtype\r\n\t\t%else\r\n\t\t\t%defstr __nx_proto_argstr __nx_proto_argtype\r\n\t\t\t%strcat __nx_proto_param_list __nx_proto_param_list,',',__nx_proto_argstr\r\n\t\t\t%undef __nx_proto_argstr\r\n\t\t%endif\r\n\t\t%undef __nx_proto_argtype\r\n\t\t%rotate 1\r\n\t%endrep\r\n\r\n\t%ifndef __nxsig@@%[%$__nx_proc]\r\n\t\t;// assert: we must generate an appropriate label for the function call\r\n\t\t;// here in order for the parameters to be equated properly\r\n\t\tnx_callconv_decorate %$__nx_callconv,%$__nx_proc,%$__nx_bytecount\r\n\t\t%ifdef __nx_proto_param_list\r\n\t\t\t%deftok __nx_proto_params __nx_proto_param_list\r\n\t\t\t%xdefine __nxsig@@%[%$__nxtok_decorated_name] %[%$__nx_callconv],%[%$__nx_bytecount],__nx_proto_params\r\n\t\t%else\r\n\t\t\t%xdefine __nxsig@@%[%$__nxtok_decorated_name] %[%$__nx_callconv],%[%$__nx_bytecount]\r\n\t\t%endif\r\n\t\t%ifnidn %$__nx_proc,%$__nxtok_decorated_name\r\n\t\t\t%xdefine %[%$__nx_proc] %[%$__nxtok_decorated_name]\r\n\t\t%endif\r\n\t%endif\r\n\r\n\t%ifdef __nxsig_defined_%[%$__nx_proc]\r\n\t\t%fatal procedure %[%$__nx_proc] already defined\r\n\t%else\r\n\t\t%xdefine __nxsig_defined_%[%$__nx_proc]\r\n\t%endif\r\n\r\n\t;// emit the procedure entry point\r\n\t%[%$__nx_proc]:\r\n\r\n\t;// The following define can/should be used by the user to properly\r\n\t;// return from a function ( ie: jmp NASMX_ENDPROC ) or via use of\r\n\t;// the RETURN macro\r\n\t%xdefine NASMX_ENDPROC __nx_endproc@@%[%$__nx_proc]\r\n\r\n\t%if %$__nx_cc_enum != __NASMX_DECLSPEC_CC_ENUM_NAKED__\r\n\t\t%assign %$__nx_argv __NASMX_ABI_BITS__ / 4\r\n\t\t%if __NASMX_ABI_BITS__ > 32\r\n\t\t\t%ifdef __NX_PROLOGUE_X64_SPILL_OFFSET__\r\n\t\t\t\t%undef __NX_PROLOGUE_X64_SPILL_OFFSET__\r\n\t\t\t%endif\r\n\t\t\t%if __NASMX_DECLSPEC_SYSTYPE_DEFAULT__ != __NASMX_DECLSPEC_SYSTYPE_WINDOWS__\r\n\t\t\t\t%if %$__nx_cc_enum == __NASMX_DECLSPEC_CC_ENUM_FASTCALL__\r\n\t\t\t\t\t;// assert: create Linux spill area based on param byte count.\r\n\t\t\t\t\t;// This may result in slightly wasted stack space but is\r\n\t\t\t\t\t;// required to avoid alignment issues for params that\r\n\t\t\t\t\t;// exceed allocated registers and are located on the\r\n\t\t\t\t\t;// stack above RBP.\r\n\t\t\t\t\t%assign %$__nx_arg_bias %$__nx_bytecount\r\n\r\n\t\t\t\t\t;// keep stack aligned\r\n\t\t\t\t\t%assign %%__align __NASMX_ABI_BITS__ / 4\r\n\t\t\t\t\t%assign %%__off (((%$__nx_arg_bias + %%__align) / %%__align) * %%__align)\r\n\t\t\t\t\t%assign %%__tmp (%$__nx_arg_bias + %%__align)\r\n\t\t\t\t\t%if (%%__off != %%__tmp)\r\n\t\t\t\t\t\t%assign %$__nx_arg_bias %%__off\r\n\t\t\t\t\t%endif\r\n\t\t\t\t\t%xdefine __NX_PROLOGUE_X64_SPILL_OFFSET__ %[%$__nx_arg_bias]\r\n\t\t\t\t%endif\r\n\t\t\t%endif\r\n\t\t\t%ifndef __NX_PROLOGUE_X64_SPILL_OFFSET__\r\n\t\t\t\t;// assert: must always be defined for x64\r\n\t\t\t\t%xdefine __NX_PROLOGUE_X64_SPILL_OFFSET__ 0\r\n\t\t\t%endif\r\n\t\t%endif\r\n\r\n\t\t;// assert: calc byte count for sig check and argv() offsets\r\n\t\t;// we must reverse arg push logic to get correct results\r\n\t\t%assign %$__nx_bytecount 0\r\n\t\t%assign %$__cc_argrotate nx_declspec_cc_argrotate(%[%$__nx_callconv])\r\n\t\t%if %$__cc_argrotate != 0\r\n\t\t\t%assign %$__nx_argrotate -1\r\n\t\t\t%rotate -1\r\n\t\t%else\r\n\t\t\t%assign %$__nx_argrotate 1\r\n\t\t\t%rep %0-%$__nx_repcnt\r\n\t\t\t\t%rotate 1\r\n\t\t\t%endrep\r\n\t\t%endif\r\n\r\n\t\t%rep %$__nx_repcnt\r\n\t\t\t;// obtain param type and size and validate against current ABI\r\n\t\t\tnx_strtok %1, ' '\r\n\t\t\t%assign %%__isfloat is_typeof_float(%[%$__nx_token])\r\n\t\t\t%assign %%__param_size sizeof(%[%$__nx_token]) ; _size\r\n\t\t\tnx_strtok 0, ' '\r\n\t\t\t;// only allow exceeding of size_t for type double\r\n\t\t\t;// in 32-bit mode and 128-bit params in 64-bit mode\r\n\t\t\t%if %%__param_size > (sizeof(size_t) * 2)\r\n\t\t\t    %fatal %[%$__nx_token] invalid parameter size: %%__param_size\r\n\t\t\t%endif\r\n\t\t\t%if %%__param_size < sizeof(size_t)\r\n\t\t\t\t%assign %%__param_size sizeof(size_t)\r\n\t\t\t%endif\r\n\t\t\t%assign %$__nx_bytecount %$__nx_bytecount + %%__param_size\r\n\r\n\t\t\t%if __NASMX_ABI_BITS__ > 32\r\n\t\t\t\t%if %$__nx_cc_enum == __NASMX_DECLSPEC_CC_ENUM_FASTCALL__\r\n\t\t\t\t\t%if __NASMX_DECLSPEC_SYSTYPE_DEFAULT__ == __NASMX_DECLSPEC_SYSTYPE_WINDOWS__\r\n\t\t\t\t\t\t;// assert: Windows 64-bit register spill area\r\n\t\t\t\t\t\t;// located above return address, thus bias\r\n\t\t\t\t\t\t;// not affected\r\n\t\t\t\t\t\t%assign %$__nx_intargs 1 + %$__nx_intargs\r\n\t\t\t\t\t\t%if %%__isfloat == 0\r\n\t\t\t\t\t\t\t%if %%__param_size > sizeof(size_t)\r\n\t\t\t\t\t\t\t\t%if %$__nx_intargs == __NASMX_DECLSPEC_FASTCALL_MAXINTREGS__\r\n\t\t\t\t\t\t\t\t\t%error in procedure %$__nx_proc %$__nx_token exceeds available registers\r\n\t\t\t\t\t\t\t\t%endif\r\n\t\t\t\t\t\t\t%endif\r\n\t\t\t\t\t\t%endif\r\n\t\t\t\t\t\t.%[%$__nx_token] EQU %[%$__nx_argv]\r\n\t\t\t\t\t\t%assign %$__nx_argv %%__param_size + %$__nx_argv\r\n\t\t\t\t\t%else\r\n\t\t\t\t\t\t;// assert: Linux 64-bit register spill area\r\n\t\t\t\t\t\t;// located below frame pointer thus we must\r\n\t\t\t\t\t\t;// account for bias of args from frame while\r\n\t\t\t\t\t\t;// accounting for param types supplied\r\n\t\t\t\t\t\t%if %%__isfloat == 0\r\n\t\t\t\t\t\t\t%assign %$__nx_intargs 1 + %$__nx_intargs\r\n\t\t\t\t\t\t\t%if %$__nx_intargs > __NASMX_DECLSPEC_FASTCALL_MAXINTREGS__\r\n\t\t\t\t\t\t\t\t.%[%$__nx_token] EQU __NX_PROLOGUE_X64_SPILL_OFFSET__ + %[%$__nx_argv]\r\n\t\t\t\t\t\t\t\t%assign %$__nx_argv %%__param_size + %$__nx_argv\r\n\t\t\t\t\t\t\t%else\r\n\t\t\t\t\t\t\t\t%if %$__nx_intargs == __NASMX_DECLSPEC_FASTCALL_MAXINTREGS__\r\n\t\t\t\t\t\t\t\t\t%if %%__param_size > sizeof(size_t)\r\n\t\t\t\t\t\t\t\t\t\t%error in procedure %$__nx_proc %$__nx_token exceeds available register size\r\n\t\t\t\t\t\t\t\t\t%endif\r\n\t\t\t\t\t\t\t\t%endif\r\n\t\t\t\t\t\t\t\t.%[%$__nx_token] EQU %[%$__nx_locnt]\r\n\t\t\t\t\t\t\t\t%assign %$__nx_locnt %%__param_size + %$__nx_locnt\r\n\t\t\t\t\t\t\t%endif\r\n\t\t\t\t\t\t%else\r\n\t\t\t\t\t\t\t%assign %$__nx_floatargs 1 + %$__nx_floatargs\r\n\t\t\t\t\t\t\t%if %$__nx_floatargs > __NASMX_DECLSPEC_FASTCALL_MAXFLOATREGS__\r\n\t\t\t\t\t\t\t\t.%[%$__nx_token] EQU __NX_PROLOGUE_X64_SPILL_OFFSET__ + %$__nx_argv\r\n\t\t\t\t\t\t\t\t%assign %$__nx_argv %%__param_size + %$__nx_argv\r\n\t\t\t\t\t\t\t%else\r\n\t\t\t\t\t\t\t\t.%[%$__nx_token] EQU %[%$__nx_locnt]\r\n\t\t\t\t\t\t\t\t%assign %$__nx_locnt %%__param_size + %$__nx_locnt\r\n\t\t\t\t\t\t\t%endif\r\n\t\t\t\t\t\t%endif\r\n\t\t\t\t\t%endif\r\n\t\t\t\t%else\r\n\t\t\t\t\t.%[%$__nx_token] EQU %[%$__nx_argv]\r\n\t\t\t\t\t%assign %$__nx_argv %$__nx_argv + %%__param_size\r\n\t\t\t\t%endif\r\n\t\t\t%else\r\n\t\t\t\t.%[%$__nx_token] EQU %[%$__nx_argv]\r\n\t\t\t\t%assign %$__nx_argv %$__nx_argv + %%__param_size\r\n\t\t\t%endif\r\n\t\t\t%rotate %$__nx_argrotate\r\n\t\t%endrep\r\n\r\n\t\t%if %$__nx_protobytecount > 0\r\n\t\t\t;// assert: we can only validate against prototypes that\r\n\t\t\t;// have a byte count since vararg functions can only be\r\n\t\t\t;// defined with zero (0) bytecount\r\n\t\t\t%if %$__nx_bytecount != %$__nx_protobytecount\r\n\t\t\t\t;// In the program entry main procedure the user may, or may not,\r\n\t\t\t\t;// be using command line or environment params.\r\n\t\t\t\t%ifnidni %$__nx_proc, main\r\n\t\t\t\t\t;// unfortunately we must check callconv for cdecl on win32\r\n\t\t\t\t\t;// and fastcall on win64 as currently the import files do\r\n\t\t\t\t\t;// not contain bytecounts to verify against.\r\n\t\t\t\t\t;// TODO: When import files are updated in the future we can\r\n\t\t\t\t\t;// revisit this code.\r\n\t\t\t\t\t%ifidni __OUTPUT_FORMAT__,win32\r\n\t\t\t\t\t\t%if %$__nx_cc_enum != __NASMX_DECLSPEC_CC_ENUM_CDECL__\r\n\t\t\t\t\t\t\t%warning prototype arg mismatch for %$__nx_proc\r\n\t\t\t\t\t\t%endif\r\n\t\t\t\t\t%elifidni __OUTPUT_FORMAT__,win64\r\n\t\t\t\t\t\t%if %$__nx_cc_enum != __NASMX_DECLSPEC_CC_ENUM_FASTCALL__\r\n\t\t\t\t\t\t\t%warning prototype arg mismatch for %$__nx_proc\r\n\t\t\t\t\t\t%endif\r\n\t\t\t\t\t%else\r\n\t\t\t\t\t\t%warning prototype arg mismatch for %$__nx_proc\r\n\t\t\t\t\t%endif\r\n\t\t\t\t%endif\r\n\t\t\t%endif\r\n\t\t%endif\r\n\r\n\t\t;// assert: always push __BP to get an aligned stack\r\n\t\t%define __NX_PROLOGUE_PRESENT__\r\n\t\tpush __BP\r\n\t\tmov  __BP, __SP\r\n\r\n\t\t%ifidni %$__nx_proc, main\r\n\t\t\t;// assert: ensure we start out with an aligned stack\r\n\t\t\t%assign %%__nx_align ((__NASMX_ABI_BITS__ / 4 ) - 1)\r\n\t\t\tmov   __AX, __SP\r\n\t\t\tand   __AX, %%__nx_align\r\n\t\t\tjz    .nx_main_aligned\r\n\t\t\tsub   __SP, (__NASMX_ABI_BITS__ / 4 )\r\n\t\t\t%if __NASMX_ABI_BITS__ > 32\r\n\t\t\t\tand spl,BYTE 0xF0\r\n\t\t\t%else\r\n\t\t\t\tand   __SP, -8\r\n\t\t\t%endif\r\n\t\t\t.nx_main_aligned:\r\n\t\t%endif\r\n\t%endif\r\n%endmacro\r\n\r\n\r\n;//////////////////////////////////////////////////////////////\r\n;// MACRO USES\r\n;//\r\n;// usage:\r\n;//    USES reg [,reg ,reg, ...]\r\n;//\r\n;// examples:\r\n;//    USES rbx, r15\r\n;//\r\n;// notes:\r\n;//    This macro can only be used within the proc prologue\r\n;//    Fatals are used rather than errors as this macro is\r\n;//    extremely critical to proper function definition and\r\n;//    stack alignment if used.\r\n;//\r\n%imacro USES 1-8.nolist\r\n\t%ifndef NASMX_ENDPROC\r\n\t\t%fatal 'missing proc directive.'\r\n\t%endif\r\n\t%ifnctx __NX_CTX_PROC__\r\n\t\t%fatal 'current context unknown.'\r\n\t%endif\r\n\t%ifdef __NX_LOCALS_PRESENT__\r\n\t\t%fatal 'uses directive must come before locals directive.'\r\n\t%endif\r\n\t%ifdef __NX_USES_PRESENT__\r\n\t\t%fatal 'uses directive previously set for this procedure.'\r\n\t%endif\r\n\t%define __NX_USES_PRESENT__\r\n\t%ifndef __NX_PROLOGUE_PRESENT__\r\n\t\t;// assert: at this point we have absolutely no way of knowing whether\r\n\t\t;// the function will contain locals or not; thus, using this macro\r\n\t\t;// forces our hand and requires us to set up the function prologue.\r\n\t\t;// The good news is that this aligns our stack properly.\r\n\t\t%define __NX_PROLOGUE_PRESENT__\r\n\t\tpush __BP\r\n\t\tmov  __BP, __SP\r\n\t%endif\r\n\r\n\t%assign %%__size __NASMX_ABI_BITS__ / 8\r\n\t%assign %%__sys_size __NASMX_ABI_BITS__\r\n\t%assign %$__nx_uses_count 0\r\n\t%rep %0\r\n\t\t%ifndef %[%1]_size\r\n\t\t\t%fatal unknown register: %1\r\n\t\t%endif\r\n\t\t%assign %%__reg_size %[%1]_size\r\n\t\t%if %%__reg_size < %%__size\r\n\t\t\t%fatal extended version of register %1 required for %%__sys_size bit mode\r\n\t\t%elif %%__reg_size > %%__size\r\n\t\t\t%fatal %1 not available in %%__sys_size bit mode\r\n\t\t%endif\r\n\r\n\t\t%assign %$__nx_locnt %$__nx_locnt + %%__size\r\n\t\t%assign %$__nx_uses_count 1 + %$__nx_uses_count\r\n\t\t%xdefine __nx_uses_reg_%[%$__nx_uses_count] %[%1]\r\n\t\tmov [__BP - %$__nx_locnt ], %[%1]\r\n\t\t%rotate 1\r\n\t%endrep\r\n\r\n\t;// during endproc stack adjustment to include difference\r\n\t;// between locnt and uses_adjust\r\n\t%assign %$__nx_uses_stack_adjust %%__size  * %$__nx_uses_count\r\n\t%xdefine __NX_PROLOGUE_USES_ADJUST__ %[%$__nx_uses_stack_adjust]\r\n\r\n%endmacro\r\n\r\n\r\n;//////////////////////////////////////////////////////////////\r\n;// MACRO LOCALS\r\n;//\r\n;// usage:\r\n;//    locals [none]\r\n;// where\r\n;//    none - allows us to avoid using stackframe if user\r\n;//           writing a small leaf function or will handle\r\n;//           function prologue separately.  Also indicates\r\n;//           that endlocals directive not required.\r\n;//\r\n;// notes:\r\n;//    This macro can only be used within the proc prologue\r\n;//    and must precede any assembly code. Invoke checks to\r\n;//    verify that this macro was called to ensure that the\r\n;//    prologue was initialized properly.\r\n;//\r\n%imacro LOCALS 0-1.nolist\r\n\t%ifndef NASMX_ENDPROC\r\n\t\t%error 'missing proc directive.'\r\n\t%endif\r\n\t%ifndef __NX_LOCALS_PRESENT__\r\n\t\t%define __NX_LOCALS_PRESENT__\r\n\t%endif\r\n\t%if %0 == 1\r\n\t\t%ifidni %1,none\r\n\t\t\t%define __NX_LOCALS_NONE__\r\n\t\t%else\r\n\t\t\t%warning unknown locals directive: %1\r\n\t\t%endif\r\n\t%endif\r\n\r\n\t%ifndef __NX_PROLOGUE_USES_ADJUST__\r\n\t\t%xdefine __NX_PROLOGUE_USES_ADJUST__ 0\r\n\t%endif\r\n\r\n\t%ifdef __NX_LOCALS_NONE__\r\n\t\t%ifdef __NX_PROLOGUE_CALLSTACK_ADJUST__\r\n\t\t\t%assign %$__nx_locnt %$__nx_locnt + __NX_PROLOGUE_CALLSTACK_ADJUST__\r\n\t\t%endif\r\n\t\t%if %$__nx_locnt > 0\r\n\t\t\t;// assert: the following block of code added for NASMX 1.0rc2\r\n\t\t\t;// to ensure that stack is aligned properly for functions\r\n\t\t\t;// which do not define any locals, save odd count registers,\r\n\t\t\t;// or linux x64 procs with unaligned spill area\r\n\t\t\t%assign %%__align __NASMX_ABI_BITS__ / 4\r\n\t\t\t%assign %%__off (((%$__nx_locnt + %%__align) / %%__align) * %%__align)\r\n\t\t\t%assign %%__tmp (%$__nx_locnt + %%__align)\r\n\t\t\t%if (%%__off != %%__tmp)\r\n\t\t\t\t%assign %$__nx_locnt (%$__nx_locnt + (__NASMX_ABI_BITS__ / 8))\r\n\t\t\t%endif\r\n\t\t\tsub  __SP, %$__nx_locnt\r\n\t\t%endif\r\n\t%endif\r\n%endmacro\r\n\r\n\r\n%imacro LOCAL 2-3.nolist 1\r\n\t%ifndef __NX_LOCALS_PRESENT__\r\n\t\t%error 'missing locals directive.'\r\n\t%endif\r\n\t%ifdef __NX_LOCALS_NONE__\r\n\t\t%error 'conflicts with directive: locals none'\r\n\t%endif\r\n\t%ifndef %[%2]_size\r\n\t\t%error %1 unknown size: %2\r\n\t%endif\r\n\t%assign %%__size %[%2]_size\r\n\t%assign %$__nx_locnt %$__nx_locnt + %%__size * %3\r\n\r\n\t;// ensure natural alignment of stack local variables\r\n\t;// TODO: A nice, but not trivial, optimization to reduce\r\n\t;// stack usage even further would be to reorganize equate\r\n\t;// offsets of local variables similar to a real compiler.\r\n\t%if %%__size <= 4\r\n\t\t%assign %%__align 4\r\n\t%elif %%__size <= 8\r\n\t\t%assign %%__align 8\r\n\t%elif %%__size > 16\r\n\t\t%assign %%__align __NASMX_ABI_BITS__ / 8\r\n\t%else\r\n\t\t%assign %%__align __NASMX_ABI_BITS__ / 4\r\n\t%endif\r\n\t%assign %%__off (((%$__nx_locnt + %%__align) / %%__align) * %%__align)\r\n\t%assign %%__tmp (%$__nx_locnt + %%__align)\r\n\t%if (%%__off != %%__tmp)\r\n\t\t%assign %$__nx_locnt %%__off\r\n\t%endif\r\n\t.%[%1] EQU %$__nx_locnt\r\n%endmacro\r\n\r\n\r\n%imacro ENDLOCALS 0.nolist\r\n\t%ifndef __NX_LOCALS_PRESENT__\r\n\t\t%error 'missing locals directive.'\r\n\t%endif\r\n\t%ifndef __NX_LOCALS_NONE__\r\n\t\t%ifdef __NX_PROLOGUE_CALLSTACK_ADJUST__\r\n\t\t\t%assign %$__nx_locnt %$__nx_locnt + __NX_PROLOGUE_CALLSTACK_ADJUST__\r\n\t\t%endif\r\n\t\t%assign %%__align __NASMX_ABI_BITS__ / 4\r\n\t\t%if %$__nx_locnt > 0\r\n\t\t\t;// keep stack aligned\r\n\t\t\t%assign %%__off (((%$__nx_locnt + %%__align) / %%__align) * %%__align)\r\n\t\t\t%assign %%__tmp (%$__nx_locnt + %%__align)\r\n\t\t\t%if (%%__off != %%__tmp)\r\n\t\t\t\t%assign %$__nx_locnt %%__off\r\n\t\t\t%endif\r\n\t\t\tsub  __SP, %$__nx_locnt\r\n\t\t%endif\r\n\t%endif\r\n%endmacro\r\n\r\n;// the following provide accessor macros to the procedure\r\n;// parameter arguments and local variables\r\n%if __NASMX_ABI_BITS__ > 32\r\n\t%if __NASMX_DECLSPEC_SYSTYPE_DEFAULT__ != __NASMX_DECLSPEC_SYSTYPE_WINDOWS__\r\n\t\t;// Linux x64 argv offsets defined as positive offsets from spill area\r\n\t\t%idefine argv(v) rbp + ( v - __NX_PROLOGUE_X64_SPILL_OFFSET__ )\r\n\t%else\r\n\t\t%idefine argv(v) rbp + v\r\n\t%endif\r\n\t%idefine  var(v) rbp - v\r\n%else\r\n\t%idefine argv(v) ebp + v\r\n\t%idefine  var(v) ebp - v\r\n%endif\r\n\r\n%idefine OFFSET\r\n\r\n%imacro RETURN 0-1.nolist\r\n\t%if %0 > 0\r\n\t\t%ifnum %1\r\n\t\t\t%if %1 == -1\r\n\t\t\t\tor __AX, %1\r\n\t\t\t%elif %1 == 0\r\n\t\t\t\txor __AX, __AX\r\n\t\t\t%else\r\n\t\t\t\tmov __AX, %1\r\n\t\t\t%endif\r\n\t\t%else\r\n\t\t\t%ifnidni %1, __AX\r\n\t\t\t\tmov __AX, %[%1]\r\n\t\t\t%endif\r\n\t\t%endif\r\n\t%endif\r\n\tjmp  NASMX_ENDPROC\r\n%endmacro\r\n\r\n%imacro LEAVE 0.nolist\r\n\t%ifndef __NX_LEAVE_PRESENT__\r\n\t\t%define __NX_LEAVE_PRESENT__\r\n\t\t%ifdef NASMX_ENDPROC\r\n\t\t\t;// reset __SP to end of saved registers, if any\r\n\t\t\t%if __NASMX_ABI_BITS__ > 32\r\n\t\t\t\t%ifdef __NX_PROLOGUE_X64_SPILL_OFFSET__\r\n\t\t\t\t\t%assign %$__nx_locnt %$__nx_locnt - __NX_PROLOGUE_X64_SPILL_OFFSET__\r\n\t\t\t\t%endif\r\n\t\t\t%endif\r\n\t\t\t%ifdef __NX_PROLOGUE_USES_ADJUST__\r\n\t\t\t\t%if %$__nx_locnt > __NX_PROLOGUE_USES_ADJUST__\r\n\t\t\t\t\t%assign %$__nx_locnt %$__nx_locnt - __NX_PROLOGUE_USES_ADJUST__\r\n\t\t\t\t%endif\r\n\t\t\t%endif\r\n\t\t\t%ifdef __NX_LOCALS_PRESENT__\r\n\t\t\t\t%if %$__nx_locnt > 0\r\n\t\t\t\t\tadd  __SP, %$__nx_locnt\r\n\t\t\t\t%endif\r\n\t\t\t%endif\r\n\t\t\t;// restore any non-volatile registers\r\n\t\t\t%ifdef __NX_USES_PRESENT__\r\n\t\t\t\t%assign %%__nx_reg %$__nx_uses_count\r\n\t\t\t\t%rep %$__nx_uses_count\r\n\t\t\t\t\tpop __nx_uses_reg_%[%%__nx_reg]\r\n\t\t\t\t\t%undef __nx_uses_reg_%[%%__nx_reg]\r\n\t\t\t\t\t%assign %%__nx_reg %%__nx_reg - 1\r\n\t\t\t\t%endrep\r\n\t\t\t%endif\r\n\t\t%endif\r\n\t\t%ifdef __NX_PROLOGUE_PRESENT__\r\n\t\t\tmov __SP, __BP\r\n\t\t\tpop __BP\r\n\t\t%endif\r\n\t%endif\r\n%endmacro\r\n\r\n%imacro RET 0-1.nolist\r\n\t%ifdef NASMX_ENDPROC\r\n\t\t%ifndef __NX_LEAVE_PRESENT__\r\n\t\t\tleave\r\n\t\t%endif\r\n\t\t%define __NX_RETURN_PRESENT__\r\n\t%endif\r\n\r\n\t%if %0 == 1\r\n\t\t%ifnum %1\r\n\t\t\t%if %1 > 0\r\n\t\t\t\tret %1\r\n\t\t\t%else\r\n\t\t\t\tret\r\n\t\t\t%endif\r\n\t\t%elifid %1\r\n\t\t\t%if %[%1] > 0\r\n\t\t\t\tret %[%1]\r\n\t\t\t%else\r\n\t\t\t\tret\r\n\t\t\t%endif\r\n\t\t%else\r\n\t\t\t%warning 'invalid operand supplied to ret opcode'\r\n\t\t\tret\r\n\t\t%endif\r\n\t%else\r\n\t\tret\r\n\t%endif\r\n%endmacro\r\n\r\n%imacro ENDPROC 0.nolist\r\n\t%ifndef NASMX_ENDPROC\r\n\t\t%fatal 'missing proc directive.'\r\n\t%endif\r\n\r\n\t;// provide a proc end jmp label\r\n\t%[NASMX_ENDPROC]:\r\n\r\n\t;// assert: we can not be certain at what context level we are at,\r\n\t;// thus we pop all contexts until we get to __NX_CTX_PROC__\r\n\t%rep 32\r\n\t\t;// Bugfix:\r\n\t\t;// Avoid problem with exitrep not exiting\r\n\t\t;// the loop immediately.\r\n\t\t%ifctx __NX_CTX_PROC__\r\n\t\t\t%exitrep\r\n\t\t%else\r\n\t\t\t%pop\r\n\t\t%endif\r\n\t%endrep\r\n\r\n\t%ifndef __NX_RETURN_PRESENT__\r\n\t\t%assign %%__cc_retpopsargs nx_declspec_cc_retpopsargs(%$__nx_callconv)\r\n\t\t%if %%__cc_retpopsargs == 0\r\n\t\t\tret\r\n\t\t%else\r\n\t\t\t;// x64 retpopcnt may be different than bytecount\r\n\t\t\t%assign %$__nx_retpopcnt (%$__nx_argv - (__NASMX_ABI_BITS__ / 4))\r\n\t\t\t%if %$__nx_retpopcnt > 0\r\n\t\t\t\tret %[%$__nx_retpopcnt]\r\n\t\t\t%else\r\n\t\t\t\tret\r\n\t\t\t%endif\r\n\t\t%endif\r\n\t%endif\r\n\t%pop\r\n\t%undef NASMX_ENDPROC\r\n\t%ifdef __NX_LEAVE_PRESENT__\r\n\t\t%undef __NX_LEAVE_PRESENT__\r\n\t%endif\r\n\t%ifdef __NX_RETURN_PRESENT__\r\n\t\t%undef __NX_RETURN_PRESENT__\r\n\t%endif\r\n\t%ifdef __NX_USES_PRESENT__\r\n\t\t%undef __NX_USES_PRESENT__\r\n\t%endif\r\n\t%ifdef __NX_LOCALS_PRESENT__\r\n\t\t%undef __NX_LOCALS_PRESENT__\r\n\t%endif\r\n\t%ifdef __NX_LOCALS_NONE__\r\n\t\t%undef __NX_LOCALS_NONE__\r\n\t%endif\r\n\t%ifdef __NX_PROLOGUE_PRESENT__\r\n\t\t%undef __NX_PROLOGUE_PRESENT__\r\n\t%endif\r\n\t%ifdef __NX_PROLOGUE_USES_ADJUST__\r\n\t\t%undef __NX_PROLOGUE_USES_ADJUST__\r\n\t%endif\r\n\t%ifdef __NX_PROLOGUE_X64_SPILL_OFFSET__\r\n\t\t%undef __NX_PROLOGUE_X64_SPILL_OFFSET__\r\n\t%endif\r\n%endmacro\r\n\r\n\r\n%imacro RJMP 2.nolist\r\n; This macro preforms the opposite conditional jump\r\n; than what the value suggests, it's used internally\r\n; by other macros\r\n\t%ifidni %1, ==\r\n\t\tjne %2\r\n\t%elifidni %1, >\r\n\t\tjle %2\r\n\t%elifidni %1, <\r\n\t\tjge %2\r\n\t%elifidni %1, >=\r\n\t\tjl %2\r\n\t%elifidni %1, <=\r\n\t\tjg %2\r\n\t%elifidni %1, !=\r\n\t\tje %2\r\n\t%elifidni %1, !>\r\n\t\tjg %2\r\n\t%elifidni %1, !<\r\n\t\tjl %2\r\n\t%elifidni %1, CARRY\r\n\t\tjnc %2\r\n\t%elifidni %1, BELOW\r\n\t\tjnb %2\r\n\t%elifidni %1, ABOVE\r\n\t\tjna %2\r\n\t%elifidni %1, PARITY\r\n\t\tjnp %2\r\n\t%elifidni %1, SIGNED\r\n\t\tjns %2\r\n\t%elifidni %1, OVERFLOW\r\n\t\tjno %2\r\n\t%elifidni %1, !CARRY\r\n\t\tjc %2\r\n\t%elifidni %1, !BELOW\r\n\t\tjb %2\r\n\t%elifidni %1, !ABOVE\r\n\t\tja %2\r\n\t%elifidni %1, !PARITY\r\n\t\tjp %2\r\n\t%elifidni %1, !SIGNED\r\n\t\tjs %2\r\n\t%elifidni %1, !OVERFLOW\r\n\t\tjo %2\r\n\t%endif\r\n%endmacro\r\n\r\n\r\n%imacro SJMP 2.nolist\r\n\t%ifidni %1, ==\r\n\t\tje %2\r\n\t%elifidni %1, >\r\n\t\tjg %2\r\n\t%elifidni %1, <\r\n\t\tjl %2\r\n\t%elifidni %1, >=\r\n\t\tjge %2\r\n\t%elifidni %1, <=\r\n\t\tjle %2\r\n\t%elifidni %1, !=\r\n\t\tjne %2\r\n\t%elifidni %1, !>\r\n\t\tjng %2\r\n\t%elifidni %1, !<\r\n\t\tjnl %2\r\n\t%elifidni %1, CARRY\r\n\t\tjc %2\r\n\t%elifidni %1, BELOW\r\n\t\tjb %2\r\n\t%elifidni %1, ABOVE\r\n\t\tja %2\r\n\t%elifidni %1, PARITY\r\n\t\tjp %2\r\n\t%elifidni %1, SIGNED\r\n\t\tjs %2\r\n\t%elifidni %1, OVERFLOW\r\n\t\tjo %2\r\n\t%elifidni %1, !CARRY\r\n\t\tjnc %2\r\n\t%elifidni %1, !BELOW\r\n\t\tjnb %2\r\n\t%elifidni %1, !ABOVE\r\n\t\tjna %2\r\n\t%elifidni %1, !PARITY\r\n\t\tjnp %2\r\n\t%elifidni %1, !SIGNED\r\n\t\tjns %2\r\n\t%elifidni %1, !OVERFLOW\r\n\t\tjno %2\r\n\t%endif\r\n%endmacro\r\n\r\n\r\n\r\n;//////////////////////////////////////////////////////////////////////////////\r\n;//\r\n;// The following macros provide a convenient way\r\n;// to simulate high level constructs.  They allow\r\n;// nesting of statements of arbitrary depth.\r\n;// Note that the address labels generated are dot-\r\n;// prepended to not break NASMX locals!\r\n\r\n%imacro IF 3.nolist\r\n%push __NX_CTX_IF__\r\n\t; we must obtain any outer context label sequence\r\n\t; to enable the break macro to succeed.\r\n\t%ifndef __NX_OPER_LABEL_SEQ__\r\n\t\t%xdefine __NX_OPER_LABEL_SEQ__ 0\r\n\t%endif\r\n\t%assign %$__nx_oper_label_seq %[__NX_OPER_LABEL_SEQ__]\r\n\t; sequence label numbers for the IF macro must be\r\n\t; separate from looping sequence label numbers.\r\n\t%ifndef __NX_OPER_IF_LABEL_SEQ__\r\n\t\t%xdefine __NX_OPER_IF_LABEL_SEQ__ 0\r\n\t%endif\r\n\t%assign %$__nx_oper_if_label_seq %[__NX_OPER_IF_LABEL_SEQ__] + 1\r\n\t%undef __NX_OPER_IF_LABEL_SEQ__\r\n\t%xdefine __NX_OPER_IF_LABEL_SEQ__ %[%$__nx_oper_if_label_seq]\r\n\r\n\t%assign %$__nx_oper_else 0\r\n\t%assign %$__nx_oper_if_label_next 1\r\n\tcmp %1, %3\r\n\tRJMP %2, .__NX_OPER_IF_LABEL_%[%$__nx_oper_if_label_seq]_%[%$__nx_oper_if_label_next]\r\n%endmacro\r\n\r\n\r\n%imacro ELSIF 3.nolist\r\n\t%ifctx __NX_CTX_IF__\r\n\t\t%if %$__nx_oper_else > 0\r\n\t\t\t%error \"ELSIF cannot follow ELSE block.\"\r\n\t\t%endif\r\n\t\tjmp .__NX_OPER_IF_LABEL_%[%$__nx_oper_if_label_seq]\r\n\t\t.__NX_OPER_IF_LABEL_%[%$__nx_oper_if_label_seq]_%[%$__nx_oper_if_label_next]:\r\n\t\t%assign %$__nx_oper_if_label_next 1+%$__nx_oper_if_label_next\r\n\t\tcmp %1, %3\r\n\t\tRJMP %2, .__NX_OPER_IF_LABEL_%[%$__nx_oper_if_label_seq]_%[%$__nx_oper_if_label_next]\r\n\t%else\r\n\t\t%error \"ELSIF directive must be within an IF block.\"\r\n\t%endif\r\n%endmacro\r\n\r\n\r\n%imacro ELSE 0.nolist\r\n\t%ifctx __NX_CTX_IF__\r\n\t\t%if %$__nx_oper_else > 0\r\n\t\t\t%error \"There can only be one ELSE per IF block.\"\r\n\t\t%else\r\n\t\t\t%assign %$__nx_oper_else 1\r\n\t\t\tjmp .__NX_OPER_IF_LABEL_%[%$__nx_oper_if_label_seq]\r\n\t\t\t.__NX_OPER_IF_LABEL_%[%$__nx_oper_if_label_seq]_%[%$__nx_oper_if_label_next]:\r\n\t\t\t%assign %$__nx_oper_if_label_next 1+%$__nx_oper_if_label_next\r\n\t\t%endif\r\n\t%else\r\n\t\t%error \"ELSE directive must be within an IF block.\"\r\n\t%endif\r\n%endmacro\r\n\r\n\r\n%imacro ENDIF 0.nolist\r\n\t%ifctx __NX_CTX_IF__\r\n\t\t; must have a forward label in case elsif/else macros used.\r\n\t\t.__NX_OPER_IF_LABEL_%[%$__nx_oper_if_label_seq]_%[%$__nx_oper_if_label_next]:\r\n\t\t.__NX_OPER_IF_LABEL_%[%$__nx_oper_if_label_seq]:\r\n\t\t%pop\r\n\t%else\r\n\t\t%error \"ENDIF directive must be within an IF block.\"\r\n\t%endif\r\n%endmacro\r\n\r\n\r\n%imacro BREAK 0.nolist\r\n\tjmp .__NX_OPER_LABEL_EXIT_%[%$__nx_oper_label_seq]\r\n%endmacro\r\n\r\n\r\n%imacro CONTINUE 0.nolist\r\n\tjmp .__NX_OPER_LABEL_CONTINUE_%[%$__nx_oper_label_seq]\r\n%endmacro\r\n\r\n\r\n%imacro SWITCH 1.nolist\r\n%push __NX_CTX_SWITCH__\r\n\t%ifndef __NX_OPER_LABEL_SEQ__\r\n\t\t%xdefine __NX_OPER_LABEL_SEQ__ 0\r\n\t%endif\r\n\t%assign %$__nx_oper_label_seq %[__NX_OPER_LABEL_SEQ__] + 1\r\n\t%undef __NX_OPER_LABEL_SEQ__\r\n\t%xdefine __NX_OPER_LABEL_SEQ__ %[%$__nx_oper_label_seq]\r\n\t%ifnidni __AX, %1\r\n\t\tmov __AX, %1\r\n\t%endif\n\t%assign %$__nx_oper_label_next 1\r\n\t%assign %$__nx_oper_default 0\r\n%endmacro\r\n\r\n\r\n%imacro CASE 1.nolist\r\n\t%ifctx __NX_CTX_SWITCH__\r\n\t\t%if %$__nx_oper_default > 0\r\n\t\t\t%error \"CASE must appear before DEFAULT in SWITCH block.\"\r\n\t\t%endif\r\n\t\t.__NX_OPER_LABEL_%[%$__nx_oper_label_seq]_%[%$__nx_oper_label_next]:\r\n\t\t%assign %$__nx_oper_label_next 1+%$__nx_oper_label_next\r\n\t\tcmp __AX, %1\r\n\t\tjnz near .__NX_OPER_LABEL_%[%$__nx_oper_label_seq]_%[%$__nx_oper_label_next]\r\n\t%else\r\n\t\t%error \"CASE directive must be within a SWITCH block.\"\r\n\t%endif\r\n%endmacro\r\n\r\n\r\n%imacro DEFAULT 0.nolist\r\n\t%ifctx __NX_CTX_SWITCH__\r\n\t\t%if %$__nx_oper_default > 0\r\n\t\t\t%error \"There can only be one DEFAULT per SWITCH block.\"\r\n\t\t%endif\r\n\t\t%assign %$__nx_oper_default 1\r\n\t\t.__NX_OPER_LABEL_%[%$__nx_oper_label_seq]_%[%$__nx_oper_label_next]:\r\n\t\t%assign %$__nx_oper_label_next 1+%$__nx_oper_label_next\r\n\t%else\r\n\t\t%error \"DEFAULT directive must be within a SWITCH block.\"\r\n\t%endif\r\n%endmacro\r\n\r\n\r\n%imacro ENDSWITCH 0.nolist\r\n\t%ifctx __NX_CTX_SWITCH__\r\n\t\t.__NX_OPER_LABEL_%[%$__nx_oper_label_seq]_%[%$__nx_oper_label_next]:\r\n\t\t.__NX_OPER_LABEL_EXIT_%[%$__nx_oper_label_seq]:\r\n\t\t%pop\r\n\t%else\r\n\t\t%error \"Missing SWITCH directive.\"\r\n\t%endif\r\n%endmacro\r\n\r\n\r\n%imacro REPEAT 0.nolist\r\n%push __NX_CTX_REPEAT__\r\n\t%ifndef __NX_OPER_LABEL_SEQ__\r\n\t\t%xdefine __NX_OPER_LABEL_SEQ__ 0\r\n\t%endif\r\n\t%assign %$__nx_oper_label_seq %[__NX_OPER_LABEL_SEQ__] + 1\r\n\t%undef __NX_OPER_LABEL_SEQ__\r\n\t%xdefine __NX_OPER_LABEL_SEQ__ %[%$__nx_oper_label_seq]\r\n\t%assign %$__nx_oper_label_next 1\r\n\t.__NX_OPER_LABEL_%[%$__nx_oper_label_seq]_%[%$__nx_oper_label_next]:\r\n%endmacro\r\n\r\n\r\n%imacro UNTIL 3.nolist\r\n\t%ifctx __NX_CTX_REPEAT__\r\n\t\t.__NX_OPER_LABEL_CONTINUE_%[%$__nx_oper_label_seq]:\r\n\t\tcmp %1, %3\r\n\t\tRJMP %2, .__NX_OPER_LABEL_%[%$__nx_oper_label_seq]_%[%$__nx_oper_label_next]\r\n\t\t.__NX_OPER_LABEL_EXIT_%[%$__nx_oper_label_seq]:\r\n\t\t%pop\r\n\t%elifctx __NX_CTX_DO__\r\n\t\t%warning \"DO/UNTIL combination is deprecated.  Use REPEAT/UNTIL.\"\r\n\t\t.__NX_OPER_LABEL_CONTINUE_%[%$__nx_oper_label_seq]:\r\n\t\tcmp %1, %3\r\n\t\tRJMP %2, .__NX_OPER_LABEL_%[%$__nx_oper_label_seq]_%[%$__nx_oper_label_next]\r\n\t\t.__NX_OPER_LABEL_EXIT_%[%$__nx_oper_label_seq]:\r\n\t\t%pop\r\n\t%else\r\n\t\t%error \"Missing REPEAT directive.\"\r\n\t%endif\r\n%endmacro\r\n\r\n\r\n%imacro DO 0.nolist\r\n%push __NX_CTX_DO__\r\n\t%ifndef __NX_OPER_LABEL_SEQ__\r\n\t\t%xdefine __NX_OPER_LABEL_SEQ__ 0\r\n\t%endif\r\n\t%assign %$__nx_oper_label_seq %[__NX_OPER_LABEL_SEQ__] + 1\r\n\t%undef __NX_OPER_LABEL_SEQ__\r\n\t%xdefine __NX_OPER_LABEL_SEQ__ %[%$__nx_oper_label_seq]\r\n\t%assign %$__nx_oper_label_next 1\r\n\t.__NX_OPER_LABEL_%[%$__nx_oper_label_seq]_%[%$__nx_oper_label_next]:\r\n%endmacro\r\n\r\n\r\n; There is some trickery with this macro: If the DO context exists we assume\n; that this is a finishing while statement; If no DO context is found we assume\n; that the user is beginning a while loop.  This implies that you cannot use a\n; WHILE loop directly inside a DO loop without some other intervening context.\n; If your code requires this then you must use REPEAT/UNTIL for the outer loop.\n%imacro WHILE 3.nolist\r\n\t%ifctx __NX_CTX_DO__\r\n\t\t.__NX_OPER_LABEL_CONTINUE_%[%$__nx_oper_label_seq]:\r\n\t\tcmp %1, %3\r\n\t\tSJMP %2, .__NX_OPER_LABEL_%[%$__nx_oper_label_seq]_%[%$__nx_oper_label_next]\r\n\t\t.__NX_OPER_LABEL_EXIT_%[%$__nx_oper_label_seq]:\r\n\t\t%pop\r\n\t%else\r\n\t\t%push __NX_CTX_WHILE__\r\n\t\t%ifndef __NX_OPER_LABEL_SEQ__\r\n\t\t\t%xdefine __NX_OPER_LABEL_SEQ__ 0\r\n\t\t%endif\r\n\t\t%assign %$__nx_oper_label_seq %[__NX_OPER_LABEL_SEQ__] + 1\r\n\t\t%undef __NX_OPER_LABEL_SEQ__\r\n\t\t%xdefine __NX_OPER_LABEL_SEQ__ %[%$__nx_oper_label_seq]\r\n\t\t%assign %$__nx_oper_label_next 1\r\n\t\t.__NX_OPER_LABEL_CONTINUE_%[%$__nx_oper_label_seq]:\r\n\t\tcmp %1, %3\r\n\t\tRJMP %2, .__NX_OPER_LABEL_EXIT_%[%$__nx_oper_label_seq]\r\n\t%endif\r\n%endmacro\r\n\r\n\r\n%imacro ENDWHILE 0.nolist\r\n\t%ifctx __NX_CTX_WHILE__\r\n\t\tjmp .__NX_OPER_LABEL_CONTINUE_%[%$__nx_oper_label_seq]\r\n\t\t.__NX_OPER_LABEL_EXIT_%[%$__nx_oper_label_seq]:\r\n\t\t%pop\r\n\t%else\r\n\t\t%error \"Missing WHILE directive.\"\r\n\t%endif\r\n%endmacro\r\n\r\n\r\n;// The following is used to wrap test code when debugging\r\n;%define __NX_DEBUG__  ;;//// * * * BEGIN NASMX DEBUG FRAME * * * ///////////////\r\n%ifdef __NX_DEBUG__\r\n\r\n%xdefine __NX_DEBUG_SOURCE_LINE_START__ __LINE__\r\n\r\n;;// * * PLACE TEST CODE HERE * *\r\n\r\n%xdefine __NX_DEBUG_SOURCE_LINE_END__ __LINE__\r\n%ifndef __NX_DEBUG_SOURCE_LINE_START__\r\n   %fatal NXDEBUG: BREAK line: __LINE__ section(????,__NX_DEBUG_SOURCE_LINE_END__) __NX_DEBUG_SOURCE_LINE_START__ undefined!\r\n%endif\r\n%assign __NX_DEBUG_SOURCE_LINE_COUNT__ __NX_DEBUG_SOURCE_LINE_END__ - __NX_DEBUG_SOURCE_LINE_START__\r\n%fatal NXDEBUG: BREAK line: __LINE__ section(__NX_DEBUG_SOURCE_LINE_START__,__NX_DEBUG_SOURCE_LINE_END__) __NX_DEBUG_SOURCE_LINE_COUNT__ lines\r\n%endif  ;;///////////////// * * * END NASMX DEBUG FRAME * * * /////////////////\r\n\r\n%endif\t; ifndef __NASMX_INCLUDED__\r\n\r\n;// To speed up assembly we simply copy the values we use in our source\r\n;// from the nasmx/inc/win32 include directory rather than including the\r\n;// entire fileset as this really strains the preprocessor...\r\n;//     %include 'win32\\windows.inc'\r\n;//     %include 'win32\\kernel32.inc'\r\n;//     %include 'win32\\user32.inc'\r\n;//     %include 'win32\\msvcrt.inc'\r\n;//\r\n;// If you will be using additional Windows defines and structures for\r\n;// your programs we recommend that you create your own include header\r\n;// or simply include the above mentioned files in your source code.\r\n\r\n;/////////////////////////////////////////////////////\r\n;// WINDOWS.INC DEFINITIONS\r\n;/////////////////////////////////////////////////////\r\n%define MB_OK 0h\r\n%define NULL 0\r\n%define FALSE 0\r\n%define TRUE 1\r\n%define COLOR_BTNFACE 15\r\n%define CS_HREDRAW 2h\r\n%define CS_VREDRAW 1h\r\n%define IDOK 1\r\n%define IDCANCEL 2\r\n%define IDI_APPLICATION 32512\r\n\r\n%define IDC_ARROW 32512\r\n%define IDC_IBEAM 32513\r\n%define IDC_WAIT 32514\r\n%define IDC_CROSS 32515\r\n%define IDC_UPARROW 32516\r\n%define IDC_SIZE 32640\r\n%define IDC_ICON 32641\r\n\r\n%define CBS_DROPDOWN 2h\r\n%define CBS_SORT 100h\r\n\r\n%define LBS_SORT 2h\r\n%define LBS_HASSTRINGS 40h\r\n\r\n%define SS_CENTER 1h\r\n%define SS_NOPREFIX 80h\r\n\r\n%define MB_ICONHAND 10h\r\n%define MB_ICONQUESTION 20h\r\n%define MB_ICONEXCLAMATION 30h\r\n%define MB_ICONASTERISK 40h\r\n%define MB_ICONERROR MB_ICONHAND\r\n%define MB_ICONINFORMATION MB_ICONASTERISK\r\n%define MB_ICONSTOP MB_ICONHAND\r\n%define MB_ICONWARNING MB_ICONEXCLAMATION\r\n\r\n%define STD_INPUT_HANDLE -10\r\n%define STD_OUTPUT_HANDLE -11\r\n%define STD_ERROR_HANDLE -12\r\n\r\n%define SW_SHOWNORMAL 1\r\n%define WS_OVERLAPPED 0h\r\n%define WS_EX_TOOLWINDOW 00000080h\r\n%define WS_CHILD 40000000h\r\n%define WS_CAPTION 0C00000h\r\n%define WS_SYSMENU 80000h\r\n%define WS_VISIBLE 10000000h\r\n%define WS_THICKFRAME 40000h\r\n%define WS_GROUP 20000h\r\n%define WS_TABSTOP 10000h\r\n%define WS_MINIMIZEBOX 20000h\r\n%define WS_MAXIMIZEBOX 10000h\r\n%define WS_OVERLAPPEDWINDOW WS_OVERLAPPED|WS_CAPTION|WS_SYSMENU|WS_THICKFRAME|WS_MINIMIZEBOX|WS_MAXIMIZEBOX\r\n%define WS_EX_WINDOWEDGE 00000100h\r\n%define WS_EX_CLIENTEDGE 00000200h\r\n%define WS_EX_OVERLAPPEDWINDOW WS_EX_WINDOWEDGE|WS_EX_CLIENTEDGE\r\n\r\n%define WM_CREATE 1h\r\n%define WM_DESTROY 2h\r\n%define WM_SETTEXT 0Ch\r\n%define WM_GETTEXT 0Dh\r\n%define WM_GETTEXTLENGTH 0Eh\r\n%define WM_CLOSE 10h\r\n%define WM_INITDIALOG 110h\r\n%define WM_COMMAND 111h\r\n%define WM_ERASEBKGND 14h\r\n%define WM_PAINT 0Fh\r\n%define WM_TIMER 113h\r\n%define WM_KEYDOWN 100h\r\n%define VK_ESCAPE 1Bh\r\n%define SRCCOPY 0CC0020h\r\n\r\n;/////////////////////////////////////////////////////\r\n;// WINDOWS.INC STRUCTURES\r\n;/////////////////////////////////////////////////////\r\n\r\nNASMX_STRUC WNDCLASSEX\r\n    NASMX_RESERVE cbSize,        uint32_t, 1\r\n    NASMX_RESERVE style,         uint32_t, 1\r\n    NASMX_RESERVE lpfnWndProc,   ptrdiff_t, 1\r\n    NASMX_RESERVE cbClsExtra,    int32_t, 1\r\n    NASMX_RESERVE cbWndExtra,    int32_t, 1\r\n    NASMX_RESERVE hInstance,     ptrdiff_t, 1\r\n    NASMX_RESERVE hIcon,         ptrdiff_t, 1\r\n    NASMX_RESERVE hCursor,       ptrdiff_t, 1\r\n    NASMX_RESERVE hbrBackground, ptrdiff_t, 1\r\n    NASMX_RESERVE lpszMenuName,  ptrdiff_t, 1\r\n    NASMX_RESERVE lpszClassName, ptrdiff_t, 1\r\n    NASMX_RESERVE hIconSm,       ptrdiff_t, 1\r\nNASMX_ENDSTRUC\r\n\r\nNASMX_STRUC MSG\r\n    NASMX_RESERVE hwnd,    ptrdiff_t, 1\r\n    NASMX_RESERVE message, uint32_t, 1\r\n    NASMX_RESERVE wParam,  size_t, 1\r\n    NASMX_RESERVE lParam,  size_t, 1\r\n    NASMX_RESERVE time,    uint32_t, 1\r\n\tNASMX_STRUC pt, POINT\r\n\t\tNASMX_RESERVE x, int32_t, 1\r\n\t\tNASMX_RESERVE y, int32_t, 1\r\n\tNASMX_ENDSTRUC\r\n\t%ifidn __OUTPUT_FORMAT__,macho\r\n\t    NASMX_RESERVE lPrivate, int32_t, 1\r\n\t%elifidn __OUTPUT_FORMAT__,macho32\r\n\t    NASMX_RESERVE lPrivate, int32_t, 1\r\n\t%elifidn __OUTPUT_FORMAT__,macho64\r\n\t    NASMX_RESERVE lPrivate, int64_t, 1\r\n\t%endif\r\nNASMX_ENDSTRUC\r\n\r\nNASMX_STRUC RECT\r\n    NASMX_RESERVE left,   int32_t, 1\r\n    NASMX_RESERVE top,    int32_t, 1\r\n    NASMX_RESERVE right,  int32_t, 1\r\n    NASMX_RESERVE bottom, int32_t, 1\r\nNASMX_ENDSTRUC\r\n\r\nNASMX_STRUC BITMAPINFOHEADER\r\n    NASMX_RESERVE biSize, int32_t, 1\r\n    NASMX_RESERVE biWidth, int32_t, 1\r\n    NASMX_RESERVE biHeight, int32_t, 1\r\n    NASMX_RESERVE biPlanes, short_t, 1\r\n    NASMX_RESERVE biBitCount, short_t, 1\r\n    NASMX_RESERVE biCompression, int32_t, 1\r\n    NASMX_RESERVE biSizeImage, int32_t, 1\r\n    NASMX_RESERVE biXPelsPerMeter, int32_t, 1\r\n    NASMX_RESERVE biYPelsPerMeter, int32_t, 1\r\n    NASMX_RESERVE biClrUsed, int32_t, 1\r\n    NASMX_RESERVE biClrImportant, int32_t, 1\r\nNASMX_ENDSTRUC\r\n\r\nNASMX_STRUC PAINTSTRUCT\r\n    NASMX_RESERVE hdc,         ptrdiff_t, 1\r\n    NASMX_RESERVE fErase,      int32_t, 1\r\n\tNASMX_STRUC rcPaint, RECT\r\n\t\tNASMX_RESERVE left,    int32_t, 1\r\n\t\tNASMX_RESERVE top,     int32_t, 1\r\n\t\tNASMX_RESERVE right,   int32_t, 1\r\n\t\tNASMX_RESERVE bottom,  int32_t, 1\r\n\tNASMX_ENDSTRUC\r\n    NASMX_RESERVE fRestore,    int32_t, 1\r\n    NASMX_RESERVE fIncUpdate,  int32_t, 1\r\n    NASMX_RESERVE rgbReserved, int8_t, 32 \r\nNASMX_ENDSTRUC\r\n\r\nNASMX_STRUC PALETTEENTRY\r\n    NASMX_RESERVE peRed,   int8_t, 1\r\n    NASMX_RESERVE peGreen, int8_t, 1\r\n    NASMX_RESERVE peBlue,  int8_t, 1\r\n    NASMX_RESERVE peFlags, int8_t, 1\r\nNASMX_ENDSTRUC\r\n\r\n;/////////////////////////////////////////////////////\r\n;// KERNEL32.INC PROTOTYPES\r\n;/////////////////////////////////////////////////////\r\nIMPORT ExitProcess, 4\r\nIMPORT GetConsoleMode, 8\r\nIMPORT GetLastError, 0\r\nIMPORT GetProcessHeap, 0\r\nIMPORT GetStdHandle, 4\r\nIMPORT HeapAlloc, 12\r\nIMPORT HeapFree, 12\r\nIMPORT ReadFile, 20\r\nIMPORT SetConsoleMode, 8\r\nIMPORT WaitForSingleObject, 8\r\nIMPORT WriteFile, 20\r\n\r\n;/////////////////////////////////////////////////////\r\n;// USER32.INC PROTOTYPES\r\n;/////////////////////////////////////////////////////\r\nIMPORT DestroyWindow, ptrdiff_t hWnd\r\nIMPORT EndDialog, ptrdiff_t hDlg, size_t nResult\r\nIMPORT GetClientRect, ptrdiff_t hWnd, ptrdiff_t lpRect\r\nIMPORT PostQuitMessage, dword nExitCode\r\nIMPORT ShowWindow, ptrdiff_t hWnd, dword nCmdShow\r\nIMPORT TranslateMessage, ptrdiff_t lpMsg\r\nIMPORT UpdateWindow, ptrdiff_t hWnd\r\nIMPORT InvalidateRect, ptrdiff_t hWnd, ptrdiff_t lpRect, dword bErase\r\nIMPORT SetTimer, ptrdiff_t hWnd, size_t nIDEvent, dword uElapse, ptrdiff_t lpTimerFunc\r\nIMPORT KillTimer, ptrdiff_t hWnd, size_t nIDEvent\r\n\r\nIMPORT CreateDCA, 16\r\nIMPORT CreateDIBSection, 24\r\nIMPORT SelectObject, 8\r\nIMPORT DeleteObject, 4\r\nIMPORT DeleteDC, 4\r\nIMPORT CreateCompatibleDC, 4\r\nIMPORT BeginPaint, 8\r\nIMPORT BitBlt, 36\r\nIMPORT EndPaint, 8\r\nIMPORT CreateCompatibleBitmap, 12\r\n\r\n;/////////////////////////////////////////////////////\r\n;// MSVCRT.INC PROTOTYPES\r\n;/////////////////////////////////////////////////////\r\n;//\r\n;// C runtime functions must be handled with care when\r\n;// switching between 32 and 64 bit mode since in 32 bit\r\n;// mode they are defined as cdecl while in 64 bit mode\r\n;// they are defined as default ( fastcall ).\r\n;// VarArg functions such as printf should never be defined\r\n;// ( prototyped ) to include a bytecount\r\n%ifidn __BITS__,64\r\nIMPORT printf\r\nIMPORT scanf\r\n%else\r\nIMPORT cdecl, printf\r\nIMPORT cdecl, scanf\r\nIMPORT cdecl, _getch\r\n%endif\r\n\r\n%ifdef UNICODE\r\n\r\n;/////////////////////////////////////////////////////\r\n;// KERNEL32.INC UNICODE PROTOTYPES\r\n;/////////////////////////////////////////////////////\r\nIMPORT GetModuleHandleW, 4\r\n%define GetModuleHandle GetModuleHandleW\r\n\r\n;/////////////////////////////////////////////////////\r\n;// USER32.INC UNICODE PROTOTYPES\r\n;/////////////////////////////////////////////////////\r\n;//\r\n;// The following shows how to properly prototype an imported\r\n;// windows function using NASMX syntax.\r\n;// TODO: This will eventually be done for all imported functions.\r\nIMPORT MessageBoxW, ptrdiff_t hWnd, ptrdiff_t lpText, ptrdiff_t lpCaption, uint32_t uType\r\n%define MessageBox MessageBoxW\r\nIMPORT CreateWindowExW, uint_t dwExStyle, ptrdiff_t lpClassName, ptrdiff_t lpWindowName, uint_t dwStyle,\\\r\n                        int_t x, int_t y, int_t nWidth, int_t nHeight,\\\r\n                        ptrdiff_t hWndParent, ptrdiff_t hMenu, ptrdiff_t hInstance, ptrdiff_t lpParam\r\n%define CreateWindowEx CreateWindowExW\r\nIMPORT DefWindowProcW, ptrdiff_t hWnd, uint_t Msg, ptrdiff_t wParam, ptrdiff_t lParam\r\n%define DefWindowProc DefWindowProcW\r\nIMPORT DialogBoxParamW, 20\r\n%define DialogBoxParam DialogBoxParamW\r\nIMPORT DispatchMessageW, 4\r\n%define DispatchMessage DispatchMessageW\r\nIMPORT GetMessageW, 16\r\n%define GetMessage GetMessageW\r\nIMPORT LoadIconW, 8\r\n%define LoadIcon LoadIconW\r\nIMPORT PostMessageW, ptrdiff_t hWnd, dword Msg, size_t wParam, size_t lParam\r\n%define PostMessage PostMessageW\r\nIMPORT RegisterClassExW, 4\r\n%define RegisterClassEx RegisterClassExW\r\nIMPORT SendDlgItemMessageW, 20\r\n%define SendDlgItemMessage SendDlgItemMessageW\r\n%ifidni __OUTPUT_FORMAT__,win64\r\nIMPORT wsprintfW\r\n%else\r\nIMPORT cdecl, wsprintfW\r\n%endif\r\n%define wsprintf wsprintfW\r\n\r\n%else  ;// ANSI\r\n\r\n;/////////////////////////////////////////////////////\r\n;// KERNEL32.INC ANSI PROTOTYPES\r\n;/////////////////////////////////////////////////////\r\nIMPORT GetModuleHandleA, 4\r\n%define GetModuleHandle GetModuleHandleA\r\n\r\n;/////////////////////////////////////////////////////\r\n;// USER32.INC ANSI PROTOTYPES\r\n;/////////////////////////////////////////////////////\r\nIMPORT CreateWindowExA, uint_t dwExStyle, ptrdiff_t lpClassName, ptrdiff_t lpWindowName, uint_t dwStyle,\\\r\n\t\t\t\t\t\tint_t x, int_t y, int_t nWidth, int_t nHeight,\\\r\n\t\t\t\t\t\tptrdiff_t hWndParent, ptrdiff_t hMenu, ptrdiff_t hInstance, ptrdiff_t lpParam\r\n%define CreateWindowEx CreateWindowExA\r\nIMPORT DefWindowProcA, ptrdiff_t hWnd, uint_t Msg, ptrdiff_t wParam, ptrdiff_t lParam\r\n%define DefWindowProc DefWindowProcA\r\nIMPORT DialogBoxParamA, 20\r\n%define DialogBoxParam DialogBoxParamA\r\nIMPORT DispatchMessageA, 4\r\n%define DispatchMessage DispatchMessageA\r\nIMPORT GetMessageA, 16\r\n%define GetMessage GetMessageA\r\nIMPORT LoadIconA, 8\r\n%define LoadIcon LoadIconA\r\nIMPORT MessageBoxA, ptrdiff_t hWnd, ptrdiff_t lpText, ptrdiff_t lpCaption, uint32_t uType\r\n%define MessageBox MessageBoxA\r\nIMPORT PostMessageA, ptrdiff_t hWnd, dword Msg, size_t wParam, size_t lParam\r\n%define PostMessage PostMessageA\r\nIMPORT RegisterClassExA, 4\r\n%define RegisterClassEx RegisterClassExA\r\nIMPORT SendDlgItemMessageA, 20\r\n%define SendDlgItemMessage SendDlgItemMessageA\r\n%ifidni __OUTPUT_FORMAT__,win64\r\nIMPORT wsprintfA\r\n%else\r\nIMPORT cdecl, wsprintfA\r\n%endif\r\n%define wsprintf wsprintfA\r\n\r\n%endif  ;// UNICODE\r\n\r\n%endif  ;// __NASMX_DEMOS_INC__\r\n"
  },
  {
    "path": "bin/open_cmd.bat",
    "content": "cmd.exe"
  },
  {
    "path": "bin/rcheck.bat",
    "content": "@echo off\r\ncd /d %~dp0\r\nrpp.exe example\\run.h %1 -check"
  },
  {
    "path": "bin/rinf/conf.txt",
    "content": "c_export_rbin,\r\n1\r\nc_export_rasm,\r\n0\r\nc_export_rp,\r\n1\r\nc_display_inf,\r\n0\r\nc_warning,\r\n0\r\nc_auto_addinit,\r\n1\r\nc_auto_addfunc,\r\n1\r\nc_auto_import,\r\n1\r\nc_auto_bbk,\r\n1\r\nc_op_empty_func,\r\n1\r\nc_op_nop,\r\n1\r\nc_op_zero,\r\n1\r\nc_op_merge,\r\n1\r\nc_op_ebp,\r\n1\r\nc_op_base_calc,\r\n1\r\nc_op_pass,\r\n1\r\nc_op_const_eval,\r\n1\r\nc_op_match,\r\n1\r\nc_run,\r\n1\r\nc_pause,\r\n0\r\nc_stack_size,\r\n2*1024*1024\r\n"
  },
  {
    "path": "bin/rinf/key.txt",
    "content": "rjit\r\n\r\ncalle\r\ncall\r\nretn\r\nreti\r\n\r\npush\r\npop\r\n\r\njmp\r\njebxz\r\njebxnz\r\n\r\nhalt\r\nnop\r\n\r\nlea\r\nmov\r\nmov1\r\nmov8\r\n\r\nadd\r\nsub\r\nimul\r\nidiv\r\nimod\r\n\r\ncesb\r\ncnesb\r\ncgsb\r\ncgesb\r\nclsb\r\nclesb\r\n\r\nadd8\r\nsub8\r\nimul8\r\nidiv8\r\nimod8\r\ncgsb8\r\nclsb8\r\n\r\n_fadd8\r\n_fsub8\r\n_fmul8\r\n_fdiv8\r\n_fcgsb8\r\n_fclsb8\r\n\r\nband\r\nbor\r\nbnot\r\nbxor\r\nbshl\r\nbshr\r\nbsar\r\n\r\n_udiv\r\n_umod\r\n_ucgsb\r\n_ucgesb\r\n_uclsb\r\n_uclesb\r\n\r\nrn\r\n\r\nrd1\r\nrd2\r\nrd4\r\nrd8\r\nrdp\r\n\r\neip\r\nesp\r\nebp\r\neax\r\nebx\r\necx\r\nedx\r\nesi\r\nedi\r\neflags\r\n\r\nvoid\r\nchar\r\nint\r\nuint\r\nint8\r\ndouble\r\nrp\r\nvar\r\nrbuf\r\nrstr\r\nrcs\r\n\r\nfunction\r\n_js_obj\r\n_js_findf\r\n\r\nif\r\nifn\r\nelse\r\nbreak\r\ncontinue\r\ncontinued\r\nreturn\r\nclass\r\ntemplate\r\nthis\r\nsizeof\r\nmain\r\ninclude\r\nimport\r\nendif\r\nifdef\r\nifndef\r\ndefine\r\nenum\r\nfor\r\nto\r\nin\r\ncase\r\nfriend\r\ncfunc\r\ndynamic\r\nprivate\r\nprotected\r\npublic\r\nswitch\r\ntypename\r\ntypeof\r\ns_ret\r\ns_off\r\ns_param\r\ns_local\r\nmac\r\nexport\r\nlambda\r\nself\r\n_BTEMP\r\n_PCALL\r\n_LAMBDA\r\n_SELF\r\n_RVM\r\n_RVARA\r\n_RVARB\r\n_TEMP\r\n_LAMBDA_C_P\r\n_PMAIN\r\n_PENV\r\n\r\n"
  },
  {
    "path": "bin/rinf/match.txt",
    "content": "sub esp , 4 \n\r\npush @n\r\npush [ @@ + @n ]\r\ncall [ & , int , \"<=(int,int)\" ]\r\nmov ebx , [ esp ]\r\nadd esp , 4\r\n\r\nclesb [ @1 + @2 ] , @0\n\r\n\r\npush @n\r\nlea esi,[@@+@n]\r\npush esi\r\ncall [ & , int , \"=(int&,int)\" ]\r\n\r\nmov [@1+@2],@0\r\n\r\npush [@@+@n]\r\nlea esi,[@@+@n]\r\npush esi\r\ncall [ & , int , \"+=(int&,int)\" ]\r\n\r\nadd [@2+@3],[@0+@1]\r\n\r\nlea esi,[@@+@n]\r\npush esi\r\ncall [ & , int , \"++(int&)\"]\r\n\r\nadd [@0+@1],1\r\n\r\npush [ @@ + @n ] \r\npush [ @@ + @n ] \r\ncall [ & , int , \"+(int,int)\" ]\r\n\r\nmov [esp],[@2+@3]\r\nadd [esp],[@0+@1]\r\n"
  },
  {
    "path": "bin/rjit.bat",
    "content": "@echo off\r\nrem cd /d %~dp0\r\n%~dp0\\rpp.exe -jit %1"
  },
  {
    "path": "bin/rjit_win.bat",
    "content": "@echo off\r\ncd /d %~dp0\r\nrpp_win.exe -jit %1"
  },
  {
    "path": "bin/rpack.bat",
    "content": "@echo off\r\ncd /d %~dp0\r\nrpp.exe -pack %1"
  },
  {
    "path": "bin/rpack_win.bat",
    "content": "@echo off\r\ncd /d %~dp0\r\nrpp_win.exe -pack %1"
  },
  {
    "path": "bin/rsrc/carray.h",
    "content": "﻿\r\nclass carray<T,N>\r\n{\r\n\tT m_buf[N]\r\n\t\r\n\tcarray<T,N>()\r\n\t{\r\n\t}\r\n\t\r\n\tcarray<T,N>(carray<T,N>& v)\r\n\t{\r\n\t\tthis=v\r\n\t}\r\n\r\n\tT& [](int num)\r\n\t{\r\n\t\treturn (&m_buf)[num]\r\n\t}\r\n\t\r\n\tvoid =(carray<T,N>& v)\r\n\t{\r\n\t\tfor i=0;i<N;i++\r\n\t\t\tthis[i]=v[i]\r\n\t}\r\n\t\r\n\tvoid =(rbuf<T>& v)\r\n\t{\r\n\t\tfor i=0;i<N;i++\r\n\t\t\tthis[i]=v[i]\r\n\t}\r\n\t\r\n\tint count()\r\n\t{\r\n\t\treturn N\r\n\t}\r\n\t\r\n\tT* begin()\r\n\t{\r\n\t\treturn &m_buf\r\n\t}\r\n}"
  },
  {
    "path": "bin/rsrc/eval.h",
    "content": "﻿\r\nimport rpp.h\r\n\r\nbool evalue(rstr s)\r\n{\r\n\treturn eval(s,get_up_func,get_up_ebp)\r\n}\r\n\r\nbool eval(rstr s,tfunc* ptfi=null,int vebp=0)\r\n{\r\n\treturn eval_in(s.cstr,ptfi,vebp)\r\n}\r\n\r\nbool eval_in(char* s,tfunc* ptfi,int vebp)\r\n{\r\n\tpush vebp\r\n\tpush ptfi\r\n\tpush s\r\n\tcalle \"eval\"\r\n\tmov s_ret,eax\r\n\tadd esp,12\r\n}\r\n\r\nbool eval_vstr(rbuf<rstr>* vstr,tfunc* ptfi,int vebp)\r\n{\r\n\tpush vebp\r\n\tpush ptfi\r\n\tpush vstr\r\n\tcalle \"eval_vstr\"\r\n\tmov s_ret,eax\r\n\tadd esp,12\r\n}\r\n\r\ndefine get_up_func get_up_func_in(ebp,sizeof(s_local))\r\ndefine get_cur_ebp ebp\r\ndefine get_up_ebp (*ebp.to<int*>)\r\n\r\ntfunc* get_up_func_in(int v_ebp,int local_size)\r\n{\r\n\treturn get_cur_func_in(*(v_ebp+local_size+4).to<int*>);\r\n}\r\n\r\ntfunc* get_cur_func()\r\n{\r\n\tmov ecx,[ebp+4]\r\n\treturn get_cur_func_in(ecx)\r\n}\r\n\r\ntfunc* get_cur_func_in(int pasm)\r\n{\r\n\tpush pasm\r\n\tcalle \"get_cur_func\"\r\n\tmov s_ret,eax\r\n\tadd esp,4\r\n}\r\n\r\ndynamic bool and(rbuf<rbuf<rstr>>* p,tfunc* ptfi,int vebp)\r\n{\r\n\tfor i=0;i<p->count;i++\r\n\t\trbuf<rstr> v\r\n\t\tv.push('return')\r\n\t\tv+=(*p)[i]\r\n\t\tifn eval_vstr(&v,ptfi,vebp)\r\n\t\t\treturn false\r\n\treturn true\r\n}\r\n\r\ndynamic bool or(rbuf<rbuf<rstr>>* p,tfunc* ptfi,int vebp)\r\n{\r\n\tfor i=0;i<p->count;i++\r\n\t\trbuf<rstr> v\r\n\t\tv.push('return')\r\n\t\tv+=(*p)[i]\r\n\t\tif eval_vstr(&v,ptfi,vebp)\r\n\t\t\treturn true\r\n\treturn false\r\n}"
  },
  {
    "path": "bin/rsrc/int8_n.h",
    "content": "﻿\r\nclass int8\r\n{\r\n\trd8 m_in;\r\n\r\n\t~int8()\r\n\t{\r\n\t}\r\n\r\n\tint8()\r\n\t{\r\n\t}\r\n\r\n\tfriend int8 operator*(int8 a,int8 b)\r\n\t{\r\n\t\tmov eax,[ebp+(s_off b+4)]\r\n\t\tpush eax\r\n\t\tmov ecx,b\r\n\t\tpush ecx\r\n\t\tmov edx,[ebp+(s_off a+4)]\r\n\t\tpush edx\r\n\t\tmov eax,a\r\n\t\tpush eax\r\n\t\trn call long_mul\r\n\t\tmov s_ret,eax\r\n\t\tmov [ebp+(s_off s_ret+4)],edx\r\n\t\tpop ebp\r\n\t\treti 16\r\nlong_mul:\r\n\t\tmov eax,[esp+8]\r\n\t\tmov ecx,[esp+0x10]\r\n\t\trn or ecx,eax  \r\n\t\tmov ecx,[esp+0xc]\r\n\t\trn jne hard\r\n\t\tmov eax,[esp+4]\r\n\t\trn db 0xf7,0xe1//mul eax,ecx\r\n\t\treti 0x10\r\nhard:\r\n\t\tpush ebx\r\n\t\trn db 0xf7,0xe1//mul eax,ecx\r\n\t\tmov ebx,eax\r\n\t\tmov eax,[esp+8]\r\n\t\trn db 0xf7,0x64,0x24,0x14//mul eax,[esp+0x14]\r\n\t\tadd ebx,eax\r\n\t\tmov eax,[esp+8]\r\n\t\trn db 0xf7,0xe1//mul eax,ecx\r\n\t\tadd edx,ebx\r\n\t\tpop ebx\r\n\t\treti 0x10\r\n\t}\r\n\r\n\tfriend int8 operator/(int8 a,int8 b)\r\n\t{\r\n\t\tmov eax,[ebp+(s_off b+4)]\r\n\t\tpush eax\r\n\t\tmov ecx,b\r\n\t\tpush ecx\r\n\t\tmov edx,[ebp+(s_off a+4)]\r\n\t\tpush edx\r\n\t\tmov eax,a\r\n\t\tpush eax\r\n\t\trn call long_div\r\n\t\tmov s_ret,eax\r\n\t\tmov [ebp+(s_off s_ret+4)],edx\r\n\t\tpop ebp\r\n\t\treti 16\r\nlong_div:\r\n\t\tpush edi\r\n\t\tpush esi\r\n\t\tpush ebx\r\n\t\trn xor edi,edi\r\n\t\tmov eax,[esp+0x14]\r\n\t\trn or eax,eax \r\n\t\trn jge L1\r\n\t\trn inc edi \r\n\t\tmov edx,[esp+0x10] \r\n\t\trn neg eax \r\n\t\trn neg edx \r\n\t\trn sbb eax,0 \r\n\t\tmov [esp+0x14],eax \r\n\t\tmov [esp+0x10],edx \r\nL1:\r\n\t\tmov eax,[esp+0x1c] \r\n\t\trn or eax,eax \r\n\t\trn jge L2\r\n\t\trn inc edi \r\n\t\tmov edx,[esp+0x18] \r\n\t\trn neg eax \r\n\t\trn neg edx \r\n\t\trn sbb eax,0 \r\n\t\tmov [esp+0x1c],eax \r\n\t\tmov [esp+0x18],edx \r\nL2:\r\n\t\trn or eax,eax \r\n\t\trn jne L3\r\n\t\tmov ecx,[esp+0x18] \r\n\t\tmov eax,[esp+0x14] \r\n\t\trn xor edx,edx \r\n\t\trn db 0xf7,0xf1//div eax,ecx \r\n\t\tmov ebx,eax \r\n\t\tmov eax,[esp+0x10] \r\n\t\trn db 0xf7,0xf1//div eax,ecx \r\n\t\tmov edx,ebx \r\n\t\tjmp L4\r\nL3:\r\n\t\tmov ebx,eax \r\n\t\tmov ecx,[esp+0x18] \r\n\t\tmov edx,[esp+0x14] \r\n\t\tmov eax,[esp+0x10] \r\nL5:\r\n\t\trn shr ebx,1 \r\n\t\trn rcr ecx,1 \r\n\t\trn shr edx,1 \r\n\t\trn rcr eax,1 \r\n\t\trn or ebx,ebx \r\n\t\trn jne L5\r\n\t\trn db 0xf7,0xf1//div eax,ecx \r\n\t\tmov esi,eax \r\n\t\trn db 0xf7,0x64,0x24,0x1c//mul eax,[esp+0x1c]\r\n\t\tmov ecx,eax \r\n\t\tmov eax,[esp+0x18] \r\n\t\trn db 0xf7,0xe6//mul eax,esi \r\n\t\tadd edx,ecx \r\n\t\trn jb L6\r\n\t\trn cmp edx,[esp+0x14] \r\n\t\trn ja L6\r\n\t\trn jb L7\r\n\t\trn cmp eax,[esp+0x10] \r\n\t\trn jbe L7\r\nL6:\r\n\t\trn dec esi \r\nL7:\r\n\t\trn xor edx,edx \r\n\t\tmov eax,esi \r\nL4:\r\n\t\trn dec edi \r\n\t\trn jne L8\r\n\t\trn neg edx \r\n\t\trn neg eax \r\n\t\trn sbb edx,0 \r\nL8:\r\n\t\tpop ebx \r\n\t\tpop esi\r\n\t\tpop edi\r\n\t\treti 16  \r\n\t}\r\n\t\r\n\tfriend bool operator<(int8 a,int8 b)\r\n\t{\r\n\t\tmov eax,[ebp+(s_off a+4)]\r\n\t\trn cmp eax,[ebp+(s_off b+4)]\r\n\t\trn jg tag_zero\r\n\t\trn jl tag_one\r\n\t\tmov ecx,a \r\n\t\trn cmp ecx,b \r\n\t\trn jae tag_zero\r\ntag_one:\r\n\t\tmov s_ret,1  \r\n\t\treturn  \r\ntag_zero:\r\n\t\tmov s_ret,0\r\n\t}\r\n\r\n\tint8(int8 a)\r\n\t{\r\n\t\tmov esi,this\r\n\t\tmov [esi],[ebp+s_off a]\r\n\t\tmov [esi+4],[ebp+(s_off a+4)]\r\n\t}\r\n\r\n\tint8(int8& a)\r\n\t{\r\n\t\tmov edi,this\r\n\t\tmov esi,a\r\n\t\tmov [edi],[esi]\r\n\t\tmov [edi+4],[esi+4]\r\n\t}\r\n\r\n\tint8(int a)\r\n\t{\r\n\t\tmov esi,this\r\n\t\tmov [esi],a\r\n\t\tmov [esi+4],0\r\n\t\tmov edi,a\r\n\t\tif(a<0)\r\n\t\t{\r\n\t\t\tmov esi,this\r\n\t\t\tmov [esi+4],uint::c_max\r\n\t\t}\r\n\t}\r\n\r\n\tint8(uint a)\r\n\t{\r\n\t\tmov esi,this\r\n\t\tmov [esi],a\r\n\t\tmov [esi+4],0\r\n\t}\r\n\r\n\tint toint()\r\n\t{\r\n\t\tmov esi,this\r\n\t\tmov s_ret,[esi]\r\n\t}\r\n\r\n\trstr torstr()\r\n\t{\r\n\t\trstr ret(this)\r\n\t\treturn ret\r\n\t}\r\n\r\n\toperator=(int8 a)\r\n\t{\r\n\t\tmov esi,this\r\n\t\tmov [esi],[ebp+s_off a]\r\n\t\tmov [esi+4],[ebp+(s_off a+4)]\r\n\t}\r\n\r\n\toperator=(int8& a)\r\n\t{\r\n\t\tmov edi,this\r\n\t\tmov esi,a\r\n\t\tmov [edi],[esi]\r\n\t\tmov [edi+4],[esi+4]\r\n\t}\r\n\r\n\tfriend operator<->(int8& a,int8& b)\r\n\t{\r\n\t\tc=a\r\n\t\ta=b\r\n\t\tb=c\r\n\t}\r\n\r\n\toperator+=(int8 a)\r\n\t{\r\n\t\tmov esi,this\r\n\t\tmov eax,[esi]\r\n\t\tadd eax,a\r\n\t\tmov ecx,[esi+4]\r\n\t\trn adc ecx,[ebp+(s_off a+4)]\r\n\t\tmov [esi],eax\r\n\t\tmov [esi+4],ecx\r\n\t}\r\n\r\n\toperator-=(int8 a)\r\n\t{\r\n\t\tmov esi,this\r\n\t\tmov eax,[esi]\r\n\t\tsub eax,a\r\n\t\tmov ecx,[esi+4]\r\n\t\trn sbb ecx,[ebp+(s_off a+4)]\r\n\t\tmov [esi],eax\r\n\t\tmov [esi+4],ecx\r\n\t}\r\n\r\n\toperator*=(int8 a)\r\n\t{\r\n\t\tthis=this*a\r\n\t}\r\n\t\r\n\toperator/=(int8 a)\r\n\t{\r\n\t\tthis=this/a\r\n\t}\r\n\t\r\n\toperator%=(int8 a)\r\n\t{\r\n\t\tthis=this%a\r\n\t}\r\n\r\n\toperator++()\r\n\t{\r\n\t\tthis+=1\r\n\t}\r\n\r\n\toperator--()\r\n\t{\r\n\t\tthis-=1\r\n\t}\r\n\r\n\tfriend int8 operator+(int8 a,int8 b) \r\n\t{\r\n\t\ta+=b\r\n\t\treturn a\r\n\t}\r\n\r\n\tfriend int8 operator-(int8 a,int8 b)\r\n\t{\r\n\t\ta-=b\r\n\t\treturn a\r\n\t}\r\n\t\r\n\t//todo\r\n\tfriend int8 operator%(int8 a,int8 b)\r\n\t{\r\n\t\treturn a-a/b*b\r\n\t}\r\n\r\n\tfriend bool operator<=(int8 a,int8 b)\r\n\t{\r\n\t\treturn a<b||a==b;\r\n\t}\r\n\r\n\tfriend bool operator==(int8 a,int8 b)\r\n\t{\r\n\t\tcesb a,b\r\n\t\tif(ebx)\r\n\t\t{\r\n\t\t\tcesb [ebp+(s_off a+4)],[ebp+(s_off b+4)]\r\n\t\t}\r\n\t\tmov s_ret,ebx\r\n\t}\r\n\r\n\tfriend bool operator!=(int8 a,int8 b)\r\n\t{\r\n\t\treturn !(a==b)\r\n\t}\r\n\r\n\tfriend bool operator>(int8 a,int8 b)\r\n\t{\r\n\t\treturn b<a;\r\n\t}\r\n\r\n\tfriend bool operator>=(int8 a,int8 b)\r\n\t{\r\n\t\treturn b<=a;\r\n\t}\r\n\t\r\n\tfriend int8 operator neg(int8 a)\r\n\t{\r\n\t\treturn 0-a;\r\n\t}\r\n\r\n\tclear()\r\n\t{\r\n\t\tthis=0\r\n\t}\r\n\r\n\tbool empty()\r\n\t{\r\n\t\treturn 0==this\r\n\t}\r\n\r\n\tprint()\r\n\t{\r\n\t\trf.print this\r\n\t}\r\n\r\n\tprintl()\r\n\t{\r\n\t\trf.printl this\r\n\t}\r\n};"
  },
  {
    "path": "bin/rsrc/math.h",
    "content": "﻿\r\nnamespace math\r\n{\r\n\tdouble sin(double a)\r\n\t{\r\n\t\tp=&s_ret\r\n\t\tpush p\r\n\t\tpush [ebp+(s_off a+4)]\r\n\t\tpush a\r\n\t\tcalle \"sin\"\r\n\t\tadd esp,12\r\n\t}\r\n\t\r\n\tdouble cos(double a)\r\n\t{\r\n\t\tp=&s_ret\r\n\t\tpush p\r\n\t\tpush [ebp+(s_off a+4)]\r\n\t\tpush a\r\n\t\tcalle \"cos\"\r\n\t\tadd esp,12\r\n\t}\r\n\t\r\n\tdouble sqrt(double a)\r\n\t{\r\n\t\tp=&s_ret\r\n\t\tpush p\r\n\t\tpush [ebp+(s_off a+4)]\r\n\t\tpush a\r\n\t\tcalle \"sqrt\"\r\n\t\tadd esp,12\r\n\t}\r\n}"
  },
  {
    "path": "bin/rsrc/rcc.h",
    "content": "﻿class xpoint\r\n{\r\n\tdouble x\r\n\tdouble y\r\n}\r\n\r\nnamespace cc\r\n{\r\n\tenum\r\n\t{\r\n\t\tc_cc_set_effect_volume=1000,\r\n\t\tc_cc_set_music_volume,\r\n\t\tc_cc_play_effect,\r\n\t\tc_cc_play_music,\r\n\t\t\r\n\t\tc_cc_add_animations,\r\n\t\tc_cc_get_animation,\r\n\t\tc_cc_animate_create,\r\n\t\t\r\n\t\tc_cc_get_key,\r\n\t\tc_cc_set_key,\r\n\t\tc_cc_add_cache,\r\n\t\tc_cc_rand,\r\n\t\tc_cc_set_design_size,\r\n\t\tc_cc_set_display_state,\r\n\t\tc_cc_jump_scene,\r\n\t\tc_cc_touch_call,\r\n\t\t\r\n\t\tc_cc_sprite_create,\r\n\t\tc_cc_bmf_create,\r\n\t\tc_cc_bmf_set,\r\n\t\tc_cc_get_size,\r\n\t\tc_cc_set_tag,\r\n\t\tc_cc_get_tag,\r\n\t\tc_cc_add_child,\r\n\t\tc_cc_remove_from_parent,\r\n\t\tc_cc_set_pos,\r\n\t\tc_cc_get_pos,\r\n\t\tc_cc_set_scale,\r\n\t\tc_cc_run_ac,\r\n\t\tc_cc_stop_ac,\r\n\t\tc_cc_schedule,\r\n\r\n\t\tc_cc_ac_move_to,\r\n\t\tc_cc_ac_move_by,\r\n\t\tc_cc_ac_rotate_to,\r\n\t\tc_cc_ac_rotate_by,\r\n\t\tc_cc_ac_scale_to,\r\n\t\tc_cc_ac_scale_by,\r\n\t\tc_cc_ac_delay,\r\n\t\tc_cc_ac_repeat,\r\n\t\tc_cc_ac_repeat_times,\r\n\t\tc_cc_ac_sequence,\r\n\t\tc_cc_ac_spawn,\r\n\t\tc_cc_ac_call,\r\n\t\tc_cc_ac_ease_in,\r\n\t\tc_cc_ac_ease_out,\r\n\t\tc_cc_ac_elastic_in,\r\n\t\tc_cc_ac_elastic_out,\r\n\r\n\t\tc_cc_phy_apply_impulse,\r\n\t\tc_cc_phy_get_body,\r\n\t\tc_cc_phy_set_body,\r\n\t\tc_cc_phy_box,\r\n\t\tc_cc_phy_box_edge,\r\n\t\tc_cc_phy_call,\r\n\t\t\r\n\t\tc_cc_label_create,\r\n\t\tc_cc_set_color,\r\n\t}\r\n\r\n\tset_effect_volume(double val)\r\n\t{\r\n\t\tsub esp,8\r\n\t\tmov8 [esp],val\r\n\t\tcalle c_cc_set_effect_volume\r\n\t}\r\n\r\n\tset_music_volume(double val)\r\n\t{\r\n\t\tsub esp,8\r\n\t\tmov8 [esp],val\r\n\t\tcalle c_cc_set_music_volume\r\n\t}\r\n\r\n\tplay_effect(char* name)\r\n\t{\r\n\t\tpush name\r\n\t\tcalle c_cc_play_effect\r\n\t}\r\n\r\n\tplay_effect(rstr name)\r\n\t{\r\n\t\tplay_effect(name.cstr)\r\n\t}\r\n\r\n\tplay_music(char* name)\r\n\t{\r\n\t\tpush name\r\n\t\tcalle c_cc_play_music\r\n\t}\r\n\r\n\tplay_music(rstr name)\r\n\t{\r\n\t\tplay_music(name.cstr)\r\n\t}\r\n\t\r\n\tadd_animations(char* file)\r\n\t{\r\n\t\tpush file\r\n\t\tcalle c_cc_add_animations\r\n\t}\r\n\t\r\n\tadd_animations(rstr file)\r\n\t{\r\n\t\tadd_animations(file.cstr)\r\n\t}\r\n\t\r\n\tvoid* get_animation(char* name)\r\n\t{\r\n\t\tsub esp,4\r\n\t\tpush name\r\n\t\tcalle c_cc_get_animation\r\n\t\tmov s_ret,[esp]\r\n\t\tadd esp,4\r\n\t}\r\n\t\r\n\tvoid* get_animation(rstr name)\r\n\t{\r\n\t\treturn get_animation(name.cstr)\r\n\t}\r\n\t\r\n\tvoid* animate_create(void* animation)\r\n\t{\r\n\t\tsub esp,4\r\n\t\tpush animation\r\n\t\tcalle c_cc_animate_create\r\n\t\tmov s_ret,[esp]\r\n\t\tadd esp,4\r\n\t}\r\n\r\n\trstr get_key(char* name)\r\n\t{\r\n\t\trbuf<char> buf(1024)\r\n\t\tvoid* begin=buf.begin\r\n\t\tpush begin\r\n\t\tpush name\r\n\t\tcalle c_cc_get_key\r\n\t\treturn rstr(begin)\r\n\t}\r\n\t\r\n\trstr get_key(rstr name)\r\n\t{\r\n\t\treturn get_key(name.cstr)\r\n\t}\r\n\t\r\n\tset_key(char* name,char* str)\r\n\t{\r\n\t\tpush str\r\n\t\tpush name\r\n\t\tcalle c_cc_set_key\r\n\t}\r\n\r\n\tset_key(rstr name,rstr str)\r\n\t{\r\n\t\tset_key(name.cstr,str.cstr)\r\n\t}\r\n\t\r\n\tadd_cache(char* name)\r\n\t{\r\n\t\tpush name\r\n\t\tcalle c_cc_add_cache\r\n\t}\r\n\t\r\n\tadd_cache(rstr name)\r\n\t{\r\n\t\tadd_cache(name.cstr)\r\n\t}\r\n\t\r\n\tint rand(int n)\r\n\t{\r\n\t\tsub esp,4\r\n\t\tpush n\r\n\t\tcalle c_cc_rand\r\n\t\tmov s_ret,[esp]\r\n\t\tadd esp,4\r\n\t}\r\n\t\r\n\tset_design_size(double width,double height)\r\n\t{\r\n\t\tsub esp,8\r\n\t\tmov8 [esp],height\r\n\t\tsub esp,8\r\n\t\tmov8 [esp],width\r\n\t\tcalle c_cc_set_design_size\r\n\t}\r\n\t\r\n\tset_display_state(bool b)\r\n\t{\r\n\t\tpush b\r\n\t\tcalle c_cc_set_display_state\r\n\t}\r\n\r\n\tjump_scene(void* scene)\r\n\t{\r\n\t\tpush scene\r\n\t\tcalle c_cc_jump_scene\r\n\t}\r\n\t\r\n\ttouch_call(void* node,void* call_back)\r\n\t{\r\n\t\tpush call_back\r\n\t\tpush node\r\n\t\tcalle c_cc_touch_call\r\n\t}\r\n\r\n\tvoid* sprite_create(char* name)\r\n\t{\r\n\t\tsub esp,4\r\n\t\tpush name\r\n\t\tcalle c_cc_sprite_create\r\n\t\tmov s_ret,[esp]\r\n\t\tadd esp,4\r\n\t}\r\n\t\r\n\tvoid* sprite_create(rstr name)\r\n\t{\r\n\t\treturn sprite_create(name.cstr)\r\n\t}\r\n\r\n\tvoid* bmf_create(char* name,char* str)\r\n\t{\r\n\t\tsub esp,4\r\n\t\tpush str\r\n\t\tpush name\r\n\t\tcalle c_cc_bmf_create\r\n\t\tmov s_ret,[esp]\r\n\t\tadd esp,4\r\n\t}\r\n\r\n\tvoid* bmf_create(rstr name,rstr str)\r\n\t{\r\n\t\treturn bmf_create(name.cstr,str.cstr)\r\n\t}\r\n\r\n\tbmf_set(void* bmf,char* str)\r\n\t{\r\n\t\tpush str\r\n\t\tpush bmf\r\n\t\tcalle c_cc_bmf_set\r\n\t}\r\n\r\n\tbmf_set(void* bmf,rstr str)\r\n\t{\r\n\t\tbmf_set(bmf,str.cstr)\r\n\t}\r\n\t\r\n\txpoint get_size(void* sprite)\r\n\t{\r\n\t\tsub esp,16\r\n\t\tpush sprite\r\n\t\tcalle c_cc_get_size\r\n\t\tmov8 s_ret,[esp]\r\n\t\tmov8 [ebp+(s_off s_ret+8)],[esp+8]\r\n\t\tadd esp,16\r\n\t}\r\n\t\r\n\tset_tag(void* node,int tag)\r\n\t{\r\n\t\tpush tag\r\n\t\tpush node\r\n\t\tcalle c_cc_set_tag\r\n\t}\r\n\t\r\n\tint get_tag(void* node)\r\n\t{\r\n\t\tsub esp,4\r\n\t\tpush node\r\n\t\tcalle c_cc_get_tag\r\n\t\tmov s_ret,[esp]\r\n\t\tadd esp,4\r\n\t}\r\n\t\r\n\tadd_child(void* parent,void* node,int z)\r\n\t{\r\n\t\tpush z\r\n\t\tpush node\r\n\t\tpush parent\r\n\t\tcalle c_cc_add_child\r\n\t}\r\n\t\r\n\tremove_from_parent(void* node)\r\n\t{\r\n\t\tpush node\r\n\t\tcalle c_cc_remove_from_parent\r\n\t}\r\n\t\r\n\tadd_child(void* parent,void* node)\r\n\t{\r\n\t\tadd_child(parent,node,0)\r\n\t}\r\n\t\r\n\tset_pos(void* node,double x,double y)\r\n\t{\r\n\t\tsub esp,8\r\n\t\tmov8 [esp],y\r\n\t\tsub esp,8\r\n\t\tmov8 [esp],x\r\n\t\tpush node\r\n\t\tcalle c_cc_set_pos\r\n\t}\r\n\r\n\tset_pos(void* node,xpoint pt)\r\n\t{\r\n\t\tset_pos(node,pt.x,pt.y)\r\n\t}\r\n\t\r\n\txpoint get_pos(void* node)\r\n\t{\r\n\t\tsub esp,16\r\n\t\tpush node\r\n\t\tcalle c_cc_get_pos\r\n\t\tmov8 s_ret,[esp]\r\n\t\tmov8 [ebp+(s_off s_ret+8)],[esp+8]\r\n\t\tadd esp,16\r\n\t}\r\n\r\n\tset_scale(void* node,double x,double y)\r\n\t{\r\n\t\tsub esp,8\r\n\t\tmov8 [esp],y\r\n\t\tsub esp,8\r\n\t\tmov8 [esp],x\r\n\t\tpush node\r\n\t\tcalle c_cc_set_scale\r\n\t}\r\n\r\n\tset_scale(void* node,double scale)\r\n\t{\r\n\t\tset_scale(node,scale,scale)\r\n\t}\r\n\r\n\trun_ac(void* node,void* action)\r\n\t{\r\n\t\tpush action\r\n\t\tpush node \r\n\t\tcalle c_cc_run_ac\r\n\t}\r\n\t\r\n\tstop_ac(void* node)\r\n\t{\r\n\t\tpush node\r\n\t\tcalle c_cc_stop_ac\r\n\t}\r\n\t\r\n\tschedule(void* node,double time)\r\n\t{\r\n\t\tsub esp,8\r\n\t\tmov8 [esp],time\r\n\t\tpush node\r\n\t\tcalle c_cc_schedule\r\n\t}\r\n\t\r\n\tbool rect_hit(void* a,void* b)\r\n\t{\r\n\t\tx1=cc.get_pos(a).x-cc.get_size(a).x/2.0\r\n\t\tx2=cc.get_pos(a).x+cc.get_size(a).x/2.0\r\n\t\tx3=cc.get_pos(b).x-cc.get_size(b).x/2.0\r\n\t\tx4=cc.get_pos(b).x+cc.get_size(b).x/2.0\r\n\t\r\n\t\ty1=cc.get_pos(a).y-cc.get_size(a).y/2.0\r\n\t\ty2=cc.get_pos(a).y+cc.get_size(a).y/2.0\r\n\t\ty3=cc.get_pos(b).y-cc.get_size(b).y/2.0\r\n\t\ty4=cc.get_pos(b).y+cc.get_size(b).y/2.0\r\n\t\t\r\n\t\treturn rect_hit(x1,x2,x3,x4)&&rect_hit(y1,y2,y3,y4)\r\n\t}\r\n\t\r\n\tbool rect_hit(double a,double b,double c,double d)\r\n\t{\r\n\t\treturn b>c&&a<d\r\n\t}\r\n\t\r\n\tvoid* label_create(char* str)\r\n\t{\r\n\t\treturn label_create(str,\"SimSun\",30)\r\n\t}\r\n\t\r\n\tvoid* label_create(char* str,char* font,int size)\r\n\t{\r\n\t\tsub esp,4\r\n\t\tpush size\r\n\t\tpush font\r\n\t\tpush str\r\n\t\tcalle c_cc_label_create\r\n\t\tmov s_ret,[esp]\r\n\t\tadd esp,4\r\n\t}\r\n\t\r\n\tvoid set_color(void* node,int r,int g,int b)\r\n\t{\r\n\t\tpush b\r\n\t\tpush g\r\n\t\tpush r\r\n\t\tpush node\r\n\t\tcalle c_cc_set_color\r\n\t}\r\n}\r\n\r\nnamespace cca\r\n{\r\n\tvoid* move_to(double time,double x,double y)\r\n\t{\r\n\t\tsub esp,4\r\n\t\tsub esp,8\r\n\t\tmov8 [esp],y\r\n\t\tsub esp,8\r\n\t\tmov8 [esp],x\r\n\t\tsub esp,8\r\n\t\tmov8 [esp],time\r\n\t\tcalle cc.c_cc_ac_move_to\r\n\t\tmov s_ret,[esp]\r\n\t\tadd esp,4\r\n\t}\r\n\t\r\n\tvoid* move_by(double time,double x,double y)\r\n\t{\r\n\t\tsub esp,4\r\n\t\tsub esp,8\r\n\t\tmov8 [esp],y\r\n\t\tsub esp,8\r\n\t\tmov8 [esp],x\r\n\t\tsub esp,8\r\n\t\tmov8 [esp],time\r\n\t\tcalle cc.c_cc_ac_move_by\r\n\t\tmov s_ret,[esp]\r\n\t\tadd esp,4\r\n\t}\r\n\t\r\n\tvoid* rotate_to(double time,double angle)\r\n\t{\r\n\t\tsub esp,4\r\n\t\tsub esp,8\r\n\t\tmov8 [esp],angle\r\n\t\tsub esp,8\r\n\t\tmov8 [esp],time\r\n\t\tcalle cc.c_cc_ac_rotate_to\r\n\t\tmov s_ret,[esp]\r\n\t\tadd esp,4\r\n\t}\r\n\t\r\n\tvoid* rotate_by(double time,double angle)\r\n\t{\r\n\t\tsub esp,4\r\n\t\tsub esp,8\r\n\t\tmov8 [esp],angle\r\n\t\tsub esp,8\r\n\t\tmov8 [esp],time\r\n\t\tcalle cc.c_cc_ac_rotate_by\r\n\t\tmov s_ret,[esp]\r\n\t\tadd esp,4\r\n\t}\r\n\r\n\tvoid* scale_to(double time,double x,double y)\r\n\t{\r\n\t\tsub esp,4\r\n\t\tsub esp,8\r\n\t\tmov8 [esp],y\r\n\t\tsub esp,8\r\n\t\tmov8 [esp],x\r\n\t\tsub esp,8\r\n\t\tmov8 [esp],time\r\n\t\tcalle cc.c_cc_ac_scale_to\r\n\t\tmov s_ret,[esp]\r\n\t\tadd esp,4\r\n\t}\r\n\r\n\tvoid* scale_by(double time,double x,double y)\r\n\t{\r\n\t\tsub esp,4\r\n\t\tsub esp,8\r\n\t\tmov8 [esp],y\r\n\t\tsub esp,8\r\n\t\tmov8 [esp],x\r\n\t\tsub esp,8\r\n\t\tmov8 [esp],time\r\n\t\tcalle cc.c_cc_ac_scale_by\r\n\t\tmov s_ret,[esp]\r\n\t\tadd esp,4\r\n\t}\r\n\t\r\n\tvoid* delay(double time)\r\n\t{\r\n\t\tsub esp,4\r\n\t\tsub esp,8\r\n\t\tmov8 [esp],time\r\n\t\tcalle cc.c_cc_ac_delay\r\n\t\tmov s_ret,[esp]\r\n\t\tadd esp,4\r\n\t}\r\n\t\r\n\tvoid* repeat(void* action)\r\n\t{\r\n\t\tsub esp,4\r\n\t\tpush action\r\n\t\tcalle cc.c_cc_ac_repeat\r\n\t\tmov s_ret,[esp]\r\n\t\tadd esp,4\r\n\t}\r\n\t\r\n\tvoid* repeat_times(void* action,int times)\r\n\t{\r\n\t\tsub esp,4\r\n\t\tpush times\r\n\t\tpush action\r\n\t\tcalle cc.c_cc_ac_repeat_times\r\n\t\tmov s_ret,[esp]\r\n\t\tadd esp,4\r\n\t}\r\n\t\r\n\tvoid* sequence(void* a,void* b)\r\n\t{\r\n\t\tsub esp,4\r\n\t\tpush b\r\n\t\tpush a\r\n\t\tpush 2\r\n\t\tcalle cc.c_cc_ac_sequence\r\n\t\tmov s_ret,[esp]\r\n\t\tadd esp,4\r\n\t}\r\n\t\r\n\tvoid* sequence(void* a,void* b,void* c)\r\n\t{\r\n\t\tsub esp,4\r\n\t\tpush c\r\n\t\tpush b\r\n\t\tpush a\r\n\t\tpush 3\r\n\t\tcalle cc.c_cc_ac_sequence\r\n\t\tmov s_ret,[esp]\r\n\t\tadd esp,4\r\n\t}\r\n\t\r\n\tvoid* spawn(void* a,void* b)\r\n\t{\r\n\t\tsub esp,4\r\n\t\tpush b\r\n\t\tpush a\r\n\t\tpush 2\r\n\t\tcalle cc.c_cc_ac_spawn\r\n\t\tmov s_ret,[esp]\r\n\t\tadd esp,4\r\n\t}\r\n\t\r\n\tvoid* call_func(void* call_back)\r\n\t{\r\n\t\tsub esp,4\r\n\t\tpush call_back\r\n\t\tcalle cc.c_cc_ac_call\r\n\t\tmov s_ret,[esp]\r\n\t\tadd esp,4\r\n\t}\r\n\t\r\n\tvoid* schedule(double time,void* call_back)\r\n\t{\r\n\t\treturn repeat(sequence(delay(time),call_func(call_back)));\r\n\t}\r\n\r\n\tvoid* ease_in(void* action,double rate)\r\n\t{\r\n\t\tsub esp,4\r\n\t\tsub esp,8\r\n\t\tmov8 [esp],rate\r\n\t\tpush action\r\n\t\tcalle cc.c_cc_ac_ease_in\r\n\t\tmov s_ret,[esp]\r\n\t\tadd esp,4\r\n\t}\r\n\r\n\tvoid* ease_out(void* action,double rate)\r\n\t{\r\n\t\tsub esp,4\r\n\t\tsub esp,8\r\n\t\tmov8 [esp],rate\r\n\t\tpush action\r\n\t\tcalle cc.c_cc_ac_ease_out\r\n\t\tmov s_ret,[esp]\r\n\t\tadd esp,4\r\n\t}\r\n\r\n\tvoid* elastic_in(void* action,double rate)\r\n\t{\r\n\t\tsub esp,4\r\n\t\tsub esp,8\r\n\t\tmov8 [esp],rate\r\n\t\tpush action\r\n\t\tcalle cc.c_cc_ac_elastic_in\r\n\t\tmov s_ret,[esp]\r\n\t\tadd esp,4\r\n\t}\r\n\r\n\tvoid* elastic_out(void* action,double rate)\r\n\t{\r\n\t\tsub esp,4\r\n\t\tsub esp,8\r\n\t\tmov8 [esp],rate\r\n\t\tpush action\r\n\t\tcalle cc.c_cc_ac_elastic_out\r\n\t\tmov s_ret,[esp]\r\n\t\tadd esp,4\r\n\t}\r\n}\r\n\r\nnamespace ccp\r\n{\r\n\tapply_impulse(void* sprite,double x,double y)\r\n\t{\r\n\t\tsub esp,8\r\n\t\tmov8 [esp],y\r\n\t\tsub esp,8\r\n\t\tmov8 [esp],x\r\n\t\tpush sprite\r\n\t\tcalle cc.c_cc_phy_apply_impulse\r\n\t}\r\n\t\r\n\tvoid* get_body(void* sprite)\r\n\t{\r\n\t\tsub esp,4\r\n\t\tpush sprite\r\n\t\tcalle cc.c_cc_phy_get_body\r\n\t\tmov s_ret,[esp]\r\n\t\tadd esp,4\r\n\t}\r\n\t\r\n\tset_body(void* sprite,void* body)\r\n\t{\r\n\t\tpush body\r\n\t\tpush sprite\r\n\t\tcalle cc.c_cc_phy_set_body\r\n\t}\r\n\t\r\n\tvoid* box(double width,double height)\r\n\t{\r\n\t\tsub esp,4\r\n\t\tsub esp,8\r\n\t\tmov8 [esp],height\r\n\t\tsub esp,8\r\n\t\tmov8 [esp],width\r\n\t\tcalle cc.c_cc_phy_box\r\n\t\tmov s_ret,[esp]\r\n\t\tadd esp,4\r\n\t}\r\n\t\r\n\tvoid* box_edge(double width,double height,int edge)\r\n\t{\r\n\t\tsub esp,4\r\n\t\tpush edge\r\n\t\tsub esp,8\r\n\t\tmov8 [esp],height\r\n\t\tsub esp,8\r\n\t\tmov8 [esp],width\r\n\t\tcalle cc.c_cc_phy_box_edge\r\n\t\tmov s_ret,[esp]\r\n\t\tadd esp,4\r\n\t}\r\n\t\r\n\thit_call(void* call_back)\r\n\t{\r\n\t\tpush call_back\r\n\t\tcalle cc.c_cc_phy_call\r\n\t}\r\n}\r\n"
  },
  {
    "path": "bin/rsrc/rdic.h",
    "content": "﻿import 'rset.h'\r\n\r\ntemplate<typename T>\r\nstruct rdic_i\r\n{\r\n\tT val;\r\n\trstr key;\r\n\r\n\tfriend rbool operator<(const rdic_i<T>& a,const rdic_i<T>& b)\r\n\t{\r\n\t\treturn a.key<b.key;\r\n\t}\r\n\r\n\tfriend rbool operator!=(const rdic_i<T>& a,const rdic_i<T>& b)\r\n\t{\r\n\t\treturn a.key!=b.key;\r\n\t}\r\n};\r\n\r\ntemplate<typename T>\r\nstruct rdic\r\n{\r\n\trset<rdic_i<T> > m_set;\r\n\r\n\trbool exist(const rstr& key)\r\n\t{\r\n\t\trdic_i<T> item;\r\n\t\titem.key=key;\r\n\t\treturn m_set.exist(item);\r\n\t}\r\n\r\n\tT& operator[](const rstr& key)\r\n\t{\r\n\t\trdic_i<T> item;\r\n\t\titem.key=key;\r\n\t\tm_set.insert_c(item);\r\n\t\trdic_i<T>* p=m_set.find(item);\r\n\t\treturn p->val;\r\n\t}\r\n};"
  },
  {
    "path": "bin/rsrc/rstr.h",
    "content": "﻿class rstr\r\n{\r\npublic:\r\n\trbuf<char> m_buf;\r\n\r\n\t~rstr()\r\n\t{\r\n\t}\r\n\r\n\trstr()\r\n\t{\r\n\t}\r\n\r\n\trstr(const char* p)\r\n\t{\r\n\t\tset(p);\r\n\t}\r\n\r\n\trstr(void* p,int len)\r\n\t{\r\n\t\tm_buf.alloc(len);\r\n\t\trf.memcpy(begin(),p,len);\r\n\t}\r\n\r\n\trstr(const char* p,const char* q)\r\n\t{\r\n\t\tif(p>=q)\r\n\t\t{\r\n\t\t\trf::error(\"\");\r\n\t\t}\r\n\t\tint len=q-p;\r\n\t\tm_buf.alloc(len);\r\n\t\trf.memcpy(begin(),p,len);\r\n\t}\r\n\r\n\trstr(char ch)\r\n\t{\r\n\t\tm_buf+=ch;\r\n\t}\r\n\r\n\trstr(int i)\r\n\t{\r\n\t\trbuf<char> tmp(20);\r\n\t\trf.sprintf(tmp.begin,\"%d\",i);\r\n\t\tset(tmp.m_p);\r\n\t}\r\n\r\n\trstr(uint i)\r\n\t{\r\n\t\trbuf<char> tmp(20);\r\n\t\trf.sprintf(tmp.begin,\"%u\",i);\r\n\t\tset(tmp.m_p);\r\n\t}\r\n\r\n\trstr(int8 i)\r\n\t{\r\n\t\trbuf<char> tmp(128);\r\n\t\trf.sprintf8(tmp.begin,\"%I64d\",i);\r\n\t\tset(tmp.m_p);\r\n\t}\r\n\t\r\n\trstr(double i)\r\n\t{\r\n\t\trbuf<char> tmp(1024);\r\n\t\trf.sprintf8(tmp.begin,\"%f\",i);\r\n\t\tset(tmp.m_p);\r\n\t}\r\n\r\n\trstr(float i)\r\n\t{\r\n\t\t//sprintf用%f时以8字节打印\r\n\t\tset(rstr(double(i)).cstr)\r\n\t}\r\n\r\n\trstr(rstr& s)\r\n\t{\r\n\t\tm_buf.alloc_not_change(s.m_buf.m_cmax);\r\n\t\tm_buf.m_count=s.count();\r\n\t\trf::memcpy(begin(),s.begin(),s.count());\r\n\t}\r\n\r\n\tint toint()\r\n\t{\r\n\t\tint ret;\r\n\t\trf.sscanf(cstr(),\"%d\",&ret);\r\n\t\treturn ret;\r\n\t}\r\n\r\n\tuint touint()\r\n\t{\r\n\t\tuint ret;\r\n\t\trf.sscanf(cstr(),\"%u\",&ret);\r\n\t\treturn ret;\r\n\t}\r\n\r\n\tint8 toint8()\r\n\t{\r\n\t\tint8 ret;\r\n\t\trf.sscanf(cstr(),\"%I64d\",&ret);\r\n\t\treturn ret;\r\n\t}\r\n\t\r\n\tdouble todouble()\r\n\t{\r\n\t\tdouble ret;\r\n\t\trf.sscanf8(cstr(),\"%lf\",&ret);\r\n\t\treturn ret;\r\n\t}\r\n\t\r\n\trstr torstr()\r\n\t{\r\n\t\treturn this\r\n\t}\r\n\t\r\n\trstrw torstrw()\r\n\t{\r\n\t\trstr temp=rcode::utf8_to_utf16(this);\r\n\t\ts_ret.rstrw()\r\n\t\ts_ret.set_size(temp.size)\r\n\t\trf.memcpy(s_ret.begin,temp.begin,temp.size);\r\n\t}\r\n\r\n\tvoid operator=(rstr& a)\r\n\t{\r\n\t\tm_buf=a.m_buf;\r\n\t}\r\n\r\n\tchar& operator[](int num)\r\n\t{\r\n\t\treturn m_buf[num];\r\n\t}\r\n\r\n\tfriend bool operator==(rstr& a,rstr& b)\r\n\t{\r\n\t\treturn a.m_buf==b.m_buf;\r\n\t}\r\n\r\n\tfriend bool operator!=(rstr& a,rstr& b)\r\n\t{\r\n\t\treturn a.m_buf!=b.m_buf;\r\n\t}\r\n\r\n\tfriend rstr operator+(rstr& a,rstr& b)\r\n\t{\r\n\t\tint total=a.count()+b.count();\r\n\t\tint max=rf::max(a.m_buf.m_cmax,b.m_buf.m_cmax);\r\n\t\trstr ret;\r\n\t\tif(total>max)\r\n\t\t{\r\n\t\t\tret.m_buf.alloc_not_change(rbuf<char>.extend_num(total));\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tret.m_buf.alloc_not_change(max);\r\n\t\t}\r\n\t\tret.m_buf.m_count=total;\r\n\t\trf::memcpy(ret.begin(),a.begin(),a.m_buf.m_count);\r\n\t\trf::memcpy(ret.begin()+a.m_buf.m_count,b.begin(),b.m_buf.m_count);\r\n\t\treturn ret;\r\n\t}\r\n\r\n\tvoid operator+=(rstr& a)\r\n\t{\r\n\t\tm_buf+=a.m_buf;\r\n\t}\r\n\r\n\tfriend bool operator<(rstr& a,rstr& b)\r\n\t{\r\n\t\treturn rf::strcmp(a.cstr(),b.cstr())<0;\r\n\t}\r\n\r\n\tfriend bool operator>(rstr& a,rstr& b)\r\n\t{\r\n\t\treturn rf::strcmp(a.cstr(),b.cstr())>0;\r\n\t}\r\n\r\n\tfriend bool operator<=(rstr& a,rstr& b)\r\n\t{\r\n\t\treturn rf::strcmp(a.cstr(),b.cstr())<=0;\r\n\t}\r\n\r\n\tfriend bool operator>=(rstr& a,rstr& b)\r\n\t{\r\n\t\treturn rf::strcmp(a.cstr(),b.cstr())>=0;\r\n\t}\r\n\r\n\tchar* set_size(int size)\r\n\t{\r\n\t\tm_buf.realloc_n(size);\r\n\t\treturn begin();\r\n\t}\r\n\r\n\tvoid set(char* p)\r\n\t{\r\n\t\tint len=rf::strlen(p);\r\n\t\tm_buf.realloc_n_not_change(rbuf<char>.extend_num(len));\r\n\t\tm_buf.m_count=len;\r\n\t\trf::memcpy(m_buf.begin(),p,len);\r\n\t}\r\n\r\n\tvoid push(char ch)\r\n\t{\r\n\t\tm_buf.push(ch);\r\n\t}\r\n\r\n\tchar pop()\r\n\t{\r\n\t\treturn m_buf.pop();\r\n\t}\r\n\r\n\tint count()\r\n\t{\r\n\t\treturn m_buf.count();\r\n\t}\r\n\r\n\tint size()\r\n\t{\r\n\t\treturn m_buf.count();\r\n\t}\r\n\r\n\tchar* cstr()\r\n\t{\r\n\t\tchar temp=0;\r\n\t\tm_buf.push(temp);\r\n\t\tm_buf.pop();\r\n\t\treturn m_buf.begin();\r\n\t}\r\n\r\n\twchar* cstrw()\r\n\t{\r\n\t\tchar temp=0;\r\n\t\tm_buf.push(temp);\r\n\t\tm_buf.push(temp);\r\n\t\tm_buf.pop();\r\n\t\tm_buf.pop();\r\n\t\treturn m_buf.begin();\r\n\t}\r\n\r\n\tchar* begin()\r\n\t{\r\n\t\treturn m_buf.begin();\r\n\t}\r\n\r\n\tchar* end()\r\n\t{\r\n\t\treturn m_buf.end();\r\n\t}\r\n\r\n\tbool empty()\r\n\t{\r\n\t\treturn m_buf.empty();\r\n\t}\r\n\r\n\tvoid clear()\r\n\t{\r\n\t\tm_buf.clear();\r\n\t}\r\n\r\n\tchar* pos(int num)\r\n\t{\r\n\t\treturn begin()+num;\r\n\t}\r\n\r\n\tint pos(char* p)\r\n\t{\r\n\t\treturn p-begin();\r\n\t}\r\n\r\n\trstr sub(int begin,int end=count)\r\n\t{\r\n\t\trstr ret;\r\n\t\tret.m_buf=m_buf.sub(begin,end);\r\n\t\treturn ret;\r\n\t}\r\n\r\n\tbool erase(int begin,int end)\r\n\t{\r\n\t\treturn m_buf.erase(begin,end);\r\n\t}\r\n\r\n\tbool erase(int i)\r\n\t{\r\n\t\treturn erase(i,i+1);\r\n\t}\r\n\r\n\tbool insert(int pos,rstr& a)\r\n\t{\r\n\t\treturn m_buf.insert(pos,a.m_buf);\r\n\t}\r\n\r\n\tchar get(int i)\r\n\t{\r\n\t\treturn m_buf.get(i);\r\n\t}\r\n\r\n\tchar get_top()\r\n\t{\r\n\t\tchar ret=0;\r\n\t\tif(count()>0)\r\n\t\t{\r\n\t\t\tret=m_buf.m_p[count()-1];\r\n\t\t}\r\n\t\treturn ret;\r\n\t}\r\n\r\n\tchar get_bottom()\r\n\t{\r\n\t\tchar ret=0;\r\n\t\tif(count()>0)\r\n\t\t{\r\n\t\t\tret=m_buf.m_p[0];\r\n\t\t}\r\n\t\treturn ret;\r\n\t}\r\n\r\n\tbool is_number()\r\n\t{\r\n\t\tif(empty())\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\tfor(int i=0;i<count();i++)\r\n\t\t{\r\n\t\t\tif(!rf::is_number(m_buf[i]))\r\n\t\t\t{\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn true;\r\n\t}\r\n\t\r\n\t//查找子串\r\n\tint find(rstr& m,int begin=0)\r\n\t{\r\n\t\treturn r_find_pos<rstr>(this,m,begin)\r\n\t}\r\n\t\r\n\trstr replace(rstr src,rstr dst)\r\n\t{\r\n\t\trstr ret\r\n\t\tfor i=0;i<count;i++\r\n\t\t\tif this.sub(i,i+src.count)==src\r\n\t\t\t\tret+=dst\r\n\t\t\t\ti=i+src.count-1\r\n\t\t\telse\r\n\t\t\t\tret+=this[i]\r\n\t\treturn ret\r\n\t}\r\n\r\n\trbuf<rstr> split(rstr m)\r\n\t{\r\n\t\treturn r_split_r<rstr>(this,m)\r\n\t}\r\n\t\r\n\tvoid reverse()\r\n\t{\r\n\t\tm_buf.reverse\r\n\t}\r\n\r\n\tvoid print()\r\n\t{\r\n\t\trf.print(this)\r\n\t}\r\n\r\n\tvoid printl()\r\n\t{\r\n\t\trf.printl(this)\r\n\t}\r\n\t\r\n\tstatic rstr format(rstr f,int a)\r\n\t{\r\n\t\trbuf<char> temp(1024)\r\n\t\trf.sprintf(temp.begin,f.cstr,a);\r\n\t\ts_ret.rstr()\r\n\t\ts_ret.set(temp.begin)\r\n\t}\r\n};"
  },
  {
    "path": "bin/rsrc/rstrw.h",
    "content": "﻿\r\n#include \"rstr.h\"\r\n\r\nstruct rstrw\r\n{\r\n\trbuf<ushort> m_buf;\r\n\r\n\t~rstrw()\r\n\t{\r\n\t}\r\n\r\n\trstrw()\r\n\t{\r\n\t}\r\n\r\n\trstrw(const ushort* p)\r\n\t{\r\n\t\tset(p);\r\n\t}\r\n\t\r\n\trstrw(const uchar* p,int len)\r\n\t{\r\n\t\tset_size(len);\r\n\t\trf.memcpy(m_buf.begin(),p,len);\r\n\t}\r\n\r\n\trstrw(const rstrw& s)\r\n\t{\r\n\t\tm_buf.alloc_not_change(s.m_buf.m_cmax);\r\n\t\tm_buf.m_count=s.count();\r\n\t\trf.memcpy(begin(),s.begin(),s.size());\r\n\t}\r\n\r\n\trstrw(const rstr& s)\r\n\t{\r\n\t\trstr tmp=rcode::utf8_to_utf16(s);\r\n\t\tset_size(tmp.size());\r\n\t\trf.memcpy(begin(),tmp.begin(),tmp.size());\r\n\t}\r\n\r\n\trstr torstr()\r\n\t{\r\n\t\treturn rcode::utf16_to_utf8(rstr(begin(),size()));\r\n\t}\r\n\r\n\tushort* cstrw()\r\n\t{\r\n\t\tm_buf.push(0.toushort);\r\n\t\tm_buf.pop();\r\n\t\treturn begin();\r\n\t}\r\n\r\n\tvoid operator=(const rstrw& a)\r\n\t{\r\n\t\tm_buf=a.m_buf;\r\n\t}\r\n\r\n\tushort& operator[](int num) const \r\n\t{\r\n\t\treturn m_buf[num];\r\n\t}\r\n\r\n\tfriend rbool operator==(const rstrw& a,const rstrw& b)\r\n\t{\r\n\t\treturn a.m_buf==b.m_buf;\r\n\t}\r\n\r\n\tfriend rbool operator!=(const rstrw& a,const rstrw& b)\r\n\t{\r\n\t\treturn a.m_buf!=b.m_buf;\r\n\t}\r\n\r\n\tfriend rstrw operator+(const rstrw& a,const rstrw& b)\r\n\t{\r\n\t\trstrw ret;\r\n\t\tret.m_buf=a.m_buf+b.m_buf;\r\n\t\treturn ret;\r\n\t}\r\n\r\n\tvoid operator+=(const rstrw& a)\r\n\t{\r\n\t\tm_buf+=a.m_buf;\r\n\t}\r\n\r\n\tvoid operator+=(ushort ch)\r\n\t{\r\n\t\tm_buf+=ch;\r\n\t}\r\n\r\n\tfriend rbool operator<(const rstrw& a,const rstrw& b)\r\n\t{\r\n\t\tfor(int i=0;i<a.count()&&i<b.count();i++)\r\n\t\t\tif(a[i]!=b[i])\r\n\t\t\t\treturn a[i]<b[i];\r\n\t\treturn a.count()<b.count();\r\n\t}\r\n\r\n\tfriend rbool operator>(const rstrw& a,const rstrw& b)\r\n\t{\r\n\t\treturn b<a;\r\n\t}\r\n\r\n\tfriend rbool operator<=(const rstrw& a,const rstrw& b)\r\n\t{\r\n\t\treturn !(a>b);\r\n\t}\r\n\r\n\tfriend rbool operator>=(const rstrw& a,const rstrw& b)\r\n\t{\r\n\t\treturn !(a<b);\r\n\t}\r\n\r\n\tushort* set_count(int count)\r\n\t{\r\n\t\tm_buf.realloc_n(count);\r\n\t\treturn begin();\r\n\t}\r\n\r\n\tushort* set_size(int size)\r\n\t{\r\n\t\treturn set_count(size/2);\r\n\t}\r\n\r\n\tvoid set(const ushort* p)\r\n\t{\r\n\t\tint len=cdecl[\"lstrlenW\",p];\r\n\t\tm_buf.realloc_n_not_change(rbuf<ushort>::extend_num(len));\r\n\t\tm_buf.m_count=len;\r\n\t\trf.memcpy(m_buf.begin(),p,len*2);\r\n\t}\r\n\r\n\tvoid push(ushort ch)\r\n\t{\r\n\t\tm_buf.push(ch);\r\n\t}\r\n\r\n\tvoid push_front(ushort ch)\r\n\t{\r\n\t\tm_buf.push_front(ch);\r\n\t}\r\n\r\n\tushort pop()\r\n\t{\r\n\t\treturn m_buf.pop();\r\n\t}\r\n\r\n\tushort pop_front()\r\n\t{\r\n\t\treturn m_buf.pop_front();\r\n\t}\r\n\r\n\tint count() const \r\n\t{\r\n\t\treturn m_buf.count();\r\n\t}\r\n\r\n\tint size() const\r\n\t{\r\n\t\treturn count()*2;\r\n\t}\r\n\r\n\tushort* begin() const \r\n\t{\r\n\t\treturn m_buf.begin();\r\n\t}\r\n\r\n\tushort* end() const \r\n\t{\r\n\t\treturn m_buf.end();\r\n\t}\r\n\r\n\trbool empty() const \r\n\t{\r\n\t\treturn m_buf.empty();\r\n\t}\r\n\r\n\tvoid clear()\r\n\t{\r\n\t\tm_buf.clear();\r\n\t}\r\n\r\n\tstatic ushort* next(ushort* p)\r\n\t{\r\n\t\treturn p+1;\r\n\t}\r\n\r\n\tstatic ushort* prev(ushort* p)\r\n\t{\r\n\t\treturn p-1;\r\n\t}\r\n\r\n\tushort* pos(int num) const\r\n\t{\r\n\t\treturn begin()+num;\r\n\t}\r\n\r\n\tint pos(ushort* p) const\r\n\t{\r\n\t\treturn p-begin();\r\n\t}\r\n\r\n\trstrw sub(int begin) const\r\n\t{\r\n\t\treturn sub(begin,count());\r\n\t}\r\n\r\n\trstrw sub(int begin,int end) const\r\n\t{\r\n\t\trstrw ret;\r\n\t\tret.m_buf=m_buf.sub(begin,end);\r\n\t\treturn ret;\r\n\t}\r\n\r\n\trbool erase(int begin,int end)\r\n\t{\r\n\t\treturn m_buf.erase(begin,end);\r\n\t}\r\n\r\n\trbool erase(int i)\r\n\t{\r\n\t\treturn erase(i,i+1);\r\n\t}\r\n\r\n\trbool insert(int pos,const rstrw& a)\r\n\t{\r\n\t\treturn m_buf.insert(pos,a.m_buf);\r\n\t}\r\n\r\n\tushort get(int i) const\r\n\t{\r\n\t\tif(i>=count())\r\n\t\t\treturn 0.toushort;\r\n\t\telse \r\n\t\t\treturn m_buf[i];\r\n\t}\r\n\r\n\tushort get_top() const\r\n\t{\r\n\t\tushort ret=0;\r\n\t\tif(count()>0)\r\n\t\t{\r\n\t\t\tret=m_buf.m_p[count()-1];\r\n\t\t}\r\n\t\treturn ret;\r\n\t}\r\n\r\n\tushort get_bottom() const\r\n\t{\r\n\t\tushort ret=0;\r\n\t\tif(count()>0)\r\n\t\t{\r\n\t\t\tret=m_buf.m_p[0];\r\n\t\t}\r\n\t\treturn ret;\r\n\t}\r\n\r\n\tint find(rstrw s,int begin=0)\r\n\t{\r\n\t\treturn r_find_pos<rstrw>(*this,s,begin);\r\n\t}\r\n\r\n\tint find_last(ushort ch)\r\n\t{\r\n\t\treturn m_buf.find_last(ch);\r\n\t}\r\n\t\r\n\tprintl()\r\n\t{\r\n\t\tthis.torstr.printl\r\n\t}\r\n};\r\n"
  },
  {
    "path": "bin/rsrc/short.h",
    "content": "﻿class short\r\n{\r\n\trd2 m_in\r\n\r\n\t~short()\r\n\t{\r\n\t}\r\n\r\n\tshort()\r\n\t{\r\n\t}\r\n\r\n\tshort(short& a)\r\n\t{\r\n\t\tmov esi,this\r\n\t\tmov edi,a\r\n\t\tmov1 [esi],[edi]\r\n\t\tmov1 [esi+1],[edi+1]\r\n\t}\r\n\r\n\tshort(short a)\r\n\t{\r\n\t\tmov esi,this\r\n\t\tmov1 [esi],a\r\n\t\tmov1 [esi+1],[ebp+(s_off a+1)]\r\n\t}\r\n\t\r\n\tushort toushort()\r\n\t{\r\n\t\tmov esi,this\r\n\t\tmov1 s_ret,[esi]\r\n\t\tmov1 [ebp+(s_off s_ret+1)],[esi+1]\r\n\t}\r\n\r\n\tint toint()\r\n\t{\r\n\t\ttemp=this.toushort\r\n\t\tif temp>32767\r\n\t\t\treturn temp.toint-65536\r\n\t\telse\r\n\t\t\treturn temp\r\n\t}\r\n\r\n\trstr torstr()\r\n\t{\r\n\t\trstr ret(this.toint)\r\n\t\treturn ret\r\n\t}\r\n\r\n\toperator=(short& a)\r\n\t{\r\n\t\tmov esi,this\r\n\t\tmov edi,a\r\n\t\tmov1 [esi],[edi]\r\n\t\tmov1 [esi+1],[edi+1]\r\n\t}\r\n\r\n\toperator=(short a)\r\n\t{\r\n\t\tmov esi,this\r\n\t\tmov1 [esi],a\r\n\t\tmov1 [esi+1],[ebp+(s_off a+1)]\r\n\t}\r\n\r\n\tclear()\r\n\t{\r\n\t\tthis=0\r\n\t}\r\n\r\n\tbool empty()\r\n\t{\r\n\t\treturn this.toint==0\r\n\t}\r\n\r\n\tprint()\r\n\t{\r\n\t\trf.print this.torstr\r\n\t}\r\n\r\n\tprintl()\r\n\t{\r\n\t\trf.printl this.torstr\r\n\t}\r\n}"
  },
  {
    "path": "bin/rsrc/varf.h",
    "content": "﻿\r\nnamespace varf\r\n{\r\n\tvoid* new()\r\n\t{\r\n\t\tsub esp,4\r\n\t\tcalle c_new\r\n\t\tmov s_ret,[esp]\r\n\t\tadd esp,4\r\n\t}\r\n\t\r\n\tvoid* new_copy(void* p)\r\n\t{\r\n\t\tsub esp,4\r\n\t\tpush p\r\n\t\tcalle c_new_copy\r\n\t\tmov s_ret,[esp]\r\n\t\tadd esp,4\r\n\t}\r\n\t\r\n\tvoid delete(void* p)\r\n\t{\r\n\t\tpush p\r\n\t\tcalle c_delete\r\n\t}\r\n\t\r\n\tvoid set_int(void* p,int a)\r\n\t{\r\n\t\tpush a\r\n\t\tpush p\r\n\t\tcalle c_set_int\r\n\t}\r\n\t\r\n\tvoid set_double(void* p,double a)\r\n\t{\r\n\t\tsub esp,8\r\n\t\tmov8 [esp],a\r\n\t\tpush p\r\n\t\tcalle c_set_double\r\n\t}\r\n\t\r\n\tvoid set_rstr(void* p,char* s,int size)\r\n\t{\r\n\t\tpush size\r\n\t\tpush s\r\n\t\tpush p\r\n\t\tcalle c_set_rstr\r\n\t}\r\n\t\r\n\tvoid set_var(void* p,void* a)\r\n\t{\r\n\t\tpush a\r\n\t\tpush p\r\n\t\tcalle c_set_var\r\n\t}\r\n\t\r\n\tvoid set_func(void* p,void* a)\r\n\t{\r\n\t\tpush a\r\n\t\tpush p\r\n\t\tcalle c_set_func\r\n\t}\r\n\t\r\n\tvoid* add(void* a,void* b)\r\n\t{\r\n\t\tsub esp,4\r\n\t\tpush b\r\n\t\tpush a\r\n\t\tcalle c_add\r\n\t\tmov s_ret,[esp]\r\n\t\tadd esp,4\r\n\t}\r\n\t\r\n\tvoid* minus(void* a,void* b)\r\n\t{\r\n\t\tsub esp,4\r\n\t\tpush b\r\n\t\tpush a\r\n\t\tcalle c_minus\r\n\t\tmov s_ret,[esp]\r\n\t\tadd esp,4\r\n\t}\r\n\t\r\n\tvoid* star(void* a,void* b)\r\n\t{\r\n\t\tsub esp,4\r\n\t\tpush b\r\n\t\tpush a\r\n\t\tcalle c_star\r\n\t\tmov s_ret,[esp]\r\n\t\tadd esp,4\r\n\t}\r\n\t\r\n\tvoid* divide(void* a,void* b)\r\n\t{\r\n\t\tsub esp,4\r\n\t\tpush b\r\n\t\tpush a\r\n\t\tcalle c_divide\r\n\t\tmov s_ret,[esp]\r\n\t\tadd esp,4\r\n\t}\r\n\t\r\n\tvoid* modulo(void* a,void* b)\r\n\t{\r\n\t\tsub esp,4\r\n\t\tpush b\r\n\t\tpush a\r\n\t\tcalle c_modulo\r\n\t\tmov s_ret,[esp]\r\n\t\tadd esp,4\r\n\t}\r\n\t\r\n\tvoid* sub(void* a,int begin,int end)\r\n\t{\r\n\t\tsub esp,4\r\n\t\tpush end\r\n\t\tpush begin\r\n\t\tpush a\r\n\t\tcalle c_sub\r\n\t\tmov s_ret,[esp]\r\n\t\tadd esp,4\r\n\t}\r\n\t\r\n\tbool equal(void* a,void* b)\r\n\t{\r\n\t\tsub esp,4\r\n\t\tpush b\r\n\t\tpush a\r\n\t\tcalle c_equal\r\n\t\tmov s_ret,[esp]\r\n\t\tadd esp,4\r\n\t}\r\n\t\r\n\tbool less(void* a,void* b)\r\n\t{\r\n\t\tsub esp,4\r\n\t\tpush b\r\n\t\tpush a\r\n\t\tcalle c_less\r\n\t\tmov s_ret,[esp]\r\n\t\tadd esp,4\r\n\t}\r\n\t\r\n\tint toint(void* p)\r\n\t{\r\n\t\tsub esp,4\r\n\t\tpush p\r\n\t\tcalle c_toint\r\n\t\tmov s_ret,[esp]\r\n\t\tadd esp,4\r\n\t}\r\n\t\r\n\tint get_rstr(void* p,char* buf)\r\n\t{\r\n\t\tsub esp,4\r\n\t\tpush buf\r\n\t\tpush p\r\n\t\tcalle c_get_rstr\r\n\t\tmov s_ret,[esp]\r\n\t\tadd esp,4\r\n\t}\r\n\t\r\n\tvoid* findf(void* p,char* name)\r\n\t{\r\n\t\tsub esp,4\r\n\t\tpush name\r\n\t\tpush p\r\n\t\tcalle c_findf\r\n\t\tmov s_ret,[esp]\r\n\t\tadd esp,4\r\n\t}\r\n\t\r\n\tvar& quote_attr(void* p,char* name)\r\n\t{\r\n\t\tsub esp,4\r\n\t\tpush name\r\n\t\tpush p\r\n\t\tcalle c_quote_attr\r\n\t\tmov s_ret,[esp]\r\n\t\tadd esp,4\r\n\t}\r\n\t\r\n\tbool have(void* p,char* name)\r\n\t{\r\n\t\tsub esp,4\r\n\t\tpush name\r\n\t\tpush p\r\n\t\tcalle c_have\r\n\t\tmov s_ret,[esp]\r\n\t\tadd esp,4\r\n\t}\r\n\t\r\n\tvoid insert_pair(void* p,void* name,void* val)\r\n\t{\r\n\t\tpush val\r\n\t\tpush name\r\n\t\tpush p\r\n\t\tcalle c_insert_pair\r\n\t}\r\n\t\r\n\tint count(void* p)\r\n\t{\r\n\t\tsub esp,4\r\n\t\tpush p\r\n\t\tcalle c_count\r\n\t\tmov s_ret,[esp]\r\n\t\tadd esp,4\r\n\t}\r\n\t\r\n\tvoid* stringify(void* p)\r\n\t{\r\n\t\tsub esp,4\r\n\t\tpush p\r\n\t\tcalle c_stringify\r\n\t\tmov s_ret,[esp]\r\n\t\tadd esp,4\r\n\t}\r\n\t\r\n\tenum\r\n\t{\r\n\t\tc_void,\r\n\t\tc_int,\r\n\t\tc_double,\r\n\t\tc_rstr,\r\n\t\tc_dic,\r\n\t\tc_func,\r\n\t};\r\n\r\n\tenum\r\n\t{\r\n\t\tc_new=2000,\r\n\t\tc_new_copy,\r\n\t\tc_delete,\r\n\r\n\t\tc_set_int,\r\n\t\tc_set_double,\r\n\t\tc_set_rstr,\r\n\t\tc_set_var,\r\n\t\tc_set_func,\r\n\r\n\t\tc_add,\r\n\t\tc_minus,\r\n\t\tc_star,\r\n\t\tc_divide,\r\n\t\tc_modulo,\r\n\t\tc_sub,//求子串或者子数组\r\n\r\n\t\tc_equal,\r\n\t\tc_less,\r\n\r\n\t\tc_toint,\r\n\t\tc_get_rstr,\r\n\r\n\t\tc_findf,\r\n\t\tc_quote_attr,\r\n\t\tc_have,\r\n\t\tc_insert_pair,\r\n\t\tc_count,\r\n\t\tc_stringify,\r\n\t};\r\n}\r\n\r\nvoid* _js_findf(var* p,char* name)\r\n{\r\n\treturn varf.findf(p->m_p,name)\r\n}\r\n\r\nvar _js_obj(int count)\r\n{\r\n\tvar* p=&count+1\r\n\tvar* pret=p+count\r\n\tpret->var\r\n\tpret->set_int(0)\r\n\tfor i=0;i<count;i+=2\r\n\t\tvarf.insert_pair(pret->m_p,p->m_p,(p+1)->m_p)\r\n\t\tp->~var\r\n\t\t(p+1)->~var\r\n\t\tp+=2\r\n\tmov ecx,4\r\n\timul ecx,count\r\n\tadd ecx,4\r\n\tpop ebp\r\n\tadd esp,sizeof(s_local)\r\n\treti ecx\r\n}"
  },
  {
    "path": "bin/run.bat",
    "content": "@echo off\r\n%~dp0\\rpp.exe example\\run.h %1 -del"
  },
  {
    "path": "del.bat",
    "content": "\r\ndel /F /Q .\\bin\\*.ilk\r\ndel /F /Q .\\bin\\*.pdb\r\n\r\ndel /F /Q .\\*.ncb\r\nattrib -R -S -A -H .\\*.suo\r\ndel /F /Q .\\*.suo\r\ndel /F /Q .\\*.user\r\n\r\nrd /S /Q .\\debug\r\nrd /S /Q .\\Release\r\n\r\ndel /F /Q .\\2005\\*.ncb\r\nattrib -R -S -A -H .\\2005\\*.suo\r\ndel /F /Q .\\2005\\*.suo\r\ndel /F /Q .\\2005\\*.user\r\n\r\nrd /S /Q .\\2005\\debug\r\nrd /S /Q .\\2005\\Release\r\n\r\ndel /F /Q .\\2008\\*.ncb\r\nattrib -R -S -A -H .\\2008\\*.suo\r\ndel /F /Q .\\2008\\*.suo\r\ndel /F /Q .\\2008\\*.user\r\n\r\nrd /S /Q .\\2008\\debug\r\nrd /S /Q .\\2008\\Release\r\n\r\n\r\nattrib -R -S -A -H .\\2010\\*.suo\r\ndel /F /Q .\\2010\\*.suo\r\ndel /F /Q .\\2010\\*.user\r\nrd /S /Q .\\2010\\debug\r\nrd /S /Q .\\2010\\Release\r\n\r\ndel /F /Q .\\proj\\rpp_win\\*.vsp\r\nrem del /F /Q .\\proj\\rpp_win\\*.filters\r\ndel /F /Q .\\proj\\rpp_win\\*.psess\r\ndel /F /Q .\\proj\\rpp_win\\*.sdf\r\ndel /F /Q .\\proj\\rpp_win\\*.ncb\r\nattrib -R -S -A -H .\\proj\\rpp_win\\*.suo\r\ndel /F /Q .\\proj\\rpp_win\\*.suo\r\ndel /F /Q .\\proj\\rpp_win\\*.user\r\n\r\nrd /S /Q .\\proj\\rpp_win\\debug\r\nrd /S /Q .\\proj\\rpp_win\\Release\r\n\r\ndel /F /Q .\\proj\\*.vsp\r\nrem del /F /Q .\\proj\\*.filters\r\ndel /F /Q .\\proj\\*.psess\r\ndel /F /Q .\\proj\\*.sdf\r\ndel /F /Q .\\proj\\*.ncb\r\nattrib -R -S -A -H .\\proj\\*.suo\r\ndel /F /Q .\\proj\\*.suo\r\ndel /F /Q .\\proj\\*.user\r\n\r\nrd /S /Q .\\proj\\debug\r\nrd /S /Q .\\proj\\Release\r\n\r\npause"
  },
  {
    "path": "proj/rpp.sln",
    "content": "﻿\r\nMicrosoft Visual Studio Solution File, Format Version 12.00\r\n# Visual Studio 2012\r\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"rpp\", \"rpp.vcxproj\", \"{E00D615C-3C55-4D01-B2EB-0064CFBAA91E}\"\r\nEndProject\r\nGlobal\r\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\r\n\t\tDebug|Win32 = Debug|Win32\r\n\t\tDebug|x64 = Debug|x64\r\n\t\tRelease|Win32 = Release|Win32\r\n\t\tRelease|x64 = Release|x64\r\n\tEndGlobalSection\r\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\r\n\t\t{E00D615C-3C55-4D01-B2EB-0064CFBAA91E}.Debug|Win32.ActiveCfg = Debug|Win32\r\n\t\t{E00D615C-3C55-4D01-B2EB-0064CFBAA91E}.Debug|Win32.Build.0 = Debug|Win32\r\n\t\t{E00D615C-3C55-4D01-B2EB-0064CFBAA91E}.Debug|x64.ActiveCfg = Debug|x64\r\n\t\t{E00D615C-3C55-4D01-B2EB-0064CFBAA91E}.Debug|x64.Build.0 = Debug|x64\r\n\t\t{E00D615C-3C55-4D01-B2EB-0064CFBAA91E}.Release|Win32.ActiveCfg = Release|Win32\r\n\t\t{E00D615C-3C55-4D01-B2EB-0064CFBAA91E}.Release|Win32.Build.0 = Release|Win32\r\n\t\t{E00D615C-3C55-4D01-B2EB-0064CFBAA91E}.Release|x64.ActiveCfg = Release|x64\r\n\t\t{E00D615C-3C55-4D01-B2EB-0064CFBAA91E}.Release|x64.Build.0 = Release|x64\r\n\tEndGlobalSection\r\n\tGlobalSection(SolutionProperties) = preSolution\r\n\t\tHideSolutionNode = FALSE\r\n\tEndGlobalSection\r\nEndGlobal\r\n"
  },
  {
    "path": "proj/rpp.vcxproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<Project DefaultTargets=\"Build\" ToolsVersion=\"4.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\r\n  <ItemGroup Label=\"ProjectConfigurations\">\r\n    <ProjectConfiguration Include=\"Debug|Win32\">\r\n      <Configuration>Debug</Configuration>\r\n      <Platform>Win32</Platform>\r\n    </ProjectConfiguration>\r\n    <ProjectConfiguration Include=\"Debug|x64\">\r\n      <Configuration>Debug</Configuration>\r\n      <Platform>x64</Platform>\r\n    </ProjectConfiguration>\r\n    <ProjectConfiguration Include=\"Release|Win32\">\r\n      <Configuration>Release</Configuration>\r\n      <Platform>Win32</Platform>\r\n    </ProjectConfiguration>\r\n    <ProjectConfiguration Include=\"Release|x64\">\r\n      <Configuration>Release</Configuration>\r\n      <Platform>x64</Platform>\r\n    </ProjectConfiguration>\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <ClInclude Include=\"..\\rlib\\ralgo.h\" />\r\n    <ClInclude Include=\"..\\rlib\\rbase.h\" />\r\n    <ClInclude Include=\"..\\rlib\\rbuf.h\" />\r\n    <ClInclude Include=\"..\\rlib\\rclass.h\" />\r\n    <ClInclude Include=\"..\\rlib\\rcode.h\" />\r\n    <ClInclude Include=\"..\\rlib\\rdb.h\" />\r\n    <ClInclude Include=\"..\\rlib\\rdic.h\" />\r\n    <ClInclude Include=\"..\\rlib\\rdir.h\" />\r\n    <ClInclude Include=\"..\\rlib\\rf.h\" />\r\n    <ClInclude Include=\"..\\rlib\\rfile.h\" />\r\n    <ClInclude Include=\"..\\rlib\\rhash.h\" />\r\n    <ClInclude Include=\"..\\rlib\\rindex.h\" />\r\n    <ClInclude Include=\"..\\rlib\\rlist.h\" />\r\n    <ClInclude Include=\"..\\rlib\\rmutex.h\" />\r\n    <ClInclude Include=\"..\\rlib\\rset.h\" />\r\n    <ClInclude Include=\"..\\rlib\\rsock.h\" />\r\n    <ClInclude Include=\"..\\rlib\\rstr.h\" />\r\n    <ClInclude Include=\"..\\rlib\\rstrw.h\" />\r\n    <ClInclude Include=\"..\\rlib\\rthread.h\" />\r\n    <ClInclude Include=\"..\\rpp\\rpp_def.h\" />\r\n    <ClInclude Include=\"..\\rpp\\talloc.h\" />\r\n    <ClInclude Include=\"..\\rpp\\tanalyse.h\" />\r\n    <ClInclude Include=\"..\\rpp\\tconf.h\" />\r\n    <ClInclude Include=\"..\\rpp\\tsh.h\" />\r\n    <ClInclude Include=\"..\\rpp\\tstruct.h\" />\r\n    <ClInclude Include=\"..\\rpp\\tvm.h\" />\r\n    <ClInclude Include=\"..\\rpp\\tvm_struct.h\" />\r\n    <ClInclude Include=\"..\\rpp\\zadd.h\" />\r\n    <ClInclude Include=\"..\\rpp\\zasm.h\" />\r\n    <ClInclude Include=\"..\\rpp\\zautof.h\" />\r\n    <ClInclude Include=\"..\\rpp\\zbin.h\" />\r\n    <ClInclude Include=\"..\\rpp\\zclass.h\" />\r\n    <ClInclude Include=\"..\\rpp\\zcontrol.h\" />\r\n    <ClInclude Include=\"..\\rpp\\zctl.h\" />\r\n    <ClInclude Include=\"..\\rpp\\zexp.h\" />\r\n    <ClInclude Include=\"..\\rpp\\zfind.h\" />\r\n    <ClInclude Include=\"..\\rpp\\zftl.h\" />\r\n    <ClInclude Include=\"..\\rpp\\zjit.h\" />\r\n    <ClInclude Include=\"..\\rpp\\zjitb.h\" />\r\n    <ClInclude Include=\"..\\rpp\\zjitf.h\" />\r\n    <ClInclude Include=\"..\\rpp\\zjiti.h\" />\r\n    <ClInclude Include=\"..\\rpp\\zlambda.h\" />\r\n    <ClInclude Include=\"..\\rpp\\zmac.h\" />\r\n    <ClInclude Include=\"..\\rpp\\zmain.h\" />\r\n    <ClInclude Include=\"..\\rpp\\zmatch.h\" />\r\n    <ClInclude Include=\"..\\rpp\\zmemb.h\" />\r\n    <ClInclude Include=\"..\\rpp\\znasm.h\" />\r\n    <ClInclude Include=\"..\\rpp\\zopt.h\" />\r\n    <ClInclude Include=\"..\\rpp\\zpre.h\" />\r\n    <ClInclude Include=\"..\\rpp\\zread.h\" />\r\n    <ClInclude Include=\"..\\rpp\\zsent.h\" />\r\n    <ClInclude Include=\"..\\rpp\\zsrep.h\" />\r\n    <ClInclude Include=\"..\\rpp\\zsuper.h\" />\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <ClCompile Include=\"..\\rpp\\rpp.cpp\" />\r\n  </ItemGroup>\r\n  <PropertyGroup Label=\"Globals\">\r\n    <ProjectGuid>{E00D615C-3C55-4D01-B2EB-0064CFBAA91E}</ProjectGuid>\r\n    <RootNamespace>rpp</RootNamespace>\r\n    <Keyword>Win32Proj</Keyword>\r\n  </PropertyGroup>\r\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.Default.props\" />\r\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\" Label=\"Configuration\">\r\n    <ConfigurationType>Application</ConfigurationType>\r\n    <PlatformToolset>v110_xp</PlatformToolset>\r\n    <CharacterSet>MultiByte</CharacterSet>\r\n    <WholeProgramOptimization>true</WholeProgramOptimization>\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\" Label=\"Configuration\">\r\n    <ConfigurationType>Application</ConfigurationType>\r\n    <PlatformToolset>v110</PlatformToolset>\r\n    <CharacterSet>MultiByte</CharacterSet>\r\n    <WholeProgramOptimization>true</WholeProgramOptimization>\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\" Label=\"Configuration\">\r\n    <ConfigurationType>Application</ConfigurationType>\r\n    <PlatformToolset>v110</PlatformToolset>\r\n    <CharacterSet>MultiByte</CharacterSet>\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\" Label=\"Configuration\">\r\n    <ConfigurationType>Application</ConfigurationType>\r\n    <PlatformToolset>v110</PlatformToolset>\r\n    <CharacterSet>MultiByte</CharacterSet>\r\n  </PropertyGroup>\r\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.props\" />\r\n  <ImportGroup Label=\"ExtensionSettings\">\r\n  </ImportGroup>\r\n  <ImportGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\" Label=\"PropertySheets\">\r\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\r\n  </ImportGroup>\r\n  <ImportGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\" Label=\"PropertySheets\">\r\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\r\n  </ImportGroup>\r\n  <ImportGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\" Label=\"PropertySheets\">\r\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\r\n  </ImportGroup>\r\n  <ImportGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\" Label=\"PropertySheets\">\r\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\r\n  </ImportGroup>\r\n  <PropertyGroup Label=\"UserMacros\" />\r\n  <PropertyGroup>\r\n    <_ProjectFileVersion>11.0.50727.1</_ProjectFileVersion>\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">\r\n    <OutDir>$(SolutionDir)$(Configuration)\\</OutDir>\r\n    <IntDir>$(Configuration)\\</IntDir>\r\n    <LinkIncremental>true</LinkIncremental>\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">\r\n    <LinkIncremental>true</LinkIncremental>\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">\r\n    <OutDir>$(SolutionDir)$(Configuration)\\</OutDir>\r\n    <IntDir>$(Configuration)\\</IntDir>\r\n    <LinkIncremental>false</LinkIncremental>\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">\r\n    <LinkIncremental>false</LinkIncremental>\r\n  </PropertyGroup>\r\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">\r\n    <ClCompile>\r\n      <Optimization>Disabled</Optimization>\r\n      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r\n      <MinimalRebuild>true</MinimalRebuild>\r\n      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r\n      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r\n      <PrecompiledHeader />\r\n      <WarningLevel>Level3</WarningLevel>\r\n      <DebugInformationFormat>EditAndContinue</DebugInformationFormat>\r\n    </ClCompile>\r\n    <Link>\r\n      <OutputFile>$(OutDir)..\\..\\bin\\$(ProjectName).exe</OutputFile>\r\n      <GenerateDebugInformation>true</GenerateDebugInformation>\r\n      <SubSystem>Console</SubSystem>\r\n      <TargetMachine>MachineX86</TargetMachine>\r\n      <StackReserveSize>2097152</StackReserveSize>\r\n    </Link>\r\n  </ItemDefinitionGroup>\r\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">\r\n    <ClCompile>\r\n      <Optimization>Disabled</Optimization>\r\n      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r\n      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r\n      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r\n      <PrecompiledHeader>\r\n      </PrecompiledHeader>\r\n      <WarningLevel>EnableAllWarnings</WarningLevel>\r\n      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r\n    </ClCompile>\r\n    <Link>\r\n      <OutputFile>$(OutDir)..\\..\\bin\\$(ProjectName).exe</OutputFile>\r\n      <GenerateDebugInformation>true</GenerateDebugInformation>\r\n      <SubSystem>Console</SubSystem>\r\n    </Link>\r\n  </ItemDefinitionGroup>\r\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">\r\n    <ClCompile>\r\n      <Optimization>MaxSpeed</Optimization>\r\n      <IntrinsicFunctions>true</IntrinsicFunctions>\r\n      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r\n      <RuntimeLibrary>MultiThreaded</RuntimeLibrary>\r\n      <StructMemberAlignment>Default</StructMemberAlignment>\r\n      <FunctionLevelLinking>true</FunctionLevelLinking>\r\n      <PrecompiledHeader />\r\n      <WarningLevel>Level3</WarningLevel>\r\n      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r\n      <CallingConvention>Cdecl</CallingConvention>\r\n      <FavorSizeOrSpeed>Neither</FavorSizeOrSpeed>\r\n      <DisableLanguageExtensions>false</DisableLanguageExtensions>\r\n    </ClCompile>\r\n    <Link>\r\n      <OutputFile>$(OutDir)..\\..\\bin\\$(ProjectName).exe</OutputFile>\r\n      <GenerateDebugInformation>true</GenerateDebugInformation>\r\n      <SubSystem>Console</SubSystem>\r\n      <OptimizeReferences>true</OptimizeReferences>\r\n      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r\n      <TargetMachine>MachineX86</TargetMachine>\r\n      <StackReserveSize>2097152</StackReserveSize>\r\n    </Link>\r\n  </ItemDefinitionGroup>\r\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">\r\n    <ClCompile>\r\n      <Optimization>MaxSpeed</Optimization>\r\n      <IntrinsicFunctions>true</IntrinsicFunctions>\r\n      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r\n      <RuntimeLibrary>MultiThreaded</RuntimeLibrary>\r\n      <StructMemberAlignment>Default</StructMemberAlignment>\r\n      <FunctionLevelLinking>true</FunctionLevelLinking>\r\n      <PrecompiledHeader>\r\n      </PrecompiledHeader>\r\n      <WarningLevel>Level3</WarningLevel>\r\n      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r\n      <CallingConvention>Cdecl</CallingConvention>\r\n    </ClCompile>\r\n    <Link>\r\n      <OutputFile>$(OutDir)..\\..\\..\\bin\\rpp64.exe</OutputFile>\r\n      <GenerateDebugInformation>true</GenerateDebugInformation>\r\n      <SubSystem>Console</SubSystem>\r\n      <OptimizeReferences>true</OptimizeReferences>\r\n      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r\n    </Link>\r\n  </ItemDefinitionGroup>\r\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.targets\" />\r\n  <ImportGroup Label=\"ExtensionTargets\">\r\n  </ImportGroup>\r\n</Project>"
  },
  {
    "path": "proj/rpp.vcxproj.filters",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<Project ToolsVersion=\"4.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\r\n  <ItemGroup>\r\n    <Filter Include=\"rpp\">\r\n      <UniqueIdentifier>{215fd1b1-6a2b-4c78-8b15-c31646a41608}</UniqueIdentifier>\r\n    </Filter>\r\n    <Filter Include=\"rlib\">\r\n      <UniqueIdentifier>{ab428ca6-6677-43d4-9996-7a8908450db1}</UniqueIdentifier>\r\n    </Filter>\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <ClInclude Include=\"..\\rpp\\rpp_def.h\">\r\n      <Filter>rpp</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"..\\rpp\\tanalyse.h\">\r\n      <Filter>rpp</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"..\\rpp\\tconf.h\">\r\n      <Filter>rpp</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"..\\rpp\\tsh.h\">\r\n      <Filter>rpp</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"..\\rpp\\tstruct.h\">\r\n      <Filter>rpp</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"..\\rpp\\tvm.h\">\r\n      <Filter>rpp</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"..\\rpp\\tvm_struct.h\">\r\n      <Filter>rpp</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"..\\rpp\\zadd.h\">\r\n      <Filter>rpp</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"..\\rpp\\zasm.h\">\r\n      <Filter>rpp</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"..\\rpp\\zautof.h\">\r\n      <Filter>rpp</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"..\\rpp\\zbin.h\">\r\n      <Filter>rpp</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"..\\rpp\\zclass.h\">\r\n      <Filter>rpp</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"..\\rpp\\zcontrol.h\">\r\n      <Filter>rpp</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"..\\rpp\\zctl.h\">\r\n      <Filter>rpp</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"..\\rpp\\zexp.h\">\r\n      <Filter>rpp</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"..\\rpp\\zfind.h\">\r\n      <Filter>rpp</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"..\\rpp\\zftl.h\">\r\n      <Filter>rpp</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"..\\rpp\\zmac.h\">\r\n      <Filter>rpp</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"..\\rpp\\zmatch.h\">\r\n      <Filter>rpp</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"..\\rpp\\zmemb.h\">\r\n      <Filter>rpp</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"..\\rpp\\zpre.h\">\r\n      <Filter>rpp</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"..\\rpp\\zread.h\">\r\n      <Filter>rpp</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"..\\rpp\\zsent.h\">\r\n      <Filter>rpp</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"..\\rpp\\zsrep.h\">\r\n      <Filter>rpp</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"..\\rlib\\ralgo.h\">\r\n      <Filter>rlib</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"..\\rlib\\rbase.h\">\r\n      <Filter>rlib</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"..\\rlib\\rbuf.h\">\r\n      <Filter>rlib</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"..\\rlib\\rclass.h\">\r\n      <Filter>rlib</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"..\\rlib\\rcode.h\">\r\n      <Filter>rlib</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"..\\rlib\\rdb.h\">\r\n      <Filter>rlib</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"..\\rlib\\rdic.h\">\r\n      <Filter>rlib</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"..\\rlib\\rdir.h\">\r\n      <Filter>rlib</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"..\\rlib\\rf.h\">\r\n      <Filter>rlib</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"..\\rlib\\rfile.h\">\r\n      <Filter>rlib</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"..\\rlib\\rhash.h\">\r\n      <Filter>rlib</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"..\\rlib\\rindex.h\">\r\n      <Filter>rlib</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"..\\rlib\\rlist.h\">\r\n      <Filter>rlib</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"..\\rlib\\rmutex.h\">\r\n      <Filter>rlib</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"..\\rlib\\rset.h\">\r\n      <Filter>rlib</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"..\\rlib\\rsock.h\">\r\n      <Filter>rlib</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"..\\rlib\\rstr.h\">\r\n      <Filter>rlib</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"..\\rlib\\rstrw.h\">\r\n      <Filter>rlib</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"..\\rlib\\rthread.h\">\r\n      <Filter>rlib</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"..\\rpp\\znasm.h\">\r\n      <Filter>rpp</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"..\\rpp\\zlambda.h\">\r\n      <Filter>rpp</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"..\\rpp\\zopt.h\">\r\n      <Filter>rpp</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"..\\rpp\\zjit.h\">\r\n      <Filter>rpp</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"..\\rpp\\zjitb.h\">\r\n      <Filter>rpp</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"..\\rpp\\zjiti.h\">\r\n      <Filter>rpp</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"..\\rpp\\zjitf.h\">\r\n      <Filter>rpp</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"..\\rpp\\talloc.h\">\r\n      <Filter>rpp</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"..\\rpp\\zmain.h\">\r\n      <Filter>rpp</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"..\\rpp\\zsuper.h\">\r\n      <Filter>rpp</Filter>\r\n    </ClInclude>\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <ClCompile Include=\"..\\rpp\\rpp.cpp\">\r\n      <Filter>rpp</Filter>\r\n    </ClCompile>\r\n  </ItemGroup>\r\n</Project>"
  },
  {
    "path": "proj/rpp_win/rpp_win.sln",
    "content": "﻿\r\nMicrosoft Visual Studio Solution File, Format Version 12.00\r\n# Visual Studio 2012\r\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"rpp_win\", \"rpp_win.vcxproj\", \"{D95F2BD0-54D7-4544-9902-FDFBEBBFFF5C}\"\r\nEndProject\r\nGlobal\r\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\r\n\t\tDebug|Win32 = Debug|Win32\r\n\t\tRelease|Win32 = Release|Win32\r\n\tEndGlobalSection\r\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\r\n\t\t{D95F2BD0-54D7-4544-9902-FDFBEBBFFF5C}.Debug|Win32.ActiveCfg = Debug|Win32\r\n\t\t{D95F2BD0-54D7-4544-9902-FDFBEBBFFF5C}.Debug|Win32.Build.0 = Debug|Win32\r\n\t\t{D95F2BD0-54D7-4544-9902-FDFBEBBFFF5C}.Release|Win32.ActiveCfg = Release|Win32\r\n\t\t{D95F2BD0-54D7-4544-9902-FDFBEBBFFF5C}.Release|Win32.Build.0 = Release|Win32\r\n\tEndGlobalSection\r\n\tGlobalSection(SolutionProperties) = preSolution\r\n\t\tHideSolutionNode = FALSE\r\n\tEndGlobalSection\r\nEndGlobal\r\n"
  },
  {
    "path": "proj/rpp_win/rpp_win.vcxproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<Project DefaultTargets=\"Build\" ToolsVersion=\"4.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\r\n  <ItemGroup Label=\"ProjectConfigurations\">\r\n    <ProjectConfiguration Include=\"Debug|Win32\">\r\n      <Configuration>Debug</Configuration>\r\n      <Platform>Win32</Platform>\r\n    </ProjectConfiguration>\r\n    <ProjectConfiguration Include=\"Release|Win32\">\r\n      <Configuration>Release</Configuration>\r\n      <Platform>Win32</Platform>\r\n    </ProjectConfiguration>\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <ClCompile Include=\"..\\..\\rpp\\rpp_win.cpp\" />\r\n  </ItemGroup>\r\n  <PropertyGroup Label=\"Globals\">\r\n    <ProjectGuid>{D95F2BD0-54D7-4544-9902-FDFBEBBFFF5C}</ProjectGuid>\r\n    <Keyword>Win32Proj</Keyword>\r\n    <RootNamespace>rpp_win</RootNamespace>\r\n  </PropertyGroup>\r\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.Default.props\" />\r\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\" Label=\"Configuration\">\r\n    <ConfigurationType>Application</ConfigurationType>\r\n    <UseDebugLibraries>true</UseDebugLibraries>\r\n    <PlatformToolset>v110_xp</PlatformToolset>\r\n    <CharacterSet>MultiByte</CharacterSet>\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\" Label=\"Configuration\">\r\n    <ConfigurationType>Application</ConfigurationType>\r\n    <UseDebugLibraries>false</UseDebugLibraries>\r\n    <PlatformToolset>v110_xp</PlatformToolset>\r\n    <WholeProgramOptimization>true</WholeProgramOptimization>\r\n    <CharacterSet>MultiByte</CharacterSet>\r\n  </PropertyGroup>\r\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.props\" />\r\n  <ImportGroup Label=\"ExtensionSettings\">\r\n  </ImportGroup>\r\n  <ImportGroup Label=\"PropertySheets\" Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">\r\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\r\n  </ImportGroup>\r\n  <ImportGroup Label=\"PropertySheets\" Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">\r\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\r\n  </ImportGroup>\r\n  <PropertyGroup Label=\"UserMacros\" />\r\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">\r\n    <LinkIncremental>true</LinkIncremental>\r\n    <OutDir>$(SolutionDir)$(Configuration)\\</OutDir>\r\n    <IntDir>$(Configuration)\\</IntDir>\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">\r\n    <LinkIncremental>false</LinkIncremental>\r\n    <OutDir>$(SolutionDir)$(Configuration)\\</OutDir>\r\n    <IntDir>$(Configuration)\\</IntDir>\r\n  </PropertyGroup>\r\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">\r\n    <ClCompile>\r\n      <PrecompiledHeader>\r\n      </PrecompiledHeader>\r\n      <WarningLevel>Level3</WarningLevel>\r\n      <Optimization>Disabled</Optimization>\r\n      <PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r\n      <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>\r\n    </ClCompile>\r\n    <Link>\r\n      <SubSystem>Windows</SubSystem>\r\n      <GenerateDebugInformation>true</GenerateDebugInformation>\r\n      <OutputFile>$(OutDir)..\\..\\..\\bin\\$(ProjectName).exe</OutputFile>\r\n      <StackReserveSize>2097152</StackReserveSize>\r\n    </Link>\r\n  </ItemDefinitionGroup>\r\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">\r\n    <ClCompile>\r\n      <WarningLevel>Level3</WarningLevel>\r\n      <PrecompiledHeader>\r\n      </PrecompiledHeader>\r\n      <Optimization>MaxSpeed</Optimization>\r\n      <FunctionLevelLinking>true</FunctionLevelLinking>\r\n      <IntrinsicFunctions>true</IntrinsicFunctions>\r\n      <PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r\n      <RuntimeLibrary>MultiThreaded</RuntimeLibrary>\r\n    </ClCompile>\r\n    <Link>\r\n      <SubSystem>Windows</SubSystem>\r\n      <GenerateDebugInformation>true</GenerateDebugInformation>\r\n      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r\n      <OptimizeReferences>true</OptimizeReferences>\r\n      <OutputFile>$(OutDir)..\\..\\..\\bin\\$(ProjectName).exe</OutputFile>\r\n      <StackReserveSize>2097152</StackReserveSize>\r\n    </Link>\r\n  </ItemDefinitionGroup>\r\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.targets\" />\r\n  <ImportGroup Label=\"ExtensionTargets\">\r\n  </ImportGroup>\r\n</Project>"
  },
  {
    "path": "proj/rpp_win/rpp_win.vcxproj.filters",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<Project ToolsVersion=\"4.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\r\n  <ItemGroup>\r\n    <Filter Include=\"源文件\">\r\n      <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>\r\n      <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>\r\n    </Filter>\r\n    <Filter Include=\"头文件\">\r\n      <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>\r\n      <Extensions>h;hpp;hxx;hm;inl;inc;xsd</Extensions>\r\n    </Filter>\r\n    <Filter Include=\"资源文件\">\r\n      <UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>\r\n      <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>\r\n    </Filter>\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <ClCompile Include=\"..\\..\\rpp\\rpp_win.cpp\">\r\n      <Filter>源文件</Filter>\r\n    </ClCompile>\r\n  </ItemGroup>\r\n</Project>"
  },
  {
    "path": "rlib/gbk.txt",
    "content": "uchar g_unicode[65536*2]={0,0,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,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,0,0,0,161,233,161,234,161,232,163,164,124,0,161,236,161,167,0,0,97,0,0,0,0,0,45,0,0,0,161,165,161,227,161,192,50,0,51,0,161,228,166,204,0,0,161,164,0,0,49,0,111,0,0,0,0,0,0,0,0,0,0,0,168,164,168,162,0,0,0,0,0,0,0,0,0,0,0,0,168,168,168,166,168,186,0,0,168,172,168,170,0,0,0,0,68,0,0,0,168,176,168,174,0,0,0,0,0,0,161,193,0,0,168,180,168,178,0,0,168,185,89,0,84,0,0,0,168,164,168,162,97,0,0,0,0,0,0,0,0,0,0,0,168,168,168,166,168,186,0,0,168,172,168,170,0,0,0,0,101,0,0,0,168,176,168,174,0,0,0,0,0,0,161,194,0,0,168,180,168,178,0,0,168,185,121,0,116,0,0,0,168,161,168,161,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,168,165,168,165,0,0,0,0,0,0,0,0,0,0,0,0,168,167,168,167,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,168,169,168,169,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,168,189,0,0,0,0,0,0,168,190,0,0,0,0,0,0,168,173,168,173,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,168,177,168,177,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,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,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,161,206,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,168,163,168,163,168,171,168,171,168,175,168,175,168,179,168,179,168,181,168,181,168,182,168,182,168,183,168,183,168,184,168,184,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,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,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,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,168,187,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,168,192,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,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,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,0,0,0,0,161,166,0,0,161,165,168,64,168,65,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,168,66,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,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,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,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,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,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,166,161,166,162,166,163,166,164,166,165,166,166,166,167,166,168,166,169,166,170,166,171,166,172,166,173,166,174,166,175,166,176,166,177,0,0,166,178,166,179,166,180,166,181,166,182,166,183,166,184,0,0,0,0,0,0,0,0,0,0,0,0,0,0,166,193,166,194,166,195,166,196,166,197,166,198,166,199,166,200,166,201,166,202,166,203,166,204,166,205,166,206,166,207,166,208,166,209,0,0,166,210,166,211,166,212,166,213,166,214,166,215,166,216,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,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,167,167,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,167,161,167,162,167,163,167,164,167,165,167,166,167,168,167,169,167,170,167,171,167,172,167,173,167,174,167,175,167,176,167,177,167,178,167,179,167,180,167,181,167,182,167,183,167,184,167,185,167,186,167,187,167,188,167,189,167,190,167,191,167,192,167,193,167,209,167,210,167,211,167,212,167,213,167,214,167,216,167,217,167,218,167,219,167,220,167,221,167,222,167,223,167,224,167,225,167,226,167,227,167,228,167,229,167,230,167,231,167,232,167,233,167,234,167,235,167,236,167,237,167,238,167,239,167,240,167,241,0,0,167,215,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,169,92,0,0,0,0,168,67,161,170,168,68,161,172,0,0,161,174,161,175,0,0,0,0,161,176,161,177,0,0,0,0,0,0,0,0,0,0,0,0,0,0,168,69,161,173,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,161,235,0,0,161,228,161,229,0,0,168,70,0,0,0,0,0,0,0,0,0,0,161,249,0,0,0,0,163,254,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,128,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,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,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,161,230,0,0,168,71,0,0,0,0,0,0,168,72,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,161,237,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,169,89,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,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,162,241,162,242,162,243,162,244,162,245,162,246,162,247,162,248,162,249,162,250,162,251,162,252,0,0,0,0,0,0,0,0,162,161,162,162,162,163,162,164,162,165,162,166,162,167,162,168,162,169,162,170,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,161,251,161,252,161,250,161,253,0,0,0,0,168,73,168,74,168,75,168,76,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,161,202,0,0,0,0,0,0,0,0,0,0,0,0,161,199,0,0,161,198,0,0,0,0,0,0,168,77,0,0,0,0,161,227,0,0,161,204,0,0,0,0,161,216,161,222,168,78,161,207,0,0,0,0,168,79,0,0,161,206,0,0,161,196,161,197,161,201,161,200,161,210,0,0,0,0,161,211,0,0,0,0,0,0,0,0,0,0,161,224,161,223,161,195,161,203,0,0,0,0,0,0,0,0,161,171,161,215,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,161,214,0,0,0,0,0,0,161,213,0,0,0,0,0,0,0,0,0,0,168,80,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,161,217,161,212,0,0,0,0,161,220,161,221,168,81,168,82,0,0,0,0,0,0,0,0,0,0,0,0,161,218,161,219,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,0,0,0,0,0,0,0,0,168,146,0,0,0,0,0,0,161,209,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,161,205,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,168,83,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,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,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,161,208,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,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,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,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,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,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,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,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,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,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,0,0,0,0,0,0,162,217,162,218,162,219,162,220,162,221,162,222,162,223,162,224,162,225,162,226,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,162,197,162,198,162,199,162,200,162,201,162,202,162,203,162,204,162,205,162,206,162,207,162,208,162,209,162,210,162,211,162,212,162,213,162,214,162,215,162,216,162,177,162,178,162,179,162,180,162,181,162,182,162,183,162,184,162,185,162,186,162,187,162,188,162,189,162,190,162,191,162,192,162,193,162,194,162,195,162,196,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,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,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,0,0,169,164,169,165,169,166,169,167,169,168,169,169,169,170,169,171,169,172,169,173,169,174,169,175,169,176,169,177,169,178,169,179,169,180,169,181,169,182,169,183,169,184,169,185,169,186,169,187,169,188,169,189,169,190,169,191,169,192,169,193,169,194,169,195,169,196,169,197,169,198,169,199,169,200,169,201,169,202,169,203,169,204,169,205,169,206,169,207,169,208,169,209,169,210,169,211,169,212,169,213,169,214,169,215,169,216,169,217,169,218,169,219,169,220,169,221,169,222,169,223,169,224,169,225,169,226,169,227,169,228,169,229,169,230,169,231,169,232,169,233,169,234,169,235,169,236,169,237,169,238,169,239,0,0,0,0,0,0,0,0,168,84,168,85,168,86,168,87,168,88,168,89,168,90,168,91,168,92,168,93,168,94,168,95,168,96,168,97,168,98,168,99,168,100,168,101,168,102,168,103,168,104,168,105,168,106,168,107,168,108,168,109,168,110,168,111,168,112,168,113,168,114,168,115,168,116,168,117,168,118,168,119,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,168,120,168,121,168,122,168,123,168,124,168,125,168,126,168,128,168,129,168,130,168,131,168,132,168,133,168,134,168,135,0,0,0,0,0,0,168,136,168,137,168,138,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,161,246,161,245,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,161,248,161,247,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,168,139,168,140,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,161,244,161,243,0,0,0,0,0,0,161,240,0,0,0,0,161,242,161,241,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,168,141,168,142,168,143,168,144,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,161,239,161,238,0,0,0,0,168,145,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,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,161,226,0,0,161,225,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,161,161,161,162,161,163,161,168,0,0,161,169,169,101,169,150,161,180,161,181,161,182,161,183,161,184,161,185,161,186,161,187,161,190,161,191,168,147,161,254,161,178,161,179,161,188,161,189,0,0,0,0,0,0,0,0,0,0,168,148,168,149,0,0,0,0,169,64,169,65,169,66,169,67,169,68,169,69,169,70,169,71,169,72,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,164,161,164,162,164,163,164,164,164,165,164,166,164,167,164,168,164,169,164,170,164,171,164,172,164,173,164,174,164,175,164,176,164,177,164,178,164,179,164,180,164,181,164,182,164,183,164,184,164,185,164,186,164,187,164,188,164,189,164,190,164,191,164,192,164,193,164,194,164,195,164,196,164,197,164,198,164,199,164,200,164,201,164,202,164,203,164,204,164,205,164,206,164,207,164,208,164,209,164,210,164,211,164,212,164,213,164,214,164,215,164,216,164,217,164,218,164,219,164,220,164,221,164,222,164,223,164,224,164,225,164,226,164,227,164,228,164,229,164,230,164,231,164,232,164,233,164,234,164,235,164,236,164,237,164,238,164,239,164,240,164,241,164,242,164,243,0,0,0,0,0,0,0,0,0,0,0,0,0,0,169,97,169,98,169,102,169,103,0,0,0,0,165,161,165,162,165,163,165,164,165,165,165,166,165,167,165,168,165,169,165,170,165,171,165,172,165,173,165,174,165,175,165,176,165,177,165,178,165,179,165,180,165,181,165,182,165,183,165,184,165,185,165,186,165,187,165,188,165,189,165,190,165,191,165,192,165,193,165,194,165,195,165,196,165,197,165,198,165,199,165,200,165,201,165,202,165,203,165,204,165,205,165,206,165,207,165,208,165,209,165,210,165,211,165,212,165,213,165,214,165,215,165,216,165,217,165,218,165,219,165,220,165,221,165,222,165,223,165,224,165,225,165,226,165,227,165,228,165,229,165,230,165,231,165,232,165,233,165,234,165,235,165,236,165,237,165,238,165,239,165,240,165,241,165,242,165,243,165,244,165,245,165,246,0,0,0,0,0,0,0,0,0,0,169,96,169,99,169,100,0,0,0,0,0,0,0,0,0,0,0,0,168,197,168,198,168,199,168,200,168,201,168,202,168,203,168,204,168,205,168,206,168,207,168,208,168,209,168,210,168,211,168,212,168,213,168,214,168,215,168,216,168,217,168,218,168,219,168,220,168,221,168,222,168,223,168,224,168,225,168,226,168,227,168,228,168,229,168,230,168,231,168,232,168,233,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,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,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,0,0,0,0,0,0,0,0,0,0,210,187,182,254,200,253,203,196,201,207,214,208,207,194,188,215,210,210,177,251,182,161,204,236,181,216,200,203,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,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,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,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,162,229,162,230,162,231,162,232,162,233,162,234,162,235,162,236,162,237,162,238,212,194,187,240,203,174,196,190,189,240,205,193,200,213,169,90,211,208,201,231,195,251,204,216,178,198,215,163,192,205,180,250,186,244,209,167,188,224,198,243,215,202,208,173,188,192,208,221,215,212,214,193,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,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,210,187,182,254,200,253,203,196,206,229,193,249,198,223,176,203,190,197,202,174,212,194,187,240,203,174,196,190,189,240,205,193,200,213,214,234,211,208,201,231,195,251,204,216,178,198,215,163,192,205,195,216,196,208,197,174,202,202,211,197,0,0,215,162,207,238,208,221,208,180,169,73,0,0,0,0,0,0,0,0,0,0,210,189,215,218,209,167,188,224,198,243,215,202,208,173,210,185,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,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,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,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,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,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,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,169,74,169,75,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,169,76,169,77,169,78,0,0,0,0,169,79,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,0,0,169,80,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,169,81,0,0,0,0,169,82,169,83,0,0,0,0,169,84,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,210,187,182,161,129,64,198,223,129,65,129,66,129,67,205,242,213,201,200,253,201,207,207,194,216,162,178,187,211,235,129,68,216,164,179,243,129,69,215,168,199,210,216,167,202,192,129,70,199,240,177,251,210,181,180,212,182,171,203,191,216,169,129,71,129,72,129,73,182,170,129,74,193,189,209,207,129,75,201,165,216,173,129,76,184,246,209,190,227,220,214,208,129,77,129,78,183,225,129,79,180,174,129,80,193,217,129,81,216,188,129,82,205,232,181,164,206,170,214,247,129,83,192,246,190,217,216,175,129,84,129,85,129,86,196,203,129,87,190,195,129,88,216,177,195,180,210,229,129,89,214,174,206,218,213,167,186,245,183,166,192,214,129,90,198,185,197,210,199,199,129,91,185,212,129,92,179,203,210,210,129,93,129,94,216,191,190,197,198,242,210,178,207,176,207,231,129,95,129,96,129,97,129,98,202,233,129,99,129,100,216,192,129,101,129,102,129,103,129,104,129,105,129,106,194,242,194,210,129,107,200,233,129,108,129,109,129,110,129,111,129,112,129,113,129,114,129,115,129,116,129,117,199,172,129,118,129,119,129,120,129,121,129,122,129,123,129,124,193,203,129,125,211,232,213,249,129,126,202,194,182,254,216,161,211,218,191,247,129,128,212,198,187,165,216,193,206,229,190,174,129,129,129,130,216,168,129,131,209,199,208,169,129,132,129,133,129,134,216,189,217,239,205,246,191,186,129,135,189,187,186,165,210,224,178,250,186,224,196,182,129,136,207,237,190,169,205,164,193,193,129,137,129,138,129,139,199,215,217,241,129,140,217,244,129,141,129,142,129,143,129,144,200,203,216,233,129,145,129,146,129,147,210,218,202,178,200,202,216,236,216,234,216,198,189,246,198,205,179,240,129,148,216,235,189,241,189,233,129,149,200,212,180,211,129,150,129,151,194,216,129,152,178,214,215,208,202,203,203,251,213,204,184,182,207,201,129,153,129,154,129,155,217,218,216,240,199,170,129,156,216,238,129,157,180,250,193,238,210,212,129,158,129,159,216,237,129,160,210,199,216,239,195,199,129,161,129,162,129,163,209,246,129,164,214,217,216,242,129,165,216,245,188,254,188,219,129,166,129,167,129,168,200,206,129,169,183,221,129,170,183,194,129,171,198,243,129,172,129,173,129,174,129,175,129,176,129,177,129,178,216,248,210,193,129,179,129,180,206,233,188,191,183,252,183,165,208,221,129,181,129,182,129,183,129,184,129,185,214,218,211,197,187,239,187,225,216,241,129,186,129,187,201,161,206,176,180,171,129,188,216,243,129,189,201,203,216,246,194,215,216,247,129,190,129,191,206,177,216,249,129,192,129,193,129,194,178,174,185,192,129,195,217,163,129,196,176,233,129,197,193,230,129,198,201,236,129,199,203,197,129,200,203,198,217,164,129,201,129,202,129,203,129,204,129,205,181,232,129,206,129,207,181,171,129,208,129,209,129,210,129,211,129,212,129,213,206,187,181,205,215,161,215,244,211,211,129,214,204,229,129,215,186,206,129,216,217,162,217,220,211,224,216,253,183,240,215,247,216,254,216,250,217,161,196,227,129,217,129,218,211,182,216,244,217,221,129,219,216,251,129,220,197,229,129,221,129,222,192,208,129,223,129,224,209,240,176,219,129,225,129,226,188,209,217,166,129,227,217,165,129,228,129,229,129,230,129,231,217,172,217,174,129,232,217,171,202,185,129,233,129,234,129,235,217,169,214,182,129,236,129,237,129,238,179,222,217,168,129,239,192,253,129,240,202,204,129,241,217,170,129,242,217,167,129,243,129,244,217,176,129,245,129,246,182,177,129,247,129,248,129,249,185,169,129,250,210,192,129,251,129,252,207,192,129,253,129,254,194,194,130,64,189,196,213,236,178,224,199,200,191,235,217,173,130,65,217,175,130,66,206,234,186,238,130,67,130,68,130,69,130,70,130,71,199,214,130,72,130,73,130,74,130,75,130,76,130,77,130,78,130,79,130,80,177,227,130,81,130,82,130,83,180,217,182,237,217,180,130,84,130,85,130,86,130,87,191,161,130,88,130,89,130,90,217,222,199,206,192,254,217,184,130,91,130,92,130,93,130,94,130,95,203,215,183,253,130,96,217,181,130,97,217,183,177,163,211,225,217,185,130,98,208,197,130,99,217,182,130,100,130,101,217,177,130,102,217,178,193,169,217,179,130,103,130,104,188,243,208,222,184,169,130,105,190,227,130,106,217,189,130,107,130,108,130,109,130,110,217,186,130,111,176,179,130,112,130,113,130,114,217,194,130,115,130,116,130,117,130,118,130,119,130,120,130,121,130,122,130,123,130,124,130,125,130,126,130,128,217,196,177,182,130,129,217,191,130,130,130,131,181,185,130,132,190,243,130,133,130,134,130,135,204,200,186,242,210,208,130,136,217,195,130,137,130,138,189,232,130,139,179,171,130,140,130,141,130,142,217,197,190,235,130,143,217,198,217,187,196,223,130,144,217,190,217,193,217,192,130,145,130,146,130,147,130,148,130,149,130,150,130,151,130,152,130,153,130,154,130,155,213,174,130,156,214,181,130,157,199,227,130,158,130,159,130,160,130,161,217,200,130,162,130,163,130,164,188,217,217,202,130,165,130,166,130,167,217,188,130,168,217,203,198,171,130,169,130,170,130,171,130,172,130,173,217,201,130,174,130,175,130,176,130,177,215,246,130,178,205,163,130,179,130,180,130,181,130,182,130,183,130,184,130,185,130,186,189,161,130,187,130,188,130,189,130,190,130,191,130,192,217,204,130,193,130,194,130,195,130,196,130,197,130,198,130,199,130,200,130,201,197,188,205,181,130,202,130,203,130,204,217,205,130,205,130,206,217,199,179,165,191,254,130,207,130,208,130,209,130,210,184,181,130,211,130,212,192,252,130,213,130,214,130,215,130,216,176,248,130,217,130,218,130,219,130,220,130,221,130,222,130,223,130,224,130,225,130,226,130,227,130,228,130,229,130,230,130,231,130,232,130,233,130,234,130,235,130,236,130,237,180,246,130,238,217,206,130,239,217,207,180,162,217,208,130,240,130,241,180,223,130,242,130,243,130,244,130,245,130,246,176,193,130,247,130,248,130,249,130,250,130,251,130,252,130,253,217,209,201,181,130,254,131,64,131,65,131,66,131,67,131,68,131,69,131,70,131,71,131,72,131,73,131,74,131,75,131,76,131,77,131,78,131,79,131,80,131,81,207,241,131,82,131,83,131,84,131,85,131,86,131,87,217,210,131,88,131,89,131,90,193,197,131,91,131,92,131,93,131,94,131,95,131,96,131,97,131,98,131,99,131,100,131,101,217,214,201,174,131,102,131,103,131,104,131,105,217,213,217,212,217,215,131,106,131,107,131,108,131,109,203,219,131,110,189,169,131,111,131,112,131,113,131,114,131,115,198,167,131,116,131,117,131,118,131,119,131,120,131,121,131,122,131,123,131,124,131,125,217,211,217,216,131,126,131,128,131,129,217,217,131,130,131,131,131,132,131,133,131,134,131,135,200,229,131,136,131,137,131,138,131,139,131,140,131,141,131,142,131,143,131,144,131,145,131,146,131,147,131,148,131,149,192,220,131,150,131,151,131,152,131,153,131,154,131,155,131,156,131,157,131,158,131,159,131,160,131,161,131,162,131,163,131,164,131,165,131,166,131,167,131,168,131,169,131,170,131,171,131,172,131,173,131,174,131,175,131,176,131,177,131,178,182,249,216,163,212,202,131,179,212,170,208,214,179,228,213,215,131,180,207,200,185,226,131,181,191,203,131,182,195,226,131,183,131,184,131,185,182,210,131,186,131,187,205,195,217,238,217,240,131,188,131,189,131,190,181,179,131,191,182,181,131,192,131,193,131,194,131,195,131,196,190,164,131,197,131,198,200,235,131,199,131,200,200,171,131,201,131,202,176,203,185,171,193,249,217,226,131,203,192,188,185,178,131,204,185,216,208,203,177,248,198,228,190,223,181,228,215,200,131,205,209,248,188,230,202,222,131,206,131,207,188,189,217,230,216,231,131,208,131,209,196,218,131,210,131,211,184,212,200,189,131,212,131,213,178,225,212,217,131,214,131,215,131,216,131,217,195,176,131,218,131,219,195,225,218,162,200,223,131,220,208,180,131,221,190,252,197,169,131,222,131,223,131,224,185,218,131,225,218,163,131,226,212,169,218,164,131,227,131,228,131,229,131,230,131,231,217,251,182,172,131,232,131,233,183,235,177,249,217,252,179,229,190,246,131,234,191,246,210,177,192,228,131,235,131,236,131,237,182,179,217,254,217,253,131,238,131,239,190,187,131,240,131,241,131,242,198,224,131,243,215,188,218,161,131,244,193,185,131,245,181,242,193,232,131,246,131,247,188,245,131,248,180,213,131,249,131,250,131,251,131,252,131,253,131,254,132,64,132,65,132,66,193,221,132,67,196,253,132,68,132,69,188,184,183,178,132,70,132,71,183,239,132,72,132,73,132,74,132,75,132,76,132,77,217,236,132,78,198,190,132,79,191,173,187,203,132,80,132,81,181,202,132,82,219,201,208,215,132,83,205,185,176,188,179,246,187,247,219,202,186,175,132,84,212,228,181,182,181,243,216,214,200,208,132,85,132,86,183,214,199,208,216,215,132,87,191,175,132,88,132,89,219,187,216,216,132,90,132,91,208,204,187,174,132,92,132,93,132,94,235,190,193,208,193,245,212,242,184,213,180,180,132,95,179,245,132,96,132,97,201,190,132,98,132,99,132,100,197,208,132,101,132,102,132,103,197,217,192,251,132,104,177,240,132,105,216,217,185,206,132,106,181,189,132,107,132,108,216,218,132,109,132,110,214,198,203,162,200,175,201,178,180,204,191,204,132,111,185,244,132,112,216,219,216,220,182,231,188,193,204,234,132,113,132,114,132,115,132,116,132,117,132,118,207,247,132,119,216,221,199,176,132,120,132,121,185,208,189,163,132,122,132,123,204,222,132,124,198,202,132,125,132,126,132,128,132,129,132,130,216,224,132,131,216,222,132,132,132,133,216,223,132,134,132,135,132,136,176,254,132,137,190,231,132,138,202,163,188,244,132,139,132,140,132,141,132,142,184,177,132,143,132,144,184,238,132,145,132,146,132,147,132,148,132,149,132,150,132,151,132,152,132,153,132,154,216,226,132,155,189,203,132,156,216,228,216,227,132,157,132,158,132,159,132,160,132,161,197,252,132,162,132,163,132,164,132,165,132,166,132,167,132,168,216,229,132,169,132,170,216,230,132,171,132,172,132,173,132,174,132,175,132,176,132,177,193,166,132,178,200,176,176,236,185,166,188,211,206,241,219,189,193,211,132,179,132,180,132,181,132,182,182,175,214,250,197,172,189,217,219,190,219,191,132,183,132,184,132,185,192,248,190,162,192,205,132,186,132,187,132,188,132,189,132,190,132,191,132,192,132,193,132,194,132,195,219,192,202,198,132,196,132,197,132,198,178,170,132,199,132,200,132,201,211,194,132,202,195,227,132,203,209,171,132,204,132,205,132,206,132,207,219,194,132,208,192,213,132,209,132,210,132,211,219,195,132,212,191,177,132,213,132,214,132,215,132,216,132,217,132,218,196,188,132,219,132,220,132,221,132,222,199,218,132,223,132,224,132,225,132,226,132,227,132,228,132,229,132,230,132,231,132,232,132,233,219,196,132,234,132,235,132,236,132,237,132,238,132,239,132,240,132,241,217,232,201,215,132,242,132,243,132,244,185,180,206,240,212,200,132,245,132,246,132,247,132,248,176,252,180,210,132,249,208,217,132,250,132,251,132,252,132,253,217,233,132,254,222,203,217,235,133,64,133,65,133,66,133,67,216,176,187,175,177,177,133,68,179,215,216,206,133,69,133,70,212,209,133,71,133,72,189,179,191,239,133,73,207,187,133,74,133,75,216,208,133,76,133,77,133,78,183,203,133,79,133,80,133,81,216,209,133,82,133,83,133,84,133,85,133,86,133,87,133,88,133,89,133,90,133,91,198,165,199,248,210,189,133,92,133,93,216,210,196,228,133,94,202,174,133,95,199,167,133,96,216,166,133,97,201,253,206,231,187,220,176,235,133,98,133,99,133,100,187,170,208,173,133,101,177,176,215,228,215,191,133,102,181,165,194,244,196,207,133,103,133,104,178,169,133,105,178,183,133,106,177,229,223,178,213,188,191,168,194,172,216,213,194,177,133,107,216,212,206,212,133,108,218,224,133,109,206,192,133,110,133,111,216,180,195,174,211,161,206,163,133,112,188,180,200,180,194,209,133,113,190,237,208,182,133,114,218,225,133,115,133,116,133,117,133,118,199,228,133,119,133,120,179,167,133,121,182,242,204,252,192,250,133,122,133,123,192,247,133,124,209,185,209,225,216,199,133,125,133,126,133,128,133,129,133,130,133,131,133,132,178,222,133,133,133,134,192,229,133,135,186,241,133,136,133,137,216,200,133,138,212,173,133,139,133,140,207,225,216,201,133,141,216,202,207,195,133,142,179,248,190,199,133,143,133,144,133,145,133,146,216,203,133,147,133,148,133,149,133,150,133,151,133,152,133,153,219,204,133,154,133,155,133,156,133,157,200,165,133,158,133,159,133,160,207,216,133,161,200,254,178,206,133,162,133,163,133,164,133,165,133,166,211,214,178,230,188,176,211,209,203,171,183,180,133,167,133,168,133,169,183,162,133,170,133,171,202,229,133,172,200,161,202,220,177,228,208,240,133,173,197,209,133,174,133,175,133,176,219,197,181,254,133,177,133,178,191,218,185,197,190,228,193,237,133,179,223,182,223,181,214,187,189,208,213,217,176,200,182,163,191,201,204,168,223,179,202,183,211,210,133,180,216,207,210,182,186,197,203,190,204,190,133,181,223,183,181,240,223,180,133,182,133,183,133,184,211,245,133,185,179,212,184,247,133,186,223,186,133,187,186,207,188,170,181,245,133,188,205,172,195,251,186,243,192,244,205,194,207,242,223,184,207,197,133,189,194,192,223,185,194,240,133,190,133,191,133,192,190,253,133,193,193,223,205,204,210,247,183,205,223,193,133,194,223,196,133,195,133,196,183,241,176,201,182,214,183,212,133,197,186,172,204,253,191,212,203,177,198,244,133,198,214,168,223,197,133,199,206,226,179,179,133,200,133,201,206,252,180,181,133,202,206,199,186,240,133,203,206,225,133,204,209,189,133,205,133,206,223,192,133,207,133,208,180,244,133,209,179,202,133,210,184,230,223,187,133,211,133,212,133,213,133,214,196,197,133,215,223,188,223,189,223,190,197,187,223,191,223,194,212,177,223,195,133,216,199,186,206,216,133,217,133,218,133,219,133,220,133,221,196,216,133,222,223,202,133,223,223,207,133,224,214,220,133,225,133,226,133,227,133,228,133,229,133,230,133,231,133,232,223,201,223,218,206,182,133,233,186,199,223,206,223,200,197,222,133,234,133,235,201,235,186,244,195,252,133,236,133,237,190,215,133,238,223,198,133,239,223,205,133,240,197,216,133,241,133,242,133,243,133,244,213,166,186,205,133,245,190,204,211,189,184,192,133,246,214,228,133,247,223,199,185,190,191,167,133,248,133,249,193,252,223,203,223,204,133,250,223,208,133,251,133,252,133,253,133,254,134,64,223,219,223,229,134,65,223,215,223,214,215,201,223,227,223,228,229,235,210,167,223,210,134,66,191,169,134,67,212,219,134,68,191,200,223,212,134,69,134,70,134,71,207,204,134,72,134,73,223,221,134,74,209,202,134,75,223,222,176,167,198,183,223,211,134,76,186,229,134,77,182,223,205,219,185,254,212,213,134,78,134,79,223,223,207,236,176,165,223,231,223,209,209,198,223,213,223,216,223,217,223,220,134,80,187,169,134,81,223,224,223,225,134,82,223,226,223,230,223,232,211,180,134,83,134,84,134,85,134,86,134,87,184,231,197,182,223,234,201,218,193,168,196,196,134,88,134,89,191,222,207,248,134,90,134,91,134,92,213,220,223,238,134,93,134,94,134,95,134,96,134,97,134,98,178,184,134,99,186,223,223,236,134,100,219,193,134,101,209,228,134,102,134,103,134,104,134,105,203,244,180,189,134,106,176,166,134,107,134,108,134,109,134,110,134,111,223,241,204,198,223,242,134,112,134,113,223,237,134,114,134,115,134,116,134,117,134,118,134,119,223,233,134,120,134,121,134,122,134,123,223,235,134,124,223,239,223,240,187,189,134,125,134,126,223,243,134,128,134,129,223,244,134,130,187,163,134,131,202,219,206,168,224,167,179,170,134,132,224,166,134,133,134,134,134,135,224,161,134,136,134,137,134,138,134,139,223,254,134,140,205,217,223,252,134,141,223,250,134,142,191,208,215,196,134,143,201,204,134,144,134,145,223,248,176,161,134,146,134,147,134,148,134,149,134,150,223,253,134,151,134,152,134,153,134,154,223,251,224,162,134,155,134,156,134,157,134,158,134,159,224,168,134,160,134,161,134,162,134,163,183,200,134,164,134,165,198,161,201,182,192,178,223,245,134,166,134,167,197,190,134,168,216,196,223,249,196,246,134,169,134,170,134,171,134,172,134,173,134,174,224,163,224,164,224,165,208,165,134,175,134,176,224,180,204,228,134,177,224,177,134,178,191,166,224,175,206,185,224,171,201,198,134,179,134,180,192,174,224,174,186,237,186,176,224,169,134,181,134,182,134,183,223,246,134,184,224,179,134,185,134,186,224,184,134,187,134,188,134,189,180,173,224,185,134,190,134,191,207,178,186,200,134,192,224,176,134,193,134,194,134,195,134,196,134,197,134,198,134,199,208,250,134,200,134,201,134,202,134,203,134,204,134,205,134,206,134,207,134,208,224,172,134,209,212,251,134,210,223,247,134,211,197,231,134,212,224,173,134,213,211,247,134,214,224,182,224,183,134,215,134,216,134,217,134,218,134,219,224,196,208,225,134,220,134,221,134,222,224,188,134,223,134,224,224,201,224,202,134,225,134,226,134,227,224,190,224,170,201,164,224,193,134,228,224,178,134,229,134,230,134,231,134,232,134,233,202,200,224,195,134,234,224,181,134,235,206,203,134,236,203,195,224,205,224,198,224,194,134,237,224,203,134,238,224,186,224,191,224,192,134,239,134,240,224,197,134,241,134,242,224,199,224,200,134,243,224,204,134,244,224,187,134,245,134,246,134,247,134,248,134,249,203,212,224,213,134,250,224,214,224,210,134,251,134,252,134,253,134,254,135,64,135,65,224,208,188,206,135,66,135,67,224,209,135,68,184,194,216,197,135,69,135,70,135,71,135,72,135,73,135,74,135,75,135,76,208,234,135,77,135,78,194,239,135,79,135,80,224,207,224,189,135,81,135,82,135,83,224,212,224,211,135,84,135,85,224,215,135,86,135,87,135,88,135,89,224,220,224,216,135,90,135,91,135,92,214,246,179,176,135,93,215,236,135,94,203,187,135,95,135,96,224,218,135,97,206,251,135,98,135,99,135,100,186,217,135,101,135,102,135,103,135,104,135,105,135,106,135,107,135,108,135,109,135,110,135,111,135,112,224,225,224,221,210,173,135,113,135,114,135,115,135,116,135,117,224,226,135,118,135,119,224,219,224,217,224,223,135,120,135,121,224,224,135,122,135,123,135,124,135,125,135,126,224,222,135,128,224,228,135,129,135,130,135,131,198,247,216,172,212,235,224,230,202,201,135,132,135,133,135,134,135,135,224,229,135,136,135,137,135,138,135,139,184,193,135,140,135,141,135,142,135,143,224,231,224,232,135,144,135,145,135,146,135,147,135,148,135,149,135,150,135,151,224,233,224,227,135,152,135,153,135,154,135,155,135,156,135,157,135,158,186,191,204,231,135,159,135,160,135,161,224,234,135,162,135,163,135,164,135,165,135,166,135,167,135,168,135,169,135,170,135,171,135,172,135,173,135,174,135,175,135,176,207,249,135,177,135,178,135,179,135,180,135,181,135,182,135,183,135,184,135,185,135,186,135,187,224,235,135,188,135,189,135,190,135,191,135,192,135,193,135,194,200,194,135,195,135,196,135,197,135,198,189,192,135,199,135,200,135,201,135,202,135,203,135,204,135,205,135,206,135,207,135,208,135,209,135,210,135,211,196,210,135,212,135,213,135,214,135,215,135,216,135,217,135,218,135,219,135,220,224,236,135,221,135,222,224,237,135,223,135,224,199,244,203,196,135,225,224,238,187,216,216,182,210,242,224,239,205,197,135,226,182,218,135,227,135,228,135,229,135,230,135,231,135,232,224,241,135,233,212,176,135,234,135,235,192,167,180,209,135,236,135,237,206,167,224,240,135,238,135,239,135,240,224,242,185,204,135,241,135,242,185,250,205,188,224,243,135,243,135,244,135,245,198,212,224,244,135,246,212,178,135,247,200,166,224,246,224,245,135,248,135,249,135,250,135,251,135,252,135,253,135,254,136,64,136,65,136,66,136,67,136,68,136,69,136,70,136,71,136,72,136,73,224,247,136,74,136,75,205,193,136,76,136,77,136,78,202,165,136,79,136,80,136,81,136,82,212,218,219,215,219,217,136,83,219,216,185,231,219,220,219,221,181,216,136,84,136,85,219,218,136,86,136,87,136,88,136,89,136,90,219,219,179,161,219,223,136,91,136,92,187,248,136,93,214,183,136,94,219,224,136,95,136,96,136,97,136,98,190,249,136,99,136,100,183,187,136,101,219,208,204,174,191,178,187,181,215,248,191,211,136,102,136,103,136,104,136,105,136,106,191,233,136,107,136,108,188,225,204,179,219,222,176,211,206,235,183,216,215,185,198,194,136,109,136,110,192,164,136,111,204,185,136,112,219,231,219,225,198,186,219,227,136,113,219,232,136,114,197,247,136,115,136,116,136,117,219,234,136,118,136,119,219,233,191,192,136,120,136,121,136,122,219,230,219,229,136,123,136,124,136,125,136,126,136,128,180,185,192,172,194,162,219,226,219,228,136,129,136,130,136,131,136,132,208,205,219,237,136,133,136,134,136,135,136,136,136,137,192,221,219,242,136,138,136,139,136,140,136,141,136,142,136,143,136,144,182,226,136,145,136,146,136,147,136,148,219,243,219,210,185,184,212,171,219,236,136,149,191,209,219,240,136,150,219,209,136,151,181,230,136,152,219,235,191,229,136,153,136,154,136,155,219,238,136,156,219,241,136,157,136,158,136,159,219,249,136,160,136,161,136,162,136,163,136,164,136,165,136,166,136,167,136,168,185,161,176,163,136,169,136,170,136,171,136,172,136,173,136,174,136,175,194,241,136,176,136,177,179,199,219,239,136,178,136,179,219,248,136,180,198,210,219,244,136,181,136,182,219,245,219,247,219,246,136,183,136,184,219,254,136,185,211,242,178,186,136,186,136,187,136,188,219,253,136,189,136,190,136,191,136,192,136,193,136,194,136,195,136,196,220,164,136,197,219,251,136,198,136,199,136,200,136,201,219,250,136,202,136,203,136,204,219,252,197,224,187,249,136,205,136,206,220,163,136,207,136,208,220,165,136,209,204,195,136,210,136,211,136,212,182,209,221,192,136,213,136,214,136,215,220,161,136,216,220,162,136,217,136,218,136,219,199,181,136,220,136,221,136,222,182,233,136,223,136,224,136,225,220,167,136,226,136,227,136,228,136,229,220,166,136,230,220,169,177,164,136,231,136,232,181,204,136,233,136,234,136,235,136,236,136,237,191,176,136,238,136,239,136,240,136,241,136,242,209,223,136,243,136,244,136,245,136,246,182,194,136,247,136,248,136,249,136,250,136,251,136,252,136,253,136,254,137,64,137,65,137,66,137,67,137,68,137,69,220,168,137,70,137,71,137,72,137,73,137,74,137,75,137,76,203,250,235,243,137,77,137,78,137,79,203,220,137,80,137,81,203,254,137,82,137,83,137,84,204,193,137,85,137,86,137,87,137,88,137,89,200,251,137,90,137,91,137,92,137,93,137,94,137,95,220,170,137,96,137,97,137,98,137,99,137,100,204,238,220,171,137,101,137,102,137,103,137,104,137,105,137,106,137,107,137,108,137,109,137,110,137,111,137,112,137,113,137,114,137,115,137,116,137,117,219,211,137,118,220,175,220,172,137,119,190,179,137,120,202,251,137,121,137,122,137,123,220,173,137,124,137,125,137,126,137,128,137,129,137,130,137,131,137,132,201,202,196,185,137,133,137,134,137,135,137,136,137,137,199,189,220,174,137,138,137,139,137,140,212,246,208,230,137,141,137,142,137,143,137,144,137,145,137,146,137,147,137,148,196,171,182,213,137,149,137,150,137,151,137,152,137,153,137,154,137,155,137,156,137,157,137,158,137,159,137,160,137,161,137,162,137,163,137,164,137,165,137,166,219,212,137,167,137,168,137,169,137,170,177,218,137,171,137,172,137,173,219,213,137,174,137,175,137,176,137,177,137,178,137,179,137,180,137,181,137,182,137,183,137,184,219,214,137,185,137,186,137,187,186,190,137,188,137,189,137,190,137,191,137,192,137,193,137,194,137,195,137,196,137,197,137,198,137,199,137,200,137,201,200,192,137,202,137,203,137,204,137,205,137,206,137,207,202,191,200,201,137,208,215,179,137,209,201,249,137,210,137,211,191,199,137,212,137,213,186,248,137,214,137,215,210,188,137,216,137,217,137,218,137,219,137,220,137,221,137,222,137,223,226,186,137,224,180,166,137,225,137,226,177,184,137,227,137,228,137,229,137,230,137,231,184,180,137,232,207,196,137,233,137,234,137,235,137,236,217,231,207,166,205,226,137,237,137,238,217,237,182,224,137,239,210,185,137,240,137,241,185,187,137,242,137,243,137,244,137,245,226,185,226,183,137,246,180,243,137,247,204,236,204,171,183,242,137,248,216,178,209,235,186,187,137,249,202,167,137,250,137,251,205,183,137,252,137,253,210,196,191,228,188,208,182,225,137,254,222,197,138,64,138,65,138,66,138,67,222,198,219,188,138,68,209,217,138,69,138,70,198,230,196,206,183,238,138,71,183,220,138,72,138,73,191,252,215,224,138,74,198,245,138,75,138,76,177,188,222,200,189,177,204,215,222,202,138,77,222,201,138,78,138,79,138,80,138,81,138,82,181,236,138,83,201,221,138,84,138,85,176,194,138,86,138,87,138,88,138,89,138,90,138,91,138,92,138,93,138,94,138,95,138,96,138,97,138,98,197,174,197,171,138,99,196,204,138,100,188,233,203,253,138,101,138,102,138,103,186,195,138,104,138,105,138,106,229,249,200,231,229,250,205,253,138,107,215,177,184,190,194,232,138,108,200,209,138,109,138,110,229,251,138,111,138,112,138,113,138,114,182,202,188,203,138,115,138,116,209,253,230,161,138,117,195,238,138,118,138,119,138,120,138,121,230,164,138,122,138,123,138,124,138,125,229,254,230,165,205,215,138,126,138,128,183,193,229,252,229,253,230,163,138,129,138,130,196,221,230,168,138,131,138,132,230,167,138,133,138,134,138,135,138,136,138,137,138,138,195,195,138,139,198,222,138,140,138,141,230,170,138,142,138,143,138,144,138,145,138,146,138,147,138,148,196,183,138,149,138,150,138,151,230,162,202,188,138,152,138,153,138,154,138,155,189,227,185,195,230,166,208,213,206,175,138,156,138,157,230,169,230,176,138,158,210,166,138,159,189,170,230,173,138,160,138,161,138,162,138,163,138,164,230,175,138,165,192,209,138,166,138,167,210,204,138,168,138,169,138,170,188,167,138,171,138,172,138,173,138,174,138,175,138,176,138,177,138,178,138,179,138,180,138,181,138,182,230,177,138,183,210,246,138,184,138,185,138,186,215,203,138,187,205,254,138,188,205,222,194,166,230,171,230,172,189,191,230,174,230,179,138,189,138,190,230,178,138,191,138,192,138,193,138,194,230,182,138,195,230,184,138,196,138,197,138,198,138,199,196,239,138,200,138,201,138,202,196,200,138,203,138,204,190,234,201,239,138,205,138,206,230,183,138,207,182,240,138,208,138,209,138,210,195,228,138,211,138,212,138,213,138,214,138,215,138,216,138,217,211,233,230,180,138,218,230,181,138,219,200,162,138,220,138,221,138,222,138,223,138,224,230,189,138,225,138,226,138,227,230,185,138,228,138,229,138,230,138,231,138,232,198,197,138,233,138,234,205,241,230,187,138,235,138,236,138,237,138,238,138,239,138,240,138,241,138,242,138,243,138,244,230,188,138,245,138,246,138,247,138,248,187,233,138,249,138,250,138,251,138,252,138,253,138,254,139,64,230,190,139,65,139,66,139,67,139,68,230,186,139,69,139,70,192,183,139,71,139,72,139,73,139,74,139,75,139,76,139,77,139,78,139,79,211,164,230,191,201,244,230,195,139,80,139,81,230,196,139,82,139,83,139,84,139,85,208,246,139,86,139,87,139,88,139,89,139,90,139,91,139,92,139,93,139,94,139,95,139,96,139,97,139,98,139,99,139,100,139,101,139,102,139,103,195,189,139,104,139,105,139,106,139,107,139,108,139,109,139,110,195,196,230,194,139,111,139,112,139,113,139,114,139,115,139,116,139,117,139,118,139,119,139,120,139,121,139,122,139,123,139,124,230,193,139,125,139,126,139,128,139,129,139,130,139,131,139,132,230,199,207,177,139,133,235,244,139,134,139,135,230,202,139,136,139,137,139,138,139,139,139,140,230,197,139,141,139,142,188,222,201,169,139,143,139,144,139,145,139,146,139,147,139,148,188,181,139,149,139,150,207,211,139,151,139,152,139,153,139,154,139,155,230,200,139,156,230,201,139,157,230,206,139,158,230,208,139,159,139,160,139,161,230,209,139,162,139,163,139,164,230,203,181,213,139,165,230,204,139,166,139,167,230,207,139,168,139,169,196,219,139,170,230,198,139,171,139,172,139,173,139,174,139,175,230,205,139,176,139,177,139,178,139,179,139,180,139,181,139,182,139,183,139,184,139,185,139,186,139,187,139,188,139,189,139,190,139,191,139,192,139,193,139,194,139,195,139,196,139,197,139,198,230,210,139,199,139,200,139,201,139,202,139,203,139,204,139,205,139,206,139,207,139,208,139,209,139,210,230,212,230,211,139,211,139,212,139,213,139,214,139,215,139,216,139,217,139,218,139,219,139,220,139,221,139,222,139,223,139,224,139,225,139,226,139,227,139,228,139,229,139,230,139,231,139,232,139,233,139,234,139,235,139,236,230,213,139,237,217,248,139,238,139,239,230,214,139,240,139,241,139,242,139,243,139,244,139,245,139,246,139,247,230,215,139,248,139,249,139,250,139,251,139,252,139,253,139,254,140,64,140,65,140,66,140,67,140,68,140,69,140,70,140,71,215,211,230,221,140,72,230,222,191,215,212,208,140,73,215,214,180,230,203,239,230,218,216,195,215,206,208,162,140,74,195,207,140,75,140,76,230,223,188,190,185,194,230,219,209,167,140,77,140,78,186,162,194,207,140,79,216,171,140,80,140,81,140,82,202,235,229,238,140,83,230,220,140,84,183,245,140,85,140,86,140,87,140,88,200,230,140,89,140,90,196,245,140,91,140,92,229,178,196,254,140,93,203,252,229,179,213,172,140,94,211,238,202,216,176,178,140,95,203,206,205,234,140,96,140,97,186,234,140,98,140,99,140,100,229,181,140,101,229,180,140,102,215,218,185,217,214,230,182,168,205,240,210,203,177,166,202,181,140,103,179,232,201,243,191,205,208,251,202,210,229,182,187,194,140,104,140,105,140,106,207,220,185,172,140,107,140,108,140,109,140,110,212,215,140,111,140,112,186,166,209,231,207,252,188,210,140,113,229,183,200,221,140,114,140,115,140,116,191,237,177,246,203,222,140,117,140,118,188,197,140,119,188,196,210,250,195,220,191,220,140,120,140,121,140,122,140,123,184,187,140,124,140,125,140,126,195,194,140,128,186,174,212,162,140,129,140,130,140,131,140,132,140,133,140,134,140,135,140,136,140,137,199,222,196,175,178,236,140,138,185,209,140,139,140,140,229,187,193,200,140,141,140,142,213,175,140,143,140,144,140,145,140,146,140,147,229,188,140,148,229,190,140,149,140,150,140,151,140,152,140,153,140,154,140,155,180,231,182,212,203,194,209,176,181,188,140,156,140,157,202,217,140,158,183,226,140,159,140,160,201,228,140,161,189,171,140,162,140,163,206,190,215,240,140,164,140,165,140,166,140,167,208,161,140,168,201,217,140,169,140,170,182,251,230,216,188,226,140,171,179,190,140,172,201,208,140,173,230,217,179,162,140,174,140,175,140,176,140,177,222,204,140,178,211,200,222,205,140,179,210,162,140,180,140,181,140,182,140,183,222,206,140,184,140,185,140,186,140,187,190,205,140,188,140,189,222,207,140,190,140,191,140,192,202,172,210,252,179,223,229,234,196,225,190,161,206,178,196,242,190,214,198,168,178,227,140,193,140,194,190,211,140,195,140,196,199,252,204,235,189,236,206,221,140,197,140,198,202,186,198,193,229,236,208,188,140,199,140,200,140,201,213,185,140,202,140,203,140,204,229,237,140,205,140,206,140,207,140,208,202,244,140,209,205,192,194,197,140,210,229,239,140,211,194,196,229,240,140,212,140,213,140,214,140,215,140,216,140,217,140,218,229,248,205,205,140,219,201,189,140,220,140,221,140,222,140,223,140,224,140,225,140,226,210,217,225,168,140,227,140,228,140,229,140,230,211,236,140,231,203,234,198,241,140,232,140,233,140,234,140,235,140,236,225,172,140,237,140,238,140,239,225,167,225,169,140,240,140,241,225,170,225,175,140,242,140,243,178,237,140,244,225,171,184,218,225,173,225,174,225,176,181,186,225,177,140,245,140,246,140,247,140,248,140,249,225,179,225,184,140,250,140,251,140,252,140,253,140,254,209,210,141,64,225,182,225,181,193,235,141,65,141,66,141,67,225,183,141,68,212,192,141,69,225,178,141,70,225,186,176,182,141,71,141,72,141,73,141,74,225,180,141,75,191,249,141,76,225,185,141,77,141,78,225,187,141,79,141,80,141,81,141,82,141,83,141,84,225,190,141,85,141,86,141,87,141,88,141,89,141,90,225,188,141,91,141,92,141,93,141,94,141,95,141,96,214,197,141,97,141,98,141,99,141,100,141,101,141,102,141,103,207,191,141,104,141,105,225,189,225,191,194,205,141,106,182,235,141,107,211,248,141,108,141,109,199,205,141,110,141,111,183,229,141,112,141,113,141,114,141,115,141,116,141,117,141,118,141,119,141,120,141,121,190,254,141,122,141,123,141,124,141,125,141,126,141,128,225,192,225,193,141,129,141,130,225,199,179,231,141,131,141,132,141,133,141,134,141,135,141,136,198,233,141,137,141,138,141,139,141,140,141,141,180,222,141,142,209,194,141,143,141,144,141,145,141,146,225,200,141,147,141,148,225,198,141,149,141,150,141,151,141,152,141,153,225,197,141,154,225,195,225,194,141,155,177,192,141,156,141,157,141,158,213,184,225,196,141,159,141,160,141,161,141,162,141,163,225,203,141,164,141,165,141,166,141,167,141,168,141,169,141,170,141,171,225,204,225,202,141,172,141,173,141,174,141,175,141,176,141,177,141,178,141,179,239,250,141,180,141,181,225,211,225,210,199,182,141,182,141,183,141,184,141,185,141,186,141,187,141,188,141,189,141,190,141,191,141,192,225,201,141,193,141,194,225,206,141,195,225,208,141,196,141,197,141,198,141,199,141,200,141,201,141,202,141,203,141,204,141,205,141,206,225,212,141,207,225,209,225,205,141,208,141,209,225,207,141,210,141,211,141,212,141,213,225,213,141,214,141,215,141,216,141,217,141,218,141,219,141,220,141,221,141,222,141,223,141,224,141,225,141,226,225,214,141,227,141,228,141,229,141,230,141,231,141,232,141,233,141,234,141,235,141,236,141,237,141,238,141,239,141,240,141,241,141,242,141,243,141,244,141,245,141,246,141,247,141,248,225,215,141,249,141,250,141,251,225,216,141,252,141,253,141,254,142,64,142,65,142,66,142,67,142,68,142,69,142,70,142,71,142,72,142,73,142,74,142,75,142,76,142,77,142,78,142,79,142,80,142,81,142,82,142,83,142,84,142,85,225,218,142,86,142,87,142,88,142,89,142,90,142,91,142,92,142,93,142,94,142,95,142,96,142,97,142,98,225,219,142,99,142,100,142,101,142,102,142,103,142,104,142,105,206,161,142,106,142,107,142,108,142,109,142,110,142,111,142,112,142,113,142,114,142,115,142,116,142,117,142,118,231,221,142,119,180,168,214,221,142,120,142,121,209,178,179,178,142,122,142,123,185,164,215,243,199,201,190,222,185,174,142,124,206,215,142,125,142,126,178,238,219,207,142,128,188,186,210,209,203,200,176,205,142,129,142,130,207,239,142,131,142,132,142,133,142,134,142,135,217,227,189,237,142,136,142,137,177,210,202,208,178,188,142,138,203,167,183,171,142,139,202,166,142,140,142,141,142,142,207,163,142,143,142,144,224,248,213,202,224,251,142,145,142,146,224,250,197,193,204,251,142,147,193,177,224,249,214,227,178,175,214,196,181,219,142,148,142,149,142,150,142,151,142,152,142,153,142,154,142,155,180,248,214,161,142,156,142,157,142,158,142,159,142,160,207,175,176,239,142,161,142,162,224,252,142,163,142,164,142,165,142,166,142,167,225,161,179,163,142,168,142,169,224,253,224,254,195,177,142,170,142,171,142,172,142,173,195,221,142,174,225,162,183,249,142,175,142,176,142,177,142,178,142,179,142,180,187,207,142,181,142,182,142,183,142,184,142,185,142,186,142,187,225,163,196,187,142,188,142,189,142,190,142,191,142,192,225,164,142,193,142,194,225,165,142,195,142,196,225,166,180,177,142,197,142,198,142,199,142,200,142,201,142,202,142,203,142,204,142,205,142,206,142,207,142,208,142,209,142,210,142,211,184,201,198,189,196,234,142,212,178,162,142,213,208,210,142,214,231,219,187,195,211,215,211,196,142,215,185,227,226,207,142,216,142,217,142,218,215,175,142,219,199,236,177,211,142,220,142,221,180,178,226,209,142,222,142,223,142,224,208,242,194,174,226,208,142,225,191,226,211,166,181,215,226,210,181,234,142,226,195,237,184,253,142,227,184,174,142,228,197,211,183,207,226,212,142,229,142,230,142,231,142,232,226,211,182,200,215,249,142,233,142,234,142,235,142,236,142,237,205,165,142,238,142,239,142,240,142,241,142,242,226,216,142,243,226,214,202,252,191,181,211,185,226,213,142,244,142,245,142,246,142,247,226,215,142,248,142,249,142,250,142,251,142,252,142,253,142,254,143,64,143,65,143,66,193,174,192,200,143,67,143,68,143,69,143,70,143,71,143,72,226,219,226,218,192,170,143,73,143,74,193,206,143,75,143,76,143,77,143,78,226,220,143,79,143,80,143,81,143,82,143,83,143,84,143,85,143,86,143,87,143,88,143,89,143,90,226,221,143,91,226,222,143,92,143,93,143,94,143,95,143,96,143,97,143,98,143,99,143,100,219,200,143,101,209,211,205,162,143,102,143,103,189,168,143,104,143,105,143,106,222,195,216,165,191,170,219,205,210,236,198,250,197,170,143,107,143,108,143,109,222,196,143,110,177,215,223,174,143,111,143,112,143,113,202,189,143,114,223,177,143,115,185,173,143,116,210,253,143,117,184,165,186,235,143,118,143,119,179,218,143,120,143,121,143,122,181,220,213,197,143,123,143,124,143,125,143,126,195,214,207,210,187,161,143,128,229,243,229,242,143,129,143,130,229,244,143,131,205,228,143,132,200,245,143,133,143,134,143,135,143,136,143,137,143,138,143,139,181,175,199,191,143,140,229,246,143,141,143,142,143,143,236,176,143,144,143,145,143,146,143,147,143,148,143,149,143,150,143,151,143,152,143,153,143,154,143,155,143,156,143,157,143,158,229,230,143,159,185,233,181,177,143,160,194,188,229,232,229,231,229,233,143,161,143,162,143,163,143,164,210,205,143,165,143,166,143,167,225,234,208,206,143,168,205,174,143,169,209,229,143,170,143,171,178,202,177,235,143,172,177,242,197,237,143,173,143,174,213,195,211,176,143,175,225,220,143,176,143,177,143,178,225,221,143,179,210,219,143,180,179,185,177,203,143,181,143,182,143,183,205,249,213,247,225,222,143,184,190,182,180,253,143,185,225,223,186,220,225,224,187,178,194,201,225,225,143,186,143,187,143,188,208,236,143,189,205,189,143,190,143,191,225,226,143,192,181,195,197,199,225,227,143,193,143,194,225,228,143,195,143,196,143,197,143,198,211,249,143,199,143,200,143,201,143,202,143,203,143,204,225,229,143,205,209,173,143,206,143,207,225,230,206,162,143,208,143,209,143,210,143,211,143,212,143,213,225,231,143,214,181,194,143,215,143,216,143,217,143,218,225,232,187,213,143,219,143,220,143,221,143,222,143,223,208,196,226,224,177,216,210,228,143,224,143,225,226,225,143,226,143,227,188,201,200,204,143,228,226,227,236,254,236,253,223,175,143,229,143,230,143,231,226,226,214,190,205,252,195,166,143,232,143,233,143,234,227,195,143,235,143,236,214,210,226,231,143,237,143,238,226,232,143,239,143,240,211,199,143,241,143,242,226,236,191,236,143,243,226,237,226,229,143,244,143,245,179,192,143,246,143,247,143,248,196,238,143,249,143,250,226,238,143,251,143,252,208,195,143,253,186,246,226,233,183,222,187,179,204,172,203,203,226,228,226,230,226,234,226,235,143,254,144,64,144,65,226,247,144,66,144,67,226,244,212,245,226,243,144,68,144,69,197,173,144,70,213,250,197,194,178,192,144,71,144,72,226,239,144,73,226,242,193,175,203,188,144,74,144,75,181,161,226,249,144,76,144,77,144,78,188,177,226,241,208,212,212,185,226,245,185,214,226,246,144,79,144,80,144,81,199,211,144,82,144,83,144,84,144,85,144,86,226,240,144,87,144,88,144,89,144,90,144,91,215,220,237,161,144,92,144,93,226,248,144,94,237,165,226,254,202,209,144,95,144,96,144,97,144,98,144,99,144,100,144,101,193,181,144,102,187,208,144,103,144,104,191,214,144,105,186,227,144,106,144,107,203,161,144,108,144,109,144,110,237,166,237,163,144,111,144,112,237,162,144,113,144,114,144,115,144,116,187,214,237,167,208,244,144,117,144,118,237,164,186,222,182,247,227,161,182,178,204,241,185,167,144,119,207,162,199,161,144,120,144,121,191,210,144,122,144,123,182,241,144,124,226,250,226,251,226,253,226,252,196,213,227,162,144,125,211,193,144,126,144,128,144,129,227,167,199,196,144,130,144,131,144,132,144,133,207,164,144,134,144,135,227,169,186,183,144,136,144,137,144,138,144,139,227,168,144,140,187,218,144,141,227,163,144,142,144,143,144,144,227,164,227,170,144,145,227,166,144,146,206,242,211,198,144,147,144,148,187,188,144,149,144,150,212,195,144,151,196,250,144,152,144,153,237,168,208,252,227,165,144,154,195,245,144,155,227,173,177,175,144,156,227,178,144,157,144,158,144,159,188,194,144,160,144,161,227,172,181,191,144,162,144,163,144,164,144,165,144,166,144,167,144,168,144,169,199,233,227,176,144,170,144,171,144,172,190,170,205,239,144,173,144,174,144,175,144,176,144,177,187,243,144,178,144,179,144,180,204,232,144,181,144,182,227,175,144,183,227,177,144,184,207,167,227,174,144,185,206,169,187,221,144,186,144,187,144,188,144,189,144,190,181,235,190,229,178,210,179,205,144,191,177,185,227,171,178,209,181,172,185,223,182,232,144,192,144,193,207,235,227,183,144,194,187,204,144,195,144,196,200,199,208,202,144,197,144,198,144,199,144,200,144,201,227,184,179,238,144,202,144,203,144,204,144,205,237,169,144,206,211,250,211,228,144,207,144,208,144,209,237,170,227,185,210,226,144,210,144,211,144,212,144,213,144,214,227,181,144,215,144,216,144,217,144,218,211,222,144,219,144,220,144,221,144,222,184,208,227,179,144,223,144,224,227,182,183,223,144,225,227,180,192,162,144,226,144,227,144,228,227,186,144,229,144,230,144,231,144,232,144,233,144,234,144,235,144,236,144,237,144,238,144,239,144,240,144,241,144,242,144,243,144,244,144,245,144,246,144,247,212,184,144,248,144,249,144,250,144,251,144,252,144,253,144,254,145,64,180,200,145,65,227,187,145,66,187,197,145,67,201,247,145,68,145,69,201,229,145,70,145,71,145,72,196,189,145,73,145,74,145,75,145,76,145,77,145,78,145,79,237,171,145,80,145,81,145,82,145,83,194,253,145,84,145,85,145,86,145,87,187,219,191,174,145,88,145,89,145,90,145,91,145,92,145,93,145,94,206,191,145,95,145,96,145,97,145,98,227,188,145,99,191,182,145,100,145,101,145,102,145,103,145,104,145,105,145,106,145,107,145,108,145,109,145,110,145,111,145,112,145,113,145,114,145,115,145,116,145,117,145,118,177,239,145,119,145,120,212,247,145,121,145,122,145,123,145,124,145,125,227,190,145,126,145,128,145,129,145,130,145,131,145,132,145,133,145,134,237,173,145,135,145,136,145,137,145,138,145,139,145,140,145,141,145,142,145,143,227,191,186,169,237,172,145,144,145,145,227,189,145,146,145,147,145,148,145,149,145,150,145,151,145,152,145,153,145,154,145,155,227,192,145,156,145,157,145,158,145,159,145,160,145,161,186,182,145,162,145,163,145,164,182,174,145,165,145,166,145,167,145,168,145,169,208,184,145,170,176,195,237,174,145,171,145,172,145,173,145,174,145,175,237,175,192,193,145,176,227,193,145,177,145,178,145,179,145,180,145,181,145,182,145,183,145,184,145,185,145,186,145,187,145,188,145,189,145,190,145,191,145,192,145,193,197,179,145,194,145,195,145,196,145,197,145,198,145,199,145,200,145,201,145,202,145,203,145,204,145,205,145,206,145,207,227,194,145,208,145,209,145,210,145,211,145,212,145,213,145,214,145,215,145,216,220,178,145,217,145,218,145,219,145,220,145,221,145,222,237,176,145,223,184,234,145,224,206,236,234,167,208,231,202,249,200,214,207,183,179,201,206,210,189,228,145,225,145,226,227,222,187,242,234,168,213,189,145,227,198,221,234,169,145,228,145,229,145,230,234,170,145,231,234,172,234,171,145,232,234,174,234,173,145,233,145,234,145,235,145,236,189,216,145,237,234,175,145,238,194,190,145,239,145,240,145,241,145,242,180,193,180,247,145,243,145,244,187,167,145,245,145,246,145,247,145,248,145,249,236,230,236,229,183,191,203,249,177,226,145,250,236,231,145,251,145,252,145,253,201,200,236,232,236,233,145,254,202,214,222,208,178,197,212,250,146,64,146,65,198,203,176,199,180,242,200,211,146,66,146,67,146,68,205,208,146,69,146,70,191,184,146,71,146,72,146,73,146,74,146,75,146,76,146,77,191,219,146,78,146,79,199,164,214,180,146,80,192,169,222,209,201,168,209,239,197,164,176,231,179,182,200,197,146,81,146,82,176,226,146,83,146,84,183,246,146,85,146,86,197,250,146,87,146,88,182,243,146,89,213,210,179,208,188,188,146,90,146,91,146,92,179,173,146,93,146,94,146,95,146,96,190,241,176,209,146,97,146,98,146,99,146,100,146,101,146,102,210,214,202,227,215,165,146,103,205,182,182,182,191,185,213,219,146,104,184,167,197,215,146,105,146,106,146,107,222,210,191,217,194,213,199,192,146,108,187,164,177,168,146,109,146,110,197,234,146,111,146,112,197,251,204,167,146,113,146,114,146,115,146,116,177,167,146,117,146,118,146,119,181,214,146,120,146,121,146,122,196,168,146,123,222,211,209,186,179,233,146,124,195,242,146,125,146,126,183,247,146,128,214,244,181,163,178,240,196,180,196,233,192,173,222,212,146,129,176,232,197,196,193,224,146,130,185,213,146,131,190,220,205,216,176,206,146,132,205,207,222,214,190,208,215,190,222,213,213,208,176,221,146,133,146,134,196,226,146,135,146,136,194,163,188,240,146,137,211,181,192,185,197,161,178,166,212,241,146,138,146,139,192,168,202,195,222,215,213,252,146,140,185,176,146,141,200,173,203,169,146,142,222,217,191,189,146,143,146,144,146,145,146,146,198,180,215,167,202,176,196,195,146,147,179,214,185,210,146,148,146,149,146,150,146,151,214,184,234,252,176,180,146,152,146,153,146,154,146,155,191,230,146,156,146,157,204,244,146,158,146,159,146,160,146,161,205,218,146,162,146,163,146,164,214,191,194,206,146,165,206,206,204,162,208,174,196,211,181,178,222,216,213,245,188,183,187,211,146,166,146,167,176,164,146,168,197,178,180,236,146,169,146,170,146,171,213,241,146,172,146,173,234,253,146,174,146,175,146,176,146,177,146,178,146,179,222,218,205,166,146,180,146,181,205,236,146,182,146,183,146,184,146,185,206,230,222,220,146,186,205,177,192,166,146,187,146,188,215,189,146,189,222,219,176,198,186,180,201,211,196,243,190,232,146,190,146,191,146,192,146,193,178,182,146,194,146,195,146,196,146,197,146,198,146,199,146,200,146,201,192,204,203,240,146,202,188,241,187,187,181,183,146,203,146,204,146,205,197,245,146,206,222,230,146,207,146,208,146,209,222,227,190,221,146,210,146,211,222,223,146,212,146,213,146,214,146,215,180,183,189,221,146,216,146,217,222,224,196,237,146,218,146,219,146,220,146,221,207,198,146,222,181,224,146,223,146,224,146,225,146,226,182,222,202,218,181,244,222,229,146,227,213,198,146,228,222,225,204,205,198,254,146,229,197,197,146,230,146,231,146,232,210,180,146,233,190,242,146,234,146,235,146,236,146,237,146,238,146,239,146,240,194,211,146,241,204,189,179,184,146,242,189,211,146,243,191,216,205,198,209,218,180,235,146,244,222,228,222,221,222,231,146,245,234,254,146,246,146,247,194,176,222,226,146,248,146,249,214,192,181,167,146,250,178,244,146,251,222,232,146,252,222,242,146,253,146,254,147,64,147,65,147,66,222,237,147,67,222,241,147,68,147,69,200,224,147,70,147,71,147,72,215,225,222,239,195,232,204,225,147,73,178,229,147,74,147,75,147,76,210,190,147,77,147,78,147,79,147,80,147,81,147,82,147,83,222,238,147,84,222,235,206,213,147,85,180,167,147,86,147,87,147,88,147,89,147,90,191,171,190,190,147,91,147,92,189,210,147,93,147,94,147,95,147,96,222,233,147,97,212,174,147,98,222,222,147,99,222,234,147,100,147,101,147,102,147,103,192,191,147,104,222,236,178,243,184,233,194,167,147,105,147,106,189,193,147,107,147,108,147,109,147,110,147,111,222,245,222,248,147,112,147,113,178,171,180,164,147,114,147,115,180,234,201,166,147,116,147,117,147,118,147,119,147,120,147,121,222,246,203,209,147,122,184,227,147,123,222,247,222,250,147,124,147,125,147,126,147,128,222,249,147,129,147,130,147,131,204,194,147,132,176,225,180,238,147,133,147,134,147,135,147,136,147,137,147,138,229,186,147,139,147,140,147,141,147,142,147,143,208,175,147,144,147,145,178,235,147,146,235,161,147,147,222,244,147,148,147,149,201,227,222,243,176,218,210,161,177,247,147,150,204,175,147,151,147,152,147,153,147,154,147,155,147,156,147,157,222,240,147,158,203,164,147,159,147,160,147,161,213,170,147,162,147,163,147,164,147,165,147,166,222,251,147,167,147,168,147,169,147,170,147,171,147,172,147,173,147,174,180,221,147,175,196,166,147,176,147,177,147,178,222,253,147,179,147,180,147,181,147,182,147,183,147,184,147,185,147,186,147,187,147,188,195,254,196,161,223,161,147,189,147,190,147,191,147,192,147,193,147,194,147,195,193,204,147,196,222,252,190,239,147,197,198,178,147,198,147,199,147,200,147,201,147,202,147,203,147,204,147,205,147,206,179,197,200,246,147,207,147,208,203,186,222,254,147,209,147,210,223,164,147,211,147,212,147,213,147,214,215,178,147,215,147,216,147,217,147,218,147,219,179,183,147,220,147,221,147,222,147,223,193,195,147,224,147,225,199,203,178,165,180,233,147,226,215,171,147,227,147,228,147,229,147,230,196,236,147,231,223,162,223,163,147,232,223,165,147,233,186,179,147,234,147,235,147,236,223,166,147,237,192,222,147,238,147,239,201,195,147,240,147,241,147,242,147,243,147,244,147,245,147,246,178,217,199,230,147,247,223,167,147,248,199,220,147,249,147,250,147,251,147,252,223,168,235,162,147,253,147,254,148,64,148,65,148,66,203,211,148,67,148,68,148,69,223,170,148,70,223,169,148,71,178,193,148,72,148,73,148,74,148,75,148,76,148,77,148,78,148,79,148,80,148,81,148,82,148,83,148,84,148,85,148,86,148,87,148,88,148,89,148,90,148,91,148,92,148,93,148,94,148,95,148,96,197,202,148,97,148,98,148,99,148,100,148,101,148,102,148,103,148,104,223,171,148,105,148,106,148,107,148,108,148,109,148,110,148,111,148,112,212,220,148,113,148,114,148,115,148,116,148,117,200,193,148,118,148,119,148,120,148,121,148,122,148,123,148,124,148,125,148,126,148,128,148,129,148,130,223,172,148,131,148,132,148,133,148,134,148,135,190,240,148,136,148,137,223,173,214,167,148,138,148,139,148,140,148,141,234,183,235,182,202,213,148,142,216,252,184,196,148,143,185,165,148,144,148,145,183,197,213,254,148,146,148,147,148,148,148,149,148,150,185,202,148,151,148,152,208,167,244,205,148,153,148,154,181,208,148,155,148,156,195,244,148,157,190,200,148,158,148,159,148,160,235,183,176,189,148,161,148,162,189,204,148,163,193,178,148,164,177,214,179,168,148,165,148,166,148,167,184,210,201,162,148,168,148,169,182,216,148,170,148,171,148,172,148,173,235,184,190,180,148,174,148,175,148,176,202,253,148,177,199,195,148,178,213,251,148,179,148,180,183,243,148,181,148,182,148,183,148,184,148,185,148,186,148,187,148,188,148,189,148,190,148,191,148,192,148,193,148,194,148,195,206,196,148,196,148,197,148,198,213,171,177,243,148,199,148,200,148,201,236,179,176,223,148,202,236,181,148,203,148,204,148,205,182,183,148,206,193,207,148,207,245,250,208,177,148,208,148,209,213,229,148,210,206,211,148,211,148,212,189,239,179,226,148,213,184,171,148,214,213,182,148,215,237,189,148,216,182,207,148,217,203,185,208,194,148,218,148,219,148,220,148,221,148,222,148,223,148,224,148,225,183,189,148,226,148,227,236,182,202,169,148,228,148,229,148,230,197,212,148,231,236,185,236,184,194,195,236,183,148,232,148,233,148,234,148,235,208,253,236,186,148,236,236,187,215,229,148,237,148,238,236,188,148,239,148,240,148,241,236,189,198,236,148,242,148,243,148,244,148,245,148,246,148,247,148,248,148,249,206,222,148,250,188,200,148,251,148,252,200,213,181,169,190,201,214,188,212,231,148,253,148,254,209,174,208,241,234,184,234,185,234,186,186,181,149,64,149,65,149,66,149,67,202,177,191,245,149,68,149,69,205,250,149,70,149,71,149,72,149,73,149,74,234,192,149,75,176,186,234,190,149,76,149,77,192,165,149,78,149,79,149,80,234,187,149,81,178,253,149,82,195,247,187,232,149,83,149,84,149,85,210,215,206,244,234,191,149,86,149,87,149,88,234,188,149,89,149,90,149,91,234,195,149,92,208,199,211,179,149,93,149,94,149,95,149,96,180,186,149,97,195,193,215,242,149,98,149,99,149,100,149,101,213,209,149,102,202,199,149,103,234,197,149,104,149,105,234,196,234,199,234,198,149,106,149,107,149,108,149,109,149,110,214,231,149,111,207,212,149,112,149,113,234,203,149,114,187,206,149,115,149,116,149,117,149,118,149,119,149,120,149,121,189,250,201,206,149,122,149,123,234,204,149,124,149,125,201,185,207,254,234,202,212,206,234,205,234,207,149,126,149,128,205,237,149,129,149,130,149,131,149,132,234,201,149,133,234,206,149,134,149,135,206,238,149,136,187,222,149,137,179,191,149,138,149,139,149,140,149,141,149,142,198,213,190,176,206,250,149,143,149,144,149,145,199,231,149,146,190,167,234,208,149,147,149,148,214,199,149,149,149,150,149,151,193,192,149,152,149,153,149,154,212,221,149,155,234,209,149,156,149,157,207,190,149,158,149,159,149,160,149,161,234,210,149,162,149,163,149,164,149,165,202,238,149,166,149,167,149,168,149,169,197,175,176,181,149,170,149,171,149,172,149,173,149,174,234,212,149,175,149,176,149,177,149,178,149,179,149,180,149,181,149,182,149,183,234,211,244,223,149,184,149,185,149,186,149,187,149,188,196,186,149,189,149,190,149,191,149,192,149,193,177,169,149,194,149,195,149,196,149,197,229,223,149,198,149,199,149,200,149,201,234,213,149,202,149,203,149,204,149,205,149,206,149,207,149,208,149,209,149,210,149,211,149,212,149,213,149,214,149,215,149,216,149,217,149,218,149,219,149,220,149,221,149,222,149,223,149,224,149,225,149,226,149,227,202,239,149,228,234,214,234,215,198,216,149,229,149,230,149,231,149,232,149,233,149,234,149,235,149,236,234,216,149,237,149,238,234,217,149,239,149,240,149,241,149,242,149,243,149,244,212,187,149,245,199,250,210,183,184,252,149,246,149,247,234,194,149,248,178,220,149,249,149,250,194,252,149,251,212,248,204,230,215,238,149,252,149,253,149,254,150,64,150,65,150,66,150,67,212,194,211,208,235,195,197,243,150,68,183,254,150,69,150,70,235,212,150,71,150,72,150,73,203,183,235,222,150,74,192,202,150,75,150,76,150,77,205,251,150,78,179,175,150,79,198,218,150,80,150,81,150,82,150,83,150,84,150,85,235,252,150,86,196,190,150,87,206,180,196,169,177,190,212,253,150,88,202,245,150,89,214,236,150,90,150,91,198,211,182,228,150,92,150,93,150,94,150,95,187,250,150,96,150,97,208,224,150,98,150,99,201,177,150,100,212,211,200,168,150,101,150,102,184,203,150,103,232,190,201,188,150,104,150,105,232,187,150,106,192,238,208,211,178,196,180,229,150,107,232,188,150,108,150,109,213,200,150,110,150,111,150,112,150,113,150,114,182,197,150,115,232,189,202,248,184,220,204,245,150,116,150,117,150,118,192,180,150,119,150,120,209,238,232,191,232,194,150,121,150,122,186,188,150,123,177,173,189,220,150,124,234,189,232,195,150,125,232,198,150,126,232,203,150,128,150,129,150,130,150,131,232,204,150,132,203,201,176,229,150,133,188,171,150,134,150,135,185,185,150,136,150,137,232,193,150,138,205,247,150,139,232,202,150,140,150,141,150,142,150,143,206,246,150,144,150,145,150,146,150,147,213,237,150,148,193,214,232,196,150,149,195,182,150,150,185,251,214,166,232,200,150,151,150,152,150,153,202,224,212,230,150,154,232,192,150,155,232,197,232,199,150,156,199,185,183,227,150,157,232,201,150,158,191,221,232,210,150,159,150,160,232,215,150,161,232,213,188,220,188,207,232,219,150,162,150,163,150,164,150,165,150,166,150,167,150,168,150,169,232,222,150,170,232,218,177,250,150,171,150,172,150,173,150,174,150,175,150,176,150,177,150,178,150,179,150,180,176,216,196,179,184,204,198,226,200,190,200,225,150,181,150,182,150,183,232,207,232,212,232,214,150,184,185,241,232,216,215,245,150,185,196,251,150,186,232,220,150,187,150,188,178,233,150,189,150,190,150,191,232,209,150,192,150,193,188,237,150,194,150,195,191,194,232,205,214,249,150,196,193,248,178,241,150,197,150,198,150,199,150,200,150,201,150,202,150,203,150,204,232,223,150,205,202,193,232,217,150,206,150,207,150,208,150,209,213,164,150,210,177,234,213,187,232,206,232,208,182,176,232,211,150,211,232,221,192,184,150,212,202,247,150,213,203,168,150,214,150,215,198,220,192,245,150,216,150,217,150,218,150,219,150,220,232,233,150,221,150,222,150,223,208,163,150,224,150,225,150,226,150,227,150,228,150,229,150,230,232,242,214,234,150,231,150,232,150,233,150,234,150,235,150,236,150,237,232,224,232,225,150,238,150,239,150,240,209,249,186,203,184,249,150,241,150,242,184,241,212,212,232,239,150,243,232,238,232,236,185,240,204,210,232,230,206,166,191,242,150,244,176,184,232,241,232,240,150,245,215,192,150,246,232,228,150,247,205,169,201,163,150,248,187,184,189,219,232,234,150,249,150,250,150,251,150,252,150,253,150,254,151,64,151,65,151,66,151,67,232,226,232,227,232,229,181,181,232,231,199,197,232,235,232,237,189,176,215,174,151,68,232,248,151,69,151,70,151,71,151,72,151,73,151,74,151,75,151,76,232,245,151,77,205,176,232,246,151,78,151,79,151,80,151,81,151,82,151,83,151,84,151,85,151,86,193,186,151,87,232,232,151,88,195,183,176,240,151,89,151,90,151,91,151,92,151,93,151,94,151,95,151,96,232,244,151,97,151,98,151,99,232,247,151,100,151,101,151,102,185,163,151,103,151,104,151,105,151,106,151,107,151,108,151,109,151,110,151,111,151,112,201,210,151,113,151,114,151,115,195,206,206,224,192,230,151,116,151,117,151,118,151,119,203,243,151,120,204,221,208,181,151,121,151,122,202,225,151,123,232,243,151,124,151,125,151,126,151,128,151,129,151,130,151,131,151,132,151,133,151,134,188,236,151,135,232,249,151,136,151,137,151,138,151,139,151,140,151,141,195,222,151,142,198,229,151,143,185,247,151,144,151,145,151,146,151,147,176,244,151,148,151,149,215,216,151,150,151,151,188,172,151,152,197,239,151,153,151,154,151,155,151,156,151,157,204,196,151,158,151,159,233,166,151,160,151,161,151,162,151,163,151,164,151,165,151,166,151,167,151,168,151,169,201,173,151,170,233,162,192,226,151,171,151,172,151,173,191,195,151,174,151,175,151,176,232,254,185,215,151,177,232,251,151,178,151,179,151,180,151,181,233,164,151,182,151,183,151,184,210,206,151,185,151,186,151,187,151,188,151,189,233,163,151,190,214,178,215,181,151,191,233,167,151,192,189,183,151,193,151,194,151,195,151,196,151,197,151,198,151,199,151,200,151,201,151,202,151,203,151,204,232,252,232,253,151,205,151,206,151,207,233,161,151,208,151,209,151,210,151,211,151,212,151,213,151,214,151,215,205,214,151,216,151,217,210,172,151,218,151,219,151,220,233,178,151,221,151,222,151,223,151,224,233,169,151,225,151,226,151,227,180,170,151,228,180,187,151,229,151,230,233,171,151,231,151,232,151,233,151,234,151,235,151,236,151,237,151,238,151,239,151,240,151,241,151,242,151,243,151,244,151,245,151,246,151,247,208,168,151,248,151,249,233,165,151,250,151,251,179,254,151,252,151,253,233,172,192,227,151,254,233,170,152,64,152,65,233,185,152,66,152,67,233,184,152,68,152,69,152,70,152,71,233,174,152,72,152,73,232,250,152,74,152,75,233,168,152,76,152,77,152,78,152,79,152,80,191,172,233,177,233,186,152,81,152,82,194,165,152,83,152,84,152,85,233,175,152,86,184,197,152,87,233,173,152,88,211,220,233,180,233,181,233,183,152,89,152,90,152,91,233,199,152,92,152,93,152,94,152,95,152,96,152,97,192,198,233,197,152,98,152,99,233,176,152,100,152,101,233,187,176,241,152,102,152,103,152,104,152,105,152,106,152,107,152,108,152,109,152,110,152,111,233,188,213,165,152,112,152,113,233,190,152,114,233,191,152,115,152,116,152,117,233,193,152,118,152,119,193,241,152,120,152,121,200,182,152,122,152,123,152,124,233,189,152,125,152,126,152,128,152,129,152,130,233,194,152,131,152,132,152,133,152,134,152,135,152,136,152,137,152,138,233,195,152,139,233,179,152,140,233,182,152,141,187,177,152,142,152,143,152,144,233,192,152,145,152,146,152,147,152,148,152,149,152,150,188,247,152,151,152,152,152,153,233,196,233,198,152,154,152,155,152,156,152,157,152,158,152,159,152,160,152,161,152,162,152,163,152,164,152,165,233,202,152,166,152,167,152,168,152,169,233,206,152,170,152,171,152,172,152,173,152,174,152,175,152,176,152,177,152,178,152,179,178,219,152,180,233,200,152,181,152,182,152,183,152,184,152,185,152,186,152,187,152,188,152,189,152,190,183,174,152,191,152,192,152,193,152,194,152,195,152,196,152,197,152,198,152,199,152,200,152,201,152,202,233,203,233,204,152,203,152,204,152,205,152,206,152,207,152,208,213,193,152,209,196,163,152,210,152,211,152,212,152,213,152,214,152,215,233,216,152,216,186,225,152,217,152,218,152,219,152,220,233,201,152,221,211,163,152,222,152,223,152,224,233,212,152,225,152,226,152,227,152,228,152,229,152,230,152,231,233,215,233,208,152,232,152,233,152,234,152,235,152,236,233,207,152,237,152,238,199,193,152,239,152,240,152,241,152,242,152,243,152,244,152,245,152,246,233,210,152,247,152,248,152,249,152,250,152,251,152,252,152,253,233,217,179,200,152,254,233,211,153,64,153,65,153,66,153,67,153,68,207,240,153,69,153,70,153,71,233,205,153,72,153,73,153,74,153,75,153,76,153,77,153,78,153,79,153,80,153,81,153,82,179,247,153,83,153,84,153,85,153,86,153,87,153,88,153,89,233,214,153,90,153,91,233,218,153,92,153,93,153,94,204,180,153,95,153,96,153,97,207,173,153,98,153,99,153,100,153,101,153,102,153,103,153,104,153,105,153,106,233,213,153,107,233,220,233,219,153,108,153,109,153,110,153,111,153,112,233,222,153,113,153,114,153,115,153,116,153,117,153,118,153,119,153,120,233,209,153,121,153,122,153,123,153,124,153,125,153,126,153,128,153,129,233,221,153,130,233,223,195,202,153,131,153,132,153,133,153,134,153,135,153,136,153,137,153,138,153,139,153,140,153,141,153,142,153,143,153,144,153,145,153,146,153,147,153,148,153,149,153,150,153,151,153,152,153,153,153,154,153,155,153,156,153,157,153,158,153,159,153,160,153,161,153,162,153,163,153,164,153,165,153,166,153,167,153,168,153,169,153,170,153,171,153,172,153,173,153,174,153,175,153,176,153,177,153,178,153,179,153,180,153,181,153,182,153,183,153,184,153,185,153,186,153,187,153,188,153,189,153,190,153,191,153,192,153,193,153,194,153,195,153,196,153,197,153,198,153,199,153,200,153,201,153,202,153,203,153,204,153,205,153,206,153,207,153,208,153,209,153,210,153,211,153,212,153,213,153,214,153,215,153,216,153,217,153,218,153,219,153,220,153,221,153,222,153,223,153,224,153,225,153,226,153,227,153,228,153,229,153,230,153,231,153,232,153,233,153,234,153,235,153,236,153,237,153,238,153,239,153,240,153,241,153,242,153,243,153,244,153,245,199,183,180,206,187,182,208,192,236,163,153,246,153,247,197,183,153,248,153,249,153,250,153,251,153,252,153,253,153,254,154,64,154,65,154,66,211,251,154,67,154,68,154,69,154,70,236,164,154,71,236,165,198,219,154,72,154,73,154,74,191,238,154,75,154,76,154,77,154,78,236,166,154,79,154,80,236,167,208,170,154,81,199,184,154,82,154,83,184,232,154,84,154,85,154,86,154,87,154,88,154,89,154,90,154,91,154,92,154,93,154,94,154,95,236,168,154,96,154,97,154,98,154,99,154,100,154,101,154,102,154,103,214,185,213,253,180,203,178,189,206,228,198,231,154,104,154,105,205,225,154,106,154,107,154,108,154,109,154,110,154,111,154,112,154,113,154,114,154,115,154,116,154,117,154,118,154,119,180,245,154,120,203,192,188,223,154,121,154,122,154,123,154,124,233,226,233,227,209,234,233,229,154,125,180,249,233,228,154,126,209,179,202,226,178,208,154,128,233,232,154,129,154,130,154,131,154,132,233,230,233,231,154,133,154,134,214,179,154,135,154,136,154,137,233,233,233,234,154,138,154,139,154,140,154,141,154,142,233,235,154,143,154,144,154,145,154,146,154,147,154,148,154,149,154,150,233,236,154,151,154,152,154,153,154,154,154,155,154,156,154,157,154,158,236,175,197,185,182,206,154,159,210,243,154,160,154,161,154,162,154,163,154,164,154,165,154,166,181,238,154,167,187,217,236,177,154,168,154,169,210,227,154,170,154,171,154,172,154,173,154,174,206,227,154,175,196,184,154,176,195,191,154,177,154,178,182,190,216,185,177,200,177,207,177,209,197,254,154,179,177,208,154,180,195,171,154,181,154,182,154,183,154,184,154,185,213,177,154,186,154,187,154,188,154,189,154,190,154,191,154,192,154,193,235,164,186,193,154,194,154,195,154,196,204,186,154,197,154,198,154,199,235,165,154,200,235,167,154,201,154,202,154,203,235,168,154,204,154,205,154,206,235,166,154,207,154,208,154,209,154,210,154,211,154,212,154,213,235,169,235,171,235,170,154,214,154,215,154,216,154,217,154,218,235,172,154,219,202,207,216,181,195,241,154,220,195,165,198,248,235,173,196,202,154,221,235,174,235,175,235,176,183,213,154,222,154,223,154,224,183,250,154,225,235,177,199,226,154,226,235,179,154,227,186,164,209,245,176,177,235,178,235,180,154,228,154,229,154,230,181,170,194,200,199,232,154,231,235,181,154,232,203,174,227,223,154,233,154,234,211,192,154,235,154,236,154,237,154,238,217,219,154,239,154,240,205,161,214,173,199,243,154,241,154,242,154,243,217,224,187,227,154,244,186,186,227,226,154,245,154,246,154,247,154,248,154,249,207,171,154,250,154,251,154,252,227,224,201,199,154,253,186,185,154,254,155,64,155,65,209,180,227,225,200,234,185,175,189,173,179,216,206,219,155,66,155,67,204,192,155,68,155,69,155,70,227,232,227,233,205,244,155,71,155,72,155,73,155,74,155,75,204,173,155,76,188,179,155,77,227,234,155,78,227,235,155,79,155,80,208,218,155,81,155,82,155,83,198,251,183,218,155,84,155,85,199,223,210,202,206,214,155,86,227,228,227,236,155,87,201,242,179,193,155,88,155,89,227,231,155,90,155,91,198,227,227,229,155,92,155,93,237,179,227,230,155,94,155,95,155,96,155,97,201,179,155,98,197,230,155,99,155,100,155,101,185,181,155,102,195,187,155,103,227,227,197,189,193,164,194,217,178,215,155,104,227,237,187,166,196,173,155,105,227,240,190,218,155,106,155,107,227,251,227,245,186,211,155,108,155,109,155,110,155,111,183,208,211,205,155,112,214,206,213,211,185,193,213,180,209,216,155,113,155,114,155,115,155,116,208,185,199,246,155,117,155,118,155,119,200,170,178,180,155,120,195,218,155,121,155,122,155,123,227,238,155,124,155,125,227,252,227,239,183,168,227,247,227,244,155,126,155,128,155,129,183,186,155,130,155,131,197,162,155,132,227,246,197,221,178,168,198,252,155,133,196,224,155,134,155,135,215,162,155,136,192,225,227,249,155,137,155,138,227,250,227,253,204,169,227,243,155,139,211,190,155,140,177,195,237,180,227,241,227,242,155,141,227,248,208,186,198,195,212,243,227,254,155,142,155,143,189,224,155,144,155,145,228,167,155,146,155,147,228,166,155,148,155,149,155,150,209,243,228,163,155,151,228,169,155,152,155,153,155,154,200,247,155,155,155,156,155,157,155,158,207,180,155,159,228,168,228,174,194,229,155,160,155,161,182,180,155,162,155,163,155,164,155,165,155,166,155,167,189,242,155,168,228,162,155,169,155,170,186,233,228,170,155,171,155,172,228,172,155,173,155,174,182,253,214,222,228,178,155,175,228,173,155,176,155,177,155,178,228,161,155,179,187,238,205,221,199,162,197,201,155,180,155,181,193,247,155,182,228,164,155,183,199,179,189,172,189,189,228,165,155,184,215,199,178,226,155,185,228,171,188,195,228,175,155,186,187,235,228,176,197,168,228,177,155,187,155,188,155,189,155,190,213,227,191,163,155,191,228,186,155,192,228,183,155,193,228,187,155,194,155,195,228,189,155,196,155,197,198,214,155,198,155,199,186,198,192,203,155,200,155,201,155,202,184,161,228,180,155,203,155,204,155,205,155,206,212,161,155,207,155,208,186,163,189,254,155,209,155,210,155,211,228,188,155,212,155,213,155,214,155,215,155,216,205,191,155,217,155,218,196,249,155,219,155,220,207,251,201,230,155,221,155,222,211,191,155,223,207,209,155,224,155,225,228,179,155,226,228,184,228,185,204,233,155,227,155,228,155,229,155,230,155,231,204,206,155,232,192,212,228,181,193,176,228,182,206,208,155,233,187,193,181,211,155,234,200,243,189,167,213,199,201,172,184,162,228,202,155,235,155,236,228,204,209,196,155,237,155,238,210,186,155,239,155,240,186,173,155,241,155,242,186,212,155,243,155,244,155,245,155,246,155,247,155,248,228,195,181,237,155,249,155,250,155,251,215,205,228,192,207,253,228,191,155,252,155,253,155,254,193,220,204,202,156,64,156,65,156,66,156,67,202,231,156,68,156,69,156,70,156,71,196,215,156,72,204,212,228,200,156,73,156,74,156,75,228,199,228,193,156,76,228,196,181,173,156,77,156,78,211,217,156,79,228,198,156,80,156,81,156,82,156,83,210,249,180,227,156,84,187,180,156,85,156,86,201,238,156,87,180,190,156,88,156,89,156,90,187,236,156,91,209,205,156,92,204,237,237,181,156,93,156,94,156,95,156,96,156,97,156,98,156,99,156,100,199,229,156,101,156,102,156,103,156,104,212,168,156,105,228,203,215,213,228,194,156,106,189,165,228,197,156,107,156,108,211,230,156,109,228,201,201,248,156,110,156,111,228,190,156,112,156,113,211,229,156,114,156,115,199,254,182,201,156,116,212,252,178,179,228,215,156,117,156,118,156,119,206,194,156,120,228,205,156,121,206,188,156,122,184,219,156,123,156,124,228,214,156,125,191,202,156,126,156,128,156,129,211,206,156,130,195,236,156,131,156,132,156,133,156,134,156,135,156,136,156,137,156,138,197,200,228,216,156,139,156,140,156,141,156,142,156,143,156,144,156,145,156,146,205,196,228,207,156,147,156,148,156,149,156,150,228,212,228,213,156,151,186,254,156,152,207,230,156,153,156,154,213,191,156,155,156,156,156,157,228,210,156,158,156,159,156,160,156,161,156,162,156,163,156,164,156,165,156,166,156,167,156,168,228,208,156,169,156,170,228,206,156,171,156,172,156,173,156,174,156,175,156,176,156,177,156,178,156,179,156,180,156,181,156,182,156,183,156,184,156,185,205,229,202,170,156,186,156,187,156,188,192,163,156,189,189,166,228,211,156,190,156,191,184,200,156,192,156,193,156,194,156,195,156,196,228,231,212,180,156,197,156,198,156,199,156,200,156,201,156,202,156,203,228,219,156,204,156,205,156,206,193,239,156,207,156,208,228,233,156,209,156,210,210,231,156,211,156,212,228,223,156,213,228,224,156,214,156,215,207,170,156,216,156,217,156,218,156,219,203,221,156,220,228,218,228,209,156,221,228,229,156,222,200,220,228,227,156,223,156,224,196,231,228,226,156,225,228,225,156,226,156,227,156,228,179,252,228,232,156,229,156,230,156,231,156,232,181,225,156,233,156,234,156,235,215,204,156,236,156,237,156,238,228,230,156,239,187,172,156,240,215,210,204,207,235,248,156,241,228,228,156,242,156,243,185,246,156,244,156,245,156,246,214,205,228,217,228,220,194,250,228,222,156,247,194,203,192,196,194,208,156,248,177,245,204,178,156,249,156,250,156,251,156,252,156,253,156,254,157,64,157,65,157,66,157,67,181,206,157,68,157,69,157,70,157,71,228,239,157,72,157,73,157,74,157,75,157,76,157,77,157,78,157,79,198,175,157,80,157,81,157,82,198,225,157,83,157,84,228,245,157,85,157,86,157,87,157,88,157,89,194,169,157,90,157,91,157,92,192,236,209,221,228,238,157,93,157,94,157,95,157,96,157,97,157,98,157,99,157,100,157,101,157,102,196,174,157,103,157,104,157,105,228,237,157,106,157,107,157,108,157,109,228,246,228,244,194,254,157,110,228,221,157,111,228,240,157,112,202,254,157,113,213,196,157,114,157,115,228,241,157,116,157,117,157,118,157,119,157,120,157,121,157,122,209,250,157,123,157,124,157,125,157,126,157,128,157,129,157,130,228,235,228,236,157,131,157,132,157,133,228,242,157,134,206,171,157,135,157,136,157,137,157,138,157,139,157,140,157,141,157,142,157,143,157,144,197,203,157,145,157,146,157,147,199,177,157,148,194,186,157,149,157,150,157,151,228,234,157,152,157,153,157,154,193,202,157,155,157,156,157,157,157,158,157,159,157,160,204,182,179,177,157,161,157,162,157,163,228,251,157,164,228,243,157,165,157,166,157,167,228,250,157,168,228,253,157,169,228,252,157,170,157,171,157,172,157,173,157,174,157,175,157,176,179,206,157,177,157,178,157,179,179,186,228,247,157,180,157,181,228,249,228,248,197,236,157,182,157,183,157,184,157,185,157,186,157,187,157,188,157,189,157,190,157,191,157,192,157,193,157,194,192,189,157,195,157,196,157,197,157,198,212,232,157,199,157,200,157,201,157,202,157,203,229,162,157,204,157,205,157,206,157,207,157,208,157,209,157,210,157,211,157,212,157,213,157,214,176,196,157,215,157,216,229,164,157,217,157,218,229,163,157,219,157,220,157,221,157,222,157,223,157,224,188,164,157,225,229,165,157,226,157,227,157,228,157,229,157,230,157,231,229,161,157,232,157,233,157,234,157,235,157,236,157,237,157,238,228,254,177,244,157,239,157,240,157,241,157,242,157,243,157,244,157,245,157,246,157,247,157,248,157,249,229,168,157,250,229,169,229,166,157,251,157,252,157,253,157,254,158,64,158,65,158,66,158,67,158,68,158,69,158,70,158,71,229,167,229,170,158,72,158,73,158,74,158,75,158,76,158,77,158,78,158,79,158,80,158,81,158,82,158,83,158,84,158,85,158,86,158,87,158,88,158,89,158,90,158,91,158,92,158,93,158,94,158,95,158,96,158,97,158,98,158,99,158,100,158,101,158,102,158,103,158,104,198,217,158,105,158,106,158,107,158,108,158,109,158,110,158,111,158,112,229,171,229,173,158,113,158,114,158,115,158,116,158,117,158,118,158,119,229,172,158,120,158,121,158,122,158,123,158,124,158,125,158,126,158,128,158,129,158,130,158,131,158,132,158,133,158,134,158,135,158,136,158,137,229,175,158,138,158,139,158,140,229,174,158,141,158,142,158,143,158,144,158,145,158,146,158,147,158,148,158,149,158,150,158,151,158,152,158,153,158,154,158,155,158,156,158,157,158,158,185,224,158,159,158,160,229,176,158,161,158,162,158,163,158,164,158,165,158,166,158,167,158,168,158,169,158,170,158,171,158,172,158,173,158,174,229,177,158,175,158,176,158,177,158,178,158,179,158,180,158,181,158,182,158,183,158,184,158,185,158,186,187,240,236,225,195,240,158,187,181,198,187,210,158,188,158,189,158,190,158,191,193,233,212,238,158,192,190,196,158,193,158,194,158,195,215,198,158,196,212,214,178,211,236,190,158,197,158,198,158,199,158,200,234,193,158,201,158,202,158,203,194,175,180,182,158,204,158,205,158,206,209,215,158,207,158,208,158,209,179,180,158,210,200,178,191,187,236,192,158,211,158,212,214,203,158,213,158,214,236,191,236,193,158,215,158,216,158,217,158,218,158,219,158,220,158,221,158,222,158,223,158,224,158,225,158,226,158,227,236,197,190,230,204,191,197,218,190,188,158,228,236,198,158,229,177,254,158,230,158,231,158,232,236,196,213,168,181,227,158,233,236,194,193,182,179,227,158,234,158,235,236,195,203,184,192,195,204,254,158,236,158,237,158,238,158,239,193,210,158,240,236,200,158,241,158,242,158,243,158,244,158,245,158,246,158,247,158,248,158,249,158,250,158,251,158,252,158,253,186,230,192,211,158,254,214,242,159,64,159,65,159,66,209,204,159,67,159,68,159,69,159,70,191,190,159,71,183,179,201,213,236,199,187,226,159,72,204,204,189,253,200,200,159,73,207,169,159,74,159,75,159,76,159,77,159,78,159,79,159,80,205,233,159,81,197,235,159,82,159,83,159,84,183,233,159,85,159,86,159,87,159,88,159,89,159,90,159,91,159,92,159,93,159,94,159,95,209,201,186,184,159,96,159,97,159,98,159,99,159,100,236,201,159,101,159,102,236,202,159,103,187,192,236,203,159,104,236,226,177,186,183,217,159,105,159,106,159,107,159,108,159,109,159,110,159,111,159,112,159,113,159,114,159,115,189,185,159,116,159,117,159,118,159,119,159,120,159,121,159,122,159,123,236,204,209,230,236,205,159,124,159,125,159,126,159,128,200,187,159,129,159,130,159,131,159,132,159,133,159,134,159,135,159,136,159,137,159,138,159,139,159,140,159,141,159,142,236,209,159,143,159,144,159,145,159,146,236,211,159,147,187,205,159,148,188,229,159,149,159,150,159,151,159,152,159,153,159,154,159,155,159,156,159,157,159,158,159,159,159,160,159,161,236,207,159,162,201,183,159,163,159,164,159,165,159,166,159,167,195,186,159,168,236,227,213,213,236,208,159,169,159,170,159,171,159,172,159,173,214,243,159,174,159,175,159,176,236,210,236,206,159,177,159,178,159,179,159,180,236,212,159,181,236,213,159,182,159,183,201,191,159,184,159,185,159,186,159,187,159,188,159,189,207,168,159,190,159,191,159,192,159,193,159,194,208,220,159,195,159,196,159,197,159,198,209,172,159,199,159,200,159,201,159,202,200,219,159,203,159,204,159,205,236,214,206,245,159,206,159,207,159,208,159,209,159,210,202,236,236,218,159,211,159,212,159,213,159,214,159,215,159,216,159,217,236,217,159,218,159,219,159,220,176,190,159,221,159,222,159,223,159,224,159,225,159,226,236,215,159,227,236,216,159,228,159,229,159,230,236,228,159,231,159,232,159,233,159,234,159,235,159,236,159,237,159,238,159,239,200,188,159,240,159,241,159,242,159,243,159,244,159,245,159,246,159,247,159,248,159,249,193,199,159,250,159,251,159,252,159,253,159,254,236,220,209,224,160,64,160,65,160,66,160,67,160,68,160,69,160,70,160,71,160,72,160,73,236,219,160,74,160,75,160,76,160,77,212,239,160,78,236,221,160,79,160,80,160,81,160,82,160,83,160,84,219,198,160,85,160,86,160,87,160,88,160,89,160,90,160,91,160,92,160,93,160,94,236,222,160,95,160,96,160,97,160,98,160,99,160,100,160,101,160,102,160,103,160,104,160,105,160,106,177,172,160,107,160,108,160,109,160,110,160,111,160,112,160,113,160,114,160,115,160,116,160,117,160,118,160,119,160,120,160,121,160,122,160,123,160,124,160,125,160,126,160,128,160,129,236,223,160,130,160,131,160,132,160,133,160,134,160,135,160,136,160,137,160,138,160,139,236,224,160,140,215,166,160,141,197,192,160,142,160,143,160,144,235,188,176,174,160,145,160,146,160,147,190,244,184,184,210,175,176,214,181,249,160,148,216,179,160,149,203,172,160,150,227,221,160,151,160,152,160,153,160,154,160,155,160,156,160,157,198,172,176,230,160,158,160,159,160,160,197,198,235,185,160,161,160,162,160,163,160,164,235,186,160,165,160,166,160,167,235,187,160,168,160,169,209,192,160,170,197,163,160,171,234,242,160,172,196,178,160,173,196,181,192,206,160,174,160,175,160,176,234,243,196,193,160,177,206,239,160,178,160,179,160,180,160,181,234,240,234,244,160,182,160,183,201,252,160,184,160,185,199,163,160,186,160,187,160,188,204,216,206,254,160,189,160,190,160,191,234,245,234,246,207,172,192,231,160,192,160,193,234,247,160,194,160,195,160,196,160,197,160,198,182,191,234,248,160,199,234,249,160,200,234,250,160,201,160,202,234,251,160,203,160,204,160,205,160,206,160,207,160,208,160,209,160,210,160,211,160,212,160,213,160,214,234,241,160,215,160,216,160,217,160,218,160,219,160,220,160,221,160,222,160,223,160,224,160,225,160,226,200,174,225,235,160,227,183,184,225,236,160,228,160,229,160,230,225,237,160,231,215,180,225,238,225,239,211,204,160,232,160,233,160,234,160,235,160,236,160,237,160,238,225,241,191,241,225,240,181,210,160,239,160,240,160,241,177,183,160,242,160,243,160,244,160,245,225,243,225,242,160,246,186,252,160,247,225,244,160,248,160,249,160,250,160,251,185,183,160,252,190,209,160,253,160,254,170,64,170,65,196,252,170,66,186,221,189,198,170,67,170,68,170,69,170,70,170,71,170,72,225,245,225,247,170,73,170,74,182,192,207,193,202,168,225,246,213,248,211,252,225,248,225,252,225,249,170,75,170,76,225,250,192,234,170,77,225,254,226,161,192,199,170,78,170,79,170,80,170,81,225,251,170,82,225,253,170,83,170,84,170,85,170,86,170,87,170,88,226,165,170,89,170,90,170,91,193,212,170,92,170,93,170,94,170,95,226,163,170,96,226,168,178,254,226,162,170,97,170,98,170,99,195,205,178,194,226,167,226,166,170,100,170,101,226,164,226,169,170,102,170,103,226,171,170,104,170,105,170,106,208,201,214,237,195,168,226,172,170,107,207,215,170,108,170,109,226,174,170,110,170,111,186,239,170,112,170,113,233,224,226,173,226,170,170,114,170,115,170,116,170,117,187,171,212,179,170,118,170,119,170,120,170,121,170,122,170,123,170,124,170,125,170,126,170,128,170,129,170,130,170,131,226,176,170,132,170,133,226,175,170,134,233,225,170,135,170,136,170,137,170,138,226,177,170,139,170,140,170,141,170,142,170,143,170,144,170,145,170,146,226,178,170,147,170,148,170,149,170,150,170,151,170,152,170,153,170,154,170,155,170,156,170,157,226,179,204,161,170,158,226,180,170,159,170,160,171,64,171,65,171,66,171,67,171,68,171,69,171,70,171,71,171,72,171,73,171,74,171,75,226,181,171,76,171,77,171,78,171,79,171,80,208,254,171,81,171,82,194,202,171,83,211,241,171,84,205,245,171,85,171,86,231,224,171,87,171,88,231,225,171,89,171,90,171,91,171,92,190,193,171,93,171,94,171,95,171,96,194,234,171,97,171,98,171,99,231,228,171,100,171,101,231,227,171,102,171,103,171,104,171,105,171,106,171,107,205,230,171,108,195,181,171,109,171,110,231,226,187,183,207,214,171,111,193,225,231,233,171,112,171,113,171,114,231,232,171,115,171,116,231,244,178,163,171,117,171,118,171,119,171,120,231,234,171,121,231,230,171,122,171,123,171,124,171,125,171,126,231,236,231,235,201,186,171,128,171,129,213,228,171,130,231,229,183,169,231,231,171,131,171,132,171,133,171,134,171,135,171,136,171,137,231,238,171,138,171,139,171,140,171,141,231,243,171,142,214,233,171,143,171,144,171,145,171,146,231,237,171,147,231,242,171,148,231,241,171,149,171,150,171,151,176,224,171,152,171,153,171,154,171,155,231,245,171,156,171,157,171,158,171,159,171,160,172,64,172,65,172,66,172,67,172,68,172,69,172,70,172,71,172,72,172,73,172,74,199,242,172,75,192,197,192,237,172,76,172,77,193,240,231,240,172,78,172,79,172,80,172,81,231,246,203,246,172,82,172,83,172,84,172,85,172,86,172,87,172,88,172,89,172,90,232,162,232,161,172,91,172,92,172,93,172,94,172,95,172,96,215,193,172,97,172,98,231,250,231,249,172,99,231,251,172,100,231,247,172,101,231,254,172,102,231,253,172,103,231,252,172,104,172,105,193,213,199,217,197,253,197,195,172,106,172,107,172,108,172,109,172,110,199,237,172,111,172,112,172,113,172,114,232,163,172,115,172,116,172,117,172,118,172,119,172,120,172,121,172,122,172,123,172,124,172,125,172,126,172,128,172,129,172,130,172,131,172,132,172,133,172,134,232,166,172,135,232,165,172,136,232,167,186,247,231,248,232,164,172,137,200,240,201,170,172,138,172,139,172,140,172,141,172,142,172,143,172,144,172,145,172,146,172,147,172,148,172,149,172,150,232,169,172,151,172,152,185,229,172,153,172,154,172,155,172,156,172,157,209,254,232,168,172,158,172,159,172,160,173,64,173,65,173,66,232,170,173,67,232,173,232,174,173,68,193,167,173,69,173,70,173,71,232,175,173,72,173,73,173,74,232,176,173,75,173,76,232,172,173,77,232,180,173,78,173,79,173,80,173,81,173,82,173,83,173,84,173,85,173,86,173,87,173,88,232,171,173,89,232,177,173,90,173,91,173,92,173,93,173,94,173,95,173,96,173,97,232,181,232,178,232,179,173,98,173,99,173,100,173,101,173,102,173,103,173,104,173,105,173,106,173,107,173,108,173,109,173,110,173,111,173,112,173,113,232,183,173,114,173,115,173,116,173,117,173,118,173,119,173,120,173,121,173,122,173,123,173,124,173,125,173,126,173,128,173,129,173,130,173,131,173,132,173,133,173,134,173,135,173,136,173,137,232,182,173,138,173,139,173,140,173,141,173,142,173,143,173,144,173,145,173,146,185,207,173,147,240,172,173,148,240,173,173,149,198,176,176,234,200,191,173,150,205,223,173,151,173,152,173,153,173,154,173,155,173,156,173,157,206,205,234,177,173,158,173,159,173,160,174,64,234,178,174,65,198,191,180,201,174,66,174,67,174,68,174,69,174,70,174,71,174,72,234,179,174,73,174,74,174,75,174,76,213,231,174,77,174,78,174,79,174,80,174,81,174,82,174,83,174,84,221,249,174,85,234,180,174,86,234,181,174,87,234,182,174,88,174,89,174,90,174,91,184,202,223,176,201,245,174,92,204,240,174,93,174,94,201,250,174,95,174,96,174,97,174,98,174,99,201,251,174,100,174,101,211,195,203,166,174,102,184,166,240,174,177,194,174,103,229,184,204,239,211,201,188,215,201,234,174,104,181,231,174,105,196,208,181,233,174,106,238,174,187,173,174,107,174,108,231,222,174,109,238,175,174,110,174,111,174,112,174,113,179,169,174,114,174,115,238,178,174,116,174,117,238,177,189,231,174,118,238,176,206,183,174,119,174,120,174,121,174,122,197,207,174,123,174,124,174,125,174,126,193,244,219,206,238,179,208,243,174,128,174,129,174,130,174,131,174,132,174,133,174,134,174,135,194,212,198,232,174,136,174,137,174,138,183,172,174,139,174,140,174,141,174,142,174,143,174,144,174,145,238,180,174,146,179,235,174,147,174,148,174,149,187,251,238,181,174,150,174,151,174,152,174,153,174,154,231,220,174,155,174,156,174,157,238,182,174,158,174,159,189,174,174,160,175,64,175,65,175,66,241,226,175,67,175,68,175,69,202,232,175,70,210,201,240,218,175,71,240,219,175,72,240,220,193,198,175,73,184,237,190,206,175,74,175,75,240,222,175,76,197,177,240,221,209,241,175,77,240,224,176,204,189,234,175,78,175,79,175,80,175,81,175,82,210,223,240,223,175,83,180,175,183,232,240,230,240,229,198,163,240,225,240,226,180,195,175,84,175,85,240,227,213,238,175,86,175,87,204,219,190,210,188,178,175,88,175,89,175,90,240,232,240,231,240,228,178,161,175,91,214,162,211,184,190,183,200,172,175,92,175,93,240,234,175,94,175,95,175,96,175,97,209,247,175,98,214,204,186,219,240,233,175,99,182,187,175,100,175,101,205,180,175,102,175,103,198,166,175,104,175,105,175,106,193,161,240,235,240,238,175,107,240,237,240,240,240,236,175,108,187,190,240,239,175,109,175,110,175,111,175,112,204,181,240,242,175,113,175,114,179,213,175,115,175,116,175,117,175,118,177,212,175,119,175,120,240,243,175,121,175,122,240,244,240,246,180,225,175,123,240,241,175,124,240,247,175,125,175,126,175,128,175,129,240,250,175,130,240,248,175,131,175,132,175,133,240,245,175,134,175,135,175,136,175,137,240,253,175,138,240,249,240,252,240,254,175,139,241,161,175,140,175,141,175,142,206,193,241,164,175,143,241,163,175,144,193,246,240,251,202,221,175,145,175,146,180,241,177,241,204,177,175,147,241,166,175,148,175,149,241,167,175,150,175,151,241,172,213,206,241,169,175,152,175,153,200,179,175,154,175,155,175,156,241,162,175,157,241,171,241,168,241,165,175,158,175,159,241,170,175,160,176,64,176,65,176,66,176,67,176,68,176,69,176,70,176,169,241,173,176,71,176,72,176,73,176,74,176,75,176,76,241,175,176,77,241,177,176,78,176,79,176,80,176,81,176,82,241,176,176,83,241,174,176,84,176,85,176,86,176,87,209,162,176,88,176,89,176,90,176,91,176,92,176,93,176,94,241,178,176,95,176,96,176,97,241,179,176,98,176,99,176,100,176,101,176,102,176,103,176,104,176,105,185,239,176,106,176,107,181,199,176,108,176,215,176,217,176,109,176,110,176,111,212,237,176,112,181,196,176,113,189,212,187,202,240,167,176,114,176,115,184,222,176,116,176,117,240,168,176,118,176,119,176,168,176,120,240,169,176,121,176,122,205,238,176,123,176,124,240,170,176,125,176,126,176,128,176,129,176,130,176,131,176,132,176,133,176,134,176,135,240,171,176,136,176,137,176,138,176,139,176,140,176,141,176,142,176,143,176,144,198,164,176,145,176,146,214,229,241,228,176,147,241,229,176,148,176,149,176,150,176,151,176,152,176,153,176,154,176,155,176,156,176,157,195,243,176,158,176,159,211,219,176,160,177,64,214,209,197,232,177,65,211,175,177,66,210,230,177,67,177,68,238,193,176,187,213,181,209,206,188,224,186,208,177,69,191,248,177,70,184,199,181,193,197,204,177,71,177,72,202,162,177,73,177,74,177,75,195,203,177,76,177,77,177,78,177,79,177,80,238,194,177,81,177,82,177,83,177,84,177,85,177,86,177,87,177,88,196,191,182,162,177,89,237,236,195,164,177,90,214,177,177,91,177,92,177,93,207,224,237,239,177,94,177,95,197,206,177,96,182,220,177,97,177,98,202,161,177,99,177,100,237,237,177,101,177,102,237,240,237,241,195,188,177,103,191,180,177,104,237,238,177,105,177,106,177,107,177,108,177,109,177,110,177,111,177,112,177,113,177,114,177,115,237,244,237,242,177,116,177,117,177,118,177,119,213,230,195,223,177,120,237,243,177,121,177,122,177,123,237,246,177,124,213,163,209,163,177,125,177,126,177,128,237,245,177,129,195,208,177,130,177,131,177,132,177,133,177,134,237,247,191,244,190,236,237,248,177,135,204,247,177,136,209,219,177,137,177,138,177,139,215,197,213,246,177,140,237,252,177,141,177,142,177,143,237,251,177,144,177,145,177,146,177,147,177,148,177,149,177,150,177,151,237,249,237,250,177,152,177,153,177,154,177,155,177,156,177,157,177,158,177,159,237,253,190,166,177,160,178,64,178,65,178,66,178,67,203,175,238,161,182,189,178,68,238,162,196,192,178,69,237,254,178,70,178,71,189,222,178,199,178,72,178,73,178,74,178,75,178,76,178,77,178,78,178,79,178,80,178,81,178,82,178,83,182,195,178,84,178,85,178,86,238,165,216,186,238,163,238,166,178,87,178,88,178,89,195,233,179,242,178,90,178,91,178,92,178,93,178,94,178,95,238,167,238,164,207,185,178,96,178,97,238,168,194,247,178,98,178,99,178,100,178,101,178,102,178,103,178,104,178,105,178,106,178,107,178,108,178,109,238,169,238,170,178,110,222,171,178,111,178,112,198,179,178,113,199,198,178,114,214,245,181,201,178,115,203,178,178,116,178,117,178,118,238,171,178,119,178,120,205,171,178,121,238,172,178,122,178,123,178,124,178,125,178,126,213,176,178,128,238,173,178,129,246,196,178,130,178,131,178,132,178,133,178,134,178,135,178,136,178,137,178,138,178,139,178,140,178,141,178,142,219,199,178,143,178,144,178,145,178,146,178,147,178,148,178,149,178,150,178,151,180,163,178,152,178,153,178,154,195,172,241,230,178,155,178,156,178,157,178,158,178,159,202,184,210,211,178,160,214,170,179,64,239,242,179,65,190,216,179,66,189,195,239,243,182,204,176,171,179,67,179,68,179,69,179,70,202,175,179,71,179,72,237,182,179,73,237,183,179,74,179,75,179,76,179,77,206,249,183,175,191,243,237,184,194,235,201,176,179,78,179,79,179,80,179,81,179,82,179,83,237,185,179,84,179,85,198,246,191,179,179,86,179,87,179,88,237,188,197,248,179,89,209,208,179,90,215,169,237,186,237,187,179,91,209,226,179,92,237,191,237,192,179,93,237,196,179,94,179,95,179,96,237,200,179,97,237,198,237,206,213,232,179,98,237,201,179,99,179,100,237,199,237,190,179,101,179,102,197,233,179,103,179,104,179,105,198,198,179,106,179,107,201,233,212,210,237,193,237,194,237,195,237,197,179,108,192,249,179,109,180,161,179,110,179,111,179,112,179,113,185,232,179,114,237,208,179,115,179,116,179,117,179,118,237,209,179,119,237,202,179,120,237,207,179,121,206,248,179,122,179,123,203,182,237,204,237,205,179,124,179,125,179,126,179,128,179,129,207,245,179,130,179,131,179,132,179,133,179,134,179,135,179,136,179,137,179,138,179,139,179,140,179,141,237,210,193,242,211,178,237,203,200,183,179,142,179,143,179,144,179,145,179,146,179,147,179,148,179,149,188,239,179,150,179,151,179,152,179,153,197,240,179,154,179,155,179,156,179,157,179,158,179,159,179,160,180,64,180,65,180,66,237,214,180,67,181,239,180,68,180,69,194,181,176,173,203,233,180,70,180,71,177,174,180,72,237,212,180,73,180,74,180,75,205,235,181,226,180,76,237,213,237,211,237,215,180,77,180,78,181,250,180,79,237,216,180,80,237,217,180,81,237,220,180,82,177,204,180,83,180,84,180,85,180,86,180,87,180,88,180,89,180,90,197,246,188,238,237,218,204,188,178,234,180,91,180,92,180,93,180,94,237,219,180,95,180,96,180,97,180,98,196,235,180,99,180,100,180,197,180,101,180,102,180,103,176,245,180,104,180,105,180,106,237,223,192,218,180,232,180,107,180,108,180,109,180,110,197,205,180,111,180,112,180,113,237,221,191,196,180,114,180,115,180,116,237,222,180,117,180,118,180,119,180,120,180,121,180,122,180,123,180,124,180,125,180,126,180,128,180,129,180,130,180,131,196,165,180,132,180,133,180,134,237,224,180,135,180,136,180,137,180,138,180,139,237,225,180,140,237,227,180,141,180,142,193,215,180,143,180,144,187,199,180,145,180,146,180,147,180,148,180,149,180,150,189,184,180,151,180,152,180,153,237,226,180,154,180,155,180,156,180,157,180,158,180,159,180,160,181,64,181,65,181,66,181,67,181,68,181,69,237,228,181,70,181,71,181,72,181,73,181,74,181,75,181,76,181,77,181,78,181,79,237,230,181,80,181,81,181,82,181,83,181,84,237,229,181,85,181,86,181,87,181,88,181,89,181,90,181,91,181,92,181,93,181,94,181,95,181,96,181,97,181,98,181,99,237,231,181,100,181,101,181,102,181,103,181,104,202,190,236,234,192,241,181,105,201,231,181,106,236,235,198,238,181,107,181,108,181,109,181,110,236,236,181,111,198,237,236,237,181,112,181,113,181,114,181,115,181,116,181,117,181,118,181,119,181,120,236,240,181,121,181,122,215,230,236,243,181,123,181,124,236,241,236,238,236,239,215,163,201,241,203,238,236,244,181,125,236,242,181,126,181,128,207,233,181,129,236,246,198,177,181,130,181,131,181,132,181,133,188,192,181,134,236,245,181,135,181,136,181,137,181,138,181,139,181,140,181,141,181,187,187,246,181,142,236,247,181,143,181,144,181,145,181,146,181,147,217,247,189,251,181,148,181,149,194,187,236,248,181,150,181,151,181,152,181,153,236,249,181,154,181,155,181,156,181,157,184,163,181,158,181,159,181,160,182,64,182,65,182,66,182,67,182,68,182,69,182,70,236,250,182,71,182,72,182,73,182,74,182,75,182,76,182,77,182,78,182,79,182,80,182,81,182,82,236,251,182,83,182,84,182,85,182,86,182,87,182,88,182,89,182,90,182,91,182,92,182,93,236,252,182,94,182,95,182,96,182,97,182,98,211,237,216,174,192,235,182,99,199,221,186,204,182,100,208,227,203,189,182,101,205,186,182,102,182,103,184,209,182,104,182,105,177,252,182,106,199,239,182,107,214,214,182,108,182,109,182,110,191,198,195,235,182,111,182,112,239,245,182,113,182,114,195,216,182,115,182,116,182,117,182,118,182,119,182,120,215,226,182,121,182,122,182,123,239,247,179,211,182,124,199,216,209,237,182,125,214,200,182,126,239,248,182,128,239,246,182,129,187,253,179,198,182,130,182,131,182,132,182,133,182,134,182,135,182,136,189,213,182,137,182,138,210,198,182,139,187,224,182,140,182,141,207,161,182,142,239,252,239,251,182,143,182,144,239,249,182,145,182,146,182,147,182,148,179,204,182,149,201,212,203,176,182,150,182,151,182,152,182,153,182,154,239,254,182,155,182,156,176,222,182,157,182,158,214,201,182,159,182,160,183,64,239,253,183,65,179,237,183,66,183,67,246,213,183,68,183,69,183,70,183,71,183,72,183,73,183,74,183,75,183,76,183,77,183,78,183,79,183,80,183,81,183,82,206,200,183,83,183,84,183,85,240,162,183,86,240,161,183,87,181,190,188,218,187,252,183,88,184,229,183,89,183,90,183,91,183,92,183,93,183,94,196,194,183,95,183,96,183,97,183,98,183,99,183,100,183,101,183,102,183,103,183,104,240,163,183,105,183,106,183,107,183,108,183,109,203,235,183,110,183,111,183,112,183,113,183,114,183,115,183,116,183,117,183,118,183,119,183,120,183,121,183,122,183,123,183,124,183,125,183,126,183,128,183,129,183,130,183,131,183,132,183,133,183,134,240,166,183,135,183,136,183,137,209,168,183,138,190,191,199,238,241,182,241,183,191,213,183,139,183,140,183,141,183,142,180,169,241,184,205,187,183,143,199,212,213,173,183,144,241,185,183,145,241,186,183,146,183,147,183,148,183,149,199,207,183,150,183,151,183,152,210,164,214,207,183,153,183,154,241,187,189,209,180,176,190,189,183,155,183,156,183,157,180,220,206,209,183,158,191,223,241,189,183,159,183,160,184,64,184,65,191,250,241,188,184,66,241,191,184,67,184,68,184,69,241,190,241,192,184,70,184,71,184,72,184,73,184,74,241,193,184,75,184,76,184,77,184,78,184,79,184,80,184,81,184,82,184,83,184,84,184,85,193,254,184,86,184,87,184,88,184,89,184,90,184,91,184,92,184,93,184,94,184,95,184,96,193,162,184,97,184,98,184,99,184,100,184,101,184,102,184,103,184,104,184,105,184,106,202,250,184,107,184,108,213,190,184,109,184,110,184,111,184,112,190,186,190,185,213,194,184,113,184,114,191,162,184,115,205,175,241,181,184,116,184,117,184,118,184,119,184,120,184,121,189,223,184,122,182,203,184,123,184,124,184,125,184,126,184,128,184,129,184,130,184,131,184,132,214,241,243,195,184,133,184,134,243,196,184,135,184,205,184,136,184,137,184,138,243,198,243,199,184,139,176,202,184,140,243,197,184,141,243,201,203,241,184,142,184,143,184,144,243,203,184,145,208,166,184,146,184,147,177,202,243,200,184,148,184,149,184,150,243,207,184,151,181,209,184,152,184,153,243,215,184,154,243,210,184,155,184,156,184,157,243,212,243,211,183,251,184,158,177,191,184,159,243,206,243,202,181,218,184,160,243,208,185,64,185,65,243,209,185,66,243,213,185,67,185,68,185,69,185,70,243,205,185,71,188,227,185,72,193,253,185,73,243,214,185,74,185,75,185,76,185,77,185,78,185,79,243,218,185,80,243,204,185,81,181,200,185,82,189,238,243,220,185,83,185,84,183,164,191,240,214,254,205,178,185,85,180,240,185,86,178,223,185,87,243,216,185,88,243,217,201,184,185,89,243,221,185,90,185,91,243,222,185,92,243,225,185,93,185,94,185,95,185,96,185,97,185,98,185,99,185,100,185,101,185,102,185,103,243,223,185,104,185,105,243,227,243,226,185,106,185,107,243,219,185,108,191,234,185,109,179,239,185,110,243,224,185,111,185,112,199,169,185,113,188,242,185,114,185,115,185,116,185,117,243,235,185,118,185,119,185,120,185,121,185,122,185,123,185,124,185,191,185,125,185,126,243,228,185,128,185,129,185,130,178,173,187,254,185,131,203,227,185,132,185,133,185,134,185,135,243,237,243,233,185,136,185,137,185,138,185,220,243,238,185,139,185,140,185,141,243,229,243,230,243,234,194,225,243,236,243,239,243,232,188,253,185,142,185,143,185,144,207,228,185,145,185,146,243,240,185,147,185,148,185,149,243,231,185,150,185,151,185,152,185,153,185,154,185,155,185,156,185,157,243,242,185,158,185,159,185,160,186,64,215,173,198,170,186,65,186,66,186,67,186,68,243,243,186,69,186,70,186,71,186,72,243,241,186,73,194,168,186,74,186,75,186,76,186,77,186,78,184,221,243,245,186,79,186,80,243,244,186,81,186,82,186,83,180,219,186,84,186,85,186,86,243,246,243,247,186,87,186,88,186,89,243,248,186,90,186,91,186,92,192,186,186,93,186,94,192,233,186,95,186,96,186,97,186,98,186,99,197,241,186,100,186,101,186,102,186,103,243,251,186,104,243,250,186,105,186,106,186,107,186,108,186,109,186,110,186,111,186,112,180,216,186,113,186,114,186,115,243,254,243,249,186,116,186,117,243,252,186,118,186,119,186,120,186,121,186,122,186,123,243,253,186,124,186,125,186,126,186,128,186,129,186,130,186,131,186,132,244,161,186,133,186,134,186,135,186,136,186,137,186,138,244,163,187,201,186,139,186,140,244,162,186,141,186,142,186,143,186,144,186,145,186,146,186,147,186,148,186,149,186,150,186,151,186,152,186,153,244,164,186,154,186,155,186,156,186,157,186,158,186,159,178,190,244,166,244,165,186,160,187,64,187,65,187,66,187,67,187,68,187,69,187,70,187,71,187,72,187,73,188,174,187,74,187,75,187,76,187,77,187,78,187,79,187,80,187,81,187,82,187,83,187,84,187,85,187,86,187,87,187,88,187,89,187,90,187,91,187,92,187,93,187,94,187,95,187,96,187,97,187,98,187,99,187,100,187,101,187,102,187,103,187,104,187,105,187,106,187,107,187,108,187,109,187,110,195,215,217,225,187,111,187,112,187,113,187,114,187,115,187,116,192,224,244,204,215,209,187,117,187,118,187,119,187,120,187,121,187,122,187,123,187,124,187,125,187,126,187,128,183,219,187,129,187,130,187,131,187,132,187,133,187,134,187,135,244,206,193,163,187,136,187,137,198,201,187,138,180,214,213,179,187,139,187,140,187,141,244,208,244,207,244,209,203,218,187,142,187,143,244,210,187,144,212,193,214,224,187,145,187,146,187,147,187,148,183,224,187,149,187,150,187,151,193,184,187,152,187,153,193,187,244,211,190,172,187,154,187,155,187,156,187,157,187,158,180,226,187,159,187,160,244,212,244,213,190,171,188,64,188,65,244,214,188,66,188,67,188,68,244,219,188,69,244,215,244,218,188,70,186,253,188,71,244,216,244,217,188,72,188,73,188,74,188,75,188,76,188,77,188,78,184,226,204,199,244,220,188,79,178,218,188,80,188,81,195,211,188,82,188,83,212,227,191,183,188,84,188,85,188,86,188,87,188,88,188,89,188,90,244,221,188,91,188,92,188,93,188,94,188,95,188,96,197,180,188,97,188,98,188,99,188,100,188,101,188,102,188,103,188,104,244,233,188,105,188,106,207,181,188,107,188,108,188,109,188,110,188,111,188,112,188,113,188,114,188,115,188,116,188,117,188,118,188,119,188,120,206,201,188,121,188,122,188,123,188,124,188,125,188,126,188,128,188,129,188,130,188,131,188,132,188,133,188,134,188,135,188,136,188,137,188,138,188,139,188,140,188,141,188,142,203,216,188,143,203,247,188,144,188,145,188,146,188,147,189,244,188,148,188,149,188,150,215,207,188,151,188,152,188,153,192,219,188,154,188,155,188,156,188,157,188,158,188,159,188,160,189,64,189,65,189,66,189,67,189,68,189,69,189,70,189,71,189,72,189,73,189,74,189,75,189,76,189,77,189,78,189,79,189,80,189,81,189,82,189,83,189,84,189,85,189,86,189,87,189,88,189,89,189,90,189,91,189,92,189,93,189,94,189,95,189,96,189,97,189,98,189,99,189,100,189,101,189,102,189,103,189,104,189,105,189,106,189,107,189,108,189,109,189,110,189,111,189,112,189,113,189,114,189,115,189,116,189,117,189,118,208,245,189,119,189,120,189,121,189,122,189,123,189,124,189,125,189,126,244,234,189,128,189,129,189,130,189,131,189,132,189,133,189,134,189,135,189,136,189,137,189,138,189,139,189,140,189,141,189,142,189,143,189,144,189,145,189,146,189,147,189,148,189,149,189,150,189,151,189,152,189,153,189,154,189,155,189,156,189,157,189,158,189,159,189,160,190,64,190,65,190,66,190,67,190,68,190,69,190,70,190,71,190,72,190,73,190,74,190,75,190,76,244,235,190,77,190,78,190,79,190,80,190,81,190,82,190,83,244,236,190,84,190,85,190,86,190,87,190,88,190,89,190,90,190,91,190,92,190,93,190,94,190,95,190,96,190,97,190,98,190,99,190,100,190,101,190,102,190,103,190,104,190,105,190,106,190,107,190,108,190,109,190,110,190,111,190,112,190,113,190,114,190,115,190,116,190,117,190,118,190,119,190,120,190,121,190,122,190,123,190,124,190,125,190,126,190,128,190,129,190,130,190,131,190,132,190,133,190,134,190,135,190,136,190,137,190,138,190,139,190,140,190,141,190,142,190,143,190,144,190,145,190,146,190,147,190,148,190,149,190,150,190,151,190,152,190,153,190,154,190,155,190,156,190,157,190,158,190,159,190,160,191,64,191,65,191,66,191,67,191,68,191,69,191,70,191,71,191,72,191,73,191,74,191,75,191,76,191,77,191,78,191,79,191,80,191,81,191,82,191,83,191,84,191,85,191,86,191,87,191,88,191,89,191,90,191,91,191,92,191,93,191,94,191,95,191,96,191,97,191,98,191,99,191,100,191,101,191,102,191,103,191,104,191,105,191,106,191,107,191,108,191,109,191,110,191,111,191,112,191,113,191,114,191,115,191,116,191,117,191,118,191,119,191,120,191,121,191,122,191,123,191,124,191,125,191,126,191,128,247,227,191,129,191,130,191,131,191,132,191,133,183,177,191,134,191,135,191,136,191,137,191,138,244,237,191,139,191,140,191,141,191,142,191,143,191,144,191,145,191,146,191,147,191,148,191,149,191,150,191,151,191,152,191,153,191,154,191,155,191,156,191,157,191,158,191,159,191,160,192,64,192,65,192,66,192,67,192,68,192,69,192,70,192,71,192,72,192,73,192,74,192,75,192,76,192,77,192,78,192,79,192,80,192,81,192,82,192,83,192,84,192,85,192,86,192,87,192,88,192,89,192,90,192,91,192,92,192,93,192,94,192,95,192,96,192,97,192,98,192,99,215,235,192,100,192,101,192,102,192,103,192,104,192,105,192,106,192,107,192,108,192,109,192,110,192,111,192,112,192,113,192,114,192,115,192,116,192,117,192,118,192,119,192,120,192,121,192,122,192,123,244,238,192,124,192,125,192,126,230,249,190,192,230,250,186,236,230,251,207,203,230,252,212,188,188,182,230,253,230,254,188,205,200,210,206,179,231,161,192,128,180,191,231,162,201,180,184,217,196,201,192,129,215,221,194,218,183,215,214,189,206,198,183,196,192,130,192,131,197,166,231,163,207,223,231,164,231,165,231,166,193,183,215,233,201,240,207,184,214,175,214,213,231,167,176,237,231,168,231,169,201,220,210,239,190,173,231,170,176,243,200,222,189,225,231,171,200,198,192,132,231,172,187,230,184,248,209,164,231,173,194,231,190,248,189,202,205,179,231,174,231,175,190,238,208,229,192,133,203,231,204,208,188,204,231,176,188,168,208,247,231,177,192,134,208,248,231,178,231,179,180,194,231,180,231,181,201,254,206,172,195,224,231,183,177,193,179,241,192,135,231,184,231,185,215,219,213,192,231,186,194,204,215,186,231,187,231,188,231,189,188,234,195,229,192,194,231,190,231,191,188,169,192,136,231,192,231,193,231,182,182,208,231,194,192,137,231,195,231,196,187,186,181,222,194,198,177,224,231,197,212,181,231,198,184,191,231,200,231,199,183,236,192,138,231,201,178,248,231,202,231,203,231,204,231,205,231,206,231,207,231,208,211,167,203,245,231,209,231,210,231,211,231,212,201,201,231,213,231,214,231,215,231,216,231,217,189,201,231,218,243,190,192,139,184,215,192,140,200,177,192,141,192,142,192,143,192,144,192,145,192,146,192,147,243,191,192,148,243,192,243,193,192,149,192,150,192,151,192,152,192,153,192,154,192,155,192,156,192,157,192,158,185,222,205,248,192,159,192,160,216,232,186,177,193,64,194,222,238,183,193,65,183,163,193,66,193,67,193,68,193,69,238,185,193,70,238,184,176,213,193,71,193,72,193,73,193,74,193,75,238,187,213,214,215,239,193,76,193,77,193,78,214,195,193,79,193,80,238,189,202,240,193,81,238,188,193,82,193,83,193,84,193,85,238,190,193,86,193,87,193,88,193,89,238,192,193,90,193,91,238,191,193,92,193,93,193,94,193,95,193,96,193,97,193,98,193,99,209,242,193,100,199,188,193,101,195,192,193,102,193,103,193,104,193,105,193,106,184,225,193,107,193,108,193,109,193,110,193,111,193,231,193,112,193,113,244,198,208,223,244,199,193,114,207,219,193,115,193,116,200,186,193,117,193,118,244,200,193,119,193,120,193,121,193,122,193,123,193,124,193,125,244,201,244,202,193,126,244,203,193,128,193,129,193,130,193,131,193,132,217,250,184,254,193,133,193,134,229,241,211,240,193,135,244,224,193,136,206,204,193,137,193,138,193,139,179,225,193,140,193,141,193,142,193,143,241,180,193,144,210,238,193,145,244,225,193,146,193,147,193,148,193,149,193,150,207,232,244,226,193,151,193,152,199,204,193,153,193,154,193,155,193,156,193,157,193,158,181,212,180,228,244,228,193,159,193,160,194,64,244,227,244,229,194,65,194,66,244,230,194,67,194,68,194,69,194,70,244,231,194,71,186,178,176,191,194,72,244,232,194,73,194,74,194,75,194,76,194,77,194,78,194,79,183,173,210,237,194,80,194,81,194,82,210,171,192,207,194,83,191,188,235,163,213,223,234,200,194,84,194,85,194,86,194,87,241,243,182,248,203,163,194,88,194,89,196,205,194,90,241,231,194,91,241,232,184,251,241,233,186,196,212,197,176,210,194,92,194,93,241,234,194,94,194,95,194,96,241,235,194,97,241,236,194,98,194,99,241,237,241,238,241,239,241,241,241,240,197,213,194,100,194,101,194,102,194,103,194,104,194,105,241,242,194,106,182,250,194,107,241,244,210,174,222,199,203,202,194,108,194,109,179,220,194,110,181,162,194,111,185,162,194,112,194,113,196,244,241,245,194,114,194,115,241,246,194,116,194,117,194,118,193,196,193,251,214,176,241,247,194,119,194,120,194,121,194,122,241,248,194,123,193,170,194,124,194,125,194,126,198,184,194,128,190,219,194,129,194,130,194,131,194,132,194,133,194,134,194,135,194,136,194,137,194,138,194,139,194,140,194,141,194,142,241,249,180,207,194,143,194,144,194,145,194,146,194,147,194,148,241,250,194,149,194,150,194,151,194,152,194,153,194,154,194,155,194,156,194,157,194,158,194,159,194,160,195,64,237,178,237,177,195,65,195,66,203,224,210,222,195,67,203,193,213,216,195,68,200,226,195,69,192,223,188,161,195,70,195,71,195,72,195,73,195,74,195,75,235,193,195,76,195,77,208,164,195,78,214,226,195,79,182,199,184,216,235,192,184,206,195,80,235,191,179,166,185,201,214,171,195,81,183,244,183,202,195,82,195,83,195,84,188,231,183,190,235,198,195,85,235,199,176,185,191,207,195,86,235,197,211,253,195,87,235,200,195,88,195,89,235,201,195,90,195,91,183,206,195,92,235,194,235,196,201,246,214,215,213,205,208,178,235,207,206,184,235,208,195,93,181,168,195,94,195,95,195,96,195,97,195,98,177,179,235,210,204,165,195,99,195,100,195,101,195,102,195,103,195,104,195,105,197,214,235,211,195,106,235,209,197,223,235,206,202,164,235,213,176,251,195,107,195,108,186,250,195,109,195,110,216,183,241,227,195,111,235,202,235,203,235,204,235,205,235,214,230,192,235,217,195,112,191,232,210,200,235,215,235,220,184,236,235,216,195,113,189,186,195,114,208,216,195,115,176,183,195,116,235,221,196,220,195,117,195,118,195,119,195,120,214,172,195,121,195,122,195,123,180,224,195,124,195,125,194,246,188,185,195,126,195,128,235,218,235,219,212,224,198,234,196,212,235,223,197,167,217,245,195,129,178,177,195,130,235,228,195,131,189,197,195,132,195,133,195,134,235,226,195,135,195,136,195,137,195,138,195,139,195,140,195,141,195,142,195,143,195,144,195,145,195,146,195,147,235,227,195,148,195,149,184,172,195,150,205,209,235,229,195,151,195,152,195,153,235,225,195,154,193,179,195,155,195,156,195,157,195,158,195,159,198,162,195,160,196,64,196,65,196,66,196,67,196,68,196,69,204,243,196,70,235,230,196,71,192,176,210,184,235,231,196,72,196,73,196,74,184,175,184,173,196,75,235,232,199,187,205,243,196,76,196,77,196,78,235,234,235,235,196,79,196,80,196,81,196,82,196,83,235,237,196,84,196,85,196,86,196,87,208,200,196,88,235,242,196,89,235,238,196,90,196,91,196,92,235,241,200,249,196,93,209,252,235,236,196,94,196,95,235,233,196,96,196,97,196,98,196,99,184,185,207,217,196,229,235,239,235,240,204,218,205,200,176,242,196,100,235,246,196,101,196,102,196,103,196,104,196,105,235,245,196,106,178,178,196,107,196,108,196,109,196,110,184,224,196,111,235,247,196,112,196,113,196,114,196,115,196,116,196,117,177,236,196,118,196,119,204,197,196,164,207,165,196,120,196,121,196,122,196,123,196,124,235,249,196,125,196,126,236,162,196,128,197,242,196,129,235,250,196,130,196,131,196,132,196,133,196,134,196,135,196,136,196,137,201,197,196,138,196,139,196,140,196,141,196,142,196,143,226,223,235,254,196,144,196,145,196,146,196,147,205,206,236,161,177,219,211,183,196,148,196,149,210,220,196,150,196,151,196,152,235,253,196,153,235,251,196,154,196,155,196,156,196,157,196,158,196,159,196,160,197,64,197,65,197,66,197,67,197,68,197,69,197,70,197,71,197,72,197,73,197,74,197,75,197,76,197,77,197,78,179,188,197,79,197,80,197,81,234,176,197,82,197,83,215,212,197,84,244,171,179,244,197,85,197,86,197,87,197,88,197,89,214,193,214,194,197,90,197,91,197,92,197,93,197,94,197,95,213,233,190,202,197,96,244,167,197,97,210,168,244,168,244,169,197,98,244,170,190,203,211,223,197,99,197,100,197,101,197,102,197,103,201,224,201,225,197,104,197,105,243,194,197,106,202,230,197,107,204,242,197,108,197,109,197,110,197,111,197,112,197,113,226,182,203,180,197,114,206,232,214,219,197,115,244,173,244,174,244,175,197,116,197,117,197,118,197,119,244,178,197,120,186,189,244,179,176,227,244,176,197,121,244,177,189,162,178,213,197,122,244,182,244,183,182,230,178,176,207,207,244,180,180,172,197,123,244,181,197,124,197,125,244,184,197,126,197,128,197,129,197,130,197,131,244,185,197,132,197,133,205,167,197,134,244,186,197,135,244,187,197,136,197,137,197,138,244,188,197,139,197,140,197,141,197,142,197,143,197,144,197,145,197,146,203,210,197,147,244,189,197,148,197,149,197,150,197,151,244,190,197,152,197,153,197,154,197,155,197,156,197,157,197,158,197,159,244,191,197,160,198,64,198,65,198,66,198,67,244,222,193,188,188,232,198,68,201,171,209,222,229,245,198,69,198,70,198,71,198,72,220,179,210,213,198,73,198,74,220,180,176,172,220,181,198,75,198,76,189,218,198,77,220,185,198,78,198,79,198,80,216,194,198,81,220,183,211,243,198,82,201,214,220,186,220,182,198,83,220,187,195,162,198,84,198,85,198,86,198,87,220,188,220,197,220,189,198,88,198,89,206,223,214,165,198,90,220,207,198,91,220,205,198,92,198,93,220,210,189,230,194,171,198,94,220,184,220,203,220,206,220,190,183,210,176,197,220,199,208,190,220,193,187,168,198,95,183,188,220,204,198,96,198,97,220,198,220,191,199,219,198,98,198,99,198,100,209,191,220,192,198,101,198,102,220,202,198,103,198,104,220,208,198,105,198,106,206,173,220,194,198,107,220,195,220,200,220,201,178,212,220,209,203,213,198,108,212,183,220,219,220,223,204,166,220,230,198,109,195,231,220,220,198,110,198,111,191,193,220,217,198,112,176,250,185,182,220,229,220,211,198,113,220,196,220,214,200,244,191,224,198,114,198,115,198,116,198,117,201,187,198,118,198,119,198,120,177,189,198,121,211,162,198,122,198,123,220,218,198,124,198,125,220,213,198,126,198,187,198,128,220,222,198,129,198,130,198,131,198,132,198,133,215,194,195,175,183,182,199,209,195,169,220,226,220,216,220,235,220,212,198,134,198,135,220,221,198,136,190,165,220,215,198,137,220,224,198,138,198,139,220,227,220,228,198,140,220,248,198,141,198,142,220,225,221,162,220,231,198,143,198,144,198,145,198,146,198,147,198,148,198,149,198,150,198,151,198,152,188,235,180,196,198,153,198,154,195,163,178,231,220,250,198,155,220,242,198,156,220,239,198,157,220,252,220,238,210,240,178,232,198,158,200,215,200,227,220,251,198,159,220,237,198,160,199,64,199,65,220,247,199,66,199,67,220,245,199,68,199,69,190,163,220,244,199,70,178,221,199,71,199,72,199,73,199,74,199,75,220,243,188,246,220,232,187,196,199,76,192,243,199,77,199,78,199,79,199,80,199,81,188,212,220,233,220,234,199,82,220,241,220,246,220,249,181,180,199,83,200,217,187,231,220,254,220,253,211,171,221,161,221,163,221,165,210,241,221,164,221,166,221,167,210,169,199,84,199,85,199,86,199,87,199,88,199,89,199,90,186,201,221,169,199,91,199,92,221,182,221,177,221,180,199,93,199,94,199,95,199,96,199,97,199,98,199,99,221,176,198,206,199,100,199,101,192,242,199,102,199,103,199,104,199,105,201,175,199,106,199,107,199,108,220,236,221,174,199,109,199,110,199,111,199,112,221,183,199,113,199,114,220,240,221,175,199,115,221,184,199,116,221,172,199,117,199,118,199,119,199,120,199,121,199,122,199,123,221,185,221,179,221,173,196,170,199,124,199,125,199,126,199,128,221,168,192,179,193,171,221,170,221,171,199,129,221,178,187,241,221,181,211,168,221,186,199,130,221,187,195,167,199,131,199,132,221,210,221,188,199,133,199,134,199,135,221,209,199,136,185,189,199,137,199,138,190,213,199,139,190,250,199,140,199,141,186,202,199,142,199,143,199,144,199,145,221,202,199,146,221,197,199,147,221,191,199,148,199,149,199,150,178,203,221,195,199,151,221,203,178,164,221,213,199,152,199,153,199,154,221,190,199,155,199,156,199,157,198,208,221,208,199,158,199,159,199,160,200,64,200,65,221,212,193,226,183,198,200,66,200,67,200,68,200,69,200,70,221,206,221,207,200,71,200,72,200,73,221,196,200,74,200,75,200,76,221,189,200,77,221,205,204,209,200,78,221,201,200,79,200,80,200,81,200,82,221,194,195,200,198,188,206,174,221,204,200,83,221,200,200,84,200,85,200,86,200,87,200,88,200,89,221,193,200,90,200,91,200,92,221,198,194,220,200,93,200,94,200,95,200,96,200,97,200,98,211,169,211,170,221,211,207,244,200,248,200,99,200,100,200,101,200,102,200,103,200,104,200,105,200,106,221,230,200,107,200,108,200,109,200,110,200,111,200,112,221,199,200,113,200,114,200,115,221,224,194,228,200,116,200,117,200,118,200,119,200,120,200,121,200,122,200,123,221,225,200,124,200,125,200,126,200,128,200,129,200,130,200,131,200,132,200,133,200,134,221,215,200,135,200,136,200,137,200,138,200,139,214,248,200,140,221,217,221,216,184,240,221,214,200,141,200,142,200,143,200,144,198,207,200,145,182,173,200,146,200,147,200,148,200,149,200,150,221,226,200,151,186,249,212,225,221,231,200,152,200,153,200,154,180,208,200,155,221,218,200,156,191,251,221,227,200,157,221,223,200,158,221,221,200,159,200,160,201,64,201,65,201,66,201,67,201,68,181,217,201,69,201,70,201,71,201,72,221,219,221,220,221,222,201,73,189,175,221,228,201,74,221,229,201,75,201,76,201,77,201,78,201,79,201,80,201,81,201,82,221,245,201,83,195,201,201,84,201,85,203,226,201,86,201,87,201,88,201,89,221,242,201,90,201,91,201,92,201,93,201,94,201,95,201,96,201,97,201,98,201,99,201,100,201,101,201,102,216,225,201,103,201,104,198,209,201,105,221,244,201,106,201,107,201,108,213,244,221,243,221,240,201,109,201,110,221,236,201,111,221,239,201,112,221,232,201,113,201,114,208,238,201,115,201,116,201,117,201,118,200,216,221,238,201,119,201,120,221,233,201,121,201,122,221,234,203,242,201,123,221,237,201,124,201,125,177,205,201,126,201,128,201,129,201,130,201,131,201,132,192,182,201,133,188,187,221,241,201,134,201,135,221,247,201,136,221,246,221,235,201,137,201,138,201,139,201,140,201,141,197,238,201,142,201,143,201,144,221,251,201,145,201,146,201,147,201,148,201,149,201,150,201,151,201,152,201,153,201,154,201,155,222,164,201,156,201,157,222,163,201,158,201,159,201,160,202,64,202,65,202,66,202,67,202,68,202,69,202,70,202,71,202,72,221,248,202,73,202,74,202,75,202,76,195,239,202,77,194,251,202,78,202,79,202,80,213,225,202,81,202,82,206,181,202,83,202,84,202,85,202,86,221,253,202,87,178,204,202,88,202,89,202,90,202,91,202,92,202,93,202,94,202,95,202,96,196,232,202,223,202,97,202,98,202,99,202,100,202,101,202,102,202,103,202,104,202,105,202,106,199,190,221,250,221,252,221,254,222,162,176,170,177,206,202,107,202,108,202,109,202,110,202,111,222,172,202,112,202,113,202,114,202,115,222,166,189,182,200,239,202,116,202,117,202,118,202,119,202,120,202,121,202,122,202,123,202,124,202,125,202,126,222,161,202,128,202,129,222,165,202,130,202,131,202,132,202,133,222,169,202,134,202,135,202,136,202,137,202,138,222,168,202,139,202,140,202,141,222,167,202,142,202,143,202,144,202,145,202,146,202,147,202,148,202,149,202,150,222,173,202,151,212,204,202,152,202,153,202,154,202,155,222,179,222,170,222,174,202,156,202,157,192,217,202,158,202,159,202,160,203,64,203,65,177,161,222,182,203,66,222,177,203,67,203,68,203,69,203,70,203,71,203,72,203,73,222,178,203,74,203,75,203,76,203,77,203,78,203,79,203,80,203,81,203,82,203,83,203,84,209,166,222,181,203,85,203,86,203,87,203,88,203,89,203,90,203,91,222,175,203,92,203,93,203,94,222,176,203,95,208,189,203,96,203,97,203,98,222,180,202,237,222,185,203,99,203,100,203,101,203,102,203,103,203,104,222,184,203,105,222,183,203,106,203,107,203,108,203,109,203,110,203,111,203,112,222,187,203,113,203,114,203,115,203,116,203,117,203,118,203,119,189,229,203,120,203,121,203,122,203,123,203,124,178,216,195,234,203,125,203,126,222,186,203,128,197,186,203,129,203,130,203,131,203,132,203,133,203,134,222,188,203,135,203,136,203,137,203,138,203,139,203,140,203,141,204,217,203,142,203,143,203,144,203,145,183,170,203,146,203,147,203,148,203,149,203,150,203,151,203,152,203,153,203,154,203,155,203,156,203,157,203,158,203,159,203,160,204,64,204,65,212,229,204,66,204,67,204,68,222,189,204,69,204,70,204,71,204,72,204,73,222,191,204,74,204,75,204,76,204,77,204,78,204,79,204,80,204,81,204,82,204,83,204,84,196,162,204,85,204,86,204,87,204,88,222,193,204,89,204,90,204,91,204,92,204,93,204,94,204,95,204,96,204,97,204,98,204,99,204,100,204,101,204,102,204,103,204,104,222,190,204,105,222,192,204,106,204,107,204,108,204,109,204,110,204,111,204,112,204,113,204,114,204,115,204,116,204,117,204,118,204,119,213,186,204,120,204,121,204,122,222,194,204,123,204,124,204,125,204,126,204,128,204,129,204,130,204,131,204,132,204,133,204,134,204,135,204,136,204,137,204,138,204,139,242,174,187,162,194,178,197,176,194,199,204,140,204,141,242,175,204,142,204,143,204,144,204,145,204,146,208,233,204,147,204,148,204,149,211,221,204,150,204,151,204,152,235,189,204,153,204,154,204,155,204,156,204,157,204,158,204,159,204,160,179,230,242,176,205,64,242,177,205,65,205,66,202,173,205,67,205,68,205,69,205,70,205,71,205,72,205,73,186,231,242,179,242,181,242,180,203,228,207,186,242,178,202,180,210,207,194,236,205,74,205,75,205,76,205,77,205,78,205,79,205,80,206,195,242,184,176,246,242,183,205,81,205,82,205,83,205,84,205,85,242,190,205,86,178,207,205,87,205,88,205,89,205,90,205,91,205,92,209,193,242,186,205,93,205,94,205,95,205,96,205,97,242,188,212,233,205,98,205,99,242,187,242,182,242,191,242,189,205,100,242,185,205,101,205,102,242,199,242,196,242,198,205,103,205,104,242,202,242,194,242,192,205,105,205,106,205,107,242,197,205,108,205,109,205,110,205,111,205,112,214,251,205,113,205,114,205,115,242,193,205,116,199,249,201,223,205,117,242,200,185,198,181,176,205,118,205,119,242,195,242,201,242,208,242,214,205,120,205,121,187,215,205,122,205,123,205,124,242,213,205,220,205,125,214,235,205,126,205,128,242,210,242,212,205,129,205,130,205,131,205,132,184,242,205,133,205,134,205,135,205,136,242,203,205,137,205,138,205,139,242,206,194,249,205,140,213,221,242,204,242,205,242,207,242,211,205,141,205,142,205,143,242,217,211,188,205,144,205,145,205,146,205,147,182,234,205,148,202,241,205,149,183,228,242,215,205,150,205,151,205,152,242,216,242,218,242,221,242,219,205,153,205,154,242,220,205,155,205,156,205,157,205,158,209,209,242,209,205,159,205,201,205,160,206,207,214,169,206,64,242,227,206,65,195,219,206,66,242,224,206,67,206,68,192,175,242,236,242,222,206,69,242,225,206,70,206,71,206,72,242,232,206,73,206,74,206,75,206,76,242,226,206,77,206,78,242,231,206,79,206,80,242,230,206,81,206,82,242,233,206,83,206,84,206,85,242,223,206,86,206,87,242,228,242,234,206,88,206,89,206,90,206,91,206,92,206,93,206,94,211,172,242,229,178,245,206,95,206,96,242,242,206,97,208,171,206,98,206,99,206,100,206,101,242,245,206,102,206,103,206,104,187,200,206,105,242,249,206,106,206,107,206,108,206,109,206,110,206,111,242,240,206,112,206,113,242,246,242,248,242,250,206,114,206,115,206,116,206,117,206,118,206,119,206,120,206,121,242,243,206,122,242,241,206,123,206,124,206,125,186,251,206,126,181,251,206,128,206,129,206,130,206,131,242,239,242,247,242,237,242,238,206,132,206,133,206,134,242,235,243,166,206,135,243,163,206,136,206,137,243,162,206,138,206,139,242,244,206,140,200,218,206,141,206,142,206,143,206,144,206,145,242,251,206,146,206,147,206,148,243,165,206,149,206,150,206,151,206,152,206,153,206,154,206,155,195,248,206,156,206,157,206,158,206,159,206,160,207,64,207,65,207,66,242,253,207,67,207,68,243,167,243,169,243,164,207,69,242,252,207,70,207,71,207,72,243,171,207,73,243,170,207,74,207,75,207,76,207,77,194,221,207,78,207,79,243,174,207,80,207,81,243,176,207,82,207,83,207,84,207,85,207,86,243,161,207,87,207,88,207,89,243,177,243,172,207,90,207,91,207,92,207,93,207,94,243,175,242,254,243,173,207,95,207,96,207,97,207,98,207,99,207,100,207,101,243,178,207,102,207,103,207,104,207,105,243,180,207,106,207,107,207,108,207,109,243,168,207,110,207,111,207,112,207,113,243,179,207,114,207,115,207,116,243,181,207,117,207,118,207,119,207,120,207,121,207,122,207,123,207,124,207,125,207,126,208,183,207,128,207,129,207,130,207,131,243,184,207,132,207,133,207,134,207,135,217,249,207,136,207,137,207,138,207,139,207,140,207,141,243,185,207,142,207,143,207,144,207,145,207,146,207,147,207,148,207,149,243,183,207,150,200,228,243,182,207,151,207,152,207,153,207,154,243,186,207,155,207,156,207,157,207,158,207,159,243,187,180,192,207,160,208,64,208,65,208,66,208,67,208,68,208,69,208,70,208,71,208,72,208,73,208,74,208,75,208,76,208,77,238,195,208,78,208,79,208,80,208,81,208,82,208,83,243,188,208,84,208,85,243,189,208,86,208,87,208,88,209,170,208,89,208,90,208,91,244,172,208,198,208,92,208,93,208,94,208,95,208,96,208,97,208,208,209,220,208,98,208,99,208,100,208,101,208,102,208,103,207,206,208,104,208,105,189,214,208,106,209,195,208,107,208,108,208,109,208,110,208,111,208,112,208,113,186,226,225,233,210,194,241,194,178,185,208,114,208,115,177,237,241,195,208,116,201,192,179,196,208,117,217,242,208,118,203,165,208,119,241,196,208,120,208,121,208,122,208,123,214,212,208,124,208,125,208,126,208,128,208,129,241,197,244,192,241,198,208,130,212,172,241,199,208,131,176,192,244,193,208,132,208,133,244,194,208,134,208,135,180,252,208,136,197,219,208,137,208,138,208,139,208,140,204,187,208,141,208,142,208,143,208,228,208,144,208,145,208,146,208,147,208,148,205,224,208,149,208,150,208,151,208,152,208,153,241,200,208,154,217,243,208,155,208,156,208,157,208,158,208,159,208,160,177,187,209,64,207,174,209,65,209,66,209,67,184,164,209,68,209,69,209,70,209,71,209,72,241,202,209,73,209,74,209,75,209,76,241,203,209,77,209,78,209,79,209,80,178,195,193,209,209,81,209,82,215,176,241,201,209,83,209,84,241,204,209,85,209,86,209,87,209,88,241,206,209,89,209,90,209,91,217,246,209,92,210,225,212,163,209,93,209,94,244,195,200,185,209,95,209,96,209,97,209,98,209,99,244,196,209,100,209,101,241,205,241,207,191,227,241,208,209,102,209,103,241,212,209,104,209,105,209,106,209,107,209,108,209,109,209,110,241,214,241,209,209,111,201,209,197,225,209,112,209,113,209,114,194,227,185,252,209,115,209,116,241,211,209,117,241,213,209,118,209,119,209,120,185,211,209,121,209,122,209,123,209,124,209,125,209,126,209,128,241,219,209,129,209,130,209,131,209,132,209,133,186,214,209,134,176,253,241,217,209,135,209,136,209,137,209,138,209,139,241,216,241,210,241,218,209,140,209,141,209,142,209,143,209,144,241,215,209,145,209,146,209,147,200,236,209,148,209,149,209,150,209,151,205,202,241,221,209,152,209,153,209,154,209,155,229,189,209,156,209,157,209,158,241,220,209,159,241,222,209,160,210,64,210,65,210,66,210,67,210,68,210,69,210,70,210,71,210,72,241,223,210,73,210,74,207,229,210,75,210,76,210,77,210,78,210,79,210,80,210,81,210,82,210,83,210,84,210,85,210,86,210,87,210,88,210,89,210,90,210,91,210,92,210,93,210,94,210,95,210,96,210,97,210,98,210,99,244,197,189,243,210,100,210,101,210,102,210,103,210,104,210,105,241,224,210,106,210,107,210,108,210,109,210,110,210,111,210,112,210,113,210,114,210,115,210,116,210,117,210,118,210,119,210,120,210,121,210,122,210,123,210,124,210,125,241,225,210,126,210,128,210,129,206,247,210,130,210,170,210,131,241,251,210,132,210,133,184,178,210,134,210,135,210,136,210,137,210,138,210,139,210,140,210,141,210,142,210,143,210,144,210,145,210,146,210,147,210,148,210,149,210,150,210,151,210,152,210,153,210,154,210,155,210,156,210,157,210,158,210,159,210,160,211,64,211,65,211,66,211,67,211,68,211,69,211,70,211,71,211,72,211,73,211,74,211,75,211,76,211,77,211,78,211,79,211,80,211,81,211,82,211,83,211,84,211,85,211,86,211,87,211,88,211,89,211,90,211,91,211,92,211,93,211,94,188,251,185,219,211,95,185,230,195,217,202,211,234,232,192,192,190,245,234,233,234,234,234,235,211,96,234,236,234,237,234,238,234,239,189,199,211,97,211,98,211,99,245,251,211,100,211,101,211,102,245,253,211,103,245,254,211,104,245,252,211,105,211,106,211,107,211,108,189,226,211,109,246,161,180,165,211,110,211,111,211,112,211,113,246,162,211,114,211,115,211,116,246,163,211,117,211,118,211,119,236,178,211,120,211,121,211,122,211,123,211,124,211,125,211,126,211,128,211,129,211,130,211,131,211,132,209,212,211,133,211,134,211,135,211,136,211,137,211,138,217,234,211,139,211,140,211,141,211,142,211,143,211,144,211,145,211,146,211,147,211,148,211,149,211,150,211,151,211,152,211,153,211,154,211,155,211,156,211,157,211,158,211,159,211,160,212,64,212,65,212,66,212,67,212,68,212,69,212,70,212,71,212,72,212,73,212,74,212,75,212,76,212,77,212,78,212,79,212,80,212,81,212,82,212,83,212,84,212,85,212,86,212,87,212,88,212,89,212,90,212,91,212,92,212,93,212,94,212,95,246,164,212,96,212,97,212,98,212,99,212,100,212,101,212,102,212,103,212,104,238,186,212,105,212,106,212,107,212,108,212,109,212,110,212,111,212,112,212,113,212,114,212,115,212,116,212,117,212,118,212,119,212,120,212,121,212,122,212,123,212,124,212,125,212,126,212,128,212,129,212,130,212,131,212,132,212,133,212,134,212,135,212,136,212,137,212,138,212,139,212,140,212,141,212,142,212,143,212,144,212,145,212,146,212,147,212,148,212,149,212,150,212,151,212,152,212,153,213,178,212,154,212,155,212,156,212,157,212,158,212,159,212,160,213,64,213,65,213,66,213,67,213,68,213,69,213,70,213,71,211,254,204,220,213,72,213,73,213,74,213,75,213,76,213,77,213,78,213,79,202,196,213,80,213,81,213,82,213,83,213,84,213,85,213,86,213,87,213,88,213,89,213,90,213,91,213,92,213,93,213,94,213,95,213,96,213,97,213,98,213,99,213,100,213,101,213,102,213,103,213,104,213,105,213,106,213,107,213,108,213,109,213,110,213,111,213,112,213,113,213,114,213,115,213,116,213,117,213,118,213,119,213,120,213,121,213,122,213,123,213,124,213,125,213,126,213,128,213,129,213,130,213,131,213,132,213,133,213,134,213,135,213,136,213,137,213,138,213,139,213,140,213,141,213,142,213,143,213,144,213,145,213,146,213,147,213,148,213,149,213,150,213,151,213,152,213,153,213,154,213,155,213,156,213,157,213,158,213,159,213,160,214,64,214,65,214,66,214,67,214,68,214,69,214,70,214,71,214,72,214,73,214,74,214,75,214,76,214,77,214,78,214,79,214,80,214,81,214,82,214,83,214,84,214,85,214,86,214,87,214,88,214,89,214,90,214,91,214,92,214,93,214,94,214,95,214,96,214,97,214,98,229,192,214,99,214,100,214,101,214,102,214,103,214,104,214,105,214,106,214,107,214,108,214,109,214,110,214,111,214,112,214,113,214,114,214,115,214,116,214,117,214,118,214,119,214,120,214,121,214,122,214,123,214,124,214,125,214,126,214,128,214,129,246,165,214,130,214,131,214,132,214,133,214,134,214,135,214,136,214,137,214,138,214,139,214,140,214,141,214,142,214,143,214,144,214,145,214,146,214,147,214,148,214,149,214,150,214,151,214,152,214,153,214,154,214,155,214,156,214,157,214,158,214,159,214,160,215,64,215,65,215,66,215,67,215,68,215,69,215,70,215,71,215,72,215,73,215,74,215,75,215,76,215,77,215,78,215,79,215,80,215,81,215,82,215,83,215,84,215,85,215,86,215,87,215,88,215,89,215,90,215,91,215,92,215,93,215,94,215,95,190,175,215,96,215,97,215,98,215,99,215,100,198,169,215,101,215,102,215,103,215,104,215,105,215,106,215,107,215,108,215,109,215,110,215,111,215,112,215,113,215,114,215,115,215,116,215,117,215,118,215,119,215,120,215,121,215,122,215,123,215,124,215,125,215,126,215,128,215,129,215,130,215,131,215,132,215,133,215,134,215,135,215,136,215,137,215,138,215,139,215,140,215,141,215,142,215,143,215,144,215,145,215,146,215,147,215,148,215,149,215,150,215,151,215,152,218,165,188,198,182,169,184,188,200,207,188,165,218,166,218,167,204,214,200,195,218,168,198,253,215,153,209,181,210,233,209,182,188,199,215,154,189,178,187,228,218,169,218,170,209,200,218,171,208,237,182,239,194,219,215,155,203,207,183,237,201,232,183,195,190,247,214,164,218,172,218,173,198,192,215,231,202,182,215,156,213,169,203,223,213,239,218,174,214,223,180,202,218,176,218,175,215,157,210,235,218,177,218,178,218,179,202,212,218,180,202,171,218,181,218,182,179,207,214,239,218,183,187,176,181,174,218,184,218,185,185,238,209,175,210,232,218,186,184,195,207,234,178,239,218,187,218,188,215,158,189,235,206,220,211,239,218,189,206,243,218,190,211,213,187,229,218,191,203,181,203,208,218,192,199,235,214,238,218,193,197,181,182,193,218,194,183,204,191,206,218,195,218,196,203,173,218,197,181,247,218,198,193,194,215,187,218,199,204,184,215,159,210,234,196,177,218,200,181,253,187,209,218,201,208,179,218,202,218,203,206,189,218,204,218,205,218,206,178,247,218,209,218,207,209,232,218,208,195,213,218,210,215,160,218,211,218,212,218,213,208,187,210,165,176,249,218,214,199,171,218,215,189,247,195,161,218,216,218,217,195,253,204,183,218,218,218,219,192,190,198,215,218,220,218,221,199,180,218,222,218,223,185,200,216,64,216,65,216,66,216,67,216,68,216,69,216,70,216,71,216,72,187,237,216,73,216,74,216,75,216,76,182,185,244,248,216,77,244,249,216,78,216,79,205,227,216,80,216,81,216,82,216,83,216,84,216,85,216,86,216,87,245,185,216,88,216,89,216,90,216,91,235,224,216,92,216,93,216,94,216,95,216,96,216,97,207,243,187,191,216,98,216,99,216,100,216,101,216,102,216,103,216,104,186,192,212,165,216,105,216,106,216,107,216,108,216,109,216,110,216,111,225,217,216,112,216,113,216,114,216,115,245,244,177,170,178,242,216,116,216,117,216,118,216,119,216,120,216,121,216,122,245,245,216,123,216,124,245,247,216,125,216,126,216,128,186,209,245,246,216,129,195,178,216,130,216,131,216,132,216,133,216,134,216,135,216,136,245,249,216,137,216,138,216,139,245,248,216,140,216,141,216,142,216,143,216,144,216,145,216,146,216,147,216,148,216,149,216,150,216,151,216,152,216,153,216,154,216,155,216,156,216,157,216,158,216,159,216,160,217,64,217,65,217,66,217,67,217,68,217,69,217,70,217,71,217,72,217,73,217,74,217,75,217,76,217,77,217,78,217,79,217,80,217,81,217,82,217,83,217,84,217,85,217,86,217,87,217,88,217,89,217,90,217,91,217,92,217,93,217,94,217,95,217,96,217,97,217,98,217,99,217,100,217,101,217,102,217,103,217,104,217,105,217,106,217,107,217,108,217,109,217,110,217,111,217,112,217,113,217,114,217,115,217,116,217,117,217,118,217,119,217,120,217,121,217,122,217,123,217,124,217,125,217,126,217,128,217,129,217,130,217,131,217,132,217,133,217,134,217,135,217,136,217,137,217,138,217,139,217,140,217,141,217,142,217,143,217,144,217,145,217,146,217,147,217,148,217,149,217,150,217,151,217,152,217,153,217,154,217,155,217,156,217,157,217,158,217,159,217,160,218,64,218,65,218,66,218,67,218,68,218,69,218,70,218,71,218,72,218,73,218,74,218,75,218,76,218,77,218,78,177,180,213,234,184,186,218,79,185,177,178,198,212,240,207,205,176,220,213,203,187,245,214,202,183,183,204,176,198,182,177,225,185,186,214,252,185,225,183,161,188,250,234,218,234,219,204,249,185,243,234,220,180,251,195,179,183,209,186,216,234,221,212,244,234,222,188,214,187,223,234,223,193,222,194,184,212,223,215,202,234,224,234,225,234,228,234,226,234,227,201,222,184,179,182,196,234,229,202,234,201,205,180,205,218,80,218,81,226,217,197,226,234,230,192,181,218,82,215,184,234,231,215,172,200,252,216,211,216,205,212,222,218,83,212,249,201,196,211,174,184,211,179,224,218,84,201,226,244,246,218,85,218,86,218,87,186,213,218,88,244,247,218,89,218,90,215,223,218,91,218,92,244,241,184,176,213,212,184,207,198,240,218,93,218,94,218,95,218,96,218,97,218,98,218,99,218,100,218,101,179,195,218,102,218,103,244,242,179,172,218,104,218,105,218,106,218,107,212,189,199,247,218,108,218,109,218,110,218,111,218,112,244,244,218,113,218,114,244,243,218,115,218,116,218,117,218,118,218,119,218,120,218,121,218,122,218,123,218,124,204,203,218,125,218,126,218,128,200,164,218,129,218,130,218,131,218,132,218,133,218,134,218,135,218,136,218,137,218,138,218,139,218,140,218,141,244,245,218,142,215,227,197,191,245,192,218,143,218,144,245,187,218,145,245,195,218,146,245,194,218,147,214,186,245,193,218,148,218,149,218,150,212,190,245,196,218,151,245,204,218,152,218,153,218,154,218,155,176,207,181,248,218,156,245,201,245,202,218,157,197,220,218,158,218,159,218,160,219,64,245,197,245,198,219,65,219,66,245,199,245,203,219,67,190,224,245,200,184,250,219,68,219,69,219,70,245,208,245,211,219,71,219,72,219,73,191,231,219,74,185,242,245,188,245,205,219,75,219,76,194,183,219,77,219,78,219,79,204,248,219,80,188,249,219,81,245,206,245,207,245,209,182,229,245,210,219,82,245,213,219,83,219,84,219,85,219,86,219,87,219,88,219,89,245,189,219,90,219,91,219,92,245,212,211,187,219,93,179,236,219,94,219,95,204,164,219,96,219,97,219,98,219,99,245,214,219,100,219,101,219,102,219,103,219,104,219,105,219,106,219,107,245,215,190,225,245,216,219,108,219,109,204,223,245,219,219,110,219,111,219,112,219,113,219,114,178,200,215,217,219,115,245,217,219,116,245,218,245,220,219,117,245,226,219,118,219,119,219,120,245,224,219,121,219,122,219,123,245,223,245,221,219,124,219,125,245,225,219,126,219,128,245,222,245,228,245,229,219,129,204,227,219,130,219,131,229,191,181,184,245,227,245,232,204,163,219,132,219,133,219,134,219,135,219,136,245,230,245,231,219,137,219,138,219,139,219,140,219,141,219,142,245,190,219,143,219,144,219,145,219,146,219,147,219,148,219,149,219,150,219,151,219,152,219,153,219,154,177,196,219,155,219,156,245,191,219,157,219,158,181,197,178,228,219,159,245,236,245,233,219,160,182,215,220,64,245,237,220,65,245,234,220,66,220,67,220,68,220,69,220,70,245,235,220,71,220,72,180,218,220,73,212,234,220,74,220,75,220,76,245,238,220,77,179,249,220,78,220,79,220,80,220,81,220,82,220,83,220,84,245,239,245,241,220,85,220,86,220,87,245,240,220,88,220,89,220,90,220,91,220,92,220,93,220,94,245,242,220,95,245,243,220,96,220,97,220,98,220,99,220,100,220,101,220,102,220,103,220,104,220,105,220,106,220,107,201,237,185,170,220,108,220,109,199,251,220,110,220,111,182,227,220,112,220,113,220,114,220,115,220,116,220,117,220,118,204,201,220,119,220,120,220,121,220,122,220,123,220,124,220,125,220,126,220,128,220,129,220,130,220,131,220,132,220,133,220,134,220,135,220,136,220,137,220,138,234,166,220,139,220,140,220,141,220,142,220,143,220,144,220,145,220,146,220,147,220,148,220,149,220,150,220,151,220,152,220,153,220,154,220,155,220,156,220,157,220,158,220,159,220,160,221,64,221,65,221,66,221,67,221,68,221,69,221,70,221,71,221,72,221,73,221,74,221,75,221,76,221,77,221,78,221,79,221,80,221,81,221,82,221,83,221,84,221,85,221,86,221,87,221,88,221,89,221,90,221,91,221,92,221,93,221,94,221,95,221,96,221,97,221,98,221,99,221,100,221,101,221,102,221,103,221,104,221,105,221,106,221,107,221,108,221,109,221,110,221,111,221,112,221,113,221,114,221,115,221,116,221,117,221,118,221,119,221,120,221,121,221,122,221,123,221,124,221,125,221,126,221,128,221,129,221,130,221,131,221,132,221,133,221,134,221,135,221,136,221,137,221,138,221,139,221,140,221,141,221,142,221,143,221,144,221,145,221,146,221,147,221,148,221,149,221,150,221,151,221,152,221,153,221,154,221,155,221,156,221,157,221,158,221,159,221,160,222,64,222,65,222,66,222,67,222,68,222,69,222,70,222,71,222,72,222,73,222,74,222,75,222,76,222,77,222,78,222,79,222,80,222,81,222,82,222,83,222,84,222,85,222,86,222,87,222,88,222,89,222,90,222,91,222,92,222,93,222,94,222,95,222,96,179,181,212,254,185,236,208,249,222,97,233,237,215,170,233,238,194,214,200,237,186,228,233,239,233,240,233,241,214,225,233,242,233,243,233,245,233,244,233,246,233,247,199,225,233,248,212,216,233,249,189,206,222,98,233,250,233,251,189,207,233,252,184,168,193,190,233,253,177,178,187,212,185,245,233,254,222,99,234,161,234,162,234,163,183,248,188,173,222,100,202,228,224,206,212,175,207,189,213,183,234,164,213,222,234,165,208,193,185,188,222,101,180,199,177,217,222,102,222,103,222,104,192,177,222,105,222,106,222,107,222,108,177,230,177,231,222,109,177,232,222,110,222,111,222,112,222,113,179,189,200,232,222,114,222,115,222,116,222,117,229,193,222,118,222,119,177,223,222,120,222,121,222,122,193,201,180,239,222,123,222,124,199,168,211,216,222,125,198,249,209,184,222,126,185,253,194,245,222,128,222,129,222,130,222,131,222,132,211,173,222,133,212,203,189,252,222,134,229,194,183,181,229,195,222,135,222,136,187,185,213,226,222,137,189,248,212,182,206,165,193,172,179,217,222,138,222,139,204,246,222,140,229,198,229,196,229,200,222,141,229,202,229,199,181,207,198,200,222,142,181,252,229,197,222,143,202,246,222,144,222,145,229,201,222,146,222,147,222,148,195,212,177,197,188,163,222,149,222,150,222,151,215,183,222,152,222,153,205,203,203,205,202,202,204,211,229,204,229,203,196,230,222,154,222,155,209,161,209,183,229,205,222,156,229,208,222,157,205,184,214,240,229,207,181,221,222,158,205,190,222,159,229,209,182,186,222,160,223,64,205,168,185,228,223,65,202,197,179,209,203,217,212,236,229,210,183,234,223,66,223,67,223,68,229,206,223,69,223,70,223,71,223,72,223,73,223,74,229,213,180,254,229,214,223,75,223,76,223,77,223,78,223,79,229,211,229,212,223,80,210,221,223,81,223,82,194,223,177,198,223,83,211,226,223,84,223,85,182,221,203,236,223,86,229,215,223,87,223,88,211,246,223,89,223,90,223,91,223,92,223,93,177,233,223,94,182,244,229,218,229,216,229,217,181,192,223,95,223,96,223,97,210,197,229,220,223,98,223,99,229,222,223,100,223,101,223,102,223,103,223,104,223,105,229,221,199,178,223,106,210,163,223,107,223,108,229,219,223,109,223,110,223,111,223,112,212,226,213,218,223,113,223,114,223,115,223,116,223,117,229,224,215,241,223,118,223,119,223,120,223,121,223,122,223,123,223,124,229,225,223,125,177,220,209,251,223,126,229,226,229,228,223,128,223,129,223,130,223,131,229,227,223,132,223,133,229,229,223,134,223,135,223,136,223,137,223,138,210,216,223,139,181,203,223,140,231,223,223,141,218,245,223,142,218,248,223,143,218,246,223,144,218,247,223,145,223,146,223,147,218,250,208,207,196,199,223,148,223,149,176,238,223,150,223,151,223,152,208,176,223,153,218,249,223,154,211,202,186,170,219,162,199,241,223,155,218,252,218,251,201,219,218,253,223,156,219,161,215,222,218,254,193,218,223,157,223,158,219,165,223,159,223,160,211,244,224,64,224,65,219,167,219,164,224,66,219,168,224,67,224,68,189,188,224,69,224,70,224,71,192,201,219,163,219,166,214,163,224,72,219,169,224,73,224,74,224,75,219,173,224,76,224,77,224,78,219,174,219,172,186,194,224,79,224,80,224,81,191,164,219,171,224,82,224,83,224,84,219,170,212,199,178,191,224,85,224,86,219,175,224,87,185,249,224,88,219,176,224,89,224,90,224,91,224,92,179,187,224,93,224,94,224,95,181,166,224,96,224,97,224,98,224,99,182,188,219,177,224,100,224,101,224,102,182,245,224,103,219,178,224,104,224,105,224,106,224,107,224,108,224,109,224,110,224,111,224,112,224,113,224,114,224,115,224,116,224,117,224,118,224,119,224,120,224,121,224,122,224,123,177,201,224,124,224,125,224,126,224,128,219,180,224,129,224,130,224,131,219,179,219,181,224,132,224,133,224,134,224,135,224,136,224,137,224,138,224,139,224,140,224,141,224,142,219,183,224,143,219,182,224,144,224,145,224,146,224,147,224,148,224,149,224,150,219,184,224,151,224,152,224,153,224,154,224,155,224,156,224,157,224,158,224,159,219,185,224,160,225,64,219,186,225,65,225,66,211,207,244,250,199,245,215,195,197,228,244,252,244,253,244,251,225,67,190,198,225,68,225,69,225,70,225,71,208,239,225,72,225,73,183,211,225,74,225,75,212,205,204,170,225,76,225,77,245,162,245,161,186,168,244,254,203,214,225,78,225,79,225,80,245,164,192,210,225,81,179,234,225,82,205,170,245,165,245,163,189,180,245,168,225,83,245,169,189,205,195,184,191,225,203,225,245,170,225,84,225,85,225,86,245,166,245,167,196,240,225,87,225,88,225,89,225,90,225,91,245,172,225,92,180,188,225,93,215,237,225,94,180,215,245,171,245,174,225,95,225,96,245,173,245,175,208,209,225,97,225,98,225,99,225,100,225,101,225,102,225,103,195,209,200,169,225,104,225,105,225,106,225,107,225,108,225,109,245,176,245,177,225,110,225,111,225,112,225,113,225,114,225,115,245,178,225,116,225,117,245,179,245,180,245,181,225,118,225,119,225,120,225,121,245,183,245,182,225,122,225,123,225,124,225,125,245,184,225,126,225,128,225,129,225,130,225,131,225,132,225,133,225,134,225,135,225,136,225,137,225,138,178,201,225,139,211,212,202,205,225,140,192,239,214,216,210,176,193,191,225,141,189,240,225,142,225,143,225,144,225,145,225,146,225,147,225,148,225,149,225,150,225,151,184,170,225,152,225,153,225,154,225,155,225,156,225,157,225,158,225,159,225,160,226,64,226,65,226,66,226,67,226,68,226,69,226,70,226,71,226,72,226,73,226,74,226,75,226,76,226,77,226,78,226,79,226,80,226,81,226,82,226,83,226,84,226,85,226,86,226,87,226,88,226,89,226,90,226,91,226,92,226,93,226,94,226,95,226,96,226,97,226,98,226,99,226,100,226,101,226,102,226,103,226,104,226,105,226,106,226,107,226,108,226,109,226,110,226,111,226,112,226,113,226,114,226,115,226,116,226,117,226,118,226,119,226,120,226,121,226,122,226,123,226,124,226,125,226,126,226,128,226,129,226,130,226,131,226,132,226,133,226,134,226,135,226,136,226,137,226,138,226,139,226,140,226,141,226,142,226,143,226,144,226,145,226,146,226,147,226,148,226,149,226,150,226,151,226,152,226,153,226,154,226,155,226,156,226,157,226,158,226,159,226,160,227,64,227,65,227,66,227,67,227,68,227,69,227,70,227,71,227,72,227,73,227,74,227,75,227,76,227,77,227,78,227,79,227,80,227,81,227,82,227,83,227,84,227,85,227,86,227,87,227,88,227,89,227,90,227,91,227,92,227,93,227,94,227,95,227,96,227,97,227,98,227,99,227,100,227,101,227,102,227,103,227,104,227,105,227,106,227,107,227,108,227,109,188,248,227,110,227,111,227,112,227,113,227,114,227,115,227,116,227,117,227,118,227,119,227,120,227,121,227,122,227,123,227,124,227,125,227,126,227,128,227,129,227,130,227,131,227,132,227,133,227,134,227,135,246,198,227,136,227,137,227,138,227,139,227,140,227,141,227,142,227,143,227,144,227,145,227,146,227,147,227,148,227,149,227,150,227,151,227,152,227,153,227,154,227,155,227,156,227,157,227,158,227,159,227,160,228,64,228,65,228,66,228,67,228,68,228,69,246,199,228,70,228,71,228,72,228,73,228,74,228,75,228,76,228,77,228,78,228,79,228,80,228,81,228,82,228,83,228,84,228,85,228,86,228,87,228,88,228,89,228,90,228,91,228,92,228,93,228,94,246,200,228,95,228,96,228,97,228,98,228,99,228,100,228,101,228,102,228,103,228,104,228,105,228,106,228,107,228,108,228,109,228,110,228,111,228,112,228,113,228,114,228,115,228,116,228,117,228,118,228,119,228,120,228,121,228,122,228,123,228,124,228,125,228,126,228,128,228,129,228,130,228,131,228,132,228,133,228,134,228,135,228,136,228,137,228,138,228,139,228,140,228,141,228,142,228,143,228,144,228,145,228,146,228,147,228,148,228,149,228,150,228,151,228,152,228,153,228,154,228,155,228,156,228,157,228,158,228,159,228,160,229,64,229,65,229,66,229,67,229,68,229,69,229,70,229,71,229,72,229,73,229,74,229,75,229,76,229,77,229,78,229,79,229,80,229,81,229,82,229,83,229,84,229,85,229,86,229,87,229,88,229,89,229,90,229,91,229,92,229,93,229,94,229,95,229,96,229,97,229,98,229,99,229,100,229,101,229,102,229,103,229,104,229,105,229,106,229,107,229,108,229,109,229,110,229,111,229,112,229,113,229,114,229,115,246,201,229,116,229,117,229,118,229,119,229,120,229,121,229,122,229,123,229,124,229,125,229,126,229,128,229,129,229,130,229,131,229,132,229,133,229,134,229,135,229,136,229,137,229,138,229,139,229,140,229,141,229,142,229,143,229,144,229,145,229,146,229,147,229,148,229,149,229,150,229,151,229,152,229,153,229,154,229,155,229,156,229,157,229,158,229,159,246,202,229,160,230,64,230,65,230,66,230,67,230,68,230,69,230,70,230,71,230,72,230,73,230,74,230,75,230,76,230,77,230,78,230,79,230,80,230,81,230,82,230,83,230,84,230,85,230,86,230,87,230,88,230,89,230,90,230,91,230,92,230,93,230,94,230,95,230,96,230,97,230,98,246,204,230,99,230,100,230,101,230,102,230,103,230,104,230,105,230,106,230,107,230,108,230,109,230,110,230,111,230,112,230,113,230,114,230,115,230,116,230,117,230,118,230,119,230,120,230,121,230,122,230,123,230,124,230,125,230,126,230,128,230,129,230,130,230,131,230,132,230,133,230,134,230,135,230,136,230,137,230,138,230,139,230,140,230,141,230,142,230,143,230,144,230,145,230,146,230,147,230,148,230,149,230,150,230,151,230,152,230,153,230,154,230,155,230,156,230,157,246,203,230,158,230,159,230,160,231,64,231,65,231,66,231,67,231,68,231,69,231,70,231,71,247,233,231,72,231,73,231,74,231,75,231,76,231,77,231,78,231,79,231,80,231,81,231,82,231,83,231,84,231,85,231,86,231,87,231,88,231,89,231,90,231,91,231,92,231,93,231,94,231,95,231,96,231,97,231,98,231,99,231,100,231,101,231,102,231,103,231,104,231,105,231,106,231,107,231,108,231,109,231,110,231,111,231,112,231,113,231,114,231,115,231,116,231,117,231,118,231,119,231,120,231,121,231,122,231,123,231,124,231,125,231,126,231,128,231,129,231,130,231,131,231,132,231,133,231,134,231,135,231,136,231,137,231,138,231,139,231,140,231,141,231,142,231,143,231,144,231,145,231,146,231,147,231,148,231,149,231,150,231,151,231,152,231,153,231,154,231,155,231,156,231,157,231,158,231,159,231,160,232,64,232,65,232,66,232,67,232,68,232,69,232,70,232,71,232,72,232,73,232,74,232,75,232,76,232,77,232,78,246,205,232,79,232,80,232,81,232,82,232,83,232,84,232,85,232,86,232,87,232,88,232,89,232,90,232,91,232,92,232,93,232,94,232,95,232,96,232,97,232,98,232,99,232,100,232,101,232,102,232,103,232,104,232,105,232,106,232,107,232,108,232,109,232,110,232,111,232,112,232,113,232,114,232,115,232,116,232,117,232,118,232,119,232,120,232,121,232,122,246,206,232,123,232,124,232,125,232,126,232,128,232,129,232,130,232,131,232,132,232,133,232,134,232,135,232,136,232,137,232,138,232,139,232,140,232,141,232,142,232,143,232,144,232,145,232,146,232,147,232,148,238,196,238,197,238,198,213,235,182,164,238,200,238,199,238,201,238,202,199,165,238,203,238,204,232,149,183,176,181,246,238,205,238,207,232,150,238,206,232,151,184,198,238,208,238,209,238,210,182,219,179,174,214,211,196,198,177,181,184,214,238,211,238,212,212,191,199,213,190,251,206,217,185,179,238,214,238,213,238,216,238,215,197,165,238,217,238,218,199,174,238,219,199,175,238,220,178,167,238,221,238,222,238,223,238,224,238,225,215,234,238,226,238,227,188,216,238,228,211,203,204,250,178,172,193,229,238,229,199,166,195,173,232,152,238,230,238,231,238,232,238,233,238,234,238,235,238,236,232,153,238,237,238,238,238,239,232,154,232,155,238,240,238,241,238,242,238,244,238,243,232,156,238,245,205,173,194,193,238,246,238,247,238,248,213,161,238,249,207,179,238,250,238,251,232,157,238,252,238,253,239,161,238,254,239,162,184,245,195,250,239,163,239,164,189,194,210,191,178,249,239,165,239,166,239,167,210,248,239,168,214,253,239,169,198,204,232,158,239,170,239,171,193,180,239,172,207,250,203,248,239,174,239,173,179,250,185,248,239,175,239,176,208,226,239,177,239,178,183,230,208,191,239,179,239,180,239,181,200,241,204,224,239,182,239,183,239,184,239,185,239,186,213,224,239,187,180,237,195,170,239,188,232,159,239,189,239,190,239,191,232,160,206,253,239,192,194,224,180,184,215,182,189,245,233,64,207,199,239,195,239,193,239,194,239,196,182,167,188,252,190,226,195,204,239,197,239,198,233,65,239,199,239,207,239,200,239,201,239,202,199,194,239,241,182,205,239,203,233,66,239,204,239,205,182,198,195,190,239,206,233,67,239,208,239,209,239,210,213,242,233,68,239,211,196,247,233,69,239,212,196,248,239,213,239,214,184,228,176,247,239,215,239,216,239,217,233,70,239,218,239,219,239,220,239,221,233,71,239,222,190,181,239,225,239,223,239,224,233,72,239,226,239,227,193,205,239,228,239,229,239,230,239,231,239,232,239,233,239,234,239,235,239,236,192,216,233,73,239,237,193,173,239,238,239,239,239,240,233,74,233,75,207,226,233,76,233,77,233,78,233,79,233,80,233,81,233,82,233,83,179,164,233,84,233,85,233,86,233,87,233,88,233,89,233,90,233,91,233,92,233,93,233,94,233,95,233,96,233,97,233,98,233,99,233,100,233,101,233,102,233,103,233,104,233,105,233,106,233,107,233,108,233,109,233,110,233,111,233,112,233,113,233,114,233,115,233,116,233,117,233,118,233,119,233,120,233,121,233,122,233,123,233,124,233,125,233,126,233,128,233,129,233,130,233,131,233,132,233,133,233,134,233,135,233,136,233,137,233,138,233,139,233,140,233,141,233,142,233,143,233,144,233,145,233,146,233,147,233,148,233,149,233,150,233,151,233,152,233,153,233,154,233,155,233,156,233,157,233,158,233,159,233,160,234,64,234,65,234,66,234,67,234,68,234,69,234,70,234,71,234,72,234,73,234,74,234,75,234,76,234,77,234,78,234,79,234,80,234,81,234,82,234,83,234,84,234,85,234,86,234,87,234,88,234,89,234,90,234,91,195,197,227,197,201,193,227,198,234,92,177,213,206,202,180,179,200,242,227,199,207,208,227,200,188,228,227,201,227,202,195,198,213,162,196,214,185,235,206,197,227,203,195,246,227,204,234,93,183,167,184,243,186,210,227,205,227,206,212,196,227,207,234,94,227,208,209,203,227,209,227,210,227,211,227,212,209,214,227,213,178,251,192,187,227,214,234,95,192,171,227,215,227,216,227,217,234,96,227,218,227,219,234,97,184,183,218,226,234,98,182,211,234,99,218,228,218,227,234,100,234,101,234,102,234,103,234,104,234,105,234,106,218,230,234,107,234,108,234,109,200,238,234,110,234,111,218,229,183,192,209,244,210,245,213,243,189,215,234,112,234,113,234,114,234,115,215,232,218,232,218,231,234,116,176,162,205,211,234,117,218,233,234,118,184,189,188,202,194,189,194,164,179,194,218,234,234,119,194,170,196,176,189,181,234,120,234,121,207,222,234,122,234,123,234,124,218,235,201,194,234,125,234,126,234,128,234,129,234,130,177,221,234,131,234,132,234,133,218,236,234,134,182,184,212,186,234,135,179,253,234,136,234,137,218,237,212,201,207,213,197,227,234,138,218,238,234,139,234,140,234,141,234,142,234,143,218,239,234,144,218,240,193,234,204,213,207,221,234,145,234,146,234,147,234,148,234,149,234,150,234,151,234,152,234,153,234,154,234,155,234,156,234,157,211,231,194,161,234,158,218,241,234,159,234,160,203,229,235,64,218,242,235,65,203,230,210,254,235,66,235,67,235,68,184,244,235,69,235,70,218,243,176,175,207,182,235,71,235,72,213,207,235,73,235,74,235,75,235,76,235,77,235,78,235,79,235,80,235,81,235,82,203,237,235,83,235,84,235,85,235,86,235,87,235,88,235,89,235,90,218,244,235,91,235,92,227,196,235,93,235,94,193,165,235,95,235,96,246,191,235,97,235,98,246,192,246,193,196,209,235,99,200,184,209,227,235,100,235,101,208,219,209,197,188,175,185,205,235,102,239,244,235,103,235,104,180,198,211,186,246,194,179,251,235,105,235,106,246,195,235,107,235,108,181,241,235,109,235,110,235,111,235,112,235,113,235,114,235,115,235,116,235,117,235,118,246,197,235,119,235,120,235,121,235,122,235,123,235,124,235,125,211,234,246,167,209,169,235,126,235,128,235,129,235,130,246,169,235,131,235,132,235,133,246,168,235,134,235,135,193,227,192,215,235,136,177,162,235,137,235,138,235,139,235,140,206,237,235,141,208,232,246,171,235,142,235,143,207,246,235,144,246,170,213,240,246,172,195,185,235,145,235,146,235,147,187,244,246,174,246,173,235,148,235,149,235,150,196,222,235,151,235,152,193,216,235,153,235,154,235,155,235,156,235,157,203,170,235,158,207,188,235,159,235,160,236,64,236,65,236,66,236,67,236,68,236,69,236,70,236,71,236,72,246,175,236,73,236,74,246,176,236,75,236,76,246,177,236,77,194,182,236,78,236,79,236,80,236,81,236,82,176,212,197,249,236,83,236,84,236,85,236,86,246,178,236,87,236,88,236,89,236,90,236,91,236,92,236,93,236,94,236,95,236,96,236,97,236,98,236,99,236,100,236,101,236,102,236,103,236,104,236,105,199,224,246,166,236,106,236,107,190,184,236,108,236,109,190,178,236,110,181,229,236,111,236,112,183,199,236,113,191,191,195,210,195,230,236,114,236,115,216,204,236,116,236,117,236,118,184,239,236,119,236,120,236,121,236,122,236,123,236,124,236,125,236,126,236,128,189,249,209,165,236,129,176,208,236,130,236,131,236,132,236,133,236,134,247,176,236,135,236,136,236,137,236,138,236,139,236,140,236,141,236,142,247,177,236,143,236,144,236,145,236,146,236,147,208,172,236,148,176,176,236,149,236,150,236,151,247,178,247,179,236,152,247,180,236,153,236,154,236,155,199,202,236,156,236,157,236,158,236,159,236,160,237,64,237,65,190,207,237,66,237,67,247,183,237,68,237,69,237,70,237,71,237,72,237,73,237,74,247,182,237,75,177,222,237,76,247,181,237,77,237,78,247,184,237,79,247,185,237,80,237,81,237,82,237,83,237,84,237,85,237,86,237,87,237,88,237,89,237,90,237,91,237,92,237,93,237,94,237,95,237,96,237,97,237,98,237,99,237,100,237,101,237,102,237,103,237,104,237,105,237,106,237,107,237,108,237,109,237,110,237,111,237,112,237,113,237,114,237,115,237,116,237,117,237,118,237,119,237,120,237,121,237,122,237,123,237,124,237,125,237,126,237,128,237,129,206,164,200,205,237,130,186,171,232,184,232,185,232,186,190,194,237,131,237,132,237,133,237,134,237,135,210,244,237,136,212,207,201,216,237,137,237,138,237,139,237,140,237,141,237,142,237,143,237,144,237,145,237,146,237,147,237,148,237,149,237,150,237,151,237,152,237,153,237,154,237,155,237,156,237,157,237,158,237,159,237,160,238,64,238,65,238,66,238,67,238,68,238,69,238,70,238,71,238,72,238,73,238,74,238,75,238,76,238,77,238,78,238,79,238,80,238,81,238,82,238,83,238,84,238,85,238,86,238,87,238,88,238,89,238,90,238,91,238,92,238,93,238,94,238,95,238,96,238,97,238,98,238,99,238,100,238,101,238,102,238,103,238,104,238,105,238,106,238,107,238,108,238,109,238,110,238,111,238,112,238,113,238,114,238,115,238,116,238,117,238,118,238,119,238,120,238,121,238,122,238,123,238,124,238,125,238,126,238,128,238,129,238,130,238,131,238,132,238,133,238,134,238,135,238,136,238,137,238,138,238,139,238,140,238,141,238,142,238,143,238,144,238,145,238,146,238,147,238,148,238,149,238,150,238,151,238,152,238,153,238,154,238,155,238,156,238,157,238,158,238,159,238,160,239,64,239,65,239,66,239,67,239,68,239,69,210,179,182,165,199,234,241,252,207,238,203,179,208,235,231,239,205,231,185,203,182,217,241,253,176,228,203,204,241,254,212,164,194,173,193,236,198,196,190,177,242,161,188,213,239,70,242,162,242,163,239,71,242,164,210,195,198,181,239,72,205,199,242,165,239,73,211,177,191,197,204,226,239,74,242,166,242,167,209,213,182,238,242,168,242,169,181,223,242,170,242,171,239,75,178,252,242,172,242,173,200,167,239,76,239,77,239,78,239,79,239,80,239,81,239,82,239,83,239,84,239,85,239,86,239,87,239,88,239,89,239,90,239,91,239,92,239,93,239,94,239,95,239,96,239,97,239,98,239,99,239,100,239,101,239,102,239,103,239,104,239,105,239,106,239,107,239,108,239,109,239,110,239,111,239,112,239,113,183,231,239,114,239,115,236,169,236,170,236,171,239,116,236,172,239,117,239,118,198,174,236,173,236,174,239,119,239,120,239,121,183,201,202,179,239,122,239,123,239,124,239,125,239,126,239,128,239,129,226,184,247,207,239,130,239,131,239,132,239,133,239,134,239,135,239,136,239,137,239,138,239,139,239,140,239,141,239,142,239,143,239,144,239,145,239,146,239,147,239,148,239,149,239,150,239,151,239,152,239,153,239,154,239,155,239,156,239,157,239,158,239,159,239,160,240,64,240,65,240,66,240,67,240,68,247,208,240,69,240,70,178,205,240,71,240,72,240,73,240,74,240,75,240,76,240,77,240,78,240,79,240,80,240,81,240,82,240,83,240,84,240,85,240,86,240,87,240,88,240,89,240,90,240,91,240,92,240,93,240,94,240,95,240,96,240,97,240,98,240,99,247,209,240,100,240,101,240,102,240,103,240,104,240,105,240,106,240,107,240,108,240,109,240,110,240,111,240,112,240,113,240,114,240,115,240,116,240,117,240,118,240,119,240,120,240,121,240,122,240,123,240,124,240,125,240,126,240,128,240,129,240,130,240,131,240,132,240,133,240,134,240,135,240,136,240,137,247,211,247,210,240,138,240,139,240,140,240,141,240,142,240,143,240,144,240,145,240,146,240,147,240,148,240,149,240,150,226,187,240,151,188,162,240,152,226,188,226,189,226,190,226,191,226,192,226,193,183,185,210,251,189,164,202,206,177,165,203,199,240,153,226,194,182,252,200,196,226,195,240,154,240,155,189,200,240,156,177,253,226,196,240,157,182,246,226,197,196,217,240,158,240,159,226,198,207,218,185,221,226,199,192,161,240,160,226,200,178,246,241,64,226,201,241,65,193,243,226,202,226,203,194,248,226,204,226,205,226,206,202,215,216,184,217,229,207,227,241,66,241,67,241,68,241,69,241,70,241,71,241,72,241,73,241,74,241,75,241,76,240,165,241,77,241,78,220,176,241,79,241,80,241,81,241,82,241,83,241,84,241,85,241,86,241,87,241,88,241,89,241,90,241,91,241,92,241,93,241,94,241,95,241,96,241,97,241,98,241,99,241,100,241,101,241,102,241,103,241,104,241,105,241,106,241,107,241,108,241,109,241,110,241,111,241,112,241,113,241,114,241,115,241,116,241,117,241,118,241,119,241,120,241,121,241,122,241,123,241,124,241,125,241,126,241,128,241,129,241,130,241,131,241,132,241,133,241,134,241,135,241,136,241,137,241,138,241,139,241,140,241,141,241,142,241,143,241,144,241,145,241,146,241,147,241,148,241,149,241,150,241,151,241,152,241,153,241,154,241,155,241,156,241,157,241,158,241,159,241,160,242,64,242,65,242,66,242,67,242,68,242,69,242,70,242,71,242,72,242,73,242,74,242,75,242,76,242,77,242,78,242,79,242,80,242,81,242,82,242,83,242,84,242,85,242,86,242,87,242,88,242,89,242,90,242,91,242,92,242,93,242,94,242,95,242,96,242,97,242,98,242,99,242,100,242,101,242,102,242,103,242,104,242,105,242,106,242,107,242,108,242,109,242,110,242,111,242,112,242,113,242,114,242,115,242,116,242,117,242,118,242,119,242,120,242,121,242,122,242,123,242,124,242,125,242,126,242,128,242,129,242,130,242,131,242,132,242,133,242,134,242,135,242,136,242,137,242,138,242,139,242,140,242,141,242,142,242,143,242,144,242,145,242,146,242,147,242,148,242,149,242,150,242,151,242,152,242,153,242,154,242,155,242,156,242,157,242,158,242,159,242,160,243,64,243,65,243,66,243,67,243,68,243,69,243,70,243,71,243,72,243,73,243,74,243,75,243,76,243,77,243,78,243,79,243,80,243,81,194,237,212,166,205,212,209,177,179,219,199,253,243,82,178,181,194,191,230,224,202,187,230,225,230,226,190,212,230,227,215,164,205,213,230,229,188,221,230,228,230,230,230,231,194,238,243,83,189,190,230,232,194,230,186,167,230,233,243,84,230,234,179,210,209,233,243,85,243,86,191,165,230,235,198,239,230,236,230,237,243,87,243,88,230,238,198,173,230,239,243,89,201,167,230,240,230,241,230,242,229,185,230,243,230,244,194,226,230,245,230,246,214,232,230,247,243,90,230,248,185,199,243,91,243,92,243,93,243,94,243,95,243,96,243,97,247,187,247,186,243,98,243,99,243,100,243,101,247,190,247,188,186,161,243,102,247,191,243,103,247,192,243,104,243,105,243,106,247,194,247,193,247,196,243,107,243,108,247,195,243,109,243,110,243,111,243,112,243,113,247,197,247,198,243,114,243,115,243,116,243,117,247,199,243,118,203,232,243,119,243,120,243,121,243,122,184,223,243,123,243,124,243,125,243,126,243,128,243,129,247,212,243,130,247,213,243,131,243,132,243,133,243,134,247,214,243,135,243,136,243,137,243,138,247,216,243,139,247,218,243,140,247,215,243,141,243,142,243,143,243,144,243,145,243,146,243,147,243,148,243,149,247,219,243,150,247,217,243,151,243,152,243,153,243,154,243,155,243,156,243,157,215,215,243,158,243,159,243,160,244,64,247,220,244,65,244,66,244,67,244,68,244,69,244,70,247,221,244,71,244,72,244,73,247,222,244,74,244,75,244,76,244,77,244,78,244,79,244,80,244,81,244,82,244,83,244,84,247,223,244,85,244,86,244,87,247,224,244,88,244,89,244,90,244,91,244,92,244,93,244,94,244,95,244,96,244,97,244,98,219,203,244,99,244,100,216,170,244,101,244,102,244,103,244,104,244,105,244,106,244,107,244,108,229,247,185,237,244,109,244,110,244,111,244,112,191,253,187,234,247,201,198,199,247,200,244,113,247,202,247,204,247,203,244,114,244,115,244,116,247,205,244,117,206,186,244,118,247,206,244,119,244,120,196,167,244,121,244,122,244,123,244,124,244,125,244,126,244,128,244,129,244,130,244,131,244,132,244,133,244,134,244,135,244,136,244,137,244,138,244,139,244,140,244,141,244,142,244,143,244,144,244,145,244,146,244,147,244,148,244,149,244,150,244,151,244,152,244,153,244,154,244,155,244,156,244,157,244,158,244,159,244,160,245,64,245,65,245,66,245,67,245,68,245,69,245,70,245,71,245,72,245,73,245,74,245,75,245,76,245,77,245,78,245,79,245,80,245,81,245,82,245,83,245,84,245,85,245,86,245,87,245,88,245,89,245,90,245,91,245,92,245,93,245,94,245,95,245,96,245,97,245,98,245,99,245,100,245,101,245,102,245,103,245,104,245,105,245,106,245,107,245,108,245,109,245,110,245,111,245,112,245,113,245,114,245,115,245,116,245,117,245,118,245,119,245,120,245,121,245,122,245,123,245,124,245,125,245,126,245,128,245,129,245,130,245,131,245,132,245,133,245,134,245,135,245,136,245,137,245,138,245,139,245,140,245,141,245,142,245,143,245,144,245,145,245,146,245,147,245,148,245,149,245,150,245,151,245,152,245,153,245,154,245,155,245,156,245,157,245,158,245,159,245,160,246,64,246,65,246,66,246,67,246,68,246,69,246,70,246,71,246,72,246,73,246,74,246,75,246,76,246,77,246,78,246,79,246,80,246,81,246,82,246,83,246,84,246,85,246,86,246,87,246,88,246,89,246,90,246,91,246,92,246,93,246,94,246,95,246,96,246,97,246,98,246,99,246,100,246,101,246,102,246,103,246,104,246,105,246,106,246,107,246,108,246,109,246,110,246,111,246,112,246,113,246,114,246,115,246,116,246,117,246,118,246,119,246,120,246,121,246,122,246,123,246,124,246,125,246,126,246,128,246,129,246,130,246,131,246,132,246,133,246,134,246,135,246,136,246,137,246,138,246,139,246,140,246,141,246,142,246,143,246,144,246,145,246,146,246,147,246,148,246,149,246,150,246,151,246,152,246,153,246,154,246,155,246,156,246,157,246,158,246,159,246,160,247,64,247,65,247,66,247,67,247,68,247,69,247,70,247,71,247,72,247,73,247,74,247,75,247,76,247,77,247,78,247,79,247,80,247,81,247,82,247,83,247,84,247,85,247,86,247,87,247,88,247,89,247,90,247,91,247,92,247,93,247,94,247,95,247,96,247,97,247,98,247,99,247,100,247,101,247,102,247,103,247,104,247,105,247,106,247,107,247,108,247,109,247,110,247,111,247,112,247,113,247,114,247,115,247,116,247,117,247,118,247,119,247,120,247,121,247,122,247,123,247,124,247,125,247,126,247,128,211,227,247,129,247,130,246,207,247,131,194,179,246,208,247,132,247,133,246,209,246,210,246,211,246,212,247,134,247,135,246,214,247,136,177,171,246,215,247,137,246,216,246,217,246,218,247,138,246,219,246,220,247,139,247,140,247,141,247,142,246,221,246,222,207,202,247,143,246,223,246,224,246,225,246,226,246,227,246,228,192,240,246,229,246,230,246,231,246,232,246,233,247,144,246,234,247,145,246,235,246,236,247,146,246,237,246,238,246,239,246,240,246,241,246,242,246,243,246,244,190,168,247,147,246,245,246,246,246,247,246,248,247,148,247,149,247,150,247,151,247,152,200,250,246,249,246,250,246,251,246,252,247,153,247,154,246,253,246,254,247,161,247,162,247,163,247,164,247,165,247,155,247,156,247,166,247,167,247,168,177,238,247,169,247,170,247,171,247,157,247,158,247,172,247,173,193,219,247,174,247,159,247,160,247,175,248,64,248,65,248,66,248,67,248,68,248,69,248,70,248,71,248,72,248,73,248,74,248,75,248,76,248,77,248,78,248,79,248,80,248,81,248,82,248,83,248,84,248,85,248,86,248,87,248,88,248,89,248,90,248,91,248,92,248,93,248,94,248,95,248,96,248,97,248,98,248,99,248,100,248,101,248,102,248,103,248,104,248,105,248,106,248,107,248,108,248,109,248,110,248,111,248,112,248,113,248,114,248,115,248,116,248,117,248,118,248,119,248,120,248,121,248,122,248,123,248,124,248,125,248,126,248,128,248,129,248,130,248,131,248,132,248,133,248,134,248,135,248,136,248,137,248,138,248,139,248,140,248,141,248,142,248,143,248,144,248,145,248,146,248,147,248,148,248,149,248,150,248,151,248,152,248,153,248,154,248,155,248,156,248,157,248,158,248,159,248,160,249,64,249,65,249,66,249,67,249,68,249,69,249,70,249,71,249,72,249,73,249,74,249,75,249,76,249,77,249,78,249,79,249,80,249,81,249,82,249,83,249,84,249,85,249,86,249,87,249,88,249,89,249,90,249,91,249,92,249,93,249,94,249,95,249,96,249,97,249,98,249,99,249,100,249,101,249,102,249,103,249,104,249,105,249,106,249,107,249,108,249,109,249,110,249,111,249,112,249,113,249,114,249,115,249,116,249,117,249,118,249,119,249,120,249,121,249,122,249,123,249,124,249,125,249,126,249,128,249,129,249,130,249,131,249,132,249,133,249,134,249,135,249,136,249,137,249,138,249,139,249,140,249,141,249,142,249,143,249,144,249,145,249,146,249,147,249,148,249,149,249,150,249,151,249,152,249,153,249,154,249,155,249,156,249,157,249,158,249,159,249,160,250,64,250,65,250,66,250,67,250,68,250,69,250,70,250,71,250,72,250,73,250,74,250,75,250,76,250,77,250,78,250,79,250,80,250,81,250,82,250,83,250,84,250,85,250,86,250,87,250,88,250,89,250,90,250,91,250,92,250,93,250,94,250,95,250,96,250,97,250,98,250,99,250,100,250,101,250,102,250,103,250,104,250,105,250,106,250,107,250,108,250,109,250,110,250,111,250,112,250,113,250,114,250,115,250,116,250,117,250,118,250,119,250,120,250,121,250,122,250,123,250,124,250,125,250,126,250,128,250,129,250,130,250,131,250,132,250,133,250,134,250,135,250,136,250,137,250,138,250,139,250,140,250,141,250,142,250,143,250,144,250,145,250,146,250,147,250,148,250,149,250,150,250,151,250,152,250,153,250,154,250,155,250,156,250,157,250,158,250,159,250,160,251,64,251,65,251,66,251,67,251,68,251,69,251,70,251,71,251,72,251,73,251,74,251,75,251,76,251,77,251,78,251,79,251,80,251,81,251,82,251,83,251,84,251,85,251,86,251,87,251,88,251,89,251,90,251,91,196,241,240,175,188,166,240,176,195,249,251,92,197,184,209,187,251,93,240,177,240,178,240,179,240,180,240,181,209,188,251,94,209,236,251,95,240,183,240,182,212,167,251,96,205,210,240,184,240,186,240,185,240,187,240,188,251,97,251,98,184,235,240,189,186,232,251,99,240,190,240,191,190,233,240,192,182,236,240,193,240,194,240,195,240,196,200,181,240,197,240,198,251,100,240,199,197,244,251,101,240,200,251,102,251,103,251,104,240,201,251,105,240,202,247,189,251,106,240,203,240,204,240,205,251,107,240,206,251,108,251,109,251,110,251,111,240,207,186,215,251,112,240,208,240,209,240,210,240,211,240,212,240,213,240,214,240,216,251,113,251,114,211,165,240,215,251,115,240,217,251,116,251,117,251,118,251,119,251,120,251,121,251,122,251,123,251,124,251,125,245,186,194,185,251,126,251,128,247,228,251,129,251,130,251,131,251,132,247,229,247,230,251,133,251,134,247,231,251,135,251,136,251,137,251,138,251,139,251,140,247,232,194,180,251,141,251,142,251,143,251,144,251,145,251,146,251,147,251,148,251,149,247,234,251,150,247,235,251,151,251,152,251,153,251,154,251,155,251,156,194,243,251,157,251,158,251,159,251,160,252,64,252,65,252,66,252,67,252,68,252,69,252,70,252,71,252,72,244,240,252,73,252,74,252,75,244,239,252,76,252,77,194,233,252,78,247,225,247,226,252,79,252,80,252,81,252,82,252,83,187,198,252,84,252,85,252,86,252,87,217,228,252,88,252,89,252,90,202,242,192,232,240,164,252,91,186,218,252,92,252,93,199,173,252,94,252,95,252,96,196,172,252,97,252,98,247,236,247,237,247,238,252,99,247,240,247,239,252,100,247,241,252,101,252,102,247,244,252,103,247,243,252,104,247,242,247,245,252,105,252,106,252,107,252,108,247,246,252,109,252,110,252,111,252,112,252,113,252,114,252,115,252,116,252,117,237,233,252,118,237,234,237,235,252,119,246,188,252,120,252,121,252,122,252,123,252,124,252,125,252,126,252,128,252,129,252,130,252,131,252,132,246,189,252,133,246,190,182,166,252,134,216,190,252,135,252,136,185,196,252,137,252,138,252,139,216,187,252,140,220,177,252,141,252,142,252,143,252,144,252,145,252,146,202,243,252,147,247,247,252,148,252,149,252,150,252,151,252,152,252,153,252,154,252,155,252,156,247,248,252,157,252,158,247,249,252,159,252,160,253,64,253,65,253,66,253,67,253,68,247,251,253,69,247,250,253,70,177,199,253,71,247,252,247,253,253,72,253,73,253,74,253,75,253,76,247,254,253,77,253,78,253,79,253,80,253,81,253,82,253,83,253,84,253,85,253,86,253,87,198,235,236,180,253,88,253,89,253,90,253,91,253,92,253,93,253,94,253,95,253,96,253,97,253,98,253,99,253,100,253,101,253,102,253,103,253,104,253,105,253,106,253,107,253,108,253,109,253,110,253,111,253,112,253,113,253,114,253,115,253,116,253,117,253,118,253,119,253,120,253,121,253,122,253,123,253,124,253,125,253,126,253,128,253,129,253,130,253,131,253,132,253,133,179,221,246,179,253,134,253,135,246,180,193,228,246,181,246,182,246,183,246,184,246,185,246,186,200,163,246,187,253,136,253,137,253,138,253,139,253,140,253,141,253,142,253,143,253,144,253,145,253,146,253,147,193,250,185,168,237,232,253,148,253,149,253,150,185,234,217,223,253,151,253,152,253,153,253,154,253,155,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,170,161,170,162,170,163,170,164,170,165,170,166,170,167,170,168,170,169,170,170,170,171,170,172,170,173,170,174,170,175,170,176,170,177,170,178,170,179,170,180,170,181,170,182,170,183,170,184,170,185,170,186,170,187,170,188,170,189,170,190,170,191,170,192,170,193,170,194,170,195,170,196,170,197,170,198,170,199,170,200,170,201,170,202,170,203,170,204,170,205,170,206,170,207,170,208,170,209,170,210,170,211,170,212,170,213,170,214,170,215,170,216,170,217,170,218,170,219,170,220,170,221,170,222,170,223,170,224,170,225,170,226,170,227,170,228,170,229,170,230,170,231,170,232,170,233,170,234,170,235,170,236,170,237,170,238,170,239,170,240,170,241,170,242,170,243,170,244,170,245,170,246,170,247,170,248,170,249,170,250,170,251,170,252,170,253,170,254,171,161,171,162,171,163,171,164,171,165,171,166,171,167,171,168,171,169,171,170,171,171,171,172,171,173,171,174,171,175,171,176,171,177,171,178,171,179,171,180,171,181,171,182,171,183,171,184,171,185,171,186,171,187,171,188,171,189,171,190,171,191,171,192,171,193,171,194,171,195,171,196,171,197,171,198,171,199,171,200,171,201,171,202,171,203,171,204,171,205,171,206,171,207,171,208,171,209,171,210,171,211,171,212,171,213,171,214,171,215,171,216,171,217,171,218,171,219,171,220,171,221,171,222,171,223,171,224,171,225,171,226,171,227,171,228,171,229,171,230,171,231,171,232,171,233,171,234,171,235,171,236,171,237,171,238,171,239,171,240,171,241,171,242,171,243,171,244,171,245,171,246,171,247,171,248,171,249,171,250,171,251,171,252,171,253,171,254,172,161,172,162,172,163,172,164,172,165,172,166,172,167,172,168,172,169,172,170,172,171,172,172,172,173,172,174,172,175,172,176,172,177,172,178,172,179,172,180,172,181,172,182,172,183,172,184,172,185,172,186,172,187,172,188,172,189,172,190,172,191,172,192,172,193,172,194,172,195,172,196,172,197,172,198,172,199,172,200,172,201,172,202,172,203,172,204,172,205,172,206,172,207,172,208,172,209,172,210,172,211,172,212,172,213,172,214,172,215,172,216,172,217,172,218,172,219,172,220,172,221,172,222,172,223,172,224,172,225,172,226,172,227,172,228,172,229,172,230,172,231,172,232,172,233,172,234,172,235,172,236,172,237,172,238,172,239,172,240,172,241,172,242,172,243,172,244,172,245,172,246,172,247,172,248,172,249,172,250,172,251,172,252,172,253,172,254,173,161,173,162,173,163,173,164,173,165,173,166,173,167,173,168,173,169,173,170,173,171,173,172,173,173,173,174,173,175,173,176,173,177,173,178,173,179,173,180,173,181,173,182,173,183,173,184,173,185,173,186,173,187,173,188,173,189,173,190,173,191,173,192,173,193,173,194,173,195,173,196,173,197,173,198,173,199,173,200,173,201,173,202,173,203,173,204,173,205,173,206,173,207,173,208,173,209,173,210,173,211,173,212,173,213,173,214,173,215,173,216,173,217,173,218,173,219,173,220,173,221,173,222,173,223,173,224,173,225,173,226,173,227,173,228,173,229,173,230,173,231,173,232,173,233,173,234,173,235,173,236,173,237,173,238,173,239,173,240,173,241,173,242,173,243,173,244,173,245,173,246,173,247,173,248,173,249,173,250,173,251,173,252,173,253,173,254,174,161,174,162,174,163,174,164,174,165,174,166,174,167,174,168,174,169,174,170,174,171,174,172,174,173,174,174,174,175,174,176,174,177,174,178,174,179,174,180,174,181,174,182,174,183,174,184,174,185,174,186,174,187,174,188,174,189,174,190,174,191,174,192,174,193,174,194,174,195,174,196,174,197,174,198,174,199,174,200,174,201,174,202,174,203,174,204,174,205,174,206,174,207,174,208,174,209,174,210,174,211,174,212,174,213,174,214,174,215,174,216,174,217,174,218,174,219,174,220,174,221,174,222,174,223,174,224,174,225,174,226,174,227,174,228,174,229,174,230,174,231,174,232,174,233,174,234,174,235,174,236,174,237,174,238,174,239,174,240,174,241,174,242,174,243,174,244,174,245,174,246,174,247,174,248,174,249,174,250,174,251,174,252,174,253,174,254,175,161,175,162,175,163,175,164,175,165,175,166,175,167,175,168,175,169,175,170,175,171,175,172,175,173,175,174,175,175,175,176,175,177,175,178,175,179,175,180,175,181,175,182,175,183,175,184,175,185,175,186,175,187,175,188,175,189,175,190,175,191,175,192,175,193,175,194,175,195,175,196,175,197,175,198,175,199,175,200,175,201,175,202,175,203,175,204,175,205,175,206,175,207,175,208,175,209,175,210,175,211,175,212,175,213,175,214,175,215,175,216,175,217,175,218,175,219,175,220,175,221,175,222,175,223,175,224,175,225,175,226,175,227,175,228,175,229,175,230,175,231,175,232,175,233,175,234,175,235,175,236,175,237,175,238,175,239,175,240,175,241,175,242,175,243,175,244,175,245,175,246,175,247,175,248,175,249,175,250,175,251,175,252,175,253,175,254,248,161,248,162,248,163,248,164,248,165,248,166,248,167,248,168,248,169,248,170,248,171,248,172,248,173,248,174,248,175,248,176,248,177,248,178,248,179,248,180,248,181,248,182,248,183,248,184,248,185,248,186,248,187,248,188,248,189,248,190,248,191,248,192,248,193,248,194,248,195,248,196,248,197,248,198,248,199,248,200,248,201,248,202,248,203,248,204,248,205,248,206,248,207,248,208,248,209,248,210,248,211,248,212,248,213,248,214,248,215,248,216,248,217,248,218,248,219,248,220,248,221,248,222,248,223,248,224,248,225,248,226,248,227,248,228,248,229,248,230,248,231,248,232,248,233,248,234,248,235,248,236,248,237,248,238,248,239,248,240,248,241,248,242,248,243,248,244,248,245,248,246,248,247,248,248,248,249,248,250,248,251,248,252,248,253,248,254,249,161,249,162,249,163,249,164,249,165,249,166,249,167,249,168,249,169,249,170,249,171,249,172,249,173,249,174,249,175,249,176,249,177,249,178,249,179,249,180,249,181,249,182,249,183,249,184,249,185,249,186,249,187,249,188,249,189,249,190,249,191,249,192,249,193,249,194,249,195,249,196,249,197,249,198,249,199,249,200,249,201,249,202,249,203,249,204,249,205,249,206,249,207,249,208,249,209,249,210,249,211,249,212,249,213,249,214,249,215,249,216,249,217,249,218,249,219,249,220,249,221,249,222,249,223,249,224,249,225,249,226,249,227,249,228,249,229,249,230,249,231,249,232,249,233,249,234,249,235,249,236,249,237,249,238,249,239,249,240,249,241,249,242,249,243,249,244,249,245,249,246,249,247,249,248,249,249,249,250,249,251,249,252,249,253,249,254,250,161,250,162,250,163,250,164,250,165,250,166,250,167,250,168,250,169,250,170,250,171,250,172,250,173,250,174,250,175,250,176,250,177,250,178,250,179,250,180,250,181,250,182,250,183,250,184,250,185,250,186,250,187,250,188,250,189,250,190,250,191,250,192,250,193,250,194,250,195,250,196,250,197,250,198,250,199,250,200,250,201,250,202,250,203,250,204,250,205,250,206,250,207,250,208,250,209,250,210,250,211,250,212,250,213,250,214,250,215,250,216,250,217,250,218,250,219,250,220,250,221,250,222,250,223,250,224,250,225,250,226,250,227,250,228,250,229,250,230,250,231,250,232,250,233,250,234,250,235,250,236,250,237,250,238,250,239,250,240,250,241,250,242,250,243,250,244,250,245,250,246,250,247,250,248,250,249,250,250,250,251,250,252,250,253,250,254,251,161,251,162,251,163,251,164,251,165,251,166,251,167,251,168,251,169,251,170,251,171,251,172,251,173,251,174,251,175,251,176,251,177,251,178,251,179,251,180,251,181,251,182,251,183,251,184,251,185,251,186,251,187,251,188,251,189,251,190,251,191,251,192,251,193,251,194,251,195,251,196,251,197,251,198,251,199,251,200,251,201,251,202,251,203,251,204,251,205,251,206,251,207,251,208,251,209,251,210,251,211,251,212,251,213,251,214,251,215,251,216,251,217,251,218,251,219,251,220,251,221,251,222,251,223,251,224,251,225,251,226,251,227,251,228,251,229,251,230,251,231,251,232,251,233,251,234,251,235,251,236,251,237,251,238,251,239,251,240,251,241,251,242,251,243,251,244,251,245,251,246,251,247,251,248,251,249,251,250,251,251,251,252,251,253,251,254,252,161,252,162,252,163,252,164,252,165,252,166,252,167,252,168,252,169,252,170,252,171,252,172,252,173,252,174,252,175,252,176,252,177,252,178,252,179,252,180,252,181,252,182,252,183,252,184,252,185,252,186,252,187,252,188,252,189,252,190,252,191,252,192,252,193,252,194,252,195,252,196,252,197,252,198,252,199,252,200,252,201,252,202,252,203,252,204,252,205,252,206,252,207,252,208,252,209,252,210,252,211,252,212,252,213,252,214,252,215,252,216,252,217,252,218,252,219,252,220,252,221,252,222,252,223,252,224,252,225,252,226,252,227,252,228,252,229,252,230,252,231,252,232,252,233,252,234,252,235,252,236,252,237,252,238,252,239,252,240,252,241,252,242,252,243,252,244,252,245,252,246,252,247,252,248,252,249,252,250,252,251,252,252,252,253,252,254,253,161,253,162,253,163,253,164,253,165,253,166,253,167,253,168,253,169,253,170,253,171,253,172,253,173,253,174,253,175,253,176,253,177,253,178,253,179,253,180,253,181,253,182,253,183,253,184,253,185,253,186,253,187,253,188,253,189,253,190,253,191,253,192,253,193,253,194,253,195,253,196,253,197,253,198,253,199,253,200,253,201,253,202,253,203,253,204,253,205,253,206,253,207,253,208,253,209,253,210,253,211,253,212,253,213,253,214,253,215,253,216,253,217,253,218,253,219,253,220,253,221,253,222,253,223,253,224,253,225,253,226,253,227,253,228,253,229,253,230,253,231,253,232,253,233,253,234,253,235,253,236,253,237,253,238,253,239,253,240,253,241,253,242,253,243,253,244,253,245,253,246,253,247,253,248,253,249,253,250,253,251,253,252,253,253,253,254,254,161,254,162,254,163,254,164,254,165,254,166,254,167,254,168,254,169,254,170,254,171,254,172,254,173,254,174,254,175,254,176,254,177,254,178,254,179,254,180,254,181,254,182,254,183,254,184,254,185,254,186,254,187,254,188,254,189,254,190,254,191,254,192,254,193,254,194,254,195,254,196,254,197,254,198,254,199,254,200,254,201,254,202,254,203,254,204,254,205,254,206,254,207,254,208,254,209,254,210,254,211,254,212,254,213,254,214,254,215,254,216,254,217,254,218,254,219,254,220,254,221,254,222,254,223,254,224,254,225,254,226,254,227,254,228,254,229,254,230,254,231,254,232,254,233,254,234,254,235,254,236,254,237,254,238,254,239,254,240,254,241,254,242,254,243,254,244,254,245,254,246,254,247,254,248,254,249,254,250,254,251,254,252,254,253,254,254,161,64,161,65,161,66,161,67,161,68,161,69,161,70,161,71,161,72,161,73,161,74,161,75,161,76,161,77,161,78,161,79,161,80,161,81,161,82,161,83,161,84,161,85,161,86,161,87,161,88,161,89,161,90,161,91,161,92,161,93,161,94,161,95,161,96,161,97,161,98,161,99,161,100,161,101,161,102,161,103,161,104,161,105,161,106,161,107,161,108,161,109,161,110,161,111,161,112,161,113,161,114,161,115,161,116,161,117,161,118,161,119,161,120,161,121,161,122,161,123,161,124,161,125,161,126,161,128,161,129,161,130,161,131,161,132,161,133,161,134,161,135,161,136,161,137,161,138,161,139,161,140,161,141,161,142,161,143,161,144,161,145,161,146,161,147,161,148,161,149,161,150,161,151,161,152,161,153,161,154,161,155,161,156,161,157,161,158,161,159,161,160,162,64,162,65,162,66,162,67,162,68,162,69,162,70,162,71,162,72,162,73,162,74,162,75,162,76,162,77,162,78,162,79,162,80,162,81,162,82,162,83,162,84,162,85,162,86,162,87,162,88,162,89,162,90,162,91,162,92,162,93,162,94,162,95,162,96,162,97,162,98,162,99,162,100,162,101,162,102,162,103,162,104,162,105,162,106,162,107,162,108,162,109,162,110,162,111,162,112,162,113,162,114,162,115,162,116,162,117,162,118,162,119,162,120,162,121,162,122,162,123,162,124,162,125,162,126,162,128,162,129,162,130,162,131,162,132,162,133,162,134,162,135,162,136,162,137,162,138,162,139,162,140,162,141,162,142,162,143,162,144,162,145,162,146,162,147,162,148,162,149,162,150,162,151,162,152,162,153,162,154,162,155,162,156,162,157,162,158,162,159,162,160,163,64,163,65,163,66,163,67,163,68,163,69,163,70,163,71,163,72,163,73,163,74,163,75,163,76,163,77,163,78,163,79,163,80,163,81,163,82,163,83,163,84,163,85,163,86,163,87,163,88,163,89,163,90,163,91,163,92,163,93,163,94,163,95,163,96,163,97,163,98,163,99,163,100,163,101,163,102,163,103,163,104,163,105,163,106,163,107,163,108,163,109,163,110,163,111,163,112,163,113,163,114,163,115,163,116,163,117,163,118,163,119,163,120,163,121,163,122,163,123,163,124,163,125,163,126,163,128,163,129,163,130,163,131,163,132,163,133,163,134,163,135,163,136,163,137,163,138,163,139,163,140,163,141,163,142,163,143,163,144,163,145,163,146,163,147,163,148,163,149,163,150,163,151,163,152,163,153,163,154,163,155,163,156,163,157,163,158,163,159,163,160,164,64,164,65,164,66,164,67,164,68,164,69,164,70,164,71,164,72,164,73,164,74,164,75,164,76,164,77,164,78,164,79,164,80,164,81,164,82,164,83,164,84,164,85,164,86,164,87,164,88,164,89,164,90,164,91,164,92,164,93,164,94,164,95,164,96,164,97,164,98,164,99,164,100,164,101,164,102,164,103,164,104,164,105,164,106,164,107,164,108,164,109,164,110,164,111,164,112,164,113,164,114,164,115,164,116,164,117,164,118,164,119,164,120,164,121,164,122,164,123,164,124,164,125,164,126,164,128,164,129,164,130,164,131,164,132,164,133,164,134,164,135,164,136,164,137,164,138,164,139,164,140,164,141,164,142,164,143,164,144,164,145,164,146,164,147,164,148,164,149,164,150,164,151,164,152,164,153,164,154,164,155,164,156,164,157,164,158,164,159,164,160,165,64,165,65,165,66,165,67,165,68,165,69,165,70,165,71,165,72,165,73,165,74,165,75,165,76,165,77,165,78,165,79,165,80,165,81,165,82,165,83,165,84,165,85,165,86,165,87,165,88,165,89,165,90,165,91,165,92,165,93,165,94,165,95,165,96,165,97,165,98,165,99,165,100,165,101,165,102,165,103,165,104,165,105,165,106,165,107,165,108,165,109,165,110,165,111,165,112,165,113,165,114,165,115,165,116,165,117,165,118,165,119,165,120,165,121,165,122,165,123,165,124,165,125,165,126,165,128,165,129,165,130,165,131,165,132,165,133,165,134,165,135,165,136,165,137,165,138,165,139,165,140,165,141,165,142,165,143,165,144,165,145,165,146,165,147,165,148,165,149,165,150,165,151,165,152,165,153,165,154,165,155,165,156,165,157,165,158,165,159,165,160,166,64,166,65,166,66,166,67,166,68,166,69,166,70,166,71,166,72,166,73,166,74,166,75,166,76,166,77,166,78,166,79,166,80,166,81,166,82,166,83,166,84,166,85,166,86,166,87,166,88,166,89,166,90,166,91,166,92,166,93,166,94,166,95,166,96,166,97,166,98,166,99,166,100,166,101,166,102,166,103,166,104,166,105,166,106,166,107,166,108,166,109,166,110,166,111,166,112,166,113,166,114,166,115,166,116,166,117,166,118,166,119,166,120,166,121,166,122,166,123,166,124,166,125,166,126,166,128,166,129,166,130,166,131,166,132,166,133,166,134,166,135,166,136,166,137,166,138,166,139,166,140,166,141,166,142,166,143,166,144,166,145,166,146,166,147,166,148,166,149,166,150,166,151,166,152,166,153,166,154,166,155,166,156,166,157,166,158,166,159,166,160,167,64,167,65,167,66,167,67,167,68,167,69,167,70,167,71,167,72,167,73,167,74,167,75,167,76,167,77,167,78,167,79,167,80,167,81,167,82,167,83,167,84,167,85,167,86,167,87,167,88,167,89,167,90,167,91,167,92,167,93,167,94,167,95,167,96,167,97,167,98,167,99,167,100,167,101,167,102,167,103,167,104,167,105,167,106,167,107,167,108,167,109,167,110,167,111,167,112,167,113,167,114,167,115,167,116,167,117,167,118,167,119,167,120,167,121,167,122,167,123,167,124,167,125,167,126,167,128,167,129,167,130,167,131,167,132,167,133,167,134,167,135,167,136,167,137,167,138,167,139,167,140,167,141,167,142,167,143,167,144,167,145,167,146,167,147,167,148,167,149,167,150,167,151,167,152,167,153,167,154,167,155,167,156,167,157,167,158,167,159,167,160,162,171,162,172,162,173,162,174,162,175,162,176,162,227,162,228,162,239,162,240,162,253,162,254,164,244,164,245,164,246,164,247,164,248,164,249,164,250,164,251,164,252,164,253,164,254,165,247,165,248,165,249,165,250,165,251,165,252,165,253,165,254,166,185,166,186,166,187,166,188,166,189,166,190,166,191,166,192,166,217,166,218,166,219,166,220,166,221,166,222,166,223,166,236,166,237,166,243,166,246,166,247,166,248,166,249,166,250,166,251,166,252,166,253,166,254,167,194,167,195,167,196,167,197,167,198,167,199,167,200,167,201,167,202,167,203,167,204,167,205,167,206,167,207,167,208,167,242,167,243,167,244,167,245,167,246,167,247,167,248,167,249,167,250,167,251,167,252,167,253,167,254,168,150,168,151,168,152,168,153,168,154,168,155,168,156,168,157,168,158,168,159,168,160,168,188,168,191,168,193,168,194,168,195,168,196,168,234,168,235,168,236,168,237,168,238,168,239,168,240,168,241,168,242,168,243,168,244,168,245,168,246,168,247,168,248,168,249,168,250,168,251,168,252,168,253,168,254,169,88,169,91,169,93,169,94,169,95,169,137,169,138,169,139,169,140,169,141,169,142,169,143,169,144,169,145,169,146,169,147,169,148,169,149,169,151,169,152,169,153,169,154,169,155,169,156,169,157,169,158,169,159,169,160,169,161,169,162,169,163,169,240,169,241,169,242,169,243,169,244,169,245,169,246,169,247,169,248,169,249,169,250,169,251,169,252,169,253,169,254,215,250,215,251,215,252,215,253,215,254,254,80,254,81,254,82,254,83,254,84,254,85,254,86,254,87,254,88,254,89,254,90,254,91,254,92,254,93,254,94,254,95,254,96,254,97,254,98,254,99,254,100,254,101,254,102,254,103,254,104,254,105,254,106,254,107,254,108,254,109,254,110,254,111,254,112,254,113,254,114,254,115,254,116,254,117,254,118,254,119,254,120,254,121,254,122,254,123,254,124,254,125,254,126,254,128,254,129,254,130,254,131,254,132,254,133,254,134,254,135,254,136,254,137,254,138,254,139,254,140,254,141,254,142,254,143,254,144,254,145,254,146,254,147,254,148,254,149,254,150,254,151,254,152,254,153,254,154,254,155,254,156,254,157,254,158,254,159,254,160,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,216,77,184,252,220,135,217,90,187,172,180,174,190,228,253,148,253,148,198,245,189,240,192,174,196,206,145,208,176,93,193,95,204,125,194,221,194,227,223,137,152,183,194,229,192,211,231,243,194,228,192,210,241,152,129,121,194,209,153,218,160,128,204,109,251,91,141,185,158,69,203,123,210,104,192,173,197,68,207,158,192,200,192,202,192,203,192,199,253,156,129,237,192,228,132,218,147,239,153,169,160,116,177,82,192,207,204,74,204,148,194,183,194,182,244,148,250,152,194,181,181,147,190,71,199,138,228,155,194,185,213,147,137,197,197,170,187,92,195,64,192,206,192,218,217,84,192,215,137,190,140,210,152,199,156,73,194,169,192,219,191,124,194,170,192,213,192,223,132,67,193,232,182,160,190,99,193,226,193,234,215,120,146,130,152,183,214,90,181,164,140,142,197,173,194,202,174,144,177,177,180,145,177,227,143,205,178,187,195,218,148,181,203,247,133,162,200,251,202,161,200,126,213,102,154,162,179,189,201,242,202,176,200,244,194,211,194,212,193,193,131,201,253,157,193,186,188,90,193,188,213,143,193,191,132,238,133,206,197,174,143,93,194,195,158,86,181,90,233,130,243,80,251,144,192,232,193,166,149,209,154,118,222,93,196,234,145,122,145,217,147,211,157,105,159,146,173,73,253,158,190,154,194,147,221,130,201,143,223,66,229,128,193,208,193,211,209,202,193,210,193,209,213,102,193,174,196,238,196,237,154,154,186,159,171,67,193,238,224,242,140,142,142,88,193,175,193,225,172,147,193,231,241,246,226,143,193,227,236,96,238,73,192,253,182,89,245,183,235,96,144,186,193,203,193,197,229,188,196,242,193,207,152,183,193,199,175,159,222,164,223,124,253,136,149,158,200,238,132,162,150,131,193,248,193,247,193,239,193,240,193,244,193,242,188,126,238,144,193,249,194,190,234,145,130,144,141,145,156,83,221,134,194,201,144,252,192,245,194,202,194,161,192,251,192,244,194,196,210,215,192,238,192,230,196,224,192,237,193,161,238,190,253,159,209,101,192,239,235,120,196,228,196,231,193,223,159,251,173,85,204,65,253,160,247,91,247,235,193,214,193,220,197,82,193,162,243,210,193,163,160,238,214,203,215,82,202,178,178,232,180,204,199,208,182,200,205,216,204,199,213,172,182,180,177,169,221,151,208,208,189,181,210,138,192,170,254,64,254,65,254,66,254,67,137,86,254,68,199,231,254,69,254,70,132,68,216,105,210,230,254,71,201,241,207,233,184,163,190,184,190,171,211,240,254,72,254,73,254,74,214,84,254,75,254,76,210,221,182,188,254,77,254,78,254,79,239,136,239,149,240,94,250,81,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,0,0,0,0,0,0,169,85,166,242,0,0,166,244,166,245,166,224,166,225,166,240,166,241,166,226,166,227,166,238,166,239,166,230,166,231,166,228,166,229,166,232,166,233,166,234,166,235,0,0,0,0,0,0,0,0,169,104,169,105,169,106,169,107,169,108,169,109,169,110,169,111,169,112,169,113,0,0,169,114,169,115,169,116,169,117,0,0,169,118,169,119,169,120,169,121,169,122,169,123,169,124,169,125,169,126,169,128,169,129,169,130,169,131,169,132,0,0,169,133,169,134,169,135,169,136,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,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,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,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,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,163,161,163,162,163,163,161,231,163,165,163,166,163,167,163,168,163,169,163,170,163,171,163,172,163,173,163,174,163,175,163,176,163,177,163,178,163,179,163,180,163,181,163,182,163,183,163,184,163,185,163,186,163,187,163,188,163,189,163,190,163,191,163,192,163,193,163,194,163,195,163,196,163,197,163,198,163,199,163,200,163,201,163,202,163,203,163,204,163,205,163,206,163,207,163,208,163,209,163,210,163,211,163,212,163,213,163,214,163,215,163,216,163,217,163,218,163,219,163,220,163,221,163,222,163,223,163,224,163,225,163,226,163,227,163,228,163,229,163,230,163,231,163,232,163,233,163,234,163,235,163,236,163,237,163,238,163,239,163,240,163,241,163,242,163,243,163,244,163,245,163,246,163,247,163,248,163,249,163,250,163,251,163,252,163,253,161,171,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,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,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,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,161,233,161,234,169,86,163,254,169,87,163,164,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,};\r\nuchar g_gbk[65536*2]={0,0,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,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,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,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,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,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,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,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,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,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,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,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,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,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,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,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,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,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,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,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,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,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,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,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,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,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,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,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,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,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,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,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,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,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,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,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,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,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,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,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,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,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,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,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,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,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,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,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,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,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,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,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,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,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,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,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,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,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,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,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,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,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,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,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,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,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,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,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,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,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,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,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,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,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,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,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,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,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,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,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,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,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,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,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,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,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,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,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,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,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,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,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,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,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,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,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,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,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,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,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,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,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,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,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,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,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,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,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,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,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,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,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,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,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,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,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,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,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,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,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,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,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,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,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,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,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,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,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,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,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,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,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,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,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,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,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,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,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,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,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,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,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,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,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,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,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,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,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,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,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,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,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,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,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,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,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,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,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,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,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,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,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,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,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,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,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,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,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,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,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,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,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,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,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,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,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,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,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,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,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,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,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,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,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,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,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,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,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,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,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,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,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,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,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,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,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,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,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,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,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,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,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,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,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,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,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,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,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,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,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,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,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,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,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,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,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,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,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,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,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,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,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,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,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,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,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,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,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,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,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,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,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,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,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,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,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,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,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,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,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,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,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,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,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,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,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,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,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,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,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,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,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,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,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,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,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,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,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,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,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,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,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,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,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,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,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,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,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,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,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,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,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,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,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,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,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,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,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,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,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,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,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,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,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,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,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,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,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,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,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,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,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,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,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,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,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,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,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,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,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,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,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,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,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,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,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,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,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,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,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,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,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,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,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,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,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,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,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,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,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,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,2,78,164,79,189,80,216,81,17,83,162,84,6,86,18,87,62,88,61,89,97,90,72,91,170,92,161,93,198,94,8,96,71,97,79,98,193,99,219,100,242,101,4,103,92,104,97,105,92,106,47,107,89,108,205,109,240,110,230,111,220,112,214,113,198,228,38,229,134,229,230,229,70,230,166,230,6,231,202,2,33,48,220,114,114,115,248,115,123,116,243,116,136,117,69,118,196,118,93,119,230,119,132,120,13,121,147,121,29,122,163,122,47,123,197,123,67,124,191,124,55,125,153,125,251,125,94,126,86,127,228,127,126,128,64,129,212,129,106,130,62,131,238,131,125,132,3,133,130,133,249,133,109,134,25,135,165,135,36,136,172,136,56,137,162,137,30,138,129,138,228,138,70,139,56,140,174,140,14,141,213,141,115,142,229,142,69,143,25,144,194,144,69,145,230,145,70,146,168,146,10,147,108,147,206,147,47,148,39,149,204,149,140,150,33,151,158,151,15,152,111,152,8,153,140,153,250,153,90,154,7,155,124,155,220,155,60,156,227,156,67,157,163,157,3,158,171,158,50,159,12,250,0,0,0,0,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,4,78,171,79,190,80,217,81,18,83,165,84,7,86,19,87,63,88,62,89,99,90,73,91,174,92,162,93,199,94,9,96,73,97,80,98,194,99,220,100,243,101,5,103,93,104,98,105,93,106,48,107,90,108,206,109,241,110,231,111,221,112,215,113,199,228,39,229,135,229,231,229,71,230,167,230,7,231,203,2,34,48,221,114,115,115,249,115,124,116,245,116,137,117,70,118,199,118,94,119,232,119,133,120,14,121,148,121,31,122,164,122,48,123,200,123,68,124,192,124,56,125,154,125,252,125,95,126,89,127,231,127,129,128,65,129,213,129,107,130,63,131,239,131,126,132,4,133,131,133,250,133,111,134,27,135,166,135,37,136,174,136,57,137,163,137,31,138,130,138,229,138,71,139,57,140,175,140,15,141,216,141,117,142,230,142,70,143,28,144,195,144,71,145,231,145,71,146,169,146,11,147,109,147,207,147,48,148,51,149,205,149,142,150,34,151,159,151,16,152,112,152,9,153,142,153,251,153,91,154,9,155,125,155,221,155,61,156,228,156,68,157,164,157,4,158,172,158,51,159,13,250,0,0,0,0,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,5,78,173,79,191,80,218,81,19,83,174,84,10,86,20,87,64,88,63,89,100,90,74,91,175,92,163,93,200,94,11,96,75,97,85,98,195,99,221,100,244,101,6,103,94,104,100,105,94,106,49,107,98,108,207,109,242,110,232,111,222,112,216,113,200,228,40,229,136,229,232,229,72,230,168,230,8,231,217,2,35,48,223,114,116,115,250,115,125,116,248,116,138,117,71,118,201,118,95,119,234,119,134,120,15,121,149,121,33,122,167,122,50,123,201,123,69,124,194,124,57,125,155,125,253,125,96,126,91,127,232,127,130,128,66,129,214,129,108,130,65,131,243,131,127,132,5,133,134,133,252,133,112,134,29,135,167,135,38,136,175,136,58,137,164,137,32,138,131,138,230,138,72,139,58,140,176,140,16,141,217,141,119,142,231,142,71,143,35,144,198,144,72,145,232,145,72,146,170,146,12,147,110,147,208,147,49,148,61,149,206,149,145,150,35,151,161,151,17,152,113,152,10,153,154,153,252,153,92,154,10,155,126,155,222,155,62,156,229,156,69,157,165,157,5,158,173,158,52,159,14,250,0,0,0,0,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,6,78,176,79,192,80,220,81,20,83,176,84,11,86,21,87,65,88,64,89,101,90,75,91,176,92,164,93,203,94,12,96,77,97,86,98,197,99,223,100,245,101,7,103,95,104,101,105,95,106,51,107,99,108,208,109,243,110,233,111,224,112,217,113,201,228,41,229,137,229,233,229,73,230,169,230,9,231,19,32,36,48,226,114,117,115,251,115,127,116,249,116,140,117,72,118,203,118,96,119,239,119,136,120,16,121,150,121,34,122,169,122,52,123,202,123,70,124,195,124,58,125,156,125,254,125,97,126,92,127,234,127,133,128,67,129,215,129,109,130,66,131,244,131,128,132,6,133,136,133,253,133,114,134,31,135,169,135,39,136,176,136,59,137,165,137,33,138,132,138,231,138,73,139,59,140,177,140,17,141,220,141,120,142,232,142,72,143,36,144,200,144,81,145,233,145,73,146,171,146,13,147,111,147,209,147,50,148,67,149,207,149,146,150,36,151,162,151,18,152,114,152,11,153,155,153,253,153,93,154,11,155,127,155,223,155,63,156,230,156,70,157,166,157,6,158,174,158,53,159,15,250,0,0,0,0,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,15,78,177,79,193,80,222,81,24,83,178,84,13,86,22,87,66,88,67,89,102,90,76,91,178,92,165,93,204,94,16,96,79,97,87,98,199,99,224,100,248,101,12,103,106,104,103,105,96,106,52,107,101,108,210,109,245,110,234,111,225,112,218,113,202,228,42,229,138,229,234,229,74,230,170,230,10,231,21,32,37,48,227,114,118,115,252,115,130,116,250,116,141,117,73,118,204,118,100,119,240,119,138,120,17,121,151,121,36,122,170,122,53,123,203,123,71,124,196,124,59,125,157,125,255,125,98,126,93,127,235,127,136,128,68,129,216,129,113,130,68,131,245,131,129,132,7,133,137,133,254,133,115,134,32,135,170,135,40,136,178,136,60,137,166,137,34,138,133,138,232,138,74,139,60,140,178,140,18,141,224,141,121,142,233,142,73,143,37,144,201,144,83,145,234,145,74,146,172,146,14,147,112,147,210,147,51,148,72,149,208,149,147,150,37,151,164,151,19,152,115,152,12,153,156,153,254,153,94,154,12,155,128,155,224,155,64,156,231,156,71,157,167,157,7,158,175,158,54,159,17,250,0,0,0,0,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,18,78,178,79,194,80,223,81,27,83,181,84,16,86,23,87,67,88,69,89,104,90,77,91,180,92,166,93,205,94,17,96,80,97,89,98,200,99,225,100,249,101,14,103,108,104,104,105,98,106,53,107,102,108,211,109,246,110,235,111,226,112,219,113,203,228,43,229,139,229,235,229,75,230,171,230,11,231,37,32,38,48,228,114,119,115,253,115,132,116,251,116,142,117,74,118,211,118,103,119,241,119,139,120,18,121,152,121,37,122,171,122,54,123,205,123,72,124,198,124,60,125,158,125,0,126,99,126,94,127,236,127,138,128,69,129,217,129,117,130,69,131,246,131,131,132,8,133,138,133,0,134,116,134,36,135,174,135,41,136,179,136,61,137,167,137,35,138,134,138,233,138,75,139,61,140,179,140,19,141,225,141,122,142,234,142,74,143,39,144,203,144,84,145,235,145,75,146,173,146,15,147,113,147,211,147,52,148,75,149,209,149,149,150,38,151,165,151,20,152,116,152,14,153,157,153,255,153,95,154,13,155,129,155,225,155,65,156,232,156,72,157,168,157,8,158,176,158,56,159,19,250,0,0,0,0,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,23,78,179,79,195,80,226,81,28,83,182,84,17,86,24,87,69,88,70,89,105,90,78,91,182,92,167,93,206,94,19,96,82,97,90,98,202,99,227,100,251,101,15,103,109,104,105,105,99,106,54,107,103,108,212,109,247,110,236,111,227,112,220,113,204,228,44,229,140,229,236,229,76,230,172,230,12,231,53,32,39,48,229,114,120,115,254,115,133,116,252,116,144,117,75,118,213,118,105,119,242,119,143,120,20,121,153,121,38,122,174,122,55,123,206,123,73,124,201,124,61,125,159,125,1,126,100,126,96,127,237,127,141,128,71,129,218,129,118,130,72,131,247,131,132,132,9,133,139,133,1,134,117,134,38,135,176,135,42,136,180,136,62,137,168,137,36,138,135,138,234,138,76,139,62,140,180,140,20,141,226,141,123,142,235,142,75,143,40,144,204,144,85,145,236,145,76,146,175,146,16,147,114,147,212,147,53,148,85,149,210,149,150,150,39,151,166,151,21,152,139,152,15,153,158,153,0,154,96,154,14,155,130,155,226,155,66,156,233,156,73,157,169,157,9,158,177,158,58,159,20,250,0,0,0,0,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,31,78,180,79,196,80,227,81,30,83,183,84,18,86,25,87,70,88,74,89,107,90,79,91,185,92,168,93,207,94,23,96,83,97,92,98,203,99,229,100,252,101,17,103,110,104,106,105,100,106,56,107,107,108,213,109,248,110,237,111,229,112,221,113,205,228,45,229,141,229,237,229,77,230,173,230,13,231,5,33,40,48,230,114,121,115,255,115,134,116,253,116,147,117,78,118,217,118,106,119,244,119,144,120,21,121,155,121,39,122,175,122,57,123,207,123,74,124,203,124,62,125,160,125,2,126,101,126,99,127,239,127,142,128,73,129,219,129,119,130,74,131,250,131,133,132,10,133,140,133,2,134,118,134,39,135,177,135,43,136,181,136,63,137,169,137,37,138,136,138,235,138,77,139,63,140,181,140,21,141,229,141,125,142,236,142,76,143,41,144,205,144,86,145,237,145,77,146,176,146,17,147,115,147,213,147,54,148,90,149,211,149,154,150,40,151,167,151,22,152,142,152,17,153,159,153,1,154,97,154,16,155,131,155,227,155,67,156,234,156,74,157,170,157,10,158,178,158,60,159,24,250,0,0,0,0,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,32,78,182,79,197,80,229,81,31,83,185,84,19,86,26,87,71,88,76,89,108,90,82,91,186,92,169,93,208,94,24,96,84,97,93,98,204,99,231,100,253,101,18,103,111,104,108,105,102,106,59,107,108,108,215,109,250,110,240,111,234,112,222,113,206,228,46,229,142,229,238,229,78,230,174,230,14,231,9,33,41,48,231,114,122,115,0,116,136,116,254,116,149,117,79,118,218,118,109,119,245,119,146,120,22,121,156,121,40,122,176,122,59,123,208,123,75,124,206,124,63,125,161,125,3,126,102,126,100,127,242,127,143,128,77,129,220,129,120,130,75,131,251,131,134,132,11,133,141,133,3,134,119,134,40,135,178,135,44,136,182,136,64,137,170,137,38,138,139,138,236,138,78,139,64,140,182,140,22,141,230,141,126,142,237,142,77,143,42,144,210,144,88,145,238,145,78,146,177,146,18,147,116,147,215,147,55,148,96,149,212,149,155,150,41,151,168,151,23,152,146,152,18,153,160,153,2,154,98,154,17,155,132,155,228,155,68,156,235,156,75,157,171,157,11,158,179,158,63,159,31,250,0,0,0,0,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,33,78,183,79,198,80,230,81,34,83,186,84,20,86,27,87,72,88,77,89,109,90,86,91,187,92,170,93,212,94,26,96,86,97,94,98,209,99,232,100,254,101,19,103,112,104,109,105,103,106,60,107,109,108,218,109,251,110,241,111,238,112,223,113,207,228,47,229,143,229,239,229,79,230,175,230,15,231,150,33,163,50,234,114,123,115,1,116,137,116,0,117,152,117,80,118,220,118,110,119,247,119,148,120,23,121,157,121,41,122,177,122,61,123,210,123,76,124,207,124,64,125,162,125,4,126,103,126,101,127,244,127,144,128,78,129,221,129,123,130,76,131,252,131,138,132,13,133,142,133,4,134,120,134,42,135,180,135,45,136,184,136,66,137,171,137,39,138,140,138,237,138,79,139,66,140,183,140,23,141,231,141,128,142,238,142,78,143,43,144,212,144,89,145,239,145,79,146,178,146,19,147,117,147,216,147,56,148,110,149,213,149,157,150,43,151,169,151,24,152,149,152,19,153,161,153,3,154,99,154,18,155,133,155,229,155,69,156,236,156,76,157,172,157,12,158,181,158,64,159,32,250,0,0,0,0,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,35,78,184,79,199,80,231,81,36,83,188,84,21,86,29,87,73,88,80,89,110,90,94,91,188,92,171,93,213,94,30,96,87,97,95,98,211,99,233,100,255,101,22,103,113,104,111,105,104,106,61,107,110,108,219,109,252,110,242,111,240,112,225,113,208,228,48,229,144,229,240,229,80,230,176,230,16,231,151,33,142,51,235,114,124,115,2,116,138,116,1,117,155,117,81,118,221,118,111,119,249,119,149,120,24,121,158,121,42,122,178,122,63,123,212,123,78,124,208,124,65,125,163,125,5,126,104,126,102,127,245,127,145,128,79,129,222,129,124,130,77,131,254,131,141,132,14,133,144,133,6,134,131,134,43,135,182,135,46,136,185,136,67,137,172,137,40,138,141,138,238,138,80,139,67,140,184,140,24,141,233,141,130,142,239,142,79,143,44,144,213,144,91,145,240,145,80,146,179,146,20,147,118,147,217,147,57,148,116,149,214,149,158,150,44,151,170,151,25,152,153,152,20,153,162,153,4,154,100,154,20,155,134,155,230,155,70,156,237,156,77,157,173,157,13,158,182,158,65,159,33,250,0,0,0,0,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,38,78,185,79,200,80,232,81,37,83,190,84,22,86,30,87,74,88,82,89,111,90,96,91,190,92,172,93,215,94,31,96,88,97,96,98,212,99,234,100,1,102,24,103,114,104,112,105,105,106,63,107,111,108,220,109,253,110,243,111,241,112,226,113,209,228,49,229,145,229,241,229,81,230,177,230,17,231,152,33,143,51,245,114,125,115,4,116,140,116,2,117,156,117,82,118,222,118,112,119,250,119,150,120,25,121,159,121,43,122,180,122,64,123,213,123,79,124,209,124,66,125,164,125,6,126,105,126,103,127,246,127,146,128,82,129,223,129,128,130,78,131,255,131,143,132,15,133,145,133,7,134,132,134,44,135,183,135,47,136,186,136,69,137,173,137,41,138,142,138,239,138,81,139,68,140,185,140,25,141,237,141,131,142,240,142,80,143,48,144,214,144,92,145,241,145,81,146,180,146,21,147,119,147,218,147,58,148,117,149,215,149,159,150,46,151,172,151,26,152,163,152,21,153,163,153,5,154,101,154,21,155,135,155,231,155,71,156,238,156,78,157,174,157,14,158,183,158,66,159,35,250,0,0,0,0,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,41,78,186,79,201,80,233,81,39,83,195,84,23,86,32,87,75,88,83,89,112,90,97,91,192,92,173,93,216,94,34,96,89,97,97,98,213,99,235,100,4,102,25,103,115,104,114,105,106,106,64,107,113,108,223,109,254,110,244,111,242,112,227,113,210,228,50,229,146,229,242,229,82,230,178,230,18,231,153,33,156,51,246,114,127,115,7,116,141,116,3,117,158,117,83,118,224,118,113,119,251,119,153,120,26,121,160,121,44,122,181,122,65,123,214,123,80,124,210,124,67,125,165,125,7,126,106,126,107,127,247,127,148,128,86,129,224,129,129,130,83,131,0,132,144,132,16,133,146,133,8,134,133,134,45,135,184,135,48,136,187,136,70,137,174,137,42,138,143,138,240,138,82,139,69,140,186,140,26,141,238,141,132,142,241,142,81,143,49,144,216,144,95,145,242,145,82,146,181,146,22,147,120,147,219,147,59,148,119,149,216,149,160,150,47,151,174,151,27,152,168,152,22,153,164,153,6,154,102,154,22,155,136,155,232,155,72,156,239,156,79,157,175,157,15,158,185,158,67,159,36,250,0,0,0,0,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,46,78,187,79,202,80,234,81,40,83,197,84,25,86,33,87,78,88,89,89,113,90,103,91,194,92,174,93,217,94,35,96,90,97,98,98,215,99,236,100,5,102,26,103,117,104,115,105,107,106,65,107,115,108,226,109,255,110,245,111,243,112,228,113,211,228,51,229,147,229,243,229,83,230,179,230,19,231,21,34,157,51,249,114,128,115,8,116,143,116,5,117,162,117,85,118,225,118,114,119,252,119,157,120,27,121,161,121,45,122,182,122,66,123,215,123,81,124,211,124,68,125,167,125,8,126,107,126,108,127,248,127,149,128,87,129,225,129,131,130,85,131,2,132,145,132,18,133,147,133,9,134,134,134,47,135,185,135,49,136,189,136,71,137,175,137,43,138,144,138,241,138,83,139,72,140,187,140,27,141,240,141,134,142,242,142,82,143,50,144,217,144,96,145,243,145,83,146,182,146,23,147,121,147,220,147,60,148,120,149,217,149,161,150,49,151,176,151,28,152,169,152,23,153,166,153,7,154,103,154,23,155,137,155,233,155,73,156,240,156,80,157,176,157,16,158,186,158,69,159,39,250,0,0,0,0,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,47,78,188,79,203,80,236,81,41,83,202,84,26,86,34,87,79,88,91,89,114,90,104,91,195,92,175,93,218,94,36,96,91,97,100,98,216,99,237,100,7,102,28,103,120,104,116,105,108,106,66,107,117,108,227,109,0,111,246,111,244,112,230,113,212,228,52,229,148,229,244,229,84,230,180,230,20,231,31,34,158,51,253,114,129,115,11,116,145,116,6,117,166,117,87,118,226,118,115,119,3,120,158,120,28,121,162,121,46,122,183,122,67,123,216,123,82,124,212,124,69,125,168,125,9,126,108,126,109,127,249,127,151,128,88,129,226,129,133,130,86,131,5,132,146,132,20,133,148,133,10,134,135,134,48,135,187,135,51,136,190,136,72,137,176,137,44,138,145,138,242,138,84,139,74,140,188,140,28,141,241,141,136,142,243,142,83,143,51,144,218,144,102,145,244,145,84,146,183,146,24,147,122,147,221,147,61,148,121,149,218,149,162,150,51,151,177,151,29,152,170,152,24,153,167,153,8,154,104,154,24,155,138,155,234,155,74,156,241,156,81,157,177,157,17,158,188,158,70,159,40,250,0,0,0,0,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,49,78,189,79,204,80,238,81,43,83,203,84,28,86,36,87,80,88,92,89,115,90,107,91,197,92,176,93,220,94,44,96,92,97,101,98,217,99,238,100,8,102,30,103,121,104,117,105,109,106,68,107,119,108,229,109,1,111,247,111,245,112,232,113,213,228,53,229,149,229,245,229,85,230,181,230,21,231,35,34,161,51,254,114,130,115,12,116,146,116,7,117,167,117,88,118,227,118,116,119,4,120,160,120,29,121,163,121,47,122,184,122,68,123,219,123,83,124,216,124,70,125,169,125,10,126,109,126,111,127,250,127,153,128,91,129,228,129,134,130,87,131,7,132,147,132,21,133,149,133,11,134,136,134,50,135,188,135,52,136,191,136,73,137,177,137,45,138,146,138,243,138,85,139,75,140,189,140,32,141,242,141,137,142,244,142,84,143,52,144,222,144,103,145,245,145,85,146,184,146,25,147,123,147,222,147,63,148,122,149,219,149,163,150,52,151,179,151,30,152,171,152,25,153,169,153,9,154,105,154,25,155,139,155,235,155,75,156,242,156,82,157,178,157,18,158,191,158,71,159,41,250,0,0,0,0,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,51,78,190,79,205,80,241,81,44,83,214,84,29,86,37,87,82,88,93,89,120,90,109,91,198,92,177,93,221,94,45,96,94,97,104,98,218,99,239,100,9,102,32,103,122,104,118,105,110,106,69,107,120,108,231,109,3,111,248,111,246,112,233,113,214,228,54,229,150,229,246,229,86,230,182,230,22,231,82,34,196,51,255,114,131,115,13,116,147,116,8,117,168,117,89,118,228,118,117,119,5,120,162,120,31,121,164,121,48,122,185,122,70,123,220,123,84,124,218,124,71,125,170,125,11,126,110,126,112,127,253,127,158,128,92,129,229,129,135,130,88,131,8,132,148,132,22,133,150,133,12,134,137,134,51,135,190,135,53,136,192,136,74,137,178,137,46,138,148,138,244,138,86,139,77,140,190,140,81,141,244,141,138,142,245,142,85,143,55,144,223,144,104,145,246,145,86,146,185,146,26,147,124,147,223,147,64,148,123,149,220,149,164,150,53,151,181,151,31,152,172,152,26,153,170,153,10,154,106,154,26,155,140,155,236,155,76,156,243,156,83,157,179,157,19,158,192,158,72,159,21,232,0,0,0,0,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,53,78,192,79,206,80,242,81,45,83,216,84,32,86,38,87,83,88,94,89,121,90,110,91,199,92,178,93,222,94,46,96,95,97,113,98,219,99,240,100,11,102,33,103,123,104,122,105,111,106,72,107,122,108,232,109,4,111,249,111,248,112,234,113,215,228,55,229,151,229,247,229,87,230,183,230,23,231,102,34,206,51,0,115,133,115,14,116,148,116,9,117,169,117,90,118,230,118,118,119,6,120,164,120,32,121,165,121,49,122,186,122,72,123,222,123,85,124,219,124,72,125,171,125,12,126,111,126,115,127,254,127,163,128,93,129,230,129,137,130,89,131,9,132,149,132,24,133,151,133,13,134,142,134,53,135,191,135,54,136,195,136,75,137,179,137,47,138,149,138,245,138,87,139,78,140,191,140,82,141,246,141,139,142,246,142,86,143,57,144,224,144,107,145,247,145,87,146,186,146,27,147,125,147,224,147,65,148,124,149,221,149,165,150,54,151,182,151,32,152,173,152,27,153,171,153,11,154,107,154,27,155,141,155,237,155,77,156,244,156,84,157,180,157,20,158,193,158,73,159,22,232,0,0,0,0,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,55,78,193,79,208,80,244,81,47,83,219,84,33,86,39,87,85,88,95,89,123,90,111,91,200,92,179,93,223,94,48,96,96,97,114,98,220,99,241,100,13,102,34,103,124,104,123,105,112,106,74,107,123,108,233,109,5,111,250,111,250,112,235,113,216,228,56,229,152,229,248,229,88,230,184,230,24,231,103,34,209,51,2,115,134,115,17,116,149,116,10,117,170,117,91,118,231,118,119,119,7,120,166,120,33,121,166,121,50,122,187,122,74,123,223,123,86,124,221,124,73,125,172,125,13,126,112,126,117,127,255,127,166,128,94,129,232,129,140,130,93,131,10,132,150,132,25,133,152,133,14,134,143,134,54,135,193,135,55,136,196,136,76,137,180,137,48,138,150,138,246,138,88,139,79,140,192,140,87,141,252,141,140,142,247,142,87,143,58,144,227,144,109,145,248,145,88,146,187,146,28,147,126,147,225,147,66,148,125,149,222,149,166,150,55,151,183,151,33,152,174,152,28,153,172,153,12,154,114,154,28,155,142,155,238,155,78,156,245,156,85,157,181,157,21,158,194,158,74,159,23,232,0,0,0,0,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,60,78,194,79,209,80,247,81,48,83,224,84,34,86,43,87,86,88,97,89,124,90,114,91,201,92,180,93,224,94,49,96,97,97,116,98,221,99,242,100,16,102,35,103,125,104,125,105,114,106,75,107,124,108,234,109,7,111,251,111,251,112,236,113,217,228,57,229,153,229,249,229,89,230,185,230,25,231,191,34,210,51,4,115,136,115,18,116,150,116,11,117,173,117,93,118,232,118,120,119,8,120,168,120,34,121,168,121,52,122,188,122,77,123,224,123,87,124,222,124,74,125,173,125,14,126,113,126,118,127,2,128,167,128,95,129,233,129,144,130,98,131,16,132,152,132,27,133,153,133,15,134,144,134,56,135,194,135,56,136,199,136,77,137,181,137,49,138,151,138,247,138,89,139,80,140,193,140,95,141,254,141,141,142,248,142,88,143,61,144,228,144,115,145,249,145,89,146,188,146,29,147,127,147,226,147,67,148,126,149,223,149,168,150,58,151,184,151,34,152,175,152,29,153,173,153,13,154,131,154,29,155,143,155,239,155,79,156,246,156,86,157,182,157,22,158,195,158,75,159,24,232,0,0,0,0,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,64,78,198,79,210,80,254,81,49,83,225,84,37,86,49,87,87,88,99,89,125,90,116,91,202,92,181,93,225,94,50,96,99,97,117,98,223,99,243,100,17,102,36,103,126,104,126,105,115,106,77,107,127,108,237,109,8,111,252,111,252,112,237,113,218,228,58,229,154,229,250,229,90,230,186,230,26,231,80,37,213,51,5,115,138,115,19,116,151,116,12,117,182,117,95,118,233,118,122,119,10,120,169,120,35,121,169,121,53,122,189,122,78,123,226,123,88,124,225,124,75,125,175,125,15,126,114,126,119,127,7,128,168,128,97,129,235,129,147,130,112,131,18,132,154,132,28,133,154,133,16,134,145,134,57,135,195,135,58,136,200,136,78,137,182,137,50,138,152,138,248,138,90,139,81,140,194,140,101,141,255,141,142,142,249,142,89,143,63,144,229,144,122,145,250,145,90,146,189,146,30,147,128,147,227,147,68,148,128,149,224,149,169,150,59,151,185,151,35,152,176,152,30,153,174,153,14,154,137,154,30,155,144,155,240,155,80,156,247,156,87,157,183,157,23,158,197,158,76,159,25,232,0,0,0,0,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,65,78,199,79,211,80,4,82,50,83,226,84,38,86,50,87,89,88,100,89,126,90,118,91,204,92,182,93,226,94,51,96,100,97,119,98,226,99,244,100,18,102,37,103,127,104,127,105,116,106,78,107,128,108,239,109,10,111,253,111,254,112,239,113,219,228,59,229,155,229,251,229,91,230,187,230,27,231,81,37,48,254,6,115,140,115,20,116,152,116,14,117,183,117,96,118,234,118,123,119,11,120,170,120,37,121,170,121,54,122,190,122,83,123,227,123,89,124,226,124,76,125,176,125,16,126,115,126,120,127,8,128,172,128,98,129,238,129,148,130,113,131,19,132,155,132,29,133,157,133,18,134,146,134,58,135,196,135,59,136,202,136,79,137,183,137,51,138,153,138,249,138,91,139,82,140,195,140,104,141,0,142,145,142,250,142,90,143,64,144,233,144,123,145,251,145,91,146,190,146,31,147,129,147,228,147,69,148,129,149,225,149,170,150,60,151,186,151,36,152,177,152,31,153,175,153,15,154,141,154,32,155,145,155,241,155,81,156,248,156,88,157,184,157,24,158,198,158,77,159,26,232,0,0,0,0,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,66,78,200,79,212,80,5,82,51,83,227,84,40,86,52,87,90,88,102,89,128,90,119,91,205,92,184,93,227,94,52,96,101,97,120,98,228,99,245,100,22,102,39,103,128,104,129,105,117,106,79,107,132,108,240,109,11,111,254,111,255,112,240,113,220,228,60,229,156,229,252,229,92,230,188,230,28,231,82,37,226,255,7,115,141,115,21,116,153,116,16,117,186,117,97,118,235,118,124,119,14,120,171,120,38,121,171,121,56,122,192,122,85,123,228,123,90,124,227,124,77,125,177,125,17,126,116,126,122,127,9,128,176,128,99,129,239,129,149,130,114,131,20,132,157,132,30,133,158,133,19,134,148,134,60,135,197,135,61,136,203,136,80,137,184,137,52,138,154,138,250,138,92,139,83,140,196,140,105,141,1,142,146,142,251,142,91,143,67,144,234,144,124,145,252,145,92,146,191,146,32,147,130,147,229,147,70,148,130,149,226,149,171,150,61,151,187,151,37,152,178,152,32,153,176,153,16,154,142,154,33,155,146,155,242,155,82,156,249,156,89,157,185,157,25,158,199,158,78,159,27,232,0,0,0,0,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,68,78,201,79,213,80,9,82,52,83,228,84,41,86,53,87,91,88,103,89,129,90,120,91,206,92,185,93,228,94,54,96,102,97,122,98,229,99,246,100,23,102,41,103,130,104,131,105,118,106,80,107,135,108,242,109,12,111,255,111,0,113,241,113,221,228,61,229,157,229,253,229,93,230,189,230,29,231,83,37,228,255,8,115,143,115,22,116,154,116,18,117,187,117,98,118,236,118,129,119,15,120,172,120,39,121,172,121,58,122,193,122,87,123,231,123,91,124,228,124,78,125,178,125,18,126,117,126,123,127,10,128,179,128,100,129,240,129,150,130,115,131,21,132,158,132,32,133,159,133,20,134,150,134,61,135,199,135,62,136,204,136,81,137,185,137,53,138,155,138,251,138,93,139,84,140,197,140,106,141,2,142,147,142,252,142,92,143,69,144,236,144,128,145,253,145,93,146,192,146,33,147,131,147,230,147,71,148,131,149,227,149,172,150,63,151,188,151,38,152,179,152,33,153,177,153,17,154,148,154,34,155,147,155,243,155,83,156,250,156,90,157,186,157,26,158,200,158,79,159,28,232,0,0,0,0,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,70,78,203,79,215,80,11,82,53,83,235,84,42,86,54,87,92,88,104,89,130,90,121,91,207,92,186,93,229,94,55,96,105,97,123,98,230,99,247,100,24,102,46,103,132,104,133,105,119,106,81,107,138,108,244,109,13,111,0,112,1,113,242,113,222,228,62,229,158,229,254,229,94,230,190,230,30,231,84,37,226,231,9,115,144,115,23,116,155,116,20,117,191,117,100,118,237,118,130,119,16,120,173,120,40,121,173,121,62,122,194,122,89,123,232,123,92,124,229,124,79,125,179,125,19,126,118,126,124,127,14,128,181,128,102,129,241,129,154,130,116,131,22,132,159,132,34,133,160,133,21,134,151,134,64,135,200,135,63,136,205,136,82,137,186,137,54,138,156,138,252,138,94,139,86,140,198,140,108,141,3,142,149,142,253,142,93,143,70,144,238,144,129,145,254,145,94,146,193,146,34,147,132,147,231,147,72,148,132,149,228,149,173,150,64,151,189,151,39,152,180,152,34,153,178,153,18,154,149,154,36,155,148,155,244,155,84,156,251,156,91,157,187,157,27,158,202,158,82,159,29,232,0,0,0,0,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,74,78,204,79,216,80,12,82,54,83,236,84,43,86,55,87,93,88,105,89,131,90,123,91,208,92,187,93,230,94,56,96,106,97,125,98,231,99,248,100,26,102,48,103,135,104,138,105,120,106,82,107,139,108,245,109,14,111,1,112,2,113,243,113,223,228,63,229,159,229,255,229,95,230,191,230,31,231,85,37,33,33,11,115,146,115,24,116,157,116,21,117,192,117,101,118,240,118,131,119,19,120,174,120,41,121,174,121,64,122,195,122,92,123,233,123,93,124,230,124,80,125,180,125,20,126,119,126,125,127,15,128,182,128,104,129,242,129,155,130,117,131,23,132,160,132,35,133,161,133,23,134,152,134,65,135,201,135,65,136,207,136,83,137,187,137,55,138,157,138,253,138,95,139,87,140,199,140,110,141,4,142,150,142,254,142,94,143,72,144,240,144,130,145,255,145,95,146,194,146,35,147,133,147,232,147,73,148,133,149,229,149,174,150,65,151,190,151,40,152,181,152,35,153,179,153,19,154,153,154,37,155,149,155,245,155,85,156,252,156,92,157,188,157,28,158,203,158,83,159,30,232,0,0,0,0,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,81,78,205,79,217,80,15,82,55,83,239,84,46,86,56,87,95,88,106,89,132,90,124,91,209,92,188,93,231,94,57,96,107,97,129,98,232,99,249,100,27,102,50,103,136,104,139,105,122,106,83,107,141,108,246,109,16,111,2,112,3,113,244,113,224,228,64,229,160,229,0,230,96,230,192,230,32,231,86,37,49,50,12,115,147,115,25,116,159,116,22,117,193,117,102,118,243,118,134,119,21,120,175,120,42,121,175,121,65,122,196,122,94,123,235,123,94,124,231,124,81,125,181,125,21,126,120,126,127,127,17,128,184,128,106,129,245,129,158,130,118,131,25,132,162,132,36,133,162,133,24,134,153,134,66,135,204,135,66,136,208,136,84,137,188,137,56,138,158,138,254,138,96,139,88,140,200,140,111,141,6,142,151,142,255,142,95,143,73,144,241,144,131,145,0,146,96,146,195,146,36,147,134,147,233,147,74,148,134,149,230,149,175,150,66,151,191,151,41,152,182,152,36,153,180,153,20,154,166,154,38,155,150,155,246,155,86,156,253,156,93,157,189,157,29,158,204,158,84,159,31,232,0,0,0,0,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,85,78,210,79,219,80,16,82,56,83,240,84,47,86,60,87,96,88,107,89,133,90,126,91,211,92,189,93,233,94,58,96,108,97,130,98,235,99,250,100,28,102,51,103,137,104,140,105,123,106,84,107,142,108,248,109,17,111,3,112,4,113,245,113,225,228,65,229,161,229,1,230,97,230,193,230,33,231,87,37,227,231,13,115,148,115,28,116,160,116,23,117,198,117,103,118,245,118,135,119,25,120,181,120,43,121,176,121,66,122,197,122,95,123,236,123,95,124,233,124,82,125,182,125,22,126,121,126,128,127,19,128,185,128,107,129,246,129,160,130,121,131,26,132,163,132,37,133,163,133,25,134,154,134,67,135,205,135,67,136,209,136,85,137,189,137,57,138,159,138,255,138,97,139,89,140,201,140,113,141,7,142,152,142,0,143,96,143,74,144,242,144,132,145,1,146,97,146,196,146,37,147,135,147,234,147,75,148,135,149,231,149,177,150,67,151,192,151,42,152,183,152,37,153,181,153,21,154,169,154,39,155,151,155,247,155,87,156,254,156,94,157,190,157,30,158,208,158,85,159,32,232,0,0,0,0,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,87,78,211,79,220,80,19,82,60,83,241,84,48,86,61,87,97,88,108,89,134,90,127,91,212,92,190,93,235,94,61,96,109,97,131,98,236,99,251,100,30,102,54,103,138,104,142,105,125,106,85,107,145,108,250,109,18,111,4,112,5,113,246,113,226,228,66,229,162,229,2,230,98,230,194,230,34,231,88,37,16,32,15,115,149,115,29,116,161,116,27,117,203,117,104,118,246,118,136,119,27,120,182,120,44,121,177,121,67,122,198,122,97,123,237,123,96,124,234,124,83,125,183,125,23,126,122,126,130,127,26,128,187,128,108,129,247,129,162,130,122,131,27,132,164,132,38,133,165,133,26,134,155,134,68,135,206,135,70,136,211,136,86,137,190,137,58,138,160,138,0,139,98,139,91,140,202,140,114,141,8,142,153,142,1,143,97,143,75,144,243,144,134,145,2,146,98,146,197,146,38,147,136,147,235,147,76,148,136,149,236,149,178,150,68,151,193,151,43,152,184,152,38,153,182,153,22,154,170,154,40,155,152,155,248,155,88,156,255,156,95,157,191,157,36,158,210,158,86,159,33,232,0,0,0,0,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,90,78,212,79,221,80,20,82,61,83,244,84,51,86,63,87,98,88,109,89,135,90,130,91,213,92,191,93,236,94,62,96,110,97,133,98,238,99,252,100,33,102,55,103,139,104,143,105,126,106,86,107,146,108,253,109,22,111,5,112,6,113,247,113,227,228,67,229,163,229,3,230,99,230,195,230,35,231,89,37,228,231,16,115,151,115,30,116,162,116,29,117,204,117,105,118,247,118,137,119,30,120,183,120,45,121,178,121,68,122,199,122,99,123,239,123,97,124,235,124,84,125,184,125,24,126,123,126,131,127,27,128,197,128,111,129,248,129,163,130,126,131,30,132,165,132,39,133,166,133,27,134,158,134,69,135,207,135,71,136,214,136,87,137,191,137,59,138,161,138,1,139,99,139,92,140,203,140,120,141,11,142,154,142,2,143,98,143,76,144,245,144,136,145,3,146,99,146,198,146,39,147,137,147,236,147,77,148,137,149,255,149,180,150,69,151,194,151,44,152,185,152,39,153,183,153,23,154,171,154,41,155,153,155,249,155,89,156,0,157,96,157,192,157,39,158,211,158,87,159,34,232,0,0,0,0,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,91,78,213,79,222,80,21,82,64,83,245,84,53,86,65,87,99,88,110,89,136,90,134,91,214,92,192,93,237,94,64,96,111,97,134,98,239,99,253,100,34,102,56,103,140,104,144,105,127,106,87,107,149,108,254,109,23,111,6,112,7,113,248,113,228,228,68,229,164,229,4,230,100,230,196,230,36,231,90,37,229,231,17,115,152,115,31,116,163,116,30,117,206,117,106,118,250,118,138,119,32,120,184,120,46,121,180,121,69,122,200,122,100,123,240,123,98,124,236,124,85,125,185,125,25,126,124,126,132,127,29,128,199,128,114,129,249,129,167,130,127,131,31,132,166,132,40,133,167,133,28,134,159,134,70,135,208,135,72,136,215,136,88,137,192,137,60,138,162,138,2,139,100,139,93,140,204,140,121,141,13,142,155,142,3,143,99,143,78,144,246,144,138,145,4,146,100,146,199,146,40,147,138,147,237,147,78,148,138,149,7,150,181,150,70,151,195,151,45,152,186,152,40,153,184,153,24,154,172,154,42,155,154,155,250,155,90,156,1,157,97,157,193,157,46,158,213,158,88,159,35,232,0,0,0,0,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,98,78,214,79,223,80,28,82,66,83,246,84,55,86,67,87,100,88,111,89,137,90,138,91,215,92,193,93,238,94,68,96,113,97,135,98,240,99,254,100,35,102,57,103,141,104,145,105,129,106,88,107,150,108,255,109,24,111,7,112,8,113,250,113,229,228,69,229,165,229,5,230,101,230,197,230,37,231,91,37,230,231,18,115,153,115,32,116,164,116,32,117,207,117,108,118,251,118,139,119,33,120,186,120,47,121,181,121,71,122,201,122,101,123,242,123,99,124,237,124,86,125,186,125,26,126,125,126,133,127,30,128,200,128,115,129,250,129,178,130,128,131,32,132,167,132,41,133,169,133,29,134,160,134,74,135,212,135,73,136,218,136,89,137,195,137,61,138,163,138,3,139,101,139,94,140,205,140,122,141,14,142,157,142,4,143,100,143,84,144,247,144,142,145,5,146,101,146,201,146,41,147,139,147,238,147,79,148,139,149,19,150,183,150,71,151,196,151,46,152,187,152,41,153,185,153,25,154,173,154,43,155,155,155,251,155,91,156,2,157,98,157,194,157,48,158,214,158,89,159,36,232,0,0,0,0,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,99,78,217,79,224,80,30,82,68,83,247,84,56,86,68,87,102,88,112,89,138,90,141,91,216,92,194,93,239,94,69,96,114,97,136,98,241,99,255,100,36,102,59,103,142,104,146,105,130,106,90,107,151,108,0,110,25,111,8,112,11,113,251,113,230,228,70,229,166,229,6,230,102,230,198,230,38,231,92,37,252,48,20,115,154,115,33,116,165,116,33,117,208,117,109,118,253,118,143,119,34,120,187,120,48,121,182,121,72,122,202,122,102,123,243,123,100,124,238,124,87,125,187,125,27,126,126,126,134,127,31,128,201,128,117,129,253,129,181,130,129,131,33,132,168,132,42,133,171,133,30,134,161,134,75,135,213,135,74,136,219,136,90,137,205,137,63,138,164,138,4,139,103,139,95,140,206,140,123,141,16,142,159,142,5,143,101,143,85,144,249,144,143,145,6,146,102,146,202,146,42,147,140,147,239,147,80,148,140,149,24,150,184,150,72,151,197,151,47,152,188,152,42,153,186,153,26,154,174,154,44,155,156,155,252,155,92,156,3,157,99,157,195,157,52,158,215,158,90,159,37,232,0,0,0,0,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,100,78,219,79,225,80,31,82,70,83,248,84,58,86,69,87,103,88,113,89,139,90,142,91,218,92,195,93,240,94,70,96,115,97,139,98,243,99,1,101,38,102,60,103,144,104,147,105,131,106,91,107,152,108,1,110,26,111,9,112,12,113,252,113,231,228,71,229,167,229,7,230,103,230,199,230,39,231,93,37,155,48,24,115,156,115,35,116,166,116,34,117,209,117,110,118,255,118,144,119,36,120,188,120,49,121,183,121,73,122,204,122,103,123,244,123,101,124,240,124,88,125,188,125,28,126,127,126,135,127,33,128,202,128,118,129,255,129,182,130,130,131,34,132,169,132,45,133,172,133,31,134,162,134,77,135,214,135,75,136,220,136,91,137,211,137,64,138,165,138,5,139,104,139,96,140,207,140,124,141,17,142,160,142,6,143,106,143,86,144,250,144,147,145,7,146,103,146,203,146,43,147,141,147,240,147,81,148,141,149,27,150,186,150,73,151,198,151,48,152,189,152,43,153,187,153,27,154,175,154,45,155,157,155,253,155,93,156,4,157,100,157,196,157,59,158,217,158,91,159,38,232,0,0,0,0,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,101,78,224,79,226,80,33,82,75,83,249,84,60,86,70,87,104,88,114,89,140,90,144,91,219,92,196,93,241,94,71,96,116,97,140,98,245,99,2,101,41,102,62,103,145,104,150,105,133,106,92,107,154,108,2,110,27,111,10,112,13,113,253,113,232,228,72,229,168,229,8,230,104,230,200,230,40,231,94,37,156,48,25,115,157,115,36,116,170,116,35,117,211,117,112,118,0,119,147,119,40,120,189,120,50,121,184,121,74,122,205,122,104,123,245,123,102,124,241,124,89,125,189,125,29,126,128,126,136,127,35,128,203,128,119,129,3,130,186,130,131,131,35,132,170,132,46,133,173,133,32,134,165,134,79,135,215,135,78,136,221,136,92,137,212,137,65,138,166,138,6,139,105,139,99,140,208,140,125,141,18,142,161,142,7,143,128,143,89,144,251,144,148,145,8,146,104,146,204,146,44,147,142,147,241,147,82,148,142,149,30,150,187,150,74,151,199,151,49,152,190,152,44,153,188,153,28,154,178,154,46,155,158,155,254,155,94,156,5,157,101,157,197,157,60,158,218,158,92,159,39,232,0,0,0,0,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,103,78,226,79,227,80,34,82,76,83,251,84,61,86,72,87,105,88,117,89,141,90,145,91,220,92,198,93,242,94,72,96,118,97,141,98,247,99,3,101,42,102,63,103,146,104,151,105,134,106,93,107,156,108,3,110,28,111,11,112,14,113,254,113,233,228,73,229,169,229,9,230,105,230,201,230,41,231,95,37,253,48,26,115,158,115,39,116,171,116,36,117,215,117,113,118,2,119,148,119,42,120,191,120,51,121,188,121,75,122,206,122,105,123,246,123,103,124,242,124,90,125,190,125,30,126,129,126,137,127,36,128,207,128,120,129,7,130,187,130,132,131,41,132,171,132,47,133,177,133,33,134,166,134,80,135,216,135,79,136,222,136,93,137,213,137,66,138,167,138,8,139,106,139,100,140,209,140,126,141,19,142,162,142,8,143,140,143,90,144,252,144,149,145,9,146,105,146,205,146,45,147,144,147,242,147,83,148,143,149,32,150,191,150,75,151,200,151,50,152,191,152,45,153,189,153,29,154,179,154,48,155,159,155,255,155,95,156,6,157,102,157,198,157,64,158,222,158,93,159,40,232,0,0,0,0,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,104,78,228,79,228,80,35,82,77,83,254,84,62,86,73,87,106,88,119,89,142,90,146,91,221,92,199,93,243,94,73,96,120,97,142,98,249,99,4,101,43,102,65,103,148,104,153,105,135,106,94,107,157,108,4,110,29,111,12,112,15,113,255,113,234,228,74,229,170,229,10,230,106,230,202,230,42,231,96,37,254,48,31,115,160,115,41,116,172,116,38,117,217,117,114,118,3,119,149,119,43,120,192,120,53,121,191,121,76,122,207,122,106,123,248,123,104,124,243,124,91,125,191,125,31,126,131,126,139,127,43,128,208,128,129,129,8,130,188,130,135,131,42,132,172,132,48,133,178,133,34,134,171,134,81,135,217,135,80,136,224,136,96,137,215,137,67,138,168,138,9,139,107,139,101,140,210,140,127,141,21,142,163,142,9,143,146,143,92,144,255,144,150,145,10,146,106,146,206,146,46,147,145,147,243,147,84,148,144,149,35,150,194,150,76,151,201,151,51,152,192,152,47,153,190,153,30,154,180,154,49,155,160,155,0,156,96,156,7,157,103,157,199,157,77,158,225,158,94,159,41,232,0,0,0,0,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,106,78,229,79,229,80,37,82,80,83,0,85,64,86,75,87,109,88,122,89,143,90,148,91,222,92,200,93,245,94,74,96,121,97,143,98,250,99,5,101,44,102,68,103,149,104,154,105,136,106,95,107,158,108,6,110,30,111,13,112,17,113,0,114,235,228,75,229,171,229,11,230,107,230,203,230,43,231,97,37,6,48,32,115,161,115,43,116,173,116,39,117,218,117,115,118,5,119,150,119,46,120,194,120,54,121,194,121,77,122,208,122,107,123,249,123,105,124,244,124,92,125,192,125,32,126,132,126,141,127,44,128,209,128,131,129,9,130,191,130,136,131,43,132,173,132,49,133,179,133,35,134,173,134,82,135,218,135,81,136,225,136,97,137,216,137,68,138,169,138,10,139,109,139,102,140,211,140,128,141,22,142,164,142,10,143,157,143,93,144,0,145,151,145,11,146,107,146,207,146,47,147,146,147,244,147,85,148,145,149,36,150,195,150,77,151,202,151,52,152,193,152,48,153,191,153,31,154,181,154,51,155,161,155,1,156,97,156,8,157,104,157,200,157,80,158,227,158,95,159,42,232,0,0,0,0,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,107,78,231,79,232,80,38,82,84,83,2,85,65,86,82,87,110,88,123,89,144,90,150,91,223,92,201,93,248,94,76,96,122,97,144,98,251,99,6,101,46,102,69,103,150,104,157,105,137,106,96,107,160,108,7,110,31,111,14,112,18,113,1,114,236,228,76,229,172,229,12,230,108,230,204,230,44,231,98,37,157,48,35,115,163,115,45,116,174,116,42,117,220,117,116,118,6,119,151,119,47,120,195,120,55,121,196,121,78,122,209,122,108,123,250,123,106,124,245,124,93,125,193,125,33,126,133,126,143,127,45,128,210,128,132,129,10,130,192,130,138,131,44,132,174,132,50,133,180,133,36,134,174,134,84,135,220,135,82,136,230,136,98,137,217,137,69,138,170,138,11,139,110,139,103,140,212,140,130,141,23,142,165,142,11,143,160,143,94,144,1,145,152,145,12,146,108,146,208,146,48,147,147,147,245,147,86,148,146,149,37,150,200,150,78,151,203,151,53,152,194,152,49,153,192,153,32,154,185,154,52,155,162,155,2,156,98,156,9,157,105,157,201,157,82,158,228,158,96,159,43,232,0,0,0,0,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,108,78,235,79,233,80,39,82,88,83,3,85,66,86,83,87,111,88,124,89,145,90,159,91,224,92,202,93,249,94,78,96,123,97,148,98,252,99,7,101,48,102,71,103,152,104,158,105,138,106,97,107,162,108,8,110,33,111,15,112,20,113,2,114,237,228,77,229,173,229,13,230,109,230,205,230,45,231,99,37,158,48,36,115,164,115,47,116,175,116,46,117,221,117,117,118,10,119,152,119,49,120,196,120,56,121,197,121,79,122,210,122,109,123,251,123,107,124,246,124,94,125,194,125,34,126,134,126,144,127,46,128,211,128,133,129,11,130,194,130,139,131,45,132,176,132,51,133,181,133,37,134,178,134,85,135,221,135,83,136,231,136,99,137,219,137,70,138,171,138,12,139,111,139,104,140,213,140,131,141,24,142,166,142,12,143,161,143,95,144,3,145,153,145,13,146,109,146,209,146,49,147,148,147,246,147,87,148,147,149,38,150,202,150,79,151,204,151,54,152,195,152,50,153,193,153,33,154,187,154,53,155,163,155,3,156,99,156,10,157,106,157,202,157,83,158,230,158,97,159,44,232,0,0,0,0,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,109,78,236,79,234,80,42,82,89,83,4,85,67,86,84,87,112,88,126,89,147,90,167,91,226,92,203,93,251,94,79,96,124,97,153,98,254,99,8,101,50,102,74,103,153,104,159,105,139,106,104,107,168,108,9,110,34,111,16,112,23,113,3,114,238,228,78,229,174,229,14,230,110,230,206,230,46,231,100,37,73,254,38,115,165,115,49,116,176,116,52,117,223,117,118,118,12,119,153,119,50,120,198,120,57,121,199,121,80,122,211,122,111,123,253,123,108,124,247,124,95,125,195,125,35,126,135,126,145,127,47,128,212,128,134,129,14,130,195,130,140,131,46,132,177,132,52,133,182,133,38,134,179,134,86,135,222,135,85,136,233,136,100,137,221,137,71,138,172,138,13,139,112,139,105,140,214,140,134,141,25,142,167,142,13,143,162,143,96,144,5,145,156,145,14,146,110,146,210,146,50,147,149,147,247,147,88,148,148,149,39,150,203,150,80,151,205,151,55,152,196,152,51,153,194,153,34,154,189,154,54,155,164,155,4,156,100,156,11,157,107,157,203,157,84,158,232,158,98,159,45,232,0,0,0,0,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,110,78,240,79,235,80,44,82,91,83,5,85,68,86,85,87,113,88,127,89,148,90,168,91,227,92,204,93,252,94,81,96,125,97,156,98,3,100,10,101,51,102,75,103,154,104,160,105,140,106,105,107,172,108,11,110,35,111,18,112,27,113,4,114,239,228,79,229,175,229,15,230,111,230,207,230,47,231,101,37,74,254,39,115,166,115,50,116,177,116,54,117,224,117,119,118,14,119,154,119,51,120,199,120,61,121,200,121,82,122,212,122,112,123,255,123,109,124,249,124,96,125,196,125,36,126,136,126,146,127,48,128,213,128,135,129,15,130,197,130,141,131,47,132,179,132,53,133,184,133,40,134,183,134,88,135,223,135,86,136,234,136,101,137,223,137,73,138,173,138,14,139,113,139,108,140,215,140,135,141,26,142,168,142,14,143,164,143,97,144,6,145,157,145,15,146,111,146,211,146,51,147,150,147,248,147,89,148,149,149,40,150,208,150,81,151,206,151,56,152,197,152,52,153,195,153,35,154,190,154,55,155,165,155,5,156,101,156,12,157,108,157,204,157,86,158,235,158,99,159,46,232,0,0,0,0,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,111,78,242,79,239,80,47,82,93,83,8,85,69,86,86,87,114,88,128,89,149,90,169,91,231,92,206,93,253,94,83,96,126,97,157,98,4,100,11,101,55,102,77,103,155,104,161,105,141,106,107,107,175,108,15,110,37,111,19,112,28,113,5,114,240,228,80,229,176,229,16,230,112,230,208,230,48,231,102,37,75,254,40,115,167,115,55,116,178,116,57,117,225,117,121,118,15,119,155,119,53,120,200,120,63,121,202,121,83,122,213,122,115,123,0,124,110,124,250,124,97,125,197,125,37,126,137,126,147,127,50,128,216,128,137,129,17,130,198,130,143,131,48,132,181,132,54,133,186,133,42,134,184,134,90,135,225,135,88,136,235,136,103,137,224,137,74,138,174,138,15,139,114,139,109,140,216,140,136,141,27,142,169,142,15,143,165,143,100,144,7,145,158,145,16,146,112,146,212,146,52,147,151,147,249,147,90,148,150,149,41,150,209,150,84,151,207,151,57,152,198,152,53,153,196,153,36,154,191,154,56,155,166,155,6,156,102,156,13,157,109,157,205,157,89,158,236,158,100,159,47,232,0,0,0,0,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,114,78,244,79,240,80,49,82,101,83,10,85,70,86,88,87,115,88,133,89,150,90,172,91,233,92,207,93,5,95,84,96,127,97,158,98,6,100,12,101,56,102,82,103,156,104,162,105,143,106,108,107,176,108,18,110,38,111,20,112,29,113,7,114,241,228,81,229,177,229,17,230,113,230,209,230,49,231,103,37,76,254,45,115,168,115,56,116,179,116,60,117,229,117,122,118,16,119,156,119,54,120,204,120,66,121,204,121,84,122,215,122,116,123,1,124,111,124,252,124,98,125,198,125,38,126,138,126,149,127,52,128,223,128,139,129,19,130,201,130,144,131,50,132,182,132,62,133,187,133,43,134,185,134,91,135,226,135,90,136,236,136,104,137,225,137,75,138,175,138,16,139,115,139,110,140,217,140,137,141,28,142,170,142,16,143,166,143,102,144,8,145,159,145,17,146,113,146,213,146,53,147,152,147,250,147,91,148,151,149,43,150,211,150,85,151,208,151,58,152,199,152,54,153,197,153,37,154,195,154,57,155,167,155,7,156,103,156,14,157,110,157,206,157,93,158,237,158,101,159,48,232,0,0,0,0,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,116,78,245,79,241,80,50,82,104,83,11,85,71,86,89,87,116,88,137,89,151,90,173,91,235,92,208,93,6,95,86,96,128,97,163,98,7,100,13,101,57,102,84,103,157,104,163,105,146,106,109,107,180,108,19,110,39,111,21,112,30,113,8,114,242,228,82,229,178,229,18,230,114,230,210,230,50,231,104,37,77,254,47,115,170,115,57,116,180,116,61,117,233,117,124,118,17,119,157,119,61,120,205,120,67,121,206,121,85,122,216,122,118,123,2,124,112,124,253,124,99,125,199,125,39,126,139,126,150,127,57,128,224,128,140,129,21,130,208,130,145,131,51,132,183,132,63,133,188,133,44,134,187,134,92,135,227,135,91,136,237,136,105,137,226,137,76,138,176,138,17,139,116,139,111,140,218,140,140,141,32,142,173,142,17,143,167,143,103,144,9,145,160,145,18,146,114,146,214,146,54,147,153,147,251,147,92,148,152,149,44,150,212,150,87,151,209,151,59,152,200,152,55,153,198,153,38,154,196,154,58,155,168,155,8,156,104,156,15,157,111,157,207,157,95,158,238,158,102,159,49,232,0,0,0,0,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,117,78,246,79,242,80,52,82,106,83,12,85,72,86,98,87,117,88,139,89,152,90,174,91,236,92,209,93,7,95,87,96,129,97,166,98,8,100,14,101,58,102,85,103,158,104,164,105,147,106,110,107,181,108,21,110,40,111,22,112,31,113,9,114,243,228,83,229,179,229,19,230,115,230,211,230,51,231,105,37,78,254,48,115,172,115,58,116,181,116,63,117,236,117,127,118,18,119,158,119,63,120,206,120,68,121,207,121,86,122,218,122,120,123,3,124,113,124,254,124,100,125,200,125,40,126,140,126,151,127,58,128,226,128,141,129,22,130,214,130,148,131,52,132,187,132,64,133,189,133,45,134,188,134,93,135,228,135,92,136,238,136,106,137,228,137,77,138,177,138,18,139,117,139,112,140,219,140,141,141,33,142,174,142,18,143,170,143,105,144,10,145,161,145,19,146,115,146,215,146,55,147,154,147,252,147,93,148,153,149,45,150,214,150,88,151,210,151,60,152,201,152,56,153,199,153,39,154,198,154,61,155,169,155,9,156,105,156,16,157,112,157,208,157,96,158,240,158,103,159,50,232,0,0,0,0,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,118,78,247,79,244,80,53,82,108,83,13,85,73,86,99,87,118,88,140,89,153,90,175,91,238,92,210,93,9,95,88,96,130,97,167,98,9,100,15,101,59,102,87,103,159,104,165,105,148,106,111,107,182,108,24,110,44,111,23,112,32,113,10,114,244,228,84,229,180,229,20,230,116,230,212,230,52,231,106,37,79,254,50,115,173,115,59,116,182,116,65,117,237,117,128,118,19,119,161,119,65,120,207,120,69,121,208,121,88,122,219,122,122,123,4,124,114,124,255,124,101,125,201,125,41,126,141,126,152,127,60,128,227,128,142,129,23,130,217,130,149,131,53,132,188,132,65,133,190,133,46,134,189,134,94,135,230,135,93,136,239,136,107,137,231,137,78,138,178,138,19,139,118,139,113,140,220,140,142,141,36,142,176,142,19,143,172,143,106,144,11,145,164,145,20,146,117,146,216,146,56,147,155,147,253,147,94,148,154,149,47,150,215,150,90,151,211,151,61,152,202,152,57,153,200,153,40,154,199,154,62,155,170,155,10,156,106,156,17,157,113,157,209,157,97,158,241,158,104,159,51,232,0,0,0,0,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,119,78,249,79,246,80,60,82,109,83,14,85,74,86,101,87,119,88,142,89,156,90,177,91,239,92,211,93,12,95,91,96,131,97,169,98,10,100,16,101,61,102,88,103,160,104,166,105,149,106,112,107,183,108,25,110,46,111,24,112,33,113,11,114,245,228,85,229,181,229,21,230,117,230,213,230,53,231,107,37,80,254,51,115,177,115,61,116,183,116,66,117,238,117,129,118,20,119,163,119,66,120,209,120,71,121,211,121,89,122,220,122,124,123,5,124,117,124,0,125,102,125,202,125,42,126,142,126,153,127,62,128,230,128,144,129,24,130,218,130,150,131,54,132,190,132,66,133,191,133,47,134,190,134,95,135,231,135,94,136,242,136,108,137,232,137,79,138,179,138,20,139,119,139,114,140,221,140,143,141,37,142,177,142,20,143,173,143,107,144,12,145,165,145,21,146,118,146,217,146,57,147,156,147,254,147,95,148,155,149,48,150,216,150,92,151,212,151,62,152,203,152,58,153,201,153,41,154,200,154,63,155,171,155,11,156,107,156,18,157,114,157,210,157,98,158,242,158,105,159,52,232,0,0,0,0,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,120,78,251,79,247,80,62,82,114,83,18,85,75,86,103,87,120,88,143,89,157,90,178,91,241,92,212,93,13,95,92,96,132,97,170,98,13,100,17,101,63,102,89,103,161,104,169,105,150,106,113,107,186,108,27,110,48,111,25,112,34,113,12,114,246,228,86,229,182,229,22,230,118,230,214,230,54,231,108,37,81,254,53,115,180,115,62,116,184,116,67,117,239,117,131,118,21,119,164,119,67,120,210,120,74,121,212,121,90,122,221,122,125,123,6,124,118,124,1,125,103,125,203,125,43,126,143,126,155,127,64,128,238,128,146,129,25,130,221,130,151,131,55,132,192,132,68,133,192,133,48,134,191,134,97,135,232,135,95,136,245,136,109,137,233,137,80,138,180,138,21,139,120,139,116,140,222,140,144,141,38,142,179,142,21,143,174,143,108,144,13,145,166,145,22,146,119,146,218,146,58,147,157,147,255,147,96,148,156,149,55,150,217,150,93,151,213,151,63,152,204,152,59,153,202,153,42,154,201,154,64,155,172,155,12,156,108,156,19,157,115,157,211,157,101,158,243,158,106,159,53,232,0,0,0,0,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,121,78,252,79,248,80,68,82,118,83,19,85,79,86,108,87,121,88,144,89,158,90,183,91,242,92,213,93,14,95,94,96,133,97,173,98,14,100,19,101,64,102,90,103,163,104,170,105,152,106,114,107,192,108,28,110,50,111,28,112,35,113,13,114,247,228,87,229,183,229,23,230,119,230,215,230,55,231,109,37,82,254,54,115,181,115,63,116,185,116,68,117,242,117,133,118,22,119,166,119,68,120,211,120,75,121,214,121,91,122,225,122,127,123,8,124,119,124,2,125,104,125,204,125,44,126,144,126,156,127,65,128,245,128,147,129,26,130,226,130,153,131,57,132,194,132,69,133,194,133,49,134,193,134,98,135,233,135,96,136,246,136,110,137,234,137,81,138,181,138,22,139,121,139,117,140,223,140,146,141,39,142,180,142,22,143,175,143,111,144,14,145,167,145,23,146,120,146,219,146,59,147,158,147,0,148,97,148,157,149,56,150,218,150,95,151,214,151,64,152,205,152,60,153,203,153,43,154,202,154,70,155,173,155,13,156,109,156,20,157,116,157,212,157,110,158,244,158,107,159,54,232,0,0,0,0,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,122,78,253,79,249,80,69,82,121,83,21,85,80,86,110,87,122,88,145,89,159,90,186,91,243,92,214,93,16,95,95,96,134,97,174,98,17,100,20,101,66,102,91,103,164,104,172,105,153,106,115,107,193,108,30,110,52,111,29,112,36,113,14,114,248,228,88,229,184,229,24,230,120,230,216,230,56,231,110,37,84,254,58,115,182,115,64,116,187,116,70,117,243,117,137,118,23,119,168,119,70,120,214,120,76,121,215,121,92,122,226,122,129,123,9,124,120,124,3,125,105,125,205,125,45,126,145,126,160,127,68,128,247,128,148,129,29,130,231,130,154,131,58,132,195,132,70,133,195,133,50,134,194,134,102,135,235,135,102,136,247,136,111,137,236,137,82,138,182,138,23,139,122,139,118,140,224,140,147,141,40,142,181,142,23,143,178,143,112,144,15,145,168,145,24,146,121,146,220,146,60,147,159,147,1,148,98,148,158,149,57,150,219,150,99,151,215,151,65,152,207,152,61,153,204,153,44,154,205,154,74,155,174,155,14,156,110,156,21,157,117,157,213,157,111,158,245,158,108,159,55,232,0,0,0,0,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,123,78,255,79,250,80,70,82,123,83,22,85,81,86,112,87,123,88,148,89,160,90,187,91,244,92,215,93,18,95,96,96,135,97,175,98,18,100,21,101,68,102,93,103,165,104,174,105,154,106,116,107,194,108,31,110,53,111,30,112,37,113,15,114,249,228,89,229,185,229,25,230,121,230,217,230,57,231,111,37,85,254,59,115,184,115,66,116,188,116,71,117,245,117,138,118,24,119,171,119,72,120,215,120,77,121,217,121,93,122,228,122,130,123,10,124,121,124,4,125,106,125,206,125,46,126,146,126,162,127,69,128,249,128,149,129,32,130,232,130,157,131,59,132,197,132,71,133,196,133,51,134,195,134,103,135,236,135,103,136,250,136,112,137,237,137,83,138,183,138,24,139,123,139,119,140,225,140,149,141,43,142,182,142,24,143,179,143,113,144,16,145,169,145,25,146,122,146,221,146,61,147,160,147,2,148,99,148,159,149,58,150,220,150,100,151,216,151,66,152,208,152,62,153,205,153,45,154,206,154,75,155,175,155,15,156,111,156,22,157,118,157,214,157,114,158,246,158,109,159,56,232,0,0,0,0,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,124,78,0,80,252,80,71,82,124,83,23,85,82,86,113,87,124,88,149,89,161,90,188,91,245,92,216,93,20,95,97,96,136,97,176,98,21,100,22,101,69,102,98,103,169,104,175,105,155,106,117,107,195,108,34,110,55,111,31,112,39,113,16,114,250,228,90,229,186,229,26,230,122,230,218,230,58,231,112,37,86,254,60,115,185,115,67,116,189,116,73,117,246,117,140,118,27,119,173,119,73,120,216,120,78,121,218,121,94,122,231,122,131,123,13,124,122,124,5,125,107,125,207,125,47,126,147,126,163,127,71,128,251,128,150,129,36,130,233,130,159,131,62,132,198,132,75,133,197,133,52,134,197,134,104,135,237,135,106,136,251,136,113,137,238,137,84,138,184,138,25,139,124,139,123,140,226,140,150,141,45,142,183,142,25,143,180,143,114,144,17,145,171,145,26,146,123,146,222,146,63,147,161,147,3,148,100,148,160,149,62,150,221,150,102,151,217,151,67,152,212,152,63,153,206,153,46,154,207,154,76,155,176,155,16,156,112,156,23,157,119,157,215,157,116,158,247,158,110,159,57,232,0,0,0,0,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,125,78,1,80,253,80,72,82,125,83,24,85,83,86,114,87,125,88,152,89,162,90,192,91,246,92,217,93,22,95,101,96,137,97,178,98,22,100,23,101,70,102,99,103,170,104,176,105,156,106,118,107,198,108,38,110,56,111,32,112,40,113,17,114,251,228,91,229,187,229,27,230,123,230,219,230,59,231,113,37,87,254,61,115,188,115,68,116,190,116,74,117,247,117,141,118,28,119,174,119,74,120,218,120,79,121,219,121,95,122,232,122,132,123,14,124,126,124,6,125,108,125,208,125,48,126,148,126,165,127,72,128,254,128,151,129,37,130,234,130,161,131,63,132,199,132,76,133,198,133,53,134,200,134,105,135,239,135,109,136,253,136,114,137,240,137,85,138,185,138,26,139,125,139,124,140,227,140,151,141,48,142,184,142,26,143,181,143,115,144,18,145,172,145,27,146,124,146,223,146,64,147,162,147,4,148,101,148,161,149,65,150,222,150,103,151,218,151,68,152,214,152,64,153,207,153,47,154,208,154,78,155,177,155,17,156,113,156,24,157,120,157,216,157,117,158,248,158,111,159,58,232,0,0,0,0,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,127,78,2,80,254,80,73,82,126,83,25,85,85,86,116,87,127,88,154,89,163,90,193,91,247,92,218,93,25,95,102,96,138,97,179,98,23,100,25,101,71,102,100,103,171,104,178,105,157,106,119,107,199,108,39,110,57,111,33,112,41,113,18,114,252,228,92,229,188,229,28,230,124,230,220,230,60,231,114,37,89,254,64,115,189,115,69,116,191,116,77,117,248,117,143,118,29,119,175,119,75,120,219,120,80,121,220,121,96,122,233,122,134,123,16,124,127,124,7,125,109,125,209,125,49,126,149,126,166,127,73,128,255,128,153,129,38,130,236,130,162,131,64,132,200,132,77,133,199,133,54,134,204,134,106,135,240,135,111,136,255,136,115,137,241,137,86,138,186,138,27,139,126,139,125,140,228,140,152,141,50,142,185,142,27,143,183,143,118,144,19,145,176,145,28,146,125,146,224,146,65,147,163,147,5,148,102,148,162,149,67,150,223,150,104,151,219,151,69,152,215,152,65,153,208,153,48,154,210,154,80,155,178,155,18,156,114,156,25,157,121,157,217,157,118,158,250,158,112,159,59,232,0,0,0,0,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,128,78,3,80,255,80,75,82,128,83,26,85,86,86,117,87,130,88,155,89,164,90,195,91,248,92,220,93,26,95,110,96,140,97,180,98,24,100,26,101,72,102,102,103,172,104,179,105,158,106,120,107,200,108,40,110,58,111,34,112,42,113,19,114,253,228,93,229,189,229,29,230,125,230,221,230,61,231,115,37,90,254,65,115,190,115,70,116,192,116,80,117,250,117,144,118,30,119,177,119,77,120,220,120,81,121,221,121,97,122,234,122,135,123,17,124,128,124,8,125,111,125,210,125,50,126,150,126,168,127,78,128,0,129,154,129,39,130,237,130,163,131,65,132,203,132,78,133,200,133,55,134,205,134,107,135,241,135,113,136,0,137,116,137,242,137,87,138,187,138,28,139,127,139,126,140,229,140,153,141,51,142,187,142,28,143,184,143,119,144,20,145,177,145,29,146,126,146,225,146,66,147,164,147,6,148,103,148,163,149,74,150,225,150,106,151,220,151,70,152,219,152,66,153,209,153,49,154,212,154,82,155,179,155,19,156,115,156,26,157,122,157,218,157,119,158,253,158,113,159,60,232,0,0,0,0,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,129,78,4,80,0,81,78,82,129,83,28,85,90,86,120,87,132,88,156,89,165,90,200,91,249,92,223,93,28,95,113,96,141,97,182,98,25,100,27,101,73,102,103,103,174,104,181,105,159,106,122,107,203,108,42,110,59,111,36,112,43,113,20,114,254,228,94,229,190,229,30,230,126,230,222,230,62,231,129,37,91,254,66,115,191,115,71,116,193,116,81,117,251,117,146,118,33,119,178,119,79,120,221,120,82,121,222,121,98,122,235,122,136,123,18,124,129,124,9,125,112,125,211,125,51,126,151,126,169,127,79,128,1,129,158,129,41,130,238,130,164,131,66,132,204,132,79,133,202,133,57,134,210,134,108,135,242,135,115,136,1,137,117,137,244,137,88,138,188,138,29,139,128,139,127,140,230,140,154,141,52,142,188,142,29,143,186,143,120,144,21,145,178,145,30,146,127,146,226,146,67,147,165,147,7,148,104,148,164,149,78,150,226,150,107,151,221,151,71,152,220,152,67,153,210,153,50,154,213,154,83,155,180,155,20,156,116,156,27,157,123,157,219,157,120,158,255,158,114,159,61,232,0,0,0,0,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,130,78,5,80,1,81,79,82,131,83,29,85,91,86,121,87,134,88,157,89,166,90,201,91,250,92,224,93,29,95,114,96,143,97,183,98,26,100,28,101,74,102,107,103,177,104,182,105,161,106,125,107,205,108,44,110,60,111,37,112,44,113,21,114,255,228,95,229,191,229,31,230,127,230,223,230,63,231,130,37,92,254,67,115,193,115,72,116,194,116,82,117,253,117,148,118,35,119,180,119,81,120,222,120,84,121,224,121,99,122,236,122,137,123,19,124,130,124,11,125,113,125,212,125,52,126,152,126,170,127,80,128,3,129,159,129,46,130,240,130,165,131,67,132,206,132,80,133,203,133,58,134,211,134,109,135,243,135,116,136,3,137,118,137,245,137,89,138,189,138,30,139,129,139,128,140,231,140,155,141,54,142,189,142,30,143,187,143,121,144,22,145,179,145,31,146,128,146,227,146,68,147,166,147,8,148,105,148,165,149,79,150,227,150,108,151,222,151,72,152,221,152,68,153,211,153,51,154,214,154,85,155,181,155,21,156,117,156,28,157,124,157,220,157,121,158,0,159,115,159,62,232,0,0,0,0,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,131,78,6,80,2,81,82,82,135,83,30,85,93,86,122,87,135,88,159,89,167,90,202,91,252,92,227,93,30,95,116,96,144,97,184,98,29,100,29,101,77,102,108,103,178,104,184,105,162,106,126,107,206,108,46,110,61,111,38,112,45,113,22,114,0,229,96,229,192,229,32,230,128,230,224,230,64,231,131,37,93,254,68,115,195,115,73,116,195,116,83,117,254,117,149,118,36,119,182,119,83,120,223,120,85,121,225,121,100,122,238,122,138,123,20,124,131,124,12,125,114,125,213,125,53,126,153,126,171,127,81,128,4,129,160,129,50,130,242,130,166,131,68,132,207,132,81,133,204,133,59,134,213,134,111,135,244,135,117,136,4,137,119,137,246,137,90,138,190,138,31,139,130,139,129,140,232,140,156,141,55,142,190,142,31,143,188,143,122,144,23,145,182,145,32,146,129,146,228,146,69,147,167,147,9,148,106,148,166,149,81,150,228,150,109,151,223,151,73,152,224,152,69,153,212,153,52,154,215,154,86,155,182,155,22,156,118,156,29,157,125,157,221,157,122,158,1,159,116,159,63,232,0,0,0,0,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,132,78,7,80,3,81,83,82,136,83,31,85,94,86,125,87,136,88,160,89,168,90,203,91,253,92,228,93,33,95,117,96,145,97,186,98,31,100,30,101,78,102,110,103,180,104,185,105,163,106,127,107,207,108,48,110,63,111,39,112,46,113,23,114,1,229,97,229,193,229,33,230,129,230,225,230,65,231,132,37,94,254,69,115,196,115,74,116,196,116,85,117,2,118,151,118,37,119,183,119,84,120,224,120,88,121,226,121,101,122,240,122,139,123,21,124,132,124,13,125,115,125,214,125,54,126,154,126,172,127,83,128,5,129,161,129,58,130,243,130,167,131,69,132,210,132,82,133,205,133,61,134,214,134,113,135,245,135,118,136,5,137,120,137,247,137,91,138,191,138,32,139,131,139,131,140,233,140,157,141,56,142,191,142,32,143,191,143,123,144,24,145,183,145,33,146,130,146,229,146,70,147,168,147,10,148,108,148,167,149,82,150,229,150,110,151,224,151,74,152,225,152,70,153,213,153,53,154,217,154,87,155,183,155,23,156,119,156,30,157,126,157,222,157,123,158,2,159,117,159,64,232,0,0,0,0,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,133,78,8,80,4,81,85,82,138,83,33,85,95,86,126,87,138,88,161,89,169,90,205,91,254,92,234,93,34,95,119,96,146,97,190,98,34,100,31,101,80,102,113,103,182,104,186,105,164,106,128,107,209,108,49,110,64,111,40,112,50,113,24,114,2,229,98,229,194,229,34,230,130,230,226,230,66,231,133,37,95,254,70,115,197,115,75,116,197,116,86,117,4,118,152,118,39,119,184,119,88,120,225,120,89,121,229,121,102,122,241,122,140,123,23,124,133,124,14,125,116,125,215,125,55,126,156,126,173,127,85,128,7,129,162,129,60,130,245,130,172,131,71,132,212,132,83,133,206,133,62,134,215,134,114,135,246,135,120,136,6,137,121,137,248,137,92,138,192,138,33,139,132,139,132,140,234,140,158,141,59,142,192,142,33,143,192,143,124,144,26,145,184,145,34,146,131,146,230,146,71,147,169,147,11,148,109,148,168,149,83,150,230,150,111,151,225,151,75,152,226,152,71,153,214,153,54,154,218,154,88,155,184,155,24,156,120,156,31,157,127,157,223,157,124,158,3,159,118,159,65,232,0,0,0,0,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,135,78,9,80,5,81,87,82,142,83,37,85,96,86,127,87,139,88,162,89,171,90,206,91,255,92,236,93,35,95,126,96,147,97,192,98,35,100,32,101,81,102,116,103,183,104,188,105,165,106,133,107,210,108,51,110,65,111,41,112,51,113,25,114,3,229,99,229,195,229,35,230,131,230,227,230,67,231,134,37,96,254,71,115,198,115,76,116,198,116,87,117,6,118,154,118,42,119,185,119,89,120,226,120,97,121,232,121,103,122,242,122,142,123,24,124,134,124,15,125,117,125,216,125,56,126,157,126,174,127,86,128,8,129,164,129,61,130,246,130,173,131,72,132,213,132,84,133,209,133,63,134,218,134,115,135,247,135,121,136,7,137,122,137,249,137,93,138,193,138,34,139,133,139,134,140,235,140,160,141,60,142,193,142,34,143,195,143,126,144,27,145,185,145,35,146,132,146,231,146,72,147,170,147,12,148,110,148,169,149,86,150,231,150,112,151,226,151,76,152,227,152,72,153,215,153,55,154,219,154,89,155,185,155,25,156,121,156,32,157,128,157,224,157,125,158,4,159,119,159,66,232,0,0,0,0,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,138,78,10,80,8,81,88,82,143,83,38,85,97,86,128,87,140,88,166,89,172,90,207,91,0,93,237,93,36,95,128,96,149,97,193,98,36,100,33,101,88,102,118,103,184,104,189,105,166,106,136,107,216,108,53,110,66,111,42,112,52,113,26,114,4,229,100,229,196,229,36,230,132,230,228,230,68,231,135,37,97,254,72,115,199,115,77,116,199,116,88,117,7,118,155,118,43,119,186,119,90,120,227,120,99,121,234,121,104,122,243,122,143,123,25,124,135,124,16,125,118,125,217,125,57,126,158,126,177,127,87,128,11,129,165,129,63,130,248,130,174,131,73,132,215,132,85,133,210,133,64,134,220,134,117,135,248,135,122,136,8,137,124,137,250,137,94,138,194,138,35,139,134,139,135,140,236,140,161,141,62,142,194,142,35,143,198,143,129,144,28,145,187,145,36,146,133,146,232,146,73,147,171,147,13,148,111,148,170,149,87,150,235,150,113,151,227,151,77,152,228,152,73,153,216,153,56,154,220,154,90,155,186,155,26,156,122,156,33,157,129,157,225,157,128,158,5,159,120,159,67,232,0,0,0,0,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,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,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,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,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,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,172,32,144,78,11,80,9,81,89,82,144,83,40,85,99,86,129,87,141,88,167,89,173,90,209,91,1,93,240,93,40,95,129,96,150,97,195,98,37,100,34,101,89,102,120,103,185,104,190,105,167,106,140,107,217,108,54,110,67,111,43,112,53,113,27,114,5,229,101,229,197,229,37,230,133,230,229,230,69,231,136,37,98,254,73,115,203,115,78,116,200,116,93,117,8,118,156,118,44,119,188,119,91,120,228,120,100,121,236,121,105,122,244,122,145,123,26,124,136,124,17,125,120,125,218,125,58,126,174,126,179,127,89,128,12,129,167,129,64,130,250,130,175,131,74,132,216,132,87,133,212,133,65,134,221,134,119,135,250,135,123,136,9,137,125,137,251,137,95,138,195,138,36,139,135,139,136,140,237,140,162,141,63,142,195,142,36,143,201,143,132,144,29,145,188,145,37,146,134,146,233,146,74,147,172,147,14,148,112,148,171,149,88,150,236,150,114,151,228,151,78,152,229,152,74,153,217,153,57,154,221,154,91,155,187,155,27,156,123,156,34,157,130,157,226,157,129,158,6,159,121,159,68,232,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,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,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,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,150,78,14,80,10,81,90,82,145,83,41,85,101,86,135,87,142,88,172,89,174,90,212,91,4,93,245,93,43,95,130,96,151,97,203,98,39,100,35,101,91,102,121,103,186,104,191,105,168,106,142,107,218,108,55,110,68,111,44,112,55,113,28,114,6,229,102,229,198,229,38,230,134,230,230,230,70,231,137,37,99,254,74,115,204,115,79,116,201,116,94,117,9,118,157,118,46,119,190,119,92,120,229,120,102,121,238,121,106,122,245,122,146,123,27,124,138,124,18,125,121,125,219,125,60,126,180,126,180,127,91,128,21,129,169,129,65,130,252,130,181,131,75,132,217,132,88,133,214,133,66,134,224,134,120,135,251,135,124,136,11,137,126,137,252,137,96,138,196,138,37,139,136,139,139,140,238,140,164,141,67,142,196,142,37,143,202,143,133,144,31,145,189,145,38,146,135,146,234,146,75,147,173,147,15,148,113,148,172,149,89,150,237,150,117,151,229,151,79,152,230,152,75,153,218,153,58,154,222,154,92,155,188,155,28,156,125,156,35,157,131,157,227,157,131,158,7,159,122,159,69,232,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,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,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,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,151,78,16,80,12,81,91,82,146,83,43,85,102,86,136,87,143,88,173,89,175,90,213,91,5,93,246,93,44,95,133,96,152,97,207,98,40,100,36,101,92,102,122,103,187,104,192,105,170,106,143,107,220,108,57,110,69,111,45,112,56,113,30,114,7,229,103,229,199,229,39,230,135,230,231,230,71,231,138,37,100,254,75,115,206,115,80,116,202,116,95,117,11,118,158,118,48,119,192,119,94,120,230,120,105,121,241,121,107,122,246,122,147,123,28,124,139,124,19,125,122,125,220,125,61,126,187,126,181,127,92,128,23,129,171,129,66,130,253,130,187,131,76,132,218,132,90,133,215,133,67,134,225,134,121,135,252,135,128,136,12,137,128,137,253,137,97,138,197,138,39,139,137,139,141,140,239,140,165,141,69,142,197,142,38,143,203,143,134,144,32,145,190,145,39,146,136,146,235,146,76,147,174,147,16,148,114,148,173,149,90,150,238,150,119,151,232,151,80,152,233,152,76,153,219,153,59,154,224,154,93,155,189,155,29,156,126,156,36,157,132,157,228,157,132,158,8,159,123,159,70,232,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,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,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,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,153,78,17,80,13,81,93,82,147,83,45,85,103,86,137,87,144,88,176,89,176,90,214,91,8,93,248,93,46,95,134,96,153,97,209,98,41,100,38,101,93,102,123,103,188,104,194,105,173,106,144,107,221,108,59,110,72,111,46,112,57,113,31,114,8,229,104,229,200,229,40,230,136,230,232,230,72,231,139,37,101,254,76,115,210,115,81,116,203,116,96,117,13,118,159,118,49,119,193,119,95,120,231,120,106,121,242,121,108,122,247,122,150,123,29,124,140,124,20,125,123,125,221,125,62,126,188,126,182,127,93,128,25,129,172,129,67,130,254,130,190,131,77,132,219,132,91,133,216,133,68,134,226,134,122,135,253,135,131,136,13,137,130,137,254,137,98,138,198,138,40,139,138,139,142,140,240,140,166,141,70,142,198,142,39,143,204,143,135,144,33,145,191,145,40,146,137,146,236,146,77,147,175,147,17,148,115,148,174,149,92,150,240,150,120,151,238,151,81,152,234,152,77,153,220,153,60,154,226,154,94,155,190,155,30,156,128,156,37,157,133,157,229,157,133,158,9,159,124,159,71,232,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,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,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,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,156,78,19,80,14,81,95,82,148,83,50,85,109,86,138,87,145,88,177,89,177,90,215,91,9,93,249,93,48,95,135,96,154,97,213,98,43,100,39,101,94,102,125,103,189,104,195,105,174,106,145,107,223,108,60,110,73,111,47,112,58,113,32,114,9,229,105,229,201,229,41,230,137,230,233,230,73,231,140,37,102,254,78,115,211,115,82,116,204,116,97,117,14,118,160,118,50,119,194,119,96,120,233,120,107,121,243,121,109,122,248,122,152,123,30,124,141,124,21,125,124,125,222,125,63,126,214,126,183,127,94,128,27,129,173,129,69,130,255,130,191,131,78,132,220,132,92,133,217,133,69,134,227,134,127,135,255,135,134,136,14,137,132,137,255,137,99,138,199,138,41,139,139,139,143,140,241,140,167,141,76,142,199,142,40,143,205,143,137,144,36,145,192,145,41,146,138,146,237,146,78,147,176,147,18,148,116,148,175,149,93,150,241,150,121,151,239,151,82,152,235,152,78,153,221,153,61,154,227,154,95,155,191,155,31,156,131,156,38,157,134,157,230,157,134,158,10,159,125,159,72,232,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,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,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,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,157,78,21,80,15,81,96,82,150,83,52,85,110,86,141,87,148,88,179,89,180,90,216,91,10,93,250,93,50,95,136,96,155,97,221,98,46,100,40,101,96,102,128,103,190,104,196,105,175,106,148,107,228,108,61,110,74,111,48,112,59,113,33,114,10,229,106,229,202,229,42,230,138,230,234,230,74,231,141,37,104,254,79,115,212,115,83,116,205,116,98,117,15,118,161,118,51,119,195,119,97,120,234,120,108,121,244,121,110,122,251,122,153,123,32,124,142,124,22,125,125,125,223,125,64,126,228,126,186,127,95,128,28,129,174,129,70,130,0,131,194,131,79,132,222,132,93,133,218,133,70,134,229,134,128,135,0,136,135,136,15,137,133,137,1,138,100,138,200,138,42,139,140,139,144,140,242,140,168,141,77,142,200,142,41,143,207,143,138,144,37,145,193,145,42,146,139,146,238,146,79,147,177,147,19,148,117,148,176,149,94,150,242,150,122,151,240,151,83,152,236,152,79,153,222,153,62,154,228,154,96,155,192,155,32,156,132,156,39,157,135,157,231,157,137,158,12,159,126,159,73,232,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,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,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,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,158,78,22,80,16,81,98,82,151,83,53,85,111,86,142,87,149,88,180,89,182,90,217,91,11,93,251,93,51,95,138,96,156,97,222,98,47,100,41,101,98,102,130,103,191,104,197,105,176,106,149,107,230,108,62,110,76,111,49,112,60,113,34,114,11,229,107,229,203,229,43,230,139,230,235,230,75,231,142,37,105,254,81,115,213,115,84,116,206,116,99,117,17,118,162,118,52,119,196,119,98,120,235,120,110,121,245,121,111,122,252,122,154,123,33,124,143,124,23,125,126,125,224,125,66,126,236,126,187,127,96,128,29,129,175,129,72,130,10,131,195,131,80,132,225,132,95,133,219,133,71,134,230,134,129,135,1,136,137,136,17,137,135,137,2,138,101,138,201,138,43,139,141,139,145,140,243,140,169,141,78,142,201,142,42,143,210,143,140,144,38,145,194,145,43,146,140,146,239,146,80,147,178,147,20,148,118,148,177,149,96,150,244,150,123,151,241,151,84,152,237,152,80,153,223,153,63,154,229,154,97,155,193,155,33,156,137,156,40,157,136,157,232,157,138,158,15,159,129,159,74,232,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,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,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,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,163,78,23,80,17,81,99,82,153,83,54,85,112,86,143,87,150,88,181,89,183,90,218,91,12,93,252,93,52,95,139,96,158,97,224,98,48,100,42,101,99,102,131,103,193,104,198,105,177,106,151,107,231,108,63,110,78,111,50,112,61,113,35,114,12,229,108,229,204,229,44,230,140,230,236,230,76,231,143,37,106,254,83,115,214,115,86,116,207,116,100,117,18,118,163,118,57,119,197,119,99,120,237,120,112,121,246,121,113,122,254,122,155,123,34,124,144,124,24,125,127,125,225,125,67,126,249,126,190,127,97,128,31,129,176,129,74,130,11,131,196,131,82,132,226,132,96,133,221,133,72,134,231,134,132,135,2,136,138,136,20,137,136,137,3,138,102,138,202,138,44,139,142,139,146,140,244,140,170,141,79,142,202,142,43,143,214,143,141,144,39,145,195,145,44,146,141,146,240,146,81,147,179,147,21,148,119,148,178,149,99,150,245,150,125,151,242,151,85,152,238,152,81,153,224,153,64,154,231,154,98,155,194,155,34,156,138,156,41,157,137,157,233,157,140,158,17,159,130,159,75,232,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,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,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,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,170,78,27,80,19,81,100,82,155,83,56,85,114,86,144,87,151,88,182,89,185,90,219,91,13,93,255,93,53,95,142,96,159,97,225,98,49,100,44,101,101,102,133,103,195,104,199,105,178,106,152,107,233,108,64,110,79,111,51,112,62,113,36,114,13,229,109,229,205,229,45,230,141,230,237,230,77,231,147,37,107,254,84,115,215,115,88,116,208,116,103,117,19,118,165,118,59,119,198,119,100,120,238,120,113,121,247,121,114,122,0,123,158,123,35,124,147,124,25,125,128,125,226,125,68,126,10,127,192,127,98,128,32,129,177,129,76,130,13,131,198,131,83,132,228,132,97,133,222,133,73,134,232,134,134,135,4,136,140,136,21,137,137,137,4,138,103,138,203,138,45,139,143,139,147,140,245,140,171,141,80,142,203,142,44,143,215,143,142,144,40,145,196,145,45,146,143,146,241,146,82,147,180,147,22,148,120,148,179,149,101,150,248,150,126,151,244,151,86,152,239,152,82,153,225,153,65,154,232,154,99,155,195,155,35,156,140,156,42,157,138,157,234,157,141,158,18,159,141,159,76,232,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,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,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,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,175,78,29,80,20,81,102,82,156,83,57,85,115,86,145,87,152,88,183,89,186,90,220,91,15,93,0,94,54,95,143,96,160,97,228,98,50,100,45,101,103,102,134,103,196,104,200,105,179,106,153,107,236,108,65,110,80,111,52,112,63,113,37,114,14,229,110,229,206,229,46,230,142,230,238,230,78,231,148,37,231,231,85,115,216,115,93,116,209,116,104,117,20,118,166,118,61,119,199,119,101,120,239,120,114,121,249,121,115,122,1,123,159,123,36,124,148,124,26,125,129,125,227,125,69,126,16,127,194,127,99,128,33,129,178,129,77,130,16,131,200,131,84,132,231,132,98,133,223,133,74,134,234,134,135,135,5,136,142,136,22,137,138,137,5,138,104,138,204,138,46,139,144,139,149,140,246,140,172,141,83,142,204,142,45,143,218,143,143,144,41,145,197,145,46,146,144,146,242,146,83,147,181,147,23,148,121,148,180,149,102,150,250,150,127,151,247,151,87,152,240,152,83,153,226,153,66,154,233,154,100,155,196,155,36,156,143,156,43,157,139,157,235,157,142,158,20,159,142,159,77,232,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,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,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,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,176,78,30,80,21,81,104,82,158,83,58,85,116,86,148,87,155,88,184,89,187,90,224,91,16,93,4,94,55,95,144,96,161,97,234,98,51,100,48,101,105,102,136,103,197,104,201,105,180,106,156,107,237,108,66,110,81,111,54,112,64,113,38,114,15,229,111,229,207,229,47,230,143,230,239,230,79,231,149,37,232,231,86,115,218,115,96,116,211,116,105,117,22,118,167,118,62,119,200,119,102,120,240,120,115,121,250,121,117,122,2,123,160,123,37,124,150,124,27,125,130,125,228,125,70,126,30,127,195,127,100,128,34,129,180,129,78,130,18,131,201,131,85,132,232,132,99,133,224,133,75,134,235,134,137,135,6,136,143,136,23,137,139,137,6,138,105,138,205,138,47,139,145,139,150,140,247,140,173,141,84,142,205,142,46,143,224,143,144,144,42,145,198,145,47,146,145,146,243,146,84,147,182,147,24,148,122,148,181,149,107,150,251,150,128,151,248,151,88,152,241,152,86,153,227,153,67,154,234,154,101,155,197,155,37,156,147,156,44,157,140,157,236,157,143,158,21,159,143,159,78,232,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,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,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,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,177,78,32,80,22,81,107,82,160,83,59,85,117,86,149,87,156,88,186,89,188,90,226,91,17,93,7,94,56,95,145,96,162,97,235,98,53,100,49,101,106,102,138,103,198,104,203,105,181,106,157,107,242,108,69,110,82,111,55,112,65,113,39,114,16,229,112,229,208,229,48,230,144,230,240,230,80,231,188,37,233,231,88,115,219,115,97,116,212,116,107,117,26,118,168,118,63,119,201,119,103,120,241,120,116,121,252,121,123,122,5,123,163,123,40,124,153,124,28,125,131,125,229,125,72,126,55,127,196,127,101,128,35,129,181,129,80,130,19,131,203,131,86,132,233,132,101,133,225,133,76,134,236,134,138,135,7,136,144,136,24,137,140,137,8,138,106,138,206,138,48,139,146,139,151,140,248,140,174,141,85,142,207,142,47,143,225,143,146,144,43,145,200,145,48,146,146,146,244,146,85,147,183,147,25,148,123,148,182,149,109,150,252,150,129,151,249,151,89,152,242,152,87,153,228,153,68,154,236,154,102,155,198,155,38,156,150,156,45,157,141,157,237,157,144,158,22,159,144,159,79,232,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,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,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,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,180,78,34,80,23,81,108,82,161,83,61,85,119,86,150,87,157,88,188,89,189,90,227,91,18,93,9,94,59,95,147,96,163,97,240,98,54,100,50,101,107,102,140,103,199,104,205,105,182,106,158,107,244,108,70,110,83,111,56,112,66,113,41,114,17,229,113,229,209,229,49,230,145,230,241,230,81,231,189,37,234,231,89,115,220,115,98,116,213,116,108,117,28,118,169,118,66,119,202,119,104,120,243,120,117,121,254,121,124,122,7,123,164,123,41,124,154,124,29,125,132,125,230,125,73,126,57,127,198,127,102,128,36,129,182,129,81,130,22,131,205,131,88,132,234,132,102,133,226,133,82,134,239,134,140,135,8,136,145,136,28,137,141,137,9,138,107,138,207,138,49,139,147,139,153,140,249,140,175,141,86,142,208,142,48,143,227,143,148,144,44,145,203,145,49,146,147,146,245,146,86,147,184,147,26,148,124,148,183,149,110,150,253,150,130,151,250,151,90,152,243,152,88,153,229,153,69,154,238,154,103,155,199,155,39,156,151,156,46,157,142,157,238,157,145,158,24,159,145,159,80,232,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,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,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,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,182,78,35,80,24,81,109,82,164,83,64,85,120,86,151,87,160,88,189,89,191,90,230,91,19,93,10,94,61,95,149,96,164,97,242,98,55,100,51,101,108,102,141,103,200,104,207,105,183,106,159,107,249,108,71,110,84,111,58,112,67,113,43,114,18,229,114,229,210,229,50,230,146,230,242,230,82,231,226,37,235,231,90,115,221,115,99,116,214,116,109,117,29,118,170,118,68,119,203,119,105,120,245,120,118,121,255,121,125,122,9,123,165,123,43,124,155,124,30,125,133,125,231,125,74,126,59,127,199,127,103,128,37,129,183,129,82,130,24,131,206,131,93,132,235,132,103,133,227,133,83,134,245,134,142,135,9,136,147,136,29,137,142,137,10,138,108,138,208,138,50,139,148,139,154,140,250,140,176,141,87,142,209,142,49,143,231,143,150,144,45,145,208,145,50,146,148,146,246,146,87,147,185,147,27,148,125,148,184,149,111,150,255,150,131,151,251,151,91,152,244,152,89,153,230,153,70,154,240,154,104,155,200,155,40,156,152,156,47,157,143,157,239,157,148,158,26,159,146,159,81,232,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,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,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,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,183,78,36,80,25,81,110,82,167,83,66,85,121,86,152,87,161,88,191,89,192,90,231,91,21,93,11,94,62,95,151,96,165,97,245,98,56,100,55,101,109,102,142,103,202,104,209,105,184,106,160,107,255,108,72,110,85,111,59,112,68,113,45,114,19,229,115,229,211,229,51,230,147,230,243,230,83,231,227,37,236,231,91,115,223,115,100,116,215,116,110,117,30,118,171,118,69,119,204,119,111,120,246,120,121,121,1,122,126,122,12,123,174,123,44,124,160,124,31,125,134,125,232,125,75,126,60,127,200,127,104,128,38,129,184,129,83,130,25,131,208,131,94,132,237,132,105,133,229,133,85,134,246,134,143,135,11,136,148,136,30,137,143,137,11,138,109,138,209,138,51,139,149,139,155,140,251,140,178,141,88,142,210,142,50,143,236,143,152,144,46,145,210,145,51,146,149,146,247,146,88,147,186,147,28,148,126,148,185,149,112,150,2,151,132,151,252,151,92,152,245,152,90,153,231,153,71,154,241,154,105,155,201,155,41,156,153,156,48,157,144,157,240,157,149,158,27,159,147,159,82,232,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,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,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,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,184,78,39,80,26,81,112,82,170,83,69,85,122,86,153,87,162,88,192,89,195,90,233,91,23,93,13,94,63,95,152,96,166,97,248,98,57,100,58,101,113,102,143,103,204,104,210,105,185,106,162,107,0,109,73,110,86,111,60,112,70,113,46,114,20,229,116,229,212,229,52,230,148,230,244,230,84,231,228,37,237,231,92,115,225,115,101,116,216,116,111,117,33,118,172,118,70,119,206,119,112,120,248,120,123,121,4,122,130,122,13,123,175,123,45,124,161,124,33,125,135,125,233,125,76,126,61,127,201,127,107,128,39,129,185,129,84,130,29,131,209,131,95,132,238,132,106,133,230,133,86,134,247,134,144,135,12,136,149,136,31,137,144,137,12,138,110,138,210,138,52,139,150,139,156,140,252,140,182,141,90,142,211,142,51,143,239,143,154,144,48,145,211,145,52,146,150,146,248,146,89,147,187,147,29,148,127,148,186,149,113,150,3,151,134,151,253,151,93,152,246,152,91,153,232,153,72,154,242,154,106,155,202,155,42,156,157,156,49,157,145,157,241,157,150,158,28,159,148,159,83,232,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,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,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,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,185,78,43,80,27,81,113,82,171,83,71,85,125,86,154,87,163,88,193,89,196,90,234,91,24,93,14,94,65,95,153,96,170,97,249,98,59,100,60,101,114,102,145,103,206,104,211,105,186,106,163,107,2,109,74,110,87,111,61,112,71,113,47,114,21,229,117,229,213,229,53,230,149,230,245,230,85,231,229,37,238,231,93,115,226,115,102,116,217,116,112,117,35,118,173,118,72,119,207,119,113,120,249,120,124,121,5,122,133,122,14,123,176,123,46,124,163,124,35,125,136,125,234,125,77,126,62,127,203,127,108,128,40,129,188,129,85,130,30,131,210,131,96,132,239,132,107,133,231,133,87,134,250,134,145,135,13,136,151,136,32,137,145,137,13,138,111,138,211,138,53,139,151,139,157,140,253,140,183,141,91,142,212,142,52,143,241,143,156,144,50,145,212,145,53,146,151,146,249,146,90,147,188,147,30,148,128,148,187,149,115,150,5,151,135,151,254,151,94,152,247,152,92,153,233,153,73,154,243,154,107,155,203,155,43,156,170,156,50,157,146,157,242,157,151,158,29,159,149,159,84,232,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,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,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,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,188,78,47,80,28,81,115,82,172,83,72,85,126,86,156,87,164,88,194,89,197,90,235,91,25,93,18,94,66,95,156,96,171,97,250,98,60,100,61,101,115,102,146,103,207,104,213,105,187,106,164,107,3,109,75,110,89,111,62,112,72,113,50,114,22,229,118,229,214,229,54,230,150,230,246,230,86,231,9,38,239,231,94,115,227,115,103,116,218,116,113,117,39,118,175,118,73,119,208,119,114,120,251,120,125,121,7,122,135,122,16,123,178,123,47,124,166,124,36,125,137,125,235,125,78,126,63,127,205,127,109,128,41,129,189,129,86,130,31,131,211,131,98,132,241,132,108,133,232,133,88,134,251,134,146,135,14,136,152,136,34,137,146,137,14,138,112,138,212,138,54,139,152,139,158,140,254,140,185,141,92,142,213,142,53,143,242,143,158,144,51,145,213,145,54,146,152,146,250,146,91,147,189,147,31,148,129,148,188,149,120,150,10,151,136,151,255,151,95,152,248,152,93,153,234,153,74,154,244,154,108,155,204,155,44,156,172,156,51,157,147,157,243,157,152,158,30,159,150,159,85,232,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,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,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,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,189,78,48,80,29,81,116,82,173,83,75,85,127,86,157,87,165,88,195,89,198,90,236,91,26,93,19,94,67,95,158,96,173,97,251,98,62,100,64,101,117,102,147,103,208,104,214,105,188,106,165,107,5,109,76,110,90,111,63,112,73,113,51,114,23,229,119,229,215,229,55,230,151,230,247,230,87,231,149,34,240,231,95,115,228,115,104,116,219,116,115,117,40,118,176,118,74,119,209,119,115,120,252,120,126,121,8,122,137,122,18,123,179,123,48,124,167,124,37,125,138,125,236,125,79,126,64,127,207,127,110,128,42,129,190,129,87,130,32,131,213,131,100,132,242,132,109,133,234,133,89,134,252,134,148,135,15,136,153,136,35,137,147,137,15,138,113,138,213,138,55,139,153,139,159,140,255,140,187,141,93,142,214,142,54,143,244,143,159,144,52,145,214,145,55,146,153,146,251,146,92,147,190,147,32,148,130,148,189,149,121,150,11,151,137,151,0,152,96,152,249,152,94,153,235,153,75,154,245,154,109,155,205,155,45,156,175,156,52,157,148,157,244,157,153,158,31,159,151,159,86,232,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,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,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,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,190,78,49,80,30,81,117,82,175,83,76,85,128,86,158,87,166,88,196,89,199,90,237,91,28,93,23,94,68,95,161,96,174,97,0,99,64,100,65,101,120,102,148,103,209,104,215,105,189,106,166,107,6,109,79,110,91,111,64,112,75,113,52,114,24,229,120,229,216,229,56,230,152,230,248,230,88,231,18,48,241,231,97,115,230,115,105,116,221,116,117,117,44,118,179,118,75,119,210,119,116,120,253,120,127,121,9,122,138,122,19,123,181,123,49,124,168,124,38,125,139,125,237,125,80,126,65,127,208,127,111,128,43,129,191,129,89,130,33,131,215,131,101,132,243,132,110,133,235,133,91,134,253,134,149,135,16,136,154,136,36,137,148,137,16,138,114,138,214,138,56,139,154,139,160,140,0,141,189,141,94,142,215,142,55,143,245,143,160,144,53,145,215,145,56,146,154,146,252,146,93,147,191,147,33,148,131,148,190,149,122,150,12,151,138,151,1,152,97,152,250,152,95,153,236,153,76,154,246,154,110,155,206,155,46,156,185,156,53,157,149,157,245,157,154,158,33,159,152,159,87,232,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,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,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,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,200,78,50,80,31,81,118,82,176,83,77,85,129,86,159,87,167,88,197,89,200,90,239,91,29,93,30,94,69,95,162,96,175,97,3,99,66,100,66,101,121,102,150,103,211,104,216,105,190,106,167,107,8,109,80,110,93,111,65,112,77,113,58,114,25,229,121,229,217,229,57,230,153,230,249,230,89,231,29,48,242,231,98,115,232,115,106,116,223,116,118,117,46,118,181,118,76,119,211,119,117,120,254,120,130,121,10,122,139,122,22,123,182,123,50,124,169,124,40,125,140,125,238,125,81,126,67,127,209,127,112,128,45,129,196,129,91,130,34,131,217,131,102,132,244,132,111,133,236,133,92,134,255,134,150,135,17,136,155,136,38,137,149,137,17,138,115,138,215,138,57,139,155,139,161,140,1,141,192,141,95,142,216,142,56,143,246,143,164,144,54,145,216,145,57,146,155,146,253,146,94,147,192,147,34,148,132,148,191,149,123,150,16,151,140,151,2,152,98,152,251,152,96,153,237,153,77,154,247,154,111,155,207,155,47,156,190,156,54,157,150,157,246,157,155,158,35,159,156,159,88,232,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,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,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,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,204,78,51,80,32,81,119,82,177,83,78,85,130,86,165,87,170,88,199,89,202,90,241,91,31,93,31,94,70,95,164,96,176,97,4,99,67,100,67,101,123,102,153,103,212,104,217,105,191,106,168,107,9,109,81,110,95,111,66,112,79,113,60,114,26,229,122,229,218,229,58,230,154,230,250,230,90,231,30,48,243,231,99,115,234,115,107,116,225,116,119,117,47,118,182,118,77,119,212,119,118,120,255,120,131,121,12,122,140,122,23,123,183,123,51,124,171,124,41,125,141,125,239,125,82,126,70,127,210,127,114,128,46,129,197,129,92,130,35,131,218,131,103,132,245,132,112,133,237,133,93,134,1,135,152,135,18,136,157,136,39,137,150,137,18,138,116,138,216,138,58,139,156,139,162,140,2,141,193,141,96,142,217,142,57,143,250,143,165,144,55,145,217,145,58,146,156,146,254,146,95,147,193,147,35,148,145,148,192,149,124,150,17,151,142,151,3,152,99,152,252,152,97,153,238,153,78,154,248,154,112,155,208,155,48,156,191,156,55,157,151,157,247,157,156,158,36,159,157,159,89,232,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,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,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,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,207,78,52,80,34,81,120,82,178,83,79,85,131,86,168,87,171,88,200,89,203,90,242,91,32,93,32,94,71,95,165,96,177,97,5,99,73,100,68,101,124,102,155,103,214,104,218,105,192,106,169,107,10,109,82,110,96,111,67,112,80,113,62,114,27,229,123,229,219,229,59,230,155,230,251,230,91,231,188,231,7,48,100,115,235,115,108,116,229,116,122,117,49,118,183,118,78,119,213,119,120,120,0,121,134,121,15,122,142,122,24,123,185,123,52,124,172,124,42,125,142,125,240,125,83,126,71,127,211,127,115,128,48,129,199,129,93,130,36,131,219,131,104,132,246,132,113,133,238,133,95,134,4,135,153,135,20,136,158,136,40,137,151,137,19,138,117,138,217,138,59,139,157,139,163,140,3,141,194,141,97,142,218,142,58,143,251,143,167,144,56,145,218,145,59,146,157,146,255,146,96,147,194,147,36,148,150,148,193,149,125,150,18,151,143,151,4,152,100,152,253,152,98,153,239,153,79,154,250,154,113,155,209,155,49,156,192,156,56,157,152,157,248,157,158,158,37,159,158,159,90,232,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,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,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,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,208,78,53,80,35,81,121,82,179,83,81,85,132,86,170,87,172,88,201,89,205,90,243,91,33,93,33,94,72,95,167,96,178,97,6,99,75,100,70,101,125,102,159,103,215,104,220,105,193,106,171,107,13,109,85,110,97,111,68,112,81,113,64,114,28,229,124,229,220,229,60,230,156,230,252,230,92,231,189,231,244,231,101,115,236,115,110,116,231,116,123,117,50,118,184,118,79,119,214,119,121,120,2,121,135,121,16,122,143,122,26,123,186,123,53,124,173,124,44,125,143,125,241,125,84,126,72,127,214,127,116,128,51,129,200,129,94,130,37,131,222,131,106,132,247,132,115,133,239,133,96,134,5,135,154,135,23,136,159,136,41,137,152,137,20,138,118,138,218,138,60,139,158,139,164,140,4,141,197,141,98,142,219,142,59,143,252,143,168,144,58,145,219,145,60,146,158,146,0,147,97,147,195,147,37,148,152,148,194,149,126,150,20,151,144,151,5,152,101,152,254,152,100,153,240,153,80,154,252,154,114,155,210,155,50,156,193,156,57,157,153,157,249,157,160,158,38,159,161,159,91,232,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,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,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,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,210,78,54,80,36,81,122,82,180,83,82,85,135,86,172,87,173,88,204,89,206,90,244,91,34,93,34,94,73,95,169,96,179,97,10,99,76,100,71,101,127,102,160,103,217,104,221,105,194,106,172,107,15,109,87,110,99,111,69,112,82,113,65,114,29,229,125,229,221,229,61,230,157,230,253,230,93,231,190,231,245,231,102,115,238,115,111,116,232,116,124,117,54,118,185,118,82,119,216,119,122,120,3,121,136,121,17,122,144,122,28,123,187,123,54,124,175,124,45,125,144,125,242,125,85,126,73,127,215,127,117,128,52,129,201,129,96,130,38,131,226,131,110,132,248,132,117,133,240,133,97,134,6,135,155,135,24,136,160,136,44,137,153,137,21,138,119,138,219,138,61,139,159,139,165,140,5,141,199,141,99,142,220,142,60,143,254,143,169,144,59,145,221,145,61,146,159,146,1,147,98,147,196,147,38,148,199,148,195,149,127,150,21,151,147,151,6,152,102,152,255,152,102,153,241,153,81,154,253,154,115,155,211,155,51,156,194,156,58,157,154,157,250,157,161,158,39,159,162,159,92,232,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,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,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,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,218,78,55,80,37,81,123,82,181,83,83,85,136,86,175,87,174,88,205,89,207,90,245,91,35,93,35,94,74,95,170,96,180,97,11,99,77,100,74,101,128,102,161,103,219,104,222,105,195,106,173,107,16,109,89,110,100,111,70,112,83,113,66,114,30,229,126,229,222,229,62,230,158,230,254,230,94,231,191,231,246,231,103,115,239,115,113,116,233,116,125,117,55,118,186,118,83,119,217,119,123,120,4,121,137,121,18,122,147,122,29,123,188,123,55,124,176,124,46,125,145,125,243,125,86,126,74,127,217,127,118,128,53,129,203,129,97,130,41,131,227,131,111,132,249,132,118,133,241,133,99,134,11,135,156,135,25,136,161,136,45,137,154,137,22,138,120,138,220,138,62,139,172,139,166,140,6,141,200,141,100,142,221,142,61,143,255,143,171,144,60,145,222,145,62,146,160,146,2,147,99,147,197,147,39,148,207,148,196,149,128,150,23,151,149,151,7,152,103,152,0,153,115,153,242,153,82,154,254,154,116,155,212,155,52,156,200,156,59,157,155,157,251,157,162,158,40,159,163,159,93,232,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,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,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,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,219,78,56,80,38,81,124,82,183,83,84,85,137,86,176,87,175,88,206,89,208,90,246,91,37,93,36,94,75,95,174,96,181,97,12,99,78,100,75,101,129,102,164,103,220,104,225,105,196,106,174,107,17,109,90,110,101,111,71,112,84,113,67,114,31,229,127,229,223,229,63,230,159,230,255,230,95,231,192,231,247,231,104,115,240,115,114,116,234,116,126,117,57,118,187,118,84,119,218,119,125,120,6,121,139,121,19,122,148,122,31,123,189,123,57,124,180,124,48,125,146,125,244,125,87,126,75,127,218,127,119,128,55,129,205,129,98,130,42,131,228,131,112,132,250,132,119,133,242,133,100,134,12,135,157,135,26,136,163,136,46,137,155,137,23,138,122,138,221,138,63,139,177,139,167,140,7,141,201,141,101,142,222,142,62,143,7,144,173,144,61,145,223,145,63,146,161,146,3,147,100,147,198,147,40,148,211,148,197,149,129,150,24,151,150,151,8,152,104,152,1,153,120,153,243,153,83,154,255,154,117,155,213,155,53,156,201,156,60,157,156,157,252,157,163,158,41,159,164,159,94,232,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,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,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,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,220,78,57,80,39,81,126,82,184,83,87,85,138,86,177,87,176,88,207,89,209,90,247,91,40,93,37,94,76,95,176,96,182,97,13,99,79,100,77,101,131,102,166,103,221,104,226,105,197,106,175,107,19,109,92,110,103,111,72,112,85,113,68,114,32,229,128,229,224,229,64,230,160,230,0,231,96,231,193,231,248,231,105,115,241,115,115,116,235,116,128,117,58,118,188,118,85,119,221,119,126,120,7,121,140,121,21,122,153,122,33,123,190,123,58,124,181,124,49,125,147,125,245,125,88,126,76,127,219,127,120,128,57,129,206,129,99,130,46,131,230,131,114,132,251,132,120,133,243,133,101,134,14,135,158,135,28,136,165,136,47,137,156,137,24,138,123,138,222,138,64,139,187,139,168,140,8,141,202,141,103,142,223,142,63,143,8,144,178,144,62,145,224,145,64,146,162,146,4,147,101,147,199,147,41,148,212,148,198,149,130,150,25,151,151,151,9,152,105,152,2,153,121,153,244,153,84,154,0,155,118,155,214,155,54,156,209,156,61,157,157,157,253,157,164,158,42,159,165,159,95,232,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,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,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,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,224,78,59,80,40,81,128,82,185,83,88,85,139,86,179,87,177,88,213,89,211,90,253,91,42,93,40,94,77,95,179,96,184,97,15,99,80,100,78,101,133,102,169,103,222,104,227,105,198,106,176,107,20,109,93,110,104,111,73,112,86,113,69,114,33,229,129,229,225,229,65,230,161,230,1,231,97,231,194,231,249,231,106,115,243,115,116,116,236,116,129,117,59,118,189,118,86,119,222,119,127,120,8,121,141,121,22,122,154,122,34,123,191,123,59,124,182,124,50,125,148,125,246,125,89,126,77,127,220,127,121,128,58,129,207,129,100,130,48,131,231,131,116,132,253,132,124,133,244,133,102,134,15,135,160,135,29,136,166,136,49,137,157,137,25,138,124,138,223,138,65,139,199,139,169,140,9,141,205,141,104,142,224,142,64,143,12,144,183,144,63,145,225,145,65,146,163,146,5,147,102,147,200,147,42,148,218,148,199,149,131,150,26,151,153,151,10,152,106,152,3,153,123,153,245,153,85,154,1,155,119,155,215,155,55,156,210,156,62,157,158,157,254,157,165,158,43,159,44,249,96,232,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,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,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,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,226,78,61,80,41,81,131,82,186,83,89,85,140,86,181,87,178,88,214,89,213,90,254,91,43,93,41,94,78,95,181,96,185,97,16,99,81,100,80,101,134,102,172,103,223,104,228,105,199,106,177,107,21,109,94,110,105,111,74,112,87,113,70,114,34,229,130,229,226,229,66,230,162,230,2,231,98,231,195,231,250,231,107,115,244,115,117,116,237,116,130,117,61,118,190,118,87,119,223,119,128,120,9,121,142,121,24,122,155,122,35,123,192,123,60,124,183,124,51,125,149,125,247,125,90,126,78,127,221,127,122,128,59,129,208,129,101,130,50,131,232,131,119,132,254,132,125,133,245,133,103,134,16,135,161,135,30,136,167,136,50,137,158,137,26,138,125,138,224,138,66,139,208,139,170,140,10,141,208,141,106,142,225,142,65,143,14,144,188,144,64,145,226,145,66,146,164,146,6,147,103,147,201,147,43,148,230,148,200,149,132,150,27,151,154,151,11,152,107,152,4,153,126,153,246,153,86,154,2,155,120,155,216,155,56,156,218,156,63,157,159,157,255,157,167,158,45,159,121,249,97,232,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,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,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,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,230,78,63,80,42,81,132,82,188,83,90,85,141,86,182,87,179,88,217,89,215,90,0,92,44,93,42,94,79,95,182,96,186,97,18,99,83,100,82,101,136,102,174,103,225,104,229,105,200,106,178,107,22,109,96,110,106,111,75,112,88,113,73,114,35,229,131,229,227,229,67,230,163,230,3,231,99,231,196,231,251,231,110,115,245,115,120,116,240,116,132,117,65,118,192,118,88,119,224,119,129,120,10,121,144,121,25,122,158,122,39,123,194,123,61,124,184,124,52,125,150,125,248,125,91,126,79,127,222,127,123,128,60,129,209,129,102,130,55,131,235,131,121,132,0,133,127,133,246,133,104,134,17,135,162,135,31,136,168,136,51,137,159,137,27,138,126,138,225,138,67,139,234,139,171,140,11,141,210,141,107,142,226,142,66,143,19,144,189,144,65,145,227,145,67,146,165,146,7,147,104,147,203,147,44,148,251,148,201,149,135,150,29,151,155,151,12,152,108,152,5,153,130,153,247,153,87,154,4,155,121,155,217,155,57,156,219,156,64,157,160,157,0,158,168,158,46,159,149,249,98,232,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,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,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,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,231,78,64,80,43,81,133,82,189,83,91,85,144,86,183,87,180,88,219,89,217,90,2,92,47,93,43,94,81,95,183,96,187,97,19,99,85,100,83,101,137,102,177,103,226,104,230,105,201,106,182,107,24,109,97,110,107,111,77,112,89,113,74,114,36,229,132,229,228,229,68,230,164,230,4,231,100,231,197,231,252,231,112,115,246,115,121,116,241,116,133,117,66,118,193,118,89,119,225,119,130,120,11,121,145,121,27,122,161,122,41,123,195,123,62,124,186,124,53,125,151,125,249,125,92,126,82,127,226,127,124,128,61,129,210,129,103,130,59,131,236,131,123,132,1,133,128,133,247,133,105,134,20,135,163,135,32,136,169,136,53,137,160,137,28,138,127,138,226,138,68,139,9,140,172,140,12,141,211,141,110,142,227,142,67,143,21,144,191,144,66,145,228,145,68,146,166,146,8,147,105,147,204,147,45,148,28,149,202,149,137,150,31,151,156,151,13,152,109,152,6,153,131,153,248,153,88,154,5,155,122,155,218,155,58,156,224,156,65,157,161,157,1,158,169,158,48,159,231,249,99,232,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,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,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,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,233,78,65,80,44,81,134,82,190,83,93,85,145,86,185,87,181,88,222,89,218,90,3,92,48,93,44,94,84,95,185,96,188,97,20,99,86,100,84,101,138,102,178,103,228,104,231,105,202,106,184,107,28,109,98,110,108,111,78,112,90,113,75,114,37,229,133,229,229,229,69,230,165,230,5,231,101,231,198,231,253,231,113,115,247,115,122,116,242,116,135,117,68,118,195,118,92,119,228,119,131,120,12,121,146,121,28,122,162,122,45,123,196,123,66,124,187,124,54,125,152,125,250,125,93,126,83,127,227,127,125,128,63,129,211,129,105,130,61,131,237,131,124,132,2,133,129,133,248,133,106,134,22,135,164,135,35,136,170,136,55,137,161,137,29,138,128,138,227,138,69,139,30,140,173,140,13,141,212,141,113,142,228,142,68,143,24,144,192,144,68,145,229,145,69,146,167,146,9,147,107,147,205,147,46,148,32,149,203,149,138,150,32,151,157,151,14,152,110,152,7,153,137,153,249,153,89,154,6,155,123,155,219,155,59,156,225,156,66,157,162,157,2,158,170,158,49,159,241,249,100,232,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,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,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,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,237,78,66,80,45,81,135,82,192,83,94,85,146,86,186,87,182,88,223,89,219,90,5,92,49,93,47,94,89,95,186,96,189,97,21,99,87,100,87,101,139,102,180,103,229,104,232,105,203,106,185,107,29,109,99,110,111,111,80,112,91,113,78,114,0,48,112,33,1,255,65,48,161,48,145,3,16,4,1,1,254,231,0,224,94,224,188,224,26,225,120,225,214,225,74,85,132,133,197,117,58,87,64,120,32,96,1,78,48,141,110,109,194,87,184,154,39,95,140,128,101,80,61,92,202,79,136,153,226,117,134,150,41,140,121,100,231,98,100,85,112,96,214,83,30,79,1,119,85,96,109,115,64,108,205,93,0,122,15,92,9,144,71,100,112,83,116,109,225,148,39,94,79,79,141,78,95,79,199,81,184,144,11,88,104,131,86,133,122,100,55,85,55,94,251,114,106,96,57,109,201,111,151,89,173,126,27,116,36,105,141,143,63,100,193,129,60,96,98,119,233,148,57,122,27,118,137,152,198,135,31,124,98,145,229,137,204,156,52,226,146,226,240,226,78,227,172,227,10,228,104,228,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,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,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,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,238,78,68,80,46,81,137,82,195,83,95,85,148,86,187,87,183,88,224,89,221,90,7,92,50,93,48,94,90,95,189,96,191,97,23,99,89,100,88,101,141,102,185,103,230,104,233,105,204,106,186,107,31,109,100,110,112,111,81,112,93,113,79,114,1,48,113,33,2,255,66,48,162,48,146,3,17,4,225,0,255,231,1,224,95,224,189,224,27,225,121,225,215,225,63,150,249,150,118,94,29,92,168,80,61,128,239,118,209,83,170,109,63,128,105,91,78,134,101,153,48,130,178,82,227,122,39,97,203,122,132,87,146,130,17,134,222,108,62,129,61,109,54,90,99,101,219,118,55,82,30,99,247,94,174,95,111,96,93,91,99,118,39,92,241,130,211,91,248,149,199,117,232,108,12,78,87,79,150,81,176,144,13,88,27,131,59,133,183,100,86,85,68,94,23,115,125,96,39,109,167,111,202,89,176,126,26,116,240,104,142,143,216,100,166,129,93,96,101,119,235,148,55,122,60,118,140,152,136,135,42,124,97,145,235,137,205,156,53,226,147,226,241,226,79,227,173,227,11,228,105,228,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,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,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,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,239,78,69,80,47,81,138,82,196,83,96,85,149,86,188,87,184,88,225,89,222,90,8,92,51,93,50,94,91,95,190,96,192,97,24,99,90,100,90,101,142,102,186,103,231,104,234,105,205,106,187,107,32,109,101,110,113,111,82,112,95,113,80,114,2,48,114,33,3,255,67,48,163,48,147,3,18,4,206,1,0,232,2,224,96,224,190,224,28,225,122,225,216,225,195,87,221,79,187,115,56,94,215,119,197,98,238,83,90,127,143,121,151,104,119,109,44,85,249,143,81,82,70,131,90,109,131,110,146,124,226,98,43,131,33,106,91,114,178,117,117,114,139,159,81,104,105,82,13,128,75,142,92,80,113,83,12,94,33,104,41,119,101,144,49,106,213,136,40,119,209,144,93,121,64,81,50,79,162,81,207,144,253,87,105,131,255,132,184,100,117,85,84,94,19,115,150,96,12,109,185,111,171,89,190,126,65,116,11,105,143,143,4,128,36,107,90,96,127,119,238,148,81,122,34,118,141,152,133,135,38,124,112,145,239,137,206,156,54,226,148,226,242,226,80,227,174,227,12,228,106,228,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,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,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,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,241,78,70,80,48,81,139,82,197,83,98,85,150,86,189,87,185,88,226,89,223,90,11,92,53,93,51,94,92,95,191,96,193,97,25,99,91,100,92,101,143,102,187,103,232,104,235,105,206,106,188,107,33,109,102,110,115,111,83,112,96,113,81,114,183,0,115,33,229,255,68,48,164,48,148,3,19,4,224,0,0,37,3,224,97,224,191,224,29,225,123,225,217,225,40,99,33,88,224,131,127,149,16,100,57,78,137,148,79,123,177,136,229,93,38,108,164,98,192,111,111,153,98,81,225,144,100,87,165,108,71,150,242,118,156,129,109,98,174,118,102,98,163,141,211,85,220,128,84,100,15,142,173,78,230,151,137,96,150,128,218,126,145,122,116,90,132,152,5,104,193,139,123,154,16,78,61,79,165,81,197,144,237,87,108,131,252,132,153,100,118,85,91,94,33,115,154,96,67,109,182,111,158,89,192,126,92,116,1,105,152,143,234,107,55,107,103,96,141,119,239,148,207,158,32,118,143,152,173,135,56,124,105,145,62,138,207,156,55,226,149,226,243,226,81,227,175,227,13,228,107,228,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,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,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,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,244,78,73,80,49,81,140,82,198,83,99,85,151,86,190,87,186,88,228,89,226,90,12,92,54,93,52,94,94,95,192,96,195,97,28,99,92,100,95,101,144,102,188,103,233,104,236,105,207,106,189,107,34,109,103,110,117,111,84,112,97,113,83,114,201,2,116,33,5,255,69,48,165,48,149,3,20,4,19,1,1,37,4,224,98,224,192,224,30,225,124,225,218,225,206,84,113,153,173,100,127,80,230,137,85,83,118,152,16,79,23,95,59,101,165,78,146,78,165,139,16,110,14,131,143,154,6,102,182,150,124,105,19,108,232,120,174,148,57,83,142,148,187,83,39,78,35,87,112,136,206,128,173,94,221,143,157,129,120,85,116,151,35,140,112,158,107,140,168,105,157,130,147,98,255,94,118,79,160,139,190,144,0,88,106,131,89,133,186,100,119,85,94,94,10,115,173,96,72,109,194,111,164,89,193,126,87,116,87,105,154,143,243,107,57,107,65,96,125,119,243,148,165,153,64,118,148,152,151,135,65,124,111,145,38,139,208,156,56,226,150,226,244,226,82,227,176,227,14,228,108,228,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,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,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,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,248,78,74,80,50,81,141,82,199,83,104,85,152,86,191,87,187,88,230,89,228,90,13,92,55,93,53,94,95,95,193,96,196,97,38,99,93,100,96,101,146,102,189,103,234,104,238,105,208,106,190,107,35,109,104,110,118,111,85,112,98,113,84,114,199,2,117,33,6,255,70,48,166,48,150,3,21,4,233,0,2,37,5,224,99,224,193,224,31,225,125,225,219,225,9,85,157,91,232,98,160,128,4,89,248,144,14,159,79,78,43,117,159,82,179,91,170,108,33,158,133,110,91,119,128,85,70,99,155,82,4,90,217,95,105,100,189,126,222,117,197,148,8,87,20,100,8,94,41,117,212,130,58,99,69,104,21,89,17,123,155,133,218,89,148,94,109,154,139,84,157,103,42,114,69,83,116,79,166,139,208,144,30,88,109,131,72,133,192,100,51,85,97,94,30,115,157,96,7,109,225,111,210,89,194,126,85,116,227,104,206,142,253,107,67,107,89,96,128,119,244,148,112,122,45,118,154,152,131,135,64,124,125,145,83,151,211,156,57,226,151,226,245,226,83,227,177,227,15,228,109,228,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,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,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,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,249,78,75,80,51,81,142,82,206,83,105,85,153,86,192,87,189,88,231,89,229,90,14,92,56,93,54,94,96,95,194,96,197,97,39,99,95,100,97,101,147,102,190,103,235,104,239,105,209,106,192,107,36,109,105,110,119,111,86,112,99,113,85,114,168,0,118,33,7,255,71,48,167,48,151,3,1,4,27,1,3,37,6,224,100,224,194,224,32,225,126,225,220,225,192,84,177,98,181,148,130,83,227,99,184,99,45,149,0,150,154,98,109,96,135,154,55,98,236,89,167,109,118,102,150,84,240,86,131,116,2,100,189,131,84,155,19,129,251,80,67,83,167,152,154,154,49,89,5,94,172,98,71,130,244,86,220,96,72,101,102,91,172,84,40,127,51,158,77,78,47,101,253,98,21,78,145,79,167,139,196,144,25,88,110,131,104,133,208,100,48,85,140,92,29,115,131,96,4,109,238,111,178,89,201,126,89,116,16,105,11,98,245,107,70,107,99,96,140,119,245,148,136,118,48,118,155,152,171,135,254,129,126,145,233,150,212,156,58,226,152,226,246,226,84,227,178,227,16,228,110,228,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,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,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,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,250,78,77,80,52,81,143,82,207,83,107,85,154,86,193,87,190,88,233,89,231,90,16,92,57,93,57,94,99,95,195,96,198,97,41,99,96,100,100,101,148,102,191,103,236,104,240,105,210,106,195,107,38,109,106,110,121,111,87,112,101,113,87,114,3,48,119,33,8,255,72,48,168,48,152,3,22,4,232,0,4,37,7,224,101,224,195,224,33,225,127,225,221,225,145,118,165,98,226,108,94,101,221,93,198,128,154,91,213,108,133,143,154,159,99,145,177,130,233,126,250,94,184,156,97,83,236,98,233,84,211,123,43,115,185,98,83,109,65,92,193,143,67,103,107,98,238,114,19,104,240,83,26,144,47,85,132,113,84,105,116,122,0,130,185,131,10,110,184,112,49,84,19,78,152,78,137,79,170,139,199,144,68,88,176,131,100,133,215,100,92,85,122,92,21,115,146,96,25,109,222,111,175,89,203,126,119,116,113,105,23,98,249,107,89,107,171,96,145,119,247,148,142,118,63,118,158,152,229,135,1,130,114,145,243,150,213,156,59,226,153,226,247,226,85,227,179,227,17,228,111,228,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,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,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,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,252,78,80,80,53,81,145,82,208,83,111,85,155,86,196,87,191,88,234,89,232,90,18,92,58,93,58,94,101,95,196,96,199,97,44,99,97,100,101,101,149,102,192,103,237,104,241,105,211,106,196,107,40,109,108,110,123,111,88,112,105,113,88,114,5,48,120,33,9,255,73,48,169,48,153,3,23,4,43,1,5,37,8,224,102,224,196,224,34,225,128,225,222,225,76,118,180,102,90,83,69,117,127,122,230,101,162,139,208,115,239,79,155,79,168,97,215,84,9,127,245,80,172,78,175,84,105,98,233,79,15,111,5,131,43,103,156,81,108,139,126,123,155,145,194,90,189,101,244,98,240,108,80,104,223,96,239,112,155,78,234,150,111,131,36,132,164,81,200,139,24,135,22,120,30,78,131,79,180,139,211,144,32,88,120,131,94,133,228,100,139,85,141,92,34,115,140,96,14,109,224,111,215,89,204,126,109,116,57,105,27,98,5,108,209,152,6,97,159,119,249,148,147,118,53,118,159,152,172,135,2,130,116,145,239,150,215,156,60,226,154,226,248,226,86,227,180,227,18,228,112,228,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,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,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,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,254,78,81,80,54,81,146,82,210,83,112,85,156,86,197,87,192,88,235,89,234,90,19,92,59,93,62,94,103,95,199,96,201,97,45,99,98,100,103,101,152,102,194,103,239,104,243,105,212,106,198,107,41,109,109,110,125,111,89,112,106,113,90,114,20,32,121,33,10,255,74,48,170,48,154,3,24,4,237,0,6,37,9,224,103,224,197,224,35,225,129,225,223,225,60,133,121,140,195,82,49,85,61,105,46,108,34,78,233,133,220,145,172,142,175,144,78,83,9,84,220,89,202,96,0,95,211,94,84,128,75,150,26,149,171,131,4,95,199,123,223,78,201,108,95,116,127,110,28,151,94,145,110,145,58,78,170,110,71,107,64,136,129,137,37,132,67,81,88,100,229,119,108,143,50,155,143,79,181,139,230,144,101,88,179,131,122,133,226,100,210,85,144,92,57,115,155,96,43,109,239,111,190,89,208,126,126,116,96,105,31,98,7,108,210,152,13,97,160,119,252,148,153,118,67,118,161,152,181,135,4,130,121,145,6,151,216,156,61,226,155,226,249,226,87,227,181,227,19,228,113,228,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,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,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,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,79,82,80,55,81,148,82,211,83,113,85,157,86,198,87,194,88,237,89,236,90,23,92,60,93,63,94,104,95,200,96,204,97,46,99,99,100,104,101,153,102,197,103,242,104,244,105,213,106,199,107,44,109,111,110,126,111,90,112,107,113,92,114,94,255,102,231,11,255,75,48,171,48,155,3,25,4,208,1,7,37,10,224,104,224,198,224,36,225,130,225,224,225,238,119,141,156,15,100,33,80,32,79,70,79,28,78,6,94,167,101,108,81,233,151,62,115,129,103,6,92,190,124,233,99,20,150,178,131,166,130,219,107,168,88,116,89,79,80,38,140,104,81,114,130,215,139,204,83,42,89,179,119,77,111,80,108,78,135,203,82,0,128,103,131,163,87,139,101,162,128,176,100,108,91,126,79,183,139,226,144,108,88,180,131,162,119,9,101,131,85,150,92,37,115,236,96,77,109,26,112,5,90,212,126,156,116,66,105,34,98,6,108,211,152,93,97,176,119,253,148,164,118,62,118,162,152,179,135,236,129,140,145,1,151,217,156,62,226,156,226,250,226,88,227,182,227,20,228,114,228,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,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,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,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,2,79,83,80,56,81,149,82,213,83,114,85,158,86,199,87,195,88,238,89,237,90,25,92,63,93,64,94,107,95,201,96,205,97,48,99,100,100,105,101,154,102,198,103,243,104,245,105,214,106,200,107,45,109,112,110,127,111,91,112,108,113,94,114,22,32,103,231,12,255,76,48,172,48,156,3,26,4,236,0,8,37,11,224,105,224,199,224,37,225,131,225,225,225,126,130,6,114,194,148,133,141,57,130,238,96,172,81,106,117,47,129,171,91,43,84,209,110,216,104,70,109,179,124,119,105,131,87,222,143,98,83,219,119,216,158,170,82,71,114,126,78,202,117,169,109,56,92,61,114,1,96,12,84,244,126,128,114,139,151,143,113,48,105,71,135,129,136,133,91,2,129,90,141,105,86,123,79,194,139,220,144,129,88,160,131,67,133,37,101,177,85,136,92,44,115,187,96,46,109,35,112,6,90,215,126,142,116,93,105,33,98,13,108,213,152,169,97,181,119,255,148,222,116,51,118,165,152,203,135,68,136,133,145,8,151,220,156,63,226,157,226,251,226,89,227,183,227,21,228,115,228,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,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,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,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,3,79,84,80,57,81,150,82,218,83,115,85,159,86,200,87,196,88,239,89,238,90,27,92,64,93,65,94,110,95,204,96,206,97,49,99,101,100,106,101,155,102,199,103,244,104,246,105,215,106,201,107,47,109,113,110,128,111,92,112,109,113,96,114,38,32,104,231,13,255,77,48,173,48,157,3,27,4,77,1,9,37,12,224,106,224,200,224,38,225,132,225,226,225,141,120,111,103,148,123,132,98,152,85,225,109,99,132,251,127,81,129,19,95,181,109,59,117,145,143,95,108,207,126,239,81,201,98,112,149,133,152,198,148,171,108,18,96,151,154,212,158,243,98,238,104,113,134,1,140,112,108,220,148,199,130,132,106,79,83,170,95,78,86,206,143,159,83,132,122,65,108,198,123,40,78,170,79,195,139,215,144,137,88,170,131,114,133,46,101,185,85,152,92,56,115,177,96,53,109,27,112,221,89,219,126,128,116,132,105,37,98,21,108,217,152,157,97,189,119,3,149,224,116,77,118,166,152,211,135,33,130,144,145,15,151,221,156,64,226,158,226,252,226,90,227,184,227,22,228,116,228,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,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,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,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,4,79,86,80,58,81,151,82,220,83,116,85,160,86,201,87,198,88,240,89,239,90,30,92,65,93,67,94,111,95,205,96,207,97,51,99,102,100,109,101,156,102,200,103,246,104,247,105,216,106,202,107,48,109,114,110,129,111,93,112,111,113,99,114,24,32,105,231,14,255,78,48,174,48,158,3,28,4,243,0,10,37,13,224,107,224,201,224,39,225,133,225,227,225,49,114,145,120,47,79,158,148,50,78,222,139,194,97,10,106,156,94,233,93,210,91,18,82,77,124,134,117,149,78,104,97,135,85,201,94,144,94,111,83,32,111,115,89,216,152,177,148,172,114,231,80,65,83,52,108,77,87,100,95,14,132,173,136,31,99,236,101,54,128,98,141,244,99,58,80,75,78,105,104,186,121,124,79,203,139,219,144,154,88,147,131,123,133,11,95,136,85,153,92,49,115,221,96,26,109,57,112,8,90,224,126,129,116,107,105,36,98,24,108,218,152,203,97,58,117,2,149,44,117,94,118,77,134,189,135,34,130,141,145,14,151,223,156,65,226,159,226,253,226,91,227,185,227,23,228,117,228,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,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,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,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,5,79,87,80,59,81,152,82,221,83,121,85,161,86,202,87,199,88,241,89,240,90,31,92,66,93,70,94,114,95,206,96,208,97,52,99,104,100,110,101,158,102,201,103,247,104,248,105,217,106,204,107,52,109,115,110,130,111,95,112,112,113,100,114,25,32,106,231,15,255,79,48,175,48,159,3,29,4,210,1,11,37,14,224,108,224,202,224,40,225,134,225,228,225,152,150,178,96,27,94,29,103,174,117,57,95,168,82,254,119,80,129,94,108,253,81,22,83,198,150,139,132,102,139,10,82,33,135,28,96,137,112,2,131,222,91,150,102,2,111,179,148,56,82,142,131,243,119,97,119,74,100,229,122,212,89,45,94,58,100,226,139,55,114,200,118,149,143,232,91,199,126,132,94,63,78,172,79,207,139,235,144,128,88,156,131,164,133,210,95,129,85,145,92,80,115,216,96,79,109,53,112,227,89,225,126,135,116,128,105,44,98,25,108,179,107,209,97,64,117,6,149,32,158,84,118,84,134,209,135,35,130,145,145,42,151,226,156,66,226,160,226,254,226,92,227,186,227,24,228,118,228,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,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,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,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,6,79,88,80,60,81,153,82,222,83,122,85,162,86,204,87,200,88,242,89,242,90,32,92,67,93,71,94,116,95,207,96,211,97,53,99,106,100,111,101,159,102,202,103,248,104,249,105,218,106,206,107,54,109,116,110,131,111,96,112,113,113,101,114,28,32,107,231,16,255,80,48,176,48,160,3,30,4,242,0,12,37,15,224,109,224,203,224,41,225,135,225,229,225,141,151,81,83,54,130,50,86,151,122,203,134,11,104,146,148,116,141,241,98,138,85,221,139,202,83,104,104,111,102,42,88,74,129,159,109,179,99,146,81,76,150,80,134,226,116,77,82,157,82,2,120,254,98,14,122,42,141,118,104,31,79,96,78,170,144,251,91,206,145,113,95,237,86,187,119,76,128,197,136,21,83,148,79,206,139,239,144,168,153,133,131,168,133,25,117,159,85,154,92,77,115,198,96,82,109,79,112,216,89,232,126,139,116,152,105,231,129,26,108,64,95,6,98,78,117,7,149,34,158,92,118,108,134,192,135,45,130,162,145,45,151,124,151,67,226,161,226,255,226,93,227,187,227,25,228,119,228,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,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,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,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,7,79,89,80,61,81,154,82,225,83,125,85,164,86,205,87,201,88,243,89,243,90,33,92,68,93,72,94,117,95,208,96,213,97,54,99,107,100,113,101,160,102,203,103,251,104,250,105,219,106,208,107,55,109,117,110,133,111,97,112,116,113,104,114,29,32,136,36,17,255,81,48,177,48,161,3,31,4,107,1,13,37,16,224,110,224,204,224,42,225,136,225,230,225,40,108,23,83,22,129,110,111,98,94,83,95,151,79,65,126,111,82,33,141,85,127,208,105,37,96,86,89,136,152,216,82,163,143,24,94,100,83,61,94,11,140,159,117,104,121,92,111,58,127,64,103,246,101,46,84,43,118,69,99,42,79,179,90,156,101,111,154,182,81,150,152,88,84,225,107,244,118,134,89,71,78,230,79,210,139,254,144,25,159,124,131,135,133,17,95,126,85,156,92,87,115,218,96,84,109,94,112,249,89,235,126,158,116,120,105,239,116,33,108,194,107,128,128,75,117,9,149,40,158,86,118,110,134,202,135,47,130,163,145,48,151,133,151,68,226,162,226,0,227,94,227,188,227,26,228,120,228,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,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,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,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,8,79,91,80,62,81,156,82,226,83,127,85,165,86,208,87,202,88,244,89,244,90,35,92,69,93,73,94,118,95,210,96,214,97,55,99,108,100,115,101,161,102,204,103,253,104,251,105,220,106,209,107,56,109,118,110,134,111,98,112,117,113,106,114,20,48,137,36,18,255,82,48,178,48,163,3,32,4,250,0,14,37,17,224,111,224,205,224,43,225,137,225,231,225,137,91,136,143,138,129,226,93,138,94,33,99,107,96,225,81,134,137,113,81,240,127,138,95,190,117,178,139,89,151,78,87,102,85,91,101,79,134,140,140,95,114,42,99,135,100,99,144,148,112,57,82,192,78,172,119,233,110,82,123,62,92,156,85,193,128,225,93,95,78,108,120,6,87,121,138,13,105,158,100,45,89,232,79,211,139,4,145,255,97,182,131,143,133,95,83,214,85,181,92,96,115,180,96,51,109,128,91,12,90,238,126,168,116,52,105,244,116,41,108,243,137,127,128,72,117,10,149,41,158,107,118,127,134,219,135,40,130,170,145,62,151,145,151,69,226,163,226,1,227,95,227,189,227,27,228,121,228,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,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,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,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,11,79,93,80,66,81,164,82,231,83,133,85,166,86,209,87,203,88,245,89,245,90,38,92,70,93,74,94,120,95,211,96,215,97,56,99,110,100,117,101,162,102,205,103,254,104,252,105,221,106,216,107,58,109,119,110,135,111,99,112,118,113,107,114,21,48,138,36,19,255,83,48,179,48,164,3,33,4,212,1,15,37,18,224,112,224,206,224,44,225,138,225,232,225,250,79,204,128,36,110,53,84,239,149,90,81,187,81,230,112,75,141,169,148,188,100,0,96,114,108,32,83,131,88,13,120,177,131,56,129,129,156,56,141,208,103,230,97,165,119,69,109,56,118,153,108,223,152,122,152,91,87,223,126,172,126,227,148,16,140,137,107,117,152,32,102,63,115,152,124,150,107,238,88,59,114,234,79,212,139,34,145,121,130,169,131,121,133,241,83,145,85,162,92,108,115,32,97,145,109,132,91,9,90,239,126,169,116,204,105,255,116,36,108,144,101,147,108,91,117,13,149,42,158,111,118,122,134,234,135,43,130,173,145,128,159,146,151,70,226,164,226,2,227,96,227,190,227,28,228,122,228,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,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,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,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,12,79,94,80,71,81,165,82,244,83,134,85,167,86,211,87,204,88,246,89,246,90,40,92,72,93,75,94,122,95,212,96,216,97,59,99,111,100,118,101,163,102,206,103,255,104,254,105,222,106,218,107,63,109,120,110,138,111,100,112,119,113,108,114,8,48,139,36,20,255,84,48,180,48,165,3,34,4,249,0,16,37,19,224,113,224,207,224,45,225,139,225,233,225,9,99,29,141,202,108,146,112,27,82,97,131,30,109,205,83,13,89,254,82,77,99,238,109,115,83,113,145,108,101,11,119,101,103,254,148,147,158,72,78,199,98,239,124,252,98,52,140,116,83,177,126,128,134,28,130,128,106,219,117,42,103,23,109,153,81,91,108,150,99,223,84,144,110,190,108,103,98,182,114,110,83,197,79,214,139,30,145,125,130,125,131,174,133,253,83,123,85,189,92,111,115,38,97,111,109,149,91,50,90,241,126,144,116,135,105,15,117,42,108,81,159,246,108,114,117,14,149,43,158,202,127,124,134,224,135,56,130,174,145,131,159,148,151,71,226,165,226,3,227,97,227,191,227,29,228,123,228,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,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,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,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,18,79,95,80,74,81,166,82,250,83,140,85,168,86,214,87,205,88,247,89,247,90,41,92,73,93,77,94,125,95,214,96,217,97,60,99,112,100,120,101,164,102,213,103,0,105,0,106,223,106,220,107,64,109,121,110,139,111,101,112,121,113,109,114,9,48,140,36,21,255,85,48,181,48,166,3,35,4,214,1,17,37,20,224,114,224,208,224,46,225,140,225,234,225,151,102,161,148,115,154,102,143,57,84,99,104,92,81,212,143,133,80,159,108,241,101,79,87,201,90,77,150,92,149,183,94,86,141,75,96,140,120,171,115,97,114,250,139,145,152,17,88,74,158,187,80,158,91,244,139,240,117,119,80,26,133,251,124,176,104,173,139,26,78,229,98,24,127,207,118,60,80,14,105,16,108,218,79,216,139,35,145,127,130,184,131,156,133,233,83,223,85,172,92,126,115,21,97,158,109,147,91,52,90,242,126,167,116,136,105,17,117,50,108,147,101,252,109,121,117,15,149,44,158,230,122,123,134,238,135,59,130,175,145,133,159,175,151,72,226,166,226,4,227,98,227,192,227,30,228,124,228,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,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,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,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,79,96,80,76,81,167,82,254,83,141,85,169,86,215,87,206,88,248,89,248,90,42,92,77,93,78,94,126,95,215,96,218,97,62,99,113,100,121,101,165,102,214,103,2,105,1,106,224,106,221,107,66,109,122,110,143,111,102,112,123,113,112,114,10,48,141,36,22,255,86,48,182,48,167,3,36,4,216,1,18,37,21,224,115,224,209,224,47,225,141,225,235,225,184,92,13,80,85,99,111,98,138,112,0,82,150,98,3,131,216,78,223,130,190,97,34,107,167,126,73,133,132,95,119,97,221,132,188,112,50,151,154,103,169,78,230,84,43,141,76,93,183,105,101,85,198,139,85,120,109,111,149,98,115,84,153,150,120,83,175,139,246,83,99,79,220,143,169,101,132,79,37,149,223,86,227,79,217,139,49,145,143,130,123,131,133,133,232,83,189,85,171,92,27,130,35,97,160,109,165,91,17,90,13,127,210,116,206,105,19,117,53,101,188,101,246,119,131,117,18,149,50,158,120,122,168,134,22,136,51,130,181,145,134,159,171,151,73,226,167,226,5,227,99,227,193,227,31,228,125,228,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,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,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,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,20,79,97,80,78,81,174,82,255,83,142,85,170,86,219,87,207,88,250,89,249,90,43,92,78,93,79,94,127,95,217,96,219,97,63,99,114,100,122,101,166,102,215,103,3,105,2,106,225,106,222,107,68,109,123,110,144,111,103,112,124,113,113,114,11,48,142,36,23,255,87,48,183,48,168,3,37,4,218,1,19,37,22,224,116,224,210,224,48,225,142,225,236,225,250,128,200,114,92,83,164,100,118,99,99,99,151,101,41,141,28,150,215,114,141,96,175,115,36,99,18,105,201,117,224,124,106,90,195,126,239,141,133,104,198,89,39,107,193,84,32,107,110,120,94,113,242,83,20,103,45,140,52,89,79,117,15,98,249,135,10,144,243,102,195,129,209,130,151,143,64,87,253,143,228,128,220,79,220,139,47,145,138,130,152,131,185,133,251,83,190,85,177,92,37,89,244,96,94,109,184,91,35,90,246,126,186,116,137,105,52,101,85,101,198,101,248,119,88,127,19,149,49,158,121,122,141,134,19,136,52,130,180,145,135,159,163,151,74,226,168,226,6,227,100,227,194,227,32,228,126,228,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,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,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,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,21,79,98,80,79,81,175,82,0,84,144,85,171,86,220,87,208,88,252,89,250,90,45,92,79,93,80,94,131,95,219,96,220,97,64,99,115,100,123,101,169,102,219,103,4,105,3,106,226,106,223,107,73,109,124,110,145,111,104,112,126,113,115,114,12,48,143,36,24,255,88,48,184,48,169,3,38,4,220,1,20,37,23,224,117,224,211,224,49,225,143,225,237,225,72,104,7,89,250,84,163,99,36,149,72,142,97,150,175,114,54,114,162,87,10,113,83,104,224,81,1,121,86,151,91,98,15,104,174,124,66,141,118,145,205,107,37,158,88,128,73,107,192,150,91,123,226,119,193,112,8,140,15,144,195,128,198,126,200,97,197,143,75,129,200,117,63,97,45,93,7,99,88,141,151,153,209,79,223,139,57,145,168,130,158,131,183,133,18,84,148,85,163,92,231,152,0,97,147,109,47,117,19,90,250,126,234,151,102,105,238,101,107,101,196,101,0,120,97,127,20,149,54,158,128,122,139,134,254,135,62,130,186,145,136,159,178,151,75,226,169,226,7,227,101,227,195,227,33,228,127,228,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,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,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,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,22,79,99,80,80,81,176,82,2,84,146,85,172,86,222,87,210,88,253,89,251,90,46,92,80,93,81,94,134,95,222,96,221,97,65,99,116,100,124,101,170,102,223,103,6,105,4,106,227,106,224,107,76,109,125,110,146,111,105,112,127,113,116,114,13,48,144,36,25,255,89,48,185,48,133,231,39,4,252,0,21,37,24,224,118,224,212,224,50,225,144,225,238,225,174,128,235,96,101,136,123,95,130,87,18,80,70,140,109,153,121,129,132,103,87,108,216,143,10,129,38,113,223,122,151,98,230,98,201,81,127,158,9,151,147,88,180,107,82,78,170,103,217,136,82,102,127,79,175,101,102,87,248,81,130,85,142,119,196,108,139,83,28,89,184,94,40,96,85,92,98,107,96,87,211,107,223,79,224,139,67,145,132,130,168,131,176,133,22,84,153,85,193,92,36,89,14,97,148,109,158,154,64,90,251,126,235,151,99,105,239,101,77,114,195,101,9,120,95,127,21,149,56,158,134,122,172,134,10,136,68,130,85,140,137,159,180,151,76,226,170,226,8,227,102,227,196,227,34,228,128,228,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,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,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,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,28,79,100,80,82,81,180,82,5,84,147,85,173,86,225,87,211,88,254,89,252,90,47,92,81,93,82,94,141,95,225,96,222,97,68,99,117,100,125,101,171,102,225,103,7,105,5,106,228,106,226,107,80,109,128,110,147,111,106,112,128,113,118,114,14,48,145,36,26,255,90,48,186,48,134,231,40,4,234,0,22,37,25,224,119,224,213,224,51,225,145,225,239,225,2,102,25,113,224,87,136,111,37,102,155,92,23,144,219,108,31,141,45,141,73,108,19,127,241,93,246,128,222,122,162,78,238,123,129,104,94,111,100,113,174,102,213,133,106,87,91,84,164,127,202,115,78,92,149,100,239,107,195,121,79,155,126,134,251,108,188,98,178,109,205,150,98,150,56,134,190,141,0,127,126,119,248,79,228,139,70,145,142,130,186,131,211,133,6,84,234,85,183,92,2,89,43,97,92,109,52,100,103,90,254,126,236,151,121,105,240,101,82,114,204,101,23,120,72,138,22,149,55,158,136,122,157,134,27,136,73,130,126,158,138,159,177,154,77,226,171,226,9,227,103,227,197,227,35,228,129,228,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,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,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,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,29,79,102,80,83,81,181,82,7,84,149,85,174,86,226,87,212,88,0,90,253,90,48,92,82,93,83,94,142,95,226,96,223,97,71,99,118,100,126,101,172,102,227,103,8,105,6,106,229,106,227,107,85,109,129,110,148,111,110,112,129,113,119,114,15,48,146,36,27,255,91,48,187,48,135,231,41,4,81,2,23,37,26,224,120,224,214,224,52,225,146,225,240,225,206,118,171,136,13,78,244,144,63,105,119,121,216,117,74,87,204,91,31,89,47,89,98,99,223,132,164,78,192,81,149,112,17,150,177,124,132,121,161,108,85,94,85,84,249,130,84,129,54,113,235,130,118,154,54,86,146,136,129,122,77,79,35,83,34,140,38,158,0,78,10,142,240,102,8,104,234,83,6,140,23,159,41,80,232,139,13,82,145,130,188,131,193,133,75,84,247,85,196,92,99,153,74,97,96,109,228,91,74,90,1,127,76,103,155,105,10,102,86,114,206,101,24,120,104,127,24,149,57,158,149,122,167,134,33,136,75,130,184,141,140,159,176,154,78,226,172,226,10,227,104,227,198,227,36,228,130,228,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,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,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,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,33,79,103,80,87,81,182,82,11,84,150,85,176,86,227,87,214,88,2,90,254,90,50,92,83,93,86,94,143,95,227,96,224,97,72,99,119,100,127,101,173,102,228,103,9,105,7,106,230,106,228,107,86,109,130,110,149,111,113,112,130,113,120,114,22,48,147,36,28,255,92,48,188,48,136,231,42,4,199,231,24,37,27,224,121,224,215,224,53,225,147,225,241,225,249,81,84,89,3,94,227,129,135,145,252,91,253,144,179,130,163,139,156,143,109,103,163,96,128,98,202,144,175,112,3,128,112,81,111,130,85,95,9,119,223,82,118,80,13,132,140,127,195,113,73,103,203,89,29,96,179,120,254,86,45,110,30,151,81,92,45,158,249,88,249,134,166,126,96,83,232,101,198,81,54,78,76,80,233,139,66,89,151,130,193,131,220,133,82,84,201,85,210,92,103,153,117,97,124,109,238,91,85,90,2,127,83,103,167,105,25,102,48,114,210,101,17,120,116,127,27,149,58,158,166,122,163,134,57,136,79,130,235,141,254,158,183,154,79,226,173,226,11,227,105,227,199,227,37,228,131,228,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,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,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,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,35,79,104,80,88,81,183,82,20,84,151,85,177,86,229,87,215,88,10,90,255,90,51,92,84,93,87,94,145,95,228,96,225,97,74,99,123,100,128,101,175,102,230,103,10,105,8,106,231,106,229,107,87,109,132,110,150,111,114,112,131,113,123,114,23,48,148,36,29,255,93,48,189,48,137,231,43,4,68,1,25,37,28,224,122,224,216,224,54,225,148,225,242,225,86,101,239,130,101,107,176,143,7,85,48,82,99,119,185,101,68,150,199,131,42,130,36,85,128,81,71,109,152,122,247,98,156,111,36,78,70,150,146,90,85,97,164,108,115,94,153,88,137,81,113,92,15,95,193,121,162,99,146,95,19,140,150,143,170,133,64,84,59,83,143,84,138,141,24,98,184,126,73,99,159,78,243,79,238,139,162,82,153,130,1,132,255,133,83,84,31,86,228,92,104,153,172,97,99,109,48,137,60,90,3,127,94,103,187,105,114,103,98,134,214,101,171,101,113,127,29,149,62,158,160,122,170,134,60,136,90,130,5,142,11,159,88,158,80,226,174,226,12,227,106,227,200,227,38,228,132,228,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,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,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,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,40,79,105,80,89,81,184,82,24,84,154,85,178,86,230,87,216,88,11,90,0,91,53,92,85,93,88,94,147,95,229,96,226,97,81,99,124,100,129,101,176,102,231,103,12,105,9,106,232,106,230,107,88,109,135,110,151,111,115,112,133,113,124,114,16,48,149,36,30,255,94,48,190,48,138,231,44,4,72,1,26,37,29,224,123,224,217,224,55,225,149,225,243,225,172,113,44,103,63,124,24,92,243,109,59,122,210,107,170,128,135,89,149,84,213,88,234,117,99,91,132,154,234,99,228,112,48,140,134,143,46,98,65,149,40,103,106,85,237,81,55,133,211,103,32,82,58,121,248,83,249,83,20,144,9,92,135,102,175,130,43,78,214,99,243,108,195,141,217,122,215,95,217,98,16,159,44,80,240,139,172,82,171,130,229,131,39,134,84,84,209,85,203,92,105,153,148,97,26,110,240,91,98,90,7,127,72,103,171,105,3,102,22,82,128,112,45,120,121,127,30,149,65,158,172,122,147,134,54,127,95,130,89,142,13,159,182,154,81,226,175,226,13,227,107,227,201,227,39,228,133,228,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,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,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,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,41,79,106,80,91,81,185,82,25,84,155,85,179,86,231,87,217,88,13,90,1,91,54,92,86,93,89,94,148,95,234,96,227,97,82,99,125,100,130,101,177,102,232,103,15,105,11,106,233,106,231,107,91,109,136,110,152,111,116,112,134,113,125,114,17,48,150,36,31,255,95,48,191,48,139,231,45,4,200,231,27,37,30,224,124,224,218,224,56,225,150,225,244,225,241,127,40,123,232,144,104,102,175,126,188,96,138,114,63,98,26,127,141,123,142,86,98,140,14,79,7,90,118,122,96,151,253,99,207,145,116,154,207,107,238,118,180,141,246,116,58,95,228,116,125,113,235,88,29,78,173,112,130,109,112,97,225,92,12,149,189,130,241,148,140,109,165,148,91,110,26,99,83,83,92,78,15,80,243,139,173,82,184,130,216,131,5,134,86,84,235,85,229,92,106,153,167,97,199,109,71,142,117,90,8,127,105,103,173,105,21,102,159,128,156,112,28,120,129,127,31,149,66,158,168,122,169,134,66,127,104,130,105,142,185,150,186,154,82,226,176,226,14,227,108,227,202,227,40,228,134,228,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,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,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,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,44,79,107,80,93,81,186,82,26,84,158,85,180,86,232,87,218,88,14,90,2,91,55,92,87,93,90,94,150,95,241,96,228,97,83,99,126,100,131,101,178,102,234,103,17,105,12,106,234,106,232,107,93,109,138,110,153,111,119,112,135,113,130,114,177,0,151,36,32,255,96,48,192,48,140,231,46,4,97,2,28,37,31,224,125,224,219,224,57,225,151,225,245,225,132,136,41,93,22,96,241,95,34,136,83,144,236,114,50,150,144,84,48,79,106,140,21,113,109,121,188,86,160,126,119,87,200,137,126,102,21,84,142,127,102,119,44,114,196,139,162,98,228,88,107,136,22,78,123,107,100,108,96,92,107,83,160,79,35,107,89,114,157,79,56,108,179,92,253,126,183,99,76,104,105,78,46,80,246,139,190,82,190,130,7,88,41,134,67,84,236,85,2,93,107,153,183,97,197,109,7,139,236,128,11,127,165,103,212,105,0,102,156,128,150,112,29,120,126,127,34,149,68,158,173,122,182,134,68,127,126,136,181,141,188,150,188,154,83,226,177,226,15,227,109,227,203,227,41,228,135,228,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,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,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,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,45,79,109,80,94,81,187,82,28,84,160,85,181,86,233,87,219,88,15,90,3,91,67,92,89,93,92,94,154,95,242,96,229,97,84,99,127,100,132,101,179,102,235,103,19,105,13,106,235,106,233,107,95,109,139,110,154,111,121,112,136,113,131,114,215,0,152,36,33,255,97,48,193,48,177,3,47,4,201,231,29,37,32,224,126,224,220,224,58,225,152,225,246,225,178,80,247,126,230,100,137,108,51,98,215,118,251,139,168,89,118,86,189,108,235,107,163,109,66,82,5,100,150,115,219,130,210,97,174,78,221,148,39,102,103,114,21,94,79,92,71,106,24,101,234,149,255,103,134,128,88,88,31,87,31,118,237,114,155,143,156,134,10,79,127,96,164,124,31,106,243,129,34,116,147,78,45,80,249,139,255,84,176,130,24,132,22,134,33,84,212,85,3,93,108,153,212,97,222,109,182,143,170,90,12,127,135,103,177,105,133,112,147,128,157,112,57,120,205,118,42,149,70,158,179,122,196,134,69,127,133,136,191,141,189,150,193,154,84,226,178,226,16,227,110,227,204,227,42,228,136,228,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,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,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,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,46,79,110,80,95,81,188,82,34,84,161,85,182,86,234,87,220,88,16,90,4,91,68,92,90,93,93,94,155,95,245,96,231,97,86,99,128,100,133,101,181,102,237,103,20,105,14,106,236,106,236,107,97,109,140,110,155,111,122,112,137,113,133,114,247,0,153,36,34,255,98,48,194,48,178,3,160,231,202,231,30,37,33,224,127,224,221,224,59,225,153,225,247,225,101,89,45,117,28,115,72,150,240,126,183,95,53,88,255,78,14,86,100,91,221,144,166,91,184,96,240,148,237,151,239,103,6,127,5,140,163,79,208,91,70,122,21,96,97,87,57,149,183,86,85,150,139,78,250,91,42,100,16,84,41,110,11,78,176,101,22,93,99,136,199,82,8,103,224,122,244,129,1,131,136,130,254,79,252,139,208,82,200,130,11,132,60,134,87,84,230,85,39,93,116,153,245,97,14,110,211,143,155,90,15,127,106,103,193,105,247,102,188,128,187,112,58,120,229,118,43,149,71,158,100,136,181,134,16,130,136,136,188,141,206,150,192,154,85,226,179,226,17,227,111,227,205,227,43,228,137,228,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,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,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,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,49,79,111,80,96,81,189,82,36,84,162,85,184,86,235,87,221,88,18,90,5,91,70,92,92,93,95,94,157,95,247,96,232,97,87,99,129,100,134,101,182,102,238,103,21,105,15,106,237,106,237,107,98,109,141,110,157,111,123,112,139,113,134,114,54,34,154,36,35,255,99,48,195,48,179,3,161,231,203,231,31,37,34,224,128,224,222,224,60,225,154,225,248,225,202,97,245,108,193,136,129,141,181,117,151,95,121,119,191,139,229,139,209,89,125,89,123,94,78,109,235,119,69,78,245,104,194,112,169,100,197,101,185,89,255,98,54,116,252,108,114,101,169,139,197,100,237,98,227,85,2,88,84,81,138,134,166,83,251,95,89,136,144,152,40,117,166,96,112,95,110,127,76,145,91,91,28,80,255,139,214,82,202,130,221,131,254,94,89,84,221,85,38,93,119,153,221,95,191,109,213,143,119,90,17,127,115,103,202,105,29,102,10,103,192,112,59,120,50,136,41,149,72,158,105,136,206,134,250,122,216,136,186,141,210,150,197,154,86,226,180,226,18,227,112,227,206,227,44,228,138,228,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,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,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,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,51,79,112,80,97,81,192,82,37,84,163,85,185,86,236,87,222,88,20,90,6,91,71,92,94,93,96,94,158,95,248,96,233,97,88,99,131,100,136,101,183,102,242,103,22,105,16,106,238,106,238,107,100,109,142,110,158,111,125,112,140,113,135,114,39,34,155,36,36,255,100,48,196,48,180,3,162,231,204,231,32,37,35,224,129,224,223,224,61,225,155,225,249,225,179,111,102,142,80,103,108,136,40,131,132,118,76,141,186,126,57,101,19,159,23,128,82,131,196,91,165,79,120,112,213,120,229,110,74,128,101,92,154,90,234,84,205,98,135,152,132,96,118,153,97,141,147,138,219,86,224,104,77,110,135,101,15,89,195,95,175,109,55,89,125,94,5,150,51,111,28,94,68,85,108,85,12,80,0,140,240,82,227,130,253,131,8,95,35,84,196,85,46,93,125,153,179,150,224,109,229,143,122,90,18,127,152,103,223,105,52,102,189,128,183,112,31,120,133,148,44,149,73,158,114,136,176,134,253,122,223,136,196,141,191,119,194,154,87,226,181,226,19,227,113,227,207,227,45,228,139,228,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,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,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,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,53,79,113,80,99,81,193,82,42,84,164,85,186,86,238,87,223,88,21,90,7,91,76,92,95,93,99,94,159,95,251,96,234,97,89,99,134,100,137,101,184,102,245,103,23,105,17,106,239,106,240,107,101,109,145,110,159,111,129,112,141,113,136,114,40,34,116,36,37,255,101,48,197,48,181,3,163,231,5,49,33,37,36,224,130,224,224,224,62,225,156,225,250,225,173,130,248,143,77,98,145,100,193,120,108,142,92,103,62,101,130,105,228,83,247,83,76,97,194,91,26,129,93,78,151,152,5,116,218,80,97,92,232,149,80,84,146,99,70,90,101,104,112,98,179,129,29,144,58,79,155,129,226,86,251,149,19,84,225,79,197,150,87,144,24,79,24,128,32,95,217,92,64,119,15,86,37,80,2,140,223,83,152,130,214,131,60,89,50,84,239,85,36,93,128,153,233,149,17,110,238,143,190,90,23,127,167,103,149,105,49,102,177,128,171,112,60,120,134,148,49,149,75,158,125,136,186,134,8,123,94,137,214,141,224,150,203,154,88,226,182,226,20,227,114,227,208,227,46,228,140,228,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,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,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,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,55,79,114,80,100,81,194,82,48,84,165,85,187,86,240,87,224,88,22,90,8,91,77,92,96,93,100,94,160,95,252,96,235,97,90,99,136,100,138,101,186,102,246,103,24,105,18,106,240,106,241,107,103,109,146,110,160,111,130,112,142,113,137,114,17,34,117,36,38,255,102,48,198,48,182,3,164,231,6,49,34,37,37,224,131,224,225,224,63,225,157,225,251,225,76,99,60,144,34,141,240,121,204,150,111,112,64,149,242,131,153,148,202,134,105,109,196,158,161,139,225,114,82,145,209,121,148,105,151,117,21,127,247,149,160,148,76,114,52,120,167,119,213,126,132,85,191,82,60,79,16,85,168,99,185,126,128,99,69,136,209,84,251,121,160,96,145,78,140,99,54,82,124,112,196,78,40,80,4,140,238,113,183,130,28,132,65,89,130,84,229,85,30,93,132,153,235,149,230,109,228,143,235,90,25,127,117,103,224,105,54,102,171,128,177,112,37,120,135,148,50,149,76,158,127,136,177,134,3,123,157,127,215,141,142,146,204,154,89,226,183,226,21,227,115,227,209,227,47,228,141,228,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,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,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,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,57,79,115,80,102,81,196,82,51,84,166,85,189,86,241,87,225,88,23,90,10,91,82,92,97,93,101,94,162,95,253,96,236,97,91,99,137,100,141,101,187,102,247,103,25,105,19,106,241,106,242,107,104,109,147,110,162,111,131,112,144,113,140,114,15,34,118,36,39,255,103,48,199,48,183,3,165,231,7,49,35,37,38,224,132,224,226,224,64,225,158,225,252,225,82,98,59,159,108,119,206,87,158,143,123,118,154,128,94,151,214,118,168,154,117,84,250,120,176,139,210,137,169,83,243,88,252,114,206,113,81,134,236,78,163,144,152,95,68,155,84,78,249,96,85,108,47,102,114,153,214,124,147,152,59,84,40,149,31,102,154,78,234,78,231,95,231,144,168,109,122,102,74,109,141,83,126,80,7,140,205,119,174,130,56,132,55,128,148,84,242,85,6,93,135,153,241,149,221,109,233,143,178,90,28,127,168,103,141,105,53,102,173,128,232,112,44,120,139,148,52,149,78,158,130,136,175,134,4,123,159,127,218,141,174,146,209,154,90,226,184,226,22,227,116,227,210,227,48,228,142,228,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,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,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,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,59,79,116,80,103,81,197,82,54,84,168,85,190,86,242,87,226,88,25,90,11,91,83,92,98,93,102,94,163,95,254,96,237,97,92,99,138,100,142,101,188,102,248,103,26,105,20,106,242,106,244,107,107,109,148,110,163,111,132,112,145,113,142,114,42,34,119,36,40,255,104,48,200,48,184,3,166,231,8,49,36,37,39,224,133,224,227,224,65,225,159,225,253,225,237,83,212,107,41,142,89,106,72,97,73,123,166,94,97,85,137,110,55,140,157,85,87,135,226,101,122,153,81,101,179,84,202,94,229,91,47,108,12,132,28,90,67,110,235,143,168,79,237,112,71,98,220,85,243,93,24,80,127,129,51,122,72,81,101,129,182,139,240,128,36,92,0,83,86,103,233,121,121,81,157,83,67,80,12,140,244,94,203,130,17,132,85,89,119,84,243,85,27,93,138,153,243,149,217,109,230,143,210,90,27,127,158,103,255,105,6,128,180,128,202,112,35,120,138,148,54,149,81,158,162,136,201,134,21,123,167,127,222,141,200,146,69,155,91,226,185,226,23,227,117,227,211,227,49,228,143,228,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,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,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,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,62,79,117,80,105,81,198,82,55,84,169,85,191,86,243,87,227,88,26,90,12,91,84,92,99,93,103,94,164,95,255,96,238,97,93,99,139,100,143,101,189,102,249,103,27,105,21,106,243,106,246,107,108,109,149,110,164,111,134,112,146,113,144,114,41,34,120,36,41,255,105,48,201,48,185,3,167,231,9,49,37,37,40,224,134,224,228,224,66,225,160,225,254,225,39,84,25,145,199,145,16,98,247,116,170,119,33,110,222,152,114,94,161,128,119,131,39,124,204,95,52,127,231,101,239,83,206,144,189,143,139,95,153,132,179,126,62,109,149,124,231,93,236,88,46,127,108,86,126,103,186,142,21,135,10,125,217,78,41,115,9,113,145,117,49,117,104,150,8,78,26,122,168,84,163,83,85,80,15,140,245,81,204,130,6,132,90,89,113,84,204,85,88,93,141,153,245,149,22,110,243,143,212,90,31,127,173,103,47,106,95,102,183,128,16,113,41,120,140,148,55,149,85,158,198,136,207,134,10,123,175,127,206,141,62,147,67,155,92,226,186,226,24,227,118,227,212,227,50,228,144,228,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,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,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,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,63,79,120,80,106,81,200,82,58,84,170,85,192,86,245,87,229,88,27,90,13,91,86,92,100,93,104,94,165,95,2,97,239,97,96,99,140,100,146,101,191,102,250,103,28,105,22,106,244,106,247,107,109,109,150,110,165,111,135,112,147,113,145,114,8,34,121,36,42,255,106,48,202,48,186,3,168,231,10,49,38,37,41,224,135,224,229,224,67,225,161,225,255,225,6,123,20,123,105,95,72,84,205,139,243,81,146,89,165,128,24,117,69,101,207,131,135,118,69,150,222,126,252,129,52,110,23,103,102,111,135,115,172,106,22,108,0,101,86,82,152,151,193,78,146,88,2,144,56,128,204,109,42,137,238,149,156,156,250,96,189,84,130,108,174,144,65,81,16,94,40,141,68,141,165,83,72,80,17,140,252,81,193,130,212,131,88,89,100,84,205,85,62,93,144,153,246,149,171,109,232,143,184,90,33,127,139,103,237,105,84,102,231,128,19,113,78,120,141,148,56,149,87,158,183,136,180,134,43,123,176,127,207,141,106,147,71,155,93,226,187,226,25,227,119,227,213,227,51,228,145,228,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,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,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,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,64,79,121,80,111,81,202,82,61,84,171,85,193,86,246,87,230,88,29,90,14,91,87,92,101,93,105,94,166,95,3,97,240,97,100,99,141,100,148,101,192,102,251,103,29,105,25,106,245,106,248,107,112,109,151,110,166,111,136,112,149,113,147,114,55,34,122,36,43,255,107,48,203,48,187,3,169,231,11,49,39,37,42,224,136,224,230,224,68,225,162,225,0,226,107,81,124,95,220,131,88,78,100,107,147,144,239,122,42,83,70,103,126,152,56,104,240,81,147,89,127,82,5,130,75,81,106,109,134,78,228,110,223,118,67,78,88,111,81,98,172,100,186,78,36,79,213,78,2,96,159,141,0,144,225,85,164,126,116,81,9,150,156,91,192,148,208,143,38,141,153,112,255,89,174,83,78,80,18,140,47,155,169,130,223,131,15,83,154,84,232,85,52,93,145,153,252,149,12,110,5,144,224,90,34,127,119,103,23,106,65,102,232,128,22,113,109,120,143,148,60,149,90,158,188,136,233,134,15,123,178,127,219,141,202,147,73,155,94,226,188,226,26,227,120,227,214,227,52,228,146,228,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,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,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,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,65,79,122,80,114,81,204,82,63,84,172,85,194,86,247,87,231,88,30,90,15,91,88,92,102,93,106,94,167,95,4,97,241,97,101,99,142,100,149,101,193,102,252,103,30,105,26,106,246,106,250,107,113,109,153,110,168,111,139,112,150,113,148,114,26,34,123,36,44,255,108,48,204,48,188,3,170,231,12,49,40,37,43,224,137,224,231,224,69,225,163,225,1,226,164,117,167,120,33,133,11,122,58,82,36,88,237,119,253,139,209,103,250,86,190,121,246,96,231,126,89,101,142,84,59,82,94,99,130,100,255,126,48,149,118,89,216,118,250,148,216,127,205,95,70,85,141,79,130,152,235,112,30,84,193,127,184,84,17,82,223,112,232,89,185,114,116,133,215,78,212,117,203,110,101,151,108,80,20,140,182,83,180,130,15,132,34,92,155,84,245,85,61,93,147,153,254,149,174,109,4,144,227,90,35,127,124,103,24,106,79,102,233,128,47,113,86,120,144,148,62,149,91,158,201,136,241,134,71,123,124,124,198,141,143,147,72,155,95,226,189,226,27,227,121,227,215,227,53,228,147,228,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,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,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,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,66,79,124,80,122,81,205,82,65,84,173,85,195,86,251,87,232,88,33,90,16,91,90,92,103,93,107,94,169,95,5,97,242,97,102,99,143,100,150,101,194,102,254,103,33,105,27,106,247,106,251,107,114,109,154,110,169,111,140,112,151,113,149,114,165,34,124,36,45,255,109,48,205,48,189,3,171,231,13,49,41,37,44,224,138,224,232,224,70,225,164,225,2,226,244,93,214,132,16,153,233,96,80,141,78,79,59,149,32,84,255,122,199,150,140,84,76,113,170,126,117,145,49,92,162,91,179,82,99,149,230,92,27,115,16,128,208,120,198,78,237,92,231,151,79,141,202,145,1,144,143,99,111,92,238,116,36,141,139,87,249,109,93,95,185,108,93,145,192,128,222,110,196,109,93,141,123,80,21,140,1,95,161,130,3,132,37,92,132,84,228,85,108,93,148,153,3,150,43,110,11,144,241,90,36,127,240,103,101,106,86,102,234,128,49,113,87,120,148,148,63,149,92,158,226,136,242,134,56,123,73,101,236,141,62,148,77,155,96,226,190,226,28,227,122,227,216,227,54,228,148,228,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,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,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,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,68,79,125,80,126,81,206,82,66,84,174,85,196,86,252,87,233,88,34,90,17,91,91,92,104,93,108,94,171,95,7,97,243,97,104,99,144,100,152,101,195,102,1,104,34,105,28,106,248,106,252,107,115,109,155,110,170,111,141,112,154,113,150,114,37,34,125,36,46,255,110,48,206,48,190,3,172,231,14,49,42,37,45,224,139,224,233,224,71,225,165,225,3,226,212,98,61,133,194,83,132,111,33,107,244,110,181,107,186,128,157,128,46,82,85,79,67,102,9,86,127,143,154,117,254,139,98,114,214,94,27,99,166,104,72,89,252,118,134,131,207,79,251,78,76,102,112,153,139,91,155,109,192,129,29,99,84,136,98,95,208,118,5,105,56,110,85,102,52,118,187,108,92,91,26,83,165,80,22,140,90,117,170,130,248,131,44,92,118,84,148,143,91,93,149,153,4,150,110,110,38,144,214,90,37,127,9,104,242,105,97,102,219,128,115,113,38,120,151,148,66,149,94,158,206,136,237,134,42,123,145,124,247,141,107,148,81,155,97,226,191,226,29,227,123,227,217,227,55,228,149,228,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,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,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,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,69,79,129,80,127,81,207,82,68,84,175,85,197,86,254,87,234,88,36,90,18,91,92,92,106,93,109,94,172,95,10,97,244,97,106,99,147,100,154,101,196,102,2,104,35,105,29,106,249,106,254,107,117,109,157,110,171,111,143,112,155,113,151,114,32,34,126,36,47,255,111,48,207,48,191,3,173,231,15,49,43,37,46,224,140,224,234,224,72,225,166,225,4,226,203,141,213,107,149,134,218,139,106,128,234,143,173,101,159,94,118,141,220,116,8,84,76,94,183,103,131,143,160,151,175,128,1,128,153,101,106,91,95,91,87,83,84,117,97,132,141,122,164,139,10,78,15,108,188,139,212,110,214,98,23,135,55,130,162,144,37,78,129,134,73,145,245,151,156,150,146,122,43,125,245,83,167,80,25,140,239,93,159,130,249,131,52,92,102,84,30,86,111,93,128,94,6,150,78,110,17,144,230,90,38,127,216,103,68,106,87,102,194,128,92,113,80,120,149,148,53,149,99,158,227,136,243,134,25,123,157,124,248,141,127,156,232,152,98,226,192,226,30,227,124,227,218,227,56,228,150,228,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,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,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,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,71,79,130,80,131,81,209,82,69,84,176,85,198,86,255,87,237,88,38,90,19,91,93,92,109,93,110,94,175,95,11,97,246,97,107,99,148,100,157,101,197,102,3,104,37,105,30,106,250,106,255,107,118,109,158,110,172,111,144,112,156,113,152,114,18,35,127,36,48,255,112,48,208,48,192,3,174,231,16,49,44,37,47,224,141,224,235,224,73,225,167,225,5,226,118,151,217,107,139,107,127,98,113,132,76,101,14,127,184,108,31,97,80,82,210,118,77,96,57,89,235,83,216,98,67,85,108,79,23,82,230,110,47,119,55,117,36,82,233,131,7,82,3,82,26,92,2,94,245,139,230,126,88,98,161,109,242,149,76,136,20,120,26,80,9,103,85,91,219,98,45,78,212,78,38,83,169,80,27,140,76,87,196,130,234,131,76,98,157,84,8,86,93,93,145,94,8,150,107,110,13,144,216,90,39,127,10,104,62,106,119,102,196,128,104,113,71,120,154,148,68,149,102,158,229,136,208,134,46,123,156,124,227,141,130,156,13,153,99,226,193,226,31,227,125,227,219,227,57,228,151,228,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,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,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,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,72,79,131,80,132,81,211,82,71,84,178,85,199,86,1,88,239,88,39,90,20,91,95,92,110,93,111,94,176,95,12,97,247,97,108,99,151,100,158,101,198,102,4,104,38,105,32,106,251,106,0,108,121,109,160,110,173,111,145,112,157,113,153,114,153,34,128,36,49,255,113,48,209,48,193,3,48,4,17,49,45,37,48,224,142,224,236,224,74,225,168,225,6,226,138,98,214,107,237,96,30,144,241,86,27,123,6,88,57,141,198,121,225,91,137,140,14,140,115,79,150,122,217,114,166,87,229,89,194,136,117,83,154,145,190,150,219,83,178,132,4,131,138,89,243,136,67,96,28,100,4,132,49,129,157,122,142,109,146,145,18,135,242,93,203,83,29,83,45,102,197,118,125,124,46,83,186,80,24,140,169,87,206,130,197,131,106,98,208,84,12,86,107,93,139,94,10,150,178,110,22,144,220,90,42,127,233,103,160,106,132,102,217,128,69,113,76,120,155,148,69,149,103,158,241,136,19,135,49,123,158,124,249,141,133,156,46,153,100,226,194,226,32,227,126,227,220,227,58,228,152,228,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,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,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,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,73,79,132,80,134,81,212,82,73,84,180,85,200,86,3,88,241,88,40,90,21,91,98,92,112,93,112,94,177,95,16,97,248,97,111,99,152,100,160,101,199,102,6,104,39,105,34,106,252,106,1,108,122,109,161,110,174,111,147,112,158,113,154,114,43,34,129,36,50,255,114,48,210,48,195,3,49,4,18,49,46,37,49,224,143,224,237,224,75,225,169,225,7,226,25,128,1,94,232,96,139,154,6,83,196,114,81,81,172,130,98,101,2,99,2,150,112,112,182,91,237,99,189,117,115,96,106,145,200,112,113,78,97,151,202,86,83,78,212,87,20,78,171,126,162,104,164,91,88,130,67,104,53,158,17,98,38,95,120,94,169,92,89,78,243,83,56,120,126,98,224,95,211,110,62,83,214,80,29,140,161,87,164,130,192,131,159,98,173,84,1,86,75,93,150,94,11,150,95,110,33,144,9,91,43,127,176,103,80,106,140,102,205,128,114,113,106,120,156,148,70,149,104,158,26,137,222,134,32,123,162,124,251,141,134,156,85,153,101,226,195,226,33,227,127,227,221,227,59,228,153,228,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,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,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,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,74,79,134,80,135,81,213,82,76,84,182,85,201,86,4,88,242,88,42,90,24,91,100,92,113,93,113,94,178,95,17,97,249,97,112,99,154,100,162,101,200,102,13,104,40,105,35,106,253,106,2,108,123,109,163,110,175,111,151,112,161,113,155,114,46,34,130,36,51,255,115,48,211,48,196,3,50,4,19,49,47,37,50,224,144,224,238,224,76,225,170,225,8,226,93,87,135,94,127,112,228,121,206,78,164,109,31,150,90,145,99,141,2,137,179,108,37,99,160,82,165,99,69,92,81,87,217,112,163,82,160,99,220,124,32,99,158,94,52,103,47,96,84,98,78,99,198,137,222,100,3,144,64,150,161,101,204,90,79,103,246,94,227,119,81,79,66,103,188,108,159,148,80,91,92,141,6,81,31,140,126,88,225,130,38,132,187,98,194,84,36,86,74,93,165,94,12,150,134,110,53,144,23,91,44,127,12,104,91,106,167,102,215,128,74,113,155,120,163,148,73,149,105,158,252,136,244,134,37,123,178,124,228,141,135,156,84,153,102,226,196,226,34,227,128,227,222,227,60,228,154,228,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,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,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,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,75,79,135,80,138,81,215,82,77,84,184,85,203,86,5,88,244,88,43,90,25,91,103,92,114,93,117,94,179,95,18,97,250,97,114,99,155,100,163,101,201,102,16,104,41,105,36,106,254,106,3,108,125,109,164,110,176,111,152,112,162,113,156,114,97,34,131,36,52,255,116,48,212,48,197,3,51,4,20,49,48,37,51,224,145,224,239,224,77,225,171,225,9,226,56,151,249,117,205,130,3,84,27,78,223,127,249,91,41,84,136,81,86,78,184,109,137,143,90,131,134,118,121,154,45,84,157,109,14,115,101,117,247,143,17,129,193,101,3,87,131,122,205,78,13,122,213,139,253,85,216,109,110,154,103,83,62,102,39,96,0,138,229,78,201,145,61,104,117,141,119,136,234,129,102,83,237,80,32,140,188,88,9,131,240,131,202,98,180,84,35,86,105,93,160,94,13,150,83,110,54,144,22,91,45,127,217,103,53,106,157,102,16,103,120,113,147,120,164,148,76,149,106,158,232,136,223,134,36,123,188,124,9,142,136,156,223,154,103,226,197,226,35,227,129,227,223,227,61,228,155,228,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,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,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,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,76,79,137,80,139,81,217,82,78,84,186,85,204,86,8,88,245,88,44,90,26,91,104,92,115,93,119,94,180,95,19,97,251,97,115,99,156,100,166,101,202,102,18,104,42,105,37,106,255,106,4,108,126,109,166,110,177,111,154,112,163,113,157,114,76,34,132,36,53,255,117,48,213,48,198,3,52,4,21,49,49,37,52,224,146,224,240,224,78,225,172,225,10,226,98,127,237,149,49,130,244,117,209,81,225,90,169,88,27,108,26,82,208,98,107,141,189,95,138,152,248,121,202,131,122,122,210,82,51,116,161,98,28,140,124,96,42,128,110,102,166,148,229,101,231,112,54,101,207,130,118,150,124,154,225,99,105,150,211,89,156,152,122,130,241,139,201,84,103,113,200,126,13,110,99,83,236,80,33,140,197,88,247,130,225,131,218,98,210,84,254,85,116,93,185,94,15,150,84,110,45,144,50,91,47,127,181,103,142,106,190,102,221,128,122,113,154,120,171,148,78,149,107,158,254,136,216,134,51,123,189,124,253,141,35,122,225,154,104,226,198,226,36,227,130,227,224,227,62,228,156,228,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,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,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,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,82,79,138,80,142,81,218,82,79,84,188,85,205,86,9,88,247,88,45,90,27,91,105,92,117,93,121,94,182,95,20,97,252,97,116,99,157,100,168,101,203,102,20,104,43,105,38,106,0,107,8,108,127,109,168,110,178,111,155,112,164,113,158,114,72,34,133,36,54,255,118,48,214,48,199,3,53,4,22,49,50,37,53,224,147,224,241,224,79,225,173,225,11,226,56,114,93,101,211,78,1,99,151,124,181,98,40,84,6,82,162,148,42,96,16,137,98,96,62,141,87,136,64,92,80,96,80,78,151,103,110,143,37,95,249,149,214,128,102,109,181,79,14,98,141,130,75,98,101,145,168,139,45,105,131,108,176,115,68,81,14,150,145,98,200,83,126,112,105,127,205,121,87,91,2,82,230,80,37,140,209,88,228,130,92,132,215,98,167,84,0,86,130,93,181,94,18,150,50,110,47,144,55,91,48,127,218,103,121,106,219,102,235,128,152,113,135,120,170,148,79,149,108,158,240,136,209,134,62,123,193,124,20,142,139,156,230,154,105,226,199,226,37,227,131,227,225,227,63,228,157,228,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,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,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,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,84,79,139,80,143,81,219,82,81,84,191,85,206,86,10,88,248,88,46,90,28,91,106,92,118,93,126,94,184,95,22,97,253,97,117,99,159,100,170,101,204,102,21,104,44,105,39,106,1,107,9,108,128,109,169,110,180,111,158,112,165,113,160,114,61,34,134,36,55,255,119,48,215,48,200,3,81,4,23,49,51,37,54,224,148,224,242,224,80,225,174,225,12,226,125,118,10,95,167,108,25,83,139,145,149,94,114,142,183,126,56,127,250,104,100,158,212,134,50,117,54,150,128,84,84,91,247,150,247,120,38,79,115,124,214,109,155,98,49,140,178,78,56,131,250,82,150,153,215,79,87,89,165,89,235,93,46,115,246,81,142,112,19,102,124,94,176,91,70,81,191,128,3,155,8,82,238,80,39,140,41,87,15,131,81,132,238,98,166,84,39,86,153,93,190,94,21,150,37,110,68,144,64,91,49,127,179,103,61,106,220,102,241,128,179,113,156,120,173,148,82,149,113,158,33,137,3,135,30,123,199,124,29,142,142,156,239,154,106,226,200,226,38,227,132,227,226,227,64,228,158,228,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,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,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,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,86,79,140,80,144,81,220,82,90,84,192,85,207,86,12,88,250,88,47,90,29,91,107,92,119,93,129,94,185,95,23,97,254,97,120,99,160,100,172,101,205,102,24,104,46,105,41,106,2,107,10,108,129,109,171,110,181,111,159,112,166,113,161,114,29,34,135,36,56,255,120,48,216,48,201,3,54,4,24,49,52,37,55,224,149,224,243,224,81,225,175,225,13,226,207,103,197,95,207,133,96,108,7,124,48,87,102,101,95,87,155,128,115,81,58,141,222,86,190,148,42,98,233,119,167,99,109,149,22,151,209,78,216,121,98,84,134,84,221,102,230,121,201,132,246,151,136,91,32,125,121,114,211,98,92,84,191,83,248,128,191,108,145,144,194,143,125,143,135,128,205,145,213,104,14,82,7,81,42,140,44,87,7,131,90,132,34,99,211,84,45,86,157,93,179,94,22,150,68,110,81,144,21,92,50,127,221,103,40,106,230,102,244,128,181,113,161,120,172,148,83,149,109,158,25,137,7,135,88,123,204,124,31,142,144,156,235,154,107,226,201,226,39,227,133,227,227,227,65,228,159,228,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,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,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,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,97,79,142,80,145,81,221,82,93,84,193,85,208,86,14,88,251,88,48,90,30,91,108,92,120,93,130,94,186,95,24,97,0,98,121,99,161,100,174,101,206,102,25,104,47,105,43,106,3,107,11,108,131,109,172,110,183,111,160,112,167,113,162,114,96,34,96,36,57,255,121,48,217,48,141,231,55,4,25,49,53,37,56,224,150,224,244,224,82,225,176,225,14,226,126,118,159,143,205,100,223,143,195,79,130,132,127,152,26,113,178,126,152,91,63,86,193,107,71,80,171,82,62,78,160,98,126,133,52,78,166,108,197,137,129,153,40,82,17,112,52,116,99,131,17,92,255,91,31,144,228,133,62,85,168,148,122,129,8,83,68,89,121,92,228,109,141,81,236,83,242,78,42,142,45,82,11,81,43,140,42,87,220,130,89,132,246,98,212,84,88,86,115,140,83,141,23,150,223,110,82,144,28,92,51,127,0,104,88,106,233,102,237,128,168,113,163,120,175,148,84,149,115,158,19,137,248,134,90,123,205,124,44,142,145,156,251,154,108,226,202,226,40,227,134,227,228,227,66,228,160,228,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,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,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,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,98,79,143,80,147,81,222,82,94,84,194,85,209,86,15,88,252,88,51,90,31,91,109,92,121,93,131,94,187,95,25,97,1,98,124,99,162,100,177,101,207,102,26,104,49,105,44,106,4,107,12,108,132,109,173,110,184,111,161,112,169,113,163,114,110,34,97,36,58,255,122,48,218,48,142,231,56,4,26,49,54,37,57,224,151,224,245,224,83,225,177,225,15,226,70,100,193,88,217,124,27,95,127,142,44,123,228,86,126,108,151,92,160,81,209,158,148,96,60,122,130,130,174,108,227,83,202,120,187,144,182,126,204,108,133,81,174,112,31,103,228,82,141,135,232,84,136,99,159,124,126,129,22,99,76,78,133,153,121,108,169,99,191,78,142,78,40,87,110,144,23,79,151,91,51,82,221,78,46,140,51,87,244,130,115,132,57,99,114,84,57,86,183,93,210,94,25,150,177,110,80,144,90,91,53,127,195,103,124,106,50,141,13,129,160,113,178,120,176,148,86,149,146,117,27,137,8,135,69,123,200,124,46,142,146,156,237,154,109,226,203,226,41,227,135,227,229,227,67,228,161,228,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,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,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,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,102,79,144,80,148,81,224,82,95,84,195,85,210,86,16,88,253,88,53,90,32,91,112,92,122,93,133,94,190,95,27,97,2,98,125,99,163,100,178,101,208,102,27,104,50,105,45,106,5,107,14,108,134,109,174,110,186,111,162,112,170,113,164,114,111,34,98,36,59,255,123,48,219,48,143,231,57,4,27,49,55,37,58,224,152,224,246,224,84,225,178,225,16,226,112,79,194,129,253,105,112,154,225,123,29,94,157,148,137,124,47,110,194,137,213,117,103,97,247,78,84,104,90,128,99,98,47,125,222,156,186,139,28,135,233,90,141,136,58,107,185,130,148,113,181,144,46,85,243,80,188,117,199,84,97,108,161,127,196,150,60,119,121,95,194,118,177,84,152,98,31,130,252,126,63,82,61,108,47,140,57,87,210,130,135,132,75,99,163,84,87,86,197,93,209,94,26,150,152,110,104,144,101,91,122,94,184,103,145,106,51,141,14,129,224,113,185,120,178,148,87,149,148,117,10,137,10,135,117,123,197,124,35,142,148,156,249,154,110,226,204,226,42,227,136,227,230,227,68,228,162,228,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,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,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,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,104,79,145,80,152,81,225,82,96,84,198,85,211,86,18,88,254,88,55,90,33,91,114,92,123,93,136,94,191,95,28,97,3,98,126,99,165,100,179,101,209,102,28,104,51,105,46,106,6,107,18,108,135,109,176,110,187,111,163,112,171,113,165,114,100,34,99,36,60,255,124,48,220,48,144,231,58,4,28,49,56,37,59,224,153,224,247,224,85,225,179,225,17,226,37,141,127,144,249,102,59,128,156,122,31,95,254,118,75,89,96,103,161,123,136,95,73,83,182,103,112,103,210,98,199,91,33,81,203,109,29,132,198,91,253,128,209,141,22,104,210,100,182,110,205,126,215,83,81,88,138,138,217,134,236,139,170,91,138,113,77,136,198,129,134,105,18,101,242,84,104,84,59,96,64,82,88,79,50,140,46,87,216,130,136,132,67,99,213,84,44,86,115,95,219,94,44,78,224,110,88,144,115,91,127,117,226,103,144,106,54,141,242,128,212,113,165,120,180,148,88,149,150,117,52,137,13,135,76,123,215,124,47,142,149,156,8,155,111,226,205,226,43,227,137,227,231,227,69,228,163,228,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,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,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,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,106,79,146,80,154,81,226,82,97,84,199,85,213,86,19,88,255,88,56,90,34,91,115,92,124,93,137,94,192,95,29,97,4,98,127,99,166,100,180,101,210,102,30,104,53,105,48,106,7,107,23,108,138,109,179,110,188,111,164,112,173,113,166,114,101,34,100,36,61,255,125,48,221,48,145,231,59,4,29,49,57,37,60,224,154,224,248,224,86,225,180,225,18,226,220,98,91,150,73,131,127,159,103,100,18,144,65,144,253,78,217,123,134,153,224,114,224,96,126,154,119,99,110,99,175,103,146,87,219,81,186,135,66,94,174,89,225,108,26,98,189,121,185,91,98,89,38,118,175,110,175,104,60,109,75,92,119,150,17,79,20,111,56,144,94,134,130,102,240,134,222,93,181,126,76,82,101,79,51,140,47,87,12,131,122,132,173,99,187,84,77,86,119,95,232,94,63,114,45,111,98,144,81,91,219,93,14,104,169,106,59,141,252,128,231,113,212,120,182,148,89,149,160,117,43,137,9,135,93,123,232,124,58,142,154,156,15,155,112,226,206,226,44,227,138,227,232,227,70,228,164,228,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,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,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,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,107,79,147,80,157,81,227,82,99,84,200,85,214,86,20,88,0,89,57,90,35,91,116,92,125,93,140,94,193,95,30,97,5,98,129,99,167,100,181,101,211,102,31,104,54,105,50,106,8,107,28,108,139,109,181,110,189,111,165,112,174,113,167,114,30,34,101,36,62,255,126,48,222,48,146,231,60,4,30,49,58,37,61,224,155,224,249,224,87,225,181,225,19,226,23,122,173,151,149,83,136,79,20,93,20,127,135,99,255,95,139,118,80,127,104,96,102,102,193,90,107,119,232,93,237,84,194,100,65,141,87,127,201,104,19,151,120,84,187,89,221,91,210,126,74,141,125,81,191,91,84,82,3,90,224,101,80,150,238,79,115,130,132,128,26,97,94,141,153,143,50,109,185,144,94,82,206,79,53,140,92,87,251,130,137,132,246,99,191,84,98,86,130,95,234,94,21,98,226,110,91,144,83,91,62,117,193,103,151,106,61,141,21,103,249,113,217,120,183,148,91,149,157,117,54,137,35,135,96,123,110,130,64,142,155,156,19,155,113,226,207,226,45,227,139,227,233,227,71,228,165,228,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,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,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,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,109,79,148,80,158,81,229,82,101,84,202,85,216,86,22,88,1,89,58,90,36,91,117,92,126,93,141,94,194,95,33,97,7,98,131,99,168,100,182,101,212,102,32,104,55,105,51,106,9,107,29,108,141,109,184,110,190,111,166,112,175,113,168,114,53,34,102,36,63,255,127,48,223,48,147,231,61,4,31,49,59,37,62,224,156,224,250,224,88,225,182,225,20,226,145,101,185,143,86,123,58,92,172,80,160,152,198,84,36,97,216,154,239,96,252,84,63,141,124,107,237,122,119,81,159,122,139,128,29,84,59,144,32,119,42,80,218,128,3,78,129,108,151,81,199,134,44,133,201,139,34,142,230,116,156,130,191,126,158,127,48,88,171,117,6,130,67,141,5,128,204,139,112,141,97,82,160,159,54,140,59,87,211,130,120,132,113,99,204,84,89,86,135,95,186,129,53,108,165,110,185,102,98,91,149,144,253,103,171,106,64,141,18,129,29,114,201,120,184,148,94,149,172,117,65,137,59,135,110,123,168,102,57,142,158,156,31,155,114,226,208,226,46,227,140,227,234,227,72,228,166,228,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,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,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,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,110,79,149,80,159,81,230,82,103,84,203,85,217,86,23,88,3,89,59,90,37,91,118,92,127,93,142,94,199,95,34,97,9,98,132,99,170,100,183,101,213,102,34,104,56,105,52,106,10,107,30,108,143,109,185,110,191,111,167,112,176,113,169,114,52,34,103,36,64,255,128,48,224,48,53,254,62,4,32,49,60,37,63,224,157,224,251,224,89,225,183,225,21,226,237,115,22,127,167,79,100,141,6,129,130,99,26,89,170,124,143,129,76,112,168,78,253,121,209,118,1,109,221,141,230,130,123,124,206,98,35,149,245,126,229,108,249,87,196,81,82,151,201,99,12,130,162,103,131,128,17,149,156,136,167,104,248,118,61,103,213,113,166,78,89,79,15,129,23,149,165,124,79,89,92,82,70,108,105,83,66,87,17,131,60,132,122,99,217,84,92,86,137,95,196,95,84,108,167,110,116,144,117,154,142,115,50,104,55,115,69,141,90,140,40,114,236,120,185,148,95,149,163,117,102,137,30,135,123,123,191,127,53,142,159,156,35,155,115,226,209,226,47,227,141,227,235,227,73,228,167,228,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,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,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,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,113,79,150,80,161,81,231,82,105,84,206,85,220,86,24,88,5,89,61,90,38,91,119,92,128,93,146,94,200,95,37,97,19,98,133,99,171,100,184,101,214,102,35,104,58,105,54,106,11,107,32,108,144,109,188,110,193,111,168,112,177,113,170,114,66,38,104,36,65,255,129,48,225,48,54,254,63,4,33,49,61,37,64,224,158,224,252,224,90,225,184,225,22,226,44,100,44,141,140,81,197,127,1,118,199,110,58,89,48,78,148,127,47,141,42,106,26,79,90,87,211,126,30,142,119,145,234,108,178,115,169,123,149,81,60,92,244,136,6,111,123,143,212,103,13,130,179,104,120,145,208,99,106,107,62,84,162,83,197,85,140,83,212,136,222,79,108,132,23,133,116,143,205,99,175,132,116,124,122,83,105,87,26,131,70,132,142,99,218,84,76,86,140,95,201,95,92,108,189,110,125,144,119,154,145,115,51,104,82,115,70,141,54,129,108,112,242,120,186,148,93,149,179,117,123,137,37,135,98,123,206,127,61,142,160,156,189,158,116,226,210,226,48,227,142,227,236,227,74,228,168,228,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,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,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,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,114,79,151,80,163,81,232,82,106,84,207,85,227,86,26,88,6,89,62,90,39,91,120,92,129,93,152,94,202,95,40,97,20,98,134,99,175,100,186,101,215,102,36,104,59,105,55,106,12,107,35,108,146,109,190,110,195,111,169,112,178,113,171,114,64,38,105,36,66,255,130,48,226,48,57,254,64,4,34,49,62,37,65,224,159,224,253,224,91,225,185,225,23,226,115,98,65,98,75,109,165,101,185,124,152,120,155,87,1,92,213,124,73,81,97,136,233,112,22,92,227,137,47,149,147,94,241,104,241,131,161,154,77,81,223,98,84,141,210,103,34,108,137,128,102,141,138,107,156,132,152,152,22,89,52,84,118,149,8,149,26,120,15,97,62,144,109,144,217,143,152,128,223,121,125,82,110,81,29,150,133,87,6,131,105,132,180,99,220,84,84,86,149,95,214,95,74,108,187,110,130,144,120,154,174,115,96,104,129,107,72,141,30,129,24,113,5,121,188,148,97,149,180,117,139,117,46,135,114,123,213,127,49,142,161,156,190,158,117,226,211,226,49,227,143,227,237,227,75,228,169,228,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,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,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,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,117,79,152,80,166,81,233,82,107,84,208,85,229,86,27,88,8,89,63,90,40,91,123,92,131,93,155,94,203,95,41,97,25,98,139,99,177,100,187,101,216,102,37,104,60,105,56,106,13,107,37,108,150,109,191,110,196,111,170,112,180,113,174,114,176,0,108,231,67,255,131,48,227,48,58,254,65,4,35,49,63,37,66,224,160,224,254,224,92,225,186,225,24,226,44,130,191,79,66,92,189,112,236,109,185,112,178,142,171,103,30,100,127,94,82,96,71,108,58,123,208,89,241,79,228,136,94,105,246,150,248,136,201,82,96,79,106,150,143,108,62,80,57,131,68,100,146,98,151,123,68,142,76,140,203,107,153,153,192,121,193,150,197,107,124,156,223,124,89,109,26,94,179,141,130,82,253,93,34,150,107,87,20,131,118,132,109,99,169,84,134,86,153,95,207,95,163,108,183,110,136,144,122,154,162,115,97,104,130,107,73,141,44,129,102,113,244,120,189,148,98,149,184,117,229,128,26,135,113,123,229,127,73,142,162,156,59,126,118,226,212,226,50,227,144,227,238,227,76,228,170,228,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,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,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,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,119,79,153,80,167,81,234,82,108,84,213,85,230,86,28,88,9,89,65,90,41,91,124,92,132,93,157,94,206,95,42,97,28,98,141,99,178,100,190,101,218,102,38,104,62,105,57,106,14,107,43,108,151,109,192,110,197,111,176,112,182,113,177,114,50,32,109,231,68,255,132,48,228,48,63,254,66,4,36,49,64,37,67,224,161,224,255,224,93,225,187,225,25,226,129,152,216,83,109,142,69,81,224,127,120,81,53,103,2,135,80,149,27,144,112,143,179,139,244,149,18,98,229,83,56,89,183,81,132,159,61,132,41,90,63,83,77,145,118,81,127,83,21,136,4,92,147,143,125,134,124,85,47,95,102,107,177,123,150,136,1,85,198,95,9,97,255,81,205,115,146,84,82,83,129,82,201,158,33,150,134,87,21,131,140,132,172,99,170,84,100,86,156,95,3,96,133,108,215,110,131,144,127,154,159,115,78,104,135,107,71,141,24,129,185,113,19,121,191,148,100,149,196,117,178,118,62,135,144,123,225,127,65,142,163,156,130,158,119,226,213,226,51,227,145,227,239,227,77,228,171,228,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,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,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,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,120,79,154,80,168,81,235,82,109,84,215,85,231,86,29,88,10,89,66,90,42,91,125,92,133,93,161,94,211,95,44,97,29,98,145,99,179,100,191,101,222,102,39,104,64,105,58,106,15,107,44,108,152,109,195,110,198,111,178,112,183,113,178,114,51,32,32,50,69,255,133,48,229,48,64,254,67,4,37,49,65,37,68,224,162,224,0,225,94,225,188,225,26,226,127,103,94,83,210,99,178,81,81,103,91,151,250,141,240,92,63,122,112,116,196,84,242,139,78,113,201,133,231,96,174,87,152,83,195,148,27,109,5,127,123,129,105,79,203,104,5,110,18,81,81,97,212,83,139,150,83,79,126,110,148,78,68,137,227,126,102,95,73,78,29,110,251,133,159,101,177,118,207,101,144,82,152,153,49,150,124,87,224,130,142,132,138,99,164,84,113,86,168,95,238,95,144,108,180,110,139,144,125,154,207,115,98,104,132,107,77,141,50,129,62,98,36,121,196,148,101,149,177,117,180,118,72,135,166,123,230,127,66,142,165,156,135,158,120,226,214,226,52,227,146,227,240,227,78,228,172,228,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,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,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,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,121,79,155,80,169,81,236,82,110,84,216,85,232,86,31,88,11,89,67,90,43,91,126,92,134,93,162,94,212,95,45,97,30,98,147,99,180,100,192,101,223,102,40,104,65,105,59,106,16,107,45,108,153,109,196,110,199,111,180,112,184,113,179,114,3,33,33,50,70,255,134,48,230,48,61,254,68,4,38,49,66,37,69,224,163,224,1,225,95,225,189,225,27,226,72,114,168,143,201,83,107,134,88,91,171,87,53,130,11,149,74,84,196,137,216,112,216,126,124,81,165,130,172,112,14,99,168,104,54,79,134,154,98,151,6,144,155,108,71,89,206,100,122,91,137,109,18,130,143,150,255,102,169,115,66,99,88,110,159,88,48,113,202,118,20,110,163,103,31,119,153,91,86,121,147,82,129,81,42,150,123,87,213,130,49,132,105,99,221,84,107,86,173,95,4,96,148,108,207,110,80,95,128,154,194,115,68,104,146,107,85,141,72,129,61,98,30,121,200,148,102,149,176,117,220,119,52,135,167,123,233,127,81,142,166,156,136,158,121,226,215,226,53,227,147,227,241,227,79,228,173,228,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,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,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,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,122,79,156,80,170,81,237,82,111,84,217,85,233,86,34,88,12,89,68,90,44,91,128,92,135,93,163,94,213,95,46,97,32,98,148,99,182,100,194,101,224,102,43,104,67,105,60,106,17,107,49,108,154,109,197,110,200,111,181,112,186,113,181,114,4,255,34,50,71,255,135,48,231,48,62,254,69,4,39,49,67,37,70,224,164,224,2,225,96,225,190,225,28,226,110,98,169,143,44,131,7,93,248,91,53,117,65,82,206,152,229,84,45,87,121,134,100,131,169,128,76,117,103,82,232,141,129,114,154,127,220,126,215,130,186,110,183,85,103,107,116,102,130,89,62,121,209,109,229,126,143,86,125,152,72,83,97,78,12,98,180,91,162,110,133,150,233,101,4,117,60,102,197,139,130,81,20,89,61,150,104,87,28,131,109,132,174,99,207,84,123,86,181,95,225,95,140,108,143,110,87,95,129,154,209,115,100,104,147,107,89,141,76,129,67,98,52,121,201,148,103,149,195,117,18,128,49,135,184,123,238,127,82,142,167,156,139,158,122,226,216,226,54,227,148,227,242,227,80,228,174,228,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,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,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,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,125,79,157,80,173,81,238,82,112,84,218,85,234,86,35,88,14,89,69,90,45,91,131,92,136,93,164,94,218,95,47,97,35,98,149,99,185,100,199,101,225,102,44,104,68,105,63,106,18,107,51,108,156,109,198,110,202,111,182,112,187,113,186,114,164,0,35,50,72,255,136,48,232,48,65,254,70,4,40,49,68,37,71,224,165,224,3,225,97,225,191,225,29,226,204,98,171,143,54,131,160,91,203,120,67,79,240,96,175,117,76,107,69,120,63,158,15,102,112,130,31,80,80,99,239,128,206,158,204,81,136,89,207,99,43,133,198,118,102,117,48,108,177,143,190,139,143,117,211,154,213,96,56,78,30,130,212,127,0,151,26,140,227,139,136,78,161,111,39,120,164,154,59,150,84,127,249,82,60,150,109,87,81,131,193,132,188,99,222,84,124,86,188,95,228,95,104,108,194,110,86,95,133,154,183,115,131,104,141,107,199,137,83,129,72,98,155,159,202,148,104,149,194,117,20,128,41,135,172,123,243,127,74,142,168,156,146,158,123,226,217,226,55,227,149,227,243,227,81,228,175,228,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,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,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,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,128,79,158,80,174,81,239,82,116,84,219,85,236,86,37,88,16,89,71,90,46,91,132,92,137,93,168,94,219,95,48,97,38,98,151,99,187,100,200,101,226,102,45,104,69,105,64,106,19,107,54,108,162,109,200,110,203,111,186,112,188,113,187,114,224,255,36,50,73,255,137,48,233,48,66,254,71,4,41,49,69,37,72,224,166,224,4,225,98,225,192,225,30,226,52,79,77,144,229,103,189,98,174,100,56,117,21,88,253,112,1,100,82,95,42,109,90,90,120,89,203,78,67,158,87,87,241,123,117,112,187,158,132,119,200,98,48,120,14,93,197,96,115,78,55,120,102,78,142,120,149,109,247,112,13,79,101,121,90,134,140,154,174,139,49,90,164,134,251,129,224,115,196,126,187,78,13,83,66,150,118,87,91,131,205,132,242,99,27,85,133,86,98,136,254,95,105,108,159,110,88,95,136,154,179,115,29,104,154,107,202,137,116,129,73,98,249,158,203,148,105,149,214,117,22,128,55,135,157,123,248,124,112,142,169,156,214,147,124,226,218,226,56,227,150,227,244,227,82,228,176,228,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,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,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,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,129,79,159,80,180,81,241,82,121,84,222,85,238,86,38,88,17,89,72,90,47,91,133,92,138,93,169,94,220,95,49,97,39,98,153,99,189,100,201,101,227,102,46,104,70,105,65,106,20,107,55,108,165,109,201,110,204,111,190,112,189,113,188,114,225,255,37,50,74,255,138,48,234,48,67,254,72,4,205,231,70,37,73,224,167,224,5,225,99,225,193,225,31,226,227,116,7,104,180,120,108,145,19,100,151,94,254,134,34,144,8,98,159,159,143,91,66,155,4,127,165,117,31,90,119,123,248,114,117,150,155,115,208,133,116,94,168,98,16,129,119,152,93,108,51,117,78,141,129,92,67,82,140,91,174,79,230,139,24,86,131,107,10,140,232,150,129,142,30,141,42,104,187,148,195,78,7,138,73,150,115,87,92,131,208,132,248,99,231,84,147,86,97,95,5,96,116,108,98,111,59,92,138,154,192,115,85,104,155,107,203,137,89,129,59,121,251,158,204,148,106,149,205,117,28,128,63,135,168,123,119,125,118,142,171,156,157,158,125,226,219,226,57,227,151,227,245,227,83,228,177,228,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,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,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,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,130,79,160,80,184,81,242,82,122,84,224,85,239,86,39,88,18,89,75,90,48,91,134,92,139,93,170,94,222,95,50,97,40,98,154,99,190,100,202,101,228,102,47,104,71,105,66,106,21,107,57,108,172,109,202,110,205,111,191,112,190,113,189,114,48,32,38,50,75,255,139,48,235,48,68,254,73,4,206,231,71,37,74,224,168,224,6,225,100,225,194,225,32,226,74,83,106,95,61,100,116,117,170,99,230,96,232,92,175,81,61,158,250,149,24,95,81,109,39,131,235,139,38,80,169,79,187,121,173,92,1,120,210,121,190,120,249,112,80,159,247,139,101,81,123,84,112,91,87,122,73,92,151,120,94,87,243,96,123,152,46,89,209,139,14,78,106,86,136,148,219,134,130,126,201,78,16,83,84,150,173,87,8,131,230,132,224,99,32,85,175,86,173,114,6,96,118,108,70,111,171,84,144,154,201,115,102,104,161,107,204,137,90,129,64,121,252,158,205,148,107,149,227,117,32,128,130,135,133,123,166,125,124,142,173,156,159,158,126,226,220,226,58,227,152,227,246,227,84,228,178,228,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,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,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,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,133,79,161,80,185,81,243,82,126,84,226,85,242,86,40,88,19,89,76,90,49,91,135,92,140,93,171,94,223,95,51,97,41,98,155,99,191,100,205,101,229,102,48,104,72,105,67,106,22,107,58,108,173,109,204,110,206,111,196,112,191,113,190,114,167,0,39,50,76,255,140,48,236,48,148,231,74,4,207,231,72,37,75,224,169,224,7,225,101,225,195,225,33,226,158,82,152,129,223,91,12,142,43,99,96,89,69,158,29,127,243,128,104,143,162,126,247,109,192,104,74,92,55,119,235,95,19,111,134,152,130,134,58,110,181,100,142,111,215,101,134,94,37,137,56,79,159,113,66,144,41,89,61,99,10,98,205,84,144,95,47,158,2,95,127,92,32,144,166,79,49,103,52,86,194,78,235,81,95,150,164,87,146,131,189,132,255,99,253,84,212,86,176,114,234,95,134,108,71,111,80,92,146,154,200,115,65,104,170,107,206,137,113,129,70,121,241,118,206,148,108,149,232,117,34,128,34,135,170,123,174,125,111,142,174,156,219,158,127,226,221,226,59,227,153,227,247,227,85,228,179,228,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,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,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,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,134,79,162,80,186,81,244,82,127,84,231,85,243,86,41,88,23,89,77,90,51,91,137,92,141,93,172,94,226,95,52,97,43,98,156,99,193,100,208,101,231,102,49,104,73,105,69,106,23,107,59,108,176,109,205,110,207,111,197,112,192,113,191,114,22,33,40,50,77,255,141,48,237,48,149,231,75,4,208,231,73,37,76,224,170,224,8,225,102,225,196,225,34,226,202,126,104,136,148,92,32,122,25,149,192,109,196,79,189,139,153,117,60,155,137,85,65,140,236,103,254,93,119,83,189,91,6,116,230,83,108,154,153,94,123,99,109,95,72,121,60,116,111,143,171,142,175,133,167,150,251,109,90,102,254,150,171,78,184,139,231,121,252,127,185,121,130,118,149,103,42,115,137,145,232,78,25,89,103,150,140,87,60,131,211,132,196,99,20,85,215,86,180,114,237,95,169,108,36,111,89,92,147,154,229,115,103,104,107,143,207,137,96,129,73,121,4,119,208,148,111,149,230,117,37,128,125,135,156,123,71,126,116,142,176,156,220,158,128,226,222,226,60,227,154,227,248,227,86,228,180,228,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,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,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,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,135,79,164,80,190,81,245,82,129,84,233,85,246,86,43,88,24,89,78,90,53,91,138,92,142,93,174,94,227,95,53,97,45,98,157,99,195,100,209,101,232,102,52,104,74,105,70,106,24,107,60,108,177,109,206,110,208,111,198,112,193,113,192,114,6,38,41,50,78,255,142,48,238,48,59,254,76,4,209,231,74,37,77,224,171,224,9,225,103,225,197,225,35,226,166,144,214,156,238,93,1,97,45,100,191,107,157,152,73,89,114,82,225,139,175,79,59,109,177,120,75,123,226,126,62,107,78,103,228,78,130,154,153,89,245,95,236,132,65,121,119,122,46,150,241,109,145,102,95,121,107,88,150,118,100,102,121,152,196,132,104,103,204,127,135,91,118,112,185,117,248,139,0,103,225,78,85,81,108,150,178,87,52,131,202,132,222,99,243,84,221,86,183,114,248,95,208,108,21,111,113,91,150,154,217,115,64,104,109,143,208,137,105,129,91,121,13,119,209,148,113,149,228,117,38,128,126,135,162,123,155,126,133,142,177,156,221,158,129,226,223,226,61,227,155,227,249,227,87,228,181,228,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,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,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,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,138,79,166,80,191,81,246,82,131,84,237,85,247,86,44,88,27,89,79,90,54,91,139,92,143,93,175,94,229,95,54,97,47,98,158,99,196,100,211,101,234,102,53,104,75,105,72,106,25,107,62,108,179,109,208,110,211,111,199,112,194,113,197,114,5,38,110,231,79,255,143,48,239,48,60,254,77,4,210,231,75,37,78,224,172,224,10,225,104,225,198,225,36,226,46,94,139,97,231,139,121,123,190,143,137,120,185,139,228,81,105,151,120,118,52,115,25,79,119,120,164,101,133,100,33,83,204,145,156,110,27,86,17,133,24,90,218,104,145,154,203,121,74,133,32,90,217,102,89,91,48,117,203,96,105,114,247,93,87,145,108,98,206,126,237,139,229,113,202,139,219,139,106,127,235,78,160,78,114,150,207,87,49,131,191,132,206,99,34,85,225,86,184,114,25,96,212,108,249,110,99,92,152,154,124,152,62,104,113,143,209,137,124,129,92,121,249,118,210,148,114,149,235,117,39,128,123,135,171,123,184,158,143,142,178,156,224,158,130,226,224,226,62,227,156,227,250,227,88,228,182,228,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,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,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,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,140,79,170,80,193,81,247,82,133,84,238,85,248,86,45,88,29,89,80,90,56,91,142,92,144,93,176,94,230,95,55,97,48,98,159,99,198,100,212,101,235,102,54,104,76,105,73,106,26,107,63,108,180,109,210,110,212,111,201,112,196,113,198,114,203,37,111,231,80,255,144,48,240,48,55,254,78,4,211,231,1,232,79,224,173,224,11,225,105,225,199,225,37,226,134,104,43,82,198,98,199,78,84,123,252,83,37,90,91,79,91,132,66,104,60,84,107,112,227,98,209,145,43,101,80,123,164,156,9,116,23,84,109,112,127,145,124,120,119,141,24,78,94,116,197,126,114,127,95,99,28,117,155,91,255,82,97,106,217,83,111,79,53,131,189,127,35,141,7,151,16,144,10,92,222,78,86,81,116,150,167,87,155,131,186,132,82,100,35,85,245,86,195,114,53,96,173,108,47,111,102,92,155,154,10,116,74,104,114,143,110,114,125,129,83,121,7,119,213,148,115,149,231,117,41,128,96,135,180,123,180,158,148,142,179,156,223,158,131,226,225,226,63,227,157,227,251,227,89,228,183,228,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,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,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,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,142,79,171,80,194,81,248,82,135,84,240,85,251,86,46,88,30,89,81,90,57,91,143,92,145,93,177,94,232,95,56,97,49,98,161,99,199,100,213,101,236,102,58,104,77,105,74,106,27,107,67,108,182,109,214,110,213,111,203,112,197,113,199,114,207,37,96,33,81,255,145,48,241,48,56,254,79,4,212,231,2,232,80,224,174,224,12,225,106,225,200,225,38,226,156,105,42,118,244,103,248,126,41,118,213,150,118,96,38,84,60,104,220,103,154,83,183,131,97,99,202,78,137,98,194,114,60,121,180,105,203,87,17,108,31,158,247,123,130,92,177,144,16,149,94,121,0,135,11,123,108,96,73,90,161,82,207,80,237,101,161,117,107,131,137,115,233,98,47,99,249,122,117,144,27,79,179,78,136,150,180,87,94,131,224,132,198,99,15,85,235,86,193,114,38,96,247,108,54,111,188,127,156,154,233,115,73,104,115,143,159,114,109,129,90,121,8,119,214,148,58,149,3,118,40,128,112,135,209,123,115,141,144,142,180,156,226,158,132,226,226,226,64,227,158,227,252,227,90,228,184,228,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,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,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,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,144,79,173,80,195,81,251,82,136,84,241,85,252,86,47,88,32,89,82,90,58,91,146,92,146,93,178,94,233,95,57,97,50,98,164,99,200,100,216,101,237,102,59,104,78,105,75,106,28,107,68,108,183,109,216,110,214,111,204,112,198,113,201,114,206,37,97,33,82,255,146,48,242,48,49,254,175,231,213,231,3,232,81,224,175,224,13,225,107,225,201,225,39,226,128,129,108,95,122,140,133,119,83,98,203,81,132,83,43,89,228,134,234,141,25,80,22,98,128,123,37,109,152,99,70,104,137,131,107,120,112,78,191,98,63,92,168,129,94,78,3,116,240,149,136,108,205,158,209,132,20,130,7,78,159,96,17,84,143,94,138,127,224,86,223,87,25,82,71,149,219,112,40,102,243,78,110,136,141,150,147,87,47,131,161,132,190,99,17,85,249,86,206,114,27,96,248,108,75,111,42,95,157,154,231,115,41,104,117,143,93,114,103,129,98,121,26,119,215,148,231,119,241,117,49,128,76,135,193,123,132,141,156,142,181,156,233,158,133,226,227,226,65,227,159,227,253,227,91,228,185,228,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,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,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,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,146,79,174,80,197,81,252,82,137,84,244,85,0,87,49,88,33,89,83,90,59,91,147,92,147,93,180,94,236,95,58,97,53,98,166,99,201,100,217,101,238,102,63,104,79,105,76,106,29,107,69,108,185,109,217,110,215,111,205,112,199,113,202,114,199,37,98,33,83,255,147,48,243,48,150,231,176,231,214,231,4,232,82,224,176,224,14,225,108,225,202,225,40,226,209,126,140,101,0,100,17,78,39,89,1,82,124,98,119,101,1,150,53,141,14,84,209,96,237,79,95,137,20,80,255,119,84,131,143,153,166,158,191,118,79,99,11,103,1,79,66,108,166,109,161,91,32,159,173,104,70,129,85,129,239,139,97,140,92,117,11,109,183,107,139,130,253,108,53,150,110,113,230,93,34,79,164,136,151,150,160,87,79,131,185,132,69,100,39,85,255,86,205,114,15,96,241,108,116,111,41,95,159,154,222,115,181,104,118,143,102,114,77,88,87,121,34,119,217,148,236,119,252,117,11,128,110,135,204,123,148,141,158,142,182,156,231,158,134,226,228,226,66,227,160,227,254,227,92,228,186,228,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,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,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,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,147,79,175,80,200,81,253,82,138,84,246,85,1,87,50,88,34,89,84,90,60,91,149,92,148,93,186,94,239,95,59,97,54,98,171,99,202,100,218,101,239,102,71,104,80,105,77,106,30,107,72,108,186,109,219,110,216,111,206,112,200,113,203,114,198,37,99,33,84,255,114,231,244,48,51,254,177,231,215,231,5,232,83,224,177,224,15,225,109,225,203,225,41,226,210,104,210,111,186,99,237,129,70,84,137,99,79,144,164,128,148,150,61,82,124,84,13,151,106,82,39,125,53,114,54,119,15,84,89,117,86,83,79,101,66,128,79,158,47,84,218,86,229,130,118,90,94,92,6,85,17,99,106,108,20,102,39,132,100,96,51,150,243,151,193,144,60,141,184,132,196,98,80,79,100,79,181,78,176,150,213,87,71,131,180,132,65,100,42,85,4,87,210,114,13,96,215,108,42,111,45,95,160,154,186,115,143,104,120,143,111,114,181,90,96,121,25,119,216,148,201,150,255,117,53,128,139,135,221,123,145,141,120,140,183,156,229,158,135,226,229,226,67,227,161,227,255,227,93,228,187,228,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,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,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,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,149,79,176,80,202,81,1,83,141,84,248,85,2,87,51,88,35,89,86,90,61,91,157,92,149,93,187,94,240,95,60,97,56,98,175,99,203,100,219,101,241,102,75,104,81,105,78,106,31,107,75,108,187,109,220,110,217,111,207,112,201,113,204,114,161,37,100,33,85,255,115,231,245,48,52,254,178,231,216,231,6,232,84,224,178,224,16,225,110,225,204,225,42,226,197,120,232,110,73,135,29,82,121,107,10,84,2,145,117,91,236,148,138,143,78,78,39,141,207,81,38,149,201,137,247,101,23,104,24,82,200,143,175,96,125,91,103,99,81,89,75,145,49,95,26,117,47,103,41,127,97,103,139,115,153,113,93,120,110,125,39,108,52,150,1,84,14,96,35,99,169,119,222,103,245,78,20,129,151,144,216,87,67,131,151,132,11,100,103,85,10,87,232,114,41,96,178,108,9,111,116,130,162,154,242,115,116,104,119,143,126,114,136,129,111,121,45,119,219,148,213,121,16,118,67,128,83,135,218,123,177,141,130,140,186,156,234,158,136,226,230,226,68,227,162,227,0,228,94,228,188,228,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,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,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,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,150,79,177,80,205,81,2,83,145,84,249,85,5,87,52,88,38,89,87,90,62,91,158,92,150,93,188,94,242,95,61,97,57,98,177,99,204,100,220,101,245,102,77,104,82,105,79,106,37,107,76,108,188,109,221,110,218,111,208,112,202,113,207,114,160,37,101,33,86,255,116,231,246,48,151,231,179,231,217,231,7,232,85,224,179,224,17,225,111,225,205,225,43,226,140,134,190,91,139,153,250,81,163,80,147,148,127,153,118,98,42,78,218,110,253,95,120,121,80,131,197,78,179,81,181,81,61,78,36,118,9,129,253,149,110,85,176,120,12,120,197,108,146,100,190,128,240,143,16,116,226,143,161,78,144,103,4,151,127,90,240,78,251,89,71,144,158,88,65,119,49,86,90,80,37,79,210,136,155,144,218,87,95,131,229,132,27,100,143,85,9,87,239,114,43,96,224,108,41,111,60,95,163,154,15,116,119,104,121,143,127,114,130,129,103,121,38,119,222,148,237,121,0,118,70,128,99,135,229,123,103,141,138,140,187,156,239,158,137,226,231,226,69,227,163,227,1,228,95,228,189,228,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,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,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,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,152,79,179,80,206,81,3,83,147,84,250,85,7,87,54,88,40,89,88,90,63,91,159,92,151,93,189,94,243,95,62,97,58,98,178,99,207,100,221,101,246,102,79,104,83,105,81,106,38,107,77,108,189,109,227,110,219,111,209,112,203,113,209,114,179,37,102,33,87,255,117,231,125,231,152,231,180,231,218,231,8,232,86,224,180,224,18,225,112,225,206,225,44,226,81,149,72,100,23,140,113,106,52,98,3,140,105,96,194,98,4,84,205,104,90,116,251,81,219,105,40,140,192,139,143,78,137,83,65,109,146,119,14,102,74,149,111,87,104,86,139,141,18,109,78,97,17,104,34,125,58,119,137,103,127,137,74,82,234,126,210,117,31,84,187,85,142,97,129,95,59,78,92,79,39,79,128,121,157,144,217,87,64,131,227,132,32,100,181,85,28,87,233,114,10,96,214,108,137,111,59,155,165,154,42,116,147,104,122,143,132,114,145,129,122,121,53,119,223,148,227,121,5,118,77,128,124,135,230,123,109,141,133,140,188,156,34,159,138,226,232,226,70,227,164,227,2,228,96,228,190,228,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,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,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,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,153,79,180,80,208,81,4,83,151,84,251,85,11,87,55,88,44,89,89,90,65,91,160,92,152,93,191,94,244,95,64,97,59,98,181,99,209,100,222,101,248,102,82,104,85,105,82,106,40,107,78,108,190,109,231,110,220,111,210,112,204,113,211,114,178,37,103,33,88,255,118,231,126,231,153,231,181,231,219,231,9,232,87,224,181,224,19,225,113,225,207,225,45,226,141,80,117,81,32,127,168,83,38,94,204,141,12,128,144,143,217,126,5,149,246,88,62,87,116,146,219,143,221,126,212,118,177,82,243,103,146,153,159,135,77,149,18,120,20,108,58,83,40,132,23,110,95,103,1,149,243,141,81,127,82,120,238,84,237,126,123,81,246,148,234,92,254,102,240,114,87,132,80,87,9,79,52,91,153,144,210,87,23,131,12,133,12,100,73,85,15,94,242,114,63,96,250,108,141,111,110,92,167,154,91,116,107,104,124,143,139,114,213,110,133,121,56,119,224,148,235,121,12,118,82,128,100,135,234,123,71,140,152,140,189,156,44,159,139,226,233,226,71,227,165,227,3,228,97,228,191,228,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,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,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,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,154,79,181,80,210,81,7,83,152,84,252,85,12,87,56,88,48,89,91,90,66,91,161,92,154,93,192,94,246,95,65,97,60,98,182,99,211,100,223,101,250,102,86,104,86,105,83,106,41,107,79,108,193,109,234,110,221,111,211,112,205,113,212,114,59,32,104,33,89,255,119,231,127,231,154,231,182,231,220,231,10,232,88,224,182,224,20,225,114,225,208,225,46,226,36,140,176,81,242,148,135,142,134,107,57,114,63,81,69,94,57,104,237,144,107,132,250,87,245,141,115,151,71,87,191,92,62,120,109,81,238,134,35,158,133,109,57,151,196,143,198,134,110,129,240,88,13,98,64,98,52,141,128,95,253,119,163,86,105,143,55,104,235,109,161,95,96,141,137,78,241,103,167,94,43,79,3,136,172,144,184,87,96,131,13,117,38,100,109,85,25,94,244,114,33,96,235,108,140,111,129,89,159,126,38,116,194,104,126,143,141,114,163,129,138,121,80,119,226,148,6,122,23,118,105,128,89,135,12,124,73,140,148,140,196,156,47,159,140,226,234,226,72,227,166,227,4,228,98,228,192,228,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,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,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,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,156,79,182,80,211,81,9,83,156,84,255,85,13,87,57,88,50,89,92,90,67,91,164,92,155,93,193,94,247,95,66,97,66,98,185,99,212,100,225,101,251,102,87,104,88,105,84,106,42,107,81,108,194,109,235,110,223,111,212,112,207,113,213,114,146,33,105,33,90,255,120,231,128,231,155,231,183,231,221,231,11,232,89,224,183,224,21,225,115,225,209,225,47,226,222,130,196,103,167,78,4,149,227,78,159,120,51,128,31,108,223,141,253,86,225,128,58,103,49,141,75,102,204,131,165,122,134,83,153,159,225,110,237,148,168,96,121,98,3,95,242,102,195,156,31,117,214,122,76,88,193,148,250,101,112,102,0,149,167,85,62,111,197,91,8,97,78,98,20,96,169,82,16,232,94,79,184,127,161,144,244,87,45,131,56,133,33,100,65,85,20,94,247,114,120,96,238,108,120,111,131,89,161,126,37,116,110,105,129,143,143,114,170,129,154,121,81,119,228,148,71,93,10,118,113,128,101,135,254,123,74,145,155,101,197,156,57,159,141,226,235,226,73,227,167,227,5,228,99,228,193,228,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,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,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,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,158,79,183,80,212,81,10,83,158,84,2,86,14,87,58,88,51,89,93,90,68,91,165,92,156,93,194,94,249,95,67,97,68,98,187,99,213,100,227,101,253,102,88,104,89,105,85,106,43,107,82,108,195,109,236,110,226,111,213,112,208,113,214,114,144,33,106,33,91,255,121,231,129,231,156,231,184,231,222,231,12,232,90,224,184,224,22,225,116,225,210,225,48,226,222,128,25,78,16,150,207,150,55,141,118,135,20,92,38,123,21,128,156,103,116,135,120,117,193,137,129,121,167,148,117,132,41,82,75,128,19,133,13,84,224,103,171,98,125,108,175,142,94,88,37,117,133,88,214,78,22,94,27,103,59,86,136,109,163,91,128,144,110,153,50,107,179,85,116,101,192,134,17,232,103,79,171,81,180,144,239,87,58,131,240,132,94,100,85,85,17,94,1,115,121,96,177,108,114,111,141,89,163,126,40,116,252,104,130,143,146,114,204,129,167,121,71,119,229,148,3,122,37,118,131,137,147,135,252,123,80,145,214,137,198,156,55,159,142,226,236,226,74,227,168,227,6,228,100,228,194,228,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,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,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,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,159,79,184,80,213,81,11,83,159,84,3,86,15,87,59,88,53,89,94,90,69,91,166,92,158,93,195,94,250,95,68,97,69,98,189,99,214,100,228,101,1,103,89,104,91,105,86,106,44,107,83,108,200,109,237,110,227,111,214,112,209,113,216,114,145,33,107,33,92,255,122,231,130,231,157,231,185,231,223,231,13,232,91,224,185,224,23,225,117,225,211,225,49,226,5,83,201,121,164,152,193,110,139,136,237,143,117,153,15,79,244,102,249,136,208,114,61,122,46,149,209,143,155,81,78,89,136,80,153,84,252,102,125,84,222,114,136,82,227,108,72,92,91,141,114,114,182,94,131,91,133,83,216,95,56,84,181,91,172,96,112,129,57,92,241,114,35,110,239,98,46,141,18,232,56,101,177,81,179,144,248,87,51,131,57,133,132,100,63,85,49,94,243,114,123,96,211,108,124,111,169,89,165,126,48,116,31,105,132,143,8,99,38,103,179,121,67,119,231,148,2,122,24,118,120,152,175,135,15,124,78,145,222,137,199,156,61,159,143,226,237,226,75,227,169,227,7,228,101,228,195,228,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,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,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,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,161,79,185,80,214,81,12,83,160,84,4,86,16,87,60,88,54,89,95,90,70,91,167,92,159,93,196,94,252,95,69,97,70,98,191,99,217,100,234,101,2,103,90,104,92,105,87,106,45,107,86,108,201,109,238,110,228,111,215,112,210,113,218,114,147,33,112,231,93,255,123,231,131,231,158,231,186,231,224,231,14,232,92,224,186,224,24,225,118,225,212,225,50,226,18,137,124,153,12,102,100,150,133,95,13,140,49,109,216,79,154,94,199,143,202,124,239,121,173,123,236,112,27,84,65,155,139,79,60,123,98,97,44,140,221,81,53,116,171,139,113,154,9,78,71,83,112,101,121,89,44,84,132,89,33,149,198,109,203,101,150,89,21,95,178,128,45,103,99,107,248,148,19,232,90,79,189,81,182,144,228,87,102,131,31,133,109,100,80,85,59,94,3,115,122,96,239,108,122,111,170,89,168,126,46,116,32,105,135,143,50,99,202,129,209,95,90,119,232,148,30,122,21,118,128,152,168,135,22,124,79,145,218,137,202,156,62,159,144,226,238,226,76,227,170,227,8,228,102,228,196,228,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,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,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,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,162,79,188,80,215,81,14,83,161,84,5,86,17,87,61,88,59,89,96,90,71,91,168,92,160,93,197,94,7,96,70,97,74,98,192,99,218,100,235,101,3,103,91,104,95,105,90,106,46,107,88,108,202,109,239,110,229,111,218,112,211,113,219,114,19,48,113,231,227,255,124,231,132,231,159,231,187,231,225,231,15,232,93,224,187,224,25,225,119,225,213,225,51,226,101,82,179,112,22,115,90,105,46,144,224,83,140,78,13,103,185,127,200,84,86,110,149,123,246,78,120,109,251,92,128,80,208,79,191,122,43,111,120,100,129,91,215,107,144,99,32,110,193,83,243,126,49,111,84,88,195,112,1,90,122,114,83,102,132,115,118,116,144,150,137,138,103,143,63,101,81,123,20,232,93,79,188,81,186,144,221,87,101,131,58,133,150,100,60,85,60,94,250,114,66,96,254,108,209,111,163,89,169,126,44,116,249,104,139,143,176,99,187,129,208,95,104,119,234,148,20,122,25,118,131,152,210,135,11,124,100,145,220,137,203,156,68,159,145,226,239,226,77,227,171,227,9,228,103,228,197,228,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,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,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,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,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,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,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,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,};\r\n"
  },
  {
    "path": "rlib/ralgo.h",
    "content": "﻿#ifndef ralgo_h__\r\n#define ralgo_h__\r\n\r\n#include \"rbuf.h\"\r\n#include <new>\r\n\r\ntemplate<class T>\r\nT* r_new(int count=1)\r\n{\r\n\tT* p=(T*)malloc(sizeof(int)+count*sizeof(T));\r\n\tif(p==null)\r\n\t{\r\n\t\t//这里如果调用rf::error(rstr s)会导致代码膨胀90K\r\n\t\trf::print(\"memory insufficient\");\r\n\t\texit(1);\r\n\t\treturn null;\r\n\t}\r\n\t*(int*)p=count;\r\n\tp=(T*)((uchar*)p+sizeof(int));\r\n\tT* start=p;\r\n\tT* end=start+count;\r\n\tfor(;p<end;p++)\r\n\t{\r\n\t\tnew(p)T();//((T*)p)->T::T();\r\n\t}\r\n\treturn start;\r\n}\r\n\r\ntemplate<class T>\r\nT* r_new_n(int count=1)\r\n{\r\n\tT* p=(T*)malloc(sizeof(int)+count*sizeof(T));\r\n\tif(p==null)\r\n\t{\r\n\t\trf::print(\"memory insufficient\");\r\n\t\texit(1);\r\n\t\treturn null;\r\n\t}\r\n\t*(int*)p=count;\r\n\treturn (T*)((uchar*)p+sizeof(int));\r\n}\r\n\r\ntemplate<class T>\r\nvoid r_delete(T* p)\r\n{\r\n\tuchar* start=(uchar*)p-sizeof(int);\r\n\tT* end=p+*(int*)start;\r\n\tfor(;p<end;p++)\r\n\t{\r\n\t\tp->~T();\r\n\t}\r\n\tfree(start);\r\n}\r\n\r\ntemplate<class T>\r\nvoid r_delete_n(T* p)//这里模板参数没用\r\n{\r\n\tfree((uchar*)p-sizeof(int));\r\n}\r\n\r\n//模板特化放在头文件里只能包含一次\r\n//如果注释掉这4个特化int、char等内置类型会初始化为0，效率略低\r\ntemplate<>\r\nuchar* r_new<uchar>(int count)\r\n{\r\n\treturn r_new_n<uchar>(count);\r\n}\r\n\r\ntemplate<>\r\nvoid r_delete<uchar>(uchar* p)\r\n{\r\n\tr_delete_n<uchar>(p);\r\n}\r\n\r\ntemplate<>\r\nushort* r_new<ushort>(int count)\r\n{\r\n\treturn r_new_n<ushort>(count);\r\n}\r\n\r\ntemplate<>\r\nvoid r_delete<ushort>(ushort* p)\r\n{\r\n\tr_delete_n<ushort>(p);\r\n}\r\n\r\n//binary search\r\ntemplate<class V, class T>\r\nint r_find_pos_b(const V& v,const T& a)\r\n{\r\n\tint left=0;\r\n\tint right=v.count()-1;\r\n\tint mid;\r\n\twhile(left<=right)\r\n\t{\r\n\t\tmid=(left+right)/2;\r\n\t\tif(v[mid]<a)\r\n\t\t\tleft=mid+1;\r\n\t\telif(a<v[mid])\r\n\t\t\tright=mid-1;\r\n\t\telse\r\n\t\t\treturn mid;\r\n\t}\r\n\treturn v.count();\r\n}\r\n\r\ntemplate<class T>\r\nrbool r_not_equal(const T& a,const T& b)\r\n{\r\n\treturn a<b||b<a;\r\n}\r\n\r\ntemplate<class T>\r\nvoid r_swap(T& a,T& b)\r\n{\r\n\tT temp(r_move(a));\r\n\ta=r_move(b);\r\n\tb=r_move(temp);\r\n}\r\n\r\ntemplate<class V>\r\nvoid r_reverse(V& v,int begin=0,int end=0)\r\n{\r\n\tif(end<=0)\r\n\t{\r\n\t\tend=v.count();\r\n\t}\r\n\tif(begin<0)\r\n\t{\r\n\t\tbegin=0;\r\n\t}\r\n\tV temp=v.sub(begin,end);\r\n\tint i=end-1;\r\n\tint j=0;\r\n\tfor(;i>=begin;--i,++j)\r\n\t\tv[i]=r_move(temp[j]);\r\n}\r\n\r\ntemplate<class V,class T>\r\nrbool r_is_all_element(const V& v,const T& a)\r\n{\r\n\tfor(int i=0;i<v.count();i++)\r\n\t\tif(v[i]!=a)\r\n\t\t\treturn false;\r\n\treturn true;\r\n}\r\n\r\ntemplate<class T>\r\nvoid r_qsort_in(rbuf<T>& v,int left,int right)\r\n{\r\n\tif(left<right)\r\n\t{\r\n\t\tT pivot=v[right];\r\n\t\tint i=left;\r\n\t\tfor(int j=left;j<right;j++)\r\n\t\t{\r\n\t\t\tif(v[j]<=pivot)\r\n\t\t\t{\r\n\t\t\t\tr_swap<T>(v[i],v[j]);\r\n\t\t\t\ti++;\r\n\t\t\t}\r\n\t\t}\r\n\t\tr_swap<T>(v[i],v[right]);\r\n\t\tr_qsort_in<T>(v,left,i-1);\r\n\t\tr_qsort_in<T>(v,i+1,right);\r\n\t}\r\n}\r\n\r\ntemplate<class T>\r\nvoid r_qsort(rbuf<T>& v,int begin=0,int end=0)\r\n{\r\n\tif(end<=0)\r\n\t{\r\n\t\tend=v.count();\r\n\t}\r\n\tif(begin<0)\r\n\t{\r\n\t\tbegin=0;\r\n\t}\r\n\tif(begin+1<end)\r\n\t\tr_qsort_in(v,begin,end-1);\r\n}\r\n\r\ntemplate<class V,class T>\r\nT* r_find(const V& v,const T& a)\r\n{\r\n\tT* p;\r\n\tfor(p=v.begin();p!=v.end();p=v.next(p))\r\n\t\tif(*p==a)\r\n\t\t\treturn p;\r\n\treturn null;\r\n}\r\n\r\ntemplate<class V,class T>\r\nint r_find_pos(const V& v,T a,int start=0)\r\n{\r\n\tT* p;\r\n\tfor(p=v.begin()+start;p!=v.end();p=v.next(p))\r\n\t\tif(*p==a)\r\n\t\t\treturn v.pos(p);\r\n\treturn v.count();\r\n}\r\n\r\ntemplate<class V,class T>\r\nint r_find_pos_rev(const V& v,const T& a)\r\n{\r\n\tfor(int i=v.count()-1;i>=0;--i)\r\n\t\tif(v[i]==a)\r\n\t\t\treturn i;\r\n\treturn v.count();\r\n}\r\n\r\ntemplate<class V>\r\nint r_find_pos(const V& v,const V& m,int start=0)\r\n{\r\n\tif(m.empty()||start>=v.count())\r\n\t{\r\n\t\treturn v.count();\r\n\t}\r\n\tfor(int i=start;i<v.count()-m.count()+1;i++)\r\n\t{\r\n\t\tif(v[i]!=m[0])\r\n\t\t{\r\n\t\t\tcontinue;\r\n\t\t}\r\n\t\tint j;\r\n\t\tfor(j=0;j<m.count();j++)\r\n\t\t{\r\n\t\t\tif(v[i+j]!=m[j])\r\n\t\t\t{\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t}\r\n\t\tif(j>=m.count())\r\n\t\t{\r\n\t\t\treturn i;\r\n\t\t}\r\n\t}\r\n\treturn v.count();\r\n}\r\n\r\ntemplate<class V>\r\nrbuf<V> r_split(const V& v,const V& m,int start=0)\r\n{\r\n\trbuf<V> result;\r\n\tV temp;\r\n\tint i;\r\n\twhile(start<v.count())\r\n\t{\r\n\t\tint pos=r_find_pos(v,m,start);\r\n\t\tif(pos>=v.count())\r\n\t\t\tbreak;\r\n\t\ttemp.clear();\r\n\t\tfor(i=start;i<pos;i++)\r\n\t\t\ttemp+=v[i];\r\n\t\tif(!temp.empty())\r\n\t\t\tresult.push_move(temp);\r\n\t\tstart=pos+m.count();\r\n\t}\r\n\ttemp.clear();\r\n\tfor(i=start;i<v.count();i++)\r\n\t\ttemp+=v[i];\r\n\tif(!temp.empty())\r\n\t\tresult.push_move(temp);\r\n\treturn r_move(result);\r\n}\r\n\r\ntemplate<class V,class T>\r\nrbuf<V> r_split(const V& v,const T& a,int start=0)\r\n{\r\n\treturn r_split(v,V(1,a),start);\r\n}\r\n\r\n//允许空元素\r\ntemplate<class V>\r\nrbuf<V> r_split_e(const V& v,const V& m,int start=0)\r\n{\r\n\trbuf<V> result;\r\n\tV temp;\r\n\tint i;\r\n\twhile(start<v.count())\r\n\t{\r\n\t\tint pos=r_find_pos(v,m,start);\r\n\t\tif(pos>=v.count())\r\n\t\t\tbreak;\r\n\t\ttemp.clear();\r\n\t\tfor(i=start;i<pos;i++)\r\n\t\t\ttemp+=v[i];\r\n\t\tresult.push_move(temp);\r\n\t\tstart=pos+m.count();\r\n\t}\r\n\ttemp.clear();\r\n\tfor(i=start;i<v.count();i++)\r\n\t\ttemp+=v[i];\r\n\tresult.push_move(temp);\r\n\treturn r_move(result);\r\n}\r\n\r\ntemplate<class V,class T>\r\nrbuf<V> r_split_e(const V& v,const T& a,int start=0)\r\n{\r\n\treturn r_split_e(v,V(1,a),start);\r\n}\r\n\r\n#endif\r\n"
  },
  {
    "path": "rlib/rbase.h",
    "content": "﻿#ifndef rbase_h__\r\n#define rbase_h__\r\n\r\n#ifdef _MSC_VER\r\n\r\n//#define _CRT_SECURE_NO_DEPRECATE\r\n//#pragma warning(disable:4127)\r\n//#pragma warning(disable:4390)\r\n//#pragma warning(disable:4710)\r\n#pragma warning(disable:4996)\r\n#pragma warning(disable:4345)\r\n\r\n#include <windows.h>\r\n#include <wchar.h>\r\n#else\r\n#endif\r\n\r\n#ifndef int64\r\n#ifdef _MSC_VER\r\ntypedef __int64 int64;\r\ntypedef unsigned __int64 uint64;\r\n#else\r\ntypedef long long int64;\r\ntypedef unsigned long long uint64;\r\n#endif\r\n\r\ntypedef int64 int8;\r\n\r\n#endif\r\n\r\n#ifndef uint\r\ntypedef unsigned int uint;\r\n#endif\r\n\r\n#ifndef ushort\r\ntypedef unsigned short ushort;\r\n#endif\r\n\r\n#ifndef uchar\r\ntypedef unsigned char uchar;\r\n#endif\r\n\r\n#ifndef rbool\r\ntypedef int rbool;\r\n#endif\r\n\r\n#ifndef wchar\r\n#ifdef _MSC_VER\r\ntypedef wchar_t wchar;\r\n#else\r\ntypedef ushort wchar;\r\n#endif\r\n#endif\r\n\r\n//#define NEW new(nothrow)\r\n\r\n#ifndef null\r\n#if _MSC_VER >= 1700 \r\n#define null nullptr\r\n#else\r\n#define null NULL\r\n#endif\r\n#endif\r\n\r\n#include <utility>\r\n\r\n#define elif else if\r\n#define ifn(a) if(!(a))\r\n\r\n#define r_size(a) ((int)sizeof(a))\r\n#define r_move(a) std::move(a)\r\n#define r_max(a,b) ((a)>(b)?(a):(b))\r\n#define r_min(a,b) ((a)>(b)?(b):(a))\r\n#define r_cond(cond,a,b) ((cond)?(a):(b))\r\n#define r_ceil_div(a,b) (0==(a)%(b)?(a)/(b):(a)/(b)+1)\r\n\r\n#define r_to static_cast\r\n\r\n#define r_to_int(a) ((int)(a))\r\n#define r_to_uint(a) ((uint)(a))\r\n#define r_to_char(a) ((char)(a))\r\n#define r_to_uchar(a) ((uchar)(a))\r\n#define r_to_int8(a) ((int8)(a))\r\n#define r_to_double(a) ((double)(a))\r\n\r\n#define r_to_pint(a) ((int*)(a))\r\n#define r_to_puint(a) ((uint*)(a))\r\n#define r_to_pchar(a) ((char*)(a))\r\n#define r_to_puchar(a) ((uchar*)(a))\r\n#define r_to_pint8(a) ((int8*)(a))\r\n#define r_to_pdouble(a) ((double*)(a))\r\n#define r_to_prstr(a) ((rstr*)(a))\r\n\r\n#define AND(a,b) ((a)&(b))\r\n#define OR(a,b) ((a)|(b))\r\n#define XOR(a,b) ((a)^(b))\r\n#define NOT(a) (~(a))\r\n\r\n#endif\r\n"
  },
  {
    "path": "rlib/rbuf.h",
    "content": "﻿#ifndef rbuf_h__\r\n#define rbuf_h__\r\n\r\n#include \"rbase.h\"\r\n#include <stdio.h>\r\n#include <string.h>\r\n\r\n//#define r_round(d) ((uint)(d+0.5))\r\n//#define r_log(a,b) (log(b)/log(a))\r\n\r\ntemplate<typename T>\r\nstruct rbuf\r\n{\r\n\tenum\r\n\t{\r\n\t\tc_small=16\r\n\t};\r\n\r\n\tT* m_p;\r\n\tint m_count;\r\n\tint m_cmax;\r\n\tuchar m_block[c_small];\r\n\t//当分配小内存时，m_p指向m_block，无需new可提高效率\r\n\r\n\t~rbuf<T>()\r\n\t{\r\n\t\tfree();\r\n\t}\r\n\r\n\trbuf<T>()\r\n\t{\r\n\t\tinit();\r\n\t}\r\n\r\n\trbuf<T>(int num)\r\n\t{\r\n\t\tinit();\r\n\t\talloc(num);\r\n\t}\r\n\r\n\trbuf<T>(int num,const T& a)\r\n\t{\r\n\t\tinit();\r\n\t\talloc(num);\r\n\t\tfor(int i=0;i<num;i++)\r\n\t\t{\r\n\t\t\tm_p[i]=a;\r\n\t\t}\r\n\t}\r\n\r\n\trbuf<T>(const rbuf<T>& a)\r\n\t{\r\n\t\tinit();\r\n\t\tcopy(a);\r\n\t}\r\n\r\n\trbuf<T>(rbuf<T>&& a)\r\n\t{\r\n\t\tmove(a);\r\n\t}\r\n\r\n\tvoid move(rbuf<T>& a)\r\n\t{\r\n\t\tif(a.m_p==(T*)a.m_block)\r\n\t\t{\r\n\t\t\tmemcpy(this,&a,sizeof(a));\r\n\t\t\tm_p=(T*)m_block;\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tm_p=a.m_p;\r\n\t\t\tm_count=a.m_count;\r\n\t\t\tm_cmax=a.m_cmax;\r\n\t\t}\r\n\t\ta.init();//如果move后对象不再使用可以只置空a.m_p\r\n\t}\r\n\r\n\t//如果复制指针一定要处理好等于号，不支持自己复制自己\r\n\tvoid operator=(const rbuf<T>& a)\r\n\t{\r\n\t\tif(a.m_p==m_p)\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tcopy(a);\r\n\t}\r\n\r\n\tvoid operator=(rbuf<T>&& a)\r\n\t{\r\n\t\tfree();\r\n\t\tmove(a);\r\n\t}\r\n\r\n\tfriend rbuf<T> operator+(const rbuf<T>& a,const rbuf<T>& b)\r\n\t{\r\n\t\tint total=a.count()+b.count();\r\n\t\tint max=r_max(a.m_cmax,b.m_cmax);\r\n\t\trbuf<T> ret;\r\n\t\tif(total>max)\r\n\t\t{\r\n\t\t\tret.alloc_not_change(extend_num(total));\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tret.alloc_not_change(max);\r\n\t\t}\r\n\t\tint i;\r\n\t\tfor(i=0;i<a.count();i++)\r\n\t\t{\r\n\t\t\tret[i]=a[i];\r\n\t\t}\r\n\t\tfor(i=0;i<b.count();i++)\r\n\t\t{\r\n\t\t\tret[i+a.count()]=b[i];\r\n\t\t}\r\n\t\tret.m_count=total;\r\n\t\treturn r_move(ret);\r\n\t}\r\n\r\n\tvoid operator+=(const rbuf<T>& a)\r\n\t{\r\n\t\tint total=a.count()+count();\r\n\t\tif(total>m_cmax)\r\n\t\t{\r\n\t\t\trealloc_not_change(extend_num(total));\r\n\t\t}\r\n\t\tfor(int i=count();i<total;i++)\r\n\t\t{\r\n\t\t\tm_p[i]=a[i-count()];\r\n\t\t}\r\n\t\tm_count=total;\r\n\t}\r\n\r\n\tvoid operator+=(rbuf<T>&& a)\r\n\t{\r\n\t\tint total=a.count()+count();\r\n\t\tif(total>m_cmax)\r\n\t\t{\r\n\t\t\trealloc_not_change(extend_num(total));\r\n\t\t}\r\n\t\tfor(int i=count();i<total;i++)\r\n\t\t{\r\n\t\t\tm_p[i]=r_move(a[i-count()]);\r\n\t\t}\r\n\t\tm_count=total;\r\n\t}\r\n\r\n\tvoid operator+=(const T& a)\r\n\t{\r\n\t\tthis->push(a);\r\n\t}\r\n\r\n\tvoid operator+=(T&& a)\r\n\t{\r\n\t\tthis->push(a);\r\n\t}\r\n\r\n\tT& operator[](int num) const\r\n\t{\r\n\t\treturn m_p[num];\r\n\t}\r\n\r\n\tfriend rbool operator==(const rbuf<T>& a,const rbuf<T>& b)\r\n\t{\r\n\t\tif(a.count()!=b.count())\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\tfor(int i=0;i<a.count();++i)\r\n\t\t{\r\n\t\t\tif(a[i]!=b[i])\r\n\t\t\t{\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn true;\r\n\t}\r\n\r\n\tfriend rbool operator!=(const rbuf<T>& a,const rbuf<T>& b)\r\n\t{\r\n\t\treturn !(a==b);\r\n\t}\r\n\r\n\tvoid init()\r\n\t{\r\n\t\tm_p=null;\r\n\t\tm_count=0;\r\n\t\tm_cmax=0;\r\n\t}\r\n\r\n\tstatic T* next(void* p)\r\n\t{\r\n\t\treturn ((T*)p)+1;\r\n\t}\r\n\r\n\tstatic T* prev(void* p)\r\n\t{\r\n\t\treturn ((T*)p)-1;\r\n\t}\r\n\r\n\tint size() const \r\n\t{\r\n\t\treturn m_count*r_size(T);\r\n\t}\r\n\r\n\tint count() const\r\n\t{\r\n\t\treturn m_count;\r\n\t}\r\n\r\n\tT* pos(int num) const \r\n\t{\r\n\t\treturn begin()+num;\r\n\t}\r\n\r\n\tint pos(void* p) const \r\n\t{\r\n\t\treturn r_to_int((T*)p-begin());\r\n\t}\r\n\r\n\tT* begin() const \r\n\t{\r\n\t\treturn m_p;\r\n\t}\r\n\r\n\tT* end() const \r\n\t{\r\n\t\treturn m_p+count();\r\n\t}\r\n\r\n\tT* rbegin() const \r\n\t{\r\n\t\tif(0==m_count)\r\n\t\t{\r\n\t\t\treturn null;\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\treturn m_p+count()-1;\r\n\t\t}\r\n\t}\r\n\r\n\tT* rend() const \r\n\t{\r\n\t\tif(0==m_count)\r\n\t\t{\r\n\t\t\treturn null;\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\treturn m_p-1;\r\n\t\t}\r\n\t}\r\n\r\n\trbool empty() const \r\n\t{\r\n\t\treturn 0==m_count;\r\n\t}\r\n\r\n\tvoid clear()\r\n\t{\r\n\t\tm_count=0;\r\n\t}\r\n\r\n\tstatic int extend_num(int num)\r\n\t{\r\n\t\treturn r_cond(num<c_small,c_small,num*2);\r\n\t}\r\n\t\r\n\t//应判断m_count是否太大,否则在64位上m_count++有可能归零\r\n\tvoid push(const T& a)\r\n\t{\r\n\t\tif(m_count>=m_cmax)\r\n\t\t{\r\n\t\t\trealloc_not_change(extend_num(m_count));\r\n\t\t}\r\n\t\tm_p[count()]=a;\r\n\t\tm_count++;\r\n\t}\r\n\r\n\tvoid push(T&& a)\r\n\t{\r\n\t\tif(m_count>=m_cmax)\r\n\t\t{\r\n\t\t\trealloc_not_change(extend_num(m_count));\r\n\t\t}\r\n\t\tm_p[count()]=a;\r\n\t\tm_count++;\r\n\t}\r\n\r\n\tvoid push_move(T& a)\r\n\t{\r\n\t\tpush(r_move(a));\r\n\t}\r\n\r\n\tT pop()\r\n\t{\r\n\t\t/*if(0==m_count)\r\n\t\t\texit(0);*/\r\n\t\tm_count--;\r\n\t\treturn m_p[count()];\r\n\t}\r\n\r\n\tT pop_front()\r\n\t{\r\n\t\tT ret=r_move(m_p[0]);\r\n\t\terase(0);\r\n\t\treturn r_move(ret);\r\n\t}\r\n\r\n\t//没必要增加push_front的move版本\r\n\tvoid push_front(const T& a)\r\n\t{\r\n\t\tinsert(0,a);\r\n\t}\r\n\r\n\tT& top() const \r\n\t{\r\n\t\treturn m_p[count()-1];\r\n\t}\r\n\r\n\tT& bottom() const \r\n\t{\r\n\t\treturn m_p[0];\r\n\t}\r\n\r\n\tT get_top() const \r\n\t{\r\n\t\tif(count()>0)\r\n\t\t{\r\n\t\t\treturn m_p[count()-1];\r\n\t\t}\r\n\t\treturn T();\r\n\t}\r\n\r\n\tT get_bottom() const \r\n\t{\r\n\t\tif(count()>0)\r\n\t\t{\r\n\t\t\treturn m_p[0];\r\n\t\t}\r\n\t\treturn T();\r\n\t}\r\n\r\n\trbool erase(int num)\r\n\t{\r\n\t\tif(num>=count()||num<0)\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\tfor(int i=num;i<count()-1;++i)\r\n\t\t{\r\n\t\t\t*(m_p+i)=r_move(*(m_p+i+1));\r\n\t\t}\r\n\t\tm_count--;\r\n\t\treturn true;\r\n\t}\r\n\r\n\trbool erase(int begin,int end)\r\n\t{\r\n\t\tif(begin<0||end>count()||begin>=end)\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\tfor(int i=0;i<count()-end;i++)//count()-(end-begin)-begin\r\n\t\t{\r\n\t\t\tm_p[i+begin]=r_move(m_p[end+i]);//删除的元素稍后析构\r\n\t\t}\r\n\t\tm_count-=end-begin;\r\n\t\treturn true;\r\n\t}\r\n\r\n\trbool insert(int pos,const T& a)\r\n\t{\r\n\t\tif(pos>count()||pos<0)\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\tif(m_count>=m_cmax)\r\n\t\t{\r\n\t\t\trealloc_not_change(extend_num(m_count));\r\n\t\t}\r\n\t\tfor(int i=count();i>pos;--i)\r\n\t\t{\r\n\t\t\tm_p[i]=r_move(m_p[i-1]);\r\n\t\t}\r\n\t\tm_p[pos]=a;\r\n\t\tm_count++;\r\n\t\treturn true;\r\n\t}\r\n\r\n\trbool insert(int pos,const rbuf<T>& a)\r\n\t{\r\n\t\tif(pos>count()||pos<0||0==a.count())\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\tif(m_cmax<m_count+a.count())\r\n\t\t{\r\n\t\t\trealloc_not_change(a.count()+count());\r\n\t\t}\r\n\t\tfor(int i=0;i<count()-pos;i++)\r\n\t\t{\r\n\t\t\tm_p[a.count()+count()-1-i]=r_move(m_p[count()-1-i]);\r\n\t\t}\r\n\t\tfor(int i=0;i<a.count();i++)\r\n\t\t{\r\n\t\t\tm_p[pos+i]=a[i];\r\n\t\t}\r\n\t\tm_count+=a.count();\r\n\t\treturn true;\r\n\t}\r\n\r\n\tT* v_new(int num)\r\n\t{\r\n\t\treturn r_cond(num*sizeof(T)<=c_small,(T*)m_block,r_new<T>(num));\r\n\t}\r\n\r\n\tvoid v_delete()\r\n\t{\r\n\t\tif(m_p!=(T*)m_block)\r\n\t\t\tr_delete<T>(m_p);\r\n\t}\r\n\r\n\t//这里的重复代码可用宏或者模板简化\r\n\tvoid alloc(int num)\r\n\t{\r\n\t\tif(m_p!=null)\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tif(num<=0)\r\n\t\t{\r\n\t\t\tinit();\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tm_p=v_new(num);\r\n\t\tm_cmax=num;\r\n\t\tm_count=m_cmax;\r\n\t}\r\n\r\n\tvoid alloc_not_change(int num)\r\n\t{\r\n\t\tif(m_p!=null)\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tif(num<=0)\r\n\t\t{\r\n\t\t\tinit();\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tm_p=v_new(num);\r\n\t\tm_cmax=num;\r\n\t}\r\n\r\n\tvoid realloc(int num)\r\n\t{\r\n\t\tif(null==m_p)\r\n\t\t{\r\n\t\t\talloc(num);\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tif(num<=0)\r\n\t\t{\r\n\t\t\tfree();\r\n\t\t\treturn;\r\n\t\t}\r\n\t\trealloc_not_change_in(num);\r\n\t\tm_count=m_cmax;\r\n\t}\r\n\r\n\tvoid realloc_not_change(int num)\r\n\t{\r\n\t\tif(null==m_p)\r\n\t\t{\r\n\t\t\talloc_not_change(num);\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tif(num<=0)\r\n\t\t{\r\n\t\t\tfree();\r\n\t\t\treturn;\r\n\t\t}\r\n\t\trealloc_not_change_in(num);\r\n\t}\r\n\r\n\tvoid realloc_not_change_in(int num)\r\n\t{\r\n\t\tT* p=v_new(num);\r\n\t\tint copy_size=r_min(num,m_count);\r\n\t\tfor(int i=0;i<copy_size;i++)\r\n\t\t{\r\n\t\t\tp[i]=r_move(m_p[i]);\r\n\t\t}\r\n\t\tv_delete();\r\n\t\tm_p=p;\r\n\t\tm_cmax=num;\r\n\t}\r\n\t\r\n\t//不复制原有的元素\r\n\tvoid realloc_n(int num)\r\n\t{\r\n\t\tif(null==m_p)\r\n\t\t{\r\n\t\t\talloc(num);\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tif(num<=0)\r\n\t\t{\r\n\t\t\tfree();\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tv_delete();\r\n\t\tm_p=v_new(num);\r\n\t\tm_cmax=num;\r\n\t\tm_count=m_cmax;\r\n\t}\r\n\r\n\tvoid realloc_n_not_change(int num)\r\n\t{\r\n\t\tif(null==m_p)\r\n\t\t{\r\n\t\t\talloc_not_change(num);\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tif(num<=0)\r\n\t\t{\r\n\t\t\tfree();\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tv_delete();\r\n\t\tm_p=v_new(num);\r\n\t\tm_cmax=num;\r\n\t}\r\n\r\n\tvoid free()\r\n\t{\r\n\t\tif(null==m_p)//m_p为空时rbuf必须保证m_count和m_cmax也为空\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tv_delete();\r\n\t\tinit();\r\n\t}\r\n\r\n\tvoid copy(const rbuf<T>& a)\r\n\t{\r\n\t\tif(m_cmax<a.count())\r\n\t\t{\r\n\t\t\trealloc_n_not_change(a.m_cmax);\r\n\t\t}\r\n\t\tfor(int i=0;i<a.count();i++)\r\n\t\t{\r\n\t\t\tm_p[i]=a[i];\r\n\t\t}\r\n\t\tm_count=a.count();\r\n\t}\r\n\r\n\tT get(int i) const\r\n\t{\r\n\t\tif((uint)i>=(uint)count())\r\n\t\t{\r\n\t\t\treturn T();\r\n\t\t}\r\n\t\telse \r\n\t\t{\r\n\t\t\treturn m_p[i];\r\n\t\t}\r\n\t}\r\n\r\n\trbuf<T> sub(int begin,int end) const \r\n\t{\r\n\t\tif(end>count())\r\n\t\t{\r\n\t\t\tend=count();\r\n\t\t}\r\n\t\tif(begin<0)\r\n\t\t{\r\n\t\t\tbegin=0;\r\n\t\t}\r\n\t\trbuf<T> ret;\r\n\t\tint temp=end-begin;\r\n\t\tret.alloc(temp);//alloc会判断temp<0的情况，所以不需要判断begin>=end\r\n\t\tfor(int i=0;i<temp;i++)\r\n\t\t{\r\n\t\t\tret[i]=m_p[begin+i];\r\n\t\t}\r\n\t\treturn r_move(ret);\r\n\t}\r\n\r\n\trbuf<T> sub(int begin) const \r\n\t{\r\n\t\treturn sub(begin,count());\r\n\t}\r\n\r\n\trbool exist(const T& a)\r\n\t{\r\n\t\tfor(int i=0;i<count();i++)\r\n\t\t{\r\n\t\t\tif(a==m_p[i])\r\n\t\t\t{\r\n\t\t\t\treturn true;\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn false;\r\n\t}\r\n\r\n\tint find(const T& a,int begin=0) const\r\n\t{\r\n\t\tfor(int i=begin;i<count();i++)\r\n\t\t{\r\n\t\t\tif(a==m_p[i])\r\n\t\t\t{\r\n\t\t\t\treturn i;\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn count();\r\n\t}\r\n\r\n\tint find_last(const T& a) const\r\n\t{\r\n\t\tfor(int i=count()-1;i>=0;i--)\r\n\t\t{\r\n\t\t\tif(a==m_p[i])\r\n\t\t\t{\r\n\t\t\t\treturn i;\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn count();\r\n\t}\r\n\r\n\tvoid print() const \r\n\t{\r\n\t\tfor(int i=0;i<count();i++)\r\n\t\t{\r\n\t\t\tm_p[i].print();\r\n\t\t}\r\n\t}\r\n\r\n\tvoid printl() const \r\n\t{\r\n\t\tfor(int i=0;i<count();i++)\r\n\t\t{\r\n\t\t\tm_p[i].printl();\r\n\t\t}\r\n\t}\r\n};\r\n\r\n#endif"
  },
  {
    "path": "rlib/rclass.h",
    "content": "﻿#ifndef rclass_h__\r\n#define rclass_h__\r\n\r\n#include \"rbuf.h\"\r\n#include \"rf.h\"\r\n#ifdef _MSC_VER\r\n#include <string>\r\n#pragma comment(lib,\"Ws2_32\")\r\n#else\r\n#include \"gbk.txt\"\r\n#endif\r\n\r\nstruct rclass//本类用于初始化环境，只能实例化一次（单例模式）\r\n{\r\n\trclass()\r\n\t{\r\n#ifdef _MSC_VER\r\n\t\tstd::set_new_handler(new_fail_handle);\r\n\r\n\t\tWORD wVersionRequested;\r\n\t\tWSADATA wsaData;\r\n\r\n\t\twVersionRequested=MAKEWORD(1,1);\r\n\r\n\t\tif(0!=WSAStartup(wVersionRequested,&wsaData))\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif(LOBYTE(wsaData.wVersion)!=1||HIBYTE(wsaData.wVersion)!=1)\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n#endif\r\n\t}\r\n\r\n\t~rclass()\r\n\t{\r\n#ifdef _MSC_VER\r\n\t\tWSACleanup();\r\n#endif\r\n\t}\r\n\r\n\tstatic void new_fail_handle()\r\n\t{\r\n\t\trf::error(\"memory insufficient\");\r\n\t}\r\n};\r\n\r\n#endif"
  },
  {
    "path": "rlib/rcode.h",
    "content": "﻿#ifndef rcode_h__\r\n#define rcode_h__\r\n\r\n#include \"rf.h\"\r\n#include \"rclass.h\"\r\n\r\nstruct rcode\r\n{\r\n\tstatic rstr gbk_to_utf8(const rstr& s)\r\n\t{\r\n\t\treturn utf16_to_utf8(gbk_to_utf16(s));\r\n\t}\r\n\r\n#ifdef _MSC_VER\r\n\tstatic rstr gbk_to_utf16(rstr s)\r\n\t{\r\n\t\trstr result;\r\n\t\t//即使是英语操作系统应该也安装936代码页\r\n\t\tint size=MultiByteToWideChar(936,0,s.cstr_t(),-1,null,0);\r\n\t\tif(size<=0)\r\n\t\t{\r\n\t\t\treturn result;\r\n\t\t}\r\n\t\tresult.set_size(size*2);\r\n\t\tsize=MultiByteToWideChar(936,0,s.cstr_t(),-1,result.cstrw_t(),size);\r\n\t\tif(size<=0)\r\n\t\t{\r\n\t\t\treturn rstr();\r\n\t\t}\r\n\t\tresult.m_buf.m_count-=2;\r\n\t\treturn r_move(result);\r\n\t}\r\n#else\r\n\tstatic rstr gbk_to_utf16(const rstr& s)\r\n\t{\r\n\t\trstr result;\r\n\t\tushort temp;\r\n\t\tushort wuni;\r\n\t\tfor(int i=0;i<s.count();i++)\r\n\t\t{\r\n\t\t\tget_first(temp)=s[i];\r\n\t\t\tget_second(temp)=0;\r\n\t\t\twuni=gbk(temp);\r\n\t\t\tif(wuni!=0)\r\n\t\t\t{\r\n\t\t\t\tresult+=get_first(wuni);\r\n\t\t\t\tresult+=get_second(wuni);\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\t\t\tif(i+1>=s.count())\r\n\t\t\t{\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\t\t\tget_first(temp)=s[i];\r\n\t\t\tget_second(temp)=s[i+1];\r\n\t\t\twuni=gbk(temp);\r\n\t\t\tif(wuni==0)\r\n\t\t\t{\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\t\t\tresult+=get_first(wuni);\r\n\t\t\tresult+=get_second(wuni);\r\n\t\t\ti++;\r\n\t\t}\r\n\t\treturn r_move(result);\r\n\t}\r\n#endif\r\n\r\n\tstatic rstr utf8_to_gbk(const rstr& s)\r\n\t{\r\n\t\treturn utf16_to_gbk(utf8_to_utf16(s));\r\n\t}\r\n\r\n\tstatic rstr utf8_to_utf16(const rstr& s)\r\n\t{\r\n\t\tushort temp;\r\n\t\trstr result;\r\n\t\tfor(int i=0;i<s.count();i++)\r\n\t\t{\r\n\t\t\tif(is_utf8_3(s[i]))\r\n\t\t\t{\r\n\t\t\t\tif(i+2>=s.count())\r\n\t\t\t\t{\r\n\t\t\t\t\tcontinue;\r\n\t\t\t\t}\r\n\t\t\t\ttemp=0;\r\n\t\t\t\ttemp|=(s[i]&0xef)<<12;\r\n\t\t\t\ttemp|=(s[i+1]&0x3f)<<6;\r\n\t\t\t\ttemp|=s[i+2]&0x3f;\r\n\t\t\t\tresult.push(get_first(temp));\r\n\t\t\t\tresult.push(get_second(temp));\r\n\t\t\t\ti+=2;\r\n\t\t\t}\r\n\t\t\telif(is_utf8_2(s[i]))\r\n\t\t\t{\r\n\t\t\t\tif(i+1>=s.count())\r\n\t\t\t\t{\r\n\t\t\t\t\tcontinue;\r\n\t\t\t\t}\r\n\t\t\t\ttemp=0;\r\n\t\t\t\ttemp|=(s[i]&0x1f)<<6;\r\n\t\t\t\ttemp|=s[i+1]&0x3f;\r\n\t\t\t\tresult.push(get_first(temp));\r\n\t\t\t\tresult.push(get_second(temp));\r\n\t\t\t\ti++;\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\tresult.push(s[i]);\r\n\t\t\t\tresult.push(0);\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn r_move(result);\r\n\t}\r\n\r\n#ifdef _MSC_VER\r\n\tstatic rstr utf16_to_gbk(rstr s)\r\n\t{\r\n\t\trstr result;\r\n\t\tint size=WideCharToMultiByte(936,0,s.cstrw_t(),-1,null,0,null,null);\r\n\t\tif(size<=0)\r\n\t\t{\r\n\t\t\treturn result;\r\n\t\t}\r\n\t\tresult.set_size(size);\r\n\t\tsize=WideCharToMultiByte(936,0,s.cstrw_t(),-1,\r\n\t\t\t(char*)result.begin(),size,null,null);\r\n\t\tif(size<=0)\r\n\t\t{\r\n\t\t\treturn rstr();\r\n\t\t}\r\n\t\tresult.pop();\r\n\t\treturn r_move(result);\r\n\t}\r\n#else\r\n\tstatic rstr utf16_to_gbk(const rstr& s)\r\n\t{\r\n\t\trstr result;\r\n\t\tif(s.count()%2!=0)\r\n\t\t{\r\n\t\t\treturn result;\r\n\t\t}\r\n\t\tushort temp;\r\n\t\tushort wgbk;\r\n\t\tfor(int i=0;i<s.count();i+=2)\r\n\t\t{\r\n\t\t\tget_first(temp)=s[i];\r\n\t\t\tget_second(temp)=s[i+1];\r\n\t\t\twgbk=unicode(temp);\r\n\t\t\tif(get_first(wgbk)!=0)\r\n\t\t\t{\r\n\t\t\t\tresult+=get_first(wgbk);\r\n\t\t\t}\r\n\t\t\tif(get_second(wgbk)!=0)\r\n\t\t\t{\r\n\t\t\t\tresult+=get_second(wgbk);\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn r_move(result);\r\n\t}\r\n#endif\r\n\r\n\tstatic rstr utf16_to_utf8(const rstr& s)\r\n\t{\r\n\t\trstr result;\r\n\t\tif(s.count()%2!=0)\r\n\t\t{\r\n\t\t\treturn result;\r\n\t\t}\r\n\t\tushort temp;\r\n\t\tfor(int i=0;i<s.count();i+=2)\r\n\t\t{\r\n\t\t\tif(s[i]<=0x7f&&s[i+1]==0)\r\n\t\t\t{\r\n\t\t\t\tresult+=s[i];\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\t\t\ttemp=*(ushort*)(s.begin()+i);\r\n\t\t\tif(s[i]>0x7f&&s[i+1]<=0x7)\r\n\t\t\t{\r\n\t\t\t\tresult.push(uchar((temp>>6)|0xc0));\r\n\t\t\t\tresult.push(uchar((temp&0x3f)|0x80));\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\tresult.push((temp>>12)|0xe0);\r\n\t\t\t\tresult.push(((temp>>6)&0x3f)|0x80);\r\n\t\t\t\tresult.push((temp&0x3f)|0x80);\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn r_move(result);\r\n\t}\r\n\r\n\tstatic rstr to_utf16_txt(const rstr& s)\r\n\t{\r\n\t\tif(is_utf16_txt(s))\r\n\t\t{\r\n\t\t\treturn s;\r\n\t\t}\r\n\t\trstr temp;\r\n\t\ttemp.push(0xff);\r\n\t\ttemp.push(0xfe);\r\n\t\tif(is_utf8_txt(s))\r\n\t\t{\r\n\t\t\treturn temp+utf8_to_utf16(s.sub(3));\r\n\t\t}\r\n\t\treturn temp+gbk_to_utf16(s);\r\n\t}\r\n\r\n\tstatic rstr add_utf8_head(const rstr& s)\r\n\t{\r\n\t\trstr temp;\r\n\t\ttemp.push(0xef);\r\n\t\ttemp.push(0xbb);\r\n\t\ttemp.push(0xbf);\r\n\t\ttemp+=s;\r\n\t\treturn r_move(temp);\r\n\t}\r\n\r\n\tstatic rstr to_utf8_txt(const rstr& s)\r\n\t{\r\n\t\tif(is_utf8_txt(s))\r\n\t\t{\r\n\t\t\treturn s;\r\n\t\t}\r\n\t\trstr temp;\r\n\t\ttemp.push(0xef);\r\n\t\ttemp.push(0xbb);\r\n\t\ttemp.push(0xbf);\r\n\t\tif(is_utf16_txt(s))\r\n\t\t{\r\n\t\t\treturn temp+utf16_to_utf8(s.sub(2));\r\n\t\t}\r\n\t\treturn temp+gbk_to_utf8(s);\r\n\t}\r\n\r\n\tstatic rstr to_gbk_txt(const rstr& s)\r\n\t{\r\n\t\tif(is_utf8_txt(s))\r\n\t\t{\r\n\t\t\treturn utf8_to_gbk(s.sub(3));\r\n\t\t}\r\n\t\tif(is_utf16_txt(s))\r\n\t\t{\r\n\t\t\treturn utf16_to_gbk(s.sub(2));\r\n\t\t}\r\n\t\treturn r_move(s);\r\n\t}\r\n\r\n\tstatic rbool is_utf16_txt(const rstr& s)\r\n\t{\r\n\t\treturn s.count()>=2&&\r\n\t\t\ts[0]==0xff&&\r\n\t\t\ts[1]==0xfe;\r\n\t}\r\n\r\n\tstatic rbool is_utf8_txt(const rstr& s)\r\n\t{\r\n\t\treturn s.count()>=3&&\r\n\t\t\ts[0]==0xef&&\r\n\t\t\ts[1]==0xbb&&\r\n\t\t\ts[2]==0xbf;\r\n\t}\r\n\r\n\tstatic rbool is_utf16_big_txt(const rstr& s)\r\n\t{\r\n\t\treturn s.count()>=2&&\r\n\t\t\ts[0]==0xfe&&\r\n\t\t\ts[1]==0xff;\r\n\t}\r\n\r\n\tstatic rbool is_utf32_txt(const rstr& s)\r\n\t{\r\n\t\tif(s.count()<4)\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\tif(s[0]==0&&s[1]==0&&\r\n\t\t\ts[2]==0xfe&&\r\n\t\t\ts[3]==0xff)\r\n\t\t{\r\n\t\t\treturn true;\r\n\t\t}\r\n\t\tif(s[0]==0xff&&\r\n\t\t\ts[1]==0xfe&&\r\n\t\t\ts[2]==0&&s[3]==0)\r\n\t\t{\r\n\t\t\treturn true;\r\n\t\t}\r\n\t\treturn false;\r\n\t}\r\n\r\n\t//是否utf8 3个字节起始\r\n\tstatic rbool is_utf8_3(uchar ch)\r\n\t{\r\n\t\treturn ch>=0xe0&&ch<=0xef;\r\n\t}\r\n\r\n\tstatic rbool is_utf8_2(uchar ch)\r\n\t{\r\n\t\treturn ch>=0xc0&&ch<=0xdf;\r\n\t}\r\n\r\n\t//是否unicode汉字，共20902个，+2个不常用字\r\n\tstatic rbool is_chs(ushort w)\r\n\t{\r\n\t\treturn w>=0x4e00&&w<0x9fa6;\r\n\t}\r\n\r\n\t//是否gbk汉字第一字节，分布范围大约 30000多\r\n\tstatic rbool is_chs_first(uchar ch)\r\n\t{\r\n\t\treturn ch>=0x81&&ch<=0xfd;\r\n\t}\r\n\r\n#ifndef _MSC_VER\r\n\tstatic ushort unicode(int index)\r\n\t{\r\n\t\treturn *(ushort*)&g_unicode[index*2];\r\n\t}\r\n\r\n\tstatic ushort gbk(int index)\r\n\t{\r\n\t\treturn *(ushort*)&g_gbk[index*2];\r\n\t}\r\n#endif\r\n\r\n\tstatic char& get_second(ushort& ch)\r\n\t{\r\n\t\treturn *((char*)&ch+1);\r\n\t}\r\n\r\n\tstatic char& get_first(ushort& ch)\r\n\t{\r\n\t\treturn *((char*)&ch);\r\n\t}\r\n\t\r\n\t//返回所需缓存区大小\r\n\tstatic int gbk_to_utf8_c(uchar* src,uchar* dst)\r\n\t{\r\n\t\trstr s=gbk_to_utf8(src);\r\n\t\ts.push(0);\r\n\t\tif(dst!=null)\r\n\t\t{\r\n\t\t\tmemcpy(dst,s.begin(),s.count());\r\n\t\t}\r\n\t\treturn s.count();\r\n\t}\r\n\r\n\tstatic int gbk_to_utf16_c(uchar* src,uchar* dst)\r\n\t{\r\n\t\trstr s=gbk_to_utf16(src);\r\n\t\ts.push(0);\r\n\t\ts.push(0);\r\n\t\tif(dst!=null)\r\n\t\t{\r\n\t\t\tmemcpy(dst,s.begin(),s.count());\r\n\t\t}\r\n\t\treturn s.count();\r\n\t}\r\n\r\n\tstatic int utf8_to_gbk_c(uchar* src,uchar* dst)\r\n\t{\r\n\t\trstr s=utf8_to_gbk(src);\r\n\t\ts.push(0);\r\n\t\tif(dst!=null)\r\n\t\t{\r\n\t\t\tmemcpy(dst,s.begin(),s.count());\r\n\t\t}\r\n\t\treturn s.count();\r\n\t}\r\n\r\n\tstatic int utf8_to_utf16_c(uchar* src,uchar* dst)\r\n\t{\r\n\t\trstr s=utf8_to_utf16(src);\r\n\t\ts.push(0);\r\n\t\ts.push(0);\r\n\t\tif(dst!=null)\r\n\t\t{\r\n\t\t\tmemcpy(dst,s.begin(),s.count());\r\n\t\t}\r\n\t\treturn s.count();\r\n\t}\r\n\r\n\tstatic int utf16_to_gbk_c(uchar* src,uchar* dst)\r\n\t{\r\n\t\trstr s;\r\n\t\tfor(uchar* p=src;;p+=2)\r\n\t\t{\r\n\t\t\tif(*p==0&&*(p+1)==0)\r\n\t\t\t{\r\n\t\t\t\ts.set_size(p-src);\r\n\t\t\t\tmemcpy(s.begin(),src,s.count());\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t}\r\n\t\ts=utf16_to_gbk(s);\r\n\t\ts.push(0);\r\n\t\tif(dst!=null)\r\n\t\t{\r\n\t\t\tmemcpy(dst,s.begin(),s.count());\r\n\t\t}\r\n\t\treturn s.count();\r\n\t}\r\n\r\n\tstatic int utf16_to_utf8_c(uchar* src,uchar* dst)\r\n\t{\r\n\t\trstr s;\r\n\t\tfor(uchar* p=src;;p+=2)\r\n\t\t{\r\n\t\t\tif(*p==0&&*(p+1)==0)\r\n\t\t\t{\r\n\t\t\t\ts.set_size(p-src);\r\n\t\t\t\tmemcpy(s.begin(),src,s.count());\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t}\r\n\t\ts=utf16_to_utf8(s);\r\n\t\ts.push(0);\r\n\t\tif(dst!=null)\r\n\t\t{\r\n\t\t\tmemcpy(dst,s.begin(),s.count());\r\n\t\t}\r\n\t\treturn s.count();\r\n\t}\r\n};\r\n\r\n#endif"
  },
  {
    "path": "rlib/rdb.h",
    "content": "﻿#ifndef rdb_h__\r\n#define rdb_h__\r\n\r\n#include \"rfile.h\"\r\n\r\n#define rdbint rdb<int,int>\r\n\r\n//TL是数据长度，TA是地址\r\ntemplate<class TA,class TL>//uchar,ushort,uint,uint64\r\nclass rdb\r\n{\r\npublic:\r\n\trfile m_file;//use multi thread please define multi object\r\n\trbuf<TA> m_index;\r\n\r\n\tenum\r\n\t{\r\n\t\tc_null,//空数据\r\n\t\tc_real,\r\n\t\tc_cp,//压缩数据\r\n\t\tc_error//异常数据\r\n\t};\r\n\r\n\trdb()\r\n\t{\r\n\t}\r\n\r\n\trdb(rstrw name,rstrw mode=\"r\")\r\n\t{\r\n\t\topen(name,mode);\r\n\t}\r\n\r\n\trbool close()\r\n\t{\r\n\t\treturn m_file.close();\r\n\t}\r\n\r\n\trbool open_off(rstrw name,int off,rstrw mode=\"r\")\r\n\t{\r\n\t\tif(!m_file.open(name,mode))\r\n\t\t\treturn false;\r\n\t\tm_file.set_off(off);\r\n\t\tTL count;\r\n\t\tif(!m_file.read(r_size(count),&count))\r\n\t\t\treturn false;\r\n\t\tTL cmax;\r\n\t\tif(!m_file.read(r_size(cmax),&cmax))\r\n\t\t\treturn false;\r\n\t\tm_index.realloc_n_not_change(cmax);\r\n\t\tif(!m_file.read(count*r_size(TA),m_index.begin()))\r\n\t\t\treturn false;\r\n\t\tm_index.m_count=count;\r\n\t\tfor(int i=0;i<m_index.count();i++)\r\n\t\t{\r\n\t\t\tm_index[i]+=off;\r\n\t\t}\r\n\t\treturn true;\r\n\t}\r\n\r\n\trbool open(rstrw name,rstrw mode=\"r\")\r\n\t{\r\n\t\tif(!rfile::exist(name))\r\n\t\t{\r\n\t\t\tif(!m_file.open_n(name,\"rw\"))\r\n\t\t\t\treturn false;\r\n\t\t\tTL count=0;\r\n\t\t\tif(!m_file.write(r_size(count),&count))\r\n\t\t\t\treturn false;\r\n\t\t\tif(!m_file.write(r_size(count),&count))\r\n\t\t\t\treturn false;\r\n\t\t\tif(!m_file.close())\r\n\t\t\t\treturn false;\r\n\t\t}\r\n\t\tif(!m_file.open(name,mode))\r\n\t\t\treturn false;\r\n\t\tTL count;\r\n\t\tif(!m_file.read(r_size(count),&count))\r\n\t\t\treturn false;\r\n\t\tTL cmax;\r\n\t\tif(!m_file.read(r_size(cmax),&cmax))\r\n\t\t\treturn false;\r\n\t\tm_index.realloc_n_not_change(cmax);\r\n\t\tif(!m_file.read(count*r_size(TA),m_index.begin()))\r\n\t\t\treturn false;\r\n\t\tm_index.m_count=count;\r\n\t\treturn true;\r\n\t}\r\n\r\n\tint count()\r\n\t{\r\n\t\treturn m_index.count();\r\n\t}\r\n\r\n\trstr operator[](int i)\r\n\t{\r\n\t\trstr ret;\r\n\t\tif(!read(i,ret))\r\n\t\t\tnull;\r\n\t\treturn r_move(ret);\r\n\t}\r\n\t\r\n\trbool read(int i,rstr& data)\r\n\t{\r\n\t\tdata.clear();\r\n\t\tif(i>=m_index.count()||i<0)\r\n\t\t\treturn false;\r\n\t\tif(m_index[i]==0)\r\n\t\t\treturn true;\r\n\t\tchar flag;\r\n\t\tTA off=m_index[i];\r\n\t\tif(!m_file.read(off,r_size(flag),&flag))\r\n\t\t\treturn false;\r\n\t\tif(flag==c_null)\r\n\t\t\treturn true;\r\n\t\tif(flag!=c_real)\r\n\t\t\treturn false;\r\n\t\tTL len;\r\n\t\toff+=r_size(flag);\r\n\t\tif(!m_file.read(off,r_size(len),&len))\r\n\t\t\treturn false;\r\n\t\tdata.m_buf.realloc_n(len);\r\n\t\toff+=r_size(len);\r\n\t\tif(!m_file.read(off,data.count(),data.begin()))\r\n\t\t\treturn false;\r\n\t\treturn true;\r\n\t}\r\n\r\n\trbool write(int i,const rstr& data)\r\n\t{\r\n\t\tif(i>=m_index.count()||i<0)\r\n\t\t\treturn false;\r\n\t\tchar flag=c_null;\r\n\t\tTA off=m_index[i];\r\n\t\tif(!m_file.write(off,r_size(flag),&flag))\r\n\t\t\treturn false;\r\n\t\tflag=c_real;\r\n\t\toff=m_file.size();\r\n\t\tm_index[i]=off;\r\n\t\tif(!m_file.write(off,r_size(flag),&flag))\r\n\t\t\treturn false;\r\n\t\toff+=r_size(flag);\r\n\t\tTL len=data.count();\r\n\t\tif(!m_file.write(off,r_size(len),&len))\r\n\t\t\treturn false;\r\n\t\toff+=r_size(len);\r\n\t\tif(!m_file.write(off,data.count(),data.begin()))\r\n\t\t\treturn false;\r\n\t\tif(!m_file.write(get_index_off(i),r_size(TA),&m_index[i]))\r\n\t\t\treturn false;\r\n\t\treturn true;\r\n\t}\r\n\r\n\trbool write_new(const rstr& data)\r\n\t{\r\n\t\tif(m_index.m_count>=m_index.m_cmax)\r\n\t\t\tif(!extend())\r\n\t\t\t\treturn false;\r\n\r\n\t\tTA off;\r\n\t\toff=m_file.size();\r\n\t\tm_index.push(off);\r\n\r\n\t\tchar flag=c_real;\r\n\t\tif(!m_file.write(off,r_size(flag),&flag))\r\n\t\t\treturn false;\r\n\t\toff+=r_size(flag);\r\n\t\tTL len=data.count();\r\n\t\tif(!m_file.write(off,r_size(len),&len))\r\n\t\t\treturn false;\r\n\t\toff+=r_size(len);\r\n\t\tif(!m_file.write(off,data.count(),data.begin()))\r\n\t\t\treturn false;\r\n\t\t\r\n\t\tint i=m_index.count()-1;\r\n\t\tif(!m_file.write(get_index_off(i),r_size(TA),&m_index[i]))\r\n\t\t\treturn false;\r\n\t\tif(!m_file.write(0,r_size(TL),&m_index.m_count))\r\n\t\t\treturn false;\r\n\t\treturn true;\r\n\t}\r\n\r\n\trbool extend()\r\n\t{\r\n\t\tif(m_file.size()>=128*1024*1024)\r\n\t\t\treturn false;\r\n\t\trbuf<uchar> temp;\r\n\t\ttemp.alloc(m_file.size()-get_data_off());\r\n\t\tif(!m_file.read(get_data_off(),temp.size(),temp.begin()))\r\n\t\t\treturn false;\r\n\t\tint cmax=m_index.m_cmax;\r\n\t\tm_index.realloc_not_change(m_index.extend_num(m_index.count()));\r\n\t\tfor(int i=0;i<m_index.count();i++)\r\n\t\t\tm_index[i]+=(m_index.m_cmax-cmax)*r_size(TA);\r\n\r\n\t\tif(!m_file.write(r_size(TL),r_size(TL),&m_index.m_cmax))\r\n\t\t\treturn false;\r\n\t\t//这里必须用m_cmax,不能用m_count，因为刚开始只有8个字节\r\n\t\tif(!m_file.write(r_size(TL)*2,\r\n\t\t\tm_index.m_cmax*r_size(TA),m_index.begin()))\r\n\t\t\treturn false;\r\n\t\tif(!m_file.write(get_data_off(),temp.size(),temp.begin()))\r\n\t\t\treturn false;\r\n\t\treturn true;\r\n\t}\r\n\r\n\tint find(rstr s)\r\n\t{\r\n\t\tfor(int i=0;i<count();i++)\r\n\t\t\tif(operator[](i)==s)\r\n\t\t\t\treturn i;\r\n\t\treturn count();\r\n\t}\r\n\r\n\tTA get_data_off()\r\n\t{\r\n\t\treturn m_index.m_cmax*r_size(TA)+r_size(TL)*2;\r\n\t}\r\n\r\n\tstatic int get_index_off(int i)\r\n\t{\r\n\t\treturn r_size(TL)*2+r_size(TA)*i;\r\n\t}\r\n};\r\n\r\n#endif\r\n"
  },
  {
    "path": "rlib/rdic.h",
    "content": "﻿#ifndef rdic_h__\r\n#define rdic_h__\r\n\r\n#include \"rset.h\"\r\n\r\ntemplate<typename T>\r\nstruct rdic_i\r\n{\r\n\tT val;//val必须前置\r\n\trstr key;\r\n\r\n\tfriend rbool operator<(const rdic_i<T>& a,const rdic_i<T>& b)\r\n\t{\r\n\t\treturn a.key<b.key;\r\n\t}\r\n};\r\n\r\ntemplate<typename T>\r\nstruct rdic\r\n{\r\n\trset<rdic_i<T> > m_set;\r\n\r\n\tvoid clear()\r\n\t{\r\n\t\tm_set.clear();\r\n\t}\r\n\r\n\tT* begin() const\r\n\t{\r\n\t\treturn (T*)m_set.begin();\r\n\t}\r\n\r\n\tT* end() const\r\n\t{\r\n\t\treturn (T*)m_set.end();\r\n\t}\r\n\r\n\tT* next(T* p) const\r\n\t{\r\n\t\treturn (T*)m_set.next((rdic_i<T>*)p);\r\n\t}\r\n\r\n\trstr get_key(T* p)\r\n\t{\r\n\t\treturn ((rdic_i<T>*)p)->key;\r\n\t}\r\n\r\n\trbool empty() const\r\n\t{\r\n\t\treturn m_set.empty();\r\n\t}\r\n\r\n\tint count() const\r\n\t{\r\n\t\treturn m_set.count();\r\n\t}\r\n\r\n\trbool exist(const rstr& key) const\r\n\t{\r\n\t\trdic_i<T> item;\r\n\t\titem.key=key;\r\n\t\treturn m_set.exist(item);\r\n\t}\r\n\r\n\tT* find(const rstr& key) const\r\n\t{\r\n\t\trdic_i<T> item;\r\n\t\titem.key=key;\r\n\t\treturn (T*)m_set.find(item);\r\n\t}\r\n\r\n\tvoid insert(const rstr& key,const T& val)\r\n\t{\r\n\t\trdic_i<T> item;\r\n\t\titem.key=key;\r\n\t\titem.val=val;\r\n\t\tm_set.insert(item);\r\n\t}\r\n\r\n\tT& operator[](const rstr& key)\r\n\t{\r\n\t\trdic_i<T> item;\r\n\t\titem.key=key;\r\n\t\tm_set.insert_c(item);\r\n\t\trdic_i<T>* p=m_set.find(item);\r\n\t\treturn p->val;\r\n\t}\r\n};\r\n\r\n#endif\r\n"
  },
  {
    "path": "rlib/rdir.h",
    "content": "﻿#ifndef rdir_h__\r\n#define rdir_h__\r\n\r\n#include \"rfile.h\"\r\n#include \"rf.h\"\r\n#include \"rstrw.h\"\r\n#include \"rlist.h\"\r\n\r\n#ifdef _MSC_VER\r\n#include <windows.h>\r\n#include <io.h>\r\n#else\r\n//#include <dirent.h>  \r\n//#include <sys/stat.h>  \r\n//#include <unistd.h>  \r\n//#include <sys/types.h> \r\n#endif\r\n\r\n//todo 去掉这个结构体\r\nstruct rdir_item\r\n{\r\n\trstrw path;\r\n\trbool is_dir;\r\n\r\n\trdir_item()\r\n\t{\r\n\t\tis_dir=false;\r\n\t}\r\n\r\n\tfriend rbool operator<=(const rdir_item& a,const rdir_item& b)\r\n\t{\r\n\t\treturn a.path<=b.path;\r\n\t}\r\n};\r\n\r\n#ifndef MAX_PATH\r\n#define MAX_PATH 260\r\n#endif\r\n\r\nstruct rdir\r\n{\r\n\tstatic rstrw erase_suffix(const rstrw& name)\r\n\t{\r\n\t\trstrw s=get_suffix(name);\r\n\t\treturn name.sub(0,name.count()-s.count()-1);\r\n\t}\r\n\r\n\tstatic rstrw get_suffix(const rstrw& name)\r\n\t{\r\n\t\tushort ch='.';\r\n\t\tint pos=name.find_last(ch);\r\n\t\tif(pos<name.count())\r\n\t\t\treturn name.sub(pos+1);\r\n\t\treturn rstrw();\r\n\t}\r\n\t\r\n\tstatic rstrw get_prev_dir(rstrw path)\r\n\t{\r\n\t\tif(path.empty())\r\n\t\t\treturn rstrw();\r\n\t\tpath.pop();\r\n\t\tushort ch='/';\r\n\t\tint pos=path.find_last(ch);\r\n\t\tif(pos>=path.count())\r\n\t\t\treturn rstrw();\r\n\t\treturn path.sub(0,pos+1);\r\n\t}\r\n\r\n\tstatic rstrw get_name(const rstrw& path)\r\n\t{\r\n\t\tif(path.empty())\r\n\t\t\treturn rstrw();\r\n\t\tushort ch='/';\r\n\t\tint pos=path.find_last(ch);\r\n\t\tif(pos>=path.count())\r\n\t\t\treturn rstrw();\r\n\t\treturn path.sub(pos+1);\r\n\t}\r\n\r\n\tstatic rstrw get_exe_name()\r\n\t{\r\n\t\twchar buf[MAX_PATH+1];\r\n\t\tif(GetModuleFileNameW(null,(wchar*)buf,MAX_PATH)==0)\r\n\t\t\treturn rstrw();\r\n\t\treturn dir_std(rstrw(buf));\r\n\t}\r\n\r\n\tstatic rstrw get_exe_dir()\r\n\t{\r\n\t\trstrw ret;\r\n#ifndef __COCOS2D_H__\r\n\t\twchar buf[MAX_PATH+1];\r\n\t\tif(GetModuleFileNameW(null,(wchar*)buf,MAX_PATH)==0)\r\n\t\t\treturn ret;\r\n\t\tret=buf;\r\n#else\r\n\t\tret=rstr(FileUtils::getInstance()->fullPathForFilename(\r\n\t\t\t\"rinf/key.txt\").c_str());\r\n\t\tret=ret.sub(0,ret.count()-rstr(\"rinf/key.txt\").count()+1);\r\n#endif\r\n\t\tret=dir_std(ret);\r\n\t\tret=get_prev_dir(ret);\r\n\t\treturn ret;\r\n\t}\r\n\r\n\tstatic rstrw get_cur_dir()\r\n\t{\r\n\t\trstrw ret;\r\n#ifndef __COCOS2D_H__\r\n\t\twchar buf[MAX_PATH+1];\r\n\t\tif(GetCurrentDirectoryW(MAX_PATH,(wchar*)buf)==0)\r\n\t\t\treturn ret;\r\n\t\tret=buf;\r\n\t\tret=dir_std(ret);\r\n\t\tret+='/';\r\n#else\r\n\t\tret=rstr(FileUtils::getInstance()->fullPathForFilename(\r\n\t\t\t\"rinf/key.txt\").c_str());\r\n\t\tret=ret.sub(0,ret.count()-rstr(\"rinf/key.txt\").count()+1);\r\n\t\tret=dir_std(ret);\r\n\t\tret=get_prev_dir(ret);\r\n#endif\r\n\t\treturn ret;\r\n\t}\r\n\t\r\n\t//非win系统区分大小写\r\n\tstatic rstrw dir_std(rstrw s)\r\n\t{\r\n\t\tfor(ushort* p=s.begin();p!=s.end();++p)\r\n\t\t{\r\n\t\t\tif('\\\\'==*p)\r\n\t\t\t{\r\n\t\t\t\t*p='/';\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn s;\r\n\t}\r\n\r\n\tstatic rbuf<rdir_item> get_file_bfs(rstrw path)\r\n\t{\r\n\t\trbuf<rdir_item> ret;\r\n#ifndef __COCOS2D_H__\r\n\t\tif(path.count()>4096||0==path.count())//ubuntu's max path len is 4096\r\n\t\t{\r\n\t\t\treturn ret;\r\n\t\t}\r\n\t\tpath=dir_std(path);\r\n\t\tif(path.count()>=1&&path[path.count()-1]!='/')\r\n\t\t{\r\n\t\t\tpath+=rstr(\"/\");\r\n\t\t}\r\n\t\trlist<rstrw> queue;\r\n\t\tqueue.push(path);\r\n\t\twhile(!queue.empty())\r\n\t\t{\r\n\t\t\tpath=queue.pop_front();\r\n\t\t\tWIN32_FIND_DATAW wfd; \r\n\t\t\tHANDLE handle=FindFirstFileW(\r\n\t\t\t\t(path+rstr(\"*.*\")).cstrw_t(),&wfd); \r\n\t\t\tif(handle==INVALID_HANDLE_VALUE)\r\n\t\t\t\tcontinue;\r\n\t\t\twhile(true)\r\n\t\t\t{\r\n\t\t\t\trdir_item item;\r\n\t\t\t\trstrw name=dir_std(wfd.cFileName);\r\n\t\t\t\tif(rstr(\".\")!=name&&rstr(\"..\")!=name)\r\n\t\t\t\t{\r\n\t\t\t\t\titem.path=path+name;\r\n\t\t\t\t\tif(0!=(wfd.dwFileAttributes&\r\n\t\t\t\t\t\tFILE_ATTRIBUTE_DIRECTORY))\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\titem.is_dir=true;\r\n\t\t\t\t\t\tqueue.push(item.path+rstr(\"/\"));\r\n\t\t\t\t\t}\r\n\t\t\t\t\tret.push(item);\r\n\t\t\t\t}\r\n\t\t\t\tifn(FindNextFileW(handle,&wfd))\r\n\t\t\t\t{\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tFindClose(handle);\r\n\t\t}\r\n#endif\r\n\t\treturn ret;\r\n\t}\r\n};\r\n\r\n#endif\r\n"
  },
  {
    "path": "rlib/rf.h",
    "content": "﻿#ifndef rf_h__\r\n#define rf_h__\r\n\r\n#include \"rstr.h\"\r\n#include <stdio.h>\r\n#include <math.h>\r\n#include <stdarg.h>\r\n#ifdef _MSC_VER\r\n#include <windows.h>\r\n#include <conio.h>\r\n#else\r\n#include <unistd.h>\r\n#include <termios.h>\r\n#endif\r\n#include <stdlib.h>\r\n#include <time.h>  \r\n//#include <random>\r\n\r\nstruct rf\r\n{\r\n\tenum\r\n\t{\r\n\t\tc_block_size=(64*1024)\r\n\t};\r\n\r\n\tstatic void error(rstr s=rstr())\r\n\t{\r\n\t\tprintf(\"\\n%s\\n\",s.cstr());\r\n\t\tgetch();\r\n\t\texit(1);\r\n\t}\r\n\r\n\tstatic void printl(rstr s=rstr())\r\n\t{\r\n\t\tprintf(\"%s\\n\",s.cstr());\r\n\t}\r\n\r\n\tstatic void print(rstr s=rstr())\r\n\t{\r\n\t\tprintf(\"%s \",s.cstr());\r\n\t}\r\n\r\n\tstatic void print(const char* s)\r\n\t{\r\n\t\tprintf(\"%s \",s);//必须加上%s防止字符串中出现特殊字符\r\n\t}\r\n\r\n\tstatic int tick()\r\n\t{\r\n#ifdef _MSC_VER\r\n\t\treturn GetTickCount();\r\n#else\r\n\t\treturn (int)((double)clock()/CLOCKS_PER_SEC*1000);\r\n#endif\r\n\t}\r\n\r\n\tstatic void sleep(int milliseconds)\r\n\t{\r\n\t\tif(milliseconds<50)\r\n\t\t{\r\n\t\t\tmilliseconds=50;\r\n\t\t}\r\n#ifdef _MSC_VER\r\n\t\tSleep(milliseconds);\r\n#else\r\n\t\tif(milliseconds>2100000000)\r\n\t\t\t::sleep(milliseconds/1000);\r\n\t\telse\r\n\t\t\tusleep(milliseconds*1000);\r\n#endif\r\n\t}\r\n\r\n\tstatic int getch()\r\n\t{\r\n#ifdef _MSC_VER\r\n\t\treturn ::getch();\r\n#else\r\n\t\tstruct termios oldt,newt;\r\n\t\tint ch;\r\n\t\ttcgetattr(STDIN_FILENO,&oldt);\r\n\t\tnewt=oldt;\r\n\t\tnewt.c_lflag&=~(ICANON|ECHO);\r\n\t\ttcsetattr(STDIN_FILENO,TCSANOW,&newt);\r\n\t\tch=getchar();\r\n\t\ttcsetattr(STDIN_FILENO,TCSANOW,&oldt);\r\n\t\treturn ch;\r\n#endif\r\n\t}\r\n\r\n\tstatic int round(double a){\r\n\t\treturn (int)(a+0.5);\r\n\t}\r\n\r\n\t/*static int rand_n(int n){\r\n\t\trandom_device rd;\r\n\t\treturn rd()%n;\r\n\t}*/\r\n\r\n\tstatic void srand()\r\n\t{\r\n\t\t::srand((uint)::time(null));\r\n\t}\r\n\r\n\tstatic int rand()\r\n\t{\r\n\t\treturn ::rand();\r\n\t}\r\n\r\n\tstatic uchar get_bitmap(uchar bitmap[],int block)\r\n\t{\r\n\t\tuchar result;\r\n\t\tresult=bitmap[block/8]>>(7-block%8);\r\n\t\tresult&=0x1;\r\n\t\treturn result;\r\n\t}\r\n\r\n\tstatic void set_bitmap(uchar bitmap[],int block)\r\n\t{\r\n\t\tbitmap[block/8]|=(1<<(7-block%8));\r\n\t}\r\n\r\n\tstatic rbool execmd(const char* p)\r\n\t{\r\n\t\treturn 0==::system(p);\r\n\t}\r\n#ifdef _MSC_VER\r\n#else\r\n\tstatic rbool execmd_r(const char* cmd,rstr& result)\r\n\t{\r\n\t\tresult=rstr();\r\n\t\tFILE* fp=popen(cmd,\"r\");\r\n\r\n\t\tif(null==fp)\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\trbuf<char> buf(4096+1);\r\n\t\tbuf.m_p[4096]=0;\r\n\t\tint count;\r\n\r\n\t\twhile(true)\r\n\t\t{\r\n\t\t\tcount=fread(buf.m_p,1,4096,fp);\r\n\r\n\t\t\tif(count>0)\r\n\t\t\t{\r\n\t\t\t\tbuf.m_p[count]=0;\r\n\t\t\t\tresult+=buf.m_p;\r\n\t\t\t}\r\n\r\n\t\t\tif(count<4096)\r\n\t\t\t{\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tpclose(fp);\r\n\t\treturn true;\r\n\t}\r\n#endif\r\n};\r\n\r\n#endif\r\n"
  },
  {
    "path": "rlib/rfile.h",
    "content": "﻿#ifndef rfile_h__\r\n#define rfile_h__\r\n\r\n#include \"rbuf.h\"\r\n#include \"rstr.h\"\r\n#include \"rf.h\"\r\n#include \"rcode.h\"\r\n#include \"rstrw.h\"\r\n#ifdef _MSC_VER\r\n#else\r\n//#define _FILE_OFFSET_BITS 64\r\n//#include <sys/types.h>\r\n#endif\r\n\r\nstruct rfile\r\n{\r\n\tFILE* m_fp;\r\n\t\r\n\t~rfile()\r\n\t{\r\n\t\tclose();\r\n\t}\r\n\r\n\trfile()\r\n\t{\r\n\t\tm_fp=null;\r\n\t}\r\n\r\n\trfile(rstrw name,rstrw mode=\"r\")\r\n\t{\r\n\t\topen(name,mode);\r\n\t}\r\n\r\n\trbool close()\r\n\t{\r\n\t\tif(null==m_fp)\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\tif(0!=fclose(m_fp))\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\tm_fp=null;\r\n\t\treturn true;\r\n\t}\r\n\t\r\n\t//mode: rb只读，wb重新创建写,rb+读写\r\n\t//推荐用 r只读，w写，rw读写，本函数只有二进制模式\r\n\trbool open(rstrw name,rstrw mode=\"r\")\r\n\t{\r\n\t\tm_fp=null;\r\n\t\tif(!exist(name))\r\n\t\t{\r\n\t\t\tif(rstrw(\"rw\")==mode)\r\n\t\t\t{\r\n\t\t\t\tif(!create(name))\r\n\t\t\t\t{\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t\treturn false;\r\n\t\t}\r\n\t\tif(rstrw(\"r\")==mode)\r\n\t\t{\r\n\t\t\tmode=rstrw(\"rb\");\r\n\t\t}\r\n\t\telif(rstrw(\"w\")==mode)\r\n\t\t{\r\n\t\t\tmode=rstrw(\"wb\");\r\n\t\t}\r\n\t\telif(rstrw(\"rw\")==mode)\r\n\t\t{\r\n\t\t\tmode=rstrw(\"rb+\");\r\n\t\t}\r\n\t\tm_fp=fopen_w(name.cstrw_t(),mode.cstrw_t());\r\n\t\tif(null==m_fp)\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\treturn true;\r\n\t}\r\n\r\n\t//强制打开一个新文件\r\n\trbool open_n(rstrw name,rstrw mode=\"rw\")\r\n\t{\r\n\t\tremove(name);\r\n\t\treturn open(name,mode);\r\n\t}\r\n\r\n\trbool read(int off,int len,void* buf)\r\n\t{\r\n\t\treturn read((int8)off,len,buf);\r\n\t}\r\n\r\n\trbool read(int8 off,int len,void* buf)\r\n\t{\r\n\t\tif(null==m_fp)\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\tset_off8(off);\r\n\t\treturn len==(int)fread(buf,1,len,m_fp);\r\n\t}\r\n\r\n\trbool read(int len,void* buf)\r\n\t{\r\n\t\tif(null==m_fp)\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\treturn len==(int)fread(buf,1,len,m_fp);\r\n\t}\r\n\t\r\n\t//读取并返回整个文件，通常用于小文件\r\n\trstr read_all()\r\n\t{\r\n\t\trstr ret;\r\n\t\tret.set_size(size());\r\n\t\tif(!read(0,size(),ret.begin()))\r\n\t\t{\r\n\t\t\treturn rstr();\r\n\t\t}\r\n\t\treturn r_move(ret);\r\n\t}\r\n\r\n\t//直接读一个小文件\r\n\tstatic rstr read_all_n(const rstrw& name)\r\n\t{\r\n\t\trfile file(name);\r\n\t\trstr ret;\r\n\t\tret.set_size(file.size());\r\n\t\tif(!file.read(0,file.size(),ret.begin()))\r\n\t\t{\r\n\t\t\treturn rstr();\r\n\t\t}\r\n\t\treturn r_move(ret);\r\n\t}\r\n\t\r\n\t//读取一行（跳过空行）\r\n\trstr read_line()\r\n\t{\r\n\t\trstr ret;\r\n\t\tuchar c;\r\n\t\twhile(read(1,&c))\r\n\t\t{\r\n\t\t\tif('\\r'==c||'\\n'==c)\r\n\t\t\t{\r\n\t\t\t\tif(0==ret.count())\r\n\t\t\t\t{\r\n\t\t\t\t\tcontinue;\r\n\t\t\t\t}\r\n\t\t\t\telse\r\n\t\t\t\t{\r\n\t\t\t\t\treturn ret;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tret+=c;\r\n\t\t}\r\n\t\treturn r_move(ret);\r\n\t}\r\n\t\r\n\t//读取一行，仅用于utf16文件\r\n\trstrw read_line_w()\r\n\t{\r\n\t\trstrw ret;\r\n\t\tushort c;\r\n\t\twhile(read(2,&c))\r\n\t\t{\r\n\t\t\tif('\\r'==c||'\\n'==c)\r\n\t\t\t{\r\n\t\t\t\tif(0==ret.count())\r\n\t\t\t\t{\r\n\t\t\t\t\tcontinue;\r\n\t\t\t\t}\r\n\t\t\t\telse\r\n\t\t\t\t{\r\n\t\t\t\t\treturn ret;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tret+=c;\r\n\t\t}\r\n\t\treturn r_move(ret);\r\n\t}\r\n\r\n\trbool write(int off,int len,const void* buf)\r\n\t{\r\n\t\treturn write((int8)off,len,buf);\r\n\t}\r\n\r\n\trbool write(int8 off,int len,const void* buf)\r\n\t{\r\n\t\tif(null==m_fp)\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\tset_off8(off);\r\n\t\treturn len==(int)fwrite(buf,1,len,m_fp);\r\n\t}\r\n\r\n\trbool write(int len,const void* buf)\r\n\t{\r\n\t\tif(null==m_fp)\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\treturn len==(int)fwrite(buf,1,len,m_fp);\r\n\t}\r\n\r\n\trbool write(rstr s)\r\n\t{\r\n\t\treturn write(s.size(),s.begin());\r\n\t}\r\n\r\n\trbool write_line(rstr s)\r\n\t{\r\n\t\treturn write(s.size(),s.begin())&&write(1,\"\\n\");\r\n\t}\r\n\r\n\trbool write_line_w(rstrw s)\r\n\t{\r\n\t\treturn write(s.size(),s.begin())&&write(2,rstrw(\"\\n\").cstrw_t());\r\n\t}\r\n\r\n\tstatic rbool write_all_n(const rstrw& name,const rstr& cont)\r\n\t{\r\n\t\trfile file;\r\n\t\tifn(file.open_n(name))\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\treturn file.write(cont);\r\n\t}\r\n\r\n\tint size()\r\n\t{\r\n\t\treturn (int)size8();\r\n\t}\r\n\r\n\tint8 size8()\r\n\t{\r\n\t\tif(null==m_fp)\r\n\t\t{\r\n\t\t\treturn 0;//返回-1和返回0各有利弊\r\n\t\t}\r\n\t\tint8 cur=get_off8();\r\n\t\tfseek8(m_fp,0,SEEK_END);\r\n\t\tint8 ret=get_off8();\r\n\t\tset_off8(cur);\r\n\t\treturn ret;\r\n\t}\r\n\r\n\tint get_off()\r\n\t{\r\n\t\treturn (int)get_off8();\r\n\t}\r\n\r\n\tint8 get_off8()\r\n\t{\r\n\t\tif(null==m_fp)\r\n\t\t{\r\n\t\t\treturn 0;\r\n\t\t}\r\n\t\treturn ftell8(m_fp);\r\n\t}\r\n\r\n\trbool set_off(int off)\r\n\t{\r\n\t\treturn set_off8((int8)off);\r\n\t}\r\n\r\n\trbool set_off8(int8 off)\r\n\t{\r\n\t\treturn 0==fseek8(m_fp,off,SEEK_SET);\r\n\t}\r\n\r\n\tstatic rbool exist(rstrw name)\r\n\t{\r\n\t\tFILE* fp=fopen_w(name.cstrw_t(),rstrw(\"rb\").cstrw_t());\r\n\t\tif(null==fp)\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\tfclose(fp);\r\n\t\treturn true;\r\n\t}\r\n\r\n\t//强制创建文件\r\n\tstatic rbool create(rstrw name,int8 size=0)\r\n\t{\r\n\t\tFILE* fp=fopen_w(name.cstrw_t(),rstrw(\"wb\").cstrw_t());\r\n\t\tif(null==fp)\r\n\t\t\treturn false;\r\n\t\tfclose(fp);\r\n\t\tif(size>0)\r\n\t\t{\r\n\t\t\trfile file(name);\r\n\t\t\tfile.set_off8(size-1);\r\n\t\t\tif(!file.write(1,\"\\0\"))\r\n\t\t\t{\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\treturn file.close();\r\n\t\t}\r\n\t\treturn true;\r\n\t}\r\n\r\n\tstatic int8 ftell8(FILE* fp)\r\n\t{\r\n#ifdef _MSC_VER\r\n\t\treturn _ftelli64(fp);\r\n#else\r\n\t\treturn ftello(fp);\r\n#endif\r\n\t}\r\n\r\n\tstatic int fseek8(FILE* fp,int8 off,int start)\r\n\t{\r\n#ifdef _MSC_VER\r\n\t\treturn _fseeki64(fp,off,start);\r\n#else\r\n\t\treturn fseeko(fp,off,start);\r\n#endif\r\n\t}\r\n\r\n\tstatic FILE* fopen_w(wchar* name,wchar* mode)\r\n\t{\r\n#ifdef _MSC_VER\r\n\t\treturn _wfopen(name,mode);\r\n#else\r\n\t\treturn fopen(rstrw(name).torstr().cstr_t(),\r\n\t\t\trstrw(mode).torstr().cstr_t());\r\n#endif\r\n\t}\r\n\r\n\tstatic rbool remove(rstrw name)\r\n\t{\r\n#ifdef _MSC_VER\r\n\t\treturn 0==_wremove(name.cstrw_t());\r\n#else\r\n\t\treturn 0==::remove(name.torstr().cstr_t());\r\n#endif\t\r\n\t}\r\n\r\n\tstatic rbool rename(rstrw oldname,rstrw newname)\r\n\t{\r\n#ifdef _MSC_VER\r\n\t\treturn 0==::_wrename(oldname.cstrw_t(),newname.cstrw_t());\r\n#else\r\n\t\treturn 0==::rename(oldname.torstr().cstr_t(),\r\n\t\t\tnewname.torstr().cstr_t());\r\n#endif\r\n\t}\r\n#ifdef _MSC_VER\r\n\tstatic int get_exe_size(char* name)\r\n\t{\r\n\t\trstr temp=rfile::read_all_n(name);\r\n\t\tif(temp.empty())\r\n\t\t{\r\n\t\t\treturn 0;\r\n\t\t}\r\n\t\tuchar* data=temp.begin();\r\n\t\tPIMAGE_DOS_HEADER dos_head=(PIMAGE_DOS_HEADER)data;\r\n\t\tPIMAGE_OPTIONAL_HEADER op_head=(PIMAGE_OPTIONAL_HEADER)(\r\n\t\t\tdata+dos_head->e_lfanew+4+20);\r\n\t\tPIMAGE_FILE_HEADER file_head=(PIMAGE_FILE_HEADER)(\r\n\t\t\tdata+dos_head->e_lfanew+4);\r\n\t\tPIMAGE_SECTION_HEADER sec=(PIMAGE_SECTION_HEADER)(\r\n\t\t\tdata+dos_head->e_lfanew+sizeof(IMAGE_NT_HEADERS));\r\n\t\tint size=op_head->SizeOfHeaders;\r\n\t\tfor(int i=0;i<file_head->NumberOfSections;i++)\r\n\t\t{\r\n\t\t\tsize+=sec[i].SizeOfRawData;\r\n\t\t}\r\n\t\treturn size;\r\n\t}\r\n#endif\r\n\tstatic int8 get_update_time(rstrw path)\r\n\t{\r\n#ifdef _MSC_VER\r\n\t\tint8 ft;\r\n\t\tHANDLE hFile = CreateFileW(path.cstrw_t(),\r\n\t\t\tGENERIC_READ,\r\n\t\t\tFILE_SHARE_READ,\r\n\t\t\tnull,\r\n\t\t\tOPEN_EXISTING,\r\n\t\t\tFILE_ATTRIBUTE_NORMAL,\r\n\t\t\tnull);\r\n\t\tif(hFile == INVALID_HANDLE_VALUE)\r\n\t\t\treturn 0;\r\n\t\tif(!GetFileTime(hFile,null,null,(FILETIME*)&ft))\r\n\t\t\treturn 0;\r\n\t\tCloseHandle(hFile);\r\n\t\treturn ft;\r\n#else\r\n\t\treturn 0;\r\n\t\t/*struct stat buf;\r\n\t\tint ret=stat(path,&buf);\r\n\t\tif(0!=ret)\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\t*ft=(int64)buf.st_mtime;\r\n\t\treturn true;*/\r\n#endif\r\n\t}\r\n\r\n\tstatic int8 get_size8(rstrw name)\r\n\t{\r\n\t\trfile file(name);\r\n\t\treturn file.size8();\r\n\t}\r\n};\r\n\r\n#endif\r\n"
  },
  {
    "path": "rlib/rhash.h",
    "content": "﻿#ifndef rhash_h__\r\n#define rhash_h__\r\n\r\n#include \"rstr.h\"\r\n\r\ntemplate<typename T>\r\nstruct rhash_i\r\n{\r\n\tT val;\r\n\trstr name;\r\n\trhash_i* pre;\r\n\trhash_i* next;\r\n};\r\n\r\ntemplate<typename T>\r\nstruct rhash\r\n{\r\n\trbuf<rhash_i<T>*> m_hash;\r\n\tint m_count;\r\n\r\n\t~rhash()\r\n\t{\r\n\t\tclear();\r\n\t}\r\n\r\n\trhash()\r\n\t{\r\n\t\tinit();\r\n\t}\r\n\r\n\tT& operator[](const rstr& name)\r\n\t{\r\n\t\tT* p=(T*)find(name);\r\n\t\tif(p)\r\n\t\t\treturn *p;\r\n\t\t//找不到则插入一个空值\r\n\t\tT a;\r\n\t\tinsert(a,name);\r\n\t\tp=(T*)find(name);\r\n\t\treturn *p;\r\n\t}\r\n\r\n\tvoid init()\r\n\t{\r\n\t\t//两个字节消耗256K内存，如果用3个字节需要64M内存\r\n\t\tm_hash.realloc_n(65536);\r\n\t\tfor(int i=0;i<m_hash.count();i++)\r\n\t\t\tm_hash[i]=null;\r\n\t\tm_count=0;\r\n\t}\r\n\r\n\tvoid clear()\r\n\t{\r\n\t\tif(m_count==0)\r\n\t\t\treturn;\r\n\t\tfor(int i=0;i<m_hash.count();i++)\r\n\t\t{\r\n\t\t\tif(m_hash[i]!=null)\r\n\t\t\t{\r\n\t\t\t\trhash_i<T>* p=m_hash[i];\r\n\t\t\t\twhile(p!=null)\r\n\t\t\t\t{\r\n\t\t\t\t\trhash_i<T>* temp=p;\r\n\t\t\t\t\tp=p->next;\r\n\t\t\t\t\tr_delete(temp);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\tinit();\r\n\t}\r\n\r\n\trbool exist(const rstr& name)\r\n\t{\r\n\t\treturn find(name)!=null;\r\n\t}\r\n\r\n\tT* find(const rstr& name)\r\n\t{\r\n\t\tint addr=get_addr(name);\r\n\t\trhash_i<T>* p=m_hash[addr];\r\n\t\twhile(p)\r\n\t\t{\r\n\t\t\tif(p->name==name)\r\n\t\t\t\treturn (T*)p;\r\n\t\t\tp=p->next;\r\n\t\t}\r\n\t\treturn null;\r\n\t}\r\n\t\r\n\t//如果重复则不插入\r\n\tvoid insert_c(T& a,rstr name=rstr())\r\n\t{\r\n\t\tif(exist(name))\r\n\t\t\treturn;\r\n\t\tinsert(a,name);\r\n\t}\r\n\r\n\tvoid insert(T& a,rstr name=rstr())\r\n\t{\r\n\t\tint addr=get_addr(name);\r\n\t\trhash_i<T>* p=r_new<rhash_i<T> >();\r\n\t\tp->name=name;\r\n\t\tp->next=m_hash[addr];\r\n\t\tp->pre=null;\r\n\t\tp->val=a;\r\n\t\tif(m_hash[addr]!=null)\r\n\t\t\tm_hash[addr]->pre=p;\r\n\t\tm_hash[addr]=p;\r\n\t\tm_count++;\r\n\t}\r\n\r\n\trbool erase(rstr name=rstr())\r\n\t{\r\n\t\trhash_i<T>* p=(rhash_i<T>*)find(name);\r\n\t\tif(p==null)\r\n\t\t\treturn false;\r\n\t\tif(p->pre!=null)\r\n\t\t{\r\n\t\t\tp->pre->next=p->next;\r\n\t\t\tif(p->next!=null)\r\n\t\t\t\tp->next->pre=p->pre;\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tm_hash[get_addr(name)]=p->next;\r\n\t\t\tif(p->next!=null)\r\n\t\t\t\tp->next->pre=null;\r\n\t\t}\r\n\t\tr_delete(p);\r\n\t\tm_count--;\r\n\t\treturn true;\r\n\t}\r\n\r\n\tT* begin()\r\n\t{\r\n\t\tfor(int i=0;i<m_hash.count();i++)\r\n\t\t\tif(m_hash[i]!=null)\r\n\t\t\t\treturn (T*)m_hash[i];\r\n\t\treturn null;\r\n\t}\r\n\r\n\tT* rend()\r\n\t{\r\n\t\tfor(int i=m_hash.count()-1;i>=0;i--)\r\n\t\t\tif(m_hash[i]!=null)\r\n\t\t\t{\r\n\t\t\t\trhash_i<T>* p=m_hash[i];\r\n\t\t\t\twhile(p!=null&&p->next!=null)\r\n\t\t\t\t\tp=p->next;\r\n\t\t\t\treturn (T*)p;\r\n\t\t\t}\r\n\t\treturn null;\r\n\t}\r\n\t\r\n\t//这个next有点慢，能不能把一个桶的最后一个元素的next指向下一个桶？\r\n\tT* next(T* cur)\r\n\t{\r\n\t\trhash_i<T>* p=(rhash_i<T>*)cur;\r\n\t\tif(p->next!=null)\r\n\t\t\treturn (T*)p->next;\r\n\t\tint addr=get_addr(p->name);\r\n\t\tfor(int i=addr+1;i<m_hash.count();i++)\r\n\t\t\tif(m_hash[i]!=null)\r\n\t\t\t\treturn (T*)m_hash[i];\r\n\t\treturn null;\r\n\t}\r\n\r\n\tstatic int get_addr(const rstr& name)\r\n\t{\r\n\t\treturn (int)bkdr_hash16(name.begin(),name.count());\r\n\t}\r\n\r\n\tstatic int bkdr_hash32(void* data,int len)\r\n\t{\r\n\t\tuint seed=131; // 31 131 1313 13131 131313 etc..\r\n\t\tuint hash=0;\r\n\t\tfor(int i=0;i<len;++i)\r\n\t\t{\r\n\t\t\thash=(hash*seed)+((uchar*)data)[i];\r\n\t\t}\r\n\t\treturn (int)hash;\r\n\t}\r\n\r\n\tstatic ushort bkdr_hash16(void* data,int len)\r\n\t{\r\n\t\tint val=bkdr_hash32(data,len);\r\n\t\treturn val%65536;\r\n\t}\r\n};\r\n\r\n#endif"
  },
  {
    "path": "rlib/rindex.h",
    "content": "﻿#ifndef rindex_h__\r\n#define rindex_h__\r\n\r\n#include \"rlib/rdb.h\"\r\n#include \"rlib/rdir.h\"\r\n\r\nstruct rindex\r\n{\r\n\tstatic void run(int argc, char* argv[])\r\n\t{\r\n\t\tif(argc==3)\r\n\t\t{\r\n\t\t\tif(rstr(argv[2]).get_top()=='\\\\')\r\n\t\t\t{\r\n\t\t\t\tif(!build(rcode::gbk_to_utf8(argv[1]),\r\n\t\t\t\t\trcode::gbk_to_utf8(argv[2])))\r\n\t\t\t\t\trf::error(\"build error\");\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\tsearch(rcode::gbk_to_utf8(argv[1]),\r\n\t\t\t\t\trcode::gbk_to_utf8(argv[2]));\r\n\t\t\t}\r\n\t\t}\r\n\t\telif(argc==2)\r\n\t\t{\r\n\t\t\tif(!check(rcode::gbk_to_utf8(argv[1])))\r\n\t\t\t{\r\n\t\t\t\trf::error(\"check error\");\r\n\t\t\t}\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\trf::error(\"miss path\");\r\n\t\t}\r\n\t}\r\n\r\n\tstatic void search(rstrw name,rstr s)\r\n\t{\r\n\t\trdbint db(name);\r\n\t\tfor(int i=0;i<db.count();i+=3)\r\n\t\t{\r\n\t\t\tif(db[i].exist(s))\r\n\t\t\t{\r\n\t\t\t\trcode::utf8_to_gbk(db[i]).printl();\r\n\t\t\t\tdb[i+1].printl();\r\n\t\t\t\tdb[i+2].printl();\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tstatic rbool check(rstrw name)\r\n\t{\r\n\t\trdbint db(name);\r\n\t\tfor(int i=0;i<db.count();i+=3)\r\n\t\t{\r\n\t\t\trcode::utf8_to_gbk(db[i]).printl();\r\n\t\t\tdb[i+1].printl();\r\n\t\t\tdb[i+2].printl();\r\n\t\t}\r\n\t\treturn true;\r\n\t}\r\n\r\n\tstatic rbool build(rstrw filename,rstrw path)\r\n\t{\r\n\t\trbuf<rdir_item> list=rdir::get_file_bfs(path);\r\n\t\tr_qsort(list);\r\n\t\trdbint db(filename,rstrw(\"rw\"));\r\n\t\tfor(int i=0;i<list.count();i++)\r\n\t\t{\r\n\t\t\tif(!db.write_new(list[i].path.torstr()))\r\n\t\t\t{\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\tif(!db.write_new(rfile::get_update_time(list[i].path)))\r\n\t\t\t{\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\tif(!db.write_new(rfile::get_size8(list[i].path)))\r\n\t\t\t{\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\trcode::utf8_to_gbk(list[i].path.torstr()).printl();\r\n\t\t}\r\n\t\treturn true;\r\n\t}\r\n};\r\n\r\n#endif\r\n"
  },
  {
    "path": "rlib/rlist.h",
    "content": "﻿#ifndef rlist_h__\r\n#define rlist_h__\r\n\r\n#include \"rbase.h\"\r\n\r\ntemplate<typename T>\r\nstruct rlist_i\r\n{\r\n\tT val;\r\n\trlist_i* prev;\r\n\trlist_i* next;\r\n};\r\n\r\ntemplate<typename T>\r\nstruct rlist\r\n{\r\n\trlist_i<T>* m_front;\r\n\trlist_i<T>* m_rear;\r\n\tint m_count;\r\n\r\n\t~rlist<T>()\r\n\t{\r\n\t\tclear();\r\n\t}\r\n\r\n\trlist<T>()\r\n\t{\r\n\t\tinit();\r\n\t}\r\n\r\n\tvoid init()\r\n\t{\r\n\t\tm_front=null;\r\n\t\tm_rear=null;\r\n\t\tm_count=0;\r\n\t}\r\n\r\n\tvoid clear()\r\n\t{\r\n\t\twhile(m_front)\r\n\t\t{\r\n\t\t\tm_rear=m_front->next;\r\n\t\t\tr_delete(m_front);\r\n\t\t\tm_front=m_rear;\r\n\t\t}\r\n\t\tinit();\r\n\t}\r\n\r\n\trbool empty() const\r\n\t{\r\n\t\treturn m_count==0;\r\n\t}\r\n\r\n\tint count() const\r\n\t{\r\n\t\treturn m_count;\r\n\t}\r\n\r\n\tT& top()\r\n\t{\r\n\t\treturn *(T*)m_rear;\r\n\t}\r\n\r\n\tvoid push(const T& a)\r\n\t{\r\n\t\trlist_i<T>* p=r_new<rlist_i<T> >();\r\n\t\tp->val=a;\r\n\t\tp->next=null;\r\n\t\tp->prev=m_rear;\r\n\t\tif(empty())\r\n\t\t{\r\n\t\t\tm_front=p;\r\n\t\t\tm_rear=p;\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tm_rear->next=p;\r\n\t\t\tm_rear=p;\r\n\t\t}\r\n\t\tm_count++;\r\n\t}\r\n\r\n\tT pop()\r\n\t{\r\n\t\tm_count--;\r\n\t\trlist_i<T>* p=m_rear;\r\n\t\tT ret=p->val;\r\n\t\tm_rear=p->prev;\r\n\t\tif(m_rear)\r\n\t\t{\r\n\t\t\tm_rear->next=null;\r\n\t\t}\r\n\t\tif(empty())\r\n\t\t{\r\n\t\t\tm_front=null;\r\n\t\t}\r\n\t\tr_delete(p);\r\n\t\treturn ret;\r\n\t}\r\n\r\n\tvoid push_front(const T& a)\r\n\t{\r\n\t\trlist_i<T>* p=r_new<rlist_i<T> >();\r\n\t\tp->val=a;\r\n\t\tp->next=m_front;\r\n\t\tp->prev=null;\r\n\t\tif(empty())\r\n\t\t{\r\n\t\t\tm_front=p;\r\n\t\t\tm_rear=p;\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tm_front->prev=p;\r\n\t\t\tm_front=p;\r\n\t\t}\r\n\t\tm_count++;\r\n\t}\r\n\r\n\tT pop_front()\r\n\t{\r\n\t\tm_count--;\r\n\t\trlist_i<T>* p=m_front;\r\n\t\tT ret=p->val;\r\n\t\tm_front=p->next;\r\n\t\tif(m_front)\r\n\t\t{\r\n\t\t\tm_front->prev=null;\r\n\t\t}\r\n\t\tif(empty())\r\n\t\t{\r\n\t\t\tm_rear=null;\r\n\t\t}\r\n\t\tr_delete(p);\r\n\t\treturn ret;\r\n\t}\r\n\t\r\n\t//前插\r\n\tvoid insert(T* pos,const T& a)\r\n\t{\r\n\t\tif(pos==null)\r\n\t\t{\r\n\t\t\tpush(a);\r\n\t\t\treturn;\r\n\t\t}\r\n\t\trlist_i<T>* cur=(rlist_i<T>*)pos;\r\n\t\trlist_i<T>* p=r_new<rlist_i<T> >();\r\n\t\tp->val=a;\r\n\t\tp->next=cur;\r\n\t\tp->prev=cur->prev;\r\n\t\tif(cur->prev)\r\n\t\t{\r\n\t\t\tcur->prev->next=p;\r\n\t\t}\r\n\t\tcur->prev=p;\r\n\t\tif(p->prev==null)\r\n\t\t{\r\n\t\t\tm_front=p;\r\n\t\t}\r\n\t\tif(p->next==null)\r\n\t\t{\r\n\t\t\tm_rear=p;\r\n\t\t}\r\n\t\tm_count++;\r\n\t}\r\n\r\n\tvoid insert(int pos,const T& a)\r\n\t{\r\n\t\tinsert(index(pos),a);\r\n\t}\r\n\r\n\tvoid erase(T* pos)\r\n\t{\r\n\t\tif(pos==null)\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\t\trlist_i<T>* cur=(rlist_i<T>*)pos;\r\n\t\tif(cur->prev==null)\r\n\t\t{\r\n\t\t\tm_front=cur->next;\r\n\t\t}\r\n\t\tif(cur->next==null)\r\n\t\t{\r\n\t\t\tm_rear=cur->prev;\r\n\t\t}\r\n\t\tif(cur->prev)\r\n\t\t{\r\n\t\t\tcur->prev->next=cur->next;\r\n\t\t}\r\n\t\tif(cur->next)\r\n\t\t{\r\n\t\t\tcur->next->prev=cur->prev;\r\n\t\t}\r\n\t\tr_delete(cur);\r\n\t\tm_count--;\r\n\t}\r\n\r\n\tvoid erase(int pos)\r\n\t{\r\n\t\terase(index(pos));\r\n\t}\r\n\r\n\tT* index(int n)\r\n\t{\r\n\t\trlist_i<T>* p=m_front;\r\n\t\tfor(;n;n--)\r\n\t\t{\r\n\t\t\tif(p==null)\r\n\t\t\t{\r\n\t\t\t\treturn null;\r\n\t\t\t}\r\n\t\t\tp=p->next;\r\n\t\t}\r\n\t\treturn (T*)p;\r\n\t}\r\n\r\n\tT& operator[](int n)\r\n\t{\r\n\t\tT* p=index(n);\r\n\t\treturn *p;\r\n\t}\r\n\r\n\tT* begin()\r\n\t{\r\n\t\treturn (T*)m_front;\r\n\t}\r\n\r\n\tT* end()\r\n\t{\r\n\t\treturn null;\r\n\t}\r\n\r\n\tT* next(void* p)\r\n\t{\r\n\t\treturn (T*)((rlist_i<T>*)p)->next;\r\n\t}\r\n\r\n\tT* prev(void* p)\r\n\t{\r\n\t\treturn (T*)((rlist_i<T>*)p)->prev;\r\n\t}\r\n};\r\n\r\n#endif"
  },
  {
    "path": "rlib/rmutex.h",
    "content": "﻿#ifndef rmutex_h__\r\n#define rmutex_h__\r\n\r\n#ifdef _MSC_VER\r\n#include <windows.h>\r\n#else\r\n#include <semaphore.h>\r\n#endif\r\n\r\nstruct rmutex\r\n{\r\n#ifdef _MSC_VER\r\n\tCRITICAL_SECTION m_mutex;\r\n#else\r\n\tsem_t m_mutex;\r\n#endif\r\n\trmutex()\r\n\t{\r\n#ifdef _MSC_VER\r\n\t\tInitializeCriticalSection(&m_mutex);\r\n#else\r\n\t\tsem_init(&m_mutex,0,1);\r\n#endif\r\n\t}\r\n\r\n\t~rmutex()\r\n\t{\r\n#ifdef _MSC_VER\r\n\t\tDeleteCriticalSection(&m_mutex);\r\n#else\r\n#endif\r\n\t}\r\n\r\n\tvoid enter()\r\n\t{\r\n#ifdef _MSC_VER\r\n\t\tEnterCriticalSection(&m_mutex);\r\n#else\r\n\t\tsem_wait(&m_mutex);\r\n#endif\r\n\t}\r\n\r\n\tvoid leave()\r\n\t{\r\n#ifdef _MSC_VER\r\n\t\tLeaveCriticalSection(&m_mutex);\r\n#else\r\n\t\tsem_post(&m_mutex);\r\n#endif\r\n\t}\r\n};\r\n\r\n//用于整个函数的局部临时mutex\r\nstruct rmutex_t\r\n{\r\n\trmutex* m_p;\r\n\r\n\trmutex_t(rmutex& m)\r\n\t{\r\n\t\tm_p=&m;\r\n\t\tm_p->enter();\r\n\t}\r\n\r\n\t~rmutex_t()\r\n\t{\r\n\t\tm_p->leave();\r\n\t}\r\n};\r\n\r\n#endif"
  },
  {
    "path": "rlib/rset.h",
    "content": "﻿#ifndef rset_h__\r\n#define rset_h__\r\n\r\n#include \"rbase.h\"\r\n\r\ntemplate<typename T>\r\nstruct rset_i\r\n{\r\n\tT key;\r\n\trset_i* father;\r\n\trset_i* left;\r\n\trset_i* right;\r\n\tint col;\r\n};\r\n\r\ntemplate<typename T>\r\nstruct rset\r\n{\r\n\trset_i<T>* m_root;\r\n\trset_i<T> m_nil;\r\n\tint m_count;\r\n\r\n\tenum\r\n\t{\r\n\t\tc_black,\r\n\t\tc_red\r\n\t};\r\n\r\n\t~rset<T>()\r\n\t{\r\n\t\tclear();\r\n\t}\r\n\r\n\trset<T>()\r\n\t{\r\n\t\tinit();\r\n\t}\r\n\r\n\trset<T>(const rset<T>& a)\r\n\t{\r\n\t\tinit();\r\n\t\t//用递归拷贝更快\r\n\t\tcopy_x(&a.m_nil,a.m_root);\r\n\t\t/*for(T* p=a.begin();p!=a.end();p=a.next(p))\r\n\t\t\tinsert(*p);*/\r\n\t}\r\n\r\n\tvoid operator=(const rset<T>& a)\r\n\t{\r\n\t\tclear();\r\n\t\tcopy_x(&a.m_nil,a.m_root);\r\n\t\t/*for(T* p=a.begin();p!=a.end();p=a.next(p))\r\n\t\t\tinsert(*p);*/\r\n\t}\r\n\r\n\tvoid copy_x(const rset_i<T>* xnil,rset_i<T>* x)\r\n\t{\r\n\t\tif(x==xnil)\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tcopy_x(xnil,x->left);\r\n\t\tcopy_x(xnil,x->right);\r\n\t\tinsert(x->key);\r\n\t}\r\n\r\n\tvoid init()\r\n\t{\r\n\t\tm_nil.father=&m_nil;\r\n\t\tm_nil.left=&m_nil;\r\n\t\tm_nil.right=&m_nil;\r\n\t\tm_nil.col=c_black;\r\n\r\n\t\tm_root=&m_nil;\r\n\t\tm_count=0;\r\n\t}\r\n\r\n\tvoid clear()\r\n\t{\r\n\t\tclear_x(m_root);\r\n\t\tinit();\r\n\t}\r\n\r\n\tvoid clear_x(rset_i<T>* x)\r\n\t{\r\n\t\tif(x==&m_nil)\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tclear_x(x->left);\r\n\t\tclear_x(x->right);\r\n\t\tr_delete(x);\r\n\t}\r\n\r\n\trbool empty() const\r\n\t{\r\n\t\treturn m_count==0;\r\n\t}\r\n\r\n\tint count() const\r\n\t{\r\n\t\treturn m_count;\r\n\t}\r\n\r\n\tvoid left_rotate(rset_i<T>* x)\r\n\t{\r\n\t\trset_i<T>* y;\r\n\t\tif(x->right==&m_nil)\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\t\ty=x->right;\r\n\t\tx->right=y->left;\r\n\t\tif(y->left!=&m_nil)\r\n\t\t{\r\n\t\t\ty->left->father=x;\r\n\t\t}\r\n\t\ty->father=x->father;\r\n\t\tif(x->father==&m_nil)\r\n\t\t{\r\n\t\t\tm_root=y;\r\n\t\t}\r\n\t\telif(x->father->left==x)\r\n\t\t{\r\n\t\t\tx->father->left=y;\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tx->father->right=y;\r\n\t\t}\r\n\t\ty->left=x;\r\n\t\tx->father=y;\r\n\t}\r\n\r\n\tvoid right_rotate(rset_i<T>* x)\r\n\t{\r\n\t\trset_i<T>* y;\r\n\t\tif(x->left==&m_nil)\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\t\ty=x->left;\r\n\t\tx->left=y->right;\r\n\t\tif(y->right!=&m_nil)\r\n\t\t{\r\n\t\t\ty->right->father=x;\r\n\t\t}\r\n\t\ty->father=x->father;\r\n\t\tif(x->father==&m_nil)\r\n\t\t{\r\n\t\t\tm_root=y;\r\n\t\t}\r\n\t\telif(x->father->left==x)\r\n\t\t{\r\n\t\t\tx->father->left=y;\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tx->father->right=y;\r\n\t\t}\r\n\t\ty->right=x;\r\n\t\tx->father=y;\r\n\t}\r\n\r\n\t//重复代码需简化\r\n\tvoid insert_fixup(rset_i<T>* z)\r\n\t{\r\n\t\trset_i<T>* y;\r\n\t\twhile(z->father->col==c_red) \r\n\t\t{ \r\n\t\t\tif(z->father==z->father->father->left) \r\n\t\t\t{ \r\n\t\t\t\ty=z->father->father->right; \r\n\t\t\t\tif(y->col==c_red) \r\n\t\t\t\t{ \r\n\t\t\t\t\tz->father->col=c_black; \r\n\t\t\t\t\ty->col=c_black; \r\n\t\t\t\t\tz->father->father->col=c_red; \r\n\t\t\t\t\tz=z->father->father; \r\n\t\t\t\t} \r\n\t\t\t\telse \r\n\t\t\t\t{\r\n\t\t\t\t\tif(z==z->father->right) \r\n\t\t\t\t\t{ \r\n\t\t\t\t\t\tz=z->father; \r\n\t\t\t\t\t\tleft_rotate(z); \r\n\t\t\t\t\t} \r\n\t\t\t\t\tz->father->col=c_black; \r\n\t\t\t\t\tz->father->father->col=c_red; \r\n\t\t\t\t\tright_rotate(z->father->father); \r\n\t\t\t\t}\r\n\t\t\t} \r\n\t\t\telse \r\n\t\t\t{ \r\n\t\t\t\ty=z->father->father->left; \r\n\t\t\t\tif(y->col==c_red) \r\n\t\t\t\t{ \r\n\t\t\t\t\tz->father->col=c_black; \r\n\t\t\t\t\ty->col=c_black; \r\n\t\t\t\t\tz->father->father->col=c_red; \r\n\t\t\t\t\tz=z->father->father; \r\n\t\t\t\t} \r\n\t\t\t\telse \r\n\t\t\t\t{\r\n\t\t\t\t\tif(z==z->father->left) \r\n\t\t\t\t\t{ \r\n\t\t\t\t\t\tz=z->father; \r\n\t\t\t\t\t\tright_rotate(z); \r\n\t\t\t\t\t} \r\n\t\t\t\t\tz->father->col=c_black; \r\n\t\t\t\t\tz->father->father->col=c_red; \r\n\t\t\t\t\tleft_rotate(z->father->father);\r\n\t\t\t\t}\r\n\t\t\t} \r\n\t\t} \r\n\t\tm_root->col=c_black; \r\n\t}\r\n\r\n\tvoid insert_p(rset_i<T>* z)\r\n\t{\r\n\t\trset_i<T>* y=&m_nil;\r\n\t\trset_i<T>* x=m_root;\r\n\t\twhile(x!=&m_nil)\r\n\t\t{\r\n\t\t\ty=x;\r\n\t\t\tif(z->key<x->key)\r\n\t\t\t{\r\n\t\t\t\tx=x->left;\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\tx=x->right;\r\n\t\t\t}\r\n\t\t}\r\n\t\tz->father=y;\r\n\t\tif(y==&m_nil)\r\n\t\t{\r\n\t\t\tm_root=z;\r\n\t\t}\r\n\t\telif(z->key<y->key)\r\n\t\t{\r\n\t\t\ty->left=z;\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\ty->right=z;\r\n\t\t}\r\n\t\tz->left=&m_nil;\r\n\t\tz->right=&m_nil;\r\n\t\tz->col=c_red;\r\n\t\tinsert_fixup(z);\r\n\t}\r\n\r\n\tvoid insert(const T& a)\r\n\t{\r\n\t\trset_i<T>* p=r_new<rset_i<T> >();\r\n\t\tp->key=a;\r\n\t\tinsert_p(p);\r\n\t\tm_count++;\r\n\t}\r\n\r\n\tvoid insert_c(const T& a)\r\n\t{\r\n\t\tif(exist(a))\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tinsert(a);\r\n\t}\r\n\r\n\t/*void test(rset_i<T>* z)\r\n\t{\r\n\t\tif(z!=&m_nil)\r\n\t\t{\r\n\t\t\ttest(z->left);\r\n\t\t\tz->key.printl();\r\n\t\t\ttest(z->right);\r\n\t\t}\r\n\t}*/\r\n\r\n\tvoid erase_fixup(rset_i<T>* x)\r\n\t{\r\n\t\trset_i<T>* w;\r\n\t\twhile(x!=m_root&&x->col==c_black)\r\n\t\t{\r\n\t\t\tif(x==x->father->left)\r\n\t\t\t{\r\n\t\t\t\tw=x->father->right;\r\n\t\t\t\tif(w->col==c_red)\r\n\t\t\t\t{\r\n\t\t\t\t\tw->col=c_black;\r\n\t\t\t\t\tx->father->col=c_red;\r\n\t\t\t\t\tleft_rotate(x->father);\r\n\t\t\t\t\tw=x->father->right;\r\n\t\t\t\t}\r\n\t\t\t\tif(w->left->col==c_black&&w->right->col==c_black)\r\n\t\t\t\t{\r\n\t\t\t\t\tw->col=c_red;\r\n\t\t\t\t\tx=x->father;\r\n\t\t\t\t}\r\n\t\t\t\telse \r\n\t\t\t\t{\r\n\t\t\t\t\tif(w->right->col==c_black)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tw->left->col=c_black;\r\n\t\t\t\t\t\tw->col=c_red;\r\n\t\t\t\t\t\tright_rotate(w);\r\n\t\t\t\t\t\tw=x->father->right;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tw->col=x->father->col;\r\n\t\t\t\t\tx->father->col=c_black;\r\n\t\t\t\t\tw->right->col=c_black;\r\n\t\t\t\t\tleft_rotate(x->father);\r\n\t\t\t\t\tx=m_root;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\tw=x->father->left;\r\n\t\t\t\tif(w->col==c_red)\r\n\t\t\t\t{\r\n\t\t\t\t\tw->col=c_black;\r\n\t\t\t\t\tx->father->col=c_red;\r\n\t\t\t\t\tright_rotate(x->father);\r\n\t\t\t\t\tw=x->father->left;\r\n\t\t\t\t}\r\n\t\t\t\tif(w->right->col==c_black&&w->left->col==c_black)\r\n\t\t\t\t{\r\n\t\t\t\t\tw->col=c_red;\r\n\t\t\t\t\tx=x->father;\r\n\t\t\t\t}\r\n\t\t\t\telse\r\n\t\t\t\t{\r\n\t\t\t\t\tif(w->left->col==c_black)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tw->right->col=c_black;\r\n\t\t\t\t\t\tw->col=c_red;\r\n\t\t\t\t\t\tleft_rotate(w);\r\n\t\t\t\t\t\tw=x->father->left;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tw->col=x->father->col;\r\n\t\t\t\t\tx->father->col=c_black;\r\n\t\t\t\t\tw->left->col=c_black;\r\n\t\t\t\t\tright_rotate(x->father);\r\n\t\t\t\t\tx=m_root;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\tx->col=c_black;\r\n\t}\r\n\r\n\tvoid transplant(rset_i<T>* u,rset_i<T>* v)\r\n\t{\r\n\t\tif(u->father==&m_nil)\r\n\t\t{\r\n\t\t\tm_root=v;\r\n\t\t}\r\n\t\telif(u==u->father->left)\r\n\t\t{\r\n\t\t\tu->father->left=v;\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tu->father->right=v;\r\n\t\t}\r\n\t\tv->father=u->father;\r\n\t}\r\n\r\n\tvoid erase_p(rset_i<T>* z)\r\n\t{\r\n\t\trset_i<T>* y=z;\r\n\t\trset_i<T>* x;\r\n\t\tint y_original_col=y->col;\r\n\t\tif(z->left==&m_nil)\r\n\t\t{\r\n\t\t\tx=z->right;\r\n\t\t\ttransplant(z,z->right);\r\n\t\t}\r\n\t\telif(z->right==&m_nil)\r\n\t\t{\r\n\t\t\tx=z->left;\r\n\t\t\ttransplant(z,z->left);\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\ty=minimum(z->right);\r\n\t\t\ty_original_col=y->col;\r\n\t\t\tx=y->right;\r\n\t\t\tif(y->father==z)\r\n\t\t\t{\r\n\t\t\t\tx->father=y;\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\ttransplant(y,y->right);\r\n\t\t\t\ty->right=z->right;\r\n\t\t\t\ty->right->father=y;\r\n\t\t\t}\r\n\t\t\ttransplant(z,y);\r\n\t\t\ty->left=z->left;\r\n\t\t\ty->left->father=y;\r\n\t\t\ty->col=z->col;\r\n\t\t}\r\n\t\tif(y_original_col==c_black)\r\n\t\t{\r\n\t\t\terase_fixup(x);\r\n\t\t}\r\n\t}\r\n\r\n\tvoid erase(const T& a)\r\n\t{\r\n\t\trset_i<T>* x=search(m_root,a);\r\n\t\tif(x!=&m_nil)\r\n\t\t{\r\n\t\t\terase_p(x);\r\n\t\t\tr_delete(x);\r\n\t\t\tm_count--;\r\n\t\t}\r\n\t}\r\n\r\n\tbool exist(const T& a) const\r\n\t{\r\n\t\treturn search(m_root,a)!=&m_nil;\r\n\t}\r\n\r\n\trset_i<T>* successor(rset_i<T>* x) const\r\n\t{\r\n\t\trset_i<T>* y;\r\n\t\tif(x->right!=&m_nil)\r\n\t\t{\r\n\t\t\treturn minimum(x->right);\r\n\t\t}\r\n\t\ty=x->father;\r\n\t\twhile(y!=&m_nil&&x==y->right)\r\n\t\t{\r\n\t\t\tx=y;\r\n\t\t\ty=y->father;\r\n\t\t}\r\n\t\treturn y;\r\n\t}\r\n\r\n\trset_i<T>* predecessor(rset_i<T>* x) const\r\n\t{\r\n\t\trset_i<T>* y;\r\n\t\tif(x->left!=&m_nil)\r\n\t\t{\r\n\t\t\treturn maximum(x->left);\r\n\t\t}\r\n\t\ty=x->father;\r\n\t\twhile(y!=&m_nil&&x==y->left)\r\n\t\t{\r\n\t\t\tx=y;\r\n\t\t\ty=y->father;\r\n\t\t}\r\n\t\treturn y;\r\n\t}\r\n\r\n\trset_i<T>* minimum(rset_i<T>* x) const\r\n\t{\r\n\t\twhile(x->left!=&m_nil)\r\n\t\t{\r\n\t\t\tx=x->left;\r\n\t\t}\r\n\t\treturn x;\r\n\t}\r\n\r\n\trset_i<T>* maximum(rset_i<T>* x) const\r\n\t{\r\n\t\twhile(x->right!=&m_nil)\r\n\t\t{\r\n\t\t\tx=x->right;\r\n\t\t}\r\n\t\treturn x;\r\n\t}\r\n\r\n\trset_i<T>* search(rset_i<T>* x,const T& a) const\r\n\t{\r\n\t\twhile(x!=&m_nil&&r_not_equal<T>(a,x->key))\r\n\t\t{\r\n\t\t\tif(a<x->key)\r\n\t\t\t{\r\n\t\t\t\tx=x->left;\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\tx=x->right;\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn x;\r\n\t}\r\n\r\n\tT* find(const T& a) const\r\n\t{\r\n\t\trset_i<T>* x=search(m_root,a);\r\n\t\tif(x==&m_nil)\r\n\t\t{\r\n\t\t\treturn null;\r\n\t\t}\r\n\t\treturn (T*)x;\r\n\t}\r\n\r\n\tT* next(void* p) const\r\n\t{\r\n\t\trset_i<T>* x=successor((rset_i<T>*)p);\r\n\t\tif(x==&m_nil)\r\n\t\t{\r\n\t\t\treturn null;\r\n\t\t}\r\n\t\treturn (T*)x;\r\n\t}\r\n\t\r\n\tT* prev(void* p) const\r\n\t{\r\n\t\trset_i<T>* x=predecessor((rset_i<T>*)p);\r\n\t\tif(x==&m_nil)\r\n\t\t{\r\n\t\t\treturn null;\r\n\t\t}\r\n\t\treturn (T*)x;\r\n\t}\r\n\r\n\tT* begin() const\r\n\t{\r\n\t\trset_i<T>* x=minimum(m_root);\r\n\t\tif(x==&m_nil)\r\n\t\t{\r\n\t\t\treturn null;\r\n\t\t}\r\n\t\treturn (T*)x;\r\n\t}\r\n\r\n\tstatic T* end()\r\n\t{\r\n\t\treturn null;\r\n\t}\r\n\r\n\tT* index(int n) const\r\n\t{\r\n\t\tT* p=begin();\r\n\t\tfor(;n;n--)\r\n\t\t{\r\n\t\t\tif(p==null)\r\n\t\t\t{\r\n\t\t\t\treturn null;\r\n\t\t\t}\r\n\t\t\tp=next(p);\r\n\t\t}\r\n\t\treturn p;\r\n\t}\r\n\r\n\t/*T& operator[](int n)\r\n\t{\r\n\t\tT* p=index(n);\r\n\t\treturn *p;\r\n\t}*/\r\n};\r\n\r\n#endif"
  },
  {
    "path": "rlib/rsock.h",
    "content": "﻿#ifndef rsock_h__\r\n#define rsock_h__\r\n\r\n#ifdef _MSC_VER\r\n#include <winsock2.h>\r\n#include <windows.h>\r\ntypedef UINT_PTR rsocket;\r\n#else\r\n#include <netinet/in.h>\r\n#include <sys/socket.h>\r\n#include <unistd.h>\r\n#include <fcntl.h>\r\n#include <netdb.h>\r\n#include <sys/types.h>\r\n#include <linux/if.h>\r\n#include <sys/ioctl.h>\r\ntypedef int rsocket;\r\n#endif\r\n\r\n#include \"rbase.h\"\r\n#include \"rstr.h\"\r\n#include <stdio.h>\r\n#include <stdlib.h>\r\n#include <stdio.h>\r\n#include <string.h>\r\n\r\nstruct rsock//only use TCP\r\n{\r\n\trsocket m_socket;\r\n\r\n\tenum\r\n\t{\r\n\t\tc_time_out=10,\r\n\t\tc_max_ip_len=15,\r\n\t};\r\n\r\n\trsock()\r\n\t{\r\n#ifdef _MSC_VER\r\n\t\tm_socket=INVALID_SOCKET;\r\n#else\r\n\t\tm_socket=-1;\r\n#endif\r\n\t}\r\n\r\n\t~rsock()\r\n\t{\r\n#ifdef _MSC_VER\r\n\t\tif(m_socket!=INVALID_SOCKET)\r\n\t\t{\r\n\t\t\tclose();\r\n\t\t}\r\n#else\r\n\t\tif(m_socket<0)\r\n\t\t{\r\n\t\t\tclose();\r\n\t\t}\r\n#endif\r\n\t}\r\n\r\n\trbool socket()\r\n\t{\r\n\t\tm_socket=::socket(AF_INET,SOCK_STREAM,0);\r\n#ifdef _MSC_VER\r\n\t\treturn m_socket!=INVALID_SOCKET;\r\n#else\r\n\t\treturn m_socket>=0;\r\n#endif\r\n\t}\r\n\r\n\trbool connect(const char* hostname,int port)\r\n\t{\r\n\t\tstruct hostent* hp=gethostbyname(hostname);\r\n\r\n\t\tif(null==hp)\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tstruct sockaddr_in addr;\r\n\t\taddr.sin_family=AF_INET;\r\n#ifdef _MSC_VER\r\n\t\tmemcpy(&addr.sin_addr.S_un.S_addr,hp->h_addr_list[0],hp->h_length);\r\n#else\r\n\t\tmemcpy(&addr.sin_addr.s_addr,hp->h_addr_list[0],hp->h_length);\r\n#endif\r\n\t\taddr.sin_port=htons((ushort)port);\r\n\r\n\t\tint nRevTime = c_time_out*1000;\r\n\t\tsetsockopt(m_socket,SOL_SOCKET,SO_SNDTIMEO,\r\n\t\t\t(char*)&nRevTime,r_size(nRevTime));\r\n\t\tsetsockopt(m_socket,SOL_SOCKET,SO_RCVTIMEO,\r\n\t\t\t(char*)&nRevTime,r_size(nRevTime));\r\n\t\t//设置非阻塞方式连接\r\n#ifdef _MSC_VER\r\n\t\tunsigned long ul=1;\r\n\r\n\t\tif(SOCKET_ERROR==ioctlsocket(m_socket,FIONBIO,(unsigned long*)&ul))\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tif(SOCKET_ERROR!=::connect(m_socket,(struct sockaddr*)&addr,r_size(addr)))\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tstruct timeval timeout;\r\n\t\tfd_set r;\r\n\t\tFD_ZERO(&r);\r\n\t\tFD_SET(m_socket,&r);\r\n\t\ttimeout.tv_sec=c_time_out;//连接超时\r\n\t\ttimeout.tv_usec=0;\r\n\r\n\t\tif(select(0,0,&r,0,&timeout)<=0)\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tul=0;\r\n\r\n\t\tif(SOCKET_ERROR==ioctlsocket(m_socket,FIONBIO,(unsigned long*)&ul))\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n#else\r\n\t\t/*if(0!=fcntl(m_socket, F_SETFL, fcntl(m_socket, F_GETFL) | O_NONBLOCK))\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}*/\r\n\r\n\t\tunsigned long ul=1;\r\n\r\n\t\tif(0!=ioctl(m_socket,FIONBIO,(unsigned long*)&ul))\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tif(0<=::connect(m_socket,(struct sockaddr*)&addr,r_size(addr)))\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tstruct timeval timeout;\r\n\t\tfd_set r;\r\n\t\tFD_ZERO(&r);\r\n\t\tFD_SET(m_socket,&r);\r\n\t\ttimeout.tv_sec=c_time_out;//连接超时\r\n\t\ttimeout.tv_usec=0;\r\n\r\n\t\tif(select(m_socket+1,0,&r,0,&timeout)<=0)\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tul=0;\r\n\r\n\t\tif(0!=ioctl(m_socket,FIONBIO,(unsigned long*)&ul))\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n#endif\r\n\t\treturn true;\r\n\t}\r\n\r\n\trbool close()\r\n\t{\r\n#ifdef _MSC_VER\r\n\t\tint ret=closesocket(m_socket);\r\n\t\tm_socket=INVALID_SOCKET;\r\n#else\r\n\t\tint ret=::close(m_socket);\r\n\t\tm_socket=-1;\r\n#endif\r\n\t\treturn 0==ret;\r\n\t}\r\n\r\n\tstatic rbool close(rsocket socket)\r\n\t{\r\n#ifdef _MSC_VER\r\n\t\tint ret=closesocket(socket);\r\n#else\r\n\t\tint ret=::close(socket);\r\n#endif\r\n\t\treturn 0==ret;\r\n\t}\r\n\r\n\tint send(int size,const void* data)//failed will return -1\r\n\t{\r\n#ifdef _MSC_VER\r\n\t\tint ret=::send(m_socket,(char*)data,size,0);\r\n#else\r\n\t\tint ret=::send(m_socket,(char*)data,size,MSG_NOSIGNAL);\r\n#endif\r\n\t\t/*if(ret<=0)\r\n\t\t{\r\n\t\t\treturn -1;\r\n\t\t}*/\r\n\t\treturn ret;\r\n\t}\r\n\r\n\tint recv(int size,void* data)\r\n\t{\r\n#ifdef _MSC_VER\r\n\t\tint ret=::recv(m_socket,(char*)data,size,0);\r\n#else\r\n\t\tint ret=::recv(m_socket,(char*)data,size,MSG_NOSIGNAL);\r\n#endif\r\n\t\t/*if(ret<=0)\r\n\t\t{\r\n\t\t\treturn -1;\r\n\t\t}*/\r\n\t\treturn ret;\r\n\t}\r\n\r\n\tint send_all(int size,const void* data)\r\n\t{\r\n\t\tint sendBytes=0;\r\n\t\twhile(sendBytes<size)\r\n\t\t{\r\n\t\t\tint temp=send(size-sendBytes,(char*)data+sendBytes);\r\n\t\t\tif(temp<=0)\r\n\t\t\t{\r\n\t\t\t\treturn sendBytes;\r\n\t\t\t}\r\n\t\t\telif(temp<size-sendBytes)\r\n\t\t\t{\r\n\t\t\t\treturn sendBytes+temp;\r\n\t\t\t}\r\n\t\t\tsendBytes+=temp;\r\n\t\t}\r\n\t\treturn sendBytes;\r\n\t}\r\n\r\n\trbool bind(int port)\r\n\t{\r\n\t\tstruct sockaddr_in addr;\r\n\t\taddr.sin_family=AF_INET;\r\n#ifdef _MSC_VER\r\n\t\taddr.sin_addr.S_un.S_addr=htonl(INADDR_ANY);\r\n#else\r\n\t\taddr.sin_addr.s_addr=htonl(INADDR_ANY);\r\n#endif\r\n\t\taddr.sin_port=htons((ushort)port);\r\n\t\treturn ::bind(m_socket,(struct sockaddr*)&addr,r_size(addr))>=0;\r\n\t}\r\n\r\n\trbool listen()\r\n\t{\r\n#ifdef _MSC_VER\r\n\t\treturn ::listen(m_socket,5)>=0;\r\n#else\r\n\t\treturn ::listen(m_socket,5)>=0;\r\n#endif\r\n\t}\r\n\r\n\t//clientip array at least c_max_ip_len+1 length\r\n\trbool accept(rsocket* socket,char* clientip=null,int* port=null)\r\n\t{\r\n\t\tstruct sockaddr_in addr;\r\n\t\tint len=r_size(addr);\r\n#ifdef _MSC_VER\r\n\t\t*socket=::accept(m_socket,(struct sockaddr*)&addr,&len);\r\n\t\tif(INVALID_SOCKET==*socket)\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n#else\r\n\t\t*socket=::accept(m_socket,(struct sockaddr*)&addr,(socklen_t*)&len);\r\n\t\tif(*socket<0)\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n#endif\r\n\t\treturn true;\r\n\t}\r\n\r\n\trbool listen_direct(int port)\r\n\t{\r\n\t\treturn socket()&&bind(port)&&listen();\r\n\t}\r\n\r\n\trbool connect_direct(const char* hostname,int port)\r\n\t{\r\n\t\treturn socket()&&connect(hostname,port);\r\n\t}\r\n\r\n\trbool sends(rstr s)\r\n\t{\r\n\t\tif(4!=send(4,&s.m_buf.m_count))\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\treturn s.count()==send_all(s.count(),s.begin());\r\n\t}\r\n\r\n\trstr recvs()\r\n\t{\r\n\t\trstr ret;\r\n\t\tint size;\r\n\t\tif(recv(4,&size)!=4)\r\n\t\t{\r\n\t\t\treturn ret;\r\n\t\t}\r\n\t\tif(size<=0)\r\n\t\t{\r\n\t\t\treturn ret;\r\n\t\t}\r\n\t\tret.m_buf.realloc_n(size);\r\n\t\tint recvBytes=0;\r\n\t\twhile(recvBytes<size)\r\n\t\t{\r\n\t\t\tint temp=recv(size-recvBytes,ret.begin()+recvBytes);\r\n\t\t\tif(temp<=0)\r\n\t\t\t{\r\n\t\t\t\tret.clear();\r\n\t\t\t\treturn ret;\r\n\t\t\t}\r\n\t\t\trecvBytes+=temp;\r\n\t\t}\r\n\t\tif(recvBytes!=size)\r\n\t\t{\r\n\t\t\tret.clear();\r\n\t\t}\r\n\t\treturn ret;\r\n\t}\r\n\r\n\tstatic int s_socket(int af,int type,int protocol)\r\n\t{\r\n\t\treturn ::socket(af,type,protocol);\r\n\t}\r\n\r\n\tstatic int s_connect(int s,void* name,int namelen)\r\n\t{\r\n\t\treturn ::connect(s,(const struct sockaddr*)name,namelen);\r\n\t}\r\n\r\n\tstatic int s_close(int s)\r\n\t{\r\n#ifdef _MSC_VER\r\n\t\treturn ::closesocket(s);\r\n#else\r\n\t\treturn ::close(s);\r\n#endif\r\n\t}\r\n\r\n\tstatic int s_send(int s,void* data,int size,int flags)\r\n\t{\r\n\t\treturn ::send(s,(const char*)data,size,flags);\r\n\t}\r\n\r\n\tstatic int s_recv(int s,void* data,int size,int flags)\r\n\t{\r\n\t\treturn ::recv(s,(char*)data,size,flags);\r\n\t}\r\n\r\n\tstatic int s_bind(int s,void* addr,int namelen)\r\n\t{\r\n\t\treturn ::bind(s,(const struct sockaddr*)addr,namelen);\r\n\t}\r\n\r\n\tstatic int s_listen(int s,int backlog)\r\n\t{\r\n\t\treturn ::listen(s,backlog);\r\n\t}\r\n\r\n\tstatic int s_accept(int s,void* addr,int* addrlen)\r\n\t{\r\n#ifdef _MSC_VER\r\n\t\treturn ::accept((SOCKET)s,(struct sockaddr*)addr,addrlen);\r\n#else\r\n\t\treturn ::accept(s,(struct sockaddr*)addr,addrlen);\r\n#endif\r\n\t}\r\n};\r\n\r\n\r\n#endif"
  },
  {
    "path": "rlib/rstr.h",
    "content": "﻿#ifndef rstr_h__\r\n#define rstr_h__\r\n\r\n#include \"rbuf.h\"\r\n#include \"ralgo.h\"\r\n#ifdef _MSC_VER\r\n#include <conio.h>\r\n#else\r\n#include <stdarg.h>\r\n#endif\r\n\r\nstruct rstr\r\n{\r\n\trbuf<uchar> m_buf;\r\n\r\n\t~rstr()\r\n\t{\r\n\t}\r\n\r\n\trstr()\r\n\t{\r\n\t}\r\n\r\n\trstr(const void* p)\r\n\t{\r\n\t\tset(p);\r\n\t}\r\n\r\n\trstr(void* p,int len)\r\n\t{\r\n\t\tm_buf.alloc(len);\r\n\t\tmemcpy(begin(),p,len);\r\n\t}\r\n\r\n\trstr(const void* p,const void* q)\r\n\t{\r\n\t\t/*if(p>=q)\r\n\t\t{\r\n\t\t\terror(\"\");\r\n\t\t}*/\r\n\t\tint len=(int)((uchar*)q-(uchar*)p);\r\n\t\tm_buf.alloc(len);\r\n\t\tmemcpy(begin(),p,len);\r\n\t}\r\n\r\n\trstr(int i)\r\n\t{\r\n\t\tchar tmp[20];\r\n\t\tsprintf(tmp,\"%d\",i);\r\n\t\tset(tmp);\r\n\t}\r\n\r\n\trstr(uint i)\r\n\t{\r\n\t\tchar tmp[20];\r\n\t\tsprintf(tmp,\"%u\",i);\r\n\t\tset(tmp);\r\n\t}\r\n\r\n\trstr(double i)\r\n\t{\r\n\t\tchar tmp[128];\r\n\t\tsprintf(tmp,\"%f\",i);\r\n\t\tset(tmp);\r\n\t}\r\n\r\n\trstr(int8 i)\r\n\t{\r\n\t\tchar tmp[100];\r\n#ifdef _MSC_VER\r\n\t\tsprintf(tmp,\"%I64d\",i);\r\n#else\r\n\t\tsprintf(tmp,\"%lld\",i);\r\n#endif\r\n\t\tset(tmp);\r\n\t}\r\n\r\n\trstr(const rstr& s)\r\n\t{\r\n\t\tm_buf.alloc_not_change(s.m_buf.m_cmax);\r\n\t\tm_buf.m_count=s.count();\r\n\t\tmemcpy(begin(),s.begin(),s.count());\r\n\t}\r\n\r\n\trstr(rstr&& s)\r\n\t{\r\n\t\tm_buf.move(s.m_buf);\r\n\t}\r\n\r\n\t//todo:改为const\r\n\tint toint()\r\n\t{\r\n\t\tint result;\r\n\t\tsscanf(cstr_t(),\"%d\",&result);\r\n\t\treturn result;\r\n\t}\r\n\r\n\tuint touint()\r\n\t{\r\n\t\tuint result;\r\n\t\tsscanf(cstr_t(),\"%u\",&result);\r\n\t\treturn result;\r\n\t}\r\n\r\n\tdouble todouble()\r\n\t{\r\n\t\tdouble result;\r\n\t\tsscanf(cstr_t(),\"%lf\",&result);\r\n\t\treturn result;\r\n\t}\r\n\r\n\tint8 toint8()\r\n\t{\r\n\t\tint64 result;\r\n#ifdef _MSC_VER\r\n\t\tsscanf(cstr_t(),\"%I64d\",&result);\r\n#else\r\n\t\tsscanf(cstr_t(),\"%lld\",&result);\r\n#endif\r\n\t\treturn result;\r\n\t}\r\n\r\n\trstr torstr()\r\n\t{\r\n\t\treturn *this;\r\n\t}\r\n\r\n\tuchar* cstr()\r\n\t{\r\n\t\tpush((uchar)0);\r\n\t\tpop();\r\n\t\treturn begin();\r\n\t}\r\n\r\n\tchar* cstr_t()\r\n\t{\r\n\t\treturn (char*)cstr();\r\n\t}\r\n\r\n\tushort* cstrw()\r\n\t{\r\n\t\tpush((uchar)0);\r\n\t\tpush((uchar)0);\r\n\t\tpop();\r\n\t\tpop();\r\n\t\treturn (ushort*)begin();\r\n\t}\r\n\r\n\twchar* cstrw_t()\r\n\t{\r\n\t\treturn (wchar*)cstrw();\r\n\t}\r\n\t\r\n\t//赋值函数千万不要让编译器自动生成\r\n\tvoid operator=(const rstr& s)\r\n\t{\r\n\t\tm_buf.realloc_n_not_change(s.m_buf.m_cmax);\r\n\t\tm_buf.m_count=s.count();\r\n\t\tmemcpy(begin(),s.begin(),s.count());\r\n\t\t//m_buf=a.m_buf;\r\n\t}\r\n\r\n\tvoid operator=(rstr&& s)\r\n\t{\r\n\t\tm_buf.free();\r\n\t\tm_buf.move(s.m_buf);\r\n\t}\r\n\r\n\tuchar& operator[](int num) const \r\n\t{\r\n\t\treturn m_buf[num];\r\n\t}\r\n\r\n\tfriend rbool operator==(const rstr& a,const rstr& b)\r\n\t{\r\n\t\treturn a.m_buf==b.m_buf;\r\n\t}\r\n\r\n\tfriend rbool operator!=(const rstr& a,const rstr& b)\r\n\t{\r\n\t\treturn a.m_buf!=b.m_buf;\r\n\t}\r\n\r\n\t//有待优化\r\n\tfriend rstr operator+(const rstr& a,const rstr& b)\r\n\t{\r\n\t\t/*rstr ret;\r\n\t\tret.m_buf=a.m_buf+b.m_buf;\r\n\t\treturn ret;*/\r\n\r\n\t\tint total=a.count()+b.count();\r\n\t\tint max=r_max(a.m_buf.m_cmax,b.m_buf.m_cmax);\r\n\t\trstr ret;\r\n\t\tif(total>max)\r\n\t\t{\r\n\t\t\tret.m_buf.alloc_not_change(rbuf<char>::extend_num(total));\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tret.m_buf.alloc_not_change(max);\r\n\t\t}\r\n\t\tret.m_buf.m_count=total;\r\n\t\tmemcpy(ret.begin(),a.begin(),a.m_buf.m_count);\r\n\t\tmemcpy(ret.begin()+a.m_buf.m_count,b.begin(),b.m_buf.m_count);\r\n\t\treturn r_move(ret);\r\n\t}\r\n\r\n\tvoid operator+=(const rstr& a)\r\n\t{\r\n\t\tm_buf+=a.m_buf;\r\n\t}\r\n\r\n\tvoid operator+=(rstr&& a)\r\n\t{\r\n\t\tm_buf+=r_move(a.m_buf);\r\n\t}\r\n\r\n\tvoid operator+=(uchar ch)\r\n\t{\r\n\t\tm_buf+=ch;\r\n\t}\r\n\r\n\tfriend rbool operator<(const rstr& a,const rstr& b)\r\n\t{\r\n\t\tfor(int i=0;i<a.count()&&i<b.count();i++)\r\n\t\t\tif(a[i]!=b[i])\r\n\t\t\t\treturn a[i]<b[i];\r\n\t\treturn a.count()<b.count();\r\n\t}\r\n\r\n\tfriend rbool operator>(const rstr& a,const rstr& b)\r\n\t{\r\n\t\treturn b<a;\r\n\t}\r\n\r\n\tfriend rbool operator<=(const rstr& a,const rstr& b)\r\n\t{\r\n\t\t//return a<b||a==b;\r\n\t\treturn !(a>b);\r\n\t}\r\n\r\n\tfriend rbool operator>=(const rstr& a,const rstr& b)\r\n\t{\r\n\t\t//return a>b||a==b;\r\n\t\treturn !(a<b);\r\n\t}\r\n\r\n\tuchar* set_size(int size)\r\n\t{\r\n\t\tm_buf.realloc_n(size);\r\n\t\treturn begin();\r\n\t}\r\n\r\n\tvoid set(const void* p)\r\n\t{\r\n\t\t//todo 如果字符串长度为0没必要分配内存\r\n\t\tint len=(int)strlen((const char*)p);\r\n\t\tm_buf.realloc_n_not_change(rbuf<uchar>::extend_num(len));\r\n\t\tm_buf.m_count=len;\r\n\t\tmemcpy(m_buf.begin(),p,len);\r\n\t}\r\n\r\n\tvoid push(uchar ch)\r\n\t{\r\n\t\tm_buf.push(ch);\r\n\t}\r\n\r\n\tvoid push_front(uchar ch)\r\n\t{\r\n\t\tm_buf.push_front(ch);\r\n\t}\r\n\r\n\tuchar pop()\r\n\t{\r\n\t\treturn m_buf.pop();\r\n\t}\r\n\r\n\tuchar pop_front()\r\n\t{\r\n\t\treturn m_buf.pop_front();\r\n\t}\r\n\r\n\tint count() const \r\n\t{\r\n\t\treturn m_buf.count();\r\n\t}\r\n\r\n\tint size() const\r\n\t{\r\n\t\treturn count();\r\n\t}\r\n\r\n\tuchar* begin() const \r\n\t{\r\n\t\treturn m_buf.begin();\r\n\t}\r\n\r\n\tuchar* end() const \r\n\t{\r\n\t\treturn m_buf.end();\r\n\t}\r\n\r\n\trbool empty() const \r\n\t{\r\n\t\treturn m_buf.empty();\r\n\t}\r\n\r\n\tvoid clear()\r\n\t{\r\n\t\tm_buf.clear();\r\n\t}\r\n\r\n\tstatic uchar* next(void* p)\r\n\t{\r\n\t\treturn ((uchar*)p)+1;\r\n\t}\r\n\r\n\tstatic uchar* prev(void* p)\r\n\t{\r\n\t\treturn ((uchar*)p)-1;\r\n\t}\r\n\r\n\tuchar* pos(int num) const\r\n\t{\r\n\t\treturn begin()+num;\r\n\t}\r\n\r\n\tint pos(void* p) const\r\n\t{\r\n\t\treturn int((uchar*)p-begin());\r\n\t}\r\n\r\n\trstr sub(int begin) const\r\n\t{\r\n\t\treturn sub(begin,count());\r\n\t}\r\n\r\n\trstr sub(int begin,int end) const\r\n\t{\r\n\t\trstr ret;\r\n\t\tret.m_buf=m_buf.sub(begin,end);\r\n\t\treturn r_move(ret);\r\n\t}\r\n\r\n\trbool erase(int begin,int end)\r\n\t{\r\n\t\treturn m_buf.erase(begin,end);\r\n\t}\r\n\r\n\trbool erase(int i)\r\n\t{\r\n\t\treturn erase(i,i+1);\r\n\t}\r\n\r\n\trbool insert(int pos,const rstr& a)\r\n\t{\r\n\t\treturn m_buf.insert(pos,a.m_buf);\r\n\t}\r\n\r\n\tuchar get(int i) const\r\n\t{\r\n\t\tif(i>=count())\r\n\t\t\treturn 0;\r\n\t\telse \r\n\t\t\treturn m_buf[i];\r\n\t}\r\n\r\n\tuchar get_top() const\r\n\t{\r\n\t\tif(count()>0)\r\n\t\t{\r\n\t\t\treturn m_buf.m_p[count()-1];\r\n\t\t}\r\n\t\treturn 0;\r\n\t}\r\n\r\n\tuchar get_bottom() const\r\n\t{\r\n\t\tif(count()>0)\r\n\t\t{\r\n\t\t\treturn m_buf.m_p[0];\r\n\t\t}\r\n\t\treturn 0;\r\n\t}\r\n\r\n\trbool is_number() const\r\n\t{\r\n\t\tif(empty())\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\tfor(int i=0;i<count();i++)\r\n\t\t{\r\n\t\t\tif(!is_number(m_buf[i]))\r\n\t\t\t{\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn true;\r\n\t}\r\n\r\n\tint find(const rstr& s,int begin=0) const\r\n\t{\r\n\t\treturn r_find_pos(*this,s,begin);\r\n\t}\r\n\r\n\tint find_last(uchar ch) const\r\n\t{\r\n\t\treturn m_buf.find_last(ch);\r\n\t}\r\n\r\n\trbool exist(const rstr& s) const\r\n\t{\r\n\t\treturn find(s)<count();\r\n\t}\r\n\r\n\tstatic rbool is_alpha(uchar ch)\r\n\t{\r\n\t\treturn ((ch)>='a'&&(ch)<='z'||(ch)>='A'&&(ch)<='Z');\r\n\t}\r\n\t\r\n\tstatic rbool is_number(uchar ch)\r\n\t{\r\n\t\treturn ((ch)>='0'&&(ch)<='9');\r\n\t}\r\n\r\n\tstatic uchar chartoup(uchar ch)\r\n\t{\r\n\t\treturn ((ch)>='a'&&(ch)<='z'?(ch)-32:(ch));\r\n\t}\r\n\t\r\n\tstatic int upchartonum(uchar ch)\r\n\t{\r\n\t\treturn ((ch)>='A'?(ch)-'A'+10:(ch)-'0');\r\n\t}\r\n\r\n\tstatic int chartonum(uchar ch)\r\n\t{\r\n\t\treturn upchartonum(chartoup(ch));\r\n\t}\r\n\r\n\tvoid print()\r\n\t{\r\n\t\tprintf(\"%s \",cstr());//todo:多了一个空格\r\n\t}\r\n\r\n\tvoid printl()\r\n\t{\r\n\t\tprintf(\"%s\\n\",cstr());\r\n\t}\r\n\r\n\t//todo 两个函数重复了\r\n\tvoid format_t(const char* szFormat,...)\r\n\t{\r\n\t\tchar szBuffer[1024];\r\n\t\tva_list pArgList;\r\n\t\tva_start(pArgList,szFormat);\r\n#ifdef _MSC_VER\r\n\t\t_vsnprintf(szBuffer,r_size(szBuffer),szFormat,pArgList);\r\n#else\r\n\t\tvsnprintf(szBuffer,r_size(szBuffer),szFormat,pArgList);\r\n#endif\r\n\t\tva_end(pArgList);\r\n\t\tset(szBuffer);\r\n\t}\r\n\r\n\tstatic rstr format(const char* szFormat,...)\r\n\t{\r\n\t\tchar szBuffer[1024];\r\n\t\tva_list pArgList;\r\n\t\tva_start(pArgList,szFormat);\r\n#ifdef _MSC_VER\r\n\t\t_vsnprintf(szBuffer,r_size(szBuffer),szFormat,pArgList);\r\n#else\r\n\t\tvsnprintf(szBuffer,r_size(szBuffer),szFormat,pArgList);\r\n#endif\r\n\t\tva_end(pArgList);\r\n\t\treturn rstr(szBuffer);\r\n\t}\r\n\r\n\tstatic rstr hextodec(rstr s)\r\n\t{\r\n\t\tuint a;\r\n\t\tsscanf(s.cstr_t(),\"%x\",&a);\r\n\t\treturn rstr(a);\r\n\t}\r\n\r\n\tstatic rstr bintodec(rstr s)\r\n\t{\r\n\t\tuint sum=0;\r\n\t\tuint pro=1;\r\n\t\tfor(int i=s.count()-1;i>=0;i--)\r\n\t\t{\r\n\t\t\tif(s[i]=='1')\r\n\t\t\t\tsum+=pro;\r\n\t\t\tpro*=2;\r\n\t\t}\r\n\t\treturn rstr(sum);\r\n\t}\r\n\r\n\ttemplate<class T>\r\n\tstatic rstr join(const rbuf<T>& v,const rstr& s)\r\n\t{\r\n\t\trstr ret;\r\n\t\tfor(int i=0;i<v.count();i++)\r\n\t\t{\r\n\t\t\tif(i!=0)\r\n\t\t\t{\r\n\t\t\t\tret+=s;\r\n\t\t\t}\r\n\t\t\tret+=v[i].torstr();\r\n\t\t}\r\n\t\treturn r_move(ret);\r\n\t}\r\n};\r\n\r\n#endif"
  },
  {
    "path": "rlib/rstrw.h",
    "content": "﻿#ifndef rstrw_h__\r\n#define rstrw_h__\r\n\r\n#include \"rstr.h\"\r\n#include \"rcode.h\"\r\n\r\nstruct rstrw\r\n{\r\n\trbuf<ushort> m_buf;\r\n\r\n\t~rstrw()\r\n\t{\r\n\t}\r\n\r\n\trstrw()\r\n\t{\r\n\t}\r\n\r\n\trstrw(const wchar* p)\r\n\t{\r\n\t\tset(p);\r\n\t}\r\n\r\n\trstrw(const rstrw& s)\r\n\t{\r\n\t\tm_buf.alloc_not_change(s.m_buf.m_cmax);\r\n\t\tm_buf.m_count=s.count();\r\n\t\tmemcpy(begin(),s.begin(),s.size());\r\n\t}\r\n\r\n\trstrw(const char* p)\r\n\t{\r\n\t\trstr tmp=rcode::utf8_to_utf16(p);\r\n\t\tset_size(tmp.size());\r\n\t\tmemcpy(begin(),tmp.begin(),tmp.size());\r\n\t}\r\n\r\n\trstrw(const rstr& s)\r\n\t{\r\n\t\trstr tmp=rcode::utf8_to_utf16(s);\r\n\t\tset_size(tmp.size());\r\n\t\tmemcpy(begin(),tmp.begin(),tmp.size());\r\n\t}\r\n\r\n\trstrw(rstrw&& s)\r\n\t{\r\n\t\tm_buf.move(s.m_buf);\r\n\t}\r\n\r\n\trstr torstr() const\r\n\t{\r\n\t\treturn rcode::utf16_to_utf8(rstr((char*)begin(),size()));\r\n\t}\r\n\r\n\tint toint()\r\n\t{\r\n\t\treturn this->torstr().toint();\r\n\t}\r\n\r\n\tushort* cstrw()\r\n\t{\r\n\t\tpush(0);\r\n\t\tpop();\r\n\t\treturn begin();\r\n\t}\r\n\r\n\twchar* cstrw_t()\r\n\t{\r\n\t\treturn (wchar*)cstrw();\r\n\t}\r\n\r\n\tvoid operator=(const rstrw& a)\r\n\t{\r\n\t\tm_buf=a.m_buf;\r\n\t}\r\n\r\n\tvoid operator=(rstrw&& a)\r\n\t{\r\n\t\tm_buf.free();\r\n\t\tm_buf.move(a.m_buf);\r\n\t}\r\n\r\n\tushort& operator[](int num) const \r\n\t{\r\n\t\treturn m_buf[num];\r\n\t}\r\n\r\n\tfriend rbool operator==(const rstrw& a,const rstrw& b)\r\n\t{\r\n\t\treturn a.m_buf==b.m_buf;\r\n\t}\r\n\r\n\tfriend rbool operator!=(const rstrw& a,const rstrw& b)\r\n\t{\r\n\t\treturn a.m_buf!=b.m_buf;\r\n\t}\r\n\r\n\tfriend rstrw operator+(const rstrw& a,const rstrw& b)\r\n\t{\r\n\t\trstrw ret;\r\n\t\tret.m_buf=a.m_buf+b.m_buf;\r\n\t\treturn r_move(ret);\r\n\t}\r\n\r\n\tvoid operator+=(const rstrw& a)\r\n\t{\r\n\t\tm_buf+=a.m_buf;\r\n\t}\r\n\r\n\tvoid operator+=(rstrw&& a)\r\n\t{\r\n\t\tm_buf+=r_move(a.m_buf);\r\n\t}\r\n\r\n\tvoid operator+=(ushort ch)\r\n\t{\r\n\t\tm_buf+=ch;\r\n\t}\r\n\r\n\tfriend rbool operator<(const rstrw& a,const rstrw& b)\r\n\t{\r\n\t\tfor(int i=0;i<a.count()&&i<b.count();i++)\r\n\t\t\tif(a[i]!=b[i])\r\n\t\t\t\treturn a[i]<b[i];\r\n\t\treturn a.count()<b.count();\r\n\t}\r\n\r\n\tfriend rbool operator>(const rstrw& a,const rstrw& b)\r\n\t{\r\n\t\treturn b<a;\r\n\t}\r\n\r\n\tfriend rbool operator<=(const rstrw& a,const rstrw& b)\r\n\t{\r\n\t\treturn !(a>b);\r\n\t}\r\n\r\n\tfriend rbool operator>=(const rstrw& a,const rstrw& b)\r\n\t{\r\n\t\treturn !(a<b);\r\n\t}\r\n\r\n\tushort* set_count(int count)\r\n\t{\r\n\t\tm_buf.realloc_n(count);\r\n\t\treturn begin();\r\n\t}\r\n\r\n\tushort* set_size(int size)\r\n\t{\r\n\t\treturn set_count(size/2);\r\n\t}\r\n\r\n\tvoid set(const wchar* p)\r\n\t{\r\n\t\tint len=strlen_w(p);\r\n\t\tm_buf.realloc_n_not_change(rbuf<ushort>::extend_num(len));\r\n\t\tm_buf.m_count=len;\r\n\t\tmemcpy(m_buf.begin(),p,len*2);\r\n\t}\r\n\r\n\tint strlen_w(const wchar* p)\r\n\t{\r\n#ifdef _MSC_VER\r\n\t\treturn (int)lstrlenW(p);\r\n#else\r\n\t\tint ret=0;\r\n\t\twhile(*p!=0)\r\n\t\t{\r\n\t\t\tret++;\r\n\t\t\tp++;\r\n\t\t}\r\n\t\treturn ret;\r\n#endif\r\n\t}\r\n\r\n\tvoid push(ushort ch)\r\n\t{\r\n\t\tm_buf.push(ch);\r\n\t}\r\n\r\n\tvoid push_front(ushort ch)\r\n\t{\r\n\t\tm_buf.push_front(ch);\r\n\t}\r\n\r\n\tushort pop()\r\n\t{\r\n\t\treturn m_buf.pop();\r\n\t}\r\n\r\n\tushort pop_front()\r\n\t{\r\n\t\treturn m_buf.pop_front();\r\n\t}\r\n\r\n\tint count() const \r\n\t{\r\n\t\treturn m_buf.count();\r\n\t}\r\n\r\n\tint size() const\r\n\t{\r\n\t\treturn count()*2;\r\n\t}\r\n\r\n\tushort* begin() const \r\n\t{\r\n\t\treturn m_buf.begin();\r\n\t}\r\n\r\n\tushort* end() const \r\n\t{\r\n\t\treturn m_buf.end();\r\n\t}\r\n\r\n\trbool empty() const \r\n\t{\r\n\t\treturn m_buf.empty();\r\n\t}\r\n\r\n\tvoid clear()\r\n\t{\r\n\t\tm_buf.clear();\r\n\t}\r\n\r\n\tstatic ushort* next(void* p)\r\n\t{\r\n\t\treturn ((ushort*)p)+1;\r\n\t}\r\n\r\n\tstatic ushort* prev(void* p)\r\n\t{\r\n\t\treturn ((ushort*)p)-1;\r\n\t}\r\n\r\n\tushort* pos(int num) const\r\n\t{\r\n\t\treturn begin()+num;\r\n\t}\r\n\r\n\tint pos(void* p) const\r\n\t{\r\n\t\treturn int((ushort*)p-begin());\r\n\t}\r\n\r\n\trstrw sub(int begin) const\r\n\t{\r\n\t\treturn sub(begin,count());\r\n\t}\r\n\r\n\trstrw sub(int begin,int end) const\r\n\t{\r\n\t\trstrw ret;\r\n\t\tret.m_buf=m_buf.sub(begin,end);\r\n\t\treturn r_move(ret);\r\n\t}\r\n\r\n\trbool erase(int begin,int end)\r\n\t{\r\n\t\treturn m_buf.erase(begin,end);\r\n\t}\r\n\r\n\trbool erase(int i)\r\n\t{\r\n\t\treturn erase(i,i+1);\r\n\t}\r\n\r\n\trbool insert(int pos,const rstrw& a)\r\n\t{\r\n\t\treturn m_buf.insert(pos,a.m_buf);\r\n\t}\r\n\r\n\tushort get(int i) const\r\n\t{\r\n\t\tif(i>=count())\r\n\t\t\treturn 0;\r\n\t\telse \r\n\t\t\treturn m_buf[i];\r\n\t}\r\n\r\n\tushort get_top() const\r\n\t{\r\n\t\tif(count()>0)\r\n\t\t{\r\n\t\t\treturn m_buf.m_p[count()-1];\r\n\t\t}\r\n\t\treturn 0;\r\n\t}\r\n\r\n\tushort get_bottom() const\r\n\t{\r\n\t\tif(count()>0)\r\n\t\t{\r\n\t\t\treturn m_buf.m_p[0];\r\n\t\t}\r\n\t\treturn 0;\r\n\t}\r\n\r\n\trbool is_number() const\r\n\t{\r\n\t\tif(empty())\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\tfor(int i=0;i<count();i++)\r\n\t\t{\r\n\t\t\tif(!is_number(m_buf[i]))\r\n\t\t\t{\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn true;\r\n\t}\r\n\r\n\tstatic rbool is_number(ushort ch)\r\n\t{\r\n\t\treturn ((ch)>='0'&&(ch)<='9');\r\n\t}\r\n\r\n\tint find(rstrw s,int begin=0) const\r\n\t{\r\n\t\treturn r_find_pos(*this,s,begin);\r\n\t}\r\n\r\n\tint find_last(ushort ch) const\r\n\t{\r\n\t\treturn m_buf.find_last(ch);\r\n\t}\r\n};\r\n\r\n#endif\r\n"
  },
  {
    "path": "rlib/rthread.h",
    "content": "﻿#ifndef rthread_h__\r\n#define rthread_h__\r\n\r\n#include \"rbase.h\"\r\ntypedef void (* rthread_start)(void*);\r\n#ifdef _MSC_VER\r\n#include <windows.h>\r\n#include <process.h>\r\ntypedef uint rthread_ret;//32 bit\r\n#define rthread_call __stdcall\r\ntypedef uint (__stdcall* prthread)(void*);\r\n#else\r\n#include <pthread.h>\r\ntypedef void* rthread_ret;\r\n#define rthread_call\r\ntypedef void* (* prthread)(void*);\r\n#endif\r\n\r\ntypedef rthread_ret (rthread_call* thread_start)(void*);\r\n\r\nstruct rthread\r\n{\r\n\tstatic int create(thread_start start,void* param=null)\r\n\t{\r\n\t\tint tid;\r\n#ifdef _MSC_VER\r\n\t\ttid=(int)_beginthreadex(null,0,start,param,0,null);\r\n\t\tif(0==tid||1==tid)\r\n\t\t{\r\n\t\t\treturn 0;\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\treturn tid;\r\n\t\t}\r\n#else\r\n\t\tif(0!=pthread_create((pthread_t*)&tid,null,start,param))\r\n\t\t{\r\n\t\t\treturn 0;\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\treturn tid;\r\n\t\t}\r\n#endif\r\n\t}\r\n\r\n\tstatic void wait_exit(int tid)\r\n\t{\r\n#ifdef _MSC_VER\r\n\t\tWaitForSingleObject((HANDLE)tid,INFINITE);\r\n#else\r\n\t\tpthread_join((pthread_t)tid,null);\r\n#endif\r\n\t}\r\n};\r\n\r\n#endif\r\n"
  },
  {
    "path": "rpp/rpp.cpp",
    "content": "﻿#include \"zmain.h\"\r\n\r\nint main(int argc, char* argv[])\r\n{\r\n\tstatic tvm vm;\r\n\treturn zmain::rpp_main(vm,argc,argv);\r\n}"
  },
  {
    "path": "rpp/rpp_def.h",
    "content": "﻿#ifndef rpp_def_h__\r\n#define rpp_def_h__\r\n\r\n//#define RANALYSE\r\n#define c_rpp_deep 150\r\n#define c_point_size 4\r\n\r\n#define rppkey(a) (sh.m_key[tkey::a])\r\n#define rppoptr(a) (sh.m_optr[toptr::a])\r\n#define rppconf(a) (sh.m_conf[tconf::a])\r\n\r\n#define v_next_ins_js cur=(tins*)((uchar*)cur+r_size(tasm));goto next\r\n#define v_next_ins reg.eip+=r_size(tasm);goto next\r\n\r\n#define v_ato_int(a) (*r_to_pint(&(a)))\r\n#define v_pto_int(a) (*r_to_pint(a))\r\n#define v_ato_uint(a) (*r_to_puint(&(a)))\r\n#define v_pto_uint(a) (*r_to_puint(a))\r\n#define v_ato_char(a) (*r_to_pchar(&(a)))\r\n#define v_pto_char(a) (*r_to_pchar(a))\r\n#define v_pto_int8(a) (*r_to_pint8(a))\r\n#define v_pto_f8(a) (*r_to_pdouble(a))\r\n#define v_pto_rstr(a) (*r_to_prstr(a))\r\n\r\n#define v_pto_pchar(a) ((char*)v_pto_int(a))\r\n#define v_pto_pvoid(a) ((void*)v_pto_int(a))\r\n\r\n#define v_get_imme_u(a) (r_to_uint((a).val))\r\n#define v_get_reg_u(a) v_pto_uint(r_to_puchar(&reg)+(a).off)\r\n#define v_get_addr_u(a) v_pto_uint(v_get_reg(a)+(a).val)\r\n\r\n#define v_get_imme(a) ((a).val)\r\n#define v_get_reg(a) v_pto_int(r_to_puchar(&reg)+(a).off)\r\n#define v_get_addr(a) v_pto_int(v_get_reg(a)+(a).val)\r\n#define v_get_lea(a) (v_get_reg(a)+v_get_imme(a))\r\n#define v_get_addr_1(a) v_pto_char(v_get_reg(a)+(a).val)\r\n#define v_get_addr_8(a) v_pto_int8(v_get_reg(a)+(a).val)\r\n#define v_get_addr_f8(a) v_pto_f8(v_get_reg(a)+(a).val)\r\n\r\n#define rppja znasm::get_opnd1_v(vstr)\r\n#define rppjb znasm::get_opnd2_v(vstr)\r\n#define rppj4(a,b,c,d) (zjiti::a(build_ins(sh,rppkey(c_nop),b,c,d)))\r\n#define rppjf(a,b) sh.m_jit_f[a]=&b\r\n\r\n#define rppjcmp(a)                                            \\\r\nif(znasm::count_mbk_l(vstr)==2)                               \\\r\n{                                                             \\\r\n\ts+=rppj4(b_mov,rppkey(c_ecx),rppoptr(c_comma),rppjb); \\\r\n\ts+=rppj4(b_cmp,rppja,rppoptr(c_comma),rppkey(c_ecx)); \\\r\n}                                                             \\\r\nelse                                                          \\\r\n{                                                             \\\r\n\ts+=zjiti::b_cmp(ins);                                 \\\r\n}                                                             \\\r\ns+=rppj4(b_mov,rppkey(c_ebx),rppoptr(c_comma),\"0\");           \\\r\ns+=zjiti::a();                                                \\\r\nreturn r_move(s)\r\n\r\n#define rppncmp(a)                                               \\\r\nif(count_mbk_l(vstr)==2)                                         \\\r\n{                                                                \\\r\n\tresult+=\"\tmov ecx , \"+get_opnd2(vstr)+\"\\n\";        \\\r\n\tresult+=\"\tcmp \"+get_opnd1(vstr)+\" , ecx\\n\";        \\\r\n}                                                                \\\r\nelse                                                             \\\r\n{                                                                \\\r\n\tresult+=\"\tcmp dword \"+link_vstr(vstr.sub(1))+\"\\n\"; \\\r\n}                                                                \\\r\nresult+=\"\tmov ebx , 0\\n\";                                  \\\r\nresult+=a;                                                       \\\r\nreturn true\r\n\r\n#endif\r\n"
  },
  {
    "path": "rpp/rpp_win.cpp",
    "content": "﻿#include \"zmain.h\"\r\n\r\n//#define RPP_SHOW_CONSOLE\r\n\r\nint WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,\r\n\t\t   LPSTR lpCmdLine,int nCmdShow)\r\n{\r\n\trbuf<rstr> v=zmain::param_split(lpCmdLine);\r\n\tv.push_front(rcode::utf8_to_gbk(rdir::get_exe_name().torstr()));\r\n\tint argc=v.count();\r\n\tif(argc>c_rpp_deep)\r\n\t{\r\n\t\treturn 1;\r\n\t}\r\n\tchar* argv[c_rpp_deep];\r\n\tfor(int i=0;i<argc;i++)\r\n\t{\r\n\t\targv[i]=v[i].cstr_t();\r\n\t}\r\n\tstatic tvm vm;\r\n\tvm.m_sh.m_hins=hInstance;\r\n#ifdef RPP_SHOW_CONSOLE\r\n\tAllocConsole();\r\n\tfreopen(\"CONIN$\",\"r\",stdin);\r\n\tfreopen(\"CONOUT$\",\"w\",stdout);\r\n\tfreopen(\"CONOUT$\",\"w\",stderr);\r\n#endif\r\n\tint ret=zmain::rpp_main(vm,argc,argv);\r\n#ifdef RPP_SHOW_CONSOLE\r\n\tFreeConsole();\r\n#endif\r\n\treturn ret;\r\n}"
  },
  {
    "path": "rpp/talloc.h",
    "content": "﻿#ifndef talloc_h__\r\n#define talloc_h__\r\n\r\n#include \"../rlib/rstr.h\"\r\n\r\nstruct talloc_i\r\n{\r\n\tuchar* start;\r\n\tint commit_len;\r\n\tint max_len;\r\n};\r\n\r\nstruct talloc\r\n{\r\n\trbuf<talloc_i> m_list;\r\n\r\n\tenum\r\n\t{\r\n\t\tc_page_size=4096\r\n\t};\r\n\r\n\t~talloc()\r\n\t{\r\n#ifdef _MSC_VER\r\n\t\tfor(int i=0;i<m_list.count();i++)\r\n\t\t{\r\n\t\t\tVirtualFree(m_list[i].start,0,MEM_RELEASE);\r\n\t\t}\r\n#endif\r\n\t}\r\n\r\n\tuchar* alloc(int len)\r\n\t{\r\n#ifdef _MSC_VER\r\n\t\tif(len<=0)\r\n\t\t{\r\n\t\t\treturn null;\r\n\t\t}\r\n\t\tif(!m_list.empty())\r\n\t\t{\r\n\t\t\ttalloc_i& top=m_list.top();\r\n\t\t\tif(top.commit_len+len<=top.max_len)\r\n\t\t\t{\r\n\t\t\t\tuchar* ret=top.start+top.commit_len;\r\n\t\t\t\ttop.commit_len+=r_ceil_div(len,4)*4;\r\n\t\t\t\treturn ret;\r\n\t\t\t}\r\n\t\t}\r\n\t\ttalloc_i item;\r\n\t\titem.max_len=r_ceil_div(len,c_page_size)*c_page_size;\r\n\t\titem.commit_len=0;\r\n\t\titem.start=(uchar*)VirtualAlloc(null,item.max_len,\r\n\t\t\tMEM_COMMIT,PAGE_EXECUTE_READWRITE);\r\n\t\tif(item.start==null)\r\n\t\t{\r\n\t\t\treturn null;\r\n\t\t}\r\n\t\tm_list.push(item);\r\n\t\treturn alloc(len);\r\n#else\r\n\t\treturn null;\r\n#endif\r\n\t}\r\n\r\n\tstatic uchar* alloc_v(int len)\r\n\t{\r\n#ifdef _MSC_VER\r\n\t\treturn (uchar*)VirtualAlloc(null,len,\r\n\t\t\tMEM_COMMIT,PAGE_EXECUTE_READWRITE);\r\n#endif\r\n\t}\r\n\r\n\tstatic void free_v(uchar* addr)\r\n\t{\r\n#ifdef _MSC_VER\r\n\t\tVirtualFree(addr,0,MEM_RELEASE);\r\n#endif\r\n\t}\r\n};\r\n\r\n#endif\r\n"
  },
  {
    "path": "rpp/tanalyse.h",
    "content": "﻿#ifndef tanalyse_h__\r\n#define tanalyse_h__\r\n\r\n#ifdef RANALYSE\r\nstruct tanalyse_item\r\n{\r\n\trstr name;\r\n\tint8 count;\r\n\r\n\tfriend rbool operator<=(const tanalyse_item& a,const tanalyse_item& b)\r\n\t{\r\n\t\treturn a.count>=b.count;\r\n\t}\r\n};\r\n\r\nstruct tanalyse\r\n{\r\n\tstatic void analyse_add(uint addr)\r\n\t{\r\n\t\tanalyse_add(((tasm*)addr)->ptfi);\r\n\t}\r\n\r\n\tstatic void analyse_add(tfunc* ptfi)\r\n\t{\r\n\t\tif(ptfi==null)\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tptfi->count++;\r\n\t}\r\n\r\n\tstatic void analyse_print(tsh& sh)\r\n\t{\r\n\t\trbuf<tanalyse_item> v;\r\n\t\tfor(tclass* p=sh.m_class.begin();\r\n\t\t\tp!=sh.m_class.end();p=sh.m_class.next(p))\r\n\t\t{\r\n\t\t\tfor(tfunc* q=p->vfunc.begin();\r\n\t\t\t\tq!=p->vfunc.end();q=p->vfunc.next(q))\r\n\t\t\t{\r\n\t\t\t\tif(q->count==0)\r\n\t\t\t\t{\r\n\t\t\t\t\tcontinue;\r\n\t\t\t\t}\r\n\t\t\t\ttanalyse_item item;\r\n\t\t\t\titem.count=q->count;\r\n\t\t\t\titem.name=sh.get_func_declare_name(*p,*q);\r\n\t\t\t\tv.push(item);\r\n\t\t\t}\r\n\t\t}\r\n\t\tr_qsort(v);\r\n\t\trf::printl();\r\n\t\tfor(int i=0;i<v.count();i++)\r\n\t\t{\r\n\t\t\t(rstr(v[i].count)+\" \"+v[i].name).printl();\r\n\t\t}\r\n\t}\r\n};\r\n#endif\r\n\r\n#endif\r\n"
  },
  {
    "path": "rpp/tconf.h",
    "content": "﻿#ifndef tconf_h__\r\n#define tconf_h__\r\n\r\n#include \"../rlib/rstr.h\"\r\n#include \"../rlib/ralgo.h\"\r\n#include \"../rlib/rdic.h\"\r\n\r\nstruct tconf\r\n{\r\n\trbuf<int> m_conf;\r\n\r\n\tint& operator[](int n) const\r\n\t{\r\n\t\treturn m_conf[n];\r\n\t}\r\n\r\n\tenum\r\n\t{\r\n\t\tc_export_rbin,\r\n\t\tc_export_rasm,\r\n\t\tc_export_rp,\r\n\t\tc_display_inf,\r\n\t\tc_warning,\r\n\t\tc_auto_addinit,\r\n\t\tc_auto_addfunc,//自动增加构造析构等函数\r\n\t\tc_auto_import,\r\n\t\tc_auto_bbk,//是否控制结构自动加大括号\r\n\t\tc_op_empty_func,//优化基本数据类型空构造析构函数开关\r\n\t\tc_op_nop,\r\n\t\tc_op_zero,//优化add esp,0\r\n\t\tc_op_merge,//同一行连续加减同一个寄存器合并为一条指令\r\n\t\tc_op_ebp,//如果本函数未使用ebp可以不用push ebp节省3条指令\r\n\t\tc_op_base_calc,//优化基础运算，如调用int.opreator+可变成一条add指令\r\n\t\tc_op_pass,//优化参数传递，如传递int不需要调用拷贝构造函数\r\n\t\tc_op_const_eval,//常量表达式求值\r\n\t\tc_op_match,//汇编模式匹配优化\r\n\t\tc_run,\r\n\t\tc_pause,\r\n\t\tc_stack_size\r\n\t};\r\n};\r\n\r\nstruct toptr\r\n{\r\n\trbuf<rstr> m_optr;//编译器使用\r\n\trbuf<rstr> m_optr_s;//排好序的运算符，因为词法分析是贪心的\r\n\trdic<int> m_dic;//字典中存放的是优先级，值小的优先\r\n\tint m_optr_max;\r\n\r\n\ttoptr()\r\n\t{\r\n\t\tm_optr_max=0;\r\n\t}\r\n\r\n\trstr& operator[](int n) const\r\n\t{\r\n\t\treturn m_optr[n];\r\n\t}\r\n\r\n\tvoid sort_optr()\r\n\t{\r\n\t\tm_optr_s=m_optr;\r\n\t\tr_qsort(m_optr_s);\r\n\t\tm_optr_max=0;\r\n\t\tfor(int i=0;i<m_optr_s.count();i++)\r\n\t\t\tif(m_optr_s[i].count()>m_optr_max)\r\n\t\t\t\tm_optr_max=m_optr_s[i].count();\r\n\t}\r\n\r\n\tint get_grade(const rstr& s) const\r\n\t{\r\n\t\tint* p=m_dic.find(s);\r\n\t\tif(p==null)\r\n\t\t{\r\n\t\t\treturn 0;\r\n\t\t}\r\n\t\treturn *p;\r\n\t}\r\n\t\r\n\t//比较两个运算符的优先级，true表示第一个优先于第二个，相同优先级总是从左到右计算\r\n\trbool precede(const rstr& first,const rstr& second)\r\n\t{\r\n\t\treturn get_grade(first)<=get_grade(second);\r\n\t}\r\n\r\n\trbool is_optr(const rstr& s) const\r\n\t{\r\n\t\treturn r_find_pos_b(m_optr_s,s)<m_optr_s.count();\r\n\t}\r\n\r\n\tenum\r\n\t{\r\n\t\tc_sbk_l,\r\n\t\tc_sbk_r,//()小括号\r\n\t\tc_mbk_l,\r\n\t\tc_mbk_r,//[]中括号\r\n\t\tc_bbk_l,\r\n\t\tc_bbk_r,//{}大括号\r\n\t\t\r\n\t\tc_arrow_r,//->右箭头\r\n\t\tc_dot,//.\r\n\t\tc_domain,//::作用域运算符\r\n\t\tc_semi,//;分号\r\n\t\tc_colon,//:冒号\r\n\t\tc_comma,//,\r\n\t\tc_pre,//预处理符号#\r\n\r\n\t\tc_addr,//&\r\n\t\tc_not,//!\r\n\t\tc_destruct,//~\r\n\t\tc_plusplus,//++\r\n\t\tc_minusminus,//--\r\n\t\tc_negative,\r\n\t\t\r\n\t\tc_star,//*\r\n\t\tc_divide,//除\r\n\t\tc_modulo,\r\n\t\t\r\n\t\tc_plus,//+\r\n\t\tc_minus,//-\r\n\t\t\r\n\t\tc_lessequal,\r\n\t\tc_greatequal,\r\n\t\tc_equalequal,\r\n\t\tc_notequal,\r\n\r\n\t\tc_tbk_l,\r\n\t\tc_tbk_r,//<>尖括号\r\n\r\n\t\tc_temp_51,\r\n\t\tc_temp_52,\r\n\r\n\t\tc_and3,\r\n\t\tc_or3,\r\n\t\t\r\n\t\tc_equal,//=\r\n\t\tc_arrow_l,//<-\r\n\t\tc_exchange,//<->\r\n\t\tc_temp_94,//+=\r\n\t\tc_temp_95,//-=\r\n\t\tc_temp_96,//*=\r\n\t\tc_temp_97,// /=\r\n\t\tc_temp_98,// %=\r\n\t\tc_temp_99,// ^\r\n\t\tc_temp_910,// |\r\n\t\tc_temp_911,// &=\r\n\t\tc_temp_912,// ^=\r\n\t\tc_temp_913,// |=\r\n\r\n\t\tc_exp_part,//表达式起止符号,使用一个根本不会出现的符号\t\r\n\t\tc_at\r\n\t};\r\n};\r\n\r\nstruct tkey\r\n{\r\n\trbuf<rstr> m_key;\r\n\trdic<int> m_dic;\r\n\r\n\trstr& operator[](int n) const\r\n\t{\r\n\t\treturn m_key[n];\r\n\t}\r\n\r\n\tint count() const\r\n\t{\r\n\t\treturn m_key.count();\r\n\t}\r\n\r\n\tvoid sort_asm()\r\n\t{\r\n\t\tm_dic.clear();\r\n\t\tfor(int i=0;i<m_key.count();i++)\r\n\t\t{\r\n\t\t\tm_dic[m_key[i]]=i;\r\n\t\t}\r\n\t}\r\n\r\n\tint get_key_index(const rstr& s)\r\n\t{\r\n\t\tint* p=m_dic.find(s);\r\n\t\tif(p==null)\r\n\t\t{\r\n\t\t\treturn m_key.count();\r\n\t\t}\r\n\t\treturn *p;\r\n\t}\r\n\r\n\trbool is_asm_ins(const rstr& s) const\r\n\t{\r\n\t\tint* p=m_dic.find(s);\r\n\t\tif(p==null)\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\tint index=*p;\r\n\t\treturn index>=0&&index<=c_rn;\r\n\t}\r\n\r\n\trbool is_asm_reg(const rstr& s) const\r\n\t{\r\n\t\tfor(int i=c_eip;i<=c_edi;++i)\r\n\t\t\tif(s==m_key[i])\r\n\t\t\t\treturn true;\r\n\t\treturn false;\r\n\t}\r\n\r\n\tenum\r\n\t{\r\n\t\tc_rjit,\r\n\r\n\t\tc_calle,\r\n\t\tc_call,\r\n\t\tc_retn,\r\n\t\tc_reti,\r\n\r\n\t\tc_push,\r\n\t\tc_pop,\r\n\r\n\t\tc_jmp,\r\n\t\tc_jebxz,//如果ebx等于0则跳转\r\n\t\tc_jebxnz,\r\n\t\t\r\n\t\tc_halt,\r\n\t\tc_nop,\r\n\t\t\r\n\t\tc_lea,\r\n\t\tc_mov,\r\n\t\tc_mov1,\r\n\t\tc_mov8,\r\n\r\n\t\tc_add,\r\n\t\tc_sub,\r\n\t\tc_imul,\r\n\t\tc_idiv,\r\n\t\tc_imod,\r\n\t\t\r\n\t\tc_cesb,\r\n\t\tc_cnesb,\r\n\t\tc_cgsb,//cmp great set ebx带符号设置指令，大于则置1，否则置0\r\n\t\tc_cgesb,\r\n\t\tc_clsb,\r\n\t\tc_clesb,\r\n\r\n\t\tc_add8,\r\n\t\tc_sub8,\r\n\t\tc_imul8,\r\n\t\tc_idiv8,\r\n\t\tc_imod8,\r\n\t\tc_cgsb8,\r\n\t\tc_clsb8,\r\n\r\n\t\tc_fadd8,\r\n\t\tc_fsub8,\r\n\t\tc_fmul8,\r\n\t\tc_fdiv8,\r\n\t\tc_fcgsb8,\r\n\t\tc_fclsb8,\r\n\r\n\t\tc_band,\r\n\t\tc_bor,\r\n\t\tc_bnot,\r\n\t\tc_bxor,\r\n\t\tc_bshl,\r\n\t\tc_bshr,\r\n\t\tc_bsar,\r\n\r\n\t\tc_udiv,\r\n\t\tc_umod,\r\n\t\tc_ucgsb,\r\n\t\tc_ucgesb,\r\n\t\tc_uclsb,\r\n\t\tc_uclesb,\r\n\r\n\t\tc_rn,\r\n\r\n\t\tc_rd1,\r\n\t\tc_rd2,\r\n\t\tc_rd4,\r\n\t\tc_rd8,\r\n\t\tc_rdp,\r\n\r\n\t\tc_eip,\r\n\t\tc_esp,\r\n\t\tc_ebp,\r\n\t\tc_eax,\r\n\t\tc_ebx,\r\n\t\tc_ecx,\r\n\t\tc_edx,\r\n\t\tc_esi,\r\n\t\tc_edi,\r\n\t\tc_eflags,\r\n\r\n\t\tc_void,\r\n\t\tc_char,\r\n\t\tc_int,\r\n\t\tc_uint,\r\n\t\tc_int8,\r\n\t\tc_double,\r\n\t\tc_rp,\r\n\t\tc_var,\r\n\t\tc_rbuf,\r\n\t\tc_rstr,\r\n\t\tc_rcs,//RPP代码类型\r\n\t\t\r\n\t\tc_js_func,//JS函数\r\n\t\tc_js_obj,\r\n\t\tc_js_findf,\r\n\r\n\t\tc_if,\r\n\t\tc_ifn,//与unless功能一样,感觉ifnot或者ifn更清晰\r\n\t\tc_else,\r\n\t\tc_break,\r\n\t\tc_continue,\r\n\t\tc_continued,\r\n\t\tc_return,\r\n\t\tc_class,\r\n\t\tc_template,\r\n\t\tc_this,\r\n\t\tc_sizeof,\r\n\t\tc_main,\r\n\t\tc_include,\r\n\t\tc_import,\r\n\t\tc_endif,\r\n\t\tc_ifdef,\r\n\t\tc_ifndef,\r\n\t\tc_define,\r\n\t\tc_enum,\r\n\t\tc_for,\r\n\t\tc_to,\r\n\t\tc_in,\r\n\t\tc_case,\r\n\t\tc_friend,\r\n\t\tc_cfunc,\r\n\t\tc_dynamic,\r\n\t\tc_private,\r\n\t\tc_protected,\r\n\t\tc_public,\r\n\t\tc_switch,\r\n\t\tc_typename,\r\n\t\tc_typeof,\r\n\t\tc_s_ret,\r\n\t\tc_s_off,\r\n\t\tc_s_param,\r\n\t\tc_s_local,\r\n\t\tc_mac,//宏\r\n\t\tc_export,\r\n\t\tc_lambda,\r\n\t\tc_self,\r\n\t\tc_btemp,//构造临时对象\r\n\t\tc_pcall,//函数指针调用\r\n\t\tc_LAMBDA,\r\n\t\tc_SELF,\r\n\t\tc_rvm,\r\n\t\tc_rvara,\r\n\t\tc_rvarb,\r\n\t\tc_temp,\r\n\t\tc_plambda,\r\n\t\tc_pmain,//全局数据的引用\r\n\t\tc_penv,//环境指针\r\n\t};\r\n};\r\n\r\n#endif\r\n"
  },
  {
    "path": "rpp/tsh.h",
    "content": "﻿#ifndef tsh_h__\r\n#define tsh_h__\r\n\r\n#include \"tconf.h\"\r\n#include \"../rlib/rstrw.h\"\r\n#include \"rpp_def.h\"\r\n#include \"tstruct.h\"\r\n#include \"../rlib/rset.h\"\r\n#include \"../rlib/rmutex.h\"\r\n#include \"../rlib/rdb.h\"\r\n#include \"../rlib/rdir.h\"\r\n#include \"talloc.h\"\r\n\r\n//共享类\r\nstruct tsh\r\n{\r\n\ttoptr m_optr;\r\n\ttkey m_key;\r\n\ttconf m_conf;\r\n\r\n\trset<tclass> m_class;\r\n\trset<tclass> m_classtl;//模板\r\n\t\r\n\trset<tfile> m_file;\r\n\trset<tmac> m_vdefine;\r\n\r\n\ttclass* m_main;\r\n\trstr m_main_data;//全局变量存储区\r\n\trstrw m_main_file;\r\n\r\n\trmutex m_mutex;\r\n\tint m_mode;\r\n\r\n\tint m_argc;\r\n\tchar** m_argv;\r\n\r\n\trbuf<top_node> m_match;\r\n\r\n\trdic<void*> m_jit_f;//jit静态函数地址表\r\n\tvoid* m_hins;\r\n\tint m_ret;\r\n\r\n\trbool m_is_pack_read;\r\n\trbool m_is_pack_mode;\r\n\trbool m_is_pre_mode;\r\n\trdbint m_db;\r\n\trset<taddr> m_addr;\r\n\trclass m_rlib;\r\n\trdic<void*> m_dll_func;\r\n\trdic<tfunc*> m_macro;\r\n\r\n\tenum\r\n\t{\r\n\t\tc_jit,\r\n\t\tc_rvm,\r\n\t\tc_win,\r\n\t\tc_grub\r\n\t};\r\n\r\n\ttsh()\r\n\t{\r\n\t\tm_main=null;\r\n\t\tm_mode=c_rvm;\r\n\t\tm_is_pack_read=false;\r\n\t\tm_is_pack_mode=false;\r\n\t\tm_is_pre_mode=false;\r\n\t}\r\n\r\n\tvoid print_vclass()\r\n\t{\r\n\t\tfor(tclass* p=m_class.begin();p!=m_class.end();p=m_class.next(p))\r\n\t\t{\r\n\t\t\tp->name.printl();\r\n\t\t}\r\n\t}\r\n\r\n\tstatic void print_vword(rbuf<tword>& v)\r\n\t{\r\n\t\trf::printl();\r\n\t\tfor(int i=0;i<v.count();i++)\r\n\t\t{\r\n\t\t\t(v[i].val+\" \").print();\r\n\t\t}\r\n\t\trf::printl();\r\n\t}\r\n\r\n\tstatic void print_func_sent(tfunc& tfi)\r\n\t{\r\n\t\trf::printl();\r\n\t\tfor(int i=0;i<tfi.vsent.count();i++)\r\n\t\t{\r\n\t\t\trf::print(tfi.vsent[i].pos.line);\r\n\t\t\ttfi.vsent[i].print();\r\n\t\t\trf::printl();\r\n\t\t}\r\n\t\trf::printl();\r\n\t}\r\n\r\n\tstatic void print_func_asm(tfunc& tfi)\r\n\t{\r\n\t\tfor(int i=0;i<tfi.vasm.count();i++)\r\n\t\t{\r\n\t\t\trf::print(rstr(tfi.vasm[i].pos.line)+\" \");\r\n\t\t\ttfi.vasm[i].vstr.print();\r\n\t\t\trf::printl();\r\n\t\t}\r\n\t\trf::printl();\r\n\t}\r\n\r\n\tstatic void print_func_dec(tclass& tci)\r\n\t{\r\n\t\tfor(tfunc* p=tci.vfunc.begin();p!=tci.vfunc.end();p=tci.vfunc.next(p))\r\n\t\t{\r\n\t\t\tget_func_declare(tci,*p).printl();\r\n\t\t}\r\n\t}\r\n\r\n\tstatic rstr get_func_declare_name(tclass& tci,tfunc& tfi)\r\n\t{\r\n\t\trstr s;\r\n\t\ts+=tci.name+\".\"+tfi.name+\"(\";\r\n\t\tfor(int j=0;j<tfi.param.count();j++)\r\n\t\t{\r\n\t\t\tif(j!=0)\r\n\t\t\t{\r\n\t\t\t\ts+=\",\";\r\n\t\t\t}\r\n\t\t\ts+=tfi.param[j].type+\" \"+\r\n\t\t\t\ttfi.param[j].name;\r\n\t\t}\r\n\t\ts+=\")\";\r\n\t\treturn r_move(s);\r\n\t}\r\n\r\n\tstatic rstr get_func_declare(tclass& tci,tfunc& tfi)\r\n\t{\r\n\t\trstr s;\r\n\t\ts+=tci.name+\".\"+tfi.name+\"(\";\r\n\t\tfor(int j=0;j<tfi.param.count();j++)\r\n\t\t{\r\n\t\t\tif(j!=0)\r\n\t\t\t{\r\n\t\t\t\ts+=\",\";\r\n\t\t\t}\r\n\t\t\ts+=tfi.param[j].type;\r\n\t\t}\r\n\t\ts+=\")\";\r\n\t\treturn r_move(s);\r\n\t}\r\n\r\n\tstatic rbuf<rstr> get_func_declare_lisp(tsh& sh,tclass& tci,tfunc& tfi)\r\n\t{\r\n\t\treturn get_func_declare_call(sh,tci,tfi).sub(1);\r\n\t}\r\n\r\n\tstatic rbuf<rstr> get_func_declare_call(tsh& sh,tclass& tci,tfunc& tfi)\r\n\t{\r\n\t\trbuf<rstr> ret;\r\n\t\tret+=rppkey(c_call);\r\n\t\tret+=rppoptr(c_mbk_l);\r\n\t\tret+=rppoptr(c_addr);\r\n\t\tret+=rppoptr(c_comma);\r\n\t\tret+=tci.name;\r\n\t\tret+=rppoptr(c_comma);\r\n\t\tret+=tfi.name_dec;\r\n\t\tret+=rppoptr(c_mbk_r);\r\n\t\treturn r_move(ret);\r\n\t}\r\n\r\n\tstatic void clear_word_val(rbuf<tword>& v,int begin,int end)\r\n\t{\r\n\t\tif(end>v.count())\r\n\t\t\tend=v.count();\r\n\t\tif(begin<0)\r\n\t\t{\r\n\t\t\tbegin=0;\r\n\t\t}\r\n\t\tfor(int i=begin;i<end;++i)\r\n\t\t\tv[i].val.clear();\r\n\t}\r\n\r\n\tstatic rstrw get_main_name(tsh& sh)\r\n\t{\r\n\t\trstrw name=sh.m_main_file;\r\n\t\tname=rdir::get_name(name);\r\n\t\tname=rdir::get_prev_dir(sh.m_main_file)+name.sub(\r\n\t\t\t0,name.count()-rdir::get_suffix(name).count()-1);\r\n\t\treturn r_move(name);\r\n\t}\r\n\r\n\tstatic rstr get_ctype(tsh& sh,const tword& word)\r\n\t{\r\n\t\tif(word.is_cint())\r\n\t\t\treturn rppkey(c_int);\r\n\t\telif(word.is_cuint())\r\n\t\t\treturn rppkey(c_uint);\r\n\t\telif(word.is_cdouble())\r\n\t\t\treturn rppkey(c_double);\r\n\t\telif(word.is_cpoint())\r\n\t\t\treturn rstr(\"rp<void>\");\r\n\t\telif(word.is_cstr())\r\n\t\t\treturn rstr(\"rp<char>\");\r\n\t\telse\r\n\t\t\treturn rstr();\r\n\t}\r\n\t\r\n\t//获取类型名称，忽略引用\r\n\tstatic rstr get_tname(const rstr& s)\r\n\t{\r\n\t\tif(is_quote(s))\r\n\t\t\treturn s.sub(0,s.count()-1);\r\n\t\telse\r\n\t\t\treturn s;\r\n\t}\r\n\r\n\tstatic rstr get_ttype(rstr s)\r\n\t{\r\n\t\tif(is_point_quote(s))\r\n\t\t{\r\n\t\t\treturn s;\r\n\t\t}\r\n\t\treturn s+\"&\";\r\n\t}\r\n\r\n\trbool is_optr_func(tfunc& tfi)\r\n\t{\r\n\t\tif(m_optr.is_optr(tfi.name))\r\n\t\t{\r\n\t\t\treturn true;\r\n\t\t}\r\n\t\tif(tfi.name==\"[]\")\r\n\t\t{\r\n\t\t\treturn true;\r\n\t\t}\r\n\t\treturn false;\r\n\t}\r\n\r\n\trbool is_basic_type(const rstr& s)\r\n\t{\r\n\t\treturn s==m_key[tkey::c_rd1]||s==m_key[tkey::c_rd2]||\r\n\t\t\ts==m_key[tkey::c_rd4]||s==m_key[tkey::c_rd8]||\r\n\t\t\ts==m_key[tkey::c_rdp]||s==m_key[tkey::c_void];\r\n\t}\r\n\r\n\tstatic rbool is_point_quote(const rstr& s)\r\n\t{\r\n\t\treturn is_quote(s)||is_point(s);\r\n\t}\r\n\r\n\tstatic rbool is_quote(const rstr& s)\r\n\t{\r\n\t\treturn s.get_top()=='&';\r\n\t}\r\n\r\n\tstatic rbool is_point(const rstr& s)\r\n\t{\r\n\t\tif(s.get_top()=='*')\r\n\t\t\treturn true;\r\n\t\tif(s.count()>=5&&s[0]=='r'&&s[1]=='p'&&s[2]=='<'&&s.get_top()=='>')\r\n\t\t\treturn true;\r\n\t\treturn false;\r\n\t}\r\n\r\n\tvoid split_param(rbuf<tsent>& vsent,\r\n\t\tconst rbuf<tword>& v,const tsent& src)\r\n\t{\r\n\t\tvsent.clear();\r\n\t\trbuf<rbuf<tword> > temp=comma_split(v);\r\n\t\tfor(int i=0;i<temp.count();i++)\r\n\t\t{\r\n\t\t\ttsent sent;\r\n\t\t\tsent.pos=src.pos;\r\n\t\t\tsent.vword=r_move(temp[i]);\r\n\t\t\tvsent.push_move(sent);\r\n\t\t}\r\n\t}\r\n\r\n\tvoid split_param(rbuf<tsent>& vsent,const rbuf<tword>& v)\r\n\t{\r\n\t\tvsent.clear();\r\n\t\trbuf<rbuf<tword> > temp=comma_split(v);\r\n\t\tfor(int i=0;i<temp.count();i++)\r\n\t\t{\r\n\t\t\ttsent sent;\r\n\t\t\tsent.vword=r_move(temp[i]);\r\n\t\t\tvsent.push_move(sent);\r\n\t\t}\r\n\t}\r\n\r\n\ttemplate<class T>\r\n\trbuf<rbuf<T> > comma_split(rbuf<T> v)\r\n\t{\r\n\t\trbuf<rbuf<T> > result;\r\n\t\tv.push_move(T(m_optr[toptr::c_comma]));\r\n\t\tint count1=0;\r\n\t\tint count2=0;\r\n\t\tint start=0;\r\n\t\tfor(int i=0;i<v.count();i++)\r\n\t\t{\r\n\t\t\t//大括号不可能出现在参数中\r\n\t\t\tif(v[i].val==m_optr[toptr::c_sbk_l])\r\n\t\t\t\tcount1++;\r\n\t\t\telif(v[i].val==m_optr[toptr::c_sbk_r])\r\n\t\t\t\tcount1--;\r\n\t\t\telif(v[i].val==m_optr[toptr::c_mbk_l])\r\n\t\t\t\tcount2++;\r\n\t\t\telif(v[i].val==m_optr[toptr::c_mbk_r])\r\n\t\t\t\tcount2--;\r\n\t\t\telif(count1==0&&count2==0&&\r\n\t\t\t\tv[i].val==m_optr[toptr::c_comma])\r\n\t\t\t{\r\n\t\t\t\trbuf<T> temp;\r\n\t\t\t\tfor(int j=start;j<i;j++)\r\n\t\t\t\t\ttemp.push_move(v[j]);\r\n\t\t\t\tif(!temp.empty())\r\n\t\t\t\t\tresult.push_move(temp);\r\n\t\t\t\tstart=i+1;\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn r_move(result);\r\n\t}\r\n\t\r\n\t//允许空元素\r\n\trbuf<rbuf<tword> > comma_split_e(rbuf<tword> v)\r\n\t{\r\n\t\trbuf<rbuf<tword> > result;\r\n\t\tv.push(tword(m_optr[toptr::c_comma]));\r\n\t\tint count1=0;\r\n\t\tint count2=0;\r\n\t\tint start=0;\r\n\t\tfor(int i=0;i<v.count();i++)\r\n\t\t{\r\n\t\t\tif(v[i].val==m_optr[toptr::c_sbk_l])\r\n\t\t\t\tcount1++;\r\n\t\t\telif(v[i].val==m_optr[toptr::c_sbk_r])\r\n\t\t\t\tcount1--;\r\n\t\t\telif(v[i].val==m_optr[toptr::c_mbk_l])\r\n\t\t\t\tcount2++;\r\n\t\t\telif(v[i].val==m_optr[toptr::c_mbk_r])\r\n\t\t\t\tcount2--;\r\n\t\t\telif(count1==0&&count2==0&&\r\n\t\t\t\tv[i].val==m_optr[toptr::c_comma])\r\n\t\t\t{\r\n\t\t\t\trbuf<tword> temp;\r\n\t\t\t\tfor(int j=start;j<i;j++)\r\n\t\t\t\t\ttemp.push_move(v[j]);\r\n\t\t\t\tresult.push_move(temp);\r\n\t\t\t\tstart=i+1;\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn r_move(result);\r\n\t}\r\n\t\r\n\t//带尖括号的split\r\n\trbuf<tsent> comma_split_t(rbuf<tword> v)\r\n\t{\r\n\t\trbuf<tsent> result;\r\n\t\tv.push(tword(m_optr[toptr::c_comma]));\r\n\t\tint count1=0;\r\n\t\tint count2=0;\r\n\t\tint count3=0;\r\n\t\tint start=0;\r\n\t\tfor(int i=0;i<v.count();i++)\r\n\t\t{\r\n\t\t\tif(v[i].val==m_optr[toptr::c_sbk_l])\r\n\t\t\t\tcount1++;\r\n\t\t\telif(v[i].val==m_optr[toptr::c_sbk_r])\r\n\t\t\t\tcount1--;\r\n\t\t\telif(v[i].val==m_optr[toptr::c_mbk_l])\r\n\t\t\t\tcount2++;\r\n\t\t\telif(v[i].val==m_optr[toptr::c_mbk_r])\r\n\t\t\t\tcount2--;\r\n\t\t\telif(v[i].val==m_optr[toptr::c_tbk_l])\r\n\t\t\t\tcount3++;\r\n\t\t\telif(v[i].val==m_optr[toptr::c_tbk_r])\r\n\t\t\t\tcount3--;\r\n\t\t\telif(count1==0&&count2==0&&count3==0&&\r\n\t\t\t\tv[i].val==m_optr[toptr::c_comma])\r\n\t\t\t{\r\n\t\t\t\ttsent temp;\r\n\t\t\t\tfor(int j=start;j<i;j++)\r\n\t\t\t\t\ttemp.vword.push_move(v[j]);\r\n\t\t\t\tif(!temp.vword.empty())\r\n\t\t\t\t\tresult.push_move(temp);\r\n\t\t\t\tstart=i+1;\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn r_move(result);\r\n\t}\r\n\r\n\tint find_symm_sbk(const rbuf<rstr>& v,int begin=0)\r\n\t{\r\n\t\treturn find_symm_word_e(v,m_optr[toptr::c_sbk_l],\r\n\t\t\tm_optr[toptr::c_sbk_r],begin);\r\n\t}\r\n\r\n\tint find_symm_sbk(const rbuf<tword>& v,int begin=0)\r\n\t{\r\n\t\treturn find_symm_word_e(v,m_optr[toptr::c_sbk_l],\r\n\t\t\tm_optr[toptr::c_sbk_r],begin);\r\n\t}\r\n\r\n\tint find_symm_mbk(const rbuf<tword>& v,int begin=0)\r\n\t{\r\n\t\treturn find_symm_word_e(v,m_optr[toptr::c_mbk_l],\r\n\t\t\tm_optr[toptr::c_mbk_r],begin);\r\n\t}\r\n\r\n\tint find_symm_bbk(const rbuf<rstr>& v,int begin=0)\r\n\t{\r\n\t\treturn find_symm_word_e(v,m_optr[toptr::c_bbk_l],\r\n\t\t\tm_optr[toptr::c_bbk_r],begin);\r\n\t}\r\n\r\n\tint find_symm_bbk(const rbuf<tword>& v,int begin=0)\r\n\t{\r\n\t\treturn find_symm_word_e(v,m_optr[toptr::c_bbk_l],\r\n\t\t\tm_optr[toptr::c_bbk_r],begin);\r\n\t}\r\n\r\n\tint find_symm_tbk(const rbuf<tword>& v,int begin=0)\r\n\t{\r\n\t\treturn find_symm_word_e(v,m_optr[toptr::c_tbk_l],\r\n\t\t\tm_optr[toptr::c_tbk_r],begin);\r\n\t}\r\n\t\r\n\t//未找到返回结束位置，应该判断count<0，但那样会降低效率\r\n\ttemplate<class T>\r\n\tstatic int find_symm_word_e(const rbuf<T>& v,rstr& left,rstr& right,\r\n\t\tint begin=0)\r\n\t{\r\n\t\tint end=v.count();\r\n\t\tif(begin<0)\r\n\t\t{\r\n\t\t\tbegin=0;\r\n\t\t}\r\n\t\tint count=0;\r\n\t\tint i;\r\n\t\tfor(i=begin;i<end;i++)\r\n\t\t{\r\n\t\t\tif(left==v[i])\r\n\t\t\t\t++count;\r\n\t\t\tif(right==v[i])\r\n\t\t\t\t--count;\r\n\t\t\tif(0==count)\r\n\t\t\t\treturn i;\r\n\t\t}\r\n\t\treturn v.count();\r\n\t}\r\n\r\n\tstatic int find_symm_word_rev(const rbuf<tword>& v,rstr& left,rstr& right,\r\n\t\tint begin,int end)\r\n\t{\r\n\t\tif(end>=v.count())\r\n\t\t\tend=v.count();\r\n\t\tif(begin<0)\r\n\t\t{\r\n\t\t\tbegin=0;\r\n\t\t}\r\n\t\tint count=0;\r\n\t\tint i;\r\n\t\tfor(i=end-1;i>=begin;--i)\r\n\t\t{\r\n\t\t\tif(left==v[i].val)\r\n\t\t\t\t--count;\r\n\t\t\tif(right==v[i].val)\r\n\t\t\t\t++count;\r\n\t\t\tif(0==count)\r\n\t\t\t\treturn i;\r\n\t\t}\r\n\t\treturn v.count();\r\n\t}\r\n\r\n\tstatic rbuf<rstr> vword_to_vstr(const rbuf<tword>& v)\r\n\t{\r\n\t\trbuf<rstr> ret;\r\n\t\tfor(int i=0;i<v.count();i++)\r\n\t\t\tret.push(v[i].val);\r\n\t\treturn r_move(ret);\r\n\t}\r\n\r\n\tstatic void push_twi(rbuf<tword>& v,tword& twi,const rstr& val)\r\n\t{\r\n\t\ttwi.val=val;\r\n\t\tv.push(twi);\r\n\t}\r\n\r\n\trstr get_file_name(tfile* p)\r\n\t{\r\n\t\tif(p==null)\r\n\t\t{\r\n\t\t\treturn rstr();\r\n\t\t}\r\n\t\treturn p->name.torstr();\r\n\t}\r\n\r\n\tstatic void error(rstr e=rstr())\r\n\t{\r\n#ifndef __COCOS2D_H__\r\n\t\trf::printl(e);\r\n#else\r\n\t\tchar* p=e.cstr_t();\r\n\t\tCCLOG(\"%s\",p);\r\n#endif\r\n\t}\r\n\r\n\tstatic rstr get_src_str(const tword& word)\r\n\t{\r\n\t\ttpos pos=word.pos_src;\r\n\t\tif(pos.file==null)\r\n\t\t{\r\n\t\t\treturn rstr();\r\n\t\t}\r\n\t\trstr ret;\r\n\t\tret+=\"\\nsrc_file: \"+pos.file->name.torstr();\r\n\t\tret+=\"\\nsrc_line: \"+rstr(pos.line);\r\n\t\tret+=\"\\nsrc_cont: \"+pos.file->line_list.get(pos.line);\r\n\t\treturn r_move(ret);\r\n\t}\r\n\r\n\tvoid error(const tword& word,rstr e=rstr())\r\n\t{\r\n\t\terror(rstr(\"file: \")+get_file_name(word.pos.file)+\r\n\t\t\trstr(\"\\nline: \")+rstr(word.pos.line)+\r\n\t\t\trstr(\"\\nword: \")+word.val+rstr(\"\\n\")+e);\r\n\t\terror(get_src_str(word));\r\n\t}\r\n\r\n\tvoid error(const tsent& sent,rstr e=rstr())\r\n\t{\r\n\t\terror(rstr(\"file: \")+get_file_name(sent.pos.file)+\r\n\t\t\trstr(\"\\nline: \")+rstr(sent.pos.line)+rstr(\"\\n\")+e);\r\n\t\tsent.vword.print();\r\n\t\trf::printl();\r\n\t\terror(get_src_str(sent.vword.get_bottom()));\r\n\t}\r\n\r\n\tvoid error(const tasm& oasm,rstr e=rstr())\r\n\t{\r\n\t\terror(rstr(\"file: \")+get_file_name(oasm.pos.file)+\r\n\t\t\trstr(\"\\nline: \")+rstr(oasm.pos.line)+rstr(\"\\n\")+e);\r\n\t\toasm.vstr.print();\r\n\t\trf::printl();\r\n\t}\r\n\r\n\tstatic void error(tfunc& tfi,rstr e=rstr())\r\n\t{\r\n\t\terror(&tfi,e);\r\n\t}\r\n\r\n\tstatic void error(tfunc* ptfi,rstr e=rstr())\r\n\t{\r\n\t\tif(ptfi==null)\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\t\ttclass* ptci=ptfi->ptci;\r\n\t\tif(ptci==null)\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\t\trf::printl(get_func_declare(*ptci,*ptfi));\r\n\t\trf::printl(e);\r\n\t}\r\n};\r\n\r\nrbool _func_to_x86(tsh& sh,tfunc& tfi,tenv env);\r\nint _find_symm_sbk(tsh& sh,const rbuf<tword>& v,int begin);\r\n\r\n#endif\r\n"
  },
  {
    "path": "rpp/tstruct.h",
    "content": "﻿#ifndef tstruct_h__\r\n#define tstruct_h__\r\n\r\n#include \"../rlib/rstr.h\"\r\n#include \"../rlib/rf.h\"\r\n#include \"../rlib/rcode.h\"\r\n#include \"../rlib/rset.h\"\r\n#include \"../rlib/rdic.h\"\r\n#include \"tvm_struct.h\"\r\n#include \"talloc.h\"\r\n\r\nstruct tword\r\n{\r\n\trstr val;//最常用的数据成员放在首位可以略微提高效率\r\n\trbuf<rstr> multi;//todo:rstr很难保存行号，用rbuf<tword*>可能更好\r\n\ttpos pos;//跳转定位的位置\r\n\ttpos pos_src;//原始文件位置\r\n\r\n\ttword()\r\n\t{\r\n\t\tclear();\r\n\t}\r\n\r\n\ttword(const rstr& s)\r\n\t{\r\n\t\tclear();\r\n\t\tval=s;\r\n\t}\r\n\r\n\ttword(tword&& a)\r\n\t{\r\n\t\tpos=a.pos;\r\n\t\tval=a.val;\r\n\t\tmulti=a.multi;\r\n\t\tpos_src=a.pos_src;\r\n\t}\r\n\r\n\tvoid operator=(tword&& a)\r\n\t{\r\n\t\tval.m_buf.free();\r\n\t\tmulti.free();\r\n\t\tval=a.val;\r\n\t\tmulti=a.multi;\r\n\t\tpos=a.pos;\r\n\t\tpos_src=a.pos_src;\r\n\t}\r\n\r\n\tvoid clear()\r\n\t{\r\n\t\tpos.clear();\r\n\t\tval.clear();\r\n\t\tmulti.clear();\r\n\t\tpos_src.clear();\r\n\t}\r\n\r\n\trbool empty() const\r\n\t{\r\n\t\treturn val.empty()&&multi.empty();\r\n\t}\r\n\t\r\n\t//val和multi均不空表示sizeof\r\n\trbool is_multi() const\r\n\t{\r\n\t\treturn !multi.empty()&&val.empty();\r\n\t}\r\n\r\n\tfriend rbool operator==(const tword& a,const tword& b)\r\n\t{\r\n\t\treturn a.val==b.val;\r\n\t}\r\n\r\n\tfriend rbool operator!=(const tword& a,const tword& b)\r\n\t{\r\n\t\treturn !(a==b);\r\n\t}\r\n\r\n\tfriend rbool operator==(const tword& a,const rstr& b)\r\n\t{\r\n\t\treturn a.val==b;\r\n\t}\r\n\r\n\tfriend rbool operator!=(const tword& a,const rstr& b)\r\n\t{\r\n\t\treturn !(a==b);\r\n\t}\r\n\r\n\tfriend rbool operator==(const rstr& a,const tword& b)\r\n\t{\r\n\t\treturn a==b.val;\r\n\t}\r\n\r\n\tfriend rbool operator!=(const rstr& a,const tword& b)\r\n\t{\r\n\t\treturn !(a==b);\r\n\t}\r\n\r\n\tvoid print()\r\n\t{\r\n\t\tval.print();\r\n\t}\r\n\r\n\trbool is_name() const\r\n\t{\r\n\t\tif(val.empty())\r\n\t\t\treturn false;\r\n\t\tint i=0;\r\n\t\tif(rstr::is_alpha(val.get(i))||'_'==val.get(i))\r\n\t\t\ti++;\r\n\t\telif(rcode::is_utf8_3(val.get(i))&&val.get(i+1)&&val.get(i+2))\r\n\t\t{\r\n\t\t\ti+=3;\r\n\t\t}\r\n\t\telif(rcode::is_utf8_2(val.get(i))&&val.get(i+1))\r\n\t\t{\r\n\t\t\ti+=2;\r\n\t\t}\r\n\t\telse\r\n\t\t\treturn false;\r\n\t\tfor(;i<val.count();i++)\r\n\t\t{\r\n\t\t\tif(rstr::is_number(val[i])||rstr::is_alpha(val[i])||\r\n\t\t\t\t'_'==val[i]||'.'==val[i])\r\n\t\t\t\tcontinue;\r\n\t\t\telif(rcode::is_utf8_3(val[i])&&val.get(i+1)&&val.get(i+2))\r\n\t\t\t{\r\n\t\t\t\ti+=2;\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\t\t\telif(rcode::is_utf8_2(val[i])&&val.get(i+1))\r\n\t\t\t{\r\n\t\t\t\ti++;\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t\treturn false;\r\n\t\t}\r\n\t\treturn true;\r\n\t}\r\n\r\n\trbool is_cint() const\r\n\t{\r\n\t\treturn val.is_number();\r\n\t}\r\n\r\n\trbool is_cuint() const\r\n\t{\r\n\t\treturn val.sub(0,val.count()-1).is_number()&&val.get_top()=='u';\r\n\t}\r\n\r\n\trbool is_caddr() const\r\n\t{\r\n\t\tif('&'!=val.get(0)||')'!=val.get_top())\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\tfor(int i=0;i<val.count()-2;i++)\r\n\t\t\tif(val[i]=='.')\r\n\t\t\t\treturn true;\r\n\t\treturn false;\r\n\t}\r\n\r\n\trbool is_cdouble() const\r\n\t{\r\n\t\tif(!rstr::is_number(val.get_bottom())||\r\n\t\t\t!rstr::is_number(val.get_top()))\r\n\t\t\treturn false;\r\n\t\tint count=0;\r\n\t\tfor(int i=1;i<val.count();i++)\r\n\t\t\tif(val[i]=='.')\r\n\t\t\t\tcount++;\r\n\t\treturn count==1;\r\n\t}\r\n\r\n\t//常量指针，一般只用于null\r\n\trbool is_cpoint() const\r\n\t{\r\n\t\treturn val.sub(0,val.count()-1).is_number()&&val.get_top()=='p'||\r\n\t\t\tis_caddr();\r\n\t}\r\n\r\n\t//字符串常量，如\"a\"\r\n\trbool is_cstr() const\r\n\t{\r\n\t\treturn val.get_bottom()=='\"';\r\n\t}\r\n\r\n\trbool is_const() const\r\n\t{\r\n\t\treturn rstr::is_number(val.get(0))||val.get(0)=='\"'||is_caddr();\r\n\t}\r\n};\r\n\r\nstruct tmac\r\n{\r\n\trstr name;\r\n\trbuf<rstr> param;\r\n\trbuf<rstr> vstr;\r\n\trbool is_super;\r\n\r\n\ttmac()\r\n\t{\r\n\t\tis_super=false;\r\n\t}\r\n\r\n\ttmac(const rstr& a)\r\n\t{\r\n\t\tname=a;\r\n\t\tis_super=false;\r\n\t}\r\n\r\n\tfriend rbool operator<(const tmac& a,const tmac& b)\r\n\t{\r\n\t\treturn a.name<b.name;\r\n\t}\r\n};\r\n\r\nstruct ttl\r\n{\r\n\trstr name;\r\n\trstr val;//默认值\r\n};\r\n\r\nstruct tfile\r\n{\r\n\trstrw name;\r\n\trstr cont;\r\n\trbuf<tword> vword;\r\n\trbuf<rstr> line_list;\r\n\trbuf<int> tab_list;//前面tab个数，1个tab等于4个空格（todo:改成8个空格）\r\n\r\n\ttfile()\r\n\t{\r\n\t}\r\n\r\n\ttfile(const rstrw& name)\r\n\t{\r\n\t\tthis->name=name;\r\n\t}\r\n\r\n\tfriend rbool operator<(const tfile& a,const tfile& b)\r\n\t{\r\n\t\treturn a.name<b.name;\r\n\t}\r\n};\r\n\r\nstruct tdata\r\n{\r\n\trstr type;\r\n\trstr name;\r\n\tint size;//真实大小\r\n\tint count;//数组个数\r\n\tint off;//相对偏移\r\n\trbuf<tword> param;//默认参数\r\n\r\n\ttdata()\r\n\t{\r\n\t\tclear();\r\n\t}\r\n\r\n\ttdata(const rstr& type)\r\n\t{\r\n\t\tclear();\r\n\t\tthis->type=type;\r\n\t}\r\n\r\n\ttdata(const rstr& type,const rstr& name)\r\n\t{\r\n\t\tclear();\r\n\t\tthis->type=type;\r\n\t\tthis->name=name;\r\n\t}\r\n\r\n\tvoid clear()\r\n\t{\r\n\t\ttype.clear();\r\n\t\tname.clear();\r\n\t\tsize=0;\r\n\t\tcount=0;\r\n\t\toff=0;\r\n\t\tparam.clear();\r\n\t}\r\n\r\n\tvoid print()\r\n\t{\r\n\t\ttype.print();\r\n\t\tname.print();\r\n\t}\r\n\r\n\tfriend rbool operator==(const tdata& a,const tdata& b)\r\n\t{\r\n\t\treturn a.name==b.name;\r\n\t}\r\n};\r\n\r\n//表达式和语句几乎没有区别\r\nstruct tsent\r\n{\r\n\trbuf<tword> vword;\r\n\trstr type;//表达式类型，也可以理解为语句返回值的类型\r\n\ttpos pos;\r\n\r\n\ttsent()\r\n\t{\r\n\t\tclear();\r\n\t}\r\n\r\n\ttsent(tsent&& a)\r\n\t{\r\n\t\tpos=a.pos;\r\n\t\ttype=a.type;\r\n\t\tvword=a.vword;\r\n\t}\r\n\r\n\tvoid operator=(tsent&& a)\r\n\t{\r\n\t\ttype.m_buf.free();\r\n\t\tvword.free();\r\n\t\tpos=a.pos;\r\n\t\ttype=a.type;\r\n\t\tvword=a.vword;\r\n\t}\r\n\r\n\tvoid clear()\r\n\t{\r\n\t\tpos.clear();\r\n\t\ttype.clear();\r\n\t\tvword.clear();\r\n\t}\r\n\r\n\ttsent sub(int begin,int end) const\r\n\t{\r\n\t\ttsent ret;\r\n\t\tret.pos=pos;\r\n\t\tret.vword=vword.sub(begin,end);//类型信息为空\r\n\t\treturn r_move(ret);\r\n\t}\r\n\r\n\trbool empty() const\r\n\t{\r\n\t\treturn vword.empty();\r\n\t}\r\n\tvoid print()\r\n\t{\r\n\t\tvword.print();\r\n\t}\r\n};\r\n\r\nstruct tdynamic\r\n{\r\n\tint key;\r\n\trbuf<rbuf<rstr> > vparam;\r\n\r\n\ttdynamic()\r\n\t{\r\n\t}\r\n\r\n\tfriend rbool operator<(const tdynamic& a,const tdynamic& b)\r\n\t{\r\n\t\treturn a.key<b.key;\r\n\t}\r\n};\r\n\r\nstruct tclass;\r\n\r\nstruct tfunc\r\n{\r\n\trbool is_macro;\r\n\trbool is_cfunc;\r\n\trbool is_dynamic;\r\n\trbool is_friend;\r\n\trstr lambda_data;\r\n\ttdata retval;\r\n\trstr name;\r\n\trstr name_dec;//增加一个dec变量是为了提高查找效率\r\n\r\n\trbuf<ttl> vtl;\r\n\trbuf<tdata> param;//参数列表\r\n\trbuf<tdata> local;//局部变量表\r\n\t\r\n\trbuf<tword> vword;//函数内容的词表\r\n\trbuf<tsent> vsent;//语句表\r\n\trbuf<tasm> vasm;\r\n\r\n\ttpos first_pos;//first_pos似乎没用\r\n\ttpos last_pos;\r\n\t\r\n\tint8 count;\r\n\ttclass* ptci;//反射到tclass，不用初始化\r\n\r\n\tuchar* code;//jit代码段\r\n\trset<tdynamic> sdynamic;\r\n\r\n\ttfunc()\r\n\t{\r\n\t\tclear();\r\n\t}\r\n\r\n\t~tfunc()\r\n\t{\r\n\t\tif(code!=null)\r\n\t\t{\r\n\t\t\ttalloc::free_v(code);//注意jit以后不能直接调用默认的拷贝构造函数\r\n\t\t}\r\n\t}\r\n\r\n\tvoid clear()\r\n\t{\r\n\t\tis_macro=false;\r\n\t\tis_cfunc=false;\r\n\t\tis_dynamic=false;\r\n\t\tis_friend=false;\r\n\t\tlambda_data.clear();\r\n\t\tretval.clear();\r\n\t\tname.clear();\r\n\t\tname_dec.clear();\r\n\r\n\t\tvtl.clear();\r\n\t\tparam.clear();\r\n\t\tlocal.clear();\r\n\t\t\r\n\t\tvword.clear();\r\n\t\tvsent.clear();\r\n\t\tvasm.clear();\r\n\r\n\t\tfirst_pos.clear();\r\n\t\tlast_pos.clear();\r\n\t\t\r\n\t\tcount=0;\r\n\t\t//ptci=null;\r\n\t\tcode=null;\r\n\t\tsdynamic.clear();\r\n\t}\r\n\r\n\trstr get_dec() const\r\n\t{\r\n\t\trstr s;\r\n\t\ts+=name+\"(\";\r\n\t\tfor(int j=0;j<param.count();j++)\r\n\t\t{\r\n\t\t\tif(j!=0)\r\n\t\t\t{\r\n\t\t\t\ts+=\",\";\r\n\t\t\t}\r\n\t\t\ts+=param[j].type;\r\n\t\t}\r\n\t\ts+=\")\";\r\n\t\treturn r_move(s);\r\n\t}\r\n\r\n\tfriend rbool operator<(const tfunc& a,const tfunc& b)\r\n\t{\r\n\t\treturn a.name_dec<b.name_dec;\r\n\t}\r\n};\r\n\r\nstruct tclass\r\n{\r\n\trstr name;\r\n\trset<tmac> vmac;//宏列表\r\n\trbuf<tdata> vdata;//数据成员列表\r\n\trset<tfunc> vfunc;//函数成员列表\r\n\trset<tfunc> vfunctl;//模板函数列表\r\n\r\n\trbuf<tword> vword;\r\n\trbuf<ttl> vtl;\r\n\trbuf<tsent> vfather;//父类表\r\n\r\n\tint size;\r\n\trbool is_friend;\r\n\r\n\tvoid clear()\r\n\t{\r\n\t\tname.clear();\r\n\t\tvmac.clear();\r\n\t\tvdata.clear();\r\n\t\tvfunc.clear();\r\n\t\tvfunctl.clear();\r\n\r\n\t\tvword.clear();\r\n\t\tvtl.clear();\r\n\t\tvfather.clear();\r\n\r\n\t\tsize=0;\r\n\t\tis_friend=false;\r\n\t}\r\n\r\n\ttclass()\r\n\t{\r\n\t\tclear();\r\n\t}\r\n\r\n\tfriend rbool operator<(const tclass& a,const tclass& b)\r\n\t{\r\n\t\treturn a.name<b.name;\r\n\t}\r\n};\r\n\r\nstruct taddr\r\n{\r\n\tuint start;\r\n\tuint end;\r\n\ttfunc* ptfi;\r\n\r\n\ttaddr()\r\n\t{\r\n\t}\r\n\r\n\ttaddr(uint start,uint end,tfunc* ptfi)\r\n\t{\r\n\t\tthis->start=start;\r\n\t\tthis->end=end;\r\n\t\tthis->ptfi=ptfi;\r\n\t}\r\n\r\n\tfriend rbool operator<(const taddr& a,const taddr& b)\r\n\t{\r\n\t\treturn a.end<=b.start;\r\n\t}\r\n};\r\n\r\nstruct tenv\r\n{\r\n\ttfunc* ptfi;\r\n\tuint v_ebp;\r\n\r\n\ttenv()\r\n\t{\r\n\t\tptfi=null;\r\n\t\tv_ebp=0;\r\n\t}\r\n};\r\n\r\n#endif\r\n"
  },
  {
    "path": "rpp/tvm.h",
    "content": "﻿#ifndef tvm_h__\r\n#define tvm_h__\r\n\r\n#include \"zjit.h\"\r\n#include \"../rlib/rthread.h\"\r\n#include \"../rlib/rsock.h\"\r\n#include \"tanalyse.h\"\r\n#include \"../rlib/rdic.h\"\r\n#include \"../rlib/rlist.h\"\r\n\r\nstruct tvm;\r\n\r\n//虚拟机的一个线程\r\nstruct tvm_t\r\n{\r\n\ttreg m_reg;\r\n\trbuf<uchar> m_stack;\r\n\tint m_thread;\r\n\trbuf<tasm> m_vasm;//一组初始化指令\r\n\trdic<void*> m_func;//外部函数字典，每个线程一个则不需要使用互斥体\r\n\ttvm* m_pvm;\r\n};\r\n\r\nstruct tvm\r\n{\r\n\trlist<tvm_t> m_list;\r\n\ttsh m_sh;\r\n\r\n\tstatic rbool other_call(int index,tsh* sh,tvm_t* pvmt,treg& reg)\r\n\t{\r\n\t\tif(index<2000)\r\n\t\t{\r\n\t\t\treturn false;//cocos_call\r\n\t\t}\r\n\t\treturn false;\r\n\t}\r\n\r\n\t//为了提高效率将1条指令分解为6条\r\n\tstatic rbool qrun(tsh& sh,tvm_t* pvmt,treg reg,treg* poldreg=null)\r\n\t{\r\n\t\ttins* cur;\r\nnext:\r\n\t\tcur=(tins*)(reg.eip);\r\n\t\t//m_bin.print_reg(reg);\r\n\t\t//((tasm*)cur)->vstr.print();\r\n\t\t//rf::printl();\r\n\t\t//rf::getch();\r\n\t\t\r\n\t\tswitch(cur->type)\r\n\t\t{\r\n\t\tcase tins::c_rjit_n:\r\n\t\t\tif(!zbin::cp_call_asm(sh,*(tasm*)cur))\r\n\t\t\t{\r\n\t\t\t\tsh.error(((tasm*)cur)->ptfi);\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\tgoto next;\r\n\t\tcase tins::c_rjit_n+1:\r\n\t\tcase tins::c_rjit_n+2:\r\n\t\tcase tins::c_rjit_n+3:\r\n\t\tcase tins::c_rjit_n+4:\r\n\t\tcase tins::c_rjit_n+5:\r\n\t\t\treturn false;\r\n\r\n\t\tcase tins::c_calle_i:\r\n\t\t\tswitch(v_get_imme(cur->first))\r\n\t\t\t{\r\n\t\t\tcase tins::c_eval_txt:\r\n\t\t\t\treturn false;\r\n\t\t\tcase tins::c_cp_txt:\r\n\t\t\t\treturn false;\r\n\t\t\tcase tins::c_find_meta:\r\n\t\t\t\treturn false;\r\n\t\t\tcase tins::c_find_func:\r\n\t\t\t\tv_pto_uint(reg.esp+4)=zbin::find_func_bin(sh,\r\n\t\t\t\t\t(char*)v_pto_uint(reg.esp));\r\n\t\t\t\treg.esp+=4;\r\n\t\t\t\tv_next_ins;\r\n\t\t\tcase tins::c_find_dll:\r\n\t\t\t\tv_pto_uint(reg.esp+4)=(uint)find_dll(\r\n\t\t\t\t\tpvmt,(char*)v_pto_uint(reg.esp));\r\n\t\t\t\treg.esp+=4;\r\n\t\t\t\tv_next_ins;\r\n\t\t\tcase tins::c_stdcall_func:\r\n\t\t\t\tstdcall_func(reg);\r\n\t\t\t\tv_next_ins;\r\n\t\t\tcase tins::c_cdecl_func:\r\n\t\t\t\tcdecl_func(reg);\r\n\t\t\t\tv_next_ins;\r\n\t\t\tcase tins::c_get_vclass:\r\n\t\t\t\tv_pto_uint(reg.esp)=(uint)&sh.m_class;\r\n\t\t\t\tv_next_ins;\r\n\r\n\t\t\tcase tins::c_thr_create:\r\n\t\t\t\tv_pto_uint(reg.esp+8)=pvmt->m_pvm->create_thr(sh,\r\n\t\t\t\t\t(void*)v_pto_uint(reg.esp),\r\n\t\t\t\t\t(void*)v_pto_uint(reg.esp+4));\r\n\t\t\t\treg.esp+=8;\r\n\t\t\t\tv_next_ins;\r\n\t\t\tcase tins::c_thr_wait:\r\n\t\t\t\tif(v_pto_uint(reg.esp)!=0)\r\n\t\t\t\t\trthread::wait_exit(v_pto_uint(reg.esp));\r\n\t\t\t\treg.esp+=4;\r\n\t\t\t\tv_next_ins;\r\n\r\n\t\t\tcase tins::c_mu_init:\r\n\t\t\t\tv_pto_int(reg.esp)=(int)(r_new<rmutex>());\r\n\t\t\t\tv_next_ins;\r\n\t\t\tcase tins::c_mu_del:\r\n\t\t\t\tr_delete((rmutex*)v_pto_int(reg.esp));\r\n\t\t\t\treg.esp+=4;\r\n\t\t\t\tv_next_ins;\r\n\t\t\tcase tins::c_mu_enter:\r\n\t\t\t\t((rmutex*)v_pto_int(reg.esp))->enter();\r\n\t\t\t\treg.esp+=4;\r\n\t\t\t\tv_next_ins;\r\n\t\t\tcase tins::c_mu_leave:\r\n\t\t\t\t((rmutex*)v_pto_int(reg.esp))->leave();\r\n\t\t\t\treg.esp+=4;\r\n\t\t\t\tv_next_ins;\r\n\r\n\t\t\tcase tins::c_execmd:\r\n\t\t\t\tv_pto_uint(reg.esp+4)=rf::execmd(\r\n\t\t\t\t\t(char*)v_pto_uint(reg.esp));\r\n\t\t\t\treg.esp+=4;\r\n\t\t\t\tv_next_ins;\r\n\t\t\tcase tins::c_srand:\r\n\t\t\t\trf::srand();\r\n\t\t\t\tv_next_ins;\r\n\t\t\tcase tins::c_rand:\r\n\t\t\t\tv_pto_int(reg.esp)=rf::rand();\r\n\t\t\t\tv_next_ins;\r\n\t\t\tcase tins::c_gettick:\r\n\t\t\t\tv_pto_int(reg.esp)=rf::tick();\r\n\t\t\t\tv_next_ins;\r\n\t\t\tcase tins::c_sleep:\r\n\t\t\t\trf::sleep(v_pto_int(reg.esp));\r\n\t\t\t\treg.esp+=4;\r\n\t\t\t\tv_next_ins;\r\n\r\n\t\t\tcase tins::c_puts:\r\n\t\t\t\tprintf(\"%s\",r_to_pchar(v_pto_int(reg.esp)));\r\n\t\t\t\treg.esp+=4;\r\n\t\t\t\tv_next_ins;\r\n\t\t\tcase tins::c_puts_l:\r\n\t\t\t\tprintf(\"%s\",rstr(r_to_pchar(v_pto_int(reg.esp)),\r\n\t\t\t\t\tv_pto_int(reg.esp+4)).cstr());\r\n\t\t\t\treg.esp+=8;\r\n\t\t\t\tv_next_ins;\r\n\t\t\tcase tins::c_getch:\r\n\t\t\t\tv_pto_int(reg.esp)=rf::getch();\r\n\t\t\t\tv_next_ins;\r\n\t\t\tcase tins::c_getstdin:\r\n\t\t\t\tv_pto_int(reg.esp)=(int)stdin;\r\n\t\t\t\tv_next_ins;\r\n\t\t\tcase tins::c_getstdout:\r\n\t\t\t\tv_pto_int(reg.esp)=(int)stdout;\r\n\t\t\t\tv_next_ins;\r\n\t\t\tcase tins::c_get_argc:\r\n\t\t\t\tv_pto_int(reg.esp)=sh.m_argc;\r\n\t\t\t\tv_next_ins;\r\n\t\t\tcase tins::c_get_argv:\r\n\t\t\t\tv_pto_int(reg.esp)=(int)sh.m_argv;\r\n\t\t\t\tv_next_ins;\r\n\r\n\t\t\tcase tins::c_sprintf:\r\n\t\t\t\tsprintf(r_to_pchar(v_pto_int(reg.esp)),\r\n\t\t\t\t\tr_to_pchar(v_pto_int(reg.esp+4)),\r\n\t\t\t\t\tv_pto_int(reg.esp+8));\r\n\t\t\t\treg.esp+=12;\r\n\t\t\t\tv_next_ins;\r\n\t\t\tcase tins::c_sprintf8:\r\n\t\t\t\tsprintf((char*)v_pto_int(reg.esp),\r\n\t\t\t\t\t(char*)v_pto_int(reg.esp+4),\r\n\t\t\t\t\tv_pto_int8(reg.esp+8));\r\n\t\t\t\treg.esp+=16;\r\n\t\t\t\tv_next_ins;\r\n\t\t\tcase tins::c_sscanf:\r\n\t\t\t\tsscanf((char*)v_pto_int(reg.esp),\r\n\t\t\t\t\t(char*)v_pto_int(reg.esp+4),\r\n\t\t\t\t\tv_pto_int(reg.esp+8));\r\n\t\t\t\treg.esp+=12;\r\n\t\t\t\tv_next_ins;\r\n\r\n\t\t\tcase tins::c_malloc:\r\n\t\t\t\tv_pto_uint(reg.esp+4)=r_to_uint(\r\n\t\t\t\t\tmalloc(v_pto_uint(reg.esp)));\r\n\t\t\t\treg.esp+=4;\r\n\t\t\t\tv_next_ins;\r\n\t\t\tcase tins::c_mfree:\r\n\t\t\t\tfree(r_to_pchar(v_pto_uint(reg.esp)));\r\n\t\t\t\treg.esp+=4;\r\n\t\t\t\tv_next_ins;\r\n\t\t\tcase tins::c_memset:\r\n\t\t\t\tmemset((char*)v_pto_uint(reg.esp),\r\n\t\t\t\t\tv_pto_int(reg.esp+4),\r\n\t\t\t\t\tv_pto_uint(reg.esp+8));\r\n\t\t\t\treg.esp+=12;\r\n\t\t\t\tv_next_ins;\r\n\t\t\tcase tins::c_memcpy:\r\n\t\t\t\tmemcpy((char*)v_pto_uint(reg.esp),\r\n\t\t\t\t\t(char*)v_pto_uint(reg.esp+4),\r\n\t\t\t\t\tv_pto_uint(reg.esp+8));\r\n\t\t\t\treg.esp+=12;\r\n\t\t\t\tv_next_ins;\r\n\t\t\t\r\n\t\t\tcase tins::c_strcpy:\r\n\t\t\t\tstrcpy((char*)v_pto_uint(reg.esp),\r\n\t\t\t\t\t(char*)v_pto_uint(reg.esp+4));\r\n\t\t\t\treg.esp+=8;\r\n\t\t\t\tv_next_ins;\r\n\t\t\tcase tins::c_strcmp:\r\n\t\t\t\tv_pto_int(reg.esp+8)=strcmp(\r\n\t\t\t\t\t(char*)v_pto_uint(reg.esp),\r\n\t\t\t\t\t(char*)v_pto_uint(reg.esp+4));\r\n\t\t\t\treg.esp+=8;\r\n\t\t\t\tv_next_ins;\r\n\t\t\tcase tins::c_strlen:\r\n\t\t\t\tv_pto_uint(reg.esp+4)=\r\n\t\t\t\t\tstrlen((char*)v_pto_uint(reg.esp));\r\n\t\t\t\treg.esp+=4;\r\n\t\t\t\tv_next_ins;\r\n\t\t\t\r\n\t\t\tcase tins::c_fopen_w:\r\n\t\t\t\tv_pto_uint(reg.esp+8)=(int)rfile::fopen_w(\r\n\t\t\t\t\t(wchar*)v_pto_uint(reg.esp),\r\n\t\t\t\t\t(wchar*)v_pto_uint(reg.esp+4));\r\n\t\t\t\treg.esp+=8;\r\n\t\t\t\tv_next_ins;\r\n\t\t\tcase tins::c_fopen:\r\n\t\t\t\tv_pto_uint(reg.esp+8)=(uint)fopen(\r\n\t\t\t\t\t(char*)v_pto_uint(reg.esp),\r\n\t\t\t\t\t(char*)v_pto_uint(reg.esp+4));\r\n\t\t\t\treg.esp+=8;\r\n\t\t\t\tv_next_ins;\r\n\t\t\tcase tins::c_fclose:\r\n\t\t\t\tv_pto_int(reg.esp+4)=fclose(\r\n\t\t\t\t\t(FILE*)v_pto_uint(reg.esp));\r\n\t\t\t\treg.esp+=4;\r\n\t\t\t\tv_next_ins;\r\n\t\t\tcase tins::c_fread:\r\n\t\t\t\tv_pto_uint(reg.esp+16)=fread(\r\n\t\t\t\t\t(void*)v_pto_uint(reg.esp),\r\n\t\t\t\t\tv_pto_uint(reg.esp+4),\r\n\t\t\t\t\tv_pto_uint(reg.esp+8),\r\n\t\t\t\t\t(FILE*)v_pto_uint(reg.esp+12));\r\n\t\t\t\treg.esp+=16;\r\n\t\t\t\tv_next_ins;\r\n\t\t\tcase tins::c_fwrite:\r\n\t\t\t\tv_pto_uint(reg.esp+16)=fwrite(\r\n\t\t\t\t\t(void*)v_pto_uint(reg.esp),\r\n\t\t\t\t\tv_pto_uint(reg.esp+4),\r\n\t\t\t\t\tv_pto_uint(reg.esp+8),\r\n\t\t\t\t\t(FILE*)v_pto_uint(reg.esp+12));\r\n\t\t\t\treg.esp+=16;\r\n\t\t\t\tv_next_ins;\r\n\t\t\tcase tins::c_fseek:\r\n\t\t\t\tfseek((FILE*)v_pto_uint(reg.esp),\r\n\t\t\t\t\tv_pto_int(reg.esp+4),\r\n\t\t\t\t\tv_pto_int(reg.esp+8));\r\n\t\t\t\treg.esp+=12;\r\n\t\t\t\tv_next_ins;\r\n\t\t\tcase tins::c_fseek8:\r\n\t\t\t\trfile::fseek8((FILE*)v_pto_uint(reg.esp),\r\n\t\t\t\t\tv_pto_int8(reg.esp+4),\r\n\t\t\t\t\tv_pto_int(reg.esp+12));\r\n\t\t\t\treg.esp+=16;\r\n\t\t\t\tv_next_ins;\r\n\t\t\tcase tins::c_ftell:\r\n\t\t\t\tv_pto_uint(reg.esp+4)=ftell(\r\n\t\t\t\t\t(FILE*)v_pto_uint(reg.esp));\r\n\t\t\t\treg.esp+=4;\r\n\t\t\t\tv_next_ins;\r\n\t\t\tcase tins::c_ftell8:\r\n\t\t\t\tv_pto_int8(reg.esp+4)=rfile::ftell8(\r\n\t\t\t\t\t(FILE*)v_pto_uint(reg.esp));\r\n\t\t\t\treg.esp+=4;\r\n\t\t\t\tv_next_ins;\r\n\r\n\t\t\tcase tins::c_s_socket:\r\n\t\t\t\tv_pto_int(reg.esp+12)=rsock::s_socket(\r\n\t\t\t\t\tv_pto_int(reg.esp),\r\n\t\t\t\t\tv_pto_int(reg.esp+4),\r\n\t\t\t\t\tv_pto_int(reg.esp+8));\r\n\t\t\t\treg.esp+=12;\r\n\t\t\t\tv_next_ins;\r\n\t\t\tcase tins::c_s_connect:\r\n\t\t\t\tv_pto_int(reg.esp+12)=rsock::s_connect(\r\n\t\t\t\t\tv_pto_int(reg.esp),\r\n\t\t\t\t\t(void*)v_pto_int(reg.esp+4),\r\n\t\t\t\t\tv_pto_int(reg.esp+8));\r\n\t\t\t\treg.esp+=12;\r\n\t\t\t\tv_next_ins;\r\n\t\t\tcase tins::c_s_close:\r\n\t\t\t\tv_pto_int(reg.esp+4)=rsock::s_close(\r\n\t\t\t\t\tv_pto_int(reg.esp));\r\n\t\t\t\treg.esp+=4;\r\n\t\t\t\tv_next_ins;\r\n\t\t\tcase tins::c_s_send:\r\n\t\t\t\tv_pto_int(reg.esp+16)=rsock::s_send(\r\n\t\t\t\t\tv_pto_int(reg.esp),\r\n\t\t\t\t\t(void*)v_pto_int(reg.esp+4),\r\n\t\t\t\t\tv_pto_int(reg.esp+8),\r\n\t\t\t\t\tv_pto_int(reg.esp+12));\r\n\t\t\t\treg.esp+=16;\r\n\t\t\t\tv_next_ins;\r\n\t\t\tcase tins::c_s_recv:\r\n\t\t\t\tv_pto_int(reg.esp+16)=rsock::s_recv(\r\n\t\t\t\t\tv_pto_int(reg.esp),\r\n\t\t\t\t\t(void*)v_pto_int(reg.esp+4),\r\n\t\t\t\t\tv_pto_int(reg.esp+8),\r\n\t\t\t\t\tv_pto_int(reg.esp+12));\r\n\t\t\t\treg.esp+=16;\r\n\t\t\t\tv_next_ins;\r\n\t\t\tcase tins::c_s_bind:\r\n\t\t\t\tv_pto_int(reg.esp+12)=rsock::s_bind(\r\n\t\t\t\t\tv_pto_int(reg.esp),\r\n\t\t\t\t\t(void*)v_pto_int(reg.esp+4),\r\n\t\t\t\t\tv_pto_int(reg.esp+8));\r\n\t\t\t\treg.esp+=12;\r\n\t\t\t\tv_next_ins;\r\n\t\t\tcase tins::c_s_listen:\r\n\t\t\t\tv_pto_int(reg.esp+8)=rsock::s_listen(\r\n\t\t\t\t\tv_pto_int(reg.esp),\r\n\t\t\t\t\tv_pto_int(reg.esp+4));\r\n\t\t\t\treg.esp+=8;\r\n\t\t\t\tv_next_ins;\r\n\t\t\tcase tins::c_s_accept:\r\n\t\t\t\tv_pto_int(reg.esp+12)=rsock::s_accept(\r\n\t\t\t\t\tv_pto_int(reg.esp),\r\n\t\t\t\t\t(void*)v_pto_int(reg.esp+4),\r\n\t\t\t\t\t(int*)v_pto_int(reg.esp+8));\r\n\t\t\t\treg.esp+=12;\r\n\t\t\t\tv_next_ins;\r\n\r\n\t\t\tcase tins::c_gbk_to_utf8:\r\n\t\t\t\tv_pto_int(reg.esp+8)=rcode::gbk_to_utf8_c(\r\n\t\t\t\t\t(uchar*)v_pto_uint(reg.esp),\r\n\t\t\t\t\t(uchar*)v_pto_uint(reg.esp+4));\r\n\t\t\t\treg.esp+=8;\r\n\t\t\t\tv_next_ins;\r\n\t\t\tcase tins::c_gbk_to_utf16:\r\n\t\t\t\tv_pto_int(reg.esp+8)=rcode::gbk_to_utf16_c(\r\n\t\t\t\t\t(uchar*)v_pto_uint(reg.esp),\r\n\t\t\t\t\t(uchar*)v_pto_uint(reg.esp+4));\r\n\t\t\t\treg.esp+=8;\r\n\t\t\t\tv_next_ins;\r\n\t\t\tcase tins::c_utf8_to_gbk:\r\n\t\t\t\tv_pto_int(reg.esp+8)=rcode::utf8_to_gbk_c(\r\n\t\t\t\t\t(uchar*)v_pto_uint(reg.esp),\r\n\t\t\t\t\t(uchar*)v_pto_uint(reg.esp+4));\r\n\t\t\t\treg.esp+=8;\r\n\t\t\t\tv_next_ins;\r\n\t\t\tcase tins::c_utf8_to_utf16:\r\n\t\t\t\tv_pto_int(reg.esp+8)=rcode::utf8_to_utf16_c(\r\n\t\t\t\t\t(uchar*)v_pto_uint(reg.esp),\r\n\t\t\t\t\t(uchar*)v_pto_uint(reg.esp+4));\r\n\t\t\t\treg.esp+=8;\r\n\t\t\t\tv_next_ins;\r\n\t\t\tcase tins::c_utf16_to_gbk:\r\n\t\t\t\tv_pto_int(reg.esp+8)=rcode::utf16_to_gbk_c(\r\n\t\t\t\t\t(uchar*)v_pto_uint(reg.esp),\r\n\t\t\t\t\t(uchar*)v_pto_uint(reg.esp+4));\r\n\t\t\t\treg.esp+=8;\r\n\t\t\t\tv_next_ins;\r\n\t\t\tcase tins::c_utf16_to_utf8:\r\n\t\t\t\tv_pto_int(reg.esp+8)=rcode::utf16_to_utf8_c(\r\n\t\t\t\t\t(uchar*)v_pto_uint(reg.esp),\r\n\t\t\t\t\t(uchar*)v_pto_uint(reg.esp+4));\r\n\t\t\t\treg.esp+=8;\r\n\t\t\t\tv_next_ins;\r\n\t\t\t\r\n\t\t\tcase tins::c_CloseHandle:\r\n#ifdef _MSC_VER\r\n\t\t\t\tv_pto_int(reg.esp+4)=CloseHandle(\r\n\t\t\t\t\t(HANDLE)v_pto_int(reg.esp));\r\n#endif\r\n\t\t\t\treg.esp+=4;\r\n\t\t\t\tv_next_ins;\r\n\t\t\tcase tins::c_MessageBoxA:\r\n#ifdef _MSC_VER\r\n\t\t\t\tMessageBoxA(0,\"\",\"\",0);\r\n#endif\r\n\t\t\t\tv_next_ins;\r\n\t\t\tcase tins::c_itof8:\r\n\t\t\t\tv_pto_f8(reg.esp+4)=(double)v_pto_int(reg.esp);\r\n\t\t\t\treg.esp+=4;\r\n\t\t\t\tv_next_ins;\r\n\r\n\t\t\tdefault:\r\n\t\t\t\tifn(other_call(v_get_imme(cur->first),&sh,pvmt,reg))\r\n\t\t\t\t{\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t}\r\n\t\t\t\tv_next_ins;\r\n\t\t\t}\r\n\t\tcase tins::c_calle_i+1:\r\n\t\tcase tins::c_calle_i+2:\r\n\t\tcase tins::c_calle_i+3:\r\n\t\tcase tins::c_calle_i+4:\r\n\t\tcase tins::c_calle_i+5:\r\n\t\t\treturn false;\r\n\r\n\t\tcase tins::c_call_i:\r\n#ifdef RANALYSE\r\n\t\t\ttanalyse::analyse_add(v_get_imme(cur->first));\r\n#endif\r\n\t\t\treg.esp-=4;\r\n\t\t\tv_pto_uint(reg.esp)=reg.eip+r_size(tasm);\r\n\t\t\treg.eip=v_get_imme(cur->first);\r\n\t\t\tgoto next;\r\n\t\tcase tins::c_call_r:\r\n\t\t\treg.esp-=4;\r\n\t\t\tv_pto_uint(reg.esp)=reg.eip+r_size(tasm);\r\n\t\t\treg.eip=v_get_reg(cur->first);\r\n\t\t\tgoto next;\r\n\t\tcase tins::c_call_a:\r\n\t\t\treg.esp-=4;\r\n\t\t\tv_pto_uint(reg.esp)=reg.eip+r_size(tasm);\r\n\t\t\treg.eip=v_get_addr(cur->first);\r\n\t\t\tgoto next;\r\n\t\tcase tins::c_call_a+1:\r\n\t\tcase tins::c_call_a+2:\r\n\t\tcase tins::c_call_a+3:\r\n\t\t\treturn false;\r\n\r\n\t\tcase tins::c_ret_n:\r\n\t\t\treg.eip=v_pto_uint(reg.esp);\r\n\t\t\treg.esp+=4;\r\n\t\t\tgoto next;\r\n\t\tcase tins::c_ret_n+1:\r\n\t\tcase tins::c_ret_n+2:\r\n\t\tcase tins::c_ret_n+3:\r\n\t\tcase tins::c_ret_n+4:\r\n\t\tcase tins::c_ret_n+5:\r\n\t\t\treturn false;\r\n\r\n\t\tcase tins::c_ret_i:\r\n\t\t\treg.eip=v_pto_uint(reg.esp);\r\n\t\t\treg.esp+=4+v_get_imme(cur->first);\r\n\t\t\tgoto next;\r\n\t\tcase tins::c_ret_r:\r\n\t\t\treg.eip=v_pto_uint(reg.esp);\r\n\t\t\treg.esp+=4+v_get_reg(cur->first);\r\n\t\t\tgoto next;\r\n\t\tcase tins::c_ret_a:\r\n\t\t\treg.eip=v_pto_uint(reg.esp);\r\n\t\t\treg.esp+=4;\r\n\t\t\treg.esp+=v_get_addr(cur->first);\r\n\t\t\tgoto next;\r\n\t\tcase tins::c_ret_a+1:\r\n\t\tcase tins::c_ret_a+2:\r\n\t\tcase tins::c_ret_a+3:\r\n\t\t\treturn false;\r\n\r\n\t\tcase tins::c_push_i:\r\n\t\t\treg.esp-=4;\r\n\t\t\tv_pto_uint(reg.esp)=v_get_imme(cur->first);\r\n\t\t\tv_next_ins;\r\n\t\tcase tins::c_push_r:\r\n\t\t\treg.esp-=4;\r\n\t\t\tv_pto_uint(reg.esp)=v_get_reg(cur->first);\r\n\t\t\tv_next_ins;\r\n\t\tcase tins::c_push_a:\r\n\t\t\treg.esp-=4;\r\n\t\t\tv_pto_uint(reg.esp)=v_get_addr(cur->first);\r\n\t\t\tv_next_ins;\r\n\t\tcase tins::c_push_a+1:\r\n\t\tcase tins::c_push_a+2:\r\n\t\tcase tins::c_push_a+3:\r\n\t\t\treturn false;\r\n\r\n\t\tcase tins::c_pop_i:\r\n\t\t\treturn false;\r\n\t\tcase tins::c_pop_r:\r\n\t\t\tv_get_reg(cur->first)=v_pto_uint(reg.esp);\r\n\t\t\treg.esp+=4;\r\n\t\t\tv_next_ins;\r\n\t\tcase tins::c_pop_a:\r\n\t\t\tv_get_addr(cur->first)=v_pto_uint(reg.esp);\r\n\t\t\treg.esp+=4;\r\n\t\t\tv_next_ins;\r\n\t\tcase tins::c_pop_a+1:\r\n\t\tcase tins::c_pop_a+2:\r\n\t\tcase tins::c_pop_a+3:\r\n\t\t\treturn false;\r\n\r\n\t\tcase tins::c_jmp_i:\r\n\t\t\treg.eip=v_get_imme(cur->first);\r\n\t\t\tgoto next;\r\n\t\tcase tins::c_jmp_r:\r\n\t\t\treg.eip=v_get_reg(cur->first);\r\n\t\t\tgoto next;\r\n\t\tcase tins::c_jmp_a:\r\n\t\t\treg.eip=v_get_addr(cur->first);\r\n\t\t\tgoto next;\r\n\t\tcase tins::c_jmp_a+1:\r\n\t\tcase tins::c_jmp_a+2:\r\n\t\tcase tins::c_jmp_a+3:\r\n\t\t\treturn false;\r\n\r\n\t\tcase tins::c_jebxz_i:\r\n\t\t\tif(reg.ebx)\r\n\t\t\t\treg.eip+=r_size(tasm);\r\n\t\t\telse\r\n\t\t\t\treg.eip=v_get_imme(cur->first);\r\n\t\t\tgoto next;\r\n\t\tcase tins::c_jebxz_r:\r\n\t\t\tif(reg.ebx)\r\n\t\t\t\treg.eip+=r_size(tasm);\r\n\t\t\telse\r\n\t\t\t\treg.eip=v_get_reg(cur->first);\r\n\t\t\tgoto next;\r\n\t\tcase tins::c_jebxz_a:\r\n\t\t\tif(reg.ebx)\r\n\t\t\t\treg.eip+=r_size(tasm);\r\n\t\t\telse\r\n\t\t\t\treg.eip=v_get_addr(cur->first);\r\n\t\t\tgoto next;\r\n\t\tcase tins::c_jebxz_a+1:\r\n\t\tcase tins::c_jebxz_a+2:\r\n\t\tcase tins::c_jebxz_a+3:\r\n\t\t\treturn false;\r\n\r\n\t\tcase tins::c_jebxnz_i:\r\n\t\t\tif(reg.ebx)\r\n\t\t\t\treg.eip=v_get_imme(cur->first);\r\n\t\t\telse\r\n\t\t\t\treg.eip+=r_size(tasm);\r\n\t\t\tgoto next;\r\n\t\tcase tins::c_jebxnz_r:\r\n\t\t\tif(reg.ebx)\r\n\t\t\t\treg.eip=v_get_reg(cur->first);\r\n\t\t\telse\r\n\t\t\t\treg.eip+=r_size(tasm);\r\n\t\t\tgoto next;\r\n\t\tcase tins::c_jebxnz_a:\r\n\t\t\tif(reg.ebx)\r\n\t\t\t\treg.eip=v_get_addr(cur->first);\r\n\t\t\telse\r\n\t\t\t\treg.eip+=r_size(tasm);\r\n\t\t\tgoto next;\r\n\t\tcase tins::c_jebxnz_a+1:\r\n\t\tcase tins::c_jebxnz_a+2:\r\n\t\tcase tins::c_jebxnz_a+3:\r\n\t\t\treturn false;\r\n\r\n\t\tcase tins::c_halt_n:\r\n\t\t\tbreak;\r\n\t\tcase tins::c_halt_n+1:\r\n\t\tcase tins::c_halt_n+2:\r\n\t\tcase tins::c_halt_n+3:\r\n\t\tcase tins::c_halt_n+4:\r\n\t\tcase tins::c_halt_n+5:\r\n\t\t\treturn false;\r\n\r\n\t\tcase tins::c_nop_n:\r\n\t\t\tv_next_ins;\r\n\t\tcase tins::c_nop_n+1:\r\n\t\tcase tins::c_nop_n+2:\r\n\t\tcase tins::c_nop_n+3:\r\n\t\tcase tins::c_nop_n+4:\r\n\t\tcase tins::c_nop_n+5:\r\n\t\t\treturn false;\r\n\r\n\t\tcase tins::c_lea_ri:\r\n\t\t\treturn false;\r\n\t\tcase tins::c_lea_ai:\r\n\t\t\treturn false;\r\n\t\tcase tins::c_lea_rr:\r\n\t\t\treturn false;\r\n\t\tcase tins::c_lea_ar:\r\n\t\t\treturn false;\r\n\t\tcase tins::c_lea_ra:\r\n\t\t\tv_get_reg(cur->first)=v_get_lea(cur->second);\r\n\t\t\tv_next_ins;\r\n\t\tcase tins::c_lea_aa:\r\n\t\t\tv_get_addr(cur->first)=v_get_lea(cur->second);\r\n\t\t\tv_next_ins;\r\n\r\n\t\tcase tins::c_mov_ri:\r\n\t\t\tv_get_reg(cur->first)=v_get_imme(cur->second);\r\n\t\t\tv_next_ins;\r\n\t\tcase tins::c_mov_ai:\r\n\t\t\tv_get_addr(cur->first)=v_get_imme(cur->second);\r\n\t\t\tv_next_ins;\r\n\t\tcase tins::c_mov_rr:\r\n\t\t\tv_get_reg(cur->first)=v_get_reg(cur->second);\r\n\t\t\tv_next_ins;\r\n\t\tcase tins::c_mov_ar:\r\n\t\t\tv_get_addr(cur->first)=v_get_reg(cur->second);\r\n\t\t\tv_next_ins;\r\n\t\tcase tins::c_mov_ra:\r\n\t\t\tv_get_reg(cur->first)=v_get_addr(cur->second);\r\n\t\t\tv_next_ins;\r\n\t\tcase tins::c_mov_aa:\r\n\t\t\tv_get_addr(cur->first)=v_get_addr(cur->second);\r\n\t\t\tv_next_ins;\r\n\r\n\t\tcase tins::c_mov1_ri:\r\n\t\tcase tins::c_mov1_ai:\r\n\t\tcase tins::c_mov1_rr:\r\n\t\tcase tins::c_mov1_ar:\r\n\t\tcase tins::c_mov1_ra:\r\n\t\t\treturn false;\r\n\t\tcase tins::c_mov1_aa:\r\n\t\t\tv_get_addr_1(cur->first)=v_get_addr_1(cur->second);\r\n\t\t\tv_next_ins;\r\n\r\n\t\tcase tins::c_mov8_ri:\r\n\t\tcase tins::c_mov8_ai:\r\n\t\tcase tins::c_mov8_rr:\r\n\t\tcase tins::c_mov8_ar:\r\n\t\tcase tins::c_mov8_ra:\r\n\t\t\treturn false;\r\n\t\tcase tins::c_mov8_aa:\r\n\t\t\tv_get_addr_8(cur->first)=v_get_addr_8(cur->second);\r\n\t\t\tv_next_ins;\r\n\r\n\t\tcase tins::c_add_ri:\r\n\t\t\tv_get_reg(cur->first)+=v_get_imme(cur->second);\r\n\t\t\tv_next_ins;\r\n\t\tcase tins::c_add_ai:\r\n\t\t\tv_get_addr(cur->first)+=v_get_imme(cur->second);\r\n\t\t\tv_next_ins;\r\n\t\tcase tins::c_add_rr:\r\n\t\t\tv_get_reg(cur->first)+=v_get_reg(cur->second);\r\n\t\t\tv_next_ins;\r\n\t\tcase tins::c_add_ar:\r\n\t\t\tv_get_addr(cur->first)+=v_get_reg(cur->second);\r\n\t\t\tv_next_ins;\r\n\t\tcase tins::c_add_ra:\r\n\t\t\tv_get_reg(cur->first)+=v_get_addr(cur->second);\r\n\t\t\tv_next_ins;\r\n\t\tcase tins::c_add_aa:\r\n\t\t\tv_get_addr(cur->first)+=v_get_addr(cur->second);\r\n\t\t\tv_next_ins;\r\n\r\n\t\tcase tins::c_sub_ri:\r\n\t\t\tv_get_reg(cur->first)-=v_get_imme(cur->second);\r\n\t\t\tv_next_ins;\r\n\t\tcase tins::c_sub_ai:\r\n\t\t\tv_get_addr(cur->first)-=v_get_imme(cur->second);\r\n\t\t\tv_next_ins;\r\n\t\tcase tins::c_sub_rr:\r\n\t\t\tv_get_reg(cur->first)-=v_get_reg(cur->second);\r\n\t\t\tv_next_ins;\r\n\t\tcase tins::c_sub_ar:\r\n\t\t\tv_get_addr(cur->first)-=v_get_reg(cur->second);\r\n\t\t\tv_next_ins;\r\n\t\tcase tins::c_sub_ra:\r\n\t\t\tv_get_reg(cur->first)-=v_get_addr(cur->second);\r\n\t\t\tv_next_ins;\r\n\t\tcase tins::c_sub_aa:\r\n\t\t\tv_get_addr(cur->first)-=v_get_addr(cur->second);\r\n\t\t\tv_next_ins;\r\n\t\t\r\n\t\tcase tins::c_imul_ri:\r\n\t\t\tv_get_reg(cur->first)*=v_get_imme(cur->second);\r\n\t\t\tv_next_ins;\r\n\t\tcase tins::c_imul_ai:\r\n\t\t\tv_get_addr(cur->first)*=v_get_imme(cur->second);\r\n\t\t\tv_next_ins;\r\n\t\tcase tins::c_imul_rr:\r\n\t\t\tv_get_reg(cur->first)*=v_get_reg(cur->second);\r\n\t\t\tv_next_ins;\r\n\t\tcase tins::c_imul_ar:\r\n\t\t\tv_get_addr(cur->first)*=v_get_reg(cur->second);\r\n\t\t\tv_next_ins;\r\n\t\tcase tins::c_imul_ra:\r\n\t\t\tv_get_reg(cur->first)*=v_get_addr(cur->second);\r\n\t\t\tv_next_ins;\r\n\t\tcase tins::c_imul_aa:\r\n\t\t\tv_get_addr(cur->first)*=v_get_addr(cur->second);\r\n\t\t\tv_next_ins;\r\n\r\n\t\tcase tins::c_idiv_ri:\r\n\t\t\tv_get_reg(cur->first)/=v_get_imme(cur->second);\r\n\t\t\tv_next_ins;\r\n\t\tcase tins::c_idiv_ai:\r\n\t\t\tv_get_addr(cur->first)/=v_get_imme(cur->second);\r\n\t\t\tv_next_ins;\r\n\t\tcase tins::c_idiv_rr:\r\n\t\t\tv_get_reg(cur->first)/=v_get_reg(cur->second);\r\n\t\t\tv_next_ins;\r\n\t\tcase tins::c_idiv_ar:\r\n\t\t\tv_get_addr(cur->first)/=v_get_reg(cur->second);\r\n\t\t\tv_next_ins;\r\n\t\tcase tins::c_idiv_ra:\r\n\t\t\tv_get_reg(cur->first)/=v_get_addr(cur->second);\r\n\t\t\tv_next_ins;\r\n\t\tcase tins::c_idiv_aa:\r\n\t\t\tv_get_addr(cur->first)/=v_get_addr(cur->second);\r\n\t\t\tv_next_ins;\r\n\r\n\t\tcase tins::c_imod_ri:\r\n\t\t\tv_get_reg(cur->first)%=v_get_imme(cur->second);\r\n\t\t\tv_next_ins;\r\n\t\tcase tins::c_imod_ai:\r\n\t\t\tv_get_addr(cur->first)%=v_get_imme(cur->second);\r\n\t\t\tv_next_ins;\r\n\t\tcase tins::c_imod_rr:\r\n\t\t\tv_get_reg(cur->first)%=v_get_reg(cur->second);\r\n\t\t\tv_next_ins;\r\n\t\tcase tins::c_imod_ar:\r\n\t\t\tv_get_addr(cur->first)%=v_get_reg(cur->second);\r\n\t\t\tv_next_ins;\r\n\t\tcase tins::c_imod_ra:\r\n\t\t\tv_get_reg(cur->first)%=v_get_addr(cur->second);\r\n\t\t\tv_next_ins;\r\n\t\tcase tins::c_imod_aa:\r\n\t\t\tv_get_addr(cur->first)%=v_get_addr(cur->second);\r\n\t\t\tv_next_ins;\t\r\n\t\t\r\n\t\tcase tins::c_cesb_ri:\r\n\t\t\treg.ebx=v_get_reg(cur->first)==v_get_imme(cur->second);\r\n\t\t\tv_next_ins;\r\n\t\tcase tins::c_cesb_ai:\r\n\t\t\treg.ebx=v_get_addr(cur->first)==v_get_imme(cur->second);\r\n\t\t\tv_next_ins;\r\n\t\tcase tins::c_cesb_rr:\r\n\t\t\treg.ebx=v_get_reg(cur->first)==v_get_reg(cur->second);\r\n\t\t\tv_next_ins;\r\n\t\tcase tins::c_cesb_ar:\r\n\t\t\treg.ebx=v_get_addr(cur->first)==v_get_reg(cur->second);\r\n\t\t\tv_next_ins;\r\n\t\tcase tins::c_cesb_ra:\r\n\t\t\treg.ebx=v_get_reg(cur->first)==v_get_addr(cur->second);\r\n\t\t\tv_next_ins;\r\n\t\tcase tins::c_cesb_aa:\r\n\t\t\treg.ebx=v_get_addr(cur->first)==v_get_addr(cur->second);\r\n\t\t\tv_next_ins;\r\n\r\n\t\tcase tins::c_cnesb_ri:\r\n\t\t\treg.ebx=v_get_reg(cur->first)!=v_get_imme(cur->second);\r\n\t\t\tv_next_ins;\r\n\t\tcase tins::c_cnesb_ai:\r\n\t\t\treg.ebx=v_get_addr(cur->first)!=v_get_imme(cur->second);\r\n\t\t\tv_next_ins;\r\n\t\tcase tins::c_cnesb_rr:\r\n\t\t\treg.ebx=v_get_reg(cur->first)!=v_get_reg(cur->second);\r\n\t\t\tv_next_ins;\r\n\t\tcase tins::c_cnesb_ar:\r\n\t\t\treg.ebx=v_get_addr(cur->first)!=v_get_reg(cur->second);\r\n\t\t\tv_next_ins;\r\n\t\tcase tins::c_cnesb_ra:\r\n\t\t\treg.ebx=v_get_reg(cur->first)!=v_get_addr(cur->second);\r\n\t\t\tv_next_ins;\r\n\t\tcase tins::c_cnesb_aa:\r\n\t\t\treg.ebx=v_get_addr(cur->first)!=v_get_addr(cur->second);\r\n\t\t\tv_next_ins;\r\n\t\t\r\n\t\tcase tins::c_cgsb_ri:\r\n\t\t\treg.ebx=v_get_reg(cur->first)>v_get_imme(cur->second);\r\n\t\t\tv_next_ins;\r\n\t\tcase tins::c_cgsb_ai:\r\n\t\t\treg.ebx=v_get_addr(cur->first)>v_get_imme(cur->second);\r\n\t\t\tv_next_ins;\r\n\t\tcase tins::c_cgsb_rr:\r\n\t\t\treg.ebx=v_get_reg(cur->first)>v_get_reg(cur->second);\r\n\t\t\tv_next_ins;\r\n\t\tcase tins::c_cgsb_ar:\r\n\t\t\treg.ebx=v_get_addr(cur->first)>v_get_reg(cur->second);\r\n\t\t\tv_next_ins;\r\n\t\tcase tins::c_cgsb_ra:\r\n\t\t\treg.ebx=v_get_reg(cur->first)>v_get_addr(cur->second);\r\n\t\t\tv_next_ins;\r\n\t\tcase tins::c_cgsb_aa:\r\n\t\t\treg.ebx=v_get_addr(cur->first)>v_get_addr(cur->second);\r\n\t\t\tv_next_ins;\r\n\r\n\t\tcase tins::c_cgesb_ri:\r\n\t\t\treg.ebx=v_get_reg(cur->first)>=v_get_imme(cur->second);\r\n\t\t\tv_next_ins;\r\n\t\tcase tins::c_cgesb_ai:\r\n\t\t\treg.ebx=v_get_addr(cur->first)>=v_get_imme(cur->second);\r\n\t\t\tv_next_ins;\r\n\t\tcase tins::c_cgesb_rr:\r\n\t\t\treg.ebx=v_get_reg(cur->first)>=v_get_reg(cur->second);\r\n\t\t\tv_next_ins;\r\n\t\tcase tins::c_cgesb_ar:\r\n\t\t\treg.ebx=v_get_addr(cur->first)>=v_get_reg(cur->second);\r\n\t\t\tv_next_ins;\r\n\t\tcase tins::c_cgesb_ra:\r\n\t\t\treg.ebx=v_get_reg(cur->first)>=v_get_addr(cur->second);\r\n\t\t\tv_next_ins;\r\n\t\tcase tins::c_cgesb_aa:\r\n\t\t\treg.ebx=v_get_addr(cur->first)>=v_get_addr(cur->second);\r\n\t\t\tv_next_ins;\r\n\r\n\t\tcase tins::c_clsb_ri:\r\n\t\t\treg.ebx=v_get_reg(cur->first)<v_get_imme(cur->second);\r\n\t\t\tv_next_ins;\r\n\t\tcase tins::c_clsb_ai:\r\n\t\t\treg.ebx=v_get_addr(cur->first)<v_get_imme(cur->second);\r\n\t\t\tv_next_ins;\r\n\t\tcase tins::c_clsb_rr:\r\n\t\t\treg.ebx=v_get_reg(cur->first)<v_get_reg(cur->second);\r\n\t\t\tv_next_ins;\r\n\t\tcase tins::c_clsb_ar:\r\n\t\t\treg.ebx=v_get_addr(cur->first)<v_get_reg(cur->second);\r\n\t\t\tv_next_ins;\r\n\t\tcase tins::c_clsb_ra:\r\n\t\t\treg.ebx=v_get_reg(cur->first)<v_get_addr(cur->second);\r\n\t\t\tv_next_ins;\r\n\t\tcase tins::c_clsb_aa:\r\n\t\t\treg.ebx=v_get_addr(cur->first)<v_get_addr(cur->second);\r\n\t\t\tv_next_ins;\r\n\r\n\t\tcase tins::c_clesb_ri:\r\n\t\t\treg.ebx=v_get_reg(cur->first)<=v_get_imme(cur->second);\r\n\t\t\tv_next_ins;\r\n\t\tcase tins::c_clesb_ai:\r\n\t\t\treg.ebx=v_get_addr(cur->first)<=v_get_imme(cur->second);\r\n\t\t\tv_next_ins;\r\n\t\tcase tins::c_clesb_rr:\r\n\t\t\treg.ebx=v_get_reg(cur->first)<=v_get_reg(cur->second);\r\n\t\t\tv_next_ins;\r\n\t\tcase tins::c_clesb_ar:\r\n\t\t\treg.ebx=v_get_addr(cur->first)<=v_get_reg(cur->second);\r\n\t\t\tv_next_ins;\r\n\t\tcase tins::c_clesb_ra:\r\n\t\t\treg.ebx=v_get_reg(cur->first)<=v_get_addr(cur->second);\r\n\t\t\tv_next_ins;\r\n\t\tcase tins::c_clesb_aa:\r\n\t\t\treg.ebx=v_get_addr(cur->first)<=v_get_addr(cur->second);\r\n\t\t\tv_next_ins;\r\n\t\t\r\n\t\tcase tins::c_clesb_aa+1:\r\n\t\tcase tins::c_clesb_aa+2:\r\n\t\tcase tins::c_clesb_aa+3:\r\n\t\tcase tins::c_clesb_aa+4:\r\n\t\tcase tins::c_clesb_aa+5:\r\n\t\t\treturn false;\r\n\t\tcase tins::c_add8_aa:\r\n\t\t\tv_get_addr_8(cur->first)+=v_get_addr_8(cur->second);\r\n\t\t\tv_next_ins;\t\r\n\t\t\r\n\t\tcase tins::c_add8_aa+1:\r\n\t\tcase tins::c_add8_aa+2:\r\n\t\tcase tins::c_add8_aa+3:\r\n\t\tcase tins::c_add8_aa+4:\r\n\t\tcase tins::c_add8_aa+5:\r\n\t\t\treturn false;\r\n\t\tcase tins::c_sub8_aa:\r\n\t\t\tv_get_addr_8(cur->first)-=v_get_addr_8(cur->second);\r\n\t\t\tv_next_ins;\r\n\t\t\r\n\t\tcase tins::c_sub8_aa+1:\r\n\t\tcase tins::c_sub8_aa+2:\r\n\t\tcase tins::c_sub8_aa+3:\r\n\t\tcase tins::c_sub8_aa+4:\r\n\t\tcase tins::c_sub8_aa+5:\r\n\t\t\treturn false;\r\n\t\tcase tins::c_imul8_aa:\r\n\t\t\tv_get_addr_8(cur->first)*=v_get_addr_8(cur->second);\r\n\t\t\tv_next_ins;\r\n\r\n\t\tcase tins::c_imul8_aa+1:\r\n\t\tcase tins::c_imul8_aa+2:\r\n\t\tcase tins::c_imul8_aa+3:\r\n\t\tcase tins::c_imul8_aa+4:\r\n\t\tcase tins::c_imul8_aa+5:\r\n\t\t\treturn false;\r\n\t\tcase tins::c_idiv8_aa:\r\n\t\t\tv_get_addr_8(cur->first)/=v_get_addr_8(cur->second);\r\n\t\t\tv_next_ins;\r\n\r\n\t\tcase tins::c_idiv8_aa+1:\r\n\t\tcase tins::c_idiv8_aa+2:\r\n\t\tcase tins::c_idiv8_aa+3:\r\n\t\tcase tins::c_idiv8_aa+4:\r\n\t\tcase tins::c_idiv8_aa+5:\r\n\t\t\treturn false;\r\n\t\tcase tins::c_imod8_aa:\r\n\t\t\tv_get_addr_8(cur->first)%=v_get_addr_8(cur->second);\r\n\t\t\tv_next_ins;\r\n\r\n\t\tcase tins::c_imod8_aa+1:\r\n\t\tcase tins::c_imod8_aa+2:\r\n\t\tcase tins::c_imod8_aa+3:\r\n\t\tcase tins::c_imod8_aa+4:\r\n\t\tcase tins::c_imod8_aa+5:\r\n\t\t\treturn false;\r\n\t\tcase tins::c_cgsb8_aa:\r\n\t\t\treg.ebx=v_get_addr_8(cur->first)>v_get_addr_8(cur->second);\r\n\t\t\tv_next_ins;\r\n\r\n\t\tcase tins::c_cgsb8_aa+1:\r\n\t\tcase tins::c_cgsb8_aa+2:\r\n\t\tcase tins::c_cgsb8_aa+3:\r\n\t\tcase tins::c_cgsb8_aa+4:\r\n\t\tcase tins::c_cgsb8_aa+5:\r\n\t\t\treturn false;\r\n\t\tcase tins::c_clsb8_aa:\r\n\t\t\treg.ebx=v_get_addr_8(cur->first)<v_get_addr_8(cur->second);\r\n\t\t\tv_next_ins;\r\n\t\t\r\n\t\tcase tins::c_clsb8_aa+1:\r\n\t\tcase tins::c_clsb8_aa+2:\r\n\t\tcase tins::c_clsb8_aa+3:\r\n\t\tcase tins::c_clsb8_aa+4:\r\n\t\tcase tins::c_clsb8_aa+5:\r\n\t\t\treturn false;\r\n\t\tcase tins::c_fadd8_aa:\r\n\t\t\tv_get_addr_f8(cur->first)+=v_get_addr_f8(cur->second);\r\n\t\t\tv_next_ins;\t\r\n\r\n\t\tcase tins::c_fadd8_aa+1:\r\n\t\tcase tins::c_fadd8_aa+2:\r\n\t\tcase tins::c_fadd8_aa+3:\r\n\t\tcase tins::c_fadd8_aa+4:\r\n\t\tcase tins::c_fadd8_aa+5:\r\n\t\t\treturn false;\r\n\t\tcase tins::c_fsub8_aa:\r\n\t\t\tv_get_addr_f8(cur->first)-=v_get_addr_f8(cur->second);\r\n\t\t\tv_next_ins;\r\n\r\n\t\tcase tins::c_fsub8_aa+1:\r\n\t\tcase tins::c_fsub8_aa+2:\r\n\t\tcase tins::c_fsub8_aa+3:\r\n\t\tcase tins::c_fsub8_aa+4:\r\n\t\tcase tins::c_fsub8_aa+5:\r\n\t\t\treturn false;\r\n\t\tcase tins::c_fmul8_aa:\r\n\t\t\tv_get_addr_f8(cur->first)*=v_get_addr_f8(cur->second);\r\n\t\t\tv_next_ins;\r\n\r\n\t\tcase tins::c_fmul8_aa+1:\r\n\t\tcase tins::c_fmul8_aa+2:\r\n\t\tcase tins::c_fmul8_aa+3:\r\n\t\tcase tins::c_fmul8_aa+4:\r\n\t\tcase tins::c_fmul8_aa+5:\r\n\t\t\treturn false;\r\n\t\tcase tins::c_fdiv8_aa:\r\n\t\t\tv_get_addr_f8(cur->first)/=v_get_addr_f8(cur->second);\r\n\t\t\tv_next_ins;\r\n\r\n\t\tcase tins::c_fdiv8_aa+1:\r\n\t\tcase tins::c_fdiv8_aa+2:\r\n\t\tcase tins::c_fdiv8_aa+3:\r\n\t\tcase tins::c_fdiv8_aa+4:\r\n\t\tcase tins::c_fdiv8_aa+5:\r\n\t\t\treturn false;\r\n\t\tcase tins::c_fcgsb8_aa:\r\n\t\t\treg.ebx=v_get_addr_f8(cur->first)>v_get_addr_f8(cur->second);\r\n\t\t\tv_next_ins;\r\n\r\n\t\tcase tins::c_fcgsb8_aa+1:\r\n\t\tcase tins::c_fcgsb8_aa+2:\r\n\t\tcase tins::c_fcgsb8_aa+3:\r\n\t\tcase tins::c_fcgsb8_aa+4:\r\n\t\tcase tins::c_fcgsb8_aa+5:\r\n\t\t\treturn false;\r\n\t\tcase tins::c_fclsb8_aa:\r\n\t\t\treg.ebx=v_get_addr_f8(cur->first)<v_get_addr_f8(cur->second);\r\n\t\t\tv_next_ins;\r\n\t\t\t\r\n\t\tcase tins::c_band_ri:\r\n\t\t\tv_get_reg_u(cur->first)&=v_get_imme_u(cur->second);\r\n\t\t\tv_next_ins;\r\n\t\tcase tins::c_band_ai:\r\n\t\t\tv_get_addr_u(cur->first)&=v_get_imme_u(cur->second);\r\n\t\t\tv_next_ins;\r\n\t\tcase tins::c_band_rr:\r\n\t\t\tv_get_reg_u(cur->first)&=v_get_reg_u(cur->second);\r\n\t\t\tv_next_ins;\r\n\t\tcase tins::c_band_ar:\r\n\t\t\tv_get_addr_u(cur->first)&=v_get_reg_u(cur->second);\r\n\t\t\tv_next_ins;\r\n\t\tcase tins::c_band_ra:\r\n\t\t\tv_get_reg_u(cur->first)&=v_get_addr_u(cur->second);\r\n\t\t\tv_next_ins;\r\n\t\tcase tins::c_band_aa:\r\n\t\t\tv_get_addr_u(cur->first)&=v_get_addr_u(cur->second);\r\n\t\t\tv_next_ins;\t\r\n\r\n\t\tcase tins::c_bor_ri:\r\n\t\t\tv_get_reg_u(cur->first)|=v_get_imme_u(cur->second);\r\n\t\t\tv_next_ins;\r\n\t\tcase tins::c_bor_ai:\r\n\t\t\tv_get_addr_u(cur->first)|=v_get_imme_u(cur->second);\r\n\t\t\tv_next_ins;\r\n\t\tcase tins::c_bor_rr:\r\n\t\t\tv_get_reg_u(cur->first)|=v_get_reg_u(cur->second);\r\n\t\t\tv_next_ins;\r\n\t\tcase tins::c_bor_ar:\r\n\t\t\tv_get_addr_u(cur->first)|=v_get_reg_u(cur->second);\r\n\t\t\tv_next_ins;\r\n\t\tcase tins::c_bor_ra:\r\n\t\t\tv_get_reg_u(cur->first)|=v_get_addr_u(cur->second);\r\n\t\t\tv_next_ins;\r\n\t\tcase tins::c_bor_aa:\r\n\t\t\tv_get_addr_u(cur->first)|=v_get_addr_u(cur->second);\r\n\t\t\tv_next_ins;\t\r\n\r\n\t\tcase tins::c_bnot_i:\r\n\t\t\treturn false;\r\n\t\tcase tins::c_bnot_r:\r\n\t\t\tv_get_reg(cur->first)=~v_get_reg(cur->first);\r\n\t\t\tv_next_ins;\t\r\n\t\tcase tins::c_bnot_a:\r\n\t\t\tv_get_addr(cur->first)=~v_get_addr(cur->first);\r\n\t\t\tv_next_ins;\r\n\t\tcase tins::c_bnot_a+1:\r\n\t\tcase tins::c_bnot_a+2:\r\n\t\tcase tins::c_bnot_a+3:\r\n\t\t\treturn false;\r\n\r\n\t\tcase tins::c_bxor_ri:\r\n\t\t\tv_get_reg_u(cur->first)^=v_get_imme_u(cur->second);\r\n\t\t\tv_next_ins;\r\n\t\tcase tins::c_bxor_ai:\r\n\t\t\tv_get_addr_u(cur->first)^=v_get_imme_u(cur->second);\r\n\t\t\tv_next_ins;\r\n\t\tcase tins::c_bxor_rr:\r\n\t\t\tv_get_reg_u(cur->first)^=v_get_reg_u(cur->second);\r\n\t\t\tv_next_ins;\r\n\t\tcase tins::c_bxor_ar:\r\n\t\t\tv_get_addr_u(cur->first)^=v_get_reg_u(cur->second);\r\n\t\t\tv_next_ins;\r\n\t\tcase tins::c_bxor_ra:\r\n\t\t\tv_get_reg_u(cur->first)^=v_get_addr_u(cur->second);\r\n\t\t\tv_next_ins;\r\n\t\tcase tins::c_bxor_aa:\r\n\t\t\tv_get_addr_u(cur->first)^=v_get_addr_u(cur->second);\r\n\t\t\tv_next_ins;\t\r\n\r\n\t\tcase tins::c_bshl_ri:\r\n\t\t\tv_get_reg_u(cur->first)<<=v_get_imme_u(cur->second);\r\n\t\t\tv_next_ins;\r\n\t\tcase tins::c_bshl_ai:\r\n\t\t\tv_get_addr_u(cur->first)<<=v_get_imme_u(cur->second);\r\n\t\t\tv_next_ins;\r\n\t\tcase tins::c_bshl_rr:\r\n\t\t\tv_get_reg_u(cur->first)<<=v_get_reg_u(cur->second);\r\n\t\t\tv_next_ins;\r\n\t\tcase tins::c_bshl_ar:\r\n\t\t\tv_get_addr_u(cur->first)<<=v_get_reg_u(cur->second);\r\n\t\t\tv_next_ins;\r\n\t\tcase tins::c_bshl_ra:\r\n\t\t\tv_get_reg_u(cur->first)<<=v_get_addr_u(cur->second);\r\n\t\t\tv_next_ins;\r\n\t\tcase tins::c_bshl_aa:\r\n\t\t\tv_get_addr_u(cur->first)<<=v_get_addr_u(cur->second);\r\n\t\t\tv_next_ins;\t\r\n\r\n\t\tcase tins::c_bshr_ri:\r\n\t\t\tv_get_reg_u(cur->first)>>=v_get_imme_u(cur->second);\r\n\t\t\tv_next_ins;\r\n\t\tcase tins::c_bshr_ai:\r\n\t\t\tv_get_addr_u(cur->first)>>=v_get_imme_u(cur->second);\r\n\t\t\tv_next_ins;\r\n\t\tcase tins::c_bshr_rr:\r\n\t\t\tv_get_reg_u(cur->first)>>=v_get_reg_u(cur->second);\r\n\t\t\tv_next_ins;\r\n\t\tcase tins::c_bshr_ar:\r\n\t\t\tv_get_addr_u(cur->first)>>=v_get_reg_u(cur->second);\r\n\t\t\tv_next_ins;\r\n\t\tcase tins::c_bshr_ra:\r\n\t\t\tv_get_reg_u(cur->first)>>=v_get_addr_u(cur->second);\r\n\t\t\tv_next_ins;\r\n\t\tcase tins::c_bshr_aa:\r\n\t\t\tv_get_addr_u(cur->first)>>=v_get_addr_u(cur->second);\r\n\t\t\tv_next_ins;\t\r\n\r\n\t\tcase tins::c_bsar_ri:\r\n\t\t\tv_get_reg(cur->first)>>=v_get_imme(cur->second);\r\n\t\t\tv_next_ins;\r\n\t\tcase tins::c_bsar_ai:\r\n\t\t\tv_get_addr(cur->first)>>=v_get_imme(cur->second);\r\n\t\t\tv_next_ins;\r\n\t\tcase tins::c_bsar_rr:\r\n\t\t\tv_get_reg(cur->first)>>=v_get_reg(cur->second);\r\n\t\t\tv_next_ins;\r\n\t\tcase tins::c_bsar_ar:\r\n\t\t\tv_get_addr(cur->first)>>=v_get_reg(cur->second);\r\n\t\t\tv_next_ins;\r\n\t\tcase tins::c_bsar_ra:\r\n\t\t\tv_get_reg(cur->first)>>=v_get_addr(cur->second);\r\n\t\t\tv_next_ins;\r\n\t\tcase tins::c_bsar_aa:\r\n\t\t\tv_get_addr(cur->first)>>=v_get_addr(cur->second);\r\n\t\t\tv_next_ins;\t\r\n\r\n\t\tcase tins::c_udiv_ri:\r\n\t\t\tv_get_reg_u(cur->first)/=v_get_imme_u(cur->second);\r\n\t\t\tv_next_ins;\r\n\t\tcase tins::c_udiv_ai:\r\n\t\t\tv_get_addr_u(cur->first)/=v_get_imme_u(cur->second);\r\n\t\t\tv_next_ins;\r\n\t\tcase tins::c_udiv_rr:\r\n\t\t\tv_get_reg_u(cur->first)/=v_get_reg_u(cur->second);\r\n\t\t\tv_next_ins;\r\n\t\tcase tins::c_udiv_ar:\r\n\t\t\tv_get_addr_u(cur->first)/=v_get_reg_u(cur->second);\r\n\t\t\tv_next_ins;\r\n\t\tcase tins::c_udiv_ra:\r\n\t\t\tv_get_reg_u(cur->first)/=v_get_addr_u(cur->second);\r\n\t\t\tv_next_ins;\r\n\t\tcase tins::c_udiv_aa:\r\n\t\t\tv_get_addr_u(cur->first)/=v_get_addr_u(cur->second);\r\n\t\t\tv_next_ins;\r\n\r\n\t\tcase tins::c_umod_ri:\r\n\t\t\tv_get_reg_u(cur->first)%=v_get_imme_u(cur->second);\r\n\t\t\tv_next_ins;\r\n\t\tcase tins::c_umod_ai:\r\n\t\t\tv_get_addr_u(cur->first)%=v_get_imme_u(cur->second);\r\n\t\t\tv_next_ins;\r\n\t\tcase tins::c_umod_rr:\r\n\t\t\tv_get_reg_u(cur->first)%=v_get_reg_u(cur->second);\r\n\t\t\tv_next_ins;\r\n\t\tcase tins::c_umod_ar:\r\n\t\t\tv_get_addr_u(cur->first)%=v_get_reg_u(cur->second);\r\n\t\t\tv_next_ins;\r\n\t\tcase tins::c_umod_ra:\r\n\t\t\tv_get_reg_u(cur->first)%=v_get_addr_u(cur->second);\r\n\t\t\tv_next_ins;\r\n\t\tcase tins::c_umod_aa:\r\n\t\t\tv_get_addr_u(cur->first)%=v_get_addr_u(cur->second);\r\n\t\t\tv_next_ins;\t\t\r\n\r\n\t\tcase tins::c_ucgsb_ri:\r\n\t\t\treg.ebx=v_get_reg_u(cur->first)>v_get_imme_u(cur->second);\r\n\t\t\tv_next_ins;\r\n\t\tcase tins::c_ucgsb_ai:\r\n\t\t\treg.ebx=v_get_addr_u(cur->first)>v_get_imme_u(cur->second);\r\n\t\t\tv_next_ins;\r\n\t\tcase tins::c_ucgsb_rr:\r\n\t\t\treg.ebx=v_get_reg_u(cur->first)>v_get_reg_u(cur->second);\r\n\t\t\tv_next_ins;\r\n\t\tcase tins::c_ucgsb_ar:\r\n\t\t\treg.ebx=v_get_addr_u(cur->first)>v_get_reg_u(cur->second);\r\n\t\t\tv_next_ins;\r\n\t\tcase tins::c_ucgsb_ra:\r\n\t\t\treg.ebx=v_get_reg_u(cur->first)>v_get_addr_u(cur->second);\r\n\t\t\tv_next_ins;\r\n\t\tcase tins::c_ucgsb_aa:\r\n\t\t\treg.ebx=v_get_addr_u(cur->first)>v_get_addr_u(cur->second);\r\n\t\t\tv_next_ins;\r\n\r\n\t\tcase tins::c_ucgesb_ri:\r\n\t\t\treg.ebx=v_get_reg_u(cur->first)>=v_get_imme_u(cur->second);\r\n\t\t\tv_next_ins;\r\n\t\tcase tins::c_ucgesb_ai:\r\n\t\t\treg.ebx=v_get_addr_u(cur->first)>=v_get_imme_u(cur->second);\r\n\t\t\tv_next_ins;\r\n\t\tcase tins::c_ucgesb_rr:\r\n\t\t\treg.ebx=v_get_reg_u(cur->first)>=v_get_reg_u(cur->second);\r\n\t\t\tv_next_ins;\r\n\t\tcase tins::c_ucgesb_ar:\r\n\t\t\treg.ebx=v_get_addr_u(cur->first)>=v_get_reg_u(cur->second);\r\n\t\t\tv_next_ins;\r\n\t\tcase tins::c_ucgesb_ra:\r\n\t\t\treg.ebx=v_get_reg_u(cur->first)>=v_get_addr_u(cur->second);\r\n\t\t\tv_next_ins;\r\n\t\tcase tins::c_ucgesb_aa:\r\n\t\t\treg.ebx=v_get_addr_u(cur->first)>=v_get_addr_u(cur->second);\r\n\t\t\tv_next_ins;\r\n\r\n\t\tcase tins::c_uclsb_ri:\r\n\t\t\treg.ebx=v_get_reg_u(cur->first)<v_get_imme_u(cur->second);\r\n\t\t\tv_next_ins;\r\n\t\tcase tins::c_uclsb_ai:\r\n\t\t\treg.ebx=v_get_addr_u(cur->first)<v_get_imme_u(cur->second);\r\n\t\t\tv_next_ins;\r\n\t\tcase tins::c_uclsb_rr:\r\n\t\t\treg.ebx=v_get_reg_u(cur->first)<v_get_reg_u(cur->second);\r\n\t\t\tv_next_ins;\r\n\t\tcase tins::c_uclsb_ar:\r\n\t\t\treg.ebx=v_get_addr_u(cur->first)<v_get_reg_u(cur->second);\r\n\t\t\tv_next_ins;\r\n\t\tcase tins::c_uclsb_ra:\r\n\t\t\treg.ebx=v_get_reg_u(cur->first)<v_get_addr_u(cur->second);\r\n\t\t\tv_next_ins;\r\n\t\tcase tins::c_uclsb_aa:\r\n\t\t\treg.ebx=v_get_addr_u(cur->first)<v_get_addr_u(cur->second);\r\n\t\t\tv_next_ins;\r\n\r\n\t\tcase tins::c_uclesb_ri:\r\n\t\t\treg.ebx=v_get_reg_u(cur->first)<=v_get_imme_u(cur->second);\r\n\t\t\tv_next_ins;\r\n\t\tcase tins::c_uclesb_ai:\r\n\t\t\treg.ebx=v_get_addr_u(cur->first)<=v_get_imme_u(cur->second);\r\n\t\t\tv_next_ins;\r\n\t\tcase tins::c_uclesb_rr:\r\n\t\t\treg.ebx=v_get_reg_u(cur->first)<=v_get_reg_u(cur->second);\r\n\t\t\tv_next_ins;\r\n\t\tcase tins::c_uclesb_ar:\r\n\t\t\treg.ebx=v_get_addr_u(cur->first)<=v_get_reg_u(cur->second);\r\n\t\t\tv_next_ins;\r\n\t\tcase tins::c_uclesb_ra:\r\n\t\t\treg.ebx=v_get_reg_u(cur->first)<=v_get_addr_u(cur->second);\r\n\t\t\tv_next_ins;\r\n\t\tcase tins::c_uclesb_aa:\r\n\t\t\treg.ebx=v_get_addr_u(cur->first)<=v_get_addr_u(cur->second);\r\n\t\t\tv_next_ins;\r\n\r\n\t\tdefault:\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\tif(poldreg!=null)\r\n\t\t{\r\n\t\t\t*poldreg=reg;\r\n\t\t}\r\n\t\treturn true;\r\n\t}\r\n\t\r\n\t//查找DLL中的函数\r\n\tstatic void* find_dll(tvm_t* pvmt,const char* name)\r\n\t{\r\n\t\tif(pvmt->m_func.exist(name))\r\n\t\t{\r\n\t\t\treturn pvmt->m_func[name];\r\n\t\t}\r\n\t\tvoid* ret=zjitf::find_dll_full(name);\r\n\t\tif(ret!=null)\r\n\t\t{\r\n\t\t\tpvmt->m_func[name]=ret;\r\n\t\t}\r\n\t\treturn ret;\r\n\t}\r\n\t\r\n\t//调用外部函数\r\n\tstatic void stdcall_func(treg& reg)\r\n\t{\r\n#ifdef _MSC_VER\r\n#ifndef _WIN64\r\n\t\tuint addr=v_pto_uint(reg.esp);\r\n\t\tint count=v_pto_int(reg.esp+4);\r\n\t\tint tmp;\r\n\t\tfor(int i=count-1;i>=0;i--)\r\n\t\t{\r\n\t\t\ttmp=v_pto_int(reg.esp+8+i*4);\r\n\t\t\t_asm push tmp\r\n\t\t}\r\n\t\t_asm call addr\r\n\t\t_asm mov tmp,eax\r\n\t\tv_pto_int(reg.esp+8+count*4)=tmp;\r\n\t\treg.esp+=8+count*4;\r\n#endif\r\n#endif\r\n\t}\r\n\t\r\n\t//调用外部函数\r\n\tstatic void cdecl_func(treg& reg)\r\n\t{\r\n#ifdef _MSC_VER\r\n#ifndef _WIN64\r\n\t\tuint addr=v_pto_uint(reg.esp);\r\n\t\tint count=v_pto_int(reg.esp+4);\r\n\t\tint tmp;\r\n\t\tfor(int i=count-1;i>=0;i--)\r\n\t\t{\r\n\t\t\ttmp=v_pto_int(reg.esp+8+i*4);\r\n\t\t\t_asm push tmp\r\n\t\t}\r\n\t\t_asm call addr\r\n\t\t_asm mov tmp,eax\r\n\t\t_asm mov eax,count\r\n\t\t_asm imul eax,4\r\n\t\t_asm add esp,eax\r\n\t\tv_pto_int(reg.esp+8+count*4)=tmp;\r\n\t\treg.esp+=8+count*4;\r\n#endif\r\n#endif\r\n\t}\r\n\r\n\trbool run(tsh& sh)\r\n\t{\r\n\t\tif(!init(sh))\r\n\t\t{\r\n\t\t\trf::printl(\"main func init failed\");\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\tif(!qrun(sh,&m_list[0],m_list[0].m_reg))\r\n\t\t{\r\n\t\t\trstr(\"undefined ins\").print();\r\n\t\t\treturn false;\r\n\t\t}\r\n#ifdef RANALYSE\r\n\t\ttanalyse::analyse_print(sh);\r\n#endif\r\n\t\treturn true;\r\n\t}\r\n\r\n\tstatic void init_reg(tsh& sh,tvm_t* pitem)\r\n\t{\r\n\t\tpitem->m_stack.realloc_n(rppconf(c_stack_size));\r\n\t\tpitem->m_reg.esp=r_to_uint(pitem->m_stack.end());\r\n\t\tpitem->m_reg.eip=r_to_uint(pitem->m_vasm.begin());\r\n\t}\r\n\r\n\trbool init(tsh& sh)\r\n\t{\r\n\t\ttvm_t item;\r\n\t\tm_list.push(item);\r\n\t\ttvm_t* pitem=&m_list.top();\r\n\t\tifn(main_init(sh,pitem->m_vasm))\r\n\t\t\treturn false;\r\n\t\tinit_reg(sh,pitem);\r\n\t\tpitem->m_pvm=this;\r\n\t\tpitem->m_thread=0;\r\n\t\treturn true;\r\n\t}\r\n\r\n\tstatic rbool main_init(tsh& sh,rbuf<tasm>& vasm)\r\n\t{\r\n\t\tzasm::push_asm(vasm,\"sub\",\"esp\",\",\",\"4\");\r\n\t\tzasm::push_asm(vasm,\"call\",rppoptr(c_mbk_l),rppoptr(c_addr),\r\n\t\t\trppoptr(c_comma),\"main\",rppoptr(c_comma),\"main()\",\r\n\t\t\trppoptr(c_mbk_r));\r\n\t\tzasm::push_asm(vasm,\"add\",\"esp\",\",\",\"4\");\r\n\t\tzasm::push_asm(vasm,\"halt\");\r\n\t\treturn zbin::proc_vasm(sh,vasm);\r\n\t}\r\n\r\n\tstatic rbool init_thr_ins(tsh& sh,rbuf<tasm>& vasm,void* start,void* param)\r\n\t{\r\n\t\tvasm.clear();\r\n\t\tzasm::push_asm(vasm,\"push\",rstr((uint)param));\r\n\t\tzasm::push_asm(vasm,\"call\",rstr((uint)start));\r\n\t\tzasm::push_asm(vasm,\"halt\");\r\n\t\treturn zbin::proc_vasm(sh,vasm);\r\n\t}\r\n\r\n\tint create_thr(tsh& sh,void* start,void* param)\r\n\t{\r\n\t\trmutex_t mutex_t(sh.m_mutex);\r\n\t\ttvm_t item;\r\n\t\tm_list.push(item);\r\n\t\ttvm_t* pitem=&m_list.top();\r\n\t\tifn(init_thr_ins(sh,pitem->m_vasm,start,param))\r\n\t\t{\r\n\t\t\treturn 0;\r\n\t\t}\r\n\t\tinit_reg(sh,pitem);\r\n\t\tpitem->m_pvm=this;\r\n\t\tpitem->m_thread=rthread::create(thread,pitem);\r\n\t\treturn pitem->m_thread;\r\n\t}\r\n\r\n\t//这里必须用裸线程\r\n\tstatic rthread_ret rthread_call thread(void* param)\r\n\t{\r\n\t\ttvm_t* pvmt=(tvm_t*)param;\r\n\t\ttvm* pvm=pvmt->m_pvm;\r\n\t\tifn(qrun(pvm->m_sh,pvmt,pvmt->m_reg))\r\n\t\t{\r\n\t\t\ttsh::error(\"undefined ins\");\r\n\t\t}\r\n\t\tpvm->m_sh.m_mutex.enter();\r\n\t\tpvm->m_list.erase(pvmt);\r\n\t\tpvm->m_sh.m_mutex.leave();\r\n\t\treturn 0;\r\n\t}\r\n};\r\n\r\n#endif\r\n"
  },
  {
    "path": "rpp/tvm_struct.h",
    "content": "﻿#ifndef tvm_struct_h__\r\n#define tvm_struct_h__\r\n\r\n#include \"../rlib/rstr.h\"\r\n#include \"rpp_def.h\"\r\n\r\n#pragma pack(4)\r\n\r\nstruct treg\r\n{\r\n\tunion\r\n\t{\r\n\t\t//int64 rip;\r\n\t\tuint eip;\r\n\t};\r\n\tunion\r\n\t{\r\n\t\t//int64 rsp;\r\n\t\tuint esp;\r\n\t};\r\n\tunion\r\n\t{\r\n\t\t//int64 rbp;\r\n\t\tuint ebp;\r\n\t};\r\n\tunion\r\n\t{\r\n\t\t//int64 rsi;\r\n\t\tuint esi;\r\n\t};\r\n\tunion\r\n\t{\r\n\t\t//int64 rdi;\r\n\t\tuint edi;\r\n\t};\r\n\tunion\r\n\t{\r\n\t\t//int64 rax;\r\n\t\tuint eax;\r\n\t};\r\n\tunion\r\n\t{\r\n\t\t//int64 rbx;\r\n\t\tuint ebx;\r\n\t};\r\n\tunion\r\n\t{\r\n\t\t//int64 rcx;\r\n\t\tuint ecx;\r\n\t};\r\n\tunion\r\n\t{\r\n\t\t//int64 rdx;\r\n\t\tuint edx;\r\n\t};\r\n\r\n\tenum \r\n\t{\r\n\t\tc_esp=4,\r\n\t\tc_ebp=8,\r\n\t\tc_esi=12,\r\n\t\tc_edi=16,\r\n\t\tc_eax=20,\r\n\t\tc_ebx=24,\r\n\t\tc_ecx=28,\r\n\t\tc_edx=32\r\n\t};\r\n};\r\n\r\nstruct topnd\r\n{\r\n\tint type;\r\n\tint off;\r\n\tint val;\r\n\r\n\tenum\r\n\t{\r\n\t\tc_null,\r\n\t\tc_reg,//ebp\r\n\t\tc_imme,//4\r\n\t\tc_addr,//[ebp+4]\r\n\t};\r\n\r\n\ttopnd()\r\n\t{\r\n\t\tclear();\r\n\t}\r\n\r\n\tvoid clear()\r\n\t{\r\n\t\ttype=c_null;\r\n\t\toff=0;\r\n\t\tval=0;\r\n\t}\r\n\r\n\trbool empty()\r\n\t{\r\n\t\treturn type==c_null;\r\n\t}\r\n};\r\n\r\nstruct tins\r\n{\r\n\tint type;\r\n\ttopnd first;\r\n\ttopnd second;\r\n\r\n\ttins()\r\n\t{\r\n\t\tclear();\r\n\t}\r\n\r\n\tvoid clear()\r\n\t{\r\n\t\ttype=c_rjit_n;\r\n\t\tfirst.clear();\r\n\t\tsecond.clear();\r\n\t}\r\n\r\n\trbool empty()\r\n\t{\r\n\t\treturn type==c_rjit_n;\r\n\t}\r\n\r\n\tenum\r\n\t{\r\n\t\tc_rjit_n,\r\n\r\n\t\tc_calle_i=c_rjit_n+6,\r\n\r\n\t\tc_call_i=c_calle_i+6,\r\n\t\tc_call_r,\r\n\t\tc_call_a,\r\n\r\n\t\tc_ret_n=c_call_i+6,\r\n\r\n\t\tc_ret_i=c_ret_n+6,\r\n\t\tc_ret_r,\r\n\t\tc_ret_a,\r\n\r\n\t\tc_push_i=c_ret_i+6,\r\n\t\tc_push_r,\r\n\t\tc_push_a,\r\n\r\n\t\tc_pop_i=c_push_i+6,\r\n\t\tc_pop_r,\r\n\t\tc_pop_a,\r\n\r\n\t\tc_jmp_i=c_pop_i+6,\r\n\t\tc_jmp_r,\r\n\t\tc_jmp_a,\r\n\r\n\t\tc_jebxz_i=c_jmp_i+6,\r\n\t\tc_jebxz_r,\r\n\t\tc_jebxz_a,\r\n\r\n\t\tc_jebxnz_i=c_jebxz_i+6,\r\n\t\tc_jebxnz_r,\r\n\t\tc_jebxnz_a,\r\n\r\n\t\tc_halt_n=c_jebxnz_i+6,\r\n\r\n\t\tc_nop_n=c_halt_n+6,\r\n\r\n\t\tc_lea_ri=c_nop_n+6,\r\n\t\tc_lea_ai,\r\n\t\tc_lea_rr,\r\n\t\tc_lea_ar,\r\n\t\tc_lea_ra,\r\n\t\tc_lea_aa,\r\n\r\n\t\tc_mov_ri,\r\n\t\tc_mov_ai,\r\n\t\tc_mov_rr,\r\n\t\tc_mov_ar,\r\n\t\tc_mov_ra,\r\n\t\tc_mov_aa,\r\n\r\n\t\tc_mov1_ri,\r\n\t\tc_mov1_ai,\r\n\t\tc_mov1_rr,\r\n\t\tc_mov1_ar,\r\n\t\tc_mov1_ra,\r\n\t\tc_mov1_aa,\r\n\r\n\t\tc_mov8_ri,\r\n\t\tc_mov8_ai,\r\n\t\tc_mov8_rr,\r\n\t\tc_mov8_ar,\r\n\t\tc_mov8_ra,\r\n\t\tc_mov8_aa,\r\n\r\n\t\tc_add_ri,\r\n\t\tc_add_ai,\r\n\t\tc_add_rr,\r\n\t\tc_add_ar,\r\n\t\tc_add_ra,\r\n\t\tc_add_aa,\r\n\r\n\t\tc_sub_ri,\r\n\t\tc_sub_ai,\r\n\t\tc_sub_rr,\r\n\t\tc_sub_ar,\r\n\t\tc_sub_ra,\r\n\t\tc_sub_aa,\r\n\t\t\r\n\t\tc_imul_ri,\r\n\t\tc_imul_ai,\r\n\t\tc_imul_rr,\r\n\t\tc_imul_ar,\r\n\t\tc_imul_ra,\r\n\t\tc_imul_aa,\r\n\r\n\t\tc_idiv_ri,\r\n\t\tc_idiv_ai,\r\n\t\tc_idiv_rr,\r\n\t\tc_idiv_ar,\r\n\t\tc_idiv_ra,\r\n\t\tc_idiv_aa,\r\n\r\n\t\tc_imod_ri,\r\n\t\tc_imod_ai,\r\n\t\tc_imod_rr,\r\n\t\tc_imod_ar,\r\n\t\tc_imod_ra,\r\n\t\tc_imod_aa,\r\n\r\n\t\tc_cesb_ri,\r\n\t\tc_cesb_ai,\r\n\t\tc_cesb_rr,\r\n\t\tc_cesb_ar,\r\n\t\tc_cesb_ra,\r\n\t\tc_cesb_aa,\r\n\r\n\t\tc_cnesb_ri,\r\n\t\tc_cnesb_ai,\r\n\t\tc_cnesb_rr,\r\n\t\tc_cnesb_ar,\r\n\t\tc_cnesb_ra,\r\n\t\tc_cnesb_aa,\r\n\r\n\t\tc_cgsb_ri,\r\n\t\tc_cgsb_ai,\r\n\t\tc_cgsb_rr,\r\n\t\tc_cgsb_ar,\r\n\t\tc_cgsb_ra,\r\n\t\tc_cgsb_aa,\r\n\r\n\t\tc_cgesb_ri,\r\n\t\tc_cgesb_ai,\r\n\t\tc_cgesb_rr,\r\n\t\tc_cgesb_ar,\r\n\t\tc_cgesb_ra,\r\n\t\tc_cgesb_aa,\r\n\r\n\t\tc_clsb_ri,\r\n\t\tc_clsb_ai,\r\n\t\tc_clsb_rr,\r\n\t\tc_clsb_ar,\r\n\t\tc_clsb_ra,\r\n\t\tc_clsb_aa,\r\n\r\n\t\tc_clesb_ri,\r\n\t\tc_clesb_ai,\r\n\t\tc_clesb_rr,\r\n\t\tc_clesb_ar,\r\n\t\tc_clesb_ra,\r\n\t\tc_clesb_aa,\r\n\r\n\t\tc_add8_aa=c_clesb_ri+6+5,\r\n\t\tc_sub8_aa=c_add8_aa+6,\r\n\t\tc_imul8_aa=c_sub8_aa+6,\r\n\t\tc_idiv8_aa=c_imul8_aa+6,\r\n\t\tc_imod8_aa=c_idiv8_aa+6,\r\n\t\tc_cgsb8_aa=c_imod8_aa+6,\r\n\t\tc_clsb8_aa=c_cgsb8_aa+6,\r\n\r\n\t\tc_fadd8_aa=c_clsb8_aa+6,\r\n\t\tc_fsub8_aa=c_fadd8_aa+6,\r\n\t\tc_fmul8_aa=c_fsub8_aa+6,\r\n\t\tc_fdiv8_aa=c_fmul8_aa+6,\r\n\t\tc_fcgsb8_aa=c_fdiv8_aa+6,\r\n\t\tc_fclsb8_aa=c_fcgsb8_aa+6,\r\n\r\n\t\tc_band_ri,\r\n\t\tc_band_ai,\r\n\t\tc_band_rr,\r\n\t\tc_band_ar,\r\n\t\tc_band_ra,\r\n\t\tc_band_aa,\r\n\r\n\t\tc_bor_ri,\r\n\t\tc_bor_ai,\r\n\t\tc_bor_rr,\r\n\t\tc_bor_ar,\r\n\t\tc_bor_ra,\r\n\t\tc_bor_aa,\r\n\r\n\t\tc_bnot_i,\r\n\t\tc_bnot_r,\r\n\t\tc_bnot_a,\r\n\r\n\t\tc_bxor_ri=c_bnot_i+6,\r\n\t\tc_bxor_ai,\r\n\t\tc_bxor_rr,\r\n\t\tc_bxor_ar,\r\n\t\tc_bxor_ra,\r\n\t\tc_bxor_aa,\r\n\r\n\t\tc_bshl_ri,\r\n\t\tc_bshl_ai,\r\n\t\tc_bshl_rr,\r\n\t\tc_bshl_ar,\r\n\t\tc_bshl_ra,\r\n\t\tc_bshl_aa,\r\n\r\n\t\tc_bshr_ri,\r\n\t\tc_bshr_ai,\r\n\t\tc_bshr_rr,\r\n\t\tc_bshr_ar,\r\n\t\tc_bshr_ra,\r\n\t\tc_bshr_aa,\r\n\r\n\t\tc_bsar_ri,\r\n\t\tc_bsar_ai,\r\n\t\tc_bsar_rr,\r\n\t\tc_bsar_ar,\r\n\t\tc_bsar_ra,\r\n\t\tc_bsar_aa,\r\n\r\n\t\tc_udiv_ri,\r\n\t\tc_udiv_ai,\r\n\t\tc_udiv_rr,\r\n\t\tc_udiv_ar,\r\n\t\tc_udiv_ra,\r\n\t\tc_udiv_aa,\r\n\r\n\t\tc_umod_ri,\r\n\t\tc_umod_ai,\r\n\t\tc_umod_rr,\r\n\t\tc_umod_ar,\r\n\t\tc_umod_ra,\r\n\t\tc_umod_aa,\r\n\t\r\n\t\tc_ucgsb_ri,\r\n\t\tc_ucgsb_ai,\r\n\t\tc_ucgsb_rr,\r\n\t\tc_ucgsb_ar,\r\n\t\tc_ucgsb_ra,\r\n\t\tc_ucgsb_aa,\r\n\r\n\t\tc_ucgesb_ri,\r\n\t\tc_ucgesb_ai,\r\n\t\tc_ucgesb_rr,\r\n\t\tc_ucgesb_ar,\r\n\t\tc_ucgesb_ra,\r\n\t\tc_ucgesb_aa,\r\n\r\n\t\tc_uclsb_ri,\r\n\t\tc_uclsb_ai,\r\n\t\tc_uclsb_rr,\r\n\t\tc_uclsb_ar,\r\n\t\tc_uclsb_ra,\r\n\t\tc_uclsb_aa,\r\n\r\n\t\tc_uclesb_ri,\r\n\t\tc_uclesb_ai,\r\n\t\tc_uclesb_rr,\r\n\t\tc_uclesb_ar,\r\n\t\tc_uclesb_ra,\r\n\t\tc_uclesb_aa,\r\n\t};\r\n\r\n\tenum\r\n\t{\r\n\t\tc_eval_txt,\r\n\t\tc_cp_txt,\r\n\t\tc_find_meta,\r\n\t\tc_find_func,\r\n\t\tc_find_dll,\r\n\t\tc_stdcall_func,\r\n\t\tc_cdecl_func,\r\n\t\tc_get_vclass,\r\n\r\n\t\tc_thr_create,\r\n\t\tc_thr_wait,\r\n\r\n\t\tc_mu_init,\r\n\t\tc_mu_del,\r\n\t\tc_mu_enter,\r\n\t\tc_mu_leave,\r\n\r\n\t\tc_execmd,\r\n\t\tc_srand,\r\n\t\tc_rand,\r\n\t\tc_gettick,\r\n\t\tc_sleep,\r\n\r\n\t\tc_puts,\r\n\t\tc_puts_l,\r\n\t\tc_getch,\r\n\t\tc_getstdin,\r\n\t\tc_getstdout,\r\n\t\tc_get_argc,\r\n\t\tc_get_argv,\r\n\r\n\t\tc_sprintf,\r\n\t\tc_sprintf8,\r\n\t\tc_sscanf,\r\n\r\n\t\tc_malloc,\r\n\t\tc_mfree,\r\n\t\tc_memset,\r\n\t\tc_memcpy,\r\n\t\t\r\n\t\tc_strcpy,\r\n\t\tc_strcmp,\r\n\t\tc_strlen,\r\n\t\t\r\n\t\tc_fopen_w,\r\n\t\tc_fopen,\r\n\t\tc_fclose,\r\n\t\tc_fread,\r\n\t\tc_fwrite,\r\n\t\tc_fseek,\r\n\t\tc_fseek8,\r\n\t\tc_ftell,\r\n\t\tc_ftell8,\r\n\r\n\t\tc_s_socket,\r\n\t\tc_s_connect,\r\n\t\tc_s_close,\r\n\t\tc_s_send,\r\n\t\tc_s_recv,\r\n\t\tc_s_bind,\r\n\t\tc_s_listen,\r\n\t\tc_s_accept,\r\n\t\t\r\n\t\tc_gbk_to_utf8,\r\n\t\tc_gbk_to_utf16,\r\n\t\tc_utf8_to_gbk,\r\n\t\tc_utf8_to_utf16,\r\n\t\tc_utf16_to_gbk,\r\n\t\tc_utf16_to_utf8,\r\n\t\t\r\n\t\tc_CloseHandle,\r\n\t\tc_MessageBoxA,\r\n\t\tc_itof8,\r\n\t};\r\n\r\n\tenum\r\n\t{\r\n\t\tc_cc_set_effect_volume=1000,\r\n\t\tc_cc_set_music_volume,\r\n\t\tc_cc_play_effect,\r\n\t\tc_cc_play_music,\r\n\r\n\t\tc_cc_add_animations,\r\n\t\tc_cc_get_animation,\r\n\t\tc_cc_animate_create,\r\n\r\n\t\tc_cc_get_key,\r\n\t\tc_cc_set_key,\r\n\t\tc_cc_add_cache,\r\n\t\tc_cc_rand,\r\n\t\tc_cc_set_design_size,\r\n\t\tc_cc_set_display_state,\r\n\t\tc_cc_jump_scene,\r\n\t\tc_cc_touch_call,\r\n\r\n\t\tc_cc_sprite_create,\r\n\t\tc_cc_bmf_create,\r\n\t\tc_cc_bmf_set,\r\n\t\tc_cc_get_size,\r\n\t\tc_cc_set_tag,\r\n\t\tc_cc_get_tag,\r\n\t\tc_cc_add_child,\r\n\t\tc_cc_remove_from_parent,\r\n\t\tc_cc_set_pos,\r\n\t\tc_cc_get_pos,\r\n\t\tc_cc_set_scale,\r\n\t\tc_cc_run_ac,\r\n\t\tc_cc_stop_ac,\r\n\t\tc_cc_schedule,\r\n\r\n\t\tc_cc_ac_move_to,\r\n\t\tc_cc_ac_move_by,\r\n\t\tc_cc_ac_rotate_to,\r\n\t\tc_cc_ac_rotate_by,\r\n\t\tc_cc_ac_scale_to,\r\n\t\tc_cc_ac_scale_by,\r\n\t\tc_cc_ac_delay,\r\n\t\tc_cc_ac_repeat,\r\n\t\tc_cc_ac_repeat_times,\r\n\t\tc_cc_ac_sequence,\r\n\t\tc_cc_ac_spawn,\r\n\t\tc_cc_ac_call,\r\n\t\tc_cc_ac_ease_in,\r\n\t\tc_cc_ac_ease_out,\r\n\t\tc_cc_ac_elastic_in,\r\n\t\tc_cc_ac_elastic_out,\r\n\r\n\t\tc_cc_phy_apply_impulse,\r\n\t\tc_cc_phy_get_body,\r\n\t\tc_cc_phy_set_body,\r\n\t\tc_cc_phy_box,\r\n\t\tc_cc_phy_box_edge,\r\n\t\tc_cc_phy_call,\r\n\r\n\t\tc_cc_label_create,\r\n\t\tc_cc_set_color,\r\n\t};\r\n};\r\n\r\nstruct tfile;\r\n\r\nstruct tpos\r\n{\r\n\ttfile* file;\r\n\tint line;\r\n\r\n\ttpos()\r\n\t{\r\n\t\tclear();\r\n\t}\r\n\r\n\tvoid clear()\r\n\t{\r\n\t\tfile=null;\r\n\t\tline=0;\r\n\t}\r\n\r\n\trbool empty()\r\n\t{\r\n\t\treturn file==null;\r\n\t}\r\n\r\n\tfriend rbool operator==(const tpos& a,const tpos& b)\r\n\t{\r\n\t\treturn a.file==b.file&&a.line==b.line;\r\n\t}\r\n\r\n\tfriend rbool operator!=(const tpos& a,const tpos& b)\r\n\t{\r\n\t\treturn a.file!=b.file||a.line!=b.line;\r\n\t}\r\n\r\n\tvoid printl()\r\n\t{\r\n\t\trstr((uint)file).printl();\r\n\t\trstr(line).printl();\r\n\t}\r\n};\r\n\r\nstruct tfunc;\r\n\r\nstruct tasm\r\n{\r\n\ttins ins;//tins放在最前面便于把指针转换为tasm*\r\n\trbuf<rstr> vstr;\r\n\ttpos pos;\r\n\ttfunc* ptfi;//反射到tfunc，不用初始化\r\n\tuchar* start;//jit地址\r\n\r\n\ttasm()\r\n\t{\r\n\t\tclear();\r\n\t}\r\n\r\n\ttasm(tasm&& a)\r\n\t{\r\n\t\tins=a.ins;\r\n\t\tvstr=a.vstr;\r\n\t\tpos=a.pos;\r\n\t\tptfi=a.ptfi;\r\n\t\tstart=a.start;\r\n\t}\r\n\r\n\tvoid operator=(tasm&& a)\r\n\t{\r\n\t\tins=a.ins;\r\n\t\tvstr=a.vstr;\r\n\t\tpos=a.pos;\r\n\t\tptfi=a.ptfi;\r\n\t\tstart=a.start;\r\n\t}\r\n\r\n\tvoid clear()\r\n\t{\r\n\t\tins.clear();\r\n\t\tvstr.clear();\r\n\t\tpos.clear();\r\n\t\tptfi=null;\r\n\t\tstart=null;\r\n\t}\r\n\r\n\tvoid print()\r\n\t{\r\n\t\tvstr.print();\r\n\t}\r\n};\r\n\r\n//优化节点\r\nstruct top_node\r\n{\r\n\trbuf<tasm> src;\r\n\trbuf<tasm> dst;\r\n\r\n\tvoid clear()\r\n\t{\r\n\t\tsrc.clear();\r\n\t\tdst.clear();\r\n\t}\r\n};\r\n\r\n#endif\r\n"
  },
  {
    "path": "rpp/zadd.h",
    "content": "﻿#ifndef zadd_h__\r\n#define zadd_h__\r\n\r\n#include \"zcontrol.h\"\r\n\r\n//增加局部变量和成员变量构造及析构\r\nstruct zadd\r\n{\r\n\tstatic void add_local_and_memb(tsh& sh,tfunc& tfi)\r\n\t{\r\n\t\ttclass& tci=*tfi.ptci;\r\n\t\t//增加局部变量构造和析构\r\n\t\t//注意增加的这些语句type为空\r\n\t\ttsent temp=add_local_init(sh,tfi);\r\n\t\tif(!temp.empty())\r\n\t\t\ttfi.vsent.push_front(temp);\r\n\t\ttemp=add_local_free(sh,tfi);\r\n\t\tif(!temp.empty())\r\n\t\t\ttfi.vsent.push(temp);\r\n\t\tzcontrol::part_vsent(tfi);\r\n\t\tif(rppconf(c_auto_addinit))\r\n\t\t{\r\n\t\t\tif(tci.name==rppkey(c_main)&&tfi.name==rppkey(c_main))\r\n\t\t\t{\r\n\t\t\t\tadd_member_struct(sh,tfi);\t\r\n\t\t\t\tadd_member_destruct(sh,tfi);//全局变量在main中构造和析构\r\n\t\t\t}\r\n\t\t\telif(tfi.name==tci.name&&\r\n\t\t\t\ttfi.retval.type==rppkey(c_void)&&\r\n\t\t\t\t!tfi.is_friend)\r\n\t\t\t{\r\n\t\t\t\tadd_member_struct(sh,tfi);\t\r\n\t\t\t}\r\n\t\t\telif(zfind::is_destruct(sh,tfi))\r\n\t\t\t{\r\n\t\t\t\tadd_member_destruct(sh,tfi);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tstatic tsent add_local_free(tsh& sh,tfunc& tfi)\r\n\t{\r\n\t\ttsent sent;\r\n\t\tsent.pos=tfi.last_pos;\r\n\t\tfor(int i=0;i<tfi.param.count();i++)\r\n\t\t\tadd_destructor_func(sh,tfi.param[i],sent.vword);\r\n\t\tfor(int i=0;i<tfi.local.count();i++)\r\n\t\t\tadd_destructor_func(sh,tfi.local[i],sent.vword);\r\n\t\treturn r_move(sent);\r\n\t}\r\n\r\n\tstatic tsent add_local_init(tsh& sh,tfunc& tfi)\r\n\t{\r\n\t\ttsent sent;\r\n\t\tsent.pos=tfi.first_pos;\r\n\t\tfor(int i=0;i<tfi.local.count();i++)\r\n\t\t\tadd_structor_func(sh,tfi.local[i],sent.vword);\r\n\t\treturn r_move(sent);\r\n\t}\r\n\r\n\tstatic void add_structor_func(tsh& sh,tdata& tdi,rbuf<tword>& v)\r\n\t{\r\n\t\tif(sh.is_quote(tdi.type))\r\n\t\t\treturn;\r\n\t\tif(rppconf(c_op_empty_func)&&zfind::is_empty_struct_type(sh,tdi.type))\r\n\t\t\treturn;\r\n\t\tv+=rppoptr(c_mbk_l);\r\n\t\tv+=tdi.type;\r\n\t\tv+=rppoptr(c_comma);\r\n\t\tv+=tdi.type;\r\n\t\tv+=rppoptr(c_comma);\r\n\t\tv+=rppoptr(c_mbk_l);\r\n\t\tv+=tdi.name;\r\n\t\tv+=rppoptr(c_mbk_r);\r\n\t\tv+=rppoptr(c_mbk_r);\r\n\t\tv+=rppoptr(c_semi);\r\n\t}\r\n\r\n\tstatic void add_destructor_func(tsh& sh,tdata& tdi,rbuf<tword>& v)\r\n\t{\r\n\t\tif(sh.is_quote(tdi.type))\r\n\t\t\treturn;\r\n\t\tif(rppconf(c_op_empty_func)&&zfind::is_empty_struct_type(sh,tdi.type))\r\n\t\t\treturn;\r\n\t\tv+=rppoptr(c_mbk_l);\r\n\t\tv+=tdi.type;\r\n\t\tv+=rppoptr(c_comma);\r\n\t\tv+=rppoptr(c_destruct)+tdi.type;\r\n\t\tv+=rppoptr(c_comma);\r\n\t\tv+=rppoptr(c_mbk_l);\r\n\t\tv+=tdi.name;\r\n\t\tv+=rppoptr(c_mbk_r);\r\n\t\tv+=rppoptr(c_mbk_r);\r\n\t\tv+=rppoptr(c_semi);\r\n\t}\r\n\r\n\tstatic void add_structor_func_m(tsh& sh,tdata& tdi,rbuf<tword>& v)\r\n\t{\r\n\t\tif(sh.is_quote(tdi.type))\r\n\t\t\treturn;\r\n\t\tif(tdi.param.empty()&&rppconf(c_op_empty_func)&&\r\n\t\t\tzfind::is_empty_struct_type(sh,tdi.type))\r\n\t\t\treturn;\r\n\t\tv.push(tword(tdi.type));\r\n\t\tv.push(tword(rppoptr(c_dot)));\r\n\t\tv.push(tword(tdi.type));\r\n\t\tv.push(tword(rppoptr(c_sbk_l)));\r\n\t\tv.push(tword(tdi.name));\r\n\t\tif(!tdi.param.empty())\r\n\t\t{\r\n\t\t\tv.push(tword(rppoptr(c_comma)));\r\n\t\t\tv+=tdi.param;\r\n\t\t}\r\n\t\tv.push(tword(rppoptr(c_sbk_r)));\r\n\t\tv.push(tword(rppoptr(c_semi)));\r\n\t}\r\n\r\n\tstatic void add_member_destruct(tsh& sh,tfunc& tfi)\r\n\t{\r\n\t\ttclass& tci=*tfi.ptci;\r\n\t\ttsent sent;\r\n\t\tsent.pos=tfi.last_pos;\r\n\t\tsent.type=rppkey(c_void);\r\n\t\tfor(int i=tci.vdata.count()-1;i>=0;i--)\r\n\t\t{\r\n\t\t\tif(sh.is_quote(tci.vdata[i].type))\r\n\t\t\t\tcontinue;\r\n\t\t\ttclass* ptci=zfind::class_search(sh,tci.vdata[i].type);\r\n\t\t\tif(null==ptci)\r\n\t\t\t\tcontinue;\r\n\t\t\tif(zfind::destruct_search(*ptci)==null)\r\n\t\t\t\tcontinue;\r\n\t\t\tadd_destructor_func(sh,tci.vdata[i],sent.vword);\r\n\t\t}\r\n\t\tif(!sent.vword.empty())\r\n\t\t{\r\n\t\t\ttfi.vsent.push_move(sent);\r\n\t\t\tzcontrol::part_vsent(tfi.vsent);\r\n\t\t}\r\n\t}\r\n\r\n\tstatic void add_member_struct(tsh& sh,tfunc& tfi)\r\n\t{\r\n\t\ttclass& tci=*tfi.ptci;\r\n\t\ttsent sent;\r\n\t\tsent.type=rppkey(c_void);\r\n\t\tfor(int i=0;i<tci.vdata.count();i++)\r\n\t\t{\r\n\t\t\tif(sh.is_quote(tci.vdata[i].type))\r\n\t\t\t\tcontinue;\r\n\t\t\ttclass* ptci=zfind::class_search(sh,tci.vdata[i].type);\r\n\t\t\tif(null==ptci)\r\n\t\t\t\tcontinue;\r\n\t\t\tif(zfind::emptystruct_search(*ptci)==null)\r\n\t\t\t\tcontinue;\r\n\t\t\tadd_structor_func_m(sh,tci.vdata[i],sent.vword);\r\n\t\t}\r\n\t\tif(sent.vword.empty())\r\n\t\t\treturn;\r\n\t\tsent.pos=tfi.first_pos;\r\n\t\ttfi.vsent.push_front(r_move(sent));\r\n\t\tzcontrol::part_vsent(tfi.vsent);\r\n\t}\r\n};\r\n\r\n#endif\r\n"
  },
  {
    "path": "rpp/zasm.h",
    "content": "﻿#ifndef zasm_h__\r\n#define zasm_h__\r\n\r\n#include \"zopt.h\"\r\n\r\n//生成汇编代码\r\n//tfunc.vsent->vasm\r\n//返回指针或引用或int的表达式需要放入ebx中\r\n//指针或int的引用是对本身的值进行判断\r\n//其它类型的引用是对引用进行判断\r\nstruct zasm\r\n{\r\n\tstatic rbool proc_func(tsh& sh,tfunc& tfi)\r\n\t{\r\n\t\tfor(int i=0;i<tfi.vsent.count();i++)\r\n\t\t{\r\n\t\t\trbuf<tasm> vasm;\r\n\t\t\tif(!proc_ret(sh,tfi.vsent[i],vasm,tfi))\r\n\t\t\t{\r\n\t\t\t\tsh.error(tfi.vsent[i],\"build asm error\");\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\tif(rppconf(c_op_match))\r\n\t\t\t{\r\n\t\t\t\tzopt::op_match(sh,vasm);\r\n\t\t\t}\r\n\t\t\tif(rppconf(c_op_merge))\r\n\t\t\t\tzopt::op_add_sub(sh,vasm);\r\n\t\t\tfor(int j=0;j<vasm.count();j++)\r\n\t\t\t{\r\n\t\t\t\tvasm[j].pos=tfi.vsent[i].pos;\r\n\t\t\t}\r\n\t\t\ttfi.vasm+=vasm;\r\n\t\t}\r\n\t\tadd_asm_ebp(sh,tfi);\r\n\t\treturn true;\r\n\t}\r\n\r\n\tstatic void push_double(tsh& sh,rbuf<tasm>& vasm,double dval)\r\n\t{\r\n\t\tpush_asm(vasm,rppkey(c_push),rstr(*((uint*)&dval+1)));\r\n\t\tpush_asm(vasm,rppkey(c_push),rstr(*((uint*)&dval)));\r\n\t}\r\n\r\n\tstatic rbool add_asm_ebp(tsh& sh,tfunc& tfi)\r\n\t{\r\n\t\trbuf<tasm> vasm;\r\n\t\ttasm item;\r\n\t\titem.pos=tfi.first_pos;\r\n\t\tint size=zfind::get_func_local_size(tfi);\r\n\t\tifn(rppconf(c_op_zero)&&size==0)\r\n\t\t{\r\n\t\t\titem.vstr.clear();\r\n\t\t\titem.vstr.push(rppkey(c_sub));\r\n\t\t\titem.vstr.push(rppkey(c_esp));\r\n\t\t\titem.vstr.push(rppoptr(c_comma));\r\n\t\t\titem.vstr.push(rstr(size));\r\n\t\t\tvasm.push(item);\r\n\t\t}\r\n\t\trbool b_use_ebp=use_ebp(sh,tfi.vasm);\r\n\t\tif(b_use_ebp)\r\n\t\t{\r\n\t\t\titem.vstr.clear();\r\n\t\t\titem.vstr.push(rppkey(c_push));\r\n\t\t\titem.vstr.push(rppkey(c_ebp));\r\n\t\t\tvasm.push(item);\r\n\r\n\t\t\titem.vstr.clear();\r\n\t\t\titem.vstr.push(rppkey(c_mov));\r\n\t\t\titem.vstr.push(rppkey(c_ebp));\r\n\t\t\titem.vstr.push(rppoptr(c_comma));\r\n\t\t\titem.vstr.push(rppkey(c_esp));\r\n\t\t\tvasm.push(item);\r\n\t\t}\r\n\t\tif(tfi.is_cfunc)\r\n\t\t{\r\n\t\t\t//todo 如果ebx、esi、edi未修改则不用保护\r\n\t\t\titem.vstr.clear();\r\n\t\t\titem.vstr.push(rppkey(c_push));\r\n\t\t\titem.vstr.push(rppkey(c_ebx));\r\n\t\t\tvasm.push(item);\r\n\r\n\t\t\titem.vstr.clear();\r\n\t\t\titem.vstr.push(rppkey(c_push));\r\n\t\t\titem.vstr.push(rppkey(c_esi));\r\n\t\t\tvasm.push(item);\r\n\r\n\t\t\titem.vstr.clear();\r\n\t\t\titem.vstr.push(rppkey(c_push));\r\n\t\t\titem.vstr.push(rppkey(c_edi));\r\n\t\t\tvasm.push(item);\r\n\t\t}\r\n\t\tvasm+=tfi.vasm;\r\n\t\titem.pos=tfi.last_pos;\r\n\t\tif(tfi.is_cfunc)\r\n\t\t{\r\n\t\t\titem.vstr.clear();\r\n\t\t\titem.vstr.push(rppkey(c_pop));\r\n\t\t\titem.vstr.push(rppkey(c_edi));\r\n\t\t\tvasm.push(item);\r\n\r\n\t\t\titem.vstr.clear();\r\n\t\t\titem.vstr.push(rppkey(c_pop));\r\n\t\t\titem.vstr.push(rppkey(c_esi));\r\n\t\t\tvasm.push(item);\r\n\r\n\t\t\titem.vstr.clear();\r\n\t\t\titem.vstr.push(rppkey(c_pop));\r\n\t\t\titem.vstr.push(rppkey(c_ebx));\r\n\t\t\tvasm.push(item);\r\n\t\t}\r\n\t\tif(b_use_ebp)\r\n\t\t{\r\n\t\t\titem.vstr.clear();\r\n\t\t\titem.vstr.push(rppkey(c_pop));\r\n\t\t\titem.vstr.push(rppkey(c_ebp));\r\n\t\t\tvasm.push(item);\r\n\t\t}\r\n\t\tifn(rppconf(c_op_zero)&&size==0)\r\n\t\t{\r\n\t\t\titem.vstr.clear();\r\n\t\t\titem.vstr.push(rppkey(c_add));\r\n\t\t\titem.vstr.push(rppkey(c_esp));\r\n\t\t\titem.vstr.push(rppoptr(c_comma));\r\n\t\t\titem.vstr.push(rstr(size));\r\n\t\t\tvasm.push(item);\r\n\t\t}\r\n\t\tsize=zfind::get_func_param_size(tfi);\r\n\t\tif(size>0)\r\n\t\t{\r\n\t\t\titem.vstr.clear();\r\n\t\t\titem.vstr.push(rppkey(c_reti));\r\n\t\t\titem.vstr.push(rstr(size));\r\n\t\t\tvasm.push(item);\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\titem.vstr.clear();\r\n\t\t\titem.vstr.push(rppkey(c_retn));\r\n\t\t\tvasm.push(item);\r\n\t\t}\r\n\t\ttfi.vasm=r_move(vasm);\r\n\t\treturn true;\r\n\t}\r\n\r\n\tstatic rbool use_ebp(tsh& sh,rbuf<tasm>& vasm)\r\n\t{\r\n\t\tif(!rppconf(c_op_ebp))\r\n\t\t\treturn true;\r\n\t\tfor(int i=0;i<vasm.count();i++)\r\n\t\t\tfor(int j=0;j<vasm[i].vstr.count();j++)\r\n\t\t\t\tif(vasm[i].vstr[j]==rppkey(c_ebp))\r\n\t\t\t\t\treturn true;\r\n\t\treturn false;\r\n\t}\r\n\r\n\tstatic rbool proc_ret(tsh& sh,tsent& src,rbuf<tasm>& vasm,\r\n\t\ttfunc& tfi,int level=0)\r\n\t{\r\n\t\trstr name=src.vword.get_bottom().val;\r\n\t\tif(sh.m_key.is_asm_ins(name))\r\n\t\t{\r\n\t\t\tpush_asm(vasm,sh.vword_to_vstr(src.vword));\r\n\t\t\treturn true;\r\n\t\t}\r\n\t\t//返回常量\r\n\t\tif(src.vword.count()==1)\r\n\t\t{\r\n\t\t\tif(src.vword[0].is_cint())\r\n\t\t\t{\r\n\t\t\t\t//经测试如果是小程序rppkey(c_mov)比\"mov\"效率高\r\n\t\t\t\tpush_asm(vasm,rppkey(c_mov),rppkey(c_ebx),\r\n\t\t\t\t\trppoptr(c_comma),src.vword[0].val);\r\n\t\t\t\treturn true;\r\n\t\t\t}\r\n\t\t\telif(sh.m_key.is_asm_reg(src.vword[0].val))\r\n\t\t\t{\r\n\t\t\t\tpush_asm(vasm,rppkey(c_mov),rppkey(c_ebx),\r\n\t\t\t\t\trppoptr(c_comma),src.vword[0].val);\r\n\t\t\t\treturn true;\r\n\t\t\t}\r\n\t\t\telif(src.vword[0].is_cpoint())\r\n\t\t\t{\r\n\t\t\t\tif(src.vword[0].is_caddr())\r\n\t\t\t\t{\r\n\t\t\t\t\tpush_asm(vasm,rppkey(c_mov),\r\n\t\t\t\t\t\trppkey(c_ebx),rppoptr(c_comma),\r\n\t\t\t\t\t\tsrc.vword[0].val);\r\n\t\t\t\t}\r\n\t\t\t\telse\r\n\t\t\t\t{\r\n\t\t\t\t\tpush_asm(vasm,rppkey(c_mov),\r\n\t\t\t\t\t\trppkey(c_ebx),rppoptr(c_comma),\r\n\t\t\t\t\t\tget_int(src.vword[0].val));\r\n\t\t\t\t}\r\n\t\t\t\treturn true;\r\n\t\t\t}\r\n\t\t}\r\n\t\tif(src.vword.count()==7&&src.vword[1].val==rppoptr(c_addr))\r\n\t\t{\r\n\t\t\tpush_asm(vasm,rppkey(c_mov),rppkey(c_ebx),rppoptr(c_comma),\r\n\t\t\t\trppoptr(c_mbk_l),rppoptr(c_addr),rppoptr(c_comma),\r\n\t\t\t\tsrc.vword[3].val,rppoptr(c_comma),src.vword[5].val,\r\n\t\t\t\trppoptr(c_mbk_r));\r\n\t\t\treturn true;\r\n\t\t}\r\n\t\t//返回变量\r\n\t\ttdata* ptdi=zfind::local_search(tfi,\r\n\t\t\tget_src_in(sh,src).vword.get(0).val);\r\n\t\tif(ptdi!=null)\r\n\t\t{\r\n\t\t\tif(zfind::is_type_mebx(sh,src.type))\r\n\t\t\t{\r\n\t\t\t\tpush_asm(vasm,rppkey(c_lea),rppkey(c_esi),\r\n\t\t\t\t\trppoptr(c_comma),rppoptr(c_mbk_l),\r\n\t\t\t\t\trppkey(c_ebp),rppoptr(c_plus),\r\n\t\t\t\t\trstr(ptdi->off),rppoptr(c_mbk_r));\r\n\t\t\t\t//这里还可以优化\r\n\t\t\t\tif(!add_esi(sh,ptdi->type,vasm,src))\r\n\t\t\t\t\treturn false;\r\n\t\t\t\tpush_asm(vasm,rppkey(c_mov),rppkey(c_ebx),\r\n\t\t\t\t\trppoptr(c_comma),rppoptr(c_mbk_l),\r\n\t\t\t\t\trppkey(c_esi),rppoptr(c_mbk_r));\r\n\t\t\t\tif(sh.is_quote(src.type)&&\r\n\t\t\t\t\t(sh.get_tname(src.type)==rppkey(c_int)||\r\n\t\t\t\t\tsh.is_point(sh.get_tname(src.type))))\r\n\t\t\t\t{\r\n\t\t\t\t\tpush_asm(vasm,rppkey(c_mov),rppkey(c_ebx),\r\n\t\t\t\t\t\trppoptr(c_comma),rppoptr(c_mbk_l),\r\n\t\t\t\t\t\trppkey(c_ebx),rppoptr(c_mbk_r));\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\treturn true;\r\n\t\t}\r\n\t\t//返回函数\r\n\t\treturn proc_ret_func(sh,src,vasm,tfi,level);\r\n\t}\r\n\r\n\tstatic rbool proc_ret_func(tsh& sh,tsent& src,rbuf<tasm>& vasm,\r\n\t\ttfunc& tfi,int level)\r\n\t{\r\n\t\ttdata retval;\r\n\t\tif(!a_exp(sh,get_src_in(sh,src),vasm,retval,tfi,level))\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\tint size;\r\n\t\t//多数函数返回void，因此加上这句判断可以提高效率\r\n\t\tif(src.type!=rppkey(c_void)&&zfind::is_type_mebx(sh,src.type))\r\n\t\t{\r\n\t\t\tpush_asm(vasm,rppkey(c_mov),rppkey(c_esi),\r\n\t\t\t\trppoptr(c_comma),rppkey(c_esp));\r\n\t\t\tint cur=vasm.count();\r\n\t\t\tif(!add_esi(sh,retval.type,vasm,src))\r\n\t\t\t\treturn false;\r\n\t\t\tif(cur==vasm.count())\r\n\t\t\t{\r\n\t\t\t\tvasm.pop();\r\n\t\t\t\tpush_asm(vasm,rppkey(c_mov),rppkey(c_ebx),\r\n\t\t\t\t\trppoptr(c_comma),rppoptr(c_mbk_l),\r\n\t\t\t\t\trppkey(c_esp),rppoptr(c_mbk_r));\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\tpush_asm(vasm,rppkey(c_mov),rppkey(c_ebx),\r\n\t\t\t\t\trppoptr(c_comma),rppoptr(c_mbk_l),\r\n\t\t\t\t\trppkey(c_esi),rppoptr(c_mbk_r));\r\n\t\t\t}\r\n\t\t\tif(sh.is_quote(src.type)&&\r\n\t\t\t\t(sh.get_tname(src.type)==rppkey(c_int)||\r\n\t\t\t\tsh.is_point(sh.get_tname(src.type))))\r\n\t\t\t{\r\n\t\t\t\tpush_asm(vasm,rppkey(c_mov),rppkey(c_ebx),\r\n\t\t\t\t\trppoptr(c_comma),rppoptr(c_mbk_l),\r\n\t\t\t\t\trppkey(c_ebx),rppoptr(c_mbk_r));\r\n\t\t\t}\r\n\t\t}\r\n\t\tif(!destruct_ret(sh,retval,vasm))\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\tsize=zfind::get_ceil_space(retval);\r\n\t\tpush_asm(vasm,rppkey(c_add),rppkey(c_esp),rppoptr(c_comma),size);\r\n\t\treturn true;\r\n\t}\r\n\t\r\n\t//解析表达式生成汇编代码\r\n\tstatic rbool a_exp(tsh& sh,const tsent& src,rbuf<tasm>& vasm,tdata& retval,\r\n\t\ttfunc& tfi,int level=0)\r\n\t{\r\n\t\tif(level>c_rpp_deep)\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\tlevel++;\r\n\t\tif(src.vword.get_bottom().val!=rppoptr(c_mbk_l)||\r\n\t\t\tsrc.vword.get_top().val!=rppoptr(c_mbk_r))\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\tif(src.vword.get(1).val==rppoptr(c_dot))\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\tint size;\r\n\t\trbuf<rbuf<tword> > vlisp;\r\n\t\tzexp::get_vlisp(sh,src.vword,vlisp);\r\n\t\tif(src.vword.get(1).val==rppkey(c_pcall))\r\n\t\t{\r\n\t\t\tif(vlisp.count()!=4)\r\n\t\t\t{\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\tretval.type=vlisp[1].get(0).val;\r\n\t\t\tretval.size=zfind::get_type_size(sh,retval.type);\r\n\t\t\tsize=zfind::get_ceil_space(retval);\r\n\t\t\tpush_asm(vasm,rppkey(c_sub),rppkey(c_esp),\r\n\t\t\t\trppoptr(c_comma),size);\r\n\t\t\trbuf<rbuf<tword> > temp_v;\r\n\t\t\tzexp::get_vlisp(sh,vlisp[3],temp_v);\r\n\t\t\trbuf<tsent> vsent;\r\n\t\t\tzexp::get_vsent(temp_v,vsent,src);\r\n\t\t\tfor(int i=vsent.count()-1;i>=0;i--)\r\n\t\t\t{\r\n\t\t\t\tif(!zexp::p_exp(sh,vsent[i],tfi,level,tenv()))\r\n\t\t\t\t{\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tfor(int i=vsent.count()-1;i>=0;i--)\r\n\t\t\t{\r\n\t\t\t\ttdata tdi;\r\n\t\t\t\ttdi.type=sh.get_tname(vsent[i].type);\r\n\t\t\t\ttdi.size=zfind::get_type_size(sh,tdi.type);\r\n\t\t\t\tif(!pass_param(sh,vsent[i],tdi,vasm,tfi,level))\r\n\t\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\ttsent sent=src;\r\n\t\t\tsent.vword=vlisp[2];\r\n\t\t\tif(!zexp::p_exp(sh,sent,tfi,level,tenv()))\r\n\t\t\t{\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\tif(!proc_ret(sh,sent,vasm,tfi,level))\r\n\t\t\t\treturn false;\r\n\t\t\tif(sent.type==rstr(\"rp<void>\"))\r\n\t\t\t{\r\n\t\t\t\tpush_asm(vasm,rppkey(c_call),rppkey(c_ebx));\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t\treturn false;\r\n\t\t\treturn true;\r\n\t\t}\r\n\t\tif(vlisp.count()!=3)\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\tzexp::get_vlisp(sh,vlisp[2],vlisp);\r\n\t\trbuf<tsent> vsent;\r\n\t\tzexp::get_vsent(vlisp,vsent,src);\r\n\t\tfor(int i=vsent.count()-1;i>=0;i--)\r\n\t\t{\r\n\t\t\tif(!zexp::p_exp(sh,vsent[i],tfi,level,tenv()))\r\n\t\t\t{\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t}\r\n\t\trstr cname=src.vword.get(1).val;\r\n\t\trstr fname=src.vword.get(3).val;//p_exp已经合并了name_dec\r\n\t\ttclass* ptci=zfind::class_search(sh,cname);\r\n\t\tif(null==ptci)\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\ttfunc* ptfi=zfind::func_search_dec(*ptci,fname);\r\n\t\tif(ptfi==null)\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\tretval=ptfi->retval;\r\n\t\tif(rppconf(c_op_empty_func)&&\r\n\t\t\tzfind::is_empty_struct_type(sh,ptci->name)&&\r\n\t\t\t(zfind::is_destruct(sh,*ptfi)||\r\n\t\t\tzfind::is_emptystruct(sh,*ptfi)))\r\n\t\t\treturn true;\r\n\t\tif(ptfi->param.count()!=vsent.count())\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\tsize=zfind::get_ceil_space(retval);\r\n\t\tpush_asm(vasm,rppkey(c_sub),rppkey(c_esp),rppoptr(c_comma),size);\r\n\t\tfor(int i=vsent.count()-1;i>=0;i--)\r\n\t\t{\r\n\t\t\tif(!pass_param(sh,vsent[i],ptfi->param[i],vasm,tfi,level))\r\n\t\t\t{\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t}\r\n\t\tpush_asm(vasm,sh.get_func_declare_call(sh,*ptci,*ptfi));\r\n\t\treturn true;\r\n\t}\r\n\r\n\tstatic rbool pass_param(tsh& sh,tsent& src,tdata& dst,rbuf<tasm>& vasm,\r\n\t\ttfunc& tfi,int level)\r\n\t{\r\n\t\tif(src.vword.empty())\r\n\t\t\treturn false;\r\n\t\tint size;\r\n\t\ttsent src_in=get_src_in(sh,src);\r\n\t\tif(src_in.vword.get(1).val==rppkey(c_pcall)||\r\n\t\t\tzfind::is_class(sh,src_in.vword.get(1).val))\r\n\t\t{\r\n\t\t\t//先申请参数空间\r\n\t\t\tsize=zfind::get_ceil_space(dst);\r\n\t\t\tpush_asm(vasm,rppkey(c_sub),rppkey(c_esp),\r\n\t\t\t\trppoptr(c_comma),size);\r\n\t\t\t//递归处理子表达式\r\n\t\t\ttdata retval;\r\n\t\t\tif(!a_exp(sh,src_in,vasm,retval,tfi,level))\r\n\t\t\t\treturn false;\r\n\t\t\t//获取传递参数的地址分别放入esi和edi中，\r\n\t\t\t//包括函数返回后再dot，如int.get().m_in\r\n\t\t\tif(!obtain_var_addr_f(sh,retval,src,vasm))\r\n\t\t\t\treturn false;\r\n\t\t\t//传递参数\r\n\t\t\tif(!copy_param(sh,src.type,dst.type,vasm))\r\n\t\t\t\treturn false;\r\n\t\t\t//析构返回值\r\n\t\t\tif(!destruct_ret(sh,retval,vasm))\r\n\t\t\t{\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\t//释放栈\r\n\t\t\tsize=zfind::get_ceil_space(retval);\r\n\t\t\tpush_asm(vasm,rppkey(c_add),rppkey(c_esp),\r\n\t\t\t\trppoptr(c_comma),size);\r\n\t\t}\r\n\t\telif(src.vword[0].is_cint())\r\n\t\t{\r\n\t\t\tpush_asm(vasm,rppkey(c_push),src.vword[0].val);\r\n\t\t}\r\n\t\telif(src.vword[0].is_cuint())\r\n\t\t{\r\n\t\t\tpush_asm(vasm,rppkey(c_push),get_int(src.vword[0].val));\r\n\t\t}\r\n\t\telif(src.vword[0].is_cdouble())\r\n\t\t{\r\n\t\t\tdouble dval=src.vword[0].val.todouble();\r\n\t\t\tpush_double(sh,vasm,dval);\r\n\t\t}\r\n\t\telif(src.vword.count()==7&&\r\n\t\t\tsrc.vword.get(1).val==rppoptr(c_addr)&&\r\n\t\t\tsrc.vword[0].val==rppoptr(c_mbk_l))\r\n\t\t{\r\n\t\t\trbuf<rstr> vtemp=sh.vword_to_vstr(src.vword);\r\n\t\t\tvtemp.push_front(rppkey(c_push));\r\n\t\t\tpush_asm(vasm,vtemp);\r\n\t\t}\r\n\t\telif(src.vword[0].is_cpoint())\r\n\t\t{\r\n\t\t\tif(src.vword.get_bottom().is_caddr())\r\n\t\t\t\tpush_asm(vasm,rppkey(c_push),src.vword[0].val);\r\n\t\t\telse\r\n\t\t\t\tpush_asm(vasm,rppkey(c_push),get_int(src.vword[0].val));\r\n\t\t}\r\n\t\telif(src.vword[0].is_cstr())\r\n\t\t{\r\n\t\t\tpush_asm(vasm,rppkey(c_push),src.vword[0].val);\r\n\t\t}\r\n\t\telif(sh.m_key.is_asm_reg(src.vword[0].val))\r\n\t\t{\r\n\t\t\tpush_asm(vasm,rppkey(c_push),src.vword[0].val);\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\trstr name=src_in.vword.get(0).val;\r\n\t\t\ttdata* ptdi=zfind::local_search(tfi,name);\r\n\t\t\tif(ptdi==null)\r\n\t\t\t\treturn false;\r\n\t\t\tint cur=vasm.count()+3;\r\n\t\t\tif(!obtain_var_addr_var(sh,src,dst,ptdi,vasm))\r\n\t\t\t\treturn false;\r\n\t\t\tif(cur==vasm.count()&&rppconf(c_op_pass))\r\n\t\t\t{\r\n\t\t\t\tif(zfind::is_op_pass_type(sh,dst.type)&&\r\n\t\t\t\t\tdst.type==src.type)\r\n\t\t\t\t{\r\n\t\t\t\t\tvasm.m_count-=3;\r\n\t\t\t\t\tpush_asm(vasm,rppkey(c_push),rppoptr(c_mbk_l),\r\n\t\t\t\t\t\trppkey(c_ebp),rppoptr(c_plus),\r\n\t\t\t\t\t\trstr(ptdi->off),rppoptr(c_mbk_r));\r\n\t\t\t\t\treturn true;\r\n\t\t\t\t}\r\n\t\t\t\tif(sh.is_quote(dst.type)&&sh.is_quote(src.type))\r\n\t\t\t\t{\r\n\t\t\t\t\tvasm.m_count-=3;\r\n\t\t\t\t\tpush_asm(vasm,rppkey(c_push),rppoptr(c_mbk_l),\r\n\t\t\t\t\t\trppkey(c_ebp),rppoptr(c_plus),\r\n\t\t\t\t\t\trstr(ptdi->off),rppoptr(c_mbk_r));\r\n\t\t\t\t\treturn true;\r\n\t\t\t\t}\r\n\t\t\t\tif(sh.is_quote(dst.type))\r\n\t\t\t\t{\r\n\t\t\t\t\tvasm.m_count-=3;\r\n\t\t\t\t\tpush_asm(vasm,rppkey(c_lea),rppkey(c_esi),\r\n\t\t\t\t\t\trppoptr(c_comma),rppoptr(c_mbk_l),\r\n\t\t\t\t\t\trppkey(c_ebp),rppoptr(c_plus),\r\n\t\t\t\t\t\trstr(ptdi->off),rppoptr(c_mbk_r));\r\n\t\t\t\t\tpush_asm(vasm,rppkey(c_push),rppkey(c_esi));\r\n\t\t\t\t\treturn true;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\t//调用拷贝构造函数时还可以优化\r\n\t\t\tif(!copy_param(sh,src.type,dst.type,vasm))\r\n\t\t\t\treturn false;\r\n\t\t\treturn true;\r\n\t\t}\r\n\t\treturn true;\r\n\t}\r\n\r\n\tstatic rbool obtain_var_addr_var(tsh& sh,tsent& src,tdata& dst,\r\n\t\ttdata* ptdi,rbuf<tasm>& vasm)\r\n\t{\r\n\t\tint size=zfind::get_ceil_space(dst);\r\n\t\tpush_asm(vasm,rppkey(c_sub),rppkey(c_esp),rppoptr(c_comma),size);\r\n\t\tpush_asm(vasm,rppkey(c_mov),rppkey(c_edi),rppoptr(c_comma),\r\n\t\t\trppkey(c_esp));\r\n\t\tpush_asm(vasm,rppkey(c_lea),rppkey(c_esi),rppoptr(c_comma),\r\n\t\t\trppoptr(c_mbk_l),rppkey(c_ebp),rppoptr(c_plus),\r\n\t\t\trstr(ptdi->off),rppoptr(c_mbk_r));\r\n\t\tif(!add_esi(sh,ptdi->type,vasm,src))\r\n\t\t\treturn false;\r\n\t\treturn true;\r\n\t}\r\n\r\n\tstatic rbool obtain_var_addr_f(tsh& sh,tdata& retval,\r\n\t\ttsent& src,rbuf<tasm>& vasm)\r\n\t{\r\n\t\tint size=zfind::get_ceil_space(retval);\r\n\t\tpush_asm(vasm,rppkey(c_lea),rppkey(c_edi),rppoptr(c_comma),\r\n\t\t\trppoptr(c_mbk_l),rppkey(c_esp),rppoptr(c_plus),\r\n\t\t\trstr(size),rppoptr(c_mbk_r));\r\n\t\tpush_asm(vasm,rppkey(c_mov),rppkey(c_esi),rppoptr(c_comma),\r\n\t\t\trppkey(c_esp));\r\n\t\tif(!add_esi(sh,retval.type,vasm,src))\r\n\t\t\treturn false;\r\n\t\treturn true;\r\n\t}\r\n\r\n\tstatic tsent get_src_in(tsh& sh,tsent& src)\r\n\t{\r\n\t\tif(src.vword.get(1).val!=rppoptr(c_dot))\r\n\t\t{\r\n\t\t\treturn src;\r\n\t\t}\r\n\t\ttsent temp=src;\r\n\t\tint start=0;\r\n\t\trbuf<tword>& v=src.vword;\r\n\t\twhile(start+2<v.count()&&\r\n\t\t\t  v[start].val==rppoptr(c_mbk_l)&&\r\n\t\t\t  v[start+1].val==rppoptr(c_dot))\r\n\t\t{\r\n\t\t\tstart+=3;\r\n\t\t}\r\n\t\tif(v[start].val==rppoptr(c_mbk_l))\r\n\t\t{\r\n\t\t\tint right=sh.find_symm_mbk(v,start);\r\n\t\t\ttemp.vword=v.sub(start,right+1);\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\ttemp.vword=v.sub(start,start+1);\r\n\t\t}\r\n\t\treturn r_move(temp);\r\n\t}\r\n\t\r\n\t// [ . , [ . , [ . , a , b ] , c ] , d ]\r\n\tstatic rbool add_esi(tsh& sh,rstr type,rbuf<tasm>& vasm,tsent& src)\r\n\t{\r\n\t\tint start=0;\r\n\t\trbuf<tword>& v=src.vword;\r\n\t\tif(v.get(1).val!=rppoptr(c_dot))\r\n\t\t{\r\n\t\t\treturn true;\r\n\t\t}\r\n\t\twhile(start+2<v.count()&&\r\n\t\t\tv[start].val==rppoptr(c_mbk_l)&&\r\n\t\t\tv[start+1].val==rppoptr(c_dot))\r\n\t\t{\r\n\t\t\tstart+=3;\r\n\t\t}\r\n\t\tint right=start+2;\r\n\t\tif(v[start].val==rppoptr(c_mbk_l))\r\n\t\t{\r\n\t\t\tright=sh.find_symm_mbk(v,start);\r\n\t\t\tif(right>=v.count())\r\n\t\t\t{\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\tright+=2;\r\n\t\t}\r\n\t\tfor(int i=0;i<start;i+=3)\r\n\t\t{\r\n\t\t\ttclass* ptci=zfind::class_search_t(sh,type);\r\n\t\t\tif(null==ptci)\r\n\t\t\t{\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\ttdata* ptdi=zfind::data_member_search(*ptci,v.get(right).val);\r\n\t\t\tif(null==ptdi)\r\n\t\t\t{\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\tif(sh.is_quote(type))\r\n\t\t\t\tpush_asm(vasm,rppkey(c_mov),rppkey(c_esi),\r\n\t\t\t\t\trppoptr(c_comma),rppoptr(c_mbk_l),\r\n\t\t\t\t\trppkey(c_esi),rppoptr(c_mbk_r));\r\n\t\t\tif(ptdi->off!=0)\r\n\t\t\t{\r\n\t\t\t\tpush_asm(vasm,rppkey(c_add),rppkey(c_esi),\r\n\t\t\t\t\trppoptr(c_comma),ptdi->off);\r\n\t\t\t}\r\n\t\t\ttype=ptdi->type;\r\n\t\t\tright+=3;\r\n\t\t}\r\n\t\treturn true;\r\n\t}\r\n\r\n\t//src的真实地址已经存储在esi中,dst的地址在edi中\r\n\tstatic rbool copy_param(tsh& sh,const rstr& src,\r\n\t\tconst rstr& dst,rbuf<tasm>& vasm)\r\n\t{\r\n\t\t//指针可以随意转换\r\n\t\tif(sh.is_point(dst)&&sh.is_point(src)||\r\n\t\t\tdst==rppkey(c_rd4)&&zfind::get_type_size(sh,src)==4||\r\n\t\t\tdst==rppkey(c_rcs)&&sh.is_point(src))\r\n\t\t{\r\n\t\t\tpush_asm(vasm,rppkey(c_mov),rppoptr(c_mbk_l),\r\n\t\t\t\trppkey(c_edi),rppoptr(c_mbk_r),\r\n\t\t\t\trppoptr(c_comma),rppoptr(c_mbk_l),\r\n\t\t\t\trppkey(c_esi),rppoptr(c_mbk_r));\r\n\t\t\treturn true;\r\n\t\t}\r\n\t\t//目标是引用\r\n\t\tif(sh.is_quote(dst))\r\n\t\t{\r\n\t\t\tif(sh.is_quote(src))\r\n\t\t\t{\r\n\t\t\t\t//源是引用\r\n\t\t\t\tpush_asm(vasm,rppkey(c_mov),rppoptr(c_mbk_l),\r\n\t\t\t\t\trppkey(c_edi),rppoptr(c_mbk_r),\r\n\t\t\t\t\trppoptr(c_comma),rppoptr(c_mbk_l),\r\n\t\t\t\t\trppkey(c_esi),rppoptr(c_mbk_r));\r\n\t\t\t}\t\t\t\t\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\t//源是对象\r\n\t\t\t\tpush_asm(vasm,rppkey(c_mov),rppoptr(c_mbk_l),\r\n\t\t\t\t\trppkey(c_edi),rppoptr(c_mbk_r),\r\n\t\t\t\t\trppoptr(c_comma),rppkey(c_esi));\r\n\t\t\t}\r\n\t\t\treturn true;\r\n\t\t}\r\n\t\tif(rppconf(c_op_pass))\r\n\t\t{\r\n\t\t\tif(zfind::is_op_pass_type(sh,dst))\r\n\t\t\t{\r\n\t\t\t\tif(sh.is_quote(src))\r\n\t\t\t\t{\r\n\t\t\t\t\t//源是引用\r\n\t\t\t\t\tpush_asm(vasm,rppkey(c_mov),rppkey(c_esi),\r\n\t\t\t\t\t\trppoptr(c_comma),rppoptr(c_mbk_l),\r\n\t\t\t\t\t\trppkey(c_esi),rppoptr(c_mbk_r));\r\n\t\t\t\t}\r\n\t\t\t\tpush_asm(vasm,rppkey(c_mov),rppoptr(c_mbk_l),\r\n\t\t\t\t\trppkey(c_edi),rppoptr(c_mbk_r),\r\n\t\t\t\t\trppoptr(c_comma),rppoptr(c_mbk_l),\r\n\t\t\t\t\trppkey(c_esi),rppoptr(c_mbk_r));\r\n\t\t\t\treturn true;\r\n\t\t\t}\r\n\t\t\tif(dst==rppkey(c_double)||dst==rppkey(c_int8))\r\n\t\t\t{\r\n\t\t\t\tif(sh.is_quote(src))\r\n\t\t\t\t{\r\n\t\t\t\t\tpush_asm(vasm,rppkey(c_mov),rppkey(c_esi),\r\n\t\t\t\t\t\trppoptr(c_comma),rppoptr(c_mbk_l),\r\n\t\t\t\t\t\trppkey(c_esi),rppoptr(c_mbk_r));\r\n\t\t\t\t}\r\n\t\t\t\tpush_asm(vasm,rppkey(c_mov),rppoptr(c_mbk_l),\r\n\t\t\t\t\trppkey(c_edi),rppoptr(c_mbk_r),\r\n\t\t\t\t\trppoptr(c_comma),rppoptr(c_mbk_l),\r\n\t\t\t\t\trppkey(c_esi),rppoptr(c_mbk_r));\r\n\t\t\t\tpush_asm(vasm,rppkey(c_mov),rppoptr(c_mbk_l),\r\n\t\t\t\t\trppkey(c_edi),rppoptr(c_plus),\"4\",\r\n\t\t\t\t\trppoptr(c_mbk_r),rppoptr(c_comma),\r\n\t\t\t\t\trppoptr(c_mbk_l),rppkey(c_esi),\r\n\t\t\t\t\trppoptr(c_plus),\"4\",rppoptr(c_mbk_r));\r\n\t\t\t\treturn true;\r\n\t\t\t}\r\n\t\t}\r\n\t\t//目标是对象需要调用拷贝构造函数\r\n\t\tif(sh.is_quote(src))\r\n\t\t{\r\n\t\t\t//源是引用\r\n\t\t\tpush_asm(vasm,rppkey(c_push),rppoptr(c_mbk_l),\r\n\t\t\t\trppkey(c_esi),rppoptr(c_mbk_r));\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\t//源是对象\r\n\t\t\tpush_asm(vasm,rppkey(c_push),rppkey(c_esi));\r\n\t\t}\r\n\t\tpush_asm(vasm,rppkey(c_push),rppkey(c_edi));\r\n\t\ttclass* ptci=zfind::class_search_t(sh,src);\r\n\t\tif(ptci==null)\r\n\t\t\treturn false;\r\n\t\ttfunc* pcopystruct=zfind::copystruct_search(*ptci);\r\n\t\tif(pcopystruct==null)\r\n\t\t\treturn false;\r\n\t\tpush_asm(vasm,sh.get_func_declare_call(sh,*ptci,*pcopystruct));\r\n\t\treturn true;\r\n\t}\r\n\r\n\tstatic rbool destruct_ret(tsh& sh,tdata& retval,rbuf<tasm>& vasm)\r\n\t{\r\n\t\trstr type=retval.type;\r\n\t\tif(sh.is_quote(type))\r\n\t\t\treturn true;\r\n\t\tif(type==rppkey(c_void))\r\n\t\t\treturn true;\r\n\t\ttclass* ptci=zfind::class_search(sh,type);\r\n\t\tif(ptci==null)\r\n\t\t\treturn false;\r\n\t\ttfunc* pdestruct=zfind::destruct_search(*ptci);\r\n\t\tif(pdestruct==null)\r\n\t\t\treturn false;\r\n\t\tif(rppconf(c_op_empty_func)&&zfind::is_empty_struct_type(sh,type))\r\n\t\t\treturn true;\r\n\t\tpush_asm(vasm,rppkey(c_mov),rppkey(c_esi),\r\n\t\t\trppoptr(c_comma),rppkey(c_esp));\r\n\t\tpush_asm(vasm,rppkey(c_push),rppkey(c_esi));\r\n\t\tpush_asm(vasm,sh.get_func_declare_call(sh,*ptci,*pdestruct));\r\n\t\treturn true;\r\n\t}\r\n\r\n\tstatic rstr get_int(rstr& s)\r\n\t{\r\n\t\treturn s.sub(0,s.count()-1);\r\n\t}\r\n\r\n\tstatic void push_asm(rbuf<tasm>& vasm,const rbuf<rstr>& vstr)\r\n\t{\r\n\t\ttasm item;\r\n\t\titem.vstr=vstr;\r\n\t\tvasm.push_move(item);\r\n\t}\r\n\r\n\t//todo 这里无法使用变参函数，可以使用变参宏或模板元简化代码\r\n\tstatic void push_asm(rbuf<tasm>& vasm,\r\n\t\tconst rstr& s1,const rstr& s2,const rstr& s3,const rstr& s4,\r\n\t\tconst rstr& s5,const rstr& s6,const rstr& s7,const rstr& s8,\r\n\t\tconst rstr& s9,const rstr& s10,const rstr& s11,const rstr& s12)\r\n\t{\r\n\t\ttasm item;\r\n\t\titem.vstr.push(s1);\r\n\t\titem.vstr.push(s2);\r\n\t\titem.vstr.push(s3);\r\n\t\titem.vstr.push(s4);\r\n\t\titem.vstr.push(s5);\r\n\t\titem.vstr.push(s6);\r\n\t\titem.vstr.push(s7);\r\n\t\titem.vstr.push(s8);\r\n\t\titem.vstr.push(s9);\r\n\t\titem.vstr.push(s10);\r\n\t\titem.vstr.push(s11);\r\n\t\titem.vstr.push(s12);\r\n\t\tvasm.push_move(item);\r\n\t}\r\n\r\n\tstatic void push_asm(rbuf<tasm>& vasm,\r\n\t\tconst rstr& s1,const rstr& s2,const rstr& s3,const rstr& s4,\r\n\t\tconst rstr& s5,const rstr& s6,const rstr& s7,const rstr& s8,\r\n\t\tconst rstr& s9,const rstr& s10)\r\n\t{\r\n\t\ttasm item;\r\n\t\titem.vstr.push(s1);\r\n\t\titem.vstr.push(s2);\r\n\t\titem.vstr.push(s3);\r\n\t\titem.vstr.push(s4);\r\n\t\titem.vstr.push(s5);\r\n\t\titem.vstr.push(s6);\r\n\t\titem.vstr.push(s7);\r\n\t\titem.vstr.push(s8);\r\n\t\titem.vstr.push(s9);\r\n\t\titem.vstr.push(s10);\r\n\t\tvasm.push_move(item);\r\n\t}\r\n\r\n\tstatic void push_asm(rbuf<tasm>& vasm,const rstr& s1,const rstr& s2,\r\n\t\tconst rstr& s3,const rstr& s4,const rstr& s5,const rstr& s6,\r\n\t\tconst rstr& s7,const rstr& s8)\r\n\t{\r\n\t\ttasm item;\r\n\t\titem.vstr.push(s1);\r\n\t\titem.vstr.push(s2);\r\n\t\titem.vstr.push(s3);\r\n\t\titem.vstr.push(s4);\r\n\t\titem.vstr.push(s5);\r\n\t\titem.vstr.push(s6);\r\n\t\titem.vstr.push(s7);\r\n\t\titem.vstr.push(s8);\r\n\t\tvasm.push_move(item);\r\n\t}\r\n\r\n\tstatic void push_asm(rbuf<tasm>& vasm,const rstr& s1,const rstr& s2,\r\n\t\tconst rstr& s3,const rstr& s4,const rstr& s5,const rstr& s6,\r\n\t\tconst rstr& s7)\r\n\t{\r\n\t\ttasm item;\r\n\t\titem.vstr.push(s1);\r\n\t\titem.vstr.push(s2);\r\n\t\titem.vstr.push(s3);\r\n\t\titem.vstr.push(s4);\r\n\t\titem.vstr.push(s5);\r\n\t\titem.vstr.push(s6);\r\n\t\titem.vstr.push(s7);\r\n\t\tvasm.push_move(item);\r\n\t}\r\n\r\n\tstatic void push_asm(rbuf<tasm>& vasm,const rstr& s1,const rstr& s2,\r\n\t\tconst rstr& s3,const rstr& s4,const rstr& s5,const rstr& s6)\r\n\t{\r\n\t\ttasm item;\r\n\t\titem.vstr.push(s1);\r\n\t\titem.vstr.push(s2);\r\n\t\titem.vstr.push(s3);\r\n\t\titem.vstr.push(s4);\r\n\t\titem.vstr.push(s5);\r\n\t\titem.vstr.push(s6);\r\n\t\tvasm.push_move(item);\r\n\t}\r\n\r\n\tstatic void push_asm(rbuf<tasm>& vasm,const rstr& s1,const rstr& s2,\r\n\t\tconst rstr& s3,const rstr& s4)\r\n\t{\r\n\t\ttasm item;\r\n\t\titem.vstr.push(s1);\r\n\t\titem.vstr.push(s2);\r\n\t\titem.vstr.push(s3);\r\n\t\titem.vstr.push(s4);\r\n\t\tvasm.push_move(item);\r\n\t}\r\n\r\n\tstatic void push_asm(rbuf<tasm>& vasm,const rstr& s1,const rstr& s2)\r\n\t{\r\n\t\ttasm item;\r\n\t\titem.vstr.push(s1);\r\n\t\titem.vstr.push(s2);\r\n\t\tvasm.push_move(item);\r\n\t}\r\n\r\n\tstatic void push_asm(rbuf<tasm>& vasm,const rstr& s1)\r\n\t{\r\n\t\ttasm item;\r\n\t\titem.vstr.push(s1);\r\n\t\tvasm.push_move(item);\r\n\t}\r\n};\r\n\r\n#endif"
  },
  {
    "path": "rpp/zautof.h",
    "content": "﻿#ifndef zautof_h__\r\n#define zautof_h__\r\n\r\n#include \"zfind.h\"\r\n\r\n//自动增加类成员函数\r\nstruct zautof\r\n{\r\n\tstatic rbool auto_add_func(tsh& sh,tclass& tci)\r\n\t{\r\n\t\tif(!rppconf(c_auto_addfunc))\r\n\t\t\treturn true;\r\n\t\tif(sh.is_basic_type(tci.name)||\r\n\t\t\ttci.is_friend)\r\n\t\t\treturn true;\r\n\t\trbool added=false;\r\n\t\ttpos pos;\r\n\t\tpos.line=1;\r\n\t\tpos.file=0;\r\n\t\tif(!tci.vfunc.empty())\r\n\t\t{\r\n\t\t\tpos=tci.vfunc.begin()->first_pos;\r\n\t\t}\r\n\t\tif(zfind::destruct_search(tci)==null)\r\n\t\t{\r\n\t\t\ttfunc tfi;\r\n\t\t\ttfi.ptci=&tci;\r\n\t\t\ttfi.first_pos=pos;\r\n\t\t\ttfi.last_pos=pos;\r\n\t\t\ttfi.last_pos.line++;\r\n\t\t\ttfi.name=rppoptr(c_destruct)+tci.name;\r\n\r\n\t\t\ttfi.param.push(tdata(tci.name+rppoptr(c_addr),rppkey(c_this)));\r\n\t\t\ttfi.retval=tdata(rppkey(c_void),rstr());\r\n\r\n\t\t\ttfi.name_dec=tfi.get_dec();\r\n\t\t\ttci.vfunc.insert(tfi);\r\n\t\t\tadded=true;\r\n\t\t}\r\n\t\tif(zfind::emptystruct_search(tci)==null)\r\n\t\t{\r\n\t\t\ttfunc tfi;\r\n\t\t\ttfi.ptci=&tci;\r\n\t\t\ttfi.first_pos=pos;\r\n\t\t\ttfi.last_pos=pos;\r\n\t\t\ttfi.last_pos.line++;\r\n\r\n\t\t\ttfi.name=tci.name;\r\n\r\n\t\t\ttfi.param.push(tdata(tci.name+rppoptr(c_addr),rppkey(c_this)));\r\n\t\t\ttfi.retval=tdata(rppkey(c_void),rstr());\r\n\r\n\t\t\ttfi.name_dec=tfi.get_dec();\r\n\t\t\ttci.vfunc.insert(tfi);\r\n\t\t\tadded=true;\r\n\t\t}\r\n\t\tif(zfind::copystruct_search(tci)==null)\r\n\t\t{\r\n\t\t\ttfunc tfi;\r\n\t\t\ttfi.ptci=&tci;\r\n\t\t\ttfi.first_pos=pos;\r\n\t\t\ttfi.last_pos=pos;\r\n\t\t\ttfi.last_pos.line++;\r\n\r\n\t\t\ttfi.name=tci.name;\r\n\r\n\t\t\ttfi.param.push(tdata(tci.name+rppoptr(c_addr),rppkey(c_this)));\r\n\t\t\ttfi.param.push(tdata(tci.name+rppoptr(c_addr),rppkey(c_rvara)));\r\n\t\t\ttfi.retval=tdata(rppkey(c_void),rstr());\r\n\r\n\t\t\tadd_copy_sent(sh,tfi);\r\n\t\t\ttfi.name_dec=tfi.get_dec();\r\n\t\t\ttci.vfunc.insert(tfi);\r\n\t\t\tadded=true;\r\n\t\t}\r\n\t\tif(zfind::func_search(tci,tci.name,\r\n\t\t\ttci.name+rppoptr(c_addr),tci.name)==null)\r\n\t\t{\r\n\t\t\ttfunc tfi=*zfind::copystruct_search(tci);\r\n\t\t\ttfi.ptci=&tci;\r\n\t\t\ttfi.param[1].type=tci.name;\r\n\t\t\ttfi.name_dec=tfi.get_dec();\r\n\t\t\ttci.vfunc.insert(tfi);\r\n\t\t\tadded=true;\r\n\t\t}\r\n\t\tif(zfind::func_search(tci,rppoptr(c_equal),tci.name+rppoptr(c_addr),\r\n\t\t\ttci.name+rppoptr(c_addr))==null)\r\n\t\t{\r\n\t\t\ttfunc tfi;\r\n\t\t\ttfi.ptci=&tci;\r\n\t\t\ttfi.first_pos=pos;\r\n\t\t\ttfi.last_pos=pos;\r\n\t\t\ttfi.last_pos.line++;\r\n\r\n\t\t\ttfi.name=rppoptr(c_equal);\r\n\r\n\t\t\ttfi.param.push(tdata(tci.name+rppoptr(c_addr),rppkey(c_this)));\r\n\t\t\ttfi.param.push(tdata(tci.name+rppoptr(c_addr),rppkey(c_rvara)));\r\n\t\t\ttfi.retval=tdata(rppkey(c_void),rstr());\r\n\r\n\t\t\tadd_copy_sent(sh,tfi);\r\n\t\t\ttfi.name_dec=tfi.get_dec();\r\n\t\t\ttci.vfunc.insert(tfi);\r\n\t\t\tadded=true;\r\n\t\t}\r\n\t\tif(zfind::func_search(tci,rppoptr(c_equal),\r\n\t\t\ttci.name+rppoptr(c_addr),tci.name)==null)\r\n\t\t{\r\n\t\t\ttfunc tfi=*zfind::func_search(\r\n\t\t\t\ttci,rppoptr(c_equal),tci.name+rppoptr(c_addr),\r\n\t\t\t\ttci.name+rppoptr(c_addr));\r\n\t\t\ttfi.ptci=&tci;\r\n\t\t\ttfi.param[1].type=tci.name;\r\n\t\t\ttfi.name_dec=tfi.get_dec();\r\n\t\t\ttci.vfunc.insert(tfi);\r\n\t\t\tadded=true;\r\n\t\t}\r\n\t\tif(zfind::func_search(tci,rppoptr(c_addr))==null)\r\n\t\t{\r\n\t\t\ttfunc tfi;\r\n\t\t\ttfi.ptci=&tci;\r\n\t\t\ttfi.first_pos=pos;\r\n\t\t\ttfi.last_pos=pos;\r\n\t\t\ttfi.last_pos.line++;\r\n\r\n\t\t\ttfi.name=rppoptr(c_addr);\r\n\r\n\t\t\ttfi.param.push(tdata(tci.name+rppoptr(c_addr),rppkey(c_this)));\r\n\t\t\ttfi.retval=tdata(\"rp<\"+tci.name+\">\",rppkey(c_s_ret));\r\n\r\n\t\t\ttword twi;\r\n\t\t\ttwi.pos=tfi.first_pos;\r\n\t\t\ttwi.pos_src=tfi.first_pos;\r\n\t\t\tsh.push_twi(tfi.vword,twi,rppkey(c_mov));\r\n\t\t\tsh.push_twi(tfi.vword,twi,rppkey(c_s_ret));\r\n\t\t\tsh.push_twi(tfi.vword,twi,rppoptr(c_comma));\r\n\t\t\tsh.push_twi(tfi.vword,twi,rppkey(c_this));\r\n\t\t\ttfi.name_dec=tfi.get_dec();\r\n\t\t\tif(zfind::is_class(sh,tfi.retval.type))\r\n\t\t\t\ttci.vfunc.insert(tfi);\r\n\t\t\tadded=true;\r\n\t\t}\r\n\t\treturn true;\r\n\t}\r\n\r\n\tstatic void add_copy_sent(tsh& sh,tfunc& tfi)\r\n\t{\r\n\t\ttclass& tci=*tfi.ptci;\r\n\t\ttword twi;\r\n\t\ttwi.pos_src=tfi.first_pos;\r\n\t\ttwi.pos=tfi.first_pos;\r\n\t\tfor(int i=0;i<tci.vdata.count();i++)\r\n\t\t{\r\n\t\t\tif(sh.is_basic_type(tci.vdata[i].type)||\r\n\t\t\t\tsh.is_quote(tci.vdata[i].type))\r\n\t\t\t{\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\t\t\tsh.push_twi(tfi.vword,twi,rppkey(c_this));\r\n\t\t\tsh.push_twi(tfi.vword,twi,rppoptr(c_dot));\r\n\t\t\tsh.push_twi(tfi.vword,twi,tci.vdata[i].name);\r\n\t\t\tsh.push_twi(tfi.vword,twi,rppoptr(c_equal));\r\n\t\t\tsh.push_twi(tfi.vword,twi,rppkey(c_rvara));\r\n\t\t\tsh.push_twi(tfi.vword,twi,rppoptr(c_dot));\r\n\t\t\tsh.push_twi(tfi.vword,twi,tci.vdata[i].name);\r\n\t\t\tsh.push_twi(tfi.vword,twi,rppoptr(c_semi));\r\n\t\t}\r\n\t}\r\n\r\n\tstatic void op_rstr(tsh& sh)\r\n\t{\r\n\t\tif(!rppconf(c_op_empty_func))\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\t\ttclass* p=zfind::class_search(sh,\"rbuf<char>\");\r\n\t\tif(p!=null)\r\n\t\t{\r\n\t\t\top_rstr(sh,p->vword);\r\n\t\t}\r\n\t}\r\n\r\n\tstatic void op_rstr(tsh& sh,rbuf<tword>& v)\r\n\t{\r\n\t\tfor(int i=0;i<v.count()-3;i++)\r\n\t\t{\r\n\t\t\tif(v[i]!=\"r_new\"&&v[i]!=\"r_delete\")\r\n\t\t\t{\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\t\t\tif(v[i+1]!=rppoptr(c_tbk_l)||v[i+2]!=\"char\"||\r\n\t\t\t\tv[i+3]!=rppoptr(c_tbk_r))\r\n\t\t\t{\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\t\t\tv[i].val+=\"_n\";\r\n\t\t}\r\n\t}\r\n};\r\n\r\n#endif\r\n"
  },
  {
    "path": "rpp/zbin.h",
    "content": "﻿#ifndef zbin_h__\r\n#define zbin_h__\r\n\r\n#include \"zasm.h\"\r\n#include \"zsent.h\"\r\n#include \"zfind.h\"\r\n\r\n//生成二进制代码类\r\nstruct zbin\r\n{\r\n\t//将一个函数翻译成二进制代码\r\n\tstatic rbool proc_func(tsh& sh,tfunc& tfi)\r\n\t{\r\n\t\tif(!tfi.vasm.empty())\r\n\t\t\treturn true;\r\n\t\tif(!cp_vword_to_vasm(sh,tfi,tenv()))\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\tfor(int i=0;i<tfi.vasm.count();i++)\r\n\t\t{\r\n\t\t\tif(!proc_asm(sh,tfi.vasm,tfi.vasm[i]))\r\n\t\t\t{\r\n\t\t\t\tsh.error(tfi.vasm[i],\"asm error\");\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\ttfi.vasm[i].ptfi=&tfi;\r\n\t\t}\r\n\t\treturn true;\r\n\t}\r\n\t\r\n\t//翻译一条未解析的指令\r\n\tstatic rbool cp_call_asm(tsh& sh,tasm& item)\r\n\t{\r\n\t\trmutex_t mutex_t(sh.m_mutex);\r\n\t\tif(item.ins.type!=0)\r\n\t\t{\r\n\t\t\treturn true;\r\n\t\t}\r\n\t\tint i;\r\n\t\tfor(i=1;i<item.vstr.count();i++)\r\n\t\t{\r\n\t\t\tif(item.vstr[i]==rppoptr(c_addr))\r\n\t\t\t{\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t}\r\n\t\t//一条指令里最多出现一次&,而且 &操作数 只能是最后一个操作数\r\n\t\tif(i>=item.vstr.count())\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\tint addr_pos=i;\r\n\t\ti+=2;\r\n\t\ttclass* ptci=zfind::class_search(sh,item.vstr.get(i));\r\n\t\tif(ptci==null)\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\ti+=2;\r\n\t\trstr fname=item.vstr.get(i);\r\n\t\ttfunc* ptfi=zfind::func_search_dec(*ptci,fname);\r\n\t\tif(ptfi==null)\r\n\t\t{\r\n\t\t\titem.vstr.print();\r\n\t\t\trf::printl();\r\n\t\t\tsh.error(\"can't find \"+fname);\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\tif(!proc_func(sh,*ptfi))\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\titem.vstr=item.vstr.sub(0,addr_pos-1);\r\n\t\titem.vstr+=rstr(r_to_uint(ptfi->vasm.begin()));\r\n\t\tif(!proc_asm(sh,item))\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\treturn true;\r\n\t}\r\n\r\n\t//从函数的词表编译到vasm\r\n\tstatic rbool cp_vword_to_vasm(tsh& sh,tfunc& tfi,tenv env)\r\n\t{\r\n\t\tif(!zsent::proc_func(sh,tfi,env))\r\n\t\t{\r\n\t\t\tsh.error(tfi,\"sent error\");\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\tif(!zasm::proc_func(sh,tfi))\r\n\t\t{\r\n\t\t\tsh.error(tfi,\"asm error\");\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\treturn true;\r\n\t}\r\n\r\n\tstatic rbool proc_vasm(tsh& sh,rbuf<tasm>& vasm)\r\n\t{\r\n\t\tfor(int i=0;i<vasm.count();i++)\r\n\t\t{\r\n\t\t\tif(!proc_asm(sh,vasm[i]))\r\n\t\t\t{\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn true;\r\n\t}\r\n\r\n\tstatic rbool proc_asm(tsh& sh,tasm& oasm)\r\n\t{\r\n\t\trbuf<tasm> vasm;\r\n\t\treturn proc_asm(sh,vasm,oasm);\r\n\t}\r\n\t\r\n\t//将汇编代码翻译成二进制代码\r\n\tstatic rbool proc_asm(tsh& sh,rbuf<tasm>& vasm,tasm& oasm)\r\n\t{\r\n\t\toasm.ins.type=sh.m_key.get_key_index(oasm.vstr.get_bottom());\r\n\t\tif(oasm.ins.type>tkey::c_rn)\r\n\t\t{\r\n\t\t\tsh.error(oasm);\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\tif(oasm.vstr.count()==2&&\r\n\t\t\tis_jmp_ins(oasm.ins.type)&&\r\n\t\t\toasm.vstr[1].is_number())\r\n\t\t{\r\n\t\t\tint line=oasm.vstr[1].toint();\r\n\t\t\tint i;\r\n\t\t\tfor(i=0;i<vasm.count();i++)\r\n\t\t\t{\r\n\t\t\t\tif(vasm[i].pos.line>=line)\r\n\t\t\t\t{\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tif(i>=vasm.count())\r\n\t\t\t{\r\n\t\t\t\tsh.error(oasm);\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\toasm.ins.type*=6;\r\n\t\t\toasm.ins.first.type=topnd::c_imme;\r\n\t\t\toasm.ins.first.val=r_to_uint(&vasm[i]);\r\n\t\t\treturn true;\r\n\t\t}\r\n\t\toasm.ins.type*=6;\r\n\t\tif(!a_asm(sh,oasm))\r\n\t\t{\r\n\t\t\tsh.error(oasm);\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\treturn true;\r\n\t}\r\n\r\n\tstatic int find_comma(tsh& sh,rbuf<rstr>& v)\r\n\t{\r\n\t\tint count1=0;\r\n\t\tint count2=0;\r\n\t\tint i;\r\n\t\tfor(i=1;i<v.count();i++)\r\n\t\t{\r\n\t\t\tif(rppoptr(c_sbk_l)==v[i])\r\n\t\t\t{\r\n\t\t\t\tcount1++;\r\n\t\t\t}\r\n\t\t\telif(rppoptr(c_sbk_r)==v[i])\r\n\t\t\t{\r\n\t\t\t\tcount1--;\r\n\t\t\t}\r\n\t\t\telif(rppoptr(c_mbk_l)==v[i])\r\n\t\t\t{\r\n\t\t\t\tcount2++;\r\n\t\t\t}\r\n\t\t\telif(rppoptr(c_mbk_r)==v[i])\r\n\t\t\t{\r\n\t\t\t\tcount2--;\r\n\t\t\t}\r\n\t\t\telif(count1==0&&count2==0&&v[i]==rppoptr(c_comma))\r\n\t\t\t\tbreak;\r\n\t\t}\r\n\t\treturn i;\r\n\t}\r\n\r\n\tstatic rbool a_asm(tsh& sh,tasm& item)\r\n\t{\r\n\t\tint i=find_comma(sh,item.vstr);\r\n\t\tif(!a_opnd(sh,item,i-1,item.vstr.sub(1,i),item.ins.first))\r\n\t\t\treturn false;\r\n\t\tif(item.ins.empty())\r\n\t\t{\r\n\t\t\treturn true;\r\n\t\t}\r\n\t\tif(!a_opnd(sh,item,i+1,item.vstr.sub(i+1),item.ins.second))\r\n\t\t\treturn false;\r\n\t\tif(item.ins.empty())\r\n\t\t{\r\n\t\t\treturn true;\r\n\t\t}\r\n\t\tif(!obtain_qrun_type(item.ins))\r\n\t\t\treturn false;\r\n\t\treturn true;\r\n\t}\r\n\r\n\tstatic rbool obtain_qrun_type(tins& ins)\r\n\t{\r\n\t\tif(ins.second.type==topnd::c_null)\r\n\t\t{\r\n\t\t\tif(ins.first.type==topnd::c_null)\r\n\t\t\t\t;\r\n\t\t\telif(ins.first.type==topnd::c_imme)\r\n\t\t\t\t;\r\n\t\t\telif(ins.first.type==topnd::c_reg)\r\n\t\t\t\tins.type+=1;\r\n\t\t\telif(ins.first.type==topnd::c_addr)\r\n\t\t\t\tins.type+=2;\r\n\t\t\telse\r\n\t\t\t\treturn false;\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tif(ins.second.type==topnd::c_imme)\r\n\t\t\t{\r\n\t\t\t\tif(ins.first.type==topnd::c_reg)\r\n\t\t\t\t\t;\r\n\t\t\t\telif(ins.first.type==topnd::c_addr)\r\n\t\t\t\t\tins.type+=1;\r\n\t\t\t\telse\r\n\t\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\telif(ins.second.type==topnd::c_reg)\r\n\t\t\t{\r\n\t\t\t\tif(ins.first.type==topnd::c_reg)\r\n\t\t\t\t\tins.type+=2;\r\n\t\t\t\telif(ins.first.type==topnd::c_addr)\r\n\t\t\t\t\tins.type+=3;\r\n\t\t\t\telse\r\n\t\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\telif(ins.second.type==topnd::c_addr)\r\n\t\t\t{\r\n\t\t\t\tif(ins.first.type==topnd::c_reg)\r\n\t\t\t\t\tins.type+=4;\r\n\t\t\t\telif(ins.first.type==topnd::c_addr)\r\n\t\t\t\t\tins.type+=5;\r\n\t\t\t\telse\r\n\t\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t\treturn false;\r\n\t\t}\r\n\t\treturn true;\r\n\t}\r\n\r\n\tstatic rbool a_opnd(tsh& sh,tasm& item,int index,const rbuf<rstr>& v,topnd& o)\r\n\t{\r\n\t\tif(v.empty())\r\n\t\t{\r\n\t\t\treturn true;\r\n\t\t}\r\n\t\tif(v.count()==1)\r\n\t\t{\r\n\t\t\tif(v.top().is_number())\r\n\t\t\t{\r\n\t\t\t\t//123\r\n\t\t\t\to.type=topnd::c_imme;\r\n\t\t\t\to.val=v.top().touint();\r\n\t\t\t}\r\n\t\t\telif(v[0].get_bottom()=='\"')\r\n\t\t\t{\r\n\t\t\t\t//\"abc\"\r\n\t\t\t\ttrans_cstr(v[0]);\r\n\t\t\t\tif(index>=item.vstr.count())\r\n\t\t\t\t{\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t}\r\n\t\t\t\titem.vstr[index]=v[0];\r\n\t\t\t\to.type=topnd::c_imme;\r\n\t\t\t\to.val=r_to_uint(item.vstr[index].begin());\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\t//ebp\r\n\t\t\t\to.type=topnd::c_reg;\r\n\t\t\t\to.off=get_reg_off(sh,v.top());\r\n\t\t\t}\r\n\t\t}\r\n\t\telif(v.count()==3)\r\n\t\t{\r\n\t\t\tif(v.bottom()==rppoptr(c_mbk_l)&&\r\n\t\t\t\tv.top()==rppoptr(c_mbk_r))\r\n\t\t\t{\r\n\t\t\t\t//[ebp]\r\n\t\t\t\to.type=topnd::c_addr;\r\n\t\t\t\to.off=get_reg_off(sh,v[1]);\r\n\t\t\t\to.val=0;\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t\treturn false;\r\n\t\t}\r\n\t\telif(v.count()==5)\r\n\t\t{\r\n\t\t\t//[ebp+2]\r\n\t\t\to.type=topnd::c_addr;\r\n\t\t\to.off=get_reg_off(sh,v[1]);\r\n\t\t\to.val=v[3].touint();\r\n\t\t\tif(v[2]==rppoptr(c_minus))\r\n\t\t\t\to.val=-o.val;\r\n\t\t}\r\n\t\telif(v.count()==7&&v[1]==rppoptr(c_addr))\r\n\t\t{\r\n\t\t\titem.ins.clear();\r\n\t\t\treturn true;\r\n\t\t}\r\n\t\telif(v.count()==0)\r\n\t\t\treturn true;\r\n\t\telse\r\n\t\t\treturn false;\r\n\t\tif(o.off>=r_size(treg))\r\n\t\t\treturn false;\r\n\t\treturn true;\r\n\t}\r\n\r\n\tstatic void trans_cstr(rstr& src)\r\n\t{\r\n\t\tif(src.count()<2)\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\t\trstr dst;\r\n\t\tfor(int i=1;i<src.count()-1;i++)\r\n\t\t{\r\n\t\t\tif(src[i]=='\\\\')\r\n\t\t\t{\r\n\t\t\t\tif(src.get(i+1)=='b')\r\n\t\t\t\t\tdst+='\\b';\r\n\t\t\t\telif(src.get(i+1)=='n')\r\n\t\t\t\t\tdst+='\\n';\r\n\t\t\t\telif(src.get(i+1)=='r')\r\n\t\t\t\t\tdst+='\\r';\r\n\t\t\t\telif(src.get(i+1)=='\\0')\r\n\t\t\t\t\tdst+='\\0';\r\n\t\t\t\telif(src.get(i+1)=='x')\r\n\t\t\t\t{\r\n\t\t\t\t\tuchar ch=(uchar)rstr::hextodec(\r\n\t\t\t\t\t\tsrc.sub(i+2,i+4)).touint();\r\n\t\t\t\t\tdst+=ch;\r\n\t\t\t\t\ti=i+3;\r\n\t\t\t\t\tcontinue;\r\n\t\t\t\t}\r\n\t\t\t\telse\r\n\t\t\t\t\tdst+=src.get(i+1);\r\n\t\t\t\ti++;\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\tdst+=src[i];\r\n\t\t\t}\r\n\t\t}\r\n\t\tsrc=r_move(dst);\r\n\t\tsrc.m_buf.push(0);\r\n\t}\r\n\r\n\tstatic rbool is_jmp_ins(int type)\r\n\t{\r\n\t\treturn type==tkey::c_jmp||type==tkey::c_jebxz||type==tkey::c_jebxnz;\r\n\t}\r\n\r\n\tstatic int get_reg_off(tsh& sh,const rstr& s)\r\n\t{\r\n\t\ttreg reg;\r\n\t\tint ret=r_size(treg);\r\n\t\tif(rppkey(c_eax)==s)\r\n\t\t\tret=(uchar*)&reg.eax-(uchar*)&reg;\r\n\t\telif(rppkey(c_ebx)==s)\r\n\t\t\tret=(uchar*)&reg.ebx-(uchar*)&reg;\r\n\t\telif(rppkey(c_ecx)==s)\r\n\t\t\tret=(uchar*)&reg.ecx-(uchar*)&reg;\r\n\t\telif(rppkey(c_edx)==s)\r\n\t\t\tret=(uchar*)&reg.edx-(uchar*)&reg;\r\n\t\telif(rppkey(c_esi)==s)\r\n\t\t\tret=(uchar*)&reg.esi-(uchar*)&reg;\r\n\t\telif(rppkey(c_edi)==s)\r\n\t\t\tret=(uchar*)&reg.edi-(uchar*)&reg;\r\n\t\telif(rppkey(c_esp)==s)\r\n\t\t\tret=(uchar*)&reg.esp-(uchar*)&reg;\r\n\t\telif(rppkey(c_ebp)==s)\r\n\t\t\tret=(uchar*)&reg.ebp-(uchar*)&reg;\r\n\t\telif(rppkey(c_eip)==s)\r\n\t\t\tret=(uchar*)&reg.eip-(uchar*)&reg;\r\n\t\treturn ret;\r\n\t}\r\n\r\n\tstatic void clear_reg(treg& reg)\r\n\t{\r\n\t\treg.eax=0;\r\n\t\treg.ebx=0;\r\n\t\treg.ebp=0;\r\n\t\treg.esi=0;\r\n\t}\r\n\r\n\tstatic void print_reg(treg& reg)\r\n\t{\r\n\t\trstr s;\r\n\t\ts=rstr(\"ecx: \")+rstr(reg.ecx);\r\n\t\ts.printl();\r\n\t}\r\n\r\n\tstatic tfunc* find_func(tsh& sh,rstr name)\r\n\t{\r\n\t\trmutex_t mutex_t(sh.m_mutex);\r\n\t\trbuf<tword> vword;\r\n\t\tif(!zread::word_analyse(sh,name,vword,null))\r\n\t\t\treturn 0;\r\n\t\tzctl::combine_quote(sh,vword);\r\n\t\tcombine_template(sh,vword);\r\n\t\tcombine_mbk(sh,vword);\r\n\t\trbuf<rstr> vstr=sh.vword_to_vstr(vword);\r\n\t\ttclass* ptci;\r\n\t\trbuf<rstr> param;\r\n\t\trstr fname;\r\n\t\tif(vstr.get(1)==rppoptr(c_dot))\r\n\t\t{\r\n\t\t\tptci=zfind::class_search(sh,vstr.get(0));\r\n\t\t\tparam=vstr.sub(4,vstr.count()-1);\r\n\t\t\tfname=vstr.get(2);\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tptci=sh.m_main;\r\n\t\t\tparam=vstr.sub(2,vstr.count()-1);\r\n\t\t\tfname=vstr.get(0);\r\n\t\t}\r\n\t\tif(ptci==null)\r\n\t\t\treturn null;\r\n\t\trbuf<rbuf<rstr> > temp=r_split(param,rstr(\",\"));\r\n\t\tparam.clear();\r\n\t\tfor(int i=0;i<temp.count();i++)\r\n\t\t{\r\n\t\t\tparam.push(rstr::join<rstr>(temp[i],rstr()));\r\n\t\t}\r\n\t\tif(param.empty())\r\n\t\t\treturn zfind::func_search(*ptci,fname);\r\n\t\telse\r\n\t\t\treturn zfind::func_search_same(*ptci,fname,param);\r\n\t}\r\n\t\r\n\t//查找内部函数\r\n\tstatic uint find_func_bin(tsh& sh,rstr name)\r\n\t{\r\n\t\ttfunc* ptfi=find_func(sh,name);\r\n\t\tif(ptfi==null)\r\n\t\t{\r\n\t\t\treturn 0;\r\n\t\t}\r\n\t\tif(!proc_func(sh,*ptfi))\r\n\t\t{\r\n\t\t\treturn 0;\r\n\t\t}\r\n\t\treturn (uint)ptfi->vasm.begin();\r\n\t}\r\n\r\n\tstatic void combine_mbk(tsh& sh,rbuf<tword>& v)\r\n\t{\r\n\t\tfor(int i=1;i<v.count();i++)\r\n\t\t{\r\n\t\t\tifn(v[i-1]==rppoptr(c_mbk_l)&&v[i]==rppoptr(c_mbk_r))\r\n\t\t\t{\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\t\t\tv[i-1].val+=v[i].val;\r\n\t\t\tv[i].val.clear();\r\n\t\t}\r\n\t\tzpre::arrange(v);\r\n\t}\r\n\r\n\tstatic void combine_template(tsh& sh,rbuf<tword>& v)\r\n\t{\r\n\t\tfor(int i=1;i<v.count();i++)\r\n\t\t{\r\n\t\t\tif(v[i]!=rppoptr(c_tbk_l))\r\n\t\t\t{\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\t\t\tifn(v[i-1].is_name())\r\n\t\t\t{\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\t\t\tint right=sh.find_symm_tbk(v,i);\r\n\t\t\tif(right>=v.count())\r\n\t\t\t{\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\t\t\tfor(int j=i;j<=right;j++)\r\n\t\t\t{\r\n\t\t\t\tv[i-1].val+=v[j].val;\r\n\t\t\t\tv[j].clear();\r\n\t\t\t}\r\n\t\t\ti=right;\r\n\t\t}\r\n\t\tzpre::arrange(v);\r\n\t}\r\n};\r\n\r\n#endif"
  },
  {
    "path": "rpp/zclass.h",
    "content": "﻿#ifndef zclass_h__\r\n#define zclass_h__\r\n\r\n#include \"tsh.h\"\r\n#include \"zpre.h\"\r\n#include \"zfind.h\"\r\n\r\n//提取所有类\r\n//m_file.vword->m_class.vword\r\nstruct zclass\r\n{\t\r\n\tstatic rbool process(tsh& sh)\r\n\t{\r\n\t\tbasic_type_add(sh);\r\n\t\tfor(tfile* p=sh.m_file.begin();p!=sh.m_file.end();p=sh.m_file.next(p))\r\n\t\t\tif(!find_class(sh,p->vword))\r\n\t\t\t\treturn false;\r\n\t\tmain_add(sh);\r\n\t\tfor(tfile* p=sh.m_file.begin();p!=sh.m_file.end();p=sh.m_file.next(p))\r\n\t\t\tif(!proc_class_again(sh,p->vword))\r\n\t\t\t\treturn false;\r\n\t\tif(!inherit_proc_all(sh))\r\n\t\t\treturn false;\r\n\t\tfor(tfile* p=sh.m_file.begin();p!=sh.m_file.end();p=sh.m_file.next(p))\r\n\t\t{\r\n\t\t\tp->cont.m_buf.free();\r\n\t\t\tp->vword.free();\r\n\t\t}\r\n\t\treturn true;\r\n\t}\r\n\r\n\tstatic void combine_multi_class_name(tsh& sh,rbuf<tword>& v)\r\n\t{\r\n\t\tfor(int i=0;i<c_rpp_deep;i++)\r\n\t\t{\r\n\t\t\tifn(combine_multi_class_name_one(sh,v))\r\n\t\t\t{\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tzpre::arrange(v);\r\n\t\t}\r\n\t}\r\n\r\n\t//暂不支持模板类复合或者继承复合\r\n\tstatic rbool combine_multi_class_name_one(tsh& sh,rbuf<tword>& v)\r\n\t{\r\n\t\trbool ret=false;\r\n\t\tfor(int i=1;i<v.count();i++)\r\n\t\t{\r\n\t\t\tif(v[i].val!=rppoptr(c_dot))\r\n\t\t\t{\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\t\t\tifn(zfind::is_class(sh,v[i-1].val))\r\n\t\t\t{\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\t\t\tif(i+1>=v.count())\r\n\t\t\t{\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\t\t\trstr full=v[i-1].val+v[i].val+v[i+1].val;\r\n\t\t\tifn(zfind::is_class(sh,full))\r\n\t\t\t{\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\t\t\tret=true;\r\n\t\t\tv[i-1].val=full;\r\n\t\t\tv[i].val.clear();\r\n\t\t\tv[i+1].val.clear();\r\n\t\t}\r\n\t\treturn ret;\r\n\t}\r\n\r\n\tstatic void main_add(tsh& sh)\r\n\t{\r\n\t\tsh.m_main=zfind::class_search(sh,rppkey(c_main));\r\n\t\tif(sh.m_main==null)\r\n\t\t{\r\n\t\t\ttclass item;\r\n\t\t\titem.name=rppkey(c_main);\r\n\t\t\tsh.m_class.insert(item);\r\n\t\t\tsh.m_main=zfind::class_search(sh,rppkey(c_main));\t\r\n\t\t}\r\n\t\tsh.m_main->is_friend=true;\r\n\t}\r\n\r\n\tstatic rbool proc_class_again(tsh& sh,rbuf<tword>& v)\r\n\t{\r\n\t\tfor(int i=0;i<v.count();i++)\r\n\t\t\tsh.m_main->vword.push(v[i]);\r\n\t\treturn true;\r\n\t}\r\n\r\n\tstatic void arrange_format(tsh& sh,rbuf<tword>& v,tfunc* ptfi)\r\n\t{\r\n\t\tzclass::arrange_format_bbk(sh,v,ptfi);\r\n\t\tzclass::arrange_format_ctrl(sh,v,ptfi);\r\n\t}\r\n\t\r\n\t//双重循环有待优化\r\n\tstatic void arrange_format_bbk(tsh& sh,rbuf<tword>& v,tfunc* ptfi=null)\r\n\t{\r\n\t\tfor(int i=0;i<v.count();i++)\r\n\t\t{\r\n\t\t\tif(v[i].val!=rppoptr(c_bbk_l)&&v[i].val!=rppoptr(c_bbk_r))\r\n\t\t\t{\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\t\t\tif(v.get(i-1).pos!=v[i].pos&&v.get(i+1).pos!=v[i].pos)\r\n\t\t\t{\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\t\t\tv[i].pos.line++;\r\n\t\t\tfor(int j=i+1;j<v.count();j++)\r\n\t\t\t\tv[j].pos.line+=2;\r\n\t\t\tif(ptfi)\r\n\t\t\t\tptfi->last_pos.line+=2;\r\n\t\t}\r\n\t}\r\n\r\n\tstatic void arrange_format_ctrl(tsh& sh,rbuf<tword>& v,tfunc* ptfi)\r\n\t{\r\n\t\tfor(int i=1;i<v.count();i++)\r\n\t\t{\r\n\t\t\tif(v[i].val!=rppkey(c_switch)&&v[i].val!=rppkey(c_case)&&\r\n\t\t\t\tv[i].val!=rppkey(c_for)&&v[i].val!=rppkey(c_else)&&\r\n\t\t\t\tv[i].val!=rppkey(c_ifn)&&\r\n\t\t\t\t(v[i].val!=rppkey(c_if)||v[i-1].val==rppkey(c_else)))\r\n\t\t\t{\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\t\t\tif(v[i-1].pos!=v[i].pos)\r\n\t\t\t{\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\t\t\tv[i].pos.line++;\r\n\t\t\tfor(int j=i+1;j<v.count();j++)\r\n\t\t\t\tv[j].pos.line++;\r\n\t\t\tptfi->last_pos.line++;\r\n\t\t}\t\r\n\t}\r\n\r\n\tstatic rbool is_bbk_prev(tsh& sh,const rstr& s)\r\n\t{\r\n\t\treturn s==rppoptr(c_comma)||s==rppoptr(c_equal)||\r\n\t\t\ts==rppoptr(c_sbk_l)||s==rppoptr(c_mbk_l)||s==rppoptr(c_bbk_l);\r\n\t}\r\n\r\n\tstatic void arrange_format_l(tsh& sh,rbuf<tword>& v,tfunc* ptfi=null)\r\n\t{\r\n\t\tfor(int i=0;i<v.count();i++)\r\n\t\t{\r\n\t\t\t//todo 未判断左大括号开头的情况\r\n\t\t\tif(v[i].val==rppoptr(c_bbk_l)&&is_bbk_prev(sh,v.get(i-1).val))\r\n\t\t\t{\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\t\t\tif(v[i].val!=rppoptr(c_bbk_l)&&v[i].val!=rppoptr(c_bbk_r))\r\n\t\t\t{\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\t\t\tif(v.get(i-1).pos!=v[i].pos&&v.get(i+1).pos!=v[i].pos)\r\n\t\t\t{\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\t\t\t//！warning：{ } need occupy one line，otherwise can't debug\r\n\t\t\tv[i].pos.line++;\r\n\t\t\tfor(int j=i+1;j<v.count();j++)\r\n\t\t\t\tv[j].pos.line+=2;\r\n\t\t\tif(ptfi)\r\n\t\t\t\tptfi->last_pos.line+=2;\r\n\t\t}\r\n\t}\r\n\r\n\tstatic rbool name_part(tsh& sh,tclass& tci,rbuf<tword>& name_w)\r\n\t{\r\n\t\trbuf<tword> father;\r\n\t\tint colonpos=r_find_pos(name_w,tword(rppoptr(c_colon)));\r\n\t\tif(colonpos<name_w.count())\r\n\t\t{\r\n\t\t\tfor(int i=colonpos+1;i<name_w.count();i++)\r\n\t\t\t\tfather.push(name_w[i]);\r\n\t\t\tif(father.empty())\r\n\t\t\t{\r\n\t\t\t\tsh.error(tci.vword.get(0),\"empty father\");\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\tname_w.erase(colonpos,name_w.count());\r\n\t\t\ttci.vfather=sh.comma_split_t(father);\r\n\t\t}\r\n\t\tint pos=r_find_pos(name_w,tword(rppoptr(c_tbk_l)));\r\n\t\tif(pos<name_w.count())\r\n\t\t{\r\n\t\t\trstr temp;\r\n\t\t\tfor(int i=pos+1;i<name_w.count()-1;i++)\r\n\t\t\t\ttemp+=name_w[i].val;\r\n\t\t\trbuf<rstr> result=r_split(temp,rppoptr(c_comma));\r\n\t\t\tif(result.empty())\r\n\t\t\t{\r\n\t\t\t\tsh.error(tci.vword.get(0),\"template >error\");\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\tfor(int i=0;i<result.count();i++)\r\n\t\t\t{\r\n\t\t\t\tttl item;\r\n\t\t\t\tint epos=r_find_pos(result[i],rppoptr(c_equal));\r\n\t\t\t\tfor(int j=0;j<epos;j++)\r\n\t\t\t\t\titem.name+=result[i][j];\r\n\t\t\t\tif(item.name.empty())\r\n\t\t\t\t{\r\n\t\t\t\t\tsh.error(tci.vword.get(0),\"empty template\");\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t}\r\n\t\t\t\tfor(int j=epos+1;j<result[i].count();j++)\r\n\t\t\t\t\titem.val+=result[i][j];\r\n\t\t\t\ttci.vtl.push(item);\r\n\t\t\t}\r\n\t\t}\r\n\t\tfor(int i=0;i<pos;i++)\r\n\t\t\ttci.name+=name_w[i].val;\r\n\t\tif(tci.name.empty())\r\n\t\t{\r\n\t\t\tsh.error(tci.vword.get(0),\"empty class name\");\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\treturn true;\r\n\t}\r\n\r\n\tstatic rbool proc_old_tl(tsh& sh,rbuf<tword>& v,int i,rbuf<tword>& name_w)\r\n\t{\r\n\t\tint right=i-1;\r\n\t\tif(v.get(right)!=rppoptr(c_tbk_r))\r\n\t\t\treturn true;\r\n\t\tint left=sh.find_symm_word_rev(v,rppoptr(c_tbk_l),rppoptr(c_tbk_r),0,i);\r\n\t\tif(left>=v.count())\r\n\t\t\treturn true;\r\n\t\tif(v.get(left-1)!=rppkey(c_template))\r\n\t\t{\r\n\t\t\treturn true;\r\n\t\t}\r\n\t\trbuf<rbuf<tword> > temp;\r\n\t\ttemp=sh.comma_split(v.sub(left+1,right));\r\n\t\tif(temp.empty())\r\n\t\t{\r\n\t\t\treturn true;\r\n\t\t}\r\n\t\t\r\n\t\tfor(int j=0;j<temp.count();j++)\r\n\t\t{\r\n\t\t\tif(temp[j].get(0)==rppkey(c_typename))\r\n\t\t\t{\r\n\t\t\t\ttemp[j].pop_front();\r\n\t\t\t}\r\n\t\t}\r\n\t\trbuf<tword> vtl;\r\n\t\tvtl+=rppoptr(c_tbk_l);\r\n\t\tfor(int j=0;j<temp.count();j++)\r\n\t\t{\r\n\t\t\tif(j!=0)\r\n\t\t\t{\r\n\t\t\t\tvtl+=rppoptr(c_comma);\r\n\t\t\t}\r\n\t\t\tvtl+=temp[j];\r\n\t\t}\r\n\t\tvtl+=rppoptr(c_tbk_r);\r\n\t\tname_w.insert(1,vtl);\r\n\t\tfor(int j=left-1;j<i;j++)\r\n\t\t{\r\n\t\t\tv[j].clear();\r\n\t\t}\r\n\t\treturn true;\r\n\t}\r\n\r\n\tstatic rbool find_class(tsh& sh,rbuf<tword>& v)\r\n\t{\r\n\t\tfor(int i=0;i<v.count();i++)\r\n\t\t{\r\n\t\t\tif(v[i].val!=rppkey(c_class))\r\n\t\t\t{\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\t\t\tint left=r_find_pos(v,tword(rppoptr(c_bbk_l)),i+1);\r\n\t\t\tif(left>=v.count())\r\n\t\t\t{\r\n\t\t\t\tsh.error(v.get(i),\"miss {\");\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\ttclass item;\r\n\t\t\trbuf<tword> name_w;\r\n\t\t\tfor(int j=i+1;j<left;j++)\r\n\t\t\t\tname_w.push(v[j]);\r\n\t\t\tif(name_w.empty())\r\n\t\t\t{\r\n\t\t\t\tsh.error(v.get(i),\"miss class name\");\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\tproc_old_tl(sh,v,i,name_w);\r\n\t\t\tint right=sh.find_symm_bbk(v,left);\r\n\t\t\tif(right>=v.count())\r\n\t\t\t{\r\n\t\t\t\tsh.error(v.get(i),\"miss {\");\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\tif(v.get(i-1).val==rppkey(c_friend))\r\n\t\t\t{\r\n\t\t\t\tv[i-1].clear();\r\n\t\t\t\titem.is_friend=true;\r\n\t\t\t}\r\n\t\t\tfor(int j=left+1;j<right;j++)\r\n\t\t\t\titem.vword.push(v[j]);\r\n\t\t\tfor(int j=i;j<=right;j++)\r\n\t\t\t\tv[j].clear();\r\n\t\t\tif(!class_add(sh,item,name_w))\r\n\t\t\t\treturn false;\r\n\t\t\ti=right;\r\n\t\t}\r\n\t\tzpre::arrange(v);\r\n\t\treturn true;\r\n\t}\r\n\r\n\tstatic rbool class_add(tsh& sh,tclass& tci,rbuf<tword>& name_w)\r\n\t{\r\n\t\tif(!name_part(sh,tci,name_w))\r\n\t\t\treturn false;\r\n\t\tif(zfind::is_class(sh,tci.name)||zfind::is_classtl(sh,tci.name))\r\n\t\t{\r\n\t\t\tsh.error(name_w.get_bottom(),\"type redefined\");\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\tif(tci.vtl.empty())\r\n\t\t{\r\n\t\t\tsh.m_class.insert(tci);\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tsh.m_classtl.insert(tci);\r\n\t\t}\r\n\t\treturn true;\r\n\t}\r\n\r\n\tstatic void insert_type(tsh& sh,const rstr& name,int size)\r\n\t{\r\n\t\ttclass item;\r\n\t\titem.name=name;\r\n\t\titem.size=size;\r\n\t\tif(!zfind::is_class(sh,item.name))\r\n\t\t\tsh.m_class.insert(item);\r\n\t}\r\n\r\n\tstatic void basic_type_add(tsh& sh)\r\n\t{\r\n\t\tinsert_type(sh,rppkey(c_void),0);\r\n\t\tinsert_type(sh,rppkey(c_rd1),1);\r\n\t\tinsert_type(sh,rppkey(c_rd2),2);\r\n\t\tinsert_type(sh,rppkey(c_rd4),4);\r\n\t\tinsert_type(sh,rppkey(c_rd8),8);\r\n\t\tinsert_type(sh,rppkey(c_rdp),c_point_size);\r\n\t\tinsert_type(sh,rppkey(c_rcs),c_point_size);\r\n\t}\r\n\r\n\tstatic rbool inherit_proc_all(tsh& sh)\r\n\t{\r\n\t\tfor(tclass* p=sh.m_class.begin();\r\n\t\t\tp!=sh.m_class.end();p=sh.m_class.next(p))\r\n\t\t\tif(!inherit_proc(sh,*p))\r\n\t\t\t\treturn false;\r\n\t\treturn true;\r\n\t}\r\n\t\r\n\t//模板继承模板如 A<T>:B<T>\r\n\t//模板继承非模板 A<T>:C,D\r\n\t//非模板继承非模板 E:C\r\n\t//模板实例暂时不能继承如 C:A<int>\r\n\t//如果定义同名函数会调用子类的函数，所以不要用覆盖和隐藏\r\n\t//后面自动生成构造、析构、拷贝构造、operator=不会继承，但用户定义的会继承\r\n\tstatic rbool inherit_proc(tsh& sh,tclass& tci,int level=0)\r\n\t{\r\n\t\tif(level>c_rpp_deep)\r\n\t\t{\r\n\t\t\tsh.error(\"inherit too deep\");\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\tlevel++;\r\n\t\tif(tci.vfather.empty())\r\n\t\t\treturn true;\r\n\t\trbuf<tword> v;\r\n\t\tfor(int i=0;i<tci.vfather.count();i++)\r\n\t\t{\r\n\t\t\trstr cname=tci.vfather[i].vword.get(0).val;\r\n\t\t\ttclass* ptci=zfind::class_search(sh,cname);\r\n\t\t\tif(ptci==null)\r\n\t\t\t{\r\n\t\t\t\tptci=zfind::classtl_search(sh,cname);\r\n\t\t\t\tif(ptci==null)\r\n\t\t\t\t{\r\n\t\t\t\t\tsh.error(\"inherit can't find \"+cname);\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tif(!inherit_proc(sh,*ptci,level))\r\n\t\t\t\treturn false;\r\n\t\t\tv+=ptci->vword;\r\n\t\t}\r\n\t\tv+=tci.vword;\r\n\t\ttci.vword=r_move(v);\r\n\t\treturn true;\r\n\t}\r\n};\r\n\r\n#endif"
  },
  {
    "path": "rpp/zcontrol.h",
    "content": "﻿#ifndef zcontrol_h__\r\n#define zcontrol_h__\r\n\r\n#include \"tsh.h\"\r\n#include \"zctl.h\"\r\n#include \"zclass.h\"\r\n\r\n//替换控制结构并生成语句表，包括return\r\n//tfunc.vword->vsent\r\nstruct zcontrol\r\n{\r\n\tstatic rbool proc_func(tsh& sh,tfunc& tfi)\r\n\t{\r\n\t\tzclass::arrange_format(sh,tfi.vword,&tfi);\r\n\t\tinsert_end_statement(sh,tfi,tfi.vword);\r\n\t\tif(!ifn_replace(sh,tfi.vword))\r\n\t\t\treturn false;\r\n\t\tif(!switch_replace(sh,tfi.vword))\r\n\t\t\treturn false;\r\n\t\tif(!auto_bbk(sh,tfi.vword,tfi))\r\n\t\t\treturn false;\r\n\t\tif(!replace_for_to(sh,tfi.vword))\r\n\t\t\treturn false;\r\n\t\tif(!proc_continue(sh,tfi.vword))\r\n\t\t\treturn false;\r\n\t\tif(!proc_break(sh,tfi.vword))\r\n\t\t\treturn false;\r\n\t\tif(!proc_for(sh,tfi.vword))\r\n\t\t\treturn false;\r\n\t\tif(!proc_if(sh,tfi.vword))\r\n\t\t\treturn false;\r\n\t\tif(!proc_bbk(sh,tfi.vword))\r\n\t\t\treturn false;\r\n\t\tif(!obtain_sent(sh,tfi.vword,tfi.vsent))\r\n\t\t\treturn false;\r\n\t\tproc_return(sh,tfi.vsent,tfi);\r\n\t\tpart_vsent(tfi);\r\n\t\ttag_replace(sh,tfi);\r\n\t\treturn true;\r\n\t}\r\n\r\n\tstatic rbool ifn_replace(tsh& sh,rbuf<tword>& v)\r\n\t{\r\n\t\tfor(int i=0;i<v.count();i++)\r\n\t\t{\r\n\t\t\tif(v[i].val!=rppkey(c_ifn))\r\n\t\t\t\tcontinue;\r\n\t\t\trbuf<tword> vcond;\r\n\t\t\tint pos=get_condition_end(sh,v,i,&vcond);\r\n\t\t\tif(pos>=v.count())\r\n\t\t\t{\r\n\t\t\t\tsh.error(v[i]);\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\tsh.clear_word_val(v,i,pos);\r\n\t\t\tv[i].multi.push(\"if\");\r\n\t\t\tv[i].multi.push(\"!\");\r\n\t\t\tv[i].multi.push(\"(\");\r\n\t\t\tv[i].multi+=sh.vword_to_vstr(vcond);\r\n\t\t\tv[i].multi.push(\")\");\r\n\t\t}\r\n\t\tzpre::arrange(v);\r\n\t\treturn true;\r\n\t}\r\n\r\n\tstatic rbool switch_replace(tsh& sh,rbuf<tword>& v)\r\n\t{\r\n\t\tfor(int i=0;i<v.count();i++)\r\n\t\t{\r\n\t\t\tif(v[i].val!=rppkey(c_switch))\r\n\t\t\t\tcontinue;\r\n\t\t\trbuf<tword> vcond;\r\n\t\t\tint pos=get_condition_end(sh,v,i,&vcond);\r\n\t\t\tif(pos>=v.count())\r\n\t\t\t{\r\n\t\t\t\tsh.error(v[i]);\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\tsh.clear_word_val(v,i,pos);\r\n\t\t\tif(v[pos]==rppoptr(c_bbk_l))//只跳过不清除\r\n\t\t\t\tpos++;\r\n\t\t\trbool first=true;\r\n\t\t\tint left;\r\n\t\t\tint right;\r\n\t\t\tfor(;pos<v.count();)\r\n\t\t\t{\r\n\t\t\t\tif(v[pos]!=rppkey(c_case)&&v[pos]!=rppkey(c_else))\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tleft=get_condition_end(sh,v,pos);\r\n\t\t\t\tif(left>=v.count())\r\n\t\t\t\t{\r\n\t\t\t\t\tsh.error(v[pos]);\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t}\r\n\t\t\t\tif(v.get(left)==rppoptr(c_bbk_l))\r\n\t\t\t\t{\r\n\t\t\t\t\tright=sh.find_symm_bbk(v,left);\r\n\t\t\t\t\tif(right>=v.count())\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tsh.error(v[pos]);\r\n\t\t\t\t\t\treturn false;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\telse\r\n\t\t\t\t{\r\n\t\t\t\t\tright=get_low_end(v,left,pos);\r\n\t\t\t\t\tif(right>=v.count())\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tsh.error(v[pos]);\r\n\t\t\t\t\t\treturn false;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tright--;\r\n\t\t\t\t\tif(left>right)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tsh.error(v[pos]);\r\n\t\t\t\t\t\treturn false;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\trbuf<tword> val;\r\n\t\t\t\tif(v[left-1]==rppoptr(c_colon))\r\n\t\t\t\t{\r\n\t\t\t\t\tval=v.sub(pos+1,left-1);\r\n\t\t\t\t}\r\n\t\t\t\telse\r\n\t\t\t\t\tval=v.sub(pos+1,left);\r\n\t\t\t\tif(v[pos]==rppkey(c_case))\r\n\t\t\t\t{\r\n\t\t\t\t\tif(first)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tv[pos].multi.push(rppkey(c_if));\r\n\t\t\t\t\t\tfirst=false;\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tv[pos].multi.push(rppkey(c_else));\r\n\t\t\t\t\t\tv[pos].multi.push(rppkey(c_if));\r\n\t\t\t\t\t}\r\n\t\t\t\t\tv[pos].multi+=sh.vword_to_vstr(val);\r\n\t\t\t\t\tv[pos].multi.push(rppoptr(c_equalequal));\r\n\t\t\t\t\tv[pos].multi.push(rppoptr(c_sbk_l));\r\n\t\t\t\t\tv[pos].multi+=sh.vword_to_vstr(vcond);\r\n\t\t\t\t\tv[pos].multi.push(rppoptr(c_sbk_r));\r\n\t\t\t\t}\r\n\t\t\t\telse\r\n\t\t\t\t{\r\n\t\t\t\t\tv[pos].multi.push(rppkey(c_else));\r\n\t\t\t\t}\r\n\t\t\t\tsh.clear_word_val(v,pos,left);\r\n\t\t\t\tpos=right+1;\r\n\t\t\t}\r\n\t\t}\r\n\t\tzpre::arrange(v);\r\n\t\treturn true;\r\n\t}\r\n\r\n\tstatic rbool auto_bbk(tsh& sh,rbuf<tword>& v,tfunc& tfi)\r\n\t{\r\n\t\tif(!rppconf(c_auto_bbk))\r\n\t\t{\r\n\t\t\tv.top().pos.line=tfi.last_pos.line;//what?\r\n\t\t\treturn true;\r\n\t\t}\r\n\t\tfor(int i=0;i<c_rpp_deep;i++)\r\n\t\t{\r\n\t\t\tif(!auto_bbk_one(sh,v))\r\n\t\t\t\treturn false;\r\n\t\t\trbool need;\r\n\t\t\tzpre::arrange(v,&need);\r\n\t\t\tzclass::arrange_format(sh,v,&tfi);\r\n\t\t\tif(!need)\r\n\t\t\t{\r\n\t\t\t\treturn true;\r\n\t\t\t}\r\n\t\t\tv.top().pos.line=tfi.last_pos.line;\r\n\t\t}\r\n\t\tsh.error(tfi,\"auto bbk too deep\");\r\n\t\treturn false;\r\n\t}\r\n\r\n\tstatic rbool auto_bbk_one(tsh& sh,rbuf<tword>& v)\r\n\t{\r\n\t\tfor(int i=0;i<v.count();i++)\r\n\t\t{\r\n\t\t\tint begin;\r\n\t\t\tif(v[i].val==rppkey(c_else)&&\r\n\t\t\t\tv.get(i+1).val!=rppkey(c_if))\r\n\t\t\t{\r\n\t\t\t\tbegin=i+1;\r\n\t\t\t}\r\n\t\t\telif(v[i].val==rppkey(c_if)||\r\n\t\t\t\tv[i].val==rppkey(c_for))\r\n\t\t\t{\r\n\t\t\t\tbegin=get_condition_end(sh,v,i);\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\t\t\tif(begin>=v.count())\r\n\t\t\t{\r\n\t\t\t\tsh.error(v[i],\"miss { or miss tab\");\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\tif(v[begin].val==rppoptr(c_bbk_l))\r\n\t\t\t\tcontinue;\r\n\t\t\tint end=get_low_end(v,begin,i);\r\n\t\t\tif(end>=v.count())\r\n\t\t\t{\r\n\t\t\t\tsh.error(v[i],\"miss { or miss tab\");\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\tif(begin>=end)\r\n\t\t\t{\r\n\t\t\t\tsh.error(v[i],\"miss { or miss tab\");\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\tv[begin].multi.push(rppoptr(c_bbk_l));\r\n\t\t\tv[begin].multi.push(v[begin].val);\r\n\t\t\tv[begin].val.clear();\r\n\t\t\tv[end].multi.push(rppoptr(c_bbk_r));\r\n\t\t\tv[end].multi.push(v[end].val);\r\n\t\t\tv[end].val.clear();\r\n\t\t\treturn true;\r\n\t\t}\r\n\t\treturn true;\r\n\t}\r\n\r\n\tstatic void tag_replace(tsh& sh,tfunc& tfi)\r\n\t{\r\n\t\trbuf<tword> vtag;\r\n\t\tfor(int i=0;i<tfi.vsent.count();i++)\r\n\t\t{\r\n\t\t\tif(tfi.vsent[i].vword.get(1).val!=rppoptr(c_colon)||\r\n\t\t\t\t!tfi.vsent[i].vword.get(0).is_name())\r\n\t\t\t{\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\t\t\ttword word=tfi.vsent[i].vword.get(0);\r\n\t\t\tword.pos.line=tfi.vsent[i].pos.line;\r\n\t\t\tvtag.push(word);\r\n\t\t\ttfi.vsent[i].vword[0].clear();\r\n\t\t\ttfi.vsent[i].vword[1].clear();\r\n\t\t\tzpre::arrange(tfi.vsent[i].vword);\r\n\t\t}\r\n\t\tfor(int i=0;i<tfi.vsent.count();i++)\r\n\t\t\tfor(int j=0;j<tfi.vsent[i].vword.count();j++)\r\n\t\t\t\ttag_replace(tfi.vsent[i].vword[j],vtag);\r\n\t}\r\n\r\n\tstatic void tag_replace(tword& word,rbuf<tword>& vtag)\r\n\t{\r\n\t\tfor(int i=0;i<vtag.count();i++)\r\n\t\t\tif(word.val==vtag[i].val)\r\n\t\t\t\tword.val=rstr(vtag[i].pos.line);\r\n\t}\r\n\r\n\tstatic void part_vsent(tfunc& tfi)\r\n\t{\r\n\t\tpart_vsent(tfi.vsent);\r\n\t}\r\n\r\n\tstatic void part_vsent(rbuf<tsent>& vsent)\r\n\t{\r\n\t\tif(!need_part(vsent))\r\n\t\t\treturn;\r\n\t\trbuf<tsent> result(vsent.count()*2);\r\n\t\tresult.m_count=0;\r\n\t\tfor(int i=0;i<vsent.count();++i)\r\n\t\t{\r\n\t\t\trbuf<rbuf<tword> > temp=r_split(\r\n\t\t\t\tvsent[i].vword,tword(rstr(\";\")));\r\n\t\t\tif(temp.empty())\r\n\t\t\t{\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\t\t\ttsent sent;\r\n\t\t\tsent.pos=vsent[i].pos;\r\n\t\t\tfor(int j=0;j<temp.count();j++)\r\n\t\t\t{\r\n\t\t\t\tsent.vword=r_move(temp[j]);\r\n\t\t\t\tresult.push_move(sent);\r\n\t\t\t}\r\n\t\t}\r\n\t\tvsent=r_move(result);\r\n\t}\r\n\r\n\tstatic rbool need_part(rbuf<tsent>& v)\r\n\t{\r\n\t\tfor(int i=0;i<v.count();i++)\r\n\t\t{\r\n\t\t\tif(v[i].vword.count()==0)\r\n\t\t\t\treturn true;\r\n\t\t\tfor(int j=0;j<v[i].vword.count();j++)\r\n\t\t\t\tif(v[i].vword[j].val==rstr(\";\"))\r\n\t\t\t\t\treturn true;\r\n\t\t}\r\n\t\treturn false;\r\n\t}\r\n\r\n\tstatic void proc_return(tsh& sh,rbuf<tsent>& vsent,tfunc& tfi)\r\n\t{\r\n\t\tfor(int i=0;i<vsent.count();i++)\r\n\t\t{\r\n\t\t\tproc_return_v(sh,vsent[i].vword,tfi);\r\n\t\t}\r\n\t}\r\n\r\n\tstatic void proc_return_v(tsh& sh,rbuf<tword>& v,tfunc& tfi)\r\n\t{\r\n\t\tif(v.get_bottom().val!=rppkey(c_return))\r\n\t\t\treturn;\r\n\t\ttword twi;\r\n\t\ttwi.pos_src=tfi.last_pos;\r\n\t\ttwi.pos=tfi.last_pos;\r\n\t\tif(1==v.count())\r\n\t\t{\r\n\t\t\tv.clear();\r\n\t\t\tsh.push_twi(v,twi,rppkey(c_jmp));\r\n\t\t\tsh.push_twi(v,twi,tfi.last_pos.line);\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tif(sh.is_quote(tfi.retval.type))\r\n\t\t{\r\n\t\t\trbuf<tword> vtemp;\r\n\t\t\tsh.push_twi(vtemp,twi,rppoptr(c_addr));\r\n\t\t\tsh.push_twi(vtemp,twi,rppoptr(c_sbk_l));\r\n\t\t\tvtemp+=v.sub(1);\r\n\t\t\tsh.push_twi(vtemp,twi,rppoptr(c_sbk_r));\r\n\t\t\tsh.push_twi(vtemp,twi,rppoptr(c_semi));\r\n\t\t\tsh.push_twi(vtemp,twi,rppkey(c_mov));\r\n\t\t\tsh.push_twi(vtemp,twi,rppoptr(c_mbk_l));\r\n\t\t\tsh.push_twi(vtemp,twi,rppkey(c_ebp));\r\n\t\t\tsh.push_twi(vtemp,twi,rppoptr(c_plus));\r\n\t\t\tsh.push_twi(vtemp,twi,rppkey(c_s_off));\r\n\t\t\tsh.push_twi(vtemp,twi,tfi.retval.name);\r\n\t\t\tsh.push_twi(vtemp,twi,rppoptr(c_mbk_r));\r\n\t\t\tsh.push_twi(vtemp,twi,rppoptr(c_comma));\r\n\t\t\tsh.push_twi(vtemp,twi,rppkey(c_ebx));\r\n\t\t\tsh.push_twi(vtemp,twi,rppoptr(c_semi));\r\n\t\t\tsh.push_twi(vtemp,twi,rppkey(c_jmp));\r\n\t\t\tsh.push_twi(vtemp,twi,tfi.last_pos.line);\r\n\t\t\tv=r_move(vtemp);\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\trbuf<tword> vtemp;\r\n\t\t\tsh.push_twi(vtemp,twi,tfi.retval.name);\r\n\t\t\tsh.push_twi(vtemp,twi,rppoptr(c_sbk_l));\r\n\t\t\tsh.push_twi(vtemp,twi,rppoptr(c_sbk_l));\r\n\t\t\tvtemp+=v.sub(1);\r\n\t\t\tsh.push_twi(vtemp,twi,rppoptr(c_sbk_r));\r\n\t\t\tsh.push_twi(vtemp,twi,rppoptr(c_sbk_r));\r\n\t\t\tsh.push_twi(vtemp,twi,rppoptr(c_semi));\r\n\t\t\tsh.push_twi(vtemp,twi,rppkey(c_jmp));\r\n\t\t\tsh.push_twi(vtemp,twi,tfi.last_pos.line);\r\n\t\t\tv=r_move(vtemp);\r\n\t\t}\r\n\t}\r\n\r\n\tstatic rbool obtain_sent(tsh& sh,rbuf<tword>& v,rbuf<tsent>& vsent)\r\n\t{\r\n\t\tint start=0;\r\n\t\tfor(int i=0;i<v.count();++i)\r\n\t\t{\r\n\t\t\tif(v[i].val==rppoptr(c_semi))\r\n\t\t\t{\r\n\t\t\t\ttsent sent;\r\n\t\t\t\tsent.vword=v.sub(start,i);\r\n\t\t\t\tif(!sent.vword.empty())\r\n\t\t\t\t{\r\n\t\t\t\t\tsent.pos=sent.vword.get_bottom().pos;\r\n\t\t\t\t\tvsent.push_move(sent);\r\n\t\t\t\t}\r\n\t\t\t\tstart=i+1;\r\n\t\t\t}\r\n\t\t\telif(i>0&&v[i-1].pos.line!=v[i].pos.line)\r\n\t\t\t{\r\n\t\t\t\ttsent sent;\r\n\t\t\t\tsent.vword=v.sub(start,i);\r\n\t\t\t\tif(!sent.vword.empty())\r\n\t\t\t\t{\r\n\t\t\t\t\tsent.pos=sent.vword.get_bottom().pos;\r\n\t\t\t\t\tvsent.push_move(sent);\r\n\t\t\t\t}\r\n\t\t\t\tv[i-1].pos.line=v[i].pos.line;\r\n\t\t\t\tstart=i;\r\n\t\t\t\t--i;\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn true;\r\n\t}\r\n\r\n\tstatic rbool proc_bbk(tsh& sh,rbuf<tword>& v)\r\n\t{\r\n\t\tfor(int i=0;i<v.count();i++)\r\n\t\t{\r\n\t\t\tif(v[i].val!=rppoptr(c_bbk_l))\r\n\t\t\t{\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\t\t\tint left=i;\r\n\t\t\tint right=sh.find_symm_bbk(v,left);\r\n\t\t\tif(right>=v.count())\r\n\t\t\t{\r\n\t\t\t\tsh.error(v.get(i),\"miss }\");\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\tv[left].val.clear();\r\n\t\t\tv[right].val.clear();\r\n\t\t\tv[right].multi.push(rppoptr(c_semi));\r\n\t\t\tv[right].multi.push(rppkey(c_nop));\r\n\t\t}\r\n\t\tzpre::arrange(v);\r\n\t\treturn true;\r\n\t}\r\n\r\n\tstatic int find_else_end(tsh& sh,rbuf<tword>& v,int begin)\r\n\t{\r\n\t\twhile(true)\r\n\t\t{\r\n\t\t\tif(begin>=v.count())\r\n\t\t\t\treturn v.count();\r\n\t\t\tif(v.get(begin).val==rppkey(c_else)&&\r\n\t\t\t\tv.get(begin+1).val==rppkey(c_if))\r\n\t\t\t{\r\n\t\t\t\tint left=r_find_pos(v,tword(rppoptr(c_bbk_l)),begin+2);\r\n\t\t\t\tif(left==v.count())\r\n\t\t\t\t\treturn v.count();\r\n\t\t\t\tint right=sh.find_symm_bbk(v,left);\r\n\t\t\t\tif(right>=v.count())\r\n\t\t\t\t\treturn v.count();\r\n\t\t\t\tbegin=right+1;\r\n\t\t\t}\r\n\t\t\telif(v.get(begin).val==rppkey(c_else))\r\n\t\t\t{\r\n\t\t\t\tint left=r_find_pos(v,tword(rppoptr(c_bbk_l)),begin+1);\r\n\t\t\t\tif(left==v.count())\r\n\t\t\t\t\treturn v.count();\r\n\t\t\t\tint right=sh.find_symm_bbk(v,left);\r\n\t\t\t\tif(right>=v.count())\r\n\t\t\t\t\treturn v.count();\r\n\t\t\t\treturn right+1;\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t\treturn begin;\r\n\t\t}\r\n\t}\r\n\r\n\tstatic rbool proc_if(tsh& sh,rbuf<tword>& v)\r\n\t{\r\n\t\tfor(int i=0;i<v.count();i++)\r\n\t\t{\r\n\t\t\tif(v[i].val!=rppkey(c_if))\r\n\t\t\t{\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\t\t\tint cond_end;\r\n\t\t\trbuf<tword> vcond;\r\n\t\t\tcond_end=get_condition_end(sh,v,i,&vcond);\r\n\t\t\tif(vcond.empty())\r\n\t\t\t{\r\n\t\t\t\tsh.error(v.get(i),\"miss cond\");\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\tint left=cond_end;\r\n\t\t\tif(v.get(left).val!=rppoptr(c_bbk_l))\r\n\t\t\t{\r\n\t\t\t\tsh.error(v.get(i),\"miss {\");\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\tint right=sh.find_symm_bbk(v,left);\r\n\t\t\tif(right>=v.count())\r\n\t\t\t{\r\n\t\t\t\tsh.error(v.get(i),\"miss }\");\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\tint else_end=find_else_end(sh,v,right+1);\r\n\t\t\tif(else_end==v.count())\r\n\t\t\t{\r\n\t\t\t\tsh.error(v.get(i),\"miss else end\");\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\tif(v.get(right+1).val==rppkey(c_else))\r\n\t\t\t{\r\n\t\t\t\tinsert_jmp_asm(sh,v[right],v[else_end]);\r\n\t\t\t\tv[right+1].val.clear();\r\n\t\t\t}\r\n\t\t\tv[left].multi=sh.vword_to_vstr(vcond);\r\n\t\t\tinsert_cond_false_asm(sh,v[left].multi,v.get(right+1));\r\n\t\t\tsh.clear_word_val(v,i,cond_end);\r\n\t\t\tv[left].val.clear();\r\n\t\t\tv[right].val.clear();\r\n\t\t\tv[right].multi.push(rppoptr(c_semi));\r\n\t\t\tv[right].multi.push(rppkey(c_nop));\r\n\t\t}\r\n\t\treturn true;\r\n\t}\r\n\r\n\tstatic rbool proc_for(tsh& sh,rbuf<tword>& v)\r\n\t{\r\n\t\tfor(int i=0;i<v.count();i++)\r\n\t\t{\r\n\t\t\tif(v[i].val!=rppkey(c_for))\r\n\t\t\t\tcontinue;\r\n\t\t\tint cond_end;\r\n\t\t\trbuf<tword> vcond;\r\n\t\t\tcond_end=get_condition_end(sh,v,i,&vcond);\r\n\t\t\tif(vcond.empty())\r\n\t\t\t{\r\n\t\t\t\ttword twi=v[i];\r\n\t\t\t\ttwi.val=1;\r\n\t\t\t\tvcond.push(twi);\r\n\t\t\t}\r\n\t\t\trbool is_for=true;\r\n\t\t\tif(r_find_pos(vcond,tword(rppoptr(c_semi)))>=vcond.count())\r\n\t\t\t{\r\n\t\t\t\tis_for=false;\r\n\t\t\t}\r\n\t\t\tint left=cond_end;\r\n\t\t\tif(v.get(left).val!=rppoptr(c_bbk_l))\r\n\t\t\t{\r\n\t\t\t\tsh.error(v.get(i),\"miss {\");\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\tint right=sh.find_symm_bbk(v,left);\r\n\t\t\tif(right>=v.count())\r\n\t\t\t{\r\n\t\t\t\tsh.error(v.get(i),\"miss }\");\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\tif(is_for)\r\n\t\t\t{\r\n\t\t\t\trbuf<rbuf<tword> > forcond=r_split_e(\r\n\t\t\t\t\tvcond,tword(rppoptr(c_semi)));\r\n\t\t\t\tif(forcond.count()!=3)\r\n\t\t\t\t{\r\n\t\t\t\t\tsh.error(v.get(i),\"miss for cond\");\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t}\r\n\t\t\t\tif(forcond[1].empty())\r\n\t\t\t\t{\r\n\t\t\t\t\ttword twi=v[i];\r\n\t\t\t\t\ttwi.val=1;\r\n\t\t\t\t\tforcond[1].push(twi);\r\n\t\t\t\t}\r\n\t\t\t\tv[i].val.clear();\r\n\t\t\t\tv[i].multi=sh.vword_to_vstr(forcond[0]);\r\n\t\t\t\tv[left].val.clear();\r\n\t\t\t\tv[left].multi=sh.vword_to_vstr(forcond[1]);\r\n\t\t\t\tinsert_cond_false_asm(sh,v[left].multi,v.get(right+1));\r\n\t\t\t\tv[right].val.clear();\r\n\t\t\t\tv[right].multi=sh.vword_to_vstr(forcond[2]);\r\n\t\t\t\tinsert_jmp_asm(sh,v[right],v[left]);\r\n\t\t\t\tsh.clear_word_val(v,i,cond_end);\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\tv[left].multi=sh.vword_to_vstr(vcond);\r\n\t\t\t\tinsert_cond_false_asm(sh,v[left].multi,v.get(right+1));\r\n\t\t\t\tv[left].val.clear();\r\n\t\t\t\tinsert_jmp_asm(sh,v[right],v[left]);\r\n\t\t\t\tv[right].val.clear();\r\n\t\t\t\tsh.clear_word_val(v,i,cond_end);\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn true;\r\n\t}\r\n\r\n\tstatic void insert_jmp_asm(tsh& sh,tword& word,const tword& posword)\r\n\t{\r\n\t\tword.multi.push(rppoptr(c_semi));\r\n\t\tword.multi.push(rppkey(c_jmp));\r\n\t\tword.multi.push(rstr(posword.pos.line));\r\n\t}\r\n\r\n\tstatic void insert_cond_true_asm(tsh& sh,rbuf<rstr>& multi,\r\n\t\tconst tword& posword)\r\n\t{\r\n\t\tmulti.push(rppoptr(c_semi));\r\n\t\tmulti.push(rppkey(c_jebxnz));\r\n\t\tmulti.push(rstr(posword.pos.line));\r\n\t}\r\n\r\n\tstatic void insert_cond_false_asm(tsh& sh,rbuf<rstr>& multi,\r\n\t\tconst tword& posword)\r\n\t{\r\n\t\tmulti.push(rppoptr(c_semi));\r\n\t\tmulti.push(rppkey(c_jebxz));\r\n\t\tmulti.push(rstr(posword.pos.line));\r\n\t}\r\n\r\n\tstatic int find_jump_out(tsh& sh,rbuf<tword>& v,int i)\r\n\t{\r\n\t\tint j;\r\n\t\tfor(j=i-1;j>=0;--j)\r\n\t\t{\r\n\t\t\tif(v[j].val!=rppkey(c_for))\r\n\t\t\t{\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\t\t\tint left=get_condition_end(sh,v,j);\r\n\t\t\tif(left>=v.count())\r\n\t\t\t\treturn -2;\r\n\t\t\tif(v[left]!=rppoptr(c_bbk_l))\r\n\t\t\t\treturn -2;\r\n\t\t\tint right=sh.find_symm_bbk(v,left);\r\n\t\t\tif(right>=v.count())\r\n\t\t\t\treturn -2;\r\n\t\t\tif(i>left&&i<right)\r\n\t\t\t\tbreak;\r\n\t\t}\r\n\t\treturn j;\r\n\t}\r\n\r\n\tstatic rbool proc_continue(tsh& sh,rbuf<tword>& v)\r\n\t{\r\n\t\tfor(int i=0;i<v.count();i++)\r\n\t\t{\r\n\t\t\tif(v[i].val!=rppkey(c_continue)&&\r\n\t\t\t\tv[i].val!=rppkey(c_continued))\r\n\t\t\t{\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\t\t\tint j=find_jump_out(sh,v,i);\r\n\t\t\tif(j<0)\r\n\t\t\t{\r\n\t\t\t\tsh.error(v.get(i),\"no loop sturct\");\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\trbuf<tword> vcond;\r\n\t\t\tint cond_end=get_condition_end(sh,v,j,&vcond);\r\n\t\t\trbool is_for=true;\r\n\t\t\tif(r_find_pos(vcond,tword(rppoptr(c_semi)))>=vcond.count())\r\n\t\t\t{\r\n\t\t\t\tis_for=false;\r\n\t\t\t}\r\n\t\t\tint left=r_find_pos(v,tword(rppoptr(c_bbk_l)),cond_end);\r\n\t\t\tif(left>=v.count())\r\n\t\t\t{\r\n\t\t\t\tsh.error(v.get(j),\"miss {\");\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\tint right=sh.find_symm_bbk(v,left);\r\n\t\t\tif(right==0||right+1>=v.count())\r\n\t\t\t{\r\n\t\t\t\tsh.error(v.get(j),\"miss }\");\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\tif(is_for)\r\n\t\t\t{\r\n\t\t\t\tif(v[i].val==rppkey(c_continue))\r\n\t\t\t\t{\r\n\t\t\t\t\tinsert_jmp_asm(sh,v[i],v[right]);\r\n\t\t\t\t\tv[i].val.clear();\r\n\t\t\t\t}\r\n\t\t\t\telse\r\n\t\t\t\t{\r\n\t\t\t\t\tinsert_jmp_asm(sh,v[i],v[left]);\r\n\t\t\t\t\tv[i].val.clear();\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\tinsert_jmp_asm(sh,v[i],v[left]);\r\n\t\t\t\tv[i].val.clear();\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn true;\r\n\t}\r\n\r\n\tstatic rbool proc_break(tsh& sh,rbuf<tword>& v)\r\n\t{\r\n\t\tfor(int i=0;i<v.count();i++)\r\n\t\t{\r\n\t\t\tif(v[i].val!=rppkey(c_break))\r\n\t\t\t{\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\t\t\tint j=find_jump_out(sh,v,i);\r\n\t\t\tif(j<0)\r\n\t\t\t{\r\n\t\t\t\tsh.error(v.get(i),\"no loop sturct\");\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\tint left=r_find_pos(v,tword(rppoptr(c_bbk_l)),j);\r\n\t\t\tint right=sh.find_symm_bbk(v,left);\r\n\t\t\tif(right==0||right+1>=v.count())\r\n\t\t\t{\r\n\t\t\t\tsh.error(v.get(j),\"miss { or }\");\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\tinsert_jmp_asm(sh,v[i],v[right+1]);\r\n\t\t\tv[i].val.clear();\r\n\t\t}\r\n\t\treturn true;\r\n\t}\r\n\r\n\tstatic int get_word_tab(tword& word)\r\n\t{\r\n\t\ttpos pos=word.pos_src;\r\n\t\tif(pos.file==null)\r\n\t\t{\r\n\t\t\trf::printl(\"pos file null\");\r\n\t\t\treturn -1;\r\n\t\t}\r\n\t\tif(pos.line>=pos.file->tab_list.count())\r\n\t\t{\r\n\t\t\trf::printl(\"pos file null\");\r\n\t\t\treturn -1;\r\n\t\t}\r\n\t\treturn pos.file->tab_list[pos.line];\r\n\t}\r\n\r\n\t//获取低一层结尾语句的位置\r\n\tstatic int get_low_end(rbuf<tword>& v,int begin,int head)\r\n\t{\r\n\t\tif(v.get(begin).val.empty())\r\n\t\t\treturn v.count();\r\n\t\tfor(int i=begin;i<v.count();i++)\r\n\t\t{\r\n\t\t\tif(get_word_tab(v[i])<=get_word_tab(v[head]))\r\n\t\t\t{\r\n\t\t\t\treturn i;\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn v.count();\r\n\t}\r\n\r\n\t//begin应该是条件关键字的位置\r\n\tstatic int get_condition_end(tsh& sh,rbuf<tword>& v,\r\n\t\tint begin,rbuf<tword>* pret=null)\r\n\t{\r\n\t\tif(v.get(begin).val.empty())\r\n\t\t\treturn v.count();\r\n\t\tint i;\r\n\t\tfor(i=begin+1;i<v.count();i++)\r\n\t\t{\r\n\t\t\tif(v[i].pos!=v[begin].pos)\r\n\t\t\t\tbreak;\r\n\t\t}\r\n\t\trbuf<tword> ret;\r\n\t\tif(i>=v.count())\r\n\t\t{\r\n\t\t\tif(pret!=null)\r\n\t\t\t{\r\n\t\t\t\t*pret=r_move(ret);\r\n\t\t\t}\r\n\t\t\treturn v.count();\r\n\t\t}\r\n\t\tif(pret!=null)\r\n\t\t{\r\n\t\t\tret=v.sub(begin+1,i);\r\n\t\t\tif(ret.get_bottom()==rppoptr(c_sbk_l)&&\r\n\t\t\t\tret.get_top()==rppoptr(c_sbk_r))\r\n\t\t\t{\r\n\t\t\t\tret.pop_front();\r\n\t\t\t\tret.pop();\r\n\t\t\t}\r\n\t\t\t*pret=r_move(ret);\r\n\t\t}\r\n\t\treturn i;\r\n\t}\r\n\r\n\t//fixme fot..to条件带括号有问题\r\n\tstatic rbool replace_for_to(tsh& sh,rbuf<tword>& v)\r\n\t{\r\n\t\tfor(int i=0;i<v.count();i++)\r\n\t\t{\r\n\t\t\tif(v[i].val!=rppkey(c_for))\r\n\t\t\t{\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\t\t\trbuf<tword> vcond;\r\n\t\t\tint cond_end=get_condition_end(sh,v,i,&vcond);\r\n\t\t\tint topos=r_find_pos(vcond,tword(rppkey(c_to)));\r\n\t\t\tif(topos<vcond.count())\r\n\t\t\t{\r\n\t\t\t\tint assignpos=r_find_pos(\r\n\t\t\t\t\tvcond,tword(rppoptr(c_equal)));\r\n\t\t\t\tif(assignpos==vcond.count())\r\n\t\t\t\t{\r\n\t\t\t\t\tsh.error(v.get(i),\"for to miss assign optr\");\r\n\t\t\t\t\tvcond.print();\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t}\r\n\t\t\t\trstr name=vcond.get(assignpos-1).val;\r\n\t\t\t\tif(name.empty())\r\n\t\t\t\t{\r\n\t\t\t\t\tsh.error(v.get(i),\"for to miss assign name\");\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t}\r\n\t\t\t\tv[i].multi.push(rstr(\"for\"));\r\n\t\t\t\tv[i].multi.push(rstr(\"(\"));\r\n\t\t\t\tfor(int j=0;j<topos;j++)\r\n\t\t\t\t\tv[i].multi.push(vcond[j].val);\r\n\t\t\t\tv[i].multi.push(rppoptr(c_semi));\r\n\t\t\t\tv[i].multi.push(name);\r\n\t\t\t\tv[i].multi.push(rstr(\"<=\"));\r\n\t\t\t\tfor(int j=topos+1;j<vcond.count();j++)\r\n\t\t\t\t\tv[i].multi.push(vcond[j].val);\r\n\t\t\t\tv[i].multi.push(rppoptr(c_semi));\r\n\t\t\t\tv[i].multi.push(rstr(\"++\"));\r\n\t\t\t\tv[i].multi.push(name);\r\n\t\t\t\tv[i].multi.push(rstr(\")\"));\r\n\t\t\t\tsh.clear_word_val(v,i,cond_end);\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\t\t\tint inpos=r_find_pos(vcond,tword(rppkey(c_in)));\r\n\t\t\tif(inpos<vcond.count())\r\n\t\t\t{\r\n\t\t\t\trstr var=vcond.get(0).val;\r\n\t\t\t\trbuf<rstr> vset=sh.vword_to_vstr(vcond.sub(2));\r\n\t\t\t\tif(var.empty()||vset.empty())\r\n\t\t\t\t{\r\n\t\t\t\t\tsh.error(v.get(i),\"for in miss name or set\");\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t}\r\n\t\t\t\tsh.clear_word_val(v,i,cond_end);\r\n\t\t\t\tv[i].multi.push(rstr(\"for\"));\r\n\t\t\t\tv[i].multi.push(rstr(\"(\"));\r\n\t\t\t\tv[i].multi+=var;\r\n\t\t\t\tv[i].multi+=rstr(\"=\");\r\n\t\t\t\tv[i].multi+=rstr(\"0\");\r\n\t\t\t\tv[i].multi+=rstr(\";\");\r\n\t\t\t\tv[i].multi+=var;\r\n\t\t\t\tv[i].multi+=rstr(\"<\");\r\n\t\t\t\tv[i].multi+=vset;\r\n\t\t\t\tv[i].multi+=rstr(\".\");\r\n\t\t\t\tv[i].multi+=rstr(\"count\");\r\n\t\t\t\tv[i].multi+=rstr(\"(\");\r\n\t\t\t\tv[i].multi+=rstr(\")\");\r\n\t\t\t\tv[i].multi+=rstr(\";\");\r\n\t\t\t\tv[i].multi+=rstr(\"++\");\r\n\t\t\t\tv[i].multi+=var;\r\n\t\t\t\tv[i].multi+=rstr(\")\");\r\n\t\t\t}\r\n\t\t}\r\n\t\tzpre::arrange(v);\r\n\t\treturn true;\r\n\t}\r\n\r\n\tstatic void insert_end_statement(tsh& sh,tfunc& tfi,rbuf<tword>& v)\r\n\t{\r\n\t\ttword item;\r\n\t\titem.pos=tfi.last_pos;\r\n\t\titem.pos_src=tfi.last_pos;\r\n\t\titem.pos_src.line=0;\r\n\t\titem.val=rppoptr(c_semi);\r\n\t\tv.push_move(item);\r\n\t}\r\n};\r\n\r\n#endif"
  },
  {
    "path": "rpp/zctl.h",
    "content": "﻿#ifndef zctl_h__\r\n#define zctl_h__\r\n\r\n#include \"tsh.h\"\r\n#include \"zpre.h\"\r\n#include \"zfind.h\"\r\n#include \"zclass.h\"\r\n#include \"zmac.h\"\r\n#include \"zautof.h\"\r\n#include \"zmemb.h\"\r\n\r\n//进行类模板替换，增加了一些新类\r\nstruct zctl\r\n{\r\n\tstatic rbool process(tsh& sh)\r\n\t{\r\n\t\trbuf<tclass*> vtmp;\r\n\t\tfor(tclass* p=sh.m_class.begin();\r\n\t\t\tp!=sh.m_class.end();p=sh.m_class.next(p))\r\n\t\t{\r\n\t\t\tzclass::combine_multi_class_name(sh,p->vword);\r\n\t\t\tvtmp.push(p);\r\n\t\t}\r\n\t\tfor(int i=0;i<vtmp.count();i++)\r\n\t\t{\r\n\t\t\tifn(type_replace(sh,vtmp[i]->vword,0))\r\n\t\t\t{\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t}\r\n\t\tvtmp.clear();\r\n\t\tzautof::op_rstr(sh);\r\n\t\tfor(tclass* p=sh.m_class.begin();\r\n\t\t\tp!=sh.m_class.end();p=sh.m_class.next(p))\r\n\t\t{\r\n\t\t\tvtmp.push(p);\r\n\t\t}\r\n\t\tfor(int i=0;i<vtmp.count();i++)\r\n\t\t{\r\n\t\t\tifn(add_point_declare(sh,*vtmp[i]))\r\n\t\t\t{\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t}\r\n\t\tfor(tclass* p=sh.m_class.begin();\r\n\t\t\tp!=sh.m_class.end();p=sh.m_class.next(p))\r\n\t\t\tif(!a_class(sh,*p))\r\n\t\t\t{\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\tfor(tclass* p=sh.m_class.begin();\r\n\t\t\tp!=sh.m_class.end();p=sh.m_class.next(p))\r\n\t\t{\r\n\t\t\tif(!zmemb::recursion_get_size(sh,*p))\r\n\t\t\t\treturn false;\r\n\t\t\tif(p->name==rppkey(c_main))\r\n\t\t\t{\r\n\t\t\t\tsh.m_main_data.set_size(p->size);\r\n\t\t\t}\r\n\t\t}\r\n\t\t//简便起见，重复获取参数大小也没关系\r\n\t\tfor(tclass* p=sh.m_class.begin();\r\n\t\t\tp!=sh.m_class.end();p=sh.m_class.next(p))\r\n\t\t\tzmemb::obtain_size_func(sh,*p);\r\n\t\treturn true;\r\n\t}\r\n\r\n\tstatic rbool add_point_declare(tsh& sh,tclass& tci)\r\n\t{\r\n\t\tif(sh.is_basic_type(tci.name)||tci.is_friend||sh.is_point(tci.name))\r\n\t\t\treturn true;\r\n\t\trbuf<tword> temp;\r\n\t\ttemp+=rppkey(c_rp);\r\n\t\ttemp+=rppoptr(c_tbk_l);\r\n\t\ttemp+=tci.name;\r\n\t\ttemp+=rppoptr(c_tbk_r);\r\n\t\tif(!type_replace(sh,temp))\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\treturn true;\r\n\t}\r\n\t\r\n\t//解析一个类\r\n\tstatic rbool a_class(tsh& sh,tclass& tci)\r\n\t{\r\n\t\tif(tci.vword.empty())\r\n\t\t{\r\n\t\t\treturn true;\r\n\t\t}\r\n\t\tsbk_line_proc(sh,tci.vword,true);\r\n\t\tif(!zmemb::analyse(sh,tci))\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\tifn(zautof::auto_add_func(sh,tci))\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\ttci.vword.free();\r\n\t\treturn true;\r\n\t}\r\n\r\n\tstatic rbool type_replace(tsh& sh,rbuf<tword>& v,int level=0)\r\n\t{\r\n\t\tif(level>c_rpp_deep)\r\n\t\t{\r\n\t\t\tsh.error(\"type level overflow\");\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\tlevel++;\r\n\t\trbool need;\r\n\t\tpoint_replace(sh,v,need);\r\n\t\tfor(int i=1;i<v.count();i++)\r\n\t\t{\r\n\t\t\tif(v[i]!=rppoptr(c_tbk_l))\r\n\t\t\t{\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\t\t\ttclass* pctl=zfind::classtl_search(sh,v[i-1].val);\r\n\t\t\tif(pctl==null)\r\n\t\t\t{\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\t\t\tint left=i;\r\n\t\t\tint right=sh.find_symm_tbk(v,left);\r\n\t\t\tif(right>=v.count())\r\n\t\t\t{\r\n\t\t\t\tsh.error(v[i-1],\"miss >\");\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\trbuf<rbuf<tword> > vparam=sh.comma_split(v.sub(left+1,right));\r\n\t\t\tif(vparam.count()!=pctl->vtl.count())\r\n\t\t\t{\r\n\t\t\t\tsh.error(v[i-1],\"template not match\");\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\tifn(is_type(sh,vparam))\r\n\t\t\t{\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\t\t\tfor(int j=left;j<=right;j++)\r\n\t\t\t{\r\n\t\t\t\tv[left-1].val+=v[j].val;\r\n\t\t\t\tv[j].val.clear();\r\n\t\t\t}\r\n\t\t\ti=right;\r\n\t\t\tif(zfind::is_class(sh,v[left-1].val))\r\n\t\t\t{\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\t\t\ttclass item=*pctl;\r\n\t\t\titem.name=v[left-1].val;\r\n\t\t\titem.vtl.clear();\r\n\t\t\tvtl_replace(item.vword,pctl->vtl,vparam);\r\n\t\t\tsh.m_class.insert(item);\r\n\t\t\ttclass* ptci=zfind::class_search(sh,item.name);\r\n\t\t\tif(ptci==null)\r\n\t\t\t{\r\n\t\t\t\tsh.error(v.get(i),\"can't find class \"+item.name);\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\tifn(type_replace(sh,ptci->vword,level))\r\n\t\t\t{\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t}\r\n\t\tzpre::arrange(v);\r\n\t\tpoint_replace(sh,v,need);\r\n\t\tif(need)\r\n\t\t{\r\n\t\t\tif(!type_replace(sh,v,level))\r\n\t\t\t{\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t}\r\n\t\tcombine_quote(sh,v);\r\n\t\tzclass::arrange_format_l(sh,v);//匿名函数要在这里处理大括号换行\r\n\t\tif(!zpre::op_const_eval(sh,v,false))\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\treturn true;\r\n\t}\r\n\r\n\t//todo 这里应该跳过匿名函数\r\n\tstatic void sbk_line_proc(tsh& sh,rbuf<tword>& v,rbool jump_bbk=false)\r\n\t{\r\n\t\tfor(int i=0;i<v.count();i++)\r\n\t\t{\r\n\t\t\tint right;\r\n\t\t\tif(jump_bbk&&v[i]==rppoptr(c_bbk_l))\r\n\t\t\t{\r\n\t\t\t\tright=sh.find_symm_bbk(v,i);\r\n\t\t\t\tif(right<v.count())\r\n\t\t\t\t{\r\n\t\t\t\t\ti=right;\r\n\t\t\t\t\tcontinue;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tif(v[i]!=rppoptr(c_sbk_l)&&v[i]!=rppoptr(c_mbk_l))\r\n\t\t\t{\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\t\t\tint left=i;\r\n\t\t\tif(v[i]==rppoptr(c_sbk_l))\r\n\t\t\t{\r\n\t\t\t\tright=sh.find_symm_sbk(v,left);\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\tright=sh.find_symm_mbk(v,left);\r\n\t\t\t}\r\n\t\t\tif(right>=v.count())\r\n\t\t\t{\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\t\t\tif(v[right].pos==v[left].pos)\r\n\t\t\t{\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\t\t\tfor(int j=left+1;j<=right;j++)\r\n\t\t\t{\r\n\t\t\t\t//必须归于一行，导致提示行号不准确\r\n\t\t\t\tv[j].pos_src=v[left].pos_src;\r\n\t\t\t\tv[j].pos=v[left].pos;\r\n\t\t\t}\r\n\t\t\ti=right;\r\n\t\t}\r\n\t}\r\n\t\r\n\t//类模板只能替换类型，否则与函数模板冲突\r\n\tstatic rbool is_type(tsh& sh,rbuf<rbuf<tword> >& vparam)\r\n\t{\r\n\t\tfor(int i=0;i<vparam.count();i++)\r\n\t\t{\r\n\t\t\tifn(is_type(sh,vparam[i]))\r\n\t\t\t{\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn true;\r\n\t}\r\n\r\n\tstatic rbool is_type(tsh& sh,rbuf<tword>& v)\r\n\t{\r\n\t\treturn zfind::is_class_t(sh,v.get_bottom().val)||\r\n\t\t\tv.get(1)==rppoptr(c_tbk_l)&&\r\n\t\t\tzfind::is_classtl(sh,v.get_bottom().val)||\r\n\t\t\tv.count()==1&&v[0].val.is_number();//todo\r\n\t}\r\n\r\n\tstatic void vtl_replace(rbuf<tword>& result,rbuf<ttl>& vtl,\r\n\t\trbuf<rbuf<tword> >& vparam)\r\n\t{\r\n\t\tfor(int j=0;j<vparam.count();j++)\r\n\t\t{\r\n\t\t\tstr_replace(result,vtl[j].name,tsh::vword_to_vstr(vparam[j]));\r\n\t\t}\r\n\t\tzpre::arrange(result);\r\n\t}\r\n\r\n\tstatic void str_replace(rbuf<tword>& v,const rstr& src,const rbuf<rstr>& vstr)\r\n\t{\r\n\t\tfor(int i=0;i<v.count();i++)\r\n\t\t{\r\n\t\t\tif(v[i].val!=src)\r\n\t\t\t{\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\t\t\tv[i].val.clear();\r\n\t\t\tv[i].multi=vstr;\t\r\n\t\t}\r\n\t}\r\n\r\n\tstatic void point_replace(tsh& sh,rbuf<tword>& v,rbool& need)\r\n\t{\r\n\t\tfor(int i=0;i<v.count();i++)\r\n\t\t{\r\n\t\t\tif(v.get(i+1).val!=rppoptr(c_star)||\r\n\t\t\t\t!zfind::is_class(sh,v[i].val))\r\n\t\t\t{\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\t\t\tif(v.get(i+2).val==rppoptr(c_star))\r\n\t\t\t{\r\n\t\t\t\tif(v.get(i+3)==rppoptr(c_sbk_l))\r\n\t\t\t\t{\r\n\t\t\t\t\tcontinue;\r\n\t\t\t\t}\r\n\t\t\t\trbuf<tword> vword;\r\n\t\t\t\ttword word;\r\n\t\t\t\tword.pos=v[i].pos;\r\n\t\t\t\tword.pos_src=v[i].pos_src;\r\n\t\t\t\tsh.push_twi(vword,word,rppkey(c_rp));\r\n\t\t\t\tsh.push_twi(vword,word,rppoptr(c_tbk_l));\r\n\t\t\t\tsh.push_twi(vword,word,rppkey(c_rp));\r\n\t\t\t\tsh.push_twi(vword,word,rppoptr(c_tbk_l));\r\n\t\t\t\tsh.push_twi(vword,word,v[i].val);\r\n\t\t\t\tsh.push_twi(vword,word,rppoptr(c_tbk_r));\r\n\t\t\t\tsh.push_twi(vword,word,rppoptr(c_tbk_r));\r\n\t\t\t\tv[i].multi=sh.vword_to_vstr(vword);\r\n\t\t\t\tv[i].val.clear();\r\n\t\t\t\tv[i+1].val.clear();\r\n\t\t\t\tv[i+2].val.clear();\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\tif(v.get(i+2)==rppoptr(c_sbk_l))\r\n\t\t\t\t{\r\n\t\t\t\t\tcontinue;\r\n\t\t\t\t}\r\n\t\t\t\trbuf<tword> vword;\r\n\t\t\t\ttword word;\r\n\t\t\t\tword.pos=v[i].pos;\r\n\t\t\t\tword.pos_src=v[i].pos_src;\r\n\t\t\t\tsh.push_twi(vword,word,rppkey(c_rp));\r\n\t\t\t\tsh.push_twi(vword,word,rppoptr(c_tbk_l));\r\n\t\t\t\tsh.push_twi(vword,word,v[i].val);\r\n\t\t\t\tsh.push_twi(vword,word,rppoptr(c_tbk_r));\r\n\r\n\t\t\t\tv[i].multi=sh.vword_to_vstr(vword);\r\n\t\t\t\tv[i].val.clear();\r\n\t\t\t\tv[i+1].val.clear();\r\n\t\t\t}\r\n\t\t}\r\n\t\tzpre::arrange(v,&need);\r\n\t}\r\n\r\n\tstatic void combine_quote(tsh& sh,rbuf<tword>& v)\r\n\t{\r\n\t\tfor(int i=0;i<v.count();i++)\r\n\t\t{\r\n\t\t\tif(v.get(i+1).val==rppoptr(c_addr)&&\r\n\t\t\t\tzfind::is_class(sh,v[i].val))\r\n\t\t\t{\r\n\t\t\t\tfor(int j=i+1;j<v.count();j++)\r\n\t\t\t\t{\r\n\t\t\t\t\tif(v[j].val!=rppoptr(c_addr))\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tv[i].val+=v[j].val;\r\n\t\t\t\t\tv[j].clear();\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\telif((v[i].val==rppoptr(c_dot)||v[i]==rppoptr(c_arrow_r))&&\r\n\t\t\t\tv.get(i+1).val==rppoptr(c_destruct)&&\r\n\t\t\t\tzfind::is_class(sh,v.get(i+2).val))\r\n\t\t\t{\r\n\t\t\t\tv[i+1].val+=v[i+2].val;\r\n\t\t\t\tv[i+2].clear();\r\n\t\t\t}\r\n\t\t}\r\n\t\tzpre::arrange(v);\r\n\t}\r\n};\r\n\r\n#endif"
  },
  {
    "path": "rpp/zexp.h",
    "content": "﻿#ifndef zexp_h__\r\n#define zexp_h__\r\n\r\n#include \"tsh.h\"\r\n#include \"zctl.h\"\r\n#include \"zcontrol.h\"\r\n#include \"zftl.h\"\r\n#include \"zmatch.h\"\r\n\r\n//表达式标准化类，返回表达式的类型\r\nstruct zexp\r\n{\r\n\t//处理函数名调用\r\n\tstatic rbool p_func_call(tsh& sh,tsent& src,tsent& outopnd,\r\n\t\ttfunc& tfi,int level,int& i,tenv env)\r\n\t{\r\n\t\ttclass* ptci=tfi.ptci;\r\n\t\trstr fname=src.vword[i].val;\r\n\t\ttfunc* ptfi=zfind::func_search(*ptci,fname);\r\n\t\tif(ptfi==null)\r\n\t\t{\r\n\t\t\tptci=sh.m_main;\r\n\t\t\tif(!p_call(sh,src,null,outopnd,tfi,level,i,ptci,env))\r\n\t\t\t\treturn false;\r\n\t\t\treturn true;\r\n\t\t}\r\n\t\t//函数重载不能友元和非友元共存，友元标志很重要。\r\n\t\tif(ptfi->is_friend)\r\n\t\t{\r\n\t\t\tif(!p_call(sh,src,null,outopnd,tfi,level,i,ptci,env))\r\n\t\t\t\treturn false;\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\ttsent first;\r\n\t\t\tfirst.type=ptci->name+rppoptr(c_addr);\r\n\t\t\tfirst.vword+=rppkey(c_this);\r\n\t\t\tif(!p_call(sh,src,&first,outopnd,tfi,level,i,ptci,env))\r\n\t\t\t\treturn false;\r\n\t\t}\r\n\t\treturn true;\r\n\t}\r\n\r\n\t//处理[]函数指针直接调用\r\n\tstatic rbool p_point_call(tsh& sh,tsent& src,tsent& outopnd,\r\n\t\ttfunc& tfi,int level,int& i,tenv env)\r\n\t{\r\n\t\tint left=i+1;\r\n\t\tint right=sh.find_symm_mbk(src.vword,left);\r\n\t\tif(right>=src.vword.count())\r\n\t\t{\r\n\t\t\tsh.error(src,\"call miss ]\");\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\toutopnd.type=src.vword[i].val;\r\n\t\toutopnd.vword+=rppoptr(c_mbk_l);\r\n\t\toutopnd.vword+=rppkey(c_pcall);\r\n\t\toutopnd.vword+=rppoptr(c_comma);\r\n\t\toutopnd.vword+=outopnd.type;\r\n\t\toutopnd.vword+=rppoptr(c_comma);\r\n\t\t\r\n\t\trbuf<tsent> vsent;\r\n\t\tsh.split_param(vsent,src.vword.sub(left+1,right),src);\r\n\t\tif(vsent.empty())\r\n\t\t{\r\n\t\t\tsh.error(src,\"call miss func\");\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\tfor(int j=0;j<vsent.count();j++)\r\n\t\t{\r\n\t\t\tif(!p_exp(sh,vsent[j],tfi,level,env))\r\n\t\t\t\treturn false;\r\n\t\t}\r\n\t\toutopnd.vword+=vsent[0].vword;\r\n\t\toutopnd.vword+=rppoptr(c_comma);\r\n\r\n\t\toutopnd.vword+=rppoptr(c_mbk_l);\r\n\t\tfor(int j=1;j<vsent.count();j++)\r\n\t\t{\r\n\t\t\tif(j!=1)\r\n\t\t\t{\r\n\t\t\t\toutopnd.vword+=rppoptr(c_comma);\r\n\t\t\t}\r\n\t\t\toutopnd.vword+=r_move(vsent[j].vword);\r\n\t\t}\r\n\t\toutopnd.vword+=rppoptr(c_mbk_r);\r\n\r\n\t\toutopnd.vword+=rppoptr(c_mbk_r);\r\n\t\ti=right;\r\n\t\treturn true;\r\n\t}\r\n\r\n\tstatic rbool p_temp_var(tsh& sh,tsent& src,tsent& outopnd,\r\n\t\ttfunc& tfi,int level,int& i,tenv env)\r\n\t{\r\n\t\tint left=i+1;\r\n\t\tint right=sh.find_symm_sbk(src.vword,left);\r\n\t\tif(right>=src.vword.count())\r\n\t\t{\r\n\t\t\tsh.error(src,\"class name miss (\");\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\trbuf<tsent> vsent;\r\n\t\tsh.split_param(vsent,src.vword.sub(left+1,right),src);\r\n\t\tif(!vsent.empty())\r\n\t\t{\r\n\t\t\tfor(int j=0;j<vsent.count();j++)\r\n\t\t\t{\r\n\t\t\t\tif(!p_exp(sh,vsent[j],tfi,level,env))\r\n\t\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t}\r\n\t\toutopnd.type=src.vword.get(i).val;\r\n\t\toutopnd.vword+=rppoptr(c_mbk_l);\r\n\t\toutopnd.vword+=rppkey(c_btemp);\r\n\t\toutopnd.vword+=rppoptr(c_comma);\r\n\t\toutopnd.vword+=outopnd.type;\r\n\t\toutopnd.vword+=rppoptr(c_comma);\r\n\t\toutopnd.vword+=rppoptr(c_mbk_l);\r\n\t\tfor(int j=0;j<vsent.count();j++)\r\n\t\t{\r\n\t\t\tif(j!=0)\r\n\t\t\t{\r\n\t\t\t\toutopnd.vword+=rppoptr(c_comma);\r\n\t\t\t}\r\n\t\t\toutopnd.vword+=r_move(vsent[j].vword);\r\n\t\t}\r\n\t\toutopnd.vword+=rppoptr(c_mbk_r);\r\n\t\toutopnd.vword+=rppoptr(c_mbk_r);\r\n\t\ti=right;\r\n\t\treturn true;\r\n\t}\r\n\t\r\n\t//处理类名直接调用\r\n\tstatic rbool p_class_call(tsh& sh,tsent& src,tsent& outopnd,\r\n\t\ttfunc& tfi,int level,int& i,tenv env)\r\n\t{\r\n\t\tif(src.vword.get(i+1).val!=rppoptr(c_dot))\r\n\t\t{\r\n\t\t\tsh.error(src,\"class name miss .\");\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\trstr cname=src.vword[i].val;\r\n\t\ttclass* ptci=zfind::class_search(sh,cname);\r\n\t\tif(ptci==null)\r\n\t\t{\r\n\t\t\tsh.error(src,\"can't find class name\");\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\ti+=2;\r\n\t\tif(!p_call(sh,src,null,outopnd,tfi,level,i,ptci,env))\r\n\t\t\treturn false;\r\n\t\treturn true;\r\n\t}\r\n\r\n\tstatic rbool p_mbk(tsh& sh,const tsent& first,const tsent& second,\r\n\t\ttsent& outopnd,tfunc& tfi,int level,tenv env)\r\n\t{\r\n\t\trbuf<tsent> vsent;\r\n\t\tsh.split_param(vsent,second.vword,first);\r\n\t\tfor(int j=0;j<vsent.count();j++)\r\n\t\t{\r\n\t\t\tif(!p_exp(sh,vsent[j],tfi,level,env))\r\n\t\t\t\treturn false;\r\n\t\t}\r\n\t\tvsent.push_front(first);\r\n\t\ttclass* ptci=zfind::class_search_t(sh,first.type);\r\n\t\tif(ptci==null)\r\n\t\t{\r\n\t\t\tsh.error(first,\"can't find func mbk\");\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\ttfunc* ptfi=zmatch::find_replace(sh,*ptci,\"[]\",vsent);\r\n\t\tif(null==ptfi)\r\n\t\t{\r\n\t\t\tsh.error(first,\"can't find func mbk\");\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\tset_func(sh,outopnd,r_move(vsent),ptfi);\r\n\t\treturn true;\r\n\t}\r\n\r\n\tstatic rbool p_lisp(tsh& sh,const tsent& src,tsent& outopnd,\r\n\t\ttfunc& tfi,int level,tenv env)\r\n\t{\r\n\t\tif(src.vword.get_bottom().val!=rppoptr(c_mbk_l)&&\r\n\t\t\tsrc.vword.get_top().val!=rppoptr(c_mbk_r))\r\n\t\t{\r\n\t\t\tsh.error(src,\"lisp exp miss\");\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\toutopnd.vword.clear();\r\n\t\toutopnd.pos=src.pos;\r\n\t\ttclass* ptci=null;\r\n\t\ttfunc* ptfi=null;\r\n\t\trstr cname=src.vword.get(1).val;\r\n\t\trbuf<rbuf<tword> > vlisp;\r\n\t\tget_vlisp(sh,src.vword,vlisp);\r\n\t\trstr fname=rstr::join<rstr>(sh.vword_to_vstr(vlisp.get(1)),\"\");\r\n\t\tptci=zfind::class_search(sh,cname);\r\n\t\tif(ptci!=null)\r\n\t\t{\r\n\t\t\tif(vlisp.count()!=3)\r\n\t\t\t{\r\n\t\t\t\tsh.error(src,\"lisp exp miss\");\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\tptfi=zfind::func_search_dec(*ptci,fname);\r\n\t\t\trbuf<tsent> vsent;\r\n\t\t\ttsent sent;\r\n\t\t\tsent.pos=src.pos;\r\n\r\n\t\t\trbuf<rbuf<tword> > vparam;\r\n\t\t\tget_vlisp(sh,vlisp[2],vparam);\r\n\t\t\tfor(int j=0;j<vparam.count();j++)\r\n\t\t\t{\r\n\t\t\t\tsent.vword=vparam[j];\r\n\t\t\t\tif(!p_exp(sh,sent,tfi,level,env))\r\n\t\t\t\t{\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t}\r\n\t\t\t\tvsent.push(sent);\r\n\t\t\t}\r\n\r\n\t\t\tif(ptfi==null)\r\n\t\t\t{\r\n\t\t\t\tptfi=zmatch::find_replace(sh,*ptci,fname,vsent);\r\n\t\t\t\tif(ptfi==null)\r\n\t\t\t\t{\r\n\t\t\t\t\tsh.error(src,\"lisp exp miss\");\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tset_func(sh,outopnd,r_move(vsent),ptfi);\r\n\t\t\treturn true;\r\n\t\t}\r\n\t\tif(cname==rppkey(c_pcall)||cname==rppkey(c_btemp))\r\n\t\t{\r\n\t\t\toutopnd.vword=src.vword;\r\n\t\t\toutopnd.type=fname;\r\n\t\t\treturn true;\r\n\t\t}\r\n\t\tif(cname==rppoptr(c_dot))\r\n\t\t{\r\n\t\t\ttsent sent;\r\n\t\t\tif(vlisp.count()!=3)\r\n\t\t\t{\r\n\t\t\t\tsh.error(src,\"lisp exp miss\");\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\tsent.vword=vlisp[1];\r\n\t\t\tsent.pos=src.pos;\r\n\t\t\tifn(p_exp(sh,sent,tfi,level,env))\r\n\t\t\t{\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\tptci=zfind::class_search_t(sh,sent.type);\r\n\t\t\tif(ptci==null)\r\n\t\t\t{\r\n\t\t\t\tsh.error(src,\"lisp exp miss\");\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\ttdata* ptdi=zfind::data_member_search(\r\n\t\t\t\t*ptci,vlisp[2].get(0).val);\r\n\t\t\tif(ptdi==null)\r\n\t\t\t{\r\n\t\t\t\tsh.error(src,\"lisp exp miss\");\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\toutopnd.vword=src.vword;\r\n\t\t\toutopnd.type=ptdi->type;\r\n\t\t\treturn true;\r\n\t\t}\r\n\t\tif(cname==rppoptr(c_addr))\r\n\t\t{\r\n\t\t\toutopnd.vword=src.vword;\r\n\t\t\toutopnd.type=\"rp<void>\";\r\n\t\t\treturn true;\r\n\t\t}\r\n\t\tsh.error(src,\"lisp exp miss\");\r\n\t\treturn false;\r\n\t}\r\n\r\n\tstatic void get_vsent(rbuf<rbuf<tword> >& vlisp,rbuf<tsent>& vsent,\r\n\t\tconst tsent& src)\r\n\t{\r\n\t\tvsent.clear();\r\n\t\tfor(int i=0;i<vlisp.count();i++)\r\n\t\t{\r\n\t\t\ttsent sent;\r\n\t\t\tsent.pos=src.pos;\r\n\t\t\tsent.vword=vlisp[i];\r\n\t\t\tvsent.push_move(sent);\r\n\t\t}\r\n\t}\r\n\r\n\tstatic void get_vlisp(tsh& sh,rbuf<tword> v,rbuf<rbuf<tword> >& vlisp)\r\n\t{\r\n\t\tvlisp=sh.comma_split(v.sub(1,v.count()-1));\r\n\t}\r\n\t\r\n\t//处理变参中括号调用,变参不能重载\r\n\tstatic rbool p_mbk_param(tsh& sh,tsent& src,tsent* pfirst,tsent& outopnd,\r\n\t\ttfunc& tfi,int level,int& i,tclass* ptci,tenv env)\r\n\t{\r\n\t\trstr cname=ptci->name;\r\n\t\trstr fname=src.vword[i].val;\r\n\t\tint left=i+1;\r\n\t\tint right;\r\n\t\tright=sh.find_symm_mbk(src.vword,left);\r\n\t\tif(right>=src.vword.count())\r\n\t\t{\r\n\t\t\tsh.error(src,\"call miss )\");\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\ttfunc* ptfi=zfind::func_search(*ptci,fname);\r\n\t\tif(null==ptfi)\r\n\t\t{\r\n\t\t\tsh.error(src,\"can't find call\");\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\trbuf<tsent> vsent;\r\n\t\tsh.split_param(vsent,src.vword.sub(left+1,right),src);\r\n\t\tfor(int j=0;j<vsent.count();j++)\r\n\t\t{\r\n\t\t\tif(!p_exp(sh,vsent[j],tfi,level,env))\r\n\t\t\t\treturn false;\r\n\t\t}\r\n\t\ttsent tmp;\r\n\t\ttmp.pos=src.pos;\r\n\t\ttmp.vword.push(tword(rstr(vsent.count())));\r\n\t\tvsent.push_front(tmp);\r\n\t\t//插入first还未处理引用的情况\r\n\t\tif(pfirst!=null)\r\n\t\t{\r\n\t\t\tvsent.push_front(*pfirst);//插入DOT前的对象\r\n\t\t\tif(!sh.is_point(pfirst->type))\r\n\t\t\t{\r\n\t\t\t\tvsent[0].vword.push_front(tword(rppoptr(c_addr)));\r\n\t\t\t\tif(!p_exp(sh,vsent[0],tfi,level,env))\r\n\t\t\t\t{\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\ttmp.vword.clear();\r\n\t\ttmp.vword+=tword(rppoptr(c_mbk_l));\r\n\t\ttmp.vword+=tword(rppoptr(c_addr));\r\n\t\ttmp.vword+=rppoptr(c_comma);\r\n\t\ttmp.vword+=tword(ptci->name);\r\n\t\ttmp.vword+=rppoptr(c_comma);\r\n\t\ttmp.vword+=tword(ptfi->name_dec);\r\n\t\ttmp.vword+=tword(rppoptr(c_mbk_r));\r\n\r\n\t\toutopnd.type=ptfi->retval.type;\r\n\t\toutopnd.vword+=tword(rppoptr(c_mbk_l));\r\n\t\toutopnd.vword+=tword(rppkey(c_pcall));\r\n\t\toutopnd.vword+=rppoptr(c_comma);\r\n\t\toutopnd.vword+=tword(outopnd.type);\r\n\t\toutopnd.vword+=rppoptr(c_comma);\r\n\t\toutopnd.vword+=tmp.vword;\r\n\t\toutopnd.vword+=rppoptr(c_comma);\r\n\r\n\t\toutopnd.vword+=tword(rppoptr(c_mbk_l));\r\n\t\tfor(int j=0;j<vsent.count();j++)\r\n\t\t{\r\n\t\t\tif(j!=0)\r\n\t\t\t{\r\n\t\t\t\toutopnd.vword+=rppoptr(c_comma);\r\n\t\t\t}\r\n\t\t\toutopnd.vword+=r_move(vsent[j].vword);\r\n\t\t}\r\n\t\toutopnd.vword+=tword(rppoptr(c_mbk_r));\r\n\r\n\t\toutopnd.vword+=tword(rppoptr(c_mbk_r));\r\n\t\ti=right;\r\n\t\treturn true;\r\n\t}\r\n\t\r\n\t//无括号call\r\n\tstatic rbool p_call_n(tsh& sh,tsent& src,tsent* pfirst,tsent& outopnd,\r\n\t\ttfunc& tfi,int level,int& i,tclass* ptci,tenv env)\r\n\t{\r\n\t\trstr cname=ptci->name;\r\n\t\trstr fname=src.vword[i].val;\r\n\t\ttfunc* ptfi;\r\n\t\tint left=i;\r\n\t\tint right=left+1;\r\n\t\tif(i+1==src.vword.count()-1||\r\n\t\t\tzfind::is_end_part_optr(sh,src.vword.get(i+1).val))\r\n\t\t{\r\n\t\t\tptfi=zfind::func_search_empty_param_m(\r\n\t\t\t\t*ptci,fname,pfirst==null);\r\n\t\t\tif(ptfi==null)\r\n\t\t\t{\r\n\t\t\t\tsh.error(src,\"can't find call\");\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tptfi=zfind::func_search_multi_param_m(\r\n\t\t\t\t*ptci,fname,pfirst==null);\r\n\t\t\tif(ptfi==null)\r\n\t\t\t\tptfi=zfind::func_search_empty_param_m(\r\n\t\t\t\t\t*ptci,fname,pfirst==null);\r\n\t\t\telse\r\n\t\t\t\tright=src.vword.count()-1;\r\n\t\t\tif(ptfi==null)\r\n\t\t\t{\r\n\t\t\t\tsh.error(src,\"can't find call\");\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t}\r\n\t\ttsent param=src.sub(left+1,right);\r\n\t\toutopnd.vword.push(tword(cname));\r\n\t\toutopnd.vword.push(tword(rppoptr(c_dot)));\r\n\t\toutopnd.vword.push(tword(fname));\r\n\t\toutopnd.vword.push(tword(rppoptr(c_sbk_l)));\r\n\t\tif(pfirst!=null&&!ptfi->is_friend)\r\n\t\t{\r\n\t\t\toutopnd.vword+=pfirst->vword;\r\n\t\t\tif(!param.empty())\r\n\t\t\t{\r\n\t\t\t\toutopnd.vword.push(tword(rppoptr(c_comma)));\r\n\t\t\t\toutopnd.vword+=r_move(param.vword);\r\n\t\t\t}\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tif(!param.empty())\r\n\t\t\t{\r\n\t\t\t\toutopnd.vword+=r_move(param.vword);\r\n\t\t\t}\r\n\t\t}\r\n\t\toutopnd.vword.push(tword(rppoptr(c_sbk_r)));\r\n\t\t//无括号调用添加括号递归处理\r\n\t\tif(!p_exp(sh,outopnd,tfi,level,env))\r\n\t\t\treturn false;\r\n\t\ti=right-1;\r\n\t\treturn true;\r\n\t}\r\n\r\n\tstatic rbool p_ftl(tsh& sh,tsent src,tsent* pfirst,tsent& outopnd,\r\n\t\ttfunc& tfi,int level,int& i,tclass* ptci,tenv env)\r\n\t{\r\n\t\tint left=i+1;\r\n\t\tif(src.vword.get(left)!=rppoptr(c_tbk_l))\r\n\t\t{\r\n\t\t\tsh.error(src,\"call miss <\");\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\tint right=sh.find_symm_tbk(src.vword,left);\r\n\t\tif(right>=src.vword.count())\r\n\t\t{\r\n\t\t\tsh.error(src,\"call miss >\");\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\trbuf<tword> temp=src.vword.sub(i,right+1);\r\n\t\tif(!zftl::ftl_replace(sh,*tfi.ptci,temp,ptci))\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\tsrc.vword[right]=temp.get_bottom();\r\n\t\ti=right;\r\n\t\treturn p_call(sh,src,pfirst,outopnd,tfi,level,i,ptci,env);\r\n\t}\r\n\r\n\tstatic rbool set_vsent(tsh& sh,tpos pos,rbuf<tsent>& vsent,\r\n\t\ttfunc& tfi,int level,tenv env)\r\n\t{\r\n\t\ttsent sent;\r\n\t\ttword word;\r\n\t\tword.pos=pos;\r\n\t\tword.pos_src=pos;\r\n\t\tsent.pos=pos;\r\n\t\ttdynamic item;\r\n\t\titem.key=tfi.sdynamic.count();\r\n\t\tfor(int k=0;k<vsent.count();k++)\r\n\t\t{\r\n\t\t\titem.vparam+=sh.vword_to_vstr(vsent[k].vword);\r\n\t\t}\r\n\t\ttfi.sdynamic.insert(item);\r\n\r\n\t\tvsent.clear();\r\n\r\n\t\tsh.push_twi(sent.vword,word,rstr((uint)&tfi.sdynamic.find(item)->vparam));\r\n\t\tvsent.push(sent);\r\n\r\n\t\tsent.vword.clear();\r\n\t\tsh.push_twi(sent.vword,word,rstr((uint)&tfi));\r\n\t\tvsent.push(sent);\r\n\r\n\t\tsent.vword.clear();\r\n\t\tsh.push_twi(sent.vword,word,rstr(\"_EBP\"));\r\n\t\tvsent.push(sent);\r\n\r\n\t\treturn true;\r\n\t}\r\n\r\n\tstatic rbool p_call(tsh& sh,tsent& src,tsent* pfirst,tsent& outopnd,\r\n\t\ttfunc& tfi,int level,int& i,tclass* ptci,tenv env)\r\n\t{\r\n\t\trstr cname=ptci->name;\r\n\t\trstr fname=src.vword[i].val;\r\n\t\tif(src.vword.get(i+1).val==rppoptr(c_mbk_l))\r\n\t\t{\r\n\t\t\treturn p_mbk_param(sh,src,pfirst,outopnd,tfi,level,i,ptci,env);\r\n\t\t}\r\n\t\tif(pfirst!=null&&sh.get_tname(pfirst->type)==rppkey(c_var)&&\r\n\t\t\tnull==zfind::func_search(*ptci,fname))\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t\t//a.test  ->   a[\"test\"]\r\n\t\t}\r\n\t\tif(src.vword.get(i+1).val!=rppoptr(c_sbk_l))\r\n\t\t{\r\n\t\t\treturn p_call_n(sh,src,pfirst,outopnd,tfi,level,i,ptci,env);\r\n\t\t}\r\n\t\tint left=i+1;\r\n\t\tint right;\r\n\t\tright=sh.find_symm_sbk(src.vword,left);\r\n\t\tif(right>=src.vword.count())\r\n\t\t{\r\n\t\t\tsh.error(src,\"call miss )\");\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\trbuf<tsent> vsent;\r\n\t\tsh.split_param(vsent,src.vword.sub(left+1,right),src);\r\n\t\tfor(int j=0;j<vsent.count();j++)\r\n\t\t{\r\n\t\t\tif(!p_exp(sh,vsent[j],tfi,level,env))\r\n\t\t\t\treturn false;\r\n\t\t}\r\n\t\ttfunc* ptfi=zfind::func_search(*ptci,fname);\r\n\t\tif(ptfi!=null&&ptfi->is_dynamic)\r\n\t\t{\r\n\t\t\tifn(set_vsent(sh,src.vword[i].pos,vsent,tfi,level,env))\r\n\t\t\t\treturn false;\r\n\t\t\tif(pfirst!=null)\r\n\t\t\t\tvsent.push_front(*pfirst);\r\n\t\t\tset_func(sh,outopnd,r_move(vsent),ptfi);\r\n\t\t\ti=right;\r\n\t\t\treturn true;\r\n\t\t}\r\n\t\tif(pfirst!=null)\r\n\t\t\tvsent.push_front(*pfirst);//插入DOT前的对象\r\n\t\tptfi=zmatch::find_replace(sh,*ptci,fname,vsent);\r\n\t\tif(null==ptfi)\r\n\t\t{\r\n\t\t\tif(pfirst==null)\r\n\t\t\t{\r\n\t\t\t\tsh.error(src,\"can't find call\");\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\tvsent.pop_front();\r\n\t\t\tptfi=zmatch::find_replace(sh,*ptci,fname,vsent);\r\n\t\t\tif(ptfi==null||!ptfi->is_friend)\r\n\t\t\t{\r\n\t\t\t\tsh.error(src,\"can't find call\");\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t}\r\n\t\tset_func(sh,outopnd,r_move(vsent),ptfi);\r\n\t\ti=right;\r\n\t\treturn true;\r\n\t}\r\n\r\n\tstatic rbool p_exp_all(tsh& sh,tfunc& tfi,tenv env)\r\n\t{\r\n\t\tfor(int i=0;i<tfi.vsent.count();++i)\r\n\t\t{\r\n\t\t\tif(sh.m_key.is_asm_ins(tfi.vsent[i].vword.get_bottom().val))\r\n\t\t\t\tcontinue;\r\n\t\t\tif(!zexp::p_exp(sh,tfi.vsent[i],tfi,0,env))\r\n\t\t\t{\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn true;\r\n\t}\r\n\r\n\tstatic rbool p_exp(tsh& sh,rbuf<tword>& v,tfunc& tfi,\r\n\t\tint level,tenv env)\r\n\t{\r\n\t\ttsent sent;\r\n\t\tsent.vword=v;\r\n\t\tsent.pos.line=1;\r\n\t\tifn(p_exp(sh,sent,tfi,level,env))\r\n\t\t\treturn false;\r\n\t\tv=sent.vword;\r\n\t\treturn true;\r\n\t}\r\n\r\n\tstatic rbool p_exp(tsh& sh,tsent& src,tfunc& tfi,\r\n\t\tint level,tenv env)\r\n\t{\r\n\t\treturn p_exp(sh,src,src,tfi,level,env);\r\n\t}\r\n\t\r\n\t//表达式标准化，并设置dst.type\r\n\tstatic rbool p_exp(tsh& sh,tsent src,tsent& dst,tfunc& tfi,\r\n\t\tint level,tenv env)\r\n\t{\r\n\t\ttclass& tci=*tfi.ptci;\r\n\t\tif(level>c_rpp_deep)\r\n\t\t{\r\n\t\t\tsh.error(src,\"expression too deep\");\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\tlevel++;\r\n\t\tdst.clear();\r\n\t\trbuf<rstr> soptr;\r\n\t\trbuf<tsent> sopnd;\r\n\t\tsoptr.push(rppoptr(c_exp_part));\r\n\t\tsrc.vword.push(tword(rppoptr(c_exp_part)));\r\n\t\tfor(int i=0;i<src.vword.count();++i)\r\n\t\t{\r\n\t\t\tif(src.vword[i].val==rppoptr(c_exp_part)&&\r\n\t\t\t\tsoptr.get_top()==rppoptr(c_exp_part))\r\n\t\t\t\tbreak;\r\n\t\t\tif(src.vword[i].is_const())\r\n\t\t\t{\r\n\t\t\t\ttsent outopnd;\r\n\t\t\t\toutopnd.pos=src.pos;\r\n\t\t\t\toutopnd.vword.push(src.vword[i]);\r\n\t\t\t\toutopnd.type=sh.get_ctype(sh,src.vword[i]);\r\n\t\t\t\tsopnd.push_move(outopnd);\r\n\t\t\t}\r\n\t\t\telif(sh.m_key.is_asm_reg(src.vword[i].val))\r\n\t\t\t{\r\n\t\t\t\ttsent outopnd;\r\n\t\t\t\toutopnd.pos=src.pos;\r\n\t\t\t\toutopnd.vword.push(src.vword[i]);\r\n\t\t\t\toutopnd.type=rppkey(c_int);\r\n\t\t\t\tsopnd.push_move(outopnd);\r\n\t\t\t}\r\n\t\t\telif(src.vword[i].val==rppoptr(c_sbk_l))\r\n\t\t\t{\r\n\t\t\t\t//todo 小括号重载有点复杂 \r\n\t\t\t\tint right=sh.find_symm_sbk(src.vword,i);\r\n\t\t\t\tif(right>=src.vword.count())\r\n\t\t\t\t{\r\n\t\t\t\t\tsh.error(src,\"miss )\");\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t}\r\n\t\t\t\ttsent outopnd;\r\n\t\t\t\toutopnd.pos=src.pos;\r\n\t\t\t\tif(!p_exp(sh,src.sub(i+1,right),outopnd,tfi,level,env))\r\n\t\t\t\t\treturn false;\r\n\t\t\t\tsopnd.push_move(outopnd);\r\n\t\t\t\ti=right;\r\n\t\t\t}\r\n\t\t\telif(src.vword.get(i+1)==rppoptr(c_mbk_l)&&\r\n\t\t\t\tzfind::is_class_t(sh,src.vword[i].val))\r\n\t\t\t{\r\n\t\t\t\t//[]函数指针调用\r\n\t\t\t\ttsent outopnd;\r\n\t\t\t\toutopnd.pos=src.pos;\r\n\t\t\t\tif(!p_point_call(sh,src,outopnd,tfi,level,i,env))\r\n\t\t\t\t\treturn false;\r\n\t\t\t\tsopnd.push_move(outopnd);\r\n\t\t\t}\r\n\t\t\telif(src.vword[i].val==rppoptr(c_mbk_l))\r\n\t\t\t{\r\n\t\t\t\tint right=sh.find_symm_mbk(src.vword,i);\r\n\t\t\t\tif(right>=src.vword.count())\r\n\t\t\t\t{\r\n\t\t\t\t\tsh.error(src,\"miss ]\");\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t}\r\n\t\t\t\ttsent outopnd;\r\n\t\t\t\toutopnd.pos=src.pos;\r\n\t\t\t\tif(sopnd.empty()||\r\n\t\t\t\t\tsrc.vword.get(i+1).val==rppoptr(c_addr)&&\r\n\t\t\t\t\tzfind::is_class(sh,src.vword.get(i+3).val))\r\n\t\t\t\t{\r\n\t\t\t\t\tif(!p_lisp(sh,src.sub(\r\n\t\t\t\t\t\ti,right+1),outopnd,tfi,level,env))\r\n\t\t\t\t\t\treturn false;\r\n\t\t\t\t}\r\n\t\t\t\telse\r\n\t\t\t\t{\r\n\t\t\t\t\tif(!p_mbk(sh,sopnd.pop(),src.sub(i+1,right),\r\n\t\t\t\t\t\toutopnd,tfi,level,env))\r\n\t\t\t\t\t\treturn false;\r\n\t\t\t\t}\r\n\t\t\t\tsopnd.push_move(outopnd);\r\n\t\t\t\ti=right;\r\n\t\t\t}\r\n\t\t\telif(src.vword[i].val==rppoptr(c_dot))\r\n\t\t\t{\r\n\t\t\t\tif(sopnd.empty())\r\n\t\t\t\t{\r\n\t\t\t\t\tsh.error(src,\". miss opnd\");\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t}\r\n\t\t\t\ti++;\r\n\t\t\t\trstr name=src.vword.get(i).val;\r\n\t\t\t\ttsent first=sopnd.pop();\r\n\t\t\t\ttclass* ptci=zfind::class_search_t(sh,first.type);\r\n\t\t\t\tif(null==ptci)\r\n\t\t\t\t{\r\n\t\t\t\t\tsh.error(src,\". can't find class name\");\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t}\r\n\t\t\t\ttsent outopnd;\r\n\t\t\t\toutopnd.pos=src.pos;\r\n\t\t\t\t//数据成员和函数成员不可以同名\r\n\t\t\t\ttdata* ptdi=zfind::data_member_search(*ptci,name);\r\n\t\t\t\tif(ptdi!=null)\r\n\t\t\t\t{\r\n\t\t\t\t\toutopnd.type=ptdi->type;\r\n\t\t\t\t\toutopnd.vword+=tword(rppoptr(c_mbk_l));\r\n\t\t\t\t\toutopnd.vword+=tword(rppoptr(c_dot));\r\n\t\t\t\t\toutopnd.vword+=rppoptr(c_comma);\r\n\t\t\t\t\toutopnd.vword+=first.vword;\r\n\t\t\t\t\toutopnd.vword+=rppoptr(c_comma);\r\n\t\t\t\t\toutopnd.vword+=tword(name);\r\n\t\t\t\t\toutopnd.vword+=tword(rppoptr(c_mbk_r));\r\n\t\t\t\t\tsopnd.push(outopnd);\r\n\t\t\t\t\tcontinue;\r\n\t\t\t\t}\r\n\t\t\t\tif(src.vword.get(i+1)==rppoptr(c_tbk_l)&&\r\n\t\t\t\t\tzfind::ftl_search(*ptci,name)!=null)\r\n\t\t\t\t{\r\n\t\t\t\t\tif(!p_ftl(sh,src,&first,\r\n\t\t\t\t\t\toutopnd,tfi,level,i,ptci,env))\r\n\t\t\t\t\t\treturn false;\r\n\t\t\t\t}\r\n\t\t\t\telse\r\n\t\t\t\t{\r\n\t\t\t\t\tif(!p_call(sh,src,&first,\r\n\t\t\t\t\t\toutopnd,tfi,level,i,ptci,env))\r\n\t\t\t\t\t\treturn false;\r\n\t\t\t\t}\r\n\t\t\t\tsopnd.push_move(outopnd);\r\n\t\t\t}\r\n\t\t\telif(src.vword[i].val==rppoptr(c_arrow_r))\r\n\t\t\t{\r\n\t\t\t\tif(sopnd.empty())\r\n\t\t\t\t{\r\n\t\t\t\t\tsh.error(src,\". miss opnd\");\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t}\r\n\t\t\t\ttsent first=sopnd.pop();\r\n\t\t\t\tfirst.vword.push_front(tword(rppoptr(c_star)));\r\n\t\t\t\tif(!p_exp(sh,first,tfi,level,env))\r\n\t\t\t\t\treturn false;\r\n\t\t\t\tsopnd.push_move(first);\r\n\t\t\t\tsrc.vword[i].val=rppoptr(c_dot);\r\n\t\t\t\ti--;\r\n\t\t\t}\r\n\t\t\telif(sh.m_optr.is_optr(src.vword[i].val))\r\n\t\t\t{\r\n\t\t\t\tif(soptr.empty())\r\n\t\t\t\t{\r\n\t\t\t\t\tsh.error(src,\"exp miss optr\");\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t}\r\n\t\t\t\trstr cur=src.vword[i].val;\r\n\t\t\t\tif(!sh.m_optr.precede(soptr.top(),cur))\r\n\t\t\t\t{\r\n\t\t\t\t\tsoptr.push(cur);\r\n\t\t\t\t\tcontinue;\r\n\t\t\t\t}\r\n\t\t\t\trstr theta=soptr.pop();\r\n\t\t\t\tif(sopnd.empty())\r\n\t\t\t\t{\r\n\t\t\t\t\tsh.error(src,\"exp miss opnd\");\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t}\r\n\t\t\t\trbuf<tsent> vsent;\r\n\t\t\t\tvsent.push(sopnd.pop());\r\n\t\t\t\ttclass* ptci=zfind::class_search_t(sh,vsent[0].type);\r\n\t\t\t\ttfunc* ptfi;\r\n\t\t\t\ttsent outopnd;\r\n\t\t\t\toutopnd.pos=src.pos;\r\n\t\t\t\tif(ptci!=null)\r\n\t\t\t\t{\r\n\t\t\t\t\tptfi=zmatch::find_replace(sh,\r\n\t\t\t\t\t\t*ptci,theta,vsent);\r\n\t\t\t\t\tif(ptfi!=null)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tset_func(sh,outopnd,\r\n\t\t\t\t\t\t\tr_move(vsent),ptfi);\r\n\t\t\t\t\t\tsopnd.push_move(outopnd);\r\n\t\t\t\t\t\ti--;\r\n\t\t\t\t\t\tcontinue;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tif(sopnd.empty())\r\n\t\t\t\t{\r\n\t\t\t\t\tsh.error(src,\"exp miss opnd\");\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t}\r\n\t\t\t\tvsent.push_front(sopnd.pop());\r\n\t\t\t\tptci=zfind::class_search_t(sh,vsent[0].type);\r\n\t\t\t\tif(ptci!=null)\r\n\t\t\t\t{\r\n\t\t\t\t\tptfi=zmatch::find_replace(sh,\r\n\t\t\t\t\t\t*ptci,theta,vsent);\r\n\t\t\t\t\tif(ptfi!=null)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tset_func(sh,outopnd,\r\n\t\t\t\t\t\t\tr_move(vsent),ptfi);\r\n\t\t\t\t\t\tsopnd.push_move(outopnd);\r\n\t\t\t\t\t\ti--;\r\n\t\t\t\t\t\tcontinue;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tptci=zfind::class_search_t(sh,vsent[1].type);\r\n\t\t\t\tif(ptci!=null)\r\n\t\t\t\t{\r\n\t\t\t\t\tptfi=zmatch::find_replace(sh,\r\n\t\t\t\t\t\t*ptci,theta,vsent);\r\n\t\t\t\t\tif(ptfi!=null)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tset_func(sh,outopnd,\r\n\t\t\t\t\t\t\tr_move(vsent),ptfi);\r\n\t\t\t\t\t\tsopnd.push_move(outopnd);\r\n\t\t\t\t\t\ti--;\r\n\t\t\t\t\t\tcontinue;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tsh.error(src,\"exp miss opnd 2\");\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\telif(zfind::is_class(sh,src.vword[i].val))\r\n\t\t\t{\r\n\t\t\t\ttsent outopnd;\r\n\t\t\t\toutopnd.pos=src.pos;\r\n\t\t\t\tif(src.vword.get(i+1).val==rppoptr(c_sbk_l))\r\n\t\t\t\t{\r\n\t\t\t\t\t//临时变量\r\n\t\t\t\t\tif(!p_temp_var(sh,src,outopnd,tfi,level,i,env))\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\treturn false;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\telse\r\n\t\t\t\t{\r\n\t\t\t\t\t//类名直接调用\r\n\t\t\t\t\tif(!p_class_call(sh,src,outopnd,tfi,level,i,env))\r\n\t\t\t\t\t\treturn false;\r\n\t\t\t\t}\r\n\t\t\t\tsopnd.push_move(outopnd);\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\trstr name=src.vword[i].val;\r\n\t\t\t\ttsent outopnd;\r\n\t\t\t\toutopnd.pos=src.pos;\r\n\t\t\t\ttdata* ptdi=zfind::local_search(tfi,name);\r\n\t\t\t\tif(ptdi!=null)\r\n\t\t\t\t{\r\n\t\t\t\t\toutopnd.vword+=src.vword[i];\r\n\t\t\t\t\toutopnd.type=ptdi->type;\r\n\t\t\t\t\tsopnd.push_move(outopnd);\r\n\t\t\t\t\tcontinue;\r\n\t\t\t\t}\r\n\t\t\t\tif(!tci.is_friend)\r\n\t\t\t\t{\r\n\t\t\t\t\tptdi=zfind::data_member_search(tci,name);\r\n\t\t\t\t\tif(ptdi!=null)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\t//类成员变量增加this\r\n\t\t\t\t\t\t//如 m_a -> this.m_a \r\n\t\t\t\t\t\toutopnd.vword+=tword(rppoptr(c_mbk_l));\r\n\t\t\t\t\t\toutopnd.vword+=tword(rppoptr(c_dot));\r\n\t\t\t\t\t\toutopnd.vword+=rppoptr(c_comma);\r\n\t\t\t\t\t\toutopnd.vword+=tword(rppkey(c_this));\r\n\t\t\t\t\t\toutopnd.vword+=rppoptr(c_comma);\r\n\t\t\t\t\t\toutopnd.vword+=src.vword[i];\r\n\t\t\t\t\t\toutopnd.vword+=tword(rppoptr(c_mbk_r));\r\n\t\t\t\t\t\toutopnd.type=ptdi->type;\r\n\t\t\t\t\t\tsopnd.push_move(outopnd);\r\n\t\t\t\t\t\tcontinue;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tptdi=zfind::data_member_search(*sh.m_main,name);\r\n\t\t\t\tif(ptdi!=null)\r\n\t\t\t\t{\r\n\t\t\t\t\t//全局变量\r\n\t\t\t\t\toutopnd.vword+=tword(rppoptr(c_mbk_l));\r\n\t\t\t\t\toutopnd.vword+=tword(rppoptr(c_dot));\r\n\t\t\t\t\toutopnd.vword+=rppoptr(c_comma);\r\n\t\t\t\t\toutopnd.vword+=tword(rppkey(c_pmain));\r\n\t\t\t\t\toutopnd.vword+=rppoptr(c_comma);\r\n\t\t\t\t\toutopnd.vword+=src.vword[i];\r\n\t\t\t\t\toutopnd.vword+=tword(rppoptr(c_mbk_r));\r\n\t\t\t\t\toutopnd.type=ptdi->type;\r\n\t\t\t\t\tsopnd.push_move(outopnd);\r\n\t\t\t\t\tcontinue;\r\n\t\t\t\t}\r\n\t\t\t\tif(env.ptfi!=null)\r\n\t\t\t\t{\r\n\t\t\t\t\tptdi=zfind::local_search(*env.ptfi,name);\r\n\t\t\t\t\tif(ptdi!=null)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\t//环境变量\r\n\t\t\t\t\t\toutopnd.vword+=tword(rppoptr(c_mbk_l));\r\n\t\t\t\t\t\toutopnd.vword+=tword(rppoptr(c_dot));\r\n\t\t\t\t\t\toutopnd.vword+=rppoptr(c_comma);\r\n\t\t\t\t\t\toutopnd.vword+=tword(rppkey(c_penv));\r\n\t\t\t\t\t\toutopnd.vword+=rppoptr(c_comma);\r\n\t\t\t\t\t\toutopnd.vword+=src.vword[i];\r\n\t\t\t\t\t\toutopnd.vword+=tword(rppoptr(c_mbk_r));\r\n\t\t\t\t\t\toutopnd.type=ptdi->type;\r\n\t\t\t\t\t\tsopnd.push_move(outopnd);\r\n\t\t\t\t\t\tcontinue;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tif(!p_func_call(sh,src,outopnd,tfi,level,i,env))\r\n\t\t\t\t\treturn false;\r\n\t\t\t\tsopnd.push_move(outopnd);\r\n\t\t\t}\r\n\t\t}\r\n\t\tif(sopnd.count()!=1)\r\n\t\t{\r\n\t\t\tsrc.vword.print();\r\n\t\t\tsh.error(src,\"expression error\");\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\tdst=r_move(sopnd[0]);\r\n\t\tif(dst.vword.empty()||dst.type.empty()||dst.pos.line==0)\r\n\t\t{\r\n\t\t\tsh.error(src,\"expression error\");\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\treturn true;\r\n\t}\r\n\r\n\tstatic void set_func(tsh& sh,tsent& outopnd,rbuf<tsent>&& vsent,tfunc* ptfi)\r\n\t{\r\n\t\ttclass* ptci=ptfi->ptci;\r\n\t\toutopnd.type=ptfi->retval.type;\r\n\t\toutopnd.vword+=tword(rppoptr(c_mbk_l));\r\n\t\toutopnd.vword+=tword(ptci->name);\r\n\t\toutopnd.vword+=rppoptr(c_comma);\r\n\t\toutopnd.vword+=tword(ptfi->name_dec);\r\n\t\toutopnd.vword+=rppoptr(c_comma);\r\n\t\toutopnd.vword+=tword(rppoptr(c_mbk_l));\r\n\t\tfor(int i=0;i<vsent.count();i++)\r\n\t\t{\r\n\t\t\tif(i!=0)\r\n\t\t\t{\r\n\t\t\t\toutopnd.vword+=rppoptr(c_comma);\r\n\t\t\t}\r\n\t\t\toutopnd.vword+=r_move(vsent[i].vword);\r\n\t\t}\r\n\t\toutopnd.vword+=tword(rppoptr(c_mbk_r));\r\n\t\toutopnd.vword+=tword(rppoptr(c_mbk_r));\r\n\t}\r\n};\r\n\r\n#endif"
  },
  {
    "path": "rpp/zfind.h",
    "content": "﻿#ifndef zfind_h__\r\n#define zfind_h__\r\n\r\n#include \"tsh.h\"\r\n\r\n//查找类\r\nstruct zfind\r\n{\r\n\t//获取类型大小\r\n\tstatic int get_type_size(tsh& sh,const rstr& s)\r\n\t{\r\n\t\tif(sh.is_point_quote(s))\r\n\t\t\treturn c_point_size;\r\n\t\ttclass* ptci=class_search_t(sh,s);\r\n\t\tif(ptci!=null)\r\n\t\t\treturn ptci->size;\r\n\t\treturn 0;\r\n\t}\r\n\r\n\tstatic int get_func_local_size(const tfunc& tfi)\r\n\t{\r\n\t\tint ret=0;\r\n\t\tfor(int i=0;i<tfi.local.count();++i)\r\n\t\t\tret+=get_ceil_space(tfi.local[i]);\r\n\t\treturn ret;\r\n\t}\r\n\r\n\tstatic int get_func_param_size(const tfunc& tfi)\r\n\t{\r\n\t\tint ret=0;\r\n\t\tfor(int i=0;i<tfi.param.count();++i)\r\n\t\t\tret+=get_ceil_space(tfi.param[i]);\r\n\t\treturn ret;\r\n\t}\r\n\r\n\t//不包括返回值\r\n\tstatic int get_func_stack_size(const tfunc& tfi)\r\n\t{\r\n\t\treturn get_func_local_size(tfi)+get_func_param_size(tfi)+c_point_size*2;\r\n\t}\r\n\r\n\t//32位栈空间按4字节排列，64位栈空间按8字节排列，因为amd64没有32位push指令\r\n\tstatic int get_ceil_space(const tdata& tdi)\r\n\t{\r\n\t\treturn r_ceil_div(tdi.size,c_point_size)*c_point_size;\r\n\t}\r\n\r\n\tstatic rbool is_type_mebx(tsh& sh,const rstr& type)\r\n\t{\r\n\t\t//这里不用is_point_quote可略微提高效率\r\n\t\treturn type==rppkey(c_int)||sh.is_point(type)||sh.is_quote(type);\r\n\t}\r\n\r\n\tstatic rbool is_op_pass_type(tsh& sh,const rstr& s)\r\n\t{\r\n\t\treturn s==rppkey(c_int)||s==rppkey(c_uint)||sh.is_point(s);\r\n\t}\r\n\r\n\tstatic rbool is_rstr_optr(tsh& sh,const rstr& s)\r\n\t{\r\n\t\treturn s==rppoptr(c_plus)||s==rppoptr(c_equalequal)||\r\n\t\t\ts==rppoptr(c_notequal)||s==rppoptr(c_greatequal)||\r\n\t\t\ts==rppoptr(c_lessequal);\r\n\t\t//大于和小于最好不要加上，防止与尖括号作用冲突\r\n\t}\r\n\r\n\tstatic rbool is_end_part_optr(tsh& sh,const rstr& s)\r\n\t{\r\n\t\tif(!sh.m_optr.is_optr(s))\r\n\t\t\treturn false;\r\n\t\treturn s==rppoptr(c_dot)||s==rppoptr(c_sbk_r)||\r\n\t\t\ts==rppoptr(c_mbk_r)||s==rppoptr(c_plus);\r\n\t\t//还有很多这样的运算符，暂时不写\r\n\t}\r\n\r\n\tstatic rbool is_empty_struct_type(tsh& sh,const rstr& s)\r\n\t{\r\n\t\treturn s==rppkey(c_int)||s==rppkey(c_char)||\r\n\t\t\ts==rppkey(c_uint)||s==rppkey(c_int8)||\r\n\t\t\ts==rppkey(c_double)||s==rppkey(c_rd4)||\r\n\t\t\ts==\"float\"||sh.is_point_quote(s);\r\n\t}\r\n\r\n\tstatic rbool is_class(tsh& sh,const rstr& s)\r\n\t{\r\n\t\treturn class_search(sh,s)!=null;\r\n\t}\r\n\r\n\tstatic rbool is_class_t(tsh& sh,const rstr& s)\r\n\t{\r\n\t\treturn class_search_t(sh,s)!=null;\r\n\t}\r\n\r\n\tstatic rbool is_classtl(tsh& sh,const rstr& s)\r\n\t{\r\n\t\treturn classtl_search(sh,s)!=null;\r\n\t}\r\n\r\n\tstatic tclass* class_search_t(tsh& sh,const rstr& name)\r\n\t{\r\n\t\treturn class_search(sh,sh.get_tname(name));\r\n\t}\r\n\r\n\tstatic tclass* class_search(tsh& sh,const rstr& name)\r\n\t{\r\n\t\ttclass item;\r\n\t\titem.name=name;\r\n\t\treturn sh.m_class.find(item);\r\n\t}\r\n\r\n\tstatic tclass* classtl_search(tsh& sh,const rstr& name)\r\n\t{\r\n\t\ttclass item;\r\n\t\titem.name=name;\r\n\t\treturn sh.m_classtl.find(item);\r\n\t}\r\n\r\n\t//先搜索友元空参，再搜索非友元空参\r\n\tstatic tfunc* func_search_empty_param_m(tclass& tci,\r\n\t\tconst rstr& fname,rbool is_friend)\r\n\t{\r\n\t\t//友元只能调用友元\r\n\t\tif(is_friend)\r\n\t\t\treturn func_search_empty_param_f(tci,fname);\r\n\t\ttfunc* ptfi=func_search_empty_param_f(tci,fname);\r\n\t\tif(null==ptfi)\r\n\t\t\tptfi=func_search_empty_param_n(tci,fname);\r\n\t\treturn ptfi;\r\n\t}\r\n\t\r\n\t//先搜索友元多参，再搜索非友元多参\r\n\tstatic tfunc* func_search_multi_param_m(tclass& tci,\r\n\t\tconst rstr& fname,rbool is_friend)\r\n\t{\r\n\t\tif(is_friend)\r\n\t\t\treturn func_search_multi_param_f(tci,fname);\r\n\t\ttfunc* ptfi=func_search_multi_param_f(tci,fname);\r\n\t\tif(null==ptfi)\r\n\t\t\tptfi=func_search_multi_param_n(tci,fname);\r\n\t\treturn ptfi;\r\n\t}\r\n\t\r\n\t//搜索非友元参数大于等于1个的函数（实际大于等于2）\r\n\tstatic tfunc* func_search_multi_param_n(tclass& tci,const rstr& fname)\r\n\t{\r\n\t\tfor(tfunc* p=tci.vfunc.begin();p!=tci.vfunc.end();p=tci.vfunc.next(p))\r\n\t\t{\r\n\t\t\tif(fname==p->name&&\r\n\t\t\t\t!p->is_friend&&\r\n\t\t\t\tp->param.count()>=2&&\r\n\t\t\t\tp->param[0].type==tci.name+rstr(\"&\"))\r\n\t\t\t\treturn p;\r\n\t\t}\r\n\t\treturn null;\r\n\t}\r\n\r\n\t//搜索非友元空参函数（类成员空参函数）\r\n\tstatic tfunc* func_search_empty_param_n(tclass& tci,const rstr& fname)\r\n\t{\r\n\t\tfor(tfunc* p=tci.vfunc.begin();p!=tci.vfunc.end();p=tci.vfunc.next(p))\r\n\t\t{\r\n\t\t\tif(fname==p->name&&\r\n\t\t\t\t!p->is_friend&&\r\n\t\t\t\tp->param.count()==1&&\r\n\t\t\t\tp->param[0].type==tci.name+rstr(\"&\"))\r\n\t\t\t\treturn p;\r\n\t\t}\r\n\t\treturn null;\r\n\t}\r\n\r\n\t//搜索友元参数大于等于1个的函数\r\n\tstatic tfunc* func_search_multi_param_f(tclass& tci,const rstr& fname)\r\n\t{\r\n\t\tfor(tfunc* p=tci.vfunc.begin();p!=tci.vfunc.end();p=tci.vfunc.next(p))\r\n\t\t{\r\n\t\t\tif(fname==p->name&&\r\n\t\t\t\tp->is_friend&&\r\n\t\t\t\tp->param.count()>=1)\r\n\t\t\t\treturn p;\r\n\t\t}\r\n\t\treturn null;\r\n\t}\r\n\r\n\t//搜索友元空参函数\r\n\tstatic tfunc* func_search_empty_param_f(tclass& tci,const rstr& fname)\r\n\t{\r\n\t\tfor(tfunc* p=tci.vfunc.begin();p!=tci.vfunc.end();p=tci.vfunc.next(p))\r\n\t\t{\r\n\t\t\tif(fname==p->name&&\r\n\t\t\t\tp->is_friend&&\r\n\t\t\t\tp->param.empty())\r\n\t\t\t\treturn p;\r\n\t\t}\r\n\t\treturn null;\r\n\t}\r\n\r\n\t//类型完全相同\r\n\tstatic tfunc* func_search_same(tclass& tci,const rstr& fname,\r\n\t\t\tconst rbuf<rstr>& vtype)\r\n\t{\r\n\t\ttfunc tfi;\r\n\t\ttfi.name=fname;\r\n\t\tfor(int i=0;i<vtype.count();i++)\r\n\t\t{\r\n\t\t\ttfi.param.push(vtype[i]);\r\n\t\t}\r\n\t\ttfi.name_dec=tfi.get_dec();\r\n\t\treturn tci.vfunc.find(tfi);\r\n\t}\r\n\r\n\tstatic tfunc* func_search_dec(tclass& tci,const rstr& func_dec)\r\n\t{\r\n\t\ttfunc tfi;\r\n\t\ttfi.name_dec=func_dec;\r\n\t\treturn tci.vfunc.find(tfi);\r\n\t}\r\n\t\r\n\t//根据函数名搜索函数\r\n\tstatic tfunc* func_search(tclass& tci,const rstr& fname)\r\n\t{\r\n\t\tfor(tfunc* p=tci.vfunc.begin();p!=tci.vfunc.end();p=tci.vfunc.next(p))\r\n\t\t{\r\n\t\t\tif(fname==p->name)\r\n\t\t\t\treturn p;\r\n\t\t}\r\n\t\treturn null;\r\n\t}\r\n\r\n\tstatic tfunc* func_search(tclass& tci,const rstr& fname,\r\n\t\tconst rstr& a,const rstr& b)\r\n\t{\r\n\t\ttfunc item;\r\n\t\titem.name=fname;\r\n\t\titem.param.push(a);\r\n\t\titem.param.push(b);\r\n\t\titem.name_dec=item.get_dec();\r\n\t\treturn tci.vfunc.find(item);\r\n\t}\r\n\r\n\tstatic tfunc* func_search(tclass& tci,const rstr& fname,const rstr& a)\r\n\t{\r\n\t\ttfunc item;\r\n\t\titem.name=fname;\r\n\t\titem.param.push(a);\r\n\t\titem.name_dec=item.get_dec();\r\n\t\treturn tci.vfunc.find(item);\r\n\t}\r\n\r\n\tstatic tfunc* ftl_search(tclass& tci,rstr& name)\r\n\t{\r\n\t\ttfunc item;\r\n\t\titem.name=name;\r\n\t\titem.name_dec=item.get_dec();\r\n\t\treturn tci.vfunctl.find(item);\r\n\t}\r\n\r\n\tstatic tfunc* destruct_search(tclass& tci)\r\n\t{\r\n\t\treturn func_search(tci,\"~\"+tci.name,tci.name+\"&\");\r\n\t}\r\n\r\n\tstatic rbool is_destruct(tsh& sh,tfunc& tfi)\r\n\t{\r\n\t\ttclass& tci=*tfi.ptci;\r\n\t\treturn rppoptr(c_destruct)+tci.name==tfi.name&&\r\n\t\t\t\ttfi.param.count()==1&&\r\n\t\t\t\ttfi.param[0].type==tci.name+rppoptr(c_addr)&&\r\n\t\t\t\ttfi.retval.type==rppkey(c_void);\r\n\t}\r\n\r\n\tstatic tfunc* emptystruct_search(tclass& tci)\r\n\t{\r\n\t\treturn func_search(tci,tci.name,tci.name+\"&\");\r\n\t}\r\n\r\n\tstatic rbool is_emptystruct(tsh& sh,tfunc& tfi)\r\n\t{\r\n\t\ttclass& tci=*tfi.ptci;\r\n\t\treturn tci.name==tfi.name&&\r\n\t\t\t\ttfi.param.count()==1&&\r\n\t\t\t\ttfi.param[0].type==tci.name+rppoptr(c_addr)&&\r\n\t\t\t\ttfi.retval.type==rppkey(c_void);\r\n\t}\r\n\r\n\tstatic tfunc* copystruct_search(tclass& tci)\r\n\t{\r\n\t\treturn func_search(tci,tci.name,tci.name+\"&\",tci.name+\"&\");\r\n\t}\r\n\r\n\tstatic tdata* data_member_search(const tclass& tci,const rstr& name)\r\n\t{\r\n\t\tfor(int i=0;i<tci.vdata.count();i++)\r\n\t\t\tif(name==tci.vdata[i].name)\r\n\t\t\t\treturn &tci.vdata[i];\r\n\t\treturn null;\r\n\t}\r\n\r\n\tstatic tdata* local_search(tfunc& tfi,const rstr& name)\r\n\t{\r\n\t\tfor(int i=0;i<tfi.local.count();++i)\r\n\t\t\tif(name==tfi.local[i].name)\r\n\t\t\t\treturn &tfi.local[i];\r\n\t\tfor(int i=0;i<tfi.param.count();++i)\r\n\t\t\tif(name==tfi.param[i].name)\r\n\t\t\t\treturn &tfi.param[i];\r\n\t\tif(tfi.retval.name==name)\r\n\t\t{\r\n\t\t\treturn &tfi.retval;\r\n\t\t}\r\n\t\treturn null;\r\n\t}\r\n};\r\n\r\n#endif\r\n"
  },
  {
    "path": "rpp/zftl.h",
    "content": "﻿#ifndef zftl_h__\r\n#define zftl_h__\r\n\r\n#include \"zctl.h\"\r\n\r\n//函数模板替换类\r\nstruct zftl\r\n{\r\n\tstatic rbool ftl_replace(tsh& sh,tclass& tci,rbuf<tword>& v,tclass* ptci)\r\n\t{\r\n\t\tfor(int i=0;i<v.count();i++)\r\n\t\t{\r\n\t\t\tif(v[i].val!=rppoptr(c_tbk_l))\r\n\t\t\t\tcontinue;\r\n\t\t\tint left=i;\r\n\t\t\trstr name=v.get(left-1).val;\r\n\t\t\tif(ptci==null)\r\n\t\t\t{\r\n\t\t\t\tif(v.get(left-2).val==rppoptr(c_dot))\r\n\t\t\t\t{\r\n\t\t\t\t\tptci=zfind::class_search(sh,v.get(left-3).val);\r\n\t\t\t\t\tif(ptci==null)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tcontinue;\r\n\t\t\t\t\t}\t\r\n\t\t\t\t}\r\n\t\t\t\telse\r\n\t\t\t\t{\r\n\t\t\t\t\tptci=&tci;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\ttfunc* ptfi=zfind::ftl_search(*ptci,name);\r\n\t\t\tif(ptfi==null)\r\n\t\t\t{\r\n\t\t\t\tptci=sh.m_main;\r\n\t\t\t\tptfi=zfind::ftl_search(*ptci,name);\r\n\t\t\t}\r\n\t\t\tif(null==ptfi)\r\n\t\t\t\tcontinue;\r\n\t\t\tint right=sh.find_symm_tbk(v,left);\r\n\t\t\tif(right>=v.count())\r\n\t\t\t{\r\n\t\t\t\tsh.error(v[left-1],\"func template miss >\");\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\trbuf<rbuf<tword> > vparam=sh.comma_split(v.sub(left+1,right));\r\n\t\t\tif(vparam.count()!=ptfi->vtl.count())\r\n\t\t\t{\r\n\t\t\t\tsh.error(v[left-1],\"func template not match\");\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\tfor(int j=left;j<=right;j++)\r\n\t\t\t{\r\n\t\t\t\tv[left-1].val+=v[j].val;\r\n\t\t\t\tv[j].val.clear();\r\n\t\t\t}\r\n\t\t\t//模板函数不可能重载，因此只要判断一下函数名是否相同即可\r\n\t\t\tif(zfind::func_search(*ptci,v[left-1].val)!=null)\r\n\t\t\t{\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\t\t\ttfunc item=*ptfi;\r\n\t\t\titem.vtl.free();\r\n\t\t\tzctl::vtl_replace(item.vword,ptfi->vtl,vparam);\r\n\t\t\tif(!f_type_replace(sh,item.vword))\r\n\t\t\t{\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\tif(!combine_ftl_name(sh,item.vword,ptfi->name))\r\n\t\t\t{\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\tif(!zmemb::func_add(sh,*ptci,item.vword,false))\r\n\t\t\t{\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\ti=right;\r\n\t\t}\r\n\t\tzpre::arrange(v);\r\n\t\treturn true;\r\n\t}\r\n\t\r\n\t//处理函数模板中又出现新类型的情况\r\n\tstatic rbool f_type_replace(tsh& sh,rbuf<tword>& v)\r\n\t{\r\n\t\tint cur=sh.m_class.count();\r\n\t\tif(!zctl::type_replace(sh,v))\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\tif(sh.m_class.count()>cur)\r\n\t\t{\r\n\t\t\tfor(tclass* p=sh.m_class.begin();\r\n\t\t\t\tp!=sh.m_class.end();p=sh.m_class.next(p))\r\n\t\t\t{\r\n\t\t\t\tif(!f_proc_class(sh,*p))\r\n\t\t\t\t{\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn true;\r\n\t}\r\n\t\r\n\tstatic rbool f_proc_class(tsh& sh,tclass& tci)\r\n\t{\r\n\t\tif(!zctl::a_class(sh,tci))\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\tif(!zmemb::recursion_get_size(sh,tci))\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\tzmemb::obtain_size_func(sh,tci);\r\n\t\treturn true;\r\n\t}\r\n\r\n\tstatic rbool combine_ftl_name(tsh& sh,rbuf<tword>& v,rstr& name)\r\n\t{\r\n\t\tfor(int i=1;i<v.count();i++)\r\n\t\t{\r\n\t\t\tif(v[i]!=rppoptr(c_tbk_l))\r\n\t\t\t{\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\t\t\tif(name!=v[i-1].val)\r\n\t\t\t{\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\t\t\tint left=i;\r\n\t\t\tint right=sh.find_symm_tbk(v,left);\r\n\t\t\tif(right>=v.count())\r\n\t\t\t{\r\n\t\t\t\tsh.error(v[left-1],\"miss >\");\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\tfor(int j=left;j<=right;j++)\r\n\t\t\t{\r\n\t\t\t\tv[left-1].val+=v[j].val;\r\n\t\t\t\tv[j].val.clear();\r\n\t\t\t}\r\n\t\t\ti=right;\r\n\t\t}\r\n\t\tzpre::arrange(v);\r\n\t\treturn true;\r\n\t}\r\n};\r\n\r\n#endif\r\n"
  },
  {
    "path": "rpp/zjit.h",
    "content": "﻿#ifndef zjit_h__\r\n#define zjit_h__\r\n\r\n#include \"zjiti.h\"\r\n#include \"znasm.h\"\r\n#include \"zjitf.h\"\r\n\r\nstruct zjit\r\n{\r\n\tstatic rbool run(tsh& sh)\r\n\t{\r\n\t\tinit_addr_list(sh);\r\n#ifdef _MSC_VER\r\n\t\ttfunc* ptfi=zfind::func_search(*sh.m_main,\"__declare\");\r\n\t\tif(ptfi!=null)\r\n\t\t{\r\n\t\t\tfunc_to_x86(sh,*ptfi,tenv());\r\n\t\t}\r\n\t\tptfi=zfind::func_search(*sh.m_main,\"main_c\");\r\n\t\tif(ptfi==null)\r\n\t\t{\r\n\t\t\trf::printl(\"main not find\");\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\tifn(func_to_x86(sh,*ptfi,tenv()))\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\t((void (*)())(ptfi->code))();\r\n\t\treturn true;\r\n#else\r\n\t\treturn false;\r\n#endif\r\n\t}\r\n\r\n\t//将一个函数翻译成X86代码\r\n\tstatic rbool func_to_x86(tsh& sh,tfunc& tfi,tenv env)\r\n\t{\r\n#ifdef _MSC_VER\r\n\t\tif(!tfi.vasm.empty())\r\n\t\t\treturn true;\r\n\t\tif(!zbin::cp_vword_to_vasm(sh,tfi,env))\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\tint size=tfi.vasm.count()*6;//todo 估算法并不是最好的方法\r\n\t\tsize=r_ceil_div(size,4096)*4096;\r\n\t\tif(tfi.code==null)\r\n\t\t{\r\n\t\t\ttfi.code=talloc::alloc_v(size);\r\n\t\t\tif(tfi.code==null)\r\n\t\t\t{\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\tsh.m_addr.insert(taddr(\r\n\t\t\t\t(uint)tfi.code,(uint)(tfi.code+size),&tfi));\r\n\t\t}\r\n\t\tint cur=0;\r\n\t\tfor(int i=0;i<tfi.vasm.count();i++)\r\n\t\t{\r\n\t\t\ttfi.vasm[i].ptfi=&tfi;\r\n\t\t\tifn(a_asm(sh,tfi.vasm[i]))\r\n\t\t\t{\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\ttfi.vasm[i].start=tfi.code+cur;\r\n\t\t\trstr s=asm_to_x86(sh,tfi.vasm[i],tfi.code+cur);\r\n\t\t\tif(s.empty())\r\n\t\t\t{\r\n\t\t\t\tsh.error(tfi.vasm[i],\"can't build jit ins\");\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\tif(cur+s.count()>size)\r\n\t\t\t{\r\n\t\t\t\tsh.error(tfi,\"func too big\");\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\tmemcpy(tfi.code+cur,s.begin(),s.count());\r\n\t\t\tcur+=s.count();\r\n\t\t}\r\n\t\tfor(int i=0;i<tfi.vasm.count();i++)\r\n\t\t{\r\n\t\t\tifn(fix_addr(sh,tfi.vasm[i],tfi.vasm))\r\n\t\t\t{\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn true;\r\n#else\r\n\t\treturn false;\r\n#endif\r\n\t}\r\n\r\n\tstatic rbool fix_addr(tsh& sh,tasm& oasm,rbuf<tasm>& vasm)\r\n\t{\r\n\t\tifn(oasm.vstr.count()==2&&\r\n\t\t\tzbin::is_jmp_ins(oasm.ins.type)&&\r\n\t\t\toasm.vstr[1].is_number())\r\n\t\t{\r\n\t\t\treturn true;\r\n\t\t}\r\n\t\tint line=oasm.vstr[1].toint();\r\n\t\tint i;\r\n\t\tfor(i=0;i<vasm.count();i++)\r\n\t\t{\r\n\t\t\tif(vasm[i].pos.line>=line)\r\n\t\t\t{\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t}\r\n\t\tif(i>=vasm.count())\r\n\t\t{\r\n\t\t\tsh.error(oasm);\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\tifn(a_asm(sh,oasm))\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\toasm.ins.first.type=topnd::c_imme;\r\n\t\toasm.ins.first.val=r_to_uint(vasm[i].start);\r\n\t\tuchar* real=oasm.start;\r\n\t\trstr s=asm_to_x86(sh,oasm,real);\r\n\t\tif(s.empty())\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\tmemcpy(real,s.begin(),s.count());\r\n\t\treturn true;\r\n\t}\r\n\r\n\tstatic rstr asm_to_x86(tsh& sh,tasm& item,uchar* start)\r\n\t{\r\n\t\ttins& ins=item.ins;\r\n\t\trbuf<rstr>& vstr=item.vstr;\r\n\t\trstr s;\r\n\t\tswitch(ins.type)\r\n\t\t{\r\n\t\tcase tkey::c_calle:\r\n\t\t\treturn p_calle(sh,ins,start);\r\n\t\tcase tkey::c_call:\r\n\t\t\treturn zjiti::b_call(ins,start);\r\n\t\tcase tkey::c_retn:\r\n\t\t\treturn zjiti::b_retn();\r\n\t\tcase tkey::c_reti:\r\n\t\t\treturn zjiti::b_reti(ins);\r\n\t\tcase tkey::c_push:\r\n\t\t\treturn zjiti::b_push(ins);\r\n\t\tcase tkey::c_pop:\r\n\t\t\treturn zjiti::b_pop(ins);\r\n\t\tcase tkey::c_jmp:\r\n\t\t\treturn zjiti::b_jmp(ins,start);\r\n\t\tcase tkey::c_jebxz:\r\n\t\t\treturn rppj4(b_cmp,rppkey(c_ebx),rppoptr(c_comma),\"0\")+\r\n\t\t\t\tzjiti::b_jz(ins,start+6);\r\n\t\tcase tkey::c_jebxnz:\r\n\t\t\treturn rppj4(b_cmp,rppkey(c_ebx),rppoptr(c_comma),\"0\")+\r\n\t\t\t\tzjiti::b_jnz(ins,start+6);\r\n\t\tcase tkey::c_nop:\r\n\t\t\treturn zjiti::b_nop();\r\n\t\tcase tkey::c_lea:\r\n\t\t\tif(znasm::count_mbk_l(vstr)!=2)\r\n\t\t\t\treturn zjiti::b_lea(ins);\r\n\t\t\t//应该检查b_lea是否返回空串\r\n\t\t\treturn rppj4(b_lea,rppkey(c_ecx),rppoptr(c_comma),rppjb)+\r\n\t\t\t\trppj4(b_mov,rppja,rppoptr(c_comma),rppkey(c_ecx));\r\n\t\tcase tkey::c_mov:\r\n\t\t\tif(znasm::count_mbk_l(vstr)!=2)\r\n\t\t\t\treturn zjiti::b_mov(ins);\r\n\t\t\treturn rppj4(b_mov,rppkey(c_ecx),rppoptr(c_comma),rppjb)+\r\n\t\t\t\trppj4(b_mov,rppja,rppoptr(c_comma),rppkey(c_ecx));\r\n\t\tcase tkey::c_mov1:\r\n\t\t\treturn rppj4(b_mov1_cl_addr,rppkey(c_ecx),rppoptr(c_comma),rppjb)+\r\n\t\t\t\trppj4(b_mov1_addr_cl,rppja,rppoptr(c_comma),rppkey(c_ecx));\r\n\t\tcase tkey::c_mov8:\r\n\t\t\ts+=rppj4(b_mov,rppkey(c_ecx),rppoptr(c_comma),rppjb);\r\n\t\t\ts+=rppj4(b_mov,rppja,rppoptr(c_comma),rppkey(c_ecx));\r\n\t\t\tins.first.val+=4;\r\n\t\t\tins.second.val+=4;\r\n\t\t\ts+=rppj4(b_mov,rppkey(c_ecx),rppoptr(c_comma),rppjb);\r\n\t\t\ts+=rppj4(b_mov,rppja,rppoptr(c_comma),rppkey(c_ecx));\r\n\t\t\treturn r_move(s);\r\n\t\tcase tkey::c_add:\r\n\t\t\tif(znasm::count_mbk_l(vstr)!=2)\r\n\t\t\t\treturn zjiti::b_add(ins);\r\n\t\t\treturn rppj4(b_mov,rppkey(c_ecx),rppoptr(c_comma),rppjb)+\r\n\t\t\t\trppj4(b_add,rppja,rppoptr(c_comma),rppkey(c_ecx));\r\n\t\tcase tkey::c_sub:\r\n\t\t\tif(znasm::count_mbk_l(vstr)!=2)\r\n\t\t\t\treturn zjiti::b_sub(ins);\r\n\t\t\treturn rppj4(b_mov,rppkey(c_ecx),rppoptr(c_comma),rppjb)+\r\n\t\t\t\trppj4(b_sub,rppja,rppoptr(c_comma),rppkey(c_ecx));\r\n\t\tcase tkey::c_imul:\r\n\t\t\treturn rppj4(b_mov,rppkey(c_ecx),rppoptr(c_comma),rppja)+\r\n\t\t\t\trppj4(b_imul,rppkey(c_ecx),rppoptr(c_comma),rppjb)+\r\n\t\t\t\trppj4(b_mov,rppja,rppoptr(c_comma),rppkey(c_ecx));\r\n\t\tcase tkey::c_idiv:\r\n\t\t\treturn rppj4(b_mov,rppkey(c_eax),rppoptr(c_comma),rppja)+\r\n\t\t\t\tzjiti::b_cdq()+\r\n\t\t\t\trppj4(b_mov,rppkey(c_ecx),rppoptr(c_comma),rppjb)+\r\n\t\t\t\trppj4(b_idiv,rppkey(c_ecx),rppoptr(c_comma),\"0\")+\r\n\t\t\t\trppj4(b_mov,rppja,rppoptr(c_comma),rppkey(c_eax));\r\n\t\tcase tkey::c_imod:\r\n\t\t\treturn rppj4(b_mov,rppkey(c_eax),rppoptr(c_comma),rppja)+\r\n\t\t\t\tzjiti::b_cdq()+\r\n\t\t\t\trppj4(b_mov,rppkey(c_ecx),rppoptr(c_comma),rppjb)+\r\n\t\t\t\trppj4(b_idiv,rppkey(c_ecx),rppoptr(c_comma),\"0\")+\r\n\t\t\t\trppj4(b_mov,rppja,rppoptr(c_comma),rppkey(c_edx));\r\n\t\tcase tkey::c_udiv:\r\n\t\t\treturn rppj4(b_mov,rppkey(c_eax),rppoptr(c_comma),rppja)+\r\n\t\t\t\trppj4(b_xor,rppkey(c_edx),rppoptr(c_comma),rppkey(c_edx))+\r\n\t\t\t\trppj4(b_mov,rppkey(c_ecx),rppoptr(c_comma),rppjb)+\r\n\t\t\t\trppj4(b_udiv,rppkey(c_ecx),rppoptr(c_comma),\"0\")+\r\n\t\t\t\trppj4(b_mov,rppja,rppoptr(c_comma),rppkey(c_eax));\r\n\t\tcase tkey::c_umod:\r\n\t\t\treturn rppj4(b_mov,rppkey(c_eax),rppoptr(c_comma),rppja)+\r\n\t\t\t\trppj4(b_xor,rppkey(c_edx),rppoptr(c_comma),rppkey(c_edx))+\r\n\t\t\t\trppj4(b_mov,rppkey(c_ecx),rppoptr(c_comma),rppjb)+\r\n\t\t\t\trppj4(b_udiv,rppkey(c_ecx),rppoptr(c_comma),\"0\")+\r\n\t\t\t\trppj4(b_mov,rppja,rppoptr(c_comma),rppkey(c_edx));\r\n\t\tcase tkey::c_cesb:\r\n\t\t\trppjcmp(b_sete_bl);\r\n\t\tcase tkey::c_cnesb:\r\n\t\t\trppjcmp(b_setne_bl);\r\n\t\tcase tkey::c_cgsb:\r\n\t\t\trppjcmp(b_setg_bl);\r\n\t\tcase tkey::c_cgesb:\r\n\t\t\trppjcmp(b_setge_bl);\r\n\t\tcase tkey::c_clsb:\r\n\t\t\trppjcmp(b_setl_bl);\r\n\t\tcase tkey::c_clesb:\r\n\t\t\trppjcmp(b_setle_bl);\r\n\t\tcase tkey::c_ucgsb:\r\n\t\t\trppjcmp(b_seta_bl);\r\n\t\tcase tkey::c_ucgesb:\r\n\t\t\trppjcmp(b_setae_bl);\r\n\t\tcase tkey::c_uclsb:\r\n\t\t\trppjcmp(b_setb_bl);\r\n\t\tcase tkey::c_uclesb:\r\n\t\t\trppjcmp(b_setbe_bl);\r\n\t\tcase tkey::c_band:\r\n\t\t\tif(znasm::count_mbk_l(vstr)!=2)\r\n\t\t\t\treturn zjiti::b_and(ins);\r\n\t\t\treturn rppj4(b_mov,rppkey(c_ecx),rppoptr(c_comma),rppjb)+\r\n\t\t\t\trppj4(b_and,rppja,rppoptr(c_comma),rppkey(c_ecx));\r\n\t\tcase tkey::c_bor:\r\n\t\t\tif(znasm::count_mbk_l(vstr)!=2)\r\n\t\t\t\treturn zjiti::b_or(ins);\r\n\t\t\treturn rppj4(b_mov,rppkey(c_ecx),rppoptr(c_comma),rppjb)+\r\n\t\t\t\trppj4(b_or,rppja,rppoptr(c_comma),rppkey(c_ecx));\r\n\t\tcase tkey::c_bxor:\r\n\t\t\tif(znasm::count_mbk_l(vstr)!=2)\r\n\t\t\t\treturn zjiti::b_xor(ins);\r\n\t\t\treturn rppj4(b_mov,rppkey(c_ecx),rppoptr(c_comma),rppjb)+\r\n\t\t\t\trppj4(b_xor,rppja,rppoptr(c_comma),rppkey(c_ecx));\r\n\t\tcase tkey::c_bnot:\r\n\t\t\treturn zjiti::b_not(ins);\r\n\t\t}\r\n\t\treturn rstr();\r\n\t}\r\n\r\n\tstatic rstr p_calle(tsh& sh,tins& ins,uchar* start)\r\n\t{\r\n\t\tchar* name=(char*)ins.first.val;\r\n\t\tvoid* temp=null;\r\n\t\tif(sh.m_jit_f.find(name)!=null)\r\n\t\t{\r\n\t\t\ttemp=sh.m_jit_f[name];\r\n\t\t}\r\n\t\tif(temp==null)\r\n\t\t{\r\n\t\t\ttemp=zjitf::find_dll_full(name);\r\n\t\t}\r\n\t\tif(temp==null)\r\n\t\t{\r\n\t\t\treturn rstr();\r\n\t\t}\r\n\t\tins.first.val=(int)temp;\r\n\t\treturn zjiti::b_call(ins,start);\r\n\t}\r\n\r\n\tstatic rbool a_asm(tsh& sh,tasm& item)\r\n\t{\r\n\t\tint i=zbin::find_comma(sh,item.vstr);\r\n\t\tif(!a_opnd(sh,item,i-1,item.vstr.sub(1,i),item.ins.first))\r\n\t\t\treturn false;\r\n\t\tif(!a_opnd(sh,item,i+1,item.vstr.sub(i+1),item.ins.second))\r\n\t\t\treturn false;\r\n\t\titem.ins.type=sh.m_key.get_key_index(item.vstr.get_bottom());\r\n\t\treturn true;\r\n\t}\r\n\r\n\tstatic rbool a_opnd(tsh& sh,tasm& item,int index,const rbuf<rstr>& v,topnd& o)\r\n\t{\r\n\t\tif(v.count()==7&&v[1]==rppoptr(c_addr))\r\n\t\t{\r\n\t\t\ttfunc* ptfi=znasm::call_find(sh,item);\r\n\t\t\tif(ptfi==null)\r\n\t\t\t{\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\tifn(func_to_x86(sh,*ptfi,tenv()))\r\n\t\t\t{\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\to.type=topnd::c_imme;\r\n\t\t\to.val=r_to_uint(ptfi->code);\r\n\t\t\treturn true;\r\n\t\t}\r\n\t\treturn zbin::a_opnd(sh,item,index,v,o);\r\n\t}\r\n\r\n\tstatic tins build_ins(tsh& sh,rstr s1,rstr s2,rstr s3,rstr s4)\r\n\t{\r\n\t\ttasm item;\r\n\t\titem.vstr+=s1;\r\n\t\titem.vstr+=s2;\r\n\t\titem.vstr+=s3;\r\n\t\titem.vstr+=s4;\r\n\t\ta_asm(sh,item);\r\n\t\treturn item.ins;\r\n\t}\r\n\r\n\tstatic tins build_ins(tsh& sh,rstr s1,rstr s2,rstr s3,rbuf<rstr> s4)\r\n\t{\r\n\t\ttasm item;\r\n\t\titem.vstr+=s1;\r\n\t\titem.vstr+=s2;\r\n\t\titem.vstr+=s3;\r\n\t\titem.vstr+=s4;\r\n\t\ta_asm(sh,item);\r\n\t\treturn item.ins;\r\n\t}\r\n\r\n\tstatic tins build_ins(tsh& sh,rstr s1,rbuf<rstr> s2,rstr s3,rstr s4)\r\n\t{\r\n\t\ttasm item;\r\n\t\titem.vstr+=s1;\r\n\t\titem.vstr+=s2;\r\n\t\titem.vstr+=s3;\r\n\t\titem.vstr+=s4;\r\n\t\ta_asm(sh,item);\r\n\t\treturn item.ins;\r\n\t}\r\n\r\n\t//非多线程安全\r\n\tstatic void* find_func(char* name)\r\n\t{\r\n\t\ttfunc* ptfi=zbin::find_func(*zjitf::get_psh(),name);\r\n\t\tif(ptfi==null)\r\n\t\t{\r\n\t\t\treturn null;\r\n\t\t}\r\n\t\tifn(func_to_x86(*zjitf::get_psh(),*ptfi,tenv()))\r\n\t\t{\r\n\t\t\treturn null;\r\n\t\t}\r\n\t\treturn ptfi->code;\r\n\t}\r\n\r\n\tstatic void init_addr_list(tsh& sh)\r\n\t{\r\n\t\trppjf(\"add8\",zjitf::add8);\r\n\t\trppjf(\"sub8\",zjitf::sub8);\r\n\t\trppjf(\"imul8\",zjitf::imul8);\r\n\t\trppjf(\"idiv8\",zjitf::idiv8);\r\n\t\trppjf(\"imod8\",zjitf::imod8);\r\n\t\trppjf(\"cgsb8\",zjitf::cgsb8);\r\n\t\trppjf(\"clsb8\",zjitf::clsb8);\r\n\t\trppjf(\"fadd8\",zjitf::fadd8);\r\n\t\trppjf(\"fsub8\",zjitf::fsub8);\r\n\t\trppjf(\"fmul8\",zjitf::fmul8);\r\n\t\trppjf(\"fdiv8\",zjitf::fdiv8);\r\n\t\trppjf(\"fcgsb8\",zjitf::fcgsb8);\r\n\t\trppjf(\"fclsb8\",zjitf::fclsb8);\r\n\t\trppjf(\"bshl\",zjitf::bshl);\r\n\t\trppjf(\"bshr\",zjitf::bshr);\r\n\t\trppjf(\"bsar\",zjitf::bsar);\r\n\t\trppjf(\"get_argc\",zjitf::get_argc);\r\n\t\trppjf(\"get_argv\",zjitf::get_argv);\r\n\t\trppjf(\"get_hins\",zjitf::get_hins);\r\n\t\trppjf(\"set_main_ret\",zjitf::set_main_ret);\r\n\t\trppjf(\"find_func\",find_func);\r\n\t\trppjf(\"find_dll\",zjitf::find_dll_q);\r\n\t\trppjf(\"utf8_to_gbk\",rcode::utf8_to_gbk_c);\r\n\t\trppjf(\"get_cur_func\",zjitf::get_cur_func);\r\n\t\trppjf(\"get_vclass\",zjitf::get_vclass);\r\n\t\trppjf(\"eval\",eval);\r\n\t\trppjf(\"eval_vstr\",eval_vstr);\r\n\t\trppjf(\"_float_to_double\",zjitf::_float_to_double);\r\n\t\trppjf(\"sin\",zjitf::sin);\r\n\t\trppjf(\"cos\",zjitf::cos);\r\n\t\trppjf(\"sqrt\",zjitf::sqrt);\r\n\t\trppjf(\"set_dll_list\",zjitf::set_dll_list);\r\n\t\trppjf(\"find_symm_sbk\",_find_symm_sbk);\r\n\t\trppjf(\"get_psh\",zjitf::get_psh);\r\n\t\t\r\n\t\t//必须在这里注册否则malloc与从DLL中找到的不一致\r\n\t\trppjf(\"malloc\",::malloc);\r\n\t\trppjf(\"free\",::free);\r\n\t}\r\n\r\n\tstatic rbool eval_vstr(rbuf<rstr>& vstr,tenv env)\r\n\t{\r\n\t\trbuf<tword> v;\r\n\t\tfor(int i=0;i<vstr.count();i++)\r\n\t\t{\r\n\t\t\tv+=tword(vstr[i]);\r\n\t\t\tv[i].pos.line=1;\r\n\t\t}\r\n\t\treturn eval_v(v,env);\r\n\t}\r\n\r\n\tstatic rbool eval_v(rbuf<tword>& v,tenv env)\r\n\t{\r\n\t\ttsh& sh=*zjitf::get_psh();\r\n\t\tzpre::def_replace(sh,sh.m_vdefine,v);\r\n\t\tif(!zctl::type_replace(sh,v))\r\n\t\t{\r\n\t\t\tsh.error(\"type_replace\");\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\ttfunc tfi;\r\n\t\ttfi.ptci=sh.m_main;\r\n\t\ttfi.vword=v;\r\n\t\ttfi.first_pos.line=1;\r\n\t\ttfi.last_pos.line=tfi.vword.get_top().pos.line+10;\r\n\t\ttfi.retval.type=rppkey(c_int);\r\n\t\ttfi.retval.name=rppkey(c_s_ret);\r\n\t\ttfi.is_cfunc=true;\r\n\t\tif(!func_to_x86(sh,tfi,env))\r\n\t\t{\r\n\t\t\tsh.error(\"func_to_x86\");\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\tuchar* temp=tfi.code;\r\n\t\t__asm sub esp,4\r\n\t\t__asm call temp\r\n\t\t__asm mov esi,[esp]\r\n\t\t__asm mov temp,esi\r\n\t\t__asm add esp,4\r\n\t\treturn (int)temp;\r\n\t}\r\n\r\n\tstatic rbool eval(uchar* s,tenv env)\r\n\t{\r\n\t\ttsh& sh=*zjitf::get_psh();\r\n\t\trbuf<tword> v;\r\n\t\tif(!zpre::str_analyse(sh,rstr(s),v,null))\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\treturn eval_v(v,env);\r\n\t}\r\n};\r\n\r\n#endif\r\n"
  },
  {
    "path": "rpp/zjitb.h",
    "content": "﻿#ifndef zjitb_h__\r\n#define zjitb_h__\r\n\r\n#include \"znasm.h\"\r\n\r\n//jit基础类\r\nstruct zjitb\r\n{\r\n\tstatic rstr build_one(int one)\r\n\t{\r\n\t\trstr s;\r\n\t\ts.set_size(1);\r\n\t\ts[0]=one;\r\n\t\treturn r_move(s);\r\n\t}\r\n\r\n\tstatic rstr build_two(int one,int two)\r\n\t{\r\n\t\trstr s;\r\n\t\ts.set_size(2);\r\n\t\ts[0]=one;\r\n\t\ts[1]=two;\r\n\t\treturn r_move(s);\r\n\t}\r\n\r\n\tstatic rstr build_three(int one,int two,int three)\r\n\t{\r\n\t\trstr s;\r\n\t\ts.set_size(3);\r\n\t\ts[0]=one;\r\n\t\ts[1]=two;\r\n\t\ts[2]=three;\r\n\t\treturn r_move(s);\r\n\t}\r\n\r\n\tstatic rstr build_i(const tins& ins,int one)\r\n\t{\r\n\t\trstr s;\r\n\t\ts.set_size(5);\r\n\t\ts[0]=one;\r\n\t\t*(int*)&s[1]=ins.first.val;\r\n\t\treturn r_move(s);\r\n\t}\r\n\r\n\tstatic rstr build_r(const tins& ins,int one)\r\n\t{\r\n\t\trstr s;\r\n\t\ts.set_size(1);\r\n\t\ts[0]=one;\r\n\t\tset_reg_bit(ins.first.off,&s[0]);\r\n\t\treturn r_move(s);\r\n\t}\r\n\r\n\tstatic rstr build_r(const tins& ins,int one,int two)\r\n\t{\r\n\t\trstr s;\r\n\t\ts.set_size(2);\r\n\t\ts[0]=one;\r\n\t\ts[1]=two;\r\n\t\tset_reg_bit(ins.first.off,&s[1]);\r\n\t\treturn r_move(s);\r\n\t}\r\n\r\n\tstatic rstr build_a(const tins& ins,int one,int two)\r\n\t{\r\n\t\trstr s;\r\n\t\tif(ins.first.off==treg::c_esp)\r\n\t\t{\r\n\t\t\ts.set_size(7);\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\ts.set_size(6);\r\n\t\t}\r\n\t\ts[0]=one;\r\n\t\ts[1]=two;\r\n\t\tset_addr_bit(ins.first.off,&s[1],ins.first.val);\r\n\t\treturn r_move(s);\r\n\t}\r\n\r\n\tstatic rstr build_relative(const tins& ins,uchar* start,int one)\r\n\t{\r\n\t\trstr s;\r\n\t\ts.set_size(5);\r\n\t\ts[0]=one;\r\n\t\t*(int*)&s[1]=ins.first.val-((int)start+s.count());\r\n\t\treturn r_move(s);\r\n\t}\r\n\r\n\tstatic rstr build_relative(const tins& ins,uchar* start,int one,int two)\r\n\t{\r\n\t\trstr s;\r\n\t\ts.set_size(6);\r\n\t\ts[0]=one;\r\n\t\ts[1]=two;\r\n\t\t*(int*)&s[2]=ins.first.val-((int)start+s.count());\r\n\t\treturn r_move(s);\r\n\t}\r\n\r\n\tstatic rstr build_ri(const tins& ins,int one)\r\n\t{\r\n\t\trstr s;\r\n\t\ts.set_size(5);\r\n\t\ts[0]=one;\r\n\t\tset_reg_bit(ins.first.off,&s[0]);\r\n\t\t*(int*)&s[1]=ins.second.val;\r\n\t\treturn r_move(s);\r\n\t}\r\n\r\n\tstatic rstr build_ri(const tins& ins,int one,int two)\r\n\t{\r\n\t\trstr s;\r\n\t\ts.set_size(6);\r\n\t\ts[0]=one;\r\n\t\ts[1]=two;\r\n\t\tset_reg_bit(ins.first.off,&s[1]);\r\n\t\t*(int*)&s[2]=ins.second.val;\r\n\t\treturn r_move(s);\r\n\t}\r\n\r\n\tstatic rstr build_rr(const tins& ins,int one,int two)\r\n\t{\r\n\t\trstr s;\r\n\t\ts.set_size(2);\r\n\t\ts[0]=one;\r\n\t\ts[1]=two;\r\n\t\tset_reg_bit_center(ins.first.off,&s[1]);\r\n\t\tset_reg_bit(ins.second.off,&s[1]);\r\n\t\treturn r_move(s);\r\n\t}\r\n\r\n\tstatic rstr build_ra(const tins& ins,int one,int two)\r\n\t{\r\n\t\trstr s;\r\n\t\tif(ins.second.off==treg::c_esp)\r\n\t\t{\r\n\t\t\ts.set_size(7);\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\ts.set_size(6);\r\n\t\t}\r\n\t\ts[0]=one;\r\n\t\ts[1]=two;\r\n\t\tset_reg_bit_center(ins.first.off,&s[1]);\r\n\t\tset_addr_bit(ins.second.off,&s[1],ins.second.val);\r\n\t\treturn r_move(s);\r\n\t}\r\n\r\n\tstatic rstr build_ai(const tins& ins,int one,int two)\r\n\t{\r\n\t\trstr s;\r\n\t\tif(ins.first.off==treg::c_esp)\r\n\t\t{\r\n\t\t\ts.set_size(11);\r\n\t\t\t*(int*)&s[7]=ins.second.val;\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\ts.set_size(10);\r\n\t\t\t*(int*)&s[6]=ins.second.val;\r\n\t\t}\r\n\t\ts[0]=one;\r\n\t\ts[1]=two;\r\n\t\tset_addr_bit(ins.first.off,&s[1],ins.first.val);\r\n\t\treturn r_move(s);\r\n\t}\r\n\r\n\tstatic rstr build_ar(const tins& ins,int one,int two)\r\n\t{\r\n\t\trstr s;\r\n\t\tif(ins.first.off==treg::c_esp)\r\n\t\t{\r\n\t\t\ts.set_size(7);\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\ts.set_size(6);\r\n\t\t}\r\n\t\ts[0]=one;\r\n\t\ts[1]=two;\r\n\t\tset_addr_bit(ins.first.off,&s[1],ins.first.val);\r\n\t\tset_reg_bit_center(ins.second.off,&s[1]);\r\n\t\treturn r_move(s);\r\n\t}\r\n\r\n\tstatic rstr build_ra(const tins& ins,int one,int two,int three)\r\n\t{\r\n\t\trstr s;\r\n\t\tif(ins.second.off==treg::c_esp)\r\n\t\t{\r\n\t\t\ts.set_size(8);\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\ts.set_size(7);\r\n\t\t}\r\n\t\ts[0]=one;\r\n\t\ts[1]=two;\r\n\t\ts[2]=three;\r\n\t\tset_reg_bit_center(ins.first.off,&s[2]);\r\n\t\tset_addr_bit(ins.second.off,&s[2],ins.second.val);\r\n\t\treturn r_move(s);\r\n\t}\r\n\r\n\t//设置寄存器相对寻址位\r\n\tstatic void set_addr_bit(int off,uchar* start,int val)\r\n\t{\r\n\t\tif(off==treg::c_esp)\r\n\t\t{\r\n\t\t\t*start|=0x4;\r\n\t\t\t*(start+1)=0x24;\r\n\t\t\t*(int*)(start+2)=val;\r\n\t\t\treturn;\r\n\t\t}\r\n\t\t*(int*)(start+1)=val;\r\n\t\tif(off==treg::c_ebp)\r\n\t\t{\r\n\t\t\t*start|=0x5;\r\n\t\t}\r\n\t\telif(off==treg::c_esi)\r\n\t\t{\r\n\t\t\t*start|=0x6;\r\n\t\t}\r\n\t\telif(off==treg::c_edi)\r\n\t\t{\r\n\t\t\t*start|=0x7;\r\n\t\t}\r\n\t\telif(off==treg::c_eax)\r\n\t\t{\r\n\t\t\t*start|=0x0;\r\n\t\t}\r\n\t\telif(off==treg::c_ebx)\r\n\t\t{\r\n\t\t\t*start|=0x3;\r\n\t\t}\r\n\t\telif(off==treg::c_ecx)\r\n\t\t{\r\n\t\t\t*start|=0x1;\r\n\t\t}\r\n\t\telif(off==treg::c_edx)\r\n\t\t{\r\n\t\t\t*start|=0x2;\r\n\t\t}\r\n\t}\r\n\r\n\tstatic void set_reg_bit(int off,uchar* start)\r\n\t{\r\n\t\tif(off==treg::c_esp)\r\n\t\t{\r\n\t\t\t*start|=0x4;\r\n\t\t}\r\n\t\telif(off==treg::c_ebp)\r\n\t\t{\r\n\t\t\t*start|=0x5;\r\n\t\t}\r\n\t\telif(off==treg::c_esi)\r\n\t\t{\r\n\t\t\t*start|=0x6;\r\n\t\t}\r\n\t\telif(off==treg::c_edi)\r\n\t\t{\r\n\t\t\t*start|=0x7;\r\n\t\t}\r\n\t\telif(off==treg::c_eax)\r\n\t\t{\r\n\t\t\t*start|=0x0;\r\n\t\t}\r\n\t\telif(off==treg::c_ebx)\r\n\t\t{\r\n\t\t\t*start|=0x3;\r\n\t\t}\r\n\t\telif(off==treg::c_ecx)\r\n\t\t{\r\n\t\t\t*start|=0x1;\r\n\t\t}\r\n\t\telif(off==treg::c_edx)\r\n\t\t{\r\n\t\t\t*start|=0x2;\r\n\t\t}\r\n\t}\r\n\r\n\tstatic void set_reg_bit_center(int off,uchar* start)\r\n\t{\r\n\t\tif(off==treg::c_esp)\r\n\t\t{\r\n\t\t\t*start|=0x4<<3;\r\n\t\t}\r\n\t\telif(off==treg::c_ebp)\r\n\t\t{\r\n\t\t\t*start|=0x5<<3;\r\n\t\t}\r\n\t\telif(off==treg::c_esi)\r\n\t\t{\r\n\t\t\t*start|=0x6<<3;\r\n\t\t}\r\n\t\telif(off==treg::c_edi)\r\n\t\t{\r\n\t\t\t*start|=0x7<<3;\r\n\t\t}\r\n\t\telif(off==treg::c_eax)\r\n\t\t{\r\n\t\t\t*start|=0x0<<3;\r\n\t\t}\r\n\t\telif(off==treg::c_ebx)\r\n\t\t{\r\n\t\t\t*start|=0x3<<3;\r\n\t\t}\r\n\t\telif(off==treg::c_ecx)\r\n\t\t{\r\n\t\t\t*start|=0x1<<3;\r\n\t\t}\r\n\t\telif(off==treg::c_edx)\r\n\t\t{\r\n\t\t\t*start|=0x2<<3;\r\n\t\t}\r\n\t}\r\n};\r\n\r\n#endif \r\n"
  },
  {
    "path": "rpp/zjitf.h",
    "content": "﻿#ifndef zjitf_h__\r\n#define zjitf_h__\r\n\r\n#include \"znasm.h\"\r\n\r\n//jit函数\r\nstruct zjitf\r\n{\r\n\tstatic tsh*& get_psh()\r\n\t{\r\n\t\tstatic tsh* g_psh;\r\n\t\treturn g_psh;\r\n\t}\r\n\r\n\tstatic void add8(int8* a,int8* b)\r\n\t{\r\n\t\t*a+=*b;\r\n\t}\r\n\r\n\tstatic void sub8(int8* a,int8* b)\r\n\t{\r\n\t\t*a-=*b;\r\n\t}\r\n\r\n\tstatic void imul8(int8* a,int8* b)\r\n\t{\r\n\t\t*a*=*b;\r\n\t}\r\n\r\n\tstatic void idiv8(int8* a,int8* b)\r\n\t{\r\n\t\t*a/=*b;\r\n\t}\r\n\r\n\tstatic void imod8(int8* a,int8* b)\r\n\t{\r\n\t\t*a%=*b;\r\n\t}\r\n\r\n\tstatic rbool cgsb8(int8* a,int8* b)\r\n\t{\r\n\t\treturn *a>*b;\r\n\t}\r\n\r\n\tstatic rbool clsb8(int8* a,int8* b)\r\n\t{\r\n\t\treturn *a<*b;\r\n\t}\r\n\r\n\tstatic void fadd8(double* a,double* b)\r\n\t{\r\n\t\t*a+=*b;\r\n\t}\r\n\r\n\tstatic void fsub8(double* a,double* b)\r\n\t{\r\n\t\t*a-=*b;\r\n\t}\r\n\r\n\tstatic void fmul8(double* a,double* b)\r\n\t{\r\n\t\t*a*=*b;\r\n\t}\r\n\r\n\tstatic void fdiv8(double* a,double* b)\r\n\t{\r\n\t\t*a/=*b;\r\n\t}\r\n\r\n\tstatic rbool fcgsb8(double* a,double* b)\r\n\t{\r\n\t\treturn *a>*b;\r\n\t}\r\n\r\n\tstatic rbool fclsb8(double* a,double* b)\r\n\t{\r\n\t\treturn *a<*b;\r\n\t}\r\n\r\n\tstatic uint bshl(uint a,uint b)\r\n\t{\r\n\t\treturn a<<b; \r\n\t}\r\n\r\n\tstatic uint bshr(uint a,uint b)\r\n\t{\r\n\t\treturn a>>b; \r\n\t}\r\n\r\n\tstatic int bsar(int a,int b)\r\n\t{\r\n\t\treturn a>>b; \r\n\t}\r\n\r\n\tstatic void _float_to_double(float a,double* b)\r\n\t{\r\n\t\t*b=a;\r\n\t}\r\n\r\n\t//当返回double时X86的ABI是通过xmm返回\r\n\tstatic void sin(double a,double* b)\r\n\t{\r\n\t\t*b=::sin(a);\r\n\t}\r\n\r\n\tstatic void cos(double a,double* b)\r\n\t{\r\n\t\t*b=::cos(a);\r\n\t}\r\n\r\n\tstatic void sqrt(double a,double* b)\r\n\t{\r\n\t\t*b=::sqrt(a);\r\n\t}\r\n\r\n\tstatic int get_argc()\r\n\t{\r\n\t\treturn get_psh()->m_argc;\r\n\t}\r\n\r\n\tstatic char** get_argv()\r\n\t{\r\n\t\treturn get_psh()->m_argv;\r\n\t}\r\n\r\n\tstatic void* get_hins()\r\n\t{\r\n\t\treturn get_psh()->m_hins;\r\n\t}\r\n\r\n\tstatic void set_main_ret(int a)\r\n\t{\r\n\t\tget_psh()->m_ret=a;\r\n\t}\r\n\r\n\tstatic tfunc* get_cur_func(uchar* pasm)\r\n\t{\r\n\t\ttaddr* p=get_psh()->m_addr.find(taddr((uint)pasm,(uint)pasm+1,null));\r\n\t\tif(p==null)\r\n\t\t{\r\n\t\t\treturn null;\r\n\t\t}\r\n\t\treturn p->ptfi;\r\n\t}\r\n\r\n\tstatic rset<tclass>* get_vclass()\r\n\t{\r\n\t\treturn &get_psh()->m_class;\r\n\t}\r\n\r\n\t//fixme _ftelli64必须要加载msvcr110.dll才能使用\r\n\tstatic void ftell8(int8* ret,FILE* fp)\r\n\t{\r\n\t\t*ret=rfile::ftell8(fp);\r\n\t}\r\n\r\n\tstatic void* find_dll_q(const char* name)\r\n\t{\r\n\t\ttsh& sh=*get_psh();\r\n\t\tif(sh.m_dll_func.exist(name))\r\n\t\t{\r\n\t\t\treturn sh.m_dll_func[name];\r\n\t\t}\r\n\t\tif(sh.m_jit_f.exist(name))\r\n\t\t{\r\n\t\t\treturn sh.m_jit_f[name];\r\n\t\t}\r\n\t\treturn find_dll_full(name);\r\n\t}\r\n\r\n\tstatic void* find_dll_full(const char* name)\r\n\t{\r\n\t\tPBYTE pb=null;\r\n\t\tMEMORY_BASIC_INFORMATION mbi;\r\n\t\twhile(VirtualQuery(pb,&mbi,r_size(mbi))==r_size(mbi))\r\n\t\t{\r\n\t\t\tif(mbi.State==MEM_FREE)\r\n\t\t\t\tmbi.AllocationBase=mbi.BaseAddress;\r\n\t\t\tif(mbi.AllocationBase==mbi.BaseAddress&&\r\n\t\t\t\tmbi.AllocationBase!=null) \r\n\t\t\t{\r\n\t\t\t\tvoid* ret=GetProcAddress(\r\n\t\t\t\t\t(HINSTANCE)mbi.AllocationBase,name);\r\n\t\t\t\tif(ret!=null)\r\n\t\t\t\t{\r\n\t\t\t\t\treturn ret;\r\n\t\t\t\t}\r\n\t\t\t} \r\n\t\t\tpb+=mbi.RegionSize;\r\n\t\t}\r\n\t\treturn null;\r\n\t}\r\n\r\n\t//非多线程安全\r\n\tstatic void set_dll_list()\r\n\t{\r\n\t\ttsh& sh=*get_psh();\r\n\t\tPBYTE pb=null;\r\n\t\tMEMORY_BASIC_INFORMATION mbi;\r\n\t\twhile(VirtualQuery(pb,&mbi,r_size(mbi))==r_size(mbi))\r\n\t\t{\r\n\t\t\tif(mbi.State==MEM_FREE)\r\n\t\t\t\tmbi.AllocationBase=mbi.BaseAddress;\r\n\t\t\tif(mbi.AllocationBase==mbi.BaseAddress&&\r\n\t\t\t\tmbi.AllocationBase!=null)\r\n\t\t\t{\r\n\t\t\t\t//todo 去掉GetProcAddress\r\n\t\t\t\tvoid* ret=GetProcAddress(\r\n\t\t\t\t\t(HINSTANCE)mbi.AllocationBase,\"glutSpecialFunc\");\r\n\t\t\t\tif(ret!=null)\r\n\t\t\t\t{\r\n\t\t\t\t\tset_dll_list_one(\r\n\t\t\t\t\t\tsh,(HINSTANCE)mbi.AllocationBase);\r\n\t\t\t\t}\r\n\t\t\t\tret=GetProcAddress(\r\n\t\t\t\t\t(HINSTANCE)mbi.AllocationBase,\"glBegin\");\r\n\t\t\t\tif(ret!=null)\r\n\t\t\t\t{\r\n\t\t\t\t\tset_dll_list_one(\r\n\t\t\t\t\t\tsh,(HINSTANCE)mbi.AllocationBase);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tpb+=mbi.RegionSize;\r\n\t\t}\r\n\t}\r\n\r\n\tstatic void set_dll_list_one(tsh& sh,HINSTANCE hModule)\r\n\t{\r\n\t\tchar *pRet=null;\r\n\t\tPIMAGE_DOS_HEADER pImageDosHeader=NULL;\r\n\t\tPIMAGE_NT_HEADERS pImageNtHeader=NULL;\r\n\t\tPIMAGE_EXPORT_DIRECTORY pImageExportDirectory=null;\r\n\r\n\t\tpImageDosHeader=(PIMAGE_DOS_HEADER)hModule;\r\n\t\tpImageNtHeader=(PIMAGE_NT_HEADERS)((\r\n\t\t\tDWORD)hModule+pImageDosHeader->e_lfanew);\r\n\t\tpImageExportDirectory=(PIMAGE_EXPORT_DIRECTORY)(\r\n\t\t\t(DWORD)hModule+pImageNtHeader->OptionalHeader.DataDirectory[\r\n\t\t\t\tIMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress);\r\n\r\n\t\tDWORD dwExportRVA=pImageNtHeader->OptionalHeader.DataDirectory[\r\n\t\t\tIMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress;\r\n\t\tDWORD dwExportSize=pImageNtHeader->OptionalHeader.DataDirectory[\r\n\t\t\tIMAGE_DIRECTORY_ENTRY_EXPORT].Size;\r\n\r\n\t\tDWORD* pAddressOfFunction=(DWORD*)(\r\n\t\t\tpImageExportDirectory->AddressOfFunctions+(DWORD)hModule);\r\n\t\tDWORD* pAddressOfNames=(DWORD*)(\r\n\t\t\tpImageExportDirectory->AddressOfNames+(DWORD)hModule);\r\n\t\tDWORD dwNumberOfNames=(DWORD)(\r\n\t\t\tpImageExportDirectory->NumberOfNames);\r\n\t\tDWORD dwBase=(DWORD)(pImageExportDirectory->Base);\r\n\r\n\t\tWORD* pAddressOfNameOrdinals=(WORD*)(\r\n\t\t\tpImageExportDirectory->AddressOfNameOrdinals+(DWORD)hModule);\r\n\r\n\t\tfor(int i=0;i<(int)dwNumberOfNames;i++)\r\n\t\t{\r\n\t\t\tchar *strFunction=(char*)(pAddressOfNames[i]+(DWORD)hModule);\r\n\t\t\tif(*strFunction==0)\r\n\t\t\t{\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\t\t\tpRet=(char*)(pAddressOfFunction[\r\n\t\t\t\tpAddressOfNameOrdinals[i]]+(DWORD)hModule);\r\n\t\t\tif((DWORD)pRet<dwExportRVA+(DWORD)hModule||\r\n\t\t\t\t(DWORD)pRet>dwExportRVA+(DWORD)hModule+dwExportSize)\r\n\t\t\t{\r\n\t\t\t\tsh.m_dll_func[strFunction]=(void*)pRet;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n};\r\n\r\n#endif\r\n"
  },
  {
    "path": "rpp/zjiti.h",
    "content": "﻿#ifndef zjiti_h__\r\n#define zjiti_h__\r\n\r\n#include \"zjitb.h\"\r\n\r\n//jit指令类\r\nstruct zjiti\r\n{\r\n\tstatic rstr b_call(const tins& ins,uchar* start)\r\n\t{\r\n\t\tif(ins.first.type==topnd::c_imme)\r\n\t\t{\r\n\t\t\treturn zjitb::build_relative(ins,start,0xe8);\r\n\t\t}\r\n\t\telif(ins.first.type==topnd::c_reg)\r\n\t\t{\r\n\t\t\treturn zjitb::build_r(ins,0xff,0xd0);\r\n\t\t}\r\n\t\telif(ins.first.type==topnd::c_addr)\r\n\t\t{\r\n\t\t\treturn zjitb::build_a(ins,0xff,0x90);\r\n\t\t}\r\n\t\treturn rstr();\r\n\t}\r\n\r\n\tstatic rstr b_retn()\r\n\t{\r\n\t\treturn zjitb::build_one(0xc3);\r\n\t}\r\n\r\n\tstatic rstr b_reti(const tins& ins)\r\n\t{\r\n\t\trstr s;\r\n\t\ts.set_size(3);\r\n\t\ts[0]=0xc2;\r\n\t\tif(ins.first.val>65535)\r\n\t\t{\r\n\t\t\treturn rstr();\r\n\t\t}\r\n\t\t*(ushort*)&s[1]=(ushort)ins.first.val;//只有16位的reti，截断\r\n\t\treturn r_move(s);\r\n\t}\r\n\r\n\tstatic rstr b_push(const tins& ins)\r\n\t{\r\n\t\tif(ins.first.type==topnd::c_imme)\r\n\t\t{\r\n\t\t\treturn zjitb::build_i(ins,0x68);\r\n\t\t}\r\n\t\telif(ins.first.type==topnd::c_reg)\r\n\t\t{\r\n\t\t\treturn zjitb::build_r(ins,0x50);\r\n\t\t}\r\n\t\telif(ins.first.type==topnd::c_addr)\r\n\t\t{\r\n\t\t\treturn zjitb::build_a(ins,0xff,0xb0);\r\n\t\t}\r\n\t\treturn rstr();\r\n\t}\r\n\r\n\tstatic rstr b_pop(const tins& ins)\r\n\t{\r\n\t\tif(ins.first.type==topnd::c_reg)\r\n\t\t{\r\n\t\t\treturn zjitb::build_r(ins,0x58);\r\n\t\t}\r\n\t\treturn rstr();\r\n\t}\r\n\r\n\tstatic rstr b_jmp(const tins& ins,uchar* start)\r\n\t{\r\n\t\tif(ins.first.type==topnd::c_imme)\r\n\t\t{\r\n\t\t\treturn zjitb::build_relative(ins,start,0xe9);\r\n\t\t}\r\n\t\telif(ins.first.type==topnd::c_reg)\r\n\t\t{\r\n\t\t\treturn zjitb::build_r(ins,0xff,0xe0);\r\n\t\t}\r\n\t\telif(ins.first.type==topnd::c_addr)\r\n\t\t{\r\n\t\t\treturn zjitb::build_a(ins,0xff,0xa0);\r\n\t\t}\r\n\t\treturn rstr();\r\n\t}\r\n\r\n\tstatic rstr b_jz(const tins& ins,uchar* start)\r\n\t{\r\n\t\tif(ins.first.type==topnd::c_imme)\r\n\t\t{\r\n\t\t\treturn zjitb::build_relative(ins,start,0x0f,0x84);\r\n\t\t}\r\n\t\treturn rstr();\r\n\t}\r\n\r\n\tstatic rstr b_jnz(const tins& ins,uchar* start)\r\n\t{\r\n\t\tif(ins.first.type==topnd::c_imme)\r\n\t\t{\r\n\t\t\treturn zjitb::build_relative(ins,start,0x0f,0x85);\r\n\t\t}\r\n\t\treturn rstr();\r\n\t}\r\n\r\n\tstatic rstr b_nop()\r\n\t{\r\n\t\treturn zjitb::build_one(0x90);\r\n\t}\r\n\r\n\tstatic rstr b_lea(const tins& ins)\r\n\t{\r\n\t\tif(ins.first.type==topnd::c_reg&&ins.second.type==topnd::c_addr)\r\n\t\t{\r\n\t\t\treturn zjitb::build_ra(ins,0x8d,0x80);\r\n\t\t}\r\n\t\treturn rstr();\r\n\t}\r\n\r\n\tstatic rstr b_mov(const tins& ins)\r\n\t{\r\n\t\tif(ins.first.type==topnd::c_reg)\r\n\t\t{\r\n\t\t\tif(ins.second.type==topnd::c_imme)\r\n\t\t\t{\r\n\t\t\t\treturn zjitb::build_ri(ins,0xb8);\r\n\t\t\t}\r\n\t\t\telif(ins.second.type==topnd::c_reg)\r\n\t\t\t{\r\n\t\t\t\treturn zjitb::build_rr(ins,0x8b,0xc0);\r\n\t\t\t}\r\n\t\t\telif(ins.second.type==topnd::c_addr)\r\n\t\t\t{\r\n\t\t\t\treturn zjitb::build_ra(ins,0x8b,0x80);\r\n\t\t\t}\r\n\t\t}\r\n\t\telif(ins.first.type==topnd::c_addr)\r\n\t\t{\r\n\t\t\tif(ins.second.type==topnd::c_imme)\r\n\t\t\t{\r\n\t\t\t\treturn zjitb::build_ai(ins,0xc7,0x80);\r\n\t\t\t}\r\n\t\t\telif(ins.second.type==topnd::c_reg)\r\n\t\t\t{\r\n\t\t\t\treturn zjitb::build_ar(ins,0x89,0x80);\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn rstr();\r\n\t}\r\n\r\n\tstatic rstr b_mov1_cl_addr(const tins& ins)\r\n\t{\r\n\t\trstr s;\r\n\t\tif(ins.second.off==treg::c_esp)\r\n\t\t{\r\n\t\t\ts.set_size(7);\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\ts.set_size(6);\r\n\t\t}\r\n\t\ts[0]=0x8a;\r\n\t\ts[1]=0x88;\r\n\t\tzjitb::set_addr_bit(ins.second.off,&s[1],ins.second.val);\r\n\t\treturn r_move(s);\r\n\t}\r\n\r\n\tstatic rstr b_mov1_addr_cl(const tins& ins)\r\n\t{\r\n\t\trstr s;\r\n\t\tif(ins.first.off==treg::c_esp)\r\n\t\t{\r\n\t\t\ts.set_size(7);\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\ts.set_size(6);\r\n\t\t}\r\n\t\ts[0]=0x88;\r\n\t\ts[1]=0x88;\r\n\t\tzjitb::set_addr_bit(ins.first.off,&s[1],ins.first.val);\r\n\t\treturn r_move(s);\r\n\t}\r\n\r\n\tstatic rstr b_add(const tins& ins)\r\n\t{\r\n\t\tif(ins.first.type==topnd::c_reg)\r\n\t\t{\r\n\t\t\tif(ins.second.type==topnd::c_imme)\r\n\t\t\t{\r\n\t\t\t\treturn zjitb::build_ri(ins,0x81,0xc0);\r\n\t\t\t}\r\n\t\t\tif(ins.second.type==topnd::c_reg)\r\n\t\t\t{\r\n\t\t\t\treturn zjitb::build_rr(ins,0x03,0xc0);\r\n\t\t\t}\r\n\t\t\tif(ins.second.type==topnd::c_addr)\r\n\t\t\t{\r\n\t\t\t\treturn zjitb::build_ra(ins,0x03,0x80);\r\n\t\t\t}\r\n\t\t}\r\n\t\tif(ins.first.type==topnd::c_addr)\r\n\t\t{\r\n\t\t\tif(ins.second.type==topnd::c_imme)\r\n\t\t\t{\r\n\t\t\t\treturn zjitb::build_ai(ins,0x81,0x80);\r\n\t\t\t}\r\n\t\t\tif(ins.second.type==topnd::c_reg)\r\n\t\t\t{\r\n\t\t\t\treturn zjitb::build_ar(ins,0x01,0x80);\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn rstr();\r\n\t}\r\n\r\n\tstatic rstr b_sub(const tins& ins)\r\n\t{\r\n\t\tif(ins.first.type==topnd::c_reg)\r\n\t\t{\r\n\t\t\tif(ins.second.type==topnd::c_imme)\r\n\t\t\t{\r\n\t\t\t\treturn zjitb::build_ri(ins,0x81,0xe8);\r\n\t\t\t}\r\n\t\t\tif(ins.second.type==topnd::c_reg)\r\n\t\t\t{\r\n\t\t\t\treturn zjitb::build_rr(ins,0x2b,0xc0);\r\n\t\t\t}\r\n\t\t\tif(ins.second.type==topnd::c_addr)\r\n\t\t\t{\r\n\t\t\t\treturn zjitb::build_ra(ins,0x2b,0x80);\r\n\t\t\t}\r\n\t\t}\r\n\t\tif(ins.first.type==topnd::c_addr)\r\n\t\t{\r\n\t\t\tif(ins.second.type==topnd::c_imme)\r\n\t\t\t{\r\n\t\t\t\treturn zjitb::build_ai(ins,0x81,0xa8);\r\n\t\t\t}\r\n\t\t\tif(ins.second.type==topnd::c_reg)\r\n\t\t\t{\r\n\t\t\t\treturn zjitb::build_ar(ins,0x29,0x80);\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn rstr();\r\n\t}\r\n\r\n\tstatic rstr b_imul(const tins& ins)\r\n\t{\r\n\t\tif(ins.first.type==topnd::c_reg&&ins.second.type==topnd::c_addr)\r\n\t\t{\r\n\t\t\treturn zjitb::build_ra(ins,0x0f,0xaf,0x80);\r\n\t\t}\r\n\t\treturn rstr();\r\n\t}\r\n\r\n\tstatic rstr b_idiv(const tins& ins)\r\n\t{\r\n\t\tif(ins.first.type==topnd::c_reg)\r\n\t\t{\r\n\t\t\treturn zjitb::build_r(ins,0xf7,0xf8);\r\n\t\t}\r\n\t\treturn rstr();\r\n\t}\r\n\r\n\tstatic rstr b_udiv(const tins& ins)\r\n\t{\r\n\t\tif(ins.first.type==topnd::c_reg)\r\n\t\t{\r\n\t\t\treturn zjitb::build_r(ins,0xf7,0xf0);\r\n\t\t}\r\n\t\treturn rstr();\r\n\t}\r\n\r\n\tstatic rstr b_cdq()\r\n\t{\r\n\t\treturn zjitb::build_one(0x99);\r\n\t}\r\n\r\n\tstatic rstr b_sete_bl()\r\n\t{\r\n\t\treturn zjitb::build_three(0x0f,0x94,0xc3);\r\n\t}\r\n\r\n\tstatic rstr b_setne_bl()\r\n\t{\r\n\t\treturn zjitb::build_three(0x0f,0x95,0xc3);\r\n\t}\r\n\r\n\tstatic rstr b_setg_bl()\r\n\t{\r\n\t\treturn zjitb::build_three(0x0f,0x9f,0xc3);\r\n\t}\r\n\r\n\tstatic rstr b_setge_bl()\r\n\t{\r\n\t\treturn zjitb::build_three(0x0f,0x9d,0xc3);\r\n\t}\r\n\r\n\tstatic rstr b_setl_bl()\r\n\t{\r\n\t\treturn zjitb::build_three(0x0f,0x9c,0xc3);\r\n\t}\r\n\r\n\tstatic rstr b_setle_bl()\r\n\t{\r\n\t\treturn zjitb::build_three(0x0f,0x9e,0xc3);\r\n\t}\r\n\r\n\tstatic rstr b_seta_bl()\r\n\t{\r\n\t\treturn zjitb::build_three(0x0f,0x97,0xc3);\r\n\t}\r\n\r\n\tstatic rstr b_setae_bl()\r\n\t{\r\n\t\treturn zjitb::build_three(0x0f,0x93,0xc3);\r\n\t}\r\n\r\n\tstatic rstr b_setb_bl()\r\n\t{\r\n\t\treturn zjitb::build_three(0x0f,0x92,0xc3);\r\n\t}\r\n\r\n\tstatic rstr b_setbe_bl()\r\n\t{\r\n\t\treturn zjitb::build_three(0x0f,0x96,0xc3);\r\n\t}\r\n\r\n\tstatic rstr b_cmp(const tins& ins)\r\n\t{\r\n\t\tif(ins.first.type==topnd::c_reg)\r\n\t\t{\r\n\t\t\tif(ins.second.type==topnd::c_imme)\r\n\t\t\t{\r\n\t\t\t\treturn zjitb::build_ri(ins,0x81,0xf8);\r\n\t\t\t}\r\n\t\t\tif(ins.second.type==topnd::c_reg)\r\n\t\t\t{\r\n\t\t\t\treturn zjitb::build_rr(ins,0x3b,0xc0);\r\n\t\t\t}\r\n\t\t\tif(ins.second.type==topnd::c_addr)\r\n\t\t\t{\r\n\t\t\t\treturn zjitb::build_ra(ins,0x3b,0x80);\r\n\t\t\t}\r\n\t\t}\r\n\t\tif(ins.first.type==topnd::c_addr)\r\n\t\t{\r\n\t\t\tif(ins.second.type==topnd::c_imme)\r\n\t\t\t{\r\n\t\t\t\treturn zjitb::build_ai(ins,0x81,0xb8);\r\n\t\t\t}\r\n\t\t\tif(ins.second.type==topnd::c_reg)\r\n\t\t\t{\r\n\t\t\t\treturn zjitb::build_ar(ins,0x39,0x80);\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn rstr();\r\n\t}\r\n\r\n\tstatic rstr b_and(const tins& ins)\r\n\t{\r\n\t\tif(ins.first.type==topnd::c_reg)\r\n\t\t{\r\n\t\t\tif(ins.second.type==topnd::c_imme)\r\n\t\t\t{\r\n\t\t\t\treturn zjitb::build_ri(ins,0x81,0xe0);\r\n\t\t\t}\r\n\t\t\tif(ins.second.type==topnd::c_reg)\r\n\t\t\t{\r\n\t\t\t\treturn zjitb::build_rr(ins,0x23,0xc0);\r\n\t\t\t}\r\n\t\t\tif(ins.second.type==topnd::c_addr)\r\n\t\t\t{\r\n\t\t\t\treturn zjitb::build_ra(ins,0x23,0x80);\r\n\t\t\t}\r\n\t\t}\r\n\t\tif(ins.first.type==topnd::c_addr)\r\n\t\t{\r\n\t\t\tif(ins.second.type==topnd::c_imme)\r\n\t\t\t{\r\n\t\t\t\treturn zjitb::build_ai(ins,0x81,0xa0);\r\n\t\t\t}\r\n\t\t\tif(ins.second.type==topnd::c_reg)\r\n\t\t\t{\r\n\t\t\t\treturn zjitb::build_ar(ins,0x21,0x80);\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn rstr();\r\n\t}\r\n\r\n\tstatic rstr b_or(const tins& ins)\r\n\t{\r\n\t\tif(ins.first.type==topnd::c_reg)\r\n\t\t{\r\n\t\t\tif(ins.second.type==topnd::c_imme)\r\n\t\t\t{\r\n\t\t\t\treturn zjitb::build_ri(ins,0x81,0xc8);\r\n\t\t\t}\r\n\t\t\tif(ins.second.type==topnd::c_reg)\r\n\t\t\t{\r\n\t\t\t\treturn zjitb::build_rr(ins,0x0b,0xc0);\r\n\t\t\t}\r\n\t\t\tif(ins.second.type==topnd::c_addr)\r\n\t\t\t{\r\n\t\t\t\treturn zjitb::build_ra(ins,0x0b,0x80);\r\n\t\t\t}\r\n\t\t}\r\n\t\tif(ins.first.type==topnd::c_addr)\r\n\t\t{\r\n\t\t\tif(ins.second.type==topnd::c_imme)\r\n\t\t\t{\r\n\t\t\t\treturn zjitb::build_ai(ins,0x81,0x88);\r\n\t\t\t}\r\n\t\t\tif(ins.second.type==topnd::c_reg)\r\n\t\t\t{\r\n\t\t\t\treturn zjitb::build_ar(ins,0x09,0x80);\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn rstr();\r\n\t}\r\n\r\n\tstatic rstr b_xor(const tins& ins)\r\n\t{\r\n\t\tif(ins.first.type==topnd::c_reg)\r\n\t\t{\r\n\t\t\tif(ins.second.type==topnd::c_imme)\r\n\t\t\t{\r\n\t\t\t\treturn zjitb::build_ri(ins,0x81,0xf0);\r\n\t\t\t}\r\n\t\t\tif(ins.second.type==topnd::c_reg)\r\n\t\t\t{\r\n\t\t\t\treturn zjitb::build_rr(ins,0x33,0xc0);\r\n\t\t\t}\r\n\t\t\tif(ins.second.type==topnd::c_addr)\r\n\t\t\t{\r\n\t\t\t\treturn zjitb::build_ra(ins,0x33,0x80);\r\n\t\t\t}\r\n\t\t}\r\n\t\tif(ins.first.type==topnd::c_addr)\r\n\t\t{\r\n\t\t\tif(ins.second.type==topnd::c_imme)\r\n\t\t\t{\r\n\t\t\t\treturn zjitb::build_ai(ins,0x81,0xb0);\r\n\t\t\t}\r\n\t\t\tif(ins.second.type==topnd::c_reg)\r\n\t\t\t{\r\n\t\t\t\treturn zjitb::build_ar(ins,0x31,0x80);\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn rstr();\r\n\t}\r\n\r\n\tstatic rstr b_not(const tins& ins)\r\n\t{\r\n\t\tif(ins.first.type==topnd::c_reg)\r\n\t\t{\r\n\t\t\treturn zjitb::build_r(ins,0xf7,0xd0);\r\n\t\t}\r\n\t\telif(ins.first.type==topnd::c_addr)\r\n\t\t{\r\n\t\t\treturn zjitb::build_a(ins,0xf7,0x90);\r\n\t\t}\r\n\t\treturn rstr();\r\n\t}\r\n\r\n\tstatic rstr b_shl_eax_cl()\r\n\t{\r\n\t\treturn zjitb::build_two(0xd3,0xe0);\r\n\t}\r\n\r\n\tstatic rstr b_shr_eax_cl()\r\n\t{\r\n\t\treturn zjitb::build_two(0xd3,0xe8);\r\n\t}\r\n\r\n\tstatic rstr b_sar_eax_cl()\r\n\t{\r\n\t\treturn zjitb::build_two(0xd3,0xf8);\r\n\t}\r\n};\r\n\r\n#endif\r\n"
  },
  {
    "path": "rpp/zlambda.h",
    "content": "﻿#ifndef zlambda_h__\r\n#define zlambda_h__\r\n\r\n#include \"zexp.h\"\r\n#include \"zsrep.h\"\r\n#include \"zftl.h\"\r\n\r\nstruct zlambda\r\n{\r\n\t//闭包处理，todo:闭包暂时不能使用类型推断,不是线程安全\r\n\tstatic void lambda_pack(tsh& sh,const rbuf<tword>& vhead,\r\n\t\tconst rbuf<tword>& vbody,tfunc& tfi,tfunc& lambda)\r\n\t{\r\n\t\ttclass item;\r\n\t\tfor(int i=0;i<vbody.count();i++)\r\n\t\t{\r\n\t\t\tifn(vbody[i].is_name())\r\n\t\t\t{\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\t\t\tif(zfind::is_class_t(sh,vbody[i].val))\r\n\t\t\t{\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\t\t\t//todo 未判断重复\r\n\t\t\ttdata* ptdi=zfind::local_search(tfi,vbody[i].val);\r\n\t\t\ttdata tdi;\r\n\t\t\tif(null==ptdi)\r\n\t\t\t{\r\n\t\t\t\tint pos=vhead.find(vbody[i]);\r\n\t\t\t\tif(pos>=vhead.count()||pos==0)\r\n\t\t\t\t{\r\n\t\t\t\t\tcontinue;\r\n\t\t\t\t}\r\n\t\t\t\tifn(zfind::is_class_t(sh,vhead[pos-1].val))\r\n\t\t\t\t{\r\n\t\t\t\t\tcontinue;\r\n\t\t\t\t}\r\n\t\t\t\tptdi=&tdi;\r\n\t\t\t\tptdi->type=vhead[pos-1].val;\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\ttdi.type=ptdi->type;\r\n\t\t\t\tptdi=&tdi;\r\n\t\t\t}\r\n\t\t\tptdi->name=vbody[i].val;\r\n\t\t\tptdi->count=1;\r\n\t\t\tptdi->size=zfind::get_type_size(sh,ptdi->type);\r\n\t\t\tif(ptdi->size==0)\r\n\t\t\t{\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\t\t\titem.vdata.push(*ptdi);\r\n\t\t}\r\n\t\tif(item.vdata.empty())\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\t\titem.is_friend=true;\r\n\t\titem.name=lambda.name+\"_C\";\r\n\t\tfor(int i=0;i<item.vdata.count();i++)\r\n\t\t{\r\n\t\t\titem.vdata[i].off=item.size;\r\n\t\t\titem.size+=item.vdata[i].size;\r\n\t\t}\r\n\t\tlambda.lambda_data.set_size(item.size);\r\n\t\tsh.m_class.insert_c(item);\r\n\t}\r\n\r\n\tstatic rbool lambda_replace(tsh& sh,tfunc& tfi)\r\n\t{\r\n\t\ttclass& tci=*tfi.ptci;\r\n\t\trbuf<tword>& v=tfi.vword;\r\n\t\tfor(int i=0;i<v.count();i++)\r\n\t\t{\r\n\t\t\tif(v[i]!=rppkey(c_lambda))\r\n\t\t\t{\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\t\t\tif(v.get(i+1)!=rppoptr(c_sbk_l))\r\n\t\t\t{\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\t\t\tint right=sh.find_symm_sbk(v,i+1);\r\n\t\t\tif(right>=v.count())\r\n\t\t\t{\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\t\t\tint left=right+1;\r\n\t\t\tif(v.get(left)!=rppoptr(c_bbk_l))\r\n\t\t\t{\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\t\t\tright=sh.find_symm_bbk(v,left);\r\n\t\t\tif(right>=v.count())\r\n\t\t\t{\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\t\t\tv[i].val=rstr(\"_LAMBDA\")+tci.vfunc.count();\r\n\t\t\tifn(zmemb::func_add(sh,tci,v.sub(i,right+1),false))\r\n\t\t\t{\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\ttfunc* ptfi=zfind::func_search(tci,v[i].val);\r\n\t\t\tif(ptfi!=null)\r\n\t\t\t{\r\n\t\t\t\tlambda_pack(sh,v.sub(0,i),\r\n\t\t\t\t\tv.sub(left+1,right),tfi,*ptfi);\r\n\t\t\t}\r\n\t\t\tv[i].multi.push(\"(\");\r\n\t\t\tv[i].multi.push(\"&\");\r\n\t\t\tv[i].multi.push(tci.name);\r\n\t\t\tv[i].multi.push(\".\");\r\n\t\t\tv[i].multi.push(v[i].val);\r\n\t\t\tv[i].multi.push(\")\");\r\n\t\t\tsh.clear_word_val(v,i,right+1);\r\n\t\t\ti=right;\r\n\t\t}\r\n\t\tzpre::arrange(v);\r\n\t\treturn true;\r\n\t}\r\n\r\n\tstatic rstr lambda_get(rbuf<tword>& v)\r\n\t{\r\n\t\tfor(int i=0;i<v.count();i++)\r\n\t\t{\r\n\t\t\tif(v[i].val.sub(0,7)==\"_LAMBDA\")\r\n\t\t\t{\r\n\t\t\t\treturn v[i].val;\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn rstr();\r\n\t}\r\n\r\n\tstatic void lambda_push_type(const rstr& name,tfunc& tfi)\r\n\t{\r\n\t\ttdata item;\r\n\t\titem.name=name+\"_C_P\";\r\n\t\titem.type=name+\"_C&\";\r\n\t\titem.size=4;\r\n\t\ttfi.local.push(item);\r\n\t}\r\n\r\n\tstatic void lambda_proc(tsh& sh,tfunc& tfi)\r\n\t{\r\n\t\ttclass& tci=*tfi.ptci;\r\n\t\trbuf<tsent>& v=tfi.vsent;\r\n\t\tfor(int i=0;i<v.count();i++)\r\n\t\t{\r\n\t\t\trstr name=lambda_get(v[i].vword);\r\n\t\t\tif(name.empty())\r\n\t\t\t{\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\t\t\ttfunc* ptfi=zfind::func_search(tci,name);\r\n\t\t\tif(ptfi==null||ptfi->lambda_data.empty())\r\n\t\t\t{\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\t\t\ttclass* ptci=zfind::class_search(sh,name+\"_C\");\r\n\t\t\tif(ptci==null||ptci->vdata.empty())\r\n\t\t\t{\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\t\t\trstr data_name=name+\"_C_P\";\r\n\t\t\tlambda_push_type(name,tfi);\r\n\t\t\ttword word;\r\n\t\t\tword.pos_src=v[i].vword.get_bottom().pos_src;\r\n\t\t\tword.pos=v[i].vword.get_bottom().pos;\r\n\t\t\trbuf<tword> vtemp;\r\n\t\t\tsh.push_twi(vtemp,word,\"mov\");\r\n\t\t\tsh.push_twi(vtemp,word,data_name);\r\n\t\t\tsh.push_twi(vtemp,word,\",\");\r\n\t\t\tif(sh.m_mode==tsh::c_rvm||sh.m_mode==tsh::c_jit)\r\n\t\t\t{\r\n\t\t\t\tsh.push_twi(vtemp,word,\r\n\t\t\t\t\trstr((uint)ptfi->lambda_data.begin()));\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\tsh.push_twi(vtemp,word,ptfi->name+\"_C_P_A\");\r\n\t\t\t}\r\n\t\t\tsh.push_twi(vtemp,word,\";\");\r\n\t\t\tfor(int j=0;j<ptci->vdata.count();j++)\r\n\t\t\t{\r\n\t\t\t\tsh.push_twi(vtemp,word,data_name);\r\n\t\t\t\tsh.push_twi(vtemp,word,\".\");\r\n\t\t\t\tsh.push_twi(vtemp,word,ptci->vdata[j].name);\r\n\t\t\t\tsh.push_twi(vtemp,word,\"=\");\r\n\t\t\t\tsh.push_twi(vtemp,word,ptci->vdata[j].name);\r\n\t\t\t\tsh.push_twi(vtemp,word,\";\");\r\n\t\t\t}\r\n\t\t\tvtemp+=v[i].vword;\r\n\t\t\tv[i].vword=r_move(vtemp);\r\n\t\t}\r\n\t\tzcontrol::part_vsent(v);\r\n\t}\r\n\r\n\tstatic void lambda_add_init_asm(tsh& sh,tfunc& tfi)\r\n\t{\r\n\t\tif(tfi.lambda_data.empty())\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\t\ttsent sent;\r\n\t\tsent.pos=tfi.first_pos;\r\n\t\tsent.vword.push(tword(\"mov\"));//tword没有设置pos\r\n\t\tsent.vword.push(tword(tfi.name+\"_C_P\"));\r\n\t\tsent.vword.push(tword(\",\"));\r\n\t\tif(sh.m_mode==tsh::c_rvm||sh.m_mode==tsh::c_jit)\r\n\t\t{\r\n\t\t\tsent.vword.push(tword(rstr((uint)tfi.lambda_data.begin())));\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tsent.vword.push(tword(tfi.name+\"_C_P_A\"));\r\n\t\t}\r\n\t\ttfi.vsent.push_front(r_move(sent));\r\n\t}\r\n\r\n\tstatic void lambda_var_replace(tsh& sh,tfunc& tfi)\r\n\t{\r\n\t\tif(tfi.lambda_data.empty())\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\t\ttclass* ptci=zfind::class_search(sh,tfi.name+\"_C\");\r\n\t\tif(ptci==null)\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tlambda_push_type(tfi.name,tfi);\r\n\t\trstr data_name=tfi.name+\"_C_P\";\r\n\t\trbuf<tword>& v=tfi.vword;\r\n\t\tfor(int i=0;i<v.count();i++)\r\n\t\t{\r\n\t\t\tif(zfind::data_member_search(*ptci,v[i].val)!=null)\r\n\t\t\t{\r\n\t\t\t\tv[i].multi.push(data_name);\r\n\t\t\t\tv[i].multi.push(\".\");\r\n\t\t\t\tv[i].multi.push(v[i].val);\r\n\t\t\t\tv[i].val.clear();\r\n\t\t\t}\r\n\t\t}\r\n\t\tzpre::arrange(v);\r\n\t}\r\n\r\n\tstatic rbool function_replace(tsh& sh,rbuf<tword>& v)\r\n\t{\r\n\t\tfor(int i=0;i<v.count();i++)\r\n\t\t{\r\n\t\t\tif(v[i].val!=rppkey(c_js_func))\r\n\t\t\t{\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\t\t\tif(v.get(i+1).val!=rppoptr(c_sbk_l))\r\n\t\t\t{\r\n\t\t\t\tsh.error(v[i],\"miss (\");\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\tv[i].multi+=rppkey(c_lambda);\r\n\t\t\tv[i].multi+=rppoptr(c_sbk_l);\r\n\t\t\tv[i].multi+=\"var\";\r\n\t\t\tv[i].multi+=\",\";\r\n\t\t\tv[i].multi+=\"var&\";\r\n\t\t\tv[i].multi+=\"this\";\r\n\t\t\tif(v.get(i+2).val!=rppoptr(c_sbk_r))\r\n\t\t\t{\r\n\t\t\t\tv[i].multi+=\",\";\r\n\t\t\t}\r\n\t\t\tv[i].val.clear();\r\n\t\t\tv[i+1].val.clear();\r\n\t\t}\r\n\t\tzpre::arrange(v);\r\n\t\treturn true;\r\n\t}\r\n};\r\n\r\n#endif"
  },
  {
    "path": "rpp/zmac.h",
    "content": "﻿#ifndef zmac_h__\r\n#define zmac_h__\r\n\r\n#include \"zcontrol.h\"\r\n\r\n//宏替换类\r\nstruct zmac\r\n{\r\n\tstatic rbool func_mac_replace(tsh& sh,rbuf<tsent>& vsent)\r\n\t{\r\n\t\tfor(int i=0;i<vsent.count();++i)\r\n\t\t{\r\n\t\t\tifn(func_mac_replace(sh,vsent[i].vword))\r\n\t\t\t{\r\n\t\t\t\tsh.error(vsent[i],\"func mac error\");\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t}\r\n\t\tzcontrol::part_vsent(vsent);\r\n\t\treturn true;\r\n\t}\r\n\r\n\tstatic rbool func_mac_replace(tsh& sh,rbuf<tword>& v)\r\n\t{\r\n\t\tif(v.get(0)!=rppoptr(c_pre))\r\n\t\t{\r\n\t\t\treturn true;\r\n\t\t}\r\n\t\tint right=v.find_last(tword(rppoptr(c_sbk_r)));\r\n\t\tif(right>=v.count())\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\tint left=sh.find_symm_word_rev(v,rppoptr(c_sbk_l),rppoptr(c_sbk_r),\r\n\t\t\t0,right+1);\r\n\t\tif(left>=v.count())\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\trbuf<rbuf<tword> > temp;\r\n\t\ttemp=sh.comma_split_e(v.sub(left+1,right));\r\n\t\trbuf<tword> head=v.sub(1,left+1);\r\n\t\trbuf<tword> result;\r\n\t\tif(temp.count()==1&&zfind::is_class(sh,temp[0].get_top().val))\r\n\t\t{\r\n\t\t\ttclass* ptci=zfind::class_search(sh,temp[0].get_top().val);\r\n\t\t\tif(ptci==null)\r\n\t\t\t{\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\tif(temp[0].count()==1)\r\n\t\t\t{\r\n\t\t\t\tfor(int i=0;i<ptci->vdata.count();i++)\r\n\t\t\t\t{\r\n\t\t\t\t\tresult+=head;\r\n\t\t\t\t\tresult+=ptci->vdata[i].name;\r\n\t\t\t\t\tresult+=tword(rppoptr(c_sbk_r));\r\n\t\t\t\t\tresult+=tword(rppoptr(c_semi));\r\n\t\t\t\t\t//todo 单词没有行号\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\tfor(tfunc* p=ptci->vfunc.begin();p!=ptci->vfunc.end();\r\n\t\t\t\t\tp=ptci->vfunc.next(p))\r\n\t\t\t\t{\r\n\t\t\t\t\tresult+=head;\r\n\t\t\t\t\tresult+=tword(rppoptr(c_addr));\r\n\t\t\t\t\tresult+=ptci->name;\r\n\t\t\t\t\tresult+=tword(rppoptr(c_dot));\r\n\t\t\t\t\tresult+=p->name;\r\n\t\t\t\t\tresult+=tword(rppoptr(c_sbk_l));\r\n\t\t\t\t\tfor(int j=0;j<p->param.count();j++)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tif(j!=0)\r\n\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\tresult+=tword(rppoptr(c_comma));\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tresult+=p->param[j].type;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tresult+=tword(rppoptr(c_sbk_r));\r\n\t\t\t\t\tresult+=tword(rppoptr(c_sbk_r));\r\n\t\t\t\t\tresult+=tword(rppoptr(c_semi));\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tfor(int i=0;i<temp.count();i++)\r\n\t\t\t{\r\n\t\t\t\tresult+=head;\r\n\t\t\t\tresult+=temp[i];\r\n\t\t\t\tresult+=tword(rppoptr(c_sbk_r));\r\n\t\t\t\tresult+=tword(rppoptr(c_semi));\r\n\t\t\t}\r\n\t\t}\r\n\t\tif(result.empty())\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\tv=r_move(result);\r\n\t\treturn true;\r\n\t}\r\n\r\n\tstatic rbool replace(tsh& sh,tclass& tci,rbuf<tword>& v)\r\n\t{\r\n\t\tfor(int i=0;i<c_rpp_deep;i++)\r\n\t\t{\r\n\t\t\tifn(replace_v(sh,tci,v))\r\n\t\t\t\treturn false;\r\n\t\t\trbool need;\r\n\t\t\tzpre::arrange(v,&need);\r\n\t\t\tifn(need)\r\n\t\t\t{\r\n\t\t\t\treturn true;\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn false;\r\n\t}\r\n\r\n\tstatic rbool replace_v(tsh& sh,tclass& tci,rbuf<tword>& v)\r\n\t{\r\n\t\tfor(int i=0;i<v.count();i++)\r\n\t\t{\r\n\t\t\ttclass* ptci=&tci;\r\n\t\t\tint right=i;\r\n\t\t\ttmac item;\r\n\t\t\titem.name=v[i].val;\r\n\t\t\tif(ptci->vmac.exist(item))\r\n\t\t\t{\r\n\t\t\t\tifn(i>1&&v.get(i-1).val==rppoptr(c_dot))\r\n\t\t\t\t{\r\n\t\t\t\t\tif(!replace_param(sh,v,i,\r\n\t\t\t\t\t\t*ptci->vmac.find(item),right))\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\treturn false;\r\n\t\t\t\t\t}\r\n\t\t\t\t\ti=right;\r\n\t\t\t\t\tcontinue;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tptci=sh.m_main;\r\n\t\t\tif(ptci->vmac.exist(item))\r\n\t\t\t{\r\n\t\t\t\tifn(i>1&&v.get(i-1).val==rppoptr(c_dot))\r\n\t\t\t\t{\r\n\t\t\t\t\tif(!replace_param(sh,v,i,\r\n\t\t\t\t\t\t*ptci->vmac.find(item),right))\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\treturn false;\r\n\t\t\t\t\t}\r\n\t\t\t\t\ti=right;\r\n\t\t\t\t\tcontinue;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tif(i==0||v[i].val!=rppoptr(c_dot)||i==v.count()-1)\r\n\t\t\t\tcontinue;\r\n\t\t\tif(i>=2&&v[i-2].val==rppoptr(c_dot))\r\n\t\t\t\tcontinue;\r\n\t\t\tptci=zfind::class_search(sh,v[i-1].val);\r\n\t\t\tif(null==ptci)\r\n\t\t\t\tcontinue;\r\n\t\t\ti++;\r\n\t\t\titem.name=v.get(i).val;\r\n\t\t\tif(ptci->vmac.exist(item))\r\n\t\t\t{\r\n\t\t\t\tif(!replace_param(sh,v,i,*ptci->vmac.find(item),right))\r\n\t\t\t\t{\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t}\r\n\t\t\t\tv[i-1].clear();\r\n\t\t\t\tv[i-2].clear();\r\n\t\t\t\ti=right;\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn true;\r\n\t}\r\n\r\n\tstatic rbool replace_param(tsh& sh,rbuf<tword>& v,int& i,\r\n\t\ttmac& mitem,int& right)\r\n\t{\r\n\t\tif(mitem.is_super)\r\n\t\t{\r\n\t\t\treturn zsuper::replace_item(sh,v,right,mitem);\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\treturn replace_param_common(sh,v,i,mitem,right);\r\n\t\t}\r\n\t}\r\n\r\n\tstatic rbool replace_param_common(tsh& sh,rbuf<tword>& v,int& i,\r\n\t\ttmac& mitem,int& right)\r\n\t{\r\n\t\tint left=i+1;\r\n\t\trbuf<rbuf<rstr> > param;\r\n\t\tif(v.get(left).val==rppoptr(c_sbk_l))\r\n\t\t{\r\n\t\t\tright=sh.find_symm_sbk(v,left);\r\n\t\t\tif(right>=v.count())\r\n\t\t\t{\r\n\t\t\t\tsh.error(v.get(i),\"miss )\");\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\trbuf<rbuf<tword> > temp;\r\n\t\t\ttemp=sh.comma_split(v.sub(left+1,right));\r\n\t\t\tfor(int j=0;j<temp.count();j++)\r\n\t\t\t\tparam.push(sh.vword_to_vstr(temp[j]));\r\n\t\t\tif(!replace_w(v[i],param,mitem))\r\n\t\t\t{\r\n\t\t\t\tsh.error(v.get(i));\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\tsh.clear_word_val(v,left,right+1);\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tif(!replace_w(v[i],param,mitem))\r\n\t\t\t{\r\n\t\t\t\tsh.error(v.get(i));\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn true;\r\n\t}\r\n\r\n\tstatic rbool replace_w(tword& word,rbuf<rbuf<rstr> >& param,tmac& mitem)\r\n\t{\r\n\t\tif(param.count()!=mitem.param.count())\r\n\t\t\treturn false;\r\n\t\tword.val.clear();\r\n\t\tif(param.empty())\r\n\t\t{\r\n\t\t\tword.multi=mitem.vstr;\r\n\t\t\treturn true;\r\n\t\t}\r\n\t\tfor(int i=0;i<mitem.vstr.count();i++)\r\n\t\t{\r\n\t\t\tint j;\r\n\t\t\tfor(j=0;j<mitem.param.count();j++)\r\n\t\t\t{\r\n\t\t\t\tif(mitem.param[j]==mitem.vstr[i])\r\n\t\t\t\t{\r\n\t\t\t\t\tword.multi+=param[j];\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tif(j<mitem.param.count())\r\n\t\t\t\tcontinue;\r\n\t\t\tword.multi.push(mitem.vstr[i]);\r\n\t\t}\r\n\t\treturn true;\r\n\t}\r\n};\r\n\r\n#endif\r\n"
  },
  {
    "path": "rpp/zmain.h",
    "content": "﻿#ifndef zmain_h__\r\n#define zmain_h__\r\n\r\n#include \"../rlib/rsock.h\"//winsock2的原因需要先包含rsock.h\r\n#include \"tvm.h\"\r\n\r\n//main函数进行参数解析\r\nstruct zmain\r\n{\r\n\tstatic rbool write_inf(tsh& sh,rstrw name)\r\n\t{\r\n\t\tifn(sh.m_db.write_new(name.torstr()))\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\tifn(sh.m_db.write_new(rfile::read_all_n(name)))\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\treturn true;\r\n\t}\r\n\r\n\tstatic rbool pack(tsh& sh)\r\n\t{\r\n\t\trstrw name=tsh::get_main_name(sh)+\".exe\";\r\n\t\trfile::remove(name);\r\n\t\tifn(sh.m_db.open(name,\"rw\"))\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\tfor(tfile* p=sh.m_file.begin();p!=sh.m_file.end();p=sh.m_file.next(p))\r\n\t\t{\r\n\t\t\tifn(sh.m_db.write_new(p->name.torstr()))\r\n\t\t\t{\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\tifn(sh.m_db.write_new(p->cont))\r\n\t\t\t{\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t}\r\n\t\tifn(write_inf(sh,\"rinf/conf.txt\"))\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\tifn(write_inf(sh,\"rinf/key.txt\"))\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\tifn(write_inf(sh,\"rinf/match.txt\"))\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\tifn(write_inf(sh,\"rinf/optr.txt\"))\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\tsh.m_db.close();\r\n\t\tifn(rfile::write_all_n(name,rfile::read_all_n(\r\n\t\t\trdir::get_exe_name())+rfile::read_all_n(name)))\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\treturn true;\r\n\t}\r\n\r\n\tstatic rbuf<rstr> param_split(rstr s)\r\n\t{\r\n\t\trbuf<rstr> v;\r\n\t\tint j;\r\n\t\tfor(int i=0;i<s.count();i++)\r\n\t\t{\r\n\t\t\tif(s[i]=='\"')\r\n\t\t\t{\r\n\t\t\t\tj=s.find(\"\\\"\",i+1);\r\n\t\t\t\tv.push(s.sub(i+1,j));\r\n\t\t\t\ti=j;\r\n\t\t\t}\r\n\t\t\telif(s[i]==' ')\r\n\t\t\t{\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\tfor(j=i;j<s.count();j++)\r\n\t\t\t\t{\r\n\t\t\t\t\tif(s[j]==' ')\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tv.push(s.sub(i,j));\r\n\t\t\t\ti=j;\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn r_move(v);\r\n\t}\r\n\r\n\tstatic void tick(int& start)\r\n\t{\r\n\t\tint end=rf::tick();\r\n\t\trstr(\"time:\").print();\r\n\t\trf::printl(rstr(end-start).cstr());\r\n\t\tstart=end;\r\n\t}\r\n\r\n\tstatic rbool output_pre(tsh& sh)\r\n\t{\r\n\t\trstrw name=tsh::get_main_name(sh)+\".txt\";\r\n\t\trfile file;\r\n\t\tfile.open_n(name,\"rw\");\r\n\t\tfor(tfile* p=sh.m_file.begin();p!=sh.m_file.end();p=sh.m_file.next(p))\r\n\t\t{\r\n\t\t\tif(p->name!=sh.m_main_file)\r\n\t\t\t{\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\t\t\trbuf<tword>& v=p->vword;\r\n\t\t\tfor(int i=0;i<v.count();i++)\r\n\t\t\t{\r\n\t\t\t\tfile.write(rstr(v[i].pos.line)+\" \"+v[i].val+\"\\r\\n\");\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn true;\r\n\t}\r\n\r\n\tstatic rbool compile(tsh& sh,tvm& vm,rstrw name)\r\n\t{\r\n\t\tif(name.empty()&&sh.m_mode==tsh::c_rvm)\r\n\t\t\tname=rdir::get_exe_dir()+rstrw(\"example/1.h\");\r\n\t\tname=rdir::dir_std(name);\r\n\t\tname=zpre::get_abs_path(name);\r\n\t\tsh.m_main_file=name;\r\n\t\tint start=rf::tick();\r\n\t\tif(!zread::process(sh))\r\n\t\t{\r\n\t\t\ttsh::error(\"read basic inf error\");\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\tif(!zpre::process(sh))\r\n\t\t{\r\n\t\t\ttsh::error(\"pre process error\");\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\tif(sh.m_is_pre_mode)\r\n\t\t{\r\n\t\t\treturn output_pre(sh);\r\n\t\t}\r\n\t\tif(sh.m_is_pack_mode)\r\n\t\t{\r\n\t\t\treturn pack(sh);\r\n\t\t}\r\n\t\tif(!zclass::process(sh))\r\n\t\t{\r\n\t\t\ttsh::error(\"extract class error\");\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\tif(!zctl::process(sh))\r\n\t\t{\r\n\t\t\ttsh::error(\"class template replace error\");\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\tif(sh.m_mode==tsh::c_jit)\r\n\t\t{\r\n\t\t\tif(!zjit::run(sh))\r\n\t\t\t{\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t}\r\n\t\telif(sh.m_mode==tsh::c_rvm)\r\n\t\t{\r\n\t\t\tif(!vm.run(sh))\r\n\t\t\t{\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t}\r\n\t\telif(sh.m_mode==tsh::c_win)\r\n\t\t{\r\n\t\t\tif(!znasm::proc(sh))\r\n\t\t\t{\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t}\r\n\t\telif(sh.m_mode==tsh::c_grub)\r\n\t\t{\r\n\t\t\tif(!znasm::proc_grub(sh))\r\n\t\t\t{\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t}\r\n\t\tif(rppconf(c_display_inf))\r\n\t\t{\r\n\t\t\trf::printl();\r\n\t\t\ttick(start);\r\n\t\t}\r\n\t\treturn true;\r\n\t}\r\n\r\n\tstatic int rpp_main(tvm& vm,int argc,char** argv)\r\n\t{\r\n\t\ttsh& sh=vm.m_sh;\r\n\t\trstr name;\r\n\t\tsh.m_argc=argc;\r\n\t\tsh.m_argv=argv;\r\n\t\tzjitf::get_psh()=&sh;\r\n\t\tif(argc==1)\r\n\t\t{\r\n\t\t\trstr exe_name=argv[0];\r\n\t\t\texe_name=rcode::gbk_to_utf8(exe_name);\r\n\t\t\tint real_size=rfile::get_exe_size(exe_name.cstr_t());\r\n\t\t\tif(real_size<=0)\r\n\t\t\t{\r\n\t\t\t\tvm.m_sh.error(\"can't read exe file\");\r\n\t\t\t\treturn 1;\r\n\t\t\t}\r\n\t\t\tsh.m_is_pack_read=rfile::get_size8(exe_name)>real_size;\r\n\t\t\tif(sh.m_is_pack_read)\r\n\t\t\t{\r\n\t\t\t\tsh.m_mode=tsh::c_jit;\r\n\t\t\t\tifn(sh.m_db.open_off(exe_name,real_size))\r\n\t\t\t\t{\r\n\t\t\t\t\treturn 1;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\tif(argc>=3)\r\n\t\t{\r\n\t\t\tname=argv[2];\r\n\t\t\tif(argv[1]==rstr(\"-jit\"))\r\n\t\t\t{\r\n\t\t\t\tsh.m_mode=tsh::c_jit;\r\n\t\t\t}\r\n\t\t\telif(argv[1]==rstr(\"-win\"))\r\n\t\t\t{\r\n\t\t\t\tsh.m_mode=tsh::c_win;\r\n\t\t\t}\r\n\t\t\telif(argv[1]==rstr(\"-grub\"))\r\n\t\t\t{\r\n\t\t\t\tsh.m_mode=tsh::c_grub;\r\n\t\t\t}\r\n\t\t\telif(argv[1]==rstr(\"-pack\"))\r\n\t\t\t{\r\n\t\t\t\tsh.m_mode=tsh::c_jit;\r\n\t\t\t\tsh.m_is_pack_mode=true;\r\n\t\t\t}\r\n\t\t\telif(argv[1]==rstr(\"-pre\"))\r\n\t\t\t{\r\n\t\t\t\tsh.m_is_pre_mode=true;\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\tname=argv[1];\r\n\t\t\t}\r\n\t\t}\r\n\t\telif(argc>=2)\r\n\t\t{\r\n\t\t\tname=argv[1];\r\n\t\t}\r\n#ifdef _MSC_VER\r\n\t\tname=rcode::gbk_to_utf8(name);\r\n#endif\r\n\t\tsh.m_ret=0;\r\n\t\tif(!compile(sh,vm,name))\r\n\t\t{\r\n\t\t\tsh.m_ret=1;\r\n\t\t}\r\n\t\tif(rppconf(c_pause))\r\n\t\t\trf::getch();\r\n\t\treturn sh.m_ret;\r\n\t}\r\n};\r\n\r\n//todo C++不支持mixin，只能这么写\r\nrbool _func_to_x86(tsh& sh,tfunc& tfi,tenv env)\r\n{\r\n\treturn zjit::func_to_x86(sh,tfi,env);\r\n}\r\n\r\nint _find_symm_sbk(tsh& sh,const rbuf<tword>& v,int begin)\r\n{\r\n\treturn sh.find_symm_sbk(v,begin);\r\n}\r\n\r\n#endif\r\n"
  },
  {
    "path": "rpp/zmatch.h",
    "content": "﻿#ifndef zmatch_h__\r\n#define zmatch_h__\r\n\r\n#include \"zfind.h\"\r\n\r\nstruct zmatch\r\n{\r\n\t//可构造转换传递\r\n\tstatic rbool is_construct_pass(tsh& sh,tsent& src,rstr& dst)\r\n\t{\r\n\t\tif(dst==rppkey(c_rcs))\r\n\t\t{\r\n\t\t\treturn true;\r\n\t\t}\r\n\t\ttclass* ptci=zfind::class_search_t(sh,dst);\r\n\t\tif(ptci==null)\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\ttfunc* ptfi=zfind::func_search(*ptci,sh.get_tname(dst),\r\n\t\t\tsh.get_tname(dst)+rppoptr(c_addr),\r\n\t\t\tsh.get_tname(src.type)+rppoptr(c_addr));\r\n\t\tif(ptfi!=null)\r\n\t\t{\r\n\t\t\treturn true;\r\n\t\t}\r\n\t\tptfi=zfind::func_search(*ptci,sh.get_tname(dst),\r\n\t\t\tsh.get_tname(dst)+rppoptr(c_addr),sh.get_tname(src.type));\r\n\t\treturn ptfi!=null;\r\n\t}\r\n\r\n\t//可直接传递，返回对象可传递引用\r\n\tstatic rbool is_direct_pass(tsh& sh,tsent& src,rstr& dst)\r\n\t{\r\n\t\tif(sh.is_point(src.type)&&sh.is_point(dst))\r\n\t\t\treturn true;\r\n\t\tif(dst==rppkey(c_rcs))\r\n\t\t{\r\n\t\t\treturn true;\r\n\t\t}\r\n\t\tif(dst==rppkey(c_rd4)&&zfind::get_type_size(sh,src.type)==4)\r\n\t\t\treturn true;\r\n\t\tif(sh.get_tname(src.type)!=sh.get_tname(dst))\r\n\t\t\treturn false;\r\n\t\treturn true;\r\n\t}\r\n\r\n\t//是否直接传递或构造转换传递\r\n\tstatic rbool is_direct_construct_pass_m(tsh& sh,rbuf<tsent>& vsent,\r\n\t\trbuf<tdata>& vparam)\r\n\t{\r\n\t\tif(vsent.count()!=vparam.count())\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\tfor(int i=0;i<vsent.count();i++)\r\n\t\t{\r\n\t\t\tif(!is_direct_pass(sh,vsent[i],vparam[i].type)&&\r\n\t\t\t\t!is_construct_pass(sh,vsent[i],vparam[i].type))\r\n\t\t\t{\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn true;\r\n\t}\r\n\r\n\t//查找直接传递或构造转换传递\r\n\tstatic tfunc* find_direct_construct_pass(tsh& sh,tclass& tci,const rstr& fname,\r\n\t\trbuf<tsent>& vsent)\r\n\t{\r\n\t\tfor(tfunc* p=tci.vfunc.begin();p!=tci.vfunc.end();p=tci.vfunc.next(p))\r\n\t\t{\r\n\t\t\tif(fname!=p->name)\r\n\t\t\t\tcontinue;\r\n\t\t\tif(is_direct_construct_pass_m(sh,vsent,p->param))\r\n\t\t\t\treturn p;\r\n\t\t}\r\n\t\treturn null;\r\n\t}\r\n\r\n\t//可完全传递，临时对象可传递引用，常量和返回对象不可传递引用\r\n\tstatic rbool is_full_pass(tsh& sh,tsent& src,rstr& dst)\r\n\t{\r\n\t\tif(!is_direct_pass(sh,src,dst))\r\n\t\t\treturn false;\r\n\t\tif(src.vword.count()==1&&\r\n\t\t\t(src.vword[0].is_const()||\r\n\t\t\tsh.m_key.is_asm_reg(src.vword[0].val))&&\r\n\t\t\tsh.is_quote(dst))\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\tif(src.vword.count()==7&&\r\n\t\t\tsh.is_quote(dst)&&\r\n\t\t\tsrc.vword[1].val==rppoptr(c_addr)&&\r\n\t\t\tsrc.vword[0].val==rppoptr(c_mbk_l))\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\tif(is_temp_var(sh,src))\r\n\t\t{\r\n\t\t\treturn true;\r\n\t\t}\r\n\t\treturn !sh.is_quote(dst)||!is_ret_obj(sh,src.vword);\r\n\t}\r\n\r\n\tstatic rbool is_full_pass_m(tsh& sh,rbuf<tsent>& vsent,rbuf<tdata>& vparam)\r\n\t{\r\n\t\tif(vsent.count()!=vparam.count())\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\tfor(int i=0;i<vsent.count();i++)\r\n\t\t{\r\n\t\t\tif(!is_full_pass(sh,vsent[i],vparam[i].type))\r\n\t\t\t{\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn true;\r\n\t}\r\n\r\n\tstatic tfunc* find_full_pass(tsh& sh,tclass& tci,const rstr& fname,\r\n\t\trbuf<tsent>& vsent)\r\n\t{\r\n\t\tfor(tfunc* p=tci.vfunc.begin();p!=tci.vfunc.end();p=tci.vfunc.next(p))\r\n\t\t{\r\n\t\t\tif(fname!=p->name)\r\n\t\t\t\tcontinue;\r\n\t\t\tif(is_full_pass_m(sh,vsent,p->param))\r\n\t\t\t\treturn p;\r\n\t\t}\r\n\t\treturn null;\r\n\t}\r\n\r\n\tstatic rbool is_temp_var(tsh& sh,tsent& sent)\r\n\t{\r\n\t\treturn !tsh::is_quote(sent.type)&&\r\n\t\t\tsent.vword.count()>=3&&sent.type==sent.vword[2].val&&\r\n\t\t\tsent.vword[1].val==rppkey(c_btemp);\r\n\t}\r\n\r\n\t//重载的友元属性和返回值类型必须相同\r\n\tstatic rbool is_ret_obj(tsh& sh,rbuf<tword>& v)\r\n\t{\r\n\t\tif(v.count()<3)\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\tint start=0;\r\n\t\twhile(start+2<v.count()&&\r\n\t\t\tv[start+1].val==rppoptr(c_dot)&&\r\n\t\t\tv[start].val==rppoptr(c_mbk_l))\r\n\t\t{\r\n\t\t\tstart+=3;\r\n\t\t}\r\n\t\tif(v[start].val==rppoptr(c_mbk_l))\r\n\t\t{\r\n\t\t\tstart++;\r\n\t\t}\r\n\t\tif(start+2>=v.count())\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\tif(v[start].val==rppkey(c_pcall))\r\n\t\t{\r\n\t\t\treturn !sh.is_quote(v[start+2].val);\r\n\t\t}\r\n\t\ttclass* ptci=zfind::class_search(sh,v[start].val);\r\n\t\tif(ptci==null)\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\ttfunc* ptfi=zfind::func_search_dec(*ptci,v[start+2].val);\r\n\t\tif(ptfi==null)\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\treturn !sh.is_quote(ptfi->retval.type);\r\n\t}\r\n\r\n\tstatic void insert_type(tsh& sh,tsent& sent,const rstr& type)\r\n\t{\r\n\t\trbuf<tword> result;\r\n\t\tresult+=rppoptr(c_mbk_l);\r\n\t\tresult+=rppkey(c_btemp);\r\n\t\tresult+=rppoptr(c_comma);\r\n\t\tresult+=type;\r\n\t\tresult+=rppoptr(c_comma);\r\n\t\tresult+=rppoptr(c_mbk_l);\r\n\t\tresult+=sent.vword;\r\n\t\tresult+=rppoptr(c_mbk_r);\r\n\t\tresult+=rppoptr(c_mbk_r);\r\n\t\tsent.vword=r_move(result);\r\n\t\tsent.type=type;\r\n\t}\r\n\r\n\t//先完全传递，找不到再尝试替换单词\r\n\tstatic tfunc* find_replace(tsh& sh,tclass& tci,const rstr& fname,\r\n\t\trbuf<tsent>& vsent)\r\n\t{\r\n\t\ttfunc* ptfi=find_full_pass(sh,tci,fname,vsent);\r\n\t\tif(ptfi!=null)\r\n\t\t{\r\n\t\t\treturn ptfi;\r\n\t\t}\r\n\t\t//可能找到多个，只取第一个\r\n\t\tptfi=find_direct_construct_pass(sh,tci,fname,vsent);\r\n\t\tif(ptfi==null)\r\n\t\t{\r\n\t\t\treturn null;\r\n\t\t}\r\n\t\tfor(int i=0;i<vsent.count();i++)\r\n\t\t{\r\n\t\t\t//这里也可以用 if is_direct_construct_pass\r\n\t\t\tifn(is_full_pass(sh,vsent[i],ptfi->param[i].type))\r\n\t\t\t{\r\n\t\t\t\tinsert_type(sh,vsent[i],\r\n\t\t\t\t\tsh.get_tname(ptfi->param[i].type));\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn ptfi;\r\n\t}\r\n};\r\n\r\n#endif\r\n"
  },
  {
    "path": "rpp/zmemb.h",
    "content": "﻿#ifndef zmemb_h__\r\n#define zmemb_h__\r\n\r\n//提取类内部的成员，函数默认参数处理\r\n//zclass::vword->vdata,vfunc,vmac\r\nstruct zmemb\r\n{\r\n\tstatic rbool recursion_get_size(tsh& sh,tclass& tci,int level=0)\r\n\t{\r\n\t\tif(level>c_rpp_deep)\r\n\t\t{\r\n\t\t\tsh.error(rstr(\"level overflow \")+tci.name);\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\tlevel++;\r\n\t\tif(tci.size>0||tci.size==0&&tci.vdata.empty())\r\n\t\t{\r\n\t\t\treturn true;\r\n\t\t}\t\r\n\t\tint size=0;\r\n\t\tfor(int i=0;i<tci.vdata.count();i++)\r\n\t\t{\r\n\t\t\tif(sh.is_point_quote(tci.vdata[i].type))\r\n\t\t\t{\r\n\t\t\t\ttci.vdata[i].off=size;\r\n\t\t\t\ttci.vdata[i].size=c_point_size;\r\n\t\t\t\tsize+=tci.vdata[i].size*tci.vdata[i].count;\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\ttclass* ptci=zfind::class_search(sh,tci.vdata[i].type);\r\n\t\t\t\tif(null==ptci)\r\n\t\t\t\t{\r\n\t\t\t\t\tsh.error(rstr(\"can't find \")+tci.vdata[i].type);\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t}\r\n\t\t\t\tif(!recursion_get_size(sh,*ptci,level))\r\n\t\t\t\t\treturn false;\r\n\t\t\t\ttci.vdata[i].off=size;\r\n\t\t\t\ttci.vdata[i].size=ptci->size;\r\n\t\t\t\tsize+=tci.vdata[i].size*tci.vdata[i].count;\r\n\t\t\t}\r\n\t\t}\r\n\t\ttci.size=size;\r\n\t\treturn true;\r\n\t}\r\n\r\n\tstatic rbool analyse(tsh& sh,tclass& tci)\r\n\t{\r\n\t\trbuf<tword>& v=tci.vword;\r\n\t\tint start=0;\r\n\t\tint i;\r\n\t\tfor(i=0;i<v.count();i++)\r\n\t\t{\r\n\t\t\tif(i==v.count()-1&&start<i)\r\n\t\t\t{\r\n\t\t\t\tif(!data_add(sh,tci,v.sub(start,i+1)))\r\n\t\t\t\t{\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t}\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t\telif(i>0&&v[i-1].pos!=v[i].pos)\r\n\t\t\t{\r\n\t\t\t\tif(v[i].val==rppoptr(c_bbk_l))\r\n\t\t\t\t{\r\n\t\t\t\t\tint right=sh.find_symm_bbk(v,i);\r\n\t\t\t\t\tif(right>=v.count())\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tsh.error(v.get(start),\"miss }\");\r\n\t\t\t\t\t\treturn false;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif(!func_add(sh,tci,v.sub(start,right+1)))\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\treturn false;\r\n\t\t\t\t\t}\r\n\t\t\t\t\ti=right;\r\n\t\t\t\t\tstart=right+1;\r\n\t\t\t\t}\r\n\t\t\t\telse\r\n\t\t\t\t{\r\n\t\t\t\t\tif(!data_add(sh,tci,v.sub(start,i)))\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\treturn false;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tstart=i;\r\n\t\t\t\t\tv[i-1].pos=v[i].pos;\r\n\t\t\t\t\ti--;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\telif(v[i].val==rppoptr(c_bbk_l))\r\n\t\t\t{\r\n\t\t\t\tint right=sh.find_symm_bbk(v,i);\r\n\t\t\t\tif(right>=v.count())\r\n\t\t\t\t{\r\n\t\t\t\t\tsh.error(v.get(start),\"miss }\");\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t}\r\n\t\t\t\tifn(func_add(sh,tci,v.sub(start,right+1)))\r\n\t\t\t\t{\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t}\r\n\t\t\t\ti=right;\r\n\t\t\t\tstart=right+1;\r\n\t\t\t}\r\n\t\t\telif(v[i].val==rppoptr(c_semi))\r\n\t\t\t{\r\n\t\t\t\tif(!data_add(sh,tci,v.sub(start,i)))\r\n\t\t\t\t{\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t}\r\n\t\t\t\tstart=i+1;\r\n\t\t\t}\r\n\t\t\telif(v[i].val==rppkey(c_enum))\r\n\t\t\t{\r\n\t\t\t\tint left=i+1;\r\n\t\t\t\tif(v.get(left).val!=rppoptr(c_bbk_l))\r\n\t\t\t\t{\r\n\t\t\t\t\tsh.error(v.get(i),\"miss {\");\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t}\r\n\t\t\t\tint right=sh.find_symm_bbk(v,left);\r\n\t\t\t\tif(right>=v.count())\r\n\t\t\t\t{\r\n\t\t\t\t\tsh.error(v.get(i),\"miss }\");\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t}\r\n\t\t\t\tifn(enum_add(sh,tci,v.sub(left+1,right)))\r\n\t\t\t\t{\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t}\r\n\t\t\t\ti=right;\r\n\t\t\t\tstart=right+1;\r\n\t\t\t}\r\n\t\t\telif(v[i].val==rppkey(c_mac))\r\n\t\t\t{\r\n\t\t\t\tint right;\r\n\t\t\t\tif(!mac_add(sh,tci,v,i,right))\r\n\t\t\t\t\treturn false;\r\n\t\t\t\ti=right;\r\n\t\t\t\tstart=right+1;\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn true;\r\n\t}\r\n\r\n\tstatic rbool enum_add(tsh& sh,tclass& tci,const rbuf<tword>& v)\r\n\t{\r\n\t\tuint enum_val=0;\r\n\t\tfor(int j=0;j<v.count();j++)\r\n\t\t{\r\n\t\t\tif(v[j].val==rppoptr(c_comma)||v[j].val==rppoptr(c_semi))\r\n\t\t\t{\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\t\t\ttmac eitem;\r\n\t\t\teitem.name=v[j].val;\r\n\t\t\tif(v.get(j+1).val==rppoptr(c_equal))\r\n\t\t\t{\r\n\t\t\t\tif(v.get(j+2)==rppoptr(c_sbk_l))\r\n\t\t\t\t{\r\n\t\t\t\t\tenum_val=v.get(j+3).val.touint();\r\n\t\t\t\t\teitem.vstr.push(rstr(enum_val));\r\n\t\t\t\t\tenum_val++;\r\n\t\t\t\t\tj+=4;\r\n\t\t\t\t}\r\n\t\t\t\telse\r\n\t\t\t\t{\r\n\t\t\t\t\tenum_val=v.get(j+2).val.touint();\r\n\t\t\t\t\teitem.vstr.push(rstr(enum_val));\r\n\t\t\t\t\tenum_val++;\r\n\t\t\t\t\tj+=2;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\teitem.vstr.push(rstr(enum_val));\r\n\t\t\t\tenum_val++;\r\n\t\t\t}\r\n\t\t\tif(tci.vmac.exist(eitem))\r\n\t\t\t{\r\n\t\t\t\tsh.error(v.get_bottom(),\"enum redefined\");\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\ttci.vmac.insert(eitem);\r\n\t\t}\r\n\t\treturn true;\r\n\t}\r\n\r\n\tstatic rbool mac_add(tsh& sh,tclass& tci,rbuf<tword>& v,int i,int& right)\r\n\t{\r\n\t\tif(v.get(i+1).val==\"$\")\r\n\t\t{\r\n\t\t\tifn(zsuper::add_super_mac(sh,v,i,tci.vmac))\r\n\t\t\t{\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\tright=i;\r\n\t\t\treturn true;\r\n\t\t}\r\n\t\ttmac mitem;\r\n\t\tint left=i+2;\r\n\t\tmitem.name=v.get(left-1).val;\r\n\t\tif(mitem.name.empty())\r\n\t\t{\r\n\t\t\tsh.error(v.get(i),\"mac miss name\");\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\tif(v.get(left).val==rppoptr(c_sbk_l))\r\n\t\t{\r\n\t\t\tright=sh.find_symm_sbk(v,left);\r\n\t\t\tif(right>=v.count())\r\n\t\t\t{\r\n\t\t\t\tsh.error(v.get(i),\"miss )\");\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\trbuf<rbuf<rstr> > temp=r_split<rbuf<rstr>,rstr>(\r\n\t\t\t\tsh.vword_to_vstr(v.sub(left+1,right)),\r\n\t\t\t\trppoptr(c_comma));\r\n\t\t\tfor(int j=0;j<temp.count();j++)\r\n\t\t\t{\r\n\t\t\t\tmitem.param.push(temp[j].get(0));\r\n\t\t\t}\r\n\t\t\tright++;\r\n\t\t\tleft=right;\r\n\t\t}\r\n\t\tright=left;\r\n\t\tif(v.get(left).val==rppoptr(c_bbk_l))\r\n\t\t{\r\n\t\t\tright=sh.find_symm_bbk(v,left);\r\n\t\t\tif(right>=v.count())\r\n\t\t\t{\r\n\t\t\t\tsh.error(v.get(i),\"miss }\");\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\tfor(int j=left+1;j<right;j++)\r\n\t\t\t{\r\n\t\t\t\tmitem.vstr.push(v[j].val);\r\n\t\t\t}\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tfor(;right<v.count()&&v[right].pos==v[i].pos;right++)\r\n\t\t\t\t;\r\n\t\t\tright--;\r\n\t\t\tif(right>=v.count())\r\n\t\t\t{\r\n\t\t\t\tsh.error(v.get(i),\"miss mac\");\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\tif(mitem.param.empty())\r\n\t\t\t{\r\n\t\t\t\tfor(int j=left;j<=right;j++)\r\n\t\t\t\t\tmitem.vstr.push(v[j].val);\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\tmitem.vstr.push(rppoptr(c_sbk_l));\r\n\t\t\t\tfor(int j=left;j<=right;j++)\r\n\t\t\t\t{\r\n\t\t\t\t\tif(mitem.param.exist(v[j].val))\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tmitem.vstr.push(rppoptr(c_sbk_l));\r\n\t\t\t\t\t\tmitem.vstr.push(v[j].val);\r\n\t\t\t\t\t\tmitem.vstr.push(rppoptr(c_sbk_r));\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse\r\n\t\t\t\t\t\tmitem.vstr.push(v[j].val);\r\n\t\t\t\t}\r\n\t\t\t\tmitem.vstr.push(rppoptr(c_sbk_r));\r\n\t\t\t}\r\n\t\t}\r\n\t\tif(tci.vmac.exist(mitem))\r\n\t\t{\r\n\t\t\tsh.error(v.get_bottom(),\"mac redefined\");\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\ttci.vmac.insert(mitem);\r\n\t\treturn true;\r\n\t}\r\n\r\n\tstatic rbool a_data_define(tsh& sh,tdata& item,const rbuf<tword>& vword)\r\n\t{\r\n\t\tint pos=vword.find(tword(rppoptr(c_equal)));\r\n\t\tif(pos<vword.count())\r\n\t\t{\r\n\t\t\tfor(int i=pos+1;i<vword.count();i++)\r\n\t\t\t\titem.param.push(vword[i]);\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tpos=vword.find(tword(rppoptr(c_sbk_l)));\r\n\t\t\tif(pos<vword.count())\r\n\t\t\t\tfor(int i=pos+1;i<vword.count()-1;i++)\r\n\t\t\t\t\titem.param.push(vword[i]);\r\n\t\t}\r\n\t\t//process func template\r\n\t\tif(vword.get(1).val==rppoptr(c_tbk_l))\r\n\t\t{\r\n\t\t\tint end=sh.find_symm_tbk(vword,1);\r\n\t\t\tif(end>=vword.count())\r\n\t\t\t{\r\n\t\t\t\tsh.error(vword.get(0),\"miss >\");\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\tfor(int i=0;i<end;i++)\r\n\t\t\t\titem.type+=vword[i].val;\r\n\t\t\tint pointpos=end+1;\r\n\t\t\tfor(;pointpos<pos;++pointpos)\r\n\t\t\t{\r\n\t\t\t\tif(vword[pointpos].val!=rppoptr(c_addr)&&\r\n\t\t\t\t\tvword[pointpos].val!=rppoptr(c_star))\r\n\t\t\t\t\tbreak;\r\n\t\t\t\titem.type+=vword[pointpos].val;\r\n\t\t\t}\r\n\t\t\titem.name=vword.get(pointpos).val;\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\titem.type=vword.get(0).val;\r\n\t\t\tif(zfind::is_class_t(sh,item.type))\r\n\t\t\t{\r\n\t\t\t\titem.name=vword.get(1).val;\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\titem.type=\"var&\";\r\n\t\t\t\titem.name=vword.get(0).val;\r\n\t\t\t}\r\n\t\t}\r\n\t\tif(item.type.empty()||item.name.empty())\r\n\t\t{\r\n\t\t\tsh.error(vword.get(0),\"miss data type or name\");\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\titem.count=1;\r\n\t\tif(vword.get(2)==rppoptr(c_mbk_l))\r\n\t\t{\r\n\t\t\tif(vword.get(4)!=rppoptr(c_mbk_r))\r\n\t\t\t{\r\n\t\t\t\tsh.error(vword.get(0),\"data array error\");\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\t//保存数组个数\r\n\t\t\titem.count=vword.get(3).val.toint();\r\n\t\t}\r\n\t\treturn true;\r\n\t}\r\n\r\n\tstatic rbool lambda_a_func_define(tsh& sh,tfunc& item,rbuf<tword>& v)\r\n\t{\r\n\t\tif(v.get(1)!=rppoptr(c_sbk_l))\r\n\t\t{\r\n\t\t\tsh.error(v.get(0),\"miss (\");\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\titem.name=v.get(0).val;\r\n\t\tint right=sh.find_symm_sbk(v,1);\r\n\t\tif(right>=v.count())\r\n\t\t{\r\n\t\t\tsh.error(v.get(0),\"miss )\");\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\trbuf<tword> param=v.sub(2,right);\r\n\t\trbuf<rbuf<tword> > list=sh.comma_split(param);\r\n\t\tint i=0;\r\n\t\t//如果第一个参数只有类型，则表明是返回值\r\n\t\tif(!list.empty()&&list[0].count()==1&&\r\n\t\t\tzfind::is_class_t(sh,list[0].get_bottom().val))\r\n\t\t{\r\n\t\t\titem.retval.type=list[0].get_bottom().val;\r\n\t\t\ti++;\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\titem.retval.type=rppkey(c_void);\r\n\t\t}\r\n\t\titem.retval.name=rppkey(c_s_ret);\r\n\t\tfor(;i<list.count();i++)\r\n\t\t{\r\n\t\t\tif(list[i].empty())\r\n\t\t\t{\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\t\t\ttdata ditem;\r\n\t\t\tifn(a_data_define(sh,ditem,list[i]))\r\n\t\t\t{\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\titem.param.push(ditem);\r\n\t\t}\r\n\t\treturn true;\r\n\t}\r\n\r\n\tstatic rbool a_func_define(tsh& sh,tfunc& item,rbuf<tword>& v,\r\n\t\trbool lambda=false)\r\n\t{\r\n\t\titem.name.clear();\r\n\t\tif(v.get_bottom().val.sub(0,7)==\"_LAMBDA\")\r\n\t\t{\r\n\t\t\treturn lambda_a_func_define(sh,item,v);\r\n\t\t}\r\n\t\tint start=0;\r\n\t\tif(v.get(start).val==\"macro\")\r\n\t\t{\r\n\t\t\titem.is_macro=true;\r\n\t\t\titem.is_cfunc=true;\r\n\t\t\tstart++;\r\n\t\t}\r\n\t\tif(v.get(start).val==rppkey(c_cfunc))\r\n\t\t{\r\n\t\t\titem.is_cfunc=true;\r\n\t\t\tstart++;\r\n\t\t}\r\n\t\tif(v.get(start).val==rppkey(c_dynamic))\r\n\t\t{\r\n\t\t\titem.is_dynamic=true;\r\n\t\t\tstart++;\r\n\t\t}\r\n\t\tif(v.get(start).val==rppkey(c_friend))\r\n\t\t{\r\n\t\t\titem.is_friend=true;\r\n\t\t\tstart++;\r\n\t\t}\r\n\t\tif(lambda)\r\n\t\t{\r\n\t\t\tif(zfind::is_class_t(sh,v.get(start).val))\r\n\t\t\t{\r\n\t\t\t\titem.retval.type=v.get(start).val;\r\n\t\t\t\tstart++;\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t\titem.retval.type=rppkey(c_void);\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tif(zfind::is_class_t(sh,v.get(start).val)\r\n\t\t\t\t&&v.get(start+1).val!=rppoptr(c_sbk_l)\r\n\t\t\t\t&&!v.get(start+1).val.empty())\r\n\t\t\t{\r\n\t\t\t\titem.retval.type=v.get(start).val;\r\n\t\t\t\tstart++;\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t\titem.retval.type=rppkey(c_void);\r\n\t\t}\r\n\t\tif(item.retval.type.empty())\r\n\t\t{\r\n\t\t\tsh.error(v.get(0),\"miss ret type\");\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\titem.retval.name=rppkey(c_s_ret);\r\n\t\tif(v.get(start).val==rppoptr(c_destruct))\r\n\t\t{\r\n\t\t\titem.name+=v.get(start).val;\r\n\t\t\tstart++;\r\n\t\t\titem.name+=v.get(start).val;\r\n\t\t\tstart++;\r\n\t\t}\r\n\t\telif(lambda&&(\r\n\t\t\tv.get(start)==rppoptr(c_bbk_l)||\r\n\t\t\tv.get(start)==rppoptr(c_sbk_l)))\r\n\t\t{\r\n\t\t\titem.name+=\"_SELF\";\r\n\t\t}\r\n\t\telif(sh.m_optr.is_optr(v.get(start).val))\r\n\t\t{\r\n\t\t\titem.name=v.get(start).val;\r\n\t\t\tif(v.get(start).val==rppoptr(c_mbk_l))\r\n\t\t\t{\r\n\t\t\t\tstart++;\r\n\t\t\t\titem.name+=v.get(start).val;\r\n\t\t\t}\r\n\t\t\tstart++;\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\titem.name+=v.get(start).val;\r\n\t\t\tstart++;\r\n\t\t}\r\n\t\tif(item.name.empty())\r\n\t\t{\r\n\t\t\tsh.error(v.get(0),\"miss func name\");\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\trbuf<rbuf<tword> > list;\r\n\t\tint right;\r\n\t\tif(v.get(start).val==rppoptr(c_sbk_l))\r\n\t\t{\r\n\t\t\tright=sh.find_symm_sbk(v,start);\r\n\t\t\tif(right>=v.count())\r\n\t\t\t{\r\n\t\t\t\tsh.error(v.get(0),\"miss )\");\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\tlist=sh.comma_split(v.sub(start+1,right));\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tlist=sh.comma_split(v.sub(start));\r\n\t\t}\r\n\t\tfor(int i=0;i<list.count();i++)\r\n\t\t{\r\n\t\t\tif(list[i].empty())\r\n\t\t\t{\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\t\t\ttdata ditem;\r\n\t\t\tifn(a_data_define(sh,ditem,list[i]))\r\n\t\t\t{\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\titem.param.push(ditem);\r\n\t\t}\r\n\t\treturn true;\r\n\t}\r\n\r\n\tstatic rbool data_add(tsh& sh,tclass& tci,const rbuf<tword>& v)\r\n\t{\r\n\t\tif(v.empty())\r\n\t\t{\r\n\t\t\treturn true;\r\n\t\t}\r\n\t\ttdata item;\r\n\t\tif(!a_data_define(sh,item,v))\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\tif(tci.vdata.exist(item))\r\n\t\t{\r\n\t\t\tv.print();\r\n\t\t\tsh.error(v.get_bottom(),\"data member redefined\");\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\ttci.vdata.push(item);\r\n\t\treturn true;\r\n\t}\r\n\t\r\n\t//tl表示是否检查模板\r\n\tstatic rbool func_add(tsh& sh,tclass& tci,const rbuf<tword>& v,rbool tl=true)\r\n\t{\r\n\t\ttfunc item;\r\n\t\tint left=v.find(tword(rppoptr(c_bbk_l)));\r\n\t\tif(left>=v.count())\r\n\t\t{\r\n\t\t\tsh.error(v.get_bottom(),\"miss {\");\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\tint right=v.count()-1;\r\n\t\titem.first_pos=v[left].pos;\r\n\t\titem.last_pos=v.get(right).pos;\r\n\t\titem.ptci=&tci;//反射\r\n\t\trbuf<tword> vhead=v.sub(0,left);\r\n\t\tif(tl)\r\n\t\t{\r\n\t\t\tfunc_tl_part(sh,item,vhead);\r\n\t\t}\r\n\t\tif(item.vtl.empty())\r\n\t\t{\r\n\t\t\tif(!a_func_define(sh,item,vhead))\r\n\t\t\t{\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\tif(item.name.sub(0,7)!=\"_LAMBDA\")\r\n\t\t\t{\r\n\t\t\t\tadd_this_func(sh,tci,item);\r\n\t\t\t}\r\n\t\t\tobtain_size_func(sh,item);\r\n\t\t\titem.name_dec=item.get_dec();\r\n\t\t\tif(tci.vfunc.exist(item))\r\n\t\t\t{\r\n\t\t\t\tif(tl)\r\n\t\t\t\t{\r\n\t\t\t\t\tsh.error(v.get_bottom(),\"func redefined\");\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t}\r\n\t\t\t\telse\r\n\t\t\t\t\treturn true;\r\n\t\t\t}\r\n\t\t\titem.vword=v.sub(left+1,right);\r\n\t\t\ttci.vfunc.insert(item);\r\n\t\t\tif(item.is_macro)\r\n\t\t\t{\r\n\t\t\t\tsh.m_macro[item.name]=tci.vfunc.find(item);\r\n\t\t\t}\r\n\t\t\tif(!default_param_proc(sh,*tci.vfunc.find(item)))\r\n\t\t\t{\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\titem.name_dec=item.get_dec();\r\n\t\t\tif(tci.vfunctl.exist(item))\r\n\t\t\t{\r\n\t\t\t\tsh.error(v.get_bottom(),\"functl redefined\");\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\titem.vword=v;\r\n\t\t\ttci.vfunctl.insert(item);\r\n\t\t}\r\n\t\treturn true;\r\n\t}\r\n\r\n\tstatic void obtain_size_func(tsh& sh,tclass& tci)\r\n\t{\r\n\t\tfor(tfunc* p=tci.vfunc.begin();p!=tci.vfunc.end();p=tci.vfunc.next(p))\r\n\t\t{\r\n\t\t\tobtain_size_func(sh,*p);\r\n\t\t}\r\n\t}\r\n\r\n\tstatic void obtain_size_func(tsh& sh,tfunc& tfi)\r\n\t{\r\n\t\ttfi.retval.size=zfind::get_type_size(sh,tfi.retval.type);\r\n\t\tfor(int i=0;i<tfi.param.count();i++)\r\n\t\t{\r\n\t\t\ttfi.param[i].size=zfind::get_type_size(sh,tfi.param[i].type);\r\n\t\t}\r\n\t}\r\n\r\n\tstatic void func_tl_part(tsh& sh,tfunc& item,rbuf<tword>& v)\r\n\t{\r\n\t\tint left=v.count();\r\n\t\tif(v.get_top()!=rppoptr(c_tbk_r))\r\n\t\t{\r\n\t\t\tif(v.get_top()!=rppoptr(c_sbk_r))\r\n\t\t\t{\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tleft=sh.find_symm_word_rev(v,\r\n\t\t\t\trppoptr(c_sbk_l),rppoptr(c_sbk_r),\r\n\t\t\t\t0,v.count());\r\n\t\t\tif(left>=v.count())\r\n\t\t\t{\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t}\r\n\t\tif(v.get(left-1)!=rppoptr(c_tbk_r))\r\n\t\t\treturn;\r\n\t\trbuf<tword> temp=v.sub(0,left);\r\n\t\tleft=sh.find_symm_word_rev(temp,\r\n\t\t\trppoptr(c_tbk_l),rppoptr(c_tbk_r),\r\n\t\t\t0,temp.count());\r\n\t\tif(left>=temp.count())\r\n\t\t\treturn;\r\n\t\titem.name=temp.get(left-1).val;\r\n\t\tif(item.name.empty())\r\n\t\t\treturn;\r\n\t\trbuf<rbuf<rstr> > vdst;\r\n\t\trbuf<rstr> vsrc=sh.vword_to_vstr(\r\n\t\t\ttemp.sub(left+1,temp.count()-1));\r\n\t\tvdst=r_split(vsrc,rppoptr(c_comma));\r\n\t\tif(vdst.empty())\r\n\t\t\treturn;\r\n\t\tfor(int i=0;i<vdst.count();i++)\r\n\t\t{\r\n\t\t\tttl tli;\r\n\t\t\ttli.name=vdst[i].get_bottom();\r\n\t\t\titem.vtl.push(tli);\r\n\t\t}\r\n\t}\r\n\r\n\tstatic void add_this_func(tsh& sh,tclass& tci,tfunc& tfi)\r\n\t{\r\n\t\tif(tci.is_friend)\r\n\t\t\ttfi.is_friend=true;\r\n\t\tif(!tfi.is_friend)\r\n\t\t{\r\n\t\t\ttdata tdi;\r\n\t\t\ttdi.name=rppkey(c_this);\r\n\t\t\ttdi.type=tci.name+rppoptr(c_addr);\r\n\t\t\ttfi.param.push_front(tdi);\r\n\t\t}\r\n\t}\r\n\r\n\tstatic rbool default_param_proc(tsh& sh,tfunc& tfi)\r\n\t{\r\n\t\tint i;\r\n\t\tfor(i=0;i<tfi.param.count();i++)\r\n\t\t\tif(!tfi.param[i].param.empty())\r\n\t\t\t\tbreak;\r\n\t\tif(i>=tfi.param.count())\r\n\t\t\treturn true;\r\n\t\tfor(int j=i;j<tfi.param.count();j++)\r\n\t\t\tif(tfi.param[j].param.empty())\r\n\t\t\t{\r\n\t\t\t\tsh.error(tfi.vword.get_bottom(),\"default param error\");\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\tfor(;i<tfi.param.count();i++)\r\n\t\t{\r\n\t\t\ttfunc ftemp=tfi;\r\n\t\t\tftemp.param.erase(i,ftemp.param.count());\r\n\t\t\trbuf<tword> vtemp;\r\n\t\t\ttword twi;\r\n\t\t\ttwi.pos_src=tfi.first_pos;\r\n\t\t\ttwi.pos=tfi.first_pos;\r\n\t\t\tfor(int j=i;j<tfi.param.count();j++)\r\n\t\t\t{\r\n\t\t\t\ttwi.val=tfi.param[j].type;\r\n\t\t\t\tvtemp.push(twi);\r\n\t\t\t\ttwi.val=tfi.param[j].name;\r\n\t\t\t\tvtemp.push(twi);\r\n\t\t\t\ttwi.val=rppoptr(c_sbk_l);\r\n\t\t\t\tvtemp.push(twi);\r\n\t\t\t\tfor(int k=0;k<tfi.param[j].param.count();k++)\r\n\t\t\t\t{\r\n\t\t\t\t\ttwi.val=tfi.param[j].param[k].val;\r\n\t\t\t\t\tvtemp.push(twi);\r\n\t\t\t\t}\r\n\t\t\t\ttwi.val=rppoptr(c_sbk_r);\r\n\t\t\t\tvtemp.push(twi);\r\n\t\t\t\ttwi.val=rppoptr(c_semi);\r\n\t\t\t\tvtemp.push(twi);\r\n\t\t\t}\r\n\t\t\tvtemp+=r_move(ftemp.vword);\r\n\t\t\tftemp.vword=r_move(vtemp);\r\n\t\t\tfor(int j=0;j<ftemp.param.count();j++)\r\n\t\t\t\tftemp.param[j].param.free();\r\n\t\t\tftemp.name_dec=ftemp.get_dec();\r\n\t\t\tif(tfi.ptci->vfunc.exist(ftemp))\r\n\t\t\t{\r\n\t\t\t\tsh.error(tfi.vword.get_bottom(),\"func redefined\");\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\ttfi.ptci->vfunc.insert(ftemp);\r\n\t\t}\r\n\t\tfor(i=0;i<tfi.param.count();i++)\r\n\t\t\ttfi.param[i].param.free();\r\n\t\treturn true;\r\n\t}\r\n};\r\n\r\n#endif\r\n"
  },
  {
    "path": "rpp/znasm.h",
    "content": "﻿#ifndef znasm_h__\r\n#define znasm_h__\r\n\r\n#include \"zbin.h\"\r\n\r\nstruct znasm\r\n{\r\n\tstatic rbool proc(tsh& sh)\r\n\t{\r\n\t\ttfunc* ptfi=zfind::func_search(*sh.m_main,\"main\");\r\n\t\tif(ptfi==null)\r\n\t\t{\r\n\t\t\trf::printl(\"main not find\");\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\trstr result;\r\n\t\trbuf<rstr> vconst;\r\n\t\tifn(proc_func(sh,*ptfi,result,vconst))\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\trstr head;\r\n\t\thead+=\"%include '\"+rcode::utf8_to_gbk(\r\n\t\t\trdir::get_exe_dir().torstr())+\"nasm/windemos.inc'\\n\";\r\n\t\thead+=\"%include '\"+rcode::utf8_to_gbk(\r\n\t\t\trdir::get_exe_dir().torstr())+\"nasm/dec.inc'\\n\";\r\n\t\t//head+=\"IMPORT _getch\\n\"; nasm的一个bug?\r\n\r\n\t\thead+=\"entry demo11\\n\";\r\n\t\thead+=\"\\n\";\r\n\t\thead+=\"[section .bss]\\n\";\r\n\t\thead+=\"align 32\\n\";\r\n\t\thead+=\"_ARGC: resb 4\\n\";\r\n\t\thead+=\"_ARGV: resb 4\\n\";\r\n\t\thead+=rstr(\"_PMAIN_A: resb \")+sh.m_main_data.size()+\"\\n\";\r\n\t\tadd_lambda(sh,head);\r\n\t\thead+=\"\\n\";\r\n\t\thead+=\"[section .data]\\n\";\r\n\t\thead+=\"align 32\\n\";\r\n\t\thead+=\"db 0,0,0,0\\n\";//防止数据段为空\r\n\t\tadd_str(sh,head,vconst);\r\n\t\t\r\n\t\thead+=\"\\n\";\r\n\t\thead+=\"[section .text]\\n\";\r\n\t\thead+=\"proc demo11, ptrdiff_t argcount, ptrdiff_t cmdline\\n\";\r\n\t\thead+=\"locals none\\n\";\r\n\t\thead+=\"\tmov ecx , [ argv(.argcount) ]\\n\";\r\n\t\thead+=\"\tmov [ _ARGC ] , ecx\\n\";\r\n\t\thead+=\"\tmov ecx , [ argv(.cmdline) ]\\n\";\r\n\t\thead+=\"\tmov [ _ARGV ] , ecx\\n\";\r\n\t\thead+=\"\tsub esp , 4\\n\";\r\n\t\thead+=\"\tcall main2Emain2829\\n\";\r\n\t\thead+=\"\tadd esp , 4\\n\";\r\n\t\thead+=\"\txor eax , eax\\n\";\r\n\t\thead+=\"endproc\\n\";\r\n\t\thead+=\"proc _rpp_main\\n\";\r\n\t\thead+=\"locals none\\n\";\r\n\t\thead+=result;\r\n\t\thead+=\"\\n\";\r\n\t\thead+=\"endproc\\n\";\r\n\t\trstrw name=tsh::get_main_name(sh)+\".asm\";\r\n\t\trfile file;\r\n\t\tifn(file.open_n(name,\"rw\"))\r\n\t\t{\r\n\t\t\trf::printl(\"file open error\");\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\tifn(file.write(head.size(),head.begin()))\r\n\t\t{\r\n\t\t\trf::printl(\"file write error\");\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\treturn true;\r\n\t}\r\n\r\n\tstatic rbool proc_grub(tsh& sh)\r\n\t{\r\n\t\ttfunc* ptfi=zfind::func_search(*sh.m_main,\"main\");\r\n\t\tif(ptfi==null)\r\n\t\t{\r\n\t\t\trf::printl(\"main not find\");\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\trstr result;\r\n\t\trbuf<rstr> vconst;\r\n\t\tifn(proc_func(sh,*ptfi,result,vconst))\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\trstr head;\r\n\t\thead+=\"org 4194304\\n\";\r\n\t\thead+=\"MODULEALIGN equ 1<<0\\n\";\r\n\t\thead+=\"MEMINFO equ 1<<1\\n\";\r\n\t\thead+=\"FLAGS equ MODULEALIGN|MEMINFO|(1<<16)\\n\";\r\n\t\thead+=\"MAGIC equ 0x1BADB002\\n\";\r\n\t\thead+=\"CHECKSUM equ-(MAGIC+FLAGS)\\n\";\r\n\t\thead+=\"bits 32\\n\";\r\n\t\thead+=\"\\n\";\r\n\t\thead+=\"section .text\\n\";\r\n\t\thead+=\"align 4\\n\";\r\n\t\thead+=\"MultiBootHeader:\\n\";\r\n\t\thead+=\"\tdd MAGIC\\n\";\r\n\t\thead+=\"\tdd FLAGS\\n\";\r\n\t\thead+=\"\tdd CHECKSUM\\n\";\r\n\t\thead+=\"\tdd MultiBootHeader\\n\";\r\n\t\thead+=\"\tdd MultiBootHeader\\n\";\r\n\t\thead+=\"\tdd MultiBootEnd\\n\";\r\n\t\thead+=\"\tdd _stack_end\\n\";\r\n\t\thead+=\"\tdd _loader\\n\";\r\n\r\n\t\thead+=\"\\n\";\r\n\t\thead+=\"STACKSIZE equ 1024*1024\\n\";\r\n\t\thead+=\"_loader:\\n\";\r\n\t\thead+=\"\tmov esp,_stack_start+STACKSIZE\\n\";\r\n\t\thead+=\"\tfinit\\n\";\r\n\t\thead+=\"\tcli\\n\";\r\n\r\n\t\thead+=\"\tcall rf2Einit5Fheap2829\\n\";\r\n\r\n\t\thead+=\"\tsub esp,4\\n\";\r\n\t\thead+=\"\tcall main2Emain2829\\n\";\r\n\t\thead+=\"\tadd esp,4\\n\";\r\n\r\n\t\thead+=\"_hang:\\n\";\r\n\t\thead+=\"\thlt\\n\";\r\n\t\thead+=\"\tjmp _hang\\n\";\r\n\r\n\t\thead+=result;\r\n\r\n\t\thead+=\"\\n\";\r\n\t\thead+=\"MultiBootEnd:\\n\";\r\n\r\n\t\thead+=\"section .data\\n\";\r\n\t\thead+=\"align 32\\n\";\r\n\t\thead+=\"db 0,0,0,0\\n\";//防止数据段为空\r\n\t\tadd_str(sh,head,vconst);\r\n\t\thead+=\"\\n\";\r\n\r\n\t\thead+=\"section .bss\\n\";\r\n\t\thead+=\"align 32\\n\";\r\n\t\thead+=\"_stack_start:\\n\";\r\n\t\thead+=\"\tresb STACKSIZE\\n\";\r\n\t\thead+=\"_stack_end:\\n\";\r\n\t\thead+=\"\\n\";\r\n\r\n\t\thead+=\"_ARGC: resb 4\\n\";\r\n\t\thead+=\"_ARGV: resb 4\\n\";\r\n\t\thead+=rstr(\"_PMAIN_A: resb \")+sh.m_main_data.size()+\"\\n\";\r\n\t\tadd_lambda(sh,head);\r\n\r\n\t\trstrw name=tsh::get_main_name(sh)+\".asm\";\r\n\t\trfile file;\r\n\t\tifn(file.open_n(name,\"rw\"))\r\n\t\t{\r\n\t\t\trf::printl(\"file open error\");\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\tifn(file.write(head.size(),head.begin()))\r\n\t\t{\r\n\t\t\trf::printl(\"file write error\");\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\treturn true;\r\n\t}\r\n\r\n\tstatic void add_str(tsh& sh,rstr& result,rbuf<rstr>& vconst)\r\n\t{\r\n\t\tfor(int i=0;i<vconst.count();i++)\r\n\t\t{\r\n\t\t\tzbin::trans_cstr(vconst[i]);\r\n\t\t\tadd_str_one(result,i,vconst[i]);\r\n\t\t}\r\n\t}\r\n\r\n\tstatic void add_str_one(rstr& result,int index,const rstr& s)\r\n\t{\r\n\t\tresult+=\"_RC_\"+rstr(index)+\": db \";\r\n\t\tfor(int i=0;i<s.count()-1;i++)\r\n\t\t{\r\n\t\t\tresult+=rstr((int)s[i])+\",\";\r\n\t\t}\r\n\t\tresult+=\"0\\n\";\r\n\t}\r\n\r\n\tstatic void add_lambda(tsh& sh,rstr& result)\r\n\t{\r\n\t\tfor(tclass* p=sh.m_class.begin();\r\n\t\t\tp!=sh.m_class.end();p=sh.m_class.next(p))\r\n\t\t{\r\n\t\t\tadd_lambda(result,*p);\r\n\t\t}\r\n\t}\r\n\r\n\tstatic void add_lambda(rstr& result,tclass& tci)\r\n\t{\r\n\t\tfor(tfunc* p=tci.vfunc.begin();p!=tci.vfunc.end();p=tci.vfunc.next(p))\r\n\t\t{\r\n\t\t\tif(p->lambda_data.empty())\r\n\t\t\t{\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\t\t\tresult+=p->name+\"_C_P_A: resb \"+p->lambda_data.size()+\"\\n\";\r\n\t\t}\r\n\t}\r\n\r\n\tstatic tfunc* call_find(tsh& sh,tasm& item)\r\n\t{\r\n\t\tint i;\r\n\t\tfor(i=1;i<item.vstr.count();i++)\r\n\t\t{\r\n\t\t\tif(item.vstr[i]==\"&\")\r\n\t\t\t{\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t}\r\n\t\t//一条指令里最多出现一次&,而且 &操作数 只能是最后一个操作数\r\n\t\tif(i>=item.vstr.count())\r\n\t\t{\r\n\t\t\treturn null;\r\n\t\t}\r\n\t\ti+=2;\r\n\t\ttclass* ptci=zfind::class_search(sh,item.vstr.get(i));\r\n\t\tif(ptci==null)\r\n\t\t{\r\n\t\t\treturn null;\r\n\t\t}\r\n\t\ti+=2;\r\n\t\trstr fname=item.vstr.get(i);\r\n\t\treturn zfind::func_search_dec(*ptci,fname);\r\n\t}\r\n\r\n\tstatic rstr symbol_trans(const rstr& s)\r\n\t{\r\n\t\trstr ret;\r\n\t\tfor(int i=0;i<s.count();i++)\r\n\t\t{\r\n\t\t\tif(rstr::is_alpha(s[i])||rstr::is_number(s[i]))\r\n\t\t\t{\r\n\t\t\t\tret+=s[i];\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\tret+=rstr::format(\"%02X\",(int)s[i]);\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn r_move(ret);\r\n\t}\r\n\r\n\tstatic rstr get_nasm_symbol(tfunc& tfi)\r\n\t{\r\n\t\treturn symbol_trans(tfi.ptci->name+\".\"+tfi.name_dec);\r\n\t}\r\n\r\n\tstatic rbool is_jmp_ins_nasm(const rstr& s)\r\n\t{\r\n\t\treturn s==\"call\"||s==\"je\"||s==\"jne\"||s==\"jg\"||s==\"jge\"||\r\n\t\t\ts==\"jl\"||s==\"jle\"||s==\"ja\"||s==\"jae\"||s==\"jb\"||s==\"jbe\";\r\n\t}\r\n\r\n\tstatic rbool line_update(tsh& sh,rbuf<tasm>& vasm,rbuf<uchar>& vline)\r\n\t{\r\n\t\tfor(int j=0;j<vasm.count();j++)\r\n\t\t{\r\n\t\t\tif(vasm[j].vstr.count()!=2&&vasm[j].vstr.count()!=3)\r\n\t\t\t{\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\t\t\tifn(vasm[j].vstr.top().is_number())\r\n\t\t\t{\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\t\t\tint type=sh.m_key.get_key_index(vasm[j].vstr.get_bottom());\r\n\t\t\tif(type>tkey::c_rn)\r\n\t\t\t{\r\n\t\t\t\tsh.error(vasm[j]);\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\tifn(zbin::is_jmp_ins(type)||\r\n\t\t\t\ttype==tkey::c_rn&&is_jmp_ins_nasm(vasm[j].vstr[1]))\r\n\t\t\t{\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\t\t\tint line=vasm[j].vstr.top().toint();\r\n\t\t\tint i;\r\n\t\t\tfor(i=0;i<vasm.count();i++)\r\n\t\t\t{\r\n\t\t\t\tif(vasm[i].pos.line>=line)\r\n\t\t\t\t{\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tif(i>=vasm.count())\r\n\t\t\t{\r\n\t\t\t\tsh.error(vasm[j]);\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\tvasm[j].vstr.top()=rstr(vasm[i].pos.line);\r\n\t\t\tvline[i]=1;\r\n\t\t}\r\n\t\treturn true;\r\n\t}\r\n\r\n\t//将一个函数翻译成NASM汇编代码\r\n\tstatic rbool proc_func(tsh& sh,tfunc& tfi,rstr& result,\r\n\t\trbuf<rstr>& vconst,int level=0)\r\n\t{\r\n\t\tif(level>300)\r\n\t\t{\r\n\t\t\tsh.error(tfi,\"nasm level overflow\");\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\tlevel++;\r\n\t\tif(tfi.count==1)\r\n\t\t{\r\n\t\t\treturn true;\r\n\t\t}\r\n\t\ttfi.count=1;\r\n\t\tif(tfi.vasm.empty())\r\n\t\t{\r\n\t\t\tif(!zbin::cp_vword_to_vasm(sh,tfi,tenv()))\r\n\t\t\t{\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t}\r\n\t\t\r\n\t\trbuf<uchar> vline(tfi.vasm.count());\r\n\t\tmemset(vline.begin(),0,vline.count());\r\n\t\tifn(line_update(sh,tfi.vasm,vline))\r\n\t\t{\r\n\t\t\tsh.error(tfi);\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\trstr symbol=get_nasm_symbol(tfi);\r\n\t\tresult+=\"\\n\"+symbol+\":\\n\";\r\n\t\tfor(int i=0;i<tfi.vasm.count();i++)\r\n\t\t{\r\n\t\t\tif(i==0||tfi.vasm[i].pos.line!=tfi.vasm[i-1].pos.line)\r\n\t\t\t{\r\n\t\t\t\tif(vline[i])\r\n\t\t\t\t{\r\n\t\t\t\t\tresult+=symbol+\"_\"+tfi.vasm[i].pos.line+\":\\n\";\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\trstr temp;\r\n\t\t\tifn(proc_asm(sh,tfi,tfi.vasm[i],temp,vconst))\r\n\t\t\t{\r\n\t\t\t\tsh.error(tfi.vasm[i]);\r\n\t\t\t\tsh.error(&tfi);\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\tresult+=temp;\r\n\t\t}\r\n\t\t\r\n\t\tfor(int i=0;i<tfi.vasm.count();i++)\r\n\t\t{\r\n\t\t\ttfunc* ptfi=call_find(sh,tfi.vasm[i]);\r\n\t\t\tif(ptfi==null)\r\n\t\t\t{\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\t\t\tifn(proc_func(sh,*ptfi,result,vconst,level))\r\n\t\t\t{\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn true;\r\n\t}\r\n\r\n\tstatic void proc_const_str(rbuf<rstr>& vstr,rbuf<rstr>& vconst)\r\n\t{\r\n\t\tfor(int i=0;i<vstr.count();i++)\r\n\t\t{\r\n\t\t\tif(vstr[i].get_bottom()=='\"'&&vstr[i].count()>=2)\r\n\t\t\t{\r\n\t\t\t\tvconst.push(vstr[i]);\r\n\t\t\t\tvstr[i]=\"_RC_\"+rstr(vconst.count()-1);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tstatic rbool have_single_esp(tsh& sh,tasm& item)\r\n\t{\r\n\t\tfor(int i=0;i<item.vstr.count();i++)\r\n\t\t{\r\n\t\t\tif(item.vstr[i]==rppkey(c_esp)||item.vstr[i]==rppkey(c_ebp))\r\n\t\t\t{\r\n\t\t\t\tif(item.vstr.get(i-1)!=rppoptr(c_mbk_l))\r\n\t\t\t\t{\r\n\t\t\t\t\treturn true;\r\n\t\t\t\t}\r\n\t\t\t\tif(item.vstr.get(i+2).toint()<4)\r\n\t\t\t\t{\r\n\t\t\t\t\treturn true;\r\n\t\t\t\t}\r\n\t\t\t\tif(item.vstr.get(i+1)!=rppoptr(c_plus))\r\n\t\t\t\t{\r\n\t\t\t\t\treturn true;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tif(item.vstr[i].get_bottom()=='\"'&&item.vstr[i].count()>=2)\r\n\t\t\t{\r\n\t\t\t\treturn true;\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn false;\r\n\t}\r\n\r\n\tstatic void fix_esp(tsh& sh,tasm& item)\r\n\t{\r\n\t\tfor(int i=0;i<item.vstr.count();i++)\r\n\t\t{\r\n\t\t\tif(item.vstr[i]!=rppkey(c_esp)&&item.vstr[i]!=rppkey(c_ebp))\r\n\t\t\t{\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\t\t\tif(item.vstr.count()>i+2&&item.vstr[i+2].is_number())\r\n\t\t\t{\r\n\t\t\t\titem.vstr[i+2]=item.vstr[i+2].toint()-4;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tstatic rbool proc_inline(tsh& sh,rstr& result,tfunc* ptfi,rbool& is_inline)\r\n\t{\r\n\t\tis_inline=false;\r\n\t\trbuf<tasm>& vasm=ptfi->vasm;\r\n\t\tif(vasm.empty())\r\n\t\t{\r\n\t\t\tif(!zbin::cp_vword_to_vasm(sh,*ptfi,tenv()))\r\n\t\t\t{\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t}\r\n\t\tif(vasm.count()>10)\r\n\t\t{\r\n\t\t\treturn true;\r\n\t\t}\r\n\t\tfor(int i=0;i<vasm.count()-1;i++)\r\n\t\t{\r\n\t\t\tint type=sh.m_key.get_key_index(vasm[i].vstr.get_bottom());\r\n\t\t\tif(type>tkey::c_rn)\r\n\t\t\t{\r\n\t\t\t\tsh.error(vasm[i]);\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\tif(zbin::is_jmp_ins(type)||\r\n\t\t\t\ttype==tkey::c_rn&&is_jmp_ins_nasm(vasm[i].vstr.get(1)))\r\n\t\t\t{\r\n\t\t\t\treturn true;\r\n\t\t\t}\r\n\t\t\t//加入call会陷入无限递归\r\n\t\t\tif(type==tkey::c_reti||tkey::c_retn==type||type==tkey::c_call)\r\n\t\t\t{\r\n\t\t\t\treturn true;\r\n\t\t\t}\r\n\t\t\tif(have_single_esp(sh,vasm[i]))\r\n\t\t\t{\r\n\t\t\t\treturn true;\r\n\t\t\t}\r\n\t\t}\r\n\t\trbuf<tasm> temp=vasm;\r\n\t\trbuf<rstr> vconst;//实际上这个vconst没用\r\n\t\tfor(int i=0;i<temp.count()-1;i++)\r\n\t\t{\r\n\t\t\tfix_esp(sh,temp[i]);\r\n\t\t\tif(!proc_asm(sh,*ptfi,temp[i],result,vconst))\r\n\t\t\t{\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t}\r\n\t\tif(temp.count()>=1&&temp.top().vstr.get(0)==rppkey(c_reti)&&\r\n\t\t\ttemp.top().vstr.get(1).toint()!=0)\r\n\t\t{\r\n\t\t\tresult+=\"\tadd esp,\"+temp.top().vstr.get(1)+\"\\n\";\r\n\t\t}\r\n\t\tis_inline=true;\r\n\t\treturn true;\r\n\t}\r\n\r\n\tstatic rbool proc_asm(tsh& sh,tfunc& tfi,tasm& item,\r\n\t\trstr& result,rbuf<rstr>& vconst)\r\n\t{\r\n\t\trbuf<rstr>& vstr=item.vstr;\r\n\t\tproc_const_str(vstr,vconst);\r\n\t\tif(vstr.empty())\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\tint type=sh.m_key.get_key_index(vstr[0]);\r\n\t\ttfunc* ptfi;\r\n\t\tswitch(type)\r\n\t\t{\r\n\t\tcase tkey::c_call:\r\n\t\t\tptfi=call_find(sh,item);\r\n\t\t\tif(ptfi==null)\r\n\t\t\t{\r\n\t\t\t\tresult+=\"\tcall dword \"+\r\n\t\t\t\t\tlink_vstr(vstr.sub(1))+\"\\n\";\r\n\t\t\t\treturn true;\r\n\t\t\t}\r\n\t\t\tresult+=\"\tcall \"+get_nasm_symbol(*ptfi)+\"\\n\";\r\n\t\t\treturn true;\r\n\t\tcase tkey::c_retn:\r\n\t\t\tresult+=\"\tret\\n\";\r\n\t\t\treturn true;\r\n\t\tcase tkey::c_reti:\r\n\t\t\tresult+=\"\tret \"+vstr.get(1)+\"\\n\";\r\n\t\t\treturn true;\r\n\t\tcase tkey::c_push:\r\n\t\t\tptfi=call_find(sh,item);\r\n\t\t\tif(ptfi==null)\r\n\t\t\t{\r\n\t\t\t\tresult+=\"\tpush dword \"+link_vstr(vstr.sub(1))+\"\\n\";\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\tresult+=\"\tpush \"+get_nasm_symbol(*ptfi)+\"\\n\";\r\n\t\t\t}\r\n\t\t\treturn true;\r\n\t\tcase tkey::c_pop:\r\n\t\t\tresult+=\"\tpop dword \"+link_vstr(vstr.sub(1))+\"\\n\";\r\n\t\t\treturn true;\r\n\t\tcase tkey::c_jmp:\r\n\t\t\tresult+=\"\tjmp \"+get_nasm_symbol(tfi)+\"_\"+vstr.get(1)+\"\\n\";\r\n\t\t\treturn true;\r\n\t\tcase tkey::c_jebxz:\r\n\t\t\tresult+=\"\tcmp ebx , 0\\n\";\r\n\t\t\tresult+=\"\tjz \"+get_nasm_symbol(tfi)+\"_\"+vstr.get(1)+\"\\n\";\r\n\t\t\treturn true;\r\n\t\tcase tkey::c_jebxnz:\r\n\t\t\tresult+=\"\tcmp ebx , 0\\n\";\r\n\t\t\tresult+=\"\tjnz \"+get_nasm_symbol(tfi)+\"_\"+vstr.get(1)+\"\\n\";\r\n\t\t\treturn true;\r\n\t\tcase tkey::c_nop:\r\n\t\t\tresult+=\"\tnop\\n\";\r\n\t\t\treturn true;\r\n\t\tcase tkey::c_lea:\r\n\t\t\tif(count_mbk_l(vstr)==2)\r\n\t\t\t{\r\n\t\t\t\tresult+=\"\tlea ecx , \"+get_opnd2(vstr)+\"\\n\";\r\n\t\t\t\tresult+=\"\tmov \"+get_opnd1(vstr)+\" , ecx\\n\";\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\tresult+=\"\tlea dword \"+link_vstr(vstr.sub(1))+\"\\n\";\r\n\t\t\t}\r\n\t\t\treturn true;\r\n\t\tcase tkey::c_mov:\r\n\t\t\tif(count_mbk_l(vstr)==2)\r\n\t\t\t{\r\n\t\t\t\tresult+=\"\tmov ecx , \"+get_opnd2(vstr)+\"\\n\";\r\n\t\t\t\tresult+=\"\tmov \"+get_opnd1(vstr)+\" , ecx\\n\";\r\n\t\t\t\treturn true;\r\n\t\t\t}\r\n\t\t\tptfi=call_find(sh,item);\r\n\t\t\tif(ptfi==null)\r\n\t\t\t{\r\n\t\t\t\tresult+=\"\tmov dword \"+link_vstr(vstr.sub(1))+\"\\n\";\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\tresult+=\"\tmov dword \"+get_opnd1(vstr)+\" , \"+\r\n\t\t\t\t\tget_nasm_symbol(*ptfi)+\"\\n\";\r\n\t\t\t}\r\n\t\t\treturn true;\r\n\t\tcase tkey::c_mov1:\r\n\t\t\tresult+=\"\tmov cl , \"+get_opnd2(vstr)+\"\\n\";\r\n\t\t\tresult+=\"\tmov \"+get_opnd1(vstr)+\" , cl\\n\";\r\n\t\t\treturn true;\r\n\t\tcase tkey::c_mov8:\r\n\t\t\treturn false;\r\n\t\tcase tkey::c_add:\r\n\t\t\tif(count_mbk_l(vstr)==2)\r\n\t\t\t{\r\n\t\t\t\tresult+=\"\tmov ecx , \"+get_opnd2(vstr)+\"\\n\";\r\n\t\t\t\tresult+=\"\tadd \"+get_opnd1(vstr)+\" , ecx\\n\";\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\tresult+=\"\tadd dword \"+\r\n\t\t\t\t\tlink_vstr(vstr.sub(1))+\"\\n\";\r\n\t\t\t}\r\n\t\t\treturn true;\r\n\t\tcase tkey::c_sub:\r\n\t\t\tif(count_mbk_l(vstr)==2)\r\n\t\t\t{\r\n\t\t\t\tresult+=\"\tmov ecx , \"+get_opnd2(vstr)+\"\\n\";\r\n\t\t\t\tresult+=\"\tsub \"+get_opnd1(vstr)+\" , ecx\\n\";\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\tresult+=\"\tsub dword \"+link_vstr(vstr.sub(1))+\"\\n\";\r\n\t\t\t}\r\n\t\t\treturn true;\r\n\t\tcase tkey::c_imul:\r\n\t\t\tresult+=\"\tmov ecx , \"+get_opnd1(vstr)+\"\\n\";\r\n\t\t\tresult+=\"\timul ecx , \"+get_opnd2(vstr)+\"\\n\";\r\n\t\t\tresult+=\"\tmov \"+get_opnd1(vstr)+\" , ecx\\n\";\r\n\t\t\treturn true;\r\n\t\tcase tkey::c_idiv:\r\n\t\t\tresult+=\"\tmov eax , \"+get_opnd1(vstr)+\"\\n\";\r\n\t\t\tresult+=\"\tcdq\\n\";\r\n\t\t\tresult+=\"\tmov ecx , \"+get_opnd2(vstr)+\"\\n\";\r\n\t\t\tresult+=\"\tidiv ecx\\n\";\r\n\t\t\tresult+=\"\tmov \"+get_opnd1(vstr)+\" , eax\\n\";\r\n\t\t\treturn true;\r\n\t\tcase tkey::c_imod:\r\n\t\t\tresult+=\"\tmov eax , \"+get_opnd1(vstr)+\"\\n\";\r\n\t\t\tresult+=\"\tcdq\\n\";\r\n\t\t\tresult+=\"\tmov ecx , \"+get_opnd2(vstr)+\"\\n\";\r\n\t\t\tresult+=\"\tidiv ecx\\n\";\r\n\t\t\tresult+=\"\tmov \"+get_opnd1(vstr)+\" , edx\\n\";\r\n\t\t\treturn true;\r\n\t\tcase tkey::c_cesb:\r\n\t\t\trppncmp(\"\tsete bl\\n\");\r\n\t\tcase tkey::c_cnesb:\r\n\t\t\trppncmp(\"\tsetne bl\\n\");\r\n\t\tcase tkey::c_cgsb:\r\n\t\t\trppncmp(\"\tsetg bl\\n\");\r\n\t\tcase tkey::c_cgesb:\r\n\t\t\trppncmp(\"\tsetge bl\\n\");\r\n\t\tcase tkey::c_clsb:\r\n\t\t\trppncmp(\"\tsetl bl\\n\");\r\n\t\tcase tkey::c_clesb:\r\n\t\t\trppncmp(\"\tsetle bl\\n\");\r\n\t\tcase tkey::c_add8:\r\n\t\t\treturn false;\r\n\t\tcase tkey::c_sub8:\r\n\t\t\treturn false;\r\n\t\tcase tkey::c_imul8:\r\n\t\t\treturn false;\r\n\t\tcase tkey::c_idiv8:\r\n\t\t\treturn false;\r\n\t\tcase tkey::c_imod8:\r\n\t\t\treturn false;\r\n\t\tcase tkey::c_cgsb8:\r\n\t\t\treturn false;\r\n\t\tcase tkey::c_clsb8:\r\n\t\t\treturn false;\r\n\t\tcase tkey::c_fadd8:\r\n\t\t\treturn false;\r\n\t\tcase tkey::c_fsub8:\r\n\t\t\treturn false;\r\n\t\tcase tkey::c_fmul8:\r\n\t\t\treturn false;\r\n\t\tcase tkey::c_fdiv8:\r\n\t\t\treturn false;\r\n\t\tcase tkey::c_fcgsb8:\r\n\t\t\treturn false;\r\n\t\tcase tkey::c_fclsb8:\r\n\t\t\treturn false;\r\n\t\tcase tkey::c_band:\r\n\t\t\tif(count_mbk_l(vstr)==2)\r\n\t\t\t{\r\n\t\t\t\tresult+=\"\tmov ecx , \"+get_opnd2(vstr)+\"\\n\";\r\n\t\t\t\tresult+=\"\tand \"+get_opnd1(vstr)+\" , ecx\\n\";\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\tresult+=\"\tand dword \"+link_vstr(vstr.sub(1))+\"\\n\";\r\n\t\t\t}\r\n\t\t\treturn true;\r\n\t\tcase tkey::c_bor:\r\n\t\t\tif(count_mbk_l(vstr)==2)\r\n\t\t\t{\r\n\t\t\t\tresult+=\"\tmov ecx , \"+get_opnd2(vstr)+\"\\n\";\r\n\t\t\t\tresult+=\"\tor \"+get_opnd1(vstr)+\" , ecx\\n\";\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\tresult+=\"\tor dword \"+link_vstr(vstr.sub(1))+\"\\n\";\r\n\t\t\t}\r\n\t\t\treturn true;\r\n\t\tcase tkey::c_bnot:\r\n\t\t\tresult+=\"\tnot dword \"+link_vstr(vstr.sub(1))+\"\\n\";\r\n\t\t\treturn true;\r\n\t\tcase tkey::c_bxor:\r\n\t\t\tif(count_mbk_l(vstr)==2)\r\n\t\t\t{\r\n\t\t\t\tresult+=\"\tmov ecx , \"+get_opnd2(vstr)+\"\\n\";\r\n\t\t\t\tresult+=\"\txor \"+get_opnd1(vstr)+\" , ecx\\n\";\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\tresult+=\"\txor dword \"+link_vstr(vstr.sub(1))+\"\\n\";\r\n\t\t\t}\r\n\t\t\treturn true;\r\n\t\tcase tkey::c_bshl:\r\n\t\t\treturn false;\r\n\t\tcase tkey::c_bshr:\r\n\t\t\treturn false;\r\n\t\tcase tkey::c_bsar:\r\n\t\t\treturn false;\r\n\t\tcase tkey::c_udiv:\r\n\t\t\tresult+=\"\tmov eax , \"+get_opnd1(vstr)+\"\\n\";\r\n\t\t\tresult+=\"\txor edx , edx\\n\";\r\n\t\t\tresult+=\"\tmov ecx , \"+get_opnd2(vstr)+\"\\n\";\r\n\t\t\tresult+=\"\tdiv ecx\\n\";\r\n\t\t\tresult+=\"\tmov \"+get_opnd1(vstr)+\" , eax\\n\";\r\n\t\t\treturn true;\r\n\t\tcase tkey::c_umod:\r\n\t\t\tresult+=\"\tmov eax , \"+get_opnd1(vstr)+\"\\n\";\r\n\t\t\tresult+=\"\txor edx , edx\\n\";\r\n\t\t\tresult+=\"\tmov ecx , \"+get_opnd2(vstr)+\"\\n\";\r\n\t\t\tresult+=\"\tdiv ecx\\n\";\r\n\t\t\tresult+=\"\tmov \"+get_opnd1(vstr)+\" , edx\\n\";\r\n\t\t\treturn true;\r\n\t\tcase tkey::c_ucgsb:\r\n\t\t\trppncmp(\"\tseta bl\\n\");\r\n\t\tcase tkey::c_ucgesb:\r\n\t\t\trppncmp(\"\tsetae bl\\n\");\r\n\t\tcase tkey::c_uclsb:\r\n\t\t\trppncmp(\"\tsetb bl\\n\");\r\n\t\tcase tkey::c_uclesb:\r\n\t\t\trppncmp(\"\tsetbe bl\\n\");\r\n\t\tcase tkey::c_rn:\r\n\t\t\tif(vstr.count()==3&&vstr.top().is_number()&&\r\n\t\t\t\tis_jmp_ins_nasm(vstr[1]))\r\n\t\t\t{\r\n\t\t\t\tresult+=\"\t\"+vstr[1]+\" \"+get_nasm_symbol(tfi)+\"_\"+\r\n\t\t\t\t\tvstr.top()+\"\\n\";\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\tresult+=\"\t\"+link_vstr(vstr.sub(1))+\"\\n\";\r\n\t\t\t}\r\n\t\t\treturn true;\r\n\t\t}\r\n\t\treturn false;\r\n\t}\r\n\r\n\tstatic rstr link_vstr(const rbuf<rstr>& v)\r\n\t{\r\n\t\treturn rstr::join<rstr>(v,\" \");\r\n\t}\r\n\r\n\tstatic rstr get_opnd1(rbuf<rstr>& vstr)\r\n\t{\r\n\t\treturn link_vstr(get_opnd1_v(vstr));\r\n\t}\r\n\r\n\tstatic rbuf<rstr> get_opnd1_v(rbuf<rstr>& vstr)\r\n\t{\r\n\t\tint i;\r\n\t\tint count=0;\r\n\t\tfor(i=1;i<vstr.count();i++)\r\n\t\t{\r\n\t\t\tif(\"(\"==vstr[i])\r\n\t\t\t{\r\n\t\t\t\tcount++;\r\n\t\t\t}\r\n\t\t\telif(\")\"==vstr[i])\r\n\t\t\t{\r\n\t\t\t\tcount--;\r\n\t\t\t}\r\n\t\t\telif(count==0&&vstr[i]==\",\")\r\n\t\t\t\tbreak;\r\n\t\t}\r\n\t\treturn vstr.sub(1,i);\r\n\t}\r\n\r\n\tstatic rstr get_opnd2(rbuf<rstr>& vstr)\r\n\t{\r\n\t\treturn link_vstr(get_opnd2_v(vstr));\r\n\t}\r\n\r\n\tstatic rbuf<rstr> get_opnd2_v(rbuf<rstr>& vstr)\r\n\t{\r\n\t\tint i;\r\n\t\tint count=0;\r\n\t\tfor(i=1;i<vstr.count();i++)\r\n\t\t{\r\n\t\t\tif(\"(\"==vstr[i])\r\n\t\t\t{\r\n\t\t\t\tcount++;\r\n\t\t\t}\r\n\t\t\telif(\")\"==vstr[i])\r\n\t\t\t{\r\n\t\t\t\tcount--;\r\n\t\t\t}\r\n\t\t\telif(count==0&&vstr[i]==\",\")\r\n\t\t\t\tbreak;\r\n\t\t}\r\n\t\treturn vstr.sub(i+1);\r\n\t}\r\n\r\n\tstatic int count_mbk_l(rbuf<rstr>& vstr)\r\n\t{\r\n\t\tint sum=0;\r\n\t\tfor(int i=0;i<vstr.count();i++)\r\n\t\t{\r\n\t\t\tif(vstr[i]==\"[\")\r\n\t\t\t{\r\n\t\t\t\tsum++;\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn sum;\r\n\t}\r\n};\r\n\r\n#endif\r\n"
  },
  {
    "path": "rpp/zopt.h",
    "content": "﻿#ifndef zopt_h__\r\n#define zopt_h__\r\n\r\n#include \"zsent.h\"\r\n\r\n//优化类\r\nstruct zopt\r\n{\r\n\tstatic rbool is_add_sub(tsh& sh,rstr& s)\r\n\t{\r\n\t\treturn s==rppkey(c_add)||s==rppkey(c_sub);\r\n\t}\r\n\r\n\tstatic rbool is_add_sub(tsh& sh,rbuf<rstr>& v)\r\n\t{\r\n\t\treturn v.count()==4&&is_add_sub(sh,v[0])&&\r\n\t\t\tv[2]==rppoptr(c_comma)&&v[3].is_number();\r\n\t}\r\n\r\n\tstatic rbool op_add_sub(tsh& sh,rbuf<tasm>& vasm)\r\n\t{\r\n\t\trbuf<tasm> result;\r\n\t\tfor(int i=0;i<vasm.count();i++)\r\n\t\t{\r\n\t\t\tif(is_add_sub(sh,vasm[i].vstr))\r\n\t\t\t{\r\n\t\t\t\tint j;\r\n\t\t\t\tfor(j=i+1;j<vasm.count();j++)\r\n\t\t\t\t{\r\n\t\t\t\t\tif(!is_add_sub(sh,vasm[j].vstr))\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tif(vasm[j].vstr.get(1)!=vasm[i].vstr.get(1))\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t\tint val=0;\r\n\t\t\t\tfor(int k=i;k<j;k++)\r\n\t\t\t\t{\r\n\t\t\t\t\tif(vasm[k].vstr.get(0)==rppkey(c_add))\r\n\t\t\t\t\t\tval+=vasm[k].vstr.get(3).toint();\r\n\t\t\t\t\telse\r\n\t\t\t\t\t\tval-=vasm[k].vstr.get(3).toint();\r\n\t\t\t\t}\r\n\t\t\t\tif(val<0)\r\n\t\t\t\t{\r\n\t\t\t\t\tval=-val;\r\n\t\t\t\t\tvasm[i].vstr[0]=rppkey(c_sub);\r\n\t\t\t\t}\r\n\t\t\t\telse\r\n\t\t\t\t{\r\n\t\t\t\t\tvasm[i].vstr[0]=rppkey(c_add);\r\n\t\t\t\t}\r\n\t\t\t\tvasm[i].vstr[3]=rstr(val);\r\n\t\t\t\tif(val!=0)\r\n\t\t\t\t\tresult.push(vasm[i]);\r\n\t\t\t\ti=j-1;\r\n\t\t\t}\r\n\t\t\telif(rppconf(c_op_nop)&&vasm[i].vstr.count()==1&&\r\n\t\t\t\tvasm[i].vstr[0]==rppkey(c_nop))\r\n\t\t\t{\r\n\t\t\t\t;\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\tresult.push(vasm[i]);\r\n\t\t\t}\r\n\t\t}\r\n\t\tvasm=r_move(result);\r\n\t\treturn true;\r\n\t}\r\n\r\n\tstatic rbool match(rbuf<rstr>& item,rbuf<rstr>& pick)\r\n\t{\r\n\t\tif(item.count()!=pick.count())\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\tfor(int i=0;i<item.count();i++)\r\n\t\t{\r\n\t\t\tif(pick[i]==\"@@\")\r\n\t\t\t{\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\t\t\tif(pick[i]==\"@n\"&&item[i].is_number())\r\n\t\t\t{\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\t\t\tif(pick[i]!=item[i])\r\n\t\t\t{\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn true;\r\n\t}\r\n\r\n\tstatic rbool match(tasm& item,tasm& pick)\r\n\t{\r\n\t\treturn match(item.vstr,pick.vstr);\r\n\t}\r\n\r\n\tstatic rbool replace(const rbuf<tasm>& item,rbuf<tasm>& pick,rbuf<tasm>& dst)\r\n\t{\r\n\t\trbuf<rstr> temp;\r\n\t\tfor(int i=0;i<pick.count();i++)\r\n\t\t{\r\n\t\t\tfor(int j=0;j<pick[i].vstr.count();j++)\r\n\t\t\t{\r\n\t\t\t\tif(pick[i].vstr[j].get(0)=='@')\r\n\t\t\t\t{\r\n\t\t\t\t\ttemp.push(item[i].vstr[j]);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\tfor(int i=0;i<dst.count();i++)\r\n\t\t{\r\n\t\t\tfor(int j=0;j<dst[i].vstr.count();j++)\r\n\t\t\t{\r\n\t\t\t\t//@后面的数字暂时只能是1位数\r\n\t\t\t\tif(dst[i].vstr[j].get(0)=='@')\r\n\t\t\t\t{\r\n\t\t\t\t\tint num=dst[i].vstr[j].sub(1).toint();\r\n\t\t\t\t\tif(num>=temp.count())\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\treturn false;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tdst[i].vstr[j]=temp[num];\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn true;\r\n\t}\r\n\r\n\tstatic rbool op_match(tsh& sh,rbuf<tasm>& vasm)\r\n\t{\r\n\t\trbuf<tasm> result;\r\n\t\tfor(int i=0;i<vasm.count();i++)\r\n\t\t{\r\n\t\t\tint j;\r\n\t\t\tfor(j=0;j<sh.m_match.count();j++)\r\n\t\t\t{\r\n\t\t\t\tint len=sh.m_match[j].src.count();\r\n\t\t\t\tif(i+len>vasm.count())\r\n\t\t\t\t{\r\n\t\t\t\t\tcontinue;\r\n\t\t\t\t}\r\n\t\t\t\tint k;\r\n\t\t\t\tfor(k=i;k<i+len;k++)\r\n\t\t\t\t{\r\n\t\t\t\t\tifn(match(vasm[k],sh.m_match[j].src[k-i]))\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tif(k<i+len)\r\n\t\t\t\t{\r\n\t\t\t\t\tcontinue;\r\n\t\t\t\t}\r\n\t\t\t\trbuf<tasm> temp=sh.m_match[j].dst;\r\n\t\t\t\tifn(replace(vasm.sub(i,i+len),sh.m_match[j].src,temp))\r\n\t\t\t\t{\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t}\r\n\t\t\t\tresult+=r_move(temp);\r\n\t\t\t\ti=i+len-1;\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t\tif(j>=sh.m_match.count())\r\n\t\t\t{\r\n\t\t\t\tresult+=vasm[i];\r\n\t\t\t}\r\n\t\t}\r\n\t\tvasm=r_move(result);\r\n\t\treturn true;\r\n\t}\r\n};\r\n\r\n#endif\r\n"
  },
  {
    "path": "rpp/zpre.h",
    "content": "﻿#ifndef zpre_h__\r\n#define zpre_h__\r\n\r\n#include \"tsh.h\"\r\n#include \"../rlib/ralgo.h\"\r\n#include \"zread.h\"\r\n#include \"zfind.h\"\r\n\r\n//词法分析、预处理、获取所有文件\r\n//词表->m_file.vword\r\nstruct zpre\r\n{\r\n\tstatic rbool process(tsh& sh)\r\n\t{\r\n\t\tif(sh.m_mode==tsh::c_jit)\r\n\t\t{\r\n\t\t\tsh.m_vdefine.insert_c(tmac(rstr(\"_JIT\")));\r\n\t\t}\r\n\t\telif(sh.m_mode==tsh::c_rvm)\r\n\t\t{\r\n\t\t\tsh.m_vdefine.insert_c(tmac(rppkey(c_rvm)));\r\n\t\t}\r\n\t\telif(sh.m_mode==tsh::c_win)\r\n\t\t{\r\n\t\t\tsh.m_vdefine.insert_c(tmac(rstr(\"_WIN\")));\r\n\t\t}\r\n\t\telif(sh.m_mode==tsh::c_grub)\r\n\t\t{\r\n\t\t\tsh.m_vdefine.insert_c(tmac(rstr(\"_GRUB\")));\r\n\t\t}\r\n#ifdef _MSC_VER\r\n\t\tsh.m_vdefine.insert_c(tmac(rstr(\"_WIN32\")));\r\n#endif\r\n\t\tif(!obtain_all_file(sh))\r\n\t\t\treturn false;\r\n\t\tfor(tfile* p=sh.m_file.begin();p!=sh.m_file.end();p=sh.m_file.next(p))\r\n\t\t\tif(!obtain_def(sh,sh.m_vdefine,p->vword))\r\n\t\t\t\treturn false;\r\n\t\tfor(tfile* p=sh.m_file.begin();p!=sh.m_file.end();p=sh.m_file.next(p))\r\n\t\t\tif(!ifdef_replace(sh,sh.m_vdefine,p->vword))\r\n\t\t\t\treturn false;\r\n\t\tfor(tfile* p=sh.m_file.begin();p!=sh.m_file.end();p=sh.m_file.next(p))\r\n\t\t{\r\n\t\t\tifn(def_replace(sh,sh.m_vdefine,p->vword))\r\n\t\t\t{\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn true;\r\n\t}\r\n\r\n\tstatic rbool str_analyse(tsh& sh,rstr& src,rbuf<tword>& dst,tfile* pfile)\r\n\t{\r\n\t\tif(!zread::word_analyse(sh,src,dst,pfile))\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\tconst_replace(dst);\r\n\t\tcombine_double(dst);\r\n\t\tcombine_float(dst);\r\n\t\tkey_replace(sh,dst);\r\n\t\treturn true;\r\n\t}\r\n\r\n\tstatic rbool obtain_all_file(tsh& sh)\r\n\t{\r\n\t\twhile(true)\r\n\t\t{\r\n\t\t\tint cur=sh.m_file.count();\r\n\t\t\trbuf<rstrw> vname;\r\n\t\t\tfor(tfile* p=sh.m_file.begin();\r\n\t\t\t\tp!=sh.m_file.end();p=sh.m_file.next(p))\r\n\t\t\t{\r\n\t\t\t\tcount_tab(*p);\r\n\t\t\t\tif(!str_analyse(sh,p->cont,p->vword,p))\r\n\t\t\t\t{\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t}\r\n\t\t\t\t//仅编译器内部使用\r\n\t\t\t\tifn(ifdef_replace(sh,sh.m_vdefine,p->vword))\r\n\t\t\t\t{\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t}\r\n\t\t\t\tif(!obtain_name(sh,vname,p->vword,*p))\r\n\t\t\t\t{\r\n\t\t\t\t\tsh.error(rstr(\"obtain error \")+\r\n\t\t\t\t\t\tsh.get_file_name(p));\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tif(!sh.m_is_pack_read)\r\n\t\t\t{\r\n\t\t\t\tif(!import_file(sh,vname))\r\n\t\t\t\t{\r\n\t\t\t\t\tsh.error(\"import error\");\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tif(cur==sh.m_file.count())\r\n\t\t\t\treturn true;\r\n\t\t}\r\n\t}\r\n\r\n\tstatic rbool import_file(tsh& sh,rbuf<rstrw>& vname)\r\n\t{\r\n\t\tfor(int i=0;i<vname.count();i++)\r\n\t\t\tif(!zread::read_file(sh,vname[i]))\r\n\t\t\t{\r\n\t\t\t\tsh.error(\"can't read file \"+vname[i].torstr());\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\treturn true;\r\n\t}\r\n\r\n\tstatic rbool obtain_name(tsh& sh,rbuf<rstrw>& vname,rbuf<tword>& v,tfile& f)\r\n\t{\r\n\t\trstrw exe_dir=rdir::get_exe_dir();\r\n\t\tfor(int i=0;i<v.count();i++)\r\n\t\t{\r\n\t\t\tif(v[i].val!=rppkey(c_import))\r\n\t\t\t{\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\t\t\tif(v.get(i-1).val==rppoptr(c_pre))\r\n\t\t\t\tv[i-1].clear();\r\n\t\t\tv[i].val.clear();\r\n\t\t\trstrw name;\r\n\t\t\tif(v.get(i+1).is_cstr())\r\n\t\t\t{\r\n\t\t\t\tname=v.get(i+1).val;\r\n\t\t\t\tv[i+1].clear();\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\t//处理不带引号的import\r\n\t\t\t\tint j;\r\n\t\t\t\tfor(j=i+1;j<v.count();j++)\r\n\t\t\t\t{\r\n\t\t\t\t\tif(v[j].pos.line!=v[i].pos.line)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tname+=rstrw(v[j].val);\r\n\t\t\t\t\tv[j].val.clear();\r\n\t\t\t\t}\r\n\t\t\t\tname=rstrw(zsuper::add_quote(name.torstr()));\r\n\t\t\t}\r\n\t\t\tif(name.count()<3)\r\n\t\t\t\treturn false;\r\n\t\t\tif(sh.m_is_pack_read)\r\n\t\t\t{\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\t\t\tname.pop();\r\n\t\t\tname.pop_front();\r\n\t\t\tname=rdir::dir_std(name);\r\n\t\t\trstrw temp=get_abs_name(rdir::get_prev_dir(f.name),name);\r\n\t\t\tif(vname.exist(temp))\r\n\t\t\t\tcontinue;\r\n\t\t\tif(zread::exist(sh,temp))\r\n\t\t\t\tcontinue;\r\n\t\t\tif(!zread::file_exist(temp))\r\n\t\t\t{\r\n\t\t\t\trstrw dir;\r\n\t\t\t\tif(rdir::get_suffix(name)==rstrw(\"rp\"))\r\n\t\t\t\t\tdir=rstrw(\"rp/\");\r\n\t\t\t\telse\r\n\t\t\t\t\tdir=rstrw(\"rsrc/\");\r\n\t\t\t\ttemp=get_abs_name(exe_dir+dir,name);\r\n\t\t\t}\r\n\t\t\tif(vname.exist(temp))\r\n\t\t\t\tcontinue;\r\n\t\t\tif(zread::exist(sh,temp))\r\n\t\t\t\tcontinue;\r\n\t\t\tif(!zread::file_exist(temp))\r\n\t\t\t\treturn false;\r\n\t\t\tvname.push(temp);\r\n\t\t}\r\n\t\tarrange(v);\r\n\t\treturn true;\r\n\t}\r\n\r\n\tstatic rstrw get_abs_name(rstrw path,const rstrw& name)\r\n\t{\r\n\t\tif(path.empty())\r\n\t\t\treturn rstrw();\r\n\t\trbuf<rstrw> temp=r_split(name,rstrw(\"/\"));\r\n\t\tif(temp.empty())\r\n\t\t\treturn rstrw();\r\n\t\tfor(int i=0;i<temp.count();i++)\r\n\t\t{\r\n\t\t\tif(temp[i]==rstrw(\"..\"))\r\n\t\t\t\tpath=rdir::get_prev_dir(path);\r\n\t\t\telif(temp[i]==rstrw(\".\"))\r\n\t\t\t\t;\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\tpath+=temp[i];\r\n\t\t\t\tif(i!=temp.count()-1)\r\n\t\t\t\t\tpath+=rstrw(\"/\");\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn r_move(path);\r\n\t}\r\n\r\n\tstatic rstrw get_abs_path(const rstrw& s)\r\n\t{\r\n\t\tif(s.sub(0,2)==rstrw(\"//\")||s.sub(1,3)==rstrw(\":/\"))\r\n\t\t{\r\n\t\t\treturn s;\r\n\t\t}\r\n\t\treturn get_abs_name(rdir::get_cur_dir(),s);\r\n\t}\r\n\r\n\tstatic void key_replace(tsh& sh,rbuf<tword>& v)\r\n\t{\r\n\t\tfor(int i=0;i<v.count();i++)\r\n\t\t{\r\n\t\t\tif(v[i].val==rppkey(c_include))\r\n\t\t\t\tv[i].val=rppkey(c_import);\r\n\t\t\t//这里不能用超级宏实现，因为有带冒号和不带冒号两种\r\n\t\t\tif(v[i].val==rppkey(c_private))\r\n\t\t\t{\r\n\t\t\t\tv[i].clear();\r\n\t\t\t\tif(rppoptr(c_colon)==v.get(i+1).val)\r\n\t\t\t\t\tv[i+1].clear();\r\n\t\t\t}\r\n\t\t\tif(v[i].val==rppkey(c_public))\r\n\t\t\t{\r\n\t\t\t\tv[i].clear();\r\n\t\t\t\tif(rppoptr(c_colon)==v.get(i+1).val)\r\n\t\t\t\t\tv[i+1].clear();\r\n\t\t\t}\r\n\t\t\tif(v[i].val==rppkey(c_protected))\r\n\t\t\t{\r\n\t\t\t\tv[i].clear();\r\n\t\t\t\tif(rppoptr(c_colon)==v.get(i+1).val)\r\n\t\t\t\t\tv[i+1].clear();\r\n\t\t\t}\r\n\t\t}\r\n\t\tarrange(v);\r\n\t}\r\n\r\n\tstatic rbool def_replace_one(tsh& sh,rbuf<tword>& v,rset<tmac>& vmac)\r\n\t{\r\n\t\ttmac item;\r\n\t\tfor(int i=0;i<v.count();i++)\r\n\t\t{\r\n\t\t\titem.name=v[i].val;\r\n\t\t\ttmac* p=vmac.find(item);\r\n\t\t\tif(p==null)\r\n\t\t\t{\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\t\t\tif(p->is_super)\r\n\t\t\t{\r\n\t\t\t\tifn(zsuper::replace_item(sh,v,i,*p))\r\n\t\t\t\t{\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\tv[i].val.clear();\r\n\t\t\t\tv[i].multi=p->vstr;\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn true;\r\n\t}\r\n\r\n\tstatic rbool def_replace(tsh& sh,rset<tmac>& vdefine,rbuf<tword>& v)\r\n\t{\r\n\t\tfor(int i=0;i<c_rpp_deep;i++)\r\n\t\t{\r\n\t\t\tifn(def_replace_one(sh,v,vdefine))\r\n\t\t\t{\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\trbool need;\r\n\t\t\tarrange(v,&need);\r\n\t\t\tifn(need)\r\n\t\t\t{\r\n\t\t\t\treturn true;\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn false;\r\n\t}\r\n\r\n\tstatic rbool need_arrange(rbuf<tword>& v)\r\n\t{\r\n\t\tfor(int i=0;i<v.count();i++)\r\n\t\t{\r\n\t\t\tif(v[i].empty())\r\n\t\t\t\treturn true;\r\n\t\t\telif(v[i].is_multi())\r\n\t\t\t\treturn true;\r\n\t\t}\r\n\t\treturn false;\r\n\t}\r\n\r\n\tstatic void arrange(rbuf<tword>& src,rbool* pneed=null)\r\n\t{\r\n\t\tif(!need_arrange(src))\r\n\t\t{\r\n\t\t\tif(pneed!=null)\r\n\t\t\t\t*pneed=false;\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tif(pneed!=null)\r\n\t\t\t*pneed=true;\r\n\t\trbuf<tword> wlist(src.count()*2);\r\n\t\twlist.m_count=0;\r\n\t\tfor(int i=0;i<src.count();i++)\r\n\t\t{\r\n\t\t\tif(src[i].empty())\r\n\t\t\t\tcontinue;\r\n\t\t\telif(src[i].is_multi())\r\n\t\t\t{\r\n\t\t\t\tfor(int j=0;j<src[i].multi.count();++j)\r\n\t\t\t\t{\r\n\t\t\t\t\ttword word;\r\n\t\t\t\t\tword.val=r_move(src[i].multi[j]);\r\n\t\t\t\t\tword.pos_src=src[i].pos_src;\r\n\t\t\t\t\tword.pos=src[i].pos;\r\n\t\t\t\t\twlist.push_move(word);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\twlist.push_move(src[i]);\r\n\t\t\t}\r\n\t\t}\r\n\t\tsrc=r_move(wlist);\r\n\t}\r\n\r\n\tstatic rbool obtain_def(tsh& sh,rset<tmac>& vdefine,rbuf<tword>& v)\r\n\t{\r\n\t\tfor(int i=0;i<v.count();i++)\r\n\t\t{\r\n\t\t\tif(v[i].val!=rppkey(c_define))\r\n\t\t\t{\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\t\t\tif(v.get(i-1).val==rppoptr(c_pre))\r\n\t\t\t\tv[i-1].clear();\r\n\t\t\tif(v.get(i+1)==\"$\")\r\n\t\t\t{\r\n\t\t\t\tint right=i;\r\n\t\t\t\tifn(zsuper::add_super_mac(sh,v,right,vdefine))\r\n\t\t\t\t{\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t}\r\n\t\t\t\tsh.clear_word_val(v,i,right+1);\r\n\t\t\t\ti=right;\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\t\t\ttmac item;\r\n\t\t\titem.name=v.get(i+1).val;\r\n\t\t\tif(item.name.empty())\r\n\t\t\t{\r\n\t\t\t\tsh.error(v[i]);\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\tfor(int k=i+2;k<v.count()&&v.get(k).pos==v[i].pos;k++)\r\n\t\t\t{\r\n\t\t\t\titem.vstr.push(v[k].val);\r\n\t\t\t\tv[k].clear();\r\n\t\t\t}\r\n\t\t\tif(vdefine.exist(item))\r\n\t\t\t{\r\n\t\t\t\tvdefine.erase(item);\r\n\t\t\t\t/*sh.error(v.get(i+1),\"redefined\");\r\n\t\t\t\treturn false;*/\r\n\t\t\t}\r\n\t\t\tvdefine.insert(item);\r\n\t\t\tv[i+1].clear();\r\n\t\t\tv[i].clear();\r\n\t\t}\r\n\t\tarrange(v);\r\n\t\treturn true;\r\n\t}\r\n\r\n\tstatic rbool ifdef_replace(tsh& sh,rset<tmac>& vdefine,rbuf<tword>& v)\r\n\t{\r\n\t\ttmac item;\r\n\t\tfor(int i=v.count()-1;i>=0;i--)\r\n\t\t{\r\n\t\t\tif(v[i]!=rppoptr(c_pre))\r\n\t\t\t{\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\t\t\trstr key=v.get(i+1).val;\r\n\t\t\tif(key!=rppkey(c_ifdef)&&\r\n\t\t\t\tkey!=rppkey(c_ifndef))\r\n\t\t\t\tcontinue;\r\n\t\t\tif(i+2>=v.count())\r\n\t\t\t{\r\n\t\t\t\tsh.error(v[i],\"ifdef\");\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\titem.name=v[i+2].val;\r\n\t\t\tint endpos=r_find_pos(v,tword(rppkey(c_endif)),i+3);\r\n\t\t\tif(endpos>=v.count())\r\n\t\t\t{\r\n\t\t\t\tsh.error(v[i],\"ifdef\");\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\tint elsepos=endpos;\r\n\t\t\tfor(int j=i+3;j<endpos;j++)\r\n\t\t\t\tif(v[j]==rppoptr(c_pre)&&\r\n\t\t\t\t\tv.get(j+1)==rppkey(c_else))\r\n\t\t\t\t{\r\n\t\t\t\t\telsepos=j+1;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\trbool defined=vdefine.exist(item);\r\n\t\t\tif(key==rppkey(c_ifdef))\r\n\t\t\t{\r\n\t\t\t\tif(defined)\r\n\t\t\t\t\tsh.clear_word_val(v,elsepos,endpos);\r\n\t\t\t\telse\r\n\t\t\t\t\tsh.clear_word_val(v,i,elsepos);\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\tif(!defined)\r\n\t\t\t\t\tsh.clear_word_val(v,elsepos,endpos);\r\n\t\t\t\telse\r\n\t\t\t\t\tsh.clear_word_val(v,i,elsepos);\r\n\t\t\t}\r\n\t\t\tv[i].clear();\r\n\t\t\tv[i+1].clear();\r\n\t\t\tv[i+2].clear();\r\n\t\t\tv[endpos-1].clear();\r\n\t\t\tv[endpos].clear();\r\n\t\t\tv[elsepos-1].clear();\r\n\t\t\tv[elsepos].clear();\r\n\t\t}\r\n\t\tarrange(v);\r\n\t\treturn true;\r\n\t}\r\n\r\n\tstatic void combine_double(rbuf<tword>& v)\r\n\t{\r\n\t\tfor(int i=1;i<v.count()-1;i++)\r\n\t\t{\r\n\t\t\tif(v[i]==\".\"&&\r\n\t\t\t\tv[i-1].val.is_number()&&\r\n\t\t\t\tv[i+1].val.is_number())\r\n\t\t\t{\r\n\t\t\t\tv[i-1].val+=v[i].val;\r\n\t\t\t\tv[i-1].val+=v[i+1].val;\r\n\t\t\t\tv[i].clear();\r\n\t\t\t\tv[i+1].clear();\r\n\t\t\t\ti++;\r\n\t\t\t}\r\n\t\t}\r\n\t\tarrange(v);\r\n\t}\r\n\r\n\tstatic void combine_float(rbuf<tword>& v)\r\n\t{\r\n\t\tfor(int i=0;i<v.count();i++)\r\n\t\t{\r\n\t\t\tifn(v[i]==\".\"&&v.get(i-1).val.is_number())\r\n\t\t\t\tcontinue;\r\n\t\t\trstr s=v.get(i+1).val;\r\n\t\t\tif(s.get_top()!='f')\r\n\t\t\t{\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\t\t\tifn(s.sub(0,s.count()-1).is_number())\r\n\t\t\t{\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\t\t\tv[i].multi+=\"double\";\r\n\t\t\tv[i].multi+=\"(\";\r\n\t\t\tv[i].multi+=v[i-1].val+\".\"+s.sub(0,s.count()-1);\r\n\t\t\tv[i].multi+=\")\";\r\n\t\t\tv[i].multi+=\".\";\r\n\t\t\tv[i].multi+=\"tofloat\";\r\n\t\t\tv[i].val.clear();\r\n\t\t\tv[i+1].val.clear();\r\n\t\t\tv[i-1].val.clear();\r\n\t\t}\r\n\t\tarrange(v);\r\n\t}\r\n\r\n\tstatic void const_replace(rbuf<tword>& v)\r\n\t{\r\n\t\tfor(int i=0;i<v.count();i++)\r\n\t\t{\r\n\t\t\tconst_replace(v[i]);\r\n\t\t}\r\n\t}\r\n\r\n\tstatic void const_replace(tword& word)\r\n\t{\r\n\t\tif(word.val.count()>0&&rstr::is_number(word.val[0]))\r\n\t\t{\r\n\t\t\tif(r_find_pos<rstr,uchar>(word.val,'_')<word.val.count())\r\n\t\t\t{\r\n\t\t\t\trstr s;\r\n\t\t\t\tfor(int i=0;i<word.val.count();i++)\r\n\t\t\t\t\tif(word.val[i]!='_')\r\n\t\t\t\t\t\ts+=word.val[i];\r\n\t\t\t\tword.val=r_move(s);\r\n\t\t\t}\r\n\t\t}\r\n\t\tif(word.val.count()>2)\r\n\t\t{\r\n\t\t\tif(word.val[0]=='0'&&word.val[1]=='x')\r\n\t\t\t{\r\n\t\t\t\tword.val=rstr::hextodec(word.val.sub(2));\r\n\t\t\t}\r\n\t\t\tif(word.val[0]=='0'&&word.val[1]=='b')\r\n\t\t\t{\r\n\t\t\t\tword.val=rstr::bintodec(word.val.sub(2));\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tstatic int count_tab_line(rstr& s)\r\n\t{\r\n\t\tint i;\r\n\t\tfor(i=0;i<s.count();i++)\r\n\t\t{\r\n\t\t\tif(s[i]!=' '&&s[i]!=0x9)\r\n\t\t\t\tbreak;\r\n\t\t}\r\n\t\tint sum=0;\r\n\t\tfor(int k=0;k<i;k++)\r\n\t\t{\r\n\t\t\tif(s[k]==' ')\r\n\t\t\t{\r\n\t\t\t\tsum++;\r\n\t\t\t}\r\n\t\t\telif(s[k]==0x9)\r\n\t\t\t{\r\n\t\t\t\tsum+=4;\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn sum/4;\r\n\t}\r\n\r\n\tstatic void count_tab(tfile& file)\r\n\t{\r\n\t\tfile.line_list=r_split_e(file.cont,rstr(\"\\n\"));\r\n\t\tfile.line_list.push_front(rstr());//行号从1开始\r\n\t\tfor(int i=0;i<file.line_list.count();i++)\r\n\t\t{\r\n\t\t\tfile.tab_list.push(count_tab_line(file.line_list[i]));\r\n\t\t}\r\n\t}\r\n\r\n\tstatic rbool op_const_eval(tsh& sh,rbuf<tword>& v,rbool clear_sbk)\r\n\t{\r\n\t\tif(!rppconf(c_op_const_eval))\r\n\t\t\treturn true;\r\n\t\tfor(int i=0;i<v.count();i++)\r\n\t\t{\r\n\t\t\tif(v[i].val!=rppoptr(c_sbk_l))\r\n\t\t\t\tcontinue;\r\n\t\t\tint right=sh.find_symm_sbk(v,i);\r\n\t\t\tif(right>=v.count())\r\n\t\t\t\tcontinue;\r\n\t\t\tint pos=i+1;\r\n\t\t\tif(pos+1>=right)\r\n\t\t\t\tcontinue;\r\n\t\t\tif(!zread::is_const_str(sh,v,pos,right))\r\n\t\t\t\tcontinue;\r\n\t\t\tint dst;\r\n\t\t\tif(!zread::const_eval(sh,\r\n\t\t\t\tsh.vword_to_vstr(v.sub(pos,right)),dst))\r\n\t\t\t{\r\n\t\t\t\tsh.error(v[i],\"const_eval\");\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\tv[pos].val=rstr((uint)dst);\r\n\t\t\tsh.clear_word_val(v,pos+1,right);\r\n\t\t\tif(clear_sbk)\r\n\t\t\t{\r\n\t\t\t\tv[i].val.clear();\r\n\t\t\t\tv[right].val.clear();\r\n\t\t\t}\r\n\t\t}\r\n\t\tarrange(v);\r\n\t\treturn true;\r\n\t}\r\n};\r\n\r\n#endif"
  },
  {
    "path": "rpp/zread.h",
    "content": "﻿#ifndef zread_h__\r\n#define zread_h__\r\n\r\n#include \"tsh.h\"\r\n#include \"zsuper.h\"\r\n#include \"../rlib/rdir.h\"\r\n\r\n//读取基本配置信息和主文件  \r\nstruct zread\r\n{\r\n\tstatic rbool process(tsh& sh)\r\n\t{\r\n\t\tif(!read_inf(sh))\r\n\t\t\treturn false;\r\n\t\tif(sh.m_is_pack_read)\r\n\t\t{\r\n\t\t\tfor(int i=0;i<sh.m_db.count()-4*2;i+=2)\r\n\t\t\t{\r\n\t\t\t\tifn(read_file_pack(sh,sh.m_db[i]))\r\n\t\t\t\t{\r\n\t\t\t\t\tsh.error(\"can't read file\");\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tauto_import(sh);\r\n\t\t\tif(!read_file(sh,sh.m_main_file))\r\n\t\t\t{\r\n\t\t\t\tsh.error(\"can't read main file \"+\r\n\t\t\t\t\tsh.m_main_file.torstr());\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn true;\r\n\t}\r\n\r\n\tstatic rbool auto_import(tsh& sh)\r\n\t{\r\n\t\tifn(rppconf(c_auto_import))\r\n\t\t\treturn true;\r\n\t\tif(sh.m_is_pre_mode)\r\n\t\t{\r\n\t\t\treturn true;\r\n\t\t}\r\n\t\tif(!read_file(sh,rdir::get_exe_dir()+rstrw(\"rsrc/basic.h\")))\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\treturn true;\r\n\t}\r\n\r\n\tstatic rstrw get_inf_dir(tsh& sh)\r\n\t{\r\n\t\tif(sh.m_is_pack_read||sh.m_is_pack_mode)\r\n\t\t{\r\n\t\t\treturn rstrw();\r\n\t\t}\r\n\t\treturn rdir::get_exe_dir();\r\n\t}\r\n\r\n\tstatic rbool read_inf(tsh& sh)\r\n\t{\r\n\t\tif(!read_optr(sh,get_inf_dir(sh)+rstrw(\"rinf/optr.txt\")))\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\tsh.m_optr.sort_optr();\r\n\t\tif(!read_key(sh,get_inf_dir(sh)+rstrw(\"rinf/key.txt\")))\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\tsh.m_key.sort_asm();\r\n\t\tif(!read_conf(sh,get_inf_dir(sh)+rstrw(\"rinf/conf.txt\")))\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\tif(!read_match(sh,get_inf_dir(sh)+rstrw(\"rinf/match.txt\")))\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\treturn true;\r\n\t}\r\n\r\n\tstatic rbuf<tasm> get_op_vasm(tsh& sh,const rbuf<rstr>& v)\r\n\t{\r\n\t\trbuf<tasm> result;\r\n\t\ttasm item;\r\n\t\trbuf<tword> vword;\r\n\t\trbuf<rstr>& vstr=item.vstr;\r\n\t\tfor(int i=0;i<v.count();i++)\r\n\t\t{\r\n\t\t\tifn(word_analyse(sh,v[i],vword,null))\r\n\t\t\t{\r\n\t\t\t\tresult.clear();\r\n\t\t\t\treturn result;\r\n\t\t\t}\r\n\t\t\tvstr=sh.vword_to_vstr(vword);\r\n\t\t\tfor(int j=0;j<vstr.count();j++)\r\n\t\t\t{\r\n\t\t\t\tif(j+1<vstr.count()&&vstr[j]==\"@\")\r\n\t\t\t\t{\r\n\t\t\t\t\tvstr[j]+=vstr[j+1];\r\n\t\t\t\t\tvstr.erase(j+1);\r\n\t\t\t\t}\r\n\t\t\t\telif(vstr[j].get_bottom()=='\\\"')\r\n\t\t\t\t{\r\n\t\t\t\t\tvstr[j]=zsuper::del_quote(vstr[j]);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tresult.push(item);\r\n\t\t}\r\n\t\treturn r_move(result);\r\n\t}\r\n\r\n\tstatic rbool read_match(tsh& sh,const rstrw& name)\r\n\t{\r\n\t\tif(!rppconf(c_op_match))\r\n\t\t{\r\n\t\t\treturn true;\r\n\t\t}\r\n\t\trstr data=get_file_data(sh,name);\r\n\t\tif(data.empty())\r\n\t\t{\r\n\t\t\tsh.error(\"can't read match file \"+name.torstr());\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\trbuf<rstr> vstr=r_split_e(data,rstr(\"\\r\\n\"));\r\n\t\ttop_node item;\r\n\t\tint start=0;\r\n\t\tfor(int i=0;i<vstr.count();i++)\r\n\t\t{\r\n\t\t\tif(vstr[i].empty())\r\n\t\t\t{\r\n\t\t\t\tif(item.src.empty())\r\n\t\t\t\t{\r\n\t\t\t\t\titem.src=get_op_vasm(sh,vstr.sub(start,i));\r\n\t\t\t\t}\r\n\t\t\t\telif(item.dst.empty())\r\n\t\t\t\t{\r\n\t\t\t\t\titem.dst=get_op_vasm(sh,vstr.sub(start,i));\r\n\t\t\t\t\tsh.m_match.push(item);\r\n\t\t\t\t\titem.clear();\r\n\t\t\t\t}\r\n\t\t\t\tstart=i+1;\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn true;\r\n\t}\r\n\r\n\tstatic rbool read_conf(tsh& sh,const rstrw& name)\r\n\t{\r\n\t\trstr data=get_file_data(sh,name);\r\n\t\tif(data.empty())\r\n\t\t{\r\n\t\t\tsh.error(\"can't read conf file \"+name.torstr());\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\trbuf<rstr> vstr=r_split(data,rstr(\"\\r\\n\"));\r\n\t\tfor(int i=0;i<vstr.count();i++)\r\n\t\t{\r\n\t\t\tif(i%2==0)\r\n\t\t\t\tcontinue;\r\n\t\t\tuint udst;\r\n\t\t\tif(i/2==tconf::c_stack_size)\r\n\t\t\t{\r\n\t\t\t\trbuf<tword> vword;\r\n\t\t\t\tifn(word_analyse(sh,vstr[i],vword,null))\r\n\t\t\t\t{\r\n\t\t\t\t\tsh.error(\"can't read conf file \"+name.torstr());\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t}\r\n\t\t\t\tint dst;\r\n\t\t\t\tif(!const_eval(sh,sh.vword_to_vstr(vword),dst))\r\n\t\t\t\t\treturn false;\r\n\t\t\t\tudst=(uint)dst;\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t\tudst=vstr[i].touint();\r\n\t\t\tsh.m_conf.m_conf.push(udst);\r\n\t\t}\r\n\t\tif(sh.m_conf.m_conf.count()<=tconf::c_stack_size)\r\n\t\t\treturn false;\r\n\t\tif(rppconf(c_stack_size)<1024*1024)\r\n\t\t\trppconf(c_stack_size)=1024*1024;\r\n\t\treturn true;\r\n\t}\r\n\r\n\tstatic rbool read_optr(tsh& sh,const rstrw& name)\r\n\t{\r\n\t\trstr data=get_file_data(sh,name);\r\n\t\tif(data.count()<2)\r\n\t\t{\r\n\t\t\tsh.error(\"can't read optr file \"+name.torstr());\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\tifn(rcode::is_utf16_txt(data))\r\n\t\t{\r\n\t\t\tsh.error(\"can't read optr file \"+name.torstr());\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\trbuf<rstr> vstr;\r\n\t\tvstr=r_split(data.sub(2),rstr((void*)\"\\r\\x00\\n\\x00\",4));\r\n\t\tfor(int i=0;i<vstr.count();i++)\r\n\t\t{\r\n\t\t\tif(vstr[i].empty())\r\n\t\t\t{\r\n\t\t\t\tsh.error(\"can't read optr file \"+name.torstr());\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\trstrw temp=vstr[i].cstrw_t();\r\n\t\t\tif(temp.is_number())\r\n\t\t\t{\r\n\t\t\t\tsh.m_optr.m_dic[sh.m_optr.m_optr.get_top()]=\r\n\t\t\t\t\ttemp.toint();\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t\tsh.m_optr.m_optr.push(temp.torstr());\r\n\t\t}\r\n\t\treturn sh.m_optr.m_optr.count()==sh.m_optr.m_dic.count()&&\r\n\t\t\tsh.m_optr.m_optr.count()>toptr::c_exp_part;\r\n\t}\r\n\r\n\tstatic rbool read_key(tsh& sh,const rstrw& name)\r\n\t{\r\n\t\trstr data=get_file_data(sh,name);\r\n\t\tif(data.empty())\r\n\t\t{\r\n\t\t\tsh.error(\"can't read key file \"+name.torstr());\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\trbuf<rstr> vstr=r_split(data,rstr(\"\\r\\n\"));\r\n\t\tfor(int i=0;i<vstr.count();i++)\r\n\t\t{\r\n\t\t\tif(vstr[i].empty())\r\n\t\t\t{\r\n\t\t\t\tsh.error(\"can't read key file \"+name.torstr());\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\tsh.m_key.m_key.push(vstr[i]);\r\n\t\t}\r\n\t\treturn sh.m_key.m_key.count()>tkey::c_pmain;\r\n\t}\r\n\r\n\tstatic rbool exist(tsh& sh,const rstrw& name)\r\n\t{\r\n\t\treturn sh.m_file.exist(tfile(name));\r\n\t}\r\n\r\n\tstatic rbool read_file_pack(tsh& sh,const rstrw& name)\r\n\t{\r\n\t\ttfile item;\r\n\t\titem.name=name;\r\n\t\titem.cont=get_file_data(sh,name);//写入时已经是utf8，不用转换\r\n\t\tif(item.cont.empty())\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\tsh.m_file.insert(item);\r\n\t\treturn true;\r\n\t}\r\n\r\n\tstatic rbool read_file(tsh& sh,const rstrw& name)\r\n\t{\r\n\t\tif(name.empty())\r\n\t\t\treturn false;\r\n\t\tifn(file_exist(name))\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\ttfile item;\r\n\t\titem.name=name;\r\n\t\tif(sh.m_file.exist(item))\r\n\t\t\treturn true;\r\n\t\tif(rdir::get_suffix(name)==rstrw(\"rp\"))\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n#ifndef __COCOS2D_H__\r\n\t\tif((int)rfile::get_size8(name)>200*1024*1024)\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n#endif\r\n\t\titem.cont=get_file_data(sh,name);\r\n\t\tif(item.cont.empty())\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\titem.cont=rcode::to_utf8_txt(item.cont).sub(3);\r\n\t\tsh.m_file.insert(item);\r\n\t\treturn true;\r\n\t}\r\n\r\n\tstatic rbool const_eval(tsh& sh,rbuf<rstr> src,int& dst,int level=0)\r\n\t{\r\n\t\tif(level>c_rpp_deep)\r\n\t\t{\r\n\t\t\tsh.error(\"const eval level overflow\");\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\tlevel++;\r\n\t\trbuf<rstr> soptr;\r\n\t\trbuf<int> sopnd;\r\n\t\tsoptr+=rppoptr(c_exp_part);\r\n\t\tsrc+=rppoptr(c_exp_part);\r\n\t\tfor(int i=0;i<src.count();i++)\r\n\t\t{\r\n\t\t\tif(src[i]==rppoptr(c_exp_part)&&\r\n\t\t\t\tsoptr.get_top()==rppoptr(c_exp_part))\r\n\t\t\t\tbreak;\r\n\t\t\tif(src[i].is_number())\r\n\t\t\t{\r\n\t\t\t\tint outopnd=src[i].toint();\r\n\t\t\t\tsopnd.push(outopnd);\r\n\t\t\t}\r\n\t\t\telif(src[i]==rppoptr(c_sbk_l))\r\n\t\t\t{\r\n\t\t\t\tint right=sh.find_symm_sbk(src,i);\r\n\t\t\t\tif(right>=src.count())\r\n\t\t\t\t{\r\n\t\t\t\t\tsh.error(\"const eval miss )\");\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t}\r\n\t\t\t\tint outopnd;\r\n\t\t\t\tif(!const_eval(sh,src.sub(i+1,right),outopnd,level))\r\n\t\t\t\t\treturn false;\r\n\t\t\t\tsopnd.push(outopnd);\r\n\t\t\t\ti=right;\r\n\t\t\t}\r\n\t\t\telif(sh.m_optr.is_optr(src[i]))\r\n\t\t\t{\r\n\t\t\t\tif(soptr.empty())\r\n\t\t\t\t{\r\n\t\t\t\t\tsh.error(\"const eval miss soptr\");\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t}\r\n\t\t\t\trstr cur=src[i];\r\n\t\t\t\tif(!sh.m_optr.precede(soptr.top(),cur))\r\n\t\t\t\t{\r\n\t\t\t\t\tsoptr.push(cur);\r\n\t\t\t\t\tcontinue;\r\n\t\t\t\t}\r\n\t\t\t\trstr theta=soptr.pop();\r\n\t\t\t\tif(sopnd.empty())\r\n\t\t\t\t{\r\n\t\t\t\t\tsh.error(\"const eval miss sopnd\");\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t}\r\n\t\t\t\tint second=sopnd.pop();\r\n\t\t\t\tif(sopnd.empty())\r\n\t\t\t\t{\r\n\t\t\t\t\tif(theta==rppoptr(c_plus))\r\n\t\t\t\t\t{\r\n\t\t\t\t\t}\r\n\t\t\t\t\telif(theta==rppoptr(c_minus))\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tsecond=-second;\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tsh.error(\"const eval miss sopnd\");\r\n\t\t\t\t\t\treturn false;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tsopnd.push(second);\r\n\t\t\t\t\ti--;\r\n\t\t\t\t\tcontinue;\r\n\t\t\t\t}\r\n\t\t\t\tint first=sopnd.pop();\r\n\t\t\t\tint outopnd;\r\n\t\t\t\tif(!calc(sh,first,second,theta,outopnd))\r\n\t\t\t\t{\r\n\t\t\t\t\tsh.error(\"const eval calc error\");\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t}\r\n\t\t\t\tsopnd.push(outopnd);\r\n\t\t\t\ti--;\r\n\t\t\t}\r\n\t\t}\r\n\t\tif(sopnd.count()!=1)\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\tdst=sopnd[0];\r\n\t\treturn true;\r\n\t}\r\n\r\n\tstatic rbool calc(tsh& sh,int first,int second,rstr& theta,int& outopnd)\r\n\t{\r\n\t\tif(theta==rppoptr(c_plus))\r\n\t\t{\r\n\t\t\toutopnd=first+second;\r\n\t\t}\r\n\t\telif(theta==rppoptr(c_minus))\r\n\t\t{\r\n\t\t\toutopnd=first-second;\r\n\t\t}\r\n\t\telif(theta==rppoptr(c_star))\r\n\t\t{\r\n\t\t\toutopnd=first*second;\r\n\t\t}\r\n\t\telif(theta==rppoptr(c_divide))\r\n\t\t{\r\n\t\t\tif(second==0)\r\n\t\t\t\treturn false;\r\n\t\t\toutopnd=first/second;\r\n\t\t}\r\n\t\telse\r\n\t\t\treturn false;\r\n\t\treturn true;\r\n\t}\r\n\r\n\tstatic rbool word_analyse(tsh& sh,rstr& src,rbuf<tword>& result,tfile* pfile)\r\n\t{\r\n\t\tresult.clear();\r\n\t\ttword cur_word;\r\n\t\tcur_word.pos.file=pfile;\r\n\t\tcur_word.pos.line=1;\r\n\t\tint len;\r\n\t\tuchar* start;\r\n\t\tuchar* p;\r\n\t\trstr stemp;\r\n\t\tstemp.set_size(sh.m_optr.m_optr_max);\r\n\t\tfor(p=src.cstr();*p;++p)\r\n\t\t{\r\n\t\t\tstart=p;\r\n\t\t\tif(*p=='/')\r\n\t\t\t{\r\n\t\t\t\t//为了效率这里使用了过多的缩进\r\n\t\t\t\tif(*(p+1)=='*')\r\n\t\t\t\t{\r\n\t\t\t\t\tp+=2;\r\n\t\t\t\t\tint count=1;\r\n\t\t\t\t\tfor(;*p&&*(p+1);p++)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tif('\\n'==*p)\r\n\t\t\t\t\t\t\t++cur_word.pos.line;\r\n\t\t\t\t\t\tif(*p&&*(p+1)&&*p=='/'&&*(p+1)=='*')\r\n\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t++count;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tif(*p&&*(p+1)&&*p=='*'&&*(p+1)=='/')\r\n\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t--count;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tif(0==count)\r\n\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif(count)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tsh.error(rstr(cur_word.pos.line)+\r\n\t\t\t\t\t\t\trstr(\"miss */\"));\r\n\t\t\t\t\t\treturn false;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tp++;\r\n\t\t\t\t\tcontinue;\r\n\t\t\t\t}\r\n\t\t\t\telif(*(p+1)=='/')\r\n\t\t\t\t{\r\n\t\t\t\t\tp+=2;\r\n\t\t\t\t\tfor(;*p&&*p!='\\n';p++)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\t;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif(*p==0)\r\n\t\t\t\t\t\treturn true;\r\n\t\t\t\t\t++cur_word.pos.line;\r\n\t\t\t\t\tcontinue;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tlen=get_optr_s_len(sh,p,src.end()-p,stemp);\r\n\t\t\tif(len)\r\n\t\t\t{\r\n\t\t\t\tcur_word.val=rstr(p,p+len);\r\n\t\t\t\tpush_word(result,cur_word);\r\n\t\t\t\tp+=len;\r\n\t\t\t\tp--;\r\n\t\t\t}\r\n\t\t\telif(rstr::is_alpha(*p)||'_'==*p||\r\n\t\t\t\trcode::is_utf8_3(*p)&&*(p+1)&&*(p+2)||\r\n\t\t\t\trcode::is_utf8_2(*p)&&*(p+1))\r\n\t\t\t{\r\n\t\t\t\tfor(;*p;++p)\r\n\t\t\t\t{\r\n\t\t\t\t\tif(rstr::is_number(*p)||\r\n\t\t\t\t\t\trstr::is_alpha(*p)||'_'==*p)\r\n\t\t\t\t\t\tcontinue;\r\n\t\t\t\t\telif(rcode::is_utf8_3(*p)&&*(p+1)&&*(p+2))\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\t//todo\r\n\t\t\t\t\t\t//应该只能以汉字开头不能以特殊符号开头\r\n\t\t\t\t\t\tp+=2;\r\n\t\t\t\t\t\tcontinue;\r\n\t\t\t\t\t}\r\n\t\t\t\t\telif(rcode::is_utf8_2(*p)&&*(p+1))\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tp++;\r\n\t\t\t\t\t\tcontinue;\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t\tcur_word.val=rstr(start,p);\r\n\t\t\t\tpush_word(result,cur_word);\r\n\t\t\t\tp--;\r\n\t\t\t}\r\n\t\t\telif(rstr::is_number(*p))\r\n\t\t\t{\r\n\t\t\t\tfor(++p;*p&&(rstr::is_number(*p)||'_'==*p||\r\n\t\t\t\t\trstr::is_alpha(*p));++p)\r\n\t\t\t\t\t;\r\n\t\t\t\tcur_word.val=rstr(start,p);\r\n\t\t\t\tpush_word(result,cur_word);\r\n\t\t\t\tp--;\r\n\t\t\t}\r\n\t\t\telif('\"'==*p)\r\n\t\t\t{\r\n\t\t\t\tint line=cur_word.pos.line;\r\n\t\t\t\tfor(++p;*p;++p)\r\n\t\t\t\t{\r\n\t\t\t\t\tif('\\n'==*p)\r\n\t\t\t\t\t\t++cur_word.pos.line;\r\n\t\t\t\t\tif(*p=='\\\\')\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tif(*(p+1)=='x'&&*(p+2)&&*(p+3))\r\n\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\tp+=3;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\telif(*(p+1))\r\n\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\tp++;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tcontinue;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif(*p=='\\\"')\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tcur_word.pos.line=line;\r\n\t\t\t\tif(*p)\r\n\t\t\t\t{\r\n\t\t\t\t\tcur_word.val=rstr(start,p+1);\r\n\t\t\t\t\tpush_word(result,cur_word);\r\n\t\t\t\t}\r\n\t\t\t\telse\r\n\t\t\t\t{\r\n\t\t\t\t\tsh.error(rstr(cur_word.pos.line)+\r\n\t\t\t\t\t\trstr(\"miss \\\"\"));\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\telif('\\''==*p)\r\n\t\t\t{\r\n\t\t\t\tint line=cur_word.pos.line;\r\n\t\t\t\tfor(++p;*p;++p)\r\n\t\t\t\t{\r\n\t\t\t\t\tif('\\n'==*p)\r\n\t\t\t\t\t\t++cur_word.pos.line;\r\n\t\t\t\t\tif(*p=='\\\\')\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tif(*(p+1)=='x'&&*(p+2)&&*(p+3))\r\n\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\tp+=3;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\telif(*(p+1))\r\n\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\tp++;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tcontinue;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif(*p=='\\'')\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tcur_word.pos.line=line;\r\n\t\t\t\tif(*p)\r\n\t\t\t\t{\r\n\t\t\t\t\tcur_word.val=rstr(start,p+1);\r\n\t\t\t\t\tif(cur_word.val.count()<2)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tsh.error(rstr(cur_word.pos.line)+\r\n\t\t\t\t\t\t\trstr(\"miss '\"));\r\n\t\t\t\t\t\treturn false;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tcur_word.val[0]='\"';\r\n\t\t\t\t\tcur_word.val[cur_word.val.count()-1]='\"';\r\n\t\t\t\t\tadd_rstr(sh,result,cur_word);\r\n\t\t\t\t}\r\n\t\t\t\telse\r\n\t\t\t\t{\r\n\t\t\t\t\tsh.error(rstr(cur_word.pos.line)+\r\n\t\t\t\t\t\trstr(\"miss '\"));\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\telif('\\n'==*p)\r\n\t\t\t{\r\n\t\t\t\t++cur_word.pos.line;\r\n\t\t\t}\r\n\t\t\telif('\\\\'==*p&&'\\\\'==*(p+1))\r\n\t\t\t{\r\n\t\t\t\tp+=2;\r\n\t\t\t\tfor(;*p&&*p!='\\n'&&*p!=0xd;p++)\r\n\t\t\t\t{\r\n\t\t\t\t\t;\r\n\t\t\t\t}\r\n\t\t\t\tcur_word.val=zsuper::add_quote(rstr(start+2,p));\r\n\t\t\t\tadd_rstr(sh,result,cur_word);\r\n\t\t\t\tif(*p==0)\r\n\t\t\t\t\treturn true;\r\n\t\t\t\tif(*p=='\\n')\r\n\t\t\t\t\t++cur_word.pos.line;\r\n\t\t\t}\r\n\t\t\telif('`'==*p)\r\n\t\t\t{\r\n\t\t\t\tif(*(p+1)==0)\r\n\t\t\t\t{\r\n\t\t\t\t\tsh.error(rstr(cur_word.pos.line)+\r\n\t\t\t\t\t\trstr(\"miss `\"));\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t}\r\n\t\t\t\tp++;\r\n\t\t\t\tcur_word.val=rstr((uint)*(p));\r\n\t\t\t\tpush_word(result,cur_word);\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn true;\r\n\t}\r\n\r\n\tstatic void push_word(rbuf<tword>& result,tword word)\r\n\t{\r\n\t\tword.pos_src=word.pos;\r\n\t\tresult.push_move(word);\r\n\t}\r\n\r\n\tstatic int get_optr_s_len(tsh& sh,const uchar* s,int len,rstr& stemp)\r\n\t{\r\n\t\tfor(int i=sh.m_optr.m_optr_max;i>0;i--)\r\n\t\t{\r\n\t\t\tif(len<i)\r\n\t\t\t\tcontinue;\r\n\t\t\tmemcpy(stemp.begin(),s,i);\r\n\t\t\tstemp.m_buf.m_count=i;\r\n\t\t\tint pos=r_find_pos_b(sh.m_optr.m_optr_s,stemp);//这里是瓶颈\r\n\t\t\tif(pos<sh.m_optr.m_optr_s.count())\r\n\t\t\t\treturn sh.m_optr.m_optr_s[pos].count();\r\n\t\t}\r\n\t\treturn 0;\r\n\t}\r\n\r\n\tstatic void add_rstr(tsh& sh,rbuf<tword>& result,const tword& word)\r\n\t{\r\n\t\tif(result.get_top()==rppkey(c_import)||\r\n\t\t\tresult.get_top()==rppkey(c_include))\r\n\t\t{\r\n\t\t\tpush_word(result,word);\r\n\t\t\treturn;\r\n\t\t}\r\n\t\ttword temp;\r\n\t\ttemp.pos=word.pos;\r\n\t\ttemp.val=rppkey(c_rstr);\r\n\t\tpush_word(result,temp);\r\n\t\ttemp.val=rppoptr(c_sbk_l);\r\n\t\tpush_word(result,temp);\r\n\t\tpush_word(result,word);\r\n\t\ttemp.val=rppoptr(c_sbk_r);\r\n\t\tpush_word(result,temp);\r\n\t}\r\n\r\n\tstatic rbool is_const_str(tsh& sh,const rstr& s)\r\n\t{\r\n\t\treturn s.is_number()||s==rppoptr(c_sbk_l)||s==rppoptr(c_sbk_r)||\r\n\t\t\ts==rppoptr(c_plus)||s==rppoptr(c_minus)||s==rppoptr(c_star)||\r\n\t\t\ts==rppoptr(c_divide);\r\n\t}\r\n\r\n\tstatic rbool is_const_str(tsh& sh,rbuf<tword>& v,int begin,int end)\r\n\t{\r\n\t\tfor(int i=begin;i<end;i++)\r\n\t\t\tif(!is_const_str(sh,v[i].val))\r\n\t\t\t\treturn false;\r\n\t\treturn true;\r\n\t}\r\n\r\n\tstatic rbool file_exist(const rstrw& name)\r\n\t{\r\n#ifndef __COCOS2D_H__\r\n\t\treturn rfile::exist(name);\r\n#else\r\n\t\treturn !get_file_data(name).empty();\r\n#endif\r\n\t}\r\n\r\n#ifdef __COCOS2D_H__\r\n\t//读到空文件也算失败\r\n\tstatic rstr get_file_data(const rstrw& name)\r\n\t{\r\n\t\tint size;\r\n\t\tuchar* pbuf=CCFileUtils::getInstance()->getFileData(\r\n\t\t\tname.torstr().cstr_t(),\"rb\",(ssize_t*)&size);\r\n\t\tif(pbuf==null||size<=0)\r\n\t\t{\r\n\t\t\treturn rstr();\r\n\t\t}\r\n\t\trstr ret=rstr(pbuf,size);\r\n\t\tdelete[] pbuf;\r\n\t\treturn r_move(ret);\r\n\t}\r\n#else\r\n\r\n\tstatic rstr get_file_data(tsh& sh,const rstrw& name)\r\n\t{\r\n\t\tif(sh.m_is_pack_read)\r\n\t\t{\r\n\t\t\tfor(int i=0;i<sh.m_db.count();i+=2)\r\n\t\t\t{\r\n\t\t\t\tif(sh.m_db[i]==name)\r\n\t\t\t\t{\r\n\t\t\t\t\treturn sh.m_db[i+1];\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\treturn rstr();\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\treturn rfile::read_all_n(name);\r\n\t\t}\r\n\t}\r\n#endif\r\n};\r\n\r\n#endif"
  },
  {
    "path": "rpp/zsent.h",
    "content": "﻿#ifndef zsent_h__\r\n#define zsent_h__\r\n\r\n#include \"zlambda.h\"\r\n\r\n//运算符替换成标准函数调用的S表达式\r\n//即[ class func []]形式，例如[ rf print []]\r\n//从这里开始行号已经放在sent中\r\nstruct zsent\r\n{\r\n\tstatic rbool proc_func(tsh& sh,tfunc& tfi,tenv env)\r\n\t{\r\n\t\tif(env.ptfi!=null)\r\n\t\t{\r\n\t\t\tadd_class(sh,tfi,env);\r\n\t\t}\r\n\t\tifn(zlambda::function_replace(sh,tfi.vword))\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\tzlambda::lambda_var_replace(sh,tfi);\r\n\t\tifn(zlambda::lambda_replace(sh,tfi))\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\tzctl::sbk_line_proc(sh,tfi.vword);\r\n\t\tifn(macro_replace(sh,tfi))\r\n\t\t\treturn false;\r\n\t\tif(!zmac::replace(sh,*tfi.ptci,tfi.vword))\r\n\t\t\treturn false;\r\n\t\tif(!zftl::ftl_replace(sh,*tfi.ptci,tfi.vword,null))\r\n\t\t\treturn false;\r\n\t\tif(!zcontrol::proc_func(sh,tfi))\r\n\t\t\treturn false;\r\n\t\tifn(zmac::func_mac_replace(sh,tfi.vsent))\r\n\t\t\treturn false;\r\n\t\tzlambda::lambda_proc(sh,tfi);\r\n\t\t//增加全局变量引用\r\n\t\tadd_main_quote(sh,tfi);\r\n\t\tzsrep::neg_replace(sh,tfi.vsent);\r\n\t\t//常量dot替换成临时变量\r\n\t\t//如 0.toint -> int(0).toint\r\n\t\t// \"abc\"+a  ->  rstr(\"abc\")+a\r\n\t\tzsrep::const_replace(sh,tfi.vsent);\r\n\t\t//找到直接定义的局部变量\r\n\t\tzsrep::local_var_replace(sh,tfi);\r\n\t\tint tid=0;\r\n\t\t//函数指针常量替换\r\n\t\tzsrep::fpoint_replace(sh,tfi);\r\n\t\t//sizeof s_off替换成0，稍后处理\r\n\t\tif(!zsrep::size_off_to_zero(sh,tfi))\r\n\t\t\treturn false;\r\n\t\t//进行类型推断\r\n\t\tif(!proc_type_infer(sh,tfi,env))\r\n\t\t\treturn false;\r\n\t\tif(!zsrep::typeof_replace(sh,tfi,env))\r\n\t\t\treturn false;\r\n\t\t//变量构造函数替换如a(1) -> int.int(a,1)\r\n\t\t//这个变量必须是已定义的，不能是类型推断\r\n\t\tif(!zsrep::var_struct_replace(sh,tfi))\r\n\t\t\treturn false;\r\n\t\t//表达式标准化\r\n\t\tif(!zexp::p_exp_all(sh,tfi,env))\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\t//临时变量替换，替换后有些表达式类型会变空\r\n\t\tif(!replace_temp_var(sh,tfi,tid))\r\n\t\t\treturn false;\r\n\t\tifn(tfi.sdynamic.empty())\r\n\t\t{\r\n\t\t\ttdata tdi;\r\n\t\t\ttdi.type=rppkey(c_int);\r\n\t\t\ttdi.name=\"_EBP\";\r\n\t\t\ttfi.local+=tdi;\r\n\r\n\t\t\ttsent sent;\r\n\t\t\tsent.pos=tfi.first_pos;\r\n\t\t\tsent.vword.push(tword(\"mov\"));//tword没有设置pos\r\n\t\t\tsent.vword.push(tword(\"_EBP\"));\r\n\t\t\tsent.vword.push(tword(\",\"));\r\n\t\t\tsent.vword.push(tword(\"ebp\"));\r\n\t\t\ttfi.vsent.push_front(r_move(sent));\r\n\t\t}\r\n\t\tif(env.ptfi!=null)\r\n\t\t{\r\n\t\t\ttsent sent;\r\n\t\t\tsent.pos=tfi.first_pos;\r\n\t\t\tsent.vword.push(tword(\"mov\"));//tword没有设置pos\r\n\t\t\tsent.vword.push(tword(\"_PENV\"));\r\n\t\t\tsent.vword.push(tword(\",\"));\r\n\t\t\tsent.vword.push(tword(rstr(env.v_ebp)));\r\n\t\t\ttfi.vsent.push_front(r_move(sent));\r\n\t\t}\r\n\t\t//获取局部变量偏移\r\n\t\tobtain_local_off(sh,tfi.local);\r\n\t\tobtain_param_off(tfi);\r\n\t\t//增加局部变量和成员变量的构造和析构\r\n\t\tzadd::add_local_and_memb(sh,tfi);\r\n\t\t//增加全局变量初始化汇编\r\n\t\tadd_main_init_asm(sh,tfi);\r\n\t\tzlambda::lambda_add_init_asm(sh,tfi);\r\n\t\t//sizeof s_off替换成实际值\r\n\t\tif(!zsrep::size_off_to_zero(sh,tfi))\r\n\t\t\treturn false;\r\n\t\tif(!zsrep::size_off_replace(sh,tfi))\r\n\t\t\treturn false;\r\n\t\t//汇编语句常量求值\r\n\t\tif(!asm_const_eval(sh,tfi))\r\n\t\t\treturn false;\r\n\t\tif(!zmac::replace(sh,*tfi.ptci,tfi.vword))\r\n\t\t\treturn false;\r\n\t\t//成员变量里有sizeof s_off的情况需要再次替换\r\n\t\t//注意成员变量初始化的时候不能使用临时变量\r\n\t\t//再处理一次，获取所有表达式的类型\r\n\t\tif(!zexp::p_exp_all(sh,tfi,tenv()))\r\n\t\t\treturn false;\r\n\t\treturn true;\r\n\t}\r\n\r\n\tstatic rbool macro_replace(tsh& sh,tfunc& tfi)\r\n\t{\r\n\t\trbuf<tword>& v=tfi.vword;\r\n\t\tfor(int i=0;i<v.count();i++)\r\n\t\t{\r\n\t\t\tif(sh.m_macro.exist(v[i].val))\r\n\t\t\t{\r\n\t\t\t\ttfunc* ptfi=sh.m_macro[v[i].val];\r\n\t\t\t\tifn(_func_to_x86(sh,*ptfi,tenv()))\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t((void (__stdcall *)(rbuf<tword>&,int))(ptfi->code))(v,i);\r\n\t\t\t}\r\n\t\t}\r\n\t\tzpre::arrange(v);\r\n\t\treturn true;\r\n\t}\r\n\r\n\tstatic void add_class(tsh& sh,tfunc& tfi,tenv env)\r\n\t{\r\n\t\trstr name=\"_func_class_\"+env.ptfi->name_dec;\r\n\t\tif(!zfind::is_class(sh,name))\r\n\t\t{\r\n\t\t\ttclass item;\r\n\t\t\titem.name=name;\r\n\t\t\tfor(int i=0;i<env.ptfi->local.count();i++)\r\n\t\t\t{\r\n\t\t\t\titem.vdata.push(env.ptfi->local[i]);\r\n\t\t\t}\r\n\t\t\tfor(int i=0;i<env.ptfi->param.count();i++)\r\n\t\t\t{\r\n\t\t\t\titem.vdata.push(env.ptfi->param[i]);\r\n\t\t\t}\r\n\t\t\tsh.m_class.insert(item);\r\n\t\t}\r\n\r\n\t\ttdata tdi;\r\n\t\ttdi.type=name+\"&\";\r\n\t\ttdi.name=rppkey(c_penv);\r\n\t\ttdi.size=4;\r\n\t\ttdi.count=1;\r\n\t\ttfi.local.push(tdi);\r\n\t}\r\n\r\n\t//增加全局变量引用的初始化汇编语句\r\n\tstatic void add_main_init_asm(tsh& sh,tfunc& tfi)\r\n\t{\r\n\t\tif(tfi.name!=\"main\")\r\n\t\t{\r\n\t\t\tint i;\r\n\t\t\tfor(i=0;i<tfi.local.count();i++)\r\n\t\t\t{\r\n\t\t\t\tif(tfi.local[i].type==\"main&\"&&\r\n\t\t\t\t\ttfi.local[i].name==rppkey(c_pmain))\r\n\t\t\t\t{\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tif(i>=tfi.local.count())\r\n\t\t\t{\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t}\r\n\t\ttsent sent;\r\n\t\tsent.pos=tfi.first_pos;\r\n\t\tsent.vword.push(tword(\"mov\"));//tword没有设置pos\r\n\t\tsent.vword.push(tword(rppkey(c_pmain)));\r\n\t\tsent.vword.push(tword(\",\"));\r\n\t\tif(sh.m_mode==tsh::c_rvm||sh.m_mode==tsh::c_jit)\r\n\t\t{\r\n\t\t\tsent.vword.push(tword(rstr((uint)sh.m_main_data.begin())));\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tsent.vword.push(tword(\"_PMAIN_A\"));\r\n\t\t}\r\n\t\ttfi.vsent.push_front(r_move(sent));\r\n\t}\r\n\r\n\t//全局变量和成员变量都不能使用类型推断\r\n\t//全局变量必须用g_开头\r\n\tstatic void add_main_quote(tsh& sh,tfunc& tfi)\r\n\t{\r\n\t\tifn(tfi.ptci->name==rppkey(c_main)&&tfi.name==rppkey(c_main))\r\n\t\t{\r\n\t\t\tint i;\r\n\t\t\tfor(i=0;i<tfi.vword.count();i++)\r\n\t\t\t{\r\n\t\t\t\tif(zfind::data_member_search(\r\n\t\t\t\t\t*sh.m_main,tfi.vword[i].val)!=null)\r\n\t\t\t\t{\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tif(i>=tfi.vword.count())\r\n\t\t\t{\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t}\r\n\t\ttdata tdi;\r\n\t\ttdi.type=\"main&\";\r\n\t\ttdi.name=rppkey(c_pmain);\r\n\t\ttdi.size=4;\r\n\t\ttdi.count=1;\r\n\t\ttfi.local.push(tdi);\r\n\t}\r\n\r\n\tstatic rbool asm_const_eval(tsh& sh,tfunc& tfi)\r\n\t{\r\n\t\tfor(int i=0;i<tfi.vsent.count();++i)\r\n\t\t{\r\n\t\t\tif(sh.m_key.is_asm_ins(tfi.vsent[i].vword.get_bottom().val))\r\n\t\t\t{\r\n\t\t\t\tif(!zpre::op_const_eval(sh,tfi.vsent[i].vword,true))\r\n\t\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn true;\r\n\t}\r\n\r\n\tstatic void obtain_local_off(tsh& sh,rbuf<tdata>& local)\r\n\t{\r\n\t\tint off=c_point_size;\r\n\t\tfor(int i=0;i<local.count();++i)\r\n\t\t{\r\n\t\t\tlocal[i].size=zfind::get_type_size(sh,local[i].type);\r\n\t\t\tlocal[i].off=off;\r\n\t\t\toff+=zfind::get_ceil_space(local[i]);\r\n\t\t}\r\n\t}\r\n\r\n\tstatic void obtain_param_off(tfunc& tfi)\r\n\t{\r\n\t\tint off=zfind::get_func_local_size(tfi);\r\n\t\toff+=c_point_size;//ebp占用的\r\n\t\toff+=c_point_size;//返回地址占用的\r\n\t\tfor(int i=0;i<tfi.param.count();++i)\r\n\t\t{\r\n\t\t\ttfi.param[i].off=off;\r\n\t\t\toff+=zfind::get_ceil_space(tfi.param[i]);\r\n\t\t}\r\n\t\ttfi.retval.off=off;\r\n\t}\r\n\r\n\tstatic rbool proc_type_infer(tsh& sh,tfunc& tfi,tenv env)\r\n\t{\r\n\t\tfor(int i=0;i<tfi.vsent.count();++i)\r\n\t\t\tif(!proc_type_infer(sh,tfi.vsent[i],tfi,env))\r\n\t\t\t\treturn false;\r\n\t\tzcontrol::part_vsent(tfi);\r\n\t\treturn true;\r\n\t}\r\n\r\n\tstatic rbool proc_type_infer(tsh& sh,tsent& sent,tfunc& tfi,tenv env)\r\n\t{\r\n\t\ttclass& tci=*tfi.ptci;\r\n\t\tif(sent.vword.count()>=3&&\r\n\t\t\tsent.vword[1].val==rppoptr(c_equal)&&\r\n\t\t\tsent.vword[0].is_name())\r\n\t\t{\r\n\t\t\t//处理类型推断\r\n\t\t\trstr name=sent.vword[0].val;\r\n\t\t\tif(null!=zfind::local_search(tfi,name))\r\n\t\t\t\treturn true;\r\n\t\t\tif(env.ptfi!=null&&null!=zfind::local_search(*env.ptfi,name))\r\n\t\t\t{\r\n\t\t\t\treturn true;\r\n\t\t\t}\r\n\t\t\tif(null!=zfind::data_member_search(tci,name))\r\n\t\t\t\treturn true;\r\n\t\t\tif(null!=zfind::data_member_search(*sh.m_main,name))\r\n\t\t\t\treturn true;\r\n\t\t\ttsent temp=sent.sub(2,sent.vword.count());\r\n\t\t\tif(!zsrep::typeof_replace(sh,tfi,temp,env))\r\n\t\t\t{\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\tif(!zexp::p_exp(sh,temp,tfi,0,env))\r\n\t\t\t\treturn false;\r\n\t\t\ttdata tdi;\r\n\t\t\ttdi.name=name;\r\n\t\t\ttdi.type=sh.get_tname(temp.type);//引用推断为对象\r\n\t\t\t\r\n\t\t\ttfi.local.push(tdi);\r\n\t\t\trbuf<tword> vtemp;\r\n\t\t\tzadd::add_destructor_func(sh,tdi,vtemp);\r\n\t\t\tzadd::add_structor_func(sh,tdi,vtemp);\r\n\t\t\tvtemp+=r_move(sent.vword);\r\n\t\t\tsent.vword=r_move(vtemp);\r\n\t\t}\r\n\t\treturn true;\r\n\t}\r\n\r\n\tstatic rbool replace_temp_var_v(tsh& sh,tfunc& tfi,rbuf<tword>& v,int& tid)\r\n\t{\r\n\t\trbuf<tword> result;\r\n\t\tfor(int i=1;i<v.count();i++)\r\n\t\t{\r\n\t\t\tif(v[i].val!=rppkey(c_btemp))\r\n\t\t\t{\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\t\t\ttclass* ptci=zfind::class_search(sh,v.get(i+2).val);\r\n\t\t\tif(null==ptci)\r\n\t\t\t\tcontinue;\r\n\t\t\tint left=i-1;\r\n\t\t\tif(v[left].val!=rppoptr(c_mbk_l))\r\n\t\t\t{\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\t\t\tint right=sh.find_symm_mbk(v,left);\r\n\t\t\tif(right>=v.count())\r\n\t\t\t{\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\ttdata tdi;\r\n\t\t\ttdi.type=ptci->name;\r\n\t\t\ttdi.name=rppkey(c_temp)+rstr(tid);\r\n\t\t\ttid++;\r\n\t\t\t//先析构后构造\r\n\t\t\tzadd::add_destructor_func(sh,tdi,result);\r\n\t\t\tresult+=rppoptr(c_mbk_l);\r\n\t\t\tresult+=tdi.type;\r\n\t\t\tresult+=rppoptr(c_comma);\r\n\t\t\tresult+=tdi.type;\r\n\t\t\tresult+=rppoptr(c_comma);\r\n\t\t\tresult+=rppoptr(c_mbk_l);\r\n\t\t\tresult+=tdi.name;\r\n\t\t\trbuf<tword> vparam=v.sub(left+6,right-1);\r\n\t\t\tifn(vparam.empty())\r\n\t\t\t{\r\n\t\t\t\tresult+=rppoptr(c_comma);\r\n\t\t\t\tresult+=vparam;\r\n\t\t\t}\r\n\t\t\tresult+=rppoptr(c_mbk_r);\r\n\t\t\tresult+=rppoptr(c_mbk_r);\r\n\t\t\tresult+=rppoptr(c_semi);\r\n\t\t\ttfi.local.push(tdi);\r\n\t\t\tfor(int j=left;j<=right;j++)\r\n\t\t\t{\r\n\t\t\t\tv[j].clear();\r\n\t\t\t}\r\n\t\t\tv[left].val=tdi.name;\r\n\t\t\ti=right;\r\n\t\t}\r\n\t\tzpre::arrange(v);\r\n\t\tresult+=r_move(v);\r\n\t\tv=r_move(result);\r\n\t\treturn true;\r\n\t}\r\n\r\n\tstatic rbool replace_temp_var(tsh& sh,tfunc& tfi,int& tid)\r\n\t{\r\n\t\tfor(int i=0;i<tfi.vsent.count();++i)\r\n\t\t{\r\n\t\t\tif(sh.m_key.is_asm_ins(tfi.vsent[i].vword.get_bottom().val))\r\n\t\t\t\tcontinue;\r\n\t\t\tfor(int j=0;j<c_rpp_deep;j++)//最多150层嵌套\r\n\t\t\t{\r\n\t\t\t\t//刚好是先构造内层的临时变量，再构造外层的临时变量\r\n\t\t\t\t//这种循环替换的方式好像比递归更清晰\r\n\t\t\t\tint temp=tid;\r\n\t\t\t\tif(!replace_temp_var_v(sh,tfi,tfi.vsent[i].vword,tid))\r\n\t\t\t\t{\r\n\t\t\t\t\tsh.error(tfi.vsent[i],\"replace_temp_var_v\");\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t}\r\n\t\t\t\tif(temp==tid)\r\n\t\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t}\r\n\t\tzcontrol::part_vsent(tfi);\r\n\t\treturn true;\r\n\t}\r\n};\r\n\r\n#endif"
  },
  {
    "path": "rpp/zsrep.h",
    "content": "﻿#ifndef zsrep_h__\r\n#define zsrep_h__\r\n\r\n#include \"zadd.h\"\r\n#include \"zexp.h\"\r\n\r\n//简单替换类\r\nstruct zsrep\r\n{\r\n\tstatic rbool typeof_replace(tsh& sh,tfunc& tfi,tenv env)\r\n\t{\r\n\t\tfor(int i=0;i<tfi.vsent.count();i++)\r\n\t\t{\r\n\t\t\tif(!typeof_replace(sh,tfi,tfi.vsent[i],env))\r\n\t\t\t{\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn true;\r\n\t}\r\n\r\n\tstatic rbool typeof_replace(tsh& sh,tfunc& tfi,tsent& sent,tenv env)\r\n\t{\r\n\t\trbuf<tword>& v=sent.vword;\r\n\t\tfor(int i=0;i<v.count();i++)\r\n\t\t{\r\n\t\t\tif(v[i]!=rppkey(c_typeof))\r\n\t\t\t{\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\t\t\tint left=i+1;\r\n\t\t\tif(v.get(left)!=rppoptr(c_sbk_l))\r\n\t\t\t{\r\n\t\t\t\tsh.error(sent,\"miss (\");\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\tint right=sh.find_symm_sbk(v,left);\r\n\t\t\tif(right>=v.count())\r\n\t\t\t{\r\n\t\t\t\tsh.error(sent,\"miss )\");\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\ttsent dst;\r\n\t\t\tdst.pos=sent.pos;\r\n\t\t\tdst.vword=v.sub(left+1,right);\r\n\t\t\tif(dst.vword.count()==1&&zfind::is_class(sh,dst.vword[0].val))\r\n\t\t\t{\r\n\t\t\t\tdst.type=dst.vword[0].val;\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\tif(!zexp::p_exp(sh,dst,tfi,0,env))\r\n\t\t\t\t{\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tsh.clear_word_val(v,i,right+1);\r\n\t\t\tv[i].val=zsuper::add_quote(dst.type);\r\n\t\t}\r\n\t\tzpre::arrange(v);\r\n\t\treturn true;\r\n\t}\r\n\r\n\tstatic void fpoint_replace(tsh& sh,tfunc& tfi)\r\n\t{\r\n\t\tfor(int i=0;i<tfi.vsent.count();++i)\r\n\t\t\tfpoint_replace(sh,*tfi.ptci,tfi.vsent[i].vword);\r\n\t}\r\n\r\n\tstatic void fpoint_replace(tsh& sh,tclass& tci,rbuf<tword>& v)\r\n\t{\r\n\t\tfor(int i=0;i<v.count();i++)\r\n\t\t{\r\n\t\t\tif(v[i].val!=rppoptr(c_addr))\r\n\t\t\t\tcontinue;\r\n\t\t\ttclass* ptci;\r\n\t\t\trstr name;\r\n\t\t\ttfunc* ptfi;\r\n\t\t\tint left;\r\n\t\t\tif(v.get(i+2).val==rppoptr(c_dot))\r\n\t\t\t{\r\n\t\t\t\tptci=zfind::class_search(sh,v.get(i+1).val);\r\n\t\t\t\tif(null==ptci)\r\n\t\t\t\t\tcontinue;\r\n\t\t\t\tname=v.get(i+3).val;\r\n\t\t\t\tleft=i+4;\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\tname=v.get(i+1).val;\r\n\t\t\t\tptci=&tci;\r\n\t\t\t\tptfi=zfind::func_search(*ptci,name);\r\n\t\t\t\tif(null==ptfi)\r\n\t\t\t\t{\r\n\t\t\t\t\tptci=sh.m_main;\t\r\n\t\t\t\t}\r\n\t\t\t\tleft=i+2;\r\n\t\t\t}\r\n\t\t\tif(v.get(left)!=rppoptr(c_sbk_l))\r\n\t\t\t{\r\n\t\t\t\tptfi=zfind::func_search(*ptci,name);\r\n\t\t\t\tif(null==ptfi)\r\n\t\t\t\t\tcontinue;\r\n\t\t\t\tsh.clear_word_val(v,i,left);\r\n\t\t\t\tv[i].multi=sh.get_func_declare_lisp(sh,*ptci,*ptfi);\r\n\t\t\t\ti=left-1;\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\tint right=sh.find_symm_sbk(v,left);\r\n\t\t\t\tif(right>=v.count())\r\n\t\t\t\t{\r\n\t\t\t\t\tcontinue;\r\n\t\t\t\t}\r\n\t\t\t\trbuf<tsent> vsent;\r\n\t\t\t\tsh.split_param(vsent,v.sub(left+1,right));\r\n\t\t\t\trbuf<rstr> vtype;\r\n\t\t\t\tfor(int j=0;j<vsent.count();j++)\r\n\t\t\t\t\tvtype.push(vsent[j].vword.get(0).val);\r\n\t\t\t\tptfi=zfind::func_search_same(*ptci,name,vtype);\r\n\t\t\t\tif(null==ptfi)\r\n\t\t\t\t\tcontinue;\r\n\t\t\t\tsh.clear_word_val(v,i,right+1);\r\n\t\t\t\tv[i].multi=sh.get_func_declare_lisp(sh,*ptci,*ptfi);\r\n\t\t\t\ti=right;\r\n\t\t\t}\r\n\t\t}\r\n\t\tzpre::arrange(v);\r\n\t}\r\n\r\n\tstatic void const_replace(tsh& sh,rbuf<tsent>& vsent)\r\n\t{\r\n\t\tfor(int i=0;i<vsent.count();++i)\r\n\t\t{\r\n\t\t\tif(sh.m_key.is_asm_ins(vsent[i].vword.get_bottom().val))\r\n\t\t\t\tcontinue;\r\n\t\t\tconst_replace(sh,vsent[i].vword);\r\n\t\t}\r\n\t}\r\n\r\n\tstatic void const_replace(tsh& sh,rbuf<tword>& v)\r\n\t{\r\n\t\tfor(int i=0;i<v.count();i++)\r\n\t\t{\r\n\t\t\tif(!v[i].is_const())\r\n\t\t\t\tcontinue;\r\n\t\t\tif(v[i].is_cint()&&v.get(i+1).val==rppoptr(c_dot))\r\n\t\t\t{\r\n\t\t\t\tv[i].multi.push(rppkey(c_int));\r\n\t\t\t\tv[i].multi.push(rppoptr(c_sbk_l));\r\n\t\t\t\tv[i].multi.push(v[i].val);\r\n\t\t\t\tv[i].multi.push(rppoptr(c_sbk_r));\r\n\t\t\t\tv[i].val.clear();\r\n\t\t\t}\r\n\t\t\telif(v[i].is_cdouble()&&v.get(i+1).val==rppoptr(c_dot))\r\n\t\t\t{\r\n\t\t\t\tv[i].multi.push(rstr(\"double\"));\r\n\t\t\t\tv[i].multi.push(rppoptr(c_sbk_l));\r\n\t\t\t\tv[i].multi.push(v[i].val);\r\n\t\t\t\tv[i].multi.push(rppoptr(c_sbk_r));\r\n\t\t\t\tv[i].val.clear();\r\n\t\t\t}\r\n\t\t\telif(v[i].is_cstr()&&\r\n\t\t\t\t(v.get(i+1).val==rppoptr(c_dot)||\r\n\t\t\t\tzfind::is_rstr_optr(sh,v.get(i+1).val)||\r\n\t\t\t\tzfind::is_rstr_optr(sh,v.get(i-1).val)))\r\n\t\t\t{\r\n\t\t\t\tv[i].multi.push(rppkey(c_rstr));\r\n\t\t\t\tv[i].multi.push(rppoptr(c_sbk_l));\r\n\t\t\t\tv[i].multi.push(v[i].val);\r\n\t\t\t\tv[i].multi.push(rppoptr(c_sbk_r));\r\n\t\t\t\tv[i].val.clear();\r\n\t\t\t}\r\n\t\t}\r\n\t\tzpre::arrange(v);\r\n\t}\r\n\r\n\tstatic void neg_replace(tsh& sh,rbuf<tsent>& vsent)\r\n\t{\r\n\t\tfor(int i=0;i<vsent.count();i++)\r\n\t\t{\r\n\t\t\tneg_replace(sh,vsent[i].vword);\r\n\t\t}\r\n\t}\r\n\r\n\tstatic void neg_replace(tsh& sh,rbuf<tword>& v)\r\n\t{\r\n\t\tfor(int i=0;i<v.count()-1;i++)\r\n\t\t{\r\n\t\t\tif(v[i]!=rppoptr(c_minus))\r\n\t\t\t{\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\t\t\tif(i==0)\r\n\t\t\t{\r\n\t\t\t\tv[i].val=\"neg\";\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\t\t\tif(v[i-1]==rppoptr(c_equal)||\r\n\t\t\t\tv[i-1]==rppoptr(c_sbk_l)||\r\n\t\t\t\tv[i-1]==rppoptr(c_mbk_l)||\r\n\t\t\t\tv[i-1]==rppoptr(c_comma)||\r\n\t\t\t\tv[i-1]==rppoptr(c_equalequal)||\r\n\t\t\t\tv[i-1]==rppoptr(c_notequal))\r\n\t\t\t{\r\n\t\t\t\tv[i].val=\"neg\";\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tstatic rbool size_off_to_zero(tsh& sh,tfunc& tfi)\r\n\t{\r\n\t\tfor(int i=0;i<tfi.vsent.count();++i)\r\n\t\t\tif(!size_off_to_zero(sh,tfi.vsent[i].vword))\r\n\t\t\t{\r\n\t\t\t\tsh.error(tfi.vsent[i],\"size_off_to_zero error\");\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\treturn true;\r\n\t}\r\n\r\n\tstatic rbool size_off_to_zero(tsh& sh,rbuf<tword>& v)\r\n\t{\r\n\t\tfor(int i=0;i<v.count();i++)\r\n\t\t{\r\n\t\t\tif(v[i].val!=rppkey(c_sizeof)&&v[i].val!=rppkey(c_s_off))\r\n\t\t\t{\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\t\t\tif(i+1>=v.count())\r\n\t\t\t{\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\tif(v.get(i+1).val!=rppoptr(c_sbk_l))\r\n\t\t\t{\r\n\t\t\t\tv[i].multi.push(v[i].val);\r\n\t\t\t\tv[i].multi.push(v.get(i+1).val);\r\n\t\t\t\tv[i+1].clear();\r\n\t\t\t\tv[i].val=rstr(\"0\");\r\n\t\t\t\ti++;\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\tint right=sh.find_symm_sbk(v,i+1);\r\n\t\t\t\tif(right>=v.count())\r\n\t\t\t\t\treturn false;\r\n\t\t\t\tv[i].multi.push(v[i].val);\r\n\t\t\t\tv[i].multi+=sh.vword_to_vstr(v.sub(i+2,right));\r\n\t\t\t\tsh.clear_word_val(v,i+1,right+1);\r\n\t\t\t\tv[i].val=rstr(\"0\");\r\n\t\t\t\ti=right;\r\n\t\t\t}\r\n\t\t}\r\n\t\tzpre::arrange(v);\r\n\t\treturn true;\r\n\t}\r\n\r\n\tstatic rbool size_off_replace(tsh& sh,tfunc& tfi)\r\n\t{\r\n\t\tfor(int i=0;i<tfi.vsent.count();++i)\r\n\t\t\tif(!zsrep::size_off_replace(sh,tfi.vsent[i].vword,tfi))\r\n\t\t\t{\r\n\t\t\t\tsh.error(tfi.vsent[i],\"size_off_replace error\");\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\treturn true;\r\n\t}\r\n\r\n\tstatic rbool size_off_replace(tsh& sh,rbuf<tword>& v,tfunc& tfi)\r\n\t{\r\n\t\tfor(int i=0;i<v.count();i++)\r\n\t\t{\r\n\t\t\tif(v[i].multi.count()!=2)\r\n\t\t\t\tcontinue;\r\n\t\t\trstr name=v[i].multi[1];\r\n\t\t\tif(v[i].multi[0]==rppkey(c_sizeof))\r\n\t\t\t{\r\n\t\t\t\tif(rppkey(c_s_local)==name)\r\n\t\t\t\t{\r\n\t\t\t\t\tv[i].val=rstr(zfind::get_func_local_size(tfi));\r\n\t\t\t\t}\r\n\t\t\t\telif(rppkey(c_s_param)==name)\r\n\t\t\t\t{\r\n\t\t\t\t\tv[i].val=rstr(zfind::get_func_param_size(tfi));\r\n\t\t\t\t}\r\n\t\t\t\telse\r\n\t\t\t\t{\r\n\t\t\t\t\ttclass* ptci=zfind::class_search(sh,name);\r\n\t\t\t\t\tif(null==ptci)\r\n\t\t\t\t\t\treturn false;\r\n\t\t\t\t\tv[i].val=rstr(ptci->size);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\telif(v[i].multi[0]==rppkey(c_s_off))\r\n\t\t\t{\r\n\t\t\t\ttdata* ptdi=zfind::local_search(tfi,name);\r\n\t\t\t\tif(null==ptdi)\r\n\t\t\t\t\treturn false;\r\n\t\t\t\tv[i].val=rstr(ptdi->off);\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t\tcontinue;\r\n\t\t\tv[i].multi.clear();\r\n\t\t}\r\n\t\tifn(sh.m_key.is_asm_ins(v.get_bottom().val))\r\n\t\t{\r\n\t\t\treturn true;\r\n\t\t}\r\n\t\tfor(int i=1;i<v.count();i++)\r\n\t\t{\r\n\t\t\tif(!v[i].is_name())\r\n\t\t\t\tcontinue;\r\n\t\t\ttdata* ptdi=zfind::local_search(tfi,v[i].val);\r\n\t\t\tif(ptdi==null)\r\n\t\t\t\tcontinue;\r\n\t\t\trbuf<rstr> vdst;\r\n\t\t\tif(v.get(i-1).val==rppoptr(c_addr))\r\n\t\t\t{\r\n\t\t\t\tvdst.push(rstr(\"ebp\"));\r\n\t\t\t\tvdst.push(rstr(\"+\"));\r\n\t\t\t\tvdst.push(rstr(ptdi->off));\r\n\t\t\t\tv[i-1].clear();\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\tvdst.push(rstr(rppoptr(c_mbk_l)));\r\n\t\t\t\tvdst.push(rstr(\"ebp\"));\r\n\t\t\t\tvdst.push(rstr(\"+\"));\r\n\t\t\t\tvdst.push(rstr(ptdi->off));\r\n\t\t\t\tvdst.push(rstr(rppoptr(c_mbk_r)));\r\n\t\t\t}\r\n\t\t\tv[i].clear();\r\n\t\t\tv[i].multi=r_move(vdst);\r\n\t\t}\r\n\t\tzpre::arrange(v);\r\n\t\treturn true;\r\n\t}\r\n\r\n\tstatic rbool local_var_replace(tsh& sh,tfunc& tfi)\r\n\t{\r\n\t\tfor(int i=0;i<tfi.vsent.count();++i)\r\n\t\t{\r\n\t\t\tif(sh.m_key.is_asm_ins(tfi.vsent[i].vword.get_bottom().val))\r\n\t\t\t\tcontinue;\r\n\t\t\tif(!local_var_replace(sh,tfi.vsent[i].vword,tfi))\r\n\t\t\t\treturn false;\r\n\t\t}\r\n\t\treturn true;\r\n\t}\r\n\r\n\tstatic rbool local_var_replace(tsh& sh,rbuf<tword>& v,tfunc& tfi)\r\n\t{\r\n\t\tif(v.count()<2||\r\n\t\t\t!zfind::is_class_t(sh,v.get(0).val)||\r\n\t\t\t!v.get(1).is_name())\r\n\t\t\treturn true;\r\n\t\ttdata tdi;\r\n\t\tif(!zmemb::a_data_define(sh,tdi,v))\r\n\t\t\treturn false;\r\n\t\tv[0].val.clear();\r\n\t\tif(v.count()==2)\r\n\t\t\tv[1].val.clear();//清除未初始化的变量定义\r\n\t\t//如int a(1)这样的定义千万不能重复调用构造函数\r\n\t\trbool bstruct=v.count()>2&&v[2].val==rppoptr(c_sbk_l);\r\n\t\tzpre::arrange(v);\r\n\t\t//排除重复定义的\r\n\t\ttdata* ptdi=zfind::local_search(tfi,tdi.name);\r\n\t\tif(null==ptdi)\r\n\t\t\ttfi.local.push(tdi);\r\n\t\telse\r\n\t\t{\r\n\t\t\tif(ptdi->type!=tdi.type)\r\n\t\t\t{\r\n\t\t\t\tsh.error(v.get(0),\"diff type local var redefined\");\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t}\r\n\t\trbuf<tword> vtemp;\r\n\t\tzadd::add_destructor_func(sh,tdi,vtemp);\r\n\t\tif(!bstruct)\r\n\t\t\tzadd::add_structor_func(sh,tdi,vtemp);\r\n\t\tvtemp+=r_move(v);\r\n\t\tv=r_move(vtemp);\r\n\t\treturn true;\r\n\t}\r\n\r\n\tstatic rbool var_struct_replace(tsh& sh,tfunc& tfi)\r\n\t{\r\n\t\tfor(int i=0;i<tfi.vsent.count();++i)\r\n\t\t{\r\n\t\t\tif(sh.m_key.is_asm_ins(tfi.vsent[i].vword.get_bottom().val))\r\n\t\t\t\tcontinue;\r\n\t\t\tif(!var_struct_replace(sh,tfi.vsent[i].vword,tfi))\r\n\t\t\t{\r\n\t\t\t\tsh.error(tfi.vsent[i],\"var_struct_replace error\");\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn true;\r\n\t}\r\n\r\n\tstatic rbool var_struct_replace(tsh& sh,rbuf<tword>& v,tfunc& tfi)\r\n\t{\r\n\t\t//暂时只处理a(1)，忽略this.a(1)\r\n\t\tint left=1;\r\n\t\tif(v.get(left).val!=rppoptr(c_sbk_l))\r\n\t\t\treturn true;\r\n\t\ttdata* ptdi=zfind::local_search(tfi,v.get(0).val);\r\n\t\tif(ptdi==null)\r\n\t\t\treturn true;\r\n\t\tif(sh.is_quote(ptdi->type))\r\n\t\t\treturn true;\r\n\t\tint right=sh.find_symm_sbk(v,left);\r\n\t\tif(right>=v.count())\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\tif(right!=v.count()-1)\r\n\t\t\treturn true;\r\n\t\t//动态类型和构造函数有歧义\r\n\t\trbuf<tword> vtemp;\r\n\t\tvtemp.push(tword(ptdi->type));\r\n\t\tvtemp.push(tword(rppoptr(c_dot)));\r\n\t\tvtemp.push(tword(ptdi->type));\r\n\t\tvtemp.push(tword(rppoptr(c_sbk_l)));\r\n\t\tvtemp+=v.sub(0,left);\r\n\t\trbuf<tword> vsub=v.sub(left+1,right);\r\n\t\tif(!vsub.empty())\r\n\t\t{\r\n\t\t\tvtemp.push(tword(rppoptr(c_comma)));\r\n\t\t\tvtemp+=vsub;\r\n\t\t}\r\n\t\tvtemp.push(tword(rppoptr(c_sbk_r)));\r\n\t\tv=r_move(vtemp);\r\n\t\treturn true;\r\n\t}\r\n};\r\n\r\n#endif"
  },
  {
    "path": "rpp/zsuper.h",
    "content": "﻿#ifndef zsuper_h__\r\n#define zsuper_h__\r\n\r\n#include \"tsh.h\"\r\n\r\n//超级宏\r\nstruct zsuper\r\n{\r\n\tstatic rbool add_super_mac(tsh& sh,rbuf<tword>& v,int& i,rset<tmac>& vmac)\r\n\t{\r\n\t\ttmac mitem;\r\n\t\tmitem.is_super=true;\r\n\t\tmitem.name=v.get(i+2).val;\r\n\t\tint left=i+3;\r\n\t\tint right=left;\r\n\t\tfor(;right<v.count()&&v[right].pos==v[i].pos;right++)\r\n\t\t\t;\r\n\t\tif(right>=v.count())\r\n\t\t{\r\n\t\t\tsh.error(v.get(i),\"miss mac\");\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\tif(v[right]!=rppoptr(c_bbk_l))\r\n\t\t{\r\n\t\t\tsh.error(v.get(i),\"miss mac $ {\");\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\tmitem.param=sh.vword_to_vstr(v.sub(left,right));\r\n\t\tleft=right;\r\n\t\tright=sh.find_symm_bbk(v,left);\r\n\t\tif(right>=v.count())\r\n\t\t{\r\n\t\t\tsh.error(v.get(i),\"miss mac $ }\");\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\tmitem.vstr=sh.vword_to_vstr(v.sub(left+1,right));\r\n\t\tif(vmac.exist(mitem))\r\n\t\t{\r\n\t\t\tvmac.erase(mitem);\r\n\t\t\t/*sh.error(v.get_bottom(),\"mac redefined\");\r\n\t\t\treturn false;*/\r\n\t\t}\r\n\t\tvmac.insert(mitem);\r\n\t\ti=right;\r\n\t\treturn true;\r\n\t}\r\n\r\n\tstatic rbool replace_item(tsh& sh,rbuf<tword>& v,int& i,tmac& mitem)\r\n\t{\r\n\t\tfor(int j=i+2;j<=v.count();j++)\r\n\t\t{\r\n\t\t\trbuf<tword> arr;\r\n\t\t\trbuf<rstr> src=sh.vword_to_vstr(v.sub(i+1,j));\r\n\t\t\tif(match_here(sh,mitem.param,src,arr))\r\n\t\t\t{\r\n\t\t\t\tifn(replace_super_word(v[i],mitem.vstr,arr))\r\n\t\t\t\t{\r\n\t\t\t\t\tsh.error(v.get(i));\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t}\r\n\t\t\t\tsh.clear_word_val(v,i,j);\r\n\t\t\t\ti=j-1;\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn true;\r\n\t}\r\n\r\n\t//todo 限制递归深度\r\n\tstatic rbool match_here(tsh& sh,const rbuf<rstr>& reg,\r\n\t\tconst rbuf<rstr>& src,rbuf<tword>& arr)\r\n\t{\r\n\t\tif(reg.empty())\r\n\t\t{\r\n\t\t\treturn src.empty();\r\n\t\t}\r\n\t\tif(reg[0]==\"_mword\")\r\n\t\t{\r\n\t\t\treturn match_multi(sh,reg.sub(1),src,arr);\r\n\t\t}\r\n\t\tif(!src.empty())\r\n\t\t{\r\n\t\t\tif(reg[0]==\"_word\")\r\n\t\t\t{\r\n\t\t\t\ttword temp;\r\n\t\t\t\ttemp.multi+=src[0];\r\n\t\t\t\tarr.push_move(temp);\r\n\t\t\t\tif(match_here(sh,reg.sub(1),src.sub(1),arr))\r\n\t\t\t\t{\r\n\t\t\t\t\treturn true;\r\n\t\t\t\t}\r\n\t\t\t\tarr.pop();\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\tif(reg[0]!=src[0])\r\n\t\t\t{\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\tif(src[0]==rppoptr(c_sbk_l))\r\n\t\t\t{\r\n\t\t\t\tint right_r=sh.find_symm_sbk(reg,0);\r\n\t\t\t\tif(right_r>=reg.count())\r\n\t\t\t\t{\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t}\r\n\t\t\t\tint right_s=sh.find_symm_sbk(src,0);\r\n\t\t\t\tif(right_s>=src.count())\r\n\t\t\t\t{\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t}\r\n\t\t\t\treturn match_here(sh,reg.sub(1,right_r),\r\n\t\t\t\t\tsrc.sub(1,right_s),arr)&&\r\n\t\t\t\t\tmatch_here(sh,reg.sub(right_r+1),\r\n\t\t\t\t\tsrc.sub(right_s+1),arr);\r\n\t\t\t}\r\n\t\t\treturn match_here(sh,reg.sub(1),src.sub(1),arr);\r\n\t\t}\r\n\t\treturn false;\r\n\t}\r\n\r\n\tstatic rbool match_multi(tsh& sh,const rbuf<rstr>& reg,\r\n\t\tconst rbuf<rstr>& src,rbuf<tword>& arr)\r\n\t{\r\n\t\tfor(int i=0;i<=src.count();i++)\r\n\t\t{\r\n\t\t\ttword temp;\r\n\t\t\ttemp.multi=src.sub(0,i);\r\n\t\t\tarr.push_move(temp);\r\n\t\t\tif(match_here(sh,reg,src.sub(i),arr))\r\n\t\t\t{\r\n\t\t\t\treturn true;\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\tarr.pop();\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn false;\r\n\t}\r\n\r\n\tstatic rbool replace_super_word(tword& word,rbuf<rstr>& vstr,rbuf<tword>& arr)\r\n\t{\r\n\t\tword.val.clear();\r\n\t\tfor(int i=0;i<vstr.count();i++)\r\n\t\t{\r\n\t\t\tif(vstr[i]==\"$\"&&vstr.get(i+1).is_number())\r\n\t\t\t{\r\n\t\t\t\tint num=vstr.get(i+1).toint();\r\n\t\t\t\tif(num>=arr.count())\r\n\t\t\t\t{\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t}\r\n\t\t\t\tif(vstr.get(i+2)==\"=>\"&&vstr.get(i+3).is_number())\r\n\t\t\t\t{\r\n\t\t\t\t\tint index=vstr.get(i+3).toint();\r\n\t\t\t\t\tif(index>=arr[num].multi.count())\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\treturn false;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tword.multi+=arr[num].multi[index];\r\n\t\t\t\t\ti+=3;\r\n\t\t\t\t}\r\n\t\t\t\telse\r\n\t\t\t\t{\r\n\t\t\t\t\tword.multi+=arr[num].multi;\r\n\t\t\t\t\ti++;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\tword.multi+=vstr[i];\r\n\t\t\t}\r\n\t\t}\r\n\t\tlink_sharp(word.multi);\r\n\t\treturn true;\r\n\t}\r\n\r\n\tstatic rstr del_quote(rstr s)\r\n\t{\r\n\t\tif(s.get_bottom()=='\"')\r\n\t\t{\r\n\t\t\treturn s.sub(1,s.count()-1);\r\n\t\t}\r\n\t\treturn r_move(s);\r\n\t}\r\n\r\n\tstatic rstr add_quote(const rstr& s)\r\n\t{\r\n\t\t//return \"\\\"\"+s+\"\\\"\";\r\n\t\trstr result;\r\n\t\tresult+='\"';\r\n\t\tfor(int i=0;i<s.count();i++)\r\n\t\t{\r\n\t\t\tif(s[i]=='\"')\r\n\t\t\t\tresult+='\\\\';\r\n\t\t\tresult+=s[i];\r\n\t\t}\r\n\t\tresult+='\"';\r\n\t\treturn r_move(result);\r\n\t}\r\n\r\n\tstatic void link_sharp(rbuf<rstr>& v)\r\n\t{\r\n\t\tfor(int i=0;i<c_rpp_deep;i++)\r\n\t\t{\r\n\t\t\tifn(link_sharp_one(v))\r\n\t\t\t{\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tstatic rbool link_sharp_one(rbuf<rstr>& v)\r\n\t{\r\n\t\trbuf<rstr> dst;\r\n\t\trbool ret=false;\r\n\t\tfor(int i=0;i<v.count();i++)\r\n\t\t{\r\n\t\t\tif(i<v.count()-2&&v[i+1]==\"##\")\r\n\t\t\t{\r\n\t\t\t\trstr temp=del_quote(v[i])+del_quote(v[i+2]);\r\n\t\t\t\tif(v[i].get_bottom()=='\"'||v[i+2].get_bottom()=='\"')\r\n\t\t\t\t{\r\n\t\t\t\t\ttemp=add_quote(temp);\r\n\t\t\t\t}\r\n\t\t\t\tdst.push_move(temp);\r\n\t\t\t\ti+=2;\r\n\t\t\t\tret=true;\r\n\t\t\t}\r\n\t\t\telif(i<v.count()-1&&v[i]==\"#\")\r\n\t\t\t{\r\n\t\t\t\tdst.push(add_quote(v[i+1]));\r\n\t\t\t\ti++;\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\tdst.push(v[i]);\r\n\t\t\t}\r\n\t\t}\r\n\t\tv=r_move(dst);\r\n\t\treturn ret;\r\n\t}\r\n};\r\n\r\n#endif\r\n"
  }
]