Property changes on: . ___________________________________________________________________ Added: svn:externals + src/test/e2e/harness http://svn.apache.org/repos/asf/pig/trunk/test/e2e/harness Index: src/test/e2e/hcatalog/tools/test/floatpostprocessor.pl =================================================================== --- src/test/e2e/hcatalog/tools/test/floatpostprocessor.pl (revision 0) +++ src/test/e2e/hcatalog/tools/test/floatpostprocessor.pl (revision 0) @@ -0,0 +1,111 @@ +#!/usr/bin/env perl + +############################################################################ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# +# A simple tool to make sure all floats in the output are written the same way. +# It is assumed that the data in question is being read from stdin. +# +# + +use strict; + +our @floats; +our $delim; + +sub parseLine($) +{ + my $line = shift; + chomp $line; + return split(/$delim/, $line); +} + +sub postprocess($) +{ + my @fields = parseLine(shift); + + for (my $i = 0; $i < @fields; $i++) { + if ($i != 0) { print($delim); } + if ($floats[$i]) { + printf("%.3f", $fields[$i]); + } else { + print($fields[$i]); + } + } + print "\n"; +} + +sub is_float { + my $n = shift; + if(!defined $n || $n eq ""){ + return 0; + } + if($n =~ /^[+-]?\d+\.\d+([eE][-+]?[0-9]+)?$/){ + return 1; + } + + my $abs = abs($n); + if ($abs - int($abs) > 0) { + return 1; + } + return 0; +} + + +# main +{ + $delim = shift; + if (!defined($delim)) { + die "Usage: $0 delimiter\n"; + } + + my @sampled; + my $line; + # read away any empty lines into the sample + do { + $line = ; + push(@sampled, $line); + } while($line && $line =~ /^\s*$/); + # Sample the next thousand lines to figure out which columns have floats. + for (my $i = 0; $i < 1000 && ($line = ); $i++) { + push(@sampled, $line); + } + foreach my $line (@sampled) { + my @fields = parseLine($line); + for (my $j = 0; $j < @fields; $j++) { + if(is_float($fields[$j])){ + $floats[$j] = 1; + } + + + } + } + + # Now, play each of the sampled lines through the postprocessor + foreach my $line (@sampled) { + postprocess($line); + } + + while () { + postprocess($_); + } + +} + + + + Index: src/test/e2e/hcatalog/tools/generate/generate_data.pl =================================================================== --- src/test/e2e/hcatalog/tools/generate/generate_data.pl (revision 0) +++ src/test/e2e/hcatalog/tools/generate/generate_data.pl (revision 0) @@ -0,0 +1,463 @@ +#!/usr/bin/env perl +############################################################################ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# A utility to generate test data for pig test harness tests. +# +# + +use strict; +use charnames (); + +our @firstName = ("alice", "bob", "calvin", "david", "ethan", "fred", + "gabriella", "holly", "irene", "jessica", "katie", "luke", "mike", "nick", + "oscar", "priscilla", "quinn", "rachel", "sarah", "tom", "ulysses", "victor", + "wendy", "xavier", "yuri", "zach"); + +our @lastName = ("allen", "brown", "carson", "davidson", "ellison", "falkner", + "garcia", "hernandez", "ichabod", "johnson", "king", "laertes", "miller", + "nixon", "ovid", "polk", "quirinius", "robinson", "steinbeck", "thompson", + "underhill", "van buren", "white", "xylophone", "young", "zipper"); + +sub randomName() +{ + return sprintf("%s %s", $firstName[int(rand(26))], + $lastName[int(rand(26))]); +} + +our @city = ("albuquerque", "bombay", "calcutta", "danville", "eugene", + "frankfurt", "grenoble", "harrisburg", "indianapolis", + "jerusalem", "kellogg", "lisbon", "marseilles", + "nice", "oklohoma city", "paris", "queensville", "roswell", + "san francisco", "twin falls", "umatilla", "vancouver", "wheaton", + "xacky", "youngs town", "zippy"); + +sub randomCity() +{ + return $city[int(rand(26))]; +} + +our @state = ( "AL", "AK", "AS", "AZ", "AR", "CA", "CO", "CT", "DE", "DC", + "FL", "GA", "HI", "ID", "IL", "IN", "IA", "KS", "KY", "LA", "ME", "MD", + "MA", "MI", "MN", "MS", "MT", "NE", "NV", "NH", "NJ", "NM", "NY", "NC", + "ND", "OH", "OK", "OR", "RI", "SC", "SD", "TN", "TX", "UT", "VT", "VA", + "WA", "WV", "WI", "WY"); + +sub randomState() +{ + return $state[int(rand(50))]; +} + +our @classname = ("american history", "biology", "chemistry", "debate", + "education", "forestry", "geology", "history", "industrial engineering", + "joggying", "kindergarten", "linguistics", "mathematics", "nap time", + "opthamology", "philosophy", "quiet hour", "religion", "study skills", + "topology", "undecided", "values clariffication", "wind surfing", + "xylophone band", "yard duty", "zync studies"); + +sub randomClass() +{ + return $classname[int(rand(26))]; +} + +our @grade = ("A", "A-", "B+", "B", "B-", "C+", "C", "C-", "D+", "D", "D-", + "F"); + +sub randomGrade() +{ + return $grade[int(rand(int(@grade)))]; +} + +our @registration = ("democrat", "green", "independent", "libertarian", + "republican", "socialist"); + +sub randomRegistration() +{ + return $registration[int(rand(int(@registration)))]; +} + +sub randomAge() +{ + return (int(rand(60)) + 18); +} + +sub randomGpa() +{ + return rand(4.0); +} + +our @street = ("A", "B", "C", "D", "E", "F", "G", "H", "I", + "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", + "T", "U", "V", "W", "X", "Y", "Z"); + +sub randomStreet() +{ + return sprintf("%d %s st", int(rand(1000)), $street[int(rand(26))]); +} + +sub randomZip() +{ + return int(rand(100000)); +} + +sub randomContribution() +{ + return sprintf("%.2f", rand(1000)); +} + +our @numLetter = ("1", "09", "09a"); + +sub randomNumLetter() +{ + return $numLetter[int(rand(int(@numLetter)))]; +} + +our @greekLetter = ( "alpha", "beta", "gamma", "delta", "epsilon", "zeta", + "eta", "theta", "iota", "kappa", "lambda", "mu", "nu", "xi", "omicron", + "pi", "rho", "sigma", "tau", "upsilon", "chi", "phi", "psi", "omega" ); + +sub randomGreekLetter() +{ + return $greekLetter[int(rand(int(@greekLetter)))]; +} + +sub randomNameAgeGpaMap() +{ + my $size = int(rand(3)); + my $map = "["; + my @mapValues = ( "name#" . randomName(), "age#" . randomAge(), "gpa#" . randomGpa() ); + $size = ($size == 0 ? 1 : $size); + for(my $i = 0; $i <= $size; $i++) { + $map .= $mapValues[$i]; + if($i != $size) { + $map .= ","; + } + } + $map .= "]"; + return $map; +} + +sub getMapFields($) { + my $mapString = shift; + # remove the enclosing square brackets + $mapString =~ s/[\[\]]//g; + # get individual map fields + my @fields = split(/,/, $mapString); + # get only the values + my $hash; + for my $field (@fields) { + if($field =~ /(\S+)#(.*)/) { + $hash->{$1} = $2; + } + } + return $hash; +} + +sub randomNameAgeGpaTuple() +{ + my $gpa = sprintf("%0.2f", randomGpa()); + return "(" . randomName() . "," . randomAge() . "," . $gpa . ")" ; +} + +sub randomNameAgeGpaBag() +{ + my $size = int(rand(int(3))); + my $bag = "{"; + $size = ($size == 0 ? 1 : $size); + for(my $i = 0; $i <= $size; $i++) { + $bag .= randomNameAgeGpaTuple(); + if($i != $size) { + $bag .= ","; + } + } + $bag .= "}"; + return $bag; +} + +our @textDoc = ( + "The cosmological proof, which we are now about to ex-", + "amine, retains the connection of absolute necessity with the", + "highest reality, but instead of reasoning, like the former proof,", + "from the highest reality to necessity of existence, it reasons", + "from the previously given unconditioned necessity of some", + "being to the unlimited reality of that being. It thus enters upon", + "a course of reasoning which, whether rational or only pseudo-", + "rational, is at any rate natural, and the most convincing not", + "only for common sense but even for speculative understand-", + "ing. It also sketches the first outline of all the proofs in natural", + "theology, an outline which has always been and always will", + "be followed, however much embellished and disguised by", + "superfluous additions. This proof, termed by Leibniz the proof", + "a contingentia mundi, we shall now proceed to expound and", + "examine."); + +sub usage() +{ + warn "Usage: $0 filetype numrows tablename targetdir [nosql]\n"; + warn "\tValid filetypes [studenttab, studentcolon, \n"; + warn "\t\tstudentnulltab, studentcomplextab, studentctrla, voternulltab\n"; + warn "\t\tvotertab, reg1459894, textdoc, unicode, manual]\n"; +} + +our @greekUnicode = ("\N{U+03b1}", "\N{U+03b2}", "\N{U+03b3}", "\N{U+03b4}", + "\N{U+03b5}", "\N{U+03b6}", "\N{U+03b7}", "\N{U+03b8}", "\N{U+03b9}", + "\N{U+03ba}", "\N{U+03bb}", "\N{U+03bc}", "\N{U+03bd}", "\N{U+03be}", + "\N{U+03bf}", "\N{U+03c0}", "\N{U+03c1}", "\N{U+03c2}", "\N{U+03c3}", + "\N{U+03c4}", "\N{U+03c5}", "\N{U+03c6}", "\N{U+03c7}", "\N{U+03c8}", + "\N{U+03c9}"); + +sub randomUnicodeNonAscii() +{ + my $name = $firstName[int(rand(int(@firstName)))] . + $greekUnicode[int(rand(int(@greekUnicode)))]; + return $name; +} + +my $testvar = "\N{U+03b1}\N{U+03b3}\N{U+03b1}\N{U+03c0}\N{U+03b7}"; + +sub getBulkCopyCmd(){ + my $sourceDir= shift; + my $tableName = shift; + my $delimeter = shift; + $delimeter = '\t' if ( !$delimeter ); + +# . "\nCOPY $tableName FROM \'$sourceDir/$tableName' using DELIMITERS \'". '\t' . "\' WITH NULL AS '\n';"; + + my $cmd= "\nbegin transaction;" + . "\nCOPY $tableName FROM \'$sourceDir/$tableName' using DELIMITERS \'$delimeter\';" + . "\ncommit;" + . "\n"; + + return $cmd; +} + + +# main($) +{ + # explicitly call srand so we get the same data every time + # we generate it. However, we set it individually for each table type. + # Otherwise we'd be generating the same data sets regardless of size, + # and this would really skew our joins. + + my $filetype = shift; + my $numRows = shift; + my $tableName = shift; + my $targetDir= shift; + my $nosql = shift; + + die usage() if (!defined($filetype) || !defined($numRows)); + + if ($numRows <= 0) { usage(); } + + if ( $targetDir ) { + open(HDFS, "> $targetDir/$tableName") or die("Cannot open file $tableName, $!\n"); + open(PSQL, "> $targetDir/$tableName.sql") or die("Cannot open file $tableName.sql, $!\n") unless defined $nosql; + } else { + open(HDFS, "> $tableName") or die("Cannot open file $tableName, $!\n"); + open(PSQL, "> $tableName.sql") or die("Cannot open file $tableName.sql, $!\n") unless defined $nosql; + } + + if ($filetype eq "manual") { + } elsif ($filetype eq "studenttab") { + srand(3.14159 + $numRows); + print PSQL "create table $tableName (name varchar(100), age integer, gpa float(3));\n" unless defined $nosql; + print PSQL &getBulkCopyCmd( $targetDir, $tableName ) unless defined $nosql; + for (my $i = 0; $i < $numRows; $i++) { + my $name = randomName(); + my $age = randomAge(); + my $gpa = randomGpa(); + printf HDFS "%s\t%d\t%.2f\n", $name, $age, $gpa; + } + + } elsif ($filetype eq "studentnulltab") { + srand(3.14159 + $numRows); + print PSQL "create table $tableName (name varchar(100), age integer, gpa float(3));\n"; + print PSQL "begin transaction;\n"; + for (my $i = 0; $i < $numRows; $i++) { + # generate nulls in a random fashion + my $name = rand(1) < 0.05 ? '' : randomName(); + my $age = rand(1) < 0.05 ? '' : randomAge(); + my $gpa = rand(1) < 0.05 ? '' : randomGpa(); + printf PSQL "insert into $tableName (name, age, gpa) values("; + print PSQL ($name eq ''? "null, " : "'$name', "), ($age eq ''? "null, " : "$age, "); + if($gpa eq '') { + print PSQL "null);\n" + } else { + printf PSQL "%.2f);\n", $gpa; + } + print HDFS "$name\t$age\t"; + if($gpa eq '') { + print HDFS "\n" + } else { + printf HDFS "%.2f\n", $gpa; + } + + } + print PSQL "commit;\n" unless defined $nosql; + + } elsif ($filetype eq "studentcolon") { + srand(2.718281828459 + $numRows); + print PSQL "create table $tableName (name varchar(100), age integer, gpa float(3));\n" unless defined $nosql; + print PSQL &getBulkCopyCmd( $targetDir, $tableName, ':' ) unless defined $nosql; + for (my $i = 0; $i < $numRows; $i++) { + my $name = randomName(); + my $age = randomAge(); + my $gpa = randomGpa(); + printf HDFS "%s:%d:%.2f\n", $name, $age, $gpa; +=begin + } elsif ($filetype eq "studentusrdef") { + srand(6.62606896 + $numRows); + for (my $i = 0; $i < $numRows; $i++) { + # TODO need to add SQL info. + printf("%s,%d,%.2f,", randomName(), randomAge(), randomGpa()); + printf("<%s,%s,%s,%d>,", randomStreet(), randomCity(), randomState(), + randomZip()); + printf("[%s:<%s,%s>],", randomClass(), randomClass(), randomName()); + printf("{"); + my $elementsInBag = int(rand(100)); + for (my $j = 0; $j < $elementsInBag; $j++) { + if ($j != 0) { printf(","); } + printf("<%s,%s,%s>", randomClass(), randomName(), randomGrade()); + } + printf("}\n"); + } +=cut + } + print PSQL "commit;\n" unless defined $nosql; + + } elsif ($filetype eq "studentctrla") { + srand(6.14159 + $numRows); + print PSQL "create table $tableName (name varchar(100), age integer, gpa float(3));\n"; + print PSQL "begin transaction;\n"; + for (my $i = 0; $i < $numRows; $i++) { + my $name = randomName(); + my $age = randomAge(); + my $gpa = randomGpa(); + printf PSQL "insert into $tableName (name, age, gpa) values('%s', %d, %.2f);\n", + $name, $age, $gpa; + printf HDFS "%s%d%.2f\n", $name, $age, $gpa; + } + print PSQL "commit;\n" unless defined $nosql; + + + } elsif ($filetype eq "studentcomplextab") { + srand(3.14159 + $numRows); + print PSQL "create table $tableName (nameagegpamap varchar(500), nameagegpatuple varchar(500), nameagegpabag varchar(500), nameagegpamap_name varchar(500), nameagegpamap_age integer, nameagegpamap_gpa float(3));\n"; + print PSQL "begin transaction;\n"; + for (my $i = 0; $i < $numRows; $i++) { + # generate nulls in a random fashion + my $map = rand(1) < 0.05 ? '' : randomNameAgeGpaMap(); + my $tuple = rand(1) < 0.05 ? '' : randomNameAgeGpaTuple(); + my $bag = rand(1) < 0.05 ? '' : randomNameAgeGpaBag(); + printf PSQL "insert into $tableName (nameagegpamap, nameagegpatuple, nameagegpabag, nameagegpamap_name, nameagegpamap_age, nameagegpamap_gpa) values("; + my $mapHash; + if($map ne '') { + $mapHash = getMapFields($map); + } + + print PSQL ($map eq ''? "null, " : "'$map', "), + ($tuple eq ''? "null, " : "'$tuple', "), + ($bag eq '' ? "null, " : "'$bag', "), + ($map eq '' ? "null, " : (exists($mapHash->{'name'}) ? "'".$mapHash->{'name'}."', " : "null, ")), + ($map eq '' ? "null, " : (exists($mapHash->{'age'}) ? "'".$mapHash->{'age'}."', " : "null, ")), + ($map eq '' ? "null);\n" : (exists($mapHash->{'gpa'}) ? "'".$mapHash->{'gpa'}."');\n" : "null);\n")); + print HDFS "$map\t$tuple\t$bag\n"; + } + print PSQL "commit;\n" unless defined $nosql; + + } elsif ($filetype eq "votertab") { + srand(299792458 + $numRows); + print PSQL "create table $tableName (name varchar(100), age integer, registration varchar(20), contributions float);\n" unless defined $nosql; + print PSQL &getBulkCopyCmd( $targetDir, $tableName ) unless defined $nosql; + for (my $i = 0; $i < $numRows; $i++) { + my $name = randomName(); + my $age = randomAge(); + my $registration = randomRegistration(); + my $contribution = randomContribution(); + printf HDFS "%s\t%d\t%s\t%.2f\n", $name, $age, + $registration, $contribution; + } + + } elsif ($filetype eq "voternulltab") { + srand(299792458 + $numRows); + print PSQL "create table $tableName (name varchar(100), age integer, registration varchar(20), contributions float);\n" unless defined $nosql; + print PSQL "begin transaction;\n" unless defined $nosql; + for (my $i = 0; $i < $numRows; $i++) { + # generate nulls in a random fashion + my $name = rand(1) < 0.05 ? '' : randomName(); + my $age = rand(1) < 0.05 ? '' : randomAge(); + my $registration = rand(1) < 0.05 ? '' : randomRegistration(); + my $contribution = rand(1) < 0.05 ? '' : randomContribution(); + printf PSQL "insert into $tableName (name, age, registration, contributions) values("; + print PSQL ($name eq ''? "null, " : "'$name', "), + ($age eq ''? "null, " : "$age, "), + ($registration eq ''? "null, " : "'$registration', "); + if($contribution eq '') { + print PSQL "null);\n" + } else { + printf PSQL "%.2f);\n", $contribution; + } + print HDFS "$name\t$age\t$registration\t"; + if($contribution eq '') { + print HDFS "\n" + } else { + printf HDFS "%.2f\n", $contribution; + } + } + print PSQL "commit;\n" unless defined $nosql; + + } elsif ($filetype eq "reg1459894") { + srand(6.67428 + $numRows); + print PSQL "create table $tableName (first varchar(10), second varchar(10));\n" unless defined $nosql; + print PSQL &getBulkCopyCmd( $targetDir, $tableName ) unless defined $nosql; + for (my $i = 0; $i < $numRows; $i++) { + my $letter = randomNumLetter(); + my $gkLetter = randomGreekLetter(); + printf HDFS "%s\t%s\n", $letter, $gkLetter; + } + + } elsif ($filetype eq "textdoc") { + # This one ignores the number of lines. It isn't random either. + print PSQL "create table $tableName (name varchar(255));\n" unless defined $nosql; + print PSQL "begin transaction;\n" unless defined $nosql; + for (my $i = 0; $i < @textDoc; $i++) { + my $sqlWords = $textDoc[$i]; + $sqlWords =~ s/([\w-]+)/$1,/g; + print PSQL "insert into $tableName (name) values('($sqlWords)');\n" unless defined $nosql; + print HDFS "$textDoc[$i]\n"; + } + print PSQL "commit;\n" unless defined $nosql; + + + } elsif ($filetype eq "unicode") { + srand(1.41421 + $numRows); + print PSQL "create table $tableName (name varchar(255));\n" unless defined $nosql; + print PSQL "begin transaction;\n" unless defined $nosql; + for (my $i = 0; $i < $numRows; $i++) { + my $name = randomUnicodeNonAscii(); + printf PSQL "insert into $tableName (name) values('%s');\n", + $name unless defined $nosql; + printf HDFS "%s\n", $name; + } + print PSQL "commit;\n" unless defined $nosql; + + } else { + warn "Unknown filetype $filetype\n"; + usage(); + } +} + + Index: src/test/e2e/hcatalog/udfs/java/org/apache/hcatalog/utils/HCatTypeCheck.java =================================================================== --- src/test/e2e/hcatalog/udfs/java/org/apache/hcatalog/utils/HCatTypeCheck.java (revision 0) +++ src/test/e2e/hcatalog/udfs/java/org/apache/hcatalog/utils/HCatTypeCheck.java (revision 0) @@ -0,0 +1,152 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.hcatalog.utils; + +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.util.HashMap; +import java.util.Map; +import java.util.Map.Entry; + +import org.apache.pig.EvalFunc; +import org.apache.pig.data.DataBag; +import org.apache.pig.data.DataType; +import org.apache.pig.data.Tuple; +import org.apache.pig.impl.logicalLayer.schema.Schema; +import org.apache.pig.impl.util.Utils; + +/** + * This UDF can be used to check that a tuple presented by HCatLoader has the + * right types for the fields + * + * Usage is : + * + * register testudf.jar; + * a = load 'numbers' using HCatLoader(...); + * b = foreach a generate HCatTypeCheck('intnum1000:int,id:int,intnum5:int,intnum100:int,intnum:int,longnum:long,floatnum:float,doublenum:double', *); + * store b into 'output'; + * + * The schema string (the first argument to the UDF) is of the form one would provide in a + * pig load statement. + * + * The output should only contain the value '1' in all rows. (This UDF returns + * the integer value 1 if all fields have the right type, else throws IOException) + * + */ +public class HCatTypeCheck extends EvalFunc { + + static HashMap> typeMap = new HashMap>(); + + @Override + public Integer exec(Tuple input) throws IOException { + String schemaStr = (String) input.get(0); + Schema s = null; + try { + s = getSchemaFromString(schemaStr); + } catch (Exception e) { + throw new IOException(e); + } + for(int i = 0; i < s.size(); i++) { + check(s.getField(i).type, input.get(i+1)); // input.get(i+1) since input.get(0) is the schema; + } + return 1; + } + + static { + typeMap.put(DataType.INTEGER, Integer.class); + typeMap.put(DataType.LONG, Long.class); + typeMap.put(DataType.FLOAT, Float.class); + typeMap.put(DataType.DOUBLE, Double.class); + typeMap.put(DataType.CHARARRAY, String.class); + typeMap.put(DataType.TUPLE, Tuple.class); + typeMap.put(DataType.MAP, Map.class); + typeMap.put(DataType.BAG, DataBag.class); + } + + + + private void die(String expectedType, Object o) throws IOException { + throw new IOException("Expected " + expectedType + ", got " + + o.getClass().getName()); + } + + + private String check(Byte type, Object o) throws IOException { + if(o == null) { + return ""; + } + if(check(typeMap.get(type), o)) { + if(type.equals(DataType.MAP)) { + Map m = (Map) o; + check(m); + } else if(type.equals(DataType.BAG)) { + DataBag bg = (DataBag) o; + for (Tuple tuple : bg) { + Map m = (Map) tuple.get(0); + check(m); + } + } else if(type.equals(DataType.TUPLE)) { + Tuple t = (Tuple) o; + if(!check(Integer.class, t.get(0)) || + !check(String.class, t.get(1)) || + !check(Double.class, t.get(2))) { + die("t:tuple(num:int,str:string,dbl:double)", t); + } + } + } else { + die(typeMap.get(type).getName(), o); + } + return o.toString(); + } + + /** + * @param m + * @throws IOException + */ + private void check(Map m) throws IOException { + for(Entry e: m.entrySet()) { + // just access key and value to ensure they are correct + if(!check(String.class, e.getKey())) { + die("String", e.getKey()); + } + if(!check(String.class, e.getValue())) { + die("String", e.getValue()); + } + } + + } + + private boolean check(Class expected, Object actual) { + if(actual == null) { + return true; + } + return expected.isAssignableFrom(actual.getClass()); + } + + Schema getSchemaFromString(String schemaString) throws Exception { + /** ByteArrayInputStream stream = new ByteArrayInputStream(schemaString.getBytes()) ; + QueryParser queryParser = new QueryParser(stream) ; + Schema schema = queryParser.TupleSchema() ; + Schema.setSchemaDefaultType(schema, org.apache.pig.data.DataType.BYTEARRAY); + return schema; + */ + return Utils.getSchemaFromString(schemaString); + } + +} Index: src/test/e2e/hcatalog/udfs/java/org/apache/hcatalog/utils/SumNumbers.java =================================================================== --- src/test/e2e/hcatalog/udfs/java/org/apache/hcatalog/utils/SumNumbers.java (revision 0) +++ src/test/e2e/hcatalog/udfs/java/org/apache/hcatalog/utils/SumNumbers.java (revision 0) @@ -0,0 +1,257 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.hcatalog.utils; + +import java.io.DataInput; +import java.io.DataOutput; +import java.io.IOException; + +import org.apache.hadoop.conf.Configuration; +import org.apache.hadoop.fs.Path; +import org.apache.hadoop.io.DoubleWritable; +import org.apache.hadoop.io.FloatWritable; +import org.apache.hadoop.io.IntWritable; +import org.apache.hadoop.io.LongWritable; +import org.apache.hadoop.io.Text; +import org.apache.hadoop.io.Writable; +import org.apache.hadoop.io.WritableComparable; +import org.apache.hadoop.mapreduce.Job; +import org.apache.hadoop.mapreduce.Mapper; +import org.apache.hadoop.mapreduce.Reducer; +import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat; +import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat; +import org.apache.hadoop.util.GenericOptionsParser; +import org.apache.hcatalog.common.HCatConstants; +import org.apache.hcatalog.data.HCatRecord; +import org.apache.hcatalog.mapreduce.HCatInputFormat; +import org.apache.hcatalog.mapreduce.HCatTableInfo; + +/** + * This is a map reduce test for testing hcat which goes against the "numbers" + * table. It performs a group by on the first column and a SUM operation on the + * other columns. This is to simulate a typical operation in a map reduce program + * to test that hcat hands the right data to the map reduce program + * + * Usage: hadoop jar sumnumbers <-libjars hive-hcat jar> + The argument controls the output delimiter + The hcat jar location should be specified as file:// + */ +public class SumNumbers { + + private static final String NUMBERS_TABLE_NAME = "numbers"; + private static final String TAB = "\t"; + + public static class SumMapper + extends Mapper{ + + IntWritable intnum1000; + // though id is given as a Short by hcat, the map will emit it as an + // IntWritable so we can just sum in the reduce + IntWritable id; + + // though intnum5 is handed as a Byte by hcat, the map() will emit it as + // an IntWritable so we can just sum in the reduce + IntWritable intnum5; + IntWritable intnum100; + IntWritable intnum; + LongWritable longnum; + FloatWritable floatnum; + DoubleWritable doublenum; + @Override + protected void map(WritableComparable key, HCatRecord value, + org.apache.hadoop.mapreduce.Mapper.Context context) + throws IOException ,InterruptedException { + intnum1000 = new IntWritable((Integer)value.get(0)); + id = new IntWritable((Short) value.get(1)); + intnum5 = new IntWritable(((Byte)value.get(2))); + intnum100 = new IntWritable(((Integer) value.get(3))); + intnum = new IntWritable((Integer) value.get(4)); + longnum = new LongWritable((Long) value.get(5)); + floatnum = new FloatWritable((Float) value.get(6)); + doublenum = new DoubleWritable((Double) value.get(7)); + SumNumbers.ArrayWritable outputValue = new SumNumbers.ArrayWritable(id, + intnum5, intnum100, intnum, longnum, floatnum, doublenum); + context.write(intnum1000, outputValue); + + } + } + + public static class SumReducer extends Reducer { + + + LongWritable dummyLong = null; + @Override + protected void reduce(IntWritable key, java.lang.Iterable + values, org.apache.hadoop.mapreduce.Reducer.Context context) + throws IOException ,InterruptedException { + String output = key.toString() + TAB; + Long sumid = 0l; + Long sumintnum5 = 0l; + Long sumintnum100 = 0l; + Long sumintnum = 0l; + Long sumlongnum = 0l; + Float sumfloatnum = 0.0f; + Double sumdoublenum = 0.0; + for (ArrayWritable value : values) { + sumid += value.id.get(); + sumintnum5 += value.intnum5.get(); + sumintnum100 += value.intnum100.get(); + sumintnum += value.intnum.get(); + sumlongnum += value.longnum.get(); + sumfloatnum += value.floatnum.get(); + sumdoublenum += value.doublenum.get(); + } + output += sumid + TAB; + output += sumintnum5 + TAB; + output += sumintnum100 + TAB; + output += sumintnum + TAB; + output += sumlongnum + TAB; + output += sumfloatnum + TAB; + output += sumdoublenum + TAB; + context.write(dummyLong, new Text(output)); + } + } + + public static void main(String[] args) throws Exception { + Configuration conf = new Configuration(); + args = new GenericOptionsParser(conf, args).getRemainingArgs(); + String[] otherArgs = new String[4]; + int j = 0; + for(int i = 0; i < args.length; i++) { + if(args[i].equals("-libjars")) { + // generic options parser doesn't seem to work! + conf.set("tmpjars", args[i+1]); + i = i+1; // skip it , the for loop will skip its value + } else { + otherArgs[j++] = args[i]; + } + } + if (otherArgs.length != 4) { + System.err.println("Usage: hadoop jar sumnumbers <-libjars hive-hcat jar>\n" + + "The argument controls the output delimiter.\n" + + "The hcat jar location should be specified as file://\n"); + System.exit(2); + } + String serverUri = otherArgs[0]; + String tableName = NUMBERS_TABLE_NAME; + String outputDir = otherArgs[1]; + String dbName = "default"; + + String principalID = System.getProperty(HCatConstants.HCAT_METASTORE_PRINCIPAL); + if(principalID != null) + conf.set(HCatConstants.HCAT_METASTORE_PRINCIPAL, principalID); + Job job = new Job(conf, "sumnumbers"); + HCatInputFormat.setInput(job, HCatTableInfo.getInputTableInfo(serverUri, + principalID,dbName, tableName)); + // initialize HCatOutputFormat + + job.setInputFormatClass(HCatInputFormat.class); + job.setOutputFormatClass(TextOutputFormat.class); + job.setJarByClass(SumNumbers.class); + job.setMapperClass(SumMapper.class); + job.setReducerClass(SumReducer.class); + job.setMapOutputKeyClass(IntWritable.class); + job.setMapOutputValueClass(ArrayWritable.class); + job.setOutputKeyClass(LongWritable.class); + job.setOutputValueClass(Text.class); + FileOutputFormat.setOutputPath(job, new Path(outputDir)); + System.exit(job.waitForCompletion(true) ? 0 : 1); + } + + public static class ArrayWritable implements Writable { + + // though id is given as a Short by hcat, the map will emit it as an + // IntWritable so we can just sum in the reduce + IntWritable id; + + // though intnum5 is handed as a Byte by hcat, the map() will emit it as + // an IntWritable so we can just sum in the reduce + IntWritable intnum5; + + IntWritable intnum100; + IntWritable intnum; + LongWritable longnum; + FloatWritable floatnum; + DoubleWritable doublenum; + + /** + * + */ + public ArrayWritable() { + id = new IntWritable(); + intnum5 = new IntWritable(); + intnum100 = new IntWritable(); + intnum = new IntWritable(); + longnum = new LongWritable(); + floatnum = new FloatWritable(); + doublenum = new DoubleWritable(); + } + + + + /** + * @param id + * @param intnum5 + * @param intnum100 + * @param intnum + * @param longnum + * @param floatnum + * @param doublenum + */ + public ArrayWritable(IntWritable id, IntWritable intnum5, + IntWritable intnum100, IntWritable intnum, LongWritable longnum, + FloatWritable floatnum, DoubleWritable doublenum) { + this.id = id; + this.intnum5 = intnum5; + this.intnum100 = intnum100; + this.intnum = intnum; + this.longnum = longnum; + this.floatnum = floatnum; + this.doublenum = doublenum; + } + + + + @Override + public void readFields(DataInput in) throws IOException { + id.readFields(in); + intnum5.readFields(in); + intnum100.readFields(in); + intnum.readFields(in); + longnum.readFields(in); + floatnum.readFields(in); + doublenum.readFields(in); + } + + @Override + public void write(DataOutput out) throws IOException { + id.write(out); + intnum5.write(out); + intnum100.write(out); + intnum.write(out); + longnum.write(out); + floatnum.write(out); + doublenum.write(out); + + } + + } +} Index: src/test/e2e/hcatalog/udfs/java/org/apache/hcatalog/utils/PartitionStorageDriverAnnotator.java =================================================================== --- src/test/e2e/hcatalog/udfs/java/org/apache/hcatalog/utils/PartitionStorageDriverAnnotator.java (revision 0) +++ src/test/e2e/hcatalog/udfs/java/org/apache/hcatalog/utils/PartitionStorageDriverAnnotator.java (revision 0) @@ -0,0 +1,114 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.hcatalog.utils; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.apache.hadoop.hive.conf.HiveConf; +import org.apache.hadoop.hive.metastore.HiveMetaStoreClient; +import org.apache.hadoop.hive.metastore.api.InvalidOperationException; +import org.apache.hadoop.hive.metastore.api.MetaException; +import org.apache.hadoop.hive.metastore.api.NoSuchObjectException; +import org.apache.hadoop.hive.metastore.api.Partition; +import org.apache.hcatalog.rcfile.RCFileInputDriver; +import org.apache.hcatalog.rcfile.RCFileOutputDriver; +import org.apache.thrift.TException; + +/** + * A utility program to annotate partitions of a pre-created table + * with input storage driver and output storage driver information + */ +public class PartitionStorageDriverAnnotator { + + /** + * @param args + * @throws MetaException + * @throws TException + * @throws NoSuchObjectException + * @throws InvalidOperationException + */ + public static void main(String[] args) throws MetaException, NoSuchObjectException, + TException, InvalidOperationException { + String thrifturi = null; + String database = "default"; + String table = null; + String isd = null; + String osd = null; + Map m = new HashMap(); + for(int i = 0; i < args.length; i++) { + if(args[i].equals("-u")) { + thrifturi = args[i+1]; + } else if(args[i].equals("-t")) { + table = args[i+1]; + } else if (args[i].equals("-i")) { + isd = args[i+1]; + } else if (args[i].equals("-o")) { + osd = args[i+1]; + } else if (args[i].equals("-p")) { + String[] kvps = args[i+1].split(";"); + for(String kvp: kvps) { + String[] kv = kvp.split("="); + if(kv.length != 2) { + System.err.println("ERROR: key value property pairs must be specified as key1=val1;key2=val2;..;keyn=valn"); + System.exit(1); + } + m.put(kv[0], kv[1]); + } + } else if(args[i].equals("-d")) { + database = args[i+1]; + } else { + System.err.println("ERROR: Unknown option: " + args[i]); + usage(); + } + i++; // to skip the value for an option + } + if(table == null || thrifturi == null) { + System.err.println("ERROR: thrift uri and table name are mandatory"); + usage(); + } + HiveConf hiveConf = new HiveConf(PartitionStorageDriverAnnotator.class); + hiveConf.set("hive.metastore.local", "false"); + hiveConf.set("hive.metastore.uris", thrifturi); + + HiveMetaStoreClient hmsc = new HiveMetaStoreClient(hiveConf,null); + List parts = hmsc.listPartitions(database, table, Short.MAX_VALUE); + + m.put("hcat.isd", isd != null ? isd : RCFileInputDriver.class.getName()); + m.put("hcat.osd", osd != null ? osd : RCFileOutputDriver.class.getName()); + + for(Partition p: parts) { + p.setParameters(m); + hmsc.alter_partition(database, table, p); + } + } + + /** + * + */ + private static void usage() { + System.err.println("Usage: java -cp testudf.jar: org.apache.hcat.utils.PartitionStorageDriverAnnotator -u -t " + + " [-i input driver classname (Default rcfiledriver)] [-o output driver classname (default rcfiledriver)] " + + " [-p key1=val1;key2=val2;..;keyn=valn (list of key=value property pairs to associate with each partition)]" + + " [-d database (if this not supplied the default database is used)]"); + System.exit(1); + } + +} Index: src/test/e2e/hcatalog/udfs/java/org/apache/hcatalog/utils/StoreDemo.java =================================================================== --- src/test/e2e/hcatalog/udfs/java/org/apache/hcatalog/utils/StoreDemo.java (revision 0) +++ src/test/e2e/hcatalog/udfs/java/org/apache/hcatalog/utils/StoreDemo.java (revision 0) @@ -0,0 +1,151 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.hcatalog.utils; + +import java.io.IOException; +import java.util.HashMap; +import java.util.Map; +import java.util.Random; + +import org.apache.hadoop.conf.Configuration; +import org.apache.hadoop.io.IntWritable; +import org.apache.hadoop.io.WritableComparable; +import org.apache.hadoop.mapreduce.Job; +import org.apache.hadoop.mapreduce.Mapper; +import org.apache.hadoop.util.GenericOptionsParser; +import org.apache.hcatalog.common.HCatConstants; +import org.apache.hcatalog.data.DefaultHCatRecord; +import org.apache.hcatalog.data.HCatRecord; +import org.apache.hcatalog.data.schema.HCatSchema; +import org.apache.hcatalog.mapreduce.HCatInputFormat; +import org.apache.hcatalog.mapreduce.HCatOutputFormat; +import org.apache.hcatalog.mapreduce.HCatTableInfo; + +/** + * This is a map reduce test for testing hcat which goes against the "numbers" + * table and writes data to another table. It reads data from numbers which + * is an unpartitioned table and adds 10 to each field. It stores the result into + * the datestamp='20100101' partition of the numbers_part_empty_initially table if the second + * command line arg is "part". If the second cmdline arg is "nopart" then the + * result is stored into the 'numbers_nopart_empty_initially' (unpartitioned) table. + * If the second cmdline arg is "nopart_pig", then the result is stored into the + * 'numbers_nopart_pig_empty_initially' (unpartitioned) table with the tinyint + * and smallint columns in "numbers" being stored as "int" (since pig cannot handle + * tinyint and smallint) + * + * Usage: hadoop jar storenumbers <-libjars hive-hcat jar> + If the second argument is "part" data is written to datestamp = '2010101' partition of the numbers_part_empty_initially table. + If the second argument is "nopart", data is written to the unpartitioned numbers_nopart_empty_initially table. + If the second argument is "nopart_pig", data is written to the unpartitioned numbers_nopart_pig_empty_initially table. + The hcat jar location should be specified as file:// + */ +public class StoreDemo { + + private static final String NUMBERS_PARTITIONED_TABLE_NAME = "demo_partitioned"; + private static final String NUMBERS_TABLE_NAME = "demo"; + + public static class SumMapper + extends Mapper{ + + + Integer intnum; + + Double doublenum; + @Override + protected void map(WritableComparable key, HCatRecord value, + org.apache.hadoop.mapreduce.Mapper.Context context) + throws IOException ,InterruptedException { + intnum = ((Integer)value.get(0)); + value.set(0, intnum + 20); + doublenum = ((Double) value.get(1)); + value.set(1, (Double) (doublenum + 20)); + context.write(new IntWritable(0), value); + + } + } + + + public static void main(String[] args) throws Exception { + Configuration conf = new Configuration(); + args = new GenericOptionsParser(conf, args).getRemainingArgs(); + String[] otherArgs = new String[1]; + int j = 0; + for(int i = 0; i < args.length; i++) { + if(args[i].equals("-libjars")) { + // generic options parser doesn't seem to work! + conf.set("tmpjars", args[i+1]); + i = i+1; // skip it , the for loop will skip its value + } else { + otherArgs[j++] = args[i]; + } + } + if (otherArgs.length != 1) { + usage(); + } + String serverUri = otherArgs[0]; + + String tableName = NUMBERS_TABLE_NAME; + String dbName = "default"; + Map outputPartitionKvps = new HashMap(); + String outputTableName = NUMBERS_PARTITIONED_TABLE_NAME; + outputPartitionKvps.put("datestamp", "20100102"); + + String principalID = System.getProperty(HCatConstants.HCAT_METASTORE_PRINCIPAL); + if(principalID != null) + conf.set(HCatConstants.HCAT_METASTORE_PRINCIPAL, principalID); + Job job = new Job(conf, "storedemo"); + // initialize HCatInputFormat + HCatInputFormat.setInput(job, HCatTableInfo.getInputTableInfo(serverUri, + principalID,dbName, tableName)); + // initialize HCatOutputFormat + HCatOutputFormat.setOutput(job, HCatTableInfo.getOutputTableInfo(serverUri, + principalID,dbName, outputTableName, outputPartitionKvps)); + // test with and without specifying schema randomly + HCatSchema s = HCatInputFormat.getTableSchema(job); + System.err.println("INFO: output schema explicitly set for writing:" + s); + HCatOutputFormat.setSchema(job, s); + + job.setInputFormatClass(HCatInputFormat.class); + job.setOutputFormatClass(HCatOutputFormat.class); + job.setJarByClass(StoreDemo.class); + job.setMapperClass(SumMapper.class); + job.setOutputKeyClass(IntWritable.class); + job.setNumReduceTasks(0); + job.setOutputValueClass(DefaultHCatRecord.class); + System.exit(job.waitForCompletion(true) ? 0 : 1); + } + + + /** + * + */ + private static void usage() { + System.err.println("Usage: hadoop jar storenumbers <-libjars hive-hcat jar>\n" + + "\tIf the second argument is \"part\" data is written to datestamp = '2010101' partition of " + + "the numbers_part_empty_initially table.\n\tIf the second argument is \"nopart\", data is written to " + + "the unpartitioned numbers_nopart_empty_initially table.\n\tIf the second argument is \"nopart_pig\", " + + "data is written to the unpartitioned numbers_nopart_pig_empty_initially table.\nt" + + "The hcat jar location should be specified as file://\n"); + System.exit(2); + + } + + +} Index: src/test/e2e/hcatalog/udfs/java/org/apache/hcatalog/utils/StoreComplex.java =================================================================== --- src/test/e2e/hcatalog/udfs/java/org/apache/hcatalog/utils/StoreComplex.java (revision 0) +++ src/test/e2e/hcatalog/udfs/java/org/apache/hcatalog/utils/StoreComplex.java (revision 0) @@ -0,0 +1,134 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.hcatalog.utils; + +import java.io.IOException; +import java.util.HashMap; +import java.util.Map; +import java.util.Random; + +import org.apache.hadoop.conf.Configuration; +import org.apache.hadoop.io.IntWritable; +import org.apache.hadoop.io.WritableComparable; +import org.apache.hadoop.mapreduce.Job; +import org.apache.hadoop.mapreduce.Mapper; +import org.apache.hadoop.util.GenericOptionsParser; +import org.apache.hcatalog.common.HCatConstants; +import org.apache.hcatalog.data.DefaultHCatRecord; +import org.apache.hcatalog.data.HCatRecord; +import org.apache.hcatalog.data.schema.HCatSchema; +import org.apache.hcatalog.mapreduce.HCatInputFormat; +import org.apache.hcatalog.mapreduce.HCatOutputFormat; +import org.apache.hcatalog.mapreduce.HCatTableInfo; + +/** + * This is a map reduce test for testing hcat which goes against the "complex" + * table and writes to "complex_nopart_empty_initially" table. It reads data from complex which + * is an unpartitioned table and stores the data as-is into complex_empty_initially table + * (which is also unpartitioned) + * + * Usage: hadoop jar testudf.jar storecomplex <-libjars hive-hcat jar> + The hcat jar location should be specified as file:// + */ +public class StoreComplex { + + private static final String COMPLEX_TABLE_NAME = "complex"; + private static final String COMPLEX_NOPART_EMPTY_INITIALLY_TABLE_NAME = "complex_nopart_empty_initially"; + + + public static class ComplexMapper + extends Mapper{ + + @Override + protected void map(WritableComparable key, HCatRecord value, + org.apache.hadoop.mapreduce.Mapper.Context context) + throws IOException ,InterruptedException { + // just write out the value as-is + context.write(new IntWritable(0), value); + + } + } + + + public static void main(String[] args) throws Exception { + Configuration conf = new Configuration(); + args = new GenericOptionsParser(conf, args).getRemainingArgs(); + String[] otherArgs = new String[1]; + int j = 0; + for(int i = 0; i < args.length; i++) { + if(args[i].equals("-libjars")) { + // generic options parser doesn't seem to work! + conf.set("tmpjars", args[i+1]); + i = i+1; // skip it , the for loop will skip its value + } else { + otherArgs[j++] = args[i]; + } + } + if (otherArgs.length != 1) { + usage(); + } + String serverUri = otherArgs[0]; + String tableName = COMPLEX_TABLE_NAME; + String dbName = "default"; + Map outputPartitionKvps = new HashMap(); + String outputTableName = null; + outputTableName = COMPLEX_NOPART_EMPTY_INITIALLY_TABLE_NAME; + // test with null or empty randomly + if(new Random().nextInt(2) == 0) { + System.err.println("INFO: output partition keys set to null for writing"); + outputPartitionKvps = null; + } + String principalID = System.getProperty(HCatConstants.HCAT_METASTORE_PRINCIPAL); + if(principalID != null) + conf.set(HCatConstants.HCAT_METASTORE_PRINCIPAL, principalID); + Job job = new Job(conf, "storecomplex"); + // initialize HCatInputFormat + + HCatInputFormat.setInput(job, HCatTableInfo.getInputTableInfo(serverUri, + principalID,dbName, tableName)); + // initialize HCatOutputFormat + HCatOutputFormat.setOutput(job, HCatTableInfo.getOutputTableInfo(serverUri, + principalID,dbName, outputTableName, outputPartitionKvps)); + + + HCatSchema s = HCatInputFormat.getTableSchema(job); + HCatOutputFormat.setSchema(job, s); + job.setInputFormatClass(HCatInputFormat.class); + job.setOutputFormatClass(HCatOutputFormat.class); + job.setJarByClass(StoreComplex.class); + job.setMapperClass(ComplexMapper.class); + job.setOutputKeyClass(IntWritable.class); + job.setOutputValueClass(DefaultHCatRecord.class); + System.exit(job.waitForCompletion(true) ? 0 : 1); + } + + + /** + * + */ + private static void usage() { + System.err.println("Usage: hadoop jar testudf.jar storecomplex <-libjars hive-hcat jar>\n" + + "The hcat jar location should be specified as file://\n"); + System.exit(2); + + } + + +} Index: src/test/e2e/hcatalog/udfs/java/org/apache/hcatalog/utils/StoreNumbers.java =================================================================== --- src/test/e2e/hcatalog/udfs/java/org/apache/hcatalog/utils/StoreNumbers.java (revision 0) +++ src/test/e2e/hcatalog/udfs/java/org/apache/hcatalog/utils/StoreNumbers.java (revision 0) @@ -0,0 +1,231 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.hcatalog.utils; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Random; + +import org.apache.hadoop.conf.Configuration; +import org.apache.hadoop.io.IntWritable; +import org.apache.hadoop.io.WritableComparable; +import org.apache.hadoop.mapreduce.Job; +import org.apache.hadoop.mapreduce.Mapper; +import org.apache.hadoop.util.GenericOptionsParser; +import org.apache.hcatalog.common.HCatConstants; +import org.apache.hcatalog.data.DefaultHCatRecord; +import org.apache.hcatalog.data.HCatRecord; +import org.apache.hcatalog.data.schema.HCatFieldSchema; +import org.apache.hcatalog.data.schema.HCatSchema; +import org.apache.hcatalog.mapreduce.HCatInputFormat; +import org.apache.hcatalog.mapreduce.HCatOutputFormat; +import org.apache.hcatalog.mapreduce.HCatTableInfo; + +/** + * This is a map reduce test for testing hcat which goes against the "numbers" + * table and writes data to another table. It reads data from numbers which + * is an unpartitioned table and adds 10 to each field. It stores the result into + * the datestamp='20100101' partition of the numbers_part_empty_initially table if the second + * command line arg is "part". If the second cmdline arg is "nopart" then the + * result is stored into the 'numbers_nopart_empty_initially' (unpartitioned) table. + * If the second cmdline arg is "nopart_pig", then the result is stored into the + * 'numbers_nopart_pig_empty_initially' (unpartitioned) table with the tinyint + * and smallint columns in "numbers" being stored as "int" (since pig cannot handle + * tinyint and smallint) + * + * Usage: hadoop jar storenumbers <-libjars hive-hcat jar> + If the second argument is "part" data is written to datestamp = '2010101' partition of the numbers_part_empty_initially table. + If the second argument is "nopart", data is written to the unpartitioned numbers_nopart_empty_initially table. + If the second argument is "nopart_pig", data is written to the unpartitioned numbers_nopart_pig_empty_initially table. + The hcat jar location should be specified as file:// + */ +public class StoreNumbers { + + private static final String NUMBERS_PARTITIONED_TABLE_NAME = "numbers_part_empty_initially"; + private static final String NUMBERS_TABLE_NAME = "numbers"; + private static final String NUMBERS_NON_PARTITIONED_TABLE_NAME = "numbers_nopart_empty_initially"; + private static final String NUMBERS_NON_PARTITIONED_PIG_TABLE_NAME = "numbers_nopart_pig_empty_initially"; + private static final String IS_PIG_NON_PART_TABLE = "is.pig.non.part.table"; + + public static class SumMapper + extends Mapper{ + + Integer intnum1000; + // though id is given as a Short by hcat, the map will emit it as an + // IntWritable so we can just sum in the reduce + Short id; + + // though intnum5 is handed as a Byte by hcat, the map() will emit it as + // an IntWritable so we can just sum in the reduce + Byte intnum5; + Integer intnum100; + Integer intnum; + Long longnum; + Float floatnum; + Double doublenum; + @Override + protected void map(WritableComparable key, HCatRecord value, + org.apache.hadoop.mapreduce.Mapper.Context context) + throws IOException ,InterruptedException { + boolean isnoPartPig = context.getConfiguration().getBoolean(IS_PIG_NON_PART_TABLE, false); + intnum1000 = ((Integer)value.get(0)); + id = ((Short) value.get(1)); + intnum5 = (((Byte)value.get(2))); + intnum100 = (((Integer) value.get(3))); + intnum = ((Integer) value.get(4)); + longnum = ((Long) value.get(5)); + floatnum = ((Float) value.get(6)); + doublenum = ((Double) value.get(7)); + HCatRecord output = new DefaultHCatRecord(8); + output.set(0, intnum1000 + 10); + if(isnoPartPig) + { + output.set(1, ((int)(id + 10))); + } else { + output.set(1, ((short)(id + 10))); + } + if(isnoPartPig) { + output.set(2, (int)(intnum5 + 10)); + } else { + output.set(2, (byte) (intnum5 + 10)); + } + + output.set(3, intnum100 + 10); + output.set(4, intnum + 10); + output.set(5, (long) (longnum + 10)); + output.set(6, (float) (floatnum + 10)); + output.set(7, (double) (doublenum + 10)); + for(int i = 0; i < 8; i++) { + System.err.println("XXX: class:" + output.get(i).getClass()); + } + context.write(new IntWritable(0), output); + + } + } + + + public static void main(String[] args) throws Exception { + Configuration conf = new Configuration(); + args = new GenericOptionsParser(conf, args).getRemainingArgs(); + String[] otherArgs = new String[2]; + int j = 0; + for(int i = 0; i < args.length; i++) { + if(args[i].equals("-libjars")) { + // generic options parser doesn't seem to work! + conf.set("tmpjars", args[i+1]); + i = i+1; // skip it , the for loop will skip its value + } else { + otherArgs[j++] = args[i]; + } + } + if (otherArgs.length != 2) { + usage(); + } + String serverUri = otherArgs[0]; + if(otherArgs[1] == null || ( + !otherArgs[1].equalsIgnoreCase("part") && !otherArgs[1].equalsIgnoreCase("nopart")) + && !otherArgs[1].equalsIgnoreCase("nopart_pig")) { + usage(); + } + boolean writeToPartitionedTable = (otherArgs[1].equalsIgnoreCase("part")); + boolean writeToNonPartPigTable = (otherArgs[1].equalsIgnoreCase("nopart_pig")); + String tableName = NUMBERS_TABLE_NAME; + String dbName = "default"; + Map outputPartitionKvps = new HashMap(); + String outputTableName = null; + conf.set(IS_PIG_NON_PART_TABLE, "false"); + if(writeToPartitionedTable) { + outputTableName = NUMBERS_PARTITIONED_TABLE_NAME; + outputPartitionKvps.put("datestamp", "20100101"); + } else { + if(writeToNonPartPigTable) { + conf.set(IS_PIG_NON_PART_TABLE, "true"); + outputTableName = NUMBERS_NON_PARTITIONED_PIG_TABLE_NAME; + } else { + outputTableName = NUMBERS_NON_PARTITIONED_TABLE_NAME; + } + // test with null or empty randomly + if(new Random().nextInt(2) == 0) { + outputPartitionKvps = null; + } + } + + String principalID = System.getProperty(HCatConstants.HCAT_METASTORE_PRINCIPAL); + if(principalID != null) + conf.set(HCatConstants.HCAT_METASTORE_PRINCIPAL, principalID); + Job job = new Job(conf, "storenumbers"); + + // initialize HCatInputFormat + HCatInputFormat.setInput(job, HCatTableInfo.getInputTableInfo(serverUri, + principalID,dbName, tableName)); + // initialize HCatOutputFormat + HCatOutputFormat.setOutput(job, HCatTableInfo.getOutputTableInfo(serverUri, + principalID,dbName, outputTableName, outputPartitionKvps)); + // test with and without specifying schema randomly + HCatSchema s = HCatInputFormat.getTableSchema(job); + if(writeToNonPartPigTable) { + List newHfsList = new ArrayList(); + // change smallint and tinyint to int + for(HCatFieldSchema hfs: s.getFields()){ + if(hfs.getTypeString().equals("smallint")) { + newHfsList.add(new HCatFieldSchema(hfs.getName(), + HCatFieldSchema.Type.INT, hfs.getComment())); + } else if(hfs.getTypeString().equals("tinyint")) { + newHfsList.add(new HCatFieldSchema(hfs.getName(), + HCatFieldSchema.Type.INT, hfs.getComment())); + } else { + newHfsList.add(hfs); + } + } + s = new HCatSchema(newHfsList); + } + HCatOutputFormat.setSchema(job, s); + + + job.setInputFormatClass(HCatInputFormat.class); + job.setOutputFormatClass(HCatOutputFormat.class); + job.setJarByClass(StoreNumbers.class); + job.setMapperClass(SumMapper.class); + job.setOutputKeyClass(IntWritable.class); + job.setNumReduceTasks(0); + job.setOutputValueClass(DefaultHCatRecord.class); + System.exit(job.waitForCompletion(true) ? 0 : 1); + } + + + /** + * + */ + private static void usage() { + System.err.println("Usage: hadoop jar storenumbers <-libjars hive-hcat jar>\n" + + "\tIf the second argument is \"part\" data is written to datestamp = '2010101' partition of " + + "the numbers_part_empty_initially table.\n\tIf the second argument is \"nopart\", data is written to " + + "the unpartitioned numbers_nopart_empty_initially table.\n\tIf the second argument is \"nopart_pig\", " + + "data is written to the unpartitioned numbers_nopart_pig_empty_initially table.\nt" + + "The hcat jar location should be specified as file://\n"); + System.exit(2); + + } + + +} Index: src/test/e2e/hcatalog/udfs/java/org/apache/hcatalog/utils/TypeDataCheck.java =================================================================== --- src/test/e2e/hcatalog/udfs/java/org/apache/hcatalog/utils/TypeDataCheck.java (revision 0) +++ src/test/e2e/hcatalog/udfs/java/org/apache/hcatalog/utils/TypeDataCheck.java (revision 0) @@ -0,0 +1,182 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.hcatalog.utils; + +import java.io.IOException; +import java.util.Arrays; + +import org.apache.hadoop.conf.Configuration; +import org.apache.hadoop.fs.Path; +import org.apache.hadoop.io.Text; +import org.apache.hadoop.io.WritableComparable; +import org.apache.hadoop.mapreduce.Job; +import org.apache.hadoop.mapreduce.Mapper; +import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat; +import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat; +import org.apache.hadoop.util.GenericOptionsParser; +import org.apache.hadoop.util.Tool; +import org.apache.hadoop.util.ToolRunner; +import org.apache.hcatalog.utils.Util; +import org.apache.hcatalog.common.HCatConstants; +import org.apache.hcatalog.data.HCatRecord; +import org.apache.hcatalog.data.schema.HCatSchema; +import org.apache.hcatalog.mapreduce.HCatInputFormat; +import org.apache.hcatalog.mapreduce.HCatTableInfo; + +/** + * This is a map reduce test for testing hcat that checks that the columns + * handed by hcat have the right type and right values. It achieves the first + * objective by checking the type of the Objects representing the columns against + * the schema provided as a cmdline arg. It achieves the second objective by + * writing the data as Text to be compared against golden results. + * + * The schema specification consists of the types as given by "describe " + * with each column's type separated from the next column's type by a '+' + * + * Can be used against "numbers" and "complex" tables. + * + * Usage: hadoop jar testudf.jar typedatacheck + * <-libjars hive-hcat jar> + The argument controls the output delimiter. + The hcat jar location should be specified as file:// + */ +public class TypeDataCheck implements Tool{ + + static String SCHEMA_KEY = "schema"; + static String DELIM = "delim"; + private static Configuration conf = new Configuration(); + + public static class TypeDataCheckMapper + extends Mapper{ + + Long dummykey = null; + String[] types; + String delim = "\u0001"; + @Override + protected void setup(org.apache.hadoop.mapreduce.Mapper.Context context) + throws IOException ,InterruptedException { + String typesStr = context.getConfiguration().get(SCHEMA_KEY); + delim = context.getConfiguration().get(DELIM); + if(delim.equals("tab")) { + delim = "\t"; + } else if (delim.equals("ctrla")) { + delim = "\u0001"; + } + types = typesStr.split("\\+"); + for(int i = 0; i < types.length; i++) { + types[i] = types[i].toLowerCase(); + } + + + } + + String check(HCatRecord r) throws IOException { + String s = ""; + for(int i = 0; i < r.size(); i++) { + s += Util.check(types[i], r.get(i)); + if(i != r.size() - 1) { + s += delim; + } + } + return s; + } + + @Override + protected void map(WritableComparable key, HCatRecord value, + org.apache.hadoop.mapreduce.Mapper.Context context) + throws IOException ,InterruptedException { + context.write(dummykey, new Text(check(value))); + } + } + + public static void main(String[] args) throws Exception { + TypeDataCheck self = new TypeDataCheck(); + System.exit(ToolRunner.run(conf, self, args)); + } + + public int run(String[] args) { + try { + args = new GenericOptionsParser(conf, args).getRemainingArgs(); + String[] otherArgs = new String[5]; + int j = 0; + for(int i = 0; i < args.length; i++) { + if(args[i].equals("-libjars")) { + conf.set("tmpjars",args[i+1]); + i = i+1; // skip it , the for loop will skip its value + } else { + otherArgs[j++] = args[i]; + } + } + if (otherArgs.length !=5 ) { + System.err.println("Other args:" + Arrays.asList(otherArgs)); + System.err.println("Usage: hadoop jar testudf.jar typedatacheck " + + " " + + " <-libjars hive-hcat jar>\n" + + "The argument controls the output delimiter.\n" + + "The hcat jar location should be specified as file://\n"); + System.err.println(" The argument controls the output delimiter."); + System.exit(2); + } + String serverUri = otherArgs[0]; + String tableName = otherArgs[1]; + String schemaStr = otherArgs[2]; + String outputDir = otherArgs[3]; + String outputdelim = otherArgs[4]; + if(!outputdelim.equals("tab") && !outputdelim.equals("ctrla")) { + System.err.println("ERROR: Specify 'tab' or 'ctrla' for output delimiter"); + } + String dbName = "default"; + + String principalID = System.getProperty(HCatConstants.HCAT_METASTORE_PRINCIPAL); + if(principalID != null){ + conf.set(HCatConstants.HCAT_METASTORE_PRINCIPAL, principalID); + } + Job job = new Job(conf, "typedatacheck"); + // initialize HCatInputFormat + HCatInputFormat.setInput(job, HCatTableInfo.getInputTableInfo(serverUri, + principalID,dbName, tableName)); + HCatSchema s = HCatInputFormat.getTableSchema(job); + job.getConfiguration().set(SCHEMA_KEY, schemaStr); + job.getConfiguration().set(DELIM, outputdelim); + job.setInputFormatClass(HCatInputFormat.class); + job.setOutputFormatClass(TextOutputFormat.class); + job.setJarByClass(TypeDataCheck.class); + job.setMapperClass(TypeDataCheckMapper.class); + job.setNumReduceTasks(0); + job.setOutputKeyClass(Long.class); + job.setOutputValueClass(Text.class); + FileOutputFormat.setOutputPath(job, new Path(outputDir)); + System.exit(job.waitForCompletion(true) ? 0 : 1); + return 0; + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + @Override + public Configuration getConf() { + return conf; + } + + @Override + public void setConf(Configuration conf) { + TypeDataCheck.conf = conf; + } + +} Index: src/test/e2e/hcatalog/udfs/java/org/apache/hcatalog/utils/HCatTypeCheckHive.java =================================================================== --- src/test/e2e/hcatalog/udfs/java/org/apache/hcatalog/utils/HCatTypeCheckHive.java (revision 0) +++ src/test/e2e/hcatalog/udfs/java/org/apache/hcatalog/utils/HCatTypeCheckHive.java (revision 0) @@ -0,0 +1,140 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.hcatalog.utils; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; + +import org.apache.hadoop.hive.ql.exec.UDFArgumentException; +import org.apache.hadoop.hive.ql.metadata.HiveException; +import org.apache.hadoop.hive.ql.udf.generic.GenericUDF; +import org.apache.hadoop.hive.serde2.objectinspector.ListObjectInspector; +import org.apache.hadoop.hive.serde2.objectinspector.MapObjectInspector; +import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspector; +import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspectorFactory; +import org.apache.hadoop.hive.serde2.objectinspector.PrimitiveObjectInspector; +import org.apache.hadoop.hive.serde2.objectinspector.StructField; +import org.apache.hadoop.hive.serde2.objectinspector.StructObjectInspector; +import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspector.Category; +import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspectorFactory.ObjectInspectorOptions; + +/** + * A hive udf to check types of the fields read from hcat. A sample hive query which can use this is: + * + * create temporary function typecheck as 'org.apache.hcatalog.utils.HCatTypeCheckHive'; + * select typecheck('map+struct+array>+int', + * mymap, mytuple, bagofmap, rownum) from complex; + * + * + * The first argument to the UDF is a string representing the schema of the columns in the table. + * The columns in the tables are the remaining args to it. + * The schema specification consists of the types as given by "describe
" + * with each column's type separated from the next column's type by a '+' + * + * The UDF will throw an exception (and cause the query to fail) if it does not + * encounter the correct types. + * + * The output is a string representation of the data , type and hive category. + * It is not advisable to use this against large dataset since the output would also + * be large. + * + */ +public final class HCatTypeCheckHive extends GenericUDF { + +ObjectInspector[] argOIs; +@Override +public Object evaluate(DeferredObject[] args) throws HiveException { + List row = new ArrayList(); + String typesStr = (String) getJavaObject(args[0].get(), argOIs[0], new ArrayList()); + String[] types = typesStr.split("\\+"); + for(int i = 0; i < types.length; i++) { + types[i] = types[i].toLowerCase(); + } + for(int i = 1; i < args.length; i++) { + ObjectInspector oi = argOIs[i]; + List categories = new ArrayList(); + Object o = getJavaObject(args[i].get(),oi, categories); + try { + if(o != null) { + Util.check(types[i-1], o); + } + } catch (IOException e) { + throw new HiveException(e); + } + row.add(o == null ? "null" : o); + row.add(":" + (o == null ? "null" : o.getClass()) + ":" + categories); + } + return row.toString(); +} + +private Object getJavaObject(Object o, ObjectInspector oi, List categories) { + if(categories != null) { + categories.add(oi.getCategory()); + } + if(oi.getCategory() == ObjectInspector.Category.LIST) { + List l = ((ListObjectInspector)oi).getList(o); + List result = new ArrayList(); + ObjectInspector elemOI = ((ListObjectInspector)oi).getListElementObjectInspector(); + for(Object lo : l) { + result.add(getJavaObject(lo, elemOI, categories)); + } + return result; + } else if (oi.getCategory() == ObjectInspector.Category.MAP) { + Map m = ((MapObjectInspector)oi).getMap(o); + Map result = new HashMap(); + ObjectInspector koi = ((MapObjectInspector)oi).getMapKeyObjectInspector(); + ObjectInspector voi = ((MapObjectInspector)oi).getMapValueObjectInspector(); + for(Entry e: m.entrySet()) { + result.put((String)getJavaObject(e.getKey(), koi, null), + (String)getJavaObject(e.getValue(), voi, null)); + } + return result; + + } else if (oi.getCategory() == ObjectInspector.Category.STRUCT) { + List s = ((StructObjectInspector)oi).getStructFieldsDataAsList(o); + List sf = ((StructObjectInspector)oi).getAllStructFieldRefs(); + List result = new ArrayList(); + for(int i = 0; i < s.size(); i++) { + result.add(getJavaObject(s.get(i), sf.get(i).getFieldObjectInspector(), categories)); + } + return result; + } else if(oi.getCategory() == ObjectInspector.Category.PRIMITIVE) { + return ((PrimitiveObjectInspector)oi).getPrimitiveJavaObject(o); + } + throw new RuntimeException("Unexpected error!"); +} + +@Override +public String getDisplayString(String[] arg0) { + return null; +} + +@Override +public ObjectInspector initialize(ObjectInspector[] argOIs) + throws UDFArgumentException { + this.argOIs = argOIs; + return ObjectInspectorFactory.getReflectionObjectInspector(String.class, + ObjectInspectorOptions.JAVA); +} + +} Index: src/test/e2e/hcatalog/udfs/java/org/apache/hcatalog/utils/HCatTestDriver.java =================================================================== --- src/test/e2e/hcatalog/udfs/java/org/apache/hcatalog/utils/HCatTestDriver.java (revision 0) +++ src/test/e2e/hcatalog/udfs/java/org/apache/hcatalog/utils/HCatTestDriver.java (revision 0) @@ -0,0 +1,61 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.hcatalog.utils; + +import org.apache.hcatalog.utils.TypeDataCheck; +import org.apache.hadoop.util.ProgramDriver; + +/** + * A description of an example program based on its class and a + * human-readable description. + */ +public class HCatTestDriver { + + public static void main(String argv[]){ + int exitCode = -1; + ProgramDriver pgd = new ProgramDriver(); + try { + pgd.addClass("typedatacheck", TypeDataCheck.class, + "A map/reduce program that checks the type of each field and" + + " outputs the entire table (to test hcat)."); + pgd.addClass("sumnumbers", SumNumbers.class, + "A map/reduce program that performs a group by on the first column and a " + + "SUM operation on the other columns of the \"numbers\" table."); + pgd.addClass("storenumbers", StoreNumbers.class, "A map/reduce program that " + + "reads from the \"numbers\" table and adds 10 to each fields and writes " + + "to the \"numbers_partitioned\" table into the datestamp=20100101 " + + "partition OR the \"numbers_empty_initially\" table based on a " + + "cmdline arg"); + pgd.addClass("storecomplex", StoreComplex.class, "A map/reduce program that " + + "reads from the \"complex\" table and stores as-is into the " + + "\"complex_empty_initially\" table."); + pgd.addClass("storedemo", StoreDemo.class, "demo prog."); + pgd.driver(argv); + + // Success + exitCode = 0; + } + catch(Throwable e){ + e.printStackTrace(); + } + + System.exit(exitCode); + } +} + Index: src/test/e2e/hcatalog/udfs/java/org/apache/hcatalog/utils/Util.java =================================================================== --- src/test/e2e/hcatalog/udfs/java/org/apache/hcatalog/utils/Util.java (revision 0) +++ src/test/e2e/hcatalog/udfs/java/org/apache/hcatalog/utils/Util.java (revision 0) @@ -0,0 +1,105 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.hcatalog.utils; + +import java.io.IOException; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; + +public class Util { + + static Map> typeMap = new HashMap>(); + + static{ + typeMap.put("tinyint", Byte.class); + typeMap.put("smallint", Short.class); + typeMap.put("int", Integer.class); + typeMap.put("bigint", Long.class); + typeMap.put("float", Float.class); + typeMap.put("double", Double.class); + typeMap.put("string", String.class); + typeMap.put("boolean", Boolean.class); + typeMap.put("struct", List.class); + typeMap.put("map", Map.class); + typeMap.put("array>", List.class); + } + + public static void die(String expectedType, Object o) throws IOException { + throw new IOException("Expected " + expectedType + ", got " + + o.getClass().getName()); + } + + + public static String check(String type, Object o) throws IOException { + if(o == null) { + return "null"; + } + if(check(typeMap.get(type), o)) { + if(type.equals("map")) { + Map m = (Map) o; + check(m); + } else if(type.equals("array>")) { + List> listOfMaps = (List>) o; + for(Map m: listOfMaps) { + check(m); + } + } else if(type.equals("struct")) { + List l = (List) o; + if(!check(Integer.class, l.get(0)) || + !check(String.class, l.get(1)) || + !check(Double.class, l.get(2))) { + die("struct", l); + } + } + } else { + die(typeMap.get(type).getName(), o); + } + return o.toString(); + } + + /** + * @param m + * @throws IOException + */ + public static void check(Map m) throws IOException { + if(m == null) { + return; + } + for(Entry e: m.entrySet()) { + // just access key and value to ensure they are correct + if(!check(String.class, e.getKey())) { + die("String", e.getKey()); + } + if(!check(String.class, e.getValue())) { + die("String", e.getValue()); + } + } + + } + + public static boolean check(Class expected, Object actual) { + if(actual == null) { + return true; + } + return expected.isAssignableFrom(actual.getClass()); + } + +} Index: src/test/e2e/hcatalog/udfs/java/build.xml =================================================================== --- src/test/e2e/hcatalog/udfs/java/build.xml (revision 0) +++ src/test/e2e/hcatalog/udfs/java/build.xml (revision 0) @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + *** Compiling UDFs *** + + + + + + + *** Creating UDF jar *** + + + + + Index: src/test/e2e/hcatalog/tests/hcat.conf =================================================================== --- src/test/e2e/hcatalog/tests/hcat.conf (revision 0) +++ src/test/e2e/hcatalog/tests/hcat.conf (revision 0) @@ -0,0 +1,3014 @@ +#!/home/y/bin/perl + + # + # Do + # egrep '^#|name.*=>' hcat.conf | egrep -v '^#!|egrep' | less + # to get an outline of this test conf file + # + + # Has a couple of Hive set directives: + # set hive.exec.dynamic.partition.mode=nonstrict; + # set hive.exec.dynamic.partition=true; + + +$cfg = { + 'driver' => 'HCat', + +# 'run_as' => 'hadoopqa', + 'use-pig.pl' => 1, + 'groups' => [ +# This first group should be moved to deployer ? + { + 'name' => 'hcat_setup_Hive_createTable', + 'tests' => [ + + { + 'num' => 1 + ,'hcat_cmdline_args' => ['-g', 'users', '-p', 'rwxrwx---'], + ,'hcat' => " +CREATE external TABLE IF NOT EXISTS numbers ( +INTNUM1000 int, +ID smallint, +INTNUM5 tinyint, +INTNUM100 int, +INTNUM int, +LONGNUM bigint, +FLOATNUM float, +DOUBLENUM double +) +stored as RCFile +location ':INPATH:/numbers'; +" + ,'rc' => 0 + }, + { + 'num' => 6 + ,'hcat_cmdline_args' => ['-g', 'users', '-p', 'rwxrwx---'], + ,'hcat' => " +CREATE external TABLE IF NOT EXISTS complex ( + mymap map, + mytuple struct, + bagofmap array>, + rownum int +) +row format DELIMITED FIELDS TERMINATED BY '\001' + COLLECTION ITEMS TERMINATED BY '\002' + MAP KEYS TERMINATED BY '\003' +stored as rcfile +location ':INPATH:/complex'; +" + ,'rc' => 0 + }, + + { + 'num' => 7 + ,'hcat_cmdline_args' => ['-g', 'users', '-p', 'rwxrwx---'], + ,'hcat' => " +CREATE external TABLE IF NOT EXISTS boolean_table ( +myflag boolean, +rownum int +) +row format DELIMITED FIELDS TERMINATED BY '\001' + COLLECTION ITEMS TERMINATED BY '\002' + MAP KEYS TERMINATED BY '\003' +stored as rcfile +location ':INPATH:/boolean'; +" + ,'rc' => 0 + }, + + { + 'num' => 8 + # same as 'numbers' from above, just with 'int' for small/tiny ints. + ,'hcat_cmdline_args' => ['-g', 'users', '-p', 'rwxrwx---'], + ,'hcat' => " +CREATE external TABLE IF NOT EXISTS numbers_pig ( +INTNUM1000 int, +ID int, -- smallint, +INTNUM5 int, -- tinyint, +INTNUM100 int, +INTNUM int, +LONGNUM bigint, +FLOATNUM float, +DOUBLENUM double +) +stored as RCFile +location ':INPATH:/numbers_pig'; +" + ,'rc' => 0 + }, + + ], + }, # end g +################################################################################ +# HIVE STORED DATA +################################################################################ + +#------------------------------------------------------------------------------- +# Create partitioned test table using Hive +#------------------------------------------------------------------------------- + { + 'name' => 'hcat_hive2hive_partitioned', + 'tests' => [ + + { + 'num' => 1, + 'hive' => " +CREATE TABLE tmp_hive_partitioned_:RUNID: ( + id smallint, + intnum int, + floatnum float +) +partitioned by ( + idmod5 tinyint +) +stored as rcfile +location ':TMP:/hcat_tmp_tables/tmp_hive_partitioned_:RUNID:' +TBLPROPERTIES ( + 'hcat.isd'='org.apache.hcatalog.rcfile.RCFileInputDriver', + 'hcat.osd'='org.apache.hcatalog.rcfile.RCFileOutputDriver' +); +", + 'rc' => 0, + }, + + { + 'num' => 2, + 'depends_on' => 'hcat_hive2hive_partitioned_1', + 'hadoop' => "fs -ls :TMP:/hcat_tmp_tables", + 'rc' => 0, + 'expected_out_regex' => ":TMP:/hcat_tmp_tables/tmp_hive_partitioned_:RUNID:", + }, + + { + 'num' => 3, + 'depends_on' => 'hcat_hive2hive_partitioned_1', + 'hive' => "show tables;", + 'rc' => 0, + 'expected_out_regex' => "tmp_hive_partitioned_:RUNID:", + }, + + { + 'num' => 4, + # select from empty table + 'depends_on' => 'hcat_hive2hive_partitioned_1', + 'hive' => "select * from tmp_hive_partitioned_:RUNID:;", + 'rc' => 0, + 'expected_err_regex' => "OK", + 'expected_out' => "", + }, + + { + 'num' => 5, + # + 'depends_on' => 'hcat_hive2hive_partitioned_1', + 'hive' => " +set hive.exec.dynamic.partition.mode=nonstrict; +set hive.exec.dynamic.partition=true; + +insert overwrite table tmp_hive_partitioned_:RUNID: +partition (idmod5=1) +select id, intnum, floatnum +from numbers +where id % 5 = 1; + +insert overwrite table tmp_hive_partitioned_:RUNID: +partition (idmod5=2) +select id, intnum, floatnum +from numbers +where id % 5 = 2; +", + 'rc' => 0, + 'expected_err_regex' => "OK", + 'expected_out' => "", + }, + + { + 'num' => 6, + # + 'depends_on' => 'hcat_hive2hive_partitioned_5', + 'sortBenchmark' => 1, + 'sortResults' => 1, + 'floatpostprocess' => 1, + 'delimiter' => ' ', + 'hive' => " +select idmod5, id, intnum, floatnum +from tmp_hive_partitioned_:RUNID: +; +", + 'sql' => " +select id % 5, id, intnum, floatnum +from numbers +where (id % 5 = 1) + or (id % 5 = 2) +; +", + }, + + ] # end tests + }, # end group + +#------------------------------------------------------------------------------- +# HIVE STORED -> HIVE SECTION +#------------------------------------------------------------------------------- + + { + 'name' => 'hcat_hive2hive_type_check', + 'tests' => [ + # for how the 'typecheck' udf works. + # If the the typecheck does not pass, the udf will abort. + # Look at the jobtracker for info about the actual value, + # e.g. something like: "Expected java.lang.String, got java.lang.Integer" + # The verification: + # 'expected_out_regex' => "class java", + # is needed because otherwise the tests might "PASS" because the output was empty... + + { + 'num' => 1, + 'hive' => q\ +add jar :FUNCPATH:/testudf.jar; +create temporary function typecheck as 'org.apache.hcatalog.utils.HCatTypeCheckHive'; +select typecheck('int+smallint+tinyint+int+int+bigint+float+double', +intnum1000,id,intnum5,intnum100,intnum,longnum,floatnum,doublenum) from numbers; +\, + 'rc' => 0, + 'expected_out_regex' => "class java", + 'expected_err_regex' => "OK", + 'not_expected_err_regex' => "FAILED", + }, + + { + 'num' => 2, + 'hive' => q\ +add jar :FUNCPATH:/testudf.jar; +create temporary function typecheck as 'org.apache.hcatalog.utils.HCatTypeCheckHive'; +select typecheck('map+struct+array>+int', +mymap, mytuple, bagofmap, rownum) from complex; +\, + 'rc' => 0, + 'expected_out_regex' => "class java", + 'expected_err_regex' => "OK", + 'not_expected_err_regex' => "FAILED", + }, + + { + 'num' => 3, + 'hive' => q\ +add jar :FUNCPATH:/testudf.jar; +create temporary function typecheck as 'org.apache.hcatalog.utils.HCatTypeCheckHive'; +select typecheck('boolean+int', +myflag,rownum) from boolean_table; +\, + 'rc' => 0, + 'expected_out_regex' => "class java", + 'expected_err_regex' => "OK", + 'not_expected_err_regex' => "FAILED", + }, + + { + 'num' => 5, + 'floatpostprocess' => 1, + 'delimiter' => ' ', + 'hive' => q\ +select + id, -- expect smallint + intnum5 + id, -- expect smallint + intnum5 + id + intnum, -- expect int + intnum5 + id + intnum + longnum, -- expect bigint + intnum5 * id, -- expect smallint + intnum5 * id * intnum, -- expect int + intnum5 * id * intnum * longnum, -- expect bigint + intnum5 + 500, -- expect int + intnum5 + 1.5, -- expect float + cast(intnum5 + 1.5 as double), -- expect double + cast(intnum5 + 1.0 as int), -- expect int + floatnum + doublenum, -- expect double + floatnum * doublenum -- expect double +from numbers +order by id +limit 500 +; +\, + 'sql' => " +select + id, + intnum5 + id, + intnum5 + id + intnum, + intnum5 + id + intnum + longnum, + intnum5 * id, + intnum5 * id * intnum, + intnum5 * id * intnum * longnum, + intnum5 + 500, + intnum5 + 1.5, + cast(intnum5 + 1.5 as double precision), + cast(intnum5 + 1.0 as integer), + floatnum + doublenum, + floatnum * doublenum +from numbers +order by id +limit 500 +; +", + }, + + { + 'num' => 6, + 'ignore' => '!!! Hive truncates where Postgres rounds', + 'hive' => q\ +select + id, + intnum5, + cast(intnum5 + 1.9 as int) +from numbers +order by id +limit 5 +; +\, + 'sql' => " +select + id, + intnum5, + cast(intnum5 + 1.9 as integer) +from numbers +order by id +limit 5 +; +", + }, + + ] # end tests + }, # end group + + { + 'name' => 'hcat_hive2hive_diagnostic_operators', + 'tests' => [ + + { + 'num' => 1, + 'hive' => "show tables;", + 'expected_out_regex' => "OK", + }, + { + 'num' => 5, + 'hive' => "describe complex;", + 'sql' => "\\d", # dummy statement + }, + + { + 'num' => 6, + 'hive' => "describe complex.mytuple;", + 'expected_out_regex' => 'num\s+int\s+from\s+deserializer\s*\nstr\s+string\s+from\s+deserializer\s*\ndbl\s+double\s+from\s+deserializer', + }, + + { + 'num' => 7, + 'hive' => "describe complex.bagofmap;", + 'expected_out_regex' => 'bagofmap\s+array>\s+from deserializer', + }, + + { + 'num' => 8, + 'hive' => "describe boolean_table;", + 'sql' => "\\d", # dummy statement + }, + + { + 'num' => 9, + 'hive' => "describe boolean_table.myflag;", + 'expected_out_regex' => 'myflag\s+boolean\s+from deserializer', + }, + + ] # end tests + }, # end group + + { + 'name' => 'hcat_hive2hive_select', + 'sortBenchmark' => 1, + 'sortResults' => 1, + 'tests' => [ + + { + 'num' => 1, + 'floatpostprocess' => 1, + 'delimiter' => ' ', + # actually no nulls in table, so had not needed the casting..., + 'hive' => q\ +select + if (intnum1000 IS NULL, "", cast(intnum1000 as STRING)), + if (id IS NULL, "", cast(id as STRING)), + if (intnum5 IS NULL, "", cast(intnum5 as STRING)), + if (intnum100 IS NULL, "", cast(intnum100 as STRING)), + if (intnum IS NULL, "", cast(intnum as STRING)), + if (longnum IS NULL, "", cast(longnum as STRING)), + if (floatnum IS NULL, "", cast(floatnum as STRING)), + if (doublenum IS NULL, "", cast(doublenum as STRING)) +from numbers; +\, + 'sql' => q\ +select + intnum1000, + id, + intnum5, + intnum100, + intnum, + longnum, + floatnum, + doublenum +from numbers; +\, + }, + + { + 'num' => 2, + 'hive' => q\ +select + mymap, + mytuple, + bagofmap, + rownum +from complex; +\, + 'sql' => "\\d", # dummy statement + }, + + { + 'num' => 3, + 'hive' => q\ +select + myflag, rownum +from boolean_table; +\, + 'sql' => "\\d", # dummy statement + }, + + + + { + 'num' => 8, + 'sortBenchmark' => 1, + 'sortResults' => 1, + 'hive' => q\ +select + distinct + intnum1000, + intnum5, + intnum100, + intnum, + longnum +from numbers; +\, + 'sql' => q\ +select + distinct + intnum1000, + intnum5, + intnum100, + intnum, + longnum +from numbers; +\, + }, + + ] # end tests + }, # end group + + { + 'name' => 'hcat_hive2hive_lateral', + 'sortBenchmark' => 1, + 'sortResults' => 1, + # Had work-around for Hive problem + # set hive.optimize.cp=false; + 'tests' => [ + + # NOTE: + # The queries below written w/o WHERE clauses until this jira is resolved: + # https://issues.apache.org/jira/browse/HIVE-1056 + # http://wiki.apache.org/hadoop/Hive/LanguageManual/LateralView + + { + 'num' => 1, + 'hive' => q\ +select rownum, item +from complex LATERAL VIEW explode(bagofmap) explodedTable AS item; +\, + 'sql' => "\\d", # dummy statement + }, + + + { + 'num' => 3, + 'hive' => q\ +select + rownum, + item, + "item['a1']:", if (item['a1'] IS NULL, "", cast(item['a1'] as STRING)), + "item['a2']:", if (item['a2'] IS NULL, "", cast(item['a2'] as STRING)), + "item['k1']:", if (item['k1'] IS NULL, "", cast(item['k1'] as STRING)), + "item['k6']:", if (item['k6'] IS NULL, "", cast(item['k6'] as STRING)) +from complex LATERAL VIEW explode(bagofmap) explodedTable AS item +; +\, + 'sql' => "\\d", # dummy statement + }, + + + + ] # end tests + }, # end group + + { + 'name' => 'hcat_hive2hive_join', + 'sortBenchmark' => 1, + 'sortResults' => 1, + 'tests' => [ + + { + 'num' => 1, + 'floatpostprocess' => 1, + 'delimiter' => ' ', + 'hive' => q\ +select + a.intnum1000, + b.intnum1000, + a.id, + b.id, + a.intnum5, + b.intnum5, + a.intnum100, + b.intnum100, + a.intnum, + b.intnum, + a.longnum, + b.longnum, + a.floatnum, + b.floatnum, + a.doublenum, + b.doublenum +from + numbers a + join numbers b + on (a.intnum5 = b.intnum5) +where + a.id < 30 + and b.id < 40 +order by a.intnum5 +; +\, + 'sql' => " +select + a.intnum1000, + b.intnum1000, + a.id, + b.id, + a.intnum5, + b.intnum5, + a.intnum100, + b.intnum100, + a.intnum, + b.intnum, + a.longnum, + b.longnum, + a.floatnum, + b.floatnum, + a.doublenum, + b.doublenum +from + numbers as a + join numbers as b + on (a.intnum5 = b.intnum5) +where + a.id < 30 + and b.id < 40 +order by a.intnum5 +; +", + }, + + { + 'num' => 2, + # join by map entry + # full outer join + 'hive' => q\ +select + a.rownum, + b.rownum, + a.mymap['mymapk1'], + b.mymap['mymapk1'], + a.mymap['mymapk3'], + b.mymap['mymapk3'], + a.mymap, + b.mymap +from + complex a + full outer join complex b + on (a.mymap['mymapk1'] + = b.mymap['mymapk3']) +; +\, + 'sql' => "\\d", # dummy statement + }, + + { + 'num' => 3, + # join by tuple item + # inner join + 'hive' => q\ +select + a.rownum, + b.rownum, + a.mytuple.dbl, + b.mytuple.dbl, + a.mytuple, + b.mytuple +from + complex a +join complex b +on (a.mytuple.dbl = b.mytuple.dbl + 1) +; +\, + 'sql' => "\\d", # dummy statement + }, + + + ] # end tests + }, # end group +# end group +#------------------------------------------------------------------------------- +# HIVE STORED -> PIG SECTION +#------------------------------------------------------------------------------- + + { + 'name' => 'hcat_hive2pig_load_describe', + # + + 'tests' => [ + + { + 'num' => 1, + 'pig' => " +a = load 'default.numbers_pig' using org.apache.hcatalog.pig.HCatLoader(); +describe a; +", + 'rc' => 0, + 'expected_out' => 'a: {intnum1000: int,id: int,intnum5: int,intnum100: int,intnum: int,longnum: long,floatnum: float,doublenum: double} +', + 'not_expected_err_regex' => "ERROR", + }, + + { + 'num' => 2, + 'pig' => " +a = load 'default.complex' using org.apache.hcatalog.pig.HCatLoader(); +describe a; +", + 'rc' => 0, + 'expected_out' => 'a: {mymap: map[],mytuple: (num: int,str: chararray,dbl: double),bagofmap: {(innerfield: map[])},rownum: int} +', + 'not_expected_err_regex' => "ERROR", + }, + + { + 'num' => 3, + 'ignore' => 'Pig does not understand boolean. Made a negative test for the error message.', + 'pig' => " +a = load 'default.boolean_table' using org.apache.hcatalog.pig.HCatLoader(); +describe a; +", + 'rc' => 0, + 'expected_out' => "", + 'not_expected_err_regex' => "ERROR", + }, + + ] # end tests + }, # end group + { + 'name' => 'hcat_hive2pig_type_check', + # + # * This UDF can be used to check that a tuple presented by org.apache.hcatalog.pig.HCatLoader has the + # * right types for the fields + # * (...) + # * The output should only contain the value '1' in all rows. (This UDF returns + # * the integer value 1 if all fields have the right type, else throws IOException) + + 'tests' => [ + + { + 'num' => 1, + 'pig' => " +register :FUNCPATH:/testudf.jar; +a = load 'default.numbers_pig' using org.apache.hcatalog.pig.HCatLoader(); +b = foreach a generate org.apache.hcatalog.utils.HCatTypeCheck('intnum1000:int,id:int,intnum5:int,intnum100:int,intnum:int,longnum:long,floatnum:float,doublenum:double', *); +store b into ':OUTPATH:'; +", + 'rc' => 0, + 'expected_err_regex' => "Success", + # 'expected_out_regex' => "1", + # 'not_expected_out_regex' => "[^1\\t]", + }, + + { + 'num' => 2, + # 'ignore' => "Ticket 3858709 - HCatTypeCheck got null pointer exception when used on the 'complex' table", + 'pig' => " +register :FUNCPATH:/testudf.jar; +a = load 'default.complex' using org.apache.hcatalog.pig.HCatLoader(); +b = foreach a generate org.apache.hcatalog.utils.HCatTypeCheck('mymap: map[],mytuple: (num: int,str: chararray,dbl: double),bagofmap: {(innerfield: map[])},rownum: int', *); +store b into ':OUTPATH:'; +", + 'rc' => 0, + 'expected_err_regex' => "Success", + # 'expected_out_regex' => "1", + # 'not_expected_out_regex' => "[^1\\t]", + }, + + { + 'num' => 3, + # 'ignore' => "Ticket 3858731 - HCatLoader gives error when loading 'boolean' values", + 'pig' => " +register :FUNCPATH:/testudf.jar; +a = load 'default.boolean_table' using org.apache.hcatalog.pig.HCatLoader(); +b = foreach a generate org.apache.hcatalog.utils.HCatTypeCheck('boolean+int', *); +store b into ':OUTPATH:'; +", + 'rc' => 0, + 'expected_err_regex' => "Success", + # 'expected_out_regex' => "1", + # 'not_expected_out_regex' => "[^1\\t]", + }, + + + ] # end tests + }, # end group + { + 'name' => 'hcat_hive2pig_empty', + 'tests' => [ + + { + 'num' => 1, + 'hive' => " +CREATE TABLE tmp_hive_empty_:RUNID: ( + INTNUM1000 int, + ID int, + INTNUM5 int, + INTNUM100 int, + INTNUM int, + LONGNUM bigint, + FLOATNUM float, + DOUBLENUM double +) +stored as rcfile +location ':TMP:/hcat_tmp_tables/tmp_hive_empty_:RUNID:' +TBLPROPERTIES ( + 'hcat.isd'='org.apache.hcatalog.rcfile.RCFileInputDriver', + 'hcat.osd'='org.apache.hcatalog.rcfile.RCFileOutputDriver' +); +", + 'rc' => 0, + }, + + { + 'num' => 2, + 'depends_on' => 'hcat_hive2pig_empty_1', + 'pig' => " +a = load 'default.tmp_hive_empty_:RUNID:' using org.apache.hcatalog.pig.HCatLoader(); +store a into ':OUTPATH:'; +", + 'rc' => 0, + 'expected_err_regex' => "Success", + 'not_expected_err_regex' => "ERROR", + 'expected_out' => "", + }, + + { + 'num' => 3, + 'depends_on' => 'hcat_hive2pig_empty_1', + 'pig' => " +a = load 'default.tmp_hive_empty_:RUNID:' using org.apache.hcatalog.pig.HCatLoader(); +store a into 'default.tmp_hive_empty_:RUNID:' + using org.apache.hcatalog.pig.HCatStorer + ('', + 'intnum1000: int,id: int,intnum5: int,intnum100: int,intnum: int,longnum: long,floatnum: float,doublenum: double'); +", + 'rc' => 0, + 'expected_err_regex' => "Success", + 'expected_out' => "", + }, + + ] # end tests + }, # end group + { + + 'name' => 'hcat_hive2pig_arithmetic_operators', + # covering any items from the "Arithmetic Operators and More" section not covered elswhere + 'delimiter' => ' ', + 'tests' => [ + + { + 'num' => 5, + 'sortResults' => 1, + 'sortBenchmark' => 1, + # COUNT star + 'pig' => q? +a = load 'default.numbers_pig' USING org.apache.hcatalog.pig.HCatLoader(); +b = group a all; +c = foreach b generate COUNT(a.$0); +store c into ':OUTPATH:'; +?, + 'rc' => 0, + 'expected_err_regex' => "Success!", + 'expected_stdout' => "5000", + }, + { + 'num' => 6, + # Group + 'sortBenchmark' => 1, + 'sortResults' => 1, + # 'a: {intnum1000: int,id: int,intnum5: int,intnum100: int,intnum: int,longnum: long,floatnum: float,doublenum: double}' + 'pig' => q? +a = load 'default.numbers_pig' USING org.apache.hcatalog.pig.HCatLoader(); +b = group a by intnum5; +c = foreach b generate group as i5, COUNT(a) as count_rows, SUM(a.id) as sum_id; +store c into ':OUTPATH:'; +?, + 'sql' => ' +select intnum5, COUNT(id), SUM(id) +from numbers +group by intnum5 +;', + }, + { + 'num' => 7, + # Order by + # 'a: {intnum1000: int,id: int,intnum5: int,intnum100: int,intnum: int,longnum: long,floatnum: float,doublenum: double}' + ########################################## + # + # a = load '/user/hadoopqa/pig/tests/data/txt/numbers.txt' using PigStorage(':') + # as (intnum1000: int,id: int,intnum5: int,intnum100: int,intnum: int,longnum: long,floatnum: float,doublenum: double); + # b = group a by intnum5; + # c = foreach b generate group as i5, COUNT(a) as count_rows, SUM(a.id) as sum_id; + # d = order c by i5; + # dump d; + # + ########################################## + # + 'floatpostprocess' => 1, + # WE SHOULD REALLY NOT BE SORTING HERE, BUT WE CAN'T GET STABLE SORT OUT + # OF PIG AND POSTGRES IN THE SAME MANNER + 'sortBenchmark' => 1, + 'sortResults' => 1, + 'pig' => q? +a = load 'default.numbers_pig' USING org.apache.hcatalog.pig.HCatLoader(); +b = order a by intnum5; +store b into ':OUTPATH:'; +?, + # 'rc' => 0, + 'sql' => 'select * from numbers order by intnum5 ;', + }, + + + { + 'num' => 10, + # 9.3.5.1 FILTER such that an expression of the form: - Part I + # FILTER alias by exp1 + # FILTER alias by exp2 + # FILTER alias by exp3 + # gives the same result as + # + # FILTER alias by exp1, exp2, expr3 + 'sortBenchmark' => 1, + 'sortResults' => 1, + 'floatpostprocess' => 1, + 'delimiter' => ' ', + 'pig' => q? +a = load 'default.numbers_pig' USING org.apache.hcatalog.pig.HCatLoader(); +b = filter a by intnum1000 > 3000; +c = filter b by id > 2500; +d = filter c by intnum5 > 3; +e = filter d by intnum > 5050; +f = filter e by longnum > 5050; +g = filter f by floatnum > 683; +h = filter g by doublenum > 683; +store h into ':OUTPATH:'; +?, + 'sql' => " +select * from numbers +where + intnum1000 > 3000 +and id > 2500 +and intnum5 > 3 +and intnum > 5050 +and longnum > 5050 +and floatnum > 683 +and doublenum > 683 +; +", + }, + + { + 'num' => 11, + # 9.3.5.1 FILTER such that an expression of the form: - Part II + # FILTER alias by exp1 + # FILTER alias by exp2 + # FILTER alias by exp3 + # gives the same result as + # + # FILTER alias by exp1, exp2, expr3 + 'sortBenchmark' => 1, + 'sortResults' => 1, + 'floatpostprocess' => 1, + 'delimiter' => ' ', + 'pig' => q? +a = load 'default.numbers_pig' USING org.apache.hcatalog.pig.HCatLoader(); +b = filter a by + intnum1000 > 3000 + and id > 2500 + and intnum5 > 3 + and intnum > 5050 + and longnum > 5050 + and floatnum > 683 + and doublenum > 683; +; +store b into ':OUTPATH:'; +?, + 'sql' => " +select * from numbers +where + intnum1000 > 3000 +and id > 2500 +and intnum5 > 3 +and intnum > 5050 +and longnum > 5050 +and floatnum > 683 +and doublenum > 683 +; +", + }, + ] # end tests + }, # end group + +#------------------------------------------------------------------------------- +# HIVE STORED -> HADOOP SECTION +#------------------------------------------------------------------------------- + + { + 'name' => 'hcat_hive2hadoop_read', + # From: + 'sortResults' => 1, + 'sortBenchmark' => 1, + 'hadoop_classpath' => ':HCAT_JAR:', + 'tests' => [ + + { + 'num' => 1, + # sum numbers + # Using doctored benchmark file due to rounding error, e.g.: + # actual line : 5000 4500500 2949 416084 5050809 5050809 1083307.100 1083308.561 + # expected line: 5000 4500500 2949 416084 5050809 5050809 1083310.000 1083308.561 + 'floatpostprocess' => 0, + 'delimiter' => ' ', + 'hadoop' => q\ +jar :FUNCPATH:/testudf.jar org.apache.hcatalog.utils.SumNumbers thrift://:THRIFTSERVER: :OUTPATH: -libjars file://:HCAT_JAR: +\, + 'sql' => " +select + intnum1000, + sum (id), + sum (intnum5), + sum (intnum100), + sum (intnum), + sum (longnum), + sum (floatnum), + sum (doublenum) +from numbers +group by intnum1000 +order by intnum1000; +", + }, + + ] # end tests + }, # end group + + { + 'name' => 'hcat_hive2hadoop_type_check', + # From: + 'sortResults' => 1, + 'sortBenchmark' => 1, + 'hadoop_classpath' => ':HCAT_JAR:', + 'tests' => [ + + { + 'num' => 1, + # typedatacheck complex + # 'ignore' => "Ticket 4229280 - testudf 'typedatacheck' call to getInputTableInfo gives NoSuchMethodError", + 'hadoop' => q\ +jar :FUNCPATH:/testudf.jar org.apache.hcatalog.utils.TypeDataCheck thrift://:THRIFTSERVER: complex 'map+struct+array>+int' :OUTPATH: tab -libjars file://:HCAT_JAR: +\, + 'sql' => "\\d;", # dummy + }, + + { + 'num' => 2, + # typedatacheck numbers + # 'ignore' => "Ticket 4229280 - testudf 'typedatacheck' call to getInputTableInfo gives NoSuchMethodError", + 'floatpostprocess' => 0, + 'delimiter' => ' ', + 'hadoop' => q\ +jar :FUNCPATH:/testudf.jar org.apache.hcatalog.utils.TypeDataCheck thrift://:THRIFTSERVER: numbers int+smallint+tinyint+int+int+bigint+float+double :OUTPATH: tab -libjars file://:HCAT_JAR: +\, + 'sql' => "select * from numbers;", + }, + + { + 'num' => 3, + # typedatacheck boolean_table + # 'ignore' => "Ticket 4229280 - testudf 'typedatacheck' call to getInputTableInfo gives NoSuchMethodError", + 'hadoop' => q\ +jar :FUNCPATH:/testudf.jar org.apache.hcatalog.utils.TypeDataCheck thrift://:THRIFTSERVER: boolean_table boolean+int :OUTPATH: tab -libjars file://:HCAT_JAR: +\, + 'sql' => "select * from boolean_table;", + }, + + ] # end tests + }, # end group + + { + 'name' => 'hcat_hive2hadoop_write_numbers_nopart', + 'hadoop_classpath' => ':HCAT_JAR:', + 'tests' => [ + + { + 'num' => 1, + 'hive' => " +drop table numbers_nopart_empty_initially; +", + # does not give error even if the table does not exist + 'expected_out' => "", + }, + + { + 'num' => 2, + 'depends_on' => 'hcat_hive2hadoop_write_numbers_nopart_1', + 'hive' => " +CREATE TABLE numbers_nopart_empty_initially ( + INTNUM1000 int, + ID smallint, + INTNUM5 tinyint, + INTNUM100 int, + INTNUM int, + LONGNUM bigint, + FLOATNUM float, + DOUBLENUM double +) +stored as RCFile +location ':TMP:/hcat_tmp_tables/numbers_nopart_empty_initially' +TBLPROPERTIES ( + 'hcat.isd'='org.apache.hcatalog.rcfile.RCFileInputDriver', + 'hcat.osd'='org.apache.hcatalog.rcfile.RCFileOutputDriver' +); +", + 'rc' => 0 + }, + + { + 'num' => 3, + # storenumbers + # 'nopart' -> data is written to the numbers_nopart_empty_initially table. + # 'ignore' => "Ticket 4229280 - testudf 'typedatacheck' call to getInputTableInfo gives NoSuchMethodError", + 'depends_on' => 'hcat_hive2hadoop_write_numbers_nopart_2', + 'hadoop' => q\ +jar :FUNCPATH:/testudf.jar org.apache.hcatalog.utils.StoreNumbers thrift://:THRIFTSERVER: nopart -libjars file://:HCAT_JAR: +\, + 'rc' => 0, + 'expected_out' => "", + 'expected_err_regex' => "HDFS_BYTES_WRITTEN=\\d+", + 'not_expected_err_regex' => "FAILED", + }, + + { + 'num' => 4, + 'depends_on' => 'hcat_hive2hadoop_write_numbers_nopart_3', + 'sortResults' => 1, + 'sortBenchmark' => 1, + 'floatpostprocess' => 0, + 'delimiter' => ' ', + 'hive' => " +select + intnum1000, + id, + intnum5, + intnum100, + intnum, + longnum, + floatnum, + doublenum +from numbers_nopart_empty_initially; +", + 'sql' => " +select + 10 + intnum1000, + 10 + id, + 10 + intnum5, + 10 + intnum100, + 10 + intnum, + 10 + longnum, + 10 + floatnum, + 10 + doublenum +from numbers; +", + }, + + # pig cannot handle tinyint and smallint, hence create a version of the table with 'int' instead + { + 'num' => 5, + 'hive' => " +drop table numbers_nopart_pig_empty_initially; +", + # does not give error even if the table does not exist + 'expected_out' => "", + }, + + { + 'num' => 6, + 'depends_on' => 'hcat_hive2hadoop_write_numbers_nopart_5', + 'hive' => " +CREATE TABLE numbers_nopart_pig_empty_initially ( + INTNUM1000 int, + ID int, + INTNUM5 int, + INTNUM100 int, + INTNUM int, + LONGNUM bigint, + FLOATNUM float, + DOUBLENUM double +) +stored as RCFile +location ':TMP:/hcat_tmp_tables/numbers_nopart_pig_empty_initially' +TBLPROPERTIES ( + 'hcat.isd'='org.apache.hcatalog.rcfile.RCFileInputDriver', + 'hcat.osd'='org.apache.hcatalog.rcfile.RCFileOutputDriver' +); +", + 'rc' => 0 + }, + + { + 'num' => 7, + # storenumbers + # 'nopart' -> data is written to the numbers_nopart_pig_empty_initially table. + # 'ignore' => "Ticket 4229280 - testudf 'typedatacheck' call to getInputTableInfo gives NoSuchMethodError", + 'depends_on' => 'hcat_hive2hadoop_write_numbers_nopart_6', + 'hadoop' => q\ +jar :FUNCPATH:/testudf.jar org.apache.hcatalog.utils.StoreNumbers thrift://:THRIFTSERVER: nopart_pig -libjars file://:HCAT_JAR: +\, + 'rc' => 0, + 'expected_out' => "", + 'expected_err_regex' => "HDFS_BYTES_WRITTEN=\\d+", + 'not_expected_err_regex' => "FAILED", + }, + + { + 'num' => 8, + 'depends_on' => 'hcat_hive2hadoop_write_numbers_nopart_7', + 'sortResults' => 1, + 'sortBenchmark' => 1, + 'floatpostprocess' => 0, + 'delimiter' => ' ', + 'hive' => " +select + intnum1000, + id, + intnum5, + intnum100, + intnum, + longnum, + floatnum, + doublenum +from numbers_nopart_pig_empty_initially; +", + 'sql' => " +select + 10 + intnum1000, + 10 + id, + 10 + intnum5, + 10 + intnum100, + 10 + intnum, + 10 + longnum, + 10 + floatnum, + 10 + doublenum +from numbers; +", + }, + + ] # end tests + }, # end group + + { + 'name' => 'hcat_hive2hadoop_write_numbers_part', + 'sortResults' => 1, + 'sortBenchmark' => 1, + 'hadoop_classpath' => ':HCAT_JAR:', + 'tests' => [ + + { + 'num' => 1, + 'hive' => " +drop table numbers_part_empty_initially; +", + # does not give error even if the table does not exist + 'expected_out' => "", + }, + + { + 'num' => 2, + 'depends_on' => 'hcat_hive2hadoop_write_numbers_part_1', + 'hive' => " +CREATE TABLE numbers_part_empty_initially ( + INTNUM1000 int, + ID smallint, + INTNUM5 tinyint, + INTNUM100 int, + INTNUM int, + LONGNUM bigint, + FLOATNUM float, + DOUBLENUM double +) +partitioned by ( + datestamp string +) +stored as RCFile +location ':TMP:/hcat_tmp_tables/numbers_part_empty_initially' +TBLPROPERTIES ( + 'hcat.isd'='org.apache.hcatalog.rcfile.RCFileInputDriver', + 'hcat.osd'='org.apache.hcatalog.rcfile.RCFileOutputDriver' +); +", + 'rc' => 0 + }, + + { + 'num' => 3, + # storenumbers + # 'part' -> data is written to datestamp = '20100101' partition of the numbers_part_empty_initially table. + 'depends_on' => 'hcat_hive2hadoop_write_numbers_part_2', + 'hadoop' => q\ +jar :FUNCPATH:/testudf.jar org.apache.hcatalog.utils.StoreNumbers thrift://:THRIFTSERVER: part -libjars file://:HCAT_JAR: +\, + 'rc' => 0, + 'expected_out' => "", + 'expected_err_regex' => "HDFS_BYTES_WRITTEN=\\d+", + 'not_expected_err_regex' => "FAILED", + }, + + { + 'num' => 4, + 'depends_on' => 'hcat_hive2hadoop_write_numbers_part_3', + 'floatpostprocess' => 0, + 'delimiter' => ' ', + 'sortResults' => 1, + 'sortBenchmark' => 1, + 'hive' => " +select + intnum1000, + id, + intnum5, + intnum100, + intnum, + longnum, + floatnum, + doublenum, + datestamp +from numbers_part_empty_initially; +", + 'sql' => " +select + 10 + intnum1000, + 10 + id, + 10 + intnum5, + 10 + intnum100, + 10 + intnum, + 10 + longnum, + 10 + floatnum, + 10 + doublenum, + '20100101' +from numbers; +", + }, + + ] # end tests + }, # end group + + { + 'name' => 'hcat_hive2hadoop_write_complex_nopart', + 'sortResults' => 1, + 'sortBenchmark' => 1, + 'hadoop_classpath' => ':HCAT_JAR:', + 'tests' => [ + + { + 'num' => 1, + 'hive' => " +drop table complex_nopart_empty_initially; +", + # does not give error even if the table does not exist + 'expected_out' => "", + }, + + { + 'num' => 2, + 'depends_on' => 'hcat_hive2hadoop_write_complex_nopart_1', + 'hive' => " +CREATE TABLE complex_nopart_empty_initially ( + mymap map, + mytuple struct, + bagofmap array>, + rownum int +) +stored as rcfile +TBLPROPERTIES ( + 'hcat.isd'='org.apache.hcatalog.rcfile.RCFileInputDriver', + 'hcat.osd'='org.apache.hcatalog.rcfile.RCFileOutputDriver' +); +", + 'rc' => 0 + }, + + { + 'num' => 3, + # storecomplex + # 'ignore' => "Ticket 4229280 - testudf 'typedatacheck' call to getInputTableInfo gives NoSuchMethodError", + 'depends_on' => 'hcat_hive2hadoop_write_complex_nopart_2', + 'hadoop' => q\ +jar :FUNCPATH:/testudf.jar org.apache.hcatalog.utils.StoreComplex thrift://:THRIFTSERVER: -libjars file://:HCAT_JAR: +\, + 'rc' => 0, + 'expected_out' => "", + 'expected_err_regex' => "HDFS_BYTES_WRITTEN=\\d+", + 'not_expected_err_regex' => "FAILED", + }, + + { + 'num' => 4, + 'floatpostprocess' => 0, + 'delimiter' => ' ', + 'sortResults' => 1, + 'sortBenchmark' => 1, + 'depends_on' => 'hcat_hive2hadoop_write_complex_nopart_3', + 'hive' => " +select + mymap, + mytuple, + bagofmap, + rownum +from complex_nopart_empty_initially; +", + 'sql' => "\\d;", # dummy + }, + + ] # end tests + }, # end group + + + + +################################################################################ +# PIG STORED DATA +################################################################################ +# +# The bootstrap creates tables and loads data using Hive. +# Here tables with identical schemas are created and data stored to them using Pig. +# The tables are then verified and used by each of pig, hive, and hadoop. +# +# NOTE: The hcat_pig2pig_setup_tables group must run before the rest of the +# "pig stored data" groups. +# +################################################################################ + +#------------------------------------------------------------------------------- +# Prepare test tables using PIG + other 'store' tests +#------------------------------------------------------------------------------- + + # Currently loading from txt "using PigStorage(':') ..." + + { + 'name' => 'hcat_pig2pig_setup_tables', + # From: + 'tests' => [ + + { + 'num' => 1, + # numbers stored by pig + 'hive' => " +CREATE TABLE tmp_pig2pig_stored_numbers_:RUNID: ( + INTNUM1000 int, + ID int, -- smallint, + INTNUM5 int, -- tinyint, + INTNUM100 int, + INTNUM int, + LONGNUM bigint, + FLOATNUM float, + DOUBLENUM double +) +stored as rcfile +location ':TMP:/hcat_tmp_tables/tmp_pig2pig_stored_numbers_:RUNID:' +TBLPROPERTIES ( + 'hcat.isd'='org.apache.hcatalog.rcfile.RCFileInputDriver', + 'hcat.osd'='org.apache.hcatalog.rcfile.RCFileOutputDriver' +); +", + 'rc' => 0, + }, + + { + 'num' => 2, # GOOD + 'depends_on' => 'hcat_pig2pig_setup_tables_1', + # currently not loading from Hive + 'pig' => q\ +A = load ':INPATH:/txt/numbers.txt' using PigStorage(':') as (intnum1000: int,id: int,intnum5: int,intnum100: int,intnum: int,longnum: long,floatnum: float,doublenum: double); +store A into 'default.tmp_pig2pig_stored_numbers_:RUNID:' + using org.apache.hcatalog.pig.HCatStorer + ('', + 'intnum1000: int,id: int,intnum5: int,intnum100: int,intnum: int,longnum: long,floatnum: float,doublenum: double'); +\, + 'rc' => 0, + }, + + { + 'num' => 3, + # complex stored by pig + 'depends_on' => 'hcat_pig2pig_setup_tables_2', # not really, but #4 does + 'hive' => " +CREATE TABLE tmp_pig2pig_stored_complex_:RUNID: ( + mymap map, + mytuple struct, + bagofmap array>, + rownum int +) +stored as rcfile +location ':TMP:/hcat_tmp_tables/tmp_pig2pig_stored_complex_:RUNID:' +TBLPROPERTIES ( + 'hcat.isd'='org.apache.hcatalog.rcfile.RCFileInputDriver', + 'hcat.osd'='org.apache.hcatalog.rcfile.RCFileOutputDriver' +); +", + 'rc' => 0, + }, + + { + 'num' => 4, + 'depends_on' => 'hcat_pig2pig_setup_tables_3', + # currently not loading from Hive + 'pig' => q\ +A = load 'default.complex' using org.apache.hcatalog.pig.HCatLoader(); +store A into 'default.tmp_pig2pig_stored_complex_:RUNID:' + using org.apache.hcatalog.pig.HCatStorer + ('', + 'mymap: map[],mytuple: (num: int,str: chararray,dbl: double),bagofmap: {(innerfield: map[])},rownum: int'); +\, + 'rc' => 0, + }, + + { + 'num' => 5, + # boolean_table stored by pig + 'hive' => " +CREATE TABLE tmp_pig2pig_stored_boolean_table_:RUNID: ( + myflag boolean, + rownum int +) +row format DELIMITED FIELDS TERMINATED BY '\001' + COLLECTION ITEMS TERMINATED BY '\002' + MAP KEYS TERMINATED BY '\003' +stored as rcfile +location ':TMP:/hcat_tmp_tables/tmp_pig2pig_stored_boolean_table_:RUNID:' +TBLPROPERTIES ( + 'hcat.isd'='org.apache.hcatalog.rcfile.RCFileInputDriver', + 'hcat.osd'='org.apache.hcatalog.rcfile.RCFileOutputDriver' +); +", + 'rc' => 0, + }, + + { + 'num' => 6, + 'depends_on' => 'hcat_pig2pig_setup_tables_5', + 'ignore' => 'Pig does not understnad boolean', + 'pig' => q\ +A = load 'default.boolean_table' using org.apache.hcatalog.pig.HCatLoader(); +store A into 'default.tmp_pig2pig_stored_boolean_table_:RUNID:' + using org.apache.hcatalog.pig.HCatStorer + ('', + 'boolean:string,rownum:integer'); +\, + 'rc' => 0, + }, + + ] # end tests + + }, # end group + + { + 'name' => 'hcat_pig2pig_more_store', + 'tests' => [ + + { + 'num' => 1, + 'hive' => " +CREATE TABLE tmp_pig2pig_store_table_1_:RUNID: ( + INTNUM1000 int, + ID int, -- smallint, + INTNUM5 int, -- tinyint, + INTNUM100 int, + INTNUM int, + LONGNUM bigint, + FLOATNUM float, + DOUBLENUM double +) +stored as rcfile +location ':TMP:/hcat_tmp_tables/tmp_pig2pig_store_table_1_:RUNID:' +TBLPROPERTIES ( + 'hcat.isd'='org.apache.hcatalog.rcfile.RCFileInputDriver', + 'hcat.osd'='org.apache.hcatalog.rcfile.RCFileOutputDriver' +); +", + 'rc' => 0, + }, + + { + 'num' => 2, + 'depends_on' => 'hcat_pig2pig_more_store_1', + 'hive' => " +CREATE TABLE tmp_pig2pig_store_table_2_:RUNID: ( + INTNUM1000 int, + ID int, -- smallint, + INTNUM5 int, -- tinyint, + INTNUM100 int, + INTNUM int, + LONGNUM bigint, + FLOATNUM float, + DOUBLENUM double +) +stored as rcfile +location ':TMP:/hcat_tmp_tables/tmp_pig2pig_store_table_2_:RUNID:' +TBLPROPERTIES ( + 'hcat.isd'='org.apache.hcatalog.rcfile.RCFileInputDriver', + 'hcat.osd'='org.apache.hcatalog.rcfile.RCFileOutputDriver' +); +", + 'rc' => 0, + }, + + { + 'num' => 3, + 'depends_on' => 'hcat_pig2pig_more_store_2', + 'pig' => q\ +A = load ':INPATH:/txt/numbers.txt' using PigStorage(':') as (intnum1000,id,intnum5,intnum100,intnum,longnum,floatnum,doublenum); +-- A = load 'default.numbers_pig' using org.apache.hcatalog.pig.HCatLoader(); +B = foreach A generate (int)intnum1000, (int)id, (int)intnum5, (int)intnum100, (int)intnum, (long)longnum, (float)floatnum, (double)doublenum; +C = filter B by id < 2000; +D = filter B by id >= 2000; +-- store to 1st table +store C into 'default.tmp_pig2pig_store_table_1_:RUNID:' + using org.apache.hcatalog.pig.HCatStorer + ('', + 'intnum1000: int,id: int,intnum5: int,intnum100: int,intnum: int,longnum: long,floatnum: float,doublenum: double'); +-- store to 2nd table +store D into 'default.tmp_pig2pig_store_table_2_:RUNID:' + using org.apache.hcatalog.pig.HCatStorer + ('', + 'intnum1000: int,id: int,intnum5: int,intnum100: int,intnum: int,longnum: long,floatnum: float,doublenum: double'); +\, + 'rc' => 0, + 'expected_err_regex' => "Success", + }, + + { + 'num' => 4, + # to verify data in two tables written above + 'depends_on' => 'hcat_pig2pig_more_store_3', + 'sortBenchmark' => 1, + 'sortResults' => 1, + 'hive' => " +select id, intnum from tmp_pig2pig_store_table_1_:RUNID: +", + 'sql' => " +select id, intnum +from numbers +where id < 2000 +; +", + }, + + { + 'num' => 5, + # to verify data in two tables written above + 'depends_on' => 'hcat_pig2pig_more_store_3', + 'sortBenchmark' => 1, + 'sortResults' => 1, + 'hive' => " +select id, intnum from tmp_pig2pig_store_table_2_:RUNID: +", + 'sql' => " +select id, intnum +from numbers +where id >= 2000 +; +", + }, + +# ADD HCatStorer tests for: +# * not specifying schema +# - schema from HCatLoad ===> DONE +# - schema from load with PigStorage and 'as' ===> DONE +# - schema from 'generate' with types ===> DONE +# * not specifying anything +# - as above plus non-partitioned +# * adding columns +# ERROR tests: +# * missing columns + { + 'num' => 6, + # setup step + 'hive' => " +CREATE TABLE tmp_pig2pig_store_numbers_partitioned_:RUNID: ( + INTNUM1000 int, + ID int, --smallint, + INTNUM5 int, --tinyint, + INTNUM100 int, + INTNUM int, + LONGNUM bigint, + FLOATNUM float, + DOUBLENUM double +) +partitioned by ( + STR1 string, + STR2 string +) +stored as rcfile +location ':TMP:/hcat_tmp_tables/pig2pig_store_numbers_partitioned_:RUNID:' +TBLPROPERTIES ( + 'hcat.isd'='org.apache.hcatalog.rcfile.RCFileInputDriver', + 'hcat.osd'='org.apache.hcatalog.rcfile.RCFileOutputDriver' +); +", + 'rc' => 0, + }, + + { + 'num' => 9, + 'depends_on' => 'hcat_pig2pig_more_store_6', + # Store into a new partition with org.apache.hcatalog.pig.HCatStorer + # Store without specifying schema, schema from PigStorage 'as' + 'pig' => q\ +a = load ':INPATH:/txt/numbers.txt' using PigStorage(':') + as (intnum1000: int,id: int,intnum5: int,intnum100: int,intnum: int,longnum: long,floatnum: float,doublenum: double); +store a into 'default.tmp_pig2pig_store_numbers_partitioned_:RUNID:' + using org.apache.hcatalog.pig.HCatStorer + ('STR1=str1part1,STR2=str2part1'); +\, + 'rc' => 0, + }, + + { + 'num' => 10, + 'depends_on' => 'hcat_pig2pig_more_store_9', + # verify the above + 'sortBenchmark' => 1, + 'sortResults' => 1, + 'floatpostprocess' => 0, + 'delimiter' => ' ', + 'pig' => q\ +a = load 'default.tmp_pig2pig_store_numbers_partitioned_:RUNID:' using org.apache.hcatalog.pig.HCatLoader(); +b = filter a BY ( + str1 == 'str1part1' and + str2 == 'str2part1' + ); +store b into ':OUTPATH:'; +\, + 'sql' => q\ +select *, 'str1part1', 'str2part1' from numbers; +\, + }, + + { + 'num' => 11, + 'depends_on' => 'hcat_pig2pig_more_store_6', + # Store into a new partition with org.apache.hcatalog.pig.HCatStorer + # Store without specifying schema, schema from PigStorage 'as' + 'pig' => q\ +a = load ':INPATH:/txt/numbers.txt' using PigStorage(':') + as (intnum1000: int,id: int,intnum5: int,intnum100: int,intnum: int,longnum: long,floatnum: float,doublenum: double); +store a into 'default.tmp_pig2pig_store_numbers_partitioned_:RUNID:' + using org.apache.hcatalog.pig.HCatStorer + ('STR1=str1part2,STR2=str2part2'); +\, + 'rc' => 0, + }, + + { + 'num' => 12, + 'depends_on' => 'hcat_pig2pig_more_store_11', + # verify the above + 'sortBenchmark' => 1, + 'sortResults' => 1, + 'floatpostprocess' => 0, + 'delimiter' => ' ', + 'pig' => q\ +a = load 'default.tmp_pig2pig_store_numbers_partitioned_:RUNID:' using org.apache.hcatalog.pig.HCatLoader(); +b = filter a BY ( + str1 == 'str1part1' and + str2 == 'str2part1' + ); +store b into ':OUTPATH:'; +\, + 'sql' => q\ +select *, 'str1part1', 'str2part1' from numbers; +\, + }, + + { + 'num' => 13, + 'depends_on' => 'hcat_pig2pig_more_store_6', + # Store into a new partition with org.apache.hcatalog.pig.HCatStorer + # Store without specifying schema, schema from 'generate' with types + 'pig' => q\ +a = load ':INPATH:/txt/numbers.txt' using PigStorage(':') as (intnum1000, id, intnum5, intnum100, intnum, longnum, floatnum, doublenum); +b = foreach a generate (int)intnum1000, (int)id, (int)intnum5, (int)intnum100, (int)intnum, (long)longnum, (float)floatnum, (double)doublenum; +store b into 'default.tmp_pig2pig_store_numbers_partitioned_:RUNID:' + using org.apache.hcatalog.pig.HCatStorer + ('STR1=str1part3,STR2=str2part3'); +\, + 'rc' => 0, + }, + + { + 'num' => 14, + 'depends_on' => 'hcat_pig2pig_more_store_13', + # verify the above + 'sortBenchmark' => 1, + 'sortResults' => 1, + 'floatpostprocess' => 0, + 'delimiter' => ' ', + 'pig' => q\ +a = load 'default.tmp_pig2pig_store_numbers_partitioned_:RUNID:' using org.apache.hcatalog.pig.HCatLoader(); +b = filter a BY ( + str1 == 'str1part2' and + str2 == 'str2part2' + ); +store b into ':OUTPATH:'; +\, + 'sql' => q\ +select *, 'str1part2', 'str2part2' from numbers; +\, + }, + + + ] # end tests + + }, # end group + +#------------------------------------------------------------------------------- +# PIG STORED -> HIVE SECTION +# Not a likely use case, commented out for time being +#------------------------------------------------------------------------------- + + #NaUC# { + #NaUC# 'name' => 'hcat_pig2hive_type_check', + #NaUC# 'tests' => [ + #NaUC# + #NaUC# { + #NaUC# 'num' => 1, + #NaUC# 'hive' => q\ + #NaUC# add jar :FUNCPATH:/testudf.jar; + #NaUC# create temporary function typecheck as 'org.apache.hcatalog.utils.HCatTypeCheckHive'; + #NaUC# select typecheck('int+smallint+tinyint+int+int+bigint+float+double', + #NaUC# intnum1000,id,intnum5,intnum100,intnum,longnum,floatnum,doublenum) from tmp_pig2pig_stored_numbers_:RUNID:; + #NaUC# \, + #NaUC# 'rc' => 0, + #NaUC# 'expected_out_regex' => "class java", + #NaUC# 'expected_err_regex' => "OK", + #NaUC# 'not_expected_err_regex' => "FAILED", + #NaUC# }, + #NaUC# + #NaUC# { + #NaUC# 'num' => 2, + #NaUC# 'hive' => q\ + #NaUC# add jar :FUNCPATH:/testudf.jar; + #NaUC# create temporary function typecheck as 'org.apache.hcatalog.utils.HCatTypeCheckHive'; + #NaUC# select typecheck('map+struct+array>+int', + #NaUC# mymap, mytuple, bagofmap, rownum) from tmp_pig2pig_stored_complex_:RUNID:; + #NaUC# \, + #NaUC# 'rc' => 0, + #NaUC# 'expected_out_regex' => "class java", + #NaUC# 'expected_err_regex' => "OK", + #NaUC# 'not_expected_err_regex' => "FAILED", + #NaUC# }, + #NaUC# + #NaUC# { + #NaUC# 'num' => 3, + #NaUC# 'hive' => q\ + #NaUC# add jar :FUNCPATH:/testudf.jar; + #NaUC# create temporary function typecheck as 'org.apache.hcatalog.utils.HCatTypeCheckHive'; + #NaUC# select typecheck('boolean+int', + #NaUC# myflag,rownum) from tmp_pig2pig_stored_boolean_table_:RUNID:; + #NaUC# \, + #NaUC# 'rc' => 0, + #NaUC# 'expected_out_regex' => "class java", + #NaUC# 'expected_err_regex' => "OK", + #NaUC# 'not_expected_err_regex' => "FAILED", + #NaUC# }, + #NaUC# + #NaUC# { + #NaUC# 'num' => 4, + #NaUC# 'hive' => q\ + #NaUC# add jar :FUNCPATH:/testudf.jar; + #NaUC# create temporary function typecheck as 'org.apache.hcatalog.utils.HCatTypeCheckHive'; + #NaUC# select typecheck('string+string+string+string+int+string+string+string+string+string+string+string+string+string+map+map+array>+string+string+string+string', + #NaUC# bcookie, + #NaUC# src_spaceid, + #NaUC# srcpvid, + #NaUC# ts, + #NaUC# browser, + #NaUC# bckt, + #NaUC# type, + #NaUC# ip, + #NaUC# yuid, + #NaUC# referrer, + #NaUC# pg_spaceid, + #NaUC# dstid, + #NaUC# dstpvid, + #NaUC# dst_spaceid, + #NaUC# page_params, + #NaUC# clickinfo, + #NaUC# viewinfo, + #NaUC# datestamp, + #NaUC# srcid, + #NaUC# action, + #NaUC# testid + #NaUC# ) + #NaUC# where + #NaUC# datestamp = '20091102' + #NaUC# and srcid = '19174' + #NaUC# and browser = 3 + #NaUC# and src_spaceid = '2114728002' + #NaUC# limit 15 + #NaUC# ; + #NaUC# \, + #NaUC# 'rc' => 0, + #NaUC# 'expected_out_regex' => "class java", + #NaUC# 'expected_err_regex' => "OK", + #NaUC# 'not_expected_err_regex' => "FAILED", + #NaUC# }, + #NaUC# + #NaUC# { + #NaUC# 'num' => 5, + #NaUC# 'floatpostprocess' => 1, + #NaUC# 'delimiter' => ' ', + #NaUC# 'hive' => q\ + #NaUC# select + #NaUC# id, -- expect smallint + #NaUC# intnum5 + id, -- expect smallint + #NaUC# intnum5 + id + intnum, -- expect int + #NaUC# intnum5 + id + intnum + longnum, -- expect bigint + #NaUC# intnum5 * id, -- expect smallint + #NaUC# intnum5 * id * intnum, -- expect int + #NaUC# intnum5 * id * intnum * longnum, -- expect bigint + #NaUC# intnum5 + 500, -- expect int + #NaUC# intnum5 + 1.5, -- expect float + #NaUC# cast(intnum5 + 1.5 as double), -- expect double + #NaUC# cast(intnum5 + 1.0 as int), -- expect int + #NaUC# floatnum + doublenum, -- expect double + #NaUC# floatnum * doublenum -- expect double + #NaUC# from tmp_pig2pig_stored_numbers_:RUNID: + #NaUC# order by id + #NaUC# limit 500 + #NaUC# ; + #NaUC# \, + #NaUC# 'sql' => " + #NaUC# select + #NaUC# id, + #NaUC# intnum5 + id, + #NaUC# intnum5 + id + intnum, + #NaUC# intnum5 + id + intnum + longnum, + #NaUC# intnum5 * id, + #NaUC# intnum5 * id * intnum, + #NaUC# intnum5 * id * intnum * longnum, + #NaUC# intnum5 + 500, + #NaUC# intnum5 + 1.5, + #NaUC# cast(intnum5 + 1.5 as double precision), + #NaUC# cast(intnum5 + 1.0 as integer), + #NaUC# floatnum + doublenum, + #NaUC# floatnum * doublenum + #NaUC# from numbers + #NaUC# order by id + #NaUC# limit 500 + #NaUC# ; + #NaUC# ", + #NaUC# }, + #NaUC# + #NaUC# { + #NaUC# 'num' => 6, + #NaUC# 'ignore' => '!!! Hive truncates where Postgres rounds', + #NaUC# 'hive' => q\ + #NaUC# select + #NaUC# intnum5, + #NaUC# cast(intnum5 + 1.9 as int), + #NaUC# from tmp_pig2pig_stored_numbers_:RUNID: + #NaUC# order by id + #NaUC# limit 5 + #NaUC# ; + #NaUC# \, + #NaUC# 'sql' => " + #NaUC# select + #NaUC# intnum5, + #NaUC# cast(intnum5 + 1.9 as integer), + #NaUC# from numbers + #NaUC# order by id + #NaUC# limit 5 + #NaUC# ; + #NaUC# ", + #NaUC# }, + #NaUC# + #NaUC# ] # end tests + #NaUC# }, # end group + #NaUC# + #NaUC# { + #NaUC# 'name' => 'hcat_pig2hive_diagnostic_operators', + #NaUC# 'tests' => [ + #NaUC# + #NaUC# #NaUC# + #NaUC# { + #NaUC# 'num' => 5, + #NaUC# 'hive' => "describe tmp_pig2pig_stored_complex_:RUNID:;", + #NaUC# 'sql' => "\\d", # dummy statement + #NaUC# }, + #NaUC# + #NaUC# { + #NaUC# 'num' => 6, + #NaUC# 'ignore' => 'Open question about expected output', + #NaUC# 'hive' => "describe tmp_pig2pig_stored_complex_:RUNID:.mytuple;", + #NaUC# 'rc' => 0, + #NaUC# 'expected_out_regex' => "mytuple\tstruct\tfrom deserializer", + #NaUC# }, + #NaUC# + #NaUC# { + #NaUC# 'num' => 7, + #NaUC# 'hive' => "describe tmp_pig2pig_stored_complex_:RUNID:.bagofmap;", + #NaUC# 'rc' => 0, + #NaUC# 'expected_out_regex' => "bagofmap\tarray>\tfrom deserializer", + #NaUC# }, + #NaUC# + #NaUC# { + #NaUC# 'num' => 8, + #NaUC# 'hive' => "describe tmp_pig2pig_stored_boolean_table_:RUNID:;", + #NaUC# 'sql' => "\\d", # dummy statement + #NaUC# }, + #NaUC# + #NaUC# { + #NaUC# 'num' => 9, + #NaUC# 'hive' => "describe tmp_pig2pig_stored_boolean_table_:RUNID:.myflag;", + #NaUC# 'rc' => 0, + #NaUC# 'expected_out_regex' => "myflag\tboolean\tfrom deserializer", + #NaUC# }, + #NaUC# + #NaUC# ] # end tests + #NaUC# }, # end group + #NaUC# + #NaUC# { + #NaUC# 'name' => 'hcat_pig2hive_select', + #NaUC# 'sortBenchmark' => 1, + #NaUC# 'sortResults' => 1, + #NaUC# 'tests' => [ + #NaUC# + #NaUC# { + #NaUC# 'num' => 1, + #NaUC# 'floatpostprocess' => 1, + #NaUC# 'delimiter' => ' ', + #NaUC# # actually no nulls in table, so had not needed the casting..., + #NaUC# 'hive' => q\ + #NaUC# select + #NaUC# if (intnum1000 IS NULL, "", cast(intnum1000 as STRING)), + #NaUC# if (id IS NULL, "", cast(id as STRING)), + #NaUC# if (intnum5 IS NULL, "", cast(intnum5 as STRING)), + #NaUC# if (intnum100 IS NULL, "", cast(intnum100 as STRING)), + #NaUC# if (intnum IS NULL, "", cast(intnum as STRING)), + #NaUC# if (longnum IS NULL, "", cast(longnum as STRING)), + #NaUC# if (floatnum IS NULL, "", cast(floatnum as STRING)), + #NaUC# if (doublenum IS NULL, "", cast(doublenum as STRING)) + #NaUC# from tmp_pig2pig_stored_numbers_:RUNID:; + #NaUC# \, + #NaUC# 'sql' => q\ + #NaUC# select + #NaUC# intnum1000, + #NaUC# id, + #NaUC# intnum5, + #NaUC# intnum100, + #NaUC# intnum, + #NaUC# longnum, + #NaUC# floatnum, + #NaUC# doublenum + #NaUC# from numbers; + #NaUC# \, + #NaUC# }, + #NaUC# + #NaUC# { + #NaUC# 'num' => 2, + #NaUC# 'hive' => q\ + #NaUC# select + #NaUC# mymap, + #NaUC# mytuple, + #NaUC# bagofmap, + #NaUC# rownum + #NaUC# from tmp_pig2pig_stored_complex_:RUNID:; + #NaUC# \, + #NaUC# 'sql' => "\\d", # dummy statement + #NaUC# }, + #NaUC# + #NaUC# { + #NaUC# 'num' => 3, + #NaUC# 'hive' => q\ + #NaUC# select + #NaUC# myflag, rownum + #NaUC# from tmp_pig2pig_stored_boolean_table_:RUNID:; + #NaUC# \, + #NaUC# 'sql' => "\\d", # dummy statement + #NaUC# }, + #NaUC# + #NaUC# #NaUC# #NaUC# + #NaUC# #NaUC# + #NaUC# #NaUC# { + #NaUC# 'num' => 8, + #NaUC# 'sortBenchmark' => 1, + #NaUC# 'sortResults' => 1, + #NaUC# 'hive' => q\ + #NaUC# select + #NaUC# distinct + #NaUC# intnum1000, + #NaUC# intnum5, + #NaUC# intnum100, + #NaUC# intnum, + #NaUC# longnum + #NaUC# from tmp_pig2pig_stored_numbers_:RUNID:; + #NaUC# \, + #NaUC# 'sql' => q\ + #NaUC# select + #NaUC# distinct + #NaUC# intnum1000, + #NaUC# intnum5, + #NaUC# intnum100, + #NaUC# intnum, + #NaUC# longnum + #NaUC# from numbers; + #NaUC# \, + #NaUC# }, + #NaUC# + #NaUC# ] # end tests + #NaUC# }, # end group + #NaUC# + #NaUC# { + #NaUC# 'name' => 'hcat_pig2hive_lateral', + #NaUC# 'sortBenchmark' => 1, + #NaUC# 'sortResults' => 1, + #NaUC# 'tests' => [ + #NaUC# + #NaUC# # NOTE: + #NaUC# # The queries below written w/o WHERE clauses until this jira is resolved: + #NaUC# # https://issues.apache.org/jira/browse/HIVE-1056 + #NaUC# # http://wiki.apache.org/hadoop/Hive/LanguageManual/LateralView + #NaUC# + #NaUC# { + #NaUC# 'num' => 1, + #NaUC# 'hive' => q\ + #NaUC# select rownum, item + #NaUC# from tmp_pig2pig_stored_complex_:RUNID: + #NaUC# LATERAL VIEW explode(bagofmap) explodedTable AS item; + #NaUC# \, + #NaUC# 'sql' => "\\d", # dummy statement + #NaUC# }, + #NaUC# + #NaUC# #NaUC# { + #NaUC# 'num' => 3, + #NaUC# 'hive' => q\ + #NaUC# select + #NaUC# rownum, + #NaUC# item, + #NaUC# "item['a1']:", if (item['a1'] IS NULL, "", cast(item['a1'] as STRING)), + #NaUC# "item['a2']:", if (item['a2'] IS NULL, "", cast(item['a2'] as STRING)), + #NaUC# "item['k1']:", if (item['k1'] IS NULL, "", cast(item['k1'] as STRING)), + #NaUC# "item['k6']:", if (item['k6'] IS NULL, "", cast(item['k6'] as STRING)) + #NaUC# from complex LATERAL VIEW explode(bagofmap) explodedTable AS item + #NaUC# ; + #NaUC# \, + #NaUC# 'sql' => "\\d", # dummy statement + #NaUC# }, + #NaUC# + #NaUC# #NaUC# + #NaUC# ] # end tests + #NaUC# }, # end group + #NaUC# + #NaUC# { + #NaUC# 'name' => 'hcat_pig2hive_join', + #NaUC# 'sortBenchmark' => 1, + #NaUC# 'sortResults' => 1, + #NaUC# 'tests' => [ + #NaUC# + #NaUC# { + #NaUC# 'num' => 1, + #NaUC# 'floatpostprocess' => 1, + #NaUC# 'delimiter' => ' ', + #NaUC# 'hive' => q\ + #NaUC# select + #NaUC# a.intnum1000, + #NaUC# b.intnum1000, + #NaUC# a.id, + #NaUC# b.id, + #NaUC# a.intnum5, + #NaUC# b.intnum5, + #NaUC# a.intnum100, + #NaUC# b.intnum100, + #NaUC# a.intnum, + #NaUC# b.intnum, + #NaUC# a.longnum, + #NaUC# b.longnum, + #NaUC# a.floatnum, + #NaUC# b.floatnum, + #NaUC# a.doublenum, + #NaUC# b.doublenum + #NaUC# from + #NaUC# tmp_pig2pig_stored_numbers_:RUNID: a + #NaUC# join numbers b + #NaUC# on (a.intnum5 = b.intnum5) + #NaUC# where + #NaUC# a.id < 30 + #NaUC# and b.id < 40 + #NaUC# order by a.intnum5 + #NaUC# ; + #NaUC# \, + #NaUC# 'sql' => " + #NaUC# select + #NaUC# a.intnum1000, + #NaUC# b.intnum1000, + #NaUC# a.id, + #NaUC# b.id, + #NaUC# a.intnum5, + #NaUC# b.intnum5, + #NaUC# a.intnum100, + #NaUC# b.intnum100, + #NaUC# a.intnum, + #NaUC# b.intnum, + #NaUC# a.longnum, + #NaUC# b.longnum, + #NaUC# a.floatnum, + #NaUC# b.floatnum, + #NaUC# a.doublenum, + #NaUC# b.doublenum + #NaUC# from + #NaUC# numbers as a + #NaUC# join numbers as b + #NaUC# on (a.intnum5 = b.intnum5) + #NaUC# where + #NaUC# a.id < 30 + #NaUC# and b.id < 40 + #NaUC# order by a.intnum5 + #NaUC# ; + #NaUC# ", + #NaUC# }, + #NaUC# + #NaUC# { + #NaUC# 'num' => 2, + #NaUC# # join by map entry + #NaUC# # full outer join + #NaUC# 'hive' => q\ + #NaUC# select + #NaUC# a.rownum, + #NaUC# b.rownum, + #NaUC# a.mymap['mymapk1'], + #NaUC# b.mymap['mymapk1'], + #NaUC# a.mymap['mymapk3'], + #NaUC# b.mymap['mymapk3'], + #NaUC# a.mymap, + #NaUC# b.mymap + #NaUC# from + #NaUC# tmp_pig2pig_stored_complex_:RUNID: a + #NaUC# full outer join complex b + #NaUC# on (a.mymap['mymapk1'] + #NaUC# = b.mymap['mymapk3']) + #NaUC# ; + #NaUC# \, + #NaUC# 'sql' => "\\d", # dummy statement + #NaUC# }, + #NaUC# + #NaUC# { + #NaUC# 'num' => 3, + #NaUC# # join by tuple item + #NaUC# # inner join + #NaUC# 'hive' => q\ + #NaUC# select + #NaUC# a.rownum, + #NaUC# b.rownum, + #NaUC# a.mytuple.dbl, + #NaUC# b.mytuple.dbl, + #NaUC# a.mytuple, + #NaUC# b.mytuple + #NaUC# from + #NaUC# tmp_pig2pig_stored_complex_:RUNID: a + #NaUC# join complex b + #NaUC# on (a.mytuple.dbl = b.mytuple.dbl + 1) + #NaUC# ; + #NaUC# \, + #NaUC# 'sql' => "\\d", # dummy statement + #NaUC# }, + #NaUC# + #NaUC# ] # end tests + #NaUC# }, # end group + #NaUC# + #NaUC# +#------------------------------------------------------------------------------- +# PIG STORED -> PIG SECTION +#------------------------------------------------------------------------------- + + { + 'name' => 'hcat_pig2pig_type_check', + # Using udf from: + # + # * This UDF can be used to check that a tuple presented by org.apache.hcatalog.pig.HCatLoader has the + # * right types for the fields + # * (...) + # * The output should only contain the value '1' in all rows. (This UDF returns + # * the integer value 1 if all fields have the right type, else throws IOException) + + 'tests' => [ + + { + 'num' => 1, + 'pig' => " +register :FUNCPATH:/testudf.jar; +a = load 'default.tmp_pig2pig_stored_numbers_:RUNID:' using org.apache.hcatalog.pig.HCatLoader(); +b = foreach a generate org.apache.hcatalog.utils.HCatTypeCheck('intnum1000:int,id:int,intnum5:int,intnum100:int,intnum:int,longnum:long,floatnum:float,doublenum:double', *); +store b into ':OUTPATH:'; +", + 'rc' => 0, + 'expected_err_regex' => "Success", + # 'expected_out_regex' => "1", + # 'not_expected_out_regex' => "[^1\\t]", + }, + + { + 'num' => 2, + 'pig' => " +register :FUNCPATH:/testudf.jar; +a = load 'default.tmp_pig2pig_stored_complex_:RUNID:' using org.apache.hcatalog.pig.HCatLoader(); +-- b = foreach a generate org.apache.hcatalog.utils.HCatTypeCheck('{mymap: map[],mytuple: (num: int,str: chararray,dbl: double),bagofmap: {(innerfield: map[])},rownum: int', *); +b = foreach a generate org.apache.hcatalog.utils.HCatTypeCheck('mymap: map[],mytuple: (num: int,str: chararray,dbl: double),bagofmap: {(innerfield: map[])},rownum: int', *); +store b into ':OUTPATH:'; +", + 'rc' => 0, + 'expected_err_regex' => "Success", + # 'expected_out_regex' => "1", + # 'not_expected_out_regex' => "[^1\\t]", + }, + + { + 'num' => 3, + 'ignore' => 'pig does not understand boolean', + 'pig' => " +register :FUNCPATH:/testudf.jar; +a = load 'default.tmp_pig2pig_stored_boolean_table_:RUNID:' using org.apache.hcatalog.pig.HCatLoader(); +b = foreach a generate org.apache.hcatalog.utils.HCatTypeCheck('boolean+int', *); +store b into ':OUTPATH:'; +", + 'rc' => 0, + 'expected_err_regex' => "Success", + # 'expected_out_regex' => "1", + # 'not_expected_out_regex' => "[^1\\t]", + }, + + ] # end tests + }, # end group + +#------------------------------------------------------------------------------- +# PIG STORED -> HADOOP SECTION +#------------------------------------------------------------------------------- + + { + 'name' => 'hcat_pig2hadoop_read', + 'sortResults' => 1, + 'sortBenchmark' => 1, + 'hadoop_classpath' => ':HCAT_JAR:', + 'tests' => [ + + # This tests is covered under hcat_hive2hadoop_read_1 + # { + # 'num' => 1, + # # sum numbers + # 'ignore' => '"sumnumbers" is hard coded to run on "numbers", which is created by Hive, not pig.', + # 'floatpostprocess' => 0, + # 'delimiter' => ' ', + # 'hadoop' => q\ + #jar :FUNCPATH:/testudf.jar sumnumbers thrift://:THRIFTSERVER: :OUTPATH: -libjars file://:HCAT_JAR: + #\, + # 'sql' => " + #select + # intnum1000, + # sum (id), + # sum (intnum5), + # sum (intnum100), + # sum (intnum), + # sum (longnum), + # sum (floatnum), + # sum (doublenum) + #from numbers + #group by intnum1000 + #order by intnum1000; + #", + # }, + + ] # end tests + }, # end group + + { + 'name' => 'hcat_pig2hadoop_type_check', + 'sortResults' => 1, + 'sortBenchmark' => 1, + 'hadoop_classpath' => ':HCAT_JAR:', + 'tests' => [ + + { + 'num' => 1, + # typedatacheck complex +# aborts !!! + 'hadoop' => q\ +jar :FUNCPATH:/testudf.jar org.apache.hcatalog.utils.TypeDataCheck thrift://:THRIFTSERVER: tmp_pig2pig_stored_complex_:RUNID: 'map+struct+array>+int' :OUTPATH: tab -libjars file://:HCAT_JAR: +\, + 'sql' => "select * from complex;", + }, + + { + 'num' => 2, + # typedatacheck numbers + 'floatpostprocess' => 0, + 'delimiter' => ' ', + 'hadoop' => q\ +jar :FUNCPATH:/testudf.jar org.apache.hcatalog.utils.TypeDataCheck thrift://:THRIFTSERVER: tmp_pig2pig_stored_numbers_:RUNID: int+int+int+int+int+bigint+float+double :OUTPATH: tab -libjars file://:HCAT_JAR: +\, + 'sql' => "select * from numbers;", + }, + + { + 'num' => 3, + # typedatacheck boolean_table + 'ignore' => 'pig does not understand boolean', + 'hadoop' => q\ +jar :FUNCPATH:/testudf.jar org.apache.hcatalog.utils.TypeDataCheck thrift://:THRIFTSERVER: tmp_pig2pig_stored_boolean_table_:RUNID: boolean+int :OUTPATH: tab -libjars file://:HCAT_JAR: +\, + 'sql' => "select * from boolean_table;", + }, + + ] # end tests + }, # end group + + +################################################################################ +# HADOOP STORED DATA +################################################################################ +# +# The bootstrap creates tables and loads data using Hive. +# Here tables with identical schemas are created and data stored to them using Hadoop. +# The tables are then verified and used by each of pig, hive, and hadoop. +# +# NOTE: The hcat_hive2hadoop_setup_tables group must run before the rest of the +# "hadoop stored data" groups. +# +################################################################################ + +#------------------------------------------------------------------------------- +# Prepare test tables using Hadoop +#------------------------------------------------------------------------------- + +# This replicates the drop, create and writing parts from the hcat_hive2hadoop_... tests. +# This should ideally be moved to the bootstrap conf, but would require a change in table name. + + { + 'name' => 'hcat_hive2hadoop_setup_tables', + 'sortResults' => 1, + 'sortBenchmark' => 1, + 'hadoop_classpath' => ':HCAT_JAR:', + 'tests' => [ + + { + 'num' => 1, + 'hive' => " +drop table numbers_nopart_empty_initially; +", + # does not give error even if the table does not exist + 'expected_out' => "", + }, + + { + 'num' => 2, + 'depends_on' => 'hcat_hive2hadoop_setup_tables_1', + 'hive' => " +CREATE TABLE numbers_nopart_empty_initially ( + INTNUM1000 int, + ID smallint, + INTNUM5 tinyint, + INTNUM100 int, + INTNUM int, + LONGNUM bigint, + FLOATNUM float, + DOUBLENUM double +) +stored as RCFile +location ':TMP:/hcat_tmp_tables/numbers_nopart_empty_initially' +TBLPROPERTIES ( + 'hcat.isd'='org.apache.hcatalog.rcfile.RCFileInputDriver', + 'hcat.osd'='org.apache.hcatalog.rcfile.RCFileOutputDriver' +); +", + 'rc' => 0 + }, + + { + 'num' => 3, + # storenumbers + # 'nopart' -> data is written to the numbers_nopart_empty_initially table. + 'depends_on' => 'hcat_hive2hadoop_setup_tables_2', + 'floatpostprocess' => 0, + 'delimiter' => ' ', + 'hadoop' => q\ +jar :FUNCPATH:/testudf.jar org.apache.hcatalog.utils.StoreNumbers thrift://:THRIFTSERVER: nopart -libjars file://:HCAT_JAR: +\, + 'rc' => 0, + 'expected_out' => "", + 'expected_err_regex' => "HDFS_BYTES_WRITTEN=\\d+", + 'not_expected_err_regex' => "FAILED", + }, + + { + 'num' => 4, + 'hive' => " +drop table numbers_part_empty_initially; +", + # does not give error even if the table does not exist + 'expected_out' => "", + }, + + { + 'num' => 5, + 'depends_on' => 'hcat_hive2hadoop_setup_tables_4', + 'hive' => " +CREATE TABLE numbers_part_empty_initially ( + INTNUM1000 int, + ID smallint, + INTNUM5 tinyint, + INTNUM100 int, + INTNUM int, + LONGNUM bigint, + FLOATNUM float, + DOUBLENUM double +) +partitioned by ( + datestamp string +) +stored as RCFile +location ':TMP:/hcat_tmp_tables/numbers_part_empty_initially' +TBLPROPERTIES ( + 'hcat.isd'='org.apache.hcatalog.rcfile.RCFileInputDriver', + 'hcat.osd'='org.apache.hcatalog.rcfile.RCFileOutputDriver' +); +", + 'rc' => 0 + }, + + { + 'num' => 6, + # storenumbers + # 'part' -> data is written to datestamp = '20100101' partition of the numbers_part_empty_initially table. + 'depends_on' => 'hcat_hive2hadoop_setup_tables_5', + 'floatpostprocess' => 0, + 'delimiter' => ' ', + 'hadoop' => q\ +jar :FUNCPATH:/testudf.jar org.apache.hcatalog.utils.StoreNumbers thrift://:THRIFTSERVER: part -libjars file://:HCAT_JAR: +\, + 'rc' => 0, + 'expected_out' => "", + 'expected_err_regex' => "HDFS_BYTES_WRITTEN=\\d+", + 'not_expected_err_regex' => "FAILED", + }, + + { + 'num' => 7, + 'hive' => " +drop table complex_nopart_empty_initially; +", + # does not give error even if the table does not exist + 'expected_out' => "", + }, + + { + 'num' => 8, + 'depends_on' => 'hcat_hive2hadoop_setup_tables_7', + 'hive' => " +CREATE TABLE complex_nopart_empty_initially ( + mymap map, + mytuple struct, + bagofmap array>, + rownum int +) +stored as rcfile +TBLPROPERTIES ( + 'hcat.isd'='org.apache.hcatalog.rcfile.RCFileInputDriver', + 'hcat.osd'='org.apache.hcatalog.rcfile.RCFileOutputDriver' +); +", + 'rc' => 0 + }, + + { + 'num' => 9, + # storecomplex + 'depends_on' => 'hcat_hive2hadoop_setup_tables_8', + 'floatpostprocess' => 0, + 'delimiter' => ' ', + 'hadoop' => q\ +jar :FUNCPATH:/testudf.jar org.apache.hcatalog.utils.StoreComplex thrift://:THRIFTSERVER: -libjars file://:HCAT_JAR: +\, + 'rc' => 0, + 'expected_out' => "", + 'expected_err_regex' => "HDFS_BYTES_WRITTEN=", + 'not_expected_err_regex' => "FAILED", + }, + + # !!! Add tests reading the just stored data + + ] # end tests + }, # end group + +#------------------------------------------------------------------------------- +# HADOOP STORED -> HIVE SECTION +#------------------------------------------------------------------------------- + + { + 'name' => 'hcat_hadoop2hive_type_check', + 'tests' => [ + # for how the 'typecheck' udf works. + # If the the typecheck does not pass, the udf will abort. + # Look at the jobtracker for info about the actual value, + # e.g. something like: "Expected java.lang.String, got java.lang.Integer" + # The verification: + # 'expected_out_regex' => "class java", + # is needed because otherwise the tests might "PASS" because the output was empty... + + { + 'num' => 1, + 'hive' => q\ +add jar :FUNCPATH:/testudf.jar; +create temporary function typecheck as 'org.apache.hcatalog.utils.HCatTypeCheckHive'; +select typecheck('int+smallint+tinyint+int+int+bigint+float+double', +intnum1000,id,intnum5,intnum100,intnum,longnum,floatnum,doublenum) from numbers_nopart_empty_initially; +\, + 'rc' => 0, + 'expected_out_regex' => "class java", + 'expected_err_regex' => "OK", + 'not_expected_err_regex' => "FAILED", + }, + + { + 'num' => 2, + 'depends_on' => 'hcat_hive2hadoop_setup_tables_6', + 'hive' => q\ +add jar :FUNCPATH:/testudf.jar; +create temporary function typecheck as 'org.apache.hcatalog.utils.HCatTypeCheckHive'; +select typecheck('int+smallint+tinyint+int+int+bigint+float+double+string', +intnum1000,id,intnum5,intnum100,intnum,longnum,floatnum,doublenum,datestamp) from numbers_part_empty_initially; +\, + 'rc' => 0, + 'expected_out_regex' => "class java", + 'expected_err_regex' => "OK", + 'not_expected_err_regex' => "FAILED", + }, + + { + 'num' => 3, + 'hive' => q\ +add jar :FUNCPATH:/testudf.jar; +create temporary function typecheck as 'org.apache.hcatalog.utils.HCatTypeCheckHive'; +select typecheck('map+struct+array>+int', +mymap, mytuple, bagofmap, rownum) from complex_nopart_empty_initially; +\, + 'rc' => 0, + 'expected_out_regex' => "class java", + 'expected_err_regex' => "OK", + 'not_expected_err_regex' => "FAILED", + }, + + ] # end tests + }, # end group + +#------------------------------------------------------------------------------- +# HADOOP STORED -> PIG SECTION +#------------------------------------------------------------------------------- + + { + 'name' => 'hcat_hadoop2pig_type_check', + # * This UDF can be used to check that a tuple presented by org.apache.hcatalog.pig.HCatLoader has the + # * right types for the fields + # * (...) + # * The output should only contain the value '1' in all rows. (This UDF returns + # * the integer value 1 if all fields have the right type, else throws IOException) + + 'tests' => [ + + { + 'num' => 1, + 'pig' => " +register :FUNCPATH:/testudf.jar; +a = load 'default.numbers_nopart_pig_empty_initially' using org.apache.hcatalog.pig.HCatLoader(); +b = foreach a generate org.apache.hcatalog.utils.HCatTypeCheck('intnum1000:int,id:int,intnum5:int,intnum100:int,intnum:int,longnum:long,floatnum:float,doublenum:double', *); +store b into ':OUTPATH:'; +", + 'rc' => 0, + 'expected_err_regex' => "Success", + # 'expected_out_regex' => "1", + # 'not_expected_out_regex' => "[^1\\t]", + }, + + # default.numbers_part_empty_initially has smallint/tinyint which cannot be handled by pig + # { + # 'num' => 2, + # 'pig' => " + #register :FUNCPATH:/testudf.jar; + #a = load 'default.numbers_part_empty_initially' using org.apache.hcatalog.pig.HCatLoader(); + #b = foreach a generate org.apache.hcatalog.utils.HCatTypeCheck('intnum1000:int,id:int,intnum5:int,intnum100:int,intnum:int,longnum:long,floatnum:float,doublenum:double+string', *); + #store b into ':OUTPATH:'; + #", + # 'rc' => 0, + # 'expected_err_regex' => "Success", + # # 'expected_out_regex' => "1", + # # 'not_expected_out_regex' => "[^1\\t]", + # }, + + { + 'num' => 3, + 'pig' => " +register :FUNCPATH:/testudf.jar; +a = load 'default.complex_nopart_empty_initially' using org.apache.hcatalog.pig.HCatLoader(); +b = foreach a generate org.apache.hcatalog.utils.HCatTypeCheck('m:map[],t:tuple(num:int,str:chararray,dbl:double),bg:bag{t:tuple(m:map[])},i:int', *); +store b into ':OUTPATH:'; +", + 'rc' => 0, + 'expected_err_regex' => "Success", + # 'expected_out_regex' => "1", + # 'not_expected_out_regex' => "[^1\\t]", + }, + + ] # end tests + }, # end group + +#------------------------------------------------------------------------------- +# HADOOP STORED -> HADOOP SECTION +#------------------------------------------------------------------------------- + + { + 'name' => 'hcat_hadoop2hadoop_type_check', + # * This UDF can be used to check that a tuple presented by org.apache.hcatalog.pig.HCatLoader has the + # * right types for the fields + # * (...) + # * The output should only contain the value '1' in all rows. (This UDF returns + # * the integer value 1 if all fields have the right type, else throws IOException) + + 'tests' => [ + + { + 'num' => 1, + # typedatacheck complex_nopart_empty_initially + 'hadoop' => q\ +jar :FUNCPATH:/testudf.jar org.apache.hcatalog.utils.TypeDataCheck thrift://:THRIFTSERVER: complex_nopart_empty_initially 'map+struct+array>+int' :OUTPATH: tab -libjars file://:HCAT_JAR: +\, + 'sql' => "select * from complex;", + }, + + { + 'num' => 2, + # typedatacheck numbers_nopart_empty_initially + 'depends_on' => 'hcat_hive2hadoop_write_numbers_nopart_3', + 'floatpostprocess' => 0, + 'delimiter' => ' ', + 'hadoop' => q\ +jar :FUNCPATH:/testudf.jar org.apache.hcatalog.utils.TypeDataCheck thrift://:THRIFTSERVER: numbers_nopart_empty_initially int+smallint+tinyint+int+int+bigint+float+double :OUTPATH: tab -libjars file://:HCAT_JAR: +\, + 'sql' => "select intnum1000+10, id+10, intnum5+10, intnum100 + 10, intnum+10, longnum+10, floatnum+10, doublenum+10 from numbers;", + }, + + { + 'num' => 3, + # typedatacheck numbers_part_empty_initially + 'floatpostprocess' => 0, + 'delimiter' => ' ', + 'hadoop' => q\ +jar :FUNCPATH:/testudf.jar org.apache.hcatalog.utils.TypeDataCheck thrift://:THRIFTSERVER: numbers_part_empty_initially int+smallint+tinyint+int+int+bigint+float+double+string :OUTPATH: tab -libjars file://:HCAT_JAR: +\, + 'sql' => "select intnum1000+10, id+10, intnum5+10, intnum100 + 10, intnum+10, longnum+10, floatnum+10, doublenum+10 , 20100101 from numbers;", + }, + + ] # end tests + }, # end group + +################################################################################ +# NEGATIVE +################################################################################ + +#------------------------------------------------------------------------------- +# Negative: hive +#------------------------------------------------------------------------------- + + { + 'name' => 'hcat_negative_hive', + 'tests' => [ + + { + 'num' => 1, + # Describe invalid Table + 'hive' => " +describe non_existing_table; +", + 'rc' => 9, # what is expected ? !!! + 'expected_err_regex' => "FAILED", + 'not_expected_err_regex' => "OK", + }, + + { + 'num' => 2, + # CREATE a table name that already exists, step 1 + 'hive' => " +CREATE TABLE tmp_name_collision_:RUNID: ( + ID int, + STR string +) +stored as rcfile +location ':TMP:/hcat_tmp_tables/tmp_name_collision_:RUNID:' +TBLPROPERTIES ( + 'hcat.isd'='org.apache.hcatalog.rcfile.RCFileInputDriver', + 'hcat.osd'='org.apache.hcatalog.rcfile.RCFileOutputDriver' +); +", + 'rc' => 0, + }, + + { + 'num' => 3, + # CREATE a table name that already exists, step 2 + 'depends_on' => 'hcat_negative_hive_2', + 'hive' => " +CREATE TABLE tmp_name_collision_:RUNID: ( + ID lint, + STR string +) +stored as rcfile +location ':TMP:/hcat_tmp_tables/tmp_name_collision_:RUNID:' +TBLPROPERTIES ( + 'hcat.isd'='org.apache.hcatalog.rcfile.RCFileInputDriver', + 'hcat.osd'='org.apache.hcatalog.rcfile.RCFileOutputDriver' +); +", + 'rc' => 11, # what is expected ? !!! + 'expected_err_regex' => "FAILED", + 'not_expected_err_regex' => "OK", + }, + + { + 'num' => 4, + # SELECT with invalid column + 'hive' => " +select id, no_such_column from numbers; +", + 'rc' => 10, # what is expected ? !!! + # 'expected_err_regex' => "FAILED", + 'expected_err_regex' => "FAILED: Error in semantic analysis: Line 2:11 Invalid table alias or column reference 'no_such_column'", + 'not_expected_err_regex' => "OK", + + }, + + ] # end tests + + }, # end group +#------------------------------------------------------------------------------- +# Negative: pig +#------------------------------------------------------------------------------- + + { + 'name' => 'hcat_negative_pig2pig', + 'tests' => [ + + { + 'num' => 1, + # setup step + 'hive' => " +CREATE TABLE tmp_two_partitions_:RUNID: ( + INTNUM1000 int, + ID smallint, + INTNUM5 tinyint, + INTNUM100 int, + INTNUM int, + LONGNUM bigint, + FLOATNUM float, + DOUBLENUM double +) +partitioned by ( + STR1 string, + STR2 string +) +stored as rcfile +location ':TMP:/hcat_tmp_tables/tmp_two_partitions_:RUNID:' +TBLPROPERTIES ( + 'hcat.isd'='org.apache.hcatalog.rcfile.RCFileInputDriver', + 'hcat.osd'='org.apache.hcatalog.rcfile.RCFileOutputDriver' +); +", + 'rc' => 0, + }, + + { + 'num' => 2, + # setup step + 'hive' => " +CREATE TABLE tmp_non_partitioned_:RUNID: ( + INTNUM1000 int, + ID smallint, + INTNUM5 tinyint, + INTNUM100 int, + INTNUM int, + LONGNUM bigint, + FLOATNUM float, + DOUBLENUM double, + STR1 string, + STR2 string +) +stored as rcfile +location ':TMP:/hcat_tmp_tables/tmp_non_partitioned_:RUNID:' +TBLPROPERTIES ( + 'hcat.isd'='org.apache.hcatalog.rcfile.RCFileInputDriver', + 'hcat.osd'='org.apache.hcatalog.rcfile.RCFileOutputDriver' +); +", + 'rc' => 0, + }, + + { + 'num' => 3, + 'depends_on' => 'hcat_negative_pig2pig_store_1', + # attempt to give partitions in writing to non-partitioned table + 'pig' => q\ +A = load ':INPATH:/txt/numbers.txt' using PigStorage(':') as (intnum1000: int,id: int,intnum5: int,intnum100: int,intnum: int,longnum: long,floatnum: float,doublenum: double); +store A into 'default.tmp_non_partitioned_:RUNID:' + using org.apache.hcatalog.pig.HCatStorer + ('STR1=A,STR2=B', + 'intnum1000: int,id: int,intnum5: int,intnum100: int,intnum: int,longnum: long,floatnum: float,doublenum: double'); +\, + 'rc' => 6, # what is expected ? !!! + 'expected_out' => "", + 'not_expected_err_regex' => "OK", + 'expected_err_regex' => "ERROR", + # ERROR 2116: Unexpected error. Could not validate the output specification for: default.tmp_non_partitioned_1280729182 + # and in secondary log: + # Caused by: java.io.IOException: Invalid partition values specified, table tmp_non_partitioned_1280729182 has 0 partition keys) + }, + + { + 'num' => 4, + 'depends_on' => 'hcat_negative_pig2pig_store_2', + # attempt to give no partitions in writing to partitioned table + 'pig' => q\ +A = load ':INPATH:/txt/numbers.txt' using PigStorage(':') as (intnum1000: int,id: int,intnum5: int,intnum100: int,intnum: int,longnum: long,floatnum: float,doublenum: double); +store A into 'default.tmp_non_partitioned_:RUNID:' + using org.apache.hcatalog.pig.HCatStorer + ('', + 'intnum1000: int,id: int,intnum5: int,intnum100: int,intnum: int,longnum: long,floatnum: float,doublenum: double'); +\, + 'rc' => 6, # what is expected ? !!! + 'expected_out' => "", + 'not_expected_err_regex' => "OK", + 'expected_err_regex' => "ERROR", + }, + + { + 'num' => 5, + # attempt storing to non-existing table + 'depends_on' => 'hcat_negative_pig2pig_store_1', + 'pig' => q\ +A = load ':INPATH:/txt/numbers.txt' using PigStorage(':') as (intnum1000: int,id: int,intnum5: int,intnum100: int,intnum: int,longnum: long,floatnum: float,doublenum: double); +store A into 'default.no_such_table' + using org.apache.hcatalog.pig.HCatStorer + ('STR1=A,STR2=B', + 'intnum1000: int,id: int,intnum5: int,intnum100: int,intnum: int,longnum: long,floatnum: float,doublenum: double'); +\, + 'rc' => 6, # what is expected ? !!! + 'expected_out' => "", + 'not_expected_err_regex' => "OK", + 'expected_err_regex' => "ERROR", + # In secondary log: + # Caused by: NoSuchObjectException(message:default.no_such_table table not found) + }, + + { + 'num' => 6, + 'depends_on' => 'hcat_negative_pig2pig_store_1', + # attempt loading from non-existing table + 'pig' => q\ +A = load ':INPATH:/txt/numbers.txt' using PigStorage(':') as (intnum1000: int,id: int,intnum5: int,intnum100: int,intnum: int,longnum: long,floatnum: float,doublenum: double); +store A into 'default.no_such_table' + using org.apache.hcatalog.pig.HCatStorer + ('STR1=A,STR2=B', + 'intnum1000: int,id: int,intnum5: int,intnum100: int,intnum: int,longnum: long,floatnum: float,doublenum: double'); +\, + 'rc' => 6, # what is expected ? !!! + 'expected_out' => "", + 'not_expected_err_regex' => "OK", + 'expected_err_regex' => "ERROR", + }, + + { + 'num' => 7, + 'depends_on' => 'hcat_negative_pig2pig_store_2', + # attempt to write to existing partition + 'pig' => q\ +A = load ':INPATH:/txt/numbers.txt' using PigStorage(':') as (intnum1000: int,id: int,intnum5: int,intnum100: int,intnum: int,longnum: long,floatnum: float,doublenum: double); +store A into 'default.tmp_two_partitions_:RUNID:' + using org.apache.hcatalog.pig.HCatStorer + ('STR1=A,STR2=B', + 'intnum1000: int,id: int,intnum5: int,intnum100: int,intnum: int,longnum: long,floatnum: float,doublenum: double'); +store A into 'default.tmp_two_partitions_:RUNID:' + using org.apache.hcatalog.pig.HCatStorer + ('STR1=A,STR2=B', + 'intnum1000: int,id: int,intnum5: int,intnum100: int,intnum: int,longnum: long,floatnum: float,doublenum: double'); +\, + 'rc' => 6, # what is expected ? !!! + 'expected_out' => "", + 'not_expected_err_regex' => "OK", + 'expected_err_regex' => "ERROR", + # Secondary log has: + # Caused by: java.io.IOException: No partition key value provided for key str1 of table tmp_two_partitions_1280774139 + }, + + { + 'num' => 8, + # filter on non-existing column + 'pig' => " +a = load 'default.numbers_pig' using org.apache.hcatalog.pig.HCatLoader(); +b = foreach a generate non_such, id, intnum; +store b into ':OUTPATH:'; +", + 'rc' => 6, + 'expected_out' => "", + 'not_expected_err_regex' => "OK", + 'expected_err_regex' => "Invalid", + }, + + { + 'num' => 9, + # filter on non-existing column + 'pig' => " +a = load 'default.numbers_pig' using org.apache.hcatalog.pig.HCatLoader(); +b = filter a by ((non_such == intnum) or (non_such != intnum)); +store b into ':OUTPATH:'; +", + 'rc' => 6, + 'expected_out' => "", + 'not_expected_err_regex' => "OK", + 'expected_err_regex' => "Invalid", + }, + + { + 'num' => 10, + # Pig does not understand boolean + 'pig' => " +a = load 'default.boolean_table' using org.apache.hcatalog.pig.HCatLoader(); +describe a; +", + 'rc' => 6, + 'expected_out' => "", + 'not_expected_err_regex' => "OK", + 'expected_err_regex' => "ERROR 1115: HCatalog column type 'BOOLEAN' is not supported in Pig as a column type", + }, + + { + 'num' => 11, + # Pig does not understand boolean + 'pig' => " +register :FUNCPATH:/testudf.jar; +a = load 'default.boolean_table' using org.apache.hcatalog.pig.HCatLoader(); +b = foreach a generate org.apache.hcatalog.utils.HCatTypeCheck('boolean+int', *); +store b into ':OUTPATH:'; +", + 'rc' => 6, + 'expected_err_regex' => "ERROR 1115: HCatalog column type 'BOOLEAN' is not supported in Pig as a column type", + 'expected_out' => "", + }, + + ] # end tests + + }, # end group + + ] # end groups +} +; + Index: src/test/e2e/hcatalog/paramfiles/params_3 =================================================================== --- src/test/e2e/hcatalog/paramfiles/params_3 (revision 0) +++ src/test/e2e/hcatalog/paramfiles/params_3 (revision 0) @@ -0,0 +1,3 @@ +# this is a comment +fname = studenttab10k +unusedkey = unusedvalueihope Index: src/test/e2e/hcatalog/conf/testpropertiesfile.conf =================================================================== --- src/test/e2e/hcatalog/conf/testpropertiesfile.conf (revision 0) +++ src/test/e2e/hcatalog/conf/testpropertiesfile.conf (revision 0) @@ -0,0 +1,21 @@ +############################################################################ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +$cfg = { + 'harness.log' => './out/harness.log' + ,'harness.log.level' => 'DEBUG' + ,'harness.console.level'=> 'INFO' +}; Index: src/test/e2e/hcatalog/conf/existing_deployer.conf =================================================================== --- src/test/e2e/hcatalog/conf/existing_deployer.conf (revision 0) +++ src/test/e2e/hcatalog/conf/existing_deployer.conf (revision 0) @@ -0,0 +1,40 @@ +#!/usr/bin/env perl + +############################################################################ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +############################################################################### +# Test for TestHarness itself. +# +# + +$cfg = { + 'deployer' => 'ExistingClusterDeployer', + + # hadoop values + 'hadoopdir' => $ENV{'PH_CLUSTER'}, + + # db values +# 'dbuser' => 'pigtester', +# 'dbdb' => 'pigtest2', + + # generate values + 'gentool' => './libexec/HCatTest/generate_data.pl', +} +; + + + Index: src/test/e2e/hcatalog/conf/default.conf =================================================================== --- src/test/e2e/hcatalog/conf/default.conf (revision 0) +++ src/test/e2e/hcatalog/conf/default.conf (revision 0) @@ -0,0 +1,71 @@ +############################################################################ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +my $me = `whoami`; +chomp $me; + +# The contents of this file can be rewritten to fit your installation. +# Also, you can define the following environment variables and set things up as in the test setup +# PH_ROOT Root directory where test harness is installed +# PH_LOCAL Root directory for input and output for local mode tests +# PH_OUT Root directory where output data will be stored (on local disk, not HDFS) +# PH_CLUSTER Root directory for cluster being used +# HCAT_ROOT Root directory for hcat version being used + +$cfg = { + #HDFS + 'inpathbase' => '/user/pig/tests/data' + , 'outpathbase' => '/user/pig/out' + + #LOCAL + , 'localinpathbase' => "$ENV{PH_LOCAL}/in" + , 'localoutpathbase' => "$ENV{PH_LOCAL}/out/log" + , 'localxmlpathbase' => "$ENV{PH_LOCAL}/out/xml" + , 'localpathbase' => "$ENV{PH_LOCAL}/out/pigtest/$me" + + #TEST + , 'benchmarkPath' => "$ENV{PH_OUT}/benchmarks" + , 'scriptPath' => "$ENV{PH_ROOT}/libexec" + , 'tmpPath' => '/tmp/pigtest' + , 'jythonjar' => "$ENV{PH_JYTHON_JAR}" + + #PIG + , 'testconfigpath' => "$ENV{PH_CLUSTER}" + , 'hadoopbin' => "$ENV{PH_CLUSTER_BIN}" + , 'funcjarPath' => "$ENV{PH_ROOT}/lib/java" + , 'paramPath' => "$ENV{PH_ROOT}/paramfiles" + , 'pigpath' => "$ENV{HCAT_ROOT}" + , 'oldpigpath' => "$ENV{PH_OLDPIG}" + ,'additionaljars' => "$ENV{HCAT_EXTRA_JARS}" + + #HADOOP + , 'hadoopHome' => "$ENV{HCAT_ROOT}/lib" + ,'hadoop_classpath' => "$ENV{HCAT_EXTRA_JARS}" + , 'userhomePath' => "$ENV{HOME}" + ,'local.bin' => '/usr/bin' + + ,'logDir' => "$ENV{PH_OUT}/log" + ,'propertiesFile' => "./conf/testpropertiesfile.conf" + ,'harness.console.level' => 'ERROR' + + #HIVE + , 'hive_bin_location' => "$ENV{HIVE_ROOT}/build/dist/bin" + + #HCATALOG + ,'thriftserver' => "$ENV{HCAT_URL}" + ,'hcatalog.jar' => "$ENV{HCAT_JAR},file://$ENV{HIVE_ROOT}/lib/thrift-fb303-0.5.0.jar,file://$ENV{HIVE_ROOT}/lib/thrift-0.5.0.jar,file://$ENV{HIVE_ROOT}/build/metastore/hive-metastore-0.8.0-SNAPSHOT.jar,file://$ENV{HIVE_ROOT}/build/common/hive-common-0.8.0-SNAPSHOT.jar,file://$ENV{HIVE_ROOT}/build/shims/hive-shims-0.8.0-SNAPSHOT.jar,file://$ENV{HIVE_ROOT}/build/serde/hive-serde-0.8.0-SNAPSHOT.jar,file://$ENV{HIVE_ROOT}/build/ql/hive-exec-0.8.0-SNAPSHOT.jar" +#,'hcat_bin_location' => "$ENV{HCAT_ROOT}/bin/hcat.sh" +}; Index: src/test/e2e/hcatalog/deployers/ExistingClusterDeployer.pm =================================================================== --- src/test/e2e/hcatalog/deployers/ExistingClusterDeployer.pm (revision 0) +++ src/test/e2e/hcatalog/deployers/ExistingClusterDeployer.pm (revision 0) @@ -0,0 +1,277 @@ +############################################################################ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +package ExistingClusterDeployer; + +use IPC::Run qw(run); +use TestDeployer; + +use strict; +use English; + +########################################################################### +# Class: ExistingClusterDeployer +# Deploy the Pig harness to a cluster and database that already exists. + +############################################################################## +# Sub: new +# Constructor +# +# Paramaters: +# None +# +# Returns: +# None. +sub new +{ + my $proto = shift; + my $class = ref($proto) || $proto; + my $self = {}; + + bless($self, $class); + + return $self; +} + +############################################################################## +# Sub: checkPrerequisites +# Check any prerequisites before a deployment is begun. For example if a +# particular deployment required the use of a database system it could +# check here that the db was installed and accessible. +# +# Paramaters: +# globalHash - hash from config file, including deployment config +# log - log file handle +# +# Returns: +# None +# +sub checkPrerequisites +{ + my ($self, $cfg, $log) = @_; + + # They must have declared the conf directory for their Hadoop installation + if (! defined $cfg->{'testconfigpath'} || $cfg->{'testconfigpath'} eq "") { + print $log "You must set the key 'hadoopconfdir' to your Hadoop conf directory " + . "in existing.conf\n"; + die "hadoopconfdir is not set in existing.conf\n"; + } + + # They must have declared the executable path for their Hadoop installation + if (! defined $cfg->{'hadoopbin'} || $cfg->{'hadoopbin'} eq "") { + print $log "You must set the key 'hadoopbin' to your Hadoop bin path" + . "in existing.conf\n"; + die "hadoopbin is not set in existing.conf\n"; + } + + # Run a quick and easy Hadoop command to make sure we can + $self->runHadoopCmd($cfg, $log, "fs -ls /"); + +} + +############################################################################## +# Sub: deploy +# Deploy any required packages +# This is a no-op in this case because we're assuming both the cluster and the +# database already exist +# +# Paramaters: +# globalHash - hash from config file, including deployment config +# log - log file handle +# +# Returns: +# None +# +sub deploy +{ +} + +############################################################################## +# Sub: start +# Start any software modules that are needed. +# This is a no-op in this case because we're assuming both the cluster and the +# database already exist +# +# Paramaters: +# globalHash - hash from config file, including deployment config +# log - log file handle +# +# Returns: +# None +# +sub start +{ +} + +############################################################################## +# Sub: generateData +# Generate any data needed for this test run. +# +# Paramaters: +# globalHash - hash from config file, including deployment config +# log - log file handle +# +# Returns: +# None +# +sub generateData +{ + my ($self, $cfg, $log) = @_; + my @tables = ( + { + 'name' => "numbers", + 'filetype' => "rcfile", + 'hdfs' => "numbers_pig", + }, { + 'name' => "boolean", + 'filetype' => "rcfile", + 'hdfs' => "boolean", + }, { + 'name' => "complex", + 'filetype' => "rcfile", + 'hdfs' => "complex", + }, { + 'name' => "numbers", + 'filetype' => "txt", + 'hdfs' => "txt", + }, { + 'name' => "numbers", + 'filetype' => "rcfile", + 'hdfs' => "numbers", + }, + ); + + # Create the HDFS directories + $self->runHadoopCmd($cfg, $log, "fs -mkdir $cfg->{'inpathbase'}"); + + foreach my $table (@tables) { + print "Generating data for $table->{'name'}\n"; + # Copy the data to HDFS + my $hadoop = "fs -copyFromLocal data/$table->{'name'}.$table->{'filetype'} ". + "$cfg->{'inpathbase'}/$table->{'hdfs'}/$table->{'name'}.$table->{'filetype'}"; + $self->runHadoopCmd($cfg, $log, $hadoop); + + } +} + +############################################################################## +# Sub: confirmDeployment +# Run checks to confirm that the deployment was successful. When this is +# done the testing environment should be ready to run. +# +# Paramaters: +# globalHash - hash from config file, including deployment config +# log - log file handle +# +# Returns: +# Nothing +# This method should die with an appropriate error message if there is +# an issue. +# +sub confirmDeployment +{ +} + +############################################################################## +# Sub: deleteData +# Remove any data created that will not be removed by undeploying. +# +# Paramaters: +# globalHash - hash from config file, including deployment config +# log - log file handle +# +# Returns: +# None +# +sub deleteData +{ +} + +############################################################################## +# Sub: stop +# Stop any servers or systems that are no longer needed once testing is +# completed. +# +# Paramaters: +# globalHash - hash from config file, including deployment config +# log - log file handle +# +# Returns: +# None +# +sub stop +{ +} + +############################################################################## +# Sub: undeploy +# Remove any packages that were installed as part of the deployment. +# +# Paramaters: +# globalHash - hash from config file, including deployment config +# log - log file handle +# +# Returns: +# None +# +sub undeploy +{ +} + +############################################################################## +# Sub: confirmUndeployment +# Run checks to confirm that the undeployment was successful. When this is +# done anything that must be turned off or removed should be turned off or +# removed. +# +# Paramaters: +# globalHash - hash from config file, including deployment config +# log - log file handle +# +# Returns: +# Nothing +# This method should die with an appropriate error message if there is +# an issue. +# +sub confirmUndeployment +{ + die "$0 INFO : confirmUndeployment is a virtual function!"; +} + +sub runHadoopCmd($$$$) +{ + my ($self, $cfg, $log, $c) = @_; + + # set the PIG_CLASSPATH environment variable + $ENV{'HADOOP_CLASSPATH'} = "$cfg->{'testconfigpath'}"; + + my @cmd = ("$cfg->{'hadoopbin'}"); + push(@cmd, split(' ', $c)); + + $self->runCmd($log, \@cmd); +} + +sub runCmd($$$) +{ + my ($self, $log, $cmd) = @_; + + print $log "Going to run " . join(" ", @$cmd) . "\n"; + + run($cmd, \undef, $log, $log) or + die "Failed running " . join(" ", @$cmd) . "\n"; +} + +1; Index: src/test/e2e/hcatalog/data/boolean.rcfile =================================================================== Cannot display: file marked as a binary type. svn:mime-type = application/octet-stream Property changes on: src/test/e2e/hcatalog/data/boolean.rcfile ___________________________________________________________________ Added: svn:mime-type + application/octet-stream Index: src/test/e2e/hcatalog/data/numbers.txt =================================================================== --- src/test/e2e/hcatalog/data/numbers.txt (revision 0) +++ src/test/e2e/hcatalog/data/numbers.txt (revision 0) @@ -0,0 +1,5001 @@ +1000:1:3:90:5084:5084L:8.3f:8.3 +1000:2:2:90:5093:5093L:2.2f:2.2 +1000:3:2:90:5017:5017L:0.501790f:0.501790 +1000:4:4:902:5097:5097L:902.509f:902.509 +1000:5:4:907:5072:5072L:5.4f:5.4 +1000:6:5:90:5072:5072L:5.5f:5.5 +1000:7:5:90:5030:5030L:5.0f:5.0 +1000:8:4:90:5044:5044L:0.504490f:0.504490 +1000:9:1:904:5018:5018L:904.501f:904.501 +1000:10:2:900:5051:5051L:10.2f:10.2 +1000:11:2:90:5031:5031L:7.2f:7.2 +1000:12:1:90:5055:5055L:1.9f:1.9 +1000:13:1:90:5006:5006L:0.500690f:0.500690 +1000:14:1:908:5026:5026L:908.502f:908.502 +1000:15:1:904:5093:5093L:15.1f:15.1 +1000:16:5:90:5043:5043L:4.5f:4.5 +1000:17:3:90:5052:5052L:3.3f:3.3 +1000:18:5:91:5094:5094L:0.509491f:0.509491 +1000:19:2:900:5036:5036L:900.503f:900.503 +1000:20:3:904:5041:5041L:20.3f:20.3 +1000:21:1:90:5004:5004L:7.1f:7.1 +1000:22:2:90:5091:5091L:2.8f:2.8 +1000:23:5:90:5004:5004L:0.500490f:0.500490 +1000:24:5:910:5083:5083L:910.508f:910.508 +1000:25:2:900:5024:5024L:25.2f:25.2 +1000:26:1:91:5063:5063L:0.1f:0.1 +1000:27:3:90:5097:5097L:3.5f:3.5 +1000:28:1:90:5096:5096L:0.509690f:0.509690 +1000:29:1:907:5001:5001L:907.500f:907.500 +1000:30:2:901:5044:5044L:30.2f:30.2 +1000:31:4:90:5010:5010L:1.4f:1.4 +1000:32:5:90:5085:5085L:5.5f:5.5 +1000:33:4:90:5059:5059L:0.505990f:0.505990 +1000:34:5:903:5050:5050L:903.505f:903.505 +1000:35:4:905:5055:5055L:35.4f:35.4 +1000:36:5:90:5046:5046L:6.5f:6.5 +1000:37:3:90:5095:5095L:3.2f:3.2 +1000:38:3:90:5030:5030L:0.503090f:0.503090 +1000:39:3:903:5098:5098L:903.509f:903.509 +1000:40:3:907:5013:5013L:40.3f:40.3 +1000:41:5:90:5031:5031L:5.5f:5.5 +1000:42:5:90:5081:5081L:5.3f:5.3 +1000:43:5:90:5017:5017L:0.501790f:0.501790 +1000:44:2:909:5047:5047L:909.504f:909.504 +1000:45:5:905:5098:5098L:45.5f:45.5 +1000:46:3:90:5061:5061L:4.3f:4.3 +1000:47:5:90:5081:5081L:5.9f:5.9 +1000:48:5:90:5008:5008L:0.500890f:0.500890 +1000:49:1:908:5039:5039L:908.503f:908.503 +1000:50:1:902:5008:5008L:50.1f:50.1 +1000:51:2:90:5057:5057L:0.2f:0.2 +1000:52:3:90:5091:5091L:3.0f:3.0 +1000:53:2:90:5099:5099L:0.509990f:0.509990 +1000:54:3:902:5088:5088L:902.508f:902.508 +1000:55:1:901:5038:5038L:55.1f:55.1 +1000:56:1:90:5077:5077L:6.1f:6.1 +1000:57:4:90:5065:5065L:4.5f:4.5 +1000:58:3:90:5100:5100L:0.510090f:0.510090 +1000:59:3:905:5077:5077L:905.507f:905.507 +1000:60:5:906:5096:5096L:60.5f:60.5 +1000:61:5:90:5001:5001L:9.5f:9.5 +1000:62:3:90:5004:5004L:3.4f:3.4 +1000:63:3:90:5088:5088L:0.508890f:0.508890 +1000:64:3:903:5011:5011L:903.501f:903.501 +1000:65:2:904:5023:5023L:65.2f:65.2 +1000:66:4:90:5080:5080L:4.4f:4.4 +1000:67:3:90:5026:5026L:3.0f:3.0 +1000:68:1:90:5058:5058L:0.505890f:0.505890 +1000:69:1:910:5004:5004L:910.500f:910.500 +1000:70:5:908:5064:5064L:70.5f:70.5 +1000:71:5:90:5049:5049L:8.5f:8.5 +1000:72:5:90:5092:5092L:5.3f:5.3 +1000:73:5:90:5072:5072L:0.507290f:0.507290 +1000:74:4:902:5008:5008L:902.500f:902.500 +1000:75:5:905:5047:5047L:75.5f:75.5 +1000:76:1:90:5087:5087L:1.1f:1.1 +1000:77:5:90:5087:5087L:5.6f:5.6 +1000:78:1:90:5029:5029L:0.502990f:0.502990 +1000:79:4:909:5021:5021L:909.502f:909.502 +1000:80:5:907:5001:5001L:80.5f:80.5 +1000:81:3:90:5079:5079L:6.3f:6.3 +1000:82:5:90:5010:5010L:5.4f:5.4 +1000:83:5:90:5086:5086L:0.508690f:0.508690 +1000:84:3:900:5003:5003L:900.500f:900.500 +1000:85:4:910:5052:5052L:85.4f:85.4 +1000:86:1:90:5070:5070L:1.1f:1.1 +1000:87:5:90:5032:5032L:5.0f:5.0 +1000:88:5:90:5006:5006L:0.500690f:0.500690 +1000:89:1:910:5091:5091L:910.509f:910.509 +1000:90:2:908:5063:5063L:90.2f:90.2 +1000:91:2:90:5018:5018L:2.2f:2.2 +1000:92:1:90:5060:5060L:1.1f:1.1 +1000:93:2:91:5091:5091L:0.509191f:0.509191 +1000:94:1:905:5099:5099L:905.509f:905.509 +1000:95:1:901:5097:5097L:95.1f:95.1 +1000:96:4:90:5006:5006L:3.4f:3.4 +1000:97:2:90:5008:5008L:2.3f:2.3 +1000:98:4:90:5028:5028L:0.502890f:0.502890 +1000:99:4:903:5025:5025L:903.502f:903.502 +1000:100:4:907:5002:5002L:100.4f:100.4 +1000:101:2:90:5023:5023L:0.2f:0.2 +1000:102:3:90:5036:5036L:3.1f:3.1 +1000:103:1:90:5033:5033L:0.503390f:0.503390 +1000:104:5:905:5087:5087L:905.508f:905.508 +1000:105:5:907:5004:5004L:105.5f:105.5 +1000:106:5:90:5034:5034L:3.5f:3.5 +1000:107:5:90:5063:5063L:5.7f:5.7 +1000:108:1:90:5077:5077L:0.507790f:0.507790 +1000:109:2:901:5005:5005L:901.500f:901.500 +1000:110:4:908:5070:5070L:110.4f:110.4 +1000:111:4:90:5071:5071L:0.4f:0.4 +1000:112:5:90:5088:5088L:5.6f:5.6 +1000:113:2:90:5030:5030L:0.503090f:0.503090 +1000:114:3:906:5084:5084L:906.508f:906.508 +1000:115:3:906:5052:5052L:115.3f:115.3 +1000:116:3:90:5087:5087L:5.3f:5.3 +1000:117:5:90:5057:5057L:5.5f:5.5 +1000:118:3:90:5097:5097L:0.509790f:0.509790 +1000:119:2:909:5009:5009L:909.500f:909.500 +1000:120:2:905:5089:5089L:120.2f:120.2 +1000:121:5:90:5096:5096L:1.5f:1.5 +1000:122:4:91:5051:5051L:4.0f:4.0 +1000:123:3:90:5012:5012L:0.501290f:0.501290 +1000:124:5:908:5071:5071L:908.507f:908.507 +1000:125:4:901:5026:5026L:125.4f:125.4 +1000:126:2:90:5074:5074L:7.2f:7.2 +1000:127:1:90:5019:5019L:1.5f:1.5 +1000:128:4:90:5073:5073L:0.507390f:0.507390 +1000:129:3:901:5061:5061L:901.506f:901.506 +1000:130:4:904:5010:5010L:130.4f:130.4 +1000:131:3:90:5022:5022L:3.3f:3.3 +1000:132:3:90:5020:5020L:3.0f:3.0 +1000:133:1:90:5041:5041L:0.504190f:0.504190 +1000:134:1:904:5016:5016L:904.501f:904.501 +1000:135:5:901:5034:5034L:135.5f:135.5 +1000:136:1:90:5099:5099L:3.1f:3.1 +1000:137:5:90:5045:5045L:5.4f:5.4 +1000:138:1:90:5035:5035L:0.503590f:0.503590 +1000:139:5:906:5046:5046L:906.504f:906.504 +1000:140:3:903:5083:5083L:140.3f:140.3 +1000:141:3:90:5017:5017L:9.3f:9.3 +1000:142:4:90:5018:5018L:4.4f:4.4 +1000:143:5:90:5075:5075L:0.507590f:0.507590 +1000:144:2:907:5016:5016L:907.501f:907.501 +1000:145:3:905:5027:5027L:145.3f:145.3 +1000:146:5:90:5057:5057L:7.5f:7.5 +1000:147:5:90:5094:5094L:5.6f:5.6 +1000:148:2:90:5094:5094L:0.509490f:0.509490 +1000:149:4:904:5054:5054L:904.505f:904.505 +1000:150:1:909:5084:5084L:150.1f:150.1 +1000:151:5:90:5071:5071L:4.5f:4.5 +1000:152:1:90:5012:5012L:1.1f:1.1 +1000:153:2:90:5060:5060L:0.506090f:0.506090 +1000:154:1:904:5023:5023L:904.502f:904.502 +1000:155:2:910:5076:5076L:155.2f:155.2 +1000:156:3:90:5043:5043L:9.3f:9.3 +1000:157:1:90:5099:5099L:1.7f:1.7 +1000:158:1:90:5061:5061L:0.506190f:0.506190 +1000:159:5:907:5004:5004L:907.500f:907.500 +1000:160:3:908:5090:5090L:160.3f:160.3 +1000:161:2:90:5026:5026L:8.2f:8.2 +1000:162:1:90:5038:5038L:1.9f:1.9 +1000:163:1:90:5045:5045L:0.504590f:0.504590 +1000:164:4:902:5089:5089L:902.508f:902.508 +1000:165:5:904:5085:5085L:165.5f:165.5 +1000:166:4:91:5068:5068L:0.4f:0.4 +1000:167:1:91:5038:5038L:1.0f:1.0 +1000:168:1:91:5039:5039L:0.503991f:0.503991 +1000:169:4:910:5005:5005L:910.500f:910.500 +1000:170:5:904:5084:5084L:170.5f:170.5 +1000:171:4:90:5057:5057L:7.4f:7.4 +1000:172:5:90:5042:5042L:5.8f:5.8 +1000:173:2:90:5057:5057L:0.505790f:0.505790 +1000:174:4:906:5078:5078L:906.507f:906.507 +1000:175:4:906:5021:5021L:175.4f:175.4 +1000:176:3:90:5013:5013L:3.3f:3.3 +1000:177:1:90:5012:5012L:1.5f:1.5 +1000:178:3:90:5010:5010L:0.501090f:0.501090 +1000:179:5:904:5003:5003L:904.500f:904.500 +1000:180:1:902:5044:5044L:180.1f:180.1 +1000:181:5:90:5016:5016L:9.5f:9.5 +1000:182:3:90:5091:5091L:3.9f:3.9 +1000:183:5:90:5079:5079L:0.507990f:0.507990 +1000:184:3:910:5042:5042L:910.504f:910.504 +1000:185:2:907:5002:5002L:185.2f:185.2 +1000:186:3:90:5037:5037L:1.3f:1.3 +1000:187:3:90:5088:5088L:3.4f:3.4 +1000:188:4:91:5053:5053L:0.505391f:0.505391 +1000:189:4:909:5095:5095L:909.509f:909.509 +1000:190:5:910:5015:5015L:190.5f:190.5 +1000:191:2:90:5005:5005L:8.2f:8.2 +1000:192:3:90:5093:5093L:3.2f:3.2 +1000:193:2:90:5012:5012L:0.501290f:0.501290 +1000:194:1:905:5010:5010L:905.501f:905.501 +1000:195:3:907:5077:5077L:195.3f:195.3 +1000:196:3:90:5094:5094L:1.3f:1.3 +1000:197:5:90:5030:5030L:5.7f:5.7 +1000:198:4:90:5024:5024L:0.502490f:0.502490 +1000:199:2:901:5014:5014L:901.501f:901.501 +1000:200:2:910:5007:5007L:200.2f:200.2 +1000:201:3:90:5086:5086L:1.3f:1.3 +1000:202:3:90:5008:5008L:3.6f:3.6 +1000:203:3:90:5015:5015L:0.501590f:0.501590 +1000:204:3:900:5065:5065L:900.506f:900.506 +1000:205:4:905:5035:5035L:205.4f:205.4 +1000:206:3:90:5047:5047L:0.3f:0.3 +1000:207:2:90:5013:5013L:2.0f:2.0 +1000:208:4:90:5046:5046L:0.504690f:0.504690 +1000:209:5:901:5056:5056L:901.505f:901.505 +1000:210:1:904:5047:5047L:210.1f:210.1 +1000:211:1:90:5064:5064L:9.1f:9.1 +1000:212:5:90:5022:5022L:5.3f:5.3 +1000:213:1:90:5011:5011L:0.501190f:0.501190 +1000:214:2:903:5012:5012L:903.501f:903.501 +1000:215:5:910:5066:5066L:215.5f:215.5 +1000:216:2:90:5074:5074L:3.2f:3.2 +1000:217:4:90:5074:5074L:4.7f:4.7 +1000:218:5:90:5054:5054L:0.505490f:0.505490 +1000:219:2:901:5068:5068L:901.506f:901.506 +1000:220:5:902:5008:5008L:220.5f:220.5 +1000:221:2:90:5093:5093L:3.2f:3.2 +1000:222:5:90:5026:5026L:5.3f:5.3 +1000:223:1:90:5000:5000L:0.500090f:0.500090 +1000:224:2:905:5028:5028L:905.502f:905.502 +1000:225:2:904:5019:5019L:225.2f:225.2 +1000:226:1:90:5051:5051L:6.1f:6.1 +1000:227:4:90:5016:5016L:4.2f:4.2 +1000:228:3:90:5046:5046L:0.504690f:0.504690 +1000:229:1:903:5065:5065L:903.506f:903.506 +1000:230:4:901:5086:5086L:230.4f:230.4 +1000:231:5:90:5017:5017L:4.5f:4.5 +1000:232:4:90:5046:5046L:4.4f:4.4 +1000:233:1:90:5079:5079L:0.507990f:0.507990 +1000:234:1:908:5032:5032L:908.503f:908.503 +1000:235:2:902:5071:5071L:235.2f:235.2 +1000:236:3:90:5029:5029L:2.3f:2.3 +1000:237:1:90:5056:5056L:1.0f:1.0 +1000:238:1:90:5062:5062L:0.506290f:0.506290 +1000:239:4:907:5096:5096L:907.509f:907.509 +1000:240:2:904:5011:5011L:240.2f:240.2 +1000:241:1:90:5057:5057L:2.1f:2.1 +1000:242:2:90:5096:5096L:2.0f:2.0 +1000:243:4:90:5050:5050L:0.505090f:0.505090 +1000:244:3:900:5031:5031L:900.503f:900.503 +1000:245:5:904:5053:5053L:245.5f:245.5 +1000:246:4:90:5080:5080L:9.4f:9.4 +1000:247:5:90:5086:5086L:5.9f:5.9 +1000:248:3:90:5045:5045L:0.504590f:0.504590 +1000:249:1:907:5010:5010L:907.501f:907.501 +1000:250:1:910:5051:5051L:250.1f:250.1 +1000:251:1:90:5076:5076L:1.1f:1.1 +1000:252:4:90:5076:5076L:4.4f:4.4 +1000:253:4:90:5079:5079L:0.507990f:0.507990 +1000:254:1:908:5085:5085L:908.508f:908.508 +1000:255:3:907:5021:5021L:255.3f:255.3 +1000:256:1:90:5007:5007L:3.1f:3.1 +1000:257:5:90:5096:5096L:5.2f:5.2 +1000:258:4:90:5100:5100L:0.510090f:0.510090 +1000:259:1:907:5069:5069L:907.506f:907.506 +1000:260:2:908:5066:5066L:260.2f:260.2 +1000:261:4:90:5077:5077L:9.4f:9.4 +1000:262:3:90:5020:5020L:3.6f:3.6 +1000:263:2:90:5042:5042L:0.504290f:0.504290 +1000:264:1:904:5021:5021L:904.502f:904.502 +1000:265:5:909:5090:5090L:265.5f:265.5 +1000:266:1:90:5018:5018L:9.1f:9.1 +1000:267:1:90:5037:5037L:1.7f:1.7 +1000:268:1:90:5000:5000L:0.500090f:0.500090 +1000:269:1:905:5072:5072L:905.507f:905.507 +1000:270:5:907:5046:5046L:270.5f:270.5 +1000:271:3:90:5035:5035L:5.3f:5.3 +1000:272:2:91:5095:5095L:2.0f:2.0 +1000:273:3:90:5019:5019L:0.501990f:0.501990 +1000:274:5:902:5061:5061L:902.506f:902.506 +1000:275:1:901:5051:5051L:275.1f:275.1 +1000:276:5:90:5041:5041L:2.5f:2.5 +1000:277:1:90:5012:5012L:1.4f:1.4 +1000:278:3:90:5051:5051L:0.505190f:0.505190 +1000:279:3:907:5001:5001L:907.500f:907.500 +1000:280:2:905:5073:5073L:280.2f:280.2 +1000:281:4:91:5019:5019L:0.4f:0.4 +1000:282:1:90:5013:5013L:1.2f:1.2 +1000:283:5:90:5033:5033L:0.503390f:0.503390 +1000:284:1:906:5057:5057L:906.505f:906.505 +1000:285:5:906:5069:5069L:285.5f:285.5 +1000:286:2:90:5093:5093L:6.2f:6.2 +1000:287:4:90:5034:5034L:4.8f:4.8 +1000:288:5:90:5090:5090L:0.509090f:0.509090 +1000:289:2:908:5059:5059L:908.505f:908.505 +1000:290:2:900:5010:5010L:290.2f:290.2 +1000:291:1:90:5009:5009L:8.1f:8.1 +1000:292:2:90:5033:5033L:2.9f:2.9 +1000:293:3:90:5001:5001L:0.500190f:0.500190 +1000:294:4:900:5056:5056L:900.505f:900.505 +1000:295:2:909:5018:5018L:295.2f:295.2 +1000:296:1:90:5079:5079L:1.1f:1.1 +1000:297:5:90:5054:5054L:5.9f:5.9 +1000:298:2:90:5082:5082L:0.508290f:0.508290 +1000:299:1:900:5063:5063L:900.506f:900.506 +1000:300:4:905:5069:5069L:300.4f:300.4 +1000:301:5:90:5046:5046L:6.5f:6.5 +1000:302:5:90:5028:5028L:5.9f:5.9 +1000:303:2:90:5011:5011L:0.501190f:0.501190 +1000:304:2:900:5014:5014L:900.501f:900.501 +1000:305:5:904:5098:5098L:305.5f:305.5 +1000:306:1:90:5012:5012L:4.1f:4.1 +1000:307:5:90:5100:5100L:5.3f:5.3 +1000:308:2:90:5072:5072L:0.507290f:0.507290 +1000:309:1:908:5081:5081L:908.508f:908.508 +1000:310:5:906:5026:5026L:310.5f:310.5 +1000:311:3:90:5083:5083L:4.3f:4.3 +1000:312:5:90:5069:5069L:5.4f:5.4 +1000:313:2:90:5098:5098L:0.509890f:0.509890 +1000:314:2:900:5001:5001L:900.500f:900.500 +1000:315:3:909:5038:5038L:315.3f:315.3 +1000:316:3:91:5076:5076L:0.3f:0.3 +1000:317:3:90:5008:5008L:3.8f:3.8 +1000:318:3:90:5069:5069L:0.506990f:0.506990 +1000:319:2:903:5048:5048L:903.504f:903.504 +1000:320:1:901:5004:5004L:320.1f:320.1 +1000:321:2:90:5049:5049L:6.2f:6.2 +1000:322:2:90:5090:5090L:2.6f:2.6 +1000:323:5:90:5061:5061L:0.506190f:0.506190 +1000:324:5:901:5062:5062L:901.506f:901.506 +1000:325:5:907:5049:5049L:325.5f:325.5 +1000:326:2:90:5042:5042L:1.2f:1.2 +1000:327:1:90:5018:5018L:1.7f:1.7 +1000:328:1:90:5032:5032L:0.503290f:0.503290 +1000:329:4:906:5064:5064L:906.506f:906.506 +1000:330:2:907:5077:5077L:330.2f:330.2 +1000:331:2:90:5039:5039L:0.2f:0.2 +1000:332:5:90:5097:5097L:5.3f:5.3 +1000:333:4:90:5078:5078L:0.507890f:0.507890 +1000:334:2:900:5094:5094L:900.509f:900.509 +1000:335:5:910:5060:5060L:335.5f:335.5 +1000:336:3:90:5072:5072L:2.3f:2.3 +1000:337:5:90:5042:5042L:5.2f:5.2 +1000:338:1:90:5072:5072L:0.507290f:0.507290 +1000:339:2:901:5031:5031L:901.503f:901.503 +1000:340:5:904:5001:5001L:340.5f:340.5 +1000:341:4:90:5009:5009L:7.4f:7.4 +1000:342:1:90:5038:5038L:1.5f:1.5 +1000:343:1:90:5056:5056L:0.505690f:0.505690 +1000:344:5:906:5061:5061L:906.506f:906.506 +1000:345:5:905:5054:5054L:345.5f:345.5 +1000:346:3:91:5072:5072L:0.3f:0.3 +1000:347:1:90:5094:5094L:1.8f:1.8 +1000:348:3:90:5025:5025L:0.502590f:0.502590 +1000:349:2:901:5036:5036L:901.503f:901.503 +1000:350:4:901:5075:5075L:350.4f:350.4 +1000:351:4:91:5047:5047L:0.4f:0.4 +1000:352:4:90:5100:5100L:4.0f:4.0 +1000:353:1:90:5023:5023L:0.502390f:0.502390 +1000:354:4:901:5079:5079L:901.507f:901.507 +1000:355:2:910:5028:5028L:355.2f:355.2 +1000:356:5:90:5019:5019L:4.5f:4.5 +1000:357:3:90:5097:5097L:3.5f:3.5 +1000:358:3:90:5078:5078L:0.507890f:0.507890 +1000:359:4:904:5094:5094L:904.509f:904.509 +1000:360:1:910:5010:5010L:360.1f:360.1 +1000:361:5:90:5002:5002L:6.5f:6.5 +1000:362:2:90:5010:5010L:2.3f:2.3 +1000:363:2:90:5030:5030L:0.503090f:0.503090 +1000:364:3:901:5040:5040L:901.504f:901.504 +1000:365:2:904:5034:5034L:365.2f:365.2 +1000:366:3:90:5071:5071L:1.3f:1.3 +1000:367:4:90:5023:5023L:4.7f:4.7 +1000:368:4:90:5032:5032L:0.503290f:0.503290 +1000:369:3:909:5071:5071L:909.507f:909.507 +1000:370:3:910:5069:5069L:370.3f:370.3 +1000:371:3:90:5030:5030L:8.3f:8.3 +1000:372:3:90:5063:5063L:3.0f:3.0 +1000:373:4:90:5005:5005L:0.500590f:0.500590 +1000:374:1:909:5015:5015L:909.501f:909.501 +1000:375:3:902:5053:5053L:375.3f:375.3 +1000:376:4:90:5071:5071L:8.4f:8.4 +1000:377:3:90:5042:5042L:3.6f:3.6 +1000:378:4:90:5060:5060L:0.506090f:0.506090 +1000:379:1:909:5048:5048L:909.504f:909.504 +1000:380:4:903:5045:5045L:380.4f:380.4 +1000:381:3:90:5023:5023L:9.3f:9.3 +1000:382:4:90:5031:5031L:4.5f:4.5 +1000:383:2:90:5068:5068L:0.506890f:0.506890 +1000:384:2:902:5056:5056L:902.505f:902.505 +1000:385:3:906:5075:5075L:385.3f:385.3 +1000:386:1:90:5053:5053L:3.1f:3.1 +1000:387:4:90:5009:5009L:4.8f:4.8 +1000:388:2:90:5042:5042L:0.504290f:0.504290 +1000:389:5:905:5027:5027L:905.502f:905.502 +1000:390:2:902:5059:5059L:390.2f:390.2 +1000:391:4:90:5048:5048L:7.4f:7.4 +1000:392:5:90:5097:5097L:5.4f:5.4 +1000:393:2:90:5014:5014L:0.501490f:0.501490 +1000:394:5:901:5032:5032L:901.503f:901.503 +1000:395:3:907:5092:5092L:395.3f:395.3 +1000:396:2:90:5026:5026L:8.2f:8.2 +1000:397:4:90:5007:5007L:4.5f:4.5 +1000:398:5:90:5058:5058L:0.505890f:0.505890 +1000:399:2:905:5010:5010L:905.501f:905.501 +1000:400:3:909:5035:5035L:400.3f:400.3 +1000:401:1:90:5001:5001L:6.1f:6.1 +1000:402:4:90:5038:5038L:4.5f:4.5 +1000:403:4:90:5010:5010L:0.501090f:0.501090 +1000:404:4:908:5021:5021L:908.502f:908.502 +1000:405:1:902:5088:5088L:405.1f:405.1 +1000:406:5:90:5063:5063L:5.5f:5.5 +1000:407:2:90:5015:5015L:2.3f:2.3 +1000:408:2:90:5090:5090L:0.509090f:0.509090 +1000:409:5:905:5043:5043L:905.504f:905.504 +1000:410:1:900:5025:5025L:410.1f:410.1 +1000:411:2:90:5081:5081L:2.2f:2.2 +1000:412:2:90:5032:5032L:2.9f:2.9 +1000:413:4:90:5012:5012L:0.501290f:0.501290 +1000:414:5:902:5088:5088L:902.508f:902.508 +1000:415:1:903:5013:5013L:415.1f:415.1 +1000:416:5:90:5066:5066L:3.5f:3.5 +1000:417:3:90:5097:5097L:3.6f:3.6 +1000:418:4:91:5016:5016L:0.501691f:0.501691 +1000:419:4:909:5067:5067L:909.506f:909.506 +1000:420:1:909:5075:5075L:420.1f:420.1 +1000:421:2:90:5000:5000L:2.2f:2.2 +1000:422:1:90:5092:5092L:1.6f:1.6 +1000:423:3:90:5043:5043L:0.504390f:0.504390 +1000:424:3:902:5070:5070L:902.507f:902.507 +1000:425:3:902:5004:5004L:425.3f:425.3 +1000:426:3:90:5038:5038L:2.3f:2.3 +1000:427:2:90:5097:5097L:2.8f:2.8 +1000:428:1:90:5088:5088L:0.508890f:0.508890 +1000:429:2:901:5070:5070L:901.507f:901.507 +1000:430:1:902:5053:5053L:430.1f:430.1 +1000:431:4:90:5073:5073L:5.4f:5.4 +1000:432:4:90:5029:5029L:4.6f:4.6 +1000:433:4:90:5062:5062L:0.506290f:0.506290 +1000:434:1:906:5081:5081L:906.508f:906.508 +1000:435:5:900:5006:5006L:435.5f:435.5 +1000:436:5:90:5028:5028L:6.5f:6.5 +1000:437:2:90:5008:5008L:2.8f:2.8 +1000:438:1:91:5061:5061L:0.506191f:0.506191 +1000:439:1:903:5077:5077L:903.507f:903.507 +1000:440:4:903:5099:5099L:440.4f:440.4 +1000:441:2:90:5051:5051L:1.2f:1.2 +1000:442:1:90:5014:5014L:1.9f:1.9 +1000:443:2:90:5021:5021L:0.502190f:0.502190 +1000:444:5:907:5083:5083L:907.508f:907.508 +1000:445:4:905:5087:5087L:445.4f:445.4 +1000:446:5:90:5047:5047L:3.5f:3.5 +1000:447:1:90:5028:5028L:1.6f:1.6 +1000:448:1:90:5027:5027L:0.502790f:0.502790 +1000:449:5:909:5061:5061L:909.506f:909.506 +1000:450:3:906:5096:5096L:450.3f:450.3 +1000:451:3:91:5005:5005L:0.3f:0.3 +1000:452:1:91:5093:5093L:1.0f:1.0 +1000:453:2:90:5048:5048L:0.504890f:0.504890 +1000:454:3:902:5014:5014L:902.501f:902.501 +1000:455:2:900:5061:5061L:455.2f:455.2 +1000:456:1:90:5094:5094L:9.1f:9.1 +1000:457:4:91:5049:5049L:4.0f:4.0 +1000:458:5:90:5024:5024L:0.502490f:0.502490 +1000:459:1:910:5006:5006L:910.500f:910.500 +1000:460:4:906:5068:5068L:460.4f:460.4 +1000:461:4:90:5059:5059L:1.4f:1.4 +1000:462:4:90:5055:5055L:4.2f:4.2 +1000:463:4:90:5084:5084L:0.508490f:0.508490 +1000:464:1:909:5008:5008L:909.500f:909.500 +1000:465:2:901:5010:5010L:465.2f:465.2 +1000:466:5:90:5095:5095L:3.5f:3.5 +1000:467:5:90:5091:5091L:5.9f:5.9 +1000:468:2:90:5007:5007L:0.500790f:0.500790 +1000:469:3:910:5003:5003L:910.500f:910.500 +1000:470:4:907:5059:5059L:470.4f:470.4 +1000:471:2:90:5071:5071L:4.2f:4.2 +1000:472:5:90:5091:5091L:5.2f:5.2 +1000:473:3:90:5034:5034L:0.503490f:0.503490 +1000:474:2:900:5021:5021L:900.502f:900.502 +1000:475:3:904:5036:5036L:475.3f:475.3 +1000:476:3:90:5065:5065L:3.3f:3.3 +1000:477:3:90:5055:5055L:3.2f:3.2 +1000:478:2:90:5033:5033L:0.503390f:0.503390 +1000:479:3:901:5027:5027L:901.502f:901.502 +1000:480:3:909:5098:5098L:480.3f:480.3 +1000:481:1:90:5040:5040L:1.1f:1.1 +1000:482:4:90:5060:5060L:4.1f:4.1 +1000:483:4:90:5050:5050L:0.505090f:0.505090 +1000:484:1:909:5059:5059L:909.505f:909.505 +1000:485:2:903:5100:5100L:485.2f:485.2 +1000:486:3:90:5033:5033L:9.3f:9.3 +1000:487:2:90:5055:5055L:2.3f:2.3 +1000:488:4:90:5011:5011L:0.501190f:0.501190 +1000:489:1:900:5028:5028L:900.502f:900.502 +1000:490:2:906:5011:5011L:490.2f:490.2 +1000:491:2:90:5029:5029L:6.2f:6.2 +1000:492:4:90:5039:5039L:4.4f:4.4 +1000:493:2:90:5098:5098L:0.509890f:0.509890 +1000:494:5:900:5088:5088L:900.508f:900.508 +1000:495:3:903:5018:5018L:495.3f:495.3 +1000:496:3:90:5001:5001L:9.3f:9.3 +1000:497:4:90:5029:5029L:4.1f:4.1 +1000:498:2:91:5094:5094L:0.509491f:0.509491 +1000:499:3:900:5001:5001L:900.500f:900.500 +1000:500:4:904:5058:5058L:500.4f:500.4 +1000:501:5:90:5019:5019L:8.5f:8.5 +1000:502:1:90:5058:5058L:1.5f:1.5 +1000:503:3:90:5064:5064L:0.506490f:0.506490 +1000:504:3:908:5071:5071L:908.507f:908.507 +1000:505:2:901:5000:5000L:505.2f:505.2 +1000:506:3:90:5089:5089L:6.3f:6.3 +1000:507:3:90:5002:5002L:3.3f:3.3 +1000:508:5:90:5094:5094L:0.509490f:0.509490 +1000:509:4:901:5097:5097L:901.509f:901.509 +1000:510:5:908:5038:5038L:510.5f:510.5 +1000:511:2:90:5015:5015L:7.2f:7.2 +1000:512:3:90:5068:5068L:3.8f:3.8 +1000:513:1:90:5056:5056L:0.505690f:0.505690 +1000:514:4:908:5029:5029L:908.502f:908.502 +1000:515:3:901:5046:5046L:515.3f:515.3 +1000:516:3:90:5005:5005L:7.3f:7.3 +1000:517:2:90:5042:5042L:2.2f:2.2 +1000:518:3:90:5009:5009L:0.500990f:0.500990 +1000:519:2:909:5020:5020L:909.502f:909.502 +1000:520:2:907:5001:5001L:520.2f:520.2 +1000:521:4:90:5066:5066L:0.4f:0.4 +1000:522:5:90:5043:5043L:5.6f:5.6 +1000:523:3:90:5071:5071L:0.507190f:0.507190 +1000:524:1:906:5047:5047L:906.504f:906.504 +1000:525:2:900:5059:5059L:525.2f:525.2 +1000:526:5:90:5026:5026L:6.5f:6.5 +1000:527:5:91:5049:5049L:5.0f:5.0 +1000:528:2:90:5057:5057L:0.505790f:0.505790 +1000:529:3:908:5043:5043L:908.504f:908.504 +1000:530:4:900:5009:5009L:530.4f:530.4 +1000:531:4:90:5014:5014L:8.4f:8.4 +1000:532:2:90:5077:5077L:2.6f:2.6 +1000:533:4:90:5055:5055L:0.505590f:0.505590 +1000:534:3:902:5013:5013L:902.501f:902.501 +1000:535:5:907:5021:5021L:535.5f:535.5 +1000:536:3:90:5080:5080L:5.3f:5.3 +1000:537:4:90:5078:5078L:4.4f:4.4 +1000:538:2:90:5016:5016L:0.501690f:0.501690 +1000:539:5:901:5091:5091L:901.509f:901.509 +1000:540:2:908:5097:5097L:540.2f:540.2 +1000:541:2:90:5074:5074L:4.2f:4.2 +1000:542:3:90:5036:5036L:3.7f:3.7 +1000:543:2:90:5053:5053L:0.505390f:0.505390 +1000:544:4:909:5079:5079L:909.507f:909.507 +1000:545:5:908:5044:5044L:545.5f:545.5 +1000:546:1:90:5094:5094L:2.1f:2.1 +1000:547:5:90:5034:5034L:5.0f:5.0 +1000:548:4:90:5007:5007L:0.500790f:0.500790 +1000:549:5:900:5024:5024L:900.502f:900.502 +1000:550:4:903:5002:5002L:550.4f:550.4 +1000:551:4:90:5045:5045L:6.4f:6.4 +1000:552:3:90:5017:5017L:3.0f:3.0 +1000:553:5:90:5062:5062L:0.506290f:0.506290 +1000:554:2:900:5050:5050L:900.505f:900.505 +1000:555:1:910:5027:5027L:555.1f:555.1 +1000:556:3:90:5053:5053L:1.3f:1.3 +1000:557:3:90:5054:5054L:3.0f:3.0 +1000:558:5:90:5079:5079L:0.507990f:0.507990 +1000:559:5:906:5083:5083L:906.508f:906.508 +1000:560:1:903:5010:5010L:560.1f:560.1 +1000:561:1:90:5070:5070L:0.1f:0.1 +1000:562:4:90:5076:5076L:4.5f:4.5 +1000:563:5:90:5004:5004L:0.500490f:0.500490 +1000:564:3:907:5010:5010L:907.501f:907.501 +1000:565:5:909:5008:5008L:565.5f:565.5 +1000:566:2:90:5018:5018L:4.2f:4.2 +1000:567:4:90:5020:5020L:4.9f:4.9 +1000:568:2:90:5092:5092L:0.509290f:0.509290 +1000:569:1:907:5048:5048L:907.504f:907.504 +1000:570:5:909:5081:5081L:570.5f:570.5 +1000:571:1:90:5086:5086L:0.1f:0.1 +1000:572:4:90:5038:5038L:4.7f:4.7 +1000:573:3:90:5072:5072L:0.507290f:0.507290 +1000:574:3:910:5041:5041L:910.504f:910.504 +1000:575:4:909:5024:5024L:575.4f:575.4 +1000:576:4:90:5064:5064L:1.4f:1.4 +1000:577:5:90:5054:5054L:5.9f:5.9 +1000:578:1:90:5029:5029L:0.502990f:0.502990 +1000:579:1:902:5098:5098L:902.509f:902.509 +1000:580:3:901:5082:5082L:580.3f:580.3 +1000:581:2:90:5085:5085L:1.2f:1.2 +1000:582:1:90:5053:5053L:1.9f:1.9 +1000:583:3:90:5002:5002L:0.500290f:0.500290 +1000:584:2:908:5098:5098L:908.509f:908.509 +1000:585:4:904:5086:5086L:585.4f:585.4 +1000:586:5:90:5096:5096L:0.5f:0.5 +1000:587:3:91:5081:5081L:3.0f:3.0 +1000:588:1:90:5095:5095L:0.509590f:0.509590 +1000:589:2:900:5016:5016L:900.501f:900.501 +1000:590:2:905:5027:5027L:590.2f:590.2 +1000:591:1:90:5039:5039L:8.1f:8.1 +1000:592:1:91:5021:5021L:1.0f:1.0 +1000:593:3:90:5049:5049L:0.504990f:0.504990 +1000:594:3:908:5027:5027L:908.502f:908.502 +1000:595:3:904:5065:5065L:595.3f:595.3 +1000:596:3:90:5073:5073L:3.3f:3.3 +1000:597:2:90:5068:5068L:2.9f:2.9 +1000:598:1:91:5072:5072L:0.507291f:0.507291 +1000:599:1:903:5076:5076L:903.507f:903.507 +1000:600:2:907:5028:5028L:600.2f:600.2 +1000:601:3:90:5009:5009L:9.3f:9.3 +1000:602:5:90:5006:5006L:5.9f:5.9 +1000:603:1:90:5057:5057L:0.505790f:0.505790 +1000:604:4:910:5032:5032L:910.503f:910.503 +1000:605:5:906:5074:5074L:605.5f:605.5 +1000:606:3:91:5006:5006L:0.3f:0.3 +1000:607:2:90:5093:5093L:2.3f:2.3 +1000:608:5:90:5088:5088L:0.508890f:0.508890 +1000:609:4:906:5020:5020L:906.502f:906.502 +1000:610:3:909:5089:5089L:610.3f:610.3 +1000:611:4:90:5075:5075L:4.4f:4.4 +1000:612:5:90:5062:5062L:5.4f:5.4 +1000:613:5:90:5004:5004L:0.500490f:0.500490 +1000:614:3:902:5003:5003L:902.500f:902.500 +1000:615:4:901:5059:5059L:615.4f:615.4 +1000:616:3:90:5054:5054L:7.3f:7.3 +1000:617:3:91:5086:5086L:3.0f:3.0 +1000:618:3:91:5035:5035L:0.503591f:0.503591 +1000:619:2:907:5097:5097L:907.509f:907.509 +1000:620:3:900:5086:5086L:620.3f:620.3 +1000:621:3:90:5031:5031L:8.3f:8.3 +1000:622:2:90:5071:5071L:2.6f:2.6 +1000:623:5:90:5026:5026L:0.502690f:0.502690 +1000:624:5:910:5046:5046L:910.504f:910.504 +1000:625:5:907:5058:5058L:625.5f:625.5 +1000:626:3:90:5026:5026L:2.3f:2.3 +1000:627:1:90:5024:5024L:1.8f:1.8 +1000:628:5:90:5019:5019L:0.501990f:0.501990 +1000:629:2:907:5083:5083L:907.508f:907.508 +1000:630:1:902:5092:5092L:630.1f:630.1 +1000:631:1:90:5072:5072L:7.1f:7.1 +1000:632:2:90:5033:5033L:2.9f:2.9 +1000:633:1:90:5084:5084L:0.508490f:0.508490 +1000:634:2:906:5079:5079L:906.507f:906.507 +1000:635:4:905:5050:5050L:635.4f:635.4 +1000:636:2:91:5072:5072L:0.2f:0.2 +1000:637:4:91:5051:5051L:4.0f:4.0 +1000:638:5:90:5079:5079L:0.507990f:0.507990 +1000:639:1:900:5043:5043L:900.504f:900.504 +1000:640:5:903:5065:5065L:640.5f:640.5 +1000:641:4:90:5033:5033L:3.4f:3.4 +1000:642:3:90:5021:5021L:3.7f:3.7 +1000:643:5:90:5092:5092L:0.509290f:0.509290 +1000:644:4:900:5048:5048L:900.504f:900.504 +1000:645:3:909:5096:5096L:645.3f:645.3 +1000:646:5:90:5092:5092L:2.5f:2.5 +1000:647:4:90:5090:5090L:4.9f:4.9 +1000:648:2:90:5075:5075L:0.507590f:0.507590 +1000:649:5:908:5084:5084L:908.508f:908.508 +1000:650:3:907:5011:5011L:650.3f:650.3 +1000:651:1:90:5044:5044L:5.1f:5.1 +1000:652:3:91:5012:5012L:3.0f:3.0 +1000:653:4:90:5089:5089L:0.508990f:0.508990 +1000:654:3:905:5097:5097L:905.509f:905.509 +1000:655:1:910:5084:5084L:655.1f:655.1 +1000:656:5:91:5007:5007L:0.5f:0.5 +1000:657:5:90:5094:5094L:5.7f:5.7 +1000:658:4:90:5066:5066L:0.506690f:0.506690 +1000:659:3:909:5044:5044L:909.504f:909.504 +1000:660:2:903:5011:5011L:660.2f:660.2 +1000:661:3:90:5058:5058L:3.3f:3.3 +1000:662:5:90:5056:5056L:5.8f:5.8 +1000:663:1:90:5039:5039L:0.503990f:0.503990 +1000:664:5:909:5090:5090L:909.509f:909.509 +1000:665:5:910:5089:5089L:665.5f:665.5 +1000:666:4:90:5084:5084L:9.4f:9.4 +1000:667:4:90:5048:5048L:4.8f:4.8 +1000:668:4:90:5033:5033L:0.503390f:0.503390 +1000:669:2:900:5017:5017L:900.501f:900.501 +1000:670:5:904:5044:5044L:670.5f:670.5 +1000:671:5:90:5080:5080L:9.5f:9.5 +1000:672:3:90:5056:5056L:3.8f:3.8 +1000:673:1:90:5094:5094L:0.509490f:0.509490 +1000:674:3:908:5084:5084L:908.508f:908.508 +1000:675:2:906:5076:5076L:675.2f:675.2 +1000:676:2:90:5064:5064L:3.2f:3.2 +1000:677:1:90:5040:5040L:1.1f:1.1 +1000:678:3:90:5094:5094L:0.509490f:0.509490 +1000:679:5:902:5099:5099L:902.509f:902.509 +1000:680:1:901:5040:5040L:680.1f:680.1 +1000:681:3:90:5028:5028L:0.3f:0.3 +1000:682:2:90:5007:5007L:2.6f:2.6 +1000:683:5:90:5090:5090L:0.509090f:0.509090 +1000:684:5:901:5063:5063L:901.506f:901.506 +1000:685:4:905:5025:5025L:685.4f:685.4 +1000:686:2:90:5059:5059L:8.2f:8.2 +1000:687:1:90:5073:5073L:1.9f:1.9 +1000:688:3:90:5059:5059L:0.505990f:0.505990 +1000:689:2:904:5086:5086L:904.508f:904.508 +1000:690:2:905:5095:5095L:690.2f:690.2 +1000:691:4:91:5100:5100L:0.4f:0.4 +1000:692:1:90:5057:5057L:1.3f:1.3 +1000:693:1:90:5024:5024L:0.502490f:0.502490 +1000:694:1:910:5039:5039L:910.503f:910.503 +1000:695:4:907:5093:5093L:695.4f:695.4 +1000:696:5:90:5073:5073L:0.5f:0.5 +1000:697:3:90:5063:5063L:3.0f:3.0 +1000:698:1:90:5010:5010L:0.501090f:0.501090 +1000:699:4:909:5049:5049L:909.504f:909.504 +1000:700:4:902:5096:5096L:700.4f:700.4 +1000:701:3:91:5094:5094L:0.3f:0.3 +1000:702:3:90:5024:5024L:3.0f:3.0 +1000:703:1:90:5043:5043L:0.504390f:0.504390 +1000:704:2:901:5042:5042L:901.504f:901.504 +1000:705:4:908:5006:5006L:705.4f:705.4 +1000:706:4:90:5009:5009L:7.4f:7.4 +1000:707:3:90:5017:5017L:3.1f:3.1 +1000:708:1:90:5067:5067L:0.506790f:0.506790 +1000:709:1:901:5054:5054L:901.505f:901.505 +1000:710:4:908:5077:5077L:710.4f:710.4 +1000:711:4:90:5075:5075L:3.4f:3.4 +1000:712:3:91:5077:5077L:3.0f:3.0 +1000:713:5:90:5090:5090L:0.509090f:0.509090 +1000:714:2:905:5002:5002L:905.500f:905.500 +1000:715:4:903:5080:5080L:715.4f:715.4 +1000:716:4:91:5045:5045L:0.4f:0.4 +1000:717:5:90:5058:5058L:5.4f:5.4 +1000:718:5:90:5090:5090L:0.509090f:0.509090 +1000:719:4:907:5001:5001L:907.500f:907.500 +1000:720:2:903:5078:5078L:720.2f:720.2 +1000:721:5:91:5012:5012L:0.5f:0.5 +1000:722:4:90:5006:5006L:4.5f:4.5 +1000:723:3:90:5015:5015L:0.501590f:0.501590 +1000:724:2:906:5064:5064L:906.506f:906.506 +1000:725:3:902:5092:5092L:725.3f:725.3 +1000:726:1:91:5091:5091L:0.1f:0.1 +1000:727:4:90:5035:5035L:4.8f:4.8 +1000:728:2:90:5086:5086L:0.508690f:0.508690 +1000:729:1:904:5055:5055L:904.505f:904.505 +1000:730:1:906:5091:5091L:730.1f:730.1 +1000:731:5:90:5089:5089L:6.5f:6.5 +1000:732:1:90:5042:5042L:1.3f:1.3 +1000:733:1:90:5076:5076L:0.507690f:0.507690 +1000:734:2:901:5033:5033L:901.503f:901.503 +1000:735:5:906:5057:5057L:735.5f:735.5 +1000:736:5:90:5053:5053L:8.5f:8.5 +1000:737:4:90:5030:5030L:4.4f:4.4 +1000:738:1:90:5006:5006L:0.500690f:0.500690 +1000:739:5:908:5049:5049L:908.504f:908.504 +1000:740:3:909:5011:5011L:740.3f:740.3 +1000:741:2:90:5071:5071L:8.2f:8.2 +1000:742:2:90:5001:5001L:2.9f:2.9 +1000:743:4:91:5080:5080L:0.508091f:0.508091 +1000:744:3:902:5096:5096L:902.509f:902.509 +1000:745:4:901:5052:5052L:745.4f:745.4 +1000:746:2:91:5028:5028L:0.2f:0.2 +1000:747:5:90:5069:5069L:5.7f:5.7 +1000:748:1:90:5031:5031L:0.503190f:0.503190 +1000:749:2:907:5005:5005L:907.500f:907.500 +1000:750:4:901:5095:5095L:750.4f:750.4 +1000:751:5:90:5074:5074L:5.5f:5.5 +1000:752:3:90:5058:5058L:3.9f:3.9 +1000:753:3:90:5052:5052L:0.505290f:0.505290 +1000:754:2:910:5073:5073L:910.507f:910.507 +1000:755:2:908:5083:5083L:755.2f:755.2 +1000:756:5:90:5075:5075L:1.5f:1.5 +1000:757:1:90:5039:5039L:1.0f:1.0 +1000:758:5:90:5011:5011L:0.501190f:0.501190 +1000:759:1:905:5078:5078L:905.507f:905.507 +1000:760:1:902:5093:5093L:760.1f:760.1 +1000:761:1:90:5047:5047L:1.1f:1.1 +1000:762:5:90:5029:5029L:5.7f:5.7 +1000:763:3:90:5081:5081L:0.508190f:0.508190 +1000:764:5:906:5078:5078L:906.507f:906.507 +1000:765:4:910:5055:5055L:765.4f:765.4 +1000:766:3:90:5068:5068L:8.3f:8.3 +1000:767:2:91:5070:5070L:2.0f:2.0 +1000:768:4:90:5092:5092L:0.509290f:0.509290 +1000:769:4:910:5040:5040L:910.504f:910.504 +1000:770:3:901:5064:5064L:770.3f:770.3 +1000:771:3:90:5074:5074L:2.3f:2.3 +1000:772:5:90:5040:5040L:5.1f:5.1 +1000:773:2:90:5065:5065L:0.506590f:0.506590 +1000:774:1:906:5026:5026L:906.502f:906.502 +1000:775:5:902:5022:5022L:775.5f:775.5 +1000:776:2:90:5003:5003L:8.2f:8.2 +1000:777:1:90:5100:5100L:1.0f:1.0 +1000:778:4:90:5078:5078L:0.507890f:0.507890 +1000:779:4:905:5070:5070L:905.507f:905.507 +1000:780:1:900:5082:5082L:780.1f:780.1 +1000:781:4:90:5007:5007L:5.4f:5.4 +1000:782:3:90:5021:5021L:3.4f:3.4 +1000:783:5:90:5081:5081L:0.508190f:0.508190 +1000:784:3:907:5037:5037L:907.503f:907.503 +1000:785:4:905:5064:5064L:785.4f:785.4 +1000:786:5:90:5043:5043L:9.5f:9.5 +1000:787:1:90:5049:5049L:1.9f:1.9 +1000:788:1:90:5021:5021L:0.502190f:0.502190 +1000:789:4:902:5070:5070L:902.507f:902.507 +1000:790:3:903:5072:5072L:790.3f:790.3 +1000:791:2:90:5020:5020L:0.2f:0.2 +1000:792:2:90:5063:5063L:2.4f:2.4 +1000:793:3:90:5026:5026L:0.502690f:0.502690 +1000:794:2:908:5094:5094L:908.509f:908.509 +1000:795:4:905:5041:5041L:795.4f:795.4 +1000:796:2:90:5025:5025L:5.2f:5.2 +1000:797:5:90:5013:5013L:5.5f:5.5 +1000:798:2:90:5074:5074L:0.507490f:0.507490 +1000:799:3:903:5000:5000L:903.500f:903.500 +1000:800:2:908:5032:5032L:800.2f:800.2 +1000:801:5:90:5033:5033L:0.5f:0.5 +1000:802:1:90:5079:5079L:1.4f:1.4 +1000:803:4:91:5006:5006L:0.500691f:0.500691 +1000:804:1:904:5083:5083L:904.508f:904.508 +1000:805:5:901:5034:5034L:805.5f:805.5 +1000:806:2:90:5082:5082L:5.2f:5.2 +1000:807:4:90:5031:5031L:4.3f:4.3 +1000:808:4:90:5080:5080L:0.508090f:0.508090 +1000:809:3:902:5007:5007L:902.500f:902.500 +1000:810:3:904:5083:5083L:810.3f:810.3 +1000:811:5:90:5088:5088L:3.5f:3.5 +1000:812:1:90:5029:5029L:1.5f:1.5 +1000:813:5:90:5029:5029L:0.502990f:0.502990 +1000:814:1:903:5067:5067L:903.506f:903.506 +1000:815:5:903:5080:5080L:815.5f:815.5 +1000:816:1:90:5032:5032L:7.1f:7.1 +1000:817:5:90:5067:5067L:5.3f:5.3 +1000:818:2:90:5033:5033L:0.503390f:0.503390 +1000:819:1:906:5053:5053L:906.505f:906.505 +1000:820:1:901:5095:5095L:820.1f:820.1 +1000:821:1:91:5031:5031L:0.1f:0.1 +1000:822:5:90:5082:5082L:5.0f:5.0 +1000:823:1:90:5009:5009L:0.500990f:0.500990 +1000:824:3:900:5040:5040L:900.504f:900.504 +1000:825:1:909:5068:5068L:825.1f:825.1 +1000:826:5:90:5035:5035L:0.5f:0.5 +1000:827:2:90:5066:5066L:2.0f:2.0 +1000:828:5:90:5074:5074L:0.507490f:0.507490 +1000:829:2:905:5032:5032L:905.503f:905.503 +1000:830:4:907:5042:5042L:830.4f:830.4 +1000:831:4:90:5035:5035L:7.4f:7.4 +1000:832:1:90:5044:5044L:1.6f:1.6 +1000:833:5:90:5048:5048L:0.504890f:0.504890 +1000:834:5:902:5053:5053L:902.505f:902.505 +1000:835:2:903:5042:5042L:835.2f:835.2 +1000:836:1:90:5049:5049L:2.1f:2.1 +1000:837:2:90:5055:5055L:2.5f:2.5 +1000:838:1:90:5093:5093L:0.509390f:0.509390 +1000:839:4:907:5040:5040L:907.504f:907.504 +1000:840:1:904:5005:5005L:840.1f:840.1 +1000:841:3:90:5071:5071L:1.3f:1.3 +1000:842:5:90:5026:5026L:5.2f:5.2 +1000:843:2:90:5099:5099L:0.509990f:0.509990 +1000:844:4:910:5018:5018L:910.501f:910.501 +1000:845:2:903:5051:5051L:845.2f:845.2 +1000:846:4:90:5077:5077L:4.4f:4.4 +1000:847:2:90:5027:5027L:2.8f:2.8 +1000:848:4:90:5068:5068L:0.506890f:0.506890 +1000:849:4:906:5034:5034L:906.503f:906.503 +1000:850:1:907:5078:5078L:850.1f:850.1 +1000:851:1:90:5095:5095L:2.1f:2.1 +1000:852:5:90:5014:5014L:5.0f:5.0 +1000:853:1:90:5019:5019L:0.501990f:0.501990 +1000:854:1:901:5019:5019L:901.501f:901.501 +1000:855:2:905:5053:5053L:855.2f:855.2 +1000:856:4:90:5090:5090L:2.4f:2.4 +1000:857:3:90:5065:5065L:3.4f:3.4 +1000:858:5:90:5043:5043L:0.504390f:0.504390 +1000:859:3:909:5099:5099L:909.509f:909.509 +1000:860:5:900:5065:5065L:860.5f:860.5 +1000:861:4:90:5084:5084L:1.4f:1.4 +1000:862:3:90:5091:5091L:3.0f:3.0 +1000:863:4:90:5028:5028L:0.502890f:0.502890 +1000:864:5:902:5044:5044L:902.504f:902.504 +1000:865:1:905:5092:5092L:865.1f:865.1 +1000:866:4:90:5012:5012L:3.4f:3.4 +1000:867:3:90:5056:5056L:3.9f:3.9 +1000:868:1:90:5076:5076L:0.507690f:0.507690 +1000:869:4:902:5067:5067L:902.506f:902.506 +1000:870:4:900:5067:5067L:870.4f:870.4 +1000:871:2:90:5082:5082L:7.2f:7.2 +1000:872:1:90:5082:5082L:1.3f:1.3 +1000:873:5:91:5094:5094L:0.509491f:0.509491 +1000:874:2:909:5017:5017L:909.501f:909.501 +1000:875:4:900:5069:5069L:875.4f:875.4 +1000:876:4:90:5000:5000L:7.4f:7.4 +1000:877:4:90:5089:5089L:4.1f:4.1 +1000:878:2:90:5060:5060L:0.506090f:0.506090 +1000:879:1:910:5082:5082L:910.508f:910.508 +1000:880:4:906:5090:5090L:880.4f:880.4 +1000:881:3:90:5061:5061L:9.3f:9.3 +1000:882:2:91:5089:5089L:2.0f:2.0 +1000:883:1:91:5088:5088L:0.508891f:0.508891 +1000:884:5:902:5078:5078L:902.507f:902.507 +1000:885:1:910:5079:5079L:885.1f:885.1 +1000:886:5:90:5043:5043L:6.5f:6.5 +1000:887:5:90:5061:5061L:5.3f:5.3 +1000:888:4:90:5098:5098L:0.509890f:0.509890 +1000:889:2:907:5095:5095L:907.509f:907.509 +1000:890:1:904:5052:5052L:890.1f:890.1 +1000:891:1:90:5035:5035L:9.1f:9.1 +1000:892:4:90:5028:5028L:4.0f:4.0 +1000:893:3:90:5020:5020L:0.502090f:0.502090 +1000:894:3:901:5041:5041L:901.504f:901.504 +1000:895:1:902:5033:5033L:895.1f:895.1 +1000:896:5:90:5089:5089L:0.5f:0.5 +1000:897:3:91:5019:5019L:3.0f:3.0 +1000:898:1:90:5083:5083L:0.508390f:0.508390 +1000:899:5:910:5053:5053L:910.505f:910.505 +1000:900:5:901:5097:5097L:900.5f:900.5 +1000:901:3:90:5082:5082L:1.3f:1.3 +1000:902:5:90:5090:5090L:5.8f:5.8 +1000:903:1:90:5000:5000L:0.500090f:0.500090 +1000:904:2:908:5010:5010L:908.501f:908.501 +1000:905:4:910:5034:5034L:905.4f:905.4 +1000:906:1:90:5042:5042L:9.1f:9.1 +1000:907:5:90:5034:5034L:5.3f:5.3 +1000:908:1:90:5100:5100L:0.510090f:0.510090 +1000:909:5:903:5097:5097L:903.509f:903.509 +1000:910:3:902:5008:5008L:910.3f:910.3 +1000:911:3:90:5024:5024L:8.3f:8.3 +1000:912:2:90:5004:5004L:2.5f:2.5 +1000:913:1:90:5037:5037L:0.503790f:0.503790 +1000:914:1:910:5011:5011L:910.501f:910.501 +1000:915:2:907:5003:5003L:915.2f:915.2 +1000:916:4:90:5095:5095L:7.4f:7.4 +1000:917:1:90:5026:5026L:1.6f:1.6 +1000:918:2:90:5060:5060L:0.506090f:0.506090 +1000:919:2:907:5093:5093L:907.509f:907.509 +1000:920:2:901:5019:5019L:920.2f:920.2 +1000:921:3:90:5092:5092L:6.3f:6.3 +1000:922:4:90:5046:5046L:4.9f:4.9 +1000:923:4:90:5010:5010L:0.501090f:0.501090 +1000:924:1:901:5004:5004L:901.500f:901.500 +1000:925:1:904:5070:5070L:925.1f:925.1 +1000:926:2:90:5040:5040L:0.2f:0.2 +1000:927:1:90:5001:5001L:1.0f:1.0 +1000:928:3:90:5076:5076L:0.507690f:0.507690 +1000:929:1:909:5043:5043L:909.504f:909.504 +1000:930:5:901:5059:5059L:930.5f:930.5 +1000:931:1:90:5017:5017L:6.1f:6.1 +1000:932:1:90:5002:5002L:1.2f:1.2 +1000:933:3:91:5003:5003L:0.500391f:0.500391 +1000:934:4:900:5020:5020L:900.502f:900.502 +1000:935:4:902:5064:5064L:935.4f:935.4 +1000:936:2:90:5069:5069L:4.2f:4.2 +1000:937:4:90:5077:5077L:4.6f:4.6 +1000:938:4:90:5021:5021L:0.502190f:0.502190 +1000:939:3:900:5004:5004L:900.500f:900.500 +1000:940:5:900:5021:5021L:940.5f:940.5 +1000:941:3:90:5081:5081L:1.3f:1.3 +1000:942:4:90:5006:5006L:4.2f:4.2 +1000:943:4:90:5002:5002L:0.500290f:0.500290 +1000:944:5:904:5006:5006L:904.500f:904.500 +1000:945:1:901:5029:5029L:945.1f:945.1 +1000:946:4:90:5074:5074L:5.4f:5.4 +1000:947:2:90:5036:5036L:2.2f:2.2 +1000:948:1:90:5041:5041L:0.504190f:0.504190 +1000:949:2:906:5049:5049L:906.504f:906.504 +1000:950:2:906:5052:5052L:950.2f:950.2 +1000:951:3:90:5070:5070L:1.3f:1.3 +1000:952:3:91:5095:5095L:3.0f:3.0 +1000:953:3:90:5072:5072L:0.507290f:0.507290 +1000:954:3:905:5012:5012L:905.501f:905.501 +1000:955:3:906:5021:5021L:955.3f:955.3 +1000:956:5:90:5070:5070L:2.5f:2.5 +1000:957:3:90:5097:5097L:3.6f:3.6 +1000:958:5:90:5003:5003L:0.500390f:0.500390 +1000:959:2:900:5065:5065L:900.506f:900.506 +1000:960:5:904:5025:5025L:960.5f:960.5 +1000:961:2:91:5044:5044L:0.2f:0.2 +1000:962:1:90:5036:5036L:1.4f:1.4 +1000:963:1:90:5007:5007L:0.500790f:0.500790 +1000:964:4:903:5061:5061L:903.506f:903.506 +1000:965:5:909:5015:5015L:965.5f:965.5 +1000:966:1:90:5037:5037L:8.1f:8.1 +1000:967:4:90:5095:5095L:4.3f:4.3 +1000:968:4:90:5063:5063L:0.506390f:0.506390 +1000:969:4:906:5065:5065L:906.506f:906.506 +1000:970:3:905:5004:5004L:970.3f:970.3 +1000:971:4:90:5003:5003L:9.4f:9.4 +1000:972:1:90:5042:5042L:1.9f:1.9 +1000:973:3:90:5028:5028L:0.502890f:0.502890 +1000:974:3:906:5063:5063L:906.506f:906.506 +1000:975:1:904:5053:5053L:975.1f:975.1 +1000:976:2:90:5028:5028L:5.2f:5.2 +1000:977:4:90:5061:5061L:4.2f:4.2 +1000:978:4:91:5089:5089L:0.508991f:0.508991 +1000:979:2:908:5050:5050L:908.505f:908.505 +1000:980:5:901:5097:5097L:980.5f:980.5 +1000:981:5:90:5079:5079L:8.5f:8.5 +1000:982:5:90:5067:5067L:5.9f:5.9 +1000:983:3:90:5055:5055L:0.505590f:0.505590 +1000:984:4:910:5014:5014L:910.501f:910.501 +1000:985:2:900:5058:5058L:985.2f:985.2 +1000:986:5:90:5006:5006L:4.5f:4.5 +1000:987:1:90:5031:5031L:1.0f:1.0 +1000:988:4:90:5028:5028L:0.502890f:0.502890 +1000:989:4:910:5001:5001L:910.500f:910.500 +1000:990:1:909:5015:5015L:990.1f:990.1 +1000:991:1:90:5096:5096L:9.1f:9.1 +1000:992:5:90:5087:5087L:5.9f:5.9 +1000:993:3:90:5024:5024L:0.502490f:0.502490 +1000:994:1:910:5016:5016L:910.501f:910.501 +1000:995:2:902:5024:5024L:995.2f:995.2 +1000:996:5:90:5064:5064L:1.5f:1.5 +1000:997:5:90:5071:5071L:5.2f:5.2 +1000:998:1:91:5042:5042L:0.504291f:0.504291 +1000:999:3:906:5040:5040L:906.504f:906.504 +1000:1000:3:907:5029:5029L:1000.3f:1000.3 +2000:1001:4:90:5013:5013L:8.4f:8.4 +2000:1002:3:90:5097:5097L:3.7f:3.7 +2000:1003:3:90:5021:5021L:0.502190f:0.502190 +2000:1004:4:903:5015:5015L:903.501f:903.501 +2000:1005:5:905:5041:5041L:1005.5f:1005.5 +2000:1006:1:90:5051:5051L:3.1f:3.1 +2000:1007:4:90:5074:5074L:4.2f:4.2 +2000:1008:3:90:5071:5071L:0.507190f:0.507190 +2000:1009:5:909:5029:5029L:909.502f:909.502 +2000:1010:2:903:5001:5001L:1010.2f:1010.2 +2000:1011:3:91:5082:5082L:0.3f:0.3 +2000:1012:4:90:5050:5050L:4.6f:4.6 +2000:1013:4:90:5073:5073L:0.507390f:0.507390 +2000:1014:5:908:5003:5003L:908.500f:908.500 +2000:1015:1:906:5056:5056L:1015.1f:1015.1 +2000:1016:3:90:5090:5090L:7.3f:7.3 +2000:1017:5:90:5011:5011L:5.4f:5.4 +2000:1018:4:90:5051:5051L:0.505190f:0.505190 +2000:1019:2:908:5038:5038L:908.503f:908.503 +2000:1020:4:900:5074:5074L:1020.4f:1020.4 +2000:1021:4:90:5073:5073L:6.4f:6.4 +2000:1022:3:90:5031:5031L:3.3f:3.3 +2000:1023:1:91:5034:5034L:0.503491f:0.503491 +2000:1024:4:909:5007:5007L:909.500f:909.500 +2000:1025:4:909:5067:5067L:1025.4f:1025.4 +2000:1026:2:90:5036:5036L:3.2f:3.2 +2000:1027:2:90:5080:5080L:2.2f:2.2 +2000:1028:2:91:5068:5068L:0.506891f:0.506891 +2000:1029:5:903:5043:5043L:903.504f:903.504 +2000:1030:2:900:5046:5046L:1030.2f:1030.2 +2000:1031:5:90:5005:5005L:7.5f:7.5 +2000:1032:4:90:5034:5034L:4.2f:4.2 +2000:1033:1:90:5029:5029L:0.502990f:0.502990 +2000:1034:2:900:5011:5011L:900.501f:900.501 +2000:1035:3:908:5099:5099L:1035.3f:1035.3 +2000:1036:1:90:5028:5028L:1.1f:1.1 +2000:1037:3:90:5054:5054L:3.4f:3.4 +2000:1038:2:90:5048:5048L:0.504890f:0.504890 +2000:1039:5:906:5082:5082L:906.508f:906.508 +2000:1040:2:909:5084:5084L:1040.2f:1040.2 +2000:1041:5:90:5056:5056L:9.5f:9.5 +2000:1042:5:90:5082:5082L:5.6f:5.6 +2000:1043:2:90:5009:5009L:0.500990f:0.500990 +2000:1044:3:910:5012:5012L:910.501f:910.501 +2000:1045:4:904:5094:5094L:1045.4f:1045.4 +2000:1046:4:90:5010:5010L:5.4f:5.4 +2000:1047:5:91:5051:5051L:5.0f:5.0 +2000:1048:3:90:5027:5027L:0.502790f:0.502790 +2000:1049:5:901:5091:5091L:901.509f:901.509 +2000:1050:4:905:5078:5078L:1050.4f:1050.4 +2000:1051:3:90:5062:5062L:4.3f:4.3 +2000:1052:1:90:5018:5018L:1.3f:1.3 +2000:1053:5:90:5076:5076L:0.507690f:0.507690 +2000:1054:1:900:5070:5070L:900.507f:900.507 +2000:1055:1:907:5007:5007L:1055.1f:1055.1 +2000:1056:1:90:5056:5056L:3.1f:3.1 +2000:1057:1:90:5051:5051L:1.2f:1.2 +2000:1058:4:90:5073:5073L:0.507390f:0.507390 +2000:1059:5:906:5090:5090L:906.509f:906.509 +2000:1060:5:903:5043:5043L:1060.5f:1060.5 +2000:1061:4:91:5081:5081L:0.4f:0.4 +2000:1062:2:90:5009:5009L:2.0f:2.0 +2000:1063:3:91:5061:5061L:0.506191f:0.506191 +2000:1064:2:900:5065:5065L:900.506f:900.506 +2000:1065:5:902:5034:5034L:1065.5f:1065.5 +2000:1066:5:90:5066:5066L:3.5f:3.5 +2000:1067:3:90:5088:5088L:3.5f:3.5 +2000:1068:1:90:5055:5055L:0.505590f:0.505590 +2000:1069:4:901:5014:5014L:901.501f:901.501 +2000:1070:4:900:5048:5048L:1070.4f:1070.4 +2000:1071:1:90:5039:5039L:7.1f:7.1 +2000:1072:5:91:5043:5043L:5.0f:5.0 +2000:1073:1:90:5043:5043L:0.504390f:0.504390 +2000:1074:4:907:5047:5047L:907.504f:907.504 +2000:1075:2:906:5067:5067L:1075.2f:1075.2 +2000:1076:4:90:5096:5096L:6.4f:6.4 +2000:1077:2:90:5045:5045L:2.1f:2.1 +2000:1078:1:90:5065:5065L:0.506590f:0.506590 +2000:1079:4:910:5083:5083L:910.508f:910.508 +2000:1080:5:906:5090:5090L:1080.5f:1080.5 +2000:1081:2:90:5061:5061L:8.2f:8.2 +2000:1082:4:90:5061:5061L:4.7f:4.7 +2000:1083:1:90:5007:5007L:0.500790f:0.500790 +2000:1084:3:903:5075:5075L:903.507f:903.507 +2000:1085:1:906:5032:5032L:1085.1f:1085.1 +2000:1086:4:90:5090:5090L:1.4f:1.4 +2000:1087:4:90:5100:5100L:4.4f:4.4 +2000:1088:1:90:5016:5016L:0.501690f:0.501690 +2000:1089:4:902:5010:5010L:902.501f:902.501 +2000:1090:4:901:5073:5073L:1090.4f:1090.4 +2000:1091:3:90:5046:5046L:4.3f:4.3 +2000:1092:1:90:5011:5011L:1.1f:1.1 +2000:1093:4:90:5078:5078L:0.507890f:0.507890 +2000:1094:4:909:5005:5005L:909.500f:909.500 +2000:1095:3:909:5060:5060L:1095.3f:1095.3 +2000:1096:5:90:5076:5076L:6.5f:6.5 +2000:1097:4:90:5018:5018L:4.2f:4.2 +2000:1098:4:90:5075:5075L:0.507590f:0.507590 +2000:1099:5:901:5001:5001L:901.500f:901.500 +2000:1100:1:908:5012:5012L:1100.1f:1100.1 +2000:1101:4:90:5054:5054L:2.4f:2.4 +2000:1102:2:90:5068:5068L:2.4f:2.4 +2000:1103:2:90:5096:5096L:0.509690f:0.509690 +2000:1104:1:909:5080:5080L:909.508f:909.508 +2000:1105:1:904:5070:5070L:1105.1f:1105.1 +2000:1106:4:90:5029:5029L:2.4f:2.4 +2000:1107:3:90:5056:5056L:3.0f:3.0 +2000:1108:4:90:5095:5095L:0.509590f:0.509590 +2000:1109:3:907:5011:5011L:907.501f:907.501 +2000:1110:3:907:5087:5087L:1110.3f:1110.3 +2000:1111:3:90:5012:5012L:4.3f:4.3 +2000:1112:1:90:5050:5050L:1.7f:1.7 +2000:1113:4:91:5058:5058L:0.505891f:0.505891 +2000:1114:4:900:5046:5046L:900.504f:900.504 +2000:1115:3:902:5088:5088L:1115.3f:1115.3 +2000:1116:2:91:5014:5014L:0.2f:0.2 +2000:1117:3:90:5016:5016L:3.5f:3.5 +2000:1118:1:90:5094:5094L:0.509490f:0.509490 +2000:1119:1:906:5062:5062L:906.506f:906.506 +2000:1120:1:900:5031:5031L:1120.1f:1120.1 +2000:1121:1:90:5076:5076L:6.1f:6.1 +2000:1122:1:90:5040:5040L:1.8f:1.8 +2000:1123:4:90:5037:5037L:0.503790f:0.503790 +2000:1124:2:903:5044:5044L:903.504f:903.504 +2000:1125:4:909:5067:5067L:1125.4f:1125.4 +2000:1126:3:90:5065:5065L:0.3f:0.3 +2000:1127:4:90:5012:5012L:4.6f:4.6 +2000:1128:5:90:5029:5029L:0.502990f:0.502990 +2000:1129:5:907:5091:5091L:907.509f:907.509 +2000:1130:3:909:5096:5096L:1130.3f:1130.3 +2000:1131:4:90:5059:5059L:9.4f:9.4 +2000:1132:3:90:5033:5033L:3.0f:3.0 +2000:1133:5:90:5087:5087L:0.508790f:0.508790 +2000:1134:2:910:5014:5014L:910.501f:910.501 +2000:1135:4:906:5097:5097L:1135.4f:1135.4 +2000:1136:2:90:5002:5002L:2.2f:2.2 +2000:1137:1:90:5062:5062L:1.9f:1.9 +2000:1138:1:90:5030:5030L:0.503090f:0.503090 +2000:1139:3:906:5002:5002L:906.500f:906.500 +2000:1140:2:900:5091:5091L:1140.2f:1140.2 +2000:1141:2:90:5081:5081L:8.2f:8.2 +2000:1142:5:90:5086:5086L:5.3f:5.3 +2000:1143:2:90:5056:5056L:0.505690f:0.505690 +2000:1144:1:905:5049:5049L:905.504f:905.504 +2000:1145:2:902:5011:5011L:1145.2f:1145.2 +2000:1146:2:90:5030:5030L:6.2f:6.2 +2000:1147:2:90:5019:5019L:2.6f:2.6 +2000:1148:5:90:5097:5097L:0.509790f:0.509790 +2000:1149:1:902:5055:5055L:902.505f:902.505 +2000:1150:2:906:5057:5057L:1150.2f:1150.2 +2000:1151:1:91:5034:5034L:0.1f:0.1 +2000:1152:5:90:5062:5062L:5.9f:5.9 +2000:1153:4:90:5080:5080L:0.508090f:0.508090 +2000:1154:2:902:5025:5025L:902.502f:902.502 +2000:1155:5:905:5044:5044L:1155.5f:1155.5 +2000:1156:5:90:5001:5001L:7.5f:7.5 +2000:1157:2:91:5063:5063L:2.0f:2.0 +2000:1158:3:90:5040:5040L:0.504090f:0.504090 +2000:1159:2:900:5065:5065L:900.506f:900.506 +2000:1160:5:902:5025:5025L:1160.5f:1160.5 +2000:1161:3:90:5018:5018L:3.3f:3.3 +2000:1162:5:90:5002:5002L:5.2f:5.2 +2000:1163:3:90:5011:5011L:0.501190f:0.501190 +2000:1164:2:903:5031:5031L:903.503f:903.503 +2000:1165:3:902:5078:5078L:1165.3f:1165.3 +2000:1166:5:90:5048:5048L:1.5f:1.5 +2000:1167:5:90:5044:5044L:5.3f:5.3 +2000:1168:3:90:5028:5028L:0.502890f:0.502890 +2000:1169:5:901:5029:5029L:901.502f:901.502 +2000:1170:4:901:5052:5052L:1170.4f:1170.4 +2000:1171:5:90:5085:5085L:6.5f:6.5 +2000:1172:1:90:5010:5010L:1.5f:1.5 +2000:1173:1:91:5012:5012L:0.501291f:0.501291 +2000:1174:2:902:5049:5049L:902.504f:902.504 +2000:1175:3:907:5068:5068L:1175.3f:1175.3 +2000:1176:2:90:5080:5080L:7.2f:7.2 +2000:1177:4:90:5016:5016L:4.6f:4.6 +2000:1178:2:90:5095:5095L:0.509590f:0.509590 +2000:1179:3:902:5013:5013L:902.501f:902.501 +2000:1180:4:909:5025:5025L:1180.4f:1180.4 +2000:1181:2:90:5088:5088L:7.2f:7.2 +2000:1182:1:90:5034:5034L:1.8f:1.8 +2000:1183:2:90:5027:5027L:0.502790f:0.502790 +2000:1184:2:900:5046:5046L:900.504f:900.504 +2000:1185:5:906:5015:5015L:1185.5f:1185.5 +2000:1186:3:90:5080:5080L:9.3f:9.3 +2000:1187:2:90:5039:5039L:2.7f:2.7 +2000:1188:3:91:5059:5059L:0.505991f:0.505991 +2000:1189:3:904:5077:5077L:904.507f:904.507 +2000:1190:3:902:5059:5059L:1190.3f:1190.3 +2000:1191:5:90:5030:5030L:5.5f:5.5 +2000:1192:4:90:5008:5008L:4.7f:4.7 +2000:1193:1:91:5097:5097L:0.509791f:0.509791 +2000:1194:2:903:5004:5004L:903.500f:903.500 +2000:1195:4:902:5065:5065L:1195.4f:1195.4 +2000:1196:5:90:5056:5056L:8.5f:8.5 +2000:1197:4:90:5024:5024L:4.1f:4.1 +2000:1198:1:90:5016:5016L:0.501690f:0.501690 +2000:1199:4:900:5058:5058L:900.505f:900.505 +2000:1200:3:907:5079:5079L:1200.3f:1200.3 +2000:1201:1:90:5031:5031L:5.1f:5.1 +2000:1202:2:90:5000:5000L:2.2f:2.2 +2000:1203:3:90:5096:5096L:0.509690f:0.509690 +2000:1204:3:906:5029:5029L:906.502f:906.502 +2000:1205:3:903:5051:5051L:1205.3f:1205.3 +2000:1206:1:90:5027:5027L:2.1f:2.1 +2000:1207:4:91:5037:5037L:4.0f:4.0 +2000:1208:5:90:5099:5099L:0.509990f:0.509990 +2000:1209:1:908:5005:5005L:908.500f:908.500 +2000:1210:4:902:5071:5071L:1210.4f:1210.4 +2000:1211:3:90:5019:5019L:3.3f:3.3 +2000:1212:4:90:5038:5038L:4.7f:4.7 +2000:1213:4:90:5061:5061L:0.506190f:0.506190 +2000:1214:4:905:5016:5016L:905.501f:905.501 +2000:1215:5:910:5049:5049L:1215.5f:1215.5 +2000:1216:3:90:5074:5074L:0.3f:0.3 +2000:1217:4:90:5070:5070L:4.8f:4.8 +2000:1218:1:90:5078:5078L:0.507890f:0.507890 +2000:1219:1:907:5055:5055L:907.505f:907.505 +2000:1220:1:903:5080:5080L:1220.1f:1220.1 +2000:1221:5:90:5009:5009L:8.5f:8.5 +2000:1222:1:90:5075:5075L:1.5f:1.5 +2000:1223:3:90:5085:5085L:0.508590f:0.508590 +2000:1224:1:910:5036:5036L:910.503f:910.503 +2000:1225:2:910:5032:5032L:1225.2f:1225.2 +2000:1226:4:90:5039:5039L:5.4f:5.4 +2000:1227:3:90:5012:5012L:3.2f:3.2 +2000:1228:1:90:5076:5076L:0.507690f:0.507690 +2000:1229:5:905:5046:5046L:905.504f:905.504 +2000:1230:3:907:5080:5080L:1230.3f:1230.3 +2000:1231:2:90:5057:5057L:6.2f:6.2 +2000:1232:2:90:5008:5008L:2.7f:2.7 +2000:1233:1:90:5035:5035L:0.503590f:0.503590 +2000:1234:5:901:5031:5031L:901.503f:901.503 +2000:1235:2:904:5027:5027L:1235.2f:1235.2 +2000:1236:4:90:5073:5073L:1.4f:1.4 +2000:1237:1:90:5097:5097L:1.6f:1.6 +2000:1238:1:90:5034:5034L:0.503490f:0.503490 +2000:1239:5:907:5085:5085L:907.508f:907.508 +2000:1240:2:901:5054:5054L:1240.2f:1240.2 +2000:1241:1:90:5011:5011L:4.1f:4.1 +2000:1242:4:90:5077:5077L:4.8f:4.8 +2000:1243:5:90:5088:5088L:0.508890f:0.508890 +2000:1244:1:909:5004:5004L:909.500f:909.500 +2000:1245:3:902:5044:5044L:1245.3f:1245.3 +2000:1246:4:90:5056:5056L:9.4f:9.4 +2000:1247:3:90:5012:5012L:3.9f:3.9 +2000:1248:3:90:5084:5084L:0.508490f:0.508490 +2000:1249:4:910:5048:5048L:910.504f:910.504 +2000:1250:4:903:5062:5062L:1250.4f:1250.4 +2000:1251:1:90:5002:5002L:5.1f:5.1 +2000:1252:2:90:5081:5081L:2.3f:2.3 +2000:1253:1:90:5071:5071L:0.507190f:0.507190 +2000:1254:5:903:5057:5057L:903.505f:903.505 +2000:1255:5:908:5076:5076L:1255.5f:1255.5 +2000:1256:3:90:5059:5059L:6.3f:6.3 +2000:1257:5:90:5047:5047L:5.0f:5.0 +2000:1258:1:90:5051:5051L:0.505190f:0.505190 +2000:1259:5:903:5048:5048L:903.504f:903.504 +2000:1260:3:910:5083:5083L:1260.3f:1260.3 +2000:1261:1:90:5035:5035L:1.1f:1.1 +2000:1262:1:90:5063:5063L:1.4f:1.4 +2000:1263:5:90:5075:5075L:0.507590f:0.507590 +2000:1264:3:904:5003:5003L:904.500f:904.500 +2000:1265:1:904:5083:5083L:1265.1f:1265.1 +2000:1266:5:90:5037:5037L:8.5f:8.5 +2000:1267:3:90:5041:5041L:3.8f:3.8 +2000:1268:5:90:5090:5090L:0.509090f:0.509090 +2000:1269:3:909:5017:5017L:909.501f:909.501 +2000:1270:5:902:5009:5009L:1270.5f:1270.5 +2000:1271:4:90:5019:5019L:3.4f:3.4 +2000:1272:1:90:5059:5059L:1.4f:1.4 +2000:1273:4:90:5004:5004L:0.500490f:0.500490 +2000:1274:3:909:5045:5045L:909.504f:909.504 +2000:1275:3:910:5084:5084L:1275.3f:1275.3 +2000:1276:2:90:5065:5065L:9.2f:9.2 +2000:1277:4:90:5045:5045L:4.3f:4.3 +2000:1278:1:90:5035:5035L:0.503590f:0.503590 +2000:1279:1:908:5018:5018L:908.501f:908.501 +2000:1280:2:907:5045:5045L:1280.2f:1280.2 +2000:1281:2:90:5076:5076L:5.2f:5.2 +2000:1282:3:90:5013:5013L:3.6f:3.6 +2000:1283:1:90:5038:5038L:0.503890f:0.503890 +2000:1284:1:909:5020:5020L:909.502f:909.502 +2000:1285:3:904:5017:5017L:1285.3f:1285.3 +2000:1286:3:90:5003:5003L:8.3f:8.3 +2000:1287:1:90:5038:5038L:1.5f:1.5 +2000:1288:3:90:5069:5069L:0.506990f:0.506990 +2000:1289:5:907:5045:5045L:907.504f:907.504 +2000:1290:1:909:5016:5016L:1290.1f:1290.1 +2000:1291:3:90:5065:5065L:2.3f:2.3 +2000:1292:2:90:5025:5025L:2.7f:2.7 +2000:1293:3:90:5062:5062L:0.506290f:0.506290 +2000:1294:4:910:5049:5049L:910.504f:910.504 +2000:1295:5:906:5089:5089L:1295.5f:1295.5 +2000:1296:1:91:5066:5066L:0.1f:0.1 +2000:1297:2:90:5016:5016L:2.0f:2.0 +2000:1298:3:90:5081:5081L:0.508190f:0.508190 +2000:1299:2:905:5050:5050L:905.505f:905.505 +2000:1300:4:905:5040:5040L:1300.4f:1300.4 +2000:1301:5:90:5061:5061L:0.5f:0.5 +2000:1302:3:90:5033:5033L:3.3f:3.3 +2000:1303:4:90:5015:5015L:0.501590f:0.501590 +2000:1304:3:905:5011:5011L:905.501f:905.501 +2000:1305:5:905:5067:5067L:1305.5f:1305.5 +2000:1306:4:90:5066:5066L:7.4f:7.4 +2000:1307:3:90:5073:5073L:3.9f:3.9 +2000:1308:4:90:5032:5032L:0.503290f:0.503290 +2000:1309:3:908:5078:5078L:908.507f:908.507 +2000:1310:5:905:5030:5030L:1310.5f:1310.5 +2000:1311:2:90:5034:5034L:4.2f:4.2 +2000:1312:5:91:5065:5065L:5.0f:5.0 +2000:1313:2:90:5037:5037L:0.503790f:0.503790 +2000:1314:3:901:5087:5087L:901.508f:901.508 +2000:1315:3:900:5037:5037L:1315.3f:1315.3 +2000:1316:2:90:5003:5003L:9.2f:9.2 +2000:1317:5:90:5092:5092L:5.3f:5.3 +2000:1318:3:90:5038:5038L:0.503890f:0.503890 +2000:1319:5:903:5012:5012L:903.501f:903.501 +2000:1320:4:902:5060:5060L:1320.4f:1320.4 +2000:1321:5:90:5097:5097L:6.5f:6.5 +2000:1322:2:90:5088:5088L:2.5f:2.5 +2000:1323:5:90:5058:5058L:0.505890f:0.505890 +2000:1324:2:902:5071:5071L:902.507f:902.507 +2000:1325:2:908:5075:5075L:1325.2f:1325.2 +2000:1326:3:91:5058:5058L:0.3f:0.3 +2000:1327:4:90:5086:5086L:4.8f:4.8 +2000:1328:3:90:5077:5077L:0.507790f:0.507790 +2000:1329:5:903:5010:5010L:903.501f:903.501 +2000:1330:1:910:5035:5035L:1330.1f:1330.1 +2000:1331:4:91:5094:5094L:0.4f:0.4 +2000:1332:4:90:5045:5045L:4.3f:4.3 +2000:1333:3:90:5022:5022L:0.502290f:0.502290 +2000:1334:1:907:5042:5042L:907.504f:907.504 +2000:1335:4:910:5015:5015L:1335.4f:1335.4 +2000:1336:3:90:5009:5009L:5.3f:5.3 +2000:1337:1:90:5090:5090L:1.1f:1.1 +2000:1338:5:90:5029:5029L:0.502990f:0.502990 +2000:1339:4:906:5060:5060L:906.506f:906.506 +2000:1340:5:907:5060:5060L:1340.5f:1340.5 +2000:1341:1:90:5060:5060L:3.1f:3.1 +2000:1342:1:91:5094:5094L:1.0f:1.0 +2000:1343:3:90:5026:5026L:0.502690f:0.502690 +2000:1344:4:905:5095:5095L:905.509f:905.509 +2000:1345:2:903:5086:5086L:1345.2f:1345.2 +2000:1346:2:90:5037:5037L:8.2f:8.2 +2000:1347:3:91:5052:5052L:3.0f:3.0 +2000:1348:2:90:5021:5021L:0.502190f:0.502190 +2000:1349:4:906:5084:5084L:906.508f:906.508 +2000:1350:2:904:5052:5052L:1350.2f:1350.2 +2000:1351:5:90:5085:5085L:6.5f:6.5 +2000:1352:3:90:5079:5079L:3.8f:3.8 +2000:1353:2:90:5021:5021L:0.502190f:0.502190 +2000:1354:4:901:5071:5071L:901.507f:901.507 +2000:1355:3:903:5100:5100L:1355.3f:1355.3 +2000:1356:3:90:5080:5080L:7.3f:7.3 +2000:1357:4:90:5071:5071L:4.1f:4.1 +2000:1358:2:90:5058:5058L:0.505890f:0.505890 +2000:1359:3:901:5018:5018L:901.501f:901.501 +2000:1360:2:904:5062:5062L:1360.2f:1360.2 +2000:1361:5:90:5023:5023L:2.5f:2.5 +2000:1362:4:90:5098:5098L:4.7f:4.7 +2000:1363:3:90:5028:5028L:0.502890f:0.502890 +2000:1364:4:907:5038:5038L:907.503f:907.503 +2000:1365:3:903:5070:5070L:1365.3f:1365.3 +2000:1366:3:90:5039:5039L:7.3f:7.3 +2000:1367:2:90:5054:5054L:2.5f:2.5 +2000:1368:5:90:5005:5005L:0.500590f:0.500590 +2000:1369:3:904:5021:5021L:904.502f:904.502 +2000:1370:4:908:5063:5063L:1370.4f:1370.4 +2000:1371:2:90:5089:5089L:6.2f:6.2 +2000:1372:3:90:5059:5059L:3.3f:3.3 +2000:1373:3:90:5067:5067L:0.506790f:0.506790 +2000:1374:5:906:5039:5039L:906.503f:906.503 +2000:1375:2:900:5068:5068L:1375.2f:1375.2 +2000:1376:5:90:5040:5040L:5.5f:5.5 +2000:1377:2:90:5093:5093L:2.7f:2.7 +2000:1378:5:90:5076:5076L:0.507690f:0.507690 +2000:1379:5:901:5012:5012L:901.501f:901.501 +2000:1380:1:909:5086:5086L:1380.1f:1380.1 +2000:1381:4:90:5048:5048L:2.4f:2.4 +2000:1382:4:90:5084:5084L:4.8f:4.8 +2000:1383:2:90:5071:5071L:0.507190f:0.507190 +2000:1384:5:901:5031:5031L:901.503f:901.503 +2000:1385:2:903:5036:5036L:1385.2f:1385.2 +2000:1386:5:90:5084:5084L:2.5f:2.5 +2000:1387:2:90:5055:5055L:2.5f:2.5 +2000:1388:2:90:5019:5019L:0.501990f:0.501990 +2000:1389:1:902:5035:5035L:902.503f:902.503 +2000:1390:1:903:5022:5022L:1390.1f:1390.1 +2000:1391:1:90:5041:5041L:0.1f:0.1 +2000:1392:3:90:5016:5016L:3.7f:3.7 +2000:1393:2:90:5044:5044L:0.504490f:0.504490 +2000:1394:1:908:5055:5055L:908.505f:908.505 +2000:1395:2:900:5085:5085L:1395.2f:1395.2 +2000:1396:4:91:5005:5005L:0.4f:0.4 +2000:1397:3:90:5056:5056L:3.3f:3.3 +2000:1398:1:90:5089:5089L:0.508990f:0.508990 +2000:1399:2:906:5009:5009L:906.500f:906.500 +2000:1400:4:908:5041:5041L:1400.4f:1400.4 +2000:1401:5:90:5045:5045L:8.5f:8.5 +2000:1402:2:90:5011:5011L:2.2f:2.2 +2000:1403:3:90:5098:5098L:0.509890f:0.509890 +2000:1404:5:906:5073:5073L:906.507f:906.507 +2000:1405:3:910:5075:5075L:1405.3f:1405.3 +2000:1406:2:90:5072:5072L:6.2f:6.2 +2000:1407:2:90:5002:5002L:2.1f:2.1 +2000:1408:5:90:5061:5061L:0.506190f:0.506190 +2000:1409:4:905:5021:5021L:905.502f:905.502 +2000:1410:5:901:5097:5097L:1410.5f:1410.5 +2000:1411:2:90:5072:5072L:0.2f:0.2 +2000:1412:4:90:5096:5096L:4.3f:4.3 +2000:1413:5:90:5050:5050L:0.505090f:0.505090 +2000:1414:5:906:5007:5007L:906.500f:906.500 +2000:1415:3:900:5099:5099L:1415.3f:1415.3 +2000:1416:2:90:5060:5060L:3.2f:3.2 +2000:1417:1:90:5075:5075L:1.6f:1.6 +2000:1418:1:90:5099:5099L:0.509990f:0.509990 +2000:1419:4:902:5051:5051L:902.505f:902.505 +2000:1420:5:901:5067:5067L:1420.5f:1420.5 +2000:1421:5:90:5069:5069L:4.5f:4.5 +2000:1422:3:90:5099:5099L:3.1f:3.1 +2000:1423:3:91:5071:5071L:0.507191f:0.507191 +2000:1424:5:908:5030:5030L:908.503f:908.503 +2000:1425:1:903:5031:5031L:1425.1f:1425.1 +2000:1426:1:90:5060:5060L:6.1f:6.1 +2000:1427:4:90:5020:5020L:4.6f:4.6 +2000:1428:2:90:5070:5070L:0.507090f:0.507090 +2000:1429:2:903:5095:5095L:903.509f:903.509 +2000:1430:5:901:5006:5006L:1430.5f:1430.5 +2000:1431:3:91:5047:5047L:0.3f:0.3 +2000:1432:2:90:5059:5059L:2.5f:2.5 +2000:1433:2:91:5055:5055L:0.505591f:0.505591 +2000:1434:5:910:5033:5033L:910.503f:910.503 +2000:1435:2:900:5065:5065L:1435.2f:1435.2 +2000:1436:3:90:5026:5026L:1.3f:1.3 +2000:1437:1:90:5088:5088L:1.8f:1.8 +2000:1438:2:90:5053:5053L:0.505390f:0.505390 +2000:1439:1:905:5083:5083L:905.508f:905.508 +2000:1440:5:904:5099:5099L:1440.5f:1440.5 +2000:1441:1:91:5096:5096L:0.1f:0.1 +2000:1442:3:90:5046:5046L:3.2f:3.2 +2000:1443:1:90:5046:5046L:0.504690f:0.504690 +2000:1444:4:903:5045:5045L:903.504f:903.504 +2000:1445:5:906:5050:5050L:1445.5f:1445.5 +2000:1446:4:90:5060:5060L:0.4f:0.4 +2000:1447:5:90:5034:5034L:5.2f:5.2 +2000:1448:4:90:5047:5047L:0.504790f:0.504790 +2000:1449:2:906:5098:5098L:906.509f:906.509 +2000:1450:1:906:5037:5037L:1450.1f:1450.1 +2000:1451:1:90:5031:5031L:6.1f:6.1 +2000:1452:1:90:5050:5050L:1.1f:1.1 +2000:1453:3:90:5090:5090L:0.509090f:0.509090 +2000:1454:5:909:5022:5022L:909.502f:909.502 +2000:1455:3:909:5078:5078L:1455.3f:1455.3 +2000:1456:5:90:5086:5086L:5.5f:5.5 +2000:1457:3:90:5007:5007L:3.4f:3.4 +2000:1458:5:90:5063:5063L:0.506390f:0.506390 +2000:1459:2:905:5020:5020L:905.502f:905.502 +2000:1460:2:906:5076:5076L:1460.2f:1460.2 +2000:1461:4:90:5036:5036L:7.4f:7.4 +2000:1462:1:90:5048:5048L:1.8f:1.8 +2000:1463:3:90:5070:5070L:0.507090f:0.507090 +2000:1464:3:903:5057:5057L:903.505f:903.505 +2000:1465:4:908:5042:5042L:1465.4f:1465.4 +2000:1466:3:90:5092:5092L:7.3f:7.3 +2000:1467:2:90:5030:5030L:2.2f:2.2 +2000:1468:2:90:5047:5047L:0.504790f:0.504790 +2000:1469:5:904:5093:5093L:904.509f:904.509 +2000:1470:1:908:5052:5052L:1470.1f:1470.1 +2000:1471:5:90:5022:5022L:5.5f:5.5 +2000:1472:2:90:5000:5000L:2.5f:2.5 +2000:1473:4:91:5032:5032L:0.503291f:0.503291 +2000:1474:3:904:5063:5063L:904.506f:904.506 +2000:1475:1:900:5038:5038L:1475.1f:1475.1 +2000:1476:3:90:5007:5007L:4.3f:4.3 +2000:1477:2:90:5030:5030L:2.7f:2.7 +2000:1478:4:90:5041:5041L:0.504190f:0.504190 +2000:1479:1:900:5087:5087L:900.508f:900.508 +2000:1480:1:902:5065:5065L:1480.1f:1480.1 +2000:1481:3:90:5012:5012L:1.3f:1.3 +2000:1482:5:90:5061:5061L:5.4f:5.4 +2000:1483:5:90:5060:5060L:0.506090f:0.506090 +2000:1484:1:907:5000:5000L:907.500f:907.500 +2000:1485:4:907:5003:5003L:1485.4f:1485.4 +2000:1486:1:90:5046:5046L:1.1f:1.1 +2000:1487:2:90:5016:5016L:2.6f:2.6 +2000:1488:3:90:5021:5021L:0.502190f:0.502190 +2000:1489:5:904:5022:5022L:904.502f:904.502 +2000:1490:5:905:5041:5041L:1490.5f:1490.5 +2000:1491:3:90:5054:5054L:0.3f:0.3 +2000:1492:3:90:5097:5097L:3.9f:3.9 +2000:1493:1:90:5016:5016L:0.501690f:0.501690 +2000:1494:4:909:5084:5084L:909.508f:909.508 +2000:1495:4:906:5055:5055L:1495.4f:1495.4 +2000:1496:5:90:5072:5072L:8.5f:8.5 +2000:1497:2:90:5026:5026L:2.0f:2.0 +2000:1498:3:90:5049:5049L:0.504990f:0.504990 +2000:1499:4:905:5088:5088L:905.508f:905.508 +2000:1500:5:903:5034:5034L:1500.5f:1500.5 +2000:1501:2:90:5039:5039L:8.2f:8.2 +2000:1502:5:90:5027:5027L:5.3f:5.3 +2000:1503:5:90:5099:5099L:0.509990f:0.509990 +2000:1504:5:903:5084:5084L:903.508f:903.508 +2000:1505:5:901:5047:5047L:1505.5f:1505.5 +2000:1506:2:91:5024:5024L:0.2f:0.2 +2000:1507:1:90:5025:5025L:1.2f:1.2 +2000:1508:2:90:5079:5079L:0.507990f:0.507990 +2000:1509:5:904:5027:5027L:904.502f:904.502 +2000:1510:4:903:5056:5056L:1510.4f:1510.4 +2000:1511:1:90:5032:5032L:6.1f:6.1 +2000:1512:3:90:5066:5066L:3.4f:3.4 +2000:1513:4:90:5019:5019L:0.501990f:0.501990 +2000:1514:4:902:5053:5053L:902.505f:902.505 +2000:1515:3:900:5066:5066L:1515.3f:1515.3 +2000:1516:1:90:5062:5062L:4.1f:4.1 +2000:1517:2:90:5088:5088L:2.5f:2.5 +2000:1518:3:90:5060:5060L:0.506090f:0.506090 +2000:1519:2:907:5099:5099L:907.509f:907.509 +2000:1520:3:904:5028:5028L:1520.3f:1520.3 +2000:1521:1:90:5088:5088L:4.1f:4.1 +2000:1522:3:90:5033:5033L:3.9f:3.9 +2000:1523:1:90:5060:5060L:0.506090f:0.506090 +2000:1524:2:903:5084:5084L:903.508f:903.508 +2000:1525:5:909:5090:5090L:1525.5f:1525.5 +2000:1526:3:90:5031:5031L:9.3f:9.3 +2000:1527:1:90:5080:5080L:1.1f:1.1 +2000:1528:5:90:5062:5062L:0.506290f:0.506290 +2000:1529:3:909:5027:5027L:909.502f:909.502 +2000:1530:3:905:5064:5064L:1530.3f:1530.3 +2000:1531:5:90:5005:5005L:6.5f:6.5 +2000:1532:4:90:5091:5091L:4.0f:4.0 +2000:1533:1:90:5048:5048L:0.504890f:0.504890 +2000:1534:4:904:5076:5076L:904.507f:904.507 +2000:1535:3:902:5058:5058L:1535.3f:1535.3 +2000:1536:2:90:5042:5042L:7.2f:7.2 +2000:1537:4:90:5052:5052L:4.9f:4.9 +2000:1538:3:90:5012:5012L:0.501290f:0.501290 +2000:1539:1:904:5002:5002L:904.500f:904.500 +2000:1540:2:910:5048:5048L:1540.2f:1540.2 +2000:1541:1:90:5007:5007L:8.1f:8.1 +2000:1542:1:90:5009:5009L:1.5f:1.5 +2000:1543:5:90:5022:5022L:0.502290f:0.502290 +2000:1544:3:902:5065:5065L:902.506f:902.506 +2000:1545:2:908:5090:5090L:1545.2f:1545.2 +2000:1546:5:90:5062:5062L:1.5f:1.5 +2000:1547:2:90:5045:5045L:2.9f:2.9 +2000:1548:4:90:5026:5026L:0.502690f:0.502690 +2000:1549:5:905:5066:5066L:905.506f:905.506 +2000:1550:5:909:5062:5062L:1550.5f:1550.5 +2000:1551:2:91:5043:5043L:0.2f:0.2 +2000:1552:3:90:5097:5097L:3.0f:3.0 +2000:1553:3:90:5056:5056L:0.505690f:0.505690 +2000:1554:4:905:5082:5082L:905.508f:905.508 +2000:1555:3:907:5057:5057L:1555.3f:1555.3 +2000:1556:2:90:5072:5072L:5.2f:5.2 +2000:1557:5:90:5057:5057L:5.8f:5.8 +2000:1558:2:90:5092:5092L:0.509290f:0.509290 +2000:1559:4:904:5039:5039L:904.503f:904.503 +2000:1560:2:902:5026:5026L:1560.2f:1560.2 +2000:1561:5:90:5017:5017L:7.5f:7.5 +2000:1562:2:90:5018:5018L:2.1f:2.1 +2000:1563:2:90:5018:5018L:0.501890f:0.501890 +2000:1564:5:904:5066:5066L:904.506f:904.506 +2000:1565:4:909:5037:5037L:1565.4f:1565.4 +2000:1566:2:90:5089:5089L:1.2f:1.2 +2000:1567:5:90:5064:5064L:5.0f:5.0 +2000:1568:3:90:5014:5014L:0.501490f:0.501490 +2000:1569:3:901:5052:5052L:901.505f:901.505 +2000:1570:5:905:5079:5079L:1570.5f:1570.5 +2000:1571:1:90:5043:5043L:4.1f:4.1 +2000:1572:2:90:5052:5052L:2.8f:2.8 +2000:1573:3:90:5015:5015L:0.501590f:0.501590 +2000:1574:4:910:5057:5057L:910.505f:910.505 +2000:1575:2:907:5040:5040L:1575.2f:1575.2 +2000:1576:4:91:5055:5055L:0.4f:0.4 +2000:1577:3:91:5064:5064L:3.0f:3.0 +2000:1578:2:90:5012:5012L:0.501290f:0.501290 +2000:1579:2:910:5026:5026L:910.502f:910.502 +2000:1580:5:908:5073:5073L:1580.5f:1580.5 +2000:1581:4:91:5012:5012L:0.4f:0.4 +2000:1582:1:90:5089:5089L:1.2f:1.2 +2000:1583:4:90:5097:5097L:0.509790f:0.509790 +2000:1584:4:904:5095:5095L:904.509f:904.509 +2000:1585:2:907:5062:5062L:1585.2f:1585.2 +2000:1586:4:90:5055:5055L:4.4f:4.4 +2000:1587:2:91:5047:5047L:2.0f:2.0 +2000:1588:5:90:5095:5095L:0.509590f:0.509590 +2000:1589:1:906:5090:5090L:906.509f:906.509 +2000:1590:2:904:5070:5070L:1590.2f:1590.2 +2000:1591:1:90:5064:5064L:0.1f:0.1 +2000:1592:1:90:5089:5089L:1.1f:1.1 +2000:1593:1:90:5062:5062L:0.506290f:0.506290 +2000:1594:1:905:5000:5000L:905.500f:905.500 +2000:1595:5:909:5072:5072L:1595.5f:1595.5 +2000:1596:3:90:5012:5012L:6.3f:6.3 +2000:1597:1:90:5009:5009L:1.9f:1.9 +2000:1598:3:90:5029:5029L:0.502990f:0.502990 +2000:1599:3:909:5084:5084L:909.508f:909.508 +2000:1600:3:901:5026:5026L:1600.3f:1600.3 +2000:1601:1:90:5034:5034L:1.1f:1.1 +2000:1602:4:90:5051:5051L:4.3f:4.3 +2000:1603:4:90:5028:5028L:0.502890f:0.502890 +2000:1604:2:904:5081:5081L:904.508f:904.508 +2000:1605:2:903:5067:5067L:1605.2f:1605.2 +2000:1606:1:90:5024:5024L:9.1f:9.1 +2000:1607:1:91:5010:5010L:1.0f:1.0 +2000:1608:2:90:5089:5089L:0.508990f:0.508990 +2000:1609:3:901:5071:5071L:901.507f:901.507 +2000:1610:2:906:5085:5085L:1610.2f:1610.2 +2000:1611:4:90:5001:5001L:7.4f:7.4 +2000:1612:5:90:5034:5034L:5.5f:5.5 +2000:1613:3:90:5071:5071L:0.507190f:0.507190 +2000:1614:4:904:5007:5007L:904.500f:904.500 +2000:1615:3:907:5040:5040L:1615.3f:1615.3 +2000:1616:2:90:5028:5028L:7.2f:7.2 +2000:1617:3:90:5028:5028L:3.9f:3.9 +2000:1618:3:90:5088:5088L:0.508890f:0.508890 +2000:1619:3:906:5000:5000L:906.500f:906.500 +2000:1620:1:910:5056:5056L:1620.1f:1620.1 +2000:1621:1:90:5025:5025L:5.1f:5.1 +2000:1622:1:90:5073:5073L:1.5f:1.5 +2000:1623:2:91:5086:5086L:0.508691f:0.508691 +2000:1624:1:907:5025:5025L:907.502f:907.502 +2000:1625:1:903:5095:5095L:1625.1f:1625.1 +2000:1626:3:90:5064:5064L:5.3f:5.3 +2000:1627:5:91:5046:5046L:5.0f:5.0 +2000:1628:1:90:5050:5050L:0.505090f:0.505090 +2000:1629:5:900:5006:5006L:900.500f:900.500 +2000:1630:1:902:5098:5098L:1630.1f:1630.1 +2000:1631:3:90:5050:5050L:2.3f:2.3 +2000:1632:5:90:5100:5100L:5.2f:5.2 +2000:1633:3:90:5096:5096L:0.509690f:0.509690 +2000:1634:2:907:5067:5067L:907.506f:907.506 +2000:1635:4:909:5095:5095L:1635.4f:1635.4 +2000:1636:3:90:5044:5044L:4.3f:4.3 +2000:1637:2:90:5040:5040L:2.3f:2.3 +2000:1638:4:90:5095:5095L:0.509590f:0.509590 +2000:1639:1:904:5096:5096L:904.509f:904.509 +2000:1640:2:904:5013:5013L:1640.2f:1640.2 +2000:1641:2:91:5034:5034L:0.2f:0.2 +2000:1642:4:90:5059:5059L:4.8f:4.8 +2000:1643:4:90:5021:5021L:0.502190f:0.502190 +2000:1644:4:908:5094:5094L:908.509f:908.509 +2000:1645:2:904:5082:5082L:1645.2f:1645.2 +2000:1646:2:90:5026:5026L:0.2f:0.2 +2000:1647:4:90:5055:5055L:4.2f:4.2 +2000:1648:1:91:5098:5098L:0.509891f:0.509891 +2000:1649:1:901:5039:5039L:901.503f:901.503 +2000:1650:1:903:5082:5082L:1650.1f:1650.1 +2000:1651:1:90:5080:5080L:6.1f:6.1 +2000:1652:3:90:5061:5061L:3.3f:3.3 +2000:1653:1:90:5096:5096L:0.509690f:0.509690 +2000:1654:2:907:5071:5071L:907.507f:907.507 +2000:1655:2:900:5011:5011L:1655.2f:1655.2 +2000:1656:1:90:5011:5011L:3.1f:3.1 +2000:1657:2:90:5035:5035L:2.0f:2.0 +2000:1658:5:90:5027:5027L:0.502790f:0.502790 +2000:1659:5:902:5038:5038L:902.503f:902.503 +2000:1660:2:902:5074:5074L:1660.2f:1660.2 +2000:1661:1:90:5031:5031L:4.1f:4.1 +2000:1662:5:91:5062:5062L:5.0f:5.0 +2000:1663:3:90:5063:5063L:0.506390f:0.506390 +2000:1664:3:903:5030:5030L:903.503f:903.503 +2000:1665:1:906:5032:5032L:1665.1f:1665.1 +2000:1666:2:90:5062:5062L:6.2f:6.2 +2000:1667:2:91:5064:5064L:2.0f:2.0 +2000:1668:4:90:5079:5079L:0.507990f:0.507990 +2000:1669:5:906:5000:5000L:906.500f:906.500 +2000:1670:2:909:5025:5025L:1670.2f:1670.2 +2000:1671:1:90:5066:5066L:9.1f:9.1 +2000:1672:2:90:5057:5057L:2.8f:2.8 +2000:1673:1:90:5058:5058L:0.505890f:0.505890 +2000:1674:4:906:5089:5089L:906.508f:906.508 +2000:1675:5:907:5044:5044L:1675.5f:1675.5 +2000:1676:2:91:5004:5004L:0.2f:0.2 +2000:1677:5:90:5096:5096L:5.3f:5.3 +2000:1678:3:91:5074:5074L:0.507491f:0.507491 +2000:1679:2:910:5036:5036L:910.503f:910.503 +2000:1680:2:902:5021:5021L:1680.2f:1680.2 +2000:1681:3:90:5011:5011L:3.3f:3.3 +2000:1682:2:90:5087:5087L:2.7f:2.7 +2000:1683:5:90:5006:5006L:0.500690f:0.500690 +2000:1684:2:903:5067:5067L:903.506f:903.506 +2000:1685:2:903:5038:5038L:1685.2f:1685.2 +2000:1686:4:90:5032:5032L:6.4f:6.4 +2000:1687:4:90:5060:5060L:4.4f:4.4 +2000:1688:4:91:5057:5057L:0.505791f:0.505791 +2000:1689:3:903:5049:5049L:903.504f:903.504 +2000:1690:4:906:5075:5075L:1690.4f:1690.4 +2000:1691:1:90:5007:5007L:1.1f:1.1 +2000:1692:1:90:5080:5080L:1.4f:1.4 +2000:1693:5:90:5052:5052L:0.505290f:0.505290 +2000:1694:1:906:5088:5088L:906.508f:906.508 +2000:1695:4:909:5018:5018L:1695.4f:1695.4 +2000:1696:1:90:5074:5074L:6.1f:6.1 +2000:1697:3:90:5018:5018L:3.3f:3.3 +2000:1698:1:90:5015:5015L:0.501590f:0.501590 +2000:1699:4:904:5043:5043L:904.504f:904.504 +2000:1700:1:902:5003:5003L:1700.1f:1700.1 +2000:1701:5:90:5021:5021L:2.5f:2.5 +2000:1702:5:90:5062:5062L:5.4f:5.4 +2000:1703:4:90:5084:5084L:0.508490f:0.508490 +2000:1704:2:904:5043:5043L:904.504f:904.504 +2000:1705:1:901:5029:5029L:1705.1f:1705.1 +2000:1706:2:90:5087:5087L:2.2f:2.2 +2000:1707:1:90:5017:5017L:1.7f:1.7 +2000:1708:2:90:5018:5018L:0.501890f:0.501890 +2000:1709:2:903:5063:5063L:903.506f:903.506 +2000:1710:5:904:5088:5088L:1710.5f:1710.5 +2000:1711:5:90:5012:5012L:2.5f:2.5 +2000:1712:1:90:5051:5051L:1.1f:1.1 +2000:1713:4:90:5089:5089L:0.508990f:0.508990 +2000:1714:3:901:5032:5032L:901.503f:901.503 +2000:1715:5:902:5048:5048L:1715.5f:1715.5 +2000:1716:2:90:5075:5075L:5.2f:5.2 +2000:1717:1:90:5045:5045L:1.5f:1.5 +2000:1718:2:90:5018:5018L:0.501890f:0.501890 +2000:1719:3:901:5052:5052L:901.505f:901.505 +2000:1720:1:909:5095:5095L:1720.1f:1720.1 +2000:1721:5:90:5020:5020L:8.5f:8.5 +2000:1722:1:90:5038:5038L:1.8f:1.8 +2000:1723:3:90:5025:5025L:0.502590f:0.502590 +2000:1724:3:910:5036:5036L:910.503f:910.503 +2000:1725:4:910:5057:5057L:1725.4f:1725.4 +2000:1726:2:90:5006:5006L:1.2f:1.2 +2000:1727:1:90:5059:5059L:1.2f:1.2 +2000:1728:3:90:5032:5032L:0.503290f:0.503290 +2000:1729:4:910:5042:5042L:910.504f:910.504 +2000:1730:1:900:5033:5033L:1730.1f:1730.1 +2000:1731:1:90:5008:5008L:0.1f:0.1 +2000:1732:2:90:5088:5088L:2.0f:2.0 +2000:1733:4:90:5035:5035L:0.503590f:0.503590 +2000:1734:5:901:5033:5033L:901.503f:901.503 +2000:1735:2:910:5024:5024L:1735.2f:1735.2 +2000:1736:5:90:5040:5040L:2.5f:2.5 +2000:1737:5:90:5065:5065L:5.2f:5.2 +2000:1738:3:90:5016:5016L:0.501690f:0.501690 +2000:1739:5:904:5013:5013L:904.501f:904.501 +2000:1740:2:906:5019:5019L:1740.2f:1740.2 +2000:1741:4:90:5020:5020L:7.4f:7.4 +2000:1742:4:90:5029:5029L:4.0f:4.0 +2000:1743:3:90:5098:5098L:0.509890f:0.509890 +2000:1744:5:907:5012:5012L:907.501f:907.501 +2000:1745:2:910:5008:5008L:1745.2f:1745.2 +2000:1746:3:90:5031:5031L:9.3f:9.3 +2000:1747:5:90:5058:5058L:5.8f:5.8 +2000:1748:3:90:5031:5031L:0.503190f:0.503190 +2000:1749:4:902:5072:5072L:902.507f:902.507 +2000:1750:5:905:5029:5029L:1750.5f:1750.5 +2000:1751:1:90:5099:5099L:0.1f:0.1 +2000:1752:2:90:5001:5001L:2.8f:2.8 +2000:1753:3:90:5074:5074L:0.507490f:0.507490 +2000:1754:3:902:5041:5041L:902.504f:902.504 +2000:1755:4:905:5041:5041L:1755.4f:1755.4 +2000:1756:4:91:5028:5028L:0.4f:0.4 +2000:1757:1:90:5009:5009L:1.9f:1.9 +2000:1758:3:90:5044:5044L:0.504490f:0.504490 +2000:1759:5:900:5063:5063L:900.506f:900.506 +2000:1760:4:909:5009:5009L:1760.4f:1760.4 +2000:1761:5:90:5015:5015L:9.5f:9.5 +2000:1762:5:90:5091:5091L:5.1f:5.1 +2000:1763:5:90:5021:5021L:0.502190f:0.502190 +2000:1764:4:901:5044:5044L:901.504f:901.504 +2000:1765:1:908:5091:5091L:1765.1f:1765.1 +2000:1766:3:90:5086:5086L:4.3f:4.3 +2000:1767:4:90:5069:5069L:4.4f:4.4 +2000:1768:5:90:5005:5005L:0.500590f:0.500590 +2000:1769:2:910:5010:5010L:910.501f:910.501 +2000:1770:5:905:5099:5099L:1770.5f:1770.5 +2000:1771:5:90:5090:5090L:4.5f:4.5 +2000:1772:1:90:5002:5002L:1.3f:1.3 +2000:1773:1:90:5067:5067L:0.506790f:0.506790 +2000:1774:2:909:5081:5081L:909.508f:909.508 +2000:1775:4:910:5056:5056L:1775.4f:1775.4 +2000:1776:4:90:5100:5100L:4.4f:4.4 +2000:1777:3:90:5045:5045L:3.1f:3.1 +2000:1778:1:91:5048:5048L:0.504891f:0.504891 +2000:1779:2:902:5041:5041L:902.504f:902.504 +2000:1780:2:901:5096:5096L:1780.2f:1780.2 +2000:1781:2:90:5040:5040L:1.2f:1.2 +2000:1782:2:90:5074:5074L:2.2f:2.2 +2000:1783:2:90:5099:5099L:0.509990f:0.509990 +2000:1784:5:906:5087:5087L:906.508f:906.508 +2000:1785:4:903:5080:5080L:1785.4f:1785.4 +2000:1786:2:90:5018:5018L:9.2f:9.2 +2000:1787:2:90:5030:5030L:2.4f:2.4 +2000:1788:4:90:5026:5026L:0.502690f:0.502690 +2000:1789:1:908:5049:5049L:908.504f:908.504 +2000:1790:3:900:5062:5062L:1790.3f:1790.3 +2000:1791:3:90:5074:5074L:4.3f:4.3 +2000:1792:5:90:5000:5000L:5.6f:5.6 +2000:1793:4:90:5031:5031L:0.503190f:0.503190 +2000:1794:4:907:5090:5090L:907.509f:907.509 +2000:1795:3:904:5018:5018L:1795.3f:1795.3 +2000:1796:2:90:5008:5008L:7.2f:7.2 +2000:1797:3:91:5045:5045L:3.0f:3.0 +2000:1798:5:90:5100:5100L:0.510090f:0.510090 +2000:1799:1:908:5076:5076L:908.507f:908.507 +2000:1800:3:904:5084:5084L:1800.3f:1800.3 +2000:1801:1:91:5022:5022L:0.1f:0.1 +2000:1802:5:90:5081:5081L:5.9f:5.9 +2000:1803:5:90:5063:5063L:0.506390f:0.506390 +2000:1804:2:902:5033:5033L:902.503f:902.503 +2000:1805:1:908:5075:5075L:1805.1f:1805.1 +2000:1806:2:90:5042:5042L:0.2f:0.2 +2000:1807:2:90:5035:5035L:2.6f:2.6 +2000:1808:5:90:5098:5098L:0.509890f:0.509890 +2000:1809:5:904:5080:5080L:904.508f:904.508 +2000:1810:3:910:5021:5021L:1810.3f:1810.3 +2000:1811:3:90:5016:5016L:1.3f:1.3 +2000:1812:4:90:5007:5007L:4.0f:4.0 +2000:1813:3:91:5066:5066L:0.506691f:0.506691 +2000:1814:1:902:5091:5091L:902.509f:902.509 +2000:1815:2:903:5068:5068L:1815.2f:1815.2 +2000:1816:1:90:5077:5077L:6.1f:6.1 +2000:1817:3:91:5035:5035L:3.0f:3.0 +2000:1818:5:90:5074:5074L:0.507490f:0.507490 +2000:1819:5:906:5018:5018L:906.501f:906.501 +2000:1820:4:901:5018:5018L:1820.4f:1820.4 +2000:1821:5:90:5034:5034L:6.5f:6.5 +2000:1822:1:90:5040:5040L:1.2f:1.2 +2000:1823:1:90:5037:5037L:0.503790f:0.503790 +2000:1824:4:907:5055:5055L:907.505f:907.505 +2000:1825:4:900:5085:5085L:1825.4f:1825.4 +2000:1826:2:90:5043:5043L:2.2f:2.2 +2000:1827:1:90:5038:5038L:1.8f:1.8 +2000:1828:3:90:5015:5015L:0.501590f:0.501590 +2000:1829:2:906:5075:5075L:906.507f:906.507 +2000:1830:2:903:5092:5092L:1830.2f:1830.2 +2000:1831:3:90:5048:5048L:1.3f:1.3 +2000:1832:5:90:5068:5068L:5.2f:5.2 +2000:1833:2:90:5031:5031L:0.503190f:0.503190 +2000:1834:4:901:5000:5000L:901.500f:901.500 +2000:1835:2:909:5009:5009L:1835.2f:1835.2 +2000:1836:1:90:5032:5032L:2.1f:2.1 +2000:1837:3:90:5011:5011L:3.3f:3.3 +2000:1838:5:90:5082:5082L:0.508290f:0.508290 +2000:1839:1:900:5040:5040L:900.504f:900.504 +2000:1840:5:904:5068:5068L:1840.5f:1840.5 +2000:1841:4:90:5086:5086L:0.4f:0.4 +2000:1842:1:91:5008:5008L:1.0f:1.0 +2000:1843:5:90:5046:5046L:0.504690f:0.504690 +2000:1844:1:910:5062:5062L:910.506f:910.506 +2000:1845:1:902:5047:5047L:1845.1f:1845.1 +2000:1846:2:90:5069:5069L:3.2f:3.2 +2000:1847:3:90:5003:5003L:3.9f:3.9 +2000:1848:4:90:5087:5087L:0.508790f:0.508790 +2000:1849:3:908:5091:5091L:908.509f:908.509 +2000:1850:5:906:5034:5034L:1850.5f:1850.5 +2000:1851:4:90:5036:5036L:3.4f:3.4 +2000:1852:3:90:5030:5030L:3.5f:3.5 +2000:1853:3:90:5057:5057L:0.505790f:0.505790 +2000:1854:1:906:5053:5053L:906.505f:906.505 +2000:1855:4:908:5074:5074L:1855.4f:1855.4 +2000:1856:1:90:5003:5003L:0.1f:0.1 +2000:1857:4:90:5087:5087L:4.6f:4.6 +2000:1858:5:90:5060:5060L:0.506090f:0.506090 +2000:1859:4:909:5039:5039L:909.503f:909.503 +2000:1860:3:908:5099:5099L:1860.3f:1860.3 +2000:1861:5:90:5028:5028L:4.5f:4.5 +2000:1862:2:90:5079:5079L:2.9f:2.9 +2000:1863:3:90:5016:5016L:0.501690f:0.501690 +2000:1864:1:904:5072:5072L:904.507f:904.507 +2000:1865:4:900:5046:5046L:1865.4f:1865.4 +2000:1866:3:90:5047:5047L:1.3f:1.3 +2000:1867:3:90:5008:5008L:3.9f:3.9 +2000:1868:2:90:5039:5039L:0.503990f:0.503990 +2000:1869:5:904:5022:5022L:904.502f:904.502 +2000:1870:2:910:5099:5099L:1870.2f:1870.2 +2000:1871:2:90:5036:5036L:9.2f:9.2 +2000:1872:3:90:5019:5019L:3.1f:3.1 +2000:1873:2:90:5058:5058L:0.505890f:0.505890 +2000:1874:3:909:5097:5097L:909.509f:909.509 +2000:1875:2:906:5099:5099L:1875.2f:1875.2 +2000:1876:4:90:5009:5009L:0.4f:0.4 +2000:1877:1:90:5098:5098L:1.5f:1.5 +2000:1878:2:90:5067:5067L:0.506790f:0.506790 +2000:1879:4:907:5003:5003L:907.500f:907.500 +2000:1880:5:900:5098:5098L:1880.5f:1880.5 +2000:1881:5:90:5084:5084L:3.5f:3.5 +2000:1882:2:90:5100:5100L:2.9f:2.9 +2000:1883:3:90:5074:5074L:0.507490f:0.507490 +2000:1884:5:908:5064:5064L:908.506f:908.506 +2000:1885:5:900:5022:5022L:1885.5f:1885.5 +2000:1886:5:90:5022:5022L:8.5f:8.5 +2000:1887:1:90:5069:5069L:1.9f:1.9 +2000:1888:1:90:5046:5046L:0.504690f:0.504690 +2000:1889:4:908:5016:5016L:908.501f:908.501 +2000:1890:4:907:5018:5018L:1890.4f:1890.4 +2000:1891:4:90:5050:5050L:5.4f:5.4 +2000:1892:3:90:5039:5039L:3.8f:3.8 +2000:1893:3:90:5065:5065L:0.506590f:0.506590 +2000:1894:2:901:5043:5043L:901.504f:901.504 +2000:1895:5:900:5046:5046L:1895.5f:1895.5 +2000:1896:1:90:5019:5019L:0.1f:0.1 +2000:1897:2:90:5009:5009L:2.0f:2.0 +2000:1898:1:90:5024:5024L:0.502490f:0.502490 +2000:1899:3:908:5003:5003L:908.500f:908.500 +2000:1900:4:905:5070:5070L:1900.4f:1900.4 +2000:1901:5:90:5022:5022L:1.5f:1.5 +2000:1902:2:90:5097:5097L:2.7f:2.7 +2000:1903:4:90:5011:5011L:0.501190f:0.501190 +2000:1904:2:905:5024:5024L:905.502f:905.502 +2000:1905:5:904:5033:5033L:1905.5f:1905.5 +2000:1906:2:90:5037:5037L:5.2f:5.2 +2000:1907:3:90:5043:5043L:3.9f:3.9 +2000:1908:3:90:5051:5051L:0.505190f:0.505190 +2000:1909:5:904:5026:5026L:904.502f:904.502 +2000:1910:5:900:5074:5074L:1910.5f:1910.5 +2000:1911:3:91:5090:5090L:0.3f:0.3 +2000:1912:4:90:5058:5058L:4.2f:4.2 +2000:1913:4:90:5079:5079L:0.507990f:0.507990 +2000:1914:5:904:5026:5026L:904.502f:904.502 +2000:1915:1:902:5063:5063L:1915.1f:1915.1 +2000:1916:3:90:5011:5011L:5.3f:5.3 +2000:1917:4:91:5097:5097L:4.0f:4.0 +2000:1918:2:90:5085:5085L:0.508590f:0.508590 +2000:1919:4:904:5023:5023L:904.502f:904.502 +2000:1920:1:902:5029:5029L:1920.1f:1920.1 +2000:1921:4:90:5019:5019L:8.4f:8.4 +2000:1922:4:90:5046:5046L:4.6f:4.6 +2000:1923:2:90:5046:5046L:0.504690f:0.504690 +2000:1924:1:901:5085:5085L:901.508f:901.508 +2000:1925:2:902:5006:5006L:1925.2f:1925.2 +2000:1926:5:90:5057:5057L:7.5f:7.5 +2000:1927:1:90:5056:5056L:1.5f:1.5 +2000:1928:5:90:5013:5013L:0.501390f:0.501390 +2000:1929:5:904:5052:5052L:904.505f:904.505 +2000:1930:1:904:5077:5077L:1930.1f:1930.1 +2000:1931:2:90:5056:5056L:1.2f:1.2 +2000:1932:3:90:5012:5012L:3.8f:3.8 +2000:1933:5:90:5043:5043L:0.504390f:0.504390 +2000:1934:3:900:5058:5058L:900.505f:900.505 +2000:1935:2:903:5082:5082L:1935.2f:1935.2 +2000:1936:2:90:5048:5048L:1.2f:1.2 +2000:1937:5:90:5094:5094L:5.2f:5.2 +2000:1938:3:90:5062:5062L:0.506290f:0.506290 +2000:1939:4:910:5003:5003L:910.500f:910.500 +2000:1940:1:900:5045:5045L:1940.1f:1940.1 +2000:1941:5:90:5060:5060L:4.5f:4.5 +2000:1942:3:91:5039:5039L:3.0f:3.0 +2000:1943:4:91:5040:5040L:0.504091f:0.504091 +2000:1944:1:904:5041:5041L:904.504f:904.504 +2000:1945:4:907:5070:5070L:1945.4f:1945.4 +2000:1946:3:90:5088:5088L:0.3f:0.3 +2000:1947:5:90:5006:5006L:5.0f:5.0 +2000:1948:5:90:5023:5023L:0.502390f:0.502390 +2000:1949:3:901:5022:5022L:901.502f:901.502 +2000:1950:3:903:5026:5026L:1950.3f:1950.3 +2000:1951:5:90:5065:5065L:2.5f:2.5 +2000:1952:3:90:5057:5057L:3.8f:3.8 +2000:1953:5:90:5049:5049L:0.504990f:0.504990 +2000:1954:2:904:5087:5087L:904.508f:904.508 +2000:1955:4:900:5055:5055L:1955.4f:1955.4 +2000:1956:3:90:5061:5061L:5.3f:5.3 +2000:1957:2:90:5062:5062L:2.4f:2.4 +2000:1958:2:90:5014:5014L:0.501490f:0.501490 +2000:1959:4:908:5030:5030L:908.503f:908.503 +2000:1960:5:902:5064:5064L:1960.5f:1960.5 +2000:1961:1:90:5089:5089L:2.1f:2.1 +2000:1962:4:90:5063:5063L:4.8f:4.8 +2000:1963:2:90:5099:5099L:0.509990f:0.509990 +2000:1964:5:900:5038:5038L:900.503f:900.503 +2000:1965:4:908:5041:5041L:1965.4f:1965.4 +2000:1966:2:90:5088:5088L:2.2f:2.2 +2000:1967:5:90:5027:5027L:5.6f:5.6 +2000:1968:3:91:5053:5053L:0.505391f:0.505391 +2000:1969:4:906:5026:5026L:906.502f:906.502 +2000:1970:5:904:5050:5050L:1970.5f:1970.5 +2000:1971:3:90:5069:5069L:6.3f:6.3 +2000:1972:3:90:5044:5044L:3.3f:3.3 +2000:1973:1:90:5012:5012L:0.501290f:0.501290 +2000:1974:1:905:5015:5015L:905.501f:905.501 +2000:1975:3:901:5093:5093L:1975.3f:1975.3 +2000:1976:5:90:5015:5015L:4.5f:4.5 +2000:1977:4:90:5072:5072L:4.2f:4.2 +2000:1978:5:90:5067:5067L:0.506790f:0.506790 +2000:1979:3:903:5024:5024L:903.502f:903.502 +2000:1980:4:902:5068:5068L:1980.4f:1980.4 +2000:1981:2:90:5022:5022L:8.2f:8.2 +2000:1982:5:90:5053:5053L:5.2f:5.2 +2000:1983:3:90:5017:5017L:0.501790f:0.501790 +2000:1984:3:903:5064:5064L:903.506f:903.506 +2000:1985:4:908:5079:5079L:1985.4f:1985.4 +2000:1986:4:90:5018:5018L:6.4f:6.4 +2000:1987:4:90:5043:5043L:4.3f:4.3 +2000:1988:3:90:5014:5014L:0.501490f:0.501490 +2000:1989:1:909:5047:5047L:909.504f:909.504 +2000:1990:2:907:5071:5071L:1990.2f:1990.2 +2000:1991:1:91:5049:5049L:0.1f:0.1 +2000:1992:2:90:5072:5072L:2.9f:2.9 +2000:1993:5:90:5000:5000L:0.500090f:0.500090 +2000:1994:1:909:5035:5035L:909.503f:909.503 +2000:1995:4:905:5012:5012L:1995.4f:1995.4 +2000:1996:3:90:5075:5075L:1.3f:1.3 +2000:1997:4:90:5009:5009L:4.9f:4.9 +2000:1998:1:90:5043:5043L:0.504390f:0.504390 +2000:1999:1:905:5030:5030L:905.503f:905.503 +2000:2000:4:910:5095:5095L:2000.4f:2000.4 +3000:2001:2:90:5088:5088L:0.2f:0.2 +3000:2002:5:90:5077:5077L:5.3f:5.3 +3000:2003:3:90:5007:5007L:0.500790f:0.500790 +3000:2004:3:901:5092:5092L:901.509f:901.509 +3000:2005:5:908:5043:5043L:2005.5f:2005.5 +3000:2006:1:90:5057:5057L:2.1f:2.1 +3000:2007:5:90:5048:5048L:5.8f:5.8 +3000:2008:5:90:5088:5088L:0.508890f:0.508890 +3000:2009:2:900:5042:5042L:900.504f:900.504 +3000:2010:4:907:5036:5036L:2010.4f:2010.4 +3000:2011:3:90:5037:5037L:0.3f:0.3 +3000:2012:3:91:5068:5068L:3.0f:3.0 +3000:2013:2:90:5082:5082L:0.508290f:0.508290 +3000:2014:2:901:5095:5095L:901.509f:901.509 +3000:2015:2:900:5072:5072L:2015.2f:2015.2 +3000:2016:4:90:5093:5093L:1.4f:1.4 +3000:2017:2:91:5074:5074L:2.0f:2.0 +3000:2018:4:90:5059:5059L:0.505990f:0.505990 +3000:2019:3:901:5064:5064L:901.506f:901.506 +3000:2020:5:909:5033:5033L:2020.5f:2020.5 +3000:2021:2:90:5040:5040L:4.2f:4.2 +3000:2022:4:90:5033:5033L:4.9f:4.9 +3000:2023:2:90:5085:5085L:0.508590f:0.508590 +3000:2024:2:904:5095:5095L:904.509f:904.509 +3000:2025:1:906:5099:5099L:2025.1f:2025.1 +3000:2026:5:90:5009:5009L:3.5f:3.5 +3000:2027:5:90:5001:5001L:5.5f:5.5 +3000:2028:3:90:5085:5085L:0.508590f:0.508590 +3000:2029:1:908:5002:5002L:908.500f:908.500 +3000:2030:4:908:5086:5086L:2030.4f:2030.4 +3000:2031:1:90:5027:5027L:1.1f:1.1 +3000:2032:3:90:5014:5014L:3.9f:3.9 +3000:2033:5:90:5025:5025L:0.502590f:0.502590 +3000:2034:4:904:5067:5067L:904.506f:904.506 +3000:2035:4:906:5029:5029L:2035.4f:2035.4 +3000:2036:4:90:5057:5057L:5.4f:5.4 +3000:2037:4:90:5006:5006L:4.3f:4.3 +3000:2038:4:90:5026:5026L:0.502690f:0.502690 +3000:2039:3:910:5002:5002L:910.500f:910.500 +3000:2040:4:907:5078:5078L:2040.4f:2040.4 +3000:2041:3:90:5089:5089L:8.3f:8.3 +3000:2042:4:90:5071:5071L:4.3f:4.3 +3000:2043:5:90:5093:5093L:0.509390f:0.509390 +3000:2044:1:909:5036:5036L:909.503f:909.503 +3000:2045:5:905:5096:5096L:2045.5f:2045.5 +3000:2046:1:90:5043:5043L:1.1f:1.1 +3000:2047:4:90:5071:5071L:4.9f:4.9 +3000:2048:4:90:5053:5053L:0.505390f:0.505390 +3000:2049:5:901:5048:5048L:901.504f:901.504 +3000:2050:1:908:5019:5019L:2050.1f:2050.1 +3000:2051:5:90:5000:5000L:2.5f:2.5 +3000:2052:4:91:5032:5032L:4.0f:4.0 +3000:2053:2:90:5048:5048L:0.504890f:0.504890 +3000:2054:2:910:5032:5032L:910.503f:910.503 +3000:2055:4:908:5081:5081L:2055.4f:2055.4 +3000:2056:4:90:5091:5091L:9.4f:9.4 +3000:2057:1:90:5073:5073L:1.5f:1.5 +3000:2058:4:90:5028:5028L:0.502890f:0.502890 +3000:2059:2:903:5042:5042L:903.504f:903.504 +3000:2060:4:903:5017:5017L:2060.4f:2060.4 +3000:2061:5:90:5038:5038L:1.5f:1.5 +3000:2062:5:90:5034:5034L:5.8f:5.8 +3000:2063:2:90:5017:5017L:0.501790f:0.501790 +3000:2064:4:905:5014:5014L:905.501f:905.501 +3000:2065:1:902:5092:5092L:2065.1f:2065.1 +3000:2066:5:90:5079:5079L:9.5f:9.5 +3000:2067:5:90:5033:5033L:5.9f:5.9 +3000:2068:3:90:5061:5061L:0.506190f:0.506190 +3000:2069:5:910:5089:5089L:910.508f:910.508 +3000:2070:2:908:5018:5018L:2070.2f:2070.2 +3000:2071:3:90:5028:5028L:8.3f:8.3 +3000:2072:5:90:5006:5006L:5.7f:5.7 +3000:2073:1:90:5025:5025L:0.502590f:0.502590 +3000:2074:2:908:5077:5077L:908.507f:908.507 +3000:2075:3:909:5097:5097L:2075.3f:2075.3 +3000:2076:2:90:5080:5080L:8.2f:8.2 +3000:2077:1:90:5070:5070L:1.6f:1.6 +3000:2078:3:90:5037:5037L:0.503790f:0.503790 +3000:2079:1:900:5035:5035L:900.503f:900.503 +3000:2080:5:903:5011:5011L:2080.5f:2080.5 +3000:2081:1:90:5085:5085L:7.1f:7.1 +3000:2082:3:90:5056:5056L:3.5f:3.5 +3000:2083:3:90:5058:5058L:0.505890f:0.505890 +3000:2084:4:910:5037:5037L:910.503f:910.503 +3000:2085:3:904:5027:5027L:2085.3f:2085.3 +3000:2086:3:90:5008:5008L:8.3f:8.3 +3000:2087:2:91:5072:5072L:2.0f:2.0 +3000:2088:5:90:5091:5091L:0.509190f:0.509190 +3000:2089:2:906:5093:5093L:906.509f:906.509 +3000:2090:4:905:5020:5020L:2090.4f:2090.4 +3000:2091:5:90:5091:5091L:7.5f:7.5 +3000:2092:4:90:5040:5040L:4.1f:4.1 +3000:2093:2:90:5005:5005L:0.500590f:0.500590 +3000:2094:5:904:5001:5001L:904.500f:904.500 +3000:2095:1:910:5044:5044L:2095.1f:2095.1 +3000:2096:3:90:5023:5023L:5.3f:5.3 +3000:2097:3:90:5018:5018L:3.8f:3.8 +3000:2098:2:90:5064:5064L:0.506490f:0.506490 +3000:2099:1:900:5019:5019L:900.501f:900.501 +3000:2100:1:908:5074:5074L:2100.1f:2100.1 +3000:2101:2:90:5044:5044L:6.2f:6.2 +3000:2102:2:90:5060:5060L:2.3f:2.3 +3000:2103:4:90:5026:5026L:0.502690f:0.502690 +3000:2104:4:903:5070:5070L:903.507f:903.507 +3000:2105:4:905:5066:5066L:2105.4f:2105.4 +3000:2106:1:91:5011:5011L:0.1f:0.1 +3000:2107:2:90:5087:5087L:2.5f:2.5 +3000:2108:3:90:5060:5060L:0.506090f:0.506090 +3000:2109:1:909:5069:5069L:909.506f:909.506 +3000:2110:2:900:5048:5048L:2110.2f:2110.2 +3000:2111:1:90:5009:5009L:3.1f:3.1 +3000:2112:3:90:5037:5037L:3.5f:3.5 +3000:2113:1:90:5087:5087L:0.508790f:0.508790 +3000:2114:3:908:5017:5017L:908.501f:908.501 +3000:2115:1:905:5066:5066L:2115.1f:2115.1 +3000:2116:4:90:5059:5059L:6.4f:6.4 +3000:2117:5:91:5006:5006L:5.0f:5.0 +3000:2118:4:90:5080:5080L:0.508090f:0.508090 +3000:2119:2:907:5071:5071L:907.507f:907.507 +3000:2120:1:900:5072:5072L:2120.1f:2120.1 +3000:2121:3:90:5002:5002L:1.3f:1.3 +3000:2122:3:90:5055:5055L:3.7f:3.7 +3000:2123:5:90:5068:5068L:0.506890f:0.506890 +3000:2124:5:902:5047:5047L:902.504f:902.504 +3000:2125:1:903:5096:5096L:2125.1f:2125.1 +3000:2126:4:90:5055:5055L:0.4f:0.4 +3000:2127:2:91:5050:5050L:2.0f:2.0 +3000:2128:2:90:5099:5099L:0.509990f:0.509990 +3000:2129:1:900:5064:5064L:900.506f:900.506 +3000:2130:5:901:5067:5067L:2130.5f:2130.5 +3000:2131:3:90:5079:5079L:6.3f:6.3 +3000:2132:3:90:5046:5046L:3.2f:3.2 +3000:2133:1:90:5027:5027L:0.502790f:0.502790 +3000:2134:4:900:5049:5049L:900.504f:900.504 +3000:2135:2:900:5082:5082L:2135.2f:2135.2 +3000:2136:2:90:5091:5091L:7.2f:7.2 +3000:2137:4:91:5088:5088L:4.0f:4.0 +3000:2138:2:90:5061:5061L:0.506190f:0.506190 +3000:2139:2:903:5067:5067L:903.506f:903.506 +3000:2140:5:901:5077:5077L:2140.5f:2140.5 +3000:2141:3:90:5037:5037L:7.3f:7.3 +3000:2142:2:90:5057:5057L:2.2f:2.2 +3000:2143:5:90:5074:5074L:0.507490f:0.507490 +3000:2144:1:901:5074:5074L:901.507f:901.507 +3000:2145:3:904:5075:5075L:2145.3f:2145.3 +3000:2146:2:90:5043:5043L:6.2f:6.2 +3000:2147:2:90:5035:5035L:2.3f:2.3 +3000:2148:1:90:5059:5059L:0.505990f:0.505990 +3000:2149:4:909:5094:5094L:909.509f:909.509 +3000:2150:3:907:5009:5009L:2150.3f:2150.3 +3000:2151:2:90:5078:5078L:3.2f:3.2 +3000:2152:3:90:5001:5001L:3.6f:3.6 +3000:2153:1:90:5035:5035L:0.503590f:0.503590 +3000:2154:5:905:5047:5047L:905.504f:905.504 +3000:2155:4:900:5084:5084L:2155.4f:2155.4 +3000:2156:2:90:5040:5040L:4.2f:4.2 +3000:2157:5:90:5073:5073L:5.8f:5.8 +3000:2158:1:90:5031:5031L:0.503190f:0.503190 +3000:2159:4:907:5015:5015L:907.501f:907.501 +3000:2160:4:901:5087:5087L:2160.4f:2160.4 +3000:2161:4:90:5014:5014L:3.4f:3.4 +3000:2162:3:91:5076:5076L:3.0f:3.0 +3000:2163:3:90:5018:5018L:0.501890f:0.501890 +3000:2164:5:910:5068:5068L:910.506f:910.506 +3000:2165:2:906:5075:5075L:2165.2f:2165.2 +3000:2166:2:90:5020:5020L:0.2f:0.2 +3000:2167:4:90:5094:5094L:4.9f:4.9 +3000:2168:2:91:5085:5085L:0.508591f:0.508591 +3000:2169:4:908:5053:5053L:908.505f:908.505 +3000:2170:5:904:5066:5066L:2170.5f:2170.5 +3000:2171:4:90:5000:5000L:2.4f:2.4 +3000:2172:5:90:5094:5094L:5.8f:5.8 +3000:2173:3:90:5002:5002L:0.500290f:0.500290 +3000:2174:4:902:5000:5000L:902.500f:902.500 +3000:2175:3:907:5063:5063L:2175.3f:2175.3 +3000:2176:2:90:5063:5063L:9.2f:9.2 +3000:2177:3:90:5045:5045L:3.5f:3.5 +3000:2178:2:90:5044:5044L:0.504490f:0.504490 +3000:2179:1:906:5018:5018L:906.501f:906.501 +3000:2180:4:904:5061:5061L:2180.4f:2180.4 +3000:2181:2:90:5082:5082L:0.2f:0.2 +3000:2182:2:90:5059:5059L:2.9f:2.9 +3000:2183:2:90:5093:5093L:0.509390f:0.509390 +3000:2184:2:903:5019:5019L:903.501f:903.501 +3000:2185:2:908:5086:5086L:2185.2f:2185.2 +3000:2186:5:91:5075:5075L:0.5f:0.5 +3000:2187:4:90:5027:5027L:4.3f:4.3 +3000:2188:1:90:5014:5014L:0.501490f:0.501490 +3000:2189:3:909:5070:5070L:909.507f:909.507 +3000:2190:4:906:5007:5007L:2190.4f:2190.4 +3000:2191:2:90:5014:5014L:0.2f:0.2 +3000:2192:1:90:5004:5004L:1.4f:1.4 +3000:2193:4:90:5055:5055L:0.505590f:0.505590 +3000:2194:4:900:5083:5083L:900.508f:900.508 +3000:2195:5:904:5057:5057L:2195.5f:2195.5 +3000:2196:4:90:5051:5051L:4.4f:4.4 +3000:2197:3:90:5087:5087L:3.0f:3.0 +3000:2198:4:90:5057:5057L:0.505790f:0.505790 +3000:2199:5:907:5047:5047L:907.504f:907.504 +3000:2200:3:903:5008:5008L:2200.3f:2200.3 +3000:2201:4:90:5009:5009L:7.4f:7.4 +3000:2202:4:90:5049:5049L:4.8f:4.8 +3000:2203:5:90:5021:5021L:0.502190f:0.502190 +3000:2204:2:901:5029:5029L:901.502f:901.502 +3000:2205:2:900:5074:5074L:2205.2f:2205.2 +3000:2206:4:90:5017:5017L:7.4f:7.4 +3000:2207:2:90:5022:5022L:2.2f:2.2 +3000:2208:1:91:5035:5035L:0.503591f:0.503591 +3000:2209:4:908:5000:5000L:908.500f:908.500 +3000:2210:2:904:5035:5035L:2210.2f:2210.2 +3000:2211:2:90:5001:5001L:0.2f:0.2 +3000:2212:2:90:5081:5081L:2.9f:2.9 +3000:2213:5:90:5032:5032L:0.503290f:0.503290 +3000:2214:1:900:5049:5049L:900.504f:900.504 +3000:2215:2:903:5050:5050L:2215.2f:2215.2 +3000:2216:1:90:5022:5022L:0.1f:0.1 +3000:2217:2:90:5041:5041L:2.3f:2.3 +3000:2218:3:90:5033:5033L:0.503390f:0.503390 +3000:2219:5:902:5012:5012L:902.501f:902.501 +3000:2220:5:904:5051:5051L:2220.5f:2220.5 +3000:2221:2:90:5054:5054L:8.2f:8.2 +3000:2222:2:90:5037:5037L:2.1f:2.1 +3000:2223:1:91:5004:5004L:0.500491f:0.500491 +3000:2224:2:900:5010:5010L:900.501f:900.501 +3000:2225:5:904:5039:5039L:2225.5f:2225.5 +3000:2226:2:90:5045:5045L:6.2f:6.2 +3000:2227:3:90:5081:5081L:3.9f:3.9 +3000:2228:5:90:5033:5033L:0.503390f:0.503390 +3000:2229:2:902:5058:5058L:902.505f:902.505 +3000:2230:3:900:5003:5003L:2230.3f:2230.3 +3000:2231:5:90:5078:5078L:3.5f:3.5 +3000:2232:3:90:5090:5090L:3.5f:3.5 +3000:2233:5:90:5089:5089L:0.508990f:0.508990 +3000:2234:5:910:5096:5096L:910.509f:910.509 +3000:2235:1:908:5040:5040L:2235.1f:2235.1 +3000:2236:2:90:5096:5096L:1.2f:1.2 +3000:2237:5:90:5080:5080L:5.7f:5.7 +3000:2238:4:90:5014:5014L:0.501490f:0.501490 +3000:2239:5:910:5035:5035L:910.503f:910.503 +3000:2240:3:904:5042:5042L:2240.3f:2240.3 +3000:2241:4:90:5072:5072L:3.4f:3.4 +3000:2242:2:90:5023:5023L:2.8f:2.8 +3000:2243:2:90:5080:5080L:0.508090f:0.508090 +3000:2244:1:905:5071:5071L:905.507f:905.507 +3000:2245:1:905:5046:5046L:2245.1f:2245.1 +3000:2246:3:91:5056:5056L:0.3f:0.3 +3000:2247:3:90:5021:5021L:3.8f:3.8 +3000:2248:2:90:5085:5085L:0.508590f:0.508590 +3000:2249:3:904:5079:5079L:904.507f:904.507 +3000:2250:4:910:5015:5015L:2250.4f:2250.4 +3000:2251:1:90:5046:5046L:6.1f:6.1 +3000:2252:5:91:5024:5024L:5.0f:5.0 +3000:2253:1:90:5089:5089L:0.508990f:0.508990 +3000:2254:5:904:5042:5042L:904.504f:904.504 +3000:2255:4:905:5097:5097L:2255.4f:2255.4 +3000:2256:1:90:5090:5090L:0.1f:0.1 +3000:2257:4:90:5069:5069L:4.5f:4.5 +3000:2258:5:90:5012:5012L:0.501290f:0.501290 +3000:2259:4:902:5055:5055L:902.505f:902.505 +3000:2260:3:910:5053:5053L:2260.3f:2260.3 +3000:2261:4:90:5012:5012L:1.4f:1.4 +3000:2262:1:90:5009:5009L:1.0f:1.0 +3000:2263:2:90:5035:5035L:0.503590f:0.503590 +3000:2264:2:901:5077:5077L:901.507f:901.507 +3000:2265:4:908:5030:5030L:2265.4f:2265.4 +3000:2266:4:90:5036:5036L:9.4f:9.4 +3000:2267:3:90:5089:5089L:3.5f:3.5 +3000:2268:2:90:5068:5068L:0.506890f:0.506890 +3000:2269:2:901:5089:5089L:901.508f:901.508 +3000:2270:5:906:5087:5087L:2270.5f:2270.5 +3000:2271:3:90:5001:5001L:2.3f:2.3 +3000:2272:3:90:5007:5007L:3.4f:3.4 +3000:2273:4:90:5027:5027L:0.502790f:0.502790 +3000:2274:5:900:5039:5039L:900.503f:900.503 +3000:2275:4:907:5014:5014L:2275.4f:2275.4 +3000:2276:1:90:5000:5000L:3.1f:3.1 +3000:2277:3:90:5051:5051L:3.9f:3.9 +3000:2278:2:90:5090:5090L:0.509090f:0.509090 +3000:2279:5:904:5000:5000L:904.500f:904.500 +3000:2280:5:903:5061:5061L:2280.5f:2280.5 +3000:2281:4:90:5089:5089L:7.4f:7.4 +3000:2282:4:90:5027:5027L:4.2f:4.2 +3000:2283:5:90:5002:5002L:0.500290f:0.500290 +3000:2284:1:909:5002:5002L:909.500f:909.500 +3000:2285:3:907:5070:5070L:2285.3f:2285.3 +3000:2286:4:90:5001:5001L:7.4f:7.4 +3000:2287:4:90:5086:5086L:4.1f:4.1 +3000:2288:1:90:5093:5093L:0.509390f:0.509390 +3000:2289:1:904:5033:5033L:904.503f:904.503 +3000:2290:1:903:5063:5063L:2290.1f:2290.1 +3000:2291:4:90:5034:5034L:0.4f:0.4 +3000:2292:3:90:5060:5060L:3.8f:3.8 +3000:2293:5:90:5050:5050L:0.505090f:0.505090 +3000:2294:5:907:5040:5040L:907.504f:907.504 +3000:2295:5:902:5004:5004L:2295.5f:2295.5 +3000:2296:3:90:5076:5076L:9.3f:9.3 +3000:2297:3:90:5089:5089L:3.5f:3.5 +3000:2298:3:90:5032:5032L:0.503290f:0.503290 +3000:2299:2:907:5074:5074L:907.507f:907.507 +3000:2300:4:907:5002:5002L:2300.4f:2300.4 +3000:2301:2:90:5004:5004L:4.2f:4.2 +3000:2302:4:91:5083:5083L:4.0f:4.0 +3000:2303:2:90:5044:5044L:0.504490f:0.504490 +3000:2304:4:906:5015:5015L:906.501f:906.501 +3000:2305:1:904:5035:5035L:2305.1f:2305.1 +3000:2306:2:91:5018:5018L:0.2f:0.2 +3000:2307:5:90:5066:5066L:5.6f:5.6 +3000:2308:5:90:5028:5028L:0.502890f:0.502890 +3000:2309:1:904:5096:5096L:904.509f:904.509 +3000:2310:5:900:5068:5068L:2310.5f:2310.5 +3000:2311:5:90:5006:5006L:4.5f:4.5 +3000:2312:5:90:5099:5099L:5.0f:5.0 +3000:2313:5:90:5072:5072L:0.507290f:0.507290 +3000:2314:2:901:5029:5029L:901.502f:901.502 +3000:2315:3:902:5073:5073L:2315.3f:2315.3 +3000:2316:4:90:5073:5073L:5.4f:5.4 +3000:2317:5:90:5030:5030L:5.5f:5.5 +3000:2318:4:90:5031:5031L:0.503190f:0.503190 +3000:2319:5:905:5068:5068L:905.506f:905.506 +3000:2320:5:904:5074:5074L:2320.5f:2320.5 +3000:2321:3:90:5012:5012L:4.3f:4.3 +3000:2322:4:90:5017:5017L:4.4f:4.4 +3000:2323:3:90:5049:5049L:0.504990f:0.504990 +3000:2324:2:905:5058:5058L:905.505f:905.505 +3000:2325:4:909:5085:5085L:2325.4f:2325.4 +3000:2326:2:90:5032:5032L:7.2f:7.2 +3000:2327:1:90:5078:5078L:1.7f:1.7 +3000:2328:2:90:5010:5010L:0.501090f:0.501090 +3000:2329:4:901:5062:5062L:901.506f:901.506 +3000:2330:2:900:5006:5006L:2330.2f:2330.2 +3000:2331:1:90:5045:5045L:6.1f:6.1 +3000:2332:2:90:5085:5085L:2.2f:2.2 +3000:2333:2:90:5006:5006L:0.500690f:0.500690 +3000:2334:5:900:5055:5055L:900.505f:900.505 +3000:2335:3:907:5046:5046L:2335.3f:2335.3 +3000:2336:2:90:5014:5014L:0.2f:0.2 +3000:2337:4:90:5079:5079L:4.0f:4.0 +3000:2338:3:90:5004:5004L:0.500490f:0.500490 +3000:2339:3:901:5021:5021L:901.502f:901.502 +3000:2340:1:905:5025:5025L:2340.1f:2340.1 +3000:2341:2:90:5083:5083L:6.2f:6.2 +3000:2342:4:90:5001:5001L:4.8f:4.8 +3000:2343:3:90:5079:5079L:0.507990f:0.507990 +3000:2344:3:900:5088:5088L:900.508f:900.508 +3000:2345:1:905:5057:5057L:2345.1f:2345.1 +3000:2346:3:90:5059:5059L:8.3f:8.3 +3000:2347:4:90:5068:5068L:4.4f:4.4 +3000:2348:3:90:5012:5012L:0.501290f:0.501290 +3000:2349:3:903:5024:5024L:903.502f:903.502 +3000:2350:4:905:5072:5072L:2350.4f:2350.4 +3000:2351:1:90:5028:5028L:7.1f:7.1 +3000:2352:5:90:5006:5006L:5.3f:5.3 +3000:2353:5:90:5023:5023L:0.502390f:0.502390 +3000:2354:4:904:5028:5028L:904.502f:904.502 +3000:2355:3:905:5079:5079L:2355.3f:2355.3 +3000:2356:1:90:5060:5060L:1.1f:1.1 +3000:2357:4:90:5003:5003L:4.9f:4.9 +3000:2358:2:90:5089:5089L:0.508990f:0.508990 +3000:2359:3:909:5024:5024L:909.502f:909.502 +3000:2360:4:907:5074:5074L:2360.4f:2360.4 +3000:2361:3:90:5043:5043L:7.3f:7.3 +3000:2362:4:90:5079:5079L:4.5f:4.5 +3000:2363:4:90:5064:5064L:0.506490f:0.506490 +3000:2364:1:900:5005:5005L:900.500f:900.500 +3000:2365:2:906:5059:5059L:2365.2f:2365.2 +3000:2366:1:90:5071:5071L:7.1f:7.1 +3000:2367:4:90:5054:5054L:4.3f:4.3 +3000:2368:4:90:5088:5088L:0.508890f:0.508890 +3000:2369:4:901:5076:5076L:901.507f:901.507 +3000:2370:5:909:5042:5042L:2370.5f:2370.5 +3000:2371:4:90:5009:5009L:3.4f:3.4 +3000:2372:1:90:5062:5062L:1.0f:1.0 +3000:2373:5:90:5001:5001L:0.500190f:0.500190 +3000:2374:3:910:5005:5005L:910.500f:910.500 +3000:2375:3:902:5062:5062L:2375.3f:2375.3 +3000:2376:1:90:5027:5027L:3.1f:3.1 +3000:2377:5:90:5062:5062L:5.0f:5.0 +3000:2378:2:90:5031:5031L:0.503190f:0.503190 +3000:2379:2:904:5049:5049L:904.504f:904.504 +3000:2380:5:903:5039:5039L:2380.5f:2380.5 +3000:2381:3:91:5075:5075L:0.3f:0.3 +3000:2382:3:91:5084:5084L:3.0f:3.0 +3000:2383:1:90:5073:5073L:0.507390f:0.507390 +3000:2384:1:902:5065:5065L:902.506f:902.506 +3000:2385:1:908:5089:5089L:2385.1f:2385.1 +3000:2386:4:91:5024:5024L:0.4f:0.4 +3000:2387:1:90:5030:5030L:1.8f:1.8 +3000:2388:4:90:5011:5011L:0.501190f:0.501190 +3000:2389:5:903:5056:5056L:903.505f:903.505 +3000:2390:3:903:5088:5088L:2390.3f:2390.3 +3000:2391:5:90:5081:5081L:7.5f:7.5 +3000:2392:4:90:5078:5078L:4.2f:4.2 +3000:2393:3:90:5058:5058L:0.505890f:0.505890 +3000:2394:1:904:5086:5086L:904.508f:904.508 +3000:2395:5:906:5065:5065L:2395.5f:2395.5 +3000:2396:4:90:5057:5057L:4.4f:4.4 +3000:2397:5:90:5030:5030L:5.5f:5.5 +3000:2398:2:90:5039:5039L:0.503990f:0.503990 +3000:2399:2:902:5072:5072L:902.507f:902.507 +3000:2400:5:907:5002:5002L:2400.5f:2400.5 +3000:2401:5:90:5073:5073L:6.5f:6.5 +3000:2402:4:90:5094:5094L:4.1f:4.1 +3000:2403:2:90:5026:5026L:0.502690f:0.502690 +3000:2404:5:909:5072:5072L:909.507f:909.507 +3000:2405:5:907:5035:5035L:2405.5f:2405.5 +3000:2406:3:90:5078:5078L:4.3f:4.3 +3000:2407:1:90:5029:5029L:1.4f:1.4 +3000:2408:2:90:5049:5049L:0.504990f:0.504990 +3000:2409:4:900:5068:5068L:900.506f:900.506 +3000:2410:3:910:5036:5036L:2410.3f:2410.3 +3000:2411:3:90:5092:5092L:8.3f:8.3 +3000:2412:2:90:5009:5009L:2.4f:2.4 +3000:2413:1:90:5074:5074L:0.507490f:0.507490 +3000:2414:3:908:5057:5057L:908.505f:908.505 +3000:2415:1:906:5024:5024L:2415.1f:2415.1 +3000:2416:3:90:5065:5065L:0.3f:0.3 +3000:2417:2:90:5002:5002L:2.1f:2.1 +3000:2418:3:90:5068:5068L:0.506890f:0.506890 +3000:2419:1:902:5070:5070L:902.507f:902.507 +3000:2420:4:907:5066:5066L:2420.4f:2420.4 +3000:2421:1:90:5043:5043L:1.1f:1.1 +3000:2422:5:90:5083:5083L:5.3f:5.3 +3000:2423:1:90:5060:5060L:0.506090f:0.506090 +3000:2424:5:909:5036:5036L:909.503f:909.503 +3000:2425:2:900:5094:5094L:2425.2f:2425.2 +3000:2426:4:90:5100:5100L:5.4f:5.4 +3000:2427:2:90:5010:5010L:2.8f:2.8 +3000:2428:2:90:5055:5055L:0.505590f:0.505590 +3000:2429:5:903:5074:5074L:903.507f:903.507 +3000:2430:4:900:5038:5038L:2430.4f:2430.4 +3000:2431:2:90:5050:5050L:1.2f:1.2 +3000:2432:4:90:5083:5083L:4.1f:4.1 +3000:2433:3:90:5030:5030L:0.503090f:0.503090 +3000:2434:2:900:5018:5018L:900.501f:900.501 +3000:2435:3:904:5020:5020L:2435.3f:2435.3 +3000:2436:3:90:5070:5070L:0.3f:0.3 +3000:2437:3:90:5046:5046L:3.3f:3.3 +3000:2438:3:90:5077:5077L:0.507790f:0.507790 +3000:2439:1:906:5011:5011L:906.501f:906.501 +3000:2440:5:903:5017:5017L:2440.5f:2440.5 +3000:2441:2:90:5032:5032L:6.2f:6.2 +3000:2442:4:90:5045:5045L:4.4f:4.4 +3000:2443:3:90:5067:5067L:0.506790f:0.506790 +3000:2444:5:902:5070:5070L:902.507f:902.507 +3000:2445:1:908:5011:5011L:2445.1f:2445.1 +3000:2446:2:90:5015:5015L:2.2f:2.2 +3000:2447:5:90:5048:5048L:5.8f:5.8 +3000:2448:3:90:5010:5010L:0.501090f:0.501090 +3000:2449:2:905:5072:5072L:905.507f:905.507 +3000:2450:2:904:5001:5001L:2450.2f:2450.2 +3000:2451:3:90:5065:5065L:7.3f:7.3 +3000:2452:5:90:5005:5005L:5.4f:5.4 +3000:2453:2:90:5006:5006L:0.500690f:0.500690 +3000:2454:5:909:5028:5028L:909.502f:909.502 +3000:2455:4:910:5005:5005L:2455.4f:2455.4 +3000:2456:4:90:5032:5032L:2.4f:2.4 +3000:2457:5:90:5008:5008L:5.2f:5.2 +3000:2458:2:90:5044:5044L:0.504490f:0.504490 +3000:2459:3:909:5094:5094L:909.509f:909.509 +3000:2460:1:902:5032:5032L:2460.1f:2460.1 +3000:2461:2:90:5097:5097L:7.2f:7.2 +3000:2462:5:90:5038:5038L:5.5f:5.5 +3000:2463:5:90:5038:5038L:0.503890f:0.503890 +3000:2464:5:907:5028:5028L:907.502f:907.502 +3000:2465:2:903:5026:5026L:2465.2f:2465.2 +3000:2466:2:90:5052:5052L:0.2f:0.2 +3000:2467:4:91:5077:5077L:4.0f:4.0 +3000:2468:4:90:5044:5044L:0.504490f:0.504490 +3000:2469:1:908:5032:5032L:908.503f:908.503 +3000:2470:1:910:5051:5051L:2470.1f:2470.1 +3000:2471:3:90:5019:5019L:1.3f:1.3 +3000:2472:2:90:5068:5068L:2.0f:2.0 +3000:2473:4:91:5044:5044L:0.504491f:0.504491 +3000:2474:1:910:5012:5012L:910.501f:910.501 +3000:2475:3:901:5042:5042L:2475.3f:2475.3 +3000:2476:4:90:5046:5046L:5.4f:5.4 +3000:2477:2:90:5039:5039L:2.1f:2.1 +3000:2478:5:90:5068:5068L:0.506890f:0.506890 +3000:2479:3:910:5045:5045L:910.504f:910.504 +3000:2480:4:900:5042:5042L:2480.4f:2480.4 +3000:2481:2:90:5059:5059L:5.2f:5.2 +3000:2482:3:90:5061:5061L:3.9f:3.9 +3000:2483:1:90:5055:5055L:0.505590f:0.505590 +3000:2484:3:908:5046:5046L:908.504f:908.504 +3000:2485:4:901:5064:5064L:2485.4f:2485.4 +3000:2486:1:90:5012:5012L:9.1f:9.1 +3000:2487:3:90:5024:5024L:3.0f:3.0 +3000:2488:5:90:5006:5006L:0.500690f:0.500690 +3000:2489:4:904:5003:5003L:904.500f:904.500 +3000:2490:1:901:5009:5009L:2490.1f:2490.1 +3000:2491:3:90:5056:5056L:4.3f:4.3 +3000:2492:1:90:5040:5040L:1.9f:1.9 +3000:2493:4:91:5099:5099L:0.509991f:0.509991 +3000:2494:2:905:5072:5072L:905.507f:905.507 +3000:2495:4:901:5088:5088L:2495.4f:2495.4 +3000:2496:2:90:5072:5072L:2.2f:2.2 +3000:2497:3:90:5077:5077L:3.9f:3.9 +3000:2498:4:90:5079:5079L:0.507990f:0.507990 +3000:2499:4:904:5022:5022L:904.502f:904.502 +3000:2500:5:905:5038:5038L:2500.5f:2500.5 +3000:2501:5:91:5080:5080L:0.5f:0.5 +3000:2502:3:90:5063:5063L:3.0f:3.0 +3000:2503:5:90:5058:5058L:0.505890f:0.505890 +3000:2504:5:910:5008:5008L:910.500f:910.500 +3000:2505:3:907:5025:5025L:2505.3f:2505.3 +3000:2506:3:90:5052:5052L:0.3f:0.3 +3000:2507:1:90:5034:5034L:1.5f:1.5 +3000:2508:5:90:5010:5010L:0.501090f:0.501090 +3000:2509:4:910:5049:5049L:910.504f:910.504 +3000:2510:5:908:5097:5097L:2510.5f:2510.5 +3000:2511:2:90:5093:5093L:7.2f:7.2 +3000:2512:1:90:5098:5098L:1.1f:1.1 +3000:2513:4:90:5073:5073L:0.507390f:0.507390 +3000:2514:2:909:5072:5072L:909.507f:909.507 +3000:2515:3:905:5041:5041L:2515.3f:2515.3 +3000:2516:4:90:5045:5045L:9.4f:9.4 +3000:2517:1:90:5097:5097L:1.0f:1.0 +3000:2518:3:91:5018:5018L:0.501891f:0.501891 +3000:2519:4:907:5017:5017L:907.501f:907.501 +3000:2520:1:906:5098:5098L:2520.1f:2520.1 +3000:2521:1:91:5069:5069L:0.1f:0.1 +3000:2522:1:90:5086:5086L:1.0f:1.0 +3000:2523:5:90:5089:5089L:0.508990f:0.508990 +3000:2524:4:901:5078:5078L:901.507f:901.507 +3000:2525:3:905:5023:5023L:2525.3f:2525.3 +3000:2526:5:90:5013:5013L:1.5f:1.5 +3000:2527:2:90:5019:5019L:2.3f:2.3 +3000:2528:2:90:5018:5018L:0.501890f:0.501890 +3000:2529:3:904:5088:5088L:904.508f:904.508 +3000:2530:4:906:5050:5050L:2530.4f:2530.4 +3000:2531:3:90:5043:5043L:6.3f:6.3 +3000:2532:2:90:5047:5047L:2.7f:2.7 +3000:2533:1:90:5024:5024L:0.502490f:0.502490 +3000:2534:1:903:5033:5033L:903.503f:903.503 +3000:2535:4:908:5083:5083L:2535.4f:2535.4 +3000:2536:1:90:5098:5098L:6.1f:6.1 +3000:2537:1:90:5030:5030L:1.9f:1.9 +3000:2538:2:90:5013:5013L:0.501390f:0.501390 +3000:2539:3:906:5059:5059L:906.505f:906.505 +3000:2540:3:902:5015:5015L:2540.3f:2540.3 +3000:2541:5:90:5079:5079L:8.5f:8.5 +3000:2542:2:90:5042:5042L:2.0f:2.0 +3000:2543:5:90:5004:5004L:0.500490f:0.500490 +3000:2544:1:902:5037:5037L:902.503f:902.503 +3000:2545:2:900:5013:5013L:2545.2f:2545.2 +3000:2546:1:90:5072:5072L:0.1f:0.1 +3000:2547:1:90:5059:5059L:1.2f:1.2 +3000:2548:3:90:5072:5072L:0.507290f:0.507290 +3000:2549:4:900:5028:5028L:900.502f:900.502 +3000:2550:1:905:5047:5047L:2550.1f:2550.1 +3000:2551:2:90:5024:5024L:4.2f:4.2 +3000:2552:1:90:5030:5030L:1.8f:1.8 +3000:2553:3:90:5050:5050L:0.505090f:0.505090 +3000:2554:3:906:5072:5072L:906.507f:906.507 +3000:2555:5:910:5073:5073L:2555.5f:2555.5 +3000:2556:1:90:5078:5078L:1.1f:1.1 +3000:2557:5:90:5098:5098L:5.3f:5.3 +3000:2558:3:90:5054:5054L:0.505490f:0.505490 +3000:2559:1:904:5063:5063L:904.506f:904.506 +3000:2560:3:906:5012:5012L:2560.3f:2560.3 +3000:2561:5:91:5054:5054L:0.5f:0.5 +3000:2562:1:90:5028:5028L:1.0f:1.0 +3000:2563:3:90:5084:5084L:0.508490f:0.508490 +3000:2564:5:902:5042:5042L:902.504f:902.504 +3000:2565:4:902:5038:5038L:2565.4f:2565.4 +3000:2566:2:90:5054:5054L:3.2f:3.2 +3000:2567:1:90:5087:5087L:1.1f:1.1 +3000:2568:1:90:5066:5066L:0.506690f:0.506690 +3000:2569:4:907:5005:5005L:907.500f:907.500 +3000:2570:2:900:5065:5065L:2570.2f:2570.2 +3000:2571:3:91:5059:5059L:0.3f:0.3 +3000:2572:5:90:5066:5066L:5.0f:5.0 +3000:2573:2:90:5027:5027L:0.502790f:0.502790 +3000:2574:1:904:5049:5049L:904.504f:904.504 +3000:2575:3:900:5069:5069L:2575.3f:2575.3 +3000:2576:5:90:5099:5099L:4.5f:4.5 +3000:2577:3:90:5009:5009L:3.6f:3.6 +3000:2578:2:90:5062:5062L:0.506290f:0.506290 +3000:2579:5:904:5027:5027L:904.502f:904.502 +3000:2580:5:907:5034:5034L:2580.5f:2580.5 +3000:2581:4:90:5029:5029L:1.4f:1.4 +3000:2582:2:90:5036:5036L:2.0f:2.0 +3000:2583:5:90:5087:5087L:0.508790f:0.508790 +3000:2584:1:903:5030:5030L:903.503f:903.503 +3000:2585:4:909:5037:5037L:2585.4f:2585.4 +3000:2586:2:90:5082:5082L:8.2f:8.2 +3000:2587:2:90:5041:5041L:2.1f:2.1 +3000:2588:3:90:5013:5013L:0.501390f:0.501390 +3000:2589:1:904:5052:5052L:904.505f:904.505 +3000:2590:2:904:5019:5019L:2590.2f:2590.2 +3000:2591:4:90:5028:5028L:0.4f:0.4 +3000:2592:5:90:5033:5033L:5.2f:5.2 +3000:2593:2:90:5061:5061L:0.506190f:0.506190 +3000:2594:1:903:5098:5098L:903.509f:903.509 +3000:2595:3:910:5083:5083L:2595.3f:2595.3 +3000:2596:5:90:5056:5056L:3.5f:3.5 +3000:2597:4:90:5071:5071L:4.6f:4.6 +3000:2598:1:90:5014:5014L:0.501490f:0.501490 +3000:2599:1:900:5052:5052L:900.505f:900.505 +3000:2600:4:904:5089:5089L:2600.4f:2600.4 +3000:2601:5:90:5091:5091L:0.5f:0.5 +3000:2602:1:91:5016:5016L:1.0f:1.0 +3000:2603:3:90:5030:5030L:0.503090f:0.503090 +3000:2604:1:905:5061:5061L:905.506f:905.506 +3000:2605:1:910:5056:5056L:2605.1f:2605.1 +3000:2606:5:90:5087:5087L:8.5f:8.5 +3000:2607:3:90:5048:5048L:3.4f:3.4 +3000:2608:1:90:5052:5052L:0.505290f:0.505290 +3000:2609:2:907:5061:5061L:907.506f:907.506 +3000:2610:5:904:5100:5100L:2610.5f:2610.5 +3000:2611:4:90:5004:5004L:3.4f:3.4 +3000:2612:4:90:5003:5003L:4.5f:4.5 +3000:2613:4:91:5033:5033L:0.503391f:0.503391 +3000:2614:1:901:5079:5079L:901.507f:901.507 +3000:2615:4:902:5073:5073L:2615.4f:2615.4 +3000:2616:2:90:5050:5050L:1.2f:1.2 +3000:2617:1:90:5093:5093L:1.6f:1.6 +3000:2618:4:90:5042:5042L:0.504290f:0.504290 +3000:2619:1:901:5010:5010L:901.501f:901.501 +3000:2620:4:910:5050:5050L:2620.4f:2620.4 +3000:2621:4:90:5080:5080L:7.4f:7.4 +3000:2622:4:90:5027:5027L:4.3f:4.3 +3000:2623:5:90:5027:5027L:0.502790f:0.502790 +3000:2624:1:902:5039:5039L:902.503f:902.503 +3000:2625:5:909:5060:5060L:2625.5f:2625.5 +3000:2626:4:90:5074:5074L:1.4f:1.4 +3000:2627:1:90:5034:5034L:1.3f:1.3 +3000:2628:1:91:5013:5013L:0.501391f:0.501391 +3000:2629:3:900:5023:5023L:900.502f:900.502 +3000:2630:4:908:5017:5017L:2630.4f:2630.4 +3000:2631:1:90:5084:5084L:5.1f:5.1 +3000:2632:5:90:5013:5013L:5.3f:5.3 +3000:2633:2:90:5023:5023L:0.502390f:0.502390 +3000:2634:3:903:5043:5043L:903.504f:903.504 +3000:2635:5:902:5033:5033L:2635.5f:2635.5 +3000:2636:3:90:5050:5050L:9.3f:9.3 +3000:2637:1:90:5081:5081L:1.0f:1.0 +3000:2638:3:90:5073:5073L:0.507390f:0.507390 +3000:2639:4:907:5079:5079L:907.507f:907.507 +3000:2640:5:903:5059:5059L:2640.5f:2640.5 +3000:2641:1:90:5012:5012L:4.1f:4.1 +3000:2642:5:90:5045:5045L:5.3f:5.3 +3000:2643:1:90:5060:5060L:0.506090f:0.506090 +3000:2644:2:900:5090:5090L:900.509f:900.509 +3000:2645:4:909:5013:5013L:2645.4f:2645.4 +3000:2646:1:90:5003:5003L:3.1f:3.1 +3000:2647:3:90:5010:5010L:3.5f:3.5 +3000:2648:2:90:5026:5026L:0.502690f:0.502690 +3000:2649:1:907:5094:5094L:907.509f:907.509 +3000:2650:5:906:5024:5024L:2650.5f:2650.5 +3000:2651:3:90:5068:5068L:7.3f:7.3 +3000:2652:3:90:5003:5003L:3.6f:3.6 +3000:2653:1:90:5059:5059L:0.505990f:0.505990 +3000:2654:4:910:5061:5061L:910.506f:910.506 +3000:2655:3:907:5049:5049L:2655.3f:2655.3 +3000:2656:4:90:5083:5083L:7.4f:7.4 +3000:2657:4:90:5035:5035L:4.2f:4.2 +3000:2658:4:90:5041:5041L:0.504190f:0.504190 +3000:2659:1:907:5013:5013L:907.501f:907.501 +3000:2660:5:905:5076:5076L:2660.5f:2660.5 +3000:2661:2:91:5045:5045L:0.2f:0.2 +3000:2662:5:90:5006:5006L:5.6f:5.6 +3000:2663:5:90:5072:5072L:0.507290f:0.507290 +3000:2664:3:902:5066:5066L:902.506f:902.506 +3000:2665:1:908:5032:5032L:2665.1f:2665.1 +3000:2666:4:90:5001:5001L:4.4f:4.4 +3000:2667:3:90:5026:5026L:3.1f:3.1 +3000:2668:5:90:5086:5086L:0.508690f:0.508690 +3000:2669:2:910:5053:5053L:910.505f:910.505 +3000:2670:2:910:5007:5007L:2670.2f:2670.2 +3000:2671:1:90:5007:5007L:2.1f:2.1 +3000:2672:3:90:5065:5065L:3.1f:3.1 +3000:2673:4:90:5024:5024L:0.502490f:0.502490 +3000:2674:2:906:5048:5048L:906.504f:906.504 +3000:2675:1:908:5023:5023L:2675.1f:2675.1 +3000:2676:2:90:5065:5065L:4.2f:4.2 +3000:2677:2:90:5076:5076L:2.9f:2.9 +3000:2678:4:90:5066:5066L:0.506690f:0.506690 +3000:2679:3:910:5062:5062L:910.506f:910.506 +3000:2680:1:903:5056:5056L:2680.1f:2680.1 +3000:2681:1:90:5075:5075L:5.1f:5.1 +3000:2682:1:90:5086:5086L:1.0f:1.0 +3000:2683:5:90:5091:5091L:0.509190f:0.509190 +3000:2684:1:900:5050:5050L:900.505f:900.505 +3000:2685:3:901:5024:5024L:2685.3f:2685.3 +3000:2686:4:90:5064:5064L:5.4f:5.4 +3000:2687:3:90:5050:5050L:3.9f:3.9 +3000:2688:1:90:5019:5019L:0.501990f:0.501990 +3000:2689:5:910:5013:5013L:910.501f:910.501 +3000:2690:3:910:5045:5045L:2690.3f:2690.3 +3000:2691:1:90:5092:5092L:0.1f:0.1 +3000:2692:4:90:5099:5099L:4.2f:4.2 +3000:2693:4:90:5070:5070L:0.507090f:0.507090 +3000:2694:3:900:5079:5079L:900.507f:900.507 +3000:2695:1:906:5092:5092L:2695.1f:2695.1 +3000:2696:2:90:5039:5039L:4.2f:4.2 +3000:2697:5:90:5023:5023L:5.8f:5.8 +3000:2698:3:91:5071:5071L:0.507191f:0.507191 +3000:2699:3:908:5066:5066L:908.506f:908.506 +3000:2700:4:902:5063:5063L:2700.4f:2700.4 +3000:2701:1:90:5069:5069L:2.1f:2.1 +3000:2702:1:90:5092:5092L:1.0f:1.0 +3000:2703:1:90:5095:5095L:0.509590f:0.509590 +3000:2704:4:901:5003:5003L:901.500f:901.500 +3000:2705:3:901:5066:5066L:2705.3f:2705.3 +3000:2706:3:90:5003:5003L:4.3f:4.3 +3000:2707:5:90:5083:5083L:5.3f:5.3 +3000:2708:1:90:5079:5079L:0.507990f:0.507990 +3000:2709:5:903:5058:5058L:903.505f:903.505 +3000:2710:3:900:5082:5082L:2710.3f:2710.3 +3000:2711:1:90:5006:5006L:2.1f:2.1 +3000:2712:4:90:5007:5007L:4.3f:4.3 +3000:2713:4:90:5070:5070L:0.507090f:0.507090 +3000:2714:4:901:5085:5085L:901.508f:901.508 +3000:2715:4:908:5001:5001L:2715.4f:2715.4 +3000:2716:2:90:5046:5046L:2.2f:2.2 +3000:2717:2:90:5081:5081L:2.0f:2.0 +3000:2718:2:90:5055:5055L:0.505590f:0.505590 +3000:2719:1:910:5089:5089L:910.508f:910.508 +3000:2720:3:904:5096:5096L:2720.3f:2720.3 +3000:2721:3:90:5019:5019L:5.3f:5.3 +3000:2722:3:90:5052:5052L:3.3f:3.3 +3000:2723:3:90:5093:5093L:0.509390f:0.509390 +3000:2724:2:907:5010:5010L:907.501f:907.501 +3000:2725:1:904:5084:5084L:2725.1f:2725.1 +3000:2726:1:90:5004:5004L:7.1f:7.1 +3000:2727:3:90:5011:5011L:3.1f:3.1 +3000:2728:2:90:5028:5028L:0.502890f:0.502890 +3000:2729:5:903:5025:5025L:903.502f:903.502 +3000:2730:5:909:5069:5069L:2730.5f:2730.5 +3000:2731:4:90:5022:5022L:3.4f:3.4 +3000:2732:5:90:5055:5055L:5.8f:5.8 +3000:2733:3:90:5058:5058L:0.505890f:0.505890 +3000:2734:2:906:5026:5026L:906.502f:906.502 +3000:2735:3:907:5063:5063L:2735.3f:2735.3 +3000:2736:2:90:5035:5035L:8.2f:8.2 +3000:2737:2:90:5045:5045L:2.3f:2.3 +3000:2738:3:90:5076:5076L:0.507690f:0.507690 +3000:2739:4:906:5007:5007L:906.500f:906.500 +3000:2740:1:904:5098:5098L:2740.1f:2740.1 +3000:2741:4:90:5028:5028L:2.4f:2.4 +3000:2742:5:90:5007:5007L:5.1f:5.1 +3000:2743:3:90:5041:5041L:0.504190f:0.504190 +3000:2744:1:900:5100:5100L:900.510f:900.510 +3000:2745:2:905:5067:5067L:2745.2f:2745.2 +3000:2746:5:90:5044:5044L:9.5f:9.5 +3000:2747:2:90:5079:5079L:2.2f:2.2 +3000:2748:4:90:5050:5050L:0.505090f:0.505090 +3000:2749:3:906:5013:5013L:906.501f:906.501 +3000:2750:3:906:5058:5058L:2750.3f:2750.3 +3000:2751:3:90:5079:5079L:3.3f:3.3 +3000:2752:5:90:5096:5096L:5.2f:5.2 +3000:2753:5:90:5059:5059L:0.505990f:0.505990 +3000:2754:2:909:5062:5062L:909.506f:909.506 +3000:2755:2:902:5015:5015L:2755.2f:2755.2 +3000:2756:5:90:5003:5003L:1.5f:1.5 +3000:2757:3:90:5029:5029L:3.5f:3.5 +3000:2758:2:90:5006:5006L:0.500690f:0.500690 +3000:2759:4:908:5062:5062L:908.506f:908.506 +3000:2760:5:904:5020:5020L:2760.5f:2760.5 +3000:2761:3:91:5051:5051L:0.3f:0.3 +3000:2762:2:90:5078:5078L:2.9f:2.9 +3000:2763:1:90:5055:5055L:0.505590f:0.505590 +3000:2764:4:901:5040:5040L:901.504f:901.504 +3000:2765:2:904:5060:5060L:2765.2f:2765.2 +3000:2766:3:90:5078:5078L:4.3f:4.3 +3000:2767:3:90:5027:5027L:3.9f:3.9 +3000:2768:5:90:5053:5053L:0.505390f:0.505390 +3000:2769:5:908:5032:5032L:908.503f:908.503 +3000:2770:3:907:5071:5071L:2770.3f:2770.3 +3000:2771:4:90:5067:5067L:1.4f:1.4 +3000:2772:2:90:5049:5049L:2.3f:2.3 +3000:2773:1:90:5024:5024L:0.502490f:0.502490 +3000:2774:4:903:5034:5034L:903.503f:903.503 +3000:2775:1:907:5076:5076L:2775.1f:2775.1 +3000:2776:4:90:5018:5018L:3.4f:3.4 +3000:2777:2:90:5004:5004L:2.9f:2.9 +3000:2778:4:90:5012:5012L:0.501290f:0.501290 +3000:2779:1:907:5095:5095L:907.509f:907.509 +3000:2780:3:902:5062:5062L:2780.3f:2780.3 +3000:2781:2:91:5074:5074L:0.2f:0.2 +3000:2782:5:90:5010:5010L:5.2f:5.2 +3000:2783:2:90:5065:5065L:0.506590f:0.506590 +3000:2784:4:910:5098:5098L:910.509f:910.509 +3000:2785:5:910:5071:5071L:2785.5f:2785.5 +3000:2786:4:90:5099:5099L:5.4f:5.4 +3000:2787:5:91:5085:5085L:5.0f:5.0 +3000:2788:5:90:5059:5059L:0.505990f:0.505990 +3000:2789:1:908:5028:5028L:908.502f:908.502 +3000:2790:5:902:5052:5052L:2790.5f:2790.5 +3000:2791:4:90:5052:5052L:5.4f:5.4 +3000:2792:2:90:5079:5079L:2.3f:2.3 +3000:2793:3:90:5010:5010L:0.501090f:0.501090 +3000:2794:1:903:5002:5002L:903.500f:903.500 +3000:2795:1:902:5096:5096L:2795.1f:2795.1 +3000:2796:4:91:5049:5049L:0.4f:0.4 +3000:2797:4:90:5040:5040L:4.8f:4.8 +3000:2798:4:90:5098:5098L:0.509890f:0.509890 +3000:2799:2:908:5073:5073L:908.507f:908.507 +3000:2800:3:908:5099:5099L:2800.3f:2800.3 +3000:2801:1:90:5044:5044L:4.1f:4.1 +3000:2802:3:90:5077:5077L:3.8f:3.8 +3000:2803:2:90:5045:5045L:0.504590f:0.504590 +3000:2804:3:903:5074:5074L:903.507f:903.507 +3000:2805:3:904:5097:5097L:2805.3f:2805.3 +3000:2806:3:90:5090:5090L:1.3f:1.3 +3000:2807:5:91:5070:5070L:5.0f:5.0 +3000:2808:2:90:5043:5043L:0.504390f:0.504390 +3000:2809:2:908:5021:5021L:908.502f:908.502 +3000:2810:1:902:5099:5099L:2810.1f:2810.1 +3000:2811:5:90:5036:5036L:3.5f:3.5 +3000:2812:3:90:5009:5009L:3.9f:3.9 +3000:2813:1:90:5027:5027L:0.502790f:0.502790 +3000:2814:4:906:5057:5057L:906.505f:906.505 +3000:2815:2:900:5094:5094L:2815.2f:2815.2 +3000:2816:2:90:5010:5010L:4.2f:4.2 +3000:2817:2:90:5003:5003L:2.3f:2.3 +3000:2818:5:90:5059:5059L:0.505990f:0.505990 +3000:2819:2:910:5037:5037L:910.503f:910.503 +3000:2820:3:910:5064:5064L:2820.3f:2820.3 +3000:2821:3:91:5093:5093L:0.3f:0.3 +3000:2822:5:90:5074:5074L:5.4f:5.4 +3000:2823:1:90:5089:5089L:0.508990f:0.508990 +3000:2824:2:902:5045:5045L:902.504f:902.504 +3000:2825:5:906:5048:5048L:2825.5f:2825.5 +3000:2826:4:91:5093:5093L:0.4f:0.4 +3000:2827:5:90:5027:5027L:5.2f:5.2 +3000:2828:5:90:5093:5093L:0.509390f:0.509390 +3000:2829:3:905:5087:5087L:905.508f:905.508 +3000:2830:5:901:5082:5082L:2830.5f:2830.5 +3000:2831:3:90:5075:5075L:7.3f:7.3 +3000:2832:3:90:5012:5012L:3.6f:3.6 +3000:2833:1:90:5068:5068L:0.506890f:0.506890 +3000:2834:1:910:5090:5090L:910.509f:910.509 +3000:2835:3:908:5049:5049L:2835.3f:2835.3 +3000:2836:1:90:5044:5044L:6.1f:6.1 +3000:2837:5:90:5064:5064L:5.5f:5.5 +3000:2838:2:90:5079:5079L:0.507990f:0.507990 +3000:2839:1:910:5031:5031L:910.503f:910.503 +3000:2840:1:909:5042:5042L:2840.1f:2840.1 +3000:2841:5:90:5009:5009L:3.5f:3.5 +3000:2842:3:90:5070:5070L:3.8f:3.8 +3000:2843:4:91:5031:5031L:0.503191f:0.503191 +3000:2844:2:900:5023:5023L:900.502f:900.502 +3000:2845:2:906:5000:5000L:2845.2f:2845.2 +3000:2846:4:90:5058:5058L:6.4f:6.4 +3000:2847:2:90:5005:5005L:2.5f:2.5 +3000:2848:5:90:5046:5046L:0.504690f:0.504690 +3000:2849:4:909:5039:5039L:909.503f:909.503 +3000:2850:5:910:5021:5021L:2850.5f:2850.5 +3000:2851:2:90:5056:5056L:8.2f:8.2 +3000:2852:3:90:5036:5036L:3.3f:3.3 +3000:2853:1:90:5036:5036L:0.503690f:0.503690 +3000:2854:3:904:5042:5042L:904.504f:904.504 +3000:2855:4:907:5001:5001L:2855.4f:2855.4 +3000:2856:4:90:5062:5062L:5.4f:5.4 +3000:2857:2:90:5016:5016L:2.7f:2.7 +3000:2858:2:90:5092:5092L:0.509290f:0.509290 +3000:2859:5:901:5083:5083L:901.508f:901.508 +3000:2860:1:901:5075:5075L:2860.1f:2860.1 +3000:2861:3:90:5050:5050L:5.3f:5.3 +3000:2862:5:91:5084:5084L:5.0f:5.0 +3000:2863:2:90:5087:5087L:0.508790f:0.508790 +3000:2864:4:906:5028:5028L:906.502f:906.502 +3000:2865:1:902:5098:5098L:2865.1f:2865.1 +3000:2866:1:91:5043:5043L:0.1f:0.1 +3000:2867:4:90:5009:5009L:4.2f:4.2 +3000:2868:5:90:5061:5061L:0.506190f:0.506190 +3000:2869:5:904:5077:5077L:904.507f:904.507 +3000:2870:4:906:5087:5087L:2870.4f:2870.4 +3000:2871:2:91:5033:5033L:0.2f:0.2 +3000:2872:5:91:5026:5026L:5.0f:5.0 +3000:2873:4:90:5034:5034L:0.503490f:0.503490 +3000:2874:3:910:5089:5089L:910.508f:910.508 +3000:2875:5:901:5013:5013L:2875.5f:2875.5 +3000:2876:5:90:5009:5009L:2.5f:2.5 +3000:2877:2:91:5034:5034L:2.0f:2.0 +3000:2878:2:90:5093:5093L:0.509390f:0.509390 +3000:2879:5:907:5033:5033L:907.503f:907.503 +3000:2880:4:903:5092:5092L:2880.4f:2880.4 +3000:2881:4:90:5092:5092L:7.4f:7.4 +3000:2882:5:90:5088:5088L:5.6f:5.6 +3000:2883:2:90:5017:5017L:0.501790f:0.501790 +3000:2884:3:910:5015:5015L:910.501f:910.501 +3000:2885:3:908:5024:5024L:2885.3f:2885.3 +3000:2886:3:90:5047:5047L:7.3f:7.3 +3000:2887:4:91:5043:5043L:4.0f:4.0 +3000:2888:1:90:5029:5029L:0.502990f:0.502990 +3000:2889:5:903:5099:5099L:903.509f:903.509 +3000:2890:2:900:5031:5031L:2890.2f:2890.2 +3000:2891:1:90:5003:5003L:7.1f:7.1 +3000:2892:1:90:5065:5065L:1.6f:1.6 +3000:2893:5:90:5100:5100L:0.510090f:0.510090 +3000:2894:1:903:5093:5093L:903.509f:903.509 +3000:2895:2:908:5073:5073L:2895.2f:2895.2 +3000:2896:3:90:5037:5037L:4.3f:4.3 +3000:2897:1:90:5029:5029L:1.0f:1.0 +3000:2898:3:90:5059:5059L:0.505990f:0.505990 +3000:2899:4:900:5086:5086L:900.508f:900.508 +3000:2900:4:903:5088:5088L:2900.4f:2900.4 +3000:2901:1:90:5052:5052L:5.1f:5.1 +3000:2902:1:90:5010:5010L:1.6f:1.6 +3000:2903:4:90:5091:5091L:0.509190f:0.509190 +3000:2904:4:907:5027:5027L:907.502f:907.502 +3000:2905:4:910:5007:5007L:2905.4f:2905.4 +3000:2906:2:90:5047:5047L:5.2f:5.2 +3000:2907:4:90:5053:5053L:4.6f:4.6 +3000:2908:1:91:5060:5060L:0.506091f:0.506091 +3000:2909:4:908:5062:5062L:908.506f:908.506 +3000:2910:3:904:5091:5091L:2910.3f:2910.3 +3000:2911:2:90:5038:5038L:5.2f:5.2 +3000:2912:5:90:5096:5096L:5.6f:5.6 +3000:2913:5:90:5051:5051L:0.505190f:0.505190 +3000:2914:5:910:5020:5020L:910.502f:910.502 +3000:2915:1:906:5020:5020L:2915.1f:2915.1 +3000:2916:2:91:5075:5075L:0.2f:0.2 +3000:2917:4:90:5029:5029L:4.7f:4.7 +3000:2918:2:90:5028:5028L:0.502890f:0.502890 +3000:2919:5:903:5001:5001L:903.500f:903.500 +3000:2920:3:909:5046:5046L:2920.3f:2920.3 +3000:2921:2:90:5095:5095L:2.2f:2.2 +3000:2922:4:90:5049:5049L:4.0f:4.0 +3000:2923:4:90:5076:5076L:0.507690f:0.507690 +3000:2924:2:910:5075:5075L:910.507f:910.507 +3000:2925:3:901:5036:5036L:2925.3f:2925.3 +3000:2926:4:90:5034:5034L:3.4f:3.4 +3000:2927:2:90:5005:5005L:2.0f:2.0 +3000:2928:4:90:5080:5080L:0.508090f:0.508090 +3000:2929:5:901:5016:5016L:901.501f:901.501 +3000:2930:5:906:5000:5000L:2930.5f:2930.5 +3000:2931:3:91:5020:5020L:0.3f:0.3 +3000:2932:2:90:5027:5027L:2.7f:2.7 +3000:2933:5:90:5033:5033L:0.503390f:0.503390 +3000:2934:4:906:5028:5028L:906.502f:906.502 +3000:2935:2:900:5039:5039L:2935.2f:2935.2 +3000:2936:4:90:5075:5075L:6.4f:6.4 +3000:2937:1:91:5082:5082L:1.0f:1.0 +3000:2938:1:90:5012:5012L:0.501290f:0.501290 +3000:2939:5:906:5027:5027L:906.502f:906.502 +3000:2940:1:905:5089:5089L:2940.1f:2940.1 +3000:2941:1:91:5087:5087L:0.1f:0.1 +3000:2942:2:90:5059:5059L:2.3f:2.3 +3000:2943:3:90:5000:5000L:0.500090f:0.500090 +3000:2944:5:908:5061:5061L:908.506f:908.506 +3000:2945:1:901:5064:5064L:2945.1f:2945.1 +3000:2946:3:90:5027:5027L:9.3f:9.3 +3000:2947:2:90:5025:5025L:2.9f:2.9 +3000:2948:1:90:5090:5090L:0.509090f:0.509090 +3000:2949:2:910:5047:5047L:910.504f:910.504 +3000:2950:3:910:5000:5000L:2950.3f:2950.3 +3000:2951:2:90:5095:5095L:0.2f:0.2 +3000:2952:2:90:5024:5024L:2.3f:2.3 +3000:2953:5:90:5040:5040L:0.504090f:0.504090 +3000:2954:5:908:5017:5017L:908.501f:908.501 +3000:2955:3:910:5030:5030L:2955.3f:2955.3 +3000:2956:1:90:5015:5015L:5.1f:5.1 +3000:2957:2:90:5006:5006L:2.8f:2.8 +3000:2958:4:90:5008:5008L:0.500890f:0.500890 +3000:2959:3:900:5000:5000L:900.500f:900.500 +3000:2960:5:906:5000:5000L:2960.5f:2960.5 +3000:2961:5:91:5007:5007L:0.5f:0.5 +3000:2962:5:90:5042:5042L:5.2f:5.2 +3000:2963:1:90:5031:5031L:0.503190f:0.503190 +3000:2964:3:910:5008:5008L:910.500f:910.500 +3000:2965:4:904:5000:5000L:2965.4f:2965.4 +3000:2966:1:90:5047:5047L:5.1f:5.1 +3000:2967:2:90:5022:5022L:2.9f:2.9 +3000:2968:2:90:5008:5008L:0.500890f:0.500890 +3000:2969:2:910:5017:5017L:910.501f:910.501 +3000:2970:2:910:5077:5077L:2970.2f:2970.2 +3000:2971:2:91:5076:5076L:0.2f:0.2 +3000:2972:3:91:5000:5000L:3.0f:3.0 +3000:2973:5:90:5009:5009L:0.500990f:0.500990 +3000:2974:1:907:5003:5003L:907.500f:907.500 +3000:2975:2:904:5043:5043L:2975.2f:2975.2 +3000:2976:2:90:5093:5093L:5.2f:5.2 +3000:2977:4:90:5079:5079L:4.7f:4.7 +3000:2978:5:90:5026:5026L:0.502690f:0.502690 +3000:2979:1:904:5026:5026L:904.502f:904.502 +3000:2980:2:908:5024:5024L:2980.2f:2980.2 +3000:2981:5:90:5022:5022L:1.5f:1.5 +3000:2982:4:90:5013:5013L:4.6f:4.6 +3000:2983:4:90:5023:5023L:0.502390f:0.502390 +3000:2984:5:906:5092:5092L:906.509f:906.509 +3000:2985:5:909:5035:5035L:2985.5f:2985.5 +3000:2986:2:90:5086:5086L:1.2f:1.2 +3000:2987:2:90:5059:5059L:2.9f:2.9 +3000:2988:1:90:5060:5060L:0.506090f:0.506090 +3000:2989:2:909:5098:5098L:909.509f:909.509 +3000:2990:3:901:5072:5072L:2990.3f:2990.3 +3000:2991:5:90:5083:5083L:1.5f:1.5 +3000:2992:1:90:5040:5040L:1.9f:1.9 +3000:2993:1:90:5084:5084L:0.508490f:0.508490 +3000:2994:2:905:5047:5047L:905.504f:905.504 +3000:2995:2:903:5036:5036L:2995.2f:2995.2 +3000:2996:4:90:5052:5052L:7.4f:7.4 +3000:2997:3:90:5042:5042L:3.9f:3.9 +3000:2998:1:91:5028:5028L:0.502891f:0.502891 +3000:2999:4:902:5019:5019L:902.501f:902.501 +3000:3000:4:908:5032:5032L:3000.4f:3000.4 +4000:3001:2:90:5045:5045L:6.2f:6.2 +4000:3002:2:90:5032:5032L:2.6f:2.6 +4000:3003:4:90:5095:5095L:0.509590f:0.509590 +4000:3004:3:901:5041:5041L:901.504f:901.504 +4000:3005:5:905:5077:5077L:3005.5f:3005.5 +4000:3006:2:90:5043:5043L:1.2f:1.2 +4000:3007:5:90:5033:5033L:5.7f:5.7 +4000:3008:2:90:5026:5026L:0.502690f:0.502690 +4000:3009:3:905:5049:5049L:905.504f:905.504 +4000:3010:4:902:5028:5028L:3010.4f:3010.4 +4000:3011:1:90:5087:5087L:6.1f:6.1 +4000:3012:3:90:5048:5048L:3.8f:3.8 +4000:3013:5:90:5026:5026L:0.502690f:0.502690 +4000:3014:4:909:5044:5044L:909.504f:909.504 +4000:3015:1:909:5094:5094L:3015.1f:3015.1 +4000:3016:5:90:5009:5009L:1.5f:1.5 +4000:3017:2:91:5078:5078L:2.0f:2.0 +4000:3018:4:90:5058:5058L:0.505890f:0.505890 +4000:3019:5:907:5008:5008L:907.500f:907.500 +4000:3020:3:904:5027:5027L:3020.3f:3020.3 +4000:3021:4:90:5086:5086L:4.4f:4.4 +4000:3022:3:91:5067:5067L:3.0f:3.0 +4000:3023:1:90:5009:5009L:0.500990f:0.500990 +4000:3024:2:905:5100:5100L:905.510f:905.510 +4000:3025:4:907:5082:5082L:3025.4f:3025.4 +4000:3026:4:90:5094:5094L:6.4f:6.4 +4000:3027:4:91:5088:5088L:4.0f:4.0 +4000:3028:3:90:5005:5005L:0.500590f:0.500590 +4000:3029:1:906:5075:5075L:906.507f:906.507 +4000:3030:2:900:5016:5016L:3030.2f:3030.2 +4000:3031:3:90:5061:5061L:8.3f:8.3 +4000:3032:2:90:5054:5054L:2.3f:2.3 +4000:3033:1:90:5028:5028L:0.502890f:0.502890 +4000:3034:1:907:5077:5077L:907.507f:907.507 +4000:3035:1:905:5043:5043L:3035.1f:3035.1 +4000:3036:5:90:5001:5001L:2.5f:2.5 +4000:3037:5:91:5096:5096L:5.0f:5.0 +4000:3038:4:90:5059:5059L:0.505990f:0.505990 +4000:3039:5:907:5017:5017L:907.501f:907.501 +4000:3040:3:910:5019:5019L:3040.3f:3040.3 +4000:3041:4:90:5094:5094L:4.4f:4.4 +4000:3042:2:90:5027:5027L:2.8f:2.8 +4000:3043:5:90:5067:5067L:0.506790f:0.506790 +4000:3044:1:910:5038:5038L:910.503f:910.503 +4000:3045:5:900:5088:5088L:3045.5f:3045.5 +4000:3046:2:90:5006:5006L:0.2f:0.2 +4000:3047:2:90:5004:5004L:2.9f:2.9 +4000:3048:2:90:5059:5059L:0.505990f:0.505990 +4000:3049:5:905:5029:5029L:905.502f:905.502 +4000:3050:1:900:5021:5021L:3050.1f:3050.1 +4000:3051:2:90:5066:5066L:8.2f:8.2 +4000:3052:2:90:5046:5046L:2.0f:2.0 +4000:3053:3:91:5029:5029L:0.502991f:0.502991 +4000:3054:1:900:5025:5025L:900.502f:900.502 +4000:3055:3:910:5033:5033L:3055.3f:3055.3 +4000:3056:3:90:5035:5035L:3.3f:3.3 +4000:3057:3:90:5025:5025L:3.7f:3.7 +4000:3058:3:90:5091:5091L:0.509190f:0.509190 +4000:3059:1:910:5037:5037L:910.503f:910.503 +4000:3060:2:900:5038:5038L:3060.2f:3060.2 +4000:3061:4:90:5011:5011L:3.4f:3.4 +4000:3062:2:90:5017:5017L:2.5f:2.5 +4000:3063:4:90:5009:5009L:0.500990f:0.500990 +4000:3064:1:901:5017:5017L:901.501f:901.501 +4000:3065:2:907:5016:5016L:3065.2f:3065.2 +4000:3066:3:90:5052:5052L:1.3f:1.3 +4000:3067:5:90:5023:5023L:5.6f:5.6 +4000:3068:2:90:5027:5027L:0.502790f:0.502790 +4000:3069:1:902:5022:5022L:902.502f:902.502 +4000:3070:3:906:5026:5026L:3070.3f:3070.3 +4000:3071:5:90:5058:5058L:2.5f:2.5 +4000:3072:5:90:5011:5011L:5.5f:5.5 +4000:3073:1:90:5013:5013L:0.501390f:0.501390 +4000:3074:2:902:5030:5030L:902.503f:902.503 +4000:3075:3:905:5100:5100L:3075.3f:3075.3 +4000:3076:3:90:5010:5010L:0.3f:0.3 +4000:3077:1:90:5068:5068L:1.0f:1.0 +4000:3078:2:90:5077:5077L:0.507790f:0.507790 +4000:3079:4:903:5097:5097L:903.509f:903.509 +4000:3080:5:909:5056:5056L:3080.5f:3080.5 +4000:3081:1:90:5076:5076L:7.1f:7.1 +4000:3082:4:90:5023:5023L:4.7f:4.7 +4000:3083:4:90:5042:5042L:0.504290f:0.504290 +4000:3084:5:901:5062:5062L:901.506f:901.506 +4000:3085:2:905:5009:5009L:3085.2f:3085.2 +4000:3086:2:90:5015:5015L:1.2f:1.2 +4000:3087:2:90:5017:5017L:2.2f:2.2 +4000:3088:5:90:5041:5041L:0.504190f:0.504190 +4000:3089:4:902:5077:5077L:902.507f:902.507 +4000:3090:4:900:5061:5061L:3090.4f:3090.4 +4000:3091:2:90:5032:5032L:1.2f:1.2 +4000:3092:1:90:5002:5002L:1.8f:1.8 +4000:3093:2:90:5089:5089L:0.508990f:0.508990 +4000:3094:4:905:5000:5000L:905.500f:905.500 +4000:3095:2:907:5054:5054L:3095.2f:3095.2 +4000:3096:3:91:5068:5068L:0.3f:0.3 +4000:3097:3:90:5092:5092L:3.2f:3.2 +4000:3098:4:90:5049:5049L:0.504990f:0.504990 +4000:3099:1:900:5067:5067L:900.506f:900.506 +4000:3100:5:908:5068:5068L:3100.5f:3100.5 +4000:3101:3:90:5079:5079L:0.3f:0.3 +4000:3102:5:90:5057:5057L:5.1f:5.1 +4000:3103:5:90:5014:5014L:0.501490f:0.501490 +4000:3104:4:900:5063:5063L:900.506f:900.506 +4000:3105:4:904:5035:5035L:3105.4f:3105.4 +4000:3106:2:90:5028:5028L:9.2f:9.2 +4000:3107:5:90:5053:5053L:5.4f:5.4 +4000:3108:5:90:5077:5077L:0.507790f:0.507790 +4000:3109:2:903:5079:5079L:903.507f:903.507 +4000:3110:1:902:5053:5053L:3110.1f:3110.1 +4000:3111:4:90:5057:5057L:8.4f:8.4 +4000:3112:3:90:5067:5067L:3.6f:3.6 +4000:3113:1:90:5004:5004L:0.500490f:0.500490 +4000:3114:2:903:5013:5013L:903.501f:903.501 +4000:3115:5:900:5055:5055L:3115.5f:3115.5 +4000:3116:2:90:5038:5038L:4.2f:4.2 +4000:3117:3:90:5079:5079L:3.4f:3.4 +4000:3118:1:90:5095:5095L:0.509590f:0.509590 +4000:3119:4:907:5026:5026L:907.502f:907.502 +4000:3120:3:907:5050:5050L:3120.3f:3120.3 +4000:3121:1:90:5028:5028L:5.1f:5.1 +4000:3122:4:91:5092:5092L:4.0f:4.0 +4000:3123:2:90:5043:5043L:0.504390f:0.504390 +4000:3124:2:903:5072:5072L:903.507f:903.507 +4000:3125:3:902:5078:5078L:3125.3f:3125.3 +4000:3126:1:90:5015:5015L:4.1f:4.1 +4000:3127:3:91:5052:5052L:3.0f:3.0 +4000:3128:2:91:5079:5079L:0.507991f:0.507991 +4000:3129:1:908:5045:5045L:908.504f:908.504 +4000:3130:3:903:5017:5017L:3130.3f:3130.3 +4000:3131:5:90:5063:5063L:4.5f:4.5 +4000:3132:2:90:5062:5062L:2.1f:2.1 +4000:3133:1:90:5072:5072L:0.507290f:0.507290 +4000:3134:3:909:5004:5004L:909.500f:909.500 +4000:3135:2:904:5025:5025L:3135.2f:3135.2 +4000:3136:1:90:5068:5068L:5.1f:5.1 +4000:3137:2:91:5060:5060L:2.0f:2.0 +4000:3138:4:90:5055:5055L:0.505590f:0.505590 +4000:3139:3:904:5029:5029L:904.502f:904.502 +4000:3140:5:909:5062:5062L:3140.5f:3140.5 +4000:3141:1:90:5004:5004L:8.1f:8.1 +4000:3142:4:90:5016:5016L:4.0f:4.0 +4000:3143:3:90:5063:5063L:0.506390f:0.506390 +4000:3144:1:907:5048:5048L:907.504f:907.504 +4000:3145:1:900:5087:5087L:3145.1f:3145.1 +4000:3146:3:90:5033:5033L:0.3f:0.3 +4000:3147:1:90:5026:5026L:1.3f:1.3 +4000:3148:4:90:5044:5044L:0.504490f:0.504490 +4000:3149:2:906:5082:5082L:906.508f:906.508 +4000:3150:3:905:5064:5064L:3150.3f:3150.3 +4000:3151:1:90:5041:5041L:7.1f:7.1 +4000:3152:1:90:5041:5041L:1.5f:1.5 +4000:3153:2:90:5056:5056L:0.505690f:0.505690 +4000:3154:5:910:5028:5028L:910.502f:910.502 +4000:3155:3:901:5029:5029L:3155.3f:3155.3 +4000:3156:2:90:5036:5036L:6.2f:6.2 +4000:3157:4:90:5066:5066L:4.7f:4.7 +4000:3158:5:90:5069:5069L:0.506990f:0.506990 +4000:3159:2:906:5025:5025L:906.502f:906.502 +4000:3160:1:901:5080:5080L:3160.1f:3160.1 +4000:3161:5:90:5049:5049L:2.5f:2.5 +4000:3162:2:90:5097:5097L:2.5f:2.5 +4000:3163:4:90:5084:5084L:0.508490f:0.508490 +4000:3164:2:908:5083:5083L:908.508f:908.508 +4000:3165:3:902:5099:5099L:3165.3f:3165.3 +4000:3166:4:90:5056:5056L:6.4f:6.4 +4000:3167:1:90:5021:5021L:1.3f:1.3 +4000:3168:5:90:5056:5056L:0.505690f:0.505690 +4000:3169:3:906:5015:5015L:906.501f:906.501 +4000:3170:4:908:5027:5027L:3170.4f:3170.4 +4000:3171:3:90:5053:5053L:6.3f:6.3 +4000:3172:1:90:5100:5100L:1.9f:1.9 +4000:3173:1:90:5082:5082L:0.508290f:0.508290 +4000:3174:5:908:5062:5062L:908.506f:908.506 +4000:3175:4:902:5089:5089L:3175.4f:3175.4 +4000:3176:4:90:5049:5049L:0.4f:0.4 +4000:3177:2:90:5077:5077L:2.2f:2.2 +4000:3178:3:90:5099:5099L:0.509990f:0.509990 +4000:3179:5:905:5058:5058L:905.505f:905.505 +4000:3180:1:903:5037:5037L:3180.1f:3180.1 +4000:3181:3:90:5100:5100L:9.3f:9.3 +4000:3182:5:90:5087:5087L:5.9f:5.9 +4000:3183:5:90:5040:5040L:0.504090f:0.504090 +4000:3184:4:908:5014:5014L:908.501f:908.501 +4000:3185:2:904:5039:5039L:3185.2f:3185.2 +4000:3186:2:90:5044:5044L:0.2f:0.2 +4000:3187:4:90:5065:5065L:4.3f:4.3 +4000:3188:3:90:5067:5067L:0.506790f:0.506790 +4000:3189:3:907:5020:5020L:907.502f:907.502 +4000:3190:1:909:5049:5049L:3190.1f:3190.1 +4000:3191:3:90:5033:5033L:2.3f:2.3 +4000:3192:3:90:5022:5022L:3.2f:3.2 +4000:3193:2:90:5011:5011L:0.501190f:0.501190 +4000:3194:4:909:5085:5085L:909.508f:909.508 +4000:3195:5:902:5025:5025L:3195.5f:3195.5 +4000:3196:2:90:5032:5032L:5.2f:5.2 +4000:3197:4:90:5060:5060L:4.2f:4.2 +4000:3198:2:90:5031:5031L:0.503190f:0.503190 +4000:3199:1:902:5000:5000L:902.500f:902.500 +4000:3200:2:903:5085:5085L:3200.2f:3200.2 +4000:3201:4:90:5009:5009L:8.4f:8.4 +4000:3202:1:90:5028:5028L:1.2f:1.2 +4000:3203:2:90:5040:5040L:0.504090f:0.504090 +4000:3204:2:902:5026:5026L:902.502f:902.502 +4000:3205:2:901:5049:5049L:3205.2f:3205.2 +4000:3206:3:90:5098:5098L:4.3f:4.3 +4000:3207:5:90:5020:5020L:5.0f:5.0 +4000:3208:3:90:5096:5096L:0.509690f:0.509690 +4000:3209:4:904:5020:5020L:904.502f:904.502 +4000:3210:4:907:5053:5053L:3210.4f:3210.4 +4000:3211:3:90:5031:5031L:4.3f:4.3 +4000:3212:4:90:5054:5054L:4.4f:4.4 +4000:3213:5:90:5008:5008L:0.500890f:0.500890 +4000:3214:2:900:5034:5034L:900.503f:900.503 +4000:3215:4:903:5046:5046L:3215.4f:3215.4 +4000:3216:1:90:5083:5083L:8.1f:8.1 +4000:3217:1:90:5090:5090L:1.6f:1.6 +4000:3218:2:90:5031:5031L:0.503190f:0.503190 +4000:3219:2:908:5074:5074L:908.507f:908.507 +4000:3220:3:905:5039:5039L:3220.3f:3220.3 +4000:3221:5:90:5076:5076L:0.5f:0.5 +4000:3222:2:90:5017:5017L:2.8f:2.8 +4000:3223:5:90:5086:5086L:0.508690f:0.508690 +4000:3224:5:900:5094:5094L:900.509f:900.509 +4000:3225:2:907:5024:5024L:3225.2f:3225.2 +4000:3226:4:90:5004:5004L:8.4f:8.4 +4000:3227:3:90:5066:5066L:3.9f:3.9 +4000:3228:3:90:5070:5070L:0.507090f:0.507090 +4000:3229:4:904:5046:5046L:904.504f:904.504 +4000:3230:3:909:5096:5096L:3230.3f:3230.3 +4000:3231:5:90:5003:5003L:8.5f:8.5 +4000:3232:4:90:5080:5080L:4.0f:4.0 +4000:3233:5:91:5052:5052L:0.505291f:0.505291 +4000:3234:4:909:5059:5059L:909.505f:909.505 +4000:3235:3:900:5027:5027L:3235.3f:3235.3 +4000:3236:5:90:5006:5006L:8.5f:8.5 +4000:3237:5:90:5093:5093L:5.3f:5.3 +4000:3238:3:90:5007:5007L:0.500790f:0.500790 +4000:3239:2:906:5046:5046L:906.504f:906.504 +4000:3240:4:900:5028:5028L:3240.4f:3240.4 +4000:3241:4:91:5008:5008L:0.4f:0.4 +4000:3242:4:90:5017:5017L:4.6f:4.6 +4000:3243:3:90:5009:5009L:0.500990f:0.500990 +4000:3244:1:900:5093:5093L:900.509f:900.509 +4000:3245:3:906:5001:5001L:3245.3f:3245.3 +4000:3246:5:90:5082:5082L:4.5f:4.5 +4000:3247:5:90:5017:5017L:5.3f:5.3 +4000:3248:5:90:5098:5098L:0.509890f:0.509890 +4000:3249:5:901:5054:5054L:901.505f:901.505 +4000:3250:2:908:5059:5059L:3250.2f:3250.2 +4000:3251:4:90:5051:5051L:4.4f:4.4 +4000:3252:4:90:5007:5007L:4.1f:4.1 +4000:3253:5:90:5043:5043L:0.504390f:0.504390 +4000:3254:1:906:5045:5045L:906.504f:906.504 +4000:3255:5:902:5005:5005L:3255.5f:3255.5 +4000:3256:5:90:5050:5050L:0.5f:0.5 +4000:3257:4:91:5082:5082L:4.0f:4.0 +4000:3258:5:90:5068:5068L:0.506890f:0.506890 +4000:3259:5:908:5078:5078L:908.507f:908.507 +4000:3260:3:901:5057:5057L:3260.3f:3260.3 +4000:3261:1:90:5001:5001L:8.1f:8.1 +4000:3262:3:90:5013:5013L:3.6f:3.6 +4000:3263:4:90:5076:5076L:0.507690f:0.507690 +4000:3264:1:905:5037:5037L:905.503f:905.503 +4000:3265:3:904:5057:5057L:3265.3f:3265.3 +4000:3266:3:90:5064:5064L:4.3f:4.3 +4000:3267:1:90:5062:5062L:1.1f:1.1 +4000:3268:5:90:5045:5045L:0.504590f:0.504590 +4000:3269:3:910:5020:5020L:910.502f:910.502 +4000:3270:2:904:5033:5033L:3270.2f:3270.2 +4000:3271:5:90:5013:5013L:5.5f:5.5 +4000:3272:5:90:5069:5069L:5.0f:5.0 +4000:3273:1:90:5016:5016L:0.501690f:0.501690 +4000:3274:5:908:5065:5065L:908.506f:908.506 +4000:3275:1:903:5007:5007L:3275.1f:3275.1 +4000:3276:4:90:5044:5044L:9.4f:9.4 +4000:3277:2:91:5057:5057L:2.0f:2.0 +4000:3278:1:90:5064:5064L:0.506490f:0.506490 +4000:3279:3:904:5063:5063L:904.506f:904.506 +4000:3280:4:907:5008:5008L:3280.4f:3280.4 +4000:3281:5:90:5059:5059L:6.5f:6.5 +4000:3282:1:90:5065:5065L:1.5f:1.5 +4000:3283:5:90:5034:5034L:0.503490f:0.503490 +4000:3284:5:904:5010:5010L:904.501f:904.501 +4000:3285:4:906:5039:5039L:3285.4f:3285.4 +4000:3286:4:90:5024:5024L:3.4f:3.4 +4000:3287:1:90:5016:5016L:1.7f:1.7 +4000:3288:4:90:5098:5098L:0.509890f:0.509890 +4000:3289:2:901:5035:5035L:901.503f:901.503 +4000:3290:5:909:5006:5006L:3290.5f:3290.5 +4000:3291:1:90:5069:5069L:9.1f:9.1 +4000:3292:4:91:5023:5023L:4.0f:4.0 +4000:3293:2:90:5083:5083L:0.508390f:0.508390 +4000:3294:4:908:5024:5024L:908.502f:908.502 +4000:3295:4:903:5083:5083L:3295.4f:3295.4 +4000:3296:1:90:5016:5016L:0.1f:0.1 +4000:3297:2:90:5089:5089L:2.1f:2.1 +4000:3298:3:90:5061:5061L:0.506190f:0.506190 +4000:3299:3:902:5079:5079L:902.507f:902.507 +4000:3300:5:901:5062:5062L:3300.5f:3300.5 +4000:3301:5:90:5045:5045L:2.5f:2.5 +4000:3302:4:90:5039:5039L:4.9f:4.9 +4000:3303:5:90:5016:5016L:0.501690f:0.501690 +4000:3304:4:908:5090:5090L:908.509f:908.509 +4000:3305:5:905:5025:5025L:3305.5f:3305.5 +4000:3306:4:90:5030:5030L:6.4f:6.4 +4000:3307:5:91:5048:5048L:5.0f:5.0 +4000:3308:4:90:5035:5035L:0.503590f:0.503590 +4000:3309:2:900:5056:5056L:900.505f:900.505 +4000:3310:1:909:5073:5073L:3310.1f:3310.1 +4000:3311:5:90:5096:5096L:8.5f:8.5 +4000:3312:2:90:5083:5083L:2.4f:2.4 +4000:3313:4:90:5098:5098L:0.509890f:0.509890 +4000:3314:5:910:5075:5075L:910.507f:910.507 +4000:3315:4:909:5026:5026L:3315.4f:3315.4 +4000:3316:5:90:5089:5089L:6.5f:6.5 +4000:3317:2:90:5088:5088L:2.5f:2.5 +4000:3318:4:90:5038:5038L:0.503890f:0.503890 +4000:3319:1:906:5040:5040L:906.504f:906.504 +4000:3320:4:908:5027:5027L:3320.4f:3320.4 +4000:3321:2:90:5007:5007L:6.2f:6.2 +4000:3322:2:90:5048:5048L:2.9f:2.9 +4000:3323:1:90:5073:5073L:0.507390f:0.507390 +4000:3324:1:903:5065:5065L:903.506f:903.506 +4000:3325:5:910:5049:5049L:3325.5f:3325.5 +4000:3326:1:91:5005:5005L:0.1f:0.1 +4000:3327:1:90:5052:5052L:1.2f:1.2 +4000:3328:5:91:5076:5076L:0.507691f:0.507691 +4000:3329:2:900:5039:5039L:900.503f:900.503 +4000:3330:4:907:5019:5019L:3330.4f:3330.4 +4000:3331:5:90:5081:5081L:0.5f:0.5 +4000:3332:1:90:5066:5066L:1.3f:1.3 +4000:3333:3:90:5015:5015L:0.501590f:0.501590 +4000:3334:2:906:5045:5045L:906.504f:906.504 +4000:3335:5:905:5045:5045L:3335.5f:3335.5 +4000:3336:2:90:5039:5039L:7.2f:7.2 +4000:3337:3:90:5059:5059L:3.7f:3.7 +4000:3338:5:90:5051:5051L:0.505190f:0.505190 +4000:3339:4:909:5052:5052L:909.505f:909.505 +4000:3340:1:905:5016:5016L:3340.1f:3340.1 +4000:3341:2:90:5018:5018L:5.2f:5.2 +4000:3342:1:90:5053:5053L:1.5f:1.5 +4000:3343:4:90:5003:5003L:0.500390f:0.500390 +4000:3344:5:902:5067:5067L:902.506f:902.506 +4000:3345:2:901:5017:5017L:3345.2f:3345.2 +4000:3346:5:90:5083:5083L:5.5f:5.5 +4000:3347:2:91:5051:5051L:2.0f:2.0 +4000:3348:4:90:5008:5008L:0.500890f:0.500890 +4000:3349:2:906:5094:5094L:906.509f:906.509 +4000:3350:5:907:5047:5047L:3350.5f:3350.5 +4000:3351:5:91:5096:5096L:0.5f:0.5 +4000:3352:1:90:5047:5047L:1.0f:1.0 +4000:3353:4:90:5050:5050L:0.505090f:0.505090 +4000:3354:4:908:5076:5076L:908.507f:908.507 +4000:3355:2:901:5090:5090L:3355.2f:3355.2 +4000:3356:3:91:5042:5042L:0.3f:0.3 +4000:3357:2:90:5036:5036L:2.1f:2.1 +4000:3358:5:91:5025:5025L:0.502591f:0.502591 +4000:3359:5:902:5085:5085L:902.508f:902.508 +4000:3360:5:900:5053:5053L:3360.5f:3360.5 +4000:3361:2:90:5050:5050L:0.2f:0.2 +4000:3362:2:90:5058:5058L:2.2f:2.2 +4000:3363:5:90:5041:5041L:0.504190f:0.504190 +4000:3364:2:906:5015:5015L:906.501f:906.501 +4000:3365:1:910:5026:5026L:3365.1f:3365.1 +4000:3366:5:90:5020:5020L:6.5f:6.5 +4000:3367:2:91:5034:5034L:2.0f:2.0 +4000:3368:4:90:5028:5028L:0.502890f:0.502890 +4000:3369:5:909:5052:5052L:909.505f:909.505 +4000:3370:5:908:5058:5058L:3370.5f:3370.5 +4000:3371:2:90:5062:5062L:1.2f:1.2 +4000:3372:5:90:5082:5082L:5.5f:5.5 +4000:3373:3:90:5071:5071L:0.507190f:0.507190 +4000:3374:5:906:5032:5032L:906.503f:906.503 +4000:3375:1:907:5031:5031L:3375.1f:3375.1 +4000:3376:2:90:5088:5088L:6.2f:6.2 +4000:3377:3:91:5083:5083L:3.0f:3.0 +4000:3378:5:90:5068:5068L:0.506890f:0.506890 +4000:3379:1:908:5050:5050L:908.505f:908.505 +4000:3380:4:906:5024:5024L:3380.4f:3380.4 +4000:3381:2:91:5036:5036L:0.2f:0.2 +4000:3382:5:90:5082:5082L:5.8f:5.8 +4000:3383:4:90:5008:5008L:0.500890f:0.500890 +4000:3384:2:901:5066:5066L:901.506f:901.506 +4000:3385:4:901:5029:5029L:3385.4f:3385.4 +4000:3386:5:90:5090:5090L:4.5f:4.5 +4000:3387:5:90:5089:5089L:5.9f:5.9 +4000:3388:4:90:5061:5061L:0.506190f:0.506190 +4000:3389:2:908:5034:5034L:908.503f:908.503 +4000:3390:5:904:5091:5091L:3390.5f:3390.5 +4000:3391:1:90:5085:5085L:6.1f:6.1 +4000:3392:3:90:5066:5066L:3.4f:3.4 +4000:3393:2:90:5092:5092L:0.509290f:0.509290 +4000:3394:2:904:5003:5003L:904.500f:904.500 +4000:3395:1:901:5015:5015L:3395.1f:3395.1 +4000:3396:2:90:5056:5056L:0.2f:0.2 +4000:3397:2:91:5044:5044L:2.0f:2.0 +4000:3398:1:90:5013:5013L:0.501390f:0.501390 +4000:3399:4:910:5094:5094L:910.509f:910.509 +4000:3400:1:909:5035:5035L:3400.1f:3400.1 +4000:3401:5:91:5098:5098L:0.5f:0.5 +4000:3402:5:90:5041:5041L:5.4f:5.4 +4000:3403:3:90:5050:5050L:0.505090f:0.505090 +4000:3404:2:901:5093:5093L:901.509f:901.509 +4000:3405:3:901:5003:5003L:3405.3f:3405.3 +4000:3406:3:90:5012:5012L:5.3f:5.3 +4000:3407:1:90:5007:5007L:1.7f:1.7 +4000:3408:3:90:5071:5071L:0.507190f:0.507190 +4000:3409:4:905:5070:5070L:905.507f:905.507 +4000:3410:4:906:5056:5056L:3410.4f:3410.4 +4000:3411:5:90:5052:5052L:6.5f:6.5 +4000:3412:5:90:5096:5096L:5.4f:5.4 +4000:3413:2:90:5068:5068L:0.506890f:0.506890 +4000:3414:5:902:5079:5079L:902.507f:902.507 +4000:3415:5:907:5093:5093L:3415.5f:3415.5 +4000:3416:5:90:5039:5039L:2.5f:2.5 +4000:3417:5:90:5008:5008L:5.3f:5.3 +4000:3418:1:91:5089:5089L:0.508991f:0.508991 +4000:3419:4:907:5041:5041L:907.504f:907.504 +4000:3420:3:903:5100:5100L:3420.3f:3420.3 +4000:3421:1:90:5055:5055L:3.1f:3.1 +4000:3422:3:90:5093:5093L:3.2f:3.2 +4000:3423:3:90:5077:5077L:0.507790f:0.507790 +4000:3424:1:905:5100:5100L:905.510f:905.510 +4000:3425:5:903:5065:5065L:3425.5f:3425.5 +4000:3426:5:90:5088:5088L:1.5f:1.5 +4000:3427:2:90:5024:5024L:2.1f:2.1 +4000:3428:2:90:5017:5017L:0.501790f:0.501790 +4000:3429:2:910:5082:5082L:910.508f:910.508 +4000:3430:4:904:5010:5010L:3430.4f:3430.4 +4000:3431:4:90:5038:5038L:4.4f:4.4 +4000:3432:1:91:5062:5062L:1.0f:1.0 +4000:3433:1:90:5025:5025L:0.502590f:0.502590 +4000:3434:5:905:5077:5077L:905.507f:905.507 +4000:3435:5:905:5008:5008L:3435.5f:3435.5 +4000:3436:3:90:5025:5025L:3.3f:3.3 +4000:3437:2:90:5039:5039L:2.6f:2.6 +4000:3438:4:90:5058:5058L:0.505890f:0.505890 +4000:3439:5:901:5051:5051L:901.505f:901.505 +4000:3440:4:908:5089:5089L:3440.4f:3440.4 +4000:3441:4:90:5028:5028L:4.4f:4.4 +4000:3442:1:90:5019:5019L:1.6f:1.6 +4000:3443:4:90:5058:5058L:0.505890f:0.505890 +4000:3444:5:906:5011:5011L:906.501f:906.501 +4000:3445:4:904:5059:5059L:3445.4f:3445.4 +4000:3446:5:91:5093:5093L:0.5f:0.5 +4000:3447:1:90:5050:5050L:1.3f:1.3 +4000:3448:3:91:5040:5040L:0.504091f:0.504091 +4000:3449:1:908:5053:5053L:908.505f:908.505 +4000:3450:3:904:5029:5029L:3450.3f:3450.3 +4000:3451:3:90:5069:5069L:1.3f:1.3 +4000:3452:4:90:5026:5026L:4.2f:4.2 +4000:3453:5:91:5095:5095L:0.509591f:0.509591 +4000:3454:3:910:5051:5051L:910.505f:910.505 +4000:3455:4:907:5094:5094L:3455.4f:3455.4 +4000:3456:2:90:5090:5090L:5.2f:5.2 +4000:3457:1:90:5024:5024L:1.6f:1.6 +4000:3458:4:90:5023:5023L:0.502390f:0.502390 +4000:3459:1:901:5002:5002L:901.500f:901.500 +4000:3460:3:907:5044:5044L:3460.3f:3460.3 +4000:3461:5:90:5059:5059L:1.5f:1.5 +4000:3462:3:90:5083:5083L:3.9f:3.9 +4000:3463:5:90:5080:5080L:0.508090f:0.508090 +4000:3464:4:902:5074:5074L:902.507f:902.507 +4000:3465:2:909:5041:5041L:3465.2f:3465.2 +4000:3466:1:90:5092:5092L:1.1f:1.1 +4000:3467:1:90:5051:5051L:1.2f:1.2 +4000:3468:2:90:5057:5057L:0.505790f:0.505790 +4000:3469:3:909:5068:5068L:909.506f:909.506 +4000:3470:3:904:5035:5035L:3470.3f:3470.3 +4000:3471:1:90:5047:5047L:3.1f:3.1 +4000:3472:4:90:5032:5032L:4.9f:4.9 +4000:3473:3:90:5009:5009L:0.500990f:0.500990 +4000:3474:2:904:5036:5036L:904.503f:904.503 +4000:3475:5:907:5025:5025L:3475.5f:3475.5 +4000:3476:2:90:5034:5034L:9.2f:9.2 +4000:3477:2:91:5056:5056L:2.0f:2.0 +4000:3478:5:90:5041:5041L:0.504190f:0.504190 +4000:3479:2:909:5029:5029L:909.502f:909.502 +4000:3480:1:905:5073:5073L:3480.1f:3480.1 +4000:3481:3:90:5003:5003L:5.3f:5.3 +4000:3482:5:90:5089:5089L:5.1f:5.1 +4000:3483:2:90:5054:5054L:0.505490f:0.505490 +4000:3484:2:908:5096:5096L:908.509f:908.509 +4000:3485:4:908:5063:5063L:3485.4f:3485.4 +4000:3486:5:90:5051:5051L:1.5f:1.5 +4000:3487:2:90:5047:5047L:2.5f:2.5 +4000:3488:5:90:5078:5078L:0.507890f:0.507890 +4000:3489:2:907:5065:5065L:907.506f:907.506 +4000:3490:3:908:5011:5011L:3490.3f:3490.3 +4000:3491:2:90:5061:5061L:2.2f:2.2 +4000:3492:2:90:5074:5074L:2.0f:2.0 +4000:3493:1:90:5030:5030L:0.503090f:0.503090 +4000:3494:4:906:5012:5012L:906.501f:906.501 +4000:3495:4:903:5091:5091L:3495.4f:3495.4 +4000:3496:2:90:5008:5008L:2.2f:2.2 +4000:3497:5:90:5058:5058L:5.5f:5.5 +4000:3498:2:90:5089:5089L:0.508990f:0.508990 +4000:3499:1:906:5058:5058L:906.505f:906.505 +4000:3500:4:901:5034:5034L:3500.4f:3500.4 +4000:3501:5:90:5052:5052L:4.5f:4.5 +4000:3502:3:90:5060:5060L:3.7f:3.7 +4000:3503:1:90:5091:5091L:0.509190f:0.509190 +4000:3504:3:907:5053:5053L:907.505f:907.505 +4000:3505:4:903:5084:5084L:3505.4f:3505.4 +4000:3506:3:90:5008:5008L:7.3f:7.3 +4000:3507:4:90:5060:5060L:4.5f:4.5 +4000:3508:1:90:5096:5096L:0.509690f:0.509690 +4000:3509:1:909:5056:5056L:909.505f:909.505 +4000:3510:4:906:5071:5071L:3510.4f:3510.4 +4000:3511:5:90:5011:5011L:4.5f:4.5 +4000:3512:3:90:5084:5084L:3.9f:3.9 +4000:3513:1:90:5075:5075L:0.507590f:0.507590 +4000:3514:1:905:5039:5039L:905.503f:905.503 +4000:3515:3:901:5072:5072L:3515.3f:3515.3 +4000:3516:2:90:5037:5037L:7.2f:7.2 +4000:3517:3:90:5086:5086L:3.2f:3.2 +4000:3518:1:90:5064:5064L:0.506490f:0.506490 +4000:3519:1:905:5051:5051L:905.505f:905.505 +4000:3520:3:901:5010:5010L:3520.3f:3520.3 +4000:3521:2:90:5053:5053L:1.2f:1.2 +4000:3522:3:90:5040:5040L:3.6f:3.6 +4000:3523:2:90:5046:5046L:0.504690f:0.504690 +4000:3524:5:908:5100:5100L:908.510f:908.510 +4000:3525:2:903:5013:5013L:3525.2f:3525.2 +4000:3526:1:90:5080:5080L:7.1f:7.1 +4000:3527:3:90:5004:5004L:3.1f:3.1 +4000:3528:2:90:5048:5048L:0.504890f:0.504890 +4000:3529:5:902:5099:5099L:902.509f:902.509 +4000:3530:3:908:5012:5012L:3530.3f:3530.3 +4000:3531:3:90:5024:5024L:0.3f:0.3 +4000:3532:1:90:5087:5087L:1.5f:1.5 +4000:3533:3:90:5059:5059L:0.505990f:0.505990 +4000:3534:5:907:5031:5031L:907.503f:907.503 +4000:3535:5:900:5060:5060L:3535.5f:3535.5 +4000:3536:1:90:5025:5025L:1.1f:1.1 +4000:3537:5:90:5038:5038L:5.7f:5.7 +4000:3538:5:91:5058:5058L:0.505891f:0.505891 +4000:3539:3:910:5079:5079L:910.507f:910.507 +4000:3540:3:904:5058:5058L:3540.3f:3540.3 +4000:3541:3:91:5066:5066L:0.3f:0.3 +4000:3542:4:90:5013:5013L:4.0f:4.0 +4000:3543:4:90:5086:5086L:0.508690f:0.508690 +4000:3544:2:905:5056:5056L:905.505f:905.505 +4000:3545:3:905:5064:5064L:3545.3f:3545.3 +4000:3546:1:90:5081:5081L:6.1f:6.1 +4000:3547:2:90:5045:5045L:2.5f:2.5 +4000:3548:4:90:5041:5041L:0.504190f:0.504190 +4000:3549:2:908:5033:5033L:908.503f:908.503 +4000:3550:1:902:5073:5073L:3550.1f:3550.1 +4000:3551:4:90:5069:5069L:8.4f:8.4 +4000:3552:2:90:5076:5076L:2.5f:2.5 +4000:3553:3:90:5032:5032L:0.503290f:0.503290 +4000:3554:2:904:5086:5086L:904.508f:904.508 +4000:3555:5:910:5033:5033L:3555.5f:3555.5 +4000:3556:3:90:5092:5092L:0.3f:0.3 +4000:3557:2:90:5037:5037L:2.4f:2.4 +4000:3558:5:90:5078:5078L:0.507890f:0.507890 +4000:3559:2:906:5059:5059L:906.505f:906.505 +4000:3560:3:907:5081:5081L:3560.3f:3560.3 +4000:3561:2:90:5056:5056L:4.2f:4.2 +4000:3562:5:90:5008:5008L:5.9f:5.9 +4000:3563:4:90:5024:5024L:0.502490f:0.502490 +4000:3564:1:908:5062:5062L:908.506f:908.506 +4000:3565:5:907:5054:5054L:3565.5f:3565.5 +4000:3566:2:90:5059:5059L:2.2f:2.2 +4000:3567:1:90:5003:5003L:1.6f:1.6 +4000:3568:3:90:5024:5024L:0.502490f:0.502490 +4000:3569:2:907:5081:5081L:907.508f:907.508 +4000:3570:5:902:5052:5052L:3570.5f:3570.5 +4000:3571:4:90:5097:5097L:5.4f:5.4 +4000:3572:2:90:5080:5080L:2.5f:2.5 +4000:3573:2:90:5014:5014L:0.501490f:0.501490 +4000:3574:3:903:5088:5088L:903.508f:903.508 +4000:3575:2:902:5054:5054L:3575.2f:3575.2 +4000:3576:4:90:5077:5077L:5.4f:5.4 +4000:3577:2:90:5037:5037L:2.7f:2.7 +4000:3578:2:90:5081:5081L:0.508190f:0.508190 +4000:3579:4:905:5047:5047L:905.504f:905.504 +4000:3580:3:904:5071:5071L:3580.3f:3580.3 +4000:3581:5:90:5022:5022L:1.5f:1.5 +4000:3582:5:90:5074:5074L:5.4f:5.4 +4000:3583:4:90:5099:5099L:0.509990f:0.509990 +4000:3584:5:903:5029:5029L:903.502f:903.502 +4000:3585:4:906:5053:5053L:3585.4f:3585.4 +4000:3586:2:90:5001:5001L:3.2f:3.2 +4000:3587:1:90:5066:5066L:1.6f:1.6 +4000:3588:3:90:5086:5086L:0.508690f:0.508690 +4000:3589:2:906:5036:5036L:906.503f:906.503 +4000:3590:4:900:5077:5077L:3590.4f:3590.4 +4000:3591:2:91:5089:5089L:0.2f:0.2 +4000:3592:4:91:5028:5028L:4.0f:4.0 +4000:3593:2:90:5002:5002L:0.500290f:0.500290 +4000:3594:2:905:5036:5036L:905.503f:905.503 +4000:3595:4:902:5091:5091L:3595.4f:3595.4 +4000:3596:1:90:5020:5020L:5.1f:5.1 +4000:3597:1:90:5084:5084L:1.5f:1.5 +4000:3598:5:90:5085:5085L:0.508590f:0.508590 +4000:3599:4:901:5046:5046L:901.504f:901.504 +4000:3600:1:908:5051:5051L:3600.1f:3600.1 +4000:3601:5:90:5051:5051L:1.5f:1.5 +4000:3602:4:90:5042:5042L:4.8f:4.8 +4000:3603:5:90:5003:5003L:0.500390f:0.500390 +4000:3604:1:905:5051:5051L:905.505f:905.505 +4000:3605:2:901:5071:5071L:3605.2f:3605.2 +4000:3606:2:90:5016:5016L:2.2f:2.2 +4000:3607:3:90:5064:5064L:3.4f:3.4 +4000:3608:2:90:5052:5052L:0.505290f:0.505290 +4000:3609:1:910:5062:5062L:910.506f:910.506 +4000:3610:4:910:5039:5039L:3610.4f:3610.4 +4000:3611:1:90:5057:5057L:8.1f:8.1 +4000:3612:4:90:5035:5035L:4.5f:4.5 +4000:3613:1:90:5049:5049L:0.504990f:0.504990 +4000:3614:1:905:5096:5096L:905.509f:905.509 +4000:3615:4:909:5004:5004L:3615.4f:3615.4 +4000:3616:2:90:5029:5029L:1.2f:1.2 +4000:3617:3:90:5071:5071L:3.6f:3.6 +4000:3618:1:91:5095:5095L:0.509591f:0.509591 +4000:3619:4:901:5088:5088L:901.508f:901.508 +4000:3620:2:908:5084:5084L:3620.2f:3620.2 +4000:3621:4:90:5061:5061L:9.4f:9.4 +4000:3622:2:90:5007:5007L:2.6f:2.6 +4000:3623:3:90:5053:5053L:0.505390f:0.505390 +4000:3624:1:908:5100:5100L:908.510f:908.510 +4000:3625:1:904:5084:5084L:3625.1f:3625.1 +4000:3626:1:90:5097:5097L:7.1f:7.1 +4000:3627:2:90:5057:5057L:2.1f:2.1 +4000:3628:1:90:5051:5051L:0.505190f:0.505190 +4000:3629:1:910:5062:5062L:910.506f:910.506 +4000:3630:5:902:5037:5037L:3630.5f:3630.5 +4000:3631:4:90:5027:5027L:9.4f:9.4 +4000:3632:2:90:5083:5083L:2.1f:2.1 +4000:3633:3:90:5045:5045L:0.504590f:0.504590 +4000:3634:5:908:5020:5020L:908.502f:908.502 +4000:3635:5:908:5057:5057L:3635.5f:3635.5 +4000:3636:4:90:5026:5026L:8.4f:8.4 +4000:3637:4:90:5044:5044L:4.1f:4.1 +4000:3638:2:90:5074:5074L:0.507490f:0.507490 +4000:3639:5:902:5069:5069L:902.506f:902.506 +4000:3640:3:901:5091:5091L:3640.3f:3640.3 +4000:3641:5:90:5078:5078L:9.5f:9.5 +4000:3642:1:90:5088:5088L:1.2f:1.2 +4000:3643:5:90:5054:5054L:0.505490f:0.505490 +4000:3644:2:906:5027:5027L:906.502f:906.502 +4000:3645:3:905:5001:5001L:3645.3f:3645.3 +4000:3646:1:90:5083:5083L:3.1f:3.1 +4000:3647:2:90:5100:5100L:2.0f:2.0 +4000:3648:5:90:5024:5024L:0.502490f:0.502490 +4000:3649:3:902:5050:5050L:902.505f:902.505 +4000:3650:2:907:5066:5066L:3650.2f:3650.2 +4000:3651:1:90:5054:5054L:5.1f:5.1 +4000:3652:5:90:5076:5076L:5.6f:5.6 +4000:3653:5:90:5040:5040L:0.504090f:0.504090 +4000:3654:2:909:5099:5099L:909.509f:909.509 +4000:3655:4:904:5052:5052L:3655.4f:3655.4 +4000:3656:4:90:5084:5084L:6.4f:6.4 +4000:3657:3:91:5090:5090L:3.0f:3.0 +4000:3658:3:90:5027:5027L:0.502790f:0.502790 +4000:3659:4:904:5048:5048L:904.504f:904.504 +4000:3660:2:907:5014:5014L:3660.2f:3660.2 +4000:3661:5:90:5063:5063L:8.5f:8.5 +4000:3662:3:90:5020:5020L:3.8f:3.8 +4000:3663:1:90:5069:5069L:0.506990f:0.506990 +4000:3664:3:910:5055:5055L:910.505f:910.505 +4000:3665:3:906:5098:5098L:3665.3f:3665.3 +4000:3666:1:90:5053:5053L:2.1f:2.1 +4000:3667:5:90:5049:5049L:5.7f:5.7 +4000:3668:5:90:5028:5028L:0.502890f:0.502890 +4000:3669:1:910:5065:5065L:910.506f:910.506 +4000:3670:3:901:5029:5029L:3670.3f:3670.3 +4000:3671:4:90:5011:5011L:0.4f:0.4 +4000:3672:2:90:5089:5089L:2.4f:2.4 +4000:3673:3:90:5048:5048L:0.504890f:0.504890 +4000:3674:2:902:5044:5044L:902.504f:902.504 +4000:3675:4:908:5003:5003L:3675.4f:3675.4 +4000:3676:4:90:5027:5027L:9.4f:9.4 +4000:3677:2:90:5100:5100L:2.8f:2.8 +4000:3678:4:90:5018:5018L:0.501890f:0.501890 +4000:3679:1:907:5009:5009L:907.500f:907.500 +4000:3680:4:902:5022:5022L:3680.4f:3680.4 +4000:3681:1:91:5023:5023L:0.1f:0.1 +4000:3682:1:90:5067:5067L:1.3f:1.3 +4000:3683:1:90:5028:5028L:0.502890f:0.502890 +4000:3684:3:901:5048:5048L:901.504f:901.504 +4000:3685:5:910:5024:5024L:3685.5f:3685.5 +4000:3686:5:90:5009:5009L:7.5f:7.5 +4000:3687:2:91:5086:5086L:2.0f:2.0 +4000:3688:2:90:5044:5044L:0.504490f:0.504490 +4000:3689:3:909:5011:5011L:909.501f:909.501 +4000:3690:3:906:5036:5036L:3690.3f:3690.3 +4000:3691:4:90:5034:5034L:6.4f:6.4 +4000:3692:5:90:5066:5066L:5.8f:5.8 +4000:3693:4:90:5054:5054L:0.505490f:0.505490 +4000:3694:5:902:5066:5066L:902.506f:902.506 +4000:3695:3:901:5058:5058L:3695.3f:3695.3 +4000:3696:4:90:5026:5026L:1.4f:1.4 +4000:3697:4:90:5025:5025L:4.4f:4.4 +4000:3698:3:90:5002:5002L:0.500290f:0.500290 +4000:3699:1:900:5088:5088L:900.508f:900.508 +4000:3700:1:905:5045:5045L:3700.1f:3700.1 +4000:3701:3:90:5005:5005L:2.3f:2.3 +4000:3702:5:90:5079:5079L:5.2f:5.2 +4000:3703:3:90:5053:5053L:0.505390f:0.505390 +4000:3704:1:908:5077:5077L:908.507f:908.507 +4000:3705:4:901:5094:5094L:3705.4f:3705.4 +4000:3706:2:90:5006:5006L:9.2f:9.2 +4000:3707:3:90:5044:5044L:3.6f:3.6 +4000:3708:5:90:5003:5003L:0.500390f:0.500390 +4000:3709:5:902:5003:5003L:902.500f:902.500 +4000:3710:4:903:5055:5055L:3710.4f:3710.4 +4000:3711:1:90:5080:5080L:9.1f:9.1 +4000:3712:2:90:5000:5000L:2.7f:2.7 +4000:3713:5:90:5087:5087L:0.508790f:0.508790 +4000:3714:3:902:5064:5064L:902.506f:902.506 +4000:3715:2:910:5082:5082L:3715.2f:3715.2 +4000:3716:2:90:5065:5065L:2.2f:2.2 +4000:3717:2:90:5020:5020L:2.8f:2.8 +4000:3718:4:90:5035:5035L:0.503590f:0.503590 +4000:3719:4:904:5054:5054L:904.505f:904.505 +4000:3720:5:901:5088:5088L:3720.5f:3720.5 +4000:3721:2:90:5072:5072L:3.2f:3.2 +4000:3722:1:90:5041:5041L:1.5f:1.5 +4000:3723:1:90:5062:5062L:0.506290f:0.506290 +4000:3724:1:900:5087:5087L:900.508f:900.508 +4000:3725:4:903:5084:5084L:3725.4f:3725.4 +4000:3726:3:90:5009:5009L:6.3f:6.3 +4000:3727:1:90:5091:5091L:1.9f:1.9 +4000:3728:2:90:5051:5051L:0.505190f:0.505190 +4000:3729:4:903:5095:5095L:903.509f:903.509 +4000:3730:2:901:5009:5009L:3730.2f:3730.2 +4000:3731:1:90:5039:5039L:5.1f:5.1 +4000:3732:5:90:5091:5091L:5.7f:5.7 +4000:3733:2:90:5041:5041L:0.504190f:0.504190 +4000:3734:5:908:5044:5044L:908.504f:908.504 +4000:3735:4:905:5077:5077L:3735.4f:3735.4 +4000:3736:3:91:5031:5031L:0.3f:0.3 +4000:3737:4:90:5016:5016L:4.0f:4.0 +4000:3738:3:90:5075:5075L:0.507590f:0.507590 +4000:3739:1:900:5010:5010L:900.501f:900.501 +4000:3740:1:903:5025:5025L:3740.1f:3740.1 +4000:3741:1:90:5076:5076L:4.1f:4.1 +4000:3742:3:90:5040:5040L:3.2f:3.2 +4000:3743:2:90:5020:5020L:0.502090f:0.502090 +4000:3744:4:902:5001:5001L:902.500f:902.500 +4000:3745:2:910:5049:5049L:3745.2f:3745.2 +4000:3746:1:90:5044:5044L:5.1f:5.1 +4000:3747:2:90:5051:5051L:2.1f:2.1 +4000:3748:3:90:5090:5090L:0.509090f:0.509090 +4000:3749:2:908:5098:5098L:908.509f:908.509 +4000:3750:2:908:5026:5026L:3750.2f:3750.2 +4000:3751:3:90:5065:5065L:9.3f:9.3 +4000:3752:2:90:5086:5086L:2.3f:2.3 +4000:3753:4:90:5027:5027L:0.502790f:0.502790 +4000:3754:5:905:5053:5053L:905.505f:905.505 +4000:3755:5:908:5050:5050L:3755.5f:3755.5 +4000:3756:3:90:5001:5001L:8.3f:8.3 +4000:3757:5:90:5017:5017L:5.1f:5.1 +4000:3758:2:90:5087:5087L:0.508790f:0.508790 +4000:3759:2:909:5063:5063L:909.506f:909.506 +4000:3760:2:901:5039:5039L:3760.2f:3760.2 +4000:3761:3:90:5026:5026L:8.3f:8.3 +4000:3762:1:90:5061:5061L:1.0f:1.0 +4000:3763:1:90:5034:5034L:0.503490f:0.503490 +4000:3764:2:908:5089:5089L:908.508f:908.508 +4000:3765:5:907:5066:5066L:3765.5f:3765.5 +4000:3766:2:90:5044:5044L:1.2f:1.2 +4000:3767:2:90:5054:5054L:2.0f:2.0 +4000:3768:3:90:5012:5012L:0.501290f:0.501290 +4000:3769:2:907:5095:5095L:907.509f:907.509 +4000:3770:1:910:5010:5010L:3770.1f:3770.1 +4000:3771:3:90:5086:5086L:5.3f:5.3 +4000:3772:4:90:5094:5094L:4.7f:4.7 +4000:3773:2:90:5077:5077L:0.507790f:0.507790 +4000:3774:4:910:5052:5052L:910.505f:910.505 +4000:3775:3:908:5024:5024L:3775.3f:3775.3 +4000:3776:1:90:5039:5039L:1.1f:1.1 +4000:3777:4:90:5042:5042L:4.5f:4.5 +4000:3778:1:91:5084:5084L:0.508491f:0.508491 +4000:3779:2:903:5053:5053L:903.505f:903.505 +4000:3780:2:904:5048:5048L:3780.2f:3780.2 +4000:3781:2:90:5095:5095L:8.2f:8.2 +4000:3782:1:90:5059:5059L:1.5f:1.5 +4000:3783:1:90:5026:5026L:0.502690f:0.502690 +4000:3784:5:903:5022:5022L:903.502f:903.502 +4000:3785:2:909:5002:5002L:3785.2f:3785.2 +4000:3786:4:90:5014:5014L:0.4f:0.4 +4000:3787:1:90:5061:5061L:1.6f:1.6 +4000:3788:3:90:5059:5059L:0.505990f:0.505990 +4000:3789:2:900:5096:5096L:900.509f:900.509 +4000:3790:5:902:5033:5033L:3790.5f:3790.5 +4000:3791:2:90:5011:5011L:6.2f:6.2 +4000:3792:2:90:5057:5057L:2.8f:2.8 +4000:3793:5:90:5030:5030L:0.503090f:0.503090 +4000:3794:1:908:5066:5066L:908.506f:908.506 +4000:3795:2:901:5052:5052L:3795.2f:3795.2 +4000:3796:2:90:5055:5055L:8.2f:8.2 +4000:3797:3:90:5018:5018L:3.8f:3.8 +4000:3798:1:90:5096:5096L:0.509690f:0.509690 +4000:3799:4:905:5099:5099L:905.509f:905.509 +4000:3800:4:904:5024:5024L:3800.4f:3800.4 +4000:3801:5:90:5081:5081L:7.5f:7.5 +4000:3802:1:91:5056:5056L:1.0f:1.0 +4000:3803:4:90:5041:5041L:0.504190f:0.504190 +4000:3804:5:909:5015:5015L:909.501f:909.501 +4000:3805:4:902:5028:5028L:3805.4f:3805.4 +4000:3806:1:90:5005:5005L:5.1f:5.1 +4000:3807:4:90:5086:5086L:4.0f:4.0 +4000:3808:5:90:5011:5011L:0.501190f:0.501190 +4000:3809:5:909:5066:5066L:909.506f:909.506 +4000:3810:5:905:5001:5001L:3810.5f:3810.5 +4000:3811:1:90:5069:5069L:4.1f:4.1 +4000:3812:5:90:5060:5060L:5.5f:5.5 +4000:3813:3:90:5036:5036L:0.503690f:0.503690 +4000:3814:5:901:5022:5022L:901.502f:901.502 +4000:3815:5:908:5042:5042L:3815.5f:3815.5 +4000:3816:2:90:5097:5097L:9.2f:9.2 +4000:3817:2:90:5000:5000L:2.6f:2.6 +4000:3818:1:90:5014:5014L:0.501490f:0.501490 +4000:3819:2:902:5098:5098L:902.509f:902.509 +4000:3820:5:900:5045:5045L:3820.5f:3820.5 +4000:3821:5:90:5090:5090L:1.5f:1.5 +4000:3822:4:91:5042:5042L:4.0f:4.0 +4000:3823:2:90:5060:5060L:0.506090f:0.506090 +4000:3824:3:902:5074:5074L:902.507f:902.507 +4000:3825:5:901:5048:5048L:3825.5f:3825.5 +4000:3826:2:90:5036:5036L:4.2f:4.2 +4000:3827:2:90:5093:5093L:2.8f:2.8 +4000:3828:2:90:5035:5035L:0.503590f:0.503590 +4000:3829:2:902:5060:5060L:902.506f:902.506 +4000:3830:2:901:5065:5065L:3830.2f:3830.2 +4000:3831:4:90:5074:5074L:0.4f:0.4 +4000:3832:4:90:5069:5069L:4.7f:4.7 +4000:3833:1:91:5004:5004L:0.500491f:0.500491 +4000:3834:4:906:5023:5023L:906.502f:906.502 +4000:3835:3:904:5040:5040L:3835.3f:3835.3 +4000:3836:5:90:5083:5083L:6.5f:6.5 +4000:3837:2:90:5056:5056L:2.9f:2.9 +4000:3838:2:90:5047:5047L:0.504790f:0.504790 +4000:3839:3:904:5066:5066L:904.506f:904.506 +4000:3840:1:908:5079:5079L:3840.1f:3840.1 +4000:3841:5:90:5086:5086L:6.5f:6.5 +4000:3842:3:90:5058:5058L:3.2f:3.2 +4000:3843:2:90:5053:5053L:0.505390f:0.505390 +4000:3844:2:900:5008:5008L:900.500f:900.500 +4000:3845:3:906:5046:5046L:3845.3f:3845.3 +4000:3846:5:90:5008:5008L:5.5f:5.5 +4000:3847:4:90:5093:5093L:4.8f:4.8 +4000:3848:2:90:5098:5098L:0.509890f:0.509890 +4000:3849:4:906:5039:5039L:906.503f:906.503 +4000:3850:3:908:5015:5015L:3850.3f:3850.3 +4000:3851:2:90:5071:5071L:6.2f:6.2 +4000:3852:1:90:5096:5096L:1.1f:1.1 +4000:3853:4:90:5033:5033L:0.503390f:0.503390 +4000:3854:1:907:5042:5042L:907.504f:907.504 +4000:3855:2:902:5097:5097L:3855.2f:3855.2 +4000:3856:4:90:5045:5045L:1.4f:1.4 +4000:3857:5:91:5023:5023L:5.0f:5.0 +4000:3858:4:90:5024:5024L:0.502490f:0.502490 +4000:3859:4:900:5084:5084L:900.508f:900.508 +4000:3860:1:904:5062:5062L:3860.1f:3860.1 +4000:3861:2:90:5022:5022L:7.2f:7.2 +4000:3862:5:90:5039:5039L:5.8f:5.8 +4000:3863:5:90:5082:5082L:0.508290f:0.508290 +4000:3864:2:906:5054:5054L:906.505f:906.505 +4000:3865:4:909:5079:5079L:3865.4f:3865.4 +4000:3866:4:90:5096:5096L:6.4f:6.4 +4000:3867:1:90:5088:5088L:1.4f:1.4 +4000:3868:2:90:5011:5011L:0.501190f:0.501190 +4000:3869:3:909:5012:5012L:909.501f:909.501 +4000:3870:2:910:5058:5058L:3870.2f:3870.2 +4000:3871:1:90:5025:5025L:2.1f:2.1 +4000:3872:2:90:5000:5000L:2.2f:2.2 +4000:3873:4:90:5042:5042L:0.504290f:0.504290 +4000:3874:3:904:5002:5002L:904.500f:904.500 +4000:3875:5:900:5090:5090L:3875.5f:3875.5 +4000:3876:4:90:5051:5051L:7.4f:7.4 +4000:3877:4:90:5095:5095L:4.8f:4.8 +4000:3878:3:90:5012:5012L:0.501290f:0.501290 +4000:3879:4:906:5002:5002L:906.500f:906.500 +4000:3880:5:910:5002:5002L:3880.5f:3880.5 +4000:3881:3:91:5027:5027L:0.3f:0.3 +4000:3882:4:90:5049:5049L:4.2f:4.2 +4000:3883:4:90:5063:5063L:0.506390f:0.506390 +4000:3884:1:902:5001:5001L:902.500f:902.500 +4000:3885:1:902:5005:5005L:3885.1f:3885.1 +4000:3886:1:91:5073:5073L:0.1f:0.1 +4000:3887:3:90:5047:5047L:3.7f:3.7 +4000:3888:3:90:5053:5053L:0.505390f:0.505390 +4000:3889:4:910:5012:5012L:910.501f:910.501 +4000:3890:4:909:5010:5010L:3890.4f:3890.4 +4000:3891:4:90:5009:5009L:2.4f:2.4 +4000:3892:5:90:5030:5030L:5.9f:5.9 +4000:3893:3:90:5012:5012L:0.501290f:0.501290 +4000:3894:1:907:5038:5038L:907.503f:907.503 +4000:3895:1:908:5060:5060L:3895.1f:3895.1 +4000:3896:1:90:5058:5058L:8.1f:8.1 +4000:3897:5:90:5027:5027L:5.3f:5.3 +4000:3898:2:90:5056:5056L:0.505690f:0.505690 +4000:3899:5:904:5055:5055L:904.505f:904.505 +4000:3900:5:910:5037:5037L:3900.5f:3900.5 +4000:3901:1:90:5062:5062L:7.1f:7.1 +4000:3902:1:90:5051:5051L:1.6f:1.6 +4000:3903:3:91:5008:5008L:0.500891f:0.500891 +4000:3904:3:900:5074:5074L:900.507f:900.507 +4000:3905:5:900:5049:5049L:3905.5f:3905.5 +4000:3906:3:90:5026:5026L:2.3f:2.3 +4000:3907:1:90:5056:5056L:1.0f:1.0 +4000:3908:3:90:5032:5032L:0.503290f:0.503290 +4000:3909:5:901:5069:5069L:901.506f:901.506 +4000:3910:3:901:5069:5069L:3910.3f:3910.3 +4000:3911:5:90:5032:5032L:2.5f:2.5 +4000:3912:3:90:5089:5089L:3.3f:3.3 +4000:3913:1:90:5087:5087L:0.508790f:0.508790 +4000:3914:1:904:5089:5089L:904.508f:904.508 +4000:3915:5:904:5096:5096L:3915.5f:3915.5 +4000:3916:2:91:5014:5014L:0.2f:0.2 +4000:3917:3:90:5016:5016L:3.0f:3.0 +4000:3918:1:90:5050:5050L:0.505090f:0.505090 +4000:3919:3:904:5067:5067L:904.506f:904.506 +4000:3920:1:910:5079:5079L:3920.1f:3920.1 +4000:3921:5:90:5099:5099L:9.5f:9.5 +4000:3922:1:90:5034:5034L:1.3f:1.3 +4000:3923:1:90:5016:5016L:0.501690f:0.501690 +4000:3924:5:905:5057:5057L:905.505f:905.505 +4000:3925:5:903:5093:5093L:3925.5f:3925.5 +4000:3926:4:90:5086:5086L:6.4f:6.4 +4000:3927:5:90:5093:5093L:5.2f:5.2 +4000:3928:1:90:5040:5040L:0.504090f:0.504090 +4000:3929:3:909:5085:5085L:909.508f:909.508 +4000:3930:2:900:5080:5080L:3930.2f:3930.2 +4000:3931:1:90:5065:5065L:9.1f:9.1 +4000:3932:1:90:5000:5000L:1.0f:1.0 +4000:3933:2:90:5038:5038L:0.503890f:0.503890 +4000:3934:3:900:5086:5086L:900.508f:900.508 +4000:3935:1:909:5016:5016L:3935.1f:3935.1 +4000:3936:1:90:5080:5080L:6.1f:6.1 +4000:3937:5:90:5002:5002L:5.5f:5.5 +4000:3938:4:90:5040:5040L:0.504090f:0.504090 +4000:3939:1:901:5025:5025L:901.502f:901.502 +4000:3940:1:904:5027:5027L:3940.1f:3940.1 +4000:3941:5:90:5015:5015L:4.5f:4.5 +4000:3942:3:90:5020:5020L:3.4f:3.4 +4000:3943:3:90:5031:5031L:0.503190f:0.503190 +4000:3944:5:903:5035:5035L:903.503f:903.503 +4000:3945:4:903:5019:5019L:3945.4f:3945.4 +4000:3946:5:90:5081:5081L:4.5f:4.5 +4000:3947:4:90:5032:5032L:4.2f:4.2 +4000:3948:4:90:5091:5091L:0.509190f:0.509190 +4000:3949:1:902:5005:5005L:902.500f:902.500 +4000:3950:2:902:5044:5044L:3950.2f:3950.2 +4000:3951:4:90:5085:5085L:1.4f:1.4 +4000:3952:4:90:5026:5026L:4.6f:4.6 +4000:3953:5:90:5002:5002L:0.500290f:0.500290 +4000:3954:2:910:5031:5031L:910.503f:910.503 +4000:3955:4:907:5067:5067L:3955.4f:3955.4 +4000:3956:5:90:5004:5004L:6.5f:6.5 +4000:3957:4:90:5028:5028L:4.2f:4.2 +4000:3958:5:91:5031:5031L:0.503191f:0.503191 +4000:3959:5:900:5054:5054L:900.505f:900.505 +4000:3960:5:904:5080:5080L:3960.5f:3960.5 +4000:3961:2:90:5090:5090L:0.2f:0.2 +4000:3962:2:90:5048:5048L:2.8f:2.8 +4000:3963:3:90:5055:5055L:0.505590f:0.505590 +4000:3964:3:900:5050:5050L:900.505f:900.505 +4000:3965:5:907:5017:5017L:3965.5f:3965.5 +4000:3966:3:90:5072:5072L:5.3f:5.3 +4000:3967:3:90:5096:5096L:3.2f:3.2 +4000:3968:5:90:5089:5089L:0.508990f:0.508990 +4000:3969:1:900:5093:5093L:900.509f:900.509 +4000:3970:4:910:5031:5031L:3970.4f:3970.4 +4000:3971:3:90:5032:5032L:3.3f:3.3 +4000:3972:2:90:5010:5010L:2.6f:2.6 +4000:3973:5:90:5087:5087L:0.508790f:0.508790 +4000:3974:3:906:5093:5093L:906.509f:906.509 +4000:3975:5:904:5063:5063L:3975.5f:3975.5 +4000:3976:1:90:5017:5017L:9.1f:9.1 +4000:3977:5:90:5036:5036L:5.4f:5.4 +4000:3978:4:90:5052:5052L:0.505290f:0.505290 +4000:3979:4:904:5056:5056L:904.505f:904.505 +4000:3980:3:901:5053:5053L:3980.3f:3980.3 +4000:3981:5:90:5089:5089L:6.5f:6.5 +4000:3982:1:91:5046:5046L:1.0f:1.0 +4000:3983:2:90:5053:5053L:0.505390f:0.505390 +4000:3984:1:902:5010:5010L:902.501f:902.501 +4000:3985:1:901:5051:5051L:3985.1f:3985.1 +4000:3986:4:90:5042:5042L:2.4f:2.4 +4000:3987:5:90:5086:5086L:5.0f:5.0 +4000:3988:2:90:5013:5013L:0.501390f:0.501390 +4000:3989:4:904:5054:5054L:904.505f:904.505 +4000:3990:2:910:5064:5064L:3990.2f:3990.2 +4000:3991:5:90:5021:5021L:9.5f:9.5 +4000:3992:4:90:5016:5016L:4.0f:4.0 +4000:3993:2:90:5098:5098L:0.509890f:0.509890 +4000:3994:4:905:5020:5020L:905.502f:905.502 +4000:3995:5:906:5033:5033L:3995.5f:3995.5 +4000:3996:2:90:5054:5054L:3.2f:3.2 +4000:3997:4:90:5055:5055L:4.2f:4.2 +4000:3998:4:90:5032:5032L:0.503290f:0.503290 +4000:3999:4:902:5073:5073L:902.507f:902.507 +4000:4000:2:906:5071:5071L:4000.2f:4000.2 +5000:4001:5:90:5056:5056L:4.5f:4.5 +5000:4002:1:90:5060:5060L:1.2f:1.2 +5000:4003:2:90:5094:5094L:0.509490f:0.509490 +5000:4004:2:901:5045:5045L:901.504f:901.504 +5000:4005:3:910:5006:5006L:4005.3f:4005.3 +5000:4006:5:90:5040:5040L:3.5f:3.5 +5000:4007:2:90:5063:5063L:2.0f:2.0 +5000:4008:5:90:5011:5011L:0.501190f:0.501190 +5000:4009:2:905:5037:5037L:905.503f:905.503 +5000:4010:5:908:5097:5097L:4010.5f:4010.5 +5000:4011:4:90:5041:5041L:7.4f:7.4 +5000:4012:2:90:5061:5061L:2.9f:2.9 +5000:4013:5:90:5000:5000L:0.500090f:0.500090 +5000:4014:4:904:5013:5013L:904.501f:904.501 +5000:4015:2:909:5010:5010L:4015.2f:4015.2 +5000:4016:2:90:5042:5042L:7.2f:7.2 +5000:4017:4:90:5050:5050L:4.0f:4.0 +5000:4018:2:91:5020:5020L:0.502091f:0.502091 +5000:4019:3:901:5066:5066L:901.506f:901.506 +5000:4020:4:901:5042:5042L:4020.4f:4020.4 +5000:4021:4:90:5009:5009L:8.4f:8.4 +5000:4022:1:90:5092:5092L:1.0f:1.0 +5000:4023:4:90:5004:5004L:0.500490f:0.500490 +5000:4024:4:906:5045:5045L:906.504f:906.504 +5000:4025:5:908:5033:5033L:4025.5f:4025.5 +5000:4026:1:90:5002:5002L:0.1f:0.1 +5000:4027:3:90:5007:5007L:3.8f:3.8 +5000:4028:5:90:5002:5002L:0.500290f:0.500290 +5000:4029:1:905:5019:5019L:905.501f:905.501 +5000:4030:5:903:5033:5033L:4030.5f:4030.5 +5000:4031:2:90:5012:5012L:0.2f:0.2 +5000:4032:2:90:5013:5013L:2.2f:2.2 +5000:4033:2:91:5097:5097L:0.509791f:0.509791 +5000:4034:2:908:5055:5055L:908.505f:908.505 +5000:4035:4:907:5034:5034L:4035.4f:4035.4 +5000:4036:1:90:5041:5041L:8.1f:8.1 +5000:4037:1:90:5015:5015L:1.2f:1.2 +5000:4038:1:90:5020:5020L:0.502090f:0.502090 +5000:4039:1:903:5069:5069L:903.506f:903.506 +5000:4040:2:901:5096:5096L:4040.2f:4040.2 +5000:4041:4:90:5100:5100L:4.4f:4.4 +5000:4042:5:90:5020:5020L:5.7f:5.7 +5000:4043:5:91:5020:5020L:0.502091f:0.502091 +5000:4044:5:902:5099:5099L:902.509f:902.509 +5000:4045:3:900:5070:5070L:4045.3f:4045.3 +5000:4046:5:90:5044:5044L:0.5f:0.5 +5000:4047:2:90:5064:5064L:2.2f:2.2 +5000:4048:3:90:5079:5079L:0.507990f:0.507990 +5000:4049:4:906:5009:5009L:906.500f:906.500 +5000:4050:2:910:5022:5022L:4050.2f:4050.2 +5000:4051:2:90:5059:5059L:7.2f:7.2 +5000:4052:2:90:5029:5029L:2.5f:2.5 +5000:4053:3:90:5025:5025L:0.502590f:0.502590 +5000:4054:4:904:5052:5052L:904.505f:904.505 +5000:4055:4:910:5053:5053L:4055.4f:4055.4 +5000:4056:2:90:5062:5062L:8.2f:8.2 +5000:4057:4:90:5081:5081L:4.0f:4.0 +5000:4058:3:90:5018:5018L:0.501890f:0.501890 +5000:4059:1:900:5075:5075L:900.507f:900.507 +5000:4060:2:903:5070:5070L:4060.2f:4060.2 +5000:4061:3:90:5037:5037L:6.3f:6.3 +5000:4062:1:90:5090:5090L:1.8f:1.8 +5000:4063:3:90:5039:5039L:0.503990f:0.503990 +5000:4064:4:910:5084:5084L:910.508f:910.508 +5000:4065:1:906:5077:5077L:4065.1f:4065.1 +5000:4066:4:90:5054:5054L:9.4f:9.4 +5000:4067:2:90:5056:5056L:2.7f:2.7 +5000:4068:1:90:5098:5098L:0.509890f:0.509890 +5000:4069:2:903:5000:5000L:903.500f:903.500 +5000:4070:1:906:5031:5031L:4070.1f:4070.1 +5000:4071:4:90:5089:5089L:1.4f:1.4 +5000:4072:1:90:5070:5070L:1.2f:1.2 +5000:4073:1:90:5097:5097L:0.509790f:0.509790 +5000:4074:3:903:5090:5090L:903.509f:903.509 +5000:4075:2:905:5046:5046L:4075.2f:4075.2 +5000:4076:1:90:5036:5036L:1.1f:1.1 +5000:4077:3:90:5004:5004L:3.5f:3.5 +5000:4078:1:90:5012:5012L:0.501290f:0.501290 +5000:4079:1:910:5041:5041L:910.504f:910.504 +5000:4080:1:900:5099:5099L:4080.1f:4080.1 +5000:4081:3:90:5008:5008L:8.3f:8.3 +5000:4082:2:90:5030:5030L:2.9f:2.9 +5000:4083:5:91:5092:5092L:0.509291f:0.509291 +5000:4084:5:903:5020:5020L:903.502f:903.502 +5000:4085:5:906:5068:5068L:4085.5f:4085.5 +5000:4086:2:90:5085:5085L:6.2f:6.2 +5000:4087:4:90:5035:5035L:4.1f:4.1 +5000:4088:4:90:5099:5099L:0.509990f:0.509990 +5000:4089:5:904:5094:5094L:904.509f:904.509 +5000:4090:2:905:5095:5095L:4090.2f:4090.2 +5000:4091:2:90:5071:5071L:9.2f:9.2 +5000:4092:2:90:5060:5060L:2.1f:2.1 +5000:4093:4:90:5052:5052L:0.505290f:0.505290 +5000:4094:3:901:5085:5085L:901.508f:901.508 +5000:4095:4:910:5043:5043L:4095.4f:4095.4 +5000:4096:3:90:5002:5002L:3.3f:3.3 +5000:4097:2:91:5018:5018L:2.0f:2.0 +5000:4098:4:90:5047:5047L:0.504790f:0.504790 +5000:4099:4:905:5085:5085L:905.508f:905.508 +5000:4100:3:908:5031:5031L:4100.3f:4100.3 +5000:4101:3:90:5019:5019L:0.3f:0.3 +5000:4102:2:90:5037:5037L:2.3f:2.3 +5000:4103:5:91:5053:5053L:0.505391f:0.505391 +5000:4104:2:905:5065:5065L:905.506f:905.506 +5000:4105:1:902:5062:5062L:4105.1f:4105.1 +5000:4106:3:90:5090:5090L:7.3f:7.3 +5000:4107:4:91:5086:5086L:4.0f:4.0 +5000:4108:5:90:5054:5054L:0.505490f:0.505490 +5000:4109:2:902:5005:5005L:902.500f:902.500 +5000:4110:1:908:5083:5083L:4110.1f:4110.1 +5000:4111:3:90:5085:5085L:2.3f:2.3 +5000:4112:4:90:5018:5018L:4.4f:4.4 +5000:4113:5:90:5014:5014L:0.501490f:0.501490 +5000:4114:3:906:5066:5066L:906.506f:906.506 +5000:4115:1:907:5091:5091L:4115.1f:4115.1 +5000:4116:4:90:5059:5059L:3.4f:3.4 +5000:4117:4:91:5054:5054L:4.0f:4.0 +5000:4118:3:90:5011:5011L:0.501190f:0.501190 +5000:4119:1:900:5030:5030L:900.503f:900.503 +5000:4120:1:901:5004:5004L:4120.1f:4120.1 +5000:4121:5:90:5028:5028L:6.5f:6.5 +5000:4122:5:90:5072:5072L:5.2f:5.2 +5000:4123:5:90:5096:5096L:0.509690f:0.509690 +5000:4124:1:907:5052:5052L:907.505f:907.505 +5000:4125:4:909:5024:5024L:4125.4f:4125.4 +5000:4126:4:90:5056:5056L:7.4f:7.4 +5000:4127:2:90:5050:5050L:2.3f:2.3 +5000:4128:5:90:5025:5025L:0.502590f:0.502590 +5000:4129:5:910:5027:5027L:910.502f:910.502 +5000:4130:2:900:5042:5042L:4130.2f:4130.2 +5000:4131:2:90:5099:5099L:0.2f:0.2 +5000:4132:3:90:5017:5017L:3.9f:3.9 +5000:4133:2:90:5036:5036L:0.503690f:0.503690 +5000:4134:2:910:5005:5005L:910.500f:910.500 +5000:4135:4:908:5092:5092L:4135.4f:4135.4 +5000:4136:1:90:5057:5057L:5.1f:5.1 +5000:4137:3:90:5090:5090L:3.8f:3.8 +5000:4138:1:90:5077:5077L:0.507790f:0.507790 +5000:4139:2:905:5071:5071L:905.507f:905.507 +5000:4140:3:908:5079:5079L:4140.3f:4140.3 +5000:4141:1:90:5083:5083L:0.1f:0.1 +5000:4142:5:90:5067:5067L:5.6f:5.6 +5000:4143:1:90:5051:5051L:0.505190f:0.505190 +5000:4144:3:901:5048:5048L:901.504f:901.504 +5000:4145:3:909:5024:5024L:4145.3f:4145.3 +5000:4146:3:90:5071:5071L:9.3f:9.3 +5000:4147:1:90:5046:5046L:1.4f:1.4 +5000:4148:5:90:5003:5003L:0.500390f:0.500390 +5000:4149:4:909:5055:5055L:909.505f:909.505 +5000:4150:3:904:5030:5030L:4150.3f:4150.3 +5000:4151:2:90:5034:5034L:4.2f:4.2 +5000:4152:1:90:5095:5095L:1.4f:1.4 +5000:4153:4:90:5084:5084L:0.508490f:0.508490 +5000:4154:2:901:5097:5097L:901.509f:901.509 +5000:4155:4:907:5086:5086L:4155.4f:4155.4 +5000:4156:5:90:5075:5075L:2.5f:2.5 +5000:4157:4:90:5020:5020L:4.3f:4.3 +5000:4158:1:90:5072:5072L:0.507290f:0.507290 +5000:4159:1:910:5056:5056L:910.505f:910.505 +5000:4160:4:904:5099:5099L:4160.4f:4160.4 +5000:4161:1:90:5043:5043L:7.1f:7.1 +5000:4162:2:90:5086:5086L:2.8f:2.8 +5000:4163:2:90:5046:5046L:0.504690f:0.504690 +5000:4164:1:907:5060:5060L:907.506f:907.506 +5000:4165:1:904:5031:5031L:4165.1f:4165.1 +5000:4166:5:90:5053:5053L:4.5f:4.5 +5000:4167:4:90:5082:5082L:4.0f:4.0 +5000:4168:5:90:5008:5008L:0.500890f:0.500890 +5000:4169:4:903:5007:5007L:903.500f:903.500 +5000:4170:1:900:5052:5052L:4170.1f:4170.1 +5000:4171:1:90:5019:5019L:0.1f:0.1 +5000:4172:3:90:5094:5094L:3.4f:3.4 +5000:4173:3:90:5040:5040L:0.504090f:0.504090 +5000:4174:5:909:5011:5011L:909.501f:909.501 +5000:4175:3:910:5053:5053L:4175.3f:4175.3 +5000:4176:5:91:5092:5092L:0.5f:0.5 +5000:4177:2:90:5097:5097L:2.6f:2.6 +5000:4178:1:90:5013:5013L:0.501390f:0.501390 +5000:4179:2:901:5047:5047L:901.504f:901.504 +5000:4180:2:903:5052:5052L:4180.2f:4180.2 +5000:4181:5:90:5057:5057L:5.5f:5.5 +5000:4182:1:90:5099:5099L:1.1f:1.1 +5000:4183:5:90:5069:5069L:0.506990f:0.506990 +5000:4184:2:905:5054:5054L:905.505f:905.505 +5000:4185:3:900:5049:5049L:4185.3f:4185.3 +5000:4186:1:90:5041:5041L:9.1f:9.1 +5000:4187:5:90:5004:5004L:5.2f:5.2 +5000:4188:5:90:5058:5058L:0.505890f:0.505890 +5000:4189:1:907:5075:5075L:907.507f:907.507 +5000:4190:3:900:5010:5010L:4190.3f:4190.3 +5000:4191:1:90:5063:5063L:9.1f:9.1 +5000:4192:4:91:5075:5075L:4.0f:4.0 +5000:4193:4:91:5033:5033L:0.503391f:0.503391 +5000:4194:2:903:5084:5084L:903.508f:903.508 +5000:4195:5:909:5087:5087L:4195.5f:4195.5 +5000:4196:2:90:5073:5073L:9.2f:9.2 +5000:4197:4:90:5095:5095L:4.9f:4.9 +5000:4198:4:90:5035:5035L:0.503590f:0.503590 +5000:4199:2:909:5003:5003L:909.500f:909.500 +5000:4200:1:903:5004:5004L:4200.1f:4200.1 +5000:4201:2:90:5094:5094L:4.2f:4.2 +5000:4202:5:90:5088:5088L:5.0f:5.0 +5000:4203:4:90:5082:5082L:0.508290f:0.508290 +5000:4204:5:910:5016:5016L:910.501f:910.501 +5000:4205:4:908:5001:5001L:4205.4f:4205.4 +5000:4206:4:90:5091:5091L:1.4f:1.4 +5000:4207:2:90:5075:5075L:2.9f:2.9 +5000:4208:2:90:5051:5051L:0.505190f:0.505190 +5000:4209:4:900:5033:5033L:900.503f:900.503 +5000:4210:4:901:5069:5069L:4210.4f:4210.4 +5000:4211:4:90:5009:5009L:3.4f:3.4 +5000:4212:4:90:5012:5012L:4.2f:4.2 +5000:4213:3:90:5076:5076L:0.507690f:0.507690 +5000:4214:2:908:5070:5070L:908.507f:908.507 +5000:4215:3:905:5047:5047L:4215.3f:4215.3 +5000:4216:3:90:5057:5057L:2.3f:2.3 +5000:4217:3:90:5042:5042L:3.6f:3.6 +5000:4218:1:90:5005:5005L:0.500590f:0.500590 +5000:4219:4:905:5006:5006L:905.500f:905.500 +5000:4220:1:902:5020:5020L:4220.1f:4220.1 +5000:4221:4:91:5057:5057L:0.4f:0.4 +5000:4222:5:90:5079:5079L:5.7f:5.7 +5000:4223:5:90:5061:5061L:0.506190f:0.506190 +5000:4224:4:906:5037:5037L:906.503f:906.503 +5000:4225:3:901:5092:5092L:4225.3f:4225.3 +5000:4226:5:90:5009:5009L:7.5f:7.5 +5000:4227:3:90:5065:5065L:3.1f:3.1 +5000:4228:5:90:5050:5050L:0.505090f:0.505090 +5000:4229:5:900:5002:5002L:900.500f:900.500 +5000:4230:5:900:5025:5025L:4230.5f:4230.5 +5000:4231:1:90:5022:5022L:8.1f:8.1 +5000:4232:4:90:5087:5087L:4.6f:4.6 +5000:4233:3:90:5006:5006L:0.500690f:0.500690 +5000:4234:1:903:5065:5065L:903.506f:903.506 +5000:4235:3:907:5076:5076L:4235.3f:4235.3 +5000:4236:3:90:5041:5041L:6.3f:6.3 +5000:4237:3:90:5051:5051L:3.0f:3.0 +5000:4238:1:90:5081:5081L:0.508190f:0.508190 +5000:4239:4:908:5081:5081L:908.508f:908.508 +5000:4240:4:908:5086:5086L:4240.4f:4240.4 +5000:4241:5:91:5065:5065L:0.5f:0.5 +5000:4242:1:90:5026:5026L:1.8f:1.8 +5000:4243:1:90:5084:5084L:0.508490f:0.508490 +5000:4244:1:904:5011:5011L:904.501f:904.501 +5000:4245:4:910:5081:5081L:4245.4f:4245.4 +5000:4246:3:90:5038:5038L:4.3f:4.3 +5000:4247:5:91:5039:5039L:5.0f:5.0 +5000:4248:3:90:5027:5027L:0.502790f:0.502790 +5000:4249:2:908:5008:5008L:908.500f:908.500 +5000:4250:1:905:5088:5088L:4250.1f:4250.1 +5000:4251:5:90:5088:5088L:5.5f:5.5 +5000:4252:3:90:5064:5064L:3.7f:3.7 +5000:4253:5:90:5094:5094L:0.509490f:0.509490 +5000:4254:4:908:5039:5039L:908.503f:908.503 +5000:4255:4:906:5036:5036L:4255.4f:4255.4 +5000:4256:3:90:5078:5078L:0.3f:0.3 +5000:4257:5:91:5072:5072L:5.0f:5.0 +5000:4258:2:90:5085:5085L:0.508590f:0.508590 +5000:4259:4:907:5065:5065L:907.506f:907.506 +5000:4260:4:907:5015:5015L:4260.4f:4260.4 +5000:4261:3:90:5063:5063L:6.3f:6.3 +5000:4262:3:90:5028:5028L:3.1f:3.1 +5000:4263:1:91:5098:5098L:0.509891f:0.509891 +5000:4264:1:906:5078:5078L:906.507f:906.507 +5000:4265:3:903:5035:5035L:4265.3f:4265.3 +5000:4266:4:90:5042:5042L:9.4f:9.4 +5000:4267:3:90:5042:5042L:3.9f:3.9 +5000:4268:2:90:5084:5084L:0.508490f:0.508490 +5000:4269:1:908:5049:5049L:908.504f:908.504 +5000:4270:4:905:5018:5018L:4270.4f:4270.4 +5000:4271:5:90:5077:5077L:0.5f:0.5 +5000:4272:3:90:5091:5091L:3.5f:3.5 +5000:4273:5:90:5085:5085L:0.508590f:0.508590 +5000:4274:4:906:5043:5043L:906.504f:906.504 +5000:4275:3:900:5077:5077L:4275.3f:4275.3 +5000:4276:5:90:5067:5067L:8.5f:8.5 +5000:4277:2:90:5051:5051L:2.3f:2.3 +5000:4278:4:90:5070:5070L:0.507090f:0.507090 +5000:4279:3:907:5049:5049L:907.504f:907.504 +5000:4280:1:905:5098:5098L:4280.1f:4280.1 +5000:4281:2:90:5004:5004L:4.2f:4.2 +5000:4282:1:91:5056:5056L:1.0f:1.0 +5000:4283:5:90:5016:5016L:0.501690f:0.501690 +5000:4284:4:905:5079:5079L:905.507f:905.507 +5000:4285:2:901:5083:5083L:4285.2f:4285.2 +5000:4286:5:90:5063:5063L:0.5f:0.5 +5000:4287:4:90:5098:5098L:4.3f:4.3 +5000:4288:1:90:5059:5059L:0.505990f:0.505990 +5000:4289:5:907:5032:5032L:907.503f:907.503 +5000:4290:2:908:5080:5080L:4290.2f:4290.2 +5000:4291:2:90:5018:5018L:0.2f:0.2 +5000:4292:2:90:5011:5011L:2.1f:2.1 +5000:4293:5:90:5086:5086L:0.508690f:0.508690 +5000:4294:1:909:5039:5039L:909.503f:909.503 +5000:4295:5:900:5049:5049L:4295.5f:4295.5 +5000:4296:4:90:5051:5051L:0.4f:0.4 +5000:4297:2:90:5088:5088L:2.8f:2.8 +5000:4298:2:90:5100:5100L:0.510090f:0.510090 +5000:4299:5:908:5071:5071L:908.507f:908.507 +5000:4300:2:901:5051:5051L:4300.2f:4300.2 +5000:4301:1:90:5058:5058L:4.1f:4.1 +5000:4302:2:90:5069:5069L:2.9f:2.9 +5000:4303:2:90:5075:5075L:0.507590f:0.507590 +5000:4304:1:909:5061:5061L:909.506f:909.506 +5000:4305:3:908:5069:5069L:4305.3f:4305.3 +5000:4306:1:90:5076:5076L:5.1f:5.1 +5000:4307:3:90:5048:5048L:3.8f:3.8 +5000:4308:3:90:5038:5038L:0.503890f:0.503890 +5000:4309:3:900:5015:5015L:900.501f:900.501 +5000:4310:1:902:5027:5027L:4310.1f:4310.1 +5000:4311:4:90:5073:5073L:2.4f:2.4 +5000:4312:2:90:5056:5056L:2.5f:2.5 +5000:4313:5:90:5032:5032L:0.503290f:0.503290 +5000:4314:4:910:5019:5019L:910.501f:910.501 +5000:4315:2:905:5095:5095L:4315.2f:4315.2 +5000:4316:5:90:5041:5041L:6.5f:6.5 +5000:4317:4:90:5022:5022L:4.1f:4.1 +5000:4318:2:90:5033:5033L:0.503390f:0.503390 +5000:4319:3:900:5036:5036L:900.503f:900.503 +5000:4320:4:902:5060:5060L:4320.4f:4320.4 +5000:4321:1:90:5087:5087L:9.1f:9.1 +5000:4322:4:90:5033:5033L:4.0f:4.0 +5000:4323:2:91:5011:5011L:0.501191f:0.501191 +5000:4324:4:907:5008:5008L:907.500f:907.500 +5000:4325:4:910:5061:5061L:4325.4f:4325.4 +5000:4326:4:90:5020:5020L:9.4f:9.4 +5000:4327:1:90:5037:5037L:1.6f:1.6 +5000:4328:2:90:5100:5100L:0.510090f:0.510090 +5000:4329:4:904:5004:5004L:904.500f:904.500 +5000:4330:1:901:5025:5025L:4330.1f:4330.1 +5000:4331:4:90:5010:5010L:1.4f:1.4 +5000:4332:3:90:5018:5018L:3.9f:3.9 +5000:4333:5:90:5017:5017L:0.501790f:0.501790 +5000:4334:5:908:5085:5085L:908.508f:908.508 +5000:4335:1:906:5079:5079L:4335.1f:4335.1 +5000:4336:4:90:5070:5070L:3.4f:3.4 +5000:4337:5:90:5032:5032L:5.4f:5.4 +5000:4338:2:90:5014:5014L:0.501490f:0.501490 +5000:4339:2:905:5055:5055L:905.505f:905.505 +5000:4340:2:906:5069:5069L:4340.2f:4340.2 +5000:4341:3:90:5084:5084L:2.3f:2.3 +5000:4342:4:90:5070:5070L:4.8f:4.8 +5000:4343:5:90:5086:5086L:0.508690f:0.508690 +5000:4344:1:906:5061:5061L:906.506f:906.506 +5000:4345:5:907:5015:5015L:4345.5f:4345.5 +5000:4346:4:90:5044:5044L:3.4f:3.4 +5000:4347:2:90:5088:5088L:2.2f:2.2 +5000:4348:4:90:5068:5068L:0.506890f:0.506890 +5000:4349:4:908:5019:5019L:908.501f:908.501 +5000:4350:2:900:5077:5077L:4350.2f:4350.2 +5000:4351:1:90:5000:5000L:6.1f:6.1 +5000:4352:5:90:5078:5078L:5.2f:5.2 +5000:4353:3:90:5041:5041L:0.504190f:0.504190 +5000:4354:3:900:5002:5002L:900.500f:900.500 +5000:4355:1:909:5070:5070L:4355.1f:4355.1 +5000:4356:1:90:5004:5004L:5.1f:5.1 +5000:4357:4:90:5027:5027L:4.9f:4.9 +5000:4358:3:90:5076:5076L:0.507690f:0.507690 +5000:4359:1:903:5049:5049L:903.504f:903.504 +5000:4360:2:907:5052:5052L:4360.2f:4360.2 +5000:4361:1:90:5009:5009L:7.1f:7.1 +5000:4362:1:90:5032:5032L:1.6f:1.6 +5000:4363:5:90:5037:5037L:0.503790f:0.503790 +5000:4364:2:906:5042:5042L:906.504f:906.504 +5000:4365:2:906:5032:5032L:4365.2f:4365.2 +5000:4366:1:90:5087:5087L:8.1f:8.1 +5000:4367:1:90:5075:5075L:1.4f:1.4 +5000:4368:2:90:5027:5027L:0.502790f:0.502790 +5000:4369:1:900:5060:5060L:900.506f:900.506 +5000:4370:4:904:5027:5027L:4370.4f:4370.4 +5000:4371:1:90:5099:5099L:6.1f:6.1 +5000:4372:2:90:5057:5057L:2.7f:2.7 +5000:4373:3:90:5073:5073L:0.507390f:0.507390 +5000:4374:5:910:5030:5030L:910.503f:910.503 +5000:4375:2:903:5092:5092L:4375.2f:4375.2 +5000:4376:4:90:5072:5072L:4.4f:4.4 +5000:4377:3:90:5012:5012L:3.5f:3.5 +5000:4378:2:90:5003:5003L:0.500390f:0.500390 +5000:4379:3:910:5010:5010L:910.501f:910.501 +5000:4380:1:906:5055:5055L:4380.1f:4380.1 +5000:4381:3:90:5012:5012L:7.3f:7.3 +5000:4382:3:91:5083:5083L:3.0f:3.0 +5000:4383:5:90:5046:5046L:0.504690f:0.504690 +5000:4384:4:904:5042:5042L:904.504f:904.504 +5000:4385:1:908:5074:5074L:4385.1f:4385.1 +5000:4386:5:90:5009:5009L:5.5f:5.5 +5000:4387:4:90:5056:5056L:4.0f:4.0 +5000:4388:4:90:5039:5039L:0.503990f:0.503990 +5000:4389:5:909:5035:5035L:909.503f:909.503 +5000:4390:5:910:5094:5094L:4390.5f:4390.5 +5000:4391:3:90:5067:5067L:4.3f:4.3 +5000:4392:3:90:5063:5063L:3.9f:3.9 +5000:4393:3:90:5014:5014L:0.501490f:0.501490 +5000:4394:5:905:5058:5058L:905.505f:905.505 +5000:4395:2:905:5036:5036L:4395.2f:4395.2 +5000:4396:1:90:5083:5083L:5.1f:5.1 +5000:4397:1:90:5083:5083L:1.1f:1.1 +5000:4398:4:90:5010:5010L:0.501090f:0.501090 +5000:4399:1:907:5096:5096L:907.509f:907.509 +5000:4400:3:906:5095:5095L:4400.3f:4400.3 +5000:4401:2:90:5038:5038L:0.2f:0.2 +5000:4402:1:90:5021:5021L:1.7f:1.7 +5000:4403:4:90:5003:5003L:0.500390f:0.500390 +5000:4404:5:910:5055:5055L:910.505f:910.505 +5000:4405:2:902:5008:5008L:4405.2f:4405.2 +5000:4406:4:90:5055:5055L:2.4f:2.4 +5000:4407:3:90:5066:5066L:3.4f:3.4 +5000:4408:2:90:5054:5054L:0.505490f:0.505490 +5000:4409:3:901:5022:5022L:901.502f:901.502 +5000:4410:3:906:5083:5083L:4410.3f:4410.3 +5000:4411:2:91:5090:5090L:0.2f:0.2 +5000:4412:4:91:5054:5054L:4.0f:4.0 +5000:4413:5:90:5060:5060L:0.506090f:0.506090 +5000:4414:1:904:5053:5053L:904.505f:904.505 +5000:4415:3:909:5075:5075L:4415.3f:4415.3 +5000:4416:4:90:5000:5000L:6.4f:6.4 +5000:4417:2:90:5038:5038L:2.1f:2.1 +5000:4418:5:90:5044:5044L:0.504490f:0.504490 +5000:4419:3:900:5057:5057L:900.505f:900.505 +5000:4420:4:905:5014:5014L:4420.4f:4420.4 +5000:4421:3:90:5008:5008L:9.3f:9.3 +5000:4422:2:90:5005:5005L:2.7f:2.7 +5000:4423:5:90:5070:5070L:0.507090f:0.507090 +5000:4424:3:907:5013:5013L:907.501f:907.501 +5000:4425:1:902:5096:5096L:4425.1f:4425.1 +5000:4426:4:90:5052:5052L:9.4f:9.4 +5000:4427:4:90:5065:5065L:4.1f:4.1 +5000:4428:1:91:5017:5017L:0.501791f:0.501791 +5000:4429:3:904:5019:5019L:904.501f:904.501 +5000:4430:1:900:5066:5066L:4430.1f:4430.1 +5000:4431:2:90:5053:5053L:5.2f:5.2 +5000:4432:2:90:5017:5017L:2.9f:2.9 +5000:4433:3:90:5080:5080L:0.508090f:0.508090 +5000:4434:1:902:5045:5045L:902.504f:902.504 +5000:4435:2:902:5068:5068L:4435.2f:4435.2 +5000:4436:2:90:5057:5057L:0.2f:0.2 +5000:4437:4:90:5067:5067L:4.8f:4.8 +5000:4438:3:91:5064:5064L:0.506491f:0.506491 +5000:4439:3:906:5000:5000L:906.500f:906.500 +5000:4440:4:908:5001:5001L:4440.4f:4440.4 +5000:4441:3:90:5048:5048L:0.3f:0.3 +5000:4442:5:90:5030:5030L:5.4f:5.4 +5000:4443:1:90:5003:5003L:0.500390f:0.500390 +5000:4444:5:900:5025:5025L:900.502f:900.502 +5000:4445:2:903:5051:5051L:4445.2f:4445.2 +5000:4446:1:90:5054:5054L:6.1f:6.1 +5000:4447:4:90:5035:5035L:4.3f:4.3 +5000:4448:2:90:5032:5032L:0.503290f:0.503290 +5000:4449:5:903:5090:5090L:903.509f:903.509 +5000:4450:5:900:5064:5064L:4450.5f:4450.5 +5000:4451:5:90:5069:5069L:5.5f:5.5 +5000:4452:3:90:5013:5013L:3.5f:3.5 +5000:4453:4:90:5003:5003L:0.500390f:0.500390 +5000:4454:4:906:5007:5007L:906.500f:906.500 +5000:4455:1:910:5039:5039L:4455.1f:4455.1 +5000:4456:3:90:5094:5094L:0.3f:0.3 +5000:4457:1:90:5024:5024L:1.7f:1.7 +5000:4458:3:91:5096:5096L:0.509691f:0.509691 +5000:4459:4:910:5024:5024L:910.502f:910.502 +5000:4460:4:909:5030:5030L:4460.4f:4460.4 +5000:4461:2:90:5081:5081L:9.2f:9.2 +5000:4462:5:90:5028:5028L:5.3f:5.3 +5000:4463:1:90:5090:5090L:0.509090f:0.509090 +5000:4464:1:909:5044:5044L:909.504f:909.504 +5000:4465:2:909:5038:5038L:4465.2f:4465.2 +5000:4466:4:90:5040:5040L:4.4f:4.4 +5000:4467:3:90:5005:5005L:3.5f:3.5 +5000:4468:5:91:5001:5001L:0.500191f:0.500191 +5000:4469:4:908:5093:5093L:908.509f:908.509 +5000:4470:5:904:5080:5080L:4470.5f:4470.5 +5000:4471:2:90:5064:5064L:7.2f:7.2 +5000:4472:1:90:5093:5093L:1.7f:1.7 +5000:4473:2:90:5098:5098L:0.509890f:0.509890 +5000:4474:2:910:5082:5082L:910.508f:910.508 +5000:4475:4:902:5070:5070L:4475.4f:4475.4 +5000:4476:1:90:5012:5012L:9.1f:9.1 +5000:4477:3:90:5065:5065L:3.4f:3.4 +5000:4478:3:90:5061:5061L:0.506190f:0.506190 +5000:4479:3:910:5033:5033L:910.503f:910.503 +5000:4480:3:910:5073:5073L:4480.3f:4480.3 +5000:4481:2:90:5042:5042L:2.2f:2.2 +5000:4482:5:90:5011:5011L:5.3f:5.3 +5000:4483:5:90:5093:5093L:0.509390f:0.509390 +5000:4484:5:900:5090:5090L:900.509f:900.509 +5000:4485:4:908:5010:5010L:4485.4f:4485.4 +5000:4486:2:90:5094:5094L:9.2f:9.2 +5000:4487:3:90:5032:5032L:3.4f:3.4 +5000:4488:1:91:5051:5051L:0.505191f:0.505191 +5000:4489:4:905:5045:5045L:905.504f:905.504 +5000:4490:1:900:5040:5040L:4490.1f:4490.1 +5000:4491:5:90:5065:5065L:4.5f:4.5 +5000:4492:2:90:5001:5001L:2.3f:2.3 +5000:4493:2:90:5077:5077L:0.507790f:0.507790 +5000:4494:2:900:5081:5081L:900.508f:900.508 +5000:4495:1:907:5058:5058L:4495.1f:4495.1 +5000:4496:2:90:5047:5047L:0.2f:0.2 +5000:4497:2:90:5088:5088L:2.6f:2.6 +5000:4498:3:90:5084:5084L:0.508490f:0.508490 +5000:4499:1:905:5038:5038L:905.503f:905.503 +5000:4500:3:905:5044:5044L:4500.3f:4500.3 +5000:4501:5:90:5081:5081L:3.5f:3.5 +5000:4502:3:90:5011:5011L:3.6f:3.6 +5000:4503:3:91:5031:5031L:0.503191f:0.503191 +5000:4504:2:902:5036:5036L:902.503f:902.503 +5000:4505:1:904:5008:5008L:4505.1f:4505.1 +5000:4506:4:90:5016:5016L:7.4f:7.4 +5000:4507:1:90:5075:5075L:1.9f:1.9 +5000:4508:1:90:5046:5046L:0.504690f:0.504690 +5000:4509:5:904:5093:5093L:904.509f:904.509 +5000:4510:2:910:5046:5046L:4510.2f:4510.2 +5000:4511:4:90:5082:5082L:8.4f:8.4 +5000:4512:3:90:5040:5040L:3.3f:3.3 +5000:4513:4:90:5032:5032L:0.503290f:0.503290 +5000:4514:5:902:5053:5053L:902.505f:902.505 +5000:4515:2:903:5090:5090L:4515.2f:4515.2 +5000:4516:2:90:5055:5055L:0.2f:0.2 +5000:4517:3:90:5041:5041L:3.2f:3.2 +5000:4518:2:90:5081:5081L:0.508190f:0.508190 +5000:4519:4:901:5022:5022L:901.502f:901.502 +5000:4520:4:905:5013:5013L:4520.4f:4520.4 +5000:4521:1:90:5095:5095L:1.1f:1.1 +5000:4522:5:90:5028:5028L:5.7f:5.7 +5000:4523:2:90:5017:5017L:0.501790f:0.501790 +5000:4524:4:902:5038:5038L:902.503f:902.503 +5000:4525:2:906:5072:5072L:4525.2f:4525.2 +5000:4526:1:91:5077:5077L:0.1f:0.1 +5000:4527:4:90:5100:5100L:4.5f:4.5 +5000:4528:1:90:5028:5028L:0.502890f:0.502890 +5000:4529:5:906:5046:5046L:906.504f:906.504 +5000:4530:1:902:5092:5092L:4530.1f:4530.1 +5000:4531:2:90:5008:5008L:4.2f:4.2 +5000:4532:1:90:5077:5077L:1.4f:1.4 +5000:4533:3:90:5008:5008L:0.500890f:0.500890 +5000:4534:4:904:5035:5035L:904.503f:904.503 +5000:4535:1:906:5092:5092L:4535.1f:4535.1 +5000:4536:4:90:5087:5087L:8.4f:8.4 +5000:4537:3:90:5037:5037L:3.4f:3.4 +5000:4538:3:90:5016:5016L:0.501690f:0.501690 +5000:4539:4:903:5073:5073L:903.507f:903.507 +5000:4540:2:905:5098:5098L:4540.2f:4540.2 +5000:4541:1:90:5038:5038L:7.1f:7.1 +5000:4542:2:90:5075:5075L:2.9f:2.9 +5000:4543:1:90:5048:5048L:0.504890f:0.504890 +5000:4544:1:900:5089:5089L:900.508f:900.508 +5000:4545:3:900:5052:5052L:4545.3f:4545.3 +5000:4546:2:90:5025:5025L:8.2f:8.2 +5000:4547:2:90:5066:5066L:2.3f:2.3 +5000:4548:3:90:5013:5013L:0.501390f:0.501390 +5000:4549:4:906:5050:5050L:906.505f:906.505 +5000:4550:3:909:5096:5096L:4550.3f:4550.3 +5000:4551:3:90:5067:5067L:0.3f:0.3 +5000:4552:5:90:5056:5056L:5.2f:5.2 +5000:4553:3:90:5093:5093L:0.509390f:0.509390 +5000:4554:1:903:5094:5094L:903.509f:903.509 +5000:4555:5:908:5098:5098L:4555.5f:4555.5 +5000:4556:3:90:5076:5076L:1.3f:1.3 +5000:4557:4:90:5005:5005L:4.4f:4.4 +5000:4558:2:91:5086:5086L:0.508691f:0.508691 +5000:4559:3:908:5045:5045L:908.504f:908.504 +5000:4560:1:902:5028:5028L:4560.1f:4560.1 +5000:4561:5:90:5029:5029L:7.5f:7.5 +5000:4562:4:90:5054:5054L:4.5f:4.5 +5000:4563:2:90:5080:5080L:0.508090f:0.508090 +5000:4564:1:902:5014:5014L:902.501f:902.501 +5000:4565:1:901:5095:5095L:4565.1f:4565.1 +5000:4566:1:90:5010:5010L:7.1f:7.1 +5000:4567:5:90:5048:5048L:5.4f:5.4 +5000:4568:5:90:5046:5046L:0.504690f:0.504690 +5000:4569:4:903:5018:5018L:903.501f:903.501 +5000:4570:1:903:5041:5041L:4570.1f:4570.1 +5000:4571:3:90:5009:5009L:3.3f:3.3 +5000:4572:4:91:5064:5064L:4.0f:4.0 +5000:4573:2:90:5077:5077L:0.507790f:0.507790 +5000:4574:1:903:5099:5099L:903.509f:903.509 +5000:4575:2:904:5015:5015L:4575.2f:4575.2 +5000:4576:1:90:5081:5081L:5.1f:5.1 +5000:4577:2:90:5020:5020L:2.3f:2.3 +5000:4578:4:90:5100:5100L:0.510090f:0.510090 +5000:4579:2:909:5031:5031L:909.503f:909.503 +5000:4580:2:900:5067:5067L:4580.2f:4580.2 +5000:4581:4:90:5000:5000L:5.4f:5.4 +5000:4582:5:90:5000:5000L:5.2f:5.2 +5000:4583:3:90:5022:5022L:0.502290f:0.502290 +5000:4584:2:906:5059:5059L:906.505f:906.505 +5000:4585:2:908:5002:5002L:4585.2f:4585.2 +5000:4586:3:91:5052:5052L:0.3f:0.3 +5000:4587:2:90:5081:5081L:2.2f:2.2 +5000:4588:3:91:5097:5097L:0.509791f:0.509791 +5000:4589:3:901:5083:5083L:901.508f:901.508 +5000:4590:4:905:5086:5086L:4590.4f:4590.4 +5000:4591:3:90:5033:5033L:3.3f:3.3 +5000:4592:3:90:5054:5054L:3.2f:3.2 +5000:4593:3:90:5002:5002L:0.500290f:0.500290 +5000:4594:4:900:5057:5057L:900.505f:900.505 +5000:4595:2:903:5033:5033L:4595.2f:4595.2 +5000:4596:2:90:5025:5025L:8.2f:8.2 +5000:4597:4:90:5044:5044L:4.0f:4.0 +5000:4598:3:90:5037:5037L:0.503790f:0.503790 +5000:4599:3:909:5051:5051L:909.505f:909.505 +5000:4600:2:907:5003:5003L:4600.2f:4600.2 +5000:4601:2:90:5036:5036L:0.2f:0.2 +5000:4602:3:90:5058:5058L:3.5f:3.5 +5000:4603:1:91:5032:5032L:0.503291f:0.503291 +5000:4604:1:906:5037:5037L:906.503f:906.503 +5000:4605:4:908:5070:5070L:4605.4f:4605.4 +5000:4606:1:90:5046:5046L:0.1f:0.1 +5000:4607:2:90:5046:5046L:2.9f:2.9 +5000:4608:4:90:5092:5092L:0.509290f:0.509290 +5000:4609:1:900:5081:5081L:900.508f:900.508 +5000:4610:4:904:5046:5046L:4610.4f:4610.4 +5000:4611:4:90:5052:5052L:7.4f:7.4 +5000:4612:1:90:5001:5001L:1.2f:1.2 +5000:4613:4:90:5094:5094L:0.509490f:0.509490 +5000:4614:5:905:5052:5052L:905.505f:905.505 +5000:4615:2:901:5033:5033L:4615.2f:4615.2 +5000:4616:5:90:5042:5042L:2.5f:2.5 +5000:4617:3:90:5028:5028L:3.5f:3.5 +5000:4618:5:90:5075:5075L:0.507590f:0.507590 +5000:4619:5:904:5076:5076L:904.507f:904.507 +5000:4620:4:910:5016:5016L:4620.4f:4620.4 +5000:4621:1:90:5081:5081L:7.1f:7.1 +5000:4622:4:90:5002:5002L:4.7f:4.7 +5000:4623:4:90:5036:5036L:0.503690f:0.503690 +5000:4624:3:902:5083:5083L:902.508f:902.508 +5000:4625:1:905:5000:5000L:4625.1f:4625.1 +5000:4626:3:90:5022:5022L:5.3f:5.3 +5000:4627:5:91:5075:5075L:5.0f:5.0 +5000:4628:1:90:5000:5000L:0.500090f:0.500090 +5000:4629:5:907:5037:5037L:907.503f:907.503 +5000:4630:4:903:5036:5036L:4630.4f:4630.4 +5000:4631:4:90:5001:5001L:4.4f:4.4 +5000:4632:4:90:5069:5069L:4.0f:4.0 +5000:4633:4:90:5097:5097L:0.509790f:0.509790 +5000:4634:5:902:5017:5017L:902.501f:902.501 +5000:4635:5:903:5067:5067L:4635.5f:4635.5 +5000:4636:5:90:5015:5015L:8.5f:8.5 +5000:4637:1:90:5009:5009L:1.6f:1.6 +5000:4638:4:90:5094:5094L:0.509490f:0.509490 +5000:4639:4:906:5061:5061L:906.506f:906.506 +5000:4640:1:902:5093:5093L:4640.1f:4640.1 +5000:4641:3:90:5034:5034L:0.3f:0.3 +5000:4642:3:90:5038:5038L:3.7f:3.7 +5000:4643:2:90:5005:5005L:0.500590f:0.500590 +5000:4644:1:902:5031:5031L:902.503f:902.503 +5000:4645:2:900:5065:5065L:4645.2f:4645.2 +5000:4646:1:91:5042:5042L:0.1f:0.1 +5000:4647:1:91:5004:5004L:1.0f:1.0 +5000:4648:2:90:5079:5079L:0.507990f:0.507990 +5000:4649:2:906:5041:5041L:906.504f:906.504 +5000:4650:5:907:5067:5067L:4650.5f:4650.5 +5000:4651:4:90:5072:5072L:2.4f:2.4 +5000:4652:1:90:5037:5037L:1.8f:1.8 +5000:4653:3:91:5066:5066L:0.506691f:0.506691 +5000:4654:3:901:5093:5093L:901.509f:901.509 +5000:4655:5:905:5001:5001L:4655.5f:4655.5 +5000:4656:3:90:5093:5093L:5.3f:5.3 +5000:4657:5:90:5089:5089L:5.7f:5.7 +5000:4658:5:91:5065:5065L:0.506591f:0.506591 +5000:4659:4:902:5019:5019L:902.501f:902.501 +5000:4660:1:900:5091:5091L:4660.1f:4660.1 +5000:4661:5:90:5013:5013L:8.5f:8.5 +5000:4662:3:90:5090:5090L:3.9f:3.9 +5000:4663:5:90:5088:5088L:0.508890f:0.508890 +5000:4664:3:909:5003:5003L:909.500f:909.500 +5000:4665:3:908:5055:5055L:4665.3f:4665.3 +5000:4666:3:90:5009:5009L:2.3f:2.3 +5000:4667:3:90:5082:5082L:3.1f:3.1 +5000:4668:2:90:5081:5081L:0.508190f:0.508190 +5000:4669:5:909:5001:5001L:909.500f:909.500 +5000:4670:1:900:5003:5003L:4670.1f:4670.1 +5000:4671:1:90:5081:5081L:9.1f:9.1 +5000:4672:2:90:5068:5068L:2.4f:2.4 +5000:4673:1:90:5002:5002L:0.500290f:0.500290 +5000:4674:5:910:5091:5091L:910.509f:910.509 +5000:4675:1:904:5064:5064L:4675.1f:4675.1 +5000:4676:3:91:5087:5087L:0.3f:0.3 +5000:4677:4:90:5000:5000L:4.4f:4.4 +5000:4678:3:90:5011:5011L:0.501190f:0.501190 +5000:4679:2:908:5097:5097L:908.509f:908.509 +5000:4680:2:910:5099:5099L:4680.2f:4680.2 +5000:4681:2:90:5084:5084L:0.2f:0.2 +5000:4682:1:90:5024:5024L:1.2f:1.2 +5000:4683:5:90:5058:5058L:0.505890f:0.505890 +5000:4684:5:903:5049:5049L:903.504f:903.504 +5000:4685:4:903:5092:5092L:4685.4f:4685.4 +5000:4686:3:90:5087:5087L:9.3f:9.3 +5000:4687:2:90:5027:5027L:2.6f:2.6 +5000:4688:2:90:5002:5002L:0.500290f:0.500290 +5000:4689:2:903:5077:5077L:903.507f:903.507 +5000:4690:2:907:5070:5070L:4690.2f:4690.2 +5000:4691:2:90:5071:5071L:0.2f:0.2 +5000:4692:1:90:5094:5094L:1.1f:1.1 +5000:4693:3:91:5027:5027L:0.502791f:0.502791 +5000:4694:5:909:5059:5059L:909.505f:909.505 +5000:4695:3:906:5093:5093L:4695.3f:4695.3 +5000:4696:2:90:5084:5084L:0.2f:0.2 +5000:4697:2:90:5041:5041L:2.3f:2.3 +5000:4698:3:90:5047:5047L:0.504790f:0.504790 +5000:4699:3:910:5083:5083L:910.508f:910.508 +5000:4700:2:903:5048:5048L:4700.2f:4700.2 +5000:4701:1:90:5049:5049L:6.1f:6.1 +5000:4702:4:90:5065:5065L:4.8f:4.8 +5000:4703:4:90:5064:5064L:0.506490f:0.506490 +5000:4704:5:902:5049:5049L:902.504f:902.504 +5000:4705:3:907:5010:5010L:4705.3f:4705.3 +5000:4706:3:90:5012:5012L:1.3f:1.3 +5000:4707:2:90:5041:5041L:2.3f:2.3 +5000:4708:4:90:5097:5097L:0.509790f:0.509790 +5000:4709:1:904:5092:5092L:904.509f:904.509 +5000:4710:1:908:5020:5020L:4710.1f:4710.1 +5000:4711:3:90:5084:5084L:8.3f:8.3 +5000:4712:5:90:5064:5064L:5.6f:5.6 +5000:4713:4:90:5087:5087L:0.508790f:0.508790 +5000:4714:2:901:5008:5008L:901.500f:901.500 +5000:4715:4:907:5079:5079L:4715.4f:4715.4 +5000:4716:5:90:5089:5089L:2.5f:2.5 +5000:4717:5:90:5024:5024L:5.5f:5.5 +5000:4718:2:90:5013:5013L:0.501390f:0.501390 +5000:4719:2:904:5058:5058L:904.505f:904.505 +5000:4720:2:904:5037:5037L:4720.2f:4720.2 +5000:4721:3:90:5018:5018L:9.3f:9.3 +5000:4722:2:90:5075:5075L:2.9f:2.9 +5000:4723:5:90:5098:5098L:0.509890f:0.509890 +5000:4724:5:908:5015:5015L:908.501f:908.501 +5000:4725:5:905:5088:5088L:4725.5f:4725.5 +5000:4726:4:90:5006:5006L:3.4f:3.4 +5000:4727:3:90:5055:5055L:3.3f:3.3 +5000:4728:5:90:5075:5075L:0.507590f:0.507590 +5000:4729:5:901:5012:5012L:901.501f:901.501 +5000:4730:3:904:5051:5051L:4730.3f:4730.3 +5000:4731:5:90:5038:5038L:9.5f:9.5 +5000:4732:1:90:5023:5023L:1.1f:1.1 +5000:4733:5:90:5070:5070L:0.507090f:0.507090 +5000:4734:5:910:5044:5044L:910.504f:910.504 +5000:4735:5:909:5094:5094L:4735.5f:4735.5 +5000:4736:5:90:5028:5028L:6.5f:6.5 +5000:4737:5:90:5062:5062L:5.1f:5.1 +5000:4738:3:91:5036:5036L:0.503691f:0.503691 +5000:4739:1:910:5046:5046L:910.504f:910.504 +5000:4740:2:905:5084:5084L:4740.2f:4740.2 +5000:4741:5:90:5070:5070L:3.5f:3.5 +5000:4742:2:90:5088:5088L:2.4f:2.4 +5000:4743:3:90:5001:5001L:0.500190f:0.500190 +5000:4744:1:900:5100:5100L:900.510f:900.510 +5000:4745:3:900:5088:5088L:4745.3f:4745.3 +5000:4746:3:90:5046:5046L:9.3f:9.3 +5000:4747:4:90:5062:5062L:4.8f:4.8 +5000:4748:3:90:5060:5060L:0.506090f:0.506090 +5000:4749:4:904:5052:5052L:904.505f:904.505 +5000:4750:2:908:5098:5098L:4750.2f:4750.2 +5000:4751:1:90:5033:5033L:6.1f:6.1 +5000:4752:4:90:5078:5078L:4.8f:4.8 +5000:4753:4:90:5004:5004L:0.500490f:0.500490 +5000:4754:4:903:5012:5012L:903.501f:903.501 +5000:4755:4:910:5016:5016L:4755.4f:4755.4 +5000:4756:3:90:5005:5005L:4.3f:4.3 +5000:4757:5:90:5085:5085L:5.2f:5.2 +5000:4758:3:90:5008:5008L:0.500890f:0.500890 +5000:4759:1:904:5052:5052L:904.505f:904.505 +5000:4760:4:907:5028:5028L:4760.4f:4760.4 +5000:4761:4:90:5087:5087L:7.4f:7.4 +5000:4762:1:90:5065:5065L:1.5f:1.5 +5000:4763:4:90:5088:5088L:0.508890f:0.508890 +5000:4764:5:908:5024:5024L:908.502f:908.502 +5000:4765:5:904:5018:5018L:4765.5f:4765.5 +5000:4766:1:91:5063:5063L:0.1f:0.1 +5000:4767:1:90:5087:5087L:1.9f:1.9 +5000:4768:1:90:5052:5052L:0.505290f:0.505290 +5000:4769:1:907:5095:5095L:907.509f:907.509 +5000:4770:4:904:5060:5060L:4770.4f:4770.4 +5000:4771:5:90:5031:5031L:0.5f:0.5 +5000:4772:4:90:5078:5078L:4.1f:4.1 +5000:4773:3:90:5089:5089L:0.508990f:0.508990 +5000:4774:2:908:5065:5065L:908.506f:908.506 +5000:4775:3:907:5005:5005L:4775.3f:4775.3 +5000:4776:4:90:5099:5099L:9.4f:9.4 +5000:4777:2:90:5089:5089L:2.0f:2.0 +5000:4778:2:90:5038:5038L:0.503890f:0.503890 +5000:4779:4:901:5006:5006L:901.500f:901.500 +5000:4780:4:908:5045:5045L:4780.4f:4780.4 +5000:4781:2:90:5054:5054L:7.2f:7.2 +5000:4782:3:90:5064:5064L:3.5f:3.5 +5000:4783:2:90:5053:5053L:0.505390f:0.505390 +5000:4784:2:902:5027:5027L:902.502f:902.502 +5000:4785:5:908:5098:5098L:4785.5f:4785.5 +5000:4786:5:90:5081:5081L:4.5f:4.5 +5000:4787:5:90:5083:5083L:5.8f:5.8 +5000:4788:5:90:5088:5088L:0.508890f:0.508890 +5000:4789:2:908:5002:5002L:908.500f:908.500 +5000:4790:2:904:5081:5081L:4790.2f:4790.2 +5000:4791:4:90:5050:5050L:7.4f:7.4 +5000:4792:2:90:5097:5097L:2.3f:2.3 +5000:4793:5:90:5085:5085L:0.508590f:0.508590 +5000:4794:3:909:5003:5003L:909.500f:909.500 +5000:4795:4:908:5076:5076L:4795.4f:4795.4 +5000:4796:4:90:5021:5021L:8.4f:8.4 +5000:4797:3:90:5001:5001L:3.7f:3.7 +5000:4798:2:90:5004:5004L:0.500490f:0.500490 +5000:4799:1:907:5080:5080L:907.508f:907.508 +5000:4800:2:910:5023:5023L:4800.2f:4800.2 +5000:4801:1:90:5094:5094L:7.1f:7.1 +5000:4802:3:91:5022:5022L:3.0f:3.0 +5000:4803:3:90:5087:5087L:0.508790f:0.508790 +5000:4804:2:903:5078:5078L:903.507f:903.507 +5000:4805:2:910:5058:5058L:4805.2f:4805.2 +5000:4806:1:90:5034:5034L:6.1f:6.1 +5000:4807:2:90:5004:5004L:2.1f:2.1 +5000:4808:2:90:5057:5057L:0.505790f:0.505790 +5000:4809:2:906:5029:5029L:906.502f:906.502 +5000:4810:1:908:5028:5028L:4810.1f:4810.1 +5000:4811:3:90:5100:5100L:8.3f:8.3 +5000:4812:2:90:5096:5096L:2.3f:2.3 +5000:4813:3:90:5081:5081L:0.508190f:0.508190 +5000:4814:3:901:5008:5008L:901.500f:901.500 +5000:4815:2:905:5005:5005L:4815.2f:4815.2 +5000:4816:4:90:5068:5068L:6.4f:6.4 +5000:4817:1:90:5079:5079L:1.9f:1.9 +5000:4818:1:90:5018:5018L:0.501890f:0.501890 +5000:4819:4:906:5077:5077L:906.507f:906.507 +5000:4820:1:908:5055:5055L:4820.1f:4820.1 +5000:4821:2:90:5034:5034L:2.2f:2.2 +5000:4822:2:90:5066:5066L:2.6f:2.6 +5000:4823:2:90:5044:5044L:0.504490f:0.504490 +5000:4824:1:906:5055:5055L:906.505f:906.505 +5000:4825:1:908:5001:5001L:4825.1f:4825.1 +5000:4826:2:90:5059:5059L:6.2f:6.2 +5000:4827:5:90:5049:5049L:5.7f:5.7 +5000:4828:4:90:5074:5074L:0.507490f:0.507490 +5000:4829:5:906:5036:5036L:906.503f:906.503 +5000:4830:4:906:5016:5016L:4830.4f:4830.4 +5000:4831:1:91:5037:5037L:0.1f:0.1 +5000:4832:3:90:5093:5093L:3.2f:3.2 +5000:4833:1:90:5004:5004L:0.500490f:0.500490 +5000:4834:4:906:5060:5060L:906.506f:906.506 +5000:4835:1:908:5035:5035L:4835.1f:4835.1 +5000:4836:1:91:5091:5091L:0.1f:0.1 +5000:4837:4:90:5058:5058L:4.9f:4.9 +5000:4838:2:90:5042:5042L:0.504290f:0.504290 +5000:4839:1:904:5000:5000L:904.500f:904.500 +5000:4840:2:900:5062:5062L:4840.2f:4840.2 +5000:4841:3:90:5055:5055L:2.3f:2.3 +5000:4842:5:90:5080:5080L:5.8f:5.8 +5000:4843:5:91:5030:5030L:0.503091f:0.503091 +5000:4844:5:906:5091:5091L:906.509f:906.509 +5000:4845:3:908:5067:5067L:4845.3f:4845.3 +5000:4846:5:91:5066:5066L:0.5f:0.5 +5000:4847:4:90:5054:5054L:4.8f:4.8 +5000:4848:2:90:5010:5010L:0.501090f:0.501090 +5000:4849:4:900:5053:5053L:900.505f:900.505 +5000:4850:4:904:5060:5060L:4850.4f:4850.4 +5000:4851:2:91:5086:5086L:0.2f:0.2 +5000:4852:5:90:5064:5064L:5.9f:5.9 +5000:4853:4:90:5060:5060L:0.506090f:0.506090 +5000:4854:1:906:5019:5019L:906.501f:906.501 +5000:4855:5:900:5097:5097L:4855.5f:4855.5 +5000:4856:3:90:5095:5095L:9.3f:9.3 +5000:4857:2:90:5070:5070L:2.6f:2.6 +5000:4858:4:91:5075:5075L:0.507591f:0.507591 +5000:4859:5:907:5080:5080L:907.508f:907.508 +5000:4860:3:904:5023:5023L:4860.3f:4860.3 +5000:4861:1:90:5019:5019L:8.1f:8.1 +5000:4862:5:90:5006:5006L:5.7f:5.7 +5000:4863:3:90:5078:5078L:0.507890f:0.507890 +5000:4864:1:904:5036:5036L:904.503f:904.503 +5000:4865:2:903:5042:5042L:4865.2f:4865.2 +5000:4866:2:91:5032:5032L:0.2f:0.2 +5000:4867:2:90:5095:5095L:2.1f:2.1 +5000:4868:5:91:5090:5090L:0.509091f:0.509091 +5000:4869:4:908:5058:5058L:908.505f:908.505 +5000:4870:3:902:5000:5000L:4870.3f:4870.3 +5000:4871:4:90:5079:5079L:2.4f:2.4 +5000:4872:5:90:5049:5049L:5.1f:5.1 +5000:4873:5:90:5090:5090L:0.509090f:0.509090 +5000:4874:4:907:5031:5031L:907.503f:907.503 +5000:4875:1:900:5064:5064L:4875.1f:4875.1 +5000:4876:3:90:5055:5055L:3.3f:3.3 +5000:4877:5:90:5071:5071L:5.5f:5.5 +5000:4878:4:90:5064:5064L:0.506490f:0.506490 +5000:4879:4:900:5044:5044L:900.504f:900.504 +5000:4880:2:905:5065:5065L:4880.2f:4880.2 +5000:4881:2:90:5088:5088L:2.2f:2.2 +5000:4882:1:90:5097:5097L:1.0f:1.0 +5000:4883:3:90:5056:5056L:0.505690f:0.505690 +5000:4884:3:908:5027:5027L:908.502f:908.502 +5000:4885:4:909:5027:5027L:4885.4f:4885.4 +5000:4886:2:90:5055:5055L:3.2f:3.2 +5000:4887:5:90:5004:5004L:5.1f:5.1 +5000:4888:4:91:5045:5045L:0.504591f:0.504591 +5000:4889:2:906:5052:5052L:906.505f:906.505 +5000:4890:4:909:5004:5004L:4890.4f:4890.4 +5000:4891:2:90:5025:5025L:1.2f:1.2 +5000:4892:2:90:5034:5034L:2.1f:2.1 +5000:4893:1:90:5038:5038L:0.503890f:0.503890 +5000:4894:4:901:5013:5013L:901.501f:901.501 +5000:4895:1:909:5098:5098L:4895.1f:4895.1 +5000:4896:2:90:5032:5032L:2.2f:2.2 +5000:4897:5:90:5051:5051L:5.1f:5.1 +5000:4898:5:90:5047:5047L:0.504790f:0.504790 +5000:4899:2:900:5010:5010L:900.501f:900.501 +5000:4900:5:907:5099:5099L:4900.5f:4900.5 +5000:4901:5:90:5012:5012L:0.5f:0.5 +5000:4902:1:90:5030:5030L:1.2f:1.2 +5000:4903:3:90:5000:5000L:0.500090f:0.500090 +5000:4904:5:902:5012:5012L:902.501f:902.501 +5000:4905:1:902:5097:5097L:4905.1f:4905.1 +5000:4906:5:90:5017:5017L:5.5f:5.5 +5000:4907:2:90:5030:5030L:2.3f:2.3 +5000:4908:5:90:5005:5005L:0.500590f:0.500590 +5000:4909:2:906:5006:5006L:906.500f:906.500 +5000:4910:2:904:5078:5078L:4910.2f:4910.2 +5000:4911:2:90:5083:5083L:3.2f:3.2 +5000:4912:3:90:5009:5009L:3.5f:3.5 +5000:4913:4:91:5055:5055L:0.505591f:0.505591 +5000:4914:4:909:5076:5076L:909.507f:909.507 +5000:4915:5:909:5098:5098L:4915.5f:4915.5 +5000:4916:5:90:5048:5048L:9.5f:9.5 +5000:4917:1:90:5084:5084L:1.1f:1.1 +5000:4918:2:91:5008:5008L:0.500891f:0.500891 +5000:4919:3:902:5067:5067L:902.506f:902.506 +5000:4920:3:906:5011:5011L:4920.3f:4920.3 +5000:4921:2:91:5046:5046L:0.2f:0.2 +5000:4922:1:90:5096:5096L:1.4f:1.4 +5000:4923:1:90:5095:5095L:0.509590f:0.509590 +5000:4924:4:900:5080:5080L:900.508f:900.508 +5000:4925:3:910:5065:5065L:4925.3f:4925.3 +5000:4926:3:90:5048:5048L:8.3f:8.3 +5000:4927:5:90:5062:5062L:5.9f:5.9 +5000:4928:4:90:5056:5056L:0.505690f:0.505690 +5000:4929:5:906:5078:5078L:906.507f:906.507 +5000:4930:3:901:5037:5037L:4930.3f:4930.3 +5000:4931:4:90:5034:5034L:3.4f:3.4 +5000:4932:1:90:5080:5080L:1.4f:1.4 +5000:4933:1:90:5003:5003L:0.500390f:0.500390 +5000:4934:1:903:5006:5006L:903.500f:903.500 +5000:4935:4:908:5000:5000L:4935.4f:4935.4 +5000:4936:3:90:5083:5083L:2.3f:2.3 +5000:4937:5:90:5070:5070L:5.1f:5.1 +5000:4938:3:91:5092:5092L:0.509291f:0.509291 +5000:4939:1:908:5055:5055L:908.505f:908.505 +5000:4940:5:903:5065:5065L:4940.5f:4940.5 +5000:4941:2:91:5100:5100L:0.2f:0.2 +5000:4942:3:90:5042:5042L:3.0f:3.0 +5000:4943:2:90:5001:5001L:0.500190f:0.500190 +5000:4944:3:901:5033:5033L:901.503f:901.503 +5000:4945:3:909:5012:5012L:4945.3f:4945.3 +5000:4946:3:90:5036:5036L:3.3f:3.3 +5000:4947:2:90:5054:5054L:2.3f:2.3 +5000:4948:1:90:5048:5048L:0.504890f:0.504890 +5000:4949:5:910:5027:5027L:910.502f:910.502 +5000:4950:3:908:5059:5059L:4950.3f:4950.3 +5000:4951:1:90:5054:5054L:0.1f:0.1 +5000:4952:1:90:5059:5059L:1.7f:1.7 +5000:4953:3:90:5069:5069L:0.506990f:0.506990 +5000:4954:3:905:5079:5079L:905.507f:905.507 +5000:4955:5:910:5069:5069L:4955.5f:4955.5 +5000:4956:1:90:5004:5004L:4.1f:4.1 +5000:4957:2:90:5032:5032L:2.8f:2.8 +5000:4958:5:90:5015:5015L:0.501590f:0.501590 +5000:4959:2:907:5008:5008L:907.500f:907.500 +5000:4960:4:902:5090:5090L:4960.4f:4960.4 +5000:4961:2:90:5096:5096L:3.2f:3.2 +5000:4962:5:90:5061:5061L:5.4f:5.4 +5000:4963:2:91:5065:5065L:0.506591f:0.506591 +5000:4964:1:905:5011:5011L:905.501f:905.501 +5000:4965:5:904:5005:5005L:4965.5f:4965.5 +5000:4966:3:90:5050:5050L:4.3f:4.3 +5000:4967:3:90:5025:5025L:3.9f:3.9 +5000:4968:5:90:5003:5003L:0.500390f:0.500390 +5000:4969:1:901:5074:5074L:901.507f:901.507 +5000:4970:1:908:5093:5093L:4970.1f:4970.1 +5000:4971:1:90:5023:5023L:0.1f:0.1 +5000:4972:5:90:5066:5066L:5.9f:5.9 +5000:4973:4:90:5063:5063L:0.506390f:0.506390 +5000:4974:2:903:5016:5016L:903.501f:903.501 +5000:4975:2:902:5059:5059L:4975.2f:4975.2 +5000:4976:3:90:5003:5003L:8.3f:8.3 +5000:4977:5:90:5085:5085L:5.3f:5.3 +5000:4978:1:90:5059:5059L:0.505990f:0.505990 +5000:4979:2:903:5073:5073L:903.507f:903.507 +5000:4980:5:905:5054:5054L:4980.5f:4980.5 +5000:4981:5:90:5061:5061L:5.5f:5.5 +5000:4982:1:90:5048:5048L:1.5f:1.5 +5000:4983:4:90:5075:5075L:0.507590f:0.507590 +5000:4984:3:904:5008:5008L:904.500f:904.500 +5000:4985:3:908:5028:5028L:4985.3f:4985.3 +5000:4986:1:90:5004:5004L:2.1f:2.1 +5000:4987:1:90:5040:5040L:1.1f:1.1 +5000:4988:1:90:5067:5067L:0.506790f:0.506790 +5000:4989:4:905:5001:5001L:905.500f:905.500 +5000:4990:2:905:5051:5051L:4990.2f:4990.2 +5000:4991:5:90:5003:5003L:4.5f:4.5 +5000:4992:3:90:5057:5057L:3.5f:3.5 +5000:4993:5:90:5071:5071L:0.507190f:0.507190 +5000:4994:4:907:5011:5011L:907.501f:907.501 +5000:4995:5:902:5090:5090L:4995.5f:4995.5 +5000:4996:1:90:5010:5010L:4.1f:4.1 +5000:4997:1:90:5024:5024L:1.6f:1.6 +5000:4998:3:90:5057:5057L:0.505790f:0.505790 +5000:4999:2:902:5010:5010L:902.501f:902.501 +5000:5000:2:906:5060:5060L:5000.2f:5000.2 + Index: src/test/e2e/hcatalog/data/complex.rcfile =================================================================== Cannot display: file marked as a binary type. svn:mime-type = application/octet-stream Property changes on: src/test/e2e/hcatalog/data/complex.rcfile ___________________________________________________________________ Added: svn:mime-type + application/octet-stream Index: src/test/e2e/hcatalog/data/numbers.rcfile =================================================================== Cannot display: file marked as a binary type. svn:mime-type = application/octet-stream Property changes on: src/test/e2e/hcatalog/data/numbers.rcfile ___________________________________________________________________ Added: svn:mime-type + application/octet-stream Index: src/test/e2e/hcatalog/drivers/TestDriverHCat.pm =================================================================== --- src/test/e2e/hcatalog/drivers/TestDriverHCat.pm (revision 0) +++ src/test/e2e/hcatalog/drivers/TestDriverHCat.pm (revision 0) @@ -0,0 +1,1742 @@ +package TestDriverHCat; + +################### +# +# In addition to what TestDriverPig.pm does, this should also support: +# +# * Hive +# * HCat CLI +# * Hadoop commands with result to stdout (e.g. 'fs') +# * Hadoop mapreduce jobs (i.e. result in files) +# +# The two latter ones are implemented like the 'pig' directive +# in that just 'hadoop' is used, and if the verification directive is 'sql' +# then a benchmark file will be compared with the output file, +# othewise stdout or stderr plus rc can be checked against verification directives. +# +# Based upon the consolidated Pig driver, which +# supports what privously was handled by: +# +# - TestDriverPig.pm +# - TestDriverScript.pm +# - TestDriverPigCmdLine.pm +# - TestDriverPigMultiQuery.pm +# +# Some code are ripe to be factored out. In interest of time, not done now... + + +# THINGS STIL TO DEAL WITH MARKED AS: + +##!!! + +# NOTE in particular that postProcessSingleOutputFile might need to be added to some run subs. + +############################################################################### + +#use Miners::Test::TestDriver; +use TestDriver; +use IPC::Run; # don't do qw(run), it screws up TestDriver which also has a run method +use Digest::MD5 qw(md5_hex); +use Util; +use File::Path; + +use strict; +use English; + +our $className= "TestDriver"; +our @ISA = "$className"; +our $ROOT = (defined $ENV{'HARNESS_ROOT'} ? $ENV{'HARNESS_ROOT'} : die "ERROR: You must set environment variable HARNESS_ROOT\n"); +our $toolpath = "$ROOT/libexec/PigTest"; + +my $passedStr = 'passed'; +my $failedStr = 'failed'; +my $abortedStr = 'aborted'; +my $skippedStr = 'skipped'; +my $dependStr = 'failed_dependency'; + +sub new +{ + # Call our parent + my ($proto) = @_; + my $class = ref($proto) || $proto; + my $self = $class->SUPER::new; + + $self->{'exectype'} = "mapred"; # till we know better (in globalSetup())! + $self->{'ignore'} = "true"; # till we know better (in globalSetup())! + + bless($self, $class); + return $self; +} + +############################################################################### +# This method has been copied over from TestDriver to make changes to +# support skipping tests which do not match current execution mode +# or which were marked as 'ignore' +# +# +# Static function, can be used by test_harness.pl +# Print the results so far, given the testStatuses hash. +# @param testStatuses - reference to hash of test status results. +# @param log - reference to file handle to print results to. +# @param prefix - A title to prefix to the results +# @returns nothing. +# +sub printResults +{ + my ($testStatuses, $log, $prefix) = @_; + + my ($pass, $fail, $abort, $depend, $skipped) = (0, 0, 0, 0, 0); + + foreach (keys(%$testStatuses)) { + ($testStatuses->{$_} eq $passedStr) && $pass++; + ($testStatuses->{$_} eq $failedStr) && $fail++; + ($testStatuses->{$_} eq $abortedStr) && $abort++; + ($testStatuses->{$_} eq $dependStr) && $depend++; + ($testStatuses->{$_} eq $skippedStr) && $skipped++; + } + + my $total = $pass + $fail + $skipped + $abort + $depend; + + my $msg = "$prefix, PASSED: $pass FAILED: $fail SKIPPED: $skipped ABORTED: $abort " . + "FAILED DEPENDENCY: $depend TOTAL: $total"; + print $log "$msg\n"; + print "$msg\r"; +} + + +sub replaceParameters +{ +##!!! Move this to Util.pm + + my ($self, $cmd, $outfile, $testCmd, $log) = @_; + + # $self + $cmd =~ s/:LATESTOUTPUTPATH:/$self->{'latestoutputpath'}/g; + + # $outfile + $cmd =~ s/:OUTPATH:/$outfile/g; + + # The same directory where .pig, .sh, .hcat, out/ are produced for the run: + $cmd =~ s/:RUNDIR:/$testCmd->{'localpath'}/g; + + # $ENV + $cmd =~ s/:PIGHARNESS:/$ENV{HARNESS_ROOT}/g; + + # $testCmd + $cmd =~ s/:INPATH:/$testCmd->{'inpathbase'}/g; + $cmd =~ s/:OUTPATH:/$outfile/g; + $cmd =~ s/:FUNCPATH:/$testCmd->{'funcjarPath'}/g; + $cmd =~ s/:RUNID:/$testCmd->{'UID'}/g; + $cmd =~ s/:USRHOMEPATH:/$testCmd->{'userhomePath'}/g; + $cmd =~ s/:SCRIPTHOMEPATH:/$testCmd->{'scriptPath'}/g; + $cmd =~ s/:DBUSER:/$testCmd->{'dbuser'}/g; + $cmd =~ s/:DBNAME:/$testCmd->{'dbdb'}/g; + $cmd =~ s/:LOCALINPATH:/$testCmd->{'localinpathbase'}/g; + $cmd =~ s/:LOCALOUTPATH:/$testCmd->{'localoutpathbase'}/g; + $cmd =~ s/:BMPATH:/$testCmd->{'benchmarkPath'}/g; + $cmd =~ s/:TMP:/$testCmd->{'tmpPath'}/g; + $cmd =~ s/:ZEBRAJAR:/$testCmd->{'zebrajar'}/g; + $cmd =~ s/:FILER:/$testCmd->{'filerPath'}/g; + $cmd =~ s/:GRIDSTACK:/$testCmd->{'gridstack.root'}/g; + $cmd =~ s/:USER:/$ENV{USER}/g; + + if ( $testCmd->{'hadoopSecurity'} eq "secure" ) { + $cmd =~ s/:REMOTECLUSTER:/$testCmd->{'remoteSecureCluster'}/g; + } else { + $cmd =~ s/:REMOTECLUSTER:/$testCmd->{'remoteNotSecureCluster'}/g; + } + + # extra for hive, hcat, hadoop cmd + $cmd =~ s/:THRIFTSERVER:/$testCmd->{'thriftserver'}/g; + $cmd =~ s/:HADOOP_CLASSPATH:/$testCmd->{'hadoop_classpath'}/g; + $cmd =~ s/:HCAT_JAR:/$testCmd->{'hcatalog.jar'}/g; + + # used in script call to `java :CLASSPATH: ...` in bootstrap_hcat.conf + $cmd =~ s/:CLASSPATH:/$testCmd->{'classpath'}/g; + + return $cmd; +} + +sub hiveWorkArounds +{ + my ($self, $cmd, $log) = @_; + my $subName = (caller(0))[3]; + + # return $cmd; + + # Work-around for Hive problem where INSERT OVERWRITE failed when called w/o hive.merge.mapfiles=false + if ($cmd =~ /insert overwrite/i) { + print $log "$0:$subName WARNING: setting hive.merge.mapfiles in command\n"; + $cmd = "\nset hive.merge.mapfiles=false;\n$cmd"; + # } else { + # print $log "$0:$subName DEBUG: NOT setting hive.merge.mapfiles in hive command\n"; + } + + return $cmd; +} + + + +sub globalSetup +{ + my ($self, $globalHash, $log) = @_; + my $subName = (caller(0))[3]; + + + # Setup the output path + my $me = `whoami`; + chomp $me; + $globalHash->{'runid'} = $me . "." . time; + + # if "-ignore false" was provided on the command line, + # it means do run tests even when marked as 'ignore' + if(defined($globalHash->{'ignore'}) && $globalHash->{'ignore'} eq 'false') + { + $self->{'ignore'} = 'false'; + } + + # if "-x local" was provided on the command line, + # it implies pig should be run in "local" mode -so + # change input and output paths + if(defined($globalHash->{'x'}) && $globalHash->{'x'} eq 'local') + { + $self->{'exectype'} = "local"; + $globalHash->{'inpathbase'} = $globalHash->{'localinpathbase'}; + $globalHash->{'outpathbase'} = $globalHash->{'localoutpathbase'}; + } + $globalHash->{'outpath'} = $globalHash->{'outpathbase'} . "/" . $globalHash->{'runid'} . "/"; + $globalHash->{'localpath'} = $globalHash->{'localpathbase'} . "/" . $globalHash->{'runid'} . "/"; + + # extract the current zebra.jar file path from the classpath + # and enter it in the hash for use in the substitution of :ZEBRAJAR: + my $zebrajar = $globalHash->{'cp'}; + $zebrajar =~ s/zebra.jar.*/zebra.jar/; + $zebrajar =~ s/.*://; + $globalHash->{'zebrajar'} = $zebrajar; + + # add libexec location to the path + if (defined($ENV{'PATH'})) { + $ENV{'PATH'} = $globalHash->{'scriptPath'} . ":" . $ENV{'PATH'}; + } + else { + $ENV{'PATH'} = $globalHash->{'scriptPath'}; + } + + my $tmpUsePig = $globalHash->{'use-pig.pl'}; + $globalHash->{'use-pig.pl'} = 1; + my @cmd = (Util::getBasePigCmd($globalHash), '-e', 'mkdir', $globalHash->{'outpath'}); + $globalHash->{'use-pig.pl'} = $tmpUsePig; + + if($self->{'exectype'} eq "local") + { + @cmd = ('mkdir', '-p', $globalHash->{'outpath'}); + } + + + if($self->{'exectype'} eq "mapred") + { + my $id = `id -un`; + chomp $id; + if ($id eq 'root') { + # my @suCmd = ('su', 'hadoopqa', '-c', "'" . join(' ', @cmd) . "'"); + # print $log join(" ", @suCmd) . "\n"; + # IPC::Run::run(\@suCmd, \undef, $log, $log) or die "Cannot create HDFS directory " . $globalHash->{'outpath'} . ": $? - $!\n"; + # above failed, doing below for now... + + my $command= join (" ", @cmd); + $command = "echo \"$command\" | su hadoopqa 2>&1"; + print $log "$command\n"; + my @result=`$command`; + my $rc = $? >> 8; + print $log "Output from create HDFS directory: " . join (" ", @result) . "\n"; + die "Cannot create HDFS directory " . $globalHash->{'outpath'} . ": $? - $!\n" if $rc != 0; + + } else { + print $log join(" ", @cmd) . "\n"; + IPC::Run::run(\@cmd, \undef, $log, $log) or die "Cannot create HDFS directory " . $globalHash->{'outpath'} . ": $? - $!\n"; + } + } + else + { + IPC::Run::run(\@cmd, \undef, $log, $log) or die "Cannot create directory " . $globalHash->{'outpath'} . "\n"; + } + + IPC::Run::run(['mkdir', '-p', $globalHash->{'localpath'}], \undef, $log, $log) or + die "Cannot create localpath directory " . $globalHash->{'localpath'} . + " " . "$ERRNO\n"; +} + +sub getCommand +{ + my ($self, $testCmd ) = @_; + + if( $testCmd->{'pig'} ){ + return "pig"; + } elsif( $testCmd->{'hadoop'} ){ + return "hadoop"; + } elsif( $testCmd->{'hive'} ){ + return "hive"; + } elsif( $testCmd->{'hcat'} ){ + return "hcat"; + } elsif( $testCmd->{'script'} ){ + return "script"; + } else { + return ""; + } +} + +sub runTest +{ + my ($self, $testCmd, $log, $copyResults) = @_; + my $subName = (caller(0))[3]; + + # check is root if using 'run_as' + if (defined($testCmd->{'run_as'}) && $testCmd->{'run_as'} ne '') { + my $id = `id -un`; + chomp $id; + if ($id ne 'root') { + die "$subName FATAL You have to run as root to use the 'run_as' directive, you are: $id"; + } + } + + # Handle the various methods of running used in + # the original TestDrivers + + if ( $testCmd->{'pig'} && $self->hasCommandLineVerifications( $testCmd, $log) ) { + return $self->runPigCmdLine( $testCmd, $log, $copyResults ); + } elsif( $testCmd->{'pig'} ){ + return $self->runPig( $testCmd, $log, $copyResults ); + } elsif ( $testCmd->{'hadoop'} && $self->hasCommandLineVerifications( $testCmd, $log) ) { + return $self->runHadoopCmdLine( $testCmd, $log, $copyResults ); + } elsif( $testCmd->{'hadoop'} ){ + return $self->runHadoop( $testCmd, $log, $copyResults ); + } elsif( $testCmd->{'hive'} ){ + return $self->runHive( $testCmd, $log, $copyResults ); + } elsif( $testCmd->{'hcat'} ){ + return $self->runHCat( $testCmd, $log, $copyResults ); + } elsif( $testCmd->{'script'} ){ + return $self->runScript( $testCmd, $log ); + } else { + die "$subName FATAL Did not find a testCmd that I know how to handle"; + } +} + + +sub runPigCmdLine +{ + my ($self, $testCmd, $log) = @_; + my $subName = (caller(0))[3]; + my %result; + + # Set up file locations + my $pigfile = $testCmd->{'localpath'} . $testCmd->{'group'} . "_" . $testCmd->{'num'} . ".pig"; + my $outfile = $testCmd->{'outpath'} . $testCmd->{'group'} . "_" . $testCmd->{'num'} . ".out"; + + my $outdir = $testCmd->{'localpath'} . $testCmd->{'group'} . "_" . $testCmd->{'num'} . ".out"; + my $stdoutfile = "$outdir/stdout"; + my $stderrfile = "$outdir/stderr"; + + mkpath( [ $outdir ] , 0, 0755) if ( ! -e outdir ); + if ( ! -e $outdir ){ + print $log "$0.$subName FATAL could not mkdir $outdir\n"; + die "$0.$subName FATAL could not mkdir $outdir\n"; + } + + # Write the pig script to a file. + my $pigcmd = $self->replaceParameters( $testCmd->{'pig'}, $outfile, $testCmd, $log ); + + open(FH, "> $pigfile") or die "Unable to open file $pigfile to write pig script, $ERRNO\n"; + print FH $pigcmd . "\n"; + close(FH); + + # Build the command + my @baseCmd = Util::getBasePigCmd($testCmd); + my @cmd = @baseCmd; + + # Add option -l giving location for secondary logs + ##!!! Should that even be here? + my $locallog = $testCmd->{'localpath'} . $testCmd->{'group'} . "_" . $testCmd->{'num'} . ".log"; + push(@cmd, "-logfile"); + push(@cmd, $locallog); + + # Add pig parameters if they're provided + if (defined($testCmd->{'pig_params'})) { + # Processing :PARAMPATH: in parameters + foreach my $param (@{$testCmd->{'pig_params'}}) { + $param =~ s/:PARAMPATH:/$testCmd->{'paramPath'}/g; + } + push(@cmd, @{$testCmd->{'pig_params'}}); + } + + # Add pig file and redirections + push(@cmd, $pigfile); + my $command= join (" ", @cmd); + # Add su user if provided + if (defined($testCmd->{'run_as'})) { + $command = 'echo "' . $command . '"' . " | su $testCmd->{'run_as'}"; + } + $command= "$command 1> $stdoutfile 2> $stderrfile"; + + + # Run the command + print $log "$0:$subName Going to run command: $command\n"; + print $log "$0:$subName STD OUT IS IN FILE: $stdoutfile\n"; + print $log "$0:$subName STD ERROR IS IN FILE: $stderrfile\n"; + print $log "$0:$subName PIG SCRIPT FILE, $pigfile, CONTAINS:\n<$pigcmd>\n"; + + my @result=`$command`; + $result{'rc'} = $? >> 8; + $result{'output'} = $outfile; + $result{'stdout'} = `cat $stdoutfile`; + $result{'stderr'} = `cat $stderrfile`; + $result{'stderr_file'} = $stderrfile; + + # Here and other run* should do: + # If expected rc defined and = 0 and actual rc <> 0 then + # die "Failed running $pigfile\n"; + + print $log "STD ERROR CONTAINS:\n<$result{'stderr'}>\n"; + + return \%result; +} + +sub runHive +# The code is based on the run runHadoopCmdLine, +# but with the difference that it's output from stdout +# can be used for both comparions against benchmark file and +# verification by pattern matching depending on wether the test +# has a 'sql' or a pattern match directive. +{ + my ($self, $testCmd, $log) = @_; + my $subName = (caller(0))[3]; + my %result; + + # Set up file locations + my $hivefile = $testCmd->{'localpath'} . $testCmd->{'group'} . "_" . $testCmd->{'num'} . ".hive"; + # my $outfile = $testCmd->{'outpath'} . $testCmd->{'group'} . "_" . $testCmd->{'num'} . ".out"; + + my $outdir = $testCmd->{'localpath'} . $testCmd->{'group'} . "_" . $testCmd->{'num'} . ".out"; + my $stdoutfile = "$outdir/stdout"; + my $stderrfile = "$outdir/stderr"; + + my $outfile = $stdoutfile; # For Hive, there is only the stdout, and that is being captured by + # the way the command is run. So, the hive command should _not_ use :OUTFILE: + + mkpath( [ $outdir ] , 0, 0755) if ( ! -e $outdir ); + if ( ! -e $outdir ){ + print $log "$0.$subName FATAL could not mkdir $outdir\n"; + die "$0.$subName FATAL could not mkdir $outdir\n"; + } + + # Write the hive command to a file. + my $hivecmd = $self->replaceParameters( $testCmd->{'hive'}, $outfile, $testCmd, $log ); + + $hivecmd = $self->hiveWorkArounds( $hivecmd, $log ); + + + open(FH, "> $hivefile") or die "Unable to open file $hivefile to write hive command, $ERRNO\n"; + print FH "$hivecmd\n"; + close(FH); + + # Build the command + my @cmd = Util::getHiveCmd($testCmd); + + #Add metastore info + push(@cmd, " --hiveconf hive.metastore.local=false --hiveconf hive.metastore.uris=thrift://".$testCmd->{'thriftserver'}); + + # Add hive command file + push(@cmd, '-f', $hivefile); + + # Add redirections + # no need to split, as not using IPC run. + my $command= join (" ", @cmd); + # Add hive command line arguments if they're provided + if (defined($testCmd->{'hive_cmdline_args'})) { + $command = $command . $testCmd->{'hive_cmdline_args'} + } + + # Add su user if provided + if (defined($testCmd->{'run_as'})) { + $command = "echo \"$command\" | su $testCmd->{'run_as'}"; + } + $command= "$command 1> $stdoutfile 2> $stderrfile"; + + + # Run the command + print $log "$0:$subName Going to run command: $command\n"; + print $log "$0:$subName STD OUT IS IN FILE: $stdoutfile\n"; + print $log "$0:$subName STD ERROR IS IN FILE: $stderrfile\n"; + print $log "$0:$subName HIVE QUERY FILE, $hivefile, CONTAINS:\n<$hivecmd>\n"; + + my @result=`$command`; + $result{'rc'} = $? >> 8; + $result{'output'} = $outfile; + $result{'stdout'} = `cat $stdoutfile`; # This could be big. Left for now, as compareScript relies on it + $result{'stderr'} = `cat $stderrfile`; + $result{'stderr_file'} = $stderrfile; + + print $log "STD ERROR CONTAINS:\n<$result{'stderr'}>\n"; + + $result{'output'} = $self->postProcessSingleOutputFile($outfile, $outdir, undef, $testCmd, $log); + $result{'originalOutput'} = "$outdir/out_original"; # populated by postProcessSingleOutputFile + + return \%result; +} # end sub runHive + + +sub runHCat +# COPY of runHive for now +# When HCat CLI is implemented, then change!!! +{ + my ($self, $testCmd, $log) = @_; + my $subName = (caller(0))[3]; + my %result; + + # Set up file locations + my $hcatfile = $testCmd->{'localpath'} . $testCmd->{'group'} . "_" . $testCmd->{'num'} . ".hcat"; + # my $outfile = $testCmd->{'outpath'} . $testCmd->{'group'} . "_" . $testCmd->{'num'} . ".out"; + + my $outdir = $testCmd->{'localpath'} . $testCmd->{'group'} . "_" . $testCmd->{'num'} . ".out"; + my $stdoutfile = "$outdir/stdout"; + my $stderrfile = "$outdir/stderr"; + + my $outfile = $stdoutfile; # For HCat, there is only the stdout, and that is being captured by + # the way the command is run. So, the hcat command should _not_ use :OUTFILE: + + mkpath( [ $outdir ] , 0, 0755) if ( ! -e $outdir ); + if ( ! -e $outdir ){ + print $log "$0.$subName FATAL could not mkdir $outdir\n"; + die "$0.$subName FATAL could not mkdir $outdir\n"; + } + + # Write the hcat command to a file. + my $hcatcmd = $self->replaceParameters( $testCmd->{'hcat'}, $outfile, $testCmd, $log ); + # $hcatcmd = "set hive.metastore.uris=thrift://gwbl2004.blue.ygrid.yahoo.com:9080;\n$hcatcmd"; + + $hcatcmd = $self->hiveWorkArounds( $hcatcmd, $log ); + + open(FH, "> $hcatfile") or die "Unable to open file $hcatfile to write hcat command, $ERRNO\n"; + print FH $hcatcmd . "\n"; + close(FH); + + # Build the command + my @cmd = Util::getHCatCmd($testCmd); + + # Add hcat command line arguments if they're provided + if (defined($testCmd->{'hcat_cmdline_args'})) { + push(@cmd, @{$testCmd->{'hcat_cmdline_args'}}); + } + + # Add hcat command file + if (defined($testCmd->{'hcat_cmdline_use_-e_switch'})) { + if (defined($testCmd->{'run_as'})) { + push(@cmd, '-e', '\"' . $hcatcmd . '\"'); + } else { + push(@cmd, '-e', '"' . $hcatcmd . '"'); + } + } else { + push(@cmd, '-f', $hcatfile); + } + + # Add redirections + # no need to split, as not using IPC run. + my $command= join (" ", @cmd); + # Add su user if provided + if (defined($testCmd->{'run_as'})) { + $command = "echo \"$command\" | su $testCmd->{'run_as'}"; + } + $command= "$command 1> $stdoutfile 2> $stderrfile"; + + # Run the command + print $log "$0:$subName Going to run command: $command\n"; + print $log "$0:$subName STD OUT IS IN FILE: $stdoutfile\n"; + print $log "$0:$subName STD ERROR IS IN FILE: $stderrfile\n"; + print $log "$0:$subName HCAT QUERY FILE, $hcatfile, CONTAINS:\n<$hcatcmd>\n"; + + my @result=`$command`; + $result{'rc'} = $? >> 8; + $result{'output'} = $outfile; + $result{'stdout'} = `cat $stdoutfile`; # This could be big. Left for now, as compareScript relies on it + $result{'stderr'} = `cat $stderrfile`; + $result{'stderr_file'} = $stderrfile; + + print $log "STD ERROR CONTAINS:\n<$result{'stderr'}>\n"; + + $result{'output'} = $self->postProcessSingleOutputFile($outfile, $outdir, undef, $testCmd, $log); + $result{'originalOutput'} = "$outdir/out_original"; # populated by postProcessSingleOutputFile + + return \%result; +} # end sub runHCat + + +sub runHadoopCmdLine +# Modified from runPigCmdLine +# !!! Works, but need to add other arguments, like queue...??? +{ + my ($self, $testCmd, $log) = @_; + my $subName = (caller(0))[3]; + my %result; + + # Set up file locations + my $hadoopfile = $testCmd->{'localpath'} . $testCmd->{'group'} . "_" . $testCmd->{'num'} . ".hadoop"; + my $outfile = $testCmd->{'outpath'} . $testCmd->{'group'} . "_" . $testCmd->{'num'} . ".out"; + + my $outdir = $testCmd->{'localpath'} . $testCmd->{'group'} . "_" . $testCmd->{'num'} . ".out"; + my $stdoutfile = "$outdir/stdout"; + my $stderrfile = "$outdir/stderr"; + + mkpath( [ $outdir ] , 0, 0755) if ( ! -e outdir ); + if ( ! -e $outdir ){ + print $log "$0.$subName FATAL could not mkdir $outdir\n"; + die "$0.$subName FATAL could not mkdir $outdir\n"; + } + + # Write the hadoop command to a file. + my $hadoopcmd = $self->replaceParameters( $testCmd->{'hadoop'}, $outfile, $testCmd, $log ); + + # adjust for the leading and trailing new line often seen in the conf file's command directives + $hadoopcmd =~ s/^\s*(.*?)\s*$/\1/s; + + open(FH, "> $hadoopfile") or die "Unable to open file $hadoopfile to write hadoop command, $ERRNO\n"; + print FH $hadoopcmd . "\n"; + close(FH); + + # Build the command + my @baseCmd = Util::getHadoopCmd($testCmd); + my @cmd = @baseCmd; + + # Add command line arguments if they're provided + if (defined($testCmd->{'hadoop_cmdline_args'})) { + push(@cmd, @{$testCmd->{'hadoop_cmdline_args'}}); + } + + # Add hadoop command and redirections + push(@cmd, $hadoopcmd); # no need to split, as not using IPC run. + my $command= join (" ", @cmd); + # Add su user if provided + if (defined($testCmd->{'run_as'})) { + $command = "echo \"$command\" | su $testCmd->{'run_as'}"; + } + $command= "$command 1> $stdoutfile 2> $stderrfile"; + + #Set HADOOP_CLASSPATH environment variable if provided + if (defined($testCmd->{'hadoop_classpath'})) { + my $hadoop_classpath = $self->replaceParameters( $testCmd->{'hadoop_classpath'}, $outfile, $testCmd, $log ); + $ENV{'HADOOP_CLASSPATH'} = $ENV{'HCAT_EXTRA_JARS'}; + } + + # Run the command + print $log "$0:$subName Going to run command: $command\n"; + print $log "$0:$subName STD OUT IS IN FILE: $stdoutfile\n"; + print $log "$0:$subName STD ERROR IS IN FILE: $stderrfile\n"; + print $log "$0:$subName HADOOP COMMAND FILE, $hadoopfile, CONTAINS:\n<$hadoopcmd>\n"; + + my @result=`$command`; + $result{'rc'} = $? >> 8; + # $result{'output'} = $outfile; + $result{'output'} = $stdoutfile; + $result{'stdout'} = `cat $stdoutfile`; + $result{'stderr'} = `cat $stderrfile`; + $result{'stderr_file'} = $stderrfile; + + print $log "STD ERROR CONTAINS:\n<$result{'stderr'}>\n"; + + #!!!!!!!!!!!!!! IS this be needed here???? + # my $localdir = $testCmd->{'localpath'} . $testCmd->{'group'} . "_" . $testCmd->{'num'} . ".out"; + # $result{'output'} = $self->postProcessSingleOutputFile($outfile, $localdir, \@baseCmd, $testCmd, $log); + # $result{'originalOutput'} = "$outdir/out_original"; # populated by postProcessSingleOutputFile + + return \%result; +} # end sub runHadoopCmdLine + + +sub runScript +{ + my ($self, $testCmd, $log) = @_; + my $subName = (caller(0))[3]; + my %result; + + # Set up file locations + my $script = $testCmd->{'localpath'} . $testCmd->{'group'} . "_" . $testCmd->{'num'} . ".sh"; + my $outdir = $testCmd->{'localpath'} . $testCmd->{'group'} . "_" . $testCmd->{'num'} . ".out"; + + my $outfile = "$outdir/script.out"; + my $stdoutfile = "$outdir/script.out"; + my $stderrfile = "$outdir/script.err"; + + mkpath( [ $outdir ] , 0, 0755) if ( ! -e outdir ); + if ( ! -e $outdir ){ + print $log "$0.$subName FATAL could not mkdir $outdir\n"; + die "$0.$subName FATAL could not mkdir $outdir\n"; + } + + # Write the script to a file + my $cmd = $self->replaceParameters( $testCmd->{'script'}, $outfile, $testCmd, $log ); + + open(FH, ">$script") or die "Unable to open file $script to write script, $ERRNO\n"; + print FH $cmd . "\n"; + close(FH); + + my @result=`chmod +x $script`; + + # Build the command + my $command; + # Add su user if provided + if (defined($testCmd->{'run_as'})) { + $command = "cat $script | su $testCmd->{'run_as'}"; + } else { + $command= "$script"; + } + $command= "$command 1> $stdoutfile 2> $stderrfile"; + + # Run the script + print $log "$0:$subName Going to run command: $command\n"; + print $log "$0:$subName STD OUT IS IN FILE ($stdoutfile)\n"; + print $log "$0:$subName STD ERROR IS IN FILE ($stderrfile)\n"; + print $log "$0:$subName SCRIPT IS IN FILE ($script)\n"; + print $log "$0:$subName SCRIPT CONTAINS:\n<$cmd>\n"; + + @result=`$command`; + $result{'rc'} = $? >> 8; + $result{'output'} = $outfile; + $result{'stdout'} = `cat $stdoutfile`; + $result{'stderr'} = `cat $stderrfile`; + $result{'stderr_file'} = $stderrfile; + + print $log "STD ERROR CONTAINS:\n<$result{'stderr'}>\n"; + + return \%result; +} + + +sub runHadoop +# Being modified from runPig +# !!! Works, but need to add other arguments, like queue...??? +{ + my ($self, $testCmd, $log, $copyResults) = @_; + my $subName = (caller(0))[3]; + + my %result; + + # Write the hadoop command to a file. + my $hadoopfile = $testCmd->{'localpath'} . $testCmd->{'group'} . "_" . $testCmd->{'num'} . ".hadoop"; + my $outfile = $testCmd->{'outpath'} . $testCmd->{'group'} . "_" . $testCmd->{'num'} . ".out"; + + my $hadoopcmd = $self->replaceParameters( $testCmd->{'hadoop'}, $outfile, $testCmd, $log ); + + # adjust for the leading and trailing new line often seen in the conf file's command directives + $hadoopcmd =~ s/^\s*(.*?)\s*$/\1/s; + + open(FH, "> $hadoopfile") or die "Unable to open file $hadoopfile to write hadoop command file, $ERRNO\n"; + print FH $hadoopcmd . "\n"; + close(FH); + + + # Build the command + my @cmd = Util::getHadoopCmd($testCmd); + + # Add command line arguments if they're provided + if (defined($testCmd->{'hadoop_cmdline_args'})) { + push(@cmd, @{$testCmd->{'hadoop_cmdline_args'}}); + } + + # Add the test command elements + push(@cmd, split(/ +/,$hadoopcmd)); + + # Set HADOOP_CLASSPATH environment variable if provided + if (defined($testCmd->{'hadoop_classpath'})) { + my $hadoop_classpath = $self->replaceParameters( $testCmd->{'hadoop_classpath'}, $outfile, $testCmd, $log ); + $ENV{'HADOOP_CLASSPATH'} = $ENV{'HCAT_EXTRA_JARS'}; + } + + # Add su user if provided + if (defined($testCmd->{'run_as'})) { + my $cmd = '"' . join (" ", @cmd) . '"'; + @cmd = ("echo", $cmd, "|", "su", $testCmd->{'run_as'}); + } + + my $script = $hadoopfile . ".sh"; + open(FH, ">$script") or die "Unable to open file $script to write script, $ERRNO\n"; + print FH join (" ", @cmd) . "\n"; + close(FH); + my @result=`chmod +x $script`; + + # Run the command + print $log "$0::$className::$subName INFO: Going to run hadoop command in shell script: $script\n"; + print $log "$0::$className::$subName INFO: Going to run hadoop command: " . join(" ", @cmd) . "\n"; + + my @runpig = ("$script"); + IPC::Run::run(\@runpig, \undef, $log, $log) or + die "Failed running $script\n"; + $result{'rc'} = $? >> 8; + + # Get results from the command locally + my @basePigCmd = Util::getBasePigCmd($testCmd); + + my $localoutfile; + my $localdir = $testCmd->{'localpath'} . $testCmd->{'group'} . "_" . $testCmd->{'num'} . ".out"; + my @SQLQuery = @{$testCmd->{'queries'}}; # here only used to determine if single-guery of multi-query + + + # mapreduce + if($self->{'exectype'} eq "mapred") + { + # single query + if ($#SQLQuery == 0) { + if ($copyResults) { + $result{'output'} = $self->postProcessSingleOutputFile($outfile, $localdir, \@basePigCmd, $testCmd, $log); + $result{'originalOutput'} = "$localdir/out_original"; # populated by postProcessSingleOutputFile + } else { + $result{'output'} = "NO_COPY"; + } + } + } + # local mode + else + { + # single query + if ($#SQLQuery == 0) { + $localdir = $testCmd->{'localpath'} . $testCmd->{'group'} . "_" . $testCmd->{'num'} . ".dir"; + mkdir $localdir; + $result{'output'} = $self->postProcessSingleOutputFile($outfile, $localdir, \@basePigCmd, $testCmd, $log); + $result{'originalOutput'} = "$localdir/out_original"; # populated by postProcessSingleOutputFile + } + } + + # Compare doesn't get the testCmd hash, so I need to stuff the necessary + # info about sorting into the result. + if (defined $testCmd->{'sortArgs'} && $testCmd->{'sortArgs'}) { + $result{'sortArgs'} = $testCmd->{'sortArgs'}; + } + + return \%result; +} # end sub runHadoop + + + +sub runPig +{ + my ($self, $testCmd, $log, $copyResults) = @_; + my $subName = (caller(0))[3]; + + my %result; + + # Write the pig script to a file. + my $pigfile = $testCmd->{'localpath'} . $testCmd->{'group'} . "_" . $testCmd->{'num'} . ".pig"; + my $outfile = $testCmd->{'outpath'} . $testCmd->{'group'} . "_" . $testCmd->{'num'} . ".out"; + + my $pigcmd = $self->replaceParameters( $testCmd->{'pig'}, $outfile, $testCmd, $log ); + + open(FH, "> $pigfile") or die "Unable to open file $pigfile to write pig script, $ERRNO\n"; + print FH $pigcmd . "\n"; + close(FH); + + + # Build the command + my @baseCmd = Util::getBasePigCmd($testCmd); + my @cmd = @baseCmd; + + # Add option -l giving location for secondary logs + my $locallog = $testCmd->{'localpath'} . $testCmd->{'group'} . "_" . $testCmd->{'num'} . ".log"; + push(@cmd, "-logfile"); + push(@cmd, $locallog); + + # Add pig parameters if they're provided + if (defined($testCmd->{'pig_params'})) { + # Processing :PARAMPATH: in parameters + foreach my $param (@{$testCmd->{'pig_params'}}) { + $param =~ s/:PARAMPATH:/$testCmd->{'paramPath'}/g; + } + push(@cmd, @{$testCmd->{'pig_params'}}); + } + + push(@cmd, $pigfile); + + # Add su user if provided + if (defined($testCmd->{'run_as'})) { + my $cmd = '"' . join (" ", @cmd) . '"'; + @cmd = ("echo", $cmd, "|", "su", $testCmd->{'run_as'}); + } + + my $script = $pigfile . ".sh"; + open(FH, ">$script") or die "Unable to open file $script to write script, $ERRNO\n"; + print FH join (" ", @cmd) . "\n"; + close(FH); + my @result=`chmod +x $script`; + + # Run the command + print $log "$0::$className::$subName INFO: Going to run pig command in shell script: $script\n"; + print $log "$0::$className::$subName INFO: Going to run pig command: " . join(" ", @cmd) . "\n"; + + my @runpig = ("$script"); + IPC::Run::run(\@runpig, \undef, $log, $log) or + die "Failed running $script\n"; + $result{'rc'} = $? >> 8; + + # Get results from the command locally + my $localoutfile; + my $localdir = $testCmd->{'localpath'} . $testCmd->{'group'} . "_" . $testCmd->{'num'} . ".out"; + my @SQLQuery = @{$testCmd->{'queries'}}; # here only used to determine if single-guery of multi-query + + # mapreduce + if($self->{'exectype'} eq "mapred") + { + # single query + if ($#SQLQuery == 0) { + if ($copyResults) { + $result{'output'} = $self->postProcessSingleOutputFile($outfile, $localdir, \@baseCmd, $testCmd, $log); + $result{'originalOutput'} = "$localdir/out_original"; # populated by postProcessSingleOutputFile + } else { + $result{'output'} = "NO_COPY"; + } + } + # multi query + else { + my @outfiles = (); + for (my $id = 1; $id <= ($#SQLQuery + 1); $id++) { + $localdir = $testCmd->{'localpath'} . $testCmd->{'group'} . "_" . $testCmd->{'num'} . ".out/$id"; + $localoutfile = $outfile . ".$id"; + + # Copy result file out of hadoop + my $testOut; + if ($copyResults) { + $testOut = $self->postProcessSingleOutputFile($localoutfile, $localdir, \@baseCmd, $testCmd, $log); + } else { + $testOut = "NO_COPY"; + } + push(@outfiles, $testOut); + } + ##!!! originalOutputs not set! Needed? + $result{'outputs'} = \@outfiles; + } + } + # local mode + else + { + # single query + if ($#SQLQuery == 0) { + $localdir = $testCmd->{'localpath'} . $testCmd->{'group'} . "_" . $testCmd->{'num'} . ".dir"; + mkdir $localdir; + $result{'output'} = $self->postProcessSingleOutputFile($outfile, $localdir, \@baseCmd, $testCmd, $log); + $result{'originalOutput'} = "$localdir/out_original"; # populated by postProcessSingleOutputFile + } + # multi query + else { + my @outfiles = (); + for (my $id = 1; $id <= ($#SQLQuery + 1); $id++) { + $localdir = $testCmd->{'localpath'} . $testCmd->{'group'} . "_" . $testCmd->{'num'} . ".out"; + mkdir $localdir; + $localdir = $testCmd->{'localpath'} . $testCmd->{'group'} . "_" . $testCmd->{'num'} . ".out/$id"; + mkdir $localdir; + $localoutfile = $outfile . ".$id"; + + my $testRes = $self->postProcessSingleOutputFile($localoutfile, $localdir, \@baseCmd, $testCmd, $log); + push(@outfiles, $testRes); + } + ##!!! originalOutputs not set! + $result{'outputs'} = \@outfiles; + } + } + + # Compare doesn't get the testCmd hash, so I need to stuff the necessary + # info about sorting into the result. + if (defined $testCmd->{'sortArgs'} && $testCmd->{'sortArgs'}) { + $result{'sortArgs'} = $testCmd->{'sortArgs'}; + } + + return \%result; +} + + +sub postProcessSingleOutputFile +{ + my ($self, $outfile, $localdir, $baseCmd, $testCmd, $log) = @_; + my $subName = (caller(0))[3]; + + my $from_hdfs; + if ( ($testCmd->{'pig'} || $testCmd->{'hadoop'}) && ($self->{'exectype'} eq "mapred")) { + $from_hdfs = 1; + } else { + $from_hdfs = 0; + } + + # Copy to local if results on HDFS + if ( $from_hdfs ) { + my @baseCmd = @{$baseCmd}; + my @copyCmd = @baseCmd; + push(@copyCmd, ('-e', 'copyToLocal', $outfile, $localdir)); + print $log "$0::$className::$subName INFO: Going to run pig command: " . join(" ", @copyCmd) . "\n"; + + + my $id = `id -un`; + chomp $id; + if ($id eq 'root') { + # my @suCmd = ('su', 'hadoopqa', '-c', "'" . join(' ', @cmd) . "'"); + # print $log join(" ", @suCmd) . "\n"; + # IPC::Run::run(\@suCmd, \undef, $log, $log) or die "Cannot create HDFS directory " . $globalHash->{'outpath'} . ": $? - $!\n"; + # above failed, doing below for now... + + my $command= join (" ", @copyCmd); + $command = "echo \"$command\" | su hadoopqa 2>&1"; + print $log "$command\n"; + my @result=`$command`; + my $rc = $? >> 8; + print $log "Output from copy from HDFS: " . join (" ", @result) . "\n"; + die "Cannot copy results from HDFS $outfile to $localdir\n" if $rc != 0; + + } else { + print $log join(" ", @copyCmd) . "\n"; + IPC::Run::run(\@copyCmd, \undef, $log, $log) or die "Cannot copy results from HDFS $outfile to $localdir\n"; + } + + } + + + # Sort the result if necessary. Keep the original output in one large file. + # Use system not IPC run so that the '*' gets interpolated by the shell. + + # Build command to: + # 1. Combine part files + my $fppCmd = + ($from_hdfs ) ? "cat $localdir/map* $localdir/part* 2>/dev/null" : + (-d $outfile ) ? "cat $outfile/part* 2>/dev/null" : + "cat $outfile"; + + # 2. Standardize float precision + if (defined $testCmd->{'floatpostprocess'} && defined $testCmd->{'delimiter'}) { + $fppCmd .= " | $toolpath/floatpostprocessor '" . $testCmd->{'delimiter'} . "'"; + } + + $fppCmd .= " > $localdir/out_original"; + + # run command + print $log "$fppCmd\n"; + system($fppCmd); + + + # Sort the results for the benchmark compare. + if ( $testCmd->{'sortResults'} eq '1' ) { + my @sortCmd = ('sort', "$localdir/out_original"); + print $log join(" ", @sortCmd) . "\n"; + IPC::Run::run(\@sortCmd, '>', "$localdir/out_sorted"); + return "$localdir/out_sorted"; + } else { + return "$localdir/out_original"; + } +} + +sub generateBenchmark +{ + my ($self, $testCmd, $log) = @_; + + my %result; + + my @SQLQuery = @{$testCmd->{'queries'}}; + + if ($#SQLQuery == 0) { + my $outfile = $self->generateSingleSQLBenchmark($testCmd, $SQLQuery[0], undef, $log); + $result{'output'} = $outfile; + } else { + my @outfiles = (); + for (my $id = 0; $id < ($#SQLQuery + 1); $id++) { + my $sql = $SQLQuery[$id]; + my $outfile = $self->generateSingleSQLBenchmark($testCmd, $sql, ($id+1), $log); + push(@outfiles, $outfile); + } + $result{'outputs'} = \@outfiles; + } + + return \%result; +} + +sub generateSingleSQLBenchmark +{ + my ($self, $testCmd, $sql, $id, $log) = @_; + my $subName = (caller(0))[3]; + + my $command_directive; + if( $testCmd->{'pig'} ){ + $command_directive = 'pig'; + } elsif( $testCmd->{'hadoop'} ){ + $command_directive = 'hadoop'; + } elsif( $testCmd->{'hive'} ){ + $command_directive = 'hive'; + } elsif( $testCmd->{'hcat'} ){ + $command_directive = 'hcat'; + } elsif( $testCmd->{'script'} ){ + $command_directive = 'script'; + } else { + die "$subName FATAL Did not find a testCmd that I know how to handle"; + } + + my $qmd5 = substr(md5_hex($testCmd->{$command_directive}), 0, 5); + my $outfile = $testCmd->{'benchmarkPath'} . "/" . $testCmd->{'group'} . "_" . $testCmd->{'num'}; + $outfile .= defined($id) ? ".$id" . ".expected." . $qmd5 : ".expected." . $qmd5; + + + print $log "Getting benchmark file: $outfile\n"; + + if (-e $outfile) { + return $outfile; + } + + my @cmd = ('psql', '-U', $testCmd->{'dbuser'}, '-d', $testCmd->{'dbdb'}, + '-c', $sql, '-t', '-A', '--pset', "fieldsep=' '", '-o', $outfile); + + + # To facilitate generating the benchmarks manually on a different machine, if postgres db not configured + # cmdForFile is as cmd above just with quotes around the $sql + # Added extension '.sh' becuase the script now also does sort and float postprocessing if applicable + my @cmdForFile = ('psql', '-U', $testCmd->{'dbuser'}, '-d', $testCmd->{'dbdb'}, + '-c', '"'.$sql.'"', '-t', '-A', '--pset', "fieldsep=' '", '-o', $outfile); + my $psqlfile = $testCmd->{'localpath'} . $testCmd->{'group'} . "_" . $testCmd->{'num'} . ".psql.sh"; + open(FH, "> $psqlfile") or die "Unable to open file $psqlfile to write psql script, $ERRNO\n"; + print FH join(" ", @cmdForFile) . "\n"; + + + # Prepare to sort and postprocess the result if necessary + my $shellCmd = "cat $outfile"; + if (defined $testCmd->{'floatpostprocess'} && defined $testCmd->{'delimiter'}) { + $shellCmd .= " | $toolpath/floatpostprocessor '" . $testCmd->{'delimiter'} . "' "; + } + + if ( $testCmd->{'sortBenchmark'} eq '1' ) { + $shellCmd .= " | sort"; + if (defined $testCmd->{'sortBenchmarkArgs'}) { # but the pig test conf files don't use that anyway... + $shellCmd .= " " . join(" ", @{$testCmd->{'sortBenchmarkArgs'}}); + } + } + + my $tmpfile = $outfile . ".tmp"; + $shellCmd .= " > $tmpfile"; + + # Complete the writing to file + print FH "$shellCmd\n"; + print FH "mv $tmpfile $outfile\n"; + close(FH); + print $log "SQL command file: $psqlfile\n"; + + # Run... + print $log "Running SQL command [" . join(" ", @cmd) . "\n"; + IPC::Run::run(\@cmd, \undef, $log, $log) or do { + print $log "Sql command <" . $sql . + " failed for >>$testCmd->{group}_$testCmd->{num}<<\n"; + unlink $outfile if ( -e $outfile ); + + die "Sql command failed for >>$testCmd->{group}_$testCmd->{num}<<\n"; + }; + # Use system not IPC run so that any '*' gets interpolated by the shell. + print $log "$shellCmd\n"; + system($shellCmd); + unlink $outfile; + IPC::Run::run ['mv', $tmpfile, $outfile]; + + return $outfile; +} + +sub hasCommandLineVerifications +{ + my ($self, $testCmd, $log) = @_; + + foreach my $key ('rc', 'expected_out', 'expected_out_regex', 'expected_err', 'expected_err_regex', + 'not_expected_out', 'not_expected_out_regex', 'not_expected_err', 'not_expected_err_regex' ) { + if (defined $testCmd->{$key}) { + return 1; + } + } + return 0; +} + + +sub compare +{ + my ($self, $testResult, $benchmarkResult, $log, $testCmd) = @_; + my $subName = (caller(0))[3]; + # Returns 0 (false) for failed test, non-zero (true) for passed test + + # For now, if the test has + # - testCmd pig, and 'sql' for benchmark, then use compareToBenchmark + # - any verification directives formerly used by CmdLine or Script drivers (rc, regex on out and err...) + # then use compareScript even if testCmd is "pig" + # - testCmd script, then use compareScript + # - testCmd pig, and none of the above, then use compareToBenchmark + # + # Later, should add ability to have same tests both verify with the 'script' directives, + # and do a benchmark compare, if it was a pig cmd. E.g. 'rc' could still be checked when + # doing the benchmark compare. + + if( defined $testCmd->{'sql'} ){ + return $self->compareToBenchmark ( $testResult, $benchmarkResult, $log, $testCmd); + } elsif( $self->hasCommandLineVerifications( $testCmd, $log) ){ + return $self->compareScript ( $testResult, $log, $testCmd); + } elsif( $testCmd->{'pig'} ){ + # maybe using a custom benchmark file, and has no 'sql' directive + return $self->compareToBenchmark ( $testResult, $benchmarkResult, $log, $testCmd); + } else { + print $log "$0.$subName WARNING Did not find a comparison method. Use 'noverify' if this is intented.\n"; + return 0; + } +} + + +sub compareScript +{ + my ($self, $testResult, $log, $testCmd) = @_; + my $subName = (caller(0))[3]; + + # IMPORTANT NOTES: + # + # If you are using a regex to compare stdout or stderr + # and if the pattern that you are trying to match spans two line + # explicitly use '\n' (without the single quotes) in the regex + # + # If any verification directives are added here + # do remember also to add them to the hasCommandLineVerifications subroutine. + # + # If the test conf file misspells the directive, you won't be told... + # + + my $result = 1; # until proven wrong... + + # Return Code + if (defined $testCmd->{'rc'}) { + print $log "$0::$subName INFO Checking return code " . + "against expected <$testCmd->{'rc'}>\n"; + if ( (! defined $testResult->{'rc'}) || ($testResult->{'rc'} != $testCmd->{'rc'})) { + print $log "$0::$subName INFO Check failed: rc = <$testCmd->{'rc'}> expected, test returned rc = <$testResult->{'rc'}>\n"; + $result = 0; + } + } + + # ???? Will that ever be needed? + my $outfile = $testCmd->{'outpath'} . $testCmd->{'group'} . "_" . $testCmd->{'num'} . ".out"; + + # Standard Out + if (defined $testCmd->{'expected_out'}) { + my $pattern = $self->replaceParameters( $testCmd->{'expected_out'}, $outfile, $testCmd, $log ); + print $log "$0::$subName INFO Checking test stdout " . + "as exact match against expected <$pattern>\n"; + if ($testResult->{'stdout'} ne $pattern) { + print $log "$0::$subName INFO Check failed: exact match of <$pattern> expected in stdout: <$testResult->{'stdout'}>\n"; + $result = 0; + } + } + + if (defined $testCmd->{'not_expected_out'}) { + my $pattern = $self->replaceParameters( $testCmd->{'not_expected_out'}, $outfile, $testCmd, $log ); + print $log "$0::$subName INFO Checking test stdout " . + "as NOT exact match against expected <$pattern>\n"; + if ($testResult->{'stdout'} eq $pattern) { + print $log "$0::$subName INFO Check failed: NON-match of <$pattern> expected to stdout: <$testResult->{'stdout'}>\n"; + $result = 0; + } + } + + if (defined $testCmd->{'expected_out_regex'}) { + my $pattern = $self->replaceParameters( $testCmd->{'expected_out_regex'}, $outfile, $testCmd, $log ); + print $log "$0::$subName INFO Checking test stdout " . + "for regular expression <$pattern>\n"; + # if ($testResult->{'stdout'} !~ $pattern) { + if ($testResult->{'stdout'} !~ /$pattern/m) { + print $log "$0::$subName INFO Check failed: regex match of <$pattern> expected in stdout: <$testResult->{'stdout'}>\n"; + $result = 0; + } + } + + if (defined $testCmd->{'not_expected_out_regex'}) { + my $pattern = $self->replaceParameters( $testCmd->{'not_expected_out_regex'}, $outfile, $testCmd, $log ); + print $log "$0::$subName INFO Checking test stdout " . + "for NON-match of regular expression <$pattern>\n"; + # if ($testResult->{'stdout'} =~ $pattern) { + if ($testResult->{'stdout'} =~ /$pattern/m) { + print $log "$0::$subName INFO Check failed: regex NON-match of <$pattern> expected in stdout: <$testResult->{'output'}>\n"; + # prints HDFS location, should give local + $result = 0; + } + } + + # Standard Error + if (defined $testCmd->{'expected_err'}) { + my $pattern = $self->replaceParameters( $testCmd->{'expected_err'}, $outfile, $testCmd, $log ); + print $log "$0::$subName INFO Checking test stderr " . + "as exact match against expected <$pattern>\n"; + if ($testResult->{'stderr'} ne $pattern) { + print $log "$0::$subName INFO Check failed: exact match of <$pattern> expected in stderr: $testResult->{'stderr_file'}\n"; + $result = 0; + } + } + + if (defined $testCmd->{'not_expected_err'}) { + my $pattern = $self->replaceParameters( $testCmd->{'not_expected_err'}, $outfile, $testCmd, $log ); + print $log "$0::$subName INFO Checking test stderr " . + "as NOT an exact match against expected <$pattern>\n"; + if ($testResult->{'stderr'} eq $pattern) { + print $log "$0::$subName INFO Check failed: NON-match of <$pattern> expected to stderr: $testResult->{'stderr_file'}\n"; + $result = 0; + } + } + + if (defined $testCmd->{'expected_err_regex'}) { + my $pattern = $self->replaceParameters( $testCmd->{'expected_err_regex'}, $outfile, $testCmd, $log ); + print $log "$0::$subName INFO Checking test stderr " . + "for regular expression <$pattern>\n"; + # if ($testResult->{'stderr'} !~ $pattern) { + if ($testResult->{'stderr'} !~ /$pattern/m) { + print $log "$0::$subName INFO Check failed: regex match of <$pattern> expected in stderr: $testResult->{'stderr_file'}\n"; + $result = 0; + } + } + + if (defined $testCmd->{'not_expected_err_regex'}) { + my $pattern = $self->replaceParameters( $testCmd->{'not_expected_err_regex'}, $outfile, $testCmd, $log ); + print $log "$0::$subName INFO Checking test stderr " . + "for NON-match of regular expression <$pattern>\n"; + # if ($testResult->{'stderr'} =~ $pattern) { + if ($testResult->{'stderr'} =~ /$pattern/m) { + print $log "$0::$subName INFO Check failed: regex NON-match of <$pattern> expected in stderr: $testResult->{'stderr_file'}\n"; + $result = 0; + } + } + + return $result; +} + + +sub compareToBenchmark +{ + my ($self, $testResult, $benchmarkResult, $log, $testCmd) = @_; + my $subName = (caller(0))[3]; + + my $result; + my @SQLQuery = @{$testCmd->{'queries'}}; + + if ($#SQLQuery == 0) { + $result = $self->compareSingleOutput($testResult, $testResult->{'output'}, + $benchmarkResult->{'output'}, $log); + } else { + my $res = 0; + for (my $id = 0; $id < ($#SQLQuery + 1); $id++) { + my $testOutput = ($testResult->{'outputs'})->[$id]; + my $benchmarkOutput = ($benchmarkResult->{'outputs'})->[$id]; + $res += $self->compareSingleOutput($testResult, $testOutput, + $benchmarkOutput, $log); + $result = ($res == ($#SQLQuery + 1)) ? 1 : 0; + } + } + + return $result; +} + + +sub compareSingleOutput +{ + my ($self, $testResult, $testOutput, $benchmarkOutput, $log) = @_; + + # cksum the the two files to see if they are the same + my ($testChksm, $benchmarkChksm); + IPC::Run::run((['cat', $testOutput], '|', ['cksum']), \$testChksm, + $log) or die "$0: error: cannot run cksum on test results\n"; + IPC::Run::run((['cat', $benchmarkOutput], '|', ['cksum']), + \$benchmarkChksm, $log) or die "$0: error: cannot run cksum on benchmark\n"; + + chomp $testChksm; + chomp $benchmarkChksm; + print $log "test cksum: $testChksm\nbenchmark cksum: $benchmarkChksm\n"; + + my $result; + if ($testChksm ne $benchmarkChksm) { + print $log "Test output checksum does not match benchmark checksum\n"; + print $log "Test checksum = <$testChksm>\n"; + print $log "Expected checksum = <$benchmarkChksm>\n"; + print $log "RESULTS DIFFER: vimdiff $testOutput $benchmarkOutput\n"; + } else { + print $log "Test output matches benchmark file: $benchmarkOutput\n"; + $result = 1; + } + + # Now, check if the sort order is specified + if (defined($testResult->{'sortArgs'})) { + Util::setLocale(); + my @sortChk = ('sort', '-cs'); + push(@sortChk, @{$testResult->{'sortArgs'}}); + push(@sortChk, $testResult->{'originalOutput'}); + print $log "Going to run sort check command: " . join(" ", @sortChk) . "\n"; + IPC::Run::run(\@sortChk, \undef, $log, $log); + my $sortrc = $?; + if ($sortrc) { + print $log "Sort check failed\n"; + $result = 0; + } + } + + return $result; +} + +############################################################################### +# This method has been copied over from TestDriver to make changes to +# support skipping tests which do not match current execution mode +# +# +# Run all the tests in the configuration file. +# @param testsToRun - reference to array of test groups and ids to run +# @param testsToMatch - reference to array of test groups and ids to match. +# If a test group_num matches any of these regular expressions it will be run. +# @param cfg - reference to contents of cfg file +# @param log - reference to a stream pointer for the logs +# @param dbh - reference database connection +# @param testStatuses- reference to hash of test statuses +# @param confFile - config file name +# @param startat - test to start at. +# @returns nothing +# failed. +# +sub run +{ + my ($self, $testsToRun, $testsToMatch, $cfg, $log, $dbh, $testStatuses, + $confFile, $startat, $logname ) = @_; + my $subName = (caller(0))[3]; + + my $msg=""; + my $testDuration=0; + my $totalDuration=0; + my $groupDuration=0; + + my $sawstart = !(defined $startat); + # Rather than make each driver handle our multi-level cfg, we'll flatten + # the hashes into one for it. + my %globalHash; + + my $runAll = ((scalar(@$testsToRun) == 0) && (scalar(@$testsToMatch) == 0)); + + # Read the global keys + foreach (keys(%$cfg)) { + next if $_ eq 'groups'; + $globalHash{$_} = $cfg->{$_}; + } + + # Do the global setup + $self->globalSetup(\%globalHash, $log); + + # Used in generating Junit XML test report + my $generateJunitReport=1; + my $report=0; + my $properties; + my $xmlDir; + + if ($generateJunitReport) { + $properties= new Properties( 0, $globalHash{'propertiesFile'} ); + + # For the xml directory, use the default directory from the configuration file + # unless the directory was specified in the command line + $xmlDir= $globalHash{'localxmlpathbase'} ."/run". $globalHash{'UID'}; + if ( $globalHash{'reportdir'} ) { + $xmlDir = $globalHash{'reportdir'}; + } + } + + my %groupExecuted; + + # $cfg->{'suite'} needs to be set in bin/miners_test_harness to the name of the test conf file... + if ($cfg->{'suite'}) { + print $log "Beginning suite $cfg->{'suite'} at " . time . ($cfg->{'comment'} ? ", comment: $cfg->{'comment'}" : "") . "\n"; + } else { + print $log "Beginning suite at " . time . ($cfg->{'comment'} ? ", comment: $cfg->{'comment'}" : "") . "\n"; + } + + foreach my $group (@{$cfg->{'groups'}}) { + my %groupHash = %globalHash; + $groupHash{'group'} = $group->{'name'}; + + # Read the group keys + $groupHash{'comment'} = undef; # no inheritance of comments + foreach (keys(%$group)) { + next if $_ eq 'tests'; + $groupHash{$_} = $group->{$_}; + } + + print $log "Beginning group $groupHash{'group'} at " . time . ($groupHash{'comment'} ? ", comment: $groupHash{'comment'}" : "") . "\n"; + + # Run each test + foreach my $test (@{$group->{'tests'}}) { + # Check if we're supposed to run this one or not. + if (!$runAll) { + # check if we are supposed to run this test or not. + my $foundIt = 0; + foreach (@$testsToRun) { + if (/^$groupHash{'group'}(_[0-9]+)?$/) { + if (not defined $1) { + # In this case it's just the group name, so we'll + # run every test in the group + $foundIt = 1; + last; + } else { + # maybe, it at least matches the group + my $num = "_" . $test->{'num'}; + if ($num eq $1) { + $foundIt = 1; + last; + } + } + } + } + foreach (@$testsToMatch) { + my $protoName = $groupHash{'group'} . "_" . $test->{'num'}; + if ($protoName =~ /$_/) { + if (not defined $1) { + # In this case it's just the group name, so we'll + # run every test in the group + $foundIt = 1; + last; + } else { + # maybe, it at least matches the group + my $num = "_" . $test->{'num'}; + if ($num eq $1) { + $foundIt = 1; + last; + } + } + } + } + + next unless $foundIt; + } + + # This is a test, so run it. + my %testHash = %groupHash; + $testHash{'comment'} = undef; # no inheritance of comments + foreach (keys(%$test)) { + $testHash{$_} = $test->{$_}; + } + my $testName = $testHash{'group'} . "_" . $testHash{'num'}; + + if ( $groupExecuted{ $group->{'name'} }== 0 ){ + $groupExecuted{ $group->{'name'} }=1; + + mkpath( [ $xmlDir ] , 1, 0777) if ( ! -e $xmlDir ); + + my $filename = $group->{'name'}.".xml"; + if ($generateJunitReport) { + $report = new TestReport ( $properties, "$xmlDir/$filename" ); + $report->purge(); + } + } + + # Have we not reached the starting point yet? + if (!$sawstart) { + if ($testName eq $startat) { + $sawstart = 1; + } else { + next; + } + } + + # Check that this test doesn't depend on an earlier test or tests + # that failed, or that the test wasn't marked as "ignore". + # Don't abort if that test wasn't run, just assume the + # user knew what they were doing and set it up right. + my $skipThisOne = 0; + foreach (keys(%testHash)) { + if (/^depends_on/ && defined($testStatuses->{$testHash{$_}}) && + $testStatuses->{$testHash{$_}} ne $passedStr) { + + print $log "TEST FAILED DEPENDENCY <$testName> at " . time . + ": depended on $testHash{$_} which returned a status of $testStatuses->{$testHash{$_}}\n"; + + $testStatuses->{$testName} = $dependStr; + $skipThisOne = 1; + last; + } + # if the test is not applicable to current execution mode + # ignore it + if(/^exectype$/i && $testHash{$_} !~ /$self->{'exectype'}/i) + { + print $log "TEST IGNORED <$testName> at " . time . ". Message: running mode ($self->{'exectype'}) and exectype in test ($testHash{'exectype'}) do not match\n"; + $testStatuses->{$testName} = $skippedStr; + $skipThisOne = 1; + last; + } + + # if the test is marked as 'ignore', + # ignore it... unless option to ignore the ignore is in force + if(/^ignore$/i) + { + if($self->{'ignore'} eq 'true') + { + print $log "TEST IGNORED <$testName> at " . time . ". Message: $testHash{'ignore'}\n"; + $testStatuses->{$testName} = $skippedStr; + $skipThisOne = 1; + last; + } + elsif ($testHash{'ignore'} ne 'false') + { + print $log "TEST _NOT_ IGNORED <$testName> at " . time . ". Message: $testHash{'ignore'}\n"; + } + } + } + + if ($skipThisOne) { + printResults($testStatuses, $log, "Results so far"); + next; + } + + # Check if output comparison should be skipped. + my $dontCompareThisOne = 0; # true for tests with key 'noverify' + my $copyResults = 1; # no need to copy output to local if noverify + foreach (keys(%testHash)) { + + if(/^noverify$/i ) + { + $dontCompareThisOne = 1; + $copyResults = 0; + last; + } + } + + # print $log "Beginning test $testName at " . time . "\n"; + print $log "Beginning test $testName at " . time . ($testHash{'comment'} ? ", comment: $testHash{'comment'}" : "") . "\n"; + my %dbinfo = ( + 'testrun_id' => $testHash{'trid'}, + 'test_type' => $testHash{'driver'}, + #'test_file' => $testHash{'file'}, + 'test_file' => $confFile, + 'test_group' => $testHash{'group'}, + 'test_num' => $testHash{'num'}, + ); + my $beginTime = time; + my ($testResult, $benchmarkResult); + eval { + + + my @SQLQuery = split /;/, $testHash{'sql'}; + + # Throw out the last one if it is just space + if ($SQLQuery[$#SQLQuery] =~ /^\s+$/) { $#SQLQuery--; } + + # If the last one is a comment, decrement the count + if ($#SQLQuery > 0 && $SQLQuery[$#SQLQuery] !~ /select/i && $SQLQuery[$#SQLQuery] =~ /--/) { + $#SQLQuery--; + } + + $testHash{'queries'} = \@SQLQuery; + + $testResult = $self->runTest(\%testHash, $log, $copyResults); + my $endTime = time; + $testDuration = $endTime - $beginTime; + + $benchmarkResult = $self->generateBenchmark(\%testHash, $log); + + my $result; + if( $dontCompareThisOne ) { + $result = 1; + print $log "TEST MARKED NOVERIFY <$testName>\n"; + } else { + # implementing: + # Bugzilla Ticket 3850819 - aborted scripts has test counted as failed when using command line verificaitons + if ((defined %testHash->{'rc'}) && (%testHash->{'rc'} == 0) && ($testResult->{'rc'} != 0)) { + die "Test run assumed aborted as 'rc' = 0 expected, but actual 'rc' = $testResult->{'rc'}\n"; + } + + $result = $self->compare($testResult, $benchmarkResult, $log, \%testHash); + } + + my $command = $self->getCommand(\%testHash); + if ($result) { + $msg = "TEST SUCCEEDED <$testName> at " . time . ", command: $command, duration: $testDuration\n"; + $testStatuses->{$testName} = $passedStr; + } else { + $msg = "TEST FAILED <$testName> at " . time . ", command: $command, duration: $testDuration\n"; + $testStatuses->{$testName} = $failedStr; + } + print $log $msg; + + + $dbinfo{'duration'} = $testDuration; + $self->recordResults($result, $testResult, $benchmarkResult, + \%dbinfo, $log); + }; + + if ($@) { + my $endTime = time; + print $log "TEST ABORTED <$testName> at " . time . "\n"; + print $log "$0::$subName FAILED: Failed to run test $testName <$@>\n"; + $testStatuses->{$testName} = $abortedStr; + $testDuration = $endTime - $beginTime; + $dbinfo{'duration'} = $testDuration; + } + + eval { + $dbinfo{'status'} = $testStatuses->{$testName}; + if($dbh) { + $dbh->insertTestCase(\%dbinfo); + } + }; + if ($@) { + chomp $@; + warn "Failed to insert test case info, error <$@>\n"; + } + + $self->cleanup($testStatuses->{$testName}, \%testHash, $testResult, + $benchmarkResult, $log); + + if ($generateJunitReport) { + $report->testcase( $group->{'name'}, $testName, $testDuration, $msg, $testStatuses->{$testName} ) if ( $report ); + } + + $groupDuration = $groupDuration + $testDuration; + $totalDuration = $totalDuration + $testDuration; + printResults($testStatuses, $log, "Results so far"); + } + if ($generateJunitReport && $report ) { + my $reportname= $group->{'name'}; + if ( $globalHash{'reportname'} ) { + $reportname= $globalHash{'reportname'}; + } + # $report->systemOut( $logname, $reportname ); + printGroupResultsXml( $report, $group->{'name'}, $testStatuses, $groupDuration ); + } + $report = 0; + $groupDuration=0; + + } + + # Do the global cleanup + $self->globalCleanup(\%globalHash, $log); +} + +############################################################################## +# Sub: printGroupResultsXml +# Print the results for the group using junit xml schema using values from the testStatuses hash. +# +# Paramaters: +# $report - the report object to use to generate the report +# $groupName - the name of the group to report totals for +# $testStatuses - the hash containing the results for the tests run so far +# $totalDuration- The total time it took to run the group of tests +# +# Returns: +# None. +# +sub printGroupResultsXml +{ + my ( $report, $groupName, $testStatuses, $totalDuration) = @_; + $totalDuration=0 if ( !$totalDuration ); + + my ($pass, $fail, $abort, $depend) = (0, 0, 0, 0); + + foreach my $key (keys(%$testStatuses)) { + if ( $key =~ /^$groupName/ ){ + ($testStatuses->{$key} eq $passedStr) && $pass++; + ($testStatuses->{$key} eq $failedStr) && $fail++; + ($testStatuses->{$key} eq $abortedStr) && $abort++; + ($testStatuses->{$key} eq $dependStr) && $depend++; + } + } + + my $total= $pass + $fail + $abort; + $report->totals( $groupName, $total, $fail, $abort, $totalDuration ); + +} + + +1; + Index: src/test/e2e/hcatalog/drivers/Util.pm =================================================================== --- src/test/e2e/hcatalog/drivers/Util.pm (revision 0) +++ src/test/e2e/hcatalog/drivers/Util.pm (revision 0) @@ -0,0 +1,460 @@ +#!/usr/bin/env perl + +############################################################################ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + + +########################################################################### +# Class: Util +# +# A collection of helper subroutines. +# + + +package Util; + +############################################################################## +# Sub: localTime +# +# Returns: +# A string with the local time + +sub localTime() { + + my $retval = time(); + + my $local_time = gmtime( $retval); + + return $local_time; + +} + +############################################################################## +# Sub: formatedTime +# Returns the time with following format "$mday/$mon/$year $hour:$min:$sec $weekday[$wday]" +# +# Returns: +# formated time + +sub formatedTime() { + + my @weekday = ("Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"); + + my $retval = time(); + + my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = gmtime(time); + $year = $year + 1900; + $mon += 1; + return "$mday/$mon/$year $hour:$min:$sec $weekday[$wday]\n"; + + +} + +############################################################################## +# Sub: execCmd +# Records the command in the log and prints it to stdout before executing. +# +# Paramaters: +# $log - The log object +# $subName - The name of the subroutine the message originated at +# $lineNo - The line number of the subroutine the message originated at +# $cmd - The command string to execute +# $msg - A string, the message to print +# $level - (optional)The logging level for the message: DEBUG, INFO, WARN, ERROR, FATAL +# defaults to DEBUG. +# +# Returns: +# An array containing the output from the executed command. +# + +sub execCmd() { + + my ( $log, $subName, $lineNo, $cmd, $level ) = @_ ; + + my $count = @_; + my $thisSubName = (caller(0))[3]; + + #Check for errors in arguments + if ( $count < 4 ){ + + if ( $log ) { + $log->msg( $level, $thisSubName, __LINE__ , "Invalid number of arguments, got $count=( @_ )" ); + + } else { + print "ERROR: $0 $thisSubName at ".__LINE__."Invalid number of arguments\n"; + + } + return 1; + } + + #Log command, execute commdand, return results + $level = "DEBUG" if ( !$level ); + $log->msg( $level, $subName, $lineNo , "$cmd"); + + my @result = `$cmd`; + + $log->msg( $level, $subName, $lineNo , "@cmd") if ( @cmd ); + + return @result; +} + +sub getHadoopCmd +{ + my ( $properties ) = @_; + + my $subName = (caller(0))[3]; + my @baseCmd; + + die "$0.$subName: null properties" if (! $properties ); + + my $cmd; + + $cmd = $properties->{'gridstack.root'} . "/hadoop/current/bin/hadoop"; + if ( ! -x "$cmd" ) { + print STDERR "\n$0::$subName WARNING: Can't find hadoop command: $cmd\n"; + $cmd = `which hadoop`; + chomp $cmd; + print STDERR "$0::$subName WARNING: Instead using command: $cmd\n"; + } + if ( ! -x "$cmd" ) { + die "\n$0::$subName FATAL: Hadoop command does not exist: $cmd\n"; + } + push (@baseCmd, $cmd); + + push (@baseCmd, '--config', $properties->{'testconfigpath'}) if defined($properties->{'testconfigpath'}); + + return @baseCmd; +} + + +sub getHiveCmd +{ + my ( $properties ) = @_; + + my $subName = (caller(0))[3]; + my @baseCmd; + + die "$0.$subName: null properties" if (! $properties ); + + my $cmd; + + $cmd = $properties->{'hive_bin_location'} . "/hive"; + if ( ! -x "$cmd" ) { + die "\n$0::$subName FATAL: Hive command does not exist: $cmd\n"; + } + push (@baseCmd, $cmd); + +# push (@baseCmd, '--config', $properties->{'testconfigpath'}) if defined($properties->{'testconfigpath'}); + + return @baseCmd; +} + +sub getHCatCmd +{ + my ( $properties ) = @_; + + my $subName = (caller(0))[3]; + my @baseCmd; + + die "$0.$subName: null properties" if (! $properties ); + + my $cmd; + + $cmd = $properties->{'hcat_bin_location'}; + if ( ! -x "$cmd" ) { + print STDERR "\n$0::$subName WARNING: Can't find hcat command: $cmd\n"; + $cmd = `which hcat.sh`; + chomp $cmd; + print STDERR "$0::$subName WARNING: Instead using command: $cmd\n"; + } + die "\n$0::$subName FATAL: hcat command does not exist: $cmd\n" if ( ! -x $cmd ); + $ENV{"hive.metastore.local"} = "false"; + $ENV{"hive.metastore.uris"} = "thrift://".$properties->{'thriftserver'}; + push (@baseCmd, $cmd); + return @baseCmd; +} + + + +sub getPigCmd +{ + my $subName = (caller(0))[3]; + my $jarkey = shift; + my ( $properties ) = @_; + my $isPigSqlEnabled= 0; + my @baseCmd; + die "$0.$subName: null properties" if (! $properties ); + + #UGLY HACK for pig sql support + if ( $jarkey =~ /testsql/ ) { + + $isPigSqlEnabled= 1; + $jarkey = "testjar"; + + } + + my $cmd; + if ( $properties->{'use-pig.pl'} ) { + # The directive gives that + # 1) the 'pig' command will be called, as opposed to java + # 2) the conf file has full control over what options and parameters are + # passed to pig. + # I.e. no parameters should be passed automatically by the script here. + # + # This allows for testing of the pig script as installed, and for testin of + # the pig script's options, including error testing. + + + $cmd = $properties->{'gridstack.root'} . "/pig/" . $properties->{'pigTestBuildName'} . "/bin/pig"; + if ( ! -x "$cmd" ) { + print STDERR "\n$0::$subName WARNING: Can't find pig command: $cmd\n"; + $cmd = `which pig`; + chomp $cmd; + print STDERR "$0::$subName WARNING: Instead using command: $cmd\n"; + } + die "\n$0::$subName FATAL: Pig command does not exist: $cmd\n" if ( ! -x $cmd ); + push (@baseCmd, $cmd ); + + if(defined($properties->{'additionaljars'})) { + push( @baseCmd,'-Dpig.additional.jars='.$properties->{'additionaljars'}); + } + + + if ( $properties->{'use-pig.pl'} eq 'raw' ) { # add _no_ arguments automatically + # !!! + return @baseCmd; + } + + } else { + $cmd="java"; + + # Set JAVA options + + # User can provide only one of + # (-c ) OR (-testjar -testconfigpath ) + # "-c " is allowed only in non local mode + if(defined($properties->{'cluster.name'})) { + # use provided cluster + @baseCmd = ($cmd, '-c', $properties->{'cluster.name'}); + } else { + + die "\n$0::$subName FATAL: The jar file name must be passed in at the command line or defined in the configuration file\n" if ( !defined( $properties->{$jarkey} ) ); + die "\n$0::$subName FATAL: The jar file does not exist.\n" . $properties->{$jarkey}."\n" if ( ! -e $properties->{$jarkey} ); + + # use user provided jar + my $classpath; + + if (defined $properties->{'jythonjar'}) { + $classpath = "$classpath:" . $properties->{'jythonjar'}; + } + if( $properties->{'exectype'} eq "local") { + # in local mode, we should not use + # any hadoop-site.xml + $classpath= "$classpath:" . $properties->{$jarkey}; + $classpath= "$classpath:$properties->{'classpath'}" if ( defined( $properties->{'classpath'} ) ); + @baseCmd = ($cmd, '-cp', $classpath, '-Xmx1024m'); + + } else { + + # non local mode, we also need to specify + # location of hadoop-site.xml + die "\n$0::$subName FATAL: The hadoop configuration file name must be passed in at the command line or defined in the configuration file\n" + if ( !defined( $properties->{'testconfigpath'} ) ); + die "\n$0::$subName FATAL $! " . $properties->{'testconfigpath'}."\n\n" + if (! -e $properties->{'testconfigpath'} ); + + $classpath= "$classpath:" . $properties->{$jarkey}.":".$properties->{'testconfigpath'}; + $classpath= "$classpath:$properties->{'classpath'}" if ( defined( $properties->{'classpath'} ) ); + $classpath= "$classpath:$properties->{'howl.jar'}" if ( defined( $properties->{'howl.jar'} ) ); + @baseCmd = ($cmd, '-cp', $classpath ); + } + } + + # sets the queue, for exampel "grideng" + if(defined($properties->{'queue'})) { + push( @baseCmd,'-Dmapred.job.queue.name='.$properties->{'queue'}); + } + + if(defined($properties->{'additionaljars'})) { + push( @baseCmd,'-Dpig.additional.jars='.$properties->{'additionaljars'}); + } + + if( ( $isPigSqlEnabled == 1 ) ){ + + if(defined($properties->{'metadata.uri'})) { + push( @baseCmd, '-Dmetadata.uri='.$properties->{'metadata.uri'}); + } + + if(defined($properties->{'metadata.impl'})) { + push( @baseCmd, '-Dmetadata.impl='.$properties->{'metadata.impl'}); + }else{ + push( @baseCmd, '-Dmetadata.impl=org.apache.hadoop.owl.pig.metainterface.OwlPigMetaTables'); + } + } + + # Add howl support + if(defined($properties->{'howl.metastore.uri'})) { + push( @baseCmd, '-Dhowl.metastore.uri='.$properties->{'howl.metastore.uri'}); + } + + # Set local mode property + # if ( defined($properties->{'exectype'}) && $properties->{'exectype'}=~ "local" ) { + # Removed above 'if...' for Pig 8. + my $java=`which java`; + my $version=`file $java`; + if ( $version =~ '32-bit' ){ + push(@baseCmd,'-Djava.library.path='.$ENV{HADOOP_HOME}.'/lib/native/Linux-i386-32'); + } else { + push(@baseCmd,'-Djava.library.path='.$ENV{HADOOP_HOME}.'/lib/native/Linux-amd64-64'); + } + # } + + + # Add user provided java options if they exist + if (defined($properties->{'java_params'})) { + push(@baseCmd, @{$properties->{'java_params'}}); + } + + if(defined($properties->{'hod'})) { + push( @baseCmd, '-Dhod.server='); + } + + # sets the permissions on the jobtracker for the logs + push( @baseCmd,'-Dmapreduce.job.acl-view-job=*'); + + + # Add Main + push(@baseCmd, 'org.apache.pig.Main'); + + # Set local mode PIG option + if ( defined($properties->{'exectype'}) && $properties->{'exectype'}=~ "local" ) { + push(@baseCmd, '-x'); + push(@baseCmd, 'local'); + } + + # Set Pig SQL options + if( ( $isPigSqlEnabled == 1 ) && defined($properties->{'metadata.uri'})) { + + if ( defined($properties->{'testoutpath'}) ) { + push( @baseCmd, '-u' ); + push( @baseCmd, $properties->{'testoutpath'} ); + } + + push( @baseCmd, '-s' ); + push( @baseCmd, '-f' ); + } + + } # end else of if use-pig.pl + + + # Add -latest or -useversion + if ( $cmd =~ 'pig$' ) { + # Add -latest, or -useversion if 'current' is not target build + if ( defined($properties->{'pigTestBuildName'})) { + if ($properties->{'pigTestBuildName'} eq 'latest') { + push(@baseCmd, '-latest'); + } elsif ($properties->{'pigTestBuildName'} ne 'current') { + push(@baseCmd, '-useversion', "$properties->{'pigTestBuildName'}"); + } + } + } elsif ( $cmd =~ 'java' ) { + + # is this ever used: ??? + # Add latest if it's there + if (defined($properties->{'latest'})) { + push(@baseCmd, '-latest'); + } + } + + return @baseCmd; +} + + +sub getBasePigSqlCmd +{ + + my $subName = (caller(0))[3]; + + Util::getPigCmd( 'testsql', @_ ); + +} + +sub getBasePigCmd +{ + + my $subName = (caller(0))[3]; + + Util::getPigCmd( 'testjar', @_ ); + +} + +sub getLatestBasePigCmd +{ + + my $subName = (caller(0))[3]; + + Util::getPigCmd( 'latesttestjar', @_ ); + +} + + +sub getBenchmarkBasePigCmd +{ + my $subName = (caller(0))[3]; + my ( $properties ) = @_; + + Util::getPigCmd( 'benchmarkjar', @_ ); + +} + +sub setLocale +{ + my $locale= shift; +# $locale = "en_US.UTF-8" if ( !$locale ); +$locale = "ja_JP.utf8" if ( !$locale ); + $ENV[LC_CTYPE]="$locale"; + $ENV[LC_NUMERIC]="$locale"; + $ENV[LC_TIME]="$locale"; + $ENV[LC_COLLATE]="$locale"; + $ENV[LC_MONETARY]="$locale"; + $ENV[LC_MESSAGES]="$locale"; + $ENV[LC_PAPER]="$locale"; + $ENV[LC_NAME]="$locale"; + $ENV[LC_ADDRESS]="$locale"; + $ENV[LC_TELEPHONE]="$locale"; + $ENV[LC_MEASUREMENT]="$locale"; + $ENV[LC_IDENTIFICATION]="$locale"; +} + +sub getLocaleCmd +{ + my $locale= shift; + $locale = "en_US.UTF-8" if ( !$locale ); + + return "export LC_CTYPE=\"$locale\";" + ."export LC_NUMERIC=\"$locale\";" + ."export LC_TIME=\"$locale\";" + ."export LC_COLLATE=\"$locale\";" + ."export LC_MONETARY=\"$locale\";" + ."export LC_MESSAGES=\"$locale\";" + ."export LC_PAPER=\"$locale\";" + ."export LC_NAME=\"$locale\";" + ."export LC_ADDRESS=\"$locale\";" + ."export LC_TELEPHONE=\"$locale\";" + ."export LC_MEASUREMENT=\"$locale\";" + ."export LC_IDENTIFICATION=\"$locale\""; +} +1; Index: src/test/e2e/hcatalog/build.xml =================================================================== --- src/test/e2e/hcatalog/build.xml (revision 0) +++ src/test/e2e/hcatalog/build.xml (revision 0) @@ -0,0 +1,233 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +