modl 0.3.16 → 0.3.17

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: de1a3cee98476becc60a2c7dab825c65c30b47e5e8b017ae30c23b8505937e41
4
- data.tar.gz: 85150763932b4136124d120017881baaf34c528cc989709ecc139eaf563bc868
3
+ metadata.gz: dc3336e90f65102b9266f9968a7a81a8def817b081a8ccfa007b0819c49b109a
4
+ data.tar.gz: 0f2bbad0bcc9f1cff56965f9c7a68118917ac398bc0807fb3929237bce4ab76c
5
5
  SHA512:
6
- metadata.gz: 0276b480cfe85fa983b0deac3ca030f5a79d25e6676c781cf3ca8868162adfb30d837d29af4d26d935e41888819b57b9f83141d41d0311dd2fb8ab634e2799c5
7
- data.tar.gz: d2e5547d0fd8225d3739d8d2c3754f40b7b77f0df6f5d415a42201f5dd696beb8f1d25e33c2ee18b635efc15bdc268df20ad97c7188c742825d498234312314f
6
+ metadata.gz: cb919907839936e3251fda5e404ca7f3bb9778f8885e156cfc159a138e204cfa5ac09186ce239477d8038e68a6a400e3f567f9978929c77970b06720375d9d09
7
+ data.tar.gz: 214d394b2044722be42171e802c710901a670120ebfc3d1f810ac82ccb1a85f145d4e8e086bce7419b86f1f8c2c9b72fb7ca3abf66dad0fab5502546b23e9e6d
data/CHANGELOG.md CHANGED
@@ -1,3 +1,9 @@
1
+ 0.3.17
2
+ ===
3
+ - Remove support for `*array`.
4
+ - Add support for unicode escape sequences including `~unnnn` and `\unnnn`
5
+ - Update `*assign` processing to support a more compact form
6
+
1
7
  0.3.16
2
8
  ===
3
9
  - Use latest ruby runtime.
@@ -12,7 +18,7 @@
12
18
  0.3.14
13
19
  ===
14
20
  - MODL Syntax Versioning errors update. GitHub issue #11
15
- - Support for escpaed % characters - GitHub issue #43
21
+ - Support for escaped % characters - GitHub issue #43
16
22
 
17
23
  0.3.13
18
24
  ===
@@ -684,14 +684,14 @@
684
684
  },
685
685
  {
686
686
  "id": "74",
687
- "input": "*class(\n *id=g;\n *name=glossary;\n *superclass=map\n);\n*class(\n *id=t;\n *name=title;\n *superclass=str\n);\n*class(\n *id=d;\n *name=GlossDiv;\n *superclass=map\n);\n*class(\n *id=l;\n *name=GlossList;\n *superclass=map\n);\n*class(\n *id=e;\n *name=GlossEntry;\n *superclass=map;\n *assign[\n [i;s;gt;a;ab;gd;gs]\n ]\n);\n*class(\n *id=i;\n *name=ID;\n *superclass=str\n);\n*class(\n *id=s;\n *name=SortAs;\n *superclass=str\n);\n*class(\n *id=gt;\n *name=GlossTerm;\n *superclass=str\n);\n*class(\n *id=a;\n *name=Acronym;\n *superclass=str\n);\n*class(\n *id=ab;\n *name=Abbrev;\n *superclass=str\n);\n*class(\n *id=gd;\n *name=GlossDef;\n *superclass=map;\n *assign=[\n [p];\n [p;sa]\n ]\n);\n*class(\n *id=p;\n *name=para;\n *superclass=str\n);\n*class(\n *id=sa;\n *name=SeeAlso;\n *superclass=arr\n);\n*class(\n *id=gs;\n *name=GlossSee;\n *superclass=str\n);\n\ng(\n ?=[SGML;markup;language];\n t=example glossary;\n d(\n t=S;\n l(\n e(\n i=%0;\n s=%0;\n gt=Standard Generalized %1.s %2.s;\n a=%0;\n ab=ISO 8879\\:1986;\n gd=A meta-%1 %2, used to create %1 %2%s such as DocBook.\n :[GML;XML];\n gs=%1\n )\n )\n )\n)",
687
+ "input": "*class(\n *id=g;\n *name=glossary;\n *superclass=map\n);\n*class(\n *id=t;\n *name=title;\n *superclass=str\n);\n*class(\n *id=d;\n *name=GlossDiv;\n *superclass=map\n);\n*class(\n *id=l;\n *name=GlossList;\n *superclass=map\n);\n*class(\n *id=e;\n *name=GlossEntry;\n *superclass=map;\n *assign[\n [i;s;gt;a;ab;gd;gs]\n ]\n);\n*class(\n *id=i;\n *name=ID;\n *superclass=str\n);\n*class(\n *id=s;\n *name=SortAs;\n *superclass=str\n);\n*class(\n *id=gt;\n *name=GlossTerm;\n *superclass=str\n);\n*class(\n *id=a;\n *name=Acronym;\n *superclass=str\n);\n*class(\n *id=ab;\n *name=Abbrev;\n *superclass=str\n);\n*class(\n *id=gd;\n *name=GlossDef;\n *assign=[\n [p];\n [p;sa]\n ]\n);\n*class(\n *id=p;\n *name=para;\n *superclass=str\n);\n*class(\n *id=sa;\n *name=SeeAlso;\n *superclass=arr\n);\n*class(\n *id=gs;\n *name=GlossSee;\n *superclass=str\n);\n\ng(\n ?=[SGML;markup;language];\n t=example glossary;\n d(\n t=S;\n l(\n e(\n i=%0;\n s=%0;\n gt=Standard Generalized %1.s %2.s;\n a=%0;\n ab=ISO 8879\\:1986;\n gd=A meta-%1 %2, used to create %1 %2%s such as DocBook.\n :[GML;XML];\n gs=%1\n )\n )\n )\n)",
688
688
  "expected_output": "{\n \"glossary\": {\n \"title\": \"example glossary\",\n \"GlossDiv\": {\n \"title\": \"S\",\n \"GlossList\": {\n \"GlossEntry\": {\n \"ID\": \"SGML\",\n \"SortAs\": \"SGML\",\n \"GlossTerm\": \"Standard Generalized Markup Language\",\n \"Acronym\": \"SGML\",\n \"Abbrev\": \"ISO 8879:1986\",\n \"GlossDef\": {\n \"para\": \"A meta-markup language, used to create markup languages such as DocBook.\",\n \"SeeAlso\": [\n \"GML\",\n \"XML\"\n ]\n },\n \"GlossSee\": \"markup\"\n }\n }\n }\n }\n}",
689
689
  "tested_features": [
690
690
  "class",
691
691
  "object_ref",
692
692
  "string_method"
693
693
  ],
694
- "minimised_modl": "*c(*i=g;*n=glossary;*s=map);*c(*i=t;*n=title;*s=str);*c(*i=d;*n=GlossDiv;*s=map);*c(*i=l;*n=GlossList;*s=map);*c(*i=e;*n=GlossEntry;*s=map;*a[[i;s;gt;a;ab;gd;gs]]);*c(*i=i;*n=ID;*s=str);*c(*i=s;*n=SortAs;*s=str);*c(*i=gt;*n=GlossTerm;*s=str);*c(*i=a;*n=Acronym;*s=str);*c(*i=ab;*n=Abbrev;*s=str);*c(*i=gd;*n=GlossDef;*s=map;*a=[p]:[p;sa]);*c(*i=p;*n=para;*s=str);*c(*i=sa;*n=SeeAlso;*s=arr);*c(*i=gs;*n=GlossSee;*s=str);g(?=SGML:markup:language;t=example glossary;d(t=S;l(e(i=%0;s=%0;gt=Standard Generalized %1.s %2.s;a=%0;ab=ISO 8879~:1986;gd=A meta-%1 %2, used to create %1 %2%s such as DocBook.:[GML;XML];gs=%1))))"
694
+ "minimised_modl": "*c(*i=g;*n=glossary;*s=map);*c(*i=t;*n=title;*s=str);*c(*i=d;*n=GlossDiv;*s=map);*c(*i=l;*n=GlossList;*s=map);*c(*i=e;*n=GlossEntry;*s=map;*a[[i;s;gt;a;ab;gd;gs]]);*c(*i=i;*n=ID;*s=str);*c(*i=s;*n=SortAs;*s=str);*c(*i=gt;*n=GlossTerm;*s=str);*c(*i=a;*n=Acronym;*s=str);*c(*i=ab;*n=Abbrev;*s=str);*c(*i=gd;*n=GlossDef;*a=[p]:[p;sa]);*c(*i=p;*n=para;*s=str);*c(*i=sa;*n=SeeAlso;*s=arr);*c(*i=gs;*n=GlossSee;*s=str);g(?=SGML:markup:language;t=example glossary;d(t=S;l(e(i=%0;s=%0;gt=Standard Generalized %1.s %2.s;a=%0;ab=ISO 8879~:1986;gd=A meta-%1 %2, used to create %1 %2%s such as DocBook.:[GML;XML];gs=%1))))"
695
695
  },
696
696
  {
697
697
  "id": "75",
@@ -765,13 +765,13 @@
765
765
  },
766
766
  {
767
767
  "id": "82",
768
- "input": "*class(\n *id=desc;\n *name=description;\n *superclass=str\n);\n\n*class(\n *id=val;\n *name=value;\n *superclass=str\n);\n\n*class(\n *id=media1;\n *name=media1;\n *superclass=map;\n *assign=[\n [desc;val]\n ]\n);\n\n*class(\n *id=media2;\n *name=media2;\n *superclass=map;\n *assign=[\n [desc;val]\n ]\n);\n*class(\n *id=list;\n *name=list;\n *superclass=map;\n *assign[\n [media1;media2]\n ]\n);\n\n\nlist=[tel;fb]:[yt;tw]",
769
- "expected_output": "{\n \"list\": {\n \"media1\": {\n \"description\": \"tel\",\n \"value\": \"fb\"\n },\n \"media2\": {\n \"description\": \"yt\",\n \"value\": \"tw\"\n }\n }\n}",
768
+ "input": "*class(\n *id=desc;\n *name=description;\n *superclass=str\n);\n\n*class(\n *id=val;\n *name=value;\n *superclass=str\n);\n\n*class(\n *id=media1;\n *name=media1;\n *assign=[\n [desc;val]\n ]\n);\n\n*class(\n *id=media2;\n *name=media2;\n *assign=[\n [desc;val]\n ]\n);\n*class(\n *id=list;\n *name=list;\n *assign[\n [media1;media2]\n ]\n);\n\n\nlist=[tel;fb]:[yt;tw]",
769
+ "expected_output": "{\n \"list\": [\n {\n \"description\": \"tel\",\n \"value\": \"fb\"\n },\n {\n \"description\": \"yt\",\n \"value\": \"tw\"\n }\n ]\n}",
770
770
  "tested_features": [
771
771
  "class",
772
772
  "assign"
773
773
  ],
774
- "minimised_modl": "*c(*i=desc;*n=description;*s=str);*c(*i=val;*n=value;*s=str);*c(*i=media1;*n=media1;*s=map;*a[[desc;val]]);*c(*i=media2;*n=media2;*s=map;*a[[desc;val]]);*c(*i=list;*n=list;*s=map;*a[[media1;media2]]);list=[tel;fb]:[yt;tw]"
774
+ "minimised_modl": "*class(*id=desc;*name=description;*superclass=str);*class(*id=val;*name=value;*superclass=str);*class(*id=media1;*name=media1;*assign=[[desc;val]]);*class(*id=media2;*name=media2;*assign=[[desc;val]]);*class(*id=list;*name=list;*assign[[media1;media2]]);list=[tel;fb]:[yt;tw]"
775
775
  },
776
776
  {
777
777
  "id": "83",
@@ -3014,11 +3014,29 @@
3014
3014
  },
3015
3015
  {
3016
3016
  "id": "316",
3017
- "input": "*array(\n *id=p;\n *name=people;\n *of=person\n );\n\n *class(\n *id=n;\n *name=name\n );\n\n *class(\n *id=a;\n *name=age\n );\n\n *class(\n *id=person;\n *assign=[\n [n;a]\n ]\n );\n\n data(\n p[[John;18];[Jane;20]];\n person=[Fred;21]\n );\n p[[Mary;18];[Mungo;19];[Midge;20]];\n person=[Rod;23]\n",
3018
- "expected_output": "{\n \"data\": {\n \"people\": [\n {\n \"name\": \"John\",\n \"age\": 18\n },\n {\n \"name\": \"Jane\",\n \"age\": 20\n }\n ],\n \"person\": {\n \"name\": \"Fred\",\n \"age\": 21\n }\n },\n \"people\": [\n {\n \"name\": \"Mary\",\n \"age\": 18\n },\n {\n \"name\": \"Mungo\",\n \"age\": 19\n },\n {\n \"name\": \"Midge\",\n \"age\": 20\n }\n ],\n \"person\": {\n \"name\": \"Rod\",\n \"age\": 23\n }\n}",
3017
+ "input": "We\\\\u2019re=We\\\\u2019re;You~u2019re=We~u2019re",
3018
+ "expected_output": "{\n \"We’re\": \"We’re\",\n \"You’re\": \"We’re\"\n}",
3019
3019
  "tested_features": [
3020
- "*arrays"
3020
+ "unicode"
3021
3021
  ],
3022
- "minimised_modl": "*array(*id=p;*name=people;*of=person);*class(*id=n;*name=name);*class(*id=a;*name=age);*class(*id=person;*assign=[[n;a]]);data(p[[John;18];[Jane;20]];person=[Fred;21]);p[[Mary;18];[Mungo;19];[Midge;20]];person=[Rod;23]"
3022
+ "minimised_modl": "We\\\\u2019re=We\\\\u2019re;You~u2019re=We~u2019re"
3023
+ },
3024
+ {
3025
+ "id": "317",
3026
+ "input": "*class(\n *id=numbers;\n *assign=[[one;two;three]]\n);\n*class(\n *id=letters;\n *assign=[[a;b;c]]\n);\n*class(\n *id=myArray;\n *assign=[[letters;numbers]]\n);\nmyArray=[[a;b;c];[1;2;3]]",
3027
+ "expected_output": "{\n \"myArray\": [\n {\n \"a\": \"a\",\n \"b\": \"b\",\n \"c\": \"c\"\n },\n {\n \"one\": 1,\n \"two\": 2,\n \"three\": 3\n }\n ]\n}",
3028
+ "tested_features": [
3029
+ "class"
3030
+ ],
3031
+ "minimised_modl": "*class(*id=numbers;*assign=[[one;two;three]]);*class(*id=letters;*assign=[[a;b;c]]);*class(*id=myArray;*assign=[[letters;numbers]]);myArray=[[a;b;c];[1;2;3]]"
3032
+ },
3033
+ {
3034
+ "id": "318",
3035
+ "input": "*class(\n *id=root;\n *assign=[[myArray]]\n);\n*class(\n *id=numbers;\n *assign=[[one;two;three]]\n);\n*class(\n *id=letters;\n *assign=[[a;b;c]]\n);\n*class(\n *id=myArray;\n *assign=[[letters;numbers]]\n);\n\n[[a;b;c];[1;2;3]]\n",
3036
+ "expected_output": "{\n \"myArray\": [\n {\n \"a\": \"a\",\n \"b\": \"b\",\n \"c\": \"c\"\n },\n {\n \"one\": 1,\n \"two\": 2,\n \"three\": 3\n }\n ]\n}",
3037
+ "tested_features": [
3038
+ "class"
3039
+ ],
3040
+ "minimised_modl": "*class(*id=root;*assign=[[myArray]]);*class(*id=numbers;*assign=[[one;two;three]]);*class(*id=letters;*assign=[[a;b;c]]);*class(*id=myArray;*assign=[[letters;numbers]]);[[a;b;c];[1;2;3]]"
3023
3041
  }
3024
3042
  ]
@@ -129,4 +129,4 @@ DEFAULT_MODE
129
129
  CONDITIONAL
130
130
 
131
131
  atn:
132
- [3, 24715, 42794, 33075, 47597, 16764, 15335, 30598, 22884, 2, 31, 499, 8, 1, 8, 1, 4, 2, 9, 2, 4, 3, 9, 3, 4, 4, 9, 4, 4, 5, 9, 5, 4, 6, 9, 6, 4, 7, 9, 7, 4, 8, 9, 8, 4, 9, 9, 9, 4, 10, 9, 10, 4, 11, 9, 11, 4, 12, 9, 12, 4, 13, 9, 13, 4, 14, 9, 14, 4, 15, 9, 15, 4, 16, 9, 16, 4, 17, 9, 17, 4, 18, 9, 18, 4, 19, 9, 19, 4, 20, 9, 20, 4, 21, 9, 21, 4, 22, 9, 22, 4, 23, 9, 23, 4, 24, 9, 24, 4, 25, 9, 25, 4, 26, 9, 26, 4, 27, 9, 27, 4, 28, 9, 28, 4, 29, 9, 29, 4, 30, 9, 30, 4, 31, 9, 31, 4, 32, 9, 32, 4, 33, 9, 33, 4, 34, 9, 34, 4, 35, 9, 35, 4, 36, 9, 36, 4, 37, 9, 37, 4, 38, 9, 38, 4, 39, 9, 39, 4, 40, 9, 40, 4, 41, 9, 41, 4, 42, 9, 42, 4, 43, 9, 43, 4, 44, 9, 44, 4, 45, 9, 45, 4, 46, 9, 46, 4, 47, 9, 47, 4, 48, 9, 48, 4, 49, 9, 49, 4, 50, 9, 50, 4, 51, 9, 51, 4, 52, 9, 52, 4, 53, 9, 53, 4, 54, 9, 54, 4, 55, 9, 55, 4, 56, 9, 56, 4, 57, 9, 57, 3, 2, 6, 2, 118, 10, 2, 13, 2, 14, 2, 119, 3, 2, 3, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 5, 3, 135, 10, 3, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 5, 4, 147, 10, 4, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 5, 5, 161, 10, 5, 3, 6, 3, 6, 3, 7, 3, 7, 3, 8, 3, 8, 3, 9, 3, 9, 3, 10, 3, 10, 3, 11, 3, 11, 3, 12, 3, 12, 3, 13, 3, 13, 3, 14, 5, 14, 180, 10, 14, 3, 14, 3, 14, 3, 14, 6, 14, 185, 10, 14, 13, 14, 14, 14, 186, 5, 14, 189, 10, 14, 3, 14, 5, 14, 192, 10, 14, 3, 15, 3, 15, 3, 15, 7, 15, 197, 10, 15, 12, 15, 14, 15, 200, 11, 15, 5, 15, 202, 10, 15, 3, 16, 3, 16, 5, 16, 206, 10, 16, 3, 16, 3, 16, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 18, 7, 18, 218, 10, 18, 12, 18, 14, 18, 221, 11, 18, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 7, 19, 229, 10, 19, 12, 19, 14, 19, 232, 11, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 5, 19, 239, 10, 19, 3, 20, 3, 20, 3, 21, 7, 21, 244, 10, 21, 12, 21, 14, 21, 247, 11, 21, 3, 22, 3, 22, 5, 22, 251, 10, 22, 3, 22, 3, 22, 3, 22, 6, 22, 256, 10, 22, 13, 22, 14, 22, 257, 3, 22, 5, 22, 261, 10, 22, 3, 22, 6, 22, 264, 10, 22, 13, 22, 14, 22, 265, 3, 22, 5, 22, 269, 10, 22, 3, 22, 3, 22, 6, 22, 273, 10, 22, 13, 22, 14, 22, 274, 7, 22, 277, 10, 22, 12, 22, 14, 22, 280, 11, 22, 3, 23, 3, 23, 3, 24, 3, 24, 3, 25, 3, 25, 3, 25, 5, 25, 289, 10, 25, 3, 25, 3, 25, 3, 25, 3, 25, 5, 25, 295, 10, 25, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 27, 3, 27, 3, 28, 3, 28, 3, 28, 3, 29, 3, 29, 3, 29, 3, 29, 3, 30, 6, 30, 313, 10, 30, 13, 30, 14, 30, 314, 3, 30, 3, 30, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 5, 31, 330, 10, 31, 3, 31, 3, 31, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 5, 32, 344, 10, 32, 3, 32, 3, 32, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 5, 33, 360, 10, 33, 3, 33, 3, 33, 3, 34, 3, 34, 3, 34, 3, 34, 3, 35, 3, 35, 3, 35, 3, 35, 3, 36, 3, 36, 3, 36, 3, 36, 3, 37, 3, 37, 3, 37, 3, 37, 3, 38, 3, 38, 3, 38, 3, 38, 3, 39, 3, 39, 3, 39, 3, 39, 3, 40, 3, 40, 3, 40, 3, 40, 3, 41, 5, 41, 393, 10, 41, 3, 41, 3, 41, 3, 41, 6, 41, 398, 10, 41, 13, 41, 14, 41, 399, 5, 41, 402, 10, 41, 3, 41, 5, 41, 405, 10, 41, 3, 41, 3, 41, 3, 42, 3, 42, 3, 43, 3, 43, 3, 44, 3, 44, 3, 45, 3, 45, 3, 46, 3, 46, 3, 47, 3, 47, 3, 48, 3, 48, 3, 49, 3, 49, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 3, 51, 3, 51, 3, 51, 3, 51, 3, 51, 3, 51, 7, 51, 436, 10, 51, 12, 51, 14, 51, 439, 11, 51, 3, 51, 3, 51, 3, 51, 3, 51, 3, 51, 5, 51, 446, 10, 51, 3, 51, 3, 51, 3, 52, 3, 52, 6, 52, 452, 10, 52, 13, 52, 14, 52, 453, 3, 52, 6, 52, 457, 10, 52, 13, 52, 14, 52, 458, 3, 52, 3, 52, 6, 52, 463, 10, 52, 13, 52, 14, 52, 464, 7, 52, 467, 10, 52, 12, 52, 14, 52, 470, 11, 52, 3, 52, 3, 52, 3, 53, 3, 53, 3, 54, 3, 54, 3, 55, 3, 55, 3, 55, 5, 55, 481, 10, 55, 3, 55, 3, 55, 3, 55, 3, 55, 5, 55, 487, 10, 55, 3, 56, 3, 56, 3, 56, 3, 56, 3, 56, 3, 56, 3, 56, 3, 57, 3, 57, 3, 57, 3, 57, 2, 2, 58, 4, 3, 6, 4, 8, 5, 10, 6, 12, 7, 14, 8, 16, 9, 18, 10, 20, 11, 22, 12, 24, 13, 26, 14, 28, 15, 30, 2, 32, 2, 34, 16, 36, 2, 38, 17, 40, 2, 42, 2, 44, 18, 46, 2, 48, 2, 50, 2, 52, 2, 54, 2, 56, 19, 58, 20, 60, 21, 62, 2, 64, 2, 66, 2, 68, 2, 70, 2, 72, 2, 74, 2, 76, 2, 78, 2, 80, 2, 82, 2, 84, 22, 86, 23, 88, 24, 90, 25, 92, 26, 94, 27, 96, 28, 98, 29, 100, 2, 102, 2, 104, 2, 106, 2, 108, 2, 110, 2, 112, 30, 114, 31, 4, 2, 3, 14, 5, 2, 11, 12, 15, 15, 34, 34, 3, 2, 50, 59, 3, 2, 51, 59, 4, 2, 71, 71, 103, 103, 4, 2, 45, 45, 47, 47, 4, 2, 12, 12, 15, 15, 3, 2, 36, 36, 3, 2, 98, 98, 12, 2, 10, 12, 14, 15, 34, 34, 36, 37, 42, 43, 60, 61, 63, 63, 93, 95, 125, 125, 127, 128, 9, 2, 49, 49, 94, 94, 100, 100, 104, 104, 112, 112, 116, 116, 118, 118, 5, 2, 50, 59, 67, 72, 99, 104, 11, 2, 10, 12, 14, 15, 34, 37, 40, 40, 42, 43, 49, 49, 60, 65, 93, 95, 125, 128, 2, 541, 2, 4, 3, 2, 2, 2, 2, 6, 3, 2, 2, 2, 2, 8, 3, 2, 2, 2, 2, 10, 3, 2, 2, 2, 2, 12, 3, 2, 2, 2, 2, 14, 3, 2, 2, 2, 2, 16, 3, 2, 2, 2, 2, 18, 3, 2, 2, 2, 2, 20, 3, 2, 2, 2, 2, 22, 3, 2, 2, 2, 2, 24, 3, 2, 2, 2, 2, 26, 3, 2, 2, 2, 2, 28, 3, 2, 2, 2, 2, 34, 3, 2, 2, 2, 2, 38, 3, 2, 2, 2, 2, 44, 3, 2, 2, 2, 2, 56, 3, 2, 2, 2, 2, 58, 3, 2, 2, 2, 3, 60, 3, 2, 2, 2, 3, 62, 3, 2, 2, 2, 3, 64, 3, 2, 2, 2, 3, 66, 3, 2, 2, 2, 3, 68, 3, 2, 2, 2, 3, 70, 3, 2, 2, 2, 3, 72, 3, 2, 2, 2, 3, 74, 3, 2, 2, 2, 3, 76, 3, 2, 2, 2, 3, 78, 3, 2, 2, 2, 3, 80, 3, 2, 2, 2, 3, 82, 3, 2, 2, 2, 3, 84, 3, 2, 2, 2, 3, 86, 3, 2, 2, 2, 3, 88, 3, 2, 2, 2, 3, 90, 3, 2, 2, 2, 3, 92, 3, 2, 2, 2, 3, 94, 3, 2, 2, 2, 3, 96, 3, 2, 2, 2, 3, 98, 3, 2, 2, 2, 3, 100, 3, 2, 2, 2, 3, 102, 3, 2, 2, 2, 3, 104, 3, 2, 2, 2, 3, 112, 3, 2, 2, 2, 3, 114, 3, 2, 2, 2, 4, 117, 3, 2, 2, 2, 6, 134, 3, 2, 2, 2, 8, 146, 3, 2, 2, 2, 10, 160, 3, 2, 2, 2, 12, 162, 3, 2, 2, 2, 14, 164, 3, 2, 2, 2, 16, 166, 3, 2, 2, 2, 18, 168, 3, 2, 2, 2, 20, 170, 3, 2, 2, 2, 22, 172, 3, 2, 2, 2, 24, 174, 3, 2, 2, 2, 26, 176, 3, 2, 2, 2, 28, 179, 3, 2, 2, 2, 30, 201, 3, 2, 2, 2, 32, 203, 3, 2, 2, 2, 34, 209, 3, 2, 2, 2, 36, 219, 3, 2, 2, 2, 38, 238, 3, 2, 2, 2, 40, 240, 3, 2, 2, 2, 42, 245, 3, 2, 2, 2, 44, 250, 3, 2, 2, 2, 46, 281, 3, 2, 2, 2, 48, 283, 3, 2, 2, 2, 50, 294, 3, 2, 2, 2, 52, 296, 3, 2, 2, 2, 54, 302, 3, 2, 2, 2, 56, 304, 3, 2, 2, 2, 58, 307, 3, 2, 2, 2, 60, 312, 3, 2, 2, 2, 62, 329, 3, 2, 2, 2, 64, 343, 3, 2, 2, 2, 66, 359, 3, 2, 2, 2, 68, 363, 3, 2, 2, 2, 70, 367, 3, 2, 2, 2, 72, 371, 3, 2, 2, 2, 74, 375, 3, 2, 2, 2, 76, 379, 3, 2, 2, 2, 78, 383, 3, 2, 2, 2, 80, 387, 3, 2, 2, 2, 82, 392, 3, 2, 2, 2, 84, 408, 3, 2, 2, 2, 86, 410, 3, 2, 2, 2, 88, 412, 3, 2, 2, 2, 90, 414, 3, 2, 2, 2, 92, 416, 3, 2, 2, 2, 94, 418, 3, 2, 2, 2, 96, 420, 3, 2, 2, 2, 98, 422, 3, 2, 2, 2, 100, 424, 3, 2, 2, 2, 102, 445, 3, 2, 2, 2, 104, 451, 3, 2, 2, 2, 106, 473, 3, 2, 2, 2, 108, 475, 3, 2, 2, 2, 110, 486, 3, 2, 2, 2, 112, 488, 3, 2, 2, 2, 114, 495, 3, 2, 2, 2, 116, 118, 9, 2, 2, 2, 117, 116, 3, 2, 2, 2, 118, 119, 3, 2, 2, 2, 119, 117, 3, 2, 2, 2, 119, 120, 3, 2, 2, 2, 120, 121, 3, 2, 2, 2, 121, 122, 8, 2, 2, 2, 122, 5, 3, 2, 2, 2, 123, 124, 7, 50, 2, 2, 124, 125, 7, 50, 2, 2, 125, 135, 7, 50, 2, 2, 126, 127, 7, 112, 2, 2, 127, 128, 7, 119, 2, 2, 128, 129, 7, 110, 2, 2, 129, 135, 7, 110, 2, 2, 130, 131, 7, 80, 2, 2, 131, 132, 7, 87, 2, 2, 132, 133, 7, 78, 2, 2, 133, 135, 7, 78, 2, 2, 134, 123, 3, 2, 2, 2, 134, 126, 3, 2, 2, 2, 134, 130, 3, 2, 2, 2, 135, 7, 3, 2, 2, 2, 136, 137, 7, 50, 2, 2, 137, 147, 7, 51, 2, 2, 138, 139, 7, 118, 2, 2, 139, 140, 7, 116, 2, 2, 140, 141, 7, 119, 2, 2, 141, 147, 7, 103, 2, 2, 142, 143, 7, 86, 2, 2, 143, 144, 7, 84, 2, 2, 144, 145, 7, 87, 2, 2, 145, 147, 7, 71, 2, 2, 146, 136, 3, 2, 2, 2, 146, 138, 3, 2, 2, 2, 146, 142, 3, 2, 2, 2, 147, 9, 3, 2, 2, 2, 148, 149, 7, 50, 2, 2, 149, 161, 7, 50, 2, 2, 150, 151, 7, 104, 2, 2, 151, 152, 7, 99, 2, 2, 152, 153, 7, 110, 2, 2, 153, 154, 7, 117, 2, 2, 154, 161, 7, 103, 2, 2, 155, 156, 7, 72, 2, 2, 156, 157, 7, 67, 2, 2, 157, 158, 7, 78, 2, 2, 158, 159, 7, 85, 2, 2, 159, 161, 7, 71, 2, 2, 160, 148, 3, 2, 2, 2, 160, 150, 3, 2, 2, 2, 160, 155, 3, 2, 2, 2, 161, 11, 3, 2, 2, 2, 162, 163, 7, 60, 2, 2, 163, 13, 3, 2, 2, 2, 164, 165, 7, 63, 2, 2, 165, 15, 3, 2, 2, 2, 166, 167, 7, 61, 2, 2, 167, 17, 3, 2, 2, 2, 168, 169, 7, 46, 2, 2, 169, 19, 3, 2, 2, 2, 170, 171, 7, 42, 2, 2, 171, 21, 3, 2, 2, 2, 172, 173, 7, 43, 2, 2, 173, 23, 3, 2, 2, 2, 174, 175, 7, 93, 2, 2, 175, 25, 3, 2, 2, 2, 176, 177, 7, 95, 2, 2, 177, 27, 3, 2, 2, 2, 178, 180, 7, 47, 2, 2, 179, 178, 3, 2, 2, 2, 179, 180, 3, 2, 2, 2, 180, 181, 3, 2, 2, 2, 181, 188, 5, 30, 15, 2, 182, 184, 7, 48, 2, 2, 183, 185, 9, 3, 2, 2, 184, 183, 3, 2, 2, 2, 185, 186, 3, 2, 2, 2, 186, 184, 3, 2, 2, 2, 186, 187, 3, 2, 2, 2, 187, 189, 3, 2, 2, 2, 188, 182, 3, 2, 2, 2, 188, 189, 3, 2, 2, 2, 189, 191, 3, 2, 2, 2, 190, 192, 5, 32, 16, 2, 191, 190, 3, 2, 2, 2, 191, 192, 3, 2, 2, 2, 192, 29, 3, 2, 2, 2, 193, 202, 7, 50, 2, 2, 194, 198, 9, 4, 2, 2, 195, 197, 9, 3, 2, 2, 196, 195, 3, 2, 2, 2, 197, 200, 3, 2, 2, 2, 198, 196, 3, 2, 2, 2, 198, 199, 3, 2, 2, 2, 199, 202, 3, 2, 2, 2, 200, 198, 3, 2, 2, 2, 201, 193, 3, 2, 2, 2, 201, 194, 3, 2, 2, 2, 202, 31, 3, 2, 2, 2, 203, 205, 9, 5, 2, 2, 204, 206, 9, 6, 2, 2, 205, 204, 3, 2, 2, 2, 205, 206, 3, 2, 2, 2, 206, 207, 3, 2, 2, 2, 207, 208, 5, 30, 15, 2, 208, 33, 3, 2, 2, 2, 209, 210, 7, 37, 2, 2, 210, 211, 7, 37, 2, 2, 211, 212, 3, 2, 2, 2, 212, 213, 5, 36, 18, 2, 213, 214, 3, 2, 2, 2, 214, 215, 8, 17, 2, 2, 215, 35, 3, 2, 2, 2, 216, 218, 10, 7, 2, 2, 217, 216, 3, 2, 2, 2, 218, 221, 3, 2, 2, 2, 219, 217, 3, 2, 2, 2, 219, 220, 3, 2, 2, 2, 220, 37, 3, 2, 2, 2, 221, 219, 3, 2, 2, 2, 222, 230, 7, 36, 2, 2, 223, 229, 5, 40, 20, 2, 224, 225, 7, 128, 2, 2, 225, 229, 7, 36, 2, 2, 226, 227, 7, 94, 2, 2, 227, 229, 7, 36, 2, 2, 228, 223, 3, 2, 2, 2, 228, 224, 3, 2, 2, 2, 228, 226, 3, 2, 2, 2, 229, 232, 3, 2, 2, 2, 230, 228, 3, 2, 2, 2, 230, 231, 3, 2, 2, 2, 231, 233, 3, 2, 2, 2, 232, 230, 3, 2, 2, 2, 233, 239, 7, 36, 2, 2, 234, 235, 7, 98, 2, 2, 235, 236, 5, 42, 21, 2, 236, 237, 7, 98, 2, 2, 237, 239, 3, 2, 2, 2, 238, 222, 3, 2, 2, 2, 238, 234, 3, 2, 2, 2, 239, 39, 3, 2, 2, 2, 240, 241, 10, 8, 2, 2, 241, 41, 3, 2, 2, 2, 242, 244, 10, 9, 2, 2, 243, 242, 3, 2, 2, 2, 244, 247, 3, 2, 2, 2, 245, 243, 3, 2, 2, 2, 245, 246, 3, 2, 2, 2, 246, 43, 3, 2, 2, 2, 247, 245, 3, 2, 2, 2, 248, 249, 7, 37, 2, 2, 249, 251, 7, 34, 2, 2, 250, 248, 3, 2, 2, 2, 250, 251, 3, 2, 2, 2, 251, 255, 3, 2, 2, 2, 252, 256, 5, 50, 25, 2, 253, 256, 5, 46, 23, 2, 254, 256, 5, 56, 28, 2, 255, 252, 3, 2, 2, 2, 255, 253, 3, 2, 2, 2, 255, 254, 3, 2, 2, 2, 256, 257, 3, 2, 2, 2, 257, 255, 3, 2, 2, 2, 257, 258, 3, 2, 2, 2, 258, 278, 3, 2, 2, 2, 259, 261, 7, 37, 2, 2, 260, 259, 3, 2, 2, 2, 260, 261, 3, 2, 2, 2, 261, 263, 3, 2, 2, 2, 262, 264, 7, 34, 2, 2, 263, 262, 3, 2, 2, 2, 264, 265, 3, 2, 2, 2, 265, 263, 3, 2, 2, 2, 265, 266, 3, 2, 2, 2, 266, 268, 3, 2, 2, 2, 267, 269, 7, 37, 2, 2, 268, 267, 3, 2, 2, 2, 268, 269, 3, 2, 2, 2, 269, 272, 3, 2, 2, 2, 270, 273, 5, 50, 25, 2, 271, 273, 5, 46, 23, 2, 272, 270, 3, 2, 2, 2, 272, 271, 3, 2, 2, 2, 273, 274, 3, 2, 2, 2, 274, 272, 3, 2, 2, 2, 274, 275, 3, 2, 2, 2, 275, 277, 3, 2, 2, 2, 276, 260, 3, 2, 2, 2, 277, 280, 3, 2, 2, 2, 278, 276, 3, 2, 2, 2, 278, 279, 3, 2, 2, 2, 279, 45, 3, 2, 2, 2, 280, 278, 3, 2, 2, 2, 281, 282, 10, 10, 2, 2, 282, 47, 3, 2, 2, 2, 283, 284, 9, 10, 2, 2, 284, 49, 3, 2, 2, 2, 285, 288, 7, 94, 2, 2, 286, 289, 9, 11, 2, 2, 287, 289, 5, 52, 26, 2, 288, 286, 3, 2, 2, 2, 288, 287, 3, 2, 2, 2, 289, 295, 3, 2, 2, 2, 290, 291, 7, 94, 2, 2, 291, 295, 5, 48, 24, 2, 292, 293, 7, 128, 2, 2, 293, 295, 5, 48, 24, 2, 294, 285, 3, 2, 2, 2, 294, 290, 3, 2, 2, 2, 294, 292, 3, 2, 2, 2, 295, 51, 3, 2, 2, 2, 296, 297, 7, 119, 2, 2, 297, 298, 5, 54, 27, 2, 298, 299, 5, 54, 27, 2, 299, 300, 5, 54, 27, 2, 300, 301, 5, 54, 27, 2, 301, 53, 3, 2, 2, 2, 302, 303, 9, 12, 2, 2, 303, 55, 3, 2, 2, 2, 304, 305, 7, 37, 2, 2, 305, 306, 5, 44, 22, 2, 306, 57, 3, 2, 2, 2, 307, 308, 7, 125, 2, 2, 308, 309, 3, 2, 2, 2, 309, 310, 8, 29, 3, 2, 310, 59, 3, 2, 2, 2, 311, 313, 9, 2, 2, 2, 312, 311, 3, 2, 2, 2, 313, 314, 3, 2, 2, 2, 314, 312, 3, 2, 2, 2, 314, 315, 3, 2, 2, 2, 315, 316, 3, 2, 2, 2, 316, 317, 8, 30, 2, 2, 317, 61, 3, 2, 2, 2, 318, 319, 7, 50, 2, 2, 319, 320, 7, 50, 2, 2, 320, 330, 7, 50, 2, 2, 321, 322, 7, 112, 2, 2, 322, 323, 7, 119, 2, 2, 323, 324, 7, 110, 2, 2, 324, 330, 7, 110, 2, 2, 325, 326, 7, 80, 2, 2, 326, 327, 7, 87, 2, 2, 327, 328, 7, 78, 2, 2, 328, 330, 7, 78, 2, 2, 329, 318, 3, 2, 2, 2, 329, 321, 3, 2, 2, 2, 329, 325, 3, 2, 2, 2, 330, 331, 3, 2, 2, 2, 331, 332, 8, 31, 4, 2, 332, 63, 3, 2, 2, 2, 333, 334, 7, 50, 2, 2, 334, 344, 7, 51, 2, 2, 335, 336, 7, 118, 2, 2, 336, 337, 7, 116, 2, 2, 337, 338, 7, 119, 2, 2, 338, 344, 7, 103, 2, 2, 339, 340, 7, 86, 2, 2, 340, 341, 7, 84, 2, 2, 341, 342, 7, 87, 2, 2, 342, 344, 7, 71, 2, 2, 343, 333, 3, 2, 2, 2, 343, 335, 3, 2, 2, 2, 343, 339, 3, 2, 2, 2, 344, 345, 3, 2, 2, 2, 345, 346, 8, 32, 5, 2, 346, 65, 3, 2, 2, 2, 347, 348, 7, 50, 2, 2, 348, 360, 7, 50, 2, 2, 349, 350, 7, 104, 2, 2, 350, 351, 7, 99, 2, 2, 351, 352, 7, 110, 2, 2, 352, 353, 7, 117, 2, 2, 353, 360, 7, 103, 2, 2, 354, 355, 7, 72, 2, 2, 355, 356, 7, 67, 2, 2, 356, 357, 7, 78, 2, 2, 357, 358, 7, 85, 2, 2, 358, 360, 7, 71, 2, 2, 359, 347, 3, 2, 2, 2, 359, 349, 3, 2, 2, 2, 359, 354, 3, 2, 2, 2, 360, 361, 3, 2, 2, 2, 361, 362, 8, 33, 6, 2, 362, 67, 3, 2, 2, 2, 363, 364, 7, 60, 2, 2, 364, 365, 3, 2, 2, 2, 365, 366, 8, 34, 7, 2, 366, 69, 3, 2, 2, 2, 367, 368, 7, 63, 2, 2, 368, 369, 3, 2, 2, 2, 369, 370, 8, 35, 8, 2, 370, 71, 3, 2, 2, 2, 371, 372, 7, 61, 2, 2, 372, 373, 3, 2, 2, 2, 373, 374, 8, 36, 9, 2, 374, 73, 3, 2, 2, 2, 375, 376, 7, 42, 2, 2, 376, 377, 3, 2, 2, 2, 377, 378, 8, 37, 10, 2, 378, 75, 3, 2, 2, 2, 379, 380, 7, 43, 2, 2, 380, 381, 3, 2, 2, 2, 381, 382, 8, 38, 11, 2, 382, 77, 3, 2, 2, 2, 383, 384, 7, 93, 2, 2, 384, 385, 3, 2, 2, 2, 385, 386, 8, 39, 12, 2, 386, 79, 3, 2, 2, 2, 387, 388, 7, 95, 2, 2, 388, 389, 3, 2, 2, 2, 389, 390, 8, 40, 13, 2, 390, 81, 3, 2, 2, 2, 391, 393, 7, 47, 2, 2, 392, 391, 3, 2, 2, 2, 392, 393, 3, 2, 2, 2, 393, 394, 3, 2, 2, 2, 394, 401, 5, 30, 15, 2, 395, 397, 7, 48, 2, 2, 396, 398, 9, 3, 2, 2, 397, 396, 3, 2, 2, 2, 398, 399, 3, 2, 2, 2, 399, 397, 3, 2, 2, 2, 399, 400, 3, 2, 2, 2, 400, 402, 3, 2, 2, 2, 401, 395, 3, 2, 2, 2, 401, 402, 3, 2, 2, 2, 402, 404, 3, 2, 2, 2, 403, 405, 5, 32, 16, 2, 404, 403, 3, 2, 2, 2, 404, 405, 3, 2, 2, 2, 405, 406, 3, 2, 2, 2, 406, 407, 8, 41, 14, 2, 407, 83, 3, 2, 2, 2, 408, 409, 7, 65, 2, 2, 409, 85, 3, 2, 2, 2, 410, 411, 7, 49, 2, 2, 411, 87, 3, 2, 2, 2, 412, 413, 7, 64, 2, 2, 413, 89, 3, 2, 2, 2, 414, 415, 7, 62, 2, 2, 415, 91, 3, 2, 2, 2, 416, 417, 7, 44, 2, 2, 417, 93, 3, 2, 2, 2, 418, 419, 7, 40, 2, 2, 419, 95, 3, 2, 2, 2, 420, 421, 7, 126, 2, 2, 421, 97, 3, 2, 2, 2, 422, 423, 7, 35, 2, 2, 423, 99, 3, 2, 2, 2, 424, 425, 7, 125, 2, 2, 425, 426, 3, 2, 2, 2, 426, 427, 8, 50, 3, 2, 427, 428, 8, 50, 15, 2, 428, 101, 3, 2, 2, 2, 429, 437, 7, 36, 2, 2, 430, 436, 5, 40, 20, 2, 431, 432, 7, 128, 2, 2, 432, 436, 7, 36, 2, 2, 433, 434, 7, 94, 2, 2, 434, 436, 7, 36, 2, 2, 435, 430, 3, 2, 2, 2, 435, 431, 3, 2, 2, 2, 435, 433, 3, 2, 2, 2, 436, 439, 3, 2, 2, 2, 437, 435, 3, 2, 2, 2, 437, 438, 3, 2, 2, 2, 438, 440, 3, 2, 2, 2, 439, 437, 3, 2, 2, 2, 440, 446, 7, 36, 2, 2, 441, 442, 7, 98, 2, 2, 442, 443, 5, 42, 21, 2, 443, 444, 7, 98, 2, 2, 444, 446, 3, 2, 2, 2, 445, 429, 3, 2, 2, 2, 445, 441, 3, 2, 2, 2, 446, 447, 3, 2, 2, 2, 447, 448, 8, 51, 16, 2, 448, 103, 3, 2, 2, 2, 449, 452, 5, 110, 55, 2, 450, 452, 5, 106, 53, 2, 451, 449, 3, 2, 2, 2, 451, 450, 3, 2, 2, 2, 452, 453, 3, 2, 2, 2, 453, 451, 3, 2, 2, 2, 453, 454, 3, 2, 2, 2, 454, 468, 3, 2, 2, 2, 455, 457, 7, 34, 2, 2, 456, 455, 3, 2, 2, 2, 457, 458, 3, 2, 2, 2, 458, 456, 3, 2, 2, 2, 458, 459, 3, 2, 2, 2, 459, 462, 3, 2, 2, 2, 460, 463, 5, 110, 55, 2, 461, 463, 5, 106, 53, 2, 462, 460, 3, 2, 2, 2, 462, 461, 3, 2, 2, 2, 463, 464, 3, 2, 2, 2, 464, 462, 3, 2, 2, 2, 464, 465, 3, 2, 2, 2, 465, 467, 3, 2, 2, 2, 466, 456, 3, 2, 2, 2, 467, 470, 3, 2, 2, 2, 468, 466, 3, 2, 2, 2, 468, 469, 3, 2, 2, 2, 469, 471, 3, 2, 2, 2, 470, 468, 3, 2, 2, 2, 471, 472, 8, 52, 17, 2, 472, 105, 3, 2, 2, 2, 473, 474, 10, 13, 2, 2, 474, 107, 3, 2, 2, 2, 475, 476, 9, 13, 2, 2, 476, 109, 3, 2, 2, 2, 477, 480, 7, 94, 2, 2, 478, 481, 9, 11, 2, 2, 479, 481, 5, 52, 26, 2, 480, 478, 3, 2, 2, 2, 480, 479, 3, 2, 2, 2, 481, 487, 3, 2, 2, 2, 482, 483, 7, 94, 2, 2, 483, 487, 5, 108, 54, 2, 484, 485, 7, 128, 2, 2, 485, 487, 5, 108, 54, 2, 486, 477, 3, 2, 2, 2, 486, 482, 3, 2, 2, 2, 486, 484, 3, 2, 2, 2, 487, 111, 3, 2, 2, 2, 488, 489, 7, 37, 2, 2, 489, 490, 7, 37, 2, 2, 490, 491, 3, 2, 2, 2, 491, 492, 5, 36, 18, 2, 492, 493, 3, 2, 2, 2, 493, 494, 8, 56, 2, 2, 494, 113, 3, 2, 2, 2, 495, 496, 7, 127, 2, 2, 496, 497, 3, 2, 2, 2, 497, 498, 8, 57, 18, 2, 498, 115, 3, 2, 2, 2, 50, 2, 3, 119, 134, 146, 160, 179, 186, 188, 191, 198, 201, 205, 219, 228, 230, 238, 245, 250, 255, 257, 260, 265, 268, 272, 274, 278, 288, 294, 314, 329, 343, 359, 392, 399, 401, 404, 435, 437, 445, 451, 453, 458, 462, 464, 468, 480, 486, 19, 8, 2, 2, 7, 3, 2, 9, 4, 2, 9, 5, 2, 9, 6, 2, 9, 7, 2, 9, 8, 2, 9, 9, 2, 9, 11, 2, 9, 12, 2, 9, 13, 2, 9, 14, 2, 9, 15, 2, 9, 20, 2, 9, 17, 2, 9, 18, 2, 6, 2, 2]
132
+ [3, 24715, 42794, 33075, 47597, 16764, 15335, 30598, 22884, 2, 31, 502, 8, 1, 8, 1, 4, 2, 9, 2, 4, 3, 9, 3, 4, 4, 9, 4, 4, 5, 9, 5, 4, 6, 9, 6, 4, 7, 9, 7, 4, 8, 9, 8, 4, 9, 9, 9, 4, 10, 9, 10, 4, 11, 9, 11, 4, 12, 9, 12, 4, 13, 9, 13, 4, 14, 9, 14, 4, 15, 9, 15, 4, 16, 9, 16, 4, 17, 9, 17, 4, 18, 9, 18, 4, 19, 9, 19, 4, 20, 9, 20, 4, 21, 9, 21, 4, 22, 9, 22, 4, 23, 9, 23, 4, 24, 9, 24, 4, 25, 9, 25, 4, 26, 9, 26, 4, 27, 9, 27, 4, 28, 9, 28, 4, 29, 9, 29, 4, 30, 9, 30, 4, 31, 9, 31, 4, 32, 9, 32, 4, 33, 9, 33, 4, 34, 9, 34, 4, 35, 9, 35, 4, 36, 9, 36, 4, 37, 9, 37, 4, 38, 9, 38, 4, 39, 9, 39, 4, 40, 9, 40, 4, 41, 9, 41, 4, 42, 9, 42, 4, 43, 9, 43, 4, 44, 9, 44, 4, 45, 9, 45, 4, 46, 9, 46, 4, 47, 9, 47, 4, 48, 9, 48, 4, 49, 9, 49, 4, 50, 9, 50, 4, 51, 9, 51, 4, 52, 9, 52, 4, 53, 9, 53, 4, 54, 9, 54, 4, 55, 9, 55, 4, 56, 9, 56, 4, 57, 9, 57, 3, 2, 6, 2, 118, 10, 2, 13, 2, 14, 2, 119, 3, 2, 3, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 5, 3, 135, 10, 3, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 5, 4, 147, 10, 4, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 5, 5, 161, 10, 5, 3, 6, 3, 6, 3, 7, 3, 7, 3, 8, 3, 8, 3, 9, 3, 9, 3, 10, 3, 10, 3, 11, 3, 11, 3, 12, 3, 12, 3, 13, 3, 13, 3, 14, 5, 14, 180, 10, 14, 3, 14, 3, 14, 3, 14, 6, 14, 185, 10, 14, 13, 14, 14, 14, 186, 5, 14, 189, 10, 14, 3, 14, 5, 14, 192, 10, 14, 3, 15, 3, 15, 3, 15, 7, 15, 197, 10, 15, 12, 15, 14, 15, 200, 11, 15, 5, 15, 202, 10, 15, 3, 16, 3, 16, 5, 16, 206, 10, 16, 3, 16, 3, 16, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 18, 7, 18, 218, 10, 18, 12, 18, 14, 18, 221, 11, 18, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 7, 19, 229, 10, 19, 12, 19, 14, 19, 232, 11, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 5, 19, 239, 10, 19, 3, 20, 3, 20, 3, 21, 7, 21, 244, 10, 21, 12, 21, 14, 21, 247, 11, 21, 3, 22, 3, 22, 5, 22, 251, 10, 22, 3, 22, 3, 22, 3, 22, 6, 22, 256, 10, 22, 13, 22, 14, 22, 257, 3, 22, 5, 22, 261, 10, 22, 3, 22, 6, 22, 264, 10, 22, 13, 22, 14, 22, 265, 3, 22, 5, 22, 269, 10, 22, 3, 22, 3, 22, 6, 22, 273, 10, 22, 13, 22, 14, 22, 274, 7, 22, 277, 10, 22, 12, 22, 14, 22, 280, 11, 22, 3, 23, 3, 23, 3, 24, 3, 24, 3, 25, 3, 25, 3, 25, 5, 25, 289, 10, 25, 3, 25, 3, 25, 3, 25, 3, 25, 3, 25, 5, 25, 296, 10, 25, 5, 25, 298, 10, 25, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 27, 3, 27, 3, 28, 3, 28, 3, 28, 3, 29, 3, 29, 3, 29, 3, 29, 3, 30, 6, 30, 316, 10, 30, 13, 30, 14, 30, 317, 3, 30, 3, 30, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 5, 31, 333, 10, 31, 3, 31, 3, 31, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 5, 32, 347, 10, 32, 3, 32, 3, 32, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 5, 33, 363, 10, 33, 3, 33, 3, 33, 3, 34, 3, 34, 3, 34, 3, 34, 3, 35, 3, 35, 3, 35, 3, 35, 3, 36, 3, 36, 3, 36, 3, 36, 3, 37, 3, 37, 3, 37, 3, 37, 3, 38, 3, 38, 3, 38, 3, 38, 3, 39, 3, 39, 3, 39, 3, 39, 3, 40, 3, 40, 3, 40, 3, 40, 3, 41, 5, 41, 396, 10, 41, 3, 41, 3, 41, 3, 41, 6, 41, 401, 10, 41, 13, 41, 14, 41, 402, 5, 41, 405, 10, 41, 3, 41, 5, 41, 408, 10, 41, 3, 41, 3, 41, 3, 42, 3, 42, 3, 43, 3, 43, 3, 44, 3, 44, 3, 45, 3, 45, 3, 46, 3, 46, 3, 47, 3, 47, 3, 48, 3, 48, 3, 49, 3, 49, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 3, 51, 3, 51, 3, 51, 3, 51, 3, 51, 3, 51, 7, 51, 439, 10, 51, 12, 51, 14, 51, 442, 11, 51, 3, 51, 3, 51, 3, 51, 3, 51, 3, 51, 5, 51, 449, 10, 51, 3, 51, 3, 51, 3, 52, 3, 52, 6, 52, 455, 10, 52, 13, 52, 14, 52, 456, 3, 52, 6, 52, 460, 10, 52, 13, 52, 14, 52, 461, 3, 52, 3, 52, 6, 52, 466, 10, 52, 13, 52, 14, 52, 467, 7, 52, 470, 10, 52, 12, 52, 14, 52, 473, 11, 52, 3, 52, 3, 52, 3, 53, 3, 53, 3, 54, 3, 54, 3, 55, 3, 55, 3, 55, 5, 55, 484, 10, 55, 3, 55, 3, 55, 3, 55, 3, 55, 5, 55, 490, 10, 55, 3, 56, 3, 56, 3, 56, 3, 56, 3, 56, 3, 56, 3, 56, 3, 57, 3, 57, 3, 57, 3, 57, 2, 2, 58, 4, 3, 6, 4, 8, 5, 10, 6, 12, 7, 14, 8, 16, 9, 18, 10, 20, 11, 22, 12, 24, 13, 26, 14, 28, 15, 30, 2, 32, 2, 34, 16, 36, 2, 38, 17, 40, 2, 42, 2, 44, 18, 46, 2, 48, 2, 50, 2, 52, 2, 54, 2, 56, 19, 58, 20, 60, 21, 62, 2, 64, 2, 66, 2, 68, 2, 70, 2, 72, 2, 74, 2, 76, 2, 78, 2, 80, 2, 82, 2, 84, 22, 86, 23, 88, 24, 90, 25, 92, 26, 94, 27, 96, 28, 98, 29, 100, 2, 102, 2, 104, 2, 106, 2, 108, 2, 110, 2, 112, 30, 114, 31, 4, 2, 3, 14, 5, 2, 11, 12, 15, 15, 34, 34, 3, 2, 50, 59, 3, 2, 51, 59, 4, 2, 71, 71, 103, 103, 4, 2, 45, 45, 47, 47, 4, 2, 12, 12, 15, 15, 3, 2, 36, 36, 3, 2, 98, 98, 12, 2, 10, 12, 14, 15, 34, 34, 36, 37, 42, 43, 60, 61, 63, 63, 93, 95, 125, 125, 127, 128, 9, 2, 49, 49, 94, 94, 100, 100, 104, 104, 112, 112, 116, 116, 118, 118, 5, 2, 50, 59, 67, 72, 99, 104, 11, 2, 10, 12, 14, 15, 34, 37, 40, 40, 42, 43, 49, 49, 60, 65, 93, 95, 125, 128, 2, 545, 2, 4, 3, 2, 2, 2, 2, 6, 3, 2, 2, 2, 2, 8, 3, 2, 2, 2, 2, 10, 3, 2, 2, 2, 2, 12, 3, 2, 2, 2, 2, 14, 3, 2, 2, 2, 2, 16, 3, 2, 2, 2, 2, 18, 3, 2, 2, 2, 2, 20, 3, 2, 2, 2, 2, 22, 3, 2, 2, 2, 2, 24, 3, 2, 2, 2, 2, 26, 3, 2, 2, 2, 2, 28, 3, 2, 2, 2, 2, 34, 3, 2, 2, 2, 2, 38, 3, 2, 2, 2, 2, 44, 3, 2, 2, 2, 2, 56, 3, 2, 2, 2, 2, 58, 3, 2, 2, 2, 3, 60, 3, 2, 2, 2, 3, 62, 3, 2, 2, 2, 3, 64, 3, 2, 2, 2, 3, 66, 3, 2, 2, 2, 3, 68, 3, 2, 2, 2, 3, 70, 3, 2, 2, 2, 3, 72, 3, 2, 2, 2, 3, 74, 3, 2, 2, 2, 3, 76, 3, 2, 2, 2, 3, 78, 3, 2, 2, 2, 3, 80, 3, 2, 2, 2, 3, 82, 3, 2, 2, 2, 3, 84, 3, 2, 2, 2, 3, 86, 3, 2, 2, 2, 3, 88, 3, 2, 2, 2, 3, 90, 3, 2, 2, 2, 3, 92, 3, 2, 2, 2, 3, 94, 3, 2, 2, 2, 3, 96, 3, 2, 2, 2, 3, 98, 3, 2, 2, 2, 3, 100, 3, 2, 2, 2, 3, 102, 3, 2, 2, 2, 3, 104, 3, 2, 2, 2, 3, 112, 3, 2, 2, 2, 3, 114, 3, 2, 2, 2, 4, 117, 3, 2, 2, 2, 6, 134, 3, 2, 2, 2, 8, 146, 3, 2, 2, 2, 10, 160, 3, 2, 2, 2, 12, 162, 3, 2, 2, 2, 14, 164, 3, 2, 2, 2, 16, 166, 3, 2, 2, 2, 18, 168, 3, 2, 2, 2, 20, 170, 3, 2, 2, 2, 22, 172, 3, 2, 2, 2, 24, 174, 3, 2, 2, 2, 26, 176, 3, 2, 2, 2, 28, 179, 3, 2, 2, 2, 30, 201, 3, 2, 2, 2, 32, 203, 3, 2, 2, 2, 34, 209, 3, 2, 2, 2, 36, 219, 3, 2, 2, 2, 38, 238, 3, 2, 2, 2, 40, 240, 3, 2, 2, 2, 42, 245, 3, 2, 2, 2, 44, 250, 3, 2, 2, 2, 46, 281, 3, 2, 2, 2, 48, 283, 3, 2, 2, 2, 50, 297, 3, 2, 2, 2, 52, 299, 3, 2, 2, 2, 54, 305, 3, 2, 2, 2, 56, 307, 3, 2, 2, 2, 58, 310, 3, 2, 2, 2, 60, 315, 3, 2, 2, 2, 62, 332, 3, 2, 2, 2, 64, 346, 3, 2, 2, 2, 66, 362, 3, 2, 2, 2, 68, 366, 3, 2, 2, 2, 70, 370, 3, 2, 2, 2, 72, 374, 3, 2, 2, 2, 74, 378, 3, 2, 2, 2, 76, 382, 3, 2, 2, 2, 78, 386, 3, 2, 2, 2, 80, 390, 3, 2, 2, 2, 82, 395, 3, 2, 2, 2, 84, 411, 3, 2, 2, 2, 86, 413, 3, 2, 2, 2, 88, 415, 3, 2, 2, 2, 90, 417, 3, 2, 2, 2, 92, 419, 3, 2, 2, 2, 94, 421, 3, 2, 2, 2, 96, 423, 3, 2, 2, 2, 98, 425, 3, 2, 2, 2, 100, 427, 3, 2, 2, 2, 102, 448, 3, 2, 2, 2, 104, 454, 3, 2, 2, 2, 106, 476, 3, 2, 2, 2, 108, 478, 3, 2, 2, 2, 110, 489, 3, 2, 2, 2, 112, 491, 3, 2, 2, 2, 114, 498, 3, 2, 2, 2, 116, 118, 9, 2, 2, 2, 117, 116, 3, 2, 2, 2, 118, 119, 3, 2, 2, 2, 119, 117, 3, 2, 2, 2, 119, 120, 3, 2, 2, 2, 120, 121, 3, 2, 2, 2, 121, 122, 8, 2, 2, 2, 122, 5, 3, 2, 2, 2, 123, 124, 7, 50, 2, 2, 124, 125, 7, 50, 2, 2, 125, 135, 7, 50, 2, 2, 126, 127, 7, 112, 2, 2, 127, 128, 7, 119, 2, 2, 128, 129, 7, 110, 2, 2, 129, 135, 7, 110, 2, 2, 130, 131, 7, 80, 2, 2, 131, 132, 7, 87, 2, 2, 132, 133, 7, 78, 2, 2, 133, 135, 7, 78, 2, 2, 134, 123, 3, 2, 2, 2, 134, 126, 3, 2, 2, 2, 134, 130, 3, 2, 2, 2, 135, 7, 3, 2, 2, 2, 136, 137, 7, 50, 2, 2, 137, 147, 7, 51, 2, 2, 138, 139, 7, 118, 2, 2, 139, 140, 7, 116, 2, 2, 140, 141, 7, 119, 2, 2, 141, 147, 7, 103, 2, 2, 142, 143, 7, 86, 2, 2, 143, 144, 7, 84, 2, 2, 144, 145, 7, 87, 2, 2, 145, 147, 7, 71, 2, 2, 146, 136, 3, 2, 2, 2, 146, 138, 3, 2, 2, 2, 146, 142, 3, 2, 2, 2, 147, 9, 3, 2, 2, 2, 148, 149, 7, 50, 2, 2, 149, 161, 7, 50, 2, 2, 150, 151, 7, 104, 2, 2, 151, 152, 7, 99, 2, 2, 152, 153, 7, 110, 2, 2, 153, 154, 7, 117, 2, 2, 154, 161, 7, 103, 2, 2, 155, 156, 7, 72, 2, 2, 156, 157, 7, 67, 2, 2, 157, 158, 7, 78, 2, 2, 158, 159, 7, 85, 2, 2, 159, 161, 7, 71, 2, 2, 160, 148, 3, 2, 2, 2, 160, 150, 3, 2, 2, 2, 160, 155, 3, 2, 2, 2, 161, 11, 3, 2, 2, 2, 162, 163, 7, 60, 2, 2, 163, 13, 3, 2, 2, 2, 164, 165, 7, 63, 2, 2, 165, 15, 3, 2, 2, 2, 166, 167, 7, 61, 2, 2, 167, 17, 3, 2, 2, 2, 168, 169, 7, 46, 2, 2, 169, 19, 3, 2, 2, 2, 170, 171, 7, 42, 2, 2, 171, 21, 3, 2, 2, 2, 172, 173, 7, 43, 2, 2, 173, 23, 3, 2, 2, 2, 174, 175, 7, 93, 2, 2, 175, 25, 3, 2, 2, 2, 176, 177, 7, 95, 2, 2, 177, 27, 3, 2, 2, 2, 178, 180, 7, 47, 2, 2, 179, 178, 3, 2, 2, 2, 179, 180, 3, 2, 2, 2, 180, 181, 3, 2, 2, 2, 181, 188, 5, 30, 15, 2, 182, 184, 7, 48, 2, 2, 183, 185, 9, 3, 2, 2, 184, 183, 3, 2, 2, 2, 185, 186, 3, 2, 2, 2, 186, 184, 3, 2, 2, 2, 186, 187, 3, 2, 2, 2, 187, 189, 3, 2, 2, 2, 188, 182, 3, 2, 2, 2, 188, 189, 3, 2, 2, 2, 189, 191, 3, 2, 2, 2, 190, 192, 5, 32, 16, 2, 191, 190, 3, 2, 2, 2, 191, 192, 3, 2, 2, 2, 192, 29, 3, 2, 2, 2, 193, 202, 7, 50, 2, 2, 194, 198, 9, 4, 2, 2, 195, 197, 9, 3, 2, 2, 196, 195, 3, 2, 2, 2, 197, 200, 3, 2, 2, 2, 198, 196, 3, 2, 2, 2, 198, 199, 3, 2, 2, 2, 199, 202, 3, 2, 2, 2, 200, 198, 3, 2, 2, 2, 201, 193, 3, 2, 2, 2, 201, 194, 3, 2, 2, 2, 202, 31, 3, 2, 2, 2, 203, 205, 9, 5, 2, 2, 204, 206, 9, 6, 2, 2, 205, 204, 3, 2, 2, 2, 205, 206, 3, 2, 2, 2, 206, 207, 3, 2, 2, 2, 207, 208, 5, 30, 15, 2, 208, 33, 3, 2, 2, 2, 209, 210, 7, 37, 2, 2, 210, 211, 7, 37, 2, 2, 211, 212, 3, 2, 2, 2, 212, 213, 5, 36, 18, 2, 213, 214, 3, 2, 2, 2, 214, 215, 8, 17, 2, 2, 215, 35, 3, 2, 2, 2, 216, 218, 10, 7, 2, 2, 217, 216, 3, 2, 2, 2, 218, 221, 3, 2, 2, 2, 219, 217, 3, 2, 2, 2, 219, 220, 3, 2, 2, 2, 220, 37, 3, 2, 2, 2, 221, 219, 3, 2, 2, 2, 222, 230, 7, 36, 2, 2, 223, 229, 5, 40, 20, 2, 224, 225, 7, 128, 2, 2, 225, 229, 7, 36, 2, 2, 226, 227, 7, 94, 2, 2, 227, 229, 7, 36, 2, 2, 228, 223, 3, 2, 2, 2, 228, 224, 3, 2, 2, 2, 228, 226, 3, 2, 2, 2, 229, 232, 3, 2, 2, 2, 230, 228, 3, 2, 2, 2, 230, 231, 3, 2, 2, 2, 231, 233, 3, 2, 2, 2, 232, 230, 3, 2, 2, 2, 233, 239, 7, 36, 2, 2, 234, 235, 7, 98, 2, 2, 235, 236, 5, 42, 21, 2, 236, 237, 7, 98, 2, 2, 237, 239, 3, 2, 2, 2, 238, 222, 3, 2, 2, 2, 238, 234, 3, 2, 2, 2, 239, 39, 3, 2, 2, 2, 240, 241, 10, 8, 2, 2, 241, 41, 3, 2, 2, 2, 242, 244, 10, 9, 2, 2, 243, 242, 3, 2, 2, 2, 244, 247, 3, 2, 2, 2, 245, 243, 3, 2, 2, 2, 245, 246, 3, 2, 2, 2, 246, 43, 3, 2, 2, 2, 247, 245, 3, 2, 2, 2, 248, 249, 7, 37, 2, 2, 249, 251, 7, 34, 2, 2, 250, 248, 3, 2, 2, 2, 250, 251, 3, 2, 2, 2, 251, 255, 3, 2, 2, 2, 252, 256, 5, 50, 25, 2, 253, 256, 5, 46, 23, 2, 254, 256, 5, 56, 28, 2, 255, 252, 3, 2, 2, 2, 255, 253, 3, 2, 2, 2, 255, 254, 3, 2, 2, 2, 256, 257, 3, 2, 2, 2, 257, 255, 3, 2, 2, 2, 257, 258, 3, 2, 2, 2, 258, 278, 3, 2, 2, 2, 259, 261, 7, 37, 2, 2, 260, 259, 3, 2, 2, 2, 260, 261, 3, 2, 2, 2, 261, 263, 3, 2, 2, 2, 262, 264, 7, 34, 2, 2, 263, 262, 3, 2, 2, 2, 264, 265, 3, 2, 2, 2, 265, 263, 3, 2, 2, 2, 265, 266, 3, 2, 2, 2, 266, 268, 3, 2, 2, 2, 267, 269, 7, 37, 2, 2, 268, 267, 3, 2, 2, 2, 268, 269, 3, 2, 2, 2, 269, 272, 3, 2, 2, 2, 270, 273, 5, 50, 25, 2, 271, 273, 5, 46, 23, 2, 272, 270, 3, 2, 2, 2, 272, 271, 3, 2, 2, 2, 273, 274, 3, 2, 2, 2, 274, 272, 3, 2, 2, 2, 274, 275, 3, 2, 2, 2, 275, 277, 3, 2, 2, 2, 276, 260, 3, 2, 2, 2, 277, 280, 3, 2, 2, 2, 278, 276, 3, 2, 2, 2, 278, 279, 3, 2, 2, 2, 279, 45, 3, 2, 2, 2, 280, 278, 3, 2, 2, 2, 281, 282, 10, 10, 2, 2, 282, 47, 3, 2, 2, 2, 283, 284, 9, 10, 2, 2, 284, 49, 3, 2, 2, 2, 285, 288, 7, 94, 2, 2, 286, 289, 9, 11, 2, 2, 287, 289, 5, 52, 26, 2, 288, 286, 3, 2, 2, 2, 288, 287, 3, 2, 2, 2, 289, 298, 3, 2, 2, 2, 290, 291, 7, 94, 2, 2, 291, 298, 5, 48, 24, 2, 292, 295, 7, 128, 2, 2, 293, 296, 5, 48, 24, 2, 294, 296, 5, 52, 26, 2, 295, 293, 3, 2, 2, 2, 295, 294, 3, 2, 2, 2, 296, 298, 3, 2, 2, 2, 297, 285, 3, 2, 2, 2, 297, 290, 3, 2, 2, 2, 297, 292, 3, 2, 2, 2, 298, 51, 3, 2, 2, 2, 299, 300, 7, 119, 2, 2, 300, 301, 5, 54, 27, 2, 301, 302, 5, 54, 27, 2, 302, 303, 5, 54, 27, 2, 303, 304, 5, 54, 27, 2, 304, 53, 3, 2, 2, 2, 305, 306, 9, 12, 2, 2, 306, 55, 3, 2, 2, 2, 307, 308, 7, 37, 2, 2, 308, 309, 5, 44, 22, 2, 309, 57, 3, 2, 2, 2, 310, 311, 7, 125, 2, 2, 311, 312, 3, 2, 2, 2, 312, 313, 8, 29, 3, 2, 313, 59, 3, 2, 2, 2, 314, 316, 9, 2, 2, 2, 315, 314, 3, 2, 2, 2, 316, 317, 3, 2, 2, 2, 317, 315, 3, 2, 2, 2, 317, 318, 3, 2, 2, 2, 318, 319, 3, 2, 2, 2, 319, 320, 8, 30, 2, 2, 320, 61, 3, 2, 2, 2, 321, 322, 7, 50, 2, 2, 322, 323, 7, 50, 2, 2, 323, 333, 7, 50, 2, 2, 324, 325, 7, 112, 2, 2, 325, 326, 7, 119, 2, 2, 326, 327, 7, 110, 2, 2, 327, 333, 7, 110, 2, 2, 328, 329, 7, 80, 2, 2, 329, 330, 7, 87, 2, 2, 330, 331, 7, 78, 2, 2, 331, 333, 7, 78, 2, 2, 332, 321, 3, 2, 2, 2, 332, 324, 3, 2, 2, 2, 332, 328, 3, 2, 2, 2, 333, 334, 3, 2, 2, 2, 334, 335, 8, 31, 4, 2, 335, 63, 3, 2, 2, 2, 336, 337, 7, 50, 2, 2, 337, 347, 7, 51, 2, 2, 338, 339, 7, 118, 2, 2, 339, 340, 7, 116, 2, 2, 340, 341, 7, 119, 2, 2, 341, 347, 7, 103, 2, 2, 342, 343, 7, 86, 2, 2, 343, 344, 7, 84, 2, 2, 344, 345, 7, 87, 2, 2, 345, 347, 7, 71, 2, 2, 346, 336, 3, 2, 2, 2, 346, 338, 3, 2, 2, 2, 346, 342, 3, 2, 2, 2, 347, 348, 3, 2, 2, 2, 348, 349, 8, 32, 5, 2, 349, 65, 3, 2, 2, 2, 350, 351, 7, 50, 2, 2, 351, 363, 7, 50, 2, 2, 352, 353, 7, 104, 2, 2, 353, 354, 7, 99, 2, 2, 354, 355, 7, 110, 2, 2, 355, 356, 7, 117, 2, 2, 356, 363, 7, 103, 2, 2, 357, 358, 7, 72, 2, 2, 358, 359, 7, 67, 2, 2, 359, 360, 7, 78, 2, 2, 360, 361, 7, 85, 2, 2, 361, 363, 7, 71, 2, 2, 362, 350, 3, 2, 2, 2, 362, 352, 3, 2, 2, 2, 362, 357, 3, 2, 2, 2, 363, 364, 3, 2, 2, 2, 364, 365, 8, 33, 6, 2, 365, 67, 3, 2, 2, 2, 366, 367, 7, 60, 2, 2, 367, 368, 3, 2, 2, 2, 368, 369, 8, 34, 7, 2, 369, 69, 3, 2, 2, 2, 370, 371, 7, 63, 2, 2, 371, 372, 3, 2, 2, 2, 372, 373, 8, 35, 8, 2, 373, 71, 3, 2, 2, 2, 374, 375, 7, 61, 2, 2, 375, 376, 3, 2, 2, 2, 376, 377, 8, 36, 9, 2, 377, 73, 3, 2, 2, 2, 378, 379, 7, 42, 2, 2, 379, 380, 3, 2, 2, 2, 380, 381, 8, 37, 10, 2, 381, 75, 3, 2, 2, 2, 382, 383, 7, 43, 2, 2, 383, 384, 3, 2, 2, 2, 384, 385, 8, 38, 11, 2, 385, 77, 3, 2, 2, 2, 386, 387, 7, 93, 2, 2, 387, 388, 3, 2, 2, 2, 388, 389, 8, 39, 12, 2, 389, 79, 3, 2, 2, 2, 390, 391, 7, 95, 2, 2, 391, 392, 3, 2, 2, 2, 392, 393, 8, 40, 13, 2, 393, 81, 3, 2, 2, 2, 394, 396, 7, 47, 2, 2, 395, 394, 3, 2, 2, 2, 395, 396, 3, 2, 2, 2, 396, 397, 3, 2, 2, 2, 397, 404, 5, 30, 15, 2, 398, 400, 7, 48, 2, 2, 399, 401, 9, 3, 2, 2, 400, 399, 3, 2, 2, 2, 401, 402, 3, 2, 2, 2, 402, 400, 3, 2, 2, 2, 402, 403, 3, 2, 2, 2, 403, 405, 3, 2, 2, 2, 404, 398, 3, 2, 2, 2, 404, 405, 3, 2, 2, 2, 405, 407, 3, 2, 2, 2, 406, 408, 5, 32, 16, 2, 407, 406, 3, 2, 2, 2, 407, 408, 3, 2, 2, 2, 408, 409, 3, 2, 2, 2, 409, 410, 8, 41, 14, 2, 410, 83, 3, 2, 2, 2, 411, 412, 7, 65, 2, 2, 412, 85, 3, 2, 2, 2, 413, 414, 7, 49, 2, 2, 414, 87, 3, 2, 2, 2, 415, 416, 7, 64, 2, 2, 416, 89, 3, 2, 2, 2, 417, 418, 7, 62, 2, 2, 418, 91, 3, 2, 2, 2, 419, 420, 7, 44, 2, 2, 420, 93, 3, 2, 2, 2, 421, 422, 7, 40, 2, 2, 422, 95, 3, 2, 2, 2, 423, 424, 7, 126, 2, 2, 424, 97, 3, 2, 2, 2, 425, 426, 7, 35, 2, 2, 426, 99, 3, 2, 2, 2, 427, 428, 7, 125, 2, 2, 428, 429, 3, 2, 2, 2, 429, 430, 8, 50, 3, 2, 430, 431, 8, 50, 15, 2, 431, 101, 3, 2, 2, 2, 432, 440, 7, 36, 2, 2, 433, 439, 5, 40, 20, 2, 434, 435, 7, 128, 2, 2, 435, 439, 7, 36, 2, 2, 436, 437, 7, 94, 2, 2, 437, 439, 7, 36, 2, 2, 438, 433, 3, 2, 2, 2, 438, 434, 3, 2, 2, 2, 438, 436, 3, 2, 2, 2, 439, 442, 3, 2, 2, 2, 440, 438, 3, 2, 2, 2, 440, 441, 3, 2, 2, 2, 441, 443, 3, 2, 2, 2, 442, 440, 3, 2, 2, 2, 443, 449, 7, 36, 2, 2, 444, 445, 7, 98, 2, 2, 445, 446, 5, 42, 21, 2, 446, 447, 7, 98, 2, 2, 447, 449, 3, 2, 2, 2, 448, 432, 3, 2, 2, 2, 448, 444, 3, 2, 2, 2, 449, 450, 3, 2, 2, 2, 450, 451, 8, 51, 16, 2, 451, 103, 3, 2, 2, 2, 452, 455, 5, 110, 55, 2, 453, 455, 5, 106, 53, 2, 454, 452, 3, 2, 2, 2, 454, 453, 3, 2, 2, 2, 455, 456, 3, 2, 2, 2, 456, 454, 3, 2, 2, 2, 456, 457, 3, 2, 2, 2, 457, 471, 3, 2, 2, 2, 458, 460, 7, 34, 2, 2, 459, 458, 3, 2, 2, 2, 460, 461, 3, 2, 2, 2, 461, 459, 3, 2, 2, 2, 461, 462, 3, 2, 2, 2, 462, 465, 3, 2, 2, 2, 463, 466, 5, 110, 55, 2, 464, 466, 5, 106, 53, 2, 465, 463, 3, 2, 2, 2, 465, 464, 3, 2, 2, 2, 466, 467, 3, 2, 2, 2, 467, 465, 3, 2, 2, 2, 467, 468, 3, 2, 2, 2, 468, 470, 3, 2, 2, 2, 469, 459, 3, 2, 2, 2, 470, 473, 3, 2, 2, 2, 471, 469, 3, 2, 2, 2, 471, 472, 3, 2, 2, 2, 472, 474, 3, 2, 2, 2, 473, 471, 3, 2, 2, 2, 474, 475, 8, 52, 17, 2, 475, 105, 3, 2, 2, 2, 476, 477, 10, 13, 2, 2, 477, 107, 3, 2, 2, 2, 478, 479, 9, 13, 2, 2, 479, 109, 3, 2, 2, 2, 480, 483, 7, 94, 2, 2, 481, 484, 9, 11, 2, 2, 482, 484, 5, 52, 26, 2, 483, 481, 3, 2, 2, 2, 483, 482, 3, 2, 2, 2, 484, 490, 3, 2, 2, 2, 485, 486, 7, 94, 2, 2, 486, 490, 5, 108, 54, 2, 487, 488, 7, 128, 2, 2, 488, 490, 5, 108, 54, 2, 489, 480, 3, 2, 2, 2, 489, 485, 3, 2, 2, 2, 489, 487, 3, 2, 2, 2, 490, 111, 3, 2, 2, 2, 491, 492, 7, 37, 2, 2, 492, 493, 7, 37, 2, 2, 493, 494, 3, 2, 2, 2, 494, 495, 5, 36, 18, 2, 495, 496, 3, 2, 2, 2, 496, 497, 8, 56, 2, 2, 497, 113, 3, 2, 2, 2, 498, 499, 7, 127, 2, 2, 499, 500, 3, 2, 2, 2, 500, 501, 8, 57, 18, 2, 501, 115, 3, 2, 2, 2, 51, 2, 3, 119, 134, 146, 160, 179, 186, 188, 191, 198, 201, 205, 219, 228, 230, 238, 245, 250, 255, 257, 260, 265, 268, 272, 274, 278, 288, 295, 297, 317, 332, 346, 362, 395, 402, 404, 407, 438, 440, 448, 454, 456, 461, 465, 467, 471, 483, 489, 19, 8, 2, 2, 7, 3, 2, 9, 4, 2, 9, 5, 2, 9, 6, 2, 9, 7, 2, 9, 8, 2, 9, 9, 2, 9, 11, 2, 9, 12, 2, 9, 13, 2, 9, 14, 2, 9, 15, 2, 9, 20, 2, 9, 17, 2, 9, 18, 2, 6, 2, 2]
@@ -78,7 +78,7 @@ class MODLLexer < Antlr4::Runtime::Lexer
78
78
 
79
79
 
80
80
  @@_serializedATN = ["\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964",
81
- "\2\37\u01f3\b\1\b\1\4\2\t\2\4\3\t\3\4\4\t\4\4\5\t\5\4\6\t\6\4\7\t\7",
81
+ "\2\37\u01f6\b\1\b\1\4\2\t\2\4\3\t\3\4\4\t\4\4\5\t\5\4\6\t\6\4\7\t\7",
82
82
  "\4\b\t\b\4\t\t\t\4\n\t\n\4\13\t\13\4\f\t\f\4\r\t\r\4\16\t\16\4\17\t",
83
83
  "\17\4\20\t\20\4\21\t\21\4\22\t\22\4\23\t\23\4\24\t\24\4\25\t\25\4\26",
84
84
  "\t\26\4\27\t\27\4\30\t\30\4\31\t\31\4\32\t\32\4\33\t\33\4\34\t\34\4",
@@ -100,179 +100,181 @@ class MODLLexer < Antlr4::Runtime::Lexer
100
100
  "\26\r\26\16\26\u0101\3\26\5\26\u0105\n\26\3\26\6\26\u0108\n\26\r\26",
101
101
  "\16\26\u0109\3\26\5\26\u010d\n\26\3\26\3\26\6\26\u0111\n\26\r\26\16",
102
102
  "\26\u0112\7\26\u0115\n\26\f\26\16\26\u0118\13\26\3\27\3\27\3\30\3\30",
103
- "\3\31\3\31\3\31\5\31\u0121\n\31\3\31\3\31\3\31\3\31\5\31\u0127\n\31",
104
- "\3\32\3\32\3\32\3\32\3\32\3\32\3\33\3\33\3\34\3\34\3\34\3\35\3\35\3",
105
- "\35\3\35\3\36\6\36\u0139\n\36\r\36\16\36\u013a\3\36\3\36\3\37\3\37",
106
- "\3\37\3\37\3\37\3\37\3\37\3\37\3\37\3\37\3\37\5\37\u014a\n\37\3\37",
107
- "\3\37\3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \5 \u0158\n \3 \3 \3!\3!\3!\3!\3",
108
- "!\3!\3!\3!\3!\3!\3!\3!\5!\u0168\n!\3!\3!\3\"\3\"\3\"\3\"\3#\3#\3#\3",
109
- "#\3$\3$\3$\3$\3%\3%\3%\3%\3&\3&\3&\3&\3\'\3\'\3\'\3\'\3(\3(\3(\3(\3",
110
- ")\5)\u0189\n)\3)\3)\3)\6)\u018e\n)\r)\16)\u018f\5)\u0192\n)\3)\5)\u0195",
111
- "\n)\3)\3)\3*\3*\3+\3+\3,\3,\3-\3-\3.\3.\3/\3/\3\60\3\60\3\61\3\61\3",
112
- "\62\3\62\3\62\3\62\3\62\3\63\3\63\3\63\3\63\3\63\3\63\7\63\u01b4\n",
113
- "\63\f\63\16\63\u01b7\13\63\3\63\3\63\3\63\3\63\3\63\5\63\u01be\n\63",
114
- "\3\63\3\63\3\64\3\64\6\64\u01c4\n\64\r\64\16\64\u01c5\3\64\6\64\u01c9",
115
- "\n\64\r\64\16\64\u01ca\3\64\3\64\6\64\u01cf\n\64\r\64\16\64\u01d0\7",
116
- "\64\u01d3\n\64\f\64\16\64\u01d6\13\64\3\64\3\64\3\65\3\65\3\66\3\66",
117
- "\3\67\3\67\3\67\5\67\u01e1\n\67\3\67\3\67\3\67\3\67\5\67\u01e7\n\67",
118
- "\38\38\38\38\38\38\38\39\39\39\39\2\2:\4\3\6\4\b\5\n\6\f\7\16\b\20",
119
- "\t\22\n\24\13\26\f\30\r\32\16\34\17\36\2 \2\"\20$\2&\21(\2*\2,\22.",
120
- "\2\60\2\62\2\64\2\66\28\23:\24<\25>\2@\2B\2D\2F\2H\2J\2L\2N\2P\2R\2",
121
- "T\26V\27X\30Z\31\\\32^\33`\34b\35d\2f\2h\2j\2l\2n\2p\36r\37\4\2\3\16",
122
- "\5\2\13\f\17\17\"\"\3\2\62;\3\2\63;\4\2GGgg\4\2--//\4\2\f\f\17\17\3",
123
- "\2$$\3\2bb\f\2\n\f\16\17\"\"$%*+<=??]_}}\177\u0080\t\2\61\61^^ddhh",
124
- "ppttvv\5\2\62;CHch\13\2\n\f\16\17\"%((*+\61\61<A]_}\u0080\2\u021d\2",
125
- "\4\3\2\2\2\2\6\3\2\2\2\2\b\3\2\2\2\2\n\3\2\2\2\2\f\3\2\2\2\2\16\3\2",
126
- "\2\2\2\20\3\2\2\2\2\22\3\2\2\2\2\24\3\2\2\2\2\26\3\2\2\2\2\30\3\2\2",
127
- "\2\2\32\3\2\2\2\2\34\3\2\2\2\2\"\3\2\2\2\2&\3\2\2\2\2,\3\2\2\2\28\3",
128
- "\2\2\2\2:\3\2\2\2\3<\3\2\2\2\3>\3\2\2\2\3@\3\2\2\2\3B\3\2\2\2\3D\3",
129
- "\2\2\2\3F\3\2\2\2\3H\3\2\2\2\3J\3\2\2\2\3L\3\2\2\2\3N\3\2\2\2\3P\3",
130
- "\2\2\2\3R\3\2\2\2\3T\3\2\2\2\3V\3\2\2\2\3X\3\2\2\2\3Z\3\2\2\2\3\\\3",
131
- "\2\2\2\3^\3\2\2\2\3`\3\2\2\2\3b\3\2\2\2\3d\3\2\2\2\3f\3\2\2\2\3h\3",
132
- "\2\2\2\3p\3\2\2\2\3r\3\2\2\2\4u\3\2\2\2\6\u0086\3\2\2\2\b\u0092\3\2",
133
- "\2\2\n\u00a0\3\2\2\2\f\u00a2\3\2\2\2\16\u00a4\3\2\2\2\20\u00a6\3\2",
134
- "\2\2\22\u00a8\3\2\2\2\24\u00aa\3\2\2\2\26\u00ac\3\2\2\2\30\u00ae\3",
135
- "\2\2\2\32\u00b0\3\2\2\2\34\u00b3\3\2\2\2\36\u00c9\3\2\2\2 \u00cb\3",
136
- "\2\2\2\"\u00d1\3\2\2\2$\u00db\3\2\2\2&\u00ee\3\2\2\2(\u00f0\3\2\2\2",
137
- "*\u00f5\3\2\2\2,\u00fa\3\2\2\2.\u0119\3\2\2\2\60\u011b\3\2\2\2\62\u0126",
138
- "\3\2\2\2\64\u0128\3\2\2\2\66\u012e\3\2\2\28\u0130\3\2\2\2:\u0133\3",
139
- "\2\2\2<\u0138\3\2\2\2>\u0149\3\2\2\2@\u0157\3\2\2\2B\u0167\3\2\2\2",
140
- "D\u016b\3\2\2\2F\u016f\3\2\2\2H\u0173\3\2\2\2J\u0177\3\2\2\2L\u017b",
141
- "\3\2\2\2N\u017f\3\2\2\2P\u0183\3\2\2\2R\u0188\3\2\2\2T\u0198\3\2\2",
142
- "\2V\u019a\3\2\2\2X\u019c\3\2\2\2Z\u019e\3\2\2\2\\\u01a0\3\2\2\2^\u01a2",
143
- "\3\2\2\2`\u01a4\3\2\2\2b\u01a6\3\2\2\2d\u01a8\3\2\2\2f\u01bd\3\2\2",
144
- "\2h\u01c3\3\2\2\2j\u01d9\3\2\2\2l\u01db\3\2\2\2n\u01e6\3\2\2\2p\u01e8",
145
- "\3\2\2\2r\u01ef\3\2\2\2tv\t\2\2\2ut\3\2\2\2vw\3\2\2\2wu\3\2\2\2wx\3",
146
- "\2\2\2xy\3\2\2\2yz\b\2\2\2z\5\3\2\2\2{|\7\62\2\2|}\7\62\2\2}\u0087",
147
- "\7\62\2\2~\177\7p\2\2\177\u0080\7w\2\2\u0080\u0081\7n\2\2\u0081\u0087",
148
- "\7n\2\2\u0082\u0083\7P\2\2\u0083\u0084\7W\2\2\u0084\u0085\7N\2\2\u0085",
149
- "\u0087\7N\2\2\u0086{\3\2\2\2\u0086~\3\2\2\2\u0086\u0082\3\2\2\2\u0087",
150
- "\7\3\2\2\2\u0088\u0089\7\62\2\2\u0089\u0093\7\63\2\2\u008a\u008b\7",
151
- "v\2\2\u008b\u008c\7t\2\2\u008c\u008d\7w\2\2\u008d\u0093\7g\2\2\u008e",
152
- "\u008f\7V\2\2\u008f\u0090\7T\2\2\u0090\u0091\7W\2\2\u0091\u0093\7G",
153
- "\2\2\u0092\u0088\3\2\2\2\u0092\u008a\3\2\2\2\u0092\u008e\3\2\2\2\u0093",
154
- "\t\3\2\2\2\u0094\u0095\7\62\2\2\u0095\u00a1\7\62\2\2\u0096\u0097\7",
155
- "h\2\2\u0097\u0098\7c\2\2\u0098\u0099\7n\2\2\u0099\u009a\7u\2\2\u009a",
156
- "\u00a1\7g\2\2\u009b\u009c\7H\2\2\u009c\u009d\7C\2\2\u009d\u009e\7N",
157
- "\2\2\u009e\u009f\7U\2\2\u009f\u00a1\7G\2\2\u00a0\u0094\3\2\2\2\u00a0",
158
- "\u0096\3\2\2\2\u00a0\u009b\3\2\2\2\u00a1\13\3\2\2\2\u00a2\u00a3\7<",
159
- "\2\2\u00a3\r\3\2\2\2\u00a4\u00a5\7?\2\2\u00a5\17\3\2\2\2\u00a6\u00a7",
160
- "\7=\2\2\u00a7\21\3\2\2\2\u00a8\u00a9\7.\2\2\u00a9\23\3\2\2\2\u00aa",
161
- "\u00ab\7*\2\2\u00ab\25\3\2\2\2\u00ac\u00ad\7+\2\2\u00ad\27\3\2\2\2",
162
- "\u00ae\u00af\7]\2\2\u00af\31\3\2\2\2\u00b0\u00b1\7_\2\2\u00b1\33\3",
163
- "\2\2\2\u00b2\u00b4\7/\2\2\u00b3\u00b2\3\2\2\2\u00b3\u00b4\3\2\2\2\u00b4",
164
- "\u00b5\3\2\2\2\u00b5\u00bc\5\36\17\2\u00b6\u00b8\7\60\2\2\u00b7\u00b9",
165
- "\t\3\2\2\u00b8\u00b7\3\2\2\2\u00b9\u00ba\3\2\2\2\u00ba\u00b8\3\2\2",
166
- "\2\u00ba\u00bb\3\2\2\2\u00bb\u00bd\3\2\2\2\u00bc\u00b6\3\2\2\2\u00bc",
167
- "\u00bd\3\2\2\2\u00bd\u00bf\3\2\2\2\u00be\u00c0\5 \20\2\u00bf\u00be",
168
- "\3\2\2\2\u00bf\u00c0\3\2\2\2\u00c0\35\3\2\2\2\u00c1\u00ca\7\62\2\2",
169
- "\u00c2\u00c6\t\4\2\2\u00c3\u00c5\t\3\2\2\u00c4\u00c3\3\2\2\2\u00c5",
170
- "\u00c8\3\2\2\2\u00c6\u00c4\3\2\2\2\u00c6\u00c7\3\2\2\2\u00c7\u00ca",
171
- "\3\2\2\2\u00c8\u00c6\3\2\2\2\u00c9\u00c1\3\2\2\2\u00c9\u00c2\3\2\2",
172
- "\2\u00ca\37\3\2\2\2\u00cb\u00cd\t\5\2\2\u00cc\u00ce\t\6\2\2\u00cd\u00cc",
173
- "\3\2\2\2\u00cd\u00ce\3\2\2\2\u00ce\u00cf\3\2\2\2\u00cf\u00d0\5\36\17",
174
- "\2\u00d0!\3\2\2\2\u00d1\u00d2\7%\2\2\u00d2\u00d3\7%\2\2\u00d3\u00d4",
175
- "\3\2\2\2\u00d4\u00d5\5$\22\2\u00d5\u00d6\3\2\2\2\u00d6\u00d7\b\21\2",
176
- "\2\u00d7#\3\2\2\2\u00d8\u00da\n\7\2\2\u00d9\u00d8\3\2\2\2\u00da\u00dd",
177
- "\3\2\2\2\u00db\u00d9\3\2\2\2\u00db\u00dc\3\2\2\2\u00dc%\3\2\2\2\u00dd",
178
- "\u00db\3\2\2\2\u00de\u00e6\7$\2\2\u00df\u00e5\5(\24\2\u00e0\u00e1\7",
179
- "\u0080\2\2\u00e1\u00e5\7$\2\2\u00e2\u00e3\7^\2\2\u00e3\u00e5\7$\2\2",
180
- "\u00e4\u00df\3\2\2\2\u00e4\u00e0\3\2\2\2\u00e4\u00e2\3\2\2\2\u00e5",
181
- "\u00e8\3\2\2\2\u00e6\u00e4\3\2\2\2\u00e6\u00e7\3\2\2\2\u00e7\u00e9",
182
- "\3\2\2\2\u00e8\u00e6\3\2\2\2\u00e9\u00ef\7$\2\2\u00ea\u00eb\7b\2\2",
183
- "\u00eb\u00ec\5*\25\2\u00ec\u00ed\7b\2\2\u00ed\u00ef\3\2\2\2\u00ee\u00de",
184
- "\3\2\2\2\u00ee\u00ea\3\2\2\2\u00ef\'\3\2\2\2\u00f0\u00f1\n\b\2\2\u00f1",
185
- ")\3\2\2\2\u00f2\u00f4\n\t\2\2\u00f3\u00f2\3\2\2\2\u00f4\u00f7\3\2\2",
186
- "\2\u00f5\u00f3\3\2\2\2\u00f5\u00f6\3\2\2\2\u00f6+\3\2\2\2\u00f7\u00f5",
187
- "\3\2\2\2\u00f8\u00f9\7%\2\2\u00f9\u00fb\7\"\2\2\u00fa\u00f8\3\2\2\2",
188
- "\u00fa\u00fb\3\2\2\2\u00fb\u00ff\3\2\2\2\u00fc\u0100\5\62\31\2\u00fd",
189
- "\u0100\5.\27\2\u00fe\u0100\58\34\2\u00ff\u00fc\3\2\2\2\u00ff\u00fd",
190
- "\3\2\2\2\u00ff\u00fe\3\2\2\2\u0100\u0101\3\2\2\2\u0101\u00ff\3\2\2",
191
- "\2\u0101\u0102\3\2\2\2\u0102\u0116\3\2\2\2\u0103\u0105\7%\2\2\u0104",
192
- "\u0103\3\2\2\2\u0104\u0105\3\2\2\2\u0105\u0107\3\2\2\2\u0106\u0108",
193
- "\7\"\2\2\u0107\u0106\3\2\2\2\u0108\u0109\3\2\2\2\u0109\u0107\3\2\2",
194
- "\2\u0109\u010a\3\2\2\2\u010a\u010c\3\2\2\2\u010b\u010d\7%\2\2\u010c",
195
- "\u010b\3\2\2\2\u010c\u010d\3\2\2\2\u010d\u0110\3\2\2\2\u010e\u0111",
196
- "\5\62\31\2\u010f\u0111\5.\27\2\u0110\u010e\3\2\2\2\u0110\u010f\3\2",
197
- "\2\2\u0111\u0112\3\2\2\2\u0112\u0110\3\2\2\2\u0112\u0113\3\2\2\2\u0113",
198
- "\u0115\3\2\2\2\u0114\u0104\3\2\2\2\u0115\u0118\3\2\2\2\u0116\u0114",
199
- "\3\2\2\2\u0116\u0117\3\2\2\2\u0117-\3\2\2\2\u0118\u0116\3\2\2\2\u0119",
200
- "\u011a\n\n\2\2\u011a/\3\2\2\2\u011b\u011c\t\n\2\2\u011c\61\3\2\2\2",
201
- "\u011d\u0120\7^\2\2\u011e\u0121\t\13\2\2\u011f\u0121\5\64\32\2\u0120",
202
- "\u011e\3\2\2\2\u0120\u011f\3\2\2\2\u0121\u0127\3\2\2\2\u0122\u0123",
203
- "\7^\2\2\u0123\u0127\5\60\30\2\u0124\u0125\7\u0080\2\2\u0125\u0127\5",
204
- "\60\30\2\u0126\u011d\3\2\2\2\u0126\u0122\3\2\2\2\u0126\u0124\3\2\2",
205
- "\2\u0127\63\3\2\2\2\u0128\u0129\7w\2\2\u0129\u012a\5\66\33\2\u012a",
206
- "\u012b\5\66\33\2\u012b\u012c\5\66\33\2\u012c\u012d\5\66\33\2\u012d",
207
- "\65\3\2\2\2\u012e\u012f\t\f\2\2\u012f\67\3\2\2\2\u0130\u0131\7%\2\2",
208
- "\u0131\u0132\5,\26\2\u01329\3\2\2\2\u0133\u0134\7}\2\2\u0134\u0135",
209
- "\3\2\2\2\u0135\u0136\b\35\3\2\u0136;\3\2\2\2\u0137\u0139\t\2\2\2\u0138",
210
- "\u0137\3\2\2\2\u0139\u013a\3\2\2\2\u013a\u0138\3\2\2\2\u013a\u013b",
211
- "\3\2\2\2\u013b\u013c\3\2\2\2\u013c\u013d\b\36\2\2\u013d=\3\2\2\2\u013e",
212
- "\u013f\7\62\2\2\u013f\u0140\7\62\2\2\u0140\u014a\7\62\2\2\u0141\u0142",
213
- "\7p\2\2\u0142\u0143\7w\2\2\u0143\u0144\7n\2\2\u0144\u014a\7n\2\2\u0145",
214
- "\u0146\7P\2\2\u0146\u0147\7W\2\2\u0147\u0148\7N\2\2\u0148\u014a\7N",
215
- "\2\2\u0149\u013e\3\2\2\2\u0149\u0141\3\2\2\2\u0149\u0145\3\2\2\2\u014a",
216
- "\u014b\3\2\2\2\u014b\u014c\b\37\4\2\u014c?\3\2\2\2\u014d\u014e\7\62",
217
- "\2\2\u014e\u0158\7\63\2\2\u014f\u0150\7v\2\2\u0150\u0151\7t\2\2\u0151",
218
- "\u0152\7w\2\2\u0152\u0158\7g\2\2\u0153\u0154\7V\2\2\u0154\u0155\7T",
219
- "\2\2\u0155\u0156\7W\2\2\u0156\u0158\7G\2\2\u0157\u014d\3\2\2\2\u0157",
220
- "\u014f\3\2\2\2\u0157\u0153\3\2\2\2\u0158\u0159\3\2\2\2\u0159\u015a",
221
- "\b \5\2\u015aA\3\2\2\2\u015b\u015c\7\62\2\2\u015c\u0168\7\62\2\2\u015d",
222
- "\u015e\7h\2\2\u015e\u015f\7c\2\2\u015f\u0160\7n\2\2\u0160\u0161\7u",
223
- "\2\2\u0161\u0168\7g\2\2\u0162\u0163\7H\2\2\u0163\u0164\7C\2\2\u0164",
224
- "\u0165\7N\2\2\u0165\u0166\7U\2\2\u0166\u0168\7G\2\2\u0167\u015b\3\2",
225
- "\2\2\u0167\u015d\3\2\2\2\u0167\u0162\3\2\2\2\u0168\u0169\3\2\2\2\u0169",
226
- "\u016a\b!\6\2\u016aC\3\2\2\2\u016b\u016c\7<\2\2\u016c\u016d\3\2\2\2",
227
- "\u016d\u016e\b\"\7\2\u016eE\3\2\2\2\u016f\u0170\7?\2\2\u0170\u0171",
228
- "\3\2\2\2\u0171\u0172\b#\b\2\u0172G\3\2\2\2\u0173\u0174\7=\2\2\u0174",
229
- "\u0175\3\2\2\2\u0175\u0176\b$\t\2\u0176I\3\2\2\2\u0177\u0178\7*\2\2",
230
- "\u0178\u0179\3\2\2\2\u0179\u017a\b%\n\2\u017aK\3\2\2\2\u017b\u017c",
231
- "\7+\2\2\u017c\u017d\3\2\2\2\u017d\u017e\b&\13\2\u017eM\3\2\2\2\u017f",
232
- "\u0180\7]\2\2\u0180\u0181\3\2\2\2\u0181\u0182\b\'\f\2\u0182O\3\2\2",
233
- "\2\u0183\u0184\7_\2\2\u0184\u0185\3\2\2\2\u0185\u0186\b(\r\2\u0186",
234
- "Q\3\2\2\2\u0187\u0189\7/\2\2\u0188\u0187\3\2\2\2\u0188\u0189\3\2\2",
235
- "\2\u0189\u018a\3\2\2\2\u018a\u0191\5\36\17\2\u018b\u018d\7\60\2\2\u018c",
236
- "\u018e\t\3\2\2\u018d\u018c\3\2\2\2\u018e\u018f\3\2\2\2\u018f\u018d",
237
- "\3\2\2\2\u018f\u0190\3\2\2\2\u0190\u0192\3\2\2\2\u0191\u018b\3\2\2",
238
- "\2\u0191\u0192\3\2\2\2\u0192\u0194\3\2\2\2\u0193\u0195\5 \20\2\u0194",
239
- "\u0193\3\2\2\2\u0194\u0195\3\2\2\2\u0195\u0196\3\2\2\2\u0196\u0197",
240
- "\b)\16\2\u0197S\3\2\2\2\u0198\u0199\7A\2\2\u0199U\3\2\2\2\u019a\u019b",
241
- "\7\61\2\2\u019bW\3\2\2\2\u019c\u019d\7@\2\2\u019dY\3\2\2\2\u019e\u019f",
242
- "\7>\2\2\u019f[\3\2\2\2\u01a0\u01a1\7,\2\2\u01a1]\3\2\2\2\u01a2\u01a3",
243
- "\7(\2\2\u01a3_\3\2\2\2\u01a4\u01a5\7~\2\2\u01a5a\3\2\2\2\u01a6\u01a7",
244
- "\7#\2\2\u01a7c\3\2\2\2\u01a8\u01a9\7}\2\2\u01a9\u01aa\3\2\2\2\u01aa",
245
- "\u01ab\b\62\3\2\u01ab\u01ac\b\62\17\2\u01ace\3\2\2\2\u01ad\u01b5\7",
246
- "$\2\2\u01ae\u01b4\5(\24\2\u01af\u01b0\7\u0080\2\2\u01b0\u01b4\7$\2",
247
- "\2\u01b1\u01b2\7^\2\2\u01b2\u01b4\7$\2\2\u01b3\u01ae\3\2\2\2\u01b3",
248
- "\u01af\3\2\2\2\u01b3\u01b1\3\2\2\2\u01b4\u01b7\3\2\2\2\u01b5\u01b3",
249
- "\3\2\2\2\u01b5\u01b6\3\2\2\2\u01b6\u01b8\3\2\2\2\u01b7\u01b5\3\2\2",
250
- "\2\u01b8\u01be\7$\2\2\u01b9\u01ba\7b\2\2\u01ba\u01bb\5*\25\2\u01bb",
251
- "\u01bc\7b\2\2\u01bc\u01be\3\2\2\2\u01bd\u01ad\3\2\2\2\u01bd\u01b9\3",
252
- "\2\2\2\u01be\u01bf\3\2\2\2\u01bf\u01c0\b\63\20\2\u01c0g\3\2\2\2\u01c1",
253
- "\u01c4\5n\67\2\u01c2\u01c4\5j\65\2\u01c3\u01c1\3\2\2\2\u01c3\u01c2",
254
- "\3\2\2\2\u01c4\u01c5\3\2\2\2\u01c5\u01c3\3\2\2\2\u01c5\u01c6\3\2\2",
255
- "\2\u01c6\u01d4\3\2\2\2\u01c7\u01c9\7\"\2\2\u01c8\u01c7\3\2\2\2\u01c9",
256
- "\u01ca\3\2\2\2\u01ca\u01c8\3\2\2\2\u01ca\u01cb\3\2\2\2\u01cb\u01ce",
257
- "\3\2\2\2\u01cc\u01cf\5n\67\2\u01cd\u01cf\5j\65\2\u01ce\u01cc\3\2\2",
258
- "\2\u01ce\u01cd\3\2\2\2\u01cf\u01d0\3\2\2\2\u01d0\u01ce\3\2\2\2\u01d0",
259
- "\u01d1\3\2\2\2\u01d1\u01d3\3\2\2\2\u01d2\u01c8\3\2\2\2\u01d3\u01d6",
260
- "\3\2\2\2\u01d4\u01d2\3\2\2\2\u01d4\u01d5\3\2\2\2\u01d5\u01d7\3\2\2",
261
- "\2\u01d6\u01d4\3\2\2\2\u01d7\u01d8\b\64\21\2\u01d8i\3\2\2\2\u01d9\u01da",
262
- "\n\r\2\2\u01dak\3\2\2\2\u01db\u01dc\t\r\2\2\u01dcm\3\2\2\2\u01dd\u01e0",
263
- "\7^\2\2\u01de\u01e1\t\13\2\2\u01df\u01e1\5\64\32\2\u01e0\u01de\3\2",
264
- "\2\2\u01e0\u01df\3\2\2\2\u01e1\u01e7\3\2\2\2\u01e2\u01e3\7^\2\2\u01e3",
265
- "\u01e7\5l\66\2\u01e4\u01e5\7\u0080\2\2\u01e5\u01e7\5l\66\2\u01e6\u01dd",
266
- "\3\2\2\2\u01e6\u01e2\3\2\2\2\u01e6\u01e4\3\2\2\2\u01e7o\3\2\2\2\u01e8",
267
- "\u01e9\7%\2\2\u01e9\u01ea\7%\2\2\u01ea\u01eb\3\2\2\2\u01eb\u01ec\5",
268
- "$\22\2\u01ec\u01ed\3\2\2\2\u01ed\u01ee\b8\2\2\u01eeq\3\2\2\2\u01ef",
269
- "\u01f0\7\177\2\2\u01f0\u01f1\3\2\2\2\u01f1\u01f2\b9\22\2\u01f2s\3\2",
270
- "\2\2\62\2\3w\u0086\u0092\u00a0\u00b3\u00ba\u00bc\u00bf\u00c6\u00c9",
103
+ "\3\31\3\31\3\31\5\31\u0121\n\31\3\31\3\31\3\31\3\31\3\31\5\31\u0128",
104
+ "\n\31\5\31\u012a\n\31\3\32\3\32\3\32\3\32\3\32\3\32\3\33\3\33\3\34",
105
+ "\3\34\3\34\3\35\3\35\3\35\3\35\3\36\6\36\u013c\n\36\r\36\16\36\u013d",
106
+ "\3\36\3\36\3\37\3\37\3\37\3\37\3\37\3\37\3\37\3\37\3\37\3\37\3\37\5",
107
+ "\37\u014d\n\37\3\37\3\37\3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \5 \u015b\n ",
108
+ "\3 \3 \3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\5!\u016b\n!\3!\3!\3\"\3",
109
+ "\"\3\"\3\"\3#\3#\3#\3#\3$\3$\3$\3$\3%\3%\3%\3%\3&\3&\3&\3&\3\'\3\'",
110
+ "\3\'\3\'\3(\3(\3(\3(\3)\5)\u018c\n)\3)\3)\3)\6)\u0191\n)\r)\16)\u0192",
111
+ "\5)\u0195\n)\3)\5)\u0198\n)\3)\3)\3*\3*\3+\3+\3,\3,\3-\3-\3.\3.\3/",
112
+ "\3/\3\60\3\60\3\61\3\61\3\62\3\62\3\62\3\62\3\62\3\63\3\63\3\63\3\63",
113
+ "\3\63\3\63\7\63\u01b7\n\63\f\63\16\63\u01ba\13\63\3\63\3\63\3\63\3",
114
+ "\63\3\63\5\63\u01c1\n\63\3\63\3\63\3\64\3\64\6\64\u01c7\n\64\r\64\16",
115
+ "\64\u01c8\3\64\6\64\u01cc\n\64\r\64\16\64\u01cd\3\64\3\64\6\64\u01d2",
116
+ "\n\64\r\64\16\64\u01d3\7\64\u01d6\n\64\f\64\16\64\u01d9\13\64\3\64",
117
+ "\3\64\3\65\3\65\3\66\3\66\3\67\3\67\3\67\5\67\u01e4\n\67\3\67\3\67",
118
+ "\3\67\3\67\5\67\u01ea\n\67\38\38\38\38\38\38\38\39\39\39\39\2\2:\4",
119
+ "\3\6\4\b\5\n\6\f\7\16\b\20\t\22\n\24\13\26\f\30\r\32\16\34\17\36\2",
120
+ " \2\"\20$\2&\21(\2*\2,\22.\2\60\2\62\2\64\2\66\28\23:\24<\25>\2@\2",
121
+ "B\2D\2F\2H\2J\2L\2N\2P\2R\2T\26V\27X\30Z\31\\\32^\33`\34b\35d\2f\2",
122
+ "h\2j\2l\2n\2p\36r\37\4\2\3\16\5\2\13\f\17\17\"\"\3\2\62;\3\2\63;\4",
123
+ "\2GGgg\4\2--//\4\2\f\f\17\17\3\2$$\3\2bb\f\2\n\f\16\17\"\"$%*+<=??",
124
+ "]_}}\177\u0080\t\2\61\61^^ddhhppttvv\5\2\62;CHch\13\2\n\f\16\17\"%",
125
+ "((*+\61\61<A]_}\u0080\2\u0221\2\4\3\2\2\2\2\6\3\2\2\2\2\b\3\2\2\2\2",
126
+ "\n\3\2\2\2\2\f\3\2\2\2\2\16\3\2\2\2\2\20\3\2\2\2\2\22\3\2\2\2\2\24",
127
+ "\3\2\2\2\2\26\3\2\2\2\2\30\3\2\2\2\2\32\3\2\2\2\2\34\3\2\2\2\2\"\3",
128
+ "\2\2\2\2&\3\2\2\2\2,\3\2\2\2\28\3\2\2\2\2:\3\2\2\2\3<\3\2\2\2\3>\3",
129
+ "\2\2\2\3@\3\2\2\2\3B\3\2\2\2\3D\3\2\2\2\3F\3\2\2\2\3H\3\2\2\2\3J\3",
130
+ "\2\2\2\3L\3\2\2\2\3N\3\2\2\2\3P\3\2\2\2\3R\3\2\2\2\3T\3\2\2\2\3V\3",
131
+ "\2\2\2\3X\3\2\2\2\3Z\3\2\2\2\3\\\3\2\2\2\3^\3\2\2\2\3`\3\2\2\2\3b\3",
132
+ "\2\2\2\3d\3\2\2\2\3f\3\2\2\2\3h\3\2\2\2\3p\3\2\2\2\3r\3\2\2\2\4u\3",
133
+ "\2\2\2\6\u0086\3\2\2\2\b\u0092\3\2\2\2\n\u00a0\3\2\2\2\f\u00a2\3\2",
134
+ "\2\2\16\u00a4\3\2\2\2\20\u00a6\3\2\2\2\22\u00a8\3\2\2\2\24\u00aa\3",
135
+ "\2\2\2\26\u00ac\3\2\2\2\30\u00ae\3\2\2\2\32\u00b0\3\2\2\2\34\u00b3",
136
+ "\3\2\2\2\36\u00c9\3\2\2\2 \u00cb\3\2\2\2\"\u00d1\3\2\2\2$\u00db\3\2",
137
+ "\2\2&\u00ee\3\2\2\2(\u00f0\3\2\2\2*\u00f5\3\2\2\2,\u00fa\3\2\2\2.\u0119",
138
+ "\3\2\2\2\60\u011b\3\2\2\2\62\u0129\3\2\2\2\64\u012b\3\2\2\2\66\u0131",
139
+ "\3\2\2\28\u0133\3\2\2\2:\u0136\3\2\2\2<\u013b\3\2\2\2>\u014c\3\2\2",
140
+ "\2@\u015a\3\2\2\2B\u016a\3\2\2\2D\u016e\3\2\2\2F\u0172\3\2\2\2H\u0176",
141
+ "\3\2\2\2J\u017a\3\2\2\2L\u017e\3\2\2\2N\u0182\3\2\2\2P\u0186\3\2\2",
142
+ "\2R\u018b\3\2\2\2T\u019b\3\2\2\2V\u019d\3\2\2\2X\u019f\3\2\2\2Z\u01a1",
143
+ "\3\2\2\2\\\u01a3\3\2\2\2^\u01a5\3\2\2\2`\u01a7\3\2\2\2b\u01a9\3\2\2",
144
+ "\2d\u01ab\3\2\2\2f\u01c0\3\2\2\2h\u01c6\3\2\2\2j\u01dc\3\2\2\2l\u01de",
145
+ "\3\2\2\2n\u01e9\3\2\2\2p\u01eb\3\2\2\2r\u01f2\3\2\2\2tv\t\2\2\2ut\3",
146
+ "\2\2\2vw\3\2\2\2wu\3\2\2\2wx\3\2\2\2xy\3\2\2\2yz\b\2\2\2z\5\3\2\2\2",
147
+ "{|\7\62\2\2|}\7\62\2\2}\u0087\7\62\2\2~\177\7p\2\2\177\u0080\7w\2\2",
148
+ "\u0080\u0081\7n\2\2\u0081\u0087\7n\2\2\u0082\u0083\7P\2\2\u0083\u0084",
149
+ "\7W\2\2\u0084\u0085\7N\2\2\u0085\u0087\7N\2\2\u0086{\3\2\2\2\u0086",
150
+ "~\3\2\2\2\u0086\u0082\3\2\2\2\u0087\7\3\2\2\2\u0088\u0089\7\62\2\2",
151
+ "\u0089\u0093\7\63\2\2\u008a\u008b\7v\2\2\u008b\u008c\7t\2\2\u008c\u008d",
152
+ "\7w\2\2\u008d\u0093\7g\2\2\u008e\u008f\7V\2\2\u008f\u0090\7T\2\2\u0090",
153
+ "\u0091\7W\2\2\u0091\u0093\7G\2\2\u0092\u0088\3\2\2\2\u0092\u008a\3",
154
+ "\2\2\2\u0092\u008e\3\2\2\2\u0093\t\3\2\2\2\u0094\u0095\7\62\2\2\u0095",
155
+ "\u00a1\7\62\2\2\u0096\u0097\7h\2\2\u0097\u0098\7c\2\2\u0098\u0099\7",
156
+ "n\2\2\u0099\u009a\7u\2\2\u009a\u00a1\7g\2\2\u009b\u009c\7H\2\2\u009c",
157
+ "\u009d\7C\2\2\u009d\u009e\7N\2\2\u009e\u009f\7U\2\2\u009f\u00a1\7G",
158
+ "\2\2\u00a0\u0094\3\2\2\2\u00a0\u0096\3\2\2\2\u00a0\u009b\3\2\2\2\u00a1",
159
+ "\13\3\2\2\2\u00a2\u00a3\7<\2\2\u00a3\r\3\2\2\2\u00a4\u00a5\7?\2\2\u00a5",
160
+ "\17\3\2\2\2\u00a6\u00a7\7=\2\2\u00a7\21\3\2\2\2\u00a8\u00a9\7.\2\2",
161
+ "\u00a9\23\3\2\2\2\u00aa\u00ab\7*\2\2\u00ab\25\3\2\2\2\u00ac\u00ad\7",
162
+ "+\2\2\u00ad\27\3\2\2\2\u00ae\u00af\7]\2\2\u00af\31\3\2\2\2\u00b0\u00b1",
163
+ "\7_\2\2\u00b1\33\3\2\2\2\u00b2\u00b4\7/\2\2\u00b3\u00b2\3\2\2\2\u00b3",
164
+ "\u00b4\3\2\2\2\u00b4\u00b5\3\2\2\2\u00b5\u00bc\5\36\17\2\u00b6\u00b8",
165
+ "\7\60\2\2\u00b7\u00b9\t\3\2\2\u00b8\u00b7\3\2\2\2\u00b9\u00ba\3\2\2",
166
+ "\2\u00ba\u00b8\3\2\2\2\u00ba\u00bb\3\2\2\2\u00bb\u00bd\3\2\2\2\u00bc",
167
+ "\u00b6\3\2\2\2\u00bc\u00bd\3\2\2\2\u00bd\u00bf\3\2\2\2\u00be\u00c0",
168
+ "\5 \20\2\u00bf\u00be\3\2\2\2\u00bf\u00c0\3\2\2\2\u00c0\35\3\2\2\2\u00c1",
169
+ "\u00ca\7\62\2\2\u00c2\u00c6\t\4\2\2\u00c3\u00c5\t\3\2\2\u00c4\u00c3",
170
+ "\3\2\2\2\u00c5\u00c8\3\2\2\2\u00c6\u00c4\3\2\2\2\u00c6\u00c7\3\2\2",
171
+ "\2\u00c7\u00ca\3\2\2\2\u00c8\u00c6\3\2\2\2\u00c9\u00c1\3\2\2\2\u00c9",
172
+ "\u00c2\3\2\2\2\u00ca\37\3\2\2\2\u00cb\u00cd\t\5\2\2\u00cc\u00ce\t\6",
173
+ "\2\2\u00cd\u00cc\3\2\2\2\u00cd\u00ce\3\2\2\2\u00ce\u00cf\3\2\2\2\u00cf",
174
+ "\u00d0\5\36\17\2\u00d0!\3\2\2\2\u00d1\u00d2\7%\2\2\u00d2\u00d3\7%\2",
175
+ "\2\u00d3\u00d4\3\2\2\2\u00d4\u00d5\5$\22\2\u00d5\u00d6\3\2\2\2\u00d6",
176
+ "\u00d7\b\21\2\2\u00d7#\3\2\2\2\u00d8\u00da\n\7\2\2\u00d9\u00d8\3\2",
177
+ "\2\2\u00da\u00dd\3\2\2\2\u00db\u00d9\3\2\2\2\u00db\u00dc\3\2\2\2\u00dc",
178
+ "%\3\2\2\2\u00dd\u00db\3\2\2\2\u00de\u00e6\7$\2\2\u00df\u00e5\5(\24",
179
+ "\2\u00e0\u00e1\7\u0080\2\2\u00e1\u00e5\7$\2\2\u00e2\u00e3\7^\2\2\u00e3",
180
+ "\u00e5\7$\2\2\u00e4\u00df\3\2\2\2\u00e4\u00e0\3\2\2\2\u00e4\u00e2\3",
181
+ "\2\2\2\u00e5\u00e8\3\2\2\2\u00e6\u00e4\3\2\2\2\u00e6\u00e7\3\2\2\2",
182
+ "\u00e7\u00e9\3\2\2\2\u00e8\u00e6\3\2\2\2\u00e9\u00ef\7$\2\2\u00ea\u00eb",
183
+ "\7b\2\2\u00eb\u00ec\5*\25\2\u00ec\u00ed\7b\2\2\u00ed\u00ef\3\2\2\2",
184
+ "\u00ee\u00de\3\2\2\2\u00ee\u00ea\3\2\2\2\u00ef\'\3\2\2\2\u00f0\u00f1",
185
+ "\n\b\2\2\u00f1)\3\2\2\2\u00f2\u00f4\n\t\2\2\u00f3\u00f2\3\2\2\2\u00f4",
186
+ "\u00f7\3\2\2\2\u00f5\u00f3\3\2\2\2\u00f5\u00f6\3\2\2\2\u00f6+\3\2\2",
187
+ "\2\u00f7\u00f5\3\2\2\2\u00f8\u00f9\7%\2\2\u00f9\u00fb\7\"\2\2\u00fa",
188
+ "\u00f8\3\2\2\2\u00fa\u00fb\3\2\2\2\u00fb\u00ff\3\2\2\2\u00fc\u0100",
189
+ "\5\62\31\2\u00fd\u0100\5.\27\2\u00fe\u0100\58\34\2\u00ff\u00fc\3\2",
190
+ "\2\2\u00ff\u00fd\3\2\2\2\u00ff\u00fe\3\2\2\2\u0100\u0101\3\2\2\2\u0101",
191
+ "\u00ff\3\2\2\2\u0101\u0102\3\2\2\2\u0102\u0116\3\2\2\2\u0103\u0105",
192
+ "\7%\2\2\u0104\u0103\3\2\2\2\u0104\u0105\3\2\2\2\u0105\u0107\3\2\2\2",
193
+ "\u0106\u0108\7\"\2\2\u0107\u0106\3\2\2\2\u0108\u0109\3\2\2\2\u0109",
194
+ "\u0107\3\2\2\2\u0109\u010a\3\2\2\2\u010a\u010c\3\2\2\2\u010b\u010d",
195
+ "\7%\2\2\u010c\u010b\3\2\2\2\u010c\u010d\3\2\2\2\u010d\u0110\3\2\2\2",
196
+ "\u010e\u0111\5\62\31\2\u010f\u0111\5.\27\2\u0110\u010e\3\2\2\2\u0110",
197
+ "\u010f\3\2\2\2\u0111\u0112\3\2\2\2\u0112\u0110\3\2\2\2\u0112\u0113",
198
+ "\3\2\2\2\u0113\u0115\3\2\2\2\u0114\u0104\3\2\2\2\u0115\u0118\3\2\2",
199
+ "\2\u0116\u0114\3\2\2\2\u0116\u0117\3\2\2\2\u0117-\3\2\2\2\u0118\u0116",
200
+ "\3\2\2\2\u0119\u011a\n\n\2\2\u011a/\3\2\2\2\u011b\u011c\t\n\2\2\u011c",
201
+ "\61\3\2\2\2\u011d\u0120\7^\2\2\u011e\u0121\t\13\2\2\u011f\u0121\5\64",
202
+ "\32\2\u0120\u011e\3\2\2\2\u0120\u011f\3\2\2\2\u0121\u012a\3\2\2\2\u0122",
203
+ "\u0123\7^\2\2\u0123\u012a\5\60\30\2\u0124\u0127\7\u0080\2\2\u0125\u0128",
204
+ "\5\60\30\2\u0126\u0128\5\64\32\2\u0127\u0125\3\2\2\2\u0127\u0126\3",
205
+ "\2\2\2\u0128\u012a\3\2\2\2\u0129\u011d\3\2\2\2\u0129\u0122\3\2\2\2",
206
+ "\u0129\u0124\3\2\2\2\u012a\63\3\2\2\2\u012b\u012c\7w\2\2\u012c\u012d",
207
+ "\5\66\33\2\u012d\u012e\5\66\33\2\u012e\u012f\5\66\33\2\u012f\u0130",
208
+ "\5\66\33\2\u0130\65\3\2\2\2\u0131\u0132\t\f\2\2\u0132\67\3\2\2\2\u0133",
209
+ "\u0134\7%\2\2\u0134\u0135\5,\26\2\u01359\3\2\2\2\u0136\u0137\7}\2\2",
210
+ "\u0137\u0138\3\2\2\2\u0138\u0139\b\35\3\2\u0139;\3\2\2\2\u013a\u013c",
211
+ "\t\2\2\2\u013b\u013a\3\2\2\2\u013c\u013d\3\2\2\2\u013d\u013b\3\2\2",
212
+ "\2\u013d\u013e\3\2\2\2\u013e\u013f\3\2\2\2\u013f\u0140\b\36\2\2\u0140",
213
+ "=\3\2\2\2\u0141\u0142\7\62\2\2\u0142\u0143\7\62\2\2\u0143\u014d\7\62",
214
+ "\2\2\u0144\u0145\7p\2\2\u0145\u0146\7w\2\2\u0146\u0147\7n\2\2\u0147",
215
+ "\u014d\7n\2\2\u0148\u0149\7P\2\2\u0149\u014a\7W\2\2\u014a\u014b\7N",
216
+ "\2\2\u014b\u014d\7N\2\2\u014c\u0141\3\2\2\2\u014c\u0144\3\2\2\2\u014c",
217
+ "\u0148\3\2\2\2\u014d\u014e\3\2\2\2\u014e\u014f\b\37\4\2\u014f?\3\2",
218
+ "\2\2\u0150\u0151\7\62\2\2\u0151\u015b\7\63\2\2\u0152\u0153\7v\2\2\u0153",
219
+ "\u0154\7t\2\2\u0154\u0155\7w\2\2\u0155\u015b\7g\2\2\u0156\u0157\7V",
220
+ "\2\2\u0157\u0158\7T\2\2\u0158\u0159\7W\2\2\u0159\u015b\7G\2\2\u015a",
221
+ "\u0150\3\2\2\2\u015a\u0152\3\2\2\2\u015a\u0156\3\2\2\2\u015b\u015c",
222
+ "\3\2\2\2\u015c\u015d\b \5\2\u015dA\3\2\2\2\u015e\u015f\7\62\2\2\u015f",
223
+ "\u016b\7\62\2\2\u0160\u0161\7h\2\2\u0161\u0162\7c\2\2\u0162\u0163\7",
224
+ "n\2\2\u0163\u0164\7u\2\2\u0164\u016b\7g\2\2\u0165\u0166\7H\2\2\u0166",
225
+ "\u0167\7C\2\2\u0167\u0168\7N\2\2\u0168\u0169\7U\2\2\u0169\u016b\7G",
226
+ "\2\2\u016a\u015e\3\2\2\2\u016a\u0160\3\2\2\2\u016a\u0165\3\2\2\2\u016b",
227
+ "\u016c\3\2\2\2\u016c\u016d\b!\6\2\u016dC\3\2\2\2\u016e\u016f\7<\2\2",
228
+ "\u016f\u0170\3\2\2\2\u0170\u0171\b\"\7\2\u0171E\3\2\2\2\u0172\u0173",
229
+ "\7?\2\2\u0173\u0174\3\2\2\2\u0174\u0175\b#\b\2\u0175G\3\2\2\2\u0176",
230
+ "\u0177\7=\2\2\u0177\u0178\3\2\2\2\u0178\u0179\b$\t\2\u0179I\3\2\2\2",
231
+ "\u017a\u017b\7*\2\2\u017b\u017c\3\2\2\2\u017c\u017d\b%\n\2\u017dK\3",
232
+ "\2\2\2\u017e\u017f\7+\2\2\u017f\u0180\3\2\2\2\u0180\u0181\b&\13\2\u0181",
233
+ "M\3\2\2\2\u0182\u0183\7]\2\2\u0183\u0184\3\2\2\2\u0184\u0185\b\'\f",
234
+ "\2\u0185O\3\2\2\2\u0186\u0187\7_\2\2\u0187\u0188\3\2\2\2\u0188\u0189",
235
+ "\b(\r\2\u0189Q\3\2\2\2\u018a\u018c\7/\2\2\u018b\u018a\3\2\2\2\u018b",
236
+ "\u018c\3\2\2\2\u018c\u018d\3\2\2\2\u018d\u0194\5\36\17\2\u018e\u0190",
237
+ "\7\60\2\2\u018f\u0191\t\3\2\2\u0190\u018f\3\2\2\2\u0191\u0192\3\2\2",
238
+ "\2\u0192\u0190\3\2\2\2\u0192\u0193\3\2\2\2\u0193\u0195\3\2\2\2\u0194",
239
+ "\u018e\3\2\2\2\u0194\u0195\3\2\2\2\u0195\u0197\3\2\2\2\u0196\u0198",
240
+ "\5 \20\2\u0197\u0196\3\2\2\2\u0197\u0198\3\2\2\2\u0198\u0199\3\2\2",
241
+ "\2\u0199\u019a\b)\16\2\u019aS\3\2\2\2\u019b\u019c\7A\2\2\u019cU\3\2",
242
+ "\2\2\u019d\u019e\7\61\2\2\u019eW\3\2\2\2\u019f\u01a0\7@\2\2\u01a0Y",
243
+ "\3\2\2\2\u01a1\u01a2\7>\2\2\u01a2[\3\2\2\2\u01a3\u01a4\7,\2\2\u01a4",
244
+ "]\3\2\2\2\u01a5\u01a6\7(\2\2\u01a6_\3\2\2\2\u01a7\u01a8\7~\2\2\u01a8",
245
+ "a\3\2\2\2\u01a9\u01aa\7#\2\2\u01aac\3\2\2\2\u01ab\u01ac\7}\2\2\u01ac",
246
+ "\u01ad\3\2\2\2\u01ad\u01ae\b\62\3\2\u01ae\u01af\b\62\17\2\u01afe\3",
247
+ "\2\2\2\u01b0\u01b8\7$\2\2\u01b1\u01b7\5(\24\2\u01b2\u01b3\7\u0080\2",
248
+ "\2\u01b3\u01b7\7$\2\2\u01b4\u01b5\7^\2\2\u01b5\u01b7\7$\2\2\u01b6\u01b1",
249
+ "\3\2\2\2\u01b6\u01b2\3\2\2\2\u01b6\u01b4\3\2\2\2\u01b7\u01ba\3\2\2",
250
+ "\2\u01b8\u01b6\3\2\2\2\u01b8\u01b9\3\2\2\2\u01b9\u01bb\3\2\2\2\u01ba",
251
+ "\u01b8\3\2\2\2\u01bb\u01c1\7$\2\2\u01bc\u01bd\7b\2\2\u01bd\u01be\5",
252
+ "*\25\2\u01be\u01bf\7b\2\2\u01bf\u01c1\3\2\2\2\u01c0\u01b0\3\2\2\2\u01c0",
253
+ "\u01bc\3\2\2\2\u01c1\u01c2\3\2\2\2\u01c2\u01c3\b\63\20\2\u01c3g\3\2",
254
+ "\2\2\u01c4\u01c7\5n\67\2\u01c5\u01c7\5j\65\2\u01c6\u01c4\3\2\2\2\u01c6",
255
+ "\u01c5\3\2\2\2\u01c7\u01c8\3\2\2\2\u01c8\u01c6\3\2\2\2\u01c8\u01c9",
256
+ "\3\2\2\2\u01c9\u01d7\3\2\2\2\u01ca\u01cc\7\"\2\2\u01cb\u01ca\3\2\2",
257
+ "\2\u01cc\u01cd\3\2\2\2\u01cd\u01cb\3\2\2\2\u01cd\u01ce\3\2\2\2\u01ce",
258
+ "\u01d1\3\2\2\2\u01cf\u01d2\5n\67\2\u01d0\u01d2\5j\65\2\u01d1\u01cf",
259
+ "\3\2\2\2\u01d1\u01d0\3\2\2\2\u01d2\u01d3\3\2\2\2\u01d3\u01d1\3\2\2",
260
+ "\2\u01d3\u01d4\3\2\2\2\u01d4\u01d6\3\2\2\2\u01d5\u01cb\3\2\2\2\u01d6",
261
+ "\u01d9\3\2\2\2\u01d7\u01d5\3\2\2\2\u01d7\u01d8\3\2\2\2\u01d8\u01da",
262
+ "\3\2\2\2\u01d9\u01d7\3\2\2\2\u01da\u01db\b\64\21\2\u01dbi\3\2\2\2\u01dc",
263
+ "\u01dd\n\r\2\2\u01ddk\3\2\2\2\u01de\u01df\t\r\2\2\u01dfm\3\2\2\2\u01e0",
264
+ "\u01e3\7^\2\2\u01e1\u01e4\t\13\2\2\u01e2\u01e4\5\64\32\2\u01e3\u01e1",
265
+ "\3\2\2\2\u01e3\u01e2\3\2\2\2\u01e4\u01ea\3\2\2\2\u01e5\u01e6\7^\2\2",
266
+ "\u01e6\u01ea\5l\66\2\u01e7\u01e8\7\u0080\2\2\u01e8\u01ea\5l\66\2\u01e9",
267
+ "\u01e0\3\2\2\2\u01e9\u01e5\3\2\2\2\u01e9\u01e7\3\2\2\2\u01eao\3\2\2",
268
+ "\2\u01eb\u01ec\7%\2\2\u01ec\u01ed\7%\2\2\u01ed\u01ee\3\2\2\2\u01ee",
269
+ "\u01ef\5$\22\2\u01ef\u01f0\3\2\2\2\u01f0\u01f1\b8\2\2\u01f1q\3\2\2",
270
+ "\2\u01f2\u01f3\7\177\2\2\u01f3\u01f4\3\2\2\2\u01f4\u01f5\b9\22\2\u01f5",
271
+ "s\3\2\2\2\63\2\3w\u0086\u0092\u00a0\u00b3\u00ba\u00bc\u00bf\u00c6\u00c9",
271
272
  "\u00cd\u00db\u00e4\u00e6\u00ee\u00f5\u00fa\u00ff\u0101\u0104\u0109",
272
- "\u010c\u0110\u0112\u0116\u0120\u0126\u013a\u0149\u0157\u0167\u0188",
273
- "\u018f\u0191\u0194\u01b3\u01b5\u01bd\u01c3\u01c5\u01ca\u01ce\u01d0",
274
- "\u01d4\u01e0\u01e6\23\b\2\2\7\3\2\t\4\2\t\5\2\t\6\2\t\7\2\t\b\2\t\t",
275
- "\2\t\13\2\t\f\2\t\r\2\t\16\2\t\17\2\t\24\2\t\21\2\t\22\2\6\2\2"].join("")
273
+ "\u010c\u0110\u0112\u0116\u0120\u0127\u0129\u013d\u014c\u015a\u016a",
274
+ "\u018b\u0192\u0194\u0197\u01b6\u01b8\u01c0\u01c6\u01c8\u01cd\u01d1",
275
+ "\u01d3\u01d7\u01e3\u01e9\23\b\2\2\7\3\2\t\4\2\t\5\2\t\6\2\t\7\2\t\b",
276
+ "\2\t\t\2\t\13\2\t\f\2\t\r\2\t\16\2\t\17\2\t\24\2\t\21\2\t\22\2\6\2",
277
+ "\2"].join("")
276
278
 
277
279
  @@_ATN = Antlr4::Runtime::ATNDeserializer.new().deserialize(@@_serializedATN)
278
280
 
@@ -35,6 +35,23 @@ module MODL
35
35
  # Any other object is ignored.
36
36
  raise StandardError, 'parameter "global" should be a GlobalParseContext' unless global.is_a?(GlobalParseContext)
37
37
 
38
+ if obj.is_a? Array
39
+ root_class = global.classs 'root'
40
+ unless root_class.nil?
41
+ raise StandardError, 'root class has no *assign statement.' if root_class.assign.nil?
42
+ raise StandardError, 'root class *assign statement should be of the form "*assign=[[class_name]]".' if root_class.assign.length > 1 || root_class.assign[0].length > 1
43
+ root_class_assign = root_class.assign[0][0]
44
+ new_obj = {root_class_assign => obj}
45
+ obj = new_obj
46
+ end
47
+ end
48
+ process_recursive global, obj
49
+ return obj
50
+ end
51
+
52
+ private
53
+
54
+ def self.process_recursive(global, obj)
38
55
  if obj.is_a? Array
39
56
  obj.each do |o|
40
57
  process_obj global, o if o.is_a? Hash
@@ -44,8 +61,6 @@ module MODL
44
61
  end
45
62
  end
46
63
 
47
- private
48
-
49
64
  # Process the contents of the supplied hash obj
50
65
  def self.process_obj(global, obj)
51
66
  obj.keys.each do |k|
@@ -62,7 +77,7 @@ module MODL
62
77
  new_v = value
63
78
  end
64
79
  # Recurse into the value in case it has contents that also refer to classes.
65
- process global, new_v
80
+ process_recursive global, new_v
66
81
  end
67
82
  end
68
83
 
@@ -111,8 +126,8 @@ module MODL
111
126
  return [k, v]
112
127
  end
113
128
 
114
- if k == clazz.name && !(v.is_a?(Array) || v.is_a?(Hash))
115
- new_value = transform_to_class(clazz, global, [v], true)
129
+ if k == clazz.name && !v.is_a?(Array)
130
+ new_value = transform_to_class(clazz, global, [v], v.is_a?(Hash))
116
131
  if new_value.is_a?(Array) && new_value.length == 1
117
132
  return [clazz.name_or_id, new_value[0]]
118
133
  else
@@ -120,7 +135,7 @@ module MODL
120
135
  end
121
136
  end
122
137
 
123
- new_value = transform_to_class(clazz, global, v)
138
+ new_value = transform_to_class(clazz, global, v, v.is_a?(Hash))
124
139
 
125
140
  if v.is_a?(Array)
126
141
  new_value = v if new_value.empty?
@@ -137,7 +152,11 @@ module MODL
137
152
  # and the rules defined here: https://github.com/MODLanguage/grammar/wiki/Class-Supertype-Processing
138
153
  #
139
154
  if has_assign_statement?(clazz, global)
140
- tc = 'map'
155
+ if all_assignment_keys_are_classes?(clazz, global)
156
+ tc = 'arr'
157
+ else
158
+ tc = 'map'
159
+ end
141
160
  else
142
161
  if has_inherited_pairs?(clazz, global)
143
162
  tc = 'map'
@@ -181,7 +200,9 @@ module MODL
181
200
  new_value = nil
182
201
  elsif tc == 'arr'
183
202
  if v.is_a? Array
184
- new_value = v
203
+ if new_value.is_a? Hash
204
+ new_value = new_value.values
205
+ end
185
206
  elsif v.is_a? Hash
186
207
  raise InterpreterError, 'Interpreter Error: Cannot convert map to array: ' + v.to_s
187
208
  else
@@ -206,6 +227,18 @@ module MODL
206
227
  [clazz.name_or_id, new_value]
207
228
  end
208
229
 
230
+ def self.all_assignment_keys_are_classes? clazz, global
231
+ lists = key_lists global, clazz
232
+ result = true
233
+ lists.each do |list|
234
+ list.each do |item|
235
+ global_class = global.classs(item)
236
+ result &= (!global_class.nil? && has_assign_statement?(global_class, global))
237
+ end
238
+ end
239
+ result
240
+ end
241
+
209
242
  # Bring down values from the superclass hierarchy
210
243
  def self.copy_from_superclasses(clazz, global, new_value, v)
211
244
  if v.is_a? Hash
@@ -271,31 +304,48 @@ module MODL
271
304
  # Process the key list if we found one otherwise raise an error
272
305
  # Slightly different processing for hashes and arrays
273
306
  unless ignore_assign
307
+ raise StandardError, 'cannot use "*assign" to populate a map: ' + clazz.id if has_assign_statement?(clazz, global) && clazz.superclass == 'map' && !v.is_a?(Array)
274
308
  if v.is_a? Array
275
309
  keys = key_list(global, clazz, v.length)
276
310
  if keys.empty?
277
311
  return v
278
312
  else
279
- lam = ->(i) {v[i]}
313
+ lam = ->(i) { v[i] }
280
314
  end
281
315
  elsif !v.is_a?(Hash)
282
316
  keys = key_list(global, clazz, 1)
283
- lam = ->(i) {v}
317
+ lam = ->(i) { v }
284
318
  return v if keys.length.zero?
319
+ else
320
+ raise StandardError, 'cannot use "*assign" to populate a map: ' + clazz.id if has_assign_statement?(clazz, global)
285
321
  end
286
322
  end
287
323
 
288
- keys&.each_index do |i|
289
- new_value[keys[i]] = lam.call(i)
324
+ if keys.nil?
325
+ if v.is_a?(Hash)
326
+ new_value.merge v
327
+ elsif v.is_a?(Array) && v.length > 0
328
+ v.each do |item|
329
+ if item.is_a?(Hash)
330
+ new_value.merge! item
331
+ end
332
+ end
333
+ end
334
+ else
335
+ keys.each_index do |i|
336
+ new_value[keys[i]] = lam.call(i)
337
+ end
290
338
  end
291
339
 
292
340
  new_value.keys do |nk|
293
341
  process_obj global, new_value[nk]
294
342
  end
295
343
 
344
+ process_nested_classes(global, new_value)
296
345
  clazz.merge_content(new_value)
297
346
  end
298
347
 
348
+ # Find a *assign key list of a specific length
299
349
  def self.key_list(global, clazz, len)
300
350
  return [] if clazz.nil?
301
351
  list = clazz.keylist_of_length(len)
@@ -304,6 +354,14 @@ module MODL
304
354
  key_list(global, superclass, len)
305
355
  end
306
356
 
357
+ # Find all *assign key lists
358
+ def self.key_lists(global, clazz)
359
+ return [] if clazz.nil?
360
+ list = clazz.assign
361
+ superclass = global.classs(clazz.superclass)
362
+ return list + key_lists(global, superclass)
363
+ end
364
+
307
365
  # Get the top level class for the supplied class
308
366
  def self.top_class(clazz, global, depth = 0)
309
367
  # Check for self-referential classes that cause infinite recursion
@@ -27,7 +27,6 @@ require 'modl/parser/MODLParserVisitor'
27
27
  require 'modl/parser/MODLLexer'
28
28
  require 'modl/parser/MODLParser'
29
29
  require 'modl/parser/class_processor'
30
- require 'modl/parser/array_processor'
31
30
  require 'modl/parser/orphan_handler'
32
31
  require 'modl/parser/parser'
33
32
  require 'json'
@@ -68,8 +67,7 @@ module MODL
68
67
  interpreted = parsed.extract_hash
69
68
 
70
69
  # Process any class definitions used by the MODL file.
71
- MODL::Parser::ClassProcessor.process(parsed.global, interpreted)
72
- MODL::Parser::ArrayProcessor.process(parsed.global, interpreted)
70
+ interpreted = MODL::Parser::ClassProcessor.process(parsed.global, interpreted)
73
71
  MODL::Parser::InstructionProcessor.process(parsed.global, interpreted)
74
72
  # If the result is a simple string then just return it.
75
73
  interpreted
@@ -30,7 +30,6 @@ require 'modl/parser/file_importer'
30
30
  require 'antlr4/runtime/parse_cancellation_exception'
31
31
  require 'modl/parser/sutil'
32
32
  require 'modl/parser/modl_class'
33
- require 'modl/parser/modl_array'
34
33
  require 'modl/parser/modl_method'
35
34
  require 'modl/parser/modl_index'
36
35
  require 'modl/parser/modl_keylist'
@@ -287,9 +286,9 @@ module MODL
287
286
  return if @type == 'import'
288
287
  return if @type == 'allow'
289
288
  return if @type == 'expect'
290
- return if @type == 'array'
291
289
 
292
- {@key => @text}
290
+ formatted_key = Substitutions.process @key
291
+ {formatted_key => @text}
293
292
  end
294
293
 
295
294
  def enterModl_pair(ctx)
@@ -340,8 +339,6 @@ module MODL
340
339
  case @type
341
340
  when 'class'
342
341
  ClassExtractor.extract(self, @global)
343
- when 'array'
344
- ArrayExtractor.extract(self, @global)
345
342
  when 'id'
346
343
  extract_value
347
344
  when 'name'
@@ -484,8 +481,6 @@ module MODL
484
481
  @type = 'hidden' if @key.start_with? '_'
485
482
  @type = 'allow' if @key.downcase == '*allow'
486
483
  @type = 'expect' if @key.downcase == '*expect'
487
- @type = 'of' if @key.downcase == '*of'
488
- @type = 'array' if @key.downcase == '*array'
489
484
  end
490
485
  end
491
486
 
@@ -28,46 +28,46 @@ module MODL
28
28
  class Substitutions
29
29
 
30
30
  @@subs = [
31
- ['~%', '%'],
32
- ['\\%', '%'],
33
- ['~\\', '\\'],
34
- ['\\\\', '\\'],
35
- ['~~', '~'],
36
- ['\\~', '~'],
37
- ['~(', '('],
38
- ['\\(', '('],
39
- ['~)', ')'],
40
- ['\\)', ')'],
41
- ['~[', '['],
42
- ['\\[', '['],
43
- ['~]', ']'],
44
- ['\\]', ']'],
45
- ['~{', '{'],
46
- ['\\{', '{'],
47
- ['~}', '}'],
48
- ['\\}', '}'],
49
- ['~;', ';'],
50
- ['\\;', ';'],
51
- ['~:', ':'],
52
- ['\\:', ':'],
53
- ['~`', '`'],
54
- ['\\`', '`'],
55
- ['~"', '"'],
56
- ['\\"', '"'],
57
- ['~=', '='],
58
- ['\\=', '='],
59
- ['~/', '/'],
60
- ['\\/', '/'],
61
- ['<', '<'],
62
- ['\\<', '<'],
63
- ['~>', '>'],
64
- ['\\>', '>'],
65
- ['~&', '&'],
66
- ['\\&', '&'],
67
- ['!', '!'],
68
- ['\\!', '!'],
69
- ['~|', '|'],
70
- ['\\|', '|'],
31
+ %w(~% %),
32
+ %w(\\% %),
33
+ %w(~\\ \\),
34
+ %w(\\\\ \\),
35
+ %w(~~ ~),
36
+ %w(\\~ ~),
37
+ %w{~( (},
38
+ %w{\\( (},
39
+ %w{~) )},
40
+ %w{\\) )},
41
+ %w(~[ [),
42
+ %w(\\[ [),
43
+ %w(~] ]),
44
+ %w(\\] ]),
45
+ %w(~{ {),
46
+ %w(\\{ {),
47
+ %w(~} }),
48
+ %w(\\} }),
49
+ %w(~; ;),
50
+ %w(\\; ;),
51
+ %w(~: :),
52
+ %w(\\: :),
53
+ %w(~` `),
54
+ %w(\\` `),
55
+ %w(~" "),
56
+ %w(\\" "),
57
+ %w(~= =),
58
+ %w(\\= =),
59
+ %w(~/ /),
60
+ %w(\\/ /),
61
+ %w(< <),
62
+ %w(\\< <),
63
+ %w(~> >),
64
+ %w(\\> >),
65
+ %w(~& &),
66
+ %w(\\& &),
67
+ %w(! !),
68
+ %w(\\! !),
69
+ %w(~| |),
70
+ %w(\\| |),
71
71
  ['\\t', "\t"],
72
72
  ['\\n', "\n"],
73
73
  ['\\b', "\b"],
@@ -90,7 +90,19 @@ module MODL
90
90
  break unless new_str && new_str != prev
91
91
  end
92
92
  end
93
- new_str
93
+ convert_unicode new_str
94
+ end
95
+
96
+ def self.convert_unicode(s)
97
+ uni_str_idx = s.index('\u')
98
+ uni_str_idx = s.index('~u') if uni_str_idx.nil?
99
+ return s if uni_str_idx.nil?
100
+
101
+ value = s.slice(uni_str_idx + 2, 4).to_i(16)
102
+ uni_str = s.slice(uni_str_idx, 6)
103
+ uni_val = value.chr(Encoding::UTF_8)
104
+ result = s.sub(uni_str, uni_val)
105
+ return convert_unicode result
94
106
  end
95
107
  end
96
108
  end
@@ -24,6 +24,6 @@
24
24
 
25
25
  module MODL
26
26
  module Parser
27
- VERSION = "0.3.16"
27
+ VERSION = "0.3.17"
28
28
  end
29
29
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: modl
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.16
4
+ version: 0.3.17
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tony Walmsley
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2019-10-03 00:00:00.000000000 Z
11
+ date: 2019-10-11 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake
@@ -113,14 +113,12 @@ files:
113
113
  - lib/modl/parser/MODLParserBaseVisitor.rb
114
114
  - lib/modl/parser/MODLParserListener.rb
115
115
  - lib/modl/parser/MODLParserVisitor.rb
116
- - lib/modl/parser/array_processor.rb
117
116
  - lib/modl/parser/class_processor.rb
118
117
  - lib/modl/parser/evaluator.rb
119
118
  - lib/modl/parser/file_importer.rb
120
119
  - lib/modl/parser/global_parse_context.rb
121
120
  - lib/modl/parser/instruction_processor.rb
122
121
  - lib/modl/parser/interpreter.rb
123
- - lib/modl/parser/modl_array.rb
124
122
  - lib/modl/parser/modl_class.rb
125
123
  - lib/modl/parser/modl_index.rb
126
124
  - lib/modl/parser/modl_keylist.rb
@@ -1,120 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- # The MIT License (MIT)
4
- #
5
- # Copyright (c) 2019 NUM Technology Ltd
6
- #
7
- # Permission is hereby granted, free of charge, to any person obtaining a copy
8
- # of this software and associated documentation files (the "Software"), to deal
9
- # in the Software without restriction, including without limitation the rights
10
- # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
11
- # copies of the Software, and to permit persons to whom the Software is
12
- # furnished to do so, subject to the following conditions:
13
- #
14
- # The above copyright notice and this permission notice shall be included in
15
- # all copies or substantial portions of the Software.
16
- #
17
- # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18
- # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19
- # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
20
- # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21
- # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
22
- # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
23
- # THE SOFTWARE.
24
-
25
- module MODL
26
- module Parser
27
- # This class handles the conversion of objects that refer to arrays into instances of those arrays.
28
- # It works recursively since array usage can be nested.
29
- class ArrayProcessor
30
- # How deep can the class structure be?
31
- MAX_RECURSION_DEPTH = 50
32
- # global is a GlobalParseContext and obj is the extracted Array or Hash from MODL::Parser::Parsed.extract_json
33
- def self.process(global, obj)
34
- # Process each object in the array or just process the object if its a hash.
35
- # Any other object is ignored.
36
- raise StandardError, 'parameter "global" should be a GlobalParseContext' unless global.is_a?(GlobalParseContext)
37
-
38
- if obj.is_a? Array
39
- obj.each do |o|
40
- process_obj global, o if o.is_a? Hash
41
- end
42
- elsif obj.is_a? Hash
43
- process_obj global, obj
44
- end
45
- end
46
-
47
- private
48
-
49
- # Process the contents of the supplied array
50
- def self.process_array(global, the_array, k, value)
51
-
52
- return [k, value] if value.length.zero?
53
- field_count = value[0].length
54
- return [k, value] if field_count.zero?
55
-
56
- # Get the class for the 'of' field of the array.
57
- clazz = global.classs the_array.of
58
- raise StandardError, 'No class with id or name =' + the_array.of + ' could be found.' if clazz.nil?
59
-
60
- # Get the *assign array from the class and make sure we have an entry of size field_count
61
- assignment_list = clazz.keylist_of_length field_count
62
- raise StandardError, 'No assignment list of length ' + field_count.to_s + ' for class with id or name =' + the_array.of + ' could be found.' if assignment_list.nil?
63
-
64
- result = []
65
-
66
- value.each do |record|
67
- object = {}
68
- i = 0
69
- assignment_list.each do |field|
70
- field_class = global.classs field
71
- if field_class
72
- object[field_class.name_or_id] = record[i]
73
- else
74
- object[field] = record[i]
75
- end
76
- i += 1
77
- end
78
- result << object
79
- end
80
-
81
- return [the_array.name_or_id, result]
82
- end
83
-
84
- # Replace the existing object with the new array instance and a new key
85
- # We need to keep the same key order, hence this method below
86
- def self.replace_value(obj, old_k, new_k, new_v)
87
- tmp = obj.dup
88
- obj.clear
89
- tmp.keys.each do |tmpk|
90
- tmpv = tmp[tmpk]
91
- if tmpk == old_k
92
- obj[new_k] = new_v
93
- else
94
- obj[tmpk] = tmpv
95
- end
96
- end
97
- end
98
-
99
- def self.process_obj(global, obj)
100
- obj.keys.each do |k|
101
- value = obj[k]
102
- # Does the key refer to an array that we have parsed or loaded?
103
- the_array = global.arrays(k)
104
- if the_array
105
- # Yes so convert this value to an instance of that array
106
- new_k, new_v = process_array global, the_array, k, value
107
- # Replace the existing object with the new array instance and a new key
108
- # We need to keep the same key order, hence this method below
109
- replace_value obj, k, new_k, new_v
110
- else
111
- new_v = value
112
- end
113
- # Recurse into the value in case it has contents that also refer to arrays.
114
- process global, new_v
115
- end
116
- end
117
-
118
- end
119
- end
120
- end
@@ -1,84 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- # The MIT License (MIT)
4
- #
5
- # Copyright (c) 2019 NUM Technology Ltd
6
- #
7
- # Permission is hereby granted, free of charge, to any person obtaining a copy
8
- # of this software and associated documentation files (the "Software"), to deal
9
- # in the Software without restriction, including without limitation the rights
10
- # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
11
- # copies of the Software, and to permit persons to whom the Software is
12
- # furnished to do so, subject to the following conditions:
13
- #
14
- # The above copyright notice and this permission notice shall be included in
15
- # all copies or substantial portions of the Software.
16
- #
17
- # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18
- # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19
- # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
20
- # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21
- # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
22
- # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
23
- # THE SOFTWARE.
24
-
25
- module MODL
26
- module Parser
27
- # Represents a *array defined, or loaded by, a MODL document.
28
- class MODLArray
29
- attr_accessor :id
30
- attr_accessor :name
31
- attr_accessor :of
32
-
33
- def initialize
34
- @content = {}
35
- end
36
-
37
- def name_or_id
38
- @name.nil? ? @id : @name
39
- end
40
- end
41
-
42
- # Extract an array from a ParsedPair object
43
- class ArrayExtractor
44
- def self.extract(pair, global)
45
- return unless pair.type == 'array'
46
-
47
- the_array = MODLArray.new
48
- map = pair.map if pair.map
49
- map = pair.valueItem&.value&.map if pair.valueItem&.value&.map
50
-
51
- map.mapItems.each do |item|
52
- next unless item&.pair&.type
53
-
54
- case item&.pair&.type
55
- when 'id'
56
- str_value = item.pair.valueItem.value.primitive.string.string
57
- the_array.id = str_value
58
- when 'name'
59
- str_value = item.pair.valueItem.value.primitive.string.string
60
- the_array.name = str_value
61
- when 'of'
62
- str_value = item.pair.valueItem.value.primitive.string.string
63
- the_array.of = str_value
64
- else
65
- # Ignore
66
- end
67
- end
68
-
69
- raise InterpreterError, 'Missing id for *array' if the_array.id.nil?
70
-
71
- # Make sure the array name isn't redefining an existing array
72
- if !global.has_array?(the_array.id) && !global.has_array?(the_array.name)
73
-
74
- # store the arrays by id and name to make them easier to find later
75
- global.arrays(the_array)
76
- else
77
- id = the_array.id.nil? ? 'undefined' : the_array.id
78
- name = the_array.name.nil? ? 'undefined' : the_array.name
79
- raise InterpreterError, '*Array name or id already defined - cannot redefine: ' + id + ', ' + name
80
- end
81
- end
82
- end
83
- end
84
- end