wukong 3.0.0.pre → 3.0.0.pre2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (476) hide show
  1. data/.gitignore +46 -33
  2. data/.gitmodules +3 -0
  3. data/.rspec +1 -1
  4. data/.travis.yml +8 -1
  5. data/.yardopts +0 -13
  6. data/Guardfile +4 -6
  7. data/{LICENSE.textile → LICENSE.md} +43 -55
  8. data/README-old.md +422 -0
  9. data/README.md +279 -418
  10. data/Rakefile +21 -5
  11. data/TODO.md +6 -6
  12. data/bin/wu-clean-encoding +31 -0
  13. data/bin/wu-lign +2 -2
  14. data/bin/wu-local +69 -0
  15. data/bin/wu-server +70 -0
  16. data/examples/Gemfile +38 -0
  17. data/examples/README.md +9 -0
  18. data/examples/dataflow/apache_log_line.rb +64 -25
  19. data/examples/dataflow/fibonacci_series.rb +101 -0
  20. data/examples/dataflow/parse_apache_logs.rb +37 -7
  21. data/examples/{dataflow.rb → dataflow/scraper_macro_flow.rb} +0 -0
  22. data/examples/dataflow/simple.rb +4 -4
  23. data/examples/geo.rb +4 -0
  24. data/examples/geo/geo_grids.numbers +0 -0
  25. data/examples/geo/geolocated.rb +331 -0
  26. data/examples/geo/quadtile.rb +69 -0
  27. data/examples/geo/spec/geolocated_spec.rb +247 -0
  28. data/examples/geo/tile_fetcher.rb +77 -0
  29. data/examples/graph/minimum_spanning_tree.rb +61 -61
  30. data/examples/jabberwocky.txt +36 -0
  31. data/examples/models/wikipedia.rb +20 -0
  32. data/examples/munging/Gemfile +8 -0
  33. data/examples/munging/airline_flights/airline.rb +57 -0
  34. data/examples/munging/airline_flights/airline_flights.rake +83 -0
  35. data/{lib/wukong/settings.rb → examples/munging/airline_flights/airplane.rb} +0 -0
  36. data/examples/munging/airline_flights/airport.rb +211 -0
  37. data/examples/munging/airline_flights/airport_id_unification.rb +129 -0
  38. data/examples/munging/airline_flights/airport_ok_chars.rb +4 -0
  39. data/examples/munging/airline_flights/flight.rb +156 -0
  40. data/examples/munging/airline_flights/models.rb +4 -0
  41. data/examples/munging/airline_flights/parse.rb +26 -0
  42. data/examples/munging/airline_flights/reconcile_airports.rb +142 -0
  43. data/examples/munging/airline_flights/route.rb +35 -0
  44. data/examples/munging/airline_flights/tasks.rake +83 -0
  45. data/examples/munging/airline_flights/timezone_fixup.rb +62 -0
  46. data/examples/munging/airline_flights/topcities.rb +167 -0
  47. data/examples/munging/airports/40_wbans.txt +40 -0
  48. data/examples/munging/airports/filter_weather_reports.rb +37 -0
  49. data/examples/munging/airports/join.pig +31 -0
  50. data/examples/munging/airports/to_tsv.rb +33 -0
  51. data/examples/munging/airports/usa_wbans.pig +19 -0
  52. data/examples/munging/airports/usa_wbans.txt +2157 -0
  53. data/examples/munging/airports/wbans.pig +19 -0
  54. data/examples/munging/airports/wbans.txt +2310 -0
  55. data/examples/munging/geo/geo_json.rb +54 -0
  56. data/examples/munging/geo/geo_models.rb +69 -0
  57. data/examples/munging/geo/geonames_models.rb +78 -0
  58. data/examples/munging/geo/iso_codes.rb +172 -0
  59. data/examples/munging/geo/reconcile_countries.rb +124 -0
  60. data/examples/munging/geo/tasks.rake +71 -0
  61. data/examples/munging/rake_helper.rb +62 -0
  62. data/examples/munging/weather/.gitignore +1 -0
  63. data/examples/munging/weather/Gemfile +4 -0
  64. data/examples/munging/weather/Rakefile +28 -0
  65. data/examples/munging/weather/extract_ish.rb +13 -0
  66. data/examples/munging/weather/models/weather.rb +119 -0
  67. data/examples/munging/weather/utils/noaa_downloader.rb +46 -0
  68. data/examples/munging/wikipedia/README.md +34 -0
  69. data/examples/munging/wikipedia/Rakefile +193 -0
  70. data/examples/munging/wikipedia/articles/extract_articles-parsed.rb +79 -0
  71. data/examples/munging/wikipedia/articles/extract_articles-templated.rb +136 -0
  72. data/examples/munging/wikipedia/articles/textualize_articles.rb +54 -0
  73. data/examples/munging/wikipedia/articles/verify_structure.rb +43 -0
  74. data/examples/munging/wikipedia/articles/wp2txt-LICENSE.txt +22 -0
  75. data/examples/munging/wikipedia/articles/wp2txt_article.rb +259 -0
  76. data/examples/munging/wikipedia/articles/wp2txt_utils.rb +452 -0
  77. data/examples/munging/wikipedia/dbpedia/dbpedia_common.rb +4 -0
  78. data/examples/munging/wikipedia/dbpedia/dbpedia_extract_geocoordinates.rb +78 -0
  79. data/examples/munging/wikipedia/dbpedia/extract_links.rb +193 -0
  80. data/examples/munging/wikipedia/dbpedia/sameas_extractor.rb +20 -0
  81. data/examples/munging/wikipedia/n1_subuniverse/n1_nodes.pig +18 -0
  82. data/examples/munging/wikipedia/page_metadata/extract_page_metadata.rb +21 -0
  83. data/examples/munging/wikipedia/page_metadata/extract_page_metadata.rb.old +27 -0
  84. data/examples/munging/wikipedia/pagelinks/augment_pagelinks.pig +29 -0
  85. data/examples/munging/wikipedia/pagelinks/extract_pagelinks.rb +14 -0
  86. data/examples/munging/wikipedia/pagelinks/extract_pagelinks.rb.old +25 -0
  87. data/examples/munging/wikipedia/pagelinks/undirect_pagelinks.pig +29 -0
  88. data/examples/munging/wikipedia/pageviews/augment_pageviews.pig +32 -0
  89. data/examples/munging/wikipedia/pageviews/extract_pageviews.rb +85 -0
  90. data/examples/munging/wikipedia/pig_style_guide.md +25 -0
  91. data/examples/munging/wikipedia/redirects/redirects_page_metadata.pig +19 -0
  92. data/examples/munging/wikipedia/subuniverse/sub_articles.pig +23 -0
  93. data/examples/munging/wikipedia/subuniverse/sub_page_metadata.pig +24 -0
  94. data/examples/munging/wikipedia/subuniverse/sub_pagelinks_from.pig +22 -0
  95. data/examples/munging/wikipedia/subuniverse/sub_pagelinks_into.pig +22 -0
  96. data/examples/munging/wikipedia/subuniverse/sub_pagelinks_within.pig +26 -0
  97. data/examples/munging/wikipedia/subuniverse/sub_pageviews.pig +29 -0
  98. data/examples/munging/wikipedia/subuniverse/sub_undirected_pagelinks_within.pig +24 -0
  99. data/examples/munging/wikipedia/utils/get_namespaces.rb +86 -0
  100. data/examples/munging/wikipedia/utils/munging_utils.rb +68 -0
  101. data/examples/munging/wikipedia/utils/namespaces.json +1 -0
  102. data/examples/rake_helper.rb +85 -0
  103. data/examples/server_logs/geo_ip_mapping/munge_geolite.rb +82 -0
  104. data/examples/server_logs/logline.rb +95 -0
  105. data/examples/server_logs/models.rb +66 -0
  106. data/examples/server_logs/page_counts.pig +48 -0
  107. data/examples/server_logs/server_logs-01-parse-script.rb +13 -0
  108. data/examples/server_logs/server_logs-02-histograms-full.rb +33 -0
  109. data/examples/server_logs/server_logs-02-histograms-mapper.rb +14 -0
  110. data/{old/examples/server_logs/breadcrumbs.rb → examples/server_logs/server_logs-03-breadcrumbs-full.rb} +26 -30
  111. data/examples/server_logs/server_logs-04-page_page_edges-full.rb +40 -0
  112. data/examples/string_reverser.rb +26 -0
  113. data/examples/text/pig_latin.rb +2 -2
  114. data/examples/text/regional_flavor/README.md +14 -0
  115. data/examples/text/regional_flavor/article_wordbags.pig +39 -0
  116. data/examples/text/regional_flavor/j01-article_wordbags.rb +4 -0
  117. data/examples/text/regional_flavor/simple_pig_script.pig +27 -0
  118. data/examples/word_count/accumulator.rb +26 -0
  119. data/examples/word_count/tokenizer.rb +13 -0
  120. data/examples/word_count/word_count.rb +6 -0
  121. data/examples/workflow/cherry_pie.dot +97 -0
  122. data/examples/workflow/cherry_pie.png +0 -0
  123. data/examples/workflow/cherry_pie.rb +61 -26
  124. data/lib/hanuman.rb +34 -7
  125. data/lib/hanuman/graph.rb +55 -31
  126. data/lib/hanuman/graphvizzer.rb +199 -178
  127. data/lib/hanuman/graphvizzer/gv_models.rb +161 -0
  128. data/lib/hanuman/graphvizzer/gv_presenter.rb +97 -0
  129. data/lib/hanuman/link.rb +35 -0
  130. data/lib/hanuman/registry.rb +46 -0
  131. data/lib/hanuman/stage.rb +76 -32
  132. data/lib/wukong.rb +23 -24
  133. data/lib/wukong/boot.rb +87 -0
  134. data/lib/wukong/configuration.rb +8 -0
  135. data/lib/wukong/dataflow.rb +45 -78
  136. data/lib/wukong/driver.rb +99 -0
  137. data/lib/wukong/emitter.rb +22 -0
  138. data/lib/wukong/model/faker.rb +24 -24
  139. data/lib/wukong/model/flatpack_parser/flat.rb +60 -0
  140. data/lib/wukong/model/flatpack_parser/flatpack.rb +4 -0
  141. data/lib/wukong/model/flatpack_parser/lang.rb +46 -0
  142. data/lib/wukong/model/flatpack_parser/parser.rb +55 -0
  143. data/lib/wukong/model/flatpack_parser/tokens.rb +130 -0
  144. data/lib/wukong/processor.rb +60 -114
  145. data/lib/wukong/spec_helpers.rb +81 -0
  146. data/lib/wukong/spec_helpers/integration_driver.rb +144 -0
  147. data/lib/wukong/spec_helpers/integration_driver_matchers.rb +219 -0
  148. data/lib/wukong/spec_helpers/processor_helpers.rb +95 -0
  149. data/lib/wukong/spec_helpers/processor_methods.rb +108 -0
  150. data/lib/wukong/spec_helpers/shared_examples.rb +15 -0
  151. data/lib/wukong/spec_helpers/spec_driver.rb +28 -0
  152. data/lib/wukong/spec_helpers/spec_driver_matchers.rb +195 -0
  153. data/lib/wukong/version.rb +2 -1
  154. data/lib/wukong/widget/filters.rb +311 -0
  155. data/lib/wukong/widget/processors.rb +156 -0
  156. data/lib/wukong/widget/reducers.rb +7 -0
  157. data/lib/wukong/widget/reducers/accumulator.rb +73 -0
  158. data/lib/wukong/widget/reducers/bin.rb +318 -0
  159. data/lib/wukong/widget/reducers/count.rb +61 -0
  160. data/lib/wukong/widget/reducers/group.rb +85 -0
  161. data/lib/wukong/widget/reducers/group_concat.rb +70 -0
  162. data/lib/wukong/widget/reducers/moments.rb +72 -0
  163. data/lib/wukong/widget/reducers/sort.rb +130 -0
  164. data/lib/wukong/widget/serializers.rb +287 -0
  165. data/lib/wukong/widget/sink.rb +10 -52
  166. data/lib/wukong/widget/source.rb +7 -113
  167. data/lib/wukong/widget/utils.rb +46 -0
  168. data/lib/wukong/widgets.rb +6 -0
  169. data/spec/examples/dataflow/fibonacci_series_spec.rb +18 -0
  170. data/spec/examples/dataflow/parsing_spec.rb +12 -11
  171. data/spec/examples/dataflow/simple_spec.rb +32 -6
  172. data/spec/examples/dataflow/telegram_spec.rb +36 -36
  173. data/spec/examples/graph/minimum_spanning_tree_spec.rb +30 -31
  174. data/spec/examples/munging/airline_flights/identifiers_spec.rb +16 -0
  175. data/spec/examples/munging/airline_flights_spec.rb +202 -0
  176. data/spec/examples/text/pig_latin_spec.rb +13 -16
  177. data/spec/examples/workflow/cherry_pie_spec.rb +34 -4
  178. data/spec/hanuman/graph_spec.rb +27 -2
  179. data/spec/hanuman/hanuman_spec.rb +10 -0
  180. data/spec/hanuman/registry_spec.rb +123 -0
  181. data/spec/hanuman/stage_spec.rb +61 -7
  182. data/spec/spec_helper.rb +29 -19
  183. data/spec/support/hanuman_test_helpers.rb +14 -12
  184. data/spec/support/shared_context_for_reducers.rb +37 -0
  185. data/spec/support/shared_examples_for_builders.rb +101 -0
  186. data/spec/support/shared_examples_for_shortcuts.rb +57 -0
  187. data/spec/support/wukong_test_helpers.rb +37 -11
  188. data/spec/wukong/dataflow_spec.rb +77 -55
  189. data/spec/wukong/local_runner_spec.rb +24 -24
  190. data/spec/wukong/model/faker_spec.rb +132 -131
  191. data/spec/wukong/runner_spec.rb +8 -8
  192. data/spec/wukong/widget/filters_spec.rb +61 -0
  193. data/spec/wukong/widget/processors_spec.rb +126 -0
  194. data/spec/wukong/widget/reducers/bin_spec.rb +92 -0
  195. data/spec/wukong/widget/reducers/count_spec.rb +11 -0
  196. data/spec/wukong/widget/reducers/group_spec.rb +20 -0
  197. data/spec/wukong/widget/reducers/moments_spec.rb +36 -0
  198. data/spec/wukong/widget/reducers/sort_spec.rb +26 -0
  199. data/spec/wukong/widget/serializers_spec.rb +92 -0
  200. data/spec/wukong/widget/sink_spec.rb +15 -15
  201. data/spec/wukong/widget/source_spec.rb +65 -41
  202. data/spec/wukong/wukong_spec.rb +10 -0
  203. data/wukong.gemspec +17 -10
  204. metadata +359 -335
  205. data/.document +0 -5
  206. data/VERSION +0 -1
  207. data/bin/hdp-bin +0 -44
  208. data/bin/hdp-bzip +0 -23
  209. data/bin/hdp-cat +0 -3
  210. data/bin/hdp-catd +0 -3
  211. data/bin/hdp-cp +0 -3
  212. data/bin/hdp-du +0 -86
  213. data/bin/hdp-get +0 -3
  214. data/bin/hdp-kill +0 -3
  215. data/bin/hdp-kill-task +0 -3
  216. data/bin/hdp-ls +0 -11
  217. data/bin/hdp-mkdir +0 -2
  218. data/bin/hdp-mkdirp +0 -12
  219. data/bin/hdp-mv +0 -3
  220. data/bin/hdp-parts_to_keys.rb +0 -77
  221. data/bin/hdp-ps +0 -3
  222. data/bin/hdp-put +0 -3
  223. data/bin/hdp-rm +0 -32
  224. data/bin/hdp-sort +0 -40
  225. data/bin/hdp-stream +0 -40
  226. data/bin/hdp-stream-flat +0 -22
  227. data/bin/hdp-stream2 +0 -39
  228. data/bin/hdp-sync +0 -17
  229. data/bin/hdp-wc +0 -67
  230. data/bin/wu-flow +0 -10
  231. data/bin/wu-map +0 -17
  232. data/bin/wu-red +0 -17
  233. data/bin/wukong +0 -17
  234. data/data/CREDITS.md +0 -355
  235. data/data/graph/airfares.tsv +0 -2174
  236. data/data/text/gift_of_the_magi.txt +0 -225
  237. data/data/text/jabberwocky.txt +0 -36
  238. data/data/text/rectification_of_names.txt +0 -33
  239. data/data/twitter/a_atsigns_b.tsv +0 -64
  240. data/data/twitter/a_follows_b.tsv +0 -53
  241. data/data/twitter/tweet.tsv +0 -167
  242. data/data/twitter/twitter_user.tsv +0 -55
  243. data/data/wikipedia/dbpedia-sentences.tsv +0 -1000
  244. data/docpages/INSTALL.textile +0 -92
  245. data/docpages/LICENSE.textile +0 -107
  246. data/docpages/README-elastic_map_reduce.textile +0 -377
  247. data/docpages/README-performance.textile +0 -90
  248. data/docpages/README-wulign.textile +0 -65
  249. data/docpages/UsingWukong-part1-get_ready.textile +0 -17
  250. data/docpages/UsingWukong-part2-ThinkingBigData.textile +0 -75
  251. data/docpages/UsingWukong-part3-parsing.textile +0 -138
  252. data/docpages/_config.yml +0 -39
  253. data/docpages/avro/avro_notes.textile +0 -56
  254. data/docpages/avro/performance.textile +0 -36
  255. data/docpages/avro/tethering.textile +0 -19
  256. data/docpages/bigdata-tips.textile +0 -143
  257. data/docpages/code/api_response_example.txt +0 -20
  258. data/docpages/code/parser_skeleton.rb +0 -38
  259. data/docpages/diagrams/MapReduceDiagram.graffle +0 -0
  260. data/docpages/favicon.ico +0 -0
  261. data/docpages/gem.css +0 -16
  262. data/docpages/hadoop-tips.textile +0 -83
  263. data/docpages/index.textile +0 -92
  264. data/docpages/intro.textile +0 -8
  265. data/docpages/moreinfo.textile +0 -174
  266. data/docpages/news.html +0 -24
  267. data/docpages/pig/PigLatinExpressionsList.txt +0 -122
  268. data/docpages/pig/PigLatinReferenceManual.txt +0 -1640
  269. data/docpages/pig/commandline_params.txt +0 -26
  270. data/docpages/pig/cookbook.html +0 -481
  271. data/docpages/pig/images/hadoop-logo.jpg +0 -0
  272. data/docpages/pig/images/instruction_arrow.png +0 -0
  273. data/docpages/pig/images/pig-logo.gif +0 -0
  274. data/docpages/pig/piglatin_ref1.html +0 -1103
  275. data/docpages/pig/piglatin_ref2.html +0 -14340
  276. data/docpages/pig/setup.html +0 -505
  277. data/docpages/pig/skin/basic.css +0 -166
  278. data/docpages/pig/skin/breadcrumbs.js +0 -237
  279. data/docpages/pig/skin/fontsize.js +0 -166
  280. data/docpages/pig/skin/getBlank.js +0 -40
  281. data/docpages/pig/skin/getMenu.js +0 -45
  282. data/docpages/pig/skin/images/chapter.gif +0 -0
  283. data/docpages/pig/skin/images/chapter_open.gif +0 -0
  284. data/docpages/pig/skin/images/current.gif +0 -0
  285. data/docpages/pig/skin/images/external-link.gif +0 -0
  286. data/docpages/pig/skin/images/header_white_line.gif +0 -0
  287. data/docpages/pig/skin/images/page.gif +0 -0
  288. data/docpages/pig/skin/images/pdfdoc.gif +0 -0
  289. data/docpages/pig/skin/images/rc-b-l-15-1body-2menu-3menu.png +0 -0
  290. data/docpages/pig/skin/images/rc-b-r-15-1body-2menu-3menu.png +0 -0
  291. data/docpages/pig/skin/images/rc-b-r-5-1header-2tab-selected-3tab-selected.png +0 -0
  292. data/docpages/pig/skin/images/rc-t-l-5-1header-2searchbox-3searchbox.png +0 -0
  293. data/docpages/pig/skin/images/rc-t-l-5-1header-2tab-selected-3tab-selected.png +0 -0
  294. data/docpages/pig/skin/images/rc-t-l-5-1header-2tab-unselected-3tab-unselected.png +0 -0
  295. data/docpages/pig/skin/images/rc-t-r-15-1body-2menu-3menu.png +0 -0
  296. data/docpages/pig/skin/images/rc-t-r-5-1header-2searchbox-3searchbox.png +0 -0
  297. data/docpages/pig/skin/images/rc-t-r-5-1header-2tab-selected-3tab-selected.png +0 -0
  298. data/docpages/pig/skin/images/rc-t-r-5-1header-2tab-unselected-3tab-unselected.png +0 -0
  299. data/docpages/pig/skin/print.css +0 -54
  300. data/docpages/pig/skin/profile.css +0 -181
  301. data/docpages/pig/skin/screen.css +0 -587
  302. data/docpages/pig/tutorial.html +0 -1059
  303. data/docpages/pig/udf.html +0 -1509
  304. data/docpages/tutorial.textile +0 -283
  305. data/docpages/usage.textile +0 -195
  306. data/docpages/wutils.textile +0 -263
  307. data/examples/dataflow/complex.rb +0 -11
  308. data/examples/dataflow/donuts.rb +0 -13
  309. data/examples/tiny_count/jabberwocky_output.tsv +0 -92
  310. data/examples/word_count.rb +0 -48
  311. data/examples/workflow/fiddle.rb +0 -24
  312. data/lib/away/escapement.rb +0 -129
  313. data/lib/away/exe.rb +0 -11
  314. data/lib/away/experimental.rb +0 -5
  315. data/lib/away/from_file.rb +0 -52
  316. data/lib/away/job.rb +0 -56
  317. data/lib/away/job/rake_compat.rb +0 -17
  318. data/lib/away/registry.rb +0 -79
  319. data/lib/away/runner.rb +0 -276
  320. data/lib/away/runner/execute.rb +0 -121
  321. data/lib/away/script.rb +0 -161
  322. data/lib/away/script/hadoop_command.rb +0 -240
  323. data/lib/away/source/file_list_source.rb +0 -15
  324. data/lib/away/source/looper.rb +0 -18
  325. data/lib/away/task.rb +0 -219
  326. data/lib/hanuman/action.rb +0 -21
  327. data/lib/hanuman/chain.rb +0 -4
  328. data/lib/hanuman/graphviz.rb +0 -74
  329. data/lib/hanuman/resource.rb +0 -6
  330. data/lib/hanuman/slot.rb +0 -87
  331. data/lib/hanuman/slottable.rb +0 -220
  332. data/lib/wukong/bad_record.rb +0 -15
  333. data/lib/wukong/event.rb +0 -44
  334. data/lib/wukong/local_runner.rb +0 -55
  335. data/lib/wukong/mapred.rb +0 -3
  336. data/lib/wukong/universe.rb +0 -48
  337. data/lib/wukong/widget/filter.rb +0 -81
  338. data/lib/wukong/widget/gibberish.rb +0 -123
  339. data/lib/wukong/widget/monitor.rb +0 -26
  340. data/lib/wukong/widget/reducer.rb +0 -66
  341. data/lib/wukong/widget/stringifier.rb +0 -50
  342. data/lib/wukong/workflow.rb +0 -22
  343. data/lib/wukong/workflow/command.rb +0 -42
  344. data/old/config/emr-example.yaml +0 -48
  345. data/old/examples/README.txt +0 -17
  346. data/old/examples/contrib/jeans/README.markdown +0 -165
  347. data/old/examples/contrib/jeans/data/normalized_sizes +0 -3
  348. data/old/examples/contrib/jeans/data/orders.tsv +0 -1302
  349. data/old/examples/contrib/jeans/data/sizes +0 -3
  350. data/old/examples/contrib/jeans/normalize.rb +0 -20
  351. data/old/examples/contrib/jeans/sizes.rb +0 -55
  352. data/old/examples/corpus/bnc_word_freq.rb +0 -44
  353. data/old/examples/corpus/bucket_counter.rb +0 -47
  354. data/old/examples/corpus/dbpedia_abstract_to_sentences.rb +0 -86
  355. data/old/examples/corpus/sentence_bigrams.rb +0 -53
  356. data/old/examples/corpus/sentence_coocurrence.rb +0 -66
  357. data/old/examples/corpus/stopwords.rb +0 -138
  358. data/old/examples/corpus/words_to_bigrams.rb +0 -53
  359. data/old/examples/emr/README.textile +0 -110
  360. data/old/examples/emr/dot_wukong_dir/credentials.json +0 -7
  361. data/old/examples/emr/dot_wukong_dir/emr.yaml +0 -69
  362. data/old/examples/emr/dot_wukong_dir/emr_bootstrap.sh +0 -33
  363. data/old/examples/emr/elastic_mapreduce_example.rb +0 -28
  364. data/old/examples/network_graph/adjacency_list.rb +0 -74
  365. data/old/examples/network_graph/breadth_first_search.rb +0 -72
  366. data/old/examples/network_graph/gen_2paths.rb +0 -68
  367. data/old/examples/network_graph/gen_multi_edge.rb +0 -112
  368. data/old/examples/network_graph/gen_symmetric_links.rb +0 -64
  369. data/old/examples/pagerank/README.textile +0 -6
  370. data/old/examples/pagerank/gen_initial_pagerank_graph.pig +0 -57
  371. data/old/examples/pagerank/pagerank.rb +0 -72
  372. data/old/examples/pagerank/pagerank_initialize.rb +0 -42
  373. data/old/examples/pagerank/run_pagerank.sh +0 -21
  374. data/old/examples/sample_records.rb +0 -33
  375. data/old/examples/server_logs/apache_log_parser.rb +0 -15
  376. data/old/examples/server_logs/nook.rb +0 -48
  377. data/old/examples/server_logs/nook/faraday_dummy_adapter.rb +0 -94
  378. data/old/examples/server_logs/user_agent.rb +0 -40
  379. data/old/examples/simple_word_count.rb +0 -82
  380. data/old/examples/size.rb +0 -61
  381. data/old/examples/stats/avg_value_frequency.rb +0 -86
  382. data/old/examples/stats/binning_percentile_estimator.rb +0 -140
  383. data/old/examples/stats/data/avg_value_frequency.tsv +0 -3
  384. data/old/examples/stats/rank_and_bin.rb +0 -173
  385. data/old/examples/stupidly_simple_filter.rb +0 -40
  386. data/old/examples/word_count.rb +0 -75
  387. data/old/graph/graphviz_builder.rb +0 -580
  388. data/old/graph_easy/Attributes.pm +0 -4181
  389. data/old/graph_easy/Graphviz.pm +0 -2232
  390. data/old/wukong.rb +0 -18
  391. data/old/wukong/and_pig.rb +0 -38
  392. data/old/wukong/bad_record.rb +0 -18
  393. data/old/wukong/datatypes.rb +0 -24
  394. data/old/wukong/datatypes/enum.rb +0 -127
  395. data/old/wukong/datatypes/fake_types.rb +0 -17
  396. data/old/wukong/decorator.rb +0 -28
  397. data/old/wukong/encoding/asciize.rb +0 -108
  398. data/old/wukong/extensions.rb +0 -16
  399. data/old/wukong/extensions/array.rb +0 -18
  400. data/old/wukong/extensions/blank.rb +0 -93
  401. data/old/wukong/extensions/class.rb +0 -189
  402. data/old/wukong/extensions/date_time.rb +0 -53
  403. data/old/wukong/extensions/emittable.rb +0 -69
  404. data/old/wukong/extensions/enumerable.rb +0 -79
  405. data/old/wukong/extensions/hash.rb +0 -167
  406. data/old/wukong/extensions/hash_keys.rb +0 -16
  407. data/old/wukong/extensions/hash_like.rb +0 -150
  408. data/old/wukong/extensions/hashlike_class.rb +0 -47
  409. data/old/wukong/extensions/module.rb +0 -2
  410. data/old/wukong/extensions/pathname.rb +0 -27
  411. data/old/wukong/extensions/string.rb +0 -65
  412. data/old/wukong/extensions/struct.rb +0 -17
  413. data/old/wukong/extensions/symbol.rb +0 -11
  414. data/old/wukong/filename_pattern.rb +0 -74
  415. data/old/wukong/helper.rb +0 -7
  416. data/old/wukong/helper/stopwords.rb +0 -195
  417. data/old/wukong/helper/tokenize.rb +0 -35
  418. data/old/wukong/logger.rb +0 -38
  419. data/old/wukong/periodic_monitor.rb +0 -72
  420. data/old/wukong/schema.rb +0 -269
  421. data/old/wukong/script.rb +0 -286
  422. data/old/wukong/script/avro_command.rb +0 -5
  423. data/old/wukong/script/cassandra_loader_script.rb +0 -40
  424. data/old/wukong/script/emr_command.rb +0 -168
  425. data/old/wukong/script/hadoop_command.rb +0 -237
  426. data/old/wukong/script/local_command.rb +0 -41
  427. data/old/wukong/store.rb +0 -10
  428. data/old/wukong/store/base.rb +0 -27
  429. data/old/wukong/store/cassandra.rb +0 -10
  430. data/old/wukong/store/cassandra/streaming.rb +0 -75
  431. data/old/wukong/store/cassandra/struct_loader.rb +0 -21
  432. data/old/wukong/store/cassandra_model.rb +0 -91
  433. data/old/wukong/store/chh_chunked_flat_file_store.rb +0 -37
  434. data/old/wukong/store/chunked_flat_file_store.rb +0 -48
  435. data/old/wukong/store/conditional_store.rb +0 -57
  436. data/old/wukong/store/factory.rb +0 -8
  437. data/old/wukong/store/flat_file_store.rb +0 -89
  438. data/old/wukong/store/key_store.rb +0 -51
  439. data/old/wukong/store/null_store.rb +0 -15
  440. data/old/wukong/store/read_thru_store.rb +0 -22
  441. data/old/wukong/store/tokyo_tdb_key_store.rb +0 -33
  442. data/old/wukong/store/tyrant_rdb_key_store.rb +0 -57
  443. data/old/wukong/store/tyrant_tdb_key_store.rb +0 -20
  444. data/old/wukong/streamer.rb +0 -30
  445. data/old/wukong/streamer/accumulating_reducer.rb +0 -83
  446. data/old/wukong/streamer/base.rb +0 -126
  447. data/old/wukong/streamer/counting_reducer.rb +0 -25
  448. data/old/wukong/streamer/filter.rb +0 -20
  449. data/old/wukong/streamer/instance_streamer.rb +0 -15
  450. data/old/wukong/streamer/json_streamer.rb +0 -21
  451. data/old/wukong/streamer/line_streamer.rb +0 -12
  452. data/old/wukong/streamer/list_reducer.rb +0 -31
  453. data/old/wukong/streamer/rank_and_bin_reducer.rb +0 -145
  454. data/old/wukong/streamer/record_streamer.rb +0 -14
  455. data/old/wukong/streamer/reducer.rb +0 -11
  456. data/old/wukong/streamer/set_reducer.rb +0 -14
  457. data/old/wukong/streamer/struct_streamer.rb +0 -48
  458. data/old/wukong/streamer/summing_reducer.rb +0 -29
  459. data/old/wukong/streamer/uniq_by_last_reducer.rb +0 -51
  460. data/old/wukong/typed_struct.rb +0 -12
  461. data/spec/away/encoding_spec.rb +0 -32
  462. data/spec/away/exe_spec.rb +0 -20
  463. data/spec/away/flow_spec.rb +0 -82
  464. data/spec/away/graph_spec.rb +0 -6
  465. data/spec/away/job_spec.rb +0 -15
  466. data/spec/away/rake_compat_spec.rb +0 -9
  467. data/spec/away/script_spec.rb +0 -81
  468. data/spec/hanuman/graphviz_spec.rb +0 -29
  469. data/spec/hanuman/slot_spec.rb +0 -2
  470. data/spec/support/examples_helper.rb +0 -10
  471. data/spec/support/streamer_test_helpers.rb +0 -6
  472. data/spec/support/wukong_widget_helpers.rb +0 -66
  473. data/spec/wukong/processor_spec.rb +0 -109
  474. data/spec/wukong/widget/filter_spec.rb +0 -99
  475. data/spec/wukong/widget/stringifier_spec.rb +0 -51
  476. data/spec/wukong/workflow/command_spec.rb +0 -5
@@ -0,0 +1,62 @@
1
+ require 'date'
2
+ require 'gorillib/hash/zip'
3
+
4
+ class Airport
5
+
6
+ class TimezoneFixup
7
+
8
+ YEARS = (2010 .. 2012).to_a
9
+
10
+ DST_RULES = {
11
+ 'E' => { name: 'European', beg_doy: 'last Sunday in March', end_doy: 'last Sunday in October', beg_dates: {}, end_dates: {}, used_in: 'all European countries (except Iceland), as well as Greenland, Lebanon, Russia and Tunisia. Jordan and Syria are almost the same, starting and ending on Friday instead of Sunday. European DST is also used to (crudely) approximate Iranian DST, although they actually use an entirely different calendar.', },
12
+ 'A' => { name: 'US/Canada', beg_doy: '2nd Sunday in March', end_doy: '1st Sunday in November', beg_dates: {}, end_dates: {}, used_in: 'the United States (except Arizona, Hawaii and island territories) and Canada (with convoluted exceptions).', },
13
+ 'S' => { name: 'South American', beg_doy: '3rd Sunday in March', end_doy: '3rd Sunday in October', southern: true, beg_dates: {}, end_dates: {}, used_in: 'With some variance in the exact dates, in Argentina, Chile, Mexico, Paraguay, Uruguay as well as the African states of Namibia and Mauritius.', },
14
+ 'O' => { name: 'Australia', beg_doy: '1st Sunday in April', end_doy: '1st Sunday in October', southern: true, beg_dates: {}, end_dates: {}, used_in: 'Australia, except for Queensland and the Northern Territory.' },
15
+ 'Z' => { name: 'New Zealand', beg_doy: '1st Sunday in April', end_doy: 'last Sunday in September', southern: true, beg_dates: {}, end_dates: {}, used_in: 'New Zealand', },
16
+ 'N' => { name: 'None', beg_doy: nil, end_doy: nil, beg_dates: {}, end_dates: {}, used_in: 'DST not observed.', },
17
+ 'U' => { name: 'Unknown', beg_doy: nil, end_doy: nil, beg_dates: {}, end_dates: {}, used_in: 'DST status not known. The same as "None".', },
18
+ }
19
+
20
+ DST_RULES['E'][:beg_dates] = { 1987 => "1987-03-29", 1988 => "1988-03-27", 1989 => "1989-03-26", 1990 => "1990-03-25", 1991 => "1991-03-31", 1992 => "1992-03-29", 1993 => "1993-03-28", 1994 => "1994-03-27", 1995 => "1995-03-26", 1996 => "1996-03-31", 1997 => "1997-03-30", 1998 => "1998-03-29", 1999 => "1999-03-28", 2000 => "2000-03-26", 2001 => "2001-03-25", 2002 => "2002-03-31", 2003 => "2003-03-30", 2004 => "2004-03-28", 2005 => "2005-03-27", 2006 => "2006-03-26", 2007 => "2007-03-25", 2008 => "2008-03-30", 2009 => "2009-03-29", 2010 => "2010-03-28", 2011 => "2011-03-27", 2012 => "2012-03-25", 2013 => "2013-03-31", 2014 => "2014-03-30", 2015 => "2015-03-29", 2016 => "2016-03-27", 2017 => "2017-03-26", 2018 => "2018-03-25", 2019 => "2019-03-31", 2020 => "2020-03-29", }.tap{|hsh| hsh.each{|year,date_str| hsh[year] = Date.parse(date_str) } }
21
+ DST_RULES['E'][:end_dates] = { 1987 => "1987-10-25", 1988 => "1988-10-30", 1989 => "1989-10-29", 1990 => "1990-10-28", 1991 => "1991-10-27", 1992 => "1992-10-25", 1993 => "1993-10-31", 1994 => "1994-10-30", 1995 => "1995-10-29", 1996 => "1996-10-27", 1997 => "1997-10-26", 1998 => "1998-10-25", 1999 => "1999-10-31", 2000 => "2000-10-29", 2001 => "2001-10-28", 2002 => "2002-10-27", 2003 => "2003-10-26", 2004 => "2004-10-31", 2005 => "2005-10-30", 2006 => "2006-10-29", 2007 => "2007-10-28", 2008 => "2008-10-26", 2009 => "2009-10-25", 2010 => "2010-10-31", 2011 => "2011-10-30", 2012 => "2012-10-28", 2013 => "2013-10-27", 2014 => "2014-10-26", 2015 => "2015-10-25", 2016 => "2016-10-30", 2017 => "2017-10-29", 2018 => "2018-10-28", 2019 => "2019-10-27", 2020 => "2020-10-25", }.tap{|hsh| hsh.each{|year,date_str| hsh[year] = Date.parse(date_str) } }
22
+ DST_RULES['A'][:beg_dates] = { 1987 => "1987-03-08", 1988 => "1988-03-13", 1989 => "1989-03-12", 1990 => "1990-03-11", 1991 => "1991-03-10", 1992 => "1992-03-08", 1993 => "1993-03-14", 1994 => "1994-03-13", 1995 => "1995-03-12", 1996 => "1996-03-10", 1997 => "1997-03-09", 1998 => "1998-03-08", 1999 => "1999-03-14", 2000 => "2000-03-12", 2001 => "2001-03-11", 2002 => "2002-03-10", 2003 => "2003-03-09", 2004 => "2004-03-14", 2005 => "2005-03-13", 2006 => "2006-03-12", 2007 => "2007-03-11", 2008 => "2008-03-09", 2009 => "2009-03-08", 2010 => "2010-03-14", 2011 => "2011-03-13", 2012 => "2012-03-11", 2013 => "2013-03-10", 2014 => "2014-03-09", 2015 => "2015-03-08", 2016 => "2016-03-13", 2017 => "2017-03-12", 2018 => "2018-03-11", 2019 => "2019-03-10", 2020 => "2020-03-08", }.tap{|hsh| hsh.each{|year,date_str| hsh[year] = Date.parse(date_str) } }
23
+ DST_RULES['A'][:end_dates] = { 1987 => "1987-11-01", 1988 => "1988-11-06", 1989 => "1989-11-05", 1990 => "1990-11-04", 1991 => "1991-11-03", 1992 => "1992-11-01", 1993 => "1993-11-07", 1994 => "1994-11-06", 1995 => "1995-11-05", 1996 => "1996-11-03", 1997 => "1997-11-02", 1998 => "1998-11-01", 1999 => "1999-11-07", 2000 => "2000-11-05", 2001 => "2001-11-04", 2002 => "2002-11-03", 2003 => "2003-11-02", 2004 => "2004-11-07", 2005 => "2005-11-06", 2006 => "2006-11-05", 2007 => "2007-11-04", 2008 => "2008-11-02", 2009 => "2009-11-01", 2010 => "2010-11-07", 2011 => "2011-11-06", 2012 => "2012-11-04", 2013 => "2013-11-03", 2014 => "2014-11-02", 2015 => "2015-11-01", 2016 => "2016-11-06", 2017 => "2017-11-05", 2018 => "2018-11-04", 2019 => "2019-11-03", 2020 => "2020-11-01", }.tap{|hsh| hsh.each{|year,date_str| hsh[year] = Date.parse(date_str) } }
24
+ DST_RULES['S'][:beg_dates] = { 1987 => "1987-10-18", 1988 => "1988-10-16", 1989 => "1989-10-15", 1990 => "1990-10-21", 1991 => "1991-10-20", 1992 => "1992-10-18", 1993 => "1993-10-17", 1994 => "1994-10-16", 1995 => "1995-10-15", 1996 => "1996-10-20", 1997 => "1997-10-19", 1998 => "1998-10-18", 1999 => "1999-10-17", 2000 => "2000-10-15", 2001 => "2001-10-21", 2002 => "2002-10-20", 2003 => "2003-10-19", 2004 => "2004-10-17", 2005 => "2005-10-16", 2006 => "2006-10-15", 2007 => "2007-10-21", 2008 => "2008-10-19", 2009 => "2009-10-18", 2010 => "2010-10-17", 2011 => "2011-10-16", 2012 => "2012-10-21", 2013 => "2013-10-20", 2014 => "2014-10-19", 2015 => "2015-10-18", 2016 => "2016-10-16", 2017 => "2017-10-15", 2018 => "2018-10-21", 2019 => "2019-10-20", 2020 => "2020-10-18", }.tap{|hsh| hsh.each{|year,date_str| hsh[year] = Date.parse(date_str) } }
25
+ DST_RULES['S'][:end_dates] = { 1987 => "1987-03-15", 1988 => "1988-03-20", 1989 => "1989-03-19", 1990 => "1990-03-18", 1991 => "1991-03-17", 1992 => "1992-03-15", 1993 => "1993-03-21", 1994 => "1994-03-20", 1995 => "1995-03-19", 1996 => "1996-03-17", 1997 => "1997-03-16", 1998 => "1998-03-15", 1999 => "1999-03-21", 2000 => "2000-03-19", 2001 => "2001-03-18", 2002 => "2002-03-17", 2003 => "2003-03-16", 2004 => "2004-03-21", 2005 => "2005-03-20", 2006 => "2006-03-19", 2007 => "2007-03-18", 2008 => "2008-03-16", 2009 => "2009-03-15", 2010 => "2010-03-21", 2011 => "2011-03-20", 2012 => "2012-03-18", 2013 => "2013-03-17", 2014 => "2014-03-16", 2015 => "2015-03-15", 2016 => "2016-03-20", 2017 => "2017-03-19", 2018 => "2018-03-18", 2019 => "2019-03-17", 2020 => "2020-03-15", }.tap{|hsh| hsh.each{|year,date_str| hsh[year] = Date.parse(date_str) } }
26
+ DST_RULES['O'][:beg_dates] = { 1987 => "1987-10-04", 1988 => "1988-10-02", 1989 => "1989-10-01", 1990 => "1990-10-07", 1991 => "1991-10-06", 1992 => "1992-10-04", 1993 => "1993-10-03", 1994 => "1994-10-02", 1995 => "1995-10-01", 1996 => "1996-10-06", 1997 => "1997-10-05", 1998 => "1998-10-04", 1999 => "1999-10-03", 2000 => "2000-10-01", 2001 => "2001-10-07", 2002 => "2002-10-06", 2003 => "2003-10-05", 2004 => "2004-10-03", 2005 => "2005-10-02", 2006 => "2006-10-01", 2007 => "2007-10-07", 2008 => "2008-10-05", 2009 => "2009-10-04", 2010 => "2010-10-03", 2011 => "2011-10-02", 2012 => "2012-10-07", 2013 => "2013-10-06", 2014 => "2014-10-05", 2015 => "2015-10-04", 2016 => "2016-10-02", 2017 => "2017-10-01", 2018 => "2018-10-07", 2019 => "2019-10-06", 2020 => "2020-10-04", }.tap{|hsh| hsh.each{|year,date_str| hsh[year] = Date.parse(date_str) } }
27
+ DST_RULES['O'][:end_dates] = { 1987 => "1987-04-05", 1988 => "1988-04-03", 1989 => "1989-04-02", 1990 => "1990-04-01", 1991 => "1991-04-07", 1992 => "1992-04-05", 1993 => "1993-04-04", 1994 => "1994-04-03", 1995 => "1995-04-02", 1996 => "1996-04-07", 1997 => "1997-04-06", 1998 => "1998-04-05", 1999 => "1999-04-04", 2000 => "2000-04-02", 2001 => "2001-04-01", 2002 => "2002-04-07", 2003 => "2003-04-06", 2004 => "2004-04-04", 2005 => "2005-04-03", 2006 => "2006-04-02", 2007 => "2007-04-01", 2008 => "2008-04-06", 2009 => "2009-04-05", 2010 => "2010-04-04", 2011 => "2011-04-03", 2012 => "2012-04-01", 2013 => "2013-04-07", 2014 => "2014-04-06", 2015 => "2015-04-05", 2016 => "2016-04-03", 2017 => "2017-04-02", 2018 => "2018-04-01", 2019 => "2019-04-07", 2020 => "2020-04-05", }.tap{|hsh| hsh.each{|year,date_str| hsh[year] = Date.parse(date_str) } }
28
+ DST_RULES['Z'][:beg_dates] = { 1987 => "1987-09-27", 1988 => "1988-09-25", 1989 => "1989-09-24", 1990 => "1990-09-30", 1991 => "1991-09-29", 1992 => "1992-09-27", 1993 => "1993-09-26", 1994 => "1994-09-25", 1995 => "1995-09-24", 1996 => "1996-09-29", 1997 => "1997-09-28", 1998 => "1998-09-27", 1999 => "1999-09-26", 2000 => "2000-09-24", 2001 => "2001-09-30", 2002 => "2002-09-29", 2003 => "2003-09-28", 2004 => "2004-09-26", 2005 => "2005-09-25", 2006 => "2006-09-24", 2007 => "2007-09-30", 2008 => "2008-09-28", 2009 => "2009-09-27", 2010 => "2010-09-26", 2011 => "2011-09-25", 2012 => "2012-09-30", 2013 => "2013-09-29", 2014 => "2014-09-28", 2015 => "2015-09-27", 2016 => "2016-09-25", 2017 => "2017-09-24", 2018 => "2018-09-30", 2019 => "2019-09-29", 2020 => "2020-09-27", }.tap{|hsh| hsh.each{|year,date_str| hsh[year] = Date.parse(date_str) } }
29
+ DST_RULES['Z'][:end_dates] = { 1987 => "1987-04-05", 1988 => "1988-04-03", 1989 => "1989-04-02", 1990 => "1990-04-01", 1991 => "1991-04-07", 1992 => "1992-04-05", 1993 => "1993-04-04", 1994 => "1994-04-03", 1995 => "1995-04-02", 1996 => "1996-04-07", 1997 => "1997-04-06", 1998 => "1998-04-05", 1999 => "1999-04-04", 2000 => "2000-04-02", 2001 => "2001-04-01", 2002 => "2002-04-07", 2003 => "2003-04-06", 2004 => "2004-04-04", 2005 => "2005-04-03", 2006 => "2006-04-02", 2007 => "2007-04-01", 2008 => "2008-04-06", 2009 => "2009-04-05", 2010 => "2010-04-04", 2011 => "2011-04-03", 2012 => "2012-04-01", 2013 => "2013-04-07", 2014 => "2014-04-06", 2015 => "2015-04-05", 2016 => "2016-04-03", 2017 => "2017-04-02", 2018 => "2018-04-01", 2019 => "2019-04-07", 2020 => "2020-04-05", }.tap{|hsh| hsh.each{|year,date_str| hsh[year] = Date.parse(date_str) } }
30
+
31
+ def self.parse_boundary(str, *args)
32
+ require 'chronic'
33
+ rank, weekday, art, month = str.split(/\s+/)
34
+ if rank == 'last'
35
+ val = ['5th', '4th'].map{|wk| Chronic.parse([wk, weekday, art, month].join(' '), *args) }.compact.first
36
+ else
37
+ val = Chronic.parse(str, *args)
38
+ end
39
+ Date.new(val.year, val.month, val.day)
40
+ end
41
+
42
+ def self.beg_date(rule, year)
43
+ DST_RULES[rule][:beg_dates][year] ||= parse_boundary(DST_RULES[rule][:beg_doy], now: Time.utc(year, 1, 1))
44
+ end
45
+ def self.end_date(rule, year)
46
+ DST_RULES[rule][:end_dates][year] ||= parse_boundary(DST_RULES[rule][:end_doy], now: Time.utc(year, 1, 1))
47
+ end
48
+
49
+ def self.table
50
+ %w[E A S O Z].each{|rule| YEARS.each{|year| beg_date(rule, year) ; end_date(rule, year) } }
51
+ DST_RULES
52
+ end
53
+
54
+ def self.dst?(rule, val)
55
+ early = beg_date(rule, val.year)
56
+ late = end_date(rule, val.year)
57
+ in_range = (val >= early) && (val < late)
58
+ DST_RULES[rule][:southern] ? (not in_range) : in_range
59
+ end
60
+
61
+ end
62
+ end
@@ -0,0 +1,167 @@
1
+ #!/usr/bin/env ruby
2
+ require('rake')
3
+ require_relative('../../rake_helper')
4
+ require_relative './models'
5
+
6
+ Pathname.register_paths(
7
+ af_data: [:data, 'airline_flights'],
8
+ af_work: [:work, 'airline_flights'],
9
+ af_code: File.dirname(__FILE__),
10
+ airport_identifiers: [:af_work, "airport_identifiers.tsv" ],
11
+ )
12
+
13
+ AIRPORTS_TO_MATCH = [
14
+ [ 'Tokyo', 1, "HND", ],
15
+ [ 'Guangzhou', 2, "CAN", ],
16
+ [ 'Seoul', 3, "ICN", ],
17
+ [ 'Shanghai', 4, "PVG", ],
18
+ [ 'Mexico.*City', 5, "MEX", ],
19
+ [ 'Delhi', 6, "DEL", ],
20
+ [ 'New.*York', 7, "JFK", ],
21
+ [ 'S.*o.*Paulo', 8, "GRU", ],
22
+ [ 'Mumbai|Bombay', 9, "BOM", ],
23
+ [ 'Manila', 10, "MNL", ],
24
+ [ 'Jakarta', 11, "CGK", ],
25
+ [ 'Los.*Angeles', 12, "LAX", ],
26
+ [ 'Karachi', 13, "KHI", ],
27
+ [ 'Osaka', 14, "KIX", ],
28
+ [ 'Beijing', 15, "PEK", ],
29
+ [ 'Moscow', 16, "SVO", ],
30
+ [ 'Cairo', 17, "CAI", ],
31
+ [ 'Kolkata|Calcutta', 18, "CCU", ],
32
+ [ 'Buenos.*Aires', 19, "EZE", ],
33
+ [ 'Dhaka', 20, "DAC", ],
34
+ [ 'Bangkok', 21, "BKK", ],
35
+ [ 'Tehran|Abyek', 22, "IKA", ],
36
+ [ 'Istanbul', 23, "IST", ],
37
+ [ 'Janeiro', 24, "GIG", ],
38
+ [ 'London', 25, "LHR", ],
39
+ [ 'Lagos', 26, "LOS", ],
40
+ [ 'Paris', 27, "CDG", ],
41
+ [ 'Chicago', 28, "ORD", ],
42
+ [ 'Kinshasa', 29, "FIH", ],
43
+ [ 'Lima', 30, "LIM", ],
44
+ [ 'Wuhan', 31, "WUH", ],
45
+ [ 'Bangalore', 32, "BLR", ],
46
+ [ 'Bogot.*', 33, "BOG", ],
47
+ [ 'Taipei', 34, "TSA", ],
48
+ [ 'Washington|Arling', 35, "DCA", ],
49
+ [ 'Johannesburg', 36, "JNB", ],
50
+ [ 'Saigon|Ho.Chi.M', 37, "SGN", ],
51
+ [ 'San.*Francisco', 38, "SFO", ],
52
+ [ 'Boston', 39, "BOS", ],
53
+ [ 'Hong.*Kong', 40, "HKG", ],
54
+ [ 'Baghdad', 41, "SDA", ],
55
+ [ 'Madrid', 42, "MAD", ],
56
+ [ 'Singapore', 43, "SIN", ],
57
+ [ 'Kuala.*Lumpur', 44, "KUL", ],
58
+ [ 'Chongqing|Chung.*', 45, "CKG", ],
59
+ [ 'Santiago', 46, "SCL", ],
60
+ [ 'Toronto', 47, "YYZ", ],
61
+ [ 'Riyadh', 48, "RUH", ],
62
+ [ 'Atlanta', 49, "ATL", ],
63
+ [ 'Miami', 50, "MIA", ],
64
+ [ 'Detroit', 51, "DTW", ],
65
+ [ 'St..*Petersburg', 52, "LED", ],
66
+ [ 'Khartoum', 53, "KRT", ],
67
+ [ 'Sydney', 54, "SYD", ],
68
+ [ 'Milan', 55, "MXP", ],
69
+ [ 'Abidjan', 56, "ABJ", ],
70
+ [ 'Barcelona', 57, "BCN", ],
71
+ [ 'Nairobi', 58, "NBO", ],
72
+ [ 'Caracas', 59, "CCS", ],
73
+ [ 'Monterrey', 60, "MTY", ],
74
+ [ 'Phoenix', 61, "PHX", ],
75
+ [ 'Berlin', 62, "TXL", ],
76
+ [ 'Melbourne', 63, "MEL", ],
77
+ [ 'Casablanca', 64, "CMN", ],
78
+ [ 'Montreal', 65, "YUL", ],
79
+ [ 'Salvador', 66, "SSA", ],
80
+ [ 'Rome', 67, "FCO", ],
81
+ [ 'Kiev', 68, "KBP", ],
82
+ [ 'Ad+is.*Ab.ba', 69, "ADD", ],
83
+ [ 'Denver', 70, "DEN", ],
84
+ [ 'St.*Louis', 71, "STL", ],
85
+ [ 'Dakar', 72, "DKR", ],
86
+ [ 'San.*Juan', 73, "SJU", ],
87
+ [ 'Vancouver', 74, "YVR", ],
88
+ [ 'Tel.*Aviv', 75, "TLV", ],
89
+ [ 'Tunis', 76, "TUN", ],
90
+ [ 'Portland', 77, "PDX", ],
91
+ [ 'Manaus', 78, "MAO", ],
92
+ [ 'Calgary', 79, "YYC", ],
93
+ [ 'Halifax', 80, "YHZ", ],
94
+ [ 'Prague', 81, "PRG", ],
95
+ [ 'Copenhagen', 82, "CPH", ],
96
+ [ 'Djibouti', 83, "JIB", ],
97
+ [ 'Quito', 84, "UIO", ],
98
+ [ 'Helsinki', 85, "HEL", ],
99
+ [ 'Papeete|Tahiti', 86, "PPT", ],
100
+ [ 'Frankfurt', 87, "FRA", ],
101
+ [ 'Reykjavik', 88, "RKV", ],
102
+ [ 'Riga', 89, "RIX", ],
103
+ [ 'Antananarivo', 90, "TNR", ],
104
+ [ 'Amsterdam', 91, "AMS", ],
105
+ [ 'Bucharest', 92, "OTP", ],
106
+ [ 'Novosibirsk', 93, "OVB", ],
107
+ [ 'Kigali', 94, "KGL", ],
108
+ [ 'Dushanbe', 95, "DYU", ],
109
+ [ 'Dubai', 96, "DXB", ],
110
+ [ 'Bermuda', 97, "BDA", ],
111
+ [ 'Anchorage', 98, "ANC", ],
112
+ [ 'Austin', 99, "AUS", ],
113
+ [ 'Honolulu', 100, "HNL", ],
114
+ [ 'Apia', 101, "FGI", ],
115
+ [ 'Vienna', 102, "VIE", ],
116
+ [ 'Brussels', 103, "BRU", ],
117
+ [ 'Munich', 104, "MUC", ],
118
+ [ 'Dublin', 105, "DUB", ],
119
+ [ 'Doha', 106, "DOH", ],
120
+ [ 'Taipei', 107, "TPE", ],
121
+ [ 'Yakutsk', 108, "YKS", ],
122
+ [ 'Z.rich', 109, "ZRH", ],
123
+ [ 'Manchester', 110, "MAN", ],
124
+ [ 'Houston', 111, "IAH", ],
125
+ [ 'Charlotte', 112, "CLT", ],
126
+ [ 'Dallas', 113, "DFW", ],
127
+ [ 'Las.*Vegas', 114, "LAS", ],
128
+ [ 'Antalya', 115, "AYT", ],
129
+ [ 'Auckland', 116, "AKL", ],
130
+ ]
131
+
132
+ MATCHED_AIRPORTS = {}
133
+ MATCH_ON_IATA = {}
134
+ MATCH_ON_CITY = {}
135
+ match_on_city_names = []
136
+
137
+ AIRPORTS_TO_MATCH.each do |name, idx, iata|
138
+ hsh = {iata: iata, re: Regexp.new(name, 'i'), name: name, idx: idx}
139
+ if iata.present?
140
+ MATCH_ON_IATA[iata] = hsh
141
+ else
142
+ match_on_city_names << name
143
+ MATCH_ON_CITY[hsh[:re]] = hsh
144
+ end
145
+ end
146
+ match_on_city_re = Regexp.new(match_on_city_names.join('|'))
147
+
148
+ Airport.load_tsv(:airport_identifiers) do |airport|
149
+ airport.name = airport.name[0..30]
150
+ if MATCH_ON_IATA.include?(airport.iata)
151
+ hsh = MATCH_ON_IATA[airport.iata]
152
+ warn [hsh.values, airport.to_tsv].flatten.join("\t") unless hsh[:re] =~ airport.city
153
+ MATCHED_AIRPORTS[hsh[:idx]] = airport
154
+ # elsif (airport.city =~ match_on_city_re)
155
+ # MATCH_ON_CITY.each do |re, hsh|
156
+ # if (airport.city =~ re)
157
+ # puts [airport.to_tsv, hsh[:name], hsh[:idx]].join("\t")
158
+ # end
159
+ # end
160
+ end
161
+ end
162
+
163
+ AIRPORTS_TO_MATCH.each do |name, idx, iata|
164
+ # next if MATCHED_AIRPORTS[idx]
165
+ airport_str = MATCHED_AIRPORTS[idx] ? MATCHED_AIRPORTS[idx].to_tsv : "\t\t\t\t\t\t\t\t\t\t\t\t"
166
+ puts [airport_str, name, "", idx].join("\t")
167
+ end
@@ -0,0 +1,40 @@
1
+ 13874
2
+ 13874
3
+ 14739
4
+ 13881
5
+ 13881
6
+ 03017
7
+ 03017
8
+ 03927
9
+ 03927
10
+ 94847
11
+ 94847
12
+ 14734
13
+ 14734
14
+ 53127
15
+ 99999
16
+ 12960
17
+ 12960
18
+ 94789
19
+ 94789
20
+ 23169
21
+ 23169
22
+ 23174
23
+ 23174
24
+ 12815
25
+ 12815
26
+ 12839
27
+ 12839
28
+ 14922
29
+ 14922
30
+ 94846
31
+ 94846
32
+ 13739
33
+ 13739
34
+ 23183
35
+ 23183
36
+ 99999
37
+ 24233
38
+ 24233
39
+ 23234
40
+ 23234
@@ -0,0 +1,37 @@
1
+ #!/usr/bin/env ruby
2
+ # encoding:UTF-8
3
+
4
+ require 'wukong'
5
+ require 'pathname'
6
+ load '/home/dlaw/dev/wukong/examples/wikipedia/munging_utils.rb'
7
+
8
+ module WeatherFilter
9
+ class Mapper < Wukong::Streamer::LineStreamer
10
+
11
+ WBAN_FILENAME = '/home/dlaw/dev/wukong/examples/airports/wbans.txt'
12
+ USA_WBAN_FILENAME = '/home/dlaw/dev/wukong/examples/airports/usa_wbans.txt'
13
+ FORTY_WBANS_FILENAME = '/home/dlaw/dev/wukong/examples/airports/40_wbans.txt'
14
+
15
+ def initialize
16
+ @wbans = []
17
+ wban_file = File.open(FORTY_WBANS_FILENAME)
18
+ wban_file.each_line do |line|
19
+ @wbans << line[0..-2]
20
+ end
21
+ end
22
+
23
+ def process line
24
+ MungingUtils.guard_encoding(line) do |clean_line|
25
+ wban = Pathname(ENV['map_input_file']).basename.to_s.split('-')[1]
26
+ if @wbans.include? wban
27
+ yield line
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
33
+
34
+ Wukong::Script.new(
35
+ WeatherFilter::Mapper,
36
+ nil
37
+ ).run
@@ -0,0 +1,31 @@
1
+ /* This was a misguided attempt at generating a list of WBAN IDs assigned to airports by filtering the mshr_enhanced
2
+ * and joining it with isd_stations. This is misguided because mshr_enhanced contains much more data than isd_stations,
3
+ * and also contains multiple entries for each weather station, making it non-obvious how best to join the data.
4
+ * A simpler and better approach, taken in usa_wbans.pig and wbans.pig, is to filter and unique mshr_enhanced.
5
+ */
6
+
7
+ mshr = LOAD '/Users/dlaw/Desktop/stations/mshr_enhanced.tsv' AS
8
+ (source_id:chararray, source:chararray, begin_date:chararray, end_date:chararray, station_status:chararray,
9
+ ncdcstn_id:chararray, icao_id:chararray, wban_id:chararray, faa_id:chararray, nwsli_id:chararray, wmo_id:chararray,
10
+ coop_id:chararray, transmittal_id:chararray, ghcnd_id:chararray, name_principal:chararray, name_principal_short:chararray,
11
+ name_coop:chararray, name_coop_short:chararray, name_publication:chararray, name_alias:chararray, nws_clim_div:chararray,
12
+ nws_clim_div_name:chararray, state_prov:chararray, county:chararray, nws_st_code:chararray, fips_country_code:chararray,
13
+ fips_country_name:chararray, nws_region:chararray, nws_wfo:chararray, elev_ground:chararray, elev_ground_unit:chararray,
14
+ elev_barom:chararray, elev_barom_unit:chararray, elev_air:chararray, elev_air_unit:chararray, elev_zerodat:chararray,
15
+ elev_zerodat_unit:chararray, elev_unk:chararray, elev_unk_unit:chararray, lat_dec:chararray, lon_dec:chararray,
16
+ lat_lon_precision:chararray, relocation:chararray, utc_offset:chararray, obs_env:chararray, platform:chararray);
17
+
18
+ mshr_grouped = GROUP mshr BY (icao_id, wban_id, faa_id, begin_date, end_date);
19
+ mshr_final = FOREACH mshr_grouped GENERATE FLATTEN(group) AS (wban_id, icao_id, faa_id, begin_date, end_date);
20
+
21
+ stations = LOAD '/Users/dlaw/Desktop/stations/stations.tsv' AS
22
+ (usaf_id:chararray, wban_id:chararray, station_name:chararray, wmo_country_id:chararray, fips_country_id:chararray,
23
+ state:chararray, icao_call_sign:chararray, latitude:chararray, longitude:chararray, elevation:chararray, begin:chararray, end:chararray);
24
+
25
+ first_pass_j = JOIN mshr_final BY (wban_id) RIGHT OUTER, stations BY (wban_id);
26
+ first_pass_f = FILTER first_pass_j BY (mshr_final::icao_id is not null);
27
+ first_pass = FOREACH first_pass_f GENERATE
28
+ stations::wban_id, mshr_final::icao_id, stations::icao_call_sign, stations::usaf_id, mshr_final::faa_id,
29
+ stations::station_name, stations::wmo_country_id, stations::fips_country_id, stations::state, stations::latitude, stations::longitude, stations::elevation, stations::begin, stations::end;
30
+
31
+ STORE first_pass INTO '/Users/dlaw/Desktop/stations/airport_stations';
@@ -0,0 +1,33 @@
1
+ #!/usr/bin/env ruby
2
+ load 'flat/lib/flat.rb'
3
+
4
+ # This is a script that uses the flat file parser
5
+ # to transform the mshr enhanced data file and the
6
+ # ISD stations list from fixed-width to .tsv.
7
+ # The script must be in the same directory with
8
+ # mshr_enhanced.txt, isd_stations.txt, and the
9
+ # flat file parsing library to work.
10
+
11
+ # mshr-enhanced format description can be found at
12
+ # ftp://ftp.ncdc.noaa.gov/pub/data/homr/docs/MSHR_Enhanced_Table.txt
13
+
14
+ # The actual mshr-enhanced table can be found at
15
+ # http://www.ncdc.noaa.gov/homr/file/mshr_enhanced.txt.zip
16
+
17
+ # isd_stations can be found at
18
+ # http://www1.ncdc.noaa.gov/pub/data/noaa/ish-history.txt
19
+
20
+ # Format strings
21
+ MSHR_FORMAT_STRING = %{s20 s10 s8 s8 s20 s20 s20 s20 s20 s20 s20 s20 s20 s20
22
+ s100 s30 s100 s30 s100 s100 s10 s40 s10 s50 s2 s2 s100
23
+ s30 s10 s40 s20 s40 s20 s40 s20 s40 s20 s40 s20 s20 s20
24
+ s10 s62 s16 s40 s100}
25
+ ISD_FORMAT_STRING = %{s6 s5 s29 s2 s2 s2 s5 D6e3 D7e3 D6e1 _2 s8 s8}
26
+
27
+ # Parse mshr_enhanced
28
+ mshr_parser = Flat.create_parser(MSHR_FORMAT_STRING,1)
29
+ mshr_parser.file_to_tsv('mshr_enhanced.txt','mshr_enhanced.tsv')
30
+
31
+ # Parse isd_stations
32
+ isd_parser = Flat.create_parser(ISD_FORMAT_STRING,1,false)
33
+ isd_parser.file_to_tsv('isd_stations.txt','isd_stations.tsv')
@@ -0,0 +1,19 @@
1
+ // Outputs a list of WBAN ids that are assigned to airports in the USA
2
+
3
+ mshr = LOAD '/Users/dlaw/Desktop/stations/mshr_enhanced.tsv' AS
4
+ (source_id:chararray, source:chararray, begin_date:chararray, end_date:chararray, station_status:chararray,
5
+ ncdcstn_id:chararray, icao_id:chararray, wban_id:chararray, faa_id:chararray, nwsli_id:chararray, wmo_id:chararray,
6
+ coop_id:chararray, transmittal_id:chararray, ghcnd_id:chararray, name_principal:chararray, name_principal_short:chararray,
7
+ name_coop:chararray, name_coop_short:chararray, name_publication:chararray, name_alias:chararray, nws_clim_div:chararray,
8
+ nws_clim_div_name:chararray, state_prov:chararray, county:chararray, nws_st_code:chararray, fips_country_code:chararray,
9
+ fips_country_name:chararray, nws_region:chararray, nws_wfo:chararray, elev_ground:chararray, elev_ground_unit:chararray,
10
+ elev_barom:chararray, elev_barom_unit:chararray, elev_air:chararray, elev_air_unit:chararray, elev_zerodat:chararray,
11
+ elev_zerodat_unit:chararray, elev_unk:chararray, elev_unk_unit:chararray, lat_dec:chararray, lon_dec:chararray,
12
+ lat_lon_precision:chararray, relocation:chararray, utc_offset:chararray, obs_env:chararray, platform:chararray);
13
+
14
+ mshr_grouped = GROUP mshr BY (icao_id, wban_id, faa_id, fips_country_code);
15
+ mshr_flattened = FOREACH mshr_grouped GENERATE FLATTEN(group) AS (wban_id, icao_id, faa_id, fips_country_code);
16
+ mshr_filtered = FILTER mshr_flattened BY (icao_id is not null and wban_id is not null and fips_country_code == 'US');
17
+
18
+ mshr_final = FOREACH mshr_filtered GENERATE wban_id;
19
+ STORE mshr_final INTO '/Users/dlaw/Desktop/stations/usa_wbans';
@@ -0,0 +1,2157 @@
1
+ 03069
2
+ 94119
3
+ 04204
4
+ 94991
5
+ 53928
6
+ 54779
7
+ 03196
8
+ 63844
9
+ 63875
10
+ 53929
11
+ 64773
12
+ 04201
13
+ 94076
14
+ 04849
15
+ 63834
16
+ 94037
17
+ 63839
18
+ 63876
19
+ 63877
20
+ 03051
21
+ 63878
22
+ 12981
23
+ 12971
24
+ 53866
25
+ 53904
26
+ 12978
27
+ 53862
28
+ 94061
29
+ 63848
30
+ 63879
31
+ 63847
32
+ 53990
33
+ 53966
34
+ 53972
35
+ 03053
36
+ 94298
37
+ 03032
38
+ 63827
39
+ 92807
40
+ 92807
41
+ 03064
42
+ 93226
43
+ 63880
44
+ 94993
45
+ 53964
46
+ 94623
47
+ 94070
48
+ 94943
49
+ 04862
50
+ 12832
51
+ 03974
52
+ 94299
53
+ 14737
54
+ 13962
55
+ 23050
56
+ 14929
57
+ 14929
58
+ 03019
59
+ 13869
60
+ 04863
61
+ 14756
62
+ 53991
63
+ 54916
64
+ 13959
65
+ 24283
66
+ 93730
67
+ 94997
68
+ 04847
69
+ 53930
70
+ 93940
71
+ 03970
72
+ 03043
73
+ 94998
74
+ 13705
75
+ 03034
76
+ 03064
77
+ 94968
78
+ 93915
79
+ 93065
80
+ 04827
81
+ 04993
82
+ 54770
83
+ 53909
84
+ 14762
85
+ 12804
86
+ 03820
87
+ 13873
88
+ 24044
89
+ 04828
90
+ 04864
91
+ 14930
92
+ 94999
93
+ 53931
94
+ 63853
95
+ 53175
96
+ 53870
97
+ 24015
98
+ 93773
99
+ 93773
100
+ 14813
101
+ 14735
102
+ 12932
103
+ 53146
104
+ 93097
105
+ 03958
106
+ 94910
107
+ 23061
108
+ 24160
109
+ 63833
110
+ 23047
111
+ 23047
112
+ 13870
113
+ 53989
114
+ 54816
115
+ 94989
116
+ 12899
117
+ 13871
118
+ 93846
119
+ 94974
120
+ 14847
121
+ 94975
122
+ 04850
123
+ 14736
124
+ 93067
125
+ 93227
126
+ 12897
127
+ 13701
128
+ 94849
129
+ 04837
130
+ 04837
131
+ 53983
132
+ 54917
133
+ 53932
134
+ 03949
135
+ 54768
136
+ 53915
137
+ 94889
138
+ 93991
139
+ 12953
140
+ 04808
141
+ 94790
142
+ 04865
143
+ 94987
144
+ 53865
145
+ 93073
146
+ 03973
147
+ 54754
148
+ 93796
149
+ 94224
150
+ 54809
151
+ 94929
152
+ 13874
153
+ 03035
154
+ 13958
155
+ 04825
156
+ 94287
157
+ 14946
158
+ 14605
159
+ 04901
160
+ 04902
161
+ 23224
162
+ 03892
163
+ 13904
164
+ 13958
165
+ 14897
166
+ 93797
167
+ 53933
168
+ 03812
169
+ 14777
170
+ 23191
171
+ 04903
172
+ 94190
173
+ 53959
174
+ 04205
175
+ 04904
176
+ 14910
177
+ 63901
178
+ 04779
179
+ 13861
180
+ 53129
181
+ 94815
182
+ 54772
183
+ 93216
184
+ 13944
185
+ 14775
186
+ 13803
187
+ 24119
188
+ 24119
189
+ 54817
190
+ 12971
191
+ 54904
192
+ 93942
193
+ 94946
194
+ 93240
195
+ 53881
196
+ 23159
197
+ 12803
198
+ 94961
199
+ 14816
200
+ 03036
201
+ 14740
202
+ 94702
203
+ 14702
204
+ 94871
205
+ 04751
206
+ 24028
207
+ 24234
208
+ 23155
209
+ 13838
210
+ 04905
211
+ 03024
212
+ 53882
213
+ 04725
214
+ 04725
215
+ 14606
216
+ 23005
217
+ 14616
218
+ 94055
219
+ 13876
220
+ 94289
221
+ 94793
222
+ 94947
223
+ 23157
224
+ 63835
225
+ 24033
226
+ 24011
227
+ 24011
228
+ 04839
229
+ 13820
230
+ 03065
231
+ 93068
232
+ 14958
233
+ 04842
234
+ 53145
235
+ 53988
236
+ 24130
237
+ 23036
238
+ 04853
239
+ 12982
240
+ 13726
241
+ 12818
242
+ 03872
243
+ 94902
244
+ 03859
245
+ 23158
246
+ 24217
247
+ 54760
248
+ 23225
249
+ 13802
250
+ 94046
251
+ 24180
252
+ 03893
253
+ 54831
254
+ 94700
255
+ 03999
256
+ 53823
257
+ 13897
258
+ 25312
259
+ 94185
260
+ 04906
261
+ 24131
262
+ 24267
263
+ 14739
264
+ 12809
265
+ 54765
266
+ 03044
267
+ 24164
268
+ 53918
269
+ 12917
270
+ 53883
271
+ 53992
272
+ 94938
273
+ 14931
274
+ 12919
275
+ 12919
276
+ 13904
277
+ 14815
278
+ 24135
279
+ 64705
280
+ 13970
281
+ 14742
282
+ 14964
283
+ 14733
284
+ 14733
285
+ 23156
286
+ 23152
287
+ 04866
288
+ 93783
289
+ 04813
290
+ 54921
291
+ 03959
292
+ 94282
293
+ 53934
294
+ 54733
295
+ 93943
296
+ 93808
297
+ 93721
298
+ 54922
299
+ 94054
300
+ 13814
301
+ 24133
302
+ 03182
303
+ 92804
304
+ 12981
305
+ 24132
306
+ 04867
307
+ 04839
308
+ 04868
309
+ 14817
310
+ 13883
311
+ 13883
312
+ 24046
313
+ 14895
314
+ 23051
315
+ 14607
316
+ 04907
317
+ 03732
318
+ 04908
319
+ 04909
320
+ 03037
321
+ 13825
322
+ 94625
323
+ 04101
324
+ 53884
325
+ 23254
326
+ 03038
327
+ 54764
328
+ 14966
329
+ 93129
330
+ 94977
331
+ 53916
332
+ 24017
333
+ 23007
334
+ 54743
335
+ 24286
336
+ 14703
337
+ 53850
338
+ 13884
339
+ 93069
340
+ 54901
341
+ 54828
342
+ 93967
343
+ 04805
344
+ 03935
345
+ 94866
346
+ 03914
347
+ 13882
348
+ 53128
349
+ 53935
350
+ 93736
351
+ 13880
352
+ 93203
353
+ 14990
354
+ 04910
355
+ 93809
356
+ 04869
357
+ 93798
358
+ 03802
359
+ 04911
360
+ 03881
361
+ 04912
362
+ 54920
363
+ 03894
364
+ 14820
365
+ 14820
366
+ 54832
367
+ 13999
368
+ 03904
369
+ 94266
370
+ 13881
371
+ 53845
372
+ 23136
373
+ 14821
374
+ 94870
375
+ 14858
376
+ 94940
377
+ 54923
378
+ 04913
379
+ 13984
380
+ 23086
381
+ 93033
382
+ 03179
383
+ 13981
384
+ 93075
385
+ 24045
386
+ 24136
387
+ 12867
388
+ 14745
389
+ 04914
390
+ 93037
391
+ 12947
392
+ 03945
393
+ 13983
394
+ 93799
395
+ 03701
396
+ 24089
397
+ 03960
398
+ 53981
399
+ 03039
400
+ 53936
401
+ 03027
402
+ 54905
403
+ 93134
404
+ 94199
405
+ 94624
406
+ 93718
407
+ 53860
408
+ 12924
409
+ 12924
410
+ 03177
411
+ 53912
412
+ 13866
413
+ 12879
414
+ 93842
415
+ 03932
416
+ 04915
417
+ 03847
418
+ 24137
419
+ 12833
420
+ 03727
421
+ 53867
422
+ 53993
423
+ 63840
424
+ 94032
425
+ 93814
426
+ 23077
427
+ 24202
428
+ 23008
429
+ 04870
430
+ 94890
431
+ 13941
432
+ 94979
433
+ 53902
434
+ 54774
435
+ 14751
436
+ 24018
437
+ 24018
438
+ 94204
439
+ 03164
440
+ 94056
441
+ 93728
442
+ 12834
443
+ 23161
444
+ 13960
445
+ 13728
446
+ 54791
447
+ 93235
448
+ 93815
449
+ 63881
450
+ 94908
451
+ 13743
452
+ 53852
453
+ 13985
454
+ 13985
455
+ 54781
456
+ 03887
457
+ 04916
458
+ 03017
459
+ 23062
460
+ 53925
461
+ 14822
462
+ 94119
463
+ 25515
464
+ 04851
465
+ 03927
466
+ 22015
467
+ 94057
468
+ 13839
469
+ 93843
470
+ 93042
471
+ 04135
472
+ 24012
473
+ 93771
474
+ 04871
475
+ 14747
476
+ 03073
477
+ 22001
478
+ 14913
479
+ 14913
480
+ 54833
481
+ 24138
482
+ 24219
483
+ 23109
484
+ 93784
485
+ 23078
486
+ 03994
487
+ 03724
488
+ 94984
489
+ 63903
490
+ 13837
491
+ 53885
492
+ 04917
493
+ 94891
494
+ 13707
495
+ 93770
496
+ 94878
497
+ 94892
498
+ 24103
499
+ 03702
500
+ 63842
501
+ 03160
502
+ 03976
503
+ 54844
504
+ 93005
505
+ 22010
506
+ 14933
507
+ 94704
508
+ 23162
509
+ 94962
510
+ 53905
511
+ 03991
512
+ 53853
513
+ 94847
514
+ 04830
515
+ 53937
516
+ 53938
517
+ 93026
518
+ 04872
519
+ 04787
520
+ 03070
521
+ 94928
522
+ 94982
523
+ 94982
524
+ 54924
525
+ 03184
526
+ 53910
527
+ 54734
528
+ 04918
529
+ 54786
530
+ 03809
531
+ 13910
532
+ 04919
533
+ 03987
534
+ 53965
535
+ 03049
536
+ 14905
537
+ 94239
538
+ 14991
539
+ 03983
540
+ 03983
541
+ 12983
542
+ 04920
543
+ 13786
544
+ 13787
545
+ 73805
546
+ 23098
547
+ 03703
548
+ 03197
549
+ 23114
550
+ 23179
551
+ 94721
552
+ 94050
553
+ 53864
554
+ 12906
555
+ 54758
556
+ 04873
557
+ 23063
558
+ 03844
559
+ 54838
560
+ 93076
561
+ 63843
562
+ 53886
563
+ 24213
564
+ 04806
565
+ 13729
566
+ 24121
567
+ 63882
568
+ 93992
569
+ 03977
570
+ 14748
571
+ 24220
572
+ 94964
573
+ 23044
574
+ 23154
575
+ 54757
576
+ 24165
577
+ 13989
578
+ 03165
579
+ 03704
580
+ 53112
581
+ 13909
582
+ 53887
583
+ 24193
584
+ 04845
585
+ 54766
586
+ 53876
587
+ 04921
588
+ 53851
589
+ 24141
590
+ 14608
591
+ 03020
592
+ 53872
593
+ 14860
594
+ 25318
595
+ 12961
596
+ 04874
597
+ 14824
598
+ 94853
599
+ 13935
600
+ 03756
601
+ 94971
602
+ 53110
603
+ 04875
604
+ 04922
605
+ 63872
606
+ 24221
607
+ 94195
608
+ 92808
609
+ 04923
610
+ 93817
611
+ 04111
612
+ 53825
613
+ 94726
614
+ 53939
615
+ 93719
616
+ 14734
617
+ 12971
618
+ 53888
619
+ 53842
620
+ 03705
621
+ 12836
622
+ 53114
623
+ 03706
624
+ 53969
625
+ 53907
626
+ 93735
627
+ 93996
628
+ 14914
629
+ 93193
630
+ 93740
631
+ 93737
632
+ 94969
633
+ 24146
634
+ 23167
635
+ 24047
636
+ 94963
637
+ 94015
638
+ 53831
639
+ 13730
640
+ 03981
641
+ 03981
642
+ 03022
643
+ 14825
644
+ 04876
645
+ 04924
646
+ 94006
647
+ 03736
648
+ 53819
649
+ 53819
650
+ 04925
651
+ 94966
652
+ 13840
653
+ 53841
654
+ 03185
655
+ 04926
656
+ 94276
657
+ 03124
658
+ 54792
659
+ 04780
660
+ 04927
661
+ 94868
662
+ 13763
663
+ 54818
664
+ 04840
665
+ 03103
666
+ 12849
667
+ 13744
668
+ 03918
669
+ 13921
670
+ 93733
671
+ 14704
672
+ 23090
673
+ 12835
674
+ 94957
675
+ 94035
676
+ 94062
677
+ 14826
678
+ 53889
679
+ 23256
680
+ 94933
681
+ 13920
682
+ 14719
683
+ 04928
684
+ 04877
685
+ 12895
686
+ 53890
687
+ 54787
688
+ 13947
689
+ 94948
690
+ 14944
691
+ 14944
692
+ 04929
693
+ 13945
694
+ 13964
695
+ 23091
696
+ 04930
697
+ 53113
698
+ 03018
699
+ 13807
700
+ 13961
701
+ 03888
702
+ 03166
703
+ 04836
704
+ 03707
705
+ 14827
706
+ 53891
707
+ 54793
708
+ 03985
709
+ 03985
710
+ 12885
711
+ 03734
712
+ 93993
713
+ 54773
714
+ 03896
715
+ 13975
716
+ 93764
717
+ 12993
718
+ 13940
719
+ 94959
720
+ 03148
721
+ 23168
722
+ 94023
723
+ 23064
724
+ 53940
725
+ 03195
726
+ 04999
727
+ 53977
728
+ 23055
729
+ 24087
730
+ 13764
731
+ 24157
732
+ 53126
733
+ 53892
734
+ 24048
735
+ 53866
736
+ 24112
737
+ 14916
738
+ 14750
739
+ 03901
740
+ 14976
741
+ 94008
742
+ 94008
743
+ 64774
744
+ 04931
745
+ 12876
746
+ 23066
747
+ 03025
748
+ 04843
749
+ 53907
750
+ 23065
751
+ 23065
752
+ 93929
753
+ 13939
754
+ 04854
755
+ 12923
756
+ 53941
757
+ 13886
758
+ 94992
759
+ 03056
760
+ 24142
761
+ 12990
762
+ 94626
763
+ 93057
764
+ 12816
765
+ 53913
766
+ 14707
767
+ 04878
768
+ 24146
769
+ 53984
770
+ 93874
771
+ 94919
772
+ 14898
773
+ 14898
774
+ 53874
775
+ 24201
776
+ 14935
777
+ 03902
778
+ 03992
779
+ 94860
780
+ 94860
781
+ 13713
782
+ 14829
783
+ 13723
784
+ 03870
785
+ 03870
786
+ 14715
787
+ 24143
788
+ 53893
789
+ 53942
790
+ 93007
791
+ 23081
792
+ 94833
793
+ 03030
794
+ 53838
795
+ 13926
796
+ 03929
797
+ 13978
798
+ 03708
799
+ 53837
800
+ 24051
801
+ 53979
802
+ 63889
803
+ 53967
804
+ 04932
805
+ 03186
806
+ 54762
807
+ 04807
808
+ 53820
809
+ 54850
810
+ 53855
811
+ 13833
812
+ 03709
813
+ 93986
814
+ 12994
815
+ 04933
816
+ 04934
817
+ 03908
818
+ 04935
819
+ 94025
820
+ 12962
821
+ 03023
822
+ 03710
823
+ 53894
824
+ 94038
825
+ 63873
826
+ 03961
827
+ 14752
828
+ 93747
829
+ 93706
830
+ 93218
831
+ 03980
832
+ 93046
833
+ 03167
834
+ 94931
835
+ 54728
836
+ 24101
837
+ 94261
838
+ 04998
839
+ 53119
840
+ 53869
841
+ 13927
842
+ 03810
843
+ 93990
844
+ 14894
845
+ 24144
846
+ 03933
847
+ 53895
848
+ 23002
849
+ 94187
850
+ 53896
851
+ 53127
852
+ 04936
853
+ 53111
854
+ 03711
855
+ 93034
856
+ 14936
857
+ 13806
858
+ 03962
859
+ 12918
860
+ 94745
861
+ 94745
862
+ 53839
863
+ 94225
864
+ 63836
865
+ 53970
866
+ 04113
867
+ 03712
868
+ 12904
869
+ 13971
870
+ 03852
871
+ 63852
872
+ 53897
873
+ 93729
874
+ 94949
875
+ 93757
876
+ 12826
877
+ 03856
878
+ 94814
879
+ 64761
880
+ 03860
881
+ 53857
882
+ 63883
883
+ 03868
884
+ 93823
885
+ 14609
886
+ 12927
887
+ 26522
888
+ 13986
889
+ 23170
890
+ 14758
891
+ 94012
892
+ 93228
893
+ 92809
894
+ 54790
895
+ 63837
896
+ 94720
897
+ 12979
898
+ 94973
899
+ 03968
900
+ 04829
901
+ 04997
902
+ 04857
903
+ 53842
904
+ 63884
905
+ 03923
906
+ 93738
907
+ 04724
908
+ 12960
909
+ 94073
910
+ 04937
911
+ 94990
912
+ 03928
913
+ 03928
914
+ 53118
915
+ 24145
916
+ 64706
917
+ 94039
918
+ 53943
919
+ 53135
920
+ 93167
921
+ 04879
922
+ 93785
923
+ 04989
924
+ 53898
925
+ 54767
926
+ 53944
927
+ 04880
928
+ 25626
929
+ 04938
930
+ 03972
931
+ 13781
932
+ 13748
933
+ 13841
934
+ 13841
935
+ 04833
936
+ 04833
937
+ 24091
938
+ 94893
939
+ 93819
940
+ 93819
941
+ 53972
942
+ 23040
943
+ 14918
944
+ 23141
945
+ 93807
946
+ 23194
947
+ 03984
948
+ 14937
949
+ 53899
950
+ 03144
951
+ 14778
952
+ 14938
953
+ 54827
954
+ 92813
955
+ 94014
956
+ 93726
957
+ 04781
958
+ 04881
959
+ 04826
960
+ 94761
961
+ 03026
962
+ 23104
963
+ 23104
964
+ 94926
965
+ 94623
966
+ 12969
967
+ 04844
968
+ 93909
969
+ 93194
970
+ 93244
971
+ 54772
972
+ 24166
973
+ 03940
974
+ 53945
975
+ 13889
976
+ 13889
977
+ 03953
978
+ 13973
979
+ 53978
980
+ 94051
981
+ 03963
982
+ 04110
983
+ 94789
984
+ 03730
985
+ 53824
986
+ 04720
987
+ 63885
988
+ 04939
989
+ 03889
990
+ 03889
991
+ 13987
992
+ 04940
993
+ 14919
994
+ 03713
995
+ 14834
996
+ 63801
997
+ 53971
998
+ 04726
999
+ 53946
1000
+ 94854
1001
+ 53947
1002
+ 53966
1003
+ 53982
1004
+ 14833
1005
+ 54906
1006
+ 63846
1007
+ 04882
1008
+ 03714
1009
+ 14989
1010
+ 25314
1011
+ 24223
1012
+ 53995
1013
+ 03013
1014
+ 14835
1015
+ 12883
1016
+ 93091
1017
+ 14836
1018
+ 24022
1019
+ 23169
1020
+ 03950
1021
+ 23174
1022
+ 23042
1023
+ 23042
1024
+ 54735
1025
+ 24023
1026
+ 23020
1027
+ 53963
1028
+ 13776
1029
+ 12976
1030
+ 54925
1031
+ 03937
1032
+ 03937
1033
+ 54736
1034
+ 13812
1035
+ 04883
1036
+ 94765
1037
+ 12819
1038
+ 94709
1039
+ 93820
1040
+ 13702
1041
+ 93987
1042
+ 13976
1043
+ 14732
1044
+ 23129
1045
+ 03821
1046
+ 24148
1047
+ 94128
1048
+ 53973
1049
+ 53844
1050
+ 03875
1051
+ 23067
1052
+ 03731
1053
+ 93010
1054
+ 13963
1055
+ 53813
1056
+ 53813
1057
+ 14623
1058
+ 04941
1059
+ 03715
1060
+ 94285
1061
+ 04114
1062
+ 53919
1063
+ 94236
1064
+ 53975
1065
+ 24021
1066
+ 14939
1067
+ 14886
1068
+ 04809
1069
+ 63802
1070
+ 14921
1071
+ 54737
1072
+ 94049
1073
+ 24172
1074
+ 64752
1075
+ 53861
1076
+ 04831
1077
+ 04831
1078
+ 13810
1079
+ 03849
1080
+ 23243
1081
+ 04849
1082
+ 12907
1083
+ 03930
1084
+ 04942
1085
+ 93041
1086
+ 04108
1087
+ 14920
1088
+ 13829
1089
+ 23112
1090
+ 03982
1091
+ 03982
1092
+ 13902
1093
+ 93774
1094
+ 53964
1095
+ 23111
1096
+ 93812
1097
+ 04995
1098
+ 12975
1099
+ 23285
1100
+ 24150
1101
+ 04943
1102
+ 23054
1103
+ 53827
1104
+ 54826
1105
+ 53801
1106
+ 03997
1107
+ 94991
1108
+ 94723
1109
+ 24149
1110
+ 24036
1111
+ 13809
1112
+ 93767
1113
+ 04944
1114
+ 14994
1115
+ 53879
1116
+ 93009
1117
+ 13733
1118
+ 54926
1119
+ 03952
1120
+ 03952
1121
+ 63803
1122
+ 63851
1123
+ 93242
1124
+ 23023
1125
+ 23023
1126
+ 03818
1127
+ 03817
1128
+ 94296
1129
+ 94052
1130
+ 94894
1131
+ 14845
1132
+ 94048
1133
+ 93919
1134
+ 23208
1135
+ 54820
1136
+ 23257
1137
+ 12810
1138
+ 03947
1139
+ 94040
1140
+ 03813
1141
+ 12815
1142
+ 14940
1143
+ 03071
1144
+ 93810
1145
+ 63804
1146
+ 14711
1147
+ 14819
1148
+ 54911
1149
+ 93782
1150
+ 24152
1151
+ 13865
1152
+ 13893
1153
+ 23203
1154
+ 53996
1155
+ 14891
1156
+ 12959
1157
+ 94985
1158
+ 24225
1159
+ 03716
1160
+ 13864
1161
+ 04945
1162
+ 04789
1163
+ 13895
1164
+ 04884
1165
+ 53817
1166
+ 13736
1167
+ 53859
1168
+ 94950
1169
+ 03936
1170
+ 23206
1171
+ 24215
1172
+ 14710
1173
+ 03183
1174
+ 93768
1175
+ 12839
1176
+ 94011
1177
+ 94960
1178
+ 94895
1179
+ 13735
1180
+ 94988
1181
+ 04946
1182
+ 13988
1183
+ 14839
1184
+ 14840
1185
+ 63805
1186
+ 03811
1187
+ 53997
1188
+ 93953
1189
+ 14954
1190
+ 04834
1191
+ 12838
1192
+ 12838
1193
+ 93950
1194
+ 24151
1195
+ 04992
1196
+ 23176
1197
+ 14923
1198
+ 63886
1199
+ 24154
1200
+ 24037
1201
+ 14610
1202
+ 13942
1203
+ 03181
1204
+ 54788
1205
+ 94976
1206
+ 94887
1207
+ 03858
1208
+ 54738
1209
+ 94273
1210
+ 03040
1211
+ 94896
1212
+ 04855
1213
+ 13894
1214
+ 13894
1215
+ 23258
1216
+ 04885
1217
+ 24013
1218
+ 26621
1219
+ 04948
1220
+ 54789
1221
+ 94705
1222
+ 94983
1223
+ 04947
1224
+ 04949
1225
+ 14753
1226
+ 13766
1227
+ 94850
1228
+ 94850
1229
+ 13827
1230
+ 13734
1231
+ 93035
1232
+ 93765
1233
+ 54907
1234
+ 63859
1235
+ 53832
1236
+ 23259
1237
+ 13896
1238
+ 14837
1239
+ 24153
1240
+ 14922
1241
+ 94725
1242
+ 54746
1243
+ 04103
1244
+ 12916
1245
+ 14804
1246
+ 12896
1247
+ 93013
1248
+ 93744
1249
+ 53802
1250
+ 54780
1251
+ 63806
1252
+ 94897
1253
+ 04104
1254
+ 54723
1255
+ 24106
1256
+ 04950
1257
+ 93236
1258
+ 04951
1259
+ 54771
1260
+ 93894
1261
+ 94986
1262
+ 94724
1263
+ 03865
1264
+ 94869
1265
+ 24110
1266
+ 63807
1267
+ 93985
1268
+ 04952
1269
+ 14755
1270
+ 63887
1271
+ 93136
1272
+ 53921
1273
+ 13821
1274
+ 04953
1275
+ 53826
1276
+ 03131
1277
+ 94182
1278
+ 03041
1279
+ 13717
1280
+ 93205
1281
+ 04954
1282
+ 94852
1283
+ 93831
1284
+ 93901
1285
+ 12958
1286
+ 14855
1287
+ 93727
1288
+ 53847
1289
+ 14780
1290
+ 63890
1291
+ 53917
1292
+ 13762
1293
+ 03154
1294
+ 53848
1295
+ 93102
1296
+ 13911
1297
+ 12926
1298
+ 13750
1299
+ 12946
1300
+ 23239
1301
+ 13721
1302
+ 14611
1303
+ 93104
1304
+ 93837
1305
+ 12925
1306
+ 93776
1307
+ 23199
1308
+ 93743
1309
+ 53849
1310
+ 13754
1311
+ 03190
1312
+ 53115
1313
+ 93107
1314
+ 23110
1315
+ 03866
1316
+ 12974
1317
+ 24228
1318
+ 03855
1319
+ 93839
1320
+ 93839
1321
+ 12928
1322
+ 12850
1323
+ 94297
1324
+ 03853
1325
+ 23240
1326
+ 93115
1327
+ 93841
1328
+ 93116
1329
+ 93111
1330
+ 93114
1331
+ 13769
1332
+ 93117
1333
+ 03757
1334
+ 23244
1335
+ 24255
1336
+ 12973
1337
+ 93121
1338
+ 14793
1339
+ 94728
1340
+ 13773
1341
+ 03145
1342
+ 93832
1343
+ 93101
1344
+ 14790
1345
+ 93112
1346
+ 94299
1347
+ 93241
1348
+ 93753
1349
+ 23230
1350
+ 93217
1351
+ 94980
1352
+ 12861
1353
+ 53948
1354
+ 03741
1355
+ 03031
1356
+ 94958
1357
+ 04886
1358
+ 54912
1359
+ 14949
1360
+ 14941
1361
+ 93775
1362
+ 94063
1363
+ 53854
1364
+ 24126
1365
+ 26632
1366
+ 53833
1367
+ 03967
1368
+ 53121
1369
+ 13967
1370
+ 54807
1371
+ 53949
1372
+ 03717
1373
+ 94703
1374
+ 14622
1375
+ 94017
1376
+ 24227
1377
+ 03196
1378
+ 94951
1379
+ 63808
1380
+ 53822
1381
+ 04955
1382
+ 14942
1383
+ 03718
1384
+ 94197
1385
+ 92822
1386
+ 04956
1387
+ 04957
1388
+ 93040
1389
+ 24162
1390
+ 24285
1391
+ 03102
1392
+ 03737
1393
+ 54819
1394
+ 54919
1395
+ 12882
1396
+ 63809
1397
+ 53868
1398
+ 54752
1399
+ 04958
1400
+ 04959
1401
+ 94846
1402
+ 54756
1403
+ 13737
1404
+ 53998
1405
+ 94746
1406
+ 12841
1407
+ 04224
1408
+ 53962
1409
+ 14808
1410
+ 94855
1411
+ 04804
1412
+ 94927
1413
+ 24284
1414
+ 14950
1415
+ 04106
1416
+ 03948
1417
+ 93210
1418
+ 04960
1419
+ 94994
1420
+ 04961
1421
+ 53803
1422
+ 54704
1423
+ 93786
1424
+ 64707
1425
+ 93110
1426
+ 04962
1427
+ 03850
1428
+ 04887
1429
+ 03957
1430
+ 03163
1431
+ 54813
1432
+ 94898
1433
+ 94899
1434
+ 94173
1435
+ 03170
1436
+ 04109
1437
+ 04856
1438
+ 12968
1439
+ 24222
1440
+ 03816
1441
+ 03816
1442
+ 13846
1443
+ 23289
1444
+ 27506
1445
+ 93988
1446
+ 04742
1447
+ 64776
1448
+ 54913
1449
+ 12844
1450
+ 04832
1451
+ 92824
1452
+ 54852
1453
+ 04963
1454
+ 53863
1455
+ 24155
1456
+ 24155
1457
+ 24229
1458
+ 04964
1459
+ 54778
1460
+ 03058
1461
+ 54927
1462
+ 03882
1463
+ 03162
1464
+ 12812
1465
+ 13783
1466
+ 04852
1467
+ 93741
1468
+ 13739
1469
+ 04888
1470
+ 24024
1471
+ 23183
1472
+ 14842
1473
+ 53808
1474
+ 12873
1475
+ 24156
1476
+ 12957
1477
+ 24025
1478
+ 94823
1479
+ 03804
1480
+ 94967
1481
+ 14962
1482
+ 12986
1483
+ 94733
1484
+ 14841
1485
+ 23182
1486
+ 25625
1487
+ 92805
1488
+ 94086
1489
+ 13969
1490
+ 94732
1491
+ 54914
1492
+ 13899
1493
+ 04889
1494
+ 13923
1495
+ 13714
1496
+ 03180
1497
+ 03931
1498
+ 03993
1499
+ 03975
1500
+ 14757
1501
+ 03052
1502
+ 03998
1503
+ 53950
1504
+ 14604
1505
+ 53858
1506
+ 04965
1507
+ 93209
1508
+ 23184
1509
+ 63810
1510
+ 63874
1511
+ 25330
1512
+ 93955
1513
+ 14761
1514
+ 24163
1515
+ 14763
1516
+ 13868
1517
+ 04743
1518
+ 93983
1519
+ 93138
1520
+ 12935
1521
+ 93714
1522
+ 26526
1523
+ 94817
1524
+ 12936
1525
+ 93978
1526
+ 23149
1527
+ 54782
1528
+ 93058
1529
+ 93141
1530
+ 94129
1531
+ 03021
1532
+ 64708
1533
+ 14765
1534
+ 53951
1535
+ 24174
1536
+ 23097
1537
+ 03954
1538
+ 54915
1539
+ 53952
1540
+ 04838
1541
+ 14764
1542
+ 94263
1543
+ 54769
1544
+ 03045
1545
+ 54825
1546
+ 04134
1547
+ 94818
1548
+ 03171
1549
+ 14806
1550
+ 24090
1551
+ 12995
1552
+ 93772
1553
+ 03971
1554
+ 24231
1555
+ 24216
1556
+ 12984
1557
+ 24006
1558
+ 54928
1559
+ 03738
1560
+ 24257
1561
+ 14712
1562
+ 14767
1563
+ 04966
1564
+ 24230
1565
+ 94925
1566
+ 13722
1567
+ 23021
1568
+ 94022
1569
+ 94107
1570
+ 94822
1571
+ 04967
1572
+ 53104
1573
+ 04803
1574
+ 63811
1575
+ 93232
1576
+ 13740
1577
+ 03846
1578
+ 03016
1579
+ 23069
1580
+ 23119
1581
+ 24061
1582
+ 24061
1583
+ 94601
1584
+ 12972
1585
+ 53953
1586
+ 24027
1587
+ 53834
1588
+ 14717
1589
+ 64775
1590
+ 93801
1591
+ 03735
1592
+ 54821
1593
+ 12911
1594
+ 04968
1595
+ 23043
1596
+ 53120
1597
+ 23185
1598
+ 54824
1599
+ 94248
1600
+ 13741
1601
+ 14768
1602
+ 53954
1603
+ 04969
1604
+ 23009
1605
+ 04970
1606
+ 54909
1607
+ 53965
1608
+ 04890
1609
+ 14864
1610
+ 03029
1611
+ 53999
1612
+ 92802
1613
+ 04891
1614
+ 04971
1615
+ 93997
1616
+ 53958
1617
+ 14925
1618
+ 63841
1619
+ 12894
1620
+ 23052
1621
+ 94288
1622
+ 53920
1623
+ 63812
1624
+ 94737
1625
+ 53908
1626
+ 14992
1627
+ 93759
1628
+ 24057
1629
+ 23901
1630
+ 94194
1631
+ 54834
1632
+ 63813
1633
+ 04972
1634
+ 93781
1635
+ 04113
1636
+ 23232
1637
+ 93084
1638
+ 23049
1639
+ 23188
1640
+ 63814
1641
+ 12921
1642
+ 03822
1643
+ 94836
1644
+ 54910
1645
+ 23190
1646
+ 23122
1647
+ 04841
1648
+ 14848
1649
+ 93206
1650
+ 94033
1651
+ 93720
1652
+ 04741
1653
+ 23237
1654
+ 04973
1655
+ 23187
1656
+ 93821
1657
+ 03192
1658
+ 03178
1659
+ 94028
1660
+ 24233
1661
+ 03172
1662
+ 53143
1663
+ 14770
1664
+ 03969
1665
+ 53904
1666
+ 94290
1667
+ 12854
1668
+ 94990
1669
+ 94176
1670
+ 64709
1671
+ 23234
1672
+ 03719
1673
+ 04107
1674
+ 04996
1675
+ 64710
1676
+ 13995
1677
+ 13995
1678
+ 63888
1679
+ 92814
1680
+ 12977
1681
+ 04974
1682
+ 13925
1683
+ 23186
1684
+ 93760
1685
+ 04975
1686
+ 94227
1687
+ 24029
1688
+ 13957
1689
+ 13957
1690
+ 03763
1691
+ 24259
1692
+ 23293
1693
+ 23293
1694
+ 93027
1695
+ 23034
1696
+ 23034
1697
+ 04892
1698
+ 24114
1699
+ 12909
1700
+ 03012
1701
+ 14846
1702
+ 04976
1703
+ 24127
1704
+ 24232
1705
+ 53955
1706
+ 04893
1707
+ 53141
1708
+ 94740
1709
+ 03919
1710
+ 93998
1711
+ 03879
1712
+ 93937
1713
+ 63815
1714
+ 93225
1715
+ 24196
1716
+ 93197
1717
+ 24237
1718
+ 54785
1719
+ 23273
1720
+ 93184
1721
+ 03050
1722
+ 93911
1723
+ 23233
1724
+ 04112
1725
+ 24030
1726
+ 03059
1727
+ 03720
1728
+ 03101
1729
+ 53117
1730
+ 93804
1731
+ 04201
1732
+ 03028
1733
+ 92806
1734
+ 93822
1735
+ 13966
1736
+ 14972
1737
+ 04894
1738
+ 93231
1739
+ 53985
1740
+ 23902
1741
+ 12871
1742
+ 93083
1743
+ 53906
1744
+ 13849
1745
+ 12970
1746
+ 13878
1747
+ 14847
1748
+ 14926
1749
+ 04895
1750
+ 13993
1751
+ 13994
1752
+ 14927
1753
+ 23213
1754
+ 23274
1755
+ 92815
1756
+ 04824
1757
+ 94161
1758
+ 03966
1759
+ 03721
1760
+ 23202
1761
+ 54908
1762
+ 14943
1763
+ 93063
1764
+ 24258
1765
+ 63816
1766
+ 13824
1767
+ 14714
1768
+ 03965
1769
+ 23033
1770
+ 24235
1771
+ 54930
1772
+ 14771
1773
+ 13930
1774
+ 04129
1775
+ 12975
1776
+ 12957
1777
+ 03044
1778
+ 12984
1779
+ 12980
1780
+ 23070
1781
+ 54777
1782
+ 63817
1783
+ 03938
1784
+ 63818
1785
+ 92801
1786
+ 23048
1787
+ 93806
1788
+ 24207
1789
+ 93045
1790
+ 03722
1791
+ 24241
1792
+ 04848
1793
+ 94741
1794
+ 54822
1795
+ 03011
1796
+ 04102
1797
+ 93778
1798
+ 94087
1799
+ 13919
1800
+ 04896
1801
+ 94274
1802
+ 12898
1803
+ 54931
1804
+ 53914
1805
+ 54953
1806
+ 93805
1807
+ 93805
1808
+ 03979
1809
+ 12888
1810
+ 63819
1811
+ 04977
1812
+ 03191
1813
+ 03122
1814
+ 04978
1815
+ 03878
1816
+ 94830
1817
+ 13996
1818
+ 94053
1819
+ 12842
1820
+ 92825
1821
+ 23153
1822
+ 93984
1823
+ 94978
1824
+ 53956
1825
+ 13877
1826
+ 93201
1827
+ 53911
1828
+ 03104
1829
+ 03723
1830
+ 24242
1831
+ 54823
1832
+ 14792
1833
+ 12886
1834
+ 13968
1835
+ 73804
1836
+ 93862
1837
+ 23160
1838
+ 14850
1839
+ 94956
1840
+ 93230
1841
+ 03996
1842
+ 94178
1843
+ 04979
1844
+ 03986
1845
+ 13977
1846
+ 13972
1847
+ 13891
1848
+ 54776
1849
+ 63825
1850
+ 94194
1851
+ 04114
1852
+ 04116
1853
+ 04110
1854
+ 94184
1855
+ 94281
1856
+ 94794
1857
+ 63820
1858
+ 03742
1859
+ 94047
1860
+ 04897
1861
+ 94981
1862
+ 14880
1863
+ 94240
1864
+ 93989
1865
+ 63821
1866
+ 23275
1867
+ 64753
1868
+ 04980
1869
+ 03946
1870
+ 53901
1871
+ 04898
1872
+ 54739
1873
+ 53806
1874
+ 23903
1875
+ 53903
1876
+ 14787
1877
+ 12985
1878
+ 53871
1879
+ 13857
1880
+ 53856
1881
+ 93780
1882
+ 93214
1883
+ 03978
1884
+ 93234
1885
+ 93241
1886
+ 12912
1887
+ 23131
1888
+ 92816
1889
+ 63822
1890
+ 94030
1891
+ 53123
1892
+ 13997
1893
+ 93144
1894
+ 53818
1895
+ 93999
1896
+ 03838
1897
+ 93845
1898
+ 54829
1899
+ 03995
1900
+ 23130
1901
+ 94930
1902
+ 53873
1903
+ 13858
1904
+ 04846
1905
+ 63823
1906
+ 12843
1907
+ 54740
1908
+ 04858
1909
+ 04981
1910
+ 24032
1911
+ 03042
1912
+ 53101
1913
+ 63824
1914
+ 94298
1915
+ 92817
1916
+ 93795
1917
+ 04982
1918
+ 04983
1919
+ 63845
1920
+ 04899
1921
+ 63832
1922
+ 04221
1923
+ 93775
1924
+ 03725
1925
+ 26618
1926
+ 93739
1927
+ 53986
1928
+ 03832
1929
+ 24198
1930
+ 53130
1931
+ 03159
1932
+ 13932
1933
+ 24128
1934
+ 13860
1935
+ 14706
1936
+ 24062
1937
+ 14794
1938
+ 23277
1939
+ 14615
1940
+ 03726
1941
+ 53957
1942
+ 94163
1943
+ 92802
1944
+ 53976
1945
+ 12868
1946
+ 53922
1947
+ 04984
1948
+ 14853
1949
+ 24243
1950
+ 94911
1951
+ 14852
1952
+ 23195
1953
+ 53116
1954
+ 93044
1955
+ 93824
1956
+ 25708
1957
+ 25715
1958
+ 25348
1959
+ 25375
1960
+ 25331
1961
+ 27401
1962
+ 26615
1963
+ 26415
1964
+ 26645
1965
+ 46402
1966
+ 27502
1967
+ 26533
1968
+ 26497
1969
+ 25316
1970
+ 25624
1971
+ 26418
1972
+ 25361
1973
+ 26410
1974
+ 26445
1975
+ 26633
1976
+ 26646
1977
+ 26643
1978
+ 26649
1979
+ 25704
1980
+ 25513
1981
+ 25501
1982
+ 26486
1983
+ 25616
1984
+ 26641
1985
+ 96401
1986
+ 26401
1987
+ 26422
1988
+ 25623
1989
+ 26407
1990
+ 25357
1991
+ 26650
1992
+ 26650
1993
+ 26523
1994
+ 26554
1995
+ 26411
1996
+ 26498
1997
+ 25369
1998
+ 26555
1999
+ 26551
2000
+ 26519
2001
+ 26501
2002
+ 26501
2003
+ 26509
2004
+ 26465
2005
+ 26513
2006
+ 26425
2007
+ 26628
2008
+ 26703
2009
+ 25310
2010
+ 25322
2011
+ 25335
2012
+ 26521
2013
+ 26548
2014
+ 26548
2015
+ 26552
2016
+ 25323
2017
+ 25507
2018
+ 26651
2019
+ 26522
2020
+ 26499
2021
+ 25376
2022
+ 25521
2023
+ 25404
2024
+ 25519
2025
+ 25506
2026
+ 26535
2027
+ 46403
2028
+ 25518
2029
+ 25309
2030
+ 96402
2031
+ 25503
2032
+ 26602
2033
+ 25503
2034
+ 26542
2035
+ 25325
2036
+ 27408
2037
+ 26502
2038
+ 25367
2039
+ 26652
2040
+ 26491
2041
+ 26546
2042
+ 27517
2043
+ 26480
2044
+ 26631
2045
+ 26557
2046
+ 26510
2047
+ 25402
2048
+ 25403
2049
+ 26512
2050
+ 26524
2051
+ 25377
2052
+ 26621
2053
+ 26635
2054
+ 26409
2055
+ 46404
2056
+ 26622
2057
+ 26451
2058
+ 26516
2059
+ 26435
2060
+ 25308
2061
+ 26644
2062
+ 25378
2063
+ 26617
2064
+ 26653
2065
+ 26412
2066
+ 26616
2067
+ 25628
2068
+ 26639
2069
+ 24690
2070
+ 25329
2071
+ 25508
2072
+ 25604
2073
+ 25613
2074
+ 26623
2075
+ 27515
2076
+ 46405
2077
+ 26654
2078
+ 26561
2079
+ 26704
2080
+ 27406
2081
+ 25617
2082
+ 26625
2083
+ 25333
2084
+ 26558
2085
+ 26553
2086
+ 26647
2087
+ 25713
2088
+ 25516
2089
+ 26439
2090
+ 25341
2091
+ 26414
2092
+ 26534
2093
+ 26514
2094
+ 26559
2095
+ 45715
2096
+ 26529
2097
+ 26634
2098
+ 25629
2099
+ 26528
2100
+ 26536
2101
+ 26492
2102
+ 26492
2103
+ 27518
2104
+ 46406
2105
+ 26508
2106
+ 26627
2107
+ 26560
2108
+ 26442
2109
+ 26479
2110
+ 26642
2111
+ 26442
2112
+ 26438
2113
+ 25338
2114
+ 27503
2115
+ 27503
2116
+ 26630
2117
+ 26648
2118
+ 26444
2119
+ 26443
2120
+ 26445
2121
+ 26484
2122
+ 25339
2123
+ 46407
2124
+ 26413
2125
+ 22501
2126
+ 22508
2127
+ 22552
2128
+ 22551
2129
+ 22548
2130
+ 22550
2131
+ 21510
2132
+ 22536
2133
+ 22534
2134
+ 22547
2135
+ 22539
2136
+ 22514
2137
+ 22519
2138
+ 22521
2139
+ 22517
2140
+ 22524
2141
+ 22516
2142
+ 22526
2143
+ 21508
2144
+ 21504
2145
+ 22513
2146
+ 27403
2147
+ 26624
2148
+ 26638
2149
+ 11640
2150
+ 11624
2151
+ 11603
2152
+ 11653
2153
+ 11630
2154
+ 11630
2155
+ 11641
2156
+ 11655
2157
+ 11649