├── .gitignore ├── .travis.yml ├── Gemfile ├── LICENSE ├── Manifest ├── README.md ├── Rakefile ├── keyword_search.gemspec ├── lib ├── keyword_search.rb ├── keyword_search.rl └── keyword_search │ ├── definition.rb │ └── version.rb └── test └── test_keyword_search.rb /.gitignore: -------------------------------------------------------------------------------- 1 | *.gem 2 | *.rbc 3 | .bundle 4 | .config 5 | .yardoc 6 | Gemfile.lock 7 | InstalledFiles 8 | _yardoc 9 | coverage 10 | doc/ 11 | lib/bundler/man 12 | pkg 13 | rdoc 14 | spec/reports 15 | test/tmp 16 | test/version_tmp 17 | tmp 18 | 19 | # Emacs 20 | \#* 21 | .\#* -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | rvm: 2 | - 1.9.3 3 | - 2.0.0 4 | 5 | bundler_args: --without docs 6 | 7 | notifications: 8 | email: 9 | - brwcodes@gmail.com -------------------------------------------------------------------------------- /Gemfile: -------------------------------------------------------------------------------- 1 | source 'https://rubygems.org' 2 | 3 | # Specify your gem's dependencies in keyword_search.gemspec 4 | gemspec 5 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | (The MIT License) 2 | 3 | Copyright (c) 2007-2013 Bruce Williams 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining 6 | a copy of this software and associated documentation files (the 7 | 'Software'), to deal in the Software without restriction, including 8 | without limitation the rights to use, copy, modify, merge, publish, 9 | distribute, sublicense, and/or sell copies of the Software, and to 10 | permit persons to whom the Software is furnished to do so, subject to 11 | the following conditions: 12 | 13 | The above copyright notice and this permission notice shall be 14 | included in all copies or substantial portions of the Software. 15 | 16 | THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, 17 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 18 | MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. 19 | IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY 20 | CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 21 | TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 22 | SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -------------------------------------------------------------------------------- /Manifest: -------------------------------------------------------------------------------- 1 | History.txt 2 | lib/keyword_search/definition.rb 3 | lib/keyword_search.rb 4 | lib/keyword_search.rl 5 | Manifest 6 | Rakefile 7 | README.rdoc 8 | test/test_keyword_search.rb 9 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | Keyword Search 2 | ============== 3 | 4 | [![Build Status](https://travis-ci.org/bruce/keyword_search.png)](https://travis-ci.org/bruce/keyword_search) 5 | 6 | Description 7 | ----------- 8 | 9 | Generic library to parse GMail-style search strings for keyword/value pairs; 10 | supports definition of valid keywords and handling of quoted values. 11 | 12 | Requirements 13 | ------------ 14 | 15 | None. 16 | 17 | Features 18 | -------- 19 | 20 | The library features a very simple, easy-to-use API. 21 | 22 | * Define handlers for supported keywords with blocks 23 | * Define the default keyword (values not part of a keyword/value pair) 24 | * Handle negation 25 | 26 | Please see the example provided below. 27 | 28 | Synopsis 29 | -------- 30 | 31 | Here's an example using ActiveRecord (though the library is generic, and can 32 | be used for any Ruby project). The library isn't limited to search terms, as 33 | shown in this example; how you use it is up to you. 34 | 35 | First, let's build up some variables we'll be populating for a SQL query. 36 | 37 | ```ruby 38 | clauses = [] 39 | arguments = [] 40 | ``` 41 | 42 | Now let's set an example string to parse. Presumably you'd get this from 43 | a form (ie, `params[:terms]`) or some other form of input. 44 | 45 | ```ruby 46 | terms = 'account has:attachment since:2006-12-03 -description:crazy' 47 | ``` 48 | 49 | Now let's do the search, defining the handlers to deal with each keyword. 50 | 51 | ```ruby 52 | KeywordSearch.search(terms) do |with| 53 | 54 | # This sets the keyword handler for bare words in the string, 55 | # ie "account" in our example search terms 56 | with.default_keyword :title 57 | 58 | # Here's what we do when we encounter a "title" keyword 59 | with.keyword :title do |values| 60 | clauses << "title like ?" 61 | arguments << "%#{values.join(' ')}%" 62 | end 63 | 64 | # For "has," we check the value provided (and only support "attachment") 65 | with.keyword :has do |values| 66 | clauses << 'has_attachment = true' if values.include?('attachment') 67 | end 68 | 69 | # Here we do some date parsing 70 | with.keyword :since do |values| 71 | date = Date.parse(values.first) # only support one 72 | clauses << 'created_on >= ?' 73 | arguments << date.to_s 74 | end 75 | 76 | # If a second parameter is defined for a block, you can handle negation. 77 | # In this example, we don't want results whose description includes 78 | # the word "crazy" 79 | with.keyword :description do |values, positive| 80 | clauses << "description #{'not' unless positive} like ?" 81 | arguments << "%#{values.join(' ')}%" 82 | end 83 | 84 | end 85 | ``` 86 | 87 | Immediately after the block is defined, the string is parsed and handlers 88 | fire. Due to the magic of closures, we now have populated variables we can 89 | use to build a real SQL query. 90 | 91 | ```ruby 92 | query = clauses.map { |c| "(#{c})" }.join(' AND ') 93 | conditions = [query, *arguments] 94 | results = Message.all(:conditions => conditions) 95 | ``` 96 | 97 | Installation 98 | ------------ 99 | 100 | ``` 101 | gem install keyword_search 102 | ``` 103 | 104 | License 105 | ------- 106 | 107 | See LICENSE. 108 | 109 | Legal Notes 110 | ----------- 111 | 112 | GMail is copyright Google, Inc. -------------------------------------------------------------------------------- /Rakefile: -------------------------------------------------------------------------------- 1 | require "bundler/gem_tasks" 2 | require 'rake/testtask' 3 | 4 | desc "Run tests" 5 | Rake::TestTask.new do |t| 6 | t.pattern = 'test/test_*.rb' 7 | t.verbose = true 8 | t.warning = false # Ragel is noisy 9 | end 10 | 11 | task default: :test 12 | 13 | desc "Build parser with Ragel" 14 | task :ragel do 15 | sh "ragel -R lib/keyword_search.rl -o lib/keyword_search.rb" 16 | end 17 | -------------------------------------------------------------------------------- /keyword_search.gemspec: -------------------------------------------------------------------------------- 1 | # coding: utf-8 2 | lib = File.expand_path('../lib', __FILE__) 3 | $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib) 4 | 5 | require 'keyword_search/version' 6 | 7 | Gem::Specification.new do |spec| 8 | spec.name = "keyword_search" 9 | spec.version = KeywordSearch::VERSION 10 | spec.authors = ["Bruce Williams", "Eric Lindvall"] 11 | spec.email = ["brwcodes@gmail.com", "eric@sevenscale.com"] 12 | spec.summary = %q{Generic library to parse GMail-style search strings for keyword/value pairs; supports definition of valid keywords and handling of quoted values.} 13 | spec.homepage = %q{http://github.com/bruce/keyword_search} 14 | spec.license = "MIT" 15 | 16 | spec.files = `git ls-files`.split($/) 17 | spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) } 18 | spec.test_files = spec.files.grep(%r{^(test|spec|features)/}) 19 | spec.rdoc_options = ["--charset=UTF-8"] 20 | spec.require_paths = ["lib"] 21 | 22 | spec.add_development_dependency "bundler", "~> 1.3" 23 | spec.add_development_dependency "rake" 24 | end 25 | -------------------------------------------------------------------------------- /lib/keyword_search.rb: -------------------------------------------------------------------------------- 1 | 2 | # line 1 "lib/keyword_search.rl" 3 | require File.dirname(__FILE__) << '/keyword_search/definition.rb' 4 | 5 | module KeywordSearch 6 | 7 | class ParseError < ::SyntaxError; end 8 | 9 | class << self 10 | 11 | 12 | # line 73 "lib/keyword_search.rl" 13 | 14 | 15 | def search(input_string, definition=nil, &block) 16 | definition ||= Definition.new(&block) 17 | results = parse(input_string) 18 | results.each do |key, terms| 19 | definition.handle(key, terms) 20 | end 21 | results 22 | end 23 | 24 | ####### 25 | private 26 | ####### 27 | 28 | def parse(input) #:nodoc: 29 | data = input + ' ' 30 | 31 | # line 32 "lib/keyword_search.rb" 32 | class << self 33 | attr_accessor :_parser_actions 34 | private :_parser_actions, :_parser_actions= 35 | end 36 | self._parser_actions = [ 37 | 0, 1, 0, 1, 4, 1, 7, 1, 38 | 9, 2, 3, 1, 2, 3, 4, 2, 39 | 3, 8, 2, 4, 8, 3, 0, 3, 40 | 4, 3, 0, 3, 8, 3, 3, 4, 41 | 0, 3, 3, 4, 8, 3, 3, 8, 42 | 0, 3, 5, 0, 2, 3, 5, 2, 43 | 7, 3, 6, 0, 2, 3, 6, 2, 44 | 7 45 | ] 46 | 47 | class << self 48 | attr_accessor :_parser_key_offsets 49 | private :_parser_key_offsets, :_parser_key_offsets= 50 | end 51 | self._parser_key_offsets = [ 52 | 0, 0, 8, 13, 21, 26, 31, 36, 53 | 37, 38, 40, 41, 42, 47, 53, 60, 54 | 66, 68, 76, 77, 78, 82, 87, 88, 55 | 89, 96, 103, 110, 112, 114, 119, 124, 56 | 129, 136, 142, 150, 157, 164, 171, 179, 57 | 181, 189, 196, 203, 211, 216, 224, 232, 58 | 239, 246, 254, 262, 268, 276, 283, 291, 59 | 298, 305, 312, 319, 327, 329, 331, 336, 60 | 341, 346, 353, 359, 367, 374, 381, 388, 61 | 393, 400, 406, 414, 421, 428, 435, 437, 62 | 442, 449, 456, 462, 470, 477, 484, 491, 63 | 493, 495, 500, 505, 510, 517, 523, 531, 64 | 538, 545, 552, 560, 562, 570, 577, 584, 65 | 592, 597, 605, 613, 620, 628, 630, 635, 66 | 643, 645, 653, 660, 667, 675, 680, 688, 67 | 690, 698, 705, 712, 720, 725, 733, 740, 68 | 747, 754, 761, 769, 771, 773, 778, 783, 69 | 788, 795, 801, 809, 816, 823, 830, 838, 70 | 840, 848, 855, 862, 870, 875, 883, 890, 71 | 898, 906, 913, 920, 928, 935, 943, 951, 72 | 958, 963, 969, 976, 982, 990, 991, 992, 73 | 996, 1001, 1002, 1003, 1010, 1017, 1024, 1026, 74 | 1028, 1033, 1038, 1043, 1050, 1056, 1064, 1071, 75 | 1078, 1085, 1093, 1095, 1103, 1110, 1117, 1125, 76 | 1130, 1138, 1146, 1153, 1160, 1168, 1176, 1182, 77 | 1190, 1197, 1205, 1212, 1219, 1226, 1233, 1241, 78 | 1243, 1245, 1250, 1255, 1260, 1267, 1273, 1281, 79 | 1288, 1295, 1302, 1307, 1314, 1320, 1328, 1335, 80 | 1342, 1349, 1351, 1356, 1363, 1370, 1376, 1384, 81 | 1391, 1398, 1405, 1407, 1409, 1414, 1419, 1424, 82 | 1431, 1437, 1445, 1452, 1459, 1466, 1474, 1476, 83 | 1484, 1491, 1498, 1506, 1511, 1519, 1527, 1534, 84 | 1542, 1544, 1549, 1557, 1559, 1567, 1574, 1581, 85 | 1589, 1594, 1602, 1604, 1612, 1619, 1626, 1634, 86 | 1639, 1647, 1654, 1661, 1668, 1675, 1683, 1685, 87 | 1687, 1692, 1697, 1702, 1709, 1715, 1723, 1730, 88 | 1737, 1744, 1752, 1754, 1762, 1769, 1776, 1784, 89 | 1789, 1797, 1804, 1812, 1820, 1827, 1834, 1842, 90 | 1849, 1857, 1865, 1872, 1877, 1882, 1887, 1892, 91 | 1898, 1905, 1911, 1919, 1920, 1921, 1925, 1930, 92 | 1931, 1932, 1939, 1946, 1953, 1955, 1957, 1962, 93 | 1967, 1972, 1979, 1985, 1993, 2000, 2007, 2014, 94 | 2022, 2029, 2037, 2045, 2047, 2052, 2060, 2067, 95 | 2075, 2083, 2089, 2097, 2104, 2112, 2119, 2126, 96 | 2133, 2135, 2137, 2142, 2147, 2152, 2159, 2165, 97 | 2173, 2180, 2187, 2194, 2199, 2206, 2212, 2220, 98 | 2227, 2234, 2241, 2243, 2248, 2255, 2262, 2268, 99 | 2276, 2283, 2290, 2297, 2299, 2301, 2306, 2311, 100 | 2316, 2323, 2329, 2337, 2344, 2351, 2358, 2366, 101 | 2373, 2381, 2389, 2391, 2396, 2404, 2411, 2419, 102 | 2427, 2429, 2434, 2442, 2449, 2457, 2459, 2464, 103 | 2472, 2479, 2487, 2495, 2497, 2502, 2510, 2517, 104 | 2525, 2532, 2539, 2546, 2553, 2561, 2568, 2570, 105 | 2572, 2577, 2582, 2587, 2594, 2600, 2608, 2615, 106 | 2622, 2629, 2637, 2644, 2652, 2660, 2662, 2667, 107 | 2675, 2683, 2690, 2697, 2705, 2712, 2720, 2727, 108 | 2735, 2743, 2751, 2758, 2763, 2769, 2776, 2782, 109 | 2790, 2791, 2792, 2796, 2801, 2802, 2803, 2810, 110 | 2817, 2824, 2826, 2828, 2833, 2838, 2843, 2850, 111 | 2856, 2864, 2871, 2878, 2885, 2893, 2900, 2908, 112 | 2916, 2918, 2926, 2933, 2940, 2948, 2953, 2961, 113 | 2968, 2976, 2984, 2990, 2998, 3005, 3013, 3020, 114 | 3027, 3034, 3036, 3038, 3043, 3048, 3053, 3060, 115 | 3066, 3074, 3081, 3088, 3095, 3103, 3110, 3118, 116 | 3126, 3128, 3136, 3143, 3150, 3158, 3164, 3171, 117 | 3173, 3175, 3180, 3187, 3194, 3200, 3208, 3215, 118 | 3222, 3229, 3231, 3233, 3238, 3243, 3248, 3255, 119 | 3261, 3269, 3276, 3283, 3290, 3298, 3305, 3313, 120 | 3321, 3323, 3331, 3338, 3345, 3353, 3358, 3366, 121 | 3373, 3381, 3389, 3391, 3396, 3401, 3406, 3414, 122 | 3421, 3428, 3435, 3443, 3450, 3458, 3463, 3471, 123 | 3478, 3486, 3493, 3500, 3507, 3514, 3522, 3529, 124 | 3531, 3533, 3538, 3543, 3548, 3555, 3561, 3569, 125 | 3576, 3583, 3590, 3598, 3605, 3613, 3621, 3623, 126 | 3631, 3638, 3645, 3653, 3658, 3666, 3674, 3681, 127 | 3688, 3696, 3703, 3711, 3718, 3726, 3734, 3742, 128 | 3749, 3754, 3759, 3764, 3769, 3774 129 | ] 130 | 131 | class << self 132 | attr_accessor :_parser_trans_keys 133 | private :_parser_trans_keys, :_parser_trans_keys= 134 | end 135 | self._parser_trans_keys = [ 136 | 0, 32, 34, 39, 40, 43, 45, 58, 137 | 0, 32, 34, 41, 58, 0, 32, 34, 138 | 39, 40, 43, 45, 58, 0, 32, 34, 139 | 41, 58, 32, 34, 39, 40, 58, 0, 140 | 32, 34, 41, 58, 34, 34, 0, 32, 141 | 39, 39, 32, 34, 39, 40, 58, 32, 142 | 34, 41, 44, 58, 124, 32, 34, 39, 143 | 40, 44, 58, 124, 32, 34, 41, 44, 144 | 58, 124, 0, 32, 32, 34, 39, 40, 145 | 41, 44, 58, 124, 34, 34, 32, 41, 146 | 44, 124, 32, 34, 39, 40, 58, 39, 147 | 39, 32, 34, 39, 41, 44, 58, 124, 148 | 32, 34, 39, 41, 44, 58, 124, 32, 149 | 34, 39, 40, 44, 58, 124, 34, 39, 150 | 34, 39, 32, 39, 41, 44, 124, 32, 151 | 34, 39, 40, 58, 32, 34, 41, 44, 152 | 124, 32, 34, 39, 40, 44, 58, 124, 153 | 32, 34, 41, 44, 58, 124, 32, 34, 154 | 39, 40, 41, 44, 58, 124, 32, 34, 155 | 39, 41, 44, 58, 124, 32, 34, 39, 156 | 41, 44, 58, 124, 32, 34, 39, 40, 157 | 44, 58, 124, 32, 34, 39, 40, 41, 158 | 44, 58, 124, 34, 39, 32, 34, 39, 159 | 40, 41, 44, 58, 124, 32, 34, 39, 160 | 41, 44, 58, 124, 32, 34, 39, 41, 161 | 44, 58, 124, 32, 34, 39, 40, 41, 162 | 44, 58, 124, 32, 34, 39, 40, 58, 163 | 32, 34, 39, 40, 41, 44, 58, 124, 164 | 32, 34, 39, 40, 41, 44, 58, 124, 165 | 32, 34, 39, 41, 44, 58, 124, 32, 166 | 34, 39, 41, 44, 58, 124, 32, 34, 167 | 39, 40, 41, 44, 58, 124, 32, 34, 168 | 39, 40, 41, 44, 58, 124, 32, 34, 169 | 41, 44, 58, 124, 32, 34, 39, 40, 170 | 41, 44, 58, 124, 32, 34, 39, 40, 171 | 44, 58, 124, 32, 34, 39, 40, 41, 172 | 44, 58, 124, 32, 34, 39, 41, 44, 173 | 58, 124, 32, 34, 39, 41, 44, 58, 174 | 124, 32, 34, 39, 40, 44, 58, 124, 175 | 32, 34, 39, 41, 44, 58, 124, 32, 176 | 34, 39, 40, 41, 44, 58, 124, 34, 177 | 39, 34, 39, 32, 39, 41, 44, 124, 178 | 32, 34, 39, 40, 58, 32, 34, 41, 179 | 44, 124, 32, 34, 39, 40, 44, 58, 180 | 124, 32, 34, 41, 44, 58, 124, 32, 181 | 34, 39, 40, 41, 44, 58, 124, 32, 182 | 34, 39, 41, 44, 58, 124, 32, 34, 183 | 39, 41, 44, 58, 124, 32, 34, 39, 184 | 40, 44, 58, 124, 32, 34, 41, 44, 185 | 124, 32, 34, 39, 40, 44, 58, 124, 186 | 32, 34, 41, 44, 58, 124, 32, 34, 187 | 39, 40, 41, 44, 58, 124, 32, 34, 188 | 39, 41, 44, 58, 124, 32, 34, 39, 189 | 41, 44, 58, 124, 32, 34, 39, 40, 190 | 44, 58, 124, 34, 39, 32, 39, 41, 191 | 44, 124, 32, 34, 39, 40, 44, 58, 192 | 124, 32, 34, 39, 41, 44, 58, 124, 193 | 32, 34, 41, 44, 58, 124, 32, 34, 194 | 39, 40, 41, 44, 58, 124, 32, 34, 195 | 39, 41, 44, 58, 124, 32, 34, 39, 196 | 41, 44, 58, 124, 32, 34, 39, 40, 197 | 44, 58, 124, 34, 39, 34, 39, 32, 198 | 39, 41, 44, 124, 32, 34, 39, 40, 199 | 58, 32, 34, 41, 44, 124, 32, 34, 200 | 39, 40, 44, 58, 124, 32, 34, 41, 201 | 44, 58, 124, 32, 34, 39, 40, 41, 202 | 44, 58, 124, 32, 34, 39, 41, 44, 203 | 58, 124, 32, 34, 39, 41, 44, 58, 204 | 124, 32, 34, 39, 40, 44, 58, 124, 205 | 32, 34, 39, 40, 41, 44, 58, 124, 206 | 34, 39, 32, 34, 39, 40, 41, 44, 207 | 58, 124, 32, 34, 39, 41, 44, 58, 208 | 124, 32, 34, 39, 41, 44, 58, 124, 209 | 32, 34, 39, 40, 41, 44, 58, 124, 210 | 32, 34, 39, 40, 58, 32, 34, 39, 211 | 40, 41, 44, 58, 124, 32, 34, 39, 212 | 40, 41, 44, 58, 124, 32, 34, 39, 213 | 41, 44, 58, 124, 32, 34, 39, 40, 214 | 41, 44, 58, 124, 34, 39, 32, 34, 215 | 39, 40, 58, 32, 34, 39, 40, 41, 216 | 44, 58, 124, 34, 39, 32, 34, 39, 217 | 40, 41, 44, 58, 124, 32, 34, 39, 218 | 41, 44, 58, 124, 32, 34, 39, 41, 219 | 44, 58, 124, 32, 34, 39, 40, 41, 220 | 44, 58, 124, 32, 34, 39, 40, 58, 221 | 32, 34, 39, 40, 41, 44, 58, 124, 222 | 34, 39, 32, 34, 39, 40, 41, 44, 223 | 58, 124, 32, 34, 39, 41, 44, 58, 224 | 124, 32, 34, 39, 41, 44, 58, 124, 225 | 32, 34, 39, 40, 41, 44, 58, 124, 226 | 32, 34, 39, 40, 58, 32, 34, 39, 227 | 40, 41, 44, 58, 124, 32, 34, 39, 228 | 41, 44, 58, 124, 32, 34, 39, 41, 229 | 44, 58, 124, 32, 34, 39, 40, 44, 230 | 58, 124, 32, 34, 39, 41, 44, 58, 231 | 124, 32, 34, 39, 40, 41, 44, 58, 232 | 124, 34, 39, 34, 39, 32, 39, 41, 233 | 44, 124, 32, 34, 39, 40, 58, 32, 234 | 34, 41, 44, 124, 32, 34, 39, 40, 235 | 44, 58, 124, 32, 34, 41, 44, 58, 236 | 124, 32, 34, 39, 40, 41, 44, 58, 237 | 124, 32, 34, 39, 41, 44, 58, 124, 238 | 32, 34, 39, 41, 44, 58, 124, 32, 239 | 34, 39, 40, 44, 58, 124, 32, 34, 240 | 39, 40, 41, 44, 58, 124, 34, 39, 241 | 32, 34, 39, 40, 41, 44, 58, 124, 242 | 32, 34, 39, 41, 44, 58, 124, 32, 243 | 34, 39, 41, 44, 58, 124, 32, 34, 244 | 39, 40, 41, 44, 58, 124, 32, 34, 245 | 39, 40, 58, 32, 34, 39, 40, 41, 246 | 44, 58, 124, 32, 34, 39, 40, 44, 247 | 58, 124, 32, 34, 39, 40, 41, 44, 248 | 58, 124, 32, 34, 39, 40, 41, 44, 249 | 58, 124, 32, 34, 39, 41, 44, 58, 250 | 124, 32, 34, 39, 41, 44, 58, 124, 251 | 32, 34, 39, 40, 41, 44, 58, 124, 252 | 32, 34, 39, 41, 44, 58, 124, 32, 253 | 34, 39, 40, 41, 44, 58, 124, 32, 254 | 34, 39, 40, 41, 44, 58, 124, 32, 255 | 34, 39, 41, 44, 58, 124, 32, 34, 256 | 39, 40, 58, 32, 34, 41, 44, 58, 257 | 124, 32, 34, 39, 40, 44, 58, 124, 258 | 32, 34, 41, 44, 58, 124, 32, 34, 259 | 39, 40, 41, 44, 58, 124, 34, 34, 260 | 32, 41, 44, 124, 32, 34, 39, 40, 261 | 58, 39, 39, 32, 34, 39, 41, 44, 262 | 58, 124, 32, 34, 39, 41, 44, 58, 263 | 124, 32, 34, 39, 40, 44, 58, 124, 264 | 34, 39, 34, 39, 32, 39, 41, 44, 265 | 124, 32, 34, 39, 40, 58, 32, 34, 266 | 41, 44, 124, 32, 34, 39, 40, 44, 267 | 58, 124, 32, 34, 41, 44, 58, 124, 268 | 32, 34, 39, 40, 41, 44, 58, 124, 269 | 32, 34, 39, 41, 44, 58, 124, 32, 270 | 34, 39, 41, 44, 58, 124, 32, 34, 271 | 39, 40, 44, 58, 124, 32, 34, 39, 272 | 40, 41, 44, 58, 124, 34, 39, 32, 273 | 34, 39, 40, 41, 44, 58, 124, 32, 274 | 34, 39, 41, 44, 58, 124, 32, 34, 275 | 39, 41, 44, 58, 124, 32, 34, 39, 276 | 40, 41, 44, 58, 124, 32, 34, 39, 277 | 40, 58, 32, 34, 39, 40, 41, 44, 278 | 58, 124, 32, 34, 39, 40, 41, 44, 279 | 58, 124, 32, 34, 39, 41, 44, 58, 280 | 124, 32, 34, 39, 41, 44, 58, 124, 281 | 32, 34, 39, 40, 41, 44, 58, 124, 282 | 32, 34, 39, 40, 41, 44, 58, 124, 283 | 32, 34, 41, 44, 58, 124, 32, 34, 284 | 39, 40, 41, 44, 58, 124, 32, 34, 285 | 39, 40, 44, 58, 124, 32, 34, 39, 286 | 40, 41, 44, 58, 124, 32, 34, 39, 287 | 41, 44, 58, 124, 32, 34, 39, 41, 288 | 44, 58, 124, 32, 34, 39, 40, 44, 289 | 58, 124, 32, 34, 39, 41, 44, 58, 290 | 124, 32, 34, 39, 40, 41, 44, 58, 291 | 124, 34, 39, 34, 39, 32, 39, 41, 292 | 44, 124, 32, 34, 39, 40, 58, 32, 293 | 34, 41, 44, 124, 32, 34, 39, 40, 294 | 44, 58, 124, 32, 34, 41, 44, 58, 295 | 124, 32, 34, 39, 40, 41, 44, 58, 296 | 124, 32, 34, 39, 41, 44, 58, 124, 297 | 32, 34, 39, 41, 44, 58, 124, 32, 298 | 34, 39, 40, 44, 58, 124, 32, 34, 299 | 41, 44, 124, 32, 34, 39, 40, 44, 300 | 58, 124, 32, 34, 41, 44, 58, 124, 301 | 32, 34, 39, 40, 41, 44, 58, 124, 302 | 32, 34, 39, 41, 44, 58, 124, 32, 303 | 34, 39, 41, 44, 58, 124, 32, 34, 304 | 39, 40, 44, 58, 124, 34, 39, 32, 305 | 39, 41, 44, 124, 32, 34, 39, 40, 306 | 44, 58, 124, 32, 34, 39, 41, 44, 307 | 58, 124, 32, 34, 41, 44, 58, 124, 308 | 32, 34, 39, 40, 41, 44, 58, 124, 309 | 32, 34, 39, 41, 44, 58, 124, 32, 310 | 34, 39, 41, 44, 58, 124, 32, 34, 311 | 39, 40, 44, 58, 124, 34, 39, 34, 312 | 39, 32, 39, 41, 44, 124, 32, 34, 313 | 39, 40, 58, 32, 34, 41, 44, 124, 314 | 32, 34, 39, 40, 44, 58, 124, 32, 315 | 34, 41, 44, 58, 124, 32, 34, 39, 316 | 40, 41, 44, 58, 124, 32, 34, 39, 317 | 41, 44, 58, 124, 32, 34, 39, 41, 318 | 44, 58, 124, 32, 34, 39, 40, 44, 319 | 58, 124, 32, 34, 39, 40, 41, 44, 320 | 58, 124, 34, 39, 32, 34, 39, 40, 321 | 41, 44, 58, 124, 32, 34, 39, 41, 322 | 44, 58, 124, 32, 34, 39, 41, 44, 323 | 58, 124, 32, 34, 39, 40, 41, 44, 324 | 58, 124, 32, 34, 39, 40, 58, 32, 325 | 34, 39, 40, 41, 44, 58, 124, 32, 326 | 34, 39, 40, 41, 44, 58, 124, 32, 327 | 34, 39, 41, 44, 58, 124, 32, 34, 328 | 39, 40, 41, 44, 58, 124, 34, 39, 329 | 32, 34, 39, 40, 58, 32, 34, 39, 330 | 40, 41, 44, 58, 124, 34, 39, 32, 331 | 34, 39, 40, 41, 44, 58, 124, 32, 332 | 34, 39, 41, 44, 58, 124, 32, 34, 333 | 39, 41, 44, 58, 124, 32, 34, 39, 334 | 40, 41, 44, 58, 124, 32, 34, 39, 335 | 40, 58, 32, 34, 39, 40, 41, 44, 336 | 58, 124, 34, 39, 32, 34, 39, 40, 337 | 41, 44, 58, 124, 32, 34, 39, 41, 338 | 44, 58, 124, 32, 34, 39, 41, 44, 339 | 58, 124, 32, 34, 39, 40, 41, 44, 340 | 58, 124, 32, 34, 39, 40, 58, 32, 341 | 34, 39, 40, 41, 44, 58, 124, 32, 342 | 34, 39, 41, 44, 58, 124, 32, 34, 343 | 39, 41, 44, 58, 124, 32, 34, 39, 344 | 40, 44, 58, 124, 32, 34, 39, 41, 345 | 44, 58, 124, 32, 34, 39, 40, 41, 346 | 44, 58, 124, 34, 39, 34, 39, 32, 347 | 39, 41, 44, 124, 32, 34, 39, 40, 348 | 58, 32, 34, 41, 44, 124, 32, 34, 349 | 39, 40, 44, 58, 124, 32, 34, 41, 350 | 44, 58, 124, 32, 34, 39, 40, 41, 351 | 44, 58, 124, 32, 34, 39, 41, 44, 352 | 58, 124, 32, 34, 39, 41, 44, 58, 353 | 124, 32, 34, 39, 40, 44, 58, 124, 354 | 32, 34, 39, 40, 41, 44, 58, 124, 355 | 34, 39, 32, 34, 39, 40, 41, 44, 356 | 58, 124, 32, 34, 39, 41, 44, 58, 357 | 124, 32, 34, 39, 41, 44, 58, 124, 358 | 32, 34, 39, 40, 41, 44, 58, 124, 359 | 32, 34, 39, 40, 58, 32, 34, 39, 360 | 40, 41, 44, 58, 124, 32, 34, 39, 361 | 40, 44, 58, 124, 32, 34, 39, 40, 362 | 41, 44, 58, 124, 32, 34, 39, 40, 363 | 41, 44, 58, 124, 32, 34, 39, 41, 364 | 44, 58, 124, 32, 34, 39, 41, 44, 365 | 58, 124, 32, 34, 39, 40, 41, 44, 366 | 58, 124, 32, 34, 39, 41, 44, 58, 367 | 124, 32, 34, 39, 40, 41, 44, 58, 368 | 124, 32, 34, 39, 40, 41, 44, 58, 369 | 124, 32, 34, 39, 41, 44, 58, 124, 370 | 32, 34, 39, 40, 58, 32, 34, 39, 371 | 40, 58, 32, 34, 39, 40, 58, 32, 372 | 34, 39, 40, 58, 32, 34, 41, 44, 373 | 58, 124, 32, 34, 39, 40, 44, 58, 374 | 124, 32, 34, 41, 44, 58, 124, 32, 375 | 34, 39, 40, 41, 44, 58, 124, 34, 376 | 34, 32, 41, 44, 124, 32, 34, 39, 377 | 40, 58, 39, 39, 32, 34, 39, 41, 378 | 44, 58, 124, 32, 34, 39, 41, 44, 379 | 58, 124, 32, 34, 39, 40, 44, 58, 380 | 124, 34, 39, 34, 39, 32, 39, 41, 381 | 44, 124, 32, 34, 39, 40, 58, 32, 382 | 34, 41, 44, 124, 32, 34, 39, 40, 383 | 44, 58, 124, 32, 34, 41, 44, 58, 384 | 124, 32, 34, 39, 40, 41, 44, 58, 385 | 124, 32, 34, 39, 41, 44, 58, 124, 386 | 32, 34, 39, 41, 44, 58, 124, 32, 387 | 34, 39, 40, 44, 58, 124, 32, 34, 388 | 39, 40, 41, 44, 58, 124, 32, 34, 389 | 39, 40, 44, 58, 124, 32, 34, 39, 390 | 40, 41, 44, 58, 124, 32, 34, 39, 391 | 40, 41, 44, 58, 124, 34, 39, 32, 392 | 34, 39, 40, 58, 32, 34, 39, 40, 393 | 41, 44, 58, 124, 32, 34, 39, 40, 394 | 44, 58, 124, 32, 34, 39, 40, 41, 395 | 44, 58, 124, 32, 34, 39, 40, 41, 396 | 44, 58, 124, 32, 34, 41, 44, 58, 397 | 124, 32, 34, 39, 40, 41, 44, 58, 398 | 124, 32, 34, 39, 40, 44, 58, 124, 399 | 32, 34, 39, 40, 41, 44, 58, 124, 400 | 32, 34, 39, 41, 44, 58, 124, 32, 401 | 34, 39, 41, 44, 58, 124, 32, 34, 402 | 39, 40, 44, 58, 124, 34, 39, 34, 403 | 39, 32, 39, 41, 44, 124, 32, 34, 404 | 39, 40, 58, 32, 34, 41, 44, 124, 405 | 32, 34, 39, 40, 44, 58, 124, 32, 406 | 34, 41, 44, 58, 124, 32, 34, 39, 407 | 40, 41, 44, 58, 124, 32, 34, 39, 408 | 41, 44, 58, 124, 32, 34, 39, 41, 409 | 44, 58, 124, 32, 34, 39, 40, 44, 410 | 58, 124, 32, 34, 41, 44, 124, 32, 411 | 34, 39, 40, 44, 58, 124, 32, 34, 412 | 41, 44, 58, 124, 32, 34, 39, 40, 413 | 41, 44, 58, 124, 32, 34, 39, 41, 414 | 44, 58, 124, 32, 34, 39, 41, 44, 415 | 58, 124, 32, 34, 39, 40, 44, 58, 416 | 124, 34, 39, 32, 39, 41, 44, 124, 417 | 32, 34, 39, 40, 44, 58, 124, 32, 418 | 34, 39, 41, 44, 58, 124, 32, 34, 419 | 41, 44, 58, 124, 32, 34, 39, 40, 420 | 41, 44, 58, 124, 32, 34, 39, 41, 421 | 44, 58, 124, 32, 34, 39, 41, 44, 422 | 58, 124, 32, 34, 39, 40, 44, 58, 423 | 124, 34, 39, 34, 39, 32, 39, 41, 424 | 44, 124, 32, 34, 39, 40, 58, 32, 425 | 34, 41, 44, 124, 32, 34, 39, 40, 426 | 44, 58, 124, 32, 34, 41, 44, 58, 427 | 124, 32, 34, 39, 40, 41, 44, 58, 428 | 124, 32, 34, 39, 41, 44, 58, 124, 429 | 32, 34, 39, 41, 44, 58, 124, 32, 430 | 34, 39, 40, 44, 58, 124, 32, 34, 431 | 39, 40, 41, 44, 58, 124, 32, 34, 432 | 39, 40, 44, 58, 124, 32, 34, 39, 433 | 40, 41, 44, 58, 124, 32, 34, 39, 434 | 40, 41, 44, 58, 124, 34, 39, 32, 435 | 34, 39, 40, 58, 32, 34, 39, 40, 436 | 41, 44, 58, 124, 32, 34, 39, 40, 437 | 44, 58, 124, 32, 34, 39, 40, 41, 438 | 44, 58, 124, 32, 34, 39, 40, 41, 439 | 44, 58, 124, 34, 39, 32, 34, 39, 440 | 40, 58, 32, 34, 39, 40, 41, 44, 441 | 58, 124, 32, 34, 39, 40, 44, 58, 442 | 124, 32, 34, 39, 40, 41, 44, 58, 443 | 124, 34, 39, 32, 34, 39, 40, 58, 444 | 32, 34, 39, 40, 41, 44, 58, 124, 445 | 32, 34, 39, 40, 44, 58, 124, 32, 446 | 34, 39, 40, 41, 44, 58, 124, 32, 447 | 34, 39, 40, 41, 44, 58, 124, 34, 448 | 39, 32, 34, 39, 40, 58, 32, 34, 449 | 39, 40, 41, 44, 58, 124, 32, 34, 450 | 39, 40, 44, 58, 124, 32, 34, 39, 451 | 40, 41, 44, 58, 124, 32, 34, 39, 452 | 41, 44, 58, 124, 32, 34, 39, 41, 453 | 44, 58, 124, 32, 34, 39, 40, 44, 454 | 58, 124, 32, 34, 39, 41, 44, 58, 455 | 124, 32, 34, 39, 40, 41, 44, 58, 456 | 124, 32, 34, 39, 40, 44, 58, 124, 457 | 34, 39, 34, 39, 32, 39, 41, 44, 458 | 124, 32, 34, 39, 40, 58, 32, 34, 459 | 41, 44, 124, 32, 34, 39, 40, 44, 460 | 58, 124, 32, 34, 41, 44, 58, 124, 461 | 32, 34, 39, 40, 41, 44, 58, 124, 462 | 32, 34, 39, 41, 44, 58, 124, 32, 463 | 34, 39, 41, 44, 58, 124, 32, 34, 464 | 39, 40, 44, 58, 124, 32, 34, 39, 465 | 40, 41, 44, 58, 124, 32, 34, 39, 466 | 40, 44, 58, 124, 32, 34, 39, 40, 467 | 41, 44, 58, 124, 32, 34, 39, 40, 468 | 41, 44, 58, 124, 34, 39, 32, 34, 469 | 39, 40, 58, 32, 34, 39, 40, 41, 470 | 44, 58, 124, 32, 34, 39, 40, 41, 471 | 44, 58, 124, 32, 34, 39, 41, 44, 472 | 58, 124, 32, 34, 39, 41, 44, 58, 473 | 124, 32, 34, 39, 40, 41, 44, 58, 474 | 124, 32, 34, 39, 41, 44, 58, 124, 475 | 32, 34, 39, 40, 41, 44, 58, 124, 476 | 32, 34, 39, 40, 44, 58, 124, 32, 477 | 34, 39, 40, 41, 44, 58, 124, 32, 478 | 34, 39, 40, 41, 44, 58, 124, 32, 479 | 34, 39, 40, 41, 44, 58, 124, 32, 480 | 34, 39, 41, 44, 58, 124, 32, 34, 481 | 39, 40, 58, 32, 34, 41, 44, 58, 482 | 124, 32, 34, 39, 40, 44, 58, 124, 483 | 32, 34, 41, 44, 58, 124, 32, 34, 484 | 39, 40, 41, 44, 58, 124, 34, 34, 485 | 32, 41, 44, 124, 32, 34, 39, 40, 486 | 58, 39, 39, 32, 34, 39, 41, 44, 487 | 58, 124, 32, 34, 39, 41, 44, 58, 488 | 124, 32, 34, 39, 40, 44, 58, 124, 489 | 34, 39, 34, 39, 32, 39, 41, 44, 490 | 124, 32, 34, 39, 40, 58, 32, 34, 491 | 41, 44, 124, 32, 34, 39, 40, 44, 492 | 58, 124, 32, 34, 41, 44, 58, 124, 493 | 32, 34, 39, 40, 41, 44, 58, 124, 494 | 32, 34, 39, 41, 44, 58, 124, 32, 495 | 34, 39, 41, 44, 58, 124, 32, 34, 496 | 39, 40, 44, 58, 124, 32, 34, 39, 497 | 40, 41, 44, 58, 124, 32, 34, 39, 498 | 40, 44, 58, 124, 32, 34, 39, 40, 499 | 41, 44, 58, 124, 32, 34, 39, 40, 500 | 41, 44, 58, 124, 34, 39, 32, 34, 501 | 39, 40, 41, 44, 58, 124, 32, 34, 502 | 39, 41, 44, 58, 124, 32, 34, 39, 503 | 41, 44, 58, 124, 32, 34, 39, 40, 504 | 41, 44, 58, 124, 32, 34, 39, 40, 505 | 58, 32, 34, 39, 40, 41, 44, 58, 506 | 124, 32, 34, 39, 40, 44, 58, 124, 507 | 32, 34, 39, 40, 41, 44, 58, 124, 508 | 32, 34, 39, 40, 41, 44, 58, 124, 509 | 32, 34, 41, 44, 58, 124, 32, 34, 510 | 39, 40, 41, 44, 58, 124, 32, 34, 511 | 39, 40, 44, 58, 124, 32, 34, 39, 512 | 40, 41, 44, 58, 124, 32, 34, 39, 513 | 41, 44, 58, 124, 32, 34, 39, 41, 514 | 44, 58, 124, 32, 34, 39, 40, 44, 515 | 58, 124, 34, 39, 34, 39, 32, 39, 516 | 41, 44, 124, 32, 34, 39, 40, 58, 517 | 32, 34, 41, 44, 124, 32, 34, 39, 518 | 40, 44, 58, 124, 32, 34, 41, 44, 519 | 58, 124, 32, 34, 39, 40, 41, 44, 520 | 58, 124, 32, 34, 39, 41, 44, 58, 521 | 124, 32, 34, 39, 41, 44, 58, 124, 522 | 32, 34, 39, 40, 44, 58, 124, 32, 523 | 34, 39, 40, 41, 44, 58, 124, 32, 524 | 34, 39, 40, 44, 58, 124, 32, 34, 525 | 39, 40, 41, 44, 58, 124, 32, 34, 526 | 39, 40, 41, 44, 58, 124, 34, 39, 527 | 32, 34, 39, 40, 41, 44, 58, 124, 528 | 32, 34, 39, 41, 44, 58, 124, 32, 529 | 34, 39, 41, 44, 58, 124, 32, 34, 530 | 39, 40, 41, 44, 58, 124, 32, 34, 531 | 41, 44, 58, 124, 32, 34, 39, 40, 532 | 44, 58, 124, 34, 39, 34, 39, 32, 533 | 39, 41, 44, 124, 32, 34, 39, 40, 534 | 44, 58, 124, 32, 34, 39, 41, 44, 535 | 58, 124, 32, 34, 41, 44, 58, 124, 536 | 32, 34, 39, 40, 41, 44, 58, 124, 537 | 32, 34, 39, 41, 44, 58, 124, 32, 538 | 34, 39, 41, 44, 58, 124, 32, 34, 539 | 39, 40, 44, 58, 124, 34, 39, 34, 540 | 39, 32, 39, 41, 44, 124, 32, 34, 541 | 39, 40, 58, 32, 34, 41, 44, 124, 542 | 32, 34, 39, 40, 44, 58, 124, 32, 543 | 34, 41, 44, 58, 124, 32, 34, 39, 544 | 40, 41, 44, 58, 124, 32, 34, 39, 545 | 41, 44, 58, 124, 32, 34, 39, 41, 546 | 44, 58, 124, 32, 34, 39, 40, 44, 547 | 58, 124, 32, 34, 39, 40, 41, 44, 548 | 58, 124, 32, 34, 39, 40, 44, 58, 549 | 124, 32, 34, 39, 40, 41, 44, 58, 550 | 124, 32, 34, 39, 40, 41, 44, 58, 551 | 124, 34, 39, 32, 34, 39, 40, 41, 552 | 44, 58, 124, 32, 34, 39, 41, 44, 553 | 58, 124, 32, 34, 39, 41, 44, 58, 554 | 124, 32, 34, 39, 40, 41, 44, 58, 555 | 124, 32, 34, 39, 40, 58, 32, 34, 556 | 39, 40, 41, 44, 58, 124, 32, 34, 557 | 39, 40, 44, 58, 124, 32, 34, 39, 558 | 40, 41, 44, 58, 124, 32, 34, 39, 559 | 40, 41, 44, 58, 124, 34, 39, 32, 560 | 34, 41, 44, 124, 32, 34, 39, 40, 561 | 58, 32, 34, 39, 40, 58, 32, 34, 562 | 39, 40, 41, 44, 58, 124, 32, 34, 563 | 39, 41, 44, 58, 124, 32, 34, 39, 564 | 41, 44, 58, 124, 32, 34, 39, 40, 565 | 44, 58, 124, 32, 34, 39, 40, 41, 566 | 44, 58, 124, 32, 34, 39, 40, 44, 567 | 58, 124, 32, 34, 39, 40, 41, 44, 568 | 58, 124, 32, 34, 39, 40, 58, 32, 569 | 34, 39, 40, 41, 44, 58, 124, 32, 570 | 34, 39, 40, 44, 58, 124, 32, 34, 571 | 39, 40, 41, 44, 58, 124, 32, 34, 572 | 39, 41, 44, 58, 124, 32, 34, 39, 573 | 41, 44, 58, 124, 32, 34, 39, 40, 574 | 44, 58, 124, 32, 34, 39, 41, 44, 575 | 58, 124, 32, 34, 39, 40, 41, 44, 576 | 58, 124, 32, 34, 39, 40, 44, 58, 577 | 124, 34, 39, 34, 39, 32, 39, 41, 578 | 44, 124, 32, 34, 39, 40, 58, 32, 579 | 34, 41, 44, 124, 32, 34, 39, 40, 580 | 44, 58, 124, 32, 34, 41, 44, 58, 581 | 124, 32, 34, 39, 40, 41, 44, 58, 582 | 124, 32, 34, 39, 41, 44, 58, 124, 583 | 32, 34, 39, 41, 44, 58, 124, 32, 584 | 34, 39, 40, 44, 58, 124, 32, 34, 585 | 39, 40, 41, 44, 58, 124, 32, 34, 586 | 39, 40, 44, 58, 124, 32, 34, 39, 587 | 40, 41, 44, 58, 124, 32, 34, 39, 588 | 40, 41, 44, 58, 124, 34, 39, 32, 589 | 34, 39, 40, 41, 44, 58, 124, 32, 590 | 34, 39, 41, 44, 58, 124, 32, 34, 591 | 39, 41, 44, 58, 124, 32, 34, 39, 592 | 40, 41, 44, 58, 124, 32, 34, 39, 593 | 40, 58, 32, 34, 39, 40, 41, 44, 594 | 58, 124, 32, 34, 39, 40, 41, 44, 595 | 58, 124, 32, 34, 39, 41, 44, 58, 596 | 124, 32, 34, 39, 41, 44, 58, 124, 597 | 32, 34, 39, 40, 41, 44, 58, 124, 598 | 32, 34, 39, 41, 44, 58, 124, 32, 599 | 34, 39, 40, 41, 44, 58, 124, 32, 600 | 34, 39, 40, 44, 58, 124, 32, 34, 601 | 39, 40, 41, 44, 58, 124, 32, 34, 602 | 39, 40, 41, 44, 58, 124, 32, 34, 603 | 39, 40, 41, 44, 58, 124, 32, 34, 604 | 39, 41, 44, 58, 124, 32, 34, 39, 605 | 40, 58, 32, 34, 39, 40, 58, 0, 606 | 32, 34, 41, 58, 0, 32, 34, 41, 607 | 58, 0, 32, 34, 41, 58, 0 608 | ] 609 | 610 | class << self 611 | attr_accessor :_parser_single_lengths 612 | private :_parser_single_lengths, :_parser_single_lengths= 613 | end 614 | self._parser_single_lengths = [ 615 | 0, 8, 5, 8, 5, 5, 5, 1, 616 | 1, 2, 1, 1, 5, 6, 7, 6, 617 | 2, 8, 1, 1, 4, 5, 1, 1, 618 | 7, 7, 7, 2, 2, 5, 5, 5, 619 | 7, 6, 8, 7, 7, 7, 8, 2, 620 | 8, 7, 7, 8, 5, 8, 8, 7, 621 | 7, 8, 8, 6, 8, 7, 8, 7, 622 | 7, 7, 7, 8, 2, 2, 5, 5, 623 | 5, 7, 6, 8, 7, 7, 7, 5, 624 | 7, 6, 8, 7, 7, 7, 2, 5, 625 | 7, 7, 6, 8, 7, 7, 7, 2, 626 | 2, 5, 5, 5, 7, 6, 8, 7, 627 | 7, 7, 8, 2, 8, 7, 7, 8, 628 | 5, 8, 8, 7, 8, 2, 5, 8, 629 | 2, 8, 7, 7, 8, 5, 8, 2, 630 | 8, 7, 7, 8, 5, 8, 7, 7, 631 | 7, 7, 8, 2, 2, 5, 5, 5, 632 | 7, 6, 8, 7, 7, 7, 8, 2, 633 | 8, 7, 7, 8, 5, 8, 7, 8, 634 | 8, 7, 7, 8, 7, 8, 8, 7, 635 | 5, 6, 7, 6, 8, 1, 1, 4, 636 | 5, 1, 1, 7, 7, 7, 2, 2, 637 | 5, 5, 5, 7, 6, 8, 7, 7, 638 | 7, 8, 2, 8, 7, 7, 8, 5, 639 | 8, 8, 7, 7, 8, 8, 6, 8, 640 | 7, 8, 7, 7, 7, 7, 8, 2, 641 | 2, 5, 5, 5, 7, 6, 8, 7, 642 | 7, 7, 5, 7, 6, 8, 7, 7, 643 | 7, 2, 5, 7, 7, 6, 8, 7, 644 | 7, 7, 2, 2, 5, 5, 5, 7, 645 | 6, 8, 7, 7, 7, 8, 2, 8, 646 | 7, 7, 8, 5, 8, 8, 7, 8, 647 | 2, 5, 8, 2, 8, 7, 7, 8, 648 | 5, 8, 2, 8, 7, 7, 8, 5, 649 | 8, 7, 7, 7, 7, 8, 2, 2, 650 | 5, 5, 5, 7, 6, 8, 7, 7, 651 | 7, 8, 2, 8, 7, 7, 8, 5, 652 | 8, 7, 8, 8, 7, 7, 8, 7, 653 | 8, 8, 7, 5, 5, 5, 5, 6, 654 | 7, 6, 8, 1, 1, 4, 5, 1, 655 | 1, 7, 7, 7, 2, 2, 5, 5, 656 | 5, 7, 6, 8, 7, 7, 7, 8, 657 | 7, 8, 8, 2, 5, 8, 7, 8, 658 | 8, 6, 8, 7, 8, 7, 7, 7, 659 | 2, 2, 5, 5, 5, 7, 6, 8, 660 | 7, 7, 7, 5, 7, 6, 8, 7, 661 | 7, 7, 2, 5, 7, 7, 6, 8, 662 | 7, 7, 7, 2, 2, 5, 5, 5, 663 | 7, 6, 8, 7, 7, 7, 8, 7, 664 | 8, 8, 2, 5, 8, 7, 8, 8, 665 | 2, 5, 8, 7, 8, 2, 5, 8, 666 | 7, 8, 8, 2, 5, 8, 7, 8, 667 | 7, 7, 7, 7, 8, 7, 2, 2, 668 | 5, 5, 5, 7, 6, 8, 7, 7, 669 | 7, 8, 7, 8, 8, 2, 5, 8, 670 | 8, 7, 7, 8, 7, 8, 7, 8, 671 | 8, 8, 7, 5, 6, 7, 6, 8, 672 | 1, 1, 4, 5, 1, 1, 7, 7, 673 | 7, 2, 2, 5, 5, 5, 7, 6, 674 | 8, 7, 7, 7, 8, 7, 8, 8, 675 | 2, 8, 7, 7, 8, 5, 8, 7, 676 | 8, 8, 6, 8, 7, 8, 7, 7, 677 | 7, 2, 2, 5, 5, 5, 7, 6, 678 | 8, 7, 7, 7, 8, 7, 8, 8, 679 | 2, 8, 7, 7, 8, 6, 7, 2, 680 | 2, 5, 7, 7, 6, 8, 7, 7, 681 | 7, 2, 2, 5, 5, 5, 7, 6, 682 | 8, 7, 7, 7, 8, 7, 8, 8, 683 | 2, 8, 7, 7, 8, 5, 8, 7, 684 | 8, 8, 2, 5, 5, 5, 8, 7, 685 | 7, 7, 8, 7, 8, 5, 8, 7, 686 | 8, 7, 7, 7, 7, 8, 7, 2, 687 | 2, 5, 5, 5, 7, 6, 8, 7, 688 | 7, 7, 8, 7, 8, 8, 2, 8, 689 | 7, 7, 8, 5, 8, 8, 7, 7, 690 | 8, 7, 8, 7, 8, 8, 8, 7, 691 | 5, 5, 5, 5, 5, 0 692 | ] 693 | 694 | class << self 695 | attr_accessor :_parser_range_lengths 696 | private :_parser_range_lengths, :_parser_range_lengths= 697 | end 698 | self._parser_range_lengths = [ 699 | 0, 0, 0, 0, 0, 0, 0, 0, 700 | 0, 0, 0, 0, 0, 0, 0, 0, 701 | 0, 0, 0, 0, 0, 0, 0, 0, 702 | 0, 0, 0, 0, 0, 0, 0, 0, 703 | 0, 0, 0, 0, 0, 0, 0, 0, 704 | 0, 0, 0, 0, 0, 0, 0, 0, 705 | 0, 0, 0, 0, 0, 0, 0, 0, 706 | 0, 0, 0, 0, 0, 0, 0, 0, 707 | 0, 0, 0, 0, 0, 0, 0, 0, 708 | 0, 0, 0, 0, 0, 0, 0, 0, 709 | 0, 0, 0, 0, 0, 0, 0, 0, 710 | 0, 0, 0, 0, 0, 0, 0, 0, 711 | 0, 0, 0, 0, 0, 0, 0, 0, 712 | 0, 0, 0, 0, 0, 0, 0, 0, 713 | 0, 0, 0, 0, 0, 0, 0, 0, 714 | 0, 0, 0, 0, 0, 0, 0, 0, 715 | 0, 0, 0, 0, 0, 0, 0, 0, 716 | 0, 0, 0, 0, 0, 0, 0, 0, 717 | 0, 0, 0, 0, 0, 0, 0, 0, 718 | 0, 0, 0, 0, 0, 0, 0, 0, 719 | 0, 0, 0, 0, 0, 0, 0, 0, 720 | 0, 0, 0, 0, 0, 0, 0, 0, 721 | 0, 0, 0, 0, 0, 0, 0, 0, 722 | 0, 0, 0, 0, 0, 0, 0, 0, 723 | 0, 0, 0, 0, 0, 0, 0, 0, 724 | 0, 0, 0, 0, 0, 0, 0, 0, 725 | 0, 0, 0, 0, 0, 0, 0, 0, 726 | 0, 0, 0, 0, 0, 0, 0, 0, 727 | 0, 0, 0, 0, 0, 0, 0, 0, 728 | 0, 0, 0, 0, 0, 0, 0, 0, 729 | 0, 0, 0, 0, 0, 0, 0, 0, 730 | 0, 0, 0, 0, 0, 0, 0, 0, 731 | 0, 0, 0, 0, 0, 0, 0, 0, 732 | 0, 0, 0, 0, 0, 0, 0, 0, 733 | 0, 0, 0, 0, 0, 0, 0, 0, 734 | 0, 0, 0, 0, 0, 0, 0, 0, 735 | 0, 0, 0, 0, 0, 0, 0, 0, 736 | 0, 0, 0, 0, 0, 0, 0, 0, 737 | 0, 0, 0, 0, 0, 0, 0, 0, 738 | 0, 0, 0, 0, 0, 0, 0, 0, 739 | 0, 0, 0, 0, 0, 0, 0, 0, 740 | 0, 0, 0, 0, 0, 0, 0, 0, 741 | 0, 0, 0, 0, 0, 0, 0, 0, 742 | 0, 0, 0, 0, 0, 0, 0, 0, 743 | 0, 0, 0, 0, 0, 0, 0, 0, 744 | 0, 0, 0, 0, 0, 0, 0, 0, 745 | 0, 0, 0, 0, 0, 0, 0, 0, 746 | 0, 0, 0, 0, 0, 0, 0, 0, 747 | 0, 0, 0, 0, 0, 0, 0, 0, 748 | 0, 0, 0, 0, 0, 0, 0, 0, 749 | 0, 0, 0, 0, 0, 0, 0, 0, 750 | 0, 0, 0, 0, 0, 0, 0, 0, 751 | 0, 0, 0, 0, 0, 0, 0, 0, 752 | 0, 0, 0, 0, 0, 0, 0, 0, 753 | 0, 0, 0, 0, 0, 0, 0, 0, 754 | 0, 0, 0, 0, 0, 0, 0, 0, 755 | 0, 0, 0, 0, 0, 0, 0, 0, 756 | 0, 0, 0, 0, 0, 0, 0, 0, 757 | 0, 0, 0, 0, 0, 0, 0, 0, 758 | 0, 0, 0, 0, 0, 0, 0, 0, 759 | 0, 0, 0, 0, 0, 0, 0, 0, 760 | 0, 0, 0, 0, 0, 0, 0, 0, 761 | 0, 0, 0, 0, 0, 0, 0, 0, 762 | 0, 0, 0, 0, 0, 0, 0, 0, 763 | 0, 0, 0, 0, 0, 0, 0, 0, 764 | 0, 0, 0, 0, 0, 0, 0, 0, 765 | 0, 0, 0, 0, 0, 0, 0, 0, 766 | 0, 0, 0, 0, 0, 0, 0, 0, 767 | 0, 0, 0, 0, 0, 0, 0, 0, 768 | 0, 0, 0, 0, 0, 0, 0, 0, 769 | 0, 0, 0, 0, 0, 0, 0, 0, 770 | 0, 0, 0, 0, 0, 0, 0, 0, 771 | 0, 0, 0, 0, 0, 0, 0, 0, 772 | 0, 0, 0, 0, 0, 0, 0, 0, 773 | 0, 0, 0, 0, 0, 0, 0, 0, 774 | 0, 0, 0, 0, 0, 0, 0, 0, 775 | 0, 0, 0, 0, 0, 0 776 | ] 777 | 778 | class << self 779 | attr_accessor :_parser_index_offsets 780 | private :_parser_index_offsets, :_parser_index_offsets= 781 | end 782 | self._parser_index_offsets = [ 783 | 0, 0, 9, 15, 24, 30, 36, 42, 784 | 44, 46, 49, 51, 53, 59, 66, 74, 785 | 81, 84, 93, 95, 97, 102, 108, 110, 786 | 112, 120, 128, 136, 139, 142, 148, 154, 787 | 160, 168, 175, 184, 192, 200, 208, 217, 788 | 220, 229, 237, 245, 254, 260, 269, 278, 789 | 286, 294, 303, 312, 319, 328, 336, 345, 790 | 353, 361, 369, 377, 386, 389, 392, 398, 791 | 404, 410, 418, 425, 434, 442, 450, 458, 792 | 464, 472, 479, 488, 496, 504, 512, 515, 793 | 521, 529, 537, 544, 553, 561, 569, 577, 794 | 580, 583, 589, 595, 601, 609, 616, 625, 795 | 633, 641, 649, 658, 661, 670, 678, 686, 796 | 695, 701, 710, 719, 727, 736, 739, 745, 797 | 754, 757, 766, 774, 782, 791, 797, 806, 798 | 809, 818, 826, 834, 843, 849, 858, 866, 799 | 874, 882, 890, 899, 902, 905, 911, 917, 800 | 923, 931, 938, 947, 955, 963, 971, 980, 801 | 983, 992, 1000, 1008, 1017, 1023, 1032, 1040, 802 | 1049, 1058, 1066, 1074, 1083, 1091, 1100, 1109, 803 | 1117, 1123, 1130, 1138, 1145, 1154, 1156, 1158, 804 | 1163, 1169, 1171, 1173, 1181, 1189, 1197, 1200, 805 | 1203, 1209, 1215, 1221, 1229, 1236, 1245, 1253, 806 | 1261, 1269, 1278, 1281, 1290, 1298, 1306, 1315, 807 | 1321, 1330, 1339, 1347, 1355, 1364, 1373, 1380, 808 | 1389, 1397, 1406, 1414, 1422, 1430, 1438, 1447, 809 | 1450, 1453, 1459, 1465, 1471, 1479, 1486, 1495, 810 | 1503, 1511, 1519, 1525, 1533, 1540, 1549, 1557, 811 | 1565, 1573, 1576, 1582, 1590, 1598, 1605, 1614, 812 | 1622, 1630, 1638, 1641, 1644, 1650, 1656, 1662, 813 | 1670, 1677, 1686, 1694, 1702, 1710, 1719, 1722, 814 | 1731, 1739, 1747, 1756, 1762, 1771, 1780, 1788, 815 | 1797, 1800, 1806, 1815, 1818, 1827, 1835, 1843, 816 | 1852, 1858, 1867, 1870, 1879, 1887, 1895, 1904, 817 | 1910, 1919, 1927, 1935, 1943, 1951, 1960, 1963, 818 | 1966, 1972, 1978, 1984, 1992, 1999, 2008, 2016, 819 | 2024, 2032, 2041, 2044, 2053, 2061, 2069, 2078, 820 | 2084, 2093, 2101, 2110, 2119, 2127, 2135, 2144, 821 | 2152, 2161, 2170, 2178, 2184, 2190, 2196, 2202, 822 | 2209, 2217, 2224, 2233, 2235, 2237, 2242, 2248, 823 | 2250, 2252, 2260, 2268, 2276, 2279, 2282, 2288, 824 | 2294, 2300, 2308, 2315, 2324, 2332, 2340, 2348, 825 | 2357, 2365, 2374, 2383, 2386, 2392, 2401, 2409, 826 | 2418, 2427, 2434, 2443, 2451, 2460, 2468, 2476, 827 | 2484, 2487, 2490, 2496, 2502, 2508, 2516, 2523, 828 | 2532, 2540, 2548, 2556, 2562, 2570, 2577, 2586, 829 | 2594, 2602, 2610, 2613, 2619, 2627, 2635, 2642, 830 | 2651, 2659, 2667, 2675, 2678, 2681, 2687, 2693, 831 | 2699, 2707, 2714, 2723, 2731, 2739, 2747, 2756, 832 | 2764, 2773, 2782, 2785, 2791, 2800, 2808, 2817, 833 | 2826, 2829, 2835, 2844, 2852, 2861, 2864, 2870, 834 | 2879, 2887, 2896, 2905, 2908, 2914, 2923, 2931, 835 | 2940, 2948, 2956, 2964, 2972, 2981, 2989, 2992, 836 | 2995, 3001, 3007, 3013, 3021, 3028, 3037, 3045, 837 | 3053, 3061, 3070, 3078, 3087, 3096, 3099, 3105, 838 | 3114, 3123, 3131, 3139, 3148, 3156, 3165, 3173, 839 | 3182, 3191, 3200, 3208, 3214, 3221, 3229, 3236, 840 | 3245, 3247, 3249, 3254, 3260, 3262, 3264, 3272, 841 | 3280, 3288, 3291, 3294, 3300, 3306, 3312, 3320, 842 | 3327, 3336, 3344, 3352, 3360, 3369, 3377, 3386, 843 | 3395, 3398, 3407, 3415, 3423, 3432, 3438, 3447, 844 | 3455, 3464, 3473, 3480, 3489, 3497, 3506, 3514, 845 | 3522, 3530, 3533, 3536, 3542, 3548, 3554, 3562, 846 | 3569, 3578, 3586, 3594, 3602, 3611, 3619, 3628, 847 | 3637, 3640, 3649, 3657, 3665, 3674, 3681, 3689, 848 | 3692, 3695, 3701, 3709, 3717, 3724, 3733, 3741, 849 | 3749, 3757, 3760, 3763, 3769, 3775, 3781, 3789, 850 | 3796, 3805, 3813, 3821, 3829, 3838, 3846, 3855, 851 | 3864, 3867, 3876, 3884, 3892, 3901, 3907, 3916, 852 | 3924, 3933, 3942, 3945, 3951, 3957, 3963, 3972, 853 | 3980, 3988, 3996, 4005, 4013, 4022, 4028, 4037, 854 | 4045, 4054, 4062, 4070, 4078, 4086, 4095, 4103, 855 | 4106, 4109, 4115, 4121, 4127, 4135, 4142, 4151, 856 | 4159, 4167, 4175, 4184, 4192, 4201, 4210, 4213, 857 | 4222, 4230, 4238, 4247, 4253, 4262, 4271, 4279, 858 | 4287, 4296, 4304, 4313, 4321, 4330, 4339, 4348, 859 | 4356, 4362, 4368, 4374, 4380, 4386 860 | ] 861 | 862 | class << self 863 | attr_accessor :_parser_trans_targs 864 | private :_parser_trans_targs, :_parser_trans_targs= 865 | end 866 | self._parser_trans_targs = [ 867 | 610, 1, 7, 10, 451, 608, 609, 0, 868 | 2, 610, 3, 0, 0, 309, 2, 611, 869 | 3, 7, 10, 160, 307, 308, 0, 4, 870 | 611, 3, 0, 0, 5, 4, 0, 7, 871 | 10, 12, 0, 6, 612, 3, 0, 0, 872 | 0, 6, 9, 8, 9, 8, 613, 3, 873 | 0, 9, 11, 9, 11, 0, 18, 22, 874 | 0, 0, 13, 14, 0, 16, 50, 0, 875 | 50, 13, 14, 18, 22, 0, 46, 0, 876 | 46, 15, 14, 0, 16, 17, 0, 17, 877 | 15, 613, 3, 0, 14, 18, 24, 15, 878 | 16, 17, 0, 17, 15, 20, 19, 20, 879 | 19, 14, 16, 21, 21, 0, 21, 18, 880 | 22, 0, 0, 15, 20, 23, 20, 23, 881 | 26, 23, 15, 16, 45, 23, 45, 25, 882 | 26, 23, 15, 16, 45, 23, 45, 25, 883 | 26, 27, 20, 23, 45, 23, 45, 25, 884 | 29, 31, 28, 29, 31, 28, 26, 20, 885 | 16, 30, 30, 23, 30, 27, 20, 23, 886 | 23, 25, 32, 20, 16, 44, 44, 19, 887 | 32, 20, 39, 19, 40, 19, 40, 33, 888 | 32, 20, 16, 34, 19, 34, 33, 32, 889 | 20, 35, 33, 16, 34, 19, 34, 33, 890 | 37, 29, 33, 16, 38, 28, 38, 36, 891 | 37, 29, 33, 16, 38, 28, 38, 36, 892 | 37, 29, 20, 28, 38, 28, 38, 36, 893 | 37, 29, 20, 36, 16, 38, 28, 38, 894 | 36, 29, 31, 28, 32, 20, 41, 33, 895 | 16, 34, 19, 34, 33, 37, 29, 33, 896 | 16, 43, 28, 43, 42, 37, 29, 33, 897 | 16, 43, 28, 43, 42, 37, 29, 15, 898 | 42, 16, 43, 28, 43, 42, 44, 20, 899 | 39, 19, 19, 33, 26, 27, 20, 25, 900 | 16, 45, 23, 45, 25, 14, 18, 47, 901 | 15, 16, 17, 0, 17, 15, 26, 23, 902 | 15, 16, 49, 23, 49, 48, 26, 23, 903 | 15, 16, 49, 23, 49, 48, 26, 27, 904 | 15, 48, 16, 49, 23, 49, 48, 53, 905 | 18, 153, 13, 16, 158, 0, 158, 51, 906 | 14, 0, 16, 52, 0, 52, 51, 53, 907 | 18, 126, 51, 16, 52, 0, 52, 51, 908 | 53, 18, 22, 0, 54, 0, 54, 15, 909 | 14, 18, 55, 15, 16, 17, 0, 17, 910 | 15, 57, 23, 15, 16, 125, 23, 125, 911 | 56, 57, 23, 15, 16, 125, 23, 125, 912 | 56, 57, 60, 20, 23, 59, 23, 59, 913 | 58, 57, 23, 15, 16, 59, 23, 59, 914 | 58, 57, 60, 20, 58, 16, 59, 23, 915 | 59, 58, 62, 64, 61, 62, 64, 61, 916 | 57, 20, 16, 63, 63, 23, 63, 60, 917 | 20, 23, 23, 58, 65, 20, 16, 124, 918 | 124, 19, 65, 20, 119, 19, 120, 19, 919 | 120, 66, 65, 20, 16, 67, 19, 67, 920 | 66, 65, 20, 68, 66, 16, 67, 19, 921 | 67, 66, 70, 62, 66, 16, 118, 61, 922 | 118, 69, 70, 62, 66, 16, 118, 61, 923 | 118, 69, 70, 62, 71, 61, 118, 61, 924 | 118, 69, 72, 20, 16, 117, 117, 19, 925 | 72, 20, 112, 19, 113, 19, 113, 73, 926 | 72, 20, 16, 74, 19, 74, 73, 72, 927 | 20, 75, 73, 16, 74, 19, 74, 73, 928 | 77, 79, 73, 16, 111, 78, 111, 76, 929 | 77, 79, 73, 16, 111, 78, 111, 76, 930 | 77, 20, 71, 78, 111, 78, 111, 76, 931 | 79, 71, 78, 80, 20, 16, 110, 110, 932 | 23, 80, 109, 20, 23, 108, 23, 108, 933 | 81, 80, 23, 82, 16, 108, 23, 108, 934 | 81, 14, 0, 16, 83, 0, 83, 15, 935 | 53, 18, 84, 15, 16, 106, 0, 106, 936 | 15, 86, 23, 82, 16, 105, 23, 105, 937 | 85, 86, 23, 82, 16, 105, 23, 105, 938 | 85, 86, 87, 20, 23, 105, 23, 105, 939 | 85, 89, 91, 88, 89, 91, 88, 86, 940 | 20, 16, 90, 90, 23, 90, 87, 20, 941 | 23, 23, 85, 92, 20, 16, 104, 104, 942 | 19, 92, 20, 99, 19, 100, 19, 100, 943 | 93, 92, 20, 16, 94, 19, 94, 93, 944 | 92, 20, 95, 93, 16, 94, 19, 94, 945 | 93, 97, 89, 93, 16, 98, 88, 98, 946 | 96, 97, 89, 93, 16, 98, 88, 98, 947 | 96, 97, 29, 20, 88, 98, 88, 98, 948 | 96, 97, 29, 20, 96, 16, 98, 88, 949 | 98, 96, 89, 91, 88, 92, 20, 101, 950 | 93, 16, 94, 19, 94, 93, 97, 89, 951 | 93, 16, 103, 88, 103, 102, 97, 89, 952 | 93, 16, 103, 88, 103, 102, 97, 29, 953 | 15, 102, 16, 103, 88, 103, 102, 104, 954 | 20, 99, 19, 19, 93, 86, 87, 20, 955 | 85, 16, 105, 23, 105, 85, 14, 18, 956 | 107, 15, 16, 17, 0, 17, 15, 57, 957 | 23, 15, 16, 59, 23, 59, 58, 80, 958 | 109, 20, 81, 16, 108, 23, 108, 81, 959 | 79, 71, 78, 110, 109, 20, 23, 23, 960 | 81, 77, 20, 71, 76, 16, 111, 78, 961 | 111, 76, 79, 71, 78, 72, 20, 114, 962 | 73, 16, 74, 19, 74, 73, 77, 79, 963 | 73, 16, 116, 78, 116, 115, 77, 79, 964 | 73, 16, 116, 78, 116, 115, 77, 20, 965 | 73, 115, 16, 116, 78, 116, 115, 117, 966 | 20, 112, 19, 19, 73, 70, 62, 71, 967 | 69, 16, 118, 61, 118, 69, 62, 64, 968 | 61, 65, 20, 121, 66, 16, 67, 19, 969 | 67, 66, 70, 62, 66, 16, 123, 61, 970 | 123, 122, 70, 62, 66, 16, 123, 61, 971 | 123, 122, 70, 62, 73, 122, 16, 123, 972 | 61, 123, 122, 124, 20, 119, 19, 19, 973 | 66, 57, 60, 15, 56, 16, 125, 23, 974 | 125, 56, 128, 23, 51, 16, 149, 23, 975 | 149, 127, 128, 23, 51, 16, 149, 23, 976 | 149, 127, 128, 131, 20, 23, 130, 23, 977 | 130, 129, 128, 23, 82, 16, 130, 23, 978 | 130, 129, 128, 131, 20, 129, 16, 130, 979 | 23, 130, 129, 133, 135, 132, 133, 135, 980 | 132, 128, 20, 16, 134, 134, 23, 134, 981 | 131, 20, 23, 23, 129, 136, 20, 16, 982 | 148, 148, 19, 136, 20, 143, 19, 144, 983 | 19, 144, 137, 136, 20, 16, 138, 19, 984 | 138, 137, 136, 20, 139, 137, 16, 138, 985 | 19, 138, 137, 141, 133, 137, 16, 142, 986 | 132, 142, 140, 141, 133, 137, 16, 142, 987 | 132, 142, 140, 141, 62, 71, 132, 142, 988 | 132, 142, 140, 141, 62, 71, 140, 16, 989 | 142, 132, 142, 140, 133, 135, 132, 136, 990 | 20, 145, 137, 16, 138, 19, 138, 137, 991 | 141, 133, 137, 16, 147, 132, 147, 146, 992 | 141, 133, 137, 16, 147, 132, 147, 146, 993 | 141, 62, 73, 146, 16, 147, 132, 147, 994 | 146, 148, 20, 143, 19, 19, 137, 150, 995 | 131, 20, 127, 16, 152, 23, 152, 127, 996 | 150, 131, 20, 23, 151, 23, 151, 129, 997 | 128, 131, 82, 129, 16, 130, 23, 130, 998 | 129, 150, 131, 82, 127, 16, 152, 23, 999 | 152, 127, 80, 23, 13, 16, 155, 23, 1000 | 155, 154, 80, 23, 13, 16, 155, 23, 1001 | 155, 154, 80, 109, 20, 154, 16, 157, 1002 | 23, 157, 156, 80, 23, 51, 16, 157, 1003 | 23, 157, 156, 80, 109, 20, 156, 16, 1004 | 157, 23, 157, 156, 53, 18, 159, 51, 1005 | 16, 52, 0, 52, 51, 80, 23, 51, 1006 | 16, 157, 23, 157, 156, 0, 165, 169, 1007 | 0, 0, 161, 162, 0, 16, 197, 0, 1008 | 197, 161, 162, 165, 169, 0, 193, 0, 1009 | 193, 163, 162, 0, 16, 164, 0, 164, 1010 | 163, 162, 165, 171, 163, 16, 164, 0, 1011 | 164, 163, 167, 166, 167, 166, 162, 16, 1012 | 168, 168, 0, 168, 165, 169, 0, 0, 1013 | 163, 167, 170, 167, 170, 173, 170, 163, 1014 | 16, 192, 170, 192, 172, 173, 170, 163, 1015 | 16, 192, 170, 192, 172, 173, 174, 167, 1016 | 170, 192, 170, 192, 172, 176, 178, 175, 1017 | 176, 178, 175, 173, 167, 16, 177, 177, 1018 | 170, 177, 174, 167, 170, 170, 172, 179, 1019 | 167, 16, 191, 191, 166, 179, 167, 186, 1020 | 166, 187, 166, 187, 180, 179, 167, 16, 1021 | 181, 166, 181, 180, 179, 167, 182, 180, 1022 | 16, 181, 166, 181, 180, 184, 176, 180, 1023 | 16, 185, 175, 185, 183, 184, 176, 180, 1024 | 16, 185, 175, 185, 183, 184, 176, 167, 1025 | 175, 185, 175, 185, 183, 184, 176, 167, 1026 | 183, 16, 185, 175, 185, 183, 176, 178, 1027 | 175, 179, 167, 188, 180, 16, 181, 166, 1028 | 181, 180, 184, 176, 180, 16, 190, 175, 1029 | 190, 189, 184, 176, 180, 16, 190, 175, 1030 | 190, 189, 184, 176, 180, 189, 16, 190, 1031 | 175, 190, 189, 191, 167, 186, 166, 166, 1032 | 180, 173, 174, 167, 172, 16, 192, 170, 1033 | 192, 172, 162, 165, 194, 163, 16, 164, 1034 | 0, 164, 163, 173, 170, 163, 16, 196, 1035 | 170, 196, 195, 173, 170, 163, 16, 196, 1036 | 170, 196, 195, 173, 174, 163, 195, 16, 1037 | 196, 170, 196, 195, 200, 165, 300, 161, 1038 | 16, 305, 0, 305, 198, 162, 0, 16, 1039 | 199, 0, 199, 198, 200, 165, 273, 198, 1040 | 16, 199, 0, 199, 198, 200, 165, 169, 1041 | 0, 201, 0, 201, 163, 162, 165, 202, 1042 | 163, 16, 164, 0, 164, 163, 204, 170, 1043 | 163, 16, 272, 170, 272, 203, 204, 170, 1044 | 163, 16, 272, 170, 272, 203, 204, 207, 1045 | 167, 170, 206, 170, 206, 205, 204, 170, 1046 | 163, 16, 206, 170, 206, 205, 204, 207, 1047 | 167, 205, 16, 206, 170, 206, 205, 209, 1048 | 211, 208, 209, 211, 208, 204, 167, 16, 1049 | 210, 210, 170, 210, 207, 167, 170, 170, 1050 | 205, 212, 167, 16, 271, 271, 166, 212, 1051 | 167, 266, 166, 267, 166, 267, 213, 212, 1052 | 167, 16, 214, 166, 214, 213, 212, 167, 1053 | 215, 213, 16, 214, 166, 214, 213, 217, 1054 | 209, 213, 16, 265, 208, 265, 216, 217, 1055 | 209, 213, 16, 265, 208, 265, 216, 217, 1056 | 209, 218, 208, 265, 208, 265, 216, 219, 1057 | 167, 16, 264, 264, 166, 219, 167, 259, 1058 | 166, 260, 166, 260, 220, 219, 167, 16, 1059 | 221, 166, 221, 220, 219, 167, 222, 220, 1060 | 16, 221, 166, 221, 220, 224, 226, 220, 1061 | 16, 258, 225, 258, 223, 224, 226, 220, 1062 | 16, 258, 225, 258, 223, 224, 167, 218, 1063 | 225, 258, 225, 258, 223, 226, 218, 225, 1064 | 227, 167, 16, 257, 257, 170, 227, 256, 1065 | 167, 170, 255, 170, 255, 228, 227, 170, 1066 | 229, 16, 255, 170, 255, 228, 162, 0, 1067 | 16, 230, 0, 230, 163, 200, 165, 231, 1068 | 163, 16, 253, 0, 253, 163, 233, 170, 1069 | 229, 16, 252, 170, 252, 232, 233, 170, 1070 | 229, 16, 252, 170, 252, 232, 233, 234, 1071 | 167, 170, 252, 170, 252, 232, 236, 238, 1072 | 235, 236, 238, 235, 233, 167, 16, 237, 1073 | 237, 170, 237, 234, 167, 170, 170, 232, 1074 | 239, 167, 16, 251, 251, 166, 239, 167, 1075 | 246, 166, 247, 166, 247, 240, 239, 167, 1076 | 16, 241, 166, 241, 240, 239, 167, 242, 1077 | 240, 16, 241, 166, 241, 240, 244, 236, 1078 | 240, 16, 245, 235, 245, 243, 244, 236, 1079 | 240, 16, 245, 235, 245, 243, 244, 176, 1080 | 167, 235, 245, 235, 245, 243, 244, 176, 1081 | 167, 243, 16, 245, 235, 245, 243, 236, 1082 | 238, 235, 239, 167, 248, 240, 16, 241, 1083 | 166, 241, 240, 244, 236, 240, 16, 250, 1084 | 235, 250, 249, 244, 236, 240, 16, 250, 1085 | 235, 250, 249, 244, 176, 240, 249, 16, 1086 | 250, 235, 250, 249, 251, 167, 246, 166, 1087 | 166, 240, 233, 234, 167, 232, 16, 252, 1088 | 170, 252, 232, 162, 165, 254, 163, 16, 1089 | 164, 0, 164, 163, 204, 170, 163, 16, 1090 | 206, 170, 206, 205, 227, 256, 167, 228, 1091 | 16, 255, 170, 255, 228, 226, 218, 225, 1092 | 257, 256, 167, 170, 170, 228, 224, 167, 1093 | 218, 223, 16, 258, 225, 258, 223, 226, 1094 | 218, 225, 219, 167, 261, 220, 16, 221, 1095 | 166, 221, 220, 224, 226, 220, 16, 263, 1096 | 225, 263, 262, 224, 226, 220, 16, 263, 1097 | 225, 263, 262, 224, 167, 220, 262, 16, 1098 | 263, 225, 263, 262, 264, 167, 259, 166, 1099 | 166, 220, 217, 209, 218, 216, 16, 265, 1100 | 208, 265, 216, 209, 211, 208, 212, 167, 1101 | 268, 213, 16, 214, 166, 214, 213, 217, 1102 | 209, 213, 16, 270, 208, 270, 269, 217, 1103 | 209, 213, 16, 270, 208, 270, 269, 217, 1104 | 209, 213, 269, 16, 270, 208, 270, 269, 1105 | 271, 167, 266, 166, 166, 213, 204, 207, 1106 | 163, 203, 16, 272, 170, 272, 203, 275, 1107 | 170, 198, 16, 296, 170, 296, 274, 275, 1108 | 170, 198, 16, 296, 170, 296, 274, 275, 1109 | 278, 167, 170, 277, 170, 277, 276, 275, 1110 | 170, 229, 16, 277, 170, 277, 276, 275, 1111 | 278, 167, 276, 16, 277, 170, 277, 276, 1112 | 280, 282, 279, 280, 282, 279, 275, 167, 1113 | 16, 281, 281, 170, 281, 278, 167, 170, 1114 | 170, 276, 283, 167, 16, 295, 295, 166, 1115 | 283, 167, 290, 166, 291, 166, 291, 284, 1116 | 283, 167, 16, 285, 166, 285, 284, 283, 1117 | 167, 286, 284, 16, 285, 166, 285, 284, 1118 | 288, 280, 284, 16, 289, 279, 289, 287, 1119 | 288, 280, 284, 16, 289, 279, 289, 287, 1120 | 288, 209, 218, 279, 289, 279, 289, 287, 1121 | 288, 209, 218, 287, 16, 289, 279, 289, 1122 | 287, 280, 282, 279, 283, 167, 292, 284, 1123 | 16, 285, 166, 285, 284, 288, 280, 284, 1124 | 16, 294, 279, 294, 293, 288, 280, 284, 1125 | 16, 294, 279, 294, 293, 288, 209, 284, 1126 | 293, 16, 294, 279, 294, 293, 295, 167, 1127 | 290, 166, 166, 284, 297, 278, 167, 274, 1128 | 16, 299, 170, 299, 274, 297, 278, 167, 1129 | 170, 298, 170, 298, 276, 275, 278, 229, 1130 | 276, 16, 277, 170, 277, 276, 297, 278, 1131 | 229, 274, 16, 299, 170, 299, 274, 227, 1132 | 170, 161, 16, 302, 170, 302, 301, 227, 1133 | 170, 161, 16, 302, 170, 302, 301, 227, 1134 | 256, 167, 301, 16, 304, 170, 304, 303, 1135 | 227, 170, 198, 16, 304, 170, 304, 303, 1136 | 227, 256, 167, 303, 16, 304, 170, 304, 1137 | 303, 200, 165, 306, 198, 16, 199, 0, 1138 | 199, 198, 227, 170, 198, 16, 304, 170, 1139 | 304, 303, 0, 7, 10, 160, 0, 4, 1140 | 0, 7, 10, 160, 0, 4, 0, 7, 1141 | 10, 310, 0, 6, 0, 315, 319, 0, 1142 | 0, 311, 312, 0, 16, 344, 0, 344, 1143 | 311, 312, 315, 319, 0, 314, 0, 314, 1144 | 313, 312, 0, 16, 314, 0, 314, 313, 1145 | 312, 315, 321, 313, 16, 314, 0, 314, 1146 | 313, 317, 316, 317, 316, 312, 16, 318, 1147 | 318, 0, 318, 315, 319, 0, 0, 313, 1148 | 317, 320, 317, 320, 323, 320, 313, 16, 1149 | 343, 320, 343, 322, 323, 320, 313, 16, 1150 | 343, 320, 343, 322, 323, 324, 317, 320, 1151 | 341, 320, 341, 322, 326, 328, 325, 326, 1152 | 328, 325, 323, 317, 16, 327, 327, 320, 1153 | 327, 324, 317, 320, 320, 322, 329, 317, 1154 | 16, 340, 340, 316, 329, 317, 339, 316, 1155 | 331, 316, 331, 330, 329, 317, 16, 331, 1156 | 316, 331, 330, 329, 317, 332, 330, 16, 1157 | 331, 316, 331, 330, 334, 326, 330, 16, 1158 | 338, 325, 338, 333, 334, 326, 330, 16, 1159 | 338, 325, 338, 333, 334, 326, 317, 325, 1160 | 335, 325, 335, 333, 336, 326, 328, 333, 1161 | 16, 338, 325, 338, 333, 336, 326, 317, 1162 | 325, 337, 325, 337, 333, 336, 326, 330, 1163 | 333, 16, 338, 325, 338, 333, 336, 326, 1164 | 313, 333, 16, 338, 325, 338, 333, 326, 1165 | 328, 325, 340, 317, 339, 316, 316, 330, 1166 | 342, 324, 317, 322, 16, 343, 320, 343, 1167 | 322, 342, 324, 317, 320, 343, 320, 343, 1168 | 322, 342, 324, 313, 322, 16, 343, 320, 1169 | 343, 322, 347, 315, 441, 311, 16, 449, 1170 | 0, 449, 345, 312, 0, 16, 346, 0, 1171 | 346, 345, 347, 315, 416, 345, 16, 346, 1172 | 0, 346, 345, 347, 315, 319, 0, 348, 1173 | 0, 348, 313, 312, 315, 349, 313, 16, 1174 | 314, 0, 314, 313, 351, 320, 313, 16, 1175 | 415, 320, 415, 350, 351, 320, 313, 16, 1176 | 415, 320, 415, 350, 351, 352, 317, 320, 1177 | 413, 320, 413, 350, 354, 356, 353, 354, 1178 | 356, 353, 351, 317, 16, 355, 355, 320, 1179 | 355, 352, 317, 320, 320, 350, 357, 317, 1180 | 16, 412, 412, 316, 357, 317, 411, 316, 1181 | 359, 316, 359, 358, 357, 317, 16, 359, 1182 | 316, 359, 358, 357, 317, 360, 358, 16, 1183 | 359, 316, 359, 358, 362, 354, 358, 16, 1184 | 410, 353, 410, 361, 362, 354, 358, 16, 1185 | 410, 353, 410, 361, 362, 354, 363, 353, 1186 | 407, 353, 407, 361, 364, 317, 16, 406, 1187 | 406, 316, 364, 317, 405, 316, 366, 316, 1188 | 366, 365, 364, 317, 16, 366, 316, 366, 1189 | 365, 364, 317, 367, 365, 16, 366, 316, 1190 | 366, 365, 369, 371, 365, 16, 404, 370, 1191 | 404, 368, 369, 371, 365, 16, 404, 370, 1192 | 404, 368, 369, 317, 363, 370, 402, 370, 1193 | 402, 368, 371, 363, 370, 372, 317, 16, 1194 | 401, 401, 320, 372, 400, 317, 320, 399, 1195 | 320, 399, 373, 372, 320, 374, 16, 399, 1196 | 320, 399, 373, 312, 0, 16, 375, 0, 1197 | 375, 313, 347, 315, 376, 313, 16, 348, 1198 | 0, 348, 313, 378, 320, 374, 16, 398, 1199 | 320, 398, 377, 378, 320, 374, 16, 398, 1200 | 320, 398, 377, 378, 379, 317, 320, 396, 1201 | 320, 396, 377, 381, 383, 380, 381, 383, 1202 | 380, 378, 317, 16, 382, 382, 320, 382, 1203 | 379, 317, 320, 320, 377, 384, 317, 16, 1204 | 395, 395, 316, 384, 317, 394, 316, 386, 1205 | 316, 386, 385, 384, 317, 16, 386, 316, 1206 | 386, 385, 384, 317, 387, 385, 16, 386, 1207 | 316, 386, 385, 389, 381, 385, 16, 393, 1208 | 380, 393, 388, 389, 381, 385, 16, 393, 1209 | 380, 393, 388, 389, 326, 317, 380, 390, 1210 | 380, 390, 388, 391, 326, 383, 388, 16, 1211 | 393, 380, 393, 388, 391, 326, 317, 380, 1212 | 392, 380, 392, 388, 391, 326, 385, 388, 1213 | 16, 393, 380, 393, 388, 391, 326, 313, 1214 | 388, 16, 393, 380, 393, 388, 381, 383, 1215 | 380, 395, 317, 394, 316, 316, 385, 397, 1216 | 379, 317, 377, 16, 398, 320, 398, 377, 1217 | 397, 379, 317, 320, 398, 320, 398, 377, 1218 | 397, 379, 374, 377, 16, 398, 320, 398, 1219 | 377, 372, 400, 317, 373, 16, 399, 320, 1220 | 399, 373, 371, 363, 370, 401, 400, 317, 1221 | 320, 320, 373, 403, 317, 363, 368, 16, 1222 | 404, 370, 404, 368, 403, 317, 363, 370, 1223 | 404, 370, 404, 368, 403, 317, 365, 368, 1224 | 16, 404, 370, 404, 368, 371, 363, 370, 1225 | 406, 317, 405, 316, 316, 365, 408, 354, 1226 | 356, 361, 16, 410, 353, 410, 361, 408, 1227 | 354, 363, 353, 409, 353, 409, 361, 408, 1228 | 354, 358, 361, 16, 410, 353, 410, 361, 1229 | 408, 354, 365, 361, 16, 410, 353, 410, 1230 | 361, 354, 356, 353, 412, 317, 411, 316, 1231 | 316, 358, 414, 352, 317, 350, 16, 415, 1232 | 320, 415, 350, 414, 352, 317, 320, 415, 1233 | 320, 415, 350, 414, 352, 313, 350, 16, 1234 | 415, 320, 415, 350, 418, 320, 345, 16, 1235 | 440, 320, 440, 417, 418, 320, 345, 16, 1236 | 440, 320, 440, 417, 418, 422, 317, 320, 1237 | 439, 320, 439, 419, 418, 320, 374, 16, 1238 | 420, 320, 420, 419, 421, 422, 374, 419, 1239 | 16, 420, 320, 420, 419, 421, 422, 317, 1240 | 320, 420, 320, 420, 419, 424, 426, 423, 1241 | 424, 426, 423, 418, 317, 16, 425, 425, 1242 | 320, 425, 422, 317, 320, 320, 419, 427, 1243 | 317, 16, 438, 438, 316, 427, 317, 437, 1244 | 316, 429, 316, 429, 428, 427, 317, 16, 1245 | 429, 316, 429, 428, 427, 317, 430, 428, 1246 | 16, 429, 316, 429, 428, 432, 424, 428, 1247 | 16, 436, 423, 436, 431, 432, 424, 428, 1248 | 16, 436, 423, 436, 431, 432, 354, 363, 1249 | 423, 433, 423, 433, 431, 434, 354, 426, 1250 | 431, 16, 436, 423, 436, 431, 434, 354, 1251 | 363, 423, 435, 423, 435, 431, 434, 354, 1252 | 428, 431, 16, 436, 423, 436, 431, 434, 1253 | 354, 365, 431, 16, 436, 423, 436, 431, 1254 | 424, 426, 423, 438, 317, 437, 316, 316, 1255 | 428, 421, 422, 317, 419, 16, 420, 320, 1256 | 420, 419, 421, 422, 374, 417, 16, 440, 1257 | 320, 440, 417, 372, 320, 311, 16, 443, 1258 | 320, 443, 442, 372, 320, 311, 16, 443, 1259 | 320, 443, 442, 446, 400, 317, 442, 16, 1260 | 448, 320, 448, 444, 372, 320, 345, 16, 1261 | 445, 320, 445, 444, 446, 400, 317, 444, 1262 | 16, 448, 320, 448, 444, 446, 400, 317, 1263 | 320, 447, 320, 447, 373, 372, 400, 374, 1264 | 373, 16, 399, 320, 399, 373, 446, 400, 1265 | 374, 444, 16, 448, 320, 448, 444, 347, 1266 | 315, 450, 345, 16, 346, 0, 346, 345, 1267 | 372, 320, 345, 16, 445, 320, 445, 444, 1268 | 0, 456, 460, 0, 0, 452, 453, 0, 1269 | 16, 489, 0, 489, 452, 453, 456, 460, 1270 | 0, 455, 0, 455, 454, 453, 0, 16, 1271 | 455, 0, 455, 454, 453, 456, 462, 454, 1272 | 16, 455, 0, 455, 454, 458, 457, 458, 1273 | 457, 453, 16, 459, 459, 0, 459, 456, 1274 | 460, 0, 0, 454, 458, 461, 458, 461, 1275 | 464, 461, 454, 16, 488, 461, 488, 463, 1276 | 464, 461, 454, 16, 488, 461, 488, 463, 1277 | 464, 465, 458, 461, 486, 461, 486, 463, 1278 | 467, 469, 466, 467, 469, 466, 464, 458, 1279 | 16, 468, 468, 461, 468, 465, 458, 461, 1280 | 461, 463, 470, 458, 16, 485, 485, 457, 1281 | 470, 458, 480, 457, 481, 457, 481, 471, 1282 | 470, 458, 16, 472, 457, 472, 471, 470, 1283 | 458, 473, 471, 16, 472, 457, 472, 471, 1284 | 475, 467, 471, 16, 479, 466, 479, 474, 1285 | 475, 467, 471, 16, 479, 466, 479, 474, 1286 | 475, 458, 469, 466, 476, 466, 476, 474, 1287 | 477, 458, 469, 474, 16, 479, 466, 479, 1288 | 474, 477, 458, 469, 466, 478, 466, 478, 1289 | 474, 477, 458, 471, 474, 16, 479, 466, 1290 | 479, 474, 477, 467, 471, 474, 16, 479, 1291 | 466, 479, 474, 467, 469, 466, 470, 458, 1292 | 482, 471, 16, 472, 457, 472, 471, 475, 1293 | 467, 471, 16, 484, 466, 484, 483, 475, 1294 | 467, 471, 16, 484, 466, 484, 483, 477, 1295 | 467, 454, 483, 16, 484, 466, 484, 483, 1296 | 485, 458, 480, 457, 457, 471, 487, 465, 1297 | 458, 463, 16, 488, 461, 488, 463, 487, 1298 | 465, 458, 461, 488, 461, 488, 463, 487, 1299 | 465, 454, 463, 16, 488, 461, 488, 463, 1300 | 492, 456, 598, 452, 16, 606, 0, 606, 1301 | 490, 453, 0, 16, 491, 0, 491, 490, 1302 | 492, 456, 569, 490, 16, 491, 0, 491, 1303 | 490, 492, 456, 460, 0, 493, 0, 493, 1304 | 454, 453, 456, 494, 454, 16, 455, 0, 1305 | 455, 454, 496, 461, 454, 16, 568, 461, 1306 | 568, 495, 496, 461, 454, 16, 568, 461, 1307 | 568, 495, 496, 497, 458, 461, 566, 461, 1308 | 566, 495, 499, 501, 498, 499, 501, 498, 1309 | 496, 458, 16, 500, 500, 461, 500, 497, 1310 | 458, 461, 461, 495, 502, 458, 16, 565, 1311 | 565, 457, 502, 458, 512, 457, 513, 457, 1312 | 513, 503, 502, 458, 16, 504, 457, 504, 1313 | 503, 502, 458, 505, 503, 16, 504, 457, 1314 | 504, 503, 507, 499, 503, 16, 511, 498, 1315 | 511, 506, 507, 499, 503, 16, 511, 498, 1316 | 511, 506, 507, 458, 501, 498, 508, 498, 1317 | 508, 506, 509, 458, 501, 506, 16, 511, 1318 | 498, 511, 506, 509, 458, 501, 498, 510, 1319 | 498, 510, 506, 509, 458, 503, 506, 16, 1320 | 511, 498, 511, 506, 509, 499, 503, 506, 1321 | 16, 511, 498, 511, 506, 499, 501, 498, 1322 | 502, 458, 514, 503, 16, 504, 457, 504, 1323 | 503, 507, 499, 503, 16, 516, 498, 516, 1324 | 515, 507, 499, 503, 16, 516, 498, 516, 1325 | 515, 509, 499, 517, 515, 16, 516, 498, 1326 | 516, 515, 518, 458, 16, 558, 457, 558, 1327 | 517, 518, 458, 519, 457, 558, 457, 558, 1328 | 517, 521, 555, 520, 521, 555, 520, 522, 1329 | 458, 16, 557, 557, 461, 522, 554, 458, 1330 | 461, 553, 461, 553, 523, 522, 461, 524, 1331 | 16, 553, 461, 553, 523, 453, 0, 16, 1332 | 525, 0, 525, 454, 492, 456, 526, 454, 1333 | 16, 493, 0, 493, 454, 528, 461, 524, 1334 | 16, 552, 461, 552, 527, 528, 461, 524, 1335 | 16, 552, 461, 552, 527, 528, 529, 458, 1336 | 461, 550, 461, 550, 527, 531, 533, 530, 1337 | 531, 533, 530, 528, 458, 16, 532, 532, 1338 | 461, 532, 529, 458, 461, 461, 527, 534, 1339 | 458, 16, 549, 549, 457, 534, 458, 544, 1340 | 457, 545, 457, 545, 535, 534, 458, 16, 1341 | 536, 457, 536, 535, 534, 458, 537, 535, 1342 | 16, 536, 457, 536, 535, 539, 531, 535, 1343 | 16, 543, 530, 543, 538, 539, 531, 535, 1344 | 16, 543, 530, 543, 538, 539, 458, 533, 1345 | 530, 540, 530, 540, 538, 541, 458, 533, 1346 | 538, 16, 543, 530, 543, 538, 541, 458, 1347 | 533, 530, 542, 530, 542, 538, 541, 458, 1348 | 535, 538, 16, 543, 530, 543, 538, 541, 1349 | 467, 535, 538, 16, 543, 530, 543, 538, 1350 | 531, 533, 530, 534, 458, 546, 535, 16, 1351 | 536, 457, 536, 535, 539, 531, 535, 16, 1352 | 548, 530, 548, 547, 539, 531, 535, 16, 1353 | 548, 530, 548, 547, 541, 467, 454, 547, 1354 | 16, 548, 530, 548, 547, 549, 458, 544, 1355 | 457, 457, 535, 551, 529, 458, 527, 16, 1356 | 552, 461, 552, 527, 551, 529, 458, 461, 1357 | 552, 461, 552, 527, 551, 529, 524, 527, 1358 | 16, 552, 461, 552, 527, 522, 554, 458, 1359 | 523, 16, 553, 461, 553, 523, 521, 555, 1360 | 520, 518, 458, 16, 556, 556, 457, 556, 1361 | 458, 519, 457, 457, 517, 557, 554, 458, 1362 | 461, 461, 523, 518, 458, 559, 517, 16, 1363 | 558, 457, 558, 517, 561, 521, 517, 16, 1364 | 564, 520, 564, 560, 561, 521, 517, 16, 1365 | 564, 520, 564, 560, 561, 458, 555, 520, 1366 | 562, 520, 562, 560, 563, 458, 555, 560, 1367 | 16, 564, 520, 564, 560, 563, 458, 555, 1368 | 520, 564, 520, 564, 560, 563, 458, 517, 1369 | 560, 16, 564, 520, 564, 560, 565, 458, 1370 | 512, 457, 457, 503, 567, 497, 458, 495, 1371 | 16, 568, 461, 568, 495, 567, 497, 458, 1372 | 461, 568, 461, 568, 495, 567, 497, 454, 1373 | 495, 16, 568, 461, 568, 495, 571, 461, 1374 | 490, 16, 597, 461, 597, 570, 571, 461, 1375 | 490, 16, 597, 461, 597, 570, 571, 575, 1376 | 458, 461, 596, 461, 596, 572, 571, 461, 1377 | 524, 16, 573, 461, 573, 572, 574, 575, 1378 | 524, 572, 16, 573, 461, 573, 572, 574, 1379 | 575, 458, 461, 573, 461, 573, 572, 577, 1380 | 579, 576, 577, 579, 576, 571, 458, 16, 1381 | 578, 578, 461, 578, 575, 458, 461, 461, 1382 | 572, 580, 458, 16, 595, 595, 457, 580, 1383 | 458, 590, 457, 591, 457, 591, 581, 580, 1384 | 458, 16, 582, 457, 582, 581, 580, 458, 1385 | 583, 581, 16, 582, 457, 582, 581, 585, 1386 | 577, 581, 16, 589, 576, 589, 584, 585, 1387 | 577, 581, 16, 589, 576, 589, 584, 585, 1388 | 458, 579, 576, 586, 576, 586, 584, 587, 1389 | 458, 579, 584, 16, 589, 576, 589, 584, 1390 | 587, 458, 579, 576, 588, 576, 588, 584, 1391 | 587, 458, 581, 584, 16, 589, 576, 589, 1392 | 584, 587, 499, 581, 584, 16, 589, 576, 1393 | 589, 584, 577, 579, 576, 580, 458, 592, 1394 | 581, 16, 582, 457, 582, 581, 585, 577, 1395 | 581, 16, 594, 576, 594, 593, 585, 577, 1396 | 581, 16, 594, 576, 594, 593, 587, 499, 1397 | 517, 593, 16, 594, 576, 594, 593, 595, 1398 | 458, 590, 457, 457, 581, 574, 575, 458, 1399 | 572, 16, 573, 461, 573, 572, 574, 575, 1400 | 490, 570, 16, 597, 461, 597, 570, 522, 1401 | 461, 452, 16, 600, 461, 600, 599, 522, 1402 | 461, 452, 16, 600, 461, 600, 599, 603, 1403 | 554, 452, 599, 16, 605, 461, 605, 601, 1404 | 522, 461, 490, 16, 602, 461, 602, 601, 1405 | 603, 554, 452, 601, 16, 605, 461, 605, 1406 | 601, 603, 554, 458, 461, 604, 461, 604, 1407 | 523, 522, 554, 524, 523, 16, 553, 461, 1408 | 553, 523, 603, 554, 490, 601, 16, 605, 1409 | 461, 605, 601, 492, 456, 607, 490, 16, 1410 | 491, 0, 491, 490, 522, 461, 490, 16, 1411 | 602, 461, 602, 601, 0, 7, 10, 451, 1412 | 0, 2, 0, 7, 10, 451, 0, 2, 1413 | 610, 3, 0, 0, 309, 2, 611, 3, 1414 | 0, 0, 5, 4, 612, 3, 0, 0, 1415 | 0, 6, 0, 0 1416 | ] 1417 | 1418 | class << self 1419 | attr_accessor :_parser_trans_actions 1420 | private :_parser_trans_actions, :_parser_trans_actions= 1421 | end 1422 | self._parser_trans_actions = [ 1423 | 49, 0, 53, 53, 53, 0, 0, 7, 1424 | 49, 12, 12, 7, 7, 9, 0, 49, 1425 | 0, 53, 53, 53, 0, 0, 7, 49, 1426 | 12, 12, 7, 7, 9, 0, 0, 5, 1427 | 5, 5, 0, 1, 12, 12, 7, 7, 1428 | 7, 0, 25, 1, 15, 0, 3, 3, 1429 | 7, 25, 1, 15, 0, 0, 5, 5, 1430 | 0, 0, 1, 12, 0, 33, 12, 0, 1431 | 12, 0, 0, 5, 5, 0, 1, 0, 1432 | 1, 1, 12, 0, 33, 12, 0, 12, 1433 | 0, 0, 0, 7, 12, 5, 5, 0, 1434 | 33, 21, 0, 21, 1, 25, 1, 15, 1435 | 0, 3, 18, 3, 3, 0, 0, 5, 1436 | 5, 0, 0, 1, 25, 1, 15, 0, 1437 | 21, 1, 25, 33, 21, 1, 21, 1, 1438 | 12, 0, 15, 33, 12, 0, 12, 0, 1439 | 0, 5, 15, 0, 1, 0, 1, 1, 1440 | 25, 25, 1, 15, 15, 0, 3, 15, 1441 | 18, 3, 3, 0, 0, 5, 15, 0, 1442 | 0, 1, 3, 15, 18, 3, 3, 0, 1443 | 0, 15, 5, 0, 1, 0, 1, 1, 1444 | 12, 15, 33, 12, 0, 12, 0, 12, 1445 | 15, 5, 0, 33, 21, 0, 21, 1, 1446 | 21, 37, 25, 33, 21, 1, 21, 1, 1447 | 12, 15, 15, 33, 12, 0, 12, 0, 1448 | 0, 15, 15, 0, 1, 0, 1, 1, 1449 | 12, 15, 15, 0, 33, 21, 0, 21, 1450 | 1, 37, 25, 1, 12, 15, 5, 0, 1451 | 33, 21, 0, 21, 1, 21, 37, 25, 1452 | 33, 21, 1, 21, 1, 12, 15, 15, 1453 | 33, 12, 0, 12, 0, 12, 15, 15, 1454 | 0, 33, 21, 0, 21, 1, 0, 15, 1455 | 5, 0, 0, 1, 12, 5, 15, 0, 1456 | 33, 21, 0, 21, 1, 12, 5, 5, 1457 | 0, 33, 21, 0, 21, 1, 21, 1, 1458 | 25, 33, 21, 1, 21, 1, 12, 0, 1459 | 15, 33, 12, 0, 12, 0, 12, 5, 1460 | 15, 0, 33, 21, 0, 21, 1, 12, 1461 | 5, 5, 0, 33, 29, 0, 29, 1, 1462 | 12, 0, 33, 12, 0, 12, 0, 12, 1463 | 5, 5, 0, 33, 29, 0, 29, 1, 1464 | 0, 5, 5, 0, 1, 0, 1, 1, 1465 | 12, 5, 5, 0, 33, 21, 0, 21, 1466 | 1, 21, 1, 25, 33, 21, 1, 21, 1467 | 1, 12, 0, 15, 33, 12, 0, 12, 1468 | 0, 0, 5, 15, 0, 1, 0, 1, 1469 | 1, 12, 0, 15, 33, 12, 0, 12, 1470 | 0, 12, 5, 15, 0, 33, 21, 0, 1471 | 21, 1, 25, 25, 1, 15, 15, 0, 1472 | 3, 15, 18, 3, 3, 0, 0, 5, 1473 | 15, 0, 0, 1, 3, 15, 18, 3, 1474 | 3, 0, 0, 15, 5, 0, 1, 0, 1475 | 1, 1, 12, 15, 33, 12, 0, 12, 1476 | 0, 12, 15, 5, 0, 33, 21, 0, 1477 | 21, 1, 21, 37, 25, 33, 21, 1, 1478 | 21, 1, 12, 15, 15, 33, 12, 0, 1479 | 12, 0, 0, 15, 15, 0, 1, 0, 1480 | 1, 1, 3, 15, 18, 3, 3, 0, 1481 | 0, 15, 5, 0, 1, 0, 1, 1, 1482 | 12, 15, 33, 12, 0, 12, 0, 12, 1483 | 15, 5, 0, 33, 21, 0, 21, 1, 1484 | 21, 37, 25, 33, 21, 1, 21, 1, 1485 | 12, 15, 15, 33, 12, 0, 12, 0, 1486 | 0, 15, 15, 0, 1, 0, 1, 1, 1487 | 15, 15, 0, 3, 15, 18, 3, 3, 1488 | 0, 0, 5, 15, 0, 1, 0, 1, 1489 | 1, 12, 0, 15, 33, 12, 0, 12, 1490 | 0, 12, 0, 33, 12, 0, 12, 0, 1491 | 12, 5, 5, 0, 33, 21, 0, 21, 1492 | 1, 21, 1, 25, 33, 21, 1, 21, 1493 | 1, 12, 0, 15, 33, 12, 0, 12, 1494 | 0, 0, 5, 15, 0, 1, 0, 1, 1495 | 1, 25, 25, 1, 15, 15, 0, 3, 1496 | 15, 18, 3, 3, 0, 0, 5, 15, 1497 | 0, 0, 1, 3, 15, 18, 3, 3, 1498 | 0, 0, 15, 5, 0, 1, 0, 1, 1499 | 1, 12, 15, 33, 12, 0, 12, 0, 1500 | 12, 15, 5, 0, 33, 21, 0, 21, 1501 | 1, 21, 37, 25, 33, 21, 1, 21, 1502 | 1, 12, 15, 15, 33, 12, 0, 12, 1503 | 0, 0, 15, 15, 0, 1, 0, 1, 1504 | 1, 12, 15, 15, 0, 33, 21, 0, 1505 | 21, 1, 37, 25, 1, 12, 15, 5, 1506 | 0, 33, 21, 0, 21, 1, 21, 37, 1507 | 25, 33, 21, 1, 21, 1, 12, 15, 1508 | 15, 33, 12, 0, 12, 0, 12, 15, 1509 | 15, 0, 33, 21, 0, 21, 1, 0, 1510 | 15, 5, 0, 0, 1, 12, 5, 15, 1511 | 0, 33, 21, 0, 21, 1, 12, 5, 1512 | 5, 0, 33, 21, 0, 21, 1, 21, 1513 | 1, 25, 33, 21, 1, 21, 1, 12, 1514 | 5, 15, 0, 33, 21, 0, 21, 1, 1515 | 25, 25, 1, 0, 5, 15, 0, 0, 1516 | 1, 12, 15, 15, 0, 33, 21, 0, 1517 | 21, 1, 37, 25, 1, 12, 15, 5, 1518 | 0, 33, 21, 0, 21, 1, 21, 37, 1519 | 25, 33, 21, 1, 21, 1, 12, 15, 1520 | 15, 33, 12, 0, 12, 0, 12, 15, 1521 | 15, 0, 33, 21, 0, 21, 1, 0, 1522 | 15, 5, 0, 0, 1, 12, 15, 15, 1523 | 0, 33, 21, 0, 21, 1, 37, 25, 1524 | 1, 12, 15, 5, 0, 33, 21, 0, 1525 | 21, 1, 21, 37, 25, 33, 21, 1, 1526 | 21, 1, 12, 15, 15, 33, 12, 0, 1527 | 12, 0, 12, 15, 15, 0, 33, 21, 1528 | 0, 21, 1, 0, 15, 5, 0, 0, 1529 | 1, 12, 5, 15, 0, 33, 21, 0, 1530 | 21, 1, 29, 1, 25, 33, 29, 1, 1531 | 29, 1, 12, 0, 15, 33, 12, 0, 1532 | 12, 0, 0, 5, 15, 0, 1, 0, 1533 | 1, 1, 12, 0, 15, 33, 12, 0, 1534 | 12, 0, 12, 5, 15, 0, 33, 21, 1535 | 0, 21, 1, 25, 25, 1, 15, 15, 1536 | 0, 3, 15, 18, 3, 3, 0, 0, 1537 | 5, 15, 0, 0, 1, 3, 15, 18, 1538 | 3, 3, 0, 0, 15, 5, 0, 1, 1539 | 0, 1, 1, 12, 15, 33, 12, 0, 1540 | 12, 0, 12, 15, 5, 0, 33, 21, 1541 | 0, 21, 1, 21, 37, 25, 33, 21, 1542 | 1, 21, 1, 12, 15, 15, 33, 12, 1543 | 0, 12, 0, 0, 15, 15, 0, 1, 1544 | 0, 1, 1, 12, 15, 15, 0, 33, 1545 | 21, 0, 21, 1, 37, 25, 1, 12, 1546 | 15, 5, 0, 33, 21, 0, 21, 1, 1547 | 21, 37, 25, 33, 21, 1, 21, 1, 1548 | 12, 15, 15, 33, 12, 0, 12, 0, 1549 | 12, 15, 15, 0, 33, 21, 0, 21, 1550 | 1, 0, 15, 5, 0, 0, 1, 12, 1551 | 5, 15, 0, 33, 29, 0, 29, 1, 1552 | 0, 5, 15, 0, 1, 0, 1, 1, 1553 | 12, 5, 15, 0, 33, 21, 0, 21, 1554 | 1, 12, 5, 15, 0, 33, 29, 0, 1555 | 29, 1, 29, 1, 25, 33, 29, 1, 1556 | 29, 1, 12, 0, 15, 33, 12, 0, 1557 | 12, 0, 12, 5, 15, 0, 33, 29, 1558 | 0, 29, 1, 12, 0, 15, 33, 12, 1559 | 0, 12, 0, 12, 5, 15, 0, 33, 1560 | 29, 0, 29, 1, 12, 5, 5, 0, 1561 | 33, 29, 0, 29, 1, 29, 1, 25, 1562 | 33, 29, 1, 29, 1, 0, 5, 5, 1563 | 0, 0, 1, 12, 0, 33, 12, 0, 1564 | 12, 0, 0, 5, 5, 0, 1, 0, 1565 | 1, 1, 12, 0, 33, 12, 0, 12, 1566 | 0, 12, 5, 5, 0, 33, 21, 0, 1567 | 21, 1, 25, 1, 15, 0, 3, 18, 1568 | 3, 3, 0, 0, 5, 5, 0, 0, 1569 | 1, 25, 1, 15, 0, 21, 1, 25, 1570 | 33, 21, 1, 21, 1, 12, 0, 15, 1571 | 33, 12, 0, 12, 0, 0, 5, 15, 1572 | 0, 1, 0, 1, 1, 25, 25, 1, 1573 | 15, 15, 0, 3, 15, 18, 3, 3, 1574 | 0, 0, 5, 15, 0, 0, 1, 3, 1575 | 15, 18, 3, 3, 0, 0, 15, 5, 1576 | 0, 1, 0, 1, 1, 12, 15, 33, 1577 | 12, 0, 12, 0, 12, 15, 5, 0, 1578 | 33, 21, 0, 21, 1, 21, 37, 25, 1579 | 33, 21, 1, 21, 1, 12, 15, 15, 1580 | 33, 12, 0, 12, 0, 0, 15, 15, 1581 | 0, 1, 0, 1, 1, 12, 15, 15, 1582 | 0, 33, 21, 0, 21, 1, 37, 25, 1583 | 1, 12, 15, 5, 0, 33, 21, 0, 1584 | 21, 1, 21, 37, 25, 33, 21, 1, 1585 | 21, 1, 12, 15, 15, 33, 12, 0, 1586 | 12, 0, 12, 15, 15, 0, 33, 21, 1587 | 0, 21, 1, 0, 15, 5, 0, 0, 1588 | 1, 12, 5, 15, 0, 33, 21, 0, 1589 | 21, 1, 12, 5, 5, 0, 33, 21, 1590 | 0, 21, 1, 21, 1, 25, 33, 21, 1591 | 1, 21, 1, 12, 0, 15, 33, 12, 1592 | 0, 12, 0, 12, 5, 15, 0, 33, 1593 | 21, 0, 21, 1, 12, 5, 5, 0, 1594 | 33, 29, 0, 29, 1, 12, 0, 33, 1595 | 12, 0, 12, 0, 12, 5, 5, 0, 1596 | 33, 29, 0, 29, 1, 0, 5, 5, 1597 | 0, 1, 0, 1, 1, 12, 5, 5, 1598 | 0, 33, 21, 0, 21, 1, 21, 1, 1599 | 25, 33, 21, 1, 21, 1, 12, 0, 1600 | 15, 33, 12, 0, 12, 0, 0, 5, 1601 | 15, 0, 1, 0, 1, 1, 12, 0, 1602 | 15, 33, 12, 0, 12, 0, 12, 5, 1603 | 15, 0, 33, 21, 0, 21, 1, 25, 1604 | 25, 1, 15, 15, 0, 3, 15, 18, 1605 | 3, 3, 0, 0, 5, 15, 0, 0, 1606 | 1, 3, 15, 18, 3, 3, 0, 0, 1607 | 15, 5, 0, 1, 0, 1, 1, 12, 1608 | 15, 33, 12, 0, 12, 0, 12, 15, 1609 | 5, 0, 33, 21, 0, 21, 1, 21, 1610 | 37, 25, 33, 21, 1, 21, 1, 12, 1611 | 15, 15, 33, 12, 0, 12, 0, 0, 1612 | 15, 15, 0, 1, 0, 1, 1, 3, 1613 | 15, 18, 3, 3, 0, 0, 15, 5, 1614 | 0, 1, 0, 1, 1, 12, 15, 33, 1615 | 12, 0, 12, 0, 12, 15, 5, 0, 1616 | 33, 21, 0, 21, 1, 21, 37, 25, 1617 | 33, 21, 1, 21, 1, 12, 15, 15, 1618 | 33, 12, 0, 12, 0, 0, 15, 15, 1619 | 0, 1, 0, 1, 1, 15, 15, 0, 1620 | 3, 15, 18, 3, 3, 0, 0, 5, 1621 | 15, 0, 1, 0, 1, 1, 12, 0, 1622 | 15, 33, 12, 0, 12, 0, 12, 0, 1623 | 33, 12, 0, 12, 0, 12, 5, 5, 1624 | 0, 33, 21, 0, 21, 1, 21, 1, 1625 | 25, 33, 21, 1, 21, 1, 12, 0, 1626 | 15, 33, 12, 0, 12, 0, 0, 5, 1627 | 15, 0, 1, 0, 1, 1, 25, 25, 1628 | 1, 15, 15, 0, 3, 15, 18, 3, 1629 | 3, 0, 0, 5, 15, 0, 0, 1, 1630 | 3, 15, 18, 3, 3, 0, 0, 15, 1631 | 5, 0, 1, 0, 1, 1, 12, 15, 1632 | 33, 12, 0, 12, 0, 12, 15, 5, 1633 | 0, 33, 21, 0, 21, 1, 21, 37, 1634 | 25, 33, 21, 1, 21, 1, 12, 15, 1635 | 15, 33, 12, 0, 12, 0, 0, 15, 1636 | 15, 0, 1, 0, 1, 1, 12, 15, 1637 | 15, 0, 33, 21, 0, 21, 1, 37, 1638 | 25, 1, 12, 15, 5, 0, 33, 21, 1639 | 0, 21, 1, 21, 37, 25, 33, 21, 1640 | 1, 21, 1, 12, 15, 15, 33, 12, 1641 | 0, 12, 0, 12, 15, 15, 0, 33, 1642 | 21, 0, 21, 1, 0, 15, 5, 0, 1643 | 0, 1, 12, 5, 15, 0, 33, 21, 1644 | 0, 21, 1, 12, 5, 5, 0, 33, 1645 | 21, 0, 21, 1, 21, 1, 25, 33, 1646 | 21, 1, 21, 1, 12, 5, 15, 0, 1647 | 33, 21, 0, 21, 1, 25, 25, 1, 1648 | 0, 5, 15, 0, 0, 1, 12, 15, 1649 | 15, 0, 33, 21, 0, 21, 1, 37, 1650 | 25, 1, 12, 15, 5, 0, 33, 21, 1651 | 0, 21, 1, 21, 37, 25, 33, 21, 1652 | 1, 21, 1, 12, 15, 15, 33, 12, 1653 | 0, 12, 0, 12, 15, 15, 0, 33, 1654 | 21, 0, 21, 1, 0, 15, 5, 0, 1655 | 0, 1, 12, 15, 15, 0, 33, 21, 1656 | 0, 21, 1, 37, 25, 1, 12, 15, 1657 | 5, 0, 33, 21, 0, 21, 1, 21, 1658 | 37, 25, 33, 21, 1, 21, 1, 12, 1659 | 15, 15, 33, 12, 0, 12, 0, 12, 1660 | 15, 15, 0, 33, 21, 0, 21, 1, 1661 | 0, 15, 5, 0, 0, 1, 12, 5, 1662 | 15, 0, 33, 21, 0, 21, 1, 29, 1663 | 1, 25, 33, 29, 1, 29, 1, 12, 1664 | 0, 15, 33, 12, 0, 12, 0, 0, 1665 | 5, 15, 0, 1, 0, 1, 1, 12, 1666 | 0, 15, 33, 12, 0, 12, 0, 12, 1667 | 5, 15, 0, 33, 21, 0, 21, 1, 1668 | 25, 25, 1, 15, 15, 0, 3, 15, 1669 | 18, 3, 3, 0, 0, 5, 15, 0, 1670 | 0, 1, 3, 15, 18, 3, 3, 0, 1671 | 0, 15, 5, 0, 1, 0, 1, 1, 1672 | 12, 15, 33, 12, 0, 12, 0, 12, 1673 | 15, 5, 0, 33, 21, 0, 21, 1, 1674 | 21, 37, 25, 33, 21, 1, 21, 1, 1675 | 12, 15, 15, 33, 12, 0, 12, 0, 1676 | 0, 15, 15, 0, 1, 0, 1, 1, 1677 | 12, 15, 15, 0, 33, 21, 0, 21, 1678 | 1, 37, 25, 1, 12, 15, 5, 0, 1679 | 33, 21, 0, 21, 1, 21, 37, 25, 1680 | 33, 21, 1, 21, 1, 12, 15, 15, 1681 | 33, 12, 0, 12, 0, 12, 15, 15, 1682 | 0, 33, 21, 0, 21, 1, 0, 15, 1683 | 5, 0, 0, 1, 12, 5, 15, 0, 1684 | 33, 29, 0, 29, 1, 0, 5, 15, 1685 | 0, 1, 0, 1, 1, 12, 5, 15, 1686 | 0, 33, 21, 0, 21, 1, 12, 5, 1687 | 15, 0, 33, 29, 0, 29, 1, 29, 1688 | 1, 25, 33, 29, 1, 29, 1, 12, 1689 | 0, 15, 33, 12, 0, 12, 0, 12, 1690 | 5, 15, 0, 33, 29, 0, 29, 1, 1691 | 12, 0, 15, 33, 12, 0, 12, 0, 1692 | 12, 5, 15, 0, 33, 29, 0, 29, 1693 | 1, 12, 5, 5, 0, 33, 29, 0, 1694 | 29, 1, 29, 1, 25, 33, 29, 1, 1695 | 29, 1, 0, 53, 53, 53, 0, 49, 1696 | 0, 45, 45, 45, 0, 41, 0, 5, 1697 | 5, 5, 0, 1, 0, 5, 5, 0, 1698 | 0, 1, 12, 0, 33, 12, 0, 12, 1699 | 0, 0, 5, 5, 0, 1, 0, 1, 1700 | 1, 12, 0, 33, 12, 0, 12, 0, 1701 | 12, 5, 5, 0, 33, 21, 0, 21, 1702 | 1, 25, 1, 15, 0, 3, 18, 3, 1703 | 3, 0, 0, 5, 5, 0, 0, 1, 1704 | 25, 1, 15, 0, 21, 1, 25, 33, 1705 | 21, 1, 21, 1, 12, 0, 15, 33, 1706 | 12, 0, 12, 0, 0, 5, 15, 0, 1707 | 1, 0, 1, 1, 25, 25, 1, 15, 1708 | 15, 0, 3, 15, 18, 3, 3, 0, 1709 | 0, 5, 15, 0, 0, 1, 3, 15, 1710 | 18, 3, 3, 0, 0, 15, 5, 0, 1711 | 1, 0, 1, 1, 12, 15, 33, 12, 1712 | 0, 12, 0, 12, 15, 5, 0, 33, 1713 | 21, 0, 21, 1, 21, 37, 25, 33, 1714 | 21, 1, 21, 1, 12, 15, 15, 33, 1715 | 12, 0, 12, 0, 0, 15, 15, 0, 1716 | 1, 0, 1, 1, 12, 15, 15, 0, 1717 | 33, 21, 0, 21, 1, 0, 15, 15, 1718 | 0, 1, 0, 1, 1, 12, 15, 15, 1719 | 0, 33, 21, 0, 21, 1, 12, 15, 1720 | 15, 0, 33, 21, 0, 21, 1, 37, 1721 | 25, 1, 0, 15, 5, 0, 0, 1, 1722 | 12, 5, 15, 0, 33, 21, 0, 21, 1723 | 1, 0, 5, 15, 0, 1, 0, 1, 1724 | 1, 12, 5, 15, 0, 33, 21, 0, 1725 | 21, 1, 12, 5, 5, 0, 33, 29, 1726 | 0, 29, 1, 12, 0, 33, 12, 0, 1727 | 12, 0, 12, 5, 5, 0, 33, 29, 1728 | 0, 29, 1, 0, 5, 5, 0, 1, 1729 | 0, 1, 1, 12, 5, 5, 0, 33, 1730 | 21, 0, 21, 1, 21, 1, 25, 33, 1731 | 21, 1, 21, 1, 12, 0, 15, 33, 1732 | 12, 0, 12, 0, 0, 5, 15, 0, 1733 | 1, 0, 1, 1, 25, 25, 1, 15, 1734 | 15, 0, 3, 15, 18, 3, 3, 0, 1735 | 0, 5, 15, 0, 0, 1, 3, 15, 1736 | 18, 3, 3, 0, 0, 15, 5, 0, 1737 | 1, 0, 1, 1, 12, 15, 33, 12, 1738 | 0, 12, 0, 12, 15, 5, 0, 33, 1739 | 21, 0, 21, 1, 21, 37, 25, 33, 1740 | 21, 1, 21, 1, 12, 15, 15, 33, 1741 | 12, 0, 12, 0, 0, 15, 15, 0, 1742 | 1, 0, 1, 1, 3, 15, 18, 3, 1743 | 3, 0, 0, 15, 5, 0, 1, 0, 1744 | 1, 1, 12, 15, 33, 12, 0, 12, 1745 | 0, 12, 15, 5, 0, 33, 21, 0, 1746 | 21, 1, 21, 37, 25, 33, 21, 1, 1747 | 21, 1, 12, 15, 15, 33, 12, 0, 1748 | 12, 0, 0, 15, 15, 0, 1, 0, 1749 | 1, 1, 15, 15, 0, 3, 15, 18, 1750 | 3, 3, 0, 0, 5, 15, 0, 1, 1751 | 0, 1, 1, 12, 0, 15, 33, 12, 1752 | 0, 12, 0, 12, 0, 33, 12, 0, 1753 | 12, 0, 12, 5, 5, 0, 33, 21, 1754 | 0, 21, 1, 21, 1, 25, 33, 21, 1755 | 1, 21, 1, 12, 0, 15, 33, 12, 1756 | 0, 12, 0, 0, 5, 15, 0, 1, 1757 | 0, 1, 1, 25, 25, 1, 15, 15, 1758 | 0, 3, 15, 18, 3, 3, 0, 0, 1759 | 5, 15, 0, 0, 1, 3, 15, 18, 1760 | 3, 3, 0, 0, 15, 5, 0, 1, 1761 | 0, 1, 1, 12, 15, 33, 12, 0, 1762 | 12, 0, 12, 15, 5, 0, 33, 21, 1763 | 0, 21, 1, 21, 37, 25, 33, 21, 1764 | 1, 21, 1, 12, 15, 15, 33, 12, 1765 | 0, 12, 0, 0, 15, 15, 0, 1, 1766 | 0, 1, 1, 12, 15, 15, 0, 33, 1767 | 21, 0, 21, 1, 0, 15, 15, 0, 1768 | 1, 0, 1, 1, 12, 15, 15, 0, 1769 | 33, 21, 0, 21, 1, 12, 15, 15, 1770 | 0, 33, 21, 0, 21, 1, 37, 25, 1771 | 1, 0, 15, 5, 0, 0, 1, 12, 1772 | 5, 15, 0, 33, 21, 0, 21, 1, 1773 | 0, 5, 15, 0, 1, 0, 1, 1, 1774 | 12, 5, 15, 0, 33, 21, 0, 21, 1775 | 1, 12, 5, 15, 0, 33, 21, 0, 1776 | 21, 1, 25, 25, 1, 0, 5, 15, 1777 | 0, 0, 1, 12, 15, 15, 0, 33, 1778 | 21, 0, 21, 1, 0, 15, 15, 0, 1779 | 1, 0, 1, 1, 12, 15, 15, 0, 1780 | 33, 21, 0, 21, 1, 37, 25, 1, 1781 | 0, 15, 5, 0, 0, 1, 12, 15, 1782 | 15, 0, 33, 21, 0, 21, 1, 0, 1783 | 15, 15, 0, 1, 0, 1, 1, 12, 1784 | 15, 15, 0, 33, 21, 0, 21, 1, 1785 | 12, 15, 15, 0, 33, 21, 0, 21, 1786 | 1, 37, 25, 1, 0, 15, 5, 0, 1787 | 0, 1, 12, 5, 15, 0, 33, 21, 1788 | 0, 21, 1, 0, 5, 15, 0, 1, 1789 | 0, 1, 1, 12, 5, 15, 0, 33, 1790 | 21, 0, 21, 1, 29, 1, 25, 33, 1791 | 29, 1, 29, 1, 12, 0, 15, 33, 1792 | 12, 0, 12, 0, 0, 5, 15, 0, 1793 | 1, 0, 1, 1, 12, 0, 15, 33, 1794 | 12, 0, 12, 0, 12, 5, 15, 0, 1795 | 33, 21, 0, 21, 1, 0, 5, 15, 1796 | 0, 1, 0, 1, 1, 25, 25, 1, 1797 | 15, 15, 0, 3, 15, 18, 3, 3, 1798 | 0, 0, 5, 15, 0, 0, 1, 3, 1799 | 15, 18, 3, 3, 0, 0, 15, 5, 1800 | 0, 1, 0, 1, 1, 12, 15, 33, 1801 | 12, 0, 12, 0, 12, 15, 5, 0, 1802 | 33, 21, 0, 21, 1, 21, 37, 25, 1803 | 33, 21, 1, 21, 1, 12, 15, 15, 1804 | 33, 12, 0, 12, 0, 0, 15, 15, 1805 | 0, 1, 0, 1, 1, 12, 15, 15, 1806 | 0, 33, 21, 0, 21, 1, 0, 15, 1807 | 15, 0, 1, 0, 1, 1, 12, 15, 1808 | 15, 0, 33, 21, 0, 21, 1, 12, 1809 | 15, 15, 0, 33, 21, 0, 21, 1, 1810 | 37, 25, 1, 0, 15, 5, 0, 0, 1811 | 1, 12, 5, 15, 0, 33, 21, 0, 1812 | 21, 1, 12, 5, 15, 0, 33, 29, 1813 | 0, 29, 1, 29, 1, 25, 33, 29, 1814 | 1, 29, 1, 12, 0, 15, 33, 12, 1815 | 0, 12, 0, 12, 5, 15, 0, 33, 1816 | 29, 0, 29, 1, 12, 0, 15, 33, 1817 | 12, 0, 12, 0, 12, 5, 15, 0, 1818 | 33, 29, 0, 29, 1, 0, 5, 15, 1819 | 0, 1, 0, 1, 1, 12, 5, 15, 1820 | 0, 33, 21, 0, 21, 1, 12, 5, 1821 | 15, 0, 33, 29, 0, 29, 1, 12, 1822 | 5, 5, 0, 33, 29, 0, 29, 1, 1823 | 29, 1, 25, 33, 29, 1, 29, 1, 1824 | 0, 5, 5, 0, 0, 1, 12, 0, 1825 | 33, 12, 0, 12, 0, 0, 5, 5, 1826 | 0, 1, 0, 1, 1, 12, 0, 33, 1827 | 12, 0, 12, 0, 12, 5, 5, 0, 1828 | 33, 21, 0, 21, 1, 25, 1, 15, 1829 | 0, 3, 18, 3, 3, 0, 0, 5, 1830 | 5, 0, 0, 1, 25, 1, 15, 0, 1831 | 21, 1, 25, 33, 21, 1, 21, 1, 1832 | 12, 0, 15, 33, 12, 0, 12, 0, 1833 | 0, 5, 15, 0, 1, 0, 1, 1, 1834 | 25, 25, 1, 15, 15, 0, 3, 15, 1835 | 18, 3, 3, 0, 0, 5, 15, 0, 1836 | 0, 1, 3, 15, 18, 3, 3, 0, 1837 | 0, 15, 5, 0, 1, 0, 1, 1, 1838 | 12, 15, 33, 12, 0, 12, 0, 12, 1839 | 15, 5, 0, 33, 21, 0, 21, 1, 1840 | 21, 37, 25, 33, 21, 1, 21, 1, 1841 | 12, 15, 15, 33, 12, 0, 12, 0, 1842 | 0, 15, 15, 0, 1, 0, 1, 1, 1843 | 12, 15, 15, 0, 33, 21, 0, 21, 1844 | 1, 0, 15, 15, 0, 1, 0, 1, 1845 | 1, 12, 15, 15, 0, 33, 21, 0, 1846 | 21, 1, 12, 15, 15, 0, 33, 21, 1847 | 0, 21, 1, 37, 25, 1, 12, 15, 1848 | 5, 0, 33, 21, 0, 21, 1, 21, 1849 | 37, 25, 33, 21, 1, 21, 1, 12, 1850 | 15, 15, 33, 12, 0, 12, 0, 12, 1851 | 15, 15, 0, 33, 21, 0, 21, 1, 1852 | 0, 15, 5, 0, 0, 1, 12, 5, 1853 | 15, 0, 33, 21, 0, 21, 1, 0, 1854 | 5, 15, 0, 1, 0, 1, 1, 12, 1855 | 5, 15, 0, 33, 21, 0, 21, 1, 1856 | 12, 5, 5, 0, 33, 29, 0, 29, 1857 | 1, 12, 0, 33, 12, 0, 12, 0, 1858 | 12, 5, 5, 0, 33, 29, 0, 29, 1859 | 1, 0, 5, 5, 0, 1, 0, 1, 1860 | 1, 12, 5, 5, 0, 33, 21, 0, 1861 | 21, 1, 21, 1, 25, 33, 21, 1, 1862 | 21, 1, 12, 0, 15, 33, 12, 0, 1863 | 12, 0, 0, 5, 15, 0, 1, 0, 1864 | 1, 1, 25, 25, 1, 15, 15, 0, 1865 | 3, 15, 18, 3, 3, 0, 0, 5, 1866 | 15, 0, 0, 1, 3, 15, 18, 3, 1867 | 3, 0, 0, 15, 5, 0, 1, 0, 1868 | 1, 1, 12, 15, 33, 12, 0, 12, 1869 | 0, 12, 15, 5, 0, 33, 21, 0, 1870 | 21, 1, 21, 37, 25, 33, 21, 1, 1871 | 21, 1, 12, 15, 15, 33, 12, 0, 1872 | 12, 0, 0, 15, 15, 0, 1, 0, 1873 | 1, 1, 12, 15, 15, 0, 33, 21, 1874 | 0, 21, 1, 0, 15, 15, 0, 1, 1875 | 0, 1, 1, 12, 15, 15, 0, 33, 1876 | 21, 0, 21, 1, 12, 15, 15, 0, 1877 | 33, 21, 0, 21, 1, 37, 25, 1, 1878 | 12, 15, 5, 0, 33, 21, 0, 21, 1879 | 1, 21, 37, 25, 33, 21, 1, 21, 1880 | 1, 12, 15, 15, 33, 12, 0, 12, 1881 | 0, 12, 15, 15, 0, 33, 21, 0, 1882 | 21, 1, 12, 15, 33, 12, 0, 12, 1883 | 0, 0, 15, 5, 0, 1, 0, 1, 1884 | 1, 37, 25, 1, 15, 15, 0, 3, 1885 | 15, 18, 3, 3, 0, 0, 5, 15, 1886 | 0, 1, 0, 1, 1, 12, 0, 15, 1887 | 33, 12, 0, 12, 0, 12, 0, 33, 1888 | 12, 0, 12, 0, 12, 5, 5, 0, 1889 | 33, 21, 0, 21, 1, 21, 1, 25, 1890 | 33, 21, 1, 21, 1, 12, 0, 15, 1891 | 33, 12, 0, 12, 0, 0, 5, 15, 1892 | 0, 1, 0, 1, 1, 25, 25, 1, 1893 | 15, 15, 0, 3, 15, 18, 3, 3, 1894 | 0, 0, 5, 15, 0, 0, 1, 3, 1895 | 15, 18, 3, 3, 0, 0, 15, 5, 1896 | 0, 1, 0, 1, 1, 12, 15, 33, 1897 | 12, 0, 12, 0, 12, 15, 5, 0, 1898 | 33, 21, 0, 21, 1, 21, 37, 25, 1899 | 33, 21, 1, 21, 1, 12, 15, 15, 1900 | 33, 12, 0, 12, 0, 0, 15, 15, 1901 | 0, 1, 0, 1, 1, 12, 15, 15, 1902 | 0, 33, 21, 0, 21, 1, 0, 15, 1903 | 15, 0, 1, 0, 1, 1, 12, 15, 1904 | 15, 0, 33, 21, 0, 21, 1, 12, 1905 | 15, 15, 0, 33, 21, 0, 21, 1, 1906 | 37, 25, 1, 12, 15, 5, 0, 33, 1907 | 21, 0, 21, 1, 21, 37, 25, 33, 1908 | 21, 1, 21, 1, 12, 15, 15, 33, 1909 | 12, 0, 12, 0, 12, 15, 15, 0, 1910 | 33, 21, 0, 21, 1, 0, 15, 5, 1911 | 0, 0, 1, 12, 5, 15, 0, 33, 1912 | 21, 0, 21, 1, 0, 5, 15, 0, 1913 | 1, 0, 1, 1, 12, 5, 15, 0, 1914 | 33, 21, 0, 21, 1, 12, 5, 15, 1915 | 0, 33, 21, 0, 21, 1, 25, 25, 1916 | 1, 3, 15, 18, 3, 3, 0, 0, 1917 | 15, 5, 0, 0, 1, 0, 5, 15, 1918 | 0, 0, 1, 12, 15, 5, 0, 33, 1919 | 21, 0, 21, 1, 21, 37, 25, 33, 1920 | 21, 1, 21, 1, 12, 15, 15, 33, 1921 | 12, 0, 12, 0, 0, 15, 15, 0, 1922 | 1, 0, 1, 1, 12, 15, 15, 0, 1923 | 33, 21, 0, 21, 1, 0, 15, 15, 1924 | 0, 1, 0, 1, 1, 12, 15, 15, 1925 | 0, 33, 21, 0, 21, 1, 0, 15, 1926 | 5, 0, 0, 1, 12, 5, 15, 0, 1927 | 33, 21, 0, 21, 1, 0, 5, 15, 1928 | 0, 1, 0, 1, 1, 12, 5, 15, 1929 | 0, 33, 21, 0, 21, 1, 29, 1, 1930 | 25, 33, 29, 1, 29, 1, 12, 0, 1931 | 15, 33, 12, 0, 12, 0, 0, 5, 1932 | 15, 0, 1, 0, 1, 1, 12, 0, 1933 | 15, 33, 12, 0, 12, 0, 12, 5, 1934 | 15, 0, 33, 21, 0, 21, 1, 0, 1935 | 5, 15, 0, 1, 0, 1, 1, 25, 1936 | 25, 1, 15, 15, 0, 3, 15, 18, 1937 | 3, 3, 0, 0, 5, 15, 0, 0, 1938 | 1, 3, 15, 18, 3, 3, 0, 0, 1939 | 15, 5, 0, 1, 0, 1, 1, 12, 1940 | 15, 33, 12, 0, 12, 0, 12, 15, 1941 | 5, 0, 33, 21, 0, 21, 1, 21, 1942 | 37, 25, 33, 21, 1, 21, 1, 12, 1943 | 15, 15, 33, 12, 0, 12, 0, 0, 1944 | 15, 15, 0, 1, 0, 1, 1, 12, 1945 | 15, 15, 0, 33, 21, 0, 21, 1, 1946 | 0, 15, 15, 0, 1, 0, 1, 1, 1947 | 12, 15, 15, 0, 33, 21, 0, 21, 1948 | 1, 12, 15, 15, 0, 33, 21, 0, 1949 | 21, 1, 37, 25, 1, 12, 15, 5, 1950 | 0, 33, 21, 0, 21, 1, 21, 37, 1951 | 25, 33, 21, 1, 21, 1, 12, 15, 1952 | 15, 33, 12, 0, 12, 0, 12, 15, 1953 | 15, 0, 33, 21, 0, 21, 1, 0, 1954 | 15, 5, 0, 0, 1, 12, 5, 15, 1955 | 0, 33, 21, 0, 21, 1, 12, 5, 1956 | 15, 0, 33, 29, 0, 29, 1, 29, 1957 | 1, 25, 33, 29, 1, 29, 1, 12, 1958 | 0, 15, 33, 12, 0, 12, 0, 12, 1959 | 5, 15, 0, 33, 29, 0, 29, 1, 1960 | 12, 0, 15, 33, 12, 0, 12, 0, 1961 | 12, 5, 15, 0, 33, 29, 0, 29, 1962 | 1, 0, 5, 15, 0, 1, 0, 1, 1963 | 1, 12, 5, 15, 0, 33, 21, 0, 1964 | 21, 1, 12, 5, 15, 0, 33, 29, 1965 | 0, 29, 1, 12, 5, 5, 0, 33, 1966 | 29, 0, 29, 1, 29, 1, 25, 33, 1967 | 29, 1, 29, 1, 0, 53, 53, 53, 1968 | 0, 49, 0, 45, 45, 45, 0, 41, 1969 | 12, 12, 7, 7, 9, 0, 12, 12, 1970 | 7, 7, 9, 0, 12, 12, 7, 7, 1971 | 7, 0, 0, 0 1972 | ] 1973 | 1974 | class << self 1975 | attr_accessor :_parser_eof_actions 1976 | private :_parser_eof_actions, :_parser_eof_actions= 1977 | end 1978 | self._parser_eof_actions = [ 1979 | 0, 7, 7, 7, 7, 0, 7, 0, 1980 | 0, 7, 0, 0, 0, 0, 0, 0, 1981 | 7, 0, 0, 0, 0, 0, 0, 0, 1982 | 0, 0, 0, 0, 0, 0, 0, 0, 1983 | 0, 0, 0, 0, 0, 0, 0, 0, 1984 | 0, 0, 0, 0, 0, 0, 0, 0, 1985 | 0, 0, 0, 0, 0, 0, 0, 0, 1986 | 0, 0, 0, 0, 0, 0, 0, 0, 1987 | 0, 0, 0, 0, 0, 0, 0, 0, 1988 | 0, 0, 0, 0, 0, 0, 0, 0, 1989 | 0, 0, 0, 0, 0, 0, 0, 0, 1990 | 0, 0, 0, 0, 0, 0, 0, 0, 1991 | 0, 0, 0, 0, 0, 0, 0, 0, 1992 | 0, 0, 0, 0, 0, 0, 0, 0, 1993 | 0, 0, 0, 0, 0, 0, 0, 0, 1994 | 0, 0, 0, 0, 0, 0, 0, 0, 1995 | 0, 0, 0, 0, 0, 0, 0, 0, 1996 | 0, 0, 0, 0, 0, 0, 0, 0, 1997 | 0, 0, 0, 0, 0, 0, 0, 0, 1998 | 0, 0, 0, 0, 0, 0, 0, 0, 1999 | 0, 0, 0, 0, 0, 0, 0, 0, 2000 | 0, 0, 0, 0, 0, 0, 0, 0, 2001 | 0, 0, 0, 0, 0, 0, 0, 0, 2002 | 0, 0, 0, 0, 0, 0, 0, 0, 2003 | 0, 0, 0, 0, 0, 0, 0, 0, 2004 | 0, 0, 0, 0, 0, 0, 0, 0, 2005 | 0, 0, 0, 0, 0, 0, 0, 0, 2006 | 0, 0, 0, 0, 0, 0, 0, 0, 2007 | 0, 0, 0, 0, 0, 0, 0, 0, 2008 | 0, 0, 0, 0, 0, 0, 0, 0, 2009 | 0, 0, 0, 0, 0, 0, 0, 0, 2010 | 0, 0, 0, 0, 0, 0, 0, 0, 2011 | 0, 0, 0, 0, 0, 0, 0, 0, 2012 | 0, 0, 0, 0, 0, 0, 0, 0, 2013 | 0, 0, 0, 0, 0, 0, 0, 0, 2014 | 0, 0, 0, 0, 0, 0, 0, 0, 2015 | 0, 0, 0, 0, 0, 0, 0, 0, 2016 | 0, 0, 0, 0, 0, 0, 0, 0, 2017 | 0, 0, 0, 0, 0, 0, 0, 0, 2018 | 0, 0, 0, 0, 0, 0, 0, 0, 2019 | 0, 0, 0, 0, 0, 0, 0, 0, 2020 | 0, 0, 0, 0, 0, 0, 0, 0, 2021 | 0, 0, 0, 0, 0, 0, 0, 0, 2022 | 0, 0, 0, 0, 0, 0, 0, 0, 2023 | 0, 0, 0, 0, 0, 0, 0, 0, 2024 | 0, 0, 0, 0, 0, 0, 0, 0, 2025 | 0, 0, 0, 0, 0, 0, 0, 0, 2026 | 0, 0, 0, 0, 0, 0, 0, 0, 2027 | 0, 0, 0, 0, 0, 0, 0, 0, 2028 | 0, 0, 0, 0, 0, 0, 0, 0, 2029 | 0, 0, 0, 0, 0, 0, 0, 0, 2030 | 0, 0, 0, 0, 0, 0, 0, 0, 2031 | 0, 0, 0, 0, 0, 0, 0, 0, 2032 | 0, 0, 0, 0, 0, 0, 0, 0, 2033 | 0, 0, 0, 0, 0, 0, 0, 0, 2034 | 0, 0, 0, 0, 0, 0, 0, 0, 2035 | 0, 0, 0, 0, 0, 0, 0, 0, 2036 | 0, 0, 0, 0, 0, 0, 0, 0, 2037 | 0, 0, 0, 0, 0, 0, 0, 0, 2038 | 0, 0, 0, 0, 0, 0, 0, 0, 2039 | 0, 0, 0, 0, 0, 0, 0, 0, 2040 | 0, 0, 0, 0, 0, 0, 0, 0, 2041 | 0, 0, 0, 0, 0, 0, 0, 0, 2042 | 0, 0, 0, 0, 0, 0, 0, 0, 2043 | 0, 0, 0, 0, 0, 0, 0, 0, 2044 | 0, 0, 0, 0, 0, 0, 0, 0, 2045 | 0, 0, 0, 0, 0, 0, 0, 0, 2046 | 0, 0, 0, 0, 0, 0, 0, 0, 2047 | 0, 0, 0, 0, 0, 0, 0, 0, 2048 | 0, 0, 0, 0, 0, 0, 0, 0, 2049 | 0, 0, 0, 0, 0, 0, 0, 0, 2050 | 0, 0, 0, 0, 0, 0, 0, 0, 2051 | 0, 0, 0, 0, 0, 0, 0, 0, 2052 | 0, 0, 0, 0, 0, 0, 0, 0, 2053 | 0, 0, 0, 0, 0, 0, 0, 0, 2054 | 0, 0, 0, 0, 0, 0, 0, 0, 2055 | 0, 0, 0, 0, 0, 0 2056 | ] 2057 | 2058 | class << self 2059 | attr_accessor :parser_start 2060 | end 2061 | self.parser_start = 1; 2062 | class << self 2063 | attr_accessor :parser_first_final 2064 | end 2065 | self.parser_first_final = 610; 2066 | class << self 2067 | attr_accessor :parser_error 2068 | end 2069 | self.parser_error = 0; 2070 | 2071 | class << self 2072 | attr_accessor :parser_en_main 2073 | end 2074 | self.parser_en_main = 1; 2075 | 2076 | 2077 | # line 91 "lib/keyword_search.rl" 2078 | p = 0 2079 | eof = nil 2080 | word = nil 2081 | pe = data.length 2082 | key = nil 2083 | positive_match = nil 2084 | tokstart = nil 2085 | results = {} 2086 | quotes = 0 2087 | 2088 | # line 2089 "lib/keyword_search.rb" 2089 | begin 2090 | p ||= 0 2091 | pe ||= data.length 2092 | cs = parser_start 2093 | end 2094 | 2095 | # line 101 "lib/keyword_search.rl" 2096 | 2097 | # line 2098 "lib/keyword_search.rb" 2098 | begin 2099 | _klen, _trans, _keys, _acts, _nacts = nil 2100 | _goto_level = 0 2101 | _resume = 10 2102 | _eof_trans = 15 2103 | _again = 20 2104 | _test_eof = 30 2105 | _out = 40 2106 | while true 2107 | _trigger_goto = false 2108 | if _goto_level <= 0 2109 | if p == pe 2110 | _goto_level = _test_eof 2111 | next 2112 | end 2113 | if cs == 0 2114 | _goto_level = _out 2115 | next 2116 | end 2117 | end 2118 | if _goto_level <= _resume 2119 | _keys = _parser_key_offsets[cs] 2120 | _trans = _parser_index_offsets[cs] 2121 | _klen = _parser_single_lengths[cs] 2122 | _break_match = false 2123 | 2124 | begin 2125 | if _klen > 0 2126 | _lower = _keys 2127 | _upper = _keys + _klen - 1 2128 | 2129 | loop do 2130 | break if _upper < _lower 2131 | _mid = _lower + ( (_upper - _lower) >> 1 ) 2132 | 2133 | if data[p].ord < _parser_trans_keys[_mid] 2134 | _upper = _mid - 1 2135 | elsif data[p].ord > _parser_trans_keys[_mid] 2136 | _lower = _mid + 1 2137 | else 2138 | _trans += (_mid - _keys) 2139 | _break_match = true 2140 | break 2141 | end 2142 | end # loop 2143 | break if _break_match 2144 | _keys += _klen 2145 | _trans += _klen 2146 | end 2147 | _klen = _parser_range_lengths[cs] 2148 | if _klen > 0 2149 | _lower = _keys 2150 | _upper = _keys + (_klen << 1) - 2 2151 | loop do 2152 | break if _upper < _lower 2153 | _mid = _lower + (((_upper-_lower) >> 1) & ~1) 2154 | if data[p].ord < _parser_trans_keys[_mid] 2155 | _upper = _mid - 2 2156 | elsif data[p].ord > _parser_trans_keys[_mid+1] 2157 | _lower = _mid + 2 2158 | else 2159 | _trans += ((_mid - _keys) >> 1) 2160 | _break_match = true 2161 | break 2162 | end 2163 | end # loop 2164 | break if _break_match 2165 | _trans += _klen 2166 | end 2167 | end while false 2168 | cs = _parser_trans_targs[_trans] 2169 | if _parser_trans_actions[_trans] != 0 2170 | _acts = _parser_trans_actions[_trans] 2171 | _nacts = _parser_actions[_acts] 2172 | _acts += 1 2173 | while _nacts > 0 2174 | _nacts -= 1 2175 | _acts += 1 2176 | case _parser_actions[_acts - 1] 2177 | when 0 then 2178 | # line 13 "lib/keyword_search.rl" 2179 | begin 2180 | 2181 | tokstart = p; 2182 | end 2183 | when 1 then 2184 | # line 17 "lib/keyword_search.rl" 2185 | begin 2186 | 2187 | key = word 2188 | results[key] ||= [] 2189 | end 2190 | when 2 then 2191 | # line 22 "lib/keyword_search.rl" 2192 | begin 2193 | 2194 | key = nil 2195 | end 2196 | when 3 then 2197 | # line 26 "lib/keyword_search.rl" 2198 | begin 2199 | 2200 | word = data[tokstart..p-1] 2201 | end 2202 | when 4 then 2203 | # line 30 "lib/keyword_search.rl" 2204 | begin 2205 | 2206 | (results[key || :default] ||= []) << [ word, positive_match ] 2207 | end 2208 | when 5 then 2209 | # line 34 "lib/keyword_search.rl" 2210 | begin 2211 | 2212 | positive_match = false 2213 | end 2214 | when 6 then 2215 | # line 38 "lib/keyword_search.rl" 2216 | begin 2217 | 2218 | positive_match = true 2219 | end 2220 | when 7 then 2221 | # line 42 "lib/keyword_search.rl" 2222 | begin 2223 | quotes += 1 end 2224 | when 8 then 2225 | # line 44 "lib/keyword_search.rl" 2226 | begin 2227 | quotes -= 1 end 2228 | when 9 then 2229 | # line 71 "lib/keyword_search.rl" 2230 | begin 2231 | raise ParseError, "At offset #{p}, near: '#{data[p,10]}'" end 2232 | # line 2233 "lib/keyword_search.rb" 2233 | end # action switch 2234 | end 2235 | end 2236 | if _trigger_goto 2237 | next 2238 | end 2239 | end 2240 | if _goto_level <= _again 2241 | if cs == 0 2242 | _goto_level = _out 2243 | next 2244 | end 2245 | p += 1 2246 | if p != pe 2247 | _goto_level = _resume 2248 | next 2249 | end 2250 | end 2251 | if _goto_level <= _test_eof 2252 | if p == eof 2253 | __acts = _parser_eof_actions[cs] 2254 | __nacts = _parser_actions[__acts] 2255 | __acts += 1 2256 | while __nacts > 0 2257 | __nacts -= 1 2258 | __acts += 1 2259 | case _parser_actions[__acts - 1] 2260 | when 9 then 2261 | # line 71 "lib/keyword_search.rl" 2262 | begin 2263 | raise ParseError, "At offset #{p}, near: '#{data[p,10]}'" end 2264 | # line 2265 "lib/keyword_search.rb" 2265 | end # eof action switch 2266 | end 2267 | if _trigger_goto 2268 | next 2269 | end 2270 | end 2271 | end 2272 | if _goto_level <= _out 2273 | break 2274 | end 2275 | end 2276 | end 2277 | 2278 | # line 102 "lib/keyword_search.rl" 2279 | unless quotes.zero? 2280 | raise ParseError, "Unclosed quotes" 2281 | end 2282 | results 2283 | end 2284 | 2285 | end 2286 | 2287 | end 2288 | 2289 | 2290 | -------------------------------------------------------------------------------- /lib/keyword_search.rl: -------------------------------------------------------------------------------- 1 | require File.dirname(__FILE__) << '/keyword_search/definition.rb' 2 | 3 | module KeywordSearch 4 | 5 | class ParseError < ::SyntaxError; end 6 | 7 | class << self 8 | 9 | %%{ 10 | 11 | machine parser; 12 | 13 | action start { 14 | tokstart = p; 15 | } 16 | 17 | action key { 18 | key = word 19 | results[key] ||= [] 20 | } 21 | 22 | action default { 23 | key = nil 24 | } 25 | 26 | action word { 27 | word = data[tokstart..p-1] 28 | } 29 | 30 | action value { 31 | (results[key || :default] ||= []) << [ word, positive_match ] 32 | } 33 | 34 | action negative_match { 35 | positive_match = false 36 | } 37 | 38 | action positive_match { 39 | positive_match = true 40 | } 41 | 42 | action quote { quotes += 1 } 43 | 44 | action unquote { quotes -= 1 } 45 | 46 | seperators = ' '+ | / *[,|] */ ; 47 | 48 | bareword = ( [^ '"(:] . [^ "):]* ) > start % word ; # allow apostrophes 49 | dquoted = '"' @ quote ( [^"]* > start % word ) :>> '"' @ unquote; 50 | squoted = '\'' @ quote ( [^']* > start % word ) :>> '\'' @ unquote; 51 | 52 | anyword = dquoted | squoted | bareword ; 53 | 54 | anyvalue = anyword % value ; 55 | multivalues = anyvalue ( seperators anyvalue )* ; 56 | groupedvalues = '(' @ quote multivalues :>> ')' @ unquote; 57 | 58 | value = groupedvalues | anyvalue ; 59 | 60 | pair = bareword % key ':' value ; 61 | 62 | value_only = value > default ; 63 | 64 | match_mode = ('-' % negative_match | '+'? % positive_match ) ; 65 | 66 | definition = match_mode? <: ( pair | value_only ) ; 67 | 68 | definitions = definition ( ' '+ definition )*; 69 | 70 | main := ' '* definitions? ' '* 0 71 | @!{ raise ParseError, "At offset #{p}, near: '#{data[p,10]}'" }; 72 | 73 | }%% 74 | 75 | def search(input_string, definition=nil, &block) 76 | definition ||= Definition.new(&block) 77 | results = parse(input_string) 78 | results.each do |key, terms| 79 | definition.handle(key, terms) 80 | end 81 | results 82 | end 83 | 84 | ####### 85 | private 86 | ####### 87 | 88 | def parse(input) #:nodoc: 89 | data = input + ' ' 90 | %% write data; 91 | p = 0 92 | eof = nil 93 | word = nil 94 | pe = data.length 95 | key = nil 96 | positive_match = nil 97 | tokstart = nil 98 | results = {} 99 | quotes = 0 100 | %% write init; 101 | %% write exec; 102 | unless quotes.zero? 103 | raise ParseError, "Unclosed quotes" 104 | end 105 | results 106 | end 107 | 108 | end 109 | 110 | end 111 | 112 | 113 | -------------------------------------------------------------------------------- /lib/keyword_search/definition.rb: -------------------------------------------------------------------------------- 1 | module KeywordSearch 2 | 3 | class Definition 4 | 5 | class Keyword 6 | 7 | attr_reader :name, :description, :handler 8 | def initialize(name, description=nil, &handler) 9 | @name, @description = name, description 10 | @handler = handler 11 | end 12 | 13 | def handle(value, sign) 14 | # If the handler is only expecting one argument, 15 | # only give them the positive matches 16 | if handler.arity == 1 17 | handler.call(value) if sign 18 | else 19 | handler.call(value, sign) 20 | end 21 | end 22 | 23 | end 24 | 25 | def initialize 26 | @default_keyword = nil 27 | yield self if block_given? 28 | end 29 | 30 | def keywords 31 | @keywords ||= [] 32 | end 33 | 34 | def keyword(name, description=nil, &block) 35 | keywords << Keyword.new(name, description, &block) 36 | end 37 | 38 | def default_keyword(name) 39 | @default_keyword = name 40 | end 41 | 42 | def handle(key, values) 43 | key = @default_keyword if key == :default 44 | return false unless key 45 | true_values, false_values = *values.partition { |v| v[1] } 46 | 47 | # Get just the values 48 | true_values.collect! { |v| v[0] } 49 | false_values.collect! { |v| v[0] } 50 | 51 | if k = keywords.detect { |kw| kw.name == key.to_sym} 52 | k.handle(true_values, true) unless true_values.empty? 53 | k.handle(false_values, false) unless false_values.empty? 54 | end 55 | end 56 | end 57 | end 58 | -------------------------------------------------------------------------------- /lib/keyword_search/version.rb: -------------------------------------------------------------------------------- 1 | module KeywordSearch 2 | VERSION = '1.5.0' 3 | end 4 | -------------------------------------------------------------------------------- /test/test_keyword_search.rb: -------------------------------------------------------------------------------- 1 | require 'minitest/spec' 2 | require 'minitest/autorun' 3 | 4 | require File.dirname(__FILE__) + '/../lib/keyword_search' 5 | 6 | describe "KeywordSearch" do 7 | 8 | NAME_AND_AGE = % 9 | NAME_QUOTED_AND_AGE = %<"bruce williams" age:26> 10 | NAME_AND_QUOTED_AGE = % 11 | DEFAULT_AGE_WITH_QUOTED_AGE = %<26 name:"bruce williams"> 12 | DEFAULT_AGE_WITH_SINGLE_QUOTED_AGE = %<26 name:'bruce williams'> 13 | NAME_WITH_NESTED_SINGLE_QUOTES = %<"d'arcy d'uberville" age:28> 14 | NAME_AND_GROUPED_AGE = % 15 | NAME_AND_GROUPED_QUOTED_AGE = % 16 | NAME_AND_GROUPED_QUOTED_AGES = % 17 | GROUPED_NAMES_AND_AGE = %<(coda bruce 'hale' "williams") age:20> 18 | 19 | it "default keyword" do 20 | result = nil 21 | KeywordSearch.search(NAME_AND_AGE) do |with| 22 | with.default_keyword :name 23 | with.keyword :name do |values| 24 | result = values.join(' ') 25 | end 26 | end 27 | result.must_equal 'bruce williams' 28 | assert_equal 'bruce williams', result 29 | end 30 | 31 | it "grouped default keywords" do 32 | result = nil 33 | KeywordSearch.search(GROUPED_NAMES_AND_AGE) do |with| 34 | with.default_keyword :name 35 | with.keyword :name do |values| 36 | result = values 37 | end 38 | end 39 | assert_equal ['coda', 'bruce', 'hale', 'williams'], result 40 | end 41 | 42 | it "unquoted keyword term" do 43 | result = nil 44 | KeywordSearch.search(NAME_AND_AGE) do |with| 45 | with.keyword :age do |values| 46 | result = Integer(values.first) 47 | end 48 | end 49 | assert_equal 26, result 50 | end 51 | 52 | it "unquoted grouped keyword term" do 53 | result = nil 54 | KeywordSearch.search(NAME_AND_GROUPED_AGE) do |with| 55 | with.keyword :age do |values| 56 | result = Integer(values.first) 57 | end 58 | end 59 | assert_equal 27, result 60 | end 61 | 62 | it "quoted grouped keyword term" do 63 | result = nil 64 | KeywordSearch.search(NAME_AND_GROUPED_QUOTED_AGE) do |with| 65 | with.keyword :age do |values| 66 | result = Integer(values.first) 67 | end 68 | end 69 | assert_equal 27, result 70 | end 71 | 72 | it "mixed grouped keyword terms" do 73 | result = nil 74 | KeywordSearch.search(NAME_AND_GROUPED_QUOTED_AGES) do |with| 75 | with.keyword :age do |values| 76 | result = values.map { |v| v.to_i } 77 | end 78 | end 79 | assert_equal [27, 34, 48], result 80 | end 81 | 82 | it "quoted default keyword term" do 83 | result = nil 84 | KeywordSearch.search(NAME_QUOTED_AND_AGE) do |with| 85 | with.default_keyword :name 86 | with.keyword :name do |values| 87 | result = values.join(' ') 88 | end 89 | end 90 | assert_equal 'bruce williams', result 91 | end 92 | 93 | it "quoted keyword term" do 94 | result = nil 95 | KeywordSearch.search(NAME_AND_QUOTED_AGE) do |with| 96 | with.keyword :age do |values| 97 | result = Integer(values.first) 98 | end 99 | end 100 | assert_equal 26, result 101 | end 102 | 103 | it "quoted keyword term with whitespace" do 104 | result = nil 105 | KeywordSearch.search(DEFAULT_AGE_WITH_QUOTED_AGE) do |with| 106 | with.default_keyword :age 107 | with.keyword :name do |values| 108 | result = values.first 109 | end 110 | end 111 | assert_equal 'bruce williams', result 112 | end 113 | 114 | it "single quoted keyword term with whitespace" do 115 | result = nil 116 | r = KeywordSearch.search(DEFAULT_AGE_WITH_SINGLE_QUOTED_AGE) do |with| 117 | with.default_keyword :age 118 | with.keyword :name do |values| 119 | result = values.first 120 | end 121 | end 122 | assert_equal 'bruce williams', result 123 | end 124 | 125 | it "nested single quote is accumulated" do 126 | result = nil 127 | KeywordSearch.search(NAME_WITH_NESTED_SINGLE_QUOTES) do |with| 128 | with.default_keyword :name 129 | with.keyword :name do |values| 130 | result = values.first 131 | end 132 | end 133 | assert_equal %, result 134 | end 135 | 136 | it "nested double quote is accumulated" do 137 | result = nil 138 | KeywordSearch.search(%<'he was called "jake"'>) do |with| 139 | with.default_keyword :text 140 | with.keyword :text do |values| 141 | result = values.first 142 | end 143 | end 144 | assert_equal %, result 145 | end 146 | 147 | it "bare single quote in unquoted literal is accumulated" do 148 | result = nil 149 | KeywordSearch.search(%) do |with| 150 | with.default_keyword :text 151 | with.keyword :text do |values| 152 | result = values.first 153 | end 154 | end 155 | assert_equal %, result 156 | end 157 | 158 | it "single quoted literal is accumulated" do 159 | result = nil 160 | KeywordSearch.search(%) do |with| 161 | with.default_keyword :text 162 | with.keyword :text do |values| 163 | result = values.last 164 | end 165 | end 166 | assert_equal %, result 167 | end 168 | 169 | it "period in literal is accumulated" do 170 | result = nil 171 | KeywordSearch.search(%) do |with| 172 | with.default_keyword :text 173 | with.keyword :text do |values| 174 | result = values.first 175 | end 176 | end 177 | assert_equal %, result 178 | end 179 | 180 | it "parse error results in exception" do 181 | assert_raises(KeywordSearch::ParseError) do 182 | KeywordSearch.search(%) do |with| 183 | with.default_keyword :text 184 | with.keyword :text do |values| 185 | result = values.first 186 | end 187 | end 188 | end 189 | end 190 | 191 | it "can use apostrophes in unquoted literal" do 192 | result = nil 193 | KeywordSearch.search(%) do |with| 194 | with.default_keyword :text 195 | with.keyword :text do |values| 196 | result = values.first 197 | end 198 | end 199 | assert_equal "d'correct", result 200 | end 201 | 202 | it "can use apostrophes in unquoted literal values" do 203 | result = nil 204 | KeywordSearch.search(%) do |with| 205 | with.default_keyword :text 206 | with.keyword :text do |values| 207 | result = values.first 208 | end 209 | end 210 | assert_equal "d'correct", result 211 | end 212 | 213 | it "cannot use an apostrophe at the beginning on an unquoted literal" do 214 | assert_raises(KeywordSearch::ParseError) do 215 | KeywordSearch.search(%<'thisiswrong>) do |with| 216 | with.default_keyword :text 217 | with.keyword :text do |values| 218 | result = values.first 219 | end 220 | end 221 | end 222 | end 223 | 224 | it "keywords are case sensitive" do 225 | result = nil 226 | KeywordSearch.search(%) do |with| 227 | with.keyword :text do |values| 228 | result = :small 229 | end 230 | with.keyword :Text do |values| 231 | result = :big 232 | end 233 | end 234 | assert_equal :big, result 235 | end 236 | 237 | it "values are case sensitive" do 238 | result = nil 239 | KeywordSearch.search(%) do |with| 240 | with.keyword :text do |values| 241 | result = values.first 242 | end 243 | end 244 | assert_equal 'Big', result 245 | end 246 | 247 | it "spaces are condensed" do 248 | result = nil 249 | KeywordSearch.search(%< this is some text >) do |with| 250 | with.default_keyword :text 251 | with.keyword :text do |values| 252 | result = values 253 | end 254 | end 255 | assert_equal %w(this is some text), result 256 | end 257 | 258 | it "an empty search is successful" do 259 | result = nil 260 | KeywordSearch.search(%<>) do |with| 261 | with.default_keyword :text 262 | with.keyword :text do |values| 263 | result = values 264 | end 265 | end 266 | assert_nil result 267 | end 268 | 269 | it 'a negative search' do 270 | result = nil 271 | 272 | KeywordSearch.search(%<-site:google.com>) do |with| 273 | with.keyword :site do |values, positive| 274 | result = [ values, positive ] 275 | end 276 | end 277 | assert_equal [ [ 'google.com' ], false ], result 278 | end 279 | 280 | it 'a positive search' do 281 | result = nil 282 | 283 | KeywordSearch.search(%<+site:google.com>) do |with| 284 | with.keyword :site do |values, positive| 285 | result = [ values, positive ] 286 | end 287 | end 288 | assert_equal [ [ 'google.com' ], true ], result 289 | end 290 | 291 | it 'a search with no sign' do 292 | result = nil 293 | 294 | KeywordSearch.search(%) do |with| 295 | with.keyword :site do |values, positive| 296 | result = [ values, positive ] 297 | end 298 | end 299 | assert_equal [ [ 'google.com' ], true ], result 300 | end 301 | 302 | it 'a term should default to positive with no sign' do 303 | result = nil 304 | 305 | KeywordSearch.search(%<-site:google.com inurl:atom>) do |with| 306 | with.keyword :inurl do |values, positive| 307 | result = [ values, positive ] 308 | end 309 | end 310 | assert_equal [ %w(atom), true ], result 311 | end 312 | 313 | it 'a negative and positive search to the default keyword' do 314 | result = [] 315 | 316 | KeywordSearch.search(%) do |with| 317 | with.default_keyword :text 318 | with.keyword :text do |values, positive| 319 | result << [ values, positive ] 320 | end 321 | end 322 | assert_equal [ [ %w(text search), true ], [ %w(google.com), false ] ], result 323 | end 324 | 325 | it 'a negative search to the default keyword with quotes' do 326 | result = [] 327 | 328 | KeywordSearch.search(%<-google.com>) do |with| 329 | with.default_keyword :text 330 | with.keyword :text do |values, positive| 331 | result << [ values, positive ] 332 | end 333 | end 334 | assert_equal [ [ %w(google.com), false ] ], result 335 | end 336 | end 337 | --------------------------------------------------------------------------------