From a67d92946b72c0cc34d8ba85d56a6d399fc6f0a2 Mon Sep 17 00:00:00 2001 From: "NORDEXAG\\BonschM" Date: Fri, 6 Apr 2018 21:08:30 +0200 Subject: [PATCH 01/31] Added test suite for all type conversion pairs in bmerge. --- inst/tests/tests.Rraw | 327 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 327 insertions(+) diff --git a/inst/tests/tests.Rraw b/inst/tests/tests.Rraw index ef81215f19..cbad571232 100644 --- a/inst/tests/tests.Rraw +++ b/inst/tests/tests.Rraw @@ -11572,6 +11572,333 @@ test(1898.1, set2key(DT, a), error="deprecated. Please use setindex() instead.") test(1898.2, set2keyv(DT, "a"), error="deprecated. Please use setindexv() instead.") test(1898.3, key2(DT), error="deprecated. Please use indices() instead.") +## test type coercion in joins (#2592) +dt1 <- data.table(intCol = 1L:10L, + doubleCol = as.numeric(1:10), ## only 1:10 will be integer + realDoubleCol = seq(0.5, 5, by = 0.5), + boolCol = c(rep(FALSE, 9), TRUE), + charCol = letters[1L:10L], + factCol = factor(letters[1L:10L])) + +dt2 <- data.table(intCol = 1L:5L, + doubleCol = as.numeric(1:5), ## only 1:5 will be integer + realDoubleCol = seq(0.5, 2.5, by = 0.5), + boolCol = TRUE, + charCol = letters[1L:5L], + factCol = factor(letters[1L:5L])) + +if ("package:bit64" %in% search()) { + dt1[, int64Col := as.integer64(c(1:9, 3e10))] + dt2[, int64Col := as.integer64(c(1:4, 3e9))] +} + +## no coercion when types match +test(1899.4, + nrow(dt1[dt2, on = "boolCol==boolCol"]), nrow(dt2), + warning = NULL) +test(1899.1, + nrow(dt1[dt2, on = "intCol==intCol"]), nrow(dt2), + warning = NULL) +test(1899.2, + nrow(dt1[dt2, on = "doubleCol==doubleCol"]), nrow(dt2), + warning = NULL) +test(1899.3, + nrow(dt1[dt2, on = "realDoubleCol==realDoubleCol"]), nrow(dt2), + warning = NULL) +test(1899.5, + nrow(dt1[dt2, on = "charCol==charCol"]), nrow(dt2), + warning = NULL) +test(1899.6, + nrow(dt1[dt2, on = "factCol==factCol"]), nrow(dt2), + warning = NULL) +if ("package:bit64" %in% search()) { + test(1899.7, + nrow(dt1[dt2, on = "int64Col==int64Col"]), nrow(dt2), + warning = NULL) +} + +## error on incompatible types +test(1899.8, + dt1[dt2, on = "boolCol==intCol"], + error = "incompatible types: x.boolCol (logical) and i.intCol (integer)") +test(1899.9, + dt1[dt2, on = "boolCol==doubleCol"], + error = "incompatible types: x.boolCol (logical) and i.doubleCol (numeric)") +test(1899.11, + dt1[dt2, on = "boolCol==realDoubleCol"], + error = "incompatible types: x.boolCol (logical) and i.realDoubleCol (numeric)") +test(1899.12, + dt1[dt2, on = "boolCol==charCol"], + error = "incompatible types: x.boolCol (logical) and i.charCol (character)") +test(1899.13, + dt1[dt2, on = "boolCol==factCol"], + error = "incompatible types: x.boolCol (logical) and i.factCol (factor)") +test(1899.14, + dt1[dt2, on = "intCol==charCol"], + error = "incompatible types: x.intCol (integer) and i.charCol (character)") +test(1899.15, + dt1[dt2, on = "intCol==factCol"], + error = "incompatible types: x.intCol (integer) and i.factCol (factor)") +test(1899.16, + dt1[dt2, on = "doubleCol==charCol"], + error = "incompatible types: x.doubleCol (numeric) and i.charCol (character)") +test(1899.17, + dt1[dt2, on = "realDoubleCol==charCol"], + error = "incompatible types: x.realDoubleCol (numeric) and i.charCol (character)") +test(1899.18, + dt1[dt2, on = "doubleCol==factCol"], + error = "incompatible types: x.doubleCol (numeric) and i.factCol (factor)") +test(1899.19, + dt1[dt2, on = "realDoubleCol==factCol"], + error = "incompatible types: x.realDoubleCol (numeric) and i.factCol (factor)") +test(1899.21, + dt1[dt2, on = "charCol==boolCol"], + error = "incompatible types: x.charCol (character) and i.boolCol (logical)") +test(1899.22, + dt1[dt2, on = "charCol==intCol"], + error = "incompatible types: x.charCol (character) and i.intCol (integer)") +test(1899.23, + dt1[dt2, on = "charCol==doubleCol"], + error = "incompatible types: x.charCol (character) and i.doubleCol (numeric)") +test(1899.24, + dt1[dt2, on = "charCol==realDoubleCol"], + error = "incompatible types: x.charCol (character) and i.realDoubleCol (numeric)") +test(1899.25, + dt1[dt2, on = "factCol==boolCol"], + error = "incompatible types: x.factCol (factor) and i.boolCol (logical)") +test(1899.26, + dt1[dt2, on = "factCol==intCol"], + error = "incompatible types: x.factCol (factor) and i.intCol (integer)") +test(1899.27, + dt1[dt2, on = "factCol==doubleCol"], + error = "incompatible types: x.factCol (factor) and i.doubleCol (numeric)") +test(1899.28, + dt1[dt2, on = "factCol==realDoubleCol"], + error = "incompatible types: x.factCol (factor) and i.realDoubleCol (numeric)") + +if ("package:bit64" %in% search()) { + test(1899.29, + dt1[dt2, on = "boolCol==int64Col"], + error = "incompatible types: x.boolCol (logical) and i.int64Col (integer64)") + test(1899.31, + dt1[dt2, on = "charCol==int64Col"], + error = "incompatible types: x.charCol (character) and i.int64Col (integer64)") + test(1899.32, + dt1[dt2, on = "factCol==int64Col"], + error = "incompatible types: x.factCol (factor) and i.int64Col (integer64)") + test(1899.33, + dt1[dt2, on = "int64Col==charCol"], + error = "incompatible types: x.int64Col (integer64) and i.charCol (character)") + test(1899.34, + dt1[dt2, on = "int64Col==factCol"], + error = "incompatible types: x.int64Col (integer64) and i.factCol (factor)") +} + +## correct behaviour on other types. +## 3 checks: +## - correct warning +## - correct type of the coerced columns in i and x +## - correct number of rows in the join +cols <- c("boolCol", "intCol", "doubleCol", "realDoubleCol", "charCol", "factCol") +if ("package:bit64" %in% search()) { + cols <- c(cols, "int64Col") +} +cols <- c(paste0("x.", cols), paste0("i.", cols)) ## make sure that all columns from x and i are in the result +test(1899.35, + dt1[dt2, cols, on = "intCol==boolCol", with = FALSE, nomatch = 0L], + warning = "Coercing logical column i.boolCol to integer to match type of x.intCol.") +test(1899.36, + class(dt1[dt2, cols, on = "intCol==boolCol", with = FALSE, nomatch = 0L]$i.boolCol), + "integer") +test(1899.37, + class(dt1[dt2, cols, on = "intCol==boolCol", with = FALSE, nomatch = 0L]$x.intCol), + "integer") +test(1899.38, + nrow(dt1[dt2, cols, on = "intCol==boolCol", with = FALSE, nomatch = 0L]), + 3L) +test(1899.39, + dt1[dt2, cols, on = "intCol==doubleCol", with = FALSE, nomatch = 0L], + warning = "Coercing numeric column i.doubleCol to integer to match type of x.intCol since all values in i.doubleCol are integers.") +test(1899.41, + class(dt1[dt2, cols, on = "intCol==doubleCol", with = FALSE, nomatch = 0L]$i.doubleCol), + "integer") +test(1899.42, + class(dt1[dt2, cols, on = "intCol==doubleCol", with = FALSE, nomatch = 0L]$x.intCol), + "integer") +test(1899.43, + nrow(dt1[dt2, cols, on = "intCol==doubleCol", with = FALSE, nomatch = 0L]), + 5L) +test(1899.44, + dt1[dt2, cols, on = "intCol==realDoubleCol", with = FALSE, nomatch = 0L], + warning = "Coercing integer column x.intCol to numeric to match type of i.realDoubleCol.") +test(1899.45, + class(dt1[dt2, cols, on = "intCol==realDoubleCol", with = FALSE, nomatch = 0L]$i.realDoubleCol), + "numeric") +test(1899.46, + class(dt1[dt2, cols, on = "intCol==realDoubleCol", with = FALSE, nomatch = 0L]$x.intCol), + "integer") +test(1899.47, + nrow(dt1[dt2, cols, on = "intCol==realDoubleCol", with = FALSE, nomatch = 0L]), + 2L) +test(1899.48, + dt1[dt2, cols, on = "doubleCol==boolCol", with = FALSE, nomatch = 0L], + warning = "Coercing logical column i.boolCol to numeric to match type of x.doubleCol.") +test(1899.49, + class(dt1[dt2, cols, on = "doubleCol==boolCol", with = FALSE, nomatch = 0L]$i.boolCol), + "numeric") +test(1899.51, + class(dt1[dt2, cols, on = "doubleCol==boolCol", with = FALSE, nomatch = 0L]$x.doubleCol), + "numeric") +test(1899.52, + nrow(dt1[dt2, cols, on = "doubleCol==boolCol", with = FALSE, nomatch = 0L]), + 5L) +test(1899.53, + dt1[dt2, cols, on = "realDoubleCol==boolCol", with = FALSE, nomatch = 0L], + warning = "Coercing logical column i.boolCol to numeric to match type of x.realDoubleCol.") +test(1899.54, + class(dt1[dt2, cols, on = "realDoubleCol==boolCol", with = FALSE, nomatch = 0L]$i.boolCol), + "numeric") +test(1899.55, + class(dt1[dt2, cols, on = "realDoubleCol==boolCol", with = FALSE, nomatch = 0L]$x.doubleCol), + "numeric") +test(1899.56, + nrow(dt1[dt2, cols, on = "realDoubleCol==boolCol", with = FALSE, nomatch = 0L]), + 5L) +test(1899.57, + dt1[dt2, cols, on = "doubleCol==intCol", with = FALSE, nomatch = 0L], + warning = "Coercing integer column i.intCol to numeric to match type of x.doubleCol.") +test(1899.58, + class(dt1[dt2, cols, on = "doubleCol==intCol", with = FALSE, nomatch = 0L]$i.intCol), + "numeric") +test(1899.59, + class(dt1[dt2, cols, on = "doubleCol=intCol", with = FALSE, nomatch = 0L]$x.doubleCol), + "numeric") +test(1899.61, + nrow(dt1[dt2, cols, on = "doubleCol==intCol", with = FALSE, nomatch = 0L]), + 5L) +test(1899.62, + dt1[dt2, cols, on = "realDoubleCol==intCol", with = FALSE, nomatch = 0L], + warning = "Coercing integer column i.intCol to numeric to match type of x.realDoubleCol.") +test(1899.63, + class(dt1[dt2, cols, on = "realDoubleCol==intCol", with = FALSE, nomatch = 0L]$i.intCol), + "numeric") +test(1899.64, + class(dt1[dt2, cols, on = "realDoubleCol=intCol", with = FALSE, nomatch = 0L]$x.realDoubleCol), + "numeric") +test(1899.65, + nrow(dt1[dt2, cols, on = "realDoubleCol==intCol", with = FALSE, nomatch = 0L]), + 2L) +test(1899.66, + dt1[dt2, cols, on = "charCol==factCol", with = FALSE, nomatch = 0L], + warning = "Coercing factor column i.factCol to character to match type of x.charCol.") +test(1899.67, + class(dt1[dt2, cols, on = "charCol==factCol", with = FALSE, nomatch = 0L]$i.factCol), + "character") +test(1899.68, + class(dt1[dt2, cols, on = "charCol==factCol", with = FALSE, nomatch = 0L]$x.charCol), + "character") +test(1899.69, + nrow(dt1[dt2, cols, on = "charCol==factCol", with = FALSE, nomatch = 0L]), + 5L) +test(1899.71, + dt1[dt2, cols, on = "factCol==charCol", with = FALSE, nomatch = 0L], + warning = "Coercing character column i.charCol to factor to match type of x.factCol.") +test(1899.72, + class(dt1[dt2, cols, on = "factCol==charCol", with = FALSE, nomatch = 0L]$i.charCol), + "factor") +test(1899.73, + class(dt1[dt2, cols, on = "factCol==charCol", with = FALSE, nomatch = 0L]$x.factCol), + "factor") +test(1899.74, + nrow(dt1[dt2, cols, on = "factCol==charCol", with = FALSE, nomatch = 0L]), + 5L) +if ("package:bit64" %in% search()) { + test(1899.75, + dt1[dt2, cols, on = "intCol==int64Col", with = FALSE, nomatch = 0L], + warning = "Coercing integer64 column i.int64Col to integer to match type of x.intCol.") + test(1899.76, + class(dt1[dt2, cols, on = "intCol==int64Col", with = FALSE, nomatch = 0L]$i.int64Col), + "integer") + test(1899.77, + class(dt1[dt2, cols, on = "intCol==int64Col", with = FALSE, nomatch = 0L]$x.intCol), + "integer") + test(1899.78, + nrow(dt1[dt2, cols, on = "intCol==int64Col", with = FALSE, nomatch = 0L]), + 4L, + warning = "NAs produced by integer overflow") + test(1899.79, + dt1[dt2, cols, on = "doubleCol==int64Col", with = FALSE, nomatch = 0L], + warning = "Coercing integer64 column i.int64Col to numeric to match type of x.doubleCol.") + test(1899.81, + class(dt1[dt2, cols, on = "doubleCol==int64Col", with = FALSE, nomatch = 0L]$i.int64Col), + "numeric") + test(1899.82, + class(dt1[dt2, cols, on = "doubleCol==int64Col", with = FALSE, nomatch = 0L]$x.doubleCol), + "numeric") + test(1899.83, + nrow(dt1[dt2, cols, on = "doubleCol==int64Col", with = FALSE, nomatch = 0L]), + 4L) + test(1899.84, + dt1[dt2, cols, on = "realDoubleCol==int64Col", with = FALSE, nomatch = 0L], + warning = "Coercing integer64 column i.int64Col to numeric to match type of x.realDoubleCol.") + test(1899.85, + class(dt1[dt2, cols, on = "realDoubleCol==int64Col", with = FALSE, nomatch = 0L]$i.int64Col), + "numeric") + test(1899.86, + class(dt1[dt2, cols, on = "realDoubleCol==int64Col", with = FALSE, nomatch = 0L]$x.realDoubleCol), + "numeric") + test(1899.87, + nrow(dt1[dt2, cols, on = "realDoubleCol==int64Col", with = FALSE, nomatch = 0L]), + 4L) + test(1899.88, + dt1[dt2, cols, on = "int64Col==boolCol", with = FALSE, nomatch = 0L], + warning = "Coercing logical column i.boolCol to integer64 to match type of x.int64Col.") + test(1899.89, + class(dt1[dt2, cols, on = "int64Col==boolCol", with = FALSE, nomatch = 0L]$i.boolCol), + "integer64") + test(1899.91, + class(dt1[dt2, cols, on = "int64Col==boolCol", with = FALSE, nomatch = 0L]$x.int64Col), + "integer64") + test(1899.92, + nrow(dt1[dt2, cols, on = "int64Col==boolCol", with = FALSE, nomatch = 0L]), + 5L) + test(1899.93, + dt1[dt2, cols, on = "int64Col==intCol", with = FALSE, nomatch = 0L], + warning = "Coercing integer column i.intCol to integer64 to match type of x.int64Col.") + test(1899.94, + class(dt1[dt2, cols, on = "int64Col==intCol", with = FALSE, nomatch = 0L]$i.intCol), + "integer64") + test(1899.95, + class(dt1[dt2, cols, on = "int64Col==intCol", with = FALSE, nomatch = 0L]$x.int64Col), + "integer64") + test(1899.96, + nrow(dt1[dt2, cols, on = "int64Col==intCol", with = FALSE, nomatch = 0L]), + 5L) + test(1899.97, + dt1[dt2, cols, on = "int64Col==doubleCol", with = FALSE, nomatch = 0L], + warning = "Coercing numeric column i.doubleCol to integer64 to match type of x.int64Col.") + test(1899.98, + class(dt1[dt2, cols, on = "int64Col==doubleCol", with = FALSE, nomatch = 0L]$i.doubleCol), + "integer64") + test(1899.99, + class(dt1[dt2, cols, on = "int64Col==doubleCol", with = FALSE, nomatch = 0L]$x.int64Col), + "integer64") + test(1899.101, + nrow(dt1[dt2, cols, on = "int64Col==doubleCol", with = FALSE, nomatch = 0L]), + 5L) + test(1899.102, + dt1[dt2, cols, on = "int64Col==realDoubleCol", with = FALSE, nomatch = 0L], + warning = "Coercing integer64 column x.int64Col to numeric to match type of i.realDoubleCol.") + test(1899.103, + class(dt1[dt2, cols, on = "int64Col==realDoubleCol", with = FALSE, nomatch = 0L]$i.realDoubleCol), + "numeric") + test(1899.104, + class(dt1[dt2, cols, on = "int64Col==realDoubleCol", with = FALSE, nomatch = 0L]$x.int64Col), + "integer64") + test(1899.105, + nrow(dt1[dt2, cols, on = "int64Col==realDoubleCol", with = FALSE, nomatch = 0L]), + 2L) +} ################################### # Add new tests above this line # From 29cd659113eb0fff2349ec080d2e89729ae4ac76 Mon Sep 17 00:00:00 2001 From: "NORDEXAG\\BonschM" Date: Mon, 9 Apr 2018 14:28:40 +0200 Subject: [PATCH 02/31] work in progress: join type coercion. --- inst/tests/tests.Rraw | 333 +++++++++++++++++------------------------- 1 file changed, 135 insertions(+), 198 deletions(-) diff --git a/inst/tests/tests.Rraw b/inst/tests/tests.Rraw index cbad571232..2f0e13e1b7 100644 --- a/inst/tests/tests.Rraw +++ b/inst/tests/tests.Rraw @@ -11578,31 +11578,30 @@ dt1 <- data.table(intCol = 1L:10L, realDoubleCol = seq(0.5, 5, by = 0.5), boolCol = c(rep(FALSE, 9), TRUE), charCol = letters[1L:10L], - factCol = factor(letters[1L:10L])) - + factCol = factor(letters[1L:10L]), + nonStCol = as.POSIXct("2017-01-01") + 1:10) ## class is c("POSIXct", "POSIXt") dt2 <- data.table(intCol = 1L:5L, doubleCol = as.numeric(1:5), ## only 1:5 will be integer realDoubleCol = seq(0.5, 2.5, by = 0.5), boolCol = TRUE, charCol = letters[1L:5L], - factCol = factor(letters[1L:5L])) - + factCol = factor(letters[1L:5L]), + nonStCol = as.POSIXct("2017-01-01") + 1:5) ## class is c("POSIXct", "POSIXt") if ("package:bit64" %in% search()) { dt1[, int64Col := as.integer64(c(1:9, 3e10))] dt2[, int64Col := as.integer64(c(1:4, 3e9))] } - ## no coercion when types match -test(1899.4, +test(1899.1, nrow(dt1[dt2, on = "boolCol==boolCol"]), nrow(dt2), warning = NULL) -test(1899.1, +test(1899.2, nrow(dt1[dt2, on = "intCol==intCol"]), nrow(dt2), warning = NULL) -test(1899.2, +test(1899.3, nrow(dt1[dt2, on = "doubleCol==doubleCol"]), nrow(dt2), warning = NULL) -test(1899.3, +test(1899.4, nrow(dt1[dt2, on = "realDoubleCol==realDoubleCol"]), nrow(dt2), warning = NULL) test(1899.5, @@ -11616,289 +11615,227 @@ if ("package:bit64" %in% search()) { nrow(dt1[dt2, on = "int64Col==int64Col"]), nrow(dt2), warning = NULL) } - ## error on incompatible types test(1899.8, dt1[dt2, on = "boolCol==intCol"], - error = "incompatible types: x.boolCol (logical) and i.intCol (integer)") + error = "Incompatible types: x.boolCol (logical) and i.intCol (integer)") test(1899.9, dt1[dt2, on = "boolCol==doubleCol"], - error = "incompatible types: x.boolCol (logical) and i.doubleCol (numeric)") + error = "Incompatible types: x.boolCol (logical) and i.doubleCol (numeric)") test(1899.11, dt1[dt2, on = "boolCol==realDoubleCol"], - error = "incompatible types: x.boolCol (logical) and i.realDoubleCol (numeric)") + error = "Incompatible types: x.boolCol (logical) and i.realDoubleCol (numeric)") test(1899.12, dt1[dt2, on = "boolCol==charCol"], - error = "incompatible types: x.boolCol (logical) and i.charCol (character)") + error = "Incompatible types: x.boolCol (logical) and i.charCol (character)") test(1899.13, dt1[dt2, on = "boolCol==factCol"], - error = "incompatible types: x.boolCol (logical) and i.factCol (factor)") + error = "Incompatible types: x.boolCol (logical) and i.factCol (factor)") test(1899.14, dt1[dt2, on = "intCol==charCol"], - error = "incompatible types: x.intCol (integer) and i.charCol (character)") + error = "Incompatible types: x.intCol (integer) and i.charCol (character)") test(1899.15, dt1[dt2, on = "intCol==factCol"], - error = "incompatible types: x.intCol (integer) and i.factCol (factor)") + error = "Incompatible types: x.intCol (integer) and i.factCol (factor)") test(1899.16, dt1[dt2, on = "doubleCol==charCol"], - error = "incompatible types: x.doubleCol (numeric) and i.charCol (character)") + error = "Incompatible types: x.doubleCol (numeric) and i.charCol (character)") test(1899.17, dt1[dt2, on = "realDoubleCol==charCol"], - error = "incompatible types: x.realDoubleCol (numeric) and i.charCol (character)") + error = "Incompatible types: x.realDoubleCol (numeric) and i.charCol (character)") test(1899.18, dt1[dt2, on = "doubleCol==factCol"], - error = "incompatible types: x.doubleCol (numeric) and i.factCol (factor)") + error = "Incompatible types: x.doubleCol (numeric) and i.factCol (factor)") test(1899.19, dt1[dt2, on = "realDoubleCol==factCol"], - error = "incompatible types: x.realDoubleCol (numeric) and i.factCol (factor)") + error = "Incompatible types: x.realDoubleCol (numeric) and i.factCol (factor)") test(1899.21, dt1[dt2, on = "charCol==boolCol"], - error = "incompatible types: x.charCol (character) and i.boolCol (logical)") + error = "Incompatible types: x.charCol (character) and i.boolCol (logical)") test(1899.22, dt1[dt2, on = "charCol==intCol"], - error = "incompatible types: x.charCol (character) and i.intCol (integer)") + error = "Incompatible types: x.charCol (character) and i.intCol (integer)") test(1899.23, dt1[dt2, on = "charCol==doubleCol"], - error = "incompatible types: x.charCol (character) and i.doubleCol (numeric)") + error = "Incompatible types: x.charCol (character) and i.doubleCol (numeric)") test(1899.24, dt1[dt2, on = "charCol==realDoubleCol"], - error = "incompatible types: x.charCol (character) and i.realDoubleCol (numeric)") + error = "Incompatible types: x.charCol (character) and i.realDoubleCol (numeric)") test(1899.25, dt1[dt2, on = "factCol==boolCol"], - error = "incompatible types: x.factCol (factor) and i.boolCol (logical)") + error = "Incompatible types: x.factCol (factor) and i.boolCol (logical)") test(1899.26, dt1[dt2, on = "factCol==intCol"], - error = "incompatible types: x.factCol (factor) and i.intCol (integer)") + error = "Incompatible types: x.factCol (factor) and i.intCol (integer)") test(1899.27, dt1[dt2, on = "factCol==doubleCol"], - error = "incompatible types: x.factCol (factor) and i.doubleCol (numeric)") + error = "Incompatible types: x.factCol (factor) and i.doubleCol (numeric)") test(1899.28, dt1[dt2, on = "factCol==realDoubleCol"], - error = "incompatible types: x.factCol (factor) and i.realDoubleCol (numeric)") - + error = "Incompatible types: x.factCol (factor) and i.realDoubleCol (numeric)") if ("package:bit64" %in% search()) { test(1899.29, dt1[dt2, on = "boolCol==int64Col"], - error = "incompatible types: x.boolCol (logical) and i.int64Col (integer64)") + error = "Incompatible types: x.boolCol (logical) and i.int64Col (integer64)") test(1899.31, dt1[dt2, on = "charCol==int64Col"], - error = "incompatible types: x.charCol (character) and i.int64Col (integer64)") + error = "Incompatible types: x.charCol (character) and i.int64Col (integer64)") test(1899.32, dt1[dt2, on = "factCol==int64Col"], - error = "incompatible types: x.factCol (factor) and i.int64Col (integer64)") + error = "Incompatible types: x.factCol (factor) and i.int64Col (integer64)") test(1899.33, dt1[dt2, on = "int64Col==charCol"], - error = "incompatible types: x.int64Col (integer64) and i.charCol (character)") + error = "Incompatible types: x.int64Col (integer64) and i.charCol (character)") test(1899.34, dt1[dt2, on = "int64Col==factCol"], - error = "incompatible types: x.int64Col (integer64) and i.factCol (factor)") + error = "Incompatible types: x.int64Col (integer64) and i.factCol (factor)") } - ## correct behaviour on other types. -## 3 checks: +## 4 checks: ## - correct warning ## - correct type of the coerced columns in i and x ## - correct number of rows in the join -cols <- c("boolCol", "intCol", "doubleCol", "realDoubleCol", "charCol", "factCol") +cols <- c("boolCol", "intCol", "doubleCol", "realDoubleCol", "charCol", "factCol", "nonStCol") if ("package:bit64" %in% search()) { cols <- c(cols, "int64Col") } cols <- c(paste0("x.", cols), paste0("i.", cols)) ## make sure that all columns from x and i are in the result test(1899.35, + result <- dt1[dt2, cols, on = "intCol==boolCol", with = FALSE, nomatch = 0L, verbose = TRUE], dt1[dt2, cols, on = "intCol==boolCol", with = FALSE, nomatch = 0L], - warning = "Coercing logical column i.boolCol to integer to match type of x.intCol.") -test(1899.36, - class(dt1[dt2, cols, on = "intCol==boolCol", with = FALSE, nomatch = 0L]$i.boolCol), - "integer") -test(1899.37, - class(dt1[dt2, cols, on = "intCol==boolCol", with = FALSE, nomatch = 0L]$x.intCol), - "integer") -test(1899.38, - nrow(dt1[dt2, cols, on = "intCol==boolCol", with = FALSE, nomatch = 0L]), - 3L) + output = "Coercing logical column i.boolCol to integer to match type of x.intCol.") +test(1899.36, class(result$i.boolCol), "integer") +test(1899.37, class(result$x.intCol), "integer") +test(1899.38, nrow(result), 5L) test(1899.39, + result <- dt1[dt2, cols, on = "intCol==doubleCol", with = FALSE, nomatch = 0L, verbose = TRUE], dt1[dt2, cols, on = "intCol==doubleCol", with = FALSE, nomatch = 0L], - warning = "Coercing numeric column i.doubleCol to integer to match type of x.intCol since all values in i.doubleCol are integers.") -test(1899.41, - class(dt1[dt2, cols, on = "intCol==doubleCol", with = FALSE, nomatch = 0L]$i.doubleCol), - "integer") -test(1899.42, - class(dt1[dt2, cols, on = "intCol==doubleCol", with = FALSE, nomatch = 0L]$x.intCol), - "integer") -test(1899.43, - nrow(dt1[dt2, cols, on = "intCol==doubleCol", with = FALSE, nomatch = 0L]), - 5L) + output = "Coercing numeric column i.doubleCol to integer to match type of x.intCol.") +test(1899.41, class(result$i.doubleCol), "integer") +test(1899.42, class(result$x.intCol), "integer") +test(1899.43, nrow(result), 5L) test(1899.44, + result <- dt1[dt2, cols, on = "intCol==realDoubleCol", with = FALSE, nomatch = 0L, verbose = TRUE], dt1[dt2, cols, on = "intCol==realDoubleCol", with = FALSE, nomatch = 0L], - warning = "Coercing integer column x.intCol to numeric to match type of i.realDoubleCol.") -test(1899.45, - class(dt1[dt2, cols, on = "intCol==realDoubleCol", with = FALSE, nomatch = 0L]$i.realDoubleCol), - "numeric") -test(1899.46, - class(dt1[dt2, cols, on = "intCol==realDoubleCol", with = FALSE, nomatch = 0L]$x.intCol), - "integer") -test(1899.47, - nrow(dt1[dt2, cols, on = "intCol==realDoubleCol", with = FALSE, nomatch = 0L]), - 2L) + output = "Coercing integer column x.intCol to numeric to match type of i.realDoubleCol.") +test(1899.45, class(result$i.realDoubleCol), "numeric") +test(1899.46, class(result$x.intCol), "integer") ## coercion of x columns is only for the join. The original type is returned. +test(1899.47, nrow(result), 2L) test(1899.48, + result <- dt1[dt2, cols, on = "doubleCol==boolCol", with = FALSE, nomatch = 0L, verbose = TRUE], dt1[dt2, cols, on = "doubleCol==boolCol", with = FALSE, nomatch = 0L], - warning = "Coercing logical column i.boolCol to numeric to match type of x.doubleCol.") -test(1899.49, - class(dt1[dt2, cols, on = "doubleCol==boolCol", with = FALSE, nomatch = 0L]$i.boolCol), - "numeric") -test(1899.51, - class(dt1[dt2, cols, on = "doubleCol==boolCol", with = FALSE, nomatch = 0L]$x.doubleCol), - "numeric") -test(1899.52, - nrow(dt1[dt2, cols, on = "doubleCol==boolCol", with = FALSE, nomatch = 0L]), - 5L) + output = "Coercing logical column i.boolCol to numeric to match type of x.doubleCol.") +test(1899.49, class(result$i.boolCol), "numeric") +test(1899.51, class(result$x.doubleCol), "numeric") +test(1899.52, nrow(result), 5L) test(1899.53, + result <- dt1[dt2, cols, on = "realDoubleCol==boolCol", with = FALSE, nomatch = 0L, verbose = TRUE], dt1[dt2, cols, on = "realDoubleCol==boolCol", with = FALSE, nomatch = 0L], - warning = "Coercing logical column i.boolCol to numeric to match type of x.realDoubleCol.") -test(1899.54, - class(dt1[dt2, cols, on = "realDoubleCol==boolCol", with = FALSE, nomatch = 0L]$i.boolCol), - "numeric") -test(1899.55, - class(dt1[dt2, cols, on = "realDoubleCol==boolCol", with = FALSE, nomatch = 0L]$x.doubleCol), - "numeric") -test(1899.56, - nrow(dt1[dt2, cols, on = "realDoubleCol==boolCol", with = FALSE, nomatch = 0L]), - 5L) + output = "Coercing logical column i.boolCol to numeric to match type of x.realDoubleCol.") +test(1899.54, class(result$i.boolCol), "numeric") +test(1899.55, class(result$x.doubleCol), "numeric") +test(1899.56, nrow(result), 5L) test(1899.57, + result <- dt1[dt2, cols, on = "doubleCol==intCol", with = FALSE, nomatch = 0L, verbose = TRUE], dt1[dt2, cols, on = "doubleCol==intCol", with = FALSE, nomatch = 0L], - warning = "Coercing integer column i.intCol to numeric to match type of x.doubleCol.") -test(1899.58, - class(dt1[dt2, cols, on = "doubleCol==intCol", with = FALSE, nomatch = 0L]$i.intCol), - "numeric") -test(1899.59, - class(dt1[dt2, cols, on = "doubleCol=intCol", with = FALSE, nomatch = 0L]$x.doubleCol), - "numeric") -test(1899.61, - nrow(dt1[dt2, cols, on = "doubleCol==intCol", with = FALSE, nomatch = 0L]), - 5L) + output = "Coercing integer column i.intCol to numeric to match type of x.doubleCol.") +test(1899.58, class(result$i.intCol), "numeric") +test(1899.59, class(result$x.doubleCol), "numeric") +test(1899.61, nrow(result), 5L) test(1899.62, + result <- dt1[dt2, cols, on = "realDoubleCol==intCol", with = FALSE, nomatch = 0L, verbose = TRUE], dt1[dt2, cols, on = "realDoubleCol==intCol", with = FALSE, nomatch = 0L], - warning = "Coercing integer column i.intCol to numeric to match type of x.realDoubleCol.") -test(1899.63, - class(dt1[dt2, cols, on = "realDoubleCol==intCol", with = FALSE, nomatch = 0L]$i.intCol), - "numeric") -test(1899.64, - class(dt1[dt2, cols, on = "realDoubleCol=intCol", with = FALSE, nomatch = 0L]$x.realDoubleCol), - "numeric") -test(1899.65, - nrow(dt1[dt2, cols, on = "realDoubleCol==intCol", with = FALSE, nomatch = 0L]), - 2L) + output = "Coercing integer column i.intCol to numeric to match type of x.realDoubleCol.") +test(1899.63, class(result$i.intCol), "numeric") +test(1899.64, class(result$x.realDoubleCol), "numeric") +test(1899.65, nrow(result), 5L) test(1899.66, + result <- dt1[dt2, cols, on = "charCol==factCol", with = FALSE, nomatch = 0L, verbose = TRUE], dt1[dt2, cols, on = "charCol==factCol", with = FALSE, nomatch = 0L], - warning = "Coercing factor column i.factCol to character to match type of x.charCol.") -test(1899.67, - class(dt1[dt2, cols, on = "charCol==factCol", with = FALSE, nomatch = 0L]$i.factCol), - "character") -test(1899.68, - class(dt1[dt2, cols, on = "charCol==factCol", with = FALSE, nomatch = 0L]$x.charCol), - "character") -test(1899.69, - nrow(dt1[dt2, cols, on = "charCol==factCol", with = FALSE, nomatch = 0L]), - 5L) + output = "Coercing factor column i.factCol to character to match type of x.charCol.") +test(1899.67, class(result$i.factCol), "character") +test(1899.68, class(result$x.charCol), "character") +test(1899.69, nrow(result), 5L) test(1899.71, + result <- dt1[dt2, cols, on = "factCol==charCol", with = FALSE, nomatch = 0L, verbose = TRUE], dt1[dt2, cols, on = "factCol==charCol", with = FALSE, nomatch = 0L], - warning = "Coercing character column i.charCol to factor to match type of x.factCol.") -test(1899.72, - class(dt1[dt2, cols, on = "factCol==charCol", with = FALSE, nomatch = 0L]$i.charCol), - "factor") -test(1899.73, - class(dt1[dt2, cols, on = "factCol==charCol", with = FALSE, nomatch = 0L]$x.factCol), - "factor") -test(1899.74, - nrow(dt1[dt2, cols, on = "factCol==charCol", with = FALSE, nomatch = 0L]), - 5L) + output = "Coercing character column i.charCol to factor to match type of x.factCol.") +test(1899.72, class(result$i.charCol), "factor") +test(1899.73, class(result$x.factCol), "factor") +test(1899.74, nrow(result), 5L) if ("package:bit64" %in% search()) { test(1899.75, + result <- dt1[dt2, cols, on = "intCol==int64Col", with = FALSE, nomatch = 0L, verbose = TRUE], dt1[dt2, cols, on = "intCol==int64Col", with = FALSE, nomatch = 0L], - warning = "Coercing integer64 column i.int64Col to integer to match type of x.intCol.") - test(1899.76, - class(dt1[dt2, cols, on = "intCol==int64Col", with = FALSE, nomatch = 0L]$i.int64Col), - "integer") - test(1899.77, - class(dt1[dt2, cols, on = "intCol==int64Col", with = FALSE, nomatch = 0L]$x.intCol), - "integer") - test(1899.78, - nrow(dt1[dt2, cols, on = "intCol==int64Col", with = FALSE, nomatch = 0L]), - 4L, + output = "Coercing integer64 column i.int64Col to integer to match type of x.intCol.", warning = "NAs produced by integer overflow") + test(1899.76, class(result$i.int64Col), "integer") + test(1899.77, class(result$x.intCol), "integer") + test(1899.78, nrow(result), 4L) test(1899.79, + result <- dt1[dt2, cols, on = "doubleCol==int64Col", with = FALSE, nomatch = 0L, verbose = TRUE], dt1[dt2, cols, on = "doubleCol==int64Col", with = FALSE, nomatch = 0L], - warning = "Coercing integer64 column i.int64Col to numeric to match type of x.doubleCol.") - test(1899.81, - class(dt1[dt2, cols, on = "doubleCol==int64Col", with = FALSE, nomatch = 0L]$i.int64Col), - "numeric") - test(1899.82, - class(dt1[dt2, cols, on = "doubleCol==int64Col", with = FALSE, nomatch = 0L]$x.doubleCol), - "numeric") - test(1899.83, - nrow(dt1[dt2, cols, on = "doubleCol==int64Col", with = FALSE, nomatch = 0L]), - 4L) + output = "Coercing integer64 column i.int64Col to numeric to match type of x.doubleCol.") + test(1899.81, class(result$i.int64Col), "numeric") + test(1899.82, class(result$x.doubleCol), "numeric") + test(1899.83, nrow(result), 4L) test(1899.84, + result <- dt1[dt2, cols, on = "realDoubleCol==int64Col", with = FALSE, nomatch = 0L, verbose = TRUE], dt1[dt2, cols, on = "realDoubleCol==int64Col", with = FALSE, nomatch = 0L], - warning = "Coercing integer64 column i.int64Col to numeric to match type of x.realDoubleCol.") - test(1899.85, - class(dt1[dt2, cols, on = "realDoubleCol==int64Col", with = FALSE, nomatch = 0L]$i.int64Col), - "numeric") - test(1899.86, - class(dt1[dt2, cols, on = "realDoubleCol==int64Col", with = FALSE, nomatch = 0L]$x.realDoubleCol), - "numeric") - test(1899.87, - nrow(dt1[dt2, cols, on = "realDoubleCol==int64Col", with = FALSE, nomatch = 0L]), - 4L) + output = "Coercing integer64 column i.int64Col to numeric to match type of x.realDoubleCol.") + test(1899.85, class(result$i.int64Col), "numeric") + test(1899.86, class(result$x.realDoubleCol), "numeric") + test(1899.87, nrow(result), 4L) test(1899.88, + result <- dt1[dt2, cols, on = "int64Col==boolCol", with = FALSE, nomatch = 0L, verbose = TRUE], dt1[dt2, cols, on = "int64Col==boolCol", with = FALSE, nomatch = 0L], - warning = "Coercing logical column i.boolCol to integer64 to match type of x.int64Col.") - test(1899.89, - class(dt1[dt2, cols, on = "int64Col==boolCol", with = FALSE, nomatch = 0L]$i.boolCol), - "integer64") - test(1899.91, - class(dt1[dt2, cols, on = "int64Col==boolCol", with = FALSE, nomatch = 0L]$x.int64Col), - "integer64") - test(1899.92, - nrow(dt1[dt2, cols, on = "int64Col==boolCol", with = FALSE, nomatch = 0L]), - 5L) + output = "Coercing logical column i.boolCol to integer64 to match type of x.int64Col.") + test(1899.89, class(result$i.boolCol), "integer64") + test(1899.91, class(result$x.int64Col), "integer64") + test(1899.92, nrow(result), 5L) test(1899.93, + result <- dt1[dt2, cols, on = "int64Col==intCol", with = FALSE, nomatch = 0L, verbose = TRUE], dt1[dt2, cols, on = "int64Col==intCol", with = FALSE, nomatch = 0L], - warning = "Coercing integer column i.intCol to integer64 to match type of x.int64Col.") - test(1899.94, - class(dt1[dt2, cols, on = "int64Col==intCol", with = FALSE, nomatch = 0L]$i.intCol), - "integer64") - test(1899.95, - class(dt1[dt2, cols, on = "int64Col==intCol", with = FALSE, nomatch = 0L]$x.int64Col), - "integer64") - test(1899.96, - nrow(dt1[dt2, cols, on = "int64Col==intCol", with = FALSE, nomatch = 0L]), - 5L) + output = "Coercing integer column i.intCol to integer64 to match type of x.int64Col.") + test(1899.94, class(result$i.intCol), "integer64") + test(1899.95, class(result$x.int64Col), "integer64") + test(1899.96, nrow(result), 5L) test(1899.97, + result <- dt1[dt2, cols, on = "int64Col==doubleCol", with = FALSE, nomatch = 0L, verbose = TRUE], dt1[dt2, cols, on = "int64Col==doubleCol", with = FALSE, nomatch = 0L], - warning = "Coercing numeric column i.doubleCol to integer64 to match type of x.int64Col.") - test(1899.98, - class(dt1[dt2, cols, on = "int64Col==doubleCol", with = FALSE, nomatch = 0L]$i.doubleCol), - "integer64") - test(1899.99, - class(dt1[dt2, cols, on = "int64Col==doubleCol", with = FALSE, nomatch = 0L]$x.int64Col), - "integer64") - test(1899.101, - nrow(dt1[dt2, cols, on = "int64Col==doubleCol", with = FALSE, nomatch = 0L]), - 5L) + output = "Coercing numeric column i.doubleCol to integer64 to match type of x.int64Col.") + test(1899.98, class(result$i.doubleCol), "integer64") + test(1899.99, class(result$x.int64Col), "integer64") + test(1899.101, nrow(result), 5L) test(1899.102, + result <- dt1[dt2, cols, on = "int64Col==realDoubleCol", with = FALSE, nomatch = 0L, verbose = TRUE], dt1[dt2, cols, on = "int64Col==realDoubleCol", with = FALSE, nomatch = 0L], - warning = "Coercing integer64 column x.int64Col to numeric to match type of i.realDoubleCol.") - test(1899.103, - class(dt1[dt2, cols, on = "int64Col==realDoubleCol", with = FALSE, nomatch = 0L]$i.realDoubleCol), - "numeric") - test(1899.104, - class(dt1[dt2, cols, on = "int64Col==realDoubleCol", with = FALSE, nomatch = 0L]$x.int64Col), - "integer64") - test(1899.105, - nrow(dt1[dt2, cols, on = "int64Col==realDoubleCol", with = FALSE, nomatch = 0L]), - 2L) + output = "Coercing integer64 column x.int64Col to numeric to match type of i.realDoubleCol.") + test(1899.103, class(result$i.realDoubleCol), "numeric") + test(1899.104, class(result$x.int64Col), "integer64") ## coercion of x columns is only for the join. The original type is returned. + test(1899.105, nrow(result), 2L) } +## correct behaviour if non-standard types are involved: +test(1899.106, + nrow(dt1[dt2, on = "nonStCol==nonStCol"]), nrow(dt2), + warning = NULL) +test(1899.107, + result <- dt1[dt2, cols, on = "nonStCol==doubleCol", with = FALSE, nomatch = 0L], + dt1[dt2, cols, on = "nonStCol==doubleCol", with = FALSE, nomatch = 0L], + warning = "Joining on columns of different class: x.nonStCol (POSIXct,POSIXt) and i.doubleCol (numeric). Join works since both columns are of the same type: double") +test(1899.108, class(result$i.doubleCol), "numeric") +test(1899.109, class(result$x.nonStCol), c("POSIXct", "POSIXt")) +test(1899.111, nrow(result), 0L) +test(1899.112, + result <- dt1[dt2, cols, on = "nonStCol==intCol", with = FALSE, nomatch = 0L], + error = "Incompatible types: x.nonStCol (POSIXct,POSIXt) and i.intCol (integer)") +test(1899.113, + result <- dt1[dt2, cols, on = "doubleCol==nonStCol", with = FALSE, nomatch = 0L], + dt1[dt2, cols, on = "doubleCol==nonStCol", with = FALSE, nomatch = 0L], + warning = "Joining on columns of different class: x.doubleCol (numeric) and i.nonStCol (POSIXct,POSIXt). Join works since both columns are of the same type: double") +test(1899.114, class(result$i.nonStCol), c("POSIXct", "POSIXt")) +test(1899.115, class(result$x.doubleCol), "numeric") +test(1899.116, nrow(result), 0L) ################################### # Add new tests above this line # From 04f06070e4a0ebb4354ca1f9187142db77ea3fb5 Mon Sep 17 00:00:00 2001 From: "NORDEXAG\\BonschM" Date: Mon, 9 Apr 2018 14:34:29 +0200 Subject: [PATCH 03/31] Work in progress: join type coercion --- R/bmerge.R | 165 +++++++++++++++++++++++++++++++++++++---------------- 1 file changed, 117 insertions(+), 48 deletions(-) diff --git a/R/bmerge.R b/R/bmerge.R index 25903ca026..f2e2f6e62e 100644 --- a/R/bmerge.R +++ b/R/bmerge.R @@ -10,83 +10,152 @@ bmerge <- function(i, x, leftcols, rightcols, io, xo, roll, rollends, nomatch, m # Important that i is already passed in as a shallow copy, due to these coercions for factors. # i.e. bmerge(i<-shallow(i),...) # The caller ([.data.table) then uses the coerced columns to build the output - # careful to only plonk syntax (full column) on i from now on (otherwise i would change) # TO DO: enforce via .internal.shallow attribute and expose shallow() to users # This is why shallow() is very importantly internal only, currently. - + + # In contrast, x is not passed as shallow, but is shallow copied inside bmerge. + # This allows for coercion of column types for the join, + # but the calling function only sees the original column types of x + # careful to only plonk syntax (full column) on x from now on (otherwise x would change) + + x = shallow(x) origi = shallow(i) # Needed for factor to factor/character joins, to recover the original levels # Otherwise, types of i join columns are anyways promoted to match x's # types (with warning or verbose) resetifactor = NULL # Keep track of any factor to factor/character join cols (only time we keep orig) + + ## function to determine type of columns. Important not to use typeof since integer and factor have same type (integer) + getClass <- function(x){ + out <- class(x) + if(length(out) > 1) out <- "other" + if(!out %chin% c("logical", "integer", "numeric", "character", "factor", "integer64")) out <- "other" + if(out == "numeric"){ + if(isReallyReal(x)) out <- "realNumeric" ## otherwise, it can be coerced to integer without problems + } + return(out) + } + ## The following column types throw an error when joined together. Column in x is on the left of == + typeErrorClasses = c("logical==integer", "logical==numeric", "logical==realNumeric", "logical==character", "logical==factor", "logical==integer64", + "integer==character", "integer==factor", + "numeric==character", "numeric==factor", + "realNumeric==character", "realNumeric==factor", + "character==logical", "character==integer", "character==numeric", "character==realNumeric", "character==integer64", + "factor==logical", "factor==integer", "factor==numeric", "factor==realNumeric", "factor==integer64", + "integer64==character", "integer64==factor") + ## The following column types need no specific treatment when joined together + typeNoTreatment = c("logical==logical", "integer==integer", + "numeric==numeric", "numeric==realNumeric", + "realNumeric==numeric", "realNumeric==realNumeric", + "character==character", ## factor == factor needs treatment to consolidate levels + "integer64==integer64" + ) + ## The following column types need simple coercion of the column in i by setting the mode(i[[lc]]) <- "newclass", + ## where newclass is the class on the left of == + typeModeCoercionI = c("integer==logical", "integer==numeric", ## not for realNumeric!! + "numeric==logical", "numeric==integer", + "realNumeric==logical", "realNumeric==integer") + ## The following column types need simple coercion of the column in x by setting the mode(x[[rc]]) <- "newclass", + ## where newclass is the class on the rigth of == + typeModeCoercionX = c("integer==realNumeric") + ## The following column types need coercion of the column in i by calling as.newclass(i[[lc]]), + ## where newclass is the class on the left of == + typeCastCoercionI = c("integer==integer64", "numeric==integer64", "realNumeric==integer64", + "integer64==logical", "integer64==integer", "integer64==numeric", + "character==factor") + ## The following column types need coercion of the column in x by calling as.newclass(x[[rc]]), + ## where newclass is the class on the right of == + typeCastCoercionX = c("integer64==realNumeric") + for (a in seq_along(leftcols)) { - # This loop is simply to support joining factor columns + # This loop does the following: + # - check that join columns have compatible types + # - do type coercions if necessary + # - special support for joining factor columns # Note that if i is keyed, if this coerces, i's key gets dropped and the key may not be retained lc = leftcols[a] # i # TO DO: rename left and right to i and x rc = rightcols[a] # x icnam = names(i)[lc] xcnam = names(x)[rc] - if (is.character(x[[rc]])) { - if (is.character(i[[lc]])) next - if (!is.factor(i[[lc]])) - stop("x.'",xcnam,"' is a character column being joined to i.'",icnam,"' which is type '",typeof(i[[lc]]),"'. Character columns must join to factor or character columns.") - if (verbose) cat("Coercing factor column i.'",icnam,"' to character to match type of x.'",xcnam,"'.\n",sep="") - set(i,j=lc,value=as.character(i[[lc]])) - # no longer copies all of i, thanks to shallow() and :=/set + myXclass = getClass(x[[rc]]) + myIclass = getClass(i[[lc]]) + myXtype = if(myXclass == "realNumeric") "numeric" else myXclass + myItype = if(myIclass == "realNumeric") "numeric" else myIclass + joinTypeIdentifier = paste0(myXclass, "==", myIclass) + if(joinTypeIdentifier %chin% typeNoTreatment){ next - } - if (is.factor(x[[rc]])) { - if (is.character(i[[lc]])) { - if (verbose) cat("Coercing character column i.'",icnam,"' to factor to match type of x.'",xcnam,"'. If possible please change x.'",xcnam,"' to character. Character columns are now preferred in joins.\n",sep="") + } else if(joinTypeIdentifier %chin% typeErrorClasses){ + stop(sprintf("Incompatible types: %s (%s) and %s (%s)", + paste0("x.", xcnam), myXtype, paste0("i.", icnam), myItype)) + } else if(joinTypeIdentifier %chin% typeModeCoercionI){ + ## coerce i[[lc]] to same class as x[[rc]] by mode() approach + if (verbose) {cat(sprintf("Coercing %s column %s to %s to match type of %s.", + myItype, paste0("i.", icnam), myXtype, paste0("x.", xcnam))); flush.console()} + newval = i[[lc]] + mode(newval) = myXtype # retains column attributes (such as IDateTime class) + set(i, j=lc, value=newval) + } else if(joinTypeIdentifier %chin% typeModeCoercionX){ + ## coerce x[[rc]] to same class as i[[lc]] by mode() approach + if (verbose) {cat(sprintf("Coercing %s column %s to %s to match type of %s.", + myXtype, paste0("x.", xcnam), myItype, paste0("i.", icnam))); flush.console()} + newval = x[[rc]] + mode(newval) = myItype # retains column attributes (such as IDateTime class) + set(x, j=rc, value=newval) + } else if(joinTypeIdentifier %chin% typeCastCoercionI){ + ## coerce i[[lc]] to same class as x[[rc]] by as.newclass() approach + converter <- match.fun(paste0("as.", myXtype)) + if (verbose) {cat(sprintf("Coercing %s column %s to %s to match type of %s.", + myItype, paste0("i.", icnam), myXtype, paste0("x.", xcnam))); flush.console()} + newval = i[[lc]] + newval = converter(newval) + set(i, j=lc, value=newval) + } else if(joinTypeIdentifier %chin% typeCastCoercionX){ + ## coerce x[[rc]] to same class as i[[lc]] by as.newclass() approach + converter <- match.fun(paste0("as.", myItype)) + if (verbose) {cat(sprintf("Coercing %s column %s to %s to match type of %s.", + myXtype, paste0("x.", xcnam), myItype, paste0("i.", icnam))); flush.console()} + newval = x[[rc]] + newval = converter(newval) + set(x, j=rc, value=newval) + } else if(joinTypeIdentifier %chin% c("factor==factor", "factor==character")){ + if (myItype == "character") { + if (verbose) {cat(sprintf("Coercing %s column %s to %s to match type of %s.", + myItype, paste0("i.", icnam), myXtype, paste0("x.", xcnam))); flush.console()} set(origi, j=lc, value=factor(origi[[lc]])) # note the use of 'origi' here - see #499 and #945 # TO DO: we need a way to avoid copying 'value' for internal purposes # that would allow setting: set(i, j=lc, value=origi[[lc]]) without resulting in a copy. # until then using 'val <- origi[[lc]]' below to avoid another copy. - } else { - if (!is.factor(i[[lc]])) - stop("x.'",xcnam,"' is a factor column being joined to i.'",icnam,"' which is type '",typeof(i[[lc]]),"'. Factor columns must join to factor or character columns.") } + # levels of factors have to be treated properly when coercing # Retain original levels of i's factor columns in factor to factor joins (important when NAs, # see tests 687 and 688). # Moved it outside of 'else' to fix #499 and #945. resetifactor = c(resetifactor,lc) - if (roll!=0.0 && a==length(leftcols)) stop("Attempting roll join on factor column x.",names(x)[rc],". Only integer, double or character colums may be roll joined.") # because the chmatch on next line returns NA 0 for missing chars in x (rather than some integer greater than existing). Note roll!=0.0 is ok in this 0 special floating point case e.g. as.double(FALSE)==0.0 is ok, and "nearest"!=0.0 is also true. + if (roll!=0.0 && a==length(leftcols)) stop("Attempting roll join on factor column x.",xcnam,". Only integer, double or character colums may be roll joined.") # because the chmatch on next line returns NA 0 for missing chars in x (rather than some integer greater than existing). Note roll!=0.0 is ok in this 0 special floating point case e.g. as.double(FALSE)==0.0 is ok, and "nearest"!=0.0 is also true. val = origi[[lc]] # note: using 'origi' here because set(..., value = .) always copies '.', we need a way to avoid it in internal cases. lx = levels(x[[rc]]) li = levels(val) newfactor = chmatch(li, lx, nomatch=0L)[val] # fix for #945, a hacky solution for now. levels(newfactor) = lx class(newfactor) = "factor" - set(i, j=lc, value=newfactor) - # COMMENT BELOW IS NOT TRUE ANYMORE... had to change nomatch to 0L to take care of case where 'NA' occurs as a separate value... See #945. - # NAs can be produced by this level match, in which case the C code (it knows integer value NA) - # can skip over the lookup. It's therefore important we pass NA rather than 0 to the C code. - } - # Fix for #1108. - # TODO: clean this code up... - # NOTE: bit64::is.double(int64) returns FALSE.. but base::is.double returns TRUE - is.int64 <- function(x) inherits(x, 'integer64') - is.strictlydouble <- function(x) !is.int64(x) && is.double(x) - if (is.integer(x[[rc]]) && (base::is.double(i[[lc]]) || is.logical(i[[lc]]))) { - # TO DO: add warning if reallyreal about loss of precision - # or could coerce in binary search on the fly, at cost - if (verbose) cat("Coercing ", typeof(i[[lc]])," column i.'",icnam,"' to integer to match type of x.'",xcnam,"'. Please avoid coercion for efficiency.\n",sep="") - newval = i[[lc]] - if (is.int64(newval)) - newval = as.integer(newval) - else mode(newval) = "integer" # retains column attributes (such as IDateTime class) - set(i, j=lc, value=newval) - } else if (is.int64(x[[rc]]) && (is.integer(i[[lc]]) || is.logical(i[[lc]]) || is.strictlydouble(i[[lc]]) )) { - if (verbose) cat("Coercing ",typeof(i[[lc]])," column i.'",icnam,"' to double to match type of x.'",xcnam,"'. Please avoid coercion for efficiency.\n",sep="") - newval = bit64::as.integer64(i[[lc]]) - set(i, j=lc, value=newval) - } else if (is.strictlydouble(x[[rc]]) && (is.integer(i[[lc]]) || is.logical(i[[lc]]) || is.int64(i[[lc]]) )) { - if (verbose) cat("Coercing ",typeof(i[[lc]])," column i.'",icnam,"' to double to match type of x.'",xcnam,"'. Please avoid coercion for efficiency.\n",sep="") - newval = i[[lc]] - if (is.int64(newval)) - newval = as.numeric(newval) - else mode(newval) = "double" - set(i, j=lc, value=newval) + set(i, j=lc, value=newfactor) + } else if(myIclass == "other" || myXclass == "other"){ + ## at least one column has a non-standard class, e.g. POSIXct. + ## join will work if + ## - both columns have exactly the same class + ## - typeof(x[[rc]]) == typeof(i[[lc]]) with a warning + if(all(class(x[[rc]]) == class(i[[lc]]))){ + next + } else if(typeof(x[[rc]]) == typeof(i[[lc]])){ + warning(sprintf("Joining on columns of different class: %s (%s) and %s (%s). Join works since both columns are of the same type: %s", + paste0("x.", xcnam), paste0(class(x[[rc]]), collapse = ","), paste0("i.", icnam), paste0(class(i[[lc]]), collapse = ","), typeof(x[[rc]]))) + ## nothing needs to be done, Cbmerge will work because of the same types. + } else { + stop(sprintf("Incompatible types: %s (%s) and %s (%s)", + paste0("x.", xcnam), paste0(class(x[[rc]]), collapse = ","), paste0("i.", icnam), paste0(class(i[[lc]]), collapse = ","))) + } + } else { + stop("Internal error: data.table's bmerge doesn't know how to handle joins of type ", joinTypeIdentifier, ". Please report the bug to the developers") } } if (verbose) {last.started.at=proc.time();cat("Starting bmerge ...");flush.console()} From fc446a22810b36f47ef73db865dd60a9f84e44d7 Mon Sep 17 00:00:00 2001 From: "NORDEXAG\\BonschM" Date: Mon, 9 Apr 2018 15:01:44 +0200 Subject: [PATCH 04/31] Adapted verbose messages in tests --- inst/tests/tests.Rraw | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/inst/tests/tests.Rraw b/inst/tests/tests.Rraw index 2f0e13e1b7..442a4a0c35 100644 --- a/inst/tests/tests.Rraw +++ b/inst/tests/tests.Rraw @@ -407,11 +407,11 @@ test(149, dt[J(2:3),roll=TRUE], data.table(a=c(2L,3L),b=c(1L,1L))) # in future # 150:158 test out of order factor levels in key columns (now allowed from v1.8.0) dt = data.table(x=factor(c("c","b","a"),levels=c("b","a","c")),y=1:3) setkey(dt,x) -test(150.1, dt["b",y,verbose=TRUE], output="Coercing character column i.'V1' to factor") # changed i.V1 to i.x as per FR #2693 +test(150.1, dt["b",y,verbose=TRUE], output="Coercing character column i.V1 to factor") # changed i.V1 to i.x as per FR #2693 test(150.2, dt["b",y], 2L) # from Tom's post : a = data.table(a=rep(1:5, 2), b=factor(letters[rep(1:5, each =2)], levels=letters[5:1]), key="b") -test(151.1, a[J("b"),a,verbose=TRUE], output="Coercing character column i.'V1' to factor") # message back to `i.V1` now. 'b' still accessible to satisfy FR #2693, checked on next line +test(151.1, a[J("b"),a,verbose=TRUE], output="Coercing character column i.V1 to factor") # message back to `i.V1` now. 'b' still accessible to satisfy FR #2693, checked on next line test(151.2, a[J("b"),a], 3:4) # stretch tests further, two out of order levels, one gets key'd the other not : a = data.table(x=factor(letters[rep(1:5, each =2)], levels=letters[5:1]), @@ -1613,7 +1613,7 @@ test(577, CJ(x=c(1L,2L), c("a","b")), data.table(x=c(1L,1L,2L,2L),V2=c("a","b"," # Test factor to character join when factor contains unused and reverse order levels : X = data.table(a=LETTERS[1:4],v=1:4,key="a") Y = data.table(a=factor(c("D","B"),levels=rev(LETTERS)),key="a") -test(578, X[Y,verbose=TRUE], output="Coercing factor column i.'a' to character to match type of x.'a'") +test(578, X[Y,verbose=TRUE], output="Coercing factor column i.a to character to match type of x.a") test(579, X[Y], data.table(a=c("D","B"), v=c(4L,2L))) # Test that logical i in set() returns helpful error @@ -5789,7 +5789,7 @@ test(1432, DT[a==b], DT[2:3]) test(1433, DT[a %in% b], DT[c(2,3,5,6)]) test(1434, DT[a==b+1], DT[c(1,4,6)]) test(1435, DT[b==max(a)], DT[3]) -test(1436, DT[a==2,verbose=TRUE], DT[c(2,5)], output="Coercing double column i.'a' to integer") +test(1436, DT[a==2,verbose=TRUE], DT[c(2,5)], output="Coercing double column i.a to integer") DT[,a:=factor(letters[a])] test(1437, DT[a==factor("b"),verbose=TRUE], DT[c(2,5)], output="Creating new index 'a'") ## test that the lookup env for RHS is correct. In internal env,notjoin is FALSE in this case. From 1f1f21a042232393ad3f0d111bbc9ff1b1a65731 Mon Sep 17 00:00:00 2001 From: "NORDEXAG\\BonschM" Date: Mon, 9 Apr 2018 22:46:45 +0200 Subject: [PATCH 05/31] Adapted verbose messages so that tests pass --- R/bmerge.R | 14 +++++++------- inst/tests/tests.Rraw | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/R/bmerge.R b/R/bmerge.R index f2e2f6e62e..16e2c4b8ae 100644 --- a/R/bmerge.R +++ b/R/bmerge.R @@ -90,14 +90,14 @@ bmerge <- function(i, x, leftcols, rightcols, io, xo, roll, rollends, nomatch, m } else if(joinTypeIdentifier %chin% typeModeCoercionI){ ## coerce i[[lc]] to same class as x[[rc]] by mode() approach if (verbose) {cat(sprintf("Coercing %s column %s to %s to match type of %s.", - myItype, paste0("i.", icnam), myXtype, paste0("x.", xcnam))); flush.console()} + myItype, paste0("i.'", icnam, "'"), myXtype, paste0("x.'", xcnam, "'"))); flush.console()} newval = i[[lc]] mode(newval) = myXtype # retains column attributes (such as IDateTime class) set(i, j=lc, value=newval) } else if(joinTypeIdentifier %chin% typeModeCoercionX){ ## coerce x[[rc]] to same class as i[[lc]] by mode() approach if (verbose) {cat(sprintf("Coercing %s column %s to %s to match type of %s.", - myXtype, paste0("x.", xcnam), myItype, paste0("i.", icnam))); flush.console()} + myXtype, paste0("x.'", xcnam, "'"), myItype, paste0("i.'", icnam, "'"))); flush.console()} newval = x[[rc]] mode(newval) = myItype # retains column attributes (such as IDateTime class) set(x, j=rc, value=newval) @@ -105,7 +105,7 @@ bmerge <- function(i, x, leftcols, rightcols, io, xo, roll, rollends, nomatch, m ## coerce i[[lc]] to same class as x[[rc]] by as.newclass() approach converter <- match.fun(paste0("as.", myXtype)) if (verbose) {cat(sprintf("Coercing %s column %s to %s to match type of %s.", - myItype, paste0("i.", icnam), myXtype, paste0("x.", xcnam))); flush.console()} + myItype, paste0("i.'", icnam, "'"), myXtype, paste0("x.'", xcnam, "'"))); flush.console()} newval = i[[lc]] newval = converter(newval) set(i, j=lc, value=newval) @@ -113,14 +113,14 @@ bmerge <- function(i, x, leftcols, rightcols, io, xo, roll, rollends, nomatch, m ## coerce x[[rc]] to same class as i[[lc]] by as.newclass() approach converter <- match.fun(paste0("as.", myItype)) if (verbose) {cat(sprintf("Coercing %s column %s to %s to match type of %s.", - myXtype, paste0("x.", xcnam), myItype, paste0("i.", icnam))); flush.console()} + myXtype, paste0("x.'", xcnam, "'"), myItype, paste0("i.'", icnam, "'"))); flush.console()} newval = x[[rc]] newval = converter(newval) set(x, j=rc, value=newval) } else if(joinTypeIdentifier %chin% c("factor==factor", "factor==character")){ if (myItype == "character") { if (verbose) {cat(sprintf("Coercing %s column %s to %s to match type of %s.", - myItype, paste0("i.", icnam), myXtype, paste0("x.", xcnam))); flush.console()} + myItype, paste0("i.'", icnam, "'"), myXtype, paste0("x.'", xcnam, "'"))); flush.console()} set(origi, j=lc, value=factor(origi[[lc]])) # note the use of 'origi' here - see #499 and #945 # TO DO: we need a way to avoid copying 'value' for internal purposes # that would allow setting: set(i, j=lc, value=origi[[lc]]) without resulting in a copy. @@ -148,11 +148,11 @@ bmerge <- function(i, x, leftcols, rightcols, io, xo, roll, rollends, nomatch, m next } else if(typeof(x[[rc]]) == typeof(i[[lc]])){ warning(sprintf("Joining on columns of different class: %s (%s) and %s (%s). Join works since both columns are of the same type: %s", - paste0("x.", xcnam), paste0(class(x[[rc]]), collapse = ","), paste0("i.", icnam), paste0(class(i[[lc]]), collapse = ","), typeof(x[[rc]]))) + paste0("x.'", xcnam, "'"), paste0(class(x[[rc]]), collapse = ","), paste0("i.'", icnam, "'"), paste0(class(i[[lc]]), collapse = ","), typeof(x[[rc]]))) ## nothing needs to be done, Cbmerge will work because of the same types. } else { stop(sprintf("Incompatible types: %s (%s) and %s (%s)", - paste0("x.", xcnam), paste0(class(x[[rc]]), collapse = ","), paste0("i.", icnam), paste0(class(i[[lc]]), collapse = ","))) + paste0("x.'", xcnam, "'"), paste0(class(x[[rc]]), collapse = ","), paste0("i.'", icnam, "'"), paste0(class(i[[lc]]), collapse = ","))) } } else { stop("Internal error: data.table's bmerge doesn't know how to handle joins of type ", joinTypeIdentifier, ". Please report the bug to the developers") diff --git a/inst/tests/tests.Rraw b/inst/tests/tests.Rraw index edf155caa4..db9f8c6918 100644 --- a/inst/tests/tests.Rraw +++ b/inst/tests/tests.Rraw @@ -5789,7 +5789,7 @@ test(1432, DT[a==b], DT[2:3]) test(1433, DT[a %in% b], DT[c(2,3,5,6)]) test(1434, DT[a==b+1], DT[c(1,4,6)]) test(1435, DT[b==max(a)], DT[3]) -test(1436, DT[a==2,verbose=TRUE], DT[c(2,5)], output="Coercing double column i.'a' to integer") +test(1436, DT[a==2,verbose=TRUE], DT[c(2,5)], output="Coercing numeric column i.'a' to integer") DT[,a:=factor(letters[a])] test(1437, DT[a==factor("b"),verbose=TRUE], DT[c(2,5)], output="Creating new index 'a'") ## test that the lookup env for RHS is correct. In internal env,notjoin is FALSE in this case. From 8b8f040bd303effe12bac6b942e88478d2e5ca6b Mon Sep 17 00:00:00 2001 From: "NORDEXAG\\BonschM" Date: Mon, 9 Apr 2018 23:33:14 +0200 Subject: [PATCH 06/31] Changed type definition, adapted tests. --- R/bmerge.R | 52 +++++++++++++++++++++++++------------------ inst/tests/tests.Rraw | 2 +- 2 files changed, 31 insertions(+), 23 deletions(-) diff --git a/R/bmerge.R b/R/bmerge.R index 16e2c4b8ae..8cdd88c01c 100644 --- a/R/bmerge.R +++ b/R/bmerge.R @@ -25,47 +25,55 @@ bmerge <- function(i, x, leftcols, rightcols, io, xo, roll, rollends, nomatch, m # types (with warning or verbose) resetifactor = NULL # Keep track of any factor to factor/character join cols (only time we keep orig) - ## function to determine type of columns. Important not to use typeof since integer and factor have same type (integer) + ## function to determine type of columns. + ## Important not to use typeof() since integer and factor have same type (integer) + ## important to test for is.double instead of is.numeric because of bug with IDate (test 346) getClass <- function(x){ - out <- class(x) + if(is.logical(x)) out <- "logical" + else if(is.integer(x)) out <- "integer" + else if(base::is.double(x)){ ## base::is.double(integer64) is TRUE, while bit64::is.double(integer64) is FALSE! + if(inherits(x, "integer64")) out <- "integer64" ## is.numeric returns TRUE on integer64 columns + ## distinguish integer values with storage mode double from real numeric + ## values that can't be coerced to integer without loss of precision + else if(isReallyReal(x)) out <- "realDouble" + else out <- "double"} + else if(is.character(x)) out <- "character" + else if(is.factor(x)) out <- "factor" + else out <- "other" ## whatever it is, it is not a standard type if(length(out) > 1) out <- "other" - if(!out %chin% c("logical", "integer", "numeric", "character", "factor", "integer64")) out <- "other" - if(out == "numeric"){ - if(isReallyReal(x)) out <- "realNumeric" ## otherwise, it can be coerced to integer without problems - } return(out) } ## The following column types throw an error when joined together. Column in x is on the left of == - typeErrorClasses = c("logical==integer", "logical==numeric", "logical==realNumeric", "logical==character", "logical==factor", "logical==integer64", + typeErrorClasses = c("logical==integer", "logical==double", "logical==realDouble", "logical==character", "logical==factor", "logical==integer64", "integer==character", "integer==factor", - "numeric==character", "numeric==factor", - "realNumeric==character", "realNumeric==factor", - "character==logical", "character==integer", "character==numeric", "character==realNumeric", "character==integer64", - "factor==logical", "factor==integer", "factor==numeric", "factor==realNumeric", "factor==integer64", + "double==character", "double==factor", + "realDouble==character", "realDouble==factor", + "character==logical", "character==integer", "character==double", "character==realDouble", "character==integer64", + "factor==logical", "factor==integer", "factor==double", "factor==realDouble", "factor==integer64", "integer64==character", "integer64==factor") ## The following column types need no specific treatment when joined together typeNoTreatment = c("logical==logical", "integer==integer", - "numeric==numeric", "numeric==realNumeric", - "realNumeric==numeric", "realNumeric==realNumeric", + "double==double", "double==realDouble", + "realDouble==double", "realDouble==realDouble", "character==character", ## factor == factor needs treatment to consolidate levels "integer64==integer64" ) ## The following column types need simple coercion of the column in i by setting the mode(i[[lc]]) <- "newclass", ## where newclass is the class on the left of == - typeModeCoercionI = c("integer==logical", "integer==numeric", ## not for realNumeric!! - "numeric==logical", "numeric==integer", - "realNumeric==logical", "realNumeric==integer") + typeModeCoercionI = c("integer==logical", "integer==double", ## not for realDouble!! + "double==logical", "double==integer", + "realDouble==logical", "realDouble==integer") ## The following column types need simple coercion of the column in x by setting the mode(x[[rc]]) <- "newclass", ## where newclass is the class on the rigth of == - typeModeCoercionX = c("integer==realNumeric") + typeModeCoercionX = c("integer==realDouble") ## The following column types need coercion of the column in i by calling as.newclass(i[[lc]]), ## where newclass is the class on the left of == - typeCastCoercionI = c("integer==integer64", "numeric==integer64", "realNumeric==integer64", - "integer64==logical", "integer64==integer", "integer64==numeric", + typeCastCoercionI = c("integer==integer64", "double==integer64", "realDouble==integer64", + "integer64==logical", "integer64==integer", "integer64==double", "character==factor") ## The following column types need coercion of the column in x by calling as.newclass(x[[rc]]), ## where newclass is the class on the right of == - typeCastCoercionX = c("integer64==realNumeric") + typeCastCoercionX = c("integer64==realDouble") for (a in seq_along(leftcols)) { # This loop does the following: @@ -79,8 +87,8 @@ bmerge <- function(i, x, leftcols, rightcols, io, xo, roll, rollends, nomatch, m xcnam = names(x)[rc] myXclass = getClass(x[[rc]]) myIclass = getClass(i[[lc]]) - myXtype = if(myXclass == "realNumeric") "numeric" else myXclass - myItype = if(myIclass == "realNumeric") "numeric" else myIclass + myXtype = if(myXclass == "realDouble") "double" else myXclass + myItype = if(myIclass == "realDouble") "double" else myIclass joinTypeIdentifier = paste0(myXclass, "==", myIclass) if(joinTypeIdentifier %chin% typeNoTreatment){ next diff --git a/inst/tests/tests.Rraw b/inst/tests/tests.Rraw index db9f8c6918..edf155caa4 100644 --- a/inst/tests/tests.Rraw +++ b/inst/tests/tests.Rraw @@ -5789,7 +5789,7 @@ test(1432, DT[a==b], DT[2:3]) test(1433, DT[a %in% b], DT[c(2,3,5,6)]) test(1434, DT[a==b+1], DT[c(1,4,6)]) test(1435, DT[b==max(a)], DT[3]) -test(1436, DT[a==2,verbose=TRUE], DT[c(2,5)], output="Coercing numeric column i.'a' to integer") +test(1436, DT[a==2,verbose=TRUE], DT[c(2,5)], output="Coercing double column i.'a' to integer") DT[,a:=factor(letters[a])] test(1437, DT[a==factor("b"),verbose=TRUE], DT[c(2,5)], output="Creating new index 'a'") ## test that the lookup env for RHS is correct. In internal env,notjoin is FALSE in this case. From 0ce0c6b302d898c2dba75c1e55ff0e1601a72481 Mon Sep 17 00:00:00 2001 From: "NORDEXAG\\BonschM" Date: Tue, 10 Apr 2018 11:48:29 +0200 Subject: [PATCH 07/31] Final adaptations to verbose messages. Removed tests for non-standard types since I can't imagine an example. --- R/bmerge.R | 5 +++-- tests/knitr.md | 39 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 42 insertions(+), 2 deletions(-) create mode 100644 tests/knitr.md diff --git a/R/bmerge.R b/R/bmerge.R index 8cdd88c01c..988987c3a9 100644 --- a/R/bmerge.R +++ b/R/bmerge.R @@ -148,7 +148,8 @@ bmerge <- function(i, x, leftcols, rightcols, io, xo, roll, rollends, nomatch, m class(newfactor) = "factor" set(i, j=lc, value=newfactor) } else if(myIclass == "other" || myXclass == "other"){ - ## at least one column has a non-standard class, e.g. POSIXct. + ## very unlikely case + ## at least one column is neither integer, double, character or factor. ## join will work if ## - both columns have exactly the same class ## - typeof(x[[rc]]) == typeof(i[[lc]]) with a warning @@ -160,7 +161,7 @@ bmerge <- function(i, x, leftcols, rightcols, io, xo, roll, rollends, nomatch, m ## nothing needs to be done, Cbmerge will work because of the same types. } else { stop(sprintf("Incompatible types: %s (%s) and %s (%s)", - paste0("x.'", xcnam, "'"), paste0(class(x[[rc]]), collapse = ","), paste0("i.'", icnam, "'"), paste0(class(i[[lc]]), collapse = ","))) + paste0("x.", xcnam), paste0(class(x[[rc]]), collapse = ","), paste0("i.", icnam), paste0(class(i[[lc]]), collapse = ","))) } } else { stop("Internal error: data.table's bmerge doesn't know how to handle joins of type ", joinTypeIdentifier, ". Please report the bug to the developers") diff --git a/tests/knitr.md b/tests/knitr.md new file mode 100644 index 0000000000..1150964771 --- /dev/null +++ b/tests/knitr.md @@ -0,0 +1,39 @@ + +```r +require(data.table) # print? +DT = data.table(x=1:3, y=4:6) # no +DT # yes +``` + +``` +## x y +## 1: 1 4 +## 2: 2 5 +## 3: 3 6 +``` + +```r +DT[, z := 7:9] # no +print(DT[, z := 10:12]) # yes +``` + +``` +## x y z +## 1: 1 4 10 +## 2: 2 5 11 +## 3: 3 6 12 +``` + +```r +if (1 < 2) DT[, a := 1L] # no +DT # yes +``` + +``` +## x y z a +## 1: 1 4 10 1 +## 2: 2 5 11 1 +## 3: 3 6 12 1 +``` +Some text. + From 8aa9e8b5043ddb95126b80e607720c7d89016f04 Mon Sep 17 00:00:00 2001 From: "NORDEXAG\\BonschM" Date: Tue, 10 Apr 2018 11:56:47 +0200 Subject: [PATCH 08/31] Suppressed warning on tests. --- inst/tests/tests.Rraw | 245 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 245 insertions(+) diff --git a/inst/tests/tests.Rraw b/inst/tests/tests.Rraw index edf155caa4..9773a8423b 100644 --- a/inst/tests/tests.Rraw +++ b/inst/tests/tests.Rraw @@ -11606,6 +11606,251 @@ test(1899.12, as.matrix(DT, FALSE), mat2) setkey(DT, id, X) test(1899.13, as.matrix(DT, TRUE), mat, warning="rownames is TRUE but multiple keys") +## test type coercion in joins (#2592) +dt1 <- data.table(intCol = 1L:10L, + doubleCol = as.numeric(1:10), ## only 1:10 will be integer + realDoubleCol = seq(0.5, 5, by = 0.5), + boolCol = c(rep(FALSE, 9), TRUE), + charCol = letters[1L:10L], + factCol = factor(letters[1L:10L])) +dt2 <- data.table(intCol = 1L:5L, + doubleCol = as.numeric(1:5), ## only 1:5 will be integer + realDoubleCol = seq(0.5, 2.5, by = 0.5), + boolCol = TRUE, + charCol = letters[1L:5L], + factCol = factor(letters[1L:5L])) +if ("package:bit64" %in% search()) { + dt1[, int64Col := as.integer64(c(1:9, 3e10))] + dt2[, int64Col := as.integer64(c(1:4, 3e9))] +} +## no coercion when types match +test(1900.1, + nrow(dt1[dt2, on = "boolCol==boolCol"]), nrow(dt2), + warning = NULL) +test(1900.2, + nrow(dt1[dt2, on = "intCol==intCol"]), nrow(dt2), + warning = NULL) +test(1900.3, + nrow(dt1[dt2, on = "doubleCol==doubleCol"]), nrow(dt2), + warning = NULL) +test(1900.4, + nrow(dt1[dt2, on = "realDoubleCol==realDoubleCol"]), nrow(dt2), + warning = NULL) +test(1900.5, + nrow(dt1[dt2, on = "charCol==charCol"]), nrow(dt2), + warning = NULL) +test(1900.6, + nrow(dt1[dt2, on = "factCol==factCol"]), nrow(dt2), + warning = NULL) +if ("package:bit64" %in% search()) { + test(1900.7, + nrow(dt1[dt2, on = "int64Col==int64Col"]), nrow(dt2), + warning = NULL) +} +## error on incompatible types +test(1900.8, + dt1[dt2, on = "boolCol==intCol"], + error = "Incompatible types: x.boolCol (logical) and i.intCol (integer)") +test(1900.9, + dt1[dt2, on = "boolCol==doubleCol"], + error = "Incompatible types: x.boolCol (logical) and i.doubleCol (double)") +test(1900.11, + dt1[dt2, on = "boolCol==realDoubleCol"], + error = "Incompatible types: x.boolCol (logical) and i.realDoubleCol (double)") +test(1900.12, + dt1[dt2, on = "boolCol==charCol"], + error = "Incompatible types: x.boolCol (logical) and i.charCol (character)") +test(1900.13, + dt1[dt2, on = "boolCol==factCol"], + error = "Incompatible types: x.boolCol (logical) and i.factCol (factor)") +test(1900.14, + dt1[dt2, on = "intCol==charCol"], + error = "Incompatible types: x.intCol (integer) and i.charCol (character)") +test(1900.15, + dt1[dt2, on = "intCol==factCol"], + error = "Incompatible types: x.intCol (integer) and i.factCol (factor)") +test(1900.16, + dt1[dt2, on = "doubleCol==charCol"], + error = "Incompatible types: x.doubleCol (double) and i.charCol (character)") +test(1900.17, + dt1[dt2, on = "realDoubleCol==charCol"], + error = "Incompatible types: x.realDoubleCol (double) and i.charCol (character)") +test(1900.18, + dt1[dt2, on = "doubleCol==factCol"], + error = "Incompatible types: x.doubleCol (double) and i.factCol (factor)") +test(1900.19, + dt1[dt2, on = "realDoubleCol==factCol"], + error = "Incompatible types: x.realDoubleCol (double) and i.factCol (factor)") +test(1900.21, + dt1[dt2, on = "charCol==boolCol"], + error = "Incompatible types: x.charCol (character) and i.boolCol (logical)") +test(1900.22, + dt1[dt2, on = "charCol==intCol"], + error = "Incompatible types: x.charCol (character) and i.intCol (integer)") +test(1900.23, + dt1[dt2, on = "charCol==doubleCol"], + error = "Incompatible types: x.charCol (character) and i.doubleCol (double)") +test(1900.24, + dt1[dt2, on = "charCol==realDoubleCol"], + error = "Incompatible types: x.charCol (character) and i.realDoubleCol (double)") +test(1900.25, + dt1[dt2, on = "factCol==boolCol"], + error = "Incompatible types: x.factCol (factor) and i.boolCol (logical)") +test(1900.26, + dt1[dt2, on = "factCol==intCol"], + error = "Incompatible types: x.factCol (factor) and i.intCol (integer)") +test(1900.27, + dt1[dt2, on = "factCol==doubleCol"], + error = "Incompatible types: x.factCol (factor) and i.doubleCol (double)") +test(1900.28, + dt1[dt2, on = "factCol==realDoubleCol"], + error = "Incompatible types: x.factCol (factor) and i.realDoubleCol (double)") +if ("package:bit64" %in% search()) { + test(1900.29, + dt1[dt2, on = "boolCol==int64Col"], + error = "Incompatible types: x.boolCol (logical) and i.int64Col (integer64)") + test(1900.31, + dt1[dt2, on = "charCol==int64Col"], + error = "Incompatible types: x.charCol (character) and i.int64Col (integer64)") + test(1900.32, + dt1[dt2, on = "factCol==int64Col"], + error = "Incompatible types: x.factCol (factor) and i.int64Col (integer64)") + test(1900.33, + dt1[dt2, on = "int64Col==charCol"], + error = "Incompatible types: x.int64Col (integer64) and i.charCol (character)") + test(1900.34, + dt1[dt2, on = "int64Col==factCol"], + error = "Incompatible types: x.int64Col (integer64) and i.factCol (factor)") +} +## correct behaviour on other types. +## 4 checks: +## - correct warning +## - correct type of the coerced columns in i and x +## - correct number of rows in the join +cols <- c("boolCol", "intCol", "doubleCol", "realDoubleCol", "charCol", "factCol") +if ("package:bit64" %in% search()) { + cols <- c(cols, "int64Col") +} +cols <- c(paste0("x.", cols), paste0("i.", cols)) ## make sure that all columns from x and i are in the result +test(1900.35, + result <- dt1[dt2, cols, on = "intCol==boolCol", with = FALSE, nomatch = 0L, verbose = TRUE], + dt1[dt2, cols, on = "intCol==boolCol", with = FALSE, nomatch = 0L], + output = "Coercing logical column i.'boolCol' to integer to match type of x.'intCol'.") +test(1900.36, class(result$i.boolCol), "integer") +test(1900.37, class(result$x.intCol), "integer") +test(1900.38, nrow(result), 5L) +test(1900.39, + result <- dt1[dt2, cols, on = "intCol==doubleCol", with = FALSE, nomatch = 0L, verbose = TRUE], + dt1[dt2, cols, on = "intCol==doubleCol", with = FALSE, nomatch = 0L], + output = "Coercing double column i.'doubleCol' to integer to match type of x.'intCol'.") +test(1900.41, class(result$i.doubleCol), "integer") +test(1900.42, class(result$x.intCol), "integer") +test(1900.43, nrow(result), 5L) +test(1900.44, + result <- dt1[dt2, cols, on = "intCol==realDoubleCol", with = FALSE, nomatch = 0L, verbose = TRUE], + dt1[dt2, cols, on = "intCol==realDoubleCol", with = FALSE, nomatch = 0L], + output = "Coercing integer column x.'intCol' to double to match type of i.'realDoubleCol'.") +test(1900.45, class(result$i.realDoubleCol), "numeric") +test(1900.46, class(result$x.intCol), "integer") ## coercion of x columns is only for the join. The original type is returned. +test(1900.47, nrow(result), 2L) +test(1900.48, + result <- dt1[dt2, cols, on = "doubleCol==boolCol", with = FALSE, nomatch = 0L, verbose = TRUE], + dt1[dt2, cols, on = "doubleCol==boolCol", with = FALSE, nomatch = 0L], + output = "Coercing logical column i.'boolCol' to double to match type of x.'doubleCol'.") +test(1900.49, class(result$i.boolCol), "numeric") +test(1900.51, class(result$x.doubleCol), "numeric") +test(1900.52, nrow(result), 5L) +test(1900.53, + result <- dt1[dt2, cols, on = "realDoubleCol==boolCol", with = FALSE, nomatch = 0L, verbose = TRUE], + dt1[dt2, cols, on = "realDoubleCol==boolCol", with = FALSE, nomatch = 0L], + output = "Coercing logical column i.'boolCol' to double to match type of x.'realDoubleCol'.") +test(1900.54, class(result$i.boolCol), "numeric") +test(1900.55, class(result$x.doubleCol), "numeric") +test(1900.56, nrow(result), 5L) +test(1900.57, + result <- dt1[dt2, cols, on = "doubleCol==intCol", with = FALSE, nomatch = 0L, verbose = TRUE], + dt1[dt2, cols, on = "doubleCol==intCol", with = FALSE, nomatch = 0L], + output = "Coercing integer column i.'intCol' to double to match type of x.'doubleCol'.") +test(1900.58, class(result$i.intCol), "numeric") +test(1900.59, class(result$x.doubleCol), "numeric") +test(1900.61, nrow(result), 5L) +test(1900.62, + result <- dt1[dt2, cols, on = "realDoubleCol==intCol", with = FALSE, nomatch = 0L, verbose = TRUE], + dt1[dt2, cols, on = "realDoubleCol==intCol", with = FALSE, nomatch = 0L], + output = "Coercing integer column i.'intCol' to double to match type of x.'realDoubleCol'.") +test(1900.63, class(result$i.intCol), "numeric") +test(1900.64, class(result$x.realDoubleCol), "numeric") +test(1900.65, nrow(result), 5L) +test(1900.66, + result <- dt1[dt2, cols, on = "charCol==factCol", with = FALSE, nomatch = 0L, verbose = TRUE], + dt1[dt2, cols, on = "charCol==factCol", with = FALSE, nomatch = 0L], + output = "Coercing factor column i.'factCol' to character to match type of x.'charCol'.") +test(1900.67, class(result$i.factCol), "character") +test(1900.68, class(result$x.charCol), "character") +test(1900.69, nrow(result), 5L) +test(1900.71, + result <- dt1[dt2, cols, on = "factCol==charCol", with = FALSE, nomatch = 0L, verbose = TRUE], + dt1[dt2, cols, on = "factCol==charCol", with = FALSE, nomatch = 0L], + output = "Coercing character column i.'charCol' to factor to match type of x.'factCol'.") +test(1900.72, class(result$i.charCol), "factor") +test(1900.73, class(result$x.factCol), "factor") +test(1900.74, nrow(result), 5L) +if ("package:bit64" %in% search()) { + test(1900.75, + result <- dt1[dt2, cols, on = "intCol==int64Col", with = FALSE, nomatch = 0L, verbose = TRUE], + suppressWarnings(dt1[dt2, cols, on = "intCol==int64Col", with = FALSE, nomatch = 0L]), + output = "Coercing integer64 column i.'int64Col' to integer to match type of x.'intCol'.", + warning = "NAs produced by integer overflow") + test(1900.76, class(result$i.int64Col), "integer") + test(1900.77, class(result$x.intCol), "integer") + test(1900.78, nrow(result), 4L) + test(1900.79, + result <- dt1[dt2, cols, on = "doubleCol==int64Col", with = FALSE, nomatch = 0L, verbose = TRUE], + dt1[dt2, cols, on = "doubleCol==int64Col", with = FALSE, nomatch = 0L], + output = "Coercing integer64 column i.'int64Col' to double to match type of x.'doubleCol'.") + test(1900.81, class(result$i.int64Col), "numeric") + test(1900.82, class(result$x.doubleCol), "numeric") + test(1900.83, nrow(result), 4L) + test(1900.84, + result <- dt1[dt2, cols, on = "realDoubleCol==int64Col", with = FALSE, nomatch = 0L, verbose = TRUE], + dt1[dt2, cols, on = "realDoubleCol==int64Col", with = FALSE, nomatch = 0L], + output = "Coercing integer64 column i.'int64Col' to double to match type of x.'realDoubleCol'.") + test(1900.85, class(result$i.int64Col), "numeric") + test(1900.86, class(result$x.realDoubleCol), "numeric") + test(1900.87, nrow(result), 4L) + test(1900.88, + result <- dt1[dt2, cols, on = "int64Col==boolCol", with = FALSE, nomatch = 0L, verbose = TRUE], + dt1[dt2, cols, on = "int64Col==boolCol", with = FALSE, nomatch = 0L], + output = "Coercing logical column i.'boolCol' to integer64 to match type of x.'int64Col'.") + test(1900.89, class(result$i.boolCol), "integer64") + test(1900.91, class(result$x.int64Col), "integer64") + test(1900.92, nrow(result), 5L) + test(1900.93, + result <- dt1[dt2, cols, on = "int64Col==intCol", with = FALSE, nomatch = 0L, verbose = TRUE], + dt1[dt2, cols, on = "int64Col==intCol", with = FALSE, nomatch = 0L], + output = "Coercing integer column i.'intCol' to integer64 to match type of x.'int64Col'.") + test(1900.94, class(result$i.intCol), "integer64") + test(1900.95, class(result$x.int64Col), "integer64") + test(1900.96, nrow(result), 5L) + test(1900.97, + result <- dt1[dt2, cols, on = "int64Col==doubleCol", with = FALSE, nomatch = 0L, verbose = TRUE], + dt1[dt2, cols, on = "int64Col==doubleCol", with = FALSE, nomatch = 0L], + output = "Coercing double column i.'doubleCol' to integer64 to match type of x.'int64Col'.") + test(1900.98, class(result$i.doubleCol), "integer64") + test(1900.99, class(result$x.int64Col), "integer64") + test(1900.101, nrow(result), 5L) + test(1900.102, + result <- dt1[dt2, cols, on = "int64Col==realDoubleCol", with = FALSE, nomatch = 0L, verbose = TRUE], + dt1[dt2, cols, on = "int64Col==realDoubleCol", with = FALSE, nomatch = 0L], + output = "Coercing integer64 column x.'int64Col' to double to match type of i.'realDoubleCol'.") + test(1900.103, class(result$i.realDoubleCol), "numeric") + test(1900.104, class(result$x.int64Col), "integer64") ## coercion of x columns is only for the join. The original type is returned. + test(1900.105, nrow(result), 2L) +} +## correct behaviour if non-standard types are involved: +## Unfortunately, I can't imagine any object that is not either integer, double, character, or factor +## AND is supported by forder. +## Therefore, can't test this branch. Will also very rarely happen in reality. ################################### # Add new tests above this line # From 2b3dda7e781abbef127f975ff44173f436896922 Mon Sep 17 00:00:00 2001 From: "NORDEXAG\\BonschM" Date: Tue, 10 Apr 2018 12:21:01 +0200 Subject: [PATCH 09/31] Removed spurious file tests/knitr.md that I accidentally added. --- tests/knitr.md | 39 --------------------------------------- 1 file changed, 39 deletions(-) delete mode 100644 tests/knitr.md diff --git a/tests/knitr.md b/tests/knitr.md deleted file mode 100644 index 1150964771..0000000000 --- a/tests/knitr.md +++ /dev/null @@ -1,39 +0,0 @@ - -```r -require(data.table) # print? -DT = data.table(x=1:3, y=4:6) # no -DT # yes -``` - -``` -## x y -## 1: 1 4 -## 2: 2 5 -## 3: 3 6 -``` - -```r -DT[, z := 7:9] # no -print(DT[, z := 10:12]) # yes -``` - -``` -## x y z -## 1: 1 4 10 -## 2: 2 5 11 -## 3: 3 6 12 -``` - -```r -if (1 < 2) DT[, a := 1L] # no -DT # yes -``` - -``` -## x y z a -## 1: 1 4 10 1 -## 2: 2 5 11 1 -## 3: 3 6 12 1 -``` -Some text. - From 9102572e2bfce684bc2af2cc4e2e7a06ae4c77d0 Mon Sep 17 00:00:00 2001 From: "NORDEXAG\\BonschM" Date: Wed, 18 Apr 2018 00:18:46 +0200 Subject: [PATCH 10/31] Refactored so that lookup matrix is used. --- R/bmerge.R | 266 ++++++++++++++++++++++++++++++++++------------------- 1 file changed, 172 insertions(+), 94 deletions(-) diff --git a/R/bmerge.R b/R/bmerge.R index 988987c3a9..aef3734b85 100644 --- a/R/bmerge.R +++ b/R/bmerge.R @@ -35,46 +35,136 @@ bmerge <- function(i, x, leftcols, rightcols, io, xo, roll, rollends, nomatch, m if(inherits(x, "integer64")) out <- "integer64" ## is.numeric returns TRUE on integer64 columns ## distinguish integer values with storage mode double from real numeric ## values that can't be coerced to integer without loss of precision - else if(isReallyReal(x)) out <- "realDouble" - else out <- "double"} + else if(isReallyReal(x)) out <- "reallyDouble" + else out <- "intAsDouble" + } else if(is.character(x)) out <- "character" else if(is.factor(x)) out <- "factor" - else out <- "other" ## whatever it is, it is not a standard type - if(length(out) > 1) out <- "other" + else out <- "other" + return(out) + } + + ## function or coercing a vector to a new type. Depending on the source and target type, + ## different coercion strategies are used. + coerceClass <- function(x, to){ + sourceType <- getClass(x) + ## reallyDouble and intAsDouble are the same here: + if(sourceType %chin% c("reallyDouble", "intAsDouble")) sourceType <- "double" + if(sourceType == to) return(x) ## nothing to be done + if(!to %chin% c("logical", "integer", "double", "character", "factor", "integer64")) + stop("Invalid 'to' argument: ", to) + if(sourceType == "other") + stop("type coercion not supported for this type: ", paste0(class(x), collapse = ",")) + if(sourceType %chin% c("logical", "integer", "double") & + to %chin% c("logical", "integer", "double")){ + ## for these classes, we can do mode coercion to retain other class attributes, e.g. IDate + ## identical types have been caught above + out <- x + mode(out) <- to + } + else { + ## we need as.'to'() conversion + converter <- match.fun(paste0("as.", to)) + out <- converter(x) + } return(out) } - ## The following column types throw an error when joined together. Column in x is on the left of == - typeErrorClasses = c("logical==integer", "logical==double", "logical==realDouble", "logical==character", "logical==factor", "logical==integer64", - "integer==character", "integer==factor", - "double==character", "double==factor", - "realDouble==character", "realDouble==factor", - "character==logical", "character==integer", "character==double", "character==realDouble", "character==integer64", - "factor==logical", "factor==integer", "factor==double", "factor==realDouble", "factor==integer64", - "integer64==character", "integer64==factor") - ## The following column types need no specific treatment when joined together - typeNoTreatment = c("logical==logical", "integer==integer", - "double==double", "double==realDouble", - "realDouble==double", "realDouble==realDouble", - "character==character", ## factor == factor needs treatment to consolidate levels - "integer64==integer64" - ) - ## The following column types need simple coercion of the column in i by setting the mode(i[[lc]]) <- "newclass", - ## where newclass is the class on the left of == - typeModeCoercionI = c("integer==logical", "integer==double", ## not for realDouble!! - "double==logical", "double==integer", - "realDouble==logical", "realDouble==integer") - ## The following column types need simple coercion of the column in x by setting the mode(x[[rc]]) <- "newclass", - ## where newclass is the class on the rigth of == - typeModeCoercionX = c("integer==realDouble") - ## The following column types need coercion of the column in i by calling as.newclass(i[[lc]]), - ## where newclass is the class on the left of == - typeCastCoercionI = c("integer==integer64", "double==integer64", "realDouble==integer64", - "integer64==logical", "integer64==integer", "integer64==double", - "character==factor") - ## The following column types need coercion of the column in x by calling as.newclass(x[[rc]]), - ## where newclass is the class on the right of == - typeCastCoercionX = c("integer64==realDouble") + ## Establish a lookup table with coercion strategies for each pair of types. + ## Coercion strategies can be one of the following: + ##------------------|----------------------------------------------------- + ## y (yes): | no coercion necessary, types match + ##------------------|----------------------------------------------------- + ## e (error): | throw an error because of incompatible types + ##------------------|----------------------------------------------------- + ## ci (coercion i): | coerce the column in i to the type of the column in x + ##------------------|----------------------------------------------------- + ## ciw: | same as above, but with warning. + ##------------------|----------------------------------------------------- + ## cx (coercion x): | coerce the column in x to the type of the column in i + ##------------------|----------------------------------------------------- + ## cxw: | same as above, but with warning. + ##------------------|----------------------------------------------------- + ## rows mark the column type in i, columns the column type in x + ## possible types are: logical, integer, intAsDouble, reallyDouble, character, factor, integer64 + allTypes <- c("logical", "integer", "intAsDouble", "reallyDouble", "character", "factor", "integer64", "other") + ct <- matrix(data = NA_character_, nrow = length(allTypes), ncol = length(allTypes), + dimnames = list(allTypes, allTypes)) + + ct["logical", "logical"] = "y" + ct["integer", "logical"] = "e" + ct["intAsDouble", "logical"] = "e" + ct["reallyDouble", "logical"] = "e" + ct["character", "logical"] = "e" + ct["factor", "logical"] = "e" + ct["integer64", "logical"] = "e" + ct["other", "logical"] = "e" + + ct["logical", "integer"] = "ci" + ct["integer", "integer"] = "y" + ct["intAsDouble", "integer"] = "ci" + ct["reallyDouble", "integer"] = "cx" + ct["character", "integer"] = "e" + ct["factor", "integer"] = "e" + ct["integer64", "integer"] = "ci" + ct["other", "integer"] = "e" + + ct["logical", "intAsDouble"] = "ci" + ct["integer", "intAsDouble"] = "ci" + ct["intAsDouble", "intAsDouble"] = "y" + ct["reallyDouble", "intAsDouble"] = "y" + ct["character", "intAsDouble"] = "e" + ct["factor", "intAsDouble"] = "e" + ct["integer64", "intAsDouble"] = "ci" + ct["other", "intAsDouble"] = "e" + + ct["logical", "reallyDouble"] = "ci" + ct["integer", "reallyDouble"] = "ci" + ct["intAsDouble", "reallyDouble"] = "y" + ct["reallyDouble", "reallyDouble"] = "y" + ct["character", "reallyDouble"] = "e" + ct["factor", "reallyDouble"] = "e" + ct["integer64", "reallyDouble"] = "ci" + ct["other", "reallyDouble"] = "e" + + ct["logical", "character"] = "e" + ct["integer", "character"] = "e" + ct["intAsDouble", "character"] = "e" + ct["reallyDouble", "character"] = "e" + ct["character", "character"] = "y" + ct["factor", "character"] = "ci" + ct["integer64", "character"] = "e" + ct["other", "character"] = "e" + + ct["logical", "factor"] = "e" + ct["integer", "factor"] = "e" + ct["intAsDouble", "factor"] = "e" + ct["reallyDouble", "factor"] = "e" + ct["character", "factor"] = "ci" + ct["factor", "factor"] = "y" + ct["integer64", "factor"] = "e" + ct["other", "factor"] = "e" + + ct["logical", "integer64"] = "ci" + ct["integer", "integer64"] = "ci" + ct["intAsDouble", "integer64"] = "ci" + ct["reallyDouble", "integer64"] = "cx" + ct["character", "integer64"] = "e" + ct["factor", "integer64"] = "e" + ct["integer64", "integer64"] = "y" + ct["other", "integer64"] = "e" + + ct["logical", "other"] = "e" + ct["integer", "other"] = "e" + ct["intAsDouble", "other"] = "e" + ct["reallyDouble", "other"] = "e" + ct["character", "other"] = "e" + ct["factor", "other"] = "e" + ct["integer64", "other"] = "e" + ct["other", "other"] = "e" + + if(anyNA(ct)) stop("Type coercion table ct incomplete.") + for (a in seq_along(leftcols)) { # This loop does the following: # - check that join columns have compatible types @@ -87,53 +177,59 @@ bmerge <- function(i, x, leftcols, rightcols, io, xo, roll, rollends, nomatch, m xcnam = names(x)[rc] myXclass = getClass(x[[rc]]) myIclass = getClass(i[[lc]]) - myXtype = if(myXclass == "realDouble") "double" else myXclass - myItype = if(myIclass == "realDouble") "double" else myIclass - joinTypeIdentifier = paste0(myXclass, "==", myIclass) - if(joinTypeIdentifier %chin% typeNoTreatment){ - next - } else if(joinTypeIdentifier %chin% typeErrorClasses){ + myXtype = myXclass + if(myXtype %chin% c("intAsDouble", "reallyDouble")) myXtype = "double" + if(myXtype == "other") myXtype = paste0(class(x[[rc]]), collapse = ",") + myItype = myIclass + if(myItype %chin% c("intAsDouble", "reallyDouble")) myItype = "double" + if(myItype == "other") myItype = paste0(class(i[[lc]]), collapse = ",") + coercionStrategy <- ct[myIclass, myXclass] + + if(coercionStrategy == "y"){ + ## nothing to be done, but no 'next' since the factor related stuff below needs to be executed + } + else if(coercionStrategy == "e"){ stop(sprintf("Incompatible types: %s (%s) and %s (%s)", paste0("x.", xcnam), myXtype, paste0("i.", icnam), myItype)) - } else if(joinTypeIdentifier %chin% typeModeCoercionI){ - ## coerce i[[lc]] to same class as x[[rc]] by mode() approach - if (verbose) {cat(sprintf("Coercing %s column %s to %s to match type of %s.", - myItype, paste0("i.'", icnam, "'"), myXtype, paste0("x.'", xcnam, "'"))); flush.console()} - newval = i[[lc]] - mode(newval) = myXtype # retains column attributes (such as IDateTime class) - set(i, j=lc, value=newval) - } else if(joinTypeIdentifier %chin% typeModeCoercionX){ - ## coerce x[[rc]] to same class as i[[lc]] by mode() approach - if (verbose) {cat(sprintf("Coercing %s column %s to %s to match type of %s.", - myXtype, paste0("x.'", xcnam, "'"), myItype, paste0("i.'", icnam, "'"))); flush.console()} - newval = x[[rc]] - mode(newval) = myItype # retains column attributes (such as IDateTime class) - set(x, j=rc, value=newval) - } else if(joinTypeIdentifier %chin% typeCastCoercionI){ - ## coerce i[[lc]] to same class as x[[rc]] by as.newclass() approach - converter <- match.fun(paste0("as.", myXtype)) - if (verbose) {cat(sprintf("Coercing %s column %s to %s to match type of %s.", - myItype, paste0("i.'", icnam, "'"), myXtype, paste0("x.'", xcnam, "'"))); flush.console()} - newval = i[[lc]] - newval = converter(newval) - set(i, j=lc, value=newval) - } else if(joinTypeIdentifier %chin% typeCastCoercionX){ - ## coerce x[[rc]] to same class as i[[lc]] by as.newclass() approach - converter <- match.fun(paste0("as.", myItype)) + } + else if(coercionStrategy %chin% c("ci", "ciw")){ + ## coerce i[[lc]] to same class as x[[rc]] if (verbose) {cat(sprintf("Coercing %s column %s to %s to match type of %s.", - myXtype, paste0("x.'", xcnam, "'"), myItype, paste0("i.'", icnam, "'"))); flush.console()} - newval = x[[rc]] - newval = converter(newval) - set(x, j=rc, value=newval) - } else if(joinTypeIdentifier %chin% c("factor==factor", "factor==character")){ - if (myItype == "character") { - if (verbose) {cat(sprintf("Coercing %s column %s to %s to match type of %s.", - myItype, paste0("i.'", icnam, "'"), myXtype, paste0("x.'", xcnam, "'"))); flush.console()} - set(origi, j=lc, value=factor(origi[[lc]])) # note the use of 'origi' here - see #499 and #945 + myItype, paste0("i.'", icnam, "'"), myXtype, paste0("x.'", xcnam, "'"))); flush.console()} + if(coercionStrategy == "ciw"){ + warning(sprintf("Coercing %s column %s to %s to match type of %s.", + myItype, paste0("i.'", icnam, "'"), myXtype, paste0("x.'", xcnam, "'"))) + } + if(myXtype == "factor"){ + ## special treatment due to factor levels, see #499 and #945 + newval = coerceClass(origi[[lc]], to = myXtype) ## will do mode() coercion if possible to retain attributes + set(origi, j=lc, value=newval) # TO DO: we need a way to avoid copying 'value' for internal purposes # that would allow setting: set(i, j=lc, value=origi[[lc]]) without resulting in a copy. # until then using 'val <- origi[[lc]]' below to avoid another copy. + } else { + newval = coerceClass(i[[lc]], to = myXtype) ## will do mode() coercion if possible to retain attributes + set(i, j=lc, value=newval) + } + myItype = myXtype + } + else if(coercionStrategy %chin% c("cx", "cxw")){ + ## coerce x[[rc]] to same class as i[[lc]] + if (verbose) {cat(sprintf("Coercing %s column %s to %s to match type of %s.", + myXtype, paste0("x.'", xcnam, "'"), myItype, paste0("i.'", icnam, "'"))); flush.console()} + if(coercionStrategy == "cxw"){ + warning(sprintf("Coercing %s column %s to %s to match type of %s.", + myXtype, paste0("x.'", xcnam, "'"), myItype, paste0("i.'", icnam, "'"))) } + newval = coerceClass(x[[rc]], to = myItype) ## will do mode() coercion if possible to retain attributes + set(x, j=rc, value=newval) + myXtype = myItype + } + else stop("Internal error in bmerge: unknown type coercion strategy.") + + ## now take care about factor columns. + if(myXtype == "factor"){ + if(myItype != "factor") stop("Internal error in bmerge: at this point, myItype should be factor.") # levels of factors have to be treated properly when coercing # Retain original levels of i's factor columns in factor to factor joins (important when NAs, # see tests 687 and 688). @@ -146,25 +242,7 @@ bmerge <- function(i, x, leftcols, rightcols, io, xo, roll, rollends, nomatch, m newfactor = chmatch(li, lx, nomatch=0L)[val] # fix for #945, a hacky solution for now. levels(newfactor) = lx class(newfactor) = "factor" - set(i, j=lc, value=newfactor) - } else if(myIclass == "other" || myXclass == "other"){ - ## very unlikely case - ## at least one column is neither integer, double, character or factor. - ## join will work if - ## - both columns have exactly the same class - ## - typeof(x[[rc]]) == typeof(i[[lc]]) with a warning - if(all(class(x[[rc]]) == class(i[[lc]]))){ - next - } else if(typeof(x[[rc]]) == typeof(i[[lc]])){ - warning(sprintf("Joining on columns of different class: %s (%s) and %s (%s). Join works since both columns are of the same type: %s", - paste0("x.'", xcnam, "'"), paste0(class(x[[rc]]), collapse = ","), paste0("i.'", icnam, "'"), paste0(class(i[[lc]]), collapse = ","), typeof(x[[rc]]))) - ## nothing needs to be done, Cbmerge will work because of the same types. - } else { - stop(sprintf("Incompatible types: %s (%s) and %s (%s)", - paste0("x.", xcnam), paste0(class(x[[rc]]), collapse = ","), paste0("i.", icnam), paste0(class(i[[lc]]), collapse = ","))) - } - } else { - stop("Internal error: data.table's bmerge doesn't know how to handle joins of type ", joinTypeIdentifier, ". Please report the bug to the developers") + set(i, j=lc, value=newfactor) } } if (verbose) {last.started.at=proc.time();cat("Starting bmerge ...");flush.console()} From 1ff37ff5d008f0b16d66cdb2d8aa0617daef946e Mon Sep 17 00:00:00 2001 From: "NORDEXAG\\BonschM" Date: Thu, 19 Apr 2018 10:04:06 +0200 Subject: [PATCH 11/31] prepare for merging master --- inst/tests/tests.Rraw | 246 ------------------------------------------ 1 file changed, 246 deletions(-) diff --git a/inst/tests/tests.Rraw b/inst/tests/tests.Rraw index 378d782511..182fc41dca 100644 --- a/inst/tests/tests.Rraw +++ b/inst/tests/tests.Rraw @@ -11631,252 +11631,6 @@ DT = data.table(x = 1:5, y = 6:10) test(1901.1, DT[, bquote(z==.(sum(x)))], bquote(z==.(DT[, sum(x)]))) test(1901.2, DT[, .(.(bquote(z==.(sd(x-y)))))], data.table(V1=list(bquote(z==.(DT[, sd(x-y)]))))) -## test type coercion in joins (#2592) -dt1 <- data.table(intCol = 1L:10L, - doubleCol = as.numeric(1:10), ## only 1:10 will be integer - realDoubleCol = seq(0.5, 5, by = 0.5), - boolCol = c(rep(FALSE, 9), TRUE), - charCol = letters[1L:10L], - factCol = factor(letters[1L:10L])) -dt2 <- data.table(intCol = 1L:5L, - doubleCol = as.numeric(1:5), ## only 1:5 will be integer - realDoubleCol = seq(0.5, 2.5, by = 0.5), - boolCol = TRUE, - charCol = letters[1L:5L], - factCol = factor(letters[1L:5L])) -if ("package:bit64" %in% search()) { - dt1[, int64Col := as.integer64(c(1:9, 3e10))] - dt2[, int64Col := as.integer64(c(1:4, 3e9))] -} -## no coercion when types match -test(1902.1, - nrow(dt1[dt2, on = "boolCol==boolCol"]), nrow(dt2), - warning = NULL) -test(1902.2, - nrow(dt1[dt2, on = "intCol==intCol"]), nrow(dt2), - warning = NULL) -test(1902.3, - nrow(dt1[dt2, on = "doubleCol==doubleCol"]), nrow(dt2), - warning = NULL) -test(1902.4, - nrow(dt1[dt2, on = "realDoubleCol==realDoubleCol"]), nrow(dt2), - warning = NULL) -test(1902.5, - nrow(dt1[dt2, on = "charCol==charCol"]), nrow(dt2), - warning = NULL) -test(1902.6, - nrow(dt1[dt2, on = "factCol==factCol"]), nrow(dt2), - warning = NULL) -if ("package:bit64" %in% search()) { - test(1902.7, - nrow(dt1[dt2, on = "int64Col==int64Col"]), nrow(dt2), - warning = NULL) -} -## error on incompatible types -test(1902.8, - dt1[dt2, on = "boolCol==intCol"], - error = "Incompatible types: x.boolCol (logical) and i.intCol (integer)") -test(1902.9, - dt1[dt2, on = "boolCol==doubleCol"], - error = "Incompatible types: x.boolCol (logical) and i.doubleCol (double)") -test(1902.11, - dt1[dt2, on = "boolCol==realDoubleCol"], - error = "Incompatible types: x.boolCol (logical) and i.realDoubleCol (double)") -test(1902.12, - dt1[dt2, on = "boolCol==charCol"], - error = "Incompatible types: x.boolCol (logical) and i.charCol (character)") -test(1902.13, - dt1[dt2, on = "boolCol==factCol"], - error = "Incompatible types: x.boolCol (logical) and i.factCol (factor)") -test(1902.14, - dt1[dt2, on = "intCol==charCol"], - error = "Incompatible types: x.intCol (integer) and i.charCol (character)") -test(1902.15, - dt1[dt2, on = "intCol==factCol"], - error = "Incompatible types: x.intCol (integer) and i.factCol (factor)") -test(1902.16, - dt1[dt2, on = "doubleCol==charCol"], - error = "Incompatible types: x.doubleCol (double) and i.charCol (character)") -test(1902.17, - dt1[dt2, on = "realDoubleCol==charCol"], - error = "Incompatible types: x.realDoubleCol (double) and i.charCol (character)") -test(1902.18, - dt1[dt2, on = "doubleCol==factCol"], - error = "Incompatible types: x.doubleCol (double) and i.factCol (factor)") -test(1902.19, - dt1[dt2, on = "realDoubleCol==factCol"], - error = "Incompatible types: x.realDoubleCol (double) and i.factCol (factor)") -test(1902.21, - dt1[dt2, on = "charCol==boolCol"], - error = "Incompatible types: x.charCol (character) and i.boolCol (logical)") -test(1902.22, - dt1[dt2, on = "charCol==intCol"], - error = "Incompatible types: x.charCol (character) and i.intCol (integer)") -test(1902.23, - dt1[dt2, on = "charCol==doubleCol"], - error = "Incompatible types: x.charCol (character) and i.doubleCol (double)") -test(1902.24, - dt1[dt2, on = "charCol==realDoubleCol"], - error = "Incompatible types: x.charCol (character) and i.realDoubleCol (double)") -test(1902.25, - dt1[dt2, on = "factCol==boolCol"], - error = "Incompatible types: x.factCol (factor) and i.boolCol (logical)") -test(1902.26, - dt1[dt2, on = "factCol==intCol"], - error = "Incompatible types: x.factCol (factor) and i.intCol (integer)") -test(1902.27, - dt1[dt2, on = "factCol==doubleCol"], - error = "Incompatible types: x.factCol (factor) and i.doubleCol (double)") -test(1902.28, - dt1[dt2, on = "factCol==realDoubleCol"], - error = "Incompatible types: x.factCol (factor) and i.realDoubleCol (double)") -if ("package:bit64" %in% search()) { - test(1902.29, - dt1[dt2, on = "boolCol==int64Col"], - error = "Incompatible types: x.boolCol (logical) and i.int64Col (integer64)") - test(1902.31, - dt1[dt2, on = "charCol==int64Col"], - error = "Incompatible types: x.charCol (character) and i.int64Col (integer64)") - test(1902.32, - dt1[dt2, on = "factCol==int64Col"], - error = "Incompatible types: x.factCol (factor) and i.int64Col (integer64)") - test(1902.33, - dt1[dt2, on = "int64Col==charCol"], - error = "Incompatible types: x.int64Col (integer64) and i.charCol (character)") - test(1902.34, - dt1[dt2, on = "int64Col==factCol"], - error = "Incompatible types: x.int64Col (integer64) and i.factCol (factor)") -} -## correct behaviour on other types. -## 4 checks: -## - correct warning -## - correct type of the coerced columns in i and x -## - correct number of rows in the join -cols <- c("boolCol", "intCol", "doubleCol", "realDoubleCol", "charCol", "factCol") -if ("package:bit64" %in% search()) { - cols <- c(cols, "int64Col") -} -cols <- c(paste0("x.", cols), paste0("i.", cols)) ## make sure that all columns from x and i are in the result -test(1902.35, - result <- dt1[dt2, cols, on = "intCol==boolCol", with = FALSE, nomatch = 0L, verbose = TRUE], - dt1[dt2, cols, on = "intCol==boolCol", with = FALSE, nomatch = 0L], - output = "Coercing logical column i.'boolCol' to integer to match type of x.'intCol'.") -test(1902.36, class(result$i.boolCol), "integer") -test(1902.37, class(result$x.intCol), "integer") -test(1902.38, nrow(result), 5L) -test(1902.39, - result <- dt1[dt2, cols, on = "intCol==doubleCol", with = FALSE, nomatch = 0L, verbose = TRUE], - dt1[dt2, cols, on = "intCol==doubleCol", with = FALSE, nomatch = 0L], - output = "Coercing double column i.'doubleCol' to integer to match type of x.'intCol'.") -test(1902.41, class(result$i.doubleCol), "integer") -test(1902.42, class(result$x.intCol), "integer") -test(1902.43, nrow(result), 5L) -test(1902.44, - result <- dt1[dt2, cols, on = "intCol==realDoubleCol", with = FALSE, nomatch = 0L, verbose = TRUE], - dt1[dt2, cols, on = "intCol==realDoubleCol", with = FALSE, nomatch = 0L], - output = "Coercing integer column x.'intCol' to double to match type of i.'realDoubleCol'.") -test(1902.45, class(result$i.realDoubleCol), "numeric") -test(1902.46, class(result$x.intCol), "integer") ## coercion of x columns is only for the join. The original type is returned. -test(1902.47, nrow(result), 2L) -test(1902.48, - result <- dt1[dt2, cols, on = "doubleCol==boolCol", with = FALSE, nomatch = 0L, verbose = TRUE], - dt1[dt2, cols, on = "doubleCol==boolCol", with = FALSE, nomatch = 0L], - output = "Coercing logical column i.'boolCol' to double to match type of x.'doubleCol'.") -test(1902.49, class(result$i.boolCol), "numeric") -test(1902.51, class(result$x.doubleCol), "numeric") -test(1902.52, nrow(result), 5L) -test(1902.53, - result <- dt1[dt2, cols, on = "realDoubleCol==boolCol", with = FALSE, nomatch = 0L, verbose = TRUE], - dt1[dt2, cols, on = "realDoubleCol==boolCol", with = FALSE, nomatch = 0L], - output = "Coercing logical column i.'boolCol' to double to match type of x.'realDoubleCol'.") -test(1902.54, class(result$i.boolCol), "numeric") -test(1902.55, class(result$x.doubleCol), "numeric") -test(1902.56, nrow(result), 5L) -test(1902.57, - result <- dt1[dt2, cols, on = "doubleCol==intCol", with = FALSE, nomatch = 0L, verbose = TRUE], - dt1[dt2, cols, on = "doubleCol==intCol", with = FALSE, nomatch = 0L], - output = "Coercing integer column i.'intCol' to double to match type of x.'doubleCol'.") -test(1902.58, class(result$i.intCol), "numeric") -test(1902.59, class(result$x.doubleCol), "numeric") -test(1902.61, nrow(result), 5L) -test(1902.62, - result <- dt1[dt2, cols, on = "realDoubleCol==intCol", with = FALSE, nomatch = 0L, verbose = TRUE], - dt1[dt2, cols, on = "realDoubleCol==intCol", with = FALSE, nomatch = 0L], - output = "Coercing integer column i.'intCol' to double to match type of x.'realDoubleCol'.") -test(1902.63, class(result$i.intCol), "numeric") -test(1902.64, class(result$x.realDoubleCol), "numeric") -test(1902.65, nrow(result), 5L) -test(1902.66, - result <- dt1[dt2, cols, on = "charCol==factCol", with = FALSE, nomatch = 0L, verbose = TRUE], - dt1[dt2, cols, on = "charCol==factCol", with = FALSE, nomatch = 0L], - output = "Coercing factor column i.'factCol' to character to match type of x.'charCol'.") -test(1902.67, class(result$i.factCol), "character") -test(1902.68, class(result$x.charCol), "character") -test(1902.69, nrow(result), 5L) -test(1902.71, - result <- dt1[dt2, cols, on = "factCol==charCol", with = FALSE, nomatch = 0L, verbose = TRUE], - dt1[dt2, cols, on = "factCol==charCol", with = FALSE, nomatch = 0L], - output = "Coercing character column i.'charCol' to factor to match type of x.'factCol'.") -test(1902.72, class(result$i.charCol), "factor") -test(1902.73, class(result$x.factCol), "factor") -test(1902.74, nrow(result), 5L) -if ("package:bit64" %in% search()) { - test(1902.75, - result <- dt1[dt2, cols, on = "intCol==int64Col", with = FALSE, nomatch = 0L, verbose = TRUE], - suppressWarnings(dt1[dt2, cols, on = "intCol==int64Col", with = FALSE, nomatch = 0L]), - output = "Coercing integer64 column i.'int64Col' to integer to match type of x.'intCol'.", - warning = "NAs produced by integer overflow") - test(1902.76, class(result$i.int64Col), "integer") - test(1902.77, class(result$x.intCol), "integer") - test(1902.78, nrow(result), 4L) - test(1902.79, - result <- dt1[dt2, cols, on = "doubleCol==int64Col", with = FALSE, nomatch = 0L, verbose = TRUE], - dt1[dt2, cols, on = "doubleCol==int64Col", with = FALSE, nomatch = 0L], - output = "Coercing integer64 column i.'int64Col' to double to match type of x.'doubleCol'.") - test(1902.81, class(result$i.int64Col), "numeric") - test(1902.82, class(result$x.doubleCol), "numeric") - test(1902.83, nrow(result), 4L) - test(1902.84, - result <- dt1[dt2, cols, on = "realDoubleCol==int64Col", with = FALSE, nomatch = 0L, verbose = TRUE], - dt1[dt2, cols, on = "realDoubleCol==int64Col", with = FALSE, nomatch = 0L], - output = "Coercing integer64 column i.'int64Col' to double to match type of x.'realDoubleCol'.") - test(1902.85, class(result$i.int64Col), "numeric") - test(1902.86, class(result$x.realDoubleCol), "numeric") - test(1902.87, nrow(result), 4L) - test(1902.88, - result <- dt1[dt2, cols, on = "int64Col==boolCol", with = FALSE, nomatch = 0L, verbose = TRUE], - dt1[dt2, cols, on = "int64Col==boolCol", with = FALSE, nomatch = 0L], - output = "Coercing logical column i.'boolCol' to integer64 to match type of x.'int64Col'.") - test(1902.89, class(result$i.boolCol), "integer64") - test(1902.91, class(result$x.int64Col), "integer64") - test(1902.92, nrow(result), 5L) - test(1902.93, - result <- dt1[dt2, cols, on = "int64Col==intCol", with = FALSE, nomatch = 0L, verbose = TRUE], - dt1[dt2, cols, on = "int64Col==intCol", with = FALSE, nomatch = 0L], - output = "Coercing integer column i.'intCol' to integer64 to match type of x.'int64Col'.") - test(1902.94, class(result$i.intCol), "integer64") - test(1902.95, class(result$x.int64Col), "integer64") - test(1902.96, nrow(result), 5L) - test(1902.97, - result <- dt1[dt2, cols, on = "int64Col==doubleCol", with = FALSE, nomatch = 0L, verbose = TRUE], - dt1[dt2, cols, on = "int64Col==doubleCol", with = FALSE, nomatch = 0L], - output = "Coercing double column i.'doubleCol' to integer64 to match type of x.'int64Col'.") - test(1902.98, class(result$i.doubleCol), "integer64") - test(1902.99, class(result$x.int64Col), "integer64") - test(1902.101, nrow(result), 5L) - test(1902.102, - result <- dt1[dt2, cols, on = "int64Col==realDoubleCol", with = FALSE, nomatch = 0L, verbose = TRUE], - dt1[dt2, cols, on = "int64Col==realDoubleCol", with = FALSE, nomatch = 0L], - output = "Coercing integer64 column x.'int64Col' to double to match type of i.'realDoubleCol'.") - test(1902.103, class(result$i.realDoubleCol), "numeric") - test(1902.104, class(result$x.int64Col), "integer64") ## coercion of x columns is only for the join. The original type is returned. - test(1902.105, nrow(result), 2L) -} -## correct behaviour if non-standard types are involved: -## Unfortunately, I can't imagine any object that is not either integer, double, character, or factor -## AND is supported by forder. -## Therefore, can't test this branch. Will also very rarely happen in reality. - ################################### # Add new tests above this line # ################################### From 341a165dbceffaab7b458bd5584bf23182b65f4e Mon Sep 17 00:00:00 2001 From: "NORDEXAG\\BonschM" Date: Thu, 19 Apr 2018 10:25:47 +0200 Subject: [PATCH 12/31] Reintroduced new tests after merge to master. Added one test for non-standard column. --- inst/tests/tests.Rraw | 246 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 246 insertions(+) diff --git a/inst/tests/tests.Rraw b/inst/tests/tests.Rraw index 624863f0c0..d2bc5665d9 100644 --- a/inst/tests/tests.Rraw +++ b/inst/tests/tests.Rraw @@ -11657,6 +11657,252 @@ test(1904.5, fread(txt, na.strings=c("NA", " "), strip.white=FALSE), error='na.s setnames(ans, c("A"," B"," C")) test(1904.6, fread(txt, na.strings="NA", strip.white=FALSE), ans) # whitespace around NA strings is always stripped regardless of strip.white; just column names affected here +## test type coercion in joins (#2592) +dt1 <- data.table(intCol = 1L:10L, + doubleCol = as.numeric(1:10), ## only 1:10 will be integer + realDoubleCol = seq(0.5, 5, by = 0.5), + boolCol = c(rep(FALSE, 9), TRUE), + charCol = letters[1L:10L], + factCol = factor(letters[1L:10L])) +dt2 <- data.table(intCol = 1L:5L, + doubleCol = as.numeric(1:5), ## only 1:5 will be integer + realDoubleCol = seq(0.5, 2.5, by = 0.5), + boolCol = TRUE, + charCol = letters[1L:5L], + factCol = factor(letters[1L:5L]), + complexCol = as.complex(1:5)) +if ("package:bit64" %in% search()) { + dt1[, int64Col := as.integer64(c(1:9, 3e10))] + dt2[, int64Col := as.integer64(c(1:4, 3e9))] +} +## no coercion when types match +test(1905.1, + nrow(dt1[dt2, on = "boolCol==boolCol"]), nrow(dt2), + warning = NULL) +test(1905.2, + nrow(dt1[dt2, on = "intCol==intCol"]), nrow(dt2), + warning = NULL) +test(1905.3, + nrow(dt1[dt2, on = "doubleCol==doubleCol"]), nrow(dt2), + warning = NULL) +test(1905.4, + nrow(dt1[dt2, on = "realDoubleCol==realDoubleCol"]), nrow(dt2), + warning = NULL) +test(1905.5, + nrow(dt1[dt2, on = "charCol==charCol"]), nrow(dt2), + warning = NULL) +test(1905.6, + nrow(dt1[dt2, on = "factCol==factCol"]), nrow(dt2), + warning = NULL) +if ("package:bit64" %in% search()) { + test(1905.7, + nrow(dt1[dt2, on = "int64Col==int64Col"]), nrow(dt2), + warning = NULL) +} +## error on incompatible types +test(1905.8, + dt1[dt2, on = "boolCol==intCol"], + error = "Incompatible types: x.boolCol (logical) and i.intCol (integer)") +test(1905.9, + dt1[dt2, on = "boolCol==doubleCol"], + error = "Incompatible types: x.boolCol (logical) and i.doubleCol (double)") +test(1905.11, + dt1[dt2, on = "boolCol==realDoubleCol"], + error = "Incompatible types: x.boolCol (logical) and i.realDoubleCol (double)") +test(1905.12, + dt1[dt2, on = "boolCol==charCol"], + error = "Incompatible types: x.boolCol (logical) and i.charCol (character)") +test(1905.13, + dt1[dt2, on = "boolCol==factCol"], + error = "Incompatible types: x.boolCol (logical) and i.factCol (factor)") +test(1905.14, + dt1[dt2, on = "intCol==charCol"], + error = "Incompatible types: x.intCol (integer) and i.charCol (character)") +test(1905.15, + dt1[dt2, on = "intCol==factCol"], + error = "Incompatible types: x.intCol (integer) and i.factCol (factor)") +test(1905.16, + dt1[dt2, on = "doubleCol==charCol"], + error = "Incompatible types: x.doubleCol (double) and i.charCol (character)") +test(1905.17, + dt1[dt2, on = "realDoubleCol==charCol"], + error = "Incompatible types: x.realDoubleCol (double) and i.charCol (character)") +test(1905.18, + dt1[dt2, on = "doubleCol==factCol"], + error = "Incompatible types: x.doubleCol (double) and i.factCol (factor)") +test(1905.19, + dt1[dt2, on = "realDoubleCol==factCol"], + error = "Incompatible types: x.realDoubleCol (double) and i.factCol (factor)") +test(1905.21, + dt1[dt2, on = "charCol==boolCol"], + error = "Incompatible types: x.charCol (character) and i.boolCol (logical)") +test(1905.22, + dt1[dt2, on = "charCol==intCol"], + error = "Incompatible types: x.charCol (character) and i.intCol (integer)") +test(1905.23, + dt1[dt2, on = "charCol==doubleCol"], + error = "Incompatible types: x.charCol (character) and i.doubleCol (double)") +test(1905.24, + dt1[dt2, on = "charCol==realDoubleCol"], + error = "Incompatible types: x.charCol (character) and i.realDoubleCol (double)") +test(1905.25, + dt1[dt2, on = "factCol==boolCol"], + error = "Incompatible types: x.factCol (factor) and i.boolCol (logical)") +test(1905.26, + dt1[dt2, on = "factCol==intCol"], + error = "Incompatible types: x.factCol (factor) and i.intCol (integer)") +test(1905.27, + dt1[dt2, on = "factCol==doubleCol"], + error = "Incompatible types: x.factCol (factor) and i.doubleCol (double)") +test(1905.28, + dt1[dt2, on = "factCol==realDoubleCol"], + error = "Incompatible types: x.factCol (factor) and i.realDoubleCol (double)") +if ("package:bit64" %in% search()) { + test(1905.29, + dt1[dt2, on = "boolCol==int64Col"], + error = "Incompatible types: x.boolCol (logical) and i.int64Col (integer64)") + test(1905.31, + dt1[dt2, on = "charCol==int64Col"], + error = "Incompatible types: x.charCol (character) and i.int64Col (integer64)") + test(1905.32, + dt1[dt2, on = "factCol==int64Col"], + error = "Incompatible types: x.factCol (factor) and i.int64Col (integer64)") + test(1905.33, + dt1[dt2, on = "int64Col==charCol"], + error = "Incompatible types: x.int64Col (integer64) and i.charCol (character)") + test(1905.34, + dt1[dt2, on = "int64Col==factCol"], + error = "Incompatible types: x.int64Col (integer64) and i.factCol (factor)") +} +## correct behaviour on other types. +## 4 checks: +## - correct warning +## - correct type of the coerced columns in i and x +## - correct number of rows in the join +cols <- c("boolCol", "intCol", "doubleCol", "realDoubleCol", "charCol", "factCol") +if ("package:bit64" %in% search()) { + cols <- c(cols, "int64Col") +} +cols <- c(paste0("x.", cols), paste0("i.", cols)) ## make sure that all columns from x and i are in the result +test(1905.35, + result <- dt1[dt2, cols, on = "intCol==boolCol", with = FALSE, nomatch = 0L, verbose = TRUE], + dt1[dt2, cols, on = "intCol==boolCol", with = FALSE, nomatch = 0L], + output = "Coercing logical column i.'boolCol' to integer to match type of x.'intCol'.") +test(1905.36, class(result$i.boolCol), "integer") +test(1905.37, class(result$x.intCol), "integer") +test(1905.38, nrow(result), 5L) +test(1905.39, + result <- dt1[dt2, cols, on = "intCol==doubleCol", with = FALSE, nomatch = 0L, verbose = TRUE], + dt1[dt2, cols, on = "intCol==doubleCol", with = FALSE, nomatch = 0L], + output = "Coercing double column i.'doubleCol' to integer to match type of x.'intCol'.") +test(1905.41, class(result$i.doubleCol), "integer") +test(1905.42, class(result$x.intCol), "integer") +test(1905.43, nrow(result), 5L) +test(1905.44, + result <- dt1[dt2, cols, on = "intCol==realDoubleCol", with = FALSE, nomatch = 0L, verbose = TRUE], + dt1[dt2, cols, on = "intCol==realDoubleCol", with = FALSE, nomatch = 0L], + output = "Coercing integer column x.'intCol' to double to match type of i.'realDoubleCol'.") +test(1905.45, class(result$i.realDoubleCol), "numeric") +test(1905.46, class(result$x.intCol), "integer") ## coercion of x columns is only for the join. The original type is returned. +test(1905.47, nrow(result), 2L) +test(1905.48, + result <- dt1[dt2, cols, on = "doubleCol==boolCol", with = FALSE, nomatch = 0L, verbose = TRUE], + dt1[dt2, cols, on = "doubleCol==boolCol", with = FALSE, nomatch = 0L], + output = "Coercing logical column i.'boolCol' to double to match type of x.'doubleCol'.") +test(1905.49, class(result$i.boolCol), "numeric") +test(1905.51, class(result$x.doubleCol), "numeric") +test(1905.52, nrow(result), 5L) +test(1905.53, + result <- dt1[dt2, cols, on = "realDoubleCol==boolCol", with = FALSE, nomatch = 0L, verbose = TRUE], + dt1[dt2, cols, on = "realDoubleCol==boolCol", with = FALSE, nomatch = 0L], + output = "Coercing logical column i.'boolCol' to double to match type of x.'realDoubleCol'.") +test(1905.54, class(result$i.boolCol), "numeric") +test(1905.55, class(result$x.doubleCol), "numeric") +test(1905.56, nrow(result), 5L) +test(1905.57, + result <- dt1[dt2, cols, on = "doubleCol==intCol", with = FALSE, nomatch = 0L, verbose = TRUE], + dt1[dt2, cols, on = "doubleCol==intCol", with = FALSE, nomatch = 0L], + output = "Coercing integer column i.'intCol' to double to match type of x.'doubleCol'.") +test(1905.58, class(result$i.intCol), "numeric") +test(1905.59, class(result$x.doubleCol), "numeric") +test(1905.61, nrow(result), 5L) +test(1905.62, + result <- dt1[dt2, cols, on = "realDoubleCol==intCol", with = FALSE, nomatch = 0L, verbose = TRUE], + dt1[dt2, cols, on = "realDoubleCol==intCol", with = FALSE, nomatch = 0L], + output = "Coercing integer column i.'intCol' to double to match type of x.'realDoubleCol'.") +test(1905.63, class(result$i.intCol), "numeric") +test(1905.64, class(result$x.realDoubleCol), "numeric") +test(1905.65, nrow(result), 5L) +test(1905.66, + result <- dt1[dt2, cols, on = "charCol==factCol", with = FALSE, nomatch = 0L, verbose = TRUE], + dt1[dt2, cols, on = "charCol==factCol", with = FALSE, nomatch = 0L], + output = "Coercing factor column i.'factCol' to character to match type of x.'charCol'.") +test(1905.67, class(result$i.factCol), "character") +test(1905.68, class(result$x.charCol), "character") +test(1905.69, nrow(result), 5L) +test(1905.71, + result <- dt1[dt2, cols, on = "factCol==charCol", with = FALSE, nomatch = 0L, verbose = TRUE], + dt1[dt2, cols, on = "factCol==charCol", with = FALSE, nomatch = 0L], + output = "Coercing character column i.'charCol' to factor to match type of x.'factCol'.") +test(1905.72, class(result$i.charCol), "factor") +test(1905.73, class(result$x.factCol), "factor") +test(1905.74, nrow(result), 5L) +if ("package:bit64" %in% search()) { + test(1905.75, + result <- dt1[dt2, cols, on = "intCol==int64Col", with = FALSE, nomatch = 0L, verbose = TRUE], + suppressWarnings(dt1[dt2, cols, on = "intCol==int64Col", with = FALSE, nomatch = 0L]), + output = "Coercing integer64 column i.'int64Col' to integer to match type of x.'intCol'.", + warning = "NAs produced by integer overflow") + test(1905.76, class(result$i.int64Col), "integer") + test(1905.77, class(result$x.intCol), "integer") + test(1905.78, nrow(result), 4L) + test(1905.79, + result <- dt1[dt2, cols, on = "doubleCol==int64Col", with = FALSE, nomatch = 0L, verbose = TRUE], + dt1[dt2, cols, on = "doubleCol==int64Col", with = FALSE, nomatch = 0L], + output = "Coercing integer64 column i.'int64Col' to double to match type of x.'doubleCol'.") + test(1905.81, class(result$i.int64Col), "numeric") + test(1905.82, class(result$x.doubleCol), "numeric") + test(1905.83, nrow(result), 4L) + test(1905.84, + result <- dt1[dt2, cols, on = "realDoubleCol==int64Col", with = FALSE, nomatch = 0L, verbose = TRUE], + dt1[dt2, cols, on = "realDoubleCol==int64Col", with = FALSE, nomatch = 0L], + output = "Coercing integer64 column i.'int64Col' to double to match type of x.'realDoubleCol'.") + test(1905.85, class(result$i.int64Col), "numeric") + test(1905.86, class(result$x.realDoubleCol), "numeric") + test(1905.87, nrow(result), 4L) + test(1905.88, + result <- dt1[dt2, cols, on = "int64Col==boolCol", with = FALSE, nomatch = 0L, verbose = TRUE], + dt1[dt2, cols, on = "int64Col==boolCol", with = FALSE, nomatch = 0L], + output = "Coercing logical column i.'boolCol' to integer64 to match type of x.'int64Col'.") + test(1905.89, class(result$i.boolCol), "integer64") + test(1905.91, class(result$x.int64Col), "integer64") + test(1905.92, nrow(result), 5L) + test(1905.93, + result <- dt1[dt2, cols, on = "int64Col==intCol", with = FALSE, nomatch = 0L, verbose = TRUE], + dt1[dt2, cols, on = "int64Col==intCol", with = FALSE, nomatch = 0L], + output = "Coercing integer column i.'intCol' to integer64 to match type of x.'int64Col'.") + test(1905.94, class(result$i.intCol), "integer64") + test(1905.95, class(result$x.int64Col), "integer64") + test(1905.96, nrow(result), 5L) + test(1905.97, + result <- dt1[dt2, cols, on = "int64Col==doubleCol", with = FALSE, nomatch = 0L, verbose = TRUE], + dt1[dt2, cols, on = "int64Col==doubleCol", with = FALSE, nomatch = 0L], + output = "Coercing double column i.'doubleCol' to integer64 to match type of x.'int64Col'.") + test(1905.98, class(result$i.doubleCol), "integer64") + test(1905.99, class(result$x.int64Col), "integer64") + test(1905.101, nrow(result), 5L) + test(1905.102, + result <- dt1[dt2, cols, on = "int64Col==realDoubleCol", with = FALSE, nomatch = 0L, verbose = TRUE], + dt1[dt2, cols, on = "int64Col==realDoubleCol", with = FALSE, nomatch = 0L], + output = "Coercing integer64 column x.'int64Col' to double to match type of i.'realDoubleCol'.") + test(1905.103, class(result$i.realDoubleCol), "numeric") + test(1905.104, class(result$x.int64Col), "integer64") ## coercion of x columns is only for the join. The original type is returned. + test(1905.105, nrow(result), 2L) +} +## correct behaviour if non-standard types are involved: +## can only be tested for non-standard column in i because non-standard in x throws error before bmerge in forderv +test(1905.106, dt1[dt2, on = "intCol==complexCol"], + error = "Incompatible types: x.intCol (integer) and i.complexCol (complex)") ################################### # Add new tests above this line # From ae40b8b5d39fecac0057360b7775ec7e2d9a082c Mon Sep 17 00:00:00 2001 From: MarkusBonsch Date: Thu, 4 Oct 2018 22:57:00 +0200 Subject: [PATCH 13/31] Prepared move of xo in foverlaps.R. --- R/foverlaps.R | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/R/foverlaps.R b/R/foverlaps.R index 363919d198..1bcb408cde 100644 --- a/R/foverlaps.R +++ b/R/foverlaps.R @@ -112,7 +112,7 @@ foverlaps <- function(x, y, by.x = if (!is.null(key(x))) key(x) else key(y), by. if (verbose) {cat(timetaken(last.started.at),"\n"); flush.console()} matches <- function(ii, xx, del, ...) { cols = setdiff(names(xx), del) - xx = .shallow(xx, cols, retain.key = FALSE) + xx = .shallow(xx, cols, retain.key = TRUE) ans = bmerge(xx, ii, seq_along(xx), seq_along(xx), integer(0), mult=mult, ops=rep(1L, length(xx)), integer(0), 1L, verbose=verbose, ...) # vecseq part should never run here, but still... if (ans$allLen1) ans$starts else vecseq(ans$starts, ans$lens, NULL) From dd93b5e0f958882443e7abb517b8c27bb9a71542 Mon Sep 17 00:00:00 2001 From: MarkusBonsch Date: Fri, 5 Oct 2018 01:00:58 +0200 Subject: [PATCH 14/31] Moved xo calculation inside bmerge.R. All tests passing. --- R/between.R | 7 +++--- R/bmerge.R | 63 +++++++++++++++++++++++++++++++++++++++++++++++++- R/data.table.R | 60 ++++------------------------------------------- R/foverlaps.R | 2 +- 4 files changed, 71 insertions(+), 61 deletions(-) diff --git a/R/between.R b/R/between.R index f72d8a8bc6..2fbc0f7b13 100644 --- a/R/between.R +++ b/R/between.R @@ -34,11 +34,10 @@ inrange <- function(x,lower,upper,incbounds=TRUE) { ops = if (incbounds) c(4L, 2L) else c(5L, 3L) # >=,<= and >,< verbose = getOption("datatable.verbose") if (verbose) {last.started.at=proc.time();cat("forderv(query) took ... ");flush.console()} - xo = forderv(query) if (verbose) {cat(timetaken(last.started.at),"\n"); flush.console()} - ans = bmerge(shallow(subject), query, 1L:2L, c(1L,1L), xo, - 0, c(FALSE, TRUE), 0L, "all", ops, integer(0L), - 1L, verbose) # fix for #1819, turn on verbose messages + ans = bmerge(shallow(subject), query, 1L:2L, c(1L,1L), + 0, c(FALSE, TRUE), 0L, "all", ops, verbose) # fix for #1819, turn on verbose messages + xo <- ans$xo options(datatable.verbose=FALSE) setDT(ans[c("starts", "lens")], key=c("starts", "lens")) options(datatable.verbose=verbose) diff --git a/R/bmerge.R b/R/bmerge.R index b59b5e939f..02615eb724 100644 --- a/R/bmerge.R +++ b/R/bmerge.R @@ -1,5 +1,5 @@ -bmerge <- function(i, x, leftcols, rightcols, xo, roll, rollends, nomatch, mult, ops, nqgrp, nqmaxgrp, verbose) +bmerge <- function(i, x, leftcols, rightcols, roll, rollends, nomatch, mult, ops, verbose) { # TO DO: rename leftcols to icols, rightcols to xcols # TO DO: xo could be moved inside Cbmerge @@ -90,6 +90,65 @@ bmerge <- function(i, x, leftcols, rightcols, xo, roll, rollends, nomatch, mult, } ## after all modifications of i, check if i has a proper key on all leftcols io <- identical(leftcols, head(chmatch(key(i), names(i)), length(leftcols))) + + ## after all modifications of x, check if x has a proper key on all rightcols. + ## If not, calculate the order. Also for non-equi joins, the order must be calculated. + non_equi = which.first(ops != 1L) # 1 is "==" operator + if (is.na(non_equi)) { + # equi join. use existing key (#1825) or existing secondary index (#1439) + if (identical(rightcols, head(chmatch(key(x), names(x)), length(rightcols)))) { + xo = integer(0L) + if (verbose) cat("on= matches existing key, using key\n") + } else { + xo <- NULL + if (isTRUE(getOption("datatable.use.index"))) { + xo = getindex(x, names(x)[rightcols]) + if (verbose && !is.null(xo)) cat("on= matches existing index, using index\n") + } + if (is.null(xo)) { + if (verbose) {last.started.at=proc.time(); flush.console()} + xo = forderv(x, by = rightcols) + if (verbose) {cat("Calculated ad hoc index in",timetaken(last.started.at),"\n"); flush.console()} + # TODO: use setindex() instead, so it's cached for future reuse + } + } + ## these vaiables are only needed for non-equi joins. Set them to default. + nqgrp <- integer(0) + nqmaxgrp <- 1L + } else { + # non-equi operators present.. investigate groups.. + nqgrp <- integer(0) + nqmaxgrp <- 1L + if (verbose) cat("Non-equi join operators detected ... \n") + if (roll != FALSE) stop("roll is not implemented for non-equi joins yet.") + if (verbose) {last.started.at=proc.time();cat(" forder took ... ");flush.console()} + # TODO: could check/reuse secondary indices, but we need 'starts' attribute as well! + xo = forderv(x, rightcols, retGrp=TRUE) + if (verbose) {cat(timetaken(last.started.at),"\n"); flush.console()} + xg = attr(xo, 'starts') + resetcols = head(rightcols, non_equi-1L) + if (length(resetcols)) { + # TODO: can we get around having to reorder twice here? + # or at least reuse previous order? + if (verbose) {last.started.at=proc.time();cat(" Generating group lengths ... ");flush.console()} + resetlen = attr(forderv(x, resetcols, retGrp=TRUE), 'starts') + resetlen = .Call(Cuniqlengths, resetlen, nrow(x)) + if (verbose) {cat("done in",timetaken(last.started.at),"\n"); flush.console()} + } else resetlen = integer(0L) + if (verbose) {last.started.at=proc.time();cat(" Generating non-equi group ids ... ");flush.console()} + nqgrp = .Call(Cnestedid, x, rightcols[non_equi:length(rightcols)], xo, xg, resetlen, mult) + if (verbose) {cat("done in",timetaken(last.started.at),"\n"); flush.console()} + if (length(nqgrp)) nqmaxgrp = max(nqgrp) # fix for #1986, when 'x' is 0-row table max(.) returns -Inf. + if (nqmaxgrp > 1L) { # got some non-equi join work to do + if ("_nqgrp_" %in% names(x)) stop("Column name '_nqgrp_' is reserved for non-equi joins.") + if (verbose) {last.started.at=proc.time();cat(" Recomputing forder with non-equi ids ... ");flush.console()} + set(nqx<-shallow(x), j="_nqgrp_", value=nqgrp) + xo = forderv(nqx, c(ncol(nqx), rightcols)) + if (verbose) {cat("done in",timetaken(last.started.at),"\n"); flush.console()} + } else nqgrp = integer(0L) + if (verbose) cat(" Found", nqmaxgrp, "non-equi group(s) ...\n") + } + if (verbose) {last.started.at=proc.time();cat("Starting bmerge ...");flush.console()} ans = .Call(Cbmerge, i, x, as.integer(leftcols), as.integer(rightcols), io, xo, roll, rollends, nomatch, mult, ops, nqgrp, nqmaxgrp) if (verbose) {cat("done in",timetaken(last.started.at),"\n"); flush.console()} @@ -102,6 +161,8 @@ bmerge <- function(i, x, leftcols, rightcols, xo, roll, rollends, nomatch, mult, if (haskey(origi)) setattr(i, 'sorted', key(origi)) } + ## add xo for further use + ans$xo <- xo return(ans) } diff --git a/R/data.table.R b/R/data.table.R index eee59f8af6..0f926cfd25 100644 --- a/R/data.table.R +++ b/R/data.table.R @@ -479,7 +479,7 @@ chmatch2 <- function(x, table, nomatch=NA_integer_) { i = as.data.table(i) } if (is.data.table(i)) { - if (!haskey(x) && missing(on) && is.null(xo)) { + if (!haskey(x) && missing(on)) { stop("When i is a data.table (or character vector), the columns to join by must be specified either using 'on=' argument (see ?data.table) or by keying x (i.e. sorted, and, marked as sorted, see ?setkey). Keyed joins might have further speed benefits on very large data due to x being sorted in RAM.") } if (!missing(on)) { @@ -527,65 +527,14 @@ chmatch2 <- function(x, table, nomatch=NA_integer_) { leftcols = chmatch(unname(on), names(i)) if (length(nacols <- which(is.na(leftcols)))) stop("Column(s) [", paste(unname(on)[nacols], collapse=","), "] not found in i") - # figure out the columns on which to compute groups on - non_equi = which.first(ops != 1L) # 1 is "==" operator - if (!is.na(non_equi)) { - # non-equi operators present.. investigate groups.. - if (verbose) cat("Non-equi join operators detected ... \n") - if (!missingroll) stop("roll is not implemented for non-equi joins yet.") - if (verbose) {last.started.at=proc.time();cat(" forder took ... ");flush.console()} - # TODO: could check/reuse secondary indices, but we need 'starts' attribute as well! - xo = forderv(x, rightcols, retGrp=TRUE) - if (verbose) {cat(timetaken(last.started.at),"\n"); flush.console()} - xg = attr(xo, 'starts') - resetcols = head(rightcols, non_equi-1L) - if (length(resetcols)) { - # TODO: can we get around having to reorder twice here? - # or at least reuse previous order? - if (verbose) {last.started.at=proc.time();cat(" Generating group lengths ... ");flush.console()} - resetlen = attr(forderv(x, resetcols, retGrp=TRUE), 'starts') - resetlen = .Call(Cuniqlengths, resetlen, nrow(x)) - if (verbose) {cat("done in",timetaken(last.started.at),"\n"); flush.console()} - } else resetlen = integer(0L) - if (verbose) {last.started.at=proc.time();cat(" Generating non-equi group ids ... ");flush.console()} - nqgrp = .Call(Cnestedid, x, rightcols[non_equi:length(rightcols)], xo, xg, resetlen, mult) - if (verbose) {cat("done in",timetaken(last.started.at),"\n"); flush.console()} - if (length(nqgrp)) nqmaxgrp = max(nqgrp) # fix for #1986, when 'x' is 0-row table max(.) returns -Inf. - if (nqmaxgrp > 1L) { # got some non-equi join work to do - if ("_nqgrp_" %in% names(x)) stop("Column name '_nqgrp_' is reserved for non-equi joins.") - if (verbose) {last.started.at=proc.time();cat(" Recomputing forder with non-equi ids ... ");flush.console()} - set(nqx<-shallow(x), j="_nqgrp_", value=nqgrp) - xo = forderv(nqx, c(ncol(nqx), rightcols)) - if (verbose) {cat("done in",timetaken(last.started.at),"\n"); flush.console()} - } else nqgrp = integer(0L) - if (verbose) cat(" Found", nqmaxgrp, "non-equi group(s) ...\n") - } - if (is.na(non_equi)) { - # equi join. use existing key (#1825) or existing secondary index (#1439) - if ( identical(head(key(x), length(on)), names(on)) ) { - xo = integer(0L) - if (verbose) cat("on= matches existing key, using key\n") - } else { - if (isTRUE(getOption("datatable.use.index"))) { - xo = getindex(x, names(on)) - if (verbose && !is.null(xo)) cat("on= matches existing index, using index\n") - } - if (is.null(xo)) { - if (verbose) {last.started.at=proc.time(); flush.console()} - xo = forderv(x, by = rightcols) - if (verbose) {cat("Calculated ad hoc index in",timetaken(last.started.at),"\n"); flush.console()} - # TODO: use setindex() instead, so it's cached for future reuse - } - } - } - } else if (is.null(xo)) { + } else { + ## missing on rightcols = chmatch(key(x),names(x)) # NAs here (i.e. invalid data.table) checked in bmerge() leftcols = if (haskey(i)) chmatch(head(key(i),length(rightcols)),names(i)) else seq_len(min(length(i),length(rightcols))) rightcols = head(rightcols,length(leftcols)) - xo = integer() ## signifies 1:.N ops = rep(1L, length(leftcols)) } # Implementation for not-join along with by=.EACHI, #604 @@ -599,7 +548,8 @@ chmatch2 <- function(x, table, nomatch=NA_integer_) { setattr(i, 'sorted', names(i)) # since 'x' has key set, this'll always be sorted } i = .shallow(i, retain.key = TRUE) - ans = bmerge(i, x, leftcols, rightcols, xo, roll, rollends, nomatch, mult, ops, nqgrp, nqmaxgrp, verbose=verbose) + ans = bmerge(i, x, leftcols, rightcols, roll, rollends, nomatch, mult, ops, verbose=verbose) + xo <- ans$xo ## to make it available for further use. # temp fix for issue spotted by Jan, test #1653.1. TODO: avoid this # 'setorder', as there's another 'setorder' in generating 'irows' below... if (length(ans$indices)) setorder(setDT(ans[1L:3L]), indices) diff --git a/R/foverlaps.R b/R/foverlaps.R index 1bcb408cde..1da0cb4851 100644 --- a/R/foverlaps.R +++ b/R/foverlaps.R @@ -113,7 +113,7 @@ foverlaps <- function(x, y, by.x = if (!is.null(key(x))) key(x) else key(y), by. matches <- function(ii, xx, del, ...) { cols = setdiff(names(xx), del) xx = .shallow(xx, cols, retain.key = TRUE) - ans = bmerge(xx, ii, seq_along(xx), seq_along(xx), integer(0), mult=mult, ops=rep(1L, length(xx)), integer(0), 1L, verbose=verbose, ...) + ans = bmerge(xx, ii, seq_along(xx), seq_along(xx), mult=mult, ops=rep(1L, length(xx)), verbose=verbose, ...) # vecseq part should never run here, but still... if (ans$allLen1) ans$starts else vecseq(ans$starts, ans$lens, NULL) } From d3b332d2082f6c238f0b3e1cd0affc8711079448 Mon Sep 17 00:00:00 2001 From: MarkusBonsch Date: Sat, 6 Oct 2018 23:44:48 +0200 Subject: [PATCH 15/31] Inserted the new type coercion logic with tests. --- R/bmerge.R | 248 +++++++++++++++++++++++++++++++++-------- inst/tests/tests.Rraw | 249 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 449 insertions(+), 48 deletions(-) diff --git a/R/bmerge.R b/R/bmerge.R index 02615eb724..93e6d881a6 100644 --- a/R/bmerge.R +++ b/R/bmerge.R @@ -13,81 +13,233 @@ bmerge <- function(i, x, leftcols, rightcols, roll, rollends, nomatch, mult, ops # careful to only plonk syntax (full column) on i from now on (otherwise i would change) # TO DO: enforce via .internal.shallow attribute and expose shallow() to users # This is why shallow() is very importantly internal only, currently. - + x = shallow(x) origi = shallow(i) # Needed for factor to factor/character joins, to recover the original levels # Otherwise, types of i join columns are anyways promoted to match x's # types (with warning or verbose) resetifactor = NULL # Keep track of any factor to factor/character join cols (only time we keep orig) + + ## function to determine type of columns. + ## Important not to use typeof() since integer and factor have same type (integer) + ## important to test for is.double instead of is.numeric because of bug with IDate (test 346) + getClass <- function(x){ + if(is.logical(x)) out <- "logical" + else if(is.integer(x)) out <- "integer" + else if(base::is.double(x)){ ## base::is.double(integer64) is TRUE, while bit64::is.double(integer64) is FALSE! + if(inherits(x, "integer64")) out <- "integer64" ## is.numeric returns TRUE on integer64 columns + ## distinguish integer values with storage mode double from real numeric + ## values that can't be coerced to integer without loss of precision + else if(isReallyReal(x)) out <- "reallyDouble" + else out <- "intAsDouble" + } + else if(is.character(x)) out <- "character" + else if(is.factor(x)) out <- "factor" + else out <- "other" + return(out) + } + + ## function or coercing a vector to a new type. Depending on the source and target type, + ## different coercion strategies are used. + coerceClass <- function(x, to){ + sourceType <- getClass(x) + ## reallyDouble and intAsDouble are the same here: + if(sourceType %chin% c("reallyDouble", "intAsDouble")) sourceType <- "double" + if(sourceType == to) return(x) ## nothing to be done + if(!to %chin% c("logical", "integer", "double", "character", "factor", "integer64")) + stop("Invalid 'to' argument: ", to) + if(sourceType == "other") + stop("type coercion not supported for this type: ", paste0(class(x), collapse = ",")) + if(sourceType %chin% c("logical", "integer", "double") & + to %chin% c("logical", "integer", "double")){ + ## for these classes, we can do mode coercion to retain other class attributes, e.g. IDate + ## identical types have been caught above + out <- x + mode(out) <- to + } + else { + ## we need as.'to'() conversion + converter <- match.fun(paste0("as.", to)) + out <- converter(x) + } + return(out) + } + + ## Establish a lookup table with coercion strategies for each pair of types. + ## Coercion strategies can be one of the following: + ##------------------|----------------------------------------------------- + ## y (yes): | no coercion necessary, types match + ##------------------|----------------------------------------------------- + ## e (error): | throw an error because of incompatible types + ##------------------|----------------------------------------------------- + ## ci (coercion i): | coerce the column in i to the type of the column in x + ##------------------|----------------------------------------------------- + ## ciw: | same as above, but with warning. + ##------------------|----------------------------------------------------- + ## cx (coercion x): | coerce the column in x to the type of the column in i + ##------------------|----------------------------------------------------- + ## cxw: | same as above, but with warning. + ##------------------|----------------------------------------------------- + ## rows mark the column type in i, columns the column type in x + ## possible types are: logical, integer, intAsDouble, reallyDouble, character, factor, integer64 + allTypes <- c("logical", "integer", "intAsDouble", "reallyDouble", "character", "factor", "integer64", "other") + ct <- matrix(data = NA_character_, nrow = length(allTypes), ncol = length(allTypes), + dimnames = list(allTypes, allTypes)) + + ct["logical", "logical"] = "y" + ct["integer", "logical"] = "e" + ct["intAsDouble", "logical"] = "e" + ct["reallyDouble", "logical"] = "e" + ct["character", "logical"] = "e" + ct["factor", "logical"] = "e" + ct["integer64", "logical"] = "e" + ct["other", "logical"] = "e" + + ct["logical", "integer"] = "ci" + ct["integer", "integer"] = "y" + ct["intAsDouble", "integer"] = "ci" + ct["reallyDouble", "integer"] = "cx" + ct["character", "integer"] = "e" + ct["factor", "integer"] = "e" + ct["integer64", "integer"] = "ci" + ct["other", "integer"] = "e" + + ct["logical", "intAsDouble"] = "ci" + ct["integer", "intAsDouble"] = "ci" + ct["intAsDouble", "intAsDouble"] = "y" + ct["reallyDouble", "intAsDouble"] = "y" + ct["character", "intAsDouble"] = "e" + ct["factor", "intAsDouble"] = "e" + ct["integer64", "intAsDouble"] = "ci" + ct["other", "intAsDouble"] = "e" + + ct["logical", "reallyDouble"] = "ci" + ct["integer", "reallyDouble"] = "ci" + ct["intAsDouble", "reallyDouble"] = "y" + ct["reallyDouble", "reallyDouble"] = "y" + ct["character", "reallyDouble"] = "e" + ct["factor", "reallyDouble"] = "e" + ct["integer64", "reallyDouble"] = "ci" + ct["other", "reallyDouble"] = "e" + + ct["logical", "character"] = "e" + ct["integer", "character"] = "e" + ct["intAsDouble", "character"] = "e" + ct["reallyDouble", "character"] = "e" + ct["character", "character"] = "y" + ct["factor", "character"] = "ci" + ct["integer64", "character"] = "e" + ct["other", "character"] = "e" + + ct["logical", "factor"] = "e" + ct["integer", "factor"] = "e" + ct["intAsDouble", "factor"] = "e" + ct["reallyDouble", "factor"] = "e" + ct["character", "factor"] = "ci" + ct["factor", "factor"] = "y" + ct["integer64", "factor"] = "e" + ct["other", "factor"] = "e" + + ct["logical", "integer64"] = "ci" + ct["integer", "integer64"] = "ci" + ct["intAsDouble", "integer64"] = "ci" + ct["reallyDouble", "integer64"] = "cx" + ct["character", "integer64"] = "e" + ct["factor", "integer64"] = "e" + ct["integer64", "integer64"] = "y" + ct["other", "integer64"] = "e" + + ct["logical", "other"] = "e" + ct["integer", "other"] = "e" + ct["intAsDouble", "other"] = "e" + ct["reallyDouble", "other"] = "e" + ct["character", "other"] = "e" + ct["factor", "other"] = "e" + ct["integer64", "other"] = "e" + ct["other", "other"] = "e" + + if(anyNA(ct)) stop("Type coercion table ct incomplete.") + for (a in seq_along(leftcols)) { - # This loop is simply to support joining factor columns + # This loop does the following: + # - check that join columns have compatible types + # - do type coercions if necessary + # - special support for joining factor columns # Note that if i is keyed, if this coerces, i's key gets dropped and the key may not be retained lc = leftcols[a] # i # TO DO: rename left and right to i and x rc = rightcols[a] # x icnam = names(i)[lc] xcnam = names(x)[rc] - if (is.character(x[[rc]])) { - if (is.character(i[[lc]])) next - if (!is.factor(i[[lc]])) - stop("x.'",xcnam,"' is a character column being joined to i.'",icnam,"' which is type '",typeof(i[[lc]]),"'. Character columns must join to factor or character columns.") - if (verbose) cat("Coercing factor column i.'",icnam,"' to character to match type of x.'",xcnam,"'.\n",sep="") - set(i,j=lc,value=as.character(i[[lc]])) - # no longer copies all of i, thanks to shallow() and :=/set - next - } - if (is.factor(x[[rc]])) { - if (is.character(i[[lc]])) { - if (verbose) cat("Coercing character column i.'",icnam,"' to factor to match type of x.'",xcnam,"'. If possible please change x.'",xcnam,"' to character. Character columns are now preferred in joins.\n",sep="") - set(origi, j=lc, value=factor(origi[[lc]])) # note the use of 'origi' here - see #499 and #945 + myXclass = getClass(x[[rc]]) + myIclass = getClass(i[[lc]]) + myXtype = myXclass + if(myXtype %chin% c("intAsDouble", "reallyDouble")) myXtype = "double" + if(myXtype == "other") myXtype = paste0(class(x[[rc]]), collapse = ",") + myItype = myIclass + if(myItype %chin% c("intAsDouble", "reallyDouble")) myItype = "double" + if(myItype == "other") myItype = paste0(class(i[[lc]]), collapse = ",") + coercionStrategy <- ct[myIclass, myXclass] + + if(coercionStrategy == "y"){ + ## nothing to be done, but no 'next' since the factor related stuff below needs to be executed + } + else if(coercionStrategy == "e"){ + stop(sprintf("Incompatible types: %s (%s) and %s (%s)", + paste0("x.", xcnam), myXtype, paste0("i.", icnam), myItype)) + } + else if(coercionStrategy %chin% c("ci", "ciw")){ + ## coerce i[[lc]] to same class as x[[rc]] + if (verbose) {cat(sprintf("Coercing %s column %s to %s to match type of %s.", + myItype, paste0("i.'", icnam, "'"), myXtype, paste0("x.'", xcnam, "'"))); flush.console()} + if(coercionStrategy == "ciw"){ + warning(sprintf("Coercing %s column %s to %s to match type of %s.", + myItype, paste0("i.'", icnam, "'"), myXtype, paste0("x.'", xcnam, "'"))) + } + if(myXtype == "factor"){ + ## special treatment due to factor levels, see #499 and #945 + newval = coerceClass(origi[[lc]], to = myXtype) ## will do mode() coercion if possible to retain attributes + set(origi, j=lc, value=newval) # TO DO: we need a way to avoid copying 'value' for internal purposes # that would allow setting: set(i, j=lc, value=origi[[lc]]) without resulting in a copy. # until then using 'val <- origi[[lc]]' below to avoid another copy. } else { - if (!is.factor(i[[lc]])) - stop("x.'",xcnam,"' is a factor column being joined to i.'",icnam,"' which is type '",typeof(i[[lc]]),"'. Factor columns must join to factor or character columns.") + newval = coerceClass(i[[lc]], to = myXtype) ## will do mode() coercion if possible to retain attributes + set(i, j=lc, value=newval) } + myItype = myXtype + } + else if(coercionStrategy %chin% c("cx", "cxw")){ + ## coerce x[[rc]] to same class as i[[lc]] + if (verbose) {cat(sprintf("Coercing %s column %s to %s to match type of %s.", + myXtype, paste0("x.'", xcnam, "'"), myItype, paste0("i.'", icnam, "'"))); flush.console()} + if(coercionStrategy == "cxw"){ + warning(sprintf("Coercing %s column %s to %s to match type of %s.", + myXtype, paste0("x.'", xcnam, "'"), myItype, paste0("i.'", icnam, "'"))) + } + newval = coerceClass(x[[rc]], to = myItype) ## will do mode() coercion if possible to retain attributes + set(x, j=rc, value=newval) + myXtype = myItype + } + else stop("Internal error in bmerge: unknown type coercion strategy.") + + ## now take care about factor columns. + if(myXtype == "factor"){ + if(myItype != "factor") stop("Internal error in bmerge: at this point, myItype should be factor.") + # levels of factors have to be treated properly when coercing # Retain original levels of i's factor columns in factor to factor joins (important when NAs, # see tests 687 and 688). # Moved it outside of 'else' to fix #499 and #945. resetifactor = c(resetifactor,lc) - if (roll!=0.0 && a==length(leftcols)) stop("Attempting roll join on factor column x.",names(x)[rc],". Only integer, double or character colums may be roll joined.") # because the chmatch on next line returns NA 0 for missing chars in x (rather than some integer greater than existing). Note roll!=0.0 is ok in this 0 special floating point case e.g. as.double(FALSE)==0.0 is ok, and "nearest"!=0.0 is also true. + if (roll!=0.0 && a==length(leftcols)) stop("Attempting roll join on factor column x.",xcnam,". Only integer, double or character colums may be roll joined.") # because the chmatch on next line returns NA 0 for missing chars in x (rather than some integer greater than existing). Note roll!=0.0 is ok in this 0 special floating point case e.g. as.double(FALSE)==0.0 is ok, and "nearest"!=0.0 is also true. val = origi[[lc]] # note: using 'origi' here because set(..., value = .) always copies '.', we need a way to avoid it in internal cases. lx = levels(x[[rc]]) li = levels(val) newfactor = chmatch(li, lx, nomatch=0L)[val] # fix for #945, a hacky solution for now. levels(newfactor) = lx class(newfactor) = "factor" - set(i, j=lc, value=newfactor) - # COMMENT BELOW IS NOT TRUE ANYMORE... had to change nomatch to 0L to take care of case where 'NA' occurs as a separate value... See #945. - # NAs can be produced by this level match, in which case the C code (it knows integer value NA) - # can skip over the lookup. It's therefore important we pass NA rather than 0 to the C code. - } - # Fix for #1108. - # TODO: clean this code up... - # NOTE: bit64::is.double(int64) returns FALSE.. but base::is.double returns TRUE - is.int64 <- function(x) inherits(x, 'integer64') - is.strictlydouble <- function(x) !is.int64(x) && is.double(x) - if (is.integer(x[[rc]]) && (base::is.double(i[[lc]]) || is.logical(i[[lc]]))) { - # TO DO: add warning if reallyreal about loss of precision - # or could coerce in binary search on the fly, at cost - if (verbose) cat("Coercing ", typeof(i[[lc]])," column i.'",icnam,"' to integer to match type of x.'",xcnam,"'. Please avoid coercion for efficiency.\n",sep="") - newval = i[[lc]] - if (is.int64(newval)) - newval = as.integer(newval) - else mode(newval) = "integer" # retains column attributes (such as IDateTime class) - set(i, j=lc, value=newval) - } else if (is.int64(x[[rc]]) && (is.integer(i[[lc]]) || is.logical(i[[lc]]) || is.strictlydouble(i[[lc]]) )) { - if (verbose) cat("Coercing ",typeof(i[[lc]])," column i.'",icnam,"' to double to match type of x.'",xcnam,"'. Please avoid coercion for efficiency.\n",sep="") - newval = bit64::as.integer64(i[[lc]]) - set(i, j=lc, value=newval) - } else if (is.strictlydouble(x[[rc]]) && (is.integer(i[[lc]]) || is.logical(i[[lc]]) || is.int64(i[[lc]]) )) { - if (verbose) cat("Coercing ",typeof(i[[lc]])," column i.'",icnam,"' to double to match type of x.'",xcnam,"'. Please avoid coercion for efficiency.\n",sep="") - newval = i[[lc]] - if (is.int64(newval)) - newval = as.numeric(newval) - else mode(newval) = "double" - set(i, j=lc, value=newval) + set(i, j=lc, value=newfactor) } } + ## after all modifications of i, check if i has a proper key on all leftcols io <- identical(leftcols, head(chmatch(key(i), names(i)), length(leftcols))) diff --git a/inst/tests/tests.Rraw b/inst/tests/tests.Rraw index 5156af431a..0953924846 100644 --- a/inst/tests/tests.Rraw +++ b/inst/tests/tests.Rraw @@ -12278,6 +12278,255 @@ DT = data.table(A=1:5) test(1947.1, DT[A<0, c('A','B'):=.(NULL, A)], error="When deleting columns, i should not be provided") test(1947.2, DT, data.table(A=1:5)) +## test type coercion in joins (#2592) +dt1 <- data.table(intCol = 1L:10L, + doubleCol = as.numeric(1:10), ## only 1:10 will be integer + realDoubleCol = seq(0.5, 5, by = 0.5), + boolCol = c(rep(FALSE, 9), TRUE), + charCol = letters[1L:10L], + factCol = factor(letters[1L:10L])) +dt2 <- data.table(intCol = 1L:5L, + doubleCol = as.numeric(1:5), ## only 1:5 will be integer + realDoubleCol = seq(0.5, 2.5, by = 0.5), + boolCol = TRUE, + charCol = letters[1L:5L], + factCol = factor(letters[1L:5L]), + complexCol = as.complex(1:5)) +if ("package:bit64" %in% search()) { + dt1[, int64Col := as.integer64(c(1:9, 3e10))] + dt2[, int64Col := as.integer64(c(1:4, 3e9))] +} +## no coercion when types match +test(1950.1, + nrow(dt1[dt2, on = "boolCol==boolCol"]), nrow(dt2), + warning = NULL) +test(1950.2, + nrow(dt1[dt2, on = "intCol==intCol"]), nrow(dt2), + warning = NULL) +test(1950.3, + nrow(dt1[dt2, on = "doubleCol==doubleCol"]), nrow(dt2), + warning = NULL) +test(1950.4, + nrow(dt1[dt2, on = "realDoubleCol==realDoubleCol"]), nrow(dt2), + warning = NULL) +test(1950.5, + nrow(dt1[dt2, on = "charCol==charCol"]), nrow(dt2), + warning = NULL) +test(1950.6, + nrow(dt1[dt2, on = "factCol==factCol"]), nrow(dt2), + warning = NULL) +if ("package:bit64" %in% search()) { + test(1950.7, + nrow(dt1[dt2, on = "int64Col==int64Col"]), nrow(dt2), + warning = NULL) +} +## error on incompatible types +test(1950.8, + dt1[dt2, on = "boolCol==intCol"], + error = "Incompatible types: x.boolCol (logical) and i.intCol (integer)") +test(1950.9, + dt1[dt2, on = "boolCol==doubleCol"], + error = "Incompatible types: x.boolCol (logical) and i.doubleCol (double)") +test(1950.11, + dt1[dt2, on = "boolCol==realDoubleCol"], + error = "Incompatible types: x.boolCol (logical) and i.realDoubleCol (double)") +test(1950.12, + dt1[dt2, on = "boolCol==charCol"], + error = "Incompatible types: x.boolCol (logical) and i.charCol (character)") +test(1950.13, + dt1[dt2, on = "boolCol==factCol"], + error = "Incompatible types: x.boolCol (logical) and i.factCol (factor)") +test(1950.14, + dt1[dt2, on = "intCol==charCol"], + error = "Incompatible types: x.intCol (integer) and i.charCol (character)") +test(1950.15, + dt1[dt2, on = "intCol==factCol"], + error = "Incompatible types: x.intCol (integer) and i.factCol (factor)") +test(1950.16, + dt1[dt2, on = "doubleCol==charCol"], + error = "Incompatible types: x.doubleCol (double) and i.charCol (character)") +test(1950.17, + dt1[dt2, on = "realDoubleCol==charCol"], + error = "Incompatible types: x.realDoubleCol (double) and i.charCol (character)") +test(1950.18, + dt1[dt2, on = "doubleCol==factCol"], + error = "Incompatible types: x.doubleCol (double) and i.factCol (factor)") +test(1950.19, + dt1[dt2, on = "realDoubleCol==factCol"], + error = "Incompatible types: x.realDoubleCol (double) and i.factCol (factor)") +test(1950.21, + dt1[dt2, on = "charCol==boolCol"], + error = "Incompatible types: x.charCol (character) and i.boolCol (logical)") +test(1950.22, + dt1[dt2, on = "charCol==intCol"], + error = "Incompatible types: x.charCol (character) and i.intCol (integer)") +test(1950.23, + dt1[dt2, on = "charCol==doubleCol"], + error = "Incompatible types: x.charCol (character) and i.doubleCol (double)") +test(1950.24, + dt1[dt2, on = "charCol==realDoubleCol"], + error = "Incompatible types: x.charCol (character) and i.realDoubleCol (double)") +test(1950.25, + dt1[dt2, on = "factCol==boolCol"], + error = "Incompatible types: x.factCol (factor) and i.boolCol (logical)") +test(1950.26, + dt1[dt2, on = "factCol==intCol"], + error = "Incompatible types: x.factCol (factor) and i.intCol (integer)") +test(1950.27, + dt1[dt2, on = "factCol==doubleCol"], + error = "Incompatible types: x.factCol (factor) and i.doubleCol (double)") +test(1950.28, + dt1[dt2, on = "factCol==realDoubleCol"], + error = "Incompatible types: x.factCol (factor) and i.realDoubleCol (double)") +if ("package:bit64" %in% search()) { + test(1950.29, + dt1[dt2, on = "boolCol==int64Col"], + error = "Incompatible types: x.boolCol (logical) and i.int64Col (integer64)") + test(1950.31, + dt1[dt2, on = "charCol==int64Col"], + error = "Incompatible types: x.charCol (character) and i.int64Col (integer64)") + test(1950.32, + dt1[dt2, on = "factCol==int64Col"], + error = "Incompatible types: x.factCol (factor) and i.int64Col (integer64)") + test(1950.33, + dt1[dt2, on = "int64Col==charCol"], + error = "Incompatible types: x.int64Col (integer64) and i.charCol (character)") + test(1950.34, + dt1[dt2, on = "int64Col==factCol"], + error = "Incompatible types: x.int64Col (integer64) and i.factCol (factor)") +} +## correct behaviour on other types. +## 4 checks: +## - correct warning +## - correct type of the coerced columns in i and x +## - correct number of rows in the join +cols <- c("boolCol", "intCol", "doubleCol", "realDoubleCol", "charCol", "factCol") +if ("package:bit64" %in% search()) { + cols <- c(cols, "int64Col") +} +cols <- c(paste0("x.", cols), paste0("i.", cols)) ## make sure that all columns from x and i are in the result +test(1950.35, + result <- dt1[dt2, cols, on = "intCol==boolCol", with = FALSE, nomatch = 0L, verbose = TRUE], + dt1[dt2, cols, on = "intCol==boolCol", with = FALSE, nomatch = 0L], + output = "Coercing logical column i.'boolCol' to integer to match type of x.'intCol'.") +test(1950.36, class(result$i.boolCol), "integer") +test(1950.37, class(result$x.intCol), "integer") +test(1950.38, nrow(result), 5L) +test(1950.39, + result <- dt1[dt2, cols, on = "intCol==doubleCol", with = FALSE, nomatch = 0L, verbose = TRUE], + dt1[dt2, cols, on = "intCol==doubleCol", with = FALSE, nomatch = 0L], + output = "Coercing double column i.'doubleCol' to integer to match type of x.'intCol'.") +test(1950.41, class(result$i.doubleCol), "integer") +test(1950.42, class(result$x.intCol), "integer") +test(1950.43, nrow(result), 5L) +test(1950.44, + result <- dt1[dt2, cols, on = "intCol==realDoubleCol", with = FALSE, nomatch = 0L, verbose = TRUE], + dt1[dt2, cols, on = "intCol==realDoubleCol", with = FALSE, nomatch = 0L], + output = "Coercing integer column x.'intCol' to double to match type of i.'realDoubleCol'.") +test(1950.45, class(result$i.realDoubleCol), "numeric") +test(1950.46, class(result$x.intCol), "integer") ## coercion of x columns is only for the join. The original type is returned. +test(1950.47, nrow(result), 2L) +test(1950.48, + result <- dt1[dt2, cols, on = "doubleCol==boolCol", with = FALSE, nomatch = 0L, verbose = TRUE], + dt1[dt2, cols, on = "doubleCol==boolCol", with = FALSE, nomatch = 0L], + output = "Coercing logical column i.'boolCol' to double to match type of x.'doubleCol'.") +test(1950.49, class(result$i.boolCol), "numeric") +test(1950.51, class(result$x.doubleCol), "numeric") +test(1950.52, nrow(result), 5L) +test(1950.53, + result <- dt1[dt2, cols, on = "realDoubleCol==boolCol", with = FALSE, nomatch = 0L, verbose = TRUE], + dt1[dt2, cols, on = "realDoubleCol==boolCol", with = FALSE, nomatch = 0L], + output = "Coercing logical column i.'boolCol' to double to match type of x.'realDoubleCol'.") +test(1950.54, class(result$i.boolCol), "numeric") +test(1950.55, class(result$x.doubleCol), "numeric") +test(1950.56, nrow(result), 5L) +test(1950.57, + result <- dt1[dt2, cols, on = "doubleCol==intCol", with = FALSE, nomatch = 0L, verbose = TRUE], + dt1[dt2, cols, on = "doubleCol==intCol", with = FALSE, nomatch = 0L], + output = "Coercing integer column i.'intCol' to double to match type of x.'doubleCol'.") +test(1950.58, class(result$i.intCol), "numeric") +test(1950.59, class(result$x.doubleCol), "numeric") +test(1950.61, nrow(result), 5L) +test(1950.62, + result <- dt1[dt2, cols, on = "realDoubleCol==intCol", with = FALSE, nomatch = 0L, verbose = TRUE], + dt1[dt2, cols, on = "realDoubleCol==intCol", with = FALSE, nomatch = 0L], + output = "Coercing integer column i.'intCol' to double to match type of x.'realDoubleCol'.") +test(1950.63, class(result$i.intCol), "numeric") +test(1950.64, class(result$x.realDoubleCol), "numeric") +test(1950.65, nrow(result), 5L) +test(1950.66, + result <- dt1[dt2, cols, on = "charCol==factCol", with = FALSE, nomatch = 0L, verbose = TRUE], + dt1[dt2, cols, on = "charCol==factCol", with = FALSE, nomatch = 0L], + output = "Coercing factor column i.'factCol' to character to match type of x.'charCol'.") +test(1950.67, class(result$i.factCol), "character") +test(1950.68, class(result$x.charCol), "character") +test(1950.69, nrow(result), 5L) +test(1950.71, + result <- dt1[dt2, cols, on = "factCol==charCol", with = FALSE, nomatch = 0L, verbose = TRUE], + dt1[dt2, cols, on = "factCol==charCol", with = FALSE, nomatch = 0L], + output = "Coercing character column i.'charCol' to factor to match type of x.'factCol'.") +test(1950.72, class(result$i.charCol), "factor") +test(1950.73, class(result$x.factCol), "factor") +test(1950.74, nrow(result), 5L) +if ("package:bit64" %in% search()) { + test(1950.75, + result <- dt1[dt2, cols, on = "intCol==int64Col", with = FALSE, nomatch = 0L, verbose = TRUE], + suppressWarnings(dt1[dt2, cols, on = "intCol==int64Col", with = FALSE, nomatch = 0L]), + output = "Coercing integer64 column i.'int64Col' to integer to match type of x.'intCol'.", + warning = "NAs produced by integer overflow") + test(1950.76, class(result$i.int64Col), "integer") + test(1950.77, class(result$x.intCol), "integer") + test(1950.78, nrow(result), 4L) + test(1950.79, + result <- dt1[dt2, cols, on = "doubleCol==int64Col", with = FALSE, nomatch = 0L, verbose = TRUE], + dt1[dt2, cols, on = "doubleCol==int64Col", with = FALSE, nomatch = 0L], + output = "Coercing integer64 column i.'int64Col' to double to match type of x.'doubleCol'.") + test(1950.81, class(result$i.int64Col), "numeric") + test(1950.82, class(result$x.doubleCol), "numeric") + test(1950.83, nrow(result), 4L) + test(1950.84, + result <- dt1[dt2, cols, on = "realDoubleCol==int64Col", with = FALSE, nomatch = 0L, verbose = TRUE], + dt1[dt2, cols, on = "realDoubleCol==int64Col", with = FALSE, nomatch = 0L], + output = "Coercing integer64 column i.'int64Col' to double to match type of x.'realDoubleCol'.") + test(1950.85, class(result$i.int64Col), "numeric") + test(1950.86, class(result$x.realDoubleCol), "numeric") + test(1950.87, nrow(result), 4L) + test(1950.88, + result <- dt1[dt2, cols, on = "int64Col==boolCol", with = FALSE, nomatch = 0L, verbose = TRUE], + dt1[dt2, cols, on = "int64Col==boolCol", with = FALSE, nomatch = 0L], + output = "Coercing logical column i.'boolCol' to integer64 to match type of x.'int64Col'.") + test(1950.89, class(result$i.boolCol), "integer64") + test(1950.91, class(result$x.int64Col), "integer64") + test(1950.92, nrow(result), 5L) + test(1950.93, + result <- dt1[dt2, cols, on = "int64Col==intCol", with = FALSE, nomatch = 0L, verbose = TRUE], + dt1[dt2, cols, on = "int64Col==intCol", with = FALSE, nomatch = 0L], + output = "Coercing integer column i.'intCol' to integer64 to match type of x.'int64Col'.") + test(1950.94, class(result$i.intCol), "integer64") + test(1950.95, class(result$x.int64Col), "integer64") + test(1950.96, nrow(result), 5L) + test(1950.97, + result <- dt1[dt2, cols, on = "int64Col==doubleCol", with = FALSE, nomatch = 0L, verbose = TRUE], + dt1[dt2, cols, on = "int64Col==doubleCol", with = FALSE, nomatch = 0L], + output = "Coercing double column i.'doubleCol' to integer64 to match type of x.'int64Col'.") + test(1950.98, class(result$i.doubleCol), "integer64") + test(1950.99, class(result$x.int64Col), "integer64") + test(1950.101, nrow(result), 5L) + test(1950.102, + result <- dt1[dt2, cols, on = "int64Col==realDoubleCol", with = FALSE, nomatch = 0L, verbose = TRUE], + dt1[dt2, cols, on = "int64Col==realDoubleCol", with = FALSE, nomatch = 0L], + output = "Coercing integer64 column x.'int64Col' to double to match type of i.'realDoubleCol'.") + test(1950.103, class(result$i.realDoubleCol), "numeric") + test(1950.104, class(result$x.int64Col), "integer64") ## coercion of x columns is only for the join. The original type is returned. + test(1950.105, nrow(result), 2L) +} +## correct behaviour if non-standard types are involved: +## can only be tested for non-standard column in i because non-standard in x throws error before bmerge in forderv +test(1950.106, dt1[dt2, on = "intCol==complexCol"], + error = "Incompatible types: x.intCol (integer) and i.complexCol (complex)") + + + ################################### From 0d0055e834f5addb08db05a95229153eed2e8ea7 Mon Sep 17 00:00:00 2001 From: MarkusBonsch Date: Sun, 7 Oct 2018 00:11:25 +0200 Subject: [PATCH 16/31] Purged before inserting the new code from branch joinFix. --- R/bmerge.R | 263 - inst/tests/tests.Rraw | 11952 ---------------------------------------- 2 files changed, 12215 deletions(-) diff --git a/R/bmerge.R b/R/bmerge.R index aef3734b85..e69de29bb2 100644 --- a/R/bmerge.R +++ b/R/bmerge.R @@ -1,263 +0,0 @@ - -bmerge <- function(i, x, leftcols, rightcols, io, xo, roll, rollends, nomatch, mult, ops, nqgrp, nqmaxgrp, verbose) -{ - # TO DO: rename leftcols to icols, rightcols to xcols - # NB: io is currently just TRUE or FALSE for whether i is keyed - # TO DO: io and xo could be moved inside Cbmerge - # bmerge moved to be separate function now that list() doesn't copy in R - # types of i join columns are promoted to match x's types (with warning or verbose) - - # Important that i is already passed in as a shallow copy, due to these coercions for factors. - # i.e. bmerge(i<-shallow(i),...) - # The caller ([.data.table) then uses the coerced columns to build the output - # careful to only plonk syntax (full column) on i from now on (otherwise i would change) - # TO DO: enforce via .internal.shallow attribute and expose shallow() to users - # This is why shallow() is very importantly internal only, currently. - - # In contrast, x is not passed as shallow, but is shallow copied inside bmerge. - # This allows for coercion of column types for the join, - # but the calling function only sees the original column types of x - # careful to only plonk syntax (full column) on x from now on (otherwise x would change) - - x = shallow(x) - origi = shallow(i) # Needed for factor to factor/character joins, to recover the original levels - # Otherwise, types of i join columns are anyways promoted to match x's - # types (with warning or verbose) - resetifactor = NULL # Keep track of any factor to factor/character join cols (only time we keep orig) - - ## function to determine type of columns. - ## Important not to use typeof() since integer and factor have same type (integer) - ## important to test for is.double instead of is.numeric because of bug with IDate (test 346) - getClass <- function(x){ - if(is.logical(x)) out <- "logical" - else if(is.integer(x)) out <- "integer" - else if(base::is.double(x)){ ## base::is.double(integer64) is TRUE, while bit64::is.double(integer64) is FALSE! - if(inherits(x, "integer64")) out <- "integer64" ## is.numeric returns TRUE on integer64 columns - ## distinguish integer values with storage mode double from real numeric - ## values that can't be coerced to integer without loss of precision - else if(isReallyReal(x)) out <- "reallyDouble" - else out <- "intAsDouble" - } - else if(is.character(x)) out <- "character" - else if(is.factor(x)) out <- "factor" - else out <- "other" - return(out) - } - - ## function or coercing a vector to a new type. Depending on the source and target type, - ## different coercion strategies are used. - coerceClass <- function(x, to){ - sourceType <- getClass(x) - ## reallyDouble and intAsDouble are the same here: - if(sourceType %chin% c("reallyDouble", "intAsDouble")) sourceType <- "double" - if(sourceType == to) return(x) ## nothing to be done - if(!to %chin% c("logical", "integer", "double", "character", "factor", "integer64")) - stop("Invalid 'to' argument: ", to) - if(sourceType == "other") - stop("type coercion not supported for this type: ", paste0(class(x), collapse = ",")) - if(sourceType %chin% c("logical", "integer", "double") & - to %chin% c("logical", "integer", "double")){ - ## for these classes, we can do mode coercion to retain other class attributes, e.g. IDate - ## identical types have been caught above - out <- x - mode(out) <- to - } - else { - ## we need as.'to'() conversion - converter <- match.fun(paste0("as.", to)) - out <- converter(x) - } - return(out) - } - - ## Establish a lookup table with coercion strategies for each pair of types. - ## Coercion strategies can be one of the following: - ##------------------|----------------------------------------------------- - ## y (yes): | no coercion necessary, types match - ##------------------|----------------------------------------------------- - ## e (error): | throw an error because of incompatible types - ##------------------|----------------------------------------------------- - ## ci (coercion i): | coerce the column in i to the type of the column in x - ##------------------|----------------------------------------------------- - ## ciw: | same as above, but with warning. - ##------------------|----------------------------------------------------- - ## cx (coercion x): | coerce the column in x to the type of the column in i - ##------------------|----------------------------------------------------- - ## cxw: | same as above, but with warning. - ##------------------|----------------------------------------------------- - ## rows mark the column type in i, columns the column type in x - ## possible types are: logical, integer, intAsDouble, reallyDouble, character, factor, integer64 - allTypes <- c("logical", "integer", "intAsDouble", "reallyDouble", "character", "factor", "integer64", "other") - ct <- matrix(data = NA_character_, nrow = length(allTypes), ncol = length(allTypes), - dimnames = list(allTypes, allTypes)) - - ct["logical", "logical"] = "y" - ct["integer", "logical"] = "e" - ct["intAsDouble", "logical"] = "e" - ct["reallyDouble", "logical"] = "e" - ct["character", "logical"] = "e" - ct["factor", "logical"] = "e" - ct["integer64", "logical"] = "e" - ct["other", "logical"] = "e" - - ct["logical", "integer"] = "ci" - ct["integer", "integer"] = "y" - ct["intAsDouble", "integer"] = "ci" - ct["reallyDouble", "integer"] = "cx" - ct["character", "integer"] = "e" - ct["factor", "integer"] = "e" - ct["integer64", "integer"] = "ci" - ct["other", "integer"] = "e" - - ct["logical", "intAsDouble"] = "ci" - ct["integer", "intAsDouble"] = "ci" - ct["intAsDouble", "intAsDouble"] = "y" - ct["reallyDouble", "intAsDouble"] = "y" - ct["character", "intAsDouble"] = "e" - ct["factor", "intAsDouble"] = "e" - ct["integer64", "intAsDouble"] = "ci" - ct["other", "intAsDouble"] = "e" - - ct["logical", "reallyDouble"] = "ci" - ct["integer", "reallyDouble"] = "ci" - ct["intAsDouble", "reallyDouble"] = "y" - ct["reallyDouble", "reallyDouble"] = "y" - ct["character", "reallyDouble"] = "e" - ct["factor", "reallyDouble"] = "e" - ct["integer64", "reallyDouble"] = "ci" - ct["other", "reallyDouble"] = "e" - - ct["logical", "character"] = "e" - ct["integer", "character"] = "e" - ct["intAsDouble", "character"] = "e" - ct["reallyDouble", "character"] = "e" - ct["character", "character"] = "y" - ct["factor", "character"] = "ci" - ct["integer64", "character"] = "e" - ct["other", "character"] = "e" - - ct["logical", "factor"] = "e" - ct["integer", "factor"] = "e" - ct["intAsDouble", "factor"] = "e" - ct["reallyDouble", "factor"] = "e" - ct["character", "factor"] = "ci" - ct["factor", "factor"] = "y" - ct["integer64", "factor"] = "e" - ct["other", "factor"] = "e" - - ct["logical", "integer64"] = "ci" - ct["integer", "integer64"] = "ci" - ct["intAsDouble", "integer64"] = "ci" - ct["reallyDouble", "integer64"] = "cx" - ct["character", "integer64"] = "e" - ct["factor", "integer64"] = "e" - ct["integer64", "integer64"] = "y" - ct["other", "integer64"] = "e" - - ct["logical", "other"] = "e" - ct["integer", "other"] = "e" - ct["intAsDouble", "other"] = "e" - ct["reallyDouble", "other"] = "e" - ct["character", "other"] = "e" - ct["factor", "other"] = "e" - ct["integer64", "other"] = "e" - ct["other", "other"] = "e" - - if(anyNA(ct)) stop("Type coercion table ct incomplete.") - - for (a in seq_along(leftcols)) { - # This loop does the following: - # - check that join columns have compatible types - # - do type coercions if necessary - # - special support for joining factor columns - # Note that if i is keyed, if this coerces, i's key gets dropped and the key may not be retained - lc = leftcols[a] # i # TO DO: rename left and right to i and x - rc = rightcols[a] # x - icnam = names(i)[lc] - xcnam = names(x)[rc] - myXclass = getClass(x[[rc]]) - myIclass = getClass(i[[lc]]) - myXtype = myXclass - if(myXtype %chin% c("intAsDouble", "reallyDouble")) myXtype = "double" - if(myXtype == "other") myXtype = paste0(class(x[[rc]]), collapse = ",") - myItype = myIclass - if(myItype %chin% c("intAsDouble", "reallyDouble")) myItype = "double" - if(myItype == "other") myItype = paste0(class(i[[lc]]), collapse = ",") - coercionStrategy <- ct[myIclass, myXclass] - - if(coercionStrategy == "y"){ - ## nothing to be done, but no 'next' since the factor related stuff below needs to be executed - } - else if(coercionStrategy == "e"){ - stop(sprintf("Incompatible types: %s (%s) and %s (%s)", - paste0("x.", xcnam), myXtype, paste0("i.", icnam), myItype)) - } - else if(coercionStrategy %chin% c("ci", "ciw")){ - ## coerce i[[lc]] to same class as x[[rc]] - if (verbose) {cat(sprintf("Coercing %s column %s to %s to match type of %s.", - myItype, paste0("i.'", icnam, "'"), myXtype, paste0("x.'", xcnam, "'"))); flush.console()} - if(coercionStrategy == "ciw"){ - warning(sprintf("Coercing %s column %s to %s to match type of %s.", - myItype, paste0("i.'", icnam, "'"), myXtype, paste0("x.'", xcnam, "'"))) - } - if(myXtype == "factor"){ - ## special treatment due to factor levels, see #499 and #945 - newval = coerceClass(origi[[lc]], to = myXtype) ## will do mode() coercion if possible to retain attributes - set(origi, j=lc, value=newval) - # TO DO: we need a way to avoid copying 'value' for internal purposes - # that would allow setting: set(i, j=lc, value=origi[[lc]]) without resulting in a copy. - # until then using 'val <- origi[[lc]]' below to avoid another copy. - } else { - newval = coerceClass(i[[lc]], to = myXtype) ## will do mode() coercion if possible to retain attributes - set(i, j=lc, value=newval) - } - myItype = myXtype - } - else if(coercionStrategy %chin% c("cx", "cxw")){ - ## coerce x[[rc]] to same class as i[[lc]] - if (verbose) {cat(sprintf("Coercing %s column %s to %s to match type of %s.", - myXtype, paste0("x.'", xcnam, "'"), myItype, paste0("i.'", icnam, "'"))); flush.console()} - if(coercionStrategy == "cxw"){ - warning(sprintf("Coercing %s column %s to %s to match type of %s.", - myXtype, paste0("x.'", xcnam, "'"), myItype, paste0("i.'", icnam, "'"))) - } - newval = coerceClass(x[[rc]], to = myItype) ## will do mode() coercion if possible to retain attributes - set(x, j=rc, value=newval) - myXtype = myItype - } - else stop("Internal error in bmerge: unknown type coercion strategy.") - - ## now take care about factor columns. - if(myXtype == "factor"){ - if(myItype != "factor") stop("Internal error in bmerge: at this point, myItype should be factor.") - # levels of factors have to be treated properly when coercing - # Retain original levels of i's factor columns in factor to factor joins (important when NAs, - # see tests 687 and 688). - # Moved it outside of 'else' to fix #499 and #945. - resetifactor = c(resetifactor,lc) - if (roll!=0.0 && a==length(leftcols)) stop("Attempting roll join on factor column x.",xcnam,". Only integer, double or character colums may be roll joined.") # because the chmatch on next line returns NA 0 for missing chars in x (rather than some integer greater than existing). Note roll!=0.0 is ok in this 0 special floating point case e.g. as.double(FALSE)==0.0 is ok, and "nearest"!=0.0 is also true. - val = origi[[lc]] # note: using 'origi' here because set(..., value = .) always copies '.', we need a way to avoid it in internal cases. - lx = levels(x[[rc]]) - li = levels(val) - newfactor = chmatch(li, lx, nomatch=0L)[val] # fix for #945, a hacky solution for now. - levels(newfactor) = lx - class(newfactor) = "factor" - set(i, j=lc, value=newfactor) - } - } - if (verbose) {last.started.at=proc.time();cat("Starting bmerge ...");flush.console()} - ans = .Call(Cbmerge, i, x, as.integer(leftcols), as.integer(rightcols), io<-haskey(i), xo, roll, rollends, nomatch, mult, ops, nqgrp, nqmaxgrp) - # NB: io<-haskey(i) necessary for test 579 where the := above change the factor to character and remove i's key - if (verbose) {cat("done in",timetaken(last.started.at),"\n"); flush.console()} - - # in the caller's shallow copy, see comment at the top of this function for usage - # We want to leave the coercions to i in place otherwise, since the caller depends on that to build the result - if (length(resetifactor)) { - for (ii in resetifactor) - set(i,j=ii,value=origi[[ii]]) - if (haskey(origi)) - setattr(i, 'sorted', key(origi)) - } - return(ans) -} - diff --git a/inst/tests/tests.Rraw b/inst/tests/tests.Rraw index d2bc5665d9..e69de29bb2 100644 --- a/inst/tests/tests.Rraw +++ b/inst/tests/tests.Rraw @@ -1,11952 +0,0 @@ - -if (exists("test.data.table", .GlobalEnv, inherits=FALSE)) { - if ("package:data.table" %in% search()) - stop("This is dev but installed data.table is loaded as well. Please unload it to prevent potential conflicts in dev.") - if ((tt<-compiler::enableJIT(-1))>0) - cat("This is dev mode and JIT is enabled (level ", tt, ") so there will be a brief pause around the first test.\n", sep="") -} else { - require(data.table) - # Make symbols to the installed version's ::: so that we can i) test internal-only not-exposed R functions - # in the test suite when user runs test.data.table() from installed package AND ii) so that in dev the same - # tests can be used but in dev they test the package in .GlobalEnv. If we used ::: throughout tests, that - # would pick up the installed version and in dev you'd have to reinstall every time which slows down dev. - # NB: The string "data.table:::" should exist nowhere else in this file other than here inside this branch. - - test = data.table:::test - INT = data.table:::INT - compactprint = data.table:::compactprint - is.sorted = data.table:::is.sorted - forderv = data.table:::forderv - forder = data.table:::forder - null.data.table = data.table:::null.data.table - uniqlist = data.table:::uniqlist - uniqlengths = data.table:::uniqlengths - setrev = data.table:::setrev - setreordervec = data.table:::setreordervec - selfrefok = data.table:::selfrefok - setdiff_ = data.table:::setdiff_ - is_na = data.table:::is_na - shallow = data.table:::shallow # until exported - chmatch2 = data.table:::chmatch2 - which_ = data.table:::which_ - any_na = data.table:::any_na - replace_dot_alias = data.table:::replace_dot_alias - isReallyReal = data.table:::isReallyReal - which.first = data.table:::which.first - which.last = data.table:::which.last - trim = data.table:::trim - `%+%.default` = data.table:::`%+%.default` - .shallow = data.table:::.shallow - getdots = data.table:::getdots - as.ITime.default = data.table:::as.ITime.default - as.IDate.default = data.table:::as.IDate.default - binary = data.table:::binary - - # Also, for functions that are masked by other packages, we need to map the data.table one. Or else, - # the other package's function would be picked up. As above, we only need to do this because we desire - # to develop in .GlobalEnv with cc(). - # NB: The string "data.table::" should exist nowhere else in this file other than here inside this branch. - # This should be retained even if these packages are removed from Suggests, because the test() in this file - # checks against a data.table result which needs the data.table one to run. Otherwise the user can be - # sure by using :: themselves. - # masked by which package? - # ================================= - setattr = data.table::setattr # bit - shift = data.table::shift # IRanges, GenomicRanges - between = data.table::between # plm - second = data.table::second # S4Vectors - dcast = data.table::dcast # reshape2 - melt = data.table::melt # reshape2 - last = data.table::last # xts - first = data.table::first # xts, S4Vectors -} - -# Load optional Suggests packages, which are tested by Travis for code coverage, and on CRAN -# The reason for inclusion here is stated next to each package -sugg = c( - "bit64", # if big integers are detected in file, fread reads them as bit64::integer64 if installed (warning if not) - "xts", # we have xts methods in R/xts.R - "nanotime", # fwrite looks for the 'nanotime' class name at C level (but we have our own writer in C, though) - "chron", # we have chron methods in R/IDateTime.R - "GenomicRanges" # test 1372 checks foverlaps against GenomicRanges' result and is needed for coverage of ijoin.c - # zoo # In DESCRIPTION:Suggests otherwise R CMD check warning: '::' or ':::' import not declared from: 'zoo'; it is tested in other.Rraw though - # reshape2 # In DESCRIPTION:Suggests otherwise same R CMD check warning. See fmelt.R line 1 refers to reshape2 depending on R 3.0.0, but now we do too, -) # perhaps something can be improved now. dcast and melt methods for data.table are tested directly here in main without needing reshape2 loaded. -for (s in sugg) { - assign(paste0("test_",s), loaded<-suppressWarnings(suppressMessages(require(s, character.only=TRUE)))) - if (!loaded) cat("\n**** Suggested package",s,"is not installed. Tests using it will be skipped.\n\n") -} - -# Control options in case user set them. The user's values are restored at the end of this file. -oldOptions = options( - datatable.alloccol = 1024L, - datatable.print.class = FALSE # This is TRUE in cc.R and we like TRUE. But output= tests need to be updated (they assume FALSE currently) -) - -########################## - -test(1.1, tables(env=new.env()), null.data.table(), output = "No objects of class") -test(1.2, tables(silent=TRUE), data.table(NAME="timings", NROW=3000L, NCOL=3L, MB=0, COLS=list(c("ID","time","nTest")), KEY=list(NULL))) - -TESTDT = data.table(a=as.integer(c(1,3,4,4,4,4,7)), b=as.integer(c(5,5,6,6,9,9,2)), v=1:7) -setkey(TESTDT,a,b) -# i.e. a b v -# [1,] 1 5 1 -# [2,] 3 5 2 -# [3,] 4 6 3 -# [4,] 4 6 4 -# [5,] 4 9 5 -# [6,] 4 9 6 -# [7,] 7 2 7 -test(2.1, TESTDT[SJ(4,6),v,mult="first"], 3L) -test(2.2, TESTDT[SJ(4,6),v,mult="last"], 4L) -test(3, TESTDT[SJ(c(4,4,4),c(6,6,7)),v,mult="last",roll=TRUE], INT(4,4,4)) -test(4, TESTDT[SJ(c(4,4,4),c(9,9,10)),v,mult="last",roll=TRUE], INT(6,6,6)) -test(5, TESTDT[SJ(c(4,4,4),c(6,6,7)),v,mult="last",roll=TRUE,rollends=FALSE], INT(4,4,4)) -test(6, TESTDT[SJ(c(4,4,4),c(9,9,10)),v,mult="last",roll=TRUE,rollends=FALSE], INT(6,6,NA)) -test(7, TESTDT[SJ(c(4,4,4),c(9,9,10)),v,mult="first",roll=TRUE,rollends=FALSE], INT(5,5,NA)) -test(8, TESTDT[SJ(c(-9,1,4,4,8),c(1,4,4,10,1)),v], INT(NA,NA,NA,NA,NA)) -test(9, TESTDT[SJ(c(-9,1,4,4,8),c(1,4,4,10,1)),v,roll=TRUE], INT(NA,NA,NA,6,NA)) -test(10, TESTDT[SJ(c(-9,1,4,4,8),c(1,4,4,10,1)),v,roll=TRUE,rollends=FALSE], INT(NA,NA,NA,NA,NA)) -test(11, TESTDT[SJ(c(-3,2,4,4,5,7,8)),v,mult="first"], INT(NA,NA,3,3,NA,7,NA)) -test(12, TESTDT[SJ(c(-3,2,4,4,5,7,8)),v,mult="first",roll=TRUE], INT(NA,1,3,3,6,7,7)) -test(13, TESTDT[SJ(c(-3,2,4,4,5,7,8)),v,mult="last"], INT(NA,NA,6,6,NA,7,NA)) -test(14, TESTDT[SJ(c(-3,2,4,4,5,7,8)),v,mult="last",roll=TRUE], INT(NA,1,6,6,6,7,7)) -test(15, TESTDT[SJ(c(-3,2,4,4,5,7,8)),v,mult="last",nomatch=0], INT(6,6,7)) -test(16, TESTDT[SJ(c(4)),v], INT(3,4,5,6)) -#test(17, suppressWarnings(TESTDT[SJ(c(4,4)),v,mult="all",incbycols=FALSE][[1]]), INT(3:6,3:6)) -test(18, TESTDT[SJ(c(-3,2,4,8)),v,mult="all",nomatch=0,by=.EACHI][[2]], INT(3:6)) -test(185, TESTDT[SJ(c(-3,2,4,8)),v,mult="all",nomatch=NA], INT(NA,NA,3:6,NA)) -test(19, TESTDT[SJ(c(-3,2,4,8)),v,mult="all",roll=TRUE,nomatch=0], INT(1,3:6,7)) -test(186, TESTDT[SJ(c(-3,2,4,8)),v,mult="all",roll=TRUE,nomatch=NA], INT(NA,1,3:6,7)) -test(20, TESTDT[SJ(c(-3,2,4,8)),v,mult="all",roll=TRUE,rollends=FALSE,nomatch=0], INT(1,3:6)) -test(187, TESTDT[SJ(c(-3,2,4,8)),v,mult="all",roll=TRUE,rollends=FALSE,nomatch=NA], INT(NA,1,3:6,NA)) -test(21, TESTDT[SJ(c(-9,1,4,4,4,4,8),c(1,5,5,6,7,10,3)),v,mult="all",nomatch=0], INT(1,3:4)) -test(188, TESTDT[SJ(c(-9,1,4,4,4,4,8),c(1,5,5,6,7,10,3)),v,mult="all",nomatch=NA, allow.cartesian=TRUE], INT(NA,1,NA,3:4,NA,NA,NA)) -test(22, TESTDT[SJ(c(-9,1,4,4,4,4,8),c(1,5,5,6,7,10,3)),v,mult="all",roll=TRUE,nomatch=0], INT(1,3:4,4,6)) -test(189, TESTDT[SJ(c(-9,1,4,4,4,4,8),c(1,5,5,6,7,10,3)),v,mult="all",roll=TRUE,nomatch=NA, allow.cartesian=TRUE], INT(NA,1,NA,3:4,4,6,NA)) -test(23, TESTDT[SJ(c(-9,1,4,4,4,4,8),c(1,5,5,6,7,10,3)),v,mult="all",roll=TRUE,rollends=FALSE,nomatch=0], INT(1,3:4,4)) -test(190, TESTDT[SJ(c(-9,1,4,4,4,4,8),c(1,5,5,6,7,10,3)),v,mult="all",roll=TRUE,rollends=FALSE,nomatch=NA,allow.cartesian=TRUE], INT(NA,1,NA,3:4,4,NA,NA)) -test(24, TESTDT[SJ(c(1,NA,4,NA,NA,4,4),c(5,5,6,6,7,9,10)),v,mult="all",roll=TRUE,nomatch=0], INT(1,3:4,5:6,6)) -test(191, TESTDT[SJ(c(1,NA,4,NA,NA,4,4),c(5,5,6,6,7,9,10)),v,mult="all",roll=TRUE,nomatch=NA,allow.cartesian=TRUE], INT(NA,NA,NA,1,3:4,5:6,6)) -# Note that the NAs get sorted to the beginning by the SJ(). - -# i.e. a b v (same test matrix, repeating here for easier reading of the test cases below) -# [1,] 1 5 1 -# [2,] 3 5 2 -# [3,] 4 6 3 -# [4,] 4 6 4 -# [5,] 4 9 5 -# [6,] 4 9 6 -# [7,] 7 2 7 -test(25, TESTDT[SJ(4,6),v,mult="first"], 3L) -test(26, TESTDT[SJ(4,6),v,mult="last"], 4L) -test(27, TESTDT[J(c(4,4,4),c(7,6,6)),v,mult="last",roll=TRUE], INT(4,4,4)) -test(28, TESTDT[J(c(4,4,4),c(10,9,9)),v,mult="last",roll=TRUE], INT(6,6,6)) -test(29, TESTDT[J(c(4,4,4),c(7,6,6)),v,mult="last",roll=TRUE,rollends=FALSE], INT(4,4,4)) -test(30, TESTDT[J(c(4,4,4),c(10,9,9)),v,mult="last",roll=TRUE,rollends=FALSE], INT(NA,6,6)) -test(31, TESTDT[J(c(4,4,4),c(10,9,9)),v,mult="first",roll=TRUE,rollends=FALSE], INT(NA,5,5)) -test(32, TESTDT[J(c(8,1,4,4,-9),c(1,4,4,10,1)),v], INT(NA,NA,NA,NA,NA)) -test(33, TESTDT[J(c(8,1,4,4,-9),c(1,4,4,10,1)),v,roll=TRUE], INT(NA,NA,NA,6,NA)) -test(34, TESTDT[J(c(8,1,4,4,-9),c(1,4,7,10,1)),v,roll=TRUE,rollends=FALSE], INT(NA,NA,4,NA,NA)) -test(35, TESTDT[J(c(5,4,-3,8,4,7,2)),v,mult="first"], INT(NA,3,NA,NA,3,7,NA)) -test(36, TESTDT[J(c(5,4,-3,8,4,7,2)),v,mult="first",roll=TRUE], INT(6,3,NA,7,3,7,1)) -test(37, TESTDT[J(c(5,4,-3,8,4,7,2)),v,mult="last"], INT(NA,6,NA,NA,6,7,NA)) -test(38, TESTDT[J(c(5,4,-3,8,4,7,2)),v,mult="last",roll=TRUE], INT(6,6,NA,7,6,7,1)) -test(39, TESTDT[J(c(5,4,-3,8,4,7,2)),v,mult="last",nomatch=0], INT(6,6,7)) -test(40, TESTDT[J(c(4)),v,mult="all"], INT(3,4,5,6)) -test(41, TESTDT[J(c(4,4)),v,mult="all", allow.cartesian=TRUE], INT(3:6,3:6)) -test(42, TESTDT[J(c(8,2,4,-3)),v,mult="all",nomatch=0], INT(3:6)) -test(192, TESTDT[J(c(8,2,4,-3)),v,mult="all",nomatch=NA], INT(NA,NA,3:6,NA)) -test(43, TESTDT[J(c(8,2,4,-3)),v,mult="all",roll=TRUE,nomatch=0], INT(7,1,3:6)) -test(193, TESTDT[J(c(8,2,4,-3)),v,mult="all",roll=TRUE,nomatch=NA], INT(7,1,3:6,NA)) -#test(44, suppressWarnings(TESTDT[J(c(8,4,2,-3)),v,mult="all",roll=TRUE,rollends=FALSE,incbycols=FALSE]), INT(3:6,1)) -test(45, TESTDT[J(c(-9,1,4,4,4,4,8),c(1,5,5,6,7,10,3)),v,mult="all",nomatch=0], INT(1,3:4)) -test(194, TESTDT[J(c(-9,1,4,4,4,4,8),c(1,5,5,6,7,10,3)),v,mult="all",nomatch=NA,allow.cartesian=TRUE], INT(NA,1,NA,3:4,NA,NA,NA)) -test(46, TESTDT[J(c(-9,1,4,4,4,4,8),c(1,5,5,6,7,10,3)),v,mult="all",roll=TRUE,nomatch=0], INT(1,3:4,4,6)) -test(195, TESTDT[J(c(-9,1,4,4,4,4,8),c(1,5,5,6,7,10,3)),v,mult="all",roll=TRUE,nomatch=NA,allow.cartesian=TRUE], INT(NA,1,NA,3:4,4,6,NA)) -test(47, TESTDT[J(c(-9,1,4,4,4,4,8),c(1,5,5,6,7,10,3)),v,mult="all",roll=TRUE,rollends=FALSE,nomatch=0], INT(1,3:4,4)) -test(196, TESTDT[J(c(-9,1,4,4,4,4,8),c(1,5,5,6,7,10,3)),v,mult="all",roll=TRUE,rollends=FALSE,nomatch=NA,allow.cartesian=TRUE], INT(NA,1,NA,3:4,4,NA,NA)) -test(48, TESTDT[J(c(-9,NA,4,NA,1,4,4),c(1,5,9,6,5,9,10)),v,mult="all",roll=TRUE,nomatch=0], INT(5:6,1,5:6,6)) # this time the NAs stay where they are. Compare to test 24 above. -test(197, TESTDT[J(c(-9,NA,4,NA,1,4,4),c(1,5,9,6,5,9,10)),v,mult="all",roll=TRUE,nomatch=NA,allow.cartesian=TRUE], INT(NA,NA,5:6,NA,1,5:6,6)) -test(49, TESTDT[J(c(4,1,0,5,3,7,NA,4,1),c(6,5,1,10,5,2,1,6,NA)),v,nomatch=0], INT(3,4,1,2,7,3,4)) -test(198, TESTDT[J(c(4,1,0,5,3,7,NA,4,1),c(6,5,1,10,5,2,1,6,NA)),v,nomatch=NA,allow.cartesian=TRUE], INT(3,4,1,NA,NA,2,7,NA,3,4,NA)) -test(50, TESTDT[J(c(4,1,0,5,3,7,NA,4,1),c(6,5,1,10,5,2,1,6,NA)),v,mult="last",nomatch=0], INT(4,1,2,7,4)) -test(199, TESTDT[J(c(4,1,0,5,3,7,NA,4,1),c(6,5,1,10,5,2,1,6,NA)),v,mult="last",nomatch=NA], INT(4,1,NA,NA,2,7,NA,4,NA)) - -TESTDT[, a:=letters[a]] -setkey(TESTDT,a,b) -# i.e. a b v -# [1,] a 5 1 -# [2,] c 5 2 -# [3,] d 6 3 -# [4,] d 6 4 -# [5,] d 9 5 -# [6,] d 9 6 -# [7,] g 2 7 -test(51, TESTDT[SJ(c("d","d","e","g"),c(6,7,1,2)),v,mult="all",roll=TRUE,nomatch=0], INT(3:4,4,7)) -test(200, TESTDT[SJ(c("d","d","e","g"),c(6,7,1,2)),v,mult="all",roll=TRUE,nomatch=NA], INT(3:4,4,NA,7)) -test(52, TESTDT[J(c("g","d","e","d"),c(6,6,1,2)),v,mult="all",roll=TRUE,nomatch=0], INT(7,3:4)) -test(201, TESTDT[J(c("g","d","e","d"),c(6,6,1,2)),v,mult="all",roll=TRUE,nomatch=NA], INT(7,3:4,NA,NA)) - -TESTDT[, b:=letters[b]] -setkey(TESTDT,a,b) -# i.e. -# a b v -# [1,] a e 1 -# [2,] c e 2 -# [3,] d f 3 -# [4,] d f 4 -# [5,] d i 5 -# [6,] d i 6 -# [7,] g b 7 -test(53, TESTDT[SJ(c("d","d","e","g"),c("f","g","a","b")),v,mult="last"], INT(4,NA,NA,7)) -test(54, TESTDT[J(c("g","d","e","d"),c("b","g","a","f")),v,mult="last"], INT(7,NA,NA,4)) # this tests (d,g) ok even though there is an NA in last match in the roll. -test(55, TESTDT[SJ(c("d","d","e","g"),c("f","g","a","b")),v,mult="first"], INT(3,NA,NA,7)) -test(56, TESTDT[J(c("g","d","e","d"),c("b","g","a","f")),v,mult="first"], INT(7,NA,NA,3)) -test(57, TESTDT[J(c("g","d","d","d","e","d"),c("b","g","k","b","a","f")),v,roll=TRUE], INT(7,4,6,NA,NA,3,4)) -# test 58 removed. Tested this failed (rolling join on factors) pre character columns, now works. -test(59, TESTDT[J(c("g","d","d","d","e","d"),c("b","g","k","b","a","f")),v,roll=TRUE,rollends=FALSE], INT(7,4,NA,NA,NA,3,4)) -# test 60 removed. Tested this failed (rolling join on factors) pre character columns, now works. - -# Tests 61-66 were testing sortedmatch which is now replaced by chmatch for characters, and removed -# for integers until needed. - -# Test 67 removed. No longer use factors so debate/problem avoided. -# [.factor and c.factor are no longer present in data.table, not even hidden away -# X = factor(letters[1:10]) -# test(67, levels(X[4:6]), letters[4:6]) - -test(68, "TESTDT" %in% tables(silent=TRUE)[,NAME]) # NAME is returned as a column in which we look for the string -test(69.1, "TESTDT" %in% tables(silent=TRUE)[,as.character(NAME)]) # an old test (from when NAME was factor) but no harm in keeping it -test(69.2, names(tables(silent=TRUE)), c("NAME","NROW","NCOL","MB","COLS","KEY")) -test(69.3, names(tables(silent=TRUE, mb=FALSE)), c("NAME","NROW","NCOL","COLS","KEY")) -test(69.4, names(tables(silent=TRUE, mb=FALSE, index=TRUE)), - c("NAME", "NROW", "NCOL", "COLS", "KEY", "INDICES")) - -xenv = new.env() # to control testing tables() -xenv$DT = data.table(a = 1) -test(69.5, nrow(tables(env=xenv)), 1L, output="NAME NROW NCOL MB COLS KEY\n1: DT 1 1 0 a.*Total: 0MB") -xenv$DT = data.table(A=1:2, B=3:4, C=5:6, D=7:8, E=9:10, F=11:12, G=13:14, H=15:16, key="A,D,F,G") -test(69.6, nrow(tables(env=xenv)), 1L, output="NAME NROW NCOL MB COLS KEY\n1: DT 2 8 0 A,B,C,D,E,F,... A,D,F,G.*Total: 0MB") -rm(xenv) - -a = "d" -# Variable Twister. a in this scope has same name as a inside DT scope. -# Aug 2010 : As a result of bug 1005, and consistency with 'j' and 'by' we now allow self joins (test 183) in 'i'. -test(70, TESTDT[eval(J(a)),v,by=.EACHI], data.table(a="d",v=3:6,key="a")) # the eval() enabled you to use the 'a' in the calling scope, not 'a' in the TESTDT. TO DO: document this. -test(71, TESTDT[eval(SJ(a)),v,by=.EACHI], data.table(a="d",v=3:6,key="a")) -test(72, TESTDT[eval(CJ(a)),v,by=.EACHI], data.table(a="d",v=3:6,key="a")) -test(73, TESTDT[,v], 1:7) # still old behaviour for 1 year. WhenJsymbol option was set to FALSE at the top of this file -test(74, TESTDT[,3], data.table(v=1:7)) -test(74.1, TESTDT[,4], error="outside the column number range.*1,ncol=3") -test(74.2, TESTDT[,3L], data.table(v=1:7)) -test(74.3, TESTDT[,0], null.data.table()) -test(75, TESTDT[,"v"], data.table(v=1:7)) -test(76, TESTDT[,2:3], TESTDT[,2:3,with=FALSE]) -test(77, TESTDT[,2:3,with=FALSE], data.table(b=c("e","e","f","f","i","i","b"),v=1:7)) -test(78, TESTDT[,c("b","v")], data.table(b=c("e","e","f","f","i","i","b"),v=1:7)) -colsVar = c("b","v") -test(79.1, TESTDT[,colsVar], error="column name 'colsVar' is not found") -test(79.2, TESTDT[,colsVar,with=FALSE], ans<-data.table(b=c("e","e","f","f","i","i","b"),v=1:7)) -test(79.3, TESTDT[, ..colsVar], ans) - - -# works in test.data.table, but not eval(body(test.data.table)) when in R CMD check ... test(81, TESTDT[1:2,c(a,b)], factor(c("a","c","e","e"))) -# It is expected the above to be common source of confusion. c(a,b) is evaluated within -# the frame of TESTDT, and c() creates one vector, not 2 column subset as in data.frame's. -# If 2 columns were required use list(a,b). c() can be useful too, but is different. - -test(82, TESTDT[,c("a","b")], data.table(a=TESTDT[[1]], b=TESTDT[[2]], key=c("a","b"))) -test(83, TESTDT[,list("a","b")], data.table(V1="a",V2="b")) -test(83.1, TESTDT[,list("sum(a),sum(b)")], data.table("sum(a),sum(b)")) -test(83.2, TESTDT[,list("sum(a),sum(b)"),by=a], {tt=data.table(a=c("a","c","d","g"),V1="sum(a),sum(b)",key="a");tt$V1=as.character(tt$V1);tt}) -test(84, TESTDT[1:2,list(a,b)], data.table(a=c("a","c"), b=c("e","e"), key = 'a,b')) -# test(85, TESTDT[1:2,DT(a,b)], data.table(a=c("a","c"), b=c("e","e"))) #DT() now deprecated - -test(86, TESTDT[,sum(v),by="b"], data.table(b=c("e","f","i","b"),V1=INT(3,7,11,7))) # TESTDT is key'd by a,b, so correct that grouping by b should not be key'd in the result by default -test(87, TESTDT[,list(MySum=sum(v)),by="b"], data.table(b=c("e","f","i","b"),MySum=INT(3,7,11,7))) -test(88, TESTDT[,list(MySum=sum(v),Sq=v*v),by="b"][1:3], data.table(b=c("e","e","f"),MySum=INT(3,3,7),Sq=INT(1,4,9))) # silent repetition of MySum to match the v*v vector -# Test 89 dropped. Simplify argument no longer exists. by is now fast and always returns a data.table ... test(89, TESTDT[,sum(v),by="b",simplify=FALSE], list(7L,3L,7L,11L)) - -# Test 88.5 contributed by Johann Hibschman (for bug fix #1294) : -test(88.5, TESTDT[a=="d",list(MySum=sum(v)),by=list(b)], data.table(b=c("f","i"), MySum=INT(7,11), key="b")) - -setkey(TESTDT,b) -test(90, TESTDT[J(c("f","i")),sum(v),by=.EACHI], data.table(b=c("f","i"),V1=c(7L,11L),key="b")) -test(90.5, TESTDT[J(c("i","f")),sum(v),by=.EACHI], data.table(b=c("i","f"),V1=c(11L,7L))) # test not keyed -test(91, TESTDT[SJ(c("f","i")),sum(v),by=.EACHI], data.table(b=c("f","i"),V1=c(7L,11L),key="b")) -# Test 92 dropped same reason as 89 ... test(TESTDT[92, J(c("f","i")),sum(v),mult="all",simplify=FALSE], list(7L,11L)) - -test(93, TESTDT[c("f","i"), which=TRUE], 4:7) -test(94, TESTDT[c("i","f"), mult="last", which=TRUE], INT(7,5)) - -test(95, TESTDT["f",v], 3:4) -test(96, TESTDT["f",v,by=.EACHI], data.table(b="f",v=3:4,key="b")) -test(97, TESTDT[c("f","i","b"),list(GroupSum=sum(v)),by=.EACHI], data.table(b=c("f","i","b"), GroupSum=c(7L,11L,7L))) -# that line above doesn't create a key on the result so that the order fib is preserved. -test(98, TESTDT[SJ(c("f","i","b")),list(GroupSum=sum(v)),by=.EACHI], data.table(b=c("b","f","i"), GroupSum=c(7L,7L,11L), key="b")) -# line above is the way to group, sort by group and setkey on the result by group. - -dt <- data.table(A = rep(1:3, each=4), B = rep(11:14, each=3), C = rep(21:22, 6), key = "A,B") -test(99, unique(dt, by=key(dt)), data.table(dt[c(1L, 4L, 5L, 7L, 9L, 10L)], key="A,B")) - -# test [<- for column assignment -dt1 <- dt2 <- dt -test(100, {dt1[,"A"] <- 3L; dt1}, {dt2$A <- 3L; dt2}) - -# test transform and within -test(101, within(dt, {D <- B^2}), transform(dt, D = B^2)) -test(102, within(dt, {A <- B^2}), transform(dt, A = B^2)) - -# test .SD object -test(103, dt[, sum(.SD$B), by = "A"], dt[, sum(B), by = "A"]) -test(104, dt[, transform(.SD, D = min(B)), by = "A"], dt[, list(B,C,D=min(B)), by = "A"]) - -# test numeric and comparison operations on a data table -test(105, all(dt + dt > dt)) -test(106, all(dt + dt > 1)) -test(107, dt + dt, dt * 2L) - -# test a few other generics: -test(108, dt, data.table(t(t(dt)),key="A,B")) -test(109, all(!is.na(dt))) -dt2 <- dt -dt2$A[1] <- NA # removes key -test(110, sum(is.na(dt2)), 1L) -test(111, {setkey(dt,NULL);dt}, na.omit(dt)) -test(112, dt2[2:nrow(dt2),A], na.omit(dt2)$A) - -# test [<- assignment: -dt2[is.na(dt2)] <- 1L -test(113, {setkey(dt,NULL);dt}, dt2) # key should be dropped because we assigned to a key column -# want to discourage this going forward (inefficient to create RHS like this) -# dt2[, c("A", "B")] <- dt1[, c("A", "B"), with = FALSE] -# test(114, dt1, dt2) -## doesn't work, yet: -## dt2[rep(TRUE, nrow(dt)), c("A", "B")] <- dt1[, c("A", "B"), with = FALSE] -## dt2[rep(TRUE, nrow(dt)), c("A")] <- dt1[, c("A"), with = FALSE] -## test(dt, dt2)) stop("Test 112 failed") - -# test the alternate form of setkey: -dt1 = copy(dt) -dt2 = copy(dt) -setkeyv(dt1, "A") -setkey(dt2, A) -test(115, dt1, dt2) - -# Test dogroups works correctly for character/factor columns -test(116, TESTDT[,a[1],by="b"], data.table(b=c("b","e","f","i"), V1=c("g","a","d","d"), key="b")) -test(117, TESTDT[,list(a[1],v[1]),by="b"], data.table(b=c("b","e","f","i"), V1=c("g","a","d","d"), V2=INT(7,1,3,5), key="b")) - -# We no longer check i for out of bounds, for consistency with data.frame and e.g. cbind(DT[w],DT[w+1]). NA rows should be returned for i>nrow -test(118, TESTDT[8], data.table(a=as.character(NA), b=as.character(NA), v=as.integer(NA), key="b")) -test(119, TESTDT[6:9], data.table(a=c("d","d",NA,NA), b=c("i","i",NA,NA), v=c(5L,6L,NA,NA))) - -# Tests of 0 and 1 row tables -TESTDT = data.table(NULL) -test(122, TESTDT[1], TESTDT) -test(123, TESTDT[0], TESTDT) -test(124, TESTDT[1:10], TESTDT) -test(125, TESTDT["k"], error="the columns to join by must be specified either using") -# test 126 no longer needed now that test() has 'error' argument - -TESTDT = data.table(a=3L,v=2L,key="a") # testing 1-row table -test(127, TESTDT[J(3)], TESTDT) -test(128, TESTDT[J(4)], data.table(a=4L,v=NA_integer_,key="a")) # see tests 206-207 too re the [NA] -test(129, TESTDT[J(4),roll=TRUE], data.table(a=4L,v=2L,key="a")) # the i values are in the result now (which make more sense for rolling joins, the x.a can still be accessed if need be) -test(130, TESTDT[J(4),roll=TRUE,rollends=FALSE], data.table(a=4L,v=NA_integer_,key="a")) -test(131, TESTDT[J(-4),roll=TRUE], data.table(a=-4L,v=NA_integer_,key="a")) - -test(132, ncol(TESTDT[0]), 2L) -test(133, TESTDT[0][J(3)], data.table(a=3L,v=NA_integer_,key="a")) # These need to retain key for consistency (edge cases of larger sorted i) - -# tests on data table names, make.names is now FALSE by default from v1.8.0 -x = 2L; `1x` = 4L -dt = data.table(a.1 = 1L, b_1 = 2L, "1b" = 3L, `a 1` = 4L, x, `1x`, 2*x) -test(134, names(dt), c("a.1", "b_1", "1b", "a 1", "x", "V6", "V7")) -dt = data.table(a.1 = 1L, b_1 = 2L, "1b" = 3L, `a 1` = 4L, x, `1x`, 2*x, check.names=TRUE) -test(134.5, names(dt), c("a.1", "b_1", "X1b", "a.1.1", "x", "V6", "V7")) - -dt = data.table(a.1 = 1L, b_1 = 2L, "1b" = 3L, `a 1` = 4L, x, `1x`, 2*x, check.names = FALSE) -test(135, names(dt), c("a.1", "b_1", "1b", "a 1", "x", "V6", "V7")) # the last two terms differ from data.frame() - -test(136, dt[,b_1, by="a.1"], data.table(a.1=1L,"b_1"=2L)) -test(137, dt[,`a 1`, by="a.1"], data.table(a.1=1L,"a 1"=4L, check.names=FALSE)) -test(138, dt[,a.1, by="`a 1`"], data.table(`a 1`=4L,a.1=1L, check.names=FALSE)) - -# tests with NA's in factors -dt = data.table(a = c(NA, letters[1:5]), b = 1:6) -test(139, dt[,sum(b), by="a"], data.table(a = c(NA, letters[1:5]), V1 = 1:6)) - -# tests to make sure rbind and grouping keep classes -dt = data.table(a = rep(as.Date("2010-01-01"), 4), b = rep("a",4)) -test(140, rbind(dt,dt), data.table(a = rep(as.Date("2010-01-01"), 8), b = rep("a",8))) -test(141, dt[,list(a=a), by="b"], dt[,2:1, with = FALSE]) - -dt$a <- structure(as.integer(dt$a), class = "Date") -test(142, dt[,list(b=b), by="a"], dt) - -dt = data.table(x=1:5,y=6:10) -test(143, tail(dt), dt) # tail was failing if a column name was called x. - -dt <- data.table(a = rep(1:3, each = 4), b = LETTERS[1:4], b2 = LETTERS[1:4]) -test(144, dt[, .SD[3,], by=b], data.table(b=LETTERS[1:4],a=3L,b2=LETTERS[1:4])) - -DT = data.table(x=rep(c("a","b"),c(2,3)),y=1:5) -xx = capture.output(ans <- DT[,{print(x);sum(y)},by=x,verbose=FALSE]) -test(145, xx, c("[1] \"a\"","[1] \"b\"")) -test(146, ans, data.table(x=c("a","b"),V1=c(3L,12L))) - -test(147, DT[,MySum=sum(v)], error="unused argument") # user meant DT[,list(MySum=sum(v))]. FR#204 done. - -dt = data.table(a=c(1L,4L,5L), b=1:3, key="a") -test(148, dt[CJ(2:3),roll=TRUE], data.table(a=c(2L,3L),b=c(1L,1L),key="a")) -test(149, dt[J(2:3),roll=TRUE], data.table(a=c(2L,3L),b=c(1L,1L))) # in future this will detect the subset is ordered and retain the key - -# 150:158 test out of order factor levels in key columns (now allowed from v1.8.0) -dt = data.table(x=factor(c("c","b","a"),levels=c("b","a","c")),y=1:3) -setkey(dt,x) -test(150.1, dt["b",y,verbose=TRUE], output="Coercing character column i.'V1' to factor") # changed i.V1 to i.x as per FR #2693 -test(150.2, dt["b",y], 2L) -# from Tom's post : -a = data.table(a=rep(1:5, 2), b=factor(letters[rep(1:5, each =2)], levels=letters[5:1]), key="b") -test(151.1, a[J("b"),a,verbose=TRUE], output="Coercing character column i.'V1' to factor") # message back to `i.V1` now. 'b' still accessible to satisfy FR #2693, checked on next line -test(151.2, a[J("b"),a], 3:4) -# stretch tests further, two out of order levels, one gets key'd the other not : -a = data.table(x=factor(letters[rep(1:5, each =2)], levels=letters[5:1]), - y=factor(letters[rep(c(6,9,7,10,8), each =2)], levels=letters[10:6]), - z=1:10) -test(152, is.sorted(levels(a$x)), FALSE) -test(153, is.sorted(levels(a$y)), FALSE) -test(154, a[,sum(z),by=x][1,paste(x,V1)], "a 3") # ad hoc by doesn't sort the groups so 'a' (5th level) should be first -setkey(a,x) # 'e' (level 1) should come first now. -test(155, is.sorted(levels(a$x)), FALSE) -test(156, is.sorted(levels(a$y)), FALSE) -test(157, a[,sum(z),by=x][1,paste(x,V1)], "e 19") # 1st level is now first -test(158, a[,sum(z),by=y][1,paste(y,V1)], "h 19") # not 'f' -test(158.5, a[,sum(z),keyby=y][1,paste(y,V1)], "j 15") # not 'f' either - -# tests of by expression variables -DT = data.table( a=1:5, b=11:50, d=c("A","B","C","D"), f=1:5, grp=1:5 ) -f = quote( list(d) ) -test(159, DT[,mean(b),by=eval(f)], DT[,mean(b),by=list(d)]) # column f doesn't get in the way of expression f -foo = function( grp ) { - DT[,mean(b),by=eval(grp)] -} -test(160, foo(quote(list(d))), DT[,mean(b),by=list(d)]) -test(161, foo(quote(list(d,a))), DT[,mean(b),by=list(d,a)]) -test(162, foo(quote(list(f))), DT[,mean(b),by=list(f)]) -test(163, foo(quote(list(grp))), DT[,mean(b),by=list(grp)]) # grp local variable in foo doesn't conflict with column grp -test(164, foo(f), DT[,mean(b),by=d]) - -# checks that data.table inherits methods from data.frame in base ok -test(165, subset(DT,a>2), DT[a>2]) -test(166, suppressWarnings(split(DT,DT$grp)[[2]]), DT[grp==2]) - -# and that plotting works -test(167.1, DT[,plot(b,f)], NULL) -test(167.2, as.integer(DT[,hist(b)]$breaks), seq.int(10L,50L,by=5L)) # as.integer needed for R 3.1.0 -test(167.3, DT[,plot(b,f),by=.(grp)], data.table(grp=integer())) -try(graphics.off(),silent=TRUE) - -# IDateTime conversion methods that ggplot2 uses (it calls as.data.frame method) -datetimes = c("2011 NOV18 09:29:16", "2011 NOV18 10:42:40", "2011 NOV18 23:47:12", - "2011 NOV19 01:06:01", "2011 NOV19 11:35:34", "2011 NOV19 11:51:09") -DT = IDateTime(strptime(datetimes,"%Y %b%d %H:%M:%S")) -test(168.1, DT[,as.data.frame(itime)], data.frame(V1=as.ITime(x<-c("09:29:16","10:42:40","23:47:12","01:06:01","11:35:34","11:51:09")))) -test(168.2, as.character(DT[,as.POSIXct(itime,tz="UTC")]), paste(as.Date(Sys.time()),x)) -test(168.3, as.character(DT[,as.POSIXct(idate,tz="UTC")]), c("2011-11-18","2011-11-18","2011-11-18","2011-11-19","2011-11-19","2011-11-19")) - -# test of . in formula, using inheritance -DT = data.table(y=1:100,x=101:200,y=201:300,grp=1:5) -test(169,DT[,as.list(lm(y~0+.,.SD)$coef),by=grp][2,x]-2<1e-10, TRUE) - -DT <- data.table( a=1:4, d=c("A","B","C","D") ) -g <- quote( list( d ) ) -test(170, DT[,list(d)], DT[,eval(g)]) - -DT = data.table(A=c(25L,85L,25L,25L,85L), B=c("a","a","b","c","c"), C=c(2,65,9,82,823)) -test(171.1, DT[B=="b"][A==85], output="Empty data.table (0 rows) of 3 cols: A,B,C") -test(171.2, DT[B=="b"][A==85,C], numeric()) -test(171.3, DT[ , data.table( A, C )[ A==25, C ] + data.table( A, C )[ A==85, C ], by=B ], data.table(B=c("a","c"),V1=c(67,905))) -test(172, DT[ , list(3,data.table( A, C )[ A==25, C ] + data.table( A, C )[ A==85, C ]), by=B ], data.table(B=c("a","b","c"),V1=3,V2=c(67,NA,905))) - -# Test growing result in memory. Usually the guess is good though. -# This example returns no rows for first group so guess for up-front allocate needs a reallocate -DT = data.table(A=c(1L,1L,2L,2L,3L,3L), B=1:6) -test(173, DT[,B[B>3],by=A][,V1], c(4L,5L,6L)) - -# Example taken from Harish post to datatable-help on 11 July -DT <- data.table( - A=c("a","a","b","b","d","c","a","d"), - B=c("x1","x2","x2","x1","x2","x1","x1","x2"), - C=c(5,2,3,4,9,5,1,9) - ) -test(174, DT[,C[C-min(C)<3],by=list(A,B)][,V1], c(1,2,3,4,9,9,5)) -test(175, DT[,C[C-min(C)<5],by=list(A,B)][,V1], c(5,1,2,3,4,9,9,5)) - -# Tests of data.table sub-assignments: $<-.data.table & [<-.data.table -DT = data.table(a = c("A", "Z"), b = 1:10, key = "a") -DT[J("A"),2] <- 100L # without L generates nice warning :-) -DT[J("A"),"b"] <- 1:5 -DT[1:3,"b"] <- 33L -test(176, DT, data.table(a = rep(c("A", "Z"), each = 5), - b = as.integer(c(rep(33, 3), 4:5, seq(2, 10, by = 2))), - key = "a")) -DT[J("A"),"a"] <- "Z" -test(177, DT, data.table(a="Z", b=as.integer(c(rep(33, 3), 4:5, seq(2, 10, by = 2))))) # i.e. key dropped and column a still factor - -DT <- data.table(a = c("A", "Z"), b = 1:10, key = "a") -DT$b[1:5] <- 1:5 -DT$b[1:3] <- 33 -test(178, DT, data.table(a = rep(c("A", "Z"), each = 5), - b = c(rep(33, 3), 4:5, seq(2, 10, by = 2)), - key = "a")) -DT$a <- 10:1 -test(179, key(DT), NULL ) - -# Test logical in a key -DT = data.table(a=rep(1:3,each=2),b=c(TRUE,FALSE),v=1:6) -setkey(DT,a,b) -test(180, DT[J(2,FALSE),v], 4L) -test(181, DT[,sum(v),by=b][,V1], c(12L,9L)) - -# Test fix for bug 1026 reported by Harish V -# this test needed a unique var name to generate error 'object 'b' not found'. -# Otherwise it finds 'b' in local scope. -setnames(DT,2,"buniquename314") -bar = function( data, fcn ) { - q = substitute( fcn ) - xx = data[,eval(q),by=a] - yy = data[,eval(substitute(fcn)),by=a] - identical(xx,yy) -} -test(182, bar( DT, sum(buniquename314) ), TRUE) - -# Test bug 1005 reported by Branson Owen -DT = data.table(A = c("o", "x"), B = 1:10, key = "A") -test(183, DT[J(unique(A)), B], DT$B) - -# Test bug 709 which returned an error here. And return type now empty table, #1945 in 1.8.1. -xx = data.table(a=1:5,b=6:10) -test(184, xx[a>6,sum(b),by=a], data.table(a=integer(),V1=integer())) - -# Tests of bug 1015 highlight by Harish -# See thread "'by without by' now heeds nomatch=NA" -# Tests 185-201 were added in above next to originals -x <- data.table(a=c("a","b","d","e"),b=c("A","A","B","B"),d=c(1,2,3,4), key="a,b") -y <- data.table(g=c("a","b","c","d"),h=c("A","A","A","A")) -test(202, x[y], x[y,mult="all"]) -test(203, x[y,d], c(1,2,NA,NA)) -test(204, x[y,list(d)]$d, x[y,d]) -test(205, x[y,list(d),mult="all"][,d], c(1,2,NA,NA)) - -# Test [NA] returns one NA row. NA is type *logical* so prior to -# change in v1.5, NA would get silently recycled and the whole table would -# be returned all NA (rarely useful and often confusing, but consistent -# with data.frame). -TESTDT = data.table(a=1:3,v=1:3,key="a") -test(206, TESTDT[NA], data.table(a=NA_integer_,v=NA_integer_,key="a")) # NA are now allowed in keys, so retains key -# TESTDT[NA] is expected to return a row of NA since nobody remembers that NA is different to NA_integer_ -# Then user tries TESTDT[c(1,NA,2)] and it feels consistent to them since they see that row of NA in the middle -# But only the NA symbol is caught and replaced with NA_integer_, for this convenience. -# Otherwise logical expressions returning a single NA logical will still return empty, for consistency, #1252. -setkey(TESTDT,NULL) -test(207, TESTDT[NA], data.table(a=NA_integer_,v=NA_integer_)) - -# With inheritance, NROW and NCOL in base work nicely. No need for them in data.table. -test(208, NROW(TESTDT), 3L) -test(209, nrow(TESTDT), 3L) -test(210, NCOL(TESTDT), 2L) -test(211, ncol(TESTDT), 2L) - -# Test infinite recursion error is trapped when a pre-1.5 data.table -# is used with 1.5 (bug #1008) -DT = data.table(a=1:6,key="a") -test(212, DT[J(3)]$a, 3L) # correct class c("data.table","data.frame") -class(DT) = "data.table" # incorrect class, but as from 1.8.1 it works. By accident when moving from colnames() to names(), it was dimnames() doing the check, but rather than add a check that identical(class(DT),c("data.frame","data.table")) at the top of [.data.table, we'll leave it flexible to user (user might not want to inherit from data.frame for some reason). -test(213, DT[J(3)]$a, 3L) - -# setkey now auto coerces double and character for convenience, and -# to solve bug #953 -DF = data.frame(a=LETTERS[1:10], b=1:10, stringsAsFactors=FALSE) -DT = data.table(DF) -setkey(DT,a) # used to complain about character -test(215, DT["C",b], 3L) -DT = data.table(DF,key="a") -test(216, DT["C",b], 3L) -DT = data.table(a=c(1,2,3),v=1:3,key="a") -test(217, DT[J(2),v], 2L) -DT = data.table(a=c(1,2.1,3),v=1:3,key="a") -test(218, DT[J(2.1),v], 2L) - -# tests of quote()-ed expressions in i. Bug #1058 -DT = data.table(a=1:5,b=6:10,key="a") -q = quote(a>3) -test(220, DT[eval(q),b], 9:10) -test(221, DT[eval(parse(text="a>4")),b], 10L) -test(222, DT[eval(parse(text="J(2)")),b], 7L) - -# lists in calling scope should be ok as single names passed to by, bug #1060 -DT = data.table(a=1:2,b=rnorm(10)) -byfact = DT[,a] # vector, ok before fix but check anyway -test(223, DT[,mean(b),by=byfact], DT[,mean(b),by=list(byfact)]) -byfact = DT[,list(a)] # this caused next line to fail before fix -test(224, DT[,mean(b),by=byfact], DT[,mean(b),by=as.list(byfact)]) -test(225, DT[,mean(b),by=byfact], DT[,mean(b),by={byfact}]) - -# tests for building expressions via parse, bug #1243 -dt1key<-data.table(A1=1:100,onekey=rep(1:2,each=50)) -setkey(dt1key,onekey) -ASumExpr<-parse(text="quote(sum(A1))") # no need for quote but we test it anyway because that was work around when test 227 failed -ASumExprNoQ<-parse(text="sum(A1)") -ans = dt1key[,sum(A1),by=onekey] -test(226,ans,dt1key[,eval(eval(ASumExpr)),by=onekey]) -test(227,ans,dt1key[,eval(ASumExprNoQ),by=onekey]) - -# test for uncommon grouping pattern on 1-row data.table, bug #1245 -DT = data.table(a=1L,b=2L) -test(228,DT[,list(1:2),by=a],data.table(a=c(1L,1L),V1=1:2)) - -# special case j=.SD, bug #1247 -DT = data.table(a=rep(1:2,each=2),b=1:4) -test(229,DT[,.SD,by=a],DT) -setkey(DT,a) -test(229.1,DT[,.SD,by=key(DT)],DT) - -# merge bug with column 'x', bug #1229 -d1 <- data.table(x=c(1,3,8),y1=rnorm(3), key="x") -d2 <- data.table(x=c(3,8,10),y2=rnorm(3), key="x") -ans1=merge(d1, d2, by="x") -ans2=cbind(d1[2:3],y2=d2[1:2]$y2);setkey(ans2,x) -test(230, ans1, ans2) - -# one column merge, bug #1241 -DT = data.table(a=rep(1:2,each=3),b=1:6,key="a") -y = data.table(a=c(0,1),bb=c(10,11),key="a") -test(231,merge(y,DT),data.table(a=1L,bb=11,b=1:3,key="a")) -test(232,merge(y,DT,all=TRUE),data.table(a=rep(c(0L,1L,2L),c(1,3,3)),bb=rep(c(10,11,NA_real_),c(1,3,3)),b=c(NA_integer_,1:6),key="a")) -y = data.table(a=c(0,1),key="a") # y with only a key column -test(233,merge(y,DT),data.table(a=1L,b=1:3,key="a")) -test(234,merge(y,DT,all=TRUE),data.table(a=rep(c(0L,1L,2L),c(1,3,3)),b=c(NA_integer_,1:6),key="a")) - -# 'by' when DT contains list columns -DT = data.table(a=c(1,1,2,3,3),key="a") -DT$b=list(1:2,1:3,1:4,1:5,1:6) -test(235,DT[,mean(unlist(b)),by=a],data.table(a=c(1,2,3),V1=c(1.8,2.5,mean(c(1:5,1:6))),key="a")) -test(236,DT[,sapply(b,mean),by=a],data.table(a=c(1,1,2,3,3),V1=c(1.5,2.0,2.5,3.0,3.5),key="a")) - -# when i is a single name, it no longer evaluates within data.table scope -DT = data.table(a=1:5,b=rnorm(5),key="a") -a = list(4) -test(237,DT[a],DT[J(4)]) - -# repeat earlier test with xkey instead of x. xkey is internal to merge; the bigger problem Tom mentioned. -d1 <- data.table(xkey=c(1,3,8),y1=rnorm(3), key="xkey") -d2 <- data.table(xkey=c(3,8,10),y2=rnorm(3), key="xkey") -ans2=cbind(d1[2:3],y2=d2[1:2]$y2);setkey(ans2,xkey) -test(238, merge(d1, d2, by="xkey"), ans2) - -# Join Inherited Scope, and X[Y] including Y's non-join columns -X=data.table(a=rep(1:3,c(3,3,2)),foo=1:8,key="a") -Y=data.table(a=2:3,bar=6:7) -test(239, X[Y,sum(foo),by=.EACHI], data.table(a=2:3,V1=c(15L,15L),key="a")) -test(240, X[Y,sum(foo*bar),by=.EACHI], data.table(a=2:3,V1=c(90L,105L),key="a")) -test(241, X[Y], data.table(a=rep(2:3,3:2),foo=4:8,bar=rep(6:7,3:2),key="a")) -test(242, X[Y,list(foo,bar),by=.EACHI][,sum(foo*bar)], 195L) -test(243, X[Y][,sum(foo*bar)], 195L) -# not sure about these yet : -# test(244, X[Y,sum(foo*bar),mult="first"], data.table(a=2:3,V1=c(24L,49L))) -# test(245, X[Y,sum(foo*bar),mult="last"], data.table(a=2:3,V1=c(36L,56L))) - -# joining to less than all X's key colums (in examples but can't see formal test) -X=data.table(a=rep(LETTERS[1:2],2:3),b=1:5,v=10:14,key="a,b") -test(246.1, X["A"], X[1:2]) # checks that X[1:2] retains key, too -test(246.2, key(X["A"]), c("a","b")) -test(247, X["C"]$v, NA_integer_) -test(248, nrow(X["C",nomatch=0]), 0L) - -x=data.table( a=c("a","b","c"), b=1:3, key="a" ) -y=data.table( a=c("b","d","e"), d=c(8,9,10) ) -test(249, x[y], data.table(a=c("b","d","e"),b=c(2L,NA,NA),d=c(8,9,10))) # keeps i join cols -test(250, x[y,mult="first"], data.table(a=c("b","d","e"),b=c(2L,NA,NA),d=c(8,9,10))) # same - -x=data.table( a=c("a","b","b","c"), b=1:4, key="a" ) -y=data.table(a=c("b","d","b"), d=c(8,9,10)) -test(251, x[y, allow.cartesian=TRUE], data.table(a=c("b","b","d","b","b"),b=c(2:3,NA,2:3),d=c(8,8,9,10,10))) - -# auto coerce float to int in ad hoc by (just like setkey), FR#1051 -DT = data.table(a=INT(1,1,1,2,2),v=1:5) -test(252, DT[,sum(v),by=a], data.table(a=1:2,V1=c(6L,9L))) - -# check that by retains factor columns, since character is now default -DT = data.table(a=factor(c("A","A","A","B","B")),v=1:5) -test(253, DT[,sum(v),by=a], data.table(a=factor(c("A","B")),V1=c(6L,9L))) - -# fix for bug #1298 with by=key(DT) and divisibility error. -DT=data.table(a=c(1,1,1,2,2),b=1:5,key="a") -test(254, DT[,sum(b),by=key(DT)]$V1, c(6L,9L)) - -# for for bug #1294 (combining scanning i and by) -# also see test 88.5 contributed by Johann Hibschman above. -DT = data.table(a=1:12,b=1:2,c=1:4) -test(255, DT[a>5,sum(c),by=b]$V1, c(12L, 7L)) - -# fix for bug #1301 (all.vars() doesn't appear to find fn in fns[[fn]] usage) -DT = data.table(a=1:6,b=1:2,c=letters[1:2],d=1:6) -fns = list(a=max,b=min) -test(256, DT[,fns[[b[1]]](d),by=c]$V1, c(5L,2L)) -test(257, DT[,fns[[c[1]]](d),by=c]$V1, c(5L,2L)) -fns=c(max,min) - -DT = data.table(ID=1:10, SCORE_1=1:10, SCORE_2=11:20, SCORE_3=30:21, fn=c(rep(1, 5), rep(2, 5))) -test(258, DT[,fns[[fn]](SCORE_1,SCORE_2,SCORE_3),by=ID]$V1, c(30:26,6:10)) -test(259, DT[,as.list(fns[[fn]](SCORE_1,SCORE_2,SCORE_3)),by=ID]$V1, c(30:26,6:10)) -test(260, DT[,list(fns[[fn]](SCORE_1,SCORE_2,SCORE_3)),by=ID]$V1, c(30:26,6:10)) - -# fix for bug #1340 - Duplicate column names in self-joins (but print ok) -DT <- data.table(id=1:4, x1=c("a","a","b","c"), x2=c(1L,2L,3L,3L), key="x1") -test(261, DT[DT, allow.cartesian=TRUE][id < i.id]$i.x2, 2L) - -# "<-" within j now assigns in the same environment for 1st group, as the rest -# Thanks to Andeas Borg for highlighting on 11 May - -dt <- data.table(x=c(0,0,1,0,1,1), y=c(0,1,0,1,0,1), z=1:6) -groupInd = 0 -test(262, dt[,list(z,groupInd<-groupInd+1),by=list(x,y)]$V2, c(1,2,2,3,3,4)) -test(263, groupInd, 0) -test(264, dt[,list(z,groupInd<<-groupInd+1),by=list(x,y)]$V2, c(1,2,2,3,3,4)) -test(265, groupInd, 4) - -# Tests for passing 'by' expressions that evaluate to character column -# names in the edge case of 1 row; the character 'by' vector could -# feasibly be intended to be grouping values. Bug 1404; thanks to Andreas Borg -# for the detailed report, suggested fix and tests. - -DT = data.frame(x=1,y="a",stringsAsFactors=FALSE) -DT = as.data.table(DT) -test(266,class(DT$y),"character") # just to check we setup the test correctly -test(267,DT[,sum(x),by=y]$V1,1) -test(268,DT[,sum(x),by="y"]$V1,1) -colvars="y" -test(269,DT[,sum(x),by=colvars]$V1,1) -setkey(DT,y) -test(270,DT[,sum(x),by=key(DT)]$V1,1) - -DT = data.table(x=1,y=2) -setkeyv(DT,names(DT)) -test(271, DT[,length(x),by=key(DT)]$V1, 1L) - -DT = data.table(x=c(1,2,1), y=c(2,3,2), z=1:3) -setkeyv(DT,names(DT)) -test(272, DT[,sum(z),by=key(DT)]$V1, c(1L,3L,2L)) - - -# Tests for .BY and implicit .BY -# .BY is a single row, and by variables are now, too. FAQ 2.10 has been changed accordingly. -DT = data.table(a=1:6,b=1:2) -test(273, DT[,sum(a)*b,by=b]$V1, c(9L,24L)) -test(274, DT[,sum(a)*.BY[[1]],by=b], data.table(b=1:2,V1=c(9L,24L))) -test(275, DT[,sum(a)*bcalc,by=list(bcalc=b+1L)], data.table(bcalc=2:3,V1=c(18L,36L))) -test(276, DT[,sapply(.SD,sum)*b,by=b], data.table(b=1:2,V1=c(9L,24L))) # .SD should no longer include b, unlike v1.6 and before -test(277, DT[,sapply(.SD,sum)*bcalc,by=list(bcalc=b+1L)], data.table(bcalc=2:3,V1=c(18L,36L))) # cols used in by expressions are excluded from .SD, but can still be used in j (by name only and may vary within the group e.g. DT[,max(diff(date)),by=month(date)] -test(278, DT[,sum(a*b),by=list(bcalc=b+1L)], data.table(bcalc=2:3,V1=c(9L,24L))) - - -# Test x==y where either column contain NA. -DT = data.table(x=c(1,2,NA,3,4),y=c(0,2,3,NA,4),z=1:5) -test(279, DT[x==y,sum(z)], 7L) -# In data.frame the equivalent is : -# > DF = as.data.frame(DT) -# > DF[DF$x==DF$y,] -# x y z -# 2 2 2 2 -# NA NA NA NA -# NA.1 NA NA NA -# 5 4 4 5 -# > DF[!is.na(DF$x) & !is.na(DF$y) & DF$x==DF$y,] -# x y z -# 2 2 2 2 -# 5 4 4 5 - - -# Test that 0 length columns are expanded with NA to match non-0 length columns, bug fix #1431 -DT = data.table(pool = c(1L, 1L, 2L), bal = c(10, 20, 30)) -test(280, DT[, list(bal[0], bal[1]), by=pool], data.table(pool=1:2, V1=NA_real_, V2=c(10,30))) -test(281, DT[, list(bal[1], bal[0]), by=pool], data.table(pool=1:2, V1=c(10,30), V2=NA_real_)) -# Test 2nd group too (the 1st is special) ... -test(282, DT[, list(bal[ifelse(pool==1,1,0)], bal[1]), by=pool], data.table(pool=1:2, V1=c(10,NA), V2=c(10,30))) - -# More tests based on Andreas Borg's post of 11 May 2011. -DT = data.table(x=INT(0,0,1,0,1,1), y=INT(1,1,0,1,1,1), z=1:6) -ans = data.table(x=c(0L,1L,1L),y=c(1L,0L,1L),V1=c(1L,1L,2L),V2=c(7L,3L,11L)) -test(283, DT[,list(sum(x[1], y[1]),sum(z)), by=list(x,y)], ans) -test(284, DT[,list(sum(unlist(.BY)),sum(z)),by=list(x,y)], ans) -groupCols = c("x", "y") -test(285, DT[,list(sum(unlist(.BY)),sum(z)),by=groupCols], ans) -groupExpr = quote(list(x,y)) -test(286, DT[,list(sum(unlist(.BY)),sum(z)),by=groupExpr], ans) - -# Bug fix from Damian B on 25 June 2011 : -DT = data.table(X=c(NA,1,2,3), Y=c(NA,2,1,3)) -setkeyv(DT,c("X","Y")) -test(287, unique(DT, by=key(DT)), DT) - -# Bug fix #1421: using vars in calling scope in j when i is logical or integer. -DT = data.table(A=c("a","b","b"),B=c(4,5,NA)) -myvar = 6 -test(288, DT[A=="b",B*myvar], c(30,NA)) - -# Test new feature in 1.6.1 that i can be plain list (such as .BY) -DT = data.table(grp=c("a","a","a","a","b","b","b"),v=1:7) -mysinglelookup = data.table(grp=c("a","b"),s=c(42,84),grpname=c("California","New York"),key="grp") -setkey(mysinglelookup,grp) -test(289, DT[,sum(v*mysinglelookup[.BY]$s),by=grp], data.table(grp=c("a","b"),V1=c(420,1512))) -# In v1.6.2 we will change so that single name j returns a vector, regardless of grouping -test(290, DT[,list(mysinglelookup[.BY]$grpname,sum(v)),by=grp], data.table(grp=c("a","b"),V1=c("California","New York"),V2=c(10L,18L))) - -# Test user defined attributes are retained, see comment in FR#1006 -DT = data.table(a=as.numeric(1:2),b=3:4) -setattr(DT,"myuserattr",42) -setkey(DT,a) # a is numeric so a change of type to integer occurs, too, via := which checks selfref is ok -test(291, attr(DT,"myuserattr"), 42) - -# Test new .N symbol -DT = data.table(a=INT(1,1,1,1,2,2,2),b=INT(3,3,3,4,4,4,4)) -test(292, DT[,.N,by=list(a,b)], data.table(a=c(1L,1L,2L),b=c(3L,4L,4L),N=c(3L,1L,3L))) -test(293, DT[,list(a+b,.N),by=list(a,b)], data.table(a=c(1L,1L,2L),b=c(3L,4L,4L),V1=4:6,N=c(3L,1L,3L))) - -# Test that setkey and := syntax really are by reference, even within functions. You -# really do need to take a copy first to a new name; force(x) isn't enough. - -DT = data.table(a=1:3,b=4:6) -f = function(x){ force(x) - setkey(x) } -f(DT) -test(294,key(DT),c("a","b")) # The setkey didn't copy to a local variable. Need to copy first to local variable (with a new name) if required. - -f = function(x){ force(x) - x[,a:=42L] } -f(DT) -test(295,DT,data.table(a=42L,b=4:6)) # := was by reference (fast) and dropped the key, too, because assigned to key column - -DT = data.table(a=1:3,b=4:6) -f = function(x){ x = copy(x) - setkey(x) } -f(DT) -test(295.1,key(DT),NULL) -setkey(DT,a) -f = function(x){ x = copy(x) - x[,b:=10:12][J(2),b] } # test copy retains key -test(295.2,f(DT),11L) -test(295.3,DT,data.table(a=1:3,b=4:6,key="a")) # The := was on the local copy - - - -# new feature added 1.6.3, that key can be vector. -test(296,data.table(a=1:3,b=4:6,key="a,b"),data.table(a=1:3,b=4:6,key=c("a","b"))) - -# test .SDcols (not speed, just operation) -DT = data.table(grp=1:3,A1=1:9,A2=10:18,A3=19:27,B1=101:109,B2=110:118,B3=119:127,key="grp") -test(297,DT[,list(A1=sum(A1),A2=sum(A2),A3=sum(A3)),by=grp], DT[,lapply(.SD,sum),by=grp,.SDcols=2:4]) - -DT = data.table(a=1:3,b=4:6) -test(298, {DT$b<-NULL;DT}, data.table(a=1:3)) # delete column -test(299.01, {DT$c<-as.character(DT$c);DT}, data.table(a=1:3, c=NA_character_)) # Column c is missing, so DT$c is NULL. -test(299.02, DT[,c:=""], data.table(a=1:3,c="")) -test(299.03, truelength(DT)>length(DT)) # the := over-allocated, by 100 by default, but user may have changed default so just check '>' -# FR #2551 - old 299.3 and 299.5 are changed to include length(RHS) > 1 to issue the warning -DT[,c:=rep(42L,.N)] # plonk -test(299.04, DT, data.table(a=1:3, c=42L)) -test(299.05, DT[2:3,c:=c(42, 42)], data.table(a=1:3,c=42L), warning="Coerced 'double' RHS to 'integer' to match the column's type.*length 3 [(]nrows of entire table[)]") -# FR #2551 - length(RHS) = 1 - no warning for type conversion -test(299.06, DT[2,c:=42], data.table(a=1:3,c=42L)) -# also see tests 302 and 303. (Ok, new test file for fast assign would be tidier). -test(299.07, DT[,c:=rep(FALSE,nrow(DT))], data.table(a=1:3,c=FALSE)) # replace c column with logical -test(299.08, DT[2:3,c:=c(42,0)], data.table(a=1:3,c=c(FALSE,TRUE,FALSE)), warning="Coerced 'double' RHS to 'logical' to match the column's type.*length 3 [(]nrows of entire table[)]") -# FR #2551 is now changed to fit in / fix bug #5442. Stricter warnings are in place now. Check tests 1294.1-34 below. -test(299.09, DT[2,c:=42], data.table(a=1:3,c=c(FALSE,TRUE,FALSE)), warning="Coerced 'double' RHS to 'logical' to match") -test(299.11, DT[2,c:=42L], data.table(a=1:3,c=c(FALSE,TRUE,FALSE)), warning="Coerced 'integer' RHS to 'logical' to match") -test(299.12, DT[2:3,c:=c(0L, 0L)], data.table(a=1:3,c=FALSE), warning="Coerced 'integer' RHS to 'logical' to match the column's type.*length 3 [(]nrows of entire table[)]") - - -# Test bug fix #1468, combining i and by. -DT = data.table(a=1:3,b=1:9,v=1:9,key="a,b") -test(300, DT[J(1),sum(v),by=b], data.table(b=c(1L,4L,7L),V1=c(1L,4L,7L),key="b")) -test(300.1, DT[J(1:2),sum(v),by=b], data.table(b=c(1L,4L,7L,2L,5L,8L),V1=c(1L,4L,7L,2L,5L,8L))) - -# Test ad hoc by of more than 100,000 levels, see 2nd part of bug #1387 (100,000 from the limit of base::sort.list radix) -# This does need to be this large, like this in CRAN checks, because sort.list(method="radix") has this limit, which -# this tests. But it's well under 10 seconds. -DT = data.table(A=1:10,B=rnorm(10),C=factor(paste("a",1:100010,sep=""))) -test(301, nrow(DT[,sum(B),by=C])==100010) -DT = data.table(A=1:10,B=rnorm(10),C=paste("a",1:100010,sep="")) -test(301.1, nrow(DT[,sum(B),by=C])==100010) - -# Test fast assign -DT = data.table(a=c(1L,2L,2L,3L),b=4:7,key="a") -DT[2,b:=42L] # needs to be on its own line to test DT symbol is changed by reference -test(302, DT, data.table(a=c(1L,2L,2L,3L),b=c(4L,42L,6L,7L),key="a")) -DT[J(2),b:=84L] -test(303, DT, data.table(a=c(1L,2L,2L,3L),b=c(4L,84L,84L,7L),key="a")) - -# Test 304 was testing compatibility with package:plyr. Moved to the ggplot2 block above to be moved to a separate test package. - -# Test that changing colnames keep key in sync. -# TO DO: will have to do this for secondary keys, too, when implemented. -DT = data.table(x=1:10,y=1:10,key="x") -setnames(DT,c("a","b")) -test(305, key(DT), "a") -setnames(DT,"a","R") -test(306, key(DT), "R") - -setnames(DT,"b","S") -test(307, key(DT), "R") -setnames(DT,c("a","b")) -test(308, key(DT), "a") -setnames(DT,1,"R") -test(309, key(DT), "R") - -# Test :=NULL -DT = data.table(x=1:5,y=6:10,z=11:15,key="y") -test(310, DT[,x:=NULL], data.table(y=6:10,z=11:15,key="y")) # delete first -test(311, DT[,y:=NULL], data.table(z=11:15)) # deleting key column also removes key -test(312, DT[,z:=NULL], data.table(NULL)) # deleting all -test(313, DT[,a:=1:3], error="") # cannot := a new column to NULL data.table, currently. Must use data.table() -DT = data.table(a=20:22) -test(314, {DT[,b:=23:25];DT[,c:=26:28]}, data.table(a=20:22,b=23:25,c=26:28)) # add in series -test(315, DT[,c:=NULL], data.table(a=20:22,b=23:25)) # delete last -test(316, DT[,c:=NULL], data.table(a=20:22,b=23:25), warning="Adding new column 'c' then assigning NULL") - - -# Test adding, removing and updating columns via [<- in one step -DT = data.table(a=1:6,b=1:6,c=1:6) -DT[,c("a","c","d","e")] <- list(NULL,11:16,42L,21:26) -test(317, DT, data.table(b=1:6,c=11:16,d=42L,e=21:26)) - -# Other assignments (covers DT[x==2, y:=5] too, #1502) -DT[e<24,"b"] <- 99L -test(318, DT, data.table(b=c(99L,99L,99L,4L,5L,6L),c=11:16,d=42L,e=21:26)) -test(319, DT[b!=99L,b:=99L], data.table(b=99L,c=11:16,d=42L,e=21:26)) - -# previous within functionality restored, #1498 -DT = data.table(a=1:10) -test(320, within(DT, {b <- 1:10; c <- a + b})[,list(a,b,c)], data.table(a=1:10,b=1:10,c=as.integer(seq(2,20,length=10)))) -# not sure why within makes columns in order a,c,b, but it seems to be a data.frame thing, too. -test(321, transform(DT,b=42L,e=a), data.table(a=1:10,b=42L,e=1:10)) -DT = data.table(a=1:5, b=1:5) -test(322, within(DT, rm(b)), data.table(a=1:5)) - -# check that cbind dispatches on first argument as expected -test(323, cbind(DT,DT), data.table(a=1:5,b=1:5,a=1:5,b=1:5)) # no check.names as from v1.8.0 (now we have :=, cbind is used far less anyway) -test(324, cbind(DT,data.frame(c=1:5)), data.table(a=1:5,b=1:5,c=1:5)) -test(325, rbind(DT,DT), data.table(a=c(1:5,1:5),b=1:5)) -test(326, rbind(DT,data.frame(a=6:10,b=6:10)), data.table(a=1:10,b=1:10)) - -# test removing multiple columns, and non-existing ones, #1510 -DT = data.table(a=1:5, b=6:10, c=11:15) -test(327, within(DT,rm(a,b)), data.table(c=11:15)) -test(328, within(DT,rm(b,c)), data.table(a=1:5)) -test(329, within(DT,rm(b,a)), data.table(c=11:15)) -test(330, within(DT,rm(b,c,d)), data.table(a=1:5), warning="object 'd' not found") -DT[,c("b","a")]=NULL -test(332, DT, data.table(c=11:15)) -test(333, within(DT,rm(c)), data.table(NULL)) -DT = data.table(a=1:5, b=6:10, c=11:15) -DT[,2:1]=NULL -test(334, DT, data.table(c=11:15)) -test(335, DT[,2:1]<-NULL, error="Attempt to assign to column") - -DT = data.table(a=1:2, b=1:6) -test(336, DT[,z:=a/b], data.table(a=1:2,b=1:6,z=(1:2)/(1:6))) -test(337, DT[3:4,z:=a*b], data.table(a=1:2,b=1:6,z=c(1,1,3,8,1/5,2/6)), warning="Coerced 'integer' RHS to 'double' to match the colum") - - -# test eval of LHS of := (using with=FALSE gives a warning here from v1.9.3) -DT = data.table(a=1:3, b=4:6) -test(338, DT[,2:=42L], data.table(a=1:3,b=42L)) -test(339, DT[,2:1:=list(10:12,3L)], data.table(a=3L,b=10:12)) -test(340, DT[,"a":=7:9], data.table(a=7:9,b=10:12)) -test(341, DT[,c("a","b"):=1:3], data.table(a=1:3,b=1:3)) -mycols = "a" -test(342, DT[,(mycols):=NULL], data.table(b=1:3)) -mynewcol = "newname" -test(343, DT[,(mynewcol):=21L], data.table(b=1:3,newname=21L)) -mycols = 1:2 -test(344, DT[,(mycols):=NULL], data.table(NULL)) - - -# It seems that the .Internal rbind of two data.frame coerces IDate to numeric. Tried defining -# "[<-.IDate" as per Tom's suggestion, and c.IDate to no avail (maybe because the .Internal code -# in bind.c doesn't look up package methods?). Anyway, as from 1.8.1, double are allowed in keys, so -# these still work but for a different reason than before 1.8.1: the results are IDate stored as double, -# rather than before when is worked because by and setkey coerced double to integer. -DF = data.frame(x=as.IDate(c("2010-01-01","2010-01-02")), y=1:6) -DT = as.data.table(rbind(DF,DF)) -test(345, DT[,sum(y),by=x], {.x=as.IDate(c("2010-01-01","2010-01-02"));mode(.x)="double";data.table(x=.x,V1=c(18L,24L))}) -test(346, setkey(DT,x)[J(as.IDate("2010-01-02"))], {.x=as.IDate(rep("2010-01-02",6L));mode(.x)="double";data.table(x=.x,y=rep(c(2L,4L,6L),2),key="x")}) - -# Test .N==0 with nomatch=NA|0, # tests for #963 added as well -DT = data.table(a=1:2,b=1:6,key="a") -test(349, DT[J(2:3),.N,nomatch=NA,by=.EACHI]$N, c(3L,0L)) -test(350, DT[J(2:3),.N,nomatch=0], c(3L)) -# Test first .N==0 with nomatch=NA|0 -test(350.1, DT[J(2:3),.N], c(4L)) -test(350.2, DT[J(4),.N], 1L) -test(350.3, DT[J(4),.N,nomatch=0L], 0L) -test(350.4, DT[J(4:5),.N,nomatch=0L], 0L) -test(350.5, DT[J(0:4),.N,by=.EACHI]$N, c(0L,3L,3L,0L,0L)) -test(350.6, DT[c(0,0,0), .N], 0L) - -# Test recycling list() on RHS of := -DT = data.table(a=1:3,b=4:6,c=7:9,d=10:12) -test(351, DT[,c("a","b"):=list(13:15)], data.table(a=13:15,b=13:15,c=7:9,d=10:12)) -test(352, DT[,letters[1:4]:=list(1L,NULL)], data.table(a=c(1L,1L,1L),c=c(1L,1L,1L))) - -# Test assigning new levels into factor columns -DT = data.table(f=factor(c("a","b")),x=1:4) -test(353, DT[2,f:="c"], data.table(f=factor(c("a","c","a","b")),x=1:4)) -test(354, DT[3,f:=factor("foo")], data.table(f=factor(c("a","c","foo","b")),x=1:4)) - -# Test growVector logic when adding levels (don't need to grow levels for character cols) -newlevels = as.character(as.hexmode(1:2000)) -DT = data.table(f=factor("000"),x=1:2010) -test(355, DT[11:2010,f:=newlevels], data.table(f=factor(c(rep("000",10),newlevels)),x=1:2010)) - -DT = data.table(f=c("a","b"),x=1:4) -# Test coercing factor to character column -test(355.5, DT[3,f:=factor("foo")], data.table(f=c("a","b","foo","b"),x=1:4)) -test(355.6, DT[4,f:=factor("bar"),verbose=TRUE], data.table(f=c("a","b","foo","bar"),x=1:4), output="Coerced factor to character to match the column") - - -# See datatable-help post and NEWS item for 1.6.7 -DT = data.table(X=factor(letters[1:10]), Y=1:10) -DT$X = "Something Different" -test(356, DT, data.table(X=factor("Something Different",levels=c(letters[1:10],"Something Different")), Y=1:10)) - -DT = data.table(X=letters[1:10], Y=1:10) -DT$X = "Something Different" -test(356.5, DT, data.table(X="Something Different", Y=1:10)) - -# Bug fix 1570 -DT = data.table(x=1:5,y=1:5) -test(357, DT[x==0, y:=5L], data.table(x=1:5,y=1:5)) -test(358, DT[FALSE, y:=5L], data.table(x=1:5,y=1:5)) - -# Bug fix 1599 -DT = data.table(a=1:2,b=1:6) -test(359, DT[,sum(b),by=NULL], data.table(V1=21L)) -test(360, DT[,sum(b),by=character(0)], data.table(V1=21L)) - -# Bug fix 1576 : NULL j results in 'inconsistent types' error -DT = data.table(a=1:3,b=1:9) -ans = data.table(a=c(1L,3L),V1=c(12L,18L)) -test(361, DT[,if (a==2) NULL else sum(b),by=a], ans) -test(362, DT[,if (a==2) data.table(NULL) else sum(b),by=a], ans) -test(363, DT[,if (a==2) as.list(NULL) else sum(b),by=a], ans) -test(364, DT[,if (a==2) integer(0) else sum(b),by=a], ans) - -# Test that data.table() can create list() columns directly -# NB: test 235 above ('by' when DT contains list columns) created the list column in two steps, no longer necessary -DT = data.table(a=1:2,b=list("h",7:8)) -test(365, DT[1,b], list("h")) # should it be a special case for 1-item results to unlist? Don't think so: in keeping with no drop=TRUE principle -test(366, DT[2,b], list(7:8)) -DT = data.table(a=1:4,b=list("h",7:8),c=list(matrix(1:12,3),data.table(a=letters[1:3],b=list(1:2,3.4,"k"),key="a"))) -test(367, DT[3,b], list("h")) -test(368, DT[4,b], list(7:8)) -test(369, DT[3,c[[1]][2,3]], 8L) -test(370, DT[4,c[[1]]["b",b]][[1]], 3.4) - -# Test returning a list() column via grouping -DT = data.table(x=INT(1,1,2,2,2),y=1:5) -test(371, DT[,list(list(unique(y))),by=x], data.table(x=1:2,V1=list(1:2,3:5))) - -# Test matrix i is an error -test(372, DT[matrix(1:2,ncol=2)], error="i is invalid type (matrix)") - -# Tests from bug fix #1593 -DT = data.table(x=letters[1:2], y=1:4) -DT[x == "a", ]$y <- 0L -test(373, DT, data.table(x=letters[1:2], y=c(0L,2L,0L,4L))) -DT = data.table(x=letters[1:2], y=1:4, key="x") -DT["a", ]$y <- 0L -test(374, DT, data.table(x=letters[1:2], y=c(0L,2L,0L,4L), key="x")) -DT = data.table(x=letters[1:2], y=1:4) -DT[c(1,3), ]$y <- 0L -test(375, DT, data.table(x=letters[1:2], y=c(0L,2L,0L,4L))) - -# Test unique on unsorted tables (and tolerance on numeric columns, too) -DT = data.table(a=c(2,1,2),b=c(1,2,1)) -test(376, unique(DT), data.table(a=c(2,1),b=c(1,2))) -# From the SO thread : -M = matrix(sample(2, 120, replace = TRUE), ncol = 3) -DF = as.data.frame(M) -DT = as.data.table(M) -test(377, as.data.table(unique(DF)), unique(DT)) - -# Test compatibility with sqldf. sqldf() does a do.call("rbind" with empty input, -# so this tests ..1 when NULL (which was insufficiently list(...)[[1]] in 1.6.6). -# We now test this directly rather than using sqldf, because we couldn't get 'R CMD check' -# past "(converted from warning) closing unused connection 3 (/tmp/RtmpYllyW2/file55822c52)" -test(378, cbind(), NULL) -test(379, rbind(), NULL) - -DT = data.table(a=rep(1:3,1:3),b=1:6) -test(380, DT[,{.SD$b[1]=10L;.SD}, by=a], error="locked binding") # .SD locked for 1st group -test(381, DT[,{if (a==2) {.SD$b[1]=10L;.SD} else .SD}, by=a], error="locked binding") # .SD locked in 2nd group onwards too - -# test that direct := is trapped, but := within a copy of .SD is allowed (FAQ 4.5). See also tests 556-557. -test(382, DT[,b:=.N*2L,by=a], data.table(a=rep(1:3,1:3),b=rep(2L*(1:3),1:3))) -test(383, DT[,{z=10L;b:=z},by=a], error=":= and `:=`(...) are defined for use in j, once only and in particular ways") -test(384, DT[,{mySD=copy(.SD);mySD[1,b:=99L];mySD},by=a], data.table(a=rep(1:3,1:3),b=c(99L,99L,4L,99L,6L,6L))) - -# somehow missed testing := on logical subset with mixed TRUE/FALSE, reported by Muhammad Waliji -DT = data.table(x=1:2, y=1:6) -test(385, DT[x==1, y := x], data.table(x=1:2,y=c(1L,2L,1L,4L,1L,6L))) -test(386.1, DT[c(FALSE,TRUE)], error="i evaluates to.*Recycling of logical i is no longer allowed.*use rep.*[.]N") -test(386.2, DT[rep(c(FALSE,TRUE),length=.N),y:=99L], data.table(x=1:2,y=c(1L,99L,1L,99L,1L,99L))) - -# test that column names have the appearance of being local in j (can assign to them ok), bug #1624 -DT = data.table(name=c(rep('a', 3), rep('b', 2), rep('c', 5)), flag=FALSE) -test(387, DT[,{flag[1]<-TRUE;list(flag=flag)}, by=name], DT[c(1,4,6),flag:=TRUE]) -DT = data.table(score=1:10, name=c(rep('a', 4), rep('b',2), rep('c', 3), 'd')) -test(388, DT[,{ans = score[1] - score[1] <- -score[1] - ans - },by=name], - data.table(name=letters[1:4],V1=c(1L,5L,7L,10L))) - -# Tests 389-394 (character grouping and sorting) now at the start of this file, so that any -# errors elsewhere show up in the last 13 lines displayed by CRAN checks. - -# Test unique.data.table for numeric columns within tolerance, for consistency with -# with unique.data.frame which does this using paste. -old_rounding = getNumericRounding() -DT = data.table(a=tan(pi*(1/4 + 1:10)),b=42L) -# tan(...) from example in ?all.equal. -test(395, all.equal(DT$a, rep(1,10))) -test(396, length(unique(DT$a))>1) # 10 unique values on all CRAN machines (as of Nov 2011) other than mac (5 unique) -# commenting these two as they give different results on os x and linux. -# test(397.1, unique(DT), DT[duplicated(DT)]) # default, no rounding -# test(398.1, duplicated(DT), c(FALSE, FALSE, FALSE, TRUE, FALSE, TRUE, TRUE, TRUE, TRUE, FALSE)) -setNumericRounding(2L) -test(397.2, unique(DT), DT[1]) # before v1.7.2 unique would return all 10 rows. For stability within tolerance, data.table has it's own modified numeric sort. -test(398.2, duplicated(DT), c(FALSE,rep(TRUE,9))) -setNumericRounding(old_rounding) - -DT = data.table(a=c(3.142, 4.2, 4.2, 3.142, 1.223, 1.223), b=rep(1,6)) -test(399, unique(DT), DT[c(1,2,5)]) -test(400, duplicated(DT), c(FALSE,FALSE,TRUE,TRUE,FALSE,TRUE)) - -DT[c(2,4,5),a:=NA] -test(401, unique(DT), DT[c(1,2,3,6)]) -test(402, duplicated(DT), c(FALSE,FALSE,FALSE,TRUE,TRUE,FALSE)) - -# Test NULL columns next to non-NULL, #1633 -DT = data.table(a=1:3,b=4:6) -test(403, DT[,list(3,if(a==2)NULL else b),by=a], data.table(a=1:3,V1=3,V2=c(4L,NA_integer_,6L))) -test(404, DT[,list(3,if(a==1)NULL else b),by=a], error="Please use a typed empty vector instead.*such as integer.*or numeric") -test(405, DT[,list(3,if(a==1)numeric() else b),by=a], error="Column 2 of result for group.*integer.*double.*types must be consistent for each group") -test(406, DT[,list(3,if(a==1)integer() else b),by=a], data.table(a=1:3,V1=3,V2=c(NA_integer_,5:6))) - -# Test that first column can be list, #1640 -test(407, data.table(list(1:2,3:5)), as.data.table(list(list(1:2,3:5)))) - -# With over-allocation, null data.table has truelength 100. Replaced the calls to structure() in the -# code to new null.data.table(), so test internal function. User may have changed default, so this -# doesn't test "100" explicitly. -test(408, null.data.table(), data.table(NULL)) -test(408.5, data.table(), data.table(NULL)) - -# Test that adding a column using := is fully by reference rather than a shallow copy, #1646 -DT = data.table(1:2,3:4) # list vector truelength 100 -DT2 = DT -DT2[,y:=10L] -test(409, DT, DT2) -test(410, DT, data.table(1:2,3:4,y=10L)) -DT2[1,V1:=99L] -test(411, DT, DT2) -test(412, DT, data.table(c(99L,2L),3:4,y=10L)) - -# Test that cbind dispatched to data.table() and retains keys -DT = data.table(x=c("a","b"),y=1:4,key="x") -test(413.1, key(cbind(DT,DT)), NULL) # key dropped because name "x" ambiguous -DT1 = data.table(z = c(1,2), w = 1:4, key = "z") -test(413.2, key(cbind(DT,DT1)), c("x", "z")) -test(413.3, key(cbind(colA=10:13, DT)), "x") # data.table() dispatched even though 1st argument isn't data.table -test(413.4, key(cbind(colA=10:17, DT)), NULL) # DT recycled so key is dropped -test(413.5, key(cbind(colA=1, DT)), "x") # DT not recycled so key retained -test(414.1, key(cbind(DT,as.data.frame(DT1))), "x") - -test(414.2, cbind(as.data.frame(DT),DT1), data.frame(DT,DT1)) -# cbind(DF,...) should return a data.frame for consistency with base. Package treemap (at least) depends -# on this in the return() in treepalette(). -# Use data.table(DF,DT) if a data.table result is required. - - -# Test friendly error when := is used in wrong place -test(415, x:=1, error="defined for use in j, once only and in particular ways") - -# Somehow never tested that X[Y] is error if X is unkeyed. -DT = data.table(a=1:3,b=4:6) -test(416, DT[J(2)], error="the columns to join by must be specified either using") - -# Test shallow copy verbose message from := adding a column, and (TO DO) only when X is NAMED. -DT = data.table(a=1:3,b=4:6) -test(417, alloc.col(DT,3,verbose=TRUE), DT, output="Attempt to reduce allocation from.*to 5 ignored. Can only increase allocation via shallow copy") -old = options(datatable.alloccol=1L) -DT = data.table(a=1:3,b=4:6) -options(old) -DT2 = DT -test(418, length(DT)==2 && truelength(DT)==3) -DT[,c:=7L] # uses final slot -test(419, DT, DT2) -test(420, length(DT)==3 && truelength(DT)==3 && length(DT2)==3 && truelength(DT2)==3) -test(421, DT[,d:=8L,verbose=TRUE], output="Growing vector of column pointers from") -test(422, length(DT)==4) -test(423, truelength(DT), 1028L) - -# Test crash bug fixed, #1656, introduced with the 1.7.0 feature -DT <- data.table(a = factor(c("A", "Z")), b = 1:4) -DT[1,1] <- "Z" -test(424, DT, data.table(a=factor(c("Z","Z","A","Z")),b=1:4)) -test(425, DT[1,1] <- 1, 1, warning="Coerced 'double' RHS to 'integer'") -test(426, DT, data.table(a=factor(c("A","Z")),b=1:4)) -DT[1,1] <- 2L -test(427, DT, data.table(a=factor(c("Z","Z","A","Z")),b=1:4)) -DT[1,a:="A"] -test(428, DT, data.table(a=factor(c("A","Z","A","Z")),b=1:4)) -DT[1,a:=2L] -test(429, DT, data.table(a=factor(c("Z","Z","A","Z")),b=1:4)) -test(430, DT[1,1]<- 3L, NA_integer_, warning="RHS contains 3 which is outside the levels range.*1,2.*of column 1, NAs generated") -test(431, DT[1,1:=4L], data.table(a=factor(c(NA,"Z","A","Z")),b=1:4), warning="RHS contains 4 which is outside the levels range.*1,2.*of column 1, NAs generated") - - -old = getOption("datatable.alloccol") -options(datatable.alloccol=NULL) # In this =NULL case, R 3.0.0 returns TRUE rather than the old value. - # Hence split out into separate getOption() first. - # This was an R bug fixed in R 3.1.1. -test(432.1, data.table(a=1:3,b=4:6), error="Has getOption('datatable.alloccol') somehow become unset?") -options(datatable.alloccol=old) - -# simple realloc test -DT = data.table(a=1:3,b=4:6) -test(432.2, truelength(DT), 1026L) -alloc.col(DT,200) # should have no affect since 200<1024 -test(433, truelength(DT), 1026L) -DT = alloc.col(DT,2000) # test the superfluous DT = -test(434, truelength(DT), 2002L) -DT2 = alloc.col(DT,3000) # DT changed then DT2 pointed to it -test(435, truelength(DT), 3002L) -test(436, truelength(DT2), 3002L) - -# test that alloc.col assigns from within functions too (i.e. to wherever that object is) -DT = data.table(a=1:3,b=4:6) # tl 1024 now by default -test(437.1, truelength(DT), 1026L) -f = function() { - alloc.col(DT,2042) # DT isn't local so (via inherits=TRUE) it finds in frame above. - invisible() -} -f() -test(437.2, truelength(DT), 2044L) - -# quick test that [<- over allocates (again) after the copy of length via *tmp* -DT = data.table(a=1:3,b=4:6) -tl = truelength(DT) -DT$foo = 7L -test(438, truelength(DT), tl+1L) # the (not recommended) $<- calls a new alloc.col, hence tl becomes +1 -DT[,"bar"] = 8L -test(439, truelength(DT), tl+2L) -test(440, DT, data.table(a=1:3,b=4:6,foo=7L,bar=8L)) - -# Test rbind works by colname now, for consistency with base, FR#1634 -DT = data.table(a=1:3,b=4:6) -test(441, rbind(DT,list(a=4L,b=7L)), data.table(a=1:4,b=4:7)) -test(442, rbind(DT,data.frame(a=4L,b=7L)), data.table(a=1:4,b=4:7)) -test(443, rbind(DT,data.table(a=4L,b=7L)), data.table(a=1:4,b=4:7)) -test(444, rbind(DT,list(b=7L,a=4L)), data.table(a=1:4,b=4:7)) # rbind should by default check row names. Don't warn here. Add clear documentation instead. -test(445, rbind(DT,data.frame(b=7L,a=4L)), data.table(a=1:4,b=4:7)) -test(446, rbind(DT,data.table(b=7L,a=4L)), data.table(a=1:4,b=4:7)) -test(450, rbind(DT,list(c=4L,a=7L)), error="This could be because the items in the list may not ") -test(451, rbind(DT,data.frame(c=4L,a=7L)), error="This could be because the items in the list may not ") -test(452, rbind(DT,data.table(c=4L,a=7L)), error="This could be because the items in the list may not ") -test(453, rbind(DT,list(4L,7L)), data.table(a=1:4,b=4:7)) - -# Test new use.names argument in 1.8.0 -test(453.1, rbind(DT,list(FOO=4L,BAR=7L),use.names=FALSE), data.table(a=1:4,b=4:7)) -test(453.2, rbind(DT,data.table(b=4:5,a=7:8), use.names=FALSE), data.table(a=1:5,b=4:8)) - -# Test the linked reported bug, #1645 -A1 = data.table(b='hello', a='foo', key='a') -A2 = data.table(a=c('foo', 'bar'), key='a') -test(454, merge(A1, A2, all.y=TRUE, by='a'), data.table(a=c("bar","foo"),b=c(NA,"hello"),key="a")) -A1 = data.table(a='foo', b='hello', key='a') -test(455, merge(A1, A2, all.y=TRUE, by='a'), data.table(a=c("bar","foo"),b=c(NA,"hello"),key="a")) - -# Test mixing nomatch=0 and mult="last", bug #1661 -DT = data.table(id=c(1L, 2L, 2L, 3L), val=1:4, key="id") -test(456, DT[J(c(1,2,4)), mult="last", nomatch=0], data.table(id=1:2,val=c(1L,3L),key="id")) - -# Test join inherited scope respexts nomatch=0, #1663 -DT2 = data.table(id=c(1L,2L,4L), val2=c(11,12,14),key="id") -test(457, DT[DT2, list(val, val2), nomatch=0, by=.EACHI], data.table(id=c(1L,2L,2L),val=1:3,val2=c(11,12,12),key="id")) - -# Test bysameorder edge cases, #1631 -DT = data.table(a=1:3,v=4:9,key="a") -test(458, DT[,sum(v),by=list(a%%2L)], data.table(a=c(1L,0L),V1=c(26L,13L))) -test(459, DT[, list(sum(v)), list(ifelse(a == 2, NA, 1L))], data.table(ifelse=c(1L,NA_integer_),V1=c(26L,13L))) -test(460, DT[, list(sum(v)), list(ifelse(a == 2, 1, NA))], data.table(ifelse=c(NA_real_,1),V1=c(26L,13L))) -test(461, DT[,sum(v),by=a], data.table(a=1:3,V1=c(11L,13L,15L),key="a")) - -# Test loading from file (which resets tl to 0 in R 2.14.0+, and unitialized random number in 2.13.2-) -f = tempfile() -save(list="DT",file=f) -load(f) -test(462, DT[,foo:=10L], data.table(a=1:3,v=4:9,foo=10L,key="a")) -unlink(f) - -# Test CJ problems with v1.7.4, #1689 -test(463, all(sapply(CJ(1:2,1:3),length)==6L)) -DT = data.table(x=1:4,y=1:2,cnt=1L,key="x,y") -test(464, DT[CJ(1:4,1:4)]$cnt, INT(1,rep(NA,4),1,NA,NA,1,rep(NA,4),1,NA,NA)) -test(465, DT[CJ(1:4,1:4), sum(cnt>0), by=.EACHI]$y, rep(1:4,4)) -f1 = factor(c("READING","MATHEMATICS")) -f2 = factor(c("2010_2011","2009_2010","2008_2009"), levels=paste(2006:2010,2007:2011,sep="_")) -test(466, all(sapply(CJ(f1, f2),length)==6L)) - -# Test list(.SD,newcol=..) gives error with guidance -DT = data.table(a=1:2,v=3:6) -test(467, DT[,list(newcol=7L,.SD),by=a], error="use := by group instead") - -# Test empty list column -DT = data.table(a=1:3,b=4:6) -test(468, DT[,foo:=list()], data.table(a=1:3,b=4:6,foo=list())) -# Test plonk list -test(469, DT[,bar:=list(1,"a",3.14)], data.table(a=1:3,b=4:6,foo=list(),bar=list(1,"a",3.14))) -# Test plonk list variable (to catch deparse treating j=list() specially) -x = list(2,"b",2.718) -test(470, DT[,baz:=x], data.table(a=1:3,b=4:6,foo=list(),bar=list(1,"a",3.14),baz=list(2,"b",2.718))) -# Test recycling list -DT = data.table(a=1:4,b=5:8) -test(471, DT[,foo:=list("a",2:3)], data.table(a=1:4,b=5:8,foo=list("a",2:3,"a",2:3))) -# Test recycling singleton list -DT[,foo:=NULL] -test(472, DT[,foo:=list(list(2:3))], data.table(a=1:4,b=5:8,foo=list(2:3,2:3,2:3,2:3))) - -# Test adding new column with a recycled factor, #1691 -DT = data.table(a=1:4,b=5:8) -DT[,c:=factor("a")] -test(473, DT, data.table(a=1:4,b=5:8,c=factor(c("a","a","a","a")))) -DT[,d:=factor(c("a","b"))] -test(474, DT, data.table(a=1:4,b=5:8,c=factor(c("a","a","a","a")),d=factor(c("a","b","a","b")))) - -# Test scoping error introduced at 1.6.1, unique(DT) when key column is 'x' -DT=data.table(x=c("a", "a", "b", "b"), y=c("a", "a", "b", "b"), key="x") -test(475, unique(DT, by=key(DT)), data.table(x=c("a","b"),y=c("a","b"),key="x")) - -# Test character and list columns in tables with many small groups -N = 100L -DT = data.table(grp=1:(2*N),char=sample(as.hexmode(1:N),4*N,replace=TRUE),int=sample(1:N,4*N,replace=TRUE)) -ans = DT[,list(p=paste(unique(char),collapse=","), - i=list(unique(int))), by=grp] -test(476, nrow(as.matrix(ans)), 2L*N) -# The as.matrix triggerd the "'getCharCE' must be called on a CHARSXP", or similar symptom of earlier corruption, before the fix in dogroups.c. - -# Test that plonking from calling scope works, even after removing, and column copy via := is ok too. -DT = data.table(a=1:3) -foo = 4:6 -DT[,foo:=foo] -rm(foo) -gc() -DT[,foo2:=foo] -DT[2,foo:=10L] -DT[3,foo2:=11L] -gc() -test(477, DT, data.table(a=1:3,foo=c(4L,10L,6L),foo2=c(4L,5L,11L))) -test(478, DT[,foo:=foo], DT) # does nothing, with no warning, consistent with base R `a<-a`. - -# Test that recycling now works with oversized inputs and % != 0 length, both with warnings. -DT = data.table(x=1:4) -test(479, DT[, a:=5:7], data.table(x=1:4,a=c(5:7,5L)), warning="Supplied 3 items to be assigned to 4 items of column 'a' (recycled leaving remainder of 1 items)") - -# Test that multiple columns can be added -DT = data.table(x=1:4) -test(481, DT[, c("foo","bar"):=list(10L,11:14)], data.table(x=1:4,foo=10L,bar=11:14)) - -# and combined with update and add in one step -test(482, DT[, c("foo","baz"):=list(12L,15:18)], data.table(x=1:4,foo=12L,bar=11:14,baz=15:18)) - -# Test that errors in := do not leave DT in bad state, #1711 -DT = data.table(x=1:4) -test(483.1, DT[,c("foo","bar"):=list(20L,stop('user error'))], error="user error") -test(483.2, DT, data.table(x=1:4)) # i.e. DT as it was before, without foo being added as it did in v1.7.7- -# The test used to be as follows but as from v1.9.8, the empty numeric() now works and creates a NA_real_ column -test(484, DT[,c("foo","bar"):=list(20L,numeric())], data.table(x=1:4, foo=20L, bar=NA_real_)) - -# Test i's key longer than x's -d1 <- data.table(a=1:2, b=11:14, key="a,b") -d2 <- data.table(A=0:1, B=1:4, key="A") -test(485, d2[d1, allow.cartesian=TRUE], data.table(A=INT(1,1,1,1,2,2),B=INT(2,4,2,4,NA,NA),b=INT(11,11,13,13,12,14),key="A")) -test(486, d2[d1,sum(B),by=.EACHI], data.table(A=INT(1,1,2,2),V1=INT(6,6,NA,NA),key="A")) # no allow.cartesian needed due to by-without-by - -# Test base R's reshape. There is no reshape() function in package:reshape. -DT <- data.table(ID=rep(1:3, each=3), TIME=rep(1:3, 3), X=1:9) -test(487, data.table(stats::reshape(DT, idvar="ID", timevar="TIME", direction="wide")), - data.table(ID=1:3,X.1=INT(1,4,7),X.2=INT(2,5,8),X.3=INT(3,6,9))) -# The data.table() around reshape above is to drop reshape's attributes. -DT <- data.table(ID=rep(1:3, each=3), TIME=rep(1:3, 3), X=1:9, Y=10:18) -test(488, data.table(stats::reshape(DT, idvar="ID", timevar="TIME", direction="wide")), - data.table(ID=1:3,X.1=INT(1,4,7),Y.1=INT(10,13,16),X.2=INT(2,5,8),Y.2=INT(11,14,17),X.3=INT(3,6,9),Y.3=INT(12,15,18))) - -# Test warnings for names<- and colnames<-, but only warnings when caller is data.table aware. -DT = data.table(a=1:3,b=4:6) -test(489, names(DT)[1]<-"A", "A") # needs R >= 3.1.0, which is stated dependency now -test(490, names(DT), c("A","b")) -test(491, colnames(DT)[2]<-"B", "B") -test(492, names(DT), c("A","B")) - -# Check setnames out of bounds errors -test(493, setnames(DT,"foo","bar"), error="not found.*foo") -test(494, setnames(DT,3,"bar"), error="outside range.*3") - -# Test setcolorder() and allowance of length(neworder)")) -test(559, setkey(DT,x)["a",y][[1]], 1:10) # y is symbol representing list column, specially detected in dogroups - -# Test renaming of .N to N -DT = data.table(a=INT(1,1,2,2,2),b=INT(1,2,2,2,1)) -test(560.1, DT[,.N,a][,.N], 2L) -test(560.2, DT[,.N,a][,N], 2:3) -test(561, DT[,.N,a][,N], 2:3) -test(562, DT[,list(.N),a][,N], 2:3) -test(563, DT[,.N,a][,unique(.N),a]$V1, c(1L,1L)) -test(564, DT[,.N,a][,unique(N),a]$V1, 2:3) -test(565, DT[,.N,a][N>2], data.table(a=2L, N=3L)) -test(566, DT[,list(.N=.N),a][.N>2], data.table(a=2L,.N=3L)) -test(567, DT[,.N,list(a,b)][,N,by=a]$N, c(1L,1L,2L,1L)) -test(568, DT[,.N,list(a,b)][,unique(N),by=a]$V1, c(1L,2L,1L)) -test(569, DT[,list(.N=.N),list(a,b)][,.N,a], error="The column '.N' can't be grouped because") -test(570, DT[,list(.N=.N),list(a,b)][,unique(.N),a], error="The column '.N' can't be grouped because") - -# Test spaces in by="..." format, datatable-help on 31 March -DT = data.table("a "=1:2, "b"=3:4," b"=5:6, v=1:6) -test(571, DT[,sum(v),by="b, b"], data.table("b"=3:4, " b"=5:6, V1=c(9L,12L))) -test(572, DT[,sum(v),by="a , b"], data.table("a "=1:2, " b"=5:6, V1=c(9L,12L))) -test(573, DT[,sum(v),by="b, a"], error="object ' a' not found") - -# Test base::unname, used by melt, and only supported by data.table for DF compatibility for non-dtaware packages -DT = data.table(a=1:3, b=4:6) -test(574, dim(unname(DT)), 3:2) - -# Test that CJ retains explicit names (useful if used independently) -test(575, CJ(x=c(1L,2L), y=c("a","b")), data.table(x=c(1L,1L,2L,2L),y=c("a","b","a","b"),key="x,y")) -test(576, CJ(c(1L,2L), y=c("a","b")), data.table(V1=c(1L,1L,2L,2L),y=c("a","b","a","b"),key="V1,y")) -test(577, CJ(x=c(1L,2L), c("a","b")), data.table(x=c(1L,1L,2L,2L),V2=c("a","b","a","b"),key="x,V2")) - -# Test factor to character join when factor contains unused and reverse order levels : -X = data.table(a=LETTERS[1:4],v=1:4,key="a") -Y = data.table(a=factor(c("D","B"),levels=rev(LETTERS)),key="a") -test(578, X[Y,verbose=TRUE], output="Coercing factor column i.'a' to character to match type of x.'a'") -test(579, X[Y], data.table(a=c("D","B"), v=c(4L,2L))) - -# Test that logical i in set() returns helpful error -DT = data.table(a=1:3,b=4:6) -test(580, set(DT,a<3,"b",0L), error="simply wrap with which(), and take the which() outside the loop if possible for efficiency") - -# Test by on empty tables (and when i returns no rows), #1945 -DT = data.table(a=1:3,v=1:6) -test(581, DT[a<1,sum(v),by=a], data.table(a=integer(),V1=integer())) -test(582, DT[a<1,sum(v),by=list(a)], data.table(a=integer(),V1=integer())) -test(583, DT[a<1], DT[0]) -test(584, DT[a<1], output="Empty data.table (0 rows) of 2 cols: a,v") -test(585, DT[a<1,list(v)], output="Empty data.table (0 rows) of 1 col: v") -test(586, data.table(a=integer(),V1=integer()), output="Empty data.table (0 rows) of 2 cols: a,V1") - -# Test that .N is available in by on empty table, also in #1945 -test(587, DT[a<1,list(sum(v),.N),by=a], data.table(a=integer(),V1=integer(),N=integer())) - -# Realised that DT[NULL] returned an error. -test(588, DT[NULL], data.table(NULL)) - -# Test that .N, .SD and .BY are available when by is missing and when by is 0 length -DT = data.table(x=rep(1:3,each=3), y=c(1,3,6), v=1:9) -test(589, DT[,sapply(.SD,sum)*.N], c(x=162, y=270, v=405)) -test(590, DT[,sapply(.SD,sum)*.N,by=NULL], data.table(V1=c(162,270,405))) -test(591, DT[,sapply(.SD,sum)*.N,by=character()], data.table(V1=c(162,270,405))) -test(592, DT[,sapply(.SD,sum)*.N,by=""], data.table(V1=c(162,270,405))) -test(593, DT[,lapply(.SD,sum)], data.table(x=18L, y=30, v=45L)) # bug fix #2263 in v1.8.3: now data.table result for consistency -test(594, DT[,lapply(.SD,sum),by=NULL], data.table(x=18L, y=30, v=45L)) -test(595, DT[,lapply(.SD,sum),by=character()], data.table(x=18L, y=30, v=45L)) -test(596, DT[,lapply(.SD,sum),by=""], data.table(x=18L, y=30, v=45L)) - -# Test keys of two numeric columns, bug#2004 -DT = data.table(x=0.0,y=c(0.0,0.1,0.0,0.2,0.0)) -test(597, unique(DT), DT[c(1,2,4)]) -test(598, DT[,list(count=.N),by=c("x","y")], data.table(x=0.0,y=c(0.0,0.1,0.2),count=c(3L,1L,1L))) - -# And that numeric NAs sort stably to the beginning. Whether NAs are allowed in keys, another issue but -DT = data.table( c(1.34, 1.34, 1.34, NA, 2.22, 2.22, 1.34, NA, NA, 1.34, 0.999), c(75.1, NA, 75.1, 75.1, 2.3, 2.4, 2.5, NA, 1.1, NA, 7.9 )) -test(599, DT[c(8,9,4,11,2,10,7,1,3,5,6)], setkey(setkey(DT),NULL)) - -set.seed(1) -DT = data.table(x=rep(c(1,2), each=10), y=rnorm(20)) -setkey(DT, x, y) -test(600, is.sorted(DT$x)) -test(601, !is.sorted(DT$y)) -test(602, base::order(DT$x,DT$y), 1:20) - -## #2331 test that repeated setting of key works -test(602.1, setkey(copy(DT), x, y), DT) -test(602.2, setkey(copy(DT), x), {setkey(DT, NULL); setkey(DT, x)}) - -# Crash bug of chorder(character()), #2026 -test(609, chorder(character()), base::order(character())) -test(610, chorder(""), base::order("")) -# Extra tests of chorder and chgroup -x = sample(LETTERS) -test(610.1, chorder(x), base::order(x)) -test(610.2, chgroup(x), seq_along(x)) -x = sample(LETTERS,1000,replace=TRUE) -test(610.3, chorder(x), base::order(x)) -test(610.4, unique(x[chgroup(x)]), unique(x)) - -# := by group -DT = data.table(a=1:3,b=(1:9)/10) -test(611, DT[,v:=sum(b),by=a], data.table(a=1:3,b=(1:9)/10,v=c(1.2,1.5,1.8))) -setkey(DT,a) -test(612, DT[,v:=min(b),by=a], data.table(a=1:3,b=(1:9)/10,v=(1:3)/10,key="a")) -# Assign to subset ok (NA initialized in the other items) ok : -test(613, DT[J(2),w:=8.3]$w, rep(c(NA,8.3,NA),each=3)) -test(614, DT[J(3),x:=9L]$x, rep(c(NA_integer_,NA_integer_,9L),each=3)) -test(615, DT[J(2),z:=list(list(c(10L,11L)))]$z, rep(list(NULL, 10:11, NULL),each=3)) -# Combining := by group with i -test(616, DT[a>1,p:=sum(b)]$p, rep(c(NA,3.3),c(3,6))) -test(617, DT[a>1,q:=sum(b),by=a]$q, rep(c(NA,1.5,1.8),each=3)) - -# Empty i clause, #2034. Thanks to Chris for testing, tests from him. Plus changes from #759 -ans = copy(DT)[,r:=NA_real_] -test(618, copy(DT)[a>3,r:=sum(b)], ans) -test(619, copy(DT)[J(-1),r:=sum(b)], ans) -test(620.1, copy(DT)[NA,r:=sum(b)], ans) -test(620.2, copy(DT)[0,r:=sum(b)], ans) -test(620.3, copy(DT)[NULL,r:=sum(b)], null.data.table()) - -DT = data.table(x=letters, key="x") -test(621, copy(DT)[J("bb"), x:="foo"], DT) # when no update, key should be retained -test(622, copy(DT)[J("bb"), x:="foo",nomatch=0], DT, warning="ignoring nomatch") - -set.seed(2) -DT = data.table(a=rnorm(5)*10, b=1:5) -test(623, DT[,s:=sum(b),by=round(a)%%2]$s, c(10L,5L,5L,10L,10L)) - -# Tests on POSIXct attributes - -DT = data.table(a=c(1,1,2,2,2)) -test(624, attributes(DT[,as.POSIXct("2011-12-13 18:50",tz="EST"),by=a][[2]]), list(class=c("POSIXct","POSIXt"),tzone="EST")) - -DT = data.table(x = rnorm(5)) -DT$time1 <- Sys.time() # recycle via *tmp* -DT$time2 <- rep(Sys.time(), 5) # plonk via *tmp* -DT[,time3:=Sys.time()] # recycle -DT[,time4:=rep(Sys.time(),5)] # plonk -test(625, all(sapply(DT,is,"POSIXct")[-1])) - -# unique on ITime doesn't lose attributes, #1719 -t = as.ITime(strptime(c("09:10:00","09:11:00","09:11:00","09:12:00"),"%H:%M:%S")) -test(626, unique(t), t[c(1,2,4)]) -test(627, class(unique(t)), "ITime") - -# Test recycling list() rbind - with recent C-level changes, this seems not possible (like rbindlist) -# old test commented. -# test(628, rbind(data.table(a=1:3,b=5:7,c=list(1:2,1:3,1:4)), list(4L,8L,as.list(1:3))), -# data.table(a=c(1:3,rep(4L,3L)),b=c(5:7,rep(8L,3L)),c=list(1:2,1:3,1:4,1L,2L,3L))) -test(628, rbind(data.table(a=1:3,b=5:7,c=list(1:2,1:3,1:4)), list(4L,8L,as.list(1:3))), error = "inconsistent with first column of that item which is length") -# Test switch in .rbind.data.table for factor columns -test(628.5, rbind(data.table(a=1:3,b=factor(letters[1:3]),c=factor("foo")), list(4L,factor("d"),factor("bar"))), - data.table(a=1:4,b=factor(letters[1:4]),c=factor(c(rep("foo",3),"bar"), levels = c("foo", "bar")))) - -# Test merge with common names and all.y=TRUE, #2011 -DT1 = data.table(a=c(1,3,4,5), total=c(2,1,3,1), key="a") -DT2 = data.table(a=c(2,3,5), total=c(5,1,2), key="a") -# 629+630 worked before anyway. 631+632 test the bug fix. -adf=as.data.frame -adt=as.data.table - -test(629, merge(DT1,DT2), data.table(a=c(3,5),total.x=c(1,1),total.y=c(1,2),key="a")) -test(629.1, merge(DT1,DT2), setkey(adt(merge(adf(DT1),adf(DT2),by="a")),a)) - -test(630, merge(DT1,DT2,all.x=TRUE), data.table(a=c(1,3,4,5),total.x=c(2,1,3,1),total.y=c(NA,1,NA,2),key="a")) -test(630.1, merge(DT1,DT2,all.x=TRUE), setkey(adt(merge(adf(DT1),adf(DT2),by="a",all.x=TRUE)),a)) - -test(631, merge(DT1,DT2,all.y=TRUE), data.table(a=c(2,3,5),total.x=c(NA,1,1),total.y=c(5,1,2),key="a")) -test(631.1, merge(DT1,DT2,all.y=TRUE), setkey(adt(merge(adf(DT1),adf(DT2),by="a",all.y=TRUE)),a)) - -test(632, merge(DT1,DT2,all=TRUE), data.table(a=c(1,2,3,4,5),total.x=c(2,NA,1,3,1),total.y=c(NA,5,1,NA,2),key="a")) -test(632.1, merge(DT1,DT2,all=TRUE), setkey(adt(merge(adf(DT1),adf(DT2),by="a",all=TRUE)),a)) - -# Test that unsettting datatable.alloccol is caught, #2014 -old = getOption("datatable.alloccol") -options(datatable.alloccol=NULL) # search above for R bug fix in 3.1.1 - why split into getOption first here. -test(633, data.table(a=1:3), error="n must be integer length 1") -options(datatable.alloccol=old) - -# Test that with=FALSE by number isn't messed up by dup column names, #2025 -DT = data.table(a=1:3,a=4:6) -test(634, DT[,2:=200L], data.table(a=1:3,a=200L)) - -# Test names when not all items are named, #2029 -DT = data.table(x=1:3,y=1:3) -test(635, names(DT[,list(x,y,a=y)]), c("x","y","a")) -test(636, names(DT[,list(x,a=y)]), c("x","a")) - -# Test := by key, and that := to the key by key unsets the key. Make it non-trivial in size too. -set.seed(1) -DT = data.table(a=sample(1:100,1e6,replace=TRUE),b=sample(1:1000,1e6,replace=TRUE),key="a") -test(637, DT[,m:=sum(b),by=a][1:3], data.table(a=1L,b=c(156L,808L,848L),m=DT[J(1),sum(b)],key="a")) -test(638, key(DT[J(43L),a:=99L]), NULL) -setkey(DT,a) -test(639, key(DT[,a:=99L,by=a]), NULL) - -# Test printing is right aligned without quotes etc, and rownames are repeated ok for more than 20 rows -DT=data.table(a=8:10,b=c("xy","x","xyz"),c=c(1.1,22.1,0)) -test(640, capture.output(print(DT)), c(" a b c","1: 8 xy 1.1","2: 9 x 22.1","3: 10 xyz 0.0")) -DT=data.table(a=letters,b=1:26) -test(641, tail(capture.output(print(DT[1:20])),2), c("19: s 19","20: t 20")) -test(642, tail(capture.output(print(DT[1:21])),2), c("21: u 21"," a b")) -DT=data.table(a=as.character(as.hexmode(1:500)), b=1:500) -test(643, capture.output(print(DT)), c(" a b"," 1: 001 1"," 2: 002 2"," 3: 003 3"," 4: 004 4"," 5: 005 5"," --- ","496: 1f0 496","497: 1f1 497","498: 1f2 498","499: 1f3 499","500: 1f4 500")) - -# Test inconsistent length of columns error. -DT = list(a=3:1,b=4:3) -setattr(DT,"class",c("data.table","data.frame")) -test(644, setkey(DT,a), error="Column 2 is length 2 which differs from length of column 1 (3)") -test(645, setkey(DT,b), error="Column 2 is length 2 which differs from length of column 1 (3)") - -# Test faster mean with a lot of very small groups. Example from (now not needed as much) data.table wiki point 3. -# benchmarks.Rraw contains the same, to be scaled up. -set.seed(9) -n=1e4 # very small n so as not to overload daily CRAN checks. -DT=data.table(grp1=sample(1:150, n, replace=TRUE), - grp2=sample(1:150, n, replace=TRUE), - x=rnorm(n), - y=rnorm(n)) -DT[c(2,5),x:=NA] # seed chosen to get a group of size 2 and 3 in the first 5 to easily inspect. -DT[c(3,4),y:=NA] -ans1 = DT[,list(mean(x),mean(y)),by=list(grp1,grp2)] -ans2 = DT[,list(.Internal(mean(x)),.Internal(mean(y))),by=list(grp1,grp2)] -basemean = base::mean # to isolate time of `::` itself -ans3 = DT[,list(basemean(x),basemean(y)),by=list(grp1,grp2)] -test(646, ans1, ans2) -test(647, ans1, ans3) -# this'll error with `valgrind` because of the 'long double' usage in gsumm.c (although I wonder if we need long double precision). -# http://valgrind.org/docs/manual/manual-core.html#manual-core.limits -# http://comments.gmane.org/gmane.comp.debugging.valgrind/10340 -test(648, any(is.na(ans1$V1)) && !any(is.nan(ans1$V1))) -ans1 = DT[,list(mean(x,na.rm=TRUE),mean(y,na.rm=TRUE)),by=list(grp1,grp2)] -ans2 = DT[,list(mean.default(x,na.rm=TRUE),mean.default(y,na.rm=TRUE)),by=list(grp1,grp2)] -test(651, ans1, ans2) -test(652, any(is.nan(ans1$V1))) -# See FR#2067. Here we're just testing the optimization of mean and lapply, should be comparable to above -ans2 = DT[,lapply(.SD,mean,na.rm=TRUE),by=list(grp1,grp2)] -setnames(ans2,"x","V1") -setnames(ans2,"y","V2") -test(654, ans1, ans2) - -test(656, DT[,mean(x),by=grp1,verbose=TRUE], output="GForce optimized j to.*gmean") -test(657, DT[,list(mean(x)),by=grp1,verbose=TRUE], output="GForce optimized j to.*gmean") -test(658, DT[,list(mean(x),mean(y)),by=grp1,verbose=TRUE], output="GForce optimized j to.*gmean") -tt = capture.output(DT[,list(mean(x),mean(y)),by=list(grp1,grp2),verbose=TRUE]) -test(659, !length(grep("Wrote less rows", tt))) # first group is one row with this seed. Ensure we treat this as aggregate case rather than allocate too many rows. - -# Test .N for logical i subset -DT = data.table(a=1:10, b=rnorm(10)) -test(660, DT[a==8L, .N], 1L) - -# Test that growing is sensible in worst case -DT = data.table(a=rep(1:10,1:10),b=rnorm(55)) -tt = capture.output(DT[,sum(b)*b,by=a,verbose=TRUE]) -test(661, length(grep("growing from",tt))<3) # was 6 when we simply grew enough for latest result - -# Test that adding a new logical column is supported, #2094 -DT=data.table(a=1:3) -test(662, DT[,newcol:=NA], data.table(a=1:3,newcol=NA)) -test(663, sapply(DT,class), c(a="integer",newcol="logical")) - -# Test that setting names in the presence of dups is ok, #2103 -DT = data.table(a=1:3, b=2:4, a=3:5) -test(664, setnames(DT, c('d','e','f')), data.table(d=1:3,e=2:4,f=3:5)) - -# Test by=c(...) in combination with i subset, #2078 -DT = data.table(a=1:3,b=1:6,key="a") -test(665, DT[a<3,sum(b),by=c("a"),verbose=TRUE], DT[a<3,sum(b),by="a"], output="i clause present and columns used in by detected") -test(666, DT[a<3,sum(b),by=key(DT),verbose=TRUE], DT[a<3,sum(b),by=a], output="i clause present and columns used in by detected") -test(667, DT[a<3,sum(b),by=paste("a")], error='Otherwise, by=eval(paste("a")) should work') -test(668, DT[a<3,sum(b),by=eval(paste("a"))], DT[a<3,sum(b),by=a]) -test(669, DT[a<3,sum(b),by=c(2)], error="must evaluate to 'character'") - -# Test := keyby does setkey, #2065 -DT = data.table(x=1:2, y=1:6) -ans = data.table(x=rep(1:2,each=3),y=c(1L,3L,5L,2L,4L,6L),z=rep(c(9L,12L),each=3),key="x") -test(670, DT[,z:=sum(y),keyby=x], ans) -DT = data.table(x=1:2, y=1:6) -test(671, DT[,z:=sum(y),keyby="x"], ans) -DT = data.table(x=1:2, y=1:6) -test(672, DT[,z:=sum(y),keyby=x%%2], data.table(x=1:2,y=1:6,z=c(9L,12L)), warning=":= keyby not straightforward character column names or list() of column names, treating as a by") -DT = data.table(x=1:2, y=1:6) -test(673, DT[,z:=sum(y),by=x%%2], data.table(x=1:2,y=1:6,z=c(9L,12L))) -DT = data.table(x=1:2, y=1:6) -test(674, DT[x>1,z:=sum(y),keyby=x], error=":= with keyby is only possible when i is not supplied since") - -# Test new .() -DT = data.table(x=1:2, y=1:6, key="x") -test(675, DT[.(1L)], DT[1:3]) - -# Test new rbindlist -l = list(data.table(a=1:2, b=7:8), - data.table(a=3:4, 9:10), - data.table(5:6, 11:12), - data.table(b=13:14), - list(15:16,17L), - list(c(18,19),20:21)) -test(676, rbindlist(l[1:3]), data.table(a=1:6,b=7:12)) -test(677, rbindlist(l[c(10,1,10,2,10)]), data.table(a=1:4,b=7:10)) # NULL items ignored -test(678, rbindlist(l[c(1,4)]), error="Item 2 has 1 columns, inconsistent with item 1 which has 2") -test(679, rbindlist(l[c(1:2,5)]), error="Column 2 of item 3 is length 1, inconsistent with first column of that item which is length 2.") -test(680, rbindlist(l[c(2,6)]), data.table(a=c(3,4,18,19), V2=c(9:10,20:21))) # coerces 18 and 19 to numeric (with eddi's changes in commit 1012 - highest type is preserved now) --- Caught and changed by Arun on 26th Jan 2014 (in commit 1099). -### ----> Therefore this TO DO may not be necessary here anymore (added by Arun 26th Jan 2014) ---> # TO DO when options(datatable.pedantic=TRUE): test(680.5, rbindlist(l[c(2,6)]), warning="Column 1 of item 2 is type 'double', inconsistent with column 1 of item 1's type ('integer')") -test(681, rbindlist(list(data.table(a=letters[1:2],b=c(1.2,1.3),c=1:2), list("c",1.4,3L), NULL, list(letters[4:6],c(1.5,1.6,1.7),4:6))), data.table(a=letters[1:6], b=seq(1.2,1.7,by=0.1), c=1:6)) -test(682, rbindlist(NULL), data.table(NULL)) -test(683, rbindlist(list()), data.table(NULL)) -test(684, rbindlist(list(NULL)), data.table(NULL)) -test(685, rbindlist(list(data.table(NULL))), data.table(NULL)) - -# Test merge when no overlap of data in by columns when all=TRUE, #2114 -DF1=data.frame(foo=letters[1:5], bar=1:5, stringsAsFactors=FALSE) -DF2=data.frame(foo=letters[6:10], baz=6:10, stringsAsFactors=FALSE) -DT1=as.data.table(DF1) -DT2=as.data.table(DF2) -test(686, merge(DF1, DF2, by="foo", all=TRUE), as.data.frame(merge(DT1,DT2,by="foo",all=TRUE))) -DF1=data.frame(foo=letters[1:5], bar=1:5, stringsAsFactors=TRUE) -DF2=data.frame(foo=letters[6:10], baz=6:10, stringsAsFactors=TRUE) -DT1=as.data.table(DF1) -DT2=as.data.table(DF2) -test(687, merge(DF1, DF2, by="foo", all=TRUE), as.data.frame(merge(DT1,DT2,by="foo",all=TRUE))) - -# And a more basic test that #2114 revealed that factor to factor join was leaving NA in the i -# factor columns, caught in 1.8.1 beta before release to CRAN. -DT = data.table(a=factor(letters[1:4]), b=5:8, key="a") -test(688, DT[J(factor("b"))], data.table(a=factor("b"), b=6L, key="a")) - -# Test removing a column followed by adding a new column using := by group, #2117 -DT = data.table(a=1:3,b=4:6) -DT[,b:=NULL] -test(689, DT[,b:=.N,by=a], data.table(a=1:3, b=1L)) -test(690, DT[,c:=2,by=a], data.table(a=1:3, b=1L, c=2)) - -# Test combining i with by, with particular out of order circumstances, #2118 -set.seed(1) -DT=data.table(a=sample(1:5,20,replace=TRUE),b=1:4,c=1:10) -test(691, DT[a>2,sum(c),by=b], DT[a>2][,sum(c),by=b]) -test(692, DT[a>2,sum(c),by=b%%2L], data.table(b=1:0,V1=c(34L,42L))) -test(693, DT[a>2,sum(c),by=(b+1)%%2], data.table(b=c(0,1),V1=c(34L,42L))) -setkey(DT,b) -test(694, DT[a>2,sum(c),by=b], DT[a>2][,sum(c),by=b]) -test(695, DT[a>2,sum(c),by=b%%2L], data.table(b=1:0,V1=c(34L,42L))) -test(696, DT[a>2,sum(c),by=(b+1)%%2], data.table(b=c(0,1),V1=c(34L,42L))) - -# Test subset and %chin% crash with non-character input, #2131 -test(697, 4 %chin% letters, error="type") -test(698, 4L %chin% letters, error="type") -test(699, "a" %chin% 4, error="type") -DT = data.table(aa=1:6,bb=7:12) -test(700, subset(DT,select="aa"), DT[,list(aa)]) -test(701, subset(DT,select=aa), DT[,list(aa)]) -test(702, subset(DT,select=c(aa)), DT[,list(aa)]) -setkey(DT,aa) -test(703, subset(DT,select="aa"), data.table(aa=1:6,key="aa")) -test(704, subset(DT,select=aa), data.table(aa=1:6,key="aa")) -test(705, subset(DT,select=c(aa)), data.table(aa=1:6,key="aa")) - -# Test rbinding of logical columns, #2133 -DT1 = data.table(A=1:3,B=letters[1:3],C=c(TRUE,TRUE,FALSE)) -DT2 = data.table(A=4:5,B=letters[4:5],C=c(TRUE,FALSE)) -test(706, rbind(DT1,DT2), data.table(A=1:5, B=letters[1:5], C=c(TRUE,TRUE,FALSE,TRUE,FALSE))) -test(707, rbindlist(list(DT1,DT2)), rbind(DT1,DT2)) - -# Test non ascii characters when passed as character by, #2134 -# ***** -# TO DO: reinstate. Temporarily removed to pass CRAN's Mac using C locale (R-Forge's Mac is ok) -# ***** - -# Test := adding column after a setnames of all column names (which [,list(x)] does), #2146 -DT = data.table(x=1:5)[,list(x)] -test(713, DT[,y:=5], data.table(x=1:5,y=5)) -setnames(DT,c("A","B")) -test(714, DT[,z:=6:10], data.table(A=1:5,B=5,z=6:10)) - -# Test J alias is now removed outside DT[...] from v1.8.7 (to resolve rJava::J conflict) -test(715, J(a=1:3,b=4), error="could not find function.*J") - -# Test get in j -DT = data.table(a=1:3,b=4:6) -test(716, DT[,get("b")], 4:6) # TO DO: add warning about inefficiency when datatable.pedantic=TRUE -test(717, DT[,get("b"),verbose=TRUE], output="ansvars being set to all columns") - -# Test that j can be a logical index when `with=FALSE` (#1797) -DT = data.table(a=1:10, b=rnorm(10), c=letters[1:10]) -test(718, DT[, c(FALSE, TRUE, FALSE), with=FALSE], DT[, 2, with=FALSE]) -test(719, nrow(DT[, c(FALSE, FALSE, FALSE), with=FALSE]), 0L) - -# Test combining join with missing groups with group by, #2162 -DT = data.table(a = 1, b = 2, c = 4, key="a") -test(720, DT[list(c(5,6,7)), .N, by=b], data.table(b=NA_real_,N=3L)) -test(721, DT[list(c(5,6,7))][, .N, by=b], DT[list(c(5,6,7)), .N, by=b]) -test(722, DT[list(c(5,6,7)), .N, by=b, mult="first"], data.table(b=NA_real_,N=3L)) -test(723, DT[list(c(5,6,7)), .N, by=b, nomatch=0], data.table(b=numeric(),N=integer(),key="b")) # Key here is correct. by is ordered (albeit empty) -test(724, DT[list(c(5,6,7)), .N, by=b, nomatch=0], DT[list(c(5,6,7)),nomatch=0][,.N,by=b]) # Splitting should always be consistent - -# another test linked from #2162 -DT = data.table(x=rep(c("a","b","c"),each=3), y=c(1L,3L,6L), v=1:9, key="x") -test(725, DT[c("a","b","d"),list(v)], DT[J(c("a","b","d")),"v",with=FALSE]) # unfiled bug fix for NA matches; see NEWS 1.8.3 -test(726, DT[c("a", "b", "d"), sum(v), by=y, nomatch=0], data.table(y=INT(1,3,6),V1=INT(5,7,9))) -test(727, DT[c("a", "b", "d"), sum(v), by=y], data.table(y=INT(1,3,6,NA),V1=INT(5,7,9,NA))) -test(728, DT[c("a", "b", "d"), sum(v), by=y], DT[J(c("a", "b", "d"))][, sum(v), by=y]) - -# explicit verbose=FALSE needed here because tests are run a second time with verbose=TRUE -test(729.1, capture.output(DT[c("a", "b", "d"), print(.SD), by=.EACHI, verbose=FALSE]), - capture.output(suppressWarnings(DT[c("a", "b", "d"), print(.SD), by=x, verbose=FALSE]))) -test(729.2, capture.output(DT[c("a", "b"), print(.SD), by=y, verbose=FALSE]), # TO DO: why doesn't last group have x=d, maybe groups=i in dogroups - capture.output(DT[c("a", "b"),verbose=FALSE][, print(.SD), by=y, verbose=FALSE])) - -test(729.3, DT[c("b","d"),.SD,by=.EACHI], data.table(x=c("b","b","b","d"),y=INT(1,3,6,NA),v=INT(4,5,6,NA))) # no debate here -test(729.4, DT[c("b","d"),.SD, by=y], DT[c("b","d")][,.SD, by=y][4L,x:=NA_character_]) # the i groups when no match don't get carried through (would be hard to implement this and very unlikely to be useful. Just break into compound query, if needed to be used in j, to get them to carry through. TO DO: add to FAQ. - -# That unnamed i gets x's join column names when j is .SD (or any named list, which verbose warns is inefficient), #2281 -test(729.5, DT[c("a","b"),.SD], data.table(x=rep(c("a","b"),each=3),y=INT(1,3,6),v=1:6,key="x")) - -# check := when combining join with missing groups and then group by -test(730, DT[c("b","a"),w:=sum(v),by=y]$w, INT(5,7,9,5,7,9,NA,NA,NA)) # by over a different column than was joined to -test(731, DT["d",w:=99,by=y]$w, INT(5,7,9,5,7,9,NA,NA,NA)) # do nothing for missing group, before getting as far as type error -test(732, DT["d",w:=99L,by=y]$w, INT(5,7,9,5,7,9,NA,NA,NA)) # do nothing for missing group -test(733, DT[c("c","e","b"),w:=sum(v),by=y%%2L]$w, INT(5,7,9,24,24,15,24,24,15)) - -# Test column type change in the 0 row case (#2274) -DT = data.table(a=1:3,b=4:6)[0] -test(734, DT[,b:=as.character(b)], data.table(a=integer(),b=character())) -test(735, DT[,c:=double()], data.table(a=integer(),b=character(),c=double())) - -# Deleting multiple columns out-of-order, #2223 -DT = data.table(a=1:3,b=4:6,c=7:9,d=10:12,e=13:15,f=16:18,g=19:21) -test(736, DT[,c("b","d","g","f","c"):=NULL], data.table(a=1:3,e=13:15)) # test redundant with=FALSE is ok -DT = data.table(a=1:3,b=4:6,c=7:9,d=10:12,e=13:15,f=16:18,g=19:21) -test(737, DT[,c("b","d","g","f","c"):=NULL], data.table(a=1:3,e=13:15)) # with no longer needed - -# Mixing column adds and deletes in one := gave incorrect results, #2251. -DT = data.table(c1=1:2) -test(738, DT[,c("c2", "c1"):=list(c1+1L, NULL)], data.table(c2=2:3)) - -# `:=`(c1=v1,v2=v2,...) is now valid , #2254 -DT = data.table( c1=1:3 ) -test(739, DT[,`:=`(c2=4:6, c3=7:9)], data.table(c1=1:3,c2=4:6,c3=7:9)) -test(740, DT[,`:=`(4:6,c3=7:9)], error="all arguments must be named") -test(741, DT[,`:=`(4:6,7:9,10:12)], error="all arguments must be named") # test the same error message in the other branch - -# that out of bounds LHS is caught, root cause of #2254 -test(742, DT[,3:6:=1L], error="outside.*range") -test(743, DT[,2:3:=99L], data.table(c1=1:3,c2=99L,c3=99L)) -test(744, DT[,(ncol(DT)+1):=1L], error="outside.*range") -test(745, DT[,ncol(DT):=1L], data.table(c1=1:3,c2=99L,c3=1L)) - -# multiple LHS with by without by, #2215 -DT = data.table(a=letters[c(1:3,3L)],key="a") -test(746, DT["a",c("new1","new2"):=list(4L, 5L)], - data.table(a=letters[c(1:3,3L)],new1=INT(4,NA,NA,NA),new2=INT(5,NA,NA,NA),key="a")) -test(747, DT[,new1:=4:6], data.table(a=letters[c(1:3,3L)],new1=INT(4L,5L,6L,4L),new2=INT(5,NA,NA,NA),key="a"), warning="recycled leaving remainder of 1 item") -suppressWarnings(DT[,new1:=4:6]) -test(748, DT[c("c","b"),`:=`(new3=.N,new2=sum(new1)+1L),by=.EACHI], data.table(a=letters[c(1:3,3L)],new1=INT(4,5,6,4),new2=INT(5,6,11,11),new3=INT(NA,1,2,2),key="a")) - -# and multiple LHS by group, #1710 -DT = data.table(a=rep(6:8,1:3),b=1:6) -test(749, DT[,c("c","d","e"):=list(.N,sum(b),a*10L),by=a], data.table(a=rep(6:8,1:3),b=1:6,c=rep(1:3,1:3),d=INT(rep(c(1,5,15),1:3)),e=rep(6:8,1:3)*10L)) -test(750, DT[a<8,`:=`(f=b+sum(d),g=.N),by=c][,6:7,with=FALSE], data.table(f=INT(2,12,13,NA,NA,NA),g=INT(1,2,2,NA,NA,NA))) - -# varname holding colnames, by group, linked from #2120. -DT = data.table(a=rep(1:3,1:3),b=1:6) -colname = "newcol" -test(751, DT[,(colname):=sum(b),by=a], data.table(a=rep(1:3,1:3),b=1:6,newcol=INT(1,5,5,15,15,15))) - -# Add tests for nested := in j by group, #1987 -DT = data.table(a=rep(1:3,2:4),b=1:9) -test(752, DT[,head(.SD,2)[,new:=1:.N],by=a], data.table(a=rep(1:3,each=2),b=c(1:4,6:7),new=1:2)) - -# Test duplicate() of recycled plonking RHS, #2298 -DT = data.table(a=letters[3:1],x=1:3) -test(753, setkey(DT[,c("x1","x2"):=x],a), data.table(a=letters[1:3],x=3:1,x1=3:1,x2=3:1,key="a")) -test(753.1, DT[,c("x1","x2"):=4:6, verbose = TRUE], data.table(a=letters[1:3],x=3:1,x1=4:6,x2=4:6,key="a"), - output = "RHS for item 2 has been duplicated") -test(753.2, DT[2,x2:=7L], data.table(a=letters[1:3],x=3:1,x1=4:6,x2=c(4L,7L,6L),key="a")) -DT = data.table(a=letters[3:1],x=1:3,y=4:6) -test(754, setkey(DT[,c("x1","y1","x2","y2"):=list(x,y)],a), data.table(a=letters[1:3],x=3:1,y=6:4,x1=3:1,y1=6:4,x2=3:1,y2=6:4,key="a")) -# And non-recycling i.e. that a single column copy does copy the column -DT = data.table(a=1:3) -test(754.1, DT[,b:=a][1,a:=4L][2,b:=5L], data.table(a=INT(4,2,3),b=INT(1,5,3))) -test(754.2, DT[,b:=a][3,b:=6L], data.table(a=INT(4,2,3),b=INT(4,2,6))) -test(754.3, DT[,a:=as.character(a),verbose=TRUE], output="Direct plonk.*no copy") -RHS = as.integer(DT$a) -test(754.4, DT[,a:=RHS,verbose=TRUE], output="RHS for item 1 has been duplicated") - -# Used to test warning on redundant by (#2282) but by=.EACHI has now superseded -DT = data.table(a=letters[1:3],b=rep(c("d","e"),each=3),x=1:6,key="a,b") -test(755, DT[c("b","c"),sum(x),by=.EACHI], data.table(a=c("b","c"),V1=c(7L,9L),key="a")) -test(756, DT[c("b","c"),sum(x),by=a], data.table(a=c("b","c"),V1=c(7L,9L),key="a")) -test(757, DT[list(c("b","c"),"d"),sum(x),by=a], data.table(a=c("b","c"),V1=2:3,key="a")) # 'by' less than number of join columns - -# join then by when mult=="last"|"first", #2303 (crash in dev 1.8.3 only) -DT = data.table(a=1:3,b=1:6,c=7:12,key="a") -test(758, DT[J(c(1L,1L)),sum(c),by=b,mult="last"], DT[J(c(1L,1L)),mult="last"][,sum(c),by=b]) -test(759, DT[J(1L),c,by=b,mult="last"], DT[J(1L),mult="last"][,c,by=b]) -test(760, DT[2:5,sum(c),by=b], DT[2:5][,sum(c),by=b]) -test(761, DT[2:5,sum(c),by=b%%2], DT[2:5][,sum(c),by=b%%2]) - -# joining from empty i table, #2194 -DT = data.table(a=1:3,b=4:6,key="a") -test(762, DT[J(integer()),b,by=.EACHI], data.table(a=integer(),b=integer(),key="a")) -test(763, DT[J(integer()),1L,by=b], data.table(b=integer(),V1=integer(),key="b")) # ordered by is detected now (empty is ordered), otherwise a join to the result would fail just because it's empty which wouldn't be consistent with non empty case -test(764, DT[J(integer()),b,mult="last"], integer()) -test(765, DT[J(2L),b,mult="last"], 5L) -test(766, DT[J(5L),b,nomatch=0,by=.EACHI], data.table(a=integer(),b=integer(),key="a")) -test(767, DT[J(5:6),b,nomatch=0,by=.EACHI], data.table(a=integer(),b=integer(),key="a")) - -# Crash on by-without-by with mixed type non join i columns, #2314. Despite not being used by j they were still being assigned to .BY. -DT = data.table(iris,key="Species") -Y = data.table(date=as.POSIXct("2011-01-01"),num=as.numeric(1:26)) -Y[,get("letters"):=LETTERS] -Y[,A:=1:26] -Y[,p:=factor(p)] # coerce type to match DT$Species to save warning. Crash was related to .BY internally, not the coercion. -setkey(Y,p) -for (i in 1:10){DT[Y,Petal.Width];DT[Y];NULL} # reliable crash in 1.8.2 (tested). -test(768, DT[Y,Petal.Width,by=.EACHI], data.table(Species=factor(LETTERS),Petal.Width=NA_real_,key="Species")) -DT = data.table(a=1:3,b=1:6,c=7:12, key="a") -test(769, DT[,.BY[[1]]==a,by=a], data.table(a=1:3,V1=TRUE,key="a")) -test(770, DT[J(2:3),.BY[[1]]==b,by=.EACHI], data.table(a=INT(2,2,3,3),V1=c(TRUE,FALSE),key="a")) - -# A data.table RHS of := caused a crash, #2311. -a = data.table(first=1:6, third=c(1,1,1,3,3,4), key="first") -b = data.table(first=c(3,4,4,5,6,7,8), second=1:7, key="first") -test(771, b[,third:=a[b,third,by=.EACHI]], b, warning="Supplied 2 items.*to 7.*recycled leaving remainder of 1 item") -test(772, copy(b)[,third:=as.list(a[b,third,by=.EACHI])], b, warning="Supplied 2 items.*to 7.*recycled leaving remainder of 1 item") -test(773, b[4,third[[1]]], c(1,3,3,3,4,NA,NA)) -test(774.1, b[,third:=a[b,third,mult="first"]], ans<-data.table(first=c(3,4,4,5,6,7,8), second=1:7, third=c(1,3,3,3,4,NA,NA), key="first")) -test(774.2, b[,third:=a[b,third]], ans) # mult="first" no longer needed as from v1.9.3. It now does what was naturally expected. - - -# That names are dropped. (Names on the column vectors don't display. They increase size and aren't much use.) -DT = data.table(a=1:3,b=LETTERS[1:3]) -map = c("A"="Foo",B="Bar",C="Baz") -DT[,b:=map[b]] -test(775, names(DT$b), NULL) - -# Test that names of named vectors don't carry through, #2307. -DT = data.table(a=1:3,b=c("a"="a","b"="a","c"="b")) -test(776, names(DT$b), NULL) # From v1.8.11, data.table() drops vector names -DT = data.table(a=1:3,b=c("a","a","b")) -setattr(DT$b, "names", c("a","b","c")) # Force names in there to test #2307 -test(777, names(DT$b), c("a","b","c")) -test(778, DT[,sum(a),by=b], data.table(b=c("a","b"),V1=c(3L,3L))) #2307 retained names length 3 on the length 2 vector result causing it not to print. -test(779, print(DT[,sum(a),by=b]), output=" b V1\n1: a 3\n2: b 3$") - -# Test new .GRP binding -test(780, data.table(a=1:3,b=1:6)[,i:=.GRP,by=a][,i2:=.GRP], data.table(a=1:3,b=1:6,i=rep(1:3,2),i2=1L)) - -# Test new .I binding -DT = data.table(a=1:4,b=1:8) -test(781, DT[,.I,by=a]$I, INT(1,5,2,6,3,7,4,8)) -test(782, DT[,.I[which.max(b)],by=a], data.table(a=1:4,V1=5:8)) -setkey(DT,a) -test(783, DT[,.I,by=a]$I, 1:8) -test(784, DT[,.I[which.max(b)],by=a], data.table(a=1:4,V1=INT(2,4,6,8),key="a")) -test(785, DT[J(2:4),.I,by=a%%2L], data.table(a=rep(0:1,c(4,2)),I=INT(3,4,7,8,5,6))) -test(786, DT[J(c(3,2,4)),list(.I,.GRP),by=.EACHI], data.table(a=rep(c(3L,2L,4L),each=2),I=INT(5,6,3,4,7,8),GRP=rep(1:3,each=2L))) -test(787, DT[J(3:2),`:=`(i=.I,grp=.GRP),by=.EACHI][,list(i,grp)], data.table(i=INT(NA,NA,3:6,NA,NA),grp=INT(NA,NA,2,2,1,1,NA,NA))) - -# New not-join (a.k.a. not-select, since not just for data.table i but integer, logical and character too) -DT = data.table(A=rep(1:3,each=2),B=1:6,key="A") -test(788, DT[!J(2)], data.table(A=c(1L,1L,3L,3L),B=c(1L,2L,5L,6L),key="A")) -test(789, DT[!(2:6)], DT[1]) -test(790, DT[!(2:6)], DT[!2:6]) # nicer than DT[-2:6] applying - to 2 first -test(791, DT[!6], DT[1:5]) -test(792.1, DT[!rep(c(TRUE,FALSE),length=.N)], DT[rep(c(FALSE,TRUE),length=.N)]) -test(792.2, DT[!A>=2], DT[A<2]) -test(793, setkey(DT[,A:=letters[A]],A)[!c("b","c")], DT["a"]) -test(794, DT[!"b"], DT[c("a","c")]) -test(795, DT[!0], DT) -test(796, DT[!NULL], DT[NULL]) -test(797, DT[!integer()], DT) -test(798, DT[!-1], DT[1]) -test(799, DT[--1], DT[1]) -myi = c("a","c") -test(800, DT[!myi], DT["b"]) -test(801, DT[!"c",sum(B),by=A], data.table(A=c("a","b"),V1=c(3L,7L),key="A")) -test(802, DT[!"missing",sum(B),by=A], DT[,sum(B),by=A]) -test(803, DT[!c("a","missing","b","missing2"),sum(B),by=A], DT["c",sum(B),by=.EACHI]) -# Combining not-join with which -test(804, DT[!"b",which=TRUE], INT(1:2,5:6)) # row numbers in DT that don't match -# New which=NA value -test(805, DT[c("b","foo","c"),which=NA], 2L) # row numbers in i that don't match -test(806, DT[!c("b","foo","c"),which=NA], c(1L,3L)) # row numbers in i that do match -test(807, DT[!c("b","foo","c"),nomatch=0], error="not-join.*prefix is present on i.*Please remove nomatch") -test(808, DT[c("b","foo","c"),which=TRUE,nomatch=NA], INT(3:4,NA,5:6)) -test(809, DT[c("b","foo","c"),which=TRUE,nomatch=0], INT(3:4,5:6)) -test(810, DT[c("b","foo","c"),which=NA,nomatch=NA], 2L) -test(811, DT[c("b","foo","c"),which=NA,nomatch=0], error="which=NA with nomatch=0 would always return an empty vector[.] Please change or remove either which or nomatch") - -# New notj for column names and positions when with=FALSE, #1384 -DT = data.table(a=1:3,b=4:6,c=7:9) -test(812, DT[,!"b",with=FALSE], DT[,-match("b",names(DT)),with=FALSE]) -test(813, DT[,"foo",with=FALSE], error="column(s) not found: foo") -test(814, DT[,!"foo",with=FALSE], DT, warning="column(s) not removed because not found: foo") -test(815, DT[,!c("b","foo"),with=FALSE], DT[,list(a,c)], warning="column(s) not removed because not found: foo") -test(816, DT[,!2:3,with=FALSE], DT[,-(2:3),with=FALSE]) # for consistency, but ! is really for character column names -mycols = "b" -test(817, DT[,!mycols,with=FALSE], DT[,list(a,c)]) -mycols = 2 -test(818, DT[,!mycols,with=FALSE], DT[,list(a,c)]) - -# Test X[Y] slowdown, #2216 -# Many minutes in 1.8.2! Now well under 1s, but 10s for very wide tolerance for CRAN. We'd like CRAN to tell us if any changes -# in R or elsewhere cause the 2 minute (!) bug to return. Hence not moving out to benmark.Rraw. -X = CJ(a=seq_len(1e3),b=seq_len(1e3)) -Y = copy(X) -X[4,b:=3L] # create a dup group, to force allLen1=FALSE -setkey(X) -test(819, system.time(X[Y,allow.cartesian=TRUE])["user.self"] < 10) # this system.time usage ok in this case -test(820, system.time(X[Y,mult="first"])["user.self"] < 10) # this system.time usage ok in this case - -# Optimization of lapply(,"+"), #2212 -DT = data.table(a=rep(1:3,each=2L),b=1:6,c=7:12) -ans = data.table(a=rep(1:3,each=2L),b=INT(2,3,5,6,8,9),c=INT(8,9,11,12,14,15)) -test(821, DT[,lapply(.SD, "+", a), by=a], ans) -test(822, DT[,lapply(.SD, `+`, a), by=a], ans) -ans = data.table(a=1:3,b=INT(4,9,14),c=INT(16,21,26)) -test(823, DT[,lapply(.SD, "sum", a), by=a], ans) -test(824, DT[,lapply(.SD, sum, a), by=a], ans) -test(825, DT[,lapply(.SD, `sum`, a), by=a], ans) -DT[2,b:=NA_integer_] -test(825.1, DT[,lapply(.SD, function(x)sum(x)), by=a], data.table(a=1:3,b=INT(NA,7,11),c=INT(15,19,23))) -test(825.2, DT[,lapply(.SD,function(x,...)sum(x,...),na.rm=TRUE),by=a], data.table(a=1:3,b=INT(1,7,11),c=INT(15,19,23))) -test(825.3, DT[,lapply(.SD,sum,na.rm=TRUE),by=a], data.table(a=1:3,b=INT(1,7,11),c=INT(15,19,23))) - -# Test illegal names in merge are ok and setcolorder length error, #2193i and #2090 -DT1 = data.table(a=letters[1:5], "Illegal(name%)"=1:5, key="a") -DT2 = data.table(a=letters[1:5], b=6L, key="a") -test(826, merge(DT1,DT2), cbind(DT1,b=6L)) -test(827, merge(DT2,DT1), cbind(DT2,"Illegal(name%)"=1:5)) -a=data.table('User ID'=c(1,2,3), 'Blah Blah'=c(1,2,3), key='User ID') #2090's test -b=data.table('User ID'=c(1,2,3), 'Yadda Yadda'=c(1,2,3), key='User ID') -test(827.1, names(a[b]), c("User ID","Blah Blah","Yadda Yadda")) - -# setcolorder and merge check for dup column names, #2193(ii) -setnames(DT2,"b","a") -test(828, setcolorder(DT2,c("a","b")), error="x has some duplicated column name(s): a. Please remove or rename") -test(829, merge(DT1,DT2), error="y has some duplicated column name(s): a. Please remove or rename") -test(830, merge(DT2,DT1), error="x has some duplicated column name(s): a. Please remove or rename") - -# attribs such as "comments" should be retained, #2270 -DT1 <- data.table(id = seq.int(1, 10), A = LETTERS[1:10], key = "id") -comment(DT1$A) <- "first comment" # copies, setattr would be better as on next line -DT2 <- data.table(id = seq.int(2, 10, 2), b = letters[1:5], key = "id") -setattr(DT2$b,"comment","second comment") -test(831, comment(DT1[DT2]$A), "first comment") -test(832, comment(DT2[DT1]$b), "second comment") -test(833, sapply(merge(DT1,DT2),comment), list(id=NULL, A="first comment", b="second comment")) -test(834, comment(DT1[2:3]$A), "first comment") - -# Test that matrix RHS of := is caught, #2333 -DT = data.table(a=1:3) -DT[,a:=scale(a)] # 1 column matrix auto treated as vector -test(835, na.omit(DT), DT) -test(836, DT[,a:=as.integer(a)], data.table(a=INT(-1,0,1))) -test(837, DT[,a:=cbind(1,2)], data.table(a=c(1L,2L,1L)), - warning=c("2 column matrix RHS of := will be treated as one vector", - "Supplied 2 items to be assigned to 3 items.*recycled", - "Coerced 'double' RHS to 'integer' to match the column's type")) -DT = data.table(a=1:3,b=1:6) -test(838, DT[,c:=scale(b), by=a][,c:=as.integer(1000*c)], data.table(a=1:3,b=1:6,c=rep(as.integer(1000*scale(1:2)), each=3))) - -# Test data.table's last(). (last is used internally in data.table, too). -# Compatibility with xts::last is tested in other.Rraw -test(839, last(1:10), 10L) -DT = data.table(a=1:3,b=4:6) -test(840, last(DT), DT[3L]) - -# Test L[[1L]][,:=] updates by reference, #2204 -l = list(data.table(a=1:3), data.table(b=4:6)) -test(843, l[[2L]][,c:=7:9], data.table(b=4:6,c=7:9)) -test(844, l, list(data.table(a=1:3), data.table(b=4:6,c=7:9))) -names(l) = c("foo","bar") # R >= 3.1 no longer copies all the contents, yay -test(845, l[["foo"]][2,d:=4L], data.table(a=1:3,d=c(NA,4L,NA))) -l = list(data.table(a=1:3), data.table(b=4:6)) -setattr(l,"names",c("foo","bar")) -test(846, l[["foo"]][2,d:=4], data.table(a=1:3,d=c(NA,4,NA))) -test(847, l, list(foo=data.table(a=1:3,d=c(NA,4,NA)), bar=data.table(b=4:6))) -old = options(datatable.alloccol=0L) -l = list(foo=data.table(a=1:3,b=4:6),bar=data.table(c=7:9,d=10:12)) # list() doesn't copy the NAMED==0 objects here -test(848, truelength(l[[1L]]), 2L) -test(849, {l[[1L]][,e:=13:15]; l[[1L]]}, data.table(a=1:3,b=4:6)[,e:=13:15]) -test(850, truelength(l[[1L]]), 3L) -test(851, truelength(l[[2L]]), 2L) -options(datatable.alloccol=1L) -l[["bar"]][,f:=16:18] -test(852, truelength(l[[2L]]), 4L) -options(old) -# Now create the list from named objected -DT1 = data.table(a=1:3, b=4:6) -DT2 = data.table(c=7:9) -l = list(DT1, DT2) -# From R>=3.1, list() no longer copies NAMED inputs (a very welcome change in Rdevel, r63767) -test(853, address(DT1) == address(l[[1L]])) -test(854, l[[1]][,d:=10:12], data.table(a=1:3,b=4:6,d=10:12)) -test(855, l[[1]], data.table(a=1:3,b=4:6,d=10:12)) - -# Test setnames on data.frame, #2273. -DF = data.frame(foo=1:2,bar=3:4) -setnames(DF,c("baz","qux")) -test(856, DF, data.frame(baz=1:2,qux=3:4)) -test(857.1, set(DF,NULL,"quux",5:6), error="set() on a data.frame is for changing existing columns, not adding new ones") -test(857.2, set(DF,NULL,3L,5:6), error="set() on a data.frame is for changing existing columns, not adding new ones") -test(858.1, set(DF,NULL,"qux",5:6), data.frame(baz=1:2, qux=5:6)) -test(858.2, set(DF,NULL,2L,7:8), data.frame(baz=1:2, qux=7:8)) - -# Test DT[J(data.frame())], #2265 -DT = data.table(foo=c(1,2,3), bar=c(1.1,2.2,3.3), key="foo") -i = data.frame(foo=1) -test(859, DT[i], DT[J(i)]) -test(860, DT[i], DT[data.table(i)]) - -# test no memory leak, #2191 and #2284 -# These take a few seconds each, and it's important to run these on CRAN to check no leak -gc(); before = gc()["Vcells","(Mb)"] -for (i in 1:2000) { DT = data.table(1:3); rm(DT) } # in 1.8.2 would leak 3MB -gc(); after = gc()["Vcells","(Mb)"] -test(861, after < before+0.5) # close to 0.0 difference, but 0.5 for safe margin - -gc(); before = gc()["Vcells","(Mb)"] -DF = data.frame(x=1:20, y=runif(20)) -for (i in 1:2000) { DT = as.data.table(DF); rm(DT) } -gc(); after = gc()["Vcells","(Mb)"] -test(862, after < before+0.5) - -gc(); before = gc()["Vcells","(Mb)"] -DT = data.table(x=1:20, y=runif(20)) -for (i in 1:2000) { x <- DT[1:5,]; rm(x) } -gc(); after = gc()["Vcells","(Mb)"] -test(863, after < before+0.5) - -# rbindlist should look for the first non-empty data.table - New changes (from Arun). Explanation below: -# Even if data.table is empty, as long as there are column names, they should be considered. -# Ex: What if all data.tables are empty? What'll be the column name then? -# If there are no names, then the first non-empty set of names will be allocated. I think this is the way to do it.. TODO: Should write to Matt about it. -test(864.1, rbindlist(list(data.table(foo=logical(0),bar=logical(0)), DT<-data.table(baz=letters[1:3],qux=4:6))), setnames(DT, c("foo", "bar"))) -test(864.2, rbindlist(list(list(logical(0),logical(0)), DT<-data.table(baz=letters[1:3],qux=4:6))), DT) -test(864.3, rbindlist(list(data.table(logical(0),logical(0)), DT<-data.table(baz=letters[1:3],qux=4:6))), setnames(DT, c("V1", "V2"))) - -# Steve's find that setnames failed for numeric 'old' when pointing to duplicated names -DT = data.table(a=1:3,b=1:3,v=1:6,w=1:6) -test(865, ans1<-DT[,{list(name1=sum(v),name2=sum(w))},by="a,b",verbose=TRUE], - output="GForce optimized.*gsum[(]v[)], gsum[(]w[)]") # v1.9.7 treats wrapped {} better, so this is now optimized -test(866, names(ans1), c("a","b","name1","name2")) -test(867, names(ans2<-DT[,list(name1=sum(v),name2=sum(w)),by="a,b"]), c("a","b","name1","name2")) # list names extracted here -test(868, ans1, ans2) -# and related to setnames, too -DT = data.table(a=1:3,b=1:6,key="a") -test(869, DT[J(2,42,84),print(.SD),by=.EACHI], output=c(" b", "1: 2", "2: 5", "Empty data.table (0 rows) of 3 cols: a,V2,V3")) - -# Test setnames with duplicate colnames -DT = data.table(a=1:3,b=4:6,b=7:9) -test(870, setnames(DT,"b","foo"), error="Some items of 'old' are duplicated (ambiguous) in column names: b") -test(871, setnames(DT,c("bar","bar"),c("x","y")), error="Some duplicates exist in 'old': bar") -test(872, setnames(DT,3,"c"), data.table(a=1:3,b=4:6,c=7:9)) -test(873, setnames(DT,"foo","bar"), error="Items of 'old' not found in column names: foo") -test(874, setnames(DT,c(1,1),c("foo","bar")), error="Some duplicates exist in 'old': 1") -test(875, setnames(DT,"c","b"), data.table(a=1:3,b=4:6,b=7:9)) -test(875.1, setnames(DT,"a","c"), data.table(c=1:3,b=4:6,b=7:9)) # 'a' isn't duplicated so not a problem as from v1.8.11 -test(875.2, setnames(DT,c("c","b"), c("C","B")), error="Some items of 'old' are duplicated (ambiguous) in column names: b") # check error msg when 2nd one in old is the problem - -# Test local var problem introduced in v1.8.3 -DT = data.table(a=1:3,b=1:6) -f = function() { - localvar = 2 - print(DT[a>localvar]) - print(DT[a>localvar,sum(b)]) - print(DT[a>localvar,sum(b),by=a]) # bug fix 2368 -} -test(876, f(), output=" a b\n1: 3 3\n2: 3 6.*[[]1[]] 9.* a V1\n1: 3 9") - -# segfault when assigning NA names, #2393 -DT = data.table(a=1:3, b=4:6) -test(877, setnames(DT, c(NA, NA)), error="Passed a vector of type 'logical'. Needs to be type 'character'") - -# test no warning when use.names explicitly set, #2385 - changed 'warning' to 'message' as we just check if usenames is missing, due to C-level changes. -# commented the message for now until confirmation with Matt. -test(878, rbind(data.table(a=1:3,b=4:6), data.table(b=7:9,a=4:6)), data.table(a=1:6,b=4:9)) #, message="Columns will be bound by name for consistency with base") -test(879, rbind(data.table(a=1:3,b=4:6), data.table(b=7:9,a=4:6), use.names=TRUE), data.table(a=1:6,b=4:9)) - -# Test fread() -n=110 # 110 just to be over the 100 limit for printing head, as a convenience -DT = data.table( a=sample(1:1000,n,replace=TRUE), - b=sample(1:1000,n,replace=TRUE)-500L, - c=rnorm(n), - d=sample(c("foo","bar","baz","qux","quux"),n,replace=TRUE), - e=rnorm(n), - f=sample(1:1000,n,replace=TRUE) ) -DT[2,b:=NA_integer_] -DT[4,c:=NA_real_] -DT[3,d:=NA_character_] -DT[5,d:=""] -DT[2,e:=+Inf] -DT[3,e:=-Inf] -DT[4,e:=NaN] # write.table writes NaN as NA, though, and all.equal considers NaN==NA. fread would read NaN as NaN if "NaN" was in file -write.table(DT,f<-tempfile(),sep=",",row.names=FALSE,quote=FALSE) # na="NA" seems like a bad default for string columns here -test(880, fread(f), as.data.table(read.csv(f,stringsAsFactors=FALSE))) -test(881, fread(f), DT) -# test that columns are not coerced if nastring=NULL -DT[3,d:="NA"] -test(882, fread(f,na.strings=NULL)[['d']], DT[['d']]) -DT[3,d:=NA_character_] -unlink(f) -write.table(DT,f<-tempfile(),sep=",",row.names=FALSE,quote=TRUE) -test(883, fread(f), as.data.table(read.csv(f,stringsAsFactors=FALSE))) -test(884, fread(f), DT) -unlink(f) - -# Test short files. -# All the unlinks and using a new file each time are to work around apparent Windows issues it seems when writing, appending -# rereading (possibly via the MapViewOfFile) the same file that has just been appended to. These apparent issues have only -# showed up on winbuilder so far, so might be in combination with the D: tempdir() there; perhaps D: is on a network drive or something. -cat("",file=f<-tempfile()); test(885, fread(f), error="empty"); unlink(f) -test(885.1, fread(""), error="empty") -test(885.2, fread(), error="empty") -cat("", file=f<-tempfile()); test(885.3, fread(f), error="File is empty:"); unlink(f) -cat(" ", file=f<-tempfile()); test(885.4, fread(f), error="either empty.*whitespace.*or skip has"); unlink(f) -test(885.5, fread(" "), error="space") -test(886, fread("\n"), error="empty") -test(887, fread(" \n\t \t \n \n "), error="empty") -cat("A", file=f<-tempfile()); test(888, fread(f), data.table(A=logical())); unlink(f) -test(889, fread("A\n"), data.table(A=logical())) -cat("AB,CDE",file=f<-tempfile()); test(890, fread(f), data.table(AB=logical(),CDE=logical())); unlink(f) -test(891, fread("AB,CDE\n"), data.table(AB=logical(),CDE=logical())) -cat("3.14",file=f<-tempfile()); test(892, fread(f), data.table(V1=3.14)); unlink(f) -cat("1.23\n3.14",file=f<-tempfile()); test(892.1, fread(f), data.table(V1=c(1.23,3.14))); unlink(f) -cat("A,3",file=f<-tempfile()); test(893, fread(f), data.table(V1="A",V2=3L)); unlink(f) -if (.Platform$OS.type=="unix") test(893.5, fread("A,B\r\n\r\n"), data.table(A=logical(),B=logical())) -eols = c("\n", "\r\n", "\r", "\n\r", "\r\r\n") -for (nr in c(0,1,2,3,4,55,98,99,100,101,102)) { # include around first 100 line threshold -for (nc in c(0,1,2)) { # 0 means all cols here -for (ne in seq_along(eols)) { - eol = eols[ne] - headDT = head(DT,nr)[,seq_len(if (nc==0) ncol(DT) else nc),with=FALSE] - if (nr==0) for (j in seq_len(ncol(headDT))) set(headDT,j=j,value=logical()) # when read back in empty cols are the lowest type (logical) - f = tempfile() - lines = capture.output(fwrite(headDT)) - cat(paste(lines,collapse=eol), file=f, sep="") # so last line abruptly ends (missing last eol) to test that, otherwise could just pass eol to fwrite - # on unix we simulate Windows too. On Windows \n will write \r\n (and \r\n will write \r\r\n) - testIDtail = nr/100 + nc/1000 + ne/10000 - # if (isTRUE(all.equal(testIDtail, 0.4103))) browser() - test(894+testIDtail, fread(f,na.strings=""), headDT) - cat(eol,file=f,append=TRUE) # now a normal file properly ending with final \n - test(895+testIDtail, fread(f,na.strings=""), headDT) - cat(eol,file=f,append=TRUE) # extra \n should be ignored other than for single columns where it is significant - test(896+testIDtail, fread(f,na.strings=""), if (nc==1) rbind(headDT, list(NA)) else headDT) - unlink(f) -}}} -if (test_bit64) { - n = 2100 - # To test out-of-sample type diffs, nrow needs to be more than 100*10*2. Under that, all rows are sampled. - DT = data.table( a=sample(1:1000,n,replace=TRUE), - b=sample(as.integer64(2)^35 * 1:10, n, replace=TRUE), - c=sample(c("foo","bar","baz"),n,replace=TRUE) ) - fwrite(DT,f<-tempfile()) - test(897, class(DT$b), "integer64") - test(898, fread(f), DT) - unlink(f) - DT[,a2:=as.integer64(a)][,a3:=as.double(a)][,a4:=gsub(" ","",format(a))] - DT[,b2:=as.double(b)][,b3:=gsub(" ","",format(b))] - DT[,r:=a/100][,r2:=gsub(" ","",format(r))] - DT[112, a2:=as.integer64(12345678901234)] # start on row 112 to avoid the first 100 - DT[113, a3:=3.14] - DT[114, a4:="123A"] - DT[115, b2:=1234567890123.45] - DT[116, b3:="12345678901234567890A"] # A is needed otherwise read as double with loss of precision (TO DO: should detect and bump to STR) - DT[117, r2:="3.14A"] - fwrite(DT,f<-tempfile()) - test(899.1, fread(f,verbose=TRUE), DT, output="Rereading 6 columns.*out-of-sample.*Column 4.*a2.*int32.*int64.*<<12345678901234>>.*Column 10.*r2.*float64.*string.*<<3.14A>>") - test(899.2, fread(f, colClasses=list(character=c("a4","b3","r2"),integer64="a2",double=c("a3","b2")), verbose=TRUE), - DT, output="Rereading 0 columns due to out-of-sample type exceptions") - unlink(f) -} - -# getwd() has been set by test.data.table() to the location of this tests.Rraw file. Test files should be in the same directory. -f = testDir("ch11b.dat") # http://www.stats.ox.ac.uk/pub/datasets/csb/ch11b.dat -test(900.1, fread(f, logical01=FALSE), as.data.table(read.table(f))) -test(900.2, fread(f, logical01=TRUE), as.data.table(read.table(f))[,V5:=as.logical(V5)]) - -f = testDir("1206FUT.txt") # a CRLF line ending file (DOS) -test(901.1, DT<-fread(f,strip.white=FALSE), setDT(read.table(f,sep="\t",header=TRUE,colClasses=as.vector(sapply(DT,class))))) -test(901.2, DT<-fread(f), setDT(read.table(f,sep="\t",header=TRUE,colClasses=as.vector(sapply(DT,class)),strip.white=TRUE))) - -# Test the coerce of column 23 to character on line 179 due to the 'A' for the first time. -# As from v1.9.8 the columns are guessed better and there is no longer a warning. Test 899 tests the warning. -# Columns 'Cancelled' and 'Diverted' seem boolean (so logical01=TRUE good default for those) but Month just happens to be all-Jan -f = testDir("2008head.csv") -test(902, fread(f,logical01=FALSE), as.data.table(read.csv(f,stringsAsFactors=FALSE))) -test(903, fread("A,B\n1,3,foo,5\n2,4,barbaz,6"), data.table(A=1:2, B=3:4, V3=c("foo","barbaz"), V4=5:6), - warning="Detected 2 column names but.*4.*Added 2 extra default column names at the end") -test(904, fread("A,B,C,D\n1,3,foo,5\n2,4,barbaz,6"), DT<-data.table(A=1:2,B=3:4,C=c("foo","barbaz"),D=5:6)) # ok -test(905, fread('A,B,C,D\n1,3,foo,5\n2,4,"barbaz",6'), DT) -test(906, fread('A,B,C,D\n1,3,foo,5\n2,4,"ba,r,baz",6'), DT[2,C:="ba,r,baz"]) -test(907, fread('A,B,C,D\n1,3,foo,5\n2,4,"ba,\\"r,baz",6'), DT[2,C:='ba,\\"r,baz']) # \" protected ok, but \ needs taking off too (TO DO) -test(908, fread("A,B,C\n1,3,\n2,4,\n"), data.table(A=1:2,B=3:4,C=NA)) # where NA is type logical - -test(909, fread(" -Date and Time,Open,High,Low,Close,Volume -2007/01/01 22:51:00,5683,5683,5673,5673,64 -2007/01/01 22:52:00,5675,5676,5674,5674,17 -2007/01/01 22:53:00,5674,5674,5673,5674,42 -")$Open, c(5683L,5675L,5674L)) # , splits all rows consistently and is also higher precedence than ' ' - -# blanks when testing if header row is all character -test(910, fread(" -02-FEB-2009,09:55:04:962,26022009,2500,PE,36,500,44,200,11850,1100,,2865.60 -02-FEB-2009,09:55:04:987,26022009,2800,PE,108.75,200,111,50,11700,1450,,2865.60 -02-FEB-2009,09:55:04:939,26022009,3100,CE,31.1,3000,36.55,200,3500,5250,,2865.60 -")$V13, rep(2865.60,3)) - -test(911, fread("02-FEB-2009,09:55:04:962,26022009,2500,PE,36,500,44,200,11850,1100,,2865.60 -02-FEB-2009,09:55:04:987,26022009,2800,PE,108.75,200,111,50,11700,1450,,2865.60 -02-FEB-2009,09:55:04:939,26022009,3100,CE,31.1,3000,36.55,200,3500,5250,,2865.60")$V13, rep(2865.60,3)) - -# Check manually setting separator -txt = "A;B;C|D,E\n1;3;4|5,6\n2;4;6|8,10\n" -test(912, names(fread(txt)), c("A","B","C|D,E")) # ; separates it more -test(913.1, fread(txt,sep=";"), data.table(A=1:2,B=3:4,"C|D,E"=c("4|5,6","6|8,10"))) -test(913.2, fread(txt,sep=","), data.table("A;B;C|D"=c("1;3;4|5","2;4;6|8"), "E"=c(6L,10L))) -test(914, fread(txt,sep="*"), data.table("A;B;C|D,E"=c("1;3;4|5,6","2;4;6|8,10"))) -test(915, fread(txt,sep="\n"), data.table("A;B;C|D,E"=c("1;3;4|5,6","2;4;6|8,10"))) # like a fast readLines - -# Crash bug when RHS is 0 length and := by group, fixed in 1.8.7 -DT = data.table(a=1:3,b=1:6) -test(916, DT[,newcol:=logical(0),by=a], data.table(a=1:3,b=1:6,newcol=NA)) - -# roll join error when non last join column is factor, #2450 -X = data.table(id=2001:2004, uid=c(1001,1002,1001,1001), state=factor(c('CA','CA','CA','MA')), ts=c(51,52,53,54), key='state,uid,ts') -Y = data.table(id=3001:3004, uid=c(1001,1003,1002,1001), state=factor(c('CA','CA','CA','CA')), ts=c(51,57,59,59), key='state,uid,ts') -test(917, X[Y,roll=TRUE], data.table(id=INT(2001,2003,2002,NA), uid=c(1001,1001,1002,1003), state=factor('CA'), ts=c(51,59,59,57), i.id=INT(3001,3004,3003,3002), key='state,uid,ts')) - -# NA in join column of type double, #2453. -X = data.table(name=c("Joh","Raf","Jon","Ste","Rob","Smi"),depID=c(NA,31,33,33,34,34),key="depID") -Y = data.table(depID=c(31,33,34,35),depName=c("Sal","Eng","Cle","Mar"),key="depID") -test(918, Y[X], data.table(depID=c(NA,31,33,33,34,34),depName=c(NA,"Sal","Eng","Eng","Cle","Cle"),name=c("Joh","Raf","Jon","Ste","Rob","Smi"),key='depID')) # Y[X] same as merge.data.frame(X,Y,all.x=TRUE) -test(919, X[Y], data.table(name=c("Raf","Jon","Ste","Rob","Smi",NA), depID=c(31,33,33,34,34,35), depName=c("Sal","Eng","Eng","Cle","Cle","Mar"),key='depID')) -test(920, X[Y,nomatch=0], data.table(name=c("Raf","Jon","Ste","Rob","Smi"),depID=c(31,33,33,34,34),depName=c("Sal","Eng","Eng","Cle","Cle"),key='depID')) -test(921, Y[X,nomatch=0], data.table(depID=c(31,33,33,34,34),depName=c("Sal","Eng","Eng","Cle","Cle"),name=c("Raf","Jon","Ste","Rob","Smi"),key='depID')) - -# setnames bug on keyed table, when full vector is given and target key isn't the positions in columns 1:length(key) -DT = data.table(a=1:2,b=3:4,c=5:6,key="b") -test(922, setnames(DT,c("A","B","C")), data.table(A=1:2,B=3:4,C=5:6,key="B")) - -# vecseq overflow, crash bug #2464 -DT = data.table(x=rep(1L,50000),key="x") -test(923, DT[DT], error="Join results in more than 2^31 rows (internal vecseq reached physical limit). Very likely misspecified join.") -X = data.table(x=1:2,y=1:6,key="x") -test(924.1, X[J(c(1,1,1))], X[rep(1:3,3)]) -test(924.2, X[J(c(1,1,1,1))], error="Join results in 12 rows; more than 10 = nrow(x)+nrow(i). Check for duplicate key values in i each of") - - -# sorting of 'double' columns not correct for ties (tolerance nuance in C code), #2484 -DT = data.table(X=as.POSIXct( c(rep("15DEC2008:00:00:00",10),"15DEC2008:00:00:00",rep("17DEC2008:00:00:00",2)),format="%d%b%Y:%H:%M:%S"),Y=c(1534,61,74,518,519,1519,1520,1524,3127,29250,30609,43,7853)) -setkey(DT,X,Y) -test(925, DT[,base::order(X,Y)], 1:nrow(DT)) - -# Test new dogroup warning for zero length columns in result when other columns are >1, #2478 -DT = data.table(a=1:3,b=1:6) -test(926, DT[, if(a==2L) list(42:43,NULL) else list(42L,3.14), by=a], data.table(a=INT(1,2,2,3),V1=INT(42,42,43,42),V2=c(3.14,NA,NA,3.14)), warning="Item 2 of j's result for group 2 is zero length. This will be filled with 2 NAs to match the") -test(927, DT[, if(a==2L) list(42:43,numeric()) else list(42L,3.14), by=a], data.table(a=INT(1,2,2,3),V1=INT(42,42,43,42),V2=c(3.14,NA,NA,3.14)), warning="Item 2 of j's result for group 2 is zero length. This will be filled with 2 NAs to match the") - -# And the root cause of #2478: that cbind(DT,1:3) created invalid data.table with empty column -test(928, cbind(data.table(a=1L),b=1:3), data.table(a=1L,b=1:3)) -# FR #4813 implementation resulted in changing 929 error to warning -# test(929, cbind(data.table(a=1L,b=2:3),c=1:3), error="argument 1 (nrow 2) cannot be recycled without remainder to match longest nrow (3)") -test(929, cbind(data.table(a=1L,b=2:3),c=1:3), data.table(a=1L, b=c(2L,3L,2L), c=1:3), warning="Item 1 is of size 2 but maximum size is 3") -test(930, cbind(data.table(a=1L,b=2:3),c=1:4), data.table(a=1L,b=INT(2,3,2,3),c=1:4)) -DT = data.table(x=c(1,1,1,1,2,2,3),y=c(1,1,2,3,1,1,2)) -DT[,rep:=1L][c(2,7),rep:=c(2L,3L)] # duplicate row 2 and triple row 7 -DT[,num:=1:.N] # to group each row by itself -test(931, DT[,cbind(.SD,dup=1:rep),by="num"], data.table(num=INT(1,2,2,3:7,7,7),x=c(1,1,1,1,1,2,2,3,3,3),y=c(1,1,1,2,3,1,1,2,2,2),rep=INT(1,2,2,1,1,1,1,3,3,3), dup=INT(1,1,2,1,1,1,1,1,2,3))) - -# New roll=+/- and rollends -DT = data.table(a=INT(1,3,4,4,4,4,7), b=INT(5,5,6,6,9,9,2), v=1:7, key="a,b") -test(932, DT[J(c(0,2,6,8)), roll=+Inf, rollends=TRUE, v], INT(1,1,6,7)) -test(933, DT[J(c(0,2,6,8)), roll=-Inf, rollends=TRUE, v], INT(1,2,7,7)) -test(934, DT[J(c(0,2,6,8)), roll=+Inf, v], INT(NA,1,6,7)) -test(935, DT[J(c(0,2,6,8)), roll=-Inf, v], INT(1,2,7,NA)) -test(936, DT[J(c(-10,-1,2,12,13)), roll=5, rollends=TRUE, v], INT(NA,1,1,7,NA)) -test(937, DT[J(c(-10,-1,2,12,13)), roll=-5, rollends=TRUE, v], INT(NA,1,2,7,NA)) -test(938, DT[J(c(-10,2,6,7,8)), roll="nearest", v], INT(1,1,7,7,7)) -test(939, DT[J(c(-10,2,6,7,8)), roll="nearest", rollends=c(TRUE,FALSE), v], INT(1,1,7,7,NA)) -test(940, DT[J(c(-10,2,6,7,8)), roll="nearest", rollends=c(FALSE,TRUE), v], INT(NA,1,7,7,7)) -test(941, DT[J(c(-10,2,6,7,8)), roll="nearest", rollends=FALSE, v], INT(NA,1,7,7,NA)) - -# merge all=TRUE with space in a y column name, #2555 -X = data.table(a=1:3,b=4:6) -Y = data.table(a=2:4,"d 1"=5:7) # space in Y's column name -test(942, merge(X,Y,all=TRUE,by="a"), data.table(a=1:4,b=INT(4:6,NA),"d 1"=INT(NA,5:7),key="a")) -test(943, merge(X,Y,all.y=TRUE,by="a"), data.table(a=2:4,b=INT(5:6,NA),"d 1"=5:7,key="a")) - -# Test error message say NULL rather than empty table -DT = data.table(NULL) -test(944, DT[,a:=1L], error = "Cannot use := to add columns to a null data.table.*You can use") -DT = data.table(a=numeric()) -test(945, DT[,b:=a+1], data.table(a=numeric(),b=numeric())) - -# fread blank column names get default names -test(946, fread('A,B,,D\n1,3,foo,5\n2,4,bar,6\n'), data.table(A=1:2,B=3:4,c("foo","bar"),D=5:6)) -test(947, fread('0,2,,4\n1,3,foo,5\n2,4,bar,6\n'), data.table(0:2,2:4,c("","foo","bar"),4:6)) -test(948, fread('A,B,C\nD,E,F\n',header=TRUE), data.table(A="D",B="E",C="F")) -test(949, fread('A,B,\nD,E,F\n',header=TRUE), data.table(A="D",B="E",V3="F")) - -# +/- with no numbers afterwards should read as character -test(950, fread('A,B,C\n1,+,4\n2,-,5\n3,-,6\n'), data.table(A=1:3,B=c("+","-","-"),C=4:6)) - -# catching misuse of `:=` -x = data.table(a=1:5) -test(951, x[,{b=a+3; `:=`(c=b)}], error="defined for use in j, once only and in particular ways") - -# fread colClasses -input = 'A,B,C\n01,foo,3.140\n002,bar,6.28000\n' -test(952, fread(input, colClasses=c(C="character")), data.table(A=1:2,B=c("foo","bar"),C=c("3.140","6.28000"))) -test(953, fread(input, colClasses=c(C="character",A="numeric")), data.table(A=c(1.0,2.0),B=c("foo","bar"),C=c("3.140","6.28000"))) -test(954, fread(input, colClasses=c(C="character",A="double")), data.table(A=c(1.0,2.0),B=c("foo","bar"),C=c("3.140","6.28000"))) -test(955, fread(input, colClasses=list(character="C",double="A")), data.table(A=c(1.0,2.0),B=c("foo","bar"),C=c("3.140","6.28000"))) -test(956, fread(input, colClasses=list(character=2:3,double="A")), data.table(A=c(1.0,2.0),B=c("foo","bar"),C=c("3.140","6.28000"))) -test(957, fread(input, colClasses=list(character=1:3)), data.table(A=c("01","002"),B=c("foo","bar"),C=c("3.140","6.28000"))) -test(958, fread(input, colClasses="character"), data.table(A=c("01","002"),B=c("foo","bar"),C=c("3.140","6.28000"))) -test(959.1, fread(input, colClasses=c("character","double","numeric")), - error = "Attempt.*column 2 <>.*inherent.*'string'.*down to.*'float64'") -test(959.2, fread(input, colClasses=c("character",NA,"numeric")), - data.table(A=c("01","002"),B=c("foo","bar"),C=c(3.14,6.28))) -test(960, fread(input, colClasses=c("character","double")), - error="colClasses.*unnamed character vector.*length is 2. Must be length 1 or ncol \\(3 in this case\\) when unnamed") -test(961, fread(input, colClasses=1:3), error="colClasses is not type list or character vector") -test(962, fread(input, colClasses=list(1:3)), error="colClasses is type list but has no names") -test(963, fread(input, colClasses=list(character="D")), error="Column name 'D' in colClasses..1.. not found") -test(964, fread(input, colClasses=c(D="character")), error="Column name 'D' in colClasses..1.. not found") -test(965, fread(input, colClasses=list(character=0)), error="Column number 0 (colClasses[[1]][1]) is out of range [1,ncol=3]") -test(966, fread(input, colClasses=list(character=2:4)), error="Column number 4 (colClasses[[1]][3]) is out of range [1,ncol=3]") - -# Character input more than 4096 bytes (used to be passed through path.expand which imposed the limit), #2649 -test(967, nrow(fread( paste( rep('a\tb\n', 10000), collapse=''), header=FALSE)), 10000L) - -# Test fread warns about removal of any footer (and autostart skips up over it) -test(968, fread("A,B\n1,3\n2,4\n\nRowcount: 2\n"), data.table(A=1:2,B=3:4), warning="Discarded single-line footer.*Rowcount: 2") -test(969, fread("A,B\n1,3\n2,4\n\n\nRowcount: 2"), data.table(A=1:2,B=3:4), warning="Discarded single-line footer.*Rowcount: 2") -test(970, fread("A,B\n1,3\n2,4\n\n\nRowcount: 2\n\n"), data.table(A=1:2,B=3:4), warning="Discarded single-line footer.*Rowcount: 2") - -# fread skip override -input = "some,bad,data\nA,B,C\n1,3,5\n2,4,6\n" -test(971, fread(input), data.table(some=c("A",1:2),bad=c("B",3:4),data=c("C",5:6))) -test(972, fread(input, skip=1), data.table(A=1:2,B=3:4,C=5:6)) -test(973, fread(input, skip=2), data.table(V1=1:2,V2=3:4,V3=5:6)) -test(974, fread(input, skip=2, header=TRUE), data.table("1"=2L,"3"=4L,"5"=6L)) -test(975, fread(input, skip="B"), data.table(A=1:2,B=3:4,C=5:6)) -input = "\n\nA,B\n1,3\n2,4\n\nC,D\n5,7\n6,8\n\nE,F\n9,11\n10,12\n" # 3 tables in one file -test(976, fread(input), data.table(A=1:2, B=3:4), warning="Stopped early on line 6.*First discarded non-empty line: <>") -test(977, fread(input, skip="C"), ans<-data.table(C=5:6, D=7:8), warning="Stopped early on line 10.*First discarded non-empty line: <>") -test(978.1, fread(input, skip="D"), ans, warning="Stopped.*line 10.*<>") -test(978.2, fread(input, skip=",F"), data.table(E=9:10, F=11:12)) -test(978.3, fread(input, skip=9), data.table(E=9:10, F=11:12)) - -# mixed add and update in same `:=` bug/crash, #2528 and #2778 -DT = data.table(x=rep(1:2, c(3,2)), y=6:10) -DT[, z:=.GRP, by=x] # first assignment -test(979, DT[, `:=`(z=.GRP, w=2), by=x], data.table(x=INT(1,1,1,2,2),y=6:10,z=INT(1,1,1,2,2),w=2)) # mixed update and add -# and example from http://stackoverflow.com/a/14732348/403310 : -dt1 = fread("Date,Time,A,B -01/01/2013,08:00,10,30 -01/01/2013,08:30,15,25 -01/01/2013,09:00,20,20 -02/01/2013,08:00,25,15 -02/01/2013,08:30,30,10 -02/01/2013,09:00,35,5") -dt2 = fread("Date,A,B,C -01/01/2013,100,300,1 -02/01/2013,200,400,2") -setkey(dt1, "Date") -setkey(dt2, "Date") -test(980, dt1[dt2, `:=`(A=A+i.A, B=B+i.B, C=i.C)][,list(A,B,C)], - data.table(A=INT(110,115,120,225,230,235),B=INT(330,325,320,415,410,405),C=rep(1:2,each=3))) -DT = data.table(A=1:2,B=3:4,C=5:6) -test(981, DT[,`:=`(D=B+4L,B=0:1,E=A*2L,F=A*3L,C=C+1L,G=C*2L),by=A], - data.table(A=1:2,B=0L,C=6:7,D=7:8,E=c(2L,4L),F=c(3L,6L),G=c(10L,12L)), - warning=c("RHS 2 is length 2.*group 1.*last 1 element.*discarded", - "RHS 2 is length 2.*group 2.*last 1 element.*discarded")) -DT = data.table(A=1:2,B=3:4,C=5:6) -test(982, DT[,`:=`(D=B+4L,B=0L,E=A*2L,F=A*3L,C=C+1L,G=C*2L),by=A], - data.table(A=1:2,B=0L,C=6:7,D=7:8,E=c(2L,4L),F=c(3L,6L),G=c(10L,12L))) # Also note that G is not yet iterative. In future: c(12,14) - -# rbindlist binding factors, #2650 -test(983, rbindlist(list(data.table(factor(c("A","A","B","C","A"))), data.table(factor(c("B","F","A","G"))))), data.table(V1=factor(c("A","A","B","C","A","B","F","A","G")))) -test(984, rbindlist(list(data.table(factor(c("A","B"))), data.table(c("C","A")))), data.table(factor(c("A","B","C","A")))) -test(985, rbindlist(list(data.table(c("A","B")), data.table(factor(c("C","A"))))), data.table(factor(c("A","B","C","A")))) -# with NA -test(985.1, rbindlist(list(data.table(factor(c("A","B"))), data.table(factor(c("C",NA))))), data.table(factor(c("A","B","C",NA)))) -test(985.2, rbindlist(list(data.table(c("A","B")), data.table(factor(c("C",NA))))), data.table(factor(c("A","B","C",NA)))) - -## Allow unique/duplicated to accept custom colum combination to query for -## uniqueness -dt <- data.table(A = rep(1:3, each=4), B = rep(11:14, each=3), C = rep(21:22, 6), key = "A,B") -df <- as.data.frame(dt) -test(986, unique(dt, by=key(dt)), dt[!duplicated(df[, key(dt)]),]) -test(987, unique(dt, by='A'), dt[!duplicated(df[, 'A'])]) -test(988, unique(dt, by='B'), dt[!duplicated(df[, 'B'])]) -test(989, unique(dt, by='C'), dt[!duplicated(df[, 'C'])]) -test(990, unique(dt, by=c('B', 'C')), dt[!duplicated(df[, c('B', 'C')])]) -test(991, unique(dt, by=NULL), dt[!duplicated(df)]) -test(991.1, unique(dt, by=4), error="'by' value 4 out of range.*1,3") -test(991.2, unique(dt, by=c(1,3.1)), error="'by' is type 'double' but one or more items in it are not whole integers") -test(991.3, unique(dt, by=2:3), dt[!duplicated(df[,c('B','C')])]) -test(991.4, unique(dt, by=c('C','D','E')), error="'by' contains 'D' which is not a column name") - -# :=NULL on factor column in empty data.table, #4809 -DT = data.table(A = integer(), B = factor()) -test(992, DT[, B:=NULL], data.table(A=integer())) - -# That including FUN= works in j=lapply, #4839 -DT = as.data.table(iris) -test(993, DT[, lapply(.SD, function(x) sum(!is.na(x), na.rm=TRUE)), by = Species], - DT[, lapply(.SD, FUN=function(x) sum(!is.na(x), na.rm=TRUE)), by = Species]) - -# fread more than 50,000 columns, the R_PPSSIZE limit in Defn.h -# Takes too long for routine use. TO DO: move to a long running stress test script -#M = matrix(1,nrow=3,ncol=200000) -#f = tempfile() -#write.csv(M,f,row.names=FALSE) -#test(994, fread(f)[[200000]], rep(1L,3)) -#unlink(f) - -# CJ with `sorted = FALSE` option -DT <- data.table(x=rep(3:5, each=4), y=rep(1:6, each=2), z=1:12) -setkey(DT, x, y) -OUT <- DT[J(c(5,5,3,3), c(5,1,5,1))] -test(995, DT[CJ(c(5,3), c(5,1), sorted=FALSE)], OUT) - -# CJ with ordered factor -xx <- factor(letters[1:2], ordered=TRUE) -yy <- sample(2) -test(996, CJ(xx, yy), setkey(data.table(rep(xx, each=2), rep(base::sort.int(yy), 2)))) - -# That CJ orders NA consistently with setkey and historically, now it doesn't use setkey. -# NA must always come first in data.table throughout, since binary search relies on that internally. -test(997, DT <- CJ(c(1,3,NA,2), 5:6), setkey(setkey(copy(DT),NULL))) # double setkey to really rebuild key -test(998, DT <- CJ(as.integer(c(1,3,NA,2)), 5:6), setkey(setkey(copy(DT),NULL))) -test(999, DT <- CJ(c("A","B",NA,"C"), 5:6), setkey(setkey(copy(DT),NULL))) -test(1000, DT <- CJ(c(1,NA,3), c("B",NA,"A"), c(5L,NA_integer_)), setkey(setkey(copy(DT),NULL))) -test(1001, DT <- CJ(c(1,NA,3)), setkey(setkey(copy(DT),NULL))) # The 1 column case is switched inside CJ() so test that too. - -# merge all=TRUE when y is empty, #2633 -a = data.table(P=1:2,Q=3:4,key='P') -b = data.table(P=2:3,R=5:6,key='P') -test(1002, merge(a,b[0],all=TRUE), data.table(merge.data.frame(a,b[0],all=TRUE),key='P')) -a = data.table(c=c(1,2),key='c') -b = data.table(c=3,key='c') -test(1003, merge(a,b[0],all=TRUE), data.table(merge.data.frame(a,b[0],all=TRUE),key='c')) - -# setkey with backticks, #2452 -DT = data.table("Date and Time"=1:3,x=4:6) -test(1004, setkey(copy(DT),`Date and Time`), setkey(DT,"Date and Time")) - -# rbinding with duplicate names, NA or "", #2384 and #2726 -DT = data.table(a=1:3,b=4:6,b=7:9,c=10:12) -test(1005, rbind(DT,DT), data.table(a=rep(1:3,2),b=rep(4:6,2),b=rep(7:9,2),c=rep(10:12,2))) -M <- mtcars -colnames(M)[11] <- NA -# NOTE -- this test requires having options('width') sufficiently wide -test(1006, print(as.data.table(M), nrows=10), output="gear NA.*1: 21.0") - -# rbinding factor with non-factor/character -DT1 <- data.table(x=1:5, y=factor("a")) -DT2 <- data.table(x=1:5, y=2) -test(1007, rbindlist(list(DT1, DT2)), data.table(x = c(1:5, 1:5), y = factor(c(rep('a', 5), rep('2', 5)), levels = c('a', '2')))) -test(1008, rbindlist(list(DT2, DT1)), data.table(x = c(1:5, 1:5), y = factor(c(rep('2', 5), rep('a', 5))))) - -# rbindlist different types -DT1 <- data.table(a = 1L, b = 2L) -DT2 <- data.table(a = 2L, b = 'a') -DT3 <- data.table(a = 2L, b = 2.5) -test(1008.1, rbindlist(list(DT1, DT2)), data.table(a = c(1L,2L), b = c('2', 'a'))) -test(1008.2, rbindlist(list(DT1, DT3)), data.table(a = c(1L,2L), b = c(2, 2.5))) - -# optimized mean() respects na.rm=TRUE by default, as intended -DT = data.table(a=c(NA,NA,FALSE,FALSE), b=c(1,1,2,2)) -test(1009, DT[,list(mean(a), sum(a)),by=b], data.table(b=c(1,2),V1=c(NA,0),V2=c(NA_integer_,0L))) # sum(logical()) should be integer, not real - -# an fread error shouldn't hold a lock on the file on Windows -# TODO: now that these are warnings and not errors, we need another way to trigger a STOP() inside fread.c. options(warn=2) isn't enough. -cat('A,B\n1,2\n3\n5,6\n', file=(f<-tempfile())) -test(1010.1, fread(f,logical01=TRUE), ans<-data.table(A=TRUE, B=2L), warning=(txt<-"Stopped early on line 3.*Expected 2 fields but found 1.*fill.*TRUE.*<<3>>")) -test(1010.2, fread(f,logical01=TRUE), ans, warning=txt) -cat('7\n8,9',file=f,append=TRUE) # that append works after error -test(1010.3, fread(f,fill=TRUE), data.table(A=INT(1,3,5,7,8), B=INT(2,NA,6,NA,9))) -test(1010.4, fread(f,logical01=TRUE), ans, warning=txt) -cat('A,B\n1,2\n3\n5,6\n', file=f) # that overwrite works after error -test(1010.5, fread(f,fill=TRUE), data.table(A=INT(1,3,5), B=INT(2,NA,6))) -test(1010.6, fread(f,logical01=TRUE), ans, warning=txt) -unlink(f) # that file can be removed after error -test(1010.7, !file.exists(f)) - -# detection of unescaped quotes, quote rule 3 -test(1011, fread('A,B\n"aa",1\n"bb,2\n"cc",3\n'), data.table(A=c('aa', '"bb', 'cc'), B=1:3)) -test(1012, fread('A,B\n"aa",1\n"bb"",2\n"cc",3\n'), data.table(A=c("aa", "bb\"", "cc"), B=1:3)) - -# integer64 control to fread -test(1013, fread("A,B\n123,123\n", integer64="integer"), error="integer64='%s' which isn't 'integer64'|'double'|'numeric'|'character'") -test(1014, fread("A,B\n123456789123456,21\n", integer64="character"), data.table(A="123456789123456",B=21L)) -test(1015, fread("A,B\n123456789123456,21\n", integer64="double"), data.table(A=as.double("123456789123456"),B=21L)) -# and that mid read bumps respect integer64 control too .. -x = sample(1:1000,2100,replace=TRUE) # 2100 > 100 JUMPLINES * 10 NJUMP * 2 spacing -DT = data.table( A=as.character(x), B=1:100) -DT[115, A:="123456789123456"] # row 115 is outside the 100 rows at 10 points. -fwrite(DT,f<-tempfile()) -test(1016.1, sapply(suppressWarnings(fread(f,verbose=TRUE)),"class"), c(A="integer64", B="integer"), - output="Rereading 1 columns.*Column 1.*A.*bumped.*int32.*int64.*<<123456789123456>>") -# suppressWarnings for 'bit64 is not installed' warning on AppVeyor where we (correctly) don't install Suggests -test(1016.2, fread(f, colClasses = c(A="numeric"), verbose=TRUE), copy(DT)[,A:=as.numeric(A)], output="Rereading 0 columns") -DT[90, A:="321456789123456"] # inside the sample -write.table(DT,f,sep=",",row.names=FALSE,quote=FALSE) -if (test_bit64) test(1017.1, fread(f), copy(DT)[,A:=as.integer64(A)]) -test(1017.2, fread(f, integer64="character"), DT) -unlink(f) - -# ERANGE errno handled, #4879 -test(1018, identical(fread("1.46761e-313\n"), data.table(V1=1.46761e-313))) -test(1019, fread("A\n1.23456789123456789123456999\n"), data.table(A=1.234567891234568)) - -# crash assigning to row 0, #2754 -DT = data.table(A=1:5,B=6:10) -test(1020, DT[0,A:=6L], DT) -test(1021, DT[NA,A:="foo"], DT) -test(1022, DT[5:0,A:=21L], data.table(A=21L, B=6:10)) -test(1023, DT[c(1,2,NA,3), B:=42L], data.table(A=21L, B=c(42L,42L,42L,9:10))) -test(1024, DT[6,A:=0L], error="i[[]1[]] is 6 which is out of range [[]1,nrow=5[]]") - -# crash assigning to duplicated column names/numbers, #2751 -test(1024.1, DT[,c("B","B"):=NULL], error="Can't assign to the same column twice in the same query (duplicates detected).") -test(1024.2, DT[,c(1,2,1):=NULL], error="Can't assign to the same column twice in the same query (duplicates detected).") - -# as.data.table.table, #4848 -DF <- data.frame(x = c(1,1,2,NA,1,2), y = c("b", "b", "b", "a", "c", "a"), z = c(1,1,1,1,1,2), stringsAsFactors=FALSE ) -tab1 <- as.data.table(as.data.frame(table(DF$x), stringsAsFactors=FALSE)); setattr(tab1, 'names', c("V1", "N")) -tab2 <- as.data.table(as.data.frame(table(DF$x, DF$y), stringsAsFactors=FALSE)); setattr(tab2, 'names', c("V1", "V2", "N")) -tab3 <- as.data.table(as.data.frame(table(DF$x, DF$y, DF$z), stringsAsFactors=FALSE)); setattr(tab3, 'names', c("V1", "V2", "V3", "N")) -test(1025, as.data.table(table(DF$x)), tab1) -test(1026, as.data.table(table(DF$x, DF$y)), tab2) -test(1027, as.data.table(table(DF$x, DF$y, DF$z)), tab3) -# catch printing of data.table(table()), #4847 (as.data.table should be used instead) -# new, updated 14th Feb, 2015. data.table(table) now redirects to as.data.table -test(1027.1, data.table(table(1:99)), as.data.table(table(1:99))) -# data.table() and rbindlist() in v1.8.11 now catch and removes the dim attribute. For it on to test print catches it : -test(1027.2, {DT<-data.table(table(1:99));setattr(DT[[1]],"dim",99L);print(DT)}, error="Invalid column: it has dimensions. Can't format it. If it's the result of data.table(table()), use as.data.table(table()) instead.") - -# as.data.table.x where x is integer, numeric, etc... -set.seed(45) -test(1028, as.data.table(x<-sample(5)), data.table(V1=x)) -test(1029, as.data.table(x<-as.numeric(x)), data.table(V1=x)) -test(1030, as.data.table(x<-as.Date(x, origin="2013-01-01")), data.table(V1=x)) -test(1031, as.data.table(x<-factor(sample(5))), data.table(V1=x)) -test(1032, as.data.table(x<-factor(x, ordered=TRUE)), data.table(V1=x)) -test(1033, as.data.table(x<-as.logical(sample(0:1, 5, TRUE))), data.table(V1=x)) -test(1034, as.data.table(x<-as.character(sample(letters, 5))), data.table(V1=x)) - -######################################### -# All melt.data.table tests go in here # -######################################### -{ - # reshape2 does not need to be loaded to run these. - # We run these routinely, in dev by cc(), on Travis (coverage) and on CRAN - set.seed(45) - DT <- data.table( - i_1 = c(1:5, NA), - i_2 = c(NA,6,7,8,9,10), - f_1 = factor(sample(c(letters[1:3], NA), 6, TRUE)), - c_1 = sample(c(letters[1:3], NA), 6, TRUE), - d_1 = as.Date(c(1:3,NA,4:5), origin="2013-09-01"), - d_2 = as.Date(6:1, origin="2012-01-01")) - DT[, l_1 := DT[, list(c=list(rep(i_1, sample(5,1)))), by = i_1]$c] # generate list cols - DT[, l_2 := DT[, list(c=list(rep(c_1, sample(5,1)))), by = i_1]$c] - - test(1035, melt(DT, id=1:2, measure=3:4), melt(DT, id=c("i_1", "i_2"), measure=c("f_1", "c_1"))) - - ans1 = cbind(DT[, c(1,2,8), with=FALSE], variable=factor("l_1")) - ans1[, value := DT$l_1] - test(1036, melt(DT, id=c("i_1", "i_2", "l_2"), measure=c("l_1")), ans1) - - # melt retains attributes if all are of same type (new) - ans2 = data.table(c_1=DT$c_1, variable=rep(c("d_1", "d_2"), each=6), value=as.Date(c(DT$d_1, DT$d_2)))[!is.na(value)] - test(1037, melt(DT, id=4, measure=5:6, na.rm=TRUE, variable.factor=FALSE), ans2) - - DT2 <- data.table(x=1:5, y=1+5i) # unimplemented class - test(1038, melt(DT2, id=1), error="Unknown column type 'complex'") - - # more tests - DT[, f_2 := factor(c("z", "a", "x", "z", "a", "a"), ordered=TRUE)] - DT[, id := 1:6] - ans1 = cbind(melt(DT, id="id", measure=5:6, value.name="value1"), melt(DT, id=integer(0), measure=7:8, value.name="value2")[, variable:=NULL]) - levels(ans1$variable) = as.character(1:2) - test(1038.2, ans1, melt(DT, id="id", measure=list(5:6, 7:8))) - test(1038.3, ans1, melt(DT, id="id", measure=list(5:6, 7:8), na.rm=TRUE)) # should've no effect - test(1038.7, ans1, melt(DT, id="id", measure=patterns("d_", "l_"))) - # melt retains ordered factors! - test(1038.4, melt(DT, id="id", measure=c("f_1", "f_2"), value.factor=TRUE)$value, factor(c(as.character(DT$f_1), as.character(DT$f_2)), ordered=TRUE)) - # if measure is integer(0) just returns a duplicated data.table with all idcols - test(1038.5, melt(DT, id=1:6, measure=integer(0)), shallow(DT, 1:6)) - # measure.var list with single entry recycles to maximum length - ans = cbind(melt(DT, id="id", measure=c("c_1", "c_1"))[, variable := NULL], melt(DT, id=integer(0), measure=c("f_1", "f_2"))) - setnames(ans, c("id", "value1", "variable", "value2")) - setcolorder(ans, c("id", "variable", "value1", "value2")) - levels(ans$variable) = as.character(1:2) - test(1038.6, melt(DT, id="id", measure=list(c("c_1", "c_1"), c("f_1", "f_2"))), ans) - - # test to ensure attributes on non-factor id-columns are preserved after melt - DT <- data.table(x=1:3, y=letters[1:3], z1=8:10, z2=11:13) - setattr(DT$x, 'foo', 'bla1') - setattr(DT$y, 'bar', 1:4) - test(1222.1, attr(melt(DT, id=1:2)$x, "foo"), "bla1") - test(1222.2, attr(melt(DT, id=1:2)$y, "bar"), 1:4) - - # bug #699 - melt segfaults when vars are not in dt - x = data.table(a=c(1,2),b=c(2,3),c=c(3,4)) - test(1316.1, melt(x, id="d"), error="One or more values") - test(1316.2, melt(x, measure="d"), error="One or more values") - test(1316.3, melt(x, id="a", measure="d"), error="One or more values") - test(1316.4, melt(x, id="d", measure="a"), error="One or more values") - - # fix for #780. - DT = data.table(x=rep(c("a","b","c"),each=3), y=c(1,3,6), v=1:9) - foo = function(input, by, var) { - melt(input, id.vars = by, measure.vars=var) - } - test(1371.1, foo(DT, by="x"), data.table(x=rep(DT$x, 2L), variable=factor(rep(c("y", "v"), each=9L), levels=c("y", "v")), value=c(DT$y, DT$v)), warning="are not all of the same type. By order of hierarchy, the molten data value column will be of type 'double'") - test(1371.2, foo(DT), data.table(x=rep(DT$x, 2L), variable=factor(rep(c("y", "v"), each=9L), levels=c("y", "v")), value=c(DT$y, DT$v)), - warning=c("To be consistent with reshape2's melt, id.vars and", - "'measure.vars'.*are not all of the same type.*Check")) - # Fix for #1055 - DT <- data.table(A = 1:2, B = 3:4, D = 5:6, D = 7:8) - test(1495, melt(DT, id=1:2), data.table(A=1:2, B=3:4, - variable=factor(rep(1L, 4L), labels="D"), value=5:8)) - - # segfault of unprotected var caught with the help of address sanitizer - set.seed(1) - val = sample(c(1:5, NA), 1e4L, TRUE) - dt <- setDT(replicate(100L, val, simplify=FALSE)) - ## to ensure there's no segfault... - ans <- melt(dt, measure.vars=names(dt), na.rm=TRUE) - test(1509, ans, ans) - - # improper levels fix, #1359 - dt = data.table(id=1:3, x=NA_character_, y=c('a', NA_character_, 'c')) - test(1563, melt(dt, id.var="id", na.rm=TRUE), data.table(id=c(1L,3L), variable=factor(c("y", "y")), value=c("a", "c"))) - - # fixing segfault due to negative id and measure vars that I detected by accident - dt = data.table(x=1:5, y=6:10, z=11:15) - test(1569.1, melt(dt, id=-1, measure=NULL), error="One or more values in 'id.vars'") - test(1569.2, melt(dt, id=-1, measure=-1), error="One or more values in 'id.vars'") - test(1569.3, melt(dt, id=NULL, measure=-1), error="One or more values in 'measure.vars'") - test(1569.4, melt(dt, id=5, measure=-1), error="One or more values in 'id.vars'") - test(1569.5, melt(dt, id=1, measure=-1), error="One or more values in 'measure.vars'") -} - -# sorting and grouping of Inf, -Inf, NA and NaN, #4684, #4815 & #4883 -DT <- data.table(x = rep(c(1, NA, NaN, Inf, -Inf), each=2)) -OUT <- data.table(x=c(1, NA, NaN, Inf, -Inf), N=2L) -test(1039, DT[, .N, by=x], OUT) -DT <- data.table(y =c(NA, Inf, NA, -Inf, -Inf, NaN, Inf, 1, NaN, 1)) -OUT <- data.table(y = c(NA, Inf, -Inf, NaN, 1), N=2L) -test(1040, DT[, .N, by=y], OUT) - -# rbindlist on *data.frame* input, #4648. Somehow not test for this. (Although, #4648 was the same as #2650 fixed in v1.8.9). -l <- list(u1=data.frame(i1=c('a', 'b', 'c'), val=1:3, stringsAsFactors=TRUE), - u2=data.frame(i1=c('d', 'e'), val=4:5, stringsAsFactors=TRUE)) -test(1041, rbindlist(l), data.table(i1=factor(letters[1:5]),val=1:5)) - -# negative indexing in *i* leads to crash/wrong aggregates when dogroups is called. bug #2697 -DT = data.table(x = c(1,2,3,4,5), group = c(1,1,2,2,3)) -test(1042, DT[-5, mean(x), by = group], data.table(group=c(1,2), V1=c(1.5, 3.5))) -# Test when abs(negative index) > nrow(dt) - should warn -test(1042.1, DT[-10], DT, warning="Item 1 of i is -10 but there are only 5 rows. Ignoring this and 0 more like it out of 1.") -test(1042.2, DT[c(-5, -10), mean(x), by = group], data.table(group=c(1,2),V1=c(1.5,3.5)), warning="Item 2 of i is -10 but there are only 5 rows. Ignoring this and 0 more like it out of 2.") -test(1043, DT[c(1, -5)], error="Cannot mix positives and negatives.") - -# crash (floating point exception), when assigning null data.table() to multiple cols, #4731 -DT = data.table(x=1:5,y=6:10) -test(1044, DT[3,c("x","y"):=data.table()],error="Supplied 2 columns to be assigned an empty list.*use NULL instead.*list\\(list") -test(1045, DT[3,c("x","y"):=list()],error="Supplied 2 columns to be assigned an empty list.*use NULL instead.*list\\(list") - -# negative indexing with head() and tail(). bug #2375 -d1 = data.table(date = c(1,2,3,4,5), value = c(1,2,3,4,5)) -d2 = data.frame(d1) -test(1046, head(d1, -2), as.data.table(head(d2, -2))) -test(1047, head(d1, 2), as.data.table(head(d2, 2))) -test(1048, head(d1, -10), as.data.table(head(d2, -10))) -test(1049, head(d1, 10), as.data.table(head(d2, 10))) -test(1050, tail(d1, -2), as.data.table(tail(d2, -2))) -test(1051, tail(d1, 2), as.data.table(tail(d2, 2))) -test(1052, tail(d1, -10), as.data.table(tail(d2, -10))) -test(1053, tail(d1, 10), as.data.table(tail(d2, 10))) - -# negative indexing with `:=` - new feature through fixing of #2697, performs as intended for negative subscripts. -x <- data.table(letters=letters[1:5], number=1:5) -test(1054, x[-(1:3), number := 1L], x[4:5, number := 1L]) -test(1055, x[0, number := 1L], x) - -# print.data.table heeds digits=2 etc, #2535 -DT = data.table(x=rep(c("a","b","c"),each=3), y=(30/7)^(2:10))[, logy := log(y)] -test(1056, print(DT, digits=2), output=" x y logy\n1: a 18 2.9\n2: a 79 4.4\n3: a 337 5.8") -test(1057, print(DT, digits=2, big.mark=","), output=" x y logy\n1: a 18 2.9.*6: b 26,556 10.2\n7: c 113,811 11.6") - -# bug #2758 fix - segfault with zeros in i and factors in by -x <- data.table(letters=letters[1:5], factor=factor(letters[1:5]), number=1:5) -test(1058, x[c(0, 3), list(letters, number), by=factor], error="While grouping, i=0 is allowed") -test(1059, x[c(3, 0), list(letters, number), by=factor], error="While grouping, i=0 is allowed") -test(1060, x[c(0, 3), number:=5L, by=factor], error="While grouping, i=0 is allowed") -test(1061, x[c(0, 3), number:=5L], data.table(letters=letters[1:5], factor=factor(letters[1:5]), number=c(1:2,5L,4:5))) - -# bug #2440 fix - seqfault when j refers to grouping variable when results are empty -DT = data.table(x=rep(c("a","b"),each=3),v=c(42,42,42,4,5,6)) -test(1062, DT[x %in% c('z'),list(x2=x),by=x], output="Empty data.table (0 rows) of 2 cols: x,x2") -test(1063, DT[x %in% c('z'),list(vpaste=paste(v,collapse=','),x2=paste(x,x)),by=x], output="Empty data.table (0 rows) of 3 cols: x,vpaste,x2") -test(1064, DT[integer(0), list(x2=x), by=x], output="Empty data.table (0 rows) of 2 cols: x,x2") - -# bug #2445 fix - := fails when subsetting yields NAs and with=FALSE -X = data.table(A=1:3, B=1:6, key="A") -var <- "B" -test(1065, X[J(2:5), (var):=22L], data.table(A=rep(1:3, each=2), B=c(1L,4L,rep(22L,4)), key="A")) - -# fread single unnamed colClasses -f = "A,B,C,D\n1,3,5,7\n2,4,6,8\n" -test(1066, fread(f,colClasses=c("integer","integer","character")), - error="colClasses is an unnamed character vector but its length is 3. Must be.*1 or ncol.*4") -test(1067, fread(f,colClasses=c("integer","numeric","character","character")), data.table(A=1:2,B=c(3,4),C=c("5","6"),D=c("7","8"))) -test(1068, fread(f,colClasses="character"), data.table(A=c("1","2"),B=c("3","4"),C=c("5","6"),D=c("7","8"))) - -# fread select and drop -test(1069, fread(f,drop=c("D","B")), data.table(A=1:2,C=5:6)) -test(1070, fread(f,drop="E"), fread(f), warning="Column name 'E' in 'drop' not found") -test(1071, fread(f,select="B",colClasses=list(numeric="C")), data.table(B=3:4)) -test(1072, fread(f,select="B",drop="C"), error="not both") -test(1073, fread(f,drop=2:3), fread(f,select=c(1,4))) # tests coercing numeric select as well - -# that problem printing duplicate columns doesn't return, #4788 -DT = data.table(V1 = c(1:1000), V2 = c(10001:11000)) -test(1074, DT[, sum(V2), by = V1], output="1000: 1000 11000") # x has two columns both called V1 here - -# add test from #2446. Already fixed but add anyway. "names in neworder not found in x: 'colnames with spaces' from merge() when all.y=TRUE" -X = data.table(a=1:3,b=4:6,"c d"=7:9) -Y = data.table(e=10:12,a=2:4) -test(1075, merge(X,Y,by="a",all=TRUE), data.table(a=c(1:4),b=c(4:6,NA),"c d"=c(7:9,NA),e=c(NA,10:12),key="a")) - -# Fixes #2670. `by` sometimes incorrect for expressions of keyed columns. When by is used like `by=month(date)`, with key column set to "date", grouping+aggregation would be wrong. -DT = data.table(date=as.Date("2013-01-01")+seq(1,1000,by=10),1:100) -setkey(DT,date) -test(1076, DT[,sum(V2),by=month(date)], DT[, sum(V2), by=list(month(date))]) -# just to be sure, second test with another function using sample. -setkey(DT, V2) -ff <- function(x) { set.seed(45); (sample(x)-1) %/% 10} -test(1077, DT[, sum(V2),by=ff(V2)], DT[, sum(V2),by=list(ff(V2))]) - -# rbindlist should discard names on columns, #4890 -d = data.frame(x=1:5) -f = function(x) {suppressWarnings(DF<-data.frame(x=x, y=1:10)); setattr(DF$x,"names","a");DF} -l = apply(d, 1, f) -test(1078.1, length(names(l[[1]]$x)), 10L) # test this test is creating names on the column -test(1078.2, length(names(l[[2]]$x)), 10L) -a = rbindlist(l) -test(1078.3, a$x, rep(1:5,each=10)) # a$x would segfault before the fix to rbindlist - -# data.table() shouldn't retain column names, root cause of #4890 -x = 1:5 -names(x) = letters[1:5] -test(1079.1, DF<-data.frame(x=x, y=1:10), data.frame(x=rep(1:5,2),y=1:10), warning="row names.*discarded") -test(1079.2, lapply(DF, names), list(x=NULL, y=NULL)) -test(1079.3, DT<-data.table(x=x, y=1:10), data.table(x=rep(1:5,2),y=1:10)) -test(1079.4, lapply(DT, names), list(x=NULL, y=NULL)) -# test from similar #4912 for completeness -z = c(a=1,b=2,c=3) -a = data.table(z,x=1:3) -b = rbind(a, data.table(z=2,x=1)) -test(1080, b$z, c(1,2,3,2)) - -# mid row logical detection -test(1081.1, fread("A,B,C\n1,T,2\n",logical01=TRUE), data.table(A=TRUE,B="T",C=2L)) -test(1081.2, fread("A,B,C\n1,T,2\n",logical01=FALSE), data.table(A=1L,B="T",C=2L)) - -# cartesian join answer's key should contain only the columns considered in binary search. Fixes #2677 -set.seed(45) -n <- 10 -DT1 <- data.table(a=sample(1:3, n, replace=TRUE), b=sample(1:3, n, replace=TRUE), c=sample(1:10, n,replace=TRUE), key=c("a", "b", "c")) -DT2 <- data.table(p=sample(1:3, n, replace=TRUE), q=sample(1:3, n, replace=TRUE), r=sample(1:n), w=sample(1:n)) -setkey(DT2, p,q) -ans <- DT1[DT2, nomatch=0, allow.cartesian=TRUE] # NB: DT2 contains duplicate key values so columns c ends up not being sorted -test(1082.1, key(ans), c("a","b")) -test(1082.2, setkeyv(ans, key(ans)), ans) # i.e. key is valid, otherwise re-built warning will be caught -check <- setkey(as.data.table(aggregate(r ~a+b+c, ans, length)), a, b) -test(1083, setkeyv(ans[, list(r = .N), by=key(DT1)], key(ans)), check) # if the key is set properly, then and only then will the aggregation results match with "check" - -# Tests for #2531. `:=` loses POSIXct or ITime attribute: -# first test from this SO post: http://stackoverflow.com/questions/15996692/cannot-assign-columns-as-date-by-reference-in-data-table -dt <- data.table(date = as.IDate(sample(10000:11000, 10), origin = "1970-01-01")) -dt[, group := rep(1:2, 5)] -dt[, min.group.date := as.IDate(min(date)), by = group] -test(1084, class(dt$min.group.date), c("IDate", "Date")) - -dt <- data.table(date = as.IDate(sample(10000:11000, 10), origin = "1970-01-01")) -dt[, group := rep(1:2, 5)] -dt[, min.group.date := min(date), by = group] # don't need to wrap it with as.IDate(.) -test(1085, class(dt$min.group.date), c("IDate", "Date")) - -# second test from this SO post: http://stackoverflow.com/questions/14604820/why-does-this-posixct-or-itime-loses-its-format-attribute -DT = data.table(x=as.POSIXct(c("2009-02-17 17:29:23.042", "2009-02-17 17:29:25.160")), y=c(1L,2L)) -DT[,x1:=as.ITime(x)] -DT[,`:=`(last.x=tail(x,1L),last.x1=tail(x1,1L)),by=y] -test(1086, class(DT$last.x), c("POSIXct", "POSIXt")) -test(1087, class(DT$last.x1), "ITime") - -# Tests 1088-1093 were non-ASCII. Now in DtNonAsciiTests - -# print of unnamed DT with >20 <= 100 rows, #97 (RF#4934) -DT <- data.table(x=1:25, y=letters[1:25]) -DT.unnamed <- unname(copy(DT)) -test(1094.1, capture.output(print(DT.unnamed)), - c(" ", " 1: 1 a", " 2: 2 b", " 3: 3 c", " 4: 4 d", - " 5: 5 e", " 6: 6 f", " 7: 7 g", " 8: 8 h", " 9: 9 i", - "10: 10 j", "11: 11 k", "12: 12 l", "13: 13 m", "14: 14 n", - "15: 15 o", "16: 16 p", "17: 17 q", "18: 18 r", "19: 19 s", - "20: 20 t", "21: 21 u", "22: 22 v", "23: 23 w", "24: 24 x", - "25: 25 y", " ")) - -# print of blank-named DT (eliminating matrix notation) -# #545 (RF#5253) and part of #1523 -DT <- data.table(x = 1:3) -setnames(DT, "") -test(1094.2, capture.output(print(DT)), c(" ", "1: 1", "2: 2", "3: 3")) - -# DT[!TRUE] or DT[!TRUE, which=TRUE], #4930. !TRUE still can be a recycling operation with !(all TRUE) -DT <- data.table(x=1:3, y=4:6) -test(1095.1, DT[!TRUE], DT[FALSE]) -test(1095.2, DT[!TRUE, which=TRUE], DT[FALSE, which=TRUE]) - -######### incremented tests by 1 as I've used 1096 for FR #2077 (above along with already existing tests 522): ########### -# roll backwards when i is keyed and rollends=FALSE -# http://stackoverflow.com/questions/18984179/roll-data-table-with-rollends -dt1 = data.table(Date=as.Date(c("2013-01-03","2013-01-07")),key="Date")[,ind:=.I] -dt2 = data.table(Date=seq(from=as.Date("2013-01-01"),to=as.Date("2013-01-10"), by="1 day"),key="Date") -test(1097, dt1[dt2,roll=-Inf,rollends=FALSE]$ind, INT(NA,NA,1,2,2,2,2,NA,NA,NA)) # now ok -test(1098, dt1[dt2,roll=-Inf,rollends=TRUE]$ind, INT(1,1,1,2,2,2,2,2,2,2)) # ok before -test(1099, dt1[dt2,roll=-Inf,rollends=c(TRUE,FALSE)]$ind, INT(1,1,1,2,2,2,2,NA,NA,NA)) # ok before -test(1100, dt1[dt2,roll=-Inf,rollends=c(FALSE,TRUE)]$ind, INT(NA,NA,1,2,2,2,2,2,2,2)) # now ok - -######################################### -# All dcast.data.table tests go in here # -######################################### -{ - # reshape2 does not need to be loaded to run these. - # On 14 March 2018, as part of pruning long tests PR#2671, Matt replaced the y value of these tests with the known result. Before that, the tests - # coerced to data.frame and comparing to the result of calling the reshape2::dcast data.frame method. Using an explicit known correct result is more - # robust than checking that two packages agree; e.g. these check the result is correctly keyed now too. We still Suggest reshape2 but if it has any - # problems on CRAN it won't now impact our tests. - # We run these routinely, in dev by cc(), on Travis (coverage) and on CRAN - - # Just this first test in an extra one originally for #825 to test reshape::cast. Matt retained the test and tweaked it to test dcast - # instead (which retains the Date class, unlike reshape::cast it seems). - DT = data.table( - ID = c(611557L, 611557L, 611557L, 894125L, 894125L, 894125L, 894125L, 894125L, 898856L, 898856L, 898856L, 898856L, 898856L, 898856L, 898899L, 898899L, 898899L), - DATUM = structure(c(16101, 16071, 16261, 16104, 16133, 16167, 16201, 16236, 16089, 16118, 16147, 16176, 16236, 16208, 16163, 16125, 16209), class = "Date"), - N = c(25L, 9L, 23L, 29L, 26L, 26L, 27L, 28L, 39L, 39L, 38L, 36L, 40L, 39L, 19L, 20L, 19L), rank = c(2, 1, 3, 1, 2, 3, 4, 5, 1, 2, 3, 4, 6, 5, 2, 1, 3)) - test(1101, dcast(DT, ID ~ rank, value.var = "DATUM"), data.table( - ID = c(611557L, 894125L, 898856L, 898899L), - "1" = as.Date(c("2014-01-01", "2014-02-03", "2014-01-19", "2014-02-24")), - "2" = as.Date(c("2014-01-31", "2014-03-04", "2014-02-17", "2014-04-03")), - "3" = as.Date(c("2014-07-10", "2014-04-07", "2014-03-18", "2014-05-19")), - "4" = as.Date(c(NA, "2014-05-11", "2014-04-16", NA)), - "5" = as.Date(c(NA, "2014-06-15", "2014-05-18", NA)), - "6" = as.Date(c(NA, NA, "2014-06-15", NA)), key="ID")) - - names(ChickWeight) <- tolower(names(ChickWeight)) - DT = melt(as.data.table(ChickWeight), id=2:4) # calls melt.data.table - - # changed 'mean' to 'sum' to avoid valgrind floating point precision based error. - test(1102.1, dcast(DT, time ~ variable, fun=sum)[c(1,2,11,.N)], data.table(time=c(0,2,20,21),weight=c(2053,2461,9647,9841), key="time")) - test(1102.2, dcast(DT, diet ~ variable, fun=sum), data.table(diet=factor(1:4), weight=c(22582, 14714, 17154, 15961), key="diet")) - test(1102.3, dcast(DT, diet+chick ~ time, drop=FALSE)[c(1,.N),c(1:4,13:14)], - ans<-data.table(diet=factor(c(1,4)), chick=ordered(c(18,48),levels=levels(DT$chick)), "0"=39, "2"=c(35,50), "20"=c(NA,303), "21"=c(NA,322), key="diet,chick")) - test(1102.4, dcast(DT, diet+chick ~ time, drop=FALSE, fill=0)[c(1,.N),c(1:4,13:14)], ans[1, c("20","21"):=0]) - # add test for 'subset=' in dcast - test(1102.5, dcast(DT, time + chick ~ variable+diet, fun=sum, subset=.(time> 20))[c(1,2,44,.N)], - data.table(time=21, chick=ordered(c(13,9,42,48), levels=levels(DT$chick)), weight_1=c(96,98,0,0), weight_2=0, weight_3=0, weight_4=c(0,0,281,322), key="time,chick")) - - # testing without aggregation - set.seed(3) - DT = data.table(a=5:1, b=runif(5)) - ans = dcast(DT, a ~ b, value.var="b")[c(4,.N), c(2,6)] - setnames(ans, substring(names(ans),1,6)) - test(1102.6, ans, data.table("0.1680"=c(NA,DT[1,b]), "0.8075"=c(DT[2,b],NA))) - - # Fix for case 2 in bug report #5149 - dcast didn't aggregate properly when formula RHS has "." - set.seed(45) - DT = data.table(x=rep(1:5, each=3), y=runif(15, 0, 1)) - test(1102.7, dcast(DT, x ~ ., mean, value.var="y")[,`.`:=as.integer(`.`*10000)], data.table(x=1:5, "."=INT(3972,3427,3224,4182,3994), key="x")) - # also quashed another bug with `.` in formula (when there's no aggregate function): - DT = data.table(a=sample(5), b=runif(5), c=5:1) - test(1102.8, dcast(DT, a ~ ., value.var="c"), data.table(a=1:5,"."=INT(3,1,5,4,2), key="a")) - test(1102.9, dcast(DT, b+a~., value.var="c")[,b:=as.integer(b*1000)][], data.table(b=INT(129,319,585,662,891), a=INT(3,4,1,5,2), "."=5:1)) - - # more tests for `dcast` with formula being character and errors when formula is a hybrid - set.seed(1) - DT = data.table(a=rep(1:5, each=5), b=runif(25)) - test(1102.11, dcast(DT, " a~ . ", value.var="b", fun=length), data.table(a=1:5, `.`=5L, key="a")) - test(1102.12, dcast(DT, "a ~ c ", value.var="b"), error="not found or of unknown type") - test(1102.13, dcast(DT, a ~ a, value.var="c"), error="are not found in 'data'") - - # fix for #5379 - issue when factor columns on formula LHS along with `drop=FALSE` - set.seed(1L) - DT = data.table(a=factor(sample(letters[1:3], 10, replace=TRUE), letters[1:5]), - b=factor(sample(tail(letters, 5), 10, replace=TRUE))) - test(1102.14, dcast(DT, a~b, drop=FALSE, fun=length, value.var="b"), - data.table(a=factor(letters[1:5]), v=INT(0,1,0,0,0), w=INT(1,1,1,0,0), x=INT(0,0,1,0,0), y=INT(2,1,1,0,0), z=INT(0,1,0,0,0), key="a")) - - # reverse the levels - set.seed(1L) - DT = data.table(a=factor(sample(letters[1:3], 10, replace=TRUE), letters[5:1]), - b=factor(sample(tail(letters, 5), 10, replace=TRUE))) - test(1102.14, dcast(DT, a~b, drop=FALSE, value.var="b", fun=length), - data.table(a=factor(c("e","d","c","b","a"),levels=levels(DT$a)), v=INT(0,0,0,1,0), w=INT(0,0,1,1,1), x=INT(0,0,1,0,0), y=INT(0,0,1,1,2), z=INT(0,0,0,1,0), key="a")) - - # more factor cols - set.seed(1L) - DT = data.table(a1=factor(sample(letters[1:3], 10, replace=TRUE), letters[1:5]), # factor col 1 - a2=factor(sample(letters[6:10], 10, replace=TRUE), letters[6:10]), # factor col 2 - a3=sample(letters[1:3], 10, TRUE), # no factor - b=factor(sample(tail(letters, 5), 10, replace=TRUE))) - test(1102.15, dcast(DT, a1+a2+a3~b, drop=FALSE, value.var="b")[c(1,21,.N),lapply(.SD,as.character)], - data.table(a1=c("a","b","e"), a2=c("f","g","j"), a3=c("a","c","c"), v=NA_character_, x=NA_character_, y=c(NA,"y",NA), z=NA_character_, key="a1,a2,a3")) - - # dcast bug fix for 'subset' argument (it doesn't get key set before to run C-fcast): - DT = data.table(x=c(1,1,1,2,2,2,1,1), y=c(1,2,3,1,2,1,1,2), z=c(1,2,3,NA,4,5,NA,NA)) - test(1102.16, dcast(DT, x~y, value.var="z", subset=.(!is.na(z))), data.table(x=c(1,2), `1`=c(1,5), `2`=c(2,4), `3`=c(3,NA), key="x")) - - # FR #5675 and DOC #5676 - set.seed(1L) - DT = data.table(a=sample(10), b=2013:2014, variable=rep(c("c", "d"), each=10), value=runif(20)) - test(1102.17, names(dcast(DT, a ~ ... + b, value.var="value")), c("a", "c_2013", "c_2014", "d_2013", "d_2014")) - - # bug git #693 - dcast error message improvement: - DT = data.table(x=c(1,1), y=c(2,2), z = 3:4) - test(1102.18, dcast(DT, x ~ y, value.var="z", fun.aggregate=identity), error="should take vector inputs and return a single value") - - # bug #688 - preserving attributes - DT = data.table(id = c(1,1,2,2), ty = c("a","b","a","b"), da = as.Date("2014-06-20")) - test(1102.19, dcast(DT, formula = id ~ ty, value.var="da"), data.table(id=c(1,2), a=as.Date("2014-06-20"), b=as.Date("2014-06-20"), key="id")) - - # issues/713 - dcast and fun.aggregate - DT = data.table(id=rep(1:2, c(3,4)), k=c(rep(letters[1:3], 2), 'c'), v=1:7) - foo = function (tbl, fun.aggregate) { - dcast(tbl, id ~ k, value.var='v', fun.aggregate=fun.aggregate, fill=NA_integer_) - } - test(1102.21, foo(DT, last), dcast(DT, id ~ k, value.var='v', fun.aggregate=last, fill=NA_integer_)) - - # more minor changes to dcast (subset argument handling symbol - removing any surprises with data.table's typical scoping rules) - test for that. - DT = data.table(id=rep(1:2, c(3,4)), k=c(rep(letters[1:3], 2), 'c'), v=1:7) - bla = c(TRUE, rep(FALSE, 6L)) - # calling `subset=.(bla)` gives eval error when testing... not sure what's happeing! using values directly instead for now. - test(1102.22, dcast(DT, id ~ k, value.var="v", subset=.(c(TRUE, rep(FALSE, 6L)))), dcast(DT[1L], id ~ k, value.var="v")) - DT[, bla := !bla] - test(1102.23, dcast(DT, id ~ k, value.var="v", subset=.(bla), fun.aggregate=length), dcast(DT[(bla)], id ~ k, value.var="v", fun.aggregate=length)) - - # issues/715 - DT = data.table(id=rep(1:2, c(3,2)), k=c(letters[1:3], letters[1:2]), v=1:5) - test(1102.24, dcast(DT, id ~ k, fun.aggregate=last, value.var="v"), error="should take vector inputs and return a single value") - test(1102.25, dcast(DT, id ~ k, fun.aggregate=last, value.var="v", fill=NA_integer_), data.table(id=1:2, a=c(1L, 4L), b=c(2L,5L), c=c(3L,NA_integer_), key="id")) - - # Fix for #893 - DT = data.table( - x = factor("a", levels = c("a", "b")), - y = factor("b", levels = c("a", "b")), - z = 1 - ) - test(1102.26, dcast(DT, y ~ x, drop = FALSE, value.var="z"), - data.table(y=factor(c("a","b")), a=c(NA,1), b=c(NA_real_,NA), key="y")) - - # dcast.data.table new tests - # Fix for #1070 (special case of ... on LHS) - DT = data.table(label= month.abb[1:5], val=0) - test(1102.27, dcast(DT,... ~ label, value.var="val", sum), - data.table(`.`=".", Apr=0, Feb=0, Jan=0, Mar=0, May=0, key=".")) - # Fix for #862 (optional prefixes) - DT = data.table(name=c("Betty","Joe","Frank","Wendy","Sally"), - address=c(rep("bla1",2), rep("bla2",2), "bla3")) - test(1102.28, dcast(DT, address ~ paste("cust", DT[, seq_len(.N), by=address]$V1, sep=""), value.var="name"), - data.table(address=paste("bla",1:3,sep=""), cust1=c("Betty", "Frank", "Sally"), cust2=c("Joe", "Wendy", NA), key="address")) - - # Fix for #1037 (optional prefixes + undefined variables) - DT = data.table(V1 = c(0L, 1L, 2L, 3L, 4L, 0L, 1L, 2L, 3L, 4L), - V2 = c(1.052, 0.542, 0.496, 0.402, 0.278, 5.115, 4.329, 4.121, 4.075, 4.0088)) - test(1102.29, dcast(DT, cumsum(V1 == 0) ~ V1, value.var = 'V2')[,lapply(.SD,function(x)as.integer(x*1000))], - data.table(V1=INT(1000,2000), "0"=INT(1052,5115), "1"=INT(542,4329), "2"=INT(496,4121), "3"=INT(402,4075), "4"=INT(278,4008), key="V1")) - - # Implement #716 and #739 (multiple value.var and fun.aggregate) - # multiple value.var - set.seed(1) - DT = data.table(x=sample(5,20,TRUE), y=sample(2,20,TRUE), - z=sample(letters[1:2], 20,TRUE), d1 = runif(20), d2=1L) - test(1102.31, dcast(DT, x + y ~ z, fun=sum, value.var=c("d1","d2"))[c(1,.N)][, 3:4:=lapply(.SD,round,4), .SDcols=c("d1_a","d1_b")][], - data.table(x=INT(1,5), y=INT(1,1), d1_a=c(0.0,0.4785), d1_b=c(0.8753,0.9804), d2_a=INT(0,1), d2_b=INT(1,3), key="x,y")) - # multiple fun.agg - test(1102.32, dcast(DT, x + y ~ z, fun=list(sum, mean), value.var="d1")[c(1,.N)][, 3:6:=lapply(.SD,round,3), .SDcols=3:6][], - data.table(x=INT(1,5), y=INT(1,1), d1_sum_a=c(0.0,0.479), d1_sum_b=c(0.875,0.980),d1_mean_a=c(NaN,0.479),d1_mean_b=c(0.875,0.327), key="x,y")) - # multiple fun.agg and value.var (all combinations) - test(1102.33, dcast(DT, x + y ~ z, fun=list(sum, mean), value.var=c("d1", "d2"))[c(1,.N)][, c(3,4,7:10):=lapply(.SD,round,3), .SDcols=c(3,4,7:10)][], - data.table(x=INT(1,5), y=INT(1,1), d1_sum_a=c(0.0,0.479), d1_sum_b=c(0.875,0.980),d2_sum_a=INT(0,1),d2_sum_b=INT(1,3), - d1_mean_a=c(NaN,0.479),d1_mean_b=c(0.875,0.327),d2_mean_a=c(NaN,1),d2_mean_b=c(1,1), key="x,y")) - # multiple fun.agg and value.var (one-to-one) - test(1102.34, dcast(DT, x + y ~ z, fun=list(sum, mean), value.var=list("d1", "d2"))[c(1,.N)][, 3:4:=lapply(.SD,round,3), .SDcols=3:4][], - data.table(x=INT(1,5), y=INT(1,1), d1_sum_a=c(0.0,0.479), d1_sum_b=c(0.875,0.980),d2_mean_a=c(NaN,1),d2_mean_b=c(1,1), key="x,y")) - - # Additional test after fixing fun.agg creation - using the example here: https://github.com/Rdatatable/data.table/issues/716 - DT = data.table(x=1:5, y=paste("v", 1:5, sep=""), v1=6:10, v2=11:15, k1=letters[1:5], k2=letters[6:10]) - DT.m = melt(DT, id=1:2, measure=list(3:4, 5:6)) - test(1102.35, dcast(DT.m, x ~ y, fun.aggregate = list(sum, function(x) paste(x, collapse="")), value.var=list("value1", "value2")), - data.table(x=1:5, value1_sum_v1=INT(17,0,0,0,0), value1_sum_v2=INT(0,19,0,0,0), value1_sum_v3=INT(0,0,21,0,0), - value1_sum_v4=INT(0,0,0,23,0), value1_sum_v5=INT(0,0,0,0,25), value2_function_v1=c("af","","","",""), - value2_function_v2=c("","bg","","",""), value2_function_v3=c("","","ch","",""), value2_function_v4=c("","","","di",""), - value2_function_v5=c("","","","","ej"), key="x")) - - # more testing on fun.aggregate - DT = as.data.table(airquality) - ans = suppressWarnings(melt(DT, id=c("Month", "Day"), na.rm=TRUE)) # warning regards coercion to double - ans = ans[ , .(min=min(value), max=max(value)), by=.(Month, variable)] - ans = melt(ans, id=1:2, variable.name="variable2") - ans = dcast(ans, Month ~ variable + variable2) - setnames(ans, c("Month", paste(names(ans)[-1L], sep="_"))) - valvars = c("Ozone", "Solar.R", "Wind", "Temp") - ans2 = suppressWarnings(dcast(DT, Month ~ ., fun=list(min, max), na.rm=TRUE, value.var=valvars)) - setcolorder(ans, names(ans2)) - test(1102.36, key(ans), "Month") - test(1102.37, ans, ans2[, names(ans2)[-1L] := lapply(.SD, as.numeric), .SDcols=-1L]) - - # test for #1210, sep argument for dcast - DT = data.table(x=sample(5,20,TRUE), y=sample(2,20,TRUE), z=sample(letters[1:2],20,TRUE), d1=runif(20), d2=1L) - test(1102.38, names(dcast(DT, x ~ y + z, fun=length, value.var = "d2", sep=".")), - c("x", "1.a", "1.b", "2.a", "2.b")) -} - -# test for freading commands -x1 <- data.table(a = c(1:5), b = c(1:5)) -f <- tempfile() -write.csv(x1, f, row.names = FALSE) -if (.Platform$OS.type == "unix") { - gl = identical(Sys.getenv("CI_SERVER_NAME"), "GitLab CI") - if(gl){ - # skip test which fails in CI, data.table#1506 - x2 = try(fread(paste('grep -v 3 ', f, sep="")), silent = TRUE) - if(is.data.table(x2)) test(1105, x1[a != 3], x2) - } else { - test(1105, x1[a != 3], fread(paste('grep -v 3 ', f, sep=""))) - } -} else { - # x2 <- fread(paste('more ', f, sep="")) - # Doesn't work on winbuilder. Relies on 'more' available in DOS via Cygwin? - # Error: - # Syntax error: end of file unexpected (expecting ")") - # Error: (converted from warning) running command 'sh.exe -c (more D:\temp\RtmpgB8D2P\file1ed828a511cd) > D:\temp\RtmpgB8D2P\file1ed84f9f44f8' had status 2 - # test(1105, x1, x2) -} -unlink(f) - -# test for "key" argument of [.data.table -#x1 <- data.table(a = c(1:5), b = c(5:1)) -#x1[J(2), key = 'a'] -#test(1106, key(x1) == 'a') -#x1[, a, key = NULL] -#test(1107, is.null(key(x1))) - -# test that eval works inside expressions -DT <- data.table(a = c(1:5)) -s <- quote(a) -test(1108, DT[, sum(eval(s))], DT[, sum(a)]) - -# test that boolean expression does not trigger a not-join -DT <- data.table(a = 1:3, b = c(TRUE,FALSE,NA)) -test(1109, DT[b != TRUE], DT[!(b == TRUE)]) - -# test that a column named list is ok (this also affects other functions in by, might be worth adding a test for that) -DT <- data.table(list = 1:6, a = 1:2) -test(1111, DT[, lapply(.SD, sum), by = a], DT[, list(list = sum(list)), by = a]) - -# fix for #4995. "rbind" retains key when the first argument isn't a data.table (.rbind.data.table is never run is the issue) -DT <- data.table(name=c('Guff','Aw'),id=101:102,id2=1:2,key='id') -y <- rbind(list('No','NON',0L),DT,list('Extra','XTR',3L)) -test(1112, key(y), NULL) - -# fix for http://stackoverflow.com/questions/14753411/why-does-data-table-lose-class-definition-in-sd-after-group-by -# where, .SD loses class information. -format.myclass <- function(x, ...){ - paste("!!", x, "!!", sep = "") -} -DT <- data.table(L = rep(letters[1:3],3), N = 1:9) -setattr(DT$N, "class", "myclass") -test(1113, class(DT[, .SD, by = L]$N), class(DT$N)) -setkey(DT, L) -test(1114, class(DT[, .SD, by = L]$N), class(DT$N)) -test(1115, class(DT[J(unique(L)), .SD, by=.EACHI]$N), class(DT$N)) - -# Fix for #4994 - not-join quoted expression dint work... -dt = data.table(a = 1:2, key = 'a') -dt1 = data.table(a = 1) -expr = quote(!dt1) -test(1116, dt[eval(expr)], dt[2]) -expr = quote(!1) -test(1117, dt[eval(expr)], dt[2]) - -# Fix for #2381 - optimisation of `DT[, lapply(.SD, function(x) FUN(x, bla)), by=key(DT)]` where "bla" is a column in DT dint work. -set.seed(45) -dt <- data.table(x=rep(1:4, each=4), b1=sample(16), b2=runif(16)) -setkey(dt, x) -test(1118, dt[, lapply(.SD, function(y) weighted.mean(y, b2, na.rm=TRUE)), by=x], dt[, lapply(.SD, weighted.mean, b2, na.rm=TRUE), by=x]) - -# a(nother) test of #295 -DT <- data.table(x=5:1, y=1:5, key="y") -test(1119, is.null(key(DT[, list(z = y, y = 1/y)]))) - - -## various ordered factor rbind tests -DT = data.table(ordered('a', levels = c('a','b','c'))) -DT1 = data.table(factor('a', levels = c('b','a','f'))) -DT2 = data.table(ordered('b', levels = c('b','d','c'))) -DT3 = data.table(c('foo', 'bar')) -DT4 = data.table(ordered('a', levels = c('b', 'a'))) - -test(1120, rbind(DT, DT1, DT2, DT3), data.table(ordered(c('a','a','b', 'foo', 'bar'), levels = c('a','b','d','c','f', 'foo', 'bar')))) -test(1121, rbindlist(list(DT, DT1, DT2, DT3)), data.table(ordered(c('a','a','b', 'foo', 'bar'), levels = c('a','b','d','c','f', 'foo', 'bar')))) -test(1122, rbind(DT, DT4), data.table(factor(c('a','a'), levels = c('a','b','c'))), warning="ordered factor levels cannot be combined, going to convert to simple factor instead") -test(1123, rbindlist(list(DT, DT4)), data.table(factor(c('a','a'), levels = c('a','b','c'))), warning="ordered factor levels cannot be combined, going to convert to simple factor instead") -test(1124, rbind(DT1, DT1), data.table(factor(c('a','a'), levels = c('b','a','f')))) -test(1125, rbindlist(list(DT1, DT1)), data.table(factor(c('a','a'), levels = c('b','a','f')))) - -# coverage of rbindlist.c:289, #2346. -# The hashing there hashes pointer address (CHARSXP) so this test attempts to use a large enough -# sample of unique strings to generate that condition reliably to test that collision branch. -set.seed(1) -manyChars = paste0("id",sample(99999,10000)) -DT1 = data.table(ordered(sample(manyChars, 1000), levels=sample(manyChars))) -DT2 = data.table(factor(sample(manyChars, 1000))) -test(1125.1, rbindlist(list(DT1,DT2))[c(1,2,.N-1,.N),as.character(V1)], c("id85645","id80957","id73436","id33445")) - -## test rbind(..., fill = TRUE) -DT = data.table(a = 1:2, b = 1:2) -DT1 = data.table(a = 3:4, c = 1:2) - -test(1126, rbind(DT, DT1, fill = TRUE), data.table(a = 1:4, b = c(1:2, NA, NA), c = c(NA, NA, 1:2))) - -## check for #4959 - rbind'ing empty data.table's -DT = data.table(a=character()) -#test(1127, rbind(DT, DT), DT) - -## check for #5005 -DT = data.table(a=0:2,b=3:5,key="a") -test(1128, DT[, (function(){b})()], DT[, b]) - -## Fix for FR #4867 -DT <- data.table(x=1:5, y=6:10) -test(1129.1, DT[, as.factor(c("x", "y")), with=FALSE], DT) -test(1129.2, DT[, as.factor(c("x", "x")), with=FALSE], DT[, list(x, x)]) - -# Fix for a specific case that results in error in `construct` function in data.table.R (found and fixed during #5007 bug fix) -MyValueIsTen <- 10 -set.seed(1) -DT <- data.table(ID=sample(LETTERS[1:3], 6, TRUE), Value1=rnorm(6), Value2=runif(6)) -cols <- c("Value1", "Value2") -DT2 <- copy(DT) -test(1130, DT[, (cols) := lapply(.SD, function(x) MyValueIsTen), by=ID], DT2[, (cols) := 10]) - -# Fix for #5007 - The value MyValueIsTen = 10 was never recognised (value within the function environment) -MyValueIsTen <- 5 -set.seed(1) -DT <- data.table(ID=sample(LETTERS[1:3], 6, TRUE), Value1=rnorm(6), Value2=runif(6)) -My_Fun <- function(x=copy(DT)) { - MyValueIsTen <- 10 - cols <- c("Value1", "Value2") - x[, (cols) := lapply(.SD, function(x) MyValueIsTen), by=ID] -} -DT[, (cols) := 10] -test(1131, My_Fun(), DT) - -# Test for #4957 - where `j` doesn't know `.N` when used with `lapply(.SD, function(x) ...)` -test(1132, DT[, lapply(.SD, function(x) .N), by=ID], data.table(ID=c("A", "B", "C"), Value1=2L, Value2=2L)) - -# Test for #4990 - `:=` does not generate recycling warning during 'by': -DT <- data.table(x=c(1,1,1,1,1,2,2)) -# on a new column -test(1133.1, DT[, new := c(1,2), by=x], data.table(x=c(1,1,1,1,1,2,2), new=c(1,2,1,2,1,1,2)), warning="Supplied 2 items to be assigned to group 1 of size 5 in column 'new'") -# on an already existing column -test(1133.2, DT[, new := c(1,2), by=x], data.table(x=c(1,1,1,1,1,2,2), new=c(1,2,1,2,1,1,2)), warning="Supplied 2 items to be assigned to group 1 of size 5 in column 'new'") - -# Fix for FR #2496 - catch `{` in `:=` expression in `j`: -DT <- data.table(x=c("A", "A", "B", "B"), val =1:4) -DT2 <- copy(DT)[, a := 1L] -test(1134.1, DT[, {a := 1L}], DT2) -test(1134.2, DT[, {a := 1L; NULL}], error="You have wrapped.*which is ok.*Consider") -test(1134.3, DT[, {b := 2L}, by=x], DT2[, b:=2L, by=x]) -test(1134.3, DT[, {b := 2L; sum(val)}, by=x], error="You have wrapped.*which is ok.*Consider") - -# FR #2693 and Gabor's suggestions from here: http://r.789695.n4.nabble.com/Problem-with-FAQ-2-8-tt4668878.html (correcting software according to FAQ 2.8) -d1 <- data.table(id1 = c(1L, 2L, 2L, 3L), val = 1:4, key = "id1") -d2 <- data.table(id2 = c(1L, 2L, 4L), val2 = c(11, 12, 14),key = "id2") -d3 <- copy(d2) -setnames(d3, names(d1)) - -test(1136.1, d1[d2, id1], INT(1,2,2,4)) -test(1136.2, d1[d2, id1], d1[d2][,id1]) -test(1136.3, d1[d2, id2], INT(1,2,2,4)) -test(1136.4, d1[d2, id2], d1[d2, list(id1,id2,val,val2)][,id2]) -test(1136.5, d1[d3, i.id1], INT(1,2,2,4)) -test(1136.6, d1[d3, i.id1], d1[d3, list(id1,i.id1)][,i.id1]) -test(1136.7, d1[d2, val], c(1:3, NA)) -test(1136.8, d1[d2, val2], c(11,12,12,14)) -test(1136.9, d1[d3, list(id1, val, i.val)], data.table(id1=INT(1,2,2,4), val=c(1:3, NA), i.val=c(11,12,12,14), key="id1")) -test(1136.11, d1[d3, list(id1, i.id1, val, i.val)], data.table(id1=INT(1,2,2,4), - i.id1=INT(1,2,2,4), val=c(1:3, NA), i.val=c(11,12,12,14), key="id1")) -test(1136.12, d1[d2], data.table(id1=INT(1,2,2,4), val=c(1:3, NA), val2=c(11,12,12,14), key="id1")) - -test(1136.13, d1[J(2), id1], INT(2,2)) -test(1136.14, d1[J(2), i.id1], error="not found") - -DT <- data.table(x=c("A", "A", "C", "C"), y=1:4, key="x") -test(1136.15, DT["C", i.x], error="not found") - -# test for FR #4979 -DT <- data.table(x=1:5, y=6:10, z=11:15) -test(1137.1, DT[, .SD, .SDcols=-1L], DT[, 2:3, with=FALSE]) -test(1137.2, DT[, .SD, .SDcols=-(1:2)], DT[, 3, with=FALSE]) -test(1137.3, DT[, .SD, .SDcols=-"y"], DT[, c(1,3), with=FALSE]) -test(1137.4, DT[, .SD, .SDcols=-c("y", "x")], DT[, 3, with=FALSE]) -test(1137.5, DT[, .SD, .SDcols=-which(names(DT) %in% c("x", "y", "z"))], null.data.table()) -test(1137.6, DT[, .SD, .SDcols=c(1, -2)], error=".SDcols is numeric but has both") -test(1137.7, DT[, .SD, .SDcols=c("x", -"y")], error="invalid argument to unary") -test(1137.8, DT[, .SD, .SDcols=c(-1, "x")], error="Some items of .SDcols are") - -DT <- data.table(x=1:5, y=6:10, z=11:15, zz=letters[1:5]) -test(1137.9, DT[, .SD, .SDcols=-grep("^z", names(DT))], DT[, 1:2, with=FALSE]) -test(1137.10, DT[, .SD, .SDcols=-grep("^z", names(DT), value=TRUE)], DT[, 1:2, with=FALSE]) -test(1137.11, DT[, .SD, .SDcols=-grep("^z", names(DT), value=TRUE, invert=TRUE)], DT[, 3:4, with=FALSE]) - -set.seed(45) -DT = data.table(x=c("A", "A", "C", "C"), y=1:4, z=runif(4)) -test(1137.12, DT[, lapply(.SD, sum), by=x, .SDcols=-"y"], DT[, lapply(.SD, sum), by=x, .SDcols="z"]) - -# test for FR #353 / R-Forge #5020 - print.data.table gets new argument "row.names", default=TRUE. if FALSE, the row-names don't get printed -# Thanks to Eddi for `capture.output` function! -DT <- data.table(x=1:5, y=6:10) -test(1138.1, capture.output(print(DT, row.names=FALSE)), c(" x y", " 1 6", " 2 7", " 3 8", " 4 9", " 5 10")) -DT <- data.table(x=1:101, y=6:106) # bug described in #1307 -test(1138.2, capture.output(print(DT, row.names=FALSE)), c(" x y", " 1 6", " 2 7", " 3 8", " 4 9", " 5 10", "--- ", " 97 102", " 98 103", " 99 104", " 100 105", " 101 106")) - -# test for FR #2591 (format.data.table issue with column of class "formula") -DT <- data.table(x=c(a~b, c~d+e), y=1:2) -test(1139, capture.output(print(DT)), c(" x y", "1: a ~ b 1", "2: c ~ d + e 2")) - -# FR #4813 - provide warnings if there are remainders for both as.data.table.list(.) and data.table(.) -X = list(a = 1:2, b = 1:3) -test(1140, as.data.table(X), data.table(a=c(1:2,1L), b=c(1:3)), warning="Item 1 is of size 2 but maximum") -test(1141.1, data.table(a=1:2, b=1:3), data.table(a=c(1L,2L,1L), b=1:3), warning="Item 1 is of size 2 but maximum") -test(1141.2, data.table(a=1:2, data.table(x=1:5, y=6:10)), data.table(a=c(1L,2L,1L,2L,1L), x=1:5, y=6:10), warning="Item 1 is of size 2 but maximum") -test(1141.3, data.table(a=1:5, data.table(x=c(1,2), y=c(3,4))), data.table(a=c(1:5), x=c(1,2,1,2,1), y=c(3,4,3,4,3)), warning="Item 2 is of size 2 but maximum") - -# Fix for bug #5098 - DT[, foo()] returns function definition. -DT <- data.table(a=1:2) -foo <- function() sum(1:5) -test(1142, DT[, foo()], 15L) - -# Fix for bug #5104 - side-effect of fixing #2531 - `:=` with grouping (by) and assigning factor columns -DT <- data.table(x=c(1,1,1,2,2), y=factor(letters[1:5])) -test(1144.1, DT[, z := y, by=x], data.table(x=c(1,1,1,2,2), y=factor(letters[1:5]), z=factor(letters[1:5]))) -# Added 3 more tests to close bug #5437 - partial regression due to recent changes (in 1.9.2) -# This should catch any attributes being lost hereafter. -DT<-data.table(X=factor(2006:2012),Y=rep(1:7,2)) -test(1144.2, DT[, Z:=paste(X,.N,sep=" - "), by=list(X)], data.table(X=factor(2006:2012),Y=rep(1:7,2), Z=paste(as.character(2006:2012), 2L, sep=" - "))) -DT = data.table(x=as.POSIXct(c("2009-02-17 17:29:23.042", "2009-02-17 17:29:25.160")), y=c(1L,2L)) -test(1144.4, DT[, list(lx=x[.N]), by=x], data.table(x=DT$x, lx=DT$x)) -ans = copy(DT) -test(1144.3, DT[,`:=`(lx=tail(x,1L)), by=y], ans[, lx := x]) - -# FR #2356 - retain names of named vector as column with keep.rownames=TRUE -x <- 1:5 -setattr(x, 'names', letters[1:5]) -test(1144.1, as.data.table(x, keep=TRUE), data.table(rn=names(x), x=unname(x))) -x <- as.numeric(x) -setattr(x, 'names', letters[1:5]) -test(1144.2, as.data.table(x, keep=TRUE), data.table(rn=names(x), x=unname(x))) -x <- as.character(x) -setattr(x, 'names', letters[1:5]) -test(1144.3, as.data.table(x, keep=TRUE), data.table(rn=names(x), x=unname(x))) -x <- as.factor(x) -setattr(x, 'names', letters[1:5]) -test(1144.4, as.data.table(x, keep=TRUE), data.table(rn=names(x), x=unname(x))) -x <- as.Date(1:5, origin="2013-01-01") -setattr(x, 'names', letters[1:5]) -test(1144.5, as.data.table(x, keep=TRUE), data.table(rn=names(x), x=unname(x))) - -# Fix for bug #5114 - .data.table.locked ISSUE -DT <- data.table(x=1:5, y=6:10) -xx <- DT[, .SD, .SDcols="y"] -test(1145, xx[, y := as.numeric(y)], data.table(y = as.numeric(6:10))) - -# Fix for bug #5115 - set not adding columns on class that builds on data.table -DT <- as.data.table(BOD) -ans = copy(DT)[, Time := as.numeric(Time)] -setattr(DT, "class", c("myclass", class(DT))) -setattr(ans, 'class', class(DT)) -test(1146.1, DT[, Time:= as.numeric(Time)], ans) -DF <- as.data.frame(DT) -test(1146.2, {set(DF, i=NULL, j=1L, value=seq_len(nrow(DF)));setattr(DF,"reference",NULL);DF}, data.frame(Time=1:nrow(BOD), demand=BOD$demand)) -test(1146.3, set(DF, i=NULL, j="bla", value=seq_len(nrow(DF))), error="set() on a data.frame is for changing existing columns, not adding new ones. Please use a data.table for that.") - -if (.Machine$sizeof.longdouble == 16) { - # To not run on CRAN's solaris-sparc 32bit where sizeof.longdouble==0 - - old = getNumericRounding() - - set.seed(6) - x = rnorm(1e6)*1e4 - ans = base::sort.list(x, method="shell") - setNumericRounding(0) - test(1147.1, ans, forderv(x)) - setNumericRounding(1) - test(1147.2, ans, forderv(x)) - setNumericRounding(2) - test(1147.3, sum(ans != forderv(x)), 2L) - - tol = 3.000214e-13 - x = c(8, NaN, Inf, -7.18918, 5.18909+0.07*tol, NA, -7.18918111, -Inf, NA, 5.18909, NaN, 5.18909-1.2*tol, 5.18909-0.04*tol) - - test(1147.4, binary(x[c(5,10,12,13)]), - c("0 10000000001 010011000001101000001100111100011000 00000000 11000000", - "0 10000000001 010011000001101000001100111100011000 00000000 10101000", - "0 10000000001 010011000001101000001100111100010111 11111111 00010011", - "0 10000000001 010011000001101000001100111100011000 00000000 10011010")) - - setNumericRounding(0) - test(1147.5, forderv(x), INT(6, 9, 2, 11, 8, 7, 4, 12, 13, 10, 5, 1, 3)) - - setNumericRounding(1) - test(1147.6, forderv(x), INT(6, 9, 2, 11, 8, 7, 4, 12, 5, 10, 13, 1, 3)) - - setNumericRounding(2) - test(1147.7, forderv(x), INT(6, 9, 2, 11, 8, 7, 4, 5, 10, 12, 13, 1, 3)) - # rounds item 12 at bit 48 doesn't just truncate - - setNumericRounding(old) -} - -test(1149.1, forderv(integer(0)), integer(0)) -test(1149.2, forderv(numeric(0)), integer(0)) - -# test uniqlengths -set.seed(45) -x <- sample(c(NA_integer_, 1:1e4), 1e6, TRUE) -ox <- forderv(x) -o1 <- uniqlist(list(x), ox) -test(1151.1, c(diff(o1), length(x)-tail(o1, 1L)+1L), uniqlengths(o1, length(x))) -o1 <- uniqlist(list(x)) -test(1151.2, c(diff(o1), length(x)-tail(o1, 1L)+1L), uniqlengths(o1, length(x))) - -# #5190 fix - grouping with .SDcols gave "symbol not subsettable error" - consequence of FR #4979 implementation -dt = data.table(grp = sample(letters[1:3],20, replace = TRUE), v1 = rnorm(20), v2 = rnorm(20)) -sd.cols <- "v1" -test(1152, dt[, lapply(.SD, mean), by=grp, .SDcols=sd.cols], dt[, list(v1=mean(v1)), by=grp]) - -# #5171 fix - setattr attribute non-character led to segfault -x <- FALSE -test(1153, setattr(x, FALSE, FALSE), error="Attribute name must be") - -# Fixed binary search capabilities for NA (for int and double) and NaN (for double): -set.seed(1) -DT <- data.table(x=sample(c(NA, NaN, Inf, 1:10), 100, TRUE), y=sample(c(NA, 1:10), 100, TRUE), z=sample(c(NA_character_, letters[1:10]), 100, TRUE)) -setkey(DT, x) -test(1154.1, DT[J(NaN)], DT[is.nan(x)]) -test(1154.2, DT[J(NA_real_)], DT[is.na(x) & !is.nan(x)]) -setkey(DT, y) -test(1154.3, setcolorder(DT[J(NA_integer_)], c("x", "y", "z")), DT[is.na(y)]) -setkey(DT, z) -test(1154.4, setcolorder(DT[J(NA_character_)], c("x", "y", "z")), DT[is.na(z)]) - -# Fixing the binary search above for NA/NaN also fixes BUG #4918 -dt1 <- data.table(x = c('red','orange','green'), y=c(1,2,NA), key='y') -dt2 <- data.table(y = c(1,2,3,NA), z = c('a','b','c','missing data'), key='y') -test(1155.1, merge(dt1, dt2, by=c('y')), data.table(y=dt1$y, x=dt1$x, z=dt2$z[1:3], key="y")) -test(1155.2, dt2[dt1], data.table(y=dt1$y, z=dt2$z[1:3], x=dt1$x, key="y")) -test(1155.3, dt1[dt2, nomatch=0L], data.table(x=dt1$x, y=dt1$y, z=dt2$z[1:3], key="y")) - -# NaN wasn't properly searched for in some cases. Fixed that. Here's the fix! -dt <- structure(list(x = c(NaN, NaN, NaN, NaN, NaN, NA, NA, -3, -3, --3, -2, -2, -1, 0, 0, 0, 1, 1, 2, 2, 2, 2, 2, 3, 3), y = c(16L, -25L, 23L, 17L, 21L, 11L, 13L, 15L, 1L, 6L, 4L, 18L, 7L, 3L, 12L, -24L, 2L, 10L, 20L, 14L, 9L, 19L, 8L, 22L, 5L)), .Names = c("x", -"y"), row.names = c(NA, -25L), class = c("data.table", "data.frame" -)) -setkey(dt, x) -test(1155.4, dt[J(NaN)], dt[is.nan(x)]) -test(1155.5, dt[J(NA_real_)], dt[is.na(x) & !is.nan(x)]) - - -# Fix for (usually small) memory leak when grouping, #2648. -# Deliberate worst case: largest group (100000 rows) followed last by a small group (1 row). -DT = data.table(A=rep(1:2,c(100000,1)), B=runif(100001)) -before = gc()["Vcells",2] -for (i in 1:50) DT[, sum(B), by=A] -after = gc()["Vcells",2] -test(1157, after < before+3) # +3 = 3MB -# Before the patch, Vcells grew dramatically from 6MB to 60MB. Now stable at 6MB. Increase 50 to 1000 and it grew to over 1GB for this case. - -# Similar for when dogroups writes less rows than allocated, #2648. -DT = data.table(k = 1:50, g = 1:20, val = rnorm(1e4)) -before = gc()["Vcells",2] -for (i in 1:50) DT[ , unlist(.SD), by = 'k'] -after = gc()["Vcells",2] -test(1158, after < before+3) # 177.6MB => 179.2MB. Needs to be +3 now from v1.9.8 with alloccol up from 100 to 1024 - -# tests for 'setDT' - convert list, DF to DT without copy -x <- data.frame(a=1:4, b=5:8) -test(1159.1, setDT(x), data.table(a=1:4, b=5:8)) -x <- list(1:4, 5:8) -test(1159.2, setDT(x), data.table(1:4, 5:8)) -x <- list(a=1:4, b=5:8) -test(1159.3, setDT(x), data.table(a=1:4, b=5:8)) -x <- list(a=1:4, 5:8) -test(1159.4, setDT(x), setnames(data.table(1:4, 5:8), c("a", "V1"))) -x <- data.table(a=1:4, b=5:8) -test(1159.5, setDT(x), data.table(a=1:4, b=5:8)) -x <- 1:5 -test(1159.6, setDT(x), error="Argument 'x' to 'setDT' should be a") -x <- list(1, 2:3) -test(1159.7, setDT(x), error="All elements in argument 'x' to 'setDT'") - -# tests for setrev -x <- sample(10) -y <- rev(x) -setrev(x) -test(1160.1, y, x) -x <- sample(c(1:10, NA), 21, TRUE) -y <- rev(x) -setrev(x) -test(1160.2, y, x) -x <- sample(runif(10)) -y <- rev(x) -setrev(x) -test(1160.3, y, x) -x <- sample(c(runif(10), NA, NaN), 21, TRUE) -y <- rev(x) -setrev(x) -test(1160.4, y, x) -x <- sample(letters) -y <- rev(x) -setrev(x) -test(1160.5, y, x) -x <- as.logical(sample(0:1, 20, TRUE)) -y <- rev(x) -setrev(x) -test(1160.6, y, x) -x <- list(1:10) -test(1160.7, setrev(x), error="Input 'x' must be a vector") - -# tests for setreordervec -# integer -x <- sample(c(-10:10, NA), 100, TRUE) -o <- base::order(x, na.last=FALSE) -y <- copy(x) -setreordervec(y, o) -test(1161.1, x[o], y) -# numeric -x <- sample(c(NA, rnorm(10)), 100, TRUE) -o <- base::order(x, na.last=FALSE) -y <- copy(x) -setreordervec(y, o) -test(1161.2, x[o], y) -# character -x <- sample(c(NA, letters), 100, TRUE) -o <- base::order(x, na.last=FALSE) -y <- copy(x) -setreordervec(y, o) -test(1161.3, x[o], y) - -# tests for setreordervec -DT <- data.table(x=sample(c(NA, -10:10), 2e2, TRUE), - y=sample(c(NA, NaN, -Inf, Inf, -10:10), 2e2, TRUE), - z=sample(c(NA, letters), 2e2, TRUE)) -# when not sorted, should return FALSE -test(1162.1, is.sorted(DT[[1L]]), FALSE) -setkey(DT, x) -test(1162.2, is.sorted(DT[[1L]]), TRUE) - -test(1162.3, is.sorted(DT[[2L]]), FALSE) -setkey(DT, y) -test(1162.4, is.sorted(DT[[2L]]), TRUE) - -test(1162.5, is.sorted(DT[[3L]]), FALSE) -setkey(DT, z) -test(1162.6, is.sorted(DT[[3L]]), TRUE) - -setkey(DT, x, y) -test(1162.7, length(forderv(DT, by=1:2)), 0L) -setkey(DT, x, z) -test(1162.8, length(forderv(DT, by=c(1L, 3L))), 0L) -setkey(DT, y, z) -test(1162.9, length(forderv(DT, by=2:3)), 0L) -setkey(DT) -# test number 1162.10 skipped because if it fails it confusingly prints out as 1662.1 not 1662.10 -test(1162.11, length(forderv(DT, by=1:3)), 0L) -test(1162.12, is.sorted(DT, by=1:3), TRUE, warning="Use.*forderv.*for efficiency in one step, so you have o as well if not sorted") -test(1162.13, is.sorted(DT, by=2:1), FALSE, warning="Use.*forderv.*for efficiency in one step, so you have o as well if not sorted") - -# FR #5152 - last on length=0 arguments -x <- character(0) -test(1163, last(x), character(0)) - -# Test 1164 was a non-ASCII test, now in DtNonAsciiTests - -# Bug fix for #5117 - segfault when rbindlist on empty data.tables -x <- as.data.table(BOD) -y <- copy(x) -test(1165, x[Time>100], rbindlist(list(x[Time > 100], y[Time > 200]))) - -# Bug fix for the #5300 - rbind(DT, NULL) should not result in error, but BOD has an attribute as well, which won't be preserved (due to C-impl). Changing test. -setattr(x <- as.data.table(BOD), 'reference', NULL) -test(1166, x, rbind(x, NULL)) - -# fix for bug #5307 - ordering with multiple columns in which at least one of them is a logical column -foo = data.table(a=rep(c(0L,1L,0L,1L),2), b=rep(c(TRUE,TRUE,FALSE,FALSE),2), c=1L) -test(1167, foo[, .N, by=list(b,a)], data.table(b=c(TRUE, TRUE, FALSE, FALSE), a=c(0L,1L,0L,1L), N=2L)) - -# fix for bug #5355 - rbindlist with factor columns and empty data.tables resulted in error. -A <- data.table(x=factor(1), key='x') -B <- data.table(x=factor(), key='x') -test(1168.1, rbindlist(list(B,A)), data.table(x=factor(1))) - -# fix for bug #5120, it's related to rbind and factors as well - more or less similar to 1168.1 (#5355). Seems to have been fixed with that commit. Just adding test here. -tmp1 <- as.data.table(structure(list(Year = 2013L, Maturity = structure(1L, .Label = c("<1", -"1.0 - 1.5", "1.5 - 2.0", "2.0 - 2.5", "2.5 - 3.0", "3.0 - 4.0", -"4.0 - 5.0", ">5.0"), class = "factor"), Quality = structure(2L, .Label = c(">BBB", -"BBB", "BB", "B", "CCC", "700 tests so far - without NaN/NA -########################################################################################### -# - Generate a random seed each time; the randomness allows catching errors quicker -# - But save the seed so that we can generate the same data back if any error occurs -seed = as.integer(Sys.time()) # sample(9999L, 1L) temporary fix, because all the set.seed(.) used above makes this sample() step deterministic (always seed=9107) -seedInfo = paste("forder decreasing argument test: seed = ", seed," ", sep="") -# no NaN (because it's hard to match with base:::order) ## TODO: add tests with NaN -set.seed(seed) -foo <- function(n) apply(matrix(sample(letters, n*8L, TRUE), ncol=8L), 1, paste, sep="") -i1 = as.integer(sample(c(-100:100), 1e3, TRUE)) -i2 = as.integer(sample(c(-100:100, -1e6, 1e6), 1e3, TRUE)) -d1 = as.numeric(sample(c(-100:100,Inf,-Inf), 1e3, TRUE)) -d2 = as.numeric(rnorm(1e3)) -c1 = sample(c(letters), 1e3, TRUE) -c2 = sample(foo(200), 1e3, TRUE) - -DT = data.table(i1, i2, d1, d2, c1, c2) -# randomise col order as well -colorder=sample(ncol(DT)) -setcolorder(DT, names(DT)[colorder]) -seedInfo = paste(seedInfo, "colorder = ", paste(colorder, collapse=","), sep="") -ans = vector("list", length(names(DT))) - -test_no = 1223.0 -oldnfail = nfail -for (i in seq_along(names(DT))) { - cj = as.matrix(do.call(CJ, split(rep(c(1L,-1L), each=i), 1:i))) - ans[[i]] = combn(names(DT), i, function(x) { - tmp = apply(cj, 1, function(y) { - test_no <<- signif(test_no+.001, 7) - ll = as.call(c(as.name("order"), - lapply(seq_along(x), function(j) { - if (y[j] == 1L) - as.name(x[j]) - else { - if (class(DT[[x[j]]]) =="character") - as.call(c(as.name("-"), as.call(list(as.name("xtfrm"), as.name(x[j]))))) - else - as.call(list(as.name("-"), as.name(x[j]))) - } - }) - )) - test(test_no, forderv(DT, by=x, order=y), with(DT, eval(ll))) - }) - dim(tmp)=NULL - list(tmp) - }) -} -ans = NULL -if (nfail > oldnfail) cat(seedInfo, "\n") # to reproduce - -# fix for bug #5405 - unique on null data.table should return null data.table -test(1224, unique(data.table(NULL)), data.table(NULL)) - -# forderv should return 'integer(0)' when 'x' is not atomic and of 0 length (to be consistent with base:::order) -test(1225.1, forderv(list()), integer(0)) -test(1225.2, forderv(data.table(NULL)), integer(0)) - -# fix for bug #5377 - data.table(null list, data.frame, data.table) should return null data.table -test(1226.1, data.table(list()), null.data.table()) -test(1226.2, data.table(data.frame(NULL)), null.data.table()) -test(1226.3, data.table(data.table(NULL)), null.data.table()) -test(1226.4, data.table(data.frame()), null.data.table()) -test(1226.5, data.table(data.table()), null.data.table()) - -# fix for bug #5321 - POSIXlt issue. -DT1 = data.frame(id=1:3, d=strptime(c("06:02:36", "06:02:48", "07:03:12"), "%H:%M:%S")) -setDT(DT1) -test(1227, data.table(id=1:3, d=strptime(c("06:02:36", "06:02:48", "07:03:12"), "%H:%M:%S")), DT1, warning="POSIXlt column type detected and converted to") - -# fix for bug #5296 - retaining class of original data.table after passing through `[.data.table` -DT <- data.table(a=1:2,b=3:4) -setattr(DT, "class", c("newclass", class(DT))) -test(1228.1, class(DT), class(DT[a>1])) -test(1228.2, class(DT), class(DT[, list(b)])) -test(1228.3, class(DT), class(DT[, "b", with=FALSE])) -test(1228.4, class(DT), class(DT[, sum(b), by=a])) -test(1228.5, class(DT), class(DT[a>1, sum(b), by=a])) -test(1228.6, class(DT), class(DT[a>1, c:=sum(b), by=a])) - -# test 1229 was non-ASCII, now in package DtNonAsciiTests - -# Test that ad hoc by detects if ordered and dogroups switches to memcpy if contiguous, #1050 -DT = data.table(a=1:3,b=1:6,key="a") -options(datatable.optimize=1) # turn off GForce, to test dogroups -test(1230, DT[, sum(b), by=a, verbose=TRUE], output="memcpy contiguous groups") -setkey(DT,NULL) -test(1231, DT[, sum(b), by=a, verbose=TRUE], output="memcpy contiguous groups") -test(1232, DT[, sum(b), by=a+1, verbose=TRUE], output="memcpy contiguous groups") -test(1233, DT[, sum(b), by=a%%2, verbose=TRUE], output="collecting discontiguous groups") -test(1234, DT[, sum(a), by=b, verbose=TRUE], output="collecting discontiguous groups") -setkey(DT,a) -test(1235, DT[.(2:3),sum(b),by=.EACHI,verbose=TRUE], data.table(a=2:3,V1=c(7L,9L),key="a"), output="memcpy contiguous groups") -test(1236, DT[.(3:2),sum(b),by=.EACHI,verbose=TRUE], data.table(a=3:2,V1=c(9L,7L)), output="memcpy contiguous groups") -test(1237, DT[.(3:2),sum(b),keyby=.EACHI,verbose=TRUE], data.table(a=2:3,V1=c(7L,9L),key="a"), output="memcpy contiguous groups") -options(datatable.optimize=Inf) - -# check that key is not preserved when length of fastorder is > 0 -DT <- data.table(x=1:5, y=6:10, key="x") -test(1238.1, key(setorder(DT, x)), "x") -test(1238.2, key(setorder(DT, -x)), NULL) - -# Fix for bug #5366 - setkey fails when non-key columns are of type list. -DT <- data.table(x=5:1, y=as.list(1:5)) -test(1239.1, setkey(DT, x), setattr(data.table(x=1:5, y=as.list(5:1)), 'sorted', 'x')) -DT <- data.table(x=5:1, y=as.list(1:5)) -test(1239.2, setorder(DT, x), data.table(x=1:5, y=as.list(5:1))) - -# Fix for bug #5408 - order of as.data.table.table is different when doing as.data.table(with(DT, table(x,y))) -set.seed(123) -DT <- data.table(XX = sample(LETTERS[1:5], 1000, replace = TRUE), yy = sample(1:5, 1000, replace = TRUE)) -ans1 <- as.data.table(DT[, table(XX, yy)]) -ans2 <- as.data.table(table(DT$XX, DT$yy)) -setnames(ans1, 'N', 'Freq') -setnames(ans2, names(ans1)) -test(1240.1, ans1, setDT(as.data.frame(with(DT, table(XX, yy)), stringsAsFactors=FALSE))) -test(1240.2, ans2, ans1) - -# R 3.3.0 started to use data.table's radix sort by default for order() on integer/factors. -# Therefore we check against the non-data.table method ('shell') for correctness (otherwise we'd be -# checking data.table code against itself) as well as checking data.table's ported code in R; -# i.e. a three-way match. -if (base::getRversion() < "3.3.0") { - base_order <- base::order -} else { - base_order <- function(..., na.last=TRUE, method=c("shell","radix")) { - ans1 = base::order(..., na.last=na.last, method="shell") - if (!is.na(na.last) || base::getRversion()>"3.3.3") { - ans2 = base::order(..., na.last=na.last, method="radix") - if (!identical(ans1,ans2)) stop("Base R's order(,method='shell') != order(,method='radix')") - } else { - # Only when na.last=NA in just R 3.3.0-3.3.3 we don't check shell==radix - # because there was a problem in base R's port of data.table code then when : - # 1) 2 or more vectors were passed to base::order(,method="radix") - # AND 2) na.last=NA - # AND 3) there is a subgroup of size exactly 2 - # AND 4) one of those 2 items in the subgroup is NA and the other is not NA - # See tests 1728.3 and 1728.13. - } - ans1 - } -} - -# Test for optimisation of 'order' to 'forder'. Copied to benchmarks.Rraw too. -set.seed(45L) -DT = data.table(x=sample(1e2, 1e5, TRUE), y=sample(1e2, 1e5, TRUE)) -old = options(datatable.optimize=Inf) -test(1241, DT[order(x,-y)], # optimized to forder() - DT[base_order(x,-y)]) # not optimized -options(old) - -DT = data.table(a=1:3, b=4:6) -myCol = "a" -test(1242.1, DT[2,myCol:=6L,with=FALSE], data.table(a=INT(1,6,3), b=4:6), warning="with=FALSE together with := was deprecated in v1.9.4 released Oct 2014. Please") -test(1242.2, DT[2,(myCol):=7L], data.table(a=INT(1,7,3), b=4:6)) - -# consistency of output type of mult, #5378 -DT = data.table(id=rep(1:2,each=2), var=rnorm(4), key="id") -test(1243, DT[.(1:2), list(var)][c(2,4)], DT[.(1:2), list(var), mult="last"]) -test(1244, DT[.(1:2), var], DT$var) -test(1245, DT[.(1:2), var][c(2,4)], DT[.(1:2), var, mult="last"]) - -############################################# -# FR #5205 - fromLast argument to duplicated -############################################# -seed = as.integer(Sys.time()) -seedInfo = paste("forder decreasing argument test: seed = ", seed," ", sep="") -set.seed(seed) -DT <- data.table(w=sample(-5:5, 100, TRUE), -x=as.numeric(sample(-5:5, 100, TRUE)), -y=sample(paste("id", 1:10, sep=""), 100, TRUE), -z=sample(c(TRUE, FALSE), 100, TRUE)) - -colorder=sample(ncol(DT)) -setcolorder(DT, names(DT)[colorder]) -seedInfo = paste(seedInfo, "colorder = ", paste(colorder, collapse=","), sep="") - -test_no = 1246.0 -oldnfail = nfail -for (i in seq_along(names(DT))) { - cc = combn(names(DT), i) - apply(cc, 2L, function(jj) { - test_no <<- signif(test_no+.01, 7) # first without key - test(test_no, duplicated(DT, by=jj, fromLast=TRUE), duplicated.data.frame(DT[, jj, with=FALSE], fromLast=TRUE)) - test_no <<- signif(test_no+.01, 7) - setkeyv(DT, jj) # with key - test(test_no, duplicated(DT, by=jj, fromLast=TRUE), duplicated.data.frame(DT[, jj, with=FALSE], fromLast=TRUE)) - }) -} -if (nfail > oldnfail) cat(seedInfo, "\n") # to reproduce - -# with NA -DT <- data.table(w=sample(c(-5:5,NA_integer_), 100, TRUE), -x=as.numeric(sample(c(-5:5, NA), 100, TRUE)), -y=sample(c(NA, paste("id", 1:10, sep="")), 100, TRUE), -z=sample(c(NA, TRUE, FALSE), 100, TRUE)) - -colorder=sample(ncol(DT)) -setcolorder(DT, names(DT)[colorder]) -seedInfo = paste(seedInfo, "colorder = ", paste(colorder, collapse=","), sep="") - -oldnfail = nfail -for (i in seq_along(names(DT))) { - cc = combn(names(DT), i) - apply(cc, 2L, function(jj) { - test_no <<- signif(test_no+.01, 7) # first without key - test(test_no, duplicated(DT, by=jj, fromLast=TRUE), duplicated.data.frame(DT[, jj, with=FALSE], fromLast=TRUE)) - test_no <<- signif(test_no+.01, 7) - setkeyv(DT, jj) # with key - test(test_no, duplicated(DT, by=jj, fromLast=TRUE), duplicated.data.frame(DT[, jj, with=FALSE], fromLast=TRUE)) - }) -} -if (nfail > oldnfail) cat(seedInfo, "\n") # to reproduce - -# FR #5172 - anyDuplicated.data.table -set.seed(45L) -dt <- data.table(x=sample(3,10,TRUE), y=sample(letters[1:3], 10,TRUE)) -test(1247.1, anyDuplicated(dt), anyDuplicated.data.frame(dt)) -test(1247.2, anyDuplicated(dt, fromLast=TRUE), anyDuplicated.data.frame(dt, fromLast=TRUE)) -test(1247.3, anyDuplicated(dt, by="y"), anyDuplicated.data.frame(dt[, "y", with=FALSE])) -test(1247.4, anyDuplicated(dt, by="y", fromLast=TRUE), anyDuplicated.data.frame(dt[, "y", with=FALSE], fromLast=TRUE)) - -# Fix for #5423 - j-expression y * eval(parse(..)) should work without needing "(" -DT <- data.table(x = seq(1,10,1), y = seq(2,20,2)) -test(1248.1, DT[, y := y * eval(parse(text="1*2"))], data.table(x=seq(1,10,1), y=seq(4,40,4))) -# fix in 1248 was not complete. resurfaced again as bug #5527. Fixed now, test added here below: -DT <- data.table(id=1:5, var=letters[1:5]) -ans <- copy(DT) -idPrefix <- "va" # if this variable were named 'id' then the paste(id) below would see the 'id' _column_. -test(1248.2, DT[, eval(parse(text=paste(idPrefix,"r",sep="")))], letters[1:5]) -test(1248.3, DT[, id2:=eval(parse(text=paste(idPrefix,"r",sep="")))], ans[, id2 := var]) - -# test to make sure DT[order(...)] works fine when it's already sorted (forgot the case where forder returns integer(0) before) -DT <- data.table(x=rep(1:4, each=5), y=1:20) -test(1249.1, DT[order(x)], DT) -test(1249.2, DT[order(y)], DT) -test(1249.3, DT[order(x,y)], DT) - -# Fix for #5424 - duplicated 'by=FALSE' inconsistency -set.seed(1L) -DT <- data.table(x=sample(3,10,TRUE), y=sample(2,10,TRUE), key="x") -test(1250.1, duplicated(DT, by=NULL), duplicated.data.frame(DT)) -test(1250.2, duplicated(DT, by=FALSE), error="Only NULL, column indices or column names are allowed in by") -test(1250.3, duplicated(DT, by=TRUE), error="Only NULL, column indices or column names are allowed in by") - -# more tests for DT[order(...)] - now testing 'decreasing=FALSE/TRUE' argument -set.seed(1L) -DT <- data.table(x=sample(3,10,TRUE), y=sample(2,10,TRUE)) -test(1251.1, DT[order(x,y,decreasing=TRUE)], DT[order(-x,-y)]) -test(1251.2, DT[order(x,-y,decreasing=TRUE)], DT[order(-x,y)]) -# test in case of complex calls. check out the note in setkey.R under 'forder' for differences in forder and order for 'list' inputs. base is inconsistent I find. -ix = with(DT, order(x+y)) -test(1251.3, DT[order(x+y)], DT[ix]) -ix = with(DT, order(-x-y)) -test(1251.4, DT[order(-x-y)], DT[ix]) -ix = with(DT, order(x+y, decreasing=TRUE)) -test(1251.5, DT[order(x+y, decreasing=TRUE)], DT[ix]) -ix = with(DT, order(4*x-5*y, decreasing=TRUE)) -test(1251.6, DT[order(4*x-5*y, decreasing=TRUE)], DT[ix]) -ix = with(DT, order(1-DT$x, decreasing=TRUE)) -test(1251.7, DT[order(1-DT$x, decreasing=TRUE)], DT[ix]) -test(1251.8, DT[order(x, list(-y), decreasing=TRUE)], - error = "Column 2 is length 1 which differs from length of column 1.*10") -test(1251.9, DT[base::order(x, list(-y), decreasing=TRUE)], - error = "argument lengths differ") # data.table's error is more helpful than base's -# more "edge cases" to ensure we're consistent with base -test(1251.11, DT[order("a")], DT[1L]) -test(1251.12, DT[order("b", "a")], DT[1L]) -test(1251.13, DT[order(list("b", "a"))], error = "First column being ordered is type 'list', not yet supported") -test(1251.14, DT[order(list("b"), list("a"))], DT[1L]) - -############################################################## -# extensive tests for order optimisation within `[.data.table` -############################################################## -seed = as.integer(Sys.time()) -# This choice of seed by Arun was very good as it revealed problems that a fixed seed would not. -# Test 1844 is now added to consistently run the rare cases discovered here (depending on the seed) to cover all lines in -# forder consistently to save pull requests failing coverage tests randomly, issue #2346 -seedInfo = paste("forder decreasing argument test: seed = ", seed," ", sep="") -set.seed(seed) -# these variable try to simulate groups of length 1, 2, < 200, > 200 so as to cover all different internal implementations -foo <- function(n) apply(matrix(sample(letters, n*8L, TRUE), ncol=8L), 1, paste, sep="") -i1 = as.integer(sample(rep(c(-3:3, NA_integer_), c(1, 2, 190, 300, 7, 190, 210, 100)))) -i2 = as.integer(sample(rep(c(-2:2, -1e6, 1e6, NA_integer_), c(1, 2, 190, 300, 7, 190, 210, 100)))) -d1 = as.numeric(sample(rep(c(-2:2,Inf,-Inf, NA_real_, 5, -1e3), c(1, 190, 2, 300, 7, 50, 50, 100, 150, 150)))) -c1 = sample(rep(c(letters[1:5], NA_character_, "z"), c(1, 2, 190, 7, 300, 200, 300))) -c2 = sample(c(foo(200), NA_character_), 1e3, TRUE) - -DT = data.table(i1, i2, d1, c1, c2) -# randomise col order as well -colorder=sample(ncol(DT)) -setcolorder(DT, names(DT)[colorder]) -seedInfo = paste(seedInfo, "colorder = ", paste(colorder, collapse=","), sep="") -ans = vector("list", length(names(DT))) - -test_no = 1253.13 -oldnfail = nfail -for (i in seq_along(names(DT))) { - cj = as.matrix(do.call(CJ, split(rep(c(1L,-1L), each=i), 1:i))) - ans[[i]] = combn(names(DT), i, function(x) { - tmp = apply(cj, 1, function(y) { - test_no <<- signif(test_no+.001, 7) - ll = as.call(c(as.name("base_order"), - lapply(seq_along(x), function(j) { - if (y[j] == 1L) - as.name(x[j]) - else { - if (class(DT[[x[j]]]) =="character") - as.call(c(as.name("-"), as.call(list(as.name("xtfrm"), as.name(x[j]))))) - else - as.call(list(as.name("-"), as.name(x[j]))) - } - }) - )) - ans1 = forderv(DT, by=x, order=y, na.last=TRUE) # adding tests for both nalast=TRUE and nalast=NA - test(test_no, ans1, with(DT, eval(ll))) - test_no <<- signif(test_no+.001, 7) - ll <- as.call(c(as.list(ll), na.last=NA)) - ans1 = forderv(DT, by=x, order=y, na.last=NA) # nalast=NA here. - test(test_no, ans1[ans1 != 0], with(DT, eval(ll))) - }) - dim(tmp)=NULL - list(tmp) - }) -} -ans = NULL -if (nfail > oldnfail) cat(seedInfo, "\n") # to reproduce - -############### -old_rounding = getNumericRounding() -# turning off tolerance for UPCs (> 11 s.f. stored in numeric), #5369 -DT <- data.table(upc = c(301426027592, 301426027593, 314775802939, 314775802940, 314775803490, 314775803491, 314775815510, 314775815511, 314933000171, 314933000172), - year = 2006:2007) -setNumericRounding(2L) -test(1253, DT[,.N,by=upc]$N, rep.int(2L,5L)) -setNumericRounding(0) -test(1254, DT[,.N,by=upc], data.table(upc=DT$upc, N=1L)) -test(1255, unique(DT, by="upc"), DT) -setNumericRounding(2) -test(1256, DT[,.N,by=upc]$N, rep.int(2L,5L)) -DT = data.table(upc=rep(c(360734147771, 360734147770), each=3), year=rep(2009:2011, times=2)) -setNumericRounding(0) -test(1257, DT[,.N,by=upc], data.table(upc=c(360734147771, 360734147770), N=3L)) -test(1258, DT[,.N,by=upc][order(upc)], data.table(upc=c(360734147770, 360734147771), N=3L)) -setNumericRounding(1) -test(1259, DT[,.N,by=upc], data.table(upc=c(360734147771, 360734147770), N=3L)) -test(1260, DT[,.N,by=upc][order(upc)], data.table(upc=c(360734147770, 360734147771), N=3L)) -test(1261, getNumericRounding(), 1L) -# the limit of double precision (16 s.f.) ... -if (.Machine$sizeof.longdouble==16) - test(1262, length(unique(c(1.2345678901234560, 1.2345678901234561, 1.2345678901234562, 1.2345678901234563))), 2L) - # 2 not 4 is double precision limit which base::unique() relies on in this test - # valgrind will also return (3) instead of (2) here.. due to floating point precision limitation. changing the last two values to 1.2345678901234563 and 1.2345678901234564 returns 2. -DT = data.table(id=c(1.234567890123450, 1.234567890123451, 1.234567890123452, 1.234567890123453)) # one less digit is limit -test(1263, length(unique(DT$id)), 4L) -test(1264, DT[,.N,by=id]$N, 4L) # 1 byte rounding isn't enough -setNumericRounding(0) -test(1265, DT[,.N,by=id]$N, INT(1,1,1,1)) -test(1266, getNumericRounding(), 0L) -setNumericRounding(old_rounding) - -# fread reading NA in logical columns, #4766 -DF = data.frame(I=1:3, L=c(TRUE,FALSE,NA), R=3.14) -write.csv(DF,f<-tempfile(),row.names=FALSE) -test(1267.1, fread(f)$L, c(TRUE, FALSE, NA)) -test(1267.2, fread(f), as.data.table(read.csv(f))) -unlink(f) - -### FR #2722 test begins here ### -################################# -# FR #2722 optimise j=c(lapply(.SD,sum, ...)) - here any amount of such lapply(.SD, ...) can occur and in any order -set.seed(45L) -dt <- data.table(a=sample(2,10,TRUE), b=sample(3,10,TRUE), c=sample(4,10,TRUE), d=sample(5,10,TRUE)) - -options(datatable.optimize=1L) -ans2 <- dt[, c(lapply(.SD, mean), lapply(.SD, sum)), by=a] -options(datatable.optimize=Inf) -test(1268.1, dt[, c(lapply(.SD, mean), lapply(.SD, sum)), by=a, verbose=TRUE], ans2, - output="GForce optimized j to 'list(gmean(b), gmean(c), gmean(d), gsum(b), gsum(c), gsum(d))'") - -options(datatable.optimize=1L) -ans2 <- dt[, c(lapply(.SD, mean), .N), by=a] -options(datatable.optimize=Inf) -test(1268.2, dt[, c(lapply(.SD, mean), .N), by=a, verbose=TRUE], ans2, - output = "lapply optimization changed j from 'c(lapply(.SD, mean), .N)' to 'list(mean(b), mean(c), mean(d), .N)'") - -options(datatable.optimize=1L) -ans2 <- dt[, c(list(c), lapply(.SD, mean)), by=a] -options(datatable.optimize=Inf) -test(1268.3, dt[, c(list(c), lapply(.SD, mean)), by=a, verbose=TRUE], ans2, - output = "lapply optimization changed j from 'c(list(c), lapply(.SD, mean))' to 'list(c, mean(b), mean(c), mean(d))") - -test(1268.4, dt[, c(as.list(c), lapply(.SD, mean)), by=a], - error = "j doesn't evaluate to the same number of columns for each group") - -options(datatable.optimize=1L) -ans2 <- dt[, c(sum(d), lapply(.SD, mean)), by=a] -options(datatable.optimize=Inf) -test(1268.5, dt[, c(sum(d), lapply(.SD, mean)), by=a, verbose=TRUE], ans2, - output = "GForce optimized j to 'list(gsum(d), gmean(b), gmean(c), gmean(d))'") - -options(datatable.optimize=1L) -ans2 <- dt[, c(list(sum(d)), lapply(.SD, mean)), by=a] -options(datatable.optimize=Inf) -test(1268.6, dt[, c(list(sum(d)), lapply(.SD, mean)), by=a, verbose=TRUE], ans2, - output = "GForce optimized j to 'list(gsum(d), gmean(b), gmean(c), gmean(d))'") - -# newly added tests for #861 -# optimise, but no GForce -options(datatable.optimize=1L) -ans2 <- dt[, c(list(sum(d), .I), lapply(.SD, mean)), by=a] -options(datatable.optimize=Inf) -test(1268.7, dt[, c(list(sum(d), .I), lapply(.SD, mean)), by=a, verbose=TRUE], ans2, - output = "lapply optimization changed j from 'c(list(sum(d), .I), lapply(.SD, mean))' to 'list(sum(d), .I, mean(b), mean(c), mean(d))'") - -# don't optimise .I in c(...) -options(datatable.optimize=1L) -dt = data.table(x=c(1,1,1,2,2,2), y=1:6) -ans2 <- dt[, c(.I, lapply(.SD, mean)), by=x] -options(datatable.optimize=Inf) -test(1268.8, dt[, c(.I, lapply(.SD, mean)), by=x, verbose=TRUE], ans2, - output = "lapply optimization is on, j unchanged as 'c(.I, lapply(.SD, mean))'") - -### FR #2722 tests end here ### - -# Wide range numeric and integer64, to test all bits -old_rounding = getNumericRounding() -x = sample( c(seq(-1e100, 1e100, length=1e5), c(seq(-1e-100,1e-100,length=1e5))) ) -setNumericRounding(0) -test(1269, forderv(x), base::order(x)) -setNumericRounding(2) # not affected by rounding -test(1270, forderv(x), base::order(x)) -if (test_bit64) { - x = as.integer64(2)^(0:62) - x = sample(c(x,-x,0)) - if (!inherits(try(bit64::order(x),silent=TRUE), "try-error")) # if for old version of bit64 - test(1271, forderv(x), bit64::order(x)) # because GenomicRanges replaces this order - DT = data.table( a=as.integer64(2)^45 + 1:3, b=1:6 ) - test(1272, DT[,sum(b),by=a], data.table(a=DT$a[1:3], V1=INT(5,7,9))) - test(1273, unique(DT, by="a"), DT[1:3]) - test(1274, duplicated(DT, by="a"), rep(c(FALSE,TRUE),each=3)) - setkey(DT,a) - test(1275, DT[.(as.integer64(35184372088834))], DT[3:4]) - test(1276, unique(DT, by=key(DT)), DT[c(1,3,5)]) - test(1277, duplicated(DT, by=key(DT)), rep(c(FALSE,TRUE),3)) -} -setNumericRounding(old_rounding) - -# distinguishing small numbers from 0.0 as from v1.9.2, test from Rick -# http://stackoverflow.com/questions/22290544/grouping-very-small-numbers-e-g-1e-28-and-0-0-in-data-table-v1-8-10-vs-v1-9-2 -old_rounding = getNumericRounding() -test_no = 1278.001 -for (dround in c(0,2)) { - setNumericRounding(dround) # rounding should not affect the result here because although small, it's very accurace (1 s.f.) - for (i in c(-30:-1,1:30)) { - DT = data.table(c(1 * (10^i),2,9999,-1,0,1)) - test(test_no, nrow(DT[, .N, by=V1]), 6L) - test_no = test_no + 0.001 - } -} -setNumericRounding(old_rounding) - -# rounding of milliseconds, workaround, TO DO: #5445 -# http://stackoverflow.com/questions/22356957/rounding-milliseconds-of-posixct-in-data-table-v1-9-2-ok-in-1-8-10 -old_rounding = getNumericRounding() -DT = data.table(timestamp=as.POSIXct( - c("2013-01-01 17:51:00.707", - "2013-01-01 17:51:59.996", - "2013-01-01 17:52:00.059", - "2013-01-01 17:54:23.901", - "2013-01-01 17:54:23.913", - "2013-01-01 17:54:23.914"))) -setNumericRounding(2) -test(1279, duplicated(DT), rep(c(FALSE,TRUE), c(4,2))) -setNumericRounding(1) -test(1280, duplicated(DT), rep(FALSE, 6)) -setNumericRounding(old_rounding) - -# FR #5465, keep.rownames argument for setDT, just for data.frames: -DF <- data.frame(x=1:5, y=10:6) -rownames(DF) <- letters[1:5] -test(1281, setDT(DF, keep.rownames=TRUE), data.table(rn=letters[1:5], x=1:5, y=10:6)) - -# Bug #5415 fix - BY doesn't retain names: -DT <- data.table(fruit=c("apple","peach","pear")) -test(1282, DT[, ans := .BY$fruit, by=fruit], data.table(fruit=DT$fruit, ans=DT$fruit)) - -# bug #5443 - get() doesn't see i's columns, when i is a data.table: -set.seed(1L) -dt1 <- data.table(a=rep(1:2, each=2), c=sample(10,4)) -dt2 <- data.table(b=rep(2:3), c=sample(20,2), d=sample(20,2)) -setkey(dt1, a) -setkey(dt2, b) - -# without by -test(1283.1, dt1[dt2, list(a=a, c=get('c'), i.c=get('i.c'))], dt1[dt2, list(a=a, c=c, i.c=i.c)]) -test(1283.2, dt1[dt2, list(a=a, d=get('d'))], dt1[dt2, list(a=a, d=d)]) -# with by -test(1283.3, dt1[dt2, list(a=a, c=get('c'), i.c=get('i.c')), by=.EACHI], dt1[dt2, list(a=a, c=c, i.c=i.c), by=.EACHI]) -test(1283.4, dt1[dt2, list(a=a, d=get('d')), by=.EACHI], dt1[dt2, list(a=a, d=d), by=.EACHI]) - -# fix for bug #5583 - missed cases like dt[order(abs(x))]. -dt <- data.table(x=c(1L,-2L,3L)) -test(1284.1, dt[order(abs(x))], dt) -test(1284.2, dt[order(-abs(x))], dt[3:1]) - -# fix for bug #5582 - unique/duplicated on empty data.table returned NA -dt <- data.table(x=numeric(0), y=character(0), key="x") -test(1285.1, duplicated(dt, by=key(dt)), duplicated.data.frame(dt)) -test(1285.2, unique(dt, by=key(dt)), dt) - -# BUG #5672 fix -a <- data.table(BOD, key="Time") -b <- data.table(BOD, key="Time")[Time < 0] # zero row data.table -ans <- merge(b, a, all=TRUE) -test(1287, ans, data.table(Time=a$Time, demand.x=NA_real_, demand.y=a$demand, key="Time")) - -# more rbindlist tests - duplicate columns with "fill=TRUE" -ll <- list(data.table(x=1, y=-1, x=-2), data.table(y=10, y=20, y=30, x=-10, a="a", b=Inf, c=factor(1))) -test(1288.1, rbindlist(ll, use.names=TRUE, fill=FALSE), error = "Item 2 has 7 columns, inconsistent with item 1 which has 3 columns") -# modified after fixing #725 -test(1288.2, rbindlist(ll, use.names=TRUE, fill=TRUE), - data.table(x=c(1,-10), y=c(-1,10), x=c(-2, NA), y=c(NA,20), y=c(NA,30), a=c(NA, "a"), b=c(NA, Inf), c=factor(c(NA, 1)))) - -# check the name of output are consistent when binding two empty dts with one empy and other non-empty dt -dt1 <- data.table(x=1:5, y=6:10) -dt2 <- dt1[x > 5] -setnames(dt3 <- copy(dt2), c("A", "B")) -test(1288.3, names(rbindlist(list(dt2,dt3))), c("x", "y")) -test(1288.4, names(rbindlist(list(dt3,dt2))), c("A", "B")) -test(1288.5, names(rbindlist(list(dt1,dt3))), c("x", "y")) -test(1288.6, names(rbindlist(list(dt3,dt1))), c("A", "B")) - -# check fix for bug #5612 -DT <- data.table(x=c(1,2,3)) -test(1288.7, rbind(DT, DT, data.table()), rbind(DT, data.table(), DT)) - -# factor on fill=TRUE with NA column.. -DT1 = data.table(A=1:3,B=letters[1:3]) -DT2 = data.table(B=letters[4:5],C=factor(1:2)) -l = list(DT1,DT2) -test(1288.8, rbindlist(l, use.names=TRUE, fill=TRUE), data.table(A=c(1:3,NA_integer_,NA_integer_), B=letters[1:5], C=factor(c(NA,NA,NA,1,2)))) - -# adding more tests after modifying for better backwards compatibility: -# rbindlist and rbind both work fine even when certain elements of list are not named at all, as long as fill = FALSE, but use.names=TRUE errors when all names are NULL -# when fill=TRUE NO element of the list must have NULL names. -ll <- list(list(1:3, 4:6), list(5:7, 8:10)) -test(1288.9, rbindlist(ll), data.table(V1=c(1:3, 5:7), V2=c(4:6, 8:10))) -test(1288.10, rbindlist(ll, use.names=TRUE), error="use.names=TRUE but no item of input list has any names.") -ll <- list(list(a=1:3, b=4:6), list(5:7, 8:10)) -test(1288.11, rbindlist(ll, use.names=TRUE), data.table(a=c(1:3, 5:7), b=c(4:6, 8:10))) -ll <- list(list(1:3, 4:6), list(a=5:7, b=8:10)) -test(1288.12, rbindlist(ll, use.names=TRUE), data.table(a=c(1:3, 5:7), b=c(4:6, 8:10))) -ll <- list(list(a=1:3, 4:6), list(5:7, b=8:10)) -test(1288.13, rbindlist(ll, use.names=TRUE), error="Answer requires 3 columns whereas one or more item(s) in the input list has only 2 columns. This could be because the items in the list may not") -ll <- list(list(a=1:3, 4:6), list(5:7, b=8:10)) -test(1288.14, rbindlist(ll, fill=TRUE), data.table(a=c(1:3, rep(NA_integer_,3L)), V1=c(4:6,5:7), b=c(rep(NA_integer_, 3L), 8:10))) -ll <- list(list(1:3, 4:6), list(5:7, 8:10)) -test(1288.15, rbindlist(ll, fill=TRUE), error="fill=TRUE, but names of input list at position 1") -ll <- list(list(1:3, 4:6), list(a=5:7, b=8:10)) -test(1288.16, rbindlist(ll, fill=TRUE), error="fill=TRUE, but names of input list at position 1") - -# TO DO: TODO: think of and add more tests for rbindlist - -# fix for #5647 -dt = data.table(x=1L, y=1:10) -cp = copy(dt) -test(1289.1, dt[,z := c(rep(NA, 5), y), by=x], cp[, z := c(rep(NA, 5), y[1:5])], warning="RHS 1 is length 15") -dt = data.table(x=c(1:2), y=1:10) -cp = copy(dt) -test(1289.2, dt[, z := c(rep(NA, 5),y), by=x], cp[, z := rep(NA_integer_, 10)], - warning=c("RHS 1 is length 10.*group 1.*last 5 element.*discarded", - "RHS 1 is length 10.*group 2.*last 5 element.*discarded")) - -######################################## -# Extensve testing for "duplicate" names -######################################## -# Rules: Basically, if index is directly given in 'j', just those columns are touched/operated on. But if 'column' names are given and there are more than one -# occurrence of that column, then it's hard to decide which to keep and which to remove. So, to remove, all are removed, to keep, always the first is kept. -# 1) when i,j,by are all absent (or) just 'i' is present then ALL duplicate columns are returned. -# 2) When 'with=FALSE' and 'j' is a character and 'notj' is TRUE, all instances of the column to be removed will be removed. -# 3) When 'with=FALSE' and 'j' is a character and 'notj' is FALSE, only the first column will be recognised in presence of duplicate columns. -# 4) When 'with=FALSE' and 'j' is numeric and 'notj' is TRUE, just those indices will be removed. -# 5) When 'with=FALSE' and 'j' is numeric and 'notj' is FALSE, all columns for indices given, if valid, are returned. (FIXES #5688) -# 6) When .SD is in 'j', but '.SDcols' is not present, ALL columns are subset'd - FIXES BUG #5008. -# 7) When .SD and .SDcols are present and .SDcols is numeric, columns corresponding to the given indices are returned. -# 8) When .SD and .SDcols are present and .SDcols is character, duplicate column names will only return the first column, each time. -# 9) When .SD and .SDcols are present and .SDcols is numeric, and it's -SDcols, then just those columns are removed. -# 10) When .SD and .SDcols are present and .SDcols is character and -SDcols, then all occurrences of that object is removed. -# 11) When no .SD and no .SDcols and no with=FALSE, only duplicate column names will return only the first column each time. -# 12) With 'get("col")', it's the same as with all character types. -# 13) A logical expression in 'j'. -# 14) Finally, no tests but.. using 'by' with duplicate columns and aggregating may not return the intended result, as it may operate on column names in some cases. - -# All points are tested with this example: -DT <- data.table(x=1:2, y=3:4, x=5:6, x=7:8, y=9:10, z=11:12) -DT1 <- data.table(x=1L, y=3L, x=5L, x=7L, y=9L, z=11L) -DT2 <- data.table(x=2L, y=4L, x=6L, x=8L, y=10L, z=12L) -ll <- list(x=1:2, y=3:4, x=5:6, x=7:8, y=9:10, z=11:12) - -# case (1) -test(1290.1, DT[1], DT1) -test(1290.2, DT[], DT) -test(1290.3, DT[(TRUE)], DT) -# case (2) -test(1290.4, DT[, !"x", with=FALSE], as.data.table(ll[c(2,5,6)])) -test(1290.5, DT[, !"y", with=FALSE], as.data.table(ll[c(1,3,4,6)])) -test(1290.6, DT[, !c("x", "x"), with=FALSE], as.data.table(ll[c(2,5,6)])) -test(1290.7, DT[, !c("y", "y"), with=FALSE], as.data.table(ll[c(1,3,4,6)])) -# case (3) -test(1290.9, DT[, "x", with=FALSE], as.data.table(ll[1])) -test(1290.10, DT[, "y", with=FALSE], as.data.table(ll[2])) -test(1290.11, DT[, c("x", "x"), with=FALSE], as.data.table(ll[c(1,1)])) -test(1290.12, DT[, c("y", "y"), with=FALSE], as.data.table(ll[c(2,2)])) -# case (4) -test(1290.13, DT[, !3, with=FALSE], as.data.table(ll[c(1,2,4,5,6)])) -test(1290.14, DT[, !c(1,1,3,4), with=FALSE], as.data.table(ll[c(2,5,6)])) -test(1290.15, DT[, !2, with=FALSE], as.data.table(ll[c(1,3,4,5,6)])) -test(1290.16, DT[, !c(2,5,2), with=FALSE], as.data.table(ll[c(1,3,4,6)])) -# case (5) -test(1290.17, DT[, 3, with=FALSE], as.data.table(ll[3])) -test(1290.18, DT[, c(1,1,3,4), with=FALSE], as.data.table(ll[c(1,1,3,4)])) -test(1290.19, DT[, 2, with=FALSE], as.data.table(ll[2])) -test(1290.20, DT[, c(2,5,2), with=FALSE], as.data.table(ll[c(2,5,2)])) -# case (6) -test(1290.21, DT[, .SD], as.data.table(ll)) -test(1290.22, DT[, .SD[1]], DT[1]) -test(1290.23, DT[, .SD[1, !3, with=FALSE]], as.data.table(DT[1, !3, with=FALSE])) -# case (7) -test(1290.24, DT[, .SD, .SDcols=c(1,1,3,4)], as.data.table(ll[c(1,1,3,4)])) -# case (8) -test(1290.25, DT[, .SD, .SDcols=c("x", "x", "y")], as.data.table(ll[c(1,1,2)])) -# case (9) -test(1290.26, DT[, .SD, .SDcols=-c(1,2)], as.data.table(ll[c(-(1:2))])) -# case (10) -test(1290.27, DT[, .SD, .SDcols=-c("x")], as.data.table(ll[c(2,6)])) -# case (11) -test(1290.28, DT[, x], ll[[1]]) -test(1290.29, DT[, list(x,x,y,y,y)], as.data.table(ll[c(1,1,2,2,2)])) -test(1290.30, DT[, list(x,x,y)], as.data.table(ll[c(1,1,2)])) -# cast (12) -test(1290.31, DT[, get("x")], ll[[1]]) -test(1290.32, DT[, list(get("x"))], setnames(as.data.table(ll[1]), "V1")) -test(1290.33, DT[, list(get("x"), get("y"))], setnames(as.data.table(ll[1:2]), c("V1", "V2"))) -# case (13) -test(1290.34, DT[, names(DT) == "x", with=FALSE], as.data.table(ll[c(1,3,4)])) - -# Bug #5376.. DT[, bla ;= character(0), by=.] dint add new column when `DT is empty DT. -dt1 = data.table(a=character(0),b=numeric(0)) -ans1 = data.table(a=character(0), b=numeric(0), c=numeric(0)) -ans2 = data.table(a=character(0), b=numeric(0), c=numeric(0), d=integer(0)) -test(1291.1, dt1[, c:=max(b), by='a'], ans1, warning="no non-missing arguments to max") -test(1291.2, dt1[, d := integer(0), by=a], ans2) - -# Bug #5714 -test(1292.1, data.table(x=1:2, y=3:4)[, -(1:2), with=FALSE], null.data.table()) -test(1292.2, data.table(x=1:2)[, -1, with=FALSE], null.data.table()) -test(1292.3, data.table(x=1:2, y=3:4)[, !c("x","y"), with=FALSE], null.data.table()) -test(1292.4, data.table(x=1:2)[, !c("x"), with=FALSE], null.data.table()) - -# Bug #5435 - print.data.table and digits option: -DT <- structure(list(fisyr = 1995:1996, er = list(c(1, 3), c(1, 3)), - eg = c(0.0197315833926059, 0.0197315833926059), esal = list( - c(2329.89763779528, 2423.6811023622), c(2263.07456978967, - 2354.16826003824)), fr = list(c(4, 4), c(4, 4)), fg = -c(0.039310363070415, - 0.039310363070415), fsal = list(c(2520.85433070866, 2520.85433070866 - ), c(2448.55449330784, 2448.55449330784)), mr = list(c(5, - 30), c(5, 30)), mg = c(0.0197779376457164, 0.0197779376457164 - ), msal = list(c(2571.70078740157, 4215.73622047244), -c(2497.94263862333, - 4094.82600382409))), .Names = c("fisyr", "er", "eg", "esal", -"fr", "fg", "fsal", "mr", "mg", "msal"), class = c("data.table", -"data.frame"), row.names = c(NA, -2L)) - -if (options()$width<80) options(width=80) -ans1 = capture.output(print(DT, digits=4, row.names=FALSE)) -ans2 = c(" fisyr er eg esal fr fg fsal mr mg msal", - " 1995 1,3 0.01973 2330,2424 4,4 0.03931 2521,2521 5,30 0.01978 2572,4216", - " 1996 1,3 0.01973 2263,2354 4,4 0.03931 2449,2449 5,30 0.01978 2498,4095") -test(1293, ans1, ans2) - -## Fixes bug #5442 -## Also improves upon bug fix #2551 to provide better warnings and at better places: -dt <- data.table(a=1:3, b=c(7,8,9), c=c(TRUE, NA, FALSE), d=as.list(4:6), e=c("a", "b", "c")) - -test(1294.1, dt[, a := 1]$a, rep(1L, 3L)) -test(1294.2, dt[, a := 1.5]$a, rep(1L, 3L), warning="Coerced 'double' RHS to 'integer' to match the column's type") -test(1294.3, dt[, a := NA]$a, rep(NA_integer_, 3L)) -test(1294.4, dt[, a := "a"]$a, rep(NA_integer_, 3L), - warning=c("NAs introduced by coercion", - "Coerced 'character' RHS to 'integer' to match the column's type.*please")) -test(1294.5, dt[, a := list(list(1))]$a, rep(1L, 3L), warning="Coerced 'list' RHS to 'integer' to match the column's type") -test(1294.6, dt[, a := list(1L)]$a, rep(1L, 3L)) -test(1294.7, dt[, a := list(1)]$a, rep(1L, 3L)) -test(1294.8, dt[, a := TRUE]$a, rep(1L, 3L), warning="Coerced 'logical' RHS to 'integer' to match the column's type") -test(1294.9, dt[, b := 1L]$b, rep(1,3)) -test(1294.10, dt[, b := NA]$b, rep(NA_real_,3)) -test(1294.11, dt[, b := "bla"]$b, rep(NA_real_, 3), - warning=c("NAs introduced by coercion", - "Coerced 'character' RHS to 'double' to match the column's type.*please")) -test(1294.12, dt[, b := list(list(1))]$b, rep(1,3), warning="Coerced 'list' RHS to 'double' to match the column's type") -test(1294.13, dt[, b := TRUE]$b, rep(1,3), warning="Coerced 'logical' RHS to 'double' to match the column's type") -test(1294.14, dt[, b := list(1)]$b, rep(1,3)) -test(1294.15, dt[, c := 1]$c, rep(TRUE, 3), warning="Coerced 'double' RHS to 'logical' to match the column's type") -test(1294.16, dt[, c := 1L]$c, rep(TRUE, 3), warning="Coerced 'integer' RHS to 'logical' to match the column's type") -test(1294.17, dt[, c := NA]$c, rep(NA, 3)) -test(1294.18, dt[, c := list(1)]$c, rep(TRUE, 3), warning="Coerced 'double' RHS to 'logical' to match the column's type") -test(1294.19, dt[, c := list(list(1))]$c, rep(TRUE, 3), warning="Coerced 'list' RHS to 'logical' to match the column's type") -test(1294.20, dt[, c := "bla"]$c, rep(NA, 3), warning="Coerced 'character' RHS to 'logical' to match the column's type") -test(1294.21, dt[, d := 1]$d, rep(list(1), 3), warning="Coerced 'double' RHS to 'list' to match the column's type") -test(1294.22, dt[, d := 1L]$d, rep(list(1L), 3), warning="Coerced 'integer' RHS to 'list' to match the column's type") -test(1294.23, dt[, d := TRUE]$d, rep(list(TRUE), 3), warning="Coerced 'logical' RHS to 'list' to match the column's type") -test(1294.24, dt[, d := "bla"]$d, rep(list("bla"), 3), warning="Coerced 'character' RHS to 'list' to match the column's type") -test(1294.25, dt[, d := list(list(1))]$d, rep(list(1), 3)) -test(1294.26, dt[, e := 1]$e, rep("1", 3), warning="Coerced 'double' RHS to 'character' to match the column's type") -test(1294.27, dt[, e := 1L]$e, rep("1", 3), warning="Coerced 'integer' RHS to 'character' to match the column's type") -test(1294.28, dt[, e := TRUE]$e, rep("TRUE", 3), warning="Coerced 'logical' RHS to 'character' to match the column's type") -test(1294.29, dt[, e := list(list(1))]$e, rep("1", 3), warning="Coerced 'list' RHS to 'character' to match the column's type") -test(1294.30, dt[, e := "bla"]$e, rep("bla", 3)) -test(1294.31, dt[, e := list("bla2")]$e, rep("bla2", 3)) - -# FR #5357, when LHS evaluates to integer(0), provide warning and return dt, not an error. -dt = data.table(a = 1:5, b1 = 1:5, b2 = 1:5) -test(1295, dt[, grep("c", names(d)) := NULL], dt, warning="length(LHS)==0; no columns to delete or assign RHS to") - -# Updating logical column in one-row DT (corruption of new R 3.1 internal globals for TRUE, FALSE and NA) -DT = data.table(a=1:6, b=c(TRUE,FALSE)) -test(1296, DT[,list(b,sum(b)),by=a], data.table(a=1:6, b=c(TRUE,FALSE), V2=c(1L,0L))) # was error "the ... list does not contain 2 elements" -DT = DT[1L] -set(DT,1L,"b",FALSE) # passing 1L as i here is needed to avoid column plonk, so changes the logical singleton in place -test(1297, as.integer(TRUE[1]), 1L) # In R 3.1, TRUE[1] returns the global TRUE but TRUE doesn't yet (parses as new vector) -test(1298, as.integer(TRUE), 1L) -# orignal example, verbatim from James Sams : -upc_table = data.table(upc=1:100000, upc_ver_uc=rep(c(1,2), times=50000), is_PL=rep(c(TRUE, FALSE, FALSE, TRUE), each=25000), product_module_code=rep(1:4, times=25000), ignore.column=2:100001) -test(1299, upc_table[, .N, by=list(upc, upc_ver_uc)][,max(N)], 1L) # all size 1 groups -test(1300, upc_table[, list(is_PL, product_module_code), keyby=list(upc, upc_ver_uc)][,upc[1:3]], 1:3L) # was warning "internal TRUE value has been modified" - -# Same test but for singleton small integers which r-devel also plan to globalise internally. -DT = data.table(a=1:6, b=0:1) -test(1301, DT[,list(b,sum(b)),by=a], data.table(a=1:6, b=c(0L,1L), V2=c(0L,1L))) -DT = DT[1L] -set(DT,1L,"b",3L) -test(1302, 0L[1L], 3L-3L) -test(1303, 0L, 3L-3L) - -# FR #5760. Test to just make sure that GForce and dogroups with .N are giving the same results. -set.seed(2L) -dt <- data.table(x=sample(rep(1:5e3, each=3)), y=sample(10)) -options(datatable.optimize = 1L) -ans1 <- dt[, list(.N, sum(y)), by=x] -options(datatable.optimize = 2L) -ans2 <- dt[, list(.N, sum(y)), by=x] -test(1304.1, ans1, ans2) - -dt <- data.table(x=sample(rep(1:5e3, each=3)), y=sample(10), key="x") -options(datatable.optimize = 1L) -ans1 <- dt[, list(.N, sum(y)), by=x] -options(datatable.optimize = 2L) -ans2 <- dt[, list(.N, sum(y)), by=x] -test(1304.2, ans1, ans2) - -# FR #5528 -DT <- data.table(x=1:5, y=6:10) -test(1305.1, setDF(DT), data.frame(x=1:5, y=6:10)) -# setDF should return if input is data.frame, not error. -df <- data.frame(x=1:5, y=6:10) -test(1305.2, setDF(df), df) # setDF works on data.frame -# setDF also works on lists with equal lengths, #1132 -df <- list(a=1:5, b=6:10) -test(1305.3, data.frame(df), setDF(df)) -df <- list(1:5, 6:10) -test(1305.4, setDF(as.data.table(df)), setDF(df)) -test(1305.5, setDF(1:5), error="setDF only accepts") -test(1305.6, setDF(list(1, 2:3)), error="All elements in argument") -# Tests .7 - .13 for FR #1320: setDF accepts rownames argument -dt <- data.table(a=1:5, b=6:10) -df <- data.frame(a=1:5, b=6:10) -lst <- list(a=1:5, b=6:10) -df2 <- data.frame(a=1:5, b=6:10) -rownames(df2) <- LETTERS[1:5] -test(1305.7, setDF(dt, rownames=LETTERS[1:5]), df2) -test(1305.8, setDF(df, rownames=LETTERS[1:5]), df2) -test(1305.9, setDF(lst,rownames=LETTERS[1:5]), df2) -# setDF returns an error for each type if rownames incorrect length -dt <- data.table(a=1:5, b=6:10) -df <- data.frame(a=1:5, b=6:10) -lst <- list(a=1:5, b=6:10) -test(1305.10, setDF(dt, rownames="a"), error='rownames incorrect length') -test(1305.11, setDF(df, rownames="a"), error='rownames incorrect length') -test(1305.12, setDF(lst,rownames="a"), error='rownames incorrect length') -# setDF returns an error when rownames contains duplicates -test(1305.13, setDF(dt, rownames=rep("a",5)), error='rownames contains duplicates') - -# .SD retains as much of head(key) as appropriate. -# by= always keeps data appearance order, so it's which columns are grouped and selected that drive how much of key is retained -DT = data.table(a=1:3,b=1:6,c=1:6,key="a,b") -test(1306, DT[1:2,key(.SD)], c("a","b")) -test(1307, DT[2:1,key(.SD)], NULL) -test(1308, DT[,key(.SD),by=a], data.table(a=integer())) -test(1309, DT[,key(.SD),by=b], data.table(b=DT$b, V1="a")) -test(1310, DT[,key(.SD),by=c%%2L], data.table(c=c(1L,1L,0L,0L), V1=c("a","b","a","b"))) -test(1311, DT[,list(list(key(.SD))),by=a,.SDcols=1:2], data.table(a=1:3, V1=list(c("a","b")),key="a")) # .SDcols as Arun found - -# That setkey can't operate on locked tables such as .SD. Added in v1.9.3. -DT = data.table(a=1:3,b=6:1) -test(1312, DT[,setkey(.SD),by=a], error="Setting a physical key on .SD is reserved for possible future use") -# was warning "Already keyed by this key but had invalid row order" due to the key not being cleared after the previous group. A solution could have been to put back the original key on populating .SD for each group. But instead we reserve it for future use and push the user towards doing it a different more efficient way (see Arun's speedups in the datatable-help thread). - -# gmin and gmax extensive testing (because there are tricky cases) -DT <- data.table(x=rep(1:6, each=3), y=INT(4,-1,0, NA,4,10, 4,NA,10, 4,10,NA, -2147483647, -2147483647, -2147483647, 2147483647, 2147483647, 2147483647)) -# make sure GForce is running -options(datatable.optimize=3L) - -# for integers -test(1313.1, DT[, min(y), by=x], DT[, base:::min(y), by=x]) -test(1313.2, DT[, max(y), by=x], DT[, base:::max(y), by=x]) -test(1313.3, DT[, min(y, na.rm=TRUE), by=x], DT[, base:::min(y, na.rm=TRUE), by=x]) -test(1313.4, DT[, max(y, na.rm=TRUE), by=x], DT[, base:::max(y, na.rm=TRUE), by=x]) -# testing all NA - GForce automatically converts to numeric.. optimize=1L errors due to change from integer/numeric (like median) -DT[x==6, y := INT(NA)] -test(1313.5, DT[, min(y), by=x], DT[, base:::min(y), by=x]) -test(1313.6, DT[, max(y), by=x], DT[, base:::max(y), by=x]) -test(1313.7, DT[, min(y, na.rm=TRUE), by=x], data.table(x=1:6, V1=c(-1,4,4,4,-2147483647,Inf)), warning="No non-missing") -test(1313.8, DT[, max(y, na.rm=TRUE), by=x], data.table(x=1:6, V1=c(4,10,10,10,-2147483647,-Inf)), warning="No non-missing") - -# for numeric -DT <- data.table(x=rep(1:6, each=3), y=c(4,-1,0, NA,4,10, 4,NA,10, 4,10,NA, -Inf, NA, NA, Inf, NA, NA)) -test(1313.9, DT[, min(y), by=x], DT[, base:::min(y), by=x]) -test(1313.10, DT[, max(y), by=x], DT[, base:::max(y), by=x]) -test(1313.11, DT[, min(y, na.rm=TRUE), by=x], DT[, base:::min(y, na.rm=TRUE), by=x]) -test(1313.12, DT[, max(y, na.rm=TRUE), by=x], DT[, base:::max(y, na.rm=TRUE), by=x]) -# testing all NA - GForce automatically converts to numeric.. optimize=1L errors due to change from integer/numeric (like median) -DT[x==6, y := NA_real_] -test(1313.13, DT[, min(y), by=x], DT[, base:::min(y), by=x]) -test(1313.14, DT[, max(y), by=x], DT[, base:::max(y), by=x]) -test(1313.15, DT[, min(y, na.rm=TRUE), by=x], data.table(x=1:6, V1=c(-1,4,4,4,-Inf,Inf)), warning="No non-missing") -test(1313.16, DT[, max(y, na.rm=TRUE), by=x], data.table(x=1:6, V1=c(4,10,10,10,-Inf,-Inf)), warning="No non-missing") - -# for date (attribute check.. especially after issues/689 !!!) -DT <- data.table(x = rep(letters[1:2], each=5), y = as.POSIXct('2010-01-01', tz="UTC") + seq(0, 86400*9, 86400)) -test(1313.17, DT[, list(y=min(y)), by=x], DT[c(1,6)]) -test(1313.18, DT[, list(y=max(y)), by=x], DT[c(5,10)]) -DT[c(1,6), y := NA] -test(1313.19, DT[, list(y=min(y)), by=x], DT[c(1,6)]) -test(1313.20, DT[, list(y=max(y)), by=x], DT[c(1,6)]) -test(1313.21, DT[, list(y=min(y, na.rm=TRUE)), by=x], DT[c(2,7)]) -test(1313.22, DT[, list(y=max(y, na.rm=TRUE)), by=x], DT[c(5,10)]) - -# for character -set.seed(1L) -DT <- data.table(x=rep(1:6, each=3), y=sample(c("", letters[1:3], NA), 18, TRUE)) -test(1313.23, DT[, min(y), by=x], DT[, base:::min(y), by=x]) -test(1313.24, DT[, max(y), by=x], DT[, base:::max(y), by=x]) -test(1313.25, DT[, min(y, na.rm=TRUE), by=x], DT[, base:::min(y, na.rm=TRUE), by=x]) -test(1313.26, DT[, max(y, na.rm=TRUE), by=x], DT[, base:::max(y, na.rm=TRUE), by=x]) -DT[x==6, y := NA_character_] -test(1313.27, DT[, min(y), by=x], DT[, base:::min(y), by=x]) -test(1313.28, DT[, max(y), by=x], DT[, base:::max(y), by=x]) -test(1313.29, DT[, min(y, na.rm=TRUE), by=x], data.table(x=1:6, V1=c("a","a","c","","a",NA)), warning="No non-missing") -test(1313.30, DT[, max(y, na.rm=TRUE), by=x], data.table(x=1:6, V1=c("b","a","c","a","c",NA)), warning="No non-missing") - -# bug 700 - bmerge, roll=TRUE and nomatch=0L when i's key group occurs more than once -dt1 <- data.table(structure(list(x = c(7L, 33L), y = structure(c(15912, 15912), class = "Date"), z = c(626550.35284, 7766.385)), .Names = -c("x", "y", "z"), class = "data.frame", row.names = c(NA, -2L)), key = "x,y") -dt2 <- data.table(structure(list(x = c(7L, 7L, 33L, 33L, 33L, 33L), y = structure(c(15884, 15917, 15884, 15884, 15917, 15917), class = "Date"), w = c(-0.118303, 0.141225, -0.03137, -0.02533, 0.045967, 0.043694)), .Names = c("x", "y", "w"), class = "data.frame", row.names = c(NA, -6L)), key = "x,y") -test(1317.1, dt1[dt2, roll=TRUE, nomatch=0L], data.table(x=c(7L,33L,33L), y=as.Date(c("2013-07-31", "2013-07-31", "2013-07-31")), z=c(dt1$z[1:2], dt1$z[2]), w=c(dt2$w[2], dt2$w[5:6]), key="x,y")) - -# also test where 'i' is not sorted. -set.seed(1L) -dt2 <- dt2[sample(nrow(dt2))] # key should be gone -test(1317.2, dt1[dt2, roll=TRUE, nomatch=0L], data.table(x=c(7L,33L,33L), y=as.Date(c("2013-07-31", "2013-07-31", "2013-07-31")), z=c(dt1$z[1:2], dt1$z[2]), w=c(dt2$w[1], dt2$w[c(2,6)]))) - -# bug fix for #472 : "parse" in j -set.seed(100) -nrow <- 100L -DT <- data.table(aa = sample(letters[1:5], nrow, replace = TRUE), bb = rnorm(nrow)) -sumExpr <- parse(text = "sum(bb, na.rm = TRUE)") -meanExpr <- parse(text = "mean(bb, na.rm = TRUE)") -test(1318.1, DT[, eval(sumExpr), by = aa], DT[, sum(bb, na.rm=TRUE), by=aa]) -test(1318.2, DT[, eval(meanExpr), by = aa], DT[, mean(bb, na.rm=TRUE), by=aa]) -test(1318.3, DT[, list(mySum = eval(sumExpr), myMean = eval(meanExpr)), by = aa], DT[, list(mySum=sum(bb, na.rm=TRUE), myMean=mean(bb, na.rm=TRUE)), by=aa]) - -# get DT[order(.)] to be 100% consistent with base, even though the way base does some things is *utterly ridiculous*, inconsistent. -# closes #696. -DT <- data.table(a = 1:4, b = 8:5, c=letters[4:1]) -test(1319.1, DT[order(DT[, "b", with=FALSE])], DT[base:::order(DT[, "b", with=FALSE])]) -test(1319.2, DT[order(DT[, "c", with=FALSE])], DT[base:::order(DT[, "c", with=FALSE])]) -test(1319.3, DT[order(DT[, c("b","c"), with=FALSE])], DT[base:::order(DT[, c("b","c"), with=FALSE])]) -test(1319.4, DT[order(DT[, c("c","b"), with=FALSE])], DT[base:::order(DT[, c("c","b"), with=FALSE])]) -test(1319.5, DT[order(DT[, "b", with=FALSE], DT[, "a", with=FALSE])], DT[base:::order(DT[, "b", with=FALSE], DT[, "a", with=FALSE])]) -# test to make sure old things are not modified (ridiculous, but "consistency" demands it!) -test(1319.6, DT[order(list(DT$a))], DT[1]) -test(1319.7, DT[order(list(DT$a), list(DT$b))], DT[1]) -test(1319.8, DT[order(list(DT$a, DT$b))], error="First column being ordered is type 'list', not yet supported") - -# FR #703. Not so extensive testing because test 1223 already tests for everything else extensively. Only integer64 here. -# this'll be the test for both DT[order(.)] and setorder(.) as both internally uses forder/forderv -if (test_bit64) { - set.seed(45L) - DT <- data.table(x=as.integer64(c(-50, 0, 50, 1e18, 1e-18)), y=sample(5)) - ans1 <- forder(DT, x, na.last=TRUE, decreasing=FALSE) - ans2 <- forder(DT, x, na.last=FALSE, decreasing=FALSE) - ans3 <- forder(DT, x, na.last=TRUE, decreasing=TRUE) - ans4 <- forder(DT, x, na.last=FALSE, decreasing=TRUE) - test(1320.1, ans1, as.integer(c(1,2,5,3,4))) - test(1320.2, ans2, as.integer(c(1,2,5,3,4))) - test(1320.3, ans3, as.integer(c(4,3,2,5,1))) - test(1320.4, ans4, as.integer(c(4,3,2,5,1))) - - set.seed(45L) - DT <- data.table(x=as.integer64(c(-50, 0, NA, 50, 1e18, NA, 1e-18)), y=sample(7)) - ans1 <- forder(DT, x, na.last=TRUE, decreasing=FALSE) - ans2 <- forder(DT, x, na.last=FALSE, decreasing=FALSE) - ans3 <- forder(DT, x, na.last=TRUE, decreasing=TRUE) - ans4 <- forder(DT, x, na.last=FALSE, decreasing=TRUE) - - test(1320.5, ans1, as.integer(c(1,2,7,4,5,3,6))) - test(1320.6, ans2, as.integer(c(3,6,1,2,7,4,5))) - test(1320.7, ans3, as.integer(c(5,4,2,7,1,3,6))) - test(1320.8, ans4, as.integer(c(3,6,5,4,2,7,1))) - - # missed test - checking na.last=NA! - set.seed(45L) - DT <- data.table(x=as.integer64(c(-50, 0, NA, 50, 1e18, NA, 1e-18)), y=sample(7)) - ans1 <- forder(DT, x, na.last=NA, decreasing=FALSE) - ans2 <- forder(DT, x, na.last=NA, decreasing=TRUE) - - test(1320.9, ans1, as.integer(c(0,0,1,2,7,4,5))) - test(1320.10, ans2, as.integer(c(0,0,5,4,2,7,1))) -} - -# fread newlines inside quoted fields -test(1321, fread('A,B,C\n1,"foo\nbar",3\n4,baz,6'), data.table(A=c(1L,4L), B=c("foo\nbar","baz"), C=c(3L,6L))) -test(1322, fread('A,B,C\n1,"foo -bar",3\n4,baz,6'), data.table(A=c(1L,4L), B=c("foo\nbar","baz"), C=c(3L,6L))) -# NB: don't remove the newline after foo in test 1322 above, that's what's being tested. -test(1323, fread('col1,col2\n5,"4\n3"'), data.table(col1=5L, col2="4\n3")) # no warning as last field is finished ok -test(1324, fread('A,B,C\n1,4,"foo"\n2,5,"bar'), data.table(A=1:2,B=4:5,C=c('foo','"bar'))) -test(1325, fread('A,B,C\n1,4,"foo"\n2,5,"bar"'), data.table(A=1:2,B=4:5,C=c("foo",'bar'))) -test(1326, fread('A,B,C\n1,4,"foo"\n2,5,bar"'), data.table(A=1:2,B=4:5,C=c("foo",'bar"'))) -test(1327, fread('A,B,C\n1,4,"foo"\n2,5,""bar""'), data.table(A=1:2,B=4:5,C=c("foo",'"bar"'))) -cat('A,B\n2,"Joe \\",Bloggs"', file = f<-tempfile()) -test(1328, fread(f), data.table(A=2L, B='Joe \\",Bloggs')) -cat('A,B\n2,"Joe \\",Bloggs"\n', file = f<-tempfile()) -test(1328.2, fread(f), data.table(A=2L, B='Joe \\",Bloggs')) -unlink(f) -test(1329, fread(), error="empty") -# add test that that escaped escapes at the end of a quoted field -test(1330, fread('A,B\nfoo,1\nAnalyst\\,2\nbar,3'), data.table(A=c('foo','Analyst\\','bar'), B=1:3)) -test(1331.1, fread('A,B\nfoo,1\nAnalyst\\ ,2\nbar,3'), data.table(A=c('foo','Analyst\\','bar'), B=1:3)) # strip.white=TRUE -test(1331.2, fread('A,B\nfoo,1\nAnalyst\\ ,2\nbar,3', strip.white=FALSE), data.table(A=c('foo','Analyst\\ ','bar'), B=1:3)) -test(1332, fread('A,B\nfoo,1\n"Analyst\\",2\nbar,3'), data.table(A=c('foo','Analyst\\','bar'), B=1:3)) -test(1332.2, fread("ab,x\n cd,x ", sep = ",", strip.white = FALSE, header = FALSE), data.table(V1=c("ab", " cd"), V2=c("x", "x "))) # Issue 2376 -# double \\ in this file means one in the input, so the above " is escaped by a single '\' but still read ok -test(1333.1, fread('A,B\nfoo,1\n"Analyst\\" ,2\nbar,3'), data.table(A = c("foo", "Analyst\\", "bar"), B = 1:3)) -test(1333.2, fread('A,B\nfoo,1\n"Analyst\\" ,2\nbar,3', strip.white=FALSE), data.table(A = c("foo", "Analyst\\", "bar"), B = 1:3)) # it's a quoted field with space afterwards; strip.white only applies to non-quoted strings -test(1334, fread('A,B\nfoo,1\n"Analyst\\" ,",2\nbar,3'), data.table(A=c('foo', 'Analyst\\" ,', 'bar'), B=1:3)) -test(1335, fread('A,B\nfoo,1\n"Analyst\\\\",2\nbar,3'), data.table(A=c('foo','Analyst\\\\','bar'), B=1:3)) - -# data from 12GB file in comments on http://stackoverflow.com/a/23858323/403310 ... -# note that read.csv gets this wrong and puts jacoleman high school into the previous field, then fills the rest of the line silently. -cat('A,B,C,D,E,F -"12",0,"teacher private nfp\\\\\\\\"",""jacoleman high school","","" -"TX",77406,"business analyst\\\\\\\\\\\\\\","the boeing co","","" -"CA",94116,"na\\none","retired","","" -', file = f<-tempfile()) # aside: notice the \\ before n of none as well -test(1336.1, fread(f), data.table(A = c("12", "TX", "CA"), B = c(0L, 77406L, 94116L), C = c("teacher private nfp\\\\\\\\\"", "business analyst\\\\\\\\\\\\\\", "na\\none"), D = c("\"jacoleman high school", "the boeing co", "retired"), E = NA, F = NA)) -cat('A,B,C,D,E,F -"12",0,"teacher private nfp\\\\\\\\"","jacoleman high school","","" -"TX",77406,"business analyst\\\\\\\\\\\\\\","the boeing co","","" -"CA",94116,"na\\none","retired","","" -', file = f) -test(1336.2, fread(f), data.table(A=c("12","TX","CA"), B=c(0L,77406L,94116L),C=c('teacher private nfp\\\\\\\\"','business analyst\\\\\\\\\\\\\\','na\\none'), D=c('jacoleman high school','the boeing co','retired'),E=NA,F=NA)) -unlink(f) - -# file names ending with \ (quite common) -# http://stackoverflow.com/questions/24375832/fread-and-column-with-a-trailing-backslash -cat('file,size\n"windows\\user\\",123\n', file = f<-tempfile()) -test(1337, fread(f), data.table(file='windows\\user\\',size=123L)) -test(1338, fread(f), as.data.table(read.csv(f,stringsAsFactors=FALSE))) -unlink(f) - -# TO DO, by checking for balanced embedded quotes -# cat('http,size\n"www.blah?x="one",y="two","three"",123\n', file = f<-tempfile()) -# read.csv(f) -- unusually, seems to be a case it doesn't handle -# test(1339, fread(f), data.table(http='www.blah?x="one",y="two","three"',size=123L)) -# unlink(f) - -# FR #706 - setorder and setorderv now has 'na.last=TRUE/FALSE' argument. It can't have value NA though, like `DT[order(.)]` as it reorders by reference, doesn't subset. Simple tests. -set.seed(45L) -DT <- data.table(x=sample(c(-2:2, NA_integer_), 20, TRUE), y=sample(c(-1:1, NA, Inf, -Inf, NaN), 20, TRUE)) -test(1340.1, setorder(copy(DT), x, na.last=TRUE ), DT[order( x, na.last=TRUE)]) -test(1340.2, setorder(copy(DT), x, na.last=FALSE), DT[order( x, na.last=FALSE)]) -test(1340.3, setorder(copy(DT), -x, na.last=TRUE ), DT[order(-x, na.last=TRUE)]) -test(1340.4, setorder(copy(DT), -x, na.last=FALSE), DT[order(-x, na.last=FALSE)]) -test(1340.5, setorder(copy(DT), y, na.last=TRUE ), DT[order( y, na.last=TRUE)]) -test(1340.6, setorder(copy(DT), y, na.last=FALSE), DT[order( y, na.last=FALSE)]) -test(1340.7, setorder(copy(DT), -y, na.last=TRUE ), DT[order(-y, na.last=TRUE)]) -test(1340.8, setorder(copy(DT), -y, na.last=FALSE), DT[order(-y, na.last=FALSE)]) - -test(1340.9, setorderv(copy(DT), "x", 1L, na.last=TRUE ), DT[order( x, na.last=TRUE)]) -test(1340.10, setorderv(copy(DT), "x", 1L, na.last=FALSE), DT[order( x, na.last=FALSE)]) -test(1340.11, setorderv(copy(DT), "x", -1L, na.last=TRUE ), DT[order(-x, na.last=TRUE)]) -test(1340.12, setorderv(copy(DT), "x", -1L, na.last=FALSE), DT[order(-x, na.last=FALSE)]) -test(1340.13, setorderv(copy(DT), "y", 1L, na.last=TRUE ), DT[order( y, na.last=TRUE)]) -test(1340.14, setorderv(copy(DT), "y", 1L, na.last=FALSE), DT[order( y, na.last=FALSE)]) -test(1340.15, setorderv(copy(DT), "y", -1L, na.last=TRUE ), DT[order(-y, na.last=TRUE)]) -test(1340.16, setorderv(copy(DT), "y", -1L, na.last=FALSE), DT[order(-y, na.last=FALSE)]) - -test(1340.17, setorder(copy(DT), x, na.last=NA), error="na.last must be logical TRUE/FALSE") -test(1340.18, setorderv(copy(DT), "x", na.last=NA), error="na.last must be logical TRUE/FALSE") - -# bug #481 - DT[, list(list(.)), by=.] on R v3.1.0 -set.seed(1L) -f <- function(x) list(x) -DT <- data.table(x=sample(3,10,TRUE), y=as.numeric(sample(10))) -test(1341.1, DT[, list(list(y)), by=x], data.table(x=unique(DT$x), V1=list(c(3,5,9), c(2,6,4,1), c(10,7,8)))) -test(1341.2, DT[, list(list(.I)), by=x], data.table(x=unique(DT$x), V1=list(c(1,5,10), c(2,3,8,9), c(4,6,7)))) -test(1341.3, DT[, list(f(y)), by=x], data.table(x=unique(DT$x), V1=list(c(3,5,9), c(2,6,4,1), c(10,7,8)))) -# test for list(list(.)) with := -test(1341.4, copy(DT)[, z := list(list(y)), by=x], copy(DT)[, z := list(list(copy(y))), by=x]) -test(1341.5, copy(DT)[, z := list(list(.I)), by=x], copy(DT)[, z := list(list(copy(.I))), by=x]) -test(1341.6, copy(DT)[, z := list(f(y)), by=x], copy(DT)[, z := list(f(copy(y))), by=x]) - -# test regression on over-allocation (selfref) on unique() which uses new subsetDT() -bla <- data.table(x=c(1,1,2,2), y=c(1,1,1,1)) -test(1342, unique(bla)[, bla := 2L], data.table(x=c(1,2),y=1,bla=2L)) - -# blank and NA fields in logical columns -test(1343.1, fread("A,B\n1,TRUE\n2,\n3,False"), data.table(A=1:3, B=c("TRUE","","False"))) -test(1343.2, fread("A,B\n1,True\n2,\n3,false"), data.table(A=1:3, B=c("True","","false"))) -test(1343.3, fread("A,B\n1,TRUE\n2,\n3,FALSE"), data.table(A=1:3, B=c(TRUE,NA,FALSE))) -test(1343.4, fread("A,B\n1,True\n2,\n3,False"), data.table(A=1:3, B=c(TRUE,NA,FALSE))) -test(1343.5, fread("A,B\n1,true\n2,\n3,false"), data.table(A=1:3, B=c(TRUE,NA,FALSE))) -test(1343.6, fread("A,B\n1,true\n2,NA\n3,"), data.table(A=1:3, B=c(TRUE,NA,NA))) -test(1344.1, fread("A,B\n1,2\n0,3\n,1\n", logical01=FALSE), data.table(A=c(1L,0L,NA), B=c(2L,3L,1L))) -test(1344.2, fread("A,B\n1,2\n0,3\n,1\n", logical01=TRUE), data.table(A=c(TRUE,FALSE,NA), B=c(2L,3L,1L))) - -# .N now available in i -DT = data.table(a=1:3,b=1:6) -test(1348, DT[.N], DT[6]) -test(1349, DT[.N-1:3], DT[5:3]) -test(1350, DT[.N+1], DT[NA]) - -# Adding test to catch any future regressions - #734 -dt = data.table(id = rep(c('a','b'), each=2), val = rep(c(1,2,3), times=c(1,2,1))) -setkey(dt, id, val) -test(1351.1, dt[J("a"), val], c(1,2)) -test(1351.2, dt[J('a'), range(val)], c(1,2)) - -# New feature: .() in j and .() in by -DT = data.table(a=1:3, b=1:6, c=LETTERS[1:6]) -test(1352.1, DT[,.(b)], DT[,list(b)]) -test(1352.2, DT[,.(b,c)], DT[,c("b","c"),with=FALSE]) -test(1352.3, DT[,.(sum(b)),by=a], DT[,sum(b),by=a]) -test(1352.4, DT[,.(MySum=sum(b)), by=a], data.table(a=1:3, MySum=c(5L,7L,9L))) -test(1352.5, DT[,sum(b),by=.(a)], DT[,sum(b),by=a]) -test(1352.6, DT[,sum(b),by=.(a%%2)], DT[,sum(b),by=a%%2]) -test(1352.7, DT[,sum(b),by=.(Grp=a%%2)], DT[,sum(b),by=list(Grp=a%%2)]) -test(1352.8, DT[,sum(b),by=.(a%%2,c)], DT[,sum(b),by=list(a%%2,c)]) - -# that :=NULL together with i is now an error -DT = data.table(a=1:3, b=1:6) -test(1353.1, DT[2, b:=NULL], error="When deleting columns, i should not be provided") -test(1353.2, DT[2, c("a","b"):=list(42, NULL)], error="When deleting columns, i should not be provided") - -# order optimisation caused trouble due to chaining because of 'substitute(x)' usage in [.data.table. -set.seed(1L) -X = data.table(id=1:10, val1=sample(3,10,TRUE)) -Y = data.table(val1=1:4, val2=8:5, key="val1") -setkey(X, val1) -test(1354, X[Y, val2 := i.val2, allow.cartesian=TRUE][, val1 := NULL][order(id)], data.table(id=1:10, val2=as.integer(c(8,7,7,6,8,6,6,7,7,8)))) - -# Fix for #475, setDT(CO2) should error, as it's trying to modify the object whose binding is locked. -# CO2 is not locked in R 2.14.1 but is in R >= 3.1.0. R NEWS isn't clear when that change happened, so just test there is an error when it is locked. -if (bindingIsLocked("CO2",as.environment("package:datasets"))) { - test(1355, setDT(CO2), error="Can not convert 'CO2' to data.table by reference because binding is locked.") -} else { - test(1355, setDT(CO2), CO2) -} - -# Fix for #698. not join doesn't need to check for allow.cartesian=TRUE. -DT1 <- data.table(x=rep(1:3, each=3L), y=1:9, key="x") -DT2 <- data.table(x=rep(c(3L,1L), each=10), z=1L) -test(1356, DT1[!DT2], data.table(x=2L, y=4:6, key="x")) - -# Fix for #745. as.data.table.matrix shouldn't convert character to factor -m <- matrix(letters[1:4], ncol=2) -test(1357, as.data.table(m), data.table(V1=letters[1:2], V2=letters[3:4])) - -# Fix for #471. A[A[A]] contains duplicate names in 1.9.3 -A <- data.table(foo = 1:2, bar = 3:4) -setkey(A, foo) -test(1358.1, names(A[A[A]]), c("foo", "bar", "i.bar", "i.bar.1")) -test(1358.2, names(A[A[A[A]]]), c("foo", "bar", "i.bar", "i.bar.2", "i.bar.1")) - -# Fix for #743. 0 and -0 and the sign bit issue -A <- data.table(x=c(0,0,-1,1,-1,0,-0,1,-1,1,0,1), y=1:12) -test(1359.1, A[, .N, by=x], data.table(x=c(0,-1,1), N=c(5L,3L,4L))) -dt1 <- data.table(x2 = 0L) -dt2 <- data.table(x2 =-(11-11)/10) -test(1359.2, as.integer(merge(dt2, dt1, by="x2")$x2), as.integer(merge(dt1, dt2, by="x2")$x2)) - -# Fix for #744: X[Y, c(...), by=.EACHI] segfaults because of using 'i' as variable in for-loop that masked the original 'i' from input. -dt <- data.table(id = c("A", "A", "B", "B", "C"), val1=1:5, val2=6:10, key = "id") -sample <- c("A", "B") -test(1360.1, dt[sample, c(.N), by = .EACHI], dt[sample, list(V1=.N), by=.EACHI]) -test(1360.2, copy(dt)[sample, N := c(.N), by = .EACHI], copy(dt)[sample, N := .N, by = .EACHI]) - -# Fix for #500 - `lapply` call shouldn't redirect to `[.data.frame`. -L <- list(data.table(BOD), data.table(BOD)) -test(1361, lapply(L, "[", Time==3L), list(L[[1L]][Time == 3L], L[[2L]][Time == 3L])) - -# Feature #735, first two cases: 1) .SD, and 2) DT[, c(.SD, lapply(.SD, ...)), by=...] optimisation: -# Don't set options(datatable.verbose=TRUE) here because the "running test 1362.1 ..." messages cause output to scroll away errors on CRAN checks last 13 lines -DT <- data.table(x=c(1,1,1,2,2), y=1:5, z=6:10) -test(1362.1, DT[, .SD, by=x, verbose=TRUE], - output="lapply optimization changed j from '.SD' to 'list(y, z)'") -test(1362.2, DT[, c(.SD), by=x, verbose=TRUE], - output="lapply optimization changed j from 'c(.SD)' to 'list(y, z)'") -test(1362.3, DT[, c(.SD, lapply(.SD, sum)), by=x, verbose=TRUE], - output="lapply optimization changed j from 'c(.SD, lapply(.SD, sum))' to 'list(y, z, sum(y), sum(z))'") -test(1362.4, DT[, c(lapply(.SD, sum), .SD), by=x, verbose=TRUE], - output="lapply optimization changed j from 'c(lapply(.SD, sum), .SD)' to 'list(sum(y), sum(z), y, z)'") -test(1362.5, DT[, c(list(y), .SD, lapply(.SD, sum)), by=x, verbose=TRUE], - output="lapply optimization changed j from 'c(list(y), .SD, lapply(.SD, sum))' to 'list(y, y, z, sum(y), sum(z))'") -# 3) .SD[1] and 4) .SD[1L] -test(1362.6, DT[, c(.SD[1L]), by=x, verbose=TRUE], - output="lapply optimization changed j from 'c(.SD[1L])' to 'list(y[1L], z[1L])'") -test(1362.7, DT[, c(.SD[1L], lapply(.SD, sum)), by=x, verbose=TRUE], - output="lapply optimization changed j from 'c(.SD[1L], lapply(.SD, sum))' to 'list(y[1L], z[1L], sum(y), sum(z))'") -test(1362.8, DT[, c(.SD[.N]), by=x, verbose=TRUE], - output="lapply optimization changed j from 'c(.SD[.N])' to 'list(y[.N], z[.N])'") -test(1362.9, DT[, .SD[1], by=x, verbose=TRUE], - output="lapply optimization changed j from '.SD[1]' to 'list(y[1], z[1])'") -test(1362.11, DT[, c(.SD[1]), by=x, verbose=TRUE], - output="lapply optimization changed j from 'c(.SD[1])' to 'list(y[1], z[1])'") -test(1362.12, DT[, c(.SD[1], lapply(.SD, sum)), by=x, verbose=TRUE], - output="lapply optimization changed j from 'c(.SD[1], lapply(.SD, sum))' to 'list(y[1], z[1], sum(y), sum(z))'") -test(1362.13, DT[, head(.SD, 1), by=x, verbose=TRUE], - output="lapply optimization changed j from 'head(.SD, 1)' to 'list(head(y, 1), head(z, 1))'") -# make sure .I is named as I when no name is given -test(1362.14, names(DT[, c(list(.I, mean(y)), lapply(.SD, sum)), by=x]), c("x", "I", "V2", "y", "z")) -# and if a name is given, it's retained -test(1362.15, names(DT[, c(list(bla=.I, mean(y)), lapply(.SD, sum)), by=x]), c("x", "bla", "V2", "y", "z")) -# Add test to ensure that mean() gets replaced with fastmean when GForce won't be used. -test(1362.16, DT[, c(list(.I, mean(y)), lapply(.SD, mean)), by=x, verbose=TRUE], - output="Old mean optimization changed j from 'list(.I, mean(y), mean(y), mean(z))' to 'list(.I, .External(Cfastmean, y, FALSE), .External(Cfastmean, y, FALSE), .External(Cfastmean, z, FALSE))'") - -# setDT(DT), when input is already a data.table checks if selfrefok and if not, does alloc.col again. -DT = list(data.frame(x=1:5, y=6:10)) -invisible(lapply(DT, setDT)) -DT = DT[[1L]] -test(1363.1, selfrefok(DT), 1L) -foo <- function(x) setDT(x) -df = data.frame(x=1, y=2) -foo(df) -test(1363.2, selfrefok(df), 0L) -setDT(df) -test(1363.3, selfrefok(df), 1L) - -# setdiff, parly #547. internal as of now, and named setdiff_ because the name "set" can be confused with the set* functions. -# maybe provide a %diff% operator that internally calls setdiff_?? Usage x %diff% y? -X = data.table(a=c(1,1,1,1,3,3,2,2,2))[, `:=`(b=factor(a), c=as.character(a), d = as.integer(a), e=1:9)] -Y = data.table(a=c(3,4), b=factor(3:4), c=c("3","4"), d=3:4, e=c(TRUE, FALSE), f=c(5L,7L)) -test(1364.1, setdiff_(X, Y, "a", "a"), data.table(a=c(1,2))) -test(1364.2, setdiff_(X, Y, c("a", "e"), c("a", "f")), X[!5, list(a,e)]) -test(1364.3, setdiff_(X, Y, "a", "e"), error="When x's column ('a') is integer or numeric, the corresponding column in y ('e')") -test(1364.4, setdiff_(X, Y, "b", "b"), data.table(b=factor(c(1,2), levels=c(1,2,3)))) -test(1364.5, setdiff_(X, Y, c("b", "e"), c("b", "f")), X[!5, list(b,e)]) -test(1364.6, setdiff_(X, Y, "b", "c"), data.table(b=factor(c(1,2), levels=c(1,2,3)))) -test(1364.7, setdiff_(X, Y, "c", "c"), data.table(c=as.character(c(1,2)))) -test(1364.8, setdiff_(X, Y, c("c", "e"), c("c", "f")), X[!5, list(c,e)]) -test(1364.9, setdiff_(X, Y, "c", "b"), data.table(c=c("1", "2"))) -test(1364.11, setdiff_(X, Y, "d", "d"), data.table(d=1:2)) -test(1364.12, setdiff_(X, Y, c("d", "e"), c("d", "f")), X[!5, list(d,e)]) -test(1364.13, setdiff_(X, Y, "d", "e"), error="When x's column ('d') is integer or numeric, the corresponding column in y ('e')") -test(1364.14, setdiff_(X, Y, "b", "a"), error="When x's column ('b') is factor, the corresponding column in y ('a')") -test(1364.15, setdiff_(X, Y, "c", "a"), error="When x's column ('c') is character, the corresponding column in y ('a') ") -test(1364.16, setdiff_(X, Y), error="length(by.x) != length(by.y)") -test(1364.17, setdiff_(X[, list(a)], Y[, list(a)]), data.table(a=c(1,2))) - -# not join along with by=.EACHI, #604 -DT <- data.table(A=c(1,1,1,2,2,2,2,3,3,4,5,5))[, `:=`(B=as.integer(A), C=c("c", "e", "a", "d"), D=factor(c("c", "e", "a", "d")), E=1:12)] -setkey(DT, A) -test(1365.1, suppressMessages(DT[!J(c(2,5)), sum(E), by=.EACHI]), - suppressMessages(DT[J(c(1,3,4)), sum(E), by=.EACHI])) -setkey(DT, B) -test(1365.2, suppressMessages(DT[!J(c(4:5)), list(.N, sum(E)), by=.EACHI]), - suppressMessages(DT[J(1:3), list(.N, sum(E)), by=.EACHI])) -setkey(DT, C) -test(1365.3, suppressMessages(copy(DT)[!"c", f := .N, by=.EACHI]), - suppressMessages(copy(DT)[c("a", "d", "e"), f := .N, by=.EACHI])) -setkey(DT, D) -test(1365.4, suppressMessages(DT[!J(factor("c")), .N, by=.EACHI]), - suppressMessages(DT[J(factor(c("a", "d", "e"))), .N, by=.EACHI])) -test(1365.5, suppressMessages(DT[!"c", lapply(.SD, sum), by=.EACHI, .SDcols=c("B", "E")]), - suppressMessages(DT[c("a", "d", "e"), lapply(.SD, sum), by=.EACHI, .SDcols=c("B", "E")])) - -# uniqlengths doesn't error on 0-length input -test(1366, uniqlengths(integer(0), 0L), integer(0)) - -# na.last=NA gets 0's for NAs not at the beginning when there are values so close to NA_integer_ for integers and -Inf for example for numerics. Moved logic to the end in forder.c so that we replace NAs with 0's after the ordering have been taken care of completely. -x = c(-2147483000L, NA_integer_, 1L) -test(1367.1, forderv(x, na.last=NA), c(0L,1L,3L)) -x = c(NA, Inf, 0, 1, -1, -Inf, NaN) -test(1367.2, forderv(x, na.last=NA), c(0L, 0L, 6L, 5L, 3L, 4L, 2L)) - -# Fix for integer overflow segfault in setRange -x = c(-2147483647L, NA_integer_, 2L) -test(1368.1, forderv(x), c(2L, 1L, 3L)) -x = c(2147483647L, NA_integer_, -2L) -test(1368.2, forderv(x), c(2L, 3L, 1L)) - -# tests for frankv. testing on vectors alone so that we can compare with base::rank -# One difference is that NAs belong to the same group, unlike base::rank. So are NaNs. -# So, they can't be compared to base::rank, won't be identical except for ties="first", and (ties="random", na.last=NA) - should document this. - -# no seed set on purpose -dt = data.table(AA=sample(c(-2:2), 50, TRUE), - BB=sample(c(-2,-1,0,1,2,Inf,-Inf), 50, TRUE), - CC=sample(c(letters[1:5]), 50, TRUE), - DD=sample(c(-2:2), 50, TRUE), - EE=sample(as.logical(c(-2:2)), 50, TRUE)) -if (test_bit64) dt[, DD := as.integer64(DD)] -test_no = 1369.0 -for (i in seq_along(dt)) { - col = dt[[i]] - for (j in list(TRUE, FALSE, "keep")) { - for (k in c("average", "min", "max", "first")) { - if (k == "random") set.seed(45L) - if (class(col) == "integer64") { - r1 = rank(as.integer(col), ties.method=k, na.last=j) - r2 = rank(-xtfrm(as.integer(col)), ties.method=k, na.last=j) - } - else { - r1 = rank(col, ties.method=k, na.last=j) - r2 = rank(-xtfrm(col), ties.method=k, na.last=j) - } - if (k == "random") set.seed(45L) - r3 = frankv(col, ties.method=k, na.last=j) - r4 = frankv(col, order=-1L, ties.method=k, na.last=j) - - test_no = signif(test_no+.01, 7) - test(test_no, r1, r3) - test_no = signif(test_no+.01, 7) - test(test_no, r2, r4) - } - } -} -# test na.last=NA here separately. -dt = data.table(AA=sample(c(-2:2, NA), 50, TRUE), - BB=sample(c(-2,-1,0,1,2,Inf,-Inf, NA, NaN), 50, TRUE), - CC=sample(c(letters[1:5], NA), 50, TRUE), - DD=sample(c(-2:2, NA), 50, TRUE), - EE=sample(as.logical(c(-2:2, NA)), 50, TRUE)) -if (test_bit64) dt[, DD := as.integer64(DD)] - -for (i in seq_along(dt)) { - col = dt[[i]] - for (k in c("average", "min", "max", "first")) { - if (k == "random") set.seed(45L) - if (class(col) == "integer64") { - r1 = rank(as.integer(col), ties.method=k, na.last=NA) - r2 = rank(-xtfrm(as.integer(col)), ties.method=k, na.last=NA) - } - else { - r1 = rank(col, ties.method=k, na.last=NA) - r2 = rank(-xtfrm(col), ties.method=k, na.last=NA) - } - if (k == "random") set.seed(45L) - r3 = frankv(col, ties.method=k, na.last=NA) - r4 = frankv(col, order=-1L, ties.method=k, na.last=NA) - - test_no = signif(test_no+.01, 7) - test(test_no, r1, r3) - test_no = signif(test_no+.01, 7) - test(test_no, r2, r4) - } -} - - -# tests for is_na, which is equivalent of rowSums(is.na(dt)) > 0L -# not exported yet, but we could! -## UPDATE: also added tests for "any_na", internal version of anyNA -## which also includes implementation for bit64::integer64, but the -## real need is for merging factors correctly in joins, and we need -## a fast check for NAs; can't rely on 3.1+ for anyNA. -dt = list(AA=sample(c(NA,-2:2), 50, TRUE), - BB=sample(c(NA,-2,-1,0,NaN,1,2,Inf,-Inf), 50, TRUE), - CC=sample(c(NA,letters[1:5]), 50, TRUE), - DD=sample(c(NA,-2:2), 50, TRUE), - EE=sample(as.logical(c(NA,-2:2)), 50, TRUE)) -if (test_bit64) dt[["DD"]] = as.integer64(dt[["DD"]]) -test_no = 1370.0 -ans = as.list(na.omit(as.data.table(dt))) -for (i in seq_along(dt)) { - combn(names(dt), i, function(cols) { - test_no = signif(test_no+.01, 7) - ans1 = is_na(dt[cols]) - ans2 = rowSums(is.na(as.data.table(dt[cols]))) > 0L - test(test_no, ans1, ans2) - - # update: tests for any_na - test_no = signif(test_no+.01, 7) - test(test_no, any_na(dt[cols]), TRUE) - test_no = signif(test_no+.01, 7) - test(test_no, any_na(ans[cols]), FALSE) - TRUE - }) -} -## The function is_na now gains a "by" argument where we can specify the columns. Tests have not been added for that yet. -## However, I've added tests for 'na.omit.data.table' that uses this internally. So we don't have to add tests here again. -## See tests 1394.* - -# extensive testing of overlap joins: - -# first test all argument check errors... -x = data.table(chr=c("Chr1", "Chr1", "Chr2", "Chr2", "Chr2"), start=c(5,10, 1, 25, 50), end=c(11,20,4,52,60)) -y = data.table(chr=c("Chr1", "Chr1", "Chr2"), start=c(1, 15,1), end=c(4, 18, 55), val=1:3) -# no by.x and by.y error -test(1371.1, foverlaps(x, y, type="any"), error="'y' must be keyed (i.e., sorted, and, marked as sorted).") -setkey(y, chr, end, start) -test(1371.2, foverlaps(x, y, by.y=1:3, type="any"), error="The first 3 columns of y's key is not identical to the columns specified in by.y.") -setkey(y, chr, start, end) -setnames(y, c("chr", "pos1", "pos2", "val")) -setcolorder(y, c("chr", "val", "pos1", "pos2")) -ans1 = foverlaps(x, y, type="any", by.x=c("chr", "start", "end"), by.y=c("chr", "pos1", "pos2"), which=TRUE, nomatch=0L) -test(1371.3, foverlaps(x,y,by.x=1:3, nomatch=0L), data.table(chr=x$chr[2:5], y[c(2,3,3,3), -1, with=FALSE], x[2:5, 2:3, with=FALSE])) -if (test_GenomicRanges) { - # this branch tests the result is the same as GenomicRanges. This branch alone covers about 50% of ijoin.c - gr <- function(x) { - GRanges(Rle(x[[1]]), IRanges(start=x[[2]], end=x[[3]])) - } - fo <- function(gr1, gr2, ...) { - olaps = findOverlaps(gr1, gr2, ...) - if (is.vector(olaps)) return(olaps) - ans = setDT(list(xid=queryHits(olaps), yid=subjectHits(olaps))) - setorder(ans) - ans - } - test(1371.4, setorder(ans1), fo(gr(x), gr(y[, c(1,3,4), with=FALSE]), type="any", select="all")) - - runs = 3L # repeat 3 times.. - types=c("any", "within", "start", "end") - mults=c("all", "first", "last") - maxgap=0L; minoverlap=1L - verbose=FALSE; which=TRUE - test_no <- 1372.0 - for (run in seq_len(runs)) { - n1 = max(50L, sample(1e2L, 1, FALSE)) - n2 = max(50L, sample(1e2L, 1, FALSE)) - N = max(100L, sample(1e3L, 1, FALSE)) - - i1 = sample(N, n1, TRUE) - i2 = sample(N, n1, TRUE) - start = pmin(i1,i2) - end = pmax(i1,i2) - chr = sort(sample(paste("Chr", 1:2, sep=""), length(start), TRUE)) - i = setDT(list(chr=chr, start=start, end=end)) - - i1 = sample(N, n2, TRUE) - i2 = sample(N, n2, TRUE) - start = pmin(i1,i2) - end = pmax(i1,i2) - chr = sort(sample(paste("Chr", 1:2, sep=""), length(start), TRUE)) - x = setDT(list(chr=chr, start=start, end=end)) - setkey(x); setkey(i) - for (type in types) { - for (mult in mults) { - # data.table overlap join - nomatch = ifelse(mult == "all", 0L, NA_integer_) - ans1 = foverlaps(i, x, mult=mult, type=type, nomatch=nomatch, which=which, verbose=verbose) - ans2 = fo(gr(i), gr(x), type=type, select=mult) - test_no = signif(test_no+.01, 7) - # cat("test =", test_no, ", i = ", run, ", type = ", type, ", mult = ", mult, "\n", sep="") - test(test_no, ans1, ans2) - } - } - } -} - -# fix for bug in address - #824 -# was temporarily disabled in issue #2619 -x = c(1L,5L,3L) -address(x) ## shouldn't increment NAM field -out = capture.output(.Internal(inspect(x))) -test(1373, grepl("NAM\\(1\\)", out), TRUE) - -# fix for bug #762 - key'd data.table with a non-existing column in 'by' is not handled properly. -DT <- data.table(x=1:5, z=5:1, key="z") -y <- c(1,3,2,3,2) -test(1374.1, DT[, list(x=sum(x)), by=y], data.table(y=c(1,3,2), x=c(5L, 6L, 4L))) -y <- c(1,2,2,3,3) -test(1374.2, DT[, list(x=sum(x)), by=y], data.table(y=c(1,2,3), x=c(5L, 7L, 3L), key="y")) - -# order in i combined with := in j, updates those rows in that order -# order in i without := in j, returns new object in that order, which is then updated -# Similarly, subset in i with := in j, updates that subset -DT = as.data.table(iris) -DT[,Species:=as.character(Species)] -test(1375.1, DT[,mean(Petal.Width),by=Species][order(-V1),Species:=toupper(Species)]$Species, c("SETOSA","VERSICOLOR","VIRGINICA")) -test(1375.2, DT[,mean(Petal.Width),by=Species][order(-V1)][,Species:=toupper(Species)]$Species, c("VIRGINICA","VERSICOLOR","SETOSA")) -test(1375.3, DT[,mean(Petal.Width),by=Species][V1>1,Species:=toupper(Species)]$Species, c("setosa","VERSICOLOR","VIRGINICA")) - -# Secondary keys a.k.a indexes ... -DT = data.table(a=1:10,b=10:1) -test(1376.1, indices(DT), NULL) -test(1376.2, DT[b==7L,verbose=TRUE], DT[4L], output="Creating new index 'b'") -test(1376.3, indices(DT), "b") -test(1376.4, DT[b==8L,verbose=TRUE], DT[3L], output="Optimized subsetting with index 'b'") -test(1376.5, DT[a==7L,verbose=TRUE], DT[7L], output="Creating new index") # add 2nd secondary key -test(1376.6, indices(DT), c("b","a")) # 2 secondary keys of single columns -test(1376.7, DT[a==7L,verbose=TRUE], DT[7L], output="Optimized subsetting with index 'a'") -setkey(DT,b) -test(1376.8, indices(DT), NULL) -test(1376.9, list(DT[a==2L], indices(DT)), list(DT[9L],"a")) # create indices for next test -setindex(DT,NULL) -test(1376.10, list(key(DT), indices(DT)), list("b", NULL)) -options(datatable.auto.index = FALSE) -test(1376.11, list(DT[a==2L], indices(DT)), list(DT[9L],NULL)) -options(datatable.auto.index = TRUE) -test(1376.12, list(DT[a==2L], indices(DT)), list(DT[9L],"a")) - -# When i is FALSE and a column is being added by reference, for consistency with cases when i is not FALSE -# we should still add the column. But we need to know what type it should be, so the user supplied RHS of := -# needs to work on empty input to tell us the column type. Package vardpoor in example(vardchanges) used to -# rely on DT[FALSE,...] not adding the column and not evaluating RHS but it no longer does that so we can -# make this consistent now. If that usage is required then user should use if(FALSE) DT[...] instead. -DT = data.table(a=1:3, b=4:6) -ans = copy(DT)[, foo:=NA_real_] -test(1377.1, copy(DT)[FALSE, foo:=7], ans) -test(1377.2, copy(DT)[0, foo:=7], ans) -test(1377.3, copy(DT)[, foo := Reduce(function(x,y)paste(x,y,sep="__"), .SD), .SDcols=c("a","b")], - data.table(a=1:3, b=4:6, foo=c("1__4","2__5","3__6"))) -err = "Some items of .SDcols are not column names" -# .SDcols should always be checked even if RHS (which uses .SDcols) isn't eval'd due to i==FALSE -test(1377.4, copy(DT)[, bar := Reduce(function(x,y)paste(x,y,sep="__"), .SD), .SDcols=c("a","zz")], - error=err) -test(1377.5, copy(DT)[FALSE, bar := Reduce(function(x,y)paste(x,y,sep="__"), .SD), .SDcols=c("a","zz")], - error=err) -test(1377.6, DT, data.table(a=1:3, b=4:6)) # check that the original hasn't been changed by these tests -test(1377.7, copy(DT)[FALSE, bar:=stop("eval'd")], error="eval'd") -DT[,bar:=NA] # create column so that RHS isn't needed to be eval'd to know type. We don't allow type changes anyway. - # Now no need to eval RHS (and therefore find error), as relied on by package treemap - # in example(random.hierarchical.data) in the do.call of fun=="addRange" where it's called on - # an empty subset and LB <- x[[1]][1] results in NA which causes seq(LB, UB, ...) to error. -test(1377.8, copy(DT)[FALSE, bar:=stop("eval'd")], DT) - -#==================================== -# fread issue with http download on Windows, thanks to Steve Miller for highlighting. -# any file would do but this one is http://www.russell.com/common/indexes/csvs/russellmicrocapvalueindex_hist.csv -# it happens to have a \r embedded in the first (quoted) column as well but that's not the issue -# can't pass in the http: address directly because this runs on CRAN and any http: site might be unavailable -# therefore, this doesn't actually test mode="wb" but close as we can get -# NB: As of v1.10.5, fread copes ok with any number of \r before the \n - -test(1378.1, fread(file=testDir("russellCRLF.csv"))[19,`Value With Dividends`], 357.97) - -f = paste0("file://",testDir("russellCRLF.csv")) -# simulates a http:// request as far as file.download() and unlink() goes, without internet -# download.file() in fread() changes the input data from \r\n to \n, on Windows. -test(1378.2, fread(f, showProgress=FALSE)[19,`Value With Dividends`], 357.97) - -f = paste("file://",testDir("russellCRCRLF.csv"),sep="") -# actually has 3 \r in the file, download.file() from file:// changes that to \r\r\n, so we can simulate download.file from http: in text mode. -test(1378.3, fread(f, showProgress=FALSE)[19,`Value With Dividends`], 357.97) -#==================================== - -oldv = options(datatable.fread.datatable = FALSE) -test(1379.1, fread("A,B\n1,3\n2,4\n"), data.frame(A=1:2,B=3:4)) -test(1379.2, fread("A,B\n1,3\n2,4\n",data.table=TRUE), data.table(A=1:2,B=3:4)) -options(datatable.fread.datatable = TRUE) -test(1379.3, fread("A,B\n1,3\n2,4\n",data.table=FALSE), data.frame(A=1:2,B=3:4)) -options(oldv) - -# That that RHS of == is coerced to x's type before bmerge in auto index. Package vardpoor does this in example(linqsr) -DT = data.table(a=c(0,0,1,1,0,0), b=1:6) # 'a' type double here, as it is in vardpoor -test(1380, DT[a==TRUE], DT[3:4]) - -# Fix #847, as.data.table.list and character(0) issue -x <- data.table(a=character(0), b=character(0), c=numeric(0)) -setkey(x, a, b) -test(1381, x[J("foo", character(0)), nomatch=0L], x, warning="Item 2 is of size 0 but maximum size is 1,") - -# Fix for #813 and #758 -DT = data.table(x = 1:2) -test(1382.1, DT[c(FALSE, FALSE), list(x, 3:4)], data.table(x=integer(0), V2=integer(0))) -DT <- data.table(id = c("a", "a", "b", "b"), var = c(1.1, 2.5, 6.3, 4.5), key="id") -test(1382.2, DT["c", list(id, check = any(var > 3)), nomatch=0L], data.table(id=character(0), check=logical(0), key="id")) -test(1382.3, DT[c(FALSE), id], character(0)) -DT <- DT[1:3]; setkey(DT, id) -test(1382.4, DT[c("c", "b"), list(id, check = any(var > 3)), nomatch=0L], data.table(id="b", check=TRUE, key="id")) - -# Fix for #742 - allow.cartesian should be ignored if `i` has no duplicates. -DT <- data.table(id=rep(letters[1:2], 2), var = rnorm(4), key="id") -test(1383.1, DT[letters[1:3], list(var)], DT[1:5, list(var)]) -# Fix for #800 - allow.cartesian should be ignored if jsub[1L] has `:=`. TODO: maybe still warn if `i` has duplicates? -DT=data.table(id=c(1,1), date=c(1992,1991), value=c(4.1,4.5), key="id") -test(1383.2, copy(DT)[DT, a:=1], DT[, a := 1]) - -# Somehow DT[col==max(col)] was never tested, broken by auto-indexing new in v1.9.4, #858 -DT = data.table(a = c(1,1,1,2,2,2,3,3,3), b = rnorm(9)) -test(1384, DT[a == max(a)], DT[7:9]) - -# Dups on RHS of == or %in% -DT = data.table(id = paste("id",1:5,sep="")) -id.sub = c("id1", "id2", "id3", "id3", "id4") # deliberate dup -test(1385.1, DT[id %in% id.sub], DT[1:4]) -test(1385.2, DT[id == id.sub], DT[1:3]) - -# reserved class attributes conflict with auto index names, # -DT = data.table(class=c('a','b'), x=c(1,2)) -test(1386, DT[class=='a'], DT[1]) - -# Fix for #774 - parsing a$b() in 'j' -DT = data.table(x=1:5, y=6:10) -ll = list(foo = function() 1L) -test(1387.1, copy(DT)[, z := ll$foo()], copy(DT)[, z:=1L]) -test(1387.2, copy(DT)[, z := ll[[1L]]()], copy(DT)[, z:=1L]) - -# Fix for #811 - ITime and negative integers formats wrong result. -x = c(1L, -1L, -3700L) -class(x) = "ITime" -test(1388, as.character(x), c("00:00:01", "-00:00:01", "-01:01:40")) - -# Fix for #880. Another eval(parse(.)) issue. -DT <- as.data.table(iris) -DT[, foo := "Species"] -test(1389, copy(DT)[,bar := eval(parse(text=foo[1]), envir=.SD)], copy(DT)[, bar := Species]) - -# Fix for foverlaps() floating point interval (double) types. Should increment them by machine tolerance, not by 1L -DT1 = data.table(start=c(0.88), end=c(0.88)) -DT2 = data.table(start=c(0.26, 0.5, 0.55, 0.7), end=c(0.61, 0.88, 0.88-.Machine$double.eps^0.5, 0.89)) -setkey(DT2) -test(1390.1, foverlaps(DT1, DT2, which=TRUE), data.table(xid=1L, yid=c(2L, 4L))) -DT1 = data.table(start=c(0.3,0.5), end=c(0.3,0.5)) -DT2 = data.table(start=c(0.4), end=c(0.4)) -setkey(DT2) -test(1390.2, foverlaps(DT1, DT2, which=TRUE), data.table(xid=1:2, yid=as.integer(c(NA, NA)))) -tt = c( as.POSIXct('2011-10-11 07:49:36'), as.POSIXct('2011-10-11 07:49:37')) -DT1 = data.table(start=tt, end=tt) -DT2 = data.table(start=tt[1], end=tt[1]) -setkey(DT2) -test(1390.3, foverlaps(DT1, DT2, which=TRUE), data.table(xid=1:2, yid=as.integer(c(1L, NA)))) -tt = c( as.POSIXct('2011-10-11 07:49:36.3'), as.POSIXct('2011-10-11 07:49:37.4'), as.POSIXct('2011-10-11 07:49:37.5')) -DT1 = data.table(start=tt, end=tt) -DT2 = data.table(start=tt[2], end=tt[2]) -setkey(DT2) -test(1390.4, foverlaps(DT1, DT2, which=TRUE), data.table(xid=1:3, yid=as.integer(c(NA, 1L, NA)))) -tt = c( as.POSIXct('2011-10-11 07:49:36.0003'), as.POSIXct('2011-10-11 07:49:36.0199'), as.POSIXct('2011-10-11 07:49:36.0399')) -DT1 = data.table(start=tt, end=tt) -DT2 = data.table(start=tt[2], end=tt[2]) -setkey(DT2) -test(1390.5, foverlaps(DT1, DT2, which=TRUE), data.table(xid=1:3, yid=as.integer(c(NA, 1, NA)))) - -# Fix for #891. 'subset' and duplicate names. -# duplicate column names rule - if column numbers, extract the right column. If names, extract always the first column -DT = data.table(V1=1:5, V2=6:10, V3=11:15) -setnames(DT, c("V1", "V2", "V1")) -test(1391.1, subset(DT, select=c(3L,2L)), DT[, c(3L, 2L), with=FALSE]) -test(1391.2, subset(DT, select=c("V2", "V1")), DT[, c("V2", "V1"), with=FALSE]) - -# Test faster version of na.omit() using is_na. -DT = data.table(x=sample(c(1:2, NA), 30, TRUE), y=sample(c(1:5, NA, NaN), 30, TRUE)) -test(1392.1, na.omit(DT), DT[!is.na(x) & !is.na(y)]) -# added 'invert = ', a logical argument which when TRUE returns rows that has any NAs instead. -test(1392.2, na.omit(DT, invert=TRUE), DT[is.na(x) | is.na(y)]) - -# Fix for #899. Mix of ordered and normal factors where normal factors in more than 1 data.table has identical levels. -DT1 = data.table(A = factor(INT(7,8,7,8,7)), B = factor(6:10), C = 0) -DT2 = data.table(D = ordered(1:5), A = factor(INT(1:2,1:2,1L)), C = 0) -DT3 = data.table(A = factor(INT(7:8)), C = 0) -ans = data.table(A=factor(INT(7,8,7,8,7,1,2,1,2,1,7,8), levels=c("7", "8", "1", "2")), B=factor(INT(6:10, rep(NA,7))), C=0, D=ordered(INT(rep(NA,5), 1:5, rep(NA,2)))) -test(1393.1, rbindlist(list(DT1, DT2, DT3), fill = TRUE), ans) -# test for #591 (R-Forge #2491) -ans[, ID := rep(1:3, c(5,5,2))] -setcolorder(ans, c("ID", LETTERS[1:4])) -test(1393.2, rbindlist(list(DT1, DT2, DT3), fill = TRUE, idcol="ID"), ans) - -# Tests for na.omit.data.table (faster version + with a 'cols=' new argument) -col = c(1:2, NA_integer_) -DT = data.table(a=sample(col, 20, TRUE), b=as.numeric(sample(col,20,TRUE)), c=as.logical(sample(col,20,TRUE)), d=as.character(sample(col,20,TRUE))) -# can't use complete.cases on bit64... will have to test integer64 separately. -# if (test_bit64) { -# DT[, e := as.integer64(sample(col,20,TRUE))] -# } -test_no = 1394 -for (i in seq_along(DT)) { - combn(names(DT), i, function(cols) { - ans1 = na.omit(DT, cols=cols) - ans2 = DT[complete.cases(DT[, cols, with=FALSE])] - test_no <<- signif(test_no+.001, 7) - test(test_no, ans1, ans2) - 0L - }) -} - -# dropping secondary keys on update or delete -DT = data.table(a=1:3, b=4:6) -test(1396, DT[a==2, verbose=TRUE], DT[2], output="Creating new index 'a'") -test(1397, DT[b==6, verbose=TRUE], DT[3], output="Creating new index 'b'") -test(1398, DT[b==6, verbose=TRUE], DT[3], output="Optimized subsetting with index 'b'") -test(1399, indices(DT), c("a","b")) -test(1400, DT[2, a:=4L, verbose=TRUE], data.table(a=c(1L,4L,3L),b=4:6), output=".*Dropping index 'a' due to an update on a key column") -test(1401, indices(DT), "b") -test(1402, DT[,b:=NULL,verbose=TRUE], data.table(a=c(1L,4L,3L)), output=".*Dropping index 'b' due to an update on a key column") -test(1403, indices(DT), NULL) -DT = data.table(x=1:5) -test(1404, DT[, y := x <= 2L], data.table(x=1:5, y=c(TRUE,TRUE,FALSE,FALSE,FALSE))) -test(1405, DT[y == TRUE, .N, verbose=TRUE], 2L, output="Creating new index") -test(1406, DT[, y := x <= 3L, verbose=TRUE], data.table(x=1:5, y=c(TRUE,TRUE,TRUE,FALSE,FALSE)), output=".*Dropping index") -test(1407, DT[y == TRUE, .N], 3L) -DT = data.table(x=1:5, y=10:6) -test(1408, DT[x==3,verbose=TRUE], DT[3], output="Creating") -test(1409, indices(DT), "x") -set(DT,1:3,1L,-10L) -test(1410, indices(DT), NULL) -test(1411, DT[x==5], DT[5]) -setorder(DT, y) -test(1412, indices(DT), NULL) -test(1413, DT[x==5], DT[1]) -DT = data.table(foo=1:3, bar=4:6, baz=9:7) -setindex(DT,foo,bar,baz) -test(1414, indices(DT), c("foo__bar__baz")) -test(1415, DT[2,bar:=10L,verbose=TRUE], output=".*Shortening index 'foo__bar__baz' to 'foo' due to an update on a key column") # test middle -test(1416, indices(DT), 'foo') -setindex(DT,foo,bar,baz) -test(1417, DT[2,baz:=10L,verbose=TRUE], output=".*Shortening index 'foo__bar__baz' to 'foo__bar' due to an update on a key column") # test last -setindex(DT,bar,baz) -test(1418.1, DT[2,c("foo","bar"):=10L,verbose=TRUE], output=".*Dropping index.* due to an update on a key column") # test 2nd to 1st -setindex(DT,bar,baz) -test(1418.2, DT[2,c("foo","baz"):=10L,verbose=TRUE], output=".*Dropping index 'bar__baz' due to an update on a key column") # test 2nd to 2nd - -## testing key retainment on assign (#2372) -DT <- data.table(x1 = c(1,1,1,1,1,2,2,2,2,2), - x2 = c(1,1,2,2,2,1,1,2,2,2), - x3 = c(1,2,1,1,2,1,1,1,1,2), - y = rnorm(10), - key = c("x1", "x2", "x3")) -thisDT <- copy(DT)[2, x1 := 3] -test(1419.1, key(thisDT), NULL) -thisDT <- copy(DT)[2, x2 := 3] -test(1419.2, key(thisDT), "x1") -test(1419.3, forderv(thisDT, c("x1")), integer(0)) -thisDT <- copy(DT)[2, x2 := 3] -test(1419.4, key(thisDT), "x1") -test(1419.5, forderv(thisDT, c("x1")), integer(0)) -thisDT <- copy(DT)[3, x3 := 3] -test(1419.6, key(thisDT), c("x1", "x2")) -test(1419.7, forderv(thisDT, c("x1", "x2")), integer(0)) -thisDT <- copy(DT)[3, c("x1", "x3") := .(3,3)] -test(1419.8,key(thisDT), NULL) -thisDT <- copy(DT)[3, c("x2", "x3") := .(3,3)] -test(1419.9, key(thisDT), "x1") -# skip test numbers ending 0 because if 1419.10 fails, it prints as 1419.1 the same as 1419.1 -test(1419.11, forderv(thisDT, c("x1")), integer(0)) -setkey(DT, NULL) -thisDT <- copy(DT)[3, x3 := 3] -test(1419.12, key(thisDT), NULL) -## same tests for empty DT -## forderv tests can be skipped for empty DT -DT <- DT[0] -thisDT <- copy(DT)[, x3 := 3] -test(1419.13, key(thisDT), NULL) -setkeyv(DT, c("x1", "x2", "x3")) -thisDT <- copy(DT)[, x1 := 3] -test(1419.14, key(thisDT), NULL) -thisDT <- copy(DT)[, x2 := 3] -test(1419.15, key(thisDT), "x1") -thisDT <- copy(DT)[, x2 := 3] -test(1419.16, key(thisDT), "x1") -thisDT <- copy(DT)[, x3 := 3] -test(1419.17, key(thisDT), c("x1", "x2")) -thisDT <- copy(DT)[, c("x1", "x3") := .(3,3)] -test(1419.18, key(thisDT), NULL) -thisDT <- copy(DT)[, c("x2", "x3") := .(3,3)] -test(1419.19, key(thisDT), "x1") - -## testing secondary index retainment on assign (#2372) - -allIndicesValid <- function(DT){ - ## checks that the order of all indices is correct - for(idx in seq_along(indices(DT))){ - index <- attr(attr(DT, "index"), paste0("__", indices(DT)[idx], collapse = "")) - if(!length(index)) index <- seq_len(nrow(DT)) - if(length(forderv(DT[index], indices(DT, vectors = TRUE)[[idx]]))){ - ## index is not properly ordered - return(FALSE) - } - if(any(duplicated(names(attributes(attr(DT, "index")))))){ - ## index names are not unique - return(FALSE) - } - } - return(TRUE) -} - -## on data.table where indices are not integer(0) -DT <- data.table(a = c(1,1,1,2,1,2,2,2,2,2), - aaa = c(2,1,2,2,2,1,1,2,2,2), - b = c(1,2,1,1,2,1,1,1,1,2), - ab = rnorm(10)) - -test(1419.21, indices(copy(DT)[1, a:=1]), NULL) -setindex(DT, a) -setindex(DT, a, aaa) -setindex(DT, ab, aaa) -setindex(DT) -test(1419.22, allIndicesValid(DT), TRUE) -thisDT <- copy(DT)[1, a:=1][, aaa := 1][, ab := 1] -test(1419.23, indices(thisDT), NULL) -test(1419.24, allIndicesValid(thisDT), TRUE) -thisDT <- copy(DT)[, b := 2] -test(1419.25, indices(thisDT), c("a", "a__aaa", "ab__aaa")) -test(1419.26, allIndicesValid(thisDT), TRUE) -thisDT <- copy(DT)[, ab := 2] -test(1419.27, indices(thisDT), c("a", "a__aaa")) -test(1419.28, allIndicesValid(thisDT), TRUE) -thisDT <- copy(DT)[, aaa := 2] -test(1419.29, indices(thisDT), c("a")) -test(1419.31, allIndicesValid(thisDT), TRUE) -thisDT <- copy(DT)[, c("aaa", "b") := 2] -test(1419.32, indices(thisDT), c("a")) -test(1419.33, allIndicesValid(thisDT), TRUE) - -## on data.table where indices are integer(0) -DT <- data.table(a = c(1,1,1,1,1,2,2,2,2,2), - aaa = c(1,1,2,2,2,1,1,2,2,2), - b = c(1,2,1,2,3,1,2,1,2,3), - ab = 1:10) - -test(1419.34, indices(copy(DT)[1, a:=1]), NULL) -setindex(DT, a) -setindex(DT, a, aaa) -setindex(DT, ab, aaa) -setindex(DT) -test(1419.35, allIndicesValid(DT), TRUE) -thisDT <- copy(DT)[1, a:=1][, aaa := 1][, ab := 1] -test(1419.36, indices(thisDT), NULL) -test(1419.37, allIndicesValid(thisDT), TRUE) -thisDT <- copy(DT)[, b := 2] -test(1419.38, indices(thisDT), c("a", "a__aaa", "ab__aaa")) -test(1419.39, allIndicesValid(thisDT), TRUE) -thisDT <- copy(DT)[, ab := 2] -test(1419.41, indices(thisDT), c("a", "a__aaa", "a__aaa__b")) -test(1419.42, allIndicesValid(thisDT), TRUE) -thisDT <- copy(DT)[, aaa := 2] -test(1419.43, indices(thisDT), c("a", "ab")) -test(1419.44, allIndicesValid(thisDT), TRUE) -thisDT <- copy(DT)[, c("aaa", "b") := 2] -test(1419.45, indices(thisDT), c("a", "ab")) -test(1419.46, allIndicesValid(thisDT), TRUE) - -## on empty DT -DT <- DT[0] -setindex(DT, NULL) -test(1419.47, indices(copy(DT)[, a:=1]), NULL) -setindex(DT, a) -setindex(DT, a, aaa) -setindex(DT, ab, aaa) -setindex(DT) -test(1419.48, allIndicesValid(DT), TRUE) -thisDT <- copy(DT)[, a:=1][, aaa := 1][, ab := 1] -test(1419.49, indices(thisDT), NULL) -test(1419.51, allIndicesValid(thisDT), TRUE) -thisDT <- copy(DT)[, b := 2] -test(1419.52, indices(thisDT), c("a", "a__aaa", "ab__aaa")) -test(1419.53, allIndicesValid(thisDT), TRUE) -thisDT <- copy(DT)[, ab := 2] -test(1419.54, indices(thisDT), c("a", "a__aaa", "a__aaa__b")) -test(1419.55, allIndicesValid(thisDT), TRUE) -thisDT <- copy(DT)[, aaa := 2] -test(1419.56, indices(thisDT), c("a", "ab")) -test(1419.57, allIndicesValid(thisDT), TRUE) -thisDT <- copy(DT)[, c("aaa", "b") := 2] -test(1419.58, indices(thisDT), c("a", "ab")) -test(1419.59, allIndicesValid(thisDT), TRUE) - - -# setnames updates secondary key -DT = data.table(a=1:5,b=10:6) -setindex(DT,b) -test(1420, indices(DT), "b") -setnames(DT,"b","foo") -test(1421, indices(DT), "foo") -test(1422, DT[foo==9, verbose=TRUE], DT[2], output="Optimized subsetting with index 'foo'") -setindex(DT,a,foo) -test(1423, indices(DT), c("foo","a__foo")) # tests as well that order of attributes is retained although we don't use that property currently. -test(1424, indices(setnames(DT,"foo","bar")), c("bar","a__bar")) -test(1425, indices(setnames(DT,"a","baz")), c("bar","baz__bar")) -test(1426, DT[baz==4L, verbose=TRUE], output="Creating new index 'baz'") -test(1427, indices(DT), c("bar","baz__bar", "baz")) -test(1428, DT[bar==9L, verbose=TRUE], output="Optimized subsetting with index 'bar'") -test(1429, indices(setnames(DT,"bar","a")), c("baz", "a", "baz__a")) - -# Finalised == and %in% optimization in i -DT = data.table(a=1:3,b=c(0,2,3,0,0,2)) -test(1430, DT[a==1:2], error="RHS of == is length 2 which is not 1 or nrow (6). For robustness, no recycling is allowed (other than of length 1 RHS). Consider %in% instead.") -test(1431, DT[a %in% 1:2], DT[c(1,2,4,5)]) -test(1432, DT[a==b], DT[2:3]) -test(1433, DT[a %in% b], DT[c(2,3,5,6)]) -test(1434, DT[a==b+1], DT[c(1,4,6)]) -test(1435, DT[b==max(a)], DT[3]) -test(1436, DT[a==2,verbose=TRUE], DT[c(2,5)], output="Coercing double column i.'a' to integer") -DT[,a:=factor(letters[a])] -test(1437, DT[a==factor("b"),verbose=TRUE], DT[c(2,5)], output="Creating new index 'a'") -## test that the lookup env for RHS is correct. In internal env,notjoin is FALSE in this case. -notjoin <- TRUE -DT <- data.table(x = TRUE) -test(1437.1, DT[x == notjoin], DT) -## column names 'sorted' and 'unique' could cause problems because of CJ with do.call in .prepareFastSubset -DT <- data.table(sorted = TRUE, unique = FALSE) -test(1437.2, DT[sorted == TRUE & unique == FALSE], DT) -## test no reordering in groups -DT <- data.table(x = c(1,1,1,2), y = c(3,2,1,1)) -setindex(DT, x, y) -test(1437.3, DT[x==1], setindex(data.table(x = c(1,1,1), y = c(3,2,1)), x,y)) -## test that key order makes no difference -DT <- data.table(x = c(2,1,1,1), y = c(3,2,1,1), z = c(1,1,2,2)) -test(1437.4, setkey(setkey(DT, x,y,z)[x==1&y==1&z==2], NULL),setkey(setkey(DT, y,x,z)[x==1&y==1&z==2], NULL)) -setkey(DT, NULL) -setorder(DT, -x, -y, z) -DT2 <- copy(DT) -setindex(DT, x,y,z) -setindex(DT2, z,y,x) -test(1437.5, setindex(DT[x==1&y==1&z==2], NULL),setindex(DT2[x==1&y==1&z==2], NULL)) -## test that query order makes no difference -set.seed(1) -DT <- data.table(x = c(1,1,1,2,2,2), y = c(1,1,2,2,3,3), z = rnorm(6)) -test(1437.6, copy(DT)[x==2 & y==3], copy(DT)[y==3 & x==2]) -## test that optimization really takes place for the supportd operators, also when connected with & -test(1437.7, DT[x==2, verbose = TRUE], output = "Optimized subsetting") -test(1437.8, DT[x %in% c(2,3), verbose = TRUE], output = "Optimized subsetting") -DT[, a:= c("A", "Q", "W", "C", "X", "Q")] -test(1437.9, DT[a %chin% c("A", "B"), verbose = TRUE], output = "Optimized subsetting") -test(1437.11, DT[a %chin% c("A", "B") & x == 3 & y %in% c(1,2), verbose = TRUE], output = "Optimized subsetting") -## multiple selections on the same column are not optimized and yield correct result -test(1437.12, DT[a %chin% c("A", "B") & a == "A", verbose = TRUE], output = "^ x y z a\n1: 1 1 -0.6264538 A") -test(1437.13, DT[a %chin% c("A", "B") & a == "C"], DT[0]) -## queries with 'or' connection are not optimized and yield the correct result. -test(1437.14, DT[a %chin% c("A", "B") | x == 2, verbose = TRUE], output = "^ x y z a\n1: 1 1 -0.6264538 A\n2: 2 2 1.5952808 C\n3: 2 3 0.3295078 X\n4: 2 3 -0.8204684 Q") -test(1437.15, DT[a %chin% c("A", "B") | x == 2], DT[c(1, 4, 5, 6)]) -## notjoin queries with connection are not optimized and yield the correct result. -test(1437.16, DT[!a %chin% c("A", "B") & x == 2, verbose = TRUE], output = "^ x y z a\n1: 2 2 1.5952808 C\n2: 2 3 0.3295078 X\n3: 2 3 -0.8204684 Q") -test(1437.17, DT[!a %chin% c("A", "B") & x == 2], DT[c(4, 5, 6)]) -## queries with j are optimized (Correct results are tested extensively below) -test(1437.18, DT[x == 2, .(test = x+y), verbose = TRUE], output = "Optimized subsetting") -test(1437.19, DT[x == 2, test := x+y, verbose = TRUE], output = "Optimized subsetting") -## optimize option level 3 is required -oldOpt <- getOption("datatable.optimize") -options("datatable.optimize" = 2L) -test(1437.21, DT[x == 2, verbose = TRUE], output = "^ x y") -options("datatable.optimize" = oldOpt) -test(1437.22, DT[x == 2, verbose = TRUE], output = "Optimized subsetting") -## NaN on right hand side is treated correctly. NA on right hand side is not reaching .prepareFastSubset, so not tested here -DT <- data.table(x = c(1L:10L, NA_integer_, NA_integer_), y = c(1:10, NA_real_, NaN)) -test(1437.23, DT[y == NaN], DT[0]) -test(1437.24, DT[y == NA], DT[0]) -test(1437.25, DT[x == 5 & y == NaN], DT[0]) -## notjoin treats NA's correctly -test(1437.26, DT[!x == 3], DT[-c(3,11,12)]) -## column comparisons are not affected -DT <- data.table(x = c(1:10, 1:10, 1:10), y = c(1:20, -1:-10)) -test(1437.27, DT[x == y], DT[1:10]) -## subsets with logical vectors are optimized correctly. -DT <- data.table(x = c(TRUE, TRUE, TRUE, FALSE), y = c(FALSE, TRUE, FALSE, TRUE)) -test(1437.28, DT[x & y, verbose = TRUE], output = "Optimized subsetting") -test(1437.29, DT[x & y], DT[2]) -## subsets where just cols are given but columns are not logical are not optimized. -DT <- data.table(x = c(1, 0, 2, 4), y = c(0, 2, 1, 3)) -test(1437.31, DT[x & y, verbose = TRUE], output = "^ x y") -test(1437.32, DT[x & y], DT[3:4]) -## test that optimization is switched off if CJ would result in more than 1e4 rows of i (#2635) -# single column query with more than 1e4 rows is optimized -test(1437.33, DT[x %in% 0:1e5, verbose = TRUE], output = "Optimized subsetting") -test(1437.34, DT[x %in% 0:1e5], DT) -# multi column query with less than 1e4 rows in i is optimized -test(1437.35, DT[x %in% 0:99 & y %in% 0:98, verbose = TRUE], output = "Optimized subsetting") -test(1437.36, DT[x %in% 0:99 & y %in% 0:98], DT) -# multi column query with more than 1e4 rows in i is not optimized -test(1437.37, DT[x %in% 0:100 & y %in% 0:101, verbose = TRUE], output = "Subsetting optimization disabled because the cross-product of RHS values exceeds 1e4, causing memory problems.") -test(1437.38, DT[x %in% 0:100 & y %in% 0:101], DT) -## do extensive tests of optimized vs non-optimized queries for identical results. -## very much inspired by the tests for non equi joins (1641ff) -set.seed(13545) -n <- 1e3 ## rows of the data.table. I checked that with these rows and the seed, all queries (except for == NA) have at least one match -oldOpt <- getOption("datatable.optimize") ## remember for restoring after the test -## create test DT -DT <- data.table(intCol = sample(c(1:3, NA), n, replace = TRUE), - doubleCol = sample(c(1.86, 1000.345, 2.346, NA, NaN), n, replace = TRUE), - boolCol = sample(c(TRUE, FALSE, NA), n, replace = TRUE), - charCol = sample(c(LETTERS[1:3], NA), n, replace = TRUE), - groupCol = sample(c("a", "b", "c"), n, replace = TRUE), - sortedGroupCol = c(rep(1L, floor(n/3)), rep(2L, floor(n/3)), rep(3L, ceiling(n/3)))) ## sorted grouping column is important to test #2713 -if (test_bit64) DT[, int64Col := as.integer64(sample(1:3, n, replace = TRUE))] -## get list with unique values excluding NA -vals <- lapply(DT, function(x) {out <- unique(x); out[!is.na(out)]}) -## define possible queries for each column. -queries <- list(intCol = c(paste0("intCol == ", sample(vals$intCol, 1)), - paste0("intCol %in% c(", paste0(c(NA,sample(vals$intCol, 3, replace = TRUE)), collapse = ","), ")")), - doubleCol = c(paste0("doubleCol == ", sample(vals$doubleCol, 1)), - paste0("doubleCol %in% c(NA, NaN, ", paste0(sample(vals$doubleCol, 3, replace = TRUE), collapse = ","), ")")), - boolCol = c(paste0("boolCol == ", sample(vals$boolCol, 1))), ## %in% query makes no sense for bools, therefore not tested - charCol = c(paste0("charCol == '", sample(vals$charCol, 1), "'"), - paste0("charCol %in% c(NA, ", paste0("'", sample(vals$charCol, 3, replace = TRUE), "'", collapse = ","), ")"), - paste0("charCol %chin% c(NA, ", paste0("'", sample(vals$charCol, 3, replace = TRUE), "'", collapse = ","), ")")) - ) -if (test_bit64) - queries$int64Col = c(paste0("int64Col == ", sample(vals$int64Col, 1)), - paste0("int64Col %in% c(NA_integer64_, as.integer64(", paste0(sample(vals$int64Col, 3, replace = TRUE), collapse = ","), "))")) -## create all combinations of up to three queries, connected by "&". -## Includes all combinations, also with a subset of columns, but no permutations -all <- data.table(intCol = character(0), - doubleCol = character(0), - boolCol = character(0), - charCol = character(0), - int64Col = character(0)) -for(thisLength in 1:3){ - ## get all query combinations with up to three columns - combs <- as.list(as.data.table(combn(length(queries),thisLength))) - for(comb in combs) all <- rbind(all, do.call(CJ, queries[comb]), fill = TRUE) -} -all[is.na(all)] <- "missing" -## construct the query string in i -all[, query := paste(intCol, doubleCol, boolCol, charCol, int64Col, sep = "&")] -all[, query := gsub("&missing$", "", gsub("missing&", "", query))] -## define examplary test queries for j -jQueries <- c(".(test = intCol + doubleCol, test2 = paste0(boolCol, charCol))", - "c('test1', 'test2') := list(pmax(intCol, doubleCol), !boolCol)") -## define example 'by' values -bys <- c("groupCol", "sortedGroupCol", character(0)) -## test each query string -test_no <- 1437.0039 -for(t in seq_len(nrow(all))){ - ## test the query with missing j - thisQuery <- all$query[t] - options("datatable.optimize" = 3L) - ansOpt <- DT[eval(parse(text = thisQuery))] - options("datatable.optimize" = 2L) - ansRef <- DT[eval(parse(text = thisQuery))] - test(signif(test_no, 8), ansOpt, ansRef) - test_no <- test_no + 0.0001 - ## repeat the test with 'which = TRUE' - options("datatable.optimize" = 3L) - ansOpt <- DT[eval(parse(text = thisQuery)), which = TRUE] - options("datatable.optimize" = 2L) - ansRef <- DT[eval(parse(text = thisQuery)), which = TRUE] - test(signif(test_no, 7), ansOpt, ansRef) - test_no <- test_no + 0.0001 - ## repeat the test with the j queries - for(thisJquery in jQueries) { - ## do it with and without existing "by" - for(thisBy in bys){ - options("datatable.optimize" = 3L) - ansOpt <- DT[eval(parse(text = thisQuery)), eval(parse(text = thisJquery)), by = thisBy] - options("datatable.optimize" = 2L) - ansRef <- DT[eval(parse(text = thisQuery)), eval(parse(text = thisJquery)), by = thisBy] - test(signif(test_no, 7), ansOpt, ansRef) - test_no <- test_no + 0.0001 - } - } -} -options("datatable.optimize" = oldOpt) ## restore to default - -# fread dec=',' e.g. France -test(1438, fread("A;B\n1;2,34\n", dec="12"), error="nchar(dec) == 1L is not TRUE") -test(1439, fread("A;B\n8;2,34\n", dec="1"), data.table(A=8L, B="2,34")) -test(1440, fread("A;B\n8;2,34\n", dec=","), data.table(A=8L, B=2.34)) -test(1441, fread("A;B\n1;2,34\n", sep=".", dec="."), error="sep == dec ('.') is not allowed") -test(1442, fread("A;B\n1;2,34\n", dec=",", sep=","), error="sep == dec (',') is not allowed") - -# sep=".", issue #502 -input = paste( paste("192.168.4.", 1:10, sep=""), collapse="\n") -test(1444.1, fread(input, sep=".", dec="*"), ans<-data.table(V1=192L,V2=168L,V3=4L,V4=1:10)) -test(1444.2, fread(input, sep=".", dec=","), ans) -test(1444.3, fread(paste(paste("192. 168. 4. ", 1:10, sep = ""), collapse="\n"), sep=".", dec=","), ans) -test(1444.4, fread(paste(paste("Hz.BB.GHG.", 1:10, sep = ""), collapse="\n"), sep=".", dec=","), - data.table(V1="Hz",V2="BB",V3="GHG",V4=1:10)) - -# doubled quote inside a quoted field followed by an embedded newline -test(1445, fread(testDir("doublequote_newline.csv"))[7:10], data.table(A=c(1L,1L,2L,1L), B=c("a","embedded \"\"field\"\"\nwith some embedded new\nlines as well","not this one","a"))) -# the example from #489 directly : -test(1446, fread('A,B,C\n233,"AN ""EMBEDDED"" QUOTE FIELD",morechars\n'), data.table(A=233L, B='AN ""EMBEDDED"" QUOTE FIELD', C='morechars')) - -# # unescaped quoted subregion followed by newline -# # commented this test for now as the logic now is to redirect to normal checks -# test(1447, fread('A,B,C\n233,"an unescaped "embedded" -# region followed by newline",morechars\n')) - -# when detecting types ... -test(1448.1, fread('A,B\n1,"embedded""\nquote"\n2,should be ok\n'), - data.table(A=1:2,B=c('embedded""\nquote','should be ok'))) -test(1448.2, fread('A,B\n1,"embedded"" -quote"\n2,should be ok\n'), - data.table(A=1:2,B=c('embedded"" -quote','should be ok'))) - -if (test_bit64) { - # quoted multiline (scrambled data thanks to #810) - test(1449, fread(testDir("quoted_multiline.csv"))[c(1,43:44),c(1,22:24),with=FALSE], - data.table(GPMLHTLN=as.integer64(c("3308386085360","3440245203140","1305220146734")), - BLYBZ = c(0L,4L,6L), - ZBJBLOAJAQI = c("LHCYS AYE ZLEMYA IFU HEI JG FEYE","",""), - JKCRUUBAVQ = c("",".\\YAPCNXJ\\004570_850034_757\\VWBZSS_848482_600874_487_PEKT-6-KQTVIL-7_30\\IRVQT\\HUZWLBSJYHZ\\XFWPXQ-WSPJHC-00-0770000855383.KKZ",""))) -} - -# Fix for #927 -DT = data.table(x=1L, y=2L) -test(1450, DT[, set(.SD, j="x", value=10L)], error=".SD is locked. Updating .SD by reference using := or set") - -# Tests for shallow copy taking cols argument - not exported yet. -DT = setDT(lapply(1:5, sample, 10, TRUE)) -ans1 = sapply(DT, address) -fans2 = function(DT, cols=NULL) sapply(shallow(DT, cols), address) -test(1451.1, ans1, fans2(DT)) # make sure default/old functionality is intact -test(1451.2, ans1[3:4], fans2(DT, 3:4)) # using integer column numbers -test(1451.3, ans1[c(5,2)], fans2(DT, c(5,2))) # using numeric column numbers -test(1451.4, ans1[c(4,2,4)], fans2(DT,c(4,2,4))) # using duplicate column numbers -test(1451.5, ans1[3:2], fans2(DT, c("V3", "V2"))) # using column names -test(1451.6, ans1[c(3,3)], fans2(DT, c("V3", "V3"))) # using duplicate column names -test(1451.7, shallow(DT, integer(0)), null.data.table()) # length-0 input work as intended as well. -test(1451.8, shallow(DT, character(0)), null.data.table()) # length-0 input work as intended as well. - -test(1452, fread("notexist.csv"), error="File 'notexist.csv' does not exist; getwd()==") - -# Test for #802 -test(1453, fread(testDir("fread_line_error.csv")), fread(testDir("fread_line_error.csv"), nrow=11), - warning="Stopped.*line 12. Expected 24 fields but found 47.*First discarded non-empty line: <<31,3-0-7 4:1:7.5 HVV,") -# TODO: add comment=="#". Ensure only after last field is observed. - -# no-sep-found => sep="\n", use case for this in #738 -test(1454.1, fread('"Foo"`"Bar"\n5`2\n',sep="`"), data.table(Foo=5L,Bar=2L)) -test(1454.2, fread('"Foo"\n5\n',sep="`"), data.table(Foo=5L)) - -# Fix for #958 - Don't create secondary keys on .SD -DT <- data.table(a=c(1, 1, 1, 0, 0), b=c("A", "B", "A1", "A", "B")) -test(1455, DT[, nrow(.SD[b == 'B']), by=.(a)], data.table(a=c(1,0), V1=1L)) - -# Test for chmatch2 bug fix -x1 = c("b", "a", "d", "a", "c", "a") -x2 = c("a", "a", "a") -x3 = c("d", "a", "a", "d", "a") -table = rep(letters[1:3], each=2) -test(1456.1, chmatch2(x1, table), as.integer(c(3,1,NA,2,5,NA))) -test(1456.2, chmatch2(x2, table), as.integer(c(1,2,NA))) -test(1456.3, chmatch2(x3, table), as.integer(c(NA,1,2,NA,NA))) - -# Add tests for which_ -x = sample(c(-5:5, NA), 25, TRUE) -test(1458.1, which(x > 0), which_(x > 0)) # default is TRUE -test(1458.2, which(x > 0), which_(x > 0, TRUE)) # test explicitly -test(1458.3, which(!x > 0), which_(x > 0, FALSE)) - -# Fix for #982. Testing subsetDT on complex/raw vectors, and added tests for other types. -DT = data.table(a=c(1:3,NA_integer_), b=c(1,2,3,NA), c=as.complex(c(1:3,NA)), d=as.raw(1:4), - e=as.list(1:4), f=c(FALSE,FALSE,TRUE,NA), g=c("a", "b", "c", NA_character_)) -test(1459.1, .Call("CsubsetDT", DT, which(DT$a > 2), seq_along(DT)), setDT(as.data.frame(DT)[3, , drop=FALSE])) -test(1459.2, .Call("CsubsetDT", DT, which(DT$b > 2), seq_along(DT)), setDT(as.data.frame(DT)[3, , drop=FALSE])) -test(1459.3, .Call("CsubsetDT", DT, which(Re(DT$c) > 2), seq_along(DT)), setDT(as.data.frame(DT)[3, , drop=FALSE])) -test(1459.4, .Call("CsubsetDT", DT, which(DT$d > 2), seq_along(DT)), setDT(as.data.frame(DT)[3:4, , drop=FALSE])) -test(1459.5, .Call("CsubsetDT", DT, which(DT$f), seq_along(DT)), setDT(as.data.frame(DT)[3, , drop=FALSE])) -test(1459.6, .Call("CsubsetDT", DT, which(DT$g == "c"), seq_along(DT)), setDT(as.data.frame(DT)[3, , drop=FALSE])) -test(1459.7, .Call("CsubsetDT", DT, which(DT$a > 2 | is.na(DT$a)), seq_along(DT)), setDT(as.data.frame(DT)[3:4,])) -test(1459.8, .Call("CsubsetDT", DT, which(DT$b > 2 | is.na(DT$b)), seq_along(DT)), setDT(as.data.frame(DT)[3:4,])) -test(1459.9, .Call("CsubsetDT", DT, which(Re(DT$c) > 2 | is.na(DT$c)), seq_along(DT)), setDT(as.data.frame(DT)[3:4,])) -test(1459.10, .Call("CsubsetDT", DT, which(DT$f | is.na(DT$f)), seq_along(DT)), setDT(as.data.frame(DT)[3:4,])) -test(1459.11, .Call("CsubsetDT", DT, which(DT$g == "c" | is.na(DT$g)), seq_along(DT)), setDT(as.data.frame(DT)[3:4,])) -test(1459.12, .Call("CsubsetDT", DT, 5L, seq_along(DT)), setDT(as.data.frame(DT)[5,])) - -# Test for na.omit with list, raw and complex types -DT = data.table(x=c(1L,1L,NA), y=c(NA, NA, 1), z=as.raw(1:3), w=list(1,NA,2), v=c(1+5i, NA, NA)) -test(1460.1, na.omit(DT, cols="w"), DT) -test(1460.2, na.omit(DT, cols="v"), DT[1]) -test(1460.3, na.omit(DT, cols=c("v", "y")), DT[0]) -test(1460.4, na.omit(DT, cols=c("z", "v")), DT[1]) -test(1460.5, na.omit(DT, cols=c("w", "v")), DT[1]) - -# Fix for #985 -DT = data.table(x=c("a", "a", "b", "b"), v1=sample(4), v2=sample(4)) -test(1461.1, DT[, c(lapply(.SD, mean), lapply(.SD, sd)), by=x], - DT[, c(lapply(.SD, function(x) mean(x)), lapply(.SD, function(x) sd(x))), by = x]) - - -# Tests for #994 -DT = data.table(x=c("a", "a", "b", "b"), v1=sample(4), v2=sample(4)) -cols = c("v1", "v2") -test(1462.1, DT[, mget(cols, as.environment(-1))], DT[, cols, with=FALSE]) # as.environment needed for testing on pre-R3.0.0 which we don't want to depend on yet -test(1462.2, DT[, mget(cols[1], as.environment(-1))], DT[, cols[1], with=FALSE]) -test(1462.3, DT[, sum(unlist(mget(cols, as.environment(-1)))), by=x], DT[, sum(unlist(.SD)), by=x, .SDcol=cols]) - -# test for 'shift' -x=1:5 -y=factor(x) -test(1463.1, shift(x,1L), as.integer(c(NA, 1:4))) -test(1463.2, shift(x,1:2), list(as.integer(c(NA, 1:4)), as.integer(c(NA, NA, 1:3)))) -test(1463.3, shift(x,1L, 0L), as.integer(c(0L, 1:4))) -test(1463.4, shift(x,1L, type="lead"), as.integer(c(2:5, NA))) -test(1463.5, shift(x,1:2, type="lead"), list(as.integer(c(2:5, NA)), as.integer(c(3:5, NA, NA)))) -test(1463.6, shift(x,1L, 0L, type="lead"), as.integer(c(2:5, 0L))) -test(1463.7, shift(y,1L), factor(c(NA,1:4), levels=1:5)) -test(1463.8, shift(y,1L, type="lead"), factor(c(2:5, NA), levels=1:5)) - -x=as.numeric(x) -test(1463.9, shift(x,1L), as.numeric(c(NA, 1:4))) -test(1463.10, shift(x,1:2), list(as.numeric(c(NA, 1:4)), as.numeric(c(NA, NA, 1:3)))) -test(1463.11, shift(x,1L, 0L), as.numeric(c(0L, 1:4))) -test(1463.12, shift(x,1L, type="lead"), as.numeric(c(2:5, NA))) -test(1463.13, shift(x,1:2, type="lead"), list(as.numeric(c(2:5, NA)), as.numeric(c(3:5, NA, NA)))) -test(1463.14, shift(x,1L, 0L, type="lead"), as.numeric(c(2:5, 0L))) - -if (test_bit64) { - x=as.integer64(x) - test(1463.15, shift(x,1L), as.integer64(c(NA, 1:4))) - test(1463.16, shift(x,1:2), list(as.integer64(c(NA, 1:4)), as.integer64(c(NA, NA, 1:3)))) - test(1463.17, shift(x,1L, 0L), as.integer64(c(0L, 1:4))) - test(1463.18, shift(x,1L, type="lead"), as.integer64(c(2:5, NA))) - test(1463.19, shift(x,1:2, type="lead"), list(as.integer64(c(2:5, NA)), as.integer64(c(3:5, NA, NA)))) - test(1463.20, shift(x,1L, 0L, type="lead"), as.integer64(c(2:5, 0L))) -} - -x=as.character(x) -test(1463.21, shift(x,1L), as.character(c(NA, 1:4))) -test(1463.22, shift(x,1:2), list(as.character(c(NA, 1:4)), as.character(c(NA, NA, 1:3)))) -test(1463.23, shift(x,1L, 0L), as.character(c(0L, 1:4))) -test(1463.24, shift(x,1L, type="lead"), as.character(c(2:5, NA))) -test(1463.25, shift(x,1:2, type="lead"), list(as.character(c(2:5, NA)), as.character(c(3:5, NA, NA)))) -test(1463.26, shift(x,1L, 0L, type="lead"), as.character(c(2:5, 0L))) - -x=c(TRUE,FALSE,TRUE,FALSE,TRUE) -test(1463.27, shift(x,1L), c(NA, x[-5L])) -test(1463.28, shift(x,1:2), list(c(NA, x[-5L]), c(NA, NA, x[-(4:5)]))) -test(1463.29, shift(x,1L, 0L), c(FALSE, x[-5L])) -test(1463.30, shift(x,1L, type="lead"), c(x[-1L], NA)) -test(1463.31, shift(x,1:2, type="lead"), list(c(x[-1L],NA), c(x[-(1:2)],NA,NA))) -test(1463.32, shift(x,1L, 0L, type="lead"), c(x[-(1)], FALSE)) - -# for list of list, #1595 -x = data.table(foo = c(list(c("a","b","c")), list(c("b","c")), list(c("a","b")), list(c("a"))), id = c(1,1,2,2)) -test(1463.33, x[, shift(list(foo)), by=id], - data.table(id=c(1,1,2,2), V1=list(NA, c("a", "b", "c"), NA, c("a", "b")))) -test(1463.34, x[, shift(list(foo), type="lead", fill=NA_integer_), by=id], - data.table(id=c(1,1,2,2), V1=list(c("b", "c"), NA_integer_, c("a"), NA_integer_))) - -# Fix for #1009 segfault in shift -val = runif(1) -test(1463.33, shift(val, 2L), NA_real_) -test(1463.34, shift(val, 2L, type="lead"), NA_real_) - -test(1463.35, shift(1:5, -1L), error="n must be non-negative integer") -test(1463.36, shift(1:5, 1L, fill=c(1:2)), error="fill must be a vector of length") - -# add tests for date and factor? - -# test for 'give.names=TRUE' on vectors -x = 1:10 -nm = c("x_lag_1", "x_lag_2") -ans = list(as.integer(c(NA, 1:9)), as.integer(c(NA, NA, 1:8))) -setattr(ans, 'names', nm) -test(1463.27, shift(x, 1:2, give.names=TRUE), ans) - -# FR #686 -DT = data.table(a=rep(c("A", "B", "C", "A", "B"), c(2,2,3,1,2)), foo=1:10) -# Seemingly superfluous 'foo' is needed to test fix for #1942 -DT[, b := as.integer(factor(a))][, c := as.numeric(factor(a))] -test(1464.1, rleidv(DT, "a"), c(1L, 1L, 2L, 2L, 3L, 3L, 3L, 4L, 5L, 5L)) -test(1464.2, rleid(DT$a), c(1L, 1L, 2L, 2L, 3L, 3L, 3L, 4L, 5L, 5L)) -test(1464.3, rleidv(DT, "b"), c(1L, 1L, 2L, 2L, 3L, 3L, 3L, 4L, 5L, 5L)) -test(1464.4, rleid(DT$b), c(1L, 1L, 2L, 2L, 3L, 3L, 3L, 4L, 5L, 5L)) -test(1464.5, rleidv(DT, "c"), c(1L, 1L, 2L, 2L, 3L, 3L, 3L, 4L, 5L, 5L)) -test(1464.6, rleid(DT$c), c(1L, 1L, 2L, 2L, 3L, 3L, 3L, 4L, 5L, 5L)) -test(1464.7, rleid(as.complex(c(1,0+5i,0+5i,1))), error="Type 'complex' not supported") -test(1464.8, rleidv(DT, 0), error="outside range") -test(1464.9, rleidv(DT, 5), error="outside range") -test(1464.11, rleidv(DT, 1:4), 1:nrow(DT)) -set.seed(1) -DT = data.table( sample(1:2,20,replace=TRUE), sample(1:2,20,replace=TRUE), sample(1:2,20, replace=TRUE)) -test(1464.12, rleidv(DT, 1:4), error="outside range") -test(1464.13, rleidv(DT, 1:2), ans<-INT(1,2,3,4,5,6,6,6,7,8,8,9,10,11,12,13,14,15,16,17)) -test(1464.14, rleidv(DT, 2:1), ans) -test(1464.15, rleidv(DT, c(3,1)), INT(1,1,2,2,3,4,5,5,6,7,8,9,10,11,12,13,14,15,16,17)) - -if (test_xts) { - # data.table-xts conversion #882 - # Date index - dt = data.table(index = as.Date((as.Date("2014-12-12")-49):as.Date("2014-12-12"),origin="1970-01-01"),quantity = as.numeric(rep(c(1:5),10)),value = rep(c(1:10)*100,5)) - xt = as.xts(matrix(data = c(dt$quantity, dt$value),ncol = 2,dimnames = list(NULL,c("quantity","value"))),order.by = dt$index) - dt_xt = as.data.table(xt) - xt_dt = as.xts.data.table(dt) - test(1465.1, all.equal(dt, dt_xt, check.attributes = FALSE)) - test(1465.2, xt, xt_dt) - # POSIXct index - dt <- data.table(index = as.POSIXct(as.Date((as.Date("2014-12-12")-49):as.Date("2014-12-12"),origin="1970-01-01"),origin="1970-01-01"),quantity = as.numeric(rep(c(1:5),10)),value = rep(c(1:10)*100,5)) - xt = as.xts(matrix(data = c(dt$quantity, dt$value),ncol = 2,dimnames = list(NULL,c("quantity","value"))),order.by = dt$index) - dt_xt = as.data.table(xt) - xt_dt = as.xts.data.table(dt) - test(1465.3, all.equal(dt, dt_xt, check.attributes = FALSE)) - test(1465.4, xt, xt_dt) - # index types returned from to.period - dt = data.table(index = as.Date((as.Date("2014-12-12") - 729):as.Date("2014-12-12"), origin = "1970-01-01"), quantity = as.numeric(rep(c(1:5), 73)), value = rep(c(1:73) * 100, 5)) - xt = as.xts(matrix(data = c(dt$quantity, dt$value), ncol = 2, dimnames = list(NULL, c("quantity", "value"))), order.by = dt$index) - xt_w = xts::to.weekly(xt) - xt_dt_xt_w = as.xts.data.table(as.data.table(xt_w)) - xt_m = xts::to.monthly(xt) - xt_dt_xt_m = as.xts.data.table(as.data.table(xt_m)) - xt_q = xts::to.quarterly(xt) - xt_dt_xt_q = as.xts.data.table(as.data.table(xt_q)) - xt_y = xts::to.yearly(xt) - xt_dt_xt_y = as.xts.data.table(as.data.table(xt_y)) - test(1465.5, all.equal(xt_w, xt_dt_xt_w, check.attributes = FALSE)) - test(1465.6, all.equal(xt_m, xt_dt_xt_m, check.attributes = FALSE)) - test(1465.7, all.equal(xt_q, xt_dt_xt_q, check.attributes = FALSE)) - test(1465.8, all.equal(xt_y, xt_dt_xt_y, check.attributes = FALSE)) - - test(1531, xts::last(1:5), 5L) - - # xts issue from Joshua, #1347 - x = as.Date(1:5, origin="2015-01-01") - test(1559.11, last(x), tail(x, 1L)) - - x = xts(1:100, Sys.Date()+1:100) - test(841, last(x,10), x[91:100,]) - # The important thing this tests is that data.table's last() dispatches to xts's method when data.table is loaded above xts. - # But that isn't tested by R CMD check because xts is loaded above data.table, there. - # So to make this test is relevant, run it in fresh R session directly, after: "require(xts);require(data.table)" - # rather than: "require(data.table);require(xts)" - # Which was the main thrust of bug#2312 fixed in v1.8.3 - - # fix for #1484 - x = xts::as.xts(8, order.by = as.Date("2016-01-03")) - test(1589, all.equal(as.data.table(x), data.table(index = as.Date("2016-01-03"), V1 = 8), check.attributes=FALSE)) - - # IDate support in as.xts.data.table #1499 - dt <- data.table(date = c(as.IDate("2014-12-31"), - as.IDate("2015-12-31"), - as.IDate("2016-12-31")), - nav = c(100,101,99), - key = "date") - dt.xts <- as.xts.data.table(dt) - test(1663, dt.xts[1L], xts::xts(data.table(nav=100), order.by=as.Date("2014-12-31"))) -} - - - -# as.data.table.default #969 -ar <- array(NA, dim=c(10,4),dimnames = list(NULL,paste("col",1:4,sep=""))) -test(1466.1, as.data.table(as.data.frame(ar)), as.data.table(ar)) # array type -x <- rep(Sys.time(),3) -test(1466.2, as.data.table(as.data.frame(x)), as.data.table(x)) # posix type - -# fix for #1001, #1002 and #759 -# When adding a column, even if i results in no rows, the RHS needs to evaluate so we can know the -# column type to create. Always create the column for consistency that does not depend on the data in i -for (bool in c(FALSE,TRUE)) { - options(datatable.auto.index=bool) - DT = data.table(a=1:2) - test(1467.01 + bool*0.03, copy(DT)[a==3, b:=notExist+1], error="notExist") - test(1467.02 + bool*0.03, copy(DT)[a==3, b:=a+5L], data.table(a=1:2, b=NA_integer_)) - test(1467.03 + bool*0.03, copy(DT)[a==3, b:=a+5], data.table(a=1:2, b=NA_real_)) -} -test(1467.07, getOption("datatable.auto.index")) # ensure to leave TRUE - -# fix for first bug reported in #1006 on 'foverlaps()' -x <- c(-0.1, 0, 0.1) -n <- length(x) -dt.ref <- data.table(start=x[-n], end=x[-1], key=c("start", "end")) -dt.query <- data.table(q1=c(-0.2, -0.05, 0.05, 0.15), q2=c(-0.2, -0.05, 0.05, 0.15), key=c("q1", "q2")) -ans=cbind(dt.ref[, .(start,end)], dt.query[2:3, .(q1,q2)]) -setkey(ans, q1,q2) -test(1468.1, foverlaps(dt.query, dt.ref, nomatch=0L), ans) -# fix and additional tests for #1006 following OP's follow-up. -dt1 = data.table(x=c(-6.36917800737546, -2.19964384651646), - y=c(-2.19964384651646, 4.07116428752538)) -dt2 = data.table(x= 2.91816502571793, y=2.91816502571793) -setkey(dt1) -setkey(dt2) -test(1468.2, foverlaps(dt2, dt1, which=TRUE), data.table(xid=1L, yid=2L)) -dt1 = data.table(x=c(-6,-3), y=c(-3,4)) -dt2 = data.table(x=3,y=3) -setkey(dt1) -setkey(dt2) -test(1468.3, foverlaps(dt2, dt1, which=TRUE), data.table(xid=1L, yid=2L)) - - -# Fix for #1010 (discovered while fixing #1007). Don't retain key if i had no key, but irows is sorted, and roll != FALSE... See example in #1010. -DT = data.table(x=c(-5,5), y=1:2, key="x") -test(1469.1, key(DT[J(c(2,0)), roll=TRUE]), NULL) -test(1469.2, key(DT[J(c(2,0)), .(x,y), roll=TRUE]), NULL) -test(1469.3, key(DT[J(c(2,0)), y, roll=TRUE, by=.EACHI]), NULL) -test(1469.4, key(DT[J(c(2,0))]), NULL) -test(1469.5, key(DT[SJ(c(2,0)), roll=TRUE]), "x") -test(1469.6, key(DT[J(c(2,0)), roll="nearest"]), NULL) - -# 1007 fix, dealing with Inf and -Inf correctly in rolling joins. -DT = data.table(x=c(-Inf, 3, Inf), y=1:3, key="x") -test(1470.1, DT[J(c(2,-Inf,5,Inf)), roll=Inf], data.table(x=c(2,-Inf,5,Inf), y=c(1L, 1:3))) -test(1470.2, DT[J(c(2,-Inf,5,Inf)), roll=10], data.table(x=c(2,-Inf,5,Inf), y=INT(c(NA, 1, 2, 3)))) -test(1470.3, DT[SJ(c(2,-Inf,5,Inf)), roll=Inf], data.table(x=c(-Inf,2,5,Inf), y=c(1L, 1:3), key="x")) - -# 1006, second bug with -Inf, now that #1007 is fixed. -x <- c(-Inf, -0.1, 0, 0.1, Inf) -n <- length(x) -dt.ref <- data.table(start=x[-n], end=x[-1], key=c("start", "end")) -dt.query <- data.table(q1=c(-0.2, -0.05, 0.05, 0.15), q2=c(-0.2, -0.05, 0.05, 0.15), key=c("q1", "q2")) -test(1471, foverlaps(dt.query, dt.ref), data.table(dt.ref, dt.query, key=c("q1", "q2"))) - -# #1014 (segfault) fix -test(1472, shift(1, 1:2, NA, 'lag'), list(NA_real_, NA_real_)) - -# #528, type=equal simple test -# dt1 = data.table(x=1:5, y=6:10) -# dt2 = data.table(x=3:7, y=8:12) -# setkey(dt1) -# setkey(dt2) -# test(1473, foverlaps(dt1,dt2, which=TRUE, nomatch=0L, type="equal"), -# data.table(xid=3:5, yid=1:3)) - -# More tests for `frankv`, #760 -DT = data.table(x=c(4, 1, 4, NA, 1, NA, 4), y=c(1, 1, 1, 0, NA, 0, 2)) -test(1474.1, frankv(DT, "y", ties.method="dense"), frankv(DT$y, ties.method="dense")) -test(1474.2, frank(DT, y, ties.method="dense"), frank(DT$y, ties.method="dense")) -test(1474.3, frankv(DT, "y", order=-1L, ties.method="dense"), frankv(-DT$y, ties.method="dense")) -test(1474.4, frank(DT, -y, ties.method="dense"), frank(-DT$y, ties.method="dense")) - -# uniqueN, #884, part of #756 and part of #1019 -DT <- data.table(A = rep(1:3, each=4), B = rep(1:4, each=3), C = rep(1:2, 6)) -test(1475.1, uniqueN(DT), 10L) -test(1475.2, DT[, .(uN=uniqueN(.SD)), by=A], data.table(A=1:3, uN=c(3L,4L,3L))) - -# specialized uniqueN for logical vectors, PR#2648 -test(1475.3, uniqueN(c(NA, TRUE, FALSE)), 3L) -test(1475.4, uniqueN(c(NA, TRUE, FALSE), na.rm = TRUE), 2L) -test(1475.5, uniqueN(c(TRUE, FALSE), na.rm = TRUE), 2L) -test(1475.6, uniqueN(c(TRUE, FALSE)), 2L) -test(1475.7, uniqueN(c(TRUE, NA)), 2L) -test(1475.8, uniqueN(c(TRUE, NA), na.rm=TRUE), 1L) -test(1475.9, uniqueN(c(FALSE, NA)), 2L) -test(1475.11, uniqueN(c(FALSE, NA), na.rm=TRUE), 1L) -test(1475.12, uniqueN(c(NA,NA)), 1L) -test(1475.13, uniqueN(c(NA,NA), na.rm=TRUE), 0L) -test(1475.14, uniqueN(NA), 1L) -test(1475.15, uniqueN(NA, na.rm=TRUE), 0L) -test(1475.16, uniqueN(logical()), 0L) -test(1475.17, uniqueN(logical(), na.rm=TRUE), 0L) - -# preserve class attribute in GForce mean (and sum) -DT <- data.table(x = rep(1:3, each = 3), y = as.Date(seq(Sys.Date(), (Sys.Date() + 8), by = "day"))) -test(1476.1, DT[, .(y=mean(y)), x], setDT(aggregate(y ~ x, DT, mean))) - -# test for 'transpose' of a list, TODO: integer64 support. -ll = lapply(1:12, function(x) { - if (x <= 3) sample(10, sample(5:10, 1L)) - else if (x > 3 & x <= 6) as.numeric(sample(101:115, sample(7:12, 1L))) - else if (x > 7 & x <= 9) sample(c(TRUE, FALSE), sample(7:9, 1L), TRUE) - else sample(letters, sample(5:10, 1L)) -}) -ans1 = setDT(transpose(ll)) -ans2 = setDT(lapply(seq_along(ans1), function(x) sapply(ll, `[`, x))) -test(1477.1, ans1, ans2) -ans1 = setDT(transpose(ll[4:6])) -ans2 = setDT(lapply(seq_along(ans1), function(x) sapply(ll[4:6], `[`, x))) -test(1477.9, ans1, ans2) -ans1 = setDT(transpose(ll[8:9])) -ans2 = setDT(lapply(seq_along(ans1), function(x) sapply(ll[8:9], `[`, x))) -test(1477.10, ans1, ans2) -# class is preserved? -dt = data.table(x=1:5, y=6:10) -test(1477.2, transpose(dt), as.data.table(t(as.matrix(dt)))) -# factor column coerce to character -ll = list(factor(letters[1:5]), factor(letters[6:8])) -test(1477.3, transpose(ll), list(c("a", "f"), c("b", "g"), c("c", "h"), c("d", NA), c("e", NA))) -# for data.frames -test(1477.4, transpose(data.frame(x=1:2, y=3:4)), data.frame(V1=c(1L,3L), V2=c(2L,4L))) -# test for `tstrsplit` -ll = sapply(ll, paste, collapse=",") -test(1477.5, transpose(strsplit(ll, ",", fixed=TRUE)), tstrsplit(ll, ",", fixed=TRUE)) -test(1477.6, transpose(1:5), error="l must be a list") -test(1477.7, transpose(list(as.complex(c(1, 1+5i)))), error="Unsupported column type") -test(1477.8, transpose(list(list(1:5))), error="Item 1 of list input is") - -# #480 `setDT` and 'lapply' -ll = list(data.frame(a=1), data.frame(x=1, y=2), NULL, list()) -ll <- lapply(ll, setDT) -test(1478.1, sapply(ll, truelength), c(1025L, 1026L, 1024L, 1024L)) -test(1478.2, sapply(ll, length), INT(1,2,0,0)) - -# rbindlist stack imbalance issue, #980. -test(1479, rbindlist(replicate(4,rbindlist(replicate(47, NULL), - use.names=TRUE, fill=TRUE)), use.names=TRUE, fill=TRUE), null.data.table()) - -# #936, assigning list column to a factor column by reference -DT <- data.table(x = factor(c("a", "b c", "d e f"))) -test(1480, DT[, x := strsplit(as.character(x), " ")], data.table(x=list("a", letters[2:3], letters[4:6]))) - -# #970, over-allocation issue -a=data.frame(matrix(1,ncol=101L)) -old = options(datatable.alloccol=100L) -ans1 = data.table(a) -options(datatable.alloccol=101L) -ans2 = data.table(a) -test(1481.1, ans2, ans1) -options(datatable.alloccol=0L) -ans3 = data.table(a) -test(1481.2, ans3, ans1) -options(datatable.alloccol=1L) -ans4 = data.table(a) -test(1481.3, ans4, ans1) -options(old) - -# #479, check := assignment in environment (actual case is when loaded from disk, but we'll just simulate a scenario here). -ee = new.env() -ee$DT = data.frame(x=1L, y=1:3) -setattr(ee$DT, 'class', c("data.table", "data.frame")) -test(1482.1, truelength(ee$DT), 0L) # make sure that the simulated environment is right. -test(1482.2, ee$DT[, z := 3:1], data.table(x=1L, y=1:3, z=3:1), warning="Invalid .internal.selfref detected and") -test(1482.3, truelength(ee$DT), 1027L) -test(1482.4, ee$DT[, za := 4:6], data.table(x=1L, y=1:3, z=3:1, za=4:6)) -test(1482.5, truelength(ee$DT), 1027L) # should have used spare slot i.e. no increase in tl - -# Fix for #499 and #945 -x <- data.table(k=as.factor(c(NA,1,2)),v=c(0,1,2), key="k") -y <- data.table(k=as.factor(c(NA,1,3)),v=c(0,1,3), key="k") -test(1483.1, x[y], data.table(k=factor(c(NA,1,3)), v=c(0,1,NA), i.v=c(0,1,3), key="k")) -test(1483.2, merge(x,y,all=TRUE), data.table(k=factor(c(NA,1,2,3)), v.x=c(0,1,2,NA), v.y=c(0,1,NA,3), key="k")) - -x <- data.table(country="US") -y <- data.table(country=factor("USA")) -test(1483.3, merge(x,y,by="country",all=TRUE), data.table(country=factor(c("US", "USA")), key="country")) -setkey(y) -test(1483.4, y[x], data.table(country=factor("US"), key="country")) - -# Fix for #842 -SomeFunction <- function(x, setnull=1L) { - ans <- replicate(length(x), list("bla1", "bla2"), simplify=FALSE) - ans[setnull] <- list(NULL) - return(ans) -} -DT <- data.table(ID=1:3, key="ID") -test(1484, DT[, SomeFunction(ID, setnull=1L)], DT[, SomeFunction(ID, setnull=2L)]) - -# Fix for #868 -vals = c("setosa", "versicolor", "virginica") -test(1485, as.data.table(combn(unique(iris$Species),2)), data.table(vals[1:2], vals[c(1,3)], vals[2:3])) -# depends on bug fix to combn() in R 3.1.0, which is now stated dependency - -# Fix for #955 -DT <- data.table(Time=.POSIXct(0, tz="UTC")+0:1, Value=1:2) -options(datatable.auto.index=FALSE) # Have to turn off to avoid error. -ans1.1 = DT[Time==Time[1]] -ans2.1 = DT[Time==.POSIXct(0, tz="UTC")] -options(datatable.auto.index=TRUE) -ans1.2 = DT[Time==Time[1]] -ans2.2 = DT[Time==.POSIXct(0, tz="UTC")] -test(1486.1, as.data.frame(ans1.1), as.data.frame(ans1.2)) -test(1486.2, as.data.frame(ans2.1), as.data.frame(ans2.1)) - -# Fix for #832 -x <- matrix(1:9, ncol=3) -setattr(x, "names", paste("V", seq_len(length(x)), sep = "")) -test(1487.1, setattr(x, "class", c("data.table", "data.frame")), error="Internal structure doesn't seem to be a list") -x <- matrix(1:9, ncol=3) -class(x) = c("data.table", "data.frame") -# not sure how to test this one, so using `tryCatch` -test(1487.2, tryCatch(print(x), error=function(k) "bla"), "bla") - -# Fix for #1043 -DT = data.table(grp=LETTERS[1:2], categ=rep(c("X","Y"), each=2L), condition=rep(c("P","Q"), each=4L), value=sample(8)) -tbl = with(DT, table(grp, categ, condition)) -ans1 = setnames(setDF(data.table(tbl)), "N", "Freq") -ans2 = data.frame(tbl) -ans2[1:3] = lapply(ans2[1:3], as.character) -test(1488, ans1, ans2) - -# joins where x is integer type and i is logical type -DT = data.table(x=1:5, y=6:10, key="x") -test(1489, DT[.(TRUE)], DT[1L]) - -# Fix for #932 -DT <- data.table(v1 = c(1:3, NA), v2 = c(1,NA,2.5,NaN), v3=c(NA, FALSE, NA, TRUE), v4=c("a", NA, "b", "c")) -options(datatable.auto.index = TRUE) # just to be sure -setindex(DT, v1) -test(1490.1, DT[v1==3], subset(DT, v1==3)) -test(1490.2, DT[!v1==3], subset(DT, !v1==3)) -test(1490.3, DT[v1==NA], subset(DT, v1==NA)) -test(1490.4, DT[!v1==NA], subset(DT, !v1==NA)) - -setindex(DT, v2) -test(1490.5, DT[v2==2.5], subset(DT, v2==2.5)) -test(1490.6, DT[!v2==2.5], subset(DT, !v2==2.5)) -test(1490.7, DT[v2==NA], subset(DT, v2==NA)) -test(1490.8, DT[!v2==NA], subset(DT, !v2==NA)) -test(1490.9, DT[v2==NaN], subset(DT, v2==NaN)) -test(1490.10, DT[!v2==NaN], subset(DT, !v2==NaN)) - -setindex(DT, v3) -test(1490.11, DT[v3==FALSE], subset(DT, v3==FALSE)) -test(1490.12, DT[!v3==FALSE], subset(DT, !v3==FALSE)) -test(1490.13, DT[v3==TRUE], subset(DT, v3==TRUE)) -test(1490.14, DT[!v3==TRUE], subset(DT, !v3==TRUE)) -test(1490.15, DT[v3==NA], subset(DT, v3==NA)) -test(1490.16, DT[!v3==NA], subset(DT, !v3==NA)) -test(1490.17, DT[(v3)], subset(DT, v3==TRUE)) -test(1490.18, DT[!(v3)], subset(DT, !v3==TRUE)) - -setindex(DT, v4) -test(1490.19, DT[v4=="b"], subset(DT, v4=="b")) -test(1490.20, DT[!v4=="b"], subset(DT, !v4=="b")) -test(1490.21, DT[v4==NA], subset(DT, v4==NA)) -test(1490.22, DT[!v4==NA], subset(DT, !v4==NA)) - -# test for #957 test -DT <- as.data.table(BOD) -options(datatable.auto.index=FALSE) -ans1 = DT[Time %in% c("1", "2")] -options(datatable.auto.index=TRUE) -ans2 = DT[Time %in% c("1", "2")] -test(1490.23, ans1, ans2) - -# test for #961 -DT <- as.data.table(cars) -options(datatable.auto.index=FALSE) -ans1 = DT[speed %in% list(1, 4)] -options(datatable.auto.index=TRUE) -ans2 = DT[speed %in% list(1, 4)] -test(1490.24, ans1, ans2) - -# replace "." with "list" in 'j' -ee1 = quote(.(val = lm(x ~ .))) -ee2 = quote(.(v1=.(.SD), v2=.(min(y)), v3=.(.(x)), v4=.(x))) -ee3 = quote(.(v1=.(.SD), v2=.(lm(. ~ xx)), v3=.(.(x)), v4=.(x^2))) -ee4 = quote(c("a", "b") := .(.SD)) -ee5 = quote(c("a", "b") := .(v1=x^2, v2 = .(.SD[[1L]]))) -ee6 = quote(.(v1=.(.SD), v2=.(lm(. ~ xx)), v3=list(.(x)), v4=.(x^2))) -test(1491.1, replace_dot_alias(ee1), quote(list(val = lm(x ~ .)))) -test(1491.2, replace_dot_alias(ee2), quote(list(v1=list(.SD), v2=list(min(y)), v3=list(list(x)), v4=list(x)))) -test(1491.3, replace_dot_alias(ee3), quote(list(v1=list(.SD), v2=list(lm(. ~ xx)), v3=list(list(x)), v4=list(x^2)))) -test(1491.4, replace_dot_alias(ee4), quote(c("a", "b") := list(.SD))) -test(1491.5, replace_dot_alias(ee5), quote(c("a", "b") := list(v1=x^2, v2 = list(.SD[[1L]])))) -test(1491.6, replace_dot_alias(ee6), quote(list(v1=list(.SD), v2=list(lm(. ~ xx)), v3=list(list(x)), v4=list(x^2)))) - -# Fix for #1050 -dt = data.table(x=1:5, y=6:10) -options(datatable.auto.index=FALSE) -ans1 <- dt[x == 2.5] -options(datatable.auto.index=TRUE) -ans2 <- dt[x == 2.5] -test(1492, ans1, ans2) - -# Fix for #497 -dt = data.table(x=1:10, y=11:20) -test(1493, dt[, .(x=sum(x)),by= x %% 2, verbose=TRUE], data.table(`x%%2`=c(1,0), x=c(25L,30L)), output="by-expression 'x%%2' is not named") - -# Fix for #705 -DT1 = data.table(date=as.POSIXct("2014-06-22", format="%Y-%m-%d", tz="GMT")) -DT2 = data.table(date=as.Date("2014-06-23")) -test(1494.1, rbind(DT1, DT2), error="Class attributes at column") -test(1494.2, rbind(DT2, DT1), error="Class attributes at column") - -# test 1495 has been added to melt's test section (fix for #1055) - -# Fix for #1056 -DT = data.table(year=2010:2014, v1=runif(5), v2=1:5, v3=letters[1:5]) -test(1496, DT[, shift(v1, 1:2, NA, "lead", TRUE)], DT[, shift(.SD, 1:2, NA, "lead", TRUE), .SDcols=2L]) - -# Fix for #1066 -DT = data.table(x=1, y=2, z=3, a=4, b=5, c=6) -test(1497, DT[, .SD, .SDcols = !c("a", "c")], DT[, !c("a", "c"), with=FALSE]) - -# Fix for #1060 -DT = data.table(x=1, y=2, z=3, a=4, b=5, c=6) -test(1498.1, DT[, .SD, .SDcols=c(TRUE,FALSE)], DT[, c("x", "z", "b"), with=FALSE]) -test(1498.2, DT[, .SD, .SDcols=!c(TRUE,FALSE)], DT[, !c("x", "z", "b"), with=FALSE]) - -# Fix for #1072 -dt <- data.table(group1 = "a", group2 = "z", value = 1) -options(datatable.auto.index=FALSE) -ans1 = dt[group1 %in% c("a", "b"), sum(value), group2] -options(datatable.auto.index=TRUE) -ans2 = dt[group1 %in% c("a", "b"), sum(value), group2] -test(1499, ans1, ans2) - -# Fix for #488 -if (test_bit64) { - test(1500.1, fread("x,y\n3,\n", colClasses = list(integer64 = "y")), - data.table(x=3L, y=as.integer64(NA))) - # more tests after new fix - test(1500.2, fread("x,y\n0,12345678901234\n0,\n0,\n0,\n0,\n,\n,\n,\n,\n,\n,\n,\n,\n,\n,\n,\n12345678901234,\n0,\n0,\n0,\n0,\n0,\n"), - data.table(x=as.integer64(c(rep(0L, 5L), rep(NA, 11), 12345678901234, rep(0L,5L))), - y=as.integer64(c(12345678901234, rep(NA,21))))) - - x = c("12345678901234", rep("NA", 178), "a") - y = sample(letters, length(x), TRUE) - ll = paste(x,y, sep=",", collapse="\n") - test(1500.3, fread(ll, na.strings=NULL), - data.table(V1=x, V2=y)) - - x = c("12345678901234", rep("NA", 178), "0.5") - y = sample(letters, length(x), TRUE) - ll = paste(x,y, sep=",", collapse="\n") - test(1500.4, fread(ll), data.table(V1=suppressWarnings(as.numeric(x)), V2=y)) -} - -# fix for #1082 -dt1 = data.table(x=rep(c("a","b","c"),each=3), y=c(1,3,6), v=1:9, key=c("x", "y")) -dt2 = copy(dt1) -test(1502.1, dt1["a", z := NULL], error="When deleting columns, i should not be provided") -# this shouldn't segfault on 'dt1[...]' -test(1502.2, dt1["a", z := 42L], dt2["a", z := 42L]) - -# fix for #1080 -dt = data.table(col1 = c(1,2,3,2,5,3,2), col2 = c(0,9,8,9,6,5,4), key=c("col1")) -test(1503.1, uniqueN(dt, by=key(dt)), 4L) # default on key columns -test(1503.2, uniqueN(dt), 6L) # on all columns -test(1503.3, uniqueN(dt$col1), 4L) # on just that column - -# .SDcols and with=FALSE understands colstart:colend syntax -dt = setDT(lapply(1:10, function(x) sample(3, 10, TRUE))) -# .SDcols -test(1504.1, dt[, lapply(.SD, sum), by=V1, .SDcols=V8:V10], - dt[, lapply(.SD, sum), by=V1, .SDcols=8:10]) -test(1504.2, dt[, lapply(.SD, sum), by=V1, .SDcols=V10:V8], - dt[, lapply(.SD, sum), by=V1, .SDcols=10:8]) -test(1504.3, dt[, lapply(.SD, sum), by=V1, .SDcols=-(V8:V10)], - dt[, lapply(.SD, sum), by=V1, .SDcols=-(8:10)]) -test(1504.4, dt[, lapply(.SD, sum), by=V1, .SDcols=!(V8:V10)], - dt[, lapply(.SD, sum), by=V1, .SDcols=!(8:10)]) -# with=FALSE and auto with=FALSE tests as from v1.9.8 -test(1504.5, dt[, V8:V10, with=FALSE], dt[, 8:10, with=FALSE]) -test(1504.6, dt[, V8:V10], dt[, 8:10, with=FALSE]) -test(1504.7, dt[, V10:V8, with=FALSE], dt[, 10:8, with=FALSE]) -test(1504.8, dt[, V10:V8], dt[, 10:8, with=FALSE]) -test(1504.9, dt[, -(V8:V10), with=FALSE], dt[, -(8:10), with=FALSE]) -test(1504.11, dt[, -(V8:V10)], dt[, -(8:10), with=FALSE]) -test(1504.12, dt[, !(V8:V10), with=FALSE], dt[, !(8:10), with=FALSE]) -test(1504.13, dt[, !(V8:V10)], dt[, !(8:10), with=FALSE]) - -# Fix for #1083 -dt = data.table(x=1:4, y=c(TRUE,FALSE)) -test(1505.1, as.matrix(dt), as.matrix(as.data.frame(dt))) - -# setcolorder works with data.frames, #1018 -dt = data.table(x=1, y=2) -test(1506, setcolorder(dt, c("y", "x")), data.table(y=2, x=1)) - -# tstrsplit, #1094 -# factor to character -x = factor(paste(letters[1:5], letters[6:10], sep="-")) -test(1507.1, tstrsplit(x, "-"), list(letters[1:5], letters[6:10])) -# type.convert -x = paste(letters[1:5], 1:5, sep="-") -test(1507.2, tstrsplit(x, "-"), list(letters[1:5], as.character(1:5))) -test(1507.3, tstrsplit(x, "-", type.convert=TRUE), list(letters[1:5], 1:5)) - -# implementing #575, keep.rownames can take a name -x = matrix(1:6, ncol=2) -rownames(x) = letters[3:1] -test(1508.1, as.data.table(x, keep="bla"), data.table(bla=letters[3:1], x)) -x = as.data.frame(x) -test(1508.2, as.data.table(x, keep="bla"), data.table(bla=letters[3:1], x)) -x = sample(10); setattr(x, 'names', letters[1:10]) -test(1508.3, as.data.table(x, keep="bla"), data.table(bla=letters[1:10], x=unname(x))) -# also for setDT -df = data.frame(x=1:5, y=6:10, row.names=letters[5:1]) -ans = data.table(foo=letters[5:1], df) -test(1508.4, setDT(df, keep="foo"), ans) - -# #1509 test added for melt above. - -# #1510 transpose converts NULL to NAs -ll = list(1:2, NULL, 3:4) -test(1510.1, transpose(ll), list(c(1L, NA, 3L), c(2L, NA, 4L))) -test(1510.2, transpose(ll, ignore=TRUE), list(c(1L, 3L), c(2L, 4L))) - -# setorder can reorder data.frames too, #1018 -DF = data.frame(x=sample(3,10,TRUE), y=sample(letters[1:2], 10, TRUE)) -rownames(DF) = sample(letters, 10) -ans = DF[order(-xtfrm(DF$y), DF$x), ] -test(1511, ans, setorder(DF, -y, x)) - -# fix for #1108 -if (test_bit64) { - dt <- data.table(id = as.integer64(1:3), a = c("a", "b", "c"), key = "id") - test(1512.1, dt[.(2)], dt[.(as.integer64(2))]) - test(1512.2, dt[.(2L)], dt[.(as.integer64(2))]) - - dt <- data.table(id = as.numeric(1:3), a = c("a", "b", "c"), key = "id") - test(1512.3, dt[.(2L)], dt[.(2)]) - test(1512.4, dt[.(as.integer64(2))], dt[.(2)]) - - dt <- data.table(id = 1:3, a = c("a", "b", "c"), key = "id") - test(1512.5, dt[.(2)], dt[.(2L)]) - test(1512.6, dt[.(as.integer64(2))], dt[.(2L)]) -} - -# setDT gains key argument, #1121 -X = list(a = 4:1, b=runif(4)) -test(1513, setkey(as.data.table(X), a), setDT(X, key="a")) - -# Adding tests for `isReallyReal` -x = as.numeric(sample(10)) -test(1514.1, isReallyReal(x), FALSE) -x = as.numeric(sample(c(1:5, NA))) -test(1514.2, isReallyReal(x), FALSE) # NAs are handled properly -x = as.numeric(sample(c(1:2, NaN, NA))) -test(1514.3, isReallyReal(x), TRUE) -x = as.numeric(sample(c(1:2, Inf, NA))) -test(1514.4, isReallyReal(x), TRUE) -x = as.numeric(sample(c(1:2, -Inf, NA))) -test(1514.5, isReallyReal(x), TRUE) -x = as.numeric(runif(2)) -test(1514.6, isReallyReal(x), TRUE) -x = numeric() -test(1514.7, isReallyReal(x), FALSE) -test(1514.8, isReallyReal(9L), error="x must be of type double") - -# #1091 -old.option = getOption("datatable.prettyprint.char") -options(datatable.prettyprint.char = 5L) -DT = data.table(x=1:2, y=c("abcdefghijk", "lmnopqrstuvwxyz")) -test(1515.1, grep("abcde...", capture.output(print(DT))), 2L) -options(datatable.prettyprint.char = old.option) - -# test 1516: chain setnames() - used while mapping source to target columns -SRC = data.table(x=1:2, y=c("abcdefghij", "klmnopqrstuv"), z=rnorm(2)) -src_cols <- c("y","z") -tgt_cols <- c("name","value") -DT <- SRC[, src_cols, with=FALSE][, setnames(.SD, tgt_cols)] -test(1516.1, names(SRC), c("x","y","z")) # src not altered by ref -test(1516.2, names(DT), tgt_cols) # target expected -test(1516.3, unname(unclass(DT[, tgt_cols, with=FALSE])), unname(unclass(SRC[,src_cols, with=FALSE]))) # content match - -# Fix for #1078 and #1128 -x = data.frame(x=1L, y=2L) -setattr(x, 'class', c("foo", "data.frame")) -test(1517.1, class(as.data.table(x)), c("data.table", "data.frame")) -test(1517.2, class(setDT(x)), c("data.table", "data.frame")) -x = data.table(x="a", y=2L) -setattr(x, 'class', c("foo", "data.table", "data.frame")) -test(1517.3, class(as.data.table(x)), c("data.table", "data.frame")) -test(1517.4, class(setDT(x)), c("data.table", "data.frame")) - -# Fix for setattr, #1142 -x = factor(rep(1:4, each=2L)) -ax = address(x) -setattr(x, 'levels', c("a", "a", "b", "b")) -test(1518.1, levels(x), c("a", "b")) -test(1518.2, address(x), ax) - -# Fix for #1074 and #1092 -x = data.table(x=c(1,1,1,2), y=1:4, key="x") -test(1519.1, x[.(2:3), .N, nomatch=0L], 1L) -x = data.table(k = INT(0,2,3,7), o = "b", key = "k") -y = data.table(k = 1:5, n = paste("n", 1:5, sep=""), key = "k") -test(1519.2, x[y, o := n], data.table(k = INT(0,2,3,7), o = c("b","n2","n3","b"), key = "k")) - -# Fix for #1141 (thanks to @yvanrichard) -x <- data.table(zxc = 1:3, vbn = 4:6) -test(1520, x[, c('zxc', 'qwe', 'rty', 'vbn'), with = FALSE], error = "column(s) not found") - -# Fix for #1154 (unnecessary lock on .SD) -x = data.table(a=c(1,1,2))[, unique(.SD)] -test(1521, x[, b := 5], data.table(a=c(1,2), b=5)) - -# Fix for #1160, fastmean retaining attributes -x = data.table(a = c(2,2,1,1,2), b=setattr(1:5, 'class', c('bla', 'integer'))) -test(1522, class(x[, .(mean(b), all(b)), by=a]$V1), c('bla', 'integer')) - -# Fix for #1145, .N lock handled properly -x = data.table(a=1:5) -test(1523, x[, head(.SD, n=2)[1:.N]], data.table(a=1:2)) - -# #637 add by.x and by.y to merge.data.table -d1 <- data.table(x1=c(1,3,8), y1=rnorm(3), key="x1") -d2 <- data.table(x2=c(3,8,10), y2=rnorm(3), key="x2") -ans1 = merge(d1, d2, by.x = "x1", by.y = "x2") -ans2 = setkey(setDT(merge.data.frame(d1, d2, by.x = key(d1), by.y = key(d2))), x1) -test(1524, ans1, ans2) - -# 'unique =' argument for CJ, #1148 -x = c(1, 2, 1) -y = c(5, 8, 8, 4) -test(1525, CJ(x, y, unique=TRUE), CJ(c(1,2), c(4,5,8))) - -# `key` argument fix for `setDT` when input is already a `data.table`, #1169 -DT <- data.table(A = 1:4, B = 5:8) -setDT(DT, key = "A") -test(1526.1, key(DT), "A") -test(1526.2, key(setDT(DT, key = NULL)), NULL) - -# #501, fread stringsAsFactors=FALSE -dt = data.table(x=1:5, y = letters[1:5]) -text = "x,y\n1,a\n2,b\n3,c\n4,d\n5,e\n" -test(1527.1, dt[, y := factor(y)], fread(text, stringsAsFactors=TRUE)) -set.seed(1L) -dt = data.table(x=1:5, y = sample(letters[1:5])) -text = "x,y\n1,b\n2,e\n3,d\n4,c\n5,a\n" -test(1527.2, dt[, y := factor(y)], fread(text, stringsAsFactors=TRUE)) -set.seed(1L) -dt = data.table(x=1:5, y = sample(letters[1:2], 5, TRUE)) -text = "x,y\n1,a\n2,a\n3,b\n4,b\n5,a\n" -test(1527.3, dt[, y := factor(y)], fread(text, stringsAsFactors=TRUE)) - -# #1027, check.names argument to fread -nm1 = names(fread("a,a\n1,2\n3,4", check.names=FALSE)) -nm2 = names(fread("a,a\n1,2\n3,4", check.names=TRUE)) -nm3 = names(fread("a b,a b\n1,2\n3,4", check.names=TRUE)) -test(1528.1, c("a", "a"), nm1) -test(1528.2, c("a", "a.1"), nm2) -test(1528.3, c("a.b", "a.b.1"), nm3) - -# add tests for between -x = sample(10, 20, TRUE) -test(1529.1, between(x, 1L, 5L, TRUE), x >= 1L & x <= 5L) -test(1529.2, x %between% c(1L, 5L), x >= 1L & x <= 5L) -test(1529.3, between(x, 1L, 5L, FALSE), x > 1L & x < 5L) -x = sample(c(1:10, NA), 20, TRUE) -test(1529.4, between(x, 1L, 5L, TRUE), x >= 1L & x <= 5L) -test(1529.5, x %between% c(1L, 5L), x >= 1L & x <= 5L) -test(1529.6, between(x, 1L, 5L, FALSE), x > 1L & x < 5L) -x = runif(15) -test(1529.7, between(x, 0.25, 0.75, TRUE), x >= 0.25 & x <= 0.75) -test(1529.8, x %between% c(0.25, 0.75), x >= 0.25 & x <= 0.75) -test(1529.9, between(x, 0.25, 0.75, FALSE), x > 0.25 & x < 0.75) -x = c(NA, runif(15), NA) -test(1529.10, between(x, 0.25, 0.75, TRUE), x >= 0.25 & x <= 0.75) -test(1529.11, x %between% c(0.25, 0.75), x >= 0.25 & x <= 0.75) -test(1529.12, between(x, 0.25, 0.75, FALSE), x > 0.25 & x < 0.75) - -# add tests for which.first and which.last -# which.first -test(1530.1, which.first(sample(5, 20, TRUE)), error = "x not boolean") -x <- sample(c(TRUE, FALSE), 20, TRUE) -test(1530.2, which.first(x), which(x)[1L]) -# which.last -test(1530.3, which.last(1:5), error = "x not boolean") -test(1530.4, which.last(x), tail(which(x), 1L)) - -# test for like, %like% -set.seed(2L) -x = apply(matrix(sample(letters, 12), nrow=2), 1, paste, collapse="") -y = factor(sample(c(letters[1:5], x), 20, TRUE)) -xsub = substring(x, 1L, 1L) -test(1532.1, y %like% xsub[1L], grepl(xsub[1L], y)) -test(1532.2, y %like% xsub[2L], grepl(xsub[2L], y)) -test(1532.3, like(y, xsub[1L]), grepl(xsub[1L], y)) -test(1532.4, like(y, xsub[2L]), grepl(xsub[2L], y)) - -# coverage for setkey() to 100% -dt1 = data.table(x=sample(5), y=1:5, key="y") -dt2 = as.data.table(dt1); setattr(dt2, 'sorted', NULL) -test(1533.1, setkeyv(dt1, character(0)), dt2, warning = "cols is a character vector") -test(1533.2, setkeyv(dt1, "x", verbose=TRUE), setkey(dt2, x), output = "forder took") - -# coverage for %+% and trim -test(1534, `%+%.default`(1:5, 6:10), "1,2,3,4,56,7,8,9,10") -test(1535.1, trim(" abcde "), "abcde") -test(1535.2, trim(" abcde"), "abcde") -test(1535.3, trim("abcde "), "abcde") - -# remaining test for covering duplicated.data.table -dt = data.table(x=1:5, y=6:10) -test(1536, duplicated(dt, incomparables=TRUE), error = "argument 'incomparables != FALSE'") - -# test for covering melt 100% -test(1537 , names(melt(dt, id=1L, variable.name = "x", value.name="x")), c("x", "x.1", "x.2"), output = "Duplicate column names") - -# test for tables() -test(1538, tables(), output = "Total:") - -# uniqueN not support list-of-list: reverted #1224 -d1 <- data.table(a = 1:4, l = list(list(letters[1:2]),list(Sys.time()),list(1:10),list(letters[1:2]))) -test(1539, d1[,uniqueN(l)], error = "x must be an atomic vector or data.frames/data.tables") - -# feature #1130 - joins without setting keys -# can't test which=TRUE with DT1.copy's results.. -set.seed(45L) -DT1 = data.table(x=sample(letters[1:3], 15, TRUE), y=sample(6:10, 15, TRUE), - a=sample(100, 15), b=runif(15)) -DT2 = CJ(x=letters[1:3], y=6:10)[, mul := sample(20, 15)][sample(15L, 5L)] -DT3 = rbindlist(list(DT2, list(x="d", y=7L, mul=100L))) -DT3 = DT3[sample(nrow(DT3))] - -# key on char column -DT1.copy = copy(DT1) -setkey(DT1.copy, x) -test(1540.1, DT1[DT2, on=c(x="x")], DT1.copy[DT2]) -test(1540.33, DT1[DT2, on=c("x")], DT1.copy[DT2]) -test(1540.2, DT1[DT2, lapply(.SD, function(x) x * mul), - by=.EACHI, on=c(x="x"), .SDcols=c("a", "b")], - DT1.copy[DT2, lapply(.SD, function(x) x * mul), - by=.EACHI, .SDcols=c("a", "b")]) -test(1540.3, DT1[DT3, on=c(x="x")], DT1.copy[DT3]) -test(1540.4, DT1[DT3, lapply(.SD, function(x) x * mul), - by=.EACHI, on=c(x="x"), .SDcols=c("a", "b")], - DT1.copy[DT3, lapply(.SD, function(x) x * mul), - by=.EACHI, .SDcols=c("a", "b")]) -test(1540.5, DT1[DT3, on=c(x="x"), nomatch=0L], DT1.copy[DT3, nomatch=0L]) -test(1540.6, DT1[DT3, lapply(.SD, function(x) x * mul), - by=.EACHI, on=c(x="x"), .SDcols=c("a", "b"), nomatch=0L], - DT1.copy[DT3, lapply(.SD, function(x) x * mul), - by=.EACHI, .SDcols=c("a", "b"), nomatch=0L]) -test(1540.7, DT1[DT3, on=c(x="x"), roll=TRUE], DT1.copy[DT3, roll=TRUE]) -test(1540.8, DT1[DT3, lapply(.SD, function(x) x * mul), - by=.EACHI, on=c(x="x"), .SDcols=c("a", "b"), roll=TRUE], - DT1.copy[DT3, lapply(.SD, function(x) x * mul), - by=.EACHI, .SDcols=c("a", "b"), roll=TRUE]) - -# key on integer col -DT1.copy = copy(DT1) -setkey(DT1.copy, y) -test(1540.9, DT1[DT2, on=c(y="y")], DT1.copy[DT2[, c(2,1,3), with=FALSE]]) -test(1540.34, DT1[DT2, on=c("y")], DT1.copy[DT2[, c(2,1,3), with=FALSE]]) -test(1540.10, DT1[DT2, lapply(.SD, function(x) x * mul), - by=.EACHI, on=c(y="y"), .SDcols=c("a", "b")], - DT1.copy[DT2[, c(2,1,3), with=FALSE], lapply(.SD, function(x) x * mul), - by=.EACHI, .SDcols=c("a", "b")]) -test(1540.11, DT1[DT3, on=c(y="y")], DT1.copy[DT3[, c(2,1,3), with=FALSE]]) -test(1540.12, DT1[DT3, lapply(.SD, function(x) x * mul), - by=.EACHI, on=c(y="y"), .SDcols=c("a", "b")], - DT1.copy[DT3[, c(2,1,3), with=FALSE], lapply(.SD, function(x) x * mul), - by=.EACHI, .SDcols=c("a", "b")]) -test(1540.13, DT1[DT3, on=c(y="y"), nomatch=0L], DT1.copy[DT3[, c(2,1,3), with=FALSE], nomatch=0L]) -test(1540.14, DT1[DT3, lapply(.SD, function(x) x * mul), - by=.EACHI, on=c(y="y"), .SDcols=c("a", "b"), nomatch=0L], - DT1.copy[DT3[, c(2,1,3), with=FALSE], lapply(.SD, function(x) x * mul), - by=.EACHI, .SDcols=c("a", "b"), nomatch=0L]) -test(1540.15, DT1[DT3, on=c(y="y"), roll=TRUE], DT1.copy[DT3[, c(2,1,3), with=FALSE], roll=TRUE]) -test(1540.16, DT1[DT3, lapply(.SD, function(x) x * mul), - by=.EACHI, on=c(y="y"), .SDcols=c("a", "b"), roll=TRUE], - DT1.copy[DT3[, c(2,1,3), with=FALSE], lapply(.SD, function(x) x * mul), - by=.EACHI, .SDcols=c("a", "b"), roll=TRUE]) - -# multiple keys -DT1.copy = copy(DT1) -setkey(DT1.copy, x, y) -test(1540.17, DT1[DT2, on=c(x="x", y="y")], DT1.copy[DT2]) -test(1540.35, DT1[DT2, on=c("x", "y")], DT1.copy[DT2]) -test(1540.18, DT1[DT2, lapply(.SD, function(x) x * mul), - by=.EACHI, on=c(x="x", y="y")], - DT1.copy[DT2, lapply(.SD, function(x) x * mul), by=.EACHI]) -test(1540.19, DT1[DT3, on=c(x="x", y="y")], DT1.copy[DT3]) -test(1540.20, DT1[DT3, lapply(.SD, function(x) x * mul), - by=.EACHI, on=c(x="x", y="y")], - DT1.copy[DT3, lapply(.SD, function(x) x * mul), - by=.EACHI]) -test(1540.21, DT1[DT3, on=c(x="x", y="y"), nomatch=0L], DT1.copy[DT3, nomatch=0L]) -test(1540.22, DT1[DT3, lapply(.SD, function(x) x * mul), - by=.EACHI, on=c(x="x", y="y"), nomatch=0L], - DT1.copy[DT3, lapply(.SD, function(x) x * mul), - by=.EACHI, nomatch=0L]) -test(1540.23, DT1[DT3, on=c(x="x", y="y"), roll=TRUE], DT1.copy[DT3, roll=TRUE]) -test(1540.24, DT1[DT3, lapply(.SD, function(x) x * mul), - by=.EACHI, on=c(x="x", y="y"), roll=TRUE], - DT1.copy[DT3, lapply(.SD, function(x) x * mul), - by=.EACHI, roll=TRUE]) - -# multiple keys, non-identical names -DT1.copy = copy(DT1) -setkey(DT1.copy, x, y) -setnames(DT2, c("q", "r", "mul")) -setnames(DT3, names(DT2)) -test(1540.25, DT1[DT2, on=c(x="q", y="r")], DT1.copy[DT2]) -test(1540.26, DT1[DT2, lapply(.SD, function(x) x * mul), - by=.EACHI, on=c(x="q", y="r")], - DT1.copy[DT2, lapply(.SD, function(x) x * mul), by=.EACHI]) -test(1540.27, DT1[DT3, on=c(x="q", y="r")], DT1.copy[DT3]) -test(1540.28, DT1[DT3, lapply(.SD, function(x) x * mul), - by=.EACHI, on=c(x="q", y="r")], - DT1.copy[DT3, lapply(.SD, function(x) x * mul), - by=.EACHI]) -test(1540.29, DT1[DT3, on=c(x="q", y="r"), nomatch=0L], DT1.copy[DT3, nomatch=0L]) -test(1540.30, DT1[DT3, lapply(.SD, function(x) x * mul), - by=.EACHI, on=c(x="q", y="r"), nomatch=0L], - DT1.copy[DT3, lapply(.SD, function(x) x * mul), - by=.EACHI, nomatch=0L]) -test(1540.31, DT1[DT3, on=c(x="q", y="r"), roll=TRUE], DT1.copy[DT3, roll=TRUE]) -test(1540.32, DT1[DT3, lapply(.SD, function(x) x * mul), - by=.EACHI, on=c(x="q", y="r"), roll=TRUE], - DT1.copy[DT3, lapply(.SD, function(x) x * mul), - by=.EACHI, roll=TRUE]) - -# to do: add tests for := - -# fix for #477, key not being retained on joins on factor columns -set.seed(1) -dtp <- data.table(pid = gl(3, 3, labels = c("du", "i", "nouana")), - year = gl(3, 1, 9, labels = c("2007", "2010", "2012")), - val = rnorm(9), key = c("pid", "year")) -dtab <- data.table(pid = factor(c("i", "nouana")), - year = factor(c("2010", "2000")), - abn = sample(1:5, 2, replace = TRUE), key = - c("pid", "year")) -test(1541, key(dtp[dtab]), c("pid", "year")) - -# fix DT[TRUE, :=] using too much working memory for i, #1249 -if (!inherits(try(Rprofmem(NULL), silent=TRUE), "try-error")) { # in case R not compiled with memory profiling enabled - f = tempfile() - N = 1000000 # or any large number of rows - DT = data.table(A=1:N, B=rnorm(N)) - DT[TRUE, B := B * 2] # stabilize with initial dummy update - Rprofmem(f) - DT[TRUE, B := B * 2] # or some in-place update - Rprofmem(NULL) - test(1542, length(grep("000",readLines(f, warn=FALSE))), 1L) # one allocation for the RHS only - unlink(f) -} - -# rest of #1130 - merge doesn't copy, instead uses joins without keys. -set.seed(1L) -d1 <- data.table(A = sample(letters[1:10]), X = 1:10, total = TRUE) -d2 <- data.table(A = sample(letters[5:14]), Y = 1:10, total = FALSE) - -ans1 <- suppressWarnings(merge(setDF(d1), setDF(d2), by="A")) -ans2 <- setDF(merge(setDT(d1), setDT(d2), by="A")) -test(1543.1, ans1, ans2) -ans1 <- suppressWarnings(merge(setDF(d1), setDF(d2), all=TRUE, by="A")) -ans2 <- setDF(merge(setDT(d1), setDT(d2), all=TRUE, by="A")) -test(1542.2, ans1, ans2) -# test duplicate name cases -setnames(d2, c("A", "Y"), c("B", "A")) -ans1 <- suppressWarnings(merge(setDF(d2), setDF(d1), by.x="B", by.y="A")) -ans2 <- setDF(merge(setDT(d2), setDT(d1), by.x="B", by.y="A")) -test(1543.3, ans1, ans2) -ans1 <- suppressWarnings(merge(setDF(d2), setDF(d1), all=TRUE, by.x="B", by.y="A")) -ans2 <- setDF(merge(setDT(d2), setDT(d1), all=TRUE, by.x="B", by.y="A")) -test(1543.4, ans1, ans2) - -# test for sort=FALSE argument, #1282 -set.seed(1L) -d1 <- data.table(A = sample(letters[1:10]), X = 1:10, total = TRUE) -d2 <- data.table(A = sample(letters[5:14]), Y = 1:10, total = FALSE) -test(1543.7, merge(setDT(d1), setDT(d2), by="A", sort=FALSE), - setDT(merge(setDF(d1), setDF(d2), by="A", sort=FALSE))) - -# thinko in merge dupnames handling -dt1 = data.table(x=1:5, y1=2L, y2=3L) -dt2 = data.table(a=4:6, y2=TRUE, y1 = FALSE) -test(1543.6, setDF(merge(dt1, dt2, by.x="x", by.y="a")), - merge(as.data.frame(dt1), as.data.frame(dt2), by.x="x", by.y="a")) - -# fix #1290, restore colorder before setting names -set.seed(1) -dt1 <- data.table(sex = rep(1:2, 5), group = rep(letters[1:5], 2),V1 = sample(1:10)) -set.seed(2) -dt2 <- data.table(group = rep(letters[1:5], 2),sex = rep(1:2, 5),V2 = sample(1:10)) -test(1543.7, setDF(merge(dt1, dt2, by = c("sex", "group"))), - merge(as.data.frame(dt1), as.data.frame(dt2), by=c("sex", "group"))) -by.x = c("sex.1", "group.1") -by.y = c("sex.2", "group.2") -setnames(dt1, 1:2, by.x) -setnames(dt2, 1:2, rev(by.y)) -test(1543.8, setDF(merge(dt1, dt2, by.x=by.x, by.y=by.y)), - merge(as.data.frame(dt1), as.data.frame(dt2), by.x=by.x, by.y=by.y)) - -# fix for #1258 (bug on .shallow - retains keys when it shouldn't) -# nice catch and excellent report from @and3k -x1 <- data.table(a1 = c('a', 'b', 'c'), a2 = c(1L, 3L, 2L)) -y <- data.table(a2 = 1:3) -setkey(y, a2) -setkey(x1, a1, a2) -test(1544.1, setDF(merge(x1, y)), merge(as.data.frame(x1), as.data.frame(y))) -test(1544.2, setDF(merge(x1, y, by="a2")), merge(as.data.frame(x1), as.data.frame(y), by="a2")) -# also test shallow here so as to catch future regressions -x1 <- data.table(a1 = c('a', 'b', 'c'), a2 = c(1L, 3L, 2L), a3 = c(TRUE, FALSE, TRUE), key="a1,a2") -test(1545.1, key(.shallow(x1, cols="a2")), NULL) -test(1545.2, key(.shallow(x1, retain.key=FALSE)), NULL) -test(1545.2, key(.shallow(x1, cols = "a1", retain.key=FALSE)), NULL) -test(1545.3, key(.shallow(x1, retain.key=TRUE)), key(x1)) -test(1545.4, key(.shallow(x1, cols="a1", retain.key=TRUE)), "a1") -# tests for #2336. .shallow drops keys unnecessarily -test(1545.5, key(.shallow(x1, cols=c("a1", "a3"), retain.key=TRUE)), "a1") -test(1545.6, .shallow(x1, cols=c("a3", "a1"), retain.key=TRUE), .shallow(x1, cols=c("a3", "a1"), retain.key=TRUE)) -test(1545.7, key(.shallow(x1, cols=c("a1", "a2", "a3"), retain.key=TRUE)), c("a1", "a2")) -test(1545.8, key(.shallow(x1, cols=c("a2", "a3"), retain.key=TRUE)), NULL) -test(1545.9, key(.shallow(x1, cols=c("a2"), retain.key=TRUE)), NULL) -test(1545.10, key(.shallow(x1, cols=c("a3"), retain.key=TRUE)), NULL) -setkey(x1, NULL) -test(1545.11, key(.shallow(x1, retain.key=TRUE)), NULL) -test(1545.111, key(.shallow(x1, retain.key=FALSE)), NULL) -test(1545.12, key(.shallow(x1, cols=c("a1", "a2"), retain.key=TRUE)), NULL) -test(1545.121, key(.shallow(x1, cols=c("a1", "a2"), retain.key=FALSE)), NULL) -x1 <- x1[0] -test(1545.13, key(.shallow(x1, retain.key=TRUE)), NULL) -test(1545.131, key(.shallow(x1, retain.key=FALSE)), NULL) -test(1545.132, key(.shallow(x1, cols = c("a1"), retain.key=FALSE)), NULL) -test(1545.133, key(.shallow(x1, cols=c("a1", "a2"), retain.key=TRUE)), NULL) -setkey(x1, a1) -test(1545.134, key(.shallow(x1, retain.key=FALSE)), NULL) -test(1545.135, key(.shallow(x1, cols = "a2", retain.key=FALSE)), NULL) -test(1545.136, key(.shallow(x1, retain.key=TRUE)), "a1") -test(1545.137, key(.shallow(x1, cols=c("a1", "a2"), retain.key=TRUE)), "a1") -test(1545.138, key(.shallow(x1, cols=c("a3"), retain.key=TRUE)), NULL) - -# tests for #2336. .shallow now retains indices as well -x1 <- data.table(a1 = c('a', 'a', 'a', 'a', 'b', 'c'), - a2 = c(1L, 1L, 1L, 2L, 2L, 2L), - a3 = c(FALSE, TRUE, FALSE, FALSE, FALSE, TRUE)) -setindex(x1, a1, a2, a3) -setindex(x1, a1, a3) -setindex(x1, a1, a2) ## index with length 0 -test(1545.15, indices(.shallow(x1, retain.key=FALSE)), NULL) -test(1545.16, indices(.shallow(x1, cols = "a2", retain.key=FALSE)), NULL) -test(1545.17, indices(.shallow(x1, retain.key=TRUE)), indices(x1)) -test(1545.18, forderv(.shallow(x1, retain.key=TRUE)[attr(attr(.shallow(x1, retain.key=TRUE), "index"), "__a1__a2__a3")], c("a1", "a2", "a3")), integer(0)) -test(1545.19, forderv(.shallow(x1, retain.key=TRUE)[attr(attr(.shallow(x1, retain.key=TRUE), "index"), "__a1__a3")], c("a1", "a3")), integer(0)) -test(1545.20, forderv(.shallow(x1, retain.key=TRUE), c("a1", "a2")), integer(0)) -test(1545.21, indices(.shallow(x1, cols = "a1", retain.key=TRUE)), c("a1")) -test(1545.22, forderv(.shallow(x1, cols = "a1", retain.key=TRUE), c("a1")), integer(0)) -test(1545.23, attributes(attr(.shallow(x1, cols = c("a1", "a2"), retain.key = TRUE), "index", exact = TRUE)), attributes(attr(.shallow(x1, cols = c("a2", "a1"), retain.key = TRUE), "index", exact = TRUE))) -test(1545.24, indices(.shallow(x1, cols = c("a1", "a2"), retain.key=TRUE)), c("a1__a2")) -test(1545.25, forderv(.shallow(x1, cols = c("a1", "a2"), retain.key=TRUE), c("a1", "a2")), integer(0)) -test(1545.26, indices(.shallow(x1, cols = c("a1", "a3"), retain.key=TRUE)), c("a1__a3", "a1")) -test(1545.27, forderv(.shallow(x1, cols = c("a1", "a3"), retain.key=TRUE), c("a1")), integer(0)) -test(1545.28, forderv(.shallow(x1, cols = c("a1", "a3"), retain.key=TRUE)[attr(attr(.shallow(x1, cols = c("a1", "a3"), retain.key=TRUE), "index"), "__a1__a3")], c("a1", "a3")), integer(0)) -test(1545.29, indices(.shallow(x1, cols = c("a2", "a3"), retain.key=TRUE)), NULL) -test(1545.31, indices(.shallow(x1, cols = c("a3"), retain.key=TRUE)), NULL) -test(1545.32, .shallow(x1, cols = c("a1", "a2", "a3"), retain.key=TRUE), .shallow(x1, retain.key=TRUE)) - - -# test for #1234 -df1 = df2 = data.frame(cats = rep(c('', ' ', 'meow'), 5), stringsAsFactors = TRUE) -df2[grep("^[ ]*$", df2$cats), "cats"] = NA_integer_ -test(1546, set(df1, grep("^[ ]*$", df1$cats), 1L, NA_integer_), df2) - -# Add test for getdots() function (although it doesn't seem to be used anywhere) -foo <- function(x, y, ...) { getdots() } -test(1547, foo(1L, 5L, a=2L, "c"), c("2", "c")) - -# Fix for encoding issues in windows, #563 -f = testDir("issue_563_fread.txt") -ans1 <- fread(f, sep=",", header=TRUE) -ans2 <- fread(f, sep=",", header=TRUE, encoding="UTF-8") -test(1548.1, unique(unlist(lapply(ans1, Encoding))), "unknown") -test(1548.2, unique(unlist(lapply(ans2, Encoding))), "UTF-8") - -# #1167 print.data.table row id in non-scientific notation -DT <- data.table(a = rep(1:5,3*1e5), b = rep(letters[1:3],5*1e5)) -test(1549, capture.output(print(DT)), c(" a b", " 1: 1 a", " 2: 2 b", " 3: 3 c", " 4: 4 a", " 5: 5 b", " --- ", "1499996: 1 b", "1499997: 2 c", "1499998: 3 a", "1499999: 4 b", "1500000: 5 c")) -rm(DT) - -# PR by @dselivanov -# fixes #504 - handle nastring while reading (without coercion to character) -# Note: this doesn't address cases like na.strings="-999" yet. See https://github.com/Rdatatable/data.table/pull/1236 for those examples. -K = 10L -nastrings = c('null', 'NULL', 'na', '_NA', 'NA', 'nan', 'Nan', 'NAN', 'NaN') -DT = data.table(int = 1:K, - char = sample(letters, size = K, replace = TRUE), - float = 1:K + 0.1, - bool = sample( c(TRUE, FALSE), K, replace = TRUE)) - -DT_NA = DT -for (j in seq_len( ncol(DT) )) { - set(x = DT_NA, i = j, j = j, value = NA) -} - -for(k in seq_along(nastrings)) { - dt0 = copy(DT) - for (j in seq_len( ncol(DT) )) { - set(x = dt0, i = NULL, j = j, value = as.character(dt0[[j]])) - set(x = dt0, i = j, j = j, value = nastrings[[k]]) - } - str = do.call(paste, c(dt0, collapse="\n", sep=",")) - str = paste(paste(names(dt0), collapse=","), str, sep="\n") - DT_fread = fread(str, na.strings = nastrings, verbose = FALSE) - test(1550 + k * 0.1, DT_fread, DT_NA) -} - -# FR #568 -str = "a,b\n1.5,\"at the 5\" end of the gene.\"" -test(1551.1, fread(str), data.table(a = 1.5, b = "at the 5\" end of the gene.")) -#1256 -str = "x,y\nx1,\"oops\" y1\n" -test(1551.2, fread(str), data.table(x = "x1", y = "\"oops\" y1")) -str = "x,y\nx1,\"oops\" y1" -test(1551.3, fread(str), data.table(x = "x1", y = "\"oops\" y1")) -#1077 -str = '2,3\n""foo,bar' -test(1551.4, fread(str), data.table(V1=c("2","\"\"foo"), V2=c("3","bar"))) -#1079 -str = 'L1\tsome\tunquoted\tstuff\nL2\tsome\t"half" quoted\tstuff\nL3\tthis\t"should work"\tok though' -test(1551.5, fread(str), data.table(L1 = c("L2", "L3"), some = c("some", "this"), unquoted = c("\"half\" quoted", "should work"), stuff = c("stuff", "ok though"))) -#1095 -rhs = read.table(testDir("issue_1095_fread.txt"), sep=",", comment.char="", stringsAsFactors=FALSE, quote="", strip.white=TRUE) -test(1551.6, fread(testDir("issue_1095_fread.txt"), logical01=FALSE), setDT(rhs)) - -# FR #1314 rest of na.strings issue -str = "a,b,c,d\n#N/A,+1,5.5,FALSE\n#N/A,5,6.6,TRUE\n#N/A,+1,#N/A,-999\n#N/A,#N/A,-999,FALSE\n#N/A,1,NA,TRUE" -read_table = function(str, ...) { - setDT(read.table(text=str, stringsAsFactors=FALSE, comment.char="", sep=",", header=TRUE, ...))[] -} -test(1552.1, fread(str, na.strings="#N/A"), read_table(str, na.strings="#N/A")) -test(1552.2, fread(str, na.strings=c("#N/A", "-999")), read_table(str, na.strings=c("#N/A", "-999"))) -test(1552.3, fread(str, na.strings=c("#N/A", "-999", "+1")), read_table(str, na.strings=c("#N/A", "-999", "+1"))) -test(1552.4, fread(str, na.strings=c("#N/A", "-999", "+1", "1")), - error="NAstring <<1>> is recognized as type boolean.*not permitted") -test(1552.5, fread(str, na.strings=c("#N/A", "-999", "FALSE")), error="NAstring <>.*boolean.*not permitted") -test(1552.6, fread("A\n1.0\n2\n-", na.strings=c("-")), data.table(A=c(1.0, 2.0, NA))) - -# FR #1177: 'quote' option of 'print.data.table' -DT1 <- data.table(s1=paste(" ",LETTERS[1:5],sep=""),s2=LETTERS[1:5]) -ans1 <- c(" \"s1\" \"s2\"", "1: \" A\" \"A\"", - "2: \" B\" \"B\"", "3: \" C\" \"C\"", - "4: \" D\" \"D\"", "5: \" E\" \"E\"") -ans2 <- c(" s1 s2","1: A A","2: B B", - "3: C C","4: D D","5: E E") -test(1553.1, capture.output(print(DT1, quote = TRUE)), ans1) -test(1553.2, capture.output(print(DT1)), ans2) - -# #826 - subset DT on single integer vector stored as matrix the same way as data.frame -dt <- data.table(a=letters[1:10]) -idx <- c(2:4,7L,9:10) -dim(idx) <- c(6L, 1L) -dimnames(idx) <- list(NULL, "Resample1") # as in caret::createDataPartition -test(1554.1, dt[idx], data.table(a=letters[idx])) -test(1554.2, dt[-idx], data.table(a=letters[(1:10)[-idx]])) -test(1554.3, dt[!idx], data.table(a=letters[(1:10)[-idx]])) -test(1554.4, idx, structure(c(2L, 3L, 4L, 7L, 9L, 10L), .Dim = c(6L, 1L), .Dimnames = list(NULL, "Resample1"))) - -# strip.white and other enhancements to 'fread()' -# bug #1113 -ans1 <- fread(testDir("issue_1113_fread.txt")) -# some inconsistency by R version on whether the last column -# () gets read as numeric (which it is) or as factor, -# see discussion on issue #2484; not clear exactly what changed -# in R to fix this (or when), so just test is.character -# and force numeric instead of testing R version -ans2 <- read.table(testDir("issue_1113_fread.txt"), header=TRUE, stringsAsFactors = FALSE) -if (is.character(ans2$MCMCOBJ)) { - ans2$MCMCOBJ = as.numeric(ans2$MCMCOBJ) -} -setDT(ans2) -setnames(ans2, names(ans1)) -test(1555.1, ans1, ans2) - -# bug #1035, take care of spaces automatically. Note that the columns are also read in proper types. Also with quotes when sep is not space. -str1=" ITERATION THETA1 THETA2 - 2 3.95527E+01 2.10651E+01" -str2=" ITERATION, THETA1, THETA2 - 2, 3.95527E+01, 2.10651E+01" -str3=" ITERATION , THETA1 , THETA2 - 2 , 3.95527E+01 , 2.10651E+01" -str4=" ITERATION , THETA1 , \"THETA2\" - 2 , 3.95527E+01 , 2.10651E+01" -str5=" ITERATION , THETA1 , THETA2 - bla , 3.95527E+01 , 2.10651E+01" -test(1555.2, fread(str1), data.table(ITERATION=2L, THETA1=39.5527, THETA2=21.0651)) -test(1555.3, fread(str2), data.table(ITERATION=2L, THETA1=39.5527, THETA2=21.0651)) -test(1555.4, fread(str3), data.table(ITERATION=2L, THETA1=39.5527, THETA2=21.0651)) -test(1555.5, fread(str4), data.table(ITERATION=2L, THETA1=39.5527, THETA2=21.0651)) -test(1555.6, fread(str5), data.table(ITERATION="bla", THETA1=39.5527, THETA2=21.0651)) -# without strip.white -# when sep==' ' as in str1, header col spaces should still be stripped even when strip.white=FALSE -test(1555.7, fread(str1, strip.white=FALSE), data.table(ITERATION=2L, THETA1=39.5527, THETA2=21.0651)) -test(1555.8, names(fread(str2, strip.white=FALSE)), c(" ITERATION"," THETA1"," THETA2")) -test(1555.9, names(fread(str3, strip.white=FALSE)), c(" ITERATION "," THETA1 "," THETA2")) -test(1555.11, names(fread(str4, strip.white=FALSE)), c(" ITERATION "," THETA1 "," \"THETA2\"")) - -# bug #1035, reply to the post from another user -str1=" 22 4 6 4\n 34 22 34 5\n 6 2 1 4\n" -str2="22 4 6 4\n34 22 34 5\n6 2 1 4\n" -test(1555.12, fread(str1), fread(str2)) - -# bug #785 -rhs <- setDT(read.table(testDir("issue_785_fread.txt"), header=TRUE, stringsAsFactors=FALSE, sep="\t", strip.white=TRUE)) -test(1555.13, fread(testDir("issue_785_fread.txt"), logical01=FALSE), rhs) - -# bug #529, http://stackoverflow.com/questions/22229109/r-data-table-fread-command-how-to-read-large-files-with-irregular-separators -str1=" YYYY MM DD HH mm 19490 40790 - 1991 10 1 1 0 1.046465E+00 1.568405E+00" -str2="YYYY MM DD HH mm 19490 40790 -1991 10 1 1 0 1.046465E+00 1.568405E+00" -test(1555.14, fread(str1), fread(str2)) - -# fix for #1330 -test(1556.1, fread(testDir("issue_1330_fread.txt"), nrow=2), ans<-data.table(a=1:2, b=1:2)) -test(1556.2, fread(testDir("issue_1330_fread.txt"), nrow=3), ans, warning=w<-"Stopped early on line 4. Expected 2.*found 0.*First discarded non-empty line: <<3.*3>>") -test(1556.3, fread(testDir("issue_1330_fread.txt"), nrow=4), ans, warning=w) - -# FR #768 -str="1,2\n3,4\n" -test(1557.1, names(fread(str)), c("V1", "V2")) # autonamed -test(1557.2, names(fread(str, col.names=letters[1:2])), letters[1:2]) -test(1557.3, names(fread(str, col.names=letters[1])), error="Can't assign 1 names to") -test(1557.4, names(fread(str, col.names=letters[1:3])), error="Can't assign 3 names to") -test(1557.5, names(fread(str, col.names=1:2)), error="Passed a vector of type") - -# Fix for #773 -f = testDir("issue_773_fread.txt") -ans = data.table(AAA=INT(c(4,7,rep(1,17),31,21)), - BBB=INT(c(5,8,rep(2,17),32,22)), - CCC=INT(c(6,9,rep(3,17),33,23))) -test(1558.1, fread(f), ans, warning=w<-"Stopped early on line 23. Expected 3 fields but found 2[.].*First discarded non-empty line: <>") -test(1558.2, fread(f, nrow=21L), ans) -test(1558.3, fread(f, nrow=21L, fill=TRUE), ans) -test(1558.4, fread(f, nrow=22L), ans, warning=w) -test(1558.5, fread(f, nrow=22L, fill=TRUE), rbind(ans, list("ZZZ","YYY",NA))) - -# FR # 1338 -- check.names argument of setDT -ans=data.table(X=1:3,"X.1"=1:3) -dt1<-data.table(X=1:3,X=1:3) -df1<-data.frame(X=1:3,X=1:3,check.names=FALSE) -ls1<-list("X"=1:3,"X"=1:3) -test(1559.1, setDT(dt1, check.names=TRUE), ans) -test(1559.2, setDT(df1, check.names=TRUE), ans) -test(1559.3, setDT(ls1, check.names=TRUE), ans) - -# Fix #1140 -test(1560.1, data.table(x=letters[1:5])[, 0, with=FALSE], null.data.table()) -test(1560.2, data.table(x=letters[1:5])[, c(0,FALSE), with=FALSE], null.data.table()) - -# Fix for #1298 -d = data.table(a = 1) -q = quote(.(a)) -test(1561, d[, 1, by = eval(q)], d[, 1, by = .(a)]) - -# Fix for #1315 -d = as.IDate(seq(as.Date("2015-01-01"), as.Date("2015-01-15"), by='1 day')) -test(1562.1, as.list(d), lapply(as.list(as.Date(d)), as.IDate)) -test(1562.2, sapply(d, identity), as.integer(sapply(as.Date(d), identity))) - -# Fix for #1216, .SDcols and with=FALSE should evaluate within frame of 'x' only when it's of the form a:b -dt = data.table(index1=1:10, index2=10:1, index3=1, s=4, i=24) -i = 2L -test(1557.1, dt[, paste0("index", 1:i), with=FALSE], dt[, index1:index2, with=FALSE]) -test(1557.2, dt[, paste0("index", 1:i), with=FALSE], dt[, 1:2, with=FALSE]) -test(1557.3, dt[, 5:4, with=FALSE], dt[, i:s, with=FALSE]) -test(1557.4, dt[, .SD, .SDcols=paste0("index", 1:i)], dt[, .SD, .SDcols=index1:index2]) - -# fix for #1354 -test(1558, as.ITime(NA), setattr(NA_integer_, 'class', 'ITime')) - -# fix for #1352 -dt1 = data.table(a=1:5, b=6:10, c=11:15) -dt2 = data.table(a=3:6, b=8:11, d=1L) -by_cols = c(x="a", y="b") -test(1560, merge(dt1,dt2, by=by_cols, sort=FALSE), dt1[dt2, nomatch=0L, on=unname(by_cols)]) - -# FR #1353 -DT = data.table(x=c(20,10,10,30,30,20), y=c("a", "a", "a", "b", "b", "b"), z=1:6) - -test(1561.1, rowid(DT$x), as.integer(c(1,1,2,1,2,2))) -test(1561.2, rowidv(DT, cols="x"), as.integer(c(1,1,2,1,2,2))) -test(1561.3, rowid(DT$x, prefix="group"), paste("group", as.integer(c(1,1,2,1,2,2)), sep="")) -test(1561.4, rowid(DT$x, DT$y), as.integer(c(1,1,2,1,2,1))) -test(1561.5, rowidv(DT, cols=c("x","y")), as.integer(c(1,1,2,1,2,1))) -# convenient usage with dcast -test(1561.6, dcast(DT, x ~ rowid(x, prefix="group"), value.var="z"), data.table(x=c(10,20,30), group1=c(2L,1L,4L), group2=c(3L,6L,5L), key="x")) - -# Fix for #1346 -DT = data.table(id=1:3, g1=4:6, g2=7:9) -test(1562, melt(DT, measure=patterns("^g[12]"), variable.factor=FALSE), data.table(id=1:3, variable=rep(c("g1","g2"),each=3L), value=4:9)) - -# tet 1563 added for melt above, fix for #1359. - -# fix for #1341 -dt <- data.table(a = 1:10) -test(1564.1, truelength(dt[, .SD]), 1025L) -test(1564.2, truelength(dt[a==5, .SD]), 1025L) -test(1564.3, dt[a==5, .SD][, b := 1L], data.table(a=5L, b=1L)) - -# Fix for #1251, DT[, .N, by=a] and DT[, .(.N), by=a] uses GForce now -dt = data.table(a=sample(3,20,TRUE), b=1:10) -old = options(datatable.optimize = Inf) -ans1 = dt[, .N, by=a] -ans2 = capture.output(dt[, .N, by=a, verbose=TRUE]) -test(1565.1, length(grep("GForce optimized j to", ans2))>0L, TRUE) # make sure GForce optimisation works -options(datatable.optimize = 1L) # make sure result is right -test(1565.2, ans1, dt[, .N, by=a]) -options(old) - -# Fix for #1212 -set.seed(123) -dt <- data.table(a=c("abc", "def", "ghi"), b=runif(3))[, c:=list(list(data.table(d=runif(1), e=runif(1))))] -test(1566.1, dt[, c], dt[, get("c")]) -test(1566.2, dt[, .(c=c)], dt[, .(c=get("c"))]) -test(1566.3, address(dt$c) == address(dt[, get("c")]), FALSE) - -# Fix for #1207 -d1 <- data.table(a = character(), b = list()) -test(1567.1, d1[, b, by=a], d1) -test(1567.2, d1[, b, keyby=a], data.table(d1, key="a")) - -# Fix for #1334 -dt = data.table(x=ordered(rep(1:3,each=5)),y=ordered(rep(c("B","A","C"),5),levels=c("B","A","C")),z=1:15) -test(1568, dt[, sum(z), keyby=.(I(x), I(y))], data.table(I=I(ordered(rep(1:3,each=3))), I.1=I(ordered(rep(c("B","A","C"),3),levels=c("B","A","C"))),V1=c(5L, 7L, 3L, 17L, 8L, 15L, 13L, 25L, 27L), key=c("I", "I.1"))) - -# Test 1569 is written under melt above. - -# fix for #1378, merge resets class -X = data.table(a=1:3, b=4:6) -Y = data.table(a=1L, c=5L) -setattr(Y, 'class', c("custom","data.table","data.frame")) -test(1570.1, class(merge(X, Y, all=TRUE, by="a")), class(X)) -test(1570.2, class(merge(Y, X, all=TRUE, by="a")), class(X)) - -# #1379, tstrsplit gains names argument -X = data.table(a=c("ABC", "DEFG")) -test(1571.1, names(tstrsplit(X$a, "", fixed=TRUE, names=TRUE)), paste("V", 1:4, sep="")) -test(1571.2, names(tstrsplit(X$a, "", fixed=TRUE, names=letters[1:3])), error="is not equal to ") -test(1571.3, names(tstrsplit(X$a, "", fixed=TRUE, names=letters[1:4])), letters[1:4]) -# tstrsplit also gains 'keep' argument -test(1571.4, tstrsplit(X$a, "", fixed=TRUE, keep=c(2,4)), list(c("B", "E"), c(NA, "G"))) -test(1571.5, tstrsplit(X$a, "", fixed=TRUE, keep=c(2,7)), error="should contain integer") -test(1571.5, tstrsplit(X$a, "", fixed=TRUE, keep=c(2,4), names=letters[1:5]), error="is not equal to") - -# fix for #1367, quote="" argument in use. Using embedded quotes in the example below reads the -# first two columns as one. I couldn't find a way to avoid introducing quote argument. -test(1572, fread('"abcd efgh." ijkl.\tmnop "qrst uvwx."\t45\n', quote=""), - setDT(read.table(text='"abcd efgh." ijkl.\tmnop "qrst uvwx."\t45\n', sep="\t", stringsAsFactors=FALSE, quote=""))) - -# Fix for #1384, fread with empty new line, initial checks failed due to extra spaces. -test(1573, fread('a,b - 4,2 - '), data.table(a=4L, b=2L)) - -# Fix for #1375 -X = data.table(a=1:3,b=4:6,c=c("foo","bar","baz")) -test(1574.1, X[.(5), on="b"], X[2]) - -X = data.table(A=1:3,b=4:6,c=c("foo","bar","baz")) -Y = data.table(A=2:4, B=5:7) -test(1574.2, X[Y, on=c("A",b="B")], X[Y, on=c(A="A", b="B")]) -test(1574.3, X[Y, on=c(b="B", "A")], X[Y, on=c(b="B", A="A")]) -test(1574.4, X["bar", on="c"], X[2L]) # missed previously - -# fix for #1376 -X = data.table(a=1:3,b=4:6,c=c("foo","bar","baz")) -Y = data.table(A=2:4, B=5:7) -test(1575.1, X[Y, on=c(A="a")], error="not found in x") -test(1575.2, X[Y, on=c(a="a")], error="not found in i") - -# work around for issue introduced in v1.9.4, #1396 -X = data.table(x=5:1, y=6:10) -setattr(X, 'index', integer(0)) -setattr(attr(X, 'index'), 'x', 5:1) # auto indexed attribute as created from v1.9.4 -test(1576, X[, z := 1:5, verbose=TRUE], - output = "Dropping index 'x' as.*beginning of its name.*very likely created by v1.9.4 of data.table") - -# fix for #1408 -X = fread("a|b|c|d - this|is|row|1 - this|is|row|2 - this|NA|NA|3 - this|is|row|4", stringsAsFactors = TRUE) -test(1577.1, is.na(X[3, b]), TRUE) -test(1577.2, levels(X$b), "is") -X = fread("a|b|c|d - this|NA|row|1 - this|NA|row|2 - this|NA|NA|3 - this|NA|row|4", colClasses="character", stringsAsFactors = TRUE) -test(1577.3, levels(X$b), character(0)) - -# FR #530, skip blank lines -input = "Header not 2 columns\n\n1,3\n2,4" -test(1578.0, fread(input), data.table(V1=1:2, V2=3:4)) -input = "a,b\n\n1,3\n2,4" -test(1578.1, fread(input), data.table(a=logical(), b=logical()), warning="Stopped early on line 2[.].*First discarded.*<<1,3>>") -test(1578.2, fread(input, blank.lines.skip=TRUE), data.table( a=1:2, b=3:4)) -input = "a,b\n\n\n1,3\n2,4" -test(1578.3, fread(input, blank.lines.skip=TRUE), data.table( a=1:2, b=3:4)) -input = "a,b\n\n\n1,3\n\n2,4\n\n" -test(1578.4, fread(input, blank.lines.skip=TRUE), data.table( a=1:2, b=3:4)) - -f = testDir("530_fread.txt") -test(1578.5, fread(f, skip=47L), data.table(a=logical(), b=logical()), warning="Stopped early.*discarded.*<<1,3>>") -test(1578.6, fread(f, skip=49L), data.table(V1=1:2, V2=3:4)) -test(1578.7, fread(f, skip=47L, blank.lines.skip=TRUE), data.table(a=1:2, b=3:4)) -test(1578.8, fread(f, skip=48L), data.table(V1=1:2, V2=3:4)) # start on blank line 49 and skip="auto" to first data row on line 50 - -# gforce optimisations -dt = data.table(x = sample(letters, 300, TRUE), - i1 = sample(-10:10, 300, TRUE), - i2 = sample(c(-10:10, NA), 300, TRUE), - d1 = as.numeric(sample(-10:10, 300, TRUE)), - d2 = as.numeric(sample(c(NA, NaN, -10:10), 300, TRUE))) -if (test_bit64) { - dt[, `:=`(d3 = as.integer64(sample(-10:10, 300, TRUE)))] - dt[, `:=`(d4 = as.integer64(sample(c(-10:10,NA), 300, TRUE)))] -} - -# make sure gforce is on -optim = getOption("datatable.optimize") -options(datatable.optimize=2L) - -# testing gforce::gmedian -test(1579.1, dt[, lapply(.SD, median), by=x], - dt[, lapply(.SD, function(x) median(as.numeric(x))), by=x]) -test(1579.2, dt[, lapply(.SD, median, na.rm=TRUE), by=x], - dt[, lapply(.SD, function(x) median(as.numeric(x), na.rm=TRUE)), by=x]) -test(1579.3, dt[, lapply(.SD, median), keyby=x], - dt[, lapply(.SD, function(x) median(as.numeric(x))), keyby=x]) -test(1579.4, dt[, lapply(.SD, median, na.rm=TRUE), keyby=x], - dt[, lapply(.SD, function(x) median(as.numeric(x), na.rm=TRUE)), keyby=x]) -ans = capture.output(dt[, lapply(.SD, median), by=x, verbose=TRUE]) -test(1579.5, any(grepl("GForce optimized", ans)), TRUE) - -# testing gforce::ghead and gforce::gtail -# head(.SD, 1) and tail(.SD, 1) optimisation -test(1579.6, dt[, head(.SD,1), by=x], dt[, utils::head(.SD,1), by=x]) -test(1579.7, dt[, head(.SD,1), by=x], dt[, utils::head(.SD,1), by=x]) -test(1579.8, dt[, head(.SD,1), keyby=x], dt[, utils::head(.SD,1), keyby=x]) -test(1579.9, dt[, head(.SD,1), keyby=x], dt[, utils::head(.SD,1), keyby=x]) -test(1579.10, dt[, head(.SD,1L), by=x], dt[, utils::head(.SD,1L), by=x]) -test(1579.11, dt[, head(.SD,1L), by=x], dt[, utils::head(.SD,1L), by=x]) -test(1579.12, dt[, head(.SD,1L), keyby=x], dt[, utils::head(.SD,1L), keyby=x]) -test(1579.13, dt[, head(.SD,1L), keyby=x], dt[, utils::head(.SD,1L), keyby=x]) - -test(1579.6, dt[, tail(.SD,1), by=x], dt[, utils::tail(.SD,1), by=x]) -test(1579.7, dt[, tail(.SD,1), by=x], dt[, utils::tail(.SD,1), by=x]) -test(1579.8, dt[, tail(.SD,1), keyby=x], dt[, utils::tail(.SD,1), keyby=x]) -test(1579.9, dt[, tail(.SD,1), keyby=x], dt[, utils::tail(.SD,1), keyby=x]) -test(1579.10, dt[, tail(.SD,1L), by=x], dt[, utils::tail(.SD,1L), by=x]) -test(1579.11, dt[, tail(.SD,1L), by=x], dt[, utils::tail(.SD,1L), by=x]) -test(1579.12, dt[, tail(.SD,1L), keyby=x], dt[, utils::tail(.SD,1L), keyby=x]) -test(1579.13, dt[, tail(.SD,1L), keyby=x], dt[, utils::tail(.SD,1L), keyby=x]) -# GForce _doesn't_ work when n > 1 -test(1579.14, dt[ , tail(.SD, 2), by = x, verbose = TRUE], output = 'GForce FALSE') - -mysub <- function(x, n) x[n] -test(1579.15, dt[, .SD[2], by=x], dt[, mysub(.SD,2), by=x]) -test(1579.16, dt[, .SD[2], by=x], dt[, mysub(.SD,2), by=x]) -test(1579.17, dt[, .SD[2], keyby=x], dt[, mysub(.SD,2), keyby=x]) -test(1579.18, dt[, .SD[2], keyby=x], dt[, mysub(.SD,2), keyby=x]) -test(1579.19, dt[, .SD[2L], by=x], dt[, mysub(.SD,2L), by=x]) -test(1579.20, dt[, .SD[2L], by=x], dt[, mysub(.SD,2L), by=x]) -test(1579.21, dt[, .SD[2L], keyby=x], dt[, mysub(.SD,2L), keyby=x]) -test(1579.22, dt[, .SD[2L], keyby=x], dt[, mysub(.SD,2L), keyby=x]) - -ans = capture.output(dt[, .SD[2], by=x, verbose=TRUE]) -test(1579.23, any(grepl("GForce optimized", ans)), TRUE) - -options(datatable.optimize=optim) - -# test for #1419, rleid doesn't remove names attribute -x = c("a"=TRUE, "b"=FALSE) -nx = copy(names(x)) -r = rleid(x) -test(1580, nx, names(x)) - -# FR #971, partly addressed (only subsets in 'i') -# make sure GForce kicks in and the results are identical -dt = dt[, .(x, d1, d2)] -old = options(datatable.optimize=1L) - -test(1581.1, ans1 <- dt[x %in% letters[15:20], - c(.N, lapply(.SD, sum, na.rm=TRUE), - lapply(.SD, min, na.rm=TRUE), - lapply(.SD, max, na.rm=TRUE), - lapply(.SD, mean, na.rm=TRUE), - lapply(.SD, median, na.rm=TRUE) - ), by=x, verbose=TRUE], - output = "(GForce FALSE)") -options(datatable.optimize=2L) -test(1581.2, ans2 <- dt[x %in% letters[15:20], - c(.N, lapply(.SD, sum, na.rm=TRUE), - lapply(.SD, min, na.rm=TRUE), - lapply(.SD, max, na.rm=TRUE), - lapply(.SD, mean, na.rm=TRUE), - lapply(.SD, median, na.rm=TRUE) - ), by=x, verbose=TRUE], - output = "GForce optimized j") -test(1581.3, ans1, ans2) - -# subsets in 'i' for head and tail -options(datatable.optimize=1L) -test(1581.4, ans1 <- dt[x %in% letters[15:20], head(.SD,1), by=x, verbose=TRUE], - output = "(GForce FALSE)") -options(datatable.optimize=2L) -test(1581.5, ans2 <- dt[x %in% letters[15:20], head(.SD,1), by=x, verbose=TRUE], - output = "GForce optimized j") -test(1581.6, ans1, ans2) - -options(datatable.optimize=1L) -test(1581.7, ans1 <- dt[x %in% letters[15:20], tail(.SD,1), by=x, verbose=TRUE], - output = "(GForce FALSE)") -options(datatable.optimize=2L) -test(1581.8, ans2 <- dt[x %in% letters[15:20], tail(.SD,1), by=x, verbose=TRUE], - output = "GForce optimized j") -test(1581.9, ans1, ans2) - -options(datatable.optimize=1L) -test(1581.10, ans1 <- dt[x %in% letters[15:20], .SD[2], by=x, verbose=TRUE], - output = "(GForce FALSE)") -options(datatable.optimize=2L) -test(1581.11, ans2 <- dt[x %in% letters[15:20], .SD[2], by=x, verbose=TRUE], - output = "GForce optimized j") -test(1581.12, ans1, ans2) - -options(old) - -# handle NULL value correctly #1429 -test(1582, uniqueN(NULL), 0L) - -# bug fix #1461 -dt = data.table(x=c(1,1,1,2,2,2,3,3,3,4,4,4,5), y=c(NaN,1,2, 2,NaN,1, NA,NaN,2, NaN,NA,NaN, NaN)) -optim = getOption("datatable.optimize") -# make sure gforce is on -options(datatable.optimize=Inf) -ans1 = suppressWarnings(dt[, base::min(y, na.rm=TRUE), by=x]) -ans2 = suppressWarnings(dt[, base::max(y, na.rm=TRUE), by=x]) -test(1583.1, dt[, min(y, na.rm=TRUE), by=x], ans1, warning="No non-missing values found") -test(1583.2, dt[, max(y, na.rm=TRUE), by=x], ans2, warning="No non-missing values found") -ans3 = suppressWarnings(dt[, base::min(y), by=x]) -ans4 = suppressWarnings(dt[, base::max(y), by=x]) -test(1583.3, dt[, min(y), by=x], ans3) -test(1583.4, dt[, max(y), by=x], ans4) -# restore optimisation -options(datatable.optimize=optim) - -# Fixed a minor bug in fread when blank.lines.skip=TRUE -f1 <- function(x, f=TRUE, b=FALSE) fread(x, fill=f, blank.lines.skip=b, data.table=FALSE, logical01=FALSE) -f2 <- function(x, f=TRUE, b=FALSE) read.table(x, fill=f, blank.lines.skip=b, sep=",", header=TRUE, stringsAsFactors=FALSE) -test(1584.1, f1(testDir("fread_blank.txt"), f=FALSE, b=TRUE), f2(testDir("fread_blank.txt"), f=FALSE, b=TRUE)) -test(1584.2, f1(testDir("fread_blank2.txt"), f=FALSE, b=TRUE), f2(testDir("fread_blank2.txt"), f=FALSE, b=TRUE)) -test(1584.3, f1(testDir("fread_blank3.txt"), f=FALSE, b=TRUE), f2(testDir("fread_blank3.txt"), f=FALSE, b=TRUE)) - -# fread fill=TRUE, #536. Also takes care of #1124. -# the appended [-28,], [-(7:9),] and [-29,] remove the final all-NA rows due to repeated eol ending the file -test(1585.1, f1(testDir("536_fread_fill_1.txt")), f2(testDir("536_fread_fill_1.txt"))[-28,]) -test(1585.2, f1(testDir("536_fread_fill_1.txt"), b=TRUE), f2(testDir("536_fread_fill_1.txt"), b=TRUE)) - -test(1585.3, f1(testDir("536_fread_fill_2.txt")), f2(testDir("536_fread_fill_2.txt"))) -test(1585.4, f1(testDir("536_fread_fill_2.txt"), b=TRUE), f2(testDir("536_fread_fill_2.txt"), b=TRUE)) - -test(1585.5, f1(testDir("536_fread_fill_3_extreme.txt")), f2(testDir("536_fread_fill_3_extreme.txt"))[-9,]) -test(1585.6, f1(testDir("536_fread_fill_3_extreme.txt"), b=TRUE), f2(testDir("536_fread_fill_3_extreme.txt"), b=TRUE)) -# no warning about bumping type. when fill=TRUE, column type detection starts at first non-empty line (which makes sense). -test(1585.7, f1(testDir("536_fread_fill_4.txt")), f2(testDir("536_fread_fill_4.txt"))[-29,]) -test(1585.8, f1(testDir("536_fread_fill_4.txt"), b=TRUE), f2(testDir("536_fread_fill_4.txt"), b=TRUE)) - -# TODO: add a test when fill=FALSE, but blank.lines.skip=TRUE, when the same effect should happen -# TODO: fix and add test for cases like this: -# a,b,c -# 1,2,3 -# 4,5,6 -# 7,8,9,6 # extra column, but we've only detected 3 cols -# 1,2,3 -# ... - -# fix for #721 -text="x,y\n1,a\n2,b\n" -test(1586.1, fread(text, colClasses=c("integer", "factor")), data.table(x=1:2, y=factor(letters[1:2]))) -test(1586.2, fread(text, colClasses=c(x="factor")), data.table(x=factor(1:2), y=letters[1:2])) - -# FR #590 -text="x,y\n2,a\n1,q\n3,c\n" -test(1587, fread(text, key="y"), setDT(fread(text), key="y")) - -# fix for #1361 -dt = data.table(i=1:10, f=as.factor(1:10)) -test(1588.1, dt[f %in% 3:4], dt[3:4]) -test(1588.2, dt[f == 3], dt[3]) - -# encoding issue in forder -# test escaped when memory statistics are collected due to #2746 -if (!memtest) { - x <- "fa\xE7ile" - Encoding(x) - Encoding(x) <- "latin1" - xx <- iconv(x, "latin1", "UTF-8") - y = sample(c(x,xx), 10, TRUE) - oy = if (length(oy <- forderv(y))) oy else seq_along(y) - test(1590.4, oy, order(y)) - Encoding(xx) = "unknown" - y = sample(c(x,xx), 10, TRUE) - oy = if (length(oy <- forderv(y))) oy else seq_along(y) - test(1590.5, oy, order(y)) -} - -# #1432 test -list_1 = list(a = c(44,47), dens = c(2331,1644)) -list_2 = list(a=66, dens= 1890) -list_3 = list(a=c(44,46,48,50), dens=c(8000,1452,1596,7521)) -mylist = list(list_1, list_2, list_3) -setattr(mylist, 'names', c("ID_1","ID_2","ID_3")) -ans = data.table(id=rep(c("ID_1","ID_2","ID_3"), c(2,1,4)), - a=c(44,47,66,44,46,48,50), - dens=c(2331,1644,1890,8000,1452,1596,7521)) -test(1591, rbindlist(mylist, idcol="id"), ans) - -# FR #1443 -DT <- data.table(x = 1:3, y = 4:6, z = 7:9) -test(1592.1, setnames(DT, -5, "bla"), error="Items of 'old'") -test(1592.2, names(setnames(DT, -1, c("m", "n"))), c("x", "m", "n")) - -# fix for #1513 -test(1593, CJ(c(1,2,2), c(1,2,3)), data.table(V1=rep(c(1,2), c(3,6)), V2=c(1,2,3,1,1,2,2,3,3), key=c("V1", "V2"))) - -# FR #523, var, sd and prod -options(datatable.optimize = Inf) # ensure gforce is on -DT = data.table(x=sample(5, 100, TRUE), - y1=sample(6, 100, TRUE), - y2=sample(c(1:10,NA), 100, TRUE), - z1=runif(100), - z2=sample(c(runif(10),NA,NaN), 100, TRUE)) -test(1594.1, DT[, lapply(.SD, var, na.rm=FALSE), by=x], DT[, lapply(.SD, stats::var, na.rm=FALSE), by=x]) -test(1594.2, DT[, lapply(.SD, var, na.rm=TRUE), by=x], DT[, lapply(.SD, stats::var, na.rm=TRUE), by=x]) -test(1594.3, DT[, lapply(.SD, var, na.rm=TRUE), by=x, verbose=TRUE], output="GForce optimized j to.*gvar") - -test(1594.4, DT[, lapply(.SD, sd, na.rm=FALSE), by=x], DT[, lapply(.SD, stats::sd, na.rm=FALSE), by=x]) -test(1594.5, DT[, lapply(.SD, sd, na.rm=TRUE), by=x], DT[, lapply(.SD, stats::sd, na.rm=TRUE), by=x]) -test(1594.6, DT[, lapply(.SD, sd, na.rm=TRUE), by=x, verbose=TRUE], output="GForce optimized j to.*gsd") - -test(1594.7, DT[, lapply(.SD, prod, na.rm=FALSE), by=x], DT[, lapply(.SD, base::prod, na.rm=FALSE), by=x]) -test(1594.8, DT[, lapply(.SD, prod, na.rm=TRUE), by=x], DT[, lapply(.SD, base::prod, na.rm=TRUE), by=x]) -test(1594.9, DT[, lapply(.SD, prod, na.rm=TRUE), by=x, verbose=TRUE], output="GForce optimized j to.*gprod") - -# FR #1517 -dt1 = data.table(x=c(1,1,2), y=1:3) -dt2 = data.table(x=c(2,3,4), z=4:6) -test(1595, merge(dt1,dt2), merge(dt1,dt2, by="x")) - -# FR 1512, drop argument for dcast.data.table -DT <- data.table(v1 = c(1.1, 1.1, 1.1, 2.2, 2.2, 2.2), - v2 = factor(c(1L, 1L, 1L, 3L, 3L, 3L), levels=1:3), - v3 = factor(c(2L, 3L, 5L, 1L, 2L, 6L), levels=1:6), - v4 = c(3L, 2L, 2L, 5L, 4L, 3L)) -ans1 <- dcast(DT, v1+v2~v3, value.var="v4", drop=FALSE) -test(1596.1, dcast(DT, v1+v2~v3, value.var="v4", drop=c(FALSE, TRUE)), ans1[, -6, with=FALSE]) -test(1596.2, dcast(DT, v1+v2~v3, value.var="v4", drop=c(TRUE, FALSE)), ans1[c(1,6)]) - -# bug fix #1495 -dt = data.table(id=1:30, nn = paste0('A', 1:30)) -smp = sample(30, size =10) -lgl = dt$id %in% smp -test(1597, dt[lgl, ], dt[id %in% smp]) - -# FR #643 -vv = sample(letters[1:3], 10, TRUE) -test(1599.1, data.table(x=vv, y=1:10, stringsAsFactors=TRUE)$x, factor(vv)) -vv = sample(c(letters[1:3], NA), 10, TRUE) -test(1599.2, data.table(x=vv, y=1:10, stringsAsFactors=TRUE)$x, factor(vv)) - -# bug #1477 fix -DT <- data.table(a = 0L:1L, b = c(1L, 1L)) -test(1600.1, DT[ , lapply(.SD, function(x) if (all(x)) x)], data.table(b=c(1L, 1L))) -# this fix wasn't entirely nice as it introduced another issue. -# it's fixed now, but adding a test for that issue as well to catch it early next time. -set.seed(17022016L) -DT1 = data.table(id1 = c("c", "a", "b", "b", "b", "c"), - z1 = sample(100L, 6L), - z2 = sample(letters, 6L)) -DT2 = data.table(id1=c("c", "w", "b"), val=50:52) -test(1600.2, names(DT1[DT2, .(id1=id1, val=val, bla=sum(z1, na.rm=TRUE)), on="id1"]), c("id1", "val", "bla")) - -# warn when merge empty data.table #597 -test(1601.1, merge(data.table(a=1),data.table(a=1), by="a"), data.table(a=1, key="a")) -test(1601.2, tryCatch(merge(data.table(a=1),data.table(NULL), by="a"), warning = function(w) w$message), "You are trying to join data.tables where 'y' argument is 0 columns data.table.") -test(1601.3, tryCatch(merge(data.table(NULL),data.table(a=1), by="a"), warning = function(w) w$message), "You are trying to join data.tables where 'x' argument is 0 columns data.table.") -test(1601.4, tryCatch(merge(data.table(NULL),data.table(NULL), by="a"), warning = function(w) w$message), "You are trying to join data.tables where 'x' and 'y' arguments are 0 columns data.table.") - -# migrate `chron` dependency to Suggests #1558 -dd = as.IDate("2016-02-28") -tt = as.ITime("03:04:43") -if (test_chron) { - test(1602.1, as.chron.IDate(dd), chron::as.chron(as.Date(dd))) - test(1602.2, class(as.chron.ITime(tt)), "times") -} else { - test(1602.3, as.chron.IDate(dd), error = "Install suggested `chron` package to use `as.chron.IDate` function.") - test(1602.4, as.chron.ITime(tt), error = "Install suggested `chron` package to use `as.chron.ITime` function.") -} - -# fix for #1549 -d1 <- data.table(v1=1:2,x=x) -d2 <- data.table(v1=3:4) -test(1603.1, rbindlist(list(d2, d1), fill=TRUE), rbindlist(list(d1,d2), fill=TRUE)[c(3:4, 1:2)]) - -# fix for #1440 -DT = data.table(a=1:3, b=4:6) -myCol = "b" -test(1604, DT[,.(myCol),with=FALSE], error="When with=FALSE,") - -# fix for segfault #1531 -DT = data.table(x=rep(c("b","a","c"),each=3), y=c(1,3,6), v=1:9) -test(1605, DT[order(-x, "D")], error="Column 2 is length 1 which differs") - -# fix for #1503, fread's fill argument polishing -test(1606, fread("2\n1,a,b", fill=TRUE), data.table(V1=2:1, V2=c("","a"), V3=c("","b"))) - -# fix for #1476 -dt = data.table(resp=c(1:5)) -wide = copy(list(metrics = dt))$metrics # copy here copies the list of data.table and therefore didn't overallocate before.. -test(1607, wide[, id := .I], data.table(resp = 1:5, id = 1:5)) - -# better fix for #1462, + improved error message (if this better fix fails) -# no need for quote="" and sep="\t".. -test(1608, dim(fread(testDir('issue_1462_fread_quotes.txt'), header=FALSE)), c(4L, 224L)) - -# fix for #1164 -test(1609, fread(testDir("issue_1164_json.txt")), data.table(json1='{""f1"":""value1"",""f2"":""double quote escaped with a backslash [ \\"" ]""}', string1="string field")) - -# set of enhancements to print.data.table for #1523 -# dplyr-like column summary -icol = 1L:3L -Dcol = as.Date(paste0("2016-01-0", 1:3)) -DT1 = data.table(lcol = list(list(1:3), list(1:3), list(1:3)), - icol, ncol = as.numeric(icol), ccol = c("a", "b", "c"), - xcol = as.complex(icol), ocol = factor(icol, ordered = TRUE), - fcol = factor(icol)) -test(1610.1, capture.output(print(DT1, class=TRUE)), - c(" lcol icol ncol ccol xcol ocol fcol", - " ", - "1: 1 1 a 1+0i 1 1", - "2: 2 2 b 2+0i 2 2", - "3: 3 3 c 3+0i 3 3")) -# fails on travis and appveyor; no idea why.. Passes on my mac and windows machine. -# test(1610.2, capture.output(print(DT2, class=TRUE)) -# c(" Dcol Pcol gcol Icol ucol", -# " ", -# "1: 2016-01-01 2016-01-01 01:00:00 TRUE 2016-01-01 1", -# "2: 2016-01-02 2016-01-02 01:00:00 TRUE 2016-01-02 2", -# "3: 2016-01-03 2016-01-03 01:00:00 TRUE 2016-01-03 3")) - -# fix for #833 -l1 = list(a=seq_len(5), matrix(seq_len(25),ncol = 5, nrow = 5)) -l2 = list(seq_len(5), matrix(seq_len(25),ncol = 5, nrow = 5)) -test(1611.1, as.data.table(l1), setnames(setDT(as.data.frame(l1)), c("a", paste("V", 1:5, sep="")))) -test(1611.2, as.data.table(l2), setnames(setDT(as.data.frame(l2)), c("V1", "V1.1", paste("V", 2:5, sep="")))) - -# fix for #646 -# tz= is explicitly specified otherwise CRAN's solaris (both sparc and x86) fail. It may not be solaris per se -# but something related to the timezone of the two solaris machines. I guess one or the other of as.POSIXct or -# as.POSIXlt create the 'tzone' attribute differently for default tz="", just on solaris. I checked test.data.table -# already uses all.equal(), not identical(). So I don't think it is an accuracy problem. But could be wrong. -ll = list(a=as.POSIXlt("2015-01-01", tz='UTC'), b=1:5) -test(1612.1, as.data.table(ll), data.table(a=as.POSIXct("2015-01-01", tz='UTC'), b=1:5), warning="POSIXlt column type detected") -dt = data.table(d1="1984-03-17") -ans = data.table(d1="1984-03-17", d2=as.POSIXct("1984-03-17", tz='UTC')) -test(1612.2, dt[, d2 := strptime(d1, "%Y-%m-%d", tz='UTC')], ans, warning="POSIXlt column type detected and converted") -ll = list(a=as.POSIXlt("2015-01-01"), b=2L) -test(1612.3, setDT(ll), error="Column 1 is of POSIXlt type") - -# tests for all.equal.data.table #1106 -# diff nrow -DT1 <- data.table(a = 1:4, b = letters[1:4]) -DT2 <- data.table(a = c(1:4,4L), b = letters[c(1:4,4L)]) -test(1613.1, all.equal(DT1, DT2), "Different number of rows") -# diff ncol -DT1 <- data.table(a = 1:4, b = letters[1:4]) -DT2 <- data.table(a = 1:4) -test(1613.2, all.equal(DT1, DT2), c("Different number of columns", "Different column names")) -# diff colnames -DT1 <- data.table(a = 1:4, b = letters[1:4]) -DT2 <- data.table(aa = 1:4, bb = letters[1:4]) -test(1613.3, all.equal(DT1, DT2), "Different column names") -# diff column order -DT1 <- data.table(a = 1:4, b = letters[1:4]) -DT2 <- data.table(b = letters[1:4], a = 1:4) -test(1613.4, all.equal(DT1, DT2), "Different column order") -test(1613.5, all.equal(DT1, DT2, ignore.col.order=TRUE), TRUE) -# diff row order -DT1 <- data.table(a = 1:4, b = letters[1:4]) -DT2 <- data.table(a = 4:1, b = letters[4:1]) -test(1613.6, all.equal(DT1, DT2), "Column 'a': Mean relative difference: 0.8") -test(1613.7, all.equal(DT1, DT2, ignore.row.order=TRUE), TRUE) -# diff column order and diff row order -DT1 <- data.table(a = 1:4, b = letters[1:4]) -DT2 <- data.table(b = letters[4:1], a = 4:1) -test(1613.8, all.equal(DT1, DT2), "Different column order") -test(1613.9, all.equal(DT1, DT2, ignore.row.order=TRUE), "Different column order") -test(1613.10, all.equal(DT1, DT2, ignore.col.order=TRUE), "Column 'a': Mean relative difference: 0.8") -test(1613.11, all.equal(DT1, DT2, ignore.row.order=TRUE, ignore.col.order=TRUE), TRUE) -# non-overlapping duplicates -DT1 <- data.table(a = c(1:4,1:2), b = letters[c(1:4,1:2)]) -DT2 <- data.table(a = c(1:4,3:4), b = letters[c(1:4,3:4)]) -test(1613.12, all.equal(DT1, DT2), "Column 'a': Mean relative difference: 1.333333") -test(1613.13, all.equal(DT1, DT2, ignore.row.order=TRUE), "Dataset 'current' has rows not present in 'target' or present in different quantity") -# overlapping duplicates -DT1 <- data.table(a = c(1:4,1:2), b = letters[c(1:4,1:2)]) -DT2 <- data.table(a = c(1:4,2:1), b = letters[c(1:4,2:1)]) -test(1613.14, all.equal(DT1, DT2), "Column 'a': Mean relative difference: 0.6666667") -test(1613.15, all.equal(DT1, DT2, ignore.row.order=TRUE), TRUE) -# mixed overlapping duplicates -DT1 <- data.table(a = c(1:4,1:2), b = letters[c(1:4,1:2)]) -DT2 <- data.table(a = c(1:4,2:3), b = letters[c(1:4,2:3)]) -test(1613.16, all.equal(DT1, DT2, ignore.row.order = TRUE), "Dataset 'current' has rows not present in 'target' or present in different quantity") -# overlapping duplicates not equal in count -DT1 <- data.table(a = c(1:4, rep(1L,3), rep(2L,2)), b = letters[c(1:4, rep(1L,3), rep(2L,2))]) -DT2 <- data.table(a = c(1:4, rep(1L,2), rep(2L,3)), b = letters[c(1:4, rep(1L,2), rep(2L,3))]) -test(1613.17, all.equal(DT1, DT2, ignore.row.order = TRUE), "Dataset 'current' has rows not present in 'target' or present in different quantity") -# overlapping duplicates equal in count -DT1 <- data.table(a = c(1:4, 1L, 2L, 1L, 2L), b = letters[c(1:4, 1L, 2L, 1L, 2L)]) -DT2 <- data.table(a = c(2L, 1L, 1L, 2L, 1:4), b = letters[c(2L, 1L, 1L, 2L, 1:4)]) -test(1613.18, all.equal(DT1, DT2, ignore.row.order = TRUE), TRUE) -# subset with overlapping duplicates -DT1 <- data.table(a = c(1:3,3L), b = letters[c(1:3,3L)]) -DT2 <- data.table(a = c(1:4), b = letters[c(1:4)]) -test(1613.19, all.equal(DT1, DT2, ignore.row.order = TRUE), "Dataset 'target' has duplicate rows while 'current' doesn't") -# different number of unique rows -DT1 <- data.table(a = c(1:3,2:3), b = letters[c(1:3,2:3)]) -DT2 <- data.table(a = c(1L,1:4), b = letters[c(1L,1:4)]) -test(1613.20, all.equal(DT1, DT2, ignore.row.order = TRUE), "Dataset 'current' has rows not present in 'target' or present in different quantity") -test(1613.21, all.equal(DT2, DT1, ignore.row.order = TRUE), "Dataset 'current' has rows not present in 'target' or present in different quantity") -# test attributes: key -DT1 <- data.table(a = 1:4, b = letters[1:4], key = "a") -DT2 <- data.table(a = 1:4, b = letters[1:4]) -test(1613.22, all.equal(DT1, DT2), "Datasets has different keys. 'target': a. 'current' has no key.") -test(1613.23, all.equal(DT1, DT2, check.attributes = FALSE), TRUE) -test(1613.24, all.equal(DT1, setkeyv(DT2, "a"), check.attributes = TRUE), TRUE) -# test attributes: index -DT1 <- data.table(a = 1:4, b = letters[1:4]) -DT2 <- data.table(a = 1:4, b = letters[1:4]) -setindexv(DT1, "b") -test(1613.25, all.equal(DT1, DT2), "Datasets has different indexes. 'target': b. 'current' has no index.") -test(1613.26, all.equal(DT1, DT2, check.attributes = FALSE), TRUE) -test(1613.27, all.equal(DT1, setindexv(DT2, "a")), "Datasets has different indexes. 'target': b. 'current': a.") -test(1613.28, all.equal(DT1, setindexv(DT2, "b")), "Datasets has different indexes. 'target': b. 'current': a, b.") -test(1613.29, all.equal(DT1, setindexv(setindexv(DT2, NULL), "b")), TRUE) -# test custom attribute -DT1 <- data.table(a = 1:4, b = letters[1:4]) -DT2 <- data.table(a = 1:4, b = letters[1:4]) -setattr(DT1, "custom", 1L) -test(1613.30, all.equal(DT1, DT2), "Datasets has different number of (non-excluded) attributes: target 3, current 2") -test(1613.31, all.equal(DT1, DT2, check.attributes = FALSE), TRUE) -setattr(DT2, "custom2", 2L) -test(1613.32, all.equal(DT1, DT2), "Datasets has attributes with different names: custom, custom2") -setattr(DT1, "custom2", 2L) -setattr(DT2, "custom", 0L) -test(1613.33, all.equal(DT1, DT2), paste0("Attributes: < Component ", dQuote("custom"), ": Mean relative difference: 1 >")) -setattr(DT2, "custom", 1L) -test(1613.34, all.equal(DT1, DT2), TRUE) -# trim.levels -dt1 <- data.table(A = factor(letters[1:10])[1:4]) # 10 levels -dt2 <- data.table(A = factor(letters[1:5])[1:4]) # 5 levels -test(1613.35, all.equal(dt1, dt2)) -test(1613.36, !isTRUE(all.equal(dt1, dt2, trim.levels = FALSE))) -test(1613.37, !isTRUE(all.equal(dt1, dt2, trim.levels = FALSE, check.attributes = FALSE))) -test(1613.38, all.equal(dt1, dt2, trim.levels = FALSE, ignore.row.order = TRUE)) -test(1613.39, length(levels(dt1$A)) == 10L && length(levels(dt2$A)) == 5L, TRUE) # dt1 and dt2 not updated by reference -# unsupported column types: list -dt = data.table(V1 = 1:4, V2 = letters[1:4], V3 = lapply(1:4, function(x) new.env())) -test(1613.40, all.equal(dt, dt), TRUE) -test(1613.41, all.equal(dt, dt, ignore.row.order = TRUE), error = "Datasets to compare with 'ignore.row.order' must not have unsupported column types: list") -# unsupported type in set-ops: complex, raw -dt = data.table(V1 = 1:4, V2 = letters[1:4], V3 = as.complex(1:4), V4 = as.raw(1:4), V5 = lapply(1:4, function(x) NULL)) -test(1613.42, all.equal(dt, dt), TRUE) -test(1613.43, all.equal(dt, dt, ignore.row.order = TRUE), error = "Datasets to compare with 'ignore.row.order' must not have unsupported column types: raw, complex, list") -# supported types multi column test -dt = data.table( - V1 = 1:4, - V2 = as.numeric(1:4), - V3 = letters[rep(1:2, 2)], - V4 = factor(c("a","a","b","b")), - V5 = as.POSIXct("2016-03-05 12:00:00", origin="1970-01-01")+(1:4)*3600, - V6 = as.Date("2016-03-05", origin="1970-01-01")+(1:4) -)[, V7 := as.IDate(V6) - ][, V8 := as.ITime(V5)] -test(1613.441, all.equal(dt, dt), TRUE) -test(1613.442, all.equal(dt, dt, ignore.row.order = TRUE), TRUE) -test(1613.443, all.equal(dt[c(1:4,1L)], dt[c(1:4,1L)]), TRUE) -test(1613.444, all.equal(dt[c(1:4,1L)], dt[c(1L,1:4)]), "Column 'V1': Mean relative difference: 0.6") -test(1613.445, all.equal(dt[c(1:4,1L)], dt[c(1L,1:4)], ignore.row.order = TRUE), TRUE) -test(1613.45, all.equal(dt[c(1:4,1:2)], dt[c(1L,1L,1:4)], ignore.row.order = TRUE), c("Both datasets have duplicate rows, they also have numeric columns, together with ignore.row.order this force 'tolerance' argument to 0", "Dataset 'current' has rows not present in 'target' or present in different quantity")) -test(1613.46, all.equal(dt[c(1:2,1:4,1:2)], dt[c(1:2,1:2,1:4)], ignore.row.order = TRUE), TRUE) -# supported type all.equal: integer64 -if (test_bit64) { - dt = data.table(V1 = 1:4, V2 = letters[1:4], V3 = bit64::as.integer64("90000000000")+1:4) - test(1613.47, all.equal(dt, dt), TRUE) - test(1613.48, all.equal(dt, dt, ignore.row.order = TRUE), TRUE) - test(1613.49, all.equal(dt[c(1:4,1L)], dt[c(1:4,1L)]), TRUE) - test(1613.50, all.equal(dt[c(1:4,1L)], dt[c(1L,1:4)]), "Column 'V1': Mean relative difference: 0.6") - test(1613.51, all.equal(dt[c(1:4,1L)], dt[c(1L,1:4)], ignore.row.order = TRUE), TRUE) - test(1613.52, all.equal(dt[c(1:4,1:2)], dt[c(1L,1L,1:4)], ignore.row.order = TRUE), c("Both datasets have duplicate rows, they also have numeric columns, together with ignore.row.order this force 'tolerance' argument to 0","Dataset 'current' has rows not present in 'target' or present in different quantity")) - test(1613.53, all.equal(dt[c(1:2,1:4,1:2)], dt[c(1:2,1:2,1:4)], ignore.row.order = TRUE), TRUE) -} -# all.equal - new argument 'tolerance' #1737 -x = data.table(1) # test numeric after adding 'tolerance' argument -y = data.table(2) -test(1613.5411, !isTRUE(all.equal(x, y, ignore.row.order = FALSE))) -test(1613.5412, !isTRUE(all.equal(x, y, ignore.row.order = TRUE))) -x = data.table(c(1,1)) -y = data.table(c(2,2)) -test(1613.5421, !isTRUE(all.equal(x, y, ignore.row.order = FALSE))) -test(1613.5422, !isTRUE(all.equal(x, y, ignore.row.order = TRUE))) -x = data.table(c(1,2)) -y = data.table(c(2,2)) -test(1613.5431, !isTRUE(all.equal(x, y, ignore.row.order = FALSE))) -test(1613.5432, !isTRUE(all.equal(x, y, ignore.row.order = TRUE))) -x = data.table(as.factor(1)) # test factor adding 'tolerance' argument -y = data.table(as.factor(2)) -test(1613.5511, !isTRUE(all.equal(x,y))) -test(1613.5512, !isTRUE(all.equal(x, y, ignore.row.order = FALSE))) -test(1613.5513, !isTRUE(all.equal(x, y, ignore.row.order = TRUE))) -x = data.table(as.factor(c(1,1))) -y = data.table(as.factor(c(2,2))) -test(1613.5521, !isTRUE(all.equal(x, y, ignore.row.order = FALSE))) -test(1613.5522, !isTRUE(all.equal(x, y, ignore.row.order = TRUE))) -x = data.table(as.factor(c(1,2))) -y = data.table(as.factor(c(2,2))) -test(1613.5531, !isTRUE(all.equal(x, y, ignore.row.order = FALSE))) -test(1613.5532, !isTRUE(all.equal(x, y, ignore.row.order = TRUE))) -x = data.table(-0.000189921844659375) # tolerance in action -y = data.table(-0.000189921844655161) -test(1613.561, all(all.equal(x, y, ignore.row.order = FALSE), all.equal(x, y, ignore.row.order = TRUE))) -test(1613.562, all(is.character(all.equal(x, y, ignore.row.order = FALSE, tolerance = 0)), is.character(all.equal(x, y, ignore.row.order = TRUE, tolerance = 0)))) -test(1613.563, all(all.equal(rbind(x,y), rbind(y,y), ignore.row.order = FALSE), all.equal(rbind(x,y), rbind(y,y), ignore.row.order = TRUE))) -test(1613.564, all(is.character(all.equal(rbind(x,y), rbind(y,y), ignore.row.order = FALSE, tolerance = 0)), is.character(all.equal(rbind(x,y), rbind(y,y), ignore.row.order = TRUE, tolerance = 0)))) -test(1613.565, all(all.equal(rbind(x,x,y), rbind(y,y,x), ignore.row.order = FALSE), is.character(r<-all.equal(rbind(x,x,y), rbind(y,y,x), ignore.row.order = TRUE)) && any(grepl("force 'tolerance' argument to 0", r)))) # no-match due factor force tolerance=0 -test(1613.566, all(all.equal(rbind(x,y,y), rbind(x,y,y), ignore.row.order = FALSE, tolerance = 0), all.equal(rbind(x,y,y), rbind(x,y,y), ignore.row.order = TRUE, tolerance = 0))) -test(1613.567, all(is.character(all.equal(rbind(x,x,y), rbind(y,y,x), ignore.row.order = FALSE, tolerance = 0)), is.character(all.equal(rbind(x,x,y), rbind(y,y,x), ignore.row.order = TRUE, tolerance = 0)))) -test(1613.571, all(all.equal(cbind(x, list(factor(1))), cbind(y, list(factor(1))), ignore.row.order = FALSE), is.character(r<-all.equal(cbind(x, list(factor(1))), cbind(y, list(factor(1))), ignore.row.order = TRUE)) && any(grepl("force 'tolerance' argument to 0", r)))) # no-match due factor force tolerance=0 -test(1613.572, all(all.equal(cbind(x, list(factor(1))), cbind(x, list(factor(1))), ignore.row.order = FALSE), all.equal(cbind(x, list(factor(1))), cbind(x, list(factor(1))), ignore.row.order = TRUE))) # x to x with factor equality -test(1613.573, all.equal(cbind(x, list(factor(1))), cbind(x, list(factor(1))), ignore.row.order = TRUE, tolerance = 1), error = "Factor columns and ignore.row.order cannot be used with non 0 tolerance argument") # error due to provided non zero tolerance -test(1613.581, all(all.equal(x, y, ignore.row.order = FALSE, tolerance = 1), all.equal(x, y, ignore.row.order = TRUE, tolerance = 1))) -test(1613.582, all(all.equal(x, y, ignore.row.order = FALSE, tolerance = sqrt(.Machine$double.eps)/2), all.equal(x, y, ignore.row.order = TRUE, tolerance = sqrt(.Machine$double.eps)/2)), warning = "Argument 'tolerance' was forced") - -if (test_bit64) { - # fix for #1405, handles roll with -ve int64 values properly - dt = data.table(x=as.integer64(c(-1000, 0)), y=c(5,10)) - val = c(-1100,-900,100) - ans = data.table(x=as.integer64(val)) - test(1614.1, dt[.(val), roll=Inf, on="x"], ans[, y:=c(NA,5,10)]) - test(1614.2, dt[.(val), roll=Inf, on="x", rollends=TRUE], ans[, y:=c(5,5,10)]) - test(1614.3, dt[.(val), roll=-Inf, on="x"], ans[, y:=c(5,10,NA)]) - test(1614.4, dt[.(val), roll=-Inf, on="x", rollends=TRUE], ans[, y:=c(5,10,10)]) -} - -# fix for #1571 -x = data.table(c(1,1,2,7,2,3,4,4,7), 1:9) -y = data.table(c(2,3,4,4,4,5)) -test(1615.1, x[!y, on="V1", mult="first"], data.table(V1=c(1,7), V2=INT(c(1,4)))) -test(1615.2, x[!y, on="V1", mult="last"], data.table(V1=c(1,7), V2=INT(c(2,9)))) -test(1615.3, x[!y, on="V1", mult="all"], data.table(V1=c(1,1,7,7), V2=INT(c(1,2,4,9)))) - -# fix for #1287 and #1271 -set.seed(1L) -dt = data.table(a=c(1,1,2), b=sample(10,3), c=sample(10,3)) -test(1616.1, dt[.(1:2), if (c-b > 0L) b, on="a", by=.EACHI, mult="first"], data.table(a=c(1,2), V1=c(3L,5L))) -test(1616.2, dt[.(1:2), if (c-b > 0L) b, on="a", by=.EACHI, mult="last"], data.table(a=c(2), V1=5L)) -test(1616.3, dt[.(1:2), c := if (c-b > 0L) b, by=.EACHI, mult="first", on="a"], - data.table(a=dt$a, b=dt$b, c=c(3L,2L,5L)) ) - -# fix for #1281 -x <- 3 > 0 -ans = setattr(copy(x), "foo", "bar") -test(1617, setattr(x, "foo", "bar"), ans, warning = "Input is a length=1 logical that") - -# fix for #1445 -test(1618.1, fread("a,c,b\n1,2,3", select=c("b", "c")), data.table(b=3L, c=2L)) -test(1618.2, fread("a,c,b\n1,2,3", select=c("c", "b")), data.table(c=2L, b=3L)) -test(1618.3, fread("a,c,b\n1,2,3", select=c(3,2)), data.table(b=3L, c=2L)) -test(1618.4, fread("a,c,b\n1,2,3", select=c(2:3)), data.table(c=2L, b=3L)) -test(1618.5, fread("a,c,b\n1,2,3", select=c("b", "c"), col.names=c("q", "r")), data.table(q=3L, r=2L)) -test(1618.6, fread("a,c,b\n1,2,3", select=c("b", "z")), data.table(b=3L), warning="Column name 'z' not found.*skipping") - -# fix for #1270. Have been problems with R before vs after 3.1.0 here. But now ok in all R versions. -DT = data.table(x=1:2, y=5:6) -test(1619.1, DT[, .BY, by=x]$BY, as.list(1:2)) -test(1619.2, DT[, bycol := .BY, by=x]$bycol, as.list(1:2)) - -# fix for #473 -DT = data.frame(x=1, y=2) -setattr(DT, 'class', c('data.table', 'data.frame')) # simulates over-allocation lost scenario -if (!truelength(DT)) test(1620, truelength(as.data.table(DT)), 1026L) - -# fix for #1116, (#1239 and #1201) -test(1621.1, fread(testDir("issue_1116_fread_few_lines.txt"), logical01=FALSE), - setDT(read.delim(testDir("issue_1116_fread_few_lines.txt"), stringsAsFactors=FALSE, sep=",", check.names=FALSE))) -test(1621.2, fread(testDir("issue_1116_fread_few_lines_2.txt"), logical01=FALSE), - setDT(read.delim(testDir("issue_1116_fread_few_lines_2.txt"), stringsAsFactors=FALSE, sep=",", check.names=FALSE))) - -# fix for #1573 -ans1 = fread(testDir("issue_1573_fill.txt"), fill=TRUE, na.strings="") -ans2 = setDT(read.table(testDir("issue_1573_fill.txt"), header=TRUE, fill=TRUE, stringsAsFactors=FALSE, na.strings="")) -test(1622.1, ans1, ans2) -test(1622.2, ans1, fread(testDir("issue_1573_fill.txt"), fill=TRUE, sep=" ", na.strings="")) - -# fix for #989 -# error_msg = if (base::getRversion() < "3.4") "can not be a directory name" else "does not exist" -# Until R v3.3, file.info("~") returned TRUE for isdir. This seems to return NA in current devel. However, it -# correctly identifies that "~" is not a file. So leads to another error message. So removing the error message -# so that it errors properly on both versions. This seems fine to me since we just need it to error. Tested. -test(1623, fread("~"), error="") - -# testing print.rownames option, #1097 (part of #1523) -old = getOption("datatable.print.rownames") -options(datatable.print.rownames = FALSE) -DT <- data.table(a = 1:3) -test(1624, capture.output(print(DT)), c(" a", " 1", " 2", " 3")) -options(datatable.print.rownames = old) - -# fix for #1575 -text = "colA: dataA\ncolB: dataB\ncolC: dataC\n\nColA: dataA\nColB: dataB\nColC: dataC" -test(1625.1, fread(text, header=FALSE, sep=":", blank.lines.skip=TRUE, strip.white=FALSE), - setDT(read.table(text=text, header=FALSE, sep=":", blank.lines.skip=TRUE, stringsAsFactors=FALSE))) -test(1625.2, fread(text, header=FALSE, sep=":", blank.lines.skip=TRUE), - setDT(read.table(text=text, header=FALSE, sep=":", blank.lines.skip=TRUE, stringsAsFactors=FALSE, strip.white=TRUE))) - -# set-operators #547 -# setops basic check all -x = data.table(c(1,2,2,2,3,4,4)) -y = data.table(c(2,3,4,4,4,5)) -test(1626.1, fintersect(x, y), data.table(c(2,3,4))) # intersect -test(1626.2, fintersect(x, y, all=TRUE), data.table(c(2,3,4,4))) # intersect all -test(1626.3, fsetdiff(x, y), data.table(c(1))) # setdiff (except) -test(1626.4, fsetdiff(x, y, all=TRUE), data.table(c(1,2,2))) # setdiff all (except all) -test(1626.5, funion(x, y), data.table(c(1,2,3,4,5))) # union -test(1626.6, funion(x, y, all=TRUE), data.table(c(1,2,2,2,3,4,4,2,3,4,4,4,5))) # union all -test(1626.7, fsetequal(x, y), FALSE) # setequal -# setops check two cols -x = data.table(c(1,2,2,2,3,4,4), c(1,1,1,3,3,3,3)) -y = data.table(c(2,3,4,4,4,5), c(1,1,2,3,3,3)) -test(1626.8, fintersect(x, y), data.table(c(2,4), c(1,3))) # intersect -test(1626.9, fintersect(x, y, all=TRUE), data.table(c(2,4,4), c(1,3,3))) # intersect all -test(1626.10, fsetdiff(x, y), data.table(c(1,2,3), c(1,3,3))) # setdiff (except) -test(1626.11, fsetdiff(x, y, all=TRUE), data.table(c(1,2,2,3), c(1,1,3,3))) # setdiff all (except all) -test(1626.12, funion(x, y), data.table(c(1,2,2,3,4,3,4,5), c(1,1,3,3,3,1,2,3))) # union -test(1626.13, funion(x, y, all=TRUE), data.table(c(1,2,2,2,3,4,4,2,3,4,4,4,5), c(1,1,1,3,3,3,3,1,1,2,3,3,3))) # union all -test(1626.14, fsetequal(x, y), FALSE) # setequal -# setops on unique sets -x = unique(x) -y = unique(y) -test(1626.15, fintersect(x, y), data.table(c(2,4), c(1,3))) # intersect -test(1626.16, fintersect(x, y, all=TRUE), data.table(c(2,4), c(1,3))) # intersect all -test(1626.17, fsetdiff(x, y), data.table(c(1,2,3), c(1,3,3))) # setdiff (except) -test(1626.18, fsetdiff(x, y, all=TRUE), data.table(c(1,2,3), c(1,3,3))) # setdiff all (except all) -test(1626.19, funion(x, y), data.table(c(1,2,2,3,4,3,4,5), c(1,1,3,3,3,1,2,3))) # union -test(1626.20, funion(x, y, all=TRUE), data.table(c(1,2,2,3,4,2,3,4,4,5), c(1,1,3,3,3,1,1,2,3,3))) # union all -test(1626.21, fsetequal(x, y), FALSE) # setequal -# intersect precise duplicate handling -dt = data.table(a=1L) -test(1626.22, nrow(fintersect(dt[rep(1L,4)], dt[rep(1L,0)])), 0L) -test(1626.23, nrow(fintersect(dt[rep(1L,4)], dt[rep(1L,0)], all=TRUE)), 0L) -test(1626.24, nrow(fintersect(dt[rep(1L,4)], dt[rep(1L,1)])), 1L) -test(1626.25, nrow(fintersect(dt[rep(1L,4)], dt[rep(1L,1)], all=TRUE)), 1L) -test(1626.26, nrow(fintersect(dt[rep(1L,4)], dt[rep(1L,2)])), 1L) -test(1626.27, nrow(fintersect(dt[rep(1L,4)], dt[rep(1L,2)], all=TRUE)), 2L) -test(1626.28, nrow(fintersect(dt[rep(1L,4)], dt[rep(1L,3)])), 1L) -test(1626.29, nrow(fintersect(dt[rep(1L,4)], dt[rep(1L,3)], all=TRUE)), 3L) -test(1626.30, nrow(fintersect(dt[rep(1L,4)], dt[rep(1L,4)])), 1L) -test(1626.31, nrow(fintersect(dt[rep(1L,4)], dt[rep(1L,4)], all=TRUE)), 4L) -test(1626.32, nrow(fintersect(dt[rep(1L,4)], dt[rep(1L,5)])), 1L) -test(1626.33, nrow(fintersect(dt[rep(1L,4)], dt[rep(1L,5)], all=TRUE)), 4L) -# setdiff precise duplicate handling -dt = data.table(a=1L) -test(1626.34, nrow(fsetdiff(dt[rep(1L,4)], dt[rep(1L,0)])), 1L) -test(1626.35, nrow(fsetdiff(dt[rep(1L,4)], dt[rep(1L,0)], all=TRUE)), 4L) -test(1626.36, nrow(fsetdiff(dt[rep(1L,4)], dt[rep(1L,1)])), 0L) -test(1626.37, nrow(fsetdiff(dt[rep(1L,4)], dt[rep(1L,1)], all=TRUE)), 3L) -test(1626.38, nrow(fsetdiff(dt[rep(1L,4)], dt[rep(1L,2)])), 0L) -test(1626.39, nrow(fsetdiff(dt[rep(1L,4)], dt[rep(1L,2)], all=TRUE)), 2L) -test(1626.40, nrow(fsetdiff(dt[rep(1L,4)], dt[rep(1L,3)])), 0L) -test(1626.41, nrow(fsetdiff(dt[rep(1L,4)], dt[rep(1L,3)], all=TRUE)), 1L) -test(1626.42, nrow(fsetdiff(dt[rep(1L,4)], dt[rep(1L,4)])), 0L) -test(1626.43, nrow(fsetdiff(dt[rep(1L,4)], dt[rep(1L,4)], all=TRUE)), 0L) -test(1626.44, nrow(fsetdiff(dt[rep(1L,4)], dt[rep(1L,5)])), 0L) -test(1626.45, nrow(fsetdiff(dt[rep(1L,4)], dt[rep(1L,5)], all=TRUE)), 0L) -# unsupported type in set-ops: list (except UNION ALL) -dt = data.table(V1 = 1:4, V2 = letters[1:4], V3 = lapply(1:4, function(x) new.env())) -x = dt[c(2:4,2L,2L)] -y = dt[c(1:3,2L)] -test(1626.46, fintersect(x, y), error = "x and y must not have unsupported column types: list") -test(1626.47, fintersect(x, y, all=TRUE), error = "x and y must not have unsupported column types: list") -test(1626.48, fsetdiff(x, y), error = "x and y must not have unsupported column types: list") -test(1626.49, fsetdiff(x, y, all=TRUE), error = "x and y must not have unsupported column types: list") -test(1626.50, funion(x, y), error = "x and y must not have unsupported column types: list") -test(1626.51, funion(x, y, all=TRUE), dt[c(2:4,2L,2L,1:3,2L)]) -test(1626.52, fsetequal(x, y), error = "x and y must not have unsupported column types: list") -test(1626.53, fsetequal(dt[c(1:2,2L)], dt[c(1:2,2L)]), error = "x and y must not have unsupported column types: list") -# unsupported type in set-ops: complex, raw -dt = data.table(V1 = 1:4, V2 = letters[1:4], V3 = as.complex(1:4), V4 = as.raw(1:4), V5 = lapply(1:4, function(x) NULL)) -x = dt[c(2:4,2L,2L)] -y = dt[c(1:3,2L)] -test(1626.54, fintersect(x, y), error = "x and y must not have unsupported column types: raw, complex, list") -test(1626.55, fintersect(x, y, all=TRUE), error = "x and y must not have unsupported column types: raw, complex, list") -test(1626.56, fsetdiff(x, y), error = "x and y must not have unsupported column types: raw, complex, list") -test(1626.57, fsetdiff(x, y, all=TRUE), error = "x and y must not have unsupported column types: raw, complex, list") -test(1626.58, funion(x, y), error = "x and y must not have unsupported column types: raw, complex, list") -test(1626.59, funion(x, y, all=TRUE), error = "x and y must not have unsupported column types: raw, complex") # no 'list' here which is supported for `all=TRUE` -test(1626.60, fsetequal(x, y), error = "x and y must not have unsupported column types: raw, complex, list") -test(1626.61, fsetequal(dt[c(1:2,2L)], dt[c(1:2,2L)]), error = "x and y must not have unsupported column types: raw, complex, list") -# supported types multi column test -dt = data.table( - V1 = 1:4, - V2 = as.numeric(1:4), - V3 = letters[rep(1:2, 2)], - V4 = factor(c("a","a","b","b")), - V5 = as.POSIXct("2016-03-05 12:00:00", origin="1970-01-01")+(1:4)*3600, - V6 = as.Date("2016-03-05", origin="1970-01-01")+(1:4) -)[, V7 := as.IDate(V6) - ][, V8 := as.ITime(V5)] -x = dt[c(2:4,2L,2L)] -y = dt[c(1:3,2L)] -test(1626.62, fintersect(x, y), dt[2:3]) -test(1626.63, fintersect(x, y, all=TRUE), dt[c(2:3,2L)]) -test(1626.63, fsetdiff(x, y), dt[4L]) -test(1626.64, fsetdiff(x, y, all=TRUE), dt[c(4L,2L)]) -test(1626.65, funion(x, y), dt[c(2:4,1L)]) -test(1626.66, funion(x, y, all=TRUE), dt[c(2:4,2L,2L,1:3,2L)]) -test(1626.67, fsetequal(x, y), FALSE) -test(1626.68, fsetequal(dt[c(2:3,3L)], dt[c(2:3,3L)]), TRUE) -# supported type in set-ops: integer64 -if (test_bit64) { - dt = data.table(V1 = 1:4, V2 = letters[1:4], V3 = bit64::as.integer64("90000000000")+1:4) - x = dt[c(2:4,2L,2L)] - y = dt[c(1:3,2L)] - test(1626.69, fintersect(x, y), dt[2:3]) - test(1626.70, fintersect(x, y, all=TRUE), dt[c(2:3,2L)]) - test(1626.71, fsetdiff(x, y), dt[4L]) - test(1626.72, fsetdiff(x, y, all=TRUE), dt[c(4L,2L)]) - test(1626.73, funion(x, y), dt[c(2:4,1L)]) - test(1626.74, funion(x, y, all=TRUE), dt[c(2:4,2L,2L,1:3,2L)]) - test(1626.75, fsetequal(x, y), FALSE) - test(1626.76, fsetequal(dt[c(2:3,3L)], dt[c(2:3,3L)]), TRUE) -} - -# fix for #1087 and #1465 -test(1627, charToRaw(names(fread(testDir("issue_1087_utf8_bom.csv")))[1L]), as.raw(97L)) -test(1627.1, names(fread(testDir("issue_1087_utf8_bom.csv"), verbose=TRUE))[1L], "a", output="UTF-8 byte order mark EF BB BF found") -test(1627.2, names(fread(testDir("gb18030.txt")))[1L], "x", warning="GB-18030 encoding detected") -test(1627.3, fread(testDir("utf16le.txt")), error="File is encoded in UTF-16") -test(1627.4, fread(testDir("utf16be.txt")), error="File is encoded in UTF-16") - -# uniqueN gains na.rm argument, #1455 -set.seed(1L) -dt = data.table(x=sample(c(1:3,NA),25,TRUE), y=sample(c(NA,"a", "b"), 25,TRUE), z=sample(2,25,TRUE)) -test(1628.1, uniqueN(dt, by=1:2, na.rm=TRUE), nrow(na.omit(dt[, .N, by=.(x,y)]))) -test(1628.2, uniqueN(dt, na.rm=TRUE), nrow(na.omit(dt[, .N, by=.(x,y,z)]))) -test(1628.3, dt[, uniqueN(y, na.rm=TRUE), by=z], dt[, length(unique(na.omit(y))), by=z]) -test(1628.4, dt[, uniqueN(.SD, na.rm=TRUE), by=z], dt[, nrow(na.omit(.SD[, .N, by=.(x,y)])), by=z]) - -# fix for long standing FR/bug, #495 -# most likely I'm missing some tests, but we'll fix/add them as we go along. -dt = data.table(grp=c(2,3,3,1,1,2,3), v1=1:7, v2=7:1, v3=10:16) -test(1629.1, dt[, .SD*v1, .SDcols=v2:v3], dt[, .(v2=v2*v1, v3=v3*v1)]) -test(1629.2, dt[, lapply(.SD, function(x) x*v1), .SDcols=v2:v3], dt[, .(v2=v2*v1, v3=v3*v1)]) -test(1629.3, dt[, lapply(.SD, function(x) mean(x)*sum(v1)), .SDcols=v2:v3], data.table(v2=112, v3=364)) -test(1629.4, dt[, c(sum(v1), lapply(.SD, mean)), .SDcols=v2:v3], data.table(V1=28L, v2=4, v3=13)) -test(1629.5, dt[, c(v1=sum(v1), lapply(.SD, mean)), .SDcols=v2:v3], data.table(v1=28L, v2=4, v3=13)) -test(1629.6, dt[, .(v1=sum(v1), lapply(.SD, mean)), .SDcols=v2:v3], data.table(v1=28L, V2=list(4,13))) -test(1629.7, dt[0][, .SD*v1, .SDcols=v2:v3], dt[0][, .SD, .SDcols=v2:v3]) -# add/update -dt2 = copy(dt) -test(1629.8, dt2[, c("v2", "v3") := .SD*v1, .SDcols=v2:v3], dt[, .(grp, v1, v2=v2*v1, v3=v3*v1)]) -# grouping operations -oldopts = getOption("datatable.optimize") # backup -options(datatable.optimize = 1L) # no gforce -test(1629.9, dt[, .SD*sum(v1), by=grp, .SDcols=v2:v3], dt[, .SD*sum(v1), by=grp][, v1 := NULL]) -ans1 = dt[, sum(v1), by=grp] -ans2 = dt[, base::max(.SD), by=grp, .SDcols=v2:v3] -test(1629.10, dt[, max(.SD)*sum(v1), by=grp, .SDcols=v2:v3], ans1[, .(grp, V1=V1*ans2$V1)]) -test(1629.11, dt[, lapply(.SD, function(x) weighted.mean(x, w=v2)), .SDcols=c("v1","v3"), by=grp], - dt[, .(v1=weighted.mean(v1,w=v2), v3=weighted.mean(v3, w=v2)), by=grp]) -test(1629.12, dt[, c(v1=max(v1), lapply(.SD, base::min)), by=grp, .SDcols=v2:v3], dt[, .(v1=max(v1), v2=min(v2), v3=min(v3)), by=grp]) -# gforce -options(datatable.optimize = Inf) # Inf -test(1629.13, dt[, c(v1=max(v1), lapply(.SD, min)), by=grp, .SDcols=v2:v3], dt[, .(v1=max(v1), v2=min(v2), v3=min(v3)), by=grp]) -# even more complex, shouldn't run any optimisation -dt[, v4 := v1/2] -test(1629.14, dt[, c(.(v1=v1*min(v4)), lapply(.SD, function(x) x*max(v4))), by=grp, .SDcols=v2:v3], - dt[, .(v1=v1*min(v4), v2=v2*max(v4), v3=v3*max(v4)), by=grp]) -test(1629.15, copy(dt)[, c("a", "b", "c") := c(min(v1), lapply(.SD, function(x) max(x)*min(v1))), by=grp, .SDcols=v3:v4], copy(dt)[, c("a", "b", "c") := .(min(v1), max(v3)*min(v1), max(v4)*min(v1)), by=grp]) -options(datatable.optimize = oldopts) -# by=.EACHI and operations with 'i' -test(1629.16, dt[.(2:3), c(.(sum(v1)), lapply(.SD, function(x) mean(x)*min(v1))), by=.EACHI, .SDcols=v2:v3, on="grp"], dt[grp %in% 2:3, c(.(sum(v1)), lapply(.SD, function(x) mean(x)*min(v1))), by=grp, .SDcols=v2:v3]) -test(1629.17, dt[.(2:3), c(sum(v1), lapply(.SD, function(x) mean(x)*v1)), .SDcols=v2:v3, on="grp"][order(V1,v2,v3)], dt[grp %in% 2:3, c(sum(v1), lapply(.SD, function(x) mean(x)*v1)), .SDcols=v2:v3][order(V1,v2,v3)]) - -# #759, add new cols on := -dt1 <- data.table(id = 1:2, x = 3:4) -dt2 <- data.table(id = 3:4, y = c(5,6)) -# when updating using :=, nomatch = 0 or NA should make no difference i.e. new columns should always -# be added. Otherwise there's an inconsistent number of columns in result that depends on data. -ans = copy(dt1)[,z:=NA_real_] # NA_real_ because :=2 below is type double -test(1630.1, copy(dt1)[id>5, z:=2, nomatch=0L], ans, warning="ignoring nomatch") -test(1630.2, copy(dt1)[dt2, z:=2, on="id", nomatch=0L], ans, warning="ignoring nomatch") -test(1630.3, copy(dt1)[dt2, z:=y, on="id", nomatch=0L], ans, warning="ignoring nomatch") -test(1630.4, copy(dt1)[dt2, z:=y, on="id", by=.EACHI, nomatch=0L], ans, warning="ignoring nomatch") -test(1630.5, copy(dt1)[id>5, z:=2, nomatch=NA], ans, warning="ignoring nomatch") -test(1630.6, copy(dt1)[dt2, z:=2, on="id", nomatch=NA], ans, warning="ignoring nomatch") -test(1630.7, copy(dt1)[dt2, z:=y, on="id", nomatch=NA], ans, warning="ignoring nomatch") -test(1630.8, copy(dt1)[dt2, z:=y, on="id", by=.EACHI, nomatch=NA], ans, warning="ignoring nomatch") -test(1630.9, copy(dt1)[id>5, z:=2L, nomatch=0L], copy(dt1)[,z:=NA_integer_], warning="ignoring nomatch") -test(1630.11, copy(dt1)[id>5, z:=2L, nomatch=NA], copy(dt1)[,z:=NA_integer_], warning="ignoring nomatch") - -# fix for #1268, on= retains keys correctly. -A = data.table(site=rep(c("A","B"), each=3), date=rep(1:3, times=2), x=rep(1:3*10, times=2), key="site,date") -B = data.table(x=c(10,20), y=c(100,200), key="x") -test(1631, key(A[B, on="x"]), NULL) - -# fix for #1479, secondary keys are removed when necessary -TFvec = c(FALSE,FALSE,TRUE,FALSE,FALSE,FALSE,FALSE,FALSE,FALSE) -dt = data.table(a = rep(TFvec, 3), b = c("x", "y", "z")) -setindex(dt, a) -dt[, a := as.logical(sum(a)), by = b] -test(1632.1, names(attributes(attr(dt, 'index'))), NULL) -dt = data.table(a = rep(TFvec, 3), b = c("x", "y", "z")) -setindex(dt, b) -dt[, a := as.logical(sum(a)), by = b] -test(1632.2, names(attributes(attr(dt, 'index'))), "__b") -dt = data.table(a = rep(TFvec, 3), b = c("x", "y", "z")) -test(1632.3, copy(dt)[, c := !a, by=b], copy(dt)[, c := !TFvec]) - -# by accepts colA:colB for interactive scenarios, #1395 -dt = data.table(x=rep(1,18), y=rep(1:2, each=9), z=rep(1:3,each=6), a=rep(1:6, each=3))[, b := 6] -test(1633.1, dt[, sum(b), by=x:a], dt[, sum(b), by=.(x,y,z,a)]) -test(1633.2, dt[, sum(b), by=y:a], dt[, sum(b), by=.(y,z,a)]) -test(1633.3, dt[, sum(b), by=a:y], dt[, sum(b), by=.(a,z,y)]) -test(1633.4, dt[, .SD, by=1:nrow(dt)], data.table(nrow=1:nrow(dt), dt)) # make sure this works - -# reuse secondary indices -dt = data.table(x=sample(3, 10, TRUE), y=1:10) -v1 = capture.output(ans1 <- dt[.(3:2), on="x", verbose=TRUE]) -setindex(dt, x) -v2 = capture.output(ans2 <- dt[.(3:2), on="x", verbose=TRUE]) -test(1634.1, any(grepl("ad hoc", v1)), TRUE) -test(1634.2, any(grepl("existing index", v2)), TRUE) - -# fread's fill argument detects separator better in complex cases as well, #1573 -# if pasted to the console, these tests won't work. But do work when sourced as these are tabs not spaces in text -text = "a b c d e f g h i j k l\n1 P P;A;E; Y YW; H(). 1-3 pro\n2 Q9 a;a;a;a; YB YH; M(). 13 pn ba\n1 P3 P; Y Y; R(). 14 p\n53 P P6;B;D;0;5;a;X;a;4R; Y Y; H(). 13 pe e\n1 P P;O;O;a;a;a; HLA-A HLA-A;; H(). HcIha,A-n\n102 P P;O;P;P;P;P;P;P;a;a;a;a;a;a;a;a;a;a; H-A H-A;; H(). HcIha,A" -test(1635.1, ans1 <- fread(text, fill=TRUE), setDT(read.table(text=text, stringsAsFactors=FALSE, fill=TRUE, sep="\t", header=TRUE))) -text = "a b c d e\n1 P P;A;E; Y YW; H(). 1-3 pro\n2 Q9 a;a;a;a; YB YH; M(). 13 pn ba\n1 P3 P; Y Y; R(). 14 p\n53 P P6;B;D;0;5;a;X;a;4R; Y Y; H(). 13 pe e\n1 P P;O;O;a;a;a; HLA-A HLA-A;; H(). HcIha,A-n\n102 P P;O;P;P;P;P;P;P;a;a;a;a;a;a;a;a;a;a; H-A H-A;; H(). HcIha,A" -test(1635.2, fread(text, fill=TRUE), setnames(ans1[, 1:7], c(letters[1:5], paste("V", 6:7, sep="")))) - -# testing function type in dt, #518 -dt = data.table(x=1, y=sum) -test(1636.1, class(dt$y), "list") -test(1636.2, any(grepl("1: 1 ", capture.output(print(dt)))), TRUE) -dt = data.table(x=1:2, y=sum) -test(1636.3, class(dt$y), "list") -test(1636.4, any(grepl("2: 2 ", capture.output(print(dt)))), TRUE) -dt = data.table(x=1:2, y=c(sum, min)) -test(1636.5, class(dt$y), "list") -test(1636.6, any(grepl("2: 2 ", capture.output(print(dt)))), TRUE) - -# #484 fix (related to #495 fix above) -dt = data.table(a = 1, b = 1) -test(1637.1, dt[, data.table(a, .SD), by = cumsum(a)], data.table(cumsum=1, a=1, b=1)) -test(1637.2, dt[, data.table(a, .SD), by = cumsum(a), .SDcols=a:b], data.table(cumsum=1, a=1, a=1, b=1)) -test(1637.3, dt[, data.table(a, .SD), by = a], data.table(a=1,a=1,b=1)) -test(1637.4, dt[, data.table(b, .SD), by = cumsum(a)], data.table(cumsum=1, b=1, b=1)) -test(1637.5, dt[, data.table(a, b), by = cumsum(a)], data.table(cumsum=1, a=1, b=1)) - -# when datatable.optimize<1, no optimisation of j should take place: -old = options(datatable.optimize=0L) -dt = data.table(x=1:5, y=6:10, z=c(1,1,1,2,2)) -test(1638, dt[, .SD, by=z, verbose=TRUE], output="All optimizations are turned off") -options(old) - -#1389 - split.data.table - big chunk of unit tests -set.seed(123) -dt = data.table(x1 = rep(letters[1:2], 6), x2 = rep(letters[3:5], 4), x3 = rep(letters[5:8], 3), y = rnorm(12)) -dt = dt[sample(.N)] -df = as.data.frame(dt) -# - [x] split by factor the same as `split.data.frame` - `f` argument ---- -test(1639.1, lapply(split(df, as.factor(1:2)), setDT), split(dt, as.factor(1:2))) # drop=FALSE on same factor -test(1639.2, lapply(split(df, as.factor(1:2), drop=TRUE), setDT), split(dt, as.factor(1:2), drop=TRUE)) # drop=TRUE on same factor -test(1639.3, lapply(split(df, as.factor(1:4)[3:2]), setDT), split(dt, as.factor(1:4)[3:2])) # drop=FALSE on same factor with empty levels -test(1639.4, lapply(split(df, as.factor(1:4)[3:2], drop=TRUE), setDT), split(dt, as.factor(1:4)[3:2], drop=TRUE)) # drop=TRUE on same factor with empty levels -test(1639.5, lapply(split(df, as.factor(1:12)), setDT), split(dt, as.factor(1:12))) # drop=FALSE factor length of nrow -test(1639.6, lapply(split(df, as.factor(1:12), drop=TRUE), setDT), split(dt, as.factor(1:12), drop=TRUE)) # drop=TRUE factor length of nrow -ord = sample(2:13) -test(1639.7, lapply(split(df, as.factor(1:14)[ord]), setDT), split(dt, as.factor(1:14)[ord])) # drop=FALSE factor length of nrow with empty levels -test(1639.8, lapply(split(df, as.factor(1:14)[ord], drop=TRUE), setDT), split(dt, as.factor(1:14)[ord], drop=TRUE)) # drop=TRUE factor length of nrow with empty levels -test(1639.9, lapply(split(df, list(as.factor(1:2), as.factor(3:2))), setDT), split(dt, list(as.factor(1:2), as.factor(3:2)))) # `f` list object drop=FALSE -test(1639.10, lapply(split(df, list(as.factor(1:2), as.factor(3:2)), drop=TRUE), setDT), split(dt, list(as.factor(1:2), as.factor(3:2)), drop=TRUE)) # `f` list object drop=TRUE -test(1639.11, split(dt, as.factor(integer())), error = "group length is 0 but data nrow > 0") # factor length 0L -test(1639.12, split(dt, as.factor(integer()), drop=TRUE), error = "group length is 0 but data nrow > 0") -test(1639.13, split(dt, as.factor(1:2)[0L]), error = "group length is 0 but data nrow > 0") # factor length 0L with empty levels -test(1639.14, split(dt, as.factor(1:2)[0L], drop=TRUE), error = "group length is 0 but data nrow > 0") -# - [x] edge cases for `f` argument ---- -test(1639.15, split(df, as.factor(NA)), split(dt, as.factor(NA))) # factor NA -test(1639.16, split(df, as.factor(NA), drop=TRUE), split(dt, as.factor(NA), drop=TRUE)) -test(1639.17, lapply(split(df, as.factor(1:2)[0L][1L]), setDT), split(dt, as.factor(1:2)[0L][1L])) # factor NA with empty levels -test(1639.18, split(df, as.factor(1:2)[0L][1L], drop=TRUE), split(dt, as.factor(1:2)[0L][1L], drop=TRUE)) -test(1639.19, lapply(split(df, as.factor(c(1L,NA,2L))), setDT), split(dt, as.factor(c(1L,NA,2L)))) # factor has NA -test(1639.20, lapply(split(df, as.factor(c(1L,NA,2L)), drop=TRUE), setDT), split(dt, as.factor(c(1L,NA,2L)), drop=TRUE)) -test(1639.21, lapply(split(df, as.factor(c(1L,NA,2:4))[1:3]), setDT), split(dt, as.factor(c(1L,NA,2:4))[1:3])) # factor has NA with empty levels -test(1639.22, lapply(split(df, as.factor(c(1L,NA,2:4))[1:3], drop=TRUE), setDT), split(dt, as.factor(c(1L,NA,2:4))[1:3], drop=TRUE)) -test(1639.23, lapply(split(df, letters[c(1L,NA,2L)]), setDT), split(dt, letters[c(1L,NA,2L)])) # character as `f` arg -test(1639.24, lapply(split(df, letters[c(1L,NA,2L)], drop=TRUE), setDT), split(dt, letters[c(1L,NA,2L)], drop=TRUE)) -test(1639.25, lapply(split(df, "z"), setDT), split(dt, "z")) # character as `f` arg, length 1L -test(1639.26, lapply(split(df, "z", drop=TRUE), setDT), split(dt, "z", drop=TRUE)) -test(1639.27, lapply(split(df, letters[c(1L,NA)]), setDT), split(dt, letters[c(1L,NA)])) # character as `f` arg, length 1L of non-NA -test(1639.28, lapply(split(df, letters[c(1L,NA)], drop=TRUE), setDT), split(dt, letters[c(1L,NA)], drop=TRUE)) -test(1639.29, lapply(split(df[0L,], "z"), setDT), split(dt[0L], "z")) # nrow 0, f length 1-2 -test(1639.30, lapply(split(df[0L,], c("z1","z2")), setDT), split(dt[0L], c("z1","z2"))) -test(1639.31, lapply(split(df[0L,], "z", drop=TRUE), setDT), split(dt[0L], "z", drop=TRUE)) -test(1639.32, lapply(split(df[0L,], c("z1","z2"), drop=TRUE), setDT), split(dt[0L], c("z1","z2"), drop=TRUE)) -test(1639.33, lapply(split(df[1L,], "z"), setDT), split(dt[1L], "z")) # nrow 1, f length 1-2 -test(1639.34, lapply(suppressWarnings(split(df[1L,], c("z1","z2"))), setDT), suppressWarnings(split(dt[1L], c("z1","z2")))) -test(1639.35, lapply(split(df[1L,], "z", drop=TRUE), setDT), split(dt[1L], "z", drop=TRUE) ) -test(1639.36, lapply(suppressWarnings(split(df[1L,], c("z1","z2"), drop=TRUE)), setDT), suppressWarnings(split(dt[1L], c("z1","z2"), drop=TRUE))) -test(1639.37, lapply(split(df[0L,], as.factor(NA_character_)), setDT), split(dt[0L], as.factor(NA_character_))) # nrow 0, f factor length 1L NA -test(1639.38, lapply(split(df[0L,], as.factor(NA_character_), drop=TRUE), setDT), split(dt[0L], as.factor(NA_character_), drop=TRUE)) -test(1639.39, lapply(split(df[0L,], as.factor(1:2)[0L][1L]), setDT), split(dt[0L], as.factor(1:2)[0L][1L])) # nrow 0, f factor length 1L NA with empty levels -test(1639.40, lapply(split(df[0L,], as.factor(1:2)[0L][1L], drop=TRUE), setDT), split(dt[0L], as.factor(1:2)[0L][1L], drop=TRUE)) -test(1639.41, lapply(split(df[0L,], as.factor(integer())), setDT), split(dt[0L], as.factor(integer()))) # nrow 0, f factor length 0L -test(1639.42, lapply(split(df[0L,], as.factor(integer()), drop=TRUE), setDT), split(dt[0L], as.factor(integer()), drop=TRUE)) -test(1639.43, lapply(split(df[0L,], as.factor(1:2)[0L]), setDT), split(dt[0L], as.factor(1:2)[0L])) # nrow 0, f factor length 0L with empty levels -test(1639.44, lapply(split(df[0L,], as.factor(1:2)[0L], drop=TRUE), setDT), split(dt[0L], as.factor(1:2)[0L], drop=TRUE)) -test(1639.45, lapply(split(df[0L,], as.factor(1:3)[c(2L,NA,3L)]), setDT), split(dt[0L], as.factor(1:3)[c(2L,NA,3L)])) # nrow 0, f factor with empty levels and NA -test(1639.46, lapply(split(df[0L,], as.factor(1:3)[c(2L,NA,3L)], drop=TRUE), setDT), split(dt[0L], as.factor(1:3)[c(2L,NA,3L)], drop=TRUE)) # nrow 0, f character length 1L NA -test(1639.47, lapply(split(df[0L,], NA_character_), setDT), split(dt[0L], NA_character_)) -test(1639.48, lapply(split(df[0L,], NA_character_, drop=TRUE), setDT), split(dt[0L], NA_character_, drop=TRUE)) -test(1639.49, lapply(split(df[0L,], letters[c(NA,1:3)]), setDT), split(dt[0L], letters[c(NA,1:3)])) # nrow 0, f length > 1L, with NA -test(1639.50, lapply(split(df[0L,], letters[c(NA,1:3)], drop=TRUE), setDT), split(dt[0L], letters[c(NA,1:3)], drop=TRUE)) -# - [x] split by reference to column names - `by` - for factor column ---- -fdt = dt[, c(lapply(.SD, as.factor), list(y=y)), .SDcols=x1:x3] -l = split(fdt, by = "x1", flatten=FALSE) # single col -test(1639.51, TRUE, all(is.list(l), identical(names(l), c("b","a")), sapply(l, is.data.table), sapply(l, nrow) == c(b=6L, a=6L), sapply(l, ncol) == c(b=4L, a=4L))) -l = split(fdt, by = "x2", flatten=FALSE) -test(1639.52, TRUE, all(is.list(l), identical(names(l), c("d","e","c")), sapply(l, is.data.table), sapply(l, nrow) == c(d=4L, e=4L, c=4L), sapply(l, ncol) == c(d=4L, e=4L, c=4L))) -l = split(fdt, by = "x3", flatten=FALSE) -test(1639.53, TRUE, all(is.list(l), identical(names(l), c("h","f","g","e")), sapply(l, is.data.table), sapply(l, nrow) == c(h=3L, f=3L, g=3L, e=3L), sapply(l, ncol) == c(h=4L, f=4L, g=4L, e=4L))) -l = split(fdt, by = c("x1","x2"), flatten=FALSE) # multi col -test(1639.54, TRUE, all( - is.list(l), identical(names(l), c("b","a")), - sapply(l, function(x) !is.data.table(x) && is.list(x)), - identical(lapply(l, names), list(b=c("d","e","c"), a=c("e","d","c"))), - sapply(l, sapply, nrow) == rep(2L, 6), - sapply(l, sapply, ncol) == rep(4L, 6) -)) -l = split(fdt, by = c("x1","x3"), flatten=FALSE) # empty levels appears due subset x3 by x1 groups -test(1639.55, TRUE, all( - is.list(l), identical(names(l), c("b","a")), - sapply(l, function(x) !is.data.table(x) && is.list(x)), - identical(lapply(l, names), list(b=c("h","f","e","g"), a=c("g","e","f","h"))), - sapply(l, sapply, nrow) == rep(c(3L,3L,0L,0L), 2), - sapply(l, sapply, ncol) == rep(4L, 8) -)) -l = split(fdt, by = c("x2","x3"), flatten=FALSE) -test(1639.56, TRUE, all( - is.list(l), identical(names(l), c("d","e","c")), - sapply(l, function(x) !is.data.table(x) && is.list(x)), - identical(lapply(l, names), list(d=c("h","f","e","g"), e=c("h","f","g","e"), c=c("f","h","e","g"))), - sapply(l, sapply, nrow) == rep(1L, 12), - sapply(l, sapply, ncol) == rep(4L, 4) -)) -l = split(fdt, by = c("x1","x2","x3"), flatten=FALSE) # empty levels in x3 after subset are expanded -test(1639.57, TRUE, all( - is.list(l), identical(names(l), c("b","a")), - sapply(l, function(x) !is.data.table(x) && is.list(x)), - sapply(l, sapply, function(x) !is.data.table(x) && is.list(x)), - identical(lapply(l, lapply, names), list(b=list(d=c("h","f","e","g"), e=c("h","f","e","g"), c=c("f","h","e","g")), a=list(e=c("g","e","f","h"), d=c("e","g","f","h"), c=c("e","g","f","h")))), - sapply(l, sapply, sapply, nrow) == rep(c(1L,1L,0L,0L), 6), - sapply(l, sapply, sapply, ncol) == rep(4L, 24) -)) -l = split(fdt, by = c("x3","x1"), drop=TRUE, flatten=FALSE) # multi col rev -test(1639.58, TRUE, all( - is.list(l), identical(names(l), c("h","f","g","e")), - sapply(l, function(x) !is.data.table(x) && is.list(x)), - identical(lapply(l, names), list(h=c("b"), f=c("b"), g=c("a"), e=c("a"))), - sapply(l, sapply, nrow) == rep(3L, 4), - sapply(l, sapply, ncol) == rep(4L, 8) -)) -l = split(fdt, by = c("x3","x1"), flatten=FALSE) # x1 has empty levels after split on x3 first -test(1639.59, TRUE, all( - is.list(l), identical(names(l), c("h","f","g","e")), - sapply(l, function(x) !is.data.table(x) && is.list(x)), - identical(lapply(l, names), list(h=c("b","a"), f=c("b","a"), g=c("a","b"), e=c("a","b"))), - sapply(l, sapply, nrow) == rep(c(3L,0L), 4), - sapply(l, sapply, ncol) == rep(4L, 8) -)) -l = split(fdt, by = c("x3","x2","x1"), drop = TRUE, flatten=FALSE) -test(1639.60, TRUE, all( - is.list(l), identical(names(l), c("h","f","g","e")), - sapply(l, function(x) !is.data.table(x) && is.list(x)), - sapply(l, sapply, function(x) !is.data.table(x) && is.list(x)), - identical(lapply(l, lapply, names), list(h=list(d=c("b"), e=c("b"), c=c("b")), f=list(e=c("b"), c=c("b"), d=c("b")), g=list(e=c("a"), d=c("a"), c=c("a")), e=list(e=c("a"), d=c("a"), c=c("a")))), - sapply(l, sapply, sapply, nrow) == rep(1L, 12), - sapply(l, sapply, sapply, ncol) == rep(4L, 12) -)) -sdf = split(as.data.frame(fdt), f=list(fdt$x1, fdt$x3)) # split.data.frame match -test(1639.61, unlist(split(fdt, by = c("x1","x3"), sorted = TRUE, flatten=FALSE), recursive = FALSE), lapply(sdf[sort(names(sdf))], setDT)) # vs split.data.frame by 2L drop=FALSE -sdf = split(as.data.frame(fdt), f=list(fdt$x1, fdt$x3), drop=TRUE) -test(1639.62, unlist(split(fdt, by = c("x1","x3"), sorted = TRUE, drop=TRUE, flatten=FALSE), recursive = FALSE), lapply(sdf[sort(names(sdf))], setDT)) # vs split.data.frame by 2L drop=TRUE -fdt = dt[, .(x1 = as.factor(c(as.character(x1), "c"))[-13L], # empty levels in factor and drop=FALSE - x2 = as.factor(c("a", as.character(x2)))[-1L], - x3 = as.factor(c("a", as.character(x3), "z"))[c(-1L,-14L)], - y = y)] -l = split(fdt, by = "x1") -test(1639.63, TRUE, all(is.list(l), identical(names(l), c("b","a","c")), sapply(l, is.data.table), sapply(l, nrow) == c(b=6L, a=6L, c=0L), sapply(l, ncol) == c(b=4L, a=4L, c=4L))) -l = split(fdt, by = "x2") -test(1639.64, TRUE, all(is.list(l), identical(names(l), c("d","e","c","a")), sapply(l, is.data.table), sapply(l, nrow) == c(d=4L, e=4L, c=4L, a=0L), sapply(l, ncol) == c(d=4L, e=4L, c=4L, a=4L))) -l = split(fdt, by = c("x3","x1"), flatten=FALSE) -test(1639.65, TRUE, all( - is.list(l), identical(names(l), c("h","f","g","e","a","z")), - sapply(l, function(x) !is.data.table(x) && is.list(x)), - identical(lapply(l, names), list(h=c("b","a","c"), f=c("b","a","c"), g=c("a","b","c"), e=c("a","b","c"), a=c("a","b","c"), z=c("a","b","c"))), - sapply(l, sapply, nrow) == c(rep(c(3L,0L,0L), 4), rep(0L, 6)), - sapply(l, sapply, ncol) == rep(4L, 18) -)) -l = split(fdt, by = "x1", drop=TRUE) # empty levels in factor and drop=TRUE -test(1639.66, TRUE, all(is.list(l), identical(names(l), c("b","a")), sapply(l, is.data.table), sapply(l, nrow) == c(b=6L, a=6L), sapply(l, ncol) == c(b=4L, a=4L))) -l = split(fdt, by = "x2", drop=TRUE) -test(1639.67, TRUE, all(is.list(l), identical(names(l), c("d","e","c")), sapply(l, is.data.table), sapply(l, nrow) == c(d=4L, e=4L, c=4L), sapply(l, ncol) == c(d=4L, e=4L, c=4L))) -l = split(fdt, by = c("x3","x1"), drop=TRUE, flatten=FALSE) -test(1639.68, TRUE, all( - is.list(l), identical(names(l), c("h","f","g","e")), - sapply(l, function(x) !is.data.table(x) && is.list(x)), - identical(lapply(l, names), list(h=c("b"), f=c("b"), g=c("a"), e=c("a"))), - sapply(l, sapply, nrow) == rep(3L, 4), - sapply(l, sapply, ncol) == rep(4L, 4) -)) -l = split(fdt, by = c("x3","x1"), sorted=TRUE, flatten=FALSE) # test order for empty levels in factor and drop=FALSE -test(1639.69, TRUE, all( - is.list(l), identical(names(l), c("a","e","f","g","h","z")), - sapply(l, function(x) !is.data.table(x) && is.list(x)), - identical(lapply(l, names), setNames(rep(list(c("a","b","c")), 6), c("a","e","f","g","h","z"))), - sapply(l, sapply, nrow) == c(0L,0L,0L,3L,0L,0L,0L,3L,0L,3L,0L,0L,0L,3L,0L,0L,0L,0L), - sapply(l, sapply, ncol) == rep(4L, 18) -)) -l = split(fdt, by = c("x3","x1"), sorted=TRUE, drop=TRUE, flatten=FALSE) # test order for empty levels in factor and drop=TRUE -test(1639.70, TRUE, all( - is.list(l), identical(names(l), c("e","f","g","h")), - sapply(l, function(x) !is.data.table(x) && is.list(x)), - identical(lapply(l, names), list(e=c("a"), f=c("b"), g=c("a"), h=c("b"))), - sapply(l, sapply, nrow) == rep(3L, 4), - sapply(l, sapply, ncol) == rep(4L, 4) -)) -sdf = split(as.data.frame(fdt), list(fdt$x3, fdt$x1)) # split.data.frame match on by = 2L and empty levels, drop=FALSE -test(1639.71, unlist(split(fdt, by = c("x3","x1"), sorted=TRUE, flatten=FALSE), recursive = FALSE), lapply(sdf[sort(names(sdf))], setDT)) -sdf = split(as.data.frame(fdt), list(fdt$x3, fdt$x1), drop=TRUE) # split.data.frame match on by = 2L and empty levels, drop=TRUE -test(1639.72, unlist(split(fdt, by = c("x3","x1"), sorted=TRUE, drop=TRUE, flatten=FALSE), recursive = FALSE), lapply(sdf[sort(names(sdf))], setDT)) -# - [x] split by reference to column names - `by` - factor and character column ---- -fdt = dt[, .(x1 = x1, - x2 = x2, - x3 = as.factor(x3), - y = y)] -l = split(fdt, by = c("x2","x3"), flatten=FALSE) -test(1639.73, TRUE, all( - is.list(l), identical(names(l), c("d","e","c")), - sapply(l, function(x) !is.data.table(x) && is.list(x)), - identical(lapply(l, names), list(d=c("h","f","e","g"), e=c("h","f","g","e"), c=c("f","h","e","g"))), - sapply(l, sapply, nrow) == rep(1L, 12), - sapply(l, sapply, ncol) == rep(4L, 4) -)) -l = split(fdt, by = c("x1","x2","x3"), flatten=FALSE) # empty levels in x3 after subset on x1, x2 -test(1639.74, TRUE, all( - is.list(l), identical(names(l), c("b","a")), - sapply(l, function(x) !is.data.table(x) && is.list(x)), - sapply(l, sapply, function(x) !is.data.table(x) && is.list(x)), - identical(lapply(l, lapply, names), list(b=list(d=c("h","f","e","g"), e=c("h","f","e","g"), c=c("f","h","e","g")), a=list(e=c("g","e","f","h"), d=c("e","g","f","h"), c=c("e","g","f","h")))), - sapply(l, sapply, sapply, nrow) == rep(c(1L,1L,0L,0L), 6), - sapply(l, sapply, sapply, ncol) == rep(4L, 24) -)) -l = split(fdt, by = c("x1","x2","x3"), drop=TRUE, flatten=FALSE) -test(1639.75, TRUE, all( - is.list(l), identical(names(l), c("b","a")), - sapply(l, function(x) !is.data.table(x) && is.list(x)), - sapply(l, sapply, function(x) !is.data.table(x) && is.list(x)), - identical(lapply(l, lapply, names), list(b=list(d=c("h","f"), e=c("h","f"), c=c("f","h")), a=list(e=c("g","e"), d=c("e","g"), c=c("e","g")))), - sapply(l, sapply, sapply, nrow) == rep(1L, 12), - sapply(l, sapply, sapply, ncol) == rep(4L, 12) -)) -l = split(fdt, by = c("x3","x1"), flatten=FALSE) # multi col rev -test(1639.76, TRUE, all( - is.list(l), identical(names(l), c("h","f","g","e")), - sapply(l, function(x) !is.data.table(x) && is.list(x)), - identical(lapply(l, names), list(h=c("b"), f=c("b"), g=c("a"), e=c("a"))), - sapply(l, sapply, nrow) == rep(3L, 4), - sapply(l, sapply, ncol) == rep(4L, 4) -)) -l = split(fdt, by = c("x3","x2","x1"), flatten=FALSE) -test(1639.77, TRUE, all( - is.list(l), identical(names(l), c("h","f","g","e")), - sapply(l, function(x) !is.data.table(x) && is.list(x)), - sapply(l, sapply, function(x) !is.data.table(x) && is.list(x)), - identical(lapply(l, lapply, names), list(h=list(d=c("b"), e=c("b"), c=c("b")), f=list(e=c("b"), c=c("b"), d=c("b")), g=list(e=c("a"), d=c("a"), c=c("a")), e=list(e=c("a"), d=c("a"), c=c("a")))), - sapply(l, sapply, sapply, nrow) == rep(1L, 12), - sapply(l, sapply, sapply, ncol) == rep(4L, 12) -)) -fdt = dt[, .(x1 = x1, # empty levels in factor and drop=FALSE - x2 = x2, - x3 = as.factor(c("a", as.character(x3), "z"))[c(-1L,-14L)], - y = y)] -l = split(fdt, by = c("x3","x1"), flatten=FALSE) # empty levels in factor and drop=FALSE -test(1639.78, TRUE, all( - is.list(l), identical(names(l), c("h","f","g","e","a","z")), - sapply(l, function(x) !is.data.table(x) && is.list(x)), - identical(lapply(l, names), list(h=c("b"), f=c("b"), g=c("a"), e=c("a"), a=character(), z=character())), - identical(lapply(l, lapply, nrow), list(h=list(b=3L), f=list(b=3L), g=list(a=3L), e=list(a=3L), a=structure(list(), .Names = character(0)), z=structure(list(), .Names = character(0)))), - identical(lapply(l, lapply, ncol), list(h=list(b=4L), f=list(b=4L), g=list(a=4L), e=list(a=4L), a=structure(list(), .Names = character(0)), z=structure(list(), .Names = character(0)))) -)) - -l = split(fdt, by = c("x3","x1"), drop=TRUE, flatten=FALSE) # empty levels in factor and drop=TRUE -test(1639.79, TRUE, all( - is.list(l), identical(names(l), c("h","f","g","e")), - sapply(l, function(x) !is.data.table(x) && is.list(x)), - identical(lapply(l, names), list(h=c("b"), f=c("b"), g=c("a"), e=c("a"))), - sapply(l, sapply, nrow) == rep(3L, 4), - sapply(l, sapply, ncol) == rep(4L, 4) -)) -l = split(fdt, by = c("x3","x1"), sorted=TRUE, flatten=FALSE) # test order for empty levels in factor and drop=FALSE -test(1639.80, TRUE, all( - is.list(l), identical(names(l), c("a","e","f","g","h","z")), - sapply(l, function(x) !is.data.table(x) && is.list(x)), - identical(lapply(l, names), list(a=character(), e=c("a"), f=c("b"), g=c("a"), h=c("b"), z=character())), - identical(lapply(l, lapply, nrow), list(a=structure(list(), .Names = character(0)), e=list(a=3L), f=list(b=3L), g=list(a=3L), h=list(b=3L), z=structure(list(), .Names = character(0)))), - identical(lapply(l, lapply, ncol), list(a=structure(list(), .Names = character(0)), e=list(a=4L), f=list(b=4L), g=list(a=4L), h=list(b=4L), z=structure(list(), .Names = character(0)))) -)) -l = split(fdt, by = c("x3","x1"), sorted=TRUE, drop=TRUE, flatten=FALSE) # test order for empty levels in factor and drop=TRUE -test(1639.81, TRUE, all( - is.list(l), identical(names(l), c("e","f","g","h")), - sapply(l, function(x) !is.data.table(x) && is.list(x)), - identical(lapply(l, names), list(e=c("a"), f=c("b"), g=c("a"), h=c("b"))), - sapply(l, sapply, nrow) == rep(3L, 4), - sapply(l, sapply, ncol) == rep(4L, 4) -)) -# - [x] split by reference to column names - `by` - for character column ---- -l = split(dt, by = "x1") # single col -test(1639.82, TRUE, all(is.list(l), identical(names(l), c("b","a")), sapply(l, is.data.table), sapply(l, nrow) == c(b=6L, a=6L), sapply(l, ncol) == c(b=4L, a=4L))) -l = split(dt, by = "x2") -test(1639.83, TRUE, all(is.list(l), identical(names(l), c("d","e","c")), sapply(l, is.data.table), sapply(l, nrow) == c(d=4L, e=4L, c=4L), sapply(l, ncol) == c(d=4L, e=4L, c=4L))) -l = split(dt, by = "x3") -test(1639.84, TRUE, all(is.list(l), identical(names(l), c("h","f","g","e")), sapply(l, is.data.table), sapply(l, nrow) == c(h=3L, f=3L, g=3L, e=3L), sapply(l, ncol) == c(h=4L, f=4L, g=4L, e=4L))) -l = split(dt, by = c("x1","x2"), flatten=FALSE) # multi col -test(1639.85, TRUE, all( - is.list(l), identical(names(l), c("b","a")), - sapply(l, function(x) !is.data.table(x) && is.list(x)), - identical(lapply(l, names), list(b=c("d","e","c"), a=c("e","d","c"))), - sapply(l, sapply, nrow) == rep(2L, 6), - sapply(l, sapply, ncol) == rep(4L, 6) -)) -l = split(dt, by = c("x1","x3"), flatten=FALSE) -test(1639.86, TRUE, all( - is.list(l), identical(names(l), c("b","a")), - sapply(l, function(x) !is.data.table(x) && is.list(x)), - identical(lapply(l, names), list(b=c("h","f"), a=c("g","e"))), - sapply(l, sapply, nrow) == rep(3L, 4), - sapply(l, sapply, ncol) == rep(4L, 4) -)) -l = split(dt, by = c("x2","x3"), flatten=FALSE) -test(1639.87, TRUE, all( - is.list(l), identical(names(l), c("d","e","c")), - sapply(l, function(x) !is.data.table(x) && is.list(x)), - identical(lapply(l, names), list(d=c("h","f","e","g"), e=c("h","f","g","e"), c=c("f","h","e","g"))), - sapply(l, sapply, nrow) == rep(1L, 12), - sapply(l, sapply, ncol) == rep(4L, 4) -)) -l = split(dt, by = c("x1","x2","x3"), flatten=FALSE) -test(1639.88, TRUE, all( - is.list(l), identical(names(l), c("b","a")), - sapply(l, function(x) !is.data.table(x) && is.list(x)), - sapply(l, sapply, function(x) !is.data.table(x) && is.list(x)), - identical(lapply(l, lapply, names), list(b=list(d=c("h","f"), e=c("h","f"), c=c("f","h")), a=list(e=c("g","e"), d=c("e","g"), c=c("e","g")))), - sapply(l, sapply, sapply, nrow) == rep(1L, 12), - sapply(l, sapply, sapply, ncol) == rep(4L, 12) -)) -l = split(dt, by = c("x3","x1"), flatten=FALSE) # multi col rev -test(1639.89, TRUE, all( - is.list(l), identical(names(l), c("h","f","g","e")), - sapply(l, function(x) !is.data.table(x) && is.list(x)), - identical(lapply(l, names), list(h=c("b"), f=c("b"), g=c("a"), e=c("a"))), - sapply(l, sapply, nrow) == rep(3L, 4), - sapply(l, sapply, ncol) == rep(4L, 4) -)) -l = split(dt, by = c("x3","x2","x1"), flatten=FALSE) -test(1639.90, TRUE, all( - is.list(l), identical(names(l), c("h","f","g","e")), - sapply(l, function(x) !is.data.table(x) && is.list(x)), - sapply(l, sapply, function(x) !is.data.table(x) && is.list(x)), - identical(lapply(l, lapply, names), list(h=list(d="b", e="b", c="b"), f=list(e="b", c="b", d="b"), g=list(e="a", d="a", c="a"), e=list(e="a",d="a",c="a"))), - sapply(l, sapply, sapply, nrow) == rep(1L, 12), - sapply(l, sapply, sapply, ncol) == rep(4L, 12) -)) -# - [x] allow to keep or drop field on which we split - `keep.by` argument ---- -l = split(dt, by = "x1", keep.by = FALSE) -test(1639.91, TRUE, all(is.list(l), identical(names(l), c("b","a")), sapply(l, is.data.table), sapply(l, nrow) == c(b=6L, a=6L), sapply(l, ncol) == c(b=3L, a=3L))) -l = split(dt, by = "x2", keep.by = FALSE) -test(1639.92, TRUE, all(is.list(l), identical(names(l), c("d","e","c")), sapply(l, is.data.table), sapply(l, nrow) == c(d=4L, e=4L, c=4L), sapply(l, ncol) == c(d=3L, e=3L, c=3L))) -l = split(dt, by = "x3", keep.by = FALSE) -test(1639.93, TRUE, all(is.list(l), identical(names(l), c("h","f","g","e")), sapply(l, is.data.table), sapply(l, nrow) == c(h=3L, f=3L, g=3L, e=3L), sapply(l, ncol) == c(h=3L, f=3L, g=3L, e=3L))) -l = split(dt, by = c("x1","x2"), keep.by = FALSE, flatten=FALSE) # multi col -test(1639.94, TRUE, all( - is.list(l), identical(names(l), c("b","a")), - sapply(l, function(x) !is.data.table(x) && is.list(x)), - identical(lapply(l, names), list(b=c("d","e","c"), a=c("e","d","c"))), - sapply(l, sapply, nrow) == rep(2L, 6), - sapply(l, sapply, ncol) == rep(2L, 6) -)) -l = split(dt, by = c("x1","x3"), keep.by = FALSE, flatten=FALSE) -test(1639.95, TRUE, all( - is.list(l), identical(names(l), c("b","a")), - sapply(l, function(x) !is.data.table(x) && is.list(x)), - identical(lapply(l, names), list(b=c("h","f"), a=c("g","e"))), - sapply(l, sapply, nrow) == rep(3L, 4), - sapply(l, sapply, ncol) == rep(2L, 4) -)) -l = split(dt, by = c("x2","x3"), keep.by = FALSE, flatten=FALSE) -test(1639.96, TRUE, all( - is.list(l), identical(names(l), c("d","e","c")), - sapply(l, function(x) !is.data.table(x) && is.list(x)), - identical(lapply(l, names), list(d=c("h","f","e","g"), e=c("h","f","g","e"), c=c("f","h","e","g"))), - sapply(l, sapply, nrow) == rep(1L, 12), - sapply(l, sapply, ncol) == rep(2L, 12) -)) -l = split(dt, by = c("x1","x2","x3"), keep.by = FALSE, flatten=FALSE) -test(1639.97, TRUE, all( - is.list(l), identical(names(l), c("b","a")), - sapply(l, function(x) !is.data.table(x) && is.list(x)), - sapply(l, sapply, function(x) !is.data.table(x) && is.list(x)), - identical(lapply(l, lapply, names), list(b=list(d=c("h","f"), e=c("h","f"), c=c("f","h")), a=list(e=c("g","e"), d=c("e","g"), c=c("e","g")))), - sapply(l, sapply, sapply, nrow) == rep(1L, 12), - sapply(l, sapply, sapply, ncol) == rep(1L, 12) -)) -l = split(dt, by = c("x3","x1"), keep.by = FALSE, flatten=FALSE) # multi col rev -test(1639.98, TRUE, all( - is.list(l), identical(names(l), c("h","f","g","e")), - sapply(l, function(x) !is.data.table(x) && is.list(x)), - identical(lapply(l, names), list(h=c("b"), f=c("b"), g=c("a"), e=c("a"))), - sapply(l, sapply, nrow) == rep(3L, 4), - sapply(l, sapply, ncol) == rep(2L, 4) -)) -l = split(dt, by = c("x3","x2","x1"), keep.by = FALSE, flatten=FALSE) -test(1639.99, TRUE, all( - is.list(l), identical(names(l), c("h","f","g","e")), - sapply(l, function(x) !is.data.table(x) && is.list(x)), - sapply(l, sapply, function(x) !is.data.table(x) && is.list(x)), - identical(lapply(l, lapply, names), list(h=list(d="b", e="b", c="b"), f=list(e="b", c="b", d="b"), g=list(e="a", d="a", c="a"), e=list(e="a",d="a",c="a"))), - sapply(l, sapply, sapply, nrow) == rep(1L, 12), - sapply(l, sapply, sapply, ncol) == rep(1L, 12) -)) -# - [x] support recursive split into nested lists for `length(by) > 2L` (default) and `flatten` arg to produce non-nested list of data.table ---- -fdt = dt[, c(lapply(.SD, as.factor), list(y=y)), .SDcols=x1:x3] # factors, flatten consistent to non-flatten length(by)==1L -test(1639.100, split(fdt, by = "x1"), split(fdt, by = "x1", flatten = FALSE)) # length(by) == 1L should be same as flatten=FALSE # ref data already checked in above test -test(1639.101, split(fdt, by = "x2"), split(fdt, by = "x2", flatten = FALSE)) -test(1639.102, split(fdt, by = "x3"), split(fdt, by = "x3", flatten = FALSE)) -test(1639.103, split(fdt, by = "x1", sorted = TRUE), split(fdt, by = "x1", flatten = FALSE, sorted = TRUE)) -test(1639.104, split(fdt, by = "x3", sorted = TRUE), split(fdt, by = "x3", flatten = FALSE, sorted = TRUE)) -test(1639.105, split(fdt, by = "x1", sorted = TRUE, drop = TRUE), split(fdt, by = "x1", flatten = FALSE, sorted = TRUE, drop = TRUE)) -test(1639.106, split(fdt, by = "x1", sorted = TRUE, keep.by = FALSE), split(fdt, by = "x1", flatten = FALSE, sorted = TRUE, keep.by = FALSE)) -test(1639.107, unlist(split(fdt, by = c("x1","x2"), sorted = TRUE, flatten = FALSE), recursive = FALSE), split(fdt, by = c("x1","x2"), sorted = TRUE)) # by two variables - match after unlist nested one # sorted=TRUE -test(1639.108, unlist(split(fdt, by = c("x1","x2"), sorted = FALSE, flatten = FALSE), recursive = FALSE), split(fdt, by = c("x1","x2"), sorted = FALSE)) # sorted=FALSE -test(1639.109, unlist(split(fdt, by = c("x1","x2"), sorted = TRUE, keep.by = FALSE, flatten = FALSE), recursive = FALSE), split(fdt, by = c("x1","x2"), sorted = TRUE, keep.by = FALSE)) # drop.by=TRUE -sdf = split(as.data.frame(fdt), f=list(fdt$x1, fdt$x2)) # vs split.data.frame by 2L # this will dispatch to `interaction(x1, x2)` which results into different order, see: levels(interaction(1:2,1:2)) vs CJ(1:2,1:2) -test(1639.110, split(fdt, by = c("x1","x2"), sorted = TRUE), lapply(sdf[sort(names(sdf))], setDT))# vs split.data.frame by 2L drop=FALSE -test(1639.111, unlist(split(fdt, by = c("x1","x2"), flatten = FALSE, sorted = TRUE), recursive = FALSE), lapply(sdf[sort(names(sdf))], setDT))# vs split.data.frame by 2L drop=FALSE, flatten=FALSE + unlist -sdf = split(as.data.frame(fdt), f=list(fdt$x1, fdt$x2), drop=TRUE) -test(1639.112, split(fdt, by = c("x1","x2"), sorted = TRUE, drop=TRUE), lapply(sdf[sort(names(sdf))], setDT)) # vs split.data.frame by 2L drop=TRUE -sdf = split(as.data.frame(fdt), f=list(fdt$x1, fdt$x2, fdt$x3)) # vs split.data.frame by 3L -test(1639.113, split(fdt, by = c("x1","x2","x3"), flatten = TRUE, sorted = TRUE), lapply(sdf[sort(names(sdf))], setDT)) # vs split.data.frame by 3L drop=FALSE -sdf = split(as.data.frame(fdt), f=list(fdt$x1, fdt$x2, fdt$x3), drop=TRUE) -test(1639.114, split(fdt, by = c("x1","x2","x3"), flatten = TRUE, sorted = TRUE, drop=TRUE), lapply(sdf[sort(names(sdf))], setDT)) # vs split.data.frame by 3L drop=TRUE -fdt = dt[, .(x1 = as.factor(c(as.character(x1), "c"))[-13L], # empty levels in factors - x2 = as.factor(c("a", as.character(x2)))[-1L], - x3 = as.factor(c("a", as.character(x3), "z"))[c(-1L,-14L)], - y = y)] -sdf = split(as.data.frame(fdt), f=list(fdt$x1, fdt$x2)) # vs split.data.frame by 2L # this will dispatch to `interaction(x1, x2)` which results into different order, see: levels(interaction(1:2,1:2)) vs CJ(1:2,1:2) -test(1639.115, split(fdt, by = c("x1","x2"), sorted = TRUE), lapply(sdf[sort(names(sdf))], setDT)) # vs split.data.frame by 2L drop=FALSE -test(1639.116, unlist(split(fdt, by = c("x1","x2"), flatten = FALSE, sorted = TRUE), recursive = FALSE), lapply(sdf[sort(names(sdf))], setDT)) # vs split.data.frame by 2L drop=FALSE, flatten=FALSE + unlist -sdf = split(as.data.frame(fdt), f=list(fdt$x1, fdt$x2), drop=TRUE) -test(1639.117, split(fdt, by = c("x1","x2"), sorted = TRUE, drop=TRUE), lapply(sdf[sort(names(sdf))], setDT)) # vs split.data.frame by 2L drop=TRUE -sdf = split(as.data.frame(fdt), f=list(fdt$x1, fdt$x2, fdt$x3)) # vs split.data.frame by 3L -test(1639.118, split(fdt, by = c("x1","x2","x3"), flatten = TRUE, sorted = TRUE), lapply(sdf[sort(names(sdf))], setDT)) # vs split.data.frame by 3L drop=FALSE -sdf = split(as.data.frame(fdt), f=list(fdt$x1, fdt$x2, fdt$x3), drop=TRUE) -test(1639.119, split(fdt, by = c("x1","x2","x3"), flatten = TRUE, sorted = TRUE, drop=TRUE), lapply(sdf[sort(names(sdf))], setDT)) # vs split.data.frame by 3L drop=TRUE -sdf = split(as.data.frame(fdt[, .SD, .SDcols=c("x3","y")]), f=list(fdt$x1, fdt$x2)) # flatten drop.by and empty lists # this will dispatch to `interaction(x1, x2)` which results into different order, see: levels(interaction(1:2,1:2)) vs CJ(1:2,1:2) -test(1639.120, split(fdt, by = c("x1","x2"), sorted = TRUE, keep.by = FALSE), lapply(sdf[sort(names(sdf))], setDT)) # vs split.data.frame by 2L drop=FALSE -test(1639.121, unlist(split(fdt, by = c("x1","x2"), flatten = FALSE, sorted = TRUE, keep.by = FALSE), recursive = FALSE), lapply(sdf[sort(names(sdf))], setDT)) # vs split.data.frame by 2L drop=FALSE, flatten=FALSE + unlist -sdf = split(as.data.frame(fdt[, .SD, .SDcols=c("x3","y")]), f=list(fdt$x1, fdt$x2), drop=TRUE) -test(1639.122, split(fdt, by = c("x1","x2"), sorted = TRUE, drop=TRUE, keep.by = FALSE), lapply(sdf[sort(names(sdf))], setDT)) # vs split.data.frame by 2L drop=TRUE -# - [x] edge cases for `by` and `sorted`, 0 rows, 1 unique value in cols, drop ---- -test(1639.123, length(split(dt[0L], by = "x1")), 0L) # drop=FALSE vs split.data.frame expand list with empty levels won't work on characters, use factor with defined levels, included those unused. -test(1639.124, length(split(as.data.frame(dt[0L]), df$x1)), 2L) # unlike data.frame because character != factor -fdt = dt[, c(lapply(.SD, as.factor), list(y=y)), .SDcols=x1:x3] # factors no empty levels -test(1639.125, length(split(fdt[0L], by = "x1")), 2L) -test(1639.126, length(split(as.data.frame(fdt[0L]), df$x1)), 2L) # match on factors work -test(1639.127, split(fdt[0L], by = "x1"), lapply(split(as.data.frame(fdt[0L]), df$x1), setDT)) # we match also on complete structure -fdt = dt[, .(x1 = as.factor(c(as.character(x1), "c"))[-13L], # factors empty levels - x2 = as.factor(c("a", as.character(x2)))[-1L], - x3 = as.factor(c("a", as.character(x3), "z"))[c(-1L,-14L)], - y = y)] -sdf = split(as.data.frame(fdt), f=list(fdt$x1, fdt$x2)) # vs split.data.frame by 2L# this will dispatch to `interaction(x1, x2)` which results into different order, see: levels(interaction(1:2,1:2)) vs CJ(1:2,1:2) -test(1639.128, split(fdt, by = c("x1","x2"), sorted = TRUE), lapply(sdf[sort(names(sdf))], setDT)) # vs split.data.frame by 2L drop=FALSE -sdf = split(as.data.frame(fdt), f=list(fdt$x1, fdt$x2), drop=TRUE) -test(1639.129, split(fdt, by = c("x1","x2"), sorted = TRUE, drop=TRUE), lapply(sdf[sort(names(sdf))], setDT)) # vs split.data.frame by 2L drop=TRUE -test(1639.130, split(dt[0L], by = "x1"), structure(list(), .Names = character(0))) # 0 nrow character/factor with empty levels # no empty levels -test(1639.131, split(fdt[0L], by = "x1"), lapply(c(a=1L,b=2L,c=3L), function(i) data.table(x1=factor(levels = c("a","b","c")),x2=factor(levels = c("a","c","d","e")),x3=factor(levels = c("a","e","f","g","h","z")),y=numeric()))) # expand empty levels -test(1639.132, split(dt[0L], by = "x1", sorted = TRUE), structure(list(), .Names = character(0))) -test(1639.133, split(fdt[0L], by = "x1", sorted = TRUE), lapply(c(a=1L,b=2L,c=3L), function(i) data.table(x1=factor(levels = c("a","b","c")),x2=factor(levels = c("a","c","d","e")),x3=factor(levels = c("a","e","f","g","h","z")),y=numeric()))) # same as none sorted as all appended on the end in sorted order due to lack of data -dt2 = copy(dt)[, "l" := lapply(1:12, function(i) i)] # non-atomic type to 'by' should raise error -test(1639.134, split(dt2, by = "l"), error = "argument 'by' must refer only to atomic type columns, classes of 'l' columns are not atomic type") -# - [x] additional tests for names consistency with data.frame, and current examples in SO -df = data.frame(product = c("b", "a", "b", "a"), - value = c(sample(1:10,4)), - year = c(2001, 2001, 2000, 2000)) -tmp = as.data.table(df)[, list(grp=list(.SD)), by=.(product, year), .SDcols=names(df)] # http://stackoverflow.com/a/33068928/2490497 -setattr(ans <- tmp$grp, 'names', paste(tmp$product, tmp$year, sep=".")) -dt = as.data.table(df) # http://stackoverflow.com/q/33068791/2490497 -dt[, grp := .GRP, by = list(product,year)] -setkey(dt, grp) -o2 = dt[, list(list(.SD)), by = grp]$V1 -setattr(o2, 'names', paste(tmp$product, tmp$year, sep=".")) # names reused -test(1639.135, o2, ans) -lapply(ans, setattr, ".data.table.locked", NULL) -sort.by.names = function(x) x[sort(names(x))] -test(1639.136, sort.by.names(ans), sort.by.names(split(as.data.table(df), f=list(df$product, df$year)))) -test(1639.137, sort.by.names(ans), sort.by.names(unlist(split(setDT(df), by=c("product","year"), flatten = FALSE), recursive = FALSE))) -test(1639.138, ans, split(as.data.table(df), by=c("product","year"))) -test(1639.139, sort.by.names(ans), sort.by.names(unlist(split(as.data.table(df), by=c("product","year"), flatten=FALSE), recursive = FALSE))) -# test if split preallocate columns in results #1908 -dt = data.table(x=rexp(100),y=rep(LETTERS[1:10], 10)) -dtL = split(dt, by = "y") -test(1639.140, dim(dtL[[1]][, x2 := -x]), c(10L,3L)) -test(1639.141, all(sapply(dtL, truelength) > 1000)) - -# allow x's cols (specifically x's join cols) to be referred to using 'x.' syntax -# patch for #1615. Note that I specifically have not implemented x[y, aa, on=c(aa="bb")] -# to refer to x's join column as well because x[i, col] == x[i][, col] will not be TRUE anymore.. -x <- data.table(aa = 1:3, cc = letters[1:3]) -y <- data.table(bb = 3:5, dd = 3:1) -test(1640.1, x[y, x.aa, on=c(aa="bb")], INT(3,NA,NA)) -test(1640.2, x[y, c(.SD, .(x.aa=x.aa)), on=c(aa="bb")], data.table(aa=3:5, cc=c("c", NA,NA), x.aa=INT(3,NA,NA))) - -# tests for non-equi joins -# function to create a random data.table with all necessary columns -nq_fun = function(n=100L) { - i1 = sample(sample(n, 10L), n, TRUE) - i2 = sample(-n/2:n/2, n, TRUE) - i3 = sample(-1e6:1e6, n, TRUE) - i4 = sample(c(NA_integer_, sample(-n:n, 10L, FALSE)), n, TRUE) - - d1 = sample(rnorm(10L), n, TRUE) - d2 = sample(rnorm(50), n, TRUE) - d3 = sample(c(Inf, -Inf, NA, NaN, runif(10L)), n, TRUE) - d4 = sample(c(NA, NaN, rnorm(10L)), n, TRUE) - - c1 = sample(letters[1:5], n, TRUE) - c2 = sample(LETTERS[1:15], n, TRUE) - - dt = data.table(i1,i2,i3,i4, d1,d2,d3,d4, c1,c2) - if (test_bit64) { - I1 = as.integer64(sample(sample(n, 10L), n, TRUE)) - I2 = as.integer64(sample(-n/2:n/2, n, TRUE)) - I3 = as.integer64(sample(-1e6:1e6, n, TRUE)) - I4 = as.integer64(sample(c(NA_integer_, sample(-n:n, 10L, FALSE)), n, TRUE)) - dt = cbind(dt, data.table(I1,I2,I3,I4)) - } - dt -} - -nqjoin_test <- function(x, y, k=1L, test_no, mult="all") { - ops = c("==", ">=", "<=", ">", "<") - xclass = sapply(x, class) - runcmb = combn(names(x), k) - runcmb = as.data.table(runcmb[, 1:min(100L, ncol(runcmb)), drop=FALSE]) # max 100 combinations to test - runops = lapply(runcmb, function(cols) { - thisops = sample(ops, k, TRUE) - thisops[substring(cols,1,1)=="c"] = "==" - thisops - }) - is_only_na <- function(x) is.na(x) & !is.nan(x) - construct <- function(cols, vals, ops) { - expr = lapply(seq_along(cols), function(i) { - GT_or_LT = ops[i]==">" || ops[i]=="<" - if (inherits(vals[[i]], "integer64")) { - if (is.na.integer64(vals[[i]])) if (GT_or_LT) quote(logical()) else as.call(list(quote(is.na.integer64), as.name(cols[[i]]))) - else as.call(list(as.name(ops[[i]]), as.name(cols[[i]]), as.integer(vals[[i]]))) - # don't know how to construct a call with int64 -- vals[[i]] gets converted to NAN - } else { - if (is.nan(vals[[i]])) if (GT_or_LT) quote(logical(0)) else as.call(list(quote(is.nan), as.name(cols[[i]]))) - else if (is_only_na(vals[[i]])) if (GT_or_LT) quote(logical()) else as.call(list(quote(is_only_na), as.name(cols[[i]]))) - else as.call(list(as.name(ops[[i]]), as.name(cols[[i]]), vals[[i]])) - } - }) - Reduce(function(x,y)call("&",x,y), expr) - } - check <- function(x, y, cols, ops, mult="all") { - # gather just row numbers here and then select all rows once afterwards, rather than rbindlist - rowNums = unlist(lapply(1:nrow(y), function(i) { - e = construct(cols, y[i, ..cols], ops) - rowNums = which(with(x, eval(e))) # raw expression, isolated from both [.data.table overhead and subset optimization - if (!length(rowNums) || mult=="all") - rowNums - else if (mult=="first") - rowNums[1L] - else # mult=="last" - rowNums[length(rowNums)] - })) - x[rowNums] - } - nq <- function(x, y, cols, ops, nomatch=0L, mult="all") { - sd_cols = c(paste0("x.", cols), setdiff(names(x), cols)) - ans = x[y, mget(sd_cols, as.environment(-1)), on = paste0(cols, ops, cols), allow=TRUE, nomatch=nomatch, mult=mult] - setnames(ans, gsub("^x[.]", "", names(ans))) - setcolorder(ans, names(x))[] - } - for (i in seq_along(runcmb)) { - thiscols = runcmb[[i]] - thisops = runops[[i]] - # cat("k = ", k, "\ti = ", i, "\t thiscols = [", paste0(thiscols,collapse=","), "]\t thisops = [", paste0(thisops,collapse=","), "]\t ", sep="") - ans1 = nq(x, y, thiscols, thisops, 0L, mult=mult) - ans2 = check(x, y, thiscols, thisops, mult=mult) - test_no = test_no + .001 - test(test_no, ans1, ans2) - } - gc() # no longer needed but left in place just in case, no harm -} - -if (TRUE) { # turn off temporarily using FALSE when using valgrind, as very slow - set.seed(1509611616L) - # this fixed seed is to test branch bmerge.c:433 for consistent coverage, issue #2346 - # 2nd pass with random seed too removed as taking too long, contributing towards win-builder/cran limits - - dt1 = nq_fun(400L) - dt2 = nq_fun(50L) - x = na.omit(dt1) - y = na.omit(dt2) - - # without NAs in x and i - nqjoin_test(x, y, 1L, 1641, mult="all") - nqjoin_test(x, y, 2L, 1642, mult="all") - nqjoin_test(x, y, 1L, 1643, mult="first") - nqjoin_test(x, y, 2L, 1644, mult="first") - nqjoin_test(x, y, 1L, 1645, mult="last") - nqjoin_test(x, y, 2L, 1646, mult="last") - - # with NAs in x and i - nqjoin_test(dt1, dt2, 1L, 1647, mult="all") - nqjoin_test(dt1, dt2, 2L, 1648, mult="all") - nqjoin_test(dt1, dt2, 1L, 1649, mult="first") - nqjoin_test(dt1, dt2, 2L, 1650, mult="first") - nqjoin_test(dt1, dt2, 1L, 1651, mult="last") - nqjoin_test(dt1, dt2, 2L, 1652, mult="last") -} - -# TODO: add tests for nomatch=NA.. -# tested, but takes quite some time.. so commenting for now -# nqjoin_test(x, y, 3L,1643.0) -# nqjoin_test(dt1,dt2,3L,1652.0) - -# nqjoin_test( x,dt2,1L,1644.0) # without NA only in x -# nqjoin_test( x,dt2,2L,1645.0) -# nqjoin_test( x,dt2,3L,1646.0) -# nqjoin_test(dt1, y,1L,1647.0) # without NA only in i -# nqjoin_test(dt1, y,2L,1648.0) -# nqjoin_test(dt1, y,3L,1649.0) - -# test for the issues Jan spotted... -dt = data.table(id="x", a=as.integer(c(3,8,8,15,15,15,16,22,22,25,25)), b=as.integer(c(9,10,25,19,22,25,38,3,9,7,28)), c=as.integer(c(22,33,44,14,49,44,40,25,400,52,77))) -set.seed(1L) -dt=dt[sample(.N)] -test(1653.1, uniqueN(dt[dt, .(x.id, x.a, x.b, x.c, i.id, i.a, i.b, i.c), which=FALSE, on = c("id==id","a>=a","b>=b"), allow.cartesian=TRUE]), 42L) -test(1653.2, x[y, .(x.i1, x.i2, x.i3, x.i4, x.d1, x.d2, x.d3, x.d4, x.c1, x.c2, i.i1, i.i2, i.i3, i.i4, i.d1, i.d2, i.d3, i.d4, i.c1, i.c2), on = c("i4==i4", "i1>=i1", "d4<=d4", "i3==i3", "d3>d3", "i2>i2", "d2>=d2", "d1>d1"), allow.cartesian = TRUE], x[y, .(x.i1, x.i2, x.i3, x.i4, x.d1, x.d2, x.d3, x.d4, x.c1, x.c2, i.i1, i.i2, i.i3, i.i4, i.d1, i.d2, i.d3, i.d4, i.c1, i.c2), on = c("i4==i4", "i1>=i1", "d4<=d4", "i3==i3", "d3>d3", "i2>i2", "d2>=d2", "d1>d1"), allow.cartesian = TRUE]) # ensuring there are no warnings here really.. - -# error on any op other than "==" on char type -dt1 = data.table(x=sample(letters[1:2], 10, TRUE), y=sample(c(1L,5L,7L), 10, TRUE), z=1:10, k=11:20) -dt2 = data.table(x=c("b", "a"), y=c(1L, 9L)) -test(1654, dt1[dt2, on="x>x"], error="Only '==' operator") - -# on= with .() syntax, #1257 -dt1 = data.table(x=sample(letters[1:2], 10, TRUE), y=sample(c(1L,5L,7L), 10, TRUE), z=1:10, k=11:20) -dt2 = data.table(x=c("b", "a"), y=c(1L, 9L)) -test(1655.1, dt1[dt2, on=.(x)], dt1[dt2, on="x"]) -test(1655.2, dt1[dt2, on=.(x==x)], dt1[dt2, on=c("x==x")]) -test(1655.3, dt1[dt2, on=.(x==x)], dt1[dt2, on=c("x"="x")]) -test(1655.4, dt1[dt2, on=.(y>=y)], dt1[dt2, on=c("y>=y")]) -test(1655.4, dt1[dt2, on=.(x==x, y>=y)], dt1[dt2, on=c("x==x", "y>=y")]) - -# Patching another issue spotted by Jan -dt = data.table(id="x", a=as.integer(c(3,8,8,15,15,15,16,22,22,25,25)), - b=as.integer(c(9,10,25,19,22,25,38,3,9,7,28)), - c=as.integer(c(22,33,44,14,49,44,40,25,400,52,77))) -set.seed(1L) -dt=dt[sample(.N)][, row_id := 1:.N] -test(1656, nrow(dt[dt, .(x.id, x.a, x.b, x.c, x.row_id, i.id, i.a, i.b, i.c, i.row_id), on = .(c,b<=b,id,a>=a), allow.cartesian = TRUE]), 12L) # just to check that there's no warning - -# between is vectorised, #534 -set.seed(1L) -dt = data.table(x=sample(3,10,TRUE), y=sample(2,10,TRUE), z=sample(5,10,TRUE)) -test(1657, dt[x %between% list(y,z)], dt[x>=y & x<=z]) - -oldverbose = options(datatable.verbose=FALSE) - -# fwrite tests -# without quoting -test(1658.1, fwrite(data.table(a=c(NA, 2, 3.01), b=c('foo', NA, 'bar'))), - output=c("a,b", ",foo", "2,", "3.01,bar")) - -# with quoting and qmethod="escape" -test(1658.2, fwrite(data.table( - a=c(NA, 2, 3.01), - `other column`=c('foo bar', NA, 'quote" and \\ bs \n and newline')), - quote=TRUE, qmethod="escape"), - output='"a","other column"\n,"foo bar"\n2,\n3.01,"quote\\" and \\\\ bs \n and newline"') - -# with quoting and qmethod="double" (default) -test(1658.3, fwrite(data.table( - a=c(NA, 1.2e-100, 3.01), - "other \"column"=c('foo bar', NA, 'quote" and \\ bs')), - quote=TRUE, qmethod="double"), - output='"a","other ""column"\n,"foo bar"\n1.2e-100,\n3.01,"quote"" and \\ bs"') - -# presence of " triggers auto quoting as well, #1925 -test(1658.4, fwrite(data.table(a=1:4, b=c('"foo','ba"r','baz"','a "quoted" region'))), - output='a,b\n1,"""foo"\n2,"ba""r"\n3,"baz"""\n4,"a ""quoted"" region"') -test(1658.5, fwrite(data.table(a=1:4, b=c('"foo','ba"r','baz"','a "quoted" region')), qmethod='escape'), - output='a,b\n1,"\\"foo"\n2,"ba\\"r"\n3,"baz\\""\n4,"a \\"quoted\\" region"') -# NB: sep2[2] triggering quoting when list columns are present is tested in test 1736 - -# changing sep -DT = data.table(a="foo", b="ba\"r") -ans = '"a";"b"\n"foo";"ba""r"' -test(1658.41, fwrite(DT, sep=";", quote=TRUE, qmethod="double"), output=ans) -test(1658.42, write.table(DT, sep=";", qmethod="double", row.names=FALSE), output=ans) -ans = '"a";"b"\n"foo";"ba\\"r"' -test(1658.43, fwrite(DT, sep=";", quote=TRUE, qmethod="escape"), output=ans) -test(1658.44, write.table(DT, sep=";", qmethod="escape", row.names=FALSE), output=ans) - -if (.Platform$OS.type=="unix") { - # on linux we can create windows format files if we want - test(1658.5, fwrite(data.table(a="foo", b="bar"), eol="\r\n", quote=TRUE), - output = '"a","b"\n"foo","bar"') -} - -# changing NA -test(1658.6, fwrite(data.table(a=c("foo", NA), b=c(1, NA)), na="NA", quote=TRUE), - output='"a","b"\n"foo",1\nNA,NA') - -# no col.names -test(1658.7, fwrite(data.table(a="foo", b="bar"), col.names=FALSE, quote=TRUE), - output='"foo","bar"') - -test(1658.8, fwrite(data.table(a=c(1:5), b=c(1:5)), quote=TRUE), - output='"a","b"\n1,1\n2,2\n3,3\n4,4\n5,5') - -# block size equal to number of rows -test(1658.9, fwrite(data.table(a=c(1:3), b=c(1:3)), quote=TRUE), - output='"a","b"\n1,1\n2,2\n3,3') - -# block size one bigger than number of rows -test(1658.11, fwrite(data.table(a=c(1:3), b=c(1:3)), quote=TRUE), - output='"a","b"\n1,1\n2,2\n3,3') - -# block size one less than number of rows -test(1658.12, fwrite(data.table(a=c(1:3), b=c(1:3)), quote=TRUE), - output='"a","b"\n1,1\n2,2\n3,3') - -# writing a data.frame -test(1658.13, fwrite(data.frame(a="foo", b="bar"), quote=TRUE), - output='"a","b"\n"foo","bar"') - -# single-column data.table -test(1658.14, fwrite(data.table(a=c(1,2,3)), quote=TRUE), - output='"a"\n1\n2\n3') - -# single-column data.frame -test(1658.15, fwrite(data.frame(a=c(1,2,3)), quote=TRUE), - output='"a"\n1\n2\n3') - -# different column types -test(1658.16, fwrite(data.table( - factor1=as.factor(c('foo', 'bar')), - factor2=as.factor(c(NA, "baz")), - bool=c(TRUE,NA), - ints=as.integer(c(NA, 5))), na='na', quote=TRUE, logical01=FALSE), - output='"factor1","factor2","bool","ints"\n"foo",na,TRUE,na\n"bar","baz",na,5') - -# empty data table (headers but no rows) -empty_dt <- data.table(a=1, b=2)[0,] -test(1658.17, fwrite(empty_dt, quote=TRUE), output='"a","b"') - -# data.table with duplicate column names -test(1658.18, fwrite(data.table(a=1, a=2), quote=TRUE), output='"a","a"\n1,2') - -# number of significant digits = 15 -test(1658.19, fwrite(data.table(a=1/0.9), quote=TRUE), output='"a"\n1.11111111111111') - -# test append -f = tempfile() -fwrite(data.table(a=c(1,2), b=c('a', 'b')), f, quote=TRUE) -fwrite(data.table(a=c(3,4), b=c('c', 'd')), f, append=TRUE, quote=TRUE) -test(1658.21, readLines(f), c('"a","b"','1,"a"','2,"b"','3,"c"','4,"d"')) -unlink(f) - -# simple data table (reference for the error cases below) -ok_dt <- data.table(foo="bar") -test(1658.22, fwrite(ok_dt, quote=TRUE), output='"foo"\n"bar"') - -# integer NA -DT = data.table(A=c(2L,NA,3L), B=c(NA,4:5)) -test(1658.23, fwrite(DT), output='A,B\n2,\n,4\n3,5') -test(1658.24, fwrite(DT, na="NA", verbose=TRUE), output='Writing column names.*"A","B".*2,NA\nNA,4\n3,5') - -options(oldverbose) - -# wrong argument types -test(1658.23, fwrite(ok_dt, 1), error="is.character\\(file\\).*not TRUE") -test(1658.24, fwrite(ok_dt, quote=123), error="identical\\(quote.*auto.*FALSE.*TRUE") -test(1658.25, fwrite(ok_dt, sep="..."), error="nchar(sep)") -test(1658.26, fwrite(ok_dt, qmethod=c("double", "double")), error="length(qmethod)") -test(1658.27, fwrite(ok_dt, col.names="foobar"), error="isLOGICAL(col.names)") - -# null data table (no columns) -test(1658.28, fwrite(data.table(a=1)[NULL,]), error="ncol(x) > 0L is not TRUE") - -# 0.0 written as 0, but TODO #2398, probably related to the 2 lines after l==0 missing coverage in writeFloat64 -test(1658.29, fwrite(data.table(id=c("A","B","C"), v=c(1.1,0.0,9.9))), output="id,v\nA,1.1\nB,0\nC,9.9") - -# logical NA as "NA" when logical01=TRUE, instead of the default na="" which writes all types including in character column as ,, consistently. -test(1658.30, fwrite(data.table(id=1:3,bool=c(TRUE,NA,FALSE)),na="NA",logical01=TRUE), output="\"id\",\"bool\"\n1,1\n2,NA\n3,0") - -## End fwrite tests - -# tests for #679, inrange(), FR #707 -dt = data.table(a=c(8,3,10,7,-10), val=runif(5)) -range = data.table(start = 1:5, end = 6:10) -test(1659.1, dt[a %inrange% range], dt[1:4]) -test(1659.2, dt[inrange(a, range$start, range$end)], dt[1:4]) -test(1659.3, dt[inrange(a, range$start, range$end, incbounds=FALSE)], dt[c(1,2,4)]) -range[4, `:=`(start=-12L, end=-4L)] -test(1659.4, dt[a %inrange% range], dt) - -# tests for non-equi joins returning columns correctly when j is missing -dt1 = fread('Chr Start End Region -chr6 3324 3360 Region1 -chr4 2445 2455 Region2 -chr1 1034 1090 Region4') -dt2 = fread('Site Chr Location Gene -Site1 chr4 2447 GeneB -Site2 chr9 1153 GeneT -Site3 chr6 3350 GeneM -Site4 chr1 1034 GeneC -Site5 chr1 2000 GeneU -Site6 chr6 3359 GeneF -Site7 chr7 1158 GeneI -Site8 chr4 2451 GeneO -Site9 chr6 3367 GeneZ ') -test(1660.1, names(dt2[dt1, on=.(Chr, Location>=Start, Location<=End)]), c(names(dt2), "Location.1", "Region")) -test(1660.2, names(dt1[dt2, on=.(Chr, Start<=Location, End>=Location)]), c(names(dt1), "Site", "Gene")) - -# `names<-` should NOT modify by reference #1015 -DT = data.table(x=1, y=2) -nn = names(DT) -test(1661.1, {names(DT) <- c("k", "m"); nn}, c("x","y")) -test(1661.2, names(DT), c("k","m")) - -# rbindlist support for complex type -dt1 = data.table(x=1L, y=2+3i) -dt2 = data.table(x=0:101, y=3+sample(102)*1i) -test(1665.1, rbindlist(list(dt1,dt2)), setDT(rbind(as.data.frame(dt1), as.data.frame(dt2)))) -# print method now works (when rows > 100 it uses rbind/rbindlist internally) -test(1665.2, ans <- capture.output(dt2), ans) # just checking that it doesn't error, really. - -# Use existing index even when auto index is disabled #1422 -d = data.table(k=3:1) # subset - no index -options("datatable.use.index"=TRUE, "datatable.auto.index"=TRUE) -test(1666.1, d[k==1L, verbose=TRUE], d[3L], output="Creating new index 'k'") -d = data.table(k=3:1) -options("datatable.use.index"=TRUE, "datatable.auto.index"=FALSE) -test(1666.2, grep("Creating new index", capture.output(d[k==1L, verbose=TRUE])), integer(0)) # do not create index -d = data.table(k=3:1) -options("datatable.use.index"=FALSE, "datatable.auto.index"=FALSE) -test(1666.3, grep("Creating new index", capture.output(d[k==1L, verbose=TRUE])), integer(0)) -d = data.table(k=3:1) -options("datatable.use.index"=FALSE, "datatable.auto.index"=TRUE) -test(1666.4, grep("Creating new index", capture.output(d[k==1L, verbose=TRUE])), integer(0)) -d = data.table(k=3:1) # subset - index -setindex(d, k) -options("datatable.use.index"=TRUE, "datatable.auto.index"=TRUE) -test(1666.5, d[k==1L, verbose=TRUE], d[3L], output="Optimized subsetting with index 'k'") -options("datatable.use.index"=TRUE, "datatable.auto.index"=FALSE) -test(1666.6, d[k==1L, verbose=TRUE], d[3L], output="Optimized subsetting with index 'k'") -options("datatable.use.index"=FALSE, "datatable.auto.index"=FALSE) -test(1666.7, grep("Using existing index", capture.output(d[k==1L, verbose=TRUE])), integer(0)) # not using existing index -options("datatable.use.index"=FALSE, "datatable.auto.index"=TRUE) -test(1666.8, grep("Using existing index", capture.output(d[k==1L, verbose=TRUE])), integer(0)) -d1 = data.table(k=3:1) # join - no index -d2 = data.table(k=2:4) -options("datatable.use.index"=TRUE, "datatable.auto.index"=TRUE) -test(1666.9, d1[d2, on="k", verbose=TRUE], d1[d2, on="k"], output="ad hoc") -options("datatable.use.index"=TRUE, "datatable.auto.index"=FALSE) -test(1666.11, d1[d2, on="k", verbose=TRUE], d1[d2, on="k"], output="ad hoc") -options("datatable.use.index"=FALSE, "datatable.auto.index"=FALSE) -test(1666.12, grep("Looking for existing (secondary) index", capture.output(d1[d2, on="k", verbose=TRUE])), integer(0)) # not looking for index -options("datatable.use.index"=FALSE, "datatable.auto.index"=TRUE) -test(1666.13, grep("Looking for existing (secondary) index", capture.output(d1[d2, on="k", verbose=TRUE])), integer(0)) -d1 = data.table(k=3:1,v1=10:12) # join - index -d2 = data.table(k=2:4,v2=20:22) -setindex(d1, k) -ans = data.table(k=2:4, v1=c(11L,10L,NA), v2=20:22) -options("datatable.use.index"=TRUE, "datatable.auto.index"=TRUE) -test(1666.14, d1[d2, on="k", verbose=TRUE], ans, output="existing index") -options("datatable.use.index"=TRUE, "datatable.auto.index"=FALSE) -test(1666.15, d1[d2, on="k", verbose=TRUE], ans, output="existing index") -options("datatable.use.index"=FALSE, "datatable.auto.index"=FALSE) -test(1666.16, d1[d2, on="k", verbose=TRUE], ans, output='ad hoc') -options("datatable.use.index"=FALSE, "datatable.auto.index"=TRUE) -test(1666.17, d1[d2, on="k", verbose=TRUE], ans, output='ad hoc') -# reset defaults -options("datatable.use.index"=TRUE, "datatable.auto.index"=TRUE) - -#testing fix to #1654 (dcast should only error when _using_ duplicated names) -DT <- data.table(a = 1:4, a = 1:4, id = rep(1:4, 2), V1 = 8:1) -test(1667.1, dcast(DT, id ~ rowid(id), value.var = "V1"), - output = " id 1 2\n1: 1 8 4\n2: 2 7 3\n3: 3 6 2\n4: 4 5 1") -DT <- data.table(a = 1:4, id = 1:4, id = rep(1:4, 2), V1 = 8:1) -test(1667.2, dcast(DT, id ~ rowid(id), value.var = "V1"), error = "data.table to cast") - -# fix for #1672 -test(1668, chmatch(c("a","b"), c("a","c"), nomatch = integer()), c(1L, NA_integer_)) - -# fix for #1650, segfault in rolling joins resulting from fixing #1405. -x = data.table(Date = as.Date(c("2015-12-29", "2015-12-29", "2015-12-29", "2015-12-29", "2016-01-30", "2016-01-30", - "2016-01-30", "2016-01-30", "2016-02-29", "2016-02-29", "2016-02-29", "2016-02-29", - "2016-03-26", "2016-03-26", "2016-03-26", "2016-03-26")), - ID = c("A", "B", "C", "D", "A", "B", "C", "D", "A", "B", "C", "D", "A", "B", "C", "D"), - Value = c("A201512", "B201512", "C201512", "D201512", "A201601", "B201601", "C201601", "D201601", - "A201602", "B201602", "C201602", "D201602", "A201603", "B201603", "C201603", "D201603"), - key = c('Date', 'ID')) -y = CJ(Date = as.Date(c("2015-12-31", "2016-01-31", "2016-02-29", "2016-03-31")), ID = unique(x$ID)) -test(1669, x[y, on=c("ID", "Date"), roll=TRUE, which=TRUE], 1:16) - -# 1680 fix, fread header encoding issue -x = "Stra\xdfe" -Encoding(x) = "latin1" -nm = names(fread(testDir("1680-fread-header-encoding.csv"), encoding="Latin-1")) -test(1670, nm[2], x) - -# as.data.table must return a copy even if 'x' is a data.table -x = data.table(a=1, b=2) -test(1670.1, address(x) != address(as.data.table(x)), TRUE) -setattr(x, 'class', c('a', class(x))) -test(1670.2, class(as.data.table(x)), class(x)[2:3]) - -# #1676, `:=` with by shouldn't add cols on supported types -dt = data.table(x=1, y=2) -test(1671, dt[, z := sd, by=x], error="invalid type/length (closure/1)") - -# 1683 -DT <- data.table(V1 = rep(1:2, 3), V2 = 1:6) -test(1672.1, DT[ , .(.I[1L], V2[1L]), by = V1], - output = " V1 V1 V2\n1: 1 1 1\n2: 2 2 2") -#make sure GForce operating -test(1672.2, DT[ , .(.I[1L], V2[1L]), by = V1, verbose = TRUE], - output = "GForce optimized j") -#make sure GForce not operating for inversion -test(1672.3, DT[ , .(.I[-1L], V2[1L]), by = V1, verbose = TRUE], - output = "GForce FALSE") -#make sure works on .I by itself -test(1672.4, DT[ , .I[1L], by = V1], - output = " V1 V1\n1: 1 1\n2: 2 2") -#make sure GForce here as well -test(1672.5, DT[ , .I[1L], by = V1, verbose = TRUE], - output = "GForce optimized j") -#make sure works with order -test(1672.6, DT[order(V1), .I[1L], by = V1], - output = " V1 V1\n1: 1 1\n2: 2 2") -# should also work with subsetting -test(1672.7, DT[1:5, .(.I[1L], V2[1L]), by = V1], - output = " V1 V1 V2\n1: 1 1 1\n2: 2 2 2") - -#tests for #1528 -TT <- as.IDate("2016-04-25") -test(1673.1, TT + 4L, as.IDate("2016-04-29")) -test(1673.2, TT + 4, as.IDate("2016-04-29")) -test(1673.3, TT - 3, as.IDate("2016-04-22")) -test(1673.4, TT - 3L, as.IDate("2016-04-22")) -test(1673.5, as.IDate("2016-04-28") - as.IDate("2016-04-20"), 8L) - - -# test for radix integer order when MAXINT is present AND decreasing=TRUE AND na.last=FALSE -# https://bugs.r-project.org/bugzilla/show_bug.cgi?id=16925 -# It seems this 'just' fails ASAN, but also results in seg fault under some compilers -# https://github.com/rstudio/shiny/issues/1200 -test(1674, forderv(c(2147483645L, 2147483646L, 2147483647L, 2147483644L), order=-1L), INT(3,2,1,4)) - -# fix for #1718 -# In R-devel somwhere between 12 June 2017 (r72786) and 27 June 2017 (r72859), the behaviour of factor() changed. -# Test updated minimally to create the previous representation directly instead of going via factor(). -A = data.table(foo = c(1, 2, 3), bar = c(4, 5, 6)) -A[, bar := factor(bar, levels = c(4, 5), labels = c("Boop", "Beep"), exclude = 6)] -B = data.table(foo = c(1, 2, 3, 4, 5, 6), bar = structure(c(3L, 3L, 3L, 1L, 2L, NA), .Label=c("Boop","Beep",NA), class="factor")) -test(1675.1, as.integer(B[A, bar := i.bar, on="foo"]$bar), c(1:3,1:2,NA)) -A = data.table(foo = c(1, 2, 3), bar = c(4, 5, 6)) -B = data.table(foo = c(1, 2, 3, 4, 5, 6), bar = c(NA, NA, NA, 4, 5, 6)) -A[, bar := factor(bar, levels = c(4, 5), labels = c("Boop", "Beep"), exclude = 6)] -B[, bar := factor(bar, levels = c(4, 5), labels = c("Boop", "Beep"), exclude = 6)] -test(1675.2, as.integer(B[A, bar := i.bar, on="foo"]$bar), c(1:2,NA,1:2,NA)) - -# fwrite na arg segfault fix, #1725 -dt = data.table(x=1:2, y=c(NA,"a")) -f = tempfile() -test(1676.1, fwrite(dt, f, na=NULL), error="is not TRUE") -fwrite(dt, f, na=NA) -test(1676.2, fread(f), data.table(x=1:2, y=c(NA, "a"))) -unlink(f) - -# duplicate names in foverlaps #1730 -a = data.table(start = 1:5, end = 2:6, c2 = rnorm(10), c2 = rnorm(10), key=c("start","end")) -b = data.table(start = 1:5, end = 2:6, c3 = rnorm(5), key=c("start","end")) -test(1677.1, foverlaps(a, b), error="x has some duplicated column") -test(1677.2, foverlaps(b, a), error="y has some duplicated column") - -# na.omit.data.table removes indices #1734 -dt = data.table(a=4:1, b=c(letters[c(1L,NA,2:3)])) -setindexv(dt, "a") -test(1678.1, indices(dt2 <- na.omit(dt, cols="b")), NULL) -setindexv(dt2, "a") -test(1678.2, indices(na.omit(dt2, cols="b")), "a") - -# rleid gains `prefix` argument, similar to rowid -x = sample(3,10,TRUE) -test(1679.1, rleid(x, prefix="id"), paste0("id", rleid(x))) -test(1679.2, rleidv(x, prefix="id"), paste0("id", rleidv(x))) - -# melt.data.table call along with patterns from within a function, #1749 -x = data.table(x1=1:2, x2=3:4, y1=5:6, y2=7:8, z1=9:10, z2=11:12) -foo <- function(x) { - pats = c("^y", "z") - melt(x, measure.vars=patterns(pats)) -} -test(1680.1, foo(x), melt(x, measure.vars=patterns("^y", "^z"))) - -# melt warning prints only first 5 cols, #1752 -DT = fread(testDir("melt-warning-1752.tsv")) -ans = suppressWarnings(melt(DT[, names(DT) %like% "(^Id[0-9]*$)|GEOGRAPHIC AREA CODES", with=FALSE], id=1:2)) -test(1681, melt(DT[, names(DT) %like% "(^Id[0-9]*$)|GEOGRAPHIC AREA CODES", with=FALSE], id=1:2), - ans, warning="are not all of the same type") - -# non-equi joins with by=.EACHI, not as exhaustive, but given the previous -# tests were, this should be fine.. we'll add tests as we go along. -set.seed(45L) -dt1 = data.table(x=sample(8,20,TRUE), y=sample(8,20,TRUE), z=1:20) -dt2 = data.table(c(2,5), c(5,7), c(2,4)) -dt3 = data.table(c(12,5), c(15,7), c(2,4)) - -test(1682.1, dt1[dt2, .N, by=.EACHI, on=.(x>=V1, y<=V2)], dt1[dt2, on=.(x>=V1, y<=V2)][, .N, by=.(x,y)]) -test(1682.2, dt1[dt2, sum(z), by=.EACHI, on=.(x>=V1, y<=V2)], dt1[dt2, on=.(x>=V1, y<=V2)][, sum(z), by=.(x,y)]) -test(1682.3, dt1[dt2, as.numeric(median(z)), by=.EACHI, on=.(x>=V1, y<=V2)], dt1[dt2, on=.(x>=V1, y<=V2)][, median(z), by=.(x,y)]) -test(1682.4, dt1[dt3, .N, by=.EACHI, on=.(x>=V1, y<=V2)], dt1[dt3, on=.(x>=V1, y<=V2)][, .(N=sum(!is.na(z))), by=.(x,y)]) -test(1682.5, dt1[dt3, .N, by=.EACHI, on=.(x>=V1, y<=V2), nomatch=0L], dt1[dt3, on=.(x>=V1, y<=V2), nomatch=0L][, .N, by=.(x,y)]) -test(1682.6, dt1[dt2, on=.(x>=V1, y<=V2), sum(z)*V3, by=.EACHI], dt1[dt2, on=.(x>=V1, y<=V2)][, sum(z)*V3[1L], by=.(x,y)]) -test(1682.7, dt1[dt3, on=.(x>=V1, y<=V2), sum(z)*V3, by=.EACHI], dt1[dt3, on=.(x>=V1, y<=V2)][, sum(z)*V3[1L], by=.(x,y)]) -# add test for update operation -idx = dt1[dt2[1], which=TRUE, on=.(x>=V1, y<=V2)] -test(1682.8, copy(dt1)[dt2[1], z := 2L*z, by=.EACHI, on=.(x>=V1, y<=V2)], copy(dt1)[(idx), z := 2L*z]) -# test for add by reference -test(1682.9, copy(dt1)[dt2[1], foo := z, by=.EACHI, on=.(x>=V1, y<=V2)], copy(dt1)[(idx), foo := z]) -# test for nomatch=0L with by=.EACHI fix for non-equi joins -dt = data.table(x=c(1,4,7,10), y=c(6,12,18,24), z=4:1) -test(1683.1, dt[.(c(2,15), c(100,25)), sum(z), on=.(x>=V1, y<=V2), by=.EACHI], data.table(x=c(2,15), y=c(100,25), V1=c(6L, NA))) -test(1683.2, dt[.(c(2,15), c(100,25)), sum(z), on=.(x>=V1, y<=V2), by=.EACHI, nomatch=0L], data.table(x=2, y=100, V1=6L)) - -# unique should remove index #1760 -dt <- data.table(a = c("1", "1", "2", "2", "3", "4", "4", "4"), - b = letters[1:8], - d = c(TRUE, TRUE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE)) -dt[d == TRUE, `:=`(b = "M")] # create index -udt <- unique(dt, by = c("a", "b")) -test(1684, nrow(udt[d == TRUE]), 2L) - -# #1758, data.table print issue -foo <- function(annot=c("a", "b")) { - dt = data.table(x=annot, y=NA) - ro = structure(list(dt=dt), class="dtu") - suppressWarnings(ro$dt[, flag := TRUE]) - ro -} -old = options(datatable.verbose=FALSE) -test(1685, grep("dtu", capture.output(foo())), 7L) -options(old) - -# fix for #1771 -test(1686.1, uniqueN(1L), 1L) -test(1685.2, uniqueN(1L, na.rm=TRUE), 1L) - -# fix for #1744 -DT = data.table(ID = 1:2, A = 3:4, B = 5:6) -test(1686.1, DT[, .(A,B)], DT[, c(mget("A"), .SD), .SDcols="B"]) -test(1686.2, DT[, .(V1=A,B)], DT[, c(.(get("A")), .SD), .SDcols="B"]) - -# tests for first -test(1687.1, first(1:5), 1L) -test(1687.2, first(data.table(x=1:5, y=6:10)), data.table(x=1L, y=6L)) - -if (test_bit64) { - # fix for #1385 and part of #1459 - x1 = data.table(id=1, value=as.integer64(1)) - x2 = data.table(id=c(1,2)) - test(1688.1, merge(x2, x1, by="id", all.x=TRUE)$value, as.integer64(c(1,NA))) - - x1 = data.table(x = c(1),y = integer64(1)) - x2 = data.table(x = c(1,2)) - test(1688.2, merge(x1, x2, all=TRUE, by="x")$y, as.integer64(c(0, NA))) -} - -# Check that tz is passed though to as.Date(), #1498 -date_tz = as.POSIXct("2016/01/13 17:00", tz = "America/Los_Angeles") -test(1689.1, capture.output(IDateTime(date_tz)), c(" idate itime", "1: 2016-01-13 17:00:00")) -# and that as.IDate.POSIXct is exported too -test(1689.2, as.IDate(date_tz), output="2016-01-13") -date_tz = structure(1496275200.11903, class = c("POSIXct", "POSIXt"), tzone = "America/Los_Angeles") -test(1689.3, as.character(as.IDate(date_tz)), "2017-05-31") -test(1689.4, as.character(as.IDate(date_tz, tz="UTC")), "2017-06-01") - -# fix for #1766 and #1704 -A = data.table(i = 1:6, j = rep(1:2, 3), x = letters[1:6], key = "i") -B = data.table(j = 1:2, y = letters[1:2], key = "j") -test(1690.1, key(A[B, on = "j"]), NULL) -test(1690.2, key(A[B, on = "j"]), NULL) - -dt <- data.table( - origin = c("A", "A", "A", "A", "A", "A", "B", "B", "A", "A", "C", "C", "B", "B", "B", "B", "B", "C", "C", "B", "A", "C", "C", "C", "C", "C", "A", "A", "C", "C", "B", "B"), - destination = c("A", "A", "A", "A", "B", "B", "A", "A", "C", "C", "A", "A", "B", "B", "B", "C", "C", "B", "B", "A", "B", "C", "C", "C", "A", "A", "C", "C", "B", "B", "C", "C"), - points_in_dest = c(5, 5, 5, 5, 4, 4, 5, 5, 3, 3, 5, 5, 4, 4, 4, 3, 3, 4, 4, 5, 4, 3, 3, 3, 5,5, 3, 3, 4, 4, 3, 3), - depart_time = c(7, 8, 16, 18, 7, 8, 16, 18, 7, 8, 16, 18, 7, 8, 16, 7, 8, 16, 18, 8, 16, 7, 8, 18, 7, 8, 16, 18, 7, 8, 16, 18), - travel_time = c(0, 0, 0, 0, 70, 10, 70, 10, 10, 10, 70, 70, 0, 0, 0, 70, 10, 10, 70, 70, 10, 0, 0, 0, 10, 70, 10, 70, 10, 70, 70, 10)) -dt[ depart_time<=8 & travel_time < 60, condition1 := TRUE] -dt[ depart_time>=16 & travel_time < 60, condition2 := TRUE] -setkey(dt, origin, destination) -res <- unique(dt[(condition1)],by=key(dt))[unique(dt[(condition2)], by=key(dt)), - on = c(destination = "origin", origin = "destination"), - nomatch = 0L] -test(1690.3, res[, .(points = sum(points_in_dest)), keyby = origin], data.table(origin=LETTERS[1:3], points=c(9,7,12), key="origin")) - -# fix for #1626 (so that rbind plays nicely with non-list inputs, e.g., package -# psych creates a list with the input data.frame/data.table and a matrix it -# creates...) -dt = data.table(x=1:5, y=6:10) -test(1691, rbind(dt, dt), rbind(dt, as.matrix(dt))) - -# For #1783 -- subsetting a data.table by an ITime object -test(1692, capture.output(as.data.table(structure(57600L, class = "ITime"))), - c(" V1", "1: 16:00:00")) - -# testing all time part extraction routines (subsumes #874) -t <- "2016-08-03 01:02:03.45" -test(1693.1, second(t), 3L) -test(1693.2, minute(t), 2L) -test(1693.3, hour(t), 1L) -test(1693.4, yday(t), 216L) -test(1693.5, wday(t), 4L) -test(1693.6, week(t), 31L) -test(1693.7, month(t), 8L) -test(1693.8, quarter(t), 3L) -test(1693.9, year(t), 2016L) - - -# fix for #1740 - sub-assigning NAs for factors -dt = data.table(x = 1:5, y = factor(c("","a","b","a", "")), z = 5:9) -ans = data.table(x = 1:5, y = factor(c(NA,"a","b","a", NA)), z = 5:9) -test(1694.0, dt[y=="", y := NA], ans) - -# more tests for between() -x = c(NaN, NA, 1, 5, -Inf, Inf) -test(1695.1, x %between% c(3, 7), c(NA, NA, FALSE, TRUE, FALSE, FALSE)) -test(1695.2, x %between% c(NA, 7), c(NA, NA, NA, NA, NA, FALSE)) -test(1695.3, x %between% c(3, NA), c(NA, NA, FALSE, NA, FALSE, NA)) -test(1695.4, x %between% c(NA, NA), rep(NA, 6L)) - -x = c(NA, 1L, 5L) -test(1695.5, x %between% c(3, 7), c(NA, FALSE, TRUE)) -test(1695.6, x %between% c(NA, 7), c(NA, NA, NA)) -test(1695.7, x %between% c(3, NA), c(NA, FALSE, NA)) -test(1695.8, x %between% c(NA, NA), rep(NA, 3L)) - -x = rep(NA_integer_, 3) -test(1695.9, x %between% c(3, 7), rep(NA, 3L)) -test(1695.10, x %between% c(NA, 7), rep(NA, 3L)) -test(1695.11, x %between% c(3, NA), rep(NA, 3L)) -test(1695.12, x %between% c(NA, NA), rep(NA, 3L)) - -x = integer(0) -test(1695.13, x %between% c(3, 7), logical(0)) - -# test for #1819, verbose message for bmerge -old_opt = getOption("datatable.verbose") -options(datatable.verbose = TRUE) -x = data.table(A = 10:17) -test(1696.0, x[A %inrange% 13:14], output="bmerge") -# restore verbosity -options(datatable.verbose = old_opt) - -# adding a test for #1825 (though it is not on timing, but correctness while -# joining on keyed tables using 'on' argument) -x = data.table(a=1:3, b=4:6, key="a") -y = data.table(a=2:4, c=7:9) -test(1697.1, x[y], x[y, on=key(x)]) -y = data.table(m=2:4, c=7:9, key="m") -test(1697.2, x[y], x[y, on=c(a="m")]) - -# #1823, fix for 'on='' on keyed anti-joins loses key -x = data.table(id = 1:10, val = letters[1:10], key = "id") -y = data.table(id = 3:6, key = "id") -test(1698.1, key(x[!y]), key(x[!y, on = "id"])) - -# minor enhancement to dcast, #1821 -dt = data.table(x=c(1,1,1,2,2,2), y=1:6, z=6:1) -test(1699.1, dcast(dt, x ~ ., value.var="z", fun=list(sd, mean)), data.table(x=c(1,2), z_sd=1, z_mean=c(5,2), key="x")) - -# minor enhancement to dcast, #1810 -dt = data.table( - var1 = c("a","b","c","b","d","e","f"), - var2 = c("aa","bb","cc","dd","ee","ee","ff"), - subtype = c("1","2","2","2","1","1","2"), - type = c("A","A","A","A","B","B","B") -) -test(1700.1, dcast(dt, type ~ subtype, value.var = c("var1", "var2"), fun = function(v) paste0(unique(v), collapse = "|")), - data.table(type=c("A","B"), var1_1=c("a", "d|e"), var1_2=c("b|c", "f"), - var2_1=c("aa", "ee"), var2_2=c("bb|cc|dd","ff"), key="type")) - -# fixing regression introduced on providing functionality of 'x.' prefix in 'j' (for non-equi joins) -A = data.table(x=c(1,1,1,2,2), y=1:5, z=5:1) -B = data.table(x=c(2,3), val=4) -col1 = "y" -col2 = "x.y" -test(1701.1, A[, .(length(x), length(y)), by=x], data.table(x=c(1,2), V1=1L, V2=c(3:2))) -test(1701.2, A[, .(x), by=x], data.table(x=c(1,2), x=c(1,2))) -test(1701.3, A[B, x.x, on="x"], c(2,2,NA)) -test(1701.4, A[B, x.y, on="x"], c(4:5,NA)) -test(1701.5, A[B, .(get("x"), get("x.x")), on="x"], data.table(V1=c(2,2,3), V2=c(2,2,NA))) -test(1701.6, A[B, mget(c("x", "x.x")), on="x"], data.table(x=c(2,2,3), x.x=c(2,2,NA))) -# 1761 fix as well -test(1701.6, A[B, .(x.x, get("x.x"), x.y), on="x", by=.EACHI], data.table(x=c(2,2,3), x.x=c(2,2,NA), V2=c(2,2,NA), x.y=c(4:5,NA))) -dt = data.table(a=1L) -test(1701.7, dt[dt, .(xa=x.a, ia=i.a), .EACHI, on="a"], data.table(a=1L, xa=1L, ia=1L)) - -# ISO 8601-consistent week numbering, #1765 -# test cases via https://en.wikipedia.org/wiki/ISO_week_date -# as well as specified in relation to #2407 -test_cases <- c("2005-01-01", "2005-01-02", "2005-12-31", - "2007-01-01", "2007-12-30", "2007-12-31", - "2008-01-01", "2008-12-28", "2008-12-29", - "2008-12-30", "2008-12-31", "2009-01-01", - "2009-12-31", "2010-01-01", - "2010-01-02", "2010-01-03", - #see https://stackoverflow.com/questions/43944430 & #2407 - "2014-12-29", "2014-12-22", "2015-02-02") - -test_values <- c(53L, 53L, 52L, 1L, 52L, 1L, 1L, - 52L, 1L, 1L, 1L, 1L, 53L, 53L, 53L, 53L, - 1L, 52L, 6L) - -test(1702.1, isoweek(test_cases), test_values) -# calculating via character skirts timezone issues, -# but calculating from Date brings these into play, #2407 -test(1702.2, isoweek(as.Date(test_cases)), test_values) -test(1702.3, isoweek(as.POSIXct(test_cases)), test_values) - -# 1% sample of a 400-year cycle of dates for extra robustness -isotest = fread(testDir('isoweek_test.csv')) -test(1702.4, isoweek(isotest$input_date), isotest$expected_output) - -# fread, ensure no shell commands #1702 -if (.Platform$OS.type=="unix") { - cat("a,b\n4,2", file=f<-tempfile()) - cmd <- sprintf("cat %s", f) - test(1703.1, fread(cmd), data.table(a=4L, b=2L)) - test(1703.2, fread(file=cmd), error=sprintf("File '%s' does not exist", cmd)) - unlink(f) -} - -# Ensure all.equal respects 'check.attributes' w.r.t. column names. As testthat::check_equivalent relies on this -# as used by package popEpi in its tests -test(1704, all.equal(data.table( a=1:3, b=4:6 ), data.table( A=1:3, B=4:6 ), check.attributes=FALSE)) - -# all.equal.data.table should consider modes equal like base R (detected via Bioc's flowWorkspace tests) -# If strict testing is required, then use identical(). -# TODO: add strict.numeric (default FALSE) to all.equal.data.table() ? -test(1707.1, all.equal( data.frame(a=0L), data.frame(a=0) ) ) -test(1707.2, all.equal( data.table(a=0L), data.table(a=0) ) ) -test(1708.1, !isTRUE(all.equal( data.frame(a=0L), data.frame(a=FALSE) ))) -test(1708.2, all.equal( data.table(a=0L), data.table(a=FALSE) ), - "Datasets have different column modes. First 3: a(numeric!=logical)") -x = data.frame(a=0L) -y = data.frame(a=0) -setattr(y[[1]],"class",c("hello","world")) -test(1709.1, !isTRUE(all.equal(x,y,check.attributes=TRUE))) # desired -test(1709.2, !isTRUE(all.equal(x,y,check.attributes=FALSE))) # not desired -x = as.data.table(x) -y = as.data.table(y) -test(1710.1, mode(x[[1]]) == mode(y[[1]])) -test(1710.2, storage.mode(x[[1]]) != storage.mode(y[[1]])) -test(1710.3, class(y[[1]]), c("hello","world")) -test(1710.4, all.equal(x,y,check.attributes=TRUE), # desired - "Datasets have different column classes. First 3: a(numeric!=hello;world)") -test(1710.5, isTRUE(all.equal(x,y,check.attributes=FALSE))) # desired - -# Include tests as-is from #1252 (unexpected NA row from logical subsets with 1-row containing NA) -DT = data.table(a=1, d=NA) -test(1711, DT[!is.na(a) & d == "3"], DT[0]) -DT = data.table(a = c(1,2), d = c(NA,3)) -test(1712, DT[!is.na(a) & d == "3"], DT[2]) -test(1713, DT[d==3], DT[2]) - -# Test new helpful error message suggested by Jan -notAColName = 1 -test(1714.1, exists("notAColName")) # use a long column name to be sure it exists and unique -test(1714.1, !exists("notInCallingScope")) # use a long column name to be sure it exists and unique -DT = data.table(a=1:3, b=4:6) -test(1715, DT[,b], 4:6) # old behaviour for sure tested before but here for context -test(1716.1, DT[,notAColName], error="column name 'notAColName' is not found") # ensure it doesn't find it calling scope either -test(1716.2, DT[, ..notInCallingScope], error="Variable 'notInCallingScope' is not found in calling scope") -test(1716.3, DT[, notInCallingScope, with=FALSE], error="Variable 'notInCallingScope' is not found in calling scope") - -# Test out-of-bounds error on numeric j -DT = data.table(a=1:3, b=4:6, c=7:9) -test(1717, DT[,4], error="Item 1 of j is 4 which is outside the column number range.*ncol=3") -test(1718, DT[,0], null.data.table()) -test(1719, DT[,c(2,0,1)], data.table(b=4:6, a=1:3)) -test(1720, DT[,c(-2,2)], error="j mixes positives and negatives") -test(1721, DT[,c(1,0,5)], error="Item 3 of j is 5 which.*ncol=3") # to check it says Item 3 even though 0 gets removed internally - -# Tests to ensure auto with=FALSE of ! and - only allow symbols around : (i.e. DT[,!(colB:colE)] and not any other symbol usage inside ! and -. Thanks to Mark L #1864 and confirmed by Michael C with both tests added as-is -DT = data.table(FieldName = c(1,2,NA,4,NA,6), rowId=1:6, removalIndex=c(2,7,0,5,10,0)) -test(1722.1, DT[,!is.na(as.numeric(FieldName))], c(TRUE,TRUE,FALSE,TRUE,FALSE,TRUE)) -test(1722.2, DT[,(!is.na(as.numeric(FieldName)))], c(TRUE,TRUE,FALSE,TRUE,FALSE,TRUE)) -test(1723.1, DT[removalIndex>0,rowId-(2*removalIndex-1)], c(-2,-11,-5,-14)) -test(1723.2, DT[removalIndex>0,(rowId-(2*removalIndex-1))], c(-2,-11,-5,-14)) -DT = data.table(FieldName = c("1", "2", "3", "four", "five", "6")) -test(1724.1, DT[, is.na(as.numeric(FieldName))], c(FALSE,FALSE,FALSE,TRUE,TRUE,FALSE), warning="NAs introduced by coercion") -test(1724.2, DT[, !is.na(as.numeric(FieldName))], c(TRUE,TRUE,TRUE,FALSE,FALSE,TRUE), warning="NAs introduced by coercion") - -# Ensure NA's are added properly when a new column is added, not all the target rows are joined to, and the number of i -# rows is equal or greater than the number of rows in the target table. -DT = data.table(a=1:3, key="a") -DT[.(4), add0:=1.1][] # didn't break due to 95e438c on 29 Sep 2016 -DT[.(c(3,4)), add1:=1.1][] # didn't break -DT[.(c(3,3,4)), add2:=1.1][] # did break -DT[.(2:4), add3:=1.1][] # did break -test(1725, DT, data.table(a=1:3, add0=NA_real_, add1=c(NA,NA,1.1), add2=c(NA,NA,1.1), add3=c(NA,1.1,1.1), key="a")) - -# keyby= runs groups in sorted order, #606. Only relevant when j does something that depends on previous group, perhaps -# by using <<-. To run in appearance order use by=. See also #1880. -# It wasn't useful to always run groups in appearance order. Now we have the option and it's consistent. -DT = data.table(grp=rep(3:1,each=3), val=1:9) -lastGrp = 0L -test(1726.1, DT[, {ans=mean(val)+lastGrp; lastGrp<<-min(val); .(ans, .GRP)}, keyby=grp], - data.table(grp=1:3, V1=c(8,12,6), V2=1:3, key="grp") ) -test(1726.2, lastGrp, 1L) -lastGrp = -1L -test(1726.3, DT[, {ans=mean(val)+lastGrp; lastGrp<<-min(val); .(ans, .GRP)}, by=grp], - data.table(grp=3:1, V1=c(1,6,12), V2=1:3) ) -test(1726.4, lastGrp, 7L) -rm(lastGrp) - -# better := verbose messages, #1808 -DT = data.table(a = 1:10) -test(1727.1, DT[a < 5, a := 5L, verbose=TRUE], output="Assigning to 4 row subset of 10 rows") -test(1727.2, DT[a < 5, a := 5L, verbose=TRUE], output="No rows match i.*Assigning to 0 row subset of 10 rows") -test(1727.3, DT[0, d:=1, verbose=TRUE], data.table(a=c(rep(5L,5L),6:10), d=NA_real_), - output = "Assigning to 0 row subset of 10 rows.*Added 1 new column initialized with all-NA") -test(1727.4, DT[.(a=11L), on="a", c("f","g"):=.(1L,"dummy"), verbose=TRUE], - data.table(a=c(rep(5L,5L),6:10), d=NA_real_, f=NA_integer_, g=NA_character_), - output = "Assigning to 0 row subset of 10 rows.*Added 2 new columns initialized with all-NA") - -# Add test for working and no problem na.last=NA with subgroup size 2 containing 1 NA -# and 2 randomly not working cases with na.last=NA size 2 with 1 NA, due to using uninitialized memory -DT = data.table(x=INT(2,2,2,1,1), y=INT(1,NA,3,2,NA)) -test(1728.1, DT[order(x,y,na.last=TRUE)], data.table(x=INT(1,1,2,2,2), y=INT(2,NA,1,3,NA))) -test(1728.2, DT[order(x,y,na.last=FALSE)], data.table(x=INT(1,1,2,2,2), y=INT(NA,2,NA,1,3))) -test(1728.3, DT[order(x,y,na.last=NA)], data.table(x=INT(1,2,2), y=INT(2,1,3))) -# 1 row -DT = data.table(x=NA_integer_, y=1) -test(1728.4, DT[order(x,y,na.last=TRUE)], DT) -test(1728.5, DT[order(x,y,na.last=FALSE)], DT) -test(1728.6, DT[order(x,y,na.last=NA)], DT[0]) -# 2 row with 1 NA -DT = data.table(x=as.integer(c(NA,1)), y=2:3) -test(1728.7, DT[order(x,y,na.last=TRUE)], DT[c(2,1)]) -test(1728.8, DT[order(x,y,na.last=FALSE)], DT) -test(1728.9, DT[order(x,y,na.last=NA)], DT[2]) # was randomly wrong -test(1728.11, DT[order(x,na.last=TRUE)], DT[c(2,1)]) -test(1728.12, DT[order(x,na.last=FALSE)], DT) -test(1728.13, DT[order(x,na.last=NA)], DT[2]) # was randomly wrong - -# fwrite wrong and crash on 9.9999999999999982236431605, #1847 -oldverbose=options(datatable.verbose=FALSE) -test(1729.1, fwrite(data.table(V1=c(1), V2=c(9.9999999999999982236431605997495353221893310546875))), - output="V1,V2\n1,10") -test(1729.2, fwrite(data.table(V2=c(9.9999999999999982236431605997495353221893310546875), V1=c(1))), - output="V2,V1\n10,1") -DT = data.table(V1=c(9999999999.99, 0.00000000000000099, 0.0000000000000000000009, 0.9, 9.0, 9.1, 99.9, - 0.000000000000000000000999999999999999999999999, - 99999999999999999999999999999.999999)) -ans = "V1\n9999999999.99\n9.9e-16\n9e-22\n0.9\n9\n9.1\n99.9\n1e-21\n1e+29" -test(1729.3, fwrite(DT), output=ans) -test(1729.4, write.csv(DT,row.names=FALSE,quote=FALSE), output=ans) -options(oldverbose) - -# same decimal/scientific rule (shortest format) as write.csv -DT = data.table(V1=c(-00000.00006, -123456789.123456789, - seq.int(-1000,1000,17), - seq(-1000,1000,pi*87), - -1.2345678912345 * 10^(c((-30):30)), - +1.2345678912345 * 10^(c((-30):30)), - -1.2345 * 10^((-20):20), - +1.2345 * 10^((-20):20), - -1.7 * 10^((-20):20), - +1.7 * 10^((-20):20), - -7 * 10^((-20):20), - +7 * 10^((-20):20), - 0, NA, NaN, Inf, -Inf, - 5.123456789e-290, -5.123456789e-290, - 5.123456789e-307, -5.123456789e-307, - 5.123456789e+307, -5.123456789e+307)) -test(1729.5, nrow(DT), 507L) - -oldverbose=options(datatable.verbose=FALSE) -# capture.output() exact tests must not be polluted with verbosity - -x = capture.output(fwrite(DT,na="NA"))[-1] # -1 to remove the column name V1 -y = capture.output(write.csv(DT,row.names=FALSE,quote=FALSE))[-1] -# One mismatch that seems to be accuracy in base R's write.csv -# tmp = cbind(row=1:length(x), `fwrite`=x, `write.csv`=y) -# tmp[x!=y,] -# row fwrite write.csv -# 177 "-1234567891234500000" "-1234567891234499840" -# 238 "1234567891234500000" "1234567891234499840" -# looking in surrounding rows for the first one shows the switch point : -# tmp[175:179,] -# row fwrite write.csv -# 175 "-12345678912345000" "-12345678912345000" # ok -# 176 "-123456789123450000" "-123456789123450000" # ok -# 177 "-1234567891234500000" "-1234567891234499840" # e+18 last before switch to scientific -# 178 "-1.2345678912345e+19" "-1.2345678912345e+19" # ok -# 179 "-1.2345678912345e+20" "-1.2345678912345e+20" # ok -test(1729.6, x[c(177,238)], c("-1234567891234500000","1234567891234500000")) -x = x[-c(177,238)] -y = y[-c(177,238)] -test(1729.7, length(x), 505L) -test(1729.8, x, y) -if (!identical(x,y)) print(data.table(row=1:length(x), `fwrite`=x, `write.csv`=y)[x!=y]) - -DT = data.table(c(5.123456789e+300, -5.123456789e+300, - 1e-305,1e+305, 1.2e-305,1.2e+305, 1.23e-305,1.23e+305)) -ans = c("V1","5.123456789e+300","-5.123456789e+300", - "1e-305","1e+305","1.2e-305","1.2e+305","1.23e-305","1.23e+305") -# explicitly check against ans rather than just comparing fwrite to write.csv so that : -# i) we can easily see intended results right here in future without needing to run -# ii) we don't get a false pass if fwrite and write.csv agree but are both wrong because of -# a problem with the test mechanism itself or something else strange or unexpected -# Exactly the same binary representation on both linux and windows (so any differences in -# output are not because the value itself is stored differently) : -test(1729.9, binary(DT[[1]]), - c("0 11111100101 111010011010000100010111101110000100 11110100 00000100", - "1 11111100101 111010011010000100010111101110000100 11110100 00000100", - "0 00000001001 110000010110110001011100010100100101 00110101 01110101", - "0 11111110100 001000111010010100010110111010000010 11011001 10111010", - "0 00000001010 000011011010011101101010100101111100 10111001 10101101", - "0 11111110100 010111011111100101001110101100000011 01101011 10101100", - "0 00000001010 000101000110010100110011101010000110 00111110 01010001", - "0 11111110100 011001101011100100100011110110110000 01001110 01011101")) -test(1729.11, fwrite(DT,na=""), output=ans) -test(1729.12, write.csv(DT,row.names=FALSE,quote=FALSE), output=ans) -DT = data.table(unlist(.Machine[c("double.eps","double.neg.eps","double.xmin","double.xmax")])) -# double.eps double.neg.eps double.xmin double.xmax -# 2.220446e-16 1.110223e-16 2.225074e-308 1.797693e+308 -test(1729.13, typeof(DT[[1L]]), "double") -test(1729.14, capture.output(fwrite(DT)), capture.output(write.csv(DT,row.names=FALSE,quote=FALSE))) - -if (test_bit64) { - test(1730.1, typeof(-2147483647L), "integer") - test(1730.2, as.integer(-2147483648), NA_integer_, warning="coercion") - test(1730.3, as.integer("-2147483647"), -2147483647L) - test(1730.4, as.integer("-2147483648"), NA_integer_, warning="coercion") - test(1730.5, as.integer64("-2147483648"), as.integer64(-2147483648)) - # Currently bit64 truncs to extremes in character coercion. Don't test that in case bit64 changes in future. - # as.integer64("-9223372036854775808") == NA - # as.integer64("-9223372036854775999") == NA - # as.integer64("+9223372036854775808") == 9223372036854775807 - # as.integer64("+9223372036854775999") == 9223372036854775807 - DT = data.table( as.integer64(c( - "-9223372036854775807", # integer64 min 2^63-1 - "+9223372036854775807", # integer64 max - "-9223372036854775806","+9223372036854775806", # 1 below extreme just to check - "0","-1","1", - "NA",NA, - "-2147483646", # 1 below extreme to check - "-2147483647", # smallest integer in R - "-2147483648", # NA_INTEGER == INT_MIN but valid integer64 - "-2147483649", - "+2147483646", # positives as well just in case - "+2147483647", - "+2147483648", - "+2147483649" - ))) - ans = c('"V1"',"-9223372036854775807","9223372036854775807","-9223372036854775806","9223372036854775806", - "0","-1","1","__NA__","__NA__", - "-2147483646","-2147483647","-2147483648","-2147483649", - "2147483646","2147483647","2147483648","2147483649") - test(1731.1, class(DT[[1L]]), "integer64") - test(1731.2, fwrite(DT,na="__NA__"), output=ans) - f = tempfile() - test(1731.3, fwrite(DT, f, na="__NA__"), NULL) - test(1731.4, readLines(f), ans) - unlink(f) - ans[1] = "V1" # the field is unquoted under `quote=FALSE` - test(1731.5, write.csv(DT,na="__NA__",row.names=FALSE,quote=FALSE), output=ans) - # write.csv works on integer64 because it calls bit64's as.character method -} - -# fwrite(,quote='auto' and qmethod) -DT = data.table(x=c("fo,o", "foo", 'b"ar', NA, "", "NA"), - "ColName,WithComma"=1:6, - 'Three\nLine\nColName'=c('bar\n', "noNeedToQuote", 'a\nlong\n"sentence"', "0000", " \n ", ' "\n ')) -x = capture.output(fwrite(DT,na="NA",quote=TRUE, qmethod='escape')) -y = capture.output(write.table(DT,row.names=FALSE,quote=TRUE,sep=",",qmethod='escape')) -test(1732.1, x, y) -x = capture.output(fwrite(DT,na="NA",quote=TRUE,qmethod='double')) -y = capture.output(write.table(DT,row.names=FALSE,quote=TRUE,sep=",",qmethod='double')) -test(1732.2, x, y) -x = capture.output(fwrite(DT,na="NA",quote=FALSE)) -y = capture.output(write.csv(DT,row.names=FALSE,quote=FALSE)) -test(1732.3, x, y) -f = tempfile() -fwrite(DT,f,quote='auto',qmethod='escape') -# write.csv / write.table don't do field-by-field quoting so can't compare to them. -ans = c('x,"ColName,WithComma","Three', 'Line', 'ColName"', - '"fo,o",1,"bar','"', - 'foo,2,noNeedToQuote', - '"b\\"ar",3,"a', 'long', "\\\"sentence\\\"\"", - ',4,0000', - '"",5," ',' "', - "NA,6,\" \\\"", " \"") -test(1732.4, readLines(f), ans) -fwrite(DT,f,quote='auto',qmethod='double') -ans[7] = '"b""ar",3,"a' -ans[9] = "\"\"sentence\"\"\"" -ans[13] = "NA,6,\" \"\"" -test(1732.5, readLines(f), ans) -DT = data.table(A=c("foo","ba,r","baz"), B=c("AA","BB","CC"), C=c("DD","E\nE","FF")) -test(1732.6, fwrite(DT, quote='auto'), output='A,B,C\nfoo,AA,DD\n"ba,r",BB,"E\nE"\nbaz,CC,FF') -unlink(f) - -DT = data.table(A=c(NA, "NA", "", "monty"), B=c(5, 7, 0, NA)) -test(1732.7, fwrite(DT, quote='auto'), output='A,B\n,5\nNA,7\n"",0\nmonty,') -test(1732.8, fwrite(DT, quote='auto', na="NA"), output='"A","B"\nNA,5\n"NA",7\n"",0\n"monty",NA') - -# dec="," -test(1733.1, fwrite(data.table(pi),dec=","), error="dec != sep is not TRUE") -test(1733.2, fwrite(data.table(c(1.2,-8.0,pi,67.99),1:4),dec=",",sep=";"), - output="V1;V2\n1,2;1\n-8;2\n3,14159265358979;3\n67,99;4") - -# fwrite implied and actual row.names -DT = data.table(foo=1:3,bar=c(1.2,9.8,-6.0)) -test(1734.1, capture.output(fwrite(DT,row.names=TRUE,quote=FALSE)), - capture.output(write.csv(DT,quote=FALSE))) -test(1734.2, capture.output(fwrite(DT,row.names=TRUE,quote=TRUE)), - capture.output(write.csv(DT))) -test(1734.3, fwrite(DT,row.names=TRUE,quote='auto'), # same other than 'foo' and 'bar' column names not quoted - output="\"\",foo,bar\n\"1\",1,1.2\n\"2\",2,9.8\n\"3\",3,-6") -DF = as.data.frame(DT) -test(1734.4, capture.output(fwrite(DF,row.names=TRUE,quote=FALSE)), - capture.output(write.csv(DF,quote=FALSE))) -test(1734.5, capture.output(fwrite(DF,row.names=TRUE,quote=TRUE)), - capture.output(write.csv(DF))) -rownames(DF)[2] = "someName" -rownames(DF)[3] = "another" -test(1734.6, capture.output(fwrite(DF,row.names=TRUE,quote=FALSE)), - capture.output(write.csv(DF,quote=FALSE))) -test(1734.7, capture.output(fwrite(DF,row.names=TRUE,quote=TRUE)), - capture.output(write.csv(DF))) - -# list columns and sep2 -set.seed(1) -DT = data.table(A=1:4, - B=list(1:10,15:18,7,9:10), - C=list(letters[19:23],c(1.2,2.3,3.4,pi,-9),c("foo","bar"),c(TRUE,TRUE,FALSE))) -test(1736.1, capture.output(fwrite(DT,logical01=FALSE)), c("A,B,C", "1,1|2|3|4|5|6|7|8|9|10,s|t|u|v|w", - "2,15|16|17|18,1.2|2.3|3.4|3.14159265358979|-9", "3,7,foo|bar", "4,9|10,TRUE|TRUE|FALSE")) -test(1736.2, fwrite(DT, sep2=","), error="length(sep2)") -test(1736.3, fwrite(DT, sep2=c("",",","")), error="sep.*,.*sep2.*,.*must all be different") -test(1736.4, fwrite(DT, sep2=c("","||","")), error="nchar.*sep2.*2") -test(1736.5, capture.output(fwrite(DT, sep='|', sep2=c("c(",",",")"), logical01=FALSE)), c("A|B|C", "1|c(1,2,3,4,5,6,7,8,9,10)|c(s,t,u,v,w)", - "2|c(15,16,17,18)|c(1.2,2.3,3.4,3.14159265358979,-9)", "3|c(7)|c(foo,bar)", "4|c(9,10)|c(TRUE,TRUE,FALSE)")) -# Aside: logicalAsInt tested in 1736.6 to continue to work without warning, currently. TODO: warning, deprecate and remove -test(1736.6, capture.output(fwrite(DT, sep='|', sep2=c("{",",","}"), logicalAsInt=TRUE)), - c("A|B|C", "1|{1,2,3,4,5,6,7,8,9,10}|{s,t,u,v,w}", - "2|{15,16,17,18}|{1.2,2.3,3.4,3.14159265358979,-9}", "3|{7}|{foo,bar}", "4|{9,10}|{1,1,0}")) -DT = data.table(A=c("foo","ba|r","baz")) -test(1736.7, capture.output(fwrite(DT,na="")), c("A","foo","ba|r","baz")) # no list column so no need to quote -test(1736.8, capture.output(fwrite(DT)), c("A","foo","ba|r","baz")) -DT = data.table(A=c("foo","ba|r","baz"), B=list(1:3,1:4,c("fo|o","ba,r","baz"))) # now list column and need to quote -test(1736.9, capture.output(fwrite(DT)), c("A,B", "foo,1|2|3", "\"ba|r\",1|2|3|4", "baz,\"fo|o\"|\"ba,r\"|baz")) -test(1736.11, capture.output(fwrite(DT,quote=TRUE)), c("\"A\",\"B\"", "\"foo\",1|2|3", "\"ba|r\",1|2|3|4", "\"baz\",\"fo|o\"|\"ba,r\"|\"baz\"")) - -# any list of same length vector input -test(1737.1, fwrite(list()), NULL, warning="fwrite was passed an empty list of no columns") -test(1737.2, fwrite(list(1.2)), output="1.2") -test(1737.3, fwrite(list(1.2,B="foo")), output=",B\n1.2,foo") -test(1737.4, fwrite(list("A,Name"=1.2,B="fo,o")), output="\"A,Name\",B\n1.2,\"fo,o\"") -test(1737.5, fwrite(list(1.2,B=c("foo","bar"))), error="Column 2's length (2) is not the same as column 1's length (1)") - -# fwrite ITime, Date, IDate -DT = data.table(A=as.ITime(c("23:59:58","23:59:59","12:00:00","00:00:01",NA,"00:00:00"))) -test(1738.1, capture.output(fwrite(DT)), c("A","23:59:58","23:59:59","12:00:00","00:00:01","","00:00:00")) -test(1738.2, capture.output(fwrite(DT,na="")), capture.output(write.csv(DT,row.names=FALSE,quote=FALSE, na=""))) -dts = c("1901-05-17","1907-10-22","1929-10-24","1962-05-28","1987-10-19","2008-09-15", - "1968-12-30","1968-12-31","1969-01-01","1969-01-02") -DT = data.table(A=as.Date(dts), B=as.IDate(dts)) -test(1738.3, sapply(DT,typeof), c(A="double",B="integer")) -test(1738.4, capture.output(fwrite(DT)), capture.output(write.csv(DT,row.names=FALSE,quote=FALSE))) -test(1738.5, as.integer(as.Date(c("0000-03-01","9999-12-31"))), c(-719468L,2932896L)) - -if (FALSE) { - # Full range takes too long for CRAN. - dts = seq.Date(as.Date("0000-03-01"),as.Date("9999-12-31"),by="day") - dtsCh = as.character(dts) # 36s - dtsCh = gsub(" ","0",sprintf("%10s",dtsCh)) # R does not 0 pad years < 1000 - test(1739.1, length(dtsCh)==3652365 && identical(dtsCh[c(1,3652365)],c("0000-03-01","9999-12-31"))) -} else { - # test on CRAN a reduced but important range - dts = seq.Date(as.Date("1899-12-31"),as.Date("2100-01-01"),by="day") - dtsCh = as.character(dts) - test(1739.1, length(dtsCh)==73051 && identical(dtsCh[c(1,73051)],c("1899-12-31","2100-01-01"))) -} -DT = data.table(A=dts, B=as.IDate(dts)) -test(1739.2, sapply(DT,typeof), c(A="double",B="integer")) -test(1739.3, typeof(dts), "double") -f = tempfile() -g = tempfile() # Full range -fwrite(DT,f) # 0.092s -write.csv(DT,g,row.names=FALSE,quote=FALSE) # 65.250s -test(1739.4, readLines(f), c("A,B",paste(dtsCh,dtsCh,sep=","))) -test(1739.5, readLines(f), readLines(g)) -unlink(f) -unlink(g) - -# dateTimeAs -DT = data.table( - A = as.Date(d<-c("1907-10-21","1907-10-22","1907-10-22","1969-12-31","1970-01-01","1970-01-01", - "1972-02-29","1999-12-31","2000-02-29","2016-09-12")), - B = as.IDate(d), - C = as.ITime(t<-c("23:59:59","00:00:00","00:00:01", "23:59:58", "00:00:00","00:00:01", - "12:00:00", "01:23:45", "23:59:59","01:30:30")), - D = as.POSIXct(dt<-paste(d,t), tz="UTC"), - E = as.POSIXct(paste0(dt,c(".999",".0",".5",".111112",".123456",".023",".0",".999999",".99",".0009")), tz="UTC")) - -test(1740.1, fwrite(DT,dateTimeAs="iso"), error="dateTimeAs must be 'ISO','squash','epoch' or 'write.csv'") -test(1740.2, capture.output(fwrite(DT,dateTimeAs="ISO")), c( -"A,B,C,D,E", -"1907-10-21,1907-10-21,23:59:59,1907-10-21T23:59:59Z,1907-10-21T23:59:59.999Z", -"1907-10-22,1907-10-22,00:00:00,1907-10-22T00:00:00Z,1907-10-22T00:00:00Z", -"1907-10-22,1907-10-22,00:00:01,1907-10-22T00:00:01Z,1907-10-22T00:00:01.500Z", -"1969-12-31,1969-12-31,23:59:58,1969-12-31T23:59:58Z,1969-12-31T23:59:58.111112Z", -"1970-01-01,1970-01-01,00:00:00,1970-01-01T00:00:00Z,1970-01-01T00:00:00.123456Z", -"1970-01-01,1970-01-01,00:00:01,1970-01-01T00:00:01Z,1970-01-01T00:00:01.023Z", -"1972-02-29,1972-02-29,12:00:00,1972-02-29T12:00:00Z,1972-02-29T12:00:00Z", -"1999-12-31,1999-12-31,01:23:45,1999-12-31T01:23:45Z,1999-12-31T01:23:45.999999Z", -"2000-02-29,2000-02-29,23:59:59,2000-02-29T23:59:59Z,2000-02-29T23:59:59.990Z", -"2016-09-12,2016-09-12,01:30:30,2016-09-12T01:30:30Z,2016-09-12T01:30:30.000900Z")) -test(1740.3, capture.output(fwrite(DT,dateTimeAs="squash")), c( -"A,B,C,D,E", -"19071021,19071021,235959,19071021235959000,19071021235959999", -"19071022,19071022,000000,19071022000000000,19071022000000000", -"19071022,19071022,000001,19071022000001000,19071022000001500", -"19691231,19691231,235958,19691231235958000,19691231235958111", -"19700101,19700101,000000,19700101000000000,19700101000000123", -"19700101,19700101,000001,19700101000001000,19700101000001023", -"19720229,19720229,120000,19720229120000000,19720229120000000", -"19991231,19991231,012345,19991231012345000,19991231012345999", -"20000229,20000229,235959,20000229235959000,20000229235959990", -"20160912,20160912,013030,20160912013030000,20160912013030000")) -test(1740.4, capture.output(fwrite(DT,dateTimeAs="epoch")), c( -"A,B,C,D,E", -"-22718,-22718,86399,-1962748801,-1962748800.001", -"-22717,-22717,0,-1962748800,-1962748800", -"-22717,-22717,1,-1962748799,-1962748798.5", -"-1,-1,86398,-2,-1.888888", -"0,0,0,0,0.123456", -"0,0,1,1,1.023", -"789,789,43200,68212800,68212800", -"10956,10956,5025,946603425,946603425.999999", -"11016,11016,86399,951868799,951868799.99", -"17056,17056,5430,1473643830,1473643830.0009")) - -test(1741.1, attr(DT[[4]],"tzone"), "UTC") -test(1741.2, attr(DT[[5]],"tzone"), "UTC") -# Remove tzone attribute to make write.csv write in local time. -# That local time will vary on the boxes this test runs on, so we just compare to -# write.csv rather than fixed strings as above. -setattr(DT[[4]], "tzone", NULL) -setattr(DT[[5]], "tzone", NULL) - -# format() now supports digits = 0, to display nsmall decimal places. -old = options(digits.secs=0) -test(1741.3, x1<-capture.output(fwrite(DT,dateTimeAs="write.csv")), - capture.output(write.csv(DT,row.names=FALSE,quote=FALSE))) -options(digits.secs=3) -test(1741.4, x2<-capture.output(fwrite(DT,dateTimeAs="write.csv")), - capture.output(write.csv(DT,row.names=FALSE,quote=FALSE))) -options(digits.secs=6) -test(1741.5, x3<-capture.output(fwrite(DT,dateTimeAs="write.csv")), - capture.output(write.csv(DT,row.names=FALSE,quote=FALSE))) -options(old) -# check that extra digits made it into output -test(1741.6, sum(nchar(x1)) < sum(nchar(x2)) && sum(nchar(x2)) < sum(nchar(x3))) - -### -options(oldverbose) # last capture.output(fwrite()) has happened now. TODO: tidy up and remove. -### - -# fread should properly handle NA in colClasses argument #1910 -test(1743.1, sapply(fread("a,b\n3,a", colClasses=c(NA, "factor")), class), c(a="integer", b="factor")) -test(1743.2, sapply(fread("a,b\n3,a", colClasses=c(NA, NA)), class), c(a="integer", b="character")) -test(1743.3, fread("a,b\n1,a", colClasses=c(NA, TRUE)), error="colClasses is.*logical.*but it has some TRUE or FALSE.*not allowed") -# also unknown issue in mixed character/factor output and colClasses vector -test(1743.4, sapply(fread("a,b\n1,a", colClasses=c("character", "factor")), class), c(a="character", b="factor")) - -# rolling join stopped working for double with fractions, #1904 -DT = data.table(A=c(1999.917,2000.417,2000.917,2001.417,2001.917)) -setkey(DT,A) -x = c(2000.167,2000.417,2000.667,2000.917,2001.167) -test(1744.1, DT[.(x),roll=FALSE,which=TRUE], INT(NA,2,NA,3,NA)) -test(1744.2, DT[.(x),roll=TRUE, which=TRUE], INT(1,2,2,3,3)) -test(1744.3, DT[.(x),roll=1/12, which=TRUE], INT(NA,2,NA,3,NA)) - -# 0's at the end of a non-empty subset of empty DT, #1937 -test(1745.1, data.table(a=character(0))[c(1,0)], data.table(a=NA_character_)) -test(1745.2, data.table(a=numeric(0))[c(1,0)], data.table(a=NA_real_)) -test(1745.3, data.table(a=integer(0))[c(1,0)], data.table(a=NA_integer_)) - -# Long standing crash when by=.EACHI, nomatch=0, the first item in i has no match -# AND j has function call that is passed a key column, #1933. -DT = data.table(A=letters[1:5],B=1:5,key="A") -ids = c("p","q","r","c","s","d") -test(1746.1, DT[ids, A, by=.EACHI, nomatch=0], data.table(A=c("c","d"),A=c("c","d"))) # was always ok -test(1746.2, DT[ids, print(A), by=.EACHI, nomatch=0], # reliable crash in v1.9.6 and v1.9.8 - data.table(A=character(0)), output="\"c\".*\"d\"") -test(1746.3, DT[ids, {print(A);A}, by=.EACHI, nomatch=0], # reliable crash in v1.9.6 and v1.9.8 - data.table(A=c("c","d"),V1=c("c","d")), output="\"c\".*\"d\"") - -# combining on= with by= and keyby=, #1943 -freshDT = data.table(x = rep(c("a", "b"), each = 4), y = 1:0, z = c(3L, 6L, 8L, 5L, 4L, 1L, 2L, 7L)) -DT = copy(freshDT) -test(1747.1, DT["b", max(z), by = y, on = "x"], ans1<-data.table(y=1:0, V1=c(4L,7L))) -test(1747.2, DT["b", max(z), keyby = y, on = "x"], ans2<-data.table(y=0:1, V1=c(7L,4L), key="y")) -test(1747.3, DT[x=="b", max(z), by = y], ans1) -test(1747.4, DT[x=="b", max(z), keyby = y], ans2) -DT = copy(freshDT) # to clear any auto indexes -test(1747.5, DT[x=="b", max(z), by = y], ans1) -test(1747.6, DT[x=="b", max(z), keyby = y], ans2) -setkey(DT, x) -test(1747.7, DT["b", max(z), by = y], ans1) -test(1747.8, DT["b", max(z), keyby = y], ans2) -DT = copy(freshDT) # and agin without the == having run before the setkey -setkey(DT, x) -test(1747.9, DT["b", max(z), by = y], ans1) -test(1747.11, DT["b", max(z), keyby = y], ans2) - -DT = as.data.table(mtcars[mtcars$cyl %in% c(6, 8), c("am", "vs", "hp")]) -test(1748.1, DT[.(0), max(hp), by = vs, on = "am"], ans1<-data.table(vs=c(1,0), V1=c(123,245))) -test(1748.2, DT[.(0), max(hp), keyby = vs, on = "am"], ans2<-data.table(vs=c(0,1), V1=c(245,123), key="vs")) -DT = as.data.table(mtcars[mtcars$cyl %in% c(6, 8), c("am", "vs", "hp")]) -test(1748.3, DT[am==0, max(hp), by=vs], ans1) -test(1748.4, DT[am==0, max(hp), keyby=vs], ans2) - -# indices() can return list of vectors, #1589 -DT = data.table(A=5:1,B=letters[5:1]) -setindex(DT) -setindex(DT, A) -setindex(DT, B) -indices(DT, vectors = TRUE) -test(1749.1, indices(DT), c("A__B","A","B")) -test(1749.2, indices(DT, vectors = TRUE), list(c("A","B"),"A","B")) - -# Grouping Sets #1377 -n = 24L -set.seed(25) -dt <- data.table( - color = sample(c("green","yellow","red"), n, TRUE), - year = as.Date(sample(paste0(2011:2015,"-01-01"), n, TRUE)), - status = as.factor(sample(c("removed","active","inactive","archived"), n, TRUE)), - amount = sample(1:5, n, TRUE), - value = sample(c(3, 3.5, 2.5, 2), n, TRUE) -) -test(1750.1, # empty input gets grand total only when asked in `sets` with `character()` - groupingsets(dt[0L], j = sum(value), by = c("color","year","status"), sets=list(c("color"))), - data.table(color=character(), year=as.Date(NA)[-1L], status=factor(), V1=numeric()) -) -test(1750.2, # empty input gets grand total non-NA, if asked. Was affected by as.factor(NA) in R 2.15.0 - groupingsets(dt[0L], j = sum(value), by = c("color","year","status"), sets=list(c("color"), character())), - data.table(color=NA_character_, year=as.Date(NA), status=as.factor(NA), V1=0) -) -test(1750.3, # empty input non-NA grand total, also retain classes and aggregation level - groupingsets(dt[0L], j = lapply(.SD, sum), by = c("color","year","status"), sets=list(c("color"), character()), id=TRUE), - data.table(grouping=7L, color=NA_character_, year=as.Date(NA), status=as.factor(NA), amount=0L, value=0) -) -test(1750.4, # `sets=list()` produces 0 nrow, for grand total use `set=list(character())` - test at top - nrow(groupingsets(dt, j = c(list(cnt=.N), lapply(.SD, sum)), by = c("year","status"), .SDcols=c("amount","value"), sets=list(), id=TRUE)), - 0L -) -test(1750.5, # `by` must have unique column names - groupingsets(dt, j = c(list(cnt=.N), lapply(.SD, sum)), by = c("year","status","year"), .SDcols=c("amount","value"), sets=list("year"), id=TRUE), - error = "Argument 'by' must have unique column names" -) -test(1750.6, # 0 ncol `x` - groupingsets(data.table(), j = c(list(cnt=.N), lapply(.SD, sum)), by = c("year","status"), .SDcols=c("amount","value"), sets=list(c("year")), id=TRUE), - error = "Argument 'x' is 0 column data.table, no measure to apply grouping over." -) -test(1750.7, # 0 length `by`, must also use `sets=list()`, so 0L rows result - nrow(groupingsets(dt, j = c(list(cnt=.N), lapply(.SD, sum)), by = character(), .SDcols=c("amount","value"), sets=list(), id=TRUE)), - 0L -) -test(1750.8, all( # for any single value from dataset there should be always same aggregate result on any level of grouping - sapply(seq_len(nrow(dt)), function(i) uniqueN( - groupingsets(dt[i], j = lapply(.SD, sum), by = c("color","year","status"), sets=list(c("color","year","status"), c("year"), c("status"), character())), - by=c("amount","value") - )) == 1L -), TRUE) -# all grouping id matches in all totals -r = groupingsets(dt, j = c(list(cnt=.N), lapply(.SD, sum)), by = c("color","year","status"), sets=list(c("color","year","status"), c("year"), c("status"), character()), id=TRUE) -test(1750.9, uniqueN( - r[, lapply(.SD, sum), by = "grouping", .SDcols = c("cnt","amount","value")], - by = c("cnt","amount","value") -), 1L) -# groupingsets grouping by 'value' still possible -r = groupingsets(dt, j = sum(amount), by = c("color","year","status","value"), sets=list(c("color","year","status"), c("year"), c("status"), character())) -test(1750.10, - sapply(r, class), - c("color"="character","year"="Date","status"="factor","value"="numeric","V1"="integer") -) -# groupingsets on aggregate using grouping col char type and sum - error -test(1750.11, - groupingsets(dt, j = lapply(.SD, sum), by = c("status","year"), sets=list(character()), .SDcols="color"), - error = "invalid 'type' (character) of argument" -) -# groupingsets on aggregate using grouping col factor type and sum - error -test(1750.12, - groupingsets(dt, j = lapply(.SD, sum), by = c("color","year"), sets=list(character()), .SDcols="status"), - error = "not meaningful for factors" -) -# groupingsets on aggregate using grouping col char type and length, match on all subtotals -r = groupingsets(dt, j = lapply(.SD, length), by = c("status","year"), sets=list(c("year"), c("status","year"), character()), .SDcols="color", id=TRUE) -test(1750.13, uniqueN( - r[, lapply(.SD, sum), by = "grouping", .SDcols = c("color")], - by = c("color") -), 1L) -# groupingsets double listing column, to measure and grouping -test(1750.14, - groupingsets(dt, j = lapply(.SD, sum), by = c("color","amount"), sets=list(c("color"), c("color","amount")), .SDcols="amount", id=TRUE), - error = "There exists duplicated column names in the results" -) -test(1750.15, - groupingsets(dt, j = .(color = sum(value)), by = c("color","amount"), sets=list(c("color"), c("color","amount")), id=TRUE), - error = "There exists duplicated column names in the results" -) -# set equals to `character(0)` should return grand total -sets = list(character()) -test(1750.16, - groupingsets(dt, j = c(list(cnt=.N), lapply(.SD, sum)), by = c("color","year","status"), sets=sets, id=TRUE), - dt[, c(list(cnt=.N), lapply(.SD, sum)), .(grouping=rep(7L,n), color=rep(NA_character_,n), year=rep(as.Date(NA),n), status=as.factor(rep(NA_character_,n)))] -) -# duplicate entries in `sets` vector-wise -sets = list("color", c("color","year","status","year","status"), "year", character()) -test(1750.17, - groupingsets(dt, j = c(list(cnt=.N), lapply(.SD, sum)), by = c("color","year","status"), sets=sets, id=TRUE), - error = "Character vectors in 'sets' list must not have duplicated column names within single grouping set." -) -# duplicate entries in `sets` - double counting - actually aggregate `grouping!=5L` (not double counted) to compare to double counted values on `grouping==5L`, as double counting is expected results for this unexpected usage -sets = list("year", c("color","year"), "year", character()) -test(1750.18, uniqueN({ - r <- groupingsets(dt, j = c(list(cnt=.N), lapply(.SD, sum)), by = c("color","year","status"), sets=sets, id=TRUE) - r[, lapply(.SD, sum), by = .(double_counting = grouping==5L, double_counting = grouping!=5L), .SDcols = c("cnt","amount","value")] -}, by = c("cnt","amount","value") -), 1L, warning = "Double counting is going to happen") -# duplicate entries in `sets` but reorderd - double counting on `grouping==1L` -sets = list(c("color","year"), "year", c("year","color"), character()) -test(1750.19, uniqueN({ - r <- groupingsets(dt, j = c(list(cnt=.N), lapply(.SD, sum)), by = c("color","year","status"), sets=sets, id=TRUE) - r[, lapply(.SD, sum), by = .(double_counting = grouping==1L, double_counting = grouping!=1L), .SDcols = c("cnt","amount","value")] -}, by = c("cnt","amount","value") -), 1L, warning = "Double counting is going to happen") -# entries in `by` / `sets` not exists in data.table -test(1750.20, groupingsets(dt, j = c(list(cnt=.N), lapply(.SD, sum)), by = c("color","year","stat"), sets=list(c("color"), character()), id=TRUE), error = "object 'stat' not found") -test(1750.21, groupingsets(dt, j = c(list(cnt=.N), lapply(.SD, sum)), by = c("color","year","status"), sets=list(c("color"), "stat"), id=TRUE), error = "Columns used in 'sets' but not present in 'by': stat") -test(1750.22, groupingsets(dt, j = .(a=sum(a)), by = c("color","year","status"), sets=list(c("color"), character()), id=TRUE), error = "object 'a' not found") -# update by ref `:=` forbidden -test(1750.23, - groupingsets(dt, j = sum_value := sum(value), by = c("color","year","status"), sets=list(c("color"), character())), - error = "Expression passed to grouping sets function must not update by reference." -) -# rollup -sets = local({ - by=c("color","year","status") - lapply(length(by):0, function(i) by[0:i]) -}) -test(1750.31, - rollup(dt, j = c(list(cnt=.N), lapply(.SD, sum)), by = c("color","year","status"), id=TRUE), - groupingsets(dt, j = c(list(cnt=.N), lapply(.SD, sum)), by = c("color","year","status"), sets=sets, id=TRUE) -) -sets = local({ - by=c("year","status") - lapply(length(by):0, function(i) by[0:i]) -}) -test(1750.32, - rollup(dt, j = c(list(cnt=.N), lapply(.SD, sum)), by = c("year","status"), .SDcols=c("amount","value"), id=TRUE), - groupingsets(dt, j = c(list(cnt=.N), lapply(.SD, sum)), by = c("year","status"), .SDcols=c("amount","value"), sets=sets, id=TRUE) -) -# cube -sets = local({ - by=c("color","year","status") - n = length(by) - keepBool = sapply(2L^(1:n - 1L), function(k) rep(c(FALSE, TRUE), each=k, times=(2L^n / (2L*k)))) - lapply((2L^n):1, function(j) by[keepBool[j, ]]) -}) -test(1750.33, - cube(dt, j = c(list(cnt=.N), lapply(.SD, sum)), by = c("color","year","status"), id=TRUE), - groupingsets(dt, j = c(list(cnt=.N), lapply(.SD, sum)), by = c("color","year","status"), sets=sets, id=TRUE) -) -sets = local({ - by=c("year","status") - n = length(by) - keepBool = sapply(2L^(1:n - 1L), function(k) rep(c(FALSE, TRUE), each=k, times=(2L^n / (2L*k)))) - lapply((2L^n):1, function(j) by[keepBool[j, ]]) -}) -test(1750.34, - cube(dt, j = c(list(cnt=.N), lapply(.SD, sum)), by = c("year","status"), .SDcols=c("amount","value"), id=TRUE), - groupingsets(dt, j = c(list(cnt=.N), lapply(.SD, sum)), by = c("year","status"), .SDcols=c("amount","value"), sets=sets, id=TRUE) -) -# grouping sets with integer64 -if (test_bit64) { - set.seed(26) - dt[, c("id1","id2") := list(as.integer64(sample(sample(n, n/4), n, TRUE)), as.integer64(sample(sample(n, n/2), n, TRUE)))] - # int64 as grouping cols - r = groupingsets(dt, j = lapply(.SD, sum), by = c("color","id1","id2"), sets=list(c("color","id1"), c("color","id1","id2"), "id2", c("id1","id2"), "color", character()), .SDcols=c("amount","value"), id=TRUE) - test(1750.41, # grand total - r[grouping==7L, .(color, id1, id2, amount, value)], - dt[, lapply(.SD, sum), .(color=rep(NA_character_, n), id1=as.integer64(rep(NA,n)), id2=as.integer64(rep(NA,n))), .SDcols=c("amount","value")] - ) - test(1750.42, # by color - r[grouping==3L, .(color, id1, id2, amount, value)], - dt[, lapply(.SD, sum), .(color, id1=as.integer64(rep(NA,n)), id2=as.integer64(rep(NA,n))), .SDcols=c("amount","value")] - ) - test(1750.43, # by id2 - r[grouping==6L, .(color, id1, id2, amount, value)], - dt[, lapply(.SD, sum), .(color=rep(NA_character_,n), id1=as.integer64(rep(NA,n)), id2), .SDcols=c("amount","value")] - ) - test(1750.44, # by id1, id2 - r[grouping==4L, .(color, id1, id2, amount, value)], - dt[, lapply(.SD, sum), .(color=rep(NA_character_,n), id1, id2), .SDcols=c("amount","value")] - ) - # int64 as measure cols - r = groupingsets(dt, j = lapply(.SD, sum), by = c("color","status"), sets=list(c("color","status"), "status", character()), .SDcols=c("amount","value","id1","id2"), id=TRUE) - test(1750.45, # grand total. # was affected by as.factor(NA) in R 2.15.0 - r[grouping==3L, .(color, status, amount, value, id1, id2)], - dt[, lapply(.SD, sum), .(color=rep(NA_character_,n), status=as.factor(rep(NA_character_,n))), .SDcols=c("amount","value","id1","id2")] - ) - test(1750.46, # by status - r[grouping==2L, .(color, status, amount, value, id1, id2)], - dt[, lapply(.SD, sum), .(color=rep(NA_character_,n), status), .SDcols=c("amount","value","id1","id2")] - ) - # int64 as grouping and measure cols - r = groupingsets(dt, j = lapply(.SD, sum), by = c("color","id1"), sets=list(c("color","id1"), "id1", character()), .SDcols=c("amount","value","id2"), id=TRUE) - test(1750.47, # grand total - r[grouping==3L, .(color, id1, amount, value, id2)], - dt[, lapply(.SD, sum), .(color=rep(NA_character_,n), id1=as.integer64(rep(NA,n))), .SDcols=c("amount","value","id2")] - ) - test(1750.48, # by id1 - r[grouping==2L, .(color, id1, amount, value, id2)], - dt[, lapply(.SD, sum), .(color=rep(NA_character_,n), id1), .SDcols=c("amount","value","id2")] - ) -} -# end Grouping Sets - -# for completeness, added test for NA problem to close #1837. -DT = data.table(x=NA) -test(1751.1, capture.output(fwrite(DT)), c("x","")) -test(1751.2, capture.output(fwrite(DT,na="")), c("x","")) -test(1751.3, capture.output(fwrite(DT,na="NA")), c("\"x\"","NA")) -test(1751.4, fread({fwrite(DT, f<-tempfile());f}), DT) # the important thing -unlink(f) - -if (test_nanotime) { - DT = data.table(A=nanotime(tt<-c("2016-09-28T15:30:00.000000070Z", - "2016-09-29T23:59:00.000000001Z", - "2016-09-29T23:59:00.000000999Z", - "1970-01-01T00:01:01.000001000Z", - "1970-01-01T00:00:00.000000000Z", - "1969-12-31T23:59:59.999999999Z", - "1969-12-31T23:59:59.000000089Z", - "1969-12-31T12:13:14.000000000Z", - "1969-12-31T12:13:14.999999999Z", - "1969-12-31T12:13:14.000000001Z", - "1967-03-15T00:00:00.300000002Z", - "1967-03-15T23:59:59.300000002Z"))) - test(1752, capture.output(fwrite(DT, verbose=FALSE))[-1], tt) -} - -# check too many fields error from ,\n line ending highlighted in #2044 -test(1753.1, fread("X,Y\n1,2\n3,4\n5,6"), data.table(X=INT(1,3,5),Y=INT(2,4,6))) -test(1753.2, fread("X,Y\n1,2\n3,4,\n5,6",logical01=TRUE), ans<-data.table(X=TRUE,Y=2L), warning="Stopped.*line 3. Expected 2 fields but found 3.*discarded.*<<3,4,>>") -test(1753.3, fread("X,Y\n1,2\n3,4,7\n5,6",logical01=TRUE), ans, warning="Stopped.*line 3. Expected 2 fields but found 3.*discarded.*<<3,4,7>>") - -# issue 2051 where a quoted field contains ", New quote rule detection handles it. -test(1753.4, fread(testDir("issue_2051.csv"))[2,grep("^Our.*tool$",COLUMN50)], 1L) - -# check omp critical around SET_STRING_ELT -# minimal construction big enough for parallelism with 8 or less threads. On a machine with more, do setDTthreads(8) first otherwise -# it'll switch back to single threaded. In dev I have 8 threads and on CRAN there are 2 which will run this test nicely. -# Without the critical in fread.c, this test will crash R consistently which is correct (tested). -# Needs to be run in a fresh R session, otherwise it will work just because these strings have been seen before and added to -# the global character cache already. -# Created with: -# x = unlist(outer(outer(LETTERS,LETTERS,paste0),LETTERS,paste0)) -# dt = as.data.table(matrix(x, ncol=2)) -# setnames(dt,paste0("col",1:2)) -# fwrite(dt,"allchar.csv") -# fwrite(dt,"allchar.csv",append=TRUE) -test(1754, fread(testDir("allchar.csv"))[c(1,2,17575,17576),col2], c("AAN","BAN","YZZ","ZZZ")) - -# unescaped embedded quotes from here: http://stackoverflow.com/questions/42939866/fread-multiple-separators-in-a-string -test(1755, fread(testDir("unescaped.csv"), logical01=TRUE), - data.table(No =c(FALSE,TRUE), - Comment=c('he said:"wonderful."', 'The problem is: reading table, and also "a problem, yes." keep going on.'), - Type =c('A','A'))) - -# test duplicated colClasses -txt = "A,B,C,D\n1,3,5,7\n2,4,6,8\n" -test(1756.1, fread(txt), data.table(A=1:2, B=3:4, C=5:6, D=7:8)) -test(1756.2, fread(txt, colClasses=list('numeric'=c(1,3))), data.table(A=as.double(1:2), B=3:4, C=as.double(5:6), D=7:8)) -test(1756.3, fread(txt, colClasses=list('numeric'=c(1,3,1))), error="Column 'A' appears more than once in colClasses") -test(1756.4, fread(txt, colClasses=list('numeric'=c(1,3),'character'=2)), - data.table(A=as.double(1:2), B=c("3","4"), C=as.double(5:6), D=7:8)) -test(1756.5, fread(txt, colClasses=list('numeric'=c(1,2),'character'=2)), error="Column 'B' appears more than once") - -# Windows \r\n line endings when using multiple threads and detecting type within quoted fields, #2087 -test(1757, fread(testDir("winallquoted.csv"))[c(1,2,4998,4999)], - data.table(station_id=2L, bikes_available=c(2L,2L,11L,11L), docks_available=c(25L,25L,16L,16L), - time=c("2013/08/29 12:06:01","2013/08/29 12:07:01","2013/09/02 08:48:01","2013/09/02 08:50:01"))) - -test(1758, sapply(fread("A,B\n,"),class), c(A="logical",B="logical")) - -# Slowdown when parallel and all columns are character, #2091. This test tests the data loads ok but we need a -# performance test environment to make sure the slowdown doesn't come back. Fix was to delay call to SET_. -test(1759, fread(testDir("alluniquechar.csv"))[c(1,2,499,500)], - data.table(A=c("jptokakysooopwtmlkeimzbgpeinhy","bchguwmynjhecsxpxldyzlemavmwvz", - "avlyclruzkazfqhyxnppaafwcveolb","dkmyfqhltlwzwwxyvshwrzrdmfyqdm"), - B=c("jptokakysooopwtmlkei","bchguwmynjhecsxpxldy","avlyclruzkazfqhyxnpp","dkmyfqhltlwzwwxyvshw"), - C=c("kakysooopwt","uwmynjhecsx","clruzkazfqh","fqhltlwzwwx"), - D=c("pt","ch","vl","km"), - E=c("i","y","p","w"), - F=c("kyso","mynj","ruzk","hltl"), - G=c("ptokakysooopwtmlkeimz","chguwmynjhecsxpxldyzl","vlyclruzkazfqhyxnppaa","kmyfqhltlwzwwxyvshwrz"), - H=c("tokakysooopwtmlkeimzbgpein","hguwmynjhecsxpxldyzlemavmw", - "lyclruzkazfqhyxnppaafwcveo","myfqhltlwzwwxyvshwrzrdmfyq"))) - -# fread should use multiple threads on single column input. -# tests 2 threads; the very reasonable limit on CRAN -# file needs to be reasonably large for threads to kick in (minimum chunkSize is 1MB currently) -if (getDTthreads() != 2) { - cat("Test 1760 not run because this session either has no OpenMP or has been limited to one thread (e.g. under UBSAN and ASAN)\n") -} else { - N = if (TRUE) 2e6 else 1e9 # offline speed check - fwrite(data.table(A=sample(10,N,replace=TRUE)), f<-tempfile()) - test(1760.1, file.info(f)$size > 4*1024*1024) - test(1760.2, fread(f, verbose=TRUE, nThread=2), output="using 2 threads") - unlink(f) -} - -# fread single column with superfluous fill=TRUE, #2118 -test(1761.1, fread("1\n2\n3", fill=TRUE), data.table(V1=1:3)) -test(1761.2, fread("1\n2\n3", fill=FALSE), data.table(V1=1:3)) - -# non-error with non-empty empty j, #2142 -DT = data.table(a = 1:5) -test(1762, DT[ , {}], NULL) - -# rbindlist empty items segfault, #2019 -x = list(list(a = 1), list(), list(a = 2)) -ans = data.table(id=c(1L,3L),a=c(1,2)) -for (i in 1:100) test(1763, rbindlist(x, idcol="id"), ans) - -# as.ITime(character(0)) used to fail, #2032 -test(1764.1, format(as.ITime(character(0))), character(0)) -# Edge case from #2171 -test(1764.2, format(structure(NA_integer_, class = "ITime")), NA_character_) - -# IDateTime error when tzone is NULL, #1973 -x = as.POSIXct('2017-03-17', tz="UTC") -attr(x, 'tzone') = NULL -test(1765, print(IDateTime(x)), output=".*idate.*itime.*1: 2017-03-17") - -# print(null.data.table()) should not output NULL as well, #1852 -# use capture.output() in this case rather than output= to ensure NULL is not output -test(1766, capture.output(print(data.table(NULL))), "Null data.table (0 rows and 0 cols)") - -# Bug on subset of 1-row data.table when expr returns a named logical vector #2152 -op = options(datatable.auto.index=FALSE) -dt = data.table(x=1, y="a") -val = c(foo=1L) -test(1767, dt[x == val], data.table(x=1, y="a")) -options(op) - -# fread sampling overlap and reaching end early on small files with varying line lengths, #2157 -test(1768, fread(testDir("issue_2157_sampling_overlap.txt"))[,c("X1","X2","X7","X8")], - output="X1 X2.*1: ABCD021917 NA.*678.0000.*2:.*1314: ABCD032617.*732.9818") -test(1769, fread(testDir("issue_2157_sampling_reached_eof_early.txt"))[,c("X1","X2","X10","X11")], - output="X1 X2.*1:.*6.00.*2: 2005-08-15.*1228: 2017-05-10 0 -112186.00 500") - -# Test unbounded strstr() (in particular when fileSize is exactly 64k on Windows), #2201 -ff = file(f<-tempfile(), open="wb") -line255 = paste(rep("123,456,789,0AB",16),collapse=",") -test(1770.1, nchar(line255), 255L) -for (i in 1:256) cat(line255, "\x0A", sep="", file=ff) # use \n line ending even on Windows -close(ff) -test(1770.2, file.info(f)$size, 65536) -test(1770.3, fread(f)[256,V64], "0AB") -test(1770.4, fread(f, skip="spam"), error="not found in input") -unlink(f) -# Now without final newline but still exactly 65536 in size : -ff = file(f<-tempfile(), open="wb") -for (i in 1:255) cat(line255, "\x0A", sep="", file=ff) -cat(line255, "C", sep="", file=ff) -close(ff) -test(1770.5, file.info(f)$size, 65536) -test(1770.6, fread(f)[256,V64], "0ABC") -test(1770.7, fread(f, skip="spam"), error="not found in input") -unlink(f) - -# CJ retains attributes and classes, #2029, PR#2150 - -l <- list(a = as.POSIXct(c("2016-01-01", "2017-01-01"), tz = "UTC"), - b = as.POSIXct(c("2016-01-01", "2017-01-01")), - c = as.Date("2015-01-01"), ## according to comment about CJ loosing date class - d = factor(c("a", "b", "c"), ordered = TRUE), ## according to comment about bug with ordered factors - e = factor(c("a", "b", "c"), ordered = FALSE), - f = c(1,2), - g = c("a", "b"), - h = c(TRUE, FALSE)) -setattr(l$g, "test", "testval")## add hand-made attribute - -test(1771.1, lapply(l, attributes), lapply(do.call(CJ, l), attributes)) -test(1771.2, lapply(l, class), lapply(do.call(CJ, l), class)) - -l <- list(a = factor(c("a", "b", "c"), ordered = TRUE), - b = as.POSIXct(c("2016-01-01", "2017-01-01")), - c = as.Date("2015-01-01"), - d = factor(c("a", "b", "c"), ordered = TRUE), - e = as.POSIXct(c("2016-01-01", "2017-01-01"), tz = "UTC"), - f = c(1,2), - g = c("a", "b"), - h = c(TRUE, FALSE)) - - -test(1771.3, lapply(l, attributes), lapply(do.call(CJ, l), attributes)) -test(1771.4, lapply(l, class), lapply(do.call(CJ, l), class)) - -l <- list(a = factor(c("a", "b", "c"), ordered = TRUE), - b = as.POSIXct(c("2016-01-01", "2017-01-01")), - c = as.Date("2015-01-01"), - d = factor(c("a", "b", "c"), ordered = TRUE), - e = c(TRUE, FALSE), - f = c(1,2), - g = c("a", "b"), - h = as.POSIXct(c("2016-01-01", "2017-01-01"), tz = "UTC")) - -test(1771.5, lapply(l, attributes), lapply(do.call(CJ, l), attributes)) -test(1771.6, lapply(l, class), lapply(do.call(CJ, l), class)) - -l <- list(a = NA, - c = c(1,2), - d = as.POSIXct("2016-01-01", tz = "UTC")) - -test(1771.7, lapply(l, attributes), lapply(do.call(CJ, l), attributes)) -test(1771.8, lapply(l, class), lapply(do.call(CJ, l), class)) - -# split.data.table should respect non-alphabetic order if passed a factor in by, #2082 -DT = data.table(a = factor(c('a', 'b', 'b', 'a'), levels = c('b', 'a')), - b = c(2, 2, 1, 1), c = 1:4) -test(1772.1, split(DT, by = 'a', sorted = TRUE), - list(b = data.table(a = structure(c(1L, 1L), .Label = c("b", "a"), class = "factor"), - b = c(2, 1), c = 2:3), - a = data.table(a = structure(c(2L, 2L), .Label = c("b", "a"), class = "factor"), - b = c(2, 1), c = c(1L, 4L)))) -test(1772.2, split(DT, by = c('a', 'b'), sorted = TRUE), - list(b.1 = data.table(a = structure(1L, .Label = c("b", "a"), class = "factor"), b = 1, c = 3L), - b.2 = data.table(a = structure(1L, .Label = c("b", "a"), class = "factor"), b = 2, c = 2L), - a.1 = data.table(a = structure(2L, .Label = c("b", "a"), class = "factor"), b = 1, c = 4L), - a.2 = data.table(a = structure(2L, .Label = c("b", "a"), class = "factor"), b = 2, c = 1L))) - -# More helpful error message when using a single symbol name for a logical column to subset, #1844 -# Used to be just 'not found' -if (exists("A")) rm(A) -if (exists("B")) rm(B) -if (exists("NOTEXIST")) rm(NOTEXIST) -DT <- data.table(A = c(FALSE, TRUE), B = 1:2) -test(1773.1, DT[A], error = "not found in calling scope.*wrap the symbol with") -test(1773.2, DT[B], error = "not found in calling scope and it is not a column of type logical") -test(1773.3, DT[NOTEXIST], error = "not found in calling scope and it is not a column of type logical") -test(1773.4, DT[(A)], DT[2]) - -# New as.data.table.array method in v1.10.5 -set.seed(1L) -ar.dimnames = list(color = sort(c("green","yellow","red")), - year = as.character(2011:2015), - status = sort(c("active","inactive","archived","removed"))) -ar.dim = sapply(ar.dimnames, length) -ar = array(sample(c(rep(NA, 4), 4:7/2), prod(ar.dim), TRUE), - unname(ar.dim), # array() having length(dims) < 3 will be created as matrix in R so will not be dispatched here but as.data.table.matrix - ar.dimnames) -dt = as.data.table(ar, na.rm=FALSE) -dimcols = head(names(dt), -1L) -test(1774.1, TRUE, all( - nrow(dt) == 60L, - prod(sapply(ar.dimnames, length)) == dt[, prod(sapply(.SD, uniqueN)), .SDcols = dimcols], - dt[is.na(value), .N] == 30L, - dt[, .N==1L, c(dimcols)]$V1 -)) -dt = as.data.table(ar) -dimcols = head(names(dt), -1L) -test(1774.2, TRUE, all( - nrow(dt) == 30L, - prod(sapply(ar.dimnames, length)) == dt[, prod(sapply(.SD, uniqueN)), .SDcols = dimcols], - dt[is.na(value), .N] == 0L, - dt[, .N==1L, c(dimcols)]$V1 -)) -# 4D unnamed -x = array(1:81, dim=rep(3L,4)) -dt = as.data.table(x, na.rm=FALSE) -test(1774.3, TRUE, all( - identical(dim(dt), c(81L,5L)), - identical(names(dt), c(paste0("V",1:4),"value")), - all(dt[J(1L)][1L, value] == 1L, dt[J(2L)][1L, value] == 2L, dt[J(3L)][.N, value] == 81L) # this also tests if dt is keyed -)) -# 4D named dim values but not dims -x = array(1:81, dim=rep(3L, 4L), dimnames=rep(list(letters[1:3]), 4L)) -dt = as.data.table(x, na.rm=FALSE) -test(1774.4, TRUE, all( - identical(dim(dt), c(81L,5L)), - identical(names(dt), c(paste0("V",1:4),"value")), - all(dt[J("a")][1L, value] == 1L, dt[J("b")][1L, value] == 2L, dt[J("c")][.N, value] == 81L) -)) -# 4D named dim values and dims -x = array(1:81, dim=rep(3L, 4L), dimnames=setNames(rep(list(letters[1:3]), 4L), letters[1:4])) -dt = as.data.table(x, na.rm=FALSE) -test(1774.5, TRUE, all( - identical(dim(dt), c(81L,5L)), - identical(names(dt), c(letters[1:4],"value")), - all(dt[J("a")][1L, value] == 1L, dt[J("b")][1L, value] == 2L, dt[J("c")][.N, value] == 81L) -)) -# third dim of length 1L so really 2D -x = array(1:4, dim=c(2L,2L,1L), dimnames=list(a=letters[1:2], b=letters[1:2], c="a")) -dt = as.data.table(x, na.rm=FALSE) -test(1774.6, TRUE, all( - identical(dim(dt), c(4L,4L)), - identical(names(dt), c("a","b","c","value")), - all(dt[J("a")][, value] == c(1L,3L), dt[J("b")][, value] == c(2L,4L)) -)) -# second and third dim of length 1L so really 1D -x = array(1:2, dim=c(2L,1L,1L), dimnames=list(a=letters[1:2], b="a", c="a")) -dt = as.data.table(x, na.rm=FALSE) -test(1774.7, TRUE, all( - identical(dim(dt), c(2L,4L)), - identical(names(dt), c("a","b","c","value")), - all(dt[J("a")][, value] == 1L, dt[J("b")][, value] == 2L) -)) -# 3x3x3 na.rm=FALSE / sorted=TRUE -set.seed(2) -x = rnorm(27) -x[sample(length(x), length(x)/2)] = NA -dim(x) = c(3L,3L,3L) -dt = as.data.table(x, na.rm=FALSE) -test(1774.8, TRUE, all( - identical(dim(dt), c(27L,4L)), - identical(names(dt), c(paste0("V",1:3),"value")), - dt[is.na(value), .N] > 0L, - length(key(dt)) > 0L -)) -# na.rm=TRUE / sorted=TRUE -dt = as.data.table(x) -test(1774.9, TRUE, all( - identical(dim(dt), c(14L,4L)), - identical(names(dt), c(paste0("V",1:3),"value")), - dt[is.na(value), .N] == 0L, - length(key(dt)) > 0L -)) -# na.rm=TRUE / sorted=FALSE -dt = as.data.table(x, sorted=FALSE) -test(1774.10, TRUE, all( - identical(dim(dt), c(14L,4L)), - identical(names(dt), c(paste0("V",1:3),"value")), - dt[is.na(value), .N] == 0L, - is.unsorted(dt[[1]]), - is.null(key(dt)) -)) -# na.rm=FALSE / sorted=FALSE -dt = as.data.table(x, na.rm=FALSE, sorted=FALSE) -test(1774.11, TRUE, all( - identical(dim(dt), c(27L,4L)), - identical(names(dt), c(paste0("V",1:3),"value")), - is.unsorted(dt[[1]]), - is.null(key(dt)) -)) -# expects error on value.name overlapping with column names in result (dimension names) -x = array(1:2, dim=c(2L,1L,1L), dimnames=list(a=letters[1:2], b="a", c="a")) -test(1774.12, as.data.table(x, value.name="a"), error = "Argument 'value.name' should not overlap with column names in result") -x = array(1:2, dim=c(2L,1L,1L), dimnames=list(a=letters[1:2], b="a", value="a")) -test(1774.13, as.data.table(x), error = "Argument 'value.name' should not overlap with column names in result") - -# verify print.keys works -DT1 <- data.table(a = 1:3, key = "a") -test(1775.1, capture.output(print(DT1, print.keys = TRUE)), - c("Key: ", " a", "1: 1", "2: 2", "3: 3")) -DT2 <- data.table(a = 1:3, b = 4:6) -setindexv(DT2, c("b","a")) -test(1775.2, capture.output(print(DT2, print.keys = TRUE)), - c("Index: ", " a b", "1: 1 4", "2: 2 5", "3: 3 6")) -setindexv(DT2, "b") -test(1775.3, capture.output(print(DT2, print.keys = TRUE)), - c("Indices: , ", " a b", "1: 1 4", "2: 2 5", "3: 3 6")) -setkey(DT2, a) -setindexv(DT2, c("b","a")) -test(1775.4, capture.output(print(DT2, print.keys = TRUE)), - c("Key: ", "Index: ", " a b", "1: 1 4", "2: 2 5", "3: 3 6")) - -# dev regression #2285 -cat("A B C\n1 2 3\n4 5 6", file=f<-tempfile()) -test(1776.1, fread(f), data.table(A=c(1L,4L), B=c(2L,5L), C=c(3L,6L))) -unlink(f) -cat("A,B,C\n1,2,3\n4,5,", file=f<-tempfile()) -test(1776.2, fread(f), data.table(A=c(1L,4L), B=c(2L,5L), C=c(3L,NA))) -unlink(f) -txt = '"b","bc8d5",\n"c",,"2f685"\n"d",,\n,"cdfb9",\n' -cat(txt, file=f<-tempfile()) -test(1776.3, fread(f), fread(txt)) -unlink(f) - -# column name detection when some columns are empty, #2370 -test(1777.1, fread(",A,B\n1,3,5\n2,4,6\n"), data.table(V1=1:2, A=3:4, B=5:6)) -test(1777.2, fread("A,,B\n1,3,5\n2,4,6\n"), data.table(A=1:2, V2=3:4, B=5:6)) -test(1777.3, fread("A,B,\n1,3,5\n2,4,6\n"), data.table(A=1:2, B=3:4, V3=5:6)) -test(1777.4, fread(",A,\n1,3,5\n2,4,6\n"), data.table(V1=1:2, A=3:4, V3=5:6)) -test(1777.5, fread("A,,\n1,3,5\n2,4,6\n"), data.table(A=1:2, V2=3:4, V3=5:6)) -test(1777.6, fread(",,A\n1,3,5\n2,4,6\n"), data.table(V1=1:2, V2=3:4, A=5:6)) -test(1777.7, fread(",9,A\n1,3,5\n2,4,6\n"), data.table(V1=1:2, "9"=3:4, A=5:6)) -test(1777.8, fread(",A,9\n1,3,5\n2,4,6\n"), data.table(V1=1:2, A=3:4, "9"=5:6)) -test(1777.9, fread(",7,9\n1,3,5\n2,4,6\n"), data.table(V1=c(NA,1:2), V2=c(7L,3:4), V3=c(9L,5:6))) -# we skip test numbers .10, .20 etc because they print as .1 and .2 -test(1777.11, fread(",,\n1,3,5\n2,4,6\n"), data.table(V1=c(NA,1:2), V2=c(NA,3:4), V3=c(NA,5:6))) -test(1777.12, fread(",A,B\n1,3,5\n2,4,6\n", logical01=FALSE), data.table(V1=1:2, A=3:4, B=5:6)) # logical01 is included to catch a prior bug despite there being no logical columns -test(1777.13, fread(",A,B\n1,3,5\n2,4,6\n", header=TRUE), data.table(V1=1:2, A=3:4, B=5:6)) -test(1777.14, fread(",A,B\n1,3,5\n2,4,6\n", header=FALSE), data.table(V1=c(NA,1:2), V2=c("A",3:4), V3=c("B",5:6))) -test(1777.15, fread("A,B,C\n", verbose=TRUE), data.table(A=logical(),B=logical(),C=logical()), - output="because there are no number fields in the first and only row") -test(1777.16, fread("A,B,3\n", verbose=TRUE), data.table(V1="A",V2="B",V3=3L), - output="because there are number fields in the first and only row") -test(1777.17, fread("A,B,3\nC,D,4\n", verbose=TRUE), data.table(V1=c("A","C"),V2=c("B","D"),V3=3:4), - output="because there are some number columns and those columns do not have a string field at the top of them") -test(1777.18, fread("A,B,C\nD,E,F\n", verbose=TRUE), data.table(A="D", B="E", C="F"), - output="because all columns are type string and a better guess is not possible") -test(1777.19, fread("A,B,C\nC,D,4\n", verbose=TRUE), data.table(A="C",B="D",C=4L), - output="due to column 3 containing a string on row 1 and a lower type.*in the rest of the.*sample rows") - -# unquoted fields containing \r, #2371 -test(1778.1, fread("A,B,C\n0,,\n1,hello\rworld,2\n3,test,4\n", verbose=TRUE), - DT <- data.table(A=c(0L,1L,3L), B=c("","hello\rworld","test"), C=c(NA,2L,4L)), - output="has been found.*common and ideal") -fwrite(DT, f<-tempfile()) -test(1778.2, readLines(f), c("A,B,C", "0,\"\",", "1,\"hello", "world\",2", "3,test,4")) -# fwrite quotes the field containing \r ........... ^^ ............ ^^ -# and that reading back in gets us back to DT faithfully -test(1778.3, fread(f), DT) -tt = setDT(read.csv(f, stringsAsFactors=FALSE)) -tt[2, B:=gsub("\n","\r",B)] # base R changes the \r to a \n, so restore that -test(1778.4, tt, DT) -unlink(f) - -# #1392 IDate ITime new methods for faster conversion -# conversion in-out match for UTC -same = list(l = as.POSIXlt("2015-10-12 13:19:35", tz = "UTC")) -same$p = as.POSIXct(same$l) -same$d = as.Date(same$p) -same$n = as.numeric(same$d) -same$i = as.integer(same$d) -ld = sapply(same, as.IDate) -test(1779.1, uniqueN(ld)==1L) -lt = sapply(same[1:2], as.ITime) # exclude date -test(1779.2, uniqueN(lt)==1L) -# some random 1e6 timestamps old defaults vs new methods UTC -intpx = function(x) as.integer(as.POSIXct(x, origin = "1970-01-01", tz = "UTC")) -set.seed(1) -i = sample(intpx("2015-10-12")-intpx("2014-10-12"), 1e5, TRUE) + intpx("2014-10-12") -p = as.POSIXct(i, origin = "1970-01-01", tz = "UTC") -test(1779.3, identical(as.ITime.default(p), as.ITime(p))) -test(1779.4, identical(as.IDate.default(p), as.IDate(p))) -# test for non-UTC -p = as.POSIXct(i, origin = "1970-01-01", tz = "Asia/Hong_Kong") -test(1779.5, identical(as.ITime.default(p), as.ITime(p))) -test(1779.6, identical(as.IDate.default(p), as.IDate(p))) -p = as.POSIXct(i, origin = "1970-01-01", tz = "America/New_York") -test(1779.7, identical(as.ITime.default(p), as.ITime(p))) -test(1779.8, identical(as.IDate.default(p), as.IDate(p))) - -# R 3.0.1 had the following bug fix in R News : -# " as.POSIXct.numeric was coercing origin using the tz argument and not "GMT" as documented (PR#14973) " -# So tz="UTC" is required on next line for test 1779.9 to pass R 3.0.0 (current stated dependency). -# Test 1779.9 would be fine without the tz="UTC" from R 3.0.1 onwards. -p = as.POSIXct(i, origin = "1970-01-01", tz="UTC") -test(1779.9, identical(as.ITime.default(p), as.ITime(p))) -test(1779.11, identical(as.IDate.default(p), as.IDate(p))) -test(1779.12, as.IDate("20170929", "%Y%m%d"), as.IDate("20170929", format="%Y%m%d")) # 2453 -test(1779.13, as.IDate(1), as.IDate("1970-01-02")) # 2446 -test(1779.14, as.IDate(1L), as.IDate("1970-01-02")) - - -########################## - -test(1800, fread("A\n6e55693457e549ecfce0\n"), data.table(A=c("6e55693457e549ecfce0"))) -test(1800.1, fread("A\n1e55555555\n-1e+234056\n2e-59745"), data.table(A=c("1e55555555","-1e+234056","2e-59745"))) - -# -# Tests thanks to Pasha copied verbatim from his PR#2200 -# -# Test files with "round" sizes (different multiples of 2, from 512B to 64KB) -for (mul in c(16, 128, 512, 1024, 2048)) { - ff = file(f<-tempfile(), open="wb") - cat(paste(rep("1234,5678,9012,3456,7890,abcd,4\x0A", mul), collapse=""), file=ff) - close(ff) - DT = data.table(V1=rep(1234L, mul), V2=5678L, V3=9012L, V4=3456L, V5=7890L, V6="abcd", V7=4L) - test(1801 + log2(mul)/100, file.info(f)$size, mul*32) - test(1802 + log2(mul)/100, fread(f), DT) -} -# Test without the newline -ff = file(f<-tempfile(), open="wb") -cat(paste("1", paste(rep("1234,5678,9012,3456,7890,zyxw,4", 128), collapse="\x0A"), sep=""), file=ff) -close(ff) -test(1803.1, file.info(f)$size, 4096) -DT = data.table(V1=rep(1234L, 128), V2=5678L, V3=9012L, V4=3456L, V5=7890L, V6="zyxw", V7=4L) -DT[1, 1] = 11234L -test(1803.2, fread(f), DT) - -test(1804.1, fread("A,B\n", na.strings=" NA"), error="NAstring .* has whitespace at the beginning or end") -test(1804.2, fread("A,B\n", na.strings="NA\t"), error="NAstring .* has whitespace at the beginning or end") -test(1805, fread("A\n", verbose=TRUE), data.table(A=logical()), output="text input (not a filename)") -test(1806, fread('"A,B,C\n1,2,3\n4,5,6'), data.table('"A'=c(1L,4L), B=c(2L,5L), C=c(3L,6L))) -test(1807, fread('A,B,"C\nD",E'), data.table(A=logical(), B=logical(), "C\nD"=logical(), E=logical())) -test(1808.1, fread("A,B\r1,2\r3,4"), data.table(A=c(1L,3L),B=c(2L,4L))) -test(1808.2, fread("A,B\r1,2\r3,4\r"), data.table(A=c(1L,3L),B=c(2L,4L))) -cat("A,B\r1,2\r3,4",file=f<-tempfile()) - test(1808.3, fread(f), data.table(A=c(1L,3L),B=c(2L,4L))) -unlink(f) -test(1808.4, fread("A,B\r1,3\r\r\r2,4\r", logical01=TRUE), data.table(A=TRUE, B=3L), warning="Discarded single-line footer: <<2,4>>") -test(1808.5, fread("A,B\r4,3\r\r \r2,4\r"), data.table(A=4L, B=3L), warning="Discarded single-line footer: <<2,4>>") -test(1808.6, fread("A,B\r1,3\r\r \r2,4\r", blank.lines.skip=TRUE), data.table(A=1:2, B=3:4)) -test(1808.7, fread("A,B\r1,3\r\r \r2,4\r", fill=TRUE), data.table(A=c(1L,NA,NA,2L), B=c(3L,NA,NA,4L))) -test(1808.8, fread("A,B\r1,3\r\r \r2,\r", blank.lines.skip=TRUE, fill=TRUE), data.table(A=1:2, B=c(3L,NA))) -test(1809, fread("A,B\n\r1,2\n\r3,4\n\r5,6"), data.table(A=c(1L,3L,5L), B=c(2L,4L,6L))) -cat("A,B\n1,q\n2,w\n3,xyz", file=f<-tempfile()); test(1810, fread(f,verbose=TRUE), data.table(A=c(1L,2L,3L), B=c("q","w","xyz")), output="File ends abruptly with 'z'.*cow page"); unlink(f) -test(1811, fread("A,B\n1,2\n3,4", skip="boo"), error="skip='boo' not found in input") -test(1812, fread("A,B\n1,2\n3,4\n", skip="4", verbose=TRUE), data.table(V1=3L, V2=4L), output="Found skip='4' on line 3") -test(1813, fread("A,B\n1,2\n3,4", skip=10L), error="skip=10 but the input only has 3 lines") -test(1814, fread("A,B\n1,2\n3,4\n \n\t", skip=3L), error="skip has been set after the last non-whitespace") - -DT = data.table(A=seq(1, 1000000), B="x", C=TRUE) -fwrite(DT, f<-tempfile()) -test(1815, fread(f, nrows=5), DT[1:5]) #2243 - -test(1816.1, fread("A,E\n1,2\n5,7\n4,6\n\x1A\x1A", verbose=TRUE), - data.table(A=c(1L, 5L, 4L), E=c(2L, 7L, 6L)), - output="Last byte.*0x1A.*Ctrl.Z.*removed") #1612 -ff = file(f <- tempfile()) -open(ff, "wb") -cat("A,B\n5,2", file=ff) -writeBin(as.raw(c(0x00, 0x00, 0x00)), ff) -close(ff) -test(1816.2, fread(f, verbose=TRUE), - data.table(A=c(5L), B=c(2L)), - output="Last byte.*0x00.*NUL.*removed") #1895 -unlink(f) - -test(1817, fread(testDir("bad.txt"))[c(1,.N),c(1,3)], #2238, fileSize multiple of 4096 - data.table("####################"=c("#############","#########"), - "###############################################"=c(0,0))) # not sure why this all-0 column is detectected as numeric rather than integer -test(1818, fread(testDir("session_aborted_fatal_error.txt"))[c(1,.N),c(1,2,250,251)], data.table(V1=c("ACSSF","ACSSF"),V2=c("2010m1","2010m1"),V250=-1L,V251=-1L)) - -# expansion of uses of as.ITime.character, PR#1796 -test(1819, as.ITime("2015-09-29 08:22:00"), structure(30120L, class = "ITime")) - -# Issue 2287: the % sign in the error/warning message should not be interpreted as a format string! -test(1820.1, fread("name,id\nfoo,2\nbar%\n"), data.table(name="foo", id=2L), warning="Discarded single-line footer: <>") -test(1820.2, fread("name,id\nfoo,2\nbar%d"), data.table(name="foo", id=2L), warning="Discarded single-line footer: <>") -test(1820.3, fread("name,id\nfoo,2\nbar%s"), data.table(name="foo", id=2L), warning="Discarded single-line footer: <>") - -# new argument for print.data.table: col.names -# issue #1482 / PR #1483 -DT = data.table(a = 1:21, b = 22:42) -test(1821.1, sum(grepl("a.*b", capture.output(print(DT, col.names = "auto")))), 2L) -test(1821.2, sum(grepl("a.*b", capture.output(print(DT, col.names = "top")))), 1L) -x = capture.output(print(DT, col.names = "none")) -test(1821.3, sum(grepl("a.*b", x)), 0L) -test(1821.4, length(x), nrow(DT)) -test(1821.5, print(DT, col.names = "asdf"), error = "Valid options") -test(1821.6, capture.output(print(DT[1:5], col.names = "none", class = TRUE)), - c("1: 1 22", "2: 2 23", "3: 3 24", "4: 4 25", "5: 5 26"), - warning = "Column classes.*suppressed") -suppressWarnings( - x <- capture.output(print(DT, col.names = "none", class = TRUE)) -) -test(1821.7, sum(grepl("<", x)), 0L) - -# Issue 2299: snprintf(%zd / %zu) on Windows is not working -# The following example forces a wrong column count outside of the sampled rows -src = paste(c("A,B", - paste(rep("1,2", 100), collapse="\n"), - "999", - paste(rep("3,4", 10000), collapse="\n"), - ""), - collapse="\n") -test(1822, fread(src), data.table(A=rep(1L,100L), B=2L), warning="Stopped early on line 102. Expected 2 fields but found 1.*discarded.*<<999>>") -# NB: The first sample jump uses the first 100 rows and just misses the 999. Since the data is large enough, the other jumps capture the type bump from 1 (bool) to 3 (int). - -# Issue 2326: .SD mistakenly includes column being set when get() appears in j -DT <- data.table(x = seq(1, 10), y = seq(10, 1)) -DT[, z := ncol(.SD) + y, .SDcols = "x"] -test(1823.1, DT$z, seq(11, 2)) -DT[, z := ncol(.SD) + get("y"), .SDcols = "x"] -test(1823.2, DT$z, seq(11, 2)) -DT[, z := ncol(.SD) + get("y"), .SDcols = c("x", "z")] -test(1823.3, DT$z, seq(12, 3)) -DT[, x := {.SD; x + 1}, .SDcols = "y"] -test(1823.4, DT$x, as.double(seq(2, 11))) -DT[, z := ncol(.SD) + x, .SDcols = "y"] -test(1823.5, DT$z, as.double(seq(3, 12))) -DT[, z := ncol(.SD) + x, .SDcols = c("x", "y")] -test(1823.6, DT$z, as.double(seq(4, 13))) - -# Issue 2250 -test(1824, fread("A,B\n2,384325987234905827340958734572934\n"), data.table(A=2L, B="384325987234905827340958734572934")) - -# Issue 2251 -test(1825.1, fread('A,B\n"1","2"', colClasses = "integer"), data.table(A=1L, B=2L)) -test(1825.2, fread('A,B\n"1","2"', colClasses = "character"), data.table(A="1", B="2")) -test(1825.3, fread('A,B\n"1","2"', colClasses = "numeric"), data.table(A=1.0, B=2.0)) - -# issue 2351 -set.seed(1) -DT = data.table(id=paste0("id",1:1e5), v=sample(100,1e5,replace=TRUE)) -fwrite(DT, file=f<-tempfile(), eol="\r") -test(1826.1, fread(f)[c(1,2,.N-1,.N)], data.table(id=c("id1","id2","id99999","id100000"), v=c(27L,38L,10L,13L))) -cat("id888,42", file=f, append=TRUE) # without final \r after last line -test(1826.2, fread(f)[c(1,2,.N-1,.N)], data.table(id=c("id1","id2","id100000","id888"), v=c(27L,38L,13L,42L))) -unlink(f) - -# Issue 2222 -test(1827.1, fread("A,B\n1987,1\n1987,3\n", na.strings=c("1987", "NA")), data.table(A=c(NA,NA),B=c(1L,3L))) -test(1827.2, fread("A,B\n1987,1\n4,3\n", na.strings=c("1987", "NA")), data.table(A=c(NA,4L),B=c(1L,3L))) -test(1827.3, fread("A,B\n1987,1\n1987,3\n", na.strings="1987"), data.table(A=c(NA,NA),B=c(1L,3L))) -test(1827.4, fread("A,B\n1987,1\n1,3\n", na.strings="198"), data.table(A=c(1987L,1L),B=c(1L,3L))) - -# Issue 2246 : reading from a table where the number of rows is not estimated correctly up-front -DT1 = data.table(A=rep(123L, 100L), B=456L) -DT2 = data.table(A=rep(1L, 200L), B=2L) -DT = rbind(DT1, DT2, DT1, DT2, DT1, DT2, DT1, DT2, DT1, DT2, DT1, DT2, DT1, DT2, DT1, DT2, DT1, DT2, DT1, DT1) -fwrite(DT, f<-tempfile()) -test(1828, fread(f), DT) - -# Reading hexadecimal floating point numbers -test(1829.1, fread("A\n0x1.0p0\n-0x1.0p1\n0X1.0P3\n0x1.4p3\n0x1.9p6\nNaN\nInfinity\n-Infinity"), - data.table(A=c(1, -2, 8, 10, 100, NaN, Inf, -Inf))) -test(1829.2, fread("A\n0x1.e04b81cad165ap-1\n0x1.fb47e352e9a63p-5\n0x1.fa0fd778c351ap-1\n0x1.7c0a21cf2b982p-7\n"), - data.table(A=c(0.93807607, 0.06192393, 0.98840211, 0.01159789))) -test(1829.3, fread("A\n0x0.FFFFFFFFFFFFp-1022\n0x0.0000000000001p-1022\n"), # largest/smallest subnormal numbers - data.table(A=c(2.2250738585072e-308, 4.940656458412e-324))) -test(1829.4, fread("A\n0x1.FFFFFFFFFFFFp+1023\n0x1.0000000000000p-1022\n"), # largest/smallest normal numbers - data.table(A=c(1.7976931348623e+308, 2.225073858507e-308))) -test(1829.5, fread("A,B,C,D,E,F\n0x2.0p1,0x1.333,0x1.aaaaaaaaaaaaaaaP1,0x1.ABCDEFGp1,0x1.0p-1023,0x0.1p1"), - data.table(A="0x2.0p1", B="0x1.333", C="0x1.aaaaaaaaaaaaaaaP1", D="0x1.ABCDEFGp1", E="0x1.0p-1023", F="0x0.1p1")) - -# Reading "advanced" floating point literals (i.e. various NaNs / Infs) -test(1830.1, identical( - fread("A\n+Inf\nINF\n-inf\n-Infinity\n1.3e2"), - data.table(A=c(Inf, Inf, -Inf, -Inf, 130)))) -test(1830.2, identical( - fread("B\n.2\nnan\nNaN\n-NAN\nqNaN\n+NaN%\nsNaN\nNaNQ\nNaNS\n-.999e-1"), - data.table(B=c(0.2, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, -0.0999)))) -test(1830.3, !identical( - fread("B\n.2\nnan\nNaN\n-NAN\nqNaN\n+NaN%\nsNaN\nNaNQ\nNaNS\n-.999e-1"), - data.table(B=c(0.2, NaN, NaN, NaN, NA, NaN, NaN, NaN, NaN, -0.0999)))) -test(1830.4, identical( - fread("C\n1.0\nNaN3490\n-qNaN9\n+sNaN99999\nNaN000000\nNaN000"), - data.table(C=c(1, NaN, NaN, NaN, NaN, NaN)))) -test(1830.5, identical( - fread("D\n1.\n1.#SNAN\n1.#QNAN\n1.#IND\n1.#INF\n"), - data.table(D=c(1, NaN, NaN, NaN, Inf)))) -test(1830.6, identical( - fread("E\n0e0\n#DIV/0!\n#VALUE!\n#NULL!\n#NAME?\n#NUM!\n#REF!\n#N/A\n1e0\n"), - data.table(E=c(0, NaN, NaN, NA, NA, NA, NA, NA, 1)))) -test(1830.7, identical( - fread("F\n1.1\n+1.333333333333333\n5.9e320\n45609E11\n-00890.e-003\n"), - data.table(F=c(1.1, 1.333333333333333, 5.9e320, 45609e11, -890e-3)))) -test(1830.8, identical( - fread("G\n0.000000000000000000000000000000000000000000000000000000000000449548\n"), - data.table(G=c(4.49548e-61)))) - -# Test that integers just above 128 or 256 characters in length parse as strings, not as integers/floats -# This guards against potential overflows in the count of digits -src1 = paste0(rep("1234567890", 13), collapse="") # length = 130, slightly above 128 -src2 = paste0(rep("12345678900987654321", 13), collapse="") # length = 260, slightly above 256 -test(1831.1, fread(paste0("A\n", src1)), data.table(A=src1)) -test(1831.2, fread(paste0("A\n", src2)), data.table(A=src2)) -test(1831.3, fread(paste0("A\n", src2, ".33")), data.table(A=1.2345678900987655e+259)) -test(1831.4, fread(paste0("A\n", "1.", src2)), data.table(A=1.1234567890098766)) - -DT = as.data.table(matrix(5L, nrow=10, ncol=10)) -test(1832.1, fwrite(DT, f<-tempfile(), verbose=TRUE), output="Column writers") -DT = as.data.table(matrix(5L, nrow=10, ncol=60)) -# Using capture.output directly to look for the "..." because test(,output=) intercepts [] for convenience elsewhere -test(1832.2, any(grepl("^Column writers.* [.][.][.] ", capture.output(fwrite(DT, f, verbose=TRUE))))) -unlink(f) - -# ensure explicitly setting select to default value doesn't error, #2007 -test(1833, fread('V1,V2\n5,6', select = NULL), - data.table(V1 = 5L, V2 = 6L)) - -# fread file for which nextGoodLine in sampling struggles, #2404 -# Every line in the first 100 has a quoted field containing sep, so the quote rule was being -# bumped to 3 (now fixed not to) which gave rise to nextGoodLine struggling later. -# The file is not finished with \n either, but that's not an issue. -test(1834.1, dim(DT<-fread(testDir("grr.csv"), header=FALSE)), INT(2839, 12)) -test(1834.2, DT[c(1,2,.N-1,.N), c(1,2,11,12)], - data.table(V1="AAAAAAAAAA", - V2=c("AAAAAAAA","AAAAAAAAAA","AAAAAAAAAA","AAAAAAAAAA"), - V11=c("AAAAAAAAAAAAAAAA","","AAAAAAAAAA","AAAA"), - V12=c("AAAAAAAAAAAAA","","AAAAAAA","AAA"))) - -# Create a file to test a sample jump being skipped due to format error. It will fail later in the read step because -# this is a real error. Currently have not constructed an error for which nextGoodLine looks good, but in fact is not. -# Would need a very complicated construction of embedded new lines in quoted fields, to test that. -# This test size with default buffMB results in 2 threads being used. 2 is important to pass on CRAN. -DT = as.data.table(CO2) -f = tempfile() -for (i in 0:1000) { - start = nrow(CO2)*i - fwrite(DT[,Plant:=start:(start+nrow(CO2)-1)], f, append=TRUE, col.names=FALSE) - if (i==502) write("-999,Bad,Line,0.0,0.0,extra\n", f, append=TRUE) -} -test(1835, fread(f, verbose=TRUE), - output = "A line with too-many.*jump 50.*jump landed awkwardly.*skipped", - warning = "Stopped.*line 42253. Expected 5 fields but found 6.*discarded.*<<-999,Bad,Line,0.0,0.0,extra>>") -unlink(f) - -test(1836, fread('1,2,"3,a"\n4,5,"6,b"'), data.table(V1=c(1L,4L), V2=c(2L,5L), V3=c("3,a","6,b"))) # 2196 - -test(1837, fread('v1,v2,v3,v4,v5\n1,2,3,4,5', select=-1), error="out of range.*Consider drop= instead") #2423 - -test(1838, fread("default payment next month\n0.5524\n0.2483\n0.1157\n"), data.table("default payment next month"=c(0.5524,0.2483,0.1157))) #2322 - -# better writing and reading of NA in single column input, #2106 -DT = data.table(a=c(4,NA,2,3.14,999,NA)) -fwrite(DT, f<-tempfile(), na="") -test(1839.1, fread(f), data.table(a=c(4,NA,2,3.14,999,NA))) -test(1839.2, fread(f, blank.lines.skip=TRUE), data.table(a=c(4,2,3.14,999))) -test(1839.3, fread(f, fill=TRUE), data.table(a=c(4,NA,2,3.14,999,NA))) -test(1839.4, fread(f, fill=TRUE, blank.lines.skip=TRUE), data.table(a=c(4,2,3.14,999))) -fwrite(DT, f, na="NA") # base R does not do this though, it writes ,, for NAs in numeric columns (as does fwrite) -test(1839.5, fread(f, na.strings=""), data.table(a=c("4","NA","2","3.14","999","NA"))) -test(1839.6, fread(f, na.strings="NA"), DT) # TOOD: auto handle (unusual, even as written by R) "NA" in numeric columns -unlink(f) - -lines = c("DECLARATION OF INDEPENDENCE", - "We hold these truths to be self-evident, that all men are created equal,", - "that they are endowed by their Creator with certain unalienable Rights,", - "that among these are Life, Liberty and the pursuit of Happiness.", - "", - "That to secure these rights, Governments are instituted among Men,", - "deriving their just powers from the consent of the governed.") -txt = paste(lines, collapse="\n") -test(1839.6, fread(txt, sep=""), data.table("DECLARATION OF INDEPENDENCE"=lines[-1])) # fread should eventually be able auto-detect sep="" - -# readLines behaviour, #1616 -txt = 'a,b\n ab,cd,ce\n abcdef\n hjkli \n' # now auto detected as ncol 1 anyway -test(1840.1, fread(txt), data.table("a,b" = c("ab,cd,ce","abcdef","hjkli"))) -write('a,b\n ab,cd,ce\nabc,def \n hj,kli ', f<-tempfile()) # write to file to generate \r\n line ending on Windows, test 1840.6 below -test(1840.2, fread(f), data.table(a=logical(), b=logical()), warning="Stopped early on line 2.*discarded.*<>") -test(1840.3, fread(f, sep=NA), error="!is.na(sep) is not TRUE") -test(1840.4, fread(f, sep=NA_character_), error="!is.na(sep) is not TRUE") -test(1840.5, fread(f, sep=""), ans<-data.table("a,b"=c("ab,cd,ce","abc,def","hj,kli"))) -test(1840.6, fread(f, sep="\n"), ans) -test(1840.7, fread(f, sep=NULL), ans) -test(1840.8, fread(f, sep=NULL, strip.white=FALSE), data.table("a,b"=c(" ab,cd,ce","abc,def "," hj,kli "))) -unlink(f) - -test(1841, fread("A\n0.58E-2141\n"), data.table(A="0.58E-2141")) # no ERANGE warning and so no leak, #918 - -DT = data.table() # 2452 -test(1842, setnames(DT, character(0)), DT) - -test(1843, is.sorted((0+0i)^(-3:3)), error = "type 'complex' is not yet supported") # to cover error message in forder.c - -# forder consistent coverage, #2454 -# test loop 1253.13* covers these cases sometimes depending on its random time-based seed -# make a minimal example where there's a group size of 2 in the 2nd column (type double) with an NA too and na.last=NA -# covers the branch in forder.c:dsort line 1070 starting: if (nalast == 0 && n == 2) { -DT = data.table(c("a","a","a","b","b"),c(2,1,3,NA,2)) -test(1844.1, forder(DT,V1,V2,na.last=NA), INT(2,1,3,0,5)) -DT = data.table(c("a","a","a","b","b"),c(2,1,3,2,NA)) -test(1844.2, forder(DT,V1,V2,na.last=NA), INT(2,1,3,4,0)) -# now with two NAs in that 2-group covers forder.c:forder line 1269 starting: else if (nalast == 0 && tmp==-2) { -DT = data.table(c("a","a","a","b","b"),c(2,1,3,NA,NA)) -test(1844.3, forder(DT,V1,V2,na.last=NA), INT(2,1,3,0,0)) -DT = data.table((0+0i)^(-3:3), 7:1) -test(1844.4, forder(DT,V1,V2), error="First column being ordered is type 'complex', not yet supported") -test(1844.5, forder(DT,V2,V1), 7:1) # there are no groups in the first column being sorted (V2) -DT = data.table((0+0i)^(-3:3), c(5L,5L,1L,2L,2L,2L,2L)) -test(1844.6, forder(DT,V2,V1), error="Column 2 of 'by'.*is type 'complex', not yet supported") - -# fix for non-equi joins issue #1991. Thanks to Henrik for the nice minimal example. -d1 <- data.table(x = c(rep(c("b", "a", "c"), each = 3), c("a", "b")), y = c(rep(c(1, 3, 6), 3), 6, 6), id = 1:11) -d2 <- data.table(id = 1:2, val = c(4, 2)) -d3 <- data.table(x = rep(c("a", "b", "c"), each = 3), y = c(6, 1, 3), id = 1:9) -test(1845.1, d1[d2, id, on = .(y >= val)], INT(3,6,9,10,11,2,3,5,6,8,9,10,11)) -test(1845.2, d3[d2, id, on = .(y >= val)], INT(1,4,7,1,3,4,6,7,9)) - -# fix for non-equi join issue #1986, when d2 is 0-row data.table, thanks @ebs238 for the nice minimal example -d1 <- data.table(a=1L, b=2L) -d2 <- d1[0L] -test(1846.1, d2[d1, on=.(a>a, ba)], data.table(a=1L, b=NA_integer_, i.b=2L)) - -# Fix for non-equi join issue #2360.- issue in recreating new indices following non-equi binary merge -d <- data.table( - index = as.Date(c("2017-08-25", "2017-08-28", "2017-08-29", "2017-08-30", "2017-08-31", "2017-09-01", - "2017-09-05", "2017-09-06", "2017-09-07", "2017-09-08", "2017-09-11", "2017-09-12", - "2017-09-13")), - High = c(52.85, 51.81, 51.86, 52.29, 52.59, 52.77, 51.9, 50.77, 50.69, 50.45, 50.67, 51.07, 51.105), - FwdHi = c(51.81, 51.86, 52.29, 51.9, 50.77, 50.69, 50.45, 50.45, 50.45, 50.67, NA, NA, NA)) -setkey(d, index)[, id := .I] # adding rowid for easily writing tests - -# [1L] is to ensure non matching rows are also included, will be NA in result -ans1 <- d[d, id[which.min(x.index)[1L]], on = .(index > index), by = .EACHI]$V1 -ans2 <- d[d, id[which.min(x.index)[1L]], on = .(FwdHi > High), by = .EACHI]$V1 -ans3 <- d[d, id[which.min(x.index)[1L]], on = .(index > index, FwdHi > High), by = .EACHI]$V1 -test(1847.1, ans1, INT(2:13,NA)) -test(1847.2, ans2, INT(NA, 2:3, NA, NA, NA, 3, rep(1, 6))) -test(1847.3, ans3, INT(NA, 3:4, rep(NA, 10))) - -# Adding test for #2275, same fix for #2360 above also takes care of this, i.e., with nqRecreateIndices -rand_strings = function(n) { - M = matrix( sample(11, n*5, replace=TRUE), nrow=n ) # 11 for letters [a-k]; 5 for nchar of each string - apply(M, 1, function(x) paste0(letters[x], collapse="")) -} -set.seed(123) # the random data here doesn't match the data in issue 2275 because they used stringi::stri_rand_strings which has a different RNG -n = 100000 -DT1 = data.table(RANDOM_STRING = rand_strings(n), - DATE = sample(seq(as.Date('2016-01-01'), as.Date('2016-12-31'), by="day"), n, replace=TRUE)) -DT2 = data.table(RANDOM_STRING = rand_strings(n), - START_DATE = sample(seq(as.Date('2015-01-01'), as.Date('2017-12-31'), by="day"), n, replace=TRUE)) -DT2[, EXPIRY_DATE := START_DATE + floor(runif(1000, 200,300))] -DT1[, DT1_ID := .I][, DATE := as.Date(DATE)] -cols = c("START_DATE", "EXPIRY_DATE") -DT2[, DT2_ID := .I][, (cols) := lapply(.SD, as.Date), .SDcols=cols] -ans1 = DT2[DT1, on=.(RANDOM_STRING, START_DATE <= DATE, EXPIRY_DATE >= DATE), .N, by=.EACHI ]$N > 0L -tmp = DT1[DT2, on=.(RANDOM_STRING, DATE >= START_DATE, DATE <= EXPIRY_DATE), which=TRUE, nomatch=0L] -ans2 = DT1[, DT1_ID %in% tmp] -test(1848, ans1, ans2) - -# when last field is quoted contains sep and select= is used too, #2464 -test(1849.1, fread('Date,Description,Amount,Balance\n20150725,abcd,"$3,004","$5,006"', select=c("Date", "Description", "Amount")), - data.table(Date=20150725L,Description="abcd",Amount="$3,004")) -test(1849.2, fread('Date,Description,Amount,Balance\n20150725,abcd,"$3,004","$5,006"', select=c("Date", "Description", "Balance")), - data.table(Date=20150725L,Description="abcd",Balance="$5,006")) -test(1849.3, fread('Date,Description,Amount,Balance\n20150725,abcd,"$3,004","$5,006"\n', select=c("Date", "Description", "Amount")), - data.table(Date=20150725L,Description="abcd",Amount="$3,004")) -test(1849.4, fread('Date,Description,Amount,Balance\n20150725,abcd,"$3,004","$5,006"\n', select=c("Date", "Description", "Balance")), - data.table(Date=20150725L,Description="abcd",Balance="$5,006")) -cat('Date,Description,Amount,Balance\n20150725,abcd,"$3,004","$5,006"', file=f<-tempfile()) -test(1849.5, fread(f,verbose=TRUE), - data.table(Date=20150725L,Description="abcd",Amount="$3,004", Balance="$5,006"), - output="File ends abruptly with '\"'") -test(1849.6, fread(f, select=c("Date", "Description", "Amount")), - data.table(Date=20150725L,Description="abcd",Amount="$3,004")) -test(1849.7, fread(f, select=c("Date", "Description", "Balance")), - data.table(Date=20150725L,Description="abcd",Balance="$5,006")) -cat('\n', file=f, append=TRUE) -test(1849.8, fread(f, select=c("Date", "Description", "Amount")), - data.table(Date=20150725L,Description="abcd",Amount="$3,004")) -test(1849.9, fread(f, select=c("Date", "Description", "Balance")), - data.table(Date=20150725L,Description="abcd",Balance="$5,006")) -unlink(f) - -# segfault when rbindlist is asked to create a DT with more than 2bn rows -DT = data.table(1:1e6) -L = vector("list", 2148) -for (i in seq_along(L)) L[[i]] = DT # many references to the same DT to avoid actually using large RAM for this test -test(1850, rbindlist(L), error="Total rows in the list is 2148000000 which is larger than the maximum number of rows, currently 2147483647") - -# by=.EACHI missings to list columns, #2300 -dt = data.table(a=factor(1:5, levels=1:10), b=as.list(letters[1:5])) -dt2 = data.table(a=as.factor(1:10)) -test(1851.1, dt[dt2, .SD, by=.EACHI, on="a", .SDcols="b"], - data.table(a=as.factor(1:10), b={tmp=vector("list",10); tmp[1:5]=as.list(letters[1:5]); tmp})) -test(1851.2, data.table(a = 1:2, b = list("yo", NULL))[.(1:3), on=.(a), x.b, by = .EACHI], - data.table(a = 1:3, x.b = list("yo", NULL, NULL))) - -# test that indices are only used on exact name match, #2465 -DT1 <- data.table(colname=c("test1","test2","test2","test3"), colname_with_suffix=c("other","test","includes test within","other")) -DT2 <- data.table(lookup=c("test1","test2","test3"), lookup_result=c(1,2,3)) -DT1[colname_with_suffix == "not found", ] # automatically creates index on colname_with_suffix -target <- data.table(colname = c("test1", "test2", "test2", "test3"), colname_with_suffix = c("other", "test", "includes test within", "other"), lookup_result = c(1,2,2,3)) -target[colname_with_suffix == "not found", ] -test(1852, DT1[DT2, lookup_result := i.lookup_result, on=c("colname"="lookup")], target) -# test that joins don't change row order when there is an index with additional columns present, #2559 -dt <- data.table(x = c(1,1), y = c(2,1)) -setindex(dt, x, y) -test(1852.1, dt[J(x=1), on = "x==x"], setindex(dt, NULL)) - -# NA column names and missing new argument to setnames, #2475 -DT = setNames(data.frame(a = 1, b = 2, c = 3, d = 4), c(NA, "b", "c", NA)) -setnames(DT, c('a', 'b', 'c', 'd')) -test(1853, names(DT), c('a', 'b', 'c', 'd')) - -# CJ bug with multiple empty vectors (#2511) -test(1854.1, data.frame(CJ(x = integer(0))), setattr(expand.grid(x = integer(0)), "out.attrs", NULL)) -test(1854.2, data.frame(CJ(x = integer(0), y = character(0))), setattr(expand.grid(x = integer(0), y = character(0)), "out.attrs", NULL)) -test(1854.3, data.frame(CJ(x = integer(0), y = c("a", "b"))), setattr(expand.grid(x = integer(0), y = c("a", "b")), "out.attrs", NULL)) -test(1854.4, data.frame(CJ(x = integer(0), y = character(0), z = logical(0))), setattr(expand.grid(x = integer(0), y = character(0), z = logical(0)), "out.attrs", NULL)) -test(1854.5, data.frame(CJ(x = character(0), y = NA_real_)), setattr(expand.grid(x = character(0), y = NA_real_), "out.attrs", NULL)) -if (test_bit64) { - test(1854.6, data.frame(CJ(x = integer64(0), y = as.integer64(2))), setattr(expand.grid(x = integer64(0), y = as.integer64(2)), "out.attrs", NULL)) -} - -# Blank lines are valid CSV format for single column datasets and should read smoothly by default, #2516. -# Only for ncol>1 are blank lines not valid (correct number of commas should be present) and so a warning (at least) should occur for those. -# This means trailing newline are now significant for single column data (so that fread(fwrite(DT))==DT), but not significant when ncol>1. -test(1855.1, fread("A\n"), data.table(A=logical())) -test(1855.2, fread("A\n\n"), data.table(A=NA)) -test(1855.3, fread("A\n\n\n"), data.table(A=c(NA,NA))) -test(1855.4, fread("A\n1\n2\n\n\n3\n"), data.table(A=c(1L,2L,NA,NA,3L))) -test(1855.5, fread("A\n1\n2\n\n\n3\n\n"), data.table(A=c(1L,2L,NA,NA,3L,NA))) -test(1856.1, fread("A,B\n"), ans<-data.table(A=logical(), B=logical())) -test(1856.2, fread("A,B\n\n"), ans) -test(1856.3, fread("A,B\n\n\n"), ans) -test(1856.4, fread("A,B\n3,4\n\n\n"), data.table(A=3L, B=4L)) -test(1856.5, fread("A,B\n3,4\n,\n\n\n"), data.table(A=c(3L,NA), B=c(4L,NA))) -test(1856.6, fread("A,B\n3,4\n\n5,6\n"), data.table(A=3L, B=4L), warning="Discarded single-line footer: <<5,6>>") -test(1856.7, fread(testDir("test0.txt"))[c(1,997,998,999)], data.table(x0=c(656609L, NA, -2368L, 955199L))) # issue 2515 -DTs = list( # passed fread(fwrite(DT))==DT before fix? - data.table(A=logical(0)), # yes - data.table(A=NA), # no - data.table(A=c(NA,NA)), # no - data.table(A=c(1L,2L,NA,NA,3L)), # no - data.table(A=c(1L,2L,NA,NA,3L,NA)), # no - data.table(A=logical(0), B=logical(0)), # yes - data.table(A=3L, B=4L), # yes - data.table(A=c(3L,NA), B=c(4L,NA)), # yes - data.table(A=c(3L,NA,5L), B=c(4L,NA,6L)), # yes - data.table(A=c(3L,NA,5L,NA), B=c(4L,NA,6L,NA)) # yes -) -f = tempfile() -for (i in seq_along(DTs)) { - fwrite(DTs[[i]], file=f) - test(1857.0 + i/100, fread(f), DTs[[i]]) -} -unlink(f) - -# quoted fields followed by whitespace, #2520 -test(1858, fread('B,C\n"12" ,15\n"13" ,18\n"14" ,3'), data.table(B=c(12L, 13L, 14L), C=c(15L, 18L, 3L))) - -test(1859, fread("A\n", nrows=0), data.table(A=logical())) # 2512 - -test(1860, fread("A,B\n "), data.table(A=logical(), B=logical())) # 2543 - -# That unique(DT) returns DT when there are no dups, #2013 -DT = data.table(A=c(1L,1L,2L), B=c(3L,4L,4L)) -test(1861, address(unique(DT)), address(DT)) - -# New warning for deprecated old behaviour option -setkey(DT,A) -options(datatable.old.unique.by.key=TRUE) -test(1862.1, unique(DT), data.table(A=1:2, B=3:4, key="A"), warning="deprecated option") -options(datatable.old.unique.by.key=NULL) -test(1862.2, unique(DT,by=key(DT)), data.table(A=1:2, B=3:4, key="A")) - -# fix for -ve indices issue in gmedian (2046) and gvar (2111) -DT = data.table(x=c(1,1,1),y=c(3,0,0), key="x") -test(1863.1, DT[, median(y), by=x], data.table(x=1, V1=0, key="x")) -DT = data.table(col1 = c(1,1,1, 2,2,2), col2 = c(2,2,2,1,1,1), ID = c(rep(1,3), rep(2,3)), key="ID") -test(1863.2, DT[, lapply(.SD, var), by=ID], data.table(ID=c(1,2), col1=0, col2=0, key="ID")) - -# Fix the bug when keys contain non UTF8 strings #2566 #2462 #1826 -utf8_strings = c("\u00e7ile", "fa\u00e7ile", "El. pa\u00c5\u00a1tas", "\u00a1tas", "\u00de") -latin1_strings = iconv(utf8_strings, from = "UTF-8", to = "latin1") -mixed_strings = c(utf8_strings, latin1_strings) -DT1 = data.table(x = mixed_strings, y = c(latin1_strings, utf8_strings), z = 1:10) -DT2 = copy(DT1) -setkey(DT1, x) -setkey(DT2, y) -# the ans is generated by `sort(c(utf8_strings, utf8_strings), method = "radix")` -# but we should not use radix sort in the test because it's introduced after R3.3.0 -ans = c("El. pa\u00c5\u00a1tas", "El. pa\u00c5\u00a1tas", "fa\u00e7ile", "fa\u00e7ile", -"\u00a1tas", "\u00a1tas", "\u00de", "\u00de", "\u00e7ile", "\u00e7ile") -test(1864.1, DT1$x, ans) -test(1864.2, DT2$y, ans) -ans = c(1L, 6L, 2L, 7L, 3L, 8L, 4L, 9L, 5L, 10L) -test(1864.3, DT1[c(utf8_strings, latin1_strings), z], c(ans, ans)) -test(1864.4, DT2[c(utf8_strings, latin1_strings), z], c(ans, ans)) - -# memory exception under asan if there's an extra comma out-of-sample, #2523 -data = rep("a,b,c,d,e,f,g", 2100) -data[111] = "a,b,c,d,e,f,g," -cat(data, file=(f<-tempfile()), sep="\n") -test(1865, fread(f, header=FALSE), - data.table(V1=rep("a",110),V2="b",V3="c",V4="d",V5="e",V6="f",V7="g"), - warning="Stopped early on line 111. Expected 7.*found 8.*discarded.*<>") -unlink(f) - -# "Natural" provision of value.name in measure.vars list, #1547 and #2551 -DT = data.table( - meas1_jan = 0.45, meas1_feb = 0.38, meas1_mar = 0.62, - meas2_jan = 0.42, meas2_feb = 0.48, meas2_mar = 0.46, - meas3_jan = 0.54, meas3_feb = 0.47 -) -DTout = data.table( - variable = factor(1:3), - jan = c(0.45, 0.42, 0.54), - feb = c(0.38, 0.48, 0.47), - mar = c(0.62, 0.46, NA) -) -test(1866.1, melt(DT, measure.vars = patterns(jan="_jan", feb="_feb", mar="_mar")), DTout) -mvlist = list( - jan = sprintf('meas%d_jan', 1:3), - feb = sprintf('meas%d_feb', 1:3), - mar = sprintf('meas%d_mar', 1:2) -) -test(1866.2, melt(DT, measure.vars = mvlist), DTout) -test(1866.3, melt(DT, measure.vars = mvlist, value.name = c('a', 'b', 'c')), - DTout, warning = 'value.name.*given precedence') -names(mvlist) = NULL -names(mvlist)[1L] = 'jan' # NA names -test(1866.4, melt(DT, measure.vars = mvlist), error = 'Please provide a name') -names(mvlist) = NULL -names(mvlist) = c('jan', '', '') #partially-missing names -test(1866.5, melt(DT, measure.vars = mvlist), error = 'Please provide a name') -# previously untested behavior used in ?patterns -DT = data.table(x1=1:5, x2=6:10, y1=letters[1:5], y2=letters[6:10]) -DTout = data.table( - variable = factor(c(1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L)), - value1 = 1:10, - value2 = c("a", "b", "c", "d", "e", "f", "g", "h", "i", "j") -) -test(1866.6, melt(DT, measure.vars = patterns("^x", "^y", cols=names(DT))), DTout) - -# auto fill too few column names (#1625) and auto fill=TRUE when too many column names -test(1867.1, fread("A,B\n1,3,5,7\n2,4,6,8\n"), data.table(A=1:2, B=3:4, V3=5:6, V4=7:8), - warning="Detected 2 column names but.*4.*Added 2 extra default column names at the end[.]") -test(1867.2, fread("A,B,C,D,E\n1,3,5,7\n2,4,6,8\n"), data.table(A=1:2, B=3:4, C=5:6, D=7:8, E=NA), - warning="Detected 5.*but.*4.*Filling rows automatically.") -test(1867.3, fread(testDir("fillheader.csv"))[c(1,.N), c(1,29,30)], data.table("V1"="Ashburton District", EASTING=c(5154177L,5144032L), NORTHING=NA), - warning="Detected 29.*but.*30.*Added 1 extra default column name.*guessed to be row names or an index.*valid file") - # in this unusual case, every data row has a trailing comma but the column names do not. So the guess is wrong; a deliberate choice currently. -test(1867.4, fread("A,B\nCol1,Col2,Col3\n1,3,5\n2,4,6\n"), data.table(Col1=1:2, Col2=3:4, Col3=5:6)) -test(1867.5, fread("A\nCol1,Col2\n1,3,5\n2,4,6\n"), data.table(V1=1:2, Col1=3:4, Col2=5:6), warning="Added 1 extra default column name.*guessed to be row names or an index") -test(1867.6, fread("Some header\ninfo\nCol1,Col2,Col3\n1,3,5\n2,4,6\n"), data.table(Col1=1:2, Col2=3:4, Col3=5:6)) -test(1867.7, fread("Some header\ninfo\n\nCol1,Col2\n1,3,5\n2,4,6\n"), data.table(V1=1:2, Col1=3:4, Col2=5:6), warning="Added 1 extra") -test(1867.8, fread("A,B,C,D,E\n1,3,5\n2,4,6\n"), data.table(A=1:2, B=3:4, C=5:6, D=NA, E=NA), warning="Detected 5.*but.*3.*Filling rows automatically") -test(1867.9, fread("Heading text\nA,B,C,D,E\n1,3,5\n2,4,6\n"), data.table(A=1:2, B=3:4, C=5:6, D=NA, E=NA), warning="Detected 5.*but.*3.*Filling rows automatically") -test(1867.11, fread("Heading text\n1,3,5\n2,4,6\n"), data.table("Heading text"=1:2, V2=3:4, V3=5:6), warning="Added 2 extra default column names at the end") -test(1867.12, fread("A,B\n\n1,3,5\n2,4,6\n"), data.table(V1=1:2, V2=3:4, V3=5:6)) -test(1867.13, fread("A\n1,3\n2,4\n"), data.table(V1=1:2, A=3:4), warning="Added 1 extra default column name") -# test from #763, covers #1818 too -DT = data.table(x=rep(c("a","b","c"),each=3), y=c(1L,3L,6L), v=10:18) -write.table(DT, file = (f<-tempfile()), sep = "\t") -test(1867.14, fread(f), data.table(V1=1:9, x=DT$x, y=DT$y, v=DT$v), warning="Added 1 extra default column name") -unlink(f) -# test(1867.15, fread(testDir("iterations.txt"))) # #1416 TODO (trailing tabs on most but not at the beginning and a "-" intended to mean missing but taken as text column name) - -# non equi joins bug fix #2313 -dt <- data.table( - patient.id = c(1L, 2L, 1L, 1L, 2L, 2L, 2L), - h.date = as.Date(c("2013/10/15", "2014/10/15", "2015/7/16", "2016/1/7", - "2015/12/20", "2015/12/25", "2016/2/10"))) -setorder(dt) -dt[, `:=`(start.date = h.date - 365, end.date = h.date)] -# This line below would error without this fix -ans <- dt[dt, on = .(patient.id, h.date >= start.date, h.date <= end.date), - .(patient.id, i.start.date, i.end.date, g = .GRP, .N, x.h.date), - by=.EACHI] -test(1868, "x.h.date" %in% names(ans), TRUE) - -# \r\r\r in single column files, #2542 -test(1869.1, fread("A\r1\r\r\r2\r"), data.table(A=c(1L,NA,NA,2L))) -test(1869.2, fread("A\r1\r\r\r2\r\r"), data.table(A=c(1L,NA,NA,2L,NA))) -test(1869.3, fread("A\r1\r\r\r2\r\r\r"), data.table(A=c(1L,NA,NA,2L,NA,NA))) -test(1869.4, fread("A,B\r2,3\r,\r,\r4,5\r\r"), data.table(A=c(2L,NA,NA,4L), B=c(3L,NA,NA,5L))) -test(1869.5, fread("A,B\r2,3\r\r,\r2,4\r\r"), data.table(A=2L, B=3L), warning="Stopped.*line 3. Expected 2 fields but found 0.*First discarded non-empty line: <<,>>") # two line footer because of the comma -test(1869.6, fread(testDir("colnames4096.csv"), verbose=TRUE)[,c(1,2,585,586)], - data.table(Foo000=logical(), Bar001=logical(), Foo584=logical(), B=logical()), - output = "Copying file in RAM.*file is very unusual.*ends abruptly.*multiple of 4096") -test(1869.7, fread(testDir("onecol4096.csv"), verbose=TRUE)[c(1,2,245,246,249,255:.N),], - data.table(A=c("FooBarBazQux000","FooBarBazQux001","","FooBarBazQux245","","FooBarBazQux254","FooBarBazQux","FooBarBaz12","FooBarBazQux256","","","")), - output = "Copying file in RAM.*file is very unusual.*one single column, ends with 2 or more end-of-line.*and is a multiple of 4096") - -# better colname detection by comparing potential column names to the whole sample not just the first row of the sample, #2526 -test(1870.1, fread("A,100,200\n,300,400\n,500,600"), data.table(A=NA, "100"=c(300L,500L), "200"=c(400L,600L))) -test(1870.2, fread("A,100,\n,,\n,500,600"), data.table(A=NA, "100"=c(NA,500L), V3=c(NA,600L))) -test(1870.3, fread("A,B,\n,,\n,500,3.4"), data.table(A=NA, B=c(NA,500L), V3=c(NA,3.4))) - -# nrows= now ignores errors after those nrows as expected and skip= determines first row for sure, #1267 -txt = "V1, V2, V3\n2,3,4\nV4, V5, V6, V7\n4,5,6,7\n8,9,10,11\n" -test(1871.1, fread(txt), ans <- data.table(V4=INT(4,8), V5=INT(5,9), V6=INT(6,10), V7=INT(7,11))) -test(1871.2, fread(txt, skip=2), ans) -test(1871.3, fread(txt, skip=2, nrow=1), ans[1,]) -test(1871.4, fread(txt, skip=2, nrow=3), ans) -test(1871.5, fread(txt, skip=3), ans <- data.table(V1=INT(4,8), V2=INT(5,9), V3=INT(6,10), V4=INT(7,11))) -test(1871.6, fread(txt, skip=3, nrow=1), ans[1,]) -test(1871.7, fread(txt, nrows=1), data.table(V1=2L, V2=3L, V3=4L)) -test(1871.8, fread(txt, skip=0), data.table(V1=2L, V2=3L, V3=4L), warning="Stopped early.*line 3. Expected 3 fields but found 4.*discarded.*<>") -test(1871.9, fread(txt, skip=0, nrows=1), ans<-data.table(V1=2L, V2=3L, V3=4L)) -test(1871.11, fread(txt, skip=0, nrows=1, header=TRUE), ans) -test(1871.12, fread(txt, skip=0, nrows=1, header=FALSE), data.table(V1="V1", V2="V2", V3="V3")) -test(1871.13, fread(txt, skip=0, nrows=2, header=FALSE), data.table(V1=c("V1","2"), V2=c("V2","3"), V3=c("V3","4"))) -test(1871.14, fread("A\n100\n200", verbose=TRUE), data.table(A=c(100L,200L)), output="All rows were sampled since file is small so we know nrow=2 exactly") -test(1871.15, fread("col1, col2, col3\n1, 2, 3\n3, 5, 6\n7, 8, 9\n\nsome text to ignore", nrows = 3L), data.table(col1=INT(1,3,7), col2=INT(2,5,8), col3=INT(3,6,9))) # from #1671 (no warning expected) -for (i in 100:1) { - lines <- paste(c(rep("2,3,4",i), "2,3"), collapse='\n') - test(1871.2 + i/1000, fread(lines, nrows=i), data.table(V1=rep.int(2L,i), V2=3L, V3=4L)) -} - -# miscellaneous missing tests uncovered by CodeCov difference -# in the process of PR #2573 -## data.table cannot recycle complicated types -short_s4_col = getClass("MethodDefinition") -test(1872.1, data.table(a = 1:4, short_s4_col), error = 'problem recycling.*try a simpler type') -## i must be a data.table when on is specified -DT = data.table(a = 1:3) -test(1872.2, DT[c(TRUE, FALSE), on = 'coefficients'], error = "not a data.table, but 'on'") -## missing tests for round.IDate -test_dates = c( - "2017-01-05", "2017-08-04", "2017-06-05", "2017-04-15", - "2017-06-11", "2017-10-04", "2017-04-19", "2017-01-11", - "2017-03-08", "2017-10-10" -) -test_dates = as.IDate(test_dates) -test(1872.3, round(test_dates, 'weeks'), - structure(c(17167L, 17377L, 17321L, 17272L, 17328L, - 17440L, 17272L, 17174L, 17230L, 17447L), - class = c("IDate", "Date"))) -test(1872.4, round(test_dates, 'months'), - structure(c(17167L, 17379L, 17318L, 17257L, 17318L, - 17440L, 17257L, 17167L, 17226L, 17440L), - class = c("IDate", "Date"))) -test(1872.5, round(test_dates, 'quarters'), - structure(c(17167L, 17348L, 17257L, 17257L, 17257L, - 17440L, 17257L, 17167L, 17167L, 17440L), - class = c("IDate", "Date"))) -test(1872.6, round(test_dates, 'years'), - structure(c(17167L, 17167L, 17167L, 17167L, 17167L, - 17167L, 17167L, 17167L, 17167L, 17167L), - class = c("IDate", "Date"))) -test(1872.7, round(test_dates, 'centuries'), - error = 'should be one of') -## missing a test of mday -test(1872.8, mday(test_dates), - c(5L, 4L, 5L, 15L, 11L, 4L, 19L, 11L, 8L, 10L)) -## META TEST of helper function compactprint from test.data.table -DT = data.table(a = 1, b = 2, key = 'a') -DT_out = gsub('\\s+$', '', capture.output(compactprint(DT))) -test(1872.9, DT_out, - c(" a b [Key=a Types=dou,dou Classes=num,num]", - "1: 1 2")) -## Test as-yet unimplemented features of foverlaps -x = data.table(start=c(5,31,22,16), end=c(8,50,25,18), val2 = 7:10) -y = data.table(start=c(10, 20, 30), end=c(15, 35, 45), val1 = 1:3) -setkey(y, start, end) -test(1872.11, foverlaps(x, y, maxgap = 2), error = 'maxgap and minoverlap.*not yet') -test(1872.12, foverlaps(x, y, minoverlap = 2), error = 'maxgap and minoverlap.*not yet') -## tests of verbose output -### foverlaps -test(1872.13, foverlaps(x, y, verbose = TRUE), - output = 'unique.*setkey.*operations.*binary search') -### [.data.table -X = data.table(x=c("c","b"), v=8:7, foo=c(4,2)) -DT = data.table(x=rep(c("b","a","c"),each=3), y=c(1,3,6), v=1:9) -test(1872.14, DT[X, on=.(x, v>=v), verbose = TRUE], - output = 'Non-equi join operators.*forder took.*group lengths.*done.*non-equi group ids.*done') - -# out-of-sample bump from int to quoted field containing comma, #2614 -DT = data.table(A=rep(10L, 2200), B="20") -DT[111, B:="3,456"] -fwrite(DT,f<-tempfile()) -test(1873, fread(f), DT) -unlink(f) - -# Better jump sync and run-on in PR#2627 -# -# Reproduces error 'did not finish exactly where jump 1 found ...' in #2561 in master before PR #2627 -# the jump point is just before an empty line and the nextGoodLine() wasn't sync'd properly -x = sprintf("ABCDEFGHIJKLMNOPQRST%06d", 1:102184) -x[51094]="" -cat(x, file=f<-tempfile(), sep="\n") -test(1874.1, fread(f,header=FALSE,verbose=TRUE)[c(1,51094,.N),], - data.table(V1=c("ABCDEFGHIJKLMNOPQRST000001","","ABCDEFGHIJKLMNOPQRST102184")), - output="jumps=[0..2)") # ensure jump 1 happened -# -# out-of-sample short lines in the first jump, not near the jump point -x = sprintf("ABCD,FGHI,KLMN,PQRS,%06d", 1:102184) -x[5021:5041] = "small,batch,short,lines" # 4 fields not 5 -cat(x, file=f, sep="\n") -test(1874.2, fread(f), data.table(V1="ABCD", V2="FGHI", V3="KLMN", V4="PQRS", V5=1:5020), - warning="Stopped early on line 5021.*<>") -test(1874.3, fread(f,fill=TRUE,verbose=TRUE)[c(1,5020,5021,5041,5042,.N),], - data.table(V1=c("ABCD","ABCD","small","small","ABCD","ABCD"), - V2=c("FGHI","FGHI","batch","batch","FGHI","FGHI"), - V3=c("KLMN","KLMN","short","short","KLMN","KLMN"), - V4=c("PQRS","PQRS","lines","lines","PQRS","PQRS"), - V5=c(1L,5020L,NA,NA,5042L,102184L)), - output="jumps=[0..2)") -# -# jump just before a set of 30 or more too-few lines, to reproduce "No good line could be found" error in #2267 -# confirmed fails in master with that error before PR#2627 -x = sprintf("ABCD,FGHI,KLMN,PQRS,%06d", 1:102184) -x[51094:51150] = "small,batch,short,lines" # 4 fields not 5 -cat(x, file=f, sep="\n") -test(1874.4, fread(f,verbose=TRUE), data.table(V1="ABCD", V2="FGHI", V3="KLMN", V4="PQRS", V5=1:51093), - warning="Stopped early on line 51094.*<>", - output="jumps=[0..2)") -test(1874.5, fread(f,fill=TRUE,verbose=TRUE)[c(1,51093,51094,51150,51151,.N),], - data.table(V1=c("ABCD","ABCD","small","small","ABCD","ABCD"), - V2=c("FGHI","FGHI","batch","batch","FGHI","FGHI"), - V3=c("KLMN","KLMN","short","short","KLMN","KLMN"), - V4=c("PQRS","PQRS","lines","lines","PQRS","PQRS"), - V5=c(1L,51093L,NA,NA,51151L,102184L)), - output="jumps=[0..2)") -# -# jump inside a quoted field containing many new lines, to simulate a dirty jump -# we'll make this jump landing even harder for nextGoodLine() by making the lines resemble the number and types of the true lines, too. -# Rather than needing to make nextGoodLine() better and better (at some point it's impossible), in these rare cases we'll just sweep dirty jumps. -x = sprintf("ABCD,FGHI,KLMN,PQRS,%06d", 1:102184) -x[51093] = "\"A,B,C,D,1\nA,B,C,D,2\nA,B,C,D,3\nA,B,C,D,4\nA,B,C,D,5\nA,B,C,D,6\nA,B,C,D,7\nA,B,C,D,8\n\",FGHI,KLMN,PQRS,51093" -cat(x, file=f, sep="\n") -test(1875.6, fread(f,verbose=TRUE)[c(1,51092:51094,.N),][3,V1:=gsub("\r","",V1)], # gsub since R on Windows replaces \n with \r\n - data.table(V1=c("ABCD","ABCD", "A,B,C,D,1\nA,B,C,D,2\nA,B,C,D,3\nA,B,C,D,4\nA,B,C,D,5\nA,B,C,D,6\nA,B,C,D,7\nA,B,C,D,8\n", "ABCD","ABCD"), - V2="FGHI", V3="KLMN", V4="PQRS", V5=c(1L,51092:51094,102184L)), - output = "too-few.*sample jump 50.*jump landed awkwardly.*skipped.*Read the data.*jumps=\\[0..2\\).*jumps=\\[1..2\\).*Reading 2 chunks \\(1 swept\\)") -# Aside: although the file (with over 100,000 lines) is big enough for 100 sampling jumps (of which just 1, the middle sample jump, skipped), it's -# still too small for more than 2 reading chunks to be worth it which is correct (based on buffMB not nth) -unlink(f) - -test(1876, fread("http://hkhfsk\nhttp://fhdkf\nhttp://kjfhskd\nhttp://hfkjf", header=FALSE), # data not a download, #2531 - data.table(V1=c("http://hkhfsk","http://fhdkf","http://kjfhskd","http://hfkjf"))) - -# segfault with setattr() of "class" attribute to 0-length value, #2386 -test(1877.1, attr(setattr(data.table(x = 1:10), "class", NULL), "class"), NULL) # ok before -test(1877.2, attr(setattr(data.table(x = 1:10), "class", character()), "class"), NULL) # now ok (was segfault) -test(1877.3, attr(setattr(data.table(x = 1:10), "test", character()), "test"), character(0)) # ok before - -# In dev 1.10.5 these were parsed as floats, #2625. Caught before release to CRAN. -test(1878, fread("A,B,C,D,E\n.,+.,.e,.e+,0e\n"), data.table(A=".", B="+.", C=".e", D=".e+", E="0e")) - -# assortment of tests from #2572 -## negative indexing should retain key -DT = data.table(a = c(5, 5, 7, 2, 2), - b = 1:5, key = 'a') -test(1879.1, key(DT[-c(2, 3)]), 'a') -test(1879.2, key(DT[-(1:5)]), 'a') -test(1879.3, key(DT[-2, sum(b), by = a]), 'a') -## behavior of out-of-bound subsets -## (mixed +/- already covered in 1043) -test(1879.4, DT[3:6], - data.table(a = c(5, 5, 7, NA), - b = c(1L, 2L, 3L, NA))) -test(1879.5, DT[0:5], DT) -## if fread bumps logical to character, -## the original string representation should be kept -DT = data.table(A=rep("True", 2200), B="FALSE", C='0') -DT[111, LETTERS[1:3] := .("fread", "is", "faithful")] -fwrite(DT, f<-tempfile()) -test(1879.6, fread(f, verbose=TRUE, logical01=TRUE), DT, - output="Column 1.*bumped from 'bool8' to 'string'.*\nColumn 2.*bumped from 'bool8' to 'string'.*\nColumn 3.*bumped from 'bool8' to 'string'") -unlink(f) - -# Fix duplicated names arising in merge when by.x in names(y), PR#2631, PR#2653 -# 1880.1 should fail in there are any duplicate names after a join -# 1880.2 should fail if a warning is not thrown when suffixes leads to duplicate names -# 1880.3 tests no.dups = FALSE, where names should be duplicated after the join -parents = data.table(name=c("Sarah", "Max"), sex=c("F", "M"), age=c(41, 43)) -children = data.table(parent=c("Sarah", "Max", "Max"), - name=c("Oliver", "Sebastian", "Michelle"), - sex=c("M", "M", "F"), age=c(5,8,7)) -joined = merge(parents, children, by.x="name", by.y="parent") -test(1880.1, length(names(joined)), length(unique(names(joined)))) -test(1880.2, nrow(merge(parents, children, by.x="name", by.y="parent", suffixes=c("",""))), 3L, - warning = "column names.*are duplicated in the result") -joined = suppressWarnings(merge(parents, children, by.x="name", by.y="parent", no.dups=FALSE)) -test(1880.3, any(duplicated(names(joined))), TRUE) - -# out-of-sample quote rule bump, #2265 -DT = data.table(A=rep("abc", 10000), B="def") -DT[110, A:='"a"b'] -fwrite(DT, f<-tempfile(), quote=FALSE) -test(1881.1, ans<-fread(f), DT, warning='Found and resolved improper quoting. First healed line 111: <<"a"b,def>>') -test(1881.2, ans[110,A], '"a"b') # double-check the value of interest directly -cat("(10000 rows)\n", file=f, append=TRUE) -test(1881.3, fread(f), DT, warning=c('Discarded single-line footer: <<(10000 rows)>>', - 'Found and resolved improper quoting. First healed line 111: <<"a"b,def>>')) -unlink(f) - -# CJ will should fail with proper error message, #2636 -test(1882.1, .Machine$integer.max, 2147483647L) # same on all platforms and very unlikely to change in R (which is good) -test(1882.2, ceiling(.Machine$integer.max^(1/3)), 1291) -v = seq_len(1291L) -test(1882.3, CJ(v, v, v), error="Cross product of elements provided to CJ() would result in 2151685171 rows which exceeds .Machine$integer.max == 2147483647") - -# no re-read for particular file, #2509 -test(1883, fread(testDir("SA2-by-DJZ.csv"), verbose=TRUE, header=FALSE)[c(1,2,1381,.N),], - data.table(V1=c("Goulburn","","",""), V2=c("110018063","110018064","0&&&&&&&&","0@@@@@@@@"), V3=INT(3499,812,250796,7305367), V4=NA), - warning='Stopped early on line 1394.*First discarded non-empty line: <<"Dataset: 2011 Census of Population and Housing">>', - output="0.000s.*Rereading 0 columns") - -# sep=NULL with quoted fields, #2548 -test(1884, fread('"A","B"\n', sep=NULL), data.table('"A","B"'=logical())) - -# sep=' ' and blank.lines.skip, #2535 -test(1885.1, fread(txt<-"a b 2\nc d 3\n\ne f 4\n", blank.lines.skip=TRUE), ans<-data.table(V1=c("a","c","e"), V2=c("b","d","f"), V3=2:4)) -test(1885.2, fread(txt, blank.lines.skip=TRUE, fill=TRUE), ans) -test(1885.3, fread(txt, fill=TRUE), ans[c(1,2,NA,3),][3,1:2:=""]) -test(1885.4, fread(txt, fill=TRUE, na.strings=""), ans[c(1,2,NA,3),]) - -# file detected as no header automatically -# (TOOD: undoubling double quotes #1109, #1299) but otherwise, auto mode correct -test(1886, fread(testDir("quoted_no_header.csv"))[c(1,.N),list(V1,V6)], data.table(V1=c("John","Joan \"\"the bone\"\", Anne"), V6=INT(8075,123))) - -# na.omit with invert & no NAs works -DT = data.table(a = 1:5) -DT_out = data.table(a = integer(0L)) -test(1887, na.omit(DT, invert = TRUE), DT_out) - -x = runif(1e4) -test(1888, fsort(x), base::sort(x)) - -# doubling of savetl buffer (currently starts with 100) -x = as.character(as.hexmode(1:1000)) -for (i in x) assign(i, 1L) -test(1889, chmatch(x,x), 1:1000) - -# test DT$.<- in a data.table-unaware package -DT = data.table(A=1:5) -test(1890.1, stats::ts.plot(gpars=DT), error="object must have one or more observations") -# Inside ts.plot is a gpars$ylab<- which happens before its error. That dispatches to our $<- which does the alloc.col() -test(1890.2, DT, data.table(A=1:5)) - -# na="" default, #2524 -test(1891.1, fread('A,B,C\n1,foo,4\n2,,5\n3,bar,6\n', na.strings=""), data.table(A=1:3, B=c("foo",NA,"bar"), C=4:6)) -test(1891.2, fread('A,B,C\n1,foo,4\n2,"",5\n3,bar,6\n', na.strings=""), data.table(A=1:3, B=c("foo","","bar"), C=4:6)) -test(1891.3, fread("A,B,C\n1,foo,bar\n2", fill=TRUE, na.strings=""), data.table(A=1:2,B=c("foo",NA),C=c("bar",NA))) -test(1891.4, fread("A,B,C\n1,foo,bar\n2", fill=TRUE, na.strings="NA"), data.table(A=1:2,B=c("foo",""),C=c("bar",""))) - -# preserving "" and NA_character_, #2214 -DT = data.table(chr = c(NA, "", "a"), num = c(NA, NA, 2L)) -test(1892.1, fread({fwrite(DT,f<-tempfile());f}, na.strings=""), DT); unlink(f) -test(1892.2, capture.output(fwrite(DT)), c("chr,num", ",", "\"\"," , "a,2")) -test(1892.3, fread('A,B\n1,"foo"\n2,\n3,""\n', na.strings="")$B, c("foo", NA, "")) # for issue #2217 - -# print(DT) should print NA in character columns using like base R to distinguish from "" and "NA" -DT = data.table(A=1:4, B=c("FOO","",NA,"NA")) -test(1893.1, print(DT), output=txt<-c(" A B", "1: 1 FOO", "2: 2 ", "3: 3 ", "4: 4 NA")) -DF = as.data.frame(DT) -rownames(DF) = paste0(rownames(DF),":") -test(1893.2, print(DF), output=txt) -txt = 'A,B\n109,MT\n7,N\n11,NA\n41,NB\n60,ND\n1,""\n2,\n3,"NA"\n4,NA\n' -test(1893.3, print(fread(txt,na.strings="")), output="A B\n1: 109 MT\n2: 7 N\n3: 11 NA\n4: 41 NB\n5: 60 ND\n6: 1 \n7: 2 \n8: 3 NA\n9: 4 NA") - -# .. prefix on all variables in j=, #2655 in part -DT = data.table(x=1:3, y=4:6, z=7:9) -cols = "z" -test(1894.1, DT[, ..cols], DT[,.(z)]) -test(1894.2, DT[, c(..cols, "x")], DT[,.(z,x)]) -test(1894.3, DT[, !..cols], DT[,.(x,y)]) -..cols = "x" -test(1894.4, DT[, !..cols], DT[,.(x,y)], warning="Both 'cols' and '..cols' exist in calling scope. Please remove the '..cols' variable.*clarity") -rm(..cols) -cols = c("z","x") -test(1894.5, DT[, -..cols], DT[,.(y)]) -coef = 10L -test(1894.6, DT[, y*..coef], INT(40,50,60)) -test(1894.7, DT[x==2, z*..coef], 80L) -test(1894.8, DT[, sum(y*..coef), by=x%%2L], data.table(x=1:0, V1=INT(100,50))) -if (exists("z")) rm(z) -test(1894.9, DT[, sum(z)*..z], error="Variable 'z' is not found in calling scope. Looking in calling scope because this symbol was prefixed with .. in the j= parameter.") -z = 3L -test(1894.11, DT[, sum(z)*..z], 72L) -setnames(DT, "z", "..z") -test(1894.12, DT[, sum(y)*..z], error="..z in j is looking for z in calling scope, but a column '..z' exists. Column names should not start with ..") - -test(1895, getDTthreads(verbose=TRUE), output="omp_get_max_threads.*omp_get_thread_limit.*DTthreads") - -# Non ascii missing protects on ENC2UTF8; issue #2674 -utf8_strings = c("\u00e7ile", "fa\u00e7ile", "El. pa\u00c5\u00a1tas", "\u00a1tas", "\u00de") -latin1_strings = iconv(utf8_strings, from = "UTF-8", to = "latin1") -DT = data.table(x = sample(latin1_strings, 1000, replace=TRUE), key = "x") -# The ans below is generated by `sort(utf8_strings, method = "radix")` on R (>= 3.3.0). -# Note that you should generally avoid to call `sort(., method = "radix")` in `data.table`'s test -# because `data.table` could be used on any R version that is equal or larger than 3.1.0. -ans = c("El. pa\u00c5\u00a1tas", "fa\u00e7ile", "\u00a1tas", "\u00de", "\u00e7ile") -test(1896.1, enc2utf8(unique(DT$x)), ans) -# by, keyby should treat the string with different encoding as the same -mixed_strings = c(utf8_strings, latin1_strings) -DT = data.table(x = mixed_strings) -test(1896.2, DT[, .(CT = .N), keyby = x]$CT, rep(2L, 5)) -test(1896.3, DT[, uniqueN(x)], 5L) -DT = data.table(x = mixed_strings, y = c(latin1_strings, utf8_strings), z = 1) -test(1896.4, nrow(DT[, .N, by = .(z, x, y)]), 5L) -test(1896.5, nrow(DT[, .N, by = .(y, x, z)]), 5L) -test(1896.6, nrow(DT[, .N, by = .(y, z, x)]), 5L) - -# FR#2695 -- setindexv to accept lists for multiple indices -DT = data.table(a = c(3, 2, 1, 2, 3), b = c(1, 2, 1, 1, 2)) -setindexv(DT, list('a', c('a', 'b'))) -test(1897.1, indices(DT), c("a", "a__b")) -test(1897.2, attributes(attr(DT, 'index')), - list(`__a` = c(3L, 2L, 4L, 1L, 5L), - `__a__b` = c(3L, 4L, 2L, 1L, 5L))) - -test(1898.1, set2key(DT, a), error="deprecated. Please use setindex() instead.") -test(1898.2, set2keyv(DT, "a"), error="deprecated. Please use setindexv() instead.") -test(1898.3, key2(DT), error="deprecated. Please use indices() instead.") - -# Allow column to be used as rownames when converting to matrix #2702 -DT = data.table(id = letters[1:4], X = 1:4, Y = 5:8) -mat <- matrix(1:8, ncol = 2, dimnames=list(letters[1:4], c("X", "Y"))) -mat2 <- matrix(c(letters[1:4], 1:8), ncol=3, dimnames=list(NULL, c("id", "X", "Y"))) -mat3 <- matrix(c(letters[1:4], 1:8), ncol=3, dimnames=list(1:4, c("id", "X", "Y"))) -test(1899.01, as.matrix(DT, 1), mat) -test(1899.02, as.matrix(DT, "id"), mat) -test(1899.03, as.matrix(DT, TRUE), mat) -setkey(DT, id) -test(1899.04, as.matrix(DT, TRUE), mat) -test(1899.05, as.matrix(DT, 1:4), mat3) -# errors -test(1899.06, as.matrix(DT, -1), error="rownames is -1 which is outside the column number range") -test(1899.07, as.matrix(DT, "Z"), error="Z is not a column of x") -test(1899.08, as.matrix(DT, c(1,2)), error="rownames must be a single column in x or a vector of row names of length nrow(x)") -test(1899.09, as.matrix(DT, complex(1)), error="rownames must be TRUE, a column index, a column name in x, or a vector of row names") -# values that pass through (rownames ignored) -test(1899.10, as.matrix(DT, NA), mat2) -test(1899.11, as.matrix(DT, NULL), mat2) -test(1899.12, as.matrix(DT, FALSE), mat2) -# Warnings: -setkey(DT, id, X) -test(1899.13, as.matrix(DT, TRUE), mat, warning="rownames is TRUE but multiple keys") - -# index argument for fread, #2633 -DT_str = c('a,b\n3,1\n2,2\n1,1\n2,1\n3,2') -test(1900.1, attributes(attr(fread(DT_str, index = 'a'), 'index')), - list(`__a` = c(3L, 2L, 4L, 1L, 5L))) -test(1900.2, attributes(attr(fread(DT_str, index = list('a,b', c('b', 'a'), 'a')), 'index')), - list(`__a__b` = c(3L, 4L, 2L, 1L, 5L), - `__b__a` = c(3L, 4L, 1L, 2L, 5L), - `__a` = c(3L, 2L, 4L, 1L, 5L))) -test(1900.3, fread(DT_str, index = 2L), - error = 'index argument.*character vector') -test(1900.4, fread(DT_str, index = list('a', 1L)), - error = 'index argument.*character vector') -# col.names applied before index -test(1900.5, fread(DT_str, col.names = c('c', 'd'), index = 'a'), - error = 'some columns are not in the data.table') -test(1900.6, attributes(attr(fread(DT_str, index = c('a', 'b')), 'index')), - list(`__a__b` = c(3L, 4L, 2L, 1L, 5L))) - -# . within bquote shouldn't be swapped to list, #1912 -DT = data.table(x = 1:5, y = 6:10) -test(1901.1, DT[, bquote(z==.(sum(x)))], bquote(z==.(DT[, sum(x)]))) -test(1901.2, DT[, .(.(bquote(z==.(sd(x-y)))))], data.table(V1=list(bquote(z==.(DT[, sd(x-y)]))))) - -# check quote rule detection logic, #2744 -src = '"C\\\\D"\nAB\\x20CD\\n\n"\\"one\\", \\\'two\\\', three"\n"\\r\\t\\v\\a\\b\\071\\uABCD"\n' -test(1902, fread(src, verbose=TRUE), - data.table("C\\\\D"=c("AB\\x20CD\\n", "\\\"one\\\", \\'two\\', three", "\\r\\t\\v\\a\\b\\071\\uABCD")), - output="Quote rule picked = 1") - -# logical01 caused column names not be detected if logical column determines it, #2735 -test(1903.1, fread(",A,B\n1,0,1\n2,0,1\n3,1,1\n", logical01=FALSE), data.table(V1=1:3, A=INT(0,0,1), B=1L)) -test(1903.2, fread(",A,B\n1,0,1\n2,0,1\n3,1,1\n", logical01=TRUE), data.table(V1=1:3, A=c(FALSE,FALSE,TRUE), B=TRUE)) - -# whitespace around NA, and verbose output for small files, #2697 -txt = 'A, B, C\n17, 34, 2.3\n3., NA, 1\nNA , 2, NA \n0,0.1,0' -test(1904.1, fread(txt, na.strings="NA", verbose=TRUE), - ans <- data.table(A=c(17,3,NA,0), B=c(34,NA,2,0.1), C=c(2.3,1.0,NA,0.0)), - output = c("Number of sampling jump points = 1 because.*Reading 1 chunks \\(0 swept\\) of 1.000MB \\(each chunk 4 rows\\) using 1 thread.*Rereading 0 columns")) -test(1904.2, fread(txt, na.strings=c("NA", " ")), ans, warning='na.strings\\[2\\]==" " consists only of whitespace, ignoring. Since strip.white=TRUE.*use.*"".*') -test(1904.3, fread(txt, na.strings=c("NA", "")), ans) -test(1904.4, fread(txt, na.strings=c("NA", "", " ")), ans, warning='na.strings\\[3\\]==" ".*only.*whitespace.*will already be read as ') -test(1904.5, fread(txt, na.strings=c("NA", " "), strip.white=FALSE), error='na.strings\\[2\\]==" ".*only.*whitespace.*But strip.white=FALSE') -setnames(ans, c("A"," B"," C")) -test(1904.6, fread(txt, na.strings="NA", strip.white=FALSE), ans) # whitespace around NA strings is always stripped regardless of strip.white; just column names affected here - -## test type coercion in joins (#2592) -dt1 <- data.table(intCol = 1L:10L, - doubleCol = as.numeric(1:10), ## only 1:10 will be integer - realDoubleCol = seq(0.5, 5, by = 0.5), - boolCol = c(rep(FALSE, 9), TRUE), - charCol = letters[1L:10L], - factCol = factor(letters[1L:10L])) -dt2 <- data.table(intCol = 1L:5L, - doubleCol = as.numeric(1:5), ## only 1:5 will be integer - realDoubleCol = seq(0.5, 2.5, by = 0.5), - boolCol = TRUE, - charCol = letters[1L:5L], - factCol = factor(letters[1L:5L]), - complexCol = as.complex(1:5)) -if ("package:bit64" %in% search()) { - dt1[, int64Col := as.integer64(c(1:9, 3e10))] - dt2[, int64Col := as.integer64(c(1:4, 3e9))] -} -## no coercion when types match -test(1905.1, - nrow(dt1[dt2, on = "boolCol==boolCol"]), nrow(dt2), - warning = NULL) -test(1905.2, - nrow(dt1[dt2, on = "intCol==intCol"]), nrow(dt2), - warning = NULL) -test(1905.3, - nrow(dt1[dt2, on = "doubleCol==doubleCol"]), nrow(dt2), - warning = NULL) -test(1905.4, - nrow(dt1[dt2, on = "realDoubleCol==realDoubleCol"]), nrow(dt2), - warning = NULL) -test(1905.5, - nrow(dt1[dt2, on = "charCol==charCol"]), nrow(dt2), - warning = NULL) -test(1905.6, - nrow(dt1[dt2, on = "factCol==factCol"]), nrow(dt2), - warning = NULL) -if ("package:bit64" %in% search()) { - test(1905.7, - nrow(dt1[dt2, on = "int64Col==int64Col"]), nrow(dt2), - warning = NULL) -} -## error on incompatible types -test(1905.8, - dt1[dt2, on = "boolCol==intCol"], - error = "Incompatible types: x.boolCol (logical) and i.intCol (integer)") -test(1905.9, - dt1[dt2, on = "boolCol==doubleCol"], - error = "Incompatible types: x.boolCol (logical) and i.doubleCol (double)") -test(1905.11, - dt1[dt2, on = "boolCol==realDoubleCol"], - error = "Incompatible types: x.boolCol (logical) and i.realDoubleCol (double)") -test(1905.12, - dt1[dt2, on = "boolCol==charCol"], - error = "Incompatible types: x.boolCol (logical) and i.charCol (character)") -test(1905.13, - dt1[dt2, on = "boolCol==factCol"], - error = "Incompatible types: x.boolCol (logical) and i.factCol (factor)") -test(1905.14, - dt1[dt2, on = "intCol==charCol"], - error = "Incompatible types: x.intCol (integer) and i.charCol (character)") -test(1905.15, - dt1[dt2, on = "intCol==factCol"], - error = "Incompatible types: x.intCol (integer) and i.factCol (factor)") -test(1905.16, - dt1[dt2, on = "doubleCol==charCol"], - error = "Incompatible types: x.doubleCol (double) and i.charCol (character)") -test(1905.17, - dt1[dt2, on = "realDoubleCol==charCol"], - error = "Incompatible types: x.realDoubleCol (double) and i.charCol (character)") -test(1905.18, - dt1[dt2, on = "doubleCol==factCol"], - error = "Incompatible types: x.doubleCol (double) and i.factCol (factor)") -test(1905.19, - dt1[dt2, on = "realDoubleCol==factCol"], - error = "Incompatible types: x.realDoubleCol (double) and i.factCol (factor)") -test(1905.21, - dt1[dt2, on = "charCol==boolCol"], - error = "Incompatible types: x.charCol (character) and i.boolCol (logical)") -test(1905.22, - dt1[dt2, on = "charCol==intCol"], - error = "Incompatible types: x.charCol (character) and i.intCol (integer)") -test(1905.23, - dt1[dt2, on = "charCol==doubleCol"], - error = "Incompatible types: x.charCol (character) and i.doubleCol (double)") -test(1905.24, - dt1[dt2, on = "charCol==realDoubleCol"], - error = "Incompatible types: x.charCol (character) and i.realDoubleCol (double)") -test(1905.25, - dt1[dt2, on = "factCol==boolCol"], - error = "Incompatible types: x.factCol (factor) and i.boolCol (logical)") -test(1905.26, - dt1[dt2, on = "factCol==intCol"], - error = "Incompatible types: x.factCol (factor) and i.intCol (integer)") -test(1905.27, - dt1[dt2, on = "factCol==doubleCol"], - error = "Incompatible types: x.factCol (factor) and i.doubleCol (double)") -test(1905.28, - dt1[dt2, on = "factCol==realDoubleCol"], - error = "Incompatible types: x.factCol (factor) and i.realDoubleCol (double)") -if ("package:bit64" %in% search()) { - test(1905.29, - dt1[dt2, on = "boolCol==int64Col"], - error = "Incompatible types: x.boolCol (logical) and i.int64Col (integer64)") - test(1905.31, - dt1[dt2, on = "charCol==int64Col"], - error = "Incompatible types: x.charCol (character) and i.int64Col (integer64)") - test(1905.32, - dt1[dt2, on = "factCol==int64Col"], - error = "Incompatible types: x.factCol (factor) and i.int64Col (integer64)") - test(1905.33, - dt1[dt2, on = "int64Col==charCol"], - error = "Incompatible types: x.int64Col (integer64) and i.charCol (character)") - test(1905.34, - dt1[dt2, on = "int64Col==factCol"], - error = "Incompatible types: x.int64Col (integer64) and i.factCol (factor)") -} -## correct behaviour on other types. -## 4 checks: -## - correct warning -## - correct type of the coerced columns in i and x -## - correct number of rows in the join -cols <- c("boolCol", "intCol", "doubleCol", "realDoubleCol", "charCol", "factCol") -if ("package:bit64" %in% search()) { - cols <- c(cols, "int64Col") -} -cols <- c(paste0("x.", cols), paste0("i.", cols)) ## make sure that all columns from x and i are in the result -test(1905.35, - result <- dt1[dt2, cols, on = "intCol==boolCol", with = FALSE, nomatch = 0L, verbose = TRUE], - dt1[dt2, cols, on = "intCol==boolCol", with = FALSE, nomatch = 0L], - output = "Coercing logical column i.'boolCol' to integer to match type of x.'intCol'.") -test(1905.36, class(result$i.boolCol), "integer") -test(1905.37, class(result$x.intCol), "integer") -test(1905.38, nrow(result), 5L) -test(1905.39, - result <- dt1[dt2, cols, on = "intCol==doubleCol", with = FALSE, nomatch = 0L, verbose = TRUE], - dt1[dt2, cols, on = "intCol==doubleCol", with = FALSE, nomatch = 0L], - output = "Coercing double column i.'doubleCol' to integer to match type of x.'intCol'.") -test(1905.41, class(result$i.doubleCol), "integer") -test(1905.42, class(result$x.intCol), "integer") -test(1905.43, nrow(result), 5L) -test(1905.44, - result <- dt1[dt2, cols, on = "intCol==realDoubleCol", with = FALSE, nomatch = 0L, verbose = TRUE], - dt1[dt2, cols, on = "intCol==realDoubleCol", with = FALSE, nomatch = 0L], - output = "Coercing integer column x.'intCol' to double to match type of i.'realDoubleCol'.") -test(1905.45, class(result$i.realDoubleCol), "numeric") -test(1905.46, class(result$x.intCol), "integer") ## coercion of x columns is only for the join. The original type is returned. -test(1905.47, nrow(result), 2L) -test(1905.48, - result <- dt1[dt2, cols, on = "doubleCol==boolCol", with = FALSE, nomatch = 0L, verbose = TRUE], - dt1[dt2, cols, on = "doubleCol==boolCol", with = FALSE, nomatch = 0L], - output = "Coercing logical column i.'boolCol' to double to match type of x.'doubleCol'.") -test(1905.49, class(result$i.boolCol), "numeric") -test(1905.51, class(result$x.doubleCol), "numeric") -test(1905.52, nrow(result), 5L) -test(1905.53, - result <- dt1[dt2, cols, on = "realDoubleCol==boolCol", with = FALSE, nomatch = 0L, verbose = TRUE], - dt1[dt2, cols, on = "realDoubleCol==boolCol", with = FALSE, nomatch = 0L], - output = "Coercing logical column i.'boolCol' to double to match type of x.'realDoubleCol'.") -test(1905.54, class(result$i.boolCol), "numeric") -test(1905.55, class(result$x.doubleCol), "numeric") -test(1905.56, nrow(result), 5L) -test(1905.57, - result <- dt1[dt2, cols, on = "doubleCol==intCol", with = FALSE, nomatch = 0L, verbose = TRUE], - dt1[dt2, cols, on = "doubleCol==intCol", with = FALSE, nomatch = 0L], - output = "Coercing integer column i.'intCol' to double to match type of x.'doubleCol'.") -test(1905.58, class(result$i.intCol), "numeric") -test(1905.59, class(result$x.doubleCol), "numeric") -test(1905.61, nrow(result), 5L) -test(1905.62, - result <- dt1[dt2, cols, on = "realDoubleCol==intCol", with = FALSE, nomatch = 0L, verbose = TRUE], - dt1[dt2, cols, on = "realDoubleCol==intCol", with = FALSE, nomatch = 0L], - output = "Coercing integer column i.'intCol' to double to match type of x.'realDoubleCol'.") -test(1905.63, class(result$i.intCol), "numeric") -test(1905.64, class(result$x.realDoubleCol), "numeric") -test(1905.65, nrow(result), 5L) -test(1905.66, - result <- dt1[dt2, cols, on = "charCol==factCol", with = FALSE, nomatch = 0L, verbose = TRUE], - dt1[dt2, cols, on = "charCol==factCol", with = FALSE, nomatch = 0L], - output = "Coercing factor column i.'factCol' to character to match type of x.'charCol'.") -test(1905.67, class(result$i.factCol), "character") -test(1905.68, class(result$x.charCol), "character") -test(1905.69, nrow(result), 5L) -test(1905.71, - result <- dt1[dt2, cols, on = "factCol==charCol", with = FALSE, nomatch = 0L, verbose = TRUE], - dt1[dt2, cols, on = "factCol==charCol", with = FALSE, nomatch = 0L], - output = "Coercing character column i.'charCol' to factor to match type of x.'factCol'.") -test(1905.72, class(result$i.charCol), "factor") -test(1905.73, class(result$x.factCol), "factor") -test(1905.74, nrow(result), 5L) -if ("package:bit64" %in% search()) { - test(1905.75, - result <- dt1[dt2, cols, on = "intCol==int64Col", with = FALSE, nomatch = 0L, verbose = TRUE], - suppressWarnings(dt1[dt2, cols, on = "intCol==int64Col", with = FALSE, nomatch = 0L]), - output = "Coercing integer64 column i.'int64Col' to integer to match type of x.'intCol'.", - warning = "NAs produced by integer overflow") - test(1905.76, class(result$i.int64Col), "integer") - test(1905.77, class(result$x.intCol), "integer") - test(1905.78, nrow(result), 4L) - test(1905.79, - result <- dt1[dt2, cols, on = "doubleCol==int64Col", with = FALSE, nomatch = 0L, verbose = TRUE], - dt1[dt2, cols, on = "doubleCol==int64Col", with = FALSE, nomatch = 0L], - output = "Coercing integer64 column i.'int64Col' to double to match type of x.'doubleCol'.") - test(1905.81, class(result$i.int64Col), "numeric") - test(1905.82, class(result$x.doubleCol), "numeric") - test(1905.83, nrow(result), 4L) - test(1905.84, - result <- dt1[dt2, cols, on = "realDoubleCol==int64Col", with = FALSE, nomatch = 0L, verbose = TRUE], - dt1[dt2, cols, on = "realDoubleCol==int64Col", with = FALSE, nomatch = 0L], - output = "Coercing integer64 column i.'int64Col' to double to match type of x.'realDoubleCol'.") - test(1905.85, class(result$i.int64Col), "numeric") - test(1905.86, class(result$x.realDoubleCol), "numeric") - test(1905.87, nrow(result), 4L) - test(1905.88, - result <- dt1[dt2, cols, on = "int64Col==boolCol", with = FALSE, nomatch = 0L, verbose = TRUE], - dt1[dt2, cols, on = "int64Col==boolCol", with = FALSE, nomatch = 0L], - output = "Coercing logical column i.'boolCol' to integer64 to match type of x.'int64Col'.") - test(1905.89, class(result$i.boolCol), "integer64") - test(1905.91, class(result$x.int64Col), "integer64") - test(1905.92, nrow(result), 5L) - test(1905.93, - result <- dt1[dt2, cols, on = "int64Col==intCol", with = FALSE, nomatch = 0L, verbose = TRUE], - dt1[dt2, cols, on = "int64Col==intCol", with = FALSE, nomatch = 0L], - output = "Coercing integer column i.'intCol' to integer64 to match type of x.'int64Col'.") - test(1905.94, class(result$i.intCol), "integer64") - test(1905.95, class(result$x.int64Col), "integer64") - test(1905.96, nrow(result), 5L) - test(1905.97, - result <- dt1[dt2, cols, on = "int64Col==doubleCol", with = FALSE, nomatch = 0L, verbose = TRUE], - dt1[dt2, cols, on = "int64Col==doubleCol", with = FALSE, nomatch = 0L], - output = "Coercing double column i.'doubleCol' to integer64 to match type of x.'int64Col'.") - test(1905.98, class(result$i.doubleCol), "integer64") - test(1905.99, class(result$x.int64Col), "integer64") - test(1905.101, nrow(result), 5L) - test(1905.102, - result <- dt1[dt2, cols, on = "int64Col==realDoubleCol", with = FALSE, nomatch = 0L, verbose = TRUE], - dt1[dt2, cols, on = "int64Col==realDoubleCol", with = FALSE, nomatch = 0L], - output = "Coercing integer64 column x.'int64Col' to double to match type of i.'realDoubleCol'.") - test(1905.103, class(result$i.realDoubleCol), "numeric") - test(1905.104, class(result$x.int64Col), "integer64") ## coercion of x columns is only for the join. The original type is returned. - test(1905.105, nrow(result), 2L) -} -## correct behaviour if non-standard types are involved: -## can only be tested for non-standard column in i because non-standard in x throws error before bmerge in forderv -test(1905.106, dt1[dt2, on = "intCol==complexCol"], - error = "Incompatible types: x.intCol (integer) and i.complexCol (complex)") - -################################### -# Add new tests above this line # -################################### - -options(oldOptions) # set at top of this file - -setDTthreads(0) -plat = paste0("endian==", .Platform$endian, - ", sizeof(long double)==", .Machine$sizeof.longdouble, - ", sizeof(pointer)==", .Machine$sizeof.pointer) -DT = head(timings[-1L][order(-time)],10) # exclude id 1 as in dev that includes JIT -if ((x<-timings[,sum(nTest)]) != ntest) warning("Timings count mismatch:",x,"vs",ntest) -cat("\n10 longest running tests took ", as.integer(tt<-DT[, sum(time)]), "s (", as.integer(100*tt/(ss<-timings[,sum(time)])), "% of ", as.integer(ss), "s)\n", sep="") -print(DT, class=FALSE) -if (memtest) { - ..inittime = inittime - m = fread("memtest.csv")[inittime==..inittime] - if (nrow(m)) { - ps_na = all(is.na(m[["PS_rss"]])) # OS with no 'ps -o rss R' support - png("memtest.png") - p = par(mfrow=c(if (ps_na) 2 else 3, 2)) - if (!ps_na) { - m[, plot(test, PS_rss, pch=18, xlab="test num", ylab="mem MB", main="ps -o rss R")] - m[, plot(timestamp, PS_rss, type="l", xlab="timestamp", ylab="mem MB", main="ps -o rss R")] - } - m[, plot(test, GC_used, pch=18, xlab="test num", ylab="mem MB", main="gc used")] - m[, plot(timestamp, GC_used, type="l", xlab="timestamp", ylab="mem MB", main="gc used")] - m[, plot(test, GC_max_used, pch=18, xlab="test num", ylab="mem MB", main="gc max used")] - m[, plot(timestamp, GC_max_used, type="l", xlab="timestamp", ylab="mem MB", main="gc max used")] - par(p) - dev.off() - } else { - warning("test.data.table runs with memory testing but did not collect any memory statistics.") - } -} -if (nfail > 0) { - if (nfail>1) {s1="s";s2="s: "} else {s1="";s2=" "} - cat("\r") - stop(nfail," error",s1," out of ",ntest," in ",timetaken(started.at)," on ",date(),". [",plat,"].", - " Search inst/tests/tests.Rraw for test number",s2,paste(whichfail,collapse=", "),".") - # important to stop() here, so that 'R CMD check' fails -} -cat(plat,"\nAll ",ntest," tests in inst/tests/tests.Rraw completed ok in ",timetaken(started.at)," on ",date(),"\n",sep="") -# date() is included so we can tell exactly when these tests ran on CRAN. Sometimes a CRAN log can show error but that can be just -# stale due to not updating yet since a fix in R-devel, for example. - From a1703b42f42e6e1e94380e2f9e13ced8d92771a9 Mon Sep 17 00:00:00 2001 From: MarkusBonsch Date: Sun, 7 Oct 2018 00:19:49 +0200 Subject: [PATCH 17/31] Full purge. --- R/AllS4.R | 23 - R/IDateTime.R | 301 - R/as.data.table.R | 192 - R/between.R | 40 - R/bmerge.R | 0 R/c.factor.R | 40 - R/cedta.R | 46 - R/data.table.R | 3013 --- R/duplicated.R | 160 - R/fcast.R | 233 - R/fmelt.R | 65 - R/foverlaps.R | 228 - R/frank.R | 93 - R/fread.R | 183 - R/fwrite.R | 59 - R/getdots.R | 10 - R/groupingsets.R | 121 - R/last.R | 37 - R/like.R | 16 - R/merge.R | 103 - R/onAttach.R | 66 - R/onLoad.R | 113 - R/openmp-utils.R | 8 - R/print.data.table.R | 150 - R/setkey.R | 397 - R/setops.R | 287 - R/shift.R | 14 - R/tables.R | 45 - R/test.data.table.R | 265 - R/timetaken.R | 17 - R/transpose.R | 36 - R/uniqlist.R | 24 - R/utils.R | 73 - R/xts.R | 17 - inst/tests/1206FUT.txt | 309 - inst/tests/1680-fread-header-encoding.csv | 5 - inst/tests/2008head.csv | 500 - inst/tests/530_fread.txt | 51 - inst/tests/536_fread_fill_1.txt | 29 - inst/tests/536_fread_fill_2.txt | 28 - inst/tests/536_fread_fill_3_extreme.txt | 22 - inst/tests/536_fread_fill_4.txt | 30 - inst/tests/SA2-by-DJZ.csv | 1400 -- inst/tests/allchar.csv | 17577 ---------------- inst/tests/alluniquechar.csv | 501 - inst/tests/bad.txt | 409 - inst/tests/benchmark.Rraw | 170 - inst/tests/ch11b.dat | 100 - inst/tests/colnames4096.csv | 1 - inst/tests/doublequote_newline.csv | 40 - inst/tests/fillheader.csv | 10 - inst/tests/fread_blank.txt | 48 - inst/tests/fread_blank2.txt | 32 - inst/tests/fread_blank3.txt | 12 - inst/tests/fread_line_error.csv | 69 - inst/tests/gb18030.txt | 2 - inst/tests/grr.csv | 2839 --- inst/tests/isoweek_test.csv | 1462 -- inst/tests/issue_1087_utf8_bom.csv | 2 - inst/tests/issue_1095_fread.txt | 100 - inst/tests/issue_1113_fread.txt | 4 - inst/tests/issue_1116_fread_few_lines.txt | 133 - inst/tests/issue_1116_fread_few_lines_2.txt | 177 - inst/tests/issue_1164_json.txt | 2 - inst/tests/issue_1330_fread.txt | 8 - inst/tests/issue_1462_fread_quotes.txt | 4 - inst/tests/issue_1573_fill.txt | 8 - inst/tests/issue_2051.csv | 3 - inst/tests/issue_2157_sampling_overlap.txt | 1315 -- .../issue_2157_sampling_reached_eof_early.txt | 1229 -- inst/tests/issue_563_fread.txt | 5 - inst/tests/issue_773_fread.txt | 28 - inst/tests/issue_785_fread.txt | 5 - inst/tests/iterations.txt | 101 - inst/tests/melt-warning-1752.tsv | 2 - inst/tests/onecol4096.csv | 262 - inst/tests/other.Rraw | 183 - inst/tests/quoted_multiline.csv | 126 - inst/tests/quoted_no_header.csv | 6 - inst/tests/russellCRCRLF.csv | 20 - inst/tests/russellCRLF.csv | 20 - inst/tests/session_aborted_fatal_error.txt | 16 - inst/tests/test0.txt | 1 - inst/tests/tests-DESCRIPTION | 7 - inst/tests/tests.Rraw | 0 inst/tests/unescaped.csv | 4 - inst/tests/utf16be.txt | Bin 18 -> 0 bytes inst/tests/utf16le.txt | Bin 18 -> 0 bytes inst/tests/winallquoted.csv | 5000 ----- 89 files changed, 40892 deletions(-) delete mode 100644 R/AllS4.R delete mode 100644 R/IDateTime.R delete mode 100644 R/as.data.table.R delete mode 100644 R/between.R delete mode 100644 R/bmerge.R delete mode 100644 R/c.factor.R delete mode 100644 R/cedta.R delete mode 100644 R/data.table.R delete mode 100644 R/duplicated.R delete mode 100644 R/fcast.R delete mode 100644 R/fmelt.R delete mode 100644 R/foverlaps.R delete mode 100644 R/frank.R delete mode 100644 R/fread.R delete mode 100644 R/fwrite.R delete mode 100644 R/getdots.R delete mode 100644 R/groupingsets.R delete mode 100644 R/last.R delete mode 100644 R/like.R delete mode 100644 R/merge.R delete mode 100644 R/onAttach.R delete mode 100644 R/onLoad.R delete mode 100644 R/openmp-utils.R delete mode 100644 R/print.data.table.R delete mode 100644 R/setkey.R delete mode 100644 R/setops.R delete mode 100644 R/shift.R delete mode 100644 R/tables.R delete mode 100644 R/test.data.table.R delete mode 100644 R/timetaken.R delete mode 100644 R/transpose.R delete mode 100644 R/uniqlist.R delete mode 100644 R/utils.R delete mode 100644 R/xts.R delete mode 100644 inst/tests/1206FUT.txt delete mode 100644 inst/tests/1680-fread-header-encoding.csv delete mode 100644 inst/tests/2008head.csv delete mode 100644 inst/tests/530_fread.txt delete mode 100644 inst/tests/536_fread_fill_1.txt delete mode 100644 inst/tests/536_fread_fill_2.txt delete mode 100644 inst/tests/536_fread_fill_3_extreme.txt delete mode 100644 inst/tests/536_fread_fill_4.txt delete mode 100644 inst/tests/SA2-by-DJZ.csv delete mode 100644 inst/tests/allchar.csv delete mode 100644 inst/tests/alluniquechar.csv delete mode 100644 inst/tests/bad.txt delete mode 100644 inst/tests/benchmark.Rraw delete mode 100644 inst/tests/ch11b.dat delete mode 100644 inst/tests/colnames4096.csv delete mode 100644 inst/tests/doublequote_newline.csv delete mode 100644 inst/tests/fillheader.csv delete mode 100644 inst/tests/fread_blank.txt delete mode 100644 inst/tests/fread_blank2.txt delete mode 100644 inst/tests/fread_blank3.txt delete mode 100644 inst/tests/fread_line_error.csv delete mode 100644 inst/tests/gb18030.txt delete mode 100644 inst/tests/grr.csv delete mode 100644 inst/tests/isoweek_test.csv delete mode 100644 inst/tests/issue_1087_utf8_bom.csv delete mode 100644 inst/tests/issue_1095_fread.txt delete mode 100644 inst/tests/issue_1113_fread.txt delete mode 100644 inst/tests/issue_1116_fread_few_lines.txt delete mode 100644 inst/tests/issue_1116_fread_few_lines_2.txt delete mode 100644 inst/tests/issue_1164_json.txt delete mode 100644 inst/tests/issue_1330_fread.txt delete mode 100644 inst/tests/issue_1462_fread_quotes.txt delete mode 100644 inst/tests/issue_1573_fill.txt delete mode 100644 inst/tests/issue_2051.csv delete mode 100644 inst/tests/issue_2157_sampling_overlap.txt delete mode 100644 inst/tests/issue_2157_sampling_reached_eof_early.txt delete mode 100644 inst/tests/issue_563_fread.txt delete mode 100644 inst/tests/issue_773_fread.txt delete mode 100644 inst/tests/issue_785_fread.txt delete mode 100644 inst/tests/iterations.txt delete mode 100644 inst/tests/melt-warning-1752.tsv delete mode 100644 inst/tests/onecol4096.csv delete mode 100644 inst/tests/other.Rraw delete mode 100644 inst/tests/quoted_multiline.csv delete mode 100644 inst/tests/quoted_no_header.csv delete mode 100644 inst/tests/russellCRCRLF.csv delete mode 100644 inst/tests/russellCRLF.csv delete mode 100644 inst/tests/session_aborted_fatal_error.txt delete mode 100644 inst/tests/test0.txt delete mode 100644 inst/tests/tests-DESCRIPTION delete mode 100644 inst/tests/tests.Rraw delete mode 100644 inst/tests/unescaped.csv delete mode 100644 inst/tests/utf16be.txt delete mode 100644 inst/tests/utf16le.txt delete mode 100644 inst/tests/winallquoted.csv diff --git a/R/AllS4.R b/R/AllS4.R deleted file mode 100644 index 1e6244fbcb..0000000000 --- a/R/AllS4.R +++ /dev/null @@ -1,23 +0,0 @@ -## Functions to let data.table play nicer with S4 -if ("package:data.table" %in% search()) stop("data.table package loaded. When developing don't load package") - -## Allows data.table to be defined as an object of an S4 class, -## or even have data.table be a super class of an S4 class. -setOldClass(c('data.frame')) -setOldClass(c('data.table', 'data.frame')) - -## as(some.data.frame, "data.table") -setAs("data.frame", "data.table", function(from) { - as.data.table(from) -}) - -## as(some.data.table, "data.frame") -setAs("data.table", "data.frame", function(from) { - as.data.frame(from) -}) - -setOldClass("IDate") -setOldClass("ITime") - -setAs("character", "IDate", function(from) as.IDate(from)) -setAs("character", "ITime", function(from) as.ITime(from)) diff --git a/R/IDateTime.R b/R/IDateTime.R deleted file mode 100644 index a969404323..0000000000 --- a/R/IDateTime.R +++ /dev/null @@ -1,301 +0,0 @@ - -################################################################### -# IDate -- a simple wrapper class around Date using integer storage -################################################################### - -as.IDate <- function(x, ...) UseMethod("as.IDate") - -as.IDate.default <- function(x, ..., tz = attr(x, "tzone")) { - if (is.null(tz)) tz = "UTC" - as.IDate(as.Date(x, tz = tz, ...)) -} - -as.IDate.numeric <- function(x, ...) { - structure(as.integer(x), class=c("IDate","Date")) -} - -as.IDate.Date <- function(x, ...) { - structure(as.integer(x), class=c("IDate","Date")) -} - -as.IDate.POSIXct <- function(x, tz = attr(x, "tzone"), ...) { - if (is.null(tz)) tz = "UTC" - if (tz %in% c("UTC", "GMT")) - structure(as.integer(x) %/% 86400L, class=c("IDate","Date")) - else - as.IDate(as.Date(x, tz = tz, ...)) -} - -as.IDate.IDate <- function(x, ...) x - -as.Date.IDate <- function(x, ...) { - structure(as.numeric(x), class="Date") -} - -mean.IDate <- -cut.IDate <- -seq.IDate <- -c.IDate <- -rep.IDate <- -split.IDate <- -unique.IDate <- - function(x, ...) { - as.IDate(NextMethod()) - } - -# fix for #1315 -as.list.IDate <- function(x, ...) NextMethod() - -# rounding -- good for graphing / subsetting -## round.IDate <- function (x, digits, units=digits, ...) { -## if (missing(digits)) digits <- units # workaround to provide a units argument to match the round generic and round.POSIXt -## units <- match.arg(digits, c("weeks", "months", "quarters", "years")) -round.IDate <- function (x, digits=c("weeks", "months", "quarters", "years"), ...) { - units <- match.arg(digits) - as.IDate(switch(units, - weeks = round(x, "year") + 7L * (yday(x) %/% 7L), - months = ISOdate(year(x), month(x), 1L), - quarters = ISOdate(year(x), 3L * (quarter(x)-1L) + 1L, 1L), - years = ISOdate(year(x), 1L, 1L))) -} - -#Adapted from `+.Date` -`+.IDate` <- function (e1, e2) { - if (nargs() == 1L) - return(e1) - if (inherits(e1, "difftime") || inherits(e2, "difftime")) - stop("difftime objects may not be added to IDate. Use plain integer instead of difftime.") - if ( (storage.mode(e1)=="double" && isReallyReal(e1)) || - (storage.mode(e2)=="double" && isReallyReal(e2)) ) { - return(`+.Date`(e1,e2)) - # IDate doesn't support fractional days; revert to base Date - } - if (inherits(e1, "Date") && inherits(e2, "Date")) - stop("binary + is not defined for \"IDate\" objects") - structure(as.integer(unclass(e1) + unclass(e2)), class = c("IDate", "Date")) -} - -`-.IDate` <- function (e1, e2) { - if (!inherits(e1, "IDate")) - stop("can only subtract from \"IDate\" objects") - if (storage.mode(e1) != "integer") - stop("Internal error: storage mode of IDate is somehow no longer integer") - if (nargs() == 1L) - stop("unary - is not defined for \"IDate\" objects") - if (inherits(e2, "difftime")) - stop("difftime objects may not be subtracted from IDate. Use plain integer instead of difftime.") - if ( storage.mode(e2)=="double" && isReallyReal(e2) ) { - return(`-.Date`(as.Date(e1),as.Date(e2))) - # IDate doesn't support fractional days so revert to base Date - } - ans = as.integer(unclass(e1) - unclass(e2)) - if (!inherits(e2, "Date")) class(ans) = c("IDate","Date") - return(ans) -} - - - -################################################################### -# ITime -- Integer time-of-day class -# Stored as seconds in the day -################################################################### - -as.ITime <- function(x, ...) UseMethod("as.ITime") - -as.ITime.default <- function(x, ...) { - as.ITime(as.POSIXlt(x, ...)) -} - -as.ITime.POSIXct <- function(x, tz = attr(x, "tzone"), ...) { - if (is.null(tz)) tz = "UTC" - if (tz %in% c("UTC", "GMT")) as.ITime(unclass(x), ...) else as.ITime(as.POSIXlt(x, tz = tz, ...)) -} - -as.ITime.numeric <- function(x, ...) { - structure(as.integer(x) %% 86400L, class = "ITime") -} - -as.ITime.character <- function(x, format, ...) { - x <- unclass(x) - if (!missing(format)) return(as.ITime(strptime(x, format = format, ...))) - # else allow for mixed formats, such as test 1189 where seconds are caught despite varying format - y <- strptime(x, format = "%H:%M:%OS", ...) - w <- which(is.na(y)) - formats = c("%H:%M", - "%Y-%m-%d %H:%M:%OS", - "%Y/%m/%d %H:%M:%OS", - "%Y-%m-%d %H:%M", - "%Y/%m/%d %H:%M", - "%Y-%m-%d", - "%Y/%m/%d") - for (f in formats) { - if (!length(w)) break - new <- strptime(x[w], format = f, ...) - nna <- !is.na(new) - if (any(nna)) { - y[ w[nna] ] <- new - w <- w[!nna] - } - } - return(as.ITime(y)) -} - -as.ITime.POSIXlt <- function(x, ...) { - structure(with(x, as.integer(sec) + min * 60L + hour * 3600L), - class = "ITime") -} - -as.character.ITime <- format.ITime <- function(x, ...) { - # adapted from chron's format.times - # Fix for #811. Thanks to @StefanFritsch for the code snippet - neg <- x < 0L - x <- abs(unclass(x)) - hh <- x %/% 3600L - mm <- (x - hh * 3600L) %/% 60L - # #2171 -- trunc gives numeric but %02d requires integer; - # as.integer is also faster (but doesn't handle integer overflow) - # http://stackoverflow.com/questions/43894077 - ss <- as.integer(x - hh * 3600L - 60L * mm) - res = sprintf('%02d:%02d:%02d', hh, mm, ss) - # Fix for #1354, so that "NA" input is handled correctly. - if (is.na(any(neg))) res[is.na(x)] = NA - neg = which(neg) - if (length(neg)) res[neg] = paste0("-", res[neg]) - res -} - -as.data.frame.ITime <- function(x, ...) { - # This method is just for ggplot2, #1713 - # Avoids the error "cannot coerce class '"ITime"' into a data.frame", but for some reason - # ggplot2 doesn't seem to call the print method to get axis labels, so still prints integers. - # Tried converting to POSIXct but that gives the error below. - # If user converts to POSIXct themselves, then it works for some reason. - ans = list(x) - # ans = list(as.POSIXct(x,tzone="")) # ggplot2 gives "Error: Discrete value supplied to continuous scale" - setattr(ans,"class","data.frame") - setattr(ans,"row.names", .set_row_names(length(x))) - setattr(ans,"names","V1") - ans -} - -print.ITime <- function(x, ...) { - print(format(x)) -} - -rep.ITime <- function (x, ...) -{ - y <- rep(unclass(x), ...) - structure(y, class = "ITime") -} - -"[.ITime" <- function(x, ..., drop = TRUE) -{ - cl <- oldClass(x) - class(x) <- NULL - val <- NextMethod("[") - class(val) <- cl - val -} - -unique.ITime <- function(x, ...) { - ans = NextMethod() - setattr(ans,"class","ITime") - ans -} - -# create a data.table with IDate and ITime columns -# should work for most date/time formats like chron or POSIXct - -IDateTime <- function(x, ...) UseMethod("IDateTime") -IDateTime.default <- function(x, ...) { - data.table(idate = as.IDate(x), itime = as.ITime(x)) -} - -# POSIXt support - -as.POSIXct.IDate <- function(x, tz = "UTC", time = 0, ...) { - if (missing(time) && inherits(tz, "ITime")) { - time <- tz # allows you to use time as the 2nd argument - tz <- "UTC" - } - if (tz == "") tz <- "UTC" - as.POSIXct(as.POSIXlt(x, ...), tz, ...) + time -} - -as.POSIXct.ITime <- function(x, tz = "UTC", date = as.Date(Sys.time()), ...) { - if (missing(date) && any(class(tz) %in% c("Date", "IDate", "POSIXt", "dates"))) { - date <- tz # allows you to use date as the 2nd argument - tz <- "UTC" - } - as.POSIXct(as.POSIXlt(date), tz = tz) + x -} - -as.POSIXlt.ITime <- function(x, ...) { - as.POSIXlt(as.POSIXct(x, ...)) -} - -# chron support - -as.chron.IDate <- function(x, time = NULL, ...) { - if(!requireNamespace("chron", quietly = TRUE)) stop("Install suggested `chron` package to use `as.chron.IDate` function.") else { - if (!is.null(time)) { - chron::chron(dates. = chron::as.chron(as.Date(x)), times. = chron::as.chron(time)) - } else { - chron::chron(dates. = chron::as.chron(as.Date(x))) - } - } -} - -as.chron.ITime <- function(x, date = NULL, ...) { - if(!requireNamespace("chron", quietly = TRUE)) stop("Install suggested `chron` package to use `as.chron.ITime` function.") else { - if (!is.null(date)) { - chron::chron(dates. = chron::as.chron(as.Date(date)), times. = chron::as.chron(x)) - } else { - chron::chron(times. = as.character(x)) - } - } -} - -as.ITime.times <- function(x, ...) { - x <- unclass(x) - daypart <- x - floor(x) - secs <- as.integer(round(daypart * 86400)) - structure(secs, - class = "ITime") -} - -################################################################### -# Date - time extraction functions -# Adapted from Hadley Wickham's routines cited below to ensure -# integer results. -# http://gist.github.com/10238 -# See also Hadley's more advanced and complex lubridate package: -# https://github.com/hadley/lubridate -# lubridate routines do not return integer values. -################################################################### - -second <- function(x) as.integer(as.POSIXlt(x)$sec) -minute <- function(x) as.POSIXlt(x)$min -hour <- function(x) as.POSIXlt(x)$hour -yday <- function(x) as.POSIXlt(x)$yday + 1L -wday <- function(x) (unclass(as.IDate(x)) + 4L) %% 7L + 1L -mday <- function(x) as.POSIXlt(x)$mday -week <- function(x) yday(x) %/% 7L + 1L -isoweek <- function(x) { - # ISO 8601-conformant week, as described at - # https://en.wikipedia.org/wiki/ISO_week_date - # Approach: - # * Find nearest Thursday to each element of x - # * Find the number of weeks having passed between - # January 1st of the year of the nearest Thursdays and x - - x = as.IDate(x) # number of days since 1 Jan 1970 (a Thurs) - nearest_thurs = as.IDate(7L * (as.integer(x + 3L) %/% 7L)) - year_start <- as.IDate(format(nearest_thurs, '%Y-01-01')) - 1L + (nearest_thurs - year_start) %/% 7L -} - -month <- function(x) as.POSIXlt(x)$mon + 1L -quarter <- function(x) as.POSIXlt(x)$mon %/% 3L + 1L -year <- function(x) as.POSIXlt(x)$year + 1900L - diff --git a/R/as.data.table.R b/R/as.data.table.R deleted file mode 100644 index 44433218e2..0000000000 --- a/R/as.data.table.R +++ /dev/null @@ -1,192 +0,0 @@ -as.data.table <-function(x, keep.rownames=FALSE, ...) -{ - if (is.null(x)) - return(null.data.table()) - UseMethod("as.data.table") -} - -as.data.table.default <- function(x, ...){ - setDT(as.data.frame(x, ...))[] -} - -as.data.table.factor <- as.data.table.ordered <- -as.data.table.integer <- as.data.table.numeric <- -as.data.table.logical <- as.data.table.character <- -as.data.table.Date <- as.data.table.ITime <- function(x, keep.rownames=FALSE, ...) { - if (is.matrix(x)) { - return(as.data.table.matrix(x, ...)) - } - tt = deparse(substitute(x))[1L] - nm = names(x) - # FR #2356 - transfer names of named vector as "rn" column if required - if (!identical(keep.rownames, FALSE) & !is.null(nm)) - x <- list(nm, unname(x)) - else x <- list(x) - if (tt == make.names(tt)) { - # can specify col name to keep.rownames, #575 - nm = if (length(x) == 2L) if (is.character(keep.rownames)) keep.rownames[1L] else "rn" - setattr(x, 'names', c(nm, tt)) - } - as.data.table.list(x, FALSE) -} - -# as.data.table.table - FR #4848 -as.data.table.table <- function(x, keep.rownames=FALSE, ...) { - # Fix for bug #5408 - order of columns are different when doing as.data.table(with(DT, table(x, y))) - val = rev(dimnames(provideDimnames(x))) - if (is.null(names(val)) || !any(nzchar(names(val)))) - setattr(val, 'names', paste0("V", rev(seq_along(val)))) - ans <- data.table(do.call(CJ, c(val, sorted=FALSE)), N = as.vector(x)) - setcolorder(ans, c(rev(head(names(ans), -1L)), "N")) - ans -} - -as.data.table.matrix <- function(x, keep.rownames=FALSE, ...) { - if (!identical(keep.rownames, FALSE)) { - # can specify col name to keep.rownames, #575 - ans = data.table(rn=rownames(x), x, keep.rownames=FALSE) - if (is.character(keep.rownames)) - setnames(ans, 'rn', keep.rownames[1L]) - return(ans) - } - d <- dim(x) - nrows <- d[1L] - ncols <- d[2L] - ic <- seq_len(ncols) - - value <- vector("list", ncols) - if (mode(x) == "character") { - # fix for #745 - A long overdue SO post: http://stackoverflow.com/questions/17691050/data-table-still-converts-strings-to-factors - for (i in ic) value[[i]] <- x[, i] # for efficiency. For consistency - data.table likes and prefers "character" - } - else { - for (i in ic) value[[i]] <- as.vector(x[, i]) # to drop any row.names that would otherwise be retained inside every column of the data.table - } - col_labels <- dimnames(x)[[2L]] - if (length(col_labels) == ncols) { - if (any(empty <- !nzchar(col_labels))) - col_labels[empty] <- paste0("V", ic[empty]) - setattr(value, "names", col_labels) - } else { - setattr(value, "names", paste0("V", ic)) - } - setattr(value,"row.names",.set_row_names(nrows)) - setattr(value,"class",c("data.table","data.frame")) - alloc.col(value) -} - -# as.data.table.array - #1418 -as.data.table.array <- function(x, keep.rownames=FALSE, sorted=TRUE, value.name="value", na.rm=TRUE, ...) { - dx = dim(x) - if (length(dx) <= 2L) - stop("as.data.table.array method should be only called for arrays with 3+ dimensions, for 2 dimensions matrix method should be used") - if (!is.character(value.name) || length(value.name)!=1L || is.na(value.name) || !nzchar(value.name)) - stop("Argument 'value.name' must be scalar character, non-NA and non zero char") - if (!is.logical(sorted) || length(sorted)!=1L || is.na(sorted)) - stop("Argument 'sorted' must be scalar logical and non-NA") - if (!is.logical(na.rm) || length(na.rm)!=1L || is.na(na.rm)) - stop("Argument 'na.rm' must be scalar logical and non-NA") - - dnx = dimnames(x) - # NULL dimnames will create integer keys, not character as in table method - val = rev(if (is.null(dnx)) lapply(dim(x), seq.int) else dnx) - if (is.null(names(val)) || all(!nzchar(names(val)))) - setattr(val, 'names', paste0("V", rev(seq_along(val)))) - if (value.name %in% names(val)) - stop(sprintf("Argument 'value.name' should not overlap with column names in result: %s.", paste(rev(names(val)), collapse=", "))) - N = NULL - ans = data.table(do.call(CJ, c(val, sorted=FALSE)), N=as.vector(x)) - if (isTRUE(na.rm)) - ans = ans[!is.na(N)] - setnames(ans, "N", value.name) - dims = rev(head(names(ans), -1L)) - setcolorder(ans, c(dims, value.name)) - if (isTRUE(sorted)) - setkeyv(ans, dims) - ans[] -} - -as.data.table.list <- function(x, keep.rownames=FALSE, ...) { - if (!length(x)) return( null.data.table() ) - # fix for #833, as.data.table.list with matrix/data.frame/data.table as a list element.. - # TODO: move this entire logic (along with data.table() to C - for (i in seq_along(x)) { - dims = dim(x[[i]]) - if (!is.null(dims)) { - ans = do.call("data.table", x) - setnames(ans, make.unique(names(ans))) - return(ans) - } - } - n = vapply(x, length, 0L) - mn = max(n) - x = copy(x) - idx = which(n < mn) - if (length(idx)) { - for (i in idx) { - if (!is.null(x[[i]])) {# avoids warning when a list element is NULL - if (inherits(x[[i]], "POSIXlt")) { - warning("POSIXlt column type detected and converted to POSIXct. We do not recommend use of POSIXlt at all because it uses 40 bytes to store one date.") - x[[i]] = as.POSIXct(x[[i]]) - } - # Implementing FR #4813 - recycle with warning when nr %% nrows[i] != 0L - if (!n[i] && mn) - warning("Item ", i, " is of size 0 but maximum size is ", mn, ", therefore recycled with 'NA'") - else if (n[i] && mn %% n[i] != 0L) - warning("Item ", i, " is of size ", n[i], " but maximum size is ", mn, " (recycled leaving a remainder of ", mn%%n[i], " items)") - x[[i]] = rep(x[[i]], length.out=mn) - } - } - } - # fix for #842 - if (mn > 0L) { - nz = which(n > 0L) - xx = point(vector("list", length(nz)), seq_along(nz), x, nz) - if (!is.null(names(x))) - setattr(xx, 'names', names(x)[nz]) - x = xx - } - if (is.null(names(x))) setattr(x,"names",paste0("V",seq_len(length(x)))) - setattr(x,"row.names",.set_row_names(max(n))) - setattr(x,"class",c("data.table","data.frame")) - alloc.col(x) -} - -# don't retain classes before "data.frame" while converting -# from it.. like base R does. This'll break test #527 (see -# tests and as.data.table.data.frame) I've commented #527 -# for now. This addresses #1078 and #1128 -.resetclass <- function(x, class) { - cx = class(x) - n = chmatch(class, cx) - cx = unique( c("data.table", "data.frame", tail(cx, length(cx)-n)) ) -} - -as.data.table.data.frame <- function(x, keep.rownames=FALSE, ...) { - if (!identical(keep.rownames, FALSE)) { - # can specify col name to keep.rownames, #575 - ans = data.table(rn=rownames(x), x, keep.rownames=FALSE) - if (is.character(keep.rownames)) - setnames(ans, 'rn', keep.rownames[1L]) - return(ans) - } - ans = copy(x) # TO DO: change this deep copy to be shallow. - setattr(ans,"row.names",.set_row_names(nrow(x))) - - ## NOTE: This test (#527) is no longer in effect ## - # for nlme::groupedData which has class c("nfnGroupedData","nfGroupedData","groupedData","data.frame") - # See test 527. - ## - - # fix for #1078 and #1128, see .resetclass() for explanation. - setattr(ans, "class", .resetclass(x, "data.frame")) - alloc.col(ans) -} - -as.data.table.data.table <- function(x, ...) { - # as.data.table always returns a copy, automatically takes care of #473 - x = copy(x) # #1681 - # fix for #1078 and #1128, see .resetclass() for explanation. - setattr(x, 'class', .resetclass(x, "data.table")) - return(x) -} diff --git a/R/between.R b/R/between.R deleted file mode 100644 index 20de0d0638..0000000000 --- a/R/between.R +++ /dev/null @@ -1,40 +0,0 @@ -# is x[i] in between lower[i] and upper[i] ? -between <- function(x,lower,upper,incbounds=TRUE) { - is_strictly_numeric <- function(x) is.numeric(x) && !"integer64" %in% class(x) - if (is_strictly_numeric(x) && is_strictly_numeric(lower) && - is_strictly_numeric(upper) && length(lower) == 1L && length(upper) == 1L) { - # faster parallelised version for int/double for most common scenario - .Call(Cbetween, x, lower, upper, incbounds) - } else { - if(incbounds) x>=lower & x<=upper - else x>lower & x=,<= and >,< - verbose = getOption("datatable.verbose") - if (verbose) {last.started.at=proc.time();cat("forderv(query) took ... ");flush.console()} - xo = forderv(query) - if (verbose) {cat(timetaken(last.started.at),"\n"); flush.console()} - ans = bmerge(shallow(subject), query, 1L:2L, c(1L,1L), FALSE, xo, - 0, c(FALSE, TRUE), 0L, "all", ops, integer(0L), - 1L, verbose) # fix for #1819, turn on verbose messages - options(datatable.verbose=FALSE) - setDT(ans[c("starts", "lens")], key=c("starts", "lens")) - options(datatable.verbose=verbose) - if (verbose) {last.started.at=proc.time();cat("Generating final logical vector ... ");flush.console()} - .Call(Cinrange, idx <- vector("logical", length(x)), xo, ans[["starts"]], ans[["lens"]]) - if (verbose) {cat("done in",timetaken(last.started.at),"\n"); flush.console} - idx -} - -"%inrange%" <- function(x,y) inrange(x,y[[1L]],y[[2L]],incbounds=TRUE) diff --git a/R/bmerge.R b/R/bmerge.R deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/R/c.factor.R b/R/c.factor.R deleted file mode 100644 index 65a25736d3..0000000000 --- a/R/c.factor.R +++ /dev/null @@ -1,40 +0,0 @@ -# nocov start -# don't include functions not used for coverage - -# c.factor was intended to be deprecated but we need it for rbind. No longer used by 'by'. -# In dogroups, we now drop factor levels in .SD, work with integers, and add levels back afterwards. - -c.factor <- function(...) -{ - args <- list(...) - for (i in seq_along(args)) if (!is.factor(args[[i]])) args[[i]] = as.factor(args[[i]]) - # The first must be factor otherwise we wouldn't be inside c.factor, its checked anyway in the line above. - newlevels = unique(unlist(lapply(args,levels),recursive=TRUE,use.names=TRUE)) - if (length(o <- forderv(newlevels))) - newlevels <- newlevels[o] - nm <- names(unlist(args,recursive=TRUE,use.names=TRUE)) - ans = unlist(lapply(args, function(x) { # Its faster this way when there are many references to the same level, which is normally the case - m = match(levels(x), newlevels) - m[as.integer(x)] - })) - structure(ans, levels = newlevels, names = nm, class = "factor") -} - -#"[.factor" <- function(x, ...) -#{ -# # change default action of factors to drop unused levels. This saves memory space and copying. It also makes tapply() work as you expect since the levels contain the unique values only, otherwise you get many NAs for the unused factor levels. -# # The base::"[.factor" first creates the integer subset, with a pointer to the original levels, then 'if(drop)' calls factor() to then remove the unused levels. -# # Here we force drop=TRUE for efficiency always (not changeable), and do the operation more efficiently. -# # If you really want R's default [.factor, then call the base version directly using base::"[.factor"() -# # This [.factor is within the data.table NAMESPACE so users should not see it, other than e.g. subsetting factor columns -# # R's default [.factor assings constrasts also. Not considered here. -# y <- NextMethod("[") -# u = unique(y) -# su = u[fastorder(list(u), na.last = NA)] -# attr(y, "levels") = attr(x, "levels")[su] # relying on the original factor levels being sorted -# y[] = chmatch(y, su) -# class(y) = oldClass(x) -# y -#} - -# nocov end diff --git a/R/cedta.R b/R/cedta.R deleted file mode 100644 index 6b0bd5ace9..0000000000 --- a/R/cedta.R +++ /dev/null @@ -1,46 +0,0 @@ - -cedta.override = NULL # If no need arises, will deprecate. - -cedta.pkgEvalsUserCode = c("gWidgetsWWW","statET","FastRWeb","slidify","rmarkdown","knitr","ezknitr","IRkernel") -# These packages run user code in their own environment and thus do not -# themselves Depend or Import data.table. knitr's eval is passed envir=globalenv() so doesn't -# need to be listed here currently, but we include it in case it decides to change that. -# The others create their own environment to eval in. -# The packages might use data.frame syntax elsewhere in their package code so we just want -# the eval (only) of user code to be data.table-aware. - -# If a new package needs to be added to this vector, a user may add to it using : -# assignInNamespace("cedta.pkgEvalsUserCode", c(data.table:::cedta.pkgEvalsUserCode,""), "data.table") -# But please let us know so we can add the package to this vector in the package upstream, so other -# users don't have to tread the same path. Then you can remove your assignInNamepace() call. - -# Packages may also set a variable in their namespace : -# .datatable.aware = TRUE -# which makes them data.table-aware optionally and possibly variably. -# http://stackoverflow.com/a/13131555/403310 - -cedta <- function(n=2L) { - # Calling Environment Data Table Aware - te = topenv(parent.frame(n)) - if (!isNamespace(te)) { - # e.g. DT queries at the prompt (.GlobalEnv) and knitr's eval(,envir=globalenv()) but not DF[...] inside knitr::kable v1.6 - return(TRUE) - } - nsname = getNamespaceName(te) - ans = nsname == "data.table" || - "data.table" %chin% names(getNamespaceImports(te)) || - "data.table" %chin% tryCatch(get(".Depends",paste("package",nsname,sep=":"),inherits=FALSE),error=function(e)NULL) || - (nsname == "utils" && exists("debugger.look",parent.frame(n+1L))) || - (nsname == "base" && all(c("FUN", "X") %in% ls(parent.frame(n))) ) || # lapply - (nsname %chin% cedta.pkgEvalsUserCode && any(sapply(sys.calls(), function(x) is.name(x[[1L]]) && (x[[1L]]=="eval" || x[[1L]]=="evalq")))) || - nsname %chin% cedta.override || - identical(TRUE, tryCatch(get(".datatable.aware",asNamespace(nsname),inherits=FALSE),error=function(e)NULL)) - if (!ans && getOption("datatable.verbose")) { - cat("cedta decided '",nsname,"' wasn't data.table aware. Call stack with [[1L]] applied:\n",sep="") - print(sapply(sys.calls(), "[[", 1L)) - # so we can trace the namespace name that may need to be added (very unusually) - } - ans -} - - diff --git a/R/data.table.R b/R/data.table.R deleted file mode 100644 index d3c8cc07f4..0000000000 --- a/R/data.table.R +++ /dev/null @@ -1,3013 +0,0 @@ - -dim.data.table <- function(x) -{ - .Call(Cdim, x) -} - -.global <- new.env() # thanks to: http://stackoverflow.com/a/12605694/403310 -setPackageName("data.table",.global) -.global$print = "" - -.SD = .N = .I = .GRP = .BY = .EACHI = NULL -# These are exported to prevent NOTEs from R CMD check, and checkUsage via compiler. -# But also exporting them makes it clear (to users and other packages) that data.table uses these as symbols. -# And NULL makes it clear (to the R's mask check on loading) that they're variables not functions. -# utils::globalVariables(c(".SD",".N")) was tried as well, but exporting seems better. -# So even though .BY doesn't appear in this file, it should still be NULL here and exported because it's -# defined in SDenv and can be used by users. - -is.data.table <- function(x) inherits(x, "data.table") -is.ff <- function(x) inherits(x, "ff") # define this in data.table so that we don't have to require(ff), but if user is using ff we'd like it to work - -#NCOL <- function(x) { -# # copied from base, but additionally covers data.table via is.list() -# # because NCOL in base explicitly tests using is.data.frame() -# if (is.list(x) && !is.ff(x)) return(length(x)) -# if (is.array(x) && length(dim(x)) > 1L) ncol(x) else as.integer(1L) -#} -#NROW <- function(x) { -# if (is.data.frame(x) || is.data.table(x)) return(nrow(x)) -# if (is.list(x) && !is.ff(x)) stop("List is not a data.frame or data.table. Convert first before using NROW") # list may have different length elements, which data.table and data.frame's resolve. -# if (is.array(x)) nrow(x) else length(x) -#} - -null.data.table <-function() { - ans = list() - setattr(ans,"class",c("data.table","data.frame")) - setattr(ans,"row.names",.set_row_names(0L)) - alloc.col(ans) -} - -data.table <-function(..., keep.rownames=FALSE, check.names=FALSE, key=NULL, stringsAsFactors=FALSE) -{ - # NOTE: It may be faster in some circumstances to create a data.table by creating a list l first, and then setattr(l,"class",c("data.table","data.frame")) at the expense of checking. - # TO DO: rewrite data.table(), one of the oldest functions here. Many people use data.table() to convert data.frame rather than - # as.data.table which is faster; speed could be better. Revisit how many copies are taken in for example data.table(DT1,DT2) which - # cbind directs to. And the nested loops for recycling lend themselves to being C level. - - x <- list(...) # doesn't copy named inputs as from R >= 3.1.0 (a very welcome change) - .Call(CcopyNamedInList,x) # to maintain pre-Rv3.1.0 behaviour, for now. See test 548.2. TODO: revist - # TODO Something strange with NAMED on components of `...` to investigate. Or, just port data.table() to C. - - # fix for #5377 - data.table(null list, data.frame and data.table) should return null data.table. Simple fix: check all scenarios here at the top. - if (identical(x, list(NULL)) || identical(x, list(list())) || - identical(x, list(data.frame(NULL))) || identical(x, list(data.table(NULL)))) return( null.data.table() ) - tt <- as.list(substitute(list(...)))[-1L] # Intention here is that data.table(X,Y) will automatically put X and Y as the column names. For longer expressions, name the arguments to data.table(). But in a call to [.data.table, wrap in list() e.g. DT[,list(a=mean(v),b=foobarzoo(zang))] will get the col names - vnames = names(tt) - if (is.null(vnames)) vnames = rep.int("",length(x)) - vnames[is.na(vnames)] = "" - novname = vnames=="" - if (any(!novname)) { - if (any(vnames[!novname] == ".SD")) stop("A column may not be called .SD. That has special meaning.") - } - for (i in which(novname)) { - # if (ncol(as.data.table(x[[i]])) <= 1) { # cbind call in test 230 fails if I write ncol(as.data.table(eval(tt[[i]], parent.frame()))) <= 1, no idea why... (keep this for later even though all tests pass with ncol(.).. because base uses as.data.frame(.)) - if (is.null(ncol(x[[i]]))) { - if ((tmp <- deparse(tt[[i]])[1L]) == make.names(tmp)) - vnames[i] <- tmp - } - } - tt = vnames=="" - if (any(tt)) vnames[tt] = paste0("V", which(tt)) - # so now finally we have good column names. We also will use novname later to know which were explicitly supplied in the call. - n <- length(x) - if (n < 1L) - return( null.data.table() ) - if (length(vnames) != n) stop("logical error in vnames") - vnames <- as.list.default(vnames) - nrows = integer(n) # vector of lengths of each column. may not be equal if silent repetition is required. - numcols = integer(n) # the ncols of each of the inputs (e.g. if inputs contain matrix or data.table) - for (i in seq_len(n)) { - xi = x[[i]] - if (is.null(xi)) stop("column or argument ",i," is NULL") - if ("POSIXlt" %chin% class(xi)) { - warning("POSIXlt column type detected and converted to POSIXct. We do not recommend use of POSIXlt at all because it uses 40 bytes to store one date.") - x[[i]] = as.POSIXct(xi) - } else if (is.matrix(xi) || is.data.frame(xi)) { # including data.table (a data.frame, too) - xi = as.data.table(xi, keep.rownames=keep.rownames) # TO DO: allow a matrix to be a column of a data.table. This could allow a key'd lookup to a matrix, not just by a single rowname vector, but by a combination of several columns. A matrix column could be stored either by row or by column contiguous in memory. - x[[i]] = xi - numcols[i] = length(xi) - } else if (is.table(xi)) { - x[[i]] = xi = as.data.table.table(xi, keep.rownames=keep.rownames) - numcols[i] = length(xi) - } else if (is.function(xi)) { - x[[i]] = xi = list(xi) - } - nrows[i] <- NROW(xi) # for a vector (including list() columns) returns the length - if (numcols[i]>0L) { - namesi <- names(xi) # works for both data.frame's, matrices and data.tables's - if (length(namesi)==0L) namesi = rep.int("",ncol(xi)) - namesi[is.na(namesi)] = "" - tt = namesi=="" - if (any(tt)) namesi[tt] = paste0("V", which(tt)) - if (novname[i]) vnames[[i]] = namesi - else vnames[[i]] = paste(vnames[[i]], namesi, sep=".") - } - } - nr <- max(nrows) - ckey = NULL - recycledkey = FALSE - for (i in seq_len(n)) { - xi = x[[i]] - if (is.data.table(xi) && haskey(xi)) { - if (nrows[i]0L)) { - value = vector("list",sum(pmax(numcols,1L))) - k = 1L - for(i in seq_len(n)) { - if (is.list(x[[i]]) && !is.ff(x[[i]])) { - for(j in seq_len(length(x[[i]]))) { - value[[k]] = x[[i]][[j]] - k=k+1L - } - } else { - value[[k]] = x[[i]] - k=k+1L - } - } - } else { - value = x - } - vnames <- unlist(vnames) - if (check.names) # default FALSE - vnames <- make.names(vnames, unique = TRUE) - setattr(value,"names",vnames) - setattr(value,"row.names",.set_row_names(nr)) - setattr(value,"class",c("data.table","data.frame")) - if (!is.null(key)) { - if (!is.character(key)) stop("key argument of data.table() must be character") - if (length(key)==1L) { - key = strsplit(key,split=",")[[1L]] - # eg key="A,B"; a syntax only useful in key argument to data.table(), really. - } - setkeyv(value,key) - } else { - # retain key of cbind(DT1, DT2, DT3) where DT2 is keyed but not DT1. cbind calls data.table(). - # If DT inputs with keys have been recycled then can't retain key - if (length(ckey) - && !recycledkey - && !any(duplicated(ckey)) - && all(ckey %in% names(value)) - && !any(duplicated(names(value)[names(value) %in% ckey]))) - setattr(value, "sorted", ckey) - } - # FR #643, setfactor is an internal function in fread.R - if (isTRUE(stringsAsFactors)) setfactor(value, which(vapply(value, is.character, TRUE)), FALSE) - alloc.col(value) # returns a NAMED==0 object, unlike data.frame() -} - -replace_dot_alias <- function(e) { - # we don't just simply alias .=list because i) list is a primitive (faster to iterate) and ii) we test for use - # of "list" in several places so it saves having to remember to write "." || "list" in those places - if (is.call(e)) { - # . alias also used within bquote, #1912 - if (e[[1L]] == 'bquote') return(e) - if (e[[1L]] == ".") e[[1L]] = quote(list) - for (i in seq_along(e)[-1L]) if (!is.null(e[[i]])) e[[i]] = replace_dot_alias(e[[i]]) - } - e -} - -.massagei <- function(x) { - # J alias for list as well in i, just if the first symbol - if (is.call(x) && as.character(x[[1L]]) %chin% c("J",".")) - x[[1L]] = quote(list) - x -} - -# A (relatively) fast (uses DT grouping) wrapper for matching two vectors, BUT: -# it behaves like 'pmatch' but only the 'exact' matching part. That is, a value in -# 'x' is matched to 'table' only once. No index will be present more than once. -# This should make it even clearer: -# chmatch2(c("a", "a"), c("a", "a")) # 1,2 - the second 'a' in 'x' has a 2nd match in 'table' -# chmatch2(c("a", "a"), c("a", "b")) # 1,NA - the second one doesn't 'see' the first 'a' -# chmatch2(c("a", "a"), c("a", "a.1")) # 1,NA - this is where it differs from pmatch - we don't need the partial match. -chmatch2 <- function(x, table, nomatch=NA_integer_) { - .Call(Cchmatch2, x, table, as.integer(nomatch)) # this is in 'rbindlist.c' for now. -} - -"[.data.table" <- function (x, i, j, by, keyby, with=TRUE, nomatch=getOption("datatable.nomatch"), mult="all", roll=FALSE, rollends=if (roll=="nearest") c(TRUE,TRUE) else if (roll>=0) c(FALSE,TRUE) else c(TRUE,FALSE), which=FALSE, .SDcols, verbose=getOption("datatable.verbose"), allow.cartesian=getOption("datatable.allow.cartesian"), drop=NULL, on=NULL) -{ - # ..selfcount <<- ..selfcount+1 # in dev, we check no self calls, each of which doubles overhead, or could - # test explicitly if the caller is [.data.table (even stronger test. TO DO.) - # the drop=NULL is to sink drop argument when dispatching to [.data.frame; using '...' stops test 147 - if (!cedta()) { - # Fix for #5070 (to do) - Nargs = nargs() - (!missing(drop)) - ans = if (Nargs<3L) `[.data.frame`(x,i) # drop ignored anyway by DF[i] - else if (missing(drop)) `[.data.frame`(x,i,j) - else `[.data.frame`(x,i,j,drop) - # added is.data.table(ans) check to fix bug #5069 - if (!missing(i) & is.data.table(ans)) setkey(ans,NULL) # See test 304 - return(ans) - } - if (!mult %chin% c("first","last","all")) stop("mult argument can only be 'first','last' or 'all'") - missingroll = missing(roll) - missingwith = missing(with) - if (length(roll)!=1L || is.na(roll)) stop("roll must be a single TRUE, FALSE, positive/negative integer/double including +Inf and -Inf or 'nearest'") - if (is.character(roll)) { - if (roll!="nearest") stop("roll is '",roll,"' (type character). Only valid character value is 'nearest'.") - } else { - roll = if (isTRUE(roll)) +Inf else as.double(roll) - } - force(rollends) - if (!is.logical(rollends)) stop("rollends must be a logical vector") - if (length(rollends)>2L) stop("rollends must be length 1 or 2") - if (length(rollends)==1L) rollends=rep.int(rollends,2L) - # TO DO (document/faq/example). Removed for now ... if ((roll || rolltolast) && missing(mult)) mult="last" # for when there is exact match to mult. This does not control cases where the roll is mult, that is always the last one. - missingnomatch = missing(nomatch) - if (!is.na(nomatch) && nomatch!=0L) stop("nomatch must either be NA or 0, or (ideally) NA_integer_ or 0L") - nomatch = as.integer(nomatch) - if (!is.logical(which) || length(which)>1L) stop("'which' must be a logical vector length 1. Either FALSE, TRUE or NA.") - if ((isTRUE(which)||is.na(which)) && !missing(j)) stop("'which' is ",which," (meaning return row numbers) but 'j' is also supplied. Either you need row numbers or the result of j, but only one type of result can be returned.") - if (!is.na(nomatch) && is.na(which)) stop("which=NA with nomatch=0 would always return an empty vector. Please change or remove either which or nomatch.") - .global$print="" - if (missing(i) && missing(j)) { - # ...[] == oops at console, forgot print(...) - # or some kind of dynamic construction that has edge case of no contents inside [...] - return(x) - } - if (!missing(keyby)) { - if (!missing(by)) stop("Provide either 'by' or 'keyby' but not both") - by=bysub=substitute(keyby) - # Assign to 'by' so that by is no longer missing and we can proceed as if there were one by - } else { - bysub = if (missing(by)) NULL # and leave missing(by)==TRUE - else substitute(by) - } - byjoin = FALSE - if (!missing(by)) { - if (missing(j)) stop("'by' or 'keyby' is supplied but not j") - byjoin = is.symbol(bysub) && bysub==".EACHI" - } - irows = NULL # Meaning all rows. We avoid creating 1:nrow(x) for efficiency. - notjoin = FALSE - rightcols = leftcols = integer() - optimizedSubset = FALSE ## flag: tells, whether a normal query was optimized into a join. - if (!with && missing(j)) stop("j must be provided when with=FALSE") - ..syms = NULL - av = NULL - jsub = NULL - if (!missing(j)) { - jsub = replace_dot_alias(substitute(j)) - root = if (is.call(jsub)) as.character(jsub[[1L]])[1L] else "" - if (root == ":" || - (root %chin% c("-","!") && is.call(jsub[[2L]]) && jsub[[2L]][[1L]]=="(" && is.call(jsub[[2L]][[2L]]) && jsub[[2L]][[2L]][[1L]]==":") || - ( (!length(av<-all.vars(jsub)) || all(substring(av,1L,2L)=="..")) && - root %chin% c("","c","paste","paste0","-","!") && - missing(by) )) { # test 763. TODO: likely that !missing(by) iff with==TRUE (so, with can be removed) - # When no variable names (i.e. symbols) occur in j, scope doesn't matter because there are no symbols to find. - # If variable names do occur, but they are all prefixed with .., then that means look up in calling scope. - # Automatically set with=FALSE in this case so that DT[,1], DT[,2:3], DT[,"someCol"] and DT[,c("colB","colD")] - # work as expected. As before, a vector will never be returned, but a single column data.table - # for type consistency with >1 cases. To return a single vector use DT[["someCol"]] or DT[[3]]. - # The root==":" is to allow DT[,colC:colH] even though that contains two variable names. - # root == "-" or "!" is for tests 1504.11 and 1504.13 (a : with a ! or - modifier root) - # We don't want to evaluate j at all in making this decision because i) evaluating could itself - # increment some variable and not intended to be evaluated a 2nd time later on and ii) we don't - # want decisions like this to depend on the data or vector lengths since that can introduce - # inconistency reminiscent of drop=TRUE in [.data.frame that we seek to avoid. - with=FALSE - if (length(av)) { - for (..name in av) { - name = substring(..name, 3L) - if (name=="") stop("The symbol .. is invalid. The .. prefix must be followed by at least one character.") - if (!exists(name, where=parent.frame())) { - stop("Variable '",name,"' is not found in calling scope. Looking in calling scope because you used the .. prefix.", - if (exists(..name, where=parent.frame())) - paste0(" Variable '..",name,"' does exist in calling scope though, so please just removed the .. prefix from that variable name in calling scope.") - # We have recommended 'manual' .. prefix in the past, so try to be helpful - else - "" - ) - } else if (exists(..name, where=parent.frame())) { - warning("Both '",name,"' and '..", name, "' exist in calling scope. Please remove the '..", name,"' variable in calling scope for clarity.") - } - } - ..syms = av - } - } else if (is.name(jsub)) { - if (substring(jsub, 1L, 2L) == "..") stop("Internal error: DT[, ..var] should be dealt with by the branch above now.") - if (!with && !exists(as.character(jsub), where=parent.frame())) - stop("Variable '",jsub,"' is not found in calling scope. Looking in calling scope because you set with=FALSE. Also, please use .. symbol prefix and remove with=FALSE.") - } - if (root=="{") { - if (length(jsub) == 2L) { - jsub = jsub[[2L]] # to allow {} wrapping of := e.g. [,{`:=`(...)},] [#376] - root = if (is.call(jsub)) as.character(jsub[[1L]])[1L] else "" - } else if (length(jsub) > 2L && is.call(jsub[[2L]]) && jsub[[2L]][[1L]] == ":=") { - #2142 -- j can be {} and have length 1 - stop("You have wrapped := with {} which is ok but then := must be the only thing inside {}. You have something else inside {} as well. Consider placing the {} on the RHS of := instead; e.g. DT[,someCol:={tmpVar1<-...;tmpVar2<-...;tmpVar1*tmpVar2}") - } - } - if (root=="eval" && !any(all.vars(jsub[[2L]]) %chin% names(x))) { - # TODO: this && !any depends on data. Can we remove it? - # Grab the dynamic expression from calling scope now to give the optimizer a chance to optimize it - # Only when top level is eval call. Not nested like x:=eval(...) or `:=`(x=eval(...), y=eval(...)) - jsub = eval(jsub[[2L]], parent.frame(), parent.frame()) # this evals the symbol to return the dynamic expression - if (is.expression(jsub)) jsub = jsub[[1L]] # if expression, convert it to call - # Note that the dynamic expression could now be := (new in v1.9.7) - root = if (is.call(jsub)) as.character(jsub[[1L]])[1L] else "" - } - if (root == ":=") { - allow.cartesian=TRUE # (see #800) - if (!missing(i) && !missing(keyby)) - stop(":= with keyby is only possible when i is not supplied since you can't setkey on a subset of rows. Either change keyby to by or remove i") - if (!missingnomatch) { - warning("nomatch isn't relevant together with :=, ignoring nomatch") - nomatch=0L - } - } - } - - # To take care of duplicate column names properly (see chmatch2 function above `[data.table`) for description - dupmatch <- function(x, y, ...) { - if (anyDuplicated(x)) - pmax(chmatch(x,y, ...), chmatch2(x,y,0L)) - else chmatch(x,y) - } - - # setdiff removes duplicate entries, which'll create issues with duplicated names. Use '%chin% instead. - dupdiff <- function(x, y) x[!x %chin% y] - - if (!missing(i)) { - xo = NULL - isub = substitute(i) - if (identical(isub, NA)) { - # only possibility *isub* can be NA (logical) is the symbol NA itself; i.e. DT[NA] - # replace NA in this case with NA_integer_ as that's almost surely what user intended to - # return a single row with NA in all columns. (DT[0] returns an empty table, with correct types.) - # Any expression (including length 1 vectors) that evaluates to a single NA logical will - # however be left as NA logical since that's important for consistency to return empty in that - # case; e.g. DT[Col==3] where DT is 1 row and Col contains NA. - # Replacing the NA symbol makes DT[NA] and DT[c(1,NA)] consistent and provides - # an easy way to achieve a single row of NA as users expect rather than requiring them - # to know and change to DT[NA_integer_]. - isub=NA_integer_ - } - isnull_inames = FALSE - nqgrp = integer(0L) # for non-equi join - nqmaxgrp = 1L # for non-equi join - # Fixes 4994: a case where quoted expression with a "!", ex: expr = quote(!dt1); dt[eval(expr)] requires - # the "eval" to be checked before `as.name("!")`. Therefore interchanged. - restore.N = remove.N = FALSE - if (exists(".N", envir=parent.frame(), inherits=FALSE)) { - old.N = get(".N", envir=parent.frame(), inherits=FALSE) - locked.N = bindingIsLocked(".N", parent.frame()) - if (locked.N) eval(call("unlockBinding", ".N", parent.frame())) # eval call to pass R CMD check NOTE until we find cleaner way - assign(".N", nrow(x), envir=parent.frame(), inherits=FALSE) - restore.N = TRUE - # the comment below is invalid hereafter (due to fix for #1145) - # binding locked when .SD[.N] but that's ok as that's the .N we want anyway - - # TO DO: change isub at C level s/.N/nrow(x); changing a symbol to a constant should be ok - } else { - assign(".N", nrow(x), envir=parent.frame(), inherits=FALSE) - remove.N = TRUE - } - if (is.call(isub) && isub[[1L]]=="eval") { # TO DO: or ..() - isub = eval(.massagei(isub[[2L]]), parent.frame(), parent.frame()) - if (is.expression(isub)) isub=isub[[1L]] - } - if (is.call(isub) && isub[[1L]] == as.name("!")) { - notjoin = TRUE - if (!missingnomatch) stop("not-join '!' prefix is present on i but nomatch is provided. Please remove nomatch."); - nomatch = 0L - isub = isub[[2L]] - # #932 related so that !(v1 == 1) becomes v1 == 1 instead of (v1 == 1) after removing "!" - if (is.call(isub) && isub[[1L]] == "(" && !is.name(isub[[2L]])) - isub = isub[[2L]] - } - if (is.call(isub) && isub[[1L]] == as.name("order") && getOption("datatable.optimize") >= 1) { # optimize here so that we can switch it off if needed - if (verbose) cat("order optimisation is on, i changed from 'order(...)' to 'forder(DT, ...)'.\n") - isub = as.list(isub) - isub = as.call(c(list(quote(forder), quote(x)), isub[-1L])) - } - if (is.null(isub)) return( null.data.table() ) - if (is.call(isub) && isub[[1L]] == quote(forder)) { - order_env = new.env(parent=parent.frame()) # until 'forder' is exported - assign("forder", forder, order_env) - assign("x", x, order_env) - i = eval(isub, order_env, parent.frame()) # for optimisation of 'order' to 'forder' - # that forder returns empty integer() is taken care of internally within forder - } else if (length(o <- .prepareFastSubset(isub = isub, x = x, - enclos = parent.frame(), - notjoin = notjoin, verbose = verbose))){ - ## redirect to the is.data.table(x) == TRUE branch. - ## Additional flag to adapt things after bmerge: - optimizedSubset <- TRUE - notjoin <- o$notjoin - i <- o$i - on <- o$on - ## the following two are ignored if i is not a data.table. - ## Since we are converting i to data.table, it is important to set them properly. - nomatch <- 0L - mult <- "all" - } - else if (!is.name(isub)) i = eval(.massagei(isub), x, parent.frame()) - else { - # isub is a single symbol name such as B in DT[B] - i = try(eval(isub, parent.frame(), parent.frame()), silent=TRUE) - if (inherits(i,"try-error")) { - # must be "not found" since isub is a mere symbol - col = try(eval(isub, x), silent=TRUE) # is it a column name? - if (identical(typeof(col),"logical")) - stop(as.character(isub)," is not found in calling scope but it is a column of type logical. If you wish to select rows where that column is TRUE, either wrap the symbol with '()' or use ==TRUE to be clearest to readers of your code.") - else - stop(as.character(isub)," is not found in calling scope and it is not a column of type logical. When the first argument inside DT[...] is a single symbol, data.table looks for it in calling scope.") - } - } - if (restore.N) { - assign(".N", old.N, envir=parent.frame()) - if (locked.N) lockBinding(".N", parent.frame()) - } - if (remove.N) rm(list=".N", envir=parent.frame()) - if (is.matrix(i)) { - if (is.numeric(i) && ncol(i)==1L) { # #826 - subset DT on single integer vector stored as matrix - i = as.integer(i) - } else { - stop("i is invalid type (matrix). Perhaps in future a 2 column matrix could return a list of elements of DT (in the spirit of A[B] in FAQ 2.14). Please let datatable-help know if you'd like this, or add your comments to FR #657.") - } - } - if (is.logical(i)) { - if (notjoin) { - notjoin = FALSE - i = !i - } - } - if (is.null(i)) return( null.data.table() ) - if (is.character(i)) { - isnull_inames = TRUE - i = data.table(V1=i) # for user convenience; e.g. DT["foo"] without needing DT[.("foo")] - } else if (identical(class(i),"list") && length(i)==1L && is.data.frame(i[[1L]])) i = as.data.table(i[[1L]]) - else if (identical(class(i),"data.frame")) i = as.data.table(i) # TO DO: avoid these as.data.table() and use a flag instead - else if (identical(class(i),"list")) { - isnull_inames = is.null(names(i)) - i = as.data.table(i) - } - if (is.data.table(i)) { - if (!haskey(x) && missing(on) && is.null(xo)) { - stop("When i is a data.table (or character vector), the columns to join by must be specified either using 'on=' argument (see ?data.table) or by keying x (i.e. sorted, and, marked as sorted, see ?setkey). Keyed joins might have further speed benefits on very large data due to x being sorted in RAM.") - } - if (!missing(on)) { - # on = .() is now possible, #1257 - parse_on <- function(onsub) { - ops = c("==", "<=", "<", ">=", ">", "!=") - pat = paste0("(", ops, ")", collapse="|") - if (is.call(onsub) && onsub[[1L]] == "eval") { - onsub = eval(onsub[[2L]], parent.frame(2L), parent.frame(2L)) - if (is.call(onsub) && onsub[[1L]] == "eval") onsub = onsub[[2L]] - } - if (is.call(onsub) && as.character(onsub[[1L]]) %in% c("list", ".")) { - spat = paste0("[ ]+(", pat, ")[ ]+") - onsub = lapply(as.list(onsub)[-1L], function(x) gsub(spat, "\\1", deparse(x, width.cutoff=500L))) - onsub = as.call(c(quote(c), onsub)) - } - on = eval(onsub, parent.frame(2L), parent.frame(2L)) - if (!is.character(on)) - stop("'on' argument should be a named atomic vector of column names indicating which columns in 'i' should be joined with which columns in 'x'.") - this_op = regmatches(on, gregexpr(pat, on)) - idx = (vapply(this_op, length, 0L) == 0L) - this_op[idx] = "==" - this_op = unlist(this_op, use.names=FALSE) - idx_op = match(this_op, ops, nomatch=0L) - if (any(idx_op %in% c(0L, 6L))) - stop("Invalid operators ", paste(this_op[idx_op==0L], collapse=","), ". Only allowed operators are ", paste(ops[1:5], collapse=""), ".") - if (is.null(names(on))) { - on[idx] = if (isnull_inames) paste(on[idx], paste0("V", seq_len(sum(idx))), sep="==") else paste(on[idx], on[idx], sep="==") - } else { - on[idx] = paste(names(on)[idx], on[idx], sep="==") - } - split = tstrsplit(on, paste0("[ ]*", pat, "[ ]*")) - on = setattr(split[[2L]], 'names', split[[1L]]) - if (length(empty_idx <- which(names(on) == ""))) - names(on)[empty_idx] = on[empty_idx] - list(on = on, ops = idx_op) - } - on_ops = parse_on(substitute(on)) - on = on_ops[[1L]] - ops = on_ops[[2L]] - # TODO: collect all '==' ops first to speeden up Cnestedid - rightcols = chmatch(names(on), names(x)) - if (length(nacols <- which(is.na(rightcols)))) - stop("Column(s) [", paste(names(on)[nacols], collapse=","), "] not found in x") - leftcols = chmatch(unname(on), names(i)) - if (length(nacols <- which(is.na(leftcols)))) - stop("Column(s) [", paste(unname(on)[nacols], collapse=","), "] not found in i") - # figure out the columns on which to compute groups on - non_equi = which.first(ops != 1L) # 1 is "==" operator - if (!is.na(non_equi)) { - # non-equi operators present.. investigate groups.. - if (verbose) cat("Non-equi join operators detected ... \n") - if (!missingroll) stop("roll is not implemented for non-equi joins yet.") - if (verbose) {last.started.at=proc.time();cat(" forder took ... ");flush.console()} - # TODO: could check/reuse secondary indices, but we need 'starts' attribute as well! - xo = forderv(x, rightcols, retGrp=TRUE) - if (verbose) {cat(timetaken(last.started.at),"\n"); flush.console()} - xg = attr(xo, 'starts') - resetcols = head(rightcols, non_equi-1L) - if (length(resetcols)) { - # TODO: can we get around having to reorder twice here? - # or at least reuse previous order? - if (verbose) {last.started.at=proc.time();cat(" Generating group lengths ... ");flush.console()} - resetlen = attr(forderv(x, resetcols, retGrp=TRUE), 'starts') - resetlen = .Call(Cuniqlengths, resetlen, nrow(x)) - if (verbose) {cat("done in",timetaken(last.started.at),"\n"); flush.console()} - } else resetlen = integer(0L) - if (verbose) {last.started.at=proc.time();cat(" Generating non-equi group ids ... ");flush.console()} - nqgrp = .Call(Cnestedid, x, rightcols[non_equi:length(rightcols)], xo, xg, resetlen, mult) - if (verbose) {cat("done in",timetaken(last.started.at),"\n"); flush.console()} - if (length(nqgrp)) nqmaxgrp = max(nqgrp) # fix for #1986, when 'x' is 0-row table max(.) returns -Inf. - if (nqmaxgrp > 1L) { # got some non-equi join work to do - if ("_nqgrp_" %in% names(x)) stop("Column name '_nqgrp_' is reserved for non-equi joins.") - if (verbose) {last.started.at=proc.time();cat(" Recomputing forder with non-equi ids ... ");flush.console()} - set(nqx<-shallow(x), j="_nqgrp_", value=nqgrp) - xo = forderv(nqx, c(ncol(nqx), rightcols)) - if (verbose) {cat("done in",timetaken(last.started.at),"\n"); flush.console()} - } else nqgrp = integer(0L) - if (verbose) cat(" Found", nqmaxgrp, "non-equi group(s) ...\n") - } - if (is.na(non_equi)) { - # equi join. use existing key (#1825) or existing secondary index (#1439) - if ( identical(head(key(x), length(on)), names(on)) ) { - xo = integer(0L) - if (verbose) cat("on= matches existing key, using key\n") - } else { - if (isTRUE(getOption("datatable.use.index"))) { - idxName = paste0("__", names(on), collapse="") - xo = attr(attr(x, 'index'), idxName, exact = TRUE) - if (verbose && !is.null(xo)) cat("on= matches existing index, using index\n") - } - if (is.null(xo)) { - if (verbose) {last.started.at=proc.time(); flush.console()} - xo = forderv(x, by = rightcols) - if (verbose) {cat("Calculated ad hoc index in",timetaken(last.started.at),"\n"); flush.console()} - # TODO: use setindex() instead, so it's cached for future reuse - } - } - } - } else if (is.null(xo)) { - rightcols = chmatch(key(x),names(x)) # NAs here (i.e. invalid data.table) checked in bmerge() - leftcols = if (haskey(i)) - chmatch(head(key(i),length(rightcols)),names(i)) - else - seq_len(min(length(i),length(rightcols))) - rightcols = head(rightcols,length(leftcols)) - xo = integer() ## signifies 1:.N - ops = rep(1L, length(leftcols)) - } - # Implementation for not-join along with by=.EACHI, #604 - if (notjoin && (byjoin || mult != "all")) { # mult != "all" needed for #1571 fix - notjoin = FALSE - if (verbose) {last.started.at=proc.time();cat("not-join called with 'by=.EACHI'; Replacing !i with i=setdiff(x,i) ...");flush.console()} - orignames = copy(names(i)) - i = setdiff_(x, i, rightcols, leftcols) # part of #547 - if (verbose) {cat("done in",timetaken(last.started.at),"\n"); flush.console()} - setnames(i, orignames[leftcols]) - setattr(i, 'sorted', names(i)) # since 'x' has key set, this'll always be sorted - } - io = if (missing(on)) haskey(i) else identical(unname(on), head(key(i), length(on))) - i = .shallow(i, retain.key = io) - ans = bmerge(i, x, leftcols, rightcols, io, xo, roll, rollends, nomatch, mult, ops, nqgrp, nqmaxgrp, verbose=verbose) - # temp fix for issue spotted by Jan, test #1653.1. TODO: avoid this - # 'setorder', as there's another 'setorder' in generating 'irows' below... - if (length(ans$indices)) setorder(setDT(ans[1L:3L]), indices) - allLen1 = ans$allLen1 - f__ = ans$starts - len__ = ans$lens - allGrp1 = FALSE # was previously 'ans$allGrp1'. Fixing #1991. TODO: Revisit about allGrp1 possibility for speedups in certain cases when I find some time. - indices__ = if (length(ans$indices)) ans$indices else seq_along(f__) # also for #1991 fix - # length of input nomatch (single 0 or NA) is 1 in both cases. - # When no match, len__ is 0 for nomatch=0 and 1 for nomatch=NA, so len__ isn't .N - # If using secondary key of x, f__ will refer to xo - if (is.na(which)) { - w = if (notjoin) f__!=0L else is.na(f__) - return( if (length(xo)) fsort(xo[w], internal=TRUE) else which(w) ) - } - if (mult=="all") { - # is by=.EACHI along with non-equi join? - nqbyjoin = byjoin && length(ans$indices) && !allGrp1 - if (!byjoin || nqbyjoin) { - # Really, `anyDuplicated` in base is AWESOME! - # allow.cartesian shouldn't error if a) not-join, b) 'i' has no duplicates - irows = if (allLen1) f__ else vecseq(f__,len__, - if( allow.cartesian || - notjoin || # #698. When notjoin=TRUE, ignore allow.cartesian. Rows in answer will never be > nrow(x). - !anyDuplicated(f__, incomparables = c(0L, NA_integer_))) # #742. If 'i' has no duplicates, ignore - NULL - else as.double(nrow(x)+nrow(i))) # rows in i might not match to x so old max(nrow(x),nrow(i)) wasn't enough. But this limit now only applies when there are duplicates present so the reason now for nrow(x)+nrow(i) is just to nail it down and be bigger than max(nrow(x),nrow(i)). - # Fix for #1092 and #1074 - # TODO: implement better version of "any"/"all"/"which" to avoid - # unnecessary construction of logical vectors - if (identical(nomatch, 0L) && allLen1) irows = irows[irows != 0L] - } else { - if (length(xo) && missing(on)) - stop("Cannot by=.EACHI when joining to a secondary key, yet") - # since f__ refers to xo later in grouping, so xo needs to be passed through to dogroups too. - if (length(irows)) - stop("Internal error. irows has length in by=.EACHI") - } - if (nqbyjoin) { - irows = if (length(xo)) xo[irows] else irows - xo = setorder(setDT(list(indices=rep.int(indices__, len__), irows=irows)))[["irows"]] - ans = .Call(CnqRecreateIndices, xo, len__, indices__, max(indices__)) - f__ = ans[[1L]]; len__ = ans[[2L]] - allLen1 = FALSE # TODO; should this always be FALSE? - irows = NULL # important to reset - if (any_na(as_list(xo))) xo = xo[!is.na(xo)] - } - } else { - # turning on mult = "first"/"last" for non-equi joins again to test.. - # if (nqmaxgrp>1L) stop("Non-equi joins aren't yet functional with mult='first' and mult='last'.") - # mult="first"/"last" logic moved to bmerge.c, also handles non-equi cases, #1452 - if (!byjoin) { #1287 and #1271 - irows = f__ # len__ is set to 1 as well, no need for 'pmin' logic - if (identical(nomatch,0L)) irows = irows[len__>0L] # 0s are len 0, so this removes -1 irows - } - # TODO: when nomatch=NA, len__ need not be allocated / set at all for mult="first"/"last"? - # TODO: how about when nomatch=0L, can we avoid allocating then as well? - } - if (length(xo) && length(irows)) { - irows = xo[irows] # TO DO: fsort here? - if (mult=="all" && !allGrp1) { # following #1991 fix, !allGrp1 will always be TRUE. TODO: revisit. - irows = setorder(setDT(list(indices=rep.int(indices__, len__), irows=irows)))[["irows"]] - } - } - if(optimizedSubset){ - ## special treatment for calls like DT[x == 3] that are transformed into DT[J(x=3), on = "x==x"] - - if(!.Call(CisOrderedSubset, irows, nrow(x))){ - ## restore original order. This is a very expensive operation. - ## benchmarks have shown that starting with 1e6 irows, a tweak can significantly reduce time - ## (see #2366) - if (verbose) {last.started.at=proc.time()[3];cat("Reordering", length(irows), "rows after bmerge done in ... ");flush.console()} - if(length(irows) < 1e6){ - irows = fsort(irows, internal=TRUE) ## internally, fsort on integer falls back to forderv - } else { - irows = as.integer(fsort(as.numeric(irows))) ## parallelized for numeric, but overhead of type conversion - } - if (verbose) {cat(round(proc.time()[3]-last.started.at,3),"secs\n");flush.console()} - } - ## make sure, all columns are taken from x and not from i. - ## This is done by simply telling data.table to continue as if there was a simple subset - leftcols = integer(0L) - rightcols = integer(0L) - i <- irows ## important to make i not a data.table because otherwise Gforce doesn't kick in - } - } - else { - if (!missing(on)) { - stop("logical error. i is not a data.table, but 'on' argument is provided.") - } - # TO DO: TODO: Incorporate which_ here on DT[!i] where i is logical. Should avoid i = !i (above) - inefficient. - # i is not a data.table - if (!is.logical(i) && !is.numeric(i)) stop("i has not evaluated to logical, integer or double") - if (is.logical(i)) { - if (length(i)==1L # to avoid unname copy when length(i)==nrow (normal case we don't want to slow down) - && isTRUE(unname(i))) irows=i=NULL # unname() for #2152 - length 1 named logical vector. - # NULL is efficient signal to avoid creating 1:nrow(x) but still return all rows, fixes #1249 - - else if (length(i)<=1L) irows=i=integer(0L) - # FALSE, NA and empty. All should return empty data.table. The NA here will be result of expression, - # where for consistency of edge case #1252 all NA to be removed. If NA is a single NA symbol, it - # was auto converted to NA_integer_ higher up for ease of use and convenience. We definitely - # don't want base R behaviour where DF[NA,] returns an entire copy filled with NA everywhere. - - else if (length(i)==nrow(x)) irows=i=which(i) - # The which() here auto removes NA for convenience so user doesn't need to remember "!is.na() & ..." - # Also this which() is for consistenty of DT[colA>3,which=TRUE] and which(DT[,colA>3]) - # Assigning to 'i' here as well to save memory, #926. - - else stop("i evaluates to a logical vector length ", length(i), " but there are ", nrow(x), " rows. Recycling of logical i is no longer allowed as it hides more bugs than is worth the rare convenience. Explicitly use rep(...,length=.N) if you really need to recycle.") - } else { - irows = as.integer(i) # e.g. DT[c(1,3)] and DT[c(-1,-3)] ok but not DT[c(1,-3)] (caught as error) - irows = .Call(CconvertNegativeIdx, irows, nrow(x)) # simplifies logic from here on (can assume positive subscripts) - # maintains Arun's fix for #2697 (test 1042) - # efficient in C with more detailed messages - # falls through quickly (no R level allocs) if no negatives - # minor TO DO: can we merge this with check_idx in fcast.c/subset ? - } - } - if (notjoin) { - if (byjoin || !is.integer(irows) || is.na(nomatch)) stop("Internal error: notjoin but byjoin or !integer or nomatch==NA") - irows = irows[irows!=0L] - if (verbose) {last.started.at=proc.time()[3];cat("Inverting irows for notjoin done in ... ");flush.console()} - i = irows = if (length(irows)) seq_len(nrow(x))[-irows] else NULL # NULL meaning all rows i.e. seq_len(nrow(x)) - if (verbose) cat(round(proc.time()[3]-last.started.at, 3), "sec\n") - leftcols = integer() # proceed as if row subset from now on, length(leftcols) is switched on later - rightcols = integer() - # Doing this once here, helps speed later when repeatedly subsetting each column. R's [irows] would do this for each - # column when irows contains negatives. - } - if (which) return( if (is.null(irows)) seq_len(nrow(x)) else irows ) - } else { # missing(i) - i = NULL - } - - byval = NULL - xnrow = nrow(x) - xcols = xcolsAns = icols = icolsAns = integer() - xdotcols = FALSE - othervars = character(0L) - if (missing(j)) { - # missing(by)==TRUE was already checked above before dealing with i - if (!length(x)) return(null.data.table()) - if (!length(leftcols)) { - ansvars = nx = names(x) - jisvars = character() - xcols = xcolsAns = seq_along(x) - } else { - jisvars = names(i)[-leftcols] - tt = jisvars %chin% names(x) - if (length(tt)) jisvars[tt] = paste0("i.",jisvars[tt]) - if (length(duprightcols <- rightcols[duplicated(rightcols)])) { - nx = c(names(x), names(x)[duprightcols]) - rightcols = chmatch2(names(x)[rightcols], nx) - nx = make.unique(nx) - } else nx = names(x) - ansvars = make.unique(c(nx, jisvars)) - icols = c(leftcols, seq_along(i)[-leftcols]) - icolsAns = c(rightcols, seq.int(length(nx)+1L, length.out=ncol(i)-length(unique(leftcols)))) - xcols = xcolsAns = seq_along(x)[-rightcols] - } - ansvals = chmatch(ansvars, nx) - } - else { - if (is.data.table(i)) { - idotprefix = paste0("i.", names(i)) - xdotprefix = paste0("x.", names(x)) - } else idotprefix = xdotprefix = character(0L) - - # j was substituted before dealing with i so that := can set allow.cartesian=FALSE (#800) (used above in i logic) - if (is.null(jsub)) return(NULL) - - if (!with && is.call(jsub) && jsub[[1L]]==":=") { - # TODO: make these both errors (or single long error in both cases) in next release. - # i.e. using with=FALSE together with := at all will become an error. Eventually with will be removed. - if (is.null(names(jsub)) && is.name(jsub[[2L]])) { - warning("with=FALSE together with := was deprecated in v1.9.4 released Oct 2014. Please wrap the LHS of := with parentheses; e.g., DT[,(myVar):=sum(b),by=a] to assign to column name(s) held in variable myVar. See ?':=' for other examples. As warned in 2014, this is now a warning.") - jsub[[2L]] = eval(jsub[[2L]], parent.frame(), parent.frame()) - } else { - warning("with=FALSE ignored, it isn't needed when using :=. See ?':=' for examples.") - } - with = TRUE - } - - if (!with) { - # missing(by)==TRUE was already checked above before dealing with i - if (is.call(jsub) && deparse(jsub[[1L]], 500L, backtick=FALSE) %in% c("!", "-")) { # TODO is deparse avoidable here? - notj = TRUE - jsub = jsub[[2L]] - } else notj = FALSE - # fix for #1216, make sure the paranthesis are peeled from expr of the form (((1:4))) - while (is.call(jsub) && jsub[[1L]] == "(") jsub = as.list(jsub)[[-1L]] - if (is.call(jsub) && length(jsub) == 3L && jsub[[1L]] == ":") { - j = eval(jsub, setattr(as.list(seq_along(x)), 'names', names(x)), parent.frame()) # else j will be evaluated for the first time on next line - } else { - names(..syms) = ..syms - j = eval(jsub, lapply(substring(..syms,3L), get, pos=parent.frame()), parent.frame()) - } - if (is.logical(j)) j <- which(j) - if (!length(j)) return( null.data.table() ) - if (is.factor(j)) j = as.character(j) # fix for FR: #4867 - if (is.character(j)) { - if (notj) { - w = chmatch(j, names(x)) - if (anyNA(w)) { - warning("column(s) not removed because not found: ",paste(j[is.na(w)],collapse=",")) - w = w[!is.na(w)] - } - # changed names(x)[-w] to use 'setdiff'. Here, all instances of the column must be removed. - # Ex: DT <- data.table(x=1, y=2, x=3); DT[, !"x", with=FALSE] should just output 'y'. - # But keep 'dup cols' beause it's basically DT[, !names(DT) %chin% "x", with=FALSE] which'll subset all cols not 'x'. - ansvars = if (length(w)) dupdiff(names(x), names(x)[w]) else names(x) - ansvals = dupmatch(ansvars, names(x)) - } else { - # once again, use 'setdiff'. Basically, unless indices are specified in `j`, we shouldn't care about duplicated columns. - ansvars = j # x. and i. prefixes may be in here, and they'll be dealt with below - # dups = FALSE here.. even if DT[, c("x", "x"), with=FALSE], we subset only the first.. No way to tell which one the OP wants without index. - ansvals = chmatch(ansvars, names(x)) - } - } else if (is.numeric(j)) { - j = as.integer(j) - if (any(w<-(j>ncol(x)))) stop("Item ",which.first(w)," of j is ",j[which.first(w)]," which is outside the column number range [1,ncol=", ncol(x),"]") - j = j[j!=0L] - if (!length(j)) return(null.data.table()) - if (any(j<0L) && any(j>0L)) stop("j mixes positives and negatives") - if (any(j<0L)) j = seq_len(ncol(x))[j] - ansvars = names(x)[ if (notj) -j else j ] # DT[,!"columntoexclude",with=FALSE] if a copy is needed, rather than :=NULL - ansvals = if (notj) setdiff(seq_along(x), j) else j - } else stop("When with=FALSE, j-argument should be of type logical/character/integer indicating the columns to select.") # fix for #1440. - if (!length(ansvals)) return(null.data.table()) - } else { # with=TRUE and byjoin could be TRUE - bynames = NULL - allbyvars = NULL - if (byjoin) { - bynames = names(x)[rightcols] - } else if (!missing(by)) { - # deal with by before j because we need byvars when j contains .SD - # may evaluate to NULL | character() | "" | list(), likely a result of a user expression where no-grouping is one case being loop'd through - bysubl = as.list.default(bysub) - bysuborig = bysub - if (is.name(bysub) && !(as.character(bysub) %chin% names(x))) { # TO DO: names(x),names(i),and i. and x. prefixes - bysub = eval(bysub, parent.frame(), parent.frame()) - # fix for # 5106 - http://stackoverflow.com/questions/19983423/why-by-on-a-vector-not-from-a-data-table-column-is-very-slow - # case where by=y where y is not a column name, and not a call/symbol/expression, but an atomic vector outside of DT. - # note that if y is a list, this'll return an error (not sure if it should). - if (is.atomic(bysub)) bysubl = list(bysuborig) else bysubl = as.list.default(bysub) - } - if (length(bysubl) && identical(bysubl[[1L]],quote(eval))) { # TO DO: or by=..() - bysub = eval(bysubl[[2L]], parent.frame(), parent.frame()) - bysub = replace_dot_alias(bysub) # fix for #1298 - if (is.expression(bysub)) bysub=bysub[[1L]] - bysubl = as.list.default(bysub) - } else if (is.call(bysub) && as.character(bysub[[1L]]) %chin% c("c","key","names", "intersect", "setdiff")) { - # catch common cases, so we don't have to copy x[irows] for all columns - # *** TO DO ***: try() this eval first (as long as not list() or .()) and see if it evaluates to column names - # to avoid the explicit c,key,names which already misses paste("V",1:10) for example - # tried before but since not wrapped in try() it failed on some tests - # or look for column names used in this by (since if none it wouldn't find column names anyway - # when evaled within full x[irows]). Trouble is that colA%%2L is a call and should be within frame. - tt = eval(bysub, parent.frame(), parent.frame()) - if (!is.character(tt)) stop("by=c(...), key(...) or names(...) must evaluate to 'character'") - bysub=tt - } else if (is.call(bysub) && !as.character(bysub[[1L]]) %chin% c("list", "as.list", "{", ".", ":")) { - # potential use of function, ex: by=month(date). catch it and wrap with "(", because we need to set "bysameorder" to FALSE as we don't know if the function will return ordered results just because "date" is ordered. Fixes #2670. - bysub = as.call(c(as.name('('), list(bysub))) - bysubl = as.list.default(bysub) - } else if (is.call(bysub) && bysub[[1L]] == ".") bysub[[1L]] = quote(list) - - if (mode(bysub) == "character") { - if (length(grep(",",bysub))) { - if (length(bysub)>1L) stop("'by' is a character vector length ",length(bysub)," but one or more items include a comma. Either pass a vector of column names (which can contain spaces, but no commas), or pass a vector length 1 containing comma separated column names. See ?data.table for other possibilities.") - bysub = strsplit(bysub,split=",")[[1L]] - } - tt = grep("^[^`]+$",bysub) - if (length(tt)) bysub[tt] = paste0("`",bysub[tt],"`") - bysub = parse(text=paste0("list(",paste(bysub,collapse=","),")"))[[1L]] - bysubl = as.list.default(bysub) - } - allbyvars = intersect(all.vars(bysub),names(x)) - - orderedirows = .Call(CisOrderedSubset, irows, nrow(x)) # TRUE when irows is NULL (i.e. no i clause) - # orderedirows = is.sorted(f__) - bysameorder = orderedirows && haskey(x) && all(vapply_1b(bysubl,is.name)) && length(allbyvars) && identical(allbyvars,head(key(x),length(allbyvars))) - if (is.null(irows)) - if (is.call(bysub) && length(bysub) == 3L && bysub[[1L]] == ":" && is.name(bysub[[2L]]) && is.name(bysub[[3L]])) { - byval = eval(bysub, setattr(as.list(seq_along(x)), 'names', names(x)), parent.frame()) - byval = as.list(x)[byval] - } else byval = eval(bysub, x, parent.frame()) - else { - if (!is.integer(irows)) stop("Internal error: irows isn't integer") # length 0 when i returns no rows - # Passing irows as i to x[] below has been troublesome in a rare edge case. - # irows may contain NA, 0, negatives and >nrow(x) here. That's all ok. - # But we may need i join column values to be retained (where those rows have no match), hence we tried eval(isub) - # in 1.8.3, but this failed test 876. - # TO DO: Add a test like X[i,sum(v),by=i.x2], or where by includes a join column (both where some i don't match). - # TO DO: Make xss directly, rather than recursive call. - if (!is.na(nomatch)) irows = irows[irows!=0L] # TO DO: can be removed now we have CisSortedSubset - if (length(allbyvars)) { ############### TO DO TO DO TO DO ############### - if (verbose) cat("i clause present and columns used in by detected, only these subset:",paste(allbyvars,collapse=","),"\n") - xss = x[irows,allbyvars,with=FALSE,nomatch=nomatch,mult=mult,roll=roll,rollends=rollends] - } else { - if (verbose) cat("i clause present but columns used in by not detected. Having to subset all columns before evaluating 'by': '",deparse(by),"'\n",sep="") - xss = x[irows,nomatch=nomatch,mult=mult,roll=roll,rollends=rollends] - } - if (is.call(bysub) && length(bysub) == 3L && bysub[[1L]] == ":") { - byval = eval(bysub, setattr(as.list(seq_along(xss)), 'names', names(xss)), parent.frame()) - byval = as.list(xss)[byval] - } else byval = eval(bysub, xss, parent.frame()) - xnrow = nrow(xss) - # TO DO: pass xss (x subset) through into dogroups. Still need irows there (for :=), but more condense - # and contiguous to use xss to form .SD in dogroups than going via irows - } - if (!length(byval) && xnrow>0L) { - # see missing(by) up above for comments - # by could be NULL or character(0L) for example (e.g. passed in as argument in a loop of different bys) - bysameorder = FALSE # 1st and only group is the entire table, so could be TRUE, but FALSE to avoid - # a key of empty character() - byval = list() - bynames = allbyvars = NULL - # the rest now fall through - } else bynames = names(byval) - if (is.atomic(byval)) { - if (is.character(byval) && length(byval)<=ncol(x) && !(is.name(bysub) && as.character(bysub)%chin%names(x)) ) { - stop("'by' appears to evaluate to column names but isn't c() or key(). Use by=list(...) if you can. Otherwise, by=eval",deparse(bysub)," should work. This is for efficiency so data.table can detect which columns are needed.") - } else { - # by may be a single unquoted column name but it must evaluate to list so this is a convenience to users. Could also be a single expression here such as DT[,sum(v),by=colA%%2] - byval = list(byval) - bysubl = c(as.name("list"),bysuborig) # for guessing the column name below - if (is.name(bysuborig)) - bynames = as.character(bysuborig) - else - bynames = names(byval) - } - } - if (!is.list(byval)) stop("'by' or 'keyby' must evaluate to vector or list of vectors (where 'list' includes data.table and data.frame which are lists, too)") - for (jj in seq_len(length(byval))) { - if (!typeof(byval[[jj]]) %chin% c("integer","logical","character","double")) stop("column or expression ",jj," of 'by' or 'keyby' is type ",typeof(byval[[jj]]),". Do not quote column names. Usage: DT[,sum(colC),by=list(colA,month(colB))]") - } - tt = vapply_1i(byval,length) - if (any(tt!=xnrow)) stop("The items in the 'by' or 'keyby' list are length (",paste(tt,collapse=","),"). Each must be same length as rows in x or number of rows returned by i (",xnrow,").") - if (is.null(bynames)) bynames = rep.int("",length(byval)) - if (any(bynames=="")) { - if (length(bysubl)<2L) stop("When 'by' or 'keyby' is list() we expect something inside the brackets") - for (jj in seq_along(bynames)) { - if (bynames[jj]=="") { - # Best guess. Use "month" in the case of by=month(date), use "a" in the case of by=a%%2 - byvars = all.vars(bysubl[[jj+1L]], functions = TRUE) - if (length(byvars) == 1L) tt = byvars - else { - tt = grep("^eval|^[^[:alpha:]. ]",byvars,invert=TRUE,value=TRUE)[1L] - if (!length(tt)) tt = all.vars(bysubl[[jj+1L]])[1L] - } - # fix for #497 - if (length(byvars) > 1L && tt %in% all.vars(jsub, FALSE)) { - bynames[jj] = deparse(bysubl[[jj+1L]]) - if (verbose) - cat("by-expression '", bynames[jj], "' is not named, and the auto-generated name '", tt, "' clashed with variable(s) in j. Therefore assigning the entire by-expression as name.\n", sep="") - - } - else bynames[jj] = tt - # if user doesn't like this inferred name, user has to use by=list() to name the column - } - } - # Fix for #1334 - if (any(duplicated(bynames))) { - bynames = make.unique(bynames) - } - } - setattr(byval, "names", bynames) # byval is just a list not a data.table hence setattr not setnames - } - - jvnames = NULL - if (is.name(jsub)) { - # j is a single unquoted column name - if (jsub!=".SD") { - jvnames = gsub("^[.](N|I|GRP|BY)$","\\1",as.character(jsub)) - # jsub is list()ed after it's eval'd inside dogroups. - } - } else if (is.call(jsub) && as.character(jsub[[1L]]) %chin% c("list",".")) { - jsub[[1L]] = quote(list) - jsubl = as.list.default(jsub) # TO DO: names(jsub) and names(jsub)="" seem to work so make use of that - if (length(jsubl)>1L) { - jvnames = names(jsubl)[-1L] # check list(a=sum(v),v) - if (is.null(jvnames)) jvnames = rep.int("", length(jsubl)-1L) - for (jj in seq.int(2L,length(jsubl))) { - if (jvnames[jj-1L] == "" && mode(jsubl[[jj]])=="name") - jvnames[jj-1L] = gsub("^[.](N|I|GRP|BY)$","\\1",deparse(jsubl[[jj]])) - # TO DO: if call to a[1] for example, then call it 'a' too - } - setattr(jsubl, "names", NULL) # drops the names from the list so it's faster to eval the j for each group. We'll put them back aftwards on the result. - jsub = as.call(jsubl) - } # else empty list is needed for test 468: adding an empty list column - } # else maybe a call to transform or something which returns a list. - av = all.vars(jsub,TRUE) # TRUE fixes bug #1294 which didn't see b in j=fns[[b]](c) - use.I = ".I" %chin% av - # browser() - if (any(c(".SD","eval","get","mget") %chin% av)) { - if (missing(.SDcols)) { - # here we need to use 'dupdiff' instead of 'setdiff'. Ex: setdiff(c("x", "x"), NULL) will give 'x'. - ansvars = dupdiff(names(x),union(bynames,allbyvars)) # TO DO: allbyvars here for vars used by 'by'. Document. - # just using .SD in j triggers all non-by columns in the subset even if some of - # those columns are not used. It would be tricky to detect whether the j expression - # really does use all of the .SD columns or not, hence .SDcols for grouping - # over a subset of columns - - # all duplicate columns must be matched, because nothing is provided - ansvals = dupmatch(ansvars, names(x)) - } else { - # FR #4979 - negative numeric and character indices for SDcols - colsub = substitute(.SDcols) - # fix for #5190. colsub[[1L]] gave error when it's a symbol. - if (is.call(colsub) && deparse(colsub[[1L]], 500L, backtick=FALSE) %in% c("!", "-")) { - colm = TRUE - colsub = colsub[[2L]] - } else colm = FALSE - # fix for #1216, make sure the paranthesis are peeled from expr of the form (((1:4))) - while(is.call(colsub) && colsub[[1L]] == "(") colsub = as.list(colsub)[[-1L]] - if (is.call(colsub) && length(colsub) == 3L && colsub[[1L]] == ":") { - # .SDcols is of the format a:b - .SDcols = eval(colsub, setattr(as.list(seq_along(x)), 'names', names(x)), parent.frame()) - } else { - .SDcols = eval(colsub, parent.frame(), parent.frame()) - } - if (is.logical(.SDcols)) { - ansvals = which_(rep(.SDcols, length.out=length(x)), !colm) - ansvars = names(x)[ansvals] - } else if (is.numeric(.SDcols)) { - # if .SDcols is numeric, use 'dupdiff' instead of 'setdiff' - if (length(unique(sign(.SDcols))) != 1L) stop(".SDcols is numeric but has both +ve and -ve indices") - if (anyNA(.SDcols) || any(abs(.SDcols)>ncol(x)) || any(abs(.SDcols)<1L)) stop(".SDcols is numeric but out of bounds (or NA)") - if (colm) ansvars = dupdiff(names(x)[-.SDcols], bynames) else ansvars = names(x)[.SDcols] - ansvals = if (colm) setdiff(seq_along(names(x)), c(as.integer(.SDcols), which(names(x) %chin% bynames))) else as.integer(.SDcols) - } else { - if (!is.character(.SDcols)) stop(".SDcols should be column numbers or names") - if (anyNA(.SDcols) || any(!.SDcols %chin% names(x))) stop("Some items of .SDcols are not column names (or are NA)") - if (colm) ansvars = setdiff(setdiff(names(x), .SDcols), bynames) else ansvars = .SDcols - # dups = FALSE here. DT[, .SD, .SDcols=c("x", "x")] again doesn't really help with which 'x' to keep (and if '-' which x to remove) - ansvals = chmatch(ansvars, names(x)) - } - } - # fix for long standing FR/bug, #495 and #484 - allcols = c(names(x), xdotprefix, names(i), idotprefix) - if ( length(othervars <- setdiff(intersect(av, allcols), c(bynames, ansvars))) ) { - # we've a situation like DT[, c(sum(V1), lapply(.SD, mean)), by=., .SDcols=...] or - # DT[, lapply(.SD, function(x) x *v1), by=, .SDcols=...] etc., - ansvars = union(ansvars, othervars) - ansvals = chmatch(ansvars, names(x)) - } - # .SDcols might include grouping columns if users wants that, but normally we expect user not to include them in .SDcols - } else { - if (!missing(.SDcols)) warning("This j doesn't use .SD but .SDcols has been supplied. Ignoring .SDcols. See ?data.table.") - allcols = c(names(x), xdotprefix, names(i), idotprefix) - ansvars = setdiff(intersect(av,allcols), bynames) - if (verbose) cat("Detected that j uses these columns:",if (!length(ansvars)) "" else paste(ansvars,collapse=","),"\n") - # using a few named columns will be faster - # Consider: DT[,max(diff(date)),by=list(month=month(date))] - # and: DT[,lapply(.SD,sum),by=month(date)] - # We don't want date in .SD in the latter, but we do in the former; hence the union() above. - ansvals = chmatch(ansvars, names(x)) - } - # if (!length(ansvars)) Leave ansvars empty. Important for test 607. - - # TODO remove as (m)get is now folded in above. - # added 'mget' - fix for #994 - if (any(c("get", "mget") %chin% av)) { - if (verbose) { - cat("'(m)get' found in j. ansvars being set to all columns. Use .SDcols or a single j=eval(macro) instead. Both will detect the columns used which is important for efficiency.\nOld:", paste(ansvars,collapse=","),"\n") - # get('varname') is too difficult to detect which columns are used in general - # eval(macro) column names are detected via the if jsub[[1]]==eval switch earlier above. - } - - # Do not include z in .SD when dt[, z := {.SD; get("x")}, .SDcols = "y"] (#2326, #2338) - if (is.call(jsub) && length(jsub[[1L]]) == 1L && jsub[[1L]] == ":=" && is.symbol(jsub[[2L]])) { - jsub_lhs_symbol <- as.character(jsub[[2L]]) - if (jsub_lhs_symbol %chin% othervars) { - ansvars <- setdiff(ansvars, jsub_lhs_symbol) - } - } - if (length(ansvars)) othervars = ansvars # #1744 fix - allcols = c(names(x), xdotprefix, names(i), idotprefix) - ansvars = setdiff(allcols,bynames) # fix for bug #5443 - ansvals = chmatch(ansvars, names(x)) - if (length(othervars)) othervars = setdiff(ansvars, othervars) # #1744 fix - if (verbose) cat("New:",paste(ansvars,collapse=","),"\n") - } - - lhs = NULL - newnames = NULL - suppPrint = identity - if (length(av) && av[1L] == ":=") { - if (identical(attr(x,".data.table.locked"),TRUE)) stop(".SD is locked. Using := in .SD's j is reserved for possible future use; a tortuously flexible way to modify by group. Use := in j directly to modify by group by reference.") - suppPrint <- function(x) { .global$print=address(x); x } - # Suppress print when returns ok not on error, bug #2376. Thanks to: http://stackoverflow.com/a/13606880/403310 - # All appropriate returns following this point are wrapped; i.e. return(suppPrint(x)). - - if (is.null(names(jsub))) { - # regular LHS:=RHS usage, or `:=`(...) with no named arguments (an error) - # `:=`(LHS,RHS) is valid though, but more because can't see how to detect that, than desire - if (length(jsub)!=3L) stop("In `:=`(col1=val1, col2=val2, ...) form, all arguments must be named.") - lhs = jsub[[2L]] - jsub = jsub[[3L]] - if (is.name(lhs)) { - lhs = as.character(lhs) - } else { - # e.g. (MyVar):= or get("MyVar"):= - lhs = eval(lhs, parent.frame(), parent.frame()) - } - } else { - # `:=`(c2=1L,c3=2L,...) - lhs = names(jsub)[-1L] - if (any(lhs=="")) stop("In `:=`(col1=val1, col2=val2, ...) form, all arguments must be named.") - names(jsub)="" - jsub[[1L]]=as.name("list") - } - av = all.vars(jsub,TRUE) - if (!is.atomic(lhs)) stop("LHS of := must be a symbol, or an atomic vector (column names or positions).") - if (is.character(lhs)) - m = chmatch(lhs,names(x)) - else if (is.numeric(lhs)) { - m = as.integer(lhs) - if (any(m<1L | ncol(x)v3.0.2 if that is biting. If this message doesn't help, please report to datatable-help so the root cause can be fixed.") - if ((ok<1L) || (truelength(x) < ncol(x)+length(newnames))) { - DT = x # in case getOption contains "ncol(DT)" as it used to. TODO: warn and then remove - n = length(newnames) + eval(getOption("datatable.alloccol")) # TODO: warn about expressions and then drop the eval() - # i.e. reallocate at the size as if the new columns were added followed by alloc.col(). - name = substitute(x) - if (is.name(name) && ok && verbose) { # && NAMED(x)>0 (TO DO) # ok here includes -1 (loaded from disk) - cat("Growing vector of column pointers from truelength ",truelength(x)," to ",n,". A shallow copy has been taken, see ?alloc.col. Only a potential issue if two variables point to the same data (we can't yet detect that well) and if not you can safely ignore this. To avoid this message you could alloc.col() first, deep copy first using copy(), wrap with suppressWarnings() or increase the 'datatable.alloccol' option.\n") - # Verbosity should not issue warnings, so cat rather than warning. - # TO DO: Add option 'datatable.pedantic' to turn on warnings like this. - - # TO DO ... comments moved up from C ... - # Note that the NAMED(dt)>1 doesn't work because .Call - # always sets to 2 (see R-ints), it seems. Work around - # may be possible but not yet working. When the NAMED test works, we can drop allocwarn argument too - # because that's just passed in as FALSE from [<- where we know `*tmp*` isn't really NAMED=2. - # Note also that this growing will happen for missing columns assigned NULL, too. But so rare, we - # don't mind. - } - alloc.col(x, n, verbose=verbose) # always assigns to calling scope; i.e. this scope - if (is.name(name)) { - assign(as.character(name),x,parent.frame(),inherits=TRUE) - } else if (is.call(name) && (name[[1L]] == "$" || name[[1L]] == "[[") && is.name(name[[2L]])) { - k = eval(name[[2L]], parent.frame(), parent.frame()) - if (is.list(k)) { - origj = j = if (name[[1L]] == "$") as.character(name[[3L]]) else eval(name[[3L]], parent.frame(), parent.frame()) - if (is.character(j)) { - if (length(j)!=1L) stop("L[[i]][,:=] syntax only valid when i is length 1, but it's length %d",length(j)) - j = match(j, names(k)) - if (is.na(j)) stop("Item '",origj,"' not found in names of list") - } - .Call(Csetlistelt,k,as.integer(j), x) - } else if (is.environment(k) && exists(as.character(name[[3L]]), k)) { - assign(as.character(name[[3L]]), x, k, inherits=FALSE) - } - } # TO DO: else if env$<- or list$<- - } - } - } - } - - if (length(ansvars)) { - w = ansvals - if (length(rightcols) && missing(by)) { - w[ w %in% rightcols ] = NA - } - # patch for #1615. Allow 'x.' syntax. Only useful during join op when x's join col needs to be used. - # Note that I specifically have not implemented x[y, aa, on=c(aa="bb")] to refer to x's join column - # as well because x[i, col] == x[i][, col] will not be TRUE anymore.. - if ( any(xdotprefixvals <- ansvars %in% xdotprefix)) { - w[xdotprefixvals] = chmatch(ansvars[xdotprefixvals], xdotprefix) - xdotcols = TRUE - } - if (!any(wna <- is.na(w))) { - xcols = w - xcolsAns = seq_along(ansvars) - icols = icolsAns = integer() - } else { - if (!length(leftcols)) stop("column(s) not found: ", paste(ansvars[wna],collapse=", ")) - xcols = w[!wna] - xcolsAns = which(!wna) - ivars = names(i) - ivars[leftcols] = names(x)[rightcols] - w2 = chmatch(ansvars[wna], ivars) - if (any(w2na <- is.na(w2))) { - ivars = paste0("i.",ivars) - ivars[leftcols] = names(i)[leftcols] - w2[w2na] = chmatch(ansvars[wna][w2na], ivars) - if (any(w2na <- is.na(w2))) { - ivars[leftcols] = paste0("i.",ivars[leftcols]) - w2[w2na] = chmatch(ansvars[wna][w2na], ivars) - if (any(w2na <- is.na(w2))) stop("column(s) not found: ", paste(ansvars[wna][w2na],sep=", ")) - } - } - icols = w2 - icolsAns = which(wna) - } - } - } # end of if !missing(j) - - SDenv = new.env(parent=parent.frame()) - # taking care of warnings for posixlt type, #646 - SDenv$strptime <- function(x, ...) { - warning("POSIXlt column type detected and converted to POSIXct. We do not recommend use of POSIXlt at all because it uses 40 bytes to store one date.") - as.POSIXct(base::strptime(x, ...)) - } - - syms = all.vars(jsub) - syms = syms[ substring(syms,1L,2L)==".." ] - syms = syms[ substring(syms,3L,3L)!="." ] # exclude ellipsis - for (sym in syms) { - getName = substring(sym, 3L) - if (sym %chin% names(x)) - stop(sym," in j is looking for ",getName," in calling scope, but a column '", sym, "' exists. Column names should not start with ..") - if (!exists(getName, parent.frame())) - stop("Variable '",getName,"' is not found in calling scope. Looking in calling scope because this symbol was prefixed with .. in the j= parameter.") - assign(sym, get(getName, parent.frame()), SDenv) - } - - # hash=TRUE (the default) does seem better as expected using e.g. test 645. TO DO experiment with 'size' argument - if (missing(by) || (!byjoin && !length(byval))) { - # No grouping: 'by' = missing | NULL | character() | "" | list() - # Considered passing a one-group to dogroups but it doesn't do the recycling of i within group, that's done here - if (length(ansvars)) { - # TO DO: port more of this to C - ans = vector("list", length(ansvars)) - if (length(i) && length(icols)) { - if (allLen1 && allGrp1 && (is.na(nomatch) || !any(f__==0L))) { # nomatch=0 should drop rows in i that have no match - for (s in seq_along(icols)) { - target = icolsAns[s] - source = icols[s] - ans[[target]] = i[[source]] - if (address(ans[[target]]) == address(i[[source]])) ans[[target]] = copy(ans[[target]]) - } - } else { - ii = rep.int(indices__, len__) # following #1991 fix, allGrp1=FALSE always. TODO: revisit later - for (s in seq_along(icols)) { - target = icolsAns[s] - source = icols[s] - ans[[target]] = .Call(CsubsetVector,i[[source]],ii) # i.e. i[[source]][ii] - } - } - } - if (is.null(irows)) { - for (s in seq_along(xcols)) { # xcols means non-join x columns, since join columns come from i - target = xcolsAns[s] - source = xcols[s] - ans[[target]] = x[[source]] - # Temp fix for #921 - skip COPY until after evaluating 'jval' (scroll down). - # Unless 'with=FALSE' - can not be expressions but just column names. - if (!with && address(ans[[target]]) == address(x[[source]])) - ans[[target]] = copy(ans[[target]]) - else ans[[target]] = ans[[target]] - } - } else { - for (s in seq_along(xcols)) { - target = xcolsAns[s] - source = xcols[s] - ans[[target]] = .Call(CsubsetVector,x[[source]],irows) # i.e. x[[source]][irows], but guaranteed new memory even for singleton logicals from R 3.1.0 - } - } - # the address==address is a temp fix for R >= 3.1.0. TO DO: allow shallow copy here, then copy only when user uses := - # or set* on the result by using NAMED/REFCNT on columns, with warning if they copy. Since then, even foo = DT$b - # would cause the next set or := to copy that column (so the warning is needed). To tackle that, we could have our - # own DT.NAMED attribute, perhaps. - # Or keep the rule that [.data.table always returns new memory, and create view() or view= as well, maybe cleaner. - - setattr(ans, "names", ansvars) - if (haskey(x)) { - keylen = which.first(!key(x) %chin% ansvars)-1L - if (is.na(keylen)) keylen = length(key(x)) - len = length(rightcols) - # fix for #1268, #1704, #1766 and #1823 - chk = if (len && !missing(on)) !identical(head(key(x), len), names(on)) else FALSE - if ( (keylen>len || chk) && !.Call(CisOrderedSubset, irows, nrow(x))) { - keylen = if (!chk) len else 0L # fix for #1268 - } - if (keylen && ((is.data.table(i) && haskey(i)) || is.logical(i) || (.Call(CisOrderedSubset, irows, nrow(x)) && ((roll == FALSE) || length(irows) == 1L)))) # see #1010. don't set key when i has no key, but irows is ordered and roll != FALSE - setattr(ans,"sorted",head(key(x),keylen)) - } - setattr(ans, "class", class(x)) # fix for #5296 - setattr(ans, "row.names", .set_row_names(nrow(ans))) - - if (!with || missing(j)) return(alloc.col(ans)) - - SDenv$.SDall = ans - SDenv$.SD = if (!length(othervars)) SDenv$.SDall else shallow(SDenv$.SDall, setdiff(ansvars, othervars)) - SDenv$.N = nrow(SDenv$.SD) - - } else { - SDenv$.SDall = SDenv$.SD = null.data.table() # no columns used by j so .SD can be empty. Only needs to exist so that we can rely on it being there when locking it below for example. If .SD were used by j, of course then xvars would be the columns and we wouldn't be in this leaf. - SDenv$.N = if (is.null(irows)) nrow(x) else length(irows) * !identical(suppressWarnings(max(irows)), 0L) - # Fix for #963. - # When irows is integer(0L), length(irows) = 0 will result in 0 (as expected). - # Binary search can return all 0 irows when none of the input matches. Instead of doing all(irows==0L) (previous method), which has to allocate a logical vector the size of irows, we can make use of 'max'. If max is 0, we return 0. The condition where only some irows > 0 won't occur. - } - # Temp fix for #921. Allocate `.I` only if j-expression uses it. - SDenv$.I = if (!missing(j) && use.I) seq_len(SDenv$.N) else 0L - SDenv$.GRP = 1L - setattr(SDenv$.SD,".data.table.locked",TRUE) # used to stop := modifying .SD via j=f(.SD), bug#1727. The more common case of j=.SD[,subcol:=1] was already caught when jsub is inspected for :=. - setattr(SDenv$.SDall,".data.table.locked",TRUE) - lockBinding(".SD",SDenv) - lockBinding(".SDall",SDenv) - lockBinding(".N",SDenv) - lockBinding(".I",SDenv) - lockBinding(".GRP",SDenv) - for (ii in ansvars) assign(ii, SDenv$.SDall[[ii]], SDenv) - # Since .SD is inside SDenv, alongside its columns as variables, R finds .SD symbol more quickly, if used. - # There isn't a copy of the columns here, the xvar symbols point to the SD columns (copy-on-write). - - if (is.name(jsub) && is.null(lhs) && !exists(jsubChar<-as.character(jsub), SDenv, inherits=FALSE)) { - stop("j (the 2nd argument inside [...]) is a single symbol but column name '",jsubChar,"' is not found. Perhaps you intended DT[, ..",jsubChar,"]. This difference to data.frame is deliberate and explained in FAQ 1.1.") - } - - jval = eval(jsub, SDenv, parent.frame()) - # copy 'jval' when required - # More speedup - only check + copy if irows is NULL - # Temp fix for #921 - check address and copy *after* evaluating 'jval' - if (is.null(irows)) { - if (!is.list(jval)) { # performance improvement when i-arg is S4, but not list, #1438, Thanks @DCEmilberg. - jcpy = address(jval) %in% vapply_1c(SDenv$.SD, address) # %chin% errors when RHS is list() - if (jcpy) jval = copy(jval) - } else if (address(jval) == address(SDenv$.SD)) { - jval = copy(jval) - } else if ( length(jcpy <- which(vapply_1c(jval, address) %in% vapply_1c(SDenv, address))) ) { - for (jidx in jcpy) jval[[jidx]] = copy(jval[[jidx]]) - } else if (is.call(jsub) && jsub[[1L]] == "get" && is.list(jval)) { - jval = copy(jval) # fix for #1212 - } - } else { - if (is.data.table(jval)) { - setattr(jval, '.data.table.locked', NULL) # fix for #1341 - if (!truelength(jval)) alloc.col(jval) - } - } - if (!is.null(lhs)) { - # TODO?: use set() here now that it can add new columns. Then remove newnames and alloc logic above. - .Call(Cassign,x,irows,cols,newnames,jval,verbose) - return(suppPrint(x)) - } - if ((is.call(jsub) && is.list(jval) && jsub[[1L]] != "get" && !is.object(jval)) || !missing(by)) { - # is.call: selecting from a list column should return list - # is.object: for test 168 and 168.1 (S4 object result from ggplot2::qplot). Just plain list results should result in data.table - - # Fix for #813 and #758. Ex: DT[c(FALSE, FALSE), list(integer(0L), y)] - # where DT = data.table(x=1:2, y=3:4) should return an empty data.table!! - if (!is.null(irows) && (identical(irows, integer(0L)) || all(irows %in% 0L))) ## TODO: any way to not check all 'irows' values? - if (is.atomic(jval)) jval = jval[0L] else jval = lapply(jval, `[`, 0L) - if (is.atomic(jval)) { - setattr(jval,"names",NULL) - jval = data.table(jval) # TO DO: should this be setDT(list(jval)) instead? - } else { - if (is.null(jvnames)) jvnames=names(jval) - # avoid copy if all vectors are already of same lengths, use setDT - lenjval = vapply(jval, length, 0L) - if (any(lenjval != lenjval[1L])) { - jval = as.data.table.list(jval) # does the vector expansion to create equal length vectors - jvnames = jvnames[lenjval != 0L] # fix for #1477 - } else setDT(jval) - } - if (is.null(jvnames)) jvnames = character(length(jval)-length(bynames)) - ww = which(jvnames=="") - if (any(ww)) jvnames[ww] = paste0("V",ww) - setnames(jval, jvnames) - } - - # fix for bug #5114 from GSee's - .data.table.locked=TRUE. # TO DO: more efficient way e.g. address==address (identical will do that but then proceed to deep compare if !=, wheras we want just to stop?) - # Commented as it's taken care of above, along with #921 fix. Kept here for the bug fix info and TO DO. - # if (identical(jval, SDenv$.SD)) return(copy(jval)) - - if (is.data.table(jval)) { - setattr(jval, 'class', class(x)) # fix for #5296 - if (haskey(x) && all(key(x) %chin% names(jval)) && suppressWarnings(is.sorted(jval, by=key(x)))) # TO DO: perhaps this usage of is.sorted should be allowed internally then (tidy up and make efficient) - setattr(jval, 'sorted', key(x)) - } - return(jval) - } - - ########################################################################### - # Grouping ... - ########################################################################### - - o__ = integer() - if (".N" %chin% ansvars) stop("The column '.N' can't be grouped because it conflicts with the special .N variable. Try setnames(DT,'.N','N') first.") - if (".I" %chin% ansvars) stop("The column '.I' can't be grouped because it conflicts with the special .I variable. Try setnames(DT,'.I','I') first.") - SDenv$.iSD = NULL # null.data.table() - SDenv$.xSD = NULL # null.data.table() - introducing for FR #2693 and Gabor's post on fixing for FAQ 2.8 - - assign("print", function(x,...){base::print(x,...);NULL}, SDenv) - # Now ggplot2 returns data from print, we need a way to throw it away otherwise j accumulates the result - - SDenv$.SDall = SDenv$.SD = null.data.table() # e.g. test 607. Grouping still proceeds even though no .SD e.g. grouping key only tables, or where j consists of .N only - SDenv$.N = vector("integer", 1L) # explicit new vector (not 0L or as.integer() which might return R's internal small-integer global) - SDenv$.GRP = vector("integer", 1L) # because written to by reference at C level (one write per group). TODO: move this alloc to C level - - if (byjoin) { - # The groupings come instead from each row of the i data.table. - # Much faster for a few known groups vs a 'by' for all followed by a subset - if (!is.data.table(i)) stop("logicial error. i is not data.table, but mult='all' and 'by'=.EACHI") - byval = i - bynames = if (missing(on)) head(key(x),length(leftcols)) else names(on) - allbyvars = NULL - bysameorder = haskey(i) || (is.sorted(f__) && ((roll == FALSE) || length(f__) == 1L)) # Fix for #1010 - ## 'av' correct here ?? *** TO DO *** - xjisvars = intersect(av, names(x)[rightcols]) # no "x." for xvars. - # if 'get' is in 'av' use all cols in 'i', fix for bug #5443 - # added 'mget' - fix for #994 - jisvars = if (any(c("get", "mget") %chin% av)) names(i) else intersect(gsub("^i[.]","", setdiff(av, xjisvars)), names(i)) - # JIS (non join cols) but includes join columns too (as there are named in i) - if (length(jisvars)) { - tt = min(nrow(i),1L) - SDenv$.iSD = i[tt,jisvars,with=FALSE] - for (ii in jisvars) { - assign(ii, SDenv$.iSD[[ii]], SDenv) - assign(paste0("i.",ii), SDenv$.iSD[[ii]], SDenv) - } - } - - } else { - # Find the groups, using 'byval' ... - if (missing(by)) stop("Internal error, by is missing") - - if (length(byval) && length(byval[[1L]])) { - if (!bysameorder) { - if (verbose) {last.started.at=proc.time();cat("Finding groups using forderv ... ");flush.console()} - o__ = forderv(byval, sort=!missing(keyby), retGrp=TRUE) - # The sort= argument is called sortStr at C level. It's just about saving the sort of unique strings at - # C level for efficiency (cgroup vs csort) when by= not keyby=. All other types are always sorted. Getting - # orginal order below is the part that retains original order. Passing sort=TRUE here always won't change any - # result at all (tested and confirmed to double check), it'll just make by= slower when there's a large - # number of unique strings. It must be TRUE when keyby= though, since the key is just marked afterwards. - # forderv() returns empty integer() if already ordered to save allocating 1:xnrow - bysameorder = orderedirows && !length(o__) - if (verbose) { - cat(timetaken(last.started.at),"\n") - last.started.at=proc.time() - cat("Finding group sizes from the positions (can be avoided to save RAM) ... ") - flush.console() # for windows - } - f__ = attr(o__, "starts") - len__ = uniqlengths(f__, xnrow) - if (verbose) {cat(timetaken(last.started.at),"\n"); flush.console()} - if (!bysameorder && missing(keyby)) { - # TO DO: lower this into forder.c - if (verbose) {last.started.at=proc.time();cat("Getting back original order ... ");flush.console()} - firstofeachgroup = o__[f__] - if (length(origorder <- forderv(firstofeachgroup))) { - f__ = f__[origorder] - len__ = len__[origorder] - } - if (verbose) {cat(timetaken(last.started.at),"\n"); flush.console()} - } - if (!orderedirows && !length(o__)) o__ = seq_len(xnrow) # temp fix. TODO: revist orderedirows - } else { - if (verbose) {last.started.at=proc.time();cat("Finding groups using uniqlist ... ");flush.console()} - f__ = uniqlist(byval) - if (verbose) { - cat(timetaken(last.started.at),"\n") - last.started.at=proc.time() - cat("Finding group sizes from the positions (can be avoided to save RAM) ... ") - flush.console() # for windows - } - len__ = uniqlengths(f__, xnrow) - # TO DO: combine uniqlist and uniquelengths into one call. Or, just set len__ to NULL when dogroups infers that. - if (verbose) { cat(timetaken(last.started.at),"\n"); flush.console() } - } - } else { - f__=NULL - len__=0L - bysameorder=TRUE # for test 724 - } - # TO DO: allow secondary keys to be stored, then we see if our by matches one, if so use it, and no need to sort again. TO DO: document multiple keys. - } - alloc = if (length(len__)) seq_len(max(len__)) else 0L - SDenv$.I = alloc - if (length(xcols)) { - # TODO add: if (length(alloc)==nrow(x)) stop("There is no need to deep copy x in this case") - SDenv$.SDall = .Call(CsubsetDT,x,alloc,xcols) # must be deep copy when largest group is a subset - if (xdotcols) setattr(SDenv$.SDall, 'names', ansvars[xcolsAns]) # now that we allow 'x.' prefix in 'j', #2313 bug fix - [xcolsAns] - SDenv$.SD = if (!length(othervars)) SDenv$.SDall else shallow(SDenv$.SDall, setdiff(ansvars, othervars)) - } - if (nrow(SDenv$.SDall)==0L) { - setattr(SDenv$.SDall,"row.names",c(NA_integer_,0L)) - setattr(SDenv$.SD,"row.names",c(NA_integer_,0L)) - } - # .set_row_names() basically other than not integer() for 0 length, otherwise dogroups has no [1] to modify to -.N - setattr(SDenv$.SD,".data.table.locked",TRUE) # used to stop := modifying .SD via j=f(.SD), bug#1727. The more common case of j=.SD[,subcol:=1] was already caught when jsub is inspected for :=. - setattr(SDenv$.SDall,".data.table.locked",TRUE) - lockBinding(".SD",SDenv) - lockBinding(".SDall",SDenv) - lockBinding(".N",SDenv) - lockBinding(".GRP",SDenv) - lockBinding(".I",SDenv) - lockBinding(".iSD",SDenv) - - GForce = FALSE - if ( getOption("datatable.optimize")>=1 && (is.call(jsub) || (is.name(jsub) && as.character(jsub) %chin% c(".SD",".N"))) ) { # Ability to turn off if problems or to benchmark the benefit - # Optimization to reduce overhead of calling lapply over and over for each group - ansvarsnew = setdiff(ansvars, othervars) - oldjsub = jsub - funi = 1L # Fix for #985 - # convereted the lapply(.SD, ...) to a function and used below, easier to implement FR #2722 then. - .massageSD <- function(jsub) { - txt = as.list(jsub)[-1L] - if (length(names(txt))>1L) .Call(Csetcharvec, names(txt), 2L, "") # fixes bug #4839 - fun = txt[[2L]] - if (is.call(fun) && fun[[1L]]=="function") { - # Fix for #2381: added SDenv$.SD to 'eval' to take care of cases like: lapply(.SD, function(x) weighted.mean(x, bla)) where "bla" is a column in DT - # http://stackoverflow.com/questions/13441868/data-table-and-stratified-means - # adding this does not compromise in speed (that is, not any lesser than without SDenv$.SD) - # replaced SDenv$.SD to SDenv to deal with Bug #5007 reported by Ricardo (Nice catch!) - thisfun = paste0("..FUN", funi) # Fix for #985 - assign(thisfun,eval(fun, SDenv, SDenv), SDenv) # to avoid creating function() for each column of .SD - lockBinding(thisfun,SDenv) - txt[[1L]] = as.name(thisfun) - } else { - if (is.character(fun)) fun = as.name(fun) - txt[[1L]] = fun - } - ans = vector("list",length(ansvarsnew)+1L) - ans[[1L]] = as.name("list") - for (ii in seq_along(ansvarsnew)) { - txt[[2L]] = as.name(ansvarsnew[ii]) - ans[[ii+1L]] = as.call(txt) - } - jsub = as.call(ans) # important no names here - jvnames = ansvarsnew # but here instead - list(jsub, jvnames) - # It may seem inefficient to constuct a potentially long expression. But, consider calling - # lapply 100000 times. The C code inside lapply does the LCONS stuff anyway, every time it - # is called, involving small memory allocations. - # The R level lapply calls as.list which needs a shallow copy. - # lapply also does a setAttib of names (duplicating the same names over and over again - # for each group) which is terrible for our needs. We replace all that with a - # (ok, long, but not huge in memory terms) list() which is primitive (so avoids symbol - # lookup), and the eval() inside dogroups hardly has to do anything. All this results in - # overhead minimised. We don't need to worry about the env passed to the eval in a possible - # lapply replacement, or how to pass ... efficiently to it. - # Plus we optimize lapply first, so that mean() can be optimized too as well, next. - } - if (is.name(jsub)) { - if (jsub == ".SD") { - jsub = as.call(c(quote(list), lapply(ansvarsnew, as.name))) - jvnames = ansvarsnew - } - } else { - if ( length(jsub) == 3L && (jsub[[1L]] == "[" || jsub[[1L]] == "head" || jsub[[1L]] == "tail") && jsub[[2L]] == ".SD" && (is.numeric(jsub[[3L]]) || jsub[[3L]] == ".N") ) { - # optimise .SD[1] or .SD[2L]. Not sure how to test .SD[a] as to whether a is numeric/integer or a data.table, yet. - jsub = as.call(c(quote(list), lapply(ansvarsnew, function(x) { jsub[[2L]] = as.name(x); jsub }))) - jvnames = ansvarsnew - } else if (jsub[[1L]]=="lapply" && jsub[[2L]]==".SD" && length(xcols)) { - deparse_ans = .massageSD(jsub) - jsub = deparse_ans[[1L]] - jvnames = deparse_ans[[2L]] - } else if (jsub[[1L]] == "c" && length(jsub) > 1L) { - # TODO, TO DO: raise the checks for 'jvnames' earlier (where jvnames is set by checking 'jsub') and set 'jvnames' already. - # FR #2722 is just about optimisation of j=c(.N, lapply(.SD, .)) that is taken care of here. - # FR #735 tries to optimise j-expressions of the form c(...) as long as ... contains - # 1) lapply(.SD, ...), 2) simply .SD or .SD[..], 3) .N, 4) list(...) and 5) functions that normally return a single value* - # On 5)* the IMPORTANT point to note is that things that are not wrapped within "list(...)" should *always* - # return length 1 output for us to optimise. Else, there's no equivalent to optimising c(...) to list(...) AFAICT. - # One issue could be that these functions (e.g., mean) can be "re-defined" by the OP to produce a length > 1 output - # Of course this is worrying too much though. If the issue comes up, we'll just remove the relevant optimisations. - # For now, we optimise all functions mentioned in 'optfuns' below. - optfuns = c("max", "min", "mean", "length", "sum", "median", "sd", "var") - is_valid = TRUE - any_SD = FALSE - jsubl = as.list.default(jsub) - oldjvnames = jvnames - jvnames = NULL # TODO: not let jvnames grow, maybe use (number of lapply(.SD, .))*lenght(ansvarsnew) + other jvars ?? not straightforward. - # Fix for #744. Don't use 'i' in for-loops. It masks the 'i' from the input!! - for (i_ in 2L:length(jsubl)) { - this = jsub[[i_]] - if (is.name(this)) { - if (this == ".SD") { # optimise '.SD' alone - any_SD = TRUE - jsubl[[i_]] = lapply(ansvarsnew, as.name) - jvnames = c(jvnames, ansvarsnew) - } else if (this == ".N") { - # don't optimise .I in c(.SD, .I), it's length can be > 1 - # only c(.SD, list(.I)) should be optimised!! .N is always length 1. - jvnames = c(jvnames, gsub("^[.]([N])$", "\\1", this)) - } else { - # jvnames = c(jvnames, if (is.null(names(jsubl))) "" else names(jsubl)[i_]) - is_valid=FALSE - break - } - } else if (is.call(this)) { - if (this[[1L]] == "lapply" && this[[2L]] == ".SD" && length(xcols)) { - any_SD = TRUE - deparse_ans = .massageSD(this) - funi = funi + 1L # Fix for #985 - jsubl[[i_]] = as.list(deparse_ans[[1L]][-1L]) # just keep the '.' from list(.) - jvnames = c(jvnames, deparse_ans[[2L]]) - } else if (this[[1L]] == "list") { - # also handle c(lapply(.SD, sum), list()) - silly, yes, but can happen - if (length(this) > 1L) { - jl__ = as.list(jsubl[[i_]])[-1L] # just keep the '.' from list(.) - jn__ = if (is.null(names(jl__))) rep("", length(jl__)) else names(jl__) - idx = unlist(lapply(jl__, function(x) is.name(x) && x == ".I")) - if (any(idx)) jn__[idx & (jn__ == "")] = "I" - jvnames = c(jvnames, jn__) - jsubl[[i_]] = jl__ - } - } else if (is.call(this) && length(this) > 1L && as.character(this[[1L]]) %in% optfuns) { - jvnames = c(jvnames, if (is.null(names(jsubl))) "" else names(jsubl)[i_]) - } else if ( length(this) == 3L && (this[[1L]] == "[" || this[[1L]] == "head") && - this[[2L]] == ".SD" && (is.numeric(this[[3L]]) || this[[3L]] == ".N") ) { - # optimise .SD[1] or .SD[2L]. Not sure how to test .SD[a] as to whether a is numeric/integer or a data.table, yet. - any_SD = TRUE - jsubl[[i_]] = lapply(ansvarsnew, function(x) { this[[2L]] = as.name(x); this }) - jvnames = c(jvnames, ansvarsnew) - } else if (any(all.vars(this) == ".SD")) { - # TODO, TO DO: revisit complex cases (as illustrated below) - # complex cases like DT[, c(.SD[x>1], .SD[J(.)], c(.SD), a + .SD, lapply(.SD, sum)), by=grp] - # hard to optimise such cases (+ difficulty in counting exact columns and therefore names). revert back to no optimisation. - is_valid=FALSE - break - } else { # just to be sure that any other case (I've overlooked) runs smoothly, without optimisation - # TO DO, TODO: maybe a message/warning here so that we can catch the overlooked cases, if any? - is_valid=FALSE - break - } - } else { - is_valid = FALSE - break - } - } - if (!is_valid || !any_SD) { # restore if c(...) doesn't contain lapply(.SD, ..) or if it's just invalid - jvnames = oldjvnames # reset jvnames - jsub = oldjsub # reset jsub - jsubl = as.list.default(jsubl) # reset jsubl - } else { - setattr(jsubl, 'names', NULL) - jsub = as.call(unlist(jsubl, use.names=FALSE)) - jsub[[1L]] = quote(list) - } - } - } - if (verbose) { - if (!identical(oldjsub, jsub)) - cat("lapply optimization changed j from '",deparse(oldjsub),"' to '",deparse(jsub,width.cutoff=200L),"'\n",sep="") - else - cat("lapply optimization is on, j unchanged as '",deparse(jsub,width.cutoff=200L),"'\n",sep="") - } - dotN <- function(x) if (is.name(x) && x == ".N") TRUE else FALSE # For #5760 - # FR #971, GForce kicks in on all subsets, no joins yet. Although joins could work with - # nomatch=0L even now.. but not switching it on yet, will deal it separately. - if (getOption("datatable.optimize")>=2 && !is.data.table(i) && !byjoin && length(f__) && !length(lhs)) { - if (!length(ansvars) && !use.I) { - GForce = FALSE - if ( (is.name(jsub) && jsub == ".N") || (is.call(jsub) && length(jsub)==2L && jsub[[1L]] == "list" && jsub[[2L]] == ".N") ) { - GForce = TRUE - if (verbose) cat("GForce optimized j to '",deparse(jsub,width.cutoff=200L),"'\n",sep="") - } - } else { - # Apply GForce - gfuns = c("sum", "prod", "mean", "median", "var", "sd", ".N", "min", "max", "head", "last", "first", "tail", "[") # added .N for #5760 - .ok <- function(q) { - if (dotN(q)) return(TRUE) # For #5760 - cond = is.call(q) && as.character(q1 <- q[[1L]]) %chin% gfuns && !is.call(q[[2L]]) - # run GForce for simple f(x) calls and f(x, na.rm = TRUE)-like calls - ans = cond && (length(q)==2L || identical("na",substring(names(q)[3L], 1L, 2L))) - if (identical(ans, TRUE)) return(ans) - # otherwise there must be three arguments, and only in two cases -- - # 1) head/tail(x, 1) or 2) x[n], n>0 - ans = cond && length(q)==3L && - length(q3 <- q[[3L]])==1L && is.numeric(q3) && ( - (as.character(q1) %chin% c("head", "tail") && q3==1L) || - (as.character(q1) %chin% "[" && q3 > 0) ) - if (is.na(ans)) ans=FALSE - ans - } - if (jsub[[1L]]=="list") { - GForce = TRUE - for (ii in seq_along(jsub)[-1L]) if (!.ok(jsub[[ii]])) GForce = FALSE - } else GForce = .ok(jsub) - if (GForce) { - if (jsub[[1L]]=="list") - for (ii in seq_along(jsub)[-1L]) { - if (dotN(jsub[[ii]])) next; # For #5760 - jsub[[ii]][[1L]] = as.name(paste0("g", jsub[[ii]][[1L]])) - if (length(jsub[[ii]])==3L) jsub[[ii]][[3L]] = eval(jsub[[ii]][[3L]], parent.frame()) # tests 1187.2 & 1187.4 - } - else { - jsub[[1L]] = as.name(paste0("g", jsub[[1L]])) - if (length(jsub)==3L) jsub[[3L]] = eval(jsub[[3L]], parent.frame()) # tests 1187.3 & 1187.5 - } - if (verbose) cat("GForce optimized j to '",deparse(jsub,width.cutoff=200L),"'\n",sep="") - } else if (verbose) cat("GForce is on, left j unchanged\n"); - } - } - if (!GForce && !is.name(jsub)) { - # Still do the old speedup for mean, for now - nomeanopt=FALSE # to be set by .optmean() using <<- inside it - oldjsub = jsub - if (jsub[[1L]]=="list") { - for (ii in seq_along(jsub)[-1L]) { - if (dotN(jsub[[ii]])) next; # For #5760 - if (is.call(jsub[[ii]]) && jsub[[ii]][[1L]]=="mean") - jsub[[ii]] = .optmean(jsub[[ii]]) - } - } else if (jsub[[1L]]=="mean") { - jsub = .optmean(jsub) - } - if (nomeanopt) { - warning("Unable to optimize call to mean() and could be very slow. You must name 'na.rm' like that otherwise if you do mean(x,TRUE) the TRUE is taken to mean 'trim' which is the 2nd argument of mean. 'trim' is not yet optimized.",immediate.=TRUE) - } - if (verbose) { - if (!identical(oldjsub, jsub)) - cat("Old mean optimization changed j from '",deparse(oldjsub),"' to '",deparse(jsub,width.cutoff=200),"'\n",sep="") - else - cat("Old mean optimization is on, left j unchanged.\n") - } - assign("Cfastmean", Cfastmean, SDenv) - assign("mean", base::mean.default, SDenv) - # Old comments still here for now ... - # Here in case nomeanopt=TRUE or some calls to mean weren't detected somehow. Better but still slow. - # Maybe change to : - # assign("mean", fastmean, SDenv) # neater than the hard work above, but slower - # when fastmean can do trim. - } - } else if (verbose) { - if (getOption("datatable.optimize")<1) cat("All optimizations are turned off\n") - else cat("Optimization is on but left j unchanged (single plain symbol): '",deparse(jsub,width.cutoff=200),"'\n",sep="") - } - if (byjoin) { - groups = i - grpcols = leftcols # 'leftcols' are the columns in i involved in the join (either head of key(i) or head along i) - jiscols = chmatch(jisvars,names(i)) # integer() if there are no jisvars (usually there aren't, advanced feature) - xjiscols = chmatch(xjisvars, names(x)) - SDenv$.xSD = x[min(nrow(i), 1L), xjisvars, with=FALSE] - if (!missing(on)) o__ = xo else o__ = integer(0L) - } else { - groups = byval - grpcols = seq_along(byval) - jiscols = NULL # NULL rather than integer() is used in C to know when using by - xjiscols = NULL - } - lockBinding(".xSD", SDenv) - grporder = o__ - # for #971, added !GForce. if (GForce) we do it much more (memory) efficiently than subset of order vector below. - if (length(irows) && !isTRUE(irows) && !GForce) { - # fix for bug #2758. TO DO: provide a better error message - if (length(irows) > 1L && length(zo__ <- which(irows == 0)) > 0L) stop("i[", zo__[1L], "] is 0. While grouping, i=0 is allowed when it's the only value. When length(i) > 1, all i should be > 0.") - if (length(o__) && length(irows)!=length(o__)) stop("Internal error: length(irows)!=length(o__)") - o__ = if (length(o__)) irows[o__] # better do this once up front (even though another alloc) than deep repeated branch in dogroups.c - else irows - } # else grporder is left bound to same o__ memory (no cost of copy) - if (is.null(lhs)) cols=NULL - if (!length(f__)) { - # for consistency of empty case in test 184 - f__=len__=0L - } - if (verbose) {last.started.at=proc.time();cat("Making each group and running j (GForce ",GForce,") ... ",sep="");flush.console()} - if (GForce) { - thisEnv = new.env() # not parent=parent.frame() so that gsum is found - for (ii in ansvars) assign(ii, x[[ii]], thisEnv) - assign(".N", len__, thisEnv) # For #5760 - #fix for #1683 - if (use.I) assign(".I", seq_len(nrow(x)), thisEnv) - ans = gforce(thisEnv, jsub, o__, f__, len__, irows) # irows needed for #971. - gi = if (length(o__)) o__[f__] else f__ - g = lapply(grpcols, function(i) groups[[i]][gi]) - ans = c(g, ans) - } else { - ans = .Call(Cdogroups, x, xcols, groups, grpcols, jiscols, xjiscols, grporder, o__, f__, len__, jsub, SDenv, cols, newnames, !missing(on), verbose) - } - if (verbose) {cat(timetaken(last.started.at),"\n"); flush.console()} - # TO DO: xrows would be a better name for irows: irows means the rows of x that i joins to - # Grouping by i: icols the joins columns (might not need), isdcols (the non join i and used by j), all __ are length x - # Grouping by by: i is by val, icols NULL, o__ may be subset of x, f__ points to o__ (or x if !length o__) - # TO DO: setkey could mark the key whether it is unique or not. - - if (!is.null(lhs)) { - if (any(names(x)[cols] %chin% key(x))) - setkey(x,NULL) - # fixes #1479. Take care of secondary indices, TODO: cleaner way of doing this - attrs = attr(x, 'index') - skeys = names(attributes(attrs)) - if (!is.null(skeys)) { - hits = unlist(lapply(paste0("__", names(x)[cols]), function(x) grep(x, skeys))) - hits = skeys[unique(hits)] - for (i in seq_along(hits)) setattr(attrs, hits[i], NULL) # does by reference - } - if (!missing(keyby)) { - cnames = as.character(bysubl)[-1L] - if (all(cnames %chin% names(x))) { - if (verbose) {last.started.at=proc.time();cat("setkey() after the := with keyby= ... ");flush.console()} - setkeyv(x,cnames) # TO DO: setkey before grouping to get memcpy benefit. - if (verbose) {cat(timetaken(last.started.at),"\n"); flush.console()} - } - else warning(":= keyby not straightforward character column names or list() of column names, treating as a by:",paste(cnames,collapse=","),"\n") - } - return(suppPrint(x)) - } - if (is.null(ans)) { - ans = as.data.table.list(lapply(groups,"[",0L)) # side-effects only such as test 168 - setnames(ans,seq_along(bynames),bynames) # TO DO: why doesn't groups have bynames in the first place? - return(ans) - } - setattr(ans,"row.names",.set_row_names(length(ans[[1L]]))) - setattr(ans,"class",class(x)) # fix for #5296 - if (is.null(names(ans))) { - # Efficiency gain of dropping names has been successful. Ordinarily this will run. - if (is.null(jvnames)) jvnames = character(length(ans)-length(bynames)) - if (length(bynames)+length(jvnames)!=length(ans)) - stop("Internal error: jvnames is length ",length(jvnames), " but ans is ",length(ans)," and bynames is ", length(bynames)) - ww = which(jvnames=="") - if (any(ww)) jvnames[ww] = paste0("V",ww) - setattr(ans, "names", c(bynames, jvnames)) - } else { - setnames(ans,seq_along(bynames),bynames) # TO DO: reinvestigate bynames flowing from dogroups here and simplify - } - if (byjoin && !missing(keyby) && !bysameorder) { - if (verbose) {last.started.at=proc.time();cat("setkey() afterwards for keyby=.EACHI ... ");flush.console()} - setkeyv(ans,names(ans)[seq_along(byval)]) - if (verbose) {cat(timetaken(last.started.at),"\n"); flush.console()} - } else if (!missing(keyby) || (haskey(x) && bysameorder)) { - setattr(ans,"sorted",names(ans)[seq_along(grpcols)]) - } - alloc.col(ans) # TO DO: overallocate in dogroups in the first place and remove this line -} - -.optmean <- function(expr) { # called by optimization of j inside [.data.table only. Outside for a small speed advantage. - if (length(expr)==2L) # no parameters passed to mean, so defaults of trim=0 and na.rm=FALSE - return(call(".External",quote(Cfastmean),expr[[2L]], FALSE)) - # return(call(".Internal",expr)) # slightly faster than .External, but R now blocks .Internal in coerce.c from apx Sep 2012 - if (length(expr)==3L && identical("na",substring(names(expr)[3L], 1L, 2L))) # one parameter passed to mean() - return(call(".External",quote(Cfastmean),expr[[2L]], expr[[3L]])) # faster than .Call - assign("nomeanopt",TRUE,parent.frame()) - expr # e.g. trim is not optimized, just na.rm -} - -# [[.data.frame is now dispatched due to inheritance. -# The code below tried to avoid that but made things -# very slow (462 times faster down to 1 in the timings test). -# TO DO. Reintroduce velow but dispatch straight to -# .C("do_subset2") or better. Tests 604-608 test -# that this doesn't regress. - -#"[[.data.table" <- function(x,...) { -# if (!cedta()) return(`[[.data.frame`(x,...)) -# .subset2(x,...) -# #class(x)=NULL # awful, copy -# #x[[...]] -#} - -#"[[<-.data.table" <- function(x,i,j,value) { -# if (!cedta()) return(`[[<-.data.frame`(x,i,j,value)) -# if (!missing(j)) stop("[[i,j]] assignment not available in data.table, put assignment(s) in [i,{...}] instead, more powerful") -# cl = oldClass(x) # [[<-.data.frame uses oldClass rather than class, don't know why but we'll follow suit -# class(x) = NULL -# x[[i]] = value -# class(x) = cl -# x -#} - -as.matrix.data.table <- function(x, rownames, ...) { - rn <- NULL - rnc <- NULL - if (!missing(rownames)) { # Convert rownames to a column index if possible - if (length(rownames) == nrow(x)) { - # rownames argument is a vector of row names, no column in x to drop. - rn <- rownames - rnc <- NULL - } else if (!is.null(rownames) && length(rownames) != 1L) { # vector(0) will throw an error, but NULL will pass through - stop(sprintf("rownames must be a single column in x or a vector of row names of length nrow(x)=%d", nrow(x))) - } else if (!(is.null(rownames) || is.logical(rownames) || is.character(rownames) || is.numeric(rownames))) { - # E.g. because rownames is some sort of object that can't be converted to a column index - stop("rownames must be TRUE, a column index, a column name in x, or a vector of row names") - } else if (!is.null(rownames) && !is.na(rownames) && !identical(rownames, FALSE)) { # Handles cases where rownames is a column name, or key(x) from TRUE - if (identical(rownames, TRUE)) { - if (haskey(x)) { - rownames <- key(x) - if (length(rownames) > 1L) { - warning(sprintf("rownames is TRUE but multiple keys [%s] found for x; defaulting to first column x[,1]", - paste(rownames, collapse = ','), rownames[1L])) - rownames <- 1L - } - } else { - rownames <- 1L - } - } - if (is.character(rownames)) { - rnc <- chmatch(rownames, names(x)) - if (is.na(rnc)) stop(rownames, " is not a column of x") - } else { # rownames is an index already - if (rownames < 1L || rownames > ncol(x)) - stop(sprintf("rownames is %d which is outside the column number range [1,ncol=%d]", rownames, ncol(x))) - rnc <- rownames - } - } - } - # If the rownames argument has been used, and is a single column, - # extract that column's index (rnc) and drop it from x - if (!is.null(rnc)) { - rn <- x[[rnc]] - dm <- dim(x) - c(0, 1) - cn <- names(x)[-rnc] - X <- x[, .SD, .SDcols = cn] - } else { - dm <- dim(x) - cn <- names(x) - X <- x - } - if (any(dm == 0L)) - return(array(NA, dim = dm, dimnames = list(rn, cn))) - p <- dm[2L] - n <- dm[1L] - collabs <- as.list(cn) - class(X) <- NULL - non.numeric <- non.atomic <- FALSE - all.logical <- TRUE - for (j in seq_len(p)) { - if (is.ff(X[[j]])) X[[j]] <- X[[j]][] # to bring the ff into memory, since we need to create a matrix in memory - xj <- X[[j]] - if (length(dj <- dim(xj)) == 2L && dj[2L] > 1L) { - if (inherits(xj, "data.table")) - xj <- X[[j]] <- as.matrix(X[[j]]) - dnj <- dimnames(xj)[[2L]] - collabs[[j]] <- paste(collabs[[j]], if (length(dnj) > - 0L) - dnj - else seq_len(dj[2L]), sep = ".") - } - if (!is.logical(xj)) - all.logical <- FALSE - if (length(levels(xj)) > 0L || !(is.numeric(xj) || is.complex(xj) || is.logical(xj)) || - (!is.null(cl <- attr(xj, "class")) && any(cl %chin% - c("Date", "POSIXct", "POSIXlt")))) - non.numeric <- TRUE - if (!is.atomic(xj)) - non.atomic <- TRUE - } - if (non.atomic) { - for (j in seq_len(p)) { - xj <- X[[j]] - if (is.recursive(xj)) { } - else X[[j]] <- as.list(as.vector(xj)) - } - } - else if (all.logical) { } - else if (non.numeric) { - for (j in seq_len(p)) { - if (is.character(X[[j]])) next - xj <- X[[j]] - miss <- is.na(xj) - xj <- if (length(levels(xj))) as.vector(xj) else format(xj) - is.na(xj) <- miss - X[[j]] <- xj - } - } - X <- unlist(X, recursive = FALSE, use.names = FALSE) - dim(X) <- c(n, length(X)/n) - dimnames(X) <- list(rn, unlist(collabs, use.names = FALSE)) - X -} - -# bug #2375. fixed. same as head.data.frame and tail.data.frame to deal with negative indices -head.data.table <- function(x, n=6L, ...) { - if (!cedta()) return(NextMethod()) - stopifnot(length(n) == 1L) - i = seq_len(if (n<0L) max(nrow(x)+n, 0L) else min(n,nrow(x))) - x[i, , ] -} -tail.data.table <- function(x, n=6L, ...) { - if (!cedta()) return(NextMethod()) - stopifnot(length(n) == 1L) - n <- if (n<0L) max(nrow(x) + n, 0L) else min(n, nrow(x)) - i = seq.int(to=nrow(x), length.out=n) - x[i] -} - -"[<-.data.table" <- function (x, i, j, value) { - # [<- is provided for consistency, but := is preferred as it allows by group and by reference to subsets of columns - # with no copy of the (very large, say 10GB) columns at all. := is like an UPDATE in SQL and we like and want two symbols to change. - if (!cedta()) { - x = if (nargs()<4L) `[<-.data.frame`(x, i, value=value) - else `[<-.data.frame`(x, i, j, value) - return(alloc.col(x)) # over-allocate (again). Avoid all this by using :=. - } - # TO DO: warning("Please use DT[i,j:=value] syntax instead of DT[i,j]<-value, for efficiency. See ?':='") - if (!missing(i)) { - isub=substitute(i) - i = eval(.massagei(isub), x, parent.frame()) - if (is.matrix(i)) { - if (!missing(j)) stop("When i is matrix in DT[i]<-value syntax, it doesn't make sense to provide j") - x = `[<-.data.frame`(x, i, value=value) - return(alloc.col(x)) - } - i = x[i, which=TRUE] - # Tried adding ... after value above, and passing ... in here (e.g. for mult="first") but R CMD check - # then gives "The argument of a replacement function which corresponds to the right hand side must be - # named 'value'". So, users have to use := for that. - } else i = NULL # meaning (to C code) all rows, without allocating 1L:nrow(x) vector - if (missing(j)) j=names(x) - if (!is.atomic(j)) stop("j must be atomic vector, see ?is.atomic") - if (anyNA(j)) stop("NA in j") - if (is.character(j)) { - newnames = setdiff(j,names(x)) - cols = as.integer(chmatch(j, c(names(x),newnames))) - # We can now mix existing columns and new columns - } else { - if (!is.numeric(j)) stop("j must be vector of column name or positions") - if (any(j>ncol(x))) stop("Attempt to assign to column position greater than ncol(x). Create the column by name, instead. This logic intends to catch (most likely) user errors.") - cols = as.integer(j) # for convenience e.g. to convert 1 to 1L - newnames = NULL - } - reinstatekey=NULL - if (haskey(x) && identical(key(x),key(value)) && - identical(names(x),names(value)) && - is.sorted(i) && - identical(substitute(x),quote(`*tmp*`))) { - # DT["a",]$y <- 1.1 winds up creating `*tmp*` subset of rows and assigning _all_ the columns into x and - # over-writing the key columns with the same value (not just the single 'y' column). - # That isn't good for speed; it's an R thing. Solution is to use := instead to avoid all this, but user - # expects key to be retained in this case because _he_ didn't assign to a key column (the internal base R - # code did). - reinstatekey=key(x) - } - if (!selfrefok(x) || truelength(x) < ncol(x)+length(newnames)) { - x = alloc.col(x,length(x)+length(newnames)) # because [<- copies via *tmp* and main/duplicate.c copies at length but copies truelength over too - # search for one other .Call to assign in [.data.table to see how it differs - } - verbose=getOption("datatable.verbose") - x = .Call(Cassign,copy(x),i,cols,newnames,value,verbose) # From 3.1.0, DF[2,"b"] = 7 no longer copies DF$a (so in this [<-.data.table method we need to copy) - alloc.col(x) # can maybe avoid this realloc, but this is (slow) [<- anyway, so just be safe. - if (length(reinstatekey)) setkeyv(x,reinstatekey) - invisible(x) - # no copy at all if user calls directly; i.e. `[<-.data.table`(x,i,j,value) - # or uses data.table := syntax; i.e. DT[i,j:=value] - # but, there is one copy by R in [<- dispatch to `*tmp*`; i.e. DT[i,j]<-value. *Update: not from R > 3.0.2, yay* - # That copy is via main/duplicate.c which preserves truelength but copies length amount. Hence alloc.col(x,length(x)). - # No warn passed to assign here because we know it'll be copied via *tmp*. - # := allows subassign to a column with no copy of the column at all, and by group, etc. -} - -"$<-.data.table" <- function(x, name, value) { - if (!cedta()) { - ans = `$<-.data.frame`(x, name, value) - return(alloc.col(ans)) # over-allocate (again) - } - x = copy(x) - `[<-.data.table`(x,j=name,value=value) # important i is missing here -} - -as.data.frame.data.table <- function(x, ...) -{ - ans = copy(x) - setattr(ans,"row.names",.set_row_names(nrow(x))) # since R 2.4.0, data.frames can have non-character row names - setattr(ans,"class","data.frame") - setattr(ans,"sorted",NULL) # remove so if you convert to df, do something, and convert back, it is not sorted - setattr(ans,".internal.selfref",NULL) - # leave tl intact, no harm, - ans -} - -as.list.data.table <- function(x, ...) { - # Similar to as.list.data.frame in base. Although a data.table/frame is a list, too, it may be - # being coerced to raw list type (by calling code) so that "[" and "[[" work in their raw list form, - # such as lapply does for data.frame. So we do have to remove the class attributes (and thus shallow - # copy is almost instant way to achieve that, without risking compatibility). - #if (sys.call(-2L)[[1L]]=="lapply") - # return(x) - ans = shallow(x) - setattr(ans, "class", NULL) - setattr(ans, "row.names", NULL) - setattr(ans, "sorted", NULL) - setattr(ans,".internal.selfref", NULL) # needed to pass S4 tests for example - ans -} - - -dimnames.data.table <- function(x) { - if (!cedta()) { - if (!inherits(x, "data.frame")) - stop("data.table inherits from data.frame (from v1.5), but this data.table does not. Has it been created manually (e.g. by using 'structure' rather than 'data.table') or saved to disk using a prior version of data.table?") - return(`dimnames.data.frame`(x)) - } - list(NULL, names(x)) -} - -"dimnames<-.data.table" = function (x, value) # so that can do colnames(dt)=<..> as well as names(dt)=<..> -{ - if (!cedta()) return(`dimnames<-.data.frame`(x,value)) # won't maintain key column (if any). Revisit if ever causes a compatibility problem but don't think it's likely that packages change column names using dimnames<-. See names<-.data.table below. - if (!is.list(value) || length(value) != 2L) stop("attempting to assign invalid object to dimnames of a data.table") - if (!is.null(value[[1L]])) stop("data.tables do not have rownames") - if (ncol(x) != length(value[[2L]])) stop("can't assign",length(value[[2L]]),"colnames to a",ncol(x),"column data.table") - setnames(x,as.character(value[[2L]])) - x # this returned value is now shallow copied by R 3.1.0 via *tmp*. A very welcome change. -} - -"names<-.data.table" <- function(x,value) -{ - # When non data.table aware packages change names, we'd like to maintain the key. - # If call is names(DT)[2]="newname", R will call this names<-.data.table function (notice no i) with 'value' already prepared to be same length as ncol - x = shallow(x) # `names<-` should not modify by reference. Related to #1015, #476 and #825. Needed for R v3.1.0+. TO DO: revisit - if (is.null(value)) - setattr(x,"names",NULL) # e.g. plyr::melt() calls base::unname() - else - setnames(x,value) - x # this returned value is now shallow copied by R 3.1.0 via *tmp*. A very welcome change. -} - -within.data.table <- function (data, expr, ...) -# basically within.list but retains key (if any) -# will be slower than using := or a regular query (see ?within for further info). -{ - if (!cedta()) return(NextMethod()) - parent <- parent.frame() - e <- evalq(environment(), data, parent) - eval(substitute(expr), e) # might (and it's known that some user code does) contain rm() - l <- as.list(e) - l <- l[!vapply_1b(l, is.null)] - nD <- length(del <- setdiff(names(data), (nl <- names(l)))) - ans = copy(data) - if (length(nl)) ans[,nl] <- l - if (nD) ans[,del] <- NULL - if (haskey(data) && all(key(data) %chin% names(ans))) { - x = TRUE - for (i in key(data)) { - x = identical(data[[i]],ans[[i]]) - if (!x) break - } - if (x) setattr(ans,"sorted",key(data)) - } - ans -} - - -transform.data.table <- function (`_data`, ...) -# basically transform.data.frame with data.table instead of data.frame, and retains key -{ - if (!cedta()) return(NextMethod()) - e <- eval(substitute(list(...)), `_data`, parent.frame()) - tags <- names(e) - inx <- chmatch(tags, names(`_data`)) - matched <- !is.na(inx) - if (any(matched)) { - if (isTRUE(attr(`_data`, ".data.table.locked", TRUE))) setattr(`_data`, ".data.table.locked", NULL) # fix for #1641 - `_data`[,inx[matched]] <- e[matched] - `_data` <- data.table(`_data`) - } - if (!all(matched)) { - ans <- do.call("data.table", c(list(`_data`), e[!matched])) - } else { - ans <- `_data` - } - key.cols <- key(`_data`) - if (!any(tags %chin% key.cols)) { - setattr(ans, "sorted", key.cols) - } - ans -} - -subset.data.table <- function (x, subset, select, ...) -{ - key.cols <- key(x) - - if (missing(subset)) { - r <- TRUE - } else { - e <- substitute(subset) - r <- eval(e, x, parent.frame()) - if (!is.logical(r)) - stop("'subset' must evaluate to logical") - r <- r & !is.na(r) - } - - if (missing(select)) { - vars <- seq_len(ncol(x)) - } else { - nl <- as.list(seq_len(ncol(x))) - setattr(nl,"names",names(x)) - vars <- eval(substitute(select), nl, parent.frame()) # e.g. select=colF:colP - # #891 fix - don't convert numeric vars to column names - will break when there are duplicate columns - key.cols <- intersect(key.cols, names(x)[vars]) ## Only keep key.columns found in the select clause - } - - ans <- x[r, vars, with = FALSE] - - if (nrow(ans) > 0L) { - if (!missing(select) && length(key.cols)) { - ## Set the key on the returned data.table as long as the key - ## columns that "remain" are the same as the original, or a - ## prefix of it. - is.prefix <- all(key(x)[seq_len(length(key.cols))] == key.cols) - if (is.prefix) { - setattr(ans, "sorted", key.cols) - } - } - } else { - setkey(ans,NULL) - } - ans -} - -# Equivalent of 'rowSums(is.na(dt) > 0L)' but much faster and memory efficient. -# Also called "complete.cases" in base. Unfortunately it's not a S3 generic. -# Also handles bit64::integer64. TODO: export this? -# For internal use only. 'by' requires integer input. No argument checks here yet. -is_na <- function(x, by=seq_along(x)) .Call(Cdt_na, x, by) -any_na <- function(x, by=seq_along(x)) .Call(CanyNA, x, by) - -na.omit.data.table <- function (object, cols = seq_along(object), invert = FALSE, ...) { - # compare to stats:::na.omit.data.frame - if (!cedta()) return(NextMethod()) - if ( !missing(invert) && is.na(as.logical(invert)) ) - stop("Argument 'invert' must be logical TRUE/FALSE") - if (is.character(cols)) { - old = cols - cols = chmatch(cols, names(object), nomatch=0L) - if (any(cols==0L)) - stop("Columns ", paste(old[cols==0L], collapse=","), - " doesn't exist in the input data.table") - } - cols = as.integer(cols) - ix = .Call(Cdt_na, object, cols) - # forgot about invert with no NA case, #2660 - if (invert) { - if (all(ix)) object[0L] - else - .Call(CsubsetDT, object, which_(ix, bool = TRUE), seq_along(object)) - } else { - if (any(ix)) - .Call(CsubsetDT, object, which_(ix, bool = FALSE), seq_along(object)) - else object - } -} - -which_ <- function(x, bool = TRUE) { - # fix for #1467, quotes result in "not resolved in current namespace" error - .Call(Cwhichwrapper, x, bool) -} - -is.na.data.table <- function (x) { - if (!cedta()) return(`is.na.data.frame`(x)) - do.call("cbind", lapply(x, "is.na")) -} - -# not longer needed as inherits ... -# t.data.table <- t.data.frame -# Math.data.table <- Math.data.frame -# summary.data.table <- summary.data.frame - -Ops.data.table <- function(e1, e2 = NULL) -{ - ans = NextMethod() - if (cedta() && is.data.frame(ans)) - ans = as.data.table(ans) - ans -} - -split.data.table <- function(x, f, drop = FALSE, by, sorted = FALSE, keep.by = TRUE, flatten = TRUE, ..., verbose = getOption("datatable.verbose")) { - if (!is.data.table(x)) stop("x argument must be a data.table") - stopifnot(is.logical(drop), is.logical(sorted), is.logical(keep.by), is.logical(flatten)) - # split data.frame way, using `f` and not `by` argument - if (!missing(f)) { - if (!length(f) && nrow(x)) - stop("group length is 0 but data nrow > 0") - if (!missing(by)) - stop("passing 'f' argument together with 'by' is not allowed, use 'by' when split by column in data.table and 'f' when split by external factor") - # same as split.data.frame - handling all exceptions, factor orders etc, in a single stream of processing was a nightmare in factor and drop consistency - return(lapply(split(x = seq_len(nrow(x)), f = f, drop = drop, ...), function(ind) x[ind])) - } - if (missing(by)) stop("you must provide 'by' or 'f' arguments") - # check reserved column names during processing - if (".ll.tech.split" %in% names(x)) stop("column '.ll.tech.split' is reserved for split.data.table processing") - if (".nm.tech.split" %in% by) stop("column '.nm.tech.split' is reserved for split.data.table processing") - if (!all(by %in% names(x))) stop("argument 'by' must refer to data.table column names") - if (!all(by.atomic <- vapply_1b(by, function(.by) is.atomic(x[[.by]])))) stop(sprintf("argument 'by' must refer only to atomic type columns, classes of '%s' columns are not atomic type", paste(by[!by.atomic], collapse=", "))) - # list of data.tables (flatten) or list of lists of ... data.tables - make.levels = function(x, cols, sorted) { - by.order = if (!sorted) x[, funique(.SD), .SDcols=cols] # remember order of data, only when not sorted=FALSE - ul = lapply(setNames(cols, nm=cols), function(col) { - if (!is.factor(x[[col]])) unique(x[[col]]) else { - .x_lev = levels(x[[col]]) - #need to keep as a factor or order will be lost, #2082 - factor(.x_lev, levels = .x_lev) - } - }) - r = do.call("CJ", c(ul, sorted=sorted, unique=TRUE)) - if (!sorted && nrow(by.order)) { - ii = r[by.order, on=cols, which=TRUE] - r = rbindlist(list( - r[ii], # original order from data - r[-ii] # empty levels at the end - )) - } - r - } - .by = by[1L] - # this builds data.table call - is much more cleaner than handling each case one by one - dtq = as.list(call("[", as.name("x"))) - join = FALSE - flatten_any = flatten && any(vapply_1b(by, function(col) is.factor(x[[col]]))) - nested_current = !flatten && is.factor(x[[.by]]) - if (!drop && (flatten_any || nested_current)) { - dtq[["i"]] = substitute(make.levels(x, cols=.cols, sorted=.sorted), list(.cols=if (flatten) by else .by, .sorted=sorted)) - join = TRUE - } - dtq[["j"]] = substitute( - list(.ll.tech.split=list(.expr)), - list(.expr = if (join) quote(if(.N == 0L) .SD[0L] else .SD) else as.name(".SD")) # simplify when `nomatch` accept NULL #857 ? - ) - by.or.keyby = if (join) "by" else c("by"[!sorted], "keyby"[sorted])[1L] - dtq[[by.or.keyby]] = substitute( # retain order, for `join` and `sorted` it will use order of `i` data.table instead of `keyby`. - .expr, - list(.expr = if(join) as.name(".EACHI") else if (flatten) by else .by) - ) - dtq[[".SDcols"]] = if (keep.by) names(x) else setdiff(names(x), if (flatten) by else .by) - if (join) dtq[["on"]] = if (flatten) by else .by - dtq = as.call(dtq) - if (isTRUE(verbose)) cat("Processing split.data.table with: ", deparse(dtq, width.cutoff=500L), "\n", sep="") - tmp = eval(dtq) - # add names on list - setattr(ll <- tmp$.ll.tech.split, - "names", - as.character( - if (!flatten) tmp[[.by]] else tmp[, list(.nm.tech.split=paste(unlist(lapply(.SD, as.character)), collapse = ".")), by=by, .SDcols=by]$.nm.tech.split - )) - # handle nested split - if (flatten || length(by) == 1L) return( - lapply(lapply(ll, setattr, '.data.table.locked', NULL), setDT) # alloc.col could handle DT in list as done in: c9c4ff80bdd4c600b0c4eff23b207d53677176bd - ) else if (length(by) > 1L) return( - lapply(ll, split.data.table, drop=drop, by=by[-1L], sorted=sorted, keep.by=keep.by, flatten=flatten) - ) -} - -# TO DO, add more warnings e.g. for by.data.table(), telling user what the data.table syntax is but letting them dispatch to data.frame if they want - -copy <- function(x) { - newx = .Call(Ccopy,x) # copies at length but R's duplicate() also copies truelength over. - # TO DO: inside Ccopy it could reset tl to 0 or length, but no matter as selfrefok detects it - # TO DO: revisit duplicate.c in R 3.0.3 and see where it's at - if (!is.data.table(x)) { - # fix for #1476. TODO: find if a cleaner fix is possible.. - if (is.list(x)) { - anydt = vapply(x, is.data.table, TRUE, USE.NAMES=FALSE) - if (sum(anydt)) { - newx[anydt] = lapply(newx[anydt], function(x) { - setattr(x, ".data.table.locked", NULL) - alloc.col(x) - }) - } - } - return(newx) # e.g. in as.data.table.list() the list is copied before changing to data.table - } - setattr(newx,".data.table.locked",NULL) - alloc.col(newx) -} - -copyattr <- function(from, to) { - .Call(Ccopyattr, from, to) -} - -point <- function(to, to_idx, from, from_idx) { - .Call(CpointWrapper, to, to_idx, from, from_idx) -} - -.shallow <- function(x, cols = NULL, retain.key = FALSE, unlock = FALSE) { - isnull = is.null(cols) - if (!isnull) cols = validate(cols, x) # NULL is default = all columns - ans = .Call(Cshallowwrapper, x, cols) # copies VECSXP only - - if(retain.key){ - if (isnull) return(ans) # handle most frequent case first - ## get correct key if cols are present - cols = names(x)[cols] - keylength <- which.first(!key(ans) %chin% cols) - 1L - if (is.na(keylength)) keylength <- length(key(ans)) - if (!keylength) { - setattr(ans, "sorted", NULL) ## no key remaining - } else { - setattr(ans, "sorted", head(key(ans), keylength)) ## keep what can be kept - } - ## take care of attributes. - indices <- names(attributes(attr(ans, "index"))) - for(index in indices) { - indexcols <- strsplit(index, split = "__")[[1L]][-1L] - indexlength <- which.first(!indexcols %chin% cols) - 1L - if (is.na(indexlength)) next ## all columns are present, nothing to be done - reducedindex <- paste0("__", indexcols[seq_len(indexlength)], collapse="") ## the columns until the first missing from the new index - if (reducedindex %chin% indices || !indexlength) { - ## Either reduced index already present or no columns of the original index remain. - ## Drop the original index completely - setattr(attr(ans, "index", exact = TRUE), index, NULL) - } else if(length(attr(attr(ans, "index"), index))) { - ## index is not length 0. Drop it since shortening could lead to spurious reordering in discarded columns (#2336) - setattr(attr(ans, "index", exact = TRUE), index, NULL) - } else { - ## rename index to reducedindex - names(attributes(attr(ans, "index")))[names(attributes(attr(ans, "index"))) == index] <- reducedindex - } - } - } else { # retain.key == FALSE - setattr(ans, "sorted", NULL) - setattr(ans, "index", NULL) - } - if (unlock) setattr(ans, '.data.table.locked', NULL) - ans - -} - -shallow <- function(x, cols=NULL) { - if (!is.data.table(x)) - stop("x is not a data.table. Shallow copy is a copy of the vector of column pointers (only), so is only meaningful for data.table") - ans = .shallow(x, cols=cols, retain.key = TRUE) - ans -} - -alloc.col <- function(DT, n=getOption("datatable.alloccol"), verbose=getOption("datatable.verbose")) -{ - name = substitute(DT) - if (identical(name,quote(`*tmp*`))) stop("alloc.col attempting to modify `*tmp*`") - ans = .Call(Calloccolwrapper, DT, length(DT)+as.integer(eval(n)), verbose) - if (is.name(name)) { - name = as.character(name) - assign(name,ans,parent.frame(),inherits=TRUE) - } - .Call(Csetmutable,ans) -} - -selfrefok <- function(DT,verbose=getOption("datatable.verbose")) { - .Call(Cselfrefokwrapper,DT,verbose) -} - -truelength <- function(x) .Call(Ctruelength,x) -# deliberately no "truelength<-" method. alloc.col is the mechanism for that. -# settruelength() no longer need (and so removed) now that data.table depends on R 2.14.0 -# which initializes tl to zero rather than leaving uninitialized. - -setattr <- function(x,name,value) { - # Wrapper for setAttrib internal R function - # Sets attribute by reference (no copy) - # Named setattr (rather than setattrib) at R level to more closely resemble attr<- - # And as from 1.7.8 is made exported in NAMESPACE for use in user attributes. - # User can also call `attr<-` function directly, but that copies (maybe just when NAMED>0, which is always for data.frame, I think). See "Confused by NAMED" thread on r-devel 24 Nov 2011. - # We tend to use setattr() internally in data.table.R because often we construct a data.table and it hasn't - # got names yet. setnames() is the user interface which checks integrity and doesn't let you drop names for example. - if (name=="names" && is.data.table(x) && length(attr(x,"names")) && !is.null(value)) - setnames(x,value) - # Using setnames here so that truelength of names can be retained, to carry out integrity checks such as not - # creating names longer than the number of columns of x, and to change the key, too - # For convenience so that setattr(DT,"names",allnames) works as expected without requiring a switch to setnames. - else { - ans = .Call(Csetattrib, x, name, value) - # If name=="names" and this is the first time names are assigned (e.g. in data.table()), this will be grown by alloc.col very shortly afterwards in the caller. - if (!is.null(ans)) { - warning("Input is a length=1 logical that points to the same address as R's global value. Therefore the attribute has not been set by reference, rather on a copy. You will need to assign the result back to a variable. See issue #1281.") - x = ans - } - } - # fix for #1142 - duplicated levels for factors - if (name == "levels" && is.factor(x) && anyDuplicated(value)) - .Call(Csetlevels, x, (value <- as.character(value)), unique(value)) - invisible(x) -} - -setnames <- function(x,old,new) { - # Sets by reference, maintains truelength, no copy of table at all. - # But also more convenient than names(DT)[i]="newname" because we can also do setnames(DT,"oldname","newname") - # without an onerous match() ourselves. old can be positions, too, but we encourage by name for robustness. - if (!is.data.frame(x)) stop("x is not a data.table or data.frame") - if (length(names(x)) != length(x)) stop("dt is length ",length(dt)," but its names are length ",length(names(x))) - if (missing(new)) { - # for setnames(DT,new); e.g., setnames(DT,c("A","B")) where ncol(DT)==2 - if (!is.character(old)) stop("Passed a vector of type '",typeof(old),"'. Needs to be type 'character'.") - if (length(old) != ncol(x)) stop("Can't assign ",length(old)," names to a ",ncol(x)," column data.table") - nx <- names(x) - # note that duplicate names are permitted to be created in this usage only - if (anyNA(nx)) { - # if x somehow has some NA names, which() needs help to return them, #2475 - w = which((nx != old) | (is.na(nx) & !is.na(old))) - } else { - w = which(nx != old) - } - if (!length(w)) return(invisible(x)) # no changes - new = old[w] - i = w - } else { - if (missing(old)) stop("When 'new' is provided, 'old' must be provided too") - if (!is.character(new)) stop("'new' is not a character vector") - if (is.numeric(old)) { - if (length(sgn <- unique(sign(old))) != 1L) - stop("Items of 'old' is numeric but has both +ve and -ve indices.") - tt = abs(old)<1L | abs(old)>length(x) | is.na(old) - if (any(tt)) stop("Items of 'old' either NA or outside range [1,",length(x),"]: ",paste(old[tt],collapse=",")) - i = if (sgn == 1L) as.integer(old) else seq_along(x)[as.integer(old)] - if (any(duplicated(i))) stop("Some duplicates exist in 'old': ",paste(i[duplicated(i)],collapse=",")) - } else { - if (!is.character(old)) stop("'old' is type ",typeof(old)," but should be integer, double or character") - if (any(duplicated(old))) stop("Some duplicates exist in 'old': ", paste(old[duplicated(old)],collapse=",")) - i = chmatch(old,names(x)) - if (anyNA(i)) stop("Items of 'old' not found in column names: ",paste(old[is.na(i)],collapse=",")) - if (any(tt<-!is.na(chmatch(old,names(x)[-i])))) stop("Some items of 'old' are duplicated (ambiguous) in column names: ",paste(old[tt],collapse=",")) - } - if (length(new)!=length(i)) stop("'old' is length ",length(i)," but 'new' is length ",length(new)) - } - # update the key if the column name being change is in the key - m = chmatch(names(x)[i], key(x)) - w = which(!is.na(m)) - if (length(w)) - .Call(Csetcharvec, attr(x,"sorted"), m[w], new[w]) - - # update secondary keys - idx = attr(x,"index") - for (k in names(attributes(idx))) { - tt = strsplit(k,split="__")[[1L]][-1L] - m = chmatch(names(x)[i], tt) - w = which(!is.na(m)) - if (length(w)) { - tt[m[w]] = new[w] - newk = paste0("__",tt,collapse="") - setattr(idx, newk, attr(idx, k)) - setattr(idx, k, NULL) - } - } - - .Call(Csetcharvec, attr(x,"names"), as.integer(i), new) - invisible(x) -} - -setcolorder <- function(x, neworder) -{ - if (any(duplicated(neworder))) stop("neworder contains duplicates") - # if (!is.data.table(x)) stop("x is not a data.table") - if (length(neworder) != length(x)) { - if (length(neworder) > length(x)) - stop("neworder is length ", length(neworder), - " but x has only ", length(x), " columns.") - #if shorter than length(x), pad by the missing - # elements (checks below will catch other mistakes) - neworder = c(neworder, setdiff(if (is.character(neworder)) names(x) - else seq_along(x), neworder)) - } - if (is.character(neworder)) { - if (any(duplicated(names(x)))) stop("x has some duplicated column name(s): ", paste(names(x)[duplicated(names(x))], collapse=","), ". Please remove or rename the duplicate(s) and try again.") - o = as.integer(chmatch(neworder, names(x))) - if (anyNA(o)) stop("Names in neworder not found in x: ", paste(neworder[is.na(o)], collapse=",")) - } else { - if (!is.numeric(neworder)) stop("neworder is not a character or numeric vector") - o = as.integer(neworder) - m = !(o %in% seq_len(length(x))) - if (any(m)) stop("Column numbers in neworder out of bounds: ", paste(o[m], collapse=",")) - } - .Call(Csetcolorder, x, o) - invisible(x) -} - -set <- function(x,i=NULL,j,value) # low overhead, loopable -{ - if (is.atomic(value)) { - # protect NAMED of atomic value from .Call's NAMED=2 by wrapping with list() - l = vector("list", 1L) - .Call(Csetlistelt,l,1L,value) # to avoid the copy by list() in R < 3.1.0 - value = l - } - .Call(Cassign,x,i,j,NULL,value,FALSE) # verbose=FALSE for speed to avoid getOption() TO DO: somehow read getOption("datatable.verbose") from C level - invisible(x) -} - -chmatch <- function(x,table,nomatch=NA_integer_) - .Call(Cchmatchwrapper,x,table,as.integer(nomatch[1L]),FALSE) # [1L] to fix #1672 - -"%chin%" <- function(x,table) { - # TO DO if table has 'ul' then match to that - .Call(Cchmatchwrapper,x,table,NA_integer_,TRUE) -} - -chorder <- function(x) { - o = forderv(x, sort=TRUE, retGrp=FALSE) - if (length(o)) o else seq_along(x) -} - -chgroup <- function(x) { - # TO DO: deprecate and remove this. It's exported but doubt anyone uses it. Think the plan was to use it internally, but forderv superceded. - o = forderv(x, sort=FALSE, retGrp=TRUE) - if (length(o)) as.vector(o) else seq_along(x) # as.vector removes the attributes -} - - -.rbind.data.table <- function(..., use.names=TRUE, fill=FALSE, idcol=NULL) { - # See FAQ 2.23 - # Called from base::rbind.data.frame - # fix for #1626.. because some packages (like psych) bind an input - # data.frame/data.table with a matrix.. - l = lapply(list(...), function(x) if (is.list(x)) x else as.data.table(x)) - rbindlist(l, use.names, fill, idcol) -} - -rbindlist <- function(l, use.names=fill, fill=FALSE, idcol=NULL) { - if (identical(idcol, FALSE)) idcol = NULL - else if (!is.null(idcol)) { - if (isTRUE(idcol)) idcol = ".id" - if (!is.character(idcol)) stop("idcol must be a logical or character vector of length 1. If logical TRUE the id column will named '.id'.") - idcol = idcol[1L] - } - # fix for #1467, quotes result in "not resolved in current namespace" error - ans = .Call(Crbindlist, l, use.names, fill, idcol) - if (!length(ans)) return(null.data.table()) - setDT(ans)[] -} - -vecseq <- function(x,y,clamp) .Call(Cvecseq,x,y,clamp) - -# .Call(Caddress, x) increments NAM() when x is vector with NAM(1). Referring object within non-primitive function is enough to increment reference. -address <- function(x) .Call(Caddress, eval(substitute(x), parent.frame())) - -":=" <- function(...) stop('Check that is.data.table(DT) == TRUE. Otherwise, := and `:=`(...) are defined for use in j, once only and in particular ways. See help(":=").') - -setDF <- function(x, rownames=NULL) { - if (!is.list(x)) stop("setDF only accepts data.table, data.frame or list of equal length as input") - if (any(duplicated(rownames))) stop("rownames contains duplicates") - if (is.data.table(x)) { - # copied from as.data.frame.data.table - if (is.null(rownames)) { - rn <- .set_row_names(nrow(x)) - } else { - if (length(rownames) != nrow(x)) - stop("rownames incorrect length; expected ", nrow(x), " names, got ", length(rownames)) - rn <- rownames - } - setattr(x, "row.names", rn) - setattr(x, "class", "data.frame") - setattr(x, "sorted", NULL) - setattr(x, ".internal.selfref", NULL) - } else if (is.data.frame(x)) { - if (!is.null(rownames)) { - if (length(rownames) != nrow(x)) - stop("rownames incorrect length; expected ", nrow(x), " names, got ", length(rownames)) - setattr(x, "row.names", rownames) - } - x - } else { - n = vapply(x, length, 0L) - mn = max(n) - if (any(n 0) return(invisible(x)) else alloc.col(x) - } else if (is.data.frame(x)) { - rn = if (!identical(keep.rownames, FALSE)) rownames(x) else NULL - setattr(x, "row.names", .set_row_names(nrow(x))) - if (check.names) setattr(x, "names", make.names(names(x), unique=TRUE)) - # fix for #1078 and #1128, see .resetclass() for explanation. - setattr(x, "class", .resetclass(x, 'data.frame')) - alloc.col(x) - if (!is.null(rn)) { - nm = c(if (is.character(keep.rownames)) keep.rownames[1L] else "rn", names(x)) - x[, (nm[1L]) := rn] - setcolorder(x, nm) - } - } else if (is.null(x) || (is.list(x) && !length(x))) { - x = null.data.table() - } else if (is.list(x)) { - # copied from as.data.table.list - except removed the copy - for (i in seq_along(x)) { - if (inherits(x[[i]], "POSIXlt")) - stop("Column ", i, " is of POSIXlt type. Please convert it to POSIXct using as.POSIXct and run setDT again. We do not recommend use of POSIXlt at all because it uses 40 bytes to store one date.") - } - n = vapply(x, length, 0L) - mn = max(n) - if (any(n 1L && prod(vapply(i, length, integer(1L))) > 1e4){ - ## CJ would result in more than 1e4 rows. This would be inefficient, especially memory-wise #2635 - if (verbose) {cat("Subsetting optimization disabled because the cross-product of RHS values exceeds 1e4, causing memory problems.\n");flush.console()} - return(NULL) - } - ## Care is needed with names as we construct i - ## with 'CJ' and 'do.call' and this would cause problems if colNames were 'sorted' or 'unique' - ## as these two would be interpreted as args for CJ - colNames <- names(i) - names(i) <- NULL - i$sorted <- FALSE - i$unique <- TRUE - i <- do.call(CJ, i) - setnames(i, colNames) - idx <- NULL - if(is.null(idx)){ - ## check whether key fits the columns in i. - ## order of key columns makes no difference, as long as they are all upfront in the key, I believe. - if (all(names(i) %chin% head(key(x), length(i)))){ - if (verbose) {cat("Optimized subsetting with key '", paste0( head(key(x), length(i)), collapse = ", "),"'\n",sep="");flush.console()} - idx <- integer(0L) ## integer(0L) not NULL! Indicates that x is ordered correctly. - idxCols <- head(key(x), length(i)) ## in correct order! - } - } - if (is.null(idx)){ - if (!getOption("datatable.use.index")) return(NULL) # #1422 - ## check whether an exising index can be used - ## An index can be used if it corresponds exactly to the columns in i (similar to the key above) - candidates <- indices(x, vectors = TRUE) - idx <- NULL - for (cand in candidates){ - if (all(names(i) %chin% cand) && length(cand) == length(i)){ - idx <- attr(attr(x, "index"), paste0("__", cand, collapse = "")) - idxCols <- cand - break - } - } - if (!is.null(idx)){ - if (verbose) {cat("Optimized subsetting with index '", paste0( idxCols, collapse = "__"),"'\n",sep="");flush.console()} - } - } - if (is.null(idx)){ - ## if nothing else helped, auto create a new index that can be used - if (!getOption("datatable.auto.index")) return(NULL) - if (verbose) {cat("Creating new index '", paste0(names(i), collapse = "__"),"'\n",sep="");flush.console()} - if (verbose) {last.started.at=proc.time();cat("Creating index", paste0(names(i), collapse = "__"), "done in ... ");flush.console()} - setindexv(x, names(i)) - if (verbose) {cat(timetaken(last.started.at),"\n");flush.console()} - if (verbose) {cat("Optimized subsetting with index '", paste0(names(i), collapse = "__"),"'\n",sep="");flush.console()} - idx <- attr(attr(x, "index"), paste0("__", names(i), collapse = "")) - idxCols <- names(i) - } - if(!is.null(idxCols)){ - setkeyv(i, idxCols) - on <- on[idxCols] ## make sure 'on' is in the correct order. Otherwise the logic won't recognise that a key / index already exists. - } - return(list(i = i, - on = on, - notjoin = notjoin - ) - ) -} diff --git a/R/duplicated.R b/R/duplicated.R deleted file mode 100644 index 6e56b5aba1..0000000000 --- a/R/duplicated.R +++ /dev/null @@ -1,160 +0,0 @@ - -warning_oldUniqueByKey = "The deprecated option 'datatable.old.unique.by.key' is being used. Please stop using it and pass 'by=key(DT)' instead for clarity. For more information please search the NEWS file for this option." - -duplicated.data.table <- function(x, incomparables=FALSE, fromLast=FALSE, by=seq_along(x), ...) { - if (!cedta()) return(NextMethod("duplicated")) - if (!identical(incomparables, FALSE)) { - .NotYetUsed("incomparables != FALSE") - } - if (missing(by) && isTRUE(getOption("datatable.old.unique.by.key"))) { #1284 - by = key(x) - warning(warning_oldUniqueByKey) - } - if (nrow(x) == 0L || ncol(x) == 0L) return(logical(0L)) # fix for bug #5582 - if (is.na(fromLast) || !is.logical(fromLast)) stop("'fromLast' must be TRUE or FALSE") - query <- .duplicated.helper(x, by) - # fix for bug #5405 - unique on null data table returns error (because of 'forderv') - # however, in this case we can bypass having to go to forderv at all. - if (!length(query$by)) return(logical(0L)) - - if (query$use.keyprefix) { - f = uniqlist(shallow(x, query$by)) - if (fromLast) f = cumsum(uniqlengths(f, nrow(x))) - } else { - o = forderv(x, by=query$by, sort=FALSE, retGrp=TRUE) - if (attr(o, 'maxgrpn') == 1L) return(rep.int(FALSE, nrow(x))) - f = attr(o,"starts") - if (fromLast) f = cumsum(uniqlengths(f, nrow(x))) - if (length(o)) f = o[f] - } - res <- rep.int(TRUE, nrow(x)) - res[f] = FALSE - res -} - -unique.data.table <- function(x, incomparables=FALSE, fromLast=FALSE, by=seq_along(x), ...) { - if (!cedta()) return(NextMethod("unique")) - if (!identical(incomparables, FALSE)) { - .NotYetUsed("incomparables != FALSE") - } - if (nrow(x) <= 1L) return(x) - if (missing(by) && isTRUE(getOption("datatable.old.unique.by.key"))) { - by = key(x) - warning(warning_oldUniqueByKey) - } else if (is.null(by)) by=seq_along(x) - o = forderv(x, by=by, sort=FALSE, retGrp=TRUE) - # if by=key(x), forderv tests for orderedness within it quickly and will short-circuit - # there isn't any need in unique() to call uniqlist like duplicated does; uniqlist retuns a new nrow(x) vector anyway and isn't - # as efficient as forderv returning empty o when input is already ordered - if (attr(o, 'maxgrpn') == 1L) return(x) # avoid copy. Oftentimes, user just wants to check DT is unique with perhaps nrow(unique(DT))==nrow(DT) - f = attr(o,"starts") - if (fromLast) f = cumsum(uniqlengths(f, nrow(x))) - if (length(o)) f = o[f] - if (length(o <- forderv(f))) f = f[o] # don't sort the uniques too - .Call(CsubsetDT, x, f, seq_len(ncol(x))) - # TO DO: allow by=NULL to mean all, for further speed gain. - # See news for v1.9.3 for link to benchmark use-case on datatable-help. -} - -# Test for #2013 unique() memory efficiency improvement in v1.10.5 -# set.seed(1) -# Create unique 7.6GB DT on 16GB laptop -# DT = data.table( -# A = sample(1e8, 2e8, TRUE), -# B = sample(1e8, 2e8, TRUE), -# C = 1:2e8, -# D = 1:2e8, -# E = 1:2e8, -# F = 1:2e8, -# G = 1:2e8, -# H = 1:2e8, -# I = 1:2e8, -# J = 1:2e8 -# ) -# print(dim(unique(DT))) # works now, failed with oom in 1.10.4-3 - - -## Specify the column names to be used in the uniqueness query, and if this -## query can take advantage of the keys of `x` (if present). -## returns a list -## -## This was dropped into a helper because initial implementation of -## unique.data.table and duplicated.data.table both needed this. However, -## unique.data.table has been refactored to simply call duplicated.data.table -## making the refactor unnecessary, but let's leave it here just in case -.duplicated.helper <- function(x, by) { - use.sub.cols <- !is.null(by) # && !isTRUE(by) # Fixing bug #5424 - - if (use.sub.cols) { - ## Did the user specify (integer) indexes for the columns? - if (is.numeric(by)) { - if (any(as.integer(by) != by) || any(by<1L) || any(by>ncol(x))) { - stop("Integer values between 1 and ncol are required for 'by' when ", - "column indices. It's often better to use column names.") - } - by <- names(x)[by] - } - if (!is.character(by)) { - stop("Only NULL, column indices or column names are allowed in by") - } - bad.cols <- setdiff(by, names(x)) - if (length(bad.cols)) { - stop("by specifies column names that do not exist. First 5: ",paste(head(bad.cols,5),collapse=",")) - } - - use.keyprefix = haskey(x) && - length(by) <= length(key(x)) && - all(head(key(x), length(by)) == by) - } else { - ## by is not was explicitly set to - use.keyprefix = FALSE - by = names(x) - } - - list(use.keyprefix=use.keyprefix, by=by) -} - -# FR #5172 anyDuplicated.data.table -# Note that base's anyDuplicated is faster than any(duplicated(.)) (for vectors) - for data.frames it still pastes before calling duplicated -# In that sense, this anyDuplicated is *not* the same as base's - meaning it's not a different implementation -# This is just a wrapper. That being said, it should be incredibly fast on data.tables (due to data.table's fast forder) -anyDuplicated.data.table <- function(x, incomparables=FALSE, fromLast=FALSE, by=seq_along(x), ...) { - if (!cedta()) return(NextMethod("anyDuplicated")) - if (missing(by) && isTRUE(getOption("datatable.old.unique.by.key"))) { - by = key(x) - warning(warning_oldUniqueByKey) - } - dups <- duplicated(x, incomparables, fromLast, by, ...) - if (fromLast) idx = tail(which(dups), 1L) else idx = head(which(dups), 1L) - if (!length(idx)) idx=0L - idx -} - -# simple straightforward helper function to get the number -# of groups in a vector or data.table. Here by data.table, -# we really mean `.SD` - used in a grouping operation -# TODO: optimise uniqueN further with GForce. -uniqueN <- function(x, by = if (is.list(x)) seq_along(x) else NULL, na.rm=FALSE) { # na.rm, #1455 - if (missing(by) && is.data.table(x) && isTRUE(getOption("datatable.old.unique.by.key"))) { - by = key(x) - warning(warning_oldUniqueByKey) - } - if (is.null(x)) return(0L) - if (!is.atomic(x) && !is.data.frame(x)) - stop("x must be an atomic vector or data.frames/data.tables") - if (is.atomic(x)) { - if (is.logical(x)) return(.Call(CuniqueNlogical, x, na.rm=na.rm)) - x = as_list(x) - } - if (is.null(by)) by = seq_along(x) - o = forderv(x, by=by, retGrp=TRUE, na.last=if (!na.rm) FALSE else NA) - starts = attr(o, 'starts') - if (!na.rm) { - length(starts) - } else { - # TODO: internal efficient sum - # fix for #1771, account for already sorted input - sum( (if (length(o)) o[starts] else starts) != 0L) - } -} - diff --git a/R/fcast.R b/R/fcast.R deleted file mode 100644 index d398f8ea05..0000000000 --- a/R/fcast.R +++ /dev/null @@ -1,233 +0,0 @@ -guess <- function(x) { - if ("value" %chin% names(x)) - return("value") - if ("(all)" %chin% names(x)) - return("(all)") - var <- names(x)[ncol(x)] - message("Using '", var, "' as value column. Use 'value.var' to override") - return(var) -} - -dcast <- function(data, formula, fun.aggregate = NULL, ..., margins = NULL, - subset = NULL, fill = NULL, value.var = guess(data)) { - if (is.data.table(data)) - UseMethod("dcast", data) - else - reshape2::dcast(data, formula, fun.aggregate = fun.aggregate, ..., margins = margins, - subset = subset, fill = fill, value.var = value.var) -} - -check_formula <- function(formula, varnames, valnames) { - if (is.character(formula)) formula = as.formula(formula) - if (class(formula) != "formula" || length(formula) != 3L) - stop("Invalid formula. Cast formula should be of the form LHS ~ RHS, for e.g., a + b ~ c.") - vars = all.vars(formula) - vars = vars[!vars %chin% c(".", "...")] - allvars = c(vars, valnames) - if (any(allvars %in% varnames[duplicated(varnames)])) - stop('data.table to cast must have unique column names') - ans = deparse_formula(as.list(formula)[-1L], varnames, allvars) -} - -deparse_formula <- function(expr, varnames, allvars) { - lvars = lapply(expr, function(this) { - if (is.call(this)) { - if (this[[1L]] == quote(`+`)) - unlist(deparse_formula(as.list(this)[-1L], varnames, allvars)) - else this - } else if (is.name(this)) { - if (this == quote(`...`)) { - subvars = setdiff(varnames, allvars) - lapply(subvars, as.name) - } else this - } - }) - lvars = lapply(lvars, function(x) if (length(x) && !is.list(x)) list(x) else x) -} - -value_vars <- function(value.var, varnames) { - if (is.character(value.var)) - value.var = list(value.var) - value.var = lapply(value.var, unique) - valnames = unique(unlist(value.var)) - iswrong = which(!valnames %in% varnames) - if (length(iswrong)) - stop("value.var values [", paste(value.var[iswrong], collapse=", "), "] are not found in 'data'.") - value.var -} - -aggregate_funs <- function(funs, vals, sep="_", ...) { - if (is.call(funs) && funs[[1L]] == "eval") - funs = eval(funs[[2L]], parent.frame(2L), parent.frame(2L)) - if (is.call(funs) && as.character(funs[[1L]]) %in% c("c", "list")) - funs = lapply(as.list(funs)[-1L], function(x) { - if (is.call(x) && as.character(x[[1L]]) %in% c("c", "list")) as.list(x)[-1L] else x - }) - else funs = list(funs) - if (length(funs) != length(vals)) { - if (length(vals) == 1L) - vals = replicate(length(funs), vals) - else stop("When 'fun.aggregate' and 'value.var' are both lists, 'value.var' must be either of length =1 or =length(fun.aggregate).") - } - only_one_fun = length(unlist(funs)) == 1L - dots = list(...) - construct_funs <- function(fun, val) { - if (!is.list(fun)) fun = list(fun) - ans = vector("list", length(fun)*length(val)) - nms = vector("character", length(ans)) - k = 1L - for (i in fun) { - for (j in val) { - expr = list(i, as.name(j)) - if (length(dots)) - expr = c(expr, dots) - ans[[k]] = as.call(expr) - # changed order of arguments here, #1153 - nms[k] = if (only_one_fun) j else - paste(j, all.names(i, max.names=1L, functions=TRUE), sep=sep) - k = k+1L; - } - } - setattr(ans, 'names', nms) - } - ans = mapply(construct_funs, funs, vals, SIMPLIFY=FALSE) - as.call(c(quote(list), unlist(ans))) -} - -dcast.data.table <- function(data, formula, fun.aggregate = NULL, sep = "_", ..., margins = NULL, subset = NULL, fill = NULL, drop = TRUE, value.var = guess(data), verbose = getOption("datatable.verbose")) { - if (!is.data.table(data)) stop("'data' must be a data.table.") - drop = as.logical(rep(drop, length.out=2L)) - if (anyNA(drop)) stop("'drop' must be logical TRUE/FALSE") - lvals = value_vars(value.var, names(data)) - valnames = unique(unlist(lvals)) - lvars = check_formula(formula, names(data), valnames) - lvars = lapply(lvars, function(x) if (!length(x)) quote(`.`) else x) - # tired of lapply and the way it handles environments! - allcols = c(unlist(lvars), lapply(valnames, as.name)) - dat = vector("list", length(allcols)) - for (i in seq_along(allcols)) { - x = allcols[[i]] - dat[[i]] = if (identical(x, quote(`.`))) rep(".", nrow(data)) - else eval(x, data, parent.frame()) - if (is.function(dat[[i]])) - stop("Column [", deparse(x), "] not found or of unknown type.") - } - setattr(lvars, 'names', c("lhs", "rhs")) - # Have to take care of duplicate names, and provide names for expression columns properly. - varnames = make.unique(vapply_1c(unlist(lvars), all.vars, max.names=1L), sep=sep) - dupidx = which(valnames %in% varnames) - if (length(dupidx)) { - dups = valnames[dupidx] - valnames = tail(make.unique(c(varnames, valnames)), -length(varnames)) - lvals = lapply(lvals, function(x) { x[x %in% dups] = valnames[dupidx]; x }) - } - lhsnames = head(varnames, length(lvars$lhs)) - rhsnames = tail(varnames, -length(lvars$lhs)) - setattr(dat, 'names', c(varnames, valnames)) - setDT(dat) - if (any(vapply_1b(as.list(dat)[varnames], is.list))) { - stop("Columns specified in formula can not be of type list") - } - m <- as.list(match.call()[-1L]) - subset <- m[["subset"]][[2L]] - if (!is.null(subset)) { - if (is.name(subset)) subset = as.call(list(quote(`(`), subset)) - idx = which(eval(subset, data, parent.frame())) # any advantage thro' secondary keys? - dat = .Call(CsubsetDT, dat, idx, seq_along(dat)) - } - if (!nrow(dat) || !ncol(dat)) stop("Can not cast an empty data.table") - fun.call = m[["fun.aggregate"]] - fill.default = NULL - if (is.null(fun.call)) { - oo = forderv(dat, by=varnames, retGrp=TRUE) - if (attr(oo, 'maxgrpn') > 1L) { - message("Aggregate function missing, defaulting to 'length'") - fun.call = quote(length) - } - } - if (!is.null(fun.call)) { - fun.call = aggregate_funs(fun.call, lvals, sep, ...) - errmsg = "Aggregating function(s) should take vector inputs and return a single value (length=1). However, function(s) returns length!=1. This value will have to be used to fill any missing combinations, and therefore must be length=1. Either override by setting the 'fill' argument explicitly or modify your function to handle this case appropriately." - if (is.null(fill)) { - fill.default <- suppressWarnings(dat[0L][, eval(fun.call)]) - # tryCatch(fill.default <- dat[0L][, eval(fun.call)], error = function(x) stop(errmsg, call.=FALSE)) - if (nrow(fill.default) != 1L) stop(errmsg, call.=FALSE) - } - if (!any(valnames %chin% varnames)) { - dat = dat[, eval(fun.call), by=c(varnames)] - } else { - dat = dat[, { .SD; eval(fun.call) }, by=c(varnames), .SDcols = valnames] - } - } - order_ <- function(x) { - o = forderv(x, retGrp=TRUE, sort=TRUE) - idx = attr(o, 'starts') - if (!length(o)) o = seq_along(x) - o[idx] # subsetVector retains attributes, using R's subset for now - } - cj_uniq <- function(DT) { - do.call("CJ", lapply(DT, function(x) - if (is.factor(x)) { - xint = seq_along(levels(x)) - setattr(xint, 'levels', levels(x)) - setattr(xint, 'class', class(x)) - } else .Call(CsubsetVector, x, order_(x)) - ))} - valnames = setdiff(names(dat), varnames) - # 'dat' != 'data'? then setkey to speed things up (slightly), else ad-hoc (for now). Still very fast! - if (!is.null(fun.call) || !is.null(subset)) - setkeyv(dat, varnames) - if (length(rhsnames)) { - lhs = shallow(dat, lhsnames); rhs = shallow(dat, rhsnames); val = shallow(dat, valnames) - # handle drop=TRUE/FALSE - Update: Logic moved to R, AND faster than previous version. Take that... old me :-). - if (all(drop)) { - map = setDT(lapply(list(lhsnames, rhsnames), function(cols) frankv(dat, cols=cols, ties.method="dense"))) - maporder = lapply(map, order_) - mapunique = lapply(seq_along(map), function(i) .Call(CsubsetVector, map[[i]], maporder[[i]])) - lhs = .Call(CsubsetDT, lhs, maporder[[1L]], seq_along(lhs)) - rhs = .Call(CsubsetDT, rhs, maporder[[2L]], seq_along(rhs)) - } else { - lhs_ = if (!drop[1L]) cj_uniq(lhs) else setkey(unique(lhs, by=names(lhs))) - rhs_ = if (!drop[2L]) cj_uniq(rhs) else setkey(unique(rhs, by=names(rhs))) - map = vector("list", 2L) - .Call(Csetlistelt, map, 1L, lhs_[lhs, which=TRUE]) - .Call(Csetlistelt, map, 2L, rhs_[rhs, which=TRUE]) - setDT(map) - mapunique = vector("list", 2L) - .Call(Csetlistelt, mapunique, 1L, seq_len(nrow(lhs_))) - .Call(Csetlistelt, mapunique, 2L, seq_len(nrow(rhs_))) - lhs = lhs_; rhs = rhs_ - } - maplen = vapply_1i(mapunique, length) - idx = do.call("CJ", mapunique)[map, I := .I][["I"]] # TO DO: move this to C and avoid materialising the Cross Join. - ans = .Call(Cfcast, lhs, val, maplen[[1L]], maplen[[2L]], idx, fill, fill.default, is.null(fun.call)) - allcols = do.call("paste", c(rhs, sep=sep)) - if (length(valnames) > 1L) - allcols = do.call("paste", if (identical(".", allcols)) list(valnames, sep=sep) - else c(CJ(valnames, allcols, sorted=FALSE), sep=sep)) - # removed 'setcolorder()' here, #1153 - setattr(ans, 'names', c(lhsnames, allcols)) - setDT(ans); setattr(ans, 'sorted', lhsnames) - } else { - # formula is of the form x + y ~ . (rare case) - if (drop) { - if (is.null(subset) && is.null(fun.call)) { - dat = copy(dat) # can't be avoided - setkeyv(dat, lhsnames) - } - ans = dat - } else { - lhs = shallow(dat, lhsnames) - val = shallow(dat, valnames) - lhs_ = cj_uniq(lhs) - idx = lhs_[lhs, I := .I][["I"]] - lhs_[, I := NULL] - ans = .Call(Cfcast, lhs_, val, nrow(lhs_), 1L, idx, fill, fill.default, is.null(fun.call)) - setDT(ans); setattr(ans, 'sorted', lhsnames) - setnames(ans, c(lhsnames, valnames)) - } - if (length(valnames) == 1L) - setnames(ans, valnames, value.var) - } - return (ans) -} diff --git a/R/fmelt.R b/R/fmelt.R deleted file mode 100644 index 8fe4727c73..0000000000 --- a/R/fmelt.R +++ /dev/null @@ -1,65 +0,0 @@ -# Add melt generic, don't import reshape2 as it requires R >= 3.0.0. -melt <- function(data, ..., na.rm = FALSE, value.name = "value") { - if (is.data.table(data)) - UseMethod("melt", data) - else - reshape2::melt(data, ..., na.rm=na.rm, value.name=value.name) -} - -patterns <- function(..., cols=character(0L)) { - # if ... has no names, names(list(...)) will be ""; - # this assures they'll be NULL instead - p = unlist(list(...), use.names = any(nzchar(names(...)))) - if (!is.character(p)) - stop("Input patterns must be of type character.") - lapply(p, grep, cols) -} - -melt.data.table <- function(data, id.vars, measure.vars, variable.name = "variable", - value.name = "value", ..., na.rm = FALSE, variable.factor = TRUE, value.factor = FALSE, - verbose = getOption("datatable.verbose")) { - if (!is.data.table(data)) stop("'data' must be a data.table") - if (missing(id.vars)) id.vars=NULL - if (missing(measure.vars)) measure.vars = NULL - measure.sub = substitute(measure.vars) - if (is.call(measure.sub) && measure.sub[[1L]] == "patterns") { - measure.sub = as.list(measure.sub)[-1L] - idx = which(names(measure.sub) %in% "cols") - if (length(idx)) { - cols = eval(measure.sub[["cols"]], parent.frame()) - measure.sub = measure.sub[-idx] - } else cols = names(data) - pats = lapply(measure.sub, eval, parent.frame()) - measure.vars = patterns(pats, cols=cols) - } - if (is.list(measure.vars) && length(measure.vars) > 1L) { - meas.nm = names(measure.vars) - if (is.null(meas.nm)) { - # user-provided or default stub - if (length(value.name) == 1L) { - value.name = paste0(value.name, seq_along(measure.vars)) - } - } else { - if (length(value.name) > 1L) { - warning("'value.name' provided in both 'measure.vars'", - "and 'value.name argument'; value provided in", - "'measure.vars' is given precedence.") - } - if (anyNA(meas.nm) || !all(nzchar(meas.nm))) { - stop("Please provide a name to each element of 'measure.vars'.") - } - value.name = meas.nm - } - } - ans <- .Call(Cfmelt, data, id.vars, measure.vars, - as.logical(variable.factor), as.logical(value.factor), - variable.name, value.name, as.logical(na.rm), - as.logical(verbose)) - setDT(ans) - if (any(duplicated(names(ans)))) { - cat("Duplicate column names found in molten data.table. Setting unique names using 'make.names'\n") - setnames(ans, make.unique(names(ans))) - } - setattr(ans, 'sorted', NULL) - ans -} diff --git a/R/foverlaps.R b/R/foverlaps.R deleted file mode 100644 index 8e8dcda12a..0000000000 --- a/R/foverlaps.R +++ /dev/null @@ -1,228 +0,0 @@ -foverlaps <- function(x, y, by.x = if (!is.null(key(x))) key(x) else key(y), by.y = key(y), maxgap=0L, minoverlap=1L, type=c("any", "within", "start", "end", "equal"), mult=c("all", "first", "last"), nomatch=getOption("datatable.nomatch"), which = FALSE, verbose=getOption("datatable.verbose")) { - - if (!is.data.table(y) || !is.data.table(x)) stop("y and x must both be data.tables. Use `setDT()` to convert list/data.frames to data.tables by reference or as.data.table() to convert to data.tables by copying.") - maxgap = as.integer(maxgap); minoverlap = as.integer(minoverlap) - which = as.logical(which); nomatch = as.integer(nomatch) - if (!length(maxgap) || length(maxgap) != 1L || is.na(maxgap) || maxgap < 0L) - stop("maxgap must be a non-negative integer value of length 1") - if (!length(minoverlap) || length(minoverlap) != 1L || is.na(minoverlap) || minoverlap < 1L) - stop("minoverlap must be a positive integer value of length 1") - if (!length(which) || length(which) != 1L || is.na(which)) - stop("which must be a logical vector of length 1. Either TRUE/FALSE") - if (!length(nomatch) || length(nomatch) != 1L || (!is.na(nomatch) && nomatch!=0L)) - stop("nomatch must either be NA or 0, or (ideally) NA_integer_ or 0L") - type = match.arg(type) - mult = match.arg(mult) - if (type == "equal") - stop("type = 'equal' is not implemented yet. But note that this is just the same as a normal data.table join y[x, ...], unless you are also interested in setting 'minoverlap / maxgap' arguments. But those arguments are not implemented yet as well.") - # if (maxgap > 0L || minoverlap > 1L) # for future implementation - if (maxgap != 0L || minoverlap != 1L) - stop("maxgap and minoverlap arguments are not yet implemented.") - if (is.null(by.y)) - stop("'y' must be keyed (i.e., sorted, and, marked as sorted). Call setkey(y, ...) first, see ?setkey. Also check the examples in ?foverlaps.") - if (length(by.x) < 2L || length(by.y) < 2L) - stop("'by.x' and 'by.y' should contain at least two column names (or numbers) each - corresponding to 'start' and 'end' points of intervals. Please see ?foverlaps and examples for more info.") - if (is.numeric(by.x)) { - if (any(by.x < 0L) || any(by.x > length(x))) - stop("Invalid numeric value for 'by.x'; it should be a vector with values 1 <= by.x <= length(x)") - by.x = names(x)[by.x] - } - if (is.numeric(by.y)) { - if (any(by.y < 0L) || any(by.y > length(y))) - stop("Invalid numeric value for 'by.x'; it should be a vector with values 1 <= by.y <= length(y)") - by.y = names(y)[by.y] - } - if (!length(by.x) || !is.character(by.x)) - stop("A non-empty vector of column names is required for by.x") - if (!length(by.y) || !is.character(by.y)) - stop("A non-empty vector of column names is required for by.y") - if (!identical(by.y, key(y)[seq_along(by.y)])) - stop("The first ", length(by.y), " columns of y's key is not identical to the columns specified in by.y.") - if (anyNA(chmatch(by.x, names(x)))) - stop("Elements listed in 'by.x' must be valid names in data.table 'x'") - if (anyNA(chmatch(by.y, names(y)))) - stop("Elements listed in 'by.y' must be valid names in data.table 'y'") - if (anyDuplicated(by.x) || anyDuplicated(by.y)) - stop("Duplicate columns are not allowed in overlap joins. This may change in the future.") - if (length(by.x) != length(by.y)) - stop("length(by.x) != length(by.y). Columns specified in by.x should correspond to columns specified in by.y and should be of same lengths.") - if (any(dup.x<-duplicated(names(x)))) #1730 - handling join possible but would require workarounds on setcolorder further, it is really better just to rename dup column - stop("x has some duplicated column name(s): ",paste(unique(names(x)[dup.x]),collapse=","),". Please remove or rename the duplicate(s) and try again.") - if (any(dup.y<-duplicated(names(y)))) - stop("y has some duplicated column name(s): ",paste(unique(names(y)[dup.y]),collapse=","),". Please remove or rename the duplicate(s) and try again.") - xnames = by.x; xintervals = tail(xnames, 2L) - ynames = by.y; yintervals = tail(ynames, 2L) - if (!storage.mode(x[[xintervals[1L]]]) %chin% c("double", "integer") || !storage.mode(x[[xintervals[2L]]]) %chin% c("double", "integer")) - stop("The last two columns in by.x should correspond to the 'start' and 'end' intervals in data.table 'x' and must be integer/numeric type.") - if ( any(x[[xintervals[2L]]] - x[[xintervals[1L]]] < 0L) ) - stop("All entries in column ", xintervals[1L], " should be <= corresponding entries in column ", xintervals[2L], " in data.table 'x'") - if (!storage.mode(y[[yintervals[1L]]]) %chin% c("double", "integer") || !storage.mode(y[[yintervals[2L]]]) %chin% c("double", "integer")) - stop("The last two columns in by.y should correspond to the 'start' and 'end' intervals in data.table 'y' and must be integer/numeric type.") - if ( any(y[[yintervals[2L]]] - y[[yintervals[1L]]] < 0L) ) - stop("All entries in column ", yintervals[1L], " should be <= corresponding entries in column ", yintervals[2L], " in data.table 'y'") - - ## see NOTES below: - yclass = c(class(y[[yintervals[1L]]]), class(y[[yintervals[2L]]])) - isdouble = FALSE; isposix = FALSE - if ( any(c("numeric", "POSIXct") %chin% yclass) ) { - # next representive double > x under the given precision (48,56 or 64-bit in data.table) = x*incr - dt_eps <- function() { - bits = floor(log2(.Machine$double.eps)) - 2 ^ (bits + (getNumericRounding() * 8L)) - } - incr = 1 + dt_eps() - isdouble = TRUE - isposix = "POSIXct" %chin% yclass - } else incr = 1L # integer or Date class for example - ## hopefully all checks are over. Now onto the actual task at hand. - origx = x; x = shallow(x, by.x) - origy = y; y = shallow(y, by.y) - roll = switch(type, start=, end=, equal= 0.0, any=, within= +Inf) - make_call <- function(names, fun=NULL) { - if (is.character(names)) - names = lapply(names, as.name) - call = c(substitute(fun, list(fun=fun)), names) - if (!is.null(fun)) as.call(call) else call - } - construct <- function(icols, mcols, type=type) { - icall = make_call(icols) - setattr(icall, 'names', icols) - mcall = make_call(mcols, quote(c)) - if (type %chin% c("within", "any")) { - mcall[[3L]] = substitute( - if (isposix) unclass(val)*incr # incr is okay since this won't be negative - else if (isdouble) { - # fix for #1006 - 0.0 occurs in both start and end - # better fix for 0.0, and other -ves. can't use 'incr' - # hopefully this doesn't open another can of worms - (val+dt_eps())*(1 + sign(val)*dt_eps()) - } - else val+incr, - list(val = mcall[[3L]], incr = incr)) - } - make_call(c(icall, pos=mcall), quote(list)) - } - uycols = switch(type, start = yintervals[1L], - end = yintervals[2L], any =, - within =, equal = yintervals) - call = construct(head(ynames, -2L), uycols, type) - if (verbose) {last.started.at=proc.time();cat("unique() + setkey() operations done in ...");flush.console()} - uy = unique(y[, eval(call)]) - setkey(uy)[, `:=`(lookup = list(list(integer(0L))), type_lookup = list(list(integer(0L))), count=0L, type_count=0L)] - if (verbose) {cat(timetaken(last.started.at),"\n"); flush.console()} - matches <- function(ii, xx, del, ...) { - cols = setdiff(names(xx), del) - xx = .shallow(xx, cols, retain.key = FALSE) - ans = bmerge(xx, ii, seq_along(xx), seq_along(xx), haskey(xx), integer(0), mult=mult, ops=rep(1L, length(xx)), integer(0), 1L, verbose=verbose, ...) - # vecseq part should never run here, but still... - if (ans$allLen1) ans$starts else vecseq(ans$starts, ans$lens, NULL) - } - indices <- function(x, y, intervals, ...) { - if (type == "start") { - sidx = eidx = matches(x, y, intervals[2L], rollends=c(FALSE,FALSE), ...) ## TODO: eidx can be set to integer(0L) - } else if (type == "end") { - eidx = sidx = matches(x, y, intervals[1L], rollends=c(FALSE,FALSE), ...) ## TODO: sidx can be set to integer(0) - } else { - sidx = matches(x, y, intervals[2L], rollends=rep(type == "any", 2L), ...) - eidx = matches(x, y, intervals[1L], rollends=c(FALSE,TRUE), ...) - } - list(sidx, eidx) - } - # nomatch has no effect here, just for passing arguments consistently to `bmerge` - .Call(Clookup, uy, nrow(y), indices(uy, y, yintervals, nomatch=0L, roll=roll), maxgap, minoverlap, mult, type, verbose) - if (maxgap == 0L && minoverlap == 1L) { - # iintervals = tail(names(x), 2L) # iintervals not yet used so commented out for now - if (verbose) {last.started.at=proc.time();cat("binary search(es) done in ...");flush.console()} - xmatches = indices(uy, x, xintervals, nomatch=0L, roll=roll) - if (verbose) {cat(timetaken(last.started.at),"\n");flush.console()} - olaps = .Call(Coverlaps, uy, xmatches, mult, type, nomatch, verbose) - } - # nocov start - else if (maxgap == 0L && minoverlap > 1L) { - stop("Not yet implemented") - } else if (maxgap > 0L && minoverlap == 1L) { - stop("Not yet implemented") - } else if (maxgap > 0L && minoverlap > 1L) { - if (maxgap > minoverlap) - warning("maxgap > minoverlap. maxgap will have no effect here.") - stop("Not yet implemented") - } - # nocov end - - setDT(olaps) - setnames(olaps, c("xid", "yid")) - yid = NULL # for 'no visible binding for global variable' from R CMD check on i clauses below - - # if (type == "any") setorder(olaps) # at times the combine operation may not result in sorted order - # CsubsetDT bug has been fixed by Matt. So back to using it! Should improve subset substantially. - if (which) { - if (mult %chin% c("first", "last")) - return (olaps$yid) - else if (!is.na(nomatch)) - return (.Call(CsubsetDT, olaps, which(olaps$yid > 0L), seq_along(olaps))) - else return (olaps) - } else { - if (!is.na(nomatch)) - olaps = .Call(CsubsetDT, olaps, which(olaps$yid > 0L), seq_along(olaps)) - ycols = setdiff(names(origy), head(by.y, -2L)) - idx = chmatch(ycols, names(origx), nomatch=0L) - ans = .Call(CsubsetDT, origx, olaps$xid, seq_along(origx)) - if (any(idx>0L)) - setnames(ans, names(ans)[idx], paste0("i.", names(ans)[idx])) - xcols1 = head(by.x, -2L) - xcols2 = setdiff(names(ans), xcols1) - ans[, (ycols) := .Call(CsubsetDT, origy, olaps$yid, chmatch(ycols, names(origy)))] - setcolorder(ans, c(xcols1, ycols, xcols2)) - return (ans[]) - } -} - -# Notes: (If there's a better way than the solution I propose here, I'd be glad to apply it.) -# Side note: This post is a great read on floating points: http://randomascii.wordpress.com/2012/02/25/comparing-floating-point-numbers-2012-edition/ - -# We add 1L to the end coordinate in case of integers to generate lookup to identify interval overlaps properly. And that is great! -# However for double precision, there are two issues we need to take into consideration: - -# --- -# Firstly, assuming 64-bit precision, we can't simply add 1L. For e.g., consider: -# x = data.table(start=0.88, end=0.88) -# y = data.table(start=0.26, end=0.61, key=c("start", "end")) -# and we'd like to do: -# foverlaps(x, y, type="any") -# Adding 1 to 0.61 will result in 1.61, and will make sure 0.88 falls between 0.26 and 1.61, and that's wrong! - -# POSIXct objects are internally numeric as well. - -# So how do we determine the "increment" (1L for integers) for numeric type? -# To get there, we need to understand that the "increment" is a great idea. Just the value isn't correct in case of numerics. Let's consider -# just ordinary "numeric" objects (non-POSIXct). The idea behind increment is to ensure that the "end" coordinate gets incremented to the *next -# distinguishable representative number*!!! In case of integers, the next integer after 5L is 6L. Simple. Increment is 1L (assuming no integer -# overflows). In case of "numeric" that "increment" is (1 + .Machine$double.eps), and this gets *multiplied* (not added) to "end" coordinate. -# Simple again. It fixes the problem, for now (read on). - -# NOTE THAT simply doing ("end" + .Machine$double.eps ^ 0.5) is insufficient because this doesn't work as the numbers grow bigger. For e.g., try: -# identical(3e8, 3e8+.Machine$double.eps^0.5) -# identical(3e8, 3e8*(1+.Machine$double.eps)) - -# The important point is that we **need to be ABSOLUTELY sure** that "end coordinate" gets incremented to it's *next representative number*. Why? Consider a 'subject' interval [4,4]. When we collapse this to get the 1D-form and take `unique`, if the "end" coordinate is not distinguishable from the start coordinate, `unique` will return just one value. And this brings us back to square-one (the reason why we needed to add one in the first place!!). For example, consider query = c(5,5) and subject = c(4,4). Now, after collapsing and taking unique, if we end up with just one 4, then performing the join later will result in [5,5] actually matching 4 whose lookup will have valid indices and not NULL resulting in an incorrect overlap. We absolutely need the second 4, and we want it to be greater than the start 4, but just the smallest separation between them possible (so that we don't miss any other numbers that fall in that range). - -# For POSIXct objects, we could still do the same. But a) multiplication is not supported for POSIXt objects, so we'll have to unclass it, multiply and convert back.. which is not ideal - timezone, time spent on conversion etc.. and b) all.equal in base considers a tolerance of 0.001 for POSIXt objects, I'm guessing this is for "millisecond" resolution? The problem with (b) is that more than millisecond resolution will return incorrect results again. - -# More than millisecond resolution. Results are not stable. -# tt = c( as.POSIXct('2011-10-11 07:49:36.0003'), as.POSIXct('2011-10-11 07:49:36.0199'), as.POSIXct('2011-10-11 07:49:36.0399')) -# DT1 = data.table(start=tt, end=tt) -# DT2 = data.table(start=tt[2], end=tt[2]) -# setkey(DT2) -# foverlaps(DT1, DT2, which=TRUE) - -# So, to put an end to this problem, we'll unclass it, multiply and convert back. In any case, the join does not depend on the timezone, as the internal numeric equivalent seems to be identical irrespective of the time zones.. So that's good news! -# --- -# Secondly, we've 48,56 and 64-bit precision in data.table (through get and setNumericRounding). And default right now is 48-bit. So, we've to make sure that the "end" interval should be multiplied accordingly depending on the current precision. This is taken care of by dt_eps(). Quite simple to follow, really. -# --- - -# I believe this is the most correct way of doing it (probably convoluted way, and there are simpler ways... but I've not come across it). - -# Tests are added to ensure we cover these aspects (to my knowledge) to ensure that any undesirable changes in the future breaks those tests. - -# Conclusion: floating point manipulations are hell! - diff --git a/R/frank.R b/R/frank.R deleted file mode 100644 index d45e9682f7..0000000000 --- a/R/frank.R +++ /dev/null @@ -1,93 +0,0 @@ -frankv <- function(x, cols=seq_along(x), order=1L, na.last=TRUE, ties.method=c("average", "first", "random", "max", "min", "dense")) { - ties.method = match.arg(ties.method) - if (!length(na.last)) stop('length(na.last) = 0') - if (length(na.last) != 1L) { - warning("length(na.last) > 1, only the first element will be used") - na.last = na.last[1L] - } - keep = (na.last == "keep") - na.last = as.logical(na.last) - as_list <- function(x) { - xx = vector("list", 1L) - .Call(Csetlistelt, xx, 1L, x) - xx - } - if (is.atomic(x)) { - if (!missing(cols) && !is.null(cols)) - stop("x is a single vector, non-NULL 'cols' doesn't make sense") - cols = 1L - x = as_list(x) - } else { - if (!length(cols)) - stop("x is a list, 'cols' can not be 0-length") - if (is.character(cols)) - cols = chmatch(cols, names(x)) - cols = as.integer(cols) - } - x = .shallow(x, cols) # shallow copy even if list.. - setDT(x) - cols = seq_along(cols) - if (is.na(na.last)) { - set(x, j = "..na_prefix..", value = is_na(x, cols)) - order = if (length(order) == 1L) c(1L, rep(order, length(cols))) else c(1L, order) - cols = c(ncol(x), cols) - nas = x[[ncol(x)]] - } - if (ties.method == "random") { - set(x, i = if (is.na(na.last)) which_(nas, FALSE) else NULL, - j = "..stats_runif..", - value = stats::runif(nrow(x))) - order = if (length(order) == 1L) c(rep(order, length(cols)), 1L) else c(order, 1L) - cols = c(cols, ncol(x)) - } - xorder = forderv(x, by=cols, order=order, sort=TRUE, retGrp=TRUE, - na.last=if (identical(na.last, FALSE)) na.last else TRUE) - xstart = attr(xorder, 'starts') - xsorted = FALSE - if (!length(xorder)) { - xsorted = TRUE - xorder = seq_along(x[[1L]]) - } - ans = switch(ties.method, - average = , min = , max =, dense = { - rank = .Call(Cfrank, xorder, xstart, uniqlengths(xstart, length(xorder)), ties.method) - }, - first = , random = { - if (xsorted) xorder else forderv(xorder) - } - ) - # take care of na.last="keep" - V1 = NULL # for R CMD CHECK warning - if (isTRUE(keep)) { - ans = (setDT(as_list(ans))[which_(nas, TRUE), V1 := NA])[[1L]] - } else if (is.na(na.last)) { - ans = ans[which_(nas, FALSE)] - } - ans -} - -frank <- function(x, ..., na.last=TRUE, ties.method=c("average", "first", "random", "max", "min", "dense")) { - cols = substitute(list(...))[-1L] - if (identical(as.character(cols), "NULL")) { - cols = NULL - order = 1L - } else if (length(cols)) { - cols=as.list(cols) - order=rep(1L, length(cols)) - for (i in seq_along(cols)) { - v=as.list(cols[[i]]) - if (length(v) > 1L && v[[1L]] == "+") v=v[[-1L]] - else if (length(v) > 1L && v[[1L]] == "-") { - v=v[[-1L]] - order[i] = -1L - } - cols[[i]]=as.character(v) - } - cols=unlist(cols, use.names=FALSE) - } else { - cols=colnames(x) - order=if (is.null(cols)) 1L else rep(1L, length(cols)) - } - frankv(x, cols=cols, order=order, na.last=na.last, ties.method=ties.method) - -} diff --git a/R/fread.R b/R/fread.R deleted file mode 100644 index 13605800e9..0000000000 --- a/R/fread.R +++ /dev/null @@ -1,183 +0,0 @@ - -fread <- function(input="",file,sep="auto",sep2="auto",dec=".",quote="\"",nrows=Inf,header="auto",na.strings=getOption("datatable.na.strings","NA"),stringsAsFactors=FALSE,verbose=getOption("datatable.verbose",FALSE),skip="__auto__",select=NULL,drop=NULL,colClasses=NULL,integer64=getOption("datatable.integer64","integer64"), col.names, check.names=FALSE, encoding="unknown", strip.white=TRUE, fill=FALSE, blank.lines.skip=FALSE, key=NULL, index=NULL, showProgress=interactive(), data.table=getOption("datatable.fread.datatable",TRUE), nThread=getDTthreads(), logical01=getOption("datatable.logical01", FALSE), autostart=NA) -{ - if (is.null(sep)) sep="\n" # C level knows that \n means \r\n on Windows, for example - else { - stopifnot( length(sep)==1L, !is.na(sep), is.character(sep) ) - if (sep=="") sep="\n" # meaning readLines behaviour. The 3 values (NULL, "" or "\n") are equivalent. - else if (sep=="auto") sep="" # sep=="" at C level means auto sep - else stopifnot( nchar(sep)==1L ) # otherwise an actual character to use as sep - } - stopifnot( is.character(dec), length(dec)==1L, nchar(dec)==1L ) - # handle encoding, #563 - if (length(encoding) != 1L || !encoding %in% c("unknown", "UTF-8", "Latin-1")) { - stop("Argument 'encoding' must be 'unknown', 'UTF-8' or 'Latin-1'.") - } - isTrueFalse = function(x) isTRUE(x) || identical(FALSE, x) - isTrueFalseNA = function(x) isTRUE(x) || identical(FALSE, x) || identical(NA, x) - stopifnot( isTrueFalse(strip.white), isTrueFalse(blank.lines.skip), isTrueFalse(fill), isTrueFalse(showProgress), - isTrueFalse(stringsAsFactors), isTrueFalse(verbose), isTrueFalse(check.names), isTrueFalse(logical01) ) - stopifnot( is.numeric(nrows), length(nrows)==1L ) - if (is.na(nrows) || nrows<0) nrows=Inf # accept -1 to mean Inf, as read.table does - if (identical(header,"auto")) header=NA - stopifnot(isTrueFalseNA(header)) - stopifnot(is.numeric(nThread) && length(nThread)==1L) - nThread=as.integer(nThread) - stopifnot(nThread>=1L) - if (!missing(file)) { - if (!identical(input, "")) stop("You can provide 'input=' or 'file=', not both.") - if (!file.exists(file)) stop("File '",file,"' does not exist.") - if (isTRUE(file.info(file)$isdir)) stop("File '",file,"' is a directory. Not yet implemented.") # dir.exists() requires R v3.2+, #989 - input = file - } else { - if (!is.character(input) || length(input)!=1L) { - stop("'input' must be a single character string containing a file name, a system command containing at least one space, a URL starting 'http[s]://', 'ftp[s]://' or 'file://', or, the input data itself containing at least one \\n or \\r") - } - if ( input == "" || length(grep('\\n|\\r', input)) ) { - # input is data itself containing at least one \n or \r - } else if (file.exists(input)) { - if (isTRUE(file.info(input)$isdir)) stop("File '",input,"' is a directory. Not yet implemented.") - } else { - if (substring(input,1L,1L)==" ") { - stop("Input argument is not a file name and contains no \\n or \\r, but starts with a space. Please remove the leading space.") - } - # either a download or a system command, both to temp file - tmpFile = tempfile() - on.exit(unlink(tmpFile), add=TRUE) - str6 = substring(input,1,6) # avoid grepl() for #2531 - str7 = substring(input,1,7) - str8 = substring(input,1,8) - if (str7=="ftps://" || str8=="https://") { - if (!requireNamespace("curl", quietly = TRUE)) - stop("Input URL requires https:// connection for which fread() requires 'curl' package, but cannot be found. Please install curl using 'install.packages('curl')'.") - curl::curl_download(input, tmpFile, mode="wb", quiet = !showProgress) - } - else if (str6=="ftp://" || str7== "http://" || str7=="file://") { - method = if (str7=="file://") "internal" else getOption("download.file.method", default="auto") - # force "auto" when file:// to ensure we don't use an invalid option (e.g. wget), #1668 - download.file(input, tmpFile, method=method, mode="wb", quiet=!showProgress) - # In text mode on Windows-only, R doubles up \r to make \r\r\n line endings. mode="wb" avoids that. See ?connections:"CRLF" - } - else if (length(grep(' ', input))) { - (if (.Platform$OS.type == "unix") system else shell)(paste0('(', input, ') > ', tmpFile)) - } - else stop("File '",input,"' does not exist; getwd()=='", getwd(), "'", - ". Include correct full path, or one or more spaces to consider the input a system command.") - input = tmpFile # the file name - } - } - if (!missing(autostart)) warning("'autostart' is now deprecated and ignored. Consider skip='string' or skip=n"); - if (is.logical(colClasses)) { - if (!all(is.na(colClasses))) stop("colClasses is type 'logical' which is ok if all NA but it has some TRUE or FALSE values in it which is not allowed. Please consider the drop= or select= argument instead. See ?fread.") - colClasses = NULL - } - if (!is.null(colClasses) && is.atomic(colClasses)) { - if (!is.character(colClasses)) stop("colClasses is not type list or character vector") - if (!length(colClasses)) stop("colClasses is character vector ok but has 0 length") - if (!is.null(names(colClasses))) { # names are column names; convert to list approach - colClasses = tapply(names(colClasses), colClasses, c, simplify=FALSE) - } - } - stopifnot(length(skip)==1L, !is.na(skip), is.character(skip) || is.numeric(skip)) - if (skip=="__auto__") skip=-1L # skip="string" so long as "string" is not "__auto__". Best conveys to user something is automatic there (than -1 or NA). - if (is.double(skip)) skip = as.integer(skip) - stopifnot(is.null(na.strings) || is.character(na.strings)) - tt = grep("^\\s+$", na.strings) - if (length(tt)) { - msg = paste0('na.strings[', tt[1], ']=="',na.strings[tt[1L]],'" consists only of whitespace, ignoring. ') - if (strip.white) { - if (any(na.strings=="")) { - warning(msg, 'strip.white==TRUE (default) and "" is present in na.strings, so any number of spaces in string columns will already be read as .') - } else { - warning(msg, 'Since strip.white=TRUE (default), use na.strings="" to specify that any number of spaces in a string column should be read as .') - } - na.strings = na.strings[-tt] - } else { - stop(msg, 'But strip.white=FALSE. Use strip.white=TRUE (default) together with na.strings="" to turn any number of spaces in string columns into ') - } - # whitespace at the beginning or end of na.strings is checked at C level and is an error there; test 1804 - } - warnings2errors = getOption("warn") >= 2 - ans = .Call(CfreadR,input,sep,dec,quote,header,nrows,skip,na.strings,strip.white,blank.lines.skip, - fill,showProgress,nThread,verbose,warnings2errors,logical01,select,drop,colClasses,integer64,encoding) - nr = length(ans[[1L]]) - if ((!"bit64" %chin% loadedNamespaces()) && any(sapply(ans,inherits,"integer64"))) require_bit64() - setattr(ans,"row.names",.set_row_names(nr)) - - if (isTRUE(data.table)) { - setattr(ans, "class", c("data.table", "data.frame")) - alloc.col(ans) - } else { - setattr(ans, "class", "data.frame") - } - # #1027, make.unique -> make.names as spotted by @DavidArenberg - if (check.names) { - setattr(ans, 'names', make.names(names(ans), unique=TRUE)) - } - cols = NULL - if (stringsAsFactors) - cols = which(vapply(ans, is.character, TRUE)) - else if (length(colClasses)) { - if (is.list(colClasses) && "factor" %in% names(colClasses)) - cols = colClasses[["factor"]] - else if (is.character(colClasses) && "factor" %chin% colClasses) - cols = which(colClasses=="factor") - } - setfactor(ans, cols, verbose) - # 2007: is.missing is not correct since default value of select is NULL - if (!is.null(select)) { - # fix for #1445 - if (is.numeric(select)) { - reorder = if (length(o <- forderv(select))) o else seq_along(select) - } else { - reorder = select[select %chin% names(ans)] - # any missing columns are warning about in fread.c and skipped - } - setcolorder(ans, reorder) - } - # FR #768 - if (!missing(col.names)) - setnames(ans, col.names) # setnames checks and errors automatically - if (!is.null(key) && data.table) { - if (!is.character(key)) - stop("key argument of data.table() must be a character vector naming columns (NB: col.names are applied before this)") - if (length(key) == 1L) { - key = strsplit(key, split = ",", fixed = TRUE)[[1L]] - } - setkeyv(ans, key) - } - if (!is.null(index) && data.table) { - if (!all(sapply(index, is.character))) - stop("index argument of data.table() must be a character vector naming columns (NB: col.names are applied before this)") - if (is.list(index)) { - to_split = sapply(index, length) == 1L - if (any(to_split)) - index[to_split] = sapply(index[to_split], strsplit, split = ",", fixed = TRUE) - } else { - if (length(index) == 1L) { - # setindexv accepts lists, so no [[1]] - index = strsplit(index, split = ",", fixed = TRUE) - } - } - setindexv(ans, index) - } - ans -} - -# for internal use only. Used in `fread` and `data.table` for 'stringsAsFactors' argument -setfactor <- function(x, cols, verbose) { - # simplified but faster version of `factor()` for internal use. - as_factor <- function(x) { - lev = forderv(x, retGrp = TRUE, na.last = NA) - # get levels, also take care of all sorted condition - lev = if (length(lev)) x[lev[attributes(lev)$starts]] else x[attributes(lev)$starts] - ans = chmatch(x, lev) - setattr(ans, 'levels', lev) - setattr(ans, 'class', 'factor') - } - if (length(cols)) { - if (verbose) cat("Converting column(s) [", paste(names(x)[cols], collapse = ", "), "] from 'char' to 'factor'\n", sep = "") - for (j in cols) set(x, j = j, value = as_factor(.subset2(x, j))) - } - invisible(x) -} diff --git a/R/fwrite.R b/R/fwrite.R deleted file mode 100644 index 914c23c2cd..0000000000 --- a/R/fwrite.R +++ /dev/null @@ -1,59 +0,0 @@ -fwrite <- function(x, file="", append=FALSE, quote="auto", - sep=",", sep2=c("","|",""), eol=if (.Platform$OS.type=="windows") "\r\n" else "\n", - na="", dec=".", row.names=FALSE, col.names=TRUE, - qmethod=c("double","escape"), - logical01=getOption("datatable.logical01", FALSE), # due to change to TRUE; see NEWS - logicalAsInt=logical01, - dateTimeAs = c("ISO","squash","epoch","write.csv"), - buffMB=8, nThread=getDTthreads(), - showProgress=interactive(), - verbose=getOption("datatable.verbose", FALSE)) { - isLOGICAL = function(x) isTRUE(x) || identical(FALSE, x) # it seems there is no isFALSE in R? - na = as.character(na[1L]) # fix for #1725 - if (missing(qmethod)) qmethod = qmethod[1L] - if (missing(dateTimeAs)) dateTimeAs = dateTimeAs[1L] - else if (length(dateTimeAs)>1L) stop("dateTimeAs must be a single string") - dateTimeAs = chmatch(dateTimeAs, c("ISO","squash","epoch","write.csv"))-1L - if (is.na(dateTimeAs)) stop("dateTimeAs must be 'ISO','squash','epoch' or 'write.csv'") - if (!missing(logical01) && !missing(logicalAsInt)) - stop("logicalAsInt has been renamed logical01. Use logical01 only, not both.") - if (!missing(logicalAsInt)) { - # TODO: warning("logicalAsInt has been renamed logical01 for consistency with fread. It will work fine but please change to logical01 at your convenience so we can remove logicalAsInt in future.") - logical01 = logicalAsInt - logicalAsInt=NULL - } - buffMB = as.integer(buffMB) - nThread = as.integer(nThread) - # write.csv default is 'double' so fwrite follows suit. write.table's default is 'escape' - # validate arguments - stopifnot(is.list(x), ncol(x) > 0L, - identical(quote,"auto") || identical(quote,FALSE) || identical(quote,TRUE), - is.character(sep) && length(sep)==1L && nchar(sep) == 1L, - is.character(sep2) && length(sep2)==3L && nchar(sep2[2L])==1L, - is.character(dec) && length(dec)==1L && nchar(dec) == 1L, - dec != sep, # sep2!=dec and sep2!=sep checked at C level when we know if list columns are present - is.character(eol) && length(eol)==1L, - length(qmethod) == 1L && qmethod %in% c("double", "escape"), - isLOGICAL(col.names), isLOGICAL(append), isLOGICAL(row.names), - isLOGICAL(verbose), isLOGICAL(showProgress), isLOGICAL(logical01), - length(na) == 1L, #1725, handles NULL or character(0) input - is.character(file) && length(file)==1L && !is.na(file), - length(buffMB)==1L && !is.na(buffMB) && 1L<=buffMB && buffMB<=1024, - length(nThread)==1L && !is.na(nThread) && nThread>=1L - ) - file <- path.expand(file) # "~/foo/bar" - if (append && missing(col.names) && (file=="" || file.exists(file))) - col.names = FALSE # test 1658.16 checks this - if (identical(quote,"auto")) quote=NA # logical NA - if (file=="") { - # console output which it seems isn't thread safe on Windows even when one-batch-at-a-time - nThread = 1L - showProgress = FALSE - eol = "\n" # Rprintf() is used at C level which knows inside it to output \r\n on Windows. Otherwise extra \r is output. - } - .Call(CfwriteR, x, file, sep, sep2, eol, na, dec, quote, qmethod=="escape", append, - row.names, col.names, logical01, dateTimeAs, buffMB, nThread, - showProgress, verbose) - invisible() -} - diff --git a/R/getdots.R b/R/getdots.R deleted file mode 100644 index 56c6e52f3b..0000000000 --- a/R/getdots.R +++ /dev/null @@ -1,10 +0,0 @@ -## NOTE: this has problems when '...' contains quoted names that have special symbols -## for a better option see the logic in setkey - -getdots <- function() -{ - # return a string vector of the arguments in '...' - # My long winded way: gsub(" ","",unlist(strsplit(deparse(substitute(list(...))),"[(,)]")))[-1] - # Peter Dalgaard's & Brian Ripley helped out and ended up with : - as.character(match.call(sys.function(-1L), call=sys.call(-1L), expand.dots=FALSE)$...) -} diff --git a/R/groupingsets.R b/R/groupingsets.R deleted file mode 100644 index 6c40d416e0..0000000000 --- a/R/groupingsets.R +++ /dev/null @@ -1,121 +0,0 @@ -rollup <- function(x, ...) { - UseMethod("rollup") -} -rollup.data.table <- function(x, j, by, .SDcols, id = FALSE, ...) { - # input data type basic validation - if (!is.data.table(x)) - stop("Argument 'x' must be data.table object") - if (!is.character(by)) - stop("Argument 'by' must be character vector of column names used in grouping.") - if (!is.logical(id)) - stop("Argument 'id' must be logical scalar.") - # generate grouping sets for rollup - sets = lapply(length(by):0L, function(i) by[0L:i]) - # redirect to workhorse function - jj = substitute(j) - groupingsets.data.table(x, by=by, sets=sets, .SDcols=.SDcols, id=id, jj=jj) -} - -cube <- function(x, ...) { - UseMethod("cube") -} -cube.data.table <- function(x, j, by, .SDcols, id = FALSE, ...) { - # input data type basic validation - if (!is.data.table(x)) - stop("Argument 'x' must be data.table object") - if (!is.character(by)) - stop("Argument 'by' must be character vector of column names used in grouping.") - if (!is.logical(id)) - stop("Argument 'id' must be logical scalar.") - # generate grouping sets for cube - power set: http://stackoverflow.com/a/32187892/2490497 - n = length(by) - keepBool = sapply(2L^(seq_len(n) - 1L), function(k) rep(c(FALSE, TRUE), each=k, times=(2L^n / (2L*k)))) - sets = lapply((2L^n):1L, function(j) by[keepBool[j, ]]) - # redirect to workhorse function - jj = substitute(j) - groupingsets.data.table(x, by=by, sets=sets, .SDcols=.SDcols, id=id, jj=jj) -} - -groupingsets <- function(x, ...) { - UseMethod("groupingsets") -} -groupingsets.data.table <- function(x, j, by, sets, .SDcols, id = FALSE, jj, ...) { - # input data type basic validation - if (!is.data.table(x)) - stop("Argument 'x' must be data.table object") - if (ncol(x) < 1L) - stop("Argument 'x' is 0 column data.table, no measure to apply grouping over.") - if (length(names(x)) != uniqueN(names(x))) - stop("data.table must not contains duplicate column names.") - if (!is.character(by)) - stop("Argument 'by' must be character vector of column names used in grouping.") - if (length(by) != uniqueN(by)) - stop("Argument 'by' must have unique column names for grouping.") - if (!is.list(sets) || !all(sapply(sets, is.character))) - stop("Argument 'sets' must be a list of character vectors.") - if (!is.logical(id)) - stop("Argument 'id' must be logical scalar.") - # logic constraints validation - if (!all((sets.all.by <- unique(unlist(sets))) %chin% by)) - stop(sprintf("All columns used in 'sets' argument must be in 'by' too. Columns used in 'sets' but not present in 'by': %s.", paste(setdiff(sets.all.by, by), collapse=", "))) - if (id && "grouping" %chin% names(x)) - stop("When using `id=TRUE` the 'x' data.table must not have column named 'grouping'.") - if (!all(sapply(sets, function(x) length(x)==uniqueN(x)))) - stop("Character vectors in 'sets' list must not have duplicated column names within single grouping set.") - if (!identical(lapply(sets, sort), unique(lapply(sets, sort)))) - warning("Double counting is going to happen. Argument 'sets' should be unique without taking order into account, unless you really want double counting, then get used to that warning. Otherwise `sets=unique(lapply(sets, sort))` will do the trick.") - # input arguments handling - jj = if (!missing(jj)) jj else substitute(j) - av = all.vars(jj, TRUE) - if (":=" %chin% av) - stop("Expression passed to grouping sets function must not update by reference. Use ':=' on results of your grouping function.") - if (missing(.SDcols)) - .SDcols = if (".SD" %chin% av) setdiff(names(x), by) else NULL - # 0 rows template data.table to keep colorder and type - if (length(by)) { - empty = if (length(.SDcols)) x[0L, eval(jj), by, .SDcols=.SDcols] else x[0L, eval(jj), by] - } else { - empty = if (length(.SDcols)) x[0L, eval(jj), .SDcols=.SDcols] else x[0L, eval(jj)] - if (!is.data.table(empty)) empty = setDT(list(empty)) # improve after #648, see comment in aggr.set - } - if (id && "grouping" %chin% names(empty)) # `j` could have been evaluated to `grouping` field - stop("When using `id=TRUE` the 'j' expression must not evaluate to column named 'grouping'.") - if (length(names(empty)) != uniqueN(names(empty))) - stop("There exists duplicated column names in the results, ensure the column passed/evaluated in `j` and those in `by` are not overlapping.") - # adding grouping column to template - aggregation level identifier - if (id) { - set(empty, j = "grouping", value = integer()) - setcolorder(empty, c("grouping", by, setdiff(names(empty), c("grouping", by)))) - } - # workaround for rbindlist fill=TRUE on integer64 #1459 - int64.cols = vapply(empty, inherits, logical(1L), "integer64") - int64.cols = names(int64.cols)[int64.cols] - if (length(int64.cols) && !requireNamespace("bit64", quietly=TRUE)) - stop("Using integer64 class columns require to have 'bit64' package installed.") - int64.by.cols = intersect(int64.cols, by) - # aggregate function called for each grouping set - aggregate.set <- function(by.set) { - if (length(by.set)) { - r = if (length(.SDcols)) x[, eval(jj), by.set, .SDcols=.SDcols] else x[, eval(jj), by.set] - } else { - r = if (length(.SDcols)) x[, eval(jj), .SDcols=.SDcols] else x[, eval(jj)] - # workaround for grand total single var as data.table too, change to drop=FALSE after #648 solved - if (!is.data.table(r)) r = setDT(list(r)) - } - if (id) { - # integer bit mask of aggregation levels: http://www.postgresql.org/docs/9.5/static/functions-aggregate.html#FUNCTIONS-GROUPING-TABLE - set(r, j = "grouping", value = strtoi(paste(c("1", "0")[by %chin% by.set + 1L], collapse=""), base=2L)) - } - if (length(int64.by.cols)) { - # workaround for rbindlist fill=TRUE on integer64 #1459 - missing.int64.by.cols = setdiff(int64.by.cols, by.set) - if (length(missing.int64.by.cols)) r[, (missing.int64.by.cols) := bit64::as.integer64(NA)] - } - r - } - # actually processing everything here - rbindlist(c( - list(empty), # 0 rows template for colorder and type - lapply(sets, aggregate.set) # all aggregations - ), use.names=TRUE, fill=TRUE) -} diff --git a/R/last.R b/R/last.R deleted file mode 100644 index d0c27a8c30..0000000000 --- a/R/last.R +++ /dev/null @@ -1,37 +0,0 @@ - -# data.table defined last(x) with no arguments, just for last. If you need the last 10 then use tail(x,10). -# This last is implemented this way for compatibility with xts::last which is S3 generic taking 'n' and 'keep' arguments -# We'd like last() on vectors to be fast, so that's a direct x[NROW(x)] as it was in data.table, otherwise use xts's. -# If xts is loaded higher than data.table, xts::last will work but slower. -last <- function(x, ...) { - if (nargs()==1L) { - if (is.vector(x)) { - if (!length(x)) return(x) else return(x[[length(x)]]) # for vectors, [[ works like [ - } else if (is.data.frame(x)) return(x[NROW(x),]) - } - if(!requireNamespace("xts", quietly = TRUE)) { - tail(x, n = 1L, ...) - } else { - # fix with suggestion from Joshua, #1347 - if (!"package:xts" %in% search()) { - tail(x, n = 1L, ...) - } else xts::last(x, ...) # UseMethod("last") doesn't find xts's methods, not sure what I did wrong. - } -} - -# first(), similar to last(), not sure why this wasn't exported in the first place... -first <- function(x, ...) { - if (nargs()==1L) { - if (is.vector(x)) { - if (!length(x)) return(x) else return(x[[1L]]) - } else if (is.data.frame(x)) return(x[1L,]) - } - if(!requireNamespace("xts", quietly = TRUE)) { - head(x, n = 1L, ...) - } else { - # fix with suggestion from Joshua, #1347 - if (!"package:xts" %in% search()) { - head(x, n = 1L, ...) - } else xts::first(x, ...) - } -} diff --git a/R/like.R b/R/like.R deleted file mode 100644 index c19c8791e7..0000000000 --- a/R/like.R +++ /dev/null @@ -1,16 +0,0 @@ -like <- function(vector, pattern) -{ - # Intended for use with a data.table 'where' - # Don't use * or % like SQL's like. Uses regexpr syntax - more powerful. - if (is.factor(vector)) { - as.integer(vector) %in% grep(pattern,levels(vector)) - } else { - # most usually character, but integer and numerics will be silently coerced by grepl - grepl(pattern,vector) - } - # returns 'logical' so can be combined with other where clauses. -} - -"%like%" = like - - diff --git a/R/merge.R b/R/merge.R deleted file mode 100644 index d30bd06c29..0000000000 --- a/R/merge.R +++ /dev/null @@ -1,103 +0,0 @@ -merge.data.table <- function(x, y, by = NULL, by.x = NULL, by.y = NULL, all = FALSE, all.x = all, - all.y = all, sort = TRUE, suffixes = c(".x", ".y"), no.dups = TRUE, allow.cartesian=getOption("datatable.allow.cartesian"), ...) { - if (!sort %in% c(TRUE, FALSE)) - stop("Argument 'sort' should be logical TRUE/FALSE") - if (!no.dups %in% c(TRUE, FALSE)) - stop("Argument 'no.dups' should be logical TRUE/FALSE") - if (!is.data.table(y)) { - y = as.data.table(y) - if (missing(by) && missing(by.x)) { - by = key(x) - } - } - if ((x0 <- length(x)==0L) | (y0 <- length(y)==0L)) warning(sprintf("You are trying to join data.tables where %s 0 columns data.table.", if(x0 & y0) "'x' and 'y' arguments are" else if(x0 & !y0) "'x' argument is" else if(!x0 & y0) "'y' argument is")) - if (any(duplicated(names(x)))) stop("x has some duplicated column name(s): ",paste(names(x)[duplicated(names(x))],collapse=","),". Please remove or rename the duplicate(s) and try again.") - if (any(duplicated(names(y)))) stop("y has some duplicated column name(s): ",paste(names(y)[duplicated(names(y))],collapse=","),". Please remove or rename the duplicate(s) and try again.") - - ## set up 'by'/'by.x'/'by.y' - if ( (!is.null(by.x) || !is.null(by.y)) && length(by.x)!=length(by.y) ) - stop("`by.x` and `by.y` must be of same length.") - if (!missing(by) && !missing(by.x)) - warning("Supplied both `by` and `by.x/by.y`. `by` argument will be ignored.") - if (!is.null(by.x)) { - if ( !is.character(by.x) || !is.character(by.y)) - stop("A non-empty vector of column names are required for `by.x` and `by.y`.") - if (!all(by.x %in% names(x))) - stop("Elements listed in `by.x` must be valid column names in x.") - if (!all(by.y %in% names(y))) - stop("Elements listed in `by.y` must be valid column names in y.") - by = by.x - names(by) = by.y - } else { - if (is.null(by)) - by = intersect(key(x), key(y)) - if (is.null(by)) - by = key(x) - if (is.null(by)) - by = intersect(names(x), names(y)) - if (length(by) == 0L || !is.character(by)) - stop("A non-empty vector of column names for `by` is required.") - if (!all(by %in% intersect(colnames(x), colnames(y)))) - stop("Elements listed in `by` must be valid column names in x and y") - by = unname(by) - by.x = by.y = by - } - # with i. prefix in v1.9.3, this goes away. Left here for now ... - ## sidestep the auto-increment column number feature-leading-to-bug by - ## ensuring no names end in ".1", see unit test - ## "merge and auto-increment columns in y[x]" in test-data.frame.like.R - start = setdiff(names(x), by.x) - end = setdiff(names(y), by.y) - dupnames = intersect(start, end) - if (length(dupnames)) { - start[chmatch(dupnames, start, 0L)] = paste0(dupnames, suffixes[1L]) - end[chmatch(dupnames, end, 0L)] = paste0(dupnames, suffixes[2L]) - } - # If no.dups = TRUE we also need to added the suffix to columns in y - # that share a name with by.x - dupkeyx = intersect(by.x, end) - if (no.dups && length(dupkeyx)) { - end[chmatch(dupkeyx, end, 0L)] = paste0(dupkeyx, suffixes[2L]) - } - - dt = y[x,nomatch = if (all.x) NA else 0L,on=by,allow.cartesian=allow.cartesian] # includes JIS columns (with a i. prefix if conflict with x names) - - if (all.y && nrow(y)) { # If y does not have any rows, no need to proceed - # Perhaps not very commonly used, so not a huge deal that the join is redone here. - missingyidx = y[!x,which=TRUE,on=by,allow.cartesian=allow.cartesian] - if (length(missingyidx)) { - yy = y[missingyidx] - othercolsx = setdiff(names(x), by) - if (length(othercolsx)) { - tmp = rep.int(NA_integer_, length(missingyidx)) - # TO DO: use set() here instead.. - yy = cbind(yy, x[tmp, othercolsx, with = FALSE]) - } - # empty data.tables (nrow =0, ncol>0) doesn't skip names anymore in new rbindlist - # takes care of #5672 without having to save names. This is how it should be, IMHO. - dt = rbind(dt, yy, use.names=FALSE) - } - } - # X[Y] sytax puts JIS i columns at the end, merge likes them alongside i. - newend = setdiff(names(y), by.y) - # fix for #1290, make sure by.y order is set properly before naming - setcolorder(dt, c(by.y, setdiff(names(dt), c(by.y, newend)), newend)) - setnames(dt, c(by.x, start, end)) - if (nrow(dt) > 0L) { - setkeyv(dt, if (sort) by.x else NULL) - } - - # Throw warning if there are duplicate column names in 'dt' (i.e. if - # `suffixes=c("","")`, to match behaviour in base:::merge.data.frame) - resultdupnames <- names(dt)[duplicated(names(dt))] - if (length(resultdupnames)) { - warning("column names ", paste0("'", resultdupnames, "'", collapse=", "), - " are duplicated in the result") - } - - # merge resets class, #1378. X[Y] is quite clear that X is being *subset* by Y, - # makes sense to therefore retain X's class, unlike `merge`. Hard to tell what - # class to retain for *full join* for example. - setattr(dt, 'class', c("data.table", "data.frame")) - dt -} diff --git a/R/onAttach.R b/R/onAttach.R deleted file mode 100644 index 43d7bb033f..0000000000 --- a/R/onAttach.R +++ /dev/null @@ -1,66 +0,0 @@ -# nocov start - -.onAttach <- function(libname, pkgname) { - # Runs when attached to search() path such as by library() or require() - if (interactive()) { - v = packageVersion("data.table") - d = read.dcf(system.file("DESCRIPTION", package="data.table"), fields = c("Packaged", "Built", "Revision")) - if (is.na(d[1L])) { - if (is.na(d[2L])) { - return() # Packaged, Built fields does not exists - } else { - d = unlist(strsplit(d[2L], split="; "))[3L] - g = if (is.na(d[3L])) "" else paste0(" (",d[3L],")") - } - } else { - d = d[1L] - g = "" - } - dev = as.integer(v[1L, 3L]) %% 2L == 1L # version number odd => dev - packageStartupMessage(sprintf("data.table %s%s", v, - if(dev) sprintf(" IN DEVELOPMENT built %s%s", d, g) else "")) - if (dev && (Sys.Date() - as.Date(d))>28) - packageStartupMessage("**********\nThis development version of data.table was built more than 4 weeks ago. Please update: data.table::update.dev.pkg()\n**********") - if (!.Call(ChasOpenMP)) - packageStartupMessage("**********\nThis installation of data.table has not detected OpenMP support. It should still work but in single-threaded mode. If this is a Mac, please ensure you are using R>=3.4.0 and have installed the MacOS binary package from CRAN: see ?install.packages, the 'type=' argument and the 'Binary packages' section. If you compiled from source, please reinstall and precisely follow the installation instructions on the data.table homepage. This warning message should not occur on Windows or Linux. If it does and you've followed the installation instructions on the data.table homepage, please file a GitHub issue.\n**********") - packageStartupMessage(' The fastest way to learn (by data.table authors): https://www.datacamp.com/courses/data-analysis-the-data-table-way') - packageStartupMessage(' Documentation: ?data.table, example(data.table) and browseVignettes("data.table")') - packageStartupMessage(' Release notes, videos and slides: http://r-datatable.com') - } -} - -dcf.lib = function(pkg, field){ - # get DESCRIPTION metadata field from local library - stopifnot(is.character(pkg), is.character(field), length(pkg)==1L, length(field)==1L) - dcf = system.file("DESCRIPTION", package=pkg) - if (nzchar(dcf)) read.dcf(dcf, fields=field)[1L] else NA_character_ -} - -dcf.repo = function(pkg, repo, field){ - # get DESCRIPTION metadata field from remote PACKAGES file - stopifnot(is.character(pkg), is.character(field), length(pkg)==1L, length(field)==1L, is.character(repo), length(repo)==1L, field!="Package") - idx = file(file.path(contrib.url(repo),"PACKAGES")) - on.exit(close(idx)) - dcf = read.dcf(idx, fields=c("Package",field)) - if (!pkg %in% dcf[,"Package"]) stop(sprintf("There is no %s package in provided repository.", pkg)) - dcf[dcf[,"Package"]==pkg, field][[1L]] -} - -update.dev.pkg = function(object="data.table", repo="https://Rdatatable.github.io/data.table", field="Revision", ...){ - pkg = object - # perform package upgrade when new Revision present - stopifnot(is.character(pkg), length(pkg)==1L, !is.na(pkg), - is.character(repo), length(repo)==1L, !is.na(repo), - is.character(field), length(field)==1L, !is.na(field)) - una = is.na(ups<-dcf.repo(pkg, repo, field)) - upg = una | !identical(ups, dcf.lib(pkg, field)) - if (upg) utils::install.packages(pkg, repos=repo, ...) - if (una) cat(sprintf("No commit information found in DESCRIPTION file for %s package. Unsure '%s' is correct field name in PACKAGES file in your devel repository '%s'.\n", pkg, field, file.path(repo, "src","contrib","PACKAGES"))) - cat(sprintf("R %s package %s %s (%s)\n", - pkg, - c("is up-to-date at","has been updated to")[upg+1L], - dcf.lib(pkg, field), - utils::packageVersion(pkg))) -} - -# nocov end diff --git a/R/onLoad.R b/R/onLoad.R deleted file mode 100644 index 445f6a7450..0000000000 --- a/R/onLoad.R +++ /dev/null @@ -1,113 +0,0 @@ -# nocov start - -.onLoad <- function(libname, pkgname) { - # Runs when loaded but not attached to search() path; e.g., when a package just Imports (not Depends on) data.table - - "Please read FAQ 2.23 (vignette('datatable-faq')) which explains in detail why data.table adds one for loop to the start of base::cbind.data.frame and base::rbind.data.frame. If there is a better solution we will gladly change it." - # Commented as a character string so this message is retained and seen by anyone who types data.table:::.onLoad - tt = base::cbind.data.frame - ss = body(tt) - if (class(ss)!="{") ss = as.call(c(as.name("{"), ss)) - prefix = if (!missing(pkgname)) "data.table::" else "" # R provides the arguments when it calls .onLoad, I don't in dev/test - if (!length(grep("data.table",ss[[2L]]))) { - ss = ss[c(1L, NA, 2L:length(ss))] - ss[[2L]] = parse(text=paste0("if (!identical(class(..1),'data.frame')) for (x in list(...)) { if (inherits(x,'data.table')) return(",prefix,"data.table(...)) }"))[[1]] - body(tt)=ss - (unlockBinding)("cbind.data.frame",baseenv()) - assign("cbind.data.frame",tt,envir=asNamespace("base"),inherits=FALSE) - lockBinding("cbind.data.frame",baseenv()) - } - tt = base::rbind.data.frame - ss = body(tt) - if (class(ss)!="{") ss = as.call(c(as.name("{"), ss)) - if (!length(grep("data.table",ss[[2L]]))) { - ss = ss[c(1L, NA, 2L:length(ss))] - ss[[2L]] = parse(text=paste0("for (x in list(...)) { if (inherits(x,'data.table')) return(",prefix,".rbind.data.table(...)) }"))[[1L]] # fix for #4995 - body(tt)=ss - (unlockBinding)("rbind.data.frame",baseenv()) - assign("rbind.data.frame",tt,envir=asNamespace("base"),inherits=FALSE) - lockBinding("rbind.data.frame",baseenv()) - } - # Set options for the speed boost in v1.8.0 by avoiding 'default' arg of getOption(,default=) - # In fread and fwrite we have moved back to using getOption's default argument since it is unlikely fread and fread will be called in a loop many times, plus they - # are relatively heavy functions where the overhead in getOption() would not be noticed. It's only really [.data.table where getOption default bit. - # Improvement to base::getOption() now submitted (100x; 5s down to 0.05s): https://bugs.r-project.org/bugzilla/show_bug.cgi?id=17394 - opts = c("datatable.verbose"="FALSE", # datatable. - "datatable.nomatch"="NA_integer_", # datatable. - "datatable.optimize"="Inf", # datatable. - "datatable.print.nrows"="100L", # datatable. - "datatable.print.topn"="5L", # datatable. - "datatable.print.class"="FALSE", # for print.data.table - "datatable.print.rownames"="TRUE", # for print.data.table - "datatable.print.colnames"="'auto'", # for print.data.table - "datatable.print.keys"="FALSE", # for print.data.table - "datatable.allow.cartesian"="FALSE", # datatable. - "datatable.dfdispatchwarn"="TRUE", # not a function argument - "datatable.warnredundantby"="TRUE", # not a function argument - "datatable.alloccol"="1024L", # argument 'n' of alloc.col. Over-allocate 1024 spare column slots - "datatable.auto.index"="TRUE", # DT[col=="val"] to auto add index so 2nd time faster - "datatable.use.index"="TRUE", # global switch to address #1422 - "datatable.prettyprint.char" = NULL, # FR #1091 - "datatable.old.unique.by.key" = "FALSE" # TODO: change warnings in duplicated.R to error on or after Jan 2019 then remove in Jan 2020. - ) - for (i in setdiff(names(opts),names(options()))) { - eval(parse(text=paste0("options(",i,"=",opts[i],")"))) - } - - if (!is.null(getOption("datatable.old.bywithoutby"))) - warning("Option 'datatable.old.bywithoutby' has been removed as warned for 2 years. It is now ignored. Please use by=.EACHI instead and stop using this option.") - - # reshape2 - # Tried this : - # if (!"package:reshape2" %in% search()) { - # # temporary until reshape2 pull request to make generic is on CRAN ... - # try(library(reshape2, pos="package:base", quietly=TRUE, warn.conflicts=FALSE), silent=TRUE) - # } - # which works. But then when melt in data.table is loaded, _that's_ what generates the mask message. - # There's also a NOTE: Package startup functions should not change the search path. - # Therefore, removed. Users will need to make sure reshape2 isn't loaded, or loaded behind data.table on search() - - # Test R behaviour that changed in v3.1 and is now depended on - x = 1L:3L - y = list(x) - if (address(x) != address(y[[1L]])) stop("Unexpected base R behaviour: list(x) has copied x") - - DF = data.frame(a=1:3, b=4:6) - add1 = address(DF$a) - add2 = address(DF$b) - names(DF) = c("A","B") - add3 = address(DF$A) - add4 = address(DF$B) - if (add1!=add3 || add2!=add4) stop("Unexpected base R behaviour: names<- has copied column contents") - - DF = data.frame(a=1:3, b=4:6) - add1 = address(DF$a) - add2 = address(DF$b) - add3 = address(DF) - DF[2L, "b"] = 7 # changed b but not a - add4 = address(DF$a) - add5 = address(DF$b) - add6 = address(DF) - if (add2==add5) stop("Unexpected base R behaviour: DF[2,2]<- did not copy column 2 which was assigned to") - if (add1!=add4) stop("Unexpected base R behaviour: DF[2,2]<- copied the first column which was not assigned to, too") - - if (add3==add6) warning("Unexpected base R behaviour: DF[2,2]<- has not copied address(DF)") - # R could feasibly in future not copy DF's vecsxp in this case. If that changes in R, we'd like to know via the warning - # because tests will likely break too. The warning will quickly tell R-core and us why, so we can then update. - - invisible() -} - -getRversion <- function(...) stop("Reminder to data.table developers: don't use getRversion() internally. Add a behaviour test to .onLoad instead.") -# 1) using getRversion() wasted time when R3.0.3beta was released without the changes we expected in getRversion()>"3.0.2". -# 2) R-devel and ourselves may wish to tinker with R-devel, turning on and off features in the same version number. So it's better if data.table doesn't hard code expectations into the version number. -# 3) The discipline of adding a feaure test here helps fully understand the change. -# 4) Defining getRversion with a stop() here helps prevent new switches on getRversion() being added in future. Easily circumvented but the point is to issue the message above. - -.onUnload <- function(libpath) { - # fix for #474. the shared object name is different from package name - # So 'detach' doesn't find datatable.so, as it looks by default for data.table.so - library.dynam.unload("datatable", libpath) -} - -# nocov end diff --git a/R/openmp-utils.R b/R/openmp-utils.R deleted file mode 100644 index aa4a965064..0000000000 --- a/R/openmp-utils.R +++ /dev/null @@ -1,8 +0,0 @@ -setDTthreads <- function(threads) { - invisible(.Call(CsetDTthreads, as.integer(threads))) -} - -getDTthreads <- function(verbose=getOption("datatable.verbose", FALSE)) { - .Call(CgetDTthreads, verbose) -} - diff --git a/R/print.data.table.R b/R/print.data.table.R deleted file mode 100644 index ac5d42a324..0000000000 --- a/R/print.data.table.R +++ /dev/null @@ -1,150 +0,0 @@ -# Moved here out from data.table.R on 10 Aug 2017. See data.table.R for history prior to that. - -print.data.table <- function(x, topn=getOption("datatable.print.topn"), - nrows=getOption("datatable.print.nrows"), - class=getOption("datatable.print.class"), - row.names=getOption("datatable.print.rownames"), - col.names=getOption("datatable.print.colnames"), - print.keys=getOption("datatable.print.keys"), - quote=FALSE, ...) { # topn - print the top topn and bottom topn rows with '---' inbetween (5) - # nrows - under this the whole (small) table is printed, unless topn is provided (100) - # class - should column class be printed underneath column name? (FALSE) - if (!col.names %in% c("auto", "top", "none")) - stop("Valid options for col.names are 'auto', 'top', and 'none'") - if (col.names == "none" && class) - warning("Column classes will be suppressed when col.names is 'none'") - if (!shouldPrint(x)) { - # := in [.data.table sets .global$print=address(x) to suppress the next print i.e., like <- does. See FAQ 2.22 and README item in v1.9.5 - # The issue is distinguishing "> DT" (after a previous := in a function) from "> DT[,foo:=1]". To print.data.table(), there - # is no difference. Now from R 3.2.0 a side effect of the very welcome and requested change to avoid silent deep copy is that - # there is now no longer a difference between > DT and > print(DT). So decided that DT[] is now needed to guarantee print; simpler. - # This applies just at the prompt. Inside functions, print(DT) will of course print. - # Other options investigated (could revisit): Cstack_info(), .Last.value gets set first before autoprint, history(), sys.status(), - # topenv(), inspecting next statement in caller, using clock() at C level to timeout suppression after some number of cycles - SYS <- sys.calls() - if (length(SYS) <= 2L || # "> DT" auto-print or "> print(DT)" explicit print (cannot distinguish from R 3.2.0 but that's ok) - ( length(SYS) > 3L && is.symbol(thisSYS <- SYS[[length(SYS)-3L]][[1L]]) && - as.character(thisSYS) %chin% mimicsAutoPrint ) ) { - return(invisible()) - # is.symbol() temp fix for #1758. - } - } - if (!is.numeric(nrows)) nrows = 100L - if (!is.infinite(nrows)) nrows = as.integer(nrows) - if (nrows <= 0L) return(invisible()) # ability to turn off printing - if (!is.numeric(topn)) topn = 5L - topnmiss = missing(topn) - topn = max(as.integer(topn),1L) - if (print.keys){ - if (!is.null(ky <- key(x))) - cat("Key: <", paste(ky, collapse=", "), ">\n", sep="") - if (!is.null(ixs <- indices(x))) - cat("Ind", if (length(ixs) > 1L) "ices" else "ex", ": <", - paste(ixs, collapse=">, <"), ">\n", sep="") - } - if (nrow(x) == 0L) { - if (length(x)==0L) - cat("Null data.table (0 rows and 0 cols)\n") # See FAQ 2.5 and NEWS item in v1.8.9 - else - cat("Empty data.table (0 rows) of ",length(x)," col",if(length(x)>1L)"s",": ",paste(head(names(x),6L),collapse=","),if(ncol(x)>6L)"...","\n",sep="") - return(invisible()) - } - if ((topn*2+1)nrows || !topnmiss)) { - toprint = rbind(head(x, topn), tail(x, topn)) - rn = c(seq_len(topn), seq.int(to=nrow(x), length.out=topn)) - printdots = TRUE - } else { - toprint = x - rn = seq_len(nrow(x)) - printdots = FALSE - } - toprint=format.data.table(toprint, na.encode=FALSE, ...) # na.encode=FALSE so that NA in character cols print as - - if ((!"bit64" %chin% loadedNamespaces()) && any(sapply(x,inherits,"integer64"))) require_bit64() - # When we depend on R 3.2.0 (Apr 2015) we can use isNamespaceLoaded() added then, instead of %chin% above - - # FR #5020 - add row.names = logical argument to print.data.table - if (isTRUE(row.names)) rownames(toprint)=paste0(format(rn,right=TRUE,scientific=FALSE),":") else rownames(toprint)=rep.int("", nrow(toprint)) - if (is.null(names(x)) || all(names(x) == "")) - # fixes bug #97 (RF#4934) and #545 (RF#5253) - colnames(toprint)=rep("", ncol(toprint)) - if (isTRUE(class) && col.names != "none") { - #Matching table for most common types & their abbreviations - class_abb = c(list = "", integer = "", numeric = "", - character = "", Date = "", complex = "", - factor = "", POSIXct = "", logical = "", - IDate = "", integer64 = "", raw = "", - expression = "", ordered = "") - classes = vapply(x, function(col) class(col)[1L], "", USE.NAMES=FALSE) - abbs = unname(class_abb[classes]) - if ( length(idx <- which(is.na(abbs))) ) - abbs[idx] = paste0("<", classes[idx], ">") - toprint = rbind(abbs, toprint) - rownames(toprint)[1L] = "" - } - if (quote) colnames(toprint) <- paste0('"', old <- colnames(toprint), '"') - if (printdots) { - toprint = rbind(head(toprint, topn), "---"="", tail(toprint, topn)) - rownames(toprint) = format(rownames(toprint), justify="right") - if (col.names == "none") { - cut_top(print(toprint, right=TRUE, quote=quote)) - } else { - print(toprint, right=TRUE, quote=quote) - } - return(invisible()) - } - if (nrow(toprint)>20L && col.names == "auto") - # repeat colnames at the bottom if over 20 rows so you don't have to scroll up to see them - # option to shut this off per request of Oleg Bondar on SO, #1482 - toprint=rbind(toprint, matrix(if (quote) old else colnames(toprint), nrow=1L)) # fixes bug #4934 - if (col.names == "none") { - cut_top(print(toprint, right=TRUE, quote=quote)) - } else { - print(toprint, right=TRUE, quote=quote) - } - invisible() -} - -format.data.table <- function (x, ..., justify="none") { - if (is.atomic(x) && !is.null(x)) { - stop("Internal structure doesn't seem to be a list. Possibly corrupt data.table.") - } - format.item <- function(x) { - if (is.null(x)) # NULL item in a list column - "" - else if (is.atomic(x) || inherits(x,"formula")) # FR #2591 - format.data.table issue with columns of class "formula" - paste(c(format(head(x, 6L), justify=justify, ...), if (length(x) > 6L) "..."), collapse=",") # fix for #5435 - format has to be added here... - else - paste0("<", class(x)[1L], ">") - } - # FR #1091 for pretty printing of character - # TODO: maybe instead of doing "this is...", we could do "this ... test"? - char.trunc <- function(x, trunc.char = getOption("datatable.prettyprint.char")) { - trunc.char = max(0L, suppressWarnings(as.integer(trunc.char[1L])), na.rm=TRUE) - if (!is.character(x) || trunc.char <= 0L) return(x) - idx = which(nchar(x) > trunc.char) - x[idx] = paste0(substr(x[idx], 1L, as.integer(trunc.char)), "...") - x - } - do.call("cbind",lapply(x,function(col,...){ - if (!is.null(dim(col))) stop("Invalid column: it has dimensions. Can't format it. If it's the result of data.table(table()), use as.data.table(table()) instead.") - if (is.list(col)) col = vapply_1c(col, format.item) - else col = format(char.trunc(col), justify=justify, ...) # added an else here to fix #5435 - col - },...)) -} - -mimicsAutoPrint = c("knit_print.default") -# add maybe repr_text.default. See https://github.com/Rdatatable/data.table/issues/933#issuecomment-220237965 - -shouldPrint = function(x) { - ret = (.global$print=="" || # to save address() calls and adding lots of address strings to R's global cache - address(x)!=.global$print) - .global$print = "" - ret -} - -# for removing the head (column names) of matrix output entirely, -# as opposed to printing a blank line, for excluding col.names per PR #1483 -cut_top = function(x) cat(capture.output(x)[-1L], sep = '\n') - diff --git a/R/setkey.R b/R/setkey.R deleted file mode 100644 index 4478405cef..0000000000 --- a/R/setkey.R +++ /dev/null @@ -1,397 +0,0 @@ -setkey <- function(x, ..., verbose=getOption("datatable.verbose"), physical=TRUE) -{ - if (is.character(x)) stop("x may no longer be the character name of the data.table. The possibility was undocumented and has been removed.") - cols = as.character(substitute(list(...))[-1L]) - if (!length(cols)) cols=colnames(x) - else if (identical(cols,"NULL")) cols=NULL - setkeyv(x, cols, verbose=verbose, physical=physical) -} - -# FR #1442 -setindex <- function(...) setkey(..., physical=FALSE) -setindexv <- function(x, cols, verbose=getOption("datatable.verbose")) { - if (is.list(cols)) { - sapply(cols, setkeyv, x=x, verbose=verbose, physical=FALSE) - return(invisible(x)) - } else { - setkeyv(x, cols, verbose=verbose, physical=FALSE) - } -} - -set2key <- function(...) { - stop("set2key() is now deprecated. Please use setindex() instead.") -} -set2keyv <- function(...) { - stop("set2keyv() is now deprecated. Please use setindexv() instead.") -} -key2 <- function(x) { - stop("key2() is now deprecated. Please use indices() instead.") -} - -setkeyv <- function(x, cols, verbose=getOption("datatable.verbose"), physical=TRUE) -{ - if (is.null(cols)) { # this is done on a data.frame when !cedta at top of [.data.table - if (physical) setattr(x,"sorted",NULL) - setattr(x,"index",NULL) # setkey(DT,NULL) also clears secondary keys. setindex(DT,NULL) just clears secondary keys. - return(invisible(x)) - } - if (!is.data.table(x)) stop("x is not a data.table") - if (!is.character(cols)) stop("cols is not a character vector. Please see further information in ?setkey.") - if (physical && identical(attr(x,".data.table.locked"),TRUE)) stop("Setting a physical key on .SD is reserved for possible future use; to modify the original data's order by group. Try setindex() instead. Or, set*(copy(.SD)) as a (slow) last resort.") - if (!length(cols)) { - warning("cols is a character vector of zero length. Removed the key, but use NULL instead, or wrap with suppressWarnings() to avoid this warning.") - setattr(x,"sorted",NULL) - return(invisible(x)) - } - if (identical(cols,"")) stop("cols is the empty string. Use NULL to remove the key.") - if (!all(nzchar(cols))) stop("cols contains some blanks.") - if (!length(cols)) { - cols = colnames(x) # All columns in the data.table, usually a few when used in this form - } else { - # remove backticks from cols - cols <- gsub("`", "", cols) - miss = !(cols %in% colnames(x)) - if (any(miss)) stop("some columns are not in the data.table: " %+% cols[miss]) - } - - ## determine, whether key is already present: - if (identical(key(x),cols)) { - ## key is present, nothing needs to be done - return(invisible(x)) - } else if(identical(head(key(x), length(cols)), cols)){ - ## key is present but x has a longer key. No sorting needed, only attribute is changed to shorter key. - setattr(x,"sorted",cols) - return(invisible(x)) - ## maybe additional speedup can be achieved if part of the key is already present? - } - - if (".xi" %chin% names(x)) stop("x contains a column called '.xi'. Conflicts with internal use by data.table.") - for (i in cols) { - .xi = x[[i]] # [[ is copy on write, otherwise checking type would be copying each column - if (!typeof(.xi) %chin% c("integer","logical","character","double")) stop("Column '",i,"' is type '",typeof(.xi),"' which is not supported as a key column type, currently.") - } - if (!is.character(cols) || length(cols)<1L) stop("'cols' should be character at this point in setkey") - if (verbose) { - tt = system.time(o <- forderv(x, cols, sort=TRUE, retGrp=FALSE)) # system.time does a gc, so we don't want this always on, until refcnt is on by default in R - cat("forder took", tt["user.self"]+tt["sys.self"], "sec\n") - } else { - o <- forderv(x, cols, sort=TRUE, retGrp=FALSE) - } - if (!physical) { - if (is.null(attr(x,"index",exact=TRUE))) setattr(x, "index", integer()) - setattr(attr(x,"index",exact=TRUE), paste0("__", cols, collapse=""), o) - return(invisible(x)) - } - setattr(x,"index",NULL) # TO DO: reorder existing indexes likely faster than rebuilding again. Allow optionally. Simpler for now to clear. - if (length(o)) { - if (verbose) { - tt = system.time(.Call(Creorder,x,o)) - cat("reorder took", tt["user.self"]+tt["sys.self"], "sec\n") - } else { - .Call(Creorder,x,o) - } - } else { - if (verbose) cat("x is already ordered by these columns, no need to call reorder\n") - } # else empty integer() from forderv means x is already ordered by those cols, nothing to do. - setattr(x,"sorted",cols) - invisible(x) -} - -key <- function(x) attr(x,"sorted",exact=TRUE) - -indices <- function(x, vectors = FALSE) { - ans = names(attributes(attr(x,"index",exact=TRUE))) - if (is.null(ans)) return(ans) # otherwise character() gets returned by next line - ans <- gsub("^__","",ans) - if (isTRUE(vectors)) - ans <- strsplit(ans, "__", fixed = TRUE) - ans -} - -"key<-" <- function(x,value) { - warning("The key(x)<-value form of setkey can copy the whole table. This is due to <- in R itself. Please change to setkeyv(x,value) or setkey(x,...) which do not copy and are faster. See help('setkey'). You can safely ignore this warning if it is inconvenient to change right now. Setting options(warn=2) turns this warning into an error, so you can then use traceback() to find and change your key<- calls.") - setkeyv(x,value) - # The returned value here from key<- is then copied by R before assigning to x, it seems. That's - # why we can't do anything about it without a change in R itself. If we return NULL (or invisible()) from this key<- - # method, the table gets set to NULL. So, although we call setkeyv(x,cols) here, and that doesn't copy, the - # returned value (x) then gets copied by R. - # So, solution is that caller has to call setkey or setkeyv directly themselves, to avoid <- dispatch and its copy. -} - -haskey <- function(x) !is.null(key(x)) - -# reverse a vector by reference (no copy) -setrev <- function(x) .Call(Csetrev, x) - -# reorder a vector based on 'order' (integer) -# to be used in fastorder instead of x[o], but in general, it's better to replace vector subsetting with this..? -# Basic checks that all items of order are in range 1:n with no NAs are now made inside Creorder. -# FOR INTERNAL USE ONLY -setreordervec <- function(x, order) .Call(Creorder, x, order) - -# sort = sort.int = sort.list = order = is.unsorted <- function(...) -# stop("Should never be called by data.table internals. Use is.sorted() on vectors, or forder() for lists and vectors.") -# Nice idea, but users might use these in i or j e.g. blocking order caused tests 304 to fail. -# Maybe just a grep through *.R for use of these function internally would be better (TO DO). - -# Don't use base::is.unsorted internally, because : -# 1) it uses locale whereas in data.table we control locale sorting independently (C locale currently, but -# "sorted" attribute will need an extra attribute "locale" so we can check if key's locale is the current locale) -# 2) wrapper needed, used to be : -# identical(FALSE,is.unsorted(x)) && !(length(x)==1 && is.na(x)) -# where the && was needed to maintain backwards compatibility after r-devel's change of is.unsorted(NA) to FALSE (was NA) [May 2013]. -# The others (order, sort.int etc) are turned off to protect ourselves from using them internally, for speed and for -# consistency; e.g., consistent twiddling of numeric/integer64, NA at the beginning of integer, locale ordering of character vectors. - -is.sorted <- function(x, by=seq_along(x)) { - if (is.list(x)) { - warning("Use 'if (length(o<-forderv(DT,by))) ...' for efficiency in one step, so you have o as well if not sorted.") - # could pass through a flag for forderv to return early on first FALSE. But we don't need that internally - # since internally we always then need ordering, an it's better in one step. Don't want inefficiency to creep in. - # This is only here for user/debugging use to check/test valid keys; e.g. data.table:::is.sorted(DT,by) - 0L == length(forderv(x,by,retGrp=FALSE,sort=TRUE)) - } else { - if (!missing(by)) stop("x is vector but 'by' is supplied") - .Call(Cfsorted, x) - } - # Cfsorted could be named CfIsSorted, but since "sorted" is an adjective not verb, it's clear; e.g., Cfsort would sort it ("sort" is verb). - # Return value of TRUE/FALSE is relied on in [.data.table quite a bit on vectors. Simple. Stick with that (rather than -1/0/+1) - # Important to call forder.c::fsorted here, for consistent character ordering and numeric/integer64 twiddling. -} - -forderv <- function(x, by=seq_along(x), retGrp=FALSE, sort=TRUE, order=1L, na.last=FALSE) -{ - if (!(sort || retGrp)) stop("At least one of retGrp or sort must be TRUE") - na.last = as.logical(na.last) - if (!length(na.last)) stop('length(na.last) = 0') - if (length(na.last) != 1L) { - warning("length(na.last) > 1, only the first element will be used") - na.last = na.last[1L] - } - # TO DO: export and document forder - if (is.atomic(x)) { - if (!missing(by) && !is.null(by)) stop("x is a single vector, non-NULL 'by' doesn't make sense") - by = NULL - if ( !missing(order) && (length(order) != 1L || !(order %in% c(1L, -1L))) ) - stop("x is a single vector, length(order) must be =1 and it's value should be 1 (ascending) or -1 (descending).") - } else { - if (!length(x)) return(integer(0L)) # to be consistent with base::order. this'll make sure forderv(NULL) will result in error - # (as base does) but forderv(data.table(NULL)) and forderv(list()) will return integer(0L)) - if (is.character(by)) { - w = chmatch(by, names(x)) - if (anyNA(w)) stop("'by' contains '",by[is.na(w)][1],"' which is not a column name") - by = w - } - else if (typeof(by)=="double" && isReallyReal(by)) { - stop("'by' is type 'double' but one or more items in it are not whole integers") - } - by = as.integer(by) - if ( (length(order) != 1L && length(order) != length(by)) || any(!order %in% c(1L, -1L)) ) - stop("x is a list, length(order) must be either =1 or =length(by) and each value should be 1 or -1 for each column in 'by', corresponding to ascending or descending order, respectively. If length(order) == 1, it will be recycled to length(by).") - if (length(order) == 1L) order = rep(order, length(by)) - } - order = as.integer(order) - .Call(Cforder, x, by, retGrp, sort, order, na.last) # returns integer() if already sorted, regardless of sort=TRUE|FALSE -} - -forder <- function(x, ..., na.last=TRUE, decreasing=FALSE) -{ - if (!is.data.table(x)) stop("x must be a data.table.") - if (ncol(x) == 0L) stop("Attempting to order a 0-column data.table.") - if (is.na(decreasing) || !is.logical(decreasing)) stop("'decreasing' must be logical TRUE or FALSE") - cols = substitute(list(...))[-1L] - if (identical(as.character(cols),"NULL") || !length(cols)) return(NULL) # to provide the same output as base::order - ans = x - order = rep(1L, length(cols)) - if (length(cols)) { - ans = vector("list", length(cols)) - cols = as.list(cols) - xcols = names(x) - for (i in seq_along(cols)) { - v=cols[[i]] - if (i == 1L && is.call(v) && length(v) == 2L && v[[1L]] == "list") return(1L) # to be consistent with base, see comment below under while loop - while (is.call(v) && length(v) == 2L && v[[1L]] != "list") { - # take care of "--x", "{-x}", "(---+x)" etc., cases and also "list(y)". 'list(y)' is ambiguous though. In base, with(DT, order(x, list(y))) will error - # that 'arguments are not of same lengths'. But with(DT, order(list(x), list(y))) will return 1L, which is very strange. On top of that, with(DT, - # order(x, as.list(10:1)) would return 'unimplemented type list'. It's all very inconsistent. But we HAVE to be consistent with base HERE. - if (!as.character(v[[1L]]) %chin% c("+", "-")) break # FIX for bug #5583 - if (v[[1L]] == "-") order[i] = -order[i] - v = v[[-1L]] - } - if (is.name(v)) { - ix <- chmatch(as.character(v), xcols, nomatch=0L) - if (ix != 0L) ans <- point(ans, i, x, ix) # see 'point' in data.table.R and C-version pointWrapper in assign.c - avoid copies - else { - v = as.call(list(as.name("list"), v)) - ans <- point(ans, i, eval(v, x, parent.frame()), 1L) - } - } else { - if (!is.object(eval(v, x, parent.frame()))) { - v = as.call(list(as.name("list"), v)) - ans = point(ans, i, eval(v, x, parent.frame()), 1L) # eval has to make a copy here (not due to list(.), but due to ex: "4-5*y"), unavoidable. - } else ans = point(ans, i, list(unlist(eval(v, x, parent.frame()))), 1L) - } # else stop("Column arguments to order by in 'forder' should be of type name/symbol (ex: quote(x)) or call (ex: quote(-x), quote(x+5*y))") - } - } - cols = seq_along(ans) - # Supported column types are checked at C level - o = forderv(ans, cols, sort=TRUE, retGrp=FALSE, order= if (decreasing) -order else order, na.last) - if (!length(o)) o = seq_along(ans[[1L]]) else o - o -} - -fsort <- function(x, decreasing = FALSE, na.last = FALSE, internal=FALSE, verbose=FALSE, ...) -{ - if (typeof(x)=="double" && !decreasing && !na.last) { - if (internal) stop("Internal code should not be being called on type double") - return(.Call(Cfsort, x, verbose)) - } else { - # fsort is now exported for testing. Trying to head off complaints "it's slow on integer" - # The only places internally we use fsort internally (3 calls, all on integer) have had internal=TRUE added for now. - # TODO: implement integer and character in Cfsort and remove this branch and warning - if (!internal) warning("Input is not a vector of type double. New parallel sort has only been done for double vectors so far. Invoking relatively inefficient sort using order first.") - o = forderv(x, order=!decreasing, na.last=na.last) - return( if (length(o)) x[o] else x ) # TO DO: document this shortcut for already-sorted - } -} - -setorder <- function(x, ..., na.last=FALSE) -# na.last=FALSE here, to be consistent with data.table's default -# as opposed to DT[order(.)] where na.last=TRUE, to be consistent with base -{ - if (!is.data.frame(x)) stop("x must be a data.frame or data.table.") - cols = substitute(list(...))[-1L] - if (identical(as.character(cols),"NULL")) return(x) - if (length(cols)) { - cols=as.list(cols) - order=rep(1L, length(cols)) - for (i in seq_along(cols)) { - v=as.list(cols[[i]]) - if (length(v) > 1L && v[[1L]] == "+") v=v[[-1L]] - else if (length(v) > 1L && v[[1L]] == "-") { - v=v[[-1L]] - order[i] = -1L - } - cols[[i]]=as.character(v) - } - cols=unlist(cols, use.names=FALSE) - } else { - cols=colnames(x) - order=rep(1L, length(cols)) - } - setorderv(x, cols, order, na.last) -} - -setorderv <- function(x, cols, order=1L, na.last=FALSE) -{ - if (is.null(cols)) return(x) - if (!is.data.frame(x)) stop("x must be a data.frame or data.table") - na.last = as.logical(na.last) - if (is.na(na.last) || !length(na.last)) stop('na.last must be logical TRUE/FALSE') - if (!is.character(cols)) stop("cols is not a character vector. Please see further information in ?setorder.") - if (!length(cols)) { - warning("cols is a character vector of zero length. Use NULL instead, or wrap with suppressWarnings() to avoid this warning.") - return(x) - } - if (!all(nzchar(cols))) stop("cols contains some blanks.") # TODO: probably I'm checking more than necessary here.. there are checks in 'forderv' as well - if (!length(cols)) { - cols = colnames(x) # All columns in the data.table, usually a few when used in this form - } else { - # remove backticks from cols - cols <- gsub("`", "", cols) - miss = !(cols %in% colnames(x)) - if (any(miss)) stop("some columns are not in the data.table: " %+% cols[miss]) - } - if (".xi" %in% colnames(x)) stop("x contains a column called '.xi'. Conflicts with internal use by data.table.") - for (i in cols) { - .xi = x[[i]] # [[ is copy on write, otherwise checking type would be copying each column - if (!typeof(.xi) %chin% c("integer","logical","character","double")) stop("Column '",i,"' is type '",typeof(.xi),"' which is not supported for ordering currently.") - } - if (!is.character(cols) || length(cols)<1L) stop("'cols' should be character at this point in setkey.") - - o = forderv(x, cols, sort=TRUE, retGrp=FALSE, order=order, na.last=na.last) - if (length(o)) { - .Call(Creorder, x, o) - if (is.data.frame(x) & !is.data.table(x)) { - .Call(Creorder, rn <- rownames(x), o) - setattr(x, 'row.names', rn) - } - setattr(x, 'sorted', NULL) # if 'forderv' is not 0-length, it means order has changed. So, set key to NULL, else retain key. - setattr(x, 'index', NULL) # remove secondary keys too. These could be reordered and retained, but simpler and faster to remove - } - invisible(x) -} - -binary <- function(x) .Call(Cbinary, x) - -setNumericRounding <- function(x) {.Call(CsetNumericRounding, as.integer(x)); invisible()} -getNumericRounding <- function() .Call(CgetNumericRounding) - -SJ <- function(...) { - JDT = as.data.table(list(...)) - setkey(JDT) -} -# S for Sorted, usually used in i to sort the i table - -# TO DO?: Use the CJ list() replication method for SJ (inside as.data.table.list?, #2109) too to avoid alloc.col - -CJ <- function(..., sorted = TRUE, unique = FALSE) -{ - # Pass in a list of unique values, e.g. ids and dates - # Cross Join will then produce a join table with the combination of all values (cross product). - # The last vector is varied the quickest in the table, so dates should be last for roll for example - l = list(...) - emptyList <- FALSE ## fix for #2511 - if(any(sapply(l, length) == 0L)){ - ## at least one column is empty The whole thing will be empty in the end - emptyList <- TRUE - l <- lapply(l, "[", 0L) - } - if (unique && !emptyList) l = lapply(l, unique) - - dups = FALSE # fix for #1513 - if (length(l)==1L && !emptyList && sorted && length(o <- forderv(l[[1L]]))) - l[[1L]] = l[[1L]][o] - else if (length(l) > 1L && !emptyList) { - # using rep.int instead of rep speeds things up considerably (but attributes are dropped). - attribs = lapply(l, attributes) # remember attributes for resetting after rep.int - n = vapply(l, length, 0L) #lengths(l) will work from R 3.2.0 - nrow = prod(n) - if (nrow > .Machine$integer.max) { - stop("Cross product of elements provided to CJ() would result in ",nrow," rows which exceeds .Machine$integer.max == ",.Machine$integer.max) - } - x = c(rev(take(cumprod(rev(n)))), 1L) - for (i in seq_along(x)) { - y = l[[i]] - # fix for #1513 - if (sorted) { - if (length(o <- forderv(y, retGrp=TRUE))) y = y[o] - if (!dups) dups = attr(o, 'maxgrpn') > 1L - } - if (i == 1L) - l[[i]] = rep.int(y, times = rep.int(x[i], n[i])) # i.e. rep(y, each=x[i]) - else if (i == length(n)) - l[[i]] = rep.int(y, times = nrow/(x[i]*n[i])) - else - l[[i]] = rep.int(rep.int(y, times = rep.int(x[i], n[i])), times = nrow/(x[i]*n[i])) - if (!is.null(attribs[[i]])){ - attributes(l[[i]]) <- attribs[[i]] # reset all attributes that were destroyed by rep.int - } - } - } - setattr(l, "row.names", .set_row_names(length(l[[1L]]))) - setattr(l, "class", c("data.table", "data.frame")) - - if (is.null(vnames <- names(l))) - vnames = vector("character", length(l)) - if (any(tt <- vnames == "")) { - vnames[tt] = paste0("V", which(tt)) - setattr(l, "names", vnames) - } - l <- alloc.col(l) # a tiny bit wasteful to over-allocate a fixed join table (column slots only), doing it anyway for consistency, and it's possible a user may wish to use SJ directly outside a join and would expect consistent over-allocation. - if (sorted) { - if (!dups) setattr(l, 'sorted', names(l)) - else setkey(l) # fix #1513 - } - l -} diff --git a/R/setops.R b/R/setops.R deleted file mode 100644 index 1a29d6dde5..0000000000 --- a/R/setops.R +++ /dev/null @@ -1,287 +0,0 @@ -# For internal use only (input symbol requirement is not checked) -# cols [symbol] - columns provided to function argument -# dt [symbol] - a data.table -# Iff all of 'cols' is present in 'x' return col indices -# is.data.table(dt) check should be performed in the calling function -validate <- function(cols, dt) { - argcols = deparse(substitute(cols)) - argdt = deparse(substitute(dt)) - origcols = cols - if (is.character(cols)) cols = chmatch(cols, names(dt)) - cols = as.integer(cols) - isna = which(!cols %in% seq_along(dt)) - if (length(isna)) - stop(argcols, " value(s) [", paste(origcols[isna], collapse=", "), "] not present (or out of range) in ", argdt) - cols -} - -# setdiff for data.tables, internal at the moment #547, used in not-join -setdiff_ <- function(x, y, by.x=seq_along(x), by.y=seq_along(y), use.names=FALSE) { - if (!is.data.table(x) || !is.data.table(y)) stop("x and y must both be data.tables") - if (is.null(x) || !length(x)) return(x) - by.x = validate(by.x, x) - if (is.null(y) || !length(y)) return(unique(x, by=by.x)) - by.y = validate(by.y, y) - if (length(by.x) != length(by.y)) stop("length(by.x) != length(by.y)") - # factor in x should've factor/character in y, and viceversa - for (a in seq_along(by.x)) { - lc = by.y[a] - rc = by.x[a] - icnam = names(y)[lc] - xcnam = names(x)[rc] - if ( is.character(x[[rc]]) && !(is.character(y[[lc]]) || is.factor(y[[lc]])) ) { - stop("When x's column ('",xcnam,"') is character, the corresponding column in y ('",icnam,"') should be factor or character, but found incompatible type '",typeof(y[[lc]]),"'.") - } else if ( is.factor(x[[rc]]) && !(is.character(y[[lc]]) || is.factor(y[[lc]])) ) { - stop("When x's column ('",xcnam,"') is factor, the corresponding column in y ('",icnam,"') should be character or factor, but found incompatible type '",typeof(y[[lc]]),"'.") - } else if ( (is.integer(x[[rc]]) || is.double(x[[rc]])) && (is.logical(y[[lc]]) || is.character(y[[lc]])) ) { - stop("When x's column ('",xcnam,"') is integer or numeric, the corresponding column in y ('",icnam,"') can not be character or logical types, but found incompatible type '",typeof(y[[lc]]),"'.") - } - } - ux = unique(shallow(x, by.x)) - uy = unique(shallow(y, by.y)) - ix = duplicated(rbind(uy, ux, use.names=use.names, fill=FALSE))[-seq_len(nrow(uy))] - .Call(CsubsetDT, ux, which_(ix, FALSE), seq_along(ux)) # more memory efficient version of which(!ix) -} - -# set operators ---- - -funique <- function(x) { - stopifnot(is.data.table(x)) - dup = duplicated(x) - if (any(dup)) .Call(CsubsetDT, x, which_(dup, FALSE), seq_along(x)) else x -} - -fintersect <- function(x, y, all=FALSE) { - if (!is.logical(all) || length(all) != 1L) stop("argument 'all' should be logical of length one") - if (!is.data.table(x) || !is.data.table(y)) stop("x and y must be both data.tables") - if (!identical(sort(names(x)), sort(names(y)))) stop("x and y must have same column names") - if (!identical(names(x), names(y))) stop("x and y must have same column order") - bad.type = setNames(c("raw","complex","list") %chin% c(vapply(x, typeof, FUN.VALUE = ""), vapply(y, typeof, FUN.VALUE = "")), c("raw","complex","list")) - if (any(bad.type)) stop(sprintf("x and y must not have unsupported column types: %s", paste(names(bad.type)[bad.type], collapse=", "))) - if (!identical(lapply(x, class), lapply(y, class))) stop("x and y must have same column classes") - if (".seqn" %in% names(x)) stop("None of the datasets to intersect should contain a column named '.seqn'") - if (!nrow(x) || !nrow(y)) return(x[0L]) - if (all) { - x = shallow(x)[, ".seqn" := rowidv(x)] - y = shallow(y)[, ".seqn" := rowidv(y)] - jn.on = c(".seqn",setdiff(names(x),".seqn")) - x[y, .SD, .SDcols=setdiff(names(x),".seqn"), nomatch=0L, on=jn.on] - } else { - x[funique(y), nomatch=0L, on=names(x), mult="first"] - } -} - -fsetdiff <- function(x, y, all=FALSE) { - if (!is.logical(all) || length(all) != 1L) stop("argument 'all' should be logical of length one") - if (!is.data.table(x) || !is.data.table(y)) stop("x and y must be both data.tables") - if (!identical(sort(names(x)), sort(names(y)))) stop("x and y must have same column names") - if (!identical(names(x), names(y))) stop("x and y must have same column order") - bad.type = setNames(c("raw","complex","list") %chin% c(vapply(x, typeof, FUN.VALUE = ""), vapply(y, typeof, FUN.VALUE = "")), c("raw","complex","list")) - if (any(bad.type)) stop(sprintf("x and y must not have unsupported column types: %s", paste(names(bad.type)[bad.type], collapse=", "))) - if (!identical(lapply(x, class), lapply(y, class))) stop("x and y must have same column classes") - if (".seqn" %in% names(x)) stop("None of the datasets to setdiff should contain a column named '.seqn'") - if (!nrow(x)) return(x) - if (!nrow(y)) return(if (!all) funique(x) else x) - if (all) { - x = shallow(x)[, ".seqn" := rowidv(x)] - y = shallow(y)[, ".seqn" := rowidv(y)] - jn.on = c(".seqn",setdiff(names(x),".seqn")) - x[!y, .SD, .SDcols=setdiff(names(x),".seqn"), on=jn.on] - } else { - funique(x[!y, on=names(x)]) - } -} - -funion <- function(x, y, all=FALSE) { - if (!is.logical(all) || length(all) != 1L) stop("argument 'all' should be logical of length one") - if (!is.data.table(x) || !is.data.table(y)) stop("x and y must be both data.tables") - if (!identical(sort(names(x)), sort(names(y)))) stop("x and y must have same column names") - if (!identical(names(x), names(y))) stop("x and y must have same column order") - bad.type = setNames(c("raw","complex", if(!all) "list") %chin% c(vapply(x, typeof, FUN.VALUE = ""), vapply(y, typeof, FUN.VALUE = "")), c("raw","complex", if(!all) "list")) - if (any(bad.type)) stop(sprintf("x and y must not have unsupported column types: %s", paste(names(bad.type)[bad.type], collapse=", "))) - if (!identical(lapply(x, class), lapply(y, class))) stop("x and y must have same column classes") - ans = rbindlist(list(x, y)) - if (!all) ans = funique(ans) - ans -} - -fsetequal <- function(x, y) { - if (!is.data.table(x) || !is.data.table(y)) stop("x and y must be both data.tables") - if (!identical(sort(names(x)), sort(names(y)))) stop("x and y must have same column names") - if (!identical(names(x), names(y))) stop("x and y must have same column order") - bad.type = setNames(c("raw","complex","list") %chin% c(vapply(x, typeof, FUN.VALUE = ""), vapply(y, typeof, FUN.VALUE = "")), c("raw","complex","list")) - if (any(bad.type)) stop(sprintf("x and y must not have unsupported column types: %s", paste(names(bad.type)[bad.type], collapse=", "))) - if (!identical(lapply(x, class), lapply(y, class))) stop("x and y must have same column classes") - isTRUE(all.equal.data.table(x, y, check.attributes = FALSE, ignore.row.order = TRUE)) -} - -# all.equal ---- - -all.equal.data.table <- function(target, current, trim.levels=TRUE, check.attributes=TRUE, ignore.col.order=FALSE, ignore.row.order=FALSE, tolerance=sqrt(.Machine$double.eps), ...) { - stopifnot(is.logical(trim.levels), is.logical(check.attributes), is.logical(ignore.col.order), is.logical(ignore.row.order), is.numeric(tolerance)) - if (!is.data.table(target) || !is.data.table(current)) stop("'target' and 'current' must be both data.tables") - - msg = character(0L) - # init checks that detect high level all.equal - if (nrow(current) != nrow(target)) msg = "Different number of rows" - if (ncol(current) != ncol(target)) msg = c(msg, "Different number of columns") - diff.colnames = !identical(sort(names(target)), sort(names(current))) - diff.colorder = !identical(names(target), names(current)) - if (check.attributes && diff.colnames) msg = c(msg, "Different column names") - if (!diff.colnames && !ignore.col.order && diff.colorder) msg = c(msg, "Different column order") - - if (length(msg)) return(msg) # skip check.attributes and further heavy processing - - # ignore.col.order - if (ignore.col.order && diff.colorder) current = setcolorder(shallow(current), names(target)) - - # Always check modes equal, like base::all.equal - targetModes = vapply_1c(target, mode) - currentModes = vapply_1c(current, mode) - if (any( d<-(targetModes!=currentModes) )) { - w = head(which(d),3L) - return(paste0("Datasets have different column modes. First 3: ",paste( - paste0(names(targetModes)[w],"(",paste(targetModes[w],currentModes[w],sep="!="),")") - ,collapse=" "))) - } - - if (check.attributes) { - squashClass = function(x) if (is.object(x)) paste(class(x),collapse=";") else mode(x) - # else mode() is so that integer==numeric, like base all.equal does. - targetTypes = vapply_1c(target, squashClass) - currentTypes = vapply_1c(current, squashClass) - if (length(targetTypes) != length(currentTypes)) - stop("Internal error: ncol(current)==ncol(target) was checked above") - if (any( d<-(targetTypes != currentTypes))) { - w = head(which(d),3L) - return(paste0("Datasets have different column classes. First 3: ",paste( - paste0(names(targetTypes)[w],"(",paste(targetTypes[w],currentTypes[w],sep="!="),")") - ,collapse=" "))) - } - } - - if (check.attributes) { - # check key - k1 = key(target) - k2 = key(current) - if (!identical(k1, k2)) { - return(sprintf("Datasets has different keys. 'target'%s. 'current'%s.", - if(length(k1)) paste0(": ", paste(k1, collapse=", ")) else " has no key", - if(length(k2)) paste0(": ", paste(k2, collapse=", ")) else " has no key")) - } - # check index - i1 = indices(target) - i2 = indices(current) - if (!identical(i1, i2)) { - return(sprintf("Datasets has different indexes. 'target'%s. 'current'%s.", - if(length(i1)) paste0(": ", paste(i1, collapse=", ")) else " has no index", - if(length(i2)) paste0(": ", paste(i2, collapse=", ")) else " has no index")) - } - - # Trim any extra row.names attributes that came from some inheritence - # Trim ".internal.selfref" as long as there is no `all.equal.externalptr` method - exclude.attrs = function(x, attrs = c("row.names",".internal.selfref")) x[!names(x) %in% attrs] - a1 = exclude.attrs(attributes(target)) - a2 = exclude.attrs(attributes(current)) - if (length(a1) != length(a2)) return(sprintf("Datasets has different number of (non-excluded) attributes: target %s, current %s", length(a1), length(a2))) - if (!identical(nm1 <- sort(names(a1)), nm2 <- sort(names(a2)))) return(sprintf("Datasets has attributes with different names: %s", paste(setdiff(union(names(a1), names(a2)), intersect(names(a1), names(a2))), collapse=", "))) - attrs.r = all.equal(a1[nm1], a2[nm2], ..., check.attributes = check.attributes) - if (is.character(attrs.r)) return(paste("Attributes: <", attrs.r, ">")) # skip further heavy processing - } - - if (ignore.row.order) { - if (".seqn" %in% names(target)) - stop("None of the datasets to compare should contain a column named '.seqn'") - bad.type = setNames(c("raw","complex","list") %chin% c(vapply(current, typeof, FUN.VALUE = ""), vapply(target, typeof, FUN.VALUE = "")), c("raw","complex","list")) - if (any(bad.type)) - stop(sprintf("Datasets to compare with 'ignore.row.order' must not have unsupported column types: %s", paste(names(bad.type)[bad.type], collapse=", "))) - if (between(tolerance, 0, sqrt(.Machine$double.eps), incbounds=FALSE)) { - warning(sprintf("Argument 'tolerance' was forced to lowest accepted value `sqrt(.Machine$double.eps)` from provided %s", format(tolerance, scientific=FALSE))) - tolerance = sqrt(.Machine$double.eps) - } - target_dup = as.logical(anyDuplicated(target)) - current_dup = as.logical(anyDuplicated(current)) - tolerance.msg = if (identical(tolerance, 0)) ", be aware you are using `tolerance=0` which may result into visually equal data" else "" - if (target_dup || current_dup) { - # handling 'tolerance' for duplicate rows - those `msg` will be returned only when equality with tolerance will fail - if (any(vapply_1c(target,typeof)=="double") && !identical(tolerance, 0)) { - if (target_dup && !current_dup) msg = c(msg, "Dataset 'target' has duplicate rows while 'current' doesn't") - else if (!target_dup && current_dup) msg = c(msg, "Dataset 'current' has duplicate rows while 'target' doesn't") - else { # both - if (!identical(tolerance, sqrt(.Machine$double.eps))) # non-default will raise error - stop("Duplicate rows in datasets, numeric columns and ignore.row.order cannot be used with non 0 tolerance argument") - msg = c(msg, "Both datasets have duplicate rows, they also have numeric columns, together with ignore.row.order this force 'tolerance' argument to 0") - tolerance = 0 - } - } else { # no numeric columns or tolerance==0L - if (target_dup && !current_dup) - return(sprintf("Dataset 'target' has duplicate rows while 'current' doesn't%s", tolerance.msg)) - if (!target_dup && current_dup) - return(sprintf("Dataset 'current' has duplicate rows while 'target' doesn't%s", tolerance.msg)) - } - } - jn.on = if (target_dup && current_dup) { - target = shallow(target)[, ".seqn" := rowidv(target)] - current = shallow(current)[, ".seqn" := rowidv(current)] - c(".seqn", setdiff(names(target), ".seqn")) - } else names(target) - # handling 'tolerance' for factor cols - those `msg` will be returned only when equality with tolerance will fail - if (any(vapply_1b(target,is.factor)) && !identical(tolerance, 0)) { - if (!identical(tolerance, sqrt(.Machine$double.eps))) # non-default will raise error - stop("Factor columns and ignore.row.order cannot be used with non 0 tolerance argument") - msg = c(msg, "Using factor columns together together with ignore.row.order, this force 'tolerance' argument to 0") - tolerance = 0 - } - # roll join to support 'tolerance' argument, conditional to retain support for factor when tolerance=0 - ans = if (identical(tolerance, 0)) target[current, nomatch=NA, which=TRUE, on=jn.on] else { - ans1 = target[current, roll=tolerance, rollends=TRUE, which=TRUE, on=jn.on] - ans2 = target[current, roll=-tolerance, rollends=TRUE, which=TRUE, on=jn.on] - pmin(ans1, ans2, na.rm=TRUE) - } - if (any_na(as_list(ans))) { - msg = c(msg, sprintf("Dataset 'current' has rows not present in 'target'%s%s", if (target_dup || current_dup) " or present in different quantity" else "", tolerance.msg)) - return(msg) - } - ans = if (identical(tolerance, 0)) current[target, nomatch=NA, which=TRUE, on=jn.on] else { - ans1 = current[target, roll=tolerance, rollends=TRUE, which=TRUE, on=jn.on] - ans2 = current[target, roll=-tolerance, rollends=TRUE, which=TRUE, on=jn.on] - pmin(ans1, ans2, na.rm=TRUE) - } - if (any_na(as_list(ans))) { - msg = c(msg, sprintf("Dataset 'target' has rows not present in 'current'%s%s", if (target_dup || current_dup) " or present in different quantity" else "", tolerance.msg)) - return(msg) - } - } else { - for (i in seq_along(target)) { - # trim.levels moved here - x = target[[i]] - y = current[[i]] - if (xor(is.factor(x),is.factor(y))) - return("Internal error: factor type mismatch should have been caught earlier") - cols.r = TRUE - if (is.factor(x)) { - if (!identical(levels(x),levels(y))) { - if (trim.levels) { - # do this regardless of check.attributes (that's more about classes, checked above) - x = factor(x) - y = factor(y) - if (!identical(levels(x),levels(y))) - cols.r = "Levels not identical even after refactoring since trim.levels is TRUE" - } else { - cols.r = "Levels not identical. No attempt to refactor because trim.levels is FALSE" - } - } else { - cols.r = all.equal(x, y, check.attributes=check.attributes) - # the check.attributes here refers to everything other than the levels, which are always - # dealt with according to trim.levels - } - } else { - cols.r = all.equal(unclass(x), unclass(y), tolerance=tolerance, ..., check.attributes=check.attributes) - # classes were explicitly checked earlier above, so ignore classes here. - } - if (!isTRUE(cols.r)) return(paste0("Column '", names(target)[i], "': ", paste(cols.r,collapse=" "))) - } - } - TRUE -} - diff --git a/R/shift.R b/R/shift.R deleted file mode 100644 index f6b4e860ec..0000000000 --- a/R/shift.R +++ /dev/null @@ -1,14 +0,0 @@ -shift <- function(x, n=1L, fill=NA, type=c("lag", "lead"), give.names=FALSE) { - type = match.arg(type) - ans = .Call(Cshift, x, as.integer(n), fill, type) - if (give.names) { - if (is.null(names(x))) { - xsub = substitute(x) - if (is.atomic(x) && is.name(xsub)) nx = deparse(xsub, 500L) - else nx = paste0("V", if (is.atomic(x)) 1L else seq_along(x)) - } - else nx = names(x) - setattr(ans, 'names', do.call("paste", c(CJ(nx, type, n, sorted=FALSE), sep="_"))) - } - ans -} diff --git a/R/tables.R b/R/tables.R deleted file mode 100644 index 1ff926d94f..0000000000 --- a/R/tables.R +++ /dev/null @@ -1,45 +0,0 @@ -# globals to pass NOTE from R CMD check, see http://stackoverflow.com/questions/9439256 -MB = NCOL = NROW = NULL - -tables <- function(mb=TRUE, order.col="NAME", width=80, - env=parent.frame(), silent=FALSE, index=FALSE) -{ - # Prints name, size and colnames of all data.tables in the calling environment by default - all_obj = objects(envir=env, all.names=TRUE) - is_DT = which(vapply_1b(all_obj, function(x) is.data.table(get(x, envir=env)))) - if (!length(is_DT)) { - if (!silent) cat("No objects of class data.table exist in", if (identical(env,.GlobalEnv)) ".GlobalEnv" else format(env), "\n") - return(invisible(data.table(NULL))) - } - DT_names = all_obj[is_DT] - info = rbindlist(lapply(DT_names, function(dt_n){ - DT = get(dt_n, envir=env) # doesn't copy - info_i = - data.table(NAME = dt_n, - NROW = nrow(DT), - NCOL = ncol(DT)) - if (mb) set(info_i, , "MB", round(as.numeric(object.size(DT))/1024^2)) - # mb is an option because object.size() appears to be slow. TO DO: revisit - set(info_i, , "COLS", list(list(names(DT)))) - set(info_i, , "KEY", list(list(key(DT)))) - if (index) set(info_i, , "INDICES", list(list(indices(DT)))) - info_i - })) - if (!order.col %in% names(info)) stop("order.col='",order.col,"' not a column name of info") - info = info[base::order(info[[order.col]])] # base::order to maintain locale ordering of table names - if (!silent) { - # prettier printing on console - pretty_format = function(x, width) { - format(prettyNum(x, big.mark=","), - width=width, justify="right") - } - tt = copy(info) - tt[ , NROW := pretty_format(NROW, width=4L)] - tt[ , NCOL := pretty_format(NCOL, width=4L)] - if (mb) tt[ , MB := pretty_format(MB, width=2L)] - print(tt, class=FALSE, nrow=Inf) - if (mb) cat("Total: ", prettyNum(sum(info$MB), big.mark=","), "MB\n", sep="") - } - invisible(info) -} - diff --git a/R/test.data.table.R b/R/test.data.table.R deleted file mode 100644 index f8b92fe774..0000000000 --- a/R/test.data.table.R +++ /dev/null @@ -1,265 +0,0 @@ -test.data.table <- function(verbose=FALSE, pkg="pkg", silent=FALSE, with.other.packages=FALSE, benchmark=FALSE) { - if (exists("test.data.table",.GlobalEnv,inherits=FALSE)) { - # package developer - # nocov start - if ("package:data.table" %in% search()) stop("data.table package is loaded. Unload or start a fresh R session.") - d = if (pkg %in% dir()) file.path(getwd(), pkg) else Sys.getenv("CC_DIR") - d = file.path(d, "inst/tests") - # nocov end - } else { - # i) R CMD check and ii) user running test.data.table() - d = paste0(getNamespaceInfo("data.table","path"),"/tests") - } - # for (fn in dir(d,"*.[rR]$",full=TRUE)) { # testthat runs those - - stopifnot( !(with.other.packages && benchmark) ) - fn = if (with.other.packages) "other.Rraw" - else if (benchmark) "benchmark.Rraw" - else "tests.Rraw" - fn = file.path(d, fn) - if (!file.exists(fn)) stop(fn," does not exist") - - oldverbose = options(datatable.verbose=verbose) - oldenc = options(encoding="UTF-8")[[1L]] # just for tests 708-712 on Windows - # TO DO: reinstate solution for C locale of CRAN's Mac (R-Forge's Mac is ok) - # oldlocale = Sys.getlocale("LC_CTYPE") - # Sys.setlocale("LC_CTYPE", "") # just for CRAN's Mac to get it off C locale (post to r-devel on 16 Jul 2012) - - cat("Running",fn,"\n") - env = new.env(parent=.GlobalEnv) - assign("testDir", function(x)file.path(d,x), envir=env) - assign("nfail", 0L, envir=env) - assign("ntest", 0L, envir=env) - assign("whichfail", NULL, envir=env) - setDTthreads(2) # explicitly limit to 2 so as not to breach CRAN policy (but tests are small so should not use more than 2 anyway) - assign("started.at", proc.time(), envir=env) - assign("lasttime", proc.time()[3L], envir=env) # used by test() to attribute time inbetween tests to the next test - assign("timings", data.table( ID = seq_len(3000L), time=0.0, nTest=0L ), envir=env) # test timings aggregated to integer id - assign("memtest", as.logical(Sys.getenv("TEST_DATA_TABLE_MEMTEST", "FALSE")), envir=env) - assign("inittime", as.integer(Sys.time()), envir=env) # keep measures from various test.data.table runs - # It doesn't matter that 3000L is far larger than needed for other and benchmark. - if(isTRUE(silent)){ - try(sys.source(fn,envir=env), silent=silent) # nocov - } else { - sys.source(fn,envir=env) - } - options(oldverbose) - options(oldenc) - # Sys.setlocale("LC_CTYPE", oldlocale) - setDTthreads(0) - invisible(env$nfail==0) -} - -# nocov start -compactprint <- function(DT, topn=2L) { - tt = vapply_1c(DT,function(x)class(x)[1L]) - tt[tt=="integer64"] = "i64" - tt = substring(tt, 1L, 3L) - makeString = function(x) paste(x, collapse = ",") # essentially toString.default - cn = paste0(" [Key=",makeString(key(DT)), - " Types=", makeString(substring(sapply(DT, typeof), 1L, 3L)), - " Classes=", makeString(tt), "]") - if (nrow(DT)) { - print(copy(DT)[,(cn):=""], topn=topn) - } else { - print(DT) # "Empty data.table (0 rows) of columns ... - if (ncol(DT)) cat(cn,"\n") - } - invisible() -} -# nocov end - -INT = function(...) { as.integer(c(...)) } # utility used in tests.Rraw - -ps_mem = function() { - # nocov start - cmd = sprintf("ps -o rss %s | tail -1", Sys.getpid()) - ans = tryCatch(as.numeric(system(cmd, intern=TRUE)), error=function(e) NA_real_) - stopifnot(length(ans)==1L) # extra check if other OSes would not handle 'tail -1' properly for some reason - # returns RSS memory occupied by current R process in MB rounded to 1 decimal places (as in gc), ps already returns KB - c("PS_rss"=round(ans / 1024, 1)) - # nocov end -} - -gc_mem = function() { - # nocov start - # gc reported memory in MB - m = apply(gc()[, c(2L, 4L, 6L)], 2L, sum) - names(m) = c("GC_used", "GC_gc_trigger", "GC_max_used") - m - # nocov end -} - -test <- function(num,x,y=TRUE,error=NULL,warning=NULL,output=NULL) { - # Usage: - # i) tests that x equals y when both x and y are supplied, the most common usage - # ii) tests that x is TRUE when y isn't supplied - # iii) if error is supplied, y should be missing and x is tested to result in an error message matching the pattern - # iv) if warning is supplied, y is checked to equal x, and x should result in a warning message matching the pattern - # v) if output is supplied, x is evaluated and printed and the output is checked to match the pattern - # num just needs to be numeric and unique. We normally increment integers at the end, but inserts can be made using decimals e.g. 10,11,11.1,11.2,12,13,... - # Motivations: - # 1) we'd like to know all tests that fail not just stop at the first. This often helps by revealing a common feature across a set of - # failing tests - # 2) test() tests more deeply than a diff on console output and uses a data.table appropriate definition of "equals" different - # from all.equal and different to identical related to row.names and unused factor levels - # 3) each test has a unique id which we refer to in commit messages, emails etc. - # 4) test that a query generates exactly 2 warnings, that they are both the correct warning messages, and that the result is the one expected - .test.data.table = exists("nfail", parent.frame()) # test() can be used inside functions defined in tests.Rraw, so inherits=TRUE (default) here - if (.test.data.table) { - nfail = get("nfail", parent.frame()) # to cater for both test.data.table() and stepping through tests in dev - whichfail = get("whichfail", parent.frame()) - assign("ntest", get("ntest", parent.frame()) + 1L, parent.frame(), inherits=TRUE) # bump number of tests run - lasttime = get("lasttime", parent.frame()) - timings = get("timings", parent.frame()) - memtest = get("memtest", parent.frame()) - inittime = get("inittime", parent.frame()) - time = nTest = NULL # to avoid 'no visible binding' note - on.exit( { - now = proc.time()[3] - took = now-lasttime # so that prep time between tests is attributed to the following test - assign("lasttime", now, parent.frame(), inherits=TRUE) - timings[ as.integer(num), `:=`(time=time+took, nTest=nTest+1L), verbose=FALSE ] - } ) - cat("\rRunning test id", sprintf("%.8g", num), " ") - flush.console() - # This flush is for Windows to make sure last test number is written to file in CRAN and win-builder output where - # console output is captured. \r seems especially prone to not being auto flushed. The downside is that the last 13 - # lines output are filled with the last 13 "running test num" lines rather than the last error output, but that's - # better than the dev-time-lost when it crashes and it actually crashed much later than the last test number visible. - } - - if (!missing(error) && !missing(y)) stop("Test ",num," is invalid: when error= is provided it does not make sense to pass y as well") - - string_match = function(x, y) { - length(grep(x,y,fixed=TRUE)) || # try treating x as literal first; useful for most messages containing ()[]+ characters - length(tryCatch(grep(x,y), error=function(e)NULL)) # otherwise try x as regexp - } - - xsub = substitute(x) - ysub = substitute(y) - - actual.warns = NULL - wHandler = function(w) { - # Thanks to: https://stackoverflow.com/a/4947528/403310 - actual.warns <<- c(actual.warns, conditionMessage(w)) - invokeRestart("muffleWarning") - } - actual.err = NULL - eHandler = function(e) { - actual.err <<- conditionMessage(e) - e - } - if (memtest) { - timestamp = as.numeric(Sys.time()) # nocov - } - if (is.null(output)) { - x = tryCatch(withCallingHandlers(x, warning=wHandler), error=eHandler) - # save the overhead of capture.output() since there are a lot of tests, often called in loops - } else { - out = capture.output(print(x <<- tryCatch(withCallingHandlers(x, warning=wHandler), error=eHandler))) - } - if (memtest) { - mem = as.list(c(inittime=inittime, timestamp=timestamp, test=num, ps_mem(), gc_mem())) # nocov - fwrite(mem, "memtest.csv", append=TRUE) # nocov - } - fail = FALSE - if (length(warning) != length(actual.warns)) { - # nocov start - cat("Test",num,"produced",length(actual.warns),"warnings but expected",length(warning),"\n") - cat(paste("Expected:",warning), sep="\n") - cat(paste("Observed:",actual.warns), sep="\n") - fail = TRUE - # nocov end - } else { - # the expected warning occurred and, if more than 1 warning, in the expected order - for (i in seq_along(warning)) { - if (!string_match(warning[i], actual.warns[i])) { - # nocov start - cat("Test",num,"didn't produce the correct warning:\n") - cat("Expected: ", warning[i], "\n") - cat("Observed: ", actual.warns[i], "\n") - fail = TRUE - # nocov end - } - } - } - if (length(error) != length(actual.err)) { - # nocov start - cat("Test",num," ") - if (length(error)) cat("had no error but expected error: ", error, "\n") - else cat("should not fail but failed with error: ", actual.err, "\n") - fail = TRUE - # nocov end - } else if (length(error)) { - if (!string_match(error, actual.err)) { - # nocov start - cat("Test",num,"didn't produce the correct error:\n") - cat("Expected: ", error, "\n") - cat("Observed: ", actual.err, "\n") - fail = TRUE - # nocov end - } - } - - if (!fail && !length(error) && length(output)) { - if (out[length(out)] == "NULL") out = out[-length(out)] - out = paste(out, collapse="\n") - output = paste(output, collapse="\n") # so that output= can be either a \n separated string, or a vector of strings. - if (!string_match(output, out)) { - # nocov start - cat("Test",num,"didn't produce correct output:\n") - cat("Expected: <<",gsub("\n","\\\\n",output),">>\n",sep="") # \n printed as '\\n' so the two lines of output can be compared vertically - cat("Observed: <<",gsub("\n","\\\\n",out),">>\n",sep="") - fail = TRUE - # nocov end - } - } - if (!fail && !length(error) && (!length(output) || !missing(y))) { # TODO test y when output=, too - y = try(y,TRUE) - if (identical(x,y)) return(invisible()) - all.equal.result = TRUE - if (is.data.table(x) && is.data.table(y)) { - if (!selfrefok(x) || !selfrefok(y)) { - # nocov start - cat("Test ",num," ran without errors but selfrefok(", if(!selfrefok(x))"x"else"y", ") is FALSE\n", sep="") - fail = TRUE - # nocov end - } else { - xc=copy(x) - yc=copy(y) # so we don't affect the original data which may be used in the next test - # drop unused levels in factors - if (length(x)) for (i in which(vapply_1b(x,is.factor))) {.xi=x[[i]];xc[,(i):=factor(.xi)]} - if (length(y)) for (i in which(vapply_1b(y,is.factor))) {.yi=y[[i]];yc[,(i):=factor(.yi)]} - setattr(xc,"row.names",NULL) # for test 165+, i.e. x may have row names set from inheritance but y won't, consider these equal - setattr(yc,"row.names",NULL) - setattr(xc,"index",NULL) # too onerous to create test RHS with the correct index as well, just check result - setattr(yc,"index",NULL) - if (identical(xc,yc) && identical(key(x),key(y))) return(invisible()) # check key on original x and y because := above might have cleared it on xc or yc - if (isTRUE(all.equal.result<-all.equal(xc,yc)) && identical(key(x),key(y)) && - identical(vapply_1c(xc,typeof), vapply_1c(yc,typeof))) return(invisible()) - } - } - if (is.atomic(x) && is.atomic(y) && isTRUE(all.equal.result<-all.equal(x,y,check.names=!isTRUE(y))) && typeof(x)==typeof(y)) return(invisible()) - # For test 617 on r-prerel-solaris-sparc on 7 Mar 2013 - # nocov start - if (!fail) { - cat("Test",num,"ran without errors but failed check that x equals y:\n") - cat("> x =",deparse(xsub),"\n") - if (is.data.table(x)) compactprint(x) else {cat("First 6 of ", length(x)," (type '", typeof(x), "'): ", sep=""); print(head(x))} - cat("> y =",deparse(ysub),"\n") - if (is.data.table(y)) compactprint(y) else {cat("First 6 of ", length(y)," (type '", typeof(y), "'): ", sep=""); print(head(y))} - if (!isTRUE(all.equal.result)) cat(all.equal.result,sep="\n") - fail = TRUE - } - # nocov end - } - if (fail && .test.data.table) { - # nocov start - assign("nfail", nfail+1L, parent.frame(), inherits=TRUE) - assign("whichfail", c(whichfail, num), parent.frame(), inherits=TRUE) - # nocov end - } - invisible() -} - diff --git a/R/timetaken.R b/R/timetaken.R deleted file mode 100644 index 817e4418db..0000000000 --- a/R/timetaken.R +++ /dev/null @@ -1,17 +0,0 @@ -timetaken <- function(started.at) -{ - if (!inherits(started.at,"proc_time")) stop("Use started.at=proc.time() (faster) not Sys.time() (POSIXt and slow)") - secs = proc.time()[3L] - started.at[3L] - mins = as.integer(secs) %/% 60L - hrs = mins %/% 60L - days = hrs %/% 24L - mins = mins - hrs * 60L - hrs = hrs - days * 24L - if (secs > 60.0) { - res = if (days>=1L) paste0(days," day", if (days>1L) "s " else " ") else "" - paste0(res,sprintf("%02d:%02d:%02d", hrs, mins, as.integer(secs) %% 60L)) - } else { - sprintf(if (secs >= 10.0) "%.1fsec" else "%.3fsec", secs) - } -} - diff --git a/R/transpose.R b/R/transpose.R deleted file mode 100644 index 5b32b22e33..0000000000 --- a/R/transpose.R +++ /dev/null @@ -1,36 +0,0 @@ -transpose <- function(l, fill=NA, ignore.empty=FALSE) { - ans = .Call(Ctranspose, l, fill, ignore.empty) - if (is.data.table(l)) setDT(ans) - else if (is.data.frame(l)) { - if (is.null(names(ans))) - setattr(ans, "names", paste0("V", seq_along(ans))) - setattr(ans, "row.names", .set_row_names(length(ans[[1L]]))) - setattr(ans, "class", "data.frame") - } - ans[] -} - -tstrsplit <- function(x, ..., fill=NA, type.convert=FALSE, keep, names=FALSE) { - ans = transpose(strsplit(as.character(x), ...), fill=fill, ignore.empty=FALSE) - if (!missing(keep)) { - keep = suppressWarnings(as.integer(keep)) - chk = min(keep) >= min(1L, length(ans)) & max(keep) <= length(ans) - if (!isTRUE(chk)) # handles NA case too - stop("'keep' should contain integer values between ", - min(1L, length(ans)), " and ", length(ans), ".") - ans = ans[keep] - } - # Implementing #1094, but default FALSE - if(type.convert) ans = lapply(ans, type.convert, as.is = TRUE) - if (identical(names, FALSE)) return(ans) - else if (isTRUE(names)) names = paste0("V", seq_along(ans)) - if (!is.character(names)) - stop("'names' must be TRUE/FALSE or a character vector.") - if (length(names) != length(ans)) { - str = if (missing(keep)) "ans" else "keep" - stop("length(names) (= ", length(names), - ") is not equal to length(", str, ") (= ", length(ans), ").") - } - setattr(ans, 'names', names) - ans -} diff --git a/R/uniqlist.R b/R/uniqlist.R deleted file mode 100644 index 06831ce12a..0000000000 --- a/R/uniqlist.R +++ /dev/null @@ -1,24 +0,0 @@ - -uniqlist <- function (l, order = -1L) -{ - # Assumes input list is ordered by each list item (or by 'order' if supplied), and that all list elements are the same length - # Finds the non-duplicate rows. Was called duplist but now grows vector - doesn't over-allocate result vector and - # is >2x times faster on numeric types - # TO DO: Possibly reinstate reverse argument : - # FALSE works in the usual duplicated() way, the first in a sequence of dups, will be FALSE - # TRUE has the last in a sequence of dups FALSE (so you can keep the last if thats required) - # l = list(...) - if (!is.list(l)) - stop("l not type list") - if (!length(l)) return(list(0L)) - ans <- .Call(Cuniqlist, l, as.integer(order)) - ans -} - -# implemented for returning the lengths of groups obtained from uniqlist (for internal use only) -uniqlengths <- function(x, len) { - # check for type happens in C, but still converting to integer here to be sure. - ans <- .Call(Cuniqlengths, as.integer(x), as.integer(len)) - ans -} - diff --git a/R/utils.R b/R/utils.R deleted file mode 100644 index 37e802fc92..0000000000 --- a/R/utils.R +++ /dev/null @@ -1,73 +0,0 @@ -# all non-exported / unused internal (utility) functions - -# which.first -which.first <- function(x) -{ - if (!is.logical(x)) { - stop("x not boolean") - } - match(TRUE, x) -} - -# which.last -which.last <- function(x) -{ - if (!is.logical(x)) { - stop("x not boolean") - } - length(x) - match(TRUE, rev(x)) + 1L -} - -# trim -trim <- function(x) { - # Removes whitespace at the beginning and end of strings - # Assigning to x[] to retain the original dimensions, rownames and colnames - x[] = gsub(" +$", "", x) - x[] = gsub("^ +", "", x) - x -} - -# take (I don't see it being used anywhere) -take <- function(x, n=1L) -{ - # returns the head of head, without the last n observations - # convenient when inlining expressions - # NROW, for vectors, returns the vector length, but we cater for non-table like lists also here - # TO DO: allow taking along any dimension e.g. all but last column, rather than all but last row. - if (is.list(x) && !is.data.frame(x) && !is.data.table(x)) l = length(x) - else l = NROW(x) - if (l < n) stop("Cannot take ",n," from ",l) - head(x, l-n) -} -# TODO: Implement take as UseMethod. Specific methods for each type. - -# plus -"%+%" <- function(x,y) -UseMethod("%+%") - -"%+%.default" <- function(x,y) paste0(paste(x,collapse=","),paste(y,collapse=",")) -# we often construct warning msgs with a msg followed by several items of a vector, so %+% is for convenience - -require_bit64 = function() { - # called in fread and print when they see integer64 columns are present - if (!requireNamespace("bit64",quietly=TRUE)) - warning("Some columns are type 'integer64' but package bit64 is not installed. Those columns will print as strange looking floating point data. There is no need to reload the data. Simply install.packages('bit64') to obtain the integer64 print method and print the data again.") -} - -# vapply for return value character(1) -vapply_1c <- function (x, fun, ..., use.names = TRUE) { - vapply(X = x, FUN = fun, ..., FUN.VALUE = NA_character_, USE.NAMES = use.names) -} - -# vapply for return value logical(1) -vapply_1b <- function (x, fun, ..., use.names = TRUE) { - vapply(X = x, FUN = fun, ..., FUN.VALUE = NA, USE.NAMES = use.names) -} - -# vapply for return value integer(1) -vapply_1i <- function (x, fun, ..., use.names = TRUE) { - vapply(X = x, FUN = fun, ..., FUN.VALUE = NA_integer_, USE.NAMES = use.names) -} - -more = function(f) system(paste("more",f)) # nocov (just a dev helper) - diff --git a/R/xts.R b/R/xts.R deleted file mode 100644 index 60d27086b6..0000000000 --- a/R/xts.R +++ /dev/null @@ -1,17 +0,0 @@ -as.data.table.xts <- function(x, keep.rownames = TRUE, ...) { - stopifnot(requireNamespace("xts"), !missing(x), xts::is.xts(x)) - r = setDT(as.data.frame(x, row.names=NULL)) - if (!keep.rownames) return(r[]) - if ("index" %in% names(x)) stop("Input xts object should not have 'index' column because it would result in duplicate column names. Rename 'index' column in xts or use `keep.rownames=FALSE` and add index manually as another column.") - r[, "index" := zoo::index(x)] - setcolorder(r, c("index", setdiff(names(r), "index")))[] -} - -as.xts.data.table <- function(x, ...) { - stopifnot(requireNamespace("xts"), !missing(x), is.data.table(x)) - if (!xts::is.timeBased(x[[1L]])) stop("data.table must have a time based column in first position, use `setcolorder` function to change the order, or see ?timeBased for supported types") - colsNumeric = vapply_1b(x, is.numeric)[-1L] # exclude first col, xts index - if (any(!colsNumeric)) warning(paste("Following columns are not numeric and will be omitted:", paste(names(colsNumeric)[!colsNumeric], collapse = ", "))) - r = setDF(x[, .SD, .SDcols = names(colsNumeric)[colsNumeric]]) - return(xts::as.xts(r, order.by = if ("IDate" %in% class(x[[1L]])) as.Date(x[[1L]]) else x[[1L]])) -} diff --git a/inst/tests/1206FUT.txt b/inst/tests/1206FUT.txt deleted file mode 100644 index c31c7db1c2..0000000000 --- a/inst/tests/1206FUT.txt +++ /dev/null @@ -1,309 +0,0 @@ -DATE COM COM_MM COM_YY OPEN_1 OPEN_I1 OPEN_2 OPEN_I2 HIGH HIGH_I LOW LOW_I CLSE_1 CLSE_I1 CLSE_2 CLSE_I2 SETTLE VOLUME OINT DEL RECTYP -20121206 AP 000879.17 000879.99 000876.41 000878.69 -20121206 EX 002598.11 002617.83 002590.51 002603.41 -20121206 CN 007203.54 007235.40 007153.29 007202.63 -20121206 HK 012232.40 012278.00 012200.81 012215.93 -20121206 ID 005093.97 005106.74 005066.37 005072.28 -20121206 IN 005926.30 005942.55 005838.90 005930.90 -20121206 NK 009535.69 009565.43 009503.31 009545.16 -20121206 SG 000350.41 000350.59 000348.32 000350.03 -20121206 ST 003081.25 003082.88 003065.79 003078.20 -20121206 TW 000276.26 000276.85 000274.85 000275.15 -20121206 AH 12 2012 000000000 000000000 000000000 000000000 000000000 000000000 000210400 000000 000002 00000 A -20121206 AH 01 2013 000000000 000000000 000000000 000000000 000000000 000000000 000208300 000000 000021 00000 A -20121206 AH 02 2013 000000000 000000000 000000000 000000000 000000000 000000000 000209500 000000 000000 00000 A -20121206 AH 03 2013 000000000 000000000 000000000 000000000 000000000 000000000 000210400 000000 000000 00000 A -20121206 AH 04 2013 000000000 000000000 000000000 000000000 000000000 000000000 000211100 000000 000000 00000 A -20121206 AH 05 2013 000000000 000000000 000000000 000000000 000000000 000000000 000211850 000000 000000 00000 A -20121206 AH 06 2013 000000000 000000000 000000000 000000000 000000000 000000000 000212650 000000 000000 00000 A -20121206 AH 07 2013 000000000 000000000 000000000 000000000 000000000 000000000 000213350 000000 000000 00000 A -20121206 AH 08 2013 000000000 000000000 000000000 000000000 000000000 000000000 000214250 000000 000000 00000 A -20121206 AH 09 2013 000000000 000000000 000000000 000000000 000000000 000000000 000215000 000000 000000 00000 A -20121206 AH 10 2013 000000000 000000000 000000000 000000000 000000000 000000000 000215750 000000 000000 00000 A -20121206 AH 11 2013 000000000 000000000 000000000 000000000 000000000 000000000 000216600 000000 000000 00000 A -20121206 AP 12 2012 000000000 000000000 000000000 000000000 000000000 000000000 000087650 000000 000000 00000 A -20121206 AP 01 2013 000000000 000000000 000000000 000000000 000000000 000000000 000087650 000000 000000 00000 A -20121206 AP 02 2013 000000000 000000000 000000000 000000000 000000000 000000000 000087700 000000 000000 00000 A -20121206 AP 03 2013 000000000 000000000 000000000 000000000 000000000 000000000 000087700 000000 000000 00000 A -20121206 CN 12 2012 000729500 000000000 000736000 000723000 000724500 000000000 000724500 071547 240250 00000 A -20121206 CN 01 2013 000732500 000000000 000739500 000726000 000727500 000000000 000728500 008678 006896 00000 A -20121206 CN 02 2013 000000000 000000000 000000000 000000000 000000000 000000000 000725000 000000 000000 00000 A -20121206 CN 03 2013 000000000 000000000 000000000 000000000 000000000 000000000 000725500 000000 000000 00000 A -20121206 CN 06 2013 000000000 000000000 000000000 000000000 000000000 000000000 000714000 000000 000000 00000 A -20121206 CN 09 2013 000000000 000000000 000000000 000000000 000000000 000000000 000710000 000000 000000 00000 A -20121206 CU 12 2012 000000000 000000000 000000000 000000000 000000000 000000000 000800700 000000 000005 00000 A -20121206 CU 01 2013 000000000 000000000 000000000 000000000 000000000 000000000 000801500 000000 000002 00000 A -20121206 CU 02 2013 000000000 000000000 000000000 000000000 000000000 000000000 000802200 000000 000002 00000 A -20121206 CU 03 2013 000000000 000000000 000000000 000000000 000000000 000000000 000802900 000000 000000 00000 A -20121206 CU 04 2013 000000000 000000000 000000000 000000000 000000000 000000000 000803400 000000 000000 00000 A -20121206 CU 05 2013 000000000 000000000 000000000 000000000 000000000 000000000 000803900 000000 000000 00000 A -20121206 CU 06 2013 000000000 000000000 000000000 000000000 000000000 000000000 000804300 000000 000000 00000 A -20121206 CU 07 2013 000000000 000000000 000000000 000000000 000000000 000000000 000804600 000000 000000 00000 A -20121206 CU 08 2013 000000000 000000000 000000000 000000000 000000000 000000000 000804900 000000 000000 00000 A -20121206 CU 09 2013 000000000 000000000 000000000 000000000 000000000 000000000 000805200 000000 000000 00000 A -20121206 CU 10 2013 000000000 000000000 000000000 000000000 000000000 000000000 000805400 000000 000000 00000 A -20121206 CU 11 2013 000000000 000000000 000000000 000000000 000000000 000000000 000805600 000000 000000 00000 A -20121206 ED 12 2012 000000000 000000000 000000000 000000000 000000000 000000000 000996925 000000 001511 00000 A -20121206 ED 01 2013 000000000 000000000 000000000 000000000 000000000 000000000 000996950 000000 000000 00000 A -20121206 ED 02 2013 000000000 000000000 000000000 000000000 000000000 000000000 000996950 000000 000000 00000 A -20121206 ED 03 2013 000000000 000000000 000000000 000000000 000000000 000000000 000996950 000000 000346 00000 A -20121206 ED 04 2013 000000000 000000000 000000000 000000000 000000000 000000000 000996950 000000 000000 00000 A -20121206 ED 05 2013 000000000 000000000 000000000 000000000 000000000 000000000 000997000 000000 000000 00000 A -20121206 ED 06 2013 000000000 000000000 000000000 000000000 000000000 000000000 000996800 000000 000249 00000 A -20121206 ED 09 2013 000000000 000000000 000000000 000000000 000000000 000000000 000996700 000000 000260 00000 A -20121206 ED 12 2013 000000000 000000000 000000000 000000000 000000000 000000000 000996450 000000 000300 00000 A -20121206 ED 03 2014 000000000 000000000 000000000 000000000 000000000 000000000 000996250 000000 000120 00000 A -20121206 ED 06 2014 000000000 000000000 000000000 000000000 000000000 000000000 000995950 000000 000100 00000 A -20121206 ED 09 2014 000000000 000000000 000000000 000000000 000000000 000000000 000995600 000000 001003 00000 A -20121206 ED 12 2014 000000000 000000000 000000000 000000000 000000000 000000000 000995100 000000 000003 00000 A -20121206 ED 03 2015 000000000 000000000 000000000 000000000 000000000 000000000 000994650 000000 000003 00000 A -20121206 ED 06 2015 000000000 000000000 000000000 000000000 000000000 000000000 000994000 000000 000000 00000 A -20121206 ED 09 2015 000000000 000000000 000000000 000000000 000000000 000000000 000993200 000000 000000 00000 A -20121206 ED 12 2015 000000000 000000000 000000000 000000000 000000000 000000000 000992150 000000 000000 00000 A -20121206 ED 03 2016 000000000 000000000 000000000 000000000 000000000 000000000 000991000 000000 000000 00000 A -20121206 ED 06 2016 000000000 000000000 000000000 000000000 000000000 000000000 000989700 000000 000000 00000 A -20121206 ED 09 2016 000000000 000000000 000000000 000000000 000000000 000000000 000988300 000000 000000 00000 A -20121206 ED 12 2016 000000000 000000000 000000000 000000000 000000000 000000000 000986800 000000 000000 00000 A -20121206 ED 03 2017 000000000 000000000 000000000 000000000 000000000 000000000 000985450 000000 000000 00000 A -20121206 ED 06 2017 000000000 000000000 000000000 000000000 000000000 000000000 000984050 000000 000000 00000 A -20121206 ED 09 2017 000000000 000000000 000000000 000000000 000000000 000000000 000982650 000000 000000 00000 A -20121206 ED 12 2017 000000000 000000000 000000000 000000000 000000000 000000000 000981150 000000 000000 00000 A -20121206 ED 03 2018 000000000 000000000 000000000 000000000 000000000 000000000 000979950 000000 000000 00000 A -20121206 ED 06 2018 000000000 000000000 000000000 000000000 000000000 000000000 000978700 000000 000000 00000 A -20121206 ED 09 2018 000000000 000000000 000000000 000000000 000000000 000000000 000977600 000000 000000 00000 A -20121206 ED 12 2018 000000000 000000000 000000000 000000000 000000000 000000000 000976400 000000 000000 00000 A -20121206 ED 03 2019 000000000 000000000 000000000 000000000 000000000 000000000 000975550 000000 000000 00000 A -20121206 ED 06 2019 000000000 000000000 000000000 000000000 000000000 000000000 000974650 000000 000000 00000 A -20121206 ED 09 2019 000000000 000000000 000000000 000000000 000000000 000000000 000973800 000000 000000 00000 A -20121206 ED 12 2019 000000000 000000000 000000000 000000000 000000000 000000000 000972900 000000 000000 00000 A -20121206 ED 03 2020 000000000 000000000 000000000 000000000 000000000 000000000 000972350 000000 000000 00000 A -20121206 ED 06 2020 000000000 000000000 000000000 000000000 000000000 000000000 000971800 000000 000000 00000 A -20121206 ED 09 2020 000000000 000000000 000000000 000000000 000000000 000000000 000971200 000000 000000 00000 A -20121206 ED 12 2020 000000000 000000000 000000000 000000000 000000000 000000000 000970500 000000 000000 00000 A -20121206 ED 03 2021 000000000 000000000 000000000 000000000 000000000 000000000 000970100 000000 000000 00000 A -20121206 ED 06 2021 000000000 000000000 000000000 000000000 000000000 000000000 000969750 000000 000000 00000 A -20121206 ED 09 2021 000000000 000000000 000000000 000000000 000000000 000000000 000969350 000000 000000 00000 A -20121206 ED 12 2021 000000000 000000000 000000000 000000000 000000000 000000000 000968900 000000 000000 00000 A -20121206 ED 03 2022 000000000 000000000 000000000 000000000 000000000 000000000 000968650 000000 000000 00000 A -20121206 ED 06 2022 000000000 000000000 000000000 000000000 000000000 000000000 000968300 000000 000000 00000 A -20121206 ED 09 2022 000000000 000000000 000000000 000000000 000000000 000000000 000967850 000000 000000 00000 A -20121206 EL 12 2012 000000000 000000000 000000000 000000000 000000000 000000000 000996650 000000 000000 00000 A -20121206 EL 03 2013 000000000 000000000 000000000 000000000 000000000 000000000 000997075 000000 000000 00000 A -20121206 EL 06 2013 000000000 000000000 000000000 000000000 000000000 000000000 000997300 000000 000000 00000 A -20121206 EL 09 2013 000000000 000000000 000000000 000000000 000000000 000000000 000997375 000000 000000 00000 A -20121206 EL 12 2013 000000000 000000000 000000000 000000000 000000000 000000000 000997400 000000 000000 00000 A -20121206 EL 03 2014 000000000 000000000 000000000 000000000 000000000 000000000 000997400 000000 000000 00000 A -20121206 EL 06 2014 000000000 000000000 000000000 000000000 000000000 000000000 000996950 000000 000000 00000 A -20121206 EL 09 2014 000000000 000000000 000000000 000000000 000000000 000000000 000995550 000000 000000 00000 A -20121206 EL 12 2014 000000000 000000000 000000000 000000000 000000000 000000000 000997800 000000 000000 00000 A -20121206 EL 03 2015 000000000 000000000 000000000 000000000 000000000 000000000 000996400 000000 000000 00000 A -20121206 EL 06 2015 000000000 000000000 000000000 000000000 000000000 000000000 000995000 000000 000000 00000 A -20121206 EL 09 2015 000000000 000000000 000000000 000000000 000000000 000000000 000993600 000000 000000 00000 A -20121206 EL 12 2015 000000000 000000000 000000000 000000000 000000000 000000000 000992200 000000 000000 00000 A -20121206 EL 03 2016 000000000 000000000 000000000 000000000 000000000 000000000 000990800 000000 000000 00000 A -20121206 EL 06 2016 000000000 000000000 000000000 000000000 000000000 000000000 000989400 000000 000000 00000 A -20121206 EL 09 2016 000000000 000000000 000000000 000000000 000000000 000000000 000988000 000000 000000 00000 A -20121206 EL 12 2016 000000000 000000000 000000000 000000000 000000000 000000000 000986600 000000 000000 00000 A -20121206 EL 03 2017 000000000 000000000 000000000 000000000 000000000 000000000 000985200 000000 000000 00000 A -20121206 EL 06 2017 000000000 000000000 000000000 000000000 000000000 000000000 000983800 000000 000000 00000 A -20121206 EL 09 2017 000000000 000000000 000000000 000000000 000000000 000000000 000982400 000000 000000 00000 A -20121206 EX 12 2012 000000000 000000000 000000000 000000000 000000000 000000000 000259300 000000 000004 00000 A -20121206 EX 01 2013 000000000 000000000 000000000 000000000 000000000 000000000 000258800 000000 000000 00000 A -20121206 EX 02 2013 000000000 000000000 000000000 000000000 000000000 000000000 000258400 000000 000000 00000 A -20121206 EX 03 2013 000000000 000000000 000000000 000000000 000000000 000000000 000258500 000000 000000 00000 A -20121206 EX 06 2013 000000000 000000000 000000000 000000000 000000000 000000000 000252100 000000 000000 00000 A -20121206 EX 09 2013 000000000 000000000 000000000 000000000 000000000 000000000 000251600 000000 000000 00000 A -20121206 EX 12 2013 000000000 000000000 000000000 000000000 000000000 000000000 000249500 000000 000000 00000 A -20121206 EX 03 2014 000000000 000000000 000000000 000000000 000000000 000000000 000248600 000000 000000 00000 A -20121206 EX 06 2014 000000000 000000000 000000000 000000000 000000000 000000000 000241500 000000 000000 00000 A -20121206 EX 09 2014 000000000 000000000 000000000 000000000 000000000 000000000 000240800 000000 000000 00000 A -20121206 EX 12 2014 000000000 000000000 000000000 000000000 000000000 000000000 000239600 000000 000000 00000 A -20121206 EX 03 2015 000000000 000000000 000000000 000000000 000000000 000000000 000238800 000000 000000 00000 A -20121206 EX 06 2015 000000000 000000000 000000000 000000000 000000000 000000000 000231900 000000 000000 00000 A -20121206 EX 09 2015 000000000 000000000 000000000 000000000 000000000 000000000 000231200 000000 000000 00000 A -20121206 EY 12 2012 000996850 000000000 000996850 000996850 000996850 000000000 000996850 000210 001972 00000 A -20121206 EY 03 2013 000000000 000000000 000000000 000000000 000000000 000000000 000997250 000000 000407 00000 A -20121206 EY 06 2013 000997600 000000000 000997600 000997600 000997600 000000000 000997500 000010 000202 00000 A -20121206 EY 09 2013 000000000 000000000 000000000 000000000 000000000 000000000 000997575 000000 000120 00000 A -20121206 EY 12 2013 000000000 000000000 000000000 000000000 000000000 000000000 000997600 000000 000384 00000 A -20121206 EY 03 2014 000000000 000000000 000000000 000000000 000000000 000000000 000997600 000000 000214 00000 A -20121206 EY 06 2014 000000000 000000000 000000000 000000000 000000000 000000000 000997150 000000 000000 00000 A -20121206 EY 09 2014 000000000 000000000 000000000 000000000 000000000 000000000 000995750 000000 000000 00000 A -20121206 EY 12 2014 000000000 000000000 000000000 000000000 000000000 000000000 000998000 000000 000004 00000 A -20121206 EY 03 2015 000000000 000000000 000000000 000000000 000000000 000000000 000996600 000000 000000 00000 A -20121206 EY 06 2015 000000000 000000000 000000000 000000000 000000000 000000000 000995200 000000 000000 00000 A -20121206 EY 09 2015 000000000 000000000 000000000 000000000 000000000 000000000 000993800 000000 000000 00000 A -20121206 EY 12 2015 000000000 000000000 000000000 000000000 000000000 000000000 000992400 000000 000000 00000 A -20121206 EY 03 2016 000000000 000000000 000000000 000000000 000000000 000000000 000991000 000000 000000 00000 A -20121206 EY 06 2016 000000000 000000000 000000000 000000000 000000000 000000000 000989600 000000 000000 00000 A -20121206 EY 09 2016 000000000 000000000 000000000 000000000 000000000 000000000 000988200 000000 000000 00000 A -20121206 EY 12 2016 000000000 000000000 000000000 000000000 000000000 000000000 000986800 000000 000000 00000 A -20121206 EY 03 2017 000000000 000000000 000000000 000000000 000000000 000000000 000985400 000000 000000 00000 A -20121206 EY 06 2017 000000000 000000000 000000000 000000000 000000000 000000000 000984000 000000 000000 00000 A -20121206 EY 09 2017 000000000 000000000 000000000 000000000 000000000 000000000 000982600 000000 000000 00000 A -20121206 FB 01 2013 000000000 000000000 000000000 000000000 000000000 000000000 000061300 000000 000000 00000 A -20121206 FB 02 2013 000000000 000000000 000000000 000000000 000000000 000000000 000061600 000000 000000 00000 A -20121206 FB 03 2013 000000000 000000000 000000000 000000000 000000000 000000000 000061800 000000 000000 00000 A -20121206 FB 04 2013 000000000 000000000 000000000 000000000 000000000 000000000 000061640 000000 000000 00000 A -20121206 FB 05 2013 000000000 000000000 000000000 000000000 000000000 000000000 000061480 000000 000000 00000 A -20121206 FB 06 2013 000000000 000000000 000000000 000000000 000000000 000000000 000061320 000000 000000 00000 A -20121206 FB 07 2013 000000000 000000000 000000000 000000000 000000000 000000000 000061160 000000 000000 00000 A -20121206 FB 08 2013 000000000 000000000 000000000 000000000 000000000 000000000 000061000 000000 000000 00000 A -20121206 FB 09 2013 000000000 000000000 000000000 000000000 000000000 000000000 000060840 000000 000000 00000 A -20121206 FB 10 2013 000000000 000000000 000000000 000000000 000000000 000000000 000060680 000000 000000 00000 A -20121206 FB 11 2013 000000000 000000000 000000000 000000000 000000000 000000000 000060520 000000 000000 00000 A -20121206 FB 12 2013 000000000 000000000 000000000 000000000 000000000 000000000 000060360 000000 000000 00000 A -20121206 HK 12 2012 000000000 000000000 000000000 000000000 000000000 000000000 000012217 000000 000000 00000 A -20121206 HK 01 2013 000000000 000000000 000000000 000000000 000000000 000000000 000012220 000000 000000 00000 A -20121206 HK 02 2013 000000000 000000000 000000000 000000000 000000000 000000000 000012224 000000 000000 00000 A -20121206 HK 03 2013 000000000 000000000 000000000 000000000 000000000 000000000 000012186 000000 000000 00000 A -20121206 HK 06 2013 000000000 000000000 000000000 000000000 000000000 000000000 000011964 000000 000000 00000 A -20121206 HK 09 2013 000000000 000000000 000000000 000000000 000000000 000000000 000011867 000000 000000 00000 A -20121206 ID 12 2012 000507500 000000000 000507500 000507000 000507500 000000000 000507500 000035 001434 00000 A -20121206 ID 01 2013 000000000 000000000 000000000 000000000 000000000 000000000 000507000 000000 000000 00000 A -20121206 ID 02 2013 000000000 000000000 000000000 000000000 000000000 000000000 000507000 000000 000000 00000 A -20121206 ID 03 2013 000000000 000000000 000000000 000000000 000000000 000000000 000507500 000000 000000 00000 A -20121206 ID 06 2013 000000000 000000000 000000000 000000000 000000000 000000000 000499000 000000 000000 00000 A -20121206 ID 09 2013 000000000 000000000 000000000 000000000 000000000 000000000 000498500 000000 000000 00000 A -20121206 IN 12 2012 000593700 000000000 000598500 000587000 000597400 000000000 000597400 027408 322496 00000 A -20121206 IN 01 2013 000597600 000000000 000601250 000591050 000600700 000000000 000597250 000392 001312 00000 A -20121206 IN 02 2013 000000000 000000000 000000000 000000000 000000000 000000000 000597150 000000 000000 00000 A -20121206 IN 03 2013 000000000 000000000 000000000 000000000 000000000 000000000 000597250 000000 000002 00000 A -20121206 IN 06 2013 000000000 000000000 000000000 000000000 000000000 000000000 000594500 000000 000000 00000 A -20121206 IN 09 2013 000000000 000000000 000000000 000000000 000000000 000000000 000593300 000000 000000 00000 A -20121206 IR 01 2013 000000000 000000000 000000000 000000000 000000000 000000000 000002831 000000 000000 00000 A -20121206 IR 02 2013 000000000 000000000 000000000 000000000 000000000 000000000 000002831 000000 000000 00000 A -20121206 IR 03 2013 000000000 000000000 000000000 000000000 000000000 000000000 000002841 000000 000000 00000 A -20121206 IR 04 2013 000000000 000000000 000000000 000000000 000000000 000000000 000002854 000000 000000 00000 A -20121206 IR 05 2013 000000000 000000000 000000000 000000000 000000000 000000000 000002866 000000 000000 00000 A -20121206 IR 06 2013 000000000 000000000 000000000 000000000 000000000 000000000 000002873 000000 000000 00000 A -20121206 JB 12 2012 000145000 000000000 000145240 000144950 000145130 000000000 000145130 015844 022638 00000 A -20121206 JB 03 2013 000144490 000000000 000144740 000144450 000144660 000000000 000144660 014990 018891 00000 A -20121206 JB 06 2013 000000000 000000000 000000000 000000000 000000000 000000000 000142570 000000 000000 00000 A -20121206 JB 09 2013 000000000 000000000 000000000 000000000 000000000 000000000 000140480 000000 000000 00000 A -20121206 JB 12 2013 000000000 000000000 000000000 000000000 000000000 000000000 000138390 000000 000000 00000 A -20121206 JG 12 2012 000000000 000000000 000000000 000000000 000000000 000000000 000145130 000000 000000 00000 A -20121206 JG 03 2013 000000000 000000000 000000000 000000000 000000000 000000000 000144660 000000 000000 00000 A -20121206 JG 06 2013 000000000 000000000 000000000 000000000 000000000 000000000 000142570 000000 000000 00000 A -20121206 JG 09 2013 000000000 000000000 000000000 000000000 000000000 000000000 000140480 000000 000000 00000 A -20121206 JG 12 2013 000000000 000000000 000000000 000000000 000000000 000000000 000138390 000000 000000 00000 A -20121206 MR 01 2013 000000000 000000000 000000000 000000000 000000000 000000000 000002891 000000 000000 00000 A -20121206 MR 02 2013 000000000 000000000 000000000 000000000 000000000 000000000 000002891 000000 000000 00000 A -20121206 MR 03 2013 000000000 000000000 000000000 000000000 000000000 000000000 000002901 000000 000000 00000 A -20121206 MR 04 2013 000000000 000000000 000000000 000000000 000000000 000000000 000002914 000000 000000 00000 A -20121206 MR 05 2013 000000000 000000000 000000000 000000000 000000000 000000000 000002926 000000 000000 00000 A -20121206 MR 06 2013 000000000 000000000 000000000 000000000 000000000 000000000 000002933 000000 000000 00000 A -20121206 ND 12 2012 000000000 000000000 000000000 000000000 000000000 000000000 000020740 000000 009875 00000 A -20121206 ND 12 2013 000020550 000000000 000020550 000020550 000020550 000000000 000020560 000150 018002 00000 A -20121206 ND 12 2014 000020410 000000000 000020450 000020400 000020420 000000000 000020450 001028 011434 00000 A -20121206 ND 12 2015 000000000 000000000 000000000 000000000 000000000 000000000 000020070 000000 003792 00000 A -20121206 ND 12 2016 000019510 000000000 000019580 000019510 000019580 000000000 000019650 000070 003220 00000 A -20121206 ND 12 2017 000019220 000000000 000019220 000019220 000019220 000000000 000019230 000121 002624 00000 A -20121206 ND 12 2018 000000000 000000000 000000000 000000000 000000000 000000000 000018780 000000 000959 00000 A -20121206 ND 12 2019 000000000 000000000 000000000 000000000 000000000 000000000 000018310 000000 000899 00000 A -20121206 ND 12 2020 000000000 000000000 000000000 000000000 000000000 000000000 000017910 000000 000768 00000 A -20121206 ND 12 2021 000018140 000000000 000018140 000018140 000018140 000000000 000017430 000005 000466 00000 A -20121206 NK 12 2012 000948500 000000000 000957000 000945000 000954500 000000000 000954500 091127 278858 00000 A -20121206 NK 01 2013 000949000 000000000 000955000 000946000 000953000 000000000 000953000 000285 001220 00000 A -20121206 NK 02 2013 000954000 000000000 000954000 000953000 000953000 000000000 000953500 000006 000005 00000 A -20121206 NK 03 2013 000948500 000000000 000955500 000944500 000953500 000000000 000953000 002989 017075 00000 A -20121206 NK 04 2013 000000000 000000000 000000000 000000000 000000000 000000000 000944500 000000 000000 00000 A -20121206 NK 06 2013 000000000 000000000 000000000 000000000 000000000 000000000 000945500 000000 001208 00000 A -20121206 NK 09 2013 000000000 000000000 000000000 000000000 000000000 000000000 000944500 000000 000000 00000 A -20121206 NK 12 2013 000000000 000000000 000000000 000000000 000000000 000000000 000938000 000000 009800 00000 A -20121206 NK 03 2014 000000000 000000000 000000000 000000000 000000000 000000000 000937000 000000 000000 00000 A -20121206 NK 06 2014 000000000 000000000 000000000 000000000 000000000 000000000 000929000 000000 000001 00000 A -20121206 NK 09 2014 000000000 000000000 000000000 000000000 000000000 000000000 000928000 000000 000003 00000 A -20121206 NK 12 2014 000000000 000000000 000000000 000000000 000000000 000000000 000921500 000000 002610 00000 A -20121206 NK 03 2015 000000000 000000000 000000000 000000000 000000000 000000000 000920000 000000 000000 00000 A -20121206 NK 06 2015 000000000 000000000 000000000 000000000 000000000 000000000 000912000 000000 000000 00000 A -20121206 NK 09 2015 000000000 000000000 000000000 000000000 000000000 000000000 000911000 000000 000000 00000 A -20121206 NS 12 2012 000951800 000000000 000954300 000951800 000954300 000000000 000954500 000022 001128 00000 A -20121206 NS 03 2013 000000000 000000000 000000000 000000000 000000000 000000000 000953000 000000 000840 00000 A -20121206 NS 06 2013 000000000 000000000 000000000 000000000 000000000 000000000 000945500 000000 000000 00000 A -20121206 NS 09 2013 000000000 000000000 000000000 000000000 000000000 000000000 000944500 000000 000000 00000 A -20121206 NU 12 2012 000955000 000000000 000955000 000955000 000955000 000000000 000955500 000002 017776 00000 A -20121206 NU 03 2013 000000000 000000000 000000000 000000000 000000000 000000000 000956000 000000 002819 00000 A -20121206 NU 06 2013 000000000 000000000 000000000 000000000 000000000 000000000 000947000 000000 000000 00000 A -20121206 NU 09 2013 000000000 000000000 000000000 000000000 000000000 000000000 000944500 000000 000000 00000 A -20121206 RT 01 2013 000003000 000000000 000003010 000003000 000003010 000000000 000003010 000081 000244 00000 A -20121206 RT 02 2013 000000000 000000000 000000000 000000000 000000000 000000000 000003030 000000 000036 00000 A -20121206 RT 03 2013 000000000 000000000 000000000 000000000 000000000 000000000 000003042 000000 000070 00000 A -20121206 RT 04 2013 000000000 000000000 000000000 000000000 000000000 000000000 000003072 000000 000115 00000 A -20121206 RT 05 2013 000000000 000000000 000000000 000000000 000000000 000000000 000003098 000000 000208 00000 A -20121206 RT 06 2013 000000000 000000000 000000000 000000000 000000000 000000000 000003108 000000 000080 00000 A -20121206 RT 07 2013 000003125 000000000 000003125 000003125 000003125 000000000 000003117 000004 000062 00000 A -20121206 RT 08 2013 000000000 000000000 000000000 000000000 000000000 000000000 000003115 000000 000000 00000 A -20121206 RT 09 2013 000000000 000000000 000000000 000000000 000000000 000000000 000003117 000000 000000 00000 A -20121206 RT 10 2013 000000000 000000000 000000000 000000000 000000000 000000000 000003122 000000 000000 00000 A -20121206 RT 11 2013 000000000 000000000 000000000 000000000 000000000 000000000 000003128 000000 000000 00000 A -20121206 RT 12 2013 000000000 000000000 000000000 000000000 000000000 000000000 000003128 000000 000000 00000 A -20121206 SB 12 2012 000000000 000000000 000000000 000000000 000000000 000000000 000010362 000000 000000 00000 A -20121206 SB 03 2013 000000000 000000000 000000000 000000000 000000000 000000000 000010362 000000 000000 00000 A -20121206 SD 12 2012 000000000 000000000 000000000 000000000 000000000 000000000 000097450 000000 000000 00000 A -20121206 SD 01 2013 000000000 000000000 000000000 000000000 000000000 000000000 000097450 000000 000000 00000 A -20121206 SD 02 2013 000000000 000000000 000000000 000000000 000000000 000000000 000097450 000000 000000 00000 A -20121206 SD 03 2013 000000000 000000000 000000000 000000000 000000000 000000000 000097450 000000 000000 00000 A -20121206 SD 06 2013 000000000 000000000 000000000 000000000 000000000 000000000 000097450 000000 000000 00000 A -20121206 SD 09 2013 000000000 000000000 000000000 000000000 000000000 000000000 000097450 000000 000000 00000 A -20121206 SD 12 2013 000000000 000000000 000000000 000000000 000000000 000000000 000097450 000000 000000 00000 A -20121206 SD 03 2014 000000000 000000000 000000000 000000000 000000000 000000000 000097450 000000 000000 00000 A -20121206 SD 06 2014 000000000 000000000 000000000 000000000 000000000 000000000 000097450 000000 000000 00000 A -20121206 SD 09 2014 000000000 000000000 000000000 000000000 000000000 000000000 000097450 000000 000000 00000 A -20121206 SG 12 2012 000034940 000000000 000035010 000034800 000034960 000000000 000034960 006309 049414 00000 A -20121206 SG 01 2013 000034870 000000000 000034900 000034830 000034890 000000000 000034960 000006 000044 00000 A -20121206 SG 02 2013 000000000 000000000 000000000 000000000 000000000 000000000 000034950 000000 000000 00000 A -20121206 SG 03 2013 000000000 000000000 000000000 000000000 000000000 000000000 000034890 000000 000000 00000 A -20121206 SG 06 2013 000000000 000000000 000000000 000000000 000000000 000000000 000034540 000000 000000 00000 A -20121206 SG 09 2013 000000000 000000000 000000000 000000000 000000000 000000000 000034250 000000 000000 00000 A -20121206 ST 12 2012 000000000 000000000 000000000 000000000 000000000 000000000 000307000 000000 000006 00000 A -20121206 ST 01 2013 000000000 000000000 000000000 000000000 000000000 000000000 000307000 000000 000000 00000 A -20121206 ST 02 2013 000000000 000000000 000000000 000000000 000000000 000000000 000306900 000000 000000 00000 A -20121206 ST 03 2013 000000000 000000000 000000000 000000000 000000000 000000000 000306400 000000 000000 00000 A -20121206 ST 06 2013 000000000 000000000 000000000 000000000 000000000 000000000 000303300 000000 000000 00000 A -20121206 ST 09 2013 000000000 000000000 000000000 000000000 000000000 000000000 000300800 000000 000000 00000 A -20121206 TF 12 2012 000000000 000000000 000000000 000000000 000000000 000000000 000000000 000000 000100 00000 A -20121206 TF 01 2013 000002863 000000000 000002865 000002836 000002839 000000000 000002840 000325 002525 00000 A -20121206 TF 02 2013 000002879 000000000 000002879 000002837 000002840 000000000 000002840 000357 002389 00000 A -20121206 TF 03 2013 000002880 000000000 000002880 000002850 000002850 000000000 000002850 000121 002918 00000 A -20121206 TF 04 2013 000002890 000000000 000002890 000002860 000002869 000000000 000002863 000136 002483 00000 A -20121206 TF 05 2013 000002900 000000000 000002900 000002870 000002875 000000000 000002875 000258 001385 00000 A -20121206 TF 06 2013 000002905 000000000 000002905 000002880 000002880 000000000 000002882 000067 000536 00000 A -20121206 TF 07 2013 000002905 000000000 000002905 000002900 000002900 000000000 000002896 000025 000365 00000 A -20121206 TF 08 2013 000000000 000000000 000000000 000000000 000000000 000000000 000002893 000000 000170 00000 A -20121206 TF 09 2013 000000000 000000000 000000000 000000000 000000000 000000000 000002894 000000 000066 00000 A -20121206 TF 10 2013 000000000 000000000 000000000 000000000 000000000 000000000 000002893 000000 000068 00000 A -20121206 TF 11 2013 000000000 000000000 000000000 000000000 000000000 000000000 000002897 000000 000070 00000 A -20121206 TF 12 2013 000000000 000000000 000000000 000000000 000000000 000000000 000002900 000000 000000 00000 A -20121206 TR 01 2013 000000000 000000000 000000000 000000000 000000000 000000000 000002891 000000 000000 00000 A -20121206 TR 02 2013 000000000 000000000 000000000 000000000 000000000 000000000 000002891 000000 000000 00000 A -20121206 TR 03 2013 000000000 000000000 000000000 000000000 000000000 000000000 000002901 000000 000000 00000 A -20121206 TR 04 2013 000000000 000000000 000000000 000000000 000000000 000000000 000002914 000000 000000 00000 A -20121206 TR 05 2013 000000000 000000000 000000000 000000000 000000000 000000000 000002926 000000 000000 00000 A -20121206 TR 06 2013 000000000 000000000 000000000 000000000 000000000 000000000 000002933 000000 000000 00000 A -20121206 TW 12 2012 000027600 000000000 000027740 000027530 000027610 000000000 000027610 040286 202741 00000 A -20121206 TW 01 2013 000027610 000000000 000027650 000027530 000027530 000000000 000027620 000057 000065 00000 A -20121206 TW 02 2013 000000000 000000000 000000000 000000000 000000000 000000000 000027620 000000 000000 00000 A -20121206 TW 03 2013 000000000 000000000 000000000 000000000 000000000 000000000 000027630 000000 000000 00000 A -20121206 TW 06 2013 000000000 000000000 000000000 000000000 000000000 000000000 000027690 000000 000004 00000 A -20121206 TW 09 2013 000000000 000000000 000000000 000000000 000000000 000000000 000026790 000000 000000 00000 A -20121206 TW 12 2013 000000000 000000000 000000000 000000000 000000000 000000000 000026730 000000 000000 00000 A -20121206 TW 03 2014 000000000 000000000 000000000 000000000 000000000 000000000 000026750 000000 000000 00000 A -20121206 TW 06 2014 000000000 000000000 000000000 000000000 000000000 000000000 000026780 000000 000000 00000 A -20121206 TW 09 2014 000000000 000000000 000000000 000000000 000000000 000000000 000025800 000000 000000 00000 A -20121206 TW 12 2014 000000000 000000000 000000000 000000000 000000000 000000000 000025830 000000 000000 00000 A -20121206 TW 03 2015 000000000 000000000 000000000 000000000 000000000 000000000 000025870 000000 000000 00000 A -20121206 TW 06 2015 000000000 000000000 000000000 000000000 000000000 000000000 000025910 000000 000000 00000 A -20121206 TW 09 2015 000000000 000000000 000000000 000000000 000000000 000000000 000024940 000000 000000 00000 A -20121206 ZS 12 2012 000000000 000000000 000000000 000000000 000000000 000000000 000200500 000000 000001 00000 A -20121206 ZS 01 2013 000000000 000000000 000000000 000000000 000000000 000000000 000200800 000000 000024 00000 A -20121206 ZS 02 2013 000000000 000000000 000000000 000000000 000000000 000000000 000201800 000000 000000 00000 A -20121206 ZS 03 2013 000000000 000000000 000000000 000000000 000000000 000000000 000202700 000000 000000 00000 A -20121206 ZS 04 2013 000000000 000000000 000000000 000000000 000000000 000000000 000203400 000000 000000 00000 A -20121206 ZS 05 2013 000000000 000000000 000000000 000000000 000000000 000000000 000204150 000000 000000 00000 A -20121206 ZS 06 2013 000000000 000000000 000000000 000000000 000000000 000000000 000205000 000000 000000 00000 A -20121206 ZS 07 2013 000000000 000000000 000000000 000000000 000000000 000000000 000205750 000000 000000 00000 A -20121206 ZS 08 2013 000000000 000000000 000000000 000000000 000000000 000000000 000206500 000000 000000 00000 A -20121206 ZS 09 2013 000000000 000000000 000000000 000000000 000000000 000000000 000207250 000000 000000 00000 A -20121206 ZS 10 2013 000000000 000000000 000000000 000000000 000000000 000000000 000207950 000000 000000 00000 A -20121206 ZS 11 2013 000000000 000000000 000000000 000000000 000000000 000000000 000208700 000000 000000 00000 A diff --git a/inst/tests/1680-fread-header-encoding.csv b/inst/tests/1680-fread-header-encoding.csv deleted file mode 100644 index 13f728164a..0000000000 --- a/inst/tests/1680-fread-header-encoding.csv +++ /dev/null @@ -1,5 +0,0 @@ -Ort;Stra�e;Bezeichnung -Vienna;Testgasse 1;"Ministerium ""Pestalozzi""" -Graz;Teststra�e 3;HS -Salzburg;Beispielstra�e 9;"NMS ""Die Schlauen""" -Vienna;Wolfgang-Stra�e 7;"Wirtshaus ""Wien III""" diff --git a/inst/tests/2008head.csv b/inst/tests/2008head.csv deleted file mode 100644 index 28dc1f151a..0000000000 --- a/inst/tests/2008head.csv +++ /dev/null @@ -1,500 +0,0 @@ -Year,Month,DayofMonth,DayOfWeek,DepTime,CRSDepTime,ArrTime,CRSArrTime,UniqueCarrier,FlightNum,TailNum,ActualElapsedTime,CRSElapsedTime,AirTime,ArrDelay,DepDelay,Origin,Dest,Distance,TaxiIn,TaxiOut,Cancelled,CancellationCode,Diverted,CarrierDelay,WeatherDelay,NASDelay,SecurityDelay,LateAircraftDelay -2008,1,3,4,2003,1955,2211,2225,WN,335,N712SW,128,150,116,-14,8,IAD,TPA,810,4,8,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,754,735,1002,1000,WN,3231,N772SW,128,145,113,2,19,IAD,TPA,810,5,10,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,628,620,804,750,WN,448,N428WN,96,90,76,14,8,IND,BWI,515,3,17,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,926,930,1054,1100,WN,1746,N612SW,88,90,78,-6,-4,IND,BWI,515,3,7,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,1829,1755,1959,1925,WN,3920,N464WN,90,90,77,34,34,IND,BWI,515,3,10,0,,0,2,0,0,0,32 -2008,1,3,4,1940,1915,2121,2110,WN,378,N726SW,101,115,87,11,25,IND,JAX,688,4,10,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,1937,1830,2037,1940,WN,509,N763SW,240,250,230,57,67,IND,LAS,1591,3,7,0,,0,10,0,0,0,47 -2008,1,3,4,1039,1040,1132,1150,WN,535,N428WN,233,250,219,-18,-1,IND,LAS,1591,7,7,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,617,615,652,650,WN,11,N689SW,95,95,70,2,2,IND,MCI,451,6,19,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,1620,1620,1639,1655,WN,810,N648SW,79,95,70,-16,0,IND,MCI,451,3,6,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,706,700,916,915,WN,100,N690SW,130,135,106,1,6,IND,MCO,828,5,19,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,1644,1510,1845,1725,WN,1333,N334SW,121,135,107,80,94,IND,MCO,828,6,8,0,,0,8,0,0,0,72 -2008,1,3,4,1426,1430,1426,1425,WN,829,N476WN,60,55,39,1,-4,IND,MDW,162,9,12,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,715,715,720,710,WN,1016,N765SW,65,55,37,10,0,IND,MDW,162,7,21,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,1702,1700,1651,1655,WN,1827,N420WN,49,55,35,-4,2,IND,MDW,162,4,10,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,1029,1020,1021,1010,WN,2272,N263WN,52,50,37,11,9,IND,MDW,162,6,9,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,1452,1425,1640,1625,WN,675,N286WN,228,240,213,15,27,IND,PHX,1489,7,8,0,,0,3,0,0,0,12 -2008,1,3,4,754,745,940,955,WN,1144,N778SW,226,250,205,-15,9,IND,PHX,1489,5,16,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,1323,1255,1526,1510,WN,4,N674AA,123,135,110,16,28,IND,TPA,838,4,9,0,,0,0,0,0,0,16 -2008,1,3,4,1416,1325,1512,1435,WN,54,N643SW,56,70,49,37,51,ISP,BWI,220,2,5,0,,0,12,0,0,0,25 -2008,1,3,4,706,705,807,810,WN,68,N497WN,61,65,51,-3,1,ISP,BWI,220,3,7,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,1657,1625,1754,1735,WN,623,N724SW,57,70,47,19,32,ISP,BWI,220,5,5,0,,0,7,0,0,0,12 -2008,1,3,4,1900,1840,1956,1950,WN,717,N786SW,56,70,49,6,20,ISP,BWI,220,2,5,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,1039,1030,1133,1140,WN,1244,N714CB,54,70,47,-7,9,ISP,BWI,220,2,5,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,801,800,902,910,WN,2101,N222WN,61,70,53,-8,1,ISP,BWI,220,3,5,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,1520,1455,1619,1605,WN,2553,N394SW,59,70,50,14,25,ISP,BWI,220,2,7,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,1422,1255,1657,1610,WN,188,N215WN,155,195,143,47,87,ISP,FLL,1093,6,6,0,,0,40,0,0,0,7 -2008,1,3,4,1954,1925,2239,2235,WN,1754,N243WN,165,190,155,4,29,ISP,FLL,1093,3,7,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,636,635,921,945,WN,2275,N454WN,165,190,147,-24,1,ISP,FLL,1093,5,13,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,734,730,958,1020,WN,550,N712SW,324,350,314,-22,4,ISP,LAS,2283,2,8,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,2107,1945,2334,2230,WN,362,N798SW,147,165,134,64,82,ISP,MCO,972,6,7,0,,0,5,0,0,0,59 -2008,1,3,4,1008,1005,1234,1255,WN,543,N736SA,146,170,135,-21,3,ISP,MCO,972,5,6,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,712,710,953,1000,WN,1112,N795SW,161,170,142,-7,2,ISP,MCO,972,5,14,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,1312,1300,1546,1550,WN,1397,N247WN,154,170,140,-4,12,ISP,MCO,972,7,7,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,1449,1430,1715,1720,WN,3398,N707SA,146,170,134,-5,19,ISP,MCO,972,6,6,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,1634,1555,1859,1845,WN,3480,N443WN,145,170,134,14,39,ISP,MCO,972,5,6,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,831,830,935,955,WN,300,N753SW,124,145,112,-20,1,ISP,MDW,765,5,7,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,1812,1650,1927,1815,WN,422,N779SW,135,145,118,72,82,ISP,MDW,765,6,11,0,,0,3,0,0,0,69 -2008,1,3,4,1127,1105,1235,1230,WN,1837,N704SW,128,145,114,5,22,ISP,MDW,765,9,5,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,1424,1355,1531,1520,WN,2871,N709SW,127,145,113,11,29,ISP,MDW,765,8,6,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,1326,1230,1559,1530,WN,1056,N459WN,153,180,143,29,56,ISP,PBI,1052,5,5,0,,0,0,0,0,0,29 -2008,1,3,4,1749,1725,2019,2030,WN,2175,N621SW,150,185,138,-11,24,ISP,PBI,1052,4,8,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,726,720,958,1020,WN,3319,N206WN,152,180,140,-22,6,ISP,PBI,1052,4,8,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,646,640,929,955,WN,3667,N280WN,163,195,151,-26,6,ISP,RSW,1101,3,9,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,1153,1140,1428,1440,WN,2006,N241WN,155,180,143,-12,13,ISP,TPA,1034,4,8,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,1528,1510,1802,1810,WN,3858,N200WN,154,180,144,-8,18,ISP,TPA,1034,4,6,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,634,635,907,935,WN,3928,N459WN,153,180,142,-28,-1,ISP,TPA,1034,3,8,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,831,830,1148,1140,WN,534,N286WN,137,130,123,8,1,JAN,BWI,888,5,9,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,1450,1435,1806,1745,WN,3244,N475WN,136,130,121,21,15,JAN,BWI,888,7,8,0,,0,0,0,6,0,15 -2008,1,3,4,2245,1730,2354,1850,WN,186,N792SW,69,80,59,304,315,JAN,HOU,359,3,7,0,,0,282,0,0,0,22 -2008,1,3,4,615,615,724,735,WN,971,N202WN,69,80,60,-11,0,JAN,HOU,359,2,7,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,1150,1145,1303,1305,WN,2124,N646SW,73,80,63,-2,5,JAN,HOU,359,3,7,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,2025,1940,2135,2100,WN,3154,N252WN,70,80,60,35,45,JAN,HOU,359,3,7,0,,0,26,0,0,0,9 -2008,1,3,4,1038,945,1314,1225,WN,1035,N346SW,96,100,81,49,53,JAN,MCO,587,8,7,0,,0,7,0,0,0,42 -2008,1,3,4,1900,1850,2123,2045,WN,205,N299WN,143,115,97,38,10,JAN,MDW,666,40,6,0,,0,1,0,28,0,9 -2008,1,3,4,700,700,851,900,WN,449,N528SW,111,120,99,-9,0,JAN,MDW,666,6,6,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,948,925,959,940,WN,3430,N487WN,71,75,59,19,23,JAX,BHM,365,3,9,0,,0,0,0,0,0,19 -2008,1,3,4,646,620,725,655,WN,1580,N243WN,99,95,77,30,26,JAX,BNA,484,6,16,0,,0,26,0,4,0,0 -2008,1,3,4,1110,1040,1136,1110,WN,2195,N479WN,86,90,72,26,30,JAX,BNA,484,5,9,0,,0,0,0,0,10,16 -2008,1,3,4,1535,1535,1603,1610,WN,2804,N255WN,88,95,74,-7,0,JAX,BNA,484,5,9,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,1919,1915,1942,1950,WN,3428,N215WN,83,95,71,-8,4,JAX,BNA,484,4,8,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,1053,1055,1245,1240,WN,433,N264LV,112,105,96,5,-2,JAX,BWI,663,7,9,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,1433,1440,1623,1625,WN,1331,N714CB,110,105,95,-2,-7,JAX,BWI,663,2,13,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,2015,2010,2158,2155,WN,3504,N436WN,103,105,91,3,5,JAX,BWI,663,5,7,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,2139,2130,2244,2240,WN,378,N726SW,65,70,54,4,9,JAX,FLL,318,3,8,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,1500,1500,1602,1615,WN,640,N399WN,62,75,49,-13,0,JAX,FLL,318,5,8,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,850,850,1000,1000,WN,1396,N387SW,70,70,51,0,0,JAX,FLL,318,10,9,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,646,645,752,755,WN,2189,N405WN,66,70,46,-3,1,JAX,FLL,318,13,7,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,1221,1220,1328,1330,WN,3312,N685SW,67,70,54,-2,1,JAX,FLL,318,5,8,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,1738,1730,1841,1840,WN,3948,N467WN,63,70,49,1,8,JAX,FLL,318,6,8,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,1813,1735,1936,1905,WN,54,N643SW,143,150,125,31,38,JAX,HOU,816,6,12,0,,0,11,0,0,0,20 -2008,1,3,4,802,750,1001,955,WN,2272,N263WN,119,125,104,6,12,JAX,IND,688,7,8,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,1820,1825,1946,1955,WN,549,N363SW,86,90,75,-9,-5,JAX,ORF,543,3,8,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,821,820,953,945,WN,3604,N257WN,92,85,80,8,1,JAX,ORF,543,3,9,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,1734,1650,1941,1905,WN,23,N521SW,127,135,113,36,44,JAX,PHL,742,4,10,0,,0,3,0,0,0,33 -2008,1,3,4,712,700,926,915,WN,1232,N663SW,134,135,120,11,12,JAX,PHL,742,5,9,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,1318,1310,1410,1400,WN,977,N376SW,52,50,39,10,8,JAX,TPA,180,4,9,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,958,900,1052,950,WN,1574,N791SW,54,50,36,62,58,JAX,TPA,180,4,14,0,,0,0,0,4,0,58 -2008,1,3,4,1859,1850,1950,1945,WN,2019,N392SW,51,55,38,5,9,JAX,TPA,180,4,9,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,1538,1445,1753,1710,WN,500,N799SW,75,85,60,43,53,LAS,ABQ,487,4,11,0,,0,15,0,0,0,28 -2008,1,3,4,933,935,1151,1200,WN,778,N607SW,78,85,63,-9,-2,LAS,ABQ,487,5,10,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,2248,2125,102,2345,WN,890,N618WN,74,80,60,77,83,LAS,ABQ,487,4,10,0,,0,7,0,0,0,70 -2008,1,3,4,1327,1230,1550,1500,WN,1171,N682SW,83,90,65,50,57,LAS,ABQ,487,3,15,0,,0,50,0,0,0,0 -2008,1,3,4,624,625,846,850,WN,1320,N456WN,82,85,61,-4,-1,LAS,ABQ,487,4,17,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,1614,1600,1833,1825,WN,1925,N509SW,79,85,60,8,14,LAS,ABQ,487,4,15,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,1917,1915,2136,2140,WN,2457,N293,79,85,60,-4,2,LAS,ABQ,487,5,14,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,1832,1655,148,30,WN,302,N473WN,256,275,243,78,97,LAS,ALB,2237,3,10,0,,0,8,0,0,0,70 -2008,1,3,4,1229,1155,1633,1555,WN,1079,N351SW,124,120,91,38,34,LAS,AMA,758,5,28,0,,0,3,0,4,0,31 -2008,1,3,4,1256,1240,1724,1720,WN,155,N238WN,148,160,131,4,16,LAS,AUS,1090,3,14,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,2118,2015,144,50,WN,2021,N499WN,146,155,127,54,63,LAS,AUS,1090,5,14,0,,0,23,0,0,0,31 -2008,1,3,4,905,850,1334,1330,WN,3222,N309SW,149,160,135,4,15,LAS,AUS,1090,4,10,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,1739,1640,114,25,WN,1018,N245WN,275,285,253,49,59,LAS,BDL,2298,9,13,0,,0,19,0,0,0,30 -2008,1,3,4,906,905,1426,1430,WN,3948,N467WN,200,205,183,-4,1,LAS,BHM,1618,2,15,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,816,815,1339,1340,WN,249,N256WN,203,205,185,-1,1,LAS,BNA,1588,4,14,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,1325,1240,1841,1810,WN,419,N275WN,196,210,178,31,45,LAS,BNA,1588,6,12,0,,0,2,0,0,0,29 -2008,1,3,4,1506,1440,2030,2010,WN,2032,N271WN,204,210,183,20,26,LAS,BNA,1588,6,15,0,,0,18,0,0,0,2 -2008,1,3,4,2039,1930,155,55,WN,3940,N434WN,196,205,177,60,69,LAS,BNA,1588,5,14,0,,0,0,0,22,0,38 -2008,1,3,4,924,920,1209,1210,WN,71,N312SW,105,110,84,-1,4,LAS,BOI,520,3,18,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,1611,1535,1849,1825,WN,538,N619SW,98,110,73,24,36,LAS,BOI,520,3,22,0,,0,9,0,0,0,15 -2008,1,3,4,1824,1715,117,25,WN,2383,N290WN,233,250,221,52,69,LAS,BUF,1987,2,10,0,,0,48,0,0,0,4 -2008,1,3,4,826,825,930,925,WN,136,N493WN,64,60,46,5,1,LAS,BUR,223,2,16,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,2118,2015,2224,2115,WN,219,N383SW,66,60,46,69,63,LAS,BUR,223,3,17,0,,0,17,0,6,0,46 -2008,1,3,4,1818,1740,1916,1840,WN,391,N608SW,58,60,46,36,38,LAS,BUR,223,2,10,0,,0,20,0,0,0,16 -2008,1,3,4,650,650,748,750,WN,670,N777QC,58,60,47,-2,0,LAS,BUR,223,3,8,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,2146,2055,2250,2155,WN,815,N626SW,64,60,48,55,51,LAS,BUR,223,3,13,0,,0,4,0,4,0,47 -2008,1,3,4,2241,1910,2340,2010,WN,1072,N369SW,59,60,43,210,211,LAS,BUR,223,3,13,0,,0,114,0,0,0,96 -2008,1,3,4,1409,1355,1513,1500,WN,1328,N396SW,64,65,50,13,14,LAS,BUR,223,2,12,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,1100,1050,1157,1155,WN,1586,N293,57,65,46,2,10,LAS,BUR,223,2,9,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,1306,1250,1406,1355,WN,1838,N509SW,60,65,47,11,16,LAS,BUR,223,2,11,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,1726,1630,1832,1740,WN,2284,N409WN,66,70,46,52,56,LAS,BUR,223,2,18,0,,0,1,0,0,0,51 -2008,1,3,4,915,915,1017,1020,WN,2699,N278WN,62,65,46,-3,0,LAS,BUR,223,2,14,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,1229,1220,1342,1325,WN,2874,N695SW,73,65,47,17,9,LAS,BUR,223,2,24,0,,0,9,0,8,0,0 -2008,1,3,4,1459,1455,1556,1555,WN,3237,N284WN,57,60,42,1,4,LAS,BUR,223,2,13,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,908,845,1628,1610,WN,1774,N220WN,260,265,244,18,23,LAS,BWI,2106,6,10,0,,0,18,0,0,0,0 -2008,1,3,4,1817,1730,122,50,WN,2632,N784SW,245,260,230,32,47,LAS,BWI,2106,5,10,0,,0,7,0,0,0,25 -2008,1,3,4,1248,1245,2009,2015,WN,3759,N463WN,261,270,243,-6,3,LAS,BWI,2106,4,14,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,956,945,1658,1645,WN,818,N244WN,242,240,213,13,11,LAS,CLE,1825,8,21,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,1849,1740,121,30,WN,564,N455WN,212,230,195,51,69,LAS,CMH,1772,2,15,0,,0,10,0,0,0,41 -2008,1,3,4,1210,1200,1905,1850,WN,991,N297WN,235,230,201,15,10,LAS,CMH,1772,6,28,0,,0,10,0,5,0,0 -2008,1,3,4,701,700,941,955,WN,85,N688SW,100,115,84,-14,1,LAS,DEN,629,9,7,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,1047,1030,1328,1320,WN,157,N481WN,101,110,79,8,17,LAS,DEN,629,9,13,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,2232,2115,108,5,WN,632,N203WN,96,110,77,63,77,LAS,DEN,629,6,13,0,,0,0,0,7,0,56 -2008,1,3,4,1512,1315,1802,1610,WN,706,N491WN,110,115,88,112,117,LAS,DEN,629,8,14,0,,0,0,0,0,0,112 -2008,1,3,4,2025,1955,2301,2245,WN,908,N480WN,96,110,78,16,30,LAS,DEN,629,6,12,0,,0,7,0,0,0,9 -2008,1,3,4,1439,1425,1720,1720,WN,1582,N318SW,101,115,85,0,14,LAS,DEN,629,7,9,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,1627,1600,1916,1900,WN,2907,N647SW,109,120,80,16,27,LAS,DEN,629,8,21,0,,0,2,0,0,0,14 -2008,1,3,4,1745,1710,2017,1945,WN,2192,N313SW,92,95,78,32,35,LAS,ELP,584,2,12,0,,0,10,0,0,0,22 -2008,1,3,4,1049,1040,1320,1320,WN,2280,N352SW,91,100,73,0,9,LAS,ELP,584,3,15,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,1117,1050,1325,1325,WN,1636,N321SW,128,155,116,0,27,LAS,GEG,806,3,9,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,1725,1620,1940,1850,WN,2803,N660SW,135,150,116,50,65,LAS,GEG,806,4,15,0,,0,50,0,0,0,0 -2008,1,3,4,1824,1735,2303,2230,WN,719,N414WN,159,175,143,33,49,LAS,HOU,1235,3,13,0,,0,12,0,0,0,21 -2008,1,3,4,1150,1140,1644,1640,WN,1776,N408WN,174,180,147,4,10,LAS,HOU,1235,3,24,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,749,740,1227,1235,WN,3244,N475WN,158,175,146,-8,9,LAS,HOU,1235,3,9,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,2051,2010,134,55,WN,3746,N321SW,163,165,150,39,41,LAS,HOU,1235,4,9,0,,0,17,0,0,0,22 -2008,1,3,4,1555,1525,2307,2245,WN,1027,N230WN,252,260,232,22,30,LAS,IAD,2066,7,13,0,,0,6,0,0,0,16 -2008,1,3,4,2255,1820,509,55,WN,1924,N761RR,194,215,176,254,275,LAS,IND,1591,9,9,0,,0,0,0,0,8,246 -2008,1,3,4,1129,1050,1757,1725,WN,3920,N464WN,208,215,179,32,39,LAS,IND,1591,8,21,0,,0,32,0,0,0,0 -2008,1,3,4,1602,1510,2357,2255,WN,3144,N272WN,295,285,269,62,52,LAS,ISP,2283,4,22,0,,0,13,0,10,0,39 -2008,1,3,4,1738,1715,1838,1820,WN,82,N499WN,60,65,42,18,23,LAS,LAX,236,6,12,0,,0,0,0,0,12,6 -2008,1,3,4,2207,2150,2306,2255,WN,135,N244WN,59,65,40,11,17,LAS,LAX,236,7,12,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,1851,1825,2004,1930,WN,317,N335SW,73,65,41,34,26,LAS,LAX,236,16,16,0,,0,18,0,8,0,8 -2008,1,3,4,701,645,802,745,WN,337,N488WN,61,60,42,17,16,LAS,LAX,236,7,12,0,,0,16,0,1,0,0 -2008,1,3,4,1556,1455,1704,1600,WN,354,N496WN,68,65,41,64,61,LAS,LAX,236,9,18,0,,0,61,0,3,0,0 -2008,1,3,4,1254,1250,1404,1355,WN,784,N401WN,70,65,43,9,4,LAS,LAX,236,7,20,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,840,840,946,945,WN,790,N351SW,66,65,43,1,0,LAS,LAX,236,11,12,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,1540,1525,1648,1630,WN,1061,N422WN,68,65,47,18,15,LAS,LAX,236,5,16,0,,0,10,0,3,0,5 -2008,1,3,4,750,750,901,855,WN,1653,N288WN,71,65,52,6,0,LAS,LAX,236,10,9,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,1228,1200,1340,1310,WN,1928,N792SW,72,70,43,30,28,LAS,LAX,236,7,22,0,,0,0,0,2,0,28 -2008,1,3,4,2047,2005,2209,2115,WN,2367,N352SW,82,70,45,54,42,LAS,LAX,236,7,30,0,,0,15,0,12,0,27 -2008,1,3,4,2158,2120,2303,2225,WN,2896,N335SW,65,65,44,38,38,LAS,LAX,236,11,10,0,,0,13,0,0,0,25 -2008,1,3,4,1028,1025,1132,1135,WN,3655,N465WN,64,70,45,-3,3,LAS,LAX,236,8,11,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,1423,1420,1530,1525,WN,3917,N609SW,67,65,44,5,3,LAS,LAX,236,11,12,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,1147,1100,1541,1500,WN,2382,N404WN,114,120,90,41,47,LAS,LBB,775,4,20,0,,0,25,0,0,0,16 -2008,1,3,4,859,850,1343,1345,WN,565,N787SA,164,175,148,-2,9,LAS,LIT,1295,4,12,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,1140,1110,1537,1510,WN,43,N617SW,117,120,95,27,30,LAS,MAF,796,2,20,0,,0,27,0,0,0,0 -2008,1,3,4,1226,1210,1721,1700,WN,213,N302SW,175,170,139,21,16,LAS,MCI,1140,4,32,0,,0,1,0,5,0,15 -2008,1,3,4,2118,2005,154,50,WN,411,N763SW,156,165,131,64,73,LAS,MCI,1140,7,18,0,,0,14,0,0,0,50 -2008,1,3,4,2003,1905,26,2350,WN,1004,N676SW,143,165,130,36,58,LAS,MCI,1140,5,8,0,,0,4,0,0,0,32 -2008,1,3,4,1622,1510,2059,2000,WN,1405,N775SW,157,170,130,59,72,LAS,MCI,1140,4,23,0,,0,59,0,0,0,0 -2008,1,3,4,648,650,1123,1135,WN,2972,N634SW,155,165,137,-12,-2,LAS,MCI,1140,4,14,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,1003,940,1441,1430,WN,3068,N449WN,158,170,136,11,23,LAS,MCI,1140,5,17,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,1319,1300,2033,2025,WN,380,N444WN,254,265,234,8,19,LAS,MCO,2039,6,14,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,1506,1500,2122,2030,WN,74,N764SW,256,210,177,52,6,LAS,MDW,1521,62,17,0,,0,6,0,46,0,0 -2008,1,3,4,648,645,1205,1210,WN,227,N723SW,197,205,182,-5,3,LAS,MDW,1521,5,10,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,1052,1050,1603,1620,WN,335,N712SW,191,210,175,-17,2,LAS,MDW,1521,6,10,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,1424,1415,1941,1945,WN,396,N407WN,197,210,177,-4,9,LAS,MDW,1521,8,12,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,1211,1145,1750,1720,WN,693,N232WN,219,215,175,30,26,LAS,MDW,1521,23,21,0,,0,0,0,4,0,26 -2008,1,3,4,814,755,1334,1320,WN,823,N725SW,200,205,181,14,19,LAS,MDW,1521,6,13,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,934,935,1453,1505,WN,830,N436WN,199,210,177,-12,-1,LAS,MDW,1521,6,16,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,1708,1700,2214,2230,WN,1865,N745SW,186,210,169,-16,8,LAS,MDW,1521,6,11,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,1919,1845,31,5,WN,2025,N740SW,192,200,171,26,34,LAS,MDW,1521,8,13,0,,0,4,0,0,0,22 -2008,1,3,4,1945,1815,52,2335,WN,2450,N405WN,187,200,168,77,90,LAS,MDW,1521,8,11,0,,0,13,0,0,0,64 -2008,1,3,4,2057,1930,202,50,WN,2794,N468WN,185,200,171,72,87,LAS,MDW,1521,7,7,0,,0,60,0,0,0,12 -2008,1,3,4,1354,1310,1907,1845,WN,3232,N201LV,193,215,177,22,44,LAS,MDW,1521,6,10,0,,0,4,0,0,0,18 -2008,1,3,4,1703,1645,33,35,WN,767,N222WN,270,290,257,-2,18,LAS,MHT,2356,4,9,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,1030,1030,1545,1545,WN,762,N295WN,195,195,174,0,0,LAS,MSY,1501,3,18,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,1903,1825,5,2340,WN,3327,N282WN,182,195,166,25,38,LAS,MSY,1501,4,12,0,,0,3,0,0,0,22 -2008,1,3,4,1108,1110,1244,1240,WN,125,N782SA,96,90,80,4,-2,LAS,OAK,407,4,12,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,NA,700,NA,830,WN,126,,NA,90,NA,NA,NA,LAS,OAK,407,NA,NA,1,A,0,NA,NA,NA,NA,NA -2008,1,3,4,1354,1345,1525,1520,WN,127,N784SW,91,95,74,5,9,LAS,OAK,407,4,13,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,1944,1740,2110,1915,WN,223,N223WN,86,95,72,115,124,LAS,OAK,407,5,9,0,,0,21,0,0,0,94 -2008,1,3,4,1251,1205,1425,1345,WN,237,N281WN,94,100,76,40,46,LAS,OAK,407,3,15,0,,0,2,0,0,0,38 -2008,1,3,4,1548,1505,1728,1635,WN,280,N460WN,100,90,78,53,43,LAS,OAK,407,4,18,0,,0,14,0,10,0,29 -2008,1,3,4,821,820,955,950,WN,864,N640SW,94,90,72,5,1,LAS,OAK,407,3,19,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,2216,2125,2348,2255,WN,900,N679AA,92,90,78,53,51,LAS,OAK,407,4,10,0,,0,11,0,2,0,40 -2008,1,3,4,2010,1900,2203,2030,WN,962,N378SW,113,90,77,93,70,LAS,OAK,407,28,8,0,,0,45,0,23,0,25 -2008,1,3,4,1433,1420,1608,1555,WN,1011,N248WN,95,95,79,13,13,LAS,OAK,407,4,12,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,935,925,1106,1055,WN,1258,N774SW,91,90,71,11,10,LAS,OAK,407,3,17,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,2156,2155,2334,2325,WN,1950,N408WN,98,90,83,9,1,LAS,OAK,407,5,10,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,2035,2020,2209,2150,WN,3135,N695SW,94,90,81,19,15,LAS,OAK,407,3,10,0,,0,15,0,4,0,0 -2008,1,3,4,602,600,733,730,WN,3233,N354SW,91,90,76,3,2,LAS,OAK,407,4,11,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,1152,1145,1616,1605,WN,86,N627SW,144,140,116,11,7,LAS,OKC,987,4,24,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,1435,1315,1859,1755,WN,479,N622SW,144,160,132,64,80,LAS,OMA,1099,3,9,0,,0,38,0,0,0,26 -2008,1,3,4,2049,1920,106,2355,WN,875,N217JC,137,155,125,71,89,LAS,OMA,1099,2,10,0,,0,32,0,0,0,39 -2008,1,3,4,913,910,1342,1350,WN,2111,N673AA,149,160,131,-8,3,LAS,OMA,1099,4,14,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,1613,1610,1721,1705,WN,187,N690SW,68,55,38,16,3,LAS,ONT,197,4,26,0,,0,0,0,16,0,0 -2008,1,3,4,2015,1945,2101,2040,WN,725,N259WN,46,55,34,21,30,LAS,ONT,197,4,8,0,,0,3,0,0,0,18 -2008,1,3,4,655,655,742,750,WN,731,N244WN,47,55,35,-8,0,LAS,ONT,197,4,8,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,1438,1435,1533,1530,WN,872,N788SA,55,55,33,3,3,LAS,ONT,197,6,16,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,1102,1030,1152,1125,WN,906,N301SW,50,55,36,27,32,LAS,ONT,197,3,11,0,,0,27,0,0,0,0 -2008,1,3,4,2218,2120,2308,2210,WN,1493,N356SW,50,50,36,58,58,LAS,ONT,197,5,9,0,,0,0,0,20,0,38 -2008,1,3,4,851,835,938,930,WN,1670,N742SW,47,55,34,8,16,LAS,ONT,197,5,8,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,1230,1215,1331,1310,WN,2018,N313SW,61,55,36,21,15,LAS,ONT,197,4,21,0,,0,0,0,6,0,15 -2008,1,3,4,1838,1800,1930,1855,WN,2730,N273WN,52,55,32,35,38,LAS,ONT,197,3,17,0,,0,0,0,0,0,35 -2008,1,3,4,1358,1330,1449,1425,WN,3070,N660SW,51,55,37,24,28,LAS,ONT,197,4,10,0,,0,4,0,0,0,20 -2008,1,3,4,1757,1655,108,25,WN,156,N466WN,251,270,237,43,62,LAS,ORF,2155,4,10,0,,0,13,0,0,0,30 -2008,1,3,4,1816,1755,2022,2015,WN,700,N678AA,126,140,112,7,21,LAS,PDX,762,4,10,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,755,755,958,1020,WN,1669,N484WN,123,145,108,-22,0,LAS,PDX,762,6,9,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,1328,1255,1549,1520,WN,2354,N258WN,141,145,106,29,33,LAS,PDX,762,22,13,0,,0,24,0,0,0,5 -2008,1,3,4,2134,2040,2343,2300,WN,2550,N608SW,129,140,112,43,54,LAS,PDX,762,3,14,0,,0,12,0,0,0,31 -2008,1,3,4,1127,1045,1856,1835,WN,1285,N435WN,269,290,245,21,42,LAS,PHL,2176,5,19,0,,0,18,0,0,0,3 -2008,1,3,4,1720,1700,41,45,WN,1843,N484WN,261,285,244,-4,20,LAS,PHL,2176,4,13,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,559,600,800,805,WN,102,N639SW,61,65,43,-5,-1,LAS,PHX,256,4,14,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,712,705,932,915,WN,243,N228WN,80,70,49,17,7,LAS,PHX,256,7,24,0,,0,0,0,10,0,7 -2008,1,3,4,1327,1320,1533,1530,WN,287,N747SA,66,70,50,3,7,LAS,PHX,256,5,11,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,1817,1810,2016,2015,WN,504,N338SW,59,65,47,1,7,LAS,PHX,256,4,8,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,1807,1740,2011,1950,WN,559,N603SW,64,70,49,21,27,LAS,PHX,256,5,10,0,,0,2,0,0,0,19 -2008,1,3,4,1712,1545,1914,1750,WN,668,N221WN,62,65,48,84,87,LAS,PHX,256,4,10,0,,0,6,0,0,0,78 -2008,1,3,4,1206,1205,1418,1415,WN,752,N680AA,72,70,47,3,1,LAS,PHX,256,4,21,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,1134,1110,1343,1315,WN,781,N378SW,69,65,46,28,24,LAS,PHX,256,8,15,0,,0,9,0,4,0,15 -2008,1,3,4,1003,1005,1208,1215,WN,871,N327SW,65,70,49,-7,-2,LAS,PHX,256,5,11,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,815,820,1034,1025,WN,1034,N420WN,79,65,49,9,-5,LAS,PHX,256,4,26,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,2156,2110,2353,2310,WN,1403,N258WN,57,60,43,43,46,LAS,PHX,256,5,9,0,,0,2,0,0,0,41 -2008,1,3,4,2140,2040,2334,2240,WN,1682,N281WN,54,60,40,54,60,LAS,PHX,256,3,11,0,,0,2,0,0,0,52 -2008,1,3,4,631,635,832,840,WN,2103,N291WN,61,65,44,-8,-4,LAS,PHX,256,5,12,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,1521,1450,1725,1655,WN,2726,N777QC,64,65,46,30,31,LAS,PHX,256,5,13,0,,0,16,0,0,0,14 -2008,1,3,4,2100,1945,2255,2150,WN,2991,N752SW,55,65,43,65,75,LAS,PHX,256,4,8,0,,0,48,0,0,0,17 -2008,1,3,4,1657,1630,1905,1845,WN,3517,N487WN,68,75,49,20,27,LAS,PHX,256,5,14,0,,0,2,0,0,0,18 -2008,1,3,4,926,915,1129,1120,WN,3598,N790SW,63,65,44,9,11,LAS,PHX,256,5,14,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,1413,1415,1612,1620,WN,3849,N269WN,59,65,44,-8,-2,LAS,PHX,256,4,11,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,1825,1745,114,50,WN,512,N794SW,229,245,210,24,40,LAS,PIT,1910,6,13,0,,0,10,0,0,0,14 -2008,1,3,4,927,915,1631,1620,WN,594,N715SW,244,245,218,11,12,LAS,PIT,1910,7,19,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,1630,1600,23,2350,WN,416,N401WN,293,290,266,33,30,LAS,PVD,2363,4,23,0,,0,6,0,3,0,24 -2008,1,3,4,1136,1120,1852,1840,WN,170,N448WN,256,260,231,12,16,LAS,RDU,2027,6,19,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,1824,1725,121,45,WN,1509,N403WN,237,260,222,36,59,LAS,RDU,2027,2,13,0,,0,27,0,0,0,9 -2008,1,3,4,1716,1630,1830,1755,WN,239,N267WN,74,85,60,35,46,LAS,RNO,345,4,10,0,,0,11,0,0,0,24 -2008,1,3,4,1928,1855,2034,2015,WN,298,N450WN,66,80,54,19,33,LAS,RNO,345,4,8,0,,0,9,0,0,0,10 -2008,1,3,4,709,710,816,830,WN,376,N342SW,67,80,55,-14,-1,LAS,RNO,345,4,8,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,1741,1730,1905,1850,WN,675,N286WN,84,80,57,15,11,LAS,RNO,345,14,13,0,,0,0,0,4,0,11 -2008,1,3,4,1609,1540,1732,1700,WN,709,N428WN,83,80,55,32,29,LAS,RNO,345,7,21,0,,0,26,0,3,0,3 -2008,1,3,4,913,840,1029,955,WN,891,N400WN,76,75,61,34,33,LAS,RNO,345,3,12,0,,0,8,0,1,0,25 -2008,1,3,4,2215,2200,2334,2315,WN,1341,N442WN,79,75,57,19,15,LAS,RNO,345,4,18,0,,0,6,0,4,0,9 -2008,1,3,4,2137,2040,2251,2155,WN,2273,N286WN,74,75,56,56,57,LAS,RNO,345,4,14,0,,0,0,0,0,0,56 -2008,1,3,4,624,625,729,740,WN,2538,N230WN,65,75,52,-11,-1,LAS,RNO,345,4,9,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,1100,1020,1210,1145,WN,2719,N466WN,70,85,54,25,40,LAS,RNO,345,4,12,0,,0,0,0,1,0,24 -2008,1,3,4,1313,1255,1437,1415,WN,3430,N487WN,84,80,57,22,18,LAS,RNO,345,4,23,0,,0,8,0,4,0,10 -2008,1,3,4,1415,1350,1527,1510,WN,3835,N610WN,72,80,56,17,25,LAS,RNO,345,4,12,0,,0,9,0,0,0,8 -2008,1,3,4,1108,1110,1221,1230,WN,3947,N277WN,73,80,56,-9,-2,LAS,RNO,345,3,14,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,1348,1330,1455,1435,WN,341,N315SW,67,65,51,20,18,LAS,SAN,258,2,14,0,,0,8,0,2,0,10 -2008,1,3,4,1221,1220,1329,1325,WN,535,N428WN,68,65,48,4,1,LAS,SAN,258,4,16,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,2140,2050,2240,2150,WN,708,N692SW,60,60,45,50,50,LAS,SAN,258,3,12,0,,0,21,0,0,0,29 -2008,1,3,4,805,805,909,905,WN,711,N207WN,64,60,45,4,0,LAS,SAN,258,3,16,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,1643,1625,1751,1735,WN,715,N902WN,68,70,46,16,18,LAS,SAN,258,4,18,0,,0,4,0,0,0,12 -2008,1,3,4,946,940,1045,1045,WN,1037,N734SA,59,65,46,0,6,LAS,SAN,258,2,11,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,1915,1905,2016,2005,WN,1254,N490WN,61,60,44,11,10,LAS,SAN,258,4,13,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,1839,1740,1945,1840,WN,2186,N692SW,66,60,44,65,59,LAS,SAN,258,4,18,0,,0,5,0,6,0,54 -2008,1,3,4,2207,2125,2307,2225,WN,2211,N646SW,60,60,49,42,42,LAS,SAN,258,3,8,0,,0,17,0,0,0,25 -2008,1,3,4,1503,1425,1604,1530,WN,2357,N414WN,61,65,48,34,38,LAS,SAN,258,3,10,0,,0,9,0,0,0,25 -2008,1,3,4,1613,1515,1727,1615,WN,2363,N405WN,74,60,47,72,58,LAS,SAN,258,3,24,0,,0,0,0,19,0,53 -2008,1,3,4,2248,2155,2346,2255,WN,2449,N454WN,58,60,45,51,53,LAS,SAN,258,3,10,0,,0,12,0,0,0,39 -2008,1,3,4,612,615,713,715,WN,2712,N253WN,61,60,46,-2,-3,LAS,SAN,258,3,12,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,1118,1110,1225,1215,WN,3423,N298WN,67,65,50,10,8,LAS,SAN,258,3,14,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,1456,1445,1920,1920,WN,120,N277WN,144,155,126,0,11,LAS,SAT,1069,4,14,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,2022,1935,36,5,WN,802,N902WN,134,150,122,31,47,LAS,SAT,1069,2,10,0,,0,23,0,0,0,8 -2008,1,3,4,1049,1040,1509,1510,WN,2113,N350SW,140,150,127,-1,9,LAS,SAT,1069,4,9,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,753,750,1215,1220,WN,2906,N794SW,142,150,125,-5,3,LAS,SAT,1069,2,15,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,1831,1810,110,45,WN,495,N768SW,219,215,192,25,21,LAS,SDF,1624,9,18,0,,0,18,0,4,0,3 -2008,1,3,4,1704,1645,1929,1930,WN,340,N634SW,145,165,129,-1,19,LAS,SEA,866,7,9,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,2017,2005,2241,2245,WN,563,N285WN,144,160,129,-4,12,LAS,SEA,866,5,10,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,639,640,859,925,WN,1769,N731SA,140,165,124,-26,-1,LAS,SEA,866,5,11,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,1117,1050,1330,1330,WN,2465,N431WN,133,160,119,0,27,LAS,SEA,866,7,7,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,1426,1355,1605,1530,WN,488,N615SW,99,95,75,35,31,LAS,SFO,414,3,21,0,,0,0,0,22,0,13 -2008,1,3,4,1009,910,1148,1045,WN,619,N491WN,99,95,76,63,59,LAS,SFO,414,3,20,0,,0,0,0,54,0,9 -2008,1,3,4,2021,1700,2303,1835,WN,2005,N302SW,162,95,73,268,201,LAS,SFO,414,4,85,0,,0,192,0,67,0,9 -2008,1,3,4,2025,1905,2208,2040,WN,2788,N602SW,103,95,88,88,80,LAS,SFO,414,4,11,0,,0,0,0,63,0,25 -2008,1,3,4,603,605,729,740,WN,2886,N246LV,86,95,70,-11,-2,LAS,SFO,414,4,12,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,2301,2105,59,2240,WN,3061,N447WN,118,95,98,139,116,LAS,SFO,414,4,16,0,,0,0,0,131,0,8 -2008,1,3,4,1518,1215,1646,1350,WN,3575,N492WN,88,95,72,176,183,LAS,SFO,414,4,12,0,,0,0,0,176,0,0 -2008,1,3,4,1307,1235,1432,1400,WN,12,N361SW,85,85,71,32,32,LAS,SJC,386,4,10,0,,0,4,0,0,0,28 -2008,1,3,4,615,610,746,730,WN,276,N472WN,91,80,74,16,5,LAS,SJC,386,4,13,0,,0,0,0,16,0,0 -2008,1,3,4,2017,1945,2144,2105,WN,400,N429WN,87,80,70,39,32,LAS,SJC,386,4,13,0,,0,2,0,7,0,30 -2008,1,3,4,1855,1855,2028,2020,WN,484,N673AA,93,85,67,8,0,LAS,SJC,386,14,12,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,2114,2040,2241,2200,WN,774,N437WN,87,80,69,41,34,LAS,SJC,386,8,10,0,,0,34,0,7,0,0 -2008,1,3,4,1605,1520,1739,1645,WN,783,N306SW,94,85,68,54,45,LAS,SJC,386,5,21,0,,0,10,0,9,0,35 -2008,1,3,4,956,1000,1134,1125,WN,1945,N271WN,98,85,70,9,-4,LAS,SJC,386,15,13,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,731,730,848,855,WN,2387,N776WN,77,85,66,-7,1,LAS,SJC,386,4,7,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,1734,1655,1857,1820,WN,3844,N446WN,83,85,66,37,39,LAS,SJC,386,5,12,0,,0,9,0,0,0,28 -2008,1,3,4,1139,1100,1408,1320,WN,161,N455WN,89,80,54,48,39,LAS,SLC,368,6,29,0,,0,39,0,9,0,0 -2008,1,3,4,2104,1905,2314,2120,WN,415,N395SW,70,75,58,114,119,LAS,SLC,368,2,10,0,,0,25,0,0,0,89 -2008,1,3,4,919,830,1132,1050,WN,643,N756SA,73,80,55,42,49,LAS,SLC,368,4,14,0,,0,3,0,0,0,39 -2008,1,3,4,2113,2050,2328,2305,WN,1166,N351SW,75,75,58,23,23,LAS,SLC,368,3,14,0,,0,4,0,0,0,19 -2008,1,3,4,1712,1555,1935,1820,WN,1585,N766SW,83,85,62,75,77,LAS,SLC,368,4,17,0,,0,0,0,6,0,69 -2008,1,3,4,1419,1355,1627,1615,WN,1660,N613SW,68,80,55,12,24,LAS,SLC,368,2,11,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,2242,2140,54,2355,WN,2533,N385SW,72,75,55,59,62,LAS,SLC,368,4,13,0,,0,0,0,10,0,49 -2008,1,3,4,611,615,819,835,WN,3147,N296WN,68,80,55,-16,-4,LAS,SLC,368,3,10,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,1949,1910,2110,2035,WN,94,N715SW,81,85,66,35,39,LAS,SMF,397,5,10,0,,0,25,0,0,0,10 -2008,1,3,4,1409,1350,1539,1520,WN,584,N324SW,90,90,74,19,19,LAS,SMF,397,6,10,0,,0,19,0,0,0,0 -2008,1,3,4,637,640,759,805,WN,624,N336SW,82,85,65,-6,-3,LAS,SMF,397,5,12,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,1821,1730,1946,1855,WN,641,N626SW,85,85,67,51,51,LAS,SMF,397,6,12,0,,0,9,0,0,0,42 -2008,1,3,4,916,905,1046,1035,WN,2121,N632SW,90,90,68,11,11,LAS,SMF,397,4,18,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,1134,1115,1302,1250,WN,2622,N445WN,88,95,66,12,19,LAS,SMF,397,5,17,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,1527,1515,1648,1645,WN,3053,N418WN,81,90,68,3,12,LAS,SMF,397,4,9,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,2115,2100,2236,2225,WN,3862,N640SW,81,85,64,11,15,LAS,SMF,397,4,13,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,1934,1935,2054,2035,WN,201,N251WN,80,60,43,19,-1,LAS,SNA,226,29,8,0,,0,0,0,19,0,0 -2008,1,3,4,1305,1305,1358,1410,WN,300,N753SW,53,65,42,-12,0,LAS,SNA,226,4,7,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,1917,1820,2014,1925,WN,433,N264LV,57,65,40,49,57,LAS,SNA,226,7,10,0,,0,16,0,0,0,33 -2008,1,3,4,1125,1010,1224,1110,WN,1016,N765SW,59,60,45,74,75,LAS,SNA,226,5,9,0,,0,9,0,0,0,65 -2008,1,3,4,1505,1500,1605,1605,WN,1479,N498WN,60,65,43,0,5,LAS,SNA,226,4,13,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,747,750,843,850,WN,3250,N245WN,56,60,42,-7,-3,LAS,SNA,226,4,10,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,1143,1050,1641,1600,WN,773,N472WN,178,190,151,41,53,LAS,STL,1372,3,24,0,,0,2,0,0,0,39 -2008,1,3,4,1558,1530,2049,2040,WN,1050,N212WN,171,190,150,9,28,LAS,STL,1372,4,17,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,1940,1855,29,2355,WN,1583,N600WN,169,180,157,34,45,LAS,STL,1372,3,9,0,,0,22,0,0,0,12 -2008,1,3,4,1820,1725,112,35,WN,3403,N737JW,232,250,217,37,55,LAS,TPA,1984,5,10,0,,0,29,0,0,0,8 -2008,1,3,4,1143,1035,1621,1505,WN,574,N314SW,158,150,126,76,68,LAS,TUL,1076,3,29,0,,0,0,0,14,0,62 -2008,1,3,4,2211,2115,17,2330,WN,486,N264LV,66,75,53,47,56,LAS,TUS,365,4,9,0,,0,5,0,0,0,42 -2008,1,3,4,1821,1725,2032,1940,WN,637,N342SW,71,75,56,52,56,LAS,TUS,365,4,11,0,,0,24,0,0,0,28 -2008,1,3,4,715,720,926,935,WN,1059,N637SW,71,75,55,-9,-5,LAS,TUS,365,3,13,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,1341,1320,1556,1535,WN,1918,N267WN,75,75,55,21,21,LAS,TUS,365,3,17,0,,0,8,0,0,0,13 -2008,1,3,4,2108,2030,2313,2240,WN,3142,N446WN,65,70,53,33,38,LAS,TUS,365,4,8,0,,0,8,0,0,0,25 -2008,1,3,4,1118,1050,1333,1305,WN,3572,N489WN,75,75,54,28,28,LAS,TUS,365,3,18,0,,0,0,0,0,0,28 -2008,1,3,4,1735,1710,2010,1955,WN,230,N364SW,95,105,81,15,25,LAX,ABQ,677,4,10,0,,0,0,0,4,0,11 -2008,1,3,4,2105,2025,2342,2310,WN,361,N690SW,97,105,82,32,40,LAX,ABQ,677,6,9,0,,0,0,0,11,0,21 -2008,1,3,4,1328,1315,1611,1600,WN,397,N424WN,103,105,80,11,13,LAX,ABQ,677,18,5,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,944,940,1218,1225,WN,3245,N780SW,94,105,82,-7,4,LAX,ABQ,677,4,8,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,1024,1015,1504,1505,WN,304,N326SW,160,170,148,-1,9,LAX,AUS,1242,5,7,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,820,815,1357,1400,WN,133,N749SW,217,225,200,-3,5,LAX,BNA,1797,6,11,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,1632,1540,2207,2125,WN,1107,N708SA,215,225,203,42,52,LAX,BNA,1797,4,8,0,,0,0,0,18,0,24 -2008,1,3,4,1327,1255,1902,1840,WN,1324,N249WN,215,225,200,22,32,LAX,BNA,1797,4,11,0,,0,10,0,0,0,12 -2008,1,3,4,1330,1320,1609,1615,WN,330,N236WN,99,115,86,-6,10,LAX,ELP,714,3,10,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,1925,1735,2201,2025,WN,1671,N684WN,96,110,85,96,110,LAX,ELP,714,3,8,0,,0,5,0,0,0,91 -2008,1,3,4,1005,945,1250,1235,WN,2635,N335SW,105,110,88,15,20,LAX,ELP,714,3,14,0,,0,7,0,0,0,8 -2008,1,3,4,1149,1145,1639,1650,WN,205,N299WN,170,185,156,-11,4,LAX,HOU,1390,3,11,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,1742,1625,2231,2125,WN,528,N496WN,169,180,157,66,77,LAX,HOU,1390,4,8,0,,0,11,0,0,0,55 -2008,1,3,4,807,805,1301,1310,WN,1513,N305SW,174,185,163,-9,2,LAX,HOU,1390,5,6,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,2020,1935,109,35,WN,3394,N667SW,169,180,159,34,45,LAX,HOU,1390,3,7,0,,0,6,0,0,0,28 -2008,1,3,4,1501,1425,1554,1530,WN,416,N401WN,53,65,41,24,36,LAX,LAS,236,4,8,0,,0,18,0,0,0,6 -2008,1,3,4,1205,1135,1313,1240,WN,479,N622SW,68,65,47,33,30,LAX,LAS,236,3,18,0,,0,16,0,3,0,14 -2008,1,3,4,1652,1640,1748,1745,WN,495,N768SW,56,65,41,3,12,LAX,LAS,236,8,7,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,922,855,1102,1000,WN,574,N314SW,100,65,44,62,27,LAX,LAS,236,4,52,0,,0,13,0,35,0,14 -2008,1,3,4,1835,1740,1931,1840,WN,1004,N676SW,56,60,42,51,55,LAX,LAS,236,6,8,0,,0,0,0,4,0,47 -2008,1,3,4,1027,1015,1151,1120,WN,1079,N351SW,84,65,43,31,12,LAX,LAS,236,22,19,0,,0,11,0,19,0,1 -2008,1,3,4,626,625,724,730,WN,1669,N484WN,58,65,45,-6,1,LAX,LAS,236,3,10,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,1533,1530,1631,1635,WN,1843,N484WN,58,65,46,-4,3,LAX,LAS,236,3,9,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,1910,1845,2026,1950,WN,2021,N499WN,76,65,42,36,25,LAX,LAS,236,25,9,0,,0,7,0,11,0,18 -2008,1,3,4,744,740,838,840,WN,2111,N673AA,54,60,46,-2,4,LAX,LAS,236,3,5,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,2109,2100,2212,2205,WN,2202,N758SW,63,65,41,7,9,LAX,LAS,236,4,18,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,2237,2140,2335,2245,WN,2454,N352SW,58,65,47,50,57,LAX,LAS,236,3,8,0,,0,3,0,0,0,47 -2008,1,3,4,2025,1955,2120,2055,WN,2809,N335SW,55,60,43,25,30,LAX,LAS,236,4,8,0,,0,0,0,0,0,25 -2008,1,3,4,1423,1335,1519,1440,WN,3144,N272WN,56,65,42,39,48,LAX,LAS,236,5,9,0,,0,11,0,0,0,28 -2008,1,3,4,1337,1310,1825,1825,WN,321,N742SW,168,195,154,0,27,LAX,MCI,1363,5,9,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,1142,1125,1626,1640,WN,1668,N262WN,164,195,156,-14,17,LAX,MCI,1363,3,5,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,1928,1835,22,2345,WN,2208,N632SW,174,190,159,37,53,LAX,MCI,1363,6,9,0,,0,17,0,0,0,20 -2008,1,3,4,634,630,1133,1140,WN,3495,N615SW,179,190,169,-7,4,LAX,MCI,1363,4,6,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,1713,1625,2242,2215,WN,108,N550WN,209,230,192,27,48,LAX,MDW,1750,7,10,0,,0,5,0,0,0,22 -2008,1,3,4,853,850,1431,1440,WN,224,N279WN,218,230,205,-9,3,LAX,MDW,1750,6,7,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,1255,1240,1825,1835,WN,245,N730SW,210,235,201,-10,15,LAX,MDW,1750,4,5,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,1453,1445,2130,2040,WN,771,N486WN,277,235,202,50,8,LAX,MDW,1750,64,11,0,,0,0,0,42,0,8 -2008,1,3,4,1001,945,1550,1540,WN,1014,N494WN,229,235,201,10,16,LAX,MDW,1750,21,7,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,630,625,1209,1220,WN,1930,N724SW,219,235,206,-11,5,LAX,MDW,1750,4,9,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,1831,1755,1,2350,WN,3588,N732SW,210,235,195,11,36,LAX,MDW,1750,6,9,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,1030,1000,1142,1115,WN,184,N473WN,72,75,62,27,30,LAX,OAK,337,3,7,0,,0,0,0,0,0,27 -2008,1,3,4,2004,1900,2127,2015,WN,303,N683SW,83,75,66,72,64,LAX,OAK,337,4,13,0,,0,0,0,13,0,59 -2008,1,3,4,923,900,1114,1015,WN,418,N631SW,111,75,63,59,23,LAX,OAK,337,4,44,0,,0,0,0,36,0,23 -2008,1,3,4,1419,1400,1534,1515,WN,420,N268WN,75,75,65,19,19,LAX,OAK,337,4,6,0,,0,12,0,0,0,7 -2008,1,3,4,1522,1500,1638,1615,WN,430,N752SW,76,75,65,23,22,LAX,OAK,337,5,6,0,,0,7,0,1,0,15 -2008,1,3,4,1803,1730,1933,1845,WN,440,N720WN,90,75,67,48,33,LAX,OAK,337,5,18,0,,0,6,0,15,0,27 -2008,1,3,4,2146,2100,2304,2215,WN,724,N342SW,78,75,65,49,46,LAX,OAK,337,4,9,0,,0,0,0,3,0,46 -2008,1,3,4,2001,1930,2118,2045,WN,810,N648SW,77,75,64,33,31,LAX,OAK,337,4,9,0,,0,0,0,2,0,31 -2008,1,3,4,1827,1800,1945,1915,WN,829,N476WN,78,75,63,30,27,LAX,OAK,337,4,11,0,,0,0,0,3,0,27 -2008,1,3,4,1904,1830,2019,1945,WN,1026,N224WN,75,75,64,34,34,LAX,OAK,337,6,5,0,,0,0,0,0,0,34 -2008,1,3,4,1450,1430,1607,1545,WN,1032,N489WN,77,75,64,22,20,LAX,OAK,337,5,8,0,,0,0,0,2,0,20 -2008,1,3,4,1722,1700,1836,1815,WN,1061,N422WN,74,75,63,21,22,LAX,OAK,337,4,7,0,,0,4,0,0,0,17 -2008,1,3,4,1820,1630,1943,1745,WN,1135,N304SW,83,75,71,118,110,LAX,OAK,337,4,8,0,,0,0,0,8,3,107 -2008,1,3,4,NA,1100,NA,1215,WN,1146,,NA,75,NA,NA,NA,LAX,OAK,337,NA,NA,1,A,0,NA,NA,NA,NA,NA -2008,1,3,4,1623,1600,1753,1715,WN,1168,N361SW,90,75,70,38,23,LAX,OAK,337,13,7,0,,0,0,0,15,0,23 -2008,1,3,4,2008,2000,2136,2115,WN,1414,N402WN,88,75,67,21,8,LAX,OAK,337,5,16,0,,0,5,0,13,0,3 -2008,1,3,4,1301,1300,1422,1415,WN,1655,N669SW,81,75,65,7,1,LAX,OAK,337,4,12,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,601,600,711,720,WN,2104,N236WN,70,80,60,-9,1,LAX,OAK,337,2,8,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,808,800,921,915,WN,2639,N693SW,73,75,62,6,8,LAX,OAK,337,3,8,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,1206,1200,1328,1315,WN,3655,N465WN,82,75,63,13,6,LAX,OAK,337,4,15,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,700,700,816,815,WN,3756,N302SW,76,75,62,1,0,LAX,OAK,337,5,9,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,1609,1600,1819,1815,WN,90,N609SW,70,75,56,4,9,LAX,PHX,370,5,9,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,1811,1725,2016,1940,WN,109,N269WN,65,75,52,36,46,LAX,PHX,370,6,7,0,,0,5,0,0,0,31 -2008,1,3,4,815,815,1034,1030,WN,236,N735SA,79,75,56,4,0,LAX,PHX,370,7,16,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,600,600,805,815,WN,277,N619SW,65,75,51,-10,0,LAX,PHX,370,4,10,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,1851,1830,2059,2045,WN,314,N229WN,68,75,59,14,21,LAX,PHX,370,3,6,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,2020,1905,2225,2115,WN,386,N718SW,65,70,56,70,75,LAX,PHX,370,4,5,0,,0,0,0,0,0,70 -2008,1,3,4,1204,1150,1407,1405,WN,463,N342SW,63,75,53,2,14,LAX,PHX,370,3,7,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,2116,2040,2318,2250,WN,520,N283WN,62,70,53,28,36,LAX,PHX,370,3,6,0,,0,5,0,0,0,23 -2008,1,3,4,1556,1440,1804,1655,WN,746,N637SW,68,75,52,69,76,LAX,PHX,370,4,12,0,,0,69,0,0,0,0 -2008,1,3,4,1040,1005,1241,1220,WN,1058,N202WN,61,75,50,21,35,LAX,PHX,370,4,7,0,,0,15,0,0,0,6 -2008,1,3,4,940,920,1149,1135,WN,1155,N288WN,69,75,52,14,20,LAX,PHX,370,6,11,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,1419,1335,1624,1550,WN,2015,N792SW,65,75,53,34,44,LAX,PHX,370,3,9,0,,0,11,0,0,0,23 -2008,1,3,4,635,635,840,850,WN,2452,N746SW,65,75,53,-10,0,LAX,PHX,370,4,8,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,1738,1720,1848,1835,WN,225,N283WN,70,75,58,13,18,LAX,RNO,390,4,8,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,853,845,1000,1005,WN,1844,N313SW,67,80,56,-5,8,LAX,RNO,390,5,6,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,1422,1400,1532,1520,WN,2360,N618WN,70,80,60,12,22,LAX,RNO,390,3,7,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,1159,1150,1635,1635,WN,2624,N693SW,156,165,141,0,9,LAX,SAT,1210,3,12,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,708,710,829,835,WN,457,N738CB,81,85,61,-6,-2,LAX,SFO,337,4,16,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,NA,905,NA,1025,WN,469,,NA,80,NA,NA,NA,LAX,SFO,337,NA,NA,1,A,0,NA,NA,NA,NA,NA -2008,1,3,4,2321,1955,38,2115,WN,593,N901WN,77,80,65,203,206,LAX,SFO,337,6,6,0,,0,0,0,203,0,0 -2008,1,3,4,NA,1620,NA,1740,WN,618,,NA,80,NA,NA,NA,LAX,SFO,337,NA,NA,1,C,0,NA,NA,NA,NA,NA -2008,1,3,4,2008,1805,2139,1930,WN,646,N738CB,91,85,70,129,123,LAX,SFO,337,5,16,0,,0,0,24,6,0,99 -2008,1,3,4,1625,1430,1748,1550,WN,656,N738CB,83,80,67,118,115,LAX,SFO,337,3,13,0,,0,0,0,5,0,113 -2008,1,3,4,1305,1050,1421,1210,WN,680,N738CB,76,80,63,131,135,LAX,SFO,337,5,8,0,,0,0,0,131,0,0 -2008,1,3,4,1558,1245,1709,1405,WN,776,N901WN,71,80,60,184,193,LAX,SFO,337,7,4,0,,0,184,0,0,0,0 -2008,1,3,4,1600,1455,1714,1600,WN,173,N331SW,74,65,54,74,65,LAX,SJC,308,5,15,0,,0,14,0,9,0,51 -2008,1,3,4,1556,1525,1705,1630,WN,232,N740SW,69,65,53,35,31,LAX,SJC,308,3,13,0,,0,0,0,18,0,17 -2008,1,3,4,2056,2000,2203,2105,WN,343,N687SW,67,65,56,58,56,LAX,SJC,308,5,6,0,,0,21,0,2,0,35 -2008,1,3,4,616,615,720,720,WN,712,N671SW,64,65,51,0,1,LAX,SJC,308,4,9,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,1159,1130,1259,1235,WN,769,N608SW,60,65,48,24,29,LAX,SJC,308,5,7,0,,0,0,0,9,0,15 -2008,1,3,4,2140,2035,2249,2140,WN,1113,N731SA,69,65,54,69,65,LAX,SJC,308,6,9,0,,0,0,12,4,0,53 -2008,1,3,4,1455,1425,1557,1530,WN,1609,N676SW,62,65,49,27,30,LAX,SJC,308,5,8,0,,0,23,0,0,0,4 -2008,1,3,4,908,910,1005,1015,WN,1764,N740SW,57,65,48,-10,-2,LAX,SJC,308,3,6,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,1925,1825,2024,1930,WN,2359,N385SW,59,65,49,54,60,LAX,SJC,308,3,7,0,,0,0,0,6,0,48 -2008,1,3,4,NA,1930,NA,2035,WN,2528,,NA,65,NA,NA,NA,LAX,SJC,308,NA,NA,1,A,0,NA,NA,NA,NA,NA -2008,1,3,4,740,740,838,850,WN,2561,N773SA,58,70,49,-12,0,LAX,SJC,308,4,5,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,1311,1240,1414,1350,WN,2820,N647SW,63,70,53,24,31,LAX,SJC,308,4,6,0,,0,7,0,0,0,17 -2008,1,3,4,1014,1000,1120,1105,WN,2969,N642WN,66,65,51,15,14,LAX,SJC,308,4,11,0,,0,5,0,1,0,9 -2008,1,3,4,1709,1700,1815,1805,WN,3149,N415WN,66,65,55,10,9,LAX,SJC,308,4,7,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,1357,1330,1626,1615,WN,554,N626SW,89,105,79,11,27,LAX,SLC,590,3,7,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,1114,1045,1347,1330,WN,963,N311SW,93,105,80,17,29,LAX,SLC,590,3,10,0,,0,4,0,0,0,13 -2008,1,3,4,652,650,926,940,WN,973,N617SW,94,110,81,-14,2,LAX,SLC,590,6,7,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,2117,2010,2355,2255,WN,1485,N605SW,98,105,84,60,67,LAX,SLC,590,4,10,0,,0,0,0,1,0,59 -2008,1,3,4,1742,1650,2021,1935,WN,2899,N671SW,99,105,82,46,52,LAX,SLC,590,4,13,0,,0,8,0,0,0,38 -2008,1,3,4,1108,1100,1226,1220,WN,92,N226WN,78,80,59,6,8,LAX,SMF,373,5,14,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,821,810,936,930,WN,337,N488WN,75,80,59,6,11,LAX,SMF,373,5,11,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,2013,1910,2121,2025,WN,1015,N384SW,68,75,58,56,63,LAX,SMF,373,3,7,0,,0,0,0,0,0,56 -2008,1,3,4,609,610,722,735,WN,1234,N318SW,73,85,55,-13,-1,LAX,SMF,373,5,13,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,949,900,1103,1020,WN,1486,N613SW,74,80,61,43,49,LAX,SMF,373,5,8,0,,0,40,0,0,0,3 -2008,1,3,4,2215,2125,2321,2245,WN,2437,N225WN,66,80,58,36,50,LAX,SMF,373,3,5,0,,0,1,0,0,0,35 -2008,1,3,4,1524,1505,1634,1620,WN,2720,N629SW,70,75,59,14,19,LAX,SMF,373,4,7,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,1441,1350,1549,1510,WN,2985,N727SW,68,80,56,39,51,LAX,SMF,373,4,8,0,,0,8,0,0,0,31 -2008,1,3,4,1743,1715,1853,1830,WN,3155,N449WN,70,75,59,23,28,LAX,SMF,373,4,7,0,,0,8,0,0,0,15 -2008,1,3,4,2049,2035,2204,2155,WN,3584,N416WN,75,80,62,9,14,LAX,SMF,373,6,7,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,1725,1655,2238,2225,WN,71,N312SW,193,210,179,13,30,LAX,STL,1593,4,10,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,1356,1345,1608,1600,WN,75,N283WN,72,75,60,8,11,LAX,TUS,451,3,9,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,2005,1850,2219,2105,WN,1044,N306SW,74,75,61,74,75,LAX,TUS,451,3,10,0,,0,0,0,0,0,74 -2008,1,3,4,725,725,931,940,WN,2378,N431WN,66,75,59,-9,0,LAX,TUS,451,2,5,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,1658,1655,1908,1910,WN,3048,N695SW,70,75,60,-2,3,LAX,TUS,451,3,7,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,1052,1040,1301,1300,WN,3831,N451WN,69,80,60,1,12,LAX,TUS,451,4,5,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,2110,2040,2326,2300,WN,3939,N654SW,76,80,61,26,30,LAX,TUS,451,5,10,0,,0,0,0,0,0,26 -2008,1,3,4,1910,1910,1936,1915,WN,160,N783SW,86,65,48,21,0,LBB,ABQ,289,29,9,0,,0,0,0,21,0,0 -2008,1,3,4,1825,1745,1921,1850,WN,555,N506SW,56,65,47,31,40,LBB,AUS,341,4,5,0,,0,4,0,0,0,27 -2008,1,3,4,652,655,752,800,WN,2974,N447WN,60,65,47,-8,-3,LBB,AUS,341,3,10,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,840,840,940,940,WN,15,N341SW,60,60,49,0,0,LBB,DAL,293,3,8,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,1016,1010,1119,1110,WN,21,N501SW,63,60,49,9,6,LBB,DAL,293,3,11,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,1402,1340,1501,1440,WN,35,N520SW,59,60,50,21,22,LBB,DAL,293,2,7,0,,0,3,0,0,0,18 -2008,1,3,4,1652,1640,1748,1740,WN,141,N370SW,56,60,48,8,12,LBB,DAL,293,3,5,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,611,615,710,715,WN,906,N301SW,59,60,47,-5,-4,LBB,DAL,293,3,9,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,1825,1815,1923,1915,WN,1312,N501SW,58,60,47,8,10,LBB,DAL,293,5,6,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,1606,1525,1705,1625,WN,2382,N404WN,59,60,50,40,41,LBB,DAL,293,3,6,0,,0,0,0,0,0,40 -2008,1,3,4,2007,2010,2102,2110,WN,2542,N736SA,55,60,41,-8,-3,LBB,DAL,293,3,11,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,915,915,910,915,WN,1028,N214WN,55,60,45,-5,0,LBB,ELP,295,3,7,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,1152,1155,1201,1210,WN,573,N463WN,129,135,116,-9,-3,LBB,LAS,775,4,9,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,1654,1550,2006,1900,WN,438,N309SW,132,130,121,66,64,LIT,BWI,912,3,8,0,,0,6,0,2,0,58 -2008,1,3,4,703,705,808,810,WN,7,N365SW,65,65,48,-2,-2,LIT,DAL,296,3,14,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,1516,1500,1614,1605,WN,41,N240WN,58,65,49,9,16,LIT,DAL,296,3,6,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,1752,1705,1854,1810,WN,49,N502SW,62,65,49,44,47,LIT,DAL,296,4,9,0,,0,0,0,0,0,44 -2008,1,3,4,1251,1235,1348,1340,WN,700,N678AA,57,65,48,8,16,LIT,DAL,296,3,6,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,1108,1100,1206,1205,WN,2177,N522SW,58,65,49,1,8,LIT,DAL,296,3,6,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,2029,1950,2127,2055,WN,2263,N514SW,58,65,49,32,39,LIT,DAL,296,3,6,0,,0,0,0,0,0,32 -2008,1,3,4,806,805,909,910,WN,3748,N610WN,63,65,49,-1,1,LIT,DAL,296,6,8,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,1417,1405,1535,1530,WN,231,N787SA,78,85,71,5,12,LIT,HOU,393,2,5,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,1319,1310,1440,1440,WN,3053,N418WN,201,210,188,0,9,LIT,LAS,1295,5,8,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,1051,1035,1246,1215,WN,8,N339SW,115,100,82,31,16,LIT,MDW,544,25,8,0,,0,16,0,15,0,0 -2008,1,3,4,730,730,933,945,WN,250,N519SW,183,195,167,-12,0,LIT,PHX,1136,4,12,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,1846,1815,1951,1920,WN,3168,N513SW,65,65,53,31,31,LIT,STL,296,4,8,0,,0,4,0,0,0,27 -2008,1,3,4,642,640,752,745,WN,3757,N446WN,70,65,51,7,2,LIT,STL,296,4,15,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,1615,1130,1623,1135,WN,10,N617SW,68,65,56,288,285,MAF,ABQ,332,4,8,0,,0,285,0,3,0,0 -2008,1,3,4,730,735,822,835,WN,1194,N664WN,52,60,42,-13,-5,MAF,AUS,294,3,7,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,1852,1830,1942,1925,WN,2374,N379SW,50,55,40,17,22,MAF,AUS,294,3,7,0,,0,0,0,0,0,17 -2008,1,3,4,1602,1535,1701,1635,WN,43,N503SW,59,60,46,26,27,MAF,DAL,319,3,10,0,,0,0,0,0,0,26 -2008,1,3,4,1836,1805,1930,1905,WN,53,N527SW,54,60,46,25,31,MAF,DAL,319,3,5,0,,0,0,0,0,0,25 -2008,1,3,4,1956,1945,2056,2045,WN,271,N512SW,60,60,46,11,11,MAF,DAL,319,2,12,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,944,915,1046,1015,WN,914,N692SW,62,60,53,31,29,MAF,DAL,319,2,7,0,,0,0,0,2,0,29 -2008,1,3,4,625,630,723,730,WN,974,N410WN,58,60,45,-7,-5,MAF,DAL,319,4,9,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,1306,1305,1404,1405,WN,1430,N523SW,58,60,47,-1,1,MAF,DAL,319,4,7,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,702,705,814,820,WN,539,N417WN,72,75,61,-6,-3,MAF,HOU,441,2,9,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,1625,1450,1731,1605,WN,3828,N333SW,66,75,57,86,95,MAF,HOU,441,2,7,0,,0,85,0,0,0,1 -2008,1,3,4,1739,1730,1758,1750,WN,317,N335SW,139,140,123,8,9,MAF,LAS,796,4,12,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,1905,1850,2010,2000,WN,1493,N356SW,125,130,106,10,15,MCI,ABQ,718,5,14,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,856,850,950,1000,WN,1655,N669SW,114,130,102,-10,6,MCI,ABQ,718,4,8,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,811,810,932,935,WN,112,N527SW,81,85,68,-3,1,MCI,BNA,491,3,10,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,1159,1150,1325,1310,WN,290,N224WN,86,80,69,15,9,MCI,BNA,491,5,12,0,,0,6,0,6,0,3 -2008,1,3,4,2130,2115,2300,2235,WN,1568,N227WN,90,80,65,25,15,MCI,BNA,491,11,14,0,,0,0,0,10,0,15 -2008,1,3,4,1708,1710,1829,1835,WN,1668,N262WN,81,85,68,-6,-2,MCI,BNA,491,5,8,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,646,645,1012,1005,WN,3062,N415WN,146,140,128,7,1,MCI,BWI,967,7,11,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,1404,1350,1726,1710,WN,3320,N354SW,142,140,125,16,14,MCI,BWI,967,9,8,0,,0,10,0,2,0,4 -2008,1,3,4,1958,1930,2310,2250,WN,3829,N465WN,132,140,118,20,28,MCI,BWI,967,5,9,0,,0,0,0,0,0,20 -2008,1,3,4,726,725,850,900,WN,11,N689SW,84,95,71,-10,1,MCI,DAL,461,4,9,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,937,910,1102,1040,WN,19,N511SW,85,90,71,22,27,MCI,DAL,461,4,10,0,,0,2,0,0,0,20 -2008,1,3,4,1251,1235,1415,1405,WN,33,N525SW,84,90,70,10,16,MCI,DAL,461,4,10,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,2009,1910,2132,2040,WN,59,N628SW,83,90,70,52,59,MCI,DAL,461,2,11,0,,0,0,0,0,0,52 -2008,1,3,4,1602,1605,1724,1735,WN,2010,N210WN,82,90,69,-11,-3,MCI,DAL,461,3,10,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,2102,2100,2225,2230,WN,3239,N485WN,83,90,67,-5,2,MCI,DAL,461,4,12,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,1101,1055,1142,1145,WN,454,N603SW,101,110,84,-3,6,MCI,DEN,533,6,11,0,,0,NA,NA,NA,NA,NA -2008,1,3,4,1917,1855,1959,1940,WN,977,N376SW,102,105,88,19,22,MCI,DEN,533,6,8,0,,0,3,0,0,0,16 -2008,1,3,4,1502,1440,1540,1525,WN,1151,N386SW,98,105,83,15,22,MCI,DEN,533,5,10,0,,0,12,0,0,0,3 diff --git a/inst/tests/530_fread.txt b/inst/tests/530_fread.txt deleted file mode 100644 index 1756214b18..0000000000 --- a/inst/tests/530_fread.txt +++ /dev/null @@ -1,51 +0,0 @@ -a,b,c,d -1,2 -1,2 -1,2 -1,2 -1,2 -1,2 -1,2 -1,2 -1,2 -1,2 -1,2 -1,2 -1,2 -1,2 -1,2 -1,2 -1,2 -1,2 -1,2 -1,2 -1,2 -1,2 -1,2 -1,2 -1,2 -1,2 -1,2 -1,2 -1,2 -1,2 -1,2 -1,2 -1,2 -1,2 -1,2 -1,2 -1,2 -1,2 -1,2 -1,2 -1,2 -1,2 -1,2 -1,2 -1,2 -1,2,3 -a,b - -1,3 -2,4 diff --git a/inst/tests/536_fread_fill_1.txt b/inst/tests/536_fread_fill_1.txt deleted file mode 100644 index 763b49d9da..0000000000 --- a/inst/tests/536_fread_fill_1.txt +++ /dev/null @@ -1,29 +0,0 @@ -a,b,c -1,2,qq -1,2,qq -1,2,qq -1,2,qq -4,5 - -1,2,qq -1,2,qq -1,2,qq -1,2,qq -1,2,qq -1 - - -1,2,qq - -1,2,qq -1,2,qq -1,2,qq -1 - -1 -1 -1,2,qq -1,2,qq -1,2,qq -1,2,er - diff --git a/inst/tests/536_fread_fill_2.txt b/inst/tests/536_fread_fill_2.txt deleted file mode 100644 index 717b6415e6..0000000000 --- a/inst/tests/536_fread_fill_2.txt +++ /dev/null @@ -1,28 +0,0 @@ -a,b,c -1,2,qq -1,2,qq -1,2,qq -1,2,qq -4,5 - -1,2,qq -1,2,qq -1,2,qq -1,2,qq -1,2,qq -1 - - -1,2,qq - -1,2,qq -1,2,qq -1,2,qq -1 - -1 -1 -1,2,qq -1,2,qq -1,2,qq -1,2,er diff --git a/inst/tests/536_fread_fill_3_extreme.txt b/inst/tests/536_fread_fill_3_extreme.txt deleted file mode 100644 index 011826e855..0000000000 --- a/inst/tests/536_fread_fill_3_extreme.txt +++ /dev/null @@ -1,22 +0,0 @@ -a,b,c -1,"first,,,,,,,,,,,,,,,, - -second,,,,,,, - - - - - - - - - -third",2 - - - -2,"foo" -3 - - - diff --git a/inst/tests/536_fread_fill_4.txt b/inst/tests/536_fread_fill_4.txt deleted file mode 100644 index 5a51bf855d..0000000000 --- a/inst/tests/536_fread_fill_4.txt +++ /dev/null @@ -1,30 +0,0 @@ -a,b,c - -1,2,qq -1,2,qq -1,2,qq -1,2,qq -4,5 - -1,2,qq -1,2,qq -1,2,qq -1,2,qq -1,2,qq -1 - - -1,2,qq - -1,2,qq -1,2,qq -1,2,qq -1 - -1 -1 -1,2,qq -1,2,qq -1,2,qq -1,2,er - diff --git a/inst/tests/SA2-by-DJZ.csv b/inst/tests/SA2-by-DJZ.csv deleted file mode 100644 index 5b1362dbf2..0000000000 --- a/inst/tests/SA2-by-DJZ.csv +++ /dev/null @@ -1,1400 +0,0 @@ -Australian Bureau of Statistics - -"2011 Census - Counting Employed Persons, Place of Work" -"Main Statistical Area Structure (Main ASGS) (UR) and DZN to State/Territory (POW)" -"Counting: Persons, Place of Work" - -Filters: -"Default Summation","Persons, Place of Work" - - -"Main Statistical Area Structure (Main ASGS) (UR)","DZN to State/Territory (POW)", -"Goulburn","110018063",3499, -,"110018064",812, -,"110018065",2158, -,"110019999",402, -,"110028068",10, -,"110028069",31, -,"110028070",5, -,"110028071",41, -,"110028072",18, -,"110028073",44, -,"110028074",219, -,"110029999",12, -,"110038049",7, -,"110038050",0, -,"110039999",0, -,"110048053",0, -,"110048054",0, -,"110048055",0, -,"110048056",3, -,"110048057",10, -,"110048058",0, -,"110048059",0, -,"110048060",0, -,"110049999",0, -,"110058039",0, -,"110058040",0, -,"110059999",0, -,"110068043",0, -,"110068044",0, -,"110068045",3, -,"110068046",0, -,"110069999",0, -,"110078098",0, -,"110078099",4, -,"110078100",0, -,"110079999",0, -,"110088084",7, -,"110098077",35, -,"110108087",23, -,"110118090",0, -,"110118091",3, -,"110118092",5, -,"110118093",0, -,"110118094",23, -,"110118095",0, -,"110119999",0, -,"110128080",10, -,"110128081",0, -,"110129999",0, -,"110138120",0, -,"110138121",0, -,"110138122",0, -,"110138123",0, -,"110139999",0, -,"110148117",5, -,"110158112",0, -,"110158113",0, -,"110158114",0, -,"110159999",0, -,"110168103",0, -,"110168104",0, -,"110168105",0, -,"110168106",0, -,"110168107",0, -,"110168108",0, -,"110168109",0, -,"110169999",0, -,"110178126",0, -,"110188129",0, -,"110198157",3, -,"110198158",0, -,"110198159",0, -,"110199999",0, -,"110208162",0, -,"110208163",0, -,"110208164",0, -,"110208165",0, -,"110208166",0, -,"110208167",0, -,"110208168",0, -,"110209999",0, -,"110218132",0, -,"110228147",0, -,"110238175",0, -,"110248141",0, -,"110248142",0, -,"110248143",0, -,"110248144",0, -,"110249999",0, -,"110258171",0, -,"110258172",0, -,"110259999",0, -,"110268135",0, -,"110268136",0, -,"110268137",0, -,"110268138",0, -,"110269999",0, -,"110278150",0, -,"110278151",0, -,"110278152",0, -,"110278153",0, -,"110278154",0, -,"110279999",0, -,"110286283",0, -,"110286284",0, -,"110289999",0, -,"110296249",0, -,"110296250",0, -,"110296251",0, -,"110296252",0, -,"110296253",0, -,"110299999",0, -,"110306039",0, -,"110306040",0, -,"110306041",0, -,"110306042",0, -,"110306043",0, -,"110306044",0, -,"110306045",0, -,"110309999",0, -,"110316200",0, -,"110316201",0, -,"110316202",0, -,"110316203",0, -,"110316204",0, -,"110316205",0, -,"110316206",0, -,"110319999",0, -,"110326131",0, -,"110326132",0, -,"110326133",0, -,"110326134",0, -,"110326135",0, -,"110326136",0, -,"110326137",0, -,"110326138",0, -,"110329999",0, -,"110336058",0, -,"110336059",0, -,"110339999",0, -,"110346234",0, -,"110346235",0, -,"110346236",0, -,"110349999",0, -,"110356072",0, -,"110366085",0, -,"110366086",0, -,"110366087",0, -,"110366088",0, -,"110369999",0, -,"110376116",0, -,"110376117",0, -,"110376118",0, -,"110379999",0, -,"110386186",0, -,"110386187",0, -,"110389999",0, -,"110396266",0, -,"110396267",0, -,"110396268",0, -,"110396269",0, -,"110396270",0, -,"110399999",0, -,"110406167",0, -,"110406168",0, -,"110406169",0, -,"110406170",0, -,"110406171",0, -,"110406172",0, -,"110406173",0, -,"110409999",0, -,"110416219",0, -,"110416220",0, -,"110416221",0, -,"110419999",0, -,"110426151",0, -,"110426152",0, -,"110426153",0, -,"110426154",0, -,"110429999",0, -,"110436101",0, -,"110436102",0, -,"110436103",0, -,"110439999",0, -,"110446472",0, -,"110446473",0, -,"110446474",0, -,"110446475",0, -,"110446476",0, -,"110446477",0, -,"110446478",0, -,"110446479",0, -,"110449999",0, -,"110456411",0, -,"110456412",0, -,"110459999",0, -,"110466457",0, -,"110466458",0, -,"110466459",0, -,"110469999",0, -,"110476425",0, -,"110476426",0, -,"110476427",0, -,"110476428",0, -,"110476429",0, -,"110479999",0, -,"110486393",0, -,"110486394",0, -,"110486395",0, -,"110486396",0, -,"110486397",0, -,"110486398",0, -,"110489999",0, -,"110496297",0, -,"110496298",0, -,"110499999",0, -,"110506442",0, -,"110506443",0, -,"110506444",0, -,"110509999",0, -,"110516311",0, -,"110516312",0, -,"110516313",0, -,"110516314",0, -,"110519999",0, -,"110526380",0, -,"110536492",0, -,"110536493",0, -,"110536494",0, -,"110536495",0, -,"110536496",0, -,"110539999",0, -,"110546509",0, -,"110546510",0, -,"110546511",0, -,"110549999",0, -,"110556343",0, -,"110556344",0, -,"110556345",0, -,"110556346",0, -,"110556347",0, -,"110556348",0, -,"110559999",0, -,"110566361",0, -,"110566362",0, -,"110566363",0, -,"110566364",0, -,"110566365",0, -,"110566366",0, -,"110566367",0, -,"110569999",0, -,"110576327",0, -,"110576328",0, -,"110576329",0, -,"110576330",0, -,"110579999",0, -,"110588281",0, -,"110588282",0, -,"110588283",0, -,"110589999",0, -,"110598286",0, -,"110608289",0, -,"110608290",0, -,"110608291",0, -,"110608292",0, -,"110609999",0, -,"110618295",0, -,"110618296",0, -,"110618297",0, -,"110619999",0, -,"110628178",0, -,"110628179",0, -,"110628180",0, -,"110628181",0, -,"110628182",0, -,"110629999",0, -,"110638211",0, -,"110648214",0, -,"110648215",0, -,"110648216",0, -,"110648217",0, -,"110648218",0, -,"110648219",0, -,"110649999",0, -,"110658201",0, -,"110658202",0, -,"110658203",0, -,"110659999",0, -,"110668206",0, -,"110668207",0, -,"110668208",0, -,"110669999",0, -,"110678197",0, -,"110678198",0, -,"110679999",0, -,"110688185",0, -,"110688186",0, -,"110688187",0, -,"110688188",0, -,"110689999",0, -,"110698191",0, -,"110698192",0, -,"110698193",0, -,"110698194",0, -,"110699999",0, -,"110708276",0, -,"110708277",0, -,"110708278",0, -,"110709999",0, -,"110718265",0, -,"110718266",0, -,"110718267",0, -,"110718268",0, -,"110718269",0, -,"110718270",0, -,"110719999",0, -,"110728251",0, -,"110738261",0, -,"110738262",0, -,"110739999",0, -,"110748254",0, -,"110748255",0, -,"110748256",0, -,"110748257",0, -,"110748258",0, -,"110749999",0, -,"110758273",0, -,"110768245",4, -,"110768246",0, -,"110768247",0, -,"110768248",0, -,"110769999",0, -,"110778239",0, -,"110778240",0, -,"110778241",0, -,"110778242",0, -,"110779999",0, -,"110788233",0, -,"110788234",0, -,"110788235",0, -,"110788236",0, -,"110789999",0, -,"110798222",0, -,"110798223",0, -,"110798224",0, -,"110798225",0, -,"110798226",0, -,"110798227",0, -,"110798228",0, -,"110798229",0, -,"110798230",0, -,"110799999",0, -,"110808417",0, -,"110808418",0, -,"110808419",0, -,"110808420",0, -,"110809999",0, -,"110818404",0, -,"110818405",0, -,"110818406",0, -,"110818407",0, -,"110818408",0, -,"110818409",0, -,"110818410",0, -,"110818411",0, -,"110818412",0, -,"110818413",0, -,"110818414",0, -,"110819999",0, -,"110828423",0, -,"110828424",0, -,"110828425",0, -,"110828426",0, -,"110828427",0, -,"110829999",0, -,"110838435",0, -,"110838436",0, -,"110838437",0, -,"110839999",0, -,"110848459",0, -,"110848460",0, -,"110848461",0, -,"110849999",0, -,"110858473",0, -,"110858474",0, -,"110858475",0, -,"110858476",0, -,"110859999",0, -,"110868440",0, -,"110868441",0, -,"110869999",0, -,"110878430",0, -,"110878431",0, -,"110878432",0, -,"110879999",0, -,"110888464",0, -,"110888465",0, -,"110888466",0, -,"110889999",0, -,"110898451",0, -,"110898452",0, -,"110898453",0, -,"110898454",0, -,"110898455",0, -,"110898456",0, -,"110899999",0, -,"110908469",0, -,"110908470",0, -,"110909999",0, -,"110918444",0, -,"110918445",0, -,"110918446",0, -,"110918447",0, -,"110918448",0, -,"110919999",0, -,"110928694",0, -,"110928695",0, -,"110928696",0, -,"110928697",0, -,"110929999",0, -,"110938700",0, -,"110938701",0, -,"110939999",0, -,"110948711",0, -,"110948712",0, -,"110949999",0, -,"110958715",0, -,"110958716",0, -,"110959999",0, -,"110968704",0, -,"110968705",0, -,"110968706",0, -,"110968707",0, -,"110968708",0, -,"110969999",0, -,"110978691",0, -,"110988688",0, -,"110998746",0, -,"110998747",0, -,"110998748",0, -,"110998749",0, -,"110998750",0, -,"110998751",0, -,"110999999",0, -,"111008742",0, -,"111008743",0, -,"111009999",0, -,"111018733",0, -,"111018734",0, -,"111019999",0, -,"111028729",0, -,"111028730",0, -,"111029999",0, -,"111038737",0, -,"111038738",0, -,"111038739",0, -,"111039999",0, -,"111048724",0, -,"111048725",0, -,"111048726",0, -,"111049999",0, -,"111058719",0, -,"111058720",0, -,"111058721",0, -,"111059999",0, -,"111068754",0, -,"111068755",0, -,"111068756",0, -,"111068757",0, -,"111068758",0, -,"111069999",0, -,"111077020",0, -,"111077021",0, -,"111077022",0, -,"111077023",0, -,"111077024",0, -,"111079999",0, -,"111087054",0, -,"111087055",0, -,"111087056",0, -,"111087057",0, -,"111087058",0, -,"111087059",0, -,"111087060",0, -,"111087061",0, -,"111087062",0, -,"111089999",0, -,"111097037",0, -,"111097038",0, -,"111097039",0, -,"111097040",0, -,"111097041",0, -,"111099999",0, -,"111108028",0, -,"111108029",0, -,"111108030",0, -,"111108031",0, -,"111108032",0, -,"111109999",0, -,"111117075",0, -,"111117076",0, -,"111117077",0, -,"111117078",0, -,"111117079",0, -,"111117080",0, -,"111117081",0, -,"111117082",0, -,"111119999",0, -,"111128024",0, -,"111128025",0, -,"111129999",0, -,"111138020",0, -,"111138021",0, -,"111139999",0, -,"111147129",0, -,"111147130",0, -,"111147131",0, -,"111149999",0, -,"111157144",0, -,"111157145",0, -,"111157146",0, -,"111157147",0, -,"111157148",0, -,"111157149",0, -,"111157150",0, -,"111157151",0, -,"111157152",0, -,"111157153",0, -,"111157154",0, -,"111159999",0, -,"111167115",0, -,"111167116",0, -,"111169999",0, -,"111177095",0, -,"111177096",0, -,"111177097",0, -,"111177098",0, -,"111177099",0, -,"111177100",0, -,"111177101",0, -,"111177102",0, -,"111179999",0, -,"111187167",0, -,"111187168",0, -,"111187169",0, -,"111189999",0, -,"111197246",0, -,"111197247",0, -,"111199999",0, -,"111207232",0, -,"111207233",0, -,"111209999",0, -,"111217260",0, -,"111217261",0, -,"111217262",0, -,"111217263",0, -,"111217264",0, -,"111217265",0, -,"111217266",0, -,"111217267",0, -,"111219999",0, -,"111227196",0, -,"111227197",0, -,"111227198",0, -,"111227199",0, -,"111227200",0, -,"111229999",0, -,"111237182",0, -,"111237183",0, -,"111239999",0, -,"111248035",0, -,"111248036",0, -,"111249999",0, -,"111257213",0, -,"111257214",0, -,"111257215",0, -,"111257216",0, -,"111257217",0, -,"111257218",0, -,"111257219",0, -,"111259999",0, -,"111268016",0, -,"111268017",0, -,"111269999",0, -,"111278011",0, -,"111278012",0, -,"111278013",0, -,"111279999",0, -,"111288008",0, -,"111298000",0, -,"111298001",0, -,"111298002",0, -,"111298003",0, -,"111298004",0, -,"111298005",0, -,"111299999",0, -,"111307495",0, -,"111307496",0, -,"111307497",0, -,"111307498",0, -,"111307499",0, -,"111307500",0, -,"111307501",0, -,"111307502",0, -,"111307503",0, -,"111307504",0, -,"111307505",0, -,"111307506",0, -,"111309999",0, -,"111317440",0, -,"111317441",0, -,"111317442",0, -,"111317443",0, -,"111317444",0, -,"111317445",0, -,"111317446",0, -,"111317447",0, -,"111319999",0, -,"111327425",0, -,"111327426",0, -,"111327427",0, -,"111329999",0, -,"111337480",0, -,"111337481",0, -,"111337482",0, -,"111339999",0, -,"111347460",0, -,"111347461",0, -,"111347462",0, -,"111347463",0, -,"111347464",0, -,"111347465",0, -,"111347466",0, -,"111347467",0, -,"111349999",0, -,"111357280",0, -,"111367519",0, -,"111367520",0, -,"111367521",0, -,"111369999",0, -,"111377534",0, -,"111377535",4, -,"111377536",0, -,"111377537",0, -,"111379999",0, -,"111387632",0, -,"111387633",0, -,"111387634",0, -,"111389999",0, -,"111397618",0, -,"111397619",0, -,"111399999",0, -,"111407550",0, -,"111407551",0, -,"111407552",0, -,"111409999",0, -,"111417600",0, -,"111417601",0, -,"111417602",0, -,"111417603",0, -,"111417604",0, -,"111417605",0, -,"111419999",0, -,"111427565",0, -,"111427566",0, -,"111427567",0, -,"111427568",0, -,"111427569",0, -,"111429999",0, -,"111437582",0, -,"111437583",0, -,"111437584",0, -,"111437585",3, -,"111437586",0, -,"111437587",0, -,"111439999",0, -,"111447383",0, -,"111447384",0, -,"111447385",0, -,"111447386",0, -,"111447387",0, -,"111447388",0, -,"111447389",0, -,"111449999",0, -,"111457365",0, -,"111457366",0, -,"111457367",0, -,"111457368",0, -,"111457369",0, -,"111457370",0, -,"111459999",0, -,"111467345",0, -,"111467346",0, -,"111467347",0, -,"111467348",0, -,"111467349",0, -,"111467350",0, -,"111467351",0, -,"111467352",0, -,"111469999",0, -,"111477293",0, -,"111477294",0, -,"111477295",0, -,"111477296",0, -,"111479999",0, -,"111487309",0, -,"111487310",0, -,"111487311",0, -,"111487312",0, -,"111487313",0, -,"111489999",0, -,"111497402",0, -,"111497403",0, -,"111497404",0, -,"111497405",0, -,"111497406",3, -,"111497407",0, -,"111497408",0, -,"111497409",0, -,"111497410",0, -,"111497411",0, -,"111497412",0, -,"111499999",0, -,"111507326",0, -,"111507327",0, -,"111507328",0, -,"111507329",0, -,"111507330",0, -,"111507331",0, -,"111507332",0, -,"111509999",0, -,"111518383",0, -,"111518384",0, -,"111518385",0, -,"111518386",0, -,"111519999",0, -,"111528397",0, -,"111528398",0, -,"111529999",0, -,"111538392",0, -,"111538393",0, -,"111538394",0, -,"111539999",0, -,"111548389",0, -,"111558322",0, -,"111558323",0, -,"111558324",0, -,"111558325",0, -,"111559999",0, -,"111568300",0, -,"111568301",0, -,"111568302",0, -,"111568303",0, -,"111568304",0, -,"111569999",0, -,"111578318",0, -,"111578319",0, -,"111579999",0, -,"111588313",0, -,"111588314",0, -,"111588315",0, -,"111589999",0, -,"111598307",0, -,"111598308",0, -,"111598309",0, -,"111598310",0, -,"111599999",0, -,"111608328",0, -,"111618401",0, -,"111628337",0, -,"111628338",0, -,"111628339",0, -,"111628340",0, -,"111628341",0, -,"111629999",0, -,"111638352",0, -,"111648349",0, -,"111658331",0, -,"111658332",0, -,"111658333",0, -,"111658334",0, -,"111659999",0, -,"111668344",0, -,"111668345",0, -,"111668346",0, -,"111669999",0, -,"111678355",0, -,"111678356",0, -,"111679999",0, -,"111688377",0, -,"111688378",0, -,"111688379",0, -,"111688380",0, -,"111689999",0, -,"111698372",0, -,"111698373",0, -,"111698374",0, -,"111699999",0, -,"111708359",0, -,"111708360",0, -,"111708361",0, -,"111708362",0, -,"111708363",0, -,"111708364",0, -,"111708365",0, -,"111708366",0, -,"111709999",0, -,"111718369",0, -,"111728921",0, -,"111728922",0, -,"111728923",0, -,"111729999",0, -,"111738912",0, -,"111738913",0, -,"111739999",0, -,"111748908",0, -,"111748909",0, -,"111749999",0, -,"111758898",0, -,"111758899",0, -,"111758900",0, -,"111758901",0, -,"111758902",0, -,"111758903",0, -,"111758904",0, -,"111758905",0, -,"111759999",0, -,"111768916",0, -,"111768917",0, -,"111768918",0, -,"111769999",0, -,"111778863",0, -,"111778864",0, -,"111779999",0, -,"111788852",0, -,"111788853",0, -,"111788854",0, -,"111789999",0, -,"111798857",0, -,"111798858",0, -,"111798859",0, -,"111798860",0, -,"111799999",0, -,"111808895",0, -,"111818888",0, -,"111818889",0, -,"111818890",0, -,"111818891",0, -,"111818892",0, -,"111819999",0, -,"111828867",0, -,"111838870",0, -,"111838871",0, -,"111838872",0, -,"111838873",0, -,"111838874",0, -,"111838875",0, -,"111839999",0, -,"111848878",0, -,"111858881",0, -,"111858882",0, -,"111858883",0, -,"111858884",0, -,"111858885",0, -,"111859999",0, -,"111868671",0, -,"111868672",0, -,"111868673",0, -,"111868674",0, -,"111869999",0, -,"111878677",0, -,"111878678",0, -,"111878679",0, -,"111878680",0, -,"111879999",0, -,"111888665",0, -,"111888666",0, -,"111888667",0, -,"111888668",0, -,"111889999",0, -,"111898683",0, -,"111898684",0, -,"111898685",0, -,"111899999",0, -,"111908622",0, -,"111908623",0, -,"111908624",0, -,"111908625",0, -,"111909999",0, -,"111918607",0, -,"111928610",0, -,"111928611",0, -,"111928612",0, -,"111928613",0, -,"111928614",0, -,"111929999",0, -,"111938600",0, -,"111938601",0, -,"111938602",0, -,"111938603",0, -,"111938604",0, -,"111939999",0, -,"111948617",0, -,"111948618",0, -,"111948619",0, -,"111949999",0, -,"111958588",0, -,"111968583",0, -,"111968584",0, -,"111968585",0, -,"111969999",0, -,"111978597",0, -,"111988591",0, -,"111988592",0, -,"111988593",0, -,"111988594",0, -,"111989999",0, -,"111998628",0, -,"112008631",0, -,"112008632",0, -,"112008633",0, -,"112009999",0, -,"112018636",0, -,"112018637",0, -,"112018638",0, -,"112018639",0, -,"112019999",0, -,"112028659",0, -,"112028660",0, -,"112028661",0, -,"112028662",0, -,"112029999",0, -,"112038646",0, -,"112038647",0, -,"112038648",0, -,"112039999",0, -,"112048642",0, -,"112048643",0, -,"112049999",0, -,"112058651",0, -,"112058652",0, -,"112058653",0, -,"112058654",0, -,"112058655",0, -,"112058656",0, -,"112059999",0, -,"112066729",0, -,"112066730",0, -,"112066731",0, -,"112066732",0, -,"112066733",0, -,"112066734",0, -,"112069999",0, -,"112076747",0, -,"112076748",0, -,"112079999",0, -,"112086707",0, -,"112086708",0, -,"112086709",0, -,"112086710",0, -,"112086711",0, -,"112086712",0, -,"112086713",0, -,"112086714",0, -,"112086715",0, -,"112086716",0, -,"112089999",0, -,"112096639",0, -,"112096640",0, -,"112096641",0, -,"112096642",0, -,"112096643",0, -,"112096644",0, -,"112096645",0, -,"112096646",0, -,"112096647",0, -,"112099999",0, -,"112106692",0, -,"112106693",0, -,"112106694",0, -,"112109999",0, -,"112116761",0, -,"112126774",0, -,"112126775",0, -,"112126776",0, -,"112126777",0, -,"112129999",0, -,"112136677",0, -,"112136678",0, -,"710321286",260, -,"710321336",937, -,"710329999",0, -,"710331209",73, -,"710341328",633, -,"710351093",104, -,"710351169",411, -,"710351224",178, -,"710351239",106, -,"710351912",19, -,"710359999",0, -,"710361069",176, -,"710371255",384, -,"710381280",763, -,"710381324",247, -,"710381904",18, -,"710381906",102, -,"710389999",11, -,"710391334",248, -,"710401211",223, -,"710411005",877, -,"710411052",268, -,"710411125",96, -,"710411902",1491, -,"710419999",237, -,"710421072",22, -,"710431240",261, -,"710441022",507, -,"710451272",3280, -,"710451289",305, -,"710451374",2760, -,"710451915",489, -,"710459999",8, -,"710461007",509, -,"710461273",279, -,"710469999",0, -,"710471392",579, -,"710481263",352, -,"710491120",351, -,"710491213",1579, -,"710499999",0, -,"710501309",546, -,"710501345",402, -,"710509999",6, -,"710511128",216, -,"710511215",96, -,"710511223",190, -,"710511299",211, -,"710511901",65, -,"710519999",0, -,"710521026",0, -,"710521065",126, -,"710521090",66, -,"710521095",1059, -,"710521140",0, -,"710521163",0, -,"710521331",0, -,"710521333",0, -,"710521391",5, -,"710529999",0, -,"710531073",13, -,"710531089",0, -,"710531181",1051, -,"710531291",32, -,"710539999",0, -,"710541042",0, -,"710541081",111, -,"710541086",117, -,"710541139",8, -,"710541185",11, -,"710541221",153, -,"710541353",0, -,"710541363",68, -,"710549999",0, -,"710551133",7, -,"710551228",80, -,"710551249",243, -,"710551261",86, -,"710551337",299, -,"710559999",0, -,"710561230",1116, -,"710571035",51, -,"710571155",0, -,"710571285",772, -,"710571323",589, -,"710571339",448, -,"710571395",47, -,"710579999",3, -,"710581122",109, -,"710581371",219, -,"710581378",534, -,"710589999",0, -,"710591197",476, -,"710601318",769, -,"710611032",81, -,"710611219",119, -,"710611256",0, -,"710611268",859, -,"710611343",295, -,"710619999",0, -,"710621028",0, -,"710621044",294, -,"710621205",0, -,"710621329",1051, -,"710629999",0, -,"710631226",52, -,"710631346",2589, -,"710639999",0, -,"710641160",1251, -,"710651051",60, -,"710651131",198, -,"710651157",0, -,"710651202",119, -,"710651370",169, -,"710659999",0, -,"710661039",142, -,"710661068",0, -,"710661118",441, -,"710661147",341, -,"710661306",386, -,"710661359",0, -,"710669999",0, -,"710671078",635, -,"710671097",2436, -,"710671214",11, -,"710671394",678, -,"710679999",277, -,"710681003",134, -,"710681016",437, -,"710681167",72, -,"710681217",19, -,"710681319",95, -,"710681321",0, -,"710681349",7, -,"710689999",0, -,"790999099",1261, -,"797999799",128, -,"798999899",5716, -,"794999499",2803, -,"810011001",282, -,"810021002",23, -,"810021003",150, -,"810021004",9876, -,"810021005",2403, -,"810029999",41, -,"810031006",161, -,"810031007",1637, -,"810031008",1042, -,"810031037",1358, -,"810031038",1069, -,"810039999",76, -,"810041009",330, -,"810041010",183, -,"810049999",9, -,"810051011",140, -,"810061012",169, -,"810071013",367, -,"810081014",507, -,"810091015",120, -,"810101016",163, -,"810111017",126, -,"810121040",0, -,"810131018",268, -,"810131019",319, -,"810139999",9, -,"810141020",157, -,"810151021",148, -,"810151022",770, -,"810159999",48, -,"810161023",535, -,"810161024",188, -,"810169999",14, -,"810171025",178, -,"810181039",0, -,"810191027",276, -,"810201028",186, -,"810201029",617, -,"810209999",6, -,"810211030",151, -,"810221031",330, -,"810231032",327, -,"810241033",189, -,"810251034",227, -,"810261035",175, -,"810271271",581, -,"810271342",315, -,"810279999",32, -,"810281041",159, -,"810281161",135, -,"810289999",0, -,"810291513",6, -,"810301124",2037, -,"810301125",5552, -,"810301126",963, -,"810301167",1969, -,"810301168",549, -,"810301503",386, -,"810301504",22, -,"810301505",1415, -,"810301506",58, -,"810301508",1147, -,"810309999",430, -,"810311501",1025, -,"810311515",1007, -,"810311516",168, -,"810319999",159, -,"810321517",14, -,"810331507",627, -,"810331509",3236, -,"810331510",1238, -,"810331511",198, -,"810331512",539, -,"810331514",1085, -,"810339999",46, -,"810341401",353, -,"810351445",110, -,"810361450",89, -,"810371455",125, -,"810381460",217, -,"810391465",133, -,"810401404",507, -,"810401405",1297, -,"810401406",447, -,"810409999",95, -,"810411441",50, -,"810421440",4, -,"810431408",242, -,"810441407",350, -,"810451411",2134, -,"810451412",1677, -,"810451421",32, -,"810459999",200, -,"810461414",377, -,"810471416",559, -,"810471417",382, -,"810479999",0, -,"810481418",223, -,"810491101",5080, -,"810491102",341, -,"810491160",865, -,"810499999",0, -,"810501103",773, -,"810511106",949, -,"810511107",2640, -,"810519999",107, -,"810521108",625, -,"810521109",542, -,"810521110",2550, -,"810521142",6730, -,"810521162",3, -,"810529999",0, -,"810531111",8059, -,"810531112",9668, -,"810531113",8388, -,"810531114",4394, -,"810531115",429, -,"810531116",285, -,"810539999",580, -,"810541120",1840, -,"810541121",377, -,"810541165",1006, -,"810541166",159, -,"810549999",103, -,"810551122",258, -,"810561129",252, -,"810571131",251, -,"810571132",507, -,"810571133",711, -,"810571171",283, -,"810579999",105, -,"810581136",687, -,"810591139",204, -,"810591141",936, -,"810599999",0, -,"810601143",169, -,"810601144",1261, -,"810601145",257, -,"810609999",10, -,"810611146",552, -,"810611147",403, -,"810619999",16, -,"810621117",1136, -,"810621118",217, -,"810621119",567, -,"810621163",2031, -,"810621164",498, -,"810621174",330, -,"810629999",73, -,"810631123",421, -,"810631172",1342, -,"810639999",37, -,"810641127",1477, -,"810641128",1310, -,"810649999",46, -,"810651104",5855, -,"810651105",4130, -,"810651130",1170, -,"810651169",489, -,"810659999",173, -,"810661173",0, -,"810671134",539, -,"810671135",362, -,"810679999",51, -,"810681137",1916, -,"810681138",4839, -,"810689999",0, -,"810691140",839, -,"810701148",587, -,"810701149",183, -,"810701150",790, -,"810709999",16, -,"810711301",136, -,"810721302",153, -,"810731303",341, -,"810731304",261, -,"810739999",13, -,"810741305",210, -,"810741306",197, -,"810749999",10, -,"810751307",757, -,"810761309",247, -,"810771310",132, -,"810781311",307, -,"810791312",259, -,"810801313",1457, -,"810801314",1734, -,"810801343",1561, -,"810801344",1963, -,"810801345",1876, -,"810801346",87, -,"810801347",0, -,"810809999",1004, -,"810811316",305, -,"810821317",479, -,"810821318",122, -,"810821319",328, -,"810821320",232, -,"810829999",41, -,"810831321",51, -,"810841322",367, -,"810851341",0, -,"810861323",54, -,"810871324",169, -,"810881325",130, -,"810891340",81, -,"810901326",900, -,"810901327",1023, -,"810909999",8, -,"810911251",280, -,"810921252",172, -,"810931253",151, -,"810941254",547, -,"810951255",196, -,"810961256",266, -,"810971257",341, -,"810981258",372, -,"810981259",998, -,"810981260",210, -,"810989999",31, -,"810991201",180, -,"811001202",276, -,"811001203",589, -,"811009999",0, -,"811011204",261, -,"811021205",703, -,"811021206",4345, -,"811029999",17, -,"811031207",384, -,"811041208",137, -,"811051209",195, -,"811061210",246, -,"811061211",484, -,"811069999",17, -,"811071212",196, -,"811081213",561, -,"811091214",167, -,"811091215",10769, -,"811091216",2272, -,"811099999",201, -,"811101217",188, -,"890999099",10320, -,"897999799",0, -,"898999899",0, -,"894999499",6195, -,"910011001",979, -,"910021002",207, -,"910038888",351, -,"990999099",0, -,"997999799",0, -,"998999899",64, -,"994999499",34, -,"0&&&&&&&&",250796, -,"0@@@@@@@@",7305367, - -"Dataset: 2011 Census of Population and Housing" - -"INFO","Cells in this table have been randomly adjusted to avoid the release of confidential data. No reliance should be placed on small cells." - - -(c) Commonwealth of Australia 2017 diff --git a/inst/tests/allchar.csv b/inst/tests/allchar.csv deleted file mode 100644 index cd927442b5..0000000000 --- a/inst/tests/allchar.csv +++ /dev/null @@ -1,17577 +0,0 @@ -col1,col2 -AAA,AAN -BAA,BAN -CAA,CAN -DAA,DAN -EAA,EAN -FAA,FAN -GAA,GAN -HAA,HAN -IAA,IAN -JAA,JAN -KAA,KAN -LAA,LAN -MAA,MAN -NAA,NAN -OAA,OAN -PAA,PAN -QAA,QAN -RAA,RAN -SAA,SAN -TAA,TAN -UAA,UAN -VAA,VAN -WAA,WAN -XAA,XAN -YAA,YAN -ZAA,ZAN -ABA,ABN -BBA,BBN -CBA,CBN -DBA,DBN -EBA,EBN -FBA,FBN -GBA,GBN -HBA,HBN -IBA,IBN -JBA,JBN -KBA,KBN -LBA,LBN -MBA,MBN -NBA,NBN -OBA,OBN -PBA,PBN -QBA,QBN -RBA,RBN -SBA,SBN -TBA,TBN -UBA,UBN -VBA,VBN -WBA,WBN -XBA,XBN -YBA,YBN -ZBA,ZBN -ACA,ACN -BCA,BCN -CCA,CCN -DCA,DCN -ECA,ECN -FCA,FCN -GCA,GCN -HCA,HCN -ICA,ICN -JCA,JCN -KCA,KCN -LCA,LCN -MCA,MCN -NCA,NCN -OCA,OCN -PCA,PCN -QCA,QCN -RCA,RCN -SCA,SCN -TCA,TCN -UCA,UCN -VCA,VCN -WCA,WCN -XCA,XCN -YCA,YCN -ZCA,ZCN -ADA,ADN -BDA,BDN -CDA,CDN -DDA,DDN -EDA,EDN -FDA,FDN -GDA,GDN -HDA,HDN -IDA,IDN -JDA,JDN -KDA,KDN -LDA,LDN -MDA,MDN -NDA,NDN -ODA,ODN -PDA,PDN -QDA,QDN -RDA,RDN -SDA,SDN -TDA,TDN -UDA,UDN -VDA,VDN -WDA,WDN -XDA,XDN -YDA,YDN -ZDA,ZDN -AEA,AEN -BEA,BEN -CEA,CEN -DEA,DEN -EEA,EEN -FEA,FEN -GEA,GEN -HEA,HEN -IEA,IEN -JEA,JEN -KEA,KEN -LEA,LEN -MEA,MEN -NEA,NEN -OEA,OEN -PEA,PEN -QEA,QEN -REA,REN -SEA,SEN -TEA,TEN -UEA,UEN -VEA,VEN -WEA,WEN -XEA,XEN -YEA,YEN -ZEA,ZEN -AFA,AFN -BFA,BFN -CFA,CFN -DFA,DFN -EFA,EFN -FFA,FFN -GFA,GFN -HFA,HFN -IFA,IFN -JFA,JFN -KFA,KFN -LFA,LFN -MFA,MFN -NFA,NFN -OFA,OFN -PFA,PFN -QFA,QFN -RFA,RFN -SFA,SFN -TFA,TFN -UFA,UFN -VFA,VFN -WFA,WFN -XFA,XFN -YFA,YFN -ZFA,ZFN -AGA,AGN -BGA,BGN -CGA,CGN -DGA,DGN -EGA,EGN -FGA,FGN -GGA,GGN -HGA,HGN -IGA,IGN -JGA,JGN -KGA,KGN -LGA,LGN -MGA,MGN -NGA,NGN -OGA,OGN -PGA,PGN -QGA,QGN -RGA,RGN -SGA,SGN -TGA,TGN -UGA,UGN -VGA,VGN -WGA,WGN -XGA,XGN -YGA,YGN -ZGA,ZGN -AHA,AHN -BHA,BHN -CHA,CHN -DHA,DHN -EHA,EHN -FHA,FHN -GHA,GHN -HHA,HHN -IHA,IHN -JHA,JHN -KHA,KHN -LHA,LHN -MHA,MHN -NHA,NHN -OHA,OHN -PHA,PHN -QHA,QHN -RHA,RHN -SHA,SHN -THA,THN -UHA,UHN -VHA,VHN -WHA,WHN -XHA,XHN -YHA,YHN -ZHA,ZHN -AIA,AIN -BIA,BIN -CIA,CIN -DIA,DIN -EIA,EIN -FIA,FIN -GIA,GIN -HIA,HIN -IIA,IIN -JIA,JIN -KIA,KIN -LIA,LIN -MIA,MIN -NIA,NIN -OIA,OIN -PIA,PIN -QIA,QIN -RIA,RIN -SIA,SIN -TIA,TIN -UIA,UIN -VIA,VIN -WIA,WIN -XIA,XIN -YIA,YIN -ZIA,ZIN -AJA,AJN -BJA,BJN -CJA,CJN -DJA,DJN -EJA,EJN -FJA,FJN -GJA,GJN -HJA,HJN -IJA,IJN -JJA,JJN -KJA,KJN -LJA,LJN -MJA,MJN -NJA,NJN -OJA,OJN -PJA,PJN -QJA,QJN -RJA,RJN -SJA,SJN -TJA,TJN -UJA,UJN -VJA,VJN -WJA,WJN -XJA,XJN -YJA,YJN -ZJA,ZJN -AKA,AKN -BKA,BKN -CKA,CKN -DKA,DKN -EKA,EKN -FKA,FKN -GKA,GKN -HKA,HKN -IKA,IKN -JKA,JKN -KKA,KKN -LKA,LKN -MKA,MKN -NKA,NKN -OKA,OKN -PKA,PKN -QKA,QKN -RKA,RKN -SKA,SKN -TKA,TKN -UKA,UKN -VKA,VKN -WKA,WKN -XKA,XKN -YKA,YKN -ZKA,ZKN -ALA,ALN -BLA,BLN -CLA,CLN -DLA,DLN -ELA,ELN -FLA,FLN -GLA,GLN -HLA,HLN -ILA,ILN -JLA,JLN -KLA,KLN -LLA,LLN -MLA,MLN -NLA,NLN -OLA,OLN -PLA,PLN -QLA,QLN -RLA,RLN -SLA,SLN -TLA,TLN -ULA,ULN -VLA,VLN -WLA,WLN -XLA,XLN -YLA,YLN -ZLA,ZLN -AMA,AMN -BMA,BMN -CMA,CMN -DMA,DMN -EMA,EMN -FMA,FMN -GMA,GMN -HMA,HMN -IMA,IMN -JMA,JMN -KMA,KMN -LMA,LMN -MMA,MMN -NMA,NMN -OMA,OMN -PMA,PMN -QMA,QMN -RMA,RMN -SMA,SMN -TMA,TMN -UMA,UMN -VMA,VMN -WMA,WMN -XMA,XMN -YMA,YMN -ZMA,ZMN -ANA,ANN -BNA,BNN -CNA,CNN -DNA,DNN -ENA,ENN -FNA,FNN -GNA,GNN -HNA,HNN -INA,INN -JNA,JNN -KNA,KNN -LNA,LNN -MNA,MNN -NNA,NNN -ONA,ONN -PNA,PNN -QNA,QNN -RNA,RNN -SNA,SNN -TNA,TNN -UNA,UNN -VNA,VNN -WNA,WNN -XNA,XNN -YNA,YNN -ZNA,ZNN -AOA,AON -BOA,BON -COA,CON -DOA,DON -EOA,EON -FOA,FON -GOA,GON -HOA,HON -IOA,ION -JOA,JON -KOA,KON -LOA,LON -MOA,MON -NOA,NON -OOA,OON -POA,PON -QOA,QON -ROA,RON -SOA,SON -TOA,TON -UOA,UON -VOA,VON -WOA,WON -XOA,XON -YOA,YON -ZOA,ZON -APA,APN -BPA,BPN -CPA,CPN -DPA,DPN -EPA,EPN -FPA,FPN -GPA,GPN -HPA,HPN -IPA,IPN -JPA,JPN -KPA,KPN -LPA,LPN -MPA,MPN -NPA,NPN -OPA,OPN -PPA,PPN -QPA,QPN -RPA,RPN -SPA,SPN -TPA,TPN -UPA,UPN -VPA,VPN -WPA,WPN -XPA,XPN -YPA,YPN -ZPA,ZPN -AQA,AQN -BQA,BQN -CQA,CQN -DQA,DQN -EQA,EQN -FQA,FQN -GQA,GQN -HQA,HQN -IQA,IQN -JQA,JQN -KQA,KQN -LQA,LQN -MQA,MQN -NQA,NQN -OQA,OQN -PQA,PQN -QQA,QQN -RQA,RQN -SQA,SQN -TQA,TQN -UQA,UQN -VQA,VQN -WQA,WQN -XQA,XQN -YQA,YQN -ZQA,ZQN -ARA,ARN -BRA,BRN -CRA,CRN -DRA,DRN -ERA,ERN -FRA,FRN -GRA,GRN -HRA,HRN -IRA,IRN -JRA,JRN -KRA,KRN -LRA,LRN -MRA,MRN -NRA,NRN -ORA,ORN -PRA,PRN -QRA,QRN -RRA,RRN -SRA,SRN -TRA,TRN -URA,URN -VRA,VRN -WRA,WRN -XRA,XRN -YRA,YRN -ZRA,ZRN -ASA,ASN -BSA,BSN -CSA,CSN -DSA,DSN -ESA,ESN -FSA,FSN -GSA,GSN -HSA,HSN -ISA,ISN -JSA,JSN -KSA,KSN -LSA,LSN -MSA,MSN -NSA,NSN -OSA,OSN -PSA,PSN -QSA,QSN -RSA,RSN -SSA,SSN -TSA,TSN -USA,USN -VSA,VSN -WSA,WSN -XSA,XSN -YSA,YSN -ZSA,ZSN -ATA,ATN -BTA,BTN -CTA,CTN -DTA,DTN -ETA,ETN -FTA,FTN -GTA,GTN -HTA,HTN -ITA,ITN -JTA,JTN -KTA,KTN -LTA,LTN -MTA,MTN -NTA,NTN -OTA,OTN -PTA,PTN -QTA,QTN -RTA,RTN -STA,STN -TTA,TTN -UTA,UTN -VTA,VTN -WTA,WTN -XTA,XTN -YTA,YTN -ZTA,ZTN -AUA,AUN -BUA,BUN -CUA,CUN -DUA,DUN -EUA,EUN -FUA,FUN -GUA,GUN -HUA,HUN -IUA,IUN -JUA,JUN -KUA,KUN -LUA,LUN -MUA,MUN -NUA,NUN -OUA,OUN -PUA,PUN -QUA,QUN -RUA,RUN -SUA,SUN -TUA,TUN -UUA,UUN -VUA,VUN -WUA,WUN -XUA,XUN -YUA,YUN -ZUA,ZUN -AVA,AVN -BVA,BVN -CVA,CVN -DVA,DVN -EVA,EVN -FVA,FVN -GVA,GVN -HVA,HVN -IVA,IVN -JVA,JVN -KVA,KVN -LVA,LVN -MVA,MVN -NVA,NVN -OVA,OVN -PVA,PVN -QVA,QVN -RVA,RVN -SVA,SVN -TVA,TVN -UVA,UVN -VVA,VVN -WVA,WVN -XVA,XVN -YVA,YVN -ZVA,ZVN -AWA,AWN -BWA,BWN -CWA,CWN -DWA,DWN -EWA,EWN -FWA,FWN -GWA,GWN -HWA,HWN -IWA,IWN -JWA,JWN -KWA,KWN -LWA,LWN -MWA,MWN -NWA,NWN -OWA,OWN -PWA,PWN -QWA,QWN -RWA,RWN -SWA,SWN -TWA,TWN -UWA,UWN -VWA,VWN -WWA,WWN -XWA,XWN -YWA,YWN -ZWA,ZWN -AXA,AXN -BXA,BXN -CXA,CXN -DXA,DXN -EXA,EXN -FXA,FXN -GXA,GXN -HXA,HXN -IXA,IXN -JXA,JXN -KXA,KXN -LXA,LXN -MXA,MXN -NXA,NXN -OXA,OXN -PXA,PXN -QXA,QXN -RXA,RXN -SXA,SXN -TXA,TXN -UXA,UXN -VXA,VXN -WXA,WXN -XXA,XXN -YXA,YXN -ZXA,ZXN -AYA,AYN -BYA,BYN -CYA,CYN -DYA,DYN -EYA,EYN -FYA,FYN -GYA,GYN -HYA,HYN -IYA,IYN -JYA,JYN -KYA,KYN -LYA,LYN -MYA,MYN -NYA,NYN -OYA,OYN -PYA,PYN -QYA,QYN -RYA,RYN -SYA,SYN -TYA,TYN -UYA,UYN -VYA,VYN -WYA,WYN -XYA,XYN -YYA,YYN -ZYA,ZYN -AZA,AZN -BZA,BZN -CZA,CZN -DZA,DZN -EZA,EZN -FZA,FZN -GZA,GZN -HZA,HZN -IZA,IZN -JZA,JZN -KZA,KZN -LZA,LZN -MZA,MZN -NZA,NZN -OZA,OZN -PZA,PZN -QZA,QZN -RZA,RZN -SZA,SZN -TZA,TZN -UZA,UZN -VZA,VZN -WZA,WZN -XZA,XZN -YZA,YZN -ZZA,ZZN -AAB,AAO -BAB,BAO -CAB,CAO -DAB,DAO -EAB,EAO -FAB,FAO -GAB,GAO -HAB,HAO -IAB,IAO -JAB,JAO -KAB,KAO -LAB,LAO -MAB,MAO -NAB,NAO -OAB,OAO -PAB,PAO -QAB,QAO -RAB,RAO -SAB,SAO -TAB,TAO -UAB,UAO -VAB,VAO -WAB,WAO -XAB,XAO -YAB,YAO -ZAB,ZAO -ABB,ABO -BBB,BBO -CBB,CBO -DBB,DBO -EBB,EBO -FBB,FBO -GBB,GBO -HBB,HBO -IBB,IBO -JBB,JBO -KBB,KBO -LBB,LBO -MBB,MBO -NBB,NBO -OBB,OBO -PBB,PBO -QBB,QBO -RBB,RBO -SBB,SBO -TBB,TBO -UBB,UBO -VBB,VBO -WBB,WBO -XBB,XBO -YBB,YBO -ZBB,ZBO -ACB,ACO -BCB,BCO -CCB,CCO -DCB,DCO -ECB,ECO -FCB,FCO -GCB,GCO -HCB,HCO -ICB,ICO -JCB,JCO -KCB,KCO -LCB,LCO -MCB,MCO -NCB,NCO -OCB,OCO -PCB,PCO -QCB,QCO -RCB,RCO -SCB,SCO -TCB,TCO -UCB,UCO -VCB,VCO -WCB,WCO -XCB,XCO -YCB,YCO -ZCB,ZCO -ADB,ADO -BDB,BDO -CDB,CDO -DDB,DDO -EDB,EDO -FDB,FDO -GDB,GDO -HDB,HDO -IDB,IDO -JDB,JDO -KDB,KDO -LDB,LDO -MDB,MDO -NDB,NDO -ODB,ODO -PDB,PDO -QDB,QDO -RDB,RDO -SDB,SDO -TDB,TDO -UDB,UDO -VDB,VDO -WDB,WDO -XDB,XDO -YDB,YDO -ZDB,ZDO -AEB,AEO -BEB,BEO -CEB,CEO -DEB,DEO -EEB,EEO -FEB,FEO -GEB,GEO -HEB,HEO -IEB,IEO -JEB,JEO -KEB,KEO -LEB,LEO -MEB,MEO -NEB,NEO -OEB,OEO -PEB,PEO -QEB,QEO -REB,REO -SEB,SEO -TEB,TEO -UEB,UEO -VEB,VEO -WEB,WEO -XEB,XEO -YEB,YEO -ZEB,ZEO -AFB,AFO -BFB,BFO -CFB,CFO -DFB,DFO -EFB,EFO -FFB,FFO -GFB,GFO -HFB,HFO -IFB,IFO -JFB,JFO -KFB,KFO -LFB,LFO -MFB,MFO -NFB,NFO -OFB,OFO -PFB,PFO -QFB,QFO -RFB,RFO -SFB,SFO -TFB,TFO -UFB,UFO -VFB,VFO -WFB,WFO -XFB,XFO -YFB,YFO -ZFB,ZFO -AGB,AGO -BGB,BGO -CGB,CGO -DGB,DGO -EGB,EGO -FGB,FGO -GGB,GGO -HGB,HGO -IGB,IGO -JGB,JGO -KGB,KGO -LGB,LGO -MGB,MGO -NGB,NGO -OGB,OGO -PGB,PGO -QGB,QGO -RGB,RGO -SGB,SGO -TGB,TGO -UGB,UGO -VGB,VGO -WGB,WGO -XGB,XGO -YGB,YGO -ZGB,ZGO -AHB,AHO -BHB,BHO -CHB,CHO -DHB,DHO -EHB,EHO -FHB,FHO -GHB,GHO -HHB,HHO -IHB,IHO -JHB,JHO -KHB,KHO -LHB,LHO -MHB,MHO -NHB,NHO -OHB,OHO -PHB,PHO -QHB,QHO -RHB,RHO -SHB,SHO -THB,THO -UHB,UHO -VHB,VHO -WHB,WHO -XHB,XHO -YHB,YHO -ZHB,ZHO -AIB,AIO -BIB,BIO -CIB,CIO -DIB,DIO -EIB,EIO -FIB,FIO -GIB,GIO -HIB,HIO -IIB,IIO -JIB,JIO -KIB,KIO -LIB,LIO -MIB,MIO -NIB,NIO -OIB,OIO -PIB,PIO -QIB,QIO -RIB,RIO -SIB,SIO -TIB,TIO -UIB,UIO -VIB,VIO -WIB,WIO -XIB,XIO -YIB,YIO -ZIB,ZIO -AJB,AJO -BJB,BJO -CJB,CJO -DJB,DJO -EJB,EJO -FJB,FJO -GJB,GJO -HJB,HJO -IJB,IJO -JJB,JJO -KJB,KJO -LJB,LJO -MJB,MJO -NJB,NJO -OJB,OJO -PJB,PJO -QJB,QJO -RJB,RJO -SJB,SJO -TJB,TJO -UJB,UJO -VJB,VJO -WJB,WJO -XJB,XJO -YJB,YJO -ZJB,ZJO -AKB,AKO -BKB,BKO -CKB,CKO -DKB,DKO -EKB,EKO -FKB,FKO -GKB,GKO -HKB,HKO -IKB,IKO -JKB,JKO -KKB,KKO -LKB,LKO -MKB,MKO -NKB,NKO -OKB,OKO -PKB,PKO -QKB,QKO -RKB,RKO -SKB,SKO -TKB,TKO -UKB,UKO -VKB,VKO -WKB,WKO -XKB,XKO -YKB,YKO -ZKB,ZKO -ALB,ALO -BLB,BLO -CLB,CLO -DLB,DLO -ELB,ELO -FLB,FLO -GLB,GLO -HLB,HLO -ILB,ILO -JLB,JLO -KLB,KLO -LLB,LLO -MLB,MLO -NLB,NLO -OLB,OLO -PLB,PLO -QLB,QLO -RLB,RLO -SLB,SLO -TLB,TLO -ULB,ULO -VLB,VLO -WLB,WLO -XLB,XLO -YLB,YLO -ZLB,ZLO -AMB,AMO -BMB,BMO -CMB,CMO -DMB,DMO -EMB,EMO -FMB,FMO -GMB,GMO -HMB,HMO -IMB,IMO -JMB,JMO -KMB,KMO -LMB,LMO -MMB,MMO -NMB,NMO -OMB,OMO -PMB,PMO -QMB,QMO -RMB,RMO -SMB,SMO -TMB,TMO -UMB,UMO -VMB,VMO -WMB,WMO -XMB,XMO -YMB,YMO -ZMB,ZMO -ANB,ANO -BNB,BNO -CNB,CNO -DNB,DNO -ENB,ENO -FNB,FNO -GNB,GNO -HNB,HNO -INB,INO -JNB,JNO -KNB,KNO -LNB,LNO -MNB,MNO -NNB,NNO -ONB,ONO -PNB,PNO -QNB,QNO -RNB,RNO -SNB,SNO -TNB,TNO -UNB,UNO -VNB,VNO -WNB,WNO -XNB,XNO -YNB,YNO -ZNB,ZNO -AOB,AOO -BOB,BOO -COB,COO -DOB,DOO -EOB,EOO -FOB,FOO -GOB,GOO -HOB,HOO -IOB,IOO -JOB,JOO -KOB,KOO -LOB,LOO -MOB,MOO -NOB,NOO -OOB,OOO -POB,POO -QOB,QOO -ROB,ROO -SOB,SOO -TOB,TOO -UOB,UOO -VOB,VOO -WOB,WOO -XOB,XOO -YOB,YOO -ZOB,ZOO -APB,APO -BPB,BPO -CPB,CPO -DPB,DPO -EPB,EPO -FPB,FPO -GPB,GPO -HPB,HPO -IPB,IPO -JPB,JPO -KPB,KPO -LPB,LPO -MPB,MPO -NPB,NPO -OPB,OPO -PPB,PPO -QPB,QPO -RPB,RPO -SPB,SPO -TPB,TPO -UPB,UPO -VPB,VPO -WPB,WPO -XPB,XPO -YPB,YPO -ZPB,ZPO -AQB,AQO -BQB,BQO -CQB,CQO -DQB,DQO -EQB,EQO -FQB,FQO -GQB,GQO -HQB,HQO -IQB,IQO -JQB,JQO -KQB,KQO -LQB,LQO -MQB,MQO -NQB,NQO -OQB,OQO -PQB,PQO -QQB,QQO -RQB,RQO -SQB,SQO -TQB,TQO -UQB,UQO -VQB,VQO -WQB,WQO -XQB,XQO -YQB,YQO -ZQB,ZQO -ARB,ARO -BRB,BRO -CRB,CRO -DRB,DRO -ERB,ERO -FRB,FRO -GRB,GRO -HRB,HRO -IRB,IRO -JRB,JRO -KRB,KRO -LRB,LRO -MRB,MRO -NRB,NRO -ORB,ORO -PRB,PRO -QRB,QRO -RRB,RRO -SRB,SRO -TRB,TRO -URB,URO -VRB,VRO -WRB,WRO -XRB,XRO -YRB,YRO -ZRB,ZRO -ASB,ASO -BSB,BSO -CSB,CSO -DSB,DSO -ESB,ESO -FSB,FSO -GSB,GSO -HSB,HSO -ISB,ISO -JSB,JSO -KSB,KSO -LSB,LSO -MSB,MSO -NSB,NSO -OSB,OSO -PSB,PSO -QSB,QSO -RSB,RSO -SSB,SSO -TSB,TSO -USB,USO -VSB,VSO -WSB,WSO -XSB,XSO -YSB,YSO -ZSB,ZSO -ATB,ATO -BTB,BTO -CTB,CTO -DTB,DTO -ETB,ETO -FTB,FTO -GTB,GTO -HTB,HTO -ITB,ITO -JTB,JTO -KTB,KTO -LTB,LTO -MTB,MTO -NTB,NTO -OTB,OTO -PTB,PTO -QTB,QTO -RTB,RTO -STB,STO -TTB,TTO -UTB,UTO -VTB,VTO -WTB,WTO -XTB,XTO -YTB,YTO -ZTB,ZTO -AUB,AUO -BUB,BUO -CUB,CUO -DUB,DUO -EUB,EUO -FUB,FUO -GUB,GUO -HUB,HUO -IUB,IUO -JUB,JUO -KUB,KUO -LUB,LUO -MUB,MUO -NUB,NUO -OUB,OUO -PUB,PUO -QUB,QUO -RUB,RUO -SUB,SUO -TUB,TUO -UUB,UUO -VUB,VUO -WUB,WUO -XUB,XUO -YUB,YUO -ZUB,ZUO -AVB,AVO -BVB,BVO -CVB,CVO -DVB,DVO -EVB,EVO -FVB,FVO -GVB,GVO -HVB,HVO -IVB,IVO -JVB,JVO -KVB,KVO -LVB,LVO -MVB,MVO -NVB,NVO -OVB,OVO -PVB,PVO -QVB,QVO -RVB,RVO -SVB,SVO -TVB,TVO -UVB,UVO -VVB,VVO -WVB,WVO -XVB,XVO -YVB,YVO -ZVB,ZVO -AWB,AWO -BWB,BWO -CWB,CWO -DWB,DWO -EWB,EWO -FWB,FWO -GWB,GWO -HWB,HWO -IWB,IWO -JWB,JWO -KWB,KWO -LWB,LWO -MWB,MWO -NWB,NWO -OWB,OWO -PWB,PWO -QWB,QWO -RWB,RWO -SWB,SWO -TWB,TWO -UWB,UWO -VWB,VWO -WWB,WWO -XWB,XWO -YWB,YWO -ZWB,ZWO -AXB,AXO -BXB,BXO -CXB,CXO -DXB,DXO -EXB,EXO -FXB,FXO -GXB,GXO -HXB,HXO -IXB,IXO -JXB,JXO -KXB,KXO -LXB,LXO -MXB,MXO -NXB,NXO -OXB,OXO -PXB,PXO -QXB,QXO -RXB,RXO -SXB,SXO -TXB,TXO -UXB,UXO -VXB,VXO -WXB,WXO -XXB,XXO -YXB,YXO -ZXB,ZXO -AYB,AYO -BYB,BYO -CYB,CYO -DYB,DYO -EYB,EYO -FYB,FYO -GYB,GYO -HYB,HYO -IYB,IYO -JYB,JYO -KYB,KYO -LYB,LYO -MYB,MYO -NYB,NYO -OYB,OYO -PYB,PYO -QYB,QYO -RYB,RYO -SYB,SYO -TYB,TYO -UYB,UYO -VYB,VYO -WYB,WYO -XYB,XYO -YYB,YYO -ZYB,ZYO -AZB,AZO -BZB,BZO -CZB,CZO -DZB,DZO -EZB,EZO -FZB,FZO -GZB,GZO -HZB,HZO -IZB,IZO -JZB,JZO -KZB,KZO -LZB,LZO -MZB,MZO -NZB,NZO -OZB,OZO -PZB,PZO -QZB,QZO -RZB,RZO -SZB,SZO -TZB,TZO -UZB,UZO -VZB,VZO -WZB,WZO -XZB,XZO -YZB,YZO -ZZB,ZZO -AAC,AAP -BAC,BAP -CAC,CAP -DAC,DAP -EAC,EAP -FAC,FAP -GAC,GAP -HAC,HAP -IAC,IAP -JAC,JAP -KAC,KAP -LAC,LAP -MAC,MAP -NAC,NAP -OAC,OAP -PAC,PAP -QAC,QAP -RAC,RAP -SAC,SAP -TAC,TAP -UAC,UAP -VAC,VAP -WAC,WAP -XAC,XAP -YAC,YAP -ZAC,ZAP -ABC,ABP -BBC,BBP -CBC,CBP -DBC,DBP -EBC,EBP -FBC,FBP -GBC,GBP -HBC,HBP -IBC,IBP -JBC,JBP -KBC,KBP -LBC,LBP -MBC,MBP -NBC,NBP -OBC,OBP -PBC,PBP -QBC,QBP -RBC,RBP -SBC,SBP -TBC,TBP -UBC,UBP -VBC,VBP -WBC,WBP -XBC,XBP -YBC,YBP -ZBC,ZBP -ACC,ACP -BCC,BCP -CCC,CCP -DCC,DCP -ECC,ECP -FCC,FCP -GCC,GCP -HCC,HCP -ICC,ICP -JCC,JCP -KCC,KCP -LCC,LCP -MCC,MCP -NCC,NCP -OCC,OCP -PCC,PCP -QCC,QCP -RCC,RCP -SCC,SCP -TCC,TCP -UCC,UCP -VCC,VCP -WCC,WCP -XCC,XCP -YCC,YCP -ZCC,ZCP -ADC,ADP -BDC,BDP -CDC,CDP -DDC,DDP -EDC,EDP -FDC,FDP -GDC,GDP -HDC,HDP -IDC,IDP -JDC,JDP -KDC,KDP -LDC,LDP -MDC,MDP -NDC,NDP -ODC,ODP -PDC,PDP -QDC,QDP -RDC,RDP -SDC,SDP -TDC,TDP -UDC,UDP -VDC,VDP -WDC,WDP -XDC,XDP -YDC,YDP -ZDC,ZDP -AEC,AEP -BEC,BEP -CEC,CEP -DEC,DEP -EEC,EEP -FEC,FEP -GEC,GEP -HEC,HEP -IEC,IEP -JEC,JEP -KEC,KEP -LEC,LEP -MEC,MEP -NEC,NEP -OEC,OEP -PEC,PEP -QEC,QEP -REC,REP -SEC,SEP -TEC,TEP -UEC,UEP -VEC,VEP -WEC,WEP -XEC,XEP -YEC,YEP -ZEC,ZEP -AFC,AFP -BFC,BFP -CFC,CFP -DFC,DFP -EFC,EFP -FFC,FFP -GFC,GFP -HFC,HFP -IFC,IFP -JFC,JFP -KFC,KFP -LFC,LFP -MFC,MFP -NFC,NFP -OFC,OFP -PFC,PFP -QFC,QFP -RFC,RFP -SFC,SFP -TFC,TFP -UFC,UFP -VFC,VFP -WFC,WFP -XFC,XFP -YFC,YFP -ZFC,ZFP -AGC,AGP -BGC,BGP -CGC,CGP -DGC,DGP -EGC,EGP -FGC,FGP -GGC,GGP -HGC,HGP -IGC,IGP -JGC,JGP -KGC,KGP -LGC,LGP -MGC,MGP -NGC,NGP -OGC,OGP -PGC,PGP -QGC,QGP -RGC,RGP -SGC,SGP -TGC,TGP -UGC,UGP -VGC,VGP -WGC,WGP -XGC,XGP -YGC,YGP -ZGC,ZGP -AHC,AHP -BHC,BHP -CHC,CHP -DHC,DHP -EHC,EHP -FHC,FHP -GHC,GHP -HHC,HHP -IHC,IHP -JHC,JHP -KHC,KHP -LHC,LHP -MHC,MHP -NHC,NHP -OHC,OHP -PHC,PHP -QHC,QHP -RHC,RHP -SHC,SHP -THC,THP -UHC,UHP -VHC,VHP -WHC,WHP -XHC,XHP -YHC,YHP -ZHC,ZHP -AIC,AIP -BIC,BIP -CIC,CIP -DIC,DIP -EIC,EIP -FIC,FIP -GIC,GIP -HIC,HIP -IIC,IIP -JIC,JIP -KIC,KIP -LIC,LIP -MIC,MIP -NIC,NIP -OIC,OIP -PIC,PIP -QIC,QIP -RIC,RIP -SIC,SIP -TIC,TIP -UIC,UIP -VIC,VIP -WIC,WIP -XIC,XIP -YIC,YIP -ZIC,ZIP -AJC,AJP -BJC,BJP -CJC,CJP -DJC,DJP -EJC,EJP -FJC,FJP -GJC,GJP -HJC,HJP -IJC,IJP -JJC,JJP -KJC,KJP -LJC,LJP -MJC,MJP -NJC,NJP -OJC,OJP -PJC,PJP -QJC,QJP -RJC,RJP -SJC,SJP -TJC,TJP -UJC,UJP -VJC,VJP -WJC,WJP -XJC,XJP -YJC,YJP -ZJC,ZJP -AKC,AKP -BKC,BKP -CKC,CKP -DKC,DKP -EKC,EKP -FKC,FKP -GKC,GKP -HKC,HKP -IKC,IKP -JKC,JKP -KKC,KKP -LKC,LKP -MKC,MKP -NKC,NKP -OKC,OKP -PKC,PKP -QKC,QKP -RKC,RKP -SKC,SKP -TKC,TKP -UKC,UKP -VKC,VKP -WKC,WKP -XKC,XKP -YKC,YKP -ZKC,ZKP -ALC,ALP -BLC,BLP -CLC,CLP -DLC,DLP -ELC,ELP -FLC,FLP -GLC,GLP -HLC,HLP -ILC,ILP -JLC,JLP -KLC,KLP -LLC,LLP -MLC,MLP -NLC,NLP -OLC,OLP -PLC,PLP -QLC,QLP -RLC,RLP -SLC,SLP -TLC,TLP -ULC,ULP -VLC,VLP -WLC,WLP -XLC,XLP -YLC,YLP -ZLC,ZLP -AMC,AMP -BMC,BMP -CMC,CMP -DMC,DMP -EMC,EMP -FMC,FMP -GMC,GMP -HMC,HMP -IMC,IMP -JMC,JMP -KMC,KMP -LMC,LMP -MMC,MMP -NMC,NMP -OMC,OMP -PMC,PMP -QMC,QMP -RMC,RMP -SMC,SMP -TMC,TMP -UMC,UMP -VMC,VMP -WMC,WMP -XMC,XMP -YMC,YMP -ZMC,ZMP -ANC,ANP -BNC,BNP -CNC,CNP -DNC,DNP -ENC,ENP -FNC,FNP -GNC,GNP -HNC,HNP -INC,INP -JNC,JNP -KNC,KNP -LNC,LNP -MNC,MNP -NNC,NNP -ONC,ONP -PNC,PNP -QNC,QNP -RNC,RNP -SNC,SNP -TNC,TNP -UNC,UNP -VNC,VNP -WNC,WNP -XNC,XNP -YNC,YNP -ZNC,ZNP -AOC,AOP -BOC,BOP -COC,COP -DOC,DOP -EOC,EOP -FOC,FOP -GOC,GOP -HOC,HOP -IOC,IOP -JOC,JOP -KOC,KOP -LOC,LOP -MOC,MOP -NOC,NOP -OOC,OOP -POC,POP -QOC,QOP -ROC,ROP -SOC,SOP -TOC,TOP -UOC,UOP -VOC,VOP -WOC,WOP -XOC,XOP -YOC,YOP -ZOC,ZOP -APC,APP -BPC,BPP -CPC,CPP -DPC,DPP -EPC,EPP -FPC,FPP -GPC,GPP -HPC,HPP -IPC,IPP -JPC,JPP -KPC,KPP -LPC,LPP -MPC,MPP -NPC,NPP -OPC,OPP -PPC,PPP -QPC,QPP -RPC,RPP -SPC,SPP -TPC,TPP -UPC,UPP -VPC,VPP -WPC,WPP -XPC,XPP -YPC,YPP -ZPC,ZPP -AQC,AQP -BQC,BQP -CQC,CQP -DQC,DQP -EQC,EQP -FQC,FQP -GQC,GQP -HQC,HQP -IQC,IQP -JQC,JQP -KQC,KQP -LQC,LQP -MQC,MQP -NQC,NQP -OQC,OQP -PQC,PQP -QQC,QQP -RQC,RQP -SQC,SQP -TQC,TQP -UQC,UQP -VQC,VQP -WQC,WQP -XQC,XQP -YQC,YQP -ZQC,ZQP -ARC,ARP -BRC,BRP -CRC,CRP -DRC,DRP -ERC,ERP -FRC,FRP -GRC,GRP -HRC,HRP -IRC,IRP -JRC,JRP -KRC,KRP -LRC,LRP -MRC,MRP -NRC,NRP -ORC,ORP -PRC,PRP -QRC,QRP -RRC,RRP -SRC,SRP -TRC,TRP -URC,URP -VRC,VRP -WRC,WRP -XRC,XRP -YRC,YRP -ZRC,ZRP -ASC,ASP -BSC,BSP -CSC,CSP -DSC,DSP -ESC,ESP -FSC,FSP -GSC,GSP -HSC,HSP -ISC,ISP -JSC,JSP -KSC,KSP -LSC,LSP -MSC,MSP -NSC,NSP -OSC,OSP -PSC,PSP -QSC,QSP -RSC,RSP -SSC,SSP -TSC,TSP -USC,USP -VSC,VSP -WSC,WSP -XSC,XSP -YSC,YSP -ZSC,ZSP -ATC,ATP -BTC,BTP -CTC,CTP -DTC,DTP -ETC,ETP -FTC,FTP -GTC,GTP -HTC,HTP -ITC,ITP -JTC,JTP -KTC,KTP -LTC,LTP -MTC,MTP -NTC,NTP -OTC,OTP -PTC,PTP -QTC,QTP -RTC,RTP -STC,STP -TTC,TTP -UTC,UTP -VTC,VTP -WTC,WTP -XTC,XTP -YTC,YTP -ZTC,ZTP -AUC,AUP -BUC,BUP -CUC,CUP -DUC,DUP -EUC,EUP -FUC,FUP -GUC,GUP -HUC,HUP -IUC,IUP -JUC,JUP -KUC,KUP -LUC,LUP -MUC,MUP -NUC,NUP -OUC,OUP -PUC,PUP -QUC,QUP -RUC,RUP -SUC,SUP -TUC,TUP -UUC,UUP -VUC,VUP -WUC,WUP -XUC,XUP -YUC,YUP -ZUC,ZUP -AVC,AVP -BVC,BVP -CVC,CVP -DVC,DVP -EVC,EVP -FVC,FVP -GVC,GVP -HVC,HVP -IVC,IVP -JVC,JVP -KVC,KVP -LVC,LVP -MVC,MVP -NVC,NVP -OVC,OVP -PVC,PVP -QVC,QVP -RVC,RVP -SVC,SVP -TVC,TVP -UVC,UVP -VVC,VVP -WVC,WVP -XVC,XVP -YVC,YVP -ZVC,ZVP -AWC,AWP -BWC,BWP -CWC,CWP -DWC,DWP -EWC,EWP -FWC,FWP -GWC,GWP -HWC,HWP -IWC,IWP -JWC,JWP -KWC,KWP -LWC,LWP -MWC,MWP -NWC,NWP -OWC,OWP -PWC,PWP -QWC,QWP -RWC,RWP -SWC,SWP -TWC,TWP -UWC,UWP -VWC,VWP -WWC,WWP -XWC,XWP -YWC,YWP -ZWC,ZWP -AXC,AXP -BXC,BXP -CXC,CXP -DXC,DXP -EXC,EXP -FXC,FXP -GXC,GXP -HXC,HXP -IXC,IXP -JXC,JXP -KXC,KXP -LXC,LXP -MXC,MXP -NXC,NXP -OXC,OXP -PXC,PXP -QXC,QXP -RXC,RXP -SXC,SXP -TXC,TXP -UXC,UXP -VXC,VXP -WXC,WXP -XXC,XXP -YXC,YXP -ZXC,ZXP -AYC,AYP -BYC,BYP -CYC,CYP -DYC,DYP -EYC,EYP -FYC,FYP -GYC,GYP -HYC,HYP -IYC,IYP -JYC,JYP -KYC,KYP -LYC,LYP -MYC,MYP -NYC,NYP -OYC,OYP -PYC,PYP -QYC,QYP -RYC,RYP -SYC,SYP -TYC,TYP -UYC,UYP -VYC,VYP -WYC,WYP -XYC,XYP -YYC,YYP -ZYC,ZYP -AZC,AZP -BZC,BZP -CZC,CZP -DZC,DZP -EZC,EZP -FZC,FZP -GZC,GZP -HZC,HZP -IZC,IZP -JZC,JZP -KZC,KZP -LZC,LZP -MZC,MZP -NZC,NZP -OZC,OZP -PZC,PZP -QZC,QZP -RZC,RZP -SZC,SZP -TZC,TZP -UZC,UZP -VZC,VZP -WZC,WZP -XZC,XZP -YZC,YZP -ZZC,ZZP -AAD,AAQ -BAD,BAQ -CAD,CAQ -DAD,DAQ -EAD,EAQ -FAD,FAQ -GAD,GAQ -HAD,HAQ -IAD,IAQ -JAD,JAQ -KAD,KAQ -LAD,LAQ -MAD,MAQ -NAD,NAQ -OAD,OAQ -PAD,PAQ -QAD,QAQ -RAD,RAQ -SAD,SAQ -TAD,TAQ -UAD,UAQ -VAD,VAQ -WAD,WAQ -XAD,XAQ -YAD,YAQ -ZAD,ZAQ -ABD,ABQ -BBD,BBQ -CBD,CBQ -DBD,DBQ -EBD,EBQ -FBD,FBQ -GBD,GBQ -HBD,HBQ -IBD,IBQ -JBD,JBQ -KBD,KBQ -LBD,LBQ -MBD,MBQ -NBD,NBQ -OBD,OBQ -PBD,PBQ -QBD,QBQ -RBD,RBQ -SBD,SBQ -TBD,TBQ -UBD,UBQ -VBD,VBQ -WBD,WBQ -XBD,XBQ -YBD,YBQ -ZBD,ZBQ -ACD,ACQ -BCD,BCQ -CCD,CCQ -DCD,DCQ -ECD,ECQ -FCD,FCQ -GCD,GCQ -HCD,HCQ -ICD,ICQ -JCD,JCQ -KCD,KCQ -LCD,LCQ -MCD,MCQ -NCD,NCQ -OCD,OCQ -PCD,PCQ -QCD,QCQ -RCD,RCQ -SCD,SCQ -TCD,TCQ -UCD,UCQ -VCD,VCQ -WCD,WCQ -XCD,XCQ -YCD,YCQ -ZCD,ZCQ -ADD,ADQ -BDD,BDQ -CDD,CDQ -DDD,DDQ -EDD,EDQ -FDD,FDQ -GDD,GDQ -HDD,HDQ -IDD,IDQ -JDD,JDQ -KDD,KDQ -LDD,LDQ -MDD,MDQ -NDD,NDQ -ODD,ODQ -PDD,PDQ -QDD,QDQ -RDD,RDQ -SDD,SDQ -TDD,TDQ -UDD,UDQ -VDD,VDQ -WDD,WDQ -XDD,XDQ -YDD,YDQ -ZDD,ZDQ -AED,AEQ -BED,BEQ -CED,CEQ -DED,DEQ -EED,EEQ -FED,FEQ -GED,GEQ -HED,HEQ -IED,IEQ -JED,JEQ -KED,KEQ -LED,LEQ -MED,MEQ -NED,NEQ -OED,OEQ -PED,PEQ -QED,QEQ -RED,REQ -SED,SEQ -TED,TEQ -UED,UEQ -VED,VEQ -WED,WEQ -XED,XEQ -YED,YEQ -ZED,ZEQ -AFD,AFQ -BFD,BFQ -CFD,CFQ -DFD,DFQ -EFD,EFQ -FFD,FFQ -GFD,GFQ -HFD,HFQ -IFD,IFQ -JFD,JFQ -KFD,KFQ -LFD,LFQ -MFD,MFQ -NFD,NFQ -OFD,OFQ -PFD,PFQ -QFD,QFQ -RFD,RFQ -SFD,SFQ -TFD,TFQ -UFD,UFQ -VFD,VFQ -WFD,WFQ -XFD,XFQ -YFD,YFQ -ZFD,ZFQ -AGD,AGQ -BGD,BGQ -CGD,CGQ -DGD,DGQ -EGD,EGQ -FGD,FGQ -GGD,GGQ -HGD,HGQ -IGD,IGQ -JGD,JGQ -KGD,KGQ -LGD,LGQ -MGD,MGQ -NGD,NGQ -OGD,OGQ -PGD,PGQ -QGD,QGQ -RGD,RGQ -SGD,SGQ -TGD,TGQ -UGD,UGQ -VGD,VGQ -WGD,WGQ -XGD,XGQ -YGD,YGQ -ZGD,ZGQ -AHD,AHQ -BHD,BHQ -CHD,CHQ -DHD,DHQ -EHD,EHQ -FHD,FHQ -GHD,GHQ -HHD,HHQ -IHD,IHQ -JHD,JHQ -KHD,KHQ -LHD,LHQ -MHD,MHQ -NHD,NHQ -OHD,OHQ -PHD,PHQ -QHD,QHQ -RHD,RHQ -SHD,SHQ -THD,THQ -UHD,UHQ -VHD,VHQ -WHD,WHQ -XHD,XHQ -YHD,YHQ -ZHD,ZHQ -AID,AIQ -BID,BIQ -CID,CIQ -DID,DIQ -EID,EIQ -FID,FIQ -GID,GIQ -HID,HIQ -IID,IIQ -JID,JIQ -KID,KIQ -LID,LIQ -MID,MIQ -NID,NIQ -OID,OIQ -PID,PIQ -QID,QIQ -RID,RIQ -SID,SIQ -TID,TIQ -UID,UIQ -VID,VIQ -WID,WIQ -XID,XIQ -YID,YIQ -ZID,ZIQ -AJD,AJQ -BJD,BJQ -CJD,CJQ -DJD,DJQ -EJD,EJQ -FJD,FJQ -GJD,GJQ -HJD,HJQ -IJD,IJQ -JJD,JJQ -KJD,KJQ -LJD,LJQ -MJD,MJQ -NJD,NJQ -OJD,OJQ -PJD,PJQ -QJD,QJQ -RJD,RJQ -SJD,SJQ -TJD,TJQ -UJD,UJQ -VJD,VJQ -WJD,WJQ -XJD,XJQ -YJD,YJQ -ZJD,ZJQ -AKD,AKQ -BKD,BKQ -CKD,CKQ -DKD,DKQ -EKD,EKQ -FKD,FKQ -GKD,GKQ -HKD,HKQ -IKD,IKQ -JKD,JKQ -KKD,KKQ -LKD,LKQ -MKD,MKQ -NKD,NKQ -OKD,OKQ -PKD,PKQ -QKD,QKQ -RKD,RKQ -SKD,SKQ -TKD,TKQ -UKD,UKQ -VKD,VKQ -WKD,WKQ -XKD,XKQ -YKD,YKQ -ZKD,ZKQ -ALD,ALQ -BLD,BLQ -CLD,CLQ -DLD,DLQ -ELD,ELQ -FLD,FLQ -GLD,GLQ -HLD,HLQ -ILD,ILQ -JLD,JLQ -KLD,KLQ -LLD,LLQ -MLD,MLQ -NLD,NLQ -OLD,OLQ -PLD,PLQ -QLD,QLQ -RLD,RLQ -SLD,SLQ -TLD,TLQ -ULD,ULQ -VLD,VLQ -WLD,WLQ -XLD,XLQ -YLD,YLQ -ZLD,ZLQ -AMD,AMQ -BMD,BMQ -CMD,CMQ -DMD,DMQ -EMD,EMQ -FMD,FMQ -GMD,GMQ -HMD,HMQ -IMD,IMQ -JMD,JMQ -KMD,KMQ -LMD,LMQ -MMD,MMQ -NMD,NMQ -OMD,OMQ -PMD,PMQ -QMD,QMQ -RMD,RMQ -SMD,SMQ -TMD,TMQ -UMD,UMQ -VMD,VMQ -WMD,WMQ -XMD,XMQ -YMD,YMQ -ZMD,ZMQ -AND,ANQ -BND,BNQ -CND,CNQ -DND,DNQ -END,ENQ -FND,FNQ -GND,GNQ -HND,HNQ -IND,INQ -JND,JNQ -KND,KNQ -LND,LNQ -MND,MNQ -NND,NNQ -OND,ONQ -PND,PNQ -QND,QNQ -RND,RNQ -SND,SNQ -TND,TNQ -UND,UNQ -VND,VNQ -WND,WNQ -XND,XNQ -YND,YNQ -ZND,ZNQ -AOD,AOQ -BOD,BOQ -COD,COQ -DOD,DOQ -EOD,EOQ -FOD,FOQ -GOD,GOQ -HOD,HOQ -IOD,IOQ -JOD,JOQ -KOD,KOQ -LOD,LOQ -MOD,MOQ -NOD,NOQ -OOD,OOQ -POD,POQ -QOD,QOQ -ROD,ROQ -SOD,SOQ -TOD,TOQ -UOD,UOQ -VOD,VOQ -WOD,WOQ -XOD,XOQ -YOD,YOQ -ZOD,ZOQ -APD,APQ -BPD,BPQ -CPD,CPQ -DPD,DPQ -EPD,EPQ -FPD,FPQ -GPD,GPQ -HPD,HPQ -IPD,IPQ -JPD,JPQ -KPD,KPQ -LPD,LPQ -MPD,MPQ -NPD,NPQ -OPD,OPQ -PPD,PPQ -QPD,QPQ -RPD,RPQ -SPD,SPQ -TPD,TPQ -UPD,UPQ -VPD,VPQ -WPD,WPQ -XPD,XPQ -YPD,YPQ -ZPD,ZPQ -AQD,AQQ -BQD,BQQ -CQD,CQQ -DQD,DQQ -EQD,EQQ -FQD,FQQ -GQD,GQQ -HQD,HQQ -IQD,IQQ -JQD,JQQ -KQD,KQQ -LQD,LQQ -MQD,MQQ -NQD,NQQ -OQD,OQQ -PQD,PQQ -QQD,QQQ -RQD,RQQ -SQD,SQQ -TQD,TQQ -UQD,UQQ -VQD,VQQ -WQD,WQQ -XQD,XQQ -YQD,YQQ -ZQD,ZQQ -ARD,ARQ -BRD,BRQ -CRD,CRQ -DRD,DRQ -ERD,ERQ -FRD,FRQ -GRD,GRQ -HRD,HRQ -IRD,IRQ -JRD,JRQ -KRD,KRQ -LRD,LRQ -MRD,MRQ -NRD,NRQ -ORD,ORQ -PRD,PRQ -QRD,QRQ -RRD,RRQ -SRD,SRQ -TRD,TRQ -URD,URQ -VRD,VRQ -WRD,WRQ -XRD,XRQ -YRD,YRQ -ZRD,ZRQ -ASD,ASQ -BSD,BSQ -CSD,CSQ -DSD,DSQ -ESD,ESQ -FSD,FSQ -GSD,GSQ -HSD,HSQ -ISD,ISQ -JSD,JSQ -KSD,KSQ -LSD,LSQ -MSD,MSQ -NSD,NSQ -OSD,OSQ -PSD,PSQ -QSD,QSQ -RSD,RSQ -SSD,SSQ -TSD,TSQ -USD,USQ -VSD,VSQ -WSD,WSQ -XSD,XSQ -YSD,YSQ -ZSD,ZSQ -ATD,ATQ -BTD,BTQ -CTD,CTQ -DTD,DTQ -ETD,ETQ -FTD,FTQ -GTD,GTQ -HTD,HTQ -ITD,ITQ -JTD,JTQ -KTD,KTQ -LTD,LTQ -MTD,MTQ -NTD,NTQ -OTD,OTQ -PTD,PTQ -QTD,QTQ -RTD,RTQ -STD,STQ -TTD,TTQ -UTD,UTQ -VTD,VTQ -WTD,WTQ -XTD,XTQ -YTD,YTQ -ZTD,ZTQ -AUD,AUQ -BUD,BUQ -CUD,CUQ -DUD,DUQ -EUD,EUQ -FUD,FUQ -GUD,GUQ -HUD,HUQ -IUD,IUQ -JUD,JUQ -KUD,KUQ -LUD,LUQ -MUD,MUQ -NUD,NUQ -OUD,OUQ -PUD,PUQ -QUD,QUQ -RUD,RUQ -SUD,SUQ -TUD,TUQ -UUD,UUQ -VUD,VUQ -WUD,WUQ -XUD,XUQ -YUD,YUQ -ZUD,ZUQ -AVD,AVQ -BVD,BVQ -CVD,CVQ -DVD,DVQ -EVD,EVQ -FVD,FVQ -GVD,GVQ -HVD,HVQ -IVD,IVQ -JVD,JVQ -KVD,KVQ -LVD,LVQ -MVD,MVQ -NVD,NVQ -OVD,OVQ -PVD,PVQ -QVD,QVQ -RVD,RVQ -SVD,SVQ -TVD,TVQ -UVD,UVQ -VVD,VVQ -WVD,WVQ -XVD,XVQ -YVD,YVQ -ZVD,ZVQ -AWD,AWQ -BWD,BWQ -CWD,CWQ -DWD,DWQ -EWD,EWQ -FWD,FWQ -GWD,GWQ -HWD,HWQ -IWD,IWQ -JWD,JWQ -KWD,KWQ -LWD,LWQ -MWD,MWQ -NWD,NWQ -OWD,OWQ -PWD,PWQ -QWD,QWQ -RWD,RWQ -SWD,SWQ -TWD,TWQ -UWD,UWQ -VWD,VWQ -WWD,WWQ -XWD,XWQ -YWD,YWQ -ZWD,ZWQ -AXD,AXQ -BXD,BXQ -CXD,CXQ -DXD,DXQ -EXD,EXQ -FXD,FXQ -GXD,GXQ -HXD,HXQ -IXD,IXQ -JXD,JXQ -KXD,KXQ -LXD,LXQ -MXD,MXQ -NXD,NXQ -OXD,OXQ -PXD,PXQ -QXD,QXQ -RXD,RXQ -SXD,SXQ -TXD,TXQ -UXD,UXQ -VXD,VXQ -WXD,WXQ -XXD,XXQ -YXD,YXQ -ZXD,ZXQ -AYD,AYQ -BYD,BYQ -CYD,CYQ -DYD,DYQ -EYD,EYQ -FYD,FYQ -GYD,GYQ -HYD,HYQ -IYD,IYQ -JYD,JYQ -KYD,KYQ -LYD,LYQ -MYD,MYQ -NYD,NYQ -OYD,OYQ -PYD,PYQ -QYD,QYQ -RYD,RYQ -SYD,SYQ -TYD,TYQ -UYD,UYQ -VYD,VYQ -WYD,WYQ -XYD,XYQ -YYD,YYQ -ZYD,ZYQ -AZD,AZQ -BZD,BZQ -CZD,CZQ -DZD,DZQ -EZD,EZQ -FZD,FZQ -GZD,GZQ -HZD,HZQ -IZD,IZQ -JZD,JZQ -KZD,KZQ -LZD,LZQ -MZD,MZQ -NZD,NZQ -OZD,OZQ -PZD,PZQ -QZD,QZQ -RZD,RZQ -SZD,SZQ -TZD,TZQ -UZD,UZQ -VZD,VZQ -WZD,WZQ -XZD,XZQ -YZD,YZQ -ZZD,ZZQ -AAE,AAR -BAE,BAR -CAE,CAR -DAE,DAR -EAE,EAR -FAE,FAR -GAE,GAR -HAE,HAR -IAE,IAR -JAE,JAR -KAE,KAR -LAE,LAR -MAE,MAR -NAE,NAR -OAE,OAR -PAE,PAR -QAE,QAR -RAE,RAR -SAE,SAR -TAE,TAR -UAE,UAR -VAE,VAR -WAE,WAR -XAE,XAR -YAE,YAR -ZAE,ZAR -ABE,ABR -BBE,BBR -CBE,CBR -DBE,DBR -EBE,EBR -FBE,FBR -GBE,GBR -HBE,HBR -IBE,IBR -JBE,JBR -KBE,KBR -LBE,LBR -MBE,MBR -NBE,NBR -OBE,OBR -PBE,PBR -QBE,QBR -RBE,RBR -SBE,SBR -TBE,TBR -UBE,UBR -VBE,VBR -WBE,WBR -XBE,XBR -YBE,YBR -ZBE,ZBR -ACE,ACR -BCE,BCR -CCE,CCR -DCE,DCR -ECE,ECR -FCE,FCR -GCE,GCR -HCE,HCR -ICE,ICR -JCE,JCR -KCE,KCR -LCE,LCR -MCE,MCR -NCE,NCR -OCE,OCR -PCE,PCR -QCE,QCR -RCE,RCR -SCE,SCR -TCE,TCR -UCE,UCR -VCE,VCR -WCE,WCR -XCE,XCR -YCE,YCR -ZCE,ZCR -ADE,ADR -BDE,BDR -CDE,CDR -DDE,DDR -EDE,EDR -FDE,FDR -GDE,GDR -HDE,HDR -IDE,IDR -JDE,JDR -KDE,KDR -LDE,LDR -MDE,MDR -NDE,NDR -ODE,ODR -PDE,PDR -QDE,QDR -RDE,RDR -SDE,SDR -TDE,TDR -UDE,UDR -VDE,VDR -WDE,WDR -XDE,XDR -YDE,YDR -ZDE,ZDR -AEE,AER -BEE,BER -CEE,CER -DEE,DER -EEE,EER -FEE,FER -GEE,GER -HEE,HER -IEE,IER -JEE,JER -KEE,KER -LEE,LER -MEE,MER -NEE,NER -OEE,OER -PEE,PER -QEE,QER -REE,RER -SEE,SER -TEE,TER -UEE,UER -VEE,VER -WEE,WER -XEE,XER -YEE,YER -ZEE,ZER -AFE,AFR -BFE,BFR -CFE,CFR -DFE,DFR -EFE,EFR -FFE,FFR -GFE,GFR -HFE,HFR -IFE,IFR -JFE,JFR -KFE,KFR -LFE,LFR -MFE,MFR -NFE,NFR -OFE,OFR -PFE,PFR -QFE,QFR -RFE,RFR -SFE,SFR -TFE,TFR -UFE,UFR -VFE,VFR -WFE,WFR -XFE,XFR -YFE,YFR -ZFE,ZFR -AGE,AGR -BGE,BGR -CGE,CGR -DGE,DGR -EGE,EGR -FGE,FGR -GGE,GGR -HGE,HGR -IGE,IGR -JGE,JGR -KGE,KGR -LGE,LGR -MGE,MGR -NGE,NGR -OGE,OGR -PGE,PGR -QGE,QGR -RGE,RGR -SGE,SGR -TGE,TGR -UGE,UGR -VGE,VGR -WGE,WGR -XGE,XGR -YGE,YGR -ZGE,ZGR -AHE,AHR -BHE,BHR -CHE,CHR -DHE,DHR -EHE,EHR -FHE,FHR -GHE,GHR -HHE,HHR -IHE,IHR -JHE,JHR -KHE,KHR -LHE,LHR -MHE,MHR -NHE,NHR -OHE,OHR -PHE,PHR -QHE,QHR -RHE,RHR -SHE,SHR -THE,THR -UHE,UHR -VHE,VHR -WHE,WHR -XHE,XHR -YHE,YHR -ZHE,ZHR -AIE,AIR -BIE,BIR -CIE,CIR -DIE,DIR -EIE,EIR -FIE,FIR -GIE,GIR -HIE,HIR -IIE,IIR -JIE,JIR -KIE,KIR -LIE,LIR -MIE,MIR -NIE,NIR -OIE,OIR -PIE,PIR -QIE,QIR -RIE,RIR -SIE,SIR -TIE,TIR -UIE,UIR -VIE,VIR -WIE,WIR -XIE,XIR -YIE,YIR -ZIE,ZIR -AJE,AJR -BJE,BJR -CJE,CJR -DJE,DJR -EJE,EJR -FJE,FJR -GJE,GJR -HJE,HJR -IJE,IJR -JJE,JJR -KJE,KJR -LJE,LJR -MJE,MJR -NJE,NJR -OJE,OJR -PJE,PJR -QJE,QJR -RJE,RJR -SJE,SJR -TJE,TJR -UJE,UJR -VJE,VJR -WJE,WJR -XJE,XJR -YJE,YJR -ZJE,ZJR -AKE,AKR -BKE,BKR -CKE,CKR -DKE,DKR -EKE,EKR -FKE,FKR -GKE,GKR -HKE,HKR -IKE,IKR -JKE,JKR -KKE,KKR -LKE,LKR -MKE,MKR -NKE,NKR -OKE,OKR -PKE,PKR -QKE,QKR -RKE,RKR -SKE,SKR -TKE,TKR -UKE,UKR -VKE,VKR -WKE,WKR -XKE,XKR -YKE,YKR -ZKE,ZKR -ALE,ALR -BLE,BLR -CLE,CLR -DLE,DLR -ELE,ELR -FLE,FLR -GLE,GLR -HLE,HLR -ILE,ILR -JLE,JLR -KLE,KLR -LLE,LLR -MLE,MLR -NLE,NLR -OLE,OLR -PLE,PLR -QLE,QLR -RLE,RLR -SLE,SLR -TLE,TLR -ULE,ULR -VLE,VLR -WLE,WLR -XLE,XLR -YLE,YLR -ZLE,ZLR -AME,AMR -BME,BMR -CME,CMR -DME,DMR -EME,EMR -FME,FMR -GME,GMR -HME,HMR -IME,IMR -JME,JMR -KME,KMR -LME,LMR -MME,MMR -NME,NMR -OME,OMR -PME,PMR -QME,QMR -RME,RMR -SME,SMR -TME,TMR -UME,UMR -VME,VMR -WME,WMR -XME,XMR -YME,YMR -ZME,ZMR -ANE,ANR -BNE,BNR -CNE,CNR -DNE,DNR -ENE,ENR -FNE,FNR -GNE,GNR -HNE,HNR -INE,INR -JNE,JNR -KNE,KNR -LNE,LNR -MNE,MNR -NNE,NNR -ONE,ONR -PNE,PNR -QNE,QNR -RNE,RNR -SNE,SNR -TNE,TNR -UNE,UNR -VNE,VNR -WNE,WNR -XNE,XNR -YNE,YNR -ZNE,ZNR -AOE,AOR -BOE,BOR -COE,COR -DOE,DOR -EOE,EOR -FOE,FOR -GOE,GOR -HOE,HOR -IOE,IOR -JOE,JOR -KOE,KOR -LOE,LOR -MOE,MOR -NOE,NOR -OOE,OOR -POE,POR -QOE,QOR -ROE,ROR -SOE,SOR -TOE,TOR -UOE,UOR -VOE,VOR -WOE,WOR -XOE,XOR -YOE,YOR -ZOE,ZOR -APE,APR -BPE,BPR -CPE,CPR -DPE,DPR -EPE,EPR -FPE,FPR -GPE,GPR -HPE,HPR -IPE,IPR -JPE,JPR -KPE,KPR -LPE,LPR -MPE,MPR -NPE,NPR -OPE,OPR -PPE,PPR -QPE,QPR -RPE,RPR -SPE,SPR -TPE,TPR -UPE,UPR -VPE,VPR -WPE,WPR -XPE,XPR -YPE,YPR -ZPE,ZPR -AQE,AQR -BQE,BQR -CQE,CQR -DQE,DQR -EQE,EQR -FQE,FQR -GQE,GQR -HQE,HQR -IQE,IQR -JQE,JQR -KQE,KQR -LQE,LQR -MQE,MQR -NQE,NQR -OQE,OQR -PQE,PQR -QQE,QQR -RQE,RQR -SQE,SQR -TQE,TQR -UQE,UQR -VQE,VQR -WQE,WQR -XQE,XQR -YQE,YQR -ZQE,ZQR -ARE,ARR -BRE,BRR -CRE,CRR -DRE,DRR -ERE,ERR -FRE,FRR -GRE,GRR -HRE,HRR -IRE,IRR -JRE,JRR -KRE,KRR -LRE,LRR -MRE,MRR -NRE,NRR -ORE,ORR -PRE,PRR -QRE,QRR -RRE,RRR -SRE,SRR -TRE,TRR -URE,URR -VRE,VRR -WRE,WRR -XRE,XRR -YRE,YRR -ZRE,ZRR -ASE,ASR -BSE,BSR -CSE,CSR -DSE,DSR -ESE,ESR -FSE,FSR -GSE,GSR -HSE,HSR -ISE,ISR -JSE,JSR -KSE,KSR -LSE,LSR -MSE,MSR -NSE,NSR -OSE,OSR -PSE,PSR -QSE,QSR -RSE,RSR -SSE,SSR -TSE,TSR -USE,USR -VSE,VSR -WSE,WSR -XSE,XSR -YSE,YSR -ZSE,ZSR -ATE,ATR -BTE,BTR -CTE,CTR -DTE,DTR -ETE,ETR -FTE,FTR -GTE,GTR -HTE,HTR -ITE,ITR -JTE,JTR -KTE,KTR -LTE,LTR -MTE,MTR -NTE,NTR -OTE,OTR -PTE,PTR -QTE,QTR -RTE,RTR -STE,STR -TTE,TTR -UTE,UTR -VTE,VTR -WTE,WTR -XTE,XTR -YTE,YTR -ZTE,ZTR -AUE,AUR -BUE,BUR -CUE,CUR -DUE,DUR -EUE,EUR -FUE,FUR -GUE,GUR -HUE,HUR -IUE,IUR -JUE,JUR -KUE,KUR -LUE,LUR -MUE,MUR -NUE,NUR -OUE,OUR -PUE,PUR -QUE,QUR -RUE,RUR -SUE,SUR -TUE,TUR -UUE,UUR -VUE,VUR -WUE,WUR -XUE,XUR -YUE,YUR -ZUE,ZUR -AVE,AVR -BVE,BVR -CVE,CVR -DVE,DVR -EVE,EVR -FVE,FVR -GVE,GVR -HVE,HVR -IVE,IVR -JVE,JVR -KVE,KVR -LVE,LVR -MVE,MVR -NVE,NVR -OVE,OVR -PVE,PVR -QVE,QVR -RVE,RVR -SVE,SVR -TVE,TVR -UVE,UVR -VVE,VVR -WVE,WVR -XVE,XVR -YVE,YVR -ZVE,ZVR -AWE,AWR -BWE,BWR -CWE,CWR -DWE,DWR -EWE,EWR -FWE,FWR -GWE,GWR -HWE,HWR -IWE,IWR -JWE,JWR -KWE,KWR -LWE,LWR -MWE,MWR -NWE,NWR -OWE,OWR -PWE,PWR -QWE,QWR -RWE,RWR -SWE,SWR -TWE,TWR -UWE,UWR -VWE,VWR -WWE,WWR -XWE,XWR -YWE,YWR -ZWE,ZWR -AXE,AXR -BXE,BXR -CXE,CXR -DXE,DXR -EXE,EXR -FXE,FXR -GXE,GXR -HXE,HXR -IXE,IXR -JXE,JXR -KXE,KXR -LXE,LXR -MXE,MXR -NXE,NXR -OXE,OXR -PXE,PXR -QXE,QXR -RXE,RXR -SXE,SXR -TXE,TXR -UXE,UXR -VXE,VXR -WXE,WXR -XXE,XXR -YXE,YXR -ZXE,ZXR -AYE,AYR -BYE,BYR -CYE,CYR -DYE,DYR -EYE,EYR -FYE,FYR -GYE,GYR -HYE,HYR -IYE,IYR -JYE,JYR -KYE,KYR -LYE,LYR -MYE,MYR -NYE,NYR -OYE,OYR -PYE,PYR -QYE,QYR -RYE,RYR -SYE,SYR -TYE,TYR -UYE,UYR -VYE,VYR -WYE,WYR -XYE,XYR -YYE,YYR -ZYE,ZYR -AZE,AZR -BZE,BZR -CZE,CZR -DZE,DZR -EZE,EZR -FZE,FZR -GZE,GZR -HZE,HZR -IZE,IZR -JZE,JZR -KZE,KZR -LZE,LZR -MZE,MZR -NZE,NZR -OZE,OZR -PZE,PZR -QZE,QZR -RZE,RZR -SZE,SZR -TZE,TZR -UZE,UZR -VZE,VZR -WZE,WZR -XZE,XZR -YZE,YZR -ZZE,ZZR -AAF,AAS -BAF,BAS -CAF,CAS -DAF,DAS -EAF,EAS -FAF,FAS -GAF,GAS -HAF,HAS -IAF,IAS -JAF,JAS -KAF,KAS -LAF,LAS -MAF,MAS -NAF,NAS -OAF,OAS -PAF,PAS -QAF,QAS -RAF,RAS -SAF,SAS -TAF,TAS -UAF,UAS -VAF,VAS -WAF,WAS -XAF,XAS -YAF,YAS -ZAF,ZAS -ABF,ABS -BBF,BBS -CBF,CBS -DBF,DBS -EBF,EBS -FBF,FBS -GBF,GBS -HBF,HBS -IBF,IBS -JBF,JBS -KBF,KBS -LBF,LBS -MBF,MBS -NBF,NBS -OBF,OBS -PBF,PBS -QBF,QBS -RBF,RBS -SBF,SBS -TBF,TBS -UBF,UBS -VBF,VBS -WBF,WBS -XBF,XBS -YBF,YBS -ZBF,ZBS -ACF,ACS -BCF,BCS -CCF,CCS -DCF,DCS -ECF,ECS -FCF,FCS -GCF,GCS -HCF,HCS -ICF,ICS -JCF,JCS -KCF,KCS -LCF,LCS -MCF,MCS -NCF,NCS -OCF,OCS -PCF,PCS -QCF,QCS -RCF,RCS -SCF,SCS -TCF,TCS -UCF,UCS -VCF,VCS -WCF,WCS -XCF,XCS -YCF,YCS -ZCF,ZCS -ADF,ADS -BDF,BDS -CDF,CDS -DDF,DDS -EDF,EDS -FDF,FDS -GDF,GDS -HDF,HDS -IDF,IDS -JDF,JDS -KDF,KDS -LDF,LDS -MDF,MDS -NDF,NDS -ODF,ODS -PDF,PDS -QDF,QDS -RDF,RDS -SDF,SDS -TDF,TDS -UDF,UDS -VDF,VDS -WDF,WDS -XDF,XDS -YDF,YDS -ZDF,ZDS -AEF,AES -BEF,BES -CEF,CES -DEF,DES -EEF,EES -FEF,FES -GEF,GES -HEF,HES -IEF,IES -JEF,JES -KEF,KES -LEF,LES -MEF,MES -NEF,NES -OEF,OES -PEF,PES -QEF,QES -REF,RES -SEF,SES -TEF,TES -UEF,UES -VEF,VES -WEF,WES -XEF,XES -YEF,YES -ZEF,ZES -AFF,AFS -BFF,BFS -CFF,CFS -DFF,DFS -EFF,EFS -FFF,FFS -GFF,GFS -HFF,HFS -IFF,IFS -JFF,JFS -KFF,KFS -LFF,LFS -MFF,MFS -NFF,NFS -OFF,OFS -PFF,PFS -QFF,QFS -RFF,RFS -SFF,SFS -TFF,TFS -UFF,UFS -VFF,VFS -WFF,WFS -XFF,XFS -YFF,YFS -ZFF,ZFS -AGF,AGS -BGF,BGS -CGF,CGS -DGF,DGS -EGF,EGS -FGF,FGS -GGF,GGS -HGF,HGS -IGF,IGS -JGF,JGS -KGF,KGS -LGF,LGS -MGF,MGS -NGF,NGS -OGF,OGS -PGF,PGS -QGF,QGS -RGF,RGS -SGF,SGS -TGF,TGS -UGF,UGS -VGF,VGS -WGF,WGS -XGF,XGS -YGF,YGS -ZGF,ZGS -AHF,AHS -BHF,BHS -CHF,CHS -DHF,DHS -EHF,EHS -FHF,FHS -GHF,GHS -HHF,HHS -IHF,IHS -JHF,JHS -KHF,KHS -LHF,LHS -MHF,MHS -NHF,NHS -OHF,OHS -PHF,PHS -QHF,QHS -RHF,RHS -SHF,SHS -THF,THS -UHF,UHS -VHF,VHS -WHF,WHS -XHF,XHS -YHF,YHS -ZHF,ZHS -AIF,AIS -BIF,BIS -CIF,CIS -DIF,DIS -EIF,EIS -FIF,FIS -GIF,GIS -HIF,HIS -IIF,IIS -JIF,JIS -KIF,KIS -LIF,LIS -MIF,MIS -NIF,NIS -OIF,OIS -PIF,PIS -QIF,QIS -RIF,RIS -SIF,SIS -TIF,TIS -UIF,UIS -VIF,VIS -WIF,WIS -XIF,XIS -YIF,YIS -ZIF,ZIS -AJF,AJS -BJF,BJS -CJF,CJS -DJF,DJS -EJF,EJS -FJF,FJS -GJF,GJS -HJF,HJS -IJF,IJS -JJF,JJS -KJF,KJS -LJF,LJS -MJF,MJS -NJF,NJS -OJF,OJS -PJF,PJS -QJF,QJS -RJF,RJS -SJF,SJS -TJF,TJS -UJF,UJS -VJF,VJS -WJF,WJS -XJF,XJS -YJF,YJS -ZJF,ZJS -AKF,AKS -BKF,BKS -CKF,CKS -DKF,DKS -EKF,EKS -FKF,FKS -GKF,GKS -HKF,HKS -IKF,IKS -JKF,JKS -KKF,KKS -LKF,LKS -MKF,MKS -NKF,NKS -OKF,OKS -PKF,PKS -QKF,QKS -RKF,RKS -SKF,SKS -TKF,TKS -UKF,UKS -VKF,VKS -WKF,WKS -XKF,XKS -YKF,YKS -ZKF,ZKS -ALF,ALS -BLF,BLS -CLF,CLS -DLF,DLS -ELF,ELS -FLF,FLS -GLF,GLS -HLF,HLS -ILF,ILS -JLF,JLS -KLF,KLS -LLF,LLS -MLF,MLS -NLF,NLS -OLF,OLS -PLF,PLS -QLF,QLS -RLF,RLS -SLF,SLS -TLF,TLS -ULF,ULS -VLF,VLS -WLF,WLS -XLF,XLS -YLF,YLS -ZLF,ZLS -AMF,AMS -BMF,BMS -CMF,CMS -DMF,DMS -EMF,EMS -FMF,FMS -GMF,GMS -HMF,HMS -IMF,IMS -JMF,JMS -KMF,KMS -LMF,LMS -MMF,MMS -NMF,NMS -OMF,OMS -PMF,PMS -QMF,QMS -RMF,RMS -SMF,SMS -TMF,TMS -UMF,UMS -VMF,VMS -WMF,WMS -XMF,XMS -YMF,YMS -ZMF,ZMS -ANF,ANS -BNF,BNS -CNF,CNS -DNF,DNS -ENF,ENS -FNF,FNS -GNF,GNS -HNF,HNS -INF,INS -JNF,JNS -KNF,KNS -LNF,LNS -MNF,MNS -NNF,NNS -ONF,ONS -PNF,PNS -QNF,QNS -RNF,RNS -SNF,SNS -TNF,TNS -UNF,UNS -VNF,VNS -WNF,WNS -XNF,XNS -YNF,YNS -ZNF,ZNS -AOF,AOS -BOF,BOS -COF,COS -DOF,DOS -EOF,EOS -FOF,FOS -GOF,GOS -HOF,HOS -IOF,IOS -JOF,JOS -KOF,KOS -LOF,LOS -MOF,MOS -NOF,NOS -OOF,OOS -POF,POS -QOF,QOS -ROF,ROS -SOF,SOS -TOF,TOS -UOF,UOS -VOF,VOS -WOF,WOS -XOF,XOS -YOF,YOS -ZOF,ZOS -APF,APS -BPF,BPS -CPF,CPS -DPF,DPS -EPF,EPS -FPF,FPS -GPF,GPS -HPF,HPS -IPF,IPS -JPF,JPS -KPF,KPS -LPF,LPS -MPF,MPS -NPF,NPS -OPF,OPS -PPF,PPS -QPF,QPS -RPF,RPS -SPF,SPS -TPF,TPS -UPF,UPS -VPF,VPS -WPF,WPS -XPF,XPS -YPF,YPS -ZPF,ZPS -AQF,AQS -BQF,BQS -CQF,CQS -DQF,DQS -EQF,EQS -FQF,FQS -GQF,GQS -HQF,HQS -IQF,IQS -JQF,JQS -KQF,KQS -LQF,LQS -MQF,MQS -NQF,NQS -OQF,OQS -PQF,PQS -QQF,QQS -RQF,RQS -SQF,SQS -TQF,TQS -UQF,UQS -VQF,VQS -WQF,WQS -XQF,XQS -YQF,YQS -ZQF,ZQS -ARF,ARS -BRF,BRS -CRF,CRS -DRF,DRS -ERF,ERS -FRF,FRS -GRF,GRS -HRF,HRS -IRF,IRS -JRF,JRS -KRF,KRS -LRF,LRS -MRF,MRS -NRF,NRS -ORF,ORS -PRF,PRS -QRF,QRS -RRF,RRS -SRF,SRS -TRF,TRS -URF,URS -VRF,VRS -WRF,WRS -XRF,XRS -YRF,YRS -ZRF,ZRS -ASF,ASS -BSF,BSS -CSF,CSS -DSF,DSS -ESF,ESS -FSF,FSS -GSF,GSS -HSF,HSS -ISF,ISS -JSF,JSS -KSF,KSS -LSF,LSS -MSF,MSS -NSF,NSS -OSF,OSS -PSF,PSS -QSF,QSS -RSF,RSS -SSF,SSS -TSF,TSS -USF,USS -VSF,VSS -WSF,WSS -XSF,XSS -YSF,YSS -ZSF,ZSS -ATF,ATS -BTF,BTS -CTF,CTS -DTF,DTS -ETF,ETS -FTF,FTS -GTF,GTS -HTF,HTS -ITF,ITS -JTF,JTS -KTF,KTS -LTF,LTS -MTF,MTS -NTF,NTS -OTF,OTS -PTF,PTS -QTF,QTS -RTF,RTS -STF,STS -TTF,TTS -UTF,UTS -VTF,VTS -WTF,WTS -XTF,XTS -YTF,YTS -ZTF,ZTS -AUF,AUS -BUF,BUS -CUF,CUS -DUF,DUS -EUF,EUS -FUF,FUS -GUF,GUS -HUF,HUS -IUF,IUS -JUF,JUS -KUF,KUS -LUF,LUS -MUF,MUS -NUF,NUS -OUF,OUS -PUF,PUS -QUF,QUS -RUF,RUS -SUF,SUS -TUF,TUS -UUF,UUS -VUF,VUS -WUF,WUS -XUF,XUS -YUF,YUS -ZUF,ZUS -AVF,AVS -BVF,BVS -CVF,CVS -DVF,DVS -EVF,EVS -FVF,FVS -GVF,GVS -HVF,HVS -IVF,IVS -JVF,JVS -KVF,KVS -LVF,LVS -MVF,MVS -NVF,NVS -OVF,OVS -PVF,PVS -QVF,QVS -RVF,RVS -SVF,SVS -TVF,TVS -UVF,UVS -VVF,VVS -WVF,WVS -XVF,XVS -YVF,YVS -ZVF,ZVS -AWF,AWS -BWF,BWS -CWF,CWS -DWF,DWS -EWF,EWS -FWF,FWS -GWF,GWS -HWF,HWS -IWF,IWS -JWF,JWS -KWF,KWS -LWF,LWS -MWF,MWS -NWF,NWS -OWF,OWS -PWF,PWS -QWF,QWS -RWF,RWS -SWF,SWS -TWF,TWS -UWF,UWS -VWF,VWS -WWF,WWS -XWF,XWS -YWF,YWS -ZWF,ZWS -AXF,AXS -BXF,BXS -CXF,CXS -DXF,DXS -EXF,EXS -FXF,FXS -GXF,GXS -HXF,HXS -IXF,IXS -JXF,JXS -KXF,KXS -LXF,LXS -MXF,MXS -NXF,NXS -OXF,OXS -PXF,PXS -QXF,QXS -RXF,RXS -SXF,SXS -TXF,TXS -UXF,UXS -VXF,VXS -WXF,WXS -XXF,XXS -YXF,YXS -ZXF,ZXS -AYF,AYS -BYF,BYS -CYF,CYS -DYF,DYS -EYF,EYS -FYF,FYS -GYF,GYS -HYF,HYS -IYF,IYS -JYF,JYS -KYF,KYS -LYF,LYS -MYF,MYS -NYF,NYS -OYF,OYS -PYF,PYS -QYF,QYS -RYF,RYS -SYF,SYS -TYF,TYS -UYF,UYS -VYF,VYS -WYF,WYS -XYF,XYS -YYF,YYS -ZYF,ZYS -AZF,AZS -BZF,BZS -CZF,CZS -DZF,DZS -EZF,EZS -FZF,FZS -GZF,GZS -HZF,HZS -IZF,IZS -JZF,JZS -KZF,KZS -LZF,LZS -MZF,MZS -NZF,NZS -OZF,OZS -PZF,PZS -QZF,QZS -RZF,RZS -SZF,SZS -TZF,TZS -UZF,UZS -VZF,VZS -WZF,WZS -XZF,XZS -YZF,YZS -ZZF,ZZS -AAG,AAT -BAG,BAT -CAG,CAT -DAG,DAT -EAG,EAT -FAG,FAT -GAG,GAT -HAG,HAT -IAG,IAT -JAG,JAT -KAG,KAT -LAG,LAT -MAG,MAT -NAG,NAT -OAG,OAT -PAG,PAT -QAG,QAT -RAG,RAT -SAG,SAT -TAG,TAT -UAG,UAT -VAG,VAT -WAG,WAT -XAG,XAT -YAG,YAT -ZAG,ZAT -ABG,ABT -BBG,BBT -CBG,CBT -DBG,DBT -EBG,EBT -FBG,FBT -GBG,GBT -HBG,HBT -IBG,IBT -JBG,JBT -KBG,KBT -LBG,LBT -MBG,MBT -NBG,NBT -OBG,OBT -PBG,PBT -QBG,QBT -RBG,RBT -SBG,SBT -TBG,TBT -UBG,UBT -VBG,VBT -WBG,WBT -XBG,XBT -YBG,YBT -ZBG,ZBT -ACG,ACT -BCG,BCT -CCG,CCT -DCG,DCT -ECG,ECT -FCG,FCT -GCG,GCT -HCG,HCT -ICG,ICT -JCG,JCT -KCG,KCT -LCG,LCT -MCG,MCT -NCG,NCT -OCG,OCT -PCG,PCT -QCG,QCT -RCG,RCT -SCG,SCT -TCG,TCT -UCG,UCT -VCG,VCT -WCG,WCT -XCG,XCT -YCG,YCT -ZCG,ZCT -ADG,ADT -BDG,BDT -CDG,CDT -DDG,DDT -EDG,EDT -FDG,FDT -GDG,GDT -HDG,HDT -IDG,IDT -JDG,JDT -KDG,KDT -LDG,LDT -MDG,MDT -NDG,NDT -ODG,ODT -PDG,PDT -QDG,QDT -RDG,RDT -SDG,SDT -TDG,TDT -UDG,UDT -VDG,VDT -WDG,WDT -XDG,XDT -YDG,YDT -ZDG,ZDT -AEG,AET -BEG,BET -CEG,CET -DEG,DET -EEG,EET -FEG,FET -GEG,GET -HEG,HET -IEG,IET -JEG,JET -KEG,KET -LEG,LET -MEG,MET -NEG,NET -OEG,OET -PEG,PET -QEG,QET -REG,RET -SEG,SET -TEG,TET -UEG,UET -VEG,VET -WEG,WET -XEG,XET -YEG,YET -ZEG,ZET -AFG,AFT -BFG,BFT -CFG,CFT -DFG,DFT -EFG,EFT -FFG,FFT -GFG,GFT -HFG,HFT -IFG,IFT -JFG,JFT -KFG,KFT -LFG,LFT -MFG,MFT -NFG,NFT -OFG,OFT -PFG,PFT -QFG,QFT -RFG,RFT -SFG,SFT -TFG,TFT -UFG,UFT -VFG,VFT -WFG,WFT -XFG,XFT -YFG,YFT -ZFG,ZFT -AGG,AGT -BGG,BGT -CGG,CGT -DGG,DGT -EGG,EGT -FGG,FGT -GGG,GGT -HGG,HGT -IGG,IGT -JGG,JGT -KGG,KGT -LGG,LGT -MGG,MGT -NGG,NGT -OGG,OGT -PGG,PGT -QGG,QGT -RGG,RGT -SGG,SGT -TGG,TGT -UGG,UGT -VGG,VGT -WGG,WGT -XGG,XGT -YGG,YGT -ZGG,ZGT -AHG,AHT -BHG,BHT -CHG,CHT -DHG,DHT -EHG,EHT -FHG,FHT -GHG,GHT -HHG,HHT -IHG,IHT -JHG,JHT -KHG,KHT -LHG,LHT -MHG,MHT -NHG,NHT -OHG,OHT -PHG,PHT -QHG,QHT -RHG,RHT -SHG,SHT -THG,THT -UHG,UHT -VHG,VHT -WHG,WHT -XHG,XHT -YHG,YHT -ZHG,ZHT -AIG,AIT -BIG,BIT -CIG,CIT -DIG,DIT -EIG,EIT -FIG,FIT -GIG,GIT -HIG,HIT -IIG,IIT -JIG,JIT -KIG,KIT -LIG,LIT -MIG,MIT -NIG,NIT -OIG,OIT -PIG,PIT -QIG,QIT -RIG,RIT -SIG,SIT -TIG,TIT -UIG,UIT -VIG,VIT -WIG,WIT -XIG,XIT -YIG,YIT -ZIG,ZIT -AJG,AJT -BJG,BJT -CJG,CJT -DJG,DJT -EJG,EJT -FJG,FJT -GJG,GJT -HJG,HJT -IJG,IJT -JJG,JJT -KJG,KJT -LJG,LJT -MJG,MJT -NJG,NJT -OJG,OJT -PJG,PJT -QJG,QJT -RJG,RJT -SJG,SJT -TJG,TJT -UJG,UJT -VJG,VJT -WJG,WJT -XJG,XJT -YJG,YJT -ZJG,ZJT -AKG,AKT -BKG,BKT -CKG,CKT -DKG,DKT -EKG,EKT -FKG,FKT -GKG,GKT -HKG,HKT -IKG,IKT -JKG,JKT -KKG,KKT -LKG,LKT -MKG,MKT -NKG,NKT -OKG,OKT -PKG,PKT -QKG,QKT -RKG,RKT -SKG,SKT -TKG,TKT -UKG,UKT -VKG,VKT -WKG,WKT -XKG,XKT -YKG,YKT -ZKG,ZKT -ALG,ALT -BLG,BLT -CLG,CLT -DLG,DLT -ELG,ELT -FLG,FLT -GLG,GLT -HLG,HLT -ILG,ILT -JLG,JLT -KLG,KLT -LLG,LLT -MLG,MLT -NLG,NLT -OLG,OLT -PLG,PLT -QLG,QLT -RLG,RLT -SLG,SLT -TLG,TLT -ULG,ULT -VLG,VLT -WLG,WLT -XLG,XLT -YLG,YLT -ZLG,ZLT -AMG,AMT -BMG,BMT -CMG,CMT -DMG,DMT -EMG,EMT -FMG,FMT -GMG,GMT -HMG,HMT -IMG,IMT -JMG,JMT -KMG,KMT -LMG,LMT -MMG,MMT -NMG,NMT -OMG,OMT -PMG,PMT -QMG,QMT -RMG,RMT -SMG,SMT -TMG,TMT -UMG,UMT -VMG,VMT -WMG,WMT -XMG,XMT -YMG,YMT -ZMG,ZMT -ANG,ANT -BNG,BNT -CNG,CNT -DNG,DNT -ENG,ENT -FNG,FNT -GNG,GNT -HNG,HNT -ING,INT -JNG,JNT -KNG,KNT -LNG,LNT -MNG,MNT -NNG,NNT -ONG,ONT -PNG,PNT -QNG,QNT -RNG,RNT -SNG,SNT -TNG,TNT -UNG,UNT -VNG,VNT -WNG,WNT -XNG,XNT -YNG,YNT -ZNG,ZNT -AOG,AOT -BOG,BOT -COG,COT -DOG,DOT -EOG,EOT -FOG,FOT -GOG,GOT -HOG,HOT -IOG,IOT -JOG,JOT -KOG,KOT -LOG,LOT -MOG,MOT -NOG,NOT -OOG,OOT -POG,POT -QOG,QOT -ROG,ROT -SOG,SOT -TOG,TOT -UOG,UOT -VOG,VOT -WOG,WOT -XOG,XOT -YOG,YOT -ZOG,ZOT -APG,APT -BPG,BPT -CPG,CPT -DPG,DPT -EPG,EPT -FPG,FPT -GPG,GPT -HPG,HPT -IPG,IPT -JPG,JPT -KPG,KPT -LPG,LPT -MPG,MPT -NPG,NPT -OPG,OPT -PPG,PPT -QPG,QPT -RPG,RPT -SPG,SPT -TPG,TPT -UPG,UPT -VPG,VPT -WPG,WPT -XPG,XPT -YPG,YPT -ZPG,ZPT -AQG,AQT -BQG,BQT -CQG,CQT -DQG,DQT -EQG,EQT -FQG,FQT -GQG,GQT -HQG,HQT -IQG,IQT -JQG,JQT -KQG,KQT -LQG,LQT -MQG,MQT -NQG,NQT -OQG,OQT -PQG,PQT -QQG,QQT -RQG,RQT -SQG,SQT -TQG,TQT -UQG,UQT -VQG,VQT -WQG,WQT -XQG,XQT -YQG,YQT -ZQG,ZQT -ARG,ART -BRG,BRT -CRG,CRT -DRG,DRT -ERG,ERT -FRG,FRT -GRG,GRT -HRG,HRT -IRG,IRT -JRG,JRT -KRG,KRT -LRG,LRT -MRG,MRT -NRG,NRT -ORG,ORT -PRG,PRT -QRG,QRT -RRG,RRT -SRG,SRT -TRG,TRT -URG,URT -VRG,VRT -WRG,WRT -XRG,XRT -YRG,YRT -ZRG,ZRT -ASG,AST -BSG,BST -CSG,CST -DSG,DST -ESG,EST -FSG,FST -GSG,GST -HSG,HST -ISG,IST -JSG,JST -KSG,KST -LSG,LST -MSG,MST -NSG,NST -OSG,OST -PSG,PST -QSG,QST -RSG,RST -SSG,SST -TSG,TST -USG,UST -VSG,VST -WSG,WST -XSG,XST -YSG,YST -ZSG,ZST -ATG,ATT -BTG,BTT -CTG,CTT -DTG,DTT -ETG,ETT -FTG,FTT -GTG,GTT -HTG,HTT -ITG,ITT -JTG,JTT -KTG,KTT -LTG,LTT -MTG,MTT -NTG,NTT -OTG,OTT -PTG,PTT -QTG,QTT -RTG,RTT -STG,STT -TTG,TTT -UTG,UTT -VTG,VTT -WTG,WTT -XTG,XTT -YTG,YTT -ZTG,ZTT -AUG,AUT -BUG,BUT -CUG,CUT -DUG,DUT -EUG,EUT -FUG,FUT -GUG,GUT -HUG,HUT -IUG,IUT -JUG,JUT -KUG,KUT -LUG,LUT -MUG,MUT -NUG,NUT -OUG,OUT -PUG,PUT -QUG,QUT -RUG,RUT -SUG,SUT -TUG,TUT -UUG,UUT -VUG,VUT -WUG,WUT -XUG,XUT -YUG,YUT -ZUG,ZUT -AVG,AVT -BVG,BVT -CVG,CVT -DVG,DVT -EVG,EVT -FVG,FVT -GVG,GVT -HVG,HVT -IVG,IVT -JVG,JVT -KVG,KVT -LVG,LVT -MVG,MVT -NVG,NVT -OVG,OVT -PVG,PVT -QVG,QVT -RVG,RVT -SVG,SVT -TVG,TVT -UVG,UVT -VVG,VVT -WVG,WVT -XVG,XVT -YVG,YVT -ZVG,ZVT -AWG,AWT -BWG,BWT -CWG,CWT -DWG,DWT -EWG,EWT -FWG,FWT -GWG,GWT -HWG,HWT -IWG,IWT -JWG,JWT -KWG,KWT -LWG,LWT -MWG,MWT -NWG,NWT -OWG,OWT -PWG,PWT -QWG,QWT -RWG,RWT -SWG,SWT -TWG,TWT -UWG,UWT -VWG,VWT -WWG,WWT -XWG,XWT -YWG,YWT -ZWG,ZWT -AXG,AXT -BXG,BXT -CXG,CXT -DXG,DXT -EXG,EXT -FXG,FXT -GXG,GXT -HXG,HXT -IXG,IXT -JXG,JXT -KXG,KXT -LXG,LXT -MXG,MXT -NXG,NXT -OXG,OXT -PXG,PXT -QXG,QXT -RXG,RXT -SXG,SXT -TXG,TXT -UXG,UXT -VXG,VXT -WXG,WXT -XXG,XXT -YXG,YXT -ZXG,ZXT -AYG,AYT -BYG,BYT -CYG,CYT -DYG,DYT -EYG,EYT -FYG,FYT -GYG,GYT -HYG,HYT -IYG,IYT -JYG,JYT -KYG,KYT -LYG,LYT -MYG,MYT -NYG,NYT -OYG,OYT -PYG,PYT -QYG,QYT -RYG,RYT -SYG,SYT -TYG,TYT -UYG,UYT -VYG,VYT -WYG,WYT -XYG,XYT -YYG,YYT -ZYG,ZYT -AZG,AZT -BZG,BZT -CZG,CZT -DZG,DZT -EZG,EZT -FZG,FZT -GZG,GZT -HZG,HZT -IZG,IZT -JZG,JZT -KZG,KZT -LZG,LZT -MZG,MZT -NZG,NZT -OZG,OZT -PZG,PZT -QZG,QZT -RZG,RZT -SZG,SZT -TZG,TZT -UZG,UZT -VZG,VZT -WZG,WZT -XZG,XZT -YZG,YZT -ZZG,ZZT -AAH,AAU -BAH,BAU -CAH,CAU -DAH,DAU -EAH,EAU -FAH,FAU -GAH,GAU -HAH,HAU -IAH,IAU -JAH,JAU -KAH,KAU -LAH,LAU -MAH,MAU -NAH,NAU -OAH,OAU -PAH,PAU -QAH,QAU -RAH,RAU -SAH,SAU -TAH,TAU -UAH,UAU -VAH,VAU -WAH,WAU -XAH,XAU -YAH,YAU -ZAH,ZAU -ABH,ABU -BBH,BBU -CBH,CBU -DBH,DBU -EBH,EBU -FBH,FBU -GBH,GBU -HBH,HBU -IBH,IBU -JBH,JBU -KBH,KBU -LBH,LBU -MBH,MBU -NBH,NBU -OBH,OBU -PBH,PBU -QBH,QBU -RBH,RBU -SBH,SBU -TBH,TBU -UBH,UBU -VBH,VBU -WBH,WBU -XBH,XBU -YBH,YBU -ZBH,ZBU -ACH,ACU -BCH,BCU -CCH,CCU -DCH,DCU -ECH,ECU -FCH,FCU -GCH,GCU -HCH,HCU -ICH,ICU -JCH,JCU -KCH,KCU -LCH,LCU -MCH,MCU -NCH,NCU -OCH,OCU -PCH,PCU -QCH,QCU -RCH,RCU -SCH,SCU -TCH,TCU -UCH,UCU -VCH,VCU -WCH,WCU -XCH,XCU -YCH,YCU -ZCH,ZCU -ADH,ADU -BDH,BDU -CDH,CDU -DDH,DDU -EDH,EDU -FDH,FDU -GDH,GDU -HDH,HDU -IDH,IDU -JDH,JDU -KDH,KDU -LDH,LDU -MDH,MDU -NDH,NDU -ODH,ODU -PDH,PDU -QDH,QDU -RDH,RDU -SDH,SDU -TDH,TDU -UDH,UDU -VDH,VDU -WDH,WDU -XDH,XDU -YDH,YDU -ZDH,ZDU -AEH,AEU -BEH,BEU -CEH,CEU -DEH,DEU -EEH,EEU -FEH,FEU -GEH,GEU -HEH,HEU -IEH,IEU -JEH,JEU -KEH,KEU -LEH,LEU -MEH,MEU -NEH,NEU -OEH,OEU -PEH,PEU -QEH,QEU -REH,REU -SEH,SEU -TEH,TEU -UEH,UEU -VEH,VEU -WEH,WEU -XEH,XEU -YEH,YEU -ZEH,ZEU -AFH,AFU -BFH,BFU -CFH,CFU -DFH,DFU -EFH,EFU -FFH,FFU -GFH,GFU -HFH,HFU -IFH,IFU -JFH,JFU -KFH,KFU -LFH,LFU -MFH,MFU -NFH,NFU -OFH,OFU -PFH,PFU -QFH,QFU -RFH,RFU -SFH,SFU -TFH,TFU -UFH,UFU -VFH,VFU -WFH,WFU -XFH,XFU -YFH,YFU -ZFH,ZFU -AGH,AGU -BGH,BGU -CGH,CGU -DGH,DGU -EGH,EGU -FGH,FGU -GGH,GGU -HGH,HGU -IGH,IGU -JGH,JGU -KGH,KGU -LGH,LGU -MGH,MGU -NGH,NGU -OGH,OGU -PGH,PGU -QGH,QGU -RGH,RGU -SGH,SGU -TGH,TGU -UGH,UGU -VGH,VGU -WGH,WGU -XGH,XGU -YGH,YGU -ZGH,ZGU -AHH,AHU -BHH,BHU -CHH,CHU -DHH,DHU -EHH,EHU -FHH,FHU -GHH,GHU -HHH,HHU -IHH,IHU -JHH,JHU -KHH,KHU -LHH,LHU -MHH,MHU -NHH,NHU -OHH,OHU -PHH,PHU -QHH,QHU -RHH,RHU -SHH,SHU -THH,THU -UHH,UHU -VHH,VHU -WHH,WHU -XHH,XHU -YHH,YHU -ZHH,ZHU -AIH,AIU -BIH,BIU -CIH,CIU -DIH,DIU -EIH,EIU -FIH,FIU -GIH,GIU -HIH,HIU -IIH,IIU -JIH,JIU -KIH,KIU -LIH,LIU -MIH,MIU -NIH,NIU -OIH,OIU -PIH,PIU -QIH,QIU -RIH,RIU -SIH,SIU -TIH,TIU -UIH,UIU -VIH,VIU -WIH,WIU -XIH,XIU -YIH,YIU -ZIH,ZIU -AJH,AJU -BJH,BJU -CJH,CJU -DJH,DJU -EJH,EJU -FJH,FJU -GJH,GJU -HJH,HJU -IJH,IJU -JJH,JJU -KJH,KJU -LJH,LJU -MJH,MJU -NJH,NJU -OJH,OJU -PJH,PJU -QJH,QJU -RJH,RJU -SJH,SJU -TJH,TJU -UJH,UJU -VJH,VJU -WJH,WJU -XJH,XJU -YJH,YJU -ZJH,ZJU -AKH,AKU -BKH,BKU -CKH,CKU -DKH,DKU -EKH,EKU -FKH,FKU -GKH,GKU -HKH,HKU -IKH,IKU -JKH,JKU -KKH,KKU -LKH,LKU -MKH,MKU -NKH,NKU -OKH,OKU -PKH,PKU -QKH,QKU -RKH,RKU -SKH,SKU -TKH,TKU -UKH,UKU -VKH,VKU -WKH,WKU -XKH,XKU -YKH,YKU -ZKH,ZKU -ALH,ALU -BLH,BLU -CLH,CLU -DLH,DLU -ELH,ELU -FLH,FLU -GLH,GLU -HLH,HLU -ILH,ILU -JLH,JLU -KLH,KLU -LLH,LLU -MLH,MLU -NLH,NLU -OLH,OLU -PLH,PLU -QLH,QLU -RLH,RLU -SLH,SLU -TLH,TLU -ULH,ULU -VLH,VLU -WLH,WLU -XLH,XLU -YLH,YLU -ZLH,ZLU -AMH,AMU -BMH,BMU -CMH,CMU -DMH,DMU -EMH,EMU -FMH,FMU -GMH,GMU -HMH,HMU -IMH,IMU -JMH,JMU -KMH,KMU -LMH,LMU -MMH,MMU -NMH,NMU -OMH,OMU -PMH,PMU -QMH,QMU -RMH,RMU -SMH,SMU -TMH,TMU -UMH,UMU -VMH,VMU -WMH,WMU -XMH,XMU -YMH,YMU -ZMH,ZMU -ANH,ANU -BNH,BNU -CNH,CNU -DNH,DNU -ENH,ENU -FNH,FNU -GNH,GNU -HNH,HNU -INH,INU -JNH,JNU -KNH,KNU -LNH,LNU -MNH,MNU -NNH,NNU -ONH,ONU -PNH,PNU -QNH,QNU -RNH,RNU -SNH,SNU -TNH,TNU -UNH,UNU -VNH,VNU -WNH,WNU -XNH,XNU -YNH,YNU -ZNH,ZNU -AOH,AOU -BOH,BOU -COH,COU -DOH,DOU -EOH,EOU -FOH,FOU -GOH,GOU -HOH,HOU -IOH,IOU -JOH,JOU -KOH,KOU -LOH,LOU -MOH,MOU -NOH,NOU -OOH,OOU -POH,POU -QOH,QOU -ROH,ROU -SOH,SOU -TOH,TOU -UOH,UOU -VOH,VOU -WOH,WOU -XOH,XOU -YOH,YOU -ZOH,ZOU -APH,APU -BPH,BPU -CPH,CPU -DPH,DPU -EPH,EPU -FPH,FPU -GPH,GPU -HPH,HPU -IPH,IPU -JPH,JPU -KPH,KPU -LPH,LPU -MPH,MPU -NPH,NPU -OPH,OPU -PPH,PPU -QPH,QPU -RPH,RPU -SPH,SPU -TPH,TPU -UPH,UPU -VPH,VPU -WPH,WPU -XPH,XPU -YPH,YPU -ZPH,ZPU -AQH,AQU -BQH,BQU -CQH,CQU -DQH,DQU -EQH,EQU -FQH,FQU -GQH,GQU -HQH,HQU -IQH,IQU -JQH,JQU -KQH,KQU -LQH,LQU -MQH,MQU -NQH,NQU -OQH,OQU -PQH,PQU -QQH,QQU -RQH,RQU -SQH,SQU -TQH,TQU -UQH,UQU -VQH,VQU -WQH,WQU -XQH,XQU -YQH,YQU -ZQH,ZQU -ARH,ARU -BRH,BRU -CRH,CRU -DRH,DRU -ERH,ERU -FRH,FRU -GRH,GRU -HRH,HRU -IRH,IRU -JRH,JRU -KRH,KRU -LRH,LRU -MRH,MRU -NRH,NRU -ORH,ORU -PRH,PRU -QRH,QRU -RRH,RRU -SRH,SRU -TRH,TRU -URH,URU -VRH,VRU -WRH,WRU -XRH,XRU -YRH,YRU -ZRH,ZRU -ASH,ASU -BSH,BSU -CSH,CSU -DSH,DSU -ESH,ESU -FSH,FSU -GSH,GSU -HSH,HSU -ISH,ISU -JSH,JSU -KSH,KSU -LSH,LSU -MSH,MSU -NSH,NSU -OSH,OSU -PSH,PSU -QSH,QSU -RSH,RSU -SSH,SSU -TSH,TSU -USH,USU -VSH,VSU -WSH,WSU -XSH,XSU -YSH,YSU -ZSH,ZSU -ATH,ATU -BTH,BTU -CTH,CTU -DTH,DTU -ETH,ETU -FTH,FTU -GTH,GTU -HTH,HTU -ITH,ITU -JTH,JTU -KTH,KTU -LTH,LTU -MTH,MTU -NTH,NTU -OTH,OTU -PTH,PTU -QTH,QTU -RTH,RTU -STH,STU -TTH,TTU -UTH,UTU -VTH,VTU -WTH,WTU -XTH,XTU -YTH,YTU -ZTH,ZTU -AUH,AUU -BUH,BUU -CUH,CUU -DUH,DUU -EUH,EUU -FUH,FUU -GUH,GUU -HUH,HUU -IUH,IUU -JUH,JUU -KUH,KUU -LUH,LUU -MUH,MUU -NUH,NUU -OUH,OUU -PUH,PUU -QUH,QUU -RUH,RUU -SUH,SUU -TUH,TUU -UUH,UUU -VUH,VUU -WUH,WUU -XUH,XUU -YUH,YUU -ZUH,ZUU -AVH,AVU -BVH,BVU -CVH,CVU -DVH,DVU -EVH,EVU -FVH,FVU -GVH,GVU -HVH,HVU -IVH,IVU -JVH,JVU -KVH,KVU -LVH,LVU -MVH,MVU -NVH,NVU -OVH,OVU -PVH,PVU -QVH,QVU -RVH,RVU -SVH,SVU -TVH,TVU -UVH,UVU -VVH,VVU -WVH,WVU -XVH,XVU -YVH,YVU -ZVH,ZVU -AWH,AWU -BWH,BWU -CWH,CWU -DWH,DWU -EWH,EWU -FWH,FWU -GWH,GWU -HWH,HWU -IWH,IWU -JWH,JWU -KWH,KWU -LWH,LWU -MWH,MWU -NWH,NWU -OWH,OWU -PWH,PWU -QWH,QWU -RWH,RWU -SWH,SWU -TWH,TWU -UWH,UWU -VWH,VWU -WWH,WWU -XWH,XWU -YWH,YWU -ZWH,ZWU -AXH,AXU -BXH,BXU -CXH,CXU -DXH,DXU -EXH,EXU -FXH,FXU -GXH,GXU -HXH,HXU -IXH,IXU -JXH,JXU -KXH,KXU -LXH,LXU -MXH,MXU -NXH,NXU -OXH,OXU -PXH,PXU -QXH,QXU -RXH,RXU -SXH,SXU -TXH,TXU -UXH,UXU -VXH,VXU -WXH,WXU -XXH,XXU -YXH,YXU -ZXH,ZXU -AYH,AYU -BYH,BYU -CYH,CYU -DYH,DYU -EYH,EYU -FYH,FYU -GYH,GYU -HYH,HYU -IYH,IYU -JYH,JYU -KYH,KYU -LYH,LYU -MYH,MYU -NYH,NYU -OYH,OYU -PYH,PYU -QYH,QYU -RYH,RYU -SYH,SYU -TYH,TYU -UYH,UYU -VYH,VYU -WYH,WYU -XYH,XYU -YYH,YYU -ZYH,ZYU -AZH,AZU -BZH,BZU -CZH,CZU -DZH,DZU -EZH,EZU -FZH,FZU -GZH,GZU -HZH,HZU -IZH,IZU -JZH,JZU -KZH,KZU -LZH,LZU -MZH,MZU -NZH,NZU -OZH,OZU -PZH,PZU -QZH,QZU -RZH,RZU -SZH,SZU -TZH,TZU -UZH,UZU -VZH,VZU -WZH,WZU -XZH,XZU -YZH,YZU -ZZH,ZZU -AAI,AAV -BAI,BAV -CAI,CAV -DAI,DAV -EAI,EAV -FAI,FAV -GAI,GAV -HAI,HAV -IAI,IAV -JAI,JAV -KAI,KAV -LAI,LAV -MAI,MAV -NAI,NAV -OAI,OAV -PAI,PAV -QAI,QAV -RAI,RAV -SAI,SAV -TAI,TAV -UAI,UAV -VAI,VAV -WAI,WAV -XAI,XAV -YAI,YAV -ZAI,ZAV -ABI,ABV -BBI,BBV -CBI,CBV -DBI,DBV -EBI,EBV -FBI,FBV -GBI,GBV -HBI,HBV -IBI,IBV -JBI,JBV -KBI,KBV -LBI,LBV -MBI,MBV -NBI,NBV -OBI,OBV -PBI,PBV -QBI,QBV -RBI,RBV -SBI,SBV -TBI,TBV -UBI,UBV -VBI,VBV -WBI,WBV -XBI,XBV -YBI,YBV -ZBI,ZBV -ACI,ACV -BCI,BCV -CCI,CCV -DCI,DCV -ECI,ECV -FCI,FCV -GCI,GCV -HCI,HCV -ICI,ICV -JCI,JCV -KCI,KCV -LCI,LCV -MCI,MCV -NCI,NCV -OCI,OCV -PCI,PCV -QCI,QCV -RCI,RCV -SCI,SCV -TCI,TCV -UCI,UCV -VCI,VCV -WCI,WCV -XCI,XCV -YCI,YCV -ZCI,ZCV -ADI,ADV -BDI,BDV -CDI,CDV -DDI,DDV -EDI,EDV -FDI,FDV -GDI,GDV -HDI,HDV -IDI,IDV -JDI,JDV -KDI,KDV -LDI,LDV -MDI,MDV -NDI,NDV -ODI,ODV -PDI,PDV -QDI,QDV -RDI,RDV -SDI,SDV -TDI,TDV -UDI,UDV -VDI,VDV -WDI,WDV -XDI,XDV -YDI,YDV -ZDI,ZDV -AEI,AEV -BEI,BEV -CEI,CEV -DEI,DEV -EEI,EEV -FEI,FEV -GEI,GEV -HEI,HEV -IEI,IEV -JEI,JEV -KEI,KEV -LEI,LEV -MEI,MEV -NEI,NEV -OEI,OEV -PEI,PEV -QEI,QEV -REI,REV -SEI,SEV -TEI,TEV -UEI,UEV -VEI,VEV -WEI,WEV -XEI,XEV -YEI,YEV -ZEI,ZEV -AFI,AFV -BFI,BFV -CFI,CFV -DFI,DFV -EFI,EFV -FFI,FFV -GFI,GFV -HFI,HFV -IFI,IFV -JFI,JFV -KFI,KFV -LFI,LFV -MFI,MFV -NFI,NFV -OFI,OFV -PFI,PFV -QFI,QFV -RFI,RFV -SFI,SFV -TFI,TFV -UFI,UFV -VFI,VFV -WFI,WFV -XFI,XFV -YFI,YFV -ZFI,ZFV -AGI,AGV -BGI,BGV -CGI,CGV -DGI,DGV -EGI,EGV -FGI,FGV -GGI,GGV -HGI,HGV -IGI,IGV -JGI,JGV -KGI,KGV -LGI,LGV -MGI,MGV -NGI,NGV -OGI,OGV -PGI,PGV -QGI,QGV -RGI,RGV -SGI,SGV -TGI,TGV -UGI,UGV -VGI,VGV -WGI,WGV -XGI,XGV -YGI,YGV -ZGI,ZGV -AHI,AHV -BHI,BHV -CHI,CHV -DHI,DHV -EHI,EHV -FHI,FHV -GHI,GHV -HHI,HHV -IHI,IHV -JHI,JHV -KHI,KHV -LHI,LHV -MHI,MHV -NHI,NHV -OHI,OHV -PHI,PHV -QHI,QHV -RHI,RHV -SHI,SHV -THI,THV -UHI,UHV -VHI,VHV -WHI,WHV -XHI,XHV -YHI,YHV -ZHI,ZHV -AII,AIV -BII,BIV -CII,CIV -DII,DIV -EII,EIV -FII,FIV -GII,GIV -HII,HIV -III,IIV -JII,JIV -KII,KIV -LII,LIV -MII,MIV -NII,NIV -OII,OIV -PII,PIV -QII,QIV -RII,RIV -SII,SIV -TII,TIV -UII,UIV -VII,VIV -WII,WIV -XII,XIV -YII,YIV -ZII,ZIV -AJI,AJV -BJI,BJV -CJI,CJV -DJI,DJV -EJI,EJV -FJI,FJV -GJI,GJV -HJI,HJV -IJI,IJV -JJI,JJV -KJI,KJV -LJI,LJV -MJI,MJV -NJI,NJV -OJI,OJV -PJI,PJV -QJI,QJV -RJI,RJV -SJI,SJV -TJI,TJV -UJI,UJV -VJI,VJV -WJI,WJV -XJI,XJV -YJI,YJV -ZJI,ZJV -AKI,AKV -BKI,BKV -CKI,CKV -DKI,DKV -EKI,EKV -FKI,FKV -GKI,GKV -HKI,HKV -IKI,IKV -JKI,JKV -KKI,KKV -LKI,LKV -MKI,MKV -NKI,NKV -OKI,OKV -PKI,PKV -QKI,QKV -RKI,RKV -SKI,SKV -TKI,TKV -UKI,UKV -VKI,VKV -WKI,WKV -XKI,XKV -YKI,YKV -ZKI,ZKV -ALI,ALV -BLI,BLV -CLI,CLV -DLI,DLV -ELI,ELV -FLI,FLV -GLI,GLV -HLI,HLV -ILI,ILV -JLI,JLV -KLI,KLV -LLI,LLV -MLI,MLV -NLI,NLV -OLI,OLV -PLI,PLV -QLI,QLV -RLI,RLV -SLI,SLV -TLI,TLV -ULI,ULV -VLI,VLV -WLI,WLV -XLI,XLV -YLI,YLV -ZLI,ZLV -AMI,AMV -BMI,BMV -CMI,CMV -DMI,DMV -EMI,EMV -FMI,FMV -GMI,GMV -HMI,HMV -IMI,IMV -JMI,JMV -KMI,KMV -LMI,LMV -MMI,MMV -NMI,NMV -OMI,OMV -PMI,PMV -QMI,QMV -RMI,RMV -SMI,SMV -TMI,TMV -UMI,UMV -VMI,VMV -WMI,WMV -XMI,XMV -YMI,YMV -ZMI,ZMV -ANI,ANV -BNI,BNV -CNI,CNV -DNI,DNV -ENI,ENV -FNI,FNV -GNI,GNV -HNI,HNV -INI,INV -JNI,JNV -KNI,KNV -LNI,LNV -MNI,MNV -NNI,NNV -ONI,ONV -PNI,PNV -QNI,QNV -RNI,RNV -SNI,SNV -TNI,TNV -UNI,UNV -VNI,VNV -WNI,WNV -XNI,XNV -YNI,YNV -ZNI,ZNV -AOI,AOV -BOI,BOV -COI,COV -DOI,DOV -EOI,EOV -FOI,FOV -GOI,GOV -HOI,HOV -IOI,IOV -JOI,JOV -KOI,KOV -LOI,LOV -MOI,MOV -NOI,NOV -OOI,OOV -POI,POV -QOI,QOV -ROI,ROV -SOI,SOV -TOI,TOV -UOI,UOV -VOI,VOV -WOI,WOV -XOI,XOV -YOI,YOV -ZOI,ZOV -API,APV -BPI,BPV -CPI,CPV -DPI,DPV -EPI,EPV -FPI,FPV -GPI,GPV -HPI,HPV -IPI,IPV -JPI,JPV -KPI,KPV -LPI,LPV -MPI,MPV -NPI,NPV -OPI,OPV -PPI,PPV -QPI,QPV -RPI,RPV -SPI,SPV -TPI,TPV -UPI,UPV -VPI,VPV -WPI,WPV -XPI,XPV -YPI,YPV -ZPI,ZPV -AQI,AQV -BQI,BQV -CQI,CQV -DQI,DQV -EQI,EQV -FQI,FQV -GQI,GQV -HQI,HQV -IQI,IQV -JQI,JQV -KQI,KQV -LQI,LQV -MQI,MQV -NQI,NQV -OQI,OQV -PQI,PQV -QQI,QQV -RQI,RQV -SQI,SQV -TQI,TQV -UQI,UQV -VQI,VQV -WQI,WQV -XQI,XQV -YQI,YQV -ZQI,ZQV -ARI,ARV -BRI,BRV -CRI,CRV -DRI,DRV -ERI,ERV -FRI,FRV -GRI,GRV -HRI,HRV -IRI,IRV -JRI,JRV -KRI,KRV -LRI,LRV -MRI,MRV -NRI,NRV -ORI,ORV -PRI,PRV -QRI,QRV -RRI,RRV -SRI,SRV -TRI,TRV -URI,URV -VRI,VRV -WRI,WRV -XRI,XRV -YRI,YRV -ZRI,ZRV -ASI,ASV -BSI,BSV -CSI,CSV -DSI,DSV -ESI,ESV -FSI,FSV -GSI,GSV -HSI,HSV -ISI,ISV -JSI,JSV -KSI,KSV -LSI,LSV -MSI,MSV -NSI,NSV -OSI,OSV -PSI,PSV -QSI,QSV -RSI,RSV -SSI,SSV -TSI,TSV -USI,USV -VSI,VSV -WSI,WSV -XSI,XSV -YSI,YSV -ZSI,ZSV -ATI,ATV -BTI,BTV -CTI,CTV -DTI,DTV -ETI,ETV -FTI,FTV -GTI,GTV -HTI,HTV -ITI,ITV -JTI,JTV -KTI,KTV -LTI,LTV -MTI,MTV -NTI,NTV -OTI,OTV -PTI,PTV -QTI,QTV -RTI,RTV -STI,STV -TTI,TTV -UTI,UTV -VTI,VTV -WTI,WTV -XTI,XTV -YTI,YTV -ZTI,ZTV -AUI,AUV -BUI,BUV -CUI,CUV -DUI,DUV -EUI,EUV -FUI,FUV -GUI,GUV -HUI,HUV -IUI,IUV -JUI,JUV -KUI,KUV -LUI,LUV -MUI,MUV -NUI,NUV -OUI,OUV -PUI,PUV -QUI,QUV -RUI,RUV -SUI,SUV -TUI,TUV -UUI,UUV -VUI,VUV -WUI,WUV -XUI,XUV -YUI,YUV -ZUI,ZUV -AVI,AVV -BVI,BVV -CVI,CVV -DVI,DVV -EVI,EVV -FVI,FVV -GVI,GVV -HVI,HVV -IVI,IVV -JVI,JVV -KVI,KVV -LVI,LVV -MVI,MVV -NVI,NVV -OVI,OVV -PVI,PVV -QVI,QVV -RVI,RVV -SVI,SVV -TVI,TVV -UVI,UVV -VVI,VVV -WVI,WVV -XVI,XVV -YVI,YVV -ZVI,ZVV -AWI,AWV -BWI,BWV -CWI,CWV -DWI,DWV -EWI,EWV -FWI,FWV -GWI,GWV -HWI,HWV -IWI,IWV -JWI,JWV -KWI,KWV -LWI,LWV -MWI,MWV -NWI,NWV -OWI,OWV -PWI,PWV -QWI,QWV -RWI,RWV -SWI,SWV -TWI,TWV -UWI,UWV -VWI,VWV -WWI,WWV -XWI,XWV -YWI,YWV -ZWI,ZWV -AXI,AXV -BXI,BXV -CXI,CXV -DXI,DXV -EXI,EXV -FXI,FXV -GXI,GXV -HXI,HXV -IXI,IXV -JXI,JXV -KXI,KXV -LXI,LXV -MXI,MXV -NXI,NXV -OXI,OXV -PXI,PXV -QXI,QXV -RXI,RXV -SXI,SXV -TXI,TXV -UXI,UXV -VXI,VXV -WXI,WXV -XXI,XXV -YXI,YXV -ZXI,ZXV -AYI,AYV -BYI,BYV -CYI,CYV -DYI,DYV -EYI,EYV -FYI,FYV -GYI,GYV -HYI,HYV -IYI,IYV -JYI,JYV -KYI,KYV -LYI,LYV -MYI,MYV -NYI,NYV -OYI,OYV -PYI,PYV -QYI,QYV -RYI,RYV -SYI,SYV -TYI,TYV -UYI,UYV -VYI,VYV -WYI,WYV -XYI,XYV -YYI,YYV -ZYI,ZYV -AZI,AZV -BZI,BZV -CZI,CZV -DZI,DZV -EZI,EZV -FZI,FZV -GZI,GZV -HZI,HZV -IZI,IZV -JZI,JZV -KZI,KZV -LZI,LZV -MZI,MZV -NZI,NZV -OZI,OZV -PZI,PZV -QZI,QZV -RZI,RZV -SZI,SZV -TZI,TZV -UZI,UZV -VZI,VZV -WZI,WZV -XZI,XZV -YZI,YZV -ZZI,ZZV -AAJ,AAW -BAJ,BAW -CAJ,CAW -DAJ,DAW -EAJ,EAW -FAJ,FAW -GAJ,GAW -HAJ,HAW -IAJ,IAW -JAJ,JAW -KAJ,KAW -LAJ,LAW -MAJ,MAW -NAJ,NAW -OAJ,OAW -PAJ,PAW -QAJ,QAW -RAJ,RAW -SAJ,SAW -TAJ,TAW -UAJ,UAW -VAJ,VAW -WAJ,WAW -XAJ,XAW -YAJ,YAW -ZAJ,ZAW -ABJ,ABW -BBJ,BBW -CBJ,CBW -DBJ,DBW -EBJ,EBW -FBJ,FBW -GBJ,GBW -HBJ,HBW -IBJ,IBW -JBJ,JBW -KBJ,KBW -LBJ,LBW -MBJ,MBW -NBJ,NBW -OBJ,OBW -PBJ,PBW -QBJ,QBW -RBJ,RBW -SBJ,SBW -TBJ,TBW -UBJ,UBW -VBJ,VBW -WBJ,WBW -XBJ,XBW -YBJ,YBW -ZBJ,ZBW -ACJ,ACW -BCJ,BCW -CCJ,CCW -DCJ,DCW -ECJ,ECW -FCJ,FCW -GCJ,GCW -HCJ,HCW -ICJ,ICW -JCJ,JCW -KCJ,KCW -LCJ,LCW -MCJ,MCW -NCJ,NCW -OCJ,OCW -PCJ,PCW -QCJ,QCW -RCJ,RCW -SCJ,SCW -TCJ,TCW -UCJ,UCW -VCJ,VCW -WCJ,WCW -XCJ,XCW -YCJ,YCW -ZCJ,ZCW -ADJ,ADW -BDJ,BDW -CDJ,CDW -DDJ,DDW -EDJ,EDW -FDJ,FDW -GDJ,GDW -HDJ,HDW -IDJ,IDW -JDJ,JDW -KDJ,KDW -LDJ,LDW -MDJ,MDW -NDJ,NDW -ODJ,ODW -PDJ,PDW -QDJ,QDW -RDJ,RDW -SDJ,SDW -TDJ,TDW -UDJ,UDW -VDJ,VDW -WDJ,WDW -XDJ,XDW -YDJ,YDW -ZDJ,ZDW -AEJ,AEW -BEJ,BEW -CEJ,CEW -DEJ,DEW -EEJ,EEW -FEJ,FEW -GEJ,GEW -HEJ,HEW -IEJ,IEW -JEJ,JEW -KEJ,KEW -LEJ,LEW -MEJ,MEW -NEJ,NEW -OEJ,OEW -PEJ,PEW -QEJ,QEW -REJ,REW -SEJ,SEW -TEJ,TEW -UEJ,UEW -VEJ,VEW -WEJ,WEW -XEJ,XEW -YEJ,YEW -ZEJ,ZEW -AFJ,AFW -BFJ,BFW -CFJ,CFW -DFJ,DFW -EFJ,EFW -FFJ,FFW -GFJ,GFW -HFJ,HFW -IFJ,IFW -JFJ,JFW -KFJ,KFW -LFJ,LFW -MFJ,MFW -NFJ,NFW -OFJ,OFW -PFJ,PFW -QFJ,QFW -RFJ,RFW -SFJ,SFW -TFJ,TFW -UFJ,UFW -VFJ,VFW -WFJ,WFW -XFJ,XFW -YFJ,YFW -ZFJ,ZFW -AGJ,AGW -BGJ,BGW -CGJ,CGW -DGJ,DGW -EGJ,EGW -FGJ,FGW -GGJ,GGW -HGJ,HGW -IGJ,IGW -JGJ,JGW -KGJ,KGW -LGJ,LGW -MGJ,MGW -NGJ,NGW -OGJ,OGW -PGJ,PGW -QGJ,QGW -RGJ,RGW -SGJ,SGW -TGJ,TGW -UGJ,UGW -VGJ,VGW -WGJ,WGW -XGJ,XGW -YGJ,YGW -ZGJ,ZGW -AHJ,AHW -BHJ,BHW -CHJ,CHW -DHJ,DHW -EHJ,EHW -FHJ,FHW -GHJ,GHW -HHJ,HHW -IHJ,IHW -JHJ,JHW -KHJ,KHW -LHJ,LHW -MHJ,MHW -NHJ,NHW -OHJ,OHW -PHJ,PHW -QHJ,QHW -RHJ,RHW -SHJ,SHW -THJ,THW -UHJ,UHW -VHJ,VHW -WHJ,WHW -XHJ,XHW -YHJ,YHW -ZHJ,ZHW -AIJ,AIW -BIJ,BIW -CIJ,CIW -DIJ,DIW -EIJ,EIW -FIJ,FIW -GIJ,GIW -HIJ,HIW -IIJ,IIW -JIJ,JIW -KIJ,KIW -LIJ,LIW -MIJ,MIW -NIJ,NIW -OIJ,OIW -PIJ,PIW -QIJ,QIW -RIJ,RIW -SIJ,SIW -TIJ,TIW -UIJ,UIW -VIJ,VIW -WIJ,WIW -XIJ,XIW -YIJ,YIW -ZIJ,ZIW -AJJ,AJW -BJJ,BJW -CJJ,CJW -DJJ,DJW -EJJ,EJW -FJJ,FJW -GJJ,GJW -HJJ,HJW -IJJ,IJW -JJJ,JJW -KJJ,KJW -LJJ,LJW -MJJ,MJW -NJJ,NJW -OJJ,OJW -PJJ,PJW -QJJ,QJW -RJJ,RJW -SJJ,SJW -TJJ,TJW -UJJ,UJW -VJJ,VJW -WJJ,WJW -XJJ,XJW -YJJ,YJW -ZJJ,ZJW -AKJ,AKW -BKJ,BKW -CKJ,CKW -DKJ,DKW -EKJ,EKW -FKJ,FKW -GKJ,GKW -HKJ,HKW -IKJ,IKW -JKJ,JKW -KKJ,KKW -LKJ,LKW -MKJ,MKW -NKJ,NKW -OKJ,OKW -PKJ,PKW -QKJ,QKW -RKJ,RKW -SKJ,SKW -TKJ,TKW -UKJ,UKW -VKJ,VKW -WKJ,WKW -XKJ,XKW -YKJ,YKW -ZKJ,ZKW -ALJ,ALW -BLJ,BLW -CLJ,CLW -DLJ,DLW -ELJ,ELW -FLJ,FLW -GLJ,GLW -HLJ,HLW -ILJ,ILW -JLJ,JLW -KLJ,KLW -LLJ,LLW -MLJ,MLW -NLJ,NLW -OLJ,OLW -PLJ,PLW -QLJ,QLW -RLJ,RLW -SLJ,SLW -TLJ,TLW -ULJ,ULW -VLJ,VLW -WLJ,WLW -XLJ,XLW -YLJ,YLW -ZLJ,ZLW -AMJ,AMW -BMJ,BMW -CMJ,CMW -DMJ,DMW -EMJ,EMW -FMJ,FMW -GMJ,GMW -HMJ,HMW -IMJ,IMW -JMJ,JMW -KMJ,KMW -LMJ,LMW -MMJ,MMW -NMJ,NMW -OMJ,OMW -PMJ,PMW -QMJ,QMW -RMJ,RMW -SMJ,SMW -TMJ,TMW -UMJ,UMW -VMJ,VMW -WMJ,WMW -XMJ,XMW -YMJ,YMW -ZMJ,ZMW -ANJ,ANW -BNJ,BNW -CNJ,CNW -DNJ,DNW -ENJ,ENW -FNJ,FNW -GNJ,GNW -HNJ,HNW -INJ,INW -JNJ,JNW -KNJ,KNW -LNJ,LNW -MNJ,MNW -NNJ,NNW -ONJ,ONW -PNJ,PNW -QNJ,QNW -RNJ,RNW -SNJ,SNW -TNJ,TNW -UNJ,UNW -VNJ,VNW -WNJ,WNW -XNJ,XNW -YNJ,YNW -ZNJ,ZNW -AOJ,AOW -BOJ,BOW -COJ,COW -DOJ,DOW -EOJ,EOW -FOJ,FOW -GOJ,GOW -HOJ,HOW -IOJ,IOW -JOJ,JOW -KOJ,KOW -LOJ,LOW -MOJ,MOW -NOJ,NOW -OOJ,OOW -POJ,POW -QOJ,QOW -ROJ,ROW -SOJ,SOW -TOJ,TOW -UOJ,UOW -VOJ,VOW -WOJ,WOW -XOJ,XOW -YOJ,YOW -ZOJ,ZOW -APJ,APW -BPJ,BPW -CPJ,CPW -DPJ,DPW -EPJ,EPW -FPJ,FPW -GPJ,GPW -HPJ,HPW -IPJ,IPW -JPJ,JPW -KPJ,KPW -LPJ,LPW -MPJ,MPW -NPJ,NPW -OPJ,OPW -PPJ,PPW -QPJ,QPW -RPJ,RPW -SPJ,SPW -TPJ,TPW -UPJ,UPW -VPJ,VPW -WPJ,WPW -XPJ,XPW -YPJ,YPW -ZPJ,ZPW -AQJ,AQW -BQJ,BQW -CQJ,CQW -DQJ,DQW -EQJ,EQW -FQJ,FQW -GQJ,GQW -HQJ,HQW -IQJ,IQW -JQJ,JQW -KQJ,KQW -LQJ,LQW -MQJ,MQW -NQJ,NQW -OQJ,OQW -PQJ,PQW -QQJ,QQW -RQJ,RQW -SQJ,SQW -TQJ,TQW -UQJ,UQW -VQJ,VQW -WQJ,WQW -XQJ,XQW -YQJ,YQW -ZQJ,ZQW -ARJ,ARW -BRJ,BRW -CRJ,CRW -DRJ,DRW -ERJ,ERW -FRJ,FRW -GRJ,GRW -HRJ,HRW -IRJ,IRW -JRJ,JRW -KRJ,KRW -LRJ,LRW -MRJ,MRW -NRJ,NRW -ORJ,ORW -PRJ,PRW -QRJ,QRW -RRJ,RRW -SRJ,SRW -TRJ,TRW -URJ,URW -VRJ,VRW -WRJ,WRW -XRJ,XRW -YRJ,YRW -ZRJ,ZRW -ASJ,ASW -BSJ,BSW -CSJ,CSW -DSJ,DSW -ESJ,ESW -FSJ,FSW -GSJ,GSW -HSJ,HSW -ISJ,ISW -JSJ,JSW -KSJ,KSW -LSJ,LSW -MSJ,MSW -NSJ,NSW -OSJ,OSW -PSJ,PSW -QSJ,QSW -RSJ,RSW -SSJ,SSW -TSJ,TSW -USJ,USW -VSJ,VSW -WSJ,WSW -XSJ,XSW -YSJ,YSW -ZSJ,ZSW -ATJ,ATW -BTJ,BTW -CTJ,CTW -DTJ,DTW -ETJ,ETW -FTJ,FTW -GTJ,GTW -HTJ,HTW -ITJ,ITW -JTJ,JTW -KTJ,KTW -LTJ,LTW -MTJ,MTW -NTJ,NTW -OTJ,OTW -PTJ,PTW -QTJ,QTW -RTJ,RTW -STJ,STW -TTJ,TTW -UTJ,UTW -VTJ,VTW -WTJ,WTW -XTJ,XTW -YTJ,YTW -ZTJ,ZTW -AUJ,AUW -BUJ,BUW -CUJ,CUW -DUJ,DUW -EUJ,EUW -FUJ,FUW -GUJ,GUW -HUJ,HUW -IUJ,IUW -JUJ,JUW -KUJ,KUW -LUJ,LUW -MUJ,MUW -NUJ,NUW -OUJ,OUW -PUJ,PUW -QUJ,QUW -RUJ,RUW -SUJ,SUW -TUJ,TUW -UUJ,UUW -VUJ,VUW -WUJ,WUW -XUJ,XUW -YUJ,YUW -ZUJ,ZUW -AVJ,AVW -BVJ,BVW -CVJ,CVW -DVJ,DVW -EVJ,EVW -FVJ,FVW -GVJ,GVW -HVJ,HVW -IVJ,IVW -JVJ,JVW -KVJ,KVW -LVJ,LVW -MVJ,MVW -NVJ,NVW -OVJ,OVW -PVJ,PVW -QVJ,QVW -RVJ,RVW -SVJ,SVW -TVJ,TVW -UVJ,UVW -VVJ,VVW -WVJ,WVW -XVJ,XVW -YVJ,YVW -ZVJ,ZVW -AWJ,AWW -BWJ,BWW -CWJ,CWW -DWJ,DWW -EWJ,EWW -FWJ,FWW -GWJ,GWW -HWJ,HWW -IWJ,IWW -JWJ,JWW -KWJ,KWW -LWJ,LWW -MWJ,MWW -NWJ,NWW -OWJ,OWW -PWJ,PWW -QWJ,QWW -RWJ,RWW -SWJ,SWW -TWJ,TWW -UWJ,UWW -VWJ,VWW -WWJ,WWW -XWJ,XWW -YWJ,YWW -ZWJ,ZWW -AXJ,AXW -BXJ,BXW -CXJ,CXW -DXJ,DXW -EXJ,EXW -FXJ,FXW -GXJ,GXW -HXJ,HXW -IXJ,IXW -JXJ,JXW -KXJ,KXW -LXJ,LXW -MXJ,MXW -NXJ,NXW -OXJ,OXW -PXJ,PXW -QXJ,QXW -RXJ,RXW -SXJ,SXW -TXJ,TXW -UXJ,UXW -VXJ,VXW -WXJ,WXW -XXJ,XXW -YXJ,YXW -ZXJ,ZXW -AYJ,AYW -BYJ,BYW -CYJ,CYW -DYJ,DYW -EYJ,EYW -FYJ,FYW -GYJ,GYW -HYJ,HYW -IYJ,IYW -JYJ,JYW -KYJ,KYW -LYJ,LYW -MYJ,MYW -NYJ,NYW -OYJ,OYW -PYJ,PYW -QYJ,QYW -RYJ,RYW -SYJ,SYW -TYJ,TYW -UYJ,UYW -VYJ,VYW -WYJ,WYW -XYJ,XYW -YYJ,YYW -ZYJ,ZYW -AZJ,AZW -BZJ,BZW -CZJ,CZW -DZJ,DZW -EZJ,EZW -FZJ,FZW -GZJ,GZW -HZJ,HZW -IZJ,IZW -JZJ,JZW -KZJ,KZW -LZJ,LZW -MZJ,MZW -NZJ,NZW -OZJ,OZW -PZJ,PZW -QZJ,QZW -RZJ,RZW -SZJ,SZW -TZJ,TZW -UZJ,UZW -VZJ,VZW -WZJ,WZW -XZJ,XZW -YZJ,YZW -ZZJ,ZZW -AAK,AAX -BAK,BAX -CAK,CAX -DAK,DAX -EAK,EAX -FAK,FAX -GAK,GAX -HAK,HAX -IAK,IAX -JAK,JAX -KAK,KAX -LAK,LAX -MAK,MAX -NAK,NAX -OAK,OAX -PAK,PAX -QAK,QAX -RAK,RAX -SAK,SAX -TAK,TAX -UAK,UAX -VAK,VAX -WAK,WAX -XAK,XAX -YAK,YAX -ZAK,ZAX -ABK,ABX -BBK,BBX -CBK,CBX -DBK,DBX -EBK,EBX -FBK,FBX -GBK,GBX -HBK,HBX -IBK,IBX -JBK,JBX -KBK,KBX -LBK,LBX -MBK,MBX -NBK,NBX -OBK,OBX -PBK,PBX -QBK,QBX -RBK,RBX -SBK,SBX -TBK,TBX -UBK,UBX -VBK,VBX -WBK,WBX -XBK,XBX -YBK,YBX -ZBK,ZBX -ACK,ACX -BCK,BCX -CCK,CCX -DCK,DCX -ECK,ECX -FCK,FCX -GCK,GCX -HCK,HCX -ICK,ICX -JCK,JCX -KCK,KCX -LCK,LCX -MCK,MCX -NCK,NCX -OCK,OCX -PCK,PCX -QCK,QCX -RCK,RCX -SCK,SCX -TCK,TCX -UCK,UCX -VCK,VCX -WCK,WCX -XCK,XCX -YCK,YCX -ZCK,ZCX -ADK,ADX -BDK,BDX -CDK,CDX -DDK,DDX -EDK,EDX -FDK,FDX -GDK,GDX -HDK,HDX -IDK,IDX -JDK,JDX -KDK,KDX -LDK,LDX -MDK,MDX -NDK,NDX -ODK,ODX -PDK,PDX -QDK,QDX -RDK,RDX -SDK,SDX -TDK,TDX -UDK,UDX -VDK,VDX -WDK,WDX -XDK,XDX -YDK,YDX -ZDK,ZDX -AEK,AEX -BEK,BEX -CEK,CEX -DEK,DEX -EEK,EEX -FEK,FEX -GEK,GEX -HEK,HEX -IEK,IEX -JEK,JEX -KEK,KEX -LEK,LEX -MEK,MEX -NEK,NEX -OEK,OEX -PEK,PEX -QEK,QEX -REK,REX -SEK,SEX -TEK,TEX -UEK,UEX -VEK,VEX -WEK,WEX -XEK,XEX -YEK,YEX -ZEK,ZEX -AFK,AFX -BFK,BFX -CFK,CFX -DFK,DFX -EFK,EFX -FFK,FFX -GFK,GFX -HFK,HFX -IFK,IFX -JFK,JFX -KFK,KFX -LFK,LFX -MFK,MFX -NFK,NFX -OFK,OFX -PFK,PFX -QFK,QFX -RFK,RFX -SFK,SFX -TFK,TFX -UFK,UFX -VFK,VFX -WFK,WFX -XFK,XFX -YFK,YFX -ZFK,ZFX -AGK,AGX -BGK,BGX -CGK,CGX -DGK,DGX -EGK,EGX -FGK,FGX -GGK,GGX -HGK,HGX -IGK,IGX -JGK,JGX -KGK,KGX -LGK,LGX -MGK,MGX -NGK,NGX -OGK,OGX -PGK,PGX -QGK,QGX -RGK,RGX -SGK,SGX -TGK,TGX -UGK,UGX -VGK,VGX -WGK,WGX -XGK,XGX -YGK,YGX -ZGK,ZGX -AHK,AHX -BHK,BHX -CHK,CHX -DHK,DHX -EHK,EHX -FHK,FHX -GHK,GHX -HHK,HHX -IHK,IHX -JHK,JHX -KHK,KHX -LHK,LHX -MHK,MHX -NHK,NHX -OHK,OHX -PHK,PHX -QHK,QHX -RHK,RHX -SHK,SHX -THK,THX -UHK,UHX -VHK,VHX -WHK,WHX -XHK,XHX -YHK,YHX -ZHK,ZHX -AIK,AIX -BIK,BIX -CIK,CIX -DIK,DIX -EIK,EIX -FIK,FIX -GIK,GIX -HIK,HIX -IIK,IIX -JIK,JIX -KIK,KIX -LIK,LIX -MIK,MIX -NIK,NIX -OIK,OIX -PIK,PIX -QIK,QIX -RIK,RIX -SIK,SIX -TIK,TIX -UIK,UIX -VIK,VIX -WIK,WIX -XIK,XIX -YIK,YIX -ZIK,ZIX -AJK,AJX -BJK,BJX -CJK,CJX -DJK,DJX -EJK,EJX -FJK,FJX -GJK,GJX -HJK,HJX -IJK,IJX -JJK,JJX -KJK,KJX -LJK,LJX -MJK,MJX -NJK,NJX -OJK,OJX -PJK,PJX -QJK,QJX -RJK,RJX -SJK,SJX -TJK,TJX -UJK,UJX -VJK,VJX -WJK,WJX -XJK,XJX -YJK,YJX -ZJK,ZJX -AKK,AKX -BKK,BKX -CKK,CKX -DKK,DKX -EKK,EKX -FKK,FKX -GKK,GKX -HKK,HKX -IKK,IKX -JKK,JKX -KKK,KKX -LKK,LKX -MKK,MKX -NKK,NKX -OKK,OKX -PKK,PKX -QKK,QKX -RKK,RKX -SKK,SKX -TKK,TKX -UKK,UKX -VKK,VKX -WKK,WKX -XKK,XKX -YKK,YKX -ZKK,ZKX -ALK,ALX -BLK,BLX -CLK,CLX -DLK,DLX -ELK,ELX -FLK,FLX -GLK,GLX -HLK,HLX -ILK,ILX -JLK,JLX -KLK,KLX -LLK,LLX -MLK,MLX -NLK,NLX -OLK,OLX -PLK,PLX -QLK,QLX -RLK,RLX -SLK,SLX -TLK,TLX -ULK,ULX -VLK,VLX -WLK,WLX -XLK,XLX -YLK,YLX -ZLK,ZLX -AMK,AMX -BMK,BMX -CMK,CMX -DMK,DMX -EMK,EMX -FMK,FMX -GMK,GMX -HMK,HMX -IMK,IMX -JMK,JMX -KMK,KMX -LMK,LMX -MMK,MMX -NMK,NMX -OMK,OMX -PMK,PMX -QMK,QMX -RMK,RMX -SMK,SMX -TMK,TMX -UMK,UMX -VMK,VMX -WMK,WMX -XMK,XMX -YMK,YMX -ZMK,ZMX -ANK,ANX -BNK,BNX -CNK,CNX -DNK,DNX -ENK,ENX -FNK,FNX -GNK,GNX -HNK,HNX -INK,INX -JNK,JNX -KNK,KNX -LNK,LNX -MNK,MNX -NNK,NNX -ONK,ONX -PNK,PNX -QNK,QNX -RNK,RNX -SNK,SNX -TNK,TNX -UNK,UNX -VNK,VNX -WNK,WNX -XNK,XNX -YNK,YNX -ZNK,ZNX -AOK,AOX -BOK,BOX -COK,COX -DOK,DOX -EOK,EOX -FOK,FOX -GOK,GOX -HOK,HOX -IOK,IOX -JOK,JOX -KOK,KOX -LOK,LOX -MOK,MOX -NOK,NOX -OOK,OOX -POK,POX -QOK,QOX -ROK,ROX -SOK,SOX -TOK,TOX -UOK,UOX -VOK,VOX -WOK,WOX -XOK,XOX -YOK,YOX -ZOK,ZOX -APK,APX -BPK,BPX -CPK,CPX -DPK,DPX -EPK,EPX -FPK,FPX -GPK,GPX -HPK,HPX -IPK,IPX -JPK,JPX -KPK,KPX -LPK,LPX -MPK,MPX -NPK,NPX -OPK,OPX -PPK,PPX -QPK,QPX -RPK,RPX -SPK,SPX -TPK,TPX -UPK,UPX -VPK,VPX -WPK,WPX -XPK,XPX -YPK,YPX -ZPK,ZPX -AQK,AQX -BQK,BQX -CQK,CQX -DQK,DQX -EQK,EQX -FQK,FQX -GQK,GQX -HQK,HQX -IQK,IQX -JQK,JQX -KQK,KQX -LQK,LQX -MQK,MQX -NQK,NQX -OQK,OQX -PQK,PQX -QQK,QQX -RQK,RQX -SQK,SQX -TQK,TQX -UQK,UQX -VQK,VQX -WQK,WQX -XQK,XQX -YQK,YQX -ZQK,ZQX -ARK,ARX -BRK,BRX -CRK,CRX -DRK,DRX -ERK,ERX -FRK,FRX -GRK,GRX -HRK,HRX -IRK,IRX -JRK,JRX -KRK,KRX -LRK,LRX -MRK,MRX -NRK,NRX -ORK,ORX -PRK,PRX -QRK,QRX -RRK,RRX -SRK,SRX -TRK,TRX -URK,URX -VRK,VRX -WRK,WRX -XRK,XRX -YRK,YRX -ZRK,ZRX -ASK,ASX -BSK,BSX -CSK,CSX -DSK,DSX -ESK,ESX -FSK,FSX -GSK,GSX -HSK,HSX -ISK,ISX -JSK,JSX -KSK,KSX -LSK,LSX -MSK,MSX -NSK,NSX -OSK,OSX -PSK,PSX -QSK,QSX -RSK,RSX -SSK,SSX -TSK,TSX -USK,USX -VSK,VSX -WSK,WSX -XSK,XSX -YSK,YSX -ZSK,ZSX -ATK,ATX -BTK,BTX -CTK,CTX -DTK,DTX -ETK,ETX -FTK,FTX -GTK,GTX -HTK,HTX -ITK,ITX -JTK,JTX -KTK,KTX -LTK,LTX -MTK,MTX -NTK,NTX -OTK,OTX -PTK,PTX -QTK,QTX -RTK,RTX -STK,STX -TTK,TTX -UTK,UTX -VTK,VTX -WTK,WTX -XTK,XTX -YTK,YTX -ZTK,ZTX -AUK,AUX -BUK,BUX -CUK,CUX -DUK,DUX -EUK,EUX -FUK,FUX -GUK,GUX -HUK,HUX -IUK,IUX -JUK,JUX -KUK,KUX -LUK,LUX -MUK,MUX -NUK,NUX -OUK,OUX -PUK,PUX -QUK,QUX -RUK,RUX -SUK,SUX -TUK,TUX -UUK,UUX -VUK,VUX -WUK,WUX -XUK,XUX -YUK,YUX -ZUK,ZUX -AVK,AVX -BVK,BVX -CVK,CVX -DVK,DVX -EVK,EVX -FVK,FVX -GVK,GVX -HVK,HVX -IVK,IVX -JVK,JVX -KVK,KVX -LVK,LVX -MVK,MVX -NVK,NVX -OVK,OVX -PVK,PVX -QVK,QVX -RVK,RVX -SVK,SVX -TVK,TVX -UVK,UVX -VVK,VVX -WVK,WVX -XVK,XVX -YVK,YVX -ZVK,ZVX -AWK,AWX -BWK,BWX -CWK,CWX -DWK,DWX -EWK,EWX -FWK,FWX -GWK,GWX -HWK,HWX -IWK,IWX -JWK,JWX -KWK,KWX -LWK,LWX -MWK,MWX -NWK,NWX -OWK,OWX -PWK,PWX -QWK,QWX -RWK,RWX -SWK,SWX -TWK,TWX -UWK,UWX -VWK,VWX -WWK,WWX -XWK,XWX -YWK,YWX -ZWK,ZWX -AXK,AXX -BXK,BXX -CXK,CXX -DXK,DXX -EXK,EXX -FXK,FXX -GXK,GXX -HXK,HXX -IXK,IXX -JXK,JXX -KXK,KXX -LXK,LXX -MXK,MXX -NXK,NXX -OXK,OXX -PXK,PXX -QXK,QXX -RXK,RXX -SXK,SXX -TXK,TXX -UXK,UXX -VXK,VXX -WXK,WXX -XXK,XXX -YXK,YXX -ZXK,ZXX -AYK,AYX -BYK,BYX -CYK,CYX -DYK,DYX -EYK,EYX -FYK,FYX -GYK,GYX -HYK,HYX -IYK,IYX -JYK,JYX -KYK,KYX -LYK,LYX -MYK,MYX -NYK,NYX -OYK,OYX -PYK,PYX -QYK,QYX -RYK,RYX -SYK,SYX -TYK,TYX -UYK,UYX -VYK,VYX -WYK,WYX -XYK,XYX -YYK,YYX -ZYK,ZYX -AZK,AZX -BZK,BZX -CZK,CZX -DZK,DZX -EZK,EZX -FZK,FZX -GZK,GZX -HZK,HZX -IZK,IZX -JZK,JZX -KZK,KZX -LZK,LZX -MZK,MZX -NZK,NZX -OZK,OZX -PZK,PZX -QZK,QZX -RZK,RZX -SZK,SZX -TZK,TZX -UZK,UZX -VZK,VZX -WZK,WZX -XZK,XZX -YZK,YZX -ZZK,ZZX -AAL,AAY -BAL,BAY -CAL,CAY -DAL,DAY -EAL,EAY -FAL,FAY -GAL,GAY -HAL,HAY -IAL,IAY -JAL,JAY -KAL,KAY -LAL,LAY -MAL,MAY -NAL,NAY -OAL,OAY -PAL,PAY -QAL,QAY -RAL,RAY -SAL,SAY -TAL,TAY -UAL,UAY -VAL,VAY -WAL,WAY -XAL,XAY -YAL,YAY -ZAL,ZAY -ABL,ABY -BBL,BBY -CBL,CBY -DBL,DBY -EBL,EBY -FBL,FBY -GBL,GBY -HBL,HBY -IBL,IBY -JBL,JBY -KBL,KBY -LBL,LBY -MBL,MBY -NBL,NBY -OBL,OBY -PBL,PBY -QBL,QBY -RBL,RBY -SBL,SBY -TBL,TBY -UBL,UBY -VBL,VBY -WBL,WBY -XBL,XBY -YBL,YBY -ZBL,ZBY -ACL,ACY -BCL,BCY -CCL,CCY -DCL,DCY -ECL,ECY -FCL,FCY -GCL,GCY -HCL,HCY -ICL,ICY -JCL,JCY -KCL,KCY -LCL,LCY -MCL,MCY -NCL,NCY -OCL,OCY -PCL,PCY -QCL,QCY -RCL,RCY -SCL,SCY -TCL,TCY -UCL,UCY -VCL,VCY -WCL,WCY -XCL,XCY -YCL,YCY -ZCL,ZCY -ADL,ADY -BDL,BDY -CDL,CDY -DDL,DDY -EDL,EDY -FDL,FDY -GDL,GDY -HDL,HDY -IDL,IDY -JDL,JDY -KDL,KDY -LDL,LDY -MDL,MDY -NDL,NDY -ODL,ODY -PDL,PDY -QDL,QDY -RDL,RDY -SDL,SDY -TDL,TDY -UDL,UDY -VDL,VDY -WDL,WDY -XDL,XDY -YDL,YDY -ZDL,ZDY -AEL,AEY -BEL,BEY -CEL,CEY -DEL,DEY -EEL,EEY -FEL,FEY -GEL,GEY -HEL,HEY -IEL,IEY -JEL,JEY -KEL,KEY -LEL,LEY -MEL,MEY -NEL,NEY -OEL,OEY -PEL,PEY -QEL,QEY -REL,REY -SEL,SEY -TEL,TEY -UEL,UEY -VEL,VEY -WEL,WEY -XEL,XEY -YEL,YEY -ZEL,ZEY -AFL,AFY -BFL,BFY -CFL,CFY -DFL,DFY -EFL,EFY -FFL,FFY -GFL,GFY -HFL,HFY -IFL,IFY -JFL,JFY -KFL,KFY -LFL,LFY -MFL,MFY -NFL,NFY -OFL,OFY -PFL,PFY -QFL,QFY -RFL,RFY -SFL,SFY -TFL,TFY -UFL,UFY -VFL,VFY -WFL,WFY -XFL,XFY -YFL,YFY -ZFL,ZFY -AGL,AGY -BGL,BGY -CGL,CGY -DGL,DGY -EGL,EGY -FGL,FGY -GGL,GGY -HGL,HGY -IGL,IGY -JGL,JGY -KGL,KGY -LGL,LGY -MGL,MGY -NGL,NGY -OGL,OGY -PGL,PGY -QGL,QGY -RGL,RGY -SGL,SGY -TGL,TGY -UGL,UGY -VGL,VGY -WGL,WGY -XGL,XGY -YGL,YGY -ZGL,ZGY -AHL,AHY -BHL,BHY -CHL,CHY -DHL,DHY -EHL,EHY -FHL,FHY -GHL,GHY -HHL,HHY -IHL,IHY -JHL,JHY -KHL,KHY -LHL,LHY -MHL,MHY -NHL,NHY -OHL,OHY -PHL,PHY -QHL,QHY -RHL,RHY -SHL,SHY -THL,THY -UHL,UHY -VHL,VHY -WHL,WHY -XHL,XHY -YHL,YHY -ZHL,ZHY -AIL,AIY -BIL,BIY -CIL,CIY -DIL,DIY -EIL,EIY -FIL,FIY -GIL,GIY -HIL,HIY -IIL,IIY -JIL,JIY -KIL,KIY -LIL,LIY -MIL,MIY -NIL,NIY -OIL,OIY -PIL,PIY -QIL,QIY -RIL,RIY -SIL,SIY -TIL,TIY -UIL,UIY -VIL,VIY -WIL,WIY -XIL,XIY -YIL,YIY -ZIL,ZIY -AJL,AJY -BJL,BJY -CJL,CJY -DJL,DJY -EJL,EJY -FJL,FJY -GJL,GJY -HJL,HJY -IJL,IJY -JJL,JJY -KJL,KJY -LJL,LJY -MJL,MJY -NJL,NJY -OJL,OJY -PJL,PJY -QJL,QJY -RJL,RJY -SJL,SJY -TJL,TJY -UJL,UJY -VJL,VJY -WJL,WJY -XJL,XJY -YJL,YJY -ZJL,ZJY -AKL,AKY -BKL,BKY -CKL,CKY -DKL,DKY -EKL,EKY -FKL,FKY -GKL,GKY -HKL,HKY -IKL,IKY -JKL,JKY -KKL,KKY -LKL,LKY -MKL,MKY -NKL,NKY -OKL,OKY -PKL,PKY -QKL,QKY -RKL,RKY -SKL,SKY -TKL,TKY -UKL,UKY -VKL,VKY -WKL,WKY -XKL,XKY -YKL,YKY -ZKL,ZKY -ALL,ALY -BLL,BLY -CLL,CLY -DLL,DLY -ELL,ELY -FLL,FLY -GLL,GLY -HLL,HLY -ILL,ILY -JLL,JLY -KLL,KLY -LLL,LLY -MLL,MLY -NLL,NLY -OLL,OLY -PLL,PLY -QLL,QLY -RLL,RLY -SLL,SLY -TLL,TLY -ULL,ULY -VLL,VLY -WLL,WLY -XLL,XLY -YLL,YLY -ZLL,ZLY -AML,AMY -BML,BMY -CML,CMY -DML,DMY -EML,EMY -FML,FMY -GML,GMY -HML,HMY -IML,IMY -JML,JMY -KML,KMY -LML,LMY -MML,MMY -NML,NMY -OML,OMY -PML,PMY -QML,QMY -RML,RMY -SML,SMY -TML,TMY -UML,UMY -VML,VMY -WML,WMY -XML,XMY -YML,YMY -ZML,ZMY -ANL,ANY -BNL,BNY -CNL,CNY -DNL,DNY -ENL,ENY -FNL,FNY -GNL,GNY -HNL,HNY -INL,INY -JNL,JNY -KNL,KNY -LNL,LNY -MNL,MNY -NNL,NNY -ONL,ONY -PNL,PNY -QNL,QNY -RNL,RNY -SNL,SNY -TNL,TNY -UNL,UNY -VNL,VNY -WNL,WNY -XNL,XNY -YNL,YNY -ZNL,ZNY -AOL,AOY -BOL,BOY -COL,COY -DOL,DOY -EOL,EOY -FOL,FOY -GOL,GOY -HOL,HOY -IOL,IOY -JOL,JOY -KOL,KOY -LOL,LOY -MOL,MOY -NOL,NOY -OOL,OOY -POL,POY -QOL,QOY -ROL,ROY -SOL,SOY -TOL,TOY -UOL,UOY -VOL,VOY -WOL,WOY -XOL,XOY -YOL,YOY -ZOL,ZOY -APL,APY -BPL,BPY -CPL,CPY -DPL,DPY -EPL,EPY -FPL,FPY -GPL,GPY -HPL,HPY -IPL,IPY -JPL,JPY -KPL,KPY -LPL,LPY -MPL,MPY -NPL,NPY -OPL,OPY -PPL,PPY -QPL,QPY -RPL,RPY -SPL,SPY -TPL,TPY -UPL,UPY -VPL,VPY -WPL,WPY -XPL,XPY -YPL,YPY -ZPL,ZPY -AQL,AQY -BQL,BQY -CQL,CQY -DQL,DQY -EQL,EQY -FQL,FQY -GQL,GQY -HQL,HQY -IQL,IQY -JQL,JQY -KQL,KQY -LQL,LQY -MQL,MQY -NQL,NQY -OQL,OQY -PQL,PQY -QQL,QQY -RQL,RQY -SQL,SQY -TQL,TQY -UQL,UQY -VQL,VQY -WQL,WQY -XQL,XQY -YQL,YQY -ZQL,ZQY -ARL,ARY -BRL,BRY -CRL,CRY -DRL,DRY -ERL,ERY -FRL,FRY -GRL,GRY -HRL,HRY -IRL,IRY -JRL,JRY -KRL,KRY -LRL,LRY -MRL,MRY -NRL,NRY -ORL,ORY -PRL,PRY -QRL,QRY -RRL,RRY -SRL,SRY -TRL,TRY -URL,URY -VRL,VRY -WRL,WRY -XRL,XRY -YRL,YRY -ZRL,ZRY -ASL,ASY -BSL,BSY -CSL,CSY -DSL,DSY -ESL,ESY -FSL,FSY -GSL,GSY -HSL,HSY -ISL,ISY -JSL,JSY -KSL,KSY -LSL,LSY -MSL,MSY -NSL,NSY -OSL,OSY -PSL,PSY -QSL,QSY -RSL,RSY -SSL,SSY -TSL,TSY -USL,USY -VSL,VSY -WSL,WSY -XSL,XSY -YSL,YSY -ZSL,ZSY -ATL,ATY -BTL,BTY -CTL,CTY -DTL,DTY -ETL,ETY -FTL,FTY -GTL,GTY -HTL,HTY -ITL,ITY -JTL,JTY -KTL,KTY -LTL,LTY -MTL,MTY -NTL,NTY -OTL,OTY -PTL,PTY -QTL,QTY -RTL,RTY -STL,STY -TTL,TTY -UTL,UTY -VTL,VTY -WTL,WTY -XTL,XTY -YTL,YTY -ZTL,ZTY -AUL,AUY -BUL,BUY -CUL,CUY -DUL,DUY -EUL,EUY -FUL,FUY -GUL,GUY -HUL,HUY -IUL,IUY -JUL,JUY -KUL,KUY -LUL,LUY -MUL,MUY -NUL,NUY -OUL,OUY -PUL,PUY -QUL,QUY -RUL,RUY -SUL,SUY -TUL,TUY -UUL,UUY -VUL,VUY -WUL,WUY -XUL,XUY -YUL,YUY -ZUL,ZUY -AVL,AVY -BVL,BVY -CVL,CVY -DVL,DVY -EVL,EVY -FVL,FVY -GVL,GVY -HVL,HVY -IVL,IVY -JVL,JVY -KVL,KVY -LVL,LVY -MVL,MVY -NVL,NVY -OVL,OVY -PVL,PVY -QVL,QVY -RVL,RVY -SVL,SVY -TVL,TVY -UVL,UVY -VVL,VVY -WVL,WVY -XVL,XVY -YVL,YVY -ZVL,ZVY -AWL,AWY -BWL,BWY -CWL,CWY -DWL,DWY -EWL,EWY -FWL,FWY -GWL,GWY -HWL,HWY -IWL,IWY -JWL,JWY -KWL,KWY -LWL,LWY -MWL,MWY -NWL,NWY -OWL,OWY -PWL,PWY -QWL,QWY -RWL,RWY -SWL,SWY -TWL,TWY -UWL,UWY -VWL,VWY -WWL,WWY -XWL,XWY -YWL,YWY -ZWL,ZWY -AXL,AXY -BXL,BXY -CXL,CXY -DXL,DXY -EXL,EXY -FXL,FXY -GXL,GXY -HXL,HXY -IXL,IXY -JXL,JXY -KXL,KXY -LXL,LXY -MXL,MXY -NXL,NXY -OXL,OXY -PXL,PXY -QXL,QXY -RXL,RXY -SXL,SXY -TXL,TXY -UXL,UXY -VXL,VXY -WXL,WXY -XXL,XXY -YXL,YXY -ZXL,ZXY -AYL,AYY -BYL,BYY -CYL,CYY -DYL,DYY -EYL,EYY -FYL,FYY -GYL,GYY -HYL,HYY -IYL,IYY -JYL,JYY -KYL,KYY -LYL,LYY -MYL,MYY -NYL,NYY -OYL,OYY -PYL,PYY -QYL,QYY -RYL,RYY -SYL,SYY -TYL,TYY -UYL,UYY -VYL,VYY -WYL,WYY -XYL,XYY -YYL,YYY -ZYL,ZYY -AZL,AZY -BZL,BZY -CZL,CZY -DZL,DZY -EZL,EZY -FZL,FZY -GZL,GZY -HZL,HZY -IZL,IZY -JZL,JZY -KZL,KZY -LZL,LZY -MZL,MZY -NZL,NZY -OZL,OZY -PZL,PZY -QZL,QZY -RZL,RZY -SZL,SZY -TZL,TZY -UZL,UZY -VZL,VZY -WZL,WZY -XZL,XZY -YZL,YZY -ZZL,ZZY -AAM,AAZ -BAM,BAZ -CAM,CAZ -DAM,DAZ -EAM,EAZ -FAM,FAZ -GAM,GAZ -HAM,HAZ -IAM,IAZ -JAM,JAZ -KAM,KAZ -LAM,LAZ -MAM,MAZ -NAM,NAZ -OAM,OAZ -PAM,PAZ -QAM,QAZ -RAM,RAZ -SAM,SAZ -TAM,TAZ -UAM,UAZ -VAM,VAZ -WAM,WAZ -XAM,XAZ -YAM,YAZ -ZAM,ZAZ -ABM,ABZ -BBM,BBZ -CBM,CBZ -DBM,DBZ -EBM,EBZ -FBM,FBZ -GBM,GBZ -HBM,HBZ -IBM,IBZ -JBM,JBZ -KBM,KBZ -LBM,LBZ -MBM,MBZ -NBM,NBZ -OBM,OBZ -PBM,PBZ -QBM,QBZ -RBM,RBZ -SBM,SBZ -TBM,TBZ -UBM,UBZ -VBM,VBZ -WBM,WBZ -XBM,XBZ -YBM,YBZ -ZBM,ZBZ -ACM,ACZ -BCM,BCZ -CCM,CCZ -DCM,DCZ -ECM,ECZ -FCM,FCZ -GCM,GCZ -HCM,HCZ -ICM,ICZ -JCM,JCZ -KCM,KCZ -LCM,LCZ -MCM,MCZ -NCM,NCZ -OCM,OCZ -PCM,PCZ -QCM,QCZ -RCM,RCZ -SCM,SCZ -TCM,TCZ -UCM,UCZ -VCM,VCZ -WCM,WCZ -XCM,XCZ -YCM,YCZ -ZCM,ZCZ -ADM,ADZ -BDM,BDZ -CDM,CDZ -DDM,DDZ -EDM,EDZ -FDM,FDZ -GDM,GDZ -HDM,HDZ -IDM,IDZ -JDM,JDZ -KDM,KDZ -LDM,LDZ -MDM,MDZ -NDM,NDZ -ODM,ODZ -PDM,PDZ -QDM,QDZ -RDM,RDZ -SDM,SDZ -TDM,TDZ -UDM,UDZ -VDM,VDZ -WDM,WDZ -XDM,XDZ -YDM,YDZ -ZDM,ZDZ -AEM,AEZ -BEM,BEZ -CEM,CEZ -DEM,DEZ -EEM,EEZ -FEM,FEZ -GEM,GEZ -HEM,HEZ -IEM,IEZ -JEM,JEZ -KEM,KEZ -LEM,LEZ -MEM,MEZ -NEM,NEZ -OEM,OEZ -PEM,PEZ -QEM,QEZ -REM,REZ -SEM,SEZ -TEM,TEZ -UEM,UEZ -VEM,VEZ -WEM,WEZ -XEM,XEZ -YEM,YEZ -ZEM,ZEZ -AFM,AFZ -BFM,BFZ -CFM,CFZ -DFM,DFZ -EFM,EFZ -FFM,FFZ -GFM,GFZ -HFM,HFZ -IFM,IFZ -JFM,JFZ -KFM,KFZ -LFM,LFZ -MFM,MFZ -NFM,NFZ -OFM,OFZ -PFM,PFZ -QFM,QFZ -RFM,RFZ -SFM,SFZ -TFM,TFZ -UFM,UFZ -VFM,VFZ -WFM,WFZ -XFM,XFZ -YFM,YFZ -ZFM,ZFZ -AGM,AGZ -BGM,BGZ -CGM,CGZ -DGM,DGZ -EGM,EGZ -FGM,FGZ -GGM,GGZ -HGM,HGZ -IGM,IGZ -JGM,JGZ -KGM,KGZ -LGM,LGZ -MGM,MGZ -NGM,NGZ -OGM,OGZ -PGM,PGZ -QGM,QGZ -RGM,RGZ -SGM,SGZ -TGM,TGZ -UGM,UGZ -VGM,VGZ -WGM,WGZ -XGM,XGZ -YGM,YGZ -ZGM,ZGZ -AHM,AHZ -BHM,BHZ -CHM,CHZ -DHM,DHZ -EHM,EHZ -FHM,FHZ -GHM,GHZ -HHM,HHZ -IHM,IHZ -JHM,JHZ -KHM,KHZ -LHM,LHZ -MHM,MHZ -NHM,NHZ -OHM,OHZ -PHM,PHZ -QHM,QHZ -RHM,RHZ -SHM,SHZ -THM,THZ -UHM,UHZ -VHM,VHZ -WHM,WHZ -XHM,XHZ -YHM,YHZ -ZHM,ZHZ -AIM,AIZ -BIM,BIZ -CIM,CIZ -DIM,DIZ -EIM,EIZ -FIM,FIZ -GIM,GIZ -HIM,HIZ -IIM,IIZ -JIM,JIZ -KIM,KIZ -LIM,LIZ -MIM,MIZ -NIM,NIZ -OIM,OIZ -PIM,PIZ -QIM,QIZ -RIM,RIZ -SIM,SIZ -TIM,TIZ -UIM,UIZ -VIM,VIZ -WIM,WIZ -XIM,XIZ -YIM,YIZ -ZIM,ZIZ -AJM,AJZ -BJM,BJZ -CJM,CJZ -DJM,DJZ -EJM,EJZ -FJM,FJZ -GJM,GJZ -HJM,HJZ -IJM,IJZ -JJM,JJZ -KJM,KJZ -LJM,LJZ -MJM,MJZ -NJM,NJZ -OJM,OJZ -PJM,PJZ -QJM,QJZ -RJM,RJZ -SJM,SJZ -TJM,TJZ -UJM,UJZ -VJM,VJZ -WJM,WJZ -XJM,XJZ -YJM,YJZ -ZJM,ZJZ -AKM,AKZ -BKM,BKZ -CKM,CKZ -DKM,DKZ -EKM,EKZ -FKM,FKZ -GKM,GKZ -HKM,HKZ -IKM,IKZ -JKM,JKZ -KKM,KKZ -LKM,LKZ -MKM,MKZ -NKM,NKZ -OKM,OKZ -PKM,PKZ -QKM,QKZ -RKM,RKZ -SKM,SKZ -TKM,TKZ -UKM,UKZ -VKM,VKZ -WKM,WKZ -XKM,XKZ -YKM,YKZ -ZKM,ZKZ -ALM,ALZ -BLM,BLZ -CLM,CLZ -DLM,DLZ -ELM,ELZ -FLM,FLZ -GLM,GLZ -HLM,HLZ -ILM,ILZ -JLM,JLZ -KLM,KLZ -LLM,LLZ -MLM,MLZ -NLM,NLZ -OLM,OLZ -PLM,PLZ -QLM,QLZ -RLM,RLZ -SLM,SLZ -TLM,TLZ -ULM,ULZ -VLM,VLZ -WLM,WLZ -XLM,XLZ -YLM,YLZ -ZLM,ZLZ -AMM,AMZ -BMM,BMZ -CMM,CMZ -DMM,DMZ -EMM,EMZ -FMM,FMZ -GMM,GMZ -HMM,HMZ -IMM,IMZ -JMM,JMZ -KMM,KMZ -LMM,LMZ -MMM,MMZ -NMM,NMZ -OMM,OMZ -PMM,PMZ -QMM,QMZ -RMM,RMZ -SMM,SMZ -TMM,TMZ -UMM,UMZ -VMM,VMZ -WMM,WMZ -XMM,XMZ -YMM,YMZ -ZMM,ZMZ -ANM,ANZ -BNM,BNZ -CNM,CNZ -DNM,DNZ -ENM,ENZ -FNM,FNZ -GNM,GNZ -HNM,HNZ -INM,INZ -JNM,JNZ -KNM,KNZ -LNM,LNZ -MNM,MNZ -NNM,NNZ -ONM,ONZ -PNM,PNZ -QNM,QNZ -RNM,RNZ -SNM,SNZ -TNM,TNZ -UNM,UNZ -VNM,VNZ -WNM,WNZ -XNM,XNZ -YNM,YNZ -ZNM,ZNZ -AOM,AOZ -BOM,BOZ -COM,COZ -DOM,DOZ -EOM,EOZ -FOM,FOZ -GOM,GOZ -HOM,HOZ -IOM,IOZ -JOM,JOZ -KOM,KOZ -LOM,LOZ -MOM,MOZ -NOM,NOZ -OOM,OOZ -POM,POZ -QOM,QOZ -ROM,ROZ -SOM,SOZ -TOM,TOZ -UOM,UOZ -VOM,VOZ -WOM,WOZ -XOM,XOZ -YOM,YOZ -ZOM,ZOZ -APM,APZ -BPM,BPZ -CPM,CPZ -DPM,DPZ -EPM,EPZ -FPM,FPZ -GPM,GPZ -HPM,HPZ -IPM,IPZ -JPM,JPZ -KPM,KPZ -LPM,LPZ -MPM,MPZ -NPM,NPZ -OPM,OPZ -PPM,PPZ -QPM,QPZ -RPM,RPZ -SPM,SPZ -TPM,TPZ -UPM,UPZ -VPM,VPZ -WPM,WPZ -XPM,XPZ -YPM,YPZ -ZPM,ZPZ -AQM,AQZ -BQM,BQZ -CQM,CQZ -DQM,DQZ -EQM,EQZ -FQM,FQZ -GQM,GQZ -HQM,HQZ -IQM,IQZ -JQM,JQZ -KQM,KQZ -LQM,LQZ -MQM,MQZ -NQM,NQZ -OQM,OQZ -PQM,PQZ -QQM,QQZ -RQM,RQZ -SQM,SQZ -TQM,TQZ -UQM,UQZ -VQM,VQZ -WQM,WQZ -XQM,XQZ -YQM,YQZ -ZQM,ZQZ -ARM,ARZ -BRM,BRZ -CRM,CRZ -DRM,DRZ -ERM,ERZ -FRM,FRZ -GRM,GRZ -HRM,HRZ -IRM,IRZ -JRM,JRZ -KRM,KRZ -LRM,LRZ -MRM,MRZ -NRM,NRZ -ORM,ORZ -PRM,PRZ -QRM,QRZ -RRM,RRZ -SRM,SRZ -TRM,TRZ -URM,URZ -VRM,VRZ -WRM,WRZ -XRM,XRZ -YRM,YRZ -ZRM,ZRZ -ASM,ASZ -BSM,BSZ -CSM,CSZ -DSM,DSZ -ESM,ESZ -FSM,FSZ -GSM,GSZ -HSM,HSZ -ISM,ISZ -JSM,JSZ -KSM,KSZ -LSM,LSZ -MSM,MSZ -NSM,NSZ -OSM,OSZ -PSM,PSZ -QSM,QSZ -RSM,RSZ -SSM,SSZ -TSM,TSZ -USM,USZ -VSM,VSZ -WSM,WSZ -XSM,XSZ -YSM,YSZ -ZSM,ZSZ -ATM,ATZ -BTM,BTZ -CTM,CTZ -DTM,DTZ -ETM,ETZ -FTM,FTZ -GTM,GTZ -HTM,HTZ -ITM,ITZ -JTM,JTZ -KTM,KTZ -LTM,LTZ -MTM,MTZ -NTM,NTZ -OTM,OTZ -PTM,PTZ -QTM,QTZ -RTM,RTZ -STM,STZ -TTM,TTZ -UTM,UTZ -VTM,VTZ -WTM,WTZ -XTM,XTZ -YTM,YTZ -ZTM,ZTZ -AUM,AUZ -BUM,BUZ -CUM,CUZ -DUM,DUZ -EUM,EUZ -FUM,FUZ -GUM,GUZ -HUM,HUZ -IUM,IUZ -JUM,JUZ -KUM,KUZ -LUM,LUZ -MUM,MUZ -NUM,NUZ -OUM,OUZ -PUM,PUZ -QUM,QUZ -RUM,RUZ -SUM,SUZ -TUM,TUZ -UUM,UUZ -VUM,VUZ -WUM,WUZ -XUM,XUZ -YUM,YUZ -ZUM,ZUZ -AVM,AVZ -BVM,BVZ -CVM,CVZ -DVM,DVZ -EVM,EVZ -FVM,FVZ -GVM,GVZ -HVM,HVZ -IVM,IVZ -JVM,JVZ -KVM,KVZ -LVM,LVZ -MVM,MVZ -NVM,NVZ -OVM,OVZ -PVM,PVZ -QVM,QVZ -RVM,RVZ -SVM,SVZ -TVM,TVZ -UVM,UVZ -VVM,VVZ -WVM,WVZ -XVM,XVZ -YVM,YVZ -ZVM,ZVZ -AWM,AWZ -BWM,BWZ -CWM,CWZ -DWM,DWZ -EWM,EWZ -FWM,FWZ -GWM,GWZ -HWM,HWZ -IWM,IWZ -JWM,JWZ -KWM,KWZ -LWM,LWZ -MWM,MWZ -NWM,NWZ -OWM,OWZ -PWM,PWZ -QWM,QWZ -RWM,RWZ -SWM,SWZ -TWM,TWZ -UWM,UWZ -VWM,VWZ -WWM,WWZ -XWM,XWZ -YWM,YWZ -ZWM,ZWZ -AXM,AXZ -BXM,BXZ -CXM,CXZ -DXM,DXZ -EXM,EXZ -FXM,FXZ -GXM,GXZ -HXM,HXZ -IXM,IXZ -JXM,JXZ -KXM,KXZ -LXM,LXZ -MXM,MXZ -NXM,NXZ -OXM,OXZ -PXM,PXZ -QXM,QXZ -RXM,RXZ -SXM,SXZ -TXM,TXZ -UXM,UXZ -VXM,VXZ -WXM,WXZ -XXM,XXZ -YXM,YXZ -ZXM,ZXZ -AYM,AYZ -BYM,BYZ -CYM,CYZ -DYM,DYZ -EYM,EYZ -FYM,FYZ -GYM,GYZ -HYM,HYZ -IYM,IYZ -JYM,JYZ -KYM,KYZ -LYM,LYZ -MYM,MYZ -NYM,NYZ -OYM,OYZ -PYM,PYZ -QYM,QYZ -RYM,RYZ -SYM,SYZ -TYM,TYZ -UYM,UYZ -VYM,VYZ -WYM,WYZ -XYM,XYZ -YYM,YYZ -ZYM,ZYZ -AZM,AZZ -BZM,BZZ -CZM,CZZ -DZM,DZZ -EZM,EZZ -FZM,FZZ -GZM,GZZ -HZM,HZZ -IZM,IZZ -JZM,JZZ -KZM,KZZ -LZM,LZZ -MZM,MZZ -NZM,NZZ -OZM,OZZ -PZM,PZZ -QZM,QZZ -RZM,RZZ -SZM,SZZ -TZM,TZZ -UZM,UZZ -VZM,VZZ -WZM,WZZ -XZM,XZZ -YZM,YZZ -ZZM,ZZZ -AAA,AAN -BAA,BAN -CAA,CAN -DAA,DAN -EAA,EAN -FAA,FAN -GAA,GAN -HAA,HAN -IAA,IAN -JAA,JAN -KAA,KAN -LAA,LAN -MAA,MAN -NAA,NAN -OAA,OAN -PAA,PAN -QAA,QAN -RAA,RAN -SAA,SAN -TAA,TAN -UAA,UAN -VAA,VAN -WAA,WAN -XAA,XAN -YAA,YAN -ZAA,ZAN -ABA,ABN -BBA,BBN -CBA,CBN -DBA,DBN -EBA,EBN -FBA,FBN -GBA,GBN -HBA,HBN -IBA,IBN -JBA,JBN -KBA,KBN -LBA,LBN -MBA,MBN -NBA,NBN -OBA,OBN -PBA,PBN -QBA,QBN -RBA,RBN -SBA,SBN -TBA,TBN -UBA,UBN -VBA,VBN -WBA,WBN -XBA,XBN -YBA,YBN -ZBA,ZBN -ACA,ACN -BCA,BCN -CCA,CCN -DCA,DCN -ECA,ECN -FCA,FCN -GCA,GCN -HCA,HCN -ICA,ICN -JCA,JCN -KCA,KCN -LCA,LCN -MCA,MCN -NCA,NCN -OCA,OCN -PCA,PCN -QCA,QCN -RCA,RCN -SCA,SCN -TCA,TCN -UCA,UCN -VCA,VCN -WCA,WCN -XCA,XCN -YCA,YCN -ZCA,ZCN -ADA,ADN -BDA,BDN -CDA,CDN -DDA,DDN -EDA,EDN -FDA,FDN -GDA,GDN -HDA,HDN -IDA,IDN -JDA,JDN -KDA,KDN -LDA,LDN -MDA,MDN -NDA,NDN -ODA,ODN -PDA,PDN -QDA,QDN -RDA,RDN -SDA,SDN -TDA,TDN -UDA,UDN -VDA,VDN -WDA,WDN -XDA,XDN -YDA,YDN -ZDA,ZDN -AEA,AEN -BEA,BEN -CEA,CEN -DEA,DEN -EEA,EEN -FEA,FEN -GEA,GEN -HEA,HEN -IEA,IEN -JEA,JEN -KEA,KEN -LEA,LEN -MEA,MEN -NEA,NEN -OEA,OEN -PEA,PEN -QEA,QEN -REA,REN -SEA,SEN -TEA,TEN -UEA,UEN -VEA,VEN -WEA,WEN -XEA,XEN -YEA,YEN -ZEA,ZEN -AFA,AFN -BFA,BFN -CFA,CFN -DFA,DFN -EFA,EFN -FFA,FFN -GFA,GFN -HFA,HFN -IFA,IFN -JFA,JFN -KFA,KFN -LFA,LFN -MFA,MFN -NFA,NFN -OFA,OFN -PFA,PFN -QFA,QFN -RFA,RFN -SFA,SFN -TFA,TFN -UFA,UFN -VFA,VFN -WFA,WFN -XFA,XFN -YFA,YFN -ZFA,ZFN -AGA,AGN -BGA,BGN -CGA,CGN -DGA,DGN -EGA,EGN -FGA,FGN -GGA,GGN -HGA,HGN -IGA,IGN -JGA,JGN -KGA,KGN -LGA,LGN -MGA,MGN -NGA,NGN -OGA,OGN -PGA,PGN -QGA,QGN -RGA,RGN -SGA,SGN -TGA,TGN -UGA,UGN -VGA,VGN -WGA,WGN -XGA,XGN -YGA,YGN -ZGA,ZGN -AHA,AHN -BHA,BHN -CHA,CHN -DHA,DHN -EHA,EHN -FHA,FHN -GHA,GHN -HHA,HHN -IHA,IHN -JHA,JHN -KHA,KHN -LHA,LHN -MHA,MHN -NHA,NHN -OHA,OHN -PHA,PHN -QHA,QHN -RHA,RHN -SHA,SHN -THA,THN -UHA,UHN -VHA,VHN -WHA,WHN -XHA,XHN -YHA,YHN -ZHA,ZHN -AIA,AIN -BIA,BIN -CIA,CIN -DIA,DIN -EIA,EIN -FIA,FIN -GIA,GIN -HIA,HIN -IIA,IIN -JIA,JIN -KIA,KIN -LIA,LIN -MIA,MIN -NIA,NIN -OIA,OIN -PIA,PIN -QIA,QIN -RIA,RIN -SIA,SIN -TIA,TIN -UIA,UIN -VIA,VIN -WIA,WIN -XIA,XIN -YIA,YIN -ZIA,ZIN -AJA,AJN -BJA,BJN -CJA,CJN -DJA,DJN -EJA,EJN -FJA,FJN -GJA,GJN -HJA,HJN -IJA,IJN -JJA,JJN -KJA,KJN -LJA,LJN -MJA,MJN -NJA,NJN -OJA,OJN -PJA,PJN -QJA,QJN -RJA,RJN -SJA,SJN -TJA,TJN -UJA,UJN -VJA,VJN -WJA,WJN -XJA,XJN -YJA,YJN -ZJA,ZJN -AKA,AKN -BKA,BKN -CKA,CKN -DKA,DKN -EKA,EKN -FKA,FKN -GKA,GKN -HKA,HKN -IKA,IKN -JKA,JKN -KKA,KKN -LKA,LKN -MKA,MKN -NKA,NKN -OKA,OKN -PKA,PKN -QKA,QKN -RKA,RKN -SKA,SKN -TKA,TKN -UKA,UKN -VKA,VKN -WKA,WKN -XKA,XKN -YKA,YKN -ZKA,ZKN -ALA,ALN -BLA,BLN -CLA,CLN -DLA,DLN -ELA,ELN -FLA,FLN -GLA,GLN -HLA,HLN -ILA,ILN -JLA,JLN -KLA,KLN -LLA,LLN -MLA,MLN -NLA,NLN -OLA,OLN -PLA,PLN -QLA,QLN -RLA,RLN -SLA,SLN -TLA,TLN -ULA,ULN -VLA,VLN -WLA,WLN -XLA,XLN -YLA,YLN -ZLA,ZLN -AMA,AMN -BMA,BMN -CMA,CMN -DMA,DMN -EMA,EMN -FMA,FMN -GMA,GMN -HMA,HMN -IMA,IMN -JMA,JMN -KMA,KMN -LMA,LMN -MMA,MMN -NMA,NMN -OMA,OMN -PMA,PMN -QMA,QMN -RMA,RMN -SMA,SMN -TMA,TMN -UMA,UMN -VMA,VMN -WMA,WMN -XMA,XMN -YMA,YMN -ZMA,ZMN -ANA,ANN -BNA,BNN -CNA,CNN -DNA,DNN -ENA,ENN -FNA,FNN -GNA,GNN -HNA,HNN -INA,INN -JNA,JNN -KNA,KNN -LNA,LNN -MNA,MNN -NNA,NNN -ONA,ONN -PNA,PNN -QNA,QNN -RNA,RNN -SNA,SNN -TNA,TNN -UNA,UNN -VNA,VNN -WNA,WNN -XNA,XNN -YNA,YNN -ZNA,ZNN -AOA,AON -BOA,BON -COA,CON -DOA,DON -EOA,EON -FOA,FON -GOA,GON -HOA,HON -IOA,ION -JOA,JON -KOA,KON -LOA,LON -MOA,MON -NOA,NON -OOA,OON -POA,PON -QOA,QON -ROA,RON -SOA,SON -TOA,TON -UOA,UON -VOA,VON -WOA,WON -XOA,XON -YOA,YON -ZOA,ZON -APA,APN -BPA,BPN -CPA,CPN -DPA,DPN -EPA,EPN -FPA,FPN -GPA,GPN -HPA,HPN -IPA,IPN -JPA,JPN -KPA,KPN -LPA,LPN -MPA,MPN -NPA,NPN -OPA,OPN -PPA,PPN -QPA,QPN -RPA,RPN -SPA,SPN -TPA,TPN -UPA,UPN -VPA,VPN -WPA,WPN -XPA,XPN -YPA,YPN -ZPA,ZPN -AQA,AQN -BQA,BQN -CQA,CQN -DQA,DQN -EQA,EQN -FQA,FQN -GQA,GQN -HQA,HQN -IQA,IQN -JQA,JQN -KQA,KQN -LQA,LQN -MQA,MQN -NQA,NQN -OQA,OQN -PQA,PQN -QQA,QQN -RQA,RQN -SQA,SQN -TQA,TQN -UQA,UQN -VQA,VQN -WQA,WQN -XQA,XQN -YQA,YQN -ZQA,ZQN -ARA,ARN -BRA,BRN -CRA,CRN -DRA,DRN -ERA,ERN -FRA,FRN -GRA,GRN -HRA,HRN -IRA,IRN -JRA,JRN -KRA,KRN -LRA,LRN -MRA,MRN -NRA,NRN -ORA,ORN -PRA,PRN -QRA,QRN -RRA,RRN -SRA,SRN -TRA,TRN -URA,URN -VRA,VRN -WRA,WRN -XRA,XRN -YRA,YRN -ZRA,ZRN -ASA,ASN -BSA,BSN -CSA,CSN -DSA,DSN -ESA,ESN -FSA,FSN -GSA,GSN -HSA,HSN -ISA,ISN -JSA,JSN -KSA,KSN -LSA,LSN -MSA,MSN -NSA,NSN -OSA,OSN -PSA,PSN -QSA,QSN -RSA,RSN -SSA,SSN -TSA,TSN -USA,USN -VSA,VSN -WSA,WSN -XSA,XSN -YSA,YSN -ZSA,ZSN -ATA,ATN -BTA,BTN -CTA,CTN -DTA,DTN -ETA,ETN -FTA,FTN -GTA,GTN -HTA,HTN -ITA,ITN -JTA,JTN -KTA,KTN -LTA,LTN -MTA,MTN -NTA,NTN -OTA,OTN -PTA,PTN -QTA,QTN -RTA,RTN -STA,STN -TTA,TTN -UTA,UTN -VTA,VTN -WTA,WTN -XTA,XTN -YTA,YTN -ZTA,ZTN -AUA,AUN -BUA,BUN -CUA,CUN -DUA,DUN -EUA,EUN -FUA,FUN -GUA,GUN -HUA,HUN -IUA,IUN -JUA,JUN -KUA,KUN -LUA,LUN -MUA,MUN -NUA,NUN -OUA,OUN -PUA,PUN -QUA,QUN -RUA,RUN -SUA,SUN -TUA,TUN -UUA,UUN -VUA,VUN -WUA,WUN -XUA,XUN -YUA,YUN -ZUA,ZUN -AVA,AVN -BVA,BVN -CVA,CVN -DVA,DVN -EVA,EVN -FVA,FVN -GVA,GVN -HVA,HVN -IVA,IVN -JVA,JVN -KVA,KVN -LVA,LVN -MVA,MVN -NVA,NVN -OVA,OVN -PVA,PVN -QVA,QVN -RVA,RVN -SVA,SVN -TVA,TVN -UVA,UVN -VVA,VVN -WVA,WVN -XVA,XVN -YVA,YVN -ZVA,ZVN -AWA,AWN -BWA,BWN -CWA,CWN -DWA,DWN -EWA,EWN -FWA,FWN -GWA,GWN -HWA,HWN -IWA,IWN -JWA,JWN -KWA,KWN -LWA,LWN -MWA,MWN -NWA,NWN -OWA,OWN -PWA,PWN -QWA,QWN -RWA,RWN -SWA,SWN -TWA,TWN -UWA,UWN -VWA,VWN -WWA,WWN -XWA,XWN -YWA,YWN -ZWA,ZWN -AXA,AXN -BXA,BXN -CXA,CXN -DXA,DXN -EXA,EXN -FXA,FXN -GXA,GXN -HXA,HXN -IXA,IXN -JXA,JXN -KXA,KXN -LXA,LXN -MXA,MXN -NXA,NXN -OXA,OXN -PXA,PXN -QXA,QXN -RXA,RXN -SXA,SXN -TXA,TXN -UXA,UXN -VXA,VXN -WXA,WXN -XXA,XXN -YXA,YXN -ZXA,ZXN -AYA,AYN -BYA,BYN -CYA,CYN -DYA,DYN -EYA,EYN -FYA,FYN -GYA,GYN -HYA,HYN -IYA,IYN -JYA,JYN -KYA,KYN -LYA,LYN -MYA,MYN -NYA,NYN -OYA,OYN -PYA,PYN -QYA,QYN -RYA,RYN -SYA,SYN -TYA,TYN -UYA,UYN -VYA,VYN -WYA,WYN -XYA,XYN -YYA,YYN -ZYA,ZYN -AZA,AZN -BZA,BZN -CZA,CZN -DZA,DZN -EZA,EZN -FZA,FZN -GZA,GZN -HZA,HZN -IZA,IZN -JZA,JZN -KZA,KZN -LZA,LZN -MZA,MZN -NZA,NZN -OZA,OZN -PZA,PZN -QZA,QZN -RZA,RZN -SZA,SZN -TZA,TZN -UZA,UZN -VZA,VZN -WZA,WZN -XZA,XZN -YZA,YZN -ZZA,ZZN -AAB,AAO -BAB,BAO -CAB,CAO -DAB,DAO -EAB,EAO -FAB,FAO -GAB,GAO -HAB,HAO -IAB,IAO -JAB,JAO -KAB,KAO -LAB,LAO -MAB,MAO -NAB,NAO -OAB,OAO -PAB,PAO -QAB,QAO -RAB,RAO -SAB,SAO -TAB,TAO -UAB,UAO -VAB,VAO -WAB,WAO -XAB,XAO -YAB,YAO -ZAB,ZAO -ABB,ABO -BBB,BBO -CBB,CBO -DBB,DBO -EBB,EBO -FBB,FBO -GBB,GBO -HBB,HBO -IBB,IBO -JBB,JBO -KBB,KBO -LBB,LBO -MBB,MBO -NBB,NBO -OBB,OBO -PBB,PBO -QBB,QBO -RBB,RBO -SBB,SBO -TBB,TBO -UBB,UBO -VBB,VBO -WBB,WBO -XBB,XBO -YBB,YBO -ZBB,ZBO -ACB,ACO -BCB,BCO -CCB,CCO -DCB,DCO -ECB,ECO -FCB,FCO -GCB,GCO -HCB,HCO -ICB,ICO -JCB,JCO -KCB,KCO -LCB,LCO -MCB,MCO -NCB,NCO -OCB,OCO -PCB,PCO -QCB,QCO -RCB,RCO -SCB,SCO -TCB,TCO -UCB,UCO -VCB,VCO -WCB,WCO -XCB,XCO -YCB,YCO -ZCB,ZCO -ADB,ADO -BDB,BDO -CDB,CDO -DDB,DDO -EDB,EDO -FDB,FDO -GDB,GDO -HDB,HDO -IDB,IDO -JDB,JDO -KDB,KDO -LDB,LDO -MDB,MDO -NDB,NDO -ODB,ODO -PDB,PDO -QDB,QDO -RDB,RDO -SDB,SDO -TDB,TDO -UDB,UDO -VDB,VDO -WDB,WDO -XDB,XDO -YDB,YDO -ZDB,ZDO -AEB,AEO -BEB,BEO -CEB,CEO -DEB,DEO -EEB,EEO -FEB,FEO -GEB,GEO -HEB,HEO -IEB,IEO -JEB,JEO -KEB,KEO -LEB,LEO -MEB,MEO -NEB,NEO -OEB,OEO -PEB,PEO -QEB,QEO -REB,REO -SEB,SEO -TEB,TEO -UEB,UEO -VEB,VEO -WEB,WEO -XEB,XEO -YEB,YEO -ZEB,ZEO -AFB,AFO -BFB,BFO -CFB,CFO -DFB,DFO -EFB,EFO -FFB,FFO -GFB,GFO -HFB,HFO -IFB,IFO -JFB,JFO -KFB,KFO -LFB,LFO -MFB,MFO -NFB,NFO -OFB,OFO -PFB,PFO -QFB,QFO -RFB,RFO -SFB,SFO -TFB,TFO -UFB,UFO -VFB,VFO -WFB,WFO -XFB,XFO -YFB,YFO -ZFB,ZFO -AGB,AGO -BGB,BGO -CGB,CGO -DGB,DGO -EGB,EGO -FGB,FGO -GGB,GGO -HGB,HGO -IGB,IGO -JGB,JGO -KGB,KGO -LGB,LGO -MGB,MGO -NGB,NGO -OGB,OGO -PGB,PGO -QGB,QGO -RGB,RGO -SGB,SGO -TGB,TGO -UGB,UGO -VGB,VGO -WGB,WGO -XGB,XGO -YGB,YGO -ZGB,ZGO -AHB,AHO -BHB,BHO -CHB,CHO -DHB,DHO -EHB,EHO -FHB,FHO -GHB,GHO -HHB,HHO -IHB,IHO -JHB,JHO -KHB,KHO -LHB,LHO -MHB,MHO -NHB,NHO -OHB,OHO -PHB,PHO -QHB,QHO -RHB,RHO -SHB,SHO -THB,THO -UHB,UHO -VHB,VHO -WHB,WHO -XHB,XHO -YHB,YHO -ZHB,ZHO -AIB,AIO -BIB,BIO -CIB,CIO -DIB,DIO -EIB,EIO -FIB,FIO -GIB,GIO -HIB,HIO -IIB,IIO -JIB,JIO -KIB,KIO -LIB,LIO -MIB,MIO -NIB,NIO -OIB,OIO -PIB,PIO -QIB,QIO -RIB,RIO -SIB,SIO -TIB,TIO -UIB,UIO -VIB,VIO -WIB,WIO -XIB,XIO -YIB,YIO -ZIB,ZIO -AJB,AJO -BJB,BJO -CJB,CJO -DJB,DJO -EJB,EJO -FJB,FJO -GJB,GJO -HJB,HJO -IJB,IJO -JJB,JJO -KJB,KJO -LJB,LJO -MJB,MJO -NJB,NJO -OJB,OJO -PJB,PJO -QJB,QJO -RJB,RJO -SJB,SJO -TJB,TJO -UJB,UJO -VJB,VJO -WJB,WJO -XJB,XJO -YJB,YJO -ZJB,ZJO -AKB,AKO -BKB,BKO -CKB,CKO -DKB,DKO -EKB,EKO -FKB,FKO -GKB,GKO -HKB,HKO -IKB,IKO -JKB,JKO -KKB,KKO -LKB,LKO -MKB,MKO -NKB,NKO -OKB,OKO -PKB,PKO -QKB,QKO -RKB,RKO -SKB,SKO -TKB,TKO -UKB,UKO -VKB,VKO -WKB,WKO -XKB,XKO -YKB,YKO -ZKB,ZKO -ALB,ALO -BLB,BLO -CLB,CLO -DLB,DLO -ELB,ELO -FLB,FLO -GLB,GLO -HLB,HLO -ILB,ILO -JLB,JLO -KLB,KLO -LLB,LLO -MLB,MLO -NLB,NLO -OLB,OLO -PLB,PLO -QLB,QLO -RLB,RLO -SLB,SLO -TLB,TLO -ULB,ULO -VLB,VLO -WLB,WLO -XLB,XLO -YLB,YLO -ZLB,ZLO -AMB,AMO -BMB,BMO -CMB,CMO -DMB,DMO -EMB,EMO -FMB,FMO -GMB,GMO -HMB,HMO -IMB,IMO -JMB,JMO -KMB,KMO -LMB,LMO -MMB,MMO -NMB,NMO -OMB,OMO -PMB,PMO -QMB,QMO -RMB,RMO -SMB,SMO -TMB,TMO -UMB,UMO -VMB,VMO -WMB,WMO -XMB,XMO -YMB,YMO -ZMB,ZMO -ANB,ANO -BNB,BNO -CNB,CNO -DNB,DNO -ENB,ENO -FNB,FNO -GNB,GNO -HNB,HNO -INB,INO -JNB,JNO -KNB,KNO -LNB,LNO -MNB,MNO -NNB,NNO -ONB,ONO -PNB,PNO -QNB,QNO -RNB,RNO -SNB,SNO -TNB,TNO -UNB,UNO -VNB,VNO -WNB,WNO -XNB,XNO -YNB,YNO -ZNB,ZNO -AOB,AOO -BOB,BOO -COB,COO -DOB,DOO -EOB,EOO -FOB,FOO -GOB,GOO -HOB,HOO -IOB,IOO -JOB,JOO -KOB,KOO -LOB,LOO -MOB,MOO -NOB,NOO -OOB,OOO -POB,POO -QOB,QOO -ROB,ROO -SOB,SOO -TOB,TOO -UOB,UOO -VOB,VOO -WOB,WOO -XOB,XOO -YOB,YOO -ZOB,ZOO -APB,APO -BPB,BPO -CPB,CPO -DPB,DPO -EPB,EPO -FPB,FPO -GPB,GPO -HPB,HPO -IPB,IPO -JPB,JPO -KPB,KPO -LPB,LPO -MPB,MPO -NPB,NPO -OPB,OPO -PPB,PPO -QPB,QPO -RPB,RPO -SPB,SPO -TPB,TPO -UPB,UPO -VPB,VPO -WPB,WPO -XPB,XPO -YPB,YPO -ZPB,ZPO -AQB,AQO -BQB,BQO -CQB,CQO -DQB,DQO -EQB,EQO -FQB,FQO -GQB,GQO -HQB,HQO -IQB,IQO -JQB,JQO -KQB,KQO -LQB,LQO -MQB,MQO -NQB,NQO -OQB,OQO -PQB,PQO -QQB,QQO -RQB,RQO -SQB,SQO -TQB,TQO -UQB,UQO -VQB,VQO -WQB,WQO -XQB,XQO -YQB,YQO -ZQB,ZQO -ARB,ARO -BRB,BRO -CRB,CRO -DRB,DRO -ERB,ERO -FRB,FRO -GRB,GRO -HRB,HRO -IRB,IRO -JRB,JRO -KRB,KRO -LRB,LRO -MRB,MRO -NRB,NRO -ORB,ORO -PRB,PRO -QRB,QRO -RRB,RRO -SRB,SRO -TRB,TRO -URB,URO -VRB,VRO -WRB,WRO -XRB,XRO -YRB,YRO -ZRB,ZRO -ASB,ASO -BSB,BSO -CSB,CSO -DSB,DSO -ESB,ESO -FSB,FSO -GSB,GSO -HSB,HSO -ISB,ISO -JSB,JSO -KSB,KSO -LSB,LSO -MSB,MSO -NSB,NSO -OSB,OSO -PSB,PSO -QSB,QSO -RSB,RSO -SSB,SSO -TSB,TSO -USB,USO -VSB,VSO -WSB,WSO -XSB,XSO -YSB,YSO -ZSB,ZSO -ATB,ATO -BTB,BTO -CTB,CTO -DTB,DTO -ETB,ETO -FTB,FTO -GTB,GTO -HTB,HTO -ITB,ITO -JTB,JTO -KTB,KTO -LTB,LTO -MTB,MTO -NTB,NTO -OTB,OTO -PTB,PTO -QTB,QTO -RTB,RTO -STB,STO -TTB,TTO -UTB,UTO -VTB,VTO -WTB,WTO -XTB,XTO -YTB,YTO -ZTB,ZTO -AUB,AUO -BUB,BUO -CUB,CUO -DUB,DUO -EUB,EUO -FUB,FUO -GUB,GUO -HUB,HUO -IUB,IUO -JUB,JUO -KUB,KUO -LUB,LUO -MUB,MUO -NUB,NUO -OUB,OUO -PUB,PUO -QUB,QUO -RUB,RUO -SUB,SUO -TUB,TUO -UUB,UUO -VUB,VUO -WUB,WUO -XUB,XUO -YUB,YUO -ZUB,ZUO -AVB,AVO -BVB,BVO -CVB,CVO -DVB,DVO -EVB,EVO -FVB,FVO -GVB,GVO -HVB,HVO -IVB,IVO -JVB,JVO -KVB,KVO -LVB,LVO -MVB,MVO -NVB,NVO -OVB,OVO -PVB,PVO -QVB,QVO -RVB,RVO -SVB,SVO -TVB,TVO -UVB,UVO -VVB,VVO -WVB,WVO -XVB,XVO -YVB,YVO -ZVB,ZVO -AWB,AWO -BWB,BWO -CWB,CWO -DWB,DWO -EWB,EWO -FWB,FWO -GWB,GWO -HWB,HWO -IWB,IWO -JWB,JWO -KWB,KWO -LWB,LWO -MWB,MWO -NWB,NWO -OWB,OWO -PWB,PWO -QWB,QWO -RWB,RWO -SWB,SWO -TWB,TWO -UWB,UWO -VWB,VWO -WWB,WWO -XWB,XWO -YWB,YWO -ZWB,ZWO -AXB,AXO -BXB,BXO -CXB,CXO -DXB,DXO -EXB,EXO -FXB,FXO -GXB,GXO -HXB,HXO -IXB,IXO -JXB,JXO -KXB,KXO -LXB,LXO -MXB,MXO -NXB,NXO -OXB,OXO -PXB,PXO -QXB,QXO -RXB,RXO -SXB,SXO -TXB,TXO -UXB,UXO -VXB,VXO -WXB,WXO -XXB,XXO -YXB,YXO -ZXB,ZXO -AYB,AYO -BYB,BYO -CYB,CYO -DYB,DYO -EYB,EYO -FYB,FYO -GYB,GYO -HYB,HYO -IYB,IYO -JYB,JYO -KYB,KYO -LYB,LYO -MYB,MYO -NYB,NYO -OYB,OYO -PYB,PYO -QYB,QYO -RYB,RYO -SYB,SYO -TYB,TYO -UYB,UYO -VYB,VYO -WYB,WYO -XYB,XYO -YYB,YYO -ZYB,ZYO -AZB,AZO -BZB,BZO -CZB,CZO -DZB,DZO -EZB,EZO -FZB,FZO -GZB,GZO -HZB,HZO -IZB,IZO -JZB,JZO -KZB,KZO -LZB,LZO -MZB,MZO -NZB,NZO -OZB,OZO -PZB,PZO -QZB,QZO -RZB,RZO -SZB,SZO -TZB,TZO -UZB,UZO -VZB,VZO -WZB,WZO -XZB,XZO -YZB,YZO -ZZB,ZZO -AAC,AAP -BAC,BAP -CAC,CAP -DAC,DAP -EAC,EAP -FAC,FAP -GAC,GAP -HAC,HAP -IAC,IAP -JAC,JAP -KAC,KAP -LAC,LAP -MAC,MAP -NAC,NAP -OAC,OAP -PAC,PAP -QAC,QAP -RAC,RAP -SAC,SAP -TAC,TAP -UAC,UAP -VAC,VAP -WAC,WAP -XAC,XAP -YAC,YAP -ZAC,ZAP -ABC,ABP -BBC,BBP -CBC,CBP -DBC,DBP -EBC,EBP -FBC,FBP -GBC,GBP -HBC,HBP -IBC,IBP -JBC,JBP -KBC,KBP -LBC,LBP -MBC,MBP -NBC,NBP -OBC,OBP -PBC,PBP -QBC,QBP -RBC,RBP -SBC,SBP -TBC,TBP -UBC,UBP -VBC,VBP -WBC,WBP -XBC,XBP -YBC,YBP -ZBC,ZBP -ACC,ACP -BCC,BCP -CCC,CCP -DCC,DCP -ECC,ECP -FCC,FCP -GCC,GCP -HCC,HCP -ICC,ICP -JCC,JCP -KCC,KCP -LCC,LCP -MCC,MCP -NCC,NCP -OCC,OCP -PCC,PCP -QCC,QCP -RCC,RCP -SCC,SCP -TCC,TCP -UCC,UCP -VCC,VCP -WCC,WCP -XCC,XCP -YCC,YCP -ZCC,ZCP -ADC,ADP -BDC,BDP -CDC,CDP -DDC,DDP -EDC,EDP -FDC,FDP -GDC,GDP -HDC,HDP -IDC,IDP -JDC,JDP -KDC,KDP -LDC,LDP -MDC,MDP -NDC,NDP -ODC,ODP -PDC,PDP -QDC,QDP -RDC,RDP -SDC,SDP -TDC,TDP -UDC,UDP -VDC,VDP -WDC,WDP -XDC,XDP -YDC,YDP -ZDC,ZDP -AEC,AEP -BEC,BEP -CEC,CEP -DEC,DEP -EEC,EEP -FEC,FEP -GEC,GEP -HEC,HEP -IEC,IEP -JEC,JEP -KEC,KEP -LEC,LEP -MEC,MEP -NEC,NEP -OEC,OEP -PEC,PEP -QEC,QEP -REC,REP -SEC,SEP -TEC,TEP -UEC,UEP -VEC,VEP -WEC,WEP -XEC,XEP -YEC,YEP -ZEC,ZEP -AFC,AFP -BFC,BFP -CFC,CFP -DFC,DFP -EFC,EFP -FFC,FFP -GFC,GFP -HFC,HFP -IFC,IFP -JFC,JFP -KFC,KFP -LFC,LFP -MFC,MFP -NFC,NFP -OFC,OFP -PFC,PFP -QFC,QFP -RFC,RFP -SFC,SFP -TFC,TFP -UFC,UFP -VFC,VFP -WFC,WFP -XFC,XFP -YFC,YFP -ZFC,ZFP -AGC,AGP -BGC,BGP -CGC,CGP -DGC,DGP -EGC,EGP -FGC,FGP -GGC,GGP -HGC,HGP -IGC,IGP -JGC,JGP -KGC,KGP -LGC,LGP -MGC,MGP -NGC,NGP -OGC,OGP -PGC,PGP -QGC,QGP -RGC,RGP -SGC,SGP -TGC,TGP -UGC,UGP -VGC,VGP -WGC,WGP -XGC,XGP -YGC,YGP -ZGC,ZGP -AHC,AHP -BHC,BHP -CHC,CHP -DHC,DHP -EHC,EHP -FHC,FHP -GHC,GHP -HHC,HHP -IHC,IHP -JHC,JHP -KHC,KHP -LHC,LHP -MHC,MHP -NHC,NHP -OHC,OHP -PHC,PHP -QHC,QHP -RHC,RHP -SHC,SHP -THC,THP -UHC,UHP -VHC,VHP -WHC,WHP -XHC,XHP -YHC,YHP -ZHC,ZHP -AIC,AIP -BIC,BIP -CIC,CIP -DIC,DIP -EIC,EIP -FIC,FIP -GIC,GIP -HIC,HIP -IIC,IIP -JIC,JIP -KIC,KIP -LIC,LIP -MIC,MIP -NIC,NIP -OIC,OIP -PIC,PIP -QIC,QIP -RIC,RIP -SIC,SIP -TIC,TIP -UIC,UIP -VIC,VIP -WIC,WIP -XIC,XIP -YIC,YIP -ZIC,ZIP -AJC,AJP -BJC,BJP -CJC,CJP -DJC,DJP -EJC,EJP -FJC,FJP -GJC,GJP -HJC,HJP -IJC,IJP -JJC,JJP -KJC,KJP -LJC,LJP -MJC,MJP -NJC,NJP -OJC,OJP -PJC,PJP -QJC,QJP -RJC,RJP -SJC,SJP -TJC,TJP -UJC,UJP -VJC,VJP -WJC,WJP -XJC,XJP -YJC,YJP -ZJC,ZJP -AKC,AKP -BKC,BKP -CKC,CKP -DKC,DKP -EKC,EKP -FKC,FKP -GKC,GKP -HKC,HKP -IKC,IKP -JKC,JKP -KKC,KKP -LKC,LKP -MKC,MKP -NKC,NKP -OKC,OKP -PKC,PKP -QKC,QKP -RKC,RKP -SKC,SKP -TKC,TKP -UKC,UKP -VKC,VKP -WKC,WKP -XKC,XKP -YKC,YKP -ZKC,ZKP -ALC,ALP -BLC,BLP -CLC,CLP -DLC,DLP -ELC,ELP -FLC,FLP -GLC,GLP -HLC,HLP -ILC,ILP -JLC,JLP -KLC,KLP -LLC,LLP -MLC,MLP -NLC,NLP -OLC,OLP -PLC,PLP -QLC,QLP -RLC,RLP -SLC,SLP -TLC,TLP -ULC,ULP -VLC,VLP -WLC,WLP -XLC,XLP -YLC,YLP -ZLC,ZLP -AMC,AMP -BMC,BMP -CMC,CMP -DMC,DMP -EMC,EMP -FMC,FMP -GMC,GMP -HMC,HMP -IMC,IMP -JMC,JMP -KMC,KMP -LMC,LMP -MMC,MMP -NMC,NMP -OMC,OMP -PMC,PMP -QMC,QMP -RMC,RMP -SMC,SMP -TMC,TMP -UMC,UMP -VMC,VMP -WMC,WMP -XMC,XMP -YMC,YMP -ZMC,ZMP -ANC,ANP -BNC,BNP -CNC,CNP -DNC,DNP -ENC,ENP -FNC,FNP -GNC,GNP -HNC,HNP -INC,INP -JNC,JNP -KNC,KNP -LNC,LNP -MNC,MNP -NNC,NNP -ONC,ONP -PNC,PNP -QNC,QNP -RNC,RNP -SNC,SNP -TNC,TNP -UNC,UNP -VNC,VNP -WNC,WNP -XNC,XNP -YNC,YNP -ZNC,ZNP -AOC,AOP -BOC,BOP -COC,COP -DOC,DOP -EOC,EOP -FOC,FOP -GOC,GOP -HOC,HOP -IOC,IOP -JOC,JOP -KOC,KOP -LOC,LOP -MOC,MOP -NOC,NOP -OOC,OOP -POC,POP -QOC,QOP -ROC,ROP -SOC,SOP -TOC,TOP -UOC,UOP -VOC,VOP -WOC,WOP -XOC,XOP -YOC,YOP -ZOC,ZOP -APC,APP -BPC,BPP -CPC,CPP -DPC,DPP -EPC,EPP -FPC,FPP -GPC,GPP -HPC,HPP -IPC,IPP -JPC,JPP -KPC,KPP -LPC,LPP -MPC,MPP -NPC,NPP -OPC,OPP -PPC,PPP -QPC,QPP -RPC,RPP -SPC,SPP -TPC,TPP -UPC,UPP -VPC,VPP -WPC,WPP -XPC,XPP -YPC,YPP -ZPC,ZPP -AQC,AQP -BQC,BQP -CQC,CQP -DQC,DQP -EQC,EQP -FQC,FQP -GQC,GQP -HQC,HQP -IQC,IQP -JQC,JQP -KQC,KQP -LQC,LQP -MQC,MQP -NQC,NQP -OQC,OQP -PQC,PQP -QQC,QQP -RQC,RQP -SQC,SQP -TQC,TQP -UQC,UQP -VQC,VQP -WQC,WQP -XQC,XQP -YQC,YQP -ZQC,ZQP -ARC,ARP -BRC,BRP -CRC,CRP -DRC,DRP -ERC,ERP -FRC,FRP -GRC,GRP -HRC,HRP -IRC,IRP -JRC,JRP -KRC,KRP -LRC,LRP -MRC,MRP -NRC,NRP -ORC,ORP -PRC,PRP -QRC,QRP -RRC,RRP -SRC,SRP -TRC,TRP -URC,URP -VRC,VRP -WRC,WRP -XRC,XRP -YRC,YRP -ZRC,ZRP -ASC,ASP -BSC,BSP -CSC,CSP -DSC,DSP -ESC,ESP -FSC,FSP -GSC,GSP -HSC,HSP -ISC,ISP -JSC,JSP -KSC,KSP -LSC,LSP -MSC,MSP -NSC,NSP -OSC,OSP -PSC,PSP -QSC,QSP -RSC,RSP -SSC,SSP -TSC,TSP -USC,USP -VSC,VSP -WSC,WSP -XSC,XSP -YSC,YSP -ZSC,ZSP -ATC,ATP -BTC,BTP -CTC,CTP -DTC,DTP -ETC,ETP -FTC,FTP -GTC,GTP -HTC,HTP -ITC,ITP -JTC,JTP -KTC,KTP -LTC,LTP -MTC,MTP -NTC,NTP -OTC,OTP -PTC,PTP -QTC,QTP -RTC,RTP -STC,STP -TTC,TTP -UTC,UTP -VTC,VTP -WTC,WTP -XTC,XTP -YTC,YTP -ZTC,ZTP -AUC,AUP -BUC,BUP -CUC,CUP -DUC,DUP -EUC,EUP -FUC,FUP -GUC,GUP -HUC,HUP -IUC,IUP -JUC,JUP -KUC,KUP -LUC,LUP -MUC,MUP -NUC,NUP -OUC,OUP -PUC,PUP -QUC,QUP -RUC,RUP -SUC,SUP -TUC,TUP -UUC,UUP -VUC,VUP -WUC,WUP -XUC,XUP -YUC,YUP -ZUC,ZUP -AVC,AVP -BVC,BVP -CVC,CVP -DVC,DVP -EVC,EVP -FVC,FVP -GVC,GVP -HVC,HVP -IVC,IVP -JVC,JVP -KVC,KVP -LVC,LVP -MVC,MVP -NVC,NVP -OVC,OVP -PVC,PVP -QVC,QVP -RVC,RVP -SVC,SVP -TVC,TVP -UVC,UVP -VVC,VVP -WVC,WVP -XVC,XVP -YVC,YVP -ZVC,ZVP -AWC,AWP -BWC,BWP -CWC,CWP -DWC,DWP -EWC,EWP -FWC,FWP -GWC,GWP -HWC,HWP -IWC,IWP -JWC,JWP -KWC,KWP -LWC,LWP -MWC,MWP -NWC,NWP -OWC,OWP -PWC,PWP -QWC,QWP -RWC,RWP -SWC,SWP -TWC,TWP -UWC,UWP -VWC,VWP -WWC,WWP -XWC,XWP -YWC,YWP -ZWC,ZWP -AXC,AXP -BXC,BXP -CXC,CXP -DXC,DXP -EXC,EXP -FXC,FXP -GXC,GXP -HXC,HXP -IXC,IXP -JXC,JXP -KXC,KXP -LXC,LXP -MXC,MXP -NXC,NXP -OXC,OXP -PXC,PXP -QXC,QXP -RXC,RXP -SXC,SXP -TXC,TXP -UXC,UXP -VXC,VXP -WXC,WXP -XXC,XXP -YXC,YXP -ZXC,ZXP -AYC,AYP -BYC,BYP -CYC,CYP -DYC,DYP -EYC,EYP -FYC,FYP -GYC,GYP -HYC,HYP -IYC,IYP -JYC,JYP -KYC,KYP -LYC,LYP -MYC,MYP -NYC,NYP -OYC,OYP -PYC,PYP -QYC,QYP -RYC,RYP -SYC,SYP -TYC,TYP -UYC,UYP -VYC,VYP -WYC,WYP -XYC,XYP -YYC,YYP -ZYC,ZYP -AZC,AZP -BZC,BZP -CZC,CZP -DZC,DZP -EZC,EZP -FZC,FZP -GZC,GZP -HZC,HZP -IZC,IZP -JZC,JZP -KZC,KZP -LZC,LZP -MZC,MZP -NZC,NZP -OZC,OZP -PZC,PZP -QZC,QZP -RZC,RZP -SZC,SZP -TZC,TZP -UZC,UZP -VZC,VZP -WZC,WZP -XZC,XZP -YZC,YZP -ZZC,ZZP -AAD,AAQ -BAD,BAQ -CAD,CAQ -DAD,DAQ -EAD,EAQ -FAD,FAQ -GAD,GAQ -HAD,HAQ -IAD,IAQ -JAD,JAQ -KAD,KAQ -LAD,LAQ -MAD,MAQ -NAD,NAQ -OAD,OAQ -PAD,PAQ -QAD,QAQ -RAD,RAQ -SAD,SAQ -TAD,TAQ -UAD,UAQ -VAD,VAQ -WAD,WAQ -XAD,XAQ -YAD,YAQ -ZAD,ZAQ -ABD,ABQ -BBD,BBQ -CBD,CBQ -DBD,DBQ -EBD,EBQ -FBD,FBQ -GBD,GBQ -HBD,HBQ -IBD,IBQ -JBD,JBQ -KBD,KBQ -LBD,LBQ -MBD,MBQ -NBD,NBQ -OBD,OBQ -PBD,PBQ -QBD,QBQ -RBD,RBQ -SBD,SBQ -TBD,TBQ -UBD,UBQ -VBD,VBQ -WBD,WBQ -XBD,XBQ -YBD,YBQ -ZBD,ZBQ -ACD,ACQ -BCD,BCQ -CCD,CCQ -DCD,DCQ -ECD,ECQ -FCD,FCQ -GCD,GCQ -HCD,HCQ -ICD,ICQ -JCD,JCQ -KCD,KCQ -LCD,LCQ -MCD,MCQ -NCD,NCQ -OCD,OCQ -PCD,PCQ -QCD,QCQ -RCD,RCQ -SCD,SCQ -TCD,TCQ -UCD,UCQ -VCD,VCQ -WCD,WCQ -XCD,XCQ -YCD,YCQ -ZCD,ZCQ -ADD,ADQ -BDD,BDQ -CDD,CDQ -DDD,DDQ -EDD,EDQ -FDD,FDQ -GDD,GDQ -HDD,HDQ -IDD,IDQ -JDD,JDQ -KDD,KDQ -LDD,LDQ -MDD,MDQ -NDD,NDQ -ODD,ODQ -PDD,PDQ -QDD,QDQ -RDD,RDQ -SDD,SDQ -TDD,TDQ -UDD,UDQ -VDD,VDQ -WDD,WDQ -XDD,XDQ -YDD,YDQ -ZDD,ZDQ -AED,AEQ -BED,BEQ -CED,CEQ -DED,DEQ -EED,EEQ -FED,FEQ -GED,GEQ -HED,HEQ -IED,IEQ -JED,JEQ -KED,KEQ -LED,LEQ -MED,MEQ -NED,NEQ -OED,OEQ -PED,PEQ -QED,QEQ -RED,REQ -SED,SEQ -TED,TEQ -UED,UEQ -VED,VEQ -WED,WEQ -XED,XEQ -YED,YEQ -ZED,ZEQ -AFD,AFQ -BFD,BFQ -CFD,CFQ -DFD,DFQ -EFD,EFQ -FFD,FFQ -GFD,GFQ -HFD,HFQ -IFD,IFQ -JFD,JFQ -KFD,KFQ -LFD,LFQ -MFD,MFQ -NFD,NFQ -OFD,OFQ -PFD,PFQ -QFD,QFQ -RFD,RFQ -SFD,SFQ -TFD,TFQ -UFD,UFQ -VFD,VFQ -WFD,WFQ -XFD,XFQ -YFD,YFQ -ZFD,ZFQ -AGD,AGQ -BGD,BGQ -CGD,CGQ -DGD,DGQ -EGD,EGQ -FGD,FGQ -GGD,GGQ -HGD,HGQ -IGD,IGQ -JGD,JGQ -KGD,KGQ -LGD,LGQ -MGD,MGQ -NGD,NGQ -OGD,OGQ -PGD,PGQ -QGD,QGQ -RGD,RGQ -SGD,SGQ -TGD,TGQ -UGD,UGQ -VGD,VGQ -WGD,WGQ -XGD,XGQ -YGD,YGQ -ZGD,ZGQ -AHD,AHQ -BHD,BHQ -CHD,CHQ -DHD,DHQ -EHD,EHQ -FHD,FHQ -GHD,GHQ -HHD,HHQ -IHD,IHQ -JHD,JHQ -KHD,KHQ -LHD,LHQ -MHD,MHQ -NHD,NHQ -OHD,OHQ -PHD,PHQ -QHD,QHQ -RHD,RHQ -SHD,SHQ -THD,THQ -UHD,UHQ -VHD,VHQ -WHD,WHQ -XHD,XHQ -YHD,YHQ -ZHD,ZHQ -AID,AIQ -BID,BIQ -CID,CIQ -DID,DIQ -EID,EIQ -FID,FIQ -GID,GIQ -HID,HIQ -IID,IIQ -JID,JIQ -KID,KIQ -LID,LIQ -MID,MIQ -NID,NIQ -OID,OIQ -PID,PIQ -QID,QIQ -RID,RIQ -SID,SIQ -TID,TIQ -UID,UIQ -VID,VIQ -WID,WIQ -XID,XIQ -YID,YIQ -ZID,ZIQ -AJD,AJQ -BJD,BJQ -CJD,CJQ -DJD,DJQ -EJD,EJQ -FJD,FJQ -GJD,GJQ -HJD,HJQ -IJD,IJQ -JJD,JJQ -KJD,KJQ -LJD,LJQ -MJD,MJQ -NJD,NJQ -OJD,OJQ -PJD,PJQ -QJD,QJQ -RJD,RJQ -SJD,SJQ -TJD,TJQ -UJD,UJQ -VJD,VJQ -WJD,WJQ -XJD,XJQ -YJD,YJQ -ZJD,ZJQ -AKD,AKQ -BKD,BKQ -CKD,CKQ -DKD,DKQ -EKD,EKQ -FKD,FKQ -GKD,GKQ -HKD,HKQ -IKD,IKQ -JKD,JKQ -KKD,KKQ -LKD,LKQ -MKD,MKQ -NKD,NKQ -OKD,OKQ -PKD,PKQ -QKD,QKQ -RKD,RKQ -SKD,SKQ -TKD,TKQ -UKD,UKQ -VKD,VKQ -WKD,WKQ -XKD,XKQ -YKD,YKQ -ZKD,ZKQ -ALD,ALQ -BLD,BLQ -CLD,CLQ -DLD,DLQ -ELD,ELQ -FLD,FLQ -GLD,GLQ -HLD,HLQ -ILD,ILQ -JLD,JLQ -KLD,KLQ -LLD,LLQ -MLD,MLQ -NLD,NLQ -OLD,OLQ -PLD,PLQ -QLD,QLQ -RLD,RLQ -SLD,SLQ -TLD,TLQ -ULD,ULQ -VLD,VLQ -WLD,WLQ -XLD,XLQ -YLD,YLQ -ZLD,ZLQ -AMD,AMQ -BMD,BMQ -CMD,CMQ -DMD,DMQ -EMD,EMQ -FMD,FMQ -GMD,GMQ -HMD,HMQ -IMD,IMQ -JMD,JMQ -KMD,KMQ -LMD,LMQ -MMD,MMQ -NMD,NMQ -OMD,OMQ -PMD,PMQ -QMD,QMQ -RMD,RMQ -SMD,SMQ -TMD,TMQ -UMD,UMQ -VMD,VMQ -WMD,WMQ -XMD,XMQ -YMD,YMQ -ZMD,ZMQ -AND,ANQ -BND,BNQ -CND,CNQ -DND,DNQ -END,ENQ -FND,FNQ -GND,GNQ -HND,HNQ -IND,INQ -JND,JNQ -KND,KNQ -LND,LNQ -MND,MNQ -NND,NNQ -OND,ONQ -PND,PNQ -QND,QNQ -RND,RNQ -SND,SNQ -TND,TNQ -UND,UNQ -VND,VNQ -WND,WNQ -XND,XNQ -YND,YNQ -ZND,ZNQ -AOD,AOQ -BOD,BOQ -COD,COQ -DOD,DOQ -EOD,EOQ -FOD,FOQ -GOD,GOQ -HOD,HOQ -IOD,IOQ -JOD,JOQ -KOD,KOQ -LOD,LOQ -MOD,MOQ -NOD,NOQ -OOD,OOQ -POD,POQ -QOD,QOQ -ROD,ROQ -SOD,SOQ -TOD,TOQ -UOD,UOQ -VOD,VOQ -WOD,WOQ -XOD,XOQ -YOD,YOQ -ZOD,ZOQ -APD,APQ -BPD,BPQ -CPD,CPQ -DPD,DPQ -EPD,EPQ -FPD,FPQ -GPD,GPQ -HPD,HPQ -IPD,IPQ -JPD,JPQ -KPD,KPQ -LPD,LPQ -MPD,MPQ -NPD,NPQ -OPD,OPQ -PPD,PPQ -QPD,QPQ -RPD,RPQ -SPD,SPQ -TPD,TPQ -UPD,UPQ -VPD,VPQ -WPD,WPQ -XPD,XPQ -YPD,YPQ -ZPD,ZPQ -AQD,AQQ -BQD,BQQ -CQD,CQQ -DQD,DQQ -EQD,EQQ -FQD,FQQ -GQD,GQQ -HQD,HQQ -IQD,IQQ -JQD,JQQ -KQD,KQQ -LQD,LQQ -MQD,MQQ -NQD,NQQ -OQD,OQQ -PQD,PQQ -QQD,QQQ -RQD,RQQ -SQD,SQQ -TQD,TQQ -UQD,UQQ -VQD,VQQ -WQD,WQQ -XQD,XQQ -YQD,YQQ -ZQD,ZQQ -ARD,ARQ -BRD,BRQ -CRD,CRQ -DRD,DRQ -ERD,ERQ -FRD,FRQ -GRD,GRQ -HRD,HRQ -IRD,IRQ -JRD,JRQ -KRD,KRQ -LRD,LRQ -MRD,MRQ -NRD,NRQ -ORD,ORQ -PRD,PRQ -QRD,QRQ -RRD,RRQ -SRD,SRQ -TRD,TRQ -URD,URQ -VRD,VRQ -WRD,WRQ -XRD,XRQ -YRD,YRQ -ZRD,ZRQ -ASD,ASQ -BSD,BSQ -CSD,CSQ -DSD,DSQ -ESD,ESQ -FSD,FSQ -GSD,GSQ -HSD,HSQ -ISD,ISQ -JSD,JSQ -KSD,KSQ -LSD,LSQ -MSD,MSQ -NSD,NSQ -OSD,OSQ -PSD,PSQ -QSD,QSQ -RSD,RSQ -SSD,SSQ -TSD,TSQ -USD,USQ -VSD,VSQ -WSD,WSQ -XSD,XSQ -YSD,YSQ -ZSD,ZSQ -ATD,ATQ -BTD,BTQ -CTD,CTQ -DTD,DTQ -ETD,ETQ -FTD,FTQ -GTD,GTQ -HTD,HTQ -ITD,ITQ -JTD,JTQ -KTD,KTQ -LTD,LTQ -MTD,MTQ -NTD,NTQ -OTD,OTQ -PTD,PTQ -QTD,QTQ -RTD,RTQ -STD,STQ -TTD,TTQ -UTD,UTQ -VTD,VTQ -WTD,WTQ -XTD,XTQ -YTD,YTQ -ZTD,ZTQ -AUD,AUQ -BUD,BUQ -CUD,CUQ -DUD,DUQ -EUD,EUQ -FUD,FUQ -GUD,GUQ -HUD,HUQ -IUD,IUQ -JUD,JUQ -KUD,KUQ -LUD,LUQ -MUD,MUQ -NUD,NUQ -OUD,OUQ -PUD,PUQ -QUD,QUQ -RUD,RUQ -SUD,SUQ -TUD,TUQ -UUD,UUQ -VUD,VUQ -WUD,WUQ -XUD,XUQ -YUD,YUQ -ZUD,ZUQ -AVD,AVQ -BVD,BVQ -CVD,CVQ -DVD,DVQ -EVD,EVQ -FVD,FVQ -GVD,GVQ -HVD,HVQ -IVD,IVQ -JVD,JVQ -KVD,KVQ -LVD,LVQ -MVD,MVQ -NVD,NVQ -OVD,OVQ -PVD,PVQ -QVD,QVQ -RVD,RVQ -SVD,SVQ -TVD,TVQ -UVD,UVQ -VVD,VVQ -WVD,WVQ -XVD,XVQ -YVD,YVQ -ZVD,ZVQ -AWD,AWQ -BWD,BWQ -CWD,CWQ -DWD,DWQ -EWD,EWQ -FWD,FWQ -GWD,GWQ -HWD,HWQ -IWD,IWQ -JWD,JWQ -KWD,KWQ -LWD,LWQ -MWD,MWQ -NWD,NWQ -OWD,OWQ -PWD,PWQ -QWD,QWQ -RWD,RWQ -SWD,SWQ -TWD,TWQ -UWD,UWQ -VWD,VWQ -WWD,WWQ -XWD,XWQ -YWD,YWQ -ZWD,ZWQ -AXD,AXQ -BXD,BXQ -CXD,CXQ -DXD,DXQ -EXD,EXQ -FXD,FXQ -GXD,GXQ -HXD,HXQ -IXD,IXQ -JXD,JXQ -KXD,KXQ -LXD,LXQ -MXD,MXQ -NXD,NXQ -OXD,OXQ -PXD,PXQ -QXD,QXQ -RXD,RXQ -SXD,SXQ -TXD,TXQ -UXD,UXQ -VXD,VXQ -WXD,WXQ -XXD,XXQ -YXD,YXQ -ZXD,ZXQ -AYD,AYQ -BYD,BYQ -CYD,CYQ -DYD,DYQ -EYD,EYQ -FYD,FYQ -GYD,GYQ -HYD,HYQ -IYD,IYQ -JYD,JYQ -KYD,KYQ -LYD,LYQ -MYD,MYQ -NYD,NYQ -OYD,OYQ -PYD,PYQ -QYD,QYQ -RYD,RYQ -SYD,SYQ -TYD,TYQ -UYD,UYQ -VYD,VYQ -WYD,WYQ -XYD,XYQ -YYD,YYQ -ZYD,ZYQ -AZD,AZQ -BZD,BZQ -CZD,CZQ -DZD,DZQ -EZD,EZQ -FZD,FZQ -GZD,GZQ -HZD,HZQ -IZD,IZQ -JZD,JZQ -KZD,KZQ -LZD,LZQ -MZD,MZQ -NZD,NZQ -OZD,OZQ -PZD,PZQ -QZD,QZQ -RZD,RZQ -SZD,SZQ -TZD,TZQ -UZD,UZQ -VZD,VZQ -WZD,WZQ -XZD,XZQ -YZD,YZQ -ZZD,ZZQ -AAE,AAR -BAE,BAR -CAE,CAR -DAE,DAR -EAE,EAR -FAE,FAR -GAE,GAR -HAE,HAR -IAE,IAR -JAE,JAR -KAE,KAR -LAE,LAR -MAE,MAR -NAE,NAR -OAE,OAR -PAE,PAR -QAE,QAR -RAE,RAR -SAE,SAR -TAE,TAR -UAE,UAR -VAE,VAR -WAE,WAR -XAE,XAR -YAE,YAR -ZAE,ZAR -ABE,ABR -BBE,BBR -CBE,CBR -DBE,DBR -EBE,EBR -FBE,FBR -GBE,GBR -HBE,HBR -IBE,IBR -JBE,JBR -KBE,KBR -LBE,LBR -MBE,MBR -NBE,NBR -OBE,OBR -PBE,PBR -QBE,QBR -RBE,RBR -SBE,SBR -TBE,TBR -UBE,UBR -VBE,VBR -WBE,WBR -XBE,XBR -YBE,YBR -ZBE,ZBR -ACE,ACR -BCE,BCR -CCE,CCR -DCE,DCR -ECE,ECR -FCE,FCR -GCE,GCR -HCE,HCR -ICE,ICR -JCE,JCR -KCE,KCR -LCE,LCR -MCE,MCR -NCE,NCR -OCE,OCR -PCE,PCR -QCE,QCR -RCE,RCR -SCE,SCR -TCE,TCR -UCE,UCR -VCE,VCR -WCE,WCR -XCE,XCR -YCE,YCR -ZCE,ZCR -ADE,ADR -BDE,BDR -CDE,CDR -DDE,DDR -EDE,EDR -FDE,FDR -GDE,GDR -HDE,HDR -IDE,IDR -JDE,JDR -KDE,KDR -LDE,LDR -MDE,MDR -NDE,NDR -ODE,ODR -PDE,PDR -QDE,QDR -RDE,RDR -SDE,SDR -TDE,TDR -UDE,UDR -VDE,VDR -WDE,WDR -XDE,XDR -YDE,YDR -ZDE,ZDR -AEE,AER -BEE,BER -CEE,CER -DEE,DER -EEE,EER -FEE,FER -GEE,GER -HEE,HER -IEE,IER -JEE,JER -KEE,KER -LEE,LER -MEE,MER -NEE,NER -OEE,OER -PEE,PER -QEE,QER -REE,RER -SEE,SER -TEE,TER -UEE,UER -VEE,VER -WEE,WER -XEE,XER -YEE,YER -ZEE,ZER -AFE,AFR -BFE,BFR -CFE,CFR -DFE,DFR -EFE,EFR -FFE,FFR -GFE,GFR -HFE,HFR -IFE,IFR -JFE,JFR -KFE,KFR -LFE,LFR -MFE,MFR -NFE,NFR -OFE,OFR -PFE,PFR -QFE,QFR -RFE,RFR -SFE,SFR -TFE,TFR -UFE,UFR -VFE,VFR -WFE,WFR -XFE,XFR -YFE,YFR -ZFE,ZFR -AGE,AGR -BGE,BGR -CGE,CGR -DGE,DGR -EGE,EGR -FGE,FGR -GGE,GGR -HGE,HGR -IGE,IGR -JGE,JGR -KGE,KGR -LGE,LGR -MGE,MGR -NGE,NGR -OGE,OGR -PGE,PGR -QGE,QGR -RGE,RGR -SGE,SGR -TGE,TGR -UGE,UGR -VGE,VGR -WGE,WGR -XGE,XGR -YGE,YGR -ZGE,ZGR -AHE,AHR -BHE,BHR -CHE,CHR -DHE,DHR -EHE,EHR -FHE,FHR -GHE,GHR -HHE,HHR -IHE,IHR -JHE,JHR -KHE,KHR -LHE,LHR -MHE,MHR -NHE,NHR -OHE,OHR -PHE,PHR -QHE,QHR -RHE,RHR -SHE,SHR -THE,THR -UHE,UHR -VHE,VHR -WHE,WHR -XHE,XHR -YHE,YHR -ZHE,ZHR -AIE,AIR -BIE,BIR -CIE,CIR -DIE,DIR -EIE,EIR -FIE,FIR -GIE,GIR -HIE,HIR -IIE,IIR -JIE,JIR -KIE,KIR -LIE,LIR -MIE,MIR -NIE,NIR -OIE,OIR -PIE,PIR -QIE,QIR -RIE,RIR -SIE,SIR -TIE,TIR -UIE,UIR -VIE,VIR -WIE,WIR -XIE,XIR -YIE,YIR -ZIE,ZIR -AJE,AJR -BJE,BJR -CJE,CJR -DJE,DJR -EJE,EJR -FJE,FJR -GJE,GJR -HJE,HJR -IJE,IJR -JJE,JJR -KJE,KJR -LJE,LJR -MJE,MJR -NJE,NJR -OJE,OJR -PJE,PJR -QJE,QJR -RJE,RJR -SJE,SJR -TJE,TJR -UJE,UJR -VJE,VJR -WJE,WJR -XJE,XJR -YJE,YJR -ZJE,ZJR -AKE,AKR -BKE,BKR -CKE,CKR -DKE,DKR -EKE,EKR -FKE,FKR -GKE,GKR -HKE,HKR -IKE,IKR -JKE,JKR -KKE,KKR -LKE,LKR -MKE,MKR -NKE,NKR -OKE,OKR -PKE,PKR -QKE,QKR -RKE,RKR -SKE,SKR -TKE,TKR -UKE,UKR -VKE,VKR -WKE,WKR -XKE,XKR -YKE,YKR -ZKE,ZKR -ALE,ALR -BLE,BLR -CLE,CLR -DLE,DLR -ELE,ELR -FLE,FLR -GLE,GLR -HLE,HLR -ILE,ILR -JLE,JLR -KLE,KLR -LLE,LLR -MLE,MLR -NLE,NLR -OLE,OLR -PLE,PLR -QLE,QLR -RLE,RLR -SLE,SLR -TLE,TLR -ULE,ULR -VLE,VLR -WLE,WLR -XLE,XLR -YLE,YLR -ZLE,ZLR -AME,AMR -BME,BMR -CME,CMR -DME,DMR -EME,EMR -FME,FMR -GME,GMR -HME,HMR -IME,IMR -JME,JMR -KME,KMR -LME,LMR -MME,MMR -NME,NMR -OME,OMR -PME,PMR -QME,QMR -RME,RMR -SME,SMR -TME,TMR -UME,UMR -VME,VMR -WME,WMR -XME,XMR -YME,YMR -ZME,ZMR -ANE,ANR -BNE,BNR -CNE,CNR -DNE,DNR -ENE,ENR -FNE,FNR -GNE,GNR -HNE,HNR -INE,INR -JNE,JNR -KNE,KNR -LNE,LNR -MNE,MNR -NNE,NNR -ONE,ONR -PNE,PNR -QNE,QNR -RNE,RNR -SNE,SNR -TNE,TNR -UNE,UNR -VNE,VNR -WNE,WNR -XNE,XNR -YNE,YNR -ZNE,ZNR -AOE,AOR -BOE,BOR -COE,COR -DOE,DOR -EOE,EOR -FOE,FOR -GOE,GOR -HOE,HOR -IOE,IOR -JOE,JOR -KOE,KOR -LOE,LOR -MOE,MOR -NOE,NOR -OOE,OOR -POE,POR -QOE,QOR -ROE,ROR -SOE,SOR -TOE,TOR -UOE,UOR -VOE,VOR -WOE,WOR -XOE,XOR -YOE,YOR -ZOE,ZOR -APE,APR -BPE,BPR -CPE,CPR -DPE,DPR -EPE,EPR -FPE,FPR -GPE,GPR -HPE,HPR -IPE,IPR -JPE,JPR -KPE,KPR -LPE,LPR -MPE,MPR -NPE,NPR -OPE,OPR -PPE,PPR -QPE,QPR -RPE,RPR -SPE,SPR -TPE,TPR -UPE,UPR -VPE,VPR -WPE,WPR -XPE,XPR -YPE,YPR -ZPE,ZPR -AQE,AQR -BQE,BQR -CQE,CQR -DQE,DQR -EQE,EQR -FQE,FQR -GQE,GQR -HQE,HQR -IQE,IQR -JQE,JQR -KQE,KQR -LQE,LQR -MQE,MQR -NQE,NQR -OQE,OQR -PQE,PQR -QQE,QQR -RQE,RQR -SQE,SQR -TQE,TQR -UQE,UQR -VQE,VQR -WQE,WQR -XQE,XQR -YQE,YQR -ZQE,ZQR -ARE,ARR -BRE,BRR -CRE,CRR -DRE,DRR -ERE,ERR -FRE,FRR -GRE,GRR -HRE,HRR -IRE,IRR -JRE,JRR -KRE,KRR -LRE,LRR -MRE,MRR -NRE,NRR -ORE,ORR -PRE,PRR -QRE,QRR -RRE,RRR -SRE,SRR -TRE,TRR -URE,URR -VRE,VRR -WRE,WRR -XRE,XRR -YRE,YRR -ZRE,ZRR -ASE,ASR -BSE,BSR -CSE,CSR -DSE,DSR -ESE,ESR -FSE,FSR -GSE,GSR -HSE,HSR -ISE,ISR -JSE,JSR -KSE,KSR -LSE,LSR -MSE,MSR -NSE,NSR -OSE,OSR -PSE,PSR -QSE,QSR -RSE,RSR -SSE,SSR -TSE,TSR -USE,USR -VSE,VSR -WSE,WSR -XSE,XSR -YSE,YSR -ZSE,ZSR -ATE,ATR -BTE,BTR -CTE,CTR -DTE,DTR -ETE,ETR -FTE,FTR -GTE,GTR -HTE,HTR -ITE,ITR -JTE,JTR -KTE,KTR -LTE,LTR -MTE,MTR -NTE,NTR -OTE,OTR -PTE,PTR -QTE,QTR -RTE,RTR -STE,STR -TTE,TTR -UTE,UTR -VTE,VTR -WTE,WTR -XTE,XTR -YTE,YTR -ZTE,ZTR -AUE,AUR -BUE,BUR -CUE,CUR -DUE,DUR -EUE,EUR -FUE,FUR -GUE,GUR -HUE,HUR -IUE,IUR -JUE,JUR -KUE,KUR -LUE,LUR -MUE,MUR -NUE,NUR -OUE,OUR -PUE,PUR -QUE,QUR -RUE,RUR -SUE,SUR -TUE,TUR -UUE,UUR -VUE,VUR -WUE,WUR -XUE,XUR -YUE,YUR -ZUE,ZUR -AVE,AVR -BVE,BVR -CVE,CVR -DVE,DVR -EVE,EVR -FVE,FVR -GVE,GVR -HVE,HVR -IVE,IVR -JVE,JVR -KVE,KVR -LVE,LVR -MVE,MVR -NVE,NVR -OVE,OVR -PVE,PVR -QVE,QVR -RVE,RVR -SVE,SVR -TVE,TVR -UVE,UVR -VVE,VVR -WVE,WVR -XVE,XVR -YVE,YVR -ZVE,ZVR -AWE,AWR -BWE,BWR -CWE,CWR -DWE,DWR -EWE,EWR -FWE,FWR -GWE,GWR -HWE,HWR -IWE,IWR -JWE,JWR -KWE,KWR -LWE,LWR -MWE,MWR -NWE,NWR -OWE,OWR -PWE,PWR -QWE,QWR -RWE,RWR -SWE,SWR -TWE,TWR -UWE,UWR -VWE,VWR -WWE,WWR -XWE,XWR -YWE,YWR -ZWE,ZWR -AXE,AXR -BXE,BXR -CXE,CXR -DXE,DXR -EXE,EXR -FXE,FXR -GXE,GXR -HXE,HXR -IXE,IXR -JXE,JXR -KXE,KXR -LXE,LXR -MXE,MXR -NXE,NXR -OXE,OXR -PXE,PXR -QXE,QXR -RXE,RXR -SXE,SXR -TXE,TXR -UXE,UXR -VXE,VXR -WXE,WXR -XXE,XXR -YXE,YXR -ZXE,ZXR -AYE,AYR -BYE,BYR -CYE,CYR -DYE,DYR -EYE,EYR -FYE,FYR -GYE,GYR -HYE,HYR -IYE,IYR -JYE,JYR -KYE,KYR -LYE,LYR -MYE,MYR -NYE,NYR -OYE,OYR -PYE,PYR -QYE,QYR -RYE,RYR -SYE,SYR -TYE,TYR -UYE,UYR -VYE,VYR -WYE,WYR -XYE,XYR -YYE,YYR -ZYE,ZYR -AZE,AZR -BZE,BZR -CZE,CZR -DZE,DZR -EZE,EZR -FZE,FZR -GZE,GZR -HZE,HZR -IZE,IZR -JZE,JZR -KZE,KZR -LZE,LZR -MZE,MZR -NZE,NZR -OZE,OZR -PZE,PZR -QZE,QZR -RZE,RZR -SZE,SZR -TZE,TZR -UZE,UZR -VZE,VZR -WZE,WZR -XZE,XZR -YZE,YZR -ZZE,ZZR -AAF,AAS -BAF,BAS -CAF,CAS -DAF,DAS -EAF,EAS -FAF,FAS -GAF,GAS -HAF,HAS -IAF,IAS -JAF,JAS -KAF,KAS -LAF,LAS -MAF,MAS -NAF,NAS -OAF,OAS -PAF,PAS -QAF,QAS -RAF,RAS -SAF,SAS -TAF,TAS -UAF,UAS -VAF,VAS -WAF,WAS -XAF,XAS -YAF,YAS -ZAF,ZAS -ABF,ABS -BBF,BBS -CBF,CBS -DBF,DBS -EBF,EBS -FBF,FBS -GBF,GBS -HBF,HBS -IBF,IBS -JBF,JBS -KBF,KBS -LBF,LBS -MBF,MBS -NBF,NBS -OBF,OBS -PBF,PBS -QBF,QBS -RBF,RBS -SBF,SBS -TBF,TBS -UBF,UBS -VBF,VBS -WBF,WBS -XBF,XBS -YBF,YBS -ZBF,ZBS -ACF,ACS -BCF,BCS -CCF,CCS -DCF,DCS -ECF,ECS -FCF,FCS -GCF,GCS -HCF,HCS -ICF,ICS -JCF,JCS -KCF,KCS -LCF,LCS -MCF,MCS -NCF,NCS -OCF,OCS -PCF,PCS -QCF,QCS -RCF,RCS -SCF,SCS -TCF,TCS -UCF,UCS -VCF,VCS -WCF,WCS -XCF,XCS -YCF,YCS -ZCF,ZCS -ADF,ADS -BDF,BDS -CDF,CDS -DDF,DDS -EDF,EDS -FDF,FDS -GDF,GDS -HDF,HDS -IDF,IDS -JDF,JDS -KDF,KDS -LDF,LDS -MDF,MDS -NDF,NDS -ODF,ODS -PDF,PDS -QDF,QDS -RDF,RDS -SDF,SDS -TDF,TDS -UDF,UDS -VDF,VDS -WDF,WDS -XDF,XDS -YDF,YDS -ZDF,ZDS -AEF,AES -BEF,BES -CEF,CES -DEF,DES -EEF,EES -FEF,FES -GEF,GES -HEF,HES -IEF,IES -JEF,JES -KEF,KES -LEF,LES -MEF,MES -NEF,NES -OEF,OES -PEF,PES -QEF,QES -REF,RES -SEF,SES -TEF,TES -UEF,UES -VEF,VES -WEF,WES -XEF,XES -YEF,YES -ZEF,ZES -AFF,AFS -BFF,BFS -CFF,CFS -DFF,DFS -EFF,EFS -FFF,FFS -GFF,GFS -HFF,HFS -IFF,IFS -JFF,JFS -KFF,KFS -LFF,LFS -MFF,MFS -NFF,NFS -OFF,OFS -PFF,PFS -QFF,QFS -RFF,RFS -SFF,SFS -TFF,TFS -UFF,UFS -VFF,VFS -WFF,WFS -XFF,XFS -YFF,YFS -ZFF,ZFS -AGF,AGS -BGF,BGS -CGF,CGS -DGF,DGS -EGF,EGS -FGF,FGS -GGF,GGS -HGF,HGS -IGF,IGS -JGF,JGS -KGF,KGS -LGF,LGS -MGF,MGS -NGF,NGS -OGF,OGS -PGF,PGS -QGF,QGS -RGF,RGS -SGF,SGS -TGF,TGS -UGF,UGS -VGF,VGS -WGF,WGS -XGF,XGS -YGF,YGS -ZGF,ZGS -AHF,AHS -BHF,BHS -CHF,CHS -DHF,DHS -EHF,EHS -FHF,FHS -GHF,GHS -HHF,HHS -IHF,IHS -JHF,JHS -KHF,KHS -LHF,LHS -MHF,MHS -NHF,NHS -OHF,OHS -PHF,PHS -QHF,QHS -RHF,RHS -SHF,SHS -THF,THS -UHF,UHS -VHF,VHS -WHF,WHS -XHF,XHS -YHF,YHS -ZHF,ZHS -AIF,AIS -BIF,BIS -CIF,CIS -DIF,DIS -EIF,EIS -FIF,FIS -GIF,GIS -HIF,HIS -IIF,IIS -JIF,JIS -KIF,KIS -LIF,LIS -MIF,MIS -NIF,NIS -OIF,OIS -PIF,PIS -QIF,QIS -RIF,RIS -SIF,SIS -TIF,TIS -UIF,UIS -VIF,VIS -WIF,WIS -XIF,XIS -YIF,YIS -ZIF,ZIS -AJF,AJS -BJF,BJS -CJF,CJS -DJF,DJS -EJF,EJS -FJF,FJS -GJF,GJS -HJF,HJS -IJF,IJS -JJF,JJS -KJF,KJS -LJF,LJS -MJF,MJS -NJF,NJS -OJF,OJS -PJF,PJS -QJF,QJS -RJF,RJS -SJF,SJS -TJF,TJS -UJF,UJS -VJF,VJS -WJF,WJS -XJF,XJS -YJF,YJS -ZJF,ZJS -AKF,AKS -BKF,BKS -CKF,CKS -DKF,DKS -EKF,EKS -FKF,FKS -GKF,GKS -HKF,HKS -IKF,IKS -JKF,JKS -KKF,KKS -LKF,LKS -MKF,MKS -NKF,NKS -OKF,OKS -PKF,PKS -QKF,QKS -RKF,RKS -SKF,SKS -TKF,TKS -UKF,UKS -VKF,VKS -WKF,WKS -XKF,XKS -YKF,YKS -ZKF,ZKS -ALF,ALS -BLF,BLS -CLF,CLS -DLF,DLS -ELF,ELS -FLF,FLS -GLF,GLS -HLF,HLS -ILF,ILS -JLF,JLS -KLF,KLS -LLF,LLS -MLF,MLS -NLF,NLS -OLF,OLS -PLF,PLS -QLF,QLS -RLF,RLS -SLF,SLS -TLF,TLS -ULF,ULS -VLF,VLS -WLF,WLS -XLF,XLS -YLF,YLS -ZLF,ZLS -AMF,AMS -BMF,BMS -CMF,CMS -DMF,DMS -EMF,EMS -FMF,FMS -GMF,GMS -HMF,HMS -IMF,IMS -JMF,JMS -KMF,KMS -LMF,LMS -MMF,MMS -NMF,NMS -OMF,OMS -PMF,PMS -QMF,QMS -RMF,RMS -SMF,SMS -TMF,TMS -UMF,UMS -VMF,VMS -WMF,WMS -XMF,XMS -YMF,YMS -ZMF,ZMS -ANF,ANS -BNF,BNS -CNF,CNS -DNF,DNS -ENF,ENS -FNF,FNS -GNF,GNS -HNF,HNS -INF,INS -JNF,JNS -KNF,KNS -LNF,LNS -MNF,MNS -NNF,NNS -ONF,ONS -PNF,PNS -QNF,QNS -RNF,RNS -SNF,SNS -TNF,TNS -UNF,UNS -VNF,VNS -WNF,WNS -XNF,XNS -YNF,YNS -ZNF,ZNS -AOF,AOS -BOF,BOS -COF,COS -DOF,DOS -EOF,EOS -FOF,FOS -GOF,GOS -HOF,HOS -IOF,IOS -JOF,JOS -KOF,KOS -LOF,LOS -MOF,MOS -NOF,NOS -OOF,OOS -POF,POS -QOF,QOS -ROF,ROS -SOF,SOS -TOF,TOS -UOF,UOS -VOF,VOS -WOF,WOS -XOF,XOS -YOF,YOS -ZOF,ZOS -APF,APS -BPF,BPS -CPF,CPS -DPF,DPS -EPF,EPS -FPF,FPS -GPF,GPS -HPF,HPS -IPF,IPS -JPF,JPS -KPF,KPS -LPF,LPS -MPF,MPS -NPF,NPS -OPF,OPS -PPF,PPS -QPF,QPS -RPF,RPS -SPF,SPS -TPF,TPS -UPF,UPS -VPF,VPS -WPF,WPS -XPF,XPS -YPF,YPS -ZPF,ZPS -AQF,AQS -BQF,BQS -CQF,CQS -DQF,DQS -EQF,EQS -FQF,FQS -GQF,GQS -HQF,HQS -IQF,IQS -JQF,JQS -KQF,KQS -LQF,LQS -MQF,MQS -NQF,NQS -OQF,OQS -PQF,PQS -QQF,QQS -RQF,RQS -SQF,SQS -TQF,TQS -UQF,UQS -VQF,VQS -WQF,WQS -XQF,XQS -YQF,YQS -ZQF,ZQS -ARF,ARS -BRF,BRS -CRF,CRS -DRF,DRS -ERF,ERS -FRF,FRS -GRF,GRS -HRF,HRS -IRF,IRS -JRF,JRS -KRF,KRS -LRF,LRS -MRF,MRS -NRF,NRS -ORF,ORS -PRF,PRS -QRF,QRS -RRF,RRS -SRF,SRS -TRF,TRS -URF,URS -VRF,VRS -WRF,WRS -XRF,XRS -YRF,YRS -ZRF,ZRS -ASF,ASS -BSF,BSS -CSF,CSS -DSF,DSS -ESF,ESS -FSF,FSS -GSF,GSS -HSF,HSS -ISF,ISS -JSF,JSS -KSF,KSS -LSF,LSS -MSF,MSS -NSF,NSS -OSF,OSS -PSF,PSS -QSF,QSS -RSF,RSS -SSF,SSS -TSF,TSS -USF,USS -VSF,VSS -WSF,WSS -XSF,XSS -YSF,YSS -ZSF,ZSS -ATF,ATS -BTF,BTS -CTF,CTS -DTF,DTS -ETF,ETS -FTF,FTS -GTF,GTS -HTF,HTS -ITF,ITS -JTF,JTS -KTF,KTS -LTF,LTS -MTF,MTS -NTF,NTS -OTF,OTS -PTF,PTS -QTF,QTS -RTF,RTS -STF,STS -TTF,TTS -UTF,UTS -VTF,VTS -WTF,WTS -XTF,XTS -YTF,YTS -ZTF,ZTS -AUF,AUS -BUF,BUS -CUF,CUS -DUF,DUS -EUF,EUS -FUF,FUS -GUF,GUS -HUF,HUS -IUF,IUS -JUF,JUS -KUF,KUS -LUF,LUS -MUF,MUS -NUF,NUS -OUF,OUS -PUF,PUS -QUF,QUS -RUF,RUS -SUF,SUS -TUF,TUS -UUF,UUS -VUF,VUS -WUF,WUS -XUF,XUS -YUF,YUS -ZUF,ZUS -AVF,AVS -BVF,BVS -CVF,CVS -DVF,DVS -EVF,EVS -FVF,FVS -GVF,GVS -HVF,HVS -IVF,IVS -JVF,JVS -KVF,KVS -LVF,LVS -MVF,MVS -NVF,NVS -OVF,OVS -PVF,PVS -QVF,QVS -RVF,RVS -SVF,SVS -TVF,TVS -UVF,UVS -VVF,VVS -WVF,WVS -XVF,XVS -YVF,YVS -ZVF,ZVS -AWF,AWS -BWF,BWS -CWF,CWS -DWF,DWS -EWF,EWS -FWF,FWS -GWF,GWS -HWF,HWS -IWF,IWS -JWF,JWS -KWF,KWS -LWF,LWS -MWF,MWS -NWF,NWS -OWF,OWS -PWF,PWS -QWF,QWS -RWF,RWS -SWF,SWS -TWF,TWS -UWF,UWS -VWF,VWS -WWF,WWS -XWF,XWS -YWF,YWS -ZWF,ZWS -AXF,AXS -BXF,BXS -CXF,CXS -DXF,DXS -EXF,EXS -FXF,FXS -GXF,GXS -HXF,HXS -IXF,IXS -JXF,JXS -KXF,KXS -LXF,LXS -MXF,MXS -NXF,NXS -OXF,OXS -PXF,PXS -QXF,QXS -RXF,RXS -SXF,SXS -TXF,TXS -UXF,UXS -VXF,VXS -WXF,WXS -XXF,XXS -YXF,YXS -ZXF,ZXS -AYF,AYS -BYF,BYS -CYF,CYS -DYF,DYS -EYF,EYS -FYF,FYS -GYF,GYS -HYF,HYS -IYF,IYS -JYF,JYS -KYF,KYS -LYF,LYS -MYF,MYS -NYF,NYS -OYF,OYS -PYF,PYS -QYF,QYS -RYF,RYS -SYF,SYS -TYF,TYS -UYF,UYS -VYF,VYS -WYF,WYS -XYF,XYS -YYF,YYS -ZYF,ZYS -AZF,AZS -BZF,BZS -CZF,CZS -DZF,DZS -EZF,EZS -FZF,FZS -GZF,GZS -HZF,HZS -IZF,IZS -JZF,JZS -KZF,KZS -LZF,LZS -MZF,MZS -NZF,NZS -OZF,OZS -PZF,PZS -QZF,QZS -RZF,RZS -SZF,SZS -TZF,TZS -UZF,UZS -VZF,VZS -WZF,WZS -XZF,XZS -YZF,YZS -ZZF,ZZS -AAG,AAT -BAG,BAT -CAG,CAT -DAG,DAT -EAG,EAT -FAG,FAT -GAG,GAT -HAG,HAT -IAG,IAT -JAG,JAT -KAG,KAT -LAG,LAT -MAG,MAT -NAG,NAT -OAG,OAT -PAG,PAT -QAG,QAT -RAG,RAT -SAG,SAT -TAG,TAT -UAG,UAT -VAG,VAT -WAG,WAT -XAG,XAT -YAG,YAT -ZAG,ZAT -ABG,ABT -BBG,BBT -CBG,CBT -DBG,DBT -EBG,EBT -FBG,FBT -GBG,GBT -HBG,HBT -IBG,IBT -JBG,JBT -KBG,KBT -LBG,LBT -MBG,MBT -NBG,NBT -OBG,OBT -PBG,PBT -QBG,QBT -RBG,RBT -SBG,SBT -TBG,TBT -UBG,UBT -VBG,VBT -WBG,WBT -XBG,XBT -YBG,YBT -ZBG,ZBT -ACG,ACT -BCG,BCT -CCG,CCT -DCG,DCT -ECG,ECT -FCG,FCT -GCG,GCT -HCG,HCT -ICG,ICT -JCG,JCT -KCG,KCT -LCG,LCT -MCG,MCT -NCG,NCT -OCG,OCT -PCG,PCT -QCG,QCT -RCG,RCT -SCG,SCT -TCG,TCT -UCG,UCT -VCG,VCT -WCG,WCT -XCG,XCT -YCG,YCT -ZCG,ZCT -ADG,ADT -BDG,BDT -CDG,CDT -DDG,DDT -EDG,EDT -FDG,FDT -GDG,GDT -HDG,HDT -IDG,IDT -JDG,JDT -KDG,KDT -LDG,LDT -MDG,MDT -NDG,NDT -ODG,ODT -PDG,PDT -QDG,QDT -RDG,RDT -SDG,SDT -TDG,TDT -UDG,UDT -VDG,VDT -WDG,WDT -XDG,XDT -YDG,YDT -ZDG,ZDT -AEG,AET -BEG,BET -CEG,CET -DEG,DET -EEG,EET -FEG,FET -GEG,GET -HEG,HET -IEG,IET -JEG,JET -KEG,KET -LEG,LET -MEG,MET -NEG,NET -OEG,OET -PEG,PET -QEG,QET -REG,RET -SEG,SET -TEG,TET -UEG,UET -VEG,VET -WEG,WET -XEG,XET -YEG,YET -ZEG,ZET -AFG,AFT -BFG,BFT -CFG,CFT -DFG,DFT -EFG,EFT -FFG,FFT -GFG,GFT -HFG,HFT -IFG,IFT -JFG,JFT -KFG,KFT -LFG,LFT -MFG,MFT -NFG,NFT -OFG,OFT -PFG,PFT -QFG,QFT -RFG,RFT -SFG,SFT -TFG,TFT -UFG,UFT -VFG,VFT -WFG,WFT -XFG,XFT -YFG,YFT -ZFG,ZFT -AGG,AGT -BGG,BGT -CGG,CGT -DGG,DGT -EGG,EGT -FGG,FGT -GGG,GGT -HGG,HGT -IGG,IGT -JGG,JGT -KGG,KGT -LGG,LGT -MGG,MGT -NGG,NGT -OGG,OGT -PGG,PGT -QGG,QGT -RGG,RGT -SGG,SGT -TGG,TGT -UGG,UGT -VGG,VGT -WGG,WGT -XGG,XGT -YGG,YGT -ZGG,ZGT -AHG,AHT -BHG,BHT -CHG,CHT -DHG,DHT -EHG,EHT -FHG,FHT -GHG,GHT -HHG,HHT -IHG,IHT -JHG,JHT -KHG,KHT -LHG,LHT -MHG,MHT -NHG,NHT -OHG,OHT -PHG,PHT -QHG,QHT -RHG,RHT -SHG,SHT -THG,THT -UHG,UHT -VHG,VHT -WHG,WHT -XHG,XHT -YHG,YHT -ZHG,ZHT -AIG,AIT -BIG,BIT -CIG,CIT -DIG,DIT -EIG,EIT -FIG,FIT -GIG,GIT -HIG,HIT -IIG,IIT -JIG,JIT -KIG,KIT -LIG,LIT -MIG,MIT -NIG,NIT -OIG,OIT -PIG,PIT -QIG,QIT -RIG,RIT -SIG,SIT -TIG,TIT -UIG,UIT -VIG,VIT -WIG,WIT -XIG,XIT -YIG,YIT -ZIG,ZIT -AJG,AJT -BJG,BJT -CJG,CJT -DJG,DJT -EJG,EJT -FJG,FJT -GJG,GJT -HJG,HJT -IJG,IJT -JJG,JJT -KJG,KJT -LJG,LJT -MJG,MJT -NJG,NJT -OJG,OJT -PJG,PJT -QJG,QJT -RJG,RJT -SJG,SJT -TJG,TJT -UJG,UJT -VJG,VJT -WJG,WJT -XJG,XJT -YJG,YJT -ZJG,ZJT -AKG,AKT -BKG,BKT -CKG,CKT -DKG,DKT -EKG,EKT -FKG,FKT -GKG,GKT -HKG,HKT -IKG,IKT -JKG,JKT -KKG,KKT -LKG,LKT -MKG,MKT -NKG,NKT -OKG,OKT -PKG,PKT -QKG,QKT -RKG,RKT -SKG,SKT -TKG,TKT -UKG,UKT -VKG,VKT -WKG,WKT -XKG,XKT -YKG,YKT -ZKG,ZKT -ALG,ALT -BLG,BLT -CLG,CLT -DLG,DLT -ELG,ELT -FLG,FLT -GLG,GLT -HLG,HLT -ILG,ILT -JLG,JLT -KLG,KLT -LLG,LLT -MLG,MLT -NLG,NLT -OLG,OLT -PLG,PLT -QLG,QLT -RLG,RLT -SLG,SLT -TLG,TLT -ULG,ULT -VLG,VLT -WLG,WLT -XLG,XLT -YLG,YLT -ZLG,ZLT -AMG,AMT -BMG,BMT -CMG,CMT -DMG,DMT -EMG,EMT -FMG,FMT -GMG,GMT -HMG,HMT -IMG,IMT -JMG,JMT -KMG,KMT -LMG,LMT -MMG,MMT -NMG,NMT -OMG,OMT -PMG,PMT -QMG,QMT -RMG,RMT -SMG,SMT -TMG,TMT -UMG,UMT -VMG,VMT -WMG,WMT -XMG,XMT -YMG,YMT -ZMG,ZMT -ANG,ANT -BNG,BNT -CNG,CNT -DNG,DNT -ENG,ENT -FNG,FNT -GNG,GNT -HNG,HNT -ING,INT -JNG,JNT -KNG,KNT -LNG,LNT -MNG,MNT -NNG,NNT -ONG,ONT -PNG,PNT -QNG,QNT -RNG,RNT -SNG,SNT -TNG,TNT -UNG,UNT -VNG,VNT -WNG,WNT -XNG,XNT -YNG,YNT -ZNG,ZNT -AOG,AOT -BOG,BOT -COG,COT -DOG,DOT -EOG,EOT -FOG,FOT -GOG,GOT -HOG,HOT -IOG,IOT -JOG,JOT -KOG,KOT -LOG,LOT -MOG,MOT -NOG,NOT -OOG,OOT -POG,POT -QOG,QOT -ROG,ROT -SOG,SOT -TOG,TOT -UOG,UOT -VOG,VOT -WOG,WOT -XOG,XOT -YOG,YOT -ZOG,ZOT -APG,APT -BPG,BPT -CPG,CPT -DPG,DPT -EPG,EPT -FPG,FPT -GPG,GPT -HPG,HPT -IPG,IPT -JPG,JPT -KPG,KPT -LPG,LPT -MPG,MPT -NPG,NPT -OPG,OPT -PPG,PPT -QPG,QPT -RPG,RPT -SPG,SPT -TPG,TPT -UPG,UPT -VPG,VPT -WPG,WPT -XPG,XPT -YPG,YPT -ZPG,ZPT -AQG,AQT -BQG,BQT -CQG,CQT -DQG,DQT -EQG,EQT -FQG,FQT -GQG,GQT -HQG,HQT -IQG,IQT -JQG,JQT -KQG,KQT -LQG,LQT -MQG,MQT -NQG,NQT -OQG,OQT -PQG,PQT -QQG,QQT -RQG,RQT -SQG,SQT -TQG,TQT -UQG,UQT -VQG,VQT -WQG,WQT -XQG,XQT -YQG,YQT -ZQG,ZQT -ARG,ART -BRG,BRT -CRG,CRT -DRG,DRT -ERG,ERT -FRG,FRT -GRG,GRT -HRG,HRT -IRG,IRT -JRG,JRT -KRG,KRT -LRG,LRT -MRG,MRT -NRG,NRT -ORG,ORT -PRG,PRT -QRG,QRT -RRG,RRT -SRG,SRT -TRG,TRT -URG,URT -VRG,VRT -WRG,WRT -XRG,XRT -YRG,YRT -ZRG,ZRT -ASG,AST -BSG,BST -CSG,CST -DSG,DST -ESG,EST -FSG,FST -GSG,GST -HSG,HST -ISG,IST -JSG,JST -KSG,KST -LSG,LST -MSG,MST -NSG,NST -OSG,OST -PSG,PST -QSG,QST -RSG,RST -SSG,SST -TSG,TST -USG,UST -VSG,VST -WSG,WST -XSG,XST -YSG,YST -ZSG,ZST -ATG,ATT -BTG,BTT -CTG,CTT -DTG,DTT -ETG,ETT -FTG,FTT -GTG,GTT -HTG,HTT -ITG,ITT -JTG,JTT -KTG,KTT -LTG,LTT -MTG,MTT -NTG,NTT -OTG,OTT -PTG,PTT -QTG,QTT -RTG,RTT -STG,STT -TTG,TTT -UTG,UTT -VTG,VTT -WTG,WTT -XTG,XTT -YTG,YTT -ZTG,ZTT -AUG,AUT -BUG,BUT -CUG,CUT -DUG,DUT -EUG,EUT -FUG,FUT -GUG,GUT -HUG,HUT -IUG,IUT -JUG,JUT -KUG,KUT -LUG,LUT -MUG,MUT -NUG,NUT -OUG,OUT -PUG,PUT -QUG,QUT -RUG,RUT -SUG,SUT -TUG,TUT -UUG,UUT -VUG,VUT -WUG,WUT -XUG,XUT -YUG,YUT -ZUG,ZUT -AVG,AVT -BVG,BVT -CVG,CVT -DVG,DVT -EVG,EVT -FVG,FVT -GVG,GVT -HVG,HVT -IVG,IVT -JVG,JVT -KVG,KVT -LVG,LVT -MVG,MVT -NVG,NVT -OVG,OVT -PVG,PVT -QVG,QVT -RVG,RVT -SVG,SVT -TVG,TVT -UVG,UVT -VVG,VVT -WVG,WVT -XVG,XVT -YVG,YVT -ZVG,ZVT -AWG,AWT -BWG,BWT -CWG,CWT -DWG,DWT -EWG,EWT -FWG,FWT -GWG,GWT -HWG,HWT -IWG,IWT -JWG,JWT -KWG,KWT -LWG,LWT -MWG,MWT -NWG,NWT -OWG,OWT -PWG,PWT -QWG,QWT -RWG,RWT -SWG,SWT -TWG,TWT -UWG,UWT -VWG,VWT -WWG,WWT -XWG,XWT -YWG,YWT -ZWG,ZWT -AXG,AXT -BXG,BXT -CXG,CXT -DXG,DXT -EXG,EXT -FXG,FXT -GXG,GXT -HXG,HXT -IXG,IXT -JXG,JXT -KXG,KXT -LXG,LXT -MXG,MXT -NXG,NXT -OXG,OXT -PXG,PXT -QXG,QXT -RXG,RXT -SXG,SXT -TXG,TXT -UXG,UXT -VXG,VXT -WXG,WXT -XXG,XXT -YXG,YXT -ZXG,ZXT -AYG,AYT -BYG,BYT -CYG,CYT -DYG,DYT -EYG,EYT -FYG,FYT -GYG,GYT -HYG,HYT -IYG,IYT -JYG,JYT -KYG,KYT -LYG,LYT -MYG,MYT -NYG,NYT -OYG,OYT -PYG,PYT -QYG,QYT -RYG,RYT -SYG,SYT -TYG,TYT -UYG,UYT -VYG,VYT -WYG,WYT -XYG,XYT -YYG,YYT -ZYG,ZYT -AZG,AZT -BZG,BZT -CZG,CZT -DZG,DZT -EZG,EZT -FZG,FZT -GZG,GZT -HZG,HZT -IZG,IZT -JZG,JZT -KZG,KZT -LZG,LZT -MZG,MZT -NZG,NZT -OZG,OZT -PZG,PZT -QZG,QZT -RZG,RZT -SZG,SZT -TZG,TZT -UZG,UZT -VZG,VZT -WZG,WZT -XZG,XZT -YZG,YZT -ZZG,ZZT -AAH,AAU -BAH,BAU -CAH,CAU -DAH,DAU -EAH,EAU -FAH,FAU -GAH,GAU -HAH,HAU -IAH,IAU -JAH,JAU -KAH,KAU -LAH,LAU -MAH,MAU -NAH,NAU -OAH,OAU -PAH,PAU -QAH,QAU -RAH,RAU -SAH,SAU -TAH,TAU -UAH,UAU -VAH,VAU -WAH,WAU -XAH,XAU -YAH,YAU -ZAH,ZAU -ABH,ABU -BBH,BBU -CBH,CBU -DBH,DBU -EBH,EBU -FBH,FBU -GBH,GBU -HBH,HBU -IBH,IBU -JBH,JBU -KBH,KBU -LBH,LBU -MBH,MBU -NBH,NBU -OBH,OBU -PBH,PBU -QBH,QBU -RBH,RBU -SBH,SBU -TBH,TBU -UBH,UBU -VBH,VBU -WBH,WBU -XBH,XBU -YBH,YBU -ZBH,ZBU -ACH,ACU -BCH,BCU -CCH,CCU -DCH,DCU -ECH,ECU -FCH,FCU -GCH,GCU -HCH,HCU -ICH,ICU -JCH,JCU -KCH,KCU -LCH,LCU -MCH,MCU -NCH,NCU -OCH,OCU -PCH,PCU -QCH,QCU -RCH,RCU -SCH,SCU -TCH,TCU -UCH,UCU -VCH,VCU -WCH,WCU -XCH,XCU -YCH,YCU -ZCH,ZCU -ADH,ADU -BDH,BDU -CDH,CDU -DDH,DDU -EDH,EDU -FDH,FDU -GDH,GDU -HDH,HDU -IDH,IDU -JDH,JDU -KDH,KDU -LDH,LDU -MDH,MDU -NDH,NDU -ODH,ODU -PDH,PDU -QDH,QDU -RDH,RDU -SDH,SDU -TDH,TDU -UDH,UDU -VDH,VDU -WDH,WDU -XDH,XDU -YDH,YDU -ZDH,ZDU -AEH,AEU -BEH,BEU -CEH,CEU -DEH,DEU -EEH,EEU -FEH,FEU -GEH,GEU -HEH,HEU -IEH,IEU -JEH,JEU -KEH,KEU -LEH,LEU -MEH,MEU -NEH,NEU -OEH,OEU -PEH,PEU -QEH,QEU -REH,REU -SEH,SEU -TEH,TEU -UEH,UEU -VEH,VEU -WEH,WEU -XEH,XEU -YEH,YEU -ZEH,ZEU -AFH,AFU -BFH,BFU -CFH,CFU -DFH,DFU -EFH,EFU -FFH,FFU -GFH,GFU -HFH,HFU -IFH,IFU -JFH,JFU -KFH,KFU -LFH,LFU -MFH,MFU -NFH,NFU -OFH,OFU -PFH,PFU -QFH,QFU -RFH,RFU -SFH,SFU -TFH,TFU -UFH,UFU -VFH,VFU -WFH,WFU -XFH,XFU -YFH,YFU -ZFH,ZFU -AGH,AGU -BGH,BGU -CGH,CGU -DGH,DGU -EGH,EGU -FGH,FGU -GGH,GGU -HGH,HGU -IGH,IGU -JGH,JGU -KGH,KGU -LGH,LGU -MGH,MGU -NGH,NGU -OGH,OGU -PGH,PGU -QGH,QGU -RGH,RGU -SGH,SGU -TGH,TGU -UGH,UGU -VGH,VGU -WGH,WGU -XGH,XGU -YGH,YGU -ZGH,ZGU -AHH,AHU -BHH,BHU -CHH,CHU -DHH,DHU -EHH,EHU -FHH,FHU -GHH,GHU -HHH,HHU -IHH,IHU -JHH,JHU -KHH,KHU -LHH,LHU -MHH,MHU -NHH,NHU -OHH,OHU -PHH,PHU -QHH,QHU -RHH,RHU -SHH,SHU -THH,THU -UHH,UHU -VHH,VHU -WHH,WHU -XHH,XHU -YHH,YHU -ZHH,ZHU -AIH,AIU -BIH,BIU -CIH,CIU -DIH,DIU -EIH,EIU -FIH,FIU -GIH,GIU -HIH,HIU -IIH,IIU -JIH,JIU -KIH,KIU -LIH,LIU -MIH,MIU -NIH,NIU -OIH,OIU -PIH,PIU -QIH,QIU -RIH,RIU -SIH,SIU -TIH,TIU -UIH,UIU -VIH,VIU -WIH,WIU -XIH,XIU -YIH,YIU -ZIH,ZIU -AJH,AJU -BJH,BJU -CJH,CJU -DJH,DJU -EJH,EJU -FJH,FJU -GJH,GJU -HJH,HJU -IJH,IJU -JJH,JJU -KJH,KJU -LJH,LJU -MJH,MJU -NJH,NJU -OJH,OJU -PJH,PJU -QJH,QJU -RJH,RJU -SJH,SJU -TJH,TJU -UJH,UJU -VJH,VJU -WJH,WJU -XJH,XJU -YJH,YJU -ZJH,ZJU -AKH,AKU -BKH,BKU -CKH,CKU -DKH,DKU -EKH,EKU -FKH,FKU -GKH,GKU -HKH,HKU -IKH,IKU -JKH,JKU -KKH,KKU -LKH,LKU -MKH,MKU -NKH,NKU -OKH,OKU -PKH,PKU -QKH,QKU -RKH,RKU -SKH,SKU -TKH,TKU -UKH,UKU -VKH,VKU -WKH,WKU -XKH,XKU -YKH,YKU -ZKH,ZKU -ALH,ALU -BLH,BLU -CLH,CLU -DLH,DLU -ELH,ELU -FLH,FLU -GLH,GLU -HLH,HLU -ILH,ILU -JLH,JLU -KLH,KLU -LLH,LLU -MLH,MLU -NLH,NLU -OLH,OLU -PLH,PLU -QLH,QLU -RLH,RLU -SLH,SLU -TLH,TLU -ULH,ULU -VLH,VLU -WLH,WLU -XLH,XLU -YLH,YLU -ZLH,ZLU -AMH,AMU -BMH,BMU -CMH,CMU -DMH,DMU -EMH,EMU -FMH,FMU -GMH,GMU -HMH,HMU -IMH,IMU -JMH,JMU -KMH,KMU -LMH,LMU -MMH,MMU -NMH,NMU -OMH,OMU -PMH,PMU -QMH,QMU -RMH,RMU -SMH,SMU -TMH,TMU -UMH,UMU -VMH,VMU -WMH,WMU -XMH,XMU -YMH,YMU -ZMH,ZMU -ANH,ANU -BNH,BNU -CNH,CNU -DNH,DNU -ENH,ENU -FNH,FNU -GNH,GNU -HNH,HNU -INH,INU -JNH,JNU -KNH,KNU -LNH,LNU -MNH,MNU -NNH,NNU -ONH,ONU -PNH,PNU -QNH,QNU -RNH,RNU -SNH,SNU -TNH,TNU -UNH,UNU -VNH,VNU -WNH,WNU -XNH,XNU -YNH,YNU -ZNH,ZNU -AOH,AOU -BOH,BOU -COH,COU -DOH,DOU -EOH,EOU -FOH,FOU -GOH,GOU -HOH,HOU -IOH,IOU -JOH,JOU -KOH,KOU -LOH,LOU -MOH,MOU -NOH,NOU -OOH,OOU -POH,POU -QOH,QOU -ROH,ROU -SOH,SOU -TOH,TOU -UOH,UOU -VOH,VOU -WOH,WOU -XOH,XOU -YOH,YOU -ZOH,ZOU -APH,APU -BPH,BPU -CPH,CPU -DPH,DPU -EPH,EPU -FPH,FPU -GPH,GPU -HPH,HPU -IPH,IPU -JPH,JPU -KPH,KPU -LPH,LPU -MPH,MPU -NPH,NPU -OPH,OPU -PPH,PPU -QPH,QPU -RPH,RPU -SPH,SPU -TPH,TPU -UPH,UPU -VPH,VPU -WPH,WPU -XPH,XPU -YPH,YPU -ZPH,ZPU -AQH,AQU -BQH,BQU -CQH,CQU -DQH,DQU -EQH,EQU -FQH,FQU -GQH,GQU -HQH,HQU -IQH,IQU -JQH,JQU -KQH,KQU -LQH,LQU -MQH,MQU -NQH,NQU -OQH,OQU -PQH,PQU -QQH,QQU -RQH,RQU -SQH,SQU -TQH,TQU -UQH,UQU -VQH,VQU -WQH,WQU -XQH,XQU -YQH,YQU -ZQH,ZQU -ARH,ARU -BRH,BRU -CRH,CRU -DRH,DRU -ERH,ERU -FRH,FRU -GRH,GRU -HRH,HRU -IRH,IRU -JRH,JRU -KRH,KRU -LRH,LRU -MRH,MRU -NRH,NRU -ORH,ORU -PRH,PRU -QRH,QRU -RRH,RRU -SRH,SRU -TRH,TRU -URH,URU -VRH,VRU -WRH,WRU -XRH,XRU -YRH,YRU -ZRH,ZRU -ASH,ASU -BSH,BSU -CSH,CSU -DSH,DSU -ESH,ESU -FSH,FSU -GSH,GSU -HSH,HSU -ISH,ISU -JSH,JSU -KSH,KSU -LSH,LSU -MSH,MSU -NSH,NSU -OSH,OSU -PSH,PSU -QSH,QSU -RSH,RSU -SSH,SSU -TSH,TSU -USH,USU -VSH,VSU -WSH,WSU -XSH,XSU -YSH,YSU -ZSH,ZSU -ATH,ATU -BTH,BTU -CTH,CTU -DTH,DTU -ETH,ETU -FTH,FTU -GTH,GTU -HTH,HTU -ITH,ITU -JTH,JTU -KTH,KTU -LTH,LTU -MTH,MTU -NTH,NTU -OTH,OTU -PTH,PTU -QTH,QTU -RTH,RTU -STH,STU -TTH,TTU -UTH,UTU -VTH,VTU -WTH,WTU -XTH,XTU -YTH,YTU -ZTH,ZTU -AUH,AUU -BUH,BUU -CUH,CUU -DUH,DUU -EUH,EUU -FUH,FUU -GUH,GUU -HUH,HUU -IUH,IUU -JUH,JUU -KUH,KUU -LUH,LUU -MUH,MUU -NUH,NUU -OUH,OUU -PUH,PUU -QUH,QUU -RUH,RUU -SUH,SUU -TUH,TUU -UUH,UUU -VUH,VUU -WUH,WUU -XUH,XUU -YUH,YUU -ZUH,ZUU -AVH,AVU -BVH,BVU -CVH,CVU -DVH,DVU -EVH,EVU -FVH,FVU -GVH,GVU -HVH,HVU -IVH,IVU -JVH,JVU -KVH,KVU -LVH,LVU -MVH,MVU -NVH,NVU -OVH,OVU -PVH,PVU -QVH,QVU -RVH,RVU -SVH,SVU -TVH,TVU -UVH,UVU -VVH,VVU -WVH,WVU -XVH,XVU -YVH,YVU -ZVH,ZVU -AWH,AWU -BWH,BWU -CWH,CWU -DWH,DWU -EWH,EWU -FWH,FWU -GWH,GWU -HWH,HWU -IWH,IWU -JWH,JWU -KWH,KWU -LWH,LWU -MWH,MWU -NWH,NWU -OWH,OWU -PWH,PWU -QWH,QWU -RWH,RWU -SWH,SWU -TWH,TWU -UWH,UWU -VWH,VWU -WWH,WWU -XWH,XWU -YWH,YWU -ZWH,ZWU -AXH,AXU -BXH,BXU -CXH,CXU -DXH,DXU -EXH,EXU -FXH,FXU -GXH,GXU -HXH,HXU -IXH,IXU -JXH,JXU -KXH,KXU -LXH,LXU -MXH,MXU -NXH,NXU -OXH,OXU -PXH,PXU -QXH,QXU -RXH,RXU -SXH,SXU -TXH,TXU -UXH,UXU -VXH,VXU -WXH,WXU -XXH,XXU -YXH,YXU -ZXH,ZXU -AYH,AYU -BYH,BYU -CYH,CYU -DYH,DYU -EYH,EYU -FYH,FYU -GYH,GYU -HYH,HYU -IYH,IYU -JYH,JYU -KYH,KYU -LYH,LYU -MYH,MYU -NYH,NYU -OYH,OYU -PYH,PYU -QYH,QYU -RYH,RYU -SYH,SYU -TYH,TYU -UYH,UYU -VYH,VYU -WYH,WYU -XYH,XYU -YYH,YYU -ZYH,ZYU -AZH,AZU -BZH,BZU -CZH,CZU -DZH,DZU -EZH,EZU -FZH,FZU -GZH,GZU -HZH,HZU -IZH,IZU -JZH,JZU -KZH,KZU -LZH,LZU -MZH,MZU -NZH,NZU -OZH,OZU -PZH,PZU -QZH,QZU -RZH,RZU -SZH,SZU -TZH,TZU -UZH,UZU -VZH,VZU -WZH,WZU -XZH,XZU -YZH,YZU -ZZH,ZZU -AAI,AAV -BAI,BAV -CAI,CAV -DAI,DAV -EAI,EAV -FAI,FAV -GAI,GAV -HAI,HAV -IAI,IAV -JAI,JAV -KAI,KAV -LAI,LAV -MAI,MAV -NAI,NAV -OAI,OAV -PAI,PAV -QAI,QAV -RAI,RAV -SAI,SAV -TAI,TAV -UAI,UAV -VAI,VAV -WAI,WAV -XAI,XAV -YAI,YAV -ZAI,ZAV -ABI,ABV -BBI,BBV -CBI,CBV -DBI,DBV -EBI,EBV -FBI,FBV -GBI,GBV -HBI,HBV -IBI,IBV -JBI,JBV -KBI,KBV -LBI,LBV -MBI,MBV -NBI,NBV -OBI,OBV -PBI,PBV -QBI,QBV -RBI,RBV -SBI,SBV -TBI,TBV -UBI,UBV -VBI,VBV -WBI,WBV -XBI,XBV -YBI,YBV -ZBI,ZBV -ACI,ACV -BCI,BCV -CCI,CCV -DCI,DCV -ECI,ECV -FCI,FCV -GCI,GCV -HCI,HCV -ICI,ICV -JCI,JCV -KCI,KCV -LCI,LCV -MCI,MCV -NCI,NCV -OCI,OCV -PCI,PCV -QCI,QCV -RCI,RCV -SCI,SCV -TCI,TCV -UCI,UCV -VCI,VCV -WCI,WCV -XCI,XCV -YCI,YCV -ZCI,ZCV -ADI,ADV -BDI,BDV -CDI,CDV -DDI,DDV -EDI,EDV -FDI,FDV -GDI,GDV -HDI,HDV -IDI,IDV -JDI,JDV -KDI,KDV -LDI,LDV -MDI,MDV -NDI,NDV -ODI,ODV -PDI,PDV -QDI,QDV -RDI,RDV -SDI,SDV -TDI,TDV -UDI,UDV -VDI,VDV -WDI,WDV -XDI,XDV -YDI,YDV -ZDI,ZDV -AEI,AEV -BEI,BEV -CEI,CEV -DEI,DEV -EEI,EEV -FEI,FEV -GEI,GEV -HEI,HEV -IEI,IEV -JEI,JEV -KEI,KEV -LEI,LEV -MEI,MEV -NEI,NEV -OEI,OEV -PEI,PEV -QEI,QEV -REI,REV -SEI,SEV -TEI,TEV -UEI,UEV -VEI,VEV -WEI,WEV -XEI,XEV -YEI,YEV -ZEI,ZEV -AFI,AFV -BFI,BFV -CFI,CFV -DFI,DFV -EFI,EFV -FFI,FFV -GFI,GFV -HFI,HFV -IFI,IFV -JFI,JFV -KFI,KFV -LFI,LFV -MFI,MFV -NFI,NFV -OFI,OFV -PFI,PFV -QFI,QFV -RFI,RFV -SFI,SFV -TFI,TFV -UFI,UFV -VFI,VFV -WFI,WFV -XFI,XFV -YFI,YFV -ZFI,ZFV -AGI,AGV -BGI,BGV -CGI,CGV -DGI,DGV -EGI,EGV -FGI,FGV -GGI,GGV -HGI,HGV -IGI,IGV -JGI,JGV -KGI,KGV -LGI,LGV -MGI,MGV -NGI,NGV -OGI,OGV -PGI,PGV -QGI,QGV -RGI,RGV -SGI,SGV -TGI,TGV -UGI,UGV -VGI,VGV -WGI,WGV -XGI,XGV -YGI,YGV -ZGI,ZGV -AHI,AHV -BHI,BHV -CHI,CHV -DHI,DHV -EHI,EHV -FHI,FHV -GHI,GHV -HHI,HHV -IHI,IHV -JHI,JHV -KHI,KHV -LHI,LHV -MHI,MHV -NHI,NHV -OHI,OHV -PHI,PHV -QHI,QHV -RHI,RHV -SHI,SHV -THI,THV -UHI,UHV -VHI,VHV -WHI,WHV -XHI,XHV -YHI,YHV -ZHI,ZHV -AII,AIV -BII,BIV -CII,CIV -DII,DIV -EII,EIV -FII,FIV -GII,GIV -HII,HIV -III,IIV -JII,JIV -KII,KIV -LII,LIV -MII,MIV -NII,NIV -OII,OIV -PII,PIV -QII,QIV -RII,RIV -SII,SIV -TII,TIV -UII,UIV -VII,VIV -WII,WIV -XII,XIV -YII,YIV -ZII,ZIV -AJI,AJV -BJI,BJV -CJI,CJV -DJI,DJV -EJI,EJV -FJI,FJV -GJI,GJV -HJI,HJV -IJI,IJV -JJI,JJV -KJI,KJV -LJI,LJV -MJI,MJV -NJI,NJV -OJI,OJV -PJI,PJV -QJI,QJV -RJI,RJV -SJI,SJV -TJI,TJV -UJI,UJV -VJI,VJV -WJI,WJV -XJI,XJV -YJI,YJV -ZJI,ZJV -AKI,AKV -BKI,BKV -CKI,CKV -DKI,DKV -EKI,EKV -FKI,FKV -GKI,GKV -HKI,HKV -IKI,IKV -JKI,JKV -KKI,KKV -LKI,LKV -MKI,MKV -NKI,NKV -OKI,OKV -PKI,PKV -QKI,QKV -RKI,RKV -SKI,SKV -TKI,TKV -UKI,UKV -VKI,VKV -WKI,WKV -XKI,XKV -YKI,YKV -ZKI,ZKV -ALI,ALV -BLI,BLV -CLI,CLV -DLI,DLV -ELI,ELV -FLI,FLV -GLI,GLV -HLI,HLV -ILI,ILV -JLI,JLV -KLI,KLV -LLI,LLV -MLI,MLV -NLI,NLV -OLI,OLV -PLI,PLV -QLI,QLV -RLI,RLV -SLI,SLV -TLI,TLV -ULI,ULV -VLI,VLV -WLI,WLV -XLI,XLV -YLI,YLV -ZLI,ZLV -AMI,AMV -BMI,BMV -CMI,CMV -DMI,DMV -EMI,EMV -FMI,FMV -GMI,GMV -HMI,HMV -IMI,IMV -JMI,JMV -KMI,KMV -LMI,LMV -MMI,MMV -NMI,NMV -OMI,OMV -PMI,PMV -QMI,QMV -RMI,RMV -SMI,SMV -TMI,TMV -UMI,UMV -VMI,VMV -WMI,WMV -XMI,XMV -YMI,YMV -ZMI,ZMV -ANI,ANV -BNI,BNV -CNI,CNV -DNI,DNV -ENI,ENV -FNI,FNV -GNI,GNV -HNI,HNV -INI,INV -JNI,JNV -KNI,KNV -LNI,LNV -MNI,MNV -NNI,NNV -ONI,ONV -PNI,PNV -QNI,QNV -RNI,RNV -SNI,SNV -TNI,TNV -UNI,UNV -VNI,VNV -WNI,WNV -XNI,XNV -YNI,YNV -ZNI,ZNV -AOI,AOV -BOI,BOV -COI,COV -DOI,DOV -EOI,EOV -FOI,FOV -GOI,GOV -HOI,HOV -IOI,IOV -JOI,JOV -KOI,KOV -LOI,LOV -MOI,MOV -NOI,NOV -OOI,OOV -POI,POV -QOI,QOV -ROI,ROV -SOI,SOV -TOI,TOV -UOI,UOV -VOI,VOV -WOI,WOV -XOI,XOV -YOI,YOV -ZOI,ZOV -API,APV -BPI,BPV -CPI,CPV -DPI,DPV -EPI,EPV -FPI,FPV -GPI,GPV -HPI,HPV -IPI,IPV -JPI,JPV -KPI,KPV -LPI,LPV -MPI,MPV -NPI,NPV -OPI,OPV -PPI,PPV -QPI,QPV -RPI,RPV -SPI,SPV -TPI,TPV -UPI,UPV -VPI,VPV -WPI,WPV -XPI,XPV -YPI,YPV -ZPI,ZPV -AQI,AQV -BQI,BQV -CQI,CQV -DQI,DQV -EQI,EQV -FQI,FQV -GQI,GQV -HQI,HQV -IQI,IQV -JQI,JQV -KQI,KQV -LQI,LQV -MQI,MQV -NQI,NQV -OQI,OQV -PQI,PQV -QQI,QQV -RQI,RQV -SQI,SQV -TQI,TQV -UQI,UQV -VQI,VQV -WQI,WQV -XQI,XQV -YQI,YQV -ZQI,ZQV -ARI,ARV -BRI,BRV -CRI,CRV -DRI,DRV -ERI,ERV -FRI,FRV -GRI,GRV -HRI,HRV -IRI,IRV -JRI,JRV -KRI,KRV -LRI,LRV -MRI,MRV -NRI,NRV -ORI,ORV -PRI,PRV -QRI,QRV -RRI,RRV -SRI,SRV -TRI,TRV -URI,URV -VRI,VRV -WRI,WRV -XRI,XRV -YRI,YRV -ZRI,ZRV -ASI,ASV -BSI,BSV -CSI,CSV -DSI,DSV -ESI,ESV -FSI,FSV -GSI,GSV -HSI,HSV -ISI,ISV -JSI,JSV -KSI,KSV -LSI,LSV -MSI,MSV -NSI,NSV -OSI,OSV -PSI,PSV -QSI,QSV -RSI,RSV -SSI,SSV -TSI,TSV -USI,USV -VSI,VSV -WSI,WSV -XSI,XSV -YSI,YSV -ZSI,ZSV -ATI,ATV -BTI,BTV -CTI,CTV -DTI,DTV -ETI,ETV -FTI,FTV -GTI,GTV -HTI,HTV -ITI,ITV -JTI,JTV -KTI,KTV -LTI,LTV -MTI,MTV -NTI,NTV -OTI,OTV -PTI,PTV -QTI,QTV -RTI,RTV -STI,STV -TTI,TTV -UTI,UTV -VTI,VTV -WTI,WTV -XTI,XTV -YTI,YTV -ZTI,ZTV -AUI,AUV -BUI,BUV -CUI,CUV -DUI,DUV -EUI,EUV -FUI,FUV -GUI,GUV -HUI,HUV -IUI,IUV -JUI,JUV -KUI,KUV -LUI,LUV -MUI,MUV -NUI,NUV -OUI,OUV -PUI,PUV -QUI,QUV -RUI,RUV -SUI,SUV -TUI,TUV -UUI,UUV -VUI,VUV -WUI,WUV -XUI,XUV -YUI,YUV -ZUI,ZUV -AVI,AVV -BVI,BVV -CVI,CVV -DVI,DVV -EVI,EVV -FVI,FVV -GVI,GVV -HVI,HVV -IVI,IVV -JVI,JVV -KVI,KVV -LVI,LVV -MVI,MVV -NVI,NVV -OVI,OVV -PVI,PVV -QVI,QVV -RVI,RVV -SVI,SVV -TVI,TVV -UVI,UVV -VVI,VVV -WVI,WVV -XVI,XVV -YVI,YVV -ZVI,ZVV -AWI,AWV -BWI,BWV -CWI,CWV -DWI,DWV -EWI,EWV -FWI,FWV -GWI,GWV -HWI,HWV -IWI,IWV -JWI,JWV -KWI,KWV -LWI,LWV -MWI,MWV -NWI,NWV -OWI,OWV -PWI,PWV -QWI,QWV -RWI,RWV -SWI,SWV -TWI,TWV -UWI,UWV -VWI,VWV -WWI,WWV -XWI,XWV -YWI,YWV -ZWI,ZWV -AXI,AXV -BXI,BXV -CXI,CXV -DXI,DXV -EXI,EXV -FXI,FXV -GXI,GXV -HXI,HXV -IXI,IXV -JXI,JXV -KXI,KXV -LXI,LXV -MXI,MXV -NXI,NXV -OXI,OXV -PXI,PXV -QXI,QXV -RXI,RXV -SXI,SXV -TXI,TXV -UXI,UXV -VXI,VXV -WXI,WXV -XXI,XXV -YXI,YXV -ZXI,ZXV -AYI,AYV -BYI,BYV -CYI,CYV -DYI,DYV -EYI,EYV -FYI,FYV -GYI,GYV -HYI,HYV -IYI,IYV -JYI,JYV -KYI,KYV -LYI,LYV -MYI,MYV -NYI,NYV -OYI,OYV -PYI,PYV -QYI,QYV -RYI,RYV -SYI,SYV -TYI,TYV -UYI,UYV -VYI,VYV -WYI,WYV -XYI,XYV -YYI,YYV -ZYI,ZYV -AZI,AZV -BZI,BZV -CZI,CZV -DZI,DZV -EZI,EZV -FZI,FZV -GZI,GZV -HZI,HZV -IZI,IZV -JZI,JZV -KZI,KZV -LZI,LZV -MZI,MZV -NZI,NZV -OZI,OZV -PZI,PZV -QZI,QZV -RZI,RZV -SZI,SZV -TZI,TZV -UZI,UZV -VZI,VZV -WZI,WZV -XZI,XZV -YZI,YZV -ZZI,ZZV -AAJ,AAW -BAJ,BAW -CAJ,CAW -DAJ,DAW -EAJ,EAW -FAJ,FAW -GAJ,GAW -HAJ,HAW -IAJ,IAW -JAJ,JAW -KAJ,KAW -LAJ,LAW -MAJ,MAW -NAJ,NAW -OAJ,OAW -PAJ,PAW -QAJ,QAW -RAJ,RAW -SAJ,SAW -TAJ,TAW -UAJ,UAW -VAJ,VAW -WAJ,WAW -XAJ,XAW -YAJ,YAW -ZAJ,ZAW -ABJ,ABW -BBJ,BBW -CBJ,CBW -DBJ,DBW -EBJ,EBW -FBJ,FBW -GBJ,GBW -HBJ,HBW -IBJ,IBW -JBJ,JBW -KBJ,KBW -LBJ,LBW -MBJ,MBW -NBJ,NBW -OBJ,OBW -PBJ,PBW -QBJ,QBW -RBJ,RBW -SBJ,SBW -TBJ,TBW -UBJ,UBW -VBJ,VBW -WBJ,WBW -XBJ,XBW -YBJ,YBW -ZBJ,ZBW -ACJ,ACW -BCJ,BCW -CCJ,CCW -DCJ,DCW -ECJ,ECW -FCJ,FCW -GCJ,GCW -HCJ,HCW -ICJ,ICW -JCJ,JCW -KCJ,KCW -LCJ,LCW -MCJ,MCW -NCJ,NCW -OCJ,OCW -PCJ,PCW -QCJ,QCW -RCJ,RCW -SCJ,SCW -TCJ,TCW -UCJ,UCW -VCJ,VCW -WCJ,WCW -XCJ,XCW -YCJ,YCW -ZCJ,ZCW -ADJ,ADW -BDJ,BDW -CDJ,CDW -DDJ,DDW -EDJ,EDW -FDJ,FDW -GDJ,GDW -HDJ,HDW -IDJ,IDW -JDJ,JDW -KDJ,KDW -LDJ,LDW -MDJ,MDW -NDJ,NDW -ODJ,ODW -PDJ,PDW -QDJ,QDW -RDJ,RDW -SDJ,SDW -TDJ,TDW -UDJ,UDW -VDJ,VDW -WDJ,WDW -XDJ,XDW -YDJ,YDW -ZDJ,ZDW -AEJ,AEW -BEJ,BEW -CEJ,CEW -DEJ,DEW -EEJ,EEW -FEJ,FEW -GEJ,GEW -HEJ,HEW -IEJ,IEW -JEJ,JEW -KEJ,KEW -LEJ,LEW -MEJ,MEW -NEJ,NEW -OEJ,OEW -PEJ,PEW -QEJ,QEW -REJ,REW -SEJ,SEW -TEJ,TEW -UEJ,UEW -VEJ,VEW -WEJ,WEW -XEJ,XEW -YEJ,YEW -ZEJ,ZEW -AFJ,AFW -BFJ,BFW -CFJ,CFW -DFJ,DFW -EFJ,EFW -FFJ,FFW -GFJ,GFW -HFJ,HFW -IFJ,IFW -JFJ,JFW -KFJ,KFW -LFJ,LFW -MFJ,MFW -NFJ,NFW -OFJ,OFW -PFJ,PFW -QFJ,QFW -RFJ,RFW -SFJ,SFW -TFJ,TFW -UFJ,UFW -VFJ,VFW -WFJ,WFW -XFJ,XFW -YFJ,YFW -ZFJ,ZFW -AGJ,AGW -BGJ,BGW -CGJ,CGW -DGJ,DGW -EGJ,EGW -FGJ,FGW -GGJ,GGW -HGJ,HGW -IGJ,IGW -JGJ,JGW -KGJ,KGW -LGJ,LGW -MGJ,MGW -NGJ,NGW -OGJ,OGW -PGJ,PGW -QGJ,QGW -RGJ,RGW -SGJ,SGW -TGJ,TGW -UGJ,UGW -VGJ,VGW -WGJ,WGW -XGJ,XGW -YGJ,YGW -ZGJ,ZGW -AHJ,AHW -BHJ,BHW -CHJ,CHW -DHJ,DHW -EHJ,EHW -FHJ,FHW -GHJ,GHW -HHJ,HHW -IHJ,IHW -JHJ,JHW -KHJ,KHW -LHJ,LHW -MHJ,MHW -NHJ,NHW -OHJ,OHW -PHJ,PHW -QHJ,QHW -RHJ,RHW -SHJ,SHW -THJ,THW -UHJ,UHW -VHJ,VHW -WHJ,WHW -XHJ,XHW -YHJ,YHW -ZHJ,ZHW -AIJ,AIW -BIJ,BIW -CIJ,CIW -DIJ,DIW -EIJ,EIW -FIJ,FIW -GIJ,GIW -HIJ,HIW -IIJ,IIW -JIJ,JIW -KIJ,KIW -LIJ,LIW -MIJ,MIW -NIJ,NIW -OIJ,OIW -PIJ,PIW -QIJ,QIW -RIJ,RIW -SIJ,SIW -TIJ,TIW -UIJ,UIW -VIJ,VIW -WIJ,WIW -XIJ,XIW -YIJ,YIW -ZIJ,ZIW -AJJ,AJW -BJJ,BJW -CJJ,CJW -DJJ,DJW -EJJ,EJW -FJJ,FJW -GJJ,GJW -HJJ,HJW -IJJ,IJW -JJJ,JJW -KJJ,KJW -LJJ,LJW -MJJ,MJW -NJJ,NJW -OJJ,OJW -PJJ,PJW -QJJ,QJW -RJJ,RJW -SJJ,SJW -TJJ,TJW -UJJ,UJW -VJJ,VJW -WJJ,WJW -XJJ,XJW -YJJ,YJW -ZJJ,ZJW -AKJ,AKW -BKJ,BKW -CKJ,CKW -DKJ,DKW -EKJ,EKW -FKJ,FKW -GKJ,GKW -HKJ,HKW -IKJ,IKW -JKJ,JKW -KKJ,KKW -LKJ,LKW -MKJ,MKW -NKJ,NKW -OKJ,OKW -PKJ,PKW -QKJ,QKW -RKJ,RKW -SKJ,SKW -TKJ,TKW -UKJ,UKW -VKJ,VKW -WKJ,WKW -XKJ,XKW -YKJ,YKW -ZKJ,ZKW -ALJ,ALW -BLJ,BLW -CLJ,CLW -DLJ,DLW -ELJ,ELW -FLJ,FLW -GLJ,GLW -HLJ,HLW -ILJ,ILW -JLJ,JLW -KLJ,KLW -LLJ,LLW -MLJ,MLW -NLJ,NLW -OLJ,OLW -PLJ,PLW -QLJ,QLW -RLJ,RLW -SLJ,SLW -TLJ,TLW -ULJ,ULW -VLJ,VLW -WLJ,WLW -XLJ,XLW -YLJ,YLW -ZLJ,ZLW -AMJ,AMW -BMJ,BMW -CMJ,CMW -DMJ,DMW -EMJ,EMW -FMJ,FMW -GMJ,GMW -HMJ,HMW -IMJ,IMW -JMJ,JMW -KMJ,KMW -LMJ,LMW -MMJ,MMW -NMJ,NMW -OMJ,OMW -PMJ,PMW -QMJ,QMW -RMJ,RMW -SMJ,SMW -TMJ,TMW -UMJ,UMW -VMJ,VMW -WMJ,WMW -XMJ,XMW -YMJ,YMW -ZMJ,ZMW -ANJ,ANW -BNJ,BNW -CNJ,CNW -DNJ,DNW -ENJ,ENW -FNJ,FNW -GNJ,GNW -HNJ,HNW -INJ,INW -JNJ,JNW -KNJ,KNW -LNJ,LNW -MNJ,MNW -NNJ,NNW -ONJ,ONW -PNJ,PNW -QNJ,QNW -RNJ,RNW -SNJ,SNW -TNJ,TNW -UNJ,UNW -VNJ,VNW -WNJ,WNW -XNJ,XNW -YNJ,YNW -ZNJ,ZNW -AOJ,AOW -BOJ,BOW -COJ,COW -DOJ,DOW -EOJ,EOW -FOJ,FOW -GOJ,GOW -HOJ,HOW -IOJ,IOW -JOJ,JOW -KOJ,KOW -LOJ,LOW -MOJ,MOW -NOJ,NOW -OOJ,OOW -POJ,POW -QOJ,QOW -ROJ,ROW -SOJ,SOW -TOJ,TOW -UOJ,UOW -VOJ,VOW -WOJ,WOW -XOJ,XOW -YOJ,YOW -ZOJ,ZOW -APJ,APW -BPJ,BPW -CPJ,CPW -DPJ,DPW -EPJ,EPW -FPJ,FPW -GPJ,GPW -HPJ,HPW -IPJ,IPW -JPJ,JPW -KPJ,KPW -LPJ,LPW -MPJ,MPW -NPJ,NPW -OPJ,OPW -PPJ,PPW -QPJ,QPW -RPJ,RPW -SPJ,SPW -TPJ,TPW -UPJ,UPW -VPJ,VPW -WPJ,WPW -XPJ,XPW -YPJ,YPW -ZPJ,ZPW -AQJ,AQW -BQJ,BQW -CQJ,CQW -DQJ,DQW -EQJ,EQW -FQJ,FQW -GQJ,GQW -HQJ,HQW -IQJ,IQW -JQJ,JQW -KQJ,KQW -LQJ,LQW -MQJ,MQW -NQJ,NQW -OQJ,OQW -PQJ,PQW -QQJ,QQW -RQJ,RQW -SQJ,SQW -TQJ,TQW -UQJ,UQW -VQJ,VQW -WQJ,WQW -XQJ,XQW -YQJ,YQW -ZQJ,ZQW -ARJ,ARW -BRJ,BRW -CRJ,CRW -DRJ,DRW -ERJ,ERW -FRJ,FRW -GRJ,GRW -HRJ,HRW -IRJ,IRW -JRJ,JRW -KRJ,KRW -LRJ,LRW -MRJ,MRW -NRJ,NRW -ORJ,ORW -PRJ,PRW -QRJ,QRW -RRJ,RRW -SRJ,SRW -TRJ,TRW -URJ,URW -VRJ,VRW -WRJ,WRW -XRJ,XRW -YRJ,YRW -ZRJ,ZRW -ASJ,ASW -BSJ,BSW -CSJ,CSW -DSJ,DSW -ESJ,ESW -FSJ,FSW -GSJ,GSW -HSJ,HSW -ISJ,ISW -JSJ,JSW -KSJ,KSW -LSJ,LSW -MSJ,MSW -NSJ,NSW -OSJ,OSW -PSJ,PSW -QSJ,QSW -RSJ,RSW -SSJ,SSW -TSJ,TSW -USJ,USW -VSJ,VSW -WSJ,WSW -XSJ,XSW -YSJ,YSW -ZSJ,ZSW -ATJ,ATW -BTJ,BTW -CTJ,CTW -DTJ,DTW -ETJ,ETW -FTJ,FTW -GTJ,GTW -HTJ,HTW -ITJ,ITW -JTJ,JTW -KTJ,KTW -LTJ,LTW -MTJ,MTW -NTJ,NTW -OTJ,OTW -PTJ,PTW -QTJ,QTW -RTJ,RTW -STJ,STW -TTJ,TTW -UTJ,UTW -VTJ,VTW -WTJ,WTW -XTJ,XTW -YTJ,YTW -ZTJ,ZTW -AUJ,AUW -BUJ,BUW -CUJ,CUW -DUJ,DUW -EUJ,EUW -FUJ,FUW -GUJ,GUW -HUJ,HUW -IUJ,IUW -JUJ,JUW -KUJ,KUW -LUJ,LUW -MUJ,MUW -NUJ,NUW -OUJ,OUW -PUJ,PUW -QUJ,QUW -RUJ,RUW -SUJ,SUW -TUJ,TUW -UUJ,UUW -VUJ,VUW -WUJ,WUW -XUJ,XUW -YUJ,YUW -ZUJ,ZUW -AVJ,AVW -BVJ,BVW -CVJ,CVW -DVJ,DVW -EVJ,EVW -FVJ,FVW -GVJ,GVW -HVJ,HVW -IVJ,IVW -JVJ,JVW -KVJ,KVW -LVJ,LVW -MVJ,MVW -NVJ,NVW -OVJ,OVW -PVJ,PVW -QVJ,QVW -RVJ,RVW -SVJ,SVW -TVJ,TVW -UVJ,UVW -VVJ,VVW -WVJ,WVW -XVJ,XVW -YVJ,YVW -ZVJ,ZVW -AWJ,AWW -BWJ,BWW -CWJ,CWW -DWJ,DWW -EWJ,EWW -FWJ,FWW -GWJ,GWW -HWJ,HWW -IWJ,IWW -JWJ,JWW -KWJ,KWW -LWJ,LWW -MWJ,MWW -NWJ,NWW -OWJ,OWW -PWJ,PWW -QWJ,QWW -RWJ,RWW -SWJ,SWW -TWJ,TWW -UWJ,UWW -VWJ,VWW -WWJ,WWW -XWJ,XWW -YWJ,YWW -ZWJ,ZWW -AXJ,AXW -BXJ,BXW -CXJ,CXW -DXJ,DXW -EXJ,EXW -FXJ,FXW -GXJ,GXW -HXJ,HXW -IXJ,IXW -JXJ,JXW -KXJ,KXW -LXJ,LXW -MXJ,MXW -NXJ,NXW -OXJ,OXW -PXJ,PXW -QXJ,QXW -RXJ,RXW -SXJ,SXW -TXJ,TXW -UXJ,UXW -VXJ,VXW -WXJ,WXW -XXJ,XXW -YXJ,YXW -ZXJ,ZXW -AYJ,AYW -BYJ,BYW -CYJ,CYW -DYJ,DYW -EYJ,EYW -FYJ,FYW -GYJ,GYW -HYJ,HYW -IYJ,IYW -JYJ,JYW -KYJ,KYW -LYJ,LYW -MYJ,MYW -NYJ,NYW -OYJ,OYW -PYJ,PYW -QYJ,QYW -RYJ,RYW -SYJ,SYW -TYJ,TYW -UYJ,UYW -VYJ,VYW -WYJ,WYW -XYJ,XYW -YYJ,YYW -ZYJ,ZYW -AZJ,AZW -BZJ,BZW -CZJ,CZW -DZJ,DZW -EZJ,EZW -FZJ,FZW -GZJ,GZW -HZJ,HZW -IZJ,IZW -JZJ,JZW -KZJ,KZW -LZJ,LZW -MZJ,MZW -NZJ,NZW -OZJ,OZW -PZJ,PZW -QZJ,QZW -RZJ,RZW -SZJ,SZW -TZJ,TZW -UZJ,UZW -VZJ,VZW -WZJ,WZW -XZJ,XZW -YZJ,YZW -ZZJ,ZZW -AAK,AAX -BAK,BAX -CAK,CAX -DAK,DAX -EAK,EAX -FAK,FAX -GAK,GAX -HAK,HAX -IAK,IAX -JAK,JAX -KAK,KAX -LAK,LAX -MAK,MAX -NAK,NAX -OAK,OAX -PAK,PAX -QAK,QAX -RAK,RAX -SAK,SAX -TAK,TAX -UAK,UAX -VAK,VAX -WAK,WAX -XAK,XAX -YAK,YAX -ZAK,ZAX -ABK,ABX -BBK,BBX -CBK,CBX -DBK,DBX -EBK,EBX -FBK,FBX -GBK,GBX -HBK,HBX -IBK,IBX -JBK,JBX -KBK,KBX -LBK,LBX -MBK,MBX -NBK,NBX -OBK,OBX -PBK,PBX -QBK,QBX -RBK,RBX -SBK,SBX -TBK,TBX -UBK,UBX -VBK,VBX -WBK,WBX -XBK,XBX -YBK,YBX -ZBK,ZBX -ACK,ACX -BCK,BCX -CCK,CCX -DCK,DCX -ECK,ECX -FCK,FCX -GCK,GCX -HCK,HCX -ICK,ICX -JCK,JCX -KCK,KCX -LCK,LCX -MCK,MCX -NCK,NCX -OCK,OCX -PCK,PCX -QCK,QCX -RCK,RCX -SCK,SCX -TCK,TCX -UCK,UCX -VCK,VCX -WCK,WCX -XCK,XCX -YCK,YCX -ZCK,ZCX -ADK,ADX -BDK,BDX -CDK,CDX -DDK,DDX -EDK,EDX -FDK,FDX -GDK,GDX -HDK,HDX -IDK,IDX -JDK,JDX -KDK,KDX -LDK,LDX -MDK,MDX -NDK,NDX -ODK,ODX -PDK,PDX -QDK,QDX -RDK,RDX -SDK,SDX -TDK,TDX -UDK,UDX -VDK,VDX -WDK,WDX -XDK,XDX -YDK,YDX -ZDK,ZDX -AEK,AEX -BEK,BEX -CEK,CEX -DEK,DEX -EEK,EEX -FEK,FEX -GEK,GEX -HEK,HEX -IEK,IEX -JEK,JEX -KEK,KEX -LEK,LEX -MEK,MEX -NEK,NEX -OEK,OEX -PEK,PEX -QEK,QEX -REK,REX -SEK,SEX -TEK,TEX -UEK,UEX -VEK,VEX -WEK,WEX -XEK,XEX -YEK,YEX -ZEK,ZEX -AFK,AFX -BFK,BFX -CFK,CFX -DFK,DFX -EFK,EFX -FFK,FFX -GFK,GFX -HFK,HFX -IFK,IFX -JFK,JFX -KFK,KFX -LFK,LFX -MFK,MFX -NFK,NFX -OFK,OFX -PFK,PFX -QFK,QFX -RFK,RFX -SFK,SFX -TFK,TFX -UFK,UFX -VFK,VFX -WFK,WFX -XFK,XFX -YFK,YFX -ZFK,ZFX -AGK,AGX -BGK,BGX -CGK,CGX -DGK,DGX -EGK,EGX -FGK,FGX -GGK,GGX -HGK,HGX -IGK,IGX -JGK,JGX -KGK,KGX -LGK,LGX -MGK,MGX -NGK,NGX -OGK,OGX -PGK,PGX -QGK,QGX -RGK,RGX -SGK,SGX -TGK,TGX -UGK,UGX -VGK,VGX -WGK,WGX -XGK,XGX -YGK,YGX -ZGK,ZGX -AHK,AHX -BHK,BHX -CHK,CHX -DHK,DHX -EHK,EHX -FHK,FHX -GHK,GHX -HHK,HHX -IHK,IHX -JHK,JHX -KHK,KHX -LHK,LHX -MHK,MHX -NHK,NHX -OHK,OHX -PHK,PHX -QHK,QHX -RHK,RHX -SHK,SHX -THK,THX -UHK,UHX -VHK,VHX -WHK,WHX -XHK,XHX -YHK,YHX -ZHK,ZHX -AIK,AIX -BIK,BIX -CIK,CIX -DIK,DIX -EIK,EIX -FIK,FIX -GIK,GIX -HIK,HIX -IIK,IIX -JIK,JIX -KIK,KIX -LIK,LIX -MIK,MIX -NIK,NIX -OIK,OIX -PIK,PIX -QIK,QIX -RIK,RIX -SIK,SIX -TIK,TIX -UIK,UIX -VIK,VIX -WIK,WIX -XIK,XIX -YIK,YIX -ZIK,ZIX -AJK,AJX -BJK,BJX -CJK,CJX -DJK,DJX -EJK,EJX -FJK,FJX -GJK,GJX -HJK,HJX -IJK,IJX -JJK,JJX -KJK,KJX -LJK,LJX -MJK,MJX -NJK,NJX -OJK,OJX -PJK,PJX -QJK,QJX -RJK,RJX -SJK,SJX -TJK,TJX -UJK,UJX -VJK,VJX -WJK,WJX -XJK,XJX -YJK,YJX -ZJK,ZJX -AKK,AKX -BKK,BKX -CKK,CKX -DKK,DKX -EKK,EKX -FKK,FKX -GKK,GKX -HKK,HKX -IKK,IKX -JKK,JKX -KKK,KKX -LKK,LKX -MKK,MKX -NKK,NKX -OKK,OKX -PKK,PKX -QKK,QKX -RKK,RKX -SKK,SKX -TKK,TKX -UKK,UKX -VKK,VKX -WKK,WKX -XKK,XKX -YKK,YKX -ZKK,ZKX -ALK,ALX -BLK,BLX -CLK,CLX -DLK,DLX -ELK,ELX -FLK,FLX -GLK,GLX -HLK,HLX -ILK,ILX -JLK,JLX -KLK,KLX -LLK,LLX -MLK,MLX -NLK,NLX -OLK,OLX -PLK,PLX -QLK,QLX -RLK,RLX -SLK,SLX -TLK,TLX -ULK,ULX -VLK,VLX -WLK,WLX -XLK,XLX -YLK,YLX -ZLK,ZLX -AMK,AMX -BMK,BMX -CMK,CMX -DMK,DMX -EMK,EMX -FMK,FMX -GMK,GMX -HMK,HMX -IMK,IMX -JMK,JMX -KMK,KMX -LMK,LMX -MMK,MMX -NMK,NMX -OMK,OMX -PMK,PMX -QMK,QMX -RMK,RMX -SMK,SMX -TMK,TMX -UMK,UMX -VMK,VMX -WMK,WMX -XMK,XMX -YMK,YMX -ZMK,ZMX -ANK,ANX -BNK,BNX -CNK,CNX -DNK,DNX -ENK,ENX -FNK,FNX -GNK,GNX -HNK,HNX -INK,INX -JNK,JNX -KNK,KNX -LNK,LNX -MNK,MNX -NNK,NNX -ONK,ONX -PNK,PNX -QNK,QNX -RNK,RNX -SNK,SNX -TNK,TNX -UNK,UNX -VNK,VNX -WNK,WNX -XNK,XNX -YNK,YNX -ZNK,ZNX -AOK,AOX -BOK,BOX -COK,COX -DOK,DOX -EOK,EOX -FOK,FOX -GOK,GOX -HOK,HOX -IOK,IOX -JOK,JOX -KOK,KOX -LOK,LOX -MOK,MOX -NOK,NOX -OOK,OOX -POK,POX -QOK,QOX -ROK,ROX -SOK,SOX -TOK,TOX -UOK,UOX -VOK,VOX -WOK,WOX -XOK,XOX -YOK,YOX -ZOK,ZOX -APK,APX -BPK,BPX -CPK,CPX -DPK,DPX -EPK,EPX -FPK,FPX -GPK,GPX -HPK,HPX -IPK,IPX -JPK,JPX -KPK,KPX -LPK,LPX -MPK,MPX -NPK,NPX -OPK,OPX -PPK,PPX -QPK,QPX -RPK,RPX -SPK,SPX -TPK,TPX -UPK,UPX -VPK,VPX -WPK,WPX -XPK,XPX -YPK,YPX -ZPK,ZPX -AQK,AQX -BQK,BQX -CQK,CQX -DQK,DQX -EQK,EQX -FQK,FQX -GQK,GQX -HQK,HQX -IQK,IQX -JQK,JQX -KQK,KQX -LQK,LQX -MQK,MQX -NQK,NQX -OQK,OQX -PQK,PQX -QQK,QQX -RQK,RQX -SQK,SQX -TQK,TQX -UQK,UQX -VQK,VQX -WQK,WQX -XQK,XQX -YQK,YQX -ZQK,ZQX -ARK,ARX -BRK,BRX -CRK,CRX -DRK,DRX -ERK,ERX -FRK,FRX -GRK,GRX -HRK,HRX -IRK,IRX -JRK,JRX -KRK,KRX -LRK,LRX -MRK,MRX -NRK,NRX -ORK,ORX -PRK,PRX -QRK,QRX -RRK,RRX -SRK,SRX -TRK,TRX -URK,URX -VRK,VRX -WRK,WRX -XRK,XRX -YRK,YRX -ZRK,ZRX -ASK,ASX -BSK,BSX -CSK,CSX -DSK,DSX -ESK,ESX -FSK,FSX -GSK,GSX -HSK,HSX -ISK,ISX -JSK,JSX -KSK,KSX -LSK,LSX -MSK,MSX -NSK,NSX -OSK,OSX -PSK,PSX -QSK,QSX -RSK,RSX -SSK,SSX -TSK,TSX -USK,USX -VSK,VSX -WSK,WSX -XSK,XSX -YSK,YSX -ZSK,ZSX -ATK,ATX -BTK,BTX -CTK,CTX -DTK,DTX -ETK,ETX -FTK,FTX -GTK,GTX -HTK,HTX -ITK,ITX -JTK,JTX -KTK,KTX -LTK,LTX -MTK,MTX -NTK,NTX -OTK,OTX -PTK,PTX -QTK,QTX -RTK,RTX -STK,STX -TTK,TTX -UTK,UTX -VTK,VTX -WTK,WTX -XTK,XTX -YTK,YTX -ZTK,ZTX -AUK,AUX -BUK,BUX -CUK,CUX -DUK,DUX -EUK,EUX -FUK,FUX -GUK,GUX -HUK,HUX -IUK,IUX -JUK,JUX -KUK,KUX -LUK,LUX -MUK,MUX -NUK,NUX -OUK,OUX -PUK,PUX -QUK,QUX -RUK,RUX -SUK,SUX -TUK,TUX -UUK,UUX -VUK,VUX -WUK,WUX -XUK,XUX -YUK,YUX -ZUK,ZUX -AVK,AVX -BVK,BVX -CVK,CVX -DVK,DVX -EVK,EVX -FVK,FVX -GVK,GVX -HVK,HVX -IVK,IVX -JVK,JVX -KVK,KVX -LVK,LVX -MVK,MVX -NVK,NVX -OVK,OVX -PVK,PVX -QVK,QVX -RVK,RVX -SVK,SVX -TVK,TVX -UVK,UVX -VVK,VVX -WVK,WVX -XVK,XVX -YVK,YVX -ZVK,ZVX -AWK,AWX -BWK,BWX -CWK,CWX -DWK,DWX -EWK,EWX -FWK,FWX -GWK,GWX -HWK,HWX -IWK,IWX -JWK,JWX -KWK,KWX -LWK,LWX -MWK,MWX -NWK,NWX -OWK,OWX -PWK,PWX -QWK,QWX -RWK,RWX -SWK,SWX -TWK,TWX -UWK,UWX -VWK,VWX -WWK,WWX -XWK,XWX -YWK,YWX -ZWK,ZWX -AXK,AXX -BXK,BXX -CXK,CXX -DXK,DXX -EXK,EXX -FXK,FXX -GXK,GXX -HXK,HXX -IXK,IXX -JXK,JXX -KXK,KXX -LXK,LXX -MXK,MXX -NXK,NXX -OXK,OXX -PXK,PXX -QXK,QXX -RXK,RXX -SXK,SXX -TXK,TXX -UXK,UXX -VXK,VXX -WXK,WXX -XXK,XXX -YXK,YXX -ZXK,ZXX -AYK,AYX -BYK,BYX -CYK,CYX -DYK,DYX -EYK,EYX -FYK,FYX -GYK,GYX -HYK,HYX -IYK,IYX -JYK,JYX -KYK,KYX -LYK,LYX -MYK,MYX -NYK,NYX -OYK,OYX -PYK,PYX -QYK,QYX -RYK,RYX -SYK,SYX -TYK,TYX -UYK,UYX -VYK,VYX -WYK,WYX -XYK,XYX -YYK,YYX -ZYK,ZYX -AZK,AZX -BZK,BZX -CZK,CZX -DZK,DZX -EZK,EZX -FZK,FZX -GZK,GZX -HZK,HZX -IZK,IZX -JZK,JZX -KZK,KZX -LZK,LZX -MZK,MZX -NZK,NZX -OZK,OZX -PZK,PZX -QZK,QZX -RZK,RZX -SZK,SZX -TZK,TZX -UZK,UZX -VZK,VZX -WZK,WZX -XZK,XZX -YZK,YZX -ZZK,ZZX -AAL,AAY -BAL,BAY -CAL,CAY -DAL,DAY -EAL,EAY -FAL,FAY -GAL,GAY -HAL,HAY -IAL,IAY -JAL,JAY -KAL,KAY -LAL,LAY -MAL,MAY -NAL,NAY -OAL,OAY -PAL,PAY -QAL,QAY -RAL,RAY -SAL,SAY -TAL,TAY -UAL,UAY -VAL,VAY -WAL,WAY -XAL,XAY -YAL,YAY -ZAL,ZAY -ABL,ABY -BBL,BBY -CBL,CBY -DBL,DBY -EBL,EBY -FBL,FBY -GBL,GBY -HBL,HBY -IBL,IBY -JBL,JBY -KBL,KBY -LBL,LBY -MBL,MBY -NBL,NBY -OBL,OBY -PBL,PBY -QBL,QBY -RBL,RBY -SBL,SBY -TBL,TBY -UBL,UBY -VBL,VBY -WBL,WBY -XBL,XBY -YBL,YBY -ZBL,ZBY -ACL,ACY -BCL,BCY -CCL,CCY -DCL,DCY -ECL,ECY -FCL,FCY -GCL,GCY -HCL,HCY -ICL,ICY -JCL,JCY -KCL,KCY -LCL,LCY -MCL,MCY -NCL,NCY -OCL,OCY -PCL,PCY -QCL,QCY -RCL,RCY -SCL,SCY -TCL,TCY -UCL,UCY -VCL,VCY -WCL,WCY -XCL,XCY -YCL,YCY -ZCL,ZCY -ADL,ADY -BDL,BDY -CDL,CDY -DDL,DDY -EDL,EDY -FDL,FDY -GDL,GDY -HDL,HDY -IDL,IDY -JDL,JDY -KDL,KDY -LDL,LDY -MDL,MDY -NDL,NDY -ODL,ODY -PDL,PDY -QDL,QDY -RDL,RDY -SDL,SDY -TDL,TDY -UDL,UDY -VDL,VDY -WDL,WDY -XDL,XDY -YDL,YDY -ZDL,ZDY -AEL,AEY -BEL,BEY -CEL,CEY -DEL,DEY -EEL,EEY -FEL,FEY -GEL,GEY -HEL,HEY -IEL,IEY -JEL,JEY -KEL,KEY -LEL,LEY -MEL,MEY -NEL,NEY -OEL,OEY -PEL,PEY -QEL,QEY -REL,REY -SEL,SEY -TEL,TEY -UEL,UEY -VEL,VEY -WEL,WEY -XEL,XEY -YEL,YEY -ZEL,ZEY -AFL,AFY -BFL,BFY -CFL,CFY -DFL,DFY -EFL,EFY -FFL,FFY -GFL,GFY -HFL,HFY -IFL,IFY -JFL,JFY -KFL,KFY -LFL,LFY -MFL,MFY -NFL,NFY -OFL,OFY -PFL,PFY -QFL,QFY -RFL,RFY -SFL,SFY -TFL,TFY -UFL,UFY -VFL,VFY -WFL,WFY -XFL,XFY -YFL,YFY -ZFL,ZFY -AGL,AGY -BGL,BGY -CGL,CGY -DGL,DGY -EGL,EGY -FGL,FGY -GGL,GGY -HGL,HGY -IGL,IGY -JGL,JGY -KGL,KGY -LGL,LGY -MGL,MGY -NGL,NGY -OGL,OGY -PGL,PGY -QGL,QGY -RGL,RGY -SGL,SGY -TGL,TGY -UGL,UGY -VGL,VGY -WGL,WGY -XGL,XGY -YGL,YGY -ZGL,ZGY -AHL,AHY -BHL,BHY -CHL,CHY -DHL,DHY -EHL,EHY -FHL,FHY -GHL,GHY -HHL,HHY -IHL,IHY -JHL,JHY -KHL,KHY -LHL,LHY -MHL,MHY -NHL,NHY -OHL,OHY -PHL,PHY -QHL,QHY -RHL,RHY -SHL,SHY -THL,THY -UHL,UHY -VHL,VHY -WHL,WHY -XHL,XHY -YHL,YHY -ZHL,ZHY -AIL,AIY -BIL,BIY -CIL,CIY -DIL,DIY -EIL,EIY -FIL,FIY -GIL,GIY -HIL,HIY -IIL,IIY -JIL,JIY -KIL,KIY -LIL,LIY -MIL,MIY -NIL,NIY -OIL,OIY -PIL,PIY -QIL,QIY -RIL,RIY -SIL,SIY -TIL,TIY -UIL,UIY -VIL,VIY -WIL,WIY -XIL,XIY -YIL,YIY -ZIL,ZIY -AJL,AJY -BJL,BJY -CJL,CJY -DJL,DJY -EJL,EJY -FJL,FJY -GJL,GJY -HJL,HJY -IJL,IJY -JJL,JJY -KJL,KJY -LJL,LJY -MJL,MJY -NJL,NJY -OJL,OJY -PJL,PJY -QJL,QJY -RJL,RJY -SJL,SJY -TJL,TJY -UJL,UJY -VJL,VJY -WJL,WJY -XJL,XJY -YJL,YJY -ZJL,ZJY -AKL,AKY -BKL,BKY -CKL,CKY -DKL,DKY -EKL,EKY -FKL,FKY -GKL,GKY -HKL,HKY -IKL,IKY -JKL,JKY -KKL,KKY -LKL,LKY -MKL,MKY -NKL,NKY -OKL,OKY -PKL,PKY -QKL,QKY -RKL,RKY -SKL,SKY -TKL,TKY -UKL,UKY -VKL,VKY -WKL,WKY -XKL,XKY -YKL,YKY -ZKL,ZKY -ALL,ALY -BLL,BLY -CLL,CLY -DLL,DLY -ELL,ELY -FLL,FLY -GLL,GLY -HLL,HLY -ILL,ILY -JLL,JLY -KLL,KLY -LLL,LLY -MLL,MLY -NLL,NLY -OLL,OLY -PLL,PLY -QLL,QLY -RLL,RLY -SLL,SLY -TLL,TLY -ULL,ULY -VLL,VLY -WLL,WLY -XLL,XLY -YLL,YLY -ZLL,ZLY -AML,AMY -BML,BMY -CML,CMY -DML,DMY -EML,EMY -FML,FMY -GML,GMY -HML,HMY -IML,IMY -JML,JMY -KML,KMY -LML,LMY -MML,MMY -NML,NMY -OML,OMY -PML,PMY -QML,QMY -RML,RMY -SML,SMY -TML,TMY -UML,UMY -VML,VMY -WML,WMY -XML,XMY -YML,YMY -ZML,ZMY -ANL,ANY -BNL,BNY -CNL,CNY -DNL,DNY -ENL,ENY -FNL,FNY -GNL,GNY -HNL,HNY -INL,INY -JNL,JNY -KNL,KNY -LNL,LNY -MNL,MNY -NNL,NNY -ONL,ONY -PNL,PNY -QNL,QNY -RNL,RNY -SNL,SNY -TNL,TNY -UNL,UNY -VNL,VNY -WNL,WNY -XNL,XNY -YNL,YNY -ZNL,ZNY -AOL,AOY -BOL,BOY -COL,COY -DOL,DOY -EOL,EOY -FOL,FOY -GOL,GOY -HOL,HOY -IOL,IOY -JOL,JOY -KOL,KOY -LOL,LOY -MOL,MOY -NOL,NOY -OOL,OOY -POL,POY -QOL,QOY -ROL,ROY -SOL,SOY -TOL,TOY -UOL,UOY -VOL,VOY -WOL,WOY -XOL,XOY -YOL,YOY -ZOL,ZOY -APL,APY -BPL,BPY -CPL,CPY -DPL,DPY -EPL,EPY -FPL,FPY -GPL,GPY -HPL,HPY -IPL,IPY -JPL,JPY -KPL,KPY -LPL,LPY -MPL,MPY -NPL,NPY -OPL,OPY -PPL,PPY -QPL,QPY -RPL,RPY -SPL,SPY -TPL,TPY -UPL,UPY -VPL,VPY -WPL,WPY -XPL,XPY -YPL,YPY -ZPL,ZPY -AQL,AQY -BQL,BQY -CQL,CQY -DQL,DQY -EQL,EQY -FQL,FQY -GQL,GQY -HQL,HQY -IQL,IQY -JQL,JQY -KQL,KQY -LQL,LQY -MQL,MQY -NQL,NQY -OQL,OQY -PQL,PQY -QQL,QQY -RQL,RQY -SQL,SQY -TQL,TQY -UQL,UQY -VQL,VQY -WQL,WQY -XQL,XQY -YQL,YQY -ZQL,ZQY -ARL,ARY -BRL,BRY -CRL,CRY -DRL,DRY -ERL,ERY -FRL,FRY -GRL,GRY -HRL,HRY -IRL,IRY -JRL,JRY -KRL,KRY -LRL,LRY -MRL,MRY -NRL,NRY -ORL,ORY -PRL,PRY -QRL,QRY -RRL,RRY -SRL,SRY -TRL,TRY -URL,URY -VRL,VRY -WRL,WRY -XRL,XRY -YRL,YRY -ZRL,ZRY -ASL,ASY -BSL,BSY -CSL,CSY -DSL,DSY -ESL,ESY -FSL,FSY -GSL,GSY -HSL,HSY -ISL,ISY -JSL,JSY -KSL,KSY -LSL,LSY -MSL,MSY -NSL,NSY -OSL,OSY -PSL,PSY -QSL,QSY -RSL,RSY -SSL,SSY -TSL,TSY -USL,USY -VSL,VSY -WSL,WSY -XSL,XSY -YSL,YSY -ZSL,ZSY -ATL,ATY -BTL,BTY -CTL,CTY -DTL,DTY -ETL,ETY -FTL,FTY -GTL,GTY -HTL,HTY -ITL,ITY -JTL,JTY -KTL,KTY -LTL,LTY -MTL,MTY -NTL,NTY -OTL,OTY -PTL,PTY -QTL,QTY -RTL,RTY -STL,STY -TTL,TTY -UTL,UTY -VTL,VTY -WTL,WTY -XTL,XTY -YTL,YTY -ZTL,ZTY -AUL,AUY -BUL,BUY -CUL,CUY -DUL,DUY -EUL,EUY -FUL,FUY -GUL,GUY -HUL,HUY -IUL,IUY -JUL,JUY -KUL,KUY -LUL,LUY -MUL,MUY -NUL,NUY -OUL,OUY -PUL,PUY -QUL,QUY -RUL,RUY -SUL,SUY -TUL,TUY -UUL,UUY -VUL,VUY -WUL,WUY -XUL,XUY -YUL,YUY -ZUL,ZUY -AVL,AVY -BVL,BVY -CVL,CVY -DVL,DVY -EVL,EVY -FVL,FVY -GVL,GVY -HVL,HVY -IVL,IVY -JVL,JVY -KVL,KVY -LVL,LVY -MVL,MVY -NVL,NVY -OVL,OVY -PVL,PVY -QVL,QVY -RVL,RVY -SVL,SVY -TVL,TVY -UVL,UVY -VVL,VVY -WVL,WVY -XVL,XVY -YVL,YVY -ZVL,ZVY -AWL,AWY -BWL,BWY -CWL,CWY -DWL,DWY -EWL,EWY -FWL,FWY -GWL,GWY -HWL,HWY -IWL,IWY -JWL,JWY -KWL,KWY -LWL,LWY -MWL,MWY -NWL,NWY -OWL,OWY -PWL,PWY -QWL,QWY -RWL,RWY -SWL,SWY -TWL,TWY -UWL,UWY -VWL,VWY -WWL,WWY -XWL,XWY -YWL,YWY -ZWL,ZWY -AXL,AXY -BXL,BXY -CXL,CXY -DXL,DXY -EXL,EXY -FXL,FXY -GXL,GXY -HXL,HXY -IXL,IXY -JXL,JXY -KXL,KXY -LXL,LXY -MXL,MXY -NXL,NXY -OXL,OXY -PXL,PXY -QXL,QXY -RXL,RXY -SXL,SXY -TXL,TXY -UXL,UXY -VXL,VXY -WXL,WXY -XXL,XXY -YXL,YXY -ZXL,ZXY -AYL,AYY -BYL,BYY -CYL,CYY -DYL,DYY -EYL,EYY -FYL,FYY -GYL,GYY -HYL,HYY -IYL,IYY -JYL,JYY -KYL,KYY -LYL,LYY -MYL,MYY -NYL,NYY -OYL,OYY -PYL,PYY -QYL,QYY -RYL,RYY -SYL,SYY -TYL,TYY -UYL,UYY -VYL,VYY -WYL,WYY -XYL,XYY -YYL,YYY -ZYL,ZYY -AZL,AZY -BZL,BZY -CZL,CZY -DZL,DZY -EZL,EZY -FZL,FZY -GZL,GZY -HZL,HZY -IZL,IZY -JZL,JZY -KZL,KZY -LZL,LZY -MZL,MZY -NZL,NZY -OZL,OZY -PZL,PZY -QZL,QZY -RZL,RZY -SZL,SZY -TZL,TZY -UZL,UZY -VZL,VZY -WZL,WZY -XZL,XZY -YZL,YZY -ZZL,ZZY -AAM,AAZ -BAM,BAZ -CAM,CAZ -DAM,DAZ -EAM,EAZ -FAM,FAZ -GAM,GAZ -HAM,HAZ -IAM,IAZ -JAM,JAZ -KAM,KAZ -LAM,LAZ -MAM,MAZ -NAM,NAZ -OAM,OAZ -PAM,PAZ -QAM,QAZ -RAM,RAZ -SAM,SAZ -TAM,TAZ -UAM,UAZ -VAM,VAZ -WAM,WAZ -XAM,XAZ -YAM,YAZ -ZAM,ZAZ -ABM,ABZ -BBM,BBZ -CBM,CBZ -DBM,DBZ -EBM,EBZ -FBM,FBZ -GBM,GBZ -HBM,HBZ -IBM,IBZ -JBM,JBZ -KBM,KBZ -LBM,LBZ -MBM,MBZ -NBM,NBZ -OBM,OBZ -PBM,PBZ -QBM,QBZ -RBM,RBZ -SBM,SBZ -TBM,TBZ -UBM,UBZ -VBM,VBZ -WBM,WBZ -XBM,XBZ -YBM,YBZ -ZBM,ZBZ -ACM,ACZ -BCM,BCZ -CCM,CCZ -DCM,DCZ -ECM,ECZ -FCM,FCZ -GCM,GCZ -HCM,HCZ -ICM,ICZ -JCM,JCZ -KCM,KCZ -LCM,LCZ -MCM,MCZ -NCM,NCZ -OCM,OCZ -PCM,PCZ -QCM,QCZ -RCM,RCZ -SCM,SCZ -TCM,TCZ -UCM,UCZ -VCM,VCZ -WCM,WCZ -XCM,XCZ -YCM,YCZ -ZCM,ZCZ -ADM,ADZ -BDM,BDZ -CDM,CDZ -DDM,DDZ -EDM,EDZ -FDM,FDZ -GDM,GDZ -HDM,HDZ -IDM,IDZ -JDM,JDZ -KDM,KDZ -LDM,LDZ -MDM,MDZ -NDM,NDZ -ODM,ODZ -PDM,PDZ -QDM,QDZ -RDM,RDZ -SDM,SDZ -TDM,TDZ -UDM,UDZ -VDM,VDZ -WDM,WDZ -XDM,XDZ -YDM,YDZ -ZDM,ZDZ -AEM,AEZ -BEM,BEZ -CEM,CEZ -DEM,DEZ -EEM,EEZ -FEM,FEZ -GEM,GEZ -HEM,HEZ -IEM,IEZ -JEM,JEZ -KEM,KEZ -LEM,LEZ -MEM,MEZ -NEM,NEZ -OEM,OEZ -PEM,PEZ -QEM,QEZ -REM,REZ -SEM,SEZ -TEM,TEZ -UEM,UEZ -VEM,VEZ -WEM,WEZ -XEM,XEZ -YEM,YEZ -ZEM,ZEZ -AFM,AFZ -BFM,BFZ -CFM,CFZ -DFM,DFZ -EFM,EFZ -FFM,FFZ -GFM,GFZ -HFM,HFZ -IFM,IFZ -JFM,JFZ -KFM,KFZ -LFM,LFZ -MFM,MFZ -NFM,NFZ -OFM,OFZ -PFM,PFZ -QFM,QFZ -RFM,RFZ -SFM,SFZ -TFM,TFZ -UFM,UFZ -VFM,VFZ -WFM,WFZ -XFM,XFZ -YFM,YFZ -ZFM,ZFZ -AGM,AGZ -BGM,BGZ -CGM,CGZ -DGM,DGZ -EGM,EGZ -FGM,FGZ -GGM,GGZ -HGM,HGZ -IGM,IGZ -JGM,JGZ -KGM,KGZ -LGM,LGZ -MGM,MGZ -NGM,NGZ -OGM,OGZ -PGM,PGZ -QGM,QGZ -RGM,RGZ -SGM,SGZ -TGM,TGZ -UGM,UGZ -VGM,VGZ -WGM,WGZ -XGM,XGZ -YGM,YGZ -ZGM,ZGZ -AHM,AHZ -BHM,BHZ -CHM,CHZ -DHM,DHZ -EHM,EHZ -FHM,FHZ -GHM,GHZ -HHM,HHZ -IHM,IHZ -JHM,JHZ -KHM,KHZ -LHM,LHZ -MHM,MHZ -NHM,NHZ -OHM,OHZ -PHM,PHZ -QHM,QHZ -RHM,RHZ -SHM,SHZ -THM,THZ -UHM,UHZ -VHM,VHZ -WHM,WHZ -XHM,XHZ -YHM,YHZ -ZHM,ZHZ -AIM,AIZ -BIM,BIZ -CIM,CIZ -DIM,DIZ -EIM,EIZ -FIM,FIZ -GIM,GIZ -HIM,HIZ -IIM,IIZ -JIM,JIZ -KIM,KIZ -LIM,LIZ -MIM,MIZ -NIM,NIZ -OIM,OIZ -PIM,PIZ -QIM,QIZ -RIM,RIZ -SIM,SIZ -TIM,TIZ -UIM,UIZ -VIM,VIZ -WIM,WIZ -XIM,XIZ -YIM,YIZ -ZIM,ZIZ -AJM,AJZ -BJM,BJZ -CJM,CJZ -DJM,DJZ -EJM,EJZ -FJM,FJZ -GJM,GJZ -HJM,HJZ -IJM,IJZ -JJM,JJZ -KJM,KJZ -LJM,LJZ -MJM,MJZ -NJM,NJZ -OJM,OJZ -PJM,PJZ -QJM,QJZ -RJM,RJZ -SJM,SJZ -TJM,TJZ -UJM,UJZ -VJM,VJZ -WJM,WJZ -XJM,XJZ -YJM,YJZ -ZJM,ZJZ -AKM,AKZ -BKM,BKZ -CKM,CKZ -DKM,DKZ -EKM,EKZ -FKM,FKZ -GKM,GKZ -HKM,HKZ -IKM,IKZ -JKM,JKZ -KKM,KKZ -LKM,LKZ -MKM,MKZ -NKM,NKZ -OKM,OKZ -PKM,PKZ -QKM,QKZ -RKM,RKZ -SKM,SKZ -TKM,TKZ -UKM,UKZ -VKM,VKZ -WKM,WKZ -XKM,XKZ -YKM,YKZ -ZKM,ZKZ -ALM,ALZ -BLM,BLZ -CLM,CLZ -DLM,DLZ -ELM,ELZ -FLM,FLZ -GLM,GLZ -HLM,HLZ -ILM,ILZ -JLM,JLZ -KLM,KLZ -LLM,LLZ -MLM,MLZ -NLM,NLZ -OLM,OLZ -PLM,PLZ -QLM,QLZ -RLM,RLZ -SLM,SLZ -TLM,TLZ -ULM,ULZ -VLM,VLZ -WLM,WLZ -XLM,XLZ -YLM,YLZ -ZLM,ZLZ -AMM,AMZ -BMM,BMZ -CMM,CMZ -DMM,DMZ -EMM,EMZ -FMM,FMZ -GMM,GMZ -HMM,HMZ -IMM,IMZ -JMM,JMZ -KMM,KMZ -LMM,LMZ -MMM,MMZ -NMM,NMZ -OMM,OMZ -PMM,PMZ -QMM,QMZ -RMM,RMZ -SMM,SMZ -TMM,TMZ -UMM,UMZ -VMM,VMZ -WMM,WMZ -XMM,XMZ -YMM,YMZ -ZMM,ZMZ -ANM,ANZ -BNM,BNZ -CNM,CNZ -DNM,DNZ -ENM,ENZ -FNM,FNZ -GNM,GNZ -HNM,HNZ -INM,INZ -JNM,JNZ -KNM,KNZ -LNM,LNZ -MNM,MNZ -NNM,NNZ -ONM,ONZ -PNM,PNZ -QNM,QNZ -RNM,RNZ -SNM,SNZ -TNM,TNZ -UNM,UNZ -VNM,VNZ -WNM,WNZ -XNM,XNZ -YNM,YNZ -ZNM,ZNZ -AOM,AOZ -BOM,BOZ -COM,COZ -DOM,DOZ -EOM,EOZ -FOM,FOZ -GOM,GOZ -HOM,HOZ -IOM,IOZ -JOM,JOZ -KOM,KOZ -LOM,LOZ -MOM,MOZ -NOM,NOZ -OOM,OOZ -POM,POZ -QOM,QOZ -ROM,ROZ -SOM,SOZ -TOM,TOZ -UOM,UOZ -VOM,VOZ -WOM,WOZ -XOM,XOZ -YOM,YOZ -ZOM,ZOZ -APM,APZ -BPM,BPZ -CPM,CPZ -DPM,DPZ -EPM,EPZ -FPM,FPZ -GPM,GPZ -HPM,HPZ -IPM,IPZ -JPM,JPZ -KPM,KPZ -LPM,LPZ -MPM,MPZ -NPM,NPZ -OPM,OPZ -PPM,PPZ -QPM,QPZ -RPM,RPZ -SPM,SPZ -TPM,TPZ -UPM,UPZ -VPM,VPZ -WPM,WPZ -XPM,XPZ -YPM,YPZ -ZPM,ZPZ -AQM,AQZ -BQM,BQZ -CQM,CQZ -DQM,DQZ -EQM,EQZ -FQM,FQZ -GQM,GQZ -HQM,HQZ -IQM,IQZ -JQM,JQZ -KQM,KQZ -LQM,LQZ -MQM,MQZ -NQM,NQZ -OQM,OQZ -PQM,PQZ -QQM,QQZ -RQM,RQZ -SQM,SQZ -TQM,TQZ -UQM,UQZ -VQM,VQZ -WQM,WQZ -XQM,XQZ -YQM,YQZ -ZQM,ZQZ -ARM,ARZ -BRM,BRZ -CRM,CRZ -DRM,DRZ -ERM,ERZ -FRM,FRZ -GRM,GRZ -HRM,HRZ -IRM,IRZ -JRM,JRZ -KRM,KRZ -LRM,LRZ -MRM,MRZ -NRM,NRZ -ORM,ORZ -PRM,PRZ -QRM,QRZ -RRM,RRZ -SRM,SRZ -TRM,TRZ -URM,URZ -VRM,VRZ -WRM,WRZ -XRM,XRZ -YRM,YRZ -ZRM,ZRZ -ASM,ASZ -BSM,BSZ -CSM,CSZ -DSM,DSZ -ESM,ESZ -FSM,FSZ -GSM,GSZ -HSM,HSZ -ISM,ISZ -JSM,JSZ -KSM,KSZ -LSM,LSZ -MSM,MSZ -NSM,NSZ -OSM,OSZ -PSM,PSZ -QSM,QSZ -RSM,RSZ -SSM,SSZ -TSM,TSZ -USM,USZ -VSM,VSZ -WSM,WSZ -XSM,XSZ -YSM,YSZ -ZSM,ZSZ -ATM,ATZ -BTM,BTZ -CTM,CTZ -DTM,DTZ -ETM,ETZ -FTM,FTZ -GTM,GTZ -HTM,HTZ -ITM,ITZ -JTM,JTZ -KTM,KTZ -LTM,LTZ -MTM,MTZ -NTM,NTZ -OTM,OTZ -PTM,PTZ -QTM,QTZ -RTM,RTZ -STM,STZ -TTM,TTZ -UTM,UTZ -VTM,VTZ -WTM,WTZ -XTM,XTZ -YTM,YTZ -ZTM,ZTZ -AUM,AUZ -BUM,BUZ -CUM,CUZ -DUM,DUZ -EUM,EUZ -FUM,FUZ -GUM,GUZ -HUM,HUZ -IUM,IUZ -JUM,JUZ -KUM,KUZ -LUM,LUZ -MUM,MUZ -NUM,NUZ -OUM,OUZ -PUM,PUZ -QUM,QUZ -RUM,RUZ -SUM,SUZ -TUM,TUZ -UUM,UUZ -VUM,VUZ -WUM,WUZ -XUM,XUZ -YUM,YUZ -ZUM,ZUZ -AVM,AVZ -BVM,BVZ -CVM,CVZ -DVM,DVZ -EVM,EVZ -FVM,FVZ -GVM,GVZ -HVM,HVZ -IVM,IVZ -JVM,JVZ -KVM,KVZ -LVM,LVZ -MVM,MVZ -NVM,NVZ -OVM,OVZ -PVM,PVZ -QVM,QVZ -RVM,RVZ -SVM,SVZ -TVM,TVZ -UVM,UVZ -VVM,VVZ -WVM,WVZ -XVM,XVZ -YVM,YVZ -ZVM,ZVZ -AWM,AWZ -BWM,BWZ -CWM,CWZ -DWM,DWZ -EWM,EWZ -FWM,FWZ -GWM,GWZ -HWM,HWZ -IWM,IWZ -JWM,JWZ -KWM,KWZ -LWM,LWZ -MWM,MWZ -NWM,NWZ -OWM,OWZ -PWM,PWZ -QWM,QWZ -RWM,RWZ -SWM,SWZ -TWM,TWZ -UWM,UWZ -VWM,VWZ -WWM,WWZ -XWM,XWZ -YWM,YWZ -ZWM,ZWZ -AXM,AXZ -BXM,BXZ -CXM,CXZ -DXM,DXZ -EXM,EXZ -FXM,FXZ -GXM,GXZ -HXM,HXZ -IXM,IXZ -JXM,JXZ -KXM,KXZ -LXM,LXZ -MXM,MXZ -NXM,NXZ -OXM,OXZ -PXM,PXZ -QXM,QXZ -RXM,RXZ -SXM,SXZ -TXM,TXZ -UXM,UXZ -VXM,VXZ -WXM,WXZ -XXM,XXZ -YXM,YXZ -ZXM,ZXZ -AYM,AYZ -BYM,BYZ -CYM,CYZ -DYM,DYZ -EYM,EYZ -FYM,FYZ -GYM,GYZ -HYM,HYZ -IYM,IYZ -JYM,JYZ -KYM,KYZ -LYM,LYZ -MYM,MYZ -NYM,NYZ -OYM,OYZ -PYM,PYZ -QYM,QYZ -RYM,RYZ -SYM,SYZ -TYM,TYZ -UYM,UYZ -VYM,VYZ -WYM,WYZ -XYM,XYZ -YYM,YYZ -ZYM,ZYZ -AZM,AZZ -BZM,BZZ -CZM,CZZ -DZM,DZZ -EZM,EZZ -FZM,FZZ -GZM,GZZ -HZM,HZZ -IZM,IZZ -JZM,JZZ -KZM,KZZ -LZM,LZZ -MZM,MZZ -NZM,NZZ -OZM,OZZ -PZM,PZZ -QZM,QZZ -RZM,RZZ -SZM,SZZ -TZM,TZZ -UZM,UZZ -VZM,VZZ -WZM,WZZ -XZM,XZZ -YZM,YZZ -ZZM,ZZZ diff --git a/inst/tests/alluniquechar.csv b/inst/tests/alluniquechar.csv deleted file mode 100644 index 9599daa726..0000000000 --- a/inst/tests/alluniquechar.csv +++ /dev/null @@ -1,501 +0,0 @@ -A,B,C,D,E,F,G,H -jptokakysooopwtmlkeimzbgpeinhy,jptokakysooopwtmlkei,kakysooopwt,pt,i,kyso,ptokakysooopwtmlkeimz,tokakysooopwtmlkeimzbgpein -bchguwmynjhecsxpxldyzlemavmwvz,bchguwmynjhecsxpxldy,uwmynjhecsx,ch,y,mynj,chguwmynjhecsxpxldyzl,hguwmynjhecsxpxldyzlemavmw -qbbudwlbdbzclzrbeimpkqttmexkzl,qbbudwlbdbzclzrbeimp,dwlbdbzclzr,bb,p,lbdb,bbudwlbdbzclzrbeimpkq,budwlbdbzclzrbeimpkqttmexk -zjcigiqbtlzuyletkrxwxfnbztfvzb,zjcigiqbtlzuyletkrxw,giqbtlzuyle,jc,w,qbtl,jcigiqbtlzuyletkrxwxf,cigiqbtlzuyletkrxwxfnbztfv -vsgohkcriagjumqrgdqhjkmidvaker,vsgohkcriagjumqrgdqh,hkcriagjumq,sg,h,cria,sgohkcriagjumqrgdqhjk,gohkcriagjumqrgdqhjkmidvak -gfrktgdaaqjjgavvucfkwtvetvecqg,gfrktgdaaqjjgavvucfk,tgdaaqjjgav,fr,k,daaq,frktgdaaqjjgavvucfkwt,rktgdaaqjjgavvucfkwtvetvec -yihbgahqacmjanoxzybrenayvbvrmr,yihbgahqacmjanoxzybr,gahqacmjano,ih,r,hqac,ihbgahqacmjanoxzybren,hbgahqacmjanoxzybrenayvbvr -ohzbfevxxdsdswnsricxsdymygvhsp,ohzbfevxxdsdswnsricx,fevxxdsdswn,hz,x,vxxd,hzbfevxxdsdswnsricxsd,zbfevxxdsdswnsricxsdymygvh -xieotkodmmnlovimfixdzkrhziypcn,xieotkodmmnlovimfixd,tkodmmnlovi,ie,d,odmm,ieotkodmmnlovimfixdzk,eotkodmmnlovimfixdzkrhziyp -ytnwxfnoagfeycfmifeiotmbbczfna,ytnwxfnoagfeycfmifei,xfnoagfeycf,tn,i,noag,tnwxfnoagfeycfmifeiot,nwxfnoagfeycfmifeiotmbbczf -uxexksmiqkpfkoyxvjfwlttuejaqof,uxexksmiqkpfkoyxvjfw,ksmiqkpfkoy,xe,w,miqk,xexksmiqkpfkoyxvjfwlt,exksmiqkpfkoyxvjfwlttuejaq -slpkslpayzuvednhltnwsedmyoawbn,slpkslpayzuvednhltnw,slpayzuvedn,lp,w,payz,lpkslpayzuvednhltnwse,pkslpayzuvednhltnwsedmyoaw -tjfyzoqoaxxwpyzvoghlfagojqjmov,tjfyzoqoaxxwpyzvoghl,zoqoaxxwpyz,jf,l,qoax,jfyzoqoaxxwpyzvoghlfa,fyzoqoaxxwpyzvoghlfagojqjm -yadvyefcljpggxrqqbiwhnrnprxpsk,yadvyefcljpggxrqqbiw,yefcljpggxr,ad,w,fclj,advyefcljpggxrqqbiwhn,dvyefcljpggxrqqbiwhnrnprxp -guxjjtqdzgxzcwhlxipnaolsphlmvl,guxjjtqdzgxzcwhlxipn,jtqdzgxzcwh,ux,n,qdzg,uxjjtqdzgxzcwhlxipnao,xjjtqdzgxzcwhlxipnaolsphlm -uocqmegcemigqurpfgtuzplvjyfkfx,uocqmegcemigqurpfgtu,megcemigqur,oc,u,gcem,ocqmegcemigqurpfgtuzp,cqmegcemigqurpfgtuzplvjyfk -dydsiqcgivgsbroknojkfypfzlnffb,dydsiqcgivgsbroknojk,iqcgivgsbro,yd,k,cgiv,ydsiqcgivgsbroknojkfy,dsiqcgivgsbroknojkfypfzlnf -kfkzqzvgwgkougsynwravahsoimunu,kfkzqzvgwgkougsynwra,qzvgwgkougs,fk,a,vgwg,fkzqzvgwgkougsynwrava,kzqzvgwgkougsynwravahsoimu -byewjnquiboapntkbabfrzbiioquqt,byewjnquiboapntkbabf,jnquiboapnt,ye,f,quib,yewjnquiboapntkbabfrz,ewjnquiboapntkbabfrzbiioqu -ojhlorvrgmyclvbvrzdpvwkknrajej,ojhlorvrgmyclvbvrzdp,orvrgmyclvb,jh,p,vrgm,jhlorvrgmyclvbvrzdpvw,hlorvrgmyclvbvrzdpvwkknraj -antmzkllnfnrjgixnxejgjduguuoag,antmzkllnfnrjgixnxej,zkllnfnrjgi,nt,j,llnf,ntmzkllnfnrjgixnxejgj,tmzkllnfnrjgixnxejgjduguuo -zlreypbsanygwwcgtyopkoiftvpbtk,zlreypbsanygwwcgtyop,ypbsanygwwc,lr,p,bsan,lreypbsanygwwcgtyopko,reypbsanygwwcgtyopkoiftvpb -hwpokkujpopczjiggmnrymitsfuxve,hwpokkujpopczjiggmnr,kkujpopczji,wp,r,ujpo,wpokkujpopczjiggmnrym,pokkujpopczjiggmnrymitsfux -mjsiscqesoizilmioexdfizkiqacxr,mjsiscqesoizilmioexd,scqesoizilm,js,d,qeso,jsiscqesoizilmioexdfi,siscqesoizilmioexdfizkiqac -nbuxjqxvacepgsyntzcfixrufovrlk,nbuxjqxvacepgsyntzcf,jqxvacepgsy,bu,f,xvac,buxjqxvacepgsyntzcfix,uxjqxvacepgsyntzcfixrufovr -nrjnotncvzzhvbvrpxuxikspkexpcq,nrjnotncvzzhvbvrpxux,otncvzzhvbv,rj,x,ncvz,rjnotncvzzhvbvrpxuxik,jnotncvzzhvbvrpxuxikspkexp -lmzsoqzaevjllqlqkbnrbxkgajgzdp,lmzsoqzaevjllqlqkbnr,oqzaevjllql,mz,r,zaev,mzsoqzaevjllqlqkbnrbx,zsoqzaevjllqlqkbnrbxkgajgz -sdkespgzanchmwzouasdsxmanpkded,sdkespgzanchmwzouasd,spgzanchmwz,dk,d,gzan,dkespgzanchmwzouasdsx,kespgzanchmwzouasdsxmanpkd -utvhemvlranqifkcnndnwwhctnpamn,utvhemvlranqifkcnndn,emvlranqifk,tv,n,vlra,tvhemvlranqifkcnndnww,vhemvlranqifkcnndnwwhctnpa -swznggtrmngallngdlngdgkkjkihql,swznggtrmngallngdlng,ggtrmngalln,wz,g,trmn,wznggtrmngallngdlngdg,znggtrmngallngdlngdgkkjkih -ahrqggmhfiicxlpaqbezxjuetpjyvo,ahrqggmhfiicxlpaqbez,ggmhfiicxlp,hr,z,mhfi,hrqggmhfiicxlpaqbezxj,rqggmhfiicxlpaqbezxjuetpjy -ivfewcaoigjrimwtiovterydgzkdnk,ivfewcaoigjrimwtiovt,wcaoigjrimw,vf,t,aoig,vfewcaoigjrimwtiovter,fewcaoigjrimwtiovterydgzkd -oyvsqsxvxgnpvomiictfhmtgcbhily,oyvsqsxvxgnpvomiictf,qsxvxgnpvom,yv,f,xvxg,yvsqsxvxgnpvomiictfhm,vsqsxvxgnpvomiictfhmtgcbhi -bddzmcdjvekmllvufwderrfedomgbd,bddzmcdjvekmllvufwde,mcdjvekmllv,dd,e,djve,ddzmcdjvekmllvufwderr,dzmcdjvekmllvufwderrfedomg -mgloteusqnesqqpflvujqtxhfskexc,mgloteusqnesqqpflvuj,teusqnesqqp,gl,j,usqn,gloteusqnesqqpflvujqt,loteusqnesqqpflvujqtxhfske -ysthhuttyxpoaadjcaiggmyfdtkuzj,ysthhuttyxpoaadjcaig,huttyxpoaad,st,g,ttyx,sthhuttyxpoaadjcaiggm,thhuttyxpoaadjcaiggmyfdtku -znywgrqqypdbaguhdbcoqhlppvkban,znywgrqqypdbaguhdbco,grqqypdbagu,ny,o,qqyp,nywgrqqypdbaguhdbcoqh,ywgrqqypdbaguhdbcoqhlppvkb -pcpabceuhrdepwomgtjuwghyfzhsfm,pcpabceuhrdepwomgtju,bceuhrdepwo,cp,u,euhr,cpabceuhrdepwomgtjuwg,pabceuhrdepwomgtjuwghyfzhs -reoydzruymbvjfmhzfwvfgwxxdylzy,reoydzruymbvjfmhzfwv,dzruymbvjfm,eo,v,ruym,eoydzruymbvjfmhzfwvfg,oydzruymbvjfmhzfwvfgwxxdyl -dufafxaedrjuaxdoyzkrxmwdxttrvo,dufafxaedrjuaxdoyzkr,fxaedrjuaxd,uf,r,aedr,ufafxaedrjuaxdoyzkrxm,fafxaedrjuaxdoyzkrxmwdxttr -uolvpatvuaupvqvqzhrtxiyrnslnow,uolvpatvuaupvqvqzhrt,patvuaupvqv,ol,t,tvua,olvpatvuaupvqvqzhrtxi,lvpatvuaupvqvqzhrtxiyrnsln -ojwdgshaqcefisubuydxnucjtyrdvh,ojwdgshaqcefisubuydx,gshaqcefisu,jw,x,haqc,jwdgshaqcefisubuydxnu,wdgshaqcefisubuydxnucjtyrd -lgddafkfmectmpdzerfqtxurrmuoad,lgddafkfmectmpdzerfq,afkfmectmpd,gd,q,kfme,gddafkfmectmpdzerfqtx,ddafkfmectmpdzerfqtxurrmuo -kutfrnkipjvcmaiobzvxnwveersire,kutfrnkipjvcmaiobzvx,rnkipjvcmai,ut,x,kipj,utfrnkipjvcmaiobzvxnw,tfrnkipjvcmaiobzvxnwveersi -aijkbxbtykewetowbjguqviwhnlvte,aijkbxbtykewetowbjgu,bxbtykeweto,ij,u,btyk,ijkbxbtykewetowbjguqv,jkbxbtykewetowbjguqviwhnlv -jfiuawhzcgebtbiogsrsyhiczegzsx,jfiuawhzcgebtbiogsrs,awhzcgebtbi,fi,s,hzcg,fiuawhzcgebtbiogsrsyh,iuawhzcgebtbiogsrsyhiczegz -iyhfqoorjrwciqexccpzgvspucsarh,iyhfqoorjrwciqexccpz,qoorjrwciqe,yh,z,orjr,yhfqoorjrwciqexccpzgv,hfqoorjrwciqexccpzgvspucsa -cthuiyvfhwvsucvfdyrsweojokupul,cthuiyvfhwvsucvfdyrs,iyvfhwvsucv,th,s,vfhw,thuiyvfhwvsucvfdyrswe,huiyvfhwvsucvfdyrsweojokup -ehljixzkpkoiutbffbnoajusifvybx,ehljixzkpkoiutbffbno,ixzkpkoiutb,hl,o,zkpk,hljixzkpkoiutbffbnoaj,ljixzkpkoiutbffbnoajusifvy -jtawahvhzwfcsgomoaoxdhabhvnfhf,jtawahvhzwfcsgomoaox,ahvhzwfcsgo,ta,x,vhzw,tawahvhzwfcsgomoaoxdh,awahvhzwfcsgomoaoxdhabhvnf -aqfockkrbblgirljqhzkhddmznkbiu,aqfockkrbblgirljqhzk,ckkrbblgirl,qf,k,krbb,qfockkrbblgirljqhzkhd,fockkrbblgirljqhzkhddmznkb -tlvuwfxwkxpkukslucagzliecuhfqx,tlvuwfxwkxpkukslucag,wfxwkxpkuks,lv,g,xwkx,lvuwfxwkxpkukslucagzl,vuwfxwkxpkukslucagzliecuhf -dyvneacxgkgfewbzavmncwmvyjtcvr,dyvneacxgkgfewbzavmn,eacxgkgfewb,yv,n,cxgk,yvneacxgkgfewbzavmncw,vneacxgkgfewbzavmncwmvyjtc -chcykbwgpedmgvemhfjreutyymmbjy,chcykbwgpedmgvemhfjr,kbwgpedmgve,hc,r,wgpe,hcykbwgpedmgvemhfjreu,cykbwgpedmgvemhfjreutyymmb -qprthzfsxixrxhyfzmjaeycuxdbpzc,qprthzfsxixrxhyfzmja,hzfsxixrxhy,pr,a,fsxi,prthzfsxixrxhyfzmjaey,rthzfsxixrxhyfzmjaeycuxdbp -htmsklrvylsbgdzqjfibpfkbjuldnz,htmsklrvylsbgdzqjfib,klrvylsbgdz,tm,b,rvyl,tmsklrvylsbgdzqjfibpf,msklrvylsbgdzqjfibpfkbjuld -lfkoqjvzlnqqsjpujalnxlaojqpseg,lfkoqjvzlnqqsjpujaln,qjvzlnqqsjp,fk,n,vzln,fkoqjvzlnqqsjpujalnxl,koqjvzlnqqsjpujalnxlaojqps -cphyyztunypfagrsphnlkedorficup,cphyyztunypfagrsphnl,yztunypfagr,ph,l,tuny,phyyztunypfagrsphnlke,hyyztunypfagrsphnlkedorfic -yepsprswhhgimiczgusruoujeactdb,yepsprswhhgimiczgusr,prswhhgimic,ep,r,swhh,epsprswhhgimiczgusruo,psprswhhgimiczgusruoujeact -vgougrmjfbqvurljvgvqhtnvsevcll,vgougrmjfbqvurljvgvq,grmjfbqvurl,go,q,mjfb,gougrmjfbqvurljvgvqht,ougrmjfbqvurljvgvqhtnvsevc -rslmiczulyehcincklsjmhsotszoci,rslmiczulyehcincklsj,iczulyehcin,sl,j,zuly,slmiczulyehcincklsjmh,lmiczulyehcincklsjmhsotszo -grwdswgdayqktshmewjyuurdqtjryj,grwdswgdayqktshmewjy,swgdayqktsh,rw,y,gday,rwdswgdayqktshmewjyuu,wdswgdayqktshmewjyuurdqtjr -scutjhbdorbbohbrrhztwrncftzpka,scutjhbdorbbohbrrhzt,jhbdorbbohb,cu,t,bdor,cutjhbdorbbohbrrhztwr,utjhbdorbbohbrrhztwrncftzp -xnvzuksoxfolfwilwuwufytzjwpcah,xnvzuksoxfolfwilwuwu,uksoxfolfwi,nv,u,soxf,nvzuksoxfolfwilwuwufy,vzuksoxfolfwilwuwufytzjwpc -kehhvbevrpzhxeksjbwbozpzmxqgml,kehhvbevrpzhxeksjbwb,vbevrpzhxek,eh,b,evrp,ehhvbevrpzhxeksjbwboz,hhvbevrpzhxeksjbwbozpzmxqg -kytunwrcsmlpnlostcikghzumswfym,kytunwrcsmlpnlostcik,nwrcsmlpnlo,yt,k,rcsm,ytunwrcsmlpnlostcikgh,tunwrcsmlpnlostcikghzumswf -tmfbhueecnfinceyaiywofyuuqczmx,tmfbhueecnfinceyaiyw,hueecnfince,mf,w,eecn,mfbhueecnfinceyaiywof,fbhueecnfinceyaiywofyuuqcz -weftynnztszxbmyizncqodmferuirf,weftynnztszxbmyizncq,ynnztszxbmy,ef,q,nzts,eftynnztszxbmyizncqod,ftynnztszxbmyizncqodmferui -vlymlwliiejcuquhbqiopbmsltydlm,vlymlwliiejcuquhbqio,lwliiejcuqu,ly,o,liie,lymlwliiejcuquhbqiopb,ymlwliiejcuquhbqiopbmsltyd -zzmiolafggkiwvqcdaznyjpnescbno,zzmiolafggkiwvqcdazn,olafggkiwvq,zm,n,afgg,zmiolafggkiwvqcdaznyj,miolafggkiwvqcdaznyjpnescb -ygjyyucjxkyhdejfxsmxxmdzchhlum,ygjyyucjxkyhdejfxsmx,yucjxkyhdej,gj,x,cjxk,gjyyucjxkyhdejfxsmxxm,jyyucjxkyhdejfxsmxxmdzchhl -rvglbavyqvexrzozekyzljumebdfrk,rvglbavyqvexrzozekyz,bavyqvexrzo,vg,z,vyqv,vglbavyqvexrzozekyzlj,glbavyqvexrzozekyzljumebdf -fpiavkjieeexjxklzdfjpujtbhpgyp,fpiavkjieeexjxklzdfj,vkjieeexjxk,pi,j,jiee,piavkjieeexjxklzdfjpu,iavkjieeexjxklzdfjpujtbhpg -cxtrkyukdriaqgxljqljyfpzzfmwax,cxtrkyukdriaqgxljqlj,kyukdriaqgx,xt,j,ukdr,xtrkyukdriaqgxljqljyf,trkyukdriaqgxljqljyfpzzfmw -jxxeriktnhwkfuqpbbplojylwhgobm,jxxeriktnhwkfuqpbbpl,riktnhwkfuq,xx,l,ktnh,xxeriktnhwkfuqpbbploj,xeriktnhwkfuqpbbplojylwhgo -yrzbyrrhgwdlfjnrnyuxfnodjqvmhl,yrzbyrrhgwdlfjnrnyux,yrrhgwdlfjn,rz,x,rhgw,rzbyrrhgwdlfjnrnyuxfn,zbyrrhgwdlfjnrnyuxfnodjqvm -oqfypqlymrowgtrherqdjkwlhtxqlw,oqfypqlymrowgtrherqd,pqlymrowgtr,qf,d,lymr,qfypqlymrowgtrherqdjk,fypqlymrowgtrherqdjkwlhtxq -hsnkvsqbpyoodrxarxgkuadpbtatcu,hsnkvsqbpyoodrxarxgk,vsqbpyoodrx,sn,k,qbpy,snkvsqbpyoodrxarxgkua,nkvsqbpyoodrxarxgkuadpbtat -yugmpgyfhmpgqczzwxriudfygjwwvw,yugmpgyfhmpgqczzwxri,pgyfhmpgqcz,ug,i,yfhm,ugmpgyfhmpgqczzwxriud,gmpgyfhmpgqczzwxriudfygjww -riapgspfqfjhybavpaautepxotjipy,riapgspfqfjhybavpaau,gspfqfjhyba,ia,u,pfqf,iapgspfqfjhybavpaaute,apgspfqfjhybavpaautepxotji -hjxencmcmutoeciwnbzvtnwhdzpwrb,hjxencmcmutoeciwnbzv,ncmcmutoeci,jx,v,mcmu,jxencmcmutoeciwnbzvtn,xencmcmutoeciwnbzvtnwhdzpw -szssbnexbzbgakizmlcmbdgifbmgcm,szssbnexbzbgakizmlcm,bnexbzbgaki,zs,m,exbz,zssbnexbzbgakizmlcmbd,ssbnexbzbgakizmlcmbdgifbmg -nylwrijwepdslvhqfmbvzajtyuxjzg,nylwrijwepdslvhqfmbv,rijwepdslvh,yl,v,jwep,ylwrijwepdslvhqfmbvza,lwrijwepdslvhqfmbvzajtyuxj -nhtmwkalimzcfrxihsqjwljtvwtjwa,nhtmwkalimzcfrxihsqj,wkalimzcfrx,ht,j,alim,htmwkalimzcfrxihsqjwl,tmwkalimzcfrxihsqjwljtvwtj -khqxcqrorzmkqueqegznmhaficysda,khqxcqrorzmkqueqegzn,cqrorzmkque,hq,n,rorz,hqxcqrorzmkqueqegznmh,qxcqrorzmkqueqegznmhaficys -livjtqpemftmvaglwuawxbzsificdl,livjtqpemftmvaglwuaw,tqpemftmvag,iv,w,pemf,ivjtqpemftmvaglwuawxb,vjtqpemftmvaglwuawxbzsific -ozwstuxpqqksftwupdxjzvoynhfngm,ozwstuxpqqksftwupdxj,tuxpqqksftw,zw,j,xpqq,zwstuxpqqksftwupdxjzv,wstuxpqqksftwupdxjzvoynhfn -hbcroyhoogxzvpvbntgzfdalzsfnsg,hbcroyhoogxzvpvbntgz,oyhoogxzvpv,bc,z,hoog,bcroyhoogxzvpvbntgzfd,croyhoogxzvpvbntgzfdalzsfn -mmxdpoqgyykaecytkhasvdtrndgthn,mmxdpoqgyykaecytkhas,poqgyykaecy,mx,s,qgyy,mxdpoqgyykaecytkhasvd,xdpoqgyykaecytkhasvdtrndgt -aswzzvazowzrhilicdtgqwomrztppl,aswzzvazowzrhilicdtg,zvazowzrhil,sw,g,azow,swzzvazowzrhilicdtgqw,wzzvazowzrhilicdtgqwomrztp -usrxxwzbcqfpikppzedwlhrfxrlgfa,usrxxwzbcqfpikppzedw,xwzbcqfpikp,sr,w,zbcq,srxxwzbcqfpikppzedwlh,rxxwzbcqfpikppzedwlhrfxrlg -zalvuapsabffkitqzootlncgomhklu,zalvuapsabffkitqzoot,uapsabffkit,al,t,psab,alvuapsabffkitqzootln,lvuapsabffkitqzootlncgomhk -spgcvloxmteohugupscscunhcfhpch,spgcvloxmteohugupscs,vloxmteohug,pg,s,oxmt,pgcvloxmteohugupscscu,gcvloxmteohugupscscunhcfhp -joucnzumcssbuzwajraceebgfetsxa,joucnzumcssbuzwajrac,nzumcssbuzw,ou,c,umcs,oucnzumcssbuzwajracee,ucnzumcssbuzwajraceebgfets -muxiqnojnxlxxidvwqdmeaurbciggl,muxiqnojnxlxxidvwqdm,qnojnxlxxid,ux,m,ojnx,uxiqnojnxlxxidvwqdmea,xiqnojnxlxxidvwqdmeaurbcig -fuogefiwcsxvobkjaoagfycddpnwxh,fuogefiwcsxvobkjaoag,efiwcsxvobk,uo,g,iwcs,uogefiwcsxvobkjaoagfy,ogefiwcsxvobkjaoagfycddpnw -jdtxxyokolstczkytrqgjtklkgorgf,jdtxxyokolstczkytrqg,xyokolstczk,dt,g,okol,dtxxyokolstczkytrqgjt,txxyokolstczkytrqgjtklkgor -omtzixthlegdbtcqijpgbakqgircml,omtzixthlegdbtcqijpg,ixthlegdbtc,mt,g,thle,mtzixthlegdbtcqijpgba,tzixthlegdbtcqijpgbakqgirc -coinafrepibpgqvlnqkiidfuegqajl,coinafrepibpgqvlnqki,afrepibpgqv,oi,i,repi,oinafrepibpgqvlnqkiid,inafrepibpgqvlnqkiidfuegqa -yxvvqjitmbjuvensvnhnkcfjjsejlm,yxvvqjitmbjuvensvnhn,qjitmbjuven,xv,n,itmb,xvvqjitmbjuvensvnhnkc,vvqjitmbjuvensvnhnkcfjjsej -mjkkvlgfiwepznjxvhjvufqxswtlwh,mjkkvlgfiwepznjxvhjv,vlgfiwepznj,jk,v,gfiw,jkkvlgfiwepznjxvhjvuf,kkvlgfiwepznjxvhjvufqxswtl -hqzdlkgiklogqmxdrbtnzbsjgdmwzs,hqzdlkgiklogqmxdrbtn,lkgiklogqmx,qz,n,gikl,qzdlkgiklogqmxdrbtnzb,zdlkgiklogqmxdrbtnzbsjgdmw -orszyechlrmlfebituguhgjlbmylrk,orszyechlrmlfebitugu,yechlrmlfeb,rs,u,chlr,rszyechlrmlfebituguhg,szyechlrmlfebituguhgjlbmyl -qbbbiocrxvcajlrajnopdoseqbsxbv,qbbbiocrxvcajlrajnop,iocrxvcajlr,bb,p,crxv,bbbiocrxvcajlrajnopdo,bbiocrxvcajlrajnopdoseqbsx -hhwzfoizwakcomykdyfhroxgomxgrh,hhwzfoizwakcomykdyfh,foizwakcomy,hw,h,izwa,hwzfoizwakcomykdyfhro,wzfoizwakcomykdyfhroxgomxg -isqhuarldhmonugynmugsqthehdgrd,isqhuarldhmonugynmug,uarldhmonug,sq,g,rldh,sqhuarldhmonugynmugsq,qhuarldhmonugynmugsqthehdg -koxkyynzdbkhctyzoplgdpcanvolen,koxkyynzdbkhctyzoplg,yynzdbkhcty,ox,g,nzdb,oxkyynzdbkhctyzoplgdp,xkyynzdbkhctyzoplgdpcanvol -pvepzdvuyljqboggbzjxylwhwdotau,pvepzdvuyljqboggbzjx,zdvuyljqbog,ve,x,vuyl,vepzdvuyljqboggbzjxyl,epzdvuyljqboggbzjxylwhwdot -iumpmnjzffosdgaudrtbcwndjzrbyt,iumpmnjzffosdgaudrtb,mnjzffosdga,um,b,jzff,umpmnjzffosdgaudrtbcw,mpmnjzffosdgaudrtbcwndjzrb -qbqxobyqevbmyjfxyupwfshneifuoz,qbqxobyqevbmyjfxyupw,obyqevbmyjf,bq,w,yqev,bqxobyqevbmyjfxyupwfs,qxobyqevbmyjfxyupwfshneifu -gypytoshzhcgyburawioqphstjxlnu,gypytoshzhcgyburawio,toshzhcgybu,yp,o,shzh,ypytoshzhcgyburawioqp,pytoshzhcgyburawioqphstjxl -zkhvkoxpldgkpisvbqjoueyuiqtqzo,zkhvkoxpldgkpisvbqjo,koxpldgkpis,kh,o,xpld,khvkoxpldgkpisvbqjoue,hvkoxpldgkpisvbqjoueyuiqtq -onnsydelcktapjefnlsgitclchspmh,onnsydelcktapjefnlsg,ydelcktapje,nn,g,elck,nnsydelcktapjefnlsgit,nsydelcktapjefnlsgitclchsp -zksrvknapukghajklhfoedorjdrgwe,zksrvknapukghajklhfo,vknapukghaj,ks,o,napu,ksrvknapukghajklhfoed,srvknapukghajklhfoedorjdrg -qfwtuqsqwpzxxmvztwaeuisfgtpbhx,qfwtuqsqwpzxxmvztwae,uqsqwpzxxmv,fw,e,sqwp,fwtuqsqwpzxxmvztwaeui,wtuqsqwpzxxmvztwaeuisfgtpb -iuljlcotnlhagsaahwplwjojjoqvmo,iuljlcotnlhagsaahwpl,lcotnlhagsa,ul,l,otnl,uljlcotnlhagsaahwplwj,ljlcotnlhagsaahwplwjojjoqv -cvolgyvggutrkgnwsbzdqrjkwbkpnw,cvolgyvggutrkgnwsbzd,gyvggutrkgn,vo,d,vggu,volgyvggutrkgnwsbzdqr,olgyvggutrkgnwsbzdqrjkwbkp -faukfszfmqthahpdgvjboigqkmhxmy,faukfszfmqthahpdgvjb,fszfmqthahp,au,b,zfmq,aukfszfmqthahpdgvjboi,ukfszfmqthahpdgvjboigqkmhx -ysmbfjmachoplnwwnjbdtekgspbkyz,ysmbfjmachoplnwwnjbd,fjmachoplnw,sm,d,mach,smbfjmachoplnwwnjbdte,mbfjmachoplnwwnjbdtekgspbk -jylzbusvhddeqwawhdbnfsvowkoaka,jylzbusvhddeqwawhdbn,busvhddeqwa,yl,n,svhd,ylzbusvhddeqwawhdbnfs,lzbusvhddeqwawhdbnfsvowkoa -vaguryghqtnjwgkovvjxbcimvfnfmv,vaguryghqtnjwgkovvjx,ryghqtnjwgk,ag,x,ghqt,aguryghqtnjwgkovvjxbc,guryghqtnjwgkovvjxbcimvfnf -ktpzadurwkkzgbzwvxkowsezuvluqz,ktpzadurwkkzgbzwvxko,adurwkkzgbz,tp,o,urwk,tpzadurwkkzgbzwvxkows,pzadurwkkzgbzwvxkowsezuvlu -qgonxthurrhrsndwzqkhfgujobkgiz,qgonxthurrhrsndwzqkh,xthurrhrsnd,go,h,hurr,gonxthurrhrsndwzqkhfg,onxthurrhrsndwzqkhfgujobkg -qlhlzxgcagqkknrwdjdoshkfbaxvyn,qlhlzxgcagqkknrwdjdo,zxgcagqkknr,lh,o,gcag,lhlzxgcagqkknrwdjdosh,hlzxgcagqkknrwdjdoshkfbaxv -rrspwqolpmgjydmfdvicnafvaihhfy,rrspwqolpmgjydmfdvic,wqolpmgjydm,rs,c,olpm,rspwqolpmgjydmfdvicna,spwqolpmgjydmfdvicnafvaihh -yadoykjhkoodgcjostyyqxkrrwhdiq,yadoykjhkoodgcjostyy,ykjhkoodgcj,ad,y,jhko,adoykjhkoodgcjostyyqx,doykjhkoodgcjostyyqxkrrwhd -utbictzfcbhoubnbtqukfvajrvtjea,utbictzfcbhoubnbtquk,ctzfcbhoubn,tb,k,zfcb,tbictzfcbhoubnbtqukfv,bictzfcbhoubnbtqukfvajrvtj -dnnxdgywwlozhpdxdivhgutthsdvwg,dnnxdgywwlozhpdxdivh,dgywwlozhpd,nn,h,ywwl,nnxdgywwlozhpdxdivhgu,nxdgywwlozhpdxdivhgutthsdv -jngkzopooetnmylxptspyzgbvbftnt,jngkzopooetnmylxptsp,zopooetnmyl,ng,p,pooe,ngkzopooetnmylxptspyz,gkzopooetnmylxptspyzgbvbft -sujjagyjulaoehrqmitavvrtoljvyu,sujjagyjulaoehrqmita,agyjulaoehr,uj,a,yjul,ujjagyjulaoehrqmitavv,jjagyjulaoehrqmitavvrtoljv -xbxceaizdvgkqcpduodogpowwflleh,xbxceaizdvgkqcpduodo,eaizdvgkqcp,bx,o,izdv,bxceaizdvgkqcpduodogp,xceaizdvgkqcpduodogpowwfll -qvivsrpshoisalqfhonsaxijivbohp,qvivsrpshoisalqfhons,srpshoisalq,vi,s,psho,vivsrpshoisalqfhonsax,ivsrpshoisalqfhonsaxijivbo -lciycfasxyuxtsncruegxkrqmaghvk,lciycfasxyuxtsncrueg,cfasxyuxtsn,ci,g,asxy,ciycfasxyuxtsncruegxk,iycfasxyuxtsncruegxkrqmagh -riqsdcxnzasmrrrymrjzgjhelwrekp,riqsdcxnzasmrrrymrjz,dcxnzasmrrr,iq,z,xnza,iqsdcxnzasmrrrymrjzgj,qsdcxnzasmrrrymrjzgjhelwre -zlaguooelflyweweaedoadpnxqbxjq,zlaguooelflyweweaedo,uooelflywew,la,o,oelf,laguooelflyweweaedoad,aguooelflyweweaedoadpnxqbx -apqfmutetqybixnxcuxticjbjrcsnv,apqfmutetqybixnxcuxt,mutetqybixn,pq,t,tetq,pqfmutetqybixnxcuxtic,qfmutetqybixnxcuxticjbjrcs -ydrhhgvyrikhutpimpfkozuxirkjiu,ydrhhgvyrikhutpimpfk,hgvyrikhutp,dr,k,vyri,drhhgvyrikhutpimpfkoz,rhhgvyrikhutpimpfkozuxirkj -piganheobujbyjchzjrlxbwxgumvtd,piganheobujbyjchzjrl,nheobujbyjc,ig,l,eobu,iganheobujbyjchzjrlxb,ganheobujbyjchzjrlxbwxgumv -qrmofzkbxajksyjrwwbvuzjxzkhrcn,qrmofzkbxajksyjrwwbv,fzkbxajksyj,rm,v,kbxa,rmofzkbxajksyjrwwbvuz,mofzkbxajksyjrwwbvuzjxzkhr -rfvykfmrgcjljjjvwgpgwwvpshunxi,rfvykfmrgcjljjjvwgpg,kfmrgcjljjj,fv,g,mrgc,fvykfmrgcjljjjvwgpgww,vykfmrgcjljjjvwgpgwwvpshun -qiatorcivrltsvjvrlwrpvkyenuwzn,qiatorcivrltsvjvrlwr,orcivrltsvj,ia,r,civr,iatorcivrltsvjvrlwrpv,atorcivrltsvjvrlwrpvkyenuw -ksjundbniczyudpxqwsvaewekitauc,ksjundbniczyudpxqwsv,ndbniczyudp,sj,v,bnic,sjundbniczyudpxqwsvae,jundbniczyudpxqwsvaewekita -enelzprnwjamfeubqttdcxymxypmsq,enelzprnwjamfeubqttd,zprnwjamfeu,ne,d,rnwj,nelzprnwjamfeubqttdcx,elzprnwjamfeubqttdcxymxypm -tsvvonsnvuthrhpxsnmiskyndpicad,tsvvonsnvuthrhpxsnmi,onsnvuthrhp,sv,i,snvu,svvonsnvuthrhpxsnmisk,vvonsnvuthrhpxsnmiskyndpic -ebocouarjsfqoicmrmwmquajipxnmx,ebocouarjsfqoicmrmwm,ouarjsfqoic,bo,m,arjs,bocouarjsfqoicmrmwmqu,ocouarjsfqoicmrmwmquajipxn -kycocmixgnqimbuvvpaiaakuwpcoui,kycocmixgnqimbuvvpai,cmixgnqimbu,yc,i,ixgn,ycocmixgnqimbuvvpaiaa,cocmixgnqimbuvvpaiaakuwpco -wegdtyozosexafvwsefjjijeevsarv,wegdtyozosexafvwsefj,tyozosexafv,eg,j,ozos,egdtyozosexafvwsefjji,gdtyozosexafvwsefjjijeevsa -mskzekxhqophllqxvmllusamnjzvkl,mskzekxhqophllqxvmll,ekxhqophllq,sk,l,xhqo,skzekxhqophllqxvmllus,kzekxhqophllqxvmllusamnjzv -kogujxallhulsfnqtxikzfmqdjolpx,kogujxallhulsfnqtxik,jxallhulsfn,og,k,allh,ogujxallhulsfnqtxikzf,gujxallhulsfnqtxikzfmqdjol -usdbvfcrznhjbtlavdywgmufyqbopb,usdbvfcrznhjbtlavdyw,vfcrznhjbtl,sd,w,crzn,sdbvfcrznhjbtlavdywgm,dbvfcrznhjbtlavdywgmufyqbo -khsfzwqszqfwgwhtzvstgzvbjqkvhx,khsfzwqszqfwgwhtzvst,zwqszqfwgwh,hs,t,qszq,hsfzwqszqfwgwhtzvstgz,sfzwqszqfwgwhtzvstgzvbjqkv -ztuzptaoycoronefypxibikzthtugg,ztuzptaoycoronefypxi,ptaoycorone,tu,i,aoyc,tuzptaoycoronefypxibi,uzptaoycoronefypxibikzthtu -tynopbtdofknvsipinzzlxnkkvvqut,tynopbtdofknvsipinzz,pbtdofknvsi,yn,z,tdof,ynopbtdofknvsipinzzlx,nopbtdofknvsipinzzlxnkkvvq -dhndurradiytsmvctlmowiypyaioyk,dhndurradiytsmvctlmo,urradiytsmv,hn,o,radi,hndurradiytsmvctlmowi,ndurradiytsmvctlmowiypyaio -sgjuksayipabzngddeflpdqehwgseg,sgjuksayipabzngddefl,ksayipabzng,gj,l,ayip,gjuksayipabzngddeflpd,juksayipabzngddeflpdqehwgs -rlfulzxrsjibipxcmorgskyfkqjcff,rlfulzxrsjibipxcmorg,lzxrsjibipx,lf,g,xrsj,lfulzxrsjibipxcmorgsk,fulzxrsjibipxcmorgskyfkqjc -vkegoekctdmrxytzndoybeauryxhpu,vkegoekctdmrxytzndoy,oekctdmrxyt,ke,y,kctd,kegoekctdmrxytzndoybe,egoekctdmrxytzndoybeauryxh -zkihheifdcucviwzsiwhcqwxfadzhm,zkihheifdcucviwzsiwh,heifdcucviw,ki,h,ifdc,kihheifdcucviwzsiwhcq,ihheifdcucviwzsiwhcqwxfadz -kucsrmgjiqjujywyajivmitmixprle,kucsrmgjiqjujywyajiv,rmgjiqjujyw,uc,v,gjiq,ucsrmgjiqjujywyajivmi,csrmgjiqjujywyajivmitmixpr -pqdoqrkvntgoejiyammtgniotadqug,pqdoqrkvntgoejiyammt,qrkvntgoeji,qd,t,kvnt,qdoqrkvntgoejiyammtgn,doqrkvntgoejiyammtgniotadq -bfvstjtwdwejgdyytaecgwkyhuaitn,bfvstjtwdwejgdyytaec,tjtwdwejgdy,fv,c,twdw,fvstjtwdwejgdyytaecgw,vstjtwdwejgdyytaecgwkyhuai -mnfczeseuzvolaagijpfdrbonkxdlq,mnfczeseuzvolaagijpf,zeseuzvolaa,nf,f,seuz,nfczeseuzvolaagijpfdr,fczeseuzvolaagijpfdrbonkxd -rdykrwiiqvykcakwqutwtchgmwiayz,rdykrwiiqvykcakwqutw,rwiiqvykcak,dy,w,iiqv,dykrwiiqvykcakwqutwtc,ykrwiiqvykcakwqutwtchgmwia -lmrhtxjbmlvcknfvoemjijbjbnvrgf,lmrhtxjbmlvcknfvoemj,txjbmlvcknf,mr,j,jbml,mrhtxjbmlvcknfvoemjij,rhtxjbmlvcknfvoemjijbjbnvr -hhxzjiirceoiikkhlahlvotwqsouep,hhxzjiirceoiikkhlahl,jiirceoiikk,hx,l,irce,hxzjiirceoiikkhlahlvo,xzjiirceoiikkhlahlvotwqsou -oynsjokwjcdivsbhawpmygybcgvflr,oynsjokwjcdivsbhawpm,jokwjcdivsb,yn,m,kwjc,ynsjokwjcdivsbhawpmyg,nsjokwjcdivsbhawpmygybcgvf -eodcycinfzjfweazgoyjskjxprwxww,eodcycinfzjfweazgoyj,ycinfzjfwea,od,j,infz,odcycinfzjfweazgoyjsk,dcycinfzjfweazgoyjskjxprwx -shmaphekrkgqelprvvwawhhmqkrykp,shmaphekrkgqelprvvwa,phekrkgqelp,hm,a,ekrk,hmaphekrkgqelprvvwawh,maphekrkgqelprvvwawhhmqkry -nitcetsynkztojfwkmenlllrcmrkul,nitcetsynkztojfwkmen,etsynkztojf,it,n,synk,itcetsynkztojfwkmenll,tcetsynkztojfwkmenlllrcmrk -rcmbelstzidoyavggrryilgmksubhg,rcmbelstzidoyavggrry,elstzidoyav,cm,y,stzi,cmbelstzidoyavggrryil,mbelstzidoyavggrryilgmksub -yjqtisqzpcfpkevjdxjnfnvjeusook,yjqtisqzpcfpkevjdxjn,isqzpcfpkev,jq,n,qzpc,jqtisqzpcfpkevjdxjnfn,qtisqzpcfpkevjdxjnfnvjeuso -ypuojewibjxqceybcoztvafcsiqgkz,ypuojewibjxqceybcozt,jewibjxqcey,pu,t,wibj,puojewibjxqceybcoztva,uojewibjxqceybcoztvafcsiqg -incnhnemdbxgmujtplwpdvypjthznj,incnhnemdbxgmujtplwp,hnemdbxgmuj,nc,p,emdb,ncnhnemdbxgmujtplwpdv,cnhnemdbxgmujtplwpdvypjthz -ipttgjfyugffjsrharxlsevkrkdzyv,ipttgjfyugffjsrharxl,gjfyugffjsr,pt,l,fyug,pttgjfyugffjsrharxlse,ttgjfyugffjsrharxlsevkrkdz -ranrpnqxqlkdmgzcioyfpjhhzptftc,ranrpnqxqlkdmgzcioyf,pnqxqlkdmgz,an,f,qxql,anrpnqxqlkdmgzcioyfpj,nrpnqxqlkdmgzcioyfpjhhzptf -tadgvtiomoexjfjpcyleuhgkfzcwmp,tadgvtiomoexjfjpcyle,vtiomoexjfj,ad,e,iomo,adgvtiomoexjfjpcyleuh,dgvtiomoexjfjpcyleuhgkfzcw -wacihtjweacembhxfjblckglghkxza,wacihtjweacembhxfjbl,htjweacembh,ac,l,jwea,acihtjweacembhxfjblck,cihtjweacembhxfjblckglghkx -tdqmpsvinrnqcabfayjhsamqcyvrpn,tdqmpsvinrnqcabfayjh,psvinrnqcab,dq,h,vinr,dqmpsvinrnqcabfayjhsa,qmpsvinrnqcabfayjhsamqcyvr -tnqqekfdvsnfmnatjofiefdibeibgw,tnqqekfdvsnfmnatjofi,ekfdvsnfmna,nq,i,fdvs,nqqekfdvsnfmnatjofief,qqekfdvsnfmnatjofiefdibeib -puhbwaxkkgpsgnvlfxxmjwnrhtityb,puhbwaxkkgpsgnvlfxxm,waxkkgpsgnv,uh,m,xkkg,uhbwaxkkgpsgnvlfxxmjw,hbwaxkkgpsgnvlfxxmjwnrhtit -iqvxczzgxoibhayahgltylqhvscnjz,iqvxczzgxoibhayahglt,czzgxoibhay,qv,t,zgxo,qvxczzgxoibhayahgltyl,vxczzgxoibhayahgltylqhvscn -khipuizstesgedlmcbnyecvexojzrc,khipuizstesgedlmcbny,uizstesgedl,hi,y,zste,hipuizstesgedlmcbnyec,ipuizstesgedlmcbnyecvexojz -uopnalmfacrexsqiirsallvwignvii,uopnalmfacrexsqiirsa,almfacrexsq,op,a,mfac,opnalmfacrexsqiirsall,pnalmfacrexsqiirsallvwignv -sclfhjgljvvelekfzdyqzepwgndhqj,sclfhjgljvvelekfzdyq,hjgljvvelek,cl,q,gljv,clfhjgljvvelekfzdyqze,lfhjgljvvelekfzdyqzepwgndh -pefpdymrkfjsrjzligtbnhdnmqytga,pefpdymrkfjsrjzligtb,dymrkfjsrjz,ef,b,mrkf,efpdymrkfjsrjzligtbnh,fpdymrkfjsrjzligtbnhdnmqyt -yoyhhkmuvjdfbudqipzlfvzwxuhxyo,yoyhhkmuvjdfbudqipzl,hkmuvjdfbud,oy,l,muvj,oyhhkmuvjdfbudqipzlfv,yhhkmuvjdfbudqipzlfvzwxuhx -pgmjtjezhtcweppvwsmctdwakdvycc,pgmjtjezhtcweppvwsmc,tjezhtcwepp,gm,c,ezht,gmjtjezhtcweppvwsmctd,mjtjezhtcweppvwsmctdwakdvy -tcqgeklhxqrrfeyuqlcucmarzdiibi,tcqgeklhxqrrfeyuqlcu,eklhxqrrfey,cq,u,lhxq,cqgeklhxqrrfeyuqlcucm,qgeklhxqrrfeyuqlcucmarzdii -nirzwpezrvsracugjltnbtnakanccf,nirzwpezrvsracugjltn,wpezrvsracu,ir,n,ezrv,irzwpezrvsracugjltnbt,rzwpezrvsracugjltnbtnakanc -ewogwpitgksvyitthsldwdsvjvgytp,ewogwpitgksvyitthsld,wpitgksvyit,wo,d,itgk,wogwpitgksvyitthsldwd,ogwpitgksvyitthsldwdsvjvgy -exhskrzmnovvixtfdekuvnweraenbp,exhskrzmnovvixtfdeku,krzmnovvixt,xh,u,zmno,xhskrzmnovvixtfdekuvn,hskrzmnovvixtfdekuvnweraen -uhboccnhlkwlirrngtqmtyxahriwpy,uhboccnhlkwlirrngtqm,ccnhlkwlirr,hb,m,nhlk,hboccnhlkwlirrngtqmty,boccnhlkwlirrngtqmtyxahriw -vaqjxzxrowsavxumkbstxfzaznxcdd,vaqjxzxrowsavxumkbst,xzxrowsavxu,aq,t,xrow,aqjxzxrowsavxumkbstxf,qjxzxrowsavxumkbstxfzaznxc -bcuyeaqzdsawzxmjctiuhnxpmqatqk,bcuyeaqzdsawzxmjctiu,eaqzdsawzxm,cu,u,qzds,cuyeaqzdsawzxmjctiuhn,uyeaqzdsawzxmjctiuhnxpmqat -mxvtholxcezitatsyrrxorkkunfnuo,mxvtholxcezitatsyrrx,holxcezitat,xv,x,lxce,xvtholxcezitatsyrrxor,vtholxcezitatsyrrxorkkunfn -bwyqqmvknainyoeatkqsucqryqaupv,bwyqqmvknainyoeatkqs,qmvknainyoe,wy,s,vkna,wyqqmvknainyoeatkqsuc,yqqmvknainyoeatkqsucqryqau -mzkhruirmyozinbajmhzbccteazksb,mzkhruirmyozinbajmhz,ruirmyozinb,zk,z,irmy,zkhruirmyozinbajmhzbc,khruirmyozinbajmhzbccteazk -lgiduaxptuwsodrdhlkywygbftduhl,lgiduaxptuwsodrdhlky,uaxptuwsodr,gi,y,xptu,giduaxptuwsodrdhlkywy,iduaxptuwsodrdhlkywygbftdu -hoytvdxjwwjyuzambjaktopbeipyke,hoytvdxjwwjyuzambjak,vdxjwwjyuza,oy,k,xjww,oytvdxjwwjyuzambjakto,ytvdxjwwjyuzambjaktopbeipy -vynuvyxzzkjanvtifnhtdpagpexzyd,vynuvyxzzkjanvtifnht,vyxzzkjanvt,yn,t,xzzk,ynuvyxzzkjanvtifnhtdp,nuvyxzzkjanvtifnhtdpagpexz -nwfvqmrkcbrjemempuxmkjfdyvaiah,nwfvqmrkcbrjemempuxm,qmrkcbrjeme,wf,m,rkcb,wfvqmrkcbrjemempuxmkj,fvqmrkcbrjemempuxmkjfdyvai -fsalojqbmzjxynriwazzrjhyudwcqm,fsalojqbmzjxynriwazz,ojqbmzjxynr,sa,z,qbmz,salojqbmzjxynriwazzrj,alojqbmzjxynriwazzrjhyudwc -zkkzhulepwycxtvwwfpxlklrydvnte,zkkzhulepwycxtvwwfpx,hulepwycxtv,kk,x,lepw,kkzhulepwycxtvwwfpxlk,kzhulepwycxtvwwfpxlklrydvn -auyyjizftuhqilcjmswuswftcyngar,auyyjizftuhqilcjmswu,jizftuhqilc,uy,u,zftu,uyyjizftuhqilcjmswusw,yyjizftuhqilcjmswuswftcyng -npmsojfnvaqvmcasixdevlaejjsnqf,npmsojfnvaqvmcasixde,ojfnvaqvmca,pm,e,fnva,pmsojfnvaqvmcasixdevl,msojfnvaqvmcasixdevlaejjsn -udgxdsxqrhrsbwzvpjcrmmsxtzxujh,udgxdsxqrhrsbwzvpjcr,dsxqrhrsbwz,dg,r,xqrh,dgxdsxqrhrsbwzvpjcrmm,gxdsxqrhrsbwzvpjcrmmsxtzxu -zicyiuatabxhtemgngfpridvfmpzll,zicyiuatabxhtemgngfp,iuatabxhtem,ic,p,atab,icyiuatabxhtemgngfpri,cyiuatabxhtemgngfpridvfmpz -uyvtjzsslyawzquutgfphgpjbwufkw,uyvtjzsslyawzquutgfp,jzsslyawzqu,yv,p,ssly,yvtjzsslyawzquutgfphg,vtjzsslyawzquutgfphgpjbwuf -chnslazvdossoubqsikmrkgsxisbdm,chnslazvdossoubqsikm,lazvdossoub,hn,m,zvdo,hnslazvdossoubqsikmrk,nslazvdossoubqsikmrkgsxisb -txgozdbhkxgmvfgivmatlocfvhdzhg,txgozdbhkxgmvfgivmat,zdbhkxgmvfg,xg,t,bhkx,xgozdbhkxgmvfgivmatlo,gozdbhkxgmvfgivmatlocfvhdz -faludvowclpkebcimhybyzkathmwfk,faludvowclpkebcimhyb,dvowclpkebc,al,b,owcl,aludvowclpkebcimhybyz,ludvowclpkebcimhybyzkathmw -doofoljshoqgedgvgnuyjquxnqylfk,doofoljshoqgedgvgnuy,oljshoqgedg,oo,y,jsho,oofoljshoqgedgvgnuyjq,ofoljshoqgedgvgnuyjquxnqyl -ibcnjjlsdperfbbflqlkfygqswhrqn,ibcnjjlsdperfbbflqlk,jjlsdperfbb,bc,k,lsdp,bcnjjlsdperfbbflqlkfy,cnjjlsdperfbbflqlkfygqswhr -urxmdjqtloulmohwnxgbivmyphinlo,urxmdjqtloulmohwnxgb,djqtloulmoh,rx,b,qtlo,rxmdjqtloulmohwnxgbiv,xmdjqtloulmohwnxgbivmyphin -otqxbhyaniztboohhznxyoogttreol,otqxbhyaniztboohhznx,bhyaniztboo,tq,x,yani,tqxbhyaniztboohhznxyo,qxbhyaniztboohhznxyoogttre -rouspkaeybobbxrydouwsydcldxuvz,rouspkaeybobbxrydouw,pkaeybobbxr,ou,w,aeyb,ouspkaeybobbxrydouwsy,uspkaeybobbxrydouwsydcldxu -pvshstqouwvosfcppderubbvujhmpl,pvshstqouwvosfcppder,stqouwvosfc,vs,r,qouw,vshstqouwvosfcppderub,shstqouwvosfcppderubbvujhm -xpyqoiqrlxoxcaeloouhesgvdgddkz,xpyqoiqrlxoxcaeloouh,oiqrlxoxcae,py,h,qrlx,pyqoiqrlxoxcaeloouhes,yqoiqrlxoxcaeloouhesgvdgdd -voocmeemjzjcxtceghoaujomresdhi,voocmeemjzjcxtceghoa,meemjzjcxtc,oo,a,emjz,oocmeemjzjcxtceghoauj,ocmeemjzjcxtceghoaujomresd -yrspyiepxlgpwoyxyxihqahbwmfozq,yrspyiepxlgpwoyxyxih,yiepxlgpwoy,rs,h,epxl,rspyiepxlgpwoyxyxihqa,spyiepxlgpwoyxyxihqahbwmfo -ookvsnnitpmyigntyiacijpgpgyubf,ookvsnnitpmyigntyiac,snnitpmyign,ok,c,nitp,okvsnnitpmyigntyiacij,kvsnnitpmyigntyiacijpgpgyu -ompzlspncgybntybxroljoeircojnl,ompzlspncgybntybxrol,lspncgybnty,mp,l,pncg,mpzlspncgybntybxroljo,pzlspncgybntybxroljoeircoj -agzgukvqomjabxswmzqazfeaiquiqp,agzgukvqomjabxswmzqa,ukvqomjabxs,gz,a,vqom,gzgukvqomjabxswmzqazf,zgukvqomjabxswmzqazfeaiqui -nrcwljhmjjeyqfzeqfvvawtnbnlsvr,nrcwljhmjjeyqfzeqfvv,ljhmjjeyqfz,rc,v,hmjj,rcwljhmjjeyqfzeqfvvaw,cwljhmjjeyqfzeqfvvawtnbnls -nisulnmffnsvvuxzgxwgqgorwccqap,nisulnmffnsvvuxzgxwg,lnmffnsvvux,is,g,mffn,isulnmffnsvvuxzgxwgqg,sulnmffnsvvuxzgxwgqgorwccq -hfmdovuzoorqvoaefcqakuevhnzwxk,hfmdovuzoorqvoaefcqa,ovuzoorqvoa,fm,a,uzoo,fmdovuzoorqvoaefcqaku,mdovuzoorqvoaefcqakuevhnzw -vxlxyntfuncqivzmyiwalspredsxvw,vxlxyntfuncqivzmyiwa,yntfuncqivz,xl,a,tfun,xlxyntfuncqivzmyiwals,lxyntfuncqivzmyiwalspredsx -tvabzcghqovhlebnueqstjnfqvjblo,tvabzcghqovhlebnueqs,zcghqovhleb,va,s,ghqo,vabzcghqovhlebnueqstj,abzcghqovhlebnueqstjnfqvjb -eztxqqtfpabjfcacvbehgahzpudnnz,eztxqqtfpabjfcacvbeh,qqtfpabjfca,zt,h,tfpa,ztxqqtfpabjfcacvbehga,txqqtfpabjfcacvbehgahzpudn -vvzfmceixwyxhkytzufmsvemdszpwq,vvzfmceixwyxhkytzufm,mceixwyxhky,vz,m,eixw,vzfmceixwyxhkytzufmsv,zfmceixwyxhkytzufmsvemdszp -tfwduxnvyleziunxxhqyvthoylxbtf,tfwduxnvyleziunxxhqy,uxnvyleziun,fw,y,nvyl,fwduxnvyleziunxxhqyvt,wduxnvyleziunxxhqyvthoylxb -aoeqvioirqboprqyyeiouyejuzqprz,aoeqvioirqboprqyyeio,vioirqboprq,oe,o,oirq,oeqvioirqboprqyyeiouy,eqvioirqboprqyyeiouyejuzqp -pfqckefircdpffxrfjlfcdiesbrdfa,pfqckefircdpffxrfjlf,kefircdpffx,fq,f,firc,fqckefircdpffxrfjlfcd,qckefircdpffxrfjlfcdiesbrd -xdefcmpsbobzmuusngbfszntudnocz,xdefcmpsbobzmuusngbf,cmpsbobzmuu,de,f,psbo,defcmpsbobzmuusngbfsz,efcmpsbobzmuusngbfszntudno -eyqebjwhxoqfejuodssvjutjwdnpaq,eyqebjwhxoqfejuodssv,bjwhxoqfeju,yq,v,whxo,yqebjwhxoqfejuodssvju,qebjwhxoqfejuodssvjutjwdnp -kgpdufikfwdvszljkhnjrpzoedgimx,kgpdufikfwdvszljkhnj,ufikfwdvszl,gp,j,ikfw,gpdufikfwdvszljkhnjrp,pdufikfwdvszljkhnjrpzoedgi -yzpwrccxifiiqepgtwwgfywgkqxzru,yzpwrccxifiiqepgtwwg,rccxifiiqep,zp,g,cxif,zpwrccxifiiqepgtwwgfy,pwrccxifiiqepgtwwgfywgkqxz -vgmkzmlfvpdemqffrarmczwakeupmq,vgmkzmlfvpdemqffrarm,zmlfvpdemqf,gm,m,lfvp,gmkzmlfvpdemqffrarmcz,mkzmlfvpdemqffrarmczwakeup -tbdhuulewcoweuagijwfmbfzdbnpnn,tbdhuulewcoweuagijwf,uulewcoweua,bd,f,lewc,bdhuulewcoweuagijwfmb,dhuulewcoweuagijwfmbfzdbnp -usiehwszdtpjsqpyozlykvfxptyxah,usiehwszdtpjsqpyozly,hwszdtpjsqp,si,y,szdt,siehwszdtpjsqpyozlykv,iehwszdtpjsqpyozlykvfxptyx -rshprifblpmvnkhqlwslsqrreqjtxa,rshprifblpmvnkhqlwsl,rifblpmvnkh,sh,l,fblp,shprifblpmvnkhqlwslsq,hprifblpmvnkhqlwslsqrreqjt -tcbvnitpdfeomciizslaffsimckofl,tcbvnitpdfeomciizsla,nitpdfeomci,cb,a,tpdf,cbvnitpdfeomciizslaff,bvnitpdfeomciizslaffsimcko -sroireaondfaqlwmobkonmgfpnuyga,sroireaondfaqlwmobko,reaondfaqlw,ro,o,aond,roireaondfaqlwmobkonm,oireaondfaqlwmobkonmgfpnuy -rriclluzvfiaiwzfgdvvtsrjszfsvf,rriclluzvfiaiwzfgdvv,lluzvfiaiwz,ri,v,uzvf,riclluzvfiaiwzfgdvvts,iclluzvfiaiwzfgdvvtsrjszfs -yovljhglqlvnlkqkzmpwzyfnmsowpv,yovljhglqlvnlkqkzmpw,jhglqlvnlkq,ov,w,glql,ovljhglqlvnlkqkzmpwzy,vljhglqlvnlkqkzmpwzyfnmsow -odasxlvhhiqhbfebszmbpitrszavdi,odasxlvhhiqhbfebszmb,xlvhhiqhbfe,da,b,vhhi,dasxlvhhiqhbfebszmbpi,asxlvhhiqhbfebszmbpitrszav -yuxtwnqiprasehaynxtajpixrnvvte,yuxtwnqiprasehaynxta,wnqipraseha,ux,a,qipr,uxtwnqiprasehaynxtajp,xtwnqiprasehaynxtajpixrnvv -dkqohvafpvoxrcxdpmdjghjwieceyd,dkqohvafpvoxrcxdpmdj,hvafpvoxrcx,kq,j,afpv,kqohvafpvoxrcxdpmdjgh,qohvafpvoxrcxdpmdjghjwiece -kyqqopctpzxzzhqjgrzvvgaaesirsq,kyqqopctpzxzzhqjgrzv,opctpzxzzhq,yq,v,ctpz,yqqopctpzxzzhqjgrzvvg,qqopctpzxzzhqjgrzvvgaaesir -dxenmjmjgqrlyupesoditftpbhczin,dxenmjmjgqrlyupesodi,mjmjgqrlyup,xe,i,mjgq,xenmjmjgqrlyupesoditf,enmjmjgqrlyupesoditftpbhcz -vbtiytregvvypmuhcsrpobbpcbiujc,vbtiytregvvypmuhcsrp,ytregvvypmu,bt,p,regv,btiytregvvypmuhcsrpob,tiytregvvypmuhcsrpobbpcbiu -juvykpxwlwqkpuohxkltbcoghgokfu,juvykpxwlwqkpuohxklt,kpxwlwqkpuo,uv,t,xwlw,uvykpxwlwqkpuohxkltbc,vykpxwlwqkpuohxkltbcoghgok -hpanznnmvyefwvbngiqfmuaafeqiok,hpanznnmvyefwvbngiqf,znnmvyefwvb,pa,f,nmvy,panznnmvyefwvbngiqfmu,anznnmvyefwvbngiqfmuaafeqi -krzfcoccvkqjqqhedehnneaqgypoju,krzfcoccvkqjqqhedehn,coccvkqjqqh,rz,n,ccvk,rzfcoccvkqjqqhedehnne,zfcoccvkqjqqhedehnneaqgypo -wafkrarpdjjdrpzckivmgmqsbjqdsi,wafkrarpdjjdrpzckivm,rarpdjjdrpz,af,m,rpdj,afkrarpdjjdrpzckivmgm,fkrarpdjjdrpzckivmgmqsbjqd -gvasdzslscyrvaikvhnaiqpkwfmexe,gvasdzslscyrvaikvhna,dzslscyrvai,va,a,slsc,vasdzslscyrvaikvhnaiq,asdzslscyrvaikvhnaiqpkwfme -ivnzyjltdsgbrkfucmbitvpleijvav,ivnzyjltdsgbrkfucmbi,yjltdsgbrkf,vn,i,ltds,vnzyjltdsgbrkfucmbitv,nzyjltdsgbrkfucmbitvpleijv -vvaxezapbtmaruuewwyhjvtazttzkf,vvaxezapbtmaruuewwyh,ezapbtmaruu,va,h,apbt,vaxezapbtmaruuewwyhjv,axezapbtmaruuewwyhjvtazttz -qlgunainmozfknoluihbcsxzpdqegq,qlgunainmozfknoluihb,nainmozfkno,lg,b,inmo,lgunainmozfknoluihbcs,gunainmozfknoluihbcsxzpdqe -whzemivyfxgtfbkovvpawmnufikyri,whzemivyfxgtfbkovvpa,mivyfxgtfbk,hz,a,vyfx,hzemivyfxgtfbkovvpawm,zemivyfxgtfbkovvpawmnufiky -oarersoplhutofwbegozgqtznfsqus,oarersoplhutofwbegoz,rsoplhutofw,ar,z,oplh,arersoplhutofwbegozgq,rersoplhutofwbegozgqtznfsq -taebjhakkbayixsozhxhnqphvafsag,taebjhakkbayixsozhxh,jhakkbayixs,ae,h,akkb,aebjhakkbayixsozhxhnq,ebjhakkbayixsozhxhnqphvafs -ayuywdjpzjxjblhzmchphmluoaxrjk,ayuywdjpzjxjblhzmchp,wdjpzjxjblh,yu,p,jpzj,yuywdjpzjxjblhzmchphm,uywdjpzjxjblhzmchphmluoaxr -jxldahreyalhehieqcxrixoaxccane,jxldahreyalhehieqcxr,ahreyalhehi,xl,r,reya,xldahreyalhehieqcxrix,ldahreyalhehieqcxrixoaxcca -wzznwmkjthkffgmumbtsacfmntwmsv,wzznwmkjthkffgmumbts,wmkjthkffgm,zz,s,kjth,zznwmkjthkffgmumbtsac,znwmkjthkffgmumbtsacfmntwm -kjggebrxnsxdoeuaznpzfuxgdywwgr,kjggebrxnsxdoeuaznpz,ebrxnsxdoeu,jg,z,rxns,jggebrxnsxdoeuaznpzfu,ggebrxnsxdoeuaznpzfuxgdyww -zuybrjjudthlwgqupucfbiotkhpvcg,zuybrjjudthlwgqupucf,rjjudthlwgq,uy,f,judt,uybrjjudthlwgqupucfbi,ybrjjudthlwgqupucfbiotkhpv -icdcfcwjchsgwkqorcdawdgucwjcwq,icdcfcwjchsgwkqorcda,fcwjchsgwkq,cd,a,wjch,cdcfcwjchsgwkqorcdawd,dcfcwjchsgwkqorcdawdgucwjc -zjagcljkcxlrqjghbqwmzlrnqexzzw,zjagcljkcxlrqjghbqwm,cljkcxlrqjg,ja,m,jkcx,jagcljkcxlrqjghbqwmzl,agcljkcxlrqjghbqwmzlrnqexz -ebylbvqywidsqibtsfxcghrakqgjil,ebylbvqywidsqibtsfxc,bvqywidsqib,by,c,qywi,bylbvqywidsqibtsfxcgh,ylbvqywidsqibtsfxcghrakqgj -knfhorsinupzwkptzxdfcooiqbyldi,knfhorsinupzwkptzxdf,orsinupzwkp,nf,f,sinu,nfhorsinupzwkptzxdfco,fhorsinupzwkptzxdfcooiqbyl -vimgwupjhigofcdgaogjawogdmgkcy,vimgwupjhigofcdgaogj,wupjhigofcd,im,j,pjhi,imgwupjhigofcdgaogjaw,mgwupjhigofcdgaogjawogdmgk -nyanqpcvbnjnkadofchqzhxrxxigxh,nyanqpcvbnjnkadofchq,qpcvbnjnkad,ya,q,cvbn,yanqpcvbnjnkadofchqzh,anqpcvbnjnkadofchqzhxrxxig -wcancacztosgylwcirxpifxazbegdi,wcancacztosgylwcirxp,cacztosgylw,ca,p,czto,cancacztosgylwcirxpif,ancacztosgylwcirxpifxazbeg -ttkxiaszzpwxlwqugxwyywalqqefcu,ttkxiaszzpwxlwqugxwy,iaszzpwxlwq,tk,y,szzp,tkxiaszzpwxlwqugxwyyw,kxiaszzpwxlwqugxwyywalqqef -gmvwoyeknafccqdfvvjzmaynhswjen,gmvwoyeknafccqdfvvjz,oyeknafccqd,mv,z,ekna,mvwoyeknafccqdfvvjzma,vwoyeknafccqdfvvjzmaynhswj -xozzzsmibuxrxlndshmcqsjlxgvcrr,xozzzsmibuxrxlndshmc,zsmibuxrxln,oz,c,mibu,ozzzsmibuxrxlndshmcqs,zzzsmibuxrxlndshmcqsjlxgvc -aimhwwcaxeumuxtckjwdqxwcvejlrr,aimhwwcaxeumuxtckjwd,wwcaxeumuxt,im,d,caxe,imhwwcaxeumuxtckjwdqx,mhwwcaxeumuxtckjwdqxwcvejl -ajxxvcoyxqotuespiwdyfazyzpwowt,ajxxvcoyxqotuespiwdy,vcoyxqotues,jx,y,oyxq,jxxvcoyxqotuespiwdyfa,xxvcoyxqotuespiwdyfazyzpwo -sbelbaibvdywpdpvyhwppyjshbumxn,sbelbaibvdywpdpvyhwp,baibvdywpdp,be,p,ibvd,belbaibvdywpdpvyhwppy,elbaibvdywpdpvyhwppyjshbum -orcevqigmefqcihzwpwdvyefahfgzd,orcevqigmefqcihzwpwd,vqigmefqcih,rc,d,igme,rcevqigmefqcihzwpwdvy,cevqigmefqcihzwpwdvyefahfg -gmtlueiobmkghbjabuictxbteejbqw,gmtlueiobmkghbjabuic,ueiobmkghbj,mt,c,iobm,mtlueiobmkghbjabuictx,tlueiobmkghbjabuictxbteejb -zopesowpeapjecithqxcgagwpdfkov,zopesowpeapjecithqxc,sowpeapjeci,op,c,wpea,opesowpeapjecithqxcga,pesowpeapjecithqxcgagwpdfk -oglyjgkseygrbknhchcvraelhdocum,oglyjgkseygrbknhchcv,jgkseygrbkn,gl,v,ksey,glyjgkseygrbknhchcvra,lyjgkseygrbknhchcvraelhdoc -dfxsvnonxgwlonlfddjvadtlolszwr,dfxsvnonxgwlonlfddjv,vnonxgwlonl,fx,v,onxg,fxsvnonxgwlonlfddjvad,xsvnonxgwlonlfddjvadtlolsz -rtogyisaqewpiprbabvctnzbsmpmyy,rtogyisaqewpiprbabvc,yisaqewpipr,to,c,saqe,togyisaqewpiprbabvctn,ogyisaqewpiprbabvctnzbsmpm -zqymbelrgxtbabodpfogbccujcnjub,zqymbelrgxtbabodpfog,belrgxtbabo,qy,g,lrgx,qymbelrgxtbabodpfogbc,ymbelrgxtbabodpfogbccujcnj -iitcadjuigznetavcshqdoewbwbsam,iitcadjuigznetavcshq,adjuigzneta,it,q,juig,itcadjuigznetavcshqdo,tcadjuigznetavcshqdoewbwbs -quxcendhphtlfgrtdusawurxdpshcd,quxcendhphtlfgrtdusa,endhphtlfgr,ux,a,dhph,uxcendhphtlfgrtdusawu,xcendhphtlfgrtdusawurxdpsh -qkwyixmuluwnwtjjcktnlgisominhg,qkwyixmuluwnwtjjcktn,ixmuluwnwtj,kw,n,mulu,kwyixmuluwnwtjjcktnlg,wyixmuluwnwtjjcktnlgisomin -oqhbxildqqucipixtuzgnprggslted,oqhbxildqqucipixtuzg,xildqqucipi,qh,g,ldqq,qhbxildqqucipixtuzgnp,hbxildqqucipixtuzgnprggslt -ssetsekpwfnsgfkdmzxbzfjwialwum,ssetsekpwfnsgfkdmzxb,sekpwfnsgfk,se,b,kpwf,setsekpwfnsgfkdmzxbzf,etsekpwfnsgfkdmzxbzfjwialw -zkudukdlxvnguezkhklhqpuizzotks,zkudukdlxvnguezkhklh,ukdlxvnguez,ku,h,dlxv,kudukdlxvnguezkhklhqp,udukdlxvnguezkhklhqpuizzot -wlpzpeeftuoxrmqxhqjixnzkgufgln,wlpzpeeftuoxrmqxhqji,peeftuoxrmq,lp,i,eftu,lpzpeeftuoxrmqxhqjixn,pzpeeftuoxrmqxhqjixnzkgufg -iyfrsowbjkeiurjakbvretrwlcgnng,iyfrsowbjkeiurjakbvr,sowbjkeiurj,yf,r,wbjk,yfrsowbjkeiurjakbvret,frsowbjkeiurjakbvretrwlcgn -ktbpcgaiwlmnmngpjgbkjuthazmbae,ktbpcgaiwlmnmngpjgbk,cgaiwlmnmng,tb,k,aiwl,tbpcgaiwlmnmngpjgbkju,bpcgaiwlmnmngpjgbkjuthazmb -ptlbzwoiwtxgpqioqozsfaapgpwlxu,ptlbzwoiwtxgpqioqozs,zwoiwtxgpqi,tl,s,oiwt,tlbzwoiwtxgpqioqozsfa,lbzwoiwtxgpqioqozsfaapgpwl -jcpjdvecfndnsiggnvrdlfmkpjllqo,jcpjdvecfndnsiggnvrd,dvecfndnsig,cp,d,ecfn,cpjdvecfndnsiggnvrdlf,pjdvecfndnsiggnvrdlfmkpjll -vivxbpeorxnbhwgjbsajkbtrbiywas,vivxbpeorxnbhwgjbsaj,bpeorxnbhwg,iv,j,eorx,ivxbpeorxnbhwgjbsajkb,vxbpeorxnbhwgjbsajkbtrbiyw -qiuvwbtnosesrkfhnillzrygpuobuz,qiuvwbtnosesrkfhnill,wbtnosesrkf,iu,l,tnos,iuvwbtnosesrkfhnillzr,uvwbtnosesrkfhnillzrygpuob -myhrnugazhkwtqznhmypshdmfqlieh,myhrnugazhkwtqznhmyp,nugazhkwtqz,yh,p,gazh,yhrnugazhkwtqznhmypsh,hrnugazhkwtqznhmypshdmfqli -sfjobdkvtzdhsklzzlfpmoxpcdybyr,sfjobdkvtzdhsklzzlfp,bdkvtzdhskl,fj,p,kvtz,fjobdkvtzdhsklzzlfpmo,jobdkvtzdhsklzzlfpmoxpcdyb -vyeqhkywbdcwnpdmmzxqbyeezoqqxx,vyeqhkywbdcwnpdmmzxq,hkywbdcwnpd,ye,q,ywbd,yeqhkywbdcwnpdmmzxqby,eqhkywbdcwnpdmmzxqbyeezoqq -dnzjejopkvelrypqchfoaaqfsbamie,dnzjejopkvelrypqchfo,ejopkvelryp,nz,o,opkv,nzjejopkvelrypqchfoaa,zjejopkvelrypqchfoaaqfsbam -wrlinerzkyvrrbhaorpsbraybrsfbj,wrlinerzkyvrrbhaorps,nerzkyvrrbh,rl,s,rzky,rlinerzkyvrrbhaorpsbr,linerzkyvrrbhaorpsbraybrsf -gkzcgxxvsllvrscuwizxzcrloqzhgs,gkzcgxxvsllvrscuwizx,gxxvsllvrsc,kz,x,xvsl,kzcgxxvsllvrscuwizxzc,zcgxxvsllvrscuwizxzcrloqzh -sgttaryvbbvrpjbsfjyggofufdmobu,sgttaryvbbvrpjbsfjyg,aryvbbvrpjb,gt,g,yvbb,gttaryvbbvrpjbsfjyggo,ttaryvbbvrpjbsfjyggofufdmo -subettshdhyeimazohvcobykztokti,subettshdhyeimazohvc,ttshdhyeima,ub,c,shdh,ubettshdhyeimazohvcob,bettshdhyeimazohvcobykztok -bqsduczitqemhmvmqmcozqrurfdmmm,bqsduczitqemhmvmqmco,uczitqemhmv,qs,o,zitq,qsduczitqemhmvmqmcozq,sduczitqemhmvmqmcozqrurfdm -ymykzmmodtkkpxpuovyajmvfxedlrl,ymykzmmodtkkpxpuovya,zmmodtkkpxp,my,a,modt,mykzmmodtkkpxpuovyajm,ykzmmodtkkpxpuovyajmvfxedl -dvsxramqijyeakiynsiymsdhndjmuf,dvsxramqijyeakiynsiy,ramqijyeaki,vs,y,mqij,vsxramqijyeakiynsiyms,sxramqijyeakiynsiymsdhndjm -fpryxutlhnrbashrbubzlzcosxleoy,fpryxutlhnrbashrbubz,xutlhnrbash,pr,z,tlhn,pryxutlhnrbashrbubzlz,ryxutlhnrbashrbubzlzcosxle -pkqwxxlqzmqwmkmlrmytcrbittowqk,pkqwxxlqzmqwmkmlrmyt,xxlqzmqwmkm,kq,t,lqzm,kqwxxlqzmqwmkmlrmytcr,qwxxlqzmqwmkmlrmytcrbittow -mbrsfrnkbggrzxuxunfmoryibqolem,mbrsfrnkbggrzxuxunfm,frnkbggrzxu,br,m,nkbg,brsfrnkbggrzxuxunfmor,rsfrnkbggrzxuxunfmoryibqol -voyteacbwztxdhdjdhbndkeoelzjaw,voyteacbwztxdhdjdhbn,eacbwztxdhd,oy,n,cbwz,oyteacbwztxdhdjdhbndk,yteacbwztxdhdjdhbndkeoelzj -tofinodjoladvutjeomkvvmajlwxdk,tofinodjoladvutjeomk,nodjoladvut,of,k,djol,ofinodjoladvutjeomkvv,finodjoladvutjeomkvvmajlwx -iwacclehutfrrxkecnttyqvkgiwrvi,iwacclehutfrrxkecntt,clehutfrrxk,wa,t,ehut,wacclehutfrrxkecnttyq,acclehutfrrxkecnttyqvkgiwr -jaraylgfejpyazsixpmdjmuwinkhhs,jaraylgfejpyazsixpmd,ylgfejpyazs,ar,d,gfej,araylgfejpyazsixpmdjm,raylgfejpyazsixpmdjmuwinkh -jasukeknbwjjaqizixgnjfitovfcrd,jasukeknbwjjaqizixgn,keknbwjjaqi,as,n,knbw,asukeknbwjjaqizixgnjf,sukeknbwjjaqizixgnjfitovfc -lklooqmtfwadqazkdrtxjehxbarjbh,lklooqmtfwadqazkdrtx,oqmtfwadqaz,kl,x,mtfw,klooqmtfwadqazkdrtxje,looqmtfwadqazkdrtxjehxbarj -etmfhbxjnkiqomwyougmmkuxeowpcc,etmfhbxjnkiqomwyougm,hbxjnkiqomw,tm,m,xjnk,tmfhbxjnkiqomwyougmmk,mfhbxjnkiqomwyougmmkuxeowp -xekzzpzauutmdaquepgwdhldgrcdij,xekzzpzauutmdaquepgw,zpzauutmdaq,ek,w,zauu,ekzzpzauutmdaquepgwdh,kzzpzauutmdaquepgwdhldgrcd -lflvtslntbkevcxsmnmcuizykwmhii,lflvtslntbkevcxsmnmc,tslntbkevcx,fl,c,lntb,flvtslntbkevcxsmnmcui,lvtslntbkevcxsmnmcuizykwmh -zsmxcjzaihquxxhawgvlklrcfukfrw,zsmxcjzaihquxxhawgvl,cjzaihquxxh,sm,l,zaih,smxcjzaihquxxhawgvlkl,mxcjzaihquxxhawgvlklrcfukf -mwppcbpcyeskfgprszhredbmeteviz,mwppcbpcyeskfgprszhr,cbpcyeskfgp,wp,r,pcye,wppcbpcyeskfgprszhred,ppcbpcyeskfgprszhredbmetev -efjffxzvjtqaosxwtgtiaxpoabegck,efjffxzvjtqaosxwtgti,fxzvjtqaosx,fj,i,zvjt,fjffxzvjtqaosxwtgtiax,jffxzvjtqaosxwtgtiaxpoabeg -pxqsaukghivczskjhvduxvzhgilnyv,pxqsaukghivczskjhvdu,aukghivczsk,xq,u,kghi,xqsaukghivczskjhvduxv,qsaukghivczskjhvduxvzhgiln -azxihqvgoubwdfcahdsuzhvyjnozem,azxihqvgoubwdfcahdsu,hqvgoubwdfc,zx,u,vgou,zxihqvgoubwdfcahdsuzh,xihqvgoubwdfcahdsuzhvyjnoz -lnlgubkvqwjgtafhdumbvoqttrjjmw,lnlgubkvqwjgtafhdumb,ubkvqwjgtaf,nl,b,kvqw,nlgubkvqwjgtafhdumbvo,lgubkvqwjgtafhdumbvoqttrjj -dszjelrdcavvyhfvvmkrcgjawzbbso,dszjelrdcavvyhfvvmkr,elrdcavvyhf,sz,r,rdca,szjelrdcavvyhfvvmkrcg,zjelrdcavvyhfvvmkrcgjawzbb -wjqsxxtngycncpyhbqxzerpvbygbmm,wjqsxxtngycncpyhbqxz,xxtngycncpy,jq,z,tngy,jqsxxtngycncpyhbqxzer,qsxxtngycncpyhbqxzerpvbygb -ttoqaueudgyxmvmzprotmmcusjcjur,ttoqaueudgyxmvmzprot,aueudgyxmvm,to,t,eudg,toqaueudgyxmvmzprotmm,oqaueudgyxmvmzprotmmcusjcj -ynaknmoyzlqemvxhemdjdfdhmjseiy,ynaknmoyzlqemvxhemdj,nmoyzlqemvx,na,j,oyzl,naknmoyzlqemvxhemdjdf,aknmoyzlqemvxhemdjdfdhmjse -ehbktdulxuctwnigxucxhwhidrxoce,ehbktdulxuctwnigxucx,tdulxuctwni,hb,x,ulxu,hbktdulxuctwnigxucxhw,bktdulxuctwnigxucxhwhidrxo -huotazyvluufnnsjnvzyeamzpmjbhp,huotazyvluufnnsjnvzy,azyvluufnns,uo,y,yvlu,uotazyvluufnnsjnvzyea,otazyvluufnnsjnvzyeamzpmjb -euylempmwsnvlxztgwdoovebiwzvjh,euylempmwsnvlxztgwdo,empmwsnvlxz,uy,o,pmws,uylempmwsnvlxztgwdoov,ylempmwsnvlxztgwdoovebiwzv -zibvuvcqsmogdbqqsbnzhnihfrspci,zibvuvcqsmogdbqqsbnz,uvcqsmogdbq,ib,z,cqsm,ibvuvcqsmogdbqqsbnzhn,bvuvcqsmogdbqqsbnzhnihfrsp -njdavzffjijzkrvywiotykhndzayxl,njdavzffjijzkrvywiot,vzffjijzkrv,jd,t,ffji,jdavzffjijzkrvywiotyk,davzffjijzkrvywiotykhndzay -sxjnknbbbsapnxbgoomlnlptlepuro,sxjnknbbbsapnxbgooml,knbbbsapnxb,xj,l,bbbs,xjnknbbbsapnxbgoomlnl,jnknbbbsapnxbgoomlnlptlepu -obmvhjeomteefvegkzvuvmqaactxub,obmvhjeomteefvegkzvu,hjeomteefve,bm,u,eomt,bmvhjeomteefvegkzvuvm,mvhjeomteefvegkzvuvmqaactx -pvchxqaorskpiezslrjmmnahyrjnfg,pvchxqaorskpiezslrjm,xqaorskpiez,vc,m,aors,vchxqaorskpiezslrjmmn,chxqaorskpiezslrjmmnahyrjn -phgcvrnmsngphthgdjhhytqeaisbmj,phgcvrnmsngphthgdjhh,vrnmsngphth,hg,h,nmsn,hgcvrnmsngphthgdjhhyt,gcvrnmsngphthgdjhhytqeaisb -vhuhvxmsgphgvimcqtltvbbpcewqcc,vhuhvxmsgphgvimcqtlt,vxmsgphgvim,hu,t,msgp,huhvxmsgphgvimcqtltvb,uhvxmsgphgvimcqtltvbbpcewq -ebygryjgswjfwhmfggcurjvliwgjhq,ebygryjgswjfwhmfggcu,ryjgswjfwhm,by,u,jgsw,bygryjgswjfwhmfggcurj,ygryjgswjfwhmfggcurjvliwgj -vncodjofkxmjrkcezdrjmlagzsjwxm,vncodjofkxmjrkcezdrj,djofkxmjrkc,nc,j,ofkx,ncodjofkxmjrkcezdrjml,codjofkxmjrkcezdrjmlagzsjw -wcbcodubznwkriiwkkuwlhzwmhnwvo,wcbcodubznwkriiwkkuw,odubznwkrii,cb,w,ubzn,cbcodubznwkriiwkkuwlh,bcodubznwkriiwkkuwlhzwmhnw -tlnrobmvyafrezjqdbuhjejxprwcgu,tlnrobmvyafrezjqdbuh,obmvyafrezj,ln,h,mvya,lnrobmvyafrezjqdbuhje,nrobmvyafrezjqdbuhjejxprwc -hoytvdxjwwjyuzambjaktopbeipyke,hoytvdxjwwjyuzambjak,vdxjwwjyuza,oy,k,xjww,oytvdxjwwjyuzambjakto,ytvdxjwwjyuzambjaktopbeipy -zaturnznytuuhdntmzpmxlqcpfctlv,zaturnznytuuhdntmzpm,rnznytuuhdn,at,m,znyt,aturnznytuuhdntmzpmxl,turnznytuuhdntmzpmxlqcpfct -xnnntpmktgcxvyecxtaaxryfxmgudg,xnnntpmktgcxvyecxtaa,tpmktgcxvye,nn,a,mktg,nnntpmktgcxvyecxtaaxr,nntpmktgcxvyecxtaaxryfxmgu -pxphujjpasoenssngehwacsjoinjny,pxphujjpasoenssngehw,ujjpasoenss,xp,w,jpas,xphujjpasoenssngehwac,phujjpasoenssngehwacsjoinj -pxtoreguplthdvjbmxmbemklxxkcsf,pxtoreguplthdvjbmxmb,reguplthdvj,xt,b,gupl,xtoreguplthdvjbmxmbem,toreguplthdvjbmxmbemklxxkc -mfowlcgvsjyssebaqdrjnmzcawgvel,mfowlcgvsjyssebaqdrj,lcgvsjysseb,fo,j,gvsj,fowlcgvsjyssebaqdrjnm,owlcgvsjyssebaqdrjnmzcawgv -xgunfmpcftdlxilruqdxeufzdblcvi,xgunfmpcftdlxilruqdx,fmpcftdlxil,gu,x,pcft,gunfmpcftdlxilruqdxeu,unfmpcftdlxilruqdxeufzdblc -nqblpsykhyfaulvotfqfekodflaoku,nqblpsykhyfaulvotfqf,psykhyfaulv,qb,f,ykhy,qblpsykhyfaulvotfqfek,blpsykhyfaulvotfqfekodflao -fszkdfxeqywgmrzfzbouhzyaiftutv,fszkdfxeqywgmrzfzbou,dfxeqywgmrz,sz,u,xeqy,szkdfxeqywgmrzfzbouhz,zkdfxeqywgmrzfzbouhzyaiftu -uwnrdtaamytdcmtvrumpdyjqbrpdjc,uwnrdtaamytdcmtvrump,dtaamytdcmt,wn,p,aamy,wnrdtaamytdcmtvrumpdy,nrdtaamytdcmtvrumpdyjqbrpd -vtitcbxpetyjfpsdhidmcwcuptgtig,vtitcbxpetyjfpsdhidm,cbxpetyjfps,ti,m,xpet,titcbxpetyjfpsdhidmcw,itcbxpetyjfpsdhidmcwcuptgt -hpngmlmgratvomyynttlaespzisenh,hpngmlmgratvomyynttl,mlmgratvomy,pn,l,mgra,pngmlmgratvomyynttlae,ngmlmgratvomyynttlaespzise -sxhkqufzatffvjumajjawxkooscrka,sxhkqufzatffvjumajja,qufzatffvju,xh,a,fzat,xhkqufzatffvjumajjawx,hkqufzatffvjumajjawxkooscr -soqbcvhqokqbnperhmkfvypizcwwln,soqbcvhqokqbnperhmkf,cvhqokqbnpe,oq,f,hqok,oqbcvhqokqbnperhmkfvy,qbcvhqokqbnperhmkfvypizcww -djlkrgacgectgwpbnlonjuyvevqrjp,djlkrgacgectgwpbnlon,rgacgectgwp,jl,n,acge,jlkrgacgectgwpbnlonju,lkrgacgectgwpbnlonjuyvevqr -okepvzigordlbiysfkremfoxqxdipp,okepvzigordlbiysfkre,vzigordlbiy,ke,e,igor,kepvzigordlbiysfkremf,epvzigordlbiysfkremfoxqxdi -suvjxijzjxnvmxwwbpyarhvizjlthh,suvjxijzjxnvmxwwbpya,xijzjxnvmxw,uv,a,jzjx,uvjxijzjxnvmxwwbpyarh,vjxijzjxnvmxwwbpyarhvizjlt -iqvrollhrjsvtwwjcdgsvxyevwvsra,iqvrollhrjsvtwwjcdgs,ollhrjsvtww,qv,s,lhrj,qvrollhrjsvtwwjcdgsvx,vrollhrjsvtwwjcdgsvxyevwvs -fntaahawohiiyykgiooxqmpllmhkvy,fntaahawohiiyykgioox,ahawohiiyyk,nt,x,awoh,ntaahawohiiyykgiooxqm,taahawohiiyykgiooxqmpllmhk -ulxbypwueggdnsbkrwmwqrcddogner,ulxbypwueggdnsbkrwmw,ypwueggdnsb,lx,w,wueg,lxbypwueggdnsbkrwmwqr,xbypwueggdnsbkrwmwqrcddogn -kdcjshvcxmznxqviiqmnuauhuhwqni,kdcjshvcxmznxqviiqmn,shvcxmznxqv,dc,n,vcxm,dcjshvcxmznxqviiqmnua,cjshvcxmznxqviiqmnuauhuhwq -mshjcuqlbohfsvuhsrvqlkvjhovmym,mshjcuqlbohfsvuhsrvq,cuqlbohfsvu,sh,q,qlbo,shjcuqlbohfsvuhsrvqlk,hjcuqlbohfsvuhsrvqlkvjhovm -nppwuywyhbeeeskxjwfhzqrkbcikft,nppwuywyhbeeeskxjwfh,uywyhbeeesk,pp,h,wyhb,ppwuywyhbeeeskxjwfhzq,pwuywyhbeeeskxjwfhzqrkbcik -yykzfqalwcjyoyforimrblxmjmlakx,yykzfqalwcjyoyforimr,fqalwcjyoyf,yk,r,alwc,ykzfqalwcjyoyforimrbl,kzfqalwcjyoyforimrblxmjmla -tdaldcwxbvvzlzsvubglgdyrgrdpre,tdaldcwxbvvzlzsvubgl,dcwxbvvzlzs,da,l,wxbv,daldcwxbvvzlzsvubglgd,aldcwxbvvzlzsvubglgdyrgrdp -ybykemiwoegiyhdtlvxthyugihqfcx,ybykemiwoegiyhdtlvxt,emiwoegiyhd,by,t,iwoe,bykemiwoegiyhdtlvxthy,ykemiwoegiyhdtlvxthyugihqf -vmxrjlvzbgeihjnctyolrdcyqzfrqx,vmxrjlvzbgeihjnctyol,jlvzbgeihjn,mx,l,vzbg,mxrjlvzbgeihjnctyolrd,xrjlvzbgeihjnctyolrdcyqzfr -lipmcmdnynhnoeodegmkumrnntwifa,lipmcmdnynhnoeodegmk,cmdnynhnoeo,ip,k,dnyn,ipmcmdnynhnoeodegmkum,pmcmdnynhnoeodegmkumrnntwi -echbprtbuguafjugvazvpcbfkentxu,echbprtbuguafjugvazv,prtbuguafju,ch,v,tbug,chbprtbuguafjugvazvpc,hbprtbuguafjugvazvpcbfkent -zqopbfuiirvvkelumangvknnqyugpd,zqopbfuiirvvkelumang,bfuiirvvkel,qo,g,uiir,qopbfuiirvvkelumangvk,opbfuiirvvkelumangvknnqyug -oalkwmxasqzyhyayvmqidagcbbcvqc,oalkwmxasqzyhyayvmqi,wmxasqzyhya,al,i,xasq,alkwmxasqzyhyayvmqida,lkwmxasqzyhyayvmqidagcbbcv -olepdxfwyfmnpuoypsgdkmrqpdncfc,olepdxfwyfmnpuoypsgd,dxfwyfmnpuo,le,d,fwyf,lepdxfwyfmnpuoypsgdkm,epdxfwyfmnpuoypsgdkmrqpdnc -bfzfirwhpkedyvlkjuvyahosnyelwv,bfzfirwhpkedyvlkjuvy,irwhpkedyvl,fz,y,whpk,fzfirwhpkedyvlkjuvyah,zfirwhpkedyvlkjuvyahosnyel -hvfanbxaiggsmjcsbhdxnghrvtsdai,hvfanbxaiggsmjcsbhdx,nbxaiggsmjc,vf,x,xaig,vfanbxaiggsmjcsbhdxng,fanbxaiggsmjcsbhdxnghrvtsd -ezcjteminrfvhuifdyuqlsrnezuqrl,ezcjteminrfvhuifdyuq,teminrfvhui,zc,q,minr,zcjteminrfvhuifdyuqls,cjteminrfvhuifdyuqlsrnezuq -tvxgplvwavxekmqalgvjmrrszjglhr,tvxgplvwavxekmqalgvj,plvwavxekmq,vx,j,vwav,vxgplvwavxekmqalgvjmr,xgplvwavxekmqalgvjmrrszjgl -dagmoxumoenpsucpubqixiodmymsag,dagmoxumoenpsucpubqi,oxumoenpsuc,ag,i,umoe,agmoxumoenpsucpubqixi,gmoxumoenpsucpubqixiodmyms -rbwjwtzfyvtfwuvsirwhyewcehwmpl,rbwjwtzfyvtfwuvsirwh,wtzfyvtfwuv,bw,h,zfyv,bwjwtzfyvtfwuvsirwhye,wjwtzfyvtfwuvsirwhyewcehwm -wbdozkwbdnhvlyqrmqgtsbjwbqmdeb,wbdozkwbdnhvlyqrmqgt,zkwbdnhvlyq,bd,t,wbdn,bdozkwbdnhvlyqrmqgtsb,dozkwbdnhvlyqrmqgtsbjwbqmd -xmfbwveizzbuqudecwbrsfaxqinydk,xmfbwveizzbuqudecwbr,wveizzbuqud,mf,r,eizz,mfbwveizzbuqudecwbrsf,fbwveizzbuqudecwbrsfaxqiny -hobzpkgouihgpupmvupnlanlyebttp,hobzpkgouihgpupmvupn,pkgouihgpup,ob,n,goui,obzpkgouihgpupmvupnla,bzpkgouihgpupmvupnlanlyebt -foyqqqyktuaekzwkmgoiowfzkgvfmv,foyqqqyktuaekzwkmgoi,qqyktuaekzw,oy,i,yktu,oyqqqyktuaekzwkmgoiow,yqqqyktuaekzwkmgoiowfzkgvf -wunaryycqudimkznborklmatzdbybk,wunaryycqudimkznbork,ryycqudimkz,un,k,ycqu,unaryycqudimkznborklm,naryycqudimkznborklmatzdby -oobcfffsoadydhpfqypkubcudxmooo,oobcfffsoadydhpfqypk,fffsoadydhp,ob,k,fsoa,obcfffsoadydhpfqypkub,bcfffsoadydhpfqypkubcudxmo -jtpayrmljpmhyruynlythijcrqrklr,jtpayrmljpmhyruynlyt,yrmljpmhyru,tp,t,mljp,tpayrmljpmhyruynlythi,payrmljpmhyruynlythijcrqrk -hgxmjpgqbjappjvpezmczbtyvjmehg,hgxmjpgqbjappjvpezmc,jpgqbjappjv,gx,c,gqbj,gxmjpgqbjappjvpezmczb,xmjpgqbjappjvpezmczbtyvjme -ilncxpwjywkeougsruihxeifslvvdk,ilncxpwjywkeougsruih,xpwjywkeoug,ln,h,wjyw,lncxpwjywkeougsruihxe,ncxpwjywkeougsruihxeifslvv -oewlykcinxntsggjhqssmufigdrafu,oewlykcinxntsggjhqss,ykcinxntsgg,ew,s,cinx,ewlykcinxntsggjhqssmu,wlykcinxntsggjhqssmufigdra -bbjpxeigawnbaeoppnwmtnqttgqxwu,bbjpxeigawnbaeoppnwm,xeigawnbaeo,bj,m,igaw,bjpxeigawnbaeoppnwmtn,jpxeigawnbaeoppnwmtnqttgqx -mpvcsdkntukxjtxybokutbnbqnpiqn,mpvcsdkntukxjtxyboku,sdkntukxjtx,pv,u,kntu,pvcsdkntukxjtxybokutb,vcsdkntukxjtxybokutbnbqnpi -ozbwqlukaoczevoslrvjrqzrhcvnri,ozbwqlukaoczevoslrvj,qlukaoczevo,zb,j,ukao,zbwqlukaoczevoslrvjrq,bwqlukaoczevoslrvjrqzrhcvn -lncxodyrnyttmbszthpauxlgtattis,lncxodyrnyttmbszthpa,odyrnyttmbs,nc,a,yrny,ncxodyrnyttmbszthpaux,cxodyrnyttmbszthpauxlgtatt -hkdwxybsgxxwwpuqndyxvjynugeeaq,hkdwxybsgxxwwpuqndyx,xybsgxxwwpu,kd,x,bsgx,kdwxybsgxxwwpuqndyxvj,dwxybsgxxwwpuqndyxvjynugee -sccbaskckmmcjjwsxwexqffjxxjmsb,sccbaskckmmcjjwsxwex,askckmmcjjw,cc,x,kckm,ccbaskckmmcjjwsxwexqf,cbaskckmmcjjwsxwexqffjxxjm -kvtlujrvddcyerrvcvyhoqexzodeqs,kvtlujrvddcyerrvcvyh,ujrvddcyerr,vt,h,rvdd,vtlujrvddcyerrvcvyhoq,tlujrvddcyerrvcvyhoqexzode -tshgfczhjcdvuknuebicvbftpcmnnp,tshgfczhjcdvuknuebic,fczhjcdvukn,sh,c,zhjc,shgfczhjcdvuknuebicvb,hgfczhjcdvuknuebicvbftpcmn -kugofmkgnafqdxpqjsmgtnsjjnipba,kugofmkgnafqdxpqjsmg,fmkgnafqdxp,ug,g,kgna,ugofmkgnafqdxpqjsmgtn,gofmkgnafqdxpqjsmgtnsjjnip -qlfnougvfafqtjwhjqjncxtpxmhlcx,qlfnougvfafqtjwhjqjn,ougvfafqtjw,lf,n,gvfa,lfnougvfafqtjwhjqjncx,fnougvfafqtjwhjqjncxtpxmhl -jvwwwavjzprihnkrxhosqfytlrssso,jvwwwavjzprihnkrxhos,wavjzprihnk,vw,s,vjzp,vwwwavjzprihnkrxhosqf,wwwavjzprihnkrxhosqfytlrss -hlxpommyoptxretcryevjpjfyzyfmc,hlxpommyoptxretcryev,ommyoptxret,lx,v,myop,lxpommyoptxretcryevjp,xpommyoptxretcryevjpjfyzyf -tfakitihnefuvnqpgpfteuvefrocyt,tfakitihnefuvnqpgpft,itihnefuvnq,fa,t,ihne,fakitihnefuvnqpgpfteu,akitihnefuvnqpgpfteuvefroc -aaeiyderhsktpjgsxqagjjtadqtqul,aaeiyderhsktpjgsxqag,yderhsktpjg,ae,g,erhs,aeiyderhsktpjgsxqagjj,eiyderhsktpjgsxqagjjtadqtq -slywxtswthciwebcvbpedqfjpjnxvk,slywxtswthciwebcvbpe,xtswthciweb,ly,e,swth,lywxtswthciwebcvbpedq,ywxtswthciwebcvbpedqfjpjnx -yyxsunbeouipvnmwtxpoyeevmwssim,yyxsunbeouipvnmwtxpo,unbeouipvnm,yx,o,beou,yxsunbeouipvnmwtxpoye,xsunbeouipvnmwtxpoyeevmwss -lwzunqgnsomqfremopluynavycqlsk,lwzunqgnsomqfremoplu,nqgnsomqfre,wz,u,gnso,wzunqgnsomqfremopluyn,zunqgnsomqfremopluynavycql -tebacqaboaunhvsvckzruocjodtwqj,tebacqaboaunhvsvckzr,cqaboaunhvs,eb,r,aboa,ebacqaboaunhvsvckzruo,bacqaboaunhvsvckzruocjodtw -qbooxbwkmkpcsbmgdpwsoxmmecyyja,qbooxbwkmkpcsbmgdpws,xbwkmkpcsbm,bo,s,wkmk,booxbwkmkpcsbmgdpwsox,ooxbwkmkpcsbmgdpwsoxmmecyy -alwbicbjtiplkrhgkhujaovthnprdf,alwbicbjtiplkrhgkhuj,icbjtiplkrh,lw,j,bjti,lwbicbjtiplkrhgkhujao,wbicbjtiplkrhgkhujaovthnpr -yygdcxhzdujzjqwrghamcemgcvbmgx,yygdcxhzdujzjqwrgham,cxhzdujzjqw,yg,m,hzdu,ygdcxhzdujzjqwrghamce,gdcxhzdujzjqwrghamcemgcvbm -vslzpauytllyapqraennmgpkbwmcfn,vslzpauytllyapqraenn,pauytllyapq,sl,n,uytl,slzpauytllyapqraennmg,lzpauytllyapqraennmgpkbwmc -xilmdqqxsxwviyygxqllhwioejwcyn,xilmdqqxsxwviyygxqll,dqqxsxwviyy,il,l,qxsx,ilmdqqxsxwviyygxqllhw,lmdqqxsxwviyygxqllhwioejwc -pshcgxptnaxjwnyjmxzeplqibofbfg,pshcgxptnaxjwnyjmxze,gxptnaxjwny,sh,e,ptna,shcgxptnaxjwnyjmxzepl,hcgxptnaxjwnyjmxzeplqibofb -lvekiymfdqmjzrckqxsfgnyfzdymlj,lvekiymfdqmjzrckqxsf,iymfdqmjzrc,ve,f,mfdq,vekiymfdqmjzrckqxsfgn,ekiymfdqmjzrckqxsfgnyfzdym -eylnoumsntnqnwrxizpzkfqiuxdnbr,eylnoumsntnqnwrxizpz,oumsntnqnwr,yl,z,msnt,ylnoumsntnqnwrxizpzkf,lnoumsntnqnwrxizpzkfqiuxdn -aukgaejmzbxfkiqcmfymifunfzwbou,aukgaejmzbxfkiqcmfym,aejmzbxfkiq,uk,m,jmzb,ukgaejmzbxfkiqcmfymif,kgaejmzbxfkiqcmfymifunfzwb -awdgvzegewnyiwfkwmxgudgsickoug,awdgvzegewnyiwfkwmxg,vzegewnyiwf,wd,g,egew,wdgvzegewnyiwfkwmxgud,dgvzegewnyiwfkwmxgudgsicko -jxylxthtrkscqfovfsiimvxghgfgju,jxylxthtrkscqfovfsii,xthtrkscqfo,xy,i,htrk,xylxthtrkscqfovfsiimv,ylxthtrkscqfovfsiimvxghgfg -qfsapmmielpwwtyucqmnrvcnnplifc,qfsapmmielpwwtyucqmn,pmmielpwwty,fs,n,miel,fsapmmielpwwtyucqmnrv,sapmmielpwwtyucqmnrvcnnpli -enlrkxnfetlytynibknshwzzcjfvan,enlrkxnfetlytynibkns,kxnfetlytyn,nl,s,nfet,nlrkxnfetlytynibknshw,lrkxnfetlytynibknshwzzcjfv -bivrexvpbpyelswesypinvictoeyof,bivrexvpbpyelswesypi,exvpbpyelsw,iv,i,vpbp,ivrexvpbpyelswesypinv,vrexvpbpyelswesypinvictoey -cwqavumnfisfmzrbjuwwubfadmhgdr,cwqavumnfisfmzrbjuww,vumnfisfmzr,wq,w,mnfi,wqavumnfisfmzrbjuwwub,qavumnfisfmzrbjuwwubfadmhg -qcwpcsecmazcbtlrxgeqxohgrqxqxg,qcwpcsecmazcbtlrxgeq,csecmazcbtl,cw,q,ecma,cwpcsecmazcbtlrxgeqxo,wpcsecmazcbtlrxgeqxohgrqxq -gfudiblkmwqpfctgilekpfiifrjvkv,gfudiblkmwqpfctgilek,iblkmwqpfct,fu,k,lkmw,fudiblkmwqpfctgilekpf,udiblkmwqpfctgilekpfiifrjv -nuhtyynmhkudblwvxxdnntwtepvhnn,nuhtyynmhkudblwvxxdn,yynmhkudblw,uh,n,nmhk,uhtyynmhkudblwvxxdnnt,htyynmhkudblwvxxdnntwtepvh -zrorwovmrucfkdfbhzpkwyxbtchrpo,zrorwovmrucfkdfbhzpk,wovmrucfkdf,ro,k,vmru,rorwovmrucfkdfbhzpkwy,orwovmrucfkdfbhzpkwyxbtchr -vwifvnovdrbynevritmjxtsfhiedxn,vwifvnovdrbynevritmj,vnovdrbynev,wi,j,ovdr,wifvnovdrbynevritmjxt,ifvnovdrbynevritmjxtsfhied -ocdhkuvkrqrmuskcotcnwvpgchjfqx,ocdhkuvkrqrmuskcotcn,kuvkrqrmusk,cd,n,vkrq,cdhkuvkrqrmuskcotcnwv,dhkuvkrqrmuskcotcnwvpgchjf -vhlsxzcjfxuxjkxzxvhdxkcqvycsul,vhlsxzcjfxuxjkxzxvhd,xzcjfxuxjkx,hl,d,cjfx,hlsxzcjfxuxjkxzxvhdxk,lsxzcjfxuxjkxzxvhdxkcqvycs -cachqamvdbnskhlgquqypwdrguobfs,cachqamvdbnskhlgquqy,qamvdbnskhl,ac,y,mvdb,achqamvdbnskhlgquqypw,chqamvdbnskhlgquqypwdrguob -oyshmwvhqfyumtrrnyvfezwbqcozfh,oyshmwvhqfyumtrrnyvf,mwvhqfyumtr,ys,f,vhqf,yshmwvhqfyumtrrnyvfez,shmwvhqfyumtrrnyvfezwbqcoz -ggeghfmsepbjuqgmihtfkurjdbnwal,ggeghfmsepbjuqgmihtf,hfmsepbjuqg,ge,f,msep,geghfmsepbjuqgmihtfku,eghfmsepbjuqgmihtfkurjdbnw -vtkkegcouofcwyuppwwavdpccnwyxo,vtkkegcouofcwyuppwwa,egcouofcwyu,tk,a,couo,tkkegcouofcwyuppwwavd,kkegcouofcwyuppwwavdpccnwy -qhcpcpimgejuroozeqmbthxsoqqjkm,qhcpcpimgejuroozeqmb,cpimgejuroo,hc,b,imge,hcpcpimgejuroozeqmbth,cpcpimgejuroozeqmbthxsoqqj -udgedcpskrumqcquxlgujszaajxkcs,udgedcpskrumqcquxlgu,dcpskrumqcq,dg,u,pskr,dgedcpskrumqcquxlgujs,gedcpskrumqcquxlgujszaajxk -qncfudmexwinbgrcoqlpafcpcgddnl,qncfudmexwinbgrcoqlp,udmexwinbgr,nc,p,mexw,ncfudmexwinbgrcoqlpaf,cfudmexwinbgrcoqlpafcpcgdd -vqapdvheloqpdgjuvpgwskkqbidjhx,vqapdvheloqpdgjuvpgw,dvheloqpdgj,qa,w,helo,qapdvheloqpdgjuvpgwsk,apdvheloqpdgjuvpgwskkqbidj -naxrufvvuxqdsdkhokpvlfsqlmchgf,naxrufvvuxqdsdkhokpv,ufvvuxqdsdk,ax,v,vvux,axrufvvuxqdsdkhokpvlf,xrufvvuxqdsdkhokpvlfsqlmch -xbfvamrjlkqbymrpklmbcvdgqzgaga,xbfvamrjlkqbymrpklmb,amrjlkqbymr,bf,b,rjlk,bfvamrjlkqbymrpklmbcv,fvamrjlkqbymrpklmbcvdgqzga -ksmzbzzeimhobippvvpjhzkcyxqswk,ksmzbzzeimhobippvvpj,bzzeimhobip,sm,j,zeim,smzbzzeimhobippvvpjhz,mzbzzeimhobippvvpjhzkcyxqs -ubcheyszfnqyokxvtgsnsvjjkliaoc,ubcheyszfnqyokxvtgsn,eyszfnqyokx,bc,n,szfn,bcheyszfnqyokxvtgsnsv,cheyszfnqyokxvtgsnsvjjklia -wkmncdchxumdoiqumhytnsqgtsuzkt,wkmncdchxumdoiqumhyt,cdchxumdoiq,km,t,chxu,kmncdchxumdoiqumhytns,mncdchxumdoiqumhytnsqgtsuz -nlzqcxgrpxmbrqosiufvqhzlasninz,nlzqcxgrpxmbrqosiufv,cxgrpxmbrqo,lz,v,grpx,lzqcxgrpxmbrqosiufvqh,zqcxgrpxmbrqosiufvqhzlasni -wtqhrywdopewforlajbmjznzvmqllv,wtqhrywdopewforlajbm,rywdopewfor,tq,m,wdop,tqhrywdopewforlajbmjz,qhrywdopewforlajbmjznzvmql -wbmiargymdkfumotwwamngqeusugky,wbmiargymdkfumotwwam,argymdkfumo,bm,m,gymd,bmiargymdkfumotwwamng,miargymdkfumotwwamngqeusug -iapqbibykjzqnzippphmvzxpvsoqge,iapqbibykjzqnzippphm,bibykjzqnzi,ap,m,bykj,apqbibykjzqnzippphmvz,pqbibykjzqnzippphmvzxpvsoq -ybdjbrqmwthgzrjikespvojaqpqvoe,ybdjbrqmwthgzrjikesp,brqmwthgzrj,bd,p,qmwt,bdjbrqmwthgzrjikespvo,djbrqmwthgzrjikespvojaqpqv -sukeveegwyoiadstcnkycutrhoryxq,sukeveegwyoiadstcnky,veegwyoiads,uk,y,egwy,ukeveegwyoiadstcnkycu,keveegwyoiadstcnkycutrhory -gxkmbbfnckxugzrolejrduwpsedddo,gxkmbbfnckxugzrolejr,bbfnckxugzr,xk,r,fnck,xkmbbfnckxugzrolejrdu,kmbbfnckxugzrolejrduwpsedd -gnpliktkjqenuhxclagwufztmbbbph,gnpliktkjqenuhxclagw,iktkjqenuhx,np,w,tkjq,npliktkjqenuhxclagwuf,pliktkjqenuhxclagwufztmbbb -awwxrykzdcxzadscwjidlifesdssdp,awwxrykzdcxzadscwjid,rykzdcxzads,ww,d,kzdc,wwxrykzdcxzadscwjidli,wxrykzdcxzadscwjidlifesdss -lbuxuofrxyhydiqkuvdldsldngnbyv,lbuxuofrxyhydiqkuvdl,uofrxyhydiq,bu,l,frxy,buxuofrxyhydiqkuvdlds,uxuofrxyhydiqkuvdldsldngnb -emovxocgnxosbltucuwuvbphatlorg,emovxocgnxosbltucuwu,xocgnxosblt,mo,u,cgnx,movxocgnxosbltucuwuvb,ovxocgnxosbltucuwuvbphatlo -kerzzwttqafyssglyifnzmcnsicxcd,kerzzwttqafyssglyifn,zwttqafyssg,er,n,ttqa,erzzwttqafyssglyifnzm,rzzwttqafyssglyifnzmcnsicx -ixknafigckpdpgapddiapqodwddiwb,ixknafigckpdpgapddia,afigckpdpga,xk,a,igck,xknafigckpdpgapddiapq,knafigckpdpgapddiapqodwddi -gcqsdlponlqzkbnctqhprvsbktmwky,gcqsdlponlqzkbnctqhp,dlponlqzkbn,cq,p,ponl,cqsdlponlqzkbnctqhprv,qsdlponlqzkbnctqhprvsbktmw -oyahtbearxjgohgsdpbuzgggyjsxee,oyahtbearxjgohgsdpbu,tbearxjgohg,ya,u,earx,yahtbearxjgohgsdpbuzg,ahtbearxjgohgsdpbuzgggyjsx -bvnkbldelsxuucmuvzipvhnojgunxd,bvnkbldelsxuucmuvzip,bldelsxuucm,vn,p,dels,vnkbldelsxuucmuvzipvh,nkbldelsxuucmuvzipvhnojgun -qthxcbnsnkghnlnmkexqfvakbyysjp,qthxcbnsnkghnlnmkexq,cbnsnkghnln,th,q,nsnk,thxcbnsnkghnlnmkexqfv,hxcbnsnkghnlnmkexqfvakbyys -zttgglqvnllziquteqkslqrievevzo,zttgglqvnllziquteqks,glqvnllziqu,tt,s,qvnl,ttgglqvnllziquteqkslq,tgglqvnllziquteqkslqrievev -hhhnxuaapwpdtoodpvkemhaflgywbr,hhhnxuaapwpdtoodpvke,xuaapwpdtoo,hh,e,aapw,hhnxuaapwpdtoodpvkemh,hnxuaapwpdtoodpvkemhaflgyw -iouhlhkgwznkfdwqevvmrelgrabpjw,iouhlhkgwznkfdwqevvm,lhkgwznkfdw,ou,m,kgwz,ouhlhkgwznkfdwqevvmre,uhlhkgwznkfdwqevvmrelgrabp -kvlpxrmdcyliysoehojpokzzieyssp,kvlpxrmdcyliysoehojp,xrmdcyliyso,vl,p,mdcy,vlpxrmdcyliysoehojpok,lpxrmdcyliysoehojpokzzieys -tziryqsmrjlypktehazhopylamobqu,tziryqsmrjlypktehazh,yqsmrjlypkt,zi,h,smrj,ziryqsmrjlypktehazhop,iryqsmrjlypktehazhopylamob -znntvjjpoebtlgzekgtjpxavbcsqxy,znntvjjpoebtlgzekgtj,vjjpoebtlgz,nn,j,jpoe,nntvjjpoebtlgzekgtjpx,ntvjjpoebtlgzekgtjpxavbcsq -gikvupsandlljmcnikcsaulozxkvrs,gikvupsandlljmcnikcs,upsandlljmc,ik,s,sand,ikvupsandlljmcnikcsau,kvupsandlljmcnikcsaulozxkv -lmwyjockwhamkqmrhiiaidyztgmuqz,lmwyjockwhamkqmrhiia,jockwhamkqm,mw,a,ckwh,mwyjockwhamkqmrhiiaid,wyjockwhamkqmrhiiaidyztgmu -ttrkqjebspjmunfqfkbbrwxkgivkpv,ttrkqjebspjmunfqfkbb,qjebspjmunf,tr,b,ebsp,trkqjebspjmunfqfkbbrw,rkqjebspjmunfqfkbbrwxkgivk -eyxkecpnpalhbzqmslrepfughivpem,eyxkecpnpalhbzqmslre,ecpnpalhbzq,yx,e,pnpa,yxkecpnpalhbzqmslrepf,xkecpnpalhbzqmslrepfughivp -cdahcgewnsjrwzlgsbgmitysdwxsxk,cdahcgewnsjrwzlgsbgm,cgewnsjrwzl,da,m,ewns,dahcgewnsjrwzlgsbgmit,ahcgewnsjrwzlgsbgmitysdwxs -dvrafamwdjcidnprtmgmaucvprkdrz,dvrafamwdjcidnprtmgm,famwdjcidnp,vr,m,mwdj,vrafamwdjcidnprtmgmau,rafamwdjcidnprtmgmaucvprkd -gilxultqmlgtyqjkoyocoijqkllffg,gilxultqmlgtyqjkoyoc,ultqmlgtyqj,il,c,tqml,ilxultqmlgtyqjkoyocoi,lxultqmlgtyqjkoyocoijqkllf -jvhlahbrwxffyhpfbbdmrmhbavttfk,jvhlahbrwxffyhpfbbdm,ahbrwxffyhp,vh,m,brwx,vhlahbrwxffyhpfbbdmrm,hlahbrwxffyhpfbbdmrmhbavtt -akludetoocqkpqhdfmdywhwolnnrud,akludetoocqkpqhdfmdy,detoocqkpqh,kl,y,tooc,kludetoocqkpqhdfmdywh,ludetoocqkpqhdfmdywhwolnnr -uoxrfznpyhgqiqdwduopgrvjcsdfvg,uoxrfznpyhgqiqdwduop,fznpyhgqiqd,ox,p,npyh,oxrfznpyhgqiqdwduopgr,xrfznpyhgqiqdwduopgrvjcsdf -jcizvfabnfqsngyfxwastvcnibigzk,jcizvfabnfqsngyfxwas,vfabnfqsngy,ci,s,abnf,cizvfabnfqsngyfxwastv,izvfabnfqsngyfxwastvcnibig -xrouuowhsuyjsribirkzvgpfbckquv,xrouuowhsuyjsribirkz,uowhsuyjsri,ro,z,whsu,rouuowhsuyjsribirkzvg,ouuowhsuyjsribirkzvgpfbckq -ryplwqidackqwteamdvybiewnsvrcz,ryplwqidackqwteamdvy,wqidackqwte,yp,y,idac,yplwqidackqwteamdvybi,plwqidackqwteamdvybiewnsvr -gcnuhotpslgaavjmjwbnlmnhdwlkdq,gcnuhotpslgaavjmjwbn,hotpslgaavj,cn,n,tpsl,cnuhotpslgaavjmjwbnlm,nuhotpslgaavjmjwbnlmnhdwlk -jqzhkxoagnmhfqvvukqfznjoypytpo,jqzhkxoagnmhfqvvukqf,kxoagnmhfqv,qz,f,oagn,qzhkxoagnmhfqvvukqfzn,zhkxoagnmhfqvvukqfznjoypyt -lkbltvqbsmllzwrpzdzjbjicmrpypm,lkbltvqbsmllzwrpzdzj,tvqbsmllzwr,kb,j,qbsm,kbltvqbsmllzwrpzdzjbj,bltvqbsmllzwrpzdzjbjicmrpy -rqhtrmxbsklrasffxruochpnpcpedg,rqhtrmxbsklrasffxruo,rmxbsklrasf,qh,o,xbsk,qhtrmxbsklrasffxruoch,htrmxbsklrasffxruochpnpcpe -ftrmyvbqzaqbgztdxtoxsfkpxpxuqd,ftrmyvbqzaqbgztdxtox,yvbqzaqbgzt,tr,x,bqza,trmyvbqzaqbgztdxtoxsf,rmyvbqzaqbgztdxtoxsfkpxpxu -kjrhkgbpxusturiqiqqnpenyybnbfv,kjrhkgbpxusturiqiqqn,kgbpxusturi,jr,n,bpxu,jrhkgbpxusturiqiqqnpe,rhkgbpxusturiqiqqnpenyybnb -actojxbiftticnuzgpcvibzvkbetan,actojxbiftticnuzgpcv,jxbiftticnu,ct,v,bift,ctojxbiftticnuzgpcvib,tojxbiftticnuzgpcvibzvkbet -bzlmhxijwqldfexilujtndmsrobztx,bzlmhxijwqldfexilujt,hxijwqldfex,zl,t,ijwq,zlmhxijwqldfexilujtnd,lmhxijwqldfexilujtndmsrobz -wwqqydelweharhxlmbpnjjqvdsbdzt,wwqqydelweharhxlmbpn,ydelweharhx,wq,n,elwe,wqqydelweharhxlmbpnjj,qqydelweharhxlmbpnjjqvdsbd -pwmgmbcmaeirndkpxyqjcjehvkxxfe,pwmgmbcmaeirndkpxyqj,mbcmaeirndk,wm,j,cmae,wmgmbcmaeirndkpxyqjcj,mgmbcmaeirndkpxyqjcjehvkxx -vxfzpzdjnnotqnnkitafojpvitoacg,vxfzpzdjnnotqnnkitaf,pzdjnnotqnn,xf,f,djnn,xfzpzdjnnotqnnkitafoj,fzpzdjnnotqnnkitafojpvitoa -npqyoqksirwvqntptmrilnjuofuomr,npqyoqksirwvqntptmri,oqksirwvqnt,pq,i,ksir,pqyoqksirwvqntptmriln,qyoqksirwvqntptmrilnjuofuo -piwrxwppaaqsxgtvdlipghxbgsxcte,piwrxwppaaqsxgtvdlip,xwppaaqsxgt,iw,p,ppaa,iwrxwppaaqsxgtvdlipgh,wrxwppaaqsxgtvdlipghxbgsxc -lqekmmsuddbwxagorlmpoxfmzggmlk,lqekmmsuddbwxagorlmp,mmsuddbwxag,qe,p,sudd,qekmmsuddbwxagorlmpox,ekmmsuddbwxagorlmpoxfmzggm -avlyclruzkazfqhyxnppaafwcveolb,avlyclruzkazfqhyxnpp,clruzkazfqh,vl,p,ruzk,vlyclruzkazfqhyxnppaa,lyclruzkazfqhyxnppaafwcveo -dkmyfqhltlwzwwxyvshwrzrdmfyqdm,dkmyfqhltlwzwwxyvshw,fqhltlwzwwx,km,w,hltl,kmyfqhltlwzwwxyvshwrz,myfqhltlwzwwxyvshwrzrdmfyq diff --git a/inst/tests/bad.txt b/inst/tests/bad.txt deleted file mode 100644 index b01b7f31d1..0000000000 --- a/inst/tests/bad.txt +++ /dev/null @@ -1,409 +0,0 @@ -####################,##############,############################################### -#############,##############,0.000000000000000000 -#############,###########,0.0000000000000000000 -#############,##############,0.00000000000000000 -#############,#############,0.00000000000000000 -#############,#########,0.000000000000000000 -#############,################,0.00000000000000000 -#############,###############,0.000000000000000000 -#############,#################################,0.000000000000000000 -#############,########################,0.00000000000000000 -#############,####################,0.000000000000000000 -#############,#############,0.000000000000000000 -#############,############,0.000000000000000000 -#############,###########,0.0000000000000000 -#############,########,0.00000000000000000 -#############,###,0.0000000000000000 -#############,##################,0.000000000000000000 -#############,################,0.00000000000000000 -#############,##############,0.00000000000000000 -#############,#################,0.00000000000000000 -#############,###############,0.00000000000000000 -#############,###################################,0.00000000000000000 -############,##############,0.000000000000000000 -############,###########,0.0000000000000000000 -############,##############,0.000000000000000000 -############,#############,0.00000000000000000 -############,#########,0.00000000000000000 -############,################,0.000000000000000000 -############,###############,0.000000000000000000 -############,#################################,0.0000000000000000000 -############,########################,0.000000000000000000 -############,####################,0.00000000000000000 -############,#############,0.000000000000000000 -############,############,0.00000000000000000 -############,###########,0.00000000000000000 -############,########,0.00000000000000000 -############,###,0.000000000000000000 -############,##################,0.000000000000000000 -############,################,0.00000000000000000 -############,##############,0.000000000000000000 -############,#################,0.000000000000000000 -############,###############,0.00000000000000000 -############,###################################,0.00000000000000000 -###########,##############,0.000000000000000000 -###########,###########,0.0000000000000000000 -###########,##############,0.000000000000000000 -###########,#############,0.00000000000000000 -###########,#########,0.000000000000000000 -###########,################,0.00000000000000000 -###########,###############,0.000000000000000000 -###########,#################################,0.000000000000000000 -###########,########################,0.000000000000000000 -###########,####################,0.00000000000000000 -###########,#############,0.0000000000000000 -###########,############,0.000000000000000000 -###########,###########,0.00000000000000000 -###########,########,0.00000000000000000 -###########,###,0.0000000000000000 -###########,##################,0.000000000000000000 -###########,################,0.0000000000000000 -###########,##############,0.000000000000000000 -###########,#################,0.000000000000000000 -###########,###############,0.0000000000000000 -###########,###################################,0.00000000000000000 -############,##############,0.000000000000000000 -############,###########,0.000000000000000000 -############,##############,0.0000000000000000 -############,#############,0.0000000000000000 -############,#########,0.000000000000000000 -############,################,0.00000000000000000 -############,###############,0.0000000000000000 -############,#################################,0.000000000000000000 -############,########################,0.00000000000000000 -############,####################,0.00000000000000000 -############,#############,0.00000000000000000 -############,############,0.000000000000000000 -############,###########,0.00000000000000000 -############,########,0.00000000000000000 -############,###,0.00000000000000000 -############,##################,0.000000000000000000 -############,################,0.00000000000000000 -############,##############,0.00000000000000000 -############,#################,0.000000000000000000 -############,###############,0.00000000000000 -############,###################################,0.00000000000000000 -############,##############,0.000000000000000000 -############,###########,0.0000000000000000000 -############,##############,0.000000000000000000 -############,#############,0.0000000000000000 -############,#########,0.000000000000000000 -############,################,0.00000000000000000 -############,###############,0.000000000000000000 -############,#################################,0.000000000000000000 -############,########################,0.000000000000000000 -############,####################,0.000000000000000000 -############,#############,0.000000000000000000 -############,############,0.000000000000000000 -############,###########,0.00000000000000000 -############,########,0.0000000000000 -############,###,0.00000000000000000 -############,##################,0.000000000000000000 -############,################,0.00000000000000000 -############,##############,0.00000000000000000 -############,#################,0.000000000000000000 -############,###############,0.00000000000000000 -############,###################################,0.00000000000000000 -############,##############,0.000000000000000000 -############,###########,0.00000000000000000 -############,##############,0.000000000000000000 -############,#############,0.00000000000000000 -############,#########,0.0000000000000000000 -############,################,0.0000000000000000 -############,###############,0.00000000000000000 -############,#################################,0.000000000000000000 -############,########################,0.000000000000000000 -############,####################,0.000000000000000000 -############,#############,0.000000000000000000 -############,############,0.000000000000000000 -############,###########,0.00000000000000000 -############,########,0.00000000000000000 -############,###,0.000000000000000000 -############,##################,0.000000000000000000 -############,################,0.00000000000000000 -############,##############,0.000000000000000000 -############,#################,0.00000000000000000 -############,###############,0.000000000000000000 -############,###################################,0.00000000000000000 -############,##############,0.000000000000000000 -############,###########,0.0000000000000000000 -############,##############,0.000000000000000000 -############,#############,0.00000000000000000 -############,#########,0.000000000000000000 -############,################,0.000000000000000000 -############,###############,0.00000000000000000 -############,#################################,0.000000000000000000 -############,########################,0.000000000000000000 -############,####################,0.00000000000000000 -############,#############,0.000000000000000000 -############,############,0.000000000000000000 -############,###########,0.00000000000000000 -############,########,0.00000000000000000 -############,###,0.00000000000000000 -############,##################,0.000000000000000000 -############,################,0.000000000000000000 -############,##############,0.00000000000000000 -############,#################,0.00000000000000000 -############,###############,0.00000000000000000 -############,###################################,0.00000000000000000 -############,##############,0.000000000000000000 -############,###########,0.000000000000000000 -############,##############,0.0000000000000000000 -############,#############,0.00000000000000000 -############,#########,0.00000000000000000 -############,################,0.00000000000000000 -############,###############,0.000000000000000000 -############,#################################,0.00000000000000000 -############,########################,0.000000000000000000 -############,####################,0.000000000000000000 -############,#############,0.000000000000000000 -############,############,0.000000000000000000 -############,###########,0.0000000000000000 -############,########,0.00000000000000000 -############,###,0.000000000000000000 -############,##################,0.000000000000000000 -############,################,0.00000000000000000 -############,##############,0.000000000000000000 -############,#################,0.000000000000000000 -############,###############,0.00000000000000000 -############,###################################,0.00000000000000000 -############,##############,0.000000000000000000 -############,###########,0.000000000000000000 -############,##############,0.000000000000000000 -############,#############,0.0000000000000000 -############,#########,0.00000000000000000000 -############,################,0.00000000000000000 -############,###############,0.000000000000000000 -############,#################################,0.000000000000000000 -############,########################,0.00000000000000000 -############,####################,0.00000000000000000 -############,#############,0.000000000000000000 -############,############,0.0000000000000000000 -############,###########,0.00000000000000000 -############,########,0.00000000000000000 -############,###,0.00000000000000000 -############,##################,0.000000000000000000 -############,################,0.00000000000000000 -############,##############,0.000000000000000000 -############,#################,0.00000000000000000 -############,###############,0.00000000000000000 -############,###################################,0.00000000000000000 -#############,##############,0.0000000000000000 -#############,###########,0.0000000000000000000 -#############,##############,0.000000000000000000 -#############,#############,0.00000000000000000 -#############,#########,0.000000000000000000 -#############,################,0.00000000000000000 -#############,###############,0.000000000000000000 -#############,#################################,0.000000000000000000 -#############,########################,0.000000000000000000 -#############,####################,0.000000000000000000 -#############,#############,0.000000000000000000 -#############,############,0.000000000000000000 -#############,###########,0.00000000000000000 -#############,########,0.00000000000000000 -#############,###,0.000000000000000000 -#############,##################,0.000000000000000000 -#############,################,0.00000000000000000 -#############,##############,0.00000000000000000 -#############,#################,0.000000000000000000 -#############,###############,0.00000000000000000 -#############,###################################,0.00000000000000000 -###########,##############,0.0000000000000000000 -###########,###########,0.000000000000000000 -###########,##############,0.000000000000000000 -###########,#############,0.00000000000000000 -###########,#########,0.000000000000000000 -###########,################,0.0000000000000000 -###########,#################################,0.000000000000000000 -###########,########################,0.000000000000000000 -###########,####################,0.000000000000000000 -###########,#############,0.000000000000000000 -###########,############,0.0000000000000000000 -###########,###########,0.00000000000000000 -###########,########,0.00000000000000000 -###########,###,0.000000000000000000 -###########,##################,0.00000000000000000 -###########,################,0.00000000000000000 -###########,##############,0.00000000000000000 -###########,#################,0.000000000000000000 -###########,###############,0.00000000000000000 -###########,###################################,0.00000000000000000 -############,##############,0.00000000000000000 -############,###########,0.000000000000000000 -############,##############,0.00000000000000000 -############,#############,0.00000000000000000 -############,#########,0.000000000000000000 -############,################,0.00000000000000000 -############,###############,0.000000000000000000 -############,#################################,0.000000000000000000 -############,########################,0.000000000000000000 -############,####################,0.000000000000000000 -############,#############,0.000000000000000000 -############,############,0.000000000000000000 -############,###########,0.0000000000000000 -############,########,0.00000000000000000 -############,###,0.00000000000000000 -############,##################,0.000000000000000000 -############,################,0.00000000000000000 -############,##############,0.000000000000000000 -############,#################,0.000000000000000000 -############,###############,0.0000000000000000 -############,###################################,0.00000000000000000 -############,##############,0.000000000000000000 -############,##############,0.00000000000000000 -############,#############,0.0000000000000000 -############,#########,0.000000000000000000 -############,################,0.00000000000000000 -############,###############,0.000000000000000000 -############,#################################,0.00000000000000000 -############,########################,0.00000000000000000 -############,####################,0.000000000000000000 -############,#############,0.000000000000000000 -############,############,0.000000000000000000 -############,###########,0.0000000000000000 -############,########,0.00000000000000000 -############,###,0.00000000000000000 -############,################,0.00000000000000000 -############,##############,0.000000000000000000 -############,#################,0.000000000000000000 -############,###############,0.000000000000000000 -############,###################################,0.00000000000000000 -############,##############,0.00000000000000000 -############,##############,0.000000000000000000 -############,#############,0.00000000000000000 -############,#########,0.00000000000000000 -############,################,0.0000000000000000 -############,###############,0.000000000000000000 -############,#################################,0.000000000000000000 -############,########################,0.00000000000000000 -############,####################,0.000000000000000000 -############,#############,0.000000000000000000 -############,############,0.000000000000000000 -############,###########,0.00000000000000000 -############,########,0.00000000000000000 -############,###,0.000000000000000000 -############,##################,0.00000000000000000 -############,################,0.00000000000000000 -############,##############,0.000000000000000000 -############,#################,0.0000000000000000 -############,###############,0.00000000000000000 -############,###################################,0.00000000000000000 -############,##############,0.000000000000000000 -############,#############,0.0000000000000000 -############,################,0.00000000000000000 -############,###############,0.000000000000000000 -############,########################,0.000000000000000000 -############,####################,0.0000000000000000000 -############,#############,0.000000000000000000 -############,############,0.000000000000000000 -############,###########,0.00000000000000000 -############,########,0.0000000000000000 -############,###,0.00000000000000000 -############,##################,0.000000000000000000 -############,################,0.00000000000000000 -############,##############,0.000000000000000000 -############,#################,0.000000000000000000 -############,###############,0.00000000000000000 -############,###################################,0.00000000000000000 -############,##############,0.000000000000000000 -############,###########,0.000000000000000000 -############,##############,0.000000000000000000 -############,#############,0.0000000000000000 -############,#########,0.00000000000000000 -############,################,0.0000000000000000 -############,###############,0.00000000000000000 -############,####################,0.000000000000000000 -############,############,0.000000000000000000 -############,###########,0.00000000000000000 -############,########,0.0000000000000000 -############,###,0.00000000000000000 -############,################,0.00000000000000000 -############,##############,0.00000000000000000 -############,#################,0.00000000000000000 -############,###############,0.00000000000000000 -############,###################################,0.00000000000000000 -############,###########,0.0000000000000000000 -############,##############,0.000000000000000000 -############,#############,0.00000000000000000 -############,#########,0.00000000000000000 -############,################,0.00000000000000000 -############,###############,0.000000000000000000 -############,#################################,0.000000000000000000 -############,########################,0.000000000000000000 -############,####################,0.000000000000000000 -############,#############,0.000000000000000000 -############,############,0.00000000000000000 -############,###########,0.0000000000000000 -############,########,0.00000000000000000 -############,###,0.00000000000000000 -############,##################,0.00000000000000000 -############,################,0.00000000000000000 -############,##############,0.000000000000000000 -############,#################,0.000000000000000000 -############,###############,0.00000000000000000 -############,###################################,0.00000000000000000 -############,##############,0.000000000000000000 -############,###########,0.00000000000000000 -############,##############,0.000000000000000000 -############,#############,0.00000000000000000 -############,################,0.00000000000000000 -############,###############,0.000000000000000000 -############,#################################,0.000000000000000000 -############,########################,0.000000000000000000 -############,#############,0.000000000000000000 -############,###########,0.0000000000000000 -############,########,0.00000000000000000 -############,###,0.00000000000000000 -############,##################,0.0000000000000000000 -############,################,0.00000000000000000 -############,##############,0.00000000000000000 -############,#################,0.000000000000000000 -############,###############,0.00000000000000000 -############,###################################,0.00000000000000000 -############,###########,0.000000000000000000 -############,##############,0.00000000000000000 -############,#############,0.0000000000000000 -############,#########,0.000000000000000000 -############,################,0.000000000000000000 -############,###############,0.000000000000000000 -############,########################,0.000000000000000000 -############,####################,0.000000000000000000 -############,#############,0.0000000000000000 -############,############,0.000000000000000000 -############,###########,0.0000000000000000 -############,########,0.00000000000000000 -############,###,0.00000000000000000 -############,##############,0.000000000000000000 -############,#################,0.00000000000000000 -############,###############,0.000000000000000000 -############,###################################,0.00000000000000000 -###########,##############,0.000000000000000000 -###########,#############,0.00000000000000000 -###########,#########,0.000000000000000000 -###########,################,0.00000000000000000 -###########,###############,0.00000000000000000 -###########,#################################,0.000000000000000000 -###########,############,0.00000000000000000 -###########,###########,0.00000000000000000 -###########,########,0.00000000000000000 -###########,###,0.000000000000000000 -###########,################,0.00000000000000000 -###########,##############,0.00000000000000000 -###########,###############,0.00000000000000000 -###########,###################################,0.00000000000000000 -###########,##############,0.000000000000000000 -###########,#############,0.00000000000000000 -###########,################,0.00000000000000000 -###########,#################################,0.00000000000000000 -###########,####################,0.00000000000000000 -###########,############,0.00000000000000000 -###########,###########,0.00000000000000000 -###########,########,0.00000000000000000 -###########,###,0.00000000000000000 -###########,################,0.000000000000000000 -###########,##############,0.00000000000000000 -###########,#################,0.00000000000000000 -###########,###############,0.00000000000000000 -###########,###################################,0.00000000000000000 -#########,###############,0.0 \ No newline at end of file diff --git a/inst/tests/benchmark.Rraw b/inst/tests/benchmark.Rraw deleted file mode 100644 index d37dd24252..0000000000 --- a/inst/tests/benchmark.Rraw +++ /dev/null @@ -1,170 +0,0 @@ - -stop("WIP") - -# Speed test of chmatch vs match. -# sortedmatch was 40 times slower and the wrong approach, removed in v1.8.0. -# Example from Tom in Jan 2011 who first found and raised the issue with sortedmatch. -cat("Running 30sec (max) test ... "); flush.console() -n = 1e6 -a = as.character(as.hexmode(sample(n,replace=TRUE))) -b = as.character(as.hexmode(sample(n,replace=TRUE))) -test(529, system.time(ans1<-match(a,b))["user.self"] > system.time(ans2<-chmatch(a,b))["user.self"]) -test(530, ans1, ans2) -# sorting a and b no longer makes a difference since both match and chmatch work via hash in some way or another -cat("done\n") - - -# Test character and list columns in tables with many small groups -N = 1000L # the version in tests.Rraw has 100L -DT = data.table(grp=1:(2*N),char=sample(as.hexmode(1:N),4*N,replace=TRUE),int=sample(1:N,4*N,replace=TRUE)) -ans = DT[,list(p=paste(unique(char),collapse=","), - i=list(unique(int))), by=grp] -test(476, nrow(as.matrix(ans)), 2L*N) - - -# Test that as.list.data.table no longer copies via unclass, so speeding up sapply(DT,class) and lapply(.SD,...) etc, #2000 -N = 1e6 -DT = data.table(a=1:N,b=1:N,c=1:N,d=1:N) # 15MB in dev testing, but test with N=1e7 -test(603, system.time(sapply(DT,class))["user.self"] < 0.1) - - -# Tests on loopability, i.e. that overhead of [.data.table isn't huge, as in speed example in example(":=") -# These are just to catch slow down regressions where instead of 1s it takes 40s -if (.devtesting) { # TO DO: find more robust way to turn these on for CRAN checks -test(604, system.time(for (i in 1:1000) nrow(DT))["user.self"] < 0.5) -test(605, system.time(for (i in 1:1000) ncol(DT))["user.self"] < 0.5) -test(606, system.time(for (i in 1:1000) length(DT[[1L]]))["user.self"] < 0.5) # much faster than nrow, TO DO: replace internally -} -# TO DO: move to stress test script off CRAN ... -# DT = as.data.table(matrix(1L,nrow=100000,ncol=100)) -# test(607, system.time(for (i in 1:1000) DT[i,V1:=i])["user.self"] < 10) # 10 to be very wide margin for CRAN -# test(608, DT[1:1000,V1], 1:1000) - - -# Test faster mean. Example from (now not needed as much) data.table wiki point 3. -# Example is a lot of very small groups. -set.seed(100) -n=1e5 # small n so as not to overload daily CRAN checks. -DT=data.table(grp1=sample(1:750, n, replace=TRUE), - grp2=sample(1:750, n, replace=TRUE), - x=rnorm(n), - y=rnorm(n)) -DT[c(2,5),x:=NA] # seed chosen to get a group of size 2 and 3 in the first 5 to easily inspect. -DT[c(3,4),y:=NA] -tt1 = system.time(ans1<-DT[,list(mean(x),mean(y)),by=list(grp1,grp2)]) # 1.1s -tt2 = system.time(ans2<-DT[,list(.Internal(mean(x)),.Internal(mean(y))),by=list(grp1,grp2)]) # 1.1s -basemean = base::mean # to isolate time of `::` itself -tt3 = system.time(ans3<-DT[,list(basemean(x),basemean(y)),by=list(grp1,grp2)]) # 11s -test(646, ans1, ans2) -test(647, ans1, ans3) -# this'll error with `valgrind` because of the 'long double' usage in gsumm.c (although I wonder if we need long double precision). -# http://valgrind.org/docs/manual/manual-core.html#manual-core.limits -# http://comments.gmane.org/gmane.comp.debugging.valgrind/10340 -test(648, any(is.na(ans1$V1)) && !any(is.nan(ans1$V1))) -# test 649 removed as compared 1.1s to 1.1s -if (.devtesting) test(650, tt1["user.self"] < tt3["user.self"]) - -tt1 = system.time(ans1<-DT[,list(mean(x,na.rm=TRUE),mean(y,na.rm=TRUE)),by=list(grp1,grp2)]) # 2.0s -tt2 = system.time(ans2<-DT[,list(mean.default(x,na.rm=TRUE),mean.default(y,na.rm=TRUE)),by=list(grp1,grp2)]) # 5.0s -test(651, ans1, ans2) -test(652, any(is.nan(ans1$V1))) -if (.devtesting) test(653, tt1["user.self"] < tt2["user.self"]) - -# See FR#2067. Here we're just testing the optimization of mean and lapply, should be comparable to above -tt2 = system.time(ans2<-DT[,lapply(.SD,mean,na.rm=TRUE),by=list(grp1,grp2)]) -setnames(ans2,"x","V1") -setnames(ans2,"y","V2") -test(654, ans1, ans2) -test(655, abs(tt1["user.self"] - tt2["user.self"])<2.0) # unoptimized tt2 takes 30 seconds rather than 2. The difference between tt1 and tt2 is under 0.2 seconds usually, so 2.0 is very large margin for error to ensure it's not 30secs. - - -# Test for optimisation of 'order' to 'forder'. -set.seed(45L) -DT <- data.table(x=sample(1e2, 1e6,TRUE), y=sample(1e2, 1e6,TRUE)) -old = options(datatable.optimize=Inf) -t1 = system.time(ans1 <- DT[order(x,-y)])[['elapsed']] # optimized to forder() -t2 = system.time(ans2 <- DT[base_order(x,-y)])[['elapsed']] # not optimized -test(1241.1, ans1, ans2) -if (.devtesting) test(1241.2, t1 < t2+0.1) -# 0.2 < 3.8 on Matt's laptop seems safe enough to test. -# Even so, 1241.2 has been known to fail, perhaps if system swaps and this R sessions pauses or something? -# We shouldn't have timing tests here that run on CRAN for this reason. Hence wrapping with .devtesting -options(old) - - -# fwrite showProgress test 1735. Turned off as too long/big for CRAN. -if (FALSE) { - N = 6e8 # apx 6GB - DT = data.table(C1=sample(100000,N,replace=TRUE), C2=sample(paste0(LETTERS,LETTERS,LETTERS), N, replace=TRUE)) - gc() - d = "/dev/shm/" - # and - d = "/tmp/" - f = paste0(d,"test.txt") - system.time(fwrite(DT, f, nThread=1)) - file.info(f)$size/1024^3 - unlink(f) - # ensure progress meter itself isn't taking time; e.g. too many calls to time() or clock() - system.time(fwrite(DT, f, showProgress=FALSE, nThread=1)) - system.time(fwrite(DT, f, nThread=2)) - system.time(fwrite(DT, f, nThread=4)) - system.time(fwrite(DT, f, verbose=TRUE)) - f2 = paste0(d,"test2.txt") - system.time(fwrite(DT, f2, verbose=TRUE)) # test 'No space left on device' - unlink(f) - unlink(f2) - system.time(fwrite(DT, f2)) # try again, should work now space free'd - file.info(f2)$size/1024^3 - unlink(f2) -} - - -# test the speed of simple comparison -DT <- data.table(a = 1:1e7) -t1 = system.time(DT[a == 100])[3] -t2 = system.time(DT[which(a == 100)])[3] -# make sure we're at most 30% slower than "which" (should pass most of the time) -test(1110, (t1 - t2)/t2 < 0.3) - -# Fix for bug #5106 - DT[, .N, by=y] was slow when "y" is not a column in DT -DT <- data.table(x=sample.int(10, 1e6, replace=TRUE)) -y <- DT$x -te1 <- system.time(ans1 <- DT[, .N, by=x])[["elapsed"]] -te2 <- system.time(ans2 <- DT[, .N, by=y])[["elapsed"]] -test(1143.1, ans1, setnames(ans2, "y", "x")) -test(1143.2, abs(te1-te2) < 1, TRUE) - -# fwrite crash on very large number of columns (say 100k) -set.seed(123) -m <- matrix(runif(3*100000), nrow = 3) -DT <- as.data.table(m) -f <- tempfile() -system.time(fwrite(DT, f, eol='\n', quote=TRUE)) # eol fixed so size test passes on Windows -system.time(fwrite(DT, f, eol='\n', quote=TRUE)) # run again to force seg fault -test(1664, abs(file.info(f)$size %/% 100000 - 62) <= 1.5) # file size appears to be 34 bytes bigger on Windows (6288931 vs 6288965) -unlink(f) - -n=10000 -grp1=sample(1:50,n,replace=TRUE) -grp2=sample(1:50,n,replace=TRUE) -dt=data.table(x=rnorm(n),y=rnorm(n),grp1=grp1,grp2=grp2) -tt = system.time(ans <- dt[,list(.Internal(mean(x)),.Internal(mean(y))),by="grp1,grp2"]) -# test(120, tt[1] < 0.5) # actually takes more like 0.068 << 0.5, but the micro EC2 instance can be slow sometimes. -# TO DO: incorporate performance testing into R CMD check (using testthat?), that somehow copes with running on slow machines. -i = sample(nrow(ans),1) -test(121, all.equal(ans[i,c(V1,V2)], dt[grp1==ans[i,grp1] & grp2==ans[i,grp2], c(mean(x),mean(y))])) -# To DO: add a data.frame aggregate method here and check data.table is faster - - -# > 1e6 columns (there used to be VLAs at C level that caused stack overflow), #1903 -set.seed(1) -L = lapply(1:1e6, sample, x=100, size=2) -x = capture.output(fwrite(L)) -test(1742.1, nchar(x), c(2919861L, 2919774L)) # tests 2 very long lines, too -test(1742.2, substring(x,1,10), c("27,58,21,9","38,91,90,6")) -test(1742.3, L[[1L]], c(27L,38L)) -test(1742.4, L[[1000000L]], c(76L, 40L)) -test(1742.5, substring(x,nchar(x)-10,nchar(x)), c("50,28,95,76","62,87,23,40")) - -# Add scaled-up non-ASCII forder test 1896 - diff --git a/inst/tests/ch11b.dat b/inst/tests/ch11b.dat deleted file mode 100644 index 1570e0b282..0000000000 --- a/inst/tests/ch11b.dat +++ /dev/null @@ -1,100 +0,0 @@ -001 307 0930 36.58 0 -002 307 0940 36.73 0 -003 307 0950 36.93 0 -004 307 1000 37.15 0 -005 307 1010 37.23 0 -006 307 1020 37.24 0 -007 307 1030 37.24 0 -008 307 1040 36.90 0 -009 307 1050 36.95 0 -010 307 1100 36.89 0 -011 307 1110 36.95 0 -012 307 1120 37.00 0 -013 307 1130 36.90 0 -014 307 1140 36.99 0 -015 307 1150 36.99 0 -016 307 1200 37.01 0 -017 307 1210 37.04 0 -018 307 1220 37.04 0 -019 307 1230 37.14 0 -020 307 1240 37.07 0 -021 307 1250 36.98 0 -022 307 1300 37.01 0 -023 307 1310 36.97 0 -024 307 1320 36.97 0 -025 307 1330 37.12 0 -026 307 1340 37.13 0 -027 307 1350 37.14 0 -028 307 1400 37.15 0 -029 307 1410 37.17 0 -030 307 1420 37.12 0 -031 307 1430 37.12 0 -032 307 1440 37.17 0 -033 307 1450 37.28 0 -034 307 1500 37.28 0 -035 307 1510 37.44 0 -036 307 1520 37.51 0 -037 307 1530 37.64 0 -038 307 1540 37.51 0 -039 307 1550 37.98 1 -040 307 1600 38.02 1 -041 307 1610 38.00 1 -042 307 1620 38.24 1 -043 307 1630 38.10 1 -044 307 1640 38.24 1 -045 307 1650 38.11 1 -046 307 1700 38.02 1 -047 307 1710 38.11 1 -048 307 1720 38.01 1 -049 307 1730 37.91 1 -050 307 1740 37.96 1 -051 307 1750 38.03 1 -052 307 1800 38.17 1 -053 307 1810 38.19 1 -054 307 1820 38.18 1 -055 307 1830 38.15 1 -056 307 1840 38.04 1 -057 307 1850 37.96 1 -058 307 1900 37.84 1 -059 307 1910 37.83 1 -060 307 1920 37.84 1 -061 307 1930 37.74 1 -062 307 1940 37.76 1 -063 307 1950 37.76 1 -064 307 2000 37.64 1 -065 307 2010 37.63 1 -066 307 2020 38.06 1 -067 307 2030 38.19 1 -068 307 2040 38.35 1 -069 307 2050 38.25 1 -070 307 2100 37.86 1 -071 307 2110 37.95 1 -072 307 2120 37.95 1 -073 307 2130 37.76 1 -074 307 2140 37.60 1 -075 307 2150 37.89 1 -076 307 2200 37.86 1 -077 307 2210 37.71 1 -078 307 2220 37.78 1 -079 307 2230 37.82 1 -080 307 2240 37.76 1 -081 307 2250 37.81 1 -082 307 2300 37.84 1 -083 307 2310 38.01 1 -084 307 2320 38.10 1 -085 307 2330 38.15 1 -086 307 2340 37.92 1 -087 307 2350 37.64 1 -088 308 0000 37.70 1 -089 308 0010 37.46 1 -090 308 0020 37.41 1 -091 308 0030 37.46 1 -092 308 0040 37.56 1 -093 308 0050 37.55 1 -094 308 0100 37.75 1 -095 308 0110 37.76 1 -096 308 0120 37.73 1 -097 308 0130 37.77 1 -098 308 0140 38.01 1 -099 308 0150 38.04 1 -100 308 0200 38.07 1 diff --git a/inst/tests/colnames4096.csv b/inst/tests/colnames4096.csv deleted file mode 100644 index 7005227f17..0000000000 --- a/inst/tests/colnames4096.csv +++ /dev/null @@ -1 +0,0 @@ -Foo000,Bar001,Baz002,Qux003,Foo004,Bar005,Baz006,Qux007,Foo008,Bar009,Baz010,Qux011,Foo012,Bar013,Baz014,Qux015,Foo016,Bar017,Baz018,Qux019,Foo020,Bar021,Baz022,Qux023,Foo024,Bar025,Baz026,Qux027,Foo028,Bar029,Baz030,Qux031,Foo032,Bar033,Baz034,Qux035,Foo036,Bar037,Baz038,Qux039,Foo040,Bar041,Baz042,Qux043,Foo044,Bar045,Baz046,Qux047,Foo048,Bar049,Baz050,Qux051,Foo052,Bar053,Baz054,Qux055,Foo056,Bar057,Baz058,Qux059,Foo060,Bar061,Baz062,Qux063,Foo064,Bar065,Baz066,Qux067,Foo068,Bar069,Baz070,Qux071,Foo072,Bar073,Baz074,Qux075,Foo076,Bar077,Baz078,Qux079,Foo080,Bar081,Baz082,Qux083,Foo084,Bar085,Baz086,Qux087,Foo088,Bar089,Baz090,Qux091,Foo092,Bar093,Baz094,Qux095,Foo096,Bar097,Baz098,Qux099,Foo100,Bar101,Baz102,Qux103,Foo104,Bar105,Baz106,Qux107,Foo108,Bar109,Baz110,Qux111,Foo112,Bar113,Baz114,Qux115,Foo116,Bar117,Baz118,Qux119,Foo120,Bar121,Baz122,Qux123,Foo124,Bar125,Baz126,Qux127,Foo128,Bar129,Baz130,Qux131,Foo132,Bar133,Baz134,Qux135,Foo136,Bar137,Baz138,Qux139,Foo140,Bar141,Baz142,Qux143,Foo144,Bar145,Baz146,Qux147,Foo148,Bar149,Baz150,Qux151,Foo152,Bar153,Baz154,Qux155,Foo156,Bar157,Baz158,Qux159,Foo160,Bar161,Baz162,Qux163,Foo164,Bar165,Baz166,Qux167,Foo168,Bar169,Baz170,Qux171,Foo172,Bar173,Baz174,Qux175,Foo176,Bar177,Baz178,Qux179,Foo180,Bar181,Baz182,Qux183,Foo184,Bar185,Baz186,Qux187,Foo188,Bar189,Baz190,Qux191,Foo192,Bar193,Baz194,Qux195,Foo196,Bar197,Baz198,Qux199,Foo200,Bar201,Baz202,Qux203,Foo204,Bar205,Baz206,Qux207,Foo208,Bar209,Baz210,Qux211,Foo212,Bar213,Baz214,Qux215,Foo216,Bar217,Baz218,Qux219,Foo220,Bar221,Baz222,Qux223,Foo224,Bar225,Baz226,Qux227,Foo228,Bar229,Baz230,Qux231,Foo232,Bar233,Baz234,Qux235,Foo236,Bar237,Baz238,Qux239,Foo240,Bar241,Baz242,Qux243,Foo244,Bar245,Baz246,Qux247,Foo248,Bar249,Baz250,Qux251,Foo252,Bar253,Baz254,Qux255,Foo256,Bar257,Baz258,Qux259,Foo260,Bar261,Baz262,Qux263,Foo264,Bar265,Baz266,Qux267,Foo268,Bar269,Baz270,Qux271,Foo272,Bar273,Baz274,Qux275,Foo276,Bar277,Baz278,Qux279,Foo280,Bar281,Baz282,Qux283,Foo284,Bar285,Baz286,Qux287,Foo288,Bar289,Baz290,Qux291,Foo292,Bar293,Baz294,Qux295,Foo296,Bar297,Baz298,Qux299,Foo300,Bar301,Baz302,Qux303,Foo304,Bar305,Baz306,Qux307,Foo308,Bar309,Baz310,Qux311,Foo312,Bar313,Baz314,Qux315,Foo316,Bar317,Baz318,Qux319,Foo320,Bar321,Baz322,Qux323,Foo324,Bar325,Baz326,Qux327,Foo328,Bar329,Baz330,Qux331,Foo332,Bar333,Baz334,Qux335,Foo336,Bar337,Baz338,Qux339,Foo340,Bar341,Baz342,Qux343,Foo344,Bar345,Baz346,Qux347,Foo348,Bar349,Baz350,Qux351,Foo352,Bar353,Baz354,Qux355,Foo356,Bar357,Baz358,Qux359,Foo360,Bar361,Baz362,Qux363,Foo364,Bar365,Baz366,Qux367,Foo368,Bar369,Baz370,Qux371,Foo372,Bar373,Baz374,Qux375,Foo376,Bar377,Baz378,Qux379,Foo380,Bar381,Baz382,Qux383,Foo384,Bar385,Baz386,Qux387,Foo388,Bar389,Baz390,Qux391,Foo392,Bar393,Baz394,Qux395,Foo396,Bar397,Baz398,Qux399,Foo400,Bar401,Baz402,Qux403,Foo404,Bar405,Baz406,Qux407,Foo408,Bar409,Baz410,Qux411,Foo412,Bar413,Baz414,Qux415,Foo416,Bar417,Baz418,Qux419,Foo420,Bar421,Baz422,Qux423,Foo424,Bar425,Baz426,Qux427,Foo428,Bar429,Baz430,Qux431,Foo432,Bar433,Baz434,Qux435,Foo436,Bar437,Baz438,Qux439,Foo440,Bar441,Baz442,Qux443,Foo444,Bar445,Baz446,Qux447,Foo448,Bar449,Baz450,Qux451,Foo452,Bar453,Baz454,Qux455,Foo456,Bar457,Baz458,Qux459,Foo460,Bar461,Baz462,Qux463,Foo464,Bar465,Baz466,Qux467,Foo468,Bar469,Baz470,Qux471,Foo472,Bar473,Baz474,Qux475,Foo476,Bar477,Baz478,Qux479,Foo480,Bar481,Baz482,Qux483,Foo484,Bar485,Baz486,Qux487,Foo488,Bar489,Baz490,Qux491,Foo492,Bar493,Baz494,Qux495,Foo496,Bar497,Baz498,Qux499,Foo500,Bar501,Baz502,Qux503,Foo504,Bar505,Baz506,Qux507,Foo508,Bar509,Baz510,Qux511,Foo512,Bar513,Baz514,Qux515,Foo516,Bar517,Baz518,Qux519,Foo520,Bar521,Baz522,Qux523,Foo524,Bar525,Baz526,Qux527,Foo528,Bar529,Baz530,Qux531,Foo532,Bar533,Baz534,Qux535,Foo536,Bar537,Baz538,Qux539,Foo540,Bar541,Baz542,Qux543,Foo544,Bar545,Baz546,Qux547,Foo548,Bar549,Baz550,Qux551,Foo552,Bar553,Baz554,Qux555,Foo556,Bar557,Baz558,Qux559,Foo560,Bar561,Baz562,Qux563,Foo564,Bar565,Baz566,Qux567,Foo568,Bar569,Baz570,Qux571,Foo572,Bar573,Baz574,Qux575,Foo576,Bar577,Baz578,Qux579,Foo580,Bar581,Baz582,Qux583,Foo584,B \ No newline at end of file diff --git a/inst/tests/doublequote_newline.csv b/inst/tests/doublequote_newline.csv deleted file mode 100644 index cdd0ff5001..0000000000 --- a/inst/tests/doublequote_newline.csv +++ /dev/null @@ -1,40 +0,0 @@ -A,B -1,a -1,a -1,a -1,a -1,a -1,a -1,a -1,"embedded ""field"" -with some embedded new -lines as well" -2,"not this one" -1,a -1,a -1,a -1,a -1,a -1,a -1,a -1,a -1,a -1,a -1,a -1,a -1,a -1,a -1,a -1,a -1,a -1,a -1,a -1,a -1,a -1,a -1,a -1,a -1,a -1,a -1,a - diff --git a/inst/tests/fillheader.csv b/inst/tests/fillheader.csv deleted file mode 100644 index 7d33f6ee62..0000000000 --- a/inst/tests/fillheader.csv +++ /dev/null @@ -1,10 +0,0 @@ -"TLA NAME","CRASH ROAD","CRASH DIST","CRASH DIRN","INTSN","SIDE ROAD","CRASH ID","CRASH DATE","CRASH DOW","CRASH TIME","MVMT","VEHICLES","CAUSES","OBJECTS STRUCK","ROAD CURVE","ROAD WET","LIGHT","WTHRa","JUNC TYPE","TRAF CTRL","ROAD MARK","SPD LIM","CRASH FATAL CNT","CRASH SEV CNT","CRASH MIN CNT","PERS AGE1","PERS AGE2","EASTING","NORTHING" -"Ashburton District","ACTON ROAD","710","E"," ","MICHAEL ST","201400074","05/04/2014","Sat","2255","PO","CS1E","103A 198A 330A 724B 728B ","","R","W","DN","F "," "," ","C","100","1","0","0","18","","1522691","5154177", -"Ashburton District","ALFORD FOREST CEMETERY RO","2300","S"," ","ARUNDEL RAKAIA GORGE ROAD","201410392","01/01/2014","Wed","1753","CB","CS1","131A ","TX","R","D","BN","F "," ","N","N","100","0","1","0","","","1478333","5167504", -"Ashburton District","ALLENS ROAD",""," ","I","CARTERS ROAD","201413142","01/05/2014","Thu","0310","DC","CS2","103A 109A ","FT","R","D","DN","F ","T","N","N","070","0","0","1","","","1499605","5140547", -"Ashburton District","ANNE ST","80","S"," ","LAGMHOR ROAD","201449020","14/11/2014","Fri","1955","LB","CN14","303B 375B 929 ","","R","D","OF","F ","D","N","C","050","0","0","0","","","1496973","5136324", -"Ashburton District","ARUNDEL RAKAIA GORGE ROAD",""," ","A","ASHBURTON RIV BR","201440591","28/07/2014","Mon","1750","FA","VS1C","331A 386A ","","R","D","DN","F "," "," ","N","100","0","0","0","","","1481515","5170855", -"Ashburton District","ARUNDEL RAKAIA GORGE ROAD","280","N"," ","BARNSWOOD ROAD","201414273","21/07/2014","Mon","2138","CB","CS1","130A 410A ","P","R","D","DN","F "," ","N","C","100","0","0","1","","","1470313","5141026", -"Ashburton District","ARUNDEL RAKAIA GORGE ROAD","100","N"," ","HEENANS ROAD","201448141","09/11/2014","Sun","1755","DA","CN1","103A 129A 131A ","F","M","D","B ","F "," "," ","C","100","0","0","0","","","1471210","5154408", -"Ashburton District","ARUNDEL RAKAIA GORGE ROAD","20","N"," ","JAINES ROAD","201412050","28/03/2014","Fri","0703","FA","CS1C","181A 330A 191B ","","R","W","DN","F "," ","N","C","100","0","0","1","","","1468774","5137851", -"Ashburton District","ARUNDEL RAKAIA GORGE ROAD","3000","S"," ","LISMORE MAYFIELD ROAD","201436970","25/04/2014","Fri","1625","CB","4N1","129A 358A ","T","R","D","B ","F "," "," ","C","100","0","0","0","","","1471772","5144032", diff --git a/inst/tests/fread_blank.txt b/inst/tests/fread_blank.txt deleted file mode 100644 index cc7ffcc011..0000000000 --- a/inst/tests/fread_blank.txt +++ /dev/null @@ -1,48 +0,0 @@ -a,b,c -1,2,3 -1,2,3 -1,2,3 -1,2,3 -1,2,3 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -1,2,3 -1,2,3 -1,2,3 diff --git a/inst/tests/fread_blank2.txt b/inst/tests/fread_blank2.txt deleted file mode 100644 index 255978a20a..0000000000 --- a/inst/tests/fread_blank2.txt +++ /dev/null @@ -1,32 +0,0 @@ -a,b,c -1,2,3 -1,2,3 -1,2,3 -1,2,3 -1,2,3 - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/inst/tests/fread_blank3.txt b/inst/tests/fread_blank3.txt deleted file mode 100644 index c574684732..0000000000 --- a/inst/tests/fread_blank3.txt +++ /dev/null @@ -1,12 +0,0 @@ -a,b,c -1,2,3 -1,2,3 -1,2,3 -1,2,3 -1,2,3 - - - - - - diff --git a/inst/tests/fread_line_error.csv b/inst/tests/fread_line_error.csv deleted file mode 100644 index 1e290cfa9f..0000000000 --- a/inst/tests/fread_line_error.csv +++ /dev/null @@ -1,69 +0,0 @@ -3,2-0-6 4:2:7.4 HAV,2,7,0,2,4,RI Y#4,T/U,2,1,1,Q,,OX~JA LI~BC,,OZ~4~FB,,,,,5,,.Q8_2_0W_8_1_7_L-4-U-5_1YSV-S-3-5.X -4,2-1-3 4:6:2.1 MIC,4,,7,0,1,LN V#4,S/BK [LR QT],3,3,7,V RX IF: KU XB,VX~IE TW~LA,FP~NC IK~KJ,HV~4~FP,AW~5~SP,,,,,4,,.A5_0_2U_6_6_6_M-0-Z-2_0KJL-U-3-8.L -5,2-5-4 6:2:8.4 RUF,1,3,4,6,5,UO Y#2,O/VQ I K K ,8,5,3,P TN UP: YC PD,HT~AI OL~SL,LL~UX US~QO,OF~0~CU,IQ~3~PZ,,,,,1,,.M8_4_3Q_5_2_4_V-8-J-1_7SXB-O-6-7.J -8,4-5-8 2:6:0.2 NWF,3,,3,3,8,ZC S#2,P/HF [UU],5,1,3,P JZ: XT,RE~VL QW~IO,PF~ST KJ~JY,CG~8~EI,HF~3~RE,,,,,3,VS [CP] Z L A,.K3_8_0N_1_4_8_Q-0-C-6_3MOQ-K-2-7.C -4,4-5-8 6:0:2.0 GQP,5,0,6,4,2,DY Y#5,L/AH QE Q NL NY,5,8,4,R FZ: HO,,"WC ZA (5-8-6) 7 DHKABA ZA, SADGLRQ, WE 4~BWIR VD~BI",,"ZT ZJ (6-3-2) 5 LHXYPW NY, IWGFUFH, OF 1~6~DC",,,,,4,,.J0_0_4W_5_8_7_R-8-Q-3_7NXQ-E-8-2.S -6,4-5-5 1:8:3.8 PVV,2,6,2,7,5,YU G#8,H/BV O 'AC JB',7,0,3,L ZW DR,,EI 7~NDPR NX JV~WA,,IM 4~5~GR,,,,,1,,.C2_4_0V_5_0_8_V-5-O-8_0WVY-D-0-2.S -0,1-1-0 1:4:4.2 XIP,4,3,2,2,0,JA D#1,Q/MR T 'FV',1,6,8,Q HW,EY 5~ZLIQ IX AF~VM,HI 0~BWJJ ZF TU~TV,TI 2~7~KW,AT 7~8~JQK=8,,,,,2,,.R1_5_4B_4_0_8_J-0-I-5_4NFW-P-3-3.Q -1,4-4-2 2:0:6.6 YXJ,5,1,1,3,7,IP N#4,A/FI [IQ U],2,3,7,F IG U,,OG 8~JSJV KT MR~EF___R/G/H-O-R.R,,TW 0~1~WKC=4___B/P/O-E-S.F,,,,,4,,.G5_3_7L_3_0_4_F-0-L-4_2RUU-F-0-3.R -7,8-4-7 6:7:6.2 YTJ,5,,2,4,8,JJ N#3,K/TR Y O B ,6,5,1,"D #7 - OK K-V N Y#3 - SP A S-W S#5 - JS O W#0 - DC S Z#3 - SX Z#3 - PI C-R#3 - TQ M-V#5 - BN-P/D G#6 - QD E#1 - CX M#7 - XF Q I#4 - IU H#2 - OD R K/V T-W#6 - AL P U#7 - OA T K M -#8 - VY B (F)#0 - IH X#6 - WJ D-V Y#6 - IG I-S J#8 - TQ I D#7 - ID U#8 - QV C E T -#1 - DH M/Y#6 - ZJ Q T R -#2 - RJ Z O#7 - OC X Z (#1 - IA L B G#0 - UZ H#8 - DC X#1 - XD G M D#6 - VM W B#2 - QJ X J#8 - BQ R U#5 - OY T#3 - O-T L Q#8 - NB F B N#6 - PX M Q W#7 - UK H I#2 - MF N#7 - BG I#7 - LZ E X P R#0 - DE T Y#2 - VP S F#4 - OS V#6 - PH J E#0 - ZY A U S#0 - RV J R#3 - IC R#7 - MW G#3 - Z-B#7 - KC F Q#7 - K-L F#3 - AC A N#1 - SU B X-Y#8 - LI X Z- P#3 - MI D B-V#8 - LQ H-X F#3 - XX O-F B#6 - EB I F#7 - IN Y I#1 - SK H N#0 - AN Z H D#2 - YO V J#6 - XL.E X G#7 - OW U-T#6 - DZ N#5 - SU G N#6 - FC P F G#4 - D-B S#6 - BE R X#8 - BX L Z H#0 - HI S#0 - GX D O#0 - CR/H G#3 - HA Q-V J#5 - NN D H D#3 - WS Q D G#1 - L-K V M#1 - QD F I U#4 - OS H#8 - EN P S#7 - RQ/Z#2 - SY B#6 - TD G V#3 - IX U#7 - T-H G-M#1 - GS P Z#0 - ZT W C#2 - NN V T#7 - PG O W#7 - KI B E#3 - KB B-X G#8 - MY A#7 - XP R#8 - IM - R S#7 - VL D#7 - ZM R-O M#5 - LO W#2 - VB T U#8 - ID N M#,IO 4~POWB SV ML~SQ___A/E/Y-I-H.K,BE 4~MNSG NT MN~LZ___O/M/L-R-S.W,ZG 4~5~SWZ=1___J/F/K-H-S.F,UP 2~4~ZKH=7___W/R/Y-H-D.H,,,,,7,,.Y5_1_7M_1_3_8_A-2-D-5_7FCM-A-5-4.R -3,4-0-5 2:1:0.6 YAP,,,,,,SE Y#6,A/GU [CT >],7,7,7,,,,,,,,,,6,,.R7_1_8Y_5_5_2_D-6-X-0_6UUM-J-6-3.W -32,0-0-4 6:6:3.5 XJZ,,,,,,BZ T#3,W/UN [AT],4,2,7,,,,,,,,,,8,,.U5_5_8H_7_6_0_U-5-J-7_2GNY-J-3-5.X -31,3-0-7 4:1:7.5 HVV,,,,,,NK K#6,TT A R,4,4,7,,,,,,,,,,5,,#O,M,B.Y,Q.B,N.O,U.M.V,G.P.J,L,J,G.L,C.G,P,O.U,L.Y.U,F.W.D,H.N.R,S.R.N,N.R,A.N,G.N,H.EHE,R,S,V -42,2-3-8 0:4:4.7 YOB,4,5,4,3,4,YM D#2,J/G,0,6,7,G,,GF~PY OE~IW,,NM~7~MV,,,,,3,,.X2_7_2H_1_8_6_S-1-Y-8_2SDZ-T-6-0.X -43,8-2-5 0:6:7.5 DKY,3,,8,5,7,HD K#6,X/FL [RW SK],6,7,1,J CO EC: LU VO,YC~PR XU~GV,QX~VK GC~LR,RP~7~OI,YB~0~UR,,,,,3,,.Z1_3_2G_8_5_1_E-1-Z-2_1XHH-Y-3-1.H -73,8-1-6 7:5:2.5 CZB,8,7,3,4,5,ZD A#7,A/JK O C L ,3,0,1,N DT WY: WC UU,GR~XX AG~DG,JR~VN VX~AF,ZK~5~GG,GY~0~WC,,,,,5,,.D4_2_4T_0_7_8_R-6-H-3_4XSR-C-3-4.F -00,1-7-6 6:2:5.1 TAX,0,,1,1,8,NR P#5,O/IF [JL],2,8,1,O FD: GT,XA~DD QO~OP,ZQ~ES GO~XR,PX~8~LR,UG~0~CQ,,,,,5,LV [IZ] R S U,.Z3_5_3K_1_1_2_M-7-P-1_2WUR-T-8-7.F -60,1-3-3 1:3:2.8 VSC,1,7,5,6,4,DU C#8,V/DD MO B WU JL,3,2,8,E WR: WB,,"JU MW (7-5-5) 4 ZGKIRMRLJ LJ, QVQPMBPTZUVP, KK 7~JBMJ JD~WF",,"ZQ CP (5-1-2) 2 WEUCFZTKY FL, NPSTRXNZNLEB, YW 8~7~UI",,,,,0,,.X1_7_4M_3_6_2_B-3-L-8_7WWD-F-0-8.Q -04,4-8-5 4:0:8.8 DQU,0,0,0,5,7,LF X#7,D/WD X 'MU EV',7,4,5,T JU MB,,FY 2~PPCQ QC LR~AG,,EV 1~4~PS,,,,,2,,.F7_5_2J_3_3_3_D-5-Z-1_5KWT-L-4-6.R -05,6-1-2 0:3:6.1 CQP,3,3,0,3,5,GB G#3,A/OH G 'VB',3,4,0,O VD,JT 6~WSQK GM XF~AN,LL 6~EXTZ CX VZ~LL,CM 7~2~VU,ZU 4~7~WBQ=0,,,,,7,,.X8_3_2S_6_5_7_J-1-B-8_5LDR-I-6-6.R -66,8-5-6 5:7:0.8 QQX,0,8,3,7,4,RR K#1,V/TO [IR Q],7,8,4,O QH Q,,IK 5~XHED HG WB~KZ___W/G/P-C-J.K,,BH 5~8~RTY=5___X/G/O-B-I.M,,,,,1,,.A8_5_5O_3_5_8_B-5-H-3_8XGC-O-4-5.P -37,3-6-3 1:7:3.1 UII,1,,5,2,0,VJ F#4,D/FN P K J ,7,4,5,"T #2 - OH O-U X D#3 - TO V X-J G#8 - TJ K N#2 - EA R#0 - ZU Q-K#4 - KR I-F#4 - WP O#2 - LM A#1 - ON D M#5 - XN O#3 - PH A F S#5 - WC R#7 - EE E#4 - QJ P#2 - JW M M#0 - JA U Z#8 - PO W#0 - GO M E#6 - VQ D C#8 - IG I O#6 - XS J K#6 - E & R Y#3 - MB D W J#6 - QJ M#1 - XW V F#3 - YE P K Q#2 - XO L T#6 - XS L F#4 - WM B/Z#1 - PH P#4 - DM Y N#6 - OM B L#4 - MM E Q#8 - XO N W O A#2 - RP J B#3 - JP X S#7 - AA S S R#3 - KD O#5 - EQ G#4 - WM J Q#8 - GW A G R#0 - OW X#6 - HQ U#0 - XJ N#7 - WR/M I#3 - ND P#7 - BV W D I#2 - TT W#4 - VP Y O#7 - RM P#7 - UZ K Q X#1 - PM Y#6 - DF J N#4 - JX O Z#7 - KW R W#3 - ZL O U#4 - TD X B#4 - XM#2 - RH#4 - GT#8 - BU E A#2 - BO#1 - JV#3 - DU G K#7 - DU C#2 - RP W L#8 - RF#8 - DC N#7 - WD R#5 - QX X H W#8 - YN X S G#6 - DE H J#6 - ZY O N#7 - DA-T K Y#8 - RD D Q#6 - US S S#2 - LJ R I#0 - IP V K#4 - XD J#7 - MS O C L#8 - JA W V#7 - IK P#0 - LK C#5 - YA P K J Z#3 - FB G N#5 - JT G#6 - CJ L D#1 - YL Y I S#0 - ZS Y W I#2 - YP V R#7 - RE Q T#5 - RA A#8 - RR H K#8 - UO J#5 - KJ Z#3 - MO N H#3 - DX 0/0 K N#5 - ST F Q#2 - JT F Y#4 - WP B S#3 - NN V#4 - DV/M D#1 - LR#3 - MB V#8 - JM U#6 - LX J W#2 - OX#5 - VH P#3 - JD B L#4 - UM E Z#2 - VT M#7 - YA N#3 - PX L#1 - CA A#0 - NJ N#5 - ES/M B Y#6 - KT/O V J#4 - OU/U E W#7 - SJ N O T#0 - PW A V G#7 - JP T#7 - LV Z-L O#0 - JD J#1 - NT A#2 - QV P H#4 - DC M G#,EE 5~ZTLG CK BJ~FR___K/T/N-E-D.T,FF 1~HZKW YA RI~KR___U/B/K-C-Q.G,YP 8~7~HBN=1___Y/C/A-F-Q.L,RR 3~8~OIZ=7___S/O/P-H-A.O,,,,,7,,.A5_0_1E_8_5_3_I-5-N-4_7RSS-U-3-5.E -8,6-4-8 8:3:1.6 TAB,,,,,,CT U#3,S/QB [OW >],4,3,4,,,,,,,,,,6,,.E8_7_8W_8_4_3_M-1-H-7_4NAB-Q-2-2.K -4,3-8-4 5:4:2.5 TZQ,,,,,,RT A#5,L/XQ [FW],8,0,5,,,,,,,,,,2,,.X8_6_5J_7_1_3_H-2-P-8_3AJN-T-8-1.G -8,3-4-7 6:3:4.3 UTS,,,,,,VM U#1,AI L R,3,3,1,,,,,,,,,,8,,#U,C,Z.Y,I.Q,D.U,I.H.F,B.Q.R,C,M,A.R,I.S,H,Y.W,L.A.B,J.N.E,Z.D.Q,K.U.S,T.C,C.I,G.P,Z.UVV,E,I,D -1,0-6-3 3:2:2.2 JRF,8,8,3,8,4,CW E#0,Y/S,4,3,1,Y,,CZ~HC PA~CZ,,YE~4~JD,,,,,0,,.J3_4_5Y_8_0_7_B-4-W-4_0BVK-C-4-8.C -3,6-0-8 3:4:8.4 RBA,8,,4,3,1,SU K#5,N/DB [FI YM],3,5,1,D BA NR: TR KS,PS~BN EI~IS,EH~XD OX~TE,YP~5~GN,FL~7~QD,,,,,1,,.I1_0_4F_5_4_8_Q-0-S-8_4RFJ-Z-1-7.L -4,0-3-8 6:8:5.7 SWO,2,2,6,5,4,DO B#3,K/UQ X X U ,0,0,4,X ZM HP: WE LE,GQ~UD VR~CT,JY~CX ZJ~BU,FP~1~XG,CL~0~AE,,,,,2,,.P2_6_8H_7_5_7_X-5-H-2_2BBT-G-0-0.Z -3,6-5-5 0:8:5.1 BVF,,,,,,IC B#4,Z/WN [FX],1,7,5,,,,,,,,,,6,YV [IJ] E Y R,.V8_1_1C_2_0_5_H-7-H-7_1RHX-A-5-0.G -6,5-3-6 8:6:7.5 ERK,3,8,2,3,5,JV T#1,S/ET WR F UX ID,3,6,4,R HH: XV,,"CW BE (7-7-3) 4 KIWFPXJXN NZ, SOTNRINKIO, VY 8~JSGW BI~XX",,"XF OT (1-1-3) 5 WNPAQEUDE TA, ILWAPWMVVQ, BS 3~1~FU",,,,,6,,.Z7_4_0A_2_8_8_E-8-S-5_8UVU-F-3-2.I -1,5-6-4 3:6:3.1 WWT,2,5,6,6,4,TY L#4,G/WT M 'VP TZ',4,1,1,P WM CX,,WT 1~ZOVQ NF MF~KV,,MA 7~0~DG,,,,,0,,.F6_7_7U_2_2_2_X-6-Q-0_1NQD-T-0-3.R -0,8-8-5 1:3:1.8 AMA,5,8,7,4,6,TN P#2,Y/ID E 'XH',6,6,2,W FB,EC 7~HAEK VZ FW~EJ,EI 5~LAKE QM OQ~IB,EL 8~4~PA,WH 3~0~HJG=3,,,,,5,,.G2_3_7Q_2_5_1_Z-6-Q-3_6YVL-L-2-3.R -0,3-1-8 0:6:1.4 QPY,7,1,7,2,1,EC D#6,I/GA [MV O],0,3,2,Y,,YL 8~GLOC VN SG~KI___H/B/V-S-I.R,,HF 7~5~KUT=6___W/Y/P-M-I.T,,,,,2,,.A4_6_0P_0_4_7_G-4-K-6_2KTE-L-8-4.Y -4,6-8-8 3:6:0.5 NOR,8,,1,2,4,BA E#6,G/MB M X H ,1,6,7,"D #6 - BB H-M P J#5 - SM R J Z K#8 - OH J R#2 - BO O S#6 - PG U G#4 - AF A#7 - TL I-F#2 - CA M-V#1 - VF T#7 - ND W S H#0 - SI - T L#4 - QS G H X#3 - RM Q M/C V-Q#0 - FT B#8 - SX T#2 - ZW D Y S M#1 - EC B E U#0 - CS C (V)#0 - GC#4 - VN T#3 - MW J A#4 - LD N V K#4 - NY B Z#5 - GJ S W#1 - FO C N D#4 - ME Q W D A#3 - VU Q P N#2 - OC I#4 - NI B#1 - CL D N C U#7 - PT D N K#0 - PK R T#4 - YI I W#1 - JX R (N)#2 - BB D (V)#0 - JB H H#2 - RA X H#6 - YP A F D#7 - XF W#1 - YK Z#4 - WM T L#5 - CM I E Q#0 - OV D 2#3 - IK V 5#2 - NP Y 3#3 - ZI F 4#3 - GO/U G#1 - GS I (G)#2 - HX F L L#4 - VX O#3 - FT M#6 - OB B A#6 - LU G M#4 - OV H V#4 - XN Y Q#4 - TY F J#2 - JW H L#0 - VA#3 - FL#6 - JB#7 - FR#8 - MP#8 - AZ Q V#8 - YM F L#3 - JU F#5 - IF O#5 - HE S C W#4 - CG W S J#0 - NO L E#5 - KO I U#5 - HH-K X U#6 - YR J V#2 - YD H W#4 - BF A D#2 - TJ Y#0 - NP K#7 - GJ Z U L#0 - NX M#6 - JS M E M V-G#7 - JO J I#4 - MY T C#0 - YR B#2 - BH K V#2 - FF T B E#4 - BE A Z#1 - PP R M#1 - FR B#1 - QU U K#4 - BD 6/5 G S#8 - ZA Q J#0 - KM E O#3 - HE J O E#5 - YS Y#2 - UX H#3 - OR#1 - SU X#0 - ZD O#0 - IC O H#1 - PV N#0 - JT F F#6 - MK J#6 - QM K#1 - QS Q#6 - KD T#8 - BO E#2 - DQ/P B L#3 - ET/A B E#7 - GN/X O I#0 - RH F B M#1 - MG B G U#6 - EQ H F I#2 - MQ J#0 - MD K O#,GC 7~PENK UI SV~HR___Y/M/G-U-M.L,EL 2~ABUU LO FH~JM___G/Y/Q-L-P.U,JB 6~4~UXG=0___Y/O/M-D-Z.U,UQ 2~2~RES=1___Y/I/E-J-V.H,,,,,2,,.Y5_8_2D_3_8_6_Z-0-K-4_3VRF-H-5-7.R -8,0-7-2 3:0:6.8 DFS,,,,,,JA L#0,I/KT [YM >],7,1,6,,,,,,,,,,2,,.X4_0_3Y_6_4_1_M-7-K-1_7JYJ-A-0-2.A -7,7-0-8 2:2:0.0 DZE,,,,,,RW F#6,K/SA [NJ],4,7,0,,,,,,,,,,0,,.P3_5_8X_4_0_0_H-8-L-8_0UJI-F-0-3.I -7,5-7-1 5:6:0.8 UVP,,,,,,GC T#1,PP W V,5,2,1,,,,,,,,,,3,,#G,N,M.J,V.Z,Y.C,I.A.Y,T.H.Y,B,R,U.C,D.H,N,K.I,T.Q.R,H.F.T,A.Y.V,G.O.G,T.R,F.Q,Z.U,V.ACI,N,S,R -8,4-3-1 3:2:1.2 XYP,1,6,5,2,1,CT R#3,R/R,5,4,0,S,,QS~CX FS~QR,,KR~6~GD,,,,,8,,.M6_8_5P_3_1_4_W-7-U-5_4IST-X-5-0.A -6,5-6-8 1:1:1.1 UGK,3,,5,5,5,WO Y#8,V/OP [AM RF],5,0,8,O LG DH: ID JZ,IT~SP DI~CB,DG~IZ EA~OG,JR~3~FO,XQ~8~AR,,,,,2,,.T7_3_2H_1_5_2_X-0-Y-3_3HQX-Y-2-1.J -2,2-6-7 6:7:8.0 ZCI,8,1,2,8,7,EJ S#6,L/EQ Q Q K ,7,3,6,G US LD: YN EA,LG~QE DZ~AR,IV~BS SQ~CY,QR~2~XJ,BJ~8~EW,,,,,7,,.F1_3_1C_3_8_0_Q-6-Z-4_1WLV-G-5-5.U -0,6-6-0 5:6:1.4 LNI,,,,,,ZG U#5,V/FH [EN],3,8,1,,,,,,,,,,1,MM [JE] O A H,.W0_6_0Y_1_5_7_B-0-S-5_7VSF-W-8-7.L -1,6-3-8 8:7:5.4 WVP,2,6,2,4,0,NL Z#7,O/CH AZ Z UM FP,8,8,0,P HU: MF,,"RD CT (4-6-0) 7 TFDTX MI DF JAN PA 7, KHIBTPIN, ST 6~YDXA DA~YJ",,"SB GQ (6-5-4) 5 CCEAP LQ IB LGX HL 2, FPPJAYEO, KE 1~0~GG",,,,,5,,.I4_2_6L_6_0_7_F-0-C-0_6BGG-S-0-0.R -4,2-5-5 3:4:4.1 VMF,1,1,4,3,5,XT H#1,V/JL A 'MQ VN',5,1,4,M NM FA,,AD 4~YTDX DC AB~FX,,BQ 8~5~EF,,,,,1,,.R4_3_7U_6_5_1_O-0-R-0_2JGX-P-8-1.F -7,7-0-3 1:3:8.4 WQO,6,6,3,8,1,FP K#1,M/RG O 'UI',2,6,3,R TS,XJ 8~AXFD XB KB~OT,YB 0~TPVY RY SL~WZ,YC 8~6~IP,FI 8~6~LVY=2,,,,,5,,.M5_8_0A_4_1_4_C-2-H-1_0QUX-V-3-1.G -1,4-1-2 5:2:6.1 HHF,5,4,6,6,0,NY Q#8,W/BS [SN B],3,4,0,D ZW Y,,WK 3~UMJT PZ XD~LJ___G/D/R-U-J.H,,LO 7~5~XUY=3___Q/A/R-R-F.A,,,,,3,,.L3_2_5G_0_3_2_K-3-Q-8_5QQP-I-5-5.E -6,6-4-0 3:6:4.0 TMP,8,,0,7,6,GH X#8,C/KM Y F V ,3,1,0,"Q #0 - HG A-Q C Q#4 - HS O A-C V#6 - KX I#8 - RJ W-O#2 - SH I-I#3 - NU P#0 - WB A#2 - UZ F#5 - FT V#8 - HS K T X#4 - VS Q#3 - RC E#6 - SJ C#1 - HV P S#2 - HY V P#3 - JH Z#0 - LE Z X#3 - RF Y Z#5 - XU Y U#4 - GW B L#6 - MT V J L#4 - US D I D#5 - HD R#3 - CI I M#1 - QR D B W#4 - JF L T#6 - HL L K#3 - HU K/D#2 - JH C#8 - SY B W#4 - LB H L#1 - WL M C#1 - UX F N#4 - UK Y#8 - DI Q#0 - CY N A#4 - VA S M M#5 - XM C 2#0 - AH Y 8#3 - EF K 2#0 - YI O 8#7 - IQ/K W#0 - EQ H#8 - CD Q O#7 - JL O#5 - NP H N W#1 - PC F#1 - AC K E#0 - MY O N#1 - VH V W#1 - MK F V#2 - EY Z E#6 - UU#8 - KT#7 - FN#8 - AE K K#0 - YA#2 - ZX#7 - LY Y P#6 - CZ C#4 - EE V A#7 - RA#4 - OS C#3 - UW I#5 - UB L H X#6 - AD Z V G#1 - EL B K#2 - BA T M#5 - CC-R N A#3 - MW L L#7 - AE I P#8 - NI S Z#3 - RU G I#0 - PK R#0 - PE G V M#1 - DH G I#5 - ZM H N#5 - DC X#5 - FV K#5 - AJ Q G U K#2 - VX R N#4 - QF Z#4 - DG C N#6 - HJ Q V Q#7 - NA G G#6 - ET S Q#1 - YN E#1 - FK T R#7 - UR A V#7 - UK 1/2 F X#0 - UB H P#2 - VO V M#1 - UB V T J#4 - YU T#3 - AP/Q X#6 - BD E T#8 - KF#4 - PU H#1 - AD W#0 - PN Z D#3 - EK M#6 - BH N#2 - QS G B#4 - JT V H-C#2 - LF Q#0 - KY M#5 - HV O#4 - TJ A#4 - SG W#2 - WZ T#2 - LW/U P F#8 - LG/E L B#6 - EY/T E Q#5 - FB J#8 - EY - Z R#0 - EQ Q#7 - NT Q#5 - XL A G#,CM 1~OSKA GM YJ~FT___I/G/X-Q-B.J,QR 2~AGXF XM BT~JY___M/E/H-V-M.F,SN 1~1~BUA=5___U/U/O-G-A.I,XL 0~7~GKZ=3___V/F/P-M-N.A,,,,,6,,.D0_5_2O_4_7_2_E-6-C-2_3PJV-A-8-3.H -8,3-6-5 3:1:6.5 CXO,,,,,,BG Y#2,X/DO [ZM >],6,8,1,,,,,,,,,,2,,.W5_2_1A_7_0_8_T-8-S-8_8QMR-V-3-7.S -1,8-0-1 1:1:0.4 YYA,,,,,,RK V#5,Z/PP [PG],1,0,0,,,,,,,,,,2,,.U3_0_6Z_6_1_6_N-4-J-4_7OCG-L-8-2.N -7,7-8-4 3:8:4.4 UNN,,,,,,ED G#3,TH V S,8,1,1,,,,,,,,,,3,,#S,B,K.X,W.B,Z.T,Z.I.G,J.D.E,V,R,K.D,Y.Y,M,X.R,I.Z.U,R.X.O,C.J.F,T.S.G,D.U,Q.Y,N.Z,W.LEU,J,W,J -0,7-0-1 8:1:6.0 WNL,3,8,8,0,5,IO Z#4,G/C,3,4,1,C,,GG~YA OO~DY,,WH~3~XU,,,,,0,,.Q1_6_8P_3_3_7_B-3-L-4_1IVB-T-8-7.Q -1,5-2-3 2:0:6.8 OZK,0,,8,2,0,LO M#5,J/TZ [JB WX],0,7,8,H HD GG: TZ KO,MV~UI EB~KI,WQ~CV RX~IY,MA~3~EY,LH~0~JJ,,,,,3,,.M4_5_3S_2_3_1_H-0-Z-1_4IXO-G-6-1.F -0,8-6-8 8:6:7.4 QMK,1,6,2,0,7,XU S#3,H/FJ P O U ,1,3,1,H KY XN: FK DQ,WD~DC QY~PC,VI~UA FC~QL,ZJ~1~HF,XM~1~SI,,,,,1,,.W5_4_8L_4_7_7_P-6-D-0_7KGP-K-7-5.Q -6,0-3-0 4:6:8.8 VWA,8,,7,0,6,EA Y#8,P/CJ [IC],2,0,2,Y DL: TU,MP~CA JO~NW,ZK~NC EH~PE,AN~1~JD,HT~3~RI,,,,,8,LV [EO] M C R,.J0_8_1V_5_6_5_Q-2-M-6_8LIG-V-4-2.G -6,8-4-3 3:4:2.6 JMA,2,6,1,2,2,FP W#4,H/ZB AR H WJ GS,0,8,2,R PD: AQ,,"DG DC (8-4-0) 7 BEDE ZASLK TA, MCQABRT, BO 8~DQKU NV~FE",,"YY ZT (7-7-3) 3 XJRK SZYWB DB, IFXPFAV, YT 1~4~TQ",,,,,6,,.F6_6_4Y_5_0_6_U-8-I-5_4BXI-Q-8-5.V -7,6-1-8 2:5:4.3 SIM,7,0,8,7,4,UV M#0,J/RM Z 'SM SX',1,6,5,A RF ZX,,AF 5~MRCV QY KI~VG,,LG 3~1~CK,,,,,4,,.Q5_1_5P_3_1_3_A-6-F-0_7QBH-N-5-8.J -2,4-8-7 7:4:5.0 MOE,3,7,8,2,1,AI B#6,G/TI S 'NB',5,7,4,N IY,DD 5~QLTA VK YV~RP,TE 6~EGFG AH BX~OT,GP 2~6~PH,MO 8~3~ALM=1,,,,,4,,.E1_7_7F_5_7_3_W-0-R-7_2CXX-Z-7-2.Z -2,0-2-3 8:2:1.7 WUW,8,1,5,3,0,FU L#3,C/ON [GA T],5,6,7,A HK E,,AI 7~FVYO IQ BE~JK___X/X/K-M-V.M,,IP 1~5~KDZ=0___N/Y/M-J-Y.F,,,,,4,,.V5_1_8L_7_7_8_Z-3-X-4_8SQA-A-1-7.A -6,3-6-3 4:5:0.6 POL,6,,3,2,7,WU E#8,J/TD C B B ,5,2,6,"X #2 - TH X-H E Q#8 - TW I D-I I#4 - OP K#2 - FC N-F#6 - UL C-C#5 - KI J#7 - SP Y#4 - DI K#7 - NX G S W#0 - YE Q#3 - NY M#2 - SM Q#5 - GC X A#1 - BC P U#8 - EW S#1 - KS U L N#6 - AX U I#1 - XY P P#8 - CI A B#4 - WW G A Q#0 - AY K J K#8 - AA Q#3 - VY E P#0 - GF P E U#1 - XB P A#7 - IU N A#3 - MK M/O#0 - OR A#0 - OX Z V#7 - WE E V#2 - OH X U#4 - BI A Q#4 - CK V E#0 - QP N#2 - KZ P#1 - GQ H X#7 - GB Q F H#2 - DS R 1#2 - BM D 0#5 - OZ Y 5#8 - VG B 7#2 - ET/B Q#8 - SB P#6 - DV E H#7 - TB J Q#5 - RK I Y#1 - UT U H#0 - KR R F#1 - TR P E#6 - LG N P#6 - RV V Q#1 - GX#3 - DL#7 - SR#1 - YX S I#1 - FG!#0 - AP#2 - GG N L#4 - HY H#1 - NS R C#1 - GP#7 - CO W#1 - ZD K C W#3 - DZ L N N#7 - HR D#6 - VJ K V#1 - SE-J L R#8 - WW R Y#0 - YI D V#8 - US L Y#6 - BT Q A#4 - HM P Y B#5 - JH C A#7 - HC G#2 - OG O#8 - HM A X L D-C#1 - RO T Z#3 - EB M#7 - MD C E#3 - DN D J B#3 - UL P K#5 - ID J G#0 - YU F#6 - GU K D#8 - LR D X#8 - FQ 1/4 U Y#7 - UH K V#4 - KU U X#4 - AD B Q F#3 - SF T#1 - OG#1 - UL E#2 - MQ X#4 - DD S D#4 - RK T#2 - EJ D#3 - AT O G#7 - MG, Y & U#2 - LQ F#8 - PE J#6 - TU Z#7 - QX Z#4 - QA A#0 - DO/U T E#1 - SM/I B W#0 - AU/B R G#8 - RW J L P#4 - XU L F H#0 - BO H O S#6 - JY - X X#6 - SG R#7 - DG I#7 - YW R - D/O#4 - BE X H#,DA 0~YYFK LM IX~CF___U/I/C-P-L.U,BV 0~IQZK BD XZ~YC___D/R/V-D-X.K,AO 8~8~DGE=7___Q/A/P-U-K.H,PA 1~8~OZU=8___N/Y/B-A-E.H,,,,,2,,.Z5_5_6F_1_2_5_H-6-X-0_6HUX-Q-4-2.E -0,8-3-5 8:3:1.7 HOA,,,,,,FJ V#7,Z/KQ [AA >],6,2,1,,,,,,,,,,5,,.R7_1_7O_6_1_7_S-7-H-8_7YYL-Y-2-1.Q -8,2-1-5 3:7:4.6 ZNW,,,,,,IV J#7,M/XA [OO],0,1,2,,,,,,,,,,5,,.P5_6_3S_5_3_0_P-0-N-3_2URR-O-1-7.C -8,2-5-0 5:0:3.0 FXN,,,,,,AT F#1,WX I I,6,8,3,,,,,,,,,,8,,#V,I,N.K,L.Y,C.V,D.B.T,K.E.M,L,Q,R.Y,J.L,L,V.Z,E.Y.R,F.F.G,O.W.R,N.U.Z,E.P,B.T,Q.Y,Z.UOD,S,Y,J -8,3-3-3 1:8:2.3 TOO,3,8,2,1,3,YA I#5,S/I,2,5,4,H,,KT~IW UG~LN,,LE~4~IY,,,,,4,,.B5_3_2M_5_7_4_L-1-D-2_7JLS-R-6-5.I -8,7-1-7 3:7:8.2 UNV,7,,6,7,0,LF C#6,B/RM [LV DA],1,0,8,K OM HO: FF OM,QV~VO PL~EB,AR~NU FL~JR,LS~4~TQ,QD~5~BX,,,,,7,,.H0_0_7O_3_6_3_X-4-J-0_0JQM-D-6-8.R -8,8-4-0 5:5:1.0 APJ,3,7,4,2,5,MM H#1,N/II G J V ,3,1,6,I EQ AB: VG SF,KE~KA XO~HU,SA~RA RM~KE,LK~3~GN,QC~4~RD,,,,,5,,.W7_4_7E_5_3_5_W-8-Y-5_5HNH-S-6-4.I -7,7-8-4 2:6:2.5 QJJ,0,,6,1,4,VD P#5,K/HJ [PE],7,6,2,W NU: TF,SX~ET CT~AF,SN~IM RY~KL,JT~6~SY,PN~4~UA,,,,,1,YC [CH] M H D,.H4_2_1K_8_1_5_C-0-C-4_6DDT-U-7-7.B -2,3-5-7 2:0:6.4 PJM,6,5,8,7,1,QV V#8,H/MX JC A AW KL,8,1,4,F QN: GH,XJ~SV ZM~WF,VR BU~QE WI~PE,OW~7~DR,ME PO~2~UCE=5,,,,,8,AU L A Z,.M7_1_7Z_1_5_2_H-7-B-7_1HTC-V-2-4.W -6,8-6-3 7:3:0.2 YJX,5,8,4,6,7,SD Z#4,J/QJ M 'PC ZU',8,7,4,R DJ: EI,BQ~BS IV~UC,YU SV~BE HL~XR,XZ~2~ML,IQ FE~6~TUE=7,,,,,3,YD [OA TT] U V K,.V2_7_7C_8_4_1_S-7-A-7_1RXT-N-1-2.Z -2,2-2-5 7:6:6.8 KLO,0,8,6,4,2,QP U#0,O/ZU D 'QY',6,8,2,I DG: QJ,NW~DN BR~GY,SD TJ~NA YZ~BZ,MY~4~QF,CV MU~3~PXJ=5,,,,,3,ZA [KM] H T E,.Q8_6_4E_4_7_0_K-8-N-7_7YTY-M-3-8.Y -6,8-4-3 1:4:7.1 AQO,1,3,4,0,1,PW R#0,V/YX E F,6,7,4,J VI: DH,FC~FA NG~CS,QX CZ~UU IV~JM,LI~4~HQ,EA DF~7~QVI=7,,,,,1,KE M H[F_K] L B B,.A8_2_2P_7_3_3_H-6-S-5_8HFI-N-3-2.L -6,3-7-6 8:4:2.1 UCA,7,0,3,4,7,EC G#2,B/NE T N,5,4,3,D SR: BO,VT~UI LY~BJ,NL GZ~TL UV~DW,LG~3~WZ,OK AQ~7~BHS=8,,,,,8,"P",.H4_1_7V_0_0_2_K-3-E-8_1HSG-W-6-7.W diff --git a/inst/tests/gb18030.txt b/inst/tests/gb18030.txt deleted file mode 100644 index 8b05ce0814..0000000000 --- a/inst/tests/gb18030.txt +++ /dev/null @@ -1,2 +0,0 @@ -�1�3x,y,z -,, diff --git a/inst/tests/grr.csv b/inst/tests/grr.csv deleted file mode 100644 index 14189a3dc6..0000000000 --- a/inst/tests/grr.csv +++ /dev/null @@ -1,2839 +0,0 @@ -AAAAAAAAAA,AAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAA,AAAAA,"AAAA,AAAAAAAAAAAAAA",AAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAA,AAAAAAAA,AAAAAAAAAAAAAAAA,AAAAAAAAAAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAA,AAA",AAAA,AAAA,AA,AAA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAAAAAAAAAAAA,"AAAAAA,AAA",AAAA,AAAA,AAAAA,AAAAA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAA,AAA",AAAA,AAAA,AA,AAAAA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAA,AAAAAAAAAAAAA,"AAAAAAA,AAAAAAAA",AAAAA,AAAA,AA,AAA,AAAAAAA,AAAA,AAAAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAA,AAAAAAAAAAAAAAAA,"AAAAAAAA,AAA",AAAA,AAAA,AAAAA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAA,AAAA,"AAAAAAA,AAAAAAAAAAAAAAA",AAAA,AAAA,AA,A,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAA,AAAAAAAAAAAAAAA,"AAAAAA,AAAAAAAAAAAAAAA",AAAA,AAAA,AA,A,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAAAAA""",AAAAAAAAAAAAAAAAAAAAA,"AAAAAA,AAA",AAAA,AAAA,AAAAA,AAAAA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAA,"AAAAAAAAAAAA,AAA",AAAA,AAAA,AAAAA,AAAAA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAA,"AAAAAAAA,AAA",AAA,AAAA,A,A,AAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAAAAAAAA,"AAAAAAA,AAA",AAAAA,AAAA,AAAAA,AAA,AAAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAA,AAAAAAAAAAAAAAAAAA,"AAAAAAAAAA,AAA",AAAAA,AAAA,AAAAA,AAA,AAAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAAAAAAAAAAA,"AAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAA,AAAAAA,"AAAAAAA,AAAAAAAA",AAAA,AAAA,AA,AA,AAAAA,AAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAA,AAAAAAAAAAAAAAA,"AAAAAA,AAAAAAAAAAAAAAA",AAAAA,AAAA,AA,AA,AAAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAA,AAA",AAAAA,AAAA,AAAAA,AAAAAA,AAAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAA,AAAAAAAAAAAAA,"AAAAAAA,AAA",AAAAA,AAAA,AAAAA,AAA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAA,AAAAAAAAAAAAA,"AAAAAAAAAAA,AAA",AAAA,AAAA,AAAAA,AA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAAAAAA,"AAAAAAAA,AAAAAAAA",AAAAA,AAAA,AA,AA,AAAAAA,AAAA,AAAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAA,AAAAAAAAAA",AAAA,AAAA,AA,AAA,AAAAAA,AAAAAAAAAA,AAAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAA,"AAAAAA,AAAAAAAAAAAAAAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAA,AAAAAAAAAAA,"AAAAAA,AAAAAAAA",AAAA,AAAA,AA,AA,AAAAA,AAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAA,AAAAAAAAA,"AAAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAA,"AAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAA,AAAAAAAAAAAAA,"AAAAAAAAAA,AAAAAAAAAAAAAAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAAAAAAAAAAAAAAA,"AAAAAAAAAA,AAAAAAAAAAAAAAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAA,"AAAAAAAA,AAA",AAA,AAAA,AA,AA,AAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAAAAAAAA,"AAAAA,AAAAAAAAAA",AAAAA,AAAA,AAA,AAA,AAAAAAA,AAAAAAAAAA,AAAAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAA,AAAAAAAAAAAAA,"AAAAAAAAAAA,AAA",AAAAA,AAAA,AAAAA,AAA,AAAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAA,"AAAAA,AAA",AAAAA,AAAA,AAAAA,AAAAAA,AAAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAAAAAAAAAAAA,"AAAAAAAAAA,AAA",AAAAA,AAAA,AA,AAAAA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAA,AAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAA,AAA",AAAAA,AAAA,AA,AA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAAAAAAAAAAAAA,"AAAAA,AAAAAAAAAAAAAAA",AAAAA,AAAA,AA,AA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAA,AAAAAAAAAAAAA,"AAAAAAA,AAAAAAAAAAAAAAA",AAAA,AAAA,AA,AA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAA,AAAAAAAAAAA,"AAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAA,AAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAAA,AAA",AAAA,AAAA,AA,AAA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAA""",AAAAAAAAAAAAAA,"AAAAAAAA,AAA",AAAA,AAAA,AA,AAA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAA""",AAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAA,AAA",AAAAA,AAAA,AA,AA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAA,"AAAAAAAA,AAAAAAAA",AAAA,AAAA,AA,AA,AAAAAA,AAAA,AAAAAA -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAAAAAA""",AAAAAAAAAAAAAAAAA,"AAAAAAAA,AAA",AAAA,AAAA,AA,AAA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAA,AAAAAAAAAAAAAAAAAA,"AAAAAAAA,AAAAAAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAAAAAA,"AAAAAAAAA,AAAAAAAA",AAAA,AAAA,AA,AA,AAAAA,AAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAA,"AAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAA,"AAAAAAAA,AAAAAAAAA",AAA,AAAA,AAAAAA,AAAAAA,AAAAA,AAAAAAA,AAAAAAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAA,AAAAAAAA,"AAAAAAAAA,AAAAAAAA",AAAA,AAAA,AA,AA,AAAAA,AAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAA,AAAAAAAAAAAAAAAA,"AAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAA,AAAAAAAAAAAAAAAAAAAA,"AAAAAA,AAAAAAAAAAAAAAA",AAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAA,AAAAAAAAAAAAA,"AAAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAA,"AAAAA,AAA",AAA,AAAA,AA,AA,AAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,"AAAAAAAA,AAA",AAAAA,AAAA,AAAAA,AAAAA,AAAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAAAAAAAA""",AAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAA,AAA",AAAA,AAAA,AA,AAA,AAAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAA""",AAAAAAAAAAAAAAA,"AAAAAA,AAAAAAAAAAAAAAA",AAAAA,AAAA,AA,AA,AAAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAA,AAA",AAAAA,AAAA,AA,AA,AAAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAA,"AAAAAAAAA,AAAAAAAAAAAA",AAAAA,AAAA,AA,AA,AAAAAAA,AAAA,AAAAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAAAAAAAAA,"AAAAAAA,AAA",AAAAA,AAAA,AAAAA,AAAAAA,AAAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAAAAAA,AAAAAAAAAA",AAAA,AAAA,AAA,AAA,AAAAAAA,AAAAAAAAAA,AAAAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAA,"AAAAAAAAAAA,AAA",AAAAA,AAAA,AA,AA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAAAAAAAAAAA,"AAAAAAAA,AAA",AAAAA,AAAA,AA,AAAAA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAAAAAAAA,"AAAAAAA,AAAAAAAAAAAAAAA",AAAAA,AAAA,AA,AA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAA,AAAAAAAAAAAAAAAAAA,"AAAAA,AAAAAAAAAAAAAAA",AAAAA,AAAA,AA,AA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAA,AAAAAAAAAAAAAAAAAA,"AAAAAAAAAAA,AAAAAAA",AAAA,AAAA,AAA,AAAA,AAAAAA,AAAAA,AAAAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAAAA,AAA",AAAA,AAAA,AAAAA,AAAAAA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAA,AAAAAAAAAAAAAAAA,"AAAAAAAAAAA,AAA",AAAA,AAAA,AAAAA,AA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAA,"AAAAAAAAAA,AAAAAAAAAAAAAAA",AAAA,AAAA,AA,AA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAA""",AAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAAA,AAA",AAAAA,AAAA,AA,AA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAAA,"AAAAAA,AAAAAAAA",AAAA,AAAA,AA,AA,AAAAA,AAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAAAAA""",AAAAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAA,AAAAAAAAAAAAAAAA,"AAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAAA,AAAA,AAAAA,AAAAA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAAAAA""",AAAAAAAAAAAAAA,"AAAAAAAAAAA,AAA",AAAA,AAAA,AA,AAA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAAAAAAAAAAAA""",AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAAAAAAAAAA,"AAAAAAAAA,AAAAAAAAAAAAAAA",AAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,"AAAAAA,AAAAAAAA",AAA,AAAA,AA,A,AAAAA,AAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAA,AAAAAAAAAAAAA,"AAAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAA,AAAAAA,"AAAAAAAA,AAAAAAAA",AAA,AAAA,AA,AA,AAAAA,AAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,"AAAAAAAA,AAAAAAAAAA",AAA,AAAA,AA,AA,AAAA,AAAAAAAAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAA,"AAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAA,AAAAAAAAAAAAAA,"AAAAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAA,AAAAAAAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAA,"AAAAAAAA,AAA",AAA,AAAA,A,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAA,AAAAAAAAAAAAA,"AAAAAAA,AAA",AAAAA,AAAA,AAAAA,AAA,AAAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAA,AAAAAAAAAAAAA,"AAAAAAAAAA,AAAAAAAAAAAAAAA",AAAA,AAAA,AA,AA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAAAAAAAAAAAA,"AAAAAAAAAA,AAAAAAAAAAAAAAA",AAAAA,AAAA,AA,AA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAA,"AAAAAAA,AAAAAAAA",AAAAA,AAAA,AA,AA,AAAAAA,AAAA,AAAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAAAAAAA,"AAAAAAAAA,AAAAAAAAAAAA",AAAAA,AAAA,AA,AA,AAAAAA,AAAA,AAAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAA,"AAAAAAAAAA,AAA",AAAA,AAAA,AAAAA,AAA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAA,AAAAAAAAAAA,"AAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAAA,AAAA,AA,AAA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,"AAAAAAA,AAAAAAAA",AAAA,AAAA,AA,AA,AAAAAA,AAAA,AAAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAAAAAA,AAAAAAAAAA",AAAA,AAAA,AAA,AAA,AAAAAA,AAAAAAAAAA,AAAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAAAAAAAAAAAAAAAA,"AAAA,AAA",AAA,AAAA,AA,AAA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAAAAAAAAAAAA,"AAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAA,"AAAAAAAA,AAAAAAAA",AAA,AAAA,AA,A,AAAAA,AAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAA,AAAAAAAAAA,"AAAAAAA,AAAAAAAA",AAAA,AAAA,AA,AA,AAAAA,AAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAA,AAAAAAAAAAAAAAA,"AAAAAAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAA,AAAAAAAAAAA,"AAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAA,AAAAAA,"AAAAAA,AAAAAAAA",AAA,AAAA,AA,AA,AAAA,AAAA,AAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAA,AAA",AAA,AAAA,A,A,AAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAA,AAAAAAAAA,"AAAAAAAAAA,AAA",AAA,AAAA,AAAAA,AAAAA,AAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAAAA,AAAA,AAAAA,AAAAAA,AAAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,"AAAAAAAAAAAAAAAAAAA""AAAAAAA""",AAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAAA,AAA",AAAAA,AAAA,AAAAA,AAA,AAAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAA,AAAAAAAAAAAAAAAAAA,"AAAAA,AAAAAAAAAAAAAAA",AAAA,AAAA,AA,AAA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAA,AAA",AAAA,AAAA,AA,AAAAA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAA,AAAAAAAAAAAAAAAAA,"AAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAA",AAAA,AAAA,AA,AA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAAAA,AAA",AAAA,AAAA,AAAAA,AAA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,"AAAAAAAAAAAAAAAAAAA""AAAAAA""",AAAAAAAAAAAAA,"AAAAAAA,AAAAAAAAAA",AAAA,AAAA,AA,AAA,AAAAAA,AAAAA,AAAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,"AAAAAAAAAA,AAAAAAAA",AAA,AAAA,AAAA,AAAA,AAAAA,AAAAA,AAAAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAA,"AAAAAA,AAAAAAAA",AAAA,AAAA,AA,AA,AAAAA,AAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAA,"AAAAAAA,AAAAAAAA",AAA,AAAA,AA,A,AAAAA,AAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAA,"AAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAA,AAAAAAAAAAAA,"AAAAAAAA,AAAAAAAAAA",AAA,AAAA,AA,AA,AAAAA,AAAAAAAAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAA,AAAAAAAAAAA,"AAAAAAA,AAA",AAA,AAAA,AAAAA,AAAAA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAA,AAAAAAAAAAAAA,"AAAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAAAAAAAAA""",AAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAA,"AAAAAA,AAAAAAAAAAAAAAA",AAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAA,AAAAAAAAAAA,"AAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAA,"AAAAAAAAAAAA,AAAAAAAA",AAA,AAAA,AA,A,AAAAA,AAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAAAAAA""",AAAAAAAAAAAAAAA,"AAAAAAAAAAAA,AAA",AAAA,AAAA,AA,AAAAA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAAAAAAAAAA,"AAAAAAAA,AAA",AAA,AAAA,AA,AA,AAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAA,"AAAAAA,AAA",AAA,AAAA,AA,AA,AAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAA,AAAAAAAAAAAAAAAA,"AAAAAAAAAAA,AAA",AAA,AAAA,AAAAA,AAAAA,AAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAA,AAAAAAAAAAAAAAA,"AAAAAA,AAAAAAAAAAAAAAA",AAAAA,AAAA,AA,AA,AAAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAA,"AAAAAAAAAA,AAA",AAAAA,AAAA,AAAAA,AAAAAA,AAAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAAAAAAAAAA,"AAAAAA,AAAAAAAAAAAAAAA",AAAA,AAAA,AA,AAA,AAAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAA""",AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAAA,AAAA,AA,AAA,AAAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAA""",AAAAAAAAAAAA,"AAAAAAAAA,AAA",AAAA,AAAA,AA,AAAAAA,AAAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAA""",AAAAAAAAAAAAAAAA,"AAAAAAAAAAAA,AAA",AAAA,AAAA,AA,AAAAAA,AAAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAA""",AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAA,AAA",AAAA,AAAA,AA,AAA,AAAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAA,AAA",AAAAA,AAAA,AA,AA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAA,AAAAAAAAAAAAAAA",AAAA,AAAA,AA,AA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAA,AAA",AAAA,AAAA,AA,AAAAA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAA,AAAAAAAAAAAAA,"AAAAAAA,AAAAAAAAAAAAAAA",AAAA,AAAA,AA,AA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAA,AAAAAAAAAAA,"AAAAAAAA,AAA,AAAAAAA",AAAA,AAAA,AA,AAA,AAAAAA,AAAAAAAA,AAAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAA,"AAAA,AAAAA",AAAA,AAAA,AA,AAA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAA,"AAAAAA,AAA",AAAA,AAAA,AAAAA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAA,"AAAAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAA,AAAAAAAAAA,"AAAAAAA,AAAAAAAAAAAAAAA",AAAA,AAAA,AA,A,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAA,AAAAAAA,"AAAAAA,AAAAAAAA",AAA,AAAA,AA,AA,AAAA,AAAA,AAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAA,"AAAAAAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAA,, -AAAAAAAAAA,AAAAAAAAAA,"AAAAAAAAAAAAAAAAAAA""AAAAAAA""",AAAAAAAAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAAA,AAAA,AA,AAA,AAAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,"AAAAAAAAAAAAAAAAAAA""AAAAAA""",AAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAAA,AAAA,AA,AAA,AAAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAA,AAAAAAAAAAAAAAAAA,"AAAAAAA,AAA,AAAAAAA",AAAAA,AAAA,AA,AAA,AAAAAAA,AAAAAAAA,AAAAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAAAAAAAAAA,"AAAAAAA,AAA",AAAAA,AAAA,AAAAA,AAAAAA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAA,AAAAAAAAAAAAAAA",AAAA,AAAA,AA,AA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAA,AAAAAAAAAAAAAAAAA,"AAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAA",AAAA,AAAA,AA,AA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAA,AAAAAAAAAAAA,"AAAAAAAA,AAAAAAAAAAAA",AAAA,AAAA,AA,AAA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAA,AAAAAAAAAAAAAAA,"AAAAAAAA,AAA,AAAAAAA",AAAA,AAAA,AA,AA,AAAAA,AAAAAAAA,AAAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAAA,AAAA,AAAAA,AAAAA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAA,AAAAAAAAAA,"AAAAAAAA,AAA,AAAAAAA",AAAA,AAAA,AA,AA,AAAAA,AAAAAAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAA,AAAAAAAAAAAAAAAA,"AAAAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAA,"AAAAAAAAAAAAAAAAAA""AAAAAAA""","AAAAAAAAA,AAAAAAAA",AAA,AAAA,AA,A,AAAAA,AAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,AAA,AAAAAAAAAAA,"AAAAAA,AAAAAAAA",AAAA,AAAA,AA,AA,AAAAA,AAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAA,"AAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAA,AAAAAAA,"AAAAAAA,AAAAAAAA",AAA,AAAA,AA,AA,AAAA,AAAA,AAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAA,AAAAAAAAAAAA,"AAAAAAA,AAAAAAAA",AAA,AAAA,AA,AA,AAAA,AAAA,AAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAA,AAAAAAAAAA,"AAAAAAA,AAAAAAAA",AAA,AAAA,AA,AA,AAA,AAAA,AAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAAAAAA,AAA",AAAAA,AAAA,AAAAA,AAAAAA,AAAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAA,AAAAAAAAAAAAA,"AAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAAAAAA,AAAAAAAAAA",AAAA,AAAA,AA,AAA,AAAAAA,AAAAAAAAAA,AAAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAAAAAA,"AAAAAAAAA,AAA",AAAAA,AAAA,AAAAA,AAAAA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAA,AAA",AAAA,AAAA,AA,AAA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAA,AAAAAAAAAAAAAAAA,"AAAAAAAAA,AAAAAAAAAAAAAAA",AAAA,AAAA,AA,AA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAA,"AAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAA",AAAA,AAAA,AA,AA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAA,AAA",AAAA,AAAA,AA,AAA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAA,AAA",AAAA,AAAA,AA,AAA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAA,AAA",AAAA,AAAA,AA,AAAAAA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAAAAAAAAAAAAAAA,"AAAAA,AAA",AAAA,AAAA,AAAAA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAAA,AAAA,AAAAA,AAAAA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAAAAAAAAA""",AAAAAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAAA,AAAA,AAAAA,AAAAA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAAA,AAA,AAAAAAA",AAAA,AAAA,AA,AA,AAAAA,AAAAAAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAA,AAAAAAAAAAAAAA,"AAAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAA,AAAAAAAAAAAAAAAA,"AAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAA,AAA",AAA,AAAA,AAAAA,AAAAA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAA,AAAAAAAAAAAAAAA,"AAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA""",AAAAAAAAAAAAAAAA,"AAAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAA,AAAAAAAAAAAAAAA,"AAAAAAAA,AAA",AAA,AAAA,AAAAA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAA,AAAAAAAAAAAAAA,"AAAAAAAA,AAA,AAAAAAA",AAA,AAAA,AA,AA,AAAAA,AAAAAAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAA,AAAAAAAAAAAAAAAAAAAAAA,"AAAAAA,AAA",AAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAA,AAA,"AAAAAAAA,AAAAAAAA",AAAA,AAAA,AA,AA,AAAAA,AAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAAAAAAAA,"AAAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAAAAAAAAA,"AAAAAAAAAAA,AAA",AAAA,AAAA,AAAAA,AAAAA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAA,AAAAAAAAAAAAAAA,"AAAAAAAA,AAAAAAAA",AAAA,AAAA,AA,AA,AAAA,AAAA,AAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAA,AAAAAAAAAAAAAAA,"AAAAAAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAA,AAAAAAAAAAAAA,"AAAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAA,AAAAAAAAAAAAAAA,"AAAAAAAAAA,AAA",AAAAA,AAAA,AAAAA,AAA,AAAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAAAAAAAAAAAAA,"AAAAAAAAAA,AAAAAAAAAAAAAAA",AAAAA,AAAA,AA,AA,AAAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAAAAAAA,"AAAAA,AAAAAAAAAA",AAAA,AAAA,AAA,AAA,AAAAAA,AAAAAAAAAA,AAAAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAA,"AAAAAA,AAAAAAA",AAAA,AAAA,AAA,AAAA,AAAAAA,AAAAA,AAAAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAAAAAAAAAAAA,"AAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAA",AAAA,AAAA,AA,AA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAAAAA""",AAAAA,"AAAAAAAAA,AAA",AAAAA,AAAA,AAAAA,AAAAAA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAA,AAAAAAAA",AAAA,AAAA,AA,AA,AAAAAA,AAAA,AAAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAA,"AAAAAAAA,AAAAAAA",AAAA,AAAA,AAA,AAAA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,"AAAAAAAAAAAAA,AAAAAAAA","AAAAAA,AAAAAAAAAAAAAAA",AAAAA,AAAA,AA,AA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAAA,AAA",AAAA,AAAA,AAAAA,AAAAA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAA,AAAAAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAAAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAAA,AAAA,AAAAA,AAAAA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAA,AAAAAAAAAAAAAA,"AAAAAA,AAAAAAAAAAAAAAA",AAAA,AAAA,AA,AA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAAA,AAAA,AAAAA,AAAAA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAAA,AAAA,AA,AAA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAAAAAAAAAAAA,"AAAAAAAAAAAAAAA,AAAAAAAAAAAAAAA",AAAA,AAAA,AA,AA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAA,AAAAAAAAA,"AAAAAAAAAAAAA,AAA,AAAAAAA",AAAA,AAAA,AA,AA,AAAAA,AAAAAAAA,AAAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAAA,AAAA,AAAAA,AAAAA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAA,"AAAAAA,AAA",AAAA,AAAA,AAAAA,AAAAA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAA,AAAAAAAAAAA,"AAAAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAA,AAAAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAAAAA""",AAAAAAAAAAAAA,"AAAAAAAAAAAA,AAA",AAAA,AAAA,AAAAA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAA,AAA,AAAAAAA",AAAA,AAAA,AA,AA,AAAAA,AAAAAAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAAA,AAAA,AAAAA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAA,AAAAAAAAA,"AAAAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAA,AAAAAAAAAAAAAA,"AAAAAAA,AAAAAAAA",AAAA,AAAA,AA,AA,AAAAA,AAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAA,AAA,AAAAAAA",AAAA,AAAA,AA,AA,AAAAA,AAAAAAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAA,"AAAAAAAAA,AAAAAAAAAAAAAAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAA,"AAAAAA,AAA",AAA,AAAA,AAAAA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAA,"AAAAAA,AAA",AAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAAAAAAAAAA,"AAAAAAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAAA,AAAA,AAAAA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAA,"AAAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAA,"AAAAAAAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAA,AAAAA,"AAAAAA,AAAAAAAA",AAA,AAAA,AA,AA,AAAA,AAAA,AAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAA,AAAAAAAAAAAAA,"AAAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAA,AAAAAAAAAAAAA,"AAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAA,AAAA,AAAAA,AAAAA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAAAAAAAA,"AAAAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAA,AAAAA,"AAAAAAA,AAA",AAA,AAAA,A,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAA""",AAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAA,AAAAAAA",AAAA,AAAA,AAA,A,AAAA,AAAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAA,AAAAAAAAAAA,"AAAAAA,AAAAAAAA",AAA,AAAA,AA,AA,AAAA,AAAA,AAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAA,AAAAAAAA,"AAAAAAAAAAAAAA,AAAAAAAA",AAA,AAAA,AA,AA,AAA,AAAA,AAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAA,AAAAAAAAAAAAAAAA,"AAAAAAAAAAA,AAA",AAA,AAAA,AAAA,AAAAA,AAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAA,"AAAAAAAA,AAA",AAA,AAAA,A,A,AA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAA""",AAAAAAAA,"AAAAAAAAAAA,AAAAAAA",AAAAA,AAAA,AAA,AAAA,AAAAAAA,AAAAA,AAAAAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAA,AAAAAAAAA,"AAAAAAAA,AAAAAAAA",AAAA,AAAA,AA,AAA,AAAAAAA,AAAA,AAAAAAA -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAAAAAAAAAAAAA""",AAAAAAAAAAAAAAAA,"AAAAA,AAA",AAAAA,AAAA,AA,AA,AAAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAA,"AAAAAA,AAAAAAAAAAAAAAA",AAAAA,AAAA,AA,AA,AAAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAA,AAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAA,AAA",AAAAA,AAAA,AAAAA,AAA,AAAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAA,"AAAAAAAAA,AAAAAAAAAAAAAAA",AAAA,AAAA,AA,AA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAAAA,AAA",AAAA,AAAA,AAAAA,AAAAA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,"AAAAA""AAAAAAAAAA""",AAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAA,AAA",AAAAA,AAAA,AA,AAA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAA""",AAAAAAAAAAAAAA,"AAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAAA,AAA",AAAA,AAAA,AA,AAAAA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAA,"AAAAAAA,AAA",AAAA,AAAA,AAAAA,AAAAAA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAAAAAAAAAAAAAA""",AAAAAAAAAAAAAAAA,"AAAAAAAAAAA,AAA",AAAA,AAAA,AA,AAA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAA,AAA",AAAA,AAAA,AA,AAA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAA,AAAAAAAAAAAAAAAAA,"AAAAAAAAAA,AAAAAAAAAAAAAAA",AAAA,AAAA,AA,A,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAA,"AAAAAAA,AAAAAAAAAAAAAAA",AAAA,AAAA,AA,A,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAA,"AAAAAAAAAA,AAA",AAAA,AAAA,AAAAA,AAAAA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAA,"AAAAA,AAAAAAAAAAAAAAA",AAAA,AAAA,AA,AA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA""",AAAAAAAAAAAAA,"AAAAA,AAA",AAAA,AAAA,AAAAA,AAAAA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAA,AAA,AAAAAAA",AAAA,AAAA,AA,AA,AAAAAA,AAAAAAAA,AAAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAA,AAAAAAAAAAAAAAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAAAAAAAAAAAAA,"AAAAAAAAAAAAA,AAA",AAAA,AAAA,AAAAA,AAA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAA,AAA",AAAA,AAAA,AAAAA,AAAAA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAA,"AAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAAAAAAAA,"AAAAA,AAAAAAAA",AAAA,AAAA,AA,AA,AAAAA,AAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAA,"AAAAAAAAAAA,AAA",AAAA,AAAA,AAAAA,AAAAA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAA,AAAAAAAAAAAAAA,"AAAAAAA,AAA,AAAAAAA",AAAA,AAAA,AA,A,AAAAA,AAAAAAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAA,AAA,AAAAAAA",AAAA,AAAA,AA,AA,AAAAA,AAAAAAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAAAAA""",AAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAA,"AAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAAAAAA""",AAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAAA,AAAA,AAAAA,AAAAA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,"AAAAAAAAAA,AAA",AAAA,AAAA,AA,AAAAA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAA,"AAAAA,AAAAAAAA",AAA,AAAA,AA,A,AAAAA,AAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAA,"AAAAAAA,AAA",AAAA,AAAA,AAAAA,AAAAA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAA,AAAAAAAAAAAAAAA,"AAAAAAAAAAAAA,AAA",AAA,AAAA,AAAAA,AAAAA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAA,AAAAAAAAAAAAAAAAAAAAAA,"AAAAAAA,AAAAAAAA",AAA,AAAA,AA,AA,AAAAA,AAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAA,AAAAAAAA,"AAAAAAAAA,AAAAAAAA",AAA,AAAA,AA,AA,AAAAA,AAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAA,AAAAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAAAAAAAAAA,"AAAAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAAAAAAAAA,"AAAAAAAA,AAAAAAAAAA",AAA,AAAA,AA,AA,AAAAA,AAAAAAAAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAA,AAAAAAAAAAAA,"AAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAA,AAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAA,AAAAAAAAAAAAAAAAAAAAA,"AAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAA,AAAA,AAAAA,AAAAA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAAAAAAA,"AAAAAAAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAA,"AAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAAAAAAAAA""",AAAAAAAAAAAAA,"AAAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAA,AAAA,"AAAAAAAAA,AAAAAAAA",AAA,AAAA,AA,AA,AAAA,AAAA,AAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAAAA,AAA",AAA,AAAA,A,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAA,AAAAAAAAAA,"AAAAAAAAA,AAAAAAAA",AAA,AAAA,AA,AA,AAAA,AAAA,AAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAA,AAAAAAAAAAAAAAAA,"AAAAAAAAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAA,AAAA,"AAAAA,AAAAAAAAAAAA",AAA,AAAA,AA,A,AAA,AAAAAA,AAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAA,"AAAAAA,AAA",AAA,AAAA,AA,AA,AAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAAAAAAAAAAAAAA,"AAAAAAAAA,AAAAAAA",AAAA,AAAA,AAA,AAAA,AAAAAAA,AAAAA,AAAAAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAA,"AAAAAAAAAAAA,AAA",AAAAA,AAAA,AAAAA,AAAAA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAA,AAAAAAAAAAAAA,"AAAAAAA,AAAAAAAAAAAAAAA",AAAA,AAAA,AA,AAA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAA,AAA",AAAAA,AAAA,AAAAA,AAAAA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAAAAAAAAAAAAAAA,"AAAAAA,AAA",AAAAA,AAAA,AA,AAAAA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAA,"AAAAAA,AAA",AAAA,AAAA,AAAAA,AA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAA""","AAAAAAAAAAAAA,AAAAAAAA","AAAAAA,AAAAAAAAAAAAAAA",AAAA,AAAA,AA,AA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAA,"AAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAA,AAAAAAAAAAAAAAAA,"AAAAAAAAAA,AAAAAAAAAA",AAAA,AAAA,AA,A,AAAAAA,AAAAAAAAAA,AAAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAA,AAAAAAAAAAAAAAAA,"AAAAAAAAAAA,AAAAAAA",AAAA,AAAA,AAA,AAAA,AAAAAA,AAAAA,AAAAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAA,AAAAAAAAAAAAAAAAAA,"AAAAA,AAAAAAAAAAAAAAA",AAAA,AAAA,AA,A,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAAA,AAAA,AA,AAA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAA,AAAAAAA",AAAA,AAAA,AAA,A,AAAAAA,AAAAA,AAAAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAAAAAAAAAA,"AAAAAAAAAAAAAA,AAAAAAAAAAAAAAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAA,"AAAAAA,AAA",AAAA,AAAA,AAAAA,AAAAA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAAA,AAAA,AAAAA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAAAAAAAAAA,"AAAAAAAA,AAA",AAA,AAAA,AA,AAA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAA,"AAAAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAA""",AAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAA,AAAAAAAAAAA,"AAAAAAA,AAA",AAA,AAAA,AAAAA,AAAAA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAA,AAAAAA,"AAAAAAAA,AAA,AAAAAAA",AAAA,AAAA,AA,AA,AAAAA,AAAAAAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAA,AAAAAAAAAAAA,"AAAAAAAA,AAAAAAAAAA",AAA,AAAA,AA,AAA,AAAAA,AAAAAAAAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAA,"AAAAAA,AAAAAAAAAAAAAAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAAAAAAAAAAAAAA,"AAAAAA,AAA,AAAAAAA",AAAA,AAAA,AA,AA,AAAAA,AAAAAAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,"AAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAA,"AAAAAAAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAA,AAAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAAAA""",AAAAAAAAAAAAAAAAA,"AAAAAAAA,AAA",AAA,AAAA,AAAAA,AAAAA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAAA,AAA",AAA,AAAA,AA,AAAAA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAAAA,"AAAAAAAAAA,AAA",AAA,AAAA,AAAAA,AAAAA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAAAAAAAA,"AAAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAA,"AAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAA,AAAAAAAAA,"AAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAA,"AAAAAAA,AAAAAAAA",AAA,AAAA,AA,AA,AAAA,AAAA,AAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAA,"AAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAA,AAAA,AAAAA,AAAAA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAA,AAAAAAAAAAAAAAAA,"AAAAAAAAAAA,AAA",AAA,AAAA,AAAA,AAAA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAA,AAAAAAAAAAAAAAAAAAA,"AAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAA,"AAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAA,AAAA,"AAAAAAAAA,AAAAAAAA",AAA,AAAA,AA,AA,AAAA,AAAA,AAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAA,AAAAAAAAAA,"AAAAAAA,AAAAAAAA",AAA,AAAA,AA,AA,AAAA,AAAA,AAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAA,AAA",AAA,AAAA,A,A,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAA,AAAAAAAA,"AAAAAAAA,AAAAAAAA",AAA,AAAA,A,AA,AAAA,AAAA,AAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAA,AAAAAAA,"AAAAAAA,AAAAAAAA",AAA,AAAA,A,A,AAA,AAAA,AAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAA,AAAA,A,A,AAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAA,AAAAAAAAA,"AAAAAA,AAAAAAAA",AAA,AAAA,AA,AA,AAA,AAAA,AAA -AAAAAAAAAA,AAAAAAAAAA,"AAAAAAAAAAAAAAAAAAA""AAAAAA""",AAAAAAAAAAAAAA,"AAAAAAAA,AAAAAAAA",AAAA,AAAA,AA,AA,AAAAAAA,AAAA,AAAAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAA,AAAAAAAAAAAAAAAAAA,"AAAAAAAAAAA,AAAAAAA",AAAA,AAAA,AAA,AAAA,AAAAAAA,AAAAA,AAAAAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAA,AAAAAAAAAAAAAAAA,"AAAAAAAA,AAA",AAAAA,AAAA,AAAAA,AAA,AAAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAA,AAAAAAAAAAAAAA,"AAAAAAAAA,AAAAAAAAAAAA",AAAA,AAAA,AA,AAA,AAAAAAA,AAAA,AAAAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAA,"AAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAA,AAA",AAAAA,AAAA,AA,AA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAA,"AAAAAA,AAAAAAAA",AAAA,AAAA,AA,AA,AAAAAA,AAAA,AAAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAAA,AAAA,AAAAA,AAA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAAAAAAAA,"AAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAA,AAAAAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAAA,AAAA,AA,AAA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAA,AAAAAAAAAAAAAAAA,"AAAAAAAAAAA,AAAAAAA",AAAA,AAAA,AAA,A,AAAAAA,AAAAA,AAAAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAA,"AAAAAAAAAAAAA,AAAAAAAA","AAAAAA,AAAAAAAAAAAAAAA",AAAAA,AAAA,AA,AA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAA,AAA,AAAAAAA",AAAA,AAAA,AA,AA,AAAAA,AAAAAAAA,AAAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAA,"AAAAAA,AAA",AAAA,AAAA,AAAAA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAA,"AAAAAAAAAAAAA,AAA",AAA,AAAA,AAAAA,AAAAA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAAAAA""",AAAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAAA,AAAA,AAAAA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAA,AAAAAAAAAAAAAAAAAAAAA,"AAAAAA,AAA",AAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAA,"AAA,AAAAAAAA",AAA,AAAA,AA,A,AAAAA,AAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAA,AAAAAAAAAAAAAAA,"AAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAA,AAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAAA""",AAAAAAAAAAAAA,"AAAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAA,AAAAAAAAAAAA,"AAAAAAAA,AAAAAAAAAA",AAA,AAAA,AA,AA,AAAA,AAAAAAAAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAA,AAAA,AAAAA,AAAAA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAA,"AAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAA,AAAAA,"AAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAAA,AAA",AAA,AAAA,AAAAA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAA,AAAAAAAAAAAAA,"AAAAAAA,AAA",AAA,AAAA,A,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAA,AAAAAAAAAAAA,"AAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAA,AAAAA,"AAAAAAA,AAAAAAAA",AAA,AAAA,AA,AA,AAAA,AAAA,AAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAA,AAAAAAAAAAAAAAAAAAA,"AAAAAA,AAAAAAAA",AAA,AAAA,AA,AA,AAAA,AAAA,AAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAA,AAAAAAAAAAAAAAA",AAA,AAAA,A,A,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAA,"AAAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAA,AAAAAAAAAAA,"AAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAA,AAAAAAAAAAAA,"AAAAAAAAAAA,AAAAAAAA",AAA,AAAA,AA,A,AAA,AAAA,AAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAA,AAAAAAAAAA",AAAAA,AAAA,AAA,AAA,AAAAAAA,AAAAAAAAAA,AAAAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAA,AAAAAAAAAAA,"AAAAA,AAAAAAAAAA",AAAA,AAAA,AA,AAA,AAAAAAA,AAAAAAAAAA,AAAAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAA,"AAAAAA,AAAAAAAAAAAAAAA",AAAAA,AAAA,AA,AA,AAAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAA""",AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAAAAAAAAAAAAAAAA""",AAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAA,AAA",AAAA,AAAA,AA,AAA,AAAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAAA,AAAA,AA,AAA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAA""",AAAAAAAAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAAAAAAAAAAA,"AAAAAAAAAA,AAA",AAAAA,AAAA,AA,AAAAA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAA,"AAAAAAAAAAA,AAAAAAA",AAAA,AAAA,AAA,AAAA,AAAAAA,AAAAA,AAAAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAA,AAA",AAAA,AAAA,AAAAA,AAAAA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAAAAAAAAAAAAAAAA""",AAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAAAA,AAAA,AA,AAA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAAAAAAA,AAA",AAAA,AAAA,AAAAA,AAAAAA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAA,AAAAAAA",AAAA,AAAA,AAA,AAAA,AAAAAA,AAAAA,AAAAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAA,"AAAAA,AAA",AAAA,AAAA,AAAAA,AAAAA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAA""",AAAAAAAAAAAAAAAAA,"AAAAAA,AAA,AAAAAAA",AAAA,AAAA,AA,AA,AAAAAA,AAAAAAAA,AAAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAA,"AAAAAAAAAA,AAA,AAAAAAA",AAAA,AAAA,AA,AA,AAAAAA,AAAAAAAA,AAAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAA,AAAAAAAAAAAAA,"AAAAAAAAAAAA,AAA",AAAA,AAAA,AAAAA,AAAAA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAAAAAAA,"AAAA,AAA",AAAA,AAAA,AAAAA,AAAAA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAA,AAAAAAAAAAAAAAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAAAAAAA,"AAAAAAAA,AAAAAAAA",AAAA,AAAA,AA,AA,AAAAA,AAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAA,AAAAAAAAAAAAAAA,"AAAAAAAAAAAA,AAA",AAAA,AAAA,AA,AAAAA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAAAAAAAAAAAAA,"AAAAAAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAA,"AAAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAAAAAAAAA""",AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAAAA,"AAAAAA,AAAAAAAA",AAA,AAAA,AA,A,AAAAA,AAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAA,AAAAAAAAAAAA,"AAAAAAAAA,AAA",AAAA,AAAA,AA,AAAAA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAA""",AAAAAAAAAAAAAA,"AAAAAAAAA,AAAAAAAAAA",AAAA,AAAA,AA,AA,AAAAA,AAAAAAAAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAAAAA""",AAAAAAAAAAAAAAAAA,"AAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAA,AAAAAAAAAAAA,"AAAAAAAAAAA,AAA",AAAA,AAAA,AAAAA,AAAAA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAAA,AAAA,AAAAA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAA,"AAAAAAA,AAAAAAAA",AAA,AAAA,AA,AA,AAAAA,AAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAAAAAAAAAAAAAAA,"AAAAAA,AAA",AAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAA,AAAAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAA,"AAAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAA,AAAAAAAAAAAAAAA,"AAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAA,AAAAAAAAAAAA,"AAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAA,AAAA,AAAAA,AAAAA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAA,"AAAAAA,AAA",AAA,AAAA,AAAAA,AAAAA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAAAAAAAAAAAA""",AAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAA,AAAAAAAAAA,"AAAAAAAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAA,"AAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAAAAAAAAA""",AAAAAAAAAA,"AAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAA,AAAA,AAAAA,AAAAA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAA,AAAAAAAAAAAAA,"AAAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAAAAAAAAAA,"AAAAAAAA,AAA,AAAAAAA",AAA,AAAA,AA,AA,AAAA,AAAAAAAA,AAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAA,"AAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAA,AAA,"AAAAAAAA,AAAAAAAA",AAA,AAAA,AA,AA,AAAA,AAAA,AAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAA,"AAAAAAAAAA,AAAAAAAAAAAAAAA",AAA,AAAA,A,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAA,AAAAAAAAAA,"AAAAAA,AAAAAAAA",AAA,AAAA,AA,AA,AAAA,AAAA,AAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAAA,AAA",AAA,AAAA,AAAAA,AAAAA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAA,AAAAAAAAAA,"AAAAAAAAA,AAAAAAAA",AAA,AAAA,AA,AA,AAA,AAAA,AAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAA,AAAA,A,AA,AAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAA,AAAAAAAA",AAA,AAAA,AA,AA,AAA,AAAA,AAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAA,AAAAAAAAAAA,"AAAAAA,AAAAAAAA",AA,AAAA,AA,AA,AAA,AAAA,AAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAA,"AAAAAAAAA,AAAAAAAAAAAA",AAAAA,AAAA,AA,AA,AAAAAAA,AAAA,AAAAAAA -AAAAAAAAAA,AAAAAAAAAA,"AAAAAAAAAAAAAAAAAAA""AAAAAAA""",AAAAAAAAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAAA,AAAA,AA,AAA,AAAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAA,AAAAAAAAAAAAAAAAAA,"AAAAAAAAAAAA,AAA",AAAAA,AAAA,AAAAA,AAA,AAAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,"AAAAAAAAAAAAAAAAAAA""AAAAAA""",AAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAAA,AAAA,AA,AAA,AAAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAA,AAAAAAAAAAAAAAAAAAAAAAAA,"AAAA,AAAAA",AAAA,AAAA,AA,AAA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAAAAAA,AAA",AAAA,AAAA,AAAAA,AAAAAA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAAAAAAAAAAAAAA,"AAAAAAA,AAAAAAAAAAAAAAA",AAAA,AAAA,AA,AA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAA,AAA",AAAA,AAAA,AAAAA,AAAAA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAAA,AAAA,AA,AAA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAA,AAAAAAAAAAAAAAAAAAA,"AAAAAAAA,AAA,AAAAAAA",AAAA,AAAA,AA,AA,AAAAA,AAAAAAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAAAAAA,"AAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAAAAAAAAAAAAA,"AAAAAAA,AAAAAAAA",AAAA,AAAA,AA,AA,AAAAA,AAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAAAAAAAAA""",AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAAA,AAAA,AAAAA,AAAAA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAAAAAAAAAA,"AAAAAA,AAA",AAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAAA,AAAA,AAAAA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAA,AAAAAAAAAAAAAAAAA,"AAAAAAAAA,AAA,AAAAAAA",AAAA,AAAA,AA,AA,AAAAA,AAAAAAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAA,AAA,AAAAAAA",AAA,AAAA,AA,AA,AAAAA,AAAAAAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAA,AAAAAA,"AAAAAAA,AAA",AAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAA,AAAAAAAAAAAAAA,"AAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAA,AAAAAAAAAAAAAAA,"AAAAAAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAA,"AAAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAAAAAAAA,"AAAAAAAAAA,AAA",AAAA,AAAA,AAAAA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAA,AAAAAAAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAA,AAAA,AAAAA,AAAAA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAA,AAAAAAAAAA,"AAAAAAAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAAAAAAAAAA,"AAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAA,"AAAAAAAAAA,AAA",AAA,AAAA,AAAAA,AAAAA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAA,AAAAAA,"AAAAAA,AAAAAAAAAAAAAAA",AAA,AAAA,A,A,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAA,AAAAAAAAAAAAA,"AAAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAA,AAAAAAAAAA,"AAAAAAA,AAAAAAAA",AAA,AAAA,AA,AA,AAAA,AAAA,AAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAA,AAAAAAAA",AAA,AAAA,AA,AA,AAAA,AAAA,AAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAA,AAAAA,"AAAAAA,AAAAAAAA",AAA,AAAA,AA,AA,AAA,AAAA,AAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAA,AAAAAAA,"AAAAAAA,AAAAAAAA",AA,AAAA,AA,AA,AAA,AAAA,AAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAA,AAAAAAAAAAAA,"AAAAAA,AAA",AAA,AAAA,AA,AA,AAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAAAAAA,"AAAAA,AAAAAAAAAA",AAAAA,AAAA,AA,AAA,AAAAAAA,AAAAAAAAAA,AAAAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAAAA,AAAA,AAAAA,AAAAAA,AAAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAA,AAA",AAAAA,AAAA,AA,AAA,AAAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAA,AAAAAAAAAAA,"AAAAAAAAAAAAAAA,AAA",AAAAA,AAAA,AAAAA,AAA,AAAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAA,"AAAAAAAAA,AAA",AAAAA,AAAA,AAAAA,AAAAAA,AAAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAA,AAAAAAAAAAAAA,"AAAAAAA,AAAAAAAAAAAAAAA",AAAA,AAAA,AA,AA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAA,"AAAAAAAA,AAA,AAAAAAA",AAAA,AAAA,AA,AA,AAAAAA,AAAAAAAA,AAAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAAAAAAAAAAAAA,"AAAAAAA,AAA,AAAAAAA",AAAAA,AAAA,AA,AA,AAAAAA,AAAAAAAA,AAAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAA,"AAAAAAAAAAAA,AAAAAAAAAA",AAAA,AAAA,AAA,AAAA,AAAAAA,AAAAA,AAAAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA""",AAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAA,AAAAAAA",AAAAA,AAAA,AAA,AAAA,AAAAAA,AAAAA,AAAAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAAA,AAA",AAAA,AAAA,AAAAA,AAAAA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAAA,AAAA,AAAAA,AAAAA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAA,AAA",AAAA,AAAA,AAAAA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAA""",AAAAAAAAA,"AAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAAAAA,"AAAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAA,AAAAAAAAAAAA,"AAAAAAAAA,AAA",AAAA,AAAA,AAAAA,AAAAA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAAA""",AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAA,AAA,AAAAAAA",AAAA,AAAA,AA,AA,AAAAA,AAAAAAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAA,AAAAAAAAAAAAAAA,"AAAAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAAA,"AAAAAA,AAAAAAAA",AAAA,AAAA,AA,AA,AAAAA,AAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAA,AAAAAAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAAAAAAAAAAAAAAA""",AAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAAAA,AAA",AAAA,AAAA,AAAAA,AAA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAA,AAAAAAAAAAAA,"AAAAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAAAAA""",AAAAAAAAA,"AAAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAAAAAAAAA""",AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAAAAAAA,AAA",AAAA,AAAA,AAAAA,AAAAA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAA,AAAAAAAAAAAAA,"AAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAA,AAAAAAAAAA,"AAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAA,AAAA,AAAAA,AAAAA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAA,"AAAAAAAAAA,AAA",AAA,AAAA,AAAAA,AAAAA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAAAAAAAAA""",AAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAA,AAAA,AAAAA,AAAAA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA""",AAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAA,AAAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAAA,AAAA,AAAAA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAA,AAAAAAAAAAAAAAAAAAAAA,"AAAAAA,AAA",AAAA,AAAA,AAAAA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAA""",AAAAAAAAAAA,"AAAAAAA,AAA",AAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAA,"AAAAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAA,AAAAAAAAAA,"AAAAAAA,AAA",AAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAAAA,AAA",AAAA,AAAA,AAAAA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAA,AAAAAAAAAAAAAAA,"AAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAA,"AAAAAAAAAA,AAA",AAA,AAAA,AAAAA,AAAAA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAA,"AAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAA,"AAAAAAAAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAA,AAAAAAAAAAAAA,"AAAAAAA,AAAAAAAA",AAA,AAAA,AA,AA,AAAA,AAAA,AAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAA,AAAAAAAAAAA,"AAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAA,"AAAAAAA,AAA",AAA,AAAA,AAAAA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAAAAAAAAAA,"AAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAA,AAAAAAA,"AAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAA,AAAAAAAAAAA,"AAAAAA,AAA",AAA,AAAA,A,A,AAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAA,AAAAAAAAA,"AAAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAAAAAAAAAAAAA""AAAAAAAAA",AAAAAAAAAAAAAAA,"AAAAAA,AAAAAAAAAAAAAAA",AAAAA,AAAA,AA,AA,AAAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAA,AAAAAAAAAAA,"AAAAA,AAAAAAA",AAAA,AAAA,AA,AAA,AAAAAAA,AAAA,AAAAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAAAA,AAAA,AAAAA,AAAAAA,AAAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,"AAAAAAA,AAA",AAAAA,AAAA,AA,AAAAAA,AAAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAAA""",AAAAAAAAAAAAAAAA,"AAAAAAAAAA,AAAAAAAAAA",AAAAA,AAAA,AA,AAA,AAAAAAA,AAAAAAAAAA,AAAAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAAAAAAAAAAA,"AAAAAAAAAAA,AAA",AAAAA,AAAA,AAAAA,AAA,AAAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAA,"AAAAAAA,AAAAAAAAAAAAAAA",AAAAA,AAAA,AA,AA,AAAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAAAAAAAAAAAAA,"AAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAA",AAAA,AAAA,AA,AA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAA,AAAAAAAAAAAAAAAAAAAA,"AAAAAAA,AAAAAAAA",AAAAA,AAAA,AA,AA,AAAAAA,AAAA,AAAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAA,"AAAAAA,AAA",AAAA,AAAA,AA,AAA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAAAAAAAAAAAAA""AAAAAAAAAA",AAAAAA,"AAAAAA,AAAAAAAA",AAAA,AAAA,AA,AA,AAAAAA,AAAA,AAAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAAAA,AAAA,AAAAA,AAAAA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAA,"AAAAAAA,AAA",AAAAA,AAAA,AA,AAA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAAAAAAAA""","AAAAAAAAAAAAA,AAAAAAAA","AAAAAA,AAAAAAAAAAAAAAA",AAAA,AAAA,AA,A,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAAA,AAAA,AA,AAA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAAA,"AAAAAAAAAA,AAAAAAA",AAAA,AAAA,AA,AA,AAAAAA,AAAA,AAAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAA,AAAAAAAAAAAAAAA,"AAAAAAAAA,AAAAAAA",AAAA,AAAA,AAA,AAAA,AAAAAA,AAAAA,AAAAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAA,AAAAAAAAAA,"AAAAA,AAA",AAAA,AAAA,AA,AA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAA,AAAAAAAAAAAAAAA,"AAAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAAAAAAAAA,"AAAAAAAA,AAA,AAAAAAA",AAAA,AAAA,AA,AA,AAAAAA,AAAAAAAA,AAAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAA,AAAAAAAAAAAAAAAA,"AAAAAAAAAA,AAA",AAAA,AAAA,AAAAA,AAAAA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAA,AAAAAAAAAAAAAAA",AAAA,AAAA,AA,AA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAA,AAA",AAAA,AAAA,AAAAA,AAAAA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAAA,AAA",AAAA,AAAA,AAAAA,AA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAA,AAA",AAAA,AAAA,AAAAA,AAAAA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAAAAAAAAAA""",AAAAAAAAAAAAAAAAA,"AAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAAAAAAAAAAA,"AAAAAAAAAAAAA,AAA",AAAA,AAAA,AAAAA,AAAAA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAA,AAA",AAAA,AAAA,AA,AAA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAAAAAAAAAA,"AAAAAAAAA,AAAAAAAA",AAAA,AAAA,AA,AA,AAAAA,AAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAA,AAAAAAAAAAAAAAAAAAA,"AAAAA,AAA",AAAA,AAAA,AAAAA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAA,AAAAAAAAAAAAAAAA,"AAAAAAAAAAAA,AAA",AAAA,AAAA,AAAAA,AAAAA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAAAAAAAAAAA""",AAAAAAAAAAAAAAAAA,"AAAAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAA,"AAAAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAAA,"AAAAAAAAA,AAAAAAAA",AAAA,AAAA,AA,A,AAAAA,AAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAA,AAAAAAAAAAAAAAA,"AAAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAA,"AAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAA,"AAAAAA,AAA",AAAA,AAAA,AAAAA,AAAAA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAA,"AAAAAAAAAAA,AAAAAAA",AAAA,AAAA,AAA,AAAA,AAAAA,AAAAA,AAAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAAAAAAAAA,"AAAAAA,AAAAAAAAAAAAAAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAA,AAAAAAAAAAAA,"AAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAAAAA""",AAAAAAAAAAAAAAAAA,"AAAAAAAAAAAA,AAA",AAAA,AAAA,AAAAA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAA,AAAAAAAAAAAAA,"AAAAAAAA,AAA",AAAA,AAAA,AAAAA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAAA""",AAAAAAAAAAAAAAAA,"AAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAA,AAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAAAA,"AAAAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAAAAAAA,AAA",AAAA,AAAA,AAAAA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAAA,AAA",AAAA,AAAA,AAAAA,AAAAA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAA,AAAAAAAAAAAAAAA,"AAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAA,AAAAAAAAAA,"AAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAA,AAAAAAAAAAAAAAAAAA,"AAAAAAAA,AAA",AAAA,AAAA,AAAAA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAA,AAA,AAAAAAA",AAA,AAAA,AA,A,AAAAA,AAAAAAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAA,AAAAAAAAAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,"AAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAA,"AAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAAAAAAAAA,"AAAAAAAAAAAA,AAAAAAAA",AAA,AAAA,AA,A,AAAAA,AAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAAAAAAAAAA,"AAAAAAA,AAA,AAAAAAA",AAAA,AAAA,AA,AA,AAAAA,AAAAAAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA""",AAAAAAAAAAAAAAA,"AAAAA,AAA",AAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAA,AAAAAA,"AAAAAAA,AAA",AAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA""",AAAAAAAA,"AAAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAA""",AAAAAAAAAAAAAAAA,"AAAAAA,AAA",AAAA,AAAA,A,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAAA,"AAAAAA,AAA",AAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAA,"AAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAA,"AAAAAA,AAAAAAAA",AAA,AAAA,AA,AA,AAAAA,AAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAA,"AAAAAA,AAA",AAA,AAAA,AAAAA,AAAAA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAA,AAAAAAA",AAAA,AAAA,AAA,AAA,AAAAA,AAAAA,AAAAAA -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAAA""",AAAAAAAAAAAA,"AAAAAAA,AAA",AAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAA,"AAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAA,AAAAAAAAAAAAAA,"AAAAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAAAAAAAA,"AAAAAAAA,AAAAAAAAAA",AAA,AAAA,AA,AA,AAAA,AAAAAAAAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAA,AAAAAAAAAA,"AAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAAAAAAAAAAA,"AAAAAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAA,AAAAAAAAAAAAAAA,"AAAAAAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAA,AAAAAAAAAAAAAAAAAA,"AAAAAAA,AAAAAAAA",AAA,AAAA,AA,AA,AAAA,AAAA,AAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAA,"AAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAA,AAAAAAAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAA,AAAA,AAAAA,AAAAA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAAAAAA,"AAAAAAAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAA,AAAA,AAAAA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAAA,AAA",AAA,AAAA,AA,AAAAA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAA,"AAAAAAAAA,AAA,AAAAAAA",AAA,AAAA,AA,AA,AAAA,AAAAAAAA,AAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAA,AAAAAAAAAAA,"AAAAAAAAA,AAA,AAAAAAA",AAA,AAAA,AA,AA,AAAA,AAAAAAAA,AAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAA,AAAAAAAA,"AAAAAAAA,AAAAAAAA",AAA,AAAA,AA,AA,AAAA,AAAA,AAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAA,AAAAAAAAAAAAAAAA,"AAAAAAAAAAA,AAA",AAA,AAAA,AAAAA,AAAAA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAA,AAAAAAAAAAAA,"AAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAA,"AAAAAAAA,AAA,AAAAAAA",AAA,AAAA,AA,AA,AAAA,AAAAAAAA,AAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAA,"AAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAA,"AAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAA,AAAAAAAAA,"AAAAAAAAAA,AAA",AAA,AAAA,AAAA,AAAA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAA,"AAAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAA,"AAAAAAA,AAAAAAA",AAAA,AAAA,AA,AAA,AAAA,AAAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAA,AAAAAAA,"AAAAAAAA,AAA",AAA,AAAA,A,A,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAA,"AAAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAA,"AAAAAA,AAAAAAAA",AAA,AAAA,AA,AA,AAA,AAAA,AAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAA,AAAA,AA,AA,AAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAA,AAA",AAAAA,AAAA,AAAAA,AAAAAA,AAAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAAAAAAAAA""",AAAAAAAAAAAA,"AAAAAAAA,AAAAAAAAAAAA",AAAA,AAAA,AA,AAA,AAAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAAAAAAAAA,"AAAAAAA,AAAAAAAAAAAAAAA",AAAAA,AAAA,AA,AA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAA,AAAAAAAAAAAAAA,"AAAAAAAA,AAA",AAAA,AAAA,AA,AAA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAAAAAAAAAAAA""",AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAA,"AAAAAA,AAAAAAAAAAAAAAA",AAAA,AAAA,AA,AA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAA,AAAAAAA",AAAA,AAAA,AA,AA,AAAAAA,AAAA,AAAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAA,"AAAAAAA,AAAAAAAAAAAAAAA",AAAA,AAAA,AA,AA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA""",AAAAAAAAAAAAAAA,"AAAAAAAAA,AAAAAAA",AAAA,AAAA,AAA,AAAA,AAAAAA,AAAAA,AAAAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAA,"AAAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAA,AAAAAAAAA",AAAA,AAAA,AAAAAA,AAAAAA,AAAAAA,AAAAA,AAAAAAAAA -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAA""",AAAAAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAAAA,AAAA,AA,AA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAAAAAAAAAA,"AAAAAAAAA,AAAAAAAAAA",AAAA,AAAA,AA,A,AAAAAA,AAAAAAAAAA,AAAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAAAAAAAA,"AAAAAA,AAAAAAAA",AAAA,AAAA,AA,AA,AAAAAA,AAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAA,AAA",AAAA,AAAA,AA,AAA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAA,"AAAAAA,AAA",AAAA,AAAA,AA,AAA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAAA""",AAAAAAAAAAAAAA,"AAAAAAAA,AAA,AAAAAAA",AAAA,AAAA,AA,AA,AAAAA,AAAAAAAA,AAAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAA,"AAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAA,AAAAAAAAAAAAAA,"AAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAA,AAA",AAAA,AAAA,AAAAA,AAAAA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAAA,AAAA,AA,AAA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAA,AAA",AAAA,AAAA,AAAAA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAA,AAAAAAAAAAAAAAA,"AAAAAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAA,AAAAAAAAAAAAAAA,"AAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAA,AAAAAAAAAAAAAAAAA,"AAAAAAAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAAA,AAAA,AA,AAA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAAAAAAA,"AAAAAAA,AAAAAAAA",AAAA,AAAA,AA,AA,AAAAA,AAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAA,"AAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAA,AAAAAAAAAAAA,"AAAAAAAA,AAA,AAAAAAA",AAAA,AAAA,AA,AA,AAAAA,AAAAAAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAA,AAAAAAAAAAAAAAAA,"AAAAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAA,AAAAAAAAAAAAAAA,"AAAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAAAAAAAAAA,"AAAAAAA,AAA",AAAA,AAAA,AAAAA,AAAAA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAAAAAAAAA""",AAAAAAAAAAAAA,"AAAAAAA,AAA",AAAA,AAAA,AA,AAAAA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA""",AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAAAA,AAA",AAAA,AAAA,AAAAA,AAA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAA,AAAAAAA,"AAAAAA,AAAAAAAAAAAAAAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAAAAAAAAAA,"AAAAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAAAAA""",AAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAA,AAA",AAAA,AAAA,AA,AAA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAA,AAAAAAAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAA,AAAAAAAAA,"AAAAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAA,AAAAAAAAAAAAAAA,"AAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAA,"AAAAAAA,AAA",AAA,AAAA,AAAAA,AAAAA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAA,AAAAA,"AAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAA,AAAA,AAAAA,AAAAA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAA,"AAAAAA,AAAAAAAA",AAA,AAAA,AA,A,AAAAA,AAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAA,AAAAAAAA,"AAAAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAA,AAAAAAA",AAAA,AAAA,AAA,AAA,AAAAA,AAAAA,AAAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAAAAAA,"AAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAA,"AAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAA,"AAAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAA,AAAAAAAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAA,AAAA,AAAAA,AAAAA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAAAAAAAA,"AAAAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAA,AAA,"AAAAAAAA,AAAAAAAA",AAAA,AAAA,AA,AA,AAAAA,AAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAA,AAA",AAA,AAAA,AAAAA,AAAAA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAAAAAAAAAAAAA,"AAAAAA,AAA",AAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAAAAAAAAAAA""",AAAAAAAAAAA,"AAAAAA,AAA",AAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,"AAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAA,AAAAAAAAAAAA,"AAAAAAAA,AAA",AAA,AAAA,AAAAA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAAA""",AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAA,AAAAAAAAAAAAAA,"AAAAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAAAAAAA,"AAAAAA,AAA",AAAA,AAAA,AA,AAAAA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAA,AAAAAAAAAA,"AAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAA,AAAAAAAAAAAA,"AAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAA,AAAAAAAAAAAAAAAA,"AAAAAAA,AAAAAAA",AAAA,AAAA,AAA,AAA,AAAA,AAAAA,AAAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAAAAAA,AAA,AAAAAAA",AAA,AAAA,AA,AA,AAAA,AAAAAAAA,AAAA -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAA""",AAAAAAAAAAAAAA,"AAAAAAAAAAA,AAAAAAA",AAA,AAAA,AAA,AAA,AAAA,AAAAA,AAAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAA,AAAAAAAAAAAAA,"AAAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAA,AAAA,A,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAAAAAAAAAAAAA""",AAAAAAAA,"AAAAAAAAAAA,AAAAAAA",AAA,AAAA,AAA,AAA,AAAA,AAAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAA,AAAAAAA,"AAAAAAA,AAA,AAAAAAA",AAA,AAAA,AA,AA,AAAA,AAAAAAAA,AAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAA,"AAAAAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAA,AAA,"AAAAAAAA,AAAAAAAA",AAA,AAAA,AA,AA,AAAA,AAAA,AAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAA,"AAAAAAAAAA,AAA",AAA,AAAA,AAAA,AAAAA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAA,AAAAAA,"AAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAA,"AAAAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAA,AAAAAAAAAAAAAA,"AAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAA,AAAAAAAAAAAA,"AAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAA,AAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAA,AAAAAAAAAAAAAAA,"AAAAAA,AAA",AAA,AAAA,A,A,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAA,AAAA,A,A,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAA,AAAAAAAAAAAAAAAA,"AAAAAAAAAAA,AAA",AAA,AAAA,AAAAA,AAAAA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAA,AAAA,AA,AA,AAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAA,AAAAAAAAAAAAA,"AAAAAA,AAAAAAAA",AAA,AAAA,AA,AA,AAA,AAAA,AAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAAAAAA,"AAAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAA,AAA",AAAAA,AAAA,AAAAA,AAA,AAAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAA,AAAAAAAAAA",AAAA,AAAA,AA,AAA,AAAAAA,AAAAAAAAAA,AAAAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAA,AAA",AAAAA,AAAA,AA,AA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAA,AAAAAAAAAAAAAAA,"AAAAAAAA,AAA",AAAA,AAAA,AAAAA,AAA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAAAAAAAAA,"AAAAAAA,AAA",AAAA,AAAA,AA,AAA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAA""",AAAAAAAAAAAAAAAA,"AAAAAAAAA,AAAAAAAAAAAAAAA",AAAA,AAAA,AA,AA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAA,"AAAAAAA,AAAAAAAAAAAAAAA",AAAA,AAAA,AA,AA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAA,"AAAAAAAAAAA,AAAAAAA",AAAA,AAAA,AAA,AAAA,AAAAAA,AAAAA,AAAAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAA,AAAAAAAAAAAAAAAAAAA,"AAAAAAAA,AAA,AAAAAAA",AAAA,AAAA,AA,AA,AAAAAA,AAAAAAAA,AAAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAA,AAAAAAAAAAAAAA,"AAAA,AAAAAAA",AAAA,AAAA,AAA,AAAA,AAAAAA,AAAAA,AAAAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAAAAAA,"AAAAAAA,AAAAAAA",AAAA,AAAA,AA,AA,AAAAAA,AAAA,AAAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAAAAAAAAAAAAAAA,"AAAAAAAA,AAAAAAAAAAAAAAA",AAAA,AAAA,AA,AA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAA,AAAAAAAAAAAAAA,"AAAAAAA,AAA",AAAA,AAAA,AAAAA,AA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAAAAAAAAAAAA,"AAAAAA,AAA",AAAA,AAAA,AAAAA,AA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAA,AAAAAAAAAAAAAA,"AAAAAAAA,AAA",AAAA,AAAA,AAAAA,AAAAA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAA,"AAAAAAAAAA,AAAAAAAA",AAAA,AAAA,AA,A,AAAAA,AAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAA,"AAAAAAAA,AAA",AAAA,AAAA,AAAAA,AAAAA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAAAAAAAAAAA,"AAAAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAAAAAAAAAA,"AAAAAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAAAAAAAAAAAA,"AAAAAAA,AAAAAAAA",AAAA,AAAA,AA,AA,AAAAA,AAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAA,AAAAAAAAAAAAAAAAAAAAA,"AAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAA,"AAAAAAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAAAAAAAAAAAAAA""",AAAAAAAAAA,"AAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAA,"AAAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAA,AAAAAAAAAAAAAAA,"AAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAAAAA,"AAAAAAAAAA,AAA",AAAA,AAAA,AAAAA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAA,AAAAAAAAA,"AAAAAAAAAAA,AAA",AAAA,AAAA,AAAAA,AAAAA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAAAAAAAAAAAA,"AAAAAAAAAAAAAAA,AAA",AAAA,AAAA,AAAAA,AAAAA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAA,AAA",AAAA,AAAA,AAAAA,AAAAA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAA""",AAAAAAAAAAAAAA,"AAAAAAAAAAA,AAAAAAA",AAA,AAAA,AAA,AAA,AAAAA,AAAAA,AAAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAA,AAAAAAAAAAAA,"AAAAAA,AAA",AAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAA,AAAAAAAAAA,"AAAAAAAAA,AAAAAAAA",AAAA,AAAA,AA,AA,AAAAA,AAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAA,AAAAAAAAAAAA,"AAAAAAAAAAA,AAAAAAA",AAAA,AAAA,AAA,AAA,AAAAA,AAAAA,AAAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAA,AAAAAAAAAAAAAA,"AAAAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAA,"AAAAAA,AAAAAAAA",AAA,AAAA,AA,AA,AAAAA,AAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAA""",AAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAA,AAAAAAA",AAA,AAAA,AAA,AAA,AAAAA,AAAAA,AAAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAAAA,AAA",AAAA,AAAA,AAAAA,AAAAA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAA,"AAAAAA,AAA",AAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAA,AAA",AAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAAAAAAAAAAAA,"AAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAA,AAAA,AAAA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAAAA,AAA,AAAAAAA",AAA,AAAA,AA,A,AAAAA,AAAAAAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAAAAAAAA""",AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAA,AAA",AAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAA,AAAAAAA,"AAAAAAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAA,AAAAAAAAAAAAAAAAAAA,"AAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAA,AAAAA,"AAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAA,AAA",AAA,AAAA,AAAAA,AAAAA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAAAAAAAAA,"AAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAA""AAAAAAAAAAAAAAAAAAAAAAAA",AAAAAAAAAAAAAAAAA,"AAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,"AAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAA,AAAAAAAAAAAAAAA,"AAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAA,AAAAAAAAA,"AAAAAAAAAA,AAA",AAA,AAAA,AAAAA,AAAAA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAA,AAAAAAAAAAAAAAAAAAA,"AAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAA,AAAAAAAAAAAAA,"AAAAAAAAAA,AAA",AAA,AAAA,AAAAA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAAAA""",AAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAA,"AAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAAAAAAAAAAA,"AAAAAAAAAAA,AAA",AAA,AAAA,AAAA,AAAA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAA,"AAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAA,AAAAAAAAAAAAAAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAA,AAAAAAAAAAAAAAAA,"AAAAAAAA,AAA",AAA,AAAA,AA,AA,AAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAA,"AAAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAA,AAAA,A,AA,AAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAA,AAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAA,AAAA,A,A,AAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAA,"AAAAAA,AAA",AAA,AAAA,AA,AA,AAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAAAAAAAAAA,"AAAAAAAA,AAAAAAAAAA",AAAAA,AAAA,AA,AAA,AAAAAAA,AAAAAAAAAA,AAAAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAA,AAA",AAAAA,AAAA,AAAAA,AAAAAA,AAAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAAA,AAAA,AA,AAA,AAAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAA,"AAAAAAA,AAAAAAAA",AAAAA,AAAA,AA,AA,AAAAAAA,AAAA,AAAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,AAAAAA,"AAAAAA,AAAAAAAA",AAAAA,AAAA,AA,AA,AAAAAA,AAAA,AAAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAAAAAAAA,"AAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAAAAAAAAAAAAAAA,"AAAAAAA,AAAAAAA",AAAA,AAAA,AA,AA,AAAAAA,AAAA,AAAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAA,AAAAAAAAAAAAA,"AAAAAAAAAAAAAAA,AAA",AAAA,AAAA,AAAAA,AAAAAA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAA""",AAAAAAAAAAAAAAAAAAAAAAA,"AAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAAAA,"AAAAAAA,AAAAAAAA",AAAA,AAAA,AA,AA,AAAAAA,AAAA,AAAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAA,AAA",AAAA,AAAA,AA,AAA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAA,AAAAAAAAAAAAAA,"AAAAAAAAA,AAAAAAAAAA",AAAA,AAAA,AA,A,AAAAAA,AAAAAAAAAA,AAAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAAAAAAAAAA,"AAAAAA,AAAAAAAAAAAAAAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAAAAAA,"AAAAAAAAA,AAAAAAAA",AAAA,AAAA,AA,AA,AAAAA,AAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAAAAAAAAAAA,"AAAAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAA,AAAAAAAAAAAAAAAAAAAAA,"AAAAAA,AAA",AAAA,AAAA,AAAAA,AAAAA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAAAAAAAAAAAAAA""",AAAAAAAA,"AAAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAA,AAAAAAAAAAAAAAAA,"AAAAAAA,AAAAAAA",AAAA,AAAA,AAA,AAA,AAAAA,AAAAA,AAAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAA,AAAAAAAAAAAAAAAA,"AAAAAA,AAA",AAAA,AAAA,AA,AAA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAA,AAAAAAAAAAAAAA,"AAAAAAAAAAAA,AAA",AAAA,AAAA,AAAAA,AAAAA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAA,AAAAAA,"AAAAAAA,AAAAAAAA",AAAA,AAAA,AA,AA,AAAAA,AAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAA,AAAAAAAAAA,"AAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAA,AAAAAAAAAAAA,"AAAAAAAA,AAAAAAAAAA",AAA,AAAA,AA,AA,AAAAA,AAAAAAAAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAAAAAAAA,"AAAAAAA,AAA",AAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAAAAAAAA,"AAAAAAA,AAA",AAAA,AAAA,AAAAA,AAAAA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAAAAAAAAAA,"AAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAAAAAAAAAAA,"AAAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAA,AAAAAAAAAA,"AAAAAAAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAA,"AAAAAAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAA,AAAAAAAAAAAAAAA,"AAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAA,AAAAAAAAAAA,"AAAAAAAAA,AAA,AAAAAAA",AAA,AAAA,AA,AA,AAAAA,AAAAAAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAA,"AAAAAAAAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAA,AAAAAAAAAAAA,"AAAAAAA,AAA",AAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAAAAAAA,"AAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAAAAAAAAA,"AAAAAAAAAAA,AAA",AAAA,AAAA,AAAAA,AAAAA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAA,"AAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAA,AAAAAAAAAAAA,"AAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAAAAAAAAAAA""",AAAAAAAAAAAAAAAA,"AAAAAA,AAA",AAAA,AAAA,A,A,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAAAAAAAAAAAAAA""",AAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAA,AAA",AAA,AAAA,AAAAA,AAAAA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAAAAAAA,"AAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAA,AAAAAAAAAAAAA,"AAAAAAAAAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAA,AAAAAAA,"AAAAAAA,AAAAAAAA",AAA,AAAA,AA,AA,AAAA,AAAA,AAAA -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAAAAA""",AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAA,AAAAAAAAAAAAAAAAAAA,"AAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAAAAAAAAA,"AAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAA,"AAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAA,AAA",AAA,AAAA,AAAAA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAA,AAAAAAAAA,"AAAAAA,AAAAAAAA",AAA,AAAA,AA,AA,AAAA,AAAA,AAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAA,"AAAAAAAAAA,AAA",AAA,AAAA,AAAAA,AAAAA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAA,AAAAAAAAA,"AAAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAA,AAAAAAAAAAAAA,"AAAAAAA,AAA",AAA,AAAA,AA,AA,AAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAAAAAAAA,"AAAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAA,AAAAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAA,AAAA,A,AA,AAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAAA,AAA",AAA,AAAA,AAAAA,AAAAA,AAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAA,AAAAAAAAAA,"AAAAAA,AAAAAAAA",AAA,AAAA,AA,AA,AAA,AAAA,AAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAA,AAAAAAA,"AAAAAAAAA,AAAAAAA",AAAA,AAAA,AA,AAA,AAAAAAA,AAAA,AAAAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAAAAAAAAA,"AAAAAAA,AAA",AAAAA,AAAA,AAAAA,AAAAAA,AAAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAA,AAAAAAAAA,"AAAAAA,AAA",AAAAA,AAAA,AAAAA,AAA,AAAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAAAAA""",AAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAAAAAA,AAA",AAAA,AAAA,AAAAA,AAAAA,AAAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAAAAAAAAAA,"AAAAAAAA,AAA",AAAAA,AAAA,AAAAA,AAAAA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAA""",AAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAA,AAA",AAAA,AAAA,AAAAA,AAAAA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAA,AAAAAAAAAAAAAAAAAAAA,"AAAAAAA,AAAAAAAA",AAAAA,AAAA,AA,AA,AAAAAA,AAAA,AAAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAA,AAAAAA,"AAAAAA,AAAAAAAA",AAAA,AAAA,AA,AA,AAAAAA,AAAA,AAAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAAAAAAAAA,"AAAAA,AAAAAAA",AAAA,AAAA,AA,AA,AAAAAA,AAAA,AAAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAAA,AAAA,AAAAA,AAAAA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAA,AAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAA,AAAAAAA",AAAAA,AAAA,AAA,AAAA,AAAAAA,AAAAA,AAAAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAA,"AAAAAAA,AAAAAAAAAAAAAAA",AAAA,AAAA,AA,AA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAA,AAAAAAAAAAAAAA,"AAAAAAAA,AAA",AAAA,AAAA,AAAAA,AA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAA,"AAAA,AAAAA",AAAA,AAAA,AAA,AAA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAAA,AAAA,AA,AAA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAA,AAAAAAAAAAAAA,"AAAAAAAAAA,AAA",AAAA,AAAA,AAAAA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAA,"AAAAAA,AAA",AAAA,AAAA,AA,AAA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAA,AAAAAAAA",AAAA,AAAA,AA,AA,AAAAA,AAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAAAAA""",AAAAAAAAAAAAAAAAAAAAAAA,"AAAAAA,AAA",AAAA,AAAA,AA,AAA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAA,AAAAAAAAAAAA,"AAAAAAAAAAA,AAAAAAA",AAAA,AAAA,AAA,AAA,AAAAA,AAAAA,AAAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAA,AAAAAAAAAAAAAAAA,"AAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAAAAAAAAAAA,"AAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAA,AAAAAAAAAA,"AAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAA,"AAAAAAA,AAAAAAAA",AAA,AAAA,AA,A,AAAAA,AAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAA,AAAAAA,"AAAAAAA,AAAAAAAA",AAA,AAAA,AA,AA,AAAAA,AAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAA,"AAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAA,AAAAAAAAAAAAA,"AAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAA,AAAAAAAAAAA,"AAAAAAA,AAA",AAAA,AAAA,AAAAA,AAAAA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAA,"AAAAAAA,AAAAAAAA",AAAA,AAAA,AA,AA,AAAAA,AAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAA,AAAAAAAAAAAAAAAAAAA,"AAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAA,AAAA,AAAAA,AAAAA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAA,AAAAAAAAAAAAAAAA,"AAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAA,AAAAAAAAAAAAAAA,"AAAAAAAAA,AAAAAAAA",AAA,AAAA,AA,AA,AAAAA,AAAA,AAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAA,AAAAAAAAA,"AAAAAAAAAA,AAA",AAAA,AAAA,A,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAAAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAAAAAAAAA,"AAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAA,AAAAAAAAA,"AAAAAAAAAA,AAA",AAA,AAAA,AAAAA,AAAAA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAA,"AAAAAA,AAAAAAAA",AAA,AAAA,AA,AA,AAAA,AAAA,AAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAA,AAAAAAAAAAAAAA,"AAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,"AAAAAAA,AAAAAAAA",AAA,AAAA,AA,AA,AAAA,AAAA,AAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAA,AAAAAAAAAA,"AAAAAAA,AAAAAAAA",AAA,AAAA,AA,AA,AAAA,AAAA,AAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAA,AAAAAAAAAAAAAAAAAAA,"AAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAA,"AAAAAAAAAAA,AAA",AAA,AAAA,AAAAA,AAAAA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAAAAA,"AAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAA,"AAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAA,"AAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAA,AAAA,AA,AA,AAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAA,AAAAAA,"AAAAAA,AAAAAAAA",AAA,AAAA,AA,AA,AAA,AAAA,AAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAAAAAA,AAAAAAAAAA",AAAAA,AAAA,AAA,AAA,AAAAAAA,AAAAAAAAAA,AAAAAAA -AAAAAAAAAA,AAAAAAAAAA,"AAAAAAAAAAAAAAAAAAA""AAAAAAA""",AAAAAAAAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAAA,AAAA,AA,AAA,AAAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAA,AAAAAAAAAAAAAA,"AAAAAAAAAA,AAA",AAAAA,AAAA,AAAAA,AAA,AAAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,"AAAAAAAAAAAAAAAAAAA""AAAAAA""",AAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAAA,AAAA,AA,AAA,AAAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAA,AAAAAAAAAAAAA,"AAAAAAA,AAAAAAAA",AAAAA,AAAA,AA,AA,AAAAAA,AAAA,AAAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAA,AAAAAAAAAA",AAAA,AAAA,AAA,A,AAAAAA,AAAAAAAAAA,AAAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAAA,AAAA,AA,AAA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAA""",AAAAAAAA,"AAAAAA,AAAAAAAA",AAAA,AAAA,AA,AA,AAAAAA,AAAA,AAAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,"AAAAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAA,"AAAAAAAAAAAAAAA,AAA",AAAA,AAAA,AAAAA,AAAAAA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAAAAAAAAAAAAAAAA,"AAAAAAAA,AAA",AAAA,AAAA,AA,AAA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAA,AAA",AAAA,AAAA,AAAAA,AAAAAA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAAAAAAAAAAAAAAAA""",AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAA,"AAAAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAA,AAAAAAAAAAAAA,"AAAAAAAAAAAAAAA,AAA",AAAA,AAAA,AA,AAAAA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAAAAAAAAA""",AAAAAAAAAA,"AAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAAAA,AAA,AAAAAAA",AAAA,AAAA,AA,A,AAAAA,AAAAAAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAA,AAAA,AAAAA,AAAAA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAAAAAA,"AAAAAA,AAAAAAAA",AAAA,AAAA,AA,AA,AAAAA,AAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAA,AAAAAAA,"AAAAAA,AAAAAAAA",AAA,AAAA,AA,AA,AAAAA,AAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAAAAAAAAAAA,"AAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAA,"AAAAAA,AAA",AAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAAAAAAAAA,"AAAAAAA,AAA",AAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAAAAAAA,"AAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAA,AAAAAAAAAAAAAAA,"AAAAAAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAAAAAAAA""",AAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAA,AAAAAAAAAAAAAAA,"AAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAA,AAAAAAAAAAAAAAAAAAA,"AAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAAA,AAA",AAA,AAAA,AA,AAAAA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAA,AAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAAAAAA,"AAAAAA,AAAAAAAAAAAAAAA",AAA,AAAA,A,A,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAAA,"AAAAAAA,AAAAAAAA",AAA,AAAA,AA,AA,AAAA,AAAA,AAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAA,"AAAAAAA,AAAAAAAA",AAA,AAAA,AA,AA,AAAA,AAAA,AAAA -AAAAAAAAAA,AAAAAAAAAA,AAAA,AAAAAAAAAA,"AAAAAAA,AAAAAAAA",AAA,AAAA,AA,AA,AAAA,AAAA,AAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAA,AAAAAAAAAAAA,"AAAAA,AAA",AAA,AAAA,AAAAA,AAAAA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAA,AAAAAAAAAA,"AAAAAA,AAAAAAAA",AAA,AAAA,AA,AA,AAAA,AAAA,AAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAAAAAAAAAAA,"AAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAA,"AAAAAAAAAAA,AAA",AAA,AAAA,AAAAA,AAAAA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAA,AAAAAAAAAAAAA,"AAAAAA,AAAAAAAAAAAAAAA",AAA,AAAA,A,A,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAA,AAAAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAA,AAAA,AA,AA,AA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAAAAAAAAAAA,"AAAAAA,AAAAAAAAAAAAAAA",AAAAA,AAAA,AA,AA,AAAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAA,AAAAAAAAAAAAAA,"AAAAAAA,AAA",AAAA,AAAA,AA,AAA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAA,AAAAAAAAAAAAAAA,"AAAAAAAA,AAAAAAAA",AAAA,AAAA,AA,AA,AAAAAA,AAAA,AAAAAA -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAA""",AAAAAAAAAAAAAAAAA,"AAAAAAAAA,AAAAAAA",AAAA,AAAA,AAA,AAA,AAAAAA,AAAAA,AAAAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAA,"AAAAAAAAAAAA,AAA",AAAA,AAAA,AA,AAA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAAA,AAAA,AAAAA,AAAAA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAA,AAAAAAAAAA,"AAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAA,"AAAAAAAA,AAA",AAAA,AAAA,AA,AAAAA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAA,AAAAAAAAAAA,"AAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAA""",AAAAAAAAAA,"AAAAA,AAA",AAAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAA,AAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAA,AAAA,AA,AAA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAAAAAAAAAAA""",AAAAAAAAAAAAAAAA,"AAAAAAAAAAA,AAAAAAA",AAAA,AAAA,AAA,AAA,AAAAA,AAAAA,AAAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAA,"AAAAAAAAAAAAA,AAA",AAAA,AAAA,AAAAA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAA,AAAAAAAAAAAAAAAAAAAAA,"AAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAA,AAAAAAAAAAAA,"AAAAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAAAAAAAAAAAAA,"AAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAA,AAAAAAAAAAAAAAAAAA,"AAAAAAA,AAAAAAAA",AAAA,AAAA,AA,AA,AAAAA,AAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAA,AAAAAAAAAAAAA,"AAAAAAAA,AAA,AAAAAAA",AAAA,AAAA,AA,AA,AAAAA,AAAAAAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAA,AAAAAAAAAAAAA,"AAAAAAAAAA,AAA",AAAA,AAAA,AAAAA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAAAAAA,"AAAAAAA,AAA",AAA,AAAA,AAAAA,AAAAA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAA,AAAAAAAAAAAAAAAAAA,"AAAAAA,AAA",AAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAAAAAAAA,"AAAAAAA,AAA",AAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAAAAA""AAAAAAAAAAAAAAAAAAAAA",AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAA,AAAAAAAAAAAAAAAAA,"AAAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAA,AAAAAAAAAAAAA,"AAAAAAAAAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAA,AAAAAAAAAAA,"AAAAAA,AAA",AAA,AAAA,AAAAA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAA,"AAAAAA,AAA",AAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAA,AAAAAAAAAAAAAAA,"AAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAA,AAAAAAAAAAAAAAAAAAAA,"AAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAAAAAAAAAAA,"AAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAA,AAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAA,AAA",AAA,AAAA,AAAAA,AAAAA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAA,"AAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAA,AAAAAAAAAAAAAAAAAAA,"AAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAA,AAAAAAAAA,"AAAAAA,AAAAAAAA",AAA,AAAA,AA,AA,AAAA,AAAA,AAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,"AAAAAAAAA,AAAAAAAA",AAA,AAAA,AA,AA,AAAA,AAAA,AAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAAA,AAA",AAA,AAAA,AAAA,AAAAA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAA,AAAAAAAAAAA,"AAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAA,AAA,"AAAAAAA,AAAAAAAA",AAA,AAAA,AA,AA,AAA,AAAA,AAA -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAAAAAAAAAAAA""",AAAAAAAAAAAA,"AAAAAAAAAAA,AAAAAAA",AAA,AAAA,AA,AAA,AAA,AAAAA,AAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAA,AAAAAAAAAA,"AAAAAAAAA,AAAAAAAA",AAA,AAAA,AA,AA,AAA,AAAA,AAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAA,AAAAAAAAA,"AAAAAAAAAA,AAA",AAA,AAAA,AAAA,AAAA,AAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA""",AAAAAAAAAAAA,"AAAAAAAAAAA,AAAAAAA",AAA,AAAA,AA,AAA,AAA,AAAAA,AAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAAAAAAAAA,"AAAAAAAAA,AAAAAAAAAA",AAAAA,AAAA,AA,AAA,AAAAAAA,AAAAAAAAAA,AAAAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAAAAAAAAAAAA,"AAAAAAAAAA,AAAAAAAAAAAAAAA",AAAAA,AAAA,AA,AA,AAAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAAA,AAA",AAAAA,AAAA,AAAAA,AAA,AAAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAA,AAAAAAAAAAAAAAAAAAAA,"AAAAAAA,AAAAAAAA",AAAAA,AAAA,AA,AA,AAAAAAA,AAAA,AAAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAAAAAAAAAAAAAA,"AAAAAAA,AAA,AAAAAAA",AAAAA,AAAA,AA,AA,AAAAAA,AAAAAAAA,AAAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAAAAAAAAAA,"AAAAAAA,AAAAAAAA",AAAA,AAAA,AA,AA,AAAAAA,AAAA,AAAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAA,AAAAAAAAAA,"AAAAA,AAA",AAAAA,AAAA,AAAAA,AAAAA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAA""",AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAAA,AAAA,AA,AAA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAA,AAAAAAAAAAAAAAA,"AAAAAA,AAAAAAAAAAAAAAA",AAAA,AAAA,AA,AAA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAA,"AAAAAA,AAA",AAAAA,AAAA,AA,AA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAAAAAAA,"AAAAA,AAAAAAAAAA",AAAA,AAAA,AA,AAA,AAAAAA,AAAAAAAAAA,AAAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAAAAAAAAAAAAAA,"AAAA,AAA",AAAA,AAAA,AA,AA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAA,AAAAAAAAAAAAA,"AAAAAA,AAA",AAAA,AAAA,AAAAA,AA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAAAAAAAA,"AAAAAAAAAAA,AAAAAAA",AAAA,AAAA,AAA,AAAA,AAAAAA,AAAAA,AAAAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAA,"AAAAAA,AAAAAAAAAAAAAAA",AAAA,AAAA,AA,AAA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAA,AAA",AAAA,AAAA,AAAAA,AA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAA,"AAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAA""",AAAAAAAAAAAAA,"AAAAAAA,AAA",AAAAA,AAAA,AA,AA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAA,AAA",AAAA,AAAA,AAAAA,AAAAA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAA,AAAAAAA",AAAA,AAAA,AAA,AAA,AAAAAA,AAAAA,AAAAAAA -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAAA""",AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAA,AAA,AAAAAAA",AAAA,AAAA,AA,AA,AAAAAA,AAAAAAAA,AAAAAA -AAAAAAAAAA,AAAAAAAAAA,"AAAAAAAAAAAAAA""AAAAAAAAAAAAA""",AAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAA,AAA",AAAA,AAAA,AA,AAA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAAAAAAAAAAA""",AAAAAAAAAAAAAAAAA,"AAAAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAAAA,"AAAAAA,AAAAAAAAAAAAAAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAAAAA""",AAAAAAAAAAA,"AAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAA,AAAAAAAAAAAAAAAAA,"AAAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAA,"AAAAAAA,AAAAAAAA",AAAA,AAAA,AA,AA,AAAAA,AAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAAAAAAAAA""AAAAAAAAAAAAAAAAAAAAAAA",AAAAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAA,AAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAAAAAAAAAAAAAAAA,"AAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAAAAAAAAAAA,"AAAAAAAAAAA,AAAAAAA",AAAA,AAAA,AAA,AAAA,AAAAA,AAAAA,AAAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAAA,AAAA,AAAAA,AAAAA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAAAAAAAAAAAA""",AAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAA,AAA",AAAA,AAAA,AAAAA,AAAAA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAAAAAAAA,"AAAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAA,"AAAAA,AAAAAAAA",AAA,AAAA,AA,A,AAAAA,AAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAA,AAAAAAAAAAAAAAAA,"AAAAAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAA,AAA",AAAA,AAAA,AAAAA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAA,"AAAAAAAAAAA,AAA",AAAA,AAAA,AA,AAAAA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAA,"AAAAA,AAA",AAAA,AAAA,AAAAA,AAAAA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAAAAAAAAAAA,"AAAAAAA,AAA,AAAAAAA",AAA,AAAA,AA,A,AAAAA,AAAAAAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAA,"AAAAAAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAAAAA""",AAAAAAAAAAAAAAAAAAA,"AAAAAAAA,AAA,AAAAAAA",AAAA,AAAA,AA,AA,AAAAA,AAAAAAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,"AAAAAAAA,AAA,AAAAAAA",AAAA,AAAA,AA,AA,AAAAA,AAAAAAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAA,"AAAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAA,AAAAAAAAAAAA,"AAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,"AAAAAAAAAAAAAAAAAAAAA""AAAAAAAAAAAA""",AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAA,"AAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAA,"AAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAA,AAA",AAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAA""",AAAAAAAAAAAAAAAAAAA,"AAAAA,AAA",AAAA,AAAA,AAAAA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAAA,AAAA,AAAAA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAAAAAAAA,"AAAAAA,AAA",AAAA,AAAA,AAAAA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAAAAAAAA,"AAAAAAAA,AAAAAAAAAA",AAA,AAAA,AA,AA,AAAAA,AAAAAAAAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAAAAA""AAAAAAAAAAAAAAAAAAAAA",AAAAAAAA,"AAAAAAAAAA,AAA",AAAA,AAAA,AAAAA,AAAAA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAAA,AAAA,AAAAA,AAAAA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAAAAA,"AAAAAAAA,AAA,AAAAAAA",AAAA,AAAA,AA,AA,AAAAA,AAAAAAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAAAAAA,"AAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAA,AAAAAAAAAAA,"AAAAAA,AAAAAAAA",AAA,AAAA,AA,AA,AAAAA,AAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAA,"AAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAAA,AAAA,AAAAA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAAAAAAAAAAA,"AAAAAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAAAAAAAAAAA,"AAAAAAA,AAA,AAAAAAA",AAAA,AAAA,AA,AA,AAAAA,AAAAAAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAA,AAAAAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAAAAAAAAAAA,"AAAAAAAA,AAA,AAAAAAA",AAA,AAAA,AA,AA,AAAAA,AAAAAAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAAAA,AAA",AAAA,AAAA,AAAAA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAA""AAAAAAAAAAAAAAAAAAAAAA",AAAAAAAAAAAAA,"AAAAA,AAA",AAAA,AAAA,AAAAA,AAAAA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAA,"AAAAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAA,AAAAAAAAAAAAAA,"AAAAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAA,AAAA,AAAAA,AAAAA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAAAAAA,"AAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAA,"AAAAAAAAA,AAA,AAAAAAA",AAA,AAAA,AA,A,AAAAA,AAAAAAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAA,AAAA,AAAAA,AAAAA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAAAAA""",AAAAAAAAA,"AAAAAAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAAAAAAAA""",AAAAAAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAA,AAAAAAAAAAAA",AAA,AAAA,AA,A,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAAAAAAAAAAAAA,"AAAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAA,"AAAAAAA,AAA,AAAAAAA",AAA,AAAA,AA,AA,AAAA,AAAAAAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAA,AAAAAAAAAAAAAAAAAAAAAA,"AAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAA,AAAAAAAAAAAA,"AAAAAAAAAA,AAAAAAAAAAAAAAA",AAA,AAAA,A,A,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAAAAAAAAAA,"AAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAA,AAAAAAAAAAAA,"AAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAA,AAAAAAAAAAAAA,"AAAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAA,AAAAAAAA,"AAAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAA,AAAAAAAAAA,"AAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAAAAA,"AAAAAAAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAA,AAAAAAAAAAAA,"AAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAA,"AAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAA,AAAAAA,"AAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAA,"AAAAAA,AAA",AAA,AAAA,A,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAAAAAAAAAAA,"AAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAA,"AAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAA,AAAAAAAAAA,"AAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAA,AAAAAAAAAAA,"AAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAAAAAAAAAA,"AAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAA,AAAAAAAAAAAA,"AAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAA,AAAAAAAAAAAAAAA,"AAAAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAA,AAAAAAAAAAAA,"AAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAAAAAAAAAAAAAA,"AAAAAAAA,AAA,AAAAAAA",AAA,AAAA,AA,AA,AAAA,AAAAAAAA,AAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAA,AAAAAAAAAAA,"AAAAAAAA,AAAAAAAA",AAA,AAAA,AA,AA,AAAA,AAAA,AAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAA,AAA",AAA,AAAA,A,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAA,AAAAAAAAAAAAAAA",AAA,AAAA,A,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAA,AAAAAAAAAAAAAAAA,"AAAAAAAAAAA,AAA",AAA,AAAA,AAAA,AAAAA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAA,AAAAAAAAAA,"AAAAAA,AAAAAAAA",AAA,AAAA,AA,AA,AAAA,AAAA,AAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAA,"AAAAAA,AAAAAAAA",AAA,AAAA,AA,AA,AAA,AAAA,AAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAA,"AAAAAAAA,AAA",AAA,AAAA,A,A,AAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAA,AAAAAAA",AAAA,AAAA,AA,AAA,AAAAAAA,AAAA,AAAAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,AAAAA,"AAAAAAAAA,AAA",AAAAA,AAAA,AA,AAA,AAAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAA,"AAAAAAAAAA,AAA",AAAAA,AAAA,AA,AAA,AAAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAA,"AAAAA,AAA",AAAAA,AAAA,AA,AAA,AAAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAAAAAAAAAAA,"AAAAAAAA,AAA",AAAAA,AAAA,AAAAA,AAAAAA,AAAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAA""",AAAAAAAAAAAAA,"AAAAAAA,AAAAAAAAAAAAAAA",AAAA,AAAA,AA,AA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAAAAAA,AAAAAAAAAA",AAAA,AAAA,AAA,AAA,AAAAAA,AAAAAAAAAA,AAAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAA,AAAAAAAAAAAAA,"AAAAAAAAAAAAAAA,AAA",AAAA,AAAA,AAAAA,AAAAAA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAA,"AAAAAA,AAAAAAAAAAAAAAA",AAAA,AAAA,AA,A,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAA""",AAAAAAAAAAA,"AAAAAAA,AAAAAAAA",AAAA,AAAA,AA,AA,AAAAAA,AAAA,AAAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAAAAAA,AAA",AAAA,AAAA,AAAAA,AAAAA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAAAAAAAAAAAA,"AAAAAAAAAAAAAA,AAA",AAAA,AAAA,AA,AAA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAA,AAAAAAAAAAAAA,"AAAAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAA,AAAAAAAA",AAAA,AAAA,AA,AA,AAAAAA,AAAA,AAAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAA,"AAAAAAAAAAA,AAA",AAAA,AAAA,AAAAA,AAAAA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAAAAAAAAAAAAAAA,"AAAAAAAA,AAAAAAA",AAAA,AAAA,AA,AAA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAA,AAAAAAAAAAAAAAA,"AAAAAA,AAAAAAAA",AAAA,AAAA,AA,AA,AAAAAA,AAAA,AAAAAA -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAAAAAAAAAAAAAAAA""",AAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAAA,AAAA,AA,AAA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAA,AAA",AAAA,AAAA,AAAAA,AAAAA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAAAAAAAAAAAAA,"AAAAAAAAAA,AAA",AAAA,AAAA,AAAAA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAA,AAAAAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAAAA""",AAAAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAAAA""",AAAAAAAAAAAAA,"AAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAA,"AAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAAAAAAAAAAA,"AAAAAAAA,AAAAAAAA",AAAA,AAAA,AA,A,AAAAA,AAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAA,AAAAAAAAAA,"AAAAAAAAAAA,AAA",AAAA,AAAA,AAAAA,AAAAA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAAA,AAAA,AA,AAAAA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAAA,AAAA,AAAAA,AAAAA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAA,"AAAAAAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAA,AAAAAAAAA,"AAAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAA,AAA",AAAA,AAAA,AA,AAA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAAAA,AAA",AAAA,AAAA,AAAAA,AAAAA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAAAAA""",AAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAA,AAA,AAAAAAA",AAAA,AAAA,AA,AAA,AAAAA,AAAAAAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAAAAAA,AAA,AAAAAAA",AAA,AAAA,AA,A,AAAAA,AAAAAAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAAAAAA""",AAAAAAAAAAAAAAAAA,"AAAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAA,AAAA,AAAAA,AAAAA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAA,"AAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAAAAAAAAAAAA,"AAAAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,"AAAAAA,AAAAAAAA",AAAA,AAAA,AA,AA,AAAAA,AAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAA,AAAAAAA",AAAA,AAAA,AA,AAA,AAAAA,AAAAA,AAAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAA,"AAAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAAAAAAA,"AAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAA,"AAAAAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAA,AAAAAAAAAAAA,"AAAAAAAAAAA,AAA",AAAA,AAAA,AAAAA,AAAAA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAA""",AAAAAAAAAAAAAAAA,"AAAAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAA,AAAAAAAAAAA,"AAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAAAAAAAA,"AAAAAAAA,AAA,AAAAAAA",AAAA,AAAA,AA,AA,AAAAA,AAAAAAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAA,AAAAAAAAAAA,"AAAAAAA,AAA",AAAA,AAAA,AA,AAAAA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAAAAAAAAAAA,"AAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAAAAAAAAAAAAAAA,AAA,AAAAAAA",AAA,AAAA,AA,A,AAAAA,AAAAAAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAA,AAA,"AAAAAAAA,AAAAAAAA",AAAA,AAAA,AA,AA,AAAAA,AAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAAAA,"AAAAAAA,AAA,AAAAAAA",AAAA,AAAA,AA,AA,AAAAA,AAAAAAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAA,AAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAAA,AAAA,AAAAA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAA""",AAAAAAAAAAAAAAA,"AAAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAA,AAAAAAAAA,"AAAAAAA,AAAAAAAA",AAA,AAAA,AA,AA,AAAAA,AAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAA,AAA,AAAAAAA",AAAA,AAAA,AA,AA,AAAAA,AAAAAAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAA,"AAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAA,AAAAAAAAAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAAAAAAA,"AAAAAAA,AAA",AAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAA,"AAAAAAAAAAA,AAA",AAA,AAAA,AAAAA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAA,AAAAAAAA",AAA,AAAA,AA,A,AAAAA,AAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAAAAAA,"AAAAAAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,"AAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAA,"AAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAA""",AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAA,AAAAAAAAAAA,"AAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAA,AAA,AAAAAAA",AAA,AAAA,AA,AA,AAAAA,AAAAAAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAA,"AAAAAA,AAA",AAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAA,AAAAAA,"AAAAAAA,AAA",AAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAA,AAA,AAAAAAA",AAA,AAAA,AA,A,AAAAA,AAAAAAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAAA,AAA",AAA,AAAA,AAAAA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAA,"AAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAA,AAAAAAAAAAA,"AAAAAAA,AAA",AAA,AAAA,AAAAA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAA,"AAAAAAAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAA""",AAAAAAAAAAAAAA,"AAAAAAAAAAA,AAAAAAA",AAA,AAAA,AA,AAA,AAAA,AAAAA,AAAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAA,"AAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAA,"AAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAAAAAAAAAAA,"AAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAAAAAAAAAAAAA""",AAAAAAAA,"AAAAAAAAAAA,AAAAAAA",AAA,AAAA,AAA,AAA,AAAA,AAAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAA,"AAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAAAAAAAAAAAAAAA,"AAAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAA,AAAAAAAAAAAA,"AAAAAAAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAA,AAAAAAAAAAAAAAA,"AAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAA,AAAAAAAAA,"AAAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAA,AAAA,AAAAA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAA,AAAAAAAAAAAAA,"AAAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAA,"AAAAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAA,"AAAAAA,AAA",AA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAA,AAAAAAAAAAAA,"AAAAAAAA,AAAAAAAA",AAA,AAAA,AA,AA,AAAA,AAAA,AAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAAAAAA,"AAAAAAAAAA,AAA",AAA,AAAA,AAAA,AAAAA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAA,AAAAAAAAA,"AAAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAA,"AAAAAAAA,AAA,AAAAAAA",AAA,AAAA,AA,AA,AAAA,AAAAAAAA,AAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAA,"AAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAA,AAA,"AAAAAAAA,AAAAAAAA",AAA,AAAA,AA,AA,AAA,AAAA,AAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAA,AAAA,A,A,AAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAA,AAAAAAAAAAAA,"AAAAAAAAA,AAAAAAAA",AAA,AAAA,AA,AA,AAA,AAAA,AAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAAAAAAA,"AAAAAAA,AAA",AAA,AAAA,A,AA,AAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAAAA""",AAAAAAAAAAAA,"AAAAAAAAAAA,AAAAAAA",AAA,AAAA,AAA,A,AAA,AAAAA,AAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAAAAAA,"AAAAAAAAAAAAAAAAAAA,AAAAAAAAAA",AAAAA,AAAA,AA,AAA,AAAAAAA,AAAAAAAAAA,AAAAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAA,"AAAAAAAAA,AAAAAAAAAAAAAAA",AAAAA,AAAA,AA,AAA,AAAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAAAAAAAAAAAAAAAA,"AAAAAAAA,AAA,AAAAAAA",AAAA,AAAA,AA,AA,AAAAAA,AAAAAAAA,AAAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAA,"AAAAAAAAAAA,AAA",AAAA,AAAA,AA,AAA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAAAAAAAAAAAAA,"AAAAAAAA,AAAAAAAA",AAAA,AAAA,AA,AA,AAAAAA,AAAA,AAAAAA -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAA""",AAAAAAAAAAAAAAAA,"AAAAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAA,AAAAAAAAAAA,"AAAAAAAAAAA,AAA",AAAA,AAAA,AA,AAA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAA,AAA,AAAAAAA",AAA,AAAA,AA,A,AAAAAA,AAAAAAAA,AAAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAAAAAAAA,"AAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAAA,AAAA,AAAAA,AAAAA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAA,AAA",AAAA,AAAA,AAAAA,AAA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,"AAAAA,AAAAAA,AAAAA",AAAAAAAAAAAAAAA,"AAAAAAAAA,AAAAAAA",AAAA,AAAA,AAA,A,AAAAAA,AAAAA,AAAAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAA,AAAAAAAAA,"AAAAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAAA,AAAA,AAAAA,AAAAA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAA,AAAAAAA",AAAA,AAAA,AAA,A,AAAAA,AAAAA,AAAAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAA,"AAAAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAA,"AAAAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAAAAAAAAAAAA,"AAAAAAAAAA,AAA",AAAA,AAAA,AAAAA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAAAAAAAAAAAA,"AAAAAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAAAAAAAAAAAA""",AAAAAAAAAAAAA,"AAAAAAAAAAAAA,AAA",AAAA,AAAA,A,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAA,AAAAAAAAAAAAAA,"AAAAAAA,AAA",AAAA,AAAA,AAAAA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAA,AAA",AAAA,AAAA,AAAAA,AAAAA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAAAAAAAAAAAAAAAA""",AAAAAAAAAA,"AAAAAAAA,AAA,AAAAAAA",AAAA,AAAA,AA,AA,AAAAA,AAAAAAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAA,"AAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAAAAAAA,"AAAAAAAA,AAAAAAAAAA",AAA,AAAA,AA,AA,AAAAA,AAAAAAAAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAA,AAAAAAAAAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAAAAAAAAAAAA""",AAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAAAAAAAA,"AAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAA,"AAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAA,"AAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAA,AAAA,AAAAA,AAAAA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAA,AAAAAAAAAAAAA,"AAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAA""",AAAAAAAAAAAAAA,"AAAAAAAAAAA,AAAAAAA",AAA,AAAA,AAA,AAA,AAAAA,AAAAA,AAAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAA,AAAAAAAAAAA,"AAAAAA,AAAAAAAA",AAAA,AAAA,AA,AA,AAAAA,AAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAAAA,"AAAAAAAAAA,AAA",AAAA,AAAA,AA,AAAAA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAAAAAAAAAA,"AAAAAA,AAAAAAAA",AAA,AAAA,AA,AA,AAAAA,AAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAA,AAAAAAAAAAAAAAAA,"AAAAAAAA,AAAAAAAA",AAA,AAAA,AA,AA,AAAAA,AAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAA,AAAAAAAAAA,"AAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAAAAAAA,"AAAAAAAA,AAA,AAAAAAA",AAAA,AAAA,AA,AA,AAAAA,AAAAAAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAA""",AAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAA,AAAAAAA",AAA,AAAA,AAA,AAA,AAAAA,AAAAA,AAAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAA,AAAAAAAAA,"AAAAAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAAA,AAAA,AAAAA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAAAAAAA""",AAAAAAAAAAAA,"AAAAAAA,AAA",AAA,AAAA,AAAAA,AAAAA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAA,AAAAAAAAAAA,"AAAAAAAAAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAA,AAA,AAAAAAA",AAAA,AAAA,AA,AA,AAAAA,AAAAAAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAA,AAAAAAAAAAAA,"AAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAA,AAAAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAAAAAA,"AAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAA,"AAAAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAA,"AAAAAA,AAA",AAA,AAAA,A,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAAAAAAAAAAAA,"AAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAA,AAAAAAAAAAA,"AAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAAAAA""",AAAAAAAAAAAAAAA,"AAAAAAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAAAAAAAA""",AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAA,AAAAAAAAAA,"AAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAA,"AAAAA,AAA,AAAAAAA",AAA,AAAA,AA,AA,AAAA,AAAAAAAA,AAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAA,AAAAAA,"AAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAAAAAAAA,"AAAAAAA,AAA",AAA,AAAA,AAAAA,AAAAA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,"AAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAA,AAAAAAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAA,"AAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAAAAAAAAAAA,"AAAAAAAAAAA,AAA",AAA,AAAA,AAAAA,AAAAA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAA,AAAAAAAAAAAA,"AAAAAAAAAAA,AAAAAAAA",AAA,AAAA,AA,AA,AAAA,AAAA,AAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAA,AAAAAAA,"AAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAA,AAAAAAAAAAAA,"AAAAAAAA,AAA,AAAAAAA",AAA,AAAA,AA,AAA,AAAA,AAAAAAAA,AAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAA,AAAAAAAAA,"AAAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAA,"AAAAAAAA,AAA",AAA,AAAA,A,A,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAA,AAAAAAAAA,"AAAAAAAAAA,AAA",AAA,AAAA,AAAA,AAAA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAA,"AAAAAAAAA,AAAAAAAA",AAA,AAAA,AA,AA,AAA,AAAA,AAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAA,AAAAAAAAAAA,"AAAAAAA,AAAAAAAA",AAA,AAAA,A,AA,AAA,AAAA,AAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAA,AAAAAAA,"AAAAAAA,AAAAAAAA",AAA,AAAA,AA,AA,AAA,AAAA,AAA -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAA""",AAAAAAAAAAAA,"AAAAAAA,AAA",AAAAA,AAAA,AA,AA,AAAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAA,AAAAAAAAAAAA,"AAAAA,AAA",AAAAA,AAAA,AAAAA,AAA,AAAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAA""",AAAAAAAAAAAAAAAAAAAA,"AAAAAA,AAA,AAAAAAA",AAAA,AAAA,AA,AA,AAAAAA,AAAAAAAA,AAAAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAA,"AAAAAAAAA,AAAAAAAAAA",AAAA,AAAA,AA,A,AAAAAA,AAAAAAAAAA,AAAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAAAAAAAA,"AAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAAAA,AAAA,AAAAA,AA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAAA,AAAA,AA,AAA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAAAAAAAAAAAAAAAA,"AAAAAA,AAAAAAAA",AAAA,AAAA,AA,AA,AAAAAA,AAAA,AAAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAA,AAA",AAAA,AAAA,AA,AAA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAAAAAAAAAAAAAAA,"AAAAAA,AAA",AAAA,AAAA,AA,AAA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAA,AAAAAAAAAAAAAA,"AAAAAAAAAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAAAAAAAAAAAA""",AAAAAAAAAAAAAAAA,"AAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAAAAAAA,AAA",AAAA,AAAA,AA,AAAAA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAA,AAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,"AAAAAAA,AAA",AAAA,AAAA,AAAAA,AAAAA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAAAAAAAAAA""",AAAAAAAAAAAAAAA,"AAAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAAAAAAAAAAA,"AAAAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAA,AAAAAAA",AAAA,AAAA,AAA,AAA,AAAAA,AAAAA,AAAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAAA,"AAAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAAAAAAAAAA""",AAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAAAAAAAA,"AAAAAAAAAAAAAAA,AAA",AAAA,AAAA,AAAAA,AAAAA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAA,AAAAAAAAAA,"AAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAA,AAAAAAAAAAAA,"AAAAAAAAAAA,AAA",AAAA,AAAA,AAAAA,AAAAA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAA,"AAAAAAAA,AAA,AAAAAAA",AAA,AAAA,AA,A,AAAAA,AAAAAAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAA,AAAAAAAAAA,"AAAAAAAA,AAA,AAAAAAA",AAAA,AAAA,AA,AA,AAAAA,AAAAAAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAAAAAAAAA,"AAAAAAAA,AAAAAAAAAA",AAA,AAAA,AA,AA,AAAAA,AAAAAAAAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAAAAAAAAAAA,"AAAAAAA,AAA,AAAAAAA",AAAA,AAAA,AA,A,AAAAA,AAAAAAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAA,"AAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAA,AAA",AAAA,AAAA,AAAAA,AAAAA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAA,AAA,AAAAAAA",AAA,AAAA,AA,AA,AAAAA,AAAAAAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAAAAAAAAA,"AAAAAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAAAAAAAAAA,"AAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAA,"AAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAA,AAAAAAAAAAAAAAA,"AAAAAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAA,AAA",AAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAA,"AAAAAA,AAA",AAA,AAAA,AAAAA,AAAAA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAAA,"AAAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAA,"AAAAAA,AAA",AAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAA,"AAAAAAAAA,AAA,AAAAAAA",AAA,AAAA,AA,AA,AAAAA,AAAAAAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAA,AAAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAA,"AAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAAAAAAAAAAAA""",AAAAAAAAAAAA,"AAAAAAAAAAA,AAAAAAA",AAAA,AAAA,AAA,AAA,AAAA,AAAAA,AAAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAA,"AAAAAAAA,AAA",AAA,AAAA,AAAAA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAAAAAAAAA,"AAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAA,AAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAA,"AAAAAAAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAA,"AAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAA,AAAAA,"AAAAAAA,AAAAAAAA",AAA,AAAA,AA,AA,AAAA,AAAA,AAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAA,AAAAAAAAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,"AAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAA,AAAAAAAAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAA,AAAA,A,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAA,"AAAAAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAAAAAAAAAAA,"AAAAAAAAAAA,AAA",AAA,AAAA,AAAAA,AAAAA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAA,"AAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAAA,AAA",AAA,AAAA,AAAA,AAAAA,AAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAA,"AAAAAAAAAA,AAA",AAA,AAAA,A,AA,AAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAA,AAAAAAAAA,"AAAA,AAAAAAAA",AAA,AAAA,AA,AA,AAA,AAAA,AAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAAAAAA,"AAAAAAAAAA,AAA",AAA,AAAA,AAAA,AAAA,AAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAAAAAAAAAA,"AAAAAAAA,AAAAAAAAAA",AAAAA,AAAA,AA,AAA,AAAAAAA,AAAAAAAAAA,AAAAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAA,AAAAAA,"AAAAAAAAAA,AAAAAAA",AAAA,AAAA,AA,AAA,AAAAAAA,AAAA,AAAAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAA,"AAAAAAAA,AAAAAAAA",AAAA,AAAA,AA,AA,AAAAAAA,AAAA,AAAAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAA,AAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAAAA,AAAA,AAAAA,AAA,AAAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAAAAA""",AAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAAAAAA,AAA",AAAA,AAAA,AAAAA,AAAAA,AAAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAAAAAAAAAAAA""",AAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAAAAAAAAA,"AAAAAAA,AAAAAAAA",AAAAA,AAAA,AA,AA,AAAAAA,AAAA,AAAAAA -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAAAAAAAAAAAAAAAA""",AAAAAAAAAAAAA,"AAAAAAA,AAA",AAAAA,AAAA,AA,AA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAA,"AAAAAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAA,AAAA,AAAAAA,AAA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAA,"AAAAAAAAAAAAAAA,AAA",AAAA,AAAA,AAAAA,AAAAAA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAA,AAA",AAAA,AAAA,AA,AAA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAA,AAA",AAAA,AAAA,AAAAA,AAAAA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAA,"AAAAAAA,AAAAAAAA",AAAA,AAAA,AA,AA,AAAAA,AAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAA,AAA",AAAA,AAAA,AAAAA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAAAAAAAAA""",AAAAAAAAAAAAAA,"AAAAAAAAAAA,AAA",AAA,AAAA,AAAAA,AAAAA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAAAAAAAAA,"AAAAAAAA,AAA,AAAAAAA",AAAA,AAAA,AA,AA,AAAAA,AAAAAAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAA,AAAAAAAAAAAA,"AAAAAAAAAAA,AAA",AAAA,AAAA,AAAAA,AAAAA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAA""",AAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAAAAA""",AAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAAA,AAAA,AA,AAAAA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAA,AAAAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAA,AAAAAAAAAAAA,"AAAAAAAA,AAAAAAAAAA",AAA,AAAA,AA,A,AAAAA,AAAAAAAAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAAAAAAAA,"AAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAAAAAAAAAA,"AAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAAAAAAAAA,"AAAAAAAA,AAAAAAAA",AAA,AAAA,AA,AA,AAAAA,AAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAA,AAAAAAAAA,"AAAAAAA,AAA",AAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAA""",AAAAAAAAAAAAAA,"AAAAAAAAAAA,AAAAAAA",AAA,AAAA,AAA,AAA,AAAAA,AAAAA,AAAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAA,AAAAAAAAAAAAAAA,"AAAAAAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAA,"AAAAAAA,AAA",AAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAA,AAAAAAA,"AAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAA,AAAAAAAA,"AAAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAA,AAAAAAAAAAA,"AAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA""",AAAAAAAAAAAAAAA,"AAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAA,"AAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAA,"AAAAAAAA,AAA",AAA,AAAA,AAAAA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAA,AAAAAAAAAAAA,"AAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAA,"AAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAA,"AAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAA,"AAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAA,AAA,"AAAAAAAA,AAAAAAAA",AAA,AAAA,AA,AA,AAAA,AAAA,AAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAA,"AAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAAAAA,"AAAAAAA,AAA",AAA,AAAA,AA,AA,AAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAA,"AAAAAAAAAA,AAA",AAA,AAAA,A,AA,AAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAA,AAAAAAAAAAAAAAAA,"AAAAAAAAAA,AAA",AAA,AAAA,AA,AA,AA,, -AAAAAAAAAA,AAAAAAAAAA,"AAAAAAAAAAAAAAAAAAA""AAAAAAA""",AAAAAAAAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAAA,AAAA,AA,AAA,AAAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,"AAAAAAAAAAAAAAAAAAA""AAAAAA""",AAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAAA,AAAA,AA,AAA,AAAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAA,AAAAAAAAAAAA,"AAAAAAAA,AAAAAAAAAAAA",AAAA,AAAA,AA,AAA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAA,"AAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAA",AAAAA,AAAA,AA,AA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAA,AAAAAAAAAAAAA,"AAAAAAAAAAAAAAA,AAA",AAAA,AAAA,AA,AAA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAA,AAAAAAAAAAAAAAA,"AAAAAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAAAAAA,"AAAAAAAAAAA,AAA",AAAA,AAAA,AAAAA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAA,AAAAAAAAAAAAAAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAAAAAA,"AAAAAAAAA,AAAAAAAA",AAAA,AAAA,AA,AA,AAAAA,AAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAAAAAAAAAAA,"AAAAAAAA,AAA,AAAAAAA",AAAA,AAAA,AA,AA,AAAAA,AAAAAAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAAAAAA""",AAAAAAAAAAAAAAAA,"AAAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAA,"AAAAAAAAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAA,AAAAAAAAAAAA,"AAAAAAAA,AAAAAAAAAA",AAA,AAAA,AA,AA,AAAAA,AAAAAAAAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAA,AAAAAAAAAA,"AAAAAAAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAA,AAAAAAAAA,"AAAAAAA,AAAAAAAA",AAA,AAAA,AA,AA,AAAAA,AAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAA,AAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAA,AAAAAAAAAAAAAAA,"AAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAA,AAAAAAAAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAA,AAAAAAAAAAA,"AAAAAAAAA,AAAAAAAA",AAA,AAAA,AA,AA,AAAA,AAAA,AAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAA,AAAAAAAAAAAAAAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAA,"AAAAAAAA,AAA",AAA,AAAA,AA,AA,AAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAA,"AAAAAAA,AAA,AAAAAAA",AAAAA,AAAA,AA,AA,AAAAAA,AAAAAAAA,AAAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAA,AAA",AAAA,AAAA,AA,AAA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAA,"AAAAAA,AAA",AAAA,AAAA,AA,AAA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAA,AAAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAAA,AAAA,AAAAA,AA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAA,"AAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,"AAAAAAAAAAAAA""AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA""",AAAAAAAAAAAAAAAA,"AAAAAAAA,AAA",AAAA,AAAA,AAAAA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAA,AAAAAAAAAAAAAAA,"AAAAAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAAA,AAAA,AAAAA,AAAAA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAAAAAAAAAA""",AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAAAAAAAAAAAA,"AAAAAA,AAA",AAAA,AAAA,AA,AAA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAA,AAA",AAAA,AAAA,AA,AAA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA""",AAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAA,AAAAAAA",AAAA,AAAA,AAA,AAA,AAAAA,AAAAA,AAAAAA -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAAAAAAAAAAAA""",AAAAAAAAAAAAAAA,"AAAAAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAA,"AAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAAAAAAA,"AAAAAAAAAAAAAA,AAAAAAAA",AAA,AAAA,AA,AA,AAAAA,AAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAAA,"AAAAAAAAA,AAAAAAAA",AAA,AAAA,AA,AA,AAAAA,AAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAA,AAAAAAAAAAAAAAAA,"AAAAAAAAAAA,AAA",AAAA,AAAA,AA,AAAAA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAA,AAAAAAAAAAAAAAA,"AAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAAAAAAAAAAAAAA,"AAAAAA,AAA",AAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAA,AAAAAAAAAAAAAAAAA",AAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAAA,AAA",AAA,AAAA,AAAAA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAA,AAAAAAAAAAAAA,"AAAAAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAA,"AAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAAAAAAAAAAA,"AAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAA,AAA,AAAAAAA",AAA,AAAA,AA,A,AAAA,AAAAAAAA,AAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAA,"AAAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAA,"AAAAA,AAA,AAAAAAA",AAA,AAAA,AA,AA,AAAA,AAAAAAAA,AAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAA,"AAAAAAAAAA,AAAAAAAAAAAAAAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAA,"AAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAAAAAAAAAAAA,"AAAAAAAAAAA,AAA",AAA,AAAA,AAAAA,AAAAA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAA,AAA",AA,AAAA,AAAAA,AA,AAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAA,"AAAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAA,AAAA,AA,AA,AAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAAAAAAAAAAA,"AAAAAAAA,AAAAAAAAAAAA",AAAAA,AAAA,AA,AAA,AAAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAA,AAAAAAAAAAAAA,"AAAAAAAAAAA,AAA",AAAAA,AAAA,AAAAA,AAAAA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAAAAAAAAAAAAAAA""",AAAAAAAAAAAAA,"AAAAAAA,AAAAAAAA",AAAA,AAAA,AA,AA,AAAAAA,AAAA,AAAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAA,AAAAAAAA",AAAA,AAAA,AA,AA,AAAAAA,AAAA,AAAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAA,"AAAAAAAA,AAA,AAAAAAA",AAAA,AAAA,AA,AA,AAAAAA,AAAAAAAA,AAAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAA,"AAAAAAA,AAAAAAAAAAAAAAA",AAAA,AAAA,AA,AA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAA,"AAAAAAAAA,AAAAAAA",AAAA,AAAA,AAA,AAAA,AAAAAA,AAAAA,AAAAAAA -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAA""",AAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAAA,AAA",AAAAA,AAAA,AA,AA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAA,AAA",AAAA,AAAA,AAAAA,AAAAAA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAAAAAAA,"AAAAAA,AAAAAAAA",AAAA,AAAA,AA,AA,AAAAAA,AAAA,AAAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAA,AAA",AAAA,AAAA,AAAAA,AAAAA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAA,AAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAA,AAA",AAAA,AAAA,AA,AAAAA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAAAAAAAAAAAA,"AAAAAAAAAAAAA,AAA",AAAA,AAAA,AAAAA,AAA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAAA,AAAA,AA,AAA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAAA,AAA",AAAA,AAAA,AAAAA,AAAAA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAAAAA,"AAAAAAAA,AAAAAAAAAA",AAAA,AAAA,AA,AAA,AAAAA,AAAAAAAAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAAAAAAAAA,"AAAAAAAA,AAA,AAAAAAA",AAAA,AAAA,AA,AA,AAAAA,AAAAAAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA""",AAAAAAAAAAAAAAAAA,"AAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAAA,AAAA,AAAAA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAAA,AAAA,AA,AAAAA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAAAAAAAAAAAA""",AAAAAAAAAAAAAAA,"AAAAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAA,AAAAAAAAAAAAAAA,"AAAAAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAAAA,AAA",AAAA,AAAA,AAAAA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAAA""",AAAAAAAAAAA,"AAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAA,AAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAAA,AAAA,AAAAA,AAAAA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAA,"AAAAAAAA,AAA,AAAAAAA",AAAA,AAAA,AA,AA,AAAAA,AAAAAAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,"AAAAAAAA,AAAAAAAAAA",AAA,AAAA,AA,A,AAAAA,AAAAAAAAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAA,"AAAAAA,AAA",AAAA,AAAA,AA,AAA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAA,AAAAAAA",AAAA,AAAA,AAA,AAA,AAAAA,AAAAA,AAAAAA -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA""",AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAA,"AAAAAAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAA,AAAAAAAAAAAAAAAA,"AAAAAAA,AAAAAAA",AAAA,AAAA,AAA,AAA,AAAAA,AAAAA,AAAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAA,"AAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAA,"AAAAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAAAAAAAAAAA,"AAAAAAAAAAA,AAA",AAAA,AAAA,AAAAA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA""",AAAAAAAAAAAAAA,"AAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAAA,AAAA,AAAAA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAAAAAA,"AAAAAAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAA,AAAAAAAAAAA,"AAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAA,AAAAAAAAAAAAAA,"AAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAA,AAAAAAAAA,"AAAAAAA,AAA",AAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAA,AAAAAAAA,"AAAAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAA,AAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAA,AAA,AAAAAAA",AAAA,AAAA,AA,AA,AAAAA,AAAAAAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAAAAAAAAAA,"AAAAAAAAA,AAAAAAAA",AAA,AAAA,AA,A,AAAAA,AAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAAAAAAAA,"AAAAAA,AAAAAAAA",AAAA,AAAA,AA,AA,AAAAA,AAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAA,AAAAAAAAAAAAAAAA,"AAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAA,"AAAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAAAAAAAAAA,"AAAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAA,AAAAAAAA,"AAAAAAAAA,AAAAAAAA",AAA,AAAA,AA,AA,AAAAA,AAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAA,"AAAAAA,AAA",AAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAA,AAAA,AAAAA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAAAAAAAAAAAA,"AAAAAAAA,AAA,AAAAAAA",AAA,AAAA,AA,AA,AAAAA,AAAAAAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAA,"AAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAA,"AAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAA,AAAAAAAAAAAAA,"AAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAA,AAAAAAAAAAAA,"AAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAA,"AAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAA,"AAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAA,AAAAAA,"AAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAA,"AAAAAAAAAA,AAA",AAA,AAAA,AAAAA,AAAAA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAA,"AAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAA,AAAAAAAAAAAAAAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAA,"AAAAAAAAAAA,AAA",AAA,AAAA,AAAAA,AAAAA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAA,AAA,AAAAAAA",AAA,AAAA,AA,A,AAAA,AAAAAAAA,AAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAA,AAAA,"AAAAAAAAA,AAAAAAAA",AAA,AAAA,AA,AA,AAAA,AAAA,AAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAA,AAA,AAAAAAA",AAA,AAAA,AA,AA,AAAA,AAAAAAAA,AAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAAAAA,"AAAAAAA,AAAAAAAA",AAA,AAAA,AA,AA,AAAA,AAAA,AAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAAA,AAA",AAA,AAAA,AA,AAAAA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAA,AAAAAAAAAAAAAA,"AAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAA,AAAA,AA,AA,AAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAA,AAAAAAAAAAAA",AAA,AAAA,AA,A,AAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAA,AAAAAAAAA,"AAAAAAAAAA,AAA",AAA,AAAA,A,A,AAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAAAAAAAAAA,"AAAAA,AAAAAAAAAA",AAAAA,AAAA,AA,AAA,AAAAAAA,AAAAAAAAAA,AAAAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAA,AAAAAAAAAAAAAA,"AAAAAAAA,AAA",AAAAA,AAAA,AAAAA,AAAAAA,AAAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAA,"AAAAAA,AAA,AAAAAAA",AAAAA,AAAA,AA,AA,AAAAAA,AAAAAAAA,AAAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAA,AAAAAAAAAAAAAA,"AAAAAA,AAAAAAAAAAAAAAA",AAAA,AAAA,AA,AA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAAAAAAAAAAAA,"AAAAAAAAA,AAAAAAA",AAAAA,AAAA,AAA,AAAA,AAAAAA,AAAAA,AAAAAAA -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAA""",AAAAAAAAAAAAA,"AAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAA,"AAAAAAAA,AAA,AAAAAAA",AAAA,AAAA,AA,AA,AAAAAA,AAAAAAAA,AAAAAA -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAAAAAAAAAAAAAAA""",AAAAAAAAAAAAAAAA,"AAAAAAA,AAAAAAAA",AAAA,AAAA,AA,AA,AAAAAA,AAAA,AAAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAAAAA,AAA",AAAA,AAAA,AA,AAA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAAAAAAAAA,"AAAAAAA,AAAAAAAA",AAAA,AAAA,AA,AA,AAAAAA,AAAA,AAAAAA -AAAAAAAAAA,AAAAAAAAAA,"AAAAAAAAAAAAAAAA""AAAAAAAAAAA""",AAAAAAAAAAAAAAAAA,"AAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAA""",AAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAA,AAAAAAAAAAAAAAA,"AAAAAAAAAAA,AAA",AAAA,AAAA,AAAAA,AAAAA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAAA,AAA",AAAA,AAAA,AAAAA,AAAAA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA""",AAAAAAAAAAAAAAAAAAA,"AAAAA,AAA",AAAA,AAAA,AA,AAA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAAA,AAAA,AA,AAA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,"AAAAAAAAAAAAA""AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA""",AAAAAAAAAAA,"AAAAAAA,AAA",AAAA,AAAA,AAAAA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAA,AAAAAAAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAA,AAAAAAAAAAAAAAAA,"AAAAAAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAA,AAAAAAAAAAAAAAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,"AAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAAAAAAAAAA,"AAAAAAA,AAAAAAAAAA",AAAA,AAAA,AA,AAA,AAAAA,AAAAAAAAAA,AAAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAAAA,"AAAAAAAAA,AAA,AAAAAAA",AAAA,AAAA,AA,AAA,AAAAA,AAAAAAAA,AAAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAA,"AAAAAA,AAAAAAAA",AAAA,AAAA,AA,AA,AAAAA,AAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAA,AAAAAAAA,"AAAAAAAAAA,AAA",AAAA,AAAA,AAAAA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAA,"AAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAAAAAAAAAAAA""",AAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAA,AAAAAAAAAAAAAAAAAA,"AAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAAAAA""",AAAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAA,"AAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAAAAAAAAA""",AAAAAAAAAAAAAAAAAAA,"AAAAAAAA,AAA",AAAA,AAAA,AAAAA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAA,"AAAAAA,AAAAAAAAAAAAAAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAAAAAAAAA""",AAAAAAAAAAAAAAAA,"AAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAA,AAAAAAAAAA,"AAAAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAA,AAAAAAAAAAAA,"AAAAAAAAAAA,AAA",AAAA,AAAA,AAAAA,AAAAA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAA,AAAAAAAAAAAA,"AAAAAAAA,AAA",AAAA,AAAA,AAAAA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAA,AAA",AAAA,AAAA,AAAAA,AAAAA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA""",AAAAAAAAAAAAAAAAA,"AAAAAAAAAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAA,AAAAAAAAAAAA,"AAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAAAAAAAAAAAAAA,"AAAAAA,AAAAAAAA",AAAA,AAAA,AA,AA,AAAAA,AAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA""AAAAAAAA",AAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAA,AAAAAAAA,"AAAAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAA,AAAAAAAAAAAAAA,"AAAAAA,AAA",AAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAAA,AAAA,AAAAA,AAAAA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAA,"AAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAA,"AAAAAA,AAA",AAAA,AAAA,AAAAA,AAAAA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAA,AAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAAAA,AAA",AAAA,AAAA,AAAAA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAA,AAAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAA,"AAAAAA,AAA",AAA,AAAA,AAAAA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAA,AAAAAA,"AAAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAAAAAAAAAAAAA,"AAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAA,"AAAAA,AAA",AAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAA,AAAAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAAAAAAA""",AAAAAAAAAAAAAAAAA,"AAAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAA""",AAAAAAAAAAAAAA,"AAAAAAAAAAA,AAAAAAA",AAA,AAAA,AAA,AAA,AAAAA,AAAAA,AAAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAA,AAAAAAAAAAAAAAA,"AAAAAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAA,AAAAAAAAAAA,"AAAAAAAAA,AAAAAAAA",AAAA,AAAA,AA,AA,AAAA,AAAA,AAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,"AAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAA,AAAAAA,"AAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAAAAAAAA,"AAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAAAAAAAAAAAAA,"AAAAAAA,AAAAAAA",AAAA,AAAA,AAA,AAA,AAAA,AAAAA,AAAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAA,"AAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAA,"AAAAAAAAAA,AAA",AAA,AAAA,A,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAA,AAAAAAAAAAAA",AAA,AAAA,AA,A,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAAAAAAAAAAAAA""",AAAAAAAA,"AAAAAAAAAAA,AAAAAAA",AAA,AAAA,AAA,AAA,AAAA,AAAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAA,AAAA,AAAAA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAA,AAAAAAA,"AAAAAAA,AAA,AAAAAAA",AAA,AAAA,AA,AA,AAAA,AAAAAAAA,AAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAA,AAAAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAA,AAAA,A,A,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAA,AAA",AAA,AAAA,A,A,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAAAAAAAAAAAAA""",AAAAAAAAAAAAAAA,"AAAAAAAAAAA,AAA",AAA,AAAA,AAAAA,AAAAA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAA,AAAAAAAAAAAAAA,"AAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAA,AAAAAAAAA,"AAAAAAAAAA,AAA",AAA,AAAA,AAAA,AAAA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAA,AAAAAAAAAAAA,"AAAAAAAA,AAA,AAAAAAA",AAA,AAAA,AA,AA,AAA,AAAAAAAA,AAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,"AAAAAAA,AAA",AAAAA,AAAA,AAAAA,AAAAA,AAAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,"AAAAAAA,AAAAAAAAAAAAAAA",AAAAA,AAAA,AA,AA,AAAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAA,"AAAAAA,AAA,AAAAAAA",AAAAA,AAAA,AA,AA,AAAAAA,AAAAAAAA,AAAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAA,"AAAAAA,AAA",AAAA,AAAA,AAAAA,AAAAA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAAA,AAAA,AA,AAA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAA""",AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAAAAAA""AAAAAAAAAAAAAAAAAAAAAAAA",AAAAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAAA,AAAA,AAAAA,AAAAA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAA,AAA",AAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAA,AAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAAA,AAAA,AAAAA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAA,AAAAAAAAAAAAA,"AAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAA,AAA",AAAA,AAAA,AAAAA,AAAAA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAA,AAA",AAAA,AAAA,AA,AAAAA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAA,"AAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAAAAAAAAAAAAAAAA""",AAAAAAAAAA,"AAAAAAAA,AAA,AAAAAAA",AAAA,AAAA,AA,AA,AAAAA,AAAAAAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAA,AAA,AAAAAAA",AAAA,AAAA,AA,AA,AAAAA,AAAAAAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAA,"AAAAAAAA,AAA,AAAAAAA",AAAA,AAAA,AA,AA,AAAAA,AAAAAAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAA""",AAAAAAAAAAAAAA,"AAAAAAAAAAA,AAAAAAA",AAA,AAAA,AAA,AAA,AAAAA,AAAAA,AAAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAAAAAAAAAA,"AAAAAAAAAAAA,AAA",AAAA,AAAA,AAAAA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,"AAAAAAAAAAAAAAAAA,AAAAAAAA",AAA,AAAA,AA,A,AAAAA,AAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAA,AAAAAAAAAAAAAAAA,"AAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAA""",AAAAAAAAAAAAAAAAAAA,"AAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAAAA,AAA",AAAA,AAAA,AAAAA,AAAAA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAA,"AAAAAA,AAA",AAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAA,"AAAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAA,AAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAA""",AAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAA,AAAAAAA",AAA,AAAA,AAA,AAA,AAAAA,AAAAA,AAAAAA -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAAAAAAA""",AAAAAAAAAAAA,"AAAAAAA,AAA",AAA,AAAA,AAAAA,AAAAA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAAA,"AAAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAA,AAAAAA,"AAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAA,AAAAAAAAAAAAAAAAAAA,"AAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAA,AAAAAA,"AAAAAAAA,AAAAAAAA",AAA,AAAA,AA,AA,AAAA,AAAA,AAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAA,"AAAAAAA,AAA",AAA,AAAA,AAAAA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAA,AAA,AAAAAAA",AAA,AAAA,AA,AA,AAAA,AAAAAAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAA,"AAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAA,"AAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAAAAAAAAAAAA,"AAAAAAAAAAA,AAA",AAA,AAAA,AAAAA,AAAAA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAA,"AAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAA,AAAAAA,"AAAAAAA,AAAAAAAAAAAAAAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAAAAAAAAAAA,"AAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAAAAAAAAA,"AAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAA,AAAAAAAAAAAA,"AAAAA,AAAAAAA",AAAA,AAAA,AA,AAA,AAAAAAA,AAAA,AAAAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAAAAAA,"AAAAAAAAAAAA,AAAAAAAAAAAA",AAAAA,AAAA,AA,AAA,AAAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAAAA,AAAA,AAAAA,AAAAAA,AAAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAA""",AAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAA,AAA",AAAAA,AAAA,AA,AA,AAAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAAAAAA,AAAAAAAAAA",AAAA,AAAA,AA,AAA,AAAAAA,AAAAAAAAAA,AAAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAAAAAAA,AAA",AAAA,AAAA,AA,AAA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAA,"AAAAA,AAA",AAAA,AAAA,AA,AA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAA,"AAAAAAAAAAA,AAA",AAAA,AAAA,AA,AAA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAA,AAAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAAAAAAAAAAAA""",AAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAA,AAA",AAAA,AAAA,AAAAA,AAAAA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAAAAAAAAAAA,"AAAAAAAA,AAAAAAAA",AAAA,AAAA,AA,AA,AAAAA,AAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAA,"AAAAAA,AAAAAAAA",AAAA,AAAA,AA,A,AAAAA,AAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAA,"AAAAAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAAAA""",AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAA,AAAAAAAAAAAAA,"AAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAA,"AAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAA,"AAAAAAA,AAAAAAAA",AAAA,AAAA,AA,AA,AAAAA,AAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAA,"AAAAAA,AAAAAAAAAAAAAAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAA""",AAAAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAA,"AAAAAAAA,AAA,AAAAAAA",AAA,AAAA,AA,AA,AAAAA,AAAAAAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,"AAAAAAA,AAAAAAAA",AAA,AAAA,AA,A,AAAAA,AAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,AAA,AAAAAAAAAA,"AAAAAA,AAAAAAAA",AAA,AAAA,AA,AA,AAAAA,AAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAA,AAAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAA,AAAA,AAAAA,AAAAA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAA,"AAAAAAAA,AAAAAAAAAAAAAAA",AAA,AAAA,AA,A,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAA,AAAA,AAAAA,AAAAA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAAAAAAAA""",AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAA,AAA",AA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAA,"AAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAA,AAAAAAAAAAAAAAAAAA,"AAAAAAAA,AAA",AAAA,AAAA,AAAAA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAAAAAAAA,"AAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAA,AAA",AAA,AAAA,AAAAA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAA,"AAAAAA,AAAAAAAAAAAAAAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAA,AAAAAAAAAAAA,"AAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAA,"AAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAAA,"AAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAAAA,"AAAAAAAA,AAA,AAAAAAA",AAA,AAAA,AA,AA,AAA,AAAAAAAA,AAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAAAAA,"AAAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAAAAAAAAAAAAA,"AAAAAAAAAAA,AAA",AAA,AAAA,AAAA,AAAA,AAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAAAAA,"AAAAAAAAAA,AAA",AAA,AAAA,AAAA,AAAA,AAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAAAAAAAA,"AAAAAAAAAA,AAAAAAAAAA",AAAAA,AAAA,AA,AAA,AAAAAAA,AAAAAAAAAA,AAAAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAAAAAAAAAAA,"AAAAAAAAAA,AAA",AAAAA,AAAA,AAAAA,AAAAAA,AAAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAAAAAAAAAAAAAAAA""",AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAA,AAA,AAAAAAA",AAAA,AAAA,AA,AA,AAAAAAA,AAAAAAAA,AAAAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAA,AAAAAAAAAAAAA,"AAAAAAA,AAA",AAAAA,AAAA,AAAAA,AAA,AAAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAAAAA""",AAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAA,AAA",AAAA,AAAA,AA,AAA,AAAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAA,AAAAAAAAAAAA,"AAAAAA,AAA",AAAAA,AAAA,AAAAA,AAAAAA,AAAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAA""",AAAAAAAAAAAAAAAAAA,"AAAAA,AAA",AAAA,AAAA,AAAAA,AAA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAA,AAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAAA,AAAA,AAAAA,AAAAAA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAA,"AAAAAAAAAAAAAAAA,AAA,AAAAAAA",AAAA,AAAA,AA,AAA,AAAAAA,AAAAAAAA,AAAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAAAAAAA,AAA",AAAA,AAAA,AA,AAA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAA,AAAA,AAAAAA,AAA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAA,"AAAAAAAA,AAA",AAAA,AAAA,AAAAA,AA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAA,AAA",AAAA,AAAA,AA,AAA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAA,AAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAAAAAA,AAA",AAAA,AAAA,AAAAA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,"AAAAAAAAAAAAA""AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA""",AAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAA,AAAAAAAAAAAAAAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAA,"AAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAAAAAAAAA""",AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAA,AAA",AAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAA,AAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAAAAAAAA,AAA",AAA,AAAA,AAAAA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAAAAAAAAAAAAAA,"AAAAAAA,AAAAAAAA",AAAA,AAAA,AA,AA,AAAAA,AAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAA,AAAAAAAAAAAA,"AAAAAAAAAAA,AAA",AAAA,AAAA,AAAAA,AAAAA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAA,"AAAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,"AAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAAAAAAAAAAAA""",AAAAAAAAAAAAA,"AAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAA,AAAAAAAAAAAA,"AAAAAAA,AAAAAAAA",AAA,AAAA,AA,A,AAAA,AAAA,AAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAA,AAAAAA,"AAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,"AAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAA,"AAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAA,AAAAAAAAAA,"AAAAAAAA,AAAAAAAAAAAAAAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAAAAAA,"AAAAAAAAAA,AAA",AAA,AAAA,AAAA,AAAAA,AAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAAA,AAAA,AA,AA,AAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAA,AAAAAAAAAA,"AAAAAAA,AAA",AAA,AAAA,A,AA,AAA,, -AAAAAAAAAA,AAAAAAAAAA,"AAAAAAAAAAAAAAAAAAA""AAAAAAA""",AAAAAAAAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAAA,AAAA,AA,AAA,AAAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,"AAAAAAAAAAAAAAAAAAA""AAAAAA""",AAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAAA,AAAA,AA,AAA,AAAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAAAAAAAAAAAA,"AAAAAAAA,AAA",AAAAA,AAAA,AAAAA,AAAAAA,AAAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAAAAAAAAAAAAAA,"AAAAAAAAAAAA,AAA",AAAA,AAAA,AA,AAA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAA,AAAAAAAAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAA,AAAAAAAAAAAAAA,"AAAAAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAA,"AAAAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAA,AAAAAAAAAAAA",AAA,AAAA,AA,A,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAA,AAAAAAAAAAAA,"AAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAA,AAA",AAA,AAAA,AAAAA,AAAAA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAAAAAAAAAAA,"AAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAAAAAAAA,"AAAAAA,AAA",AAA,AAAA,AA,AA,AAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAAAAAA,"AAAAAAA,AAA",AAA,AAAA,A,AA,AAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAAAAAAAAAAAA,"AAAAAAAAAAA,AAA",AAA,AAAA,AAAA,AAAA,AAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAA""",AAAAAA,"AAAAAA,AAAAAAAA",AAAAA,AAAA,AA,AA,AAAAAA,AAAA,AAAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAAAAAAA,"AAAAAAA,AAA",AAAAA,AAAA,AA,AAAAAA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAA""",AAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAA,AAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAA,AAAAAAA",AAAAA,AAAA,AAA,AAAA,AAAAAA,AAAAA,AAAAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAA,AAA",AAAA,AAAA,AAAAA,AAAAAA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,"AAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAA,"AAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAA,AAA",AAAA,AAAA,AAAAA,AAAAA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAA,"AAAAAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAA,"AAAAAA,AAA,AAAAAAA",AAAA,AAAA,AA,AA,AAAAAA,AAAAAAAA,AAAAAA -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAAAAAA""AAAAAAAAAAAAAAAAAAAAAAAA",AAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAA,"AAAAAAAAAAAAAAA,AAA",AAAA,AAAA,AAAAA,AAAAAA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAA,AAA",AAAA,AAAA,AA,AAA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAA""",AAAAAAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAA,AAA",AAAA,AAAA,AAAAA,AAAAA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAA,AAAAAAAAAAAAAAA,"AAAAAAAA,AAA",AAAA,AAAA,AAAAA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAA,"AAAAAA,AAA",AAAA,AAAA,AA,AAA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAA""",AAAAAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAAA,AAAA,AAAAA,AAAAA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA""",AAAAAAAAAAAAA,"AAAAAAAAAAAAAAA,AAA",AAAA,AAAA,AAAAA,AAAAA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAA,AAAAAAAAAAA,"AAAAAAAAAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAAAAAAAAAAA,"AAAAAA,AAAAAAAAAAAAAAA",AAAA,AAAA,AA,A,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA""",AAAAAAAAAAAAA,"AAAAAAA,AAA",AAAA,AAAA,AAAA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAA,"AAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAA,AAAAAAAA,"AAAAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAAAAAAAAAAAA""",AAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAAAAAAAA,"AAAAAAAAAAA,AAAAAAA",AAAA,AAAA,AAA,AAA,AAAAA,AAAAA,AAAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAAAAAAAAAA,"AAAAAAAA,AAA",AAA,AAAA,AAAAA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAA,"AAAAAAAA,AAAAAAAA",AAAA,AAAA,AA,AA,AAAAA,AAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAA,AAAAAAA",AAAA,AAAA,AAA,AAAA,AAAAA,AAAAA,AAAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAA,AAAAAAAAAAAA,"AAAAAAAAAAA,AAA",AAAA,AAAA,AAAAA,AAAAA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA""",AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAA,AAA",AAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAA,AAAA,AAAAA,AAAAA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAA,AAAAAAAAAAAAAAAAAAA,"AAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAAAAAAAAAA""",AAAAAAAA,"AAAAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAA,AAAAAAAAAAAAAAAAA,"AAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAA,AAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAAAAAAAAAA,"AAAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAA,"AAAAAA,AAA",AAAA,AAAA,AAAA,AAAAA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAA""AAAAAAAAAAAAAA",AAAAAAAAAAAAA,"AAAAA,AAA",AAAA,AAAA,AAAAA,AAAAA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAA,AAAAAAAAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAAAA,AAA",AAAA,AAAA,AAAAA,AAAAA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAA,AAAAAAAAAAAAAAAA,"AAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAA""",AAAAAAAAAAAAAAA,"AAAAAAAAAA,AAA",AAA,AAAA,AAAAA,AAAAA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAA,AAAAAAAAAA,"AAAAAAA,AAA",AAA,AAAA,A,A,AAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAA,AAAAAAAAAAA,"AAAAAAA,AAAAAAAA",AAA,AAAA,AA,AA,AAA,AAAA,AAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAAAAAAAAAA,"AAAAAAAAA,AAAAAAAAAA",AAAAA,AAAA,AA,AAA,AAAAAAA,AAAAAAAAAA,AAAAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAAAAAAAAAA,"AAAAAAAA,AAA",AAAAA,AAAA,AAAAA,AAAAAA,AAAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAA,AAAAAA,"AAAAAAAA,AAAAAAA",AAAA,AAAA,AA,AAA,AAAAAAA,AAAA,AAAAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAAAAAAAAAAAA,"AAAAAA,AAA",AAAAA,AAAA,AA,AAA,AAAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAA,AAAAAAAAAAAA,"AAAAAAA,AAA",AAAAA,AAAA,AAAAA,AAAAAA,AAAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAA,"AAAAAAA,AAA",AAAAA,AAAA,AA,AA,AAAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAAAAAAAA""",AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAA,AAA",AAAAA,AAAA,AA,AAA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAAAA,AAAA,AA,AA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAAAAAAAAAAA,"AAAAAA,AAAAAAAAAAAAAAA",AAAAA,AAAA,AA,A,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAA,AAAAAAAAAA,"AAAAAAAA,AAA,AAAAAAA",AAAA,AAAA,AA,AAA,AAAAAA,AAAAAAAA,AAAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAA,AAAAAAAAAA",AAAA,AAAA,AA,AAA,AAAAAA,AAAAAAAAAA,AAAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAA,AAA",AAAA,AAAA,AA,AAA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAAA,AAA",AAAA,AAAA,AAAAA,AAAAAA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAAAAAAAAAA,"AAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAA,AAA",AAAA,AAAA,AAAAA,AAA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAA,AAAAAAAAAA",AAAA,AAAA,AA,A,AAAAAA,AAAAAAAAAA,AAAAAA -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAAAAAAAAAAAAA""",AAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAA,"AAAAAAAAAAAA,AAA",AAAA,AAAA,AA,AAA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAA,AAA",AAAA,AAAA,AAAAA,AAAAAA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAA,"AAAAAAAAAA,AAA",AAAA,AAAA,AA,AAA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAA,"AAAAAAA,AAAAAAAA",AAAA,AAAA,AA,AA,AAAAAA,AAAA,AAAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAA,"AAAAAAAAAAAA,AAA",AAAA,AAAA,AAAAA,AA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAAAAAA,AAAAAAAAAA",AAAA,AAAA,AA,AAA,AAAAAA,AAAAAAAAAA,AAAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAAA,AAAA,AAAAA,AA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAAAAAAAAAAA,"AAAAAA,AAAAAAAAAAAAAAA",AAAA,AAAA,AA,AA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAAAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAAA,AAAA,AAAAA,AAA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAA,AAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAAA,AAAA,AA,AAAAA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAA,AAAAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAA,"AAAAA,AAA",AAAA,AAAA,AA,AAA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAA,AAAAAAAAAAA,"AAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAA,AAAAAAAAA,"AAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA""",AAAAAAAAAAAAAAAA,"AAAAAAAAAAAAAAA,AAA",AAAA,AAAA,AAAAA,AAAAAA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAAAAAAAAAAAAA,"AAAAAAAAAAAAAA,AAA",AAAA,AAAA,AAAAA,AAAAA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAA,"AAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAA,"AAAAAA,AAA,AAAAAAA",AAAA,AAAA,AA,A,AAAAA,AAAAAAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAAA,AAA",AAAA,AAAA,AAAAA,AAAAA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAA,"AAAAAAAA,AAAAAAAAAAAAAAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAA,AAAAAAAAAA,"AAAAAAAAAAA,AAA",AAAA,AAAA,AAAAA,AAAAA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAA,AAAAAAAAAAAAAAAA,"AAAAAAAA,AAA",AAAA,AAAA,AAAAA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAA,AAAAAAAAAAAA,"AAAAAAAAAAA,AAA",AAAA,AAAA,AAAAA,AAAAA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAA,AAAAAAAAAA",AAAA,AAAA,AA,AAA,AAAAA,AAAAAAAAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAAAAA""AAAAAAAAAAAAAAAAAAAAA",AAAAAAAAAA,"AAAAAAAAA,AAAAAAAA",AAA,AAAA,AA,AA,AAAAA,AAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,"AA,AAAAAAAAAAA",AAAAAAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAA,"AAAAAAAAAAA,AAAAAAA",AAA,AAAA,AAA,AAAA,AAAAA,AAAAA,AAAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAAAAAAAAA,"AAAAA,AAAAAAAA",AAA,AAAA,AA,AA,AAAAA,AAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAA,AAAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAA,AAAAAAAAAAAAAAAA,"AAAAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAA,AAAAAAAAA,"AAAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAA,AAAAAAAAAAAA,"AAAAAAAA,AAA,AAAAAAA",AAAA,AAAA,AA,AA,AAAAA,AAAAAAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAA,AAA",AAAA,AAAA,AAAA,AAAAA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAA,"AAAAAA,AAA",AAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAA,"AAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAA,AAAAAA,"AAAAAAA,AAA",AAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAA,"AAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAA,AAAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAAAAAAAA,"AAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAA,AAAAAAAAA,"AAAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAA,"AAAAAAAAAA,AAA",AAA,AAAA,AAAAA,AAAAA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAA,AAA",AAA,AAAA,AAAAA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAA,"AAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAA,"AAAAAAAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA""",AAAAAAAAAAAA,"AAAAAAAAAAA,AAAAAAA",AAAA,AAAA,AAA,AAA,AAAA,AAAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAA,AAAAAAAAAAAA",AAA,AAAA,AA,A,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAAAAAAAAAAAAAAA,AAA,AAAAAAA",AA,AAAA,AA,A,AAAA,AAAAAAAA,AAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAA,AAAAAAA,"AAAAAAA,AAAAAAAA",AAA,AAAA,AA,AA,AAAA,AAAA,AAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAA,"AAAAAAAAAAA,AAA",AAA,AAAA,AAAA,AAAA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAAAAAAAAAAAA""",AAAAAAAAAAAA,"AAAAAAAAAAA,AAAAAAA",AAA,AAAA,AA,AAA,AAA,AAAAA,AAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAA,AAAAAAAAAAAAAA,"AAAAAAAAAAA,AAA",AAAAA,AAAA,AAAAA,AAAAAA,AAAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAA,AAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAAAAAA,AAAAAAAAAA",AAAA,AAAA,AAA,AAA,AAAAAAA,AAAAAAAAAA,AAAAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAAAAAAAAAAA,"AAAAAA,AAAAAAAAAAAAAAA",AAAAA,AAAA,AA,AA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAA""",AAAAAAAAAAAAAA,"AAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAAA,AAAA,AA,AAA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAAAAAAAAAAAA""",AAAAAAAAAAAAAAA,"AAAAAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAA,AAA,AAAAAAA",AAAA,AAAA,AA,AA,AAAAAA,AAAAAAAA,AAAAAA -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAA""",AAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAAAA,AAAA,AA,AA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAA,AAAAAAAAAAA,"AAAAAAA,AAAAAAAA",AAAA,AAAA,AA,AA,AAAAAA,AAAA,AAAAAA -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAAAAAAAAAAAAA""",AAAAAAAAAAAAA,"AAAAAA,AAA",AAAA,AAAA,AAAAA,AAAAA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAA,AAAAAAAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAAA,AAAA,AA,AAA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAA""",AAAAAAAAAAAAAAAAAA,"AAAAA,AAA",AAAA,AAAA,AAAAA,AAAAA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAA,"AAAAAAAAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,"AAAAAAAAAAAAAAAAAA""AAAAAAAAAAAAAAAAAA""",AAAAAAAAAAAA,"AAAAAAAAAA,AAA",AAAA,AAAA,AA,AAA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAAA,AAA",AAAA,AAAA,AA,AAA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAAAAAAAA""",AAAAAAAAAAAAAAAAA,"AAAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAA,AAAAAAAAAAAAAAA,"AAAAAA,AAA",AAAA,AAAA,AA,AAA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAAA,AAAA,AAAAA,AAA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAA,AAAAAAAAAAAAAAAA,"AAAAAAAAAAAA,AAA",AAAA,AAAA,AAAAA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAA,AAAAAAAAAAAAAAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAA,AAAAAAAAAAAAAAAAAA,"AAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAAAAAAAAAAAAA,"AAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAA,AAAAAAAAAAAA,"AAAAAAAA,AAA,AAAAAAA",AAAA,AAAA,AA,AA,AAAAA,AAAAAAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAA,"AAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAA,AAA",AAAA,AAAA,AAAAA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAA,AAAAAAAAAAAAAAA,"AAAAAAAA,AAA",AAA,AAAA,AA,AAA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAA,AAA",AAAA,AAAA,AAAAA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAA,"AAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAAAAAAAAAAA,"AAAAAA,AAAAAAAA",AAAA,AAAA,AA,AA,AAAAA,AAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAAAAAAAAAAAAAAAA,"AAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAA,"AAAA,AAAAAAAAAAAAAAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAA,AAAA,AA,AAAAA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAA,AAAAAAAA,"AAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAA,AAAAAAAAAAAAAA,"AAAAAAA,AAAAAAAA",AAA,AAAA,AA,A,AAAAA,AAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAAA,AAAA,AAAAA,AAAAA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAA,"AAAAAAA,AAAAAAAA",AAA,AAAA,AA,AA,AAAAA,AAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAAAAAA,"AAAAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAA,"AAAAAAAAAAA,AAAAAAA",AAAA,AAAA,AAA,A,AAAAA,AAAAA,AAAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAA,"AAAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAA,AAAAAAAAAAAAAA,"AAAAAA,AAAAAAAAAAAAAAA",AAA,AAAA,AA,A,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAA,AAAA,AAAAA,AAAAA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAAAAAAAAA,"AAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA""",AAAAAA,"AAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAAAAAAAAAAAAA""",AAAAAAAAAAAAAAA,"AAAAAAAAAAA,AAA",AAA,AAAA,AAAAA,AAAAA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAA,AAAAAAAAAAAAAA,"AAAAAAAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAA,"AAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAAAAAAAAAAAAAAAA,"AAAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAA,AAAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAA,AAAAAAAAAAAA",AAA,AAAA,AA,A,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAA,"AAAAAAAAAA,AAA",AAA,AAAA,A,A,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAAAA,AAAA,AAAAA,AAAAAA,AAAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,"AAAAAAAAAAAAAAAAAAA""AAAAAAA""",AAAAAAAAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAAA,AAAA,AA,AAA,AAAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAAAA,AAAA,AAAAA,AAAAAA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAA,"AAAAAAAAAA,AAA",AAAAA,AAAA,AAAAA,AAAAA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAA,AAAAAAAAAAAAAA,"AAAAAAAAAAA,AAA",AAAA,AAAA,AAAAA,AAAAAA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAAAAAAAAAAAAA""",AAAAAAAAAAAAAA,"AAAAAAAA,AAA",AAAA,AAAA,AA,AAA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAA,AAAAAAAAAAAAA,"AAAAAAA,AAA",AAAAA,AAAA,AAAAA,AAAAA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAAAAAAAAA,"AAAAAAAAAAA,AAA",AAAA,AAAA,AAAAA,AAAAAA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAA,AAA",AAAA,AAAA,AA,AAA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAAAAAAAAA,"AAAAAAA,AAAAAAAAAAAAAAA",AAAA,AAAA,AA,AA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAA,AAA,AAAAAAA",AAAA,AAAA,AA,AA,AAAAAA,AAAAAAAA,AAAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAAA,AAAA,AA,AAA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAA,AAAAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAAA,AAAA,AA,AAA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAA,AAA",AAAA,AAAA,AA,AAA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAA,AAAAAAAAAAAAAAA,"AAAAAAAAAAAA,AAA",AAAA,AAAA,AAAAA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,"AAAAAAAAAAAA""AAAAAAAAAAAAAAAAAAAAA""",AAAAAAAAAAAAAAAA,"AAAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAAAA""",AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAA,"AAAAA,AAAAAAAAAA",AAAA,AAAA,AA,AAA,AAAAA,AAAAAAAAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAAAAAAAAA""",AAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAAAAAA,AAA",AAA,AAAA,AAAAA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAA,AAAAAAAAAAAAAA,"AAAAAAAAAAAA,AAA",AAAA,AAAA,A,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAA,AAAAAAAAAAAAAAAA,"AAAAAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAA,AAAA,"AAAAAAA,AAAAAAAAAAAAAAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAAAAA""AAAAAAAAAAAAAAAAAAAAA",AAA,"AAAAAA,AAAAAAAA",AAAA,AAAA,AA,AA,AAAAA,AAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAAAA,AAA",AAAA,AAAA,AAAAA,AAAAA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAA,AAAAAAAAAAAAAA,"AAAAA,AAA",AAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAA,"AAAAA,AAA",AAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAA,AAAAAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAAAAAAAAAAA,"AAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAA,AAAAAAAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAAAAAAAA,"AAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAA,AAAAAAAAAAAAAAA,"AAAAAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAA,AAAAAA,"AAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAAAA,"AAAAAAA,AAAAAAAA",AAA,AAAA,AA,AA,AAAA,AAAA,AAAA -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA""",AAAAAAAAAAAAAAAAA,"AAAAAAAA,AAA",AAA,AAAA,A,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAAAAAAAAAAAAA,"AAAAAAAA,AAA",AAAA,AAAA,AAAA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAA,AAAAAAAAA,"AAAAAAAAAA,AAA",AAA,AAAA,AAAA,AAAA,AAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAA,"AAAAAAAAAA,AAA",AAA,AAAA,A,AA,AAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAAAAAAAAAAA,"AAAAAAAA,AAAAAAAAAA",AAAAA,AAAA,AA,AAA,AAAAAAA,AAAAAAAAAA,AAAAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAA,AAAAAAAAAAAAAAAAAA,"AAAA,AAAAAAA",AAAA,AAAA,AA,AAA,AAAAAAA,AAAA,AAAAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAAAAAAAAAAAAA,"AAAAAAAAAA,AAA",AAAAA,AAAA,AAAAA,AAAAAA,AAAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAA,AAA",AAAA,AAAA,AAAAA,AAAAAA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAA,AAAAAAAAAAAAA,"AAAAAAAAAAAAAAA,AAA",AAAA,AAAA,AAAAA,AAAAAA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAA,AAA",AAAA,AAAA,AA,AAA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAA""",AAAAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAAA,AAAA,AAAAA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAA,"AAAAAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAA,AAA",AAAA,AAAA,AAAAA,AAAAA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAA""",AAAAAAAAAAAAAAAAAAAAAAA,"AAAAA,AAA",AAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAA,AAAAAAAAAAAAA,"AAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAA,"AAAAAAAA,AAA,AAAAAAA",AAAA,AAAA,AA,AA,AAAAA,AAAAAAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAAAAAAAAAA,"AAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAAA,AAAA,AAAAA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAAAAA""AAAAAAAAAAAAAAAAAAAAA",AAAAAAA,"AAAAA,AAAAAAAA",AAAA,AAAA,AA,AA,AAAAA,AAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAAAAAA""",AAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAA,AAA",AAAA,AAAA,A,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAA,"AAAAAA,AAA",AAAA,AAAA,AAAAA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAA,AAAAAAAAAAAA,"AAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAA,AAAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAA,AAAAAAAAA,"AAAAAAA,AAAAAAAA",AAA,AAAA,AA,AA,AAAAA,AAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAAAAAAAAAAA,"AAAAAA,AAAAAAAA",AAA,AAAA,AA,AA,AAAAA,AAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAA,"AAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAA,"AAAAAA,AAAAAAAA",AAA,AAAA,AA,AA,AAAAA,AAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAA,AAAAAAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAA,AAAA,AAAAA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAA,"AAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAA,AAAAAAA,"AAAAAAA,AAAAAAAA",AAA,AAAA,AA,AA,AAAA,AAAA,AAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAAAAAAAAAA,"AAAAAA,AAAAAAAA",AAA,AAAA,AA,A,AAAA,AAAA,AAAA -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAAAAAAAAAAAAA""",AAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAAA,AAA",AAA,AAAA,AAAAA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAA,AAAAAAAAAA,"AAAAAAA,AAA",AAA,AAAA,A,AA,AAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAA,AAAAAAAAAAAA,"AAAAAA,AAA",AAA,AAAA,AA,AA,AAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAA,"AAAAAAAAAA,AAA",AAA,AAAA,AAAA,AAAA,AAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAA,"AAAAAAAAAAA,AAA",AAA,AAAA,AAAA,AAAA,AA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAAAAAAAAAAAAAAAA""",AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAA,AAA,AAAAAAA",AAAA,AAAA,AA,AAA,AAAAAAA,AAAAAAAA,AAAAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAA,AAAAAAAAAAAAAA,"AAAAAA,AAAAAAAAAAAAAAA",AAAA,AAAA,AA,AA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAA""",AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAA,AAAAAAAAAA",AAAA,AAAA,AA,AAA,AAAAAA,AAAAAAAAAA,AAAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAA,AAAA,AAAAAA,AAA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAA,AAAAAAAAAAAA,"AAAAAAAAAA,AAA,AAAAAAA",AAAA,AAAA,AA,AAA,AAAAAA,AAAAAAAA,AAAAAA -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAAAAAAAAAAAA""",AAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAA,"AAAAAAAAAAA,AAA",AAAA,AAAA,AAAAA,AA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAA,"AAAAAAA,AAAAAAAA",AAAA,AAAA,AA,AA,AAAAAA,AAAA,AAAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAA,AAAAAAAAAA",AAA,AAAA,AA,A,AAAAAA,AAAAAAAAAA,AAAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAA,"AAAAAA,AAA,AAAAAAA",AAAA,AAAA,AA,A,AAAAA,AAAAAAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAAAAA,"AAAAAAAAA,AAAAAAAA",AAAA,AAAA,AA,AA,AAAAA,AAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAA,"AAAAAA,AAAAAAAAAAAAAAA",AAA,AAAA,AA,A,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAA,AAAAAAAAAAAAA,"AAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAA,AAAAAAA,"AAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAA,AAAA,AAAAA,AAAAA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAA,AAAAAAAAAAAAAAAA,"AAAAAA,AAA",AAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAA,"AAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAA,"AAAAAAAAAAA,AAA,AAAAAAA",AAA,AAAA,AA,AA,AAAA,AAAAAAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAA,AAAAAAAAAAAAAAA,"AAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAAA""",AAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAA,AAA",AAAA,AAAA,A,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAA,"AAAAAAAAAAA,AAA",AAA,AAAA,AAAA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAA,AAAAAAAAAAAA,"AAAAAA,AAA",AAA,AAAA,AA,AA,AAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAAAAAAAAAA,"AAAAAA,AAA",AAA,AAAA,AA,AA,AAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAA,AAAAAAA,"AAAAAAA,AAA",AAA,AAAA,AA,AA,AAA,, -AAAAAAAAAA,AAAAAAAAAA,"AAAAAAAAAAAAAAAAAAA""AAAAAA""",AAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAAA,AAAA,AA,AAA,AAAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAAA,AAAA,AAAAA,AAAAAA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAAAAAA,AAA",AAAA,AAAA,AA,AAA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAA,"AAAAAAAA,AAA",AAAA,AAAA,AAAAA,AAA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAA,AAAAAAAAAAAAAAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAA,"AAAAAAAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAAAAAAAA,"AAAAAAAAA,AAAAAAAA",AAAA,AAAA,AA,AA,AAAAA,AAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAA,AAAAAAAAAAAAA,"AAAAAAAA,AAA",AAA,AAAA,AA,AAA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAA,"AAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,"AAAAA,AAA",AAA,AAAA,AAAAA,AAAAA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAA,AAA,AAAAAAA",AAA,AAAA,AA,A,AAAA,AAAAAAAA,AAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAAAA,"AAAAAA,AAAAAAAA",AAA,AAAA,AA,AA,AAAA,AAAA,AAAA -AAAAAAAAAA,AAAAAAAAAA,A,AAAAAAAAAAAAAAAAAAA,"AAAAAAAA,AAA",AAA,AAAA,A,A,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAA,AAAAAAAAAAAA,"AAAAAA,AAA",AAA,AAAA,AA,AA,AAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAA,"AAAAAAAA,AAA",AAA,AAAA,AA,AA,AAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAA,AAAAAAAAAAAAAAAA,"AAAAAAAAAAA,AAA",AAA,AAAA,AAAA,AAAA,AAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAAAAAAAAAAAAA,"AAAAAA,AAA",AAAAA,AAAA,AAAAA,AAAAAA,AAAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAAAAAAAAAAA,"AAAAAA,AAA",AAAAA,AAAA,AA,AAA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAA,"AAAAAA,AAAAAAAAAAAAAAA",AAAA,AAAA,AA,AA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAAAAAAAAAAAAA""",AAAAAAAAAAA,"AAAAAAA,AAA",AAAA,AAAA,AA,AAA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAA,"AAAAAAAA,AAA,AAAAAAA",AAAA,AAAA,AA,AAA,AAAAA,AAAAAAAA,AAAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAAAAAAAAAAAA,"AAAAAAAAAAAA,AAA",AAAA,AAAA,AA,AAA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAA,"AAAAAAAAA,AAA,AAAAAAA",AAAA,AAAA,AA,AA,AAAAA,AAAAAAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA""",AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAA""",AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAA,AAA",AAAA,AAAA,AA,AAAAA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAAAAAA,"AAAAAAAAA,AAAAAAAA",AAA,AAAA,AA,AA,AAAAA,AAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAA,AAAAAAAAAAAAAA,"AAAAAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAAAAAAAAA""",AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAA,AAAA,AAAAA,AAAAA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAA,AAAAAAAAAAAAAAA",AAA,AAAA,AA,A,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAA,AAA,AAAAAAA",AAA,AAAA,AA,A,AAAA,AAAAAAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAA,AAAAAAAAAAAAAAAA,"AAAAAAAAAAA,AAA",AAA,AAAA,A,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAAA,AAA",AAA,AAAA,AAAAA,AAAAA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAA,AAAA,AAAAA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAA,AAAAAAAAAAAA,"AAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAAAAAAAA""",AAAAAAAAAAAAAAAA,"AAAAAAAAAAA,AAA",AAA,AAAA,AAAA,AAAA,AAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAA,AAAAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAA,AAAA,A,AA,AAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAA,AAAAAAA,"AAAAAAA,AAA",AAA,AAAA,A,A,AAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAAAAAAAAAAA,"AAAAAA,AAAAAAAAAA",AAAAA,AAAA,AA,AAA,AAAAAAA,AAAAAAAAAA,AAAAAAA -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAAAAAA""",AAAAAAAAAAAAA,"AAAAAAA,AAAAAAAA",AAAAA,AAAA,AA,AA,AAAAAAA,AAAA,AAAAAAA -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAAAAAAAAAAAAAA""",AAAAAAAAAAAAAAA,"AAAAAA,AAAAAAAAAAAAAAA",AAAAA,AAAA,AA,AA,AAAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAAAA,AAAA,AA,AA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAAAAAAAAA,"AAAAAAA,AAA",AAAAA,AAAA,AAAAA,AAA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA""",AAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAAAAAA,AAAAAAAAAA",AAAA,AAAA,AA,AAA,AAAAAA,AAAAAAAAAA,AAAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAAA,AAAA,AA,AAA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAA,AAAAAAAAAAA,"AAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAAAAAAAAAAAAA,"AAAAAAA,AAAAAAAA",AAAA,AAAA,AA,AA,AAAAAA,AAAA,AAAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAAA,AAAA,AAAAA,AAAAAA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAA,AAAAAAAA",AAAA,AAAA,AA,AA,AAAAAA,AAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAA,AAA",AAAA,AAAA,AA,AAA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAA,"AAAAAA,AAA,AAAAAAA",AAAA,AAAA,AA,AA,AAAAA,AAAAAAAA,AAAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAAA,AAAA,AA,AAAAA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAAAAAAAAAA,"AAAAAAAA,AAA",AAAA,AAAA,AAAAA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAA,AAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAA,AAAAAAAAAAAAAAA",AAAA,AAAA,AA,A,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAAA,AAAA,AAAAA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAA,"AAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAAAAA""AAAAAAAAAAAAAAAAAAAAA",AAAAAAAAAAAAAAAAAAAAAAAA,"AAAAA,AAAAAAAA",AAAA,AAAA,AA,AA,AAAAA,AAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAAA,AAAA,AAAAA,AAAAA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAAAAAAAAAAAAAAA,"AAAAAAA,AAAAAAAA",AAAA,AAAA,AA,AA,AAAAA,AAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAA,AAAAAAAAAAAA,"AAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAA,"AAAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAA,AAAA,AAAAA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAAAAAAAA,"AAAAAAAAAA,AAA",AAAA,AAAA,AA,AAA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAA,AAAAAAAA",AAA,AAAA,AA,AA,AAAAA,AAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAA,"AAAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAAAAAAAAAAAAA,"AAAAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAAAAAAAAAA""",AAAAAAAAAAAAAA,"AAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAA,AAAAAAAAAAAAAAA,"AAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAA,"AAAAAAAA,AAAAAAAAAAAAAAA",AAA,AAAA,AA,A,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAA,"AAAAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAAAAAAAAA,"AAAAAAAAAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA""",AAAAAAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAA,AAAAAAAAA,"AAAAAAAAAA,AAA",AAA,AAAA,AAAA,AAAAA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAAAAAAAA""",AAAAAAAAAAAA,"AAAAAAAAAAA,AAAAAAA",AAAA,AAAA,AAA,AAA,AAAA,AAAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAA,"AAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA""",AAAAAAAAA,"AAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAA,"AAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAA,AAAAAAA,"AAAAAAA,AAAAAAAA",AAA,AAAA,AA,AA,AAAA,AAAA,AAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAAAA,"AAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAAAA,AAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAA""",AAAAAAAAAAAAAAAAAAA,"AAAAAA,AAA",AAA,AAAA,A,AA,AAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAA,AAAAAAAAAAAAAAA,"AAAA,AAAAAA",AAAA,AAAA,AA,AAA,AAAAAAA,AAAA,AAAAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAA,AAA",AAAAA,AAAA,AA,AAA,AAAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAAAA,AAAA,AAAAA,AAAAAA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAA,AAAAA,"AAAAAAAAA,AAA",AAAAA,AAAA,AA,AA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAA,AAAAAAAAAAAA,"AAAAAAAAA,AAA,AAAAAAA",AAAA,AAAA,AA,AAA,AAAAAA,AAAAAAAA,AAAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAAAA,AAA",AAAA,AAAA,AAAAA,AAA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAAAAAAAAA,"AAAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAAAAAAA,"AAAAAAA,AAAAAAAA",AAAA,AAAA,AA,AA,AAAAAA,AAAA,AAAAAA -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAAAAAAAAAA""",AAAAAAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAAAAAAAAAAAAA,"AAAAAAA,AAAAAAAA",AAAA,AAAA,AA,AA,AAAAAA,AAAA,AAAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAA,"AAAAA,AAA",AAAA,AAAA,AA,AAA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAA,"AAAAAAAA,AAA,AAAAAAA",AAAA,AAAA,AA,AA,AAAAAA,AAAAAAAA,AAAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAA,AAAAAAAAAAAAAAAAAA,"AAAAAAA,AAAAAAAA",AAAA,AAAA,AA,AA,AAAAAA,AAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAA""AAAAAAAAAAAAAAA",AAAAAAAAAAAAAAAAA,"AAAAAAAA,AAA",AAAA,AAAA,AA,AAA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAAAAAAAAAA,"AAAAAAAAAAAA,AAA",AAAA,AAAA,AA,AAA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAAAAA""",AAAAAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAA,"AAAAAAAA,AAA,AAAAAAA",AAAA,AAAA,AA,AA,AAAAA,AAAAAAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAAA,AAAA,AAAAA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAA,"AAAAAAA,AAA",AAAA,AAAA,AAAAA,AAAAA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAA,AAAAAAAAAAAAAAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAA,"AAAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAAA,"AAAAAAAAAA,AAAAAAAA",AAAA,AAAA,AA,AA,AAAAA,AAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAA,"AAAAAA,AAA",AAAA,AAAA,AAAAA,AAAAA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAAA,AAAA,AAAAA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAAAAAAAAAA,"AAAAAA,AAAAAAAA",AAAA,AAAA,AA,AA,AAAAA,AAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAA,AAAAAAAAAAAAAAAA,"AAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAAAAAAAAAA,"AAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAA,AAAAAAAAAAAAAAAAAA,"AAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAA,AAAAAAAAAAAAAAA,"AAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAA,"AAAA,AAA",AAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAA,"AAAAAA,AAAAAAAAAAAAAAA",AAA,AAAA,AA,A,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAAAAA,"AAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAA,AAAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAAAAAAAAAAAAAA""",AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAA,AAAAAAAAAAAAAAAA,"AAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAA,"AAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAA,AAAAAAAAAAAAAA,"AAAAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAA,AAAAAA,"AAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAAA""",AAAAAAAAA,"AAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAAAAA""",AAAAAAAAAAA,"AAAAAA,AAA",AAA,AAAA,A,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAA,AAAAAAA,"AAAAAAA,AAA",AAA,AAAA,A,A,AAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAA,AAAAAAAAAAAAAAA,"AAAAAA,AAAAAAAAAAAAAAA",AAAAA,AAAA,AA,AAA,AAAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAA,"AAAAA,AAA",AAAAA,AAAA,AA,AA,AAAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAAAAA,AAA",AAAA,AAAA,AAAAA,AAAAAA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAAA,AAAA,AA,AAA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAAAAAAAAA,"AAAAAAAA,AAA",AAAA,AAAA,AA,AAA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAA,AAA",AAAA,AAAA,AAAAA,AAA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAAAAAAAAAAA""",AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAA,"AAAAAAAAAAA,AAA,AAAAAAA",AAAA,AAAA,AA,AA,AAAAA,AAAAAAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAA,AAA",AAAA,AAAA,AAAAA,AAAAA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAAAAAAAAA""",AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,"AAAAAA,AAA",AAAA,AAAA,AA,AAAAA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAA,AAAAAAA,"AAAAAAAAAAA,AAAAAAA",AAA,AAAA,AAA,AAA,AAAAA,AAAAA,AAAAAA -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAAAA""",AAAAAAAAAAAA,"AAAAAAAAAA,AAA",AAAA,AAAA,A,A,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAA,"AAAAAAAAA,AAAAAAAA",AAAA,AAAA,AA,AA,AAAAA,AAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAA,"AAAAAA,AAA",AAA,AAAA,A,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAAA,AAA,AAAAAAA",AAA,AAAA,AA,AA,AAAAA,AAAAAAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAA,AAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAA,AAAAAAAAAAA,"AAAAAAA,AAA",AAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAA,AAAAAAAAAAAA,"AAAAAAAA,AAAAAAAAAA",AAA,AAAA,AA,AA,AAAAA,AAAAAAAAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAA,AAAAAAAAAAAA,"AAAAAAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAA,"AAAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAAAAAAAAAAAAAAA,"AAAAAAAA,AAA",AAAA,AAAA,AAAAA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAA,AAA",AAA,AAAA,AAAAA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAA,AAAAAAAAAAAAAAA,"AAAAAAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAAAAAAAAAAAA,"AAAAAAAA,AAA",AAA,AAAA,AAAAA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAA,AAAAAAAAA,"AAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAA,AAAAAAAAA,"AAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAA,AAAAAAAAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAA,AAAAAAAAAAA,"AAAAAA,AAA",AAA,AAAA,A,A,AAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAAA,AAA",AAA,AAAA,AAAAA,AAAAA,AAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAA,"AAAAAAA,AAA",AAA,AAAA,A,A,AAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAA,AAAA,A,AA,AAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAA,"AAAAAAAAAAAAAAA,AAA",AAAA,AAAA,AAAAA,AAAAAA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAA,"AAAAAA,AAA",AAAA,AAAA,AA,AAA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAA,"AAAAAAAAAA,AAAAAAAAAAAAAAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAA""",AAAAAAAAAAAAAAAAAAAAAAA,"AAAAA,AAA",AAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAA,AAAAAAAAA,"AAAAAA,AAAAAAAA",AAAA,AAAA,AA,AA,AAAAA,AAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAA,AAAAAAAA,"AAAAAAAAA,AAAAAAAA",AAA,AAAA,AA,AA,AAAAA,AAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAAAAAAAAAAAA,"AAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAA,AAAA,AAAAA,AAAAA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAA,AAAAAAA,"AAAAAAAAAAA,AAAAAAA",AAAA,AAAA,AAA,A,AAAA,AAAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAA,"AAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAA,"AAAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAAAAAAAAA,"AAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAA,AAAAAAAAA,"AAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAAAAA,"AAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAA,AAAAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAA,AAAA,A,AA,AAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA""",AAAAAAAAAAAAAAAA,"AAAAAAAAAAA,AAA",AAA,AAAA,AAAA,AAAA,AAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAA,AAAAAAAAA,"AAAAAAAAAA,AAA",AAA,AAAA,AAAA,AAAA,AAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAAAAAAAAAAAAA,"AAAAAAA,AAA,AAAAAAA",AAAAA,AAAA,AA,AAA,AAAAAAA,AAAAAAAA,AAAAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAA,AAAAAAAAAAAAAAAAAAAA,"AAAAAAAA,AAAAAA",AAAA,AAAA,AA,AAA,AAAAAAA,AAAA,AAAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAA,AAAAAAAAAA",AAAA,AAAA,AAA,AAA,AAAAAA,AAAAAAAAAA,AAAAAA -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAAAAAAAAAAAAAA""",AAAAAAAAAAAAAAAAAAAA,"AAAAAAAAA,AAAAAAAAAAAAAAA",AAAA,AAAA,AA,AA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAA,AAA",AAAA,AAAA,AAAAA,AAAAAA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAA,AAAAAAAAAAAAAAA,"AAAAAAAA,AAAAAAAA",AAAA,AAAA,AA,AA,AAAAAA,AAAA,AAAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAA,AAAA,AAAAAA,AAA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAA,"AAAAA,AAA",AAAA,AAAA,AA,AAA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAA,AAA",AAAA,AAAA,AAAAA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAAAAAAAAAAA,"AAAA,AAAAAAAA",AAAA,AAAA,AA,AA,AAAAA,AAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAA,AAAAAAAAAAAAAAAA,"AAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAA,AAAAAAAA",AAA,AAAA,AA,AA,AAAAA,AAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAA,"AAAAAAA,AAA,AAAAAAA",AAA,AAAA,AA,AA,AAAAA,AAAAAAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAA,AAAAAAAA,"AAAAAAAAAAA,AAA",AAAA,AAAA,AAAAA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAAAAA""AAAAAAAAAAAAAAAAAAAAA",AAAAAAAAAAAAAAA,"AAAAAA,AAAAAAAA",AAA,AAAA,AA,AA,AAAAA,AAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,"""AAAAA""",AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAA,AAA",AAA,AAAA,AAAAA,AAAAA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAA,AAAAAAAAAAAAAAA,"AAAAAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAA,AAAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAA,AAA,AAAAAAA",AAA,AAAA,AA,AA,AAAA,AAAAAAAA,AAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAA,"AAAAAAAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,"AAAAAAAAAAAAAAAAAAAAAAAAAAAAA""AAAAAAAAAAAAAAAAAAAAA""",AAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAA,AAAAAAAAAAA,"AAAAAAAA,AAA",AAA,AAAA,AA,AA,AAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAAAAAA,"AAAAAAA,AAA",AAA,AAAA,AA,AA,AAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAA,"AAAAAAAAAAA,AAA",AAA,AAAA,AAAA,AAAA,AA,, -AAAAAAAAAA,AAAAAAAAAA,"AAAAAAAAAAAAAAAAAAA""AAAAAA""",AAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAAA,AAAA,AA,AAA,AAAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAA,AAAAAAAAAA",AAAA,AAAA,AA,A,AAAAAA,AAAAAAAAAA,AAAAAA -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAAAAAAAAA""",AAAAAAAAAAAAAAAAA,"AAAAAAAAAAAAAAAA,AAA",AAAA,AAAA,AAAAA,AAAAA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAA,AAAAAAAA",AAAA,AAAA,AA,AA,AAAAA,AAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAA,"AAAAAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAA,AAA,AAAAAAA",AAA,AAAA,AA,AA,AAAAA,AAAAAAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAA,AAAA,AAAAA,AAAAA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAA,AAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAAAAAAAA""",AAAAAAAAA,"AAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAA,"AAAAAAAA,AAA",AAA,AAAA,AA,AA,AAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAA,AAAAAAAAAAAA,"AAAAAA,AAA",AAA,AAAA,AA,AA,AAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAA,"AAAAAAAAAAA,AAA",AAA,AAAA,AAAA,AAAA,AAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAAAAAAAA,"AAAAAAAAA,AAAAAAAA",AAAA,AAAA,AA,AA,AAAAA,AAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA""",AAAAAAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAA,AAAAAAAAAAAAAAA,"AAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAA,"AAAAAAAAAA,AAA,AAAAAAA",AAA,AAAA,AA,AA,AAAAA,AAAAAAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAAAAA""AAAAAAAAAAAAAAAAAAAAA",AAAAAA,"AAAAAAAAA,AAAAAAAA",AAAA,AAAA,AA,A,AAAAA,AAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAA,AAAAAAAAA,"AAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAAAA,AAAA,AAAAA,AAAAAA,AAAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAAAAAAAAAA,"AAAAAAAA,AAA",AAAAA,AAAA,AA,AAA,AAAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAAA,AAAA,AAAAA,AAAAAA,AAAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAA,"AAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAA,AAAAAAAAAAAAAAA,"AAAAAAAA,AAAAAAAA",AAAA,AAAA,AA,A,AAAAAA,AAAA,AAAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAAAAAAAAAAAAAA""",AAAAAAAAAAAAAAAAAA,"AAAAAAAA,AAAAAAA",AAAA,AAAA,AA,AA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAA,"AAAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAAA""",AAAAAAAAAAAAAA,"AAAAAAAA,AAA",AAAA,AAAA,AAAAA,AA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAA,AAA,AAAAAAA",AAAA,AAAA,AA,AA,AAAAA,AAAAAAAA,AAAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAA,"AAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAAAAAAAAAAAA,"AAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAAA,AAAA,AAAAA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAA,"AAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAA,"AAAAAA,AAAAAAAAAAAA",AAAA,AAAA,AA,AA,AAAAA,AAAAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAAAAAAAAAAA,"AAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAAAAAAA,"AAAAAAA,AAA,AAAAAAA",AAA,AAAA,AA,AA,AAAAA,AAAAAAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAA,AAAAAAAAAAAAAAA,"AAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAAA,AAAA,A,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAAA,AAA",AAA,AAAA,AAAAA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAA,"AAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAA,AAAAAAAAA,"AAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAAAA,"AAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAA,"AAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAAAAAAAAAAAAA""",AAAAAAAAAAAAAAA,"AAAAAAAAAAA,AAA",AAA,AAAA,AAAAA,AAAAA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAAAAAAAAAAAA,"AAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAA,AAAAAAAAAA,"AAAAAAA,AAA",AAA,AAAA,A,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAA,"AAAAAAAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAAAAA""",AAAAAAAAAAAA,"AAAAAAAAAAA,AAAAAAA",AAA,AAAA,AA,AAA,AAAA,AAAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAA,AAAAAAA,"AAAAAAA,AAA",AAA,AAAA,A,A,AAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAA,AAAAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAA,AAAA,A,A,AAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAAAAAAAAAAAAAA""",AAAAAAAAAAAAA,"AAAAAAA,AAAAAAAAAAAAAAA",AAAA,AAAA,AA,AA,AAAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAAAAAAAAAA,"AAAAAAAAAA,AAA",AAAAA,AAAA,AAAAA,AAAAAA,AAAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAA,AAA",AAAA,AAAA,AA,AAA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAA,AAAAAAAAAAAAAA,"AAAAAA,AAAAAAAAAAAAAAA",AAAA,AAAA,AA,AA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAAAAAAAAAAA,"AAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAA,AAAAAAAA",AAAA,AAAA,AA,AA,AAAAAA,AAAA,AAAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAA,AAAAAAAA,"AAAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAAA,AAAA,AA,AAA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAA,"AAAAAAAA,AAAAAAAAAA",AAA,AAAA,AA,A,AAAAA,AAAAAAAAAA,AAAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAAAAA,AAA",AAAA,AAAA,AAAAA,AAAAA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAA""",AAAAAAAAAAAAAAAAAA,"AAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAAA,AAAA,AA,AAA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAAAA,AAA,AAAAAAA",AAAA,AAAA,AA,AA,AAAAA,AAAAAAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAA,AAAAAAAAAAAAAAAA,"AAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAA,"AAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,"AAAAAAAAAAAAAAAAAAAAAAA""AAAAAAAAAAAAAAA""",AAAAAAAAAAAA,"AAAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAAAAAAAAAA,"AAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAAAAAAAA,"AAAAA,AAA",AAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAAAAAAAAAA,"AAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAAAAAAAAAAAA,"AAAA,AAAAAAAAAAAA",AAA,AAAA,AA,AA,AAAAA,AAAAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAA,"AAAAAAAAAA,AAA",AAA,AAAA,AAAAA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAAAAAAA""",AAAAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAA,AAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAA,AAAAAAA,"AAAAAAAAAAA,AAAAAAA",AAA,AAAA,AAA,AAA,AAAAA,AAAAA,AAAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAA,AAAAAAAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAA,AAAAAAAAAAAAA,"AAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAA""",AAAAAAAAAAA,"AAAAAAAAAA,AAA",AA,AAAA,A,A,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAAAAAAAAAAAAA""",AAAAAAAAAAAAAAA,"AAAAAAAAAAA,AAA",AAA,AAAA,AAAAA,AAAAA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAAAAAAA,"AAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAA,AAAAA,"AAAAAAAAA,AAA",AAAAA,AAAA,AAAAA,AA,AAAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAA,"AAAAAAA,AAAAAAAA",AAAAA,AAAA,AA,AA,AAAAAAA,AAAA,AAAAAAA -AAAAAAAAAA,AAAAAAAAAA,"AAAAAAAAAAAAAAAAAAA""AAAAAA""",AAAAAAA,"AAAAAAAAA,AAAAAAAA",AAAA,AAAA,AAA,AAA,AAAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,"AAAAAAAAAAAAAAAAAAA""AAAAAA""",AAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAAA,AAAA,AA,AAA,AAAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAAAA,AAAA,AAAAA,AAAAA,AAAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAA,AAAAAAAAAAAAAA,"AAAAAA,AAAAAAAAAAAAAAA",AAAA,AAAA,AA,AA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAA""",AAAAAAAAAAAA,"AAAAAAAAAAA,AAAAAAA",AAAA,AAAA,AAA,AAA,AAAAAA,AAAAA,AAAAAAA -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAA""",AAAAAAAAAAAAA,"AAAAAAA,AAAAAAAAAAAAAAA",AAAA,AAAA,AA,AA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAA,"AAAAAA,AAA",AAAA,AAAA,AA,AAA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAAAAAAAAAAAA""",AAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAAAA,AAA",AAAA,AAAA,AAAAA,AAAAA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,"AAAAAAAAAAAAAAAAAAAAA""AAAAAAAAAAAAAA""",AAAAAAAAAAAA,"AAAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAA,AAAAAAAAAAAA",AAA,AAAA,AA,AA,AAAAA,AAAAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAAA,"AAAAAAA,AAA,AAAAAAA",AAA,AAAA,AA,AA,AAAA,AAAAAAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA""",AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAA,"AAAAAA,AAA",AAA,AAAA,AAAAA,AAAAA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,"AAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAA,AAAAAAAAAAAAAAA,"AAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAA,"AAAAAAA,AAA",AAA,AAAA,A,AA,AAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAA,AAA",AAAAA,AAAA,AAAAA,AAAAAA,AAAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAA,AAAAAAAAAAAAA,"AAAAAA,AAAAAA",AAAA,AAAA,AA,AAA,AAAAAA,AAAA,AAAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAA,"AAAAAAAA,AAA",AAAA,AAAA,AAAAA,AAA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAAAAAAA""",AAAAAAAAAAAAAAAAAA,"AAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAA""",AAAAAAAAAAAAAAAAAAAAAAA,"AAAAA,AAA",AAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAAAAAAAAA,"AAAAAAA,AAAAAAAA",AAAA,AAAA,AA,AA,AAAAA,AAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAA,AAAAAAA,"AAAAAAAAAAA,AAAAAAA",AAAA,AAAA,AAA,AAA,AAAAA,AAAAA,AAAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAA,AAAAAAAAAA,"AAAAAAAA,AAA,AAAAAAA",AAAA,AAAA,AA,AA,AAAAA,AAAAAAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAA,AAAAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAA,AAAA,AA,AAAAA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAA,AAAAAAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAA,"AAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAA,AAAAAAAAAAAAAAAAA,"AAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAAAAAAAAA,"AAAAAAAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAA,AAAAAAA,"AAAAAAA,AAA",AAA,AAAA,A,A,AAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAAA,AAAA,AAAAA,AAAAAA,AAAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAAAAAAAAAAAAAA""",AAAAAAAAAAAAAAAA,"AAAAAAAAA,AAAAAAAAAAAAAAA",AAAA,AAAA,AA,AA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAA""",AAAAAAAAAAAAAAA,"AAAAAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAAAAAAAAAA,"AAAAAA,AAAAAAAAAAAAAAA",AAAA,AAAA,AA,A,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAA""",AAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAA,AAA",AAAA,AAAA,AAAAA,AAAAA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAA,AAAAAAAAA,"AAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA""",AAAAAAAAAAAAAAAAAAAA,"AAAAAAAA,AAA",AAAA,AAAA,AAAAA,AAAAA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAAAAAA,"AAAAAAAAAA,AAAAAAAA",AAA,AAAA,AA,AA,AAAAA,AAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAA,AAAA,AAAAA,AAAAA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAA,AAAAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAA,AAAA,AAAAA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAA,AAA,AAAAAAA",AAA,AAAA,AA,A,AAAA,AAAAAAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAA,AAAAAAAAAAAAAAAA,"AAAAAAAA,AAA,AAAAAAA",AAA,AAAA,AA,AA,AAAA,AAAAAAAA,AAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAA,AAAAAAAAAAAA,"AAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAAAAAA,"AAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAA""",AAAAAAAAAAAAAAA,"AAAAAAAAAAAA,AAA",AAAA,AAAA,A,A,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,"AAAAAAA,AAAAAAAA",AAAA,AAAA,AA,AA,AAAAA,AAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAA,AAAAAAAAAAAA,"AAAAAA,AAA",AAA,AAAA,AA,AA,AAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAA,AAAAAAAAAAAAA,"AAAAAAA,AAAAAAAA",AAAAA,AAAA,AA,A,AAAAAA,AAAA,AAAAAA -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAAAAAAAAA""",AAAAAAAAAAAAA,"AAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA""",AAAAAAAA,"AAAAAAAAAA,AAA",AAAA,AAAA,AAAAA,AAAAA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAA,AAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAAAA,"AAAAAAAAAAAA,AAAAAAAA",AAAA,AAAA,AA,AA,AAAAA,AAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAA,AAAAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAA,AAAAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAAAAAAA""",AAAAAAAAAAAAAAAAAA,"AAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAA,AAAAAAA,"AAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAA,"AAAAAAA,AAAAAAAA",AAA,AAAA,AA,AA,AAAA,AAAA,AAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAA,AAAA,AAAAA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAAAAAAAAAA""",AAAAAAAAA,"AAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAA,AAAAAAAAA,"AAAAAAAA,AAA",AAA,AAAA,AA,AA,AAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAA,"AAAAAAA,AAA,AAAAAAA",AAAAA,AAAA,AA,AAA,AAAAAAA,AAAAAAAA,AAAAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAA,AAAAAAAAAAAAAAA,"AAAAAA,AAAAAAAAAAAAAAA",AAAAA,AAAA,AA,AA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,"AAAAAAAAAAAAAAAAAAAA""AAAAAAAAAAAAAA""",AAAAAAAAAAAAAAAAAAAAAAA,"AAAAA,AAA",AAAA,AAAA,AA,AAA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAAAAAA,"AAAAAAA,AAAAAAAA",AAAA,AAAA,AA,AA,AAAAAA,AAAA,AAAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAA,"AAAAAA,AAAAAAAA",AAAA,AAAA,AA,AA,AAAAAA,AAAA,AAAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAA,"AAAA,AAAAAAAA",AAAA,AAAA,AA,AAAA,AAAAAA,AAAA,AAAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAA,AAAAAAAAAAAAAAA,"AAAAAAAA,AAAAAAAA",AAAA,AAAA,AA,AA,AAAAAA,AAAA,AAAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAA,"AAAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAA,AAA",AAAA,AAAA,AAAAA,AAAAA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAA,AAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAA,AAA",AAAA,AAAA,AAAAA,AAAAA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAA,"AAAAAA,AAA",AAA,AAAA,AA,AAA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAAA""",AAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAA,AAAAAAA",AAAA,AAAA,AAA,AAA,AAAAA,AAAAA,AAAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAAA,AAAA,AAAAA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAAAAAAAAA,"AAAAAAAAA,AAAAAAAA",AAA,AAAA,AA,AA,AAAAA,AAAA,AAAA -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA""",AAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAA,AAA",AAAA,AAAA,AAAA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAA,AAAAAAAAAAAAAAAA,"AAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAA,AAAAAAAAAAAAAAAAAA,"AAAAAAAAA,AAA,AAAAAAA",AAA,AAAA,AA,AA,AAAA,AAAAAAAA,AAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAA,AAAA,AAAAA,AAAAA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAAAAAA""",AAAAAAAAAAAAAAAA,"AAAAAA,AAA",AAA,AAAA,AAAA,AAAA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAA""",AAAAAAAAAAAAA,"AAAAA,AAA",AAAA,AAAA,AAAAA,AAAAA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAA,AAAAAAAAAAAAA,"AAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAA,"AAAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAA,AAAAAAAA,"AAAAAAA,AAA",AAA,AAAA,AA,AA,AAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAA,AAA",AAA,AAAA,A,A,AAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAA,AAAAAAAAA,"AAAAAA,AAAAAAAAA",AAAAA,AAAA,AA,AAA,AAAAAAA,AAAA,AAAAAAA -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAAAAAA""",AAAAAAAAAAAAA,"AAAAAAA,AAAAAAAA",AAAAA,AAAA,AA,AA,AAAAAAA,AAAA,AAAAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAA,"AAAAAAAA,AAA",AAAA,AAAA,AA,AAA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAAAAAAAAA""","AAAAAAAAAAAAAAAA""AAAAAAAAAAAAA""","AAAAAAA,AAA,AAAAAAA",AAAA,AAAA,AA,AA,AAAAAA,AAAAAAAA,AAAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAA,"AAAAAAA,AAAAAAAA",AAAA,AAAA,AA,A,AAAAAA,AAAA,AAAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAAA,AAAA,AAAAA,AAAAA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAAAAAAAAAAAAAAAA""",AAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAAA,AAAA,AA,AAA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAAAAAAAAAAAAAAA,"AAAAAAAAA,AAAAAAAA",AAAA,AAAA,AA,AA,AAAAAA,AAAA,AAAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAA,"AAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAA""",AAAAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAAA,AAAA,AA,AAA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAAA,AAAA,AA,AAA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAA,"AAAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAAAAAAAAAAAAA,"AAAAAAAAAAA,AAAAAAA",AAA,AAAA,AAA,AAAA,AAAAA,AAAAA,AAAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAA,AAAAAAAAAAAAAAA,"AAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAAA,AAA",AAAA,AAAA,AAAAA,AAAAA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAA,AAAA,AAAAA,AAAAA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAA""",AAAAAAAAAAAAAAAA,"AAAAAAA,AAAAAAA",AAAA,AAAA,AAA,AAAA,AAAAA,AAAAA,AAAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAA,AAAAAAAAAAAAAAA,"AAAAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAA,"AAAAAAA,AAA,AAAAAAA",AAA,AAAA,AA,AA,AAAAA,AAAAAAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAA,"AAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAA,"AAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAA,AAAAAAAAAAAAAAAAA,"AAAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAA,"AAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAA,AAAAAAA,"AAAAAAA,AAA",AAA,AAAA,AA,AA,AAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAA,AAA",AAAAA,AAAA,AAAAA,AAAAAA,AAAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAA,AAAAAAAA",AAAA,AAAA,AA,AA,AAAAAA,AAAA,AAAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAA,"AAAAAAAAAAAAAAAA,AAAAAAAAAA",AAAA,AAAA,AA,A,AAAAAA,AAAAAAAAAA,AAAAAA -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAA""",AAAAAAAAAAAAAAAAAAAAAAA,"AAAAA,AAA",AAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAAA,"AAAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAAAAA""AAAAAAAAAAAAAAAAAAAAA",AAAAAAAAAAA,"AAAAA,AAAAAAAA",AAA,AAAA,AA,AA,AAAAA,AAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAA,AAAAAAAAAAAAAAAA,"AAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAAAAAAAAAAAA,"AAAAA,AAA",AAA,AAAA,AAAAA,AAAAA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAAA,AAA",AAAA,AAAA,AAAAA,AAA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAA,AAAAAAAA",AAAA,AAAA,AA,AA,AAAAA,AAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAAA,AAAA,AAAAA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAA,AAAAAAAAAAAAA,"AAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAA,"AAAAAAAA,AAA,AAAAAAA",AAA,AAAA,AA,A,AAAA,AAAAAAAA,AAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAA,"AAAAAAAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAA,AAAAAAAAAAAAA,"AAAAA,AAA",AAAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAA,AAAAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAA,AAAA,AAAAA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAA,AAAA,A,A,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAA,AAAA,A,AA,AAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAA""",AAAAAAAAAAAAAA,"AAAAAAAA,AAA",AAAAA,AAAAA,AA,AAA,AAAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAA""",AAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAAA,AAAA,AAAAA,AAAAA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAA,AAA",AAAA,AAAA,AAAAA,AAAAA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAA""",AAAAAAAAAAAA,"AAAAAAAAAAA,AAAAAAA",AAAA,AAAA,AAA,AAA,AAAAA,AAAAA,AAAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAA,"AAAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAA,AAA",AAAA,AAAA,AAAA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAA,AAAAAAAA",AAA,AAAA,AA,AA,AAAAA,AAAA,AAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAA,AAAAAAAAAAAAAAA,"AAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAA,AAAAAAAAAAAAAA,"AAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAA,"AAAAAAAAAA,AAA",AAA,AAAA,A,AA,AAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAA,AAAAAAAAAA,"AAAAAAA,AAA",AAA,AAAA,A,AA,AAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAA,"AAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAAAAAAA,"AAAAAAAA,AAA,AAAAAAA",AAAA,AAAA,AA,AA,AAAAAA,AAAAAAAA,AAAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAAAAAAAAAAAA""",AAAAAAAAAAAAA,"AAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAAAAAAAAA,"AAAAAA,AAA",AAA,AAAA,AA,AA,AAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAA,AAAAAAAAA,"AAAAAAAA,AAA",AAA,AAAA,AA,AA,AAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAAAAA,"AAAAAAA,AAA",AAA,AAAA,A,A,AAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAA,AAAAAAAAAAAAAAAAA,"AAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAA",AAAA,AAAA,AA,A,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAA,"AAAAAAAA,AAAAAAA",AAAA,AAAA,AAA,AAA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAA,"AAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAA,AAA,AAAAAAA",AAA,AAAA,AA,A,AAAA,AAAAAAAA,AAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAAAAA,"AAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAA,AAAAAAAAAAAA,"AAAAAA,AAA",AAA,AAAA,AA,AA,AAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAA,AAAAAAAAAAAAA,"AAAAAAA,AAAAAAAAAAAAAAA",AAAAA,AAAA,AA,AA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAAAAAAAAAAAAAA""",AAAAAAAA,"AAAAAA,AAAAAAAA",AAAA,AAAA,AA,AA,AAAAAA,AAAA,AAAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAAA,AAAA,AA,AAA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA""",AAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAAAAA""AAAAAAAAAAAAAAAAAAAAA",AAAAAAA,"AAAAAAAAAA,AAAAAAAA",AAAA,AAAA,AA,AA,AAAAA,AAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAAA,AAA",AAAA,AAAA,AAAAA,AAAAAA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAA,AAAAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAA,AAAAAAA,"AAAAAAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAA,AAAA,"AAAAAAAAA,AAA,AAAAAAA",AAA,AAAA,AA,A,AAAA,AAAAAAAA,AAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAA,AAAAAAAAAAAAAAAAAAA,"AAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAA,AAAA,AAAAA,AAAAA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAA,"AAAAAAAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAA,AAAAAAAAAA,"AAAAAAA,AAA",AAA,AAAA,A,AA,AAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAAAA,"AAAAAAA,AAA",AAA,AAAA,A,AA,AAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAA,"AAAAAA,AAAAAAAAAAAAAAA",AAAA,AAAA,AA,AAA,AAAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAAAA,AAAA,AAAAA,AAAAAA,AAAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAAAAAAAA,"AAAAAAA,AAAAAAAA",AAAAA,AAAA,AA,AA,AAAAAA,AAAA,AAAAAA -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAAAAAAAAAAAAAA""",AAAAAAAAAAAAAAAA,"AAAAAAA,AAAAAAAA",AAAA,AAAA,AA,AA,AAAAAA,AAAA,AAAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAA,"AAAAAAAAAAAAAAAA""AAAAAAAAAAAAA""","AAAAAAA,AAA,AAAAAAA",AAAA,AAAA,AA,AAA,AAAAAA,AAAAAAAA,AAAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAAAAAAAAAA,"AAAAAAAA,AAAAAAAA",AAAA,AAAA,AA,AA,AAAAAA,AAAA,AAAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAA,"AAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAAAAAAA""",AAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAA,"AAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAAAA,"AAAAAAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAA,"AAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAAAAAAAAAAAA,"AAAAAAAA,AAAAAAAA",AAAA,AAAA,AA,AA,AAAAA,AAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAAAAA""AAAAAAAAAAAAAAAAAAAAA",AAAAAAAAAAAAAAAA,"AAAAAAAA,AAAAAAAA",AAA,AAAA,AA,AA,AAAAA,AAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAA,AAAAAAAAAAAAAAAA,"AAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAA,AAAAAAAAAA,"AAAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,"AAAAAAAAAAAAAAAA""AAAAAA,AAAAAAAAAAAAAAAAAA""A",AAAAAAAAAAAA,"AAAAA,AAA",AAA,AAAA,AAAAA,AAAAA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAA,"AAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAA""",AAAAAAAAAAAA,"AAAAAAAAAAA,AAAAAAA",AAAA,AAAA,AAA,AAA,AAAA,AAAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAA,"AAAAAAAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAAA,"AAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAA,AAAAAAA,"AAAAAAA,AAAAAAAA",AAA,AAAA,A,A,AAAA,AAAA,AAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAA,"AAAAAAAAAA,AAA",AAAAA,AAAA,AAAAA,AAAAAA,AAAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAAA""",AAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAA,AAAAAAAAAAAAAAA,"AAAAAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAAAAAAAAA,"AAAAAA,AAAAAAAA",AAAA,AAAA,AA,AA,AAAAAA,AAAA,AAAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAA,AAAAAAAAAAAAAA,"AAAAAAAA,AAA",AAAA,AAAA,AAAAA,AAAAA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAA,AAAAAAAAAAAA,"AAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAA,AAA",AAAA,AAAA,AAAAA,AAAAA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAAAAA""AAAAAAAAAAAAAAAAAAAAA",AAAAAAAAAA,"AAAAAAA,AAAAAAAA",AAAA,AAAA,AA,AA,AAAAA,AAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAAAAAAAAA,"AAAAA,AAA",AAAA,AAAA,AAAAA,AAAAA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAA,AAAAAAAA",AAA,AAAA,AA,AA,AAAAA,AAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,"AAAAAAAAAAAAAAAAAAAAAAA""AAAAAAAAAAAAAAA""",AAAAAAAAAAAA,"AAAAAAAAAA,AAA",AAAA,AAAA,AA,A,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAA,AAAAAAAAAAAAA,"AAAAA,AAAAAAAA",AAAA,AAAA,AA,AA,AAAAA,AAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAA,AAAAAAAAAAAAAAA,"AAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAA,"AAAAAAAAAAA,AAAAAAA",AAAA,AAAA,AAA,AAA,AAAA,AAAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAA,"AAAAAAAAA,AAA,AAAAAAA",AAA,AAAA,AA,AA,AAAA,AAAAAAAA,AAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAAAAAAAA,"AAAAAAAA,AAA",AAA,AAAA,A,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAA,AAAAAA,"AAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAA,"AAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA""",AAAAAAAAAAA,"AAAAAAAAAA,AAA",AA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAAAA,"AAAAAAA,AAA",AAA,AAAA,A,AA,AAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAAAAAAAAAA,"AAAAAAA,AAAAAAAA",AAAA,AAAA,AA,AA,AAAAAA,AAAA,AAAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAA,AAAAAAAAAAAA,"AAAAAAAA,AAAAAAAAAAAA",AAAA,AAAA,AA,A,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAAAAAAAAAAAAAA""",AAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAA,"AAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,"AAAAAAAAAAAAAAAA""AAAAAAAAAAAA""",AAAAAAAAAAAAA,"AAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAAAAAAAAAAAA""",AAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAAAA,AAA",AAAA,AAAA,AAAAA,AAAAA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAA,AAAAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAA,AAAAAAAAAA,"AAAAAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAAAA""",AAAAAAAAAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,"AAAAAAAAAAAAAAAAAAAAA""AAAAAAAAAAAAAA""",AAAAAAAAAAAA,"AAAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAA,AAAAAAAA,"AAAAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAA,AAAAAAAAAAAA,"AAAAAAA,AAA,AAAAAAA",AAA,AAAA,AA,AA,AAAAA,AAAAAAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAA,AAAA,AAAAA,AAAAA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAAAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAA,AAAAAAAAA,"AAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAA,"AAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAAA,AAA",AAA,AAAA,AAAA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAA,AAAAAA,"AAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAA,AAAA,A,AA,AAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAA,"AAAAAAA,AAAAAAAAAAAAAAA",AAAAA,AAAA,AA,AA,AAAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAA,"AAAAAA,AAAAAA",AAAA,AAAA,AA,AAA,AAAAAA,AAAA,AAAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAA,AAAAAAAAAA",AAAA,AAAA,AA,AAA,AAAAAA,AAAAAAAAAA,AAAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAA,"AAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAA,"AAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAA,AAAAAAAAAAAA,"AAAAAA,AAA",AAA,AAAA,AA,AA,AAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAA,"AAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAA",AAAAA,AAAA,AA,AA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAA""",AAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAA,AAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAA""",AAAAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAA,AAAAAAAAAAAAA,"AAAAAAAAAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAAAAAA,"AAAAA,AAAAAAAA",AAAA,AAAA,AA,AA,AAAAA,AAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAAAAA""AAAAAAAAAAAAAAAAAAAAA",AAAAAAAAAAAAAAA,"AAAAAA,AAAAAAAA",AAA,AAAA,AA,AA,AAAAA,AAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAA,AAAA,A,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAAAAAAAAAA,"AAAAAA,AAAAAAAAAAAAAAA",AAAAA,AAAA,AA,AA,AAAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAA,AAAAAAAAAAAAAA,"AAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAA,AAAAAAA,"AAAAAAAA,AAAAAA",AAAA,AAAA,AA,AA,AAAAA,AAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAAAAA""AAAAAAAAAAAAAAAAAAAAA",AAAAAAAAAAA,"AAAAAAAAA,AAAAAAAA",AAAA,AAAA,AA,AA,AAAAA,AAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAA,AAAAAAAAAAAAA,"AAAAAAA,AAA",AAA,AAAA,AAAAA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAA,AAAAAAAAAAAA,"AAAAA,AAA",AAA,AAAA,AAAAA,AAAAA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAA,AAAAAAAAAAAA,"AAAAAA,AAA",AAA,AAAA,AA,AA,AAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAA,AAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAA,AAA",AAAAA,AAAA,AAAAA,AA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAA,"AAAAAAAAAAAAAAAAAA,AAAAAAAA",AAA,AAAA,AA,AA,AAAAA,AAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAA,AAAAAAAAAAAAAAA,"AAAAAAAAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAA,AAAA,AAAAA,AAAAA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAA,AAAAAA,"AAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAA,AAAAAAAAAAAAAAAA,"AAAAAAAAA,AAAAAA",AAAAA,AAAA,AA,AAA,AAAAAAA,AAAA,AAAAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAA,"AAAAAAA,AAA",AAAA,AAAA,AAAAA,AAAAAA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAAAAAAAA,"AAAAA,AAAAAAAA",AAAA,AAAA,AA,AA,AAAAAA,AAAA,AAAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAA,AAA",AAAAA,AAAA,AAAAA,AA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAA,AAAAAAAAAAAAA,"AAAAA,AAAAAAAA",AAAA,AAAA,AA,AA,AAAAA,AAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAA,"AAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAA,AAA",AAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAA,"AAAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAAAAAAAAAAA,"AAAAAAAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAA,AAAA,A,A,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAA,AAAAAAAAAAAAA,"AAAAAAAA,AAA",AAA,AAAA,A,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAA,AAAAAAAAAAAAA,"AAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAAAAA,"AAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAA,AAAAAAA,"AAAAAAA,AAA",AAA,AAAA,A,A,AAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAAAAAAAA,"AAAAAAA,AAAAAAAAAAAAAAA",AAAAA,AAAA,AA,AA,AAAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAA""",AAAAAAAAAAAAA,"AAAAAAA,AAAAAAAA",AAAA,AAAA,AA,AA,AAAAAA,AAAA,AAAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAA,AAA",AAAA,AAAA,AA,AAA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAA,AAAAAAAA",AAAA,AAAA,AA,AA,AAAAAA,AAAA,AAAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAA,"AAAAAAAA,AAA,AAAAAAA",AAAA,AAAA,AA,AA,AAAAA,AAAAAAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAAAA,"AAAAAAAAAA,AAAAAAAA",AAAA,AAAA,AA,AA,AAAAA,AAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAAAAAAAAAAAAA,"AAAAAA,AAA",AAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAA,AAAA,AAAAA,AAAAA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAA,AAAAAAAAA,"AAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAA,AAAAAAAAA,"AAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAA,AAAAAAAAAAAAAAAAAAA,"AAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAAAAAA,"AAAAAAA,AAA",AAA,AAAA,A,AA,AAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAA,AAAAAAA,"AAAAAAA,AAA",AAA,AAAA,A,A,AAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAA""",AAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAAAAAAAAA,"AAAAAAAAA,AAAAAAAA",AAA,AAAA,AA,AA,AAAAA,AAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAA,AAAAAAA,"AAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAA,"AAAAAAAAAAAAAAA,AAAAAAAA",AAAA,AAAA,AA,AA,AAAAA,AAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAAAAAAAAAA,"AAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAA,"AAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAA,AAAA,AAAAA,AAAAA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAA,AAAAAA",AAAA,AAAA,AA,AAA,AAAAAA,AAAA,AAAAAA -AAAAAAAAAA,AAAAAAAAAA,"""AAAAA""",AAAAAAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAA,AAAAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAA,AAAAAAAA",AAAA,AAAA,AA,AA,AAAAA,AAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAA,"AAAAAAA,AAAAAAAA",AAAA,AAAA,AA,AA,AAAAAA,AAAA,AAAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAAAAAAAA,"AAAAAAAAAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAA,AAAAAAAAAAAA,"AAAAAA,AAA",AAA,AAAA,AA,AA,AAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAAAAAAA,"AAAAAAAAAAAAAA,AAAAAAAA",AAA,AAAA,AA,AA,AAAAA,AAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAA,AAAAAAAAAA,"AAAAAAA,AAA",AAA,AAAA,A,A,AAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAA,AAAAAAAAAAAAAAAAAA,"AAAAAA,AAAAAA",AAAAA,AAAA,AA,AAA,AAAAAAA,AAAA,AAAAAAA -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAA""",AAAAAAAAAAAAAAA,"AAAAAA,AAAAAAAAAAAAAAA",AAAA,AAAA,AA,AA,AAAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAAAAAAAA,"AAAAAAA,AAA",AAAAA,AAAA,AA,AA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAA,AAAAAAAAAAAAA,"AAAAAAA,AAAAAAAA",AAAA,AAAA,AA,AA,AAAAAA,AAAA,AAAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAA,AAA",AAAA,AAAA,AAAAA,AAAAA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAA,AAAAAAAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAA,"AAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAA,AAAAAAAAAA,"AAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAAAAAAAAAAAAAAAA,"AAAAAAA,AAAAAAAAAA",AAA,AAAA,AA,AA,AAAA,AAAAAAAAAA,AAAA -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAAAAAAAAA,AAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAA""",AAAAAAAAAAAAAAAAAAA,"AAAAAA,AAA",AAA,AAAA,A,AA,AAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAA,AAA",AAAAA,AAAA,AA,AA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAAA,AAA",AAAA,AAAA,AAAAA,AAAAA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAAA,"AAAAAAAAA,AAAAAAAA",AAAA,AAAA,AA,AA,AAAAA,AAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAA,AAAAAAAAAAAAAAAAAA,"AAAAAA,AAA",AAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAA,AAAA,AA,AA,AAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAAAAA""A",AAAAAAAAAAAAAAAA,"AAAAAAA,AAAAAAAAAAAAAAA",AAAA,AAAA,AA,AA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,"""AAAAAAA""",AAAAAAAAAAAA,"AAAAAAA,AAA",AAAAA,AAAA,AAAAA,AAA,AAAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAA,AAAAAAAAAAA,"AAAAAAA,AAA",AAAA,AAAA,AAAAA,AA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,"AAAAAAAAAAAAAAAAAAA""AAAAAAA""",AAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAA,AAAAAAAAAAAAA,"AAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAA,AAAAAAAAAAAAAAAAA,"AAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAA,"AAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAAAAAAAAA,"AAAAAAA,AAA,AAAAAAA",AAA,AAAA,AA,AA,AAAA,AAAAAAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAA,AAAAAAAAAAAAAA,"AAAAAAAAAAAAAA,AAA",AAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAA,"AAAAAAA,AAA",AAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAA,"AAAAAAA,AAA",AAA,AAAA,A,A,AAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAA,AAAAAAAAAA,"AAAAAAA,AAA",AAA,AAAA,A,AA,AAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAA,AAAAAAAAAA,"AAAAAAA,AAA",AAA,AAAA,A,AA,AAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAA,AAAAAAAAAAAAA,"AAAAAAA,AAAAAAAAAAAAAAA",AAAA,AAAA,AA,AA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAA,AAAAAAAAA,"AAAAAAAA,AAA,AAAAAAA",AAA,AAAA,AA,AA,AAA,AAAAAAAA,AAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,"AAAAAAAAAAAAAAAAAA""AAAAAAAAAAAAAA""",AAAAAAAAAAAA,"AAAAAAAAAA,AAA",AAAA,AAAA,AA,AAA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAAAA,AAA",AAAA,AAAA,AA,AA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,"AAAAAAAAAAAAAAAAAAAA""AAAAAAAAAAAAAA""",AAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAAAA,AAA",AAAA,AAAAA,AA,AA,AAAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAA,AAAAAAAAAAAAA,"AAAAAAAA,AAAAAAAA",AAA,AAAA,AA,A,AAAA,AAAA,AAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAA,"AAAAAAAA,AAAAAAAAAA",AAAA,AAAA,AA,AA,AAAAA,AAAAAAAAAA,AAAAA -AAAAAAAAAA,AAAAAAAAAA,"AAAAAAAAAAAAAAAAAAA""AAAAA""",AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAA,AAAAAAAAAA",AAAA,AAAA,AA,AAA,AAAAAAA,AAAAAAAAAA,AAAAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAA,AAAAAAAAAAAA,"AAAAAAAA,AAA",AAAA,AAAA,AAAAA,AAAAA,AAAAA,, -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAA,AAAAAAAAA,"AAAAAAAA,AAA,AAAAAAA",AAA,AAAA,AA,AA,AAA,AAAAAAAA,AAA -AAAAAAAAAA,AAAAAAAAAA,"AAAAAAAAAAAAAAAAAAA""AAAAA""",AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAA,AAAAAAAAAA",AAAA,AAAA,AA,AAA,AAAAAAA,AAAAAAAAAA,AAAAAAA -AAAAAAAAAA,AAAAAAAAAA,AAAAAAAAAAAAA,AAAAAAAAAAAAAAAAAAAAAAAAAAA,"AAAAAAAA,AAAAAAAA",AAA,AAAA,AA,AA,AAAA,AAAA,AAA diff --git a/inst/tests/isoweek_test.csv b/inst/tests/isoweek_test.csv deleted file mode 100644 index 4970d7766b..0000000000 --- a/inst/tests/isoweek_test.csv +++ /dev/null @@ -1,1462 +0,0 @@ -input_date,expected_output -2215-02-18,7 -1945-08-18,33 -2222-06-30,26 -2196-03-27,12 -1896-01-30,5 -1966-03-11,10 -2031-06-25,26 -2004-02-08,6 -2133-02-08,6 -1988-06-05,22 -2210-11-02,44 -1965-05-26,21 -2019-09-23,39 -2055-01-16,2 -1967-05-26,21 -2164-07-01,26 -1902-06-23,26 -1942-06-14,24 -1974-03-26,13 -2057-04-22,16 -1945-05-05,18 -1868-12-25,52 -1891-03-30,14 -1986-11-11,46 -2195-03-29,13 -1900-04-25,17 -1853-02-15,7 -1856-12-25,52 -2049-01-14,2 -2148-01-29,5 -1874-05-23,21 -1896-12-13,50 -1935-12-31,1 -1858-04-18,15 -1990-08-10,32 -2209-08-03,31 -2014-08-17,33 -1930-10-07,41 -2039-12-16,50 -2171-10-05,40 -1866-06-16,24 -1881-09-10,36 -2202-03-26,12 -1865-08-14,33 -2072-05-15,19 -2051-03-24,12 -1869-03-06,9 -2123-11-02,44 -2020-10-14,42 -2225-01-21,3 -2011-09-05,36 -2034-07-14,28 -2169-12-05,49 -1932-10-20,42 -1977-12-04,48 -1888-04-15,15 -2082-06-18,25 -2005-04-27,17 -2177-04-17,16 -1964-12-25,52 -2056-10-20,42 -1854-06-07,23 -2122-12-29,53 -2036-12-21,51 -2229-05-27,22 -2233-08-21,34 -1972-01-04,1 -2043-10-28,44 -2201-07-14,29 -2013-10-26,43 -1866-07-28,30 -2166-04-28,18 -2046-06-19,25 -2063-09-12,37 -2065-01-27,5 -2144-06-21,25 -1862-02-02,5 -2056-10-13,41 -2017-01-05,1 -1930-05-29,22 -2130-06-13,24 -2207-09-26,39 -1935-02-12,7 -2089-03-21,12 -2132-03-22,12 -2073-10-22,42 -1987-10-22,43 -2068-02-20,8 -2079-12-12,50 -2015-04-17,16 -1855-07-05,27 -2166-07-27,30 -1908-02-13,7 -2219-03-19,11 -2130-11-02,44 -2122-08-03,32 -2163-03-31,13 -1913-07-27,30 -1943-02-10,6 -1952-08-17,33 -1852-06-15,25 -1912-05-30,22 -2190-04-15,15 -1992-01-01,1 -2229-05-11,20 -1950-12-20,51 -1918-12-11,50 -1894-09-19,38 -2223-06-05,23 -2156-12-09,50 -1892-04-27,17 -2074-08-16,33 -2015-07-23,30 -2143-06-29,26 -1956-11-09,45 -2107-12-14,50 -1994-07-05,27 -2165-12-09,50 -2035-08-15,33 -2070-05-07,19 -2247-10-27,43 -2203-01-10,2 -1909-09-03,35 -2159-09-13,37 -1956-09-02,35 -2122-02-09,7 -1873-02-06,6 -2145-08-07,31 -2114-07-31,31 -1925-04-22,17 -1948-12-18,51 -2126-09-06,36 -1967-12-13,50 -2207-01-24,4 -1866-04-15,15 -2170-01-30,5 -1910-01-24,4 -1970-12-01,49 -1867-01-25,4 -1867-08-01,31 -1873-05-30,22 -2118-08-21,33 -2036-09-03,36 -2085-08-29,35 -1899-08-28,35 -2052-07-15,29 -2122-12-24,52 -2241-04-13,15 -1987-06-17,25 -1896-06-10,24 -2172-05-01,18 -2144-11-09,46 -2144-06-13,24 -1992-01-21,4 -1921-08-21,33 -2084-02-29,9 -1963-11-15,46 -2084-04-22,16 -1937-08-18,33 -2122-10-04,40 -2209-12-19,51 -2202-05-13,19 -1939-05-01,18 -2040-11-17,46 -2085-04-21,16 -1872-12-26,52 -2230-05-17,20 -2245-12-30,1 -2056-02-02,5 -2098-09-27,39 -1900-04-27,17 -2159-04-29,17 -2210-01-10,2 -1852-07-17,29 -2136-12-07,49 -1868-05-17,20 -1928-09-10,37 -1952-05-03,18 -1891-12-26,52 -2030-10-28,44 -2112-07-12,28 -2207-05-10,19 -1897-09-01,35 -2224-06-07,24 -1933-12-21,51 -2117-07-11,27 -2100-10-18,42 -2248-06-18,24 -1912-04-11,15 -1966-08-29,35 -1925-04-04,14 -2090-01-23,4 -2225-05-21,20 -1964-03-25,13 -1889-01-25,4 -2134-08-01,30 -2216-03-15,11 -2063-11-17,46 -2195-02-11,7 -1956-06-02,22 -2073-05-30,22 -1998-02-05,6 -2051-08-06,31 -2011-02-10,6 -1862-08-13,33 -2215-11-10,45 -2061-08-31,35 -1978-03-12,10 -2105-05-11,20 -2220-01-05,1 -2088-03-05,10 -1864-12-27,52 -1957-12-21,51 -2001-08-14,33 -2219-07-20,29 -1861-04-01,14 -1910-02-04,5 -2020-08-18,34 -2112-02-03,5 -1850-03-25,13 -1850-10-01,40 -2042-04-23,17 -2193-03-16,11 -1950-06-12,24 -2179-07-01,26 -2243-03-04,9 -1928-03-12,11 -2116-08-27,35 -2125-09-27,39 -1868-04-15,16 -2205-05-20,21 -1879-05-14,20 -2134-09-23,38 -2076-11-21,47 -1957-09-13,37 -2020-07-08,28 -1968-08-10,32 -2027-08-31,35 -1877-08-14,33 -2051-07-21,29 -1981-02-19,8 -2122-04-14,16 -2118-06-06,23 -2175-06-15,24 -2176-05-05,18 -1969-01-05,1 -2147-06-30,26 -2244-04-18,16 -2042-06-18,25 -1901-04-22,17 -2151-09-10,36 -2055-10-18,42 -2114-09-21,38 -1943-12-01,48 -2058-07-24,30 -1894-10-06,40 -1876-01-30,4 -2050-09-07,36 -2068-12-31,1 -2197-12-12,50 -2138-06-17,25 -1897-08-07,31 -1935-08-04,31 -1885-01-30,5 -2225-02-27,8 -1938-02-24,8 -1866-12-01,48 -1993-05-12,19 -2244-03-28,13 -2087-11-10,46 -2242-11-03,44 -2127-09-08,37 -1939-04-24,17 -1853-05-06,18 -1879-02-21,8 -2018-04-08,14 -2097-09-05,36 -2021-04-04,13 -2080-02-03,5 -2242-02-06,5 -2128-09-01,36 -2079-12-27,52 -2026-09-07,37 -2227-05-27,21 -2009-05-11,20 -2113-12-07,49 -2032-07-20,30 -2188-10-17,42 -1982-06-03,22 -1955-07-30,30 -2114-01-13,2 -1926-01-06,1 -1946-02-24,8 -1933-11-24,47 -1850-12-07,49 -2120-05-08,19 -2067-04-17,15 -2095-12-29,52 -2074-05-07,19 -2134-02-18,7 -2014-09-23,39 -2230-12-08,49 -2069-02-11,7 -1884-05-12,20 -1956-08-07,32 -1958-10-06,41 -2159-01-23,4 -2068-07-01,26 -2067-03-12,10 -2200-07-28,31 -2153-02-01,5 -1980-05-09,19 -2136-05-21,21 -1909-06-10,23 -1931-09-14,38 -2041-12-28,52 -2085-03-10,10 -1873-02-22,8 -2164-02-06,6 -2088-11-10,46 -1916-02-09,6 -2023-01-21,3 -1977-12-26,52 -1954-09-20,38 -2221-08-27,35 -2088-04-24,17 -1925-08-22,34 -1884-11-06,45 -2183-04-21,17 -2170-06-02,22 -2150-09-28,40 -2053-07-31,31 -1852-02-12,7 -2023-05-20,20 -2033-07-23,29 -2130-05-15,20 -1977-01-24,4 -2127-12-12,50 -2041-03-31,13 -2183-07-16,29 -2216-01-24,4 -2125-10-14,41 -2243-10-20,42 -1967-12-10,49 -2034-06-29,26 -2082-03-25,13 -2021-06-02,22 -1908-04-15,16 -2055-04-02,13 -1943-04-22,16 -1987-06-26,26 -2058-06-21,25 -2170-07-02,27 -1947-10-27,44 -2086-05-29,22 -1867-03-15,11 -2090-01-05,1 -1953-08-14,33 -1983-12-10,49 -2189-12-21,52 -2137-03-02,9 -2197-04-12,15 -1984-01-09,2 -2225-05-31,22 -2012-04-20,16 -1910-02-23,8 -2213-01-18,3 -2070-10-20,43 -1932-12-16,50 -2188-11-20,47 -1887-07-05,27 -2086-03-10,10 -2038-08-07,31 -1959-05-14,20 -2226-08-03,31 -1933-03-01,9 -1954-02-26,8 -1891-08-13,33 -2076-03-20,12 -2146-01-03,1 -1880-01-19,4 -1890-07-31,31 -1983-08-10,32 -2143-07-11,28 -1911-01-06,1 -2091-11-23,47 -1931-08-16,33 -2115-06-22,25 -2028-07-20,29 -2069-10-28,44 -2246-01-30,5 -1896-06-26,26 -1983-03-16,11 -2183-03-15,11 -1989-04-08,14 -2202-05-29,21 -1937-09-16,37 -2186-02-22,8 -1924-01-17,3 -2121-05-11,19 -2064-09-03,36 -2231-04-01,13 -2132-09-23,39 -2073-04-05,14 -2090-04-16,15 -1908-04-25,17 -1984-04-25,17 -2049-09-15,37 -2219-01-12,2 -1896-05-06,19 -2212-03-28,13 -1911-10-22,42 -2249-06-07,23 -2155-12-20,51 -2118-05-21,20 -2155-11-09,45 -2076-07-16,29 -2012-05-17,20 -2014-01-17,3 -1883-07-11,28 -2213-09-29,39 -1883-11-18,46 -1960-04-24,16 -1999-12-28,52 -2027-09-18,37 -1870-11-05,44 -1860-04-05,14 -2016-07-02,26 -1866-01-07,1 -1868-04-14,16 -2167-10-07,41 -1924-11-25,48 -1965-07-12,28 -1938-01-27,4 -2052-02-16,7 -2116-03-08,10 -2003-07-12,28 -2114-03-07,10 -1977-03-22,12 -1851-12-06,49 -1943-03-19,11 -1963-03-02,9 -2206-10-09,41 -2074-01-12,2 -1918-01-24,4 -2129-05-09,19 -1949-11-06,44 -1942-09-12,37 -2138-07-19,29 -2156-10-31,44 -2002-05-24,21 -1935-05-26,21 -2074-07-21,29 -2147-12-07,49 -2095-12-21,51 -1868-07-23,30 -2128-06-25,26 -2101-05-14,19 -2105-02-14,7 -2077-03-22,12 -2018-01-05,1 -2178-09-18,38 -2017-04-29,17 -1891-10-04,40 -2038-12-08,49 -2249-05-07,19 -2037-03-01,9 -1995-11-30,48 -1912-08-01,31 -2226-05-27,21 -1906-06-25,26 -2117-07-20,29 -2071-08-04,32 -2190-11-13,45 -2204-04-25,17 -1927-05-03,18 -1908-07-08,28 -2113-07-07,27 -2089-01-25,4 -2135-08-08,32 -1960-03-11,10 -1977-11-20,46 -2203-11-23,47 -2072-11-01,44 -2087-04-23,17 -2175-08-16,33 -2233-04-06,14 -2100-12-06,49 -1975-07-02,27 -2055-02-14,6 -2239-12-26,52 -2192-08-02,31 -2166-01-15,3 -2217-08-18,34 -2070-06-24,26 -1980-06-02,23 -1996-03-21,12 -2211-07-02,27 -2180-07-18,29 -2050-06-16,24 -1965-06-23,25 -2007-06-09,23 -2025-01-15,3 -2223-02-03,6 -1925-08-27,35 -2213-10-29,43 -2208-08-15,33 -2136-10-02,40 -2191-02-08,6 -1970-08-12,33 -1891-04-12,15 -1926-03-10,10 -1968-03-19,12 -1972-08-16,33 -2088-02-15,7 -2120-06-01,22 -1863-12-16,51 -2196-01-17,2 -2226-01-28,4 -1861-02-19,8 -2167-04-04,14 -2109-08-17,33 -2187-10-22,43 -2126-02-01,5 -1921-07-21,29 -1876-06-03,22 -2193-10-18,42 -2039-10-10,41 -2157-03-20,11 -1960-04-06,14 -2015-01-29,5 -2248-07-07,27 -2060-10-06,41 -2216-02-19,8 -2238-02-06,6 -2092-02-01,5 -2049-08-27,34 -2196-01-01,53 -2089-08-16,33 -1938-04-29,17 -2098-01-06,2 -2115-07-07,27 -2124-04-09,14 -1942-08-24,35 -1950-11-09,45 -1990-12-06,49 -1929-08-04,31 -1879-08-01,31 -2195-05-14,20 -2120-10-20,42 -2115-05-15,20 -1957-06-13,24 -2093-08-26,35 -2234-08-25,35 -1980-05-10,19 -1933-01-23,4 -1952-10-27,44 -1915-06-19,24 -1941-04-09,15 -1944-03-24,12 -1969-05-01,18 -1973-04-27,17 -2103-05-09,19 -1929-09-13,37 -1931-04-30,18 -1912-06-26,26 -2014-02-01,5 -1897-11-16,46 -1850-10-14,42 -2000-12-07,49 -2004-04-25,17 -1906-11-03,44 -1973-10-20,42 -2047-02-05,6 -2114-08-14,33 -2000-12-23,51 -1920-02-11,7 -2102-07-12,28 -2123-10-02,39 -1972-10-24,43 -2015-04-11,15 -2135-07-04,27 -1913-02-21,8 -1968-10-06,40 -2152-03-09,10 -2246-02-23,9 -1923-01-15,3 -2089-05-10,19 -2243-03-31,13 -2017-04-30,17 -2129-10-26,43 -2127-04-16,16 -1903-10-09,41 -1997-09-05,36 -1910-03-08,10 -1983-08-26,34 -1978-12-16,50 -1897-08-15,32 -2066-09-22,38 -2088-07-09,28 -1866-05-03,18 -1992-11-30,49 -2242-11-01,44 -2185-10-16,41 -2178-05-09,19 -2177-02-28,9 -2204-02-10,6 -2036-08-17,33 -2209-05-15,20 -2247-02-16,7 -2211-01-15,3 -1977-01-19,3 -2032-07-11,28 -1900-01-09,2 -2164-07-14,28 -1999-05-19,20 -1981-07-12,28 -2066-01-07,1 -2109-10-20,42 -1909-03-22,12 -2098-11-28,48 -2129-09-04,35 -2195-04-01,14 -2045-06-14,24 -2061-12-21,51 -2067-06-04,22 -2019-02-13,7 -1962-05-10,19 -2068-01-31,5 -1886-12-09,49 -2183-03-17,12 -1899-07-03,27 -2202-11-10,45 -1921-07-09,27 -2199-12-06,49 -1963-03-27,13 -2137-02-15,7 -2065-12-11,50 -2180-02-12,6 -2238-05-03,18 -1943-11-19,46 -1926-03-19,11 -1942-03-07,10 -1863-07-21,30 -2018-09-09,36 -1978-09-28,39 -1995-09-13,37 -2196-05-05,18 -2125-10-27,43 -2150-02-27,9 -2126-11-26,48 -2223-08-11,33 -1887-11-17,46 -2112-01-03,53 -2147-04-25,17 -2223-11-16,46 -2172-09-11,37 -2166-03-13,11 -1895-03-10,10 -2181-02-06,6 -2091-07-02,27 -1866-09-18,38 -2177-12-09,50 -2226-07-12,28 -2137-06-13,24 -2108-09-02,35 -2170-07-11,28 -2014-07-06,27 -2059-09-24,39 -2136-02-25,8 -2149-12-06,49 -2004-05-16,20 -1875-12-12,49 -1896-09-03,36 -1902-06-07,23 -2242-06-22,25 -2243-07-22,29 -2199-04-02,14 -2008-08-27,35 -1995-06-28,26 -2048-04-07,15 -2107-01-14,2 -1915-03-18,11 -2203-07-06,27 -2195-04-08,15 -2130-10-19,42 -2204-06-24,25 -2128-05-13,20 -1863-09-02,36 -1880-06-09,24 -2023-01-26,4 -1945-02-23,8 -1927-04-02,13 -2082-02-13,7 -2090-03-28,13 -1892-04-30,17 -2226-07-19,29 -1945-06-10,23 -1881-10-23,42 -2231-04-25,17 -2181-05-24,21 -1862-03-29,13 -1925-01-26,5 -2151-07-22,29 -1916-03-25,12 -1887-03-14,11 -1923-06-23,25 -2009-03-13,11 -1971-01-26,4 -1986-02-05,6 -2026-09-26,39 -2207-11-17,47 -2192-04-10,15 -2130-05-31,22 -2039-03-17,11 -2194-04-17,16 -2128-12-17,51 -2113-08-18,33 -1963-02-20,8 -1948-11-03,45 -1936-05-02,18 -2114-05-01,18 -2219-04-03,13 -1992-01-29,5 -2117-05-29,21 -1925-05-28,22 -1972-06-12,24 -2055-02-25,8 -1912-09-22,38 -1958-02-07,6 -2240-05-13,20 -1934-01-04,1 -2216-07-15,29 -2239-04-26,17 -2187-08-19,33 -2183-10-31,44 -2034-06-08,23 -2100-03-19,11 -1929-03-20,12 -1866-11-04,44 -1858-01-29,4 -1941-03-06,10 -1880-10-06,41 -2246-06-13,24 -1963-07-30,31 -2058-03-08,10 -1924-05-28,22 -1931-09-07,37 -2178-12-29,53 -1888-05-05,18 -1936-09-20,38 -2228-02-02,5 -1989-01-31,5 -1952-10-19,42 -1978-12-15,50 -2170-12-27,52 -1852-05-14,20 -2151-03-13,10 -2193-04-09,15 -1876-03-04,9 -2022-10-03,40 -2188-08-11,33 -1916-03-13,11 -2001-04-10,15 -1937-04-08,14 -2081-02-11,7 -1945-09-01,35 -1902-08-31,35 -1978-11-25,47 -2194-01-05,1 -2063-07-27,30 -2221-02-11,6 -1914-07-30,31 -1916-11-05,44 -2249-08-07,32 -1969-11-22,47 -1935-07-02,27 -1949-03-06,9 -2147-03-12,10 -2028-11-24,47 -2008-09-11,37 -2026-06-24,26 -2209-01-19,3 -2047-03-11,11 -2232-02-23,8 -1953-05-09,19 -2091-09-09,36 -1974-04-11,15 -1966-08-10,32 -2176-04-29,18 -2114-12-23,51 -2096-08-05,31 -1953-03-10,11 -1959-03-09,11 -2162-07-09,27 -1893-06-25,25 -2026-09-05,36 -1859-05-10,19 -2002-04-12,15 -2181-03-19,12 -2010-09-28,39 -2025-07-01,27 -1982-05-07,18 -2165-04-02,14 -2001-07-18,29 -2163-12-10,49 -2020-05-24,21 -2067-06-19,24 -2214-12-21,51 -2149-12-29,1 -1864-05-20,20 -1876-07-17,29 -1927-12-24,51 -2011-01-26,4 -2172-12-27,52 -1908-07-09,28 -1897-06-26,25 -2101-09-27,39 -1970-12-07,50 -2240-12-01,49 -1945-08-01,31 -1987-03-27,13 -2229-10-22,43 -1922-12-25,52 -1962-02-21,8 -1958-11-04,45 -2228-08-24,34 -2207-01-01,1 -2142-06-07,23 -2094-12-07,49 -2249-08-21,34 -2125-05-02,18 -1991-07-27,30 -2226-09-03,35 -1910-02-24,8 -2114-11-02,44 -2141-01-11,2 -2012-08-25,34 -2108-03-06,10 -1854-05-09,19 -2230-03-30,13 -1916-05-30,22 -1894-01-13,2 -1906-03-22,12 -2010-11-03,44 -2229-06-05,23 -2075-10-26,43 -1860-05-15,20 -1930-05-19,21 -2113-04-12,15 -2241-02-06,5 -2013-12-01,48 -2028-08-23,34 -2050-07-20,29 -2225-05-10,19 -2189-11-17,47 -1900-02-27,9 -2235-02-16,8 -2245-10-02,40 -2221-01-03,1 -2107-09-13,37 -1996-03-18,12 -2106-10-28,43 -2229-12-28,53 -2220-11-18,46 -1927-06-17,24 -1903-05-26,22 -2126-03-11,11 -2035-07-09,28 -2091-12-24,52 -2184-05-10,20 -2236-10-12,41 -2042-06-05,23 -2055-09-20,38 -2096-04-03,14 -1874-12-19,51 -1860-11-13,46 -2016-02-28,8 -2123-03-07,9 -1948-03-11,11 -1950-01-20,3 -1932-06-05,22 -2223-11-02,44 -1866-01-09,2 -2176-04-09,15 -1929-12-26,52 -2238-11-28,48 -2030-07-24,30 -1879-02-17,8 -2183-11-20,47 -2004-05-20,21 -2060-02-22,8 -2133-07-09,28 -1950-08-09,32 -2056-04-07,14 -2119-07-16,28 -2034-10-04,40 -1967-01-24,4 -2231-04-07,14 -2029-06-11,24 -1993-12-02,48 -2133-01-31,5 -2098-05-05,19 -2140-11-25,47 -2056-11-18,46 -2248-04-19,16 -1921-04-13,15 -2177-10-10,41 -1960-07-23,29 -1877-04-19,16 -2136-10-19,42 -2098-04-25,17 -2075-01-27,4 -1999-03-27,12 -2230-06-20,24 -2044-05-04,18 -2115-12-26,52 -2149-09-14,37 -2130-03-11,10 -2004-06-19,25 -1886-10-26,43 -2072-02-09,6 -1859-01-22,3 -1859-03-29,13 -2027-05-17,20 -1887-06-30,26 -1979-01-29,5 -1969-12-23,52 -2044-08-19,33 -2237-08-12,32 -2075-06-14,24 -2167-02-20,8 -1963-12-27,52 -1984-07-08,27 -1990-06-01,22 -1864-07-14,28 -2007-01-05,1 -2244-12-30,1 -2164-05-09,19 -2117-05-23,20 -1971-09-28,39 -2023-04-17,16 -2040-08-24,34 -2217-08-22,34 -2002-04-14,15 -2112-07-16,28 -2053-05-09,19 -1900-05-01,18 -2116-10-01,40 -1954-08-14,32 -1886-08-19,33 -2173-10-21,42 -1982-05-06,18 -2121-07-30,31 -2226-02-05,5 -2142-03-10,10 -2156-08-02,32 -2092-05-17,20 -1958-05-06,19 -1950-07-11,28 -2234-07-08,28 -2175-09-22,38 -1943-07-25,29 -2235-02-15,7 -2211-05-17,20 -2157-09-01,35 -2131-05-22,21 -2000-06-30,26 -1861-07-21,29 -2188-04-22,17 -2028-03-10,10 -1941-04-08,15 -2087-04-14,16 -2209-04-07,14 -2077-02-26,8 -1885-10-17,42 -1871-07-19,29 -2138-06-12,24 -1876-04-25,17 -2157-09-13,37 -2203-03-29,13 -2003-04-02,14 -2132-07-08,28 -2054-08-15,33 -2151-02-16,7 -2104-07-27,30 -2133-09-23,39 -2183-10-30,44 -2021-02-22,8 -1881-02-26,8 -1964-12-10,50 -2026-03-22,12 -2043-04-29,18 -1971-11-08,45 -2009-03-18,12 -2116-11-06,45 -2110-08-26,35 -2147-01-30,5 -2213-11-16,46 -2187-08-13,33 -2186-08-06,31 -2180-02-05,5 -2182-08-26,35 -1885-05-21,21 -2196-01-22,3 -2115-05-11,19 -2112-04-23,16 -2170-01-10,2 -2200-09-16,38 -1955-10-13,41 -2055-02-23,8 -1969-08-02,31 -1899-02-08,6 -2125-05-18,20 -2192-01-27,4 -1976-01-10,2 -2082-07-07,28 -2164-10-30,44 -1979-07-21,29 -2241-09-14,37 -1988-05-04,18 -2026-05-31,22 -1905-04-27,17 -2111-04-23,17 -2223-05-03,18 -1947-11-26,48 -2091-08-17,33 -2226-05-25,21 -2044-03-10,10 -2006-02-12,6 -2157-08-23,34 -2064-03-15,11 -1988-08-28,34 -2081-09-06,36 -1897-05-18,20 -2021-07-14,28 -2206-09-14,37 -1866-02-12,7 -1988-03-21,12 -1872-03-21,12 -1912-08-14,33 -1925-12-29,53 -2160-12-24,52 -1981-05-20,21 -2208-06-19,24 -2031-06-21,25 -2062-03-18,11 -2085-05-27,21 -2046-08-30,35 -2034-02-11,6 -2095-07-23,29 -2193-04-23,17 -2225-04-11,15 -1995-05-21,20 -2201-04-29,18 -1890-12-12,50 -2227-10-24,43 -2055-08-08,31 -2092-03-21,12 -2164-12-20,51 -1877-10-28,43 -2023-08-18,33 -1950-05-25,21 -2225-01-30,4 -1979-08-24,34 -2163-10-19,42 -2182-08-03,31 -1858-08-17,33 -1975-12-27,52 -1999-06-27,25 -2168-07-18,29 -2241-10-10,40 -2071-01-20,4 -2182-11-19,47 -1879-06-17,25 -1931-02-05,6 -1936-03-29,13 -2015-12-27,52 -2053-05-04,18 -2222-03-24,12 -1945-10-07,40 -2077-07-17,28 -2014-03-10,11 -1893-05-01,18 -2099-03-17,12 -2124-12-04,49 -2224-09-07,37 -1867-12-24,52 -1927-12-06,49 -2051-03-19,11 -1997-12-26,52 -2144-08-10,33 -2173-07-09,27 -2043-06-13,24 -2082-03-29,13 -1878-06-19,25 -2206-08-19,34 -2126-04-29,18 -2010-08-11,32 -2242-11-05,44 -2008-03-31,14 -1887-06-21,25 -2243-05-08,19 -2025-09-28,39 -2079-02-12,6 -2185-07-20,29 -2238-09-23,38 -1871-08-30,35 -2196-02-22,8 -2090-09-28,39 -1870-06-11,23 -2159-04-19,16 -2116-05-27,22 -2191-03-18,11 -2238-12-07,49 -2052-09-21,38 -1864-05-14,19 -2087-03-04,10 -1992-12-29,53 -2032-07-29,31 -2246-07-14,29 -1996-08-11,32 -2201-11-16,47 -1907-09-01,35 -1941-10-25,43 -2026-02-03,6 -2056-01-20,3 -1949-08-11,32 -1896-07-28,31 -1905-04-21,16 -1863-06-05,23 -2155-08-19,34 -2136-11-10,45 -1872-04-27,17 -1867-08-19,34 -2148-02-22,8 -1948-09-01,36 -2204-08-26,34 -2235-09-23,39 -2013-11-02,44 -1930-12-07,49 -2124-09-12,37 -2065-06-02,23 -2008-06-17,25 -2078-06-07,23 -2122-11-07,45 -2142-02-10,6 -1899-01-22,3 -2171-04-06,14 -2054-08-25,35 -1899-04-25,17 -2077-01-31,4 -1895-12-15,50 -1985-06-30,26 -2033-11-09,45 -2017-06-08,23 -2086-08-19,34 -2213-04-07,14 -2191-06-23,25 -1893-12-15,50 -1927-06-06,23 -1975-05-16,20 -2233-08-24,34 -2149-07-15,29 -1908-09-30,40 -2094-11-16,46 -2029-05-07,19 -2207-08-13,33 -2246-07-17,29 -2203-11-16,46 -2029-05-20,20 -2056-03-22,12 -1998-11-16,47 -2038-06-28,26 -1996-10-10,41 -2081-12-26,52 -1864-03-26,12 -1939-07-16,28 -2091-09-15,37 -2225-03-04,9 -1960-02-18,7 -2227-12-26,52 -2012-09-07,36 -1900-11-09,45 -1869-04-01,13 -2021-06-29,26 -1939-11-02,44 -1999-09-01,35 -1997-01-31,5 -2215-03-23,12 -2098-03-31,14 -2104-11-26,48 -1936-12-10,50 -1852-10-03,40 -1963-05-01,18 -2002-12-05,49 -2095-02-12,6 -2046-01-20,3 -2007-12-06,49 -2156-02-14,7 -2073-03-09,10 -2013-08-15,33 -2054-04-28,18 -1984-09-16,37 -2087-12-24,52 -2007-02-26,9 -2156-05-18,21 -1983-08-17,33 -1862-02-07,6 -2213-09-05,35 -1865-10-10,41 -2165-10-20,42 -1885-01-15,3 -2244-08-02,31 -2110-09-22,39 -2133-06-15,25 -1973-02-28,9 -2186-04-29,17 -2062-06-28,26 -2224-12-02,49 -2143-04-21,16 -2049-03-08,10 -1865-04-18,16 -2238-08-29,35 -1969-06-30,27 -2242-12-18,50 -2118-04-24,16 -2175-04-05,14 -2147-04-01,13 -2034-06-12,24 -2021-09-20,38 -2145-06-09,23 -2206-04-26,17 -2208-04-07,14 -2045-03-18,11 -2199-10-17,42 -2231-01-30,4 -2091-09-11,37 -1868-02-25,9 -1966-01-19,3 -1955-07-16,28 -2233-09-30,40 -2120-08-09,32 -2048-09-11,37 -2022-08-15,33 -1979-10-08,41 -1916-02-04,5 -1961-06-18,24 -2092-04-25,17 -2021-02-26,8 -1871-03-15,11 -1893-10-04,40 -2057-06-12,24 -2094-10-23,42 -2017-04-15,15 -1945-09-29,39 -2142-06-13,24 -1922-06-13,24 -1942-01-14,3 -1891-11-21,47 -1879-06-06,23 -1904-01-25,4 -2065-08-08,32 -1930-05-11,19 -1870-12-20,51 -2085-01-03,1 -2229-11-15,46 -1880-11-12,46 -2093-11-30,49 -1937-02-12,6 -2029-10-11,41 -1893-12-17,50 -2096-06-13,24 -2141-09-05,36 -1885-06-25,26 -2154-04-30,18 -2203-11-20,46 -1899-03-01,9 -1909-04-24,16 -1928-01-24,4 -2207-12-20,51 -2097-02-11,7 -2220-05-27,21 -2000-03-31,13 -1856-04-03,14 -2233-11-03,44 -2239-06-28,26 -1903-06-02,23 -2175-04-12,15 -2169-10-15,41 -1978-09-27,39 -2204-09-28,39 -2023-09-03,35 -1886-05-11,19 -2059-05-26,22 -2230-04-21,16 -1898-01-09,1 -1856-04-10,15 -1972-09-12,37 -2065-08-04,32 -1994-01-26,4 -2114-01-04,1 -1909-07-30,30 -2247-05-06,18 -2174-01-12,2 -2118-02-12,6 -1853-07-28,30 -2137-04-11,15 -1884-06-04,23 -2126-08-26,35 -2010-03-20,11 -2101-03-28,13 -2106-06-08,23 -1885-10-11,41 -2226-12-30,52 -2138-07-07,28 -2067-08-26,34 -2142-10-09,41 -1867-05-11,19 -2110-12-14,50 -1870-06-07,23 -1872-03-03,9 -2131-07-27,30 -2131-10-05,40 -1880-02-09,7 -1986-06-09,24 -2219-10-12,41 -2033-10-07,40 -2063-03-25,12 -2054-05-07,19 -2061-11-07,45 -1908-08-26,35 -1884-03-15,11 -2073-02-22,8 -2189-01-21,4 -1913-10-30,44 -1861-01-04,1 -1910-01-26,4 -2187-06-25,26 -2100-04-30,17 -2063-03-13,11 -2237-01-25,4 -1913-08-04,32 -2158-05-08,19 -1934-12-10,50 -2131-02-24,8 -2125-06-28,26 -2168-03-01,9 -2015-09-09,37 -2227-03-25,12 -2091-03-25,12 -2064-04-01,14 -1906-12-29,52 -1889-03-15,11 -2041-09-13,37 -2052-06-11,24 -1983-03-28,13 -2153-05-31,22 -1974-11-09,45 -1897-03-24,12 -1931-03-14,11 -1956-09-12,37 -2131-09-01,35 -2169-07-04,27 -1980-02-28,9 -2147-01-03,1 -1898-02-03,5 -2088-07-07,28 -1988-10-10,41 -1948-10-07,41 -2173-11-07,44 -2001-02-04,5 -2157-10-27,43 -1962-12-12,50 -1976-01-08,2 -1863-09-09,37 -2241-05-06,18 -2150-12-05,49 -1857-11-24,48 -1920-09-22,39 -1939-02-06,6 -2079-03-02,9 -2166-09-19,38 -2067-05-02,18 -2030-03-19,12 -2195-02-22,8 -2123-04-17,15 -1881-09-11,36 -1888-03-06,10 -1969-11-17,47 -2094-03-31,13 -2237-06-28,26 -2227-05-23,21 -2178-01-06,2 -2030-01-23,4 -1939-11-12,45 -1993-12-08,49 -2136-12-17,51 -1909-01-03,53 -1915-04-26,17 -2017-02-06,6 -2049-07-11,27 -2095-04-03,13 -2171-01-24,4 -2099-10-19,43 -2162-07-03,26 -2003-07-26,30 -1873-11-12,46 -1950-10-02,40 -2244-06-23,25 -2099-07-20,30 -2063-07-30,31 -2046-05-23,21 -2035-08-27,35 -2167-08-11,33 -1921-05-25,21 -2067-11-26,47 -1960-11-01,44 -2229-01-22,4 -2240-07-16,29 -1868-03-21,12 -1950-04-29,17 -2210-07-03,27 -2208-11-10,45 -2133-03-26,13 -1988-06-09,23 -2054-11-27,48 -1916-02-13,6 -2050-09-01,35 -1910-06-12,23 -2035-02-01,5 -1940-12-15,50 -1850-08-15,33 -1923-11-25,47 -2102-06-01,22 -2219-01-05,1 -2098-04-10,15 -2012-07-05,27 -2174-01-23,3 -2005-02-13,6 -2065-04-22,17 -2087-03-31,14 -2141-10-24,43 -2193-09-15,37 -2180-04-29,17 -2037-02-07,6 -1877-07-12,28 -2198-10-14,41 -2144-02-19,8 -2041-06-16,24 -1935-10-23,43 -2044-04-25,17 -2165-07-27,30 -2162-11-24,47 -1927-05-31,22 -2181-10-29,44 -1884-03-14,11 -2009-01-08,2 -1863-03-17,12 -2050-09-30,39 -2205-01-06,1 diff --git a/inst/tests/issue_1087_utf8_bom.csv b/inst/tests/issue_1087_utf8_bom.csv deleted file mode 100644 index 9c60e4f480..0000000000 --- a/inst/tests/issue_1087_utf8_bom.csv +++ /dev/null @@ -1,2 +0,0 @@ -a,b,c -1,2,3 diff --git a/inst/tests/issue_1095_fread.txt b/inst/tests/issue_1095_fread.txt deleted file mode 100644 index 7c02cc5bed..0000000000 --- a/inst/tests/issue_1095_fread.txt +++ /dev/null @@ -1,100 +0,0 @@ -2013130413CN02422 ,MONMOUTH ,ATLANTIC HIGHLANDS BORO ,03/22/2013,F ,1309,01,COLTS NECK PD , , 0, 0, 0, 0,P,B,N,N,06, 2,4 PARTRIDGE WAY (DRIVEWAY) , , , , , ,09,01,02,01,01,01, , , , , , , , , , 0, , , ,N,NONE ,84049 -2013130413CN02826 ,MONMOUTH ,ATLANTIC HIGHLANDS BORO ,04/02/2013,TU,1658,01,COLTS NECK PD , , 0, 0, 0, 0,P,B,N,N,11, 1,375 SR 34 (PARKING LOT) , , , , , ,09,01,02,01,01,01, , , , , , , , , , 0, , , ,N,NONE ,84057 -2013130413CN03163 ,MONMOUTH ,ATLANTIC HIGHLANDS BORO ,04/11/2013,TH,0853,01,COLTS NECK PD , , 0, 0, 0, 0,P,B,N,N,08, 2,410 SR 34 (PARKING LOT) , , , , , ,09,01,02,02,01,01,05,01, , , , , , , , 0, , , ,N,NONE ,84057 -2013130413CN04103 ,MONMOUTH ,ATLANTIC HIGHLANDS BORO ,05/09/2013,TH,2007,01,COLTS NECK PD , , 0, 0, 0, 0,P,B,Y,N,08, 2,420 SR 34 (PARKING LOT) , , , , , ,09,01,02,01,01,01,05,01, , , , , , , , 0, , , ,N,NONE ,84054 -2013130413CN05020 ,MONMOUTH ,ATLANTIC HIGHLANDS BORO ,06/08/2013,SA,0911,01,COLTS NECK PD , , 0, 0, 0, 0,P,B,N,N,08, 2,410 ST RT 34 (PARKING LOT) , , , , , ,09,01,02,01,01,05, ,01, , , , , , , , 0, , , ,N,NONE ,84055 -2013130413CN05207 ,MONMOUTH ,ATLANTIC HIGHLANDS BORO ,06/15/2013,SA,0148,01,COLTS NECK PD , , 0, 0, 0, 0,P,B,Y,N,06, 2,6 RT 537 WEST (PARKING LOT) , , , , , ,09,01,02,01,06,01, , , , , , , , , , 0, , , ,N,NONE ,84049 -2013130413CN05391 ,MONMOUTH ,ATLANTIC HIGHLANDS BORO ,06/21/2013,F ,1437,01,COLTS NECK PD , , 0, 0, 0, 0,P,B,N,N,03, 2,273 RT 34 (PARKING LOT) , , , , , ,09,01,02,01,01,01,05,01, , , , , , , , 0, , , ,N,NONE ,84027 -2013130413CN05395 ,MONMOUTH ,ATLANTIC HIGHLANDS BORO ,06/21/2013,F ,1541,01,COLTS NECK PD , , 0, 0, 0, 0,P,B,N,N,06, 2,1 TRUMP NATIONAL BLVD , , , , , ,09,01,05,01,01,01,05,01, , , , , , , , 0, , , ,N,NONE ,84046 -2013130413CN05534 ,MONMOUTH ,ATLANTIC HIGHLANDS BORO ,06/26/2013,W ,1727,01,COLTS NECK PD , , 0, 0, 0, 0,P,B,N,N,06, 2,9 PROFESSIONAL CIR (PARKING LOT) , , , , , ,09,01,02,01,01,01, , , , , , , , , ,25, , , ,N,NONE ,84050 -2013130413CN05748 ,MONMOUTH ,ATLANTIC HIGHLANDS BORO ,07/03/2013,W ,2035,01,COLTS NECK PD , , 0, 0, 0, 0,P,B,N,N,11, 1,WHITE OAK DRIVE , , , , , ,07,04,02,02,03,02, , , 350,FE,W,ACORN PLACE , , , ,25, , , ,N,200 FEET OF GROSS ON THE PROPERTY OF 7 WHITE DRIVE. DANIEL CLIFFORD HOMEOWNER. ,84046 -2013130413CN06672 ,MONMOUTH ,ATLANTIC HIGHLANDS BORO ,08/03/2013,SA,2330,01,COLTS NECK PD , , 0, 0, 0, 0,P,B,N,N,08, 2,420 SR 34 (PARKING LOT) , , , , , ,09,01,02,01,06,01,05, , , , , , , , , 0, , , ,N,NONE ,84050 -2013130413CN07165 ,MONMOUTH ,ATLANTIC HIGHLANDS BORO ,08/21/2013,W ,0344,01,COLTS NECK PD , , 0, 0, 0, 0,P,B,N,N,11, 1,BUCKS MILL RD , , , , , ,07,01,02,01,05,01,05, , 100,FE,S,CR 537 , , , ,25,50, , ,N,JCP&L POLE JC971CN ,84057 -2013130413CN07206 ,MONMOUTH ,ATLANTIC HIGHLANDS BORO ,08/22/2013,TH,1204,01,COLTS NECK PD , , 0, 1, 0, 0,I,B,N,N,01, 2,FIVE POINT RD , , , , , ,07,01,02,01,01,01,05, , 528,FE,S,CR 537 , , , ,35,50, , ,N, ,84050 -2013130413CN07311 ,MONMOUTH ,ATLANTIC HIGHLANDS BORO ,08/25/2013,S ,1737,01,COLTS NECK PD , , 0, 0, 0, 0,P,B,N,N,08, 2,320 SR 34 (PARKING LOT) , , , , , ,09,01,02,01,01,01, , , , , , , , , , 0, , , ,N,NONE ,84036 -2013130413CN08261 ,MONMOUTH ,ATLANTIC HIGHLANDS BORO ,09/25/2013,W ,0954,01,COLTS NECK PD , , 0, 0, 0, 0,P,B,N,N,08, 2,410 SR 34 (PARKING LOT) , , , , , ,09,01,02,01,01,01,05,01, , , , , , , , 0, , , ,N,NONE ,84054 -2013130413CN08334 ,MONMOUTH ,ATLANTIC HIGHLANDS BORO ,09/27/2013,F ,1057,01,COLTS NECK PD , , 0, 0, 0, 0,P,B,Y,N,08, 2,340 RT 34 (PARKING LOT) , , , , , ,09,01,02,01,01,01,05,01, , , , , , , , 0, , , ,N,NONE ,84045 -2013130413CN09374 ,MONMOUTH ,ATLANTIC HIGHLANDS BORO ,11/01/2013,F ,2140,01,COLTS NECK PD , , 0, 0, 0, 0,P,B,N,N,08, 2,59 FIVE POINT RD , , , , , ,09,01,02,02,06,01,05, , , , , , , , , 0, , , ,N,NONE ,84057 -2013130413CN09445 ,MONMOUTH ,ATLANTIC HIGHLANDS BORO ,11/03/2013,S ,1301,01,COLTS NECK PD , , 0, 0, 0, 0,P,B,N,N,11, 1,15 BRANDYWINE LN , , , , , ,09,01,02,01,01,01, , , , , , , , , , 0, , , ,N,NONE ,84044 -2013130413CN09783 ,MONMOUTH ,ATLANTIC HIGHLANDS BORO ,11/13/2013,W ,1331,01,COLTS NECK PD , , 0, 0, 0, 0,P,B,N,N,08, 2,IRETON KEY , , , , , ,09,01,02,01,01,01,05,01, 150,FE,E,COLTS NECK BLVD , , , ,25,25, , ,N,NONE ,84045 -2013130413CN10896 ,MONMOUTH ,ATLANTIC HIGHLANDS BORO ,12/23/2013,M ,2140,01,COLTS NECK PD , , 0, 0, 0, 0,P,B,N,N,06, 2,420 SR 34 (PARKING LOT) , , , , , ,09,01,02,02,07,02,05, , , , , , , , , 0, , , ,N,NONE ,84057 -2013130513-000795 ,MONMOUTH ,AVON-BY-THE-SEA BORO ,01/26/2013,SA,1502,01,ATLANTIC HIGHLANDS PD , , 0, 0, 0, 0,P,B,N,N,03, 2,BAYSHORE PLAZA PARKING LOT ,E, , , , ,09,01,02,01,01,01,05,01, , , , , , , ,25, , , ,N,? ,137 -2013130513-001195 ,MONMOUTH ,AVON-BY-THE-SEA BORO ,02/06/2013,W ,1451,01,ATLANTIC HIGHLANDS PD , , 0, 1, 0, 1,I,B,N,N,08, 2,11 STATE HIGHWAY RT 36 PARKING LOT , , , , , ,09,01,02,01,01,01,05,01, , ,W,FIRST AVENUE , , , ,45,25, , ,N, ,136 -2013130513-001416 ,MONMOUTH ,AVON-BY-THE-SEA BORO ,02/13/2013,W ,0944,01,ATLANTIC HIGHLANDS PD , , 0, 0, 0, 0,P,B,N,N,11, 1,9 STATE HIGHWAY 36 PARKING LOT ,W, , , , ,09,01,02,01,01,01,05,01, 500,FE,W,FIRST AVENUE , , , ,10,25, , ,N, ,134 -2013130513-003219 ,MONMOUTH ,AVON-BY-THE-SEA BORO ,04/07/2013,S ,1555,01,ATLANTIC HIGHLANDS PD , , 0, 0, 0, 0,P,B,N,N,06, 2,BAY SHORE PLAZA , , , , , ,09,01,02,01,01,01,05,01, , ,S,STATE HIGHWAY 36 , , , ,25,45, , ,N, ,137 -2013130513-003432 ,MONMOUTH ,AVON-BY-THE-SEA BORO ,04/13/2013,SA,1236,01,ATLANTIC HIGHLANDS PD , , 0, 0, 0, 0,P,B,N,N,08, 2,9 STATE HIGHWAY 36 , , , , , ,09,01,02,01,01,01,05,01, , ,W,FIRST AVENUE , , , ,25,25, , ,N, ,#136 -2013130513-004366 ,MONMOUTH ,AVON-BY-THE-SEA BORO ,05/10/2013,F ,1727,01,ATLANTIC HIGHLANDS PD , , 0, 0, 0, 0,P,B,N,N,08, 2,9 STATE HIGHWAY 36 , , , , , ,09,01,02,01,01,01,05,01, , ,W,FIRST AVENUE , , , ,25,25, , ,N, ,#136 -2013130513-004558 ,MONMOUTH ,AVON-BY-THE-SEA BORO ,05/16/2013,TH,0757,01,ATLANTIC HIGHLANDS PD , , 0, 0, 0, 0,P,B,N,N,08, 2,96 EAST AVENUE , , , , , ,09,01,02,01,01,01,05,01, , ,E,MANYMIND AVENUE , , , ,25,25, , ,N, ,136 -2013130513-005034 ,MONMOUTH ,AVON-BY-THE-SEA BORO ,05/28/2013,TU,1703,01,ATLANTIC HIGHLANDS PD , , 0, 0, 0, 0,P,B,N,N,08, 2,999 STATE HIGHWAY 36 PARKING LOT ,N, , , , ,09,01,02,02,01,02,05,01, 50,FE,S,WEST GARFIEND AVENUE , , , ,10,25, , ,N, ,134 -2013130513-005212 ,MONMOUTH ,AVON-BY-THE-SEA BORO ,06/02/2013,S ,1607,01,ATLANTIC HIGHLANDS PD , , 0, 0, 0, 0,P,B,N,N,08, 2,BAYSHORE PLAZA 9 STATE HIGHWAY 36 ,N, , , , ,09,01,02,01,01,01,05,01, , ,S,STATE HIGHWAY ROUTE 36 , , , ,25,45, , ,N, ,130 -2013130513-005725 ,MONMOUTH ,AVON-BY-THE-SEA BORO ,06/17/2013,M ,0929,01,ATLANTIC HIGHLANDS PD , , 0, 0, 0, 0,P,B,N,N,08, 2,PARKING LOT OF 153 GRAND AVENUE , , , , , ,09,01,02,01,01,01,05,01, 50,FE,W,GRAND AVENUE , , , ,25,25, , ,N, ,128 -2013130513-005873 ,MONMOUTH ,AVON-BY-THE-SEA BORO ,06/21/2013,F ,1205,01,ATLANTIC HIGHLANDS PD , , 0, 0, 0, 0,P,B,N,N,08, 2,BAYSHORE PLAZA PARKING LOT , , , , , ,09,01,02,01,01,01,05,01, 150,FE,S,ROUTE 36 , , , ,25,45, , ,N, ,128 -2013130513-007238 ,MONMOUTH ,AVON-BY-THE-SEA BORO ,07/30/2013,TU,1528,01,ATLANTIC HIGHLANDS PD , , 0, 0, 0, 0,P,B,N,N,08, 2,9 STATE HIGHWAY 36 PARKING LOT , , , , , ,09,01,02,01,01,01,05,01, , ,W,FIRST AVENUE , , , ,15,25, , ,N, ,#136 -2013130513-007722 ,MONMOUTH ,AVON-BY-THE-SEA BORO ,08/14/2013,W ,0904,01,ATLANTIC HIGHLANDS PD ,01 , 0, 0, 0, 0,P,B,N,N,08, 3,96 EAST AVENUE ,S, , , , ,09,01,02,01,01,01,05,01, , , , , , , , 0, , , ,N, ,133 -2013130513-05217 ,MONMOUTH ,AVON-BY-THE-SEA BORO ,06/02/2013,S ,1817,01,ATLANTIC HIGHLANDS PD , , 0, 0, 0, 0,P,B,N,N,06, 2,9 STATE HIGHWAY 36 PARKING LOT , , , , , ,09,01,02,01,01,01,05,01, , ,W,FIRST AVENUE , , , ,25,25, , ,N, ,137 -2013130513002144 ,MONMOUTH ,AVON-BY-THE-SEA BORO ,01/13/2013,S ,1902,01,EDISON TWP PD , , 0, 0, 0, 0,P,B,N,N,06, 2,450 RARTTAN CENTER ,S, , , , ,09,01,02,01,06,01,05,01, , , , , , , ,25, , , ,N, ,397 -2013130513AV00256 ,MONMOUTH ,AVON-BY-THE-SEA BORO ,01/26/2013,SA,1500,01,AVON-BY-THE-SEA PD , , 0, 0, 0, 0,P,I,N,N,11, 1,NJ 71 , , 71, ,00000071__ , 6.23,02,01,02,01,01,01,02,01, ,AT, ,LINCOLN AVE , , , ,30, , , ,N,NONE ,86109 -2013130513AV00866 ,MONMOUTH ,AVON-BY-THE-SEA BORO ,03/03/2013,S ,1732,01,AVON-BY-THE-SEA PD ,AVON BY THE SE?, 0, 0, 0, 0,P,B,N,N,06, 2,MONMOUTH COUNTY 18 III ,N, 18,3,130000183_ , 3.92,05,01,02,01,03,01,02,01, 15,FE,N,WOODLAND AVE , , , ,25,25, , ,N,NONE ,86110 -2013130513AV00888 ,MONMOUTH ,AVON-BY-THE-SEA BORO ,03/22/2013,F ,1441,01,AVON-BY-THE-SEA PD , , 0, 0, 0, 0,P,B,N,N,01, 2,NJ 71 ,N, 71, ,00000071__ , 6.14,02,01,02,01,01,01,02,01, 50,FE,S,WASHINGTON AVE , , , ,30,25, , ,N,NONE ,86110 -2013130513AV00889 ,MONMOUTH ,AVON-BY-THE-SEA BORO ,03/23/2013,SA,1429,01,AVON-BY-THE-SEA PD , , 0, 1, 0, 0,I,B,N,N,01, 2,NJ 71 ,S, 71, ,00000071__ , ,02,02,02,01,01,01,05,01, ,FE,N,CR 17 / SYLVANIA AVE , , , ,30,25, , ,N, ,86102 -2013130513AV01190 ,MONMOUTH ,AVON-BY-THE-SEA BORO ,04/20/2013,SA,1345,01,AVON-BY-THE-SEA PD , , 0, 0, 0, 0,P,B,N,N,06, 2,STANTON PL , , , , , ,07,02,02,01,01,01,05,01, 2,FE,W,BRIDGE AVE , , , ,25,25, , ,N,NONE ,86107 -2013130513AV01578 ,MONMOUTH ,AVON-BY-THE-SEA BORO ,05/23/2013,TH,1855,01,AVON-BY-THE-SEA PD , , 0, 1, 0, 0,I,B,N,N,03, 2,SECOND LINCOLN , , , , , ,07,01,02,01,01,01,05,01, , , , , , , ,25, , , ,N,NONE ,88109 -2013130513AV01760 ,MONMOUTH ,AVON-BY-THE-SEA BORO ,06/05/2013,W ,1708,01,AVON-BY-THE-SEA PD , , 0, 0, 0, 0,P,B,N,N,08, 2,MARINE PLACE , , , , , ,07,01,02,01,01,01,05,01, , ,S,MONMOUTH COUNTY 17 , , , ,10,25, , ,N,NONE ,86122 -2013130513AV03315 ,MONMOUTH ,AVON-BY-THE-SEA BORO ,09/06/2013,F ,1536,01,AVON-BY-THE-SEA PD , , 0, 0, 0, 0,P,I,N,N,11, 1,NJ 71 , , 71, ,00000071__ , 6.23,02,01,02,01,01,01,01,01, ,AT, ,LINCOLN AVE , , , ,30,25, , ,N,NONE ,86118 -2013130513AV03328 ,MONMOUTH ,AVON-BY-THE-SEA BORO ,09/07/2013,SA,1427,01,AVON-BY-THE-SEA PD , , 0, 0, 0, 0,P,I,N,N,11, 1,NJ 71 , , 71, ,00000071__ , 6.23,02,01,02,01,01,01,02,01, ,AT, ,LINCOLN AVE , , , ,30, , , ,N,NONE ,86109 -2013130513AV03500 ,MONMOUTH ,AVON-BY-THE-SEA BORO ,09/22/2013,S ,1244,01,AVON-BY-THE-SEA PD , , 0, 0, 0, 0,P,B,N,N,06, 2,SECOND AVE , , , , , ,07,01,02,01,01,01,05,01, , , , , , , ,25, , , ,N,NONE ,86109 -2013130513AV03501 ,MONMOUTH ,AVON-BY-THE-SEA BORO ,09/22/2013,S ,1821,01,AVON-BY-THE-SEA PD , , 0, 0, 0, 0,P,B,N,N,08, 2,NJ 71 , , 71, ,00000071__ , ,02,01,02,01,02,01,02,01, , , , , , , ,25, , , ,N,NONE ,86109 -2013130513AV03893 ,MONMOUTH ,AVON-BY-THE-SEA BORO ,11/01/2013,F ,1518,01,AVON-BY-THE-SEA PD , , 0, 0, 0, 0,P,I,N,N,06, 2,THIRD AVE ,S, , , , ,07,01,02,00,00,00,04,01, ,AT, ,WOODLAND AVENUE , , , ,25,25, , ,N,NONE ,86110 -2013130513MU01012 ,MONMOUTH ,AVON-BY-THE-SEA BORO ,02/06/2013,W ,1122,99,MONMOUTH UNIVERSITY PD , , 0, 0, 0, 0,P,B,N,N,01, 2,SCHOLALS WAY , , , , , ,09,04,02,01,01,01,05,01, , , , , , , ,15, , , ,N, ,2458 -2013130513MU01525 ,MONMOUTH ,AVON-BY-THE-SEA BORO ,02/21/2013,TH,2150,99,MONMOUTH UNIVERSITY PD , , 0, 0, 0, 0,P,B,N,N,06, 2,LOT 20 , , , , , ,09,01,02,01,06,01,05,01, , , , , , , , 0, , , ,Y,NONE ,5778 -2013130513MV00844 ,MONMOUTH ,AVON-BY-THE-SEA BORO ,01/31/2013,TH,1825,99,MONMOUTH UNIVERSITY PD , , 0, 0, 0, 0,P,B,N,N,08, 2,MV LOT 13 ,N, , , , ,09,01,02,01,06,01,05,01, 200,FE,S,HAWK ROAD , , , ,15, , , ,N,NONE ,6933 -20131305MU1301104 ,MONMOUTH ,AVON-BY-THE-SEA BORO ,02/09/2013,SA,0212,99,MONMOUTH UNIVERSITY PD , , 0, 0, 0, 0,P,B,N,N,08, 2,PARKING LOT #3 , , , , , ,09,02,02,03,06,07,05,01, , , , , , , ,15, , , ,N,NONE ,4803 -2013130613-10004 ,MONMOUTH ,BELMAR BORO ,08/31/2013,SA,1159,01,BELMAR PD , , 0, 0, 0, 0,P,B,N,N,08, 2,NORTH BLVD , , , , , ,07,05,02,01,01,01,05,01, 300,FE,W,MONMOUTH COUNTY 18 , , , ,25,25, , ,N, ,614 -2013130613-10013 ,MONMOUTH ,BELMAR BORO ,08/31/2013,SA,1347,01,BELMAR PD , , 0, 0, 0, 0,P,I,N,N,01, 2,MONMOUTH COUNTY 18 III ,N, 18,3,130000183_ , 3.36,05,01,02,01,01,01,04,01, ,AT, ,2ND AVE / RIVER AVE , , , ,35,25, , ,N, ,152 -2013130613-10257 ,MONMOUTH ,BELMAR BORO ,09/04/2013,W ,1735,01,BELMAR PD , , 0, 1, 0, 0,I,B,N,N,14, 1,MONMOUTH COUNTY 18 III , , 18,3,130000183_ , 2.51,05,01,02,01,01,01,04,01, 50,FE,N,15TH AVE , , , ,25,25, , ,N, ,152 -2013130613-10259 ,MONMOUTH ,BELMAR BORO ,09/04/2013,W ,2117,01,BELMAR PD , , 0, 0, 0, 0,P,B,N,N,01, 2,NJ 71 , , 71, ,00000071__ , 5.54,02,01,02,01,07,01,05,01, 150,FE,W,CR 30 / 8TH AVE / MAIN ST , , , ,25, , , ,N,NONE ,920 -2013130613-1026 ,MONMOUTH ,BELMAR BORO ,02/15/2013,F ,2233,01,BELMAR PD , , 0, 0, 0, 0,P,B,N,N,06, 2,18TH AVE , , , ,13471063__ , .50,07,01,02,01,06,01,04, , 10,FE,E,A STREET , , , ,25,25, , ,N, ,908 -2013130613-10316 ,MONMOUTH ,BELMAR BORO ,09/05/2013,TH,1314,01,BELMAR PD , , 0, 1, 0, 0,I,B,N,N,11, 1,NJ 35 , , 35, ,00000035__ , ,02,01,02,01,01,01,04,01, 75,FE,S,MACLEARIE PARK EXIT DRIVEWAY , , , ,35, , , ,N, ,137 -2013130613-10350 ,MONMOUTH ,BELMAR BORO ,09/07/2013,SA,1035,01,BELMAR PD , , 0, 0, 0, 0,P,I,N,N,06, 2,10TH AVE , , , ,13061064__ , .11,07,01,02,01,01,01,02,05, ,AT, ,BELMAR PLAZA , , , ,25, , , ,N, ,129 -2013130613-10353 ,MONMOUTH ,BELMAR BORO ,09/07/2013,SA,1214,01,BELMAR PD , , 0, 0, 0, 0,P,B,N,N,01, 2,NJ 35 ,N, 35, ,00000035__ , 21.24,02,01,02,01,01,01,04,01, 50,FE,S,10TH AVE , , , ,35,25, , ,N, ,152 -2013130613-10358 ,MONMOUTH ,BELMAR BORO ,09/07/2013,SA,1445,01,BELMAR PD , , 0, 1, 0, 0,I,B,N,N,01, 2,NJ 35 ,N, 35, ,00000035__ , 21.25,02,01,02,01,01,01,02,01, 15,FE,S,10TH AVE , , , ,35,25, , ,N,NONE ,904 -2013130613-10522 ,MONMOUTH ,BELMAR BORO ,09/11/2013,W ,1623,01,BELMAR PD , , 0, 0, 0, 0,P,I,N,N,07, 2,NJ 35 , , 35, ,00000035__ , 21.18,02,01,02,01,01,01,03,01, ,AT, ,11TH AVE , , , ,35,25, , ,N,NONE ,128 -2013130613-10528 ,MONMOUTH ,BELMAR BORO ,09/11/2013,W ,1823,01,BELMAR PD , , 0, 1, 0, 0,I,B,N,N,01, 2,MONMOUTH COUNTY 18 III , , 18,3,130000183_ , 2.84,05,01,02,01,01,01,05,01, 100,FE,S,9TH AVE , , , ,25,25, , ,N,NONE ,128 -2013130613-10617 ,MONMOUTH ,BELMAR BORO ,09/14/2013,SA, ,01,BELMAR PD , , 0, 1, 0, 0,I,B,N,N,08, 2,BRIARWOOD RD , , , , , ,07,01,02,01,01,01,05,01, 300,FE,S,MONMOUTH COUNTY 16 , , , ,25,25, , ,N, ,614 -2013130613-1066 ,MONMOUTH ,BELMAR BORO ,02/17/2013,S ,1540,01,BELMAR PD , , 0, 0, 0, 0,P,B,N,N,08, 2,FIFTH AVE , , , , , ,07,01,02,01,01,01,05,01, 50,FE,W,MONMOUTH COUNTY 18 , , , ,25,25, , ,N, ,904 -2013130613-10835 ,MONMOUTH ,BELMAR BORO ,09/20/2013,F ,1618,01,BELMAR PD , , 0, 0, 0, 0,P,I,N,N,03, 2,NJ 35 , , 35, ,00000035__ , 20.48,02,01,02,01,03,01,05,01, ,AT, ,CR 18 / 16TH AVE / BELMAR AVE , , , ,35,25, , ,N, ,153 -2013130613-1086 ,MONMOUTH ,BELMAR BORO ,02/18/2013,M ,1116,01,BELMAR PD , , 0, 0, 0, 0,P,B,N,N,02, 2,10TH AVE , , , ,13061064__ , .15,07,01,02,01,01,01,02,01, 170,FE,W,MONMOUTH COUNTY 30 , , , ,25,30, , ,N, ,136 -2013130613-10886 ,MONMOUTH ,BELMAR BORO ,09/22/2013,S ,0943,01,BELMAR PD , , 0, 0, 0, 0,P,B,N,N,04, 2,FIFTEENTH AVE , , , , , ,07,01,02,01,01,01,05,01, 400,FE,W,""A"" ST , , , ,25,25, , ,N, ,614 -2013130613-10906 ,MONMOUTH ,BELMAR BORO ,09/22/2013,S ,1636,01,BELMAR PD , , 0, 1, 0, 0,I,B,N,N,01, 2,NJ 71 ,S, 71, ,00000071__ , 4.91,02,01,02,01,03,01,05,01, 100,FE,N,NJ 18 / 16TH AVE , , , ,30,25, , ,N,NONE ,904 -2013130613-11065 ,MONMOUTH ,BELMAR BORO ,09/28/2013,SA,1613,01,BELMAR PD , , 0, 2, 0, 0,I,I,N,N,02, 2,NJ 35 ,N, 35, ,00000035__ , 21.18,02,01,02,01,01,01,04,01, ,AT,W,11TH AVE , , , ,35,25, , ,N, ,152 -2013130613-11072 ,MONMOUTH ,BELMAR BORO ,09/28/2013,SA,2217,01,BELMAR PD , , 0, 1, 0, 0,I,I,N,N,01, 2,NJ 71 ,S, 71, ,00000071__ , 5.57,02,01,02,01,07,01,05,01, ,AT, ,CR 30 / 8TH AVE / MAIN ST , , , ,30,25, , ,Y,NONE ,939 -2013130613-11167 ,MONMOUTH ,BELMAR BORO ,10/02/2013,W ,1218,01,BELMAR PD , , 0, 0, 0, 0,P,B,N,N,08, 2,9TH AVE , , , ,13061065__ , .01,07,01,02,01,01,01,05,01, 50,FE,E,MONMOUTH COUNTY 30 , , , ,25,35, , ,N, ,152 -2013130613-11169 ,MONMOUTH ,BELMAR BORO ,10/02/2013,W ,1315,01,BELMAR PD , , 0, 1, 0, 1,I,B,N,N,13, 1,EIGHTH AVE , , , , , ,07,01,02,01,01,01,05,01, 25,FE,E,MONMOUTH COUNTY 30 , , , ,25,35, , ,N, ,152 -2013130613-11170 ,MONMOUTH ,BELMAR BORO ,10/02/2013,W ,1317,01,BELMAR PD , , 0, 1, 0, 0,I,B,N,N,01, 2,NJ 35 , , 35, ,00000035__ , 21.25,02,01,02,01,01,01,02,01, 20,FE,S,10TH AVE , , , ,35, , , ,N, ,134 -2013130613-1135 ,MONMOUTH ,BELMAR BORO ,02/20/2013,W ,1213,01,BELMAR PD , , 0, 0, 0, 0,P,B,N,N,02, 2,10TH AVE , , , ,13061064__ , .13,07,01,02,01,01,01,02,01, 246,FE,W,MONMOUTH COUNTY 30 , , , ,25,30, , ,N, ,1?6 -2013130613-11352 ,MONMOUTH ,BELMAR BORO ,10/10/2013,TH,1950,01,BELMAR PD , , 0, 0, 0, 0,P,B,N,N,06, 2,FIFTEENTH AVE , , , , , ,07,01,02,02,05,01,05,01, 150,FE,E,13TH ST , , , ,25, , , ,N,NONE ,128 -2013130613-11450 ,MONMOUTH ,BELMAR BORO ,10/15/2013,TU,1741,01,BELMAR PD , , 0, 0, 0, 0,P,I,N,N,03, 2,NJ 71 , , 71, ,00000071__ , 4.89,02,01,02,01,01,01,04,01, ,AT, ,NJ 18 / 16TH AVE , , , ,30,25, , ,N,FIRE HYDRANT ,152 -2013130613-11474 ,MONMOUTH ,BELMAR BORO ,10/16/2013,W ,1751,01,BELMAR PD , , 0, 0, 0, 0,P,I,N,N,02, 2,10TH AVE , , , ,13061064__ , .11,07,01,02,01,01,05,05,01, ,AT, ,BELMAR PLAZA , , , ,25,25, , ,N, ,152 -2013130613-11528 ,MONMOUTH ,BELMAR BORO ,10/18/2013,F ,1848,01,BELMAR PD , , 0, 0, 0, 0,P,I,N,N,03, 2,NJ 35 , , 35, ,00000035__ , 21.25,02,01,02,01,06,01,05,01, ,AT, ,10TH AVE , , , ,35,25, , ,N, ,153 -2013130613-11671 ,MONMOUTH ,BELMAR BORO ,10/25/2013,F ,1809,01,BELMAR PD , , 0, 0, 0, 0,P,I,N,N,03, 2,NJ 35 , , 35, ,00000035__ , 21.18,02,01,02,01,01,01,03,01, ,AT, ,11TH AVE , , , ,35,25, , ,N, ,153 -2013130613-11770 ,MONMOUTH ,BELMAR BORO ,10/29/2013,TU,1802,01,BELMAR PD , , 0, 1, 0, 0,I,B,N,N,01, 2,NJ 35 ,N, 35, ,00000035__ , 21.27,02,01,02,01,06,01,02,01, 100,FE,N,10TH AVE , , , ,35,25, , ,N,NONE ,128 -2013130613-11802 ,MONMOUTH ,BELMAR BORO ,10/31/2013,TH,0930,01,BELMAR PD , , 0, 1, 0, 0,I,B,Y,N,01, 3,7TH AVE , , , , , ,07,01,02,01,01,01,05,01, 30,FE,E,A STREET , , , ,25,25, , ,N,NONE ,144 -2013130613-11983 ,MONMOUTH ,BELMAR BORO ,11/08/2013,F ,1114,01,BELMAR PD , , 0, 0, 0, 0,P,B,N,N,02, 2,10TH AVE , , , ,13061064__ , .18,07,01,02,01,01,01,02,01, 10,FE,W,CR 30 , , , ,25,30, , ,N, ,135 -2013130613-12022 ,MONMOUTH ,BELMAR BORO ,11/10/2013,S ,1045,01,BELMAR PD , , 0, 0, 0, 0,P,B,N,N,08, 2,10TH AVE , , , ,13061064__ , .18,07,01,02,01,01,01,04,01, 25,FE,E,CR 30 , , , ,25,35, , ,N, ,152 -2013130613-12086 ,MONMOUTH ,BELMAR BORO ,11/14/2013,TH,1432,01,BELMAR PD , , 0, 1, 0, 0,I,B,N,N,01, 2,NJ 35 ,N, 35, ,00000035__ , ,02,01,02,01,01,01,04,01, 250,FE,S,NJ 71 , , , ,35,25, , ,N, ,152 -2013130613-1227 ,MONMOUTH ,BELMAR BORO ,02/24/2013,S ,1838,01,BELMAR PD , , 0, 0, 0, 0,P,I,N,N,01, 2,NJ 35 ,N, 35, ,00000035__ , 21.41,02,01,02,01,06,01,04,01, ,AT, ,NJ 71 / 8TH AVE , , , ,35,25, , ,N, ,151 -2013130613-12316 ,MONMOUTH ,BELMAR BORO ,11/24/2013,S ,1605,01,BELMAR PD , , 0, 0, 0, 0,P,B,N,N,06, 2,MONMOUTH COUNTY 30 II , , 30,2,130000302_ , 4.53,05,01,02,01,01,01,05,01, 50,FE,N,9TH AVE , , , ,30,25, , ,N, ,153 -2013130613-12506 ,MONMOUTH ,BELMAR BORO ,12/03/2013,TU,0803,01,BELMAR PD , , 0, 0, 0, 0,P,B,N,N,02, 2,11 TH AVE , , , , , ,07,01,02,01,01,01,05,01, 30,FE, ,CR 30 , , , ,25,30, , ,N,NONE ,135 -2013130613-12568 ,MONMOUTH ,BELMAR BORO ,12/06/2013,F ,1509,01,BELMAR PD , , 0, 0, 0, 0,P,I,N,N,03, 2,NJ 71 , , 71, ,00000071__ , 5.04,02,01,02,02,01,02,05,01, ,AT, ,13TH AVE , , , ,30,25, , ,N, ,153 -2013130613-12659 ,MONMOUTH ,BELMAR BORO ,12/10/2013,TU,1840,01,BELMAR PD , , 0, 0, 0, 0,P,B,N,N,01, 2,MONMOUTH COUNTY 30 II , , 30,2,130000302_ , 4.40,05,01,02,02,06,01,05,01, 100,FE,N,11TH AVE , , , , 0, , , ,N, ,129 -2013130613-12680 ,MONMOUTH ,BELMAR BORO ,12/11/2013,W ,2256,01,BELMAR PD , , 0, 0, 0, 0,P,B,N,N,06, 2,MONMOUTH COUNTY 18 I , , 18,1,130000181_ , 8.18,05,01,02,01,06,01,05,01, 200,FE,W,D ST / NEWMAN ST , , , ,25,25, , ,N, ,153 -2013130613-12889 ,MONMOUTH ,BELMAR BORO ,12/22/2013,S ,0827,01,BELMAR PD , , 0, 0, 0, 0,P,B,N,N,06, 2,THIRTEENTH AVE , , , , , ,07,01,02,01,06,01,05,01, 50,FE,W,BAYVIEW , , , ,25,25, , ,N, ,153 -2013130613-12893 ,MONMOUTH ,BELMAR BORO ,12/22/2013,S ,1147,01,BELMAR PD , , 0, 1, 0, 0,I,B,N,N,14, 1,MONMOUTH COUNTY 30 II , , 30,2,130000302_ , 4.35,05,01,02,01,01,01,05,01, 200,FE,N,12TH AVE , , , ,25,25, , ,N,(NONE) ,128 -2013130613-12983 ,MONMOUTH ,BELMAR BORO ,12/26/2013,TH,1518,01,BELMAR PD , , 0, 0, 0, 0,P,I,N,N,01, 2,NJ 35 ,S, 35, ,00000035__ , 20.98,02,04,02,01,01,01,04,01, ,AT, ,K ST , , , ,35,35, , ,N, ,955 -2013130613-1299 ,MONMOUTH ,BELMAR BORO ,02/27/2013,W ,1905,01,BELMAR PD , , 0, 0, 0, 0,P,B,N,N,06, 2,MONMOUTH COUNTY 18 I , , 18,1,130000181_ , 7.90,05,01,02,01,07,01,05,01, 50,FE,E,RAILROAD AVE , , , ,25,25, , ,N,NONE ,147 -2013130613-13066 ,MONMOUTH ,BELMAR BORO ,12/29/2013,S ,1359,01,BELMAR PD , , 0, 0, 0, 0,P,I,N,N,03, 2,TWELFTH AVE , , , , , ,07,01,02,02,01,02,05,01, ,AT, ,RAILROAD AVENUE , , , ,25,25, , ,N, ,128 -2013130613-1432 ,MONMOUTH ,BELMAR BORO ,03/03/2013,S ,1607,01,BELMAR PD , , 0, 0, 0, 0,P,B,N,N,06, 2,D ST , , , , , ,07,01,02,01,01,01,05,01, 30,FE,N,11TH AVE , , , ,25,25, , ,N,NONE ,128 -2013130613-1450 ,MONMOUTH ,BELMAR BORO ,03/03/2013,S ,1946,01,BELMAR PD , , 0, 0, 0, 0,P,B,Y,N,06, 2,FIFTEENTH AVE ,W, , , , ,07,02,02,01,06,01,04,01, 150,FE,E,E STREET , , , ,25,25, , ,N, ,152 -2013130613-1792 ,MONMOUTH ,BELMAR BORO ,03/16/2013,SA,0856,01,BELMAR PD , , 0, 0, 0, 0,P,B,N,N,11, 2,NJ 35 ,N, 35, ,00000035__ , 20.70,02,04,02,01,01,01,04,01, 100,FE,S,MAPLEWOOD RD , , , ,35,25, , ,N, ,151 -2013130613-200 ,MONMOUTH ,BELMAR BORO ,01/09/2013,W ,1551,01,BELMAR PD , , 0, 0, 0, 0,P,I,N,N,09, 2,NJ 71 , , 71, ,00000071__ , 5.46,02,01,02,01,01,01,02,01, ,AT, ,W RAILROAD AVE , , , ,25,25, , ,N,NONE ,128 -2013130613-2046 ,MONMOUTH ,BELMAR BORO ,03/26/2013,TU,1515,01,BELMAR PD , , 0, 1, 0, 0,I,I,N,N,01, 2,MONMOUTH COUNTY 30 II , , 30,2,130000302_ , 4.45,05,01,02,01,01,05,05,01, ,AT, ,10TH AVE , , , ,30, , , ,N, ,135 diff --git a/inst/tests/issue_1113_fread.txt b/inst/tests/issue_1113_fread.txt deleted file mode 100644 index e8f7ddc4a1..0000000000 --- a/inst/tests/issue_1113_fread.txt +++ /dev/null @@ -1,4 +0,0 @@ -ITERATION THETA1 THETA2 THETA3 THETA4 THETA5 THETA6 THETA7 THETA8 THETA9 THETA10 THETA11 THETA12 THETA13 THETA14 THETA15 THETA16 THETA17 SIGMA(1,1) OMEGA(1,1) OMEGA(2,1) OMEGA(2,2) OMEGA(3,1) OMEGA(3,2) OMEGA(3,3) OMEGA(4,1) OMEGA(4,2) OMEGA(4,3) OMEGA(4,4) OMEGA(5,1) OMEGA(5,2) OMEGA(5,3) OMEGA(5,4) OMEGA(5,5) OMEGA(6,1) OMEGA(6,2) OMEGA(6,3) OMEGA(6,4) OMEGA(6,5) OMEGA(6,6) OMEGA(7,1) OMEGA(7,2) OMEGA(7,3) OMEGA(7,4) OMEGA(7,5) OMEGA(7,6) OMEGA(7,7) OMEGA(8,1) OMEGA(8,2) OMEGA(8,3) OMEGA(8,4) OMEGA(8,5) OMEGA(8,6) OMEGA(8,7) OMEGA(8,8) OMEGA(9,1) OMEGA(9,2) OMEGA(9,3) OMEGA(9,4) OMEGA(9,5) OMEGA(9,6) OMEGA(9,7) OMEGA(9,8) OMEGA(9,9) OMEGA(10,1) OMEGA(10,2) OMEGA(10,3) OMEGA(10,4) OMEGA(10,5) OMEGA(10,6) OMEGA(10,7) OMEGA(10,8) OMEGA(10,9) OMEGA(10,10) OMEGA(11,1) OMEGA(11,2) OMEGA(11,3) OMEGA(11,4) OMEGA(11,5) OMEGA(11,6) OMEGA(11,7) OMEGA(11,8) OMEGA(11,9) OMEGA(11,10) OMEGA(11,11) OMEGA(12,1) OMEGA(12,2) OMEGA(12,3) OMEGA(12,4) OMEGA(12,5) OMEGA(12,6) OMEGA(12,7) OMEGA(12,8) OMEGA(12,9) OMEGA(12,10) OMEGA(12,11) OMEGA(12,12) OMEGA(13,1) OMEGA(13,2) OMEGA(13,3) OMEGA(13,4) OMEGA(13,5) OMEGA(13,6) OMEGA(13,7) OMEGA(13,8) OMEGA(13,9) OMEGA(13,10) OMEGA(13,11) OMEGA(13,12) OMEGA(13,13) OMEGA(14,1) OMEGA(14,2) OMEGA(14,3) OMEGA(14,4) OMEGA(14,5) OMEGA(14,6) OMEGA(14,7) OMEGA(14,8) OMEGA(14,9) OMEGA(14,10) OMEGA(14,11) OMEGA(14,12) OMEGA(14,13) OMEGA(14,14) OMEGA(15,1) OMEGA(15,2) OMEGA(15,3) OMEGA(15,4) OMEGA(15,5) OMEGA(15,6) OMEGA(15,7) OMEGA(15,8) OMEGA(15,9) OMEGA(15,10) OMEGA(15,11) OMEGA(15,12) OMEGA(15,13) OMEGA(15,14) OMEGA(15,15) MCMCOBJ - -25000 -2.50000E+00 2.30000E+00 6.20000E-01 5.30000E-01 -3.00000E+00 -8.10000E-01 8.30000E+00 4.10000E+00 -3.50000E+00 -3.40000E+00 -9.90000E-01 -2.30000E-02 6.80000E-01 9.10000E-01 2.30000E+00 1.00000E-01 1.00000E-01 1.33669E-04 4.00000E-01 1.00000E-02 4.00000E-01 1.00000E-02 1.00000E-02 4.00000E-01 1.00000E-02 1.00000E-02 1.00000E-02 4.00000E-01 1.00000E-02 1.00000E-02 1.00000E-02 1.00000E-02 4.00000E-01 1.00000E-02 1.00000E-02 1.00000E-02 1.00000E-02 1.00000E-02 4.00000E-01 1.00000E-02 1.00000E-02 1.00000E-02 1.00000E-02 1.00000E-02 1.00000E-02 4.00000E-01 1.00000E-02 1.00000E-02 1.00000E-02 1.00000E-02 1.00000E-02 1.00000E-02 1.00000E-02 4.00000E-01 1.00000E-02 1.00000E-02 1.00000E-02 1.00000E-02 1.00000E-02 1.00000E-02 1.00000E-02 1.00000E-02 4.00000E-01 1.00000E-02 1.00000E-02 1.00000E-02 1.00000E-02 1.00000E-02 1.00000E-02 1.00000E-02 1.00000E-02 1.00000E-02 4.00000E-01 1.00000E-02 1.00000E-02 1.00000E-02 1.00000E-02 1.00000E-02 1.00000E-02 1.00000E-02 1.00000E-02 1.00000E-02 1.00000E-02 4.00000E-01 1.00000E-02 1.00000E-02 1.00000E-02 1.00000E-02 1.00000E-02 1.00000E-02 1.00000E-02 1.00000E-02 1.00000E-02 1.00000E-02 1.00000E-02 4.00000E-01 1.00000E-02 1.00000E-02 1.00000E-02 1.00000E-02 1.00000E-02 1.00000E-02 1.00000E-02 1.00000E-02 1.00000E-02 1.00000E-02 1.00000E-02 1.00000E-02 4.00000E-01 1.00000E-02 1.00000E-02 1.00000E-02 1.00000E-02 1.00000E-02 1.00000E-02 1.00000E-02 1.00000E-02 1.00000E-02 1.00000E-02 1.00000E-02 1.00000E-02 1.00000E-02 4.00000E-01 0.00000E+00 0.00000E+00 0.00000E+00 0.00000E+00 0.00000E+00 0.00000E+00 0.00000E+00 0.00000E+00 0.00000E+00 0.00000E+00 0.00000E+00 0.00000E+00 0.00000E+00 0.00000E+00 1.00000E-01 120924.21730058071 - -24999 -2.49472E+00 2.15887E+00 6.23667E-01 2.86888E-01 -2.60190E+00 -4.83346E-01 8.65879E+00 3.82465E+00 -3.69026E+00 -3.55164E+00 -9.91289E-01 -2.35327E-02 8.94482E-01 1.04624E+00 2.30139E+00 -3.68905E-01 4.83838E-03 1.24727E-02 6.69962E-01 -1.82743E-01 8.87432E-01 -1.35321E-01 2.17601E-01 2.36157E-01 -8.46622E-01 2.63270E-01 1.65191E-01 1.24854E+00 1.17863E-01 -2.82260E-01 -1.82098E-01 -1.48054E-01 4.15367E-01 4.96165E-01 -8.13818E-01 -1.68830E-01 -7.29928E-01 2.21669E-01 1.33956E+00 -1.48864E-01 -1.94915E-01 -7.53074E-02 2.53751E-01 1.89197E-01 -7.45796E-02 3.93262E-01 -5.40804E-01 5.56132E-01 1.82852E-01 7.71652E-01 -2.07298E-01 -9.08063E-01 9.73558E-02 8.67754E-01 2.11909E-01 -1.42553E-01 -2.65172E-02 -2.99459E-01 -1.44428E-02 2.26481E-01 -6.58063E-02 -2.38070E-01 1.87605E-01 -9.53940E-02 1.73642E-02 2.40828E-02 1.15392E-01 -9.60601E-02 -1.28952E-01 6.09570E-03 1.35560E-01 3.99417E-03 2.19721E-01 -3.23673E-01 2.81581E-01 9.73522E-02 4.50066E-01 -1.96140E-01 -4.24467E-01 -1.24865E-02 3.45742E-01 -8.10472E-02 8.80072E-02 4.08855E-01 -5.17385E-01 4.63403E-01 1.61036E-01 6.95697E-01 -1.73728E-01 -6.39965E-01 -8.19083E-03 5.72855E-01 -1.87910E-01 7.46275E-02 3.63738E-01 7.19679E-01 3.91232E-02 4.39350E-02 1.59526E-01 -1.40054E-01 -1.06957E-01 1.70758E-01 -2.11898E-01 -1.73081E-01 1.14536E-01 -4.40678E-02 3.79919E-02 5.98738E-02 6.00977E-01 4.26254E-01 -1.10011E-01 -1.27825E-01 -5.33123E-01 8.27641E-02 2.77281E-01 -7.16001E-02 -2.76509E-01 1.10513E-01 -3.72377E-02 -2.81194E-01 -3.32530E-01 -1.31069E-01 4.76796E-01 0.00000E+00 0.00000E+00 0.00000E+00 0.00000E+00 0.00000E+00 0.00000E+00 0.00000E+00 0.00000E+00 0.00000E+00 0.00000E+00 0.00000E+00 0.00000E+00 0.00000E+00 0.00000E+00 1.76212E-01 -4787.0714136013094 - -24998 -2.47806E+00 2.16679E+00 5.44640E-01 1.40853E-01 -2.97418E+00 -8.07030E-01 8.59191E+00 4.05605E+00 -3.34552E+00 -3.14465E+00 -1.29517E+00 -3.53758E-01 6.90913E-01 1.10941E+00 2.65561E+00 1.81350E-01 -7.13636E-02 6.39860E-03 7.58939E-01 -7.41282E-02 4.50564E-01 -1.56544E-01 5.50040E-02 4.00618E-01 -8.38686E-01 1.99437E-01 3.24735E-01 1.13226E+00 -4.37298E-02 -9.98388E-02 -5.41804E-03 1.95687E-02 1.24519E-01 3.99408E-01 -3.52834E-01 -1.41210E-01 -5.96706E-01 7.43882E-02 6.21663E-01 -3.49265E-01 6.11820E-02 1.06495E-01 4.17807E-01 5.24262E-03 -2.02151E-01 3.19864E-01 -4.69009E-01 1.83375E-01 1.02173E-01 6.00857E-01 -1.83947E-03 -3.97512E-01 2.31033E-01 4.48351E-01 1.06819E-01 -5.79161E-02 7.86940E-03 -1.27090E-01 8.37271E-03 9.19823E-02 -6.28913E-02 -8.98966E-02 1.14526E-01 -2.35081E-01 1.50964E-02 6.74098E-02 3.09622E-01 1.77301E-02 -1.47651E-01 1.52674E-01 1.63312E-01 -3.81844E-02 2.62263E-01 -5.78659E-01 2.00738E-01 8.33776E-02 7.28190E-01 1.39433E-02 -5.48396E-01 2.93647E-01 4.67792E-01 -1.14388E-01 2.68342E-01 8.09273E-01 -4.13419E-01 2.51892E-01 1.64555E-01 5.53619E-01 -6.07903E-02 -4.76312E-01 1.87828E-01 3.62802E-01 -5.54501E-02 1.73611E-01 4.49881E-01 5.55499E-01 -1.64640E-01 -8.08169E-02 -1.32878E-01 1.19849E-01 4.16466E-02 4.80779E-03 1.91021E-02 8.57646E-02 -7.56957E-02 2.08879E-02 1.51795E-01 -5.06103E-02 4.31028E-01 5.68674E-01 1.82220E-02 -1.06964E-01 -6.01272E-01 -7.45867E-02 1.91128E-01 -2.86643E-01 -3.07017E-01 6.83705E-02 -2.12983E-01 -4.43121E-01 -1.64361E-01 -2.31855E-01 7.73541E-01 0.00000E+00 0.00000E+00 0.00000E+00 0.00000E+00 0.00000E+00 0.00000E+00 0.00000E+00 0.00000E+00 0.00000E+00 0.00000E+00 0.00000E+00 0.00000E+00 0.00000E+00 0.00000E+00 6.55898E-02 -5326.7487129923438 diff --git a/inst/tests/issue_1116_fread_few_lines.txt b/inst/tests/issue_1116_fread_few_lines.txt deleted file mode 100644 index f1b8879e69..0000000000 --- a/inst/tests/issue_1116_fread_few_lines.txt +++ /dev/null @@ -1,133 +0,0 @@ -x,y -1,"a -,,,,,,,,,, -_b" -1,"a -,,,,,,,,,, -_b" -1,"a -,,,,,,,,,, -_b" -1,"a -,,,,,,,,,, -_b" -1,"a -,,,,,,,,,, -_b" -1,"a -,,,,,,,,,, -_b" -1,"a -,,,,,,,,,, -_b" -1,"a -,,,,,,,,,, -_b" -1,"a -,,,,,,,,,, -_b" -1,"a -,,,,,,,,,, -_b" -1,"a -,,,,,,,,,, -_b" -1,"a -,,,,,,,,,, -_b" -1,"a -,,,,,,,,,, -_b" -1,"a -,,,,,,,,,, -_b" -1,"a -,,,,,,,,,, -_b" -1,"a -,,,,,,,,,, -_b" -1,"a -,,,,,,,,,, -_b" -1,"a -,,,,,,,,,, -_b" -1,"a -,,,,,,,,,, -_b" -1,"a -,,,,,,,,,, -_b" -1,"a -,,,,,,,,,, -_b" -1,"a -,,,,,,,,,, -_b" -1,"a -,,,,,,,,,, -_b" -1,"a -,,,,,,,,,, -_b" -1,"a -,,,,,,,,,, -_b" -1,"a -,,,,,,,,,, -_b" -1,"a -,,,,,,,,,, -_b" -1,"a -,,,,,,,,,, -_b" -1,"a -,,,,,,,,,, -_b" -1,"a -,,,,,,,,,, -_b" -1,"a -,,,,,,,,,, -_b" -1,"a -,,,,,,,,,, -_b" -1,"a -,,,,,,,,,, -_b" -1,"a -,,,,,,,,,, -_b" -1,"a -,,,,,,,,,, -_b" -1,"a -,,,,,,,,,, -_b" -1,"a -,,,,,,,,,, -_b" -1,"a -,,,,,,,,,, -_b" -1,"a -,,,,,,,,,, -_b" -1,"a -,,,,,,,,,, -_b" -1,"a -,,,,,,,,,, -_b" -1,"a -,,,,,,,,,, -_b" -1,"a -,,,,,,,,,, -_b" -1,"a -,,,,,,,,,, -_b" diff --git a/inst/tests/issue_1116_fread_few_lines_2.txt b/inst/tests/issue_1116_fread_few_lines_2.txt deleted file mode 100644 index 4226ea60a5..0000000000 --- a/inst/tests/issue_1116_fread_few_lines_2.txt +++ /dev/null @@ -1,177 +0,0 @@ -x,y -1,"a - -,,,,,,,, -_b" -1,"a - -,,,,,,,, -_b" -1,"a - -,,,,,,,, -_b" -1,"a - -,,,,,,,, -_b" -1,"a - -,,,,,,,, -_b" -1,"a - -,,,,,,,, -_b" -1,"a - -,,,,,,,, -_b" -1,"a - -,,,,,,,, -_b" -1,"a - -,,,,,,,, -_b" -1,"a - -,,,,,,,, -_b" -1,"a - -,,,,,,,, -_b" -1,"a - -,,,,,,,, -_b" -1,"a - -,,,,,,,, -_b" -1,"a - -,,,,,,,, -_b" -1,"a - -,,,,,,,, -_b" -1,"a - -,,,,,,,, -_b" -1,"a - -,,,,,,,, -_b" -1,"a - -,,,,,,,, -_b" -1,"a - -,,,,,,,, -_b" -1,"a - -,,,,,,,, -_b" -1,"a - -,,,,,,,, -_b" -1,"a - -,,,,,,,, -_b" -1,"a - -,,,,,,,, -_b" -1,"a - -,,,,,,,, -_b" -1,"a - -,,,,,,,, -_b" -1,"a - -,,,,,,,, -_b" -1,"a - -,,,,,,,, -_b" -1,"a - -,,,,,,,, -_b" -1,"a - -,,,,,,,, -_b" -1,"a - -,,,,,,,, -_b" -1,"a - -,,,,,,,, -_b" -1,"a - -,,,,,,,, -_b" -1,"a - -,,,,,,,, -_b" -1,"a - -,,,,,,,, -_b" -1,"a - -,,,,,,,, -_b" -1,"a - -,,,,,,,, -_b" -1,"a - -,,,,,,,, -_b" -1,"a - -,,,,,,,, -_b" -1,"a - -,,,,,,,, -_b" -1,"a - -,,,,,,,, -_b" -1,"a - -,,,,,,,, -_b" -1,"a - -,,,,,,,, -_b" -1,"a - -,,,,,,,, -_b" -1,"a - -,,,,,,,, -_b" diff --git a/inst/tests/issue_1164_json.txt b/inst/tests/issue_1164_json.txt deleted file mode 100644 index ee3829aeca..0000000000 --- a/inst/tests/issue_1164_json.txt +++ /dev/null @@ -1,2 +0,0 @@ -json1, string1 -"{""f1"":""value1"",""f2"":""double quote escaped with a backslash [ \"" ]""}", "string field" diff --git a/inst/tests/issue_1330_fread.txt b/inst/tests/issue_1330_fread.txt deleted file mode 100644 index db8dfbce52..0000000000 --- a/inst/tests/issue_1330_fread.txt +++ /dev/null @@ -1,8 +0,0 @@ -a b -1 1 -2 2 - -3 3 -4 4 - -5 5 diff --git a/inst/tests/issue_1462_fread_quotes.txt b/inst/tests/issue_1462_fread_quotes.txt deleted file mode 100644 index f1b09d6d66..0000000000 --- a/inst/tests/issue_1462_fread_quotes.txt +++ /dev/null @@ -1,4 +0,0 @@ -897145298 urn:occurrence:Arctos:MSB:Host:9010:1861932 en http://arctos.database.museum/guid/MSB:Host:9010 http://arctosdb.org/home/data/ PhysicalObject PRESERVED_SPECIMEN 9010 Mammalia Host (of parasite) specimens NORTH_AMERICA US 2014-05-28T00:00Z 14 63.57609 -170.87962 sex=female ; weight=4 g; reproductive data=immature ; examined for parasites=yes ; parasites found=no ; hind foot with claw=12 mm; tail length=33 mm; total length=89 mm 226 1957-08-14T00:00Z Soricidae Sorex 2012-08-30 00:00:00.0 GeoLocate GeoLocate unverified Mariel L. Campbell Animalia; Chordata; Mammalia; Soricomorpha; Soricidae; Soricinae; Soricini; Hall & Gilmore, 1932 North America, Bering Sea, United States, Alaska, St. Lawrence Quad, Saint Lawrence Island A geographic distribution Gordon H. Jarrell http://arctos.database.museum/guid/MSB:Host:9010 MSB urn:lsid:biocol.org:col:34495 Saint Lawrence Island Animalia South Kangee trapline #3 Mariel L. Campbell 8 ICZN urn:occurrence:Arctos:MSB:Host:9010:1861932 negative for cestodes Soricomorpha collector number=19235; original identifier=347 Chordata observation Sorex jacksoni (accepted ID) identified by Gordon H. Jarrell on 2014-05-28; method: geographic distribution
Sorex identified by Robert L. Rausch on 1957-08-14; method: legacy Remark: verbatim ID = Sorex 19235 Collector(s): Robert L. Rausch Sorex jacksoni Hall & Gilmore, 1932 FEMALE jacksoni Alaska SPECIES 14 Aug 1957 S. Kangee SLI trap line #3 a.m. Bering Sea 1957 b211f32f-326b-43d3-8012-2fbce0cc6dcc US 2015-02-20T04:11Z COORDINATE_ROUNDED;GEODETIC_DATUM_ASSUMED_WGS84 true false 2436070 1 44 359 803 5534 2435935 2436070 Sorex jacksoni Sorex DWC_ARCHIVE 2015-02-20T04:11Z 2015-03-22T03:12Z -897145318 urn:occurrence:Arctos:MSB:Host:9011:1861933 en http://arctos.database.museum/guid/MSB:Host:9011 http://arctosdb.org/home/data/ PhysicalObject PRESERVED_SPECIMEN 9011 Mammalia Host (of parasite) specimens NORTH_AMERICA US 2014-05-28T00:00Z 14 63.57609 -170.87962 sex=female ; weight=4.2 g; reproductive data=immature ; examined for parasites=yes ; parasites found=no ; tail length=13 mm; total length=36 mm 226 1957-08-14T00:00Z Soricidae Sorex 2012-08-30 00:00:00.0 GeoLocate GeoLocate unverified Mariel L. Campbell Animalia; Chordata; Mammalia; Soricomorpha; Soricidae; Soricinae; Soricini; Hall & Gilmore, 1932 North America, Bering Sea, United States, Alaska, St. Lawrence Quad, Saint Lawrence Island A geographic distribution Gordon H. Jarrell http://arctos.database.museum/guid/MSB:Host:9011 MSB urn:lsid:biocol.org:col:34495 Saint Lawrence Island Animalia South Kangee trapline #3 Mariel L. Campbell 8 ICZN urn:occurrence:Arctos:MSB:Host:9011:1861933 negative for cestodes Soricomorpha collector number=19236; original identifier=328 Chordata observation Sorex jacksoni (accepted ID) identified by Gordon H. Jarrell on 2014-05-28; method: geographic distribution
Sorex identified by Robert L. Rausch on 1957-08-14; method: legacy Remark: verbatim ID = Sorex 19236 Collector(s): Robert L. Rausch Sorex jacksoni Hall & Gilmore, 1932 FEMALE jacksoni Alaska SPECIES 14 Aug 1957 S. Kangee SLI trap line #3 a.m. Bering Sea 1957 b211f32f-326b-43d3-8012-2fbce0cc6dcc US 2015-02-20T04:11Z COORDINATE_ROUNDED;GEODETIC_DATUM_ASSUMED_WGS84 true false 2436070 1 44 359 803 5534 2435935 2436070 Sorex jacksoni Sorex DWC_ARCHIVE 2015-02-20T04:11Z 2015-03-22T03:12Z -897145322 urn:occurrence:Arctos:MSB:Host:927:1853849 en http://arctos.database.museum/guid/MSB:Host:927 http://arctosdb.org/home/data/ PhysicalObject (host of) MSB:Para http://arctos.database.museum/guid/MSB:Para:6247 PRESERVED_SPECIMEN 927 Mammalia Host (of parasite) specimens NORTH_AMERICA US 1951-08-12T00:00Z 12 60.08292 -166.39397 sex=male ; weight=4.2 g; examined for parasites=yes ; parasites found=yes 224 1951-08-12T00:00Z Soricidae Sorex 2012-08-30 00:00:00.0 GeoLocate GeoLocate unverified Mariel L. Campbell Animalia Chordata Mammalia Soricomorpha Soricidae Soricinae Soricini Kerr, 1792 North America, Bering Sea, United States, Alaska, Nunivak Island A verbatim ID = L. T. Shrew; mlc: species ID based on Rausch legder number 10179, "L.T. Shrew Sorex cinereus" legacy Robert L. Rausch http://arctos.database.museum/guid/MSB:Host:927 MSB urn:lsid:biocol.org:col:34495 Nunivak Island Animalia Nunivak Mariel L. Campbell 8 ICZN urn:occurrence:Arctos:MSB:Host:927:1853849 "?" written in nematode column Soricomorpha collector number=10212B Chordata observation Sorex cinereus (accepted ID) identified by Robert L. Rausch on 1951-08-12; method: legacy Remark: verbatim ID = L. T. Shrew; mlc: species ID based on Rausch legder number 10179, "L.T. Shrew Sorex cinereus" 10212B Collector(s): Robert L. Rausch Sorex cinereus Kerr, 1792 MALE cinereus Alaska SPECIES 12 Aug '51 Nunivak Bering Sea 1951 b211f32f-326b-43d3-8012-2fbce0cc6dcc US 2014-12-19T21:26Z COORDINATE_ROUNDED;GEODETIC_DATUM_ASSUMED_WGS84 true false 2435964 1 44 359 803 5534 2435935 2435964 Sorex cinereus Sorex DWC_ARCHIVE 2014-12-19T21:26Z 2015-03-22T03:12Z -897145342 urn:occurrence:Arctos:MSB:Host:9012:1861934 en http://arctos.database.museum/guid/MSB:Host:9012 http://arctosdb.org/home/data/ PhysicalObject PRESERVED_SPECIMEN 9012 Mammalia Host (of parasite) specimens NORTH_AMERICA US 2014-05-28T00:00Z 14 63.57609 -170.87962 sex=male ; weight=4 g; reproductive data=immature; testis 1 x 1; thymus large ; examined for parasites=yes ; parasites found=no ; hind foot with claw=13 mm; tail length=35 mm; total length=93 mm 226 1957-08-14T00:00Z Soricidae Sorex 2012-08-30 00:00:00.0 GeoLocate GeoLocate unverified Mariel L. Campbell Animalia; Chordata; Mammalia; Soricomorpha; Soricidae; Soricinae; Soricini; Hall & Gilmore, 1932 North America, Bering Sea, United States, Alaska, St. Lawrence Quad, Saint Lawrence Island A geographic distribution Gordon H. Jarrell http://arctos.database.museum/guid/MSB:Host:9012 MSB urn:lsid:biocol.org:col:34495 Saint Lawrence Island Animalia South Kangee trapline #3 Mariel L. Campbell 8 ICZN urn:occurrence:Arctos:MSB:Host:9012:1861934 negative for cestodes Soricomorpha collector number=19237; original identifier=325 Chordata observation Sorex jacksoni (accepted ID) identified by Gordon H. Jarrell on 2014-05-28; method: geographic distribution
Sorex identified by Robert L. Rausch on 1957-08-14; method: legacy Remark: verbatim ID = Sorex 19237 Collector(s): Robert L. Rausch Sorex jacksoni Hall & Gilmore, 1932 MALE jacksoni Alaska SPECIES 14 Aug 1957 S. Kangee SLI trap line #3 a.m. Bering Sea 1957 b211f32f-326b-43d3-8012-2fbce0cc6dcc US 2015-02-20T04:11Z COORDINATE_ROUNDED;GEODETIC_DATUM_ASSUMED_WGS84 true false 2436070 1 44 359 803 5534 2435935 2436070 Sorex jacksoni Sorex DWC_ARCHIVE 2015-02-20T04:11Z 2015-03-22T03:12Z diff --git a/inst/tests/issue_1573_fill.txt b/inst/tests/issue_1573_fill.txt deleted file mode 100644 index e868824970..0000000000 --- a/inst/tests/issue_1573_fill.txt +++ /dev/null @@ -1,8 +0,0 @@ -SD1 ST1 SMS1 SD2 ST2 SMS2 SD3 ST3 SMS3 SD4 ST4 SMS4 -01-11-2015 00:00:01 323 2015-11-01 00:00:01 551 -01-11-2015 00:00:02 289 2015-11-01 00:00:02 618 -01-11-2015 01:13:16 253 2015-11-01 01:13:25 511 2015-11-01 01:13:33 489 2015-11-01 01:13:44 870 -01-11-2015 00:00:11 986 2015-11-01 00:00:12 602 -01-11-2015 00:00:27 48 2015-11-01 00:00:27 391 2015-11-01 00:00:27 429 -01-11-2015 00:00:13 750 2015-11-01 00:00:14 255 -01-11-2015 00:00:28 773 2015-11-01 00:00:29 114 diff --git a/inst/tests/issue_2051.csv b/inst/tests/issue_2051.csv deleted file mode 100644 index 61b7474d20..0000000000 --- a/inst/tests/issue_2051.csv +++ /dev/null @@ -1,3 +0,0 @@ -COLUMN1,COLUMN2,COLUMN3,COLUMN4,COLUMN5,COLUMN6,COLUMN7,COLUMN8,COLUMN9,COLUMN10,COLUMN11,COLUMN12,COLUMN13,COLUMN14,COLUMN15,COLUMN16,COLUMN17,COLUMN18,COLUMN19,COLUMN20,COLUMN21,COLUMN22,COLUMN23,COLUMN24,COLUMN25,COLUMN26,COLUMN27,COLUMN28,COLUMN29,COLUMN30,COLUMN31,COLUMN32,COLUMN33,COLUMN34,COLUMN35,COLUMN36,COLUMN37,COLUMN38,COLUMN39,COLUMN40,COLUMN41,COLUMN42,COLUMN43,COLUMN44,COLUMN45,COLUMN46,COLUMN47,COLUMN48,COLUMN49,COLUMN50 -2015-03-25 13:55:05.000,EFEBAB4B4F84404A4FB843ACFA861945,020E33,COMP,Royal Bank of Canada,CA,44,,,,,,,,,,,,,,,,,,,,,,,,,PRESS-RELEASE,5A5702,XYZ,0.04,-0.58,0,0,1,0,0,0,0,0,2,13,WE-BD,XYZ,5355872:6127514,R.W. Pressprich & Co. Expands Energy Team -2015-03-25 13:55:05.653,F1C6459BB07D98926FEF3BBF2F0C4AEB,4A6F00,COMP,Alphabet Inc.,US,90,,,,,,,,,,,,,,,,,,,,,,,,,NEWS-FLASH,E5AA62,Yahoo! Finance,0.00,0.24,0,0,0,0,0,0,0,0,2,2,WE-BD,MRVR,10:20834205901,"Our Stock Screen Delivers an Israeli Software Company (MNDO, CTCH)<\/a> SmallCapInvestor.com - Thu, May 19, 2011 10:02 AM EDT<\/cite><\/div>Yesterday in \""Google, But for Finding Great Stocks\"", I discussed the value of stock screeners as a powerful tool" diff --git a/inst/tests/issue_2157_sampling_overlap.txt b/inst/tests/issue_2157_sampling_overlap.txt deleted file mode 100644 index 28909049fe..0000000000 --- a/inst/tests/issue_2157_sampling_overlap.txt +++ /dev/null @@ -1,1315 +0,0 @@ -X1,X2,X3,X4,X5,X6,X7,X8 -ABCD021917,,20161130,1,1,70,678,678 -ABCD021917,,20161201,1,1,70,0,0 -ABCD021917,,20161202,1,1,70,0,0 -ABCD021917,,20161203,1,1,70,0,0 -ABCD021917,,20161204,1,1,70,0,0 -ABCD021917,,20161205,1,1,79,0,0 -ABCD021917,,20161206,1,1,79,0,0 -ABCD021917,,20161207,1,1,79,0,0 -ABCD021917,,20161208,1,1,79,0,0 -ABCD021917,,20161209,1,1,79,0,0 -ABCD021917,,20161210,1,1,79,0,0 -ABCD021917,,20161211,1,1,79,0,0 -ABCD021917,,20161212,1,1,85,0,0 -ABCD021917,,20161213,1,1,85,0,0 -ABCD021917,,20161214,1,1,85,0,0 -ABCD021917,,20161215,1,1,85,0,0 -ABCD021917,,20161216,1,1,85,0,0 -ABCD021917,,20161217,1,1,85,0,0 -ABCD021917,,20161218,1,1,85,0,0 -ABCD021917,,20161219,1,1,85,0,0 -ABCD021917,,20161220,1,1,85,0,0 -ABCD021917,,20161221,1,1,85,0,0 -ABCD021917,,20161222,1,1,85,0,0 -ABCD021917,,20161223,1,1,85,0,0 -ABCD021917,,20161224,1,1,85,0,0 -ABCD021917,,20161225,1,1,85,0,0 -ABCD021917,,20161226,1,1,85,0,0 -ABCD021917,,20161227,1,1,85,0,0 -ABCD021917,,20161228,1,1,85,0,0 -ABCD021917,,20161229,1,1,85,0,0 -ABCD021917,,20161230,1,1,85,0,0 -ABCD021917,,20161231,1,1,85,0,0 -ABCD021917,,20170101,1,1,85,0,0 -ABCD021917,,20170102,1,1,85,0,0 -ABCD021917,,20170103,1,1,85,0,0 -ABCD021917,,20170104,1,1,85,0,0 -ABCD021917,,20170105,1,1,85,0,0 -ABCD021917,,20170106,1,1,85,0,0 -ABCD021917,,20170107,1,1,85,0,0 -ABCD021917,,20170108,1,1,85,0,0 -ABCD021917,,20170109,1,1,85,0,0 -ABCD021917,,20170110,1,1,90,0,0 -ABCD021917,,20170111,1,1,90,0,0 -ABCD021917,,20170112,1,1,90,0,0 -ABCD021917,,20170113,1,1,90,0,0 -ABCD021917,,20170114,1,1,90,0,0 -ABCD021917,,20170115,1,1,90,0,0 -ABCD021917,,20170116,1,1,90,0,0 -ABCD021917,,20170117,1,1,90,0,0 -ABCD021917,,20170118,1,1,90,0,0 -ABCD021917,,20170119,1,1,90,0,0 -ABCD021917,,20170120,1,1,90,0,0 -ABCD021917,,20170121,1,1,90,0,0 -ABCD021917,,20170122,1,1,90,0,0 -ABCD021917,,20170123,1,1,90,0,0 -ABCD021917,,20170124,1,1,90,0,0 -ABCD021917,,20170125,1,1,90,0,0 -ABCD021917,,20170126,1,1,90,0,0 -ABCD021917,,20170127,1,1,90,0,0 -ABCD021917,,20170128,1,1,90,0,0 -ABCD021917,,20170129,1,1,90,0,0 -ABCD021917,,20170130,1,1,90,0,0 -ABCD021917,,20170131,1,1,90,0,0 -ABCD021917,,20170201,1,1,90,0,0 -ABCD021917,,20170202,1,1,90,0,0 -ABCD021917,,20170203,1,1,90,0,0 -ABCD021917,,20170204,1,1,90,0,0 -ABCD021917,,20170205,1,1,90,0,0 -ABCD021917,,20170206,1,1,90,0,0 -ABCD021917,,20170207,1,1,90,0,0 -ABCD021917,,20170208,1,1,90,0,0 -ABCD021917,,20170209,1,1,90,0,0 -ABCD021917,,20170210,1,1,90,0,0 -ABCD021917,,20170211,1,1,90,0,0 -ABCD021917,,20170212,1,1,90,0,0 -ABCD021917,,20170213,1,1,90,0,0 -ABCD021917,,20170214,1,1,90,0,0 -ABCD021917,,20170215,1,1,90,0,0 -ABCD021917,,20170216,1,1,90,0,0 -ABCD021917,,20170217,1,1,90,0,0 -ABCD021917,,20170218,1,1,90,0,0 -ABCD021917,,20170219,1,1,90,0,0 -ABCD021917,,20161130,2,2,50,546,546 -ABCD021917,,20161201,2,2,50,0,0 -ABCD021917,,20161202,2,2,50,0,0 -ABCD021917,,20161203,2,2,50,0,0 -ABCD021917,,20161204,2,2,50,0,0 -ABCD021917,,20161205,2,2,59,0,0 -ABCD021917,,20161206,2,2,59,0,0 -ABCD021917,,20161207,2,2,59,0,0 -ABCD021917,,20161208,2,2,59,0,0 -ABCD021917,,20161209,2,2,59,0,0 -ABCD021917,,20161210,2,2,59,0,0 -ABCD021917,,20161211,2,2,59,0,0 -ABCD021917,,20161212,2,2,65,0,0 -ABCD021917,,20161213,2,2,65,0,0 -ABCD021917,,20161214,2,2,65,0,0 -ABCD021917,,20161215,2,2,65,0,0 -ABCD021917,,20161216,2,2,65,0,0 -ABCD021917,,20161217,2,2,65,0,0 -ABCD021917,,20161218,2,2,65,0,0 -ABCD021917,,20161219,2,2,65,0,0 -ABCD021917,,20161220,2,2,65,0,0 -ABCD021917,,20161221,2,2,65,0,0 -ABCD021917,,20161222,2,2,65,0,0 -ABCD021917,,20161223,2,2,65,0,0 -ABCD021917,,20161224,2,2,65,0,0 -ABCD021917,,20161225,2,2,65,0,0 -ABCD021917,,20161226,2,2,65,0,0 -ABCD021917,,20161227,2,2,65,0,0 -ABCD021917,,20161228,2,2,65,0,0 -ABCD021917,,20161229,2,2,65,0,0 -ABCD021917,,20161230,2,2,65,0,0 -ABCD021917,,20161231,2,2,65,0,0 -ABCD021917,,20170101,2,2,65,0,0 -ABCD021917,,20170102,2,2,65,0,0 -ABCD021917,,20170103,2,2,69,0,0 -ABCD021917,,20170104,2,2,69,0,0 -ABCD021917,,20170105,2,2,69,0,0 -ABCD021917,,20170106,2,2,69,0,0 -ABCD021917,,20170107,2,2,69,0,0 -ABCD021917,,20170108,2,2,69,0,0 -ABCD021917,,20170109,2,2,69,0,0 -ABCD021917,,20170110,2,2,70,0,0 -ABCD021917,,20170111,2,2,70,0,0 -ABCD021917,,20170112,2,2,70,0,0 -ABCD021917,,20170113,2,2,70,0,0 -ABCD021917,,20170114,2,2,70,0,0 -ABCD021917,,20170115,2,2,70,0,0 -ABCD021917,,20170116,2,2,70,0,0 -ABCD021917,,20170117,2,2,70,0,0 -ABCD021917,,20170118,2,2,70,0,0 -ABCD021917,,20170119,2,2,70,0,0 -ABCD021917,,20170120,2,2,70,0,0 -ABCD021917,,20170121,2,2,70,0,0 -ABCD021917,,20170122,2,2,70,0,0 -ABCD021917,,20170123,2,2,70,0,0 -ABCD021917,,20170124,2,2,70,0,0 -ABCD021917,,20170125,2,2,70,0,0 -ABCD021917,,20170126,2,2,70,0,0 -ABCD021917,,20170127,2,2,70,0,0 -ABCD021917,,20170128,2,2,70,0,0 -ABCD021917,,20170129,2,2,70,0,0 -ABCD021917,,20170130,2,2,70,0,0 -ABCD021917,,20170131,2,2,70,0,0 -ABCD021917,,20170201,2,2,70,0,0 -ABCD021917,,20170202,2,2,70,0,0 -ABCD021917,,20170203,2,2,70,0,0 -ABCD021917,,20170204,2,2,70,0,0 -ABCD021917,,20170205,2,2,70,0,0 -ABCD021917,,20170206,2,2,70,0,0 -ABCD021917,,20170207,2,2,70,0,0 -ABCD021917,,20170208,2,2,70,0,0 -ABCD021917,,20170209,2,2,70,0,0 -ABCD021917,,20170210,2,2,70,0,0 -ABCD021917,,20170211,2,2,70,0,0 -ABCD021917,,20170212,2,2,70,0,0 -ABCD021917,,20170213,2,2,70,0,0 -ABCD021917,,20170214,2,2,70,0,0 -ABCD021917,,20170215,2,2,70,0,0 -ABCD021917,,20170216,2,2,70,0,0 -ABCD021917,,20170217,2,2,70,0,0 -ABCD021917,,20170218,2,2,70,0,0 -ABCD021917,,20170219,2,2,70,0,0 -ABCD021917,,20161130,3,3,35,37,37 -ABCD021917,,20161201,3,3,35,0,0 -ABCD021917,,20161202,3,3,35,0,0 -ABCD021917,,20161203,3,3,35,0,0 -ABCD021917,,20161204,3,3,35,0,0 -ABCD021917,,20161205,3,3,49,0,0 -ABCD021917,,20161206,3,3,49,0,0 -ABCD021917,,20161207,3,3,49,0,0 -ABCD021917,,20161208,3,3,49,0,0 -ABCD021917,,20161209,3,3,49,0,0 -ABCD021917,,20161210,3,3,49,0,0 -ABCD021917,,20161211,3,3,49,0,0 -ABCD021917,,20161212,3,3,55,0,0 -ABCD021917,,20161213,3,3,55,0,0 -ABCD021917,,20161214,3,3,55,0,0 -ABCD021917,,20161215,3,3,55,0,0 -ABCD021917,,20161216,3,3,55,0,0 -ABCD021917,,20161217,3,3,55,0,0 -ABCD021917,,20161218,3,3,55,0,0 -ABCD021917,,20161219,3,3,55,0,0 -ABCD021917,,20161220,3,3,55,0,0 -ABCD021917,,20161221,3,3,55,0,0 -ABCD021917,,20161222,3,3,55,0,0 -ABCD021917,,20161223,3,3,55,0,0 -ABCD021917,,20161224,3,3,55,0,0 -ABCD021917,,20161225,3,3,55,0,0 -ABCD021917,,20161226,3,3,55,0,0 -ABCD021917,,20161227,3,3,55,0,0 -ABCD021917,,20161228,3,3,55,0,0 -ABCD021917,,20161229,3,3,55,0,0 -ABCD021917,,20161230,3,3,55,0,0 -ABCD021917,,20161231,3,3,55,0,0 -ABCD021917,,20170101,3,3,55,0,0 -ABCD021917,,20170102,3,3,55,0,0 -ABCD021917,,20170103,3,3,55,0,0 -ABCD021917,,20170104,3,3,55,0,0 -ABCD021917,,20170105,3,3,55,0,0 -ABCD021917,,20170106,3,3,55,0,0 -ABCD021917,,20170107,3,3,55,0,0 -ABCD021917,,20170108,3,3,55,0,0 -ABCD021917,,20170109,3,3,55,0,0 -ABCD021917,,20170110,3,3,55,0,0 -ABCD021917,,20170111,3,3,55,0,0 -ABCD021917,,20170112,3,3,55,0,0 -ABCD021917,,20170113,3,3,55,0,0 -ABCD021917,,20170114,3,3,55,0,0 -ABCD021917,,20170115,3,3,55,0,0 -ABCD021917,,20170116,3,3,55,0,0 -ABCD021917,,20170117,3,3,55,0,0 -ABCD021917,,20170118,3,3,55,0,0 -ABCD021917,,20170119,3,3,55,0,0 -ABCD021917,,20170120,3,3,55,0,0 -ABCD021917,,20170121,3,3,55,0,0 -ABCD021917,,20170122,3,3,55,0,0 -ABCD021917,,20170123,3,3,55,0,0 -ABCD021917,,20170124,3,3,55,0,0 -ABCD021917,,20170125,3,3,55,0,0 -ABCD021917,,20170126,3,3,55,0,0 -ABCD021917,,20170127,3,3,55,0,0 -ABCD021917,,20170128,3,3,55,0,0 -ABCD021917,,20170129,3,3,55,0,0 -ABCD021917,,20170130,3,3,55,0,0 -ABCD021917,,20170131,3,3,55,0,0 -ABCD021917,,20170201,3,3,55,0,0 -ABCD021917,,20170202,3,3,55,0,0 -ABCD021917,,20170203,3,3,55,0,0 -ABCD021917,,20170204,3,3,55,0,0 -ABCD021917,,20170205,3,3,55,0,0 -ABCD021917,,20170206,3,3,55,0,0 -ABCD021917,,20170207,3,3,55,0,0 -ABCD021917,,20170208,3,3,55,0,0 -ABCD021917,,20170209,3,3,55,0,0 -ABCD021917,,20170210,3,3,55,0,0 -ABCD021917,,20170211,3,3,55,0,0 -ABCD021917,,20170212,3,3,55,0,0 -ABCD021917,,20170213,3,3,55,0,0 -ABCD021917,,20170214,3,3,55,0,0 -ABCD021917,,20170215,3,3,55,0,0 -ABCD021917,,20170216,3,3,55,0,0 -ABCD021917,,20170217,3,3,55,0,0 -ABCD021917,,20170218,3,3,55,0,0 -ABCD021917,,20170219,3,3,55,0,0 -ABCD022517,,20161130,1,1,70,341.626158722979,838 -ABCD022517,,20161201,1,1,70,341.626158722979,496.373841277021 -ABCD022517,,20161202,1,1,70,154.747682554042,154.747682554042 -ABCD022517,,20161203,1,1,70,0,0 -ABCD022517,,20161204,1,1,70,0,0 -ABCD022517,,20161205,1,1,70,0,0 -ABCD022517,,20161206,1,1,70,0,0 -ABCD022517,,20161207,1,1,70,0,0 -ABCD022517,,20161208,1,1,70,0,0 -ABCD022517,,20161209,1,1,70,0,0 -ABCD022517,,20161210,1,1,70,0,0 -ABCD022517,,20161211,1,1,70,0,0 -ABCD022517,,20161212,1,1,70,0,0 -ABCD022517,,20161213,1,1,70,0,0 -ABCD022517,,20161214,1,1,70,0,0 -ABCD022517,,20161215,1,1,70,0,0 -ABCD022517,,20161216,1,1,70,0,0 -ABCD022517,,20161217,1,1,70,0,0 -ABCD022517,,20161218,1,1,70,0,0 -ABCD022517,,20161219,1,1,70,0,0 -ABCD022517,,20161220,1,1,70,0,0 -ABCD022517,,20161221,1,1,70,0,0 -ABCD022517,,20161222,1,1,70,0,0 -ABCD022517,,20161223,1,1,70,0,0 -ABCD022517,,20161224,1,1,70,0,0 -ABCD022517,,20161225,1,1,70,0,0 -ABCD022517,,20161226,1,1,70,0,0 -ABCD022517,,20161227,1,1,70,0,0 -ABCD022517,,20161228,1,1,70,0,0 -ABCD022517,,20161229,1,1,70,0,0 -ABCD022517,,20161230,1,1,70,0,0 -ABCD022517,,20161231,1,1,70,0,0 -ABCD022517,,20170101,1,1,70,0,0 -ABCD022517,,20170102,1,1,70,0,0 -ABCD022517,,20170103,1,1,75,0,0 -ABCD022517,,20170104,1,1,75,0,0 -ABCD022517,,20170105,1,1,75,0,0 -ABCD022517,,20170106,1,1,75,0,0 -ABCD022517,,20170107,1,1,75,0,0 -ABCD022517,,20170108,1,1,75,0,0 -ABCD022517,,20170109,1,1,75,0,0 -ABCD022517,,20170110,1,1,80,0,0 -ABCD022517,,20170111,1,1,80,0,0 -ABCD022517,,20170112,1,1,80,0,0 -ABCD022517,,20170113,1,1,80,0,0 -ABCD022517,,20170114,1,1,80,0,0 -ABCD022517,,20170115,1,1,80,0,0 -ABCD022517,,20170116,1,1,80,0,0 -ABCD022517,,20170117,1,1,90,0,0 -ABCD022517,,20170118,1,1,90,0,0 -ABCD022517,,20170119,1,1,90,0,0 -ABCD022517,,20170120,1,1,90,0,0 -ABCD022517,,20170121,1,1,90,0,0 -ABCD022517,,20170122,1,1,90,0,0 -ABCD022517,,20170123,1,1,90,0,0 -ABCD022517,,20170124,1,1,90,0,0 -ABCD022517,,20170125,1,1,90,0,0 -ABCD022517,,20170126,1,1,90,0,0 -ABCD022517,,20170127,1,1,90,0,0 -ABCD022517,,20170128,1,1,90,0,0 -ABCD022517,,20170129,1,1,90,0,0 -ABCD022517,,20170130,1,1,90,0,0 -ABCD022517,,20170131,1,1,90,0,0 -ABCD022517,,20170201,1,1,90,0,0 -ABCD022517,,20170202,1,1,90,0,0 -ABCD022517,,20170203,1,1,90,0,0 -ABCD022517,,20170204,1,1,90,0,0 -ABCD022517,,20170205,1,1,90,0,0 -ABCD022517,,20170206,1,1,90,0,0 -ABCD022517,,20170207,1,1,90,0,0 -ABCD022517,,20170208,1,1,90,0,0 -ABCD022517,,20170209,1,1,90,0,0 -ABCD022517,,20170210,1,1,90,0,0 -ABCD022517,,20170211,1,1,90,0,0 -ABCD022517,,20170212,1,1,90,0,0 -ABCD022517,,20170213,1,1,90,0,0 -ABCD022517,,20170214,1,1,90,0,0 -ABCD022517,,20170215,1,1,90,0,0 -ABCD022517,,20170216,1,1,90,0,0 -ABCD022517,,20170217,1,1,90,0,0 -ABCD022517,,20170218,1,1,90,0,0 -ABCD022517,,20170219,1,1,90,0,0 -ABCD022517,,20170220,1,1,90,0,0 -ABCD022517,,20170221,1,1,90,0,0 -ABCD022517,,20170222,1,1,90,0,0 -ABCD022517,,20170223,1,1,90,0,0 -ABCD022517,,20170224,1,1,90,0,0 -ABCD022517,,20170225,1,1,90,0,0 -ABCD022517,,20161130,2,2,50,189.884035970867,814 -ABCD022517,,20161201,2,2,50,189.884035970867,624.115964029133 -ABCD022517,,20161202,2,2,50,189.884035970867,434.231928058266 -ABCD022517,,20161203,2,2,50,189.884035970867,244.347892087399 -ABCD022517,,20161204,2,2,50,54.4638561165316,54.4638561165316 -ABCD022517,,20161205,2,2,50,0,0 -ABCD022517,,20161206,2,2,50,0,0 -ABCD022517,,20161207,2,2,50,0,0 -ABCD022517,,20161208,2,2,50,0,0 -ABCD022517,,20161209,2,2,50,0,0 -ABCD022517,,20161210,2,2,50,0,0 -ABCD022517,,20161211,2,2,50,0,0 -ABCD022517,,20161212,2,2,50,0,0 -ABCD022517,,20161213,2,2,50,0,0 -ABCD022517,,20161214,2,2,50,0,0 -ABCD022517,,20161215,2,2,50,0,0 -ABCD022517,,20161216,2,2,50,0,0 -ABCD022517,,20161217,2,2,50,0,0 -ABCD022517,,20161218,2,2,50,0,0 -ABCD022517,,20161219,2,2,50,0,0 -ABCD022517,,20161220,2,2,50,0,0 -ABCD022517,,20161221,2,2,50,0,0 -ABCD022517,,20161222,2,2,50,0,0 -ABCD022517,,20161223,2,2,50,0,0 -ABCD022517,,20161224,2,2,50,0,0 -ABCD022517,,20161225,2,2,50,0,0 -ABCD022517,,20161226,2,2,50,0,0 -ABCD022517,,20161227,2,2,50,0,0 -ABCD022517,,20161228,2,2,50,0,0 -ABCD022517,,20161229,2,2,50,0,0 -ABCD022517,,20161230,2,2,50,0,0 -ABCD022517,,20161231,2,2,50,0,0 -ABCD022517,,20170101,2,2,50,0,0 -ABCD022517,,20170102,2,2,50,0,0 -ABCD022517,,20170103,2,2,55,0,0 -ABCD022517,,20170104,2,2,55,0,0 -ABCD022517,,20170105,2,2,55,0,0 -ABCD022517,,20170106,2,2,55,0,0 -ABCD022517,,20170107,2,2,55,0,0 -ABCD022517,,20170108,2,2,55,0,0 -ABCD022517,,20170109,2,2,55,0,0 -ABCD022517,,20170110,2,2,60,0,0 -ABCD022517,,20170111,2,2,60,0,0 -ABCD022517,,20170112,2,2,60,0,0 -ABCD022517,,20170113,2,2,60,0,0 -ABCD022517,,20170114,2,2,60,0,0 -ABCD022517,,20170115,2,2,60,0,0 -ABCD022517,,20170116,2,2,60,0,0 -ABCD022517,,20170117,2,2,70,0,0 -ABCD022517,,20170118,2,2,70,0,0 -ABCD022517,,20170119,2,2,70,0,0 -ABCD022517,,20170120,2,2,70,0,0 -ABCD022517,,20170121,2,2,70,0,0 -ABCD022517,,20170122,2,2,70,0,0 -ABCD022517,,20170123,2,2,70,0,0 -ABCD022517,,20170124,2,2,70,0,0 -ABCD022517,,20170125,2,2,70,0,0 -ABCD022517,,20170126,2,2,70,0,0 -ABCD022517,,20170127,2,2,70,0,0 -ABCD022517,,20170128,2,2,70,0,0 -ABCD022517,,20170129,2,2,70,0,0 -ABCD022517,,20170130,2,2,70,0,0 -ABCD022517,,20170131,2,2,70,0,0 -ABCD022517,,20170201,2,2,70,0,0 -ABCD022517,,20170202,2,2,70,0,0 -ABCD022517,,20170203,2,2,70,0,0 -ABCD022517,,20170204,2,2,70,0,0 -ABCD022517,,20170205,2,2,70,0,0 -ABCD022517,,20170206,2,2,70,0,0 -ABCD022517,,20170207,2,2,70,0,0 -ABCD022517,,20170208,2,2,70,0,0 -ABCD022517,,20170209,2,2,70,0,0 -ABCD022517,,20170210,2,2,70,0,0 -ABCD022517,,20170211,2,2,70,0,0 -ABCD022517,,20170212,2,2,70,0,0 -ABCD022517,,20170213,2,2,70,0,0 -ABCD022517,,20170214,2,2,70,0,0 -ABCD022517,,20170215,2,2,70,0,0 -ABCD022517,,20170216,2,2,70,0,0 -ABCD022517,,20170217,2,2,70,0,0 -ABCD022517,,20170218,2,2,70,0,0 -ABCD022517,,20170219,2,2,70,0,0 -ABCD022517,,20170220,2,2,70,0,0 -ABCD022517,,20170221,2,2,70,0,0 -ABCD022517,,20170222,2,2,70,0,0 -ABCD022517,,20170223,2,2,70,0,0 -ABCD022517,,20170224,2,2,70,0,0 -ABCD022517,,20170225,2,2,70,0,0 -ABCD022517,,20161130,3,3,35,56.7052834584873,193 -ABCD022517,,20161201,3,3,35,56.7052834584873,136.294716541513 -ABCD022517,,20161202,3,3,35,56.7052834584873,79.5894330830255 -ABCD022517,,20161203,3,3,35,22.8841496245382,22.8841496245382 -ABCD022517,,20161204,3,3,35,0,0 -ABCD022517,,20161205,3,3,35,0,0 -ABCD022517,,20161206,3,3,35,0,0 -ABCD022517,,20161207,3,3,35,0,0 -ABCD022517,,20161208,3,3,35,0,0 -ABCD022517,,20161209,3,3,35,0,0 -ABCD022517,,20161210,3,3,35,0,0 -ABCD022517,,20161211,3,3,35,0,0 -ABCD022517,,20161212,3,3,35,0,0 -ABCD022517,,20161213,3,3,35,0,0 -ABCD022517,,20161214,3,3,35,0,0 -ABCD022517,,20161215,3,3,35,0,0 -ABCD022517,,20161216,3,3,35,0,0 -ABCD022517,,20161217,3,3,35,0,0 -ABCD022517,,20161218,3,3,35,0,0 -ABCD022517,,20161219,3,3,35,0,0 -ABCD022517,,20161220,3,3,35,0,0 -ABCD022517,,20161221,3,3,35,0,0 -ABCD022517,,20161222,3,3,35,0,0 -ABCD022517,,20161223,3,3,35,0,0 -ABCD022517,,20161224,3,3,35,0,0 -ABCD022517,,20161225,3,3,35,0,0 -ABCD022517,,20161226,3,3,35,0,0 -ABCD022517,,20161227,3,3,35,0,0 -ABCD022517,,20161228,3,3,35,0,0 -ABCD022517,,20161229,3,3,35,0,0 -ABCD022517,,20161230,3,3,35,0,0 -ABCD022517,,20161231,3,3,35,0,0 -ABCD022517,,20170101,3,3,35,0,0 -ABCD022517,,20170102,3,3,35,0,0 -ABCD022517,,20170103,3,3,40,0,0 -ABCD022517,,20170104,3,3,40,0,0 -ABCD022517,,20170105,3,3,40,0,0 -ABCD022517,,20170106,3,3,40,0,0 -ABCD022517,,20170107,3,3,40,0,0 -ABCD022517,,20170108,3,3,40,0,0 -ABCD022517,,20170109,3,3,40,0,0 -ABCD022517,,20170110,3,3,45,0,0 -ABCD022517,,20170111,3,3,45,0,0 -ABCD022517,,20170112,3,3,45,0,0 -ABCD022517,,20170113,3,3,45,0,0 -ABCD022517,,20170114,3,3,45,0,0 -ABCD022517,,20170115,3,3,45,0,0 -ABCD022517,,20170116,3,3,45,0,0 -ABCD022517,,20170117,3,3,55,0,0 -ABCD022517,,20170118,3,3,55,0,0 -ABCD022517,,20170119,3,3,55,0,0 -ABCD022517,,20170120,3,3,55,0,0 -ABCD022517,,20170121,3,3,55,0,0 -ABCD022517,,20170122,3,3,55,0,0 -ABCD022517,,20170123,3,3,55,0,0 -ABCD022517,,20170124,3,3,55,0,0 -ABCD022517,,20170125,3,3,55,0,0 -ABCD022517,,20170126,3,3,55,0,0 -ABCD022517,,20170127,3,3,55,0,0 -ABCD022517,,20170128,3,3,55,0,0 -ABCD022517,,20170129,3,3,55,0,0 -ABCD022517,,20170130,3,3,55,0,0 -ABCD022517,,20170131,3,3,55,0,0 -ABCD022517,,20170201,3,3,55,0,0 -ABCD022517,,20170202,3,3,55,0,0 -ABCD022517,,20170203,3,3,55,0,0 -ABCD022517,,20170204,3,3,55,0,0 -ABCD022517,,20170205,3,3,55,0,0 -ABCD022517,,20170206,3,3,55,0,0 -ABCD022517,,20170207,3,3,55,0,0 -ABCD022517,,20170208,3,3,55,0,0 -ABCD022517,,20170209,3,3,55,0,0 -ABCD022517,,20170210,3,3,55,0,0 -ABCD022517,,20170211,3,3,55,0,0 -ABCD022517,,20170212,3,3,55,0,0 -ABCD022517,,20170213,3,3,55,0,0 -ABCD022517,,20170214,3,3,55,0,0 -ABCD022517,,20170215,3,3,55,0,0 -ABCD022517,,20170216,3,3,55,0,0 -ABCD022517,,20170217,3,3,55,0,0 -ABCD022517,,20170218,3,3,55,0,0 -ABCD022517,,20170219,3,3,55,0,0 -ABCD022517,,20170220,3,3,55,0,0 -ABCD022517,,20170221,3,3,55,0,0 -ABCD022517,,20170222,3,3,55,0,0 -ABCD022517,,20170223,3,3,55,0,0 -ABCD022517,,20170224,3,3,55,0,0 -ABCD022517,,20170225,3,3,55,0,0 -ABCD030217,,20161130,1,1,75,1.84434263624939,1489 -ABCD030217,,20161201,1,1,75,1.84434263624917,1487.15565736375 -ABCD030217,,20161202,1,1,75,1.84434263624939,1485.3113147275 -ABCD030217,,20161203,1,1,75,1.84434263624917,1483.46697209125 -ABCD030217,,20161204,1,1,75,1.84434263624939,1481.622629455 -ABCD030217,,20161205,1,1,85,1.35275797688701,1479.77828681875 -ABCD030217,,20161206,1,1,85,1.35275797688701,1478.42552884187 -ABCD030217,,20161207,1,1,85,1.35275797688701,1477.07277086498 -ABCD030217,,20161208,1,1,85,1.35275797688701,1475.72001288809 -ABCD030217,,20161209,1,1,85,1.35275797688723,1474.36725491121 -ABCD030217,,20161210,1,1,85,1.35275797688701,1473.01449693432 -ABCD030217,,20161211,1,1,85,1.35275797688701,1471.66173895743 -ABCD030217,,20161212,1,1,85,1.35275797688701,1470.30898098054 -ABCD030217,,20161213,1,1,85,1.35275797688701,1468.95622300366 -ABCD030217,,20161214,1,1,85,1.35275797688701,1467.60346502677 -ABCD030217,,20161215,1,1,85,1.35275797688701,1466.25070704988 -ABCD030217,,20161216,1,1,85,1.35275797688701,1464.897949073 -ABCD030217,,20161217,1,1,85,1.35275797688701,1463.54519109611 -ABCD030217,,20161218,1,1,85,1.35275797688723,1462.19243311922 -ABCD030217,,20161219,1,1,85,1.35275797688701,1460.83967514234 -ABCD030217,,20161220,1,1,85,1.35275797688701,1459.48691716545 -ABCD030217,,20161221,1,1,85,1.35275797688701,1458.13415918856 -ABCD030217,,20161222,1,1,85,1.35275797688701,1456.78140121167 -ABCD030217,,20161223,1,1,85,1.35275797688701,1455.42864323479 -ABCD030217,,20161224,1,1,85,1.35275797688701,1454.0758852579 -ABCD030217,,20161225,1,1,85,1.35275797688701,1452.72312728101 -ABCD030217,,20161226,1,1,85,1.35275797688701,1451.37036930413 -ABCD030217,,20161227,1,1,85,1.35275797688723,1450.01761132724 -ABCD030217,,20161228,1,1,85,1.35275797688701,1448.66485335035 -ABCD030217,,20161229,1,1,85,1.35275797688701,1447.31209537346 -ABCD030217,,20161230,1,1,85,1.35275797688701,1445.95933739658 -ABCD030217,,20161231,1,1,85,1.35275797688701,1444.60657941969 -ABCD030217,,20170101,1,1,85,1.35275797688701,1443.2538214428 -ABCD030217,,20170102,1,1,85,1.35275797688701,1441.90106346592 -ABCD030217,,20170103,1,1,85,1.35275797688701,1440.54830548903 -ABCD030217,,20170104,1,1,85,1.35275797688701,1439.19554751214 -ABCD030217,,20170105,1,1,85,1.35275797688701,1437.84278953526 -ABCD030217,,20170106,1,1,85,1.35275797688723,1436.49003155837 -ABCD030217,,20170107,1,1,85,1.35275797688701,1435.13727358148 -ABCD030217,,20170108,1,1,85,1.35275797688701,1433.78451560459 -ABCD030217,,20170109,1,1,85,1.35275797688701,1432.43175762771 -ABCD030217,,20170110,1,1,85,1.8443404775212,1431.07899965082 -ABCD030217,,20170111,1,1,85,1.84434047752097,1429.2346591733 -ABCD030217,,20170112,1,1,85,1.8443404775212,1427.39031869578 -ABCD030217,,20170113,1,1,85,1.84434047752097,1425.54597821826 -ABCD030217,,20170114,1,1,85,1.8443404775212,1423.70163774074 -ABCD030217,,20170115,1,1,85,1.84434047752097,1421.85729726321 -ABCD030217,,20170116,1,1,85,1.8443404775212,1420.01295678569 -ABCD030217,,20170117,1,1,75,2.51439057993866,1418.16861630817 -ABCD030217,,20170118,1,1,75,2.51439057993844,1415.65422572823 -ABCD030217,,20170119,1,1,75,2.51439057993866,1413.1398351483 -ABCD030217,,20170120,1,1,75,2.51439057993866,1410.62544456836 -ABCD030217,,20170121,1,1,75,2.51439057993844,1408.11105398842 -ABCD030217,,20170122,1,1,75,2.51439057993866,1405.59666340848 -ABCD030217,,20170123,1,1,75,2.51439057993866,1403.08227282854 -ABCD030217,,20170124,1,1,75,2.51439057993866,1400.5678822486 -ABCD030217,,20170125,1,1,75,2.51439057993844,1398.05349166866 -ABCD030217,,20170126,1,1,75,2.51439057993866,1395.53910108873 -ABCD030217,,20170127,1,1,75,2.51439057993866,1393.02471050879 -ABCD030217,,20170128,1,1,75,2.51439057993844,1390.51031992885 -ABCD030217,,20170129,1,1,75,2.51439057993866,1387.99592934891 -ABCD030217,,20170130,1,1,75,2.51439057993866,1385.48153876897 -ABCD030217,,20170131,1,1,75,2.51439057993844,1382.96714818903 -ABCD030217,,20170201,1,1,75,2.51439057993866,1380.45275760909 -ABCD030217,,20170202,1,1,75,2.51439057993866,1377.93836702916 -ABCD030217,,20170203,1,1,75,2.51439057993844,1375.42397644922 -ABCD030217,,20170204,1,1,75,2.51439057993866,1372.90958586928 -ABCD030217,,20170205,1,1,75,2.51439057993866,1370.39519528934 -ABCD030217,,20170206,1,1,75,2.51439057993866,1367.8808047094 -ABCD030217,,20170207,1,1,75,2.51439057993844,1365.36641412946 -ABCD030217,,20170208,1,1,75,2.51439057993866,1362.85202354952 -ABCD030217,,20170209,1,1,75,2.51439057993866,1360.33763296959 -ABCD030217,,20170210,1,1,75,2.51439057993844,1357.82324238965 -ABCD030217,,20170211,1,1,75,2.51439057993866,1355.30885180971 -ABCD030217,,20170212,1,1,75,2.51439057993866,1352.79446122977 -ABCD030217,,20170213,1,1,75,2.51439057993844,1350.28007064983 -ABCD030217,,20170214,1,1,69,3.63726382671143,1347.76568006989 -ABCD030217,,20170215,1,1,69,3.63726382671143,1344.12841624318 -ABCD030217,,20170216,1,1,69,3.63726382671143,1340.49115241647 -ABCD030217,,20170217,1,1,69,3.63726382671143,1336.85388858976 -ABCD030217,,20170218,1,1,69,3.63726382671143,1333.21662476305 -ABCD030217,,20170219,1,1,69,3.63726382671143,1329.57936093634 -ABCD030217,,20170220,1,1,69,3.63726382671143,1325.94209710962 -ABCD030217,,20170221,1,1,69,3.63726382671121,1322.30483328291 -ABCD030217,,20170222,1,1,69,3.63726382671143,1318.6675694562 -ABCD030217,,20170223,1,1,69,3.63726382671143,1315.03030562949 -ABCD030217,,20170224,1,1,69,5.41769990001808,1311.39304180278 -ABCD030217,,20170225,1,1,69,5.41769990001808,1305.97534190276 -ABCD030217,,20170226,1,1,69,5.41769990001785,1300.55764200274 -ABCD030217,,20170227,1,1,69,5.41769990001808,1295.13994210272 -ABCD030217,,20161130,2,2,50,2.42306155926707,510 -ABCD030217,,20161201,2,2,50,2.42306155926707,507.576938440733 -ABCD030217,,20161202,2,2,50,2.42306155926707,505.153876881466 -ABCD030217,,20161203,2,2,50,2.42306155926701,502.730815322199 -ABCD030217,,20161204,2,2,50,2.42306155926707,500.307753762932 -ABCD030217,,20161205,2,2,55,2.04796610271882,497.884692203665 -ABCD030217,,20161206,2,2,55,2.04796610271887,495.836726100946 -ABCD030217,,20161207,2,2,55,2.04796610271882,493.788759998227 -ABCD030217,,20161208,2,2,55,2.04796610271887,491.740793895508 -ABCD030217,,20161209,2,2,55,2.04796610271882,489.692827792789 -ABCD030217,,20161210,2,2,55,2.04796610271882,487.644861690071 -ABCD030217,,20161211,2,2,55,2.04796610271887,485.596895587352 -ABCD030217,,20161212,2,2,55,2.04796610271882,483.548929484633 -ABCD030217,,20161213,2,2,55,2.04796610271887,481.500963381914 -ABCD030217,,20161214,2,2,55,2.04796610271882,479.452997279195 -ABCD030217,,20161215,2,2,55,2.04796610271882,477.405031176476 -ABCD030217,,20161216,2,2,55,2.04796610271887,475.357065073758 -ABCD030217,,20161217,2,2,55,2.04796610271882,473.309098971039 -ABCD030217,,20161218,2,2,55,2.04796610271887,471.26113286832 -ABCD030217,,20161219,2,2,55,2.04796610271882,469.213166765601 -ABCD030217,,20161220,2,2,55,2.04796610271882,467.165200662882 -ABCD030217,,20161221,2,2,55,2.04796610271887,465.117234560163 -ABCD030217,,20161222,2,2,55,2.04796610271882,463.069268457444 -ABCD030217,,20161223,2,2,55,2.04796610271887,461.021302354726 -ABCD030217,,20161224,2,2,55,2.04796610271882,458.973336252007 -ABCD030217,,20161225,2,2,55,2.04796610271882,456.925370149288 -ABCD030217,,20161226,2,2,55,2.04796610271887,454.877404046569 -ABCD030217,,20161227,2,2,55,2.04796610271882,452.82943794385 -ABCD030217,,20161228,2,2,55,2.04796610271887,450.781471841131 -ABCD030217,,20161229,2,2,55,2.04796610271882,448.733505738413 -ABCD030217,,20161230,2,2,55,2.04796610271882,446.685539635694 -ABCD030217,,20161231,2,2,55,2.04796610271887,444.637573532975 -ABCD030217,,20170101,2,2,55,2.04796610271882,442.589607430256 -ABCD030217,,20170102,2,2,55,2.04796610271882,440.541641327537 -ABCD030217,,20170103,2,2,55,2.04796610271887,438.493675224818 -ABCD030217,,20170104,2,2,55,2.04796610271882,436.4457091221 -ABCD030217,,20170105,2,2,55,2.04796610271887,434.397743019381 -ABCD030217,,20170106,2,2,55,2.04796610271882,432.349776916662 -ABCD030217,,20170107,2,2,55,2.04796610271887,430.301810813943 -ABCD030217,,20170108,2,2,55,2.04796610271882,428.253844711224 -ABCD030217,,20170109,2,2,55,2.04796610271882,426.205878608505 -ABCD030217,,20170110,2,2,60,0.850672940935851,424.157912505787 -ABCD030217,,20170111,2,2,60,0.850672940935851,423.307239564851 -ABCD030217,,20170112,2,2,60,0.850672940935851,422.456566623915 -ABCD030217,,20170113,2,2,60,0.850672940935851,421.605893682979 -ABCD030217,,20170114,2,2,60,0.850672940935851,420.755220742043 -ABCD030217,,20170115,2,2,60,0.850672940935851,419.904547801107 -ABCD030217,,20170116,2,2,60,0.850672940935851,419.053874860171 -ABCD030217,,20170117,2,2,55,0.886342820594336,418.203201919236 -ABCD030217,,20170118,2,2,55,0.88634282059428,417.316859098641 -ABCD030217,,20170119,2,2,55,0.886342820594336,416.430516278047 -ABCD030217,,20170120,2,2,55,0.88634282059428,415.544173457453 -ABCD030217,,20170121,2,2,55,0.886342820594336,414.657830636858 -ABCD030217,,20170122,2,2,55,0.88634282059428,413.771487816264 -ABCD030217,,20170123,2,2,55,0.886342820594336,412.88514499567 -ABCD030217,,20170124,2,2,55,0.886342820594336,411.998802175075 -ABCD030217,,20170125,2,2,55,0.88634282059428,411.112459354481 -ABCD030217,,20170126,2,2,55,0.886342820594336,410.226116533887 -ABCD030217,,20170127,2,2,55,0.88634282059428,409.339773713292 -ABCD030217,,20170128,2,2,55,0.886342820594336,408.453430892698 -ABCD030217,,20170129,2,2,55,0.88634282059428,407.567088072104 -ABCD030217,,20170130,2,2,55,0.886342820594336,406.68074525151 -ABCD030217,,20170131,2,2,55,0.886342820594336,405.794402430915 -ABCD030217,,20170201,2,2,55,0.88634282059428,404.908059610321 -ABCD030217,,20170202,2,2,55,0.886342820594336,404.021716789727 -ABCD030217,,20170203,2,2,55,0.88634282059428,403.135373969132 -ABCD030217,,20170204,2,2,55,0.886342820594336,402.249031148538 -ABCD030217,,20170205,2,2,55,0.886342820594336,401.362688327944 -ABCD030217,,20170206,2,2,55,0.88634282059428,400.476345507349 -ABCD030217,,20170207,2,2,55,0.886342820594336,399.590002686755 -ABCD030217,,20170208,2,2,55,0.88634282059428,398.703659866161 -ABCD030217,,20170209,2,2,55,0.886342820594336,397.817317045566 -ABCD030217,,20170210,2,2,55,0.88634282059428,396.930974224972 -ABCD030217,,20170211,2,2,55,0.886342820594336,396.044631404378 -ABCD030217,,20170212,2,2,55,0.886342820594336,395.158288583783 -ABCD030217,,20170213,2,2,55,0.88634282059428,394.271945763189 -ABCD030217,,20170214,2,2,55,0.137727254568006,393.385602942595 -ABCD030217,,20170215,2,2,55,0.137727254568063,393.247875688027 -ABCD030217,,20170216,2,2,55,0.137727254568006,393.110148433459 -ABCD030217,,20170217,2,2,55,0.137727254568063,392.972421178891 -ABCD030217,,20170218,2,2,55,0.137727254568006,392.834693924323 -ABCD030217,,20170219,2,2,55,0.137727254568063,392.696966669755 -ABCD030217,,20170220,2,2,55,0.137727254568006,392.559239415187 -ABCD030217,,20170221,2,2,55,0.137727254568063,392.421512160619 -ABCD030217,,20170222,2,2,55,0.137727254568006,392.283784906051 -ABCD030217,,20170223,2,2,55,0.137727254568063,392.146057651483 -ABCD030217,,20170224,2,2,55,0.205144572638176,392.008330396914 -ABCD030217,,20170225,2,2,55,0.205144572638176,391.803185824276 -ABCD030217,,20170226,2,2,55,0.205144572638119,391.598041251638 -ABCD030217,,20170227,2,2,55,0.205144572638176,391.392896679 -ABCD030217,,20161130,3,3,35,1.89209980906128,501 -ABCD030217,,20161201,3,3,35,1.89209980906122,499.107900190939 -ABCD030217,,20161202,3,3,35,1.89209980906128,497.215800381878 -ABCD030217,,20161203,3,3,35,1.89209980906128,495.323700572816 -ABCD030217,,20161204,3,3,35,1.89209980906122,493.431600763755 -ABCD030217,,20161205,3,3,35,2.75454509136068,491.539500954694 -ABCD030217,,20161206,3,3,35,2.75454509136063,488.784955863333 -ABCD030217,,20161207,3,3,35,2.75454509136068,486.030410771972 -ABCD030217,,20161208,3,3,35,2.75454509136063,483.275865680612 -ABCD030217,,20161209,3,3,35,2.75454509136068,480.521320589251 -ABCD030217,,20161210,3,3,35,2.75454509136063,477.76677549789 -ABCD030217,,20161211,3,3,35,2.75454509136068,475.01223040653 -ABCD030217,,20161212,3,3,35,2.75454509136063,472.257685315169 -ABCD030217,,20161213,3,3,35,2.75454509136068,469.503140223809 -ABCD030217,,20161214,3,3,35,2.75454509136063,466.748595132448 -ABCD030217,,20161215,3,3,35,2.75454509136068,463.994050041087 -ABCD030217,,20161216,3,3,35,2.75454509136063,461.239504949727 -ABCD030217,,20161217,3,3,35,2.75454509136068,458.484959858366 -ABCD030217,,20161218,3,3,35,2.75454509136068,455.730414767005 -ABCD030217,,20161219,3,3,35,2.75454509136063,452.975869675645 -ABCD030217,,20161220,3,3,35,2.75454509136068,450.221324584284 -ABCD030217,,20161221,3,3,35,2.75454509136063,447.466779492923 -ABCD030217,,20161222,3,3,35,2.75454509136068,444.712234401563 -ABCD030217,,20161223,3,3,35,2.75454509136063,441.957689310202 -ABCD030217,,20161224,3,3,35,2.75454509136068,439.203144218841 -ABCD030217,,20161225,3,3,35,2.75454509136063,436.448599127481 -ABCD030217,,20161226,3,3,35,2.75454509136068,433.69405403612 -ABCD030217,,20161227,3,3,35,2.75454509136063,430.939508944759 -ABCD030217,,20161228,3,3,35,2.75454509136068,428.184963853399 -ABCD030217,,20161229,3,3,35,2.75454509136063,425.430418762038 -ABCD030217,,20161230,3,3,35,2.75454509136068,422.675873670677 -ABCD030217,,20161231,3,3,35,2.75454509136068,419.921328579317 -ABCD030217,,20170101,3,3,35,2.75454509136063,417.166783487956 -ABCD030217,,20170102,3,3,35,2.75454509136068,414.412238396595 -ABCD030217,,20170103,3,3,35,2.75454509136063,411.657693305235 -ABCD030217,,20170104,3,3,35,2.75454509136068,408.903148213874 -ABCD030217,,20170105,3,3,35,2.75454509136063,406.148603122513 -ABCD030217,,20170106,3,3,35,2.75454509136068,403.394058031153 -ABCD030217,,20170107,3,3,35,2.75454509136063,400.639512939792 -ABCD030217,,20170108,3,3,35,2.75454509136068,397.884967848431 -ABCD030217,,20170109,3,3,35,2.75454509136068,395.130422757071 -ABCD030217,,20170110,3,3,35,3.45953665130025,392.37587766571 -ABCD030217,,20170111,3,3,35,3.45953665130025,388.91634101441 -ABCD030217,,20170112,3,3,35,3.45953665130025,385.45680436311 -ABCD030217,,20170113,3,3,35,3.45953665130025,381.997267711809 -ABCD030217,,20170114,3,3,35,3.45953665130025,378.537731060509 -ABCD030217,,20170115,3,3,35,3.45953665130025,375.078194409209 -ABCD030217,,20170116,3,3,35,3.45953665130025,371.618657757909 -ABCD030217,,20170117,3,3,35,2.75454509136068,368.159121106608 -ABCD030217,,20170118,3,3,35,2.75454509136063,365.404576015248 -ABCD030217,,20170119,3,3,35,2.75454509136068,362.650030923887 -ABCD030217,,20170120,3,3,35,2.75454509136063,359.895485832526 -ABCD030217,,20170121,3,3,35,2.75454509136068,357.140940741166 -ABCD030217,,20170122,3,3,35,2.75454509136063,354.386395649805 -ABCD030217,,20170123,3,3,35,2.75454509136068,351.631850558444 -ABCD030217,,20170124,3,3,35,2.75454509136063,348.877305467084 -ABCD030217,,20170125,3,3,35,2.75454509136068,346.122760375723 -ABCD030217,,20170126,3,3,35,2.75454509136063,343.368215284362 -ABCD030217,,20170127,3,3,35,2.75454509136068,340.613670193002 -ABCD030217,,20170128,3,3,35,2.75454509136063,337.859125101641 -ABCD030217,,20170129,3,3,35,2.75454509136068,335.10458001028 -ABCD030217,,20170130,3,3,35,2.75454509136068,332.35003491892 -ABCD030217,,20170131,3,3,35,2.75454509136063,329.595489827559 -ABCD030217,,20170201,3,3,35,2.75454509136068,326.840944736198 -ABCD030217,,20170202,3,3,35,2.75454509136063,324.086399644838 -ABCD030217,,20170203,3,3,35,2.75454509136068,321.331854553477 -ABCD030217,,20170204,3,3,35,2.75454509136063,318.577309462116 -ABCD030217,,20170205,3,3,35,2.75454509136068,315.822764370756 -ABCD030217,,20170206,3,3,35,2.75454509136063,313.068219279395 -ABCD030217,,20170207,3,3,35,2.75454509136068,310.313674188035 -ABCD030217,,20170208,3,3,35,2.75454509136063,307.559129096674 -ABCD030217,,20170209,3,3,35,2.75454509136068,304.804584005313 -ABCD030217,,20170210,3,3,35,2.75454509136063,302.050038913953 -ABCD030217,,20170211,3,3,35,2.75454509136068,299.295493822592 -ABCD030217,,20170212,3,3,35,2.75454509136068,296.540948731231 -ABCD030217,,20170213,3,3,35,2.75454509136063,293.786403639871 -ABCD030217,,20170214,3,3,35,2.75454509136068,291.03185854851 -ABCD030217,,20170215,3,3,35,2.75454509136063,288.277313457149 -ABCD030217,,20170216,3,3,35,2.75454509136068,285.522768365789 -ABCD030217,,20170217,3,3,35,2.75454509136063,282.768223274428 -ABCD030217,,20170218,3,3,35,2.75454509136068,280.013678183067 -ABCD030217,,20170219,3,3,35,2.75454509136063,277.259133091707 -ABCD030217,,20170220,3,3,35,2.75454509136068,274.504588000346 -ABCD030217,,20170221,3,3,35,2.75454509136063,271.750042908985 -ABCD030217,,20170222,3,3,35,2.75454509136068,268.995497817625 -ABCD030217,,20170223,3,3,35,2.75454509136063,266.240952726264 -ABCD030217,,20170224,3,3,35,4.1028914527634,263.486407634903 -ABCD030217,,20170225,3,3,35,4.10289145276334,259.38351618214 -ABCD030217,,20170226,3,3,35,4.10289145276337,255.280624729377 -ABCD030217,,20170227,3,3,35,4.10289145276337,251.177733276613 -ABCD030917,,20161130,1,1,70,2.81463127701727,2690 -ABCD030917,,20161201,1,1,70,2.81463127701727,2687.18536872298 -ABCD030917,,20161202,1,1,70,2.81463127701682,2684.37073744597 -ABCD030917,,20161203,1,1,70,2.81463127701727,2681.55610616895 -ABCD030917,,20161204,1,1,70,2.81463127701727,2678.74147489193 -ABCD030917,,20161205,1,1,69,2.81493615406816,2675.92684361491 -ABCD030917,,20161206,1,1,69,2.81493615406862,2673.11190746085 -ABCD030917,,20161207,1,1,69,2.81493615406816,2670.29697130678 -ABCD030917,,20161208,1,1,69,2.81493615406816,2667.48203515271 -ABCD030917,,20161209,1,1,69,2.81493615406862,2664.66709899864 -ABCD030917,,20161210,1,1,69,2.81493615406816,2661.85216284457 -ABCD030917,,20161211,1,1,69,2.81493615406816,2659.0372266905 -ABCD030917,,20161212,1,1,69,2.81493615406862,2656.22229053644 -ABCD030917,,20161213,1,1,69,2.81493615406816,2653.40735438237 -ABCD030917,,20161214,1,1,69,2.81493615406816,2650.5924182283 -ABCD030917,,20161215,1,1,69,2.81493615406862,2647.77748207423 -ABCD030917,,20161216,1,1,69,2.81493615406816,2644.96254592016 -ABCD030917,,20161217,1,1,69,2.81493615406816,2642.14760976609 -ABCD030917,,20161218,1,1,69,2.81493615406862,2639.33267361203 -ABCD030917,,20161219,1,1,60,2.81710519296757,2636.51773745796 -ABCD030917,,20161220,1,1,60,2.81710519296712,2633.70063226499 -ABCD030917,,20161221,1,1,60,2.81710519296757,2630.88352707202 -ABCD030917,,20161222,1,1,60,2.81710519296712,2628.06642187906 -ABCD030917,,20161223,1,1,60,2.81710519296757,2625.24931668609 -ABCD030917,,20161224,1,1,60,2.81710519296757,2622.43221149312 -ABCD030917,,20161225,1,1,60,2.81710519296712,2619.61510630015 -ABCD030917,,20161226,1,1,60,2.81710519296757,2616.79800110719 -ABCD030917,,20161227,1,1,60,2.81710519296757,2613.98089591422 -ABCD030917,,20161228,1,1,60,2.81710519296712,2611.16379072125 -ABCD030917,,20161229,1,1,60,2.81710519296757,2608.34668552828 -ABCD030917,,20161230,1,1,60,2.81710519296712,2605.52958033532 -ABCD030917,,20161231,1,1,60,2.81710519296757,2602.71247514235 -ABCD030917,,20170101,1,1,60,2.81710519296757,2599.89536994938 -ABCD030917,,20170102,1,1,60,2.81710519296712,2597.07826475641 -ABCD030917,,20170103,1,1,60,2.81710519296757,2594.26115956345 -ABCD030917,,20170104,1,1,60,2.81710519296712,2591.44405437048 -ABCD030917,,20170105,1,1,60,2.81710519296757,2588.62694917751 -ABCD030917,,20170106,1,1,60,2.81710519296712,2585.80984398454 -ABCD030917,,20170107,1,1,60,2.81710519296757,2582.99273879158 -ABCD030917,,20170108,1,1,60,2.81710519296757,2580.17563359861 -ABCD030917,,20170109,1,1,60,2.81710519296712,2577.35852840564 -ABCD030917,,20170110,1,1,60,2.81710519296757,2574.54142321268 -ABCD030917,,20170111,1,1,60,2.81710519296757,2571.72431801971 -ABCD030917,,20170112,1,1,60,2.81710519296712,2568.90721282674 -ABCD030917,,20170113,1,1,60,2.81710519296757,2566.09010763377 -ABCD030917,,20170114,1,1,60,2.81710519296712,2563.27300244081 -ABCD030917,,20170115,1,1,60,2.81710519296757,2560.45589724784 -ABCD030917,,20170116,1,1,60,2.81710519296757,2557.63879205487 -ABCD030917,,20170117,1,1,60,2.81710519296712,2554.8216868619 -ABCD030917,,20170118,1,1,60,2.81710519296757,2552.00458166894 -ABCD030917,,20170119,1,1,60,2.81710519296712,2549.18747647597 -ABCD030917,,20170120,1,1,60,2.81710519296757,2546.370371283 -ABCD030917,,20170121,1,1,60,2.81710519296757,2543.55326609003 -ABCD030917,,20170122,1,1,60,2.81710519296712,2540.73616089707 -ABCD030917,,20170123,1,1,60,2.81710519296757,2537.9190557041 -ABCD030917,,20170124,1,1,60,2.81710519296712,2535.10195051113 -ABCD030917,,20170125,1,1,60,2.81710519296757,2532.28484531816 -ABCD030917,,20170126,1,1,60,2.81710519296757,2529.4677401252 -ABCD030917,,20170127,1,1,60,2.81710519296712,2526.65063493223 -ABCD030917,,20170128,1,1,60,2.81710519296757,2523.83352973926 -ABCD030917,,20170129,1,1,60,2.81710519296757,2521.01642454629 -ABCD030917,,20170130,1,1,60,2.81710519296712,2518.19931935333 -ABCD030917,,20170131,1,1,60,2.81710519296757,2515.38221416036 -ABCD030917,,20170201,1,1,60,2.81710519296712,2512.56510896739 -ABCD030917,,20170202,1,1,60,2.81710519296757,2509.74800377443 -ABCD030917,,20170203,1,1,60,2.81710519296757,2506.93089858146 -ABCD030917,,20170204,1,1,60,2.81710519296712,2504.11379338849 -ABCD030917,,20170205,1,1,60,2.81710519296757,2501.29668819552 -ABCD030917,,20170206,1,1,60,2.81710519296712,2498.47958300256 -ABCD030917,,20170207,1,1,60,2.81710519296757,2495.66247780959 -ABCD030917,,20170208,1,1,60,2.81710519296757,2492.84537261662 -ABCD030917,,20170209,1,1,60,2.81710519296712,2490.02826742365 -ABCD030917,,20170210,1,1,60,2.81710519296757,2487.21116223069 -ABCD030917,,20170211,1,1,60,2.81710519296757,2484.39405703772 -ABCD030917,,20170212,1,1,60,2.81710519296712,2481.57695184475 -ABCD030917,,20170213,1,1,60,2.81710519296757,2478.75984665178 -ABCD030917,,20170214,1,1,60,2.81710519296712,2475.94274145882 -ABCD030917,,20170215,1,1,60,2.81710519296757,2473.12563626585 -ABCD030917,,20170216,1,1,60,2.81710519296757,2470.30853107288 -ABCD030917,,20170217,1,1,60,2.81710519296712,2467.49142587991 -ABCD030917,,20170218,1,1,60,2.81710519296757,2464.67432068695 -ABCD030917,,20170219,1,1,60,2.81710519296712,2461.85721549398 -ABCD030917,,20170220,1,1,60,2.81710519296757,2459.04011030101 -ABCD030917,,20170221,1,1,60,2.81710519296757,2456.22300510804 -ABCD030917,,20170222,1,1,60,2.81710519296712,2453.40589991508 -ABCD030917,,20170223,1,1,60,2.81710519296757,2450.58879472211 -ABCD030917,,20170224,1,1,60,2.81710519296712,2447.77168952914 -ABCD030917,,20170225,1,1,60,2.81710519296757,2444.95458433617 -ABCD030917,,20170226,1,1,60,2.81710519296757,2442.13747914321 -ABCD030917,,20161130,2,2,50,0.810917169285062,960 -ABCD030917,,20161201,2,2,50,0.810917169285062,959.189082830715 -ABCD030917,,20161202,2,2,50,0.810917169284949,958.37816566143 -ABCD030917,,20161203,2,2,50,0.810917169285062,957.567248492145 -ABCD030917,,20161204,2,2,50,0.810917169285062,956.75633132286 -ABCD030917,,20161205,2,2,49,0.956482161568943,955.945414153575 -ABCD030917,,20161206,2,2,49,0.956482161568829,954.988931992006 -ABCD030917,,20161207,2,2,49,0.956482161568943,954.032449830437 -ABCD030917,,20161208,2,2,49,0.956482161568829,953.075967668868 -ABCD030917,,20161209,2,2,49,0.956482161568943,952.119485507299 -ABCD030917,,20161210,2,2,49,0.956482161568943,951.16300334573 -ABCD030917,,20161211,2,2,49,0.956482161568829,950.206521184161 -ABCD030917,,20161212,2,2,49,0.956482161568943,949.250039022593 -ABCD030917,,20161213,2,2,49,0.956482161568829,948.293556861024 -ABCD030917,,20161214,2,2,49,0.956482161568943,947.337074699455 -ABCD030917,,20161215,2,2,49,0.956482161568943,946.380592537886 -ABCD030917,,20161216,2,2,49,0.956482161568829,945.424110376317 -ABCD030917,,20161217,2,2,49,0.956482161568943,944.467628214748 -ABCD030917,,20161218,2,2,49,0.956482161568829,943.511146053179 -ABCD030917,,20161219,2,2,40,1.59012347875921,942.55466389161 -ABCD030917,,20161220,2,2,40,1.59012347875921,940.964540412851 -ABCD030917,,20161221,2,2,40,1.59012347875921,939.374416934092 -ABCD030917,,20161222,2,2,40,1.59012347875921,937.784293455333 -ABCD030917,,20161223,2,2,40,1.59012347875921,936.194169976573 -ABCD030917,,20161224,2,2,40,1.59012347875921,934.604046497814 -ABCD030917,,20161225,2,2,40,1.59012347875921,933.013923019055 -ABCD030917,,20161226,2,2,40,1.5901234787591,931.423799540296 -ABCD030917,,20161227,2,2,40,1.59012347875921,929.833676061537 -ABCD030917,,20161228,2,2,40,1.59012347875921,928.243552582778 -ABCD030917,,20161229,2,2,40,1.59012347875921,926.653429104018 -ABCD030917,,20161230,2,2,40,1.59012347875921,925.063305625259 -ABCD030917,,20161231,2,2,40,1.59012347875921,923.4731821465 -ABCD030917,,20170101,2,2,40,1.59012347875921,921.883058667741 -ABCD030917,,20170102,2,2,40,1.59012347875921,920.292935188981 -ABCD030917,,20170103,2,2,40,0.828066178537256,918.702811710222 -ABCD030917,,20170104,2,2,40,0.828066178537256,917.874745531685 -ABCD030917,,20170105,2,2,40,0.828066178537256,917.046679353148 -ABCD030917,,20170106,2,2,40,0.828066178537256,916.218613174611 -ABCD030917,,20170107,2,2,40,0.828066178537256,915.390546996073 -ABCD030917,,20170108,2,2,40,0.82806617853737,914.562480817536 -ABCD030917,,20170109,2,2,40,0.828066178537256,913.734414638999 -ABCD030917,,20170110,2,2,40,0.828066178537256,912.906348460461 -ABCD030917,,20170111,2,2,40,0.828066178537256,912.078282281924 -ABCD030917,,20170112,2,2,40,0.828066178537256,911.250216103387 -ABCD030917,,20170113,2,2,40,0.828066178537256,910.42214992485 -ABCD030917,,20170114,2,2,40,0.828066178537256,909.594083746312 -ABCD030917,,20170115,2,2,40,0.828066178537256,908.766017567775 -ABCD030917,,20170116,2,2,40,0.828066178537256,907.937951389238 -ABCD030917,,20170117,2,2,40,0.828066178537256,907.109885210701 -ABCD030917,,20170118,2,2,40,0.828066178537256,906.281819032163 -ABCD030917,,20170119,2,2,40,0.82806617853737,905.453752853626 -ABCD030917,,20170120,2,2,40,0.828066178537256,904.625686675089 -ABCD030917,,20170121,2,2,40,0.828066178537256,903.797620496552 -ABCD030917,,20170122,2,2,40,0.828066178537256,902.969554318014 -ABCD030917,,20170123,2,2,40,0.828066178537256,902.141488139477 -ABCD030917,,20170124,2,2,40,0.828066178537256,901.31342196094 -ABCD030917,,20170125,2,2,40,0.828066178537256,900.485355782402 -ABCD030917,,20170126,2,2,40,0.828066178537256,899.657289603865 -ABCD030917,,20170127,2,2,40,0.828066178537256,898.829223425328 -ABCD030917,,20170128,2,2,40,0.828066178537256,898.001157246791 -ABCD030917,,20170129,2,2,40,0.828066178537256,897.173091068254 -ABCD030917,,20170130,2,2,40,0.828066178537256,896.345024889716 -ABCD030917,,20170131,2,2,40,0.82806617853737,895.516958711179 -ABCD030917,,20170201,2,2,40,0.828066178537256,894.688892532642 -ABCD030917,,20170202,2,2,40,0.828066178537256,893.860826354104 -ABCD030917,,20170203,2,2,40,0.828066178537256,893.032760175567 -ABCD030917,,20170204,2,2,40,0.828066178537256,892.20469399703 -ABCD030917,,20170205,2,2,40,0.828066178537256,891.376627818493 -ABCD030917,,20170206,2,2,40,0.828066178537256,890.548561639955 -ABCD030917,,20170207,2,2,40,0.828066178537256,889.720495461418 -ABCD030917,,20170208,2,2,40,0.828066178537256,888.892429282881 -ABCD030917,,20170209,2,2,40,0.828066178537256,888.064363104344 -ABCD030917,,20170210,2,2,40,0.828066178537256,887.236296925806 -ABCD030917,,20170211,2,2,40,0.82806617853737,886.408230747269 -ABCD030917,,20170212,2,2,40,0.828066178537256,885.580164568732 -ABCD030917,,20170213,2,2,40,0.828066178537256,884.752098390194 -ABCD030917,,20170214,2,2,40,0.828066178537256,883.924032211657 -ABCD030917,,20170215,2,2,40,0.828066178537256,883.09596603312 -ABCD030917,,20170216,2,2,40,0.828066178537256,882.267899854583 -ABCD030917,,20170217,2,2,40,0.828066178537256,881.439833676045 -ABCD030917,,20170218,2,2,40,0.828066178537256,880.611767497508 -ABCD030917,,20170219,2,2,40,0.828066178537256,879.783701318971 -ABCD030917,,20170220,2,2,40,0.828066178537256,878.955635140434 -ABCD030917,,20170221,2,2,40,0.828066178537256,878.127568961896 -ABCD030917,,20170222,2,2,40,0.828066178537256,877.299502783359 -ABCD030917,,20170223,2,2,40,0.82806617853737,876.471436604822 -ABCD030917,,20170224,2,2,40,0.828066178537256,875.643370426285 -ABCD030917,,20170225,2,2,40,0.828066178537256,874.815304247747 -ABCD030917,,20170226,2,2,40,0.828066178537256,873.98723806921 -ABCD030917,,20161130,3,3,35,1.2778554258208,774 -ABCD030917,,20161201,3,3,35,1.2778554258208,772.722144574179 -ABCD030917,,20161202,3,3,35,1.27785542582069,771.444289148358 -ABCD030917,,20161203,3,3,35,1.2778554258208,770.166433722538 -ABCD030917,,20161204,3,3,35,1.2778554258208,768.888578296717 -ABCD030917,,20161205,3,3,35,1.13458448689346,767.610722870896 -ABCD030917,,20161206,3,3,35,1.13458448689346,766.476138384003 -ABCD030917,,20161207,3,3,35,1.13458448689346,765.341553897109 -ABCD030917,,20161208,3,3,35,1.13458448689346,764.206969410216 -ABCD030917,,20161209,3,3,35,1.13458448689346,763.072384923322 -ABCD030917,,20161210,3,3,35,1.13458448689346,761.937800436429 -ABCD030917,,20161211,3,3,35,1.13458448689346,760.803215949535 -ABCD030917,,20161212,3,3,35,1.13458448689346,759.668631462642 -ABCD030917,,20161213,3,3,35,1.13458448689346,758.534046975748 -ABCD030917,,20161214,3,3,35,1.13458448689346,757.399462488855 -ABCD030917,,20161215,3,3,35,1.13458448689346,756.264878001962 -ABCD030917,,20161216,3,3,35,1.13458448689346,755.130293515068 -ABCD030917,,20161217,3,3,35,1.13458448689346,753.995709028175 -ABCD030917,,20161218,3,3,35,1.13458448689346,752.861124541281 -ABCD030917,,20161219,3,3,30,0.703942685854827,751.726540054388 -ABCD030917,,20161220,3,3,30,0.703942685854941,751.022597368533 -ABCD030917,,20161221,3,3,30,0.703942685854827,750.318654682678 -ABCD030917,,20161222,3,3,30,0.703942685854827,749.614711996823 -ABCD030917,,20161223,3,3,30,0.703942685854827,748.910769310968 -ABCD030917,,20161224,3,3,30,0.703942685854941,748.206826625113 -ABCD030917,,20161225,3,3,30,0.703942685854827,747.502883939259 -ABCD030917,,20161226,3,3,30,0.703942685854827,746.798941253404 -ABCD030917,,20161227,3,3,30,0.703942685854941,746.094998567549 -ABCD030917,,20161228,3,3,30,0.703942685854827,745.391055881694 -ABCD030917,,20161229,3,3,30,0.703942685854827,744.687113195839 -ABCD030917,,20161230,3,3,30,0.703942685854827,743.983170509984 -ABCD030917,,20161231,3,3,30,0.703942685854941,743.279227824129 -ABCD030917,,20170101,3,3,30,0.703942685854827,742.575285138275 -ABCD030917,,20170102,3,3,30,0.703942685854827,741.87134245242 -ABCD030917,,20170103,3,3,25,1.64569001748646,741.167399766565 -ABCD030917,,20170104,3,3,25,1.64569001748646,739.521709749078 -ABCD030917,,20170105,3,3,25,1.64569001748646,737.876019731592 -ABCD030917,,20170106,3,3,25,1.64569001748657,736.230329714106 -ABCD030917,,20170107,3,3,25,1.64569001748646,734.584639696619 -ABCD030917,,20170108,3,3,25,1.64569001748646,732.938949679132 -ABCD030917,,20170109,3,3,25,1.64569001748646,731.293259661646 -ABCD030917,,20170110,3,3,25,1.64569001748646,729.64756964416 -ABCD030917,,20170111,3,3,25,1.64569001748646,728.001879626673 -ABCD030917,,20170112,3,3,25,1.64569001748646,726.356189609187 -ABCD030917,,20170113,3,3,25,1.64569001748657,724.7104995917 -ABCD030917,,20170114,3,3,25,1.64569001748646,723.064809574214 -ABCD030917,,20170115,3,3,25,1.64569001748646,721.419119556727 -ABCD030917,,20170116,3,3,25,1.64569001748646,719.773429539241 -ABCD030917,,20170117,3,3,25,1.64569001748646,718.127739521754 -ABCD030917,,20170118,3,3,25,1.64569001748646,716.482049504268 -ABCD030917,,20170119,3,3,25,1.64569001748646,714.836359486781 -ABCD030917,,20170120,3,3,25,1.64569001748657,713.190669469295 -ABCD030917,,20170121,3,3,25,1.64569001748646,711.544979451808 -ABCD030917,,20170122,3,3,25,1.64569001748646,709.899289434322 -ABCD030917,,20170123,3,3,25,1.64569001748646,708.253599416835 -ABCD030917,,20170124,3,3,25,1.64569001748646,706.607909399349 -ABCD030917,,20170125,3,3,25,1.64569001748646,704.962219381862 -ABCD030917,,20170126,3,3,25,1.64569001748646,703.316529364376 -ABCD030917,,20170127,3,3,25,1.64569001748657,701.67083934689 -ABCD030917,,20170128,3,3,25,1.64569001748646,700.025149329403 -ABCD030917,,20170129,3,3,25,1.64569001748646,698.379459311916 -ABCD030917,,20170130,3,3,25,1.64569001748646,696.73376929443 -ABCD030917,,20170131,3,3,25,1.64569001748646,695.088079276944 -ABCD030917,,20170201,3,3,25,1.64569001748646,693.442389259457 -ABCD030917,,20170202,3,3,25,1.64569001748646,691.796699241971 -ABCD030917,,20170203,3,3,25,1.64569001748657,690.151009224484 -ABCD030917,,20170204,3,3,25,1.64569001748646,688.505319206998 -ABCD030917,,20170205,3,3,25,1.64569001748646,686.859629189511 -ABCD030917,,20170206,3,3,25,1.64569001748646,685.213939172025 -ABCD030917,,20170207,3,3,25,1.64569001748646,683.568249154538 -ABCD030917,,20170208,3,3,25,1.64569001748646,681.922559137052 -ABCD030917,,20170209,3,3,25,1.64569001748646,680.276869119565 -ABCD030917,,20170210,3,3,25,1.64569001748657,678.631179102079 -ABCD030917,,20170211,3,3,25,1.64569001748646,676.985489084592 -ABCD030917,,20170212,3,3,25,1.64569001748646,675.339799067106 -ABCD030917,,20170213,3,3,25,1.64569001748646,673.694109049619 -ABCD030917,,20170214,3,3,25,1.64569001748646,672.048419032133 -ABCD030917,,20170215,3,3,25,1.64569001748646,670.402729014646 -ABCD030917,,20170216,3,3,25,1.64569001748646,668.75703899716 -ABCD030917,,20170217,3,3,25,1.64569001748646,667.111348979674 -ABCD030917,,20170218,3,3,25,1.64569001748657,665.465658962187 -ABCD030917,,20170219,3,3,25,1.64569001748646,663.819968944701 -ABCD030917,,20170220,3,3,25,1.64569001748646,662.174278927214 -ABCD030917,,20170221,3,3,25,1.64569001748646,660.528588909728 -ABCD030917,,20170222,3,3,25,1.64569001748646,658.882898892241 -ABCD030917,,20170223,3,3,25,1.64569001748646,657.237208874755 -ABCD030917,,20170224,3,3,25,1.64569001748657,655.591518857268 -ABCD030917,,20170225,3,3,25,1.64569001748646,653.945828839782 -ABCD030917,,20170226,3,3,25,1.64569001748646,652.300138822295 -ABCD032617,,20161130,1,1,70,0.110241706297529,1203 -ABCD032617,,20161201,1,1,70,0.110241706297302,1202.8897582937 -ABCD032617,,20161202,1,1,70,0.110241706297529,1202.77951658741 -ABCD032617,,20161203,1,1,70,0.110241706297529,1202.66927488111 -ABCD032617,,20161204,1,1,70,0.110241706297529,1202.55903317481 -ABCD032617,,20161205,1,1,70,0.110241706297302,1202.44879146851 -ABCD032617,,20161206,1,1,70,0.110241706297529,1202.33854976222 -ABCD032617,,20161207,1,1,70,0.110241706297529,1202.22830805592 -ABCD032617,,20161208,1,1,70,0.110241706297302,1202.11806634962 -ABCD032617,,20161209,1,1,70,0.110241706297529,1202.00782464332 -ABCD032617,,20161210,1,1,70,0.110241706297529,1201.89758293703 -ABCD032617,,20161211,1,1,70,0.110241706297529,1201.78734123073 -ABCD032617,,20161212,1,1,79,0.089498395363762,1201.67709952443 -ABCD032617,,20161213,1,1,79,0.089498395363762,1201.58760112907 -ABCD032617,,20161214,1,1,79,0.0894983953635347,1201.4981027337 -ABCD032617,,20161215,1,1,79,0.089498395363762,1201.40860433834 -ABCD032617,,20161216,1,1,79,0.089498395363762,1201.31910594298 -ABCD032617,,20161217,1,1,79,0.089498395363762,1201.22960754761 -ABCD032617,,20161218,1,1,79,0.089498395363762,1201.14010915225 -ABCD032617,,20161219,1,1,79,0.089498395363762,1201.05061075688 -ABCD032617,,20161220,1,1,79,0.089498395363762,1200.96111236152 -ABCD032617,,20161221,1,1,79,0.0894983953635347,1200.87161396616 -ABCD032617,,20161222,1,1,79,0.089498395363762,1200.78211557079 -ABCD032617,,20161223,1,1,79,0.089498395363762,1200.69261717543 -ABCD032617,,20161224,1,1,79,0.089498395363762,1200.60311878007 -ABCD032617,,20161225,1,1,79,0.089498395363762,1200.5136203847 -ABCD032617,,20161226,1,1,79,0.089498395363762,1200.42412198934 -ABCD032617,,20161227,1,1,79,0.0894983953635347,1200.33462359397 -ABCD032617,,20161228,1,1,79,0.089498395363762,1200.24512519861 -ABCD032617,,20161229,1,1,79,0.089498395363762,1200.15562680325 -ABCD032617,,20161230,1,1,79,0.089498395363762,1200.06612840788 -ABCD032617,,20161231,1,1,79,0.089498395363762,1199.97663001252 -ABCD032617,,20170101,1,1,79,0.0894983953635347,1199.88713161716 -ABCD032617,,20170102,1,1,79,0.089498395363762,1199.79763322179 -ABCD032617,,20170103,1,1,85,0.0654276417187703,1199.70813482643 -ABCD032617,,20170104,1,1,85,0.0654276417185429,1199.64270718471 -ABCD032617,,20170105,1,1,85,0.0654276417187703,1199.57727954299 -ABCD032617,,20170106,1,1,85,0.0654276417185429,1199.51185190127 -ABCD032617,,20170107,1,1,85,0.0654276417187703,1199.44642425955 -ABCD032617,,20170108,1,1,85,0.0654276417187703,1199.38099661784 -ABCD032617,,20170109,1,1,85,0.0654276417185429,1199.31556897612 -ABCD032617,,20170110,1,1,89,0.0894906331498078,1199.2501413344 -ABCD032617,,20170111,1,1,89,0.0894906331498078,1199.16065070125 -ABCD032617,,20170112,1,1,89,0.0894906331500351,1199.0711600681 -ABCD032617,,20170113,1,1,89,0.0894906331498078,1198.98166943495 -ABCD032617,,20170114,1,1,89,0.0894906331498078,1198.8921788018 -ABCD032617,,20170115,1,1,89,0.0894906331498078,1198.80268816865 -ABCD032617,,20170116,1,1,89,0.0894906331498078,1198.7131975355 -ABCD032617,,20170117,1,1,90,0.11011013033135,1198.62370690235 -ABCD032617,,20170118,1,1,90,0.110110130331577,1198.51359677202 -ABCD032617,,20170119,1,1,90,0.11011013033135,1198.40348664169 -ABCD032617,,20170120,1,1,90,0.110110130331577,1198.29337651135 -ABCD032617,,20170121,1,1,90,0.11011013033135,1198.18326638102 -ABCD032617,,20170122,1,1,90,0.110110130331577,1198.07315625069 -ABCD032617,,20170123,1,1,90,0.11011013033135,1197.96304612036 -ABCD032617,,20170124,1,1,90,0.110110130331577,1197.85293599003 -ABCD032617,,20170125,1,1,90,0.11011013033135,1197.7428258597 -ABCD032617,,20170126,1,1,90,0.110110130331577,1197.63271572937 -ABCD032617,,20170127,1,1,90,0.11011013033135,1197.52260559903 -ABCD032617,,20170128,1,1,90,0.110110130331577,1197.4124954687 -ABCD032617,,20170129,1,1,90,0.11011013033135,1197.30238533837 -ABCD032617,,20170130,1,1,90,0.110110130331577,1197.19227520804 -ABCD032617,,20170131,1,1,90,0.11011013033135,1197.08216507771 -ABCD032617,,20170201,1,1,90,0.110110130331577,1196.97205494738 -ABCD032617,,20170202,1,1,90,0.11011013033135,1196.86194481705 -ABCD032617,,20170203,1,1,90,0.110110130331577,1196.75183468671 -ABCD032617,,20170204,1,1,90,0.11011013033135,1196.64172455638 -ABCD032617,,20170205,1,1,90,0.11011013033135,1196.53161442605 -ABCD032617,,20170206,1,1,90,0.110110130331577,1196.42150429572 -ABCD032617,,20170207,1,1,90,0.11011013033135,1196.31139416539 -ABCD032617,,20170208,1,1,90,0.110110130331577,1196.20128403506 -ABCD032617,,20170209,1,1,90,0.11011013033135,1196.09117390473 -ABCD032617,,20170210,1,1,90,0.110110130331577,1195.98106377439 -ABCD032617,,20170211,1,1,90,0.11011013033135,1195.87095364406 -ABCD032617,,20170212,1,1,90,0.110110130331577,1195.76084351373 -ABCD032617,,20170213,1,1,90,0.11011013033135,1195.6507333834 -ABCD032617,,20170214,1,1,90,0.110110130331577,1195.54062325307 -ABCD032617,,20170215,1,1,90,0.11011013033135,1195.43051312274 -ABCD032617,,20170216,1,1,90,0.110110130331577,1195.32040299241 -ABCD032617,,20170217,1,1,90,0.11011013033135,1195.21029286207 -ABCD032617,,20170218,1,1,90,0.110110130331577,1195.10018273174 -ABCD032617,,20170219,1,1,90,0.11011013033135,1194.99007260141 -ABCD032617,,20170220,1,1,90,0.110110130331577,1194.87996247108 -ABCD032617,,20170221,1,1,90,0.11011013033135,1194.76985234075 -ABCD032617,,20170222,1,1,90,0.110110130331577,1194.65974221042 -ABCD032617,,20170223,1,1,90,0.11011013033135,1194.54963208008 -ABCD032617,,20170224,1,1,90,0.11011013033135,1194.43952194975 -ABCD032617,,20170225,1,1,90,0.110110130331577,1194.32941181942 -ABCD032617,,20170226,1,1,90,0.11011013033135,1194.21930168909 -ABCD032617,,20161130,2,2,50,0.0517182464695907,865 -ABCD032617,,20161201,2,2,50,0.0517182464695907,864.94828175353 -ABCD032617,,20161202,2,2,50,0.0517182464695907,864.896563507061 -ABCD032617,,20161203,2,2,50,0.0517182464695907,864.844845260591 -ABCD032617,,20161204,2,2,50,0.0517182464697044,864.793127014122 -ABCD032617,,20161205,2,2,50,0.0517182464695907,864.741408767652 -ABCD032617,,20161206,2,2,50,0.0517182464695907,864.689690521182 -ABCD032617,,20161207,2,2,50,0.0517182464695907,864.637972274713 -ABCD032617,,20161208,2,2,50,0.0517182464695907,864.586254028243 -ABCD032617,,20161209,2,2,50,0.0517182464695907,864.534535781774 -ABCD032617,,20161210,2,2,50,0.0517182464695907,864.482817535304 -ABCD032617,,20161211,2,2,50,0.0517182464695907,864.431099288835 -ABCD032617,,20161212,2,2,55,0.0719219167842766,864.379381042365 -ABCD032617,,20161213,2,2,55,0.0719219167843903,864.307459125581 -ABCD032617,,20161214,2,2,55,0.0719219167842766,864.235537208796 -ABCD032617,,20161215,2,2,55,0.0719219167843903,864.163615292012 -ABCD032617,,20161216,2,2,55,0.0719219167842766,864.091693375227 -ABCD032617,,20161217,2,2,55,0.0719219167843903,864.019771458443 -ABCD032617,,20161218,2,2,55,0.0719219167842766,863.947849541659 -ABCD032617,,20161219,2,2,55,0.102693678996957,863.875927624875 -ABCD032617,,20161220,2,2,55,0.102693678996957,863.773233945878 -ABCD032617,,20161221,2,2,55,0.102693678996957,863.670540266881 -ABCD032617,,20161222,2,2,55,0.102693678996843,863.567846587884 -ABCD032617,,20161223,2,2,55,0.102693678996957,863.465152908887 -ABCD032617,,20161224,2,2,55,0.102693678996957,863.36245922989 -ABCD032617,,20161225,2,2,55,0.102693678996957,863.259765550893 -ABCD032617,,20161226,2,2,55,0.102693678996957,863.157071871896 -ABCD032617,,20161227,2,2,55,0.102693678996957,863.054378192899 -ABCD032617,,20161228,2,2,55,0.102693678996957,862.951684513902 -ABCD032617,,20161229,2,2,55,0.102693678996957,862.848990834905 -ABCD032617,,20161230,2,2,55,0.102693678996843,862.746297155908 -ABCD032617,,20161231,2,2,55,0.102693678996957,862.643603476911 -ABCD032617,,20170101,2,2,55,0.102693678996957,862.540909797914 -ABCD032617,,20170102,2,2,55,0.102693678996957,862.438216118917 -ABCD032617,,20170103,2,2,55,0.126763724677289,862.33552243992 -ABCD032617,,20170104,2,2,55,0.126763724677176,862.208758715243 -ABCD032617,,20170105,2,2,55,0.126763724677289,862.081994990566 -ABCD032617,,20170106,2,2,55,0.126763724677176,861.955231265889 -ABCD032617,,20170107,2,2,55,0.126763724677289,861.828467541212 -ABCD032617,,20170108,2,2,55,0.126763724677176,861.701703816534 -ABCD032617,,20170109,2,2,55,0.126763724677289,861.574940091857 -ABCD032617,,20170110,2,2,65,0.0421877048777333,861.44817636718 -ABCD032617,,20170111,2,2,65,0.0421877048777333,861.405988662302 -ABCD032617,,20170112,2,2,65,0.0421877048776196,861.363800957424 -ABCD032617,,20170113,2,2,65,0.0421877048777333,861.321613252547 -ABCD032617,,20170114,2,2,65,0.0421877048777333,861.279425547669 -ABCD032617,,20170115,2,2,65,0.0421877048777333,861.237237842791 -ABCD032617,,20170116,2,2,65,0.0421877048777333,861.195050137913 -ABCD032617,,20170117,2,2,70,0.0491458630797297,861.152862433036 -ABCD032617,,20170118,2,2,70,0.0491458630798434,861.103716569956 -ABCD032617,,20170119,2,2,70,0.0491458630797297,861.054570706876 -ABCD032617,,20170120,2,2,70,0.0491458630797297,861.005424843796 -ABCD032617,,20170121,2,2,70,0.0491458630797297,860.956278980717 -ABCD032617,,20170122,2,2,70,0.0491458630798434,860.907133117637 -ABCD032617,,20170123,2,2,70,0.0491458630797297,860.857987254557 -ABCD032617,,20170124,2,2,70,0.0491458630797297,860.808841391477 -ABCD032617,,20170125,2,2,70,0.0491458630797297,860.759695528398 -ABCD032617,,20170126,2,2,70,0.0491458630798434,860.710549665318 -ABCD032617,,20170127,2,2,70,0.0491458630797297,860.661403802238 -ABCD032617,,20170128,2,2,70,0.0491458630797297,860.612257939158 -ABCD032617,,20170129,2,2,70,0.0491458630797297,860.563112076079 -ABCD032617,,20170130,2,2,70,0.0491458630798434,860.513966212999 -ABCD032617,,20170131,2,2,70,0.0491458630797297,860.464820349919 -ABCD032617,,20170201,2,2,70,0.0491458630797297,860.415674486839 -ABCD032617,,20170202,2,2,70,0.0491458630797297,860.36652862376 -ABCD032617,,20170203,2,2,70,0.0491458630798434,860.31738276068 -ABCD032617,,20170204,2,2,70,0.0491458630797297,860.2682368976 -ABCD032617,,20170205,2,2,70,0.0491458630797297,860.21909103452 -ABCD032617,,20170206,2,2,70,0.0491458630797297,860.169945171441 -ABCD032617,,20170207,2,2,70,0.0491458630798434,860.120799308361 -ABCD032617,,20170208,2,2,70,0.0491458630797297,860.071653445281 -ABCD032617,,20170209,2,2,70,0.0491458630797297,860.022507582201 -ABCD032617,,20170210,2,2,70,0.0491458630797297,859.973361719122 -ABCD032617,,20170211,2,2,70,0.0491458630798434,859.924215856042 -ABCD032617,,20170212,2,2,70,0.0491458630797297,859.875069992962 -ABCD032617,,20170213,2,2,70,0.0491458630797297,859.825924129882 -ABCD032617,,20170214,2,2,70,0.0491458630797297,859.776778266803 -ABCD032617,,20170215,2,2,70,0.0491458630798434,859.727632403723 -ABCD032617,,20170216,2,2,70,0.0491458630797297,859.678486540643 -ABCD032617,,20170217,2,2,70,0.0491458630797297,859.629340677563 -ABCD032617,,20170218,2,2,70,0.0491458630798434,859.580194814484 -ABCD032617,,20170219,2,2,70,0.0491458630797297,859.531048951404 -ABCD032617,,20170220,2,2,70,0.0491458630797297,859.481903088324 -ABCD032617,,20170221,2,2,70,0.0491458630797297,859.432757225244 -ABCD032617,,20170222,2,2,70,0.0491458630798434,859.383611362165 -ABCD032617,,20170223,2,2,70,0.0491458630797297,859.334465499085 -ABCD032617,,20170224,2,2,70,0.0491458630797297,859.285319636005 -ABCD032617,,20170225,2,2,70,0.0491458630797297,859.236173772925 -ABCD032617,,20170226,2,2,70,0.0491458630797297,859.187027909846 -ABCD032617,,20161130,3,3,35,0.057343321185158,736 -ABCD032617,,20161201,3,3,35,0.057343321185158,735.942656678815 -ABCD032617,,20161202,3,3,35,0.057343321185158,735.88531335763 -ABCD032617,,20161203,3,3,35,0.057343321185158,735.827970036445 -ABCD032617,,20161204,3,3,35,0.0573433211850443,735.770626715259 -ABCD032617,,20161205,3,3,35,0.057343321185158,735.713283394074 -ABCD032617,,20161206,3,3,35,0.057343321185158,735.655940072889 -ABCD032617,,20161207,3,3,35,0.057343321185158,735.598596751704 -ABCD032617,,20161208,3,3,35,0.057343321185158,735.541253430519 -ABCD032617,,20161209,3,3,35,0.057343321185158,735.483910109334 -ABCD032617,,20161210,3,3,35,0.057343321185158,735.426566788149 -ABCD032617,,20161211,3,3,35,0.057343321185158,735.369223466963 -ABCD032617,,20161212,3,3,40,0.0499177621813942,735.311880145778 -ABCD032617,,20161213,3,3,40,0.0499177621815079,735.261962383597 -ABCD032617,,20161214,3,3,40,0.0499177621813942,735.212044621415 -ABCD032617,,20161215,3,3,40,0.0499177621815079,735.162126859234 -ABCD032617,,20161216,3,3,40,0.0499177621813942,735.112209097053 -ABCD032617,,20161217,3,3,40,0.0499177621815079,735.062291334871 -ABCD032617,,20161218,3,3,40,0.0499177621813942,735.01237357269 -ABCD032617,,20161219,3,3,45,0.0126379714730547,734.962455810508 -ABCD032617,,20161220,3,3,45,0.0126379714731684,734.949817839035 -ABCD032617,,20161221,3,3,45,0.0126379714730547,734.937179867562 -ABCD032617,,20161222,3,3,45,0.0126379714730547,734.924541896089 -ABCD032617,,20161223,3,3,45,0.0126379714731684,734.911903924616 -ABCD032617,,20161224,3,3,45,0.0126379714730547,734.899265953143 -ABCD032617,,20161225,3,3,45,0.0126379714730547,734.88662798167 -ABCD032617,,20161226,3,3,45,0.0126379714731684,734.873990010197 -ABCD032617,,20161227,3,3,45,0.0126379714730547,734.861352038723 -ABCD032617,,20161228,3,3,45,0.0126379714730547,734.84871406725 -ABCD032617,,20161229,3,3,45,0.0126379714730547,734.836076095777 -ABCD032617,,20161230,3,3,45,0.0126379714731684,734.823438124304 -ABCD032617,,20161231,3,3,45,0.0126379714730547,734.810800152831 -ABCD032617,,20170101,3,3,45,0.0126379714730547,734.798162181358 -ABCD032617,,20170102,3,3,45,0.0126379714731684,734.785524209885 -ABCD032617,,20170103,3,3,45,0.0126379714730547,734.772886238412 -ABCD032617,,20170104,3,3,45,0.0126379714731684,734.760248266939 -ABCD032617,,20170105,3,3,45,0.0126379714730547,734.747610295466 -ABCD032617,,20170106,3,3,45,0.0126379714730547,734.734972323992 -ABCD032617,,20170107,3,3,45,0.0126379714731684,734.722334352519 -ABCD032617,,20170108,3,3,45,0.0126379714730547,734.709696381046 -ABCD032617,,20170109,3,3,45,0.0126379714730547,734.697058409573 -ABCD032617,,20170110,3,3,45,0.0716110849892857,734.6844204381 -ABCD032617,,20170111,3,3,45,0.071611084989172,734.612809353111 -ABCD032617,,20170112,3,3,45,0.0716110849892857,734.541198268122 -ABCD032617,,20170113,3,3,45,0.071611084989172,734.469587183132 -ABCD032617,,20170114,3,3,45,0.0716110849892857,734.397976098143 -ABCD032617,,20170115,3,3,45,0.0716110849892857,734.326365013154 -ABCD032617,,20170116,3,3,45,0.071611084989172,734.254753928165 -ABCD032617,,20170117,3,3,55,0.0300343938883998,734.183142843176 -ABCD032617,,20170118,3,3,55,0.0300343938885135,734.153108449287 -ABCD032617,,20170119,3,3,55,0.0300343938883998,734.123074055399 -ABCD032617,,20170120,3,3,55,0.0300343938883998,734.09303966151 -ABCD032617,,20170121,3,3,55,0.0300343938885135,734.063005267622 -ABCD032617,,20170122,3,3,55,0.0300343938883998,734.032970873733 -ABCD032617,,20170123,3,3,55,0.0300343938883998,734.002936479845 -ABCD032617,,20170124,3,3,55,0.0300343938885135,733.972902085957 -ABCD032617,,20170125,3,3,55,0.0300343938883998,733.942867692068 -ABCD032617,,20170126,3,3,55,0.0300343938883998,733.91283329818 -ABCD032617,,20170127,3,3,55,0.0300343938885135,733.882798904291 -ABCD032617,,20170128,3,3,55,0.0300343938883998,733.852764510403 -ABCD032617,,20170129,3,3,55,0.0300343938883998,733.822730116514 -ABCD032617,,20170130,3,3,55,0.0300343938885135,733.792695722626 -ABCD032617,,20170131,3,3,55,0.0300343938883998,733.762661328737 -ABCD032617,,20170201,3,3,55,0.0300343938883998,733.732626934849 -ABCD032617,,20170202,3,3,55,0.0300343938885135,733.702592540961 -ABCD032617,,20170203,3,3,55,0.0300343938883998,733.672558147072 -ABCD032617,,20170204,3,3,55,0.0300343938883998,733.642523753184 -ABCD032617,,20170205,3,3,55,0.0300343938885135,733.612489359295 -ABCD032617,,20170206,3,3,55,0.0300343938883998,733.582454965407 -ABCD032617,,20170207,3,3,55,0.0300343938883998,733.552420571518 -ABCD032617,,20170208,3,3,55,0.0300343938885135,733.52238617763 -ABCD032617,,20170209,3,3,55,0.0300343938883998,733.492351783741 -ABCD032617,,20170210,3,3,55,0.0300343938883998,733.462317389853 -ABCD032617,,20170211,3,3,55,0.0300343938885135,733.432282995965 -ABCD032617,,20170212,3,3,55,0.0300343938883998,733.402248602076 -ABCD032617,,20170213,3,3,55,0.0300343938883998,733.372214208188 -ABCD032617,,20170214,3,3,55,0.0300343938885135,733.342179814299 -ABCD032617,,20170215,3,3,55,0.0300343938883998,733.312145420411 -ABCD032617,,20170216,3,3,55,0.0300343938883998,733.282111026522 -ABCD032617,,20170217,3,3,55,0.0300343938885135,733.252076632634 -ABCD032617,,20170218,3,3,55,0.0300343938883998,733.222042238745 -ABCD032617,,20170219,3,3,55,0.0300343938883998,733.192007844857 -ABCD032617,,20170220,3,3,55,0.0300343938885135,733.161973450969 -ABCD032617,,20170221,3,3,55,0.0300343938883998,733.13193905708 -ABCD032617,,20170222,3,3,55,0.0300343938883998,733.101904663192 -ABCD032617,,20170223,3,3,55,0.0300343938885135,733.071870269303 -ABCD032617,,20170224,3,3,55,0.0300343938883998,733.041835875415 -ABCD032617,,20170225,3,3,55,0.0300343938883998,733.011801481526 -ABCD032617,,20170226,3,3,55,0.0300343938883998,732.981767087638 diff --git a/inst/tests/issue_2157_sampling_reached_eof_early.txt b/inst/tests/issue_2157_sampling_reached_eof_early.txt deleted file mode 100644 index e0a645b238..0000000000 --- a/inst/tests/issue_2157_sampling_reached_eof_early.txt +++ /dev/null @@ -1,1229 +0,0 @@ -X1,X2,X3,X4,X5,X6,X7,X8,X9,X10,X11 -,0,0,6,0,-6,0,0,6,6,0 -2005-08-15,0,0,22,0,-22,0,0,22,22,0 -2014-01-01,0,0,0,0,0,0,0,0,0,0 -2014-01-02,0,0,0,0,0,0,0,0,0,0 -2014-01-03,0,0,0,0,0,0,0,0,0,0 -2014-01-04,0,0,0,0,0,0,0,0,0,0 -2014-01-05,0,0,0,0,0,0,0,0,0,0 -2014-01-06,0,0,0,0,0,0,0,0,0,0 -2014-01-07,0,0,0,0,0,0,0,0,0,0 -2014-01-08,0,0,0,0,0,0,0,0,0,0 -2014-01-09,0,0,0,0,0,0,0,0,0,0 -2014-01-10,0,0,0,0,0,0,0,0,0,0 -2014-01-11,0,0,0,0,0,0,0,0,0,0 -2014-01-12,0,0,0,0,0,0,0,0,0,0 -2014-01-13,0,0,0,0,0,0,0,0,0,0 -2014-01-14,0,0,0,0,0,0,0,0,0,0 -2014-01-15,0,0,0,0,0,0,0,0,0,0 -2014-01-16,0,0,0,0,0,0,0,0,0,0 -2014-01-17,0,0,0,0,0,0,0,0,0,0 -2014-01-18,0,0,0,0,0,0,0,0,0,0 -2014-01-19,0,0,0,0,0,0,0,0,0,0 -2014-01-20,0,0,0,0,0,0,0,0,0,0 -2014-01-21,0,0,0,0,0,0,0,0,0,0 -2014-01-22,0,0,0,0,0,0,0,0,0,0 -2014-01-23,0,0,0,0,0,0,0,0,0,0 -2014-01-24,0,0,0,0,0,0,0,0,0,0 -2014-01-25,0,0,0,0,0,0,0,0,0,0 -2014-01-26,0,0,0,0,0,0,0,0,0,0 -2014-01-27,0,0,0,0,0,0,0,0,0,0 -2014-01-28,0,0,0,0,0,0,0,0,0,0 -2014-01-29,0,0,0,0,0,0,0,0,0,0 -2014-01-30,0,0,0,0,0,0,0,0,0,0 -2014-01-31,0,0,0,0,0,0,0,0,0,0 -2014-02-01,0,0,0,0,0,0,0,0,0,0 -2014-02-02,0,0,0,0,0,0,0,0,0,0 -2014-02-03,0,0,0,0,0,0,0,0,0,0 -2014-02-04,0,0,0,0,0,0,0,0,0,0 -2014-02-05,0,0,0,0,0,0,0,0,0,0 -2014-02-06,0,0,0,0,0,0,0,0,0,0 -2014-02-07,0,0,0,0,0,0,0,0,0,0 -2014-02-08,0,0,0,0,0,0,0,0,0,0 -2014-02-09,0,0,0,0,0,0,0,0,0,0 -2014-02-10,0,0,0,0,0,0,0,0,0,0 -2014-02-11,0,0,0,0,0,0,0,0,0,0 -2014-02-12,0,0,0,0,0,0,0,0,0,0 -2014-02-13,0,0,0,0,0,0,0,0,0,0 -2014-02-14,0,0,0,0,0,0,0,0,0,0 -2014-02-15,0,0,0,0,0,0,0,0,0,0 -2014-02-16,0,0,0,0,0,0,0,0,0,0 -2014-02-17,0,0,0,0,0,0,0,0,0,0 -2014-02-18,0,0,0,0,0,0,0,0,0,0 -2014-02-19,0,0,0,0,0,0,0,0,0,0 -2014-02-20,0,0,0,0,0,0,0,0,0,0 -2014-02-21,0,0,0,0,0,0,0,0,0,0 -2014-02-22,0,0,0,0,0,0,0,0,0,0 -2014-02-23,0,0,0,0,0,0,0,0,0,0 -2014-02-24,0,0,0,0,0,0,0,0,0,0 -2014-02-25,0,0,0,0,0,0,0,0,0,0 -2014-02-26,0,0,0,0,0,0,0,0,0,0 -2014-02-27,0,0,0,0,0,0,0,0,0,0 -2014-02-28,0,0,0,0,0,0,0,0,0,0 -2014-03-01,0,0,0,0,0,0,0,0,0,0 -2014-03-02,0,0,0,0,0,0,0,0,0,0 -2014-03-03,0,0,0,0,0,0,0,0,0,0 -2014-03-04,0,0,0,0,0,0,0,0,0,0 -2014-03-05,0,0,0,0,0,0,0,0,0,0 -2014-03-06,0,0,0,0,0,0,0,0,0,0 -2014-03-07,0,0,0,0,0,0,0,0,0,0 -2014-03-08,0,0,0,0,0,0,0,0,0,0 -2014-03-09,0,0,0,0,0,0,0,0,0,0 -2014-03-10,0,0,0,0,0,0,0,0,0,0 -2014-03-11,0,0,0,0,0,0,0,0,0,0 -2014-03-12,0,0,0,0,0,0,0,0,0,0 -2014-03-13,0,0,0,0,0,0,0,0,0,0 -2014-03-14,0,0,0,0,0,0,0,0,0,0 -2014-03-15,0,0,0,0,0,0,0,0,0,0 -2014-03-16,0,0,0,0,0,0,0,0,0,0 -2014-03-17,0,0,0,0,0,0,0,0,0,0 -2014-03-18,0,0,0,0,0,0,0,0,0,0 -2014-03-19,0,0,0,0,0,0,0,0,0,0 -2014-03-20,0,0,0,0,0,0,0,0,0,0 -2014-03-21,0,0,0,0,0,0,0,0,0,0 -2014-03-22,0,0,0,0,0,0,0,0,0,0 -2014-03-23,0,0,0,0,0,0,0,0,0,0 -2014-03-24,0,0,0,0,0,0,0,0,0,0 -2014-03-25,0,0,0,0,0,0,0,0,0,0 -2014-03-26,0,0,0,0,0,0,0,0,0,0 -2014-03-27,0,0,0,0,0,0,0,0,0,0 -2014-03-28,0,0,0,0,0,0,0,0,0,0 -2014-03-29,0,0,0,0,0,0,0,0,0,0 -2014-03-30,0,0,0,0,0,0,0,0,0,0 -2014-03-31,0,0,0,0,0,0,0,0,0,0 -2014-04-01,0,0,0,0,0,0,0,0,0,0 -2014-04-02,0,0,0,0,0,0,0,0,0,0 -2014-04-03,0,0,0,0,0,0,0,0,0,0 -2014-04-04,0,0,0,0,0,0,0,0,0,0 -2014-04-05,0,0,0,0,0,0,0,0,0,0 -2014-04-06,0,0,0,0,0,0,0,0,0,0 -2014-04-07,0,0,0,0,0,0,0,0,0,0 -2014-04-08,0,0,0,0,0,0,0,0,0,0 -2014-04-09,0,0,0,0,0,0,0,0,0,0 -2014-04-10,0,0,0,0,0,0,0,0,0,0 -2014-04-11,0,0,0,0,0,0,0,0,0,0 -2014-04-12,0,0,0,0,0,0,0,0,0,0 -2014-04-13,0,0,0,0,0,0,0,0,0,0 -2014-04-14,0,0,0,0,0,0,0,0,0,0 -2014-04-15,0,0,0,0,0,0,0,0,0,0 -2014-04-16,0,0,0,0,0,0,0,0,0,0 -2014-04-17,0,0,0,0,0,0,0,0,0,0 -2014-04-18,0,0,0,0,0,0,0,0,0,0 -2014-04-19,0,0,0,0,0,0,0,0,0,0 -2014-04-20,0,0,0,0,0,0,0,0,0,0 -2014-04-21,0,0,0,0,0,0,0,0,0,0 -2014-04-22,0,0,0,0,0,0,0,0,0,0 -2014-04-23,0,0,0,0,0,0,0,0,0,0 -2014-04-24,0,0,0,0,0,0,0,0,0,0 -2014-04-25,0,0,0,0,0,0,0,0,0,0 -2014-04-26,0,0,0,0,0,0,0,0,0,0 -2014-04-27,0,0,0,0,0,0,0,0,0,0 -2014-04-28,0,0,0,0,0,0,0,0,0,0 -2014-04-29,0,0,0,0,0,0,0,0,0,0 -2014-04-30,0,0,0,0,0,0,0,0,0,0 -2014-05-01,0,0,0,0,0,0,0,0,0,0 -2014-05-02,0,0,0,0,0,0,0,0,0,0 -2014-05-03,0,0,0,0,0,0,0,0,0,0 -2014-05-04,0,0,0,0,0,0,0,0,0,0 -2014-05-05,0,0,0,0,0,0,0,0,0,0 -2014-05-06,30300,0,0,0,30300,30300,30300,0,0,0 -2014-05-07,0,0,0,0,0,0,0,0,0,0 -2014-05-08,0,0,0,0,0,0,0,0,0,0 -2014-05-09,0,0,0,0,0,0,0,0,0,0 -2014-05-10,0,0,0,0,0,0,0,0,0,0 -2014-05-11,0,0,0,0,0,0,0,0,0,0 -2014-05-12,0,0,0,0,0,0,0,0,0,0 -2014-05-13,0,0,0,0,0,0,0,0,0,0 -2014-05-14,0,0,0,0,0,0,0,0,0,0 -2014-05-15,0,0,0,0,0,0,0,0,0,0 -2014-05-16,0,0,0,0,0,0,0,0,0,0 -2014-05-17,0,0,0,0,0,0,0,0,0,0 -2014-05-18,0,0,0,0,0,0,0,0,0,0 -2014-05-19,0,0,0,0,0,0,0,0,0,0 -2014-05-20,0,0,0,0,0,0,0,0,0,0 -2014-05-21,0,0,0,0,0,0,0,0,0,0 -2014-05-22,0,0,0,0,0,0,0,0,0,0 -2014-05-23,0,0,0,0,0,0,0,0,0,0 -2014-05-24,0,0,0,0,0,0,0,0,0,0 -2014-05-25,0,0,0,0,0,0,0,0,0,0 -2014-05-26,0,0,0,0,0,0,0,0,0,0 -2014-05-27,0,0,0,0,0,0,0,0,0,0 -2014-05-28,0,0,0,0,0,0,0,0,0,0 -2014-05-29,1000,1005,505,5,495,-5,995,-500,500,1000 -2014-05-30,0,10,10,0,-10,-10,0,0,10,10 -2014-05-31,0,0,0,0,0,0,0,0,0,0 -2014-06-01,0,0,0,0,0,0,0,0,0,0 -2014-06-02,0,0,0,0,0,0,0,0,0,0 -2014-06-03,0,0,0,0,0,0,0,0,0,0 -2014-06-04,0,0,0,0,0,0,0,0,0,0 -2014-06-05,0,0,0,0,0,0,0,0,0,0 -2014-06-06,0,0,0,0,0,0,0,0,0,0 -2014-06-07,0,0,0,0,0,0,0,0,0,0 -2014-06-08,0,0,0,0,0,0,0,0,0,0 -2014-06-09,0,0,0,0,0,0,0,0,0,0 -2014-06-10,3000,3020.9,3000,3000,0,-20.9000000000001,0,-20.9000000000001,0,20.9000000000001 -2014-06-11,0,57,0,0,0,-57,0,-57,0,57 -2014-06-12,0,0,0,0,0,0,0,0,0,0 -2014-06-13,0,0,0,0,0,0,0,0,0,0 -2014-06-14,0,0,0,0,0,0,0,0,0,0 -2014-06-15,0,0,0,0,0,0,0,0,0,0 -2014-06-16,0,0,0,0,0,0,0,0,0,0 -2014-06-17,1,29,1,0,0,-28,1,-28,1,29 -2014-06-18,102,102,102,0,0,0,102,0,102,102 -2014-06-19,0,0,0,0,0,0,0,0,0,0 -2014-06-20,0,0,0,0,0,0,0,0,0,0 -2014-06-21,0,0,0,0,0,0,0,0,0,0 -2014-06-22,2300,0,2300,0,0,2300,2300,2300,2300,0 -2014-06-23,2400,4700,2400,4700,0,-2300,-2300,-2300,-2300,0 -2014-06-24,0,0,0,0,0,0,0,0,0,0 -2014-06-25,0,0,0,0,0,0,0,0,0,0 -2014-06-26,0,0,0,0,0,0,0,0,0,0 -2014-06-27,0,0,0,0,0,0,0,0,0,0 -2014-06-28,0,0,0,0,0,0,0,0,0,0 -2014-06-29,0,0,0,0,0,0,0,0,0,0 -2014-06-30,2300,2300,2300,2300,0,0,0,0,0,0 -2014-07-01,0,0,0,0,0,0,0,0,0,0 -2014-07-02,2935,2935,2935,2935,0,0,0,0,0,0 -2014-07-03,0,0,0,0,0,0,0,0,0,0 -2014-07-04,0,0,0,0,0,0,0,0,0,0 -2014-07-05,2500,2500,2500,2500,0,0,0,0,0,0 -2014-07-06,0,0,0,0,0,0,0,0,0,0 -2014-07-07,8300,7300,8300,7300,0,1000,1000,1000,1000,0 -2014-07-08,0,1000,0,1000,0,-1000,-1000,-1000,-1000,0 -2014-07-09,0,0,0,0,0,0,0,0,0,0 -2014-07-10,0,0,0,0,0,0,0,0,0,0 -2014-07-11,0,0,0,0,0,0,0,0,0,0 -2014-07-12,0,0,0,0,0,0,0,0,0,0 -2014-07-13,0,0,0,0,0,0,0,0,0,0 -2014-07-14,0,0,0,0,0,0,0,0,0,0 -2014-07-15,5300,5300,5300,5300,0,0,0,0,0,0 -2014-07-16,0,0,0,0,0,0,0,0,0,0 -2014-07-17,0,0,22,0,-22,0,0,22,22,0 -2014-07-18,0,0,0,0,0,0,0,0,0,0 -2014-07-19,0,0,0,0,0,0,0,0,0,0 -2014-07-20,0,0,0,0,0,0,0,0,0,0 -2014-07-21,0,0,0,0,0,0,0,0,0,0 -2014-07-22,0,0,0,0,0,0,0,0,0,0 -2014-07-23,0,0,0,0,0,0,0,0,0,0 -2014-07-24,500,500,500,500,0,0,0,0,0,0 -2014-07-25,1000,1000,1000,1000,0,0,0,0,0,0 -2014-07-26,0,0,0,0,0,0,0,0,0,0 -2014-07-27,0,0,0,0,0,0,0,0,0,0 -2014-07-28,0,0,0,0,0,0,0,0,0,0 -2014-07-29,7751,7750,7751,7750,0,1,1,1,1,0 -2014-07-30,3700,3701,3700,3701,0,-1,-1,-1,-1,0 -2014-07-31,13680,13680,13680,13680,0,0,0,0,0,0 -2014-08-01,15616.48,13382.08,15616.48,13382.08,0,2234.4,2234.4,2234.4,2234.4,0 -2014-08-02,7450,7334.4,7450,7334.4,0,115.6,115.6,115.6,115.6,0 -2014-08-03,3339,5689,3339,5689,0,-2350,-2350,-2350,-2350,0 -2014-08-04,20988.2,11087.2,20988.2,11087.2,0,9901,9901,9901,9901,0 -2014-08-05,300,10201,300,10201,0,-9901,-9901,-9901,-9901,0 -2014-08-06,3600,2600,3600,2600,0,1000,1000,1000,1000,0 -2014-08-07,15825,12739,15825,12739,0,3086,3086,3086,3086,0 -2014-08-08,1,4087,1,4087,0,-4086,-4086,-4086,-4086,0 -2014-08-09,3599,3599,3599,3599,0,0,0,0,0,0 -2014-08-10,4697,0,4697,0,0,4697,4697,4697,4697,0 -2014-08-11,21567.2,26264.2,21567.2,26264.2,0,-4697,-4697,-4697,-4697,0 -2014-08-12,3008,3008,3008,3008,0,0,0,0,0,0 -2014-08-13,23479.8,7420.4,23479.8,7420.4,0,16059.4,16059.4,16059.4,16059.4,0 -2014-08-14,7933.2,23992.6,7933.2,23992.6,0,-16059.4,-16059.4,-16059.4,-16059.4,0 -2014-08-15,4935,4935,4935,4935,0,0,0,0,0,0 -2014-08-16,22895.13,20640.13,22895.13,20640.13,0,2255,2255,2255,2255,0 -2014-08-17,16351.6,12122.6,16351.6,12122.6,0,4229,4229,4229,4229,0 -2014-08-18,6175,10384,6175,10384,0,-4209,-4209,-4209,-4209,0 -2014-08-19,13374.9,14349.9,13374.9,16349.9,0,-975,-2975,-975,-2975,-2000 -2014-08-20,8830.9,5838.5,8830.9,5838.5,0,2992.4,2992.4,2992.4,2992.4,0 -2014-08-21,22839.97,27132.37,22839.97,27132.37,0,-4292.4,-4292.4,-4292.4,-4292.4,0 -2014-08-22,14765.94,6855.54,14765.94,6855.54,0,7910.4,7910.4,7910.4,7910.4,0 -2014-08-23,6300,13758.4,6300,13758.4,0,-7458.4,-7458.4,-7458.4,-7458.4,0 -2014-08-24,9527,9977,9527,9977,0,-450,-450,-450,-450,0 -2014-08-25,21027.5,13234.5,21027.5,13234.5,0,7793,7793,7793,7793,0 -2014-08-26,9370.4,14813.4,9370.4,14813.4,0,-5443,-5443,-5443,-5443,0 -2014-08-27,13451,10901,13451,10901,0,2550,2550,2550,2550,0 -2014-08-28,8880.4,10256,8880.4,10256,0,-1375.6,-1375.6,-1375.6,-1375.6,0 -2014-08-29,9478.4,10502.8,9478.4,10502.8,0,-1024.4,-1024.4,-1024.4,-1024.4,0 -2014-08-30,15439.92,17939.92,15439.92,17939.92,0,-2500,-2500,-2500,-2500,0 -2014-08-31,8303.29,8303.29,8303.29,8303.29,0,0,0,0,0,0 -2014-09-01,13723.23,13723.23,13723.23,13723.23,0,0,0,0,0,0 -2014-09-02,5568.4,3000,5568.4,3000,0,2568.4,2568.4,2568.4,2568.4,0 -2014-09-03,30282.97,29455.37,30282.97,29455.37,0,827.600000000002,827.600000000002,827.600000000002,827.600000000002,0 -2014-09-04,12447,10247,12447,10247,0,2200,2200,2200,2200,0 -2014-09-05,18892.44,24488.44,18892.44,24486.44,0,-5596,-5594,-5596,-5594,2 -2014-09-06,7676,7676,7676,7676,0,0,0,0,0,0 -2014-09-07,11647.8,7451.8,11647.8,7451.8,0,4196,4196,4196,4196,0 -2014-09-08,22451,26647,22451,26647,0,-4196,-4196,-4196,-4196,0 -2014-09-09,17749.4,17749.4,17749.4,17749.4,0,0,0,0,0,0 -2014-09-10,33701,29027,33701,29027,0,4674,4674,4674,4674,0 -2014-09-11,24658.4,29332.4,24658.4,29332.4,0,-4674,-4674,-4674,-4674,0 -2014-09-12,50219.1,45327.3,50219.1,45327.3,0,4891.8,4891.8,4891.8,4891.8,0 -2014-09-13,35195.42,40087.22,35195.44,40087.22,-0.0200000000040745,-4891.8,-4891.8,-4891.78,-4891.78,0 -2014-09-14,12883.48,10383.48,12883.48,10383.48,0,2500,2500,2500,2500,0 -2014-09-15,31666.4,25342.4,31666.4,25342.4,0,6324,6324,6324,6324,0 -2014-09-16,14959,23783,14959,23783,0,-8824,-8824,-8824,-8824,0 -2014-09-17,24878.7,24878.7,24878.7,27634.7,0,0,-2756,0,-2756,-2756 -2014-09-18,25831.6,25831.6,25831.6,25831.6,0,0,0,0,0,0 -2014-09-19,21693.92,16458.92,21693.92,16458.92,0,5235,5235,5235,5235,0 -2014-09-20,20381.4,22298.4,20381.4,22298.4,0,-1917,-1917,-1917,-1917,0 -2014-09-21,7241.6,10559.6,7241.6,10559.6,0,-3318,-3318,-3318,-3318,0 -2014-09-22,29918.6,27018.6,29918.6,27018.6,0,2900,2900,2900,2900,0 -2014-09-23,3096,5996,3096,5996,0,-2900,-2900,-2900,-2900,0 -2014-09-24,18298.9,18298.9,18298.9,18298.9,0,0,0,0,0,0 -2014-09-25,21001.6,19841.6,21001.6,19839.6,0,1160,1162,1160,1162,2 -2014-09-26,44914.6,38070.36,44914.6,38070.36,0,6844.24,6844.24,6844.24,6844.24,0 -2014-09-27,15521.22,23525.46,15521.22,23523.46,0,-8004.24,-8002.24,-8004.24,-8002.24,2 -2014-09-28,21692.6,21652.6,21692.6,21651.6,0,40,41,40,41,1 -2014-09-29,22052,14920,22052,14918,0,7132,7134,7132,7134,2 -2014-09-30,18283.9,23155.9,18283.9,23152.9,0,-4872,-4869,-4872,-4869,3 -2014-10-01,29257.1,26339.4,29257.1,26339.4,0,2917.7,2917.7,2917.7,2917.7,0 -2014-10-02,21541.24,26758.94,21541.24,28408.94,0,-5217.7,-6867.7,-5217.7,-6867.7,-1650 -2014-10-03,29343.5,29343.5,29343.5,30911.75,0,0,-1568.25,0,-1568.25,-1568.25 -2014-10-04,29526,29526,29526,29526,0,0,0,0,0,0 -2014-10-05,13272.3,12192.3,13272.3,12192.3,0,1080,1080,1080,1080,0 -2014-10-06,20964,21994,20964,21994,0,-1030,-1030,-1030,-1030,0 -2014-10-07,11539.4,11513.4,11539.4,11512.4,0,26,27,26,27,1 -2014-10-08,7216,7292,7216,9292,0,-76,-2076,-76,-2076,-2000 -2014-10-09,31822.7,31822.7,31822.7,36157.7,0,0,-4335,0,-4335,-4335 -2014-10-10,29683.2,25403.2,29704.1,25397.2,-20.8999999999978,4280,4286,4300.9,4306.9,6 -2014-10-11,1510,5790,1510,5790,0,-4280,-4280,-4280,-4280,0 -2014-10-12,15997.9,15997.9,15997.9,15997.9,0,0,0,0,0,0 -2014-10-13,28084.51,28084.51,28084.51,26348.51,0,0,1736,0,1736,1736 -2014-10-14,33042.48,23742.48,33042.48,23742.48,0,9300,9300,9300,9300,0 -2014-10-15,33537.9,42837.9,33537.9,42837.9,0,-9300,-9300,-9300,-9300,0 -2014-10-16,20132.7,20132.7,20132.7,21232.7,0,0,-1100,0,-1100,-1100 -2014-10-17,36942.74,32664.74,36942.74,32664.74,0,4278,4278,4278,4278,0 -2014-10-18,12160.65,11523.6,12160.65,11523.6,0,637.049999999999,637.049999999999,637.049999999999,637.049999999999,0 -2014-10-19,20035.8,24241.85,20035.8,24241.85,0,-4206.05,-4206.05,-4206.05,-4206.05,0 -2014-10-20,25465.16,26174.16,25465.16,26174.16,0,-709,-709,-709,-709,0 -2014-10-21,7149.52,7149.52,7149.52,7149.52,0,0,0,0,0,0 -2014-10-22,6200,6200,6200,6200,0,0,0,0,0,0 -2014-10-23,28618.61,28618.61,28618.61,26217.36,0,0,2401.25,0,2401.25,2401.25 -2014-10-24,36641.89,36629.89,36641.89,38570.89,0,12,-1929,12,-1929,-1941 -2014-10-25,12000,12012,12000,12012,0,-12,-12,-12,-12,0 -2014-10-26,14227.04,7400,14227.04,7400,0,6827.04,6827.04,6827.04,6827.04,0 -2014-10-27,25599.64,27574.28,25599.64,25574.28,0,-1974.64,25.3600000000006,-1974.64,25.3600000000006,2000 -2014-10-28,7089.8,11942.2,7089.8,11942.2,0,-4852.4,-4852.4,-4852.4,-4852.4,0 -2014-10-29,12097,12097,12097,12096,0,0,1,0,1,1 -2014-10-30,13577.5,13577.5,13577.5,13577.5,0,0,0,0,0,0 -2014-10-31,13446.18,8510,13446.18,8510,0,4936.18,4936.18,4936.18,4936.18,0 -2014-11-01,13352.6,18288.78,13352.6,18288.78,0,-4936.18,-4936.18,-4936.18,-4936.18,0 -2014-11-02,9474,7852,9474,6832,0,1622,2642,1622,2642,1020 -2014-11-03,17321,16168,17321,16168,0,1153,1153,1153,1153,0 -2014-11-04,11914.16,14689.16,11914.16,14689.16,0,-2775,-2775,-2775,-2775,0 -2014-11-05,17657.48,12598.78,17657.48,12598.78,0,5058.7,5058.7,5058.7,5058.7,0 -2014-11-06,20441.8,21723.5,20476.8,21723.5,-35,-1281.7,-1281.7,-1246.7,-1246.7,0 -2014-11-07,17283.65,16129,17283.65,16129,0,1154.65,1154.65,1154.65,1154.65,0 -2014-11-08,44712.7,47409.35,44712.7,47409.35,0,-2696.65,-2696.65,-2696.65,-2696.65,0 -2014-11-09,10297.65,12532.65,10297.65,11732.65,0,-2235,-1435,-2235,-1435,800 -2014-11-10,19465.8,19465.8,19465.8,20585.8,0,0,-1120,0,-1120,-1120 -2014-11-11,22590.31,15863,22590.31,15863,0,6727.31,6727.31,6727.31,6727.31,0 -2014-11-12,11803.85,18531.16,11803.85,18531.16,0,-6727.31,-6727.31,-6727.31,-6727.31,0 -2014-11-13,4772.4,2250,4772.4,2250,0,2522.4,2522.4,2522.4,2522.4,0 -2014-11-14,22895.86,20081.76,22895.86,17981.76,0,2814.1,4914.1,2814.1,4914.1,2100 -2014-11-15,6345,11681.5,6345,21391,0,-5336.5,-15046,-5336.5,-15046,-9709.5 -2014-11-16,6200,6200,6200,6200,0,0,0,0,0,0 -2014-11-17,29336.2,19323.2,29336.2,19323.2,0,10013,10013,10013,10013,0 -2014-11-18,11071.49,21083,11071.49,21083,0,-10011.51,-10011.51,-10011.51,-10011.51,0 -2014-11-19,30481.37,26567.86,30481.37,25604.17,0,3913.51,4877.2,3913.51,4877.2,963.690000000002 -2014-11-20,25879.14,24871.7,25879.14,24871.7,0,1007.44,1007.44,1007.44,1007.44,0 -2014-11-21,19708.49,21630.93,19708.49,21630.93,0,-1922.44,-1922.44,-1922.44,-1922.44,0 -2014-11-22,17407.2,20407.2,17407.2,20406.2,0,-3000,-2999,-3000,-2999,1 -2014-11-23,11962,7262,11962,8838,0,4700,3124,4700,3124,-1576 -2014-11-24,4710.65,8028,4710.65,8028,0,-3317.35,-3317.35,-3317.35,-3317.35,0 -2014-11-25,15388,12970.65,15388,10870.65,0,2417.35,4517.35,2417.35,4517.35,2100 -2014-11-26,29006.01,21267,29006.01,21267,0,7739.01,7739.01,7739.01,7739.01,0 -2014-11-27,23385.75,31030.61,23385.75,31029.61,0,-7644.86,-7643.86,-7644.86,-7643.86,1 -2014-11-28,38175.55,28619.65,38175.55,26383.65,0,9555.9,11791.9,9555.9,11791.9,2236 -2014-11-29,14391,27841.05,14391,27841.05,0,-13450.05,-13450.05,-13450.05,-13450.05,0 -2014-11-30,10322.82,8084.45,10322.82,8084.45,0,2238.37,2238.37,2238.37,2238.37,0 -2014-12-01,6270,7158.37,6270,7158.37,0,-888.37,-888.37,-888.37,-888.37,0 -2014-12-02,30277.9,25978.9,30277.9,25968.9,0,4299,4309,4299,4309,10 -2014-12-03,13729,16978,13729,19623,0,-3249,-5894,-3249,-5894,-2645 -2014-12-04,20837.73,23217.73,20837.73,23217.73,0,-2380,-2380,-2380,-2380,0 -2014-12-05,30045,27447,30045,27427,0,2598,2618,2598,2618,20 -2014-12-06,16611.8,13498.6,16611.8,13498.6,0,3113.2,3113.2,3113.2,3113.2,0 -2014-12-07,27458.6,33189.8,27458.6,33189.8,0,-5731.20000000001,-5731.20000000001,-5731.20000000001,-5731.20000000001,0 -2014-12-08,20827.17,18331.17,20827.17,17230.17,0,2496,3597,2496,3597,1101 -2014-12-09,21314.5,19450.5,21314.5,19450.5,0,1864,1864,1864,1864,0 -2014-12-10,33619.4,29857,33619.4,29757,0,3762.4,3862.4,3762.4,3862.4,100 -2014-12-11,34381.5,40165.2,34381.5,40165.2,0,-5783.7,-5783.7,-5783.7,-5783.7,0 -2014-12-12,31869.89,29626.34,31869.89,29626.34,0,2243.55,2243.55,2243.55,2243.55,0 -2014-12-13,33165.54,30537.79,33165.54,30537.79,0,2627.75,2627.75,2627.75,2627.75,0 -2014-12-14,11500,13810,11500,13810,0,-2310,-2310,-2310,-2310,0 -2014-12-15,29694.5,34094.5,29694.5,34044.5,0,-4400,-4350,-4400,-4350,50 -2014-12-16,46817.34,42731.2,46817.34,42731.2,0,4086.14,4086.14,4086.14,4086.14,0 -2014-12-17,19293,18619.14,19293,18619.14,0,673.860000000001,673.860000000001,673.860000000001,673.860000000001,0 -2014-12-18,23936,27729,23936,27719,0,-3793,-3783,-3793,-3783,10 -2014-12-19,23256.81,16376.81,23256.81,16376.81,0,6880,6880,6880,6880,0 -2014-12-20,28646.2,29399,28646.2,29389,0,-752.799999999999,-742.799999999999,-752.799999999999,-742.799999999999,10 -2014-12-21,24190.22,26909.92,24190.22,26869.92,0,-2719.7,-2679.7,-2719.7,-2679.7,40 -2014-12-22,28328.11,27306.61,28328.11,27306.61,0,1021.5,1021.5,1021.5,1021.5,0 -2014-12-23,38538.76,35112.76,38538.76,33536.76,0,3426,5002,3426,5002,1576 -2014-12-24,27626.92,30748.92,27626.92,28746.92,0,-3122,-1120,-3122,-1120,2002 -2014-12-25,52474.9,49638.1,52474.9,48788.1,0,2836.8,3686.8,2836.8,3686.8,850 -2014-12-26,46885.6,52590.4,46885.6,52587.4,0,-5704.8,-5701.8,-5704.8,-5701.8,3 -2014-12-27,31106.8,19087,31106.8,19085,0,12019.8,12021.8,12019.8,12021.8,2 -2014-12-28,4071,19422.8,4071,19413.8,0,-15351.8,-15342.8,-15351.8,-15342.8,9 -2014-12-29,38778.29,33006.6,38778.29,33006.6,0,5771.69,5771.69,5771.69,5771.69,0 -2014-12-30,47032,33041.69,47032,33041.69,0,13990.31,13990.31,13990.31,13990.31,0 -2014-12-31,38829.74,58591.74,38829.74,58591.74,0,-19762,-19762,-19762,-19762,0 -2015-01-01,22293,17300,22293,17300,0,4993,4993,4993,4993,0 -2015-01-02,35956.66,33931.41,35956.66,33931.41,0,2025.25,2025.25,2025.25,2025.25,0 -2015-01-03,29183.3,35701.55,29183.3,35701.55,0,-6518.25,-6518.25,-6518.25,-6518.25,0 -2015-01-04,14446.5,13246.5,14446.5,13236.5,0,1200,1210,1200,1210,10 -2015-01-05,35642.64,37342.64,35642.64,37342.64,0,-1700,-1700,-1700,-1700,0 -2015-01-06,32543.62,24724.62,32543.62,24724.62,0,7819,7819,7819,7819,0 -2015-01-07,33580,39149,33580,39149,0,-5569,-5569,-5569,-5569,0 -2015-01-08,21688.4,23935.4,21688.4,23435.4,0,-2247,-1747,-2247,-1747,500 -2015-01-09,36007,30160,36007,30160,0,5847,5847,5847,5847,0 -2015-01-10,13475.4,16849.4,13475.4,16849.4,0,-3374,-3374,-3374,-3374,0 -2015-01-11,16581,19057,16581,19057,0,-2476,-2476,-2476,-2476,0 -2015-01-12,8900,5300,8900,5300,0,3600,3600,3600,3600,0 -2015-01-13,35349.37,28609,35349.37,28609,0,6740.37,6740.37,6740.37,6740.37,0 -2015-01-14,47599.65,55040.02,47599.65,55040.02,0,-7440.37,-7440.37,-7440.37,-7440.37,0 -2015-01-15,48106.55,50906.55,48106.55,50905.55,0,-2800,-2799,-2800,-2799,1 -2015-01-16,47872.56,35640.21,47872.56,35640.21,0,12232.35,12232.35,12232.35,12232.35,0 -2015-01-17,31432.45,41288.05,31432.45,41280.05,0,-9855.6,-9847.6,-9855.6,-9847.6,8 -2015-01-18,8397.4,10874.15,8397.4,10873.15,0,-2476.75,-2475.75,-2476.75,-2475.75,1 -2015-01-19,33299.58,24033.36,33299.58,24033.36,0,9266.22,9266.22,9266.22,9266.22,0 -2015-01-20,61963.49,55955.57,61963.49,55955.57,0,6007.92,6007.92,6007.92,6007.92,0 -2015-01-21,59194.42,66057.94,59194.42,66057.94,0,-6863.52,-6863.52,-6863.52,-6863.52,0 -2015-01-22,40501.08,48611.7,40501.08,48611.7,0,-8110.62,-8110.62,-8110.62,-8110.62,0 -2015-01-23,46367.74,35777.74,46367.74,35475.74,0,10590,10892,10590,10892,302 -2015-01-24,34036.2,37506.2,34036.2,37506.2,0,-3470,-3470,-3470,-3470,0 -2015-01-25,31894.16,32054.16,31894.16,32054.16,0,-160,-160,-160,-160,0 -2015-01-26,46765.74,41524.8,46765.74,41519.8,0,5240.94,5245.94,5240.94,5245.94,5 -2015-01-27,40843.09,48364.03,40843.09,48363.03,0,-7520.94,-7519.94,-7520.94,-7519.94,1 -2015-01-28,25861.9,18275.5,25861.9,18275.5,0,7586.4,7586.4,7586.4,7586.4,0 -2015-01-29,45795.08,49465.2,45795.08,49465.2,0,-3670.12,-3670.12,-3670.12,-3670.12,0 -2015-01-30,39289.95,37102.86,39289.95,37102.86,0,2187.09,2187.09,2187.09,2187.09,0 -2015-01-31,30838.15,40197.12,30838.15,40197.12,0,-9358.97,-9358.97,-9358.97,-9358.97,0 -2015-02-01,28578.71,26630.51,28578.71,26630.51,0,1948.2,1948.2,1948.2,1948.2,0 -2015-02-02,32053,32167.6,32053,32167.6,0,-114.599999999999,-114.599999999999,-114.599999999999,-114.599999999999,0 -2015-02-03,37764.88,37450.88,37764.88,37050.88,0,314,714,314,714,400 -2015-02-04,50814.05,45422.9,50814.05,45422.9,0,5391.15,5391.15,5391.15,5391.15,0 -2015-02-05,41108.42,42473.65,41108.42,42472.65,0,-1365.23,-1364.23,-1365.23,-1364.23,1 -2015-02-06,36928.4,37133.32,36928.4,37133.32,0,-204.919999999998,-204.919999999998,-204.919999999998,-204.919999999998,0 -2015-02-07,22657.53,30350.53,22657.53,30350.53,0,-7693,-7693,-7693,-7693,0 -2015-02-08,36231.5,34111.5,36231.5,34091.5,0,2120,2140,2120,2140,20 -2015-02-09,40840.15,27973.75,40840.15,27571.75,0,12866.4,13268.4,12866.4,13268.4,402 -2015-02-10,16377.4,20563.8,16377.4,20563.8,0,-4186.4,-4186.4,-4186.4,-4186.4,0 -2015-02-11,75100.05,77677.15,75100.05,77677.15,0,-2577.09999999999,-2577.09999999999,-2577.09999999999,-2577.09999999999,0 -2015-02-12,88721.12,88165.45,88721.12,88165.45,0,555.669999999998,555.669999999998,555.669999999998,555.669999999998,0 -2015-02-13,69835.25,55625.87,69835.25,55625.87,0,14209.38,14209.38,14209.38,14209.38,0 -2015-02-14,45588.62,61319.57,45588.62,61319.57,0,-15730.95,-15730.95,-15730.95,-15730.95,0 -2015-02-15,41646.9,43710.9,41646.9,43610.9,0,-2064,-1964,-2064,-1964,100 -2015-02-16,40617.22,36316.22,40617.22,35716.22,0,4301,4901,4301,4901,600 -2015-02-17,54497.4,44883.5,54497.4,44883.5,0,9613.9,9613.9,9613.9,9613.9,0 -2015-02-18,38233.9,44451.8,38233.9,44101.8,0,-6217.9,-5867.9,-6217.9,-5867.9,350 -2015-02-19,42908.62,55798.62,42908.62,59044.78,0,-12890,-16136.16,-12890,-16136.16,-3246.16 -2015-02-20,45510.95,32948.05,45510.95,32948.05,0,12562.9,12562.9,12562.9,12562.9,0 -2015-02-21,50651.37,60673.27,50651.37,60673.27,0,-10021.9,-10021.9,-10021.9,-10021.9,0 -2015-02-22,31781.82,27038.58,31781.82,27038.58,0,4743.24,4743.24,4743.24,4743.24,0 -2015-02-23,22786.34,30070.58,22786.34,30070.58,0,-7284.24,-7284.24,-7284.24,-7284.24,0 -2015-02-24,46438.89,35011.99,46438.89,35011.99,0,11426.9,11426.9,11426.9,11426.9,0 -2015-02-25,44645.59,46865.9,44645.59,46865.9,0,-2220.31000000001,-2220.31000000001,-2220.31000000001,-2220.31000000001,0 -2015-02-26,47823.28,36341.27,47823.28,37763.27,0,11482.01,10060.01,11482.01,10060.01,-1422 -2015-02-27,53202.48,73891.08,53202.48,73891.08,0,-20688.6,-20688.6,-20688.6,-20688.6,0 -2015-02-28,39071.31,32821.31,39071.31,30071.31,0,6250,9000,6250,9000,2750 -2015-03-01,35998.7,40309.7,35998.7,40309.7,0,-4311,-4311,-4311,-4311,0 -2015-03-02,46508.24,45794.24,46508.24,45794.24,0,714,714,714,714,0 -2015-03-03,35443.2,34585.45,35443.2,34585.45,0,857.75,857.75,857.75,857.75,0 -2015-03-04,53072.2,40250.44,53072.2,40250.44,0,12821.76,12821.76,12821.76,12821.76,0 -2015-03-05,33899.9,34963.51,33899.9,36363.51,0,-1063.61,-2463.61,-1063.61,-2463.61,-1400 -2015-03-06,50337.7,61141.6,50337.7,61141.6,0,-10803.9,-10803.9,-10803.9,-10803.9,0 -2015-03-07,58598.08,53279.88,58598.08,53279.88,0,5318.2,5318.2,5318.2,5318.2,0 -2015-03-08,28829.8,36213.6,28829.8,36213.6,0,-7383.8,-7383.8,-7383.8,-7383.8,0 -2015-03-09,16042.9,18442.3,16042.9,18442.3,0,-2399.4,-2399.4,-2399.4,-2399.4,0 -2015-03-10,67022.36,56877.36,67022.36,56877.36,0,10145,10145,10145,10145,0 -2015-03-11,39643.08,40888.08,39643.08,42279.47,0,-1245,-2636.39,-1245,-2636.39,-1391.39 -2015-03-12,51110.87,50708,51110.87,53473.08,0,402.870000000003,-2362.21,402.870000000003,-2362.21,-2765.08 -2015-03-13,61135.01,57136.06,61135.01,57136.06,0,3998.95,3998.95,3998.95,3998.95,0 -2015-03-14,36192.71,46995.63,36192.71,48095.63,0,-10802.92,-11902.92,-10802.92,-11902.92,-1100 -2015-03-15,24767.4,25266.3,24767.4,25266.3,0,-498.899999999998,-498.899999999998,-498.899999999998,-498.899999999998,0 -2015-03-16,34888.6,34487.4,34888.6,34487.4,0,401.199999999997,401.199999999997,401.199999999997,401.199999999997,0 -2015-03-17,39890.7,32341.9,39890.7,32341.9,0,7548.8,7548.8,7548.8,7548.8,0 -2015-03-18,49608.64,43735.78,49608.64,44335.78,0,5872.86,5272.86,5872.86,5272.86,-600 -2015-03-19,8517.5,39969.76,31246.9,39546.76,-22729.4,-31452.26,-31029.26,-8722.86,-8299.86,423 -2015-03-20,10600,64926.74,58786.74,64926.74,-48186.74,-54326.74,-54326.74,-6140,-6140,0 -2015-03-21,5825,34033.67,38169.67,33633.67,-32344.67,-28208.67,-27808.67,4136,4536,400 -2015-03-22,11145.8,43626.2,43550.2,47164.2,-32404.4,-32480.4,-36018.4,-76,-3614,-3538 -2015-03-23,16785,51659.81,72508.81,51559.81,-55723.81,-34874.81,-34774.81,20849,20949,100 -2015-03-24,10382.21,81100.37,57762.62,82738.13,-47380.41,-70718.16,-72355.92,-23337.75,-24975.51,-1637.76000000001 -2015-03-25,51247.84,48949.09,51247.84,52949.09,0,2298.75,-1701.25,2298.75,-1701.25,-4000 -2015-03-26,69155.25,66803.05,69155.25,71403.05,0,2352.2,-2247.8,2352.2,-2247.8,-4600 -2015-03-27,72592.33,68229.53,72592.33,68229.53,0,4362.8,4362.8,4362.8,4362.8,0 -2015-03-28,44629.36,52775.36,44629.36,54485.36,0,-8146,-9856,-8146,-9856,-1710 -2015-03-29,45726.46,46262.62,45726.46,52397.62,0,-536.160000000004,-6671.16,-536.160000000004,-6671.16,-6135 -2015-03-30,40627.13,33637.03,40627.13,35931.03,0,6990.1,4696.1,6990.1,4696.1,-2294 -2015-03-31,51571.46,51743.44,51571.46,51743.44,0,-171.980000000003,-171.980000000003,-171.980000000003,-171.980000000003,0 -2015-04-01,71418.69,76599.65,72418.69,76599.65,-1000,-5180.95999999999,-5180.95999999999,-4180.95999999999,-4180.95999999999,0 -2015-04-02,62125.8,46425.8,62125.8,57348.73,0,15700,4777.07,15700,4777.07,-10922.93 -2015-04-03,53087.18,68086.18,53087.18,68086.18,0,-14999,-14999,-14999,-14999,0 -2015-04-04,46866.32,48139.32,46866.32,52839.32,0,-1273,-5973,-1273,-5973,-4700 -2015-04-05,35519.14,35607.38,35519.14,35607.38,0,-88.239999999998,-88.239999999998,-88.239999999998,-88.239999999998,0 -2015-04-06,64192.91,59252.26,64192.91,59252.26,0,4940.65,4940.65,4940.65,4940.65,0 -2015-04-07,47177.66,50258.07,47177.66,49753.07,0,-3080.41,-2575.41,-3080.41,-2575.41,505 -2015-04-08,61924.4,54305.9,61924.4,54305.9,0,7618.5,7618.5,7618.5,7618.5,0 -2015-04-09,45786.07,55104.57,45786.07,55104.57,0,-9318.5,-9318.5,-9318.5,-9318.5,0 -2015-04-10,65653.24,56051.2,65653.24,57224.1,0,9602.04000000001,8429.14000000001,9602.04000000001,8429.14000000001,-1172.9 -2015-04-11,56291.43,67143.47,56291.43,69093.41,0,-10852.04,-12801.98,-10852.04,-12801.98,-1949.94 -2015-04-12,33701.24,28575.24,33701.24,34143.99,0,5126,-442.75,5126,-442.75,-5568.75 -2015-04-13,46573.06,54399.06,46573.06,54399.06,0,-7826,-7826,-7826,-7826,0 -2015-04-14,66677.18,58398.97,66677.18,60632.17,0,8278.20999999999,6045.01,8278.20999999999,6045.01,-2233.2 -2015-04-15,48143.02,49632.23,48143.02,56500.5,0,-1489.21000000001,-8357.48,-1489.21000000001,-8357.48,-6868.27 -2015-04-16,61852.49,49890.03,61852.49,54051.03,0,11962.46,7801.46,11962.46,7801.46,-4161 -2015-04-17,74942.14,71986.6,74942.14,72539.8,0,2955.53999999999,2402.34,2955.53999999999,2402.34,-553.199999999997 -2015-04-18,72001.41,83945.91,72001.41,83945.91,0,-11944.5,-11944.5,-11944.5,-11944.5,0 -2015-04-19,21693.4,30305.9,21693.4,32430.9,0,-8612.5,-10737.5,-8612.5,-10737.5,-2125 -2015-04-20,69374.6,50946.1,69374.6,50946.1,0,18428.5,18428.5,18428.5,18428.5,0 -2015-04-21,74707.66,79151.16,74707.66,87401.16,0,-4443.5,-12693.5,-4443.5,-12693.5,-8250 -2015-04-22,66358.17,70649.17,66358.17,77769.17,0,-4291,-11411,-4291,-11411,-7120 -2015-04-23,38591.14,43344.92,38591.14,43059.92,0,-4753.78,-4468.78,-4753.78,-4468.78,285 -2015-04-24,90151.6,76713.49,90151.6,74890.59,0,13438.11,15261.01,13438.11,15261.01,1822.90000000001 -2015-04-25,50561.45,66087.78,50561.45,77087.78,0,-15526.33,-26526.33,-15526.33,-26526.33,-11000 -2015-04-26,35347.17,39399.17,35347.17,40099.17,0,-4052,-4752,-4052,-4752,-700 -2015-04-27,73316.79,64416.79,73316.79,74316.79,0,8899.99999999999,-1000,8899.99999999999,-1000,-9899.99999999999 -2015-04-28,74262.68,72119.68,74262.68,72119.68,0,2143,2143,2143,2143,0 -2015-04-29,50068.29,58412.25,50068.29,58412.25,0,-8343.96,-8343.96,-8343.96,-8343.96,0 -2015-04-30,106085.06,97026.12,106085.06,107502.09,0,9058.94,-1417.03,9058.94,-1417.03,-10475.97 -2015-05-01,39073.99,34715.77,39073.99,44915.77,0,4358.22,-5841.78,4358.22,-5841.78,-10200 -2015-05-02,39723.99,41460.19,39723.99,46060.19,0,-1736.2,-6336.2,-1736.2,-6336.2,-4600 -2015-05-03,46407.44,52729.35,46407.44,53294.35,0,-6321.91,-6886.91,-6321.91,-6886.91,-565 -2015-05-04,40495.7,45223.79,40495.7,44423.79,0,-4728.09,-3928.09,-4728.09,-3928.09,800 -2015-05-05,107931.43,75222.41,107931.43,76152.17,0,32709.02,31779.26,32709.02,31779.26,-929.759999999995 -2015-05-06,83191.86,96599.22,83191.86,97819.22,0,-13407.36,-14627.36,-13407.36,-14627.36,-1220 -2015-05-07,60814.4,60016.06,60814.4,66175.06,0,798.340000000004,-5360.66,798.340000000004,-5360.66,-6159 -2015-05-08,91535.58,98611.38,91535.58,98611.38,0,-7075.8,-7075.8,-7075.8,-7075.8,0 -2015-05-09,27759.07,34380.2,27759.07,39980.2,0,-6621.13,-12221.13,-6621.13,-12221.13,-5600 -2015-05-10,34863.2,42355.27,34863.2,42355.27,0,-7492.07,-7492.07,-7492.07,-7492.07,0 -2015-05-11,47936.9,43777.9,47936.9,47197.9,0,4159,739,4159,739,-3420 -2015-05-12,50186.89,54095.09,50186.89,52990.19,0,-3908.2,-2803.3,-3908.2,-2803.3,1104.89999999999 -2015-05-13,66068.01,58556.81,66068.01,58556.81,0,7511.2,7511.2,7511.2,7511.2,0 -2015-05-14,75886.76,70112.72,75886.76,67262.72,0,5774.03999999999,8624.03999999999,5774.03999999999,8624.03999999999,2850 -2015-05-15,103940.41,102595.25,103940.41,104880.17,0,1345.16,-939.759999999995,1345.16,-939.759999999995,-2284.92 -2015-05-16,68773.09,60119.37,68773.09,61165.37,0,8653.72,7607.71999999999,8653.72,7607.71999999999,-1046 -2015-05-17,81142.35,84604.77,81142.35,80403.77,0,-3462.42,738.580000000002,-3462.42,738.580000000002,4201 -2015-05-18,90349.95,92463.13,90349.91,89059.93,0.0399999999935972,-2113.18000000001,1290.02,-2113.22,1289.98000000001,3403.20000000001 -2015-05-19,109794.61,113927.93,109794.61,120460.43,0,-4133.31999999999,-10665.82,-4133.31999999999,-10665.82,-6532.5 -2015-05-20,124542.67,133188.52,124542.67,134852.78,0,-8645.84999999999,-10310.11,-8645.84999999999,-10310.11,-1664.26000000001 -2015-05-21,94974.72,67002.27,94974.72,66602.27,0,27972.45,28372.45,27972.45,28372.45,400 -2015-05-22,107978.15,130566.75,107978.15,134066.75,0,-22588.6,-26088.6,-22588.6,-26088.6,-3500 -2015-05-23,94918.9,90084.9,94918.9,93130.39,0,4834,1788.50999999999,4834,1788.50999999999,-3045.49000000001 -2015-05-24,63507.49,71100.67,63507.49,68100.67,0,-7593.18,-4593.18,-7593.18,-4593.18,3000 -2015-05-25,103577.04,83067.66,103577.04,93887.04,0,20509.38,9690,20509.38,9690,-10819.38 -2015-05-26,93160.02,103474.16,93160.02,109192.76,0,-10314.14,-16032.74,-10314.14,-16032.74,-5718.59999999999 -2015-05-27,89936.17,98319.88,89936.17,98185.28,0,-8383.71000000001,-8249.11,-8383.71000000001,-8249.11,134.600000000006 -2015-05-28,91256.89,97489.84,91256.89,101539.84,0,-6232.95,-10282.95,-6232.95,-10282.95,-4050 -2015-05-29,72403.72,59834.22,72403.72,60834.22,0,12569.5,11569.5,12569.5,11569.5,-1000 -2015-05-30,65490.14,67823,65490.14,66546,0,-2332.86,-1055.86,-2332.86,-1055.86,1277 -2015-05-31,62824.26,66287.3,62824.26,65487.3,0,-3463.04,-2663.04,-3463.04,-2663.04,800 -2015-06-01,77865.7,71519.75,77865.7,70519.75,0,6345.95,7345.95,6345.95,7345.95,1000 -2015-06-02,82426.51,87591.63,82426.51,86253.63,0,-5165.12000000001,-3827.12000000001,-5165.12000000001,-3827.12000000001,1338 -2015-06-03,78580.73,82474.6,78580.73,81824.6,0,-3893.87000000001,-3243.87000000001,-3893.87000000001,-3243.87000000001,650 -2015-06-04,150744.09,137703.63,150744.09,133273.87,0,13040.46,17470.22,13040.46,17470.22,4429.76000000001 -2015-06-05,164503.63,174621.28,164503.68,166459.44,-0.0499999999883585,-10117.65,-1955.81,-10117.6,-1955.76000000001,8161.84 -2015-06-06,83671.03,76624.52,83671.03,75578.52,0,7046.51,8092.51,7046.51,8092.51,1046 -2015-06-07,81110.45,85499.93,81110.45,84849.93,0,-4389.48,-3739.48,-4389.48,-3739.48,650 -2015-06-08,94232.52,97689.32,94232.52,104711.2,0,-3456.8,-10478.68,-3456.8,-10478.68,-7021.87999999999 -2015-06-09,79521.7,79908.34,79521.7,79908.34,0,-386.639999999999,-386.639999999999,-386.639999999999,-386.639999999999,0 -2015-06-10,205885.03,183206.74,205885.03,186956.74,0,22678.29,18928.29,22678.29,18928.29,-3750 -2015-06-11,172315.33,177531.08,172315.33,186891.08,0,-5215.75,-14575.75,-5215.75,-14575.75,-9360 -2015-06-12,130392.27,136385.78,130392.27,132949.65,0,-5993.51,-2557.37999999999,-5993.51,-2557.37999999999,3436.13000000001 -2015-06-13,90940.37,100240.67,90940.37,97195.18,0,-9300.3,-6254.81,-9300.3,-6254.81,3045.49000000001 -2015-06-14,96482.09,83008.87,96482.09,82308.87,0,13473.22,14173.22,13473.22,14173.22,700 -2015-06-15,168974.78,160606.67,168974.78,147173.11,0,8368.10999999999,21801.67,8368.10999999999,21801.67,13433.56 -2015-06-16,152058.1,126828.11,152058.1,122878.11,0,25229.99,29179.99,25229.99,29179.99,3950 -2015-06-17,182481.25,225424.66,182481.2,223499.26,0.0499999999883585,-42943.41,-41018.01,-42943.46,-41018.06,1925.39999999999 -2015-06-18,116454.86,107744.56,116454.86,111183.56,0,8710.3,5271.3,8710.3,5271.3,-3439 -2015-06-19,163740.51,167632.41,163740.51,170048.73,0,-3891.89999999999,-6308.22,-3891.89999999999,-6308.22,-2416.32000000001 -2015-06-20,113853.22,116495.52,113853.22,116495.52,0,-2642.3,-2642.3,-2642.3,-2642.3,0 -2015-06-21,105937.7,121908.9,105937.7,121385.9,0,-15971.2,-15448.2,-15971.2,-15448.2,523 -2015-06-22,124698.92,109089.12,124698.92,110709.12,0,15609.8,13989.8,15609.8,13989.8,-1620 -2015-06-23,150621.14,164465.84,150621.14,164465.84,0,-13844.7,-13844.7,-13844.7,-13844.7,0 -2015-06-24,156228.06,133497.81,156228.06,134997.81,0,22730.25,21230.25,22730.25,21230.25,-1500 -2015-06-25,203637.9,200897.75,203637.9,194397.75,0,2740.14999999999,9240.14999999999,2740.14999999999,9240.14999999999,6500 -2015-06-26,128704.04,146665.64,128704.04,152133.36,0,-17961.6,-23429.32,-17961.6,-23429.32,-5467.71999999997 -2015-06-27,141230.01,143790.81,141230.01,143740.81,0,-2560.79999999999,-2510.79999999999,-2560.79999999999,-2510.79999999999,50 -2015-06-28,89686.35,97422.35,89686.35,96853.35,0,-7736,-7167,-7736,-7167,569 -2015-06-29,111403.24,96535.52,111403.24,96589.52,0,14867.72,14813.72,14867.72,14813.72,-54 -2015-06-30,152835.89,125511.9,152835.89,125908.9,0,27323.99,26926.99,27323.99,26926.99,-397 -2015-07-01,188705.83,207408.74,188705.83,210113.6,0,-18702.91,-21407.77,-18702.91,-21407.77,-2704.86000000002 -2015-07-02,181770.61,173982.14,181770.61,163122.14,0,7788.46999999997,18648.47,7788.46999999997,18648.47,10860 -2015-07-03,149634.65,148117.82,149634.65,140215.5,0,1516.82999999999,9419.14999999999,1516.82999999999,9419.14999999999,7902.32000000001 -2015-07-04,175563.15,193692.85,175563.15,196996.85,0,-18129.7,-21433.7,-18129.7,-21433.7,-3304 -2015-07-05,121943.8,102532.2,121943.8,105867.69,0,19411.6,16076.11,19411.6,16076.11,-3335.49000000001 -2015-07-06,167453.73,175369.11,167453.73,168624.31,0,-7915.37999999998,-1170.57999999999,-7915.37999999998,-1170.57999999999,6744.79999999999 -2015-07-07,131354.66,129031.24,131354.66,135779.24,0,2323.42,-4424.57999999999,2323.42,-4424.57999999999,-6747.99999999999 -2015-07-08,179687.59,180178.03,179687.54,184610.08,0.0499999999883585,-490.440000000002,-4922.48999999999,-490.489999999991,-4922.53999999998,-4432.04999999999 -2015-07-09,213923.67,204039.51,213923.67,206889.51,0,9884.16,7034.16,9884.16,7034.16,-2850 -2015-07-10,246002.36,251901.68,246002.36,270553.82,0,-5899.32000000001,-24551.46,-5899.32000000001,-24551.46,-18652.14 -2015-07-11,169076,170306.88,169076,173789.88,0,-1230.88,-4713.88000000001,-1230.88,-4713.88000000001,-3483 -2015-07-12,141794.59,142689.08,141794.59,142089.08,0,-894.489999999991,-294.489999999991,-894.489999999991,-294.489999999991,600 -2015-07-13,245599.51,226457.58,245599.51,219218.58,0,19141.93,26380.93,19141.93,26380.93,7239 -2015-07-14,213976.86,219859.43,213976.89,215567.56,-0.0300000000279397,-5882.57000000001,-1590.70000000001,-5882.53999999998,-1590.66999999998,4291.87 -2015-07-15,239552.36,261141.64,239552.36,259667.35,0,-21589.28,-20114.99,-21589.28,-20114.99,1474.29000000001 -2015-07-16,190273.36,203695.01,190273.36,211526.71,0,-13421.65,-21253.35,-13421.65,-21253.35,-7831.69999999998 -2015-07-17,247942.13,215297.13,247942.13,215213.13,0,32645,32729,32645,32729,84 -2015-07-18,155754.79,186058.89,155754.79,178058.89,0,-30304.1,-22304.1,-30304.1,-22304.1,8000 -2015-07-19,136560.26,120740.46,136560.26,135902.46,0,15819.8,657.800000000017,15819.8,657.800000000017,-15162 -2015-07-20,227588.44,198440.04,227588.44,210608.87,0,29148.4,16979.57,29148.4,16979.57,-12168.83 -2015-07-21,212914.28,224767.72,212914.28,222567.72,0,-11853.44,-9653.44,-11853.44,-9653.44,2200 -2015-07-22,174529.18,195103.46,174529.18,196848.46,0,-20574.28,-22319.28,-20574.28,-22319.28,-1745 -2015-07-23,219616.85,211585.58,219616.85,207507.76,0,8031.27000000002,12109.09,8031.27000000002,12109.09,4077.81999999998 -2015-07-24,211341.19,224990.9,211341.19,220939.9,0,-13649.71,-9598.70999999999,-13649.71,-9598.70999999999,4051 -2015-07-25,166868.81,152209.68,166868.81,162409.68,0,14659.13,4459.13,14659.13,4459.13,-10200 -2015-07-26,95019.5,115494.37,95019.5,115494.37,0,-20474.87,-20474.87,-20474.87,-20474.87,0 -2015-07-27,161404.46,144292.23,161404.46,133590.14,0,17112.23,27814.32,17112.23,27814.32,10702.09 -2015-07-28,221954.02,212243.92,221954.02,212745.83,0,9710.09999999998,9208.19,9710.09999999998,9208.19,-501.909999999974 -2015-07-29,186584.31,203672.8,186584.31,196414.52,0,-17088.49,-9830.20999999999,-17088.49,-9830.20999999999,7258.28 -2015-07-30,156173.85,158997.61,156173.85,157097.61,0,-2823.75999999998,-923.75999999998,-2823.75999999998,-923.75999999998,1900 -2015-07-31,240742.36,231431.01,240742.36,241894.31,0,9311.34999999998,-1151.95000000001,9311.34999999998,-1151.95000000001,-10463.3 -2015-08-01,184539.11,183261.71,184539.11,177561.71,0,1277.39999999999,6977.39999999999,1277.39999999999,6977.39999999999,5700 -2015-08-02,106209.14,118378.07,106209.14,117878.07,0,-12168.93,-11668.93,-12168.93,-11668.93,500 -2015-08-03,151487.72,150839.54,151487.72,150839.54,0,648.179999999993,648.179999999993,648.179999999993,648.179999999993,0 -2015-08-04,228990.24,205772.33,228990.24,205772.33,0,23217.91,23217.91,23217.91,23217.91,0 -2015-08-05,186465.15,191702.07,186465.15,186301.32,0,-5236.92000000001,163.829999999987,-5236.92000000001,163.829999999987,5400.75 -2015-08-06,265585.22,267312.04,265585.22,265743.34,0,-1726.82000000001,-158.120000000054,-1726.82000000001,-158.120000000054,1568.69999999995 -2015-08-07,192385.47,193515.72,192385.47,189615.72,0,-1130.25,2769.75,-1130.25,2769.75,3900 -2015-08-08,195508.23,215116.72,195508.23,213726.72,0,-19608.49,-18218.49,-19608.49,-18218.49,1390 -2015-08-09,99584.9,84761.24,99584.9,84005.29,0,14823.66,15579.61,14823.66,15579.61,755.950000000012 -2015-08-10,200991.21,205095.53,200991.21,205095.53,0,-4104.32000000001,-4104.32000000001,-4104.32000000001,-4104.32000000001,0 -2015-08-11,228263.41,209429.31,228263.41,208625.35,0,18834.1,19638.06,18834.1,19638.06,803.959999999992 -2015-08-12,215724.52,217485.52,215724.52,215738.57,0,-1761,-14.0500000000175,-1761,-14.0500000000175,1746.94999999998 -2015-08-13,275901.98,250169.28,275901.98,246369.28,0,25732.7,29532.7,25732.7,29532.7,3800 -2015-08-14,253774.01,283512.94,253774.01,283512.94,0,-29738.93,-29738.93,-29738.93,-29738.93,0 -2015-08-15,190197.92,215808.54,190197.92,215808.54,0,-25610.62,-25610.62,-25610.62,-25610.62,0 -2015-08-16,155176.65,116494.77,155176.65,116494.77,0,38681.88,38681.88,38681.88,38681.88,0 -2015-08-17,215018.71,235223.44,215018.71,234223.44,0,-20204.73,-19204.73,-20204.73,-19204.73,1000 -2015-08-18,196869.64,207652.95,196869.64,206607.15,0,-10783.31,-9737.50999999998,-10783.31,-9737.50999999998,1045.80000000002 -2015-08-19,231645.69,203589.93,231645.69,201622.43,0,28055.76,30023.26,28055.76,30023.26,1967.5 -2015-08-20,316347.77,277107.76,316347.77,277107.76,0,39240.01,39240.01,39240.01,39240.01,0 -2015-08-21,231804.76,295502.17,231804.76,292762.17,0,-63697.41,-60957.41,-63697.41,-60957.41,2740 -2015-08-22,124293.58,129996.25,124293.58,129996.25,0,-5702.67,-5702.67,-5702.67,-5702.67,0 -2015-08-23,140643.19,128625.86,140643.19,126510.86,0,12017.33,14132.33,12017.33,14132.33,2115 -2015-08-24,209294.29,204882.65,209294.29,204882.65,0,4411.64000000001,4411.64000000001,4411.64000000001,4411.64000000001,0 -2015-08-25,222892.77,219595.47,222892.77,216238.47,0,3297.29999999999,6654.29999999999,3297.29999999999,6654.29999999999,3357 -2015-08-26,233904.16,249550.85,233904.16,245982.15,0,-15646.69,-12077.99,-15646.69,-12077.99,3568.70000000001 -2015-08-27,197874.39,190479.14,197874.39,189088.14,0,7395.25,8786.25,7395.25,8786.25,1391 -2015-08-28,239206.26,239596.75,239206.26,238610.75,0,-390.489999999991,595.510000000009,-390.489999999991,595.510000000009,986 -2015-08-29,179315.36,192333.6,179315.36,187930.74,0,-13018.24,-8615.38000000001,-13018.24,-8615.38000000001,4402.86000000002 -2015-08-30,131324.85,116170.7,131324.85,111738.7,0,15154.15,19586.15,15154.15,19586.15,4432 -2015-08-31,269157.06,239674.44,269157.06,238674.44,0,29482.62,30482.62,29482.62,30482.62,1000 -2015-09-01,240041.86,247353.2,240041.86,247352.2,0,-7311.34000000003,-7310.34000000003,-7311.34000000003,-7310.34000000003,1 -2015-09-02,204823.15,246056.06,204823.15,243298.15,0,-41232.91,-38475,-41232.91,-38475,2757.91 -2015-09-03,214155.11,198544.26,214155.11,197544.26,0,15610.85,16610.85,15610.85,16610.85,1000 -2015-09-04,329627.64,324534.52,329627.64,324534.52,0,5093.12,5093.12,5093.12,5093.12,0 -2015-09-05,159735.48,182528,159735.48,185518,0,-22792.52,-25782.52,-22792.52,-25782.52,-2990 -2015-09-06,142722.05,143153.12,142722.05,139108.12,0,-431.070000000007,3613.92999999999,-431.070000000007,3613.92999999999,4045 -2015-09-07,313206.04,292467.12,313206.04,288367.12,0,20738.92,24838.92,20738.92,24838.92,4100 -2015-09-08,255830.94,238382.72,255830.94,236322.92,0,17448.22,19508.02,17448.22,19508.02,2059.79999999999 -2015-09-09,245137.62,259827.29,245137.62,255727.29,0,-14689.67,-10589.67,-14689.67,-10589.67,4100 -2015-09-10,282135.31,284320.57,282135.31,283320.57,0,-2185.26000000001,-1185.26000000001,-2185.26000000001,-1185.26000000001,1000 -2015-09-11,330104.69,307701.4,330104.69,302025.4,0,22403.29,28079.29,22403.29,28079.29,5676 -2015-09-12,243226.84,259018.29,243226.84,261318.29,0,-15791.45,-18091.45,-15791.45,-18091.45,-2300 -2015-09-13,163510.02,189479.94,163510.02,189479.94,0,-25969.92,-25969.92,-25969.92,-25969.92,0 -2015-09-14,279528.78,231054.57,279528.78,231054.57,0,48474.21,48474.21,48474.21,48474.21,0 -2015-09-15,272622.37,287332.22,272622.37,280390.22,0,-14709.85,-7767.84999999998,-14709.85,-7767.84999999998,6942 -2015-09-16,346290.09,343035.2,346290.09,343035.2,0,3254.89000000001,3254.89000000001,3254.89000000001,3254.89000000001,0 -2015-09-17,301997.59,332507.51,301997.59,330960.35,0,-30509.92,-28962.76,-30509.92,-28962.76,1547.16000000003 -2015-09-18,312066.5,284999.66,312066.5,284999.66,0,27066.84,27066.84,27066.84,27066.84,0 -2015-09-19,246053.67,283460.36,246053.67,276668.75,0,-37406.69,-30615.08,-37406.69,-30615.08,6791.60999999999 -2015-09-20,190800.21,178270.23,190800.21,176870.23,0,12529.98,13929.98,12529.98,13929.98,1400 -2015-09-21,209571.01,209587.61,209571.01,207651.61,0,-16.5999999999767,1919.40000000002,-16.5999999999767,1919.40000000002,1936 -2015-09-22,222810.47,220111.26,222810.47,217510.4,0,2699.20999999999,5300.07000000001,2699.20999999999,5300.07000000001,2600.86000000002 -2015-09-23,257756.29,254726.27,257756.29,254726.27,0,3030.02000000002,3030.02000000002,3030.02000000002,3030.02000000002,0 -2015-09-24,253552.39,254705.21,253552.39,254705.21,0,-1152.81999999998,-1152.81999999998,-1152.81999999998,-1152.81999999998,0 -2015-09-25,275161.22,252148.14,275161.22,252148.14,0,23013.08,23013.08,23013.08,23013.08,0 -2015-09-26,192824.95,227588.96,192824.95,227188.96,0,-34764.01,-34364.01,-34764.01,-34364.01,400 -2015-09-27,187547.06,153099.38,187547.06,153099.38,0,34447.68,34447.68,34447.68,34447.68,0 -2015-09-28,309174.81,287692.49,309174.81,287692.49,0,21482.32,21482.32,21482.32,21482.32,0 -2015-09-29,164078.06,202170.93,164078.06,201870.93,0,-38092.87,-37792.87,-38092.87,-37792.87,300 -2015-09-30,296756.89,284290.87,296756.89,281790.87,0,12466.02,14966.02,12466.02,14966.02,2500 -2015-10-01,313661.64,325029.61,313661.64,310877.61,0,-11367.97,2784.03000000003,-11367.97,2784.03000000003,14152 -2015-10-02,264718.65,267575.63,264718.65,266575.63,0,-2856.97999999998,-1856.97999999998,-2856.97999999998,-1856.97999999998,1000 -2015-10-03,200676.91,183259.99,200676.91,183259.99,0,17416.92,17416.92,17416.92,17416.92,0 -2015-10-04,149285.92,178651.2,149285.92,178651.2,0,-29365.28,-29365.28,-29365.28,-29365.28,0 -2015-10-05,298950.96,275708.59,298950.96,274510.5,0,23242.37,24440.46,23242.37,24440.46,1198.09000000003 -2015-10-06,257755.77,244198.79,257755.77,244198.79,0,13556.98,13556.98,13556.98,13556.98,0 -2015-10-07,322962.13,331277.76,322962.13,327977.76,0,-8315.63,-5015.63000000001,-8315.63,-5015.63000000001,3300 -2015-10-08,273501.62,288835.8,273501.62,288635.8,0,-15334.18,-15134.18,-15334.18,-15134.18,200 -2015-10-09,335332.03,288223.61,335332.03,288223.61,0,47108.4200000001,47108.4200000001,47108.4200000001,47108.4200000001,0 -2015-10-10,333970.35,374481.03,333970.35,371581.03,0,-40510.6800000001,-37610.6800000001,-40510.6800000001,-37610.6800000001,2900 -2015-10-11,166572.29,188047.07,166572.29,187047.07,0,-21474.78,-20474.78,-21474.78,-20474.78,1000 -2015-10-12,243084.38,197519.45,243084.38,197519.45,0,45564.93,45564.93,45564.93,45564.93,0 -2015-10-13,280174.61,294439.69,280174.61,288871.52,0,-14265.08,-8696.91000000003,-14265.08,-8696.91000000003,5568.16999999998 -2015-10-14,349941.02,332929.11,349941.02,332929.11,0,17011.91,17011.91,17011.91,17011.91,0 -2015-10-15,361235.06,360832.81,361235.06,358432.81,0,402.25,2802.25,402.25,2802.25,2400 -2015-10-16,364613.96,374231.33,364613.96,374731.33,0,-9617.37,-10117.37,-9617.37,-10117.37,-500 -2015-10-17,220117.18,227597.22,220117.18,227597.22,0,-7480.04000000001,-7480.04000000001,-7480.04000000001,-7480.04000000001,0 -2015-10-18,182321.92,207838.52,182321.92,203988.52,0,-25516.6,-21666.6,-25516.6,-21666.6,3850 -2015-10-19,369732.73,355693.64,369732.73,355893.64,0,14039.09,13839.09,14039.09,13839.09,-200 -2015-10-20,363480.72,338865.83,363480.72,336539.64,0,24614.89,26941.08,24614.89,26941.08,2326.19 -2015-10-21,307915.06,332312.31,307915.06,332312.31,0,-24397.25,-24397.25,-24397.25,-24397.25,0 -2015-10-22,339092.28,305261.69,339092.28,305261.69,0,33830.59,33830.59,33830.59,33830.59,0 -2015-10-23,339399.54,370500.77,339399.54,369500.77,0,-31101.23,-30101.23,-31101.23,-30101.23,1000 -2015-10-24,223908.24,234139.97,223908.24,233139.97,0,-10231.73,-9231.73000000001,-10231.73,-9231.73000000001,1000 -2015-10-25,219205.16,195257.37,219205.16,194097.37,0,23947.79,25107.79,23947.79,25107.79,1160 -2015-10-26,293151.87,292365.95,293151.87,286665.95,0,785.919999999984,6485.91999999998,785.919999999984,6485.91999999998,5700 -2015-10-27,266345.17,283584.1,266345.17,283584.1,0,-17238.93,-17238.93,-17238.93,-17238.93,0 -2015-10-28,341619.71,307172.53,341619.71,306172.53,0,34447.18,35447.18,34447.18,35447.18,1000 -2015-10-29,263989.79,290277.33,263989.79,290277.33,0,-26287.54,-26287.54,-26287.54,-26287.54,0 -2015-10-30,330873.5,318519.26,330873.5,314519.26,0,12354.24,16354.24,12354.24,16354.24,4000 -2015-10-31,302886.58,327503.94,302886.58,325853.94,0,-24617.36,-22967.36,-24617.36,-22967.36,1650 -2015-11-01,194079.81,187743.3,194079.81,187743.3,0,6336.51000000001,6336.51000000001,6336.51000000001,6336.51000000001,0 -2015-11-02,259628.13,260470.51,259628.13,259085.51,0,-842.380000000005,542.619999999995,-842.380000000005,542.619999999995,1385 -2015-11-03,348682.19,318627.16,348682.19,318558.99,0,30055.03,30123.2,30055.03,30123.2,68.1699999999837 -2015-11-04,290315.68,328526.05,290315.68,328526.05,0,-38210.37,-38210.37,-38210.37,-38210.37,0 -2015-11-05,370265.38,345599.74,370265.38,343599.74,0,24665.64,26665.64,24665.64,26665.64,2000 -2015-11-06,381520.8,403361.82,381520.8,401861.82,0,-21841.02,-20341.02,-21841.02,-20341.02,1500 -2015-11-07,258333.67,264182.35,258333.67,264182.35,0,-5848.67999999996,-5848.67999999996,-5848.67999999996,-5848.67999999996,0 -2015-11-08,207303.48,205096.83,207303.48,203996.83,0,2206.65000000002,3306.65000000002,2206.65000000002,3306.65000000002,1100 -2015-11-09,372710.95,329382.49,372710.95,329382.49,0,43328.46,43328.46,43328.46,43328.46,0 -2015-11-10,451573.22,425687.96,451573.22,424087.96,0,25885.26,27485.26,25885.26,27485.26,1600 -2015-11-11,556931,570943.82,556931,570943.82,0,-14012.82,-14012.82,-14012.82,-14012.82,0 -2015-11-12,419993.41,438475.39,419993.41,441725.39,0,-18481.98,-21731.98,-18481.98,-21731.98,-3250 -2015-11-13,456344.47,480231.03,456344.47,480731.03,0,-23886.5600000001,-24386.5600000001,-23886.5600000001,-24386.5600000001,-500 -2015-11-14,329744.75,327456.87,329744.75,328456.87,0,2287.88000000001,1287.88,2287.88000000001,1287.88,-1000 -2015-11-15,216485.8,224450.29,216485.8,221117.14,0,-7964.49000000002,-4631.34000000003,-7964.49000000002,-4631.34000000003,3333.14999999999 -2015-11-16,346782.75,329029.48,346782.75,328798.03,0,17753.27,17984.72,17753.27,17984.72,231.449999999953 -2015-11-17,302571.24,275370.96,302571.24,278920.96,0,27200.28,23650.28,27200.28,23650.28,-3550 -2015-11-18,369872.32,406420.38,369872.32,407420.38,0,-36548.06,-37548.06,-36548.06,-37548.06,-1000 -2015-11-19,375479.02,360796.63,375479.02,361796.63,0,14682.39,13682.39,14682.39,13682.39,-1000 -2015-11-20,456522.59,460645.39,456522.59,459645.39,0,-4122.79999999999,-3122.79999999999,-4122.79999999999,-3122.79999999999,1000 -2015-11-21,286501.22,300765.79,286501.22,300765.79,0,-14264.57,-14264.57,-14264.57,-14264.57,0 -2015-11-22,253522.46,257473.8,253522.46,260473.8,0,-3951.34,-6951.34,-3951.34,-6951.34,-3000 -2015-11-23,315657.34,301200.6,315657.34,298200.6,0,14456.7400000001,17456.7400000001,14456.7400000001,17456.7400000001,3000 -2015-11-24,322060.44,314275.88,322060.44,314275.88,0,7784.56,7784.56,7784.56,7784.56,0 -2015-11-25,389620.44,389317.84,389620.44,389317.84,0,302.599999999977,302.599999999977,302.599999999977,302.599999999977,0 -2015-11-26,337303.91,375695.83,337303.91,373895.83,0,-38391.92,-36591.92,-38391.92,-36591.92,1800 -2015-11-27,369513.22,328540.75,369513.22,328540.75,0,40972.47,40972.47,40972.47,40972.47,0 -2015-11-28,274161.64,309974.8,274161.64,308124.8,0,-35813.16,-33963.16,-35813.16,-33963.16,1850 -2015-11-29,207489.14,206672.83,207489.14,203085.66,0,816.310000000027,4403.48000000001,816.310000000027,4403.48000000001,3587.16999999998 -2015-11-30,350139.77,311171.39,350139.77,311051.39,0,38968.38,39088.38,38968.38,39088.38,120 -2015-12-01,336344.38,337663.4,336344.38,337663.4,0,-1319.02000000002,-1319.02000000002,-1319.02000000002,-1319.02000000002,0 -2015-12-02,405868.55,405246.56,405868.55,405246.56,0,621.989999999991,621.989999999991,621.989999999991,621.989999999991,0 -2015-12-03,359521.06,356356.95,359521.06,356356.95,0,3164.10999999999,3164.10999999999,3164.10999999999,3164.10999999999,0 -2015-12-04,448984.64,440910.83,448984.64,441760.83,0,8073.81,7223.81,8073.81,7223.81,-850 -2015-12-05,278154.11,314469.43,278154.11,315469.43,0,-36315.32,-37315.32,-36315.32,-37315.32,-1000 -2015-12-06,200347.76,218469.71,200347.76,218469.71,0,-18121.95,-18121.95,-18121.95,-18121.95,0 -2015-12-07,435979.55,378464.89,435979.55,378464.89,0,57514.66,57514.66,57514.66,57514.66,0 -2015-12-08,308886.55,325429.1,308886.55,322602.66,0,-16542.55,-13716.11,-16542.55,-13716.11,2826.44 -2015-12-09,375912.75,373923.91,375912.75,373923.91,0,1988.84000000003,1988.84000000003,1988.84000000003,1988.84000000003,0 -2015-12-10,493524.3,497436.21,493524.3,497936.21,0,-3911.91000000003,-4411.91000000003,-3911.91000000003,-4411.91000000003,-500 -2015-12-11,480640.51,451313.23,480640.51,450843.23,0,29327.28,29797.28,29327.28,29797.28,470 -2015-12-12,347949.21,386151.03,347949.21,386151.03,0,-38201.82,-38201.82,-38201.82,-38201.82,0 -2015-12-13,243774.83,250537.33,243774.83,249605.93,0,-6762.5,-5831.10000000001,-6762.5,-5831.10000000001,931.399999999994 -2015-12-14,342463.02,338820.86,342463.02,340320.86,0,3642.16000000003,2142.16000000003,3642.16000000003,2142.16000000003,-1500 -2015-12-15,477812.37,390627.46,477812.37,384577.46,0,87184.91,93234.91,87184.91,93234.91,6050 -2015-12-16,461346.71,522214.69,461346.71,525714.69,0,-60867.98,-64367.9799999999,-60867.98,-64367.9799999999,-3499.99999999994 -2015-12-17,405450.75,423038.91,405450.75,423038.91,0,-17588.16,-17588.16,-17588.16,-17588.16,0 -2015-12-18,540284.89,546320.02,540284.89,546366.02,0,-6035.13000000001,-6081.13,-6035.13000000001,-6081.13,-46 -2015-12-19,426246.71,438953.81,426246.71,438353.81,0,-12707.1,-12107.1,-12707.1,-12107.1,600 -2015-12-20,237731.92,231648.07,237731.92,231648.07,0,6083.85000000001,6083.85000000001,6083.85000000001,6083.85000000001,0 -2015-12-21,387603.24,388985.09,387603.24,388985.09,0,-1381.85000000004,-1381.85000000004,-1381.85000000004,-1381.85000000004,0 -2015-12-22,475202.7,453996.32,475202.7,453996.32,0,21206.38,21206.38,21206.38,21206.38,0 -2015-12-23,330928.11,352472.85,330928.11,353472.85,0,-21544.74,-22544.74,-21544.74,-22544.74,-1000 -2015-12-24,422060.53,357483.27,422060.53,358483.27,0,64577.26,63577.26,64577.26,63577.26,-1000 -2015-12-25,607892.52,586107.67,607892.52,586107.67,0,21784.85,21784.85,21784.85,21784.85,0 -2015-12-26,416524.32,476236.03,416524.32,477286.03,0,-59711.71,-60761.71,-59711.71,-60761.71,-1050 -2015-12-27,310343.33,345417.62,310343.33,345417.62,0,-35074.29,-35074.29,-35074.29,-35074.29,0 -2015-12-28,412043.51,363368.71,412043.51,363368.71,0,48674.8,48674.8,48674.8,48674.8,0 -2015-12-29,556166.26,517287.3,556166.26,519104.3,0,38878.96,37061.96,38878.96,37061.96,-1817 -2015-12-30,594503.19,635226.8,594503.19,633826.8,0,-40723.6100000001,-39323.6100000001,-40723.6100000001,-39323.6100000001,1400 -2015-12-31,622935.51,659443.02,622935.51,659443.02,0,-36507.51,-36507.51,-36507.51,-36507.51,0 -2016-01-01,200814.02,210854.25,200814.02,210854.25,0,-10040.23,-10040.23,-10040.23,-10040.23,0 -2016-01-02,210040.76,221400.72,210040.76,221400.72,0,-11359.96,-11359.96,-11359.96,-11359.96,0 -2016-01-03,325409.26,306952.69,325409.26,306952.69,0,18456.57,18456.57,18456.57,18456.57,0 -2016-01-04,360696.11,348187.43,360696.11,348787.43,0,12508.68,11908.68,12508.68,11908.68,-600 -2016-01-05,332201.13,350683.98,332201.13,350183.98,0,-18482.85,-17982.85,-18482.85,-17982.85,500 -2016-01-06,337560.99,328135.99,337560.99,328135.99,0,9425,9425,9425,9425,0 -2016-01-07,323713.1,318959.56,323713.1,318959.56,0,4753.53999999998,4753.53999999998,4753.53999999998,4753.53999999998,0 -2016-01-08,385851.06,379007.62,385851.06,379007.62,0,6843.44,6843.44,6843.44,6843.44,0 -2016-01-09,290551.36,300616.01,290551.36,300616.01,0,-10064.65,-10064.65,-10064.65,-10064.65,0 -2016-01-10,343365.13,350816.64,343365.13,350816.64,0,-7451.51000000001,-7451.51000000001,-7451.51000000001,-7451.51000000001,0 -2016-01-11,464663.76,449028.47,464663.76,449028.47,0,15635.29,15635.29,15635.29,15635.29,0 -2016-01-12,474739.79,479351.35,474739.79,479351.35,0,-4611.56,-4611.56,-4611.56,-4611.56,0 -2016-01-13,668519.31,594559.19,668519.31,594559.19,0,73960.1200000001,73960.1200000001,73960.1200000001,73960.1200000001,0 -2016-01-14,527544.07,569661.28,527544.07,569661.28,0,-42117.2100000001,-42117.2100000001,-42117.2100000001,-42117.2100000001,0 -2016-01-15,560237.76,555491.41,560237.76,555491.41,0,4746.34999999998,4746.34999999998,4746.34999999998,4746.34999999998,0 -2016-01-16,469661.21,479190.25,469661.21,480190.25,0,-9529.03999999998,-10529.04,-9529.03999999998,-10529.04,-1000 -2016-01-17,291944.3,313336.43,291944.3,313336.43,0,-21392.13,-21392.13,-21392.13,-21392.13,0 -2016-01-18,475816.93,473105.88,475816.93,467605.88,0,2711.04999999999,8211.04999999999,2711.04999999999,8211.04999999999,5500 -2016-01-19,489945.23,456726.92,489945.23,456726.92,0,33218.31,33218.31,33218.31,33218.31,0 -2016-01-20,579367.97,547002.45,579367.97,547002.45,0,32365.52,32365.52,32365.52,32365.52,0 -2016-01-21,649921.48,675511.13,649921.48,675511.13,0,-25589.65,-25589.65,-25589.65,-25589.65,0 -2016-01-22,515591.63,519701.32,515591.63,519701.32,0,-4109.69,-4109.69,-4109.69,-4109.69,0 -2016-01-23,394260.73,415217.63,394260.73,415217.63,0,-20956.9,-20956.9,-20956.9,-20956.9,0 -2016-01-24,264210.43,286709.28,264210.43,286709.28,0,-22498.85,-22498.85,-22498.85,-22498.85,0 -2016-01-25,498312.18,455269.6,498312.18,456269.6,0,43042.58,42042.58,43042.58,42042.58,-1000 -2016-01-26,479706.84,498766.46,479706.84,498766.46,0,-19059.62,-19059.62,-19059.62,-19059.62,0 -2016-01-27,528960.1,533380.92,528960.1,533380.92,0,-4420.82000000007,-4420.82000000007,-4420.82000000007,-4420.82000000007,0 -2016-01-28,493828.1,477052.16,493828.1,477052.16,0,16775.94,16775.94,16775.94,16775.94,0 -2016-01-29,463823.21,469513.01,463823.21,469513.01,0,-5689.79999999999,-5689.79999999999,-5689.79999999999,-5689.79999999999,0 -2016-01-30,527597.46,528466.34,527597.46,528466.34,0,-868.880000000005,-868.880000000005,-868.880000000005,-868.880000000005,0 -2016-01-31,349621.5,374097.42,349621.5,369097.42,0,-24475.92,-19475.92,-24475.92,-19475.92,5000 -2016-02-01,475443.36,468879.49,475443.36,469879.49,0,6563.87,5563.87,6563.87,5563.87,-1000 -2016-02-02,497186.51,444972.08,497186.51,444772.08,0,52214.43,52414.43,52214.43,52414.43,200 -2016-02-03,654956.11,659285.72,654956.11,659285.72,0,-4329.60999999999,-4329.60999999999,-4329.60999999999,-4329.60999999999,0 -2016-02-04,656207.72,691232.38,656207.72,691232.38,0,-35024.66,-35024.66,-35024.66,-35024.66,0 -2016-02-05,650414.56,590589.39,650414.56,590589.39,0,59825.17,59825.17,59825.17,59825.17,0 -2016-02-06,512185.89,588567.68,512185.89,588567.68,0,-76381.79,-76381.79,-76381.79,-76381.79,0 -2016-02-07,470974.59,462680.64,470974.59,462680.64,0,8293.95000000001,8293.95000000001,8293.95000000001,8293.95000000001,0 -2016-02-08,527439.27,507911.32,527439.27,507911.32,0,19527.95,19527.95,19527.95,19527.95,0 -2016-02-09,655725.64,573732.43,655725.64,573732.43,0,81993.21,81993.21,81993.21,81993.21,0 -2016-02-10,771921.77,781209.17,771921.77,781209.17,0,-9287.40000000002,-9287.40000000002,-9287.40000000002,-9287.40000000002,0 -2016-02-11,752176.62,806925.57,752176.62,806925.57,0,-54748.95,-54748.95,-54748.95,-54748.95,0 -2016-02-12,654448.09,650264.32,654448.09,650264.32,0,4183.77000000002,4183.77000000002,4183.77000000002,4183.77000000002,0 -2016-02-13,529128.53,569268.63,529128.53,569268.63,0,-40140.1,-40140.1,-40140.1,-40140.1,0 -2016-02-14,436277.09,427081.69,436277.09,427081.69,0,9195.40000000002,9195.40000000002,9195.40000000002,9195.40000000002,0 -2016-02-15,676104.09,665927.37,676104.09,665927.37,0,10176.72,10176.72,10176.72,10176.72,0 -2016-02-16,683922.14,689329.1,683922.14,689329.1,0,-5406.95999999996,-5406.95999999996,-5406.95999999996,-5406.95999999996,0 -2016-02-17,649438.37,590162.38,649438.37,590162.38,0,59275.99,59275.99,59275.99,59275.99,0 -2016-02-18,684693.65,686242.86,684693.65,686242.86,0,-1549.20999999996,-1549.20999999996,-1549.20999999996,-1549.20999999996,0 -2016-02-19,716271.85,732038.52,716271.85,732038.52,0,-15766.67,-15766.67,-15766.67,-15766.67,0 -2016-02-20,525484.05,592105.5,525484.05,592105.5,0,-66621.45,-66621.45,-66621.45,-66621.45,0 -2016-02-21,602484.14,549058.43,602484.14,549058.43,0,53425.71,53425.71,53425.71,53425.71,0 -2016-02-22,501396.07,538709.4,501396.07,538409.4,0,-37313.33,-37013.33,-37313.33,-37013.33,300 -2016-02-23,277400.24,316549.78,277400.24,316549.78,0,-39149.54,-39149.54,-39149.54,-39149.54,0 -2016-02-24,518723.31,447620.87,518723.31,447620.87,0,71102.44,71102.44,71102.44,71102.44,0 -2016-02-25,630831.29,628315.32,630831.29,628315.32,0,2515.97000000009,2515.97000000009,2515.97000000009,2515.97000000009,0 -2016-02-26,610102.2,597635.59,610102.2,597635.59,0,12466.61,12466.61,12466.61,12466.61,0 -2016-02-27,490456.8,541856.84,490456.8,541856.84,0,-51400.04,-51400.04,-51400.04,-51400.04,0 -2016-02-28,416732.42,433693.35,416732.42,433693.35,0,-16960.93,-16960.93,-16960.93,-16960.93,0 -2016-02-29,635877.29,569054.78,635877.29,569054.78,0,66822.51,66822.51,66822.51,66822.51,0 -2016-03-01,659545.93,669635.46,659545.93,669635.46,0,-10089.5299999999,-10089.5299999999,-10089.5299999999,-10089.5299999999,0 -2016-03-02,611443.05,608202.24,611443.05,608202.24,0,3240.81000000006,3240.81000000006,3240.81000000006,3240.81000000006,0 -2016-03-03,647540.89,631563.99,647540.89,631563.99,0,15976.9,15976.9,15976.9,15976.9,0 -2016-03-04,753760.86,759843.02,753760.86,759843.02,0,-6082.16000000003,-6082.16000000003,-6082.16000000003,-6082.16000000003,0 -2016-03-05,602871.14,640843.61,602871.14,639843.61,0,-37972.47,-36972.47,-37972.47,-36972.47,1000 -2016-03-06,499675.43,504305.09,499675.43,504305.09,0,-4629.66000000003,-4629.66000000003,-4629.66000000003,-4629.66000000003,0 -2016-03-07,402388.72,421776.86,402388.72,421776.86,0,-19388.14,-19388.14,-19388.14,-19388.14,0 -2016-03-08,311617.32,339934.75,311617.32,339934.75,0,-28317.43,-28317.43,-28317.43,-28317.43,0 -2016-03-09,613938.3,536308.04,613938.3,536208.1,0,77630.26,77730.2000000001,77630.26,77730.2000000001,99.9400000000605 -2016-03-10,674573.22,692393.66,674573.22,692393.66,0,-17820.4400000001,-17820.4400000001,-17820.4400000001,-17820.4400000001,0 -2016-03-11,784568.72,751392.81,784568.72,751392.81,0,33175.9099999999,33175.9099999999,33175.9099999999,33175.9099999999,0 -2016-03-12,444356.73,498287.55,444356.73,498287.55,0,-53930.82,-53930.82,-53930.82,-53930.82,0 -2016-03-13,348942.17,372015.64,348942.17,372015.64,0,-23073.47,-23073.47,-23073.47,-23073.47,0 -2016-03-14,608568.61,530585,608568.61,530585,0,77983.61,77983.61,77983.61,77983.61,0 -2016-03-15,789277.85,802459.3,789277.85,802459.3,0,-13181.4500000001,-13181.4500000001,-13181.4500000001,-13181.4500000001,0 -2016-03-16,612106.53,618307.79,612106.53,618307.79,0,-6201.26000000001,-6201.26000000001,-6201.26000000001,-6201.26000000001,0 -2016-03-17,678762.48,706145.08,678762.48,706145.08,0,-27382.6,-27382.6,-27382.6,-27382.6,0 -2016-03-18,702697.84,660873.26,702697.84,660873.26,0,41824.58,41824.58,41824.58,41824.58,0 -2016-03-19,487705.33,554727.56,487705.33,554727.56,0,-67022.23,-67022.23,-67022.23,-67022.23,0 -2016-03-20,444894.16,419645.69,444894.16,419645.69,0,25248.47,25248.47,25248.47,25248.47,0 -2016-03-21,552671.1,510884.71,552671.1,510684.71,0,41786.39,41986.39,41786.39,41986.39,200 -2016-03-22,554340.31,536908.62,554340.31,536908.62,0,17431.6900000001,17431.6900000001,17431.6900000001,17431.6900000001,0 -2016-03-23,673956.06,719888.14,673956.06,719888.14,0,-45932.08,-45932.08,-45932.08,-45932.08,0 -2016-03-24,699745.76,641745.78,699745.76,641745.78,0,57999.98,57999.98,57999.98,57999.98,0 -2016-03-25,768759.28,791355.9,768759.28,791355.9,0,-22596.62,-22596.62,-22596.62,-22596.62,0 -2016-03-26,556571.01,608012.06,556571.01,608012.06,0,-51441.0500000001,-51441.0500000001,-51441.0500000001,-51441.0500000001,0 -2016-03-27,476914.26,456618.3,476914.26,456618.3,0,20295.96,20295.96,20295.96,20295.96,0 -2016-03-28,653312.14,621828.2,653312.14,621828.2,0,31483.9400000001,31483.9400000001,31483.9400000001,31483.9400000001,0 -2016-03-29,649091.92,696398.63,649091.92,696398.63,0,-47306.71,-47306.71,-47306.71,-47306.71,0 -2016-03-30,626913.43,612301.54,626913.43,612301.54,0,14611.89,14611.89,14611.89,14611.89,0 -2016-03-31,593874.84,613222.6,593874.84,613172.6,0,-19347.76,-19297.76,-19347.76,-19297.76,50 -2016-04-01,767284.53,686604.45,767284.53,686604.45,0,80680.0800000001,80680.0800000001,80680.0800000001,80680.0800000001,0 -2016-04-02,509476.58,582663.55,509476.58,582663.55,0,-73186.97,-73186.97,-73186.97,-73186.97,0 -2016-04-03,425391.35,469888.85,425391.35,469888.85,0,-44497.5,-44497.5,-44497.5,-44497.5,0 -2016-04-04,597786.39,490679.65,597786.39,490679.65,0,107106.74,107106.74,107106.74,107106.74,0 -2016-04-05,698685.85,729871.09,698685.85,729871.09,0,-31185.24,-31185.24,-31185.24,-31185.24,0 -2016-04-06,642557.08,668846.89,642557.08,668846.89,0,-26289.8100000001,-26289.8100000001,-26289.8100000001,-26289.8100000001,0 -2016-04-07,628554.19,625011.4,628554.19,625011.4,0,3542.78999999992,3542.78999999992,3542.78999999992,3542.78999999992,0 -2016-04-08,748994.58,683248.95,748994.58,683248.95,0,65745.63,65745.63,65745.63,65745.63,0 -2016-04-09,616118.06,685941.84,616118.06,685941.84,0,-69823.7799999999,-69823.7799999999,-69823.7799999999,-69823.7799999999,0 -2016-04-10,496525.67,491975.46,496525.67,491975.46,0,4550.20999999996,4550.20999999996,4550.20999999996,4550.20999999996,0 -2016-04-11,722763.61,688925.31,722763.61,688925.31,0,33838.2999999999,33838.2999999999,33838.2999999999,33838.2999999999,0 -2016-04-12,721896.37,716683.96,721896.37,716683.96,0,5212.41000000003,5212.41000000003,5212.41000000003,5212.41000000003,0 -2016-04-13,735592,740716.15,735592,740716.15,0,-5124.15000000002,-5124.15000000002,-5124.15000000002,-5124.15000000002,0 -2016-04-14,765395.12,772060.95,765395.12,772060.95,0,-6665.82999999996,-6665.82999999996,-6665.82999999996,-6665.82999999996,0 -2016-04-15,882417.43,878618.68,882417.43,878618.68,0,3798.75,3798.75,3798.75,3798.75,0 -2016-04-16,625254.56,670181.95,625254.56,669881.95,0,-44927.3899999999,-44627.3899999999,-44927.3899999999,-44627.3899999999,300 -2016-04-17,465589.57,486271.13,465589.57,486271.13,0,-20681.56,-20681.56,-20681.56,-20681.56,0 -2016-04-18,652868.36,578287.25,652868.36,578287.25,0,74581.11,74581.11,74581.11,74581.11,0 -2016-04-19,753135.46,779158.65,753135.46,779158.65,0,-26023.1900000001,-26023.1900000001,-26023.1900000001,-26023.1900000001,0 -2016-04-20,982996,964892.79,982996,964892.79,0,18103.21,18103.21,18103.21,18103.21,0 -2016-04-21,832811.08,806442.18,832811.08,806442.18,0,26368.8999999999,26368.8999999999,26368.8999999999,26368.8999999999,0 -2016-04-22,789318.97,782606.53,789318.97,782606.53,0,6712.43999999994,6712.43999999994,6712.43999999994,6712.43999999994,0 -2016-04-23,635165.42,694898.01,635165.42,694878.01,0,-59732.59,-59712.59,-59732.59,-59712.59,20 -2016-04-24,472854.36,482802.64,472854.36,482102.64,0,-9948.28000000003,-9248.28000000003,-9948.28000000003,-9248.28000000003,700 -2016-04-25,766856.77,724312.26,766856.77,724312.26,0,42544.51,42544.51,42544.51,42544.51,0 -2016-04-26,667304.58,669607.81,667304.58,669607.81,0,-2303.2300000001,-2303.2300000001,-2303.2300000001,-2303.2300000001,0 -2016-04-27,686020.07,725725.18,686020.07,725725.18,0,-39705.1100000001,-39705.1100000001,-39705.1100000001,-39705.1100000001,0 -2016-04-28,685518.84,606150.86,685518.84,606150.86,0,79367.98,79367.98,79367.98,79367.98,0 -2016-04-29,1039700.67,1026810.25,1039700.67,1026810.25,0,12890.42,12890.42,12890.42,12890.42,0 -2016-04-30,670740.94,731975.09,670740.94,731975.09,0,-61234.15,-61234.15,-61234.15,-61234.15,0 -2016-05-01,445849.19,502627.86,445849.19,500715.56,0,-56778.67,-54866.37,-56778.67,-54866.37,1912.29999999999 -2016-05-02,494091.71,512033.58,494091.71,512033.58,0,-17941.87,-17941.87,-17941.87,-17941.87,0 -2016-05-03,532008.2,479898.63,532008.2,477898.63,0,52109.57,54109.57,52109.57,54109.57,2000 -2016-05-04,668466.47,648967.87,668466.47,648967.87,0,19498.6,19498.6,19498.6,19498.6,0 -2016-05-05,786206.31,726414.69,786206.31,726414.69,0,59791.6200000001,59791.6200000001,59791.6200000001,59791.6200000001,0 -2016-05-06,910726.62,864472.98,910726.62,864472.98,0,46253.64,46253.64,46253.64,46253.64,0 -2016-05-07,576571.96,716035.13,576571.96,716035.13,0,-139463.17,-139463.17,-139463.17,-139463.17,0 -2016-05-08,467516.57,477558.11,467516.57,477558.11,0,-10041.54,-10041.54,-10041.54,-10041.54,0 -2016-05-09,333389.29,329355.11,333389.29,329355.11,0,4034.17999999999,4034.17999999999,4034.17999999999,4034.17999999999,0 -2016-05-10,764165.27,632998.08,764165.27,632998.08,0,131167.19,131167.19,131167.19,131167.19,0 -2016-05-11,735207.49,828957.33,735207.49,828957.33,0,-93749.84,-93749.84,-93749.84,-93749.84,0 -2016-05-12,776032.34,758433.08,776032.34,758433.08,0,17599.26,17599.26,17599.26,17599.26,0 -2016-05-13,1007639.25,985271.98,1007639.25,985271.98,0,22367.27,22367.27,22367.27,22367.27,0 -2016-05-14,689857.45,750520.82,689857.45,750520.82,0,-60663.37,-60663.37,-60663.37,-60663.37,0 -2016-05-15,570967.5,548795.33,570967.5,548795.33,0,22172.17,22172.17,22172.17,22172.17,0 -2016-05-16,748147.77,731761.38,748147.77,731761.38,0,16386.39,16386.39,16386.39,16386.39,0 -2016-05-17,871870.81,875785.63,871870.81,875785.63,0,-3914.81999999995,-3914.81999999995,-3914.81999999995,-3914.81999999995,0 -2016-05-18,711381.83,705116.22,711381.83,705116.22,0,6265.60999999999,6265.60999999999,6265.60999999999,6265.60999999999,0 -2016-05-19,709936.02,751813.2,709936.02,751813.2,0,-41877.1799999999,-41877.1799999999,-41877.1799999999,-41877.1799999999,0 -2016-05-20,856697.69,836640.2,856697.69,840640.2,0,20057.49,16057.49,20057.49,16057.49,-4000 -2016-05-21,557821.14,592860.38,557821.14,592860.38,0,-35039.24,-35039.24,-35039.24,-35039.24,0 -2016-05-22,444907.82,449404.97,444907.82,449404.97,0,-4497.14999999997,-4497.14999999997,-4497.14999999997,-4497.14999999997,0 -2016-05-23,626607.44,581736.46,626607.44,584736.86,0,44870.98,41870.58,44870.98,41870.58,-3000.40000000002 -2016-05-24,668970.66,706348.73,668970.66,706348.73,0,-37378.07,-37378.07,-37378.07,-37378.07,0 -2016-05-25,710650.2,659148.38,710650.2,659148.38,0,51501.82,51501.82,51501.82,51501.82,0 -2016-05-26,726466.92,747368.38,726466.92,747368.38,0,-20901.46,-20901.46,-20901.46,-20901.46,0 -2016-05-27,895654.51,821607.34,895654.51,821607.34,0,74047.17,74047.17,74047.17,74047.17,0 -2016-05-28,650723.25,730899.07,650723.25,730899.07,0,-80175.82,-80175.82,-80175.82,-80175.82,0 -2016-05-29,392164.94,472025.67,392164.94,472025.67,0,-79860.73,-79860.73,-79860.73,-79860.73,0 -2016-05-30,738664.92,587164.98,738664.92,587164.98,0,151499.94,151499.94,151499.94,151499.94,0 -2016-05-31,653894.97,700364.8,653894.97,700364.8,0,-46469.8300000001,-46469.8300000001,-46469.8300000001,-46469.8300000001,0 -2016-06-01,839783.43,782070.74,839783.43,782070.74,0,57712.6900000001,57712.6900000001,57712.6900000001,57712.6900000001,0 -2016-06-02,814194.08,776200.5,814194.08,776200.5,0,37993.58,37993.58,37993.58,37993.58,0 -2016-06-03,985165.39,1048532.41,985165.39,1048532.41,0,-63367.02,-63367.02,-63367.02,-63367.02,0 -2016-06-04,665149.75,738419.92,665149.75,738419.92,0,-73270.17,-73270.17,-73270.17,-73270.17,0 -2016-06-05,598091.23,560910.18,598091.23,560910.18,0,37181.0499999999,37181.0499999999,37181.0499999999,37181.0499999999,0 -2016-06-06,604647.77,624855.5,604647.77,624855.5,0,-20207.73,-20207.73,-20207.73,-20207.73,0 -2016-06-07,748108.4,714704.2,748108.4,714604.2,0,33404.2000000001,33504.2000000001,33404.2000000001,33504.2000000001,100 -2016-06-08,711769.39,729383.73,711769.39,729383.73,0,-17614.34,-17614.34,-17614.34,-17614.34,0 -2016-06-09,725679.92,732144,725679.92,732144,0,-6464.07999999996,-6464.07999999996,-6464.07999999996,-6464.07999999996,0 -2016-06-10,1151852.02,1048881.23,1151852.02,1048881.23,0,102970.79,102970.79,102970.79,102970.79,0 -2016-06-11,812434.66,892959.09,812434.66,892959.09,0,-80524.4299999999,-80524.4299999999,-80524.4299999999,-80524.4299999999,0 -2016-06-12,561353.97,631348.69,561353.97,631348.69,0,-69994.72,-69994.72,-69994.72,-69994.72,0 -2016-06-13,477282.21,432776.98,477282.21,432776.98,0,44505.23,44505.23,44505.23,44505.23,0 -2016-06-14,742075.83,713579.75,742075.83,713579.75,0,28496.08,28496.08,28496.08,28496.08,0 -2016-06-15,999897.33,1005243.04,999897.33,1005243.04,0,-5345.71000000008,-5345.71000000008,-5345.71000000008,-5345.71000000008,0 -2016-06-16,835133.7,874900.13,835133.7,874900.13,0,-39766.4300000001,-39766.4300000001,-39766.4300000001,-39766.4300000001,0 -2016-06-17,857347.74,822534.14,857347.74,822534.14,0,34813.6,34813.6,34813.6,34813.6,0 -2016-06-18,453691.14,519680.04,453691.14,519580.04,0,-65988.9,-65888.9,-65988.9,-65888.9,100 -2016-06-19,547700.05,491854.42,547700.05,491854.42,0,55845.6300000001,55845.6300000001,55845.6300000001,55845.6300000001,0 -2016-06-20,708590.57,704509.4,708590.57,704509.4,0,4081.16999999993,4081.16999999993,4081.16999999993,4081.16999999993,0 -2016-06-21,824714.88,766361.66,824714.88,766361.66,0,58353.22,58353.22,58353.22,58353.22,0 -2016-06-22,653985.48,667293.15,653985.48,667293.15,0,-13307.67,-13307.67,-13307.67,-13307.67,0 -2016-06-23,618349.14,629528.83,618349.14,629528.83,0,-11179.6899999999,-11179.6899999999,-11179.6899999999,-11179.6899999999,0 -2016-06-24,854706.27,922418.25,854706.27,922418.25,0,-67711.98,-67711.98,-67711.98,-67711.98,0 -2016-06-25,596845.25,585663.68,596845.25,585663.68,0,11181.57,11181.57,11181.57,11181.57,0 -2016-06-26,510674.38,473303.73,510674.38,473303.73,0,37370.65,37370.65,37370.65,37370.65,0 -2016-06-27,679279.72,688006.32,679279.72,688006.32,0,-8726.59999999998,-8726.59999999998,-8726.59999999998,-8726.59999999998,0 -2016-06-28,631091.14,670723.52,631091.14,670723.52,0,-39632.38,-39632.38,-39632.38,-39632.38,0 -2016-06-29,829422.78,770584.27,829422.78,770584.27,0,58838.51,58838.51,58838.51,58838.51,0 -2016-06-30,782340.27,760995.94,782340.27,760995.94,0,21344.3300000001,21344.3300000001,21344.3300000001,21344.3300000001,0 -2016-07-01,874163.26,903703.8,874163.26,903703.8,0,-29540.54,-29540.54,-29540.54,-29540.54,0 -2016-07-02,600963.27,644714.83,600963.27,644714.83,0,-43751.5599999999,-43751.5599999999,-43751.5599999999,-43751.5599999999,0 -2016-07-03,363107.18,369145.45,363107.18,369145.45,0,-6038.27000000002,-6038.27000000002,-6038.27000000002,-6038.27000000002,0 -2016-07-04,662289.18,636903.26,662289.18,636903.26,0,25385.92,25385.92,25385.92,25385.92,0 -2016-07-05,798059.12,783770.94,798059.12,783770.94,0,14288.1800000001,14288.1800000001,14288.1800000001,14288.1800000001,0 -2016-07-06,790230.75,761266.29,790230.75,761427.05,0,28964.46,28803.7,28964.46,28803.7,-160.760000000009 -2016-07-07,791400.28,849600.55,791400.28,849600.55,0,-58200.27,-58200.27,-58200.27,-58200.27,0 -2016-07-08,968299.36,852406.07,968299.36,852406.07,0,115893.29,115893.29,115893.29,115893.29,0 -2016-07-09,587905.53,710264.28,587905.53,710264.28,0,-122358.75,-122358.75,-122358.75,-122358.75,0 -2016-07-10,508964.86,556930.07,508964.86,556930.07,0,-47965.21,-47965.21,-47965.21,-47965.21,0 -2016-07-11,853331.48,761823.03,853331.48,761823.03,0,91508.45,91508.45,91508.45,91508.45,0 -2016-07-12,761623.49,782193.91,761623.49,782193.91,0,-20570.42,-20570.42,-20570.42,-20570.42,0 -2016-07-13,954055.36,902718.14,954055.36,902718.14,0,51337.22,51337.22,51337.22,51337.22,0 -2016-07-14,905601.68,938790.06,905601.68,938790.06,0,-33188.38,-33188.38,-33188.38,-33188.38,0 -2016-07-15,1040592.57,1008817.79,1040592.57,1008817.79,0,31774.7799999999,31774.7799999999,31774.7799999999,31774.7799999999,0 -2016-07-16,743303.97,785140.69,743303.97,785140.69,0,-41836.72,-41836.72,-41836.72,-41836.72,0 -2016-07-17,466464.78,513976.01,466464.78,513976.01,0,-47511.23,-47511.23,-47511.23,-47511.23,0 -2016-07-18,822347.63,729517.71,822347.63,729517.71,0,92829.9200000001,92829.9200000001,92829.9200000001,92829.9200000001,0 -2016-07-19,678131.57,706393.71,678131.57,706393.71,0,-28262.14,-28262.14,-28262.14,-28262.14,0 -2016-07-20,929091.36,919203.06,929091.36,919203.06,0,9888.29999999993,9888.29999999993,9888.29999999993,9888.29999999993,0 -2016-07-21,801119.96,830728.69,801119.96,830728.69,0,-29608.73,-29608.73,-29608.73,-29608.73,0 -2016-07-22,808585.65,805831.44,808585.65,805831.44,0,2754.21000000008,2754.21000000008,2754.21000000008,2754.21000000008,0 -2016-07-23,552898.25,605980.6,552898.25,605980.6,0,-53082.35,-53082.35,-53082.35,-53082.35,0 -2016-07-24,461670.37,436707.53,461670.37,436707.53,0,24962.84,24962.84,24962.84,24962.84,0 -2016-07-25,677568.09,716143.73,677568.09,716143.73,0,-38575.64,-38575.64,-38575.64,-38575.64,0 -2016-07-26,648467.58,611504.28,648467.58,611504.28,0,36963.2999999999,36963.2999999999,36963.2999999999,36963.2999999999,0 -2016-07-27,808789.66,777974.66,808789.66,777974.66,0,30815,30815,30815,30815,0 -2016-07-28,839133.64,816024.54,839133.64,817024.54,0,23109.1,22109.1,23109.1,22109.1,-1000 -2016-07-29,852236.03,873258.15,852236.03,873258.15,0,-21022.12,-21022.12,-21022.12,-21022.12,0 -2016-07-30,549786.26,596992.35,549786.26,596992.35,0,-47206.09,-47206.09,-47206.09,-47206.09,0 -2016-07-31,577073.07,515815.8,577073.07,515815.8,0,61257.27,61257.27,61257.27,61257.27,0 -2016-08-01,795581.47,782825.31,795581.47,782825.31,0,12756.1599999999,12756.1599999999,12756.1599999999,12756.1599999999,0 -2016-08-02,832856.97,860928.04,832856.97,860928.04,0,-28071.0700000001,-28071.0700000001,-28071.0700000001,-28071.0700000001,0 -2016-08-03,930582.77,945259.14,930582.77,944454.14,0,-14676.37,-13871.37,-14676.37,-13871.37,805 -2016-08-04,913044.54,896498.65,913044.54,896498.65,0,16545.89,16545.89,16545.89,16545.89,0 -2016-08-05,1001080.4,942724.5,1001080.4,942724.5,0,58355.9,58355.9,58355.9,58355.9,0 -2016-08-06,806275.82,837542.82,806275.82,837292.82,0,-31267,-31017,-31267,-31017,250 -2016-08-07,625331.74,676449.96,625331.74,676449.96,0,-51118.22,-51118.22,-51118.22,-51118.22,0 -2016-08-08,866300.81,748527.63,866300.81,748527.63,0,117773.18,117773.18,117773.18,117773.18,0 -2016-08-09,904711.74,1000700.5,904711.74,1000700.5,0,-95988.76,-95988.76,-95988.76,-95988.76,0 -2016-08-10,1266538.75,1203610.87,1266538.75,1203610.87,0,62927.8799999999,62927.8799999999,62927.8799999999,62927.8799999999,0 -2016-08-11,1102042.6,1107013.91,1102042.6,1107013.91,0,-4971.30999999982,-4971.30999999982,-4971.30999999982,-4971.30999999982,0 -2016-08-12,1136341.76,1165063.03,1136341.76,1165063.03,0,-28721.27,-28721.27,-28721.27,-28721.27,0 -2016-08-13,866679.59,920060.56,866679.59,920060.56,0,-53380.9700000001,-53380.9700000001,-53380.9700000001,-53380.9700000001,0 -2016-08-14,584442.57,599049.43,584442.57,599049.43,0,-14606.8600000001,-14606.8600000001,-14606.8600000001,-14606.8600000001,0 -2016-08-15,979378.35,894681.19,979378.35,894681.19,0,84697.16,84697.16,84697.16,84697.16,0 -2016-08-16,1061720.66,1073782.92,1061720.66,1073782.92,0,-12062.26,-12062.26,-12062.26,-12062.26,0 -2016-08-17,921717.16,918068.82,921717.16,918068.82,0,3648.34000000008,3648.34000000008,3648.34000000008,3648.34000000008,0 -2016-08-18,1019072.7,1016722.66,1019072.7,1016722.66,0,2350.03999999992,2350.03999999992,2350.03999999992,2350.03999999992,0 -2016-08-19,1101028.89,1086698.51,1101028.89,1086698.51,0,14330.3799999999,14330.3799999999,14330.3799999999,14330.3799999999,0 -2016-08-20,853977.28,934705.83,853977.28,934705.83,0,-80728.5499999999,-80728.5499999999,-80728.5499999999,-80728.5499999999,0 -2016-08-21,554283.73,602988.15,554283.73,602988.15,0,-48704.42,-48704.42,-48704.42,-48704.42,0 -2016-08-22,842460.33,762376.49,842460.33,762376.49,0,80083.84,80083.84,80083.84,80083.84,0 -2016-08-23,814176.25,809082.66,814176.25,809082.66,0,5093.58999999997,5093.58999999997,5093.58999999997,5093.58999999997,0 -2016-08-24,845480.42,775284.3,845480.42,775284.3,0,70196.12,70196.12,70196.12,70196.12,0 -2016-08-25,843866.36,936253.4,843866.36,936253.4,0,-92387.04,-92387.04,-92387.04,-92387.04,0 -2016-08-26,993392.97,948615.88,993392.97,948615.88,0,44777.09,44777.09,44777.09,44777.09,0 -2016-08-27,697542.92,736433.1,697542.92,736433.1,0,-38890.1799999999,-38890.1799999999,-38890.1799999999,-38890.1799999999,0 -2016-08-28,585911.41,608808.93,585911.41,608808.93,0,-22897.52,-22897.52,-22897.52,-22897.52,0 -2016-08-29,731932.09,713768.02,731932.09,713768.02,0,18164.07,18164.07,18164.07,18164.07,0 -2016-08-30,842731.93,816458.54,842731.93,816458.54,0,26273.39,26273.39,26273.39,26273.39,0 -2016-08-31,801569.78,771681.53,801569.78,771681.53,0,29888.25,29888.25,29888.25,29888.25,0 -2016-09-01,972130.95,980228.97,972130.95,980228.97,0,-8098.02000000002,-8098.02000000002,-8098.02000000002,-8098.02000000002,0 -2016-09-02,905953.97,891296.13,905953.97,891296.13,0,14657.84,14657.84,14657.84,14657.84,0 -2016-09-03,835163.8,878201.34,835163.8,878201.34,0,-43037.5399999999,-43037.5399999999,-43037.5399999999,-43037.5399999999,0 -2016-09-04,537965.24,539503.07,537965.24,539503.07,0,-1537.82999999996,-1537.82999999996,-1537.82999999996,-1537.82999999996,0 -2016-09-05,894425.78,872589.83,894425.78,872589.83,0,21835.9500000001,21835.9500000001,21835.9500000001,21835.9500000001,0 -2016-09-06,1008718.88,1013582.74,1008718.88,1013582.74,0,-4863.85999999999,-4863.85999999999,-4863.85999999999,-4863.85999999999,0 -2016-09-07,1073864.66,1043584.23,1073864.66,1043584.23,0,30280.4299999999,30280.4299999999,30280.4299999999,30280.4299999999,0 -2016-09-08,1088682.32,1087592.62,1088682.32,1087592.62,0,1089.69999999995,1089.69999999995,1089.69999999995,1089.69999999995,0 -2016-09-09,1188213.58,1226006.82,1188213.58,1226006.82,0,-37793.24,-37793.24,-37793.24,-37793.24,0 -2016-09-10,859843.31,831744,859843.31,831744,0,28099.3100000001,28099.3100000001,28099.3100000001,28099.3100000001,0 -2016-09-11,670194.3,755426.55,670194.3,755426.55,0,-85232.25,-85232.25,-85232.25,-85232.25,0 -2016-09-12,1074354.35,973368.21,1074354.35,973368.21,0,100986.14,100986.14,100986.14,100986.14,0 -2016-09-13,1187250,1173043.23,1187250,1173043.23,0,14206.77,14206.77,14206.77,14206.77,0 -2016-09-14,1109722.4,1049105.34,1109722.4,1049105.34,0,60617.0599999998,60617.0599999998,60617.0599999998,60617.0599999998,0 -2016-09-15,1182906.34,1269514.5,1182906.34,1269514.5,0,-86608.1599999999,-86608.1599999999,-86608.1599999999,-86608.1599999999,0 -2016-09-16,1089352.99,1122262.05,1089352.99,1122262.05,0,-32909.0600000001,-32909.0600000001,-32909.0600000001,-32909.0600000001,0 -2016-09-17,933209.56,891447.95,933209.56,891447.95,0,41761.6100000001,41761.6100000001,41761.6100000001,41761.6100000001,0 -2016-09-18,714186.33,808250.59,714186.33,808250.59,0,-94064.26,-94064.26,-94064.26,-94064.26,0 -2016-09-19,840203.34,804568.23,840203.34,804568.23,0,35635.11,35635.11,35635.11,35635.11,0 -2016-09-20,968222.25,927348.55,968222.25,927348.55,0,40873.7,40873.7,40873.7,40873.7,0 -2016-09-21,1010308.95,1020357.64,1010308.95,1020357.64,0,-10048.6900000001,-10048.6900000001,-10048.6900000001,-10048.6900000001,0 -2016-09-22,936079.9,954848.66,936079.9,954848.66,0,-18768.76,-18768.76,-18768.76,-18768.76,0 -2016-09-23,888555.64,848968.81,888555.64,848968.81,0,39586.83,39586.83,39586.83,39586.83,0 -2016-09-24,792170.37,821938.95,792170.37,821933.95,0,-29768.58,-29763.58,-29768.58,-29763.58,5 -2016-09-25,484424.12,567238.07,484424.12,567238.07,0,-82813.95,-82813.95,-82813.95,-82813.95,0 -2016-09-26,755804.49,674874.87,755804.49,674874.87,0,80929.62,80929.62,80929.62,80929.62,0 -2016-09-27,887806.34,859420.07,887806.34,859420.07,0,28386.27,28386.27,28386.27,28386.27,0 -2016-09-28,949229.33,965107.6,949229.33,965107.6,0,-15878.27,-15878.27,-15878.27,-15878.27,0 -2016-09-29,817186.67,850239.18,817186.67,850239.18,0,-33052.51,-33052.51,-33052.51,-33052.51,0 -2016-09-30,921746.65,802036.87,921746.65,802036.87,0,119709.78,119709.78,119709.78,119709.78,0 -2016-10-01,712566.94,823604.99,712566.94,823604.99,0,-111038.05,-111038.05,-111038.05,-111038.05,0 -2016-10-02,578092.63,577400.06,578092.63,577400.06,0,692.569999999949,692.569999999949,692.569999999949,692.569999999949,0 -2016-10-03,836728.94,817118.45,836728.94,817118.45,0,19610.49,19610.49,19610.49,19610.49,0 -2016-10-04,816191.43,817089.36,816191.43,817089.36,0,-897.929999999935,-897.929999999935,-897.929999999935,-897.929999999935,0 -2016-10-05,762114.5,764145.42,762114.5,764145.42,0,-2030.92000000004,-2030.92000000004,-2030.92000000004,-2030.92000000004,0 -2016-10-06,955077.05,940821.64,955077.05,940821.64,0,14255.41,14255.41,14255.41,14255.41,0 -2016-10-07,991946.69,943332.13,991946.69,943332.13,0,48614.5599999999,48614.5599999999,48614.5599999999,48614.5599999999,0 -2016-10-08,775750.42,874800.42,775750.42,874800.42,0,-99050,-99050,-99050,-99050,0 -2016-10-09,502685.33,522624.73,502685.33,522624.73,0,-19939.4,-19939.4,-19939.4,-19939.4,0 -2016-10-10,1077075.2,931320.01,1077075.2,931320.01,0,145755.19,145755.19,145755.19,145755.19,0 -2016-10-11,1006055.41,1032208.35,1006055.41,1032208.35,0,-26152.9399999999,-26152.9399999999,-26152.9399999999,-26152.9399999999,0 -2016-10-12,962170.96,955225.89,962170.96,955225.89,0,6945.06999999995,6945.06999999995,6945.06999999995,6945.06999999995,0 -2016-10-13,1036646.84,1061611.63,1036646.84,1061611.63,0,-24964.7899999999,-24964.7899999999,-24964.7899999999,-24964.7899999999,0 -2016-10-14,1204504.36,1209866.29,1204504.36,1209866.29,0,-5361.92999999994,-5361.92999999994,-5361.92999999994,-5361.92999999994,0 -2016-10-15,813949.12,869769.17,813949.12,869769.17,0,-55820.0500000001,-55820.0500000001,-55820.0500000001,-55820.0500000001,0 -2016-10-16,582696.52,618231.15,582696.52,618231.15,0,-35534.63,-35534.63,-35534.63,-35534.63,0 -2016-10-17,882622.44,777108.66,882622.44,777108.66,0,105513.78,105513.78,105513.78,105513.78,0 -2016-10-18,946580.88,950589.34,946580.88,950589.34,0,-4008.45999999996,-4008.45999999996,-4008.45999999996,-4008.45999999996,0 -2016-10-19,926567.35,996762.25,926567.35,996762.25,0,-70194.9,-70194.9,-70194.9,-70194.9,0 -2016-10-20,1009283.83,952621.53,1009283.83,952621.53,0,56662.2999999999,56662.2999999999,56662.2999999999,56662.2999999999,0 -2016-10-21,916222.1,882738.36,916222.1,882738.36,0,33483.74,33483.74,33483.74,33483.74,0 -2016-10-22,661457.98,747180.11,661457.98,747180.11,0,-85722.13,-85722.13,-85722.13,-85722.13,0 -2016-10-23,581949.46,584905.99,581949.46,584905.99,0,-2956.53000000003,-2956.53000000003,-2956.53000000003,-2956.53000000003,0 -2016-10-24,726725.09,688686.94,726725.09,688686.94,0,38038.15,38038.15,38038.15,38038.15,0 -2016-10-25,947940.26,983196.39,947940.26,983196.39,0,-35256.13,-35256.13,-35256.13,-35256.13,0 -2016-10-26,820583.5,772060.84,820583.5,772060.84,0,48522.66,48522.66,48522.66,48522.66,0 -2016-10-27,861600.79,845239.72,861600.79,845239.72,0,16361.0700000001,16361.0700000001,16361.0700000001,16361.0700000001,0 -2016-10-28,837131.32,901680.3,837131.32,901680.3,0,-64548.9800000001,-64548.9800000001,-64548.9800000001,-64548.9800000001,0 -2016-10-29,757681.68,762434.53,757681.68,762434.53,0,-4752.84999999998,-4752.84999999998,-4752.84999999998,-4752.84999999998,0 -2016-10-30,639892.23,656066.81,639892.23,656066.81,0,-16174.5800000001,-16174.5800000001,-16174.5800000001,-16174.5800000001,0 -2016-10-31,728337.2,642961.66,728337.2,642961.66,0,85375.5399999999,85375.5399999999,85375.5399999999,85375.5399999999,0 -2016-11-01,810078.43,831046.83,810078.43,831046.83,0,-20968.3999999999,-20968.3999999999,-20968.3999999999,-20968.3999999999,0 -2016-11-02,944541.5,966751.21,944541.5,966751.21,0,-22209.71,-22209.71,-22209.71,-22209.71,0 -2016-11-03,969545.51,900275.84,969545.51,900275.84,0,69269.6700000001,69269.6700000001,69269.6700000001,69269.6700000001,0 -2016-11-04,785761.41,897423.06,785761.41,897423.06,0,-111661.65,-111661.65,-111661.65,-111661.65,0 -2016-11-05,610251.94,584486.69,610251.94,584486.69,0,25765.25,25765.25,25765.25,25765.25,0 -2016-11-06,624917.64,590741.74,624917.64,590741.74,0,34175.9,34175.9,34175.9,34175.9,0 -2016-11-07,810940.99,798668.83,810940.99,798668.83,0,12272.16,12272.16,12272.16,12272.16,0 -2016-11-08,749174.93,747016.28,749174.93,747016.28,0,2158.65000000002,2158.65000000002,2158.65000000002,2158.65000000002,0 -2016-11-09,697761.37,741628.71,697761.37,741628.71,0,-43867.34,-43867.34,-43867.34,-43867.34,0 -2016-11-10,1178322.8,1072725.6,1178322.8,1072725.6,0,105597.2,105597.2,105597.2,105597.2,0 -2016-11-11,1047316.16,1048450.2,1047316.16,1048450.2,0,-1134.03999999992,-1134.03999999992,-1134.03999999992,-1134.03999999992,0 -2016-11-12,845413.47,981051.59,845413.47,981051.59,0,-135638.12,-135638.12,-135638.12,-135638.12,0 -2016-11-13,597520.25,638763.29,597520.25,638763.29,0,-41243.04,-41243.04,-41243.04,-41243.04,0 -2016-11-14,1073116.19,937446,1073116.19,937446,0,135670.19,135670.19,135670.19,135670.19,0 -2016-11-15,1237294.65,1216702.44,1237294.65,1216702.44,0,20592.21,20592.21,20592.21,20592.21,0 -2016-11-16,1026458.15,1026143.44,1026458.15,1026143.44,0,314.710000000079,314.710000000079,314.710000000079,314.710000000079,0 -2016-11-17,965839.2,1028548.16,965839.2,1028548.16,0,-62708.9600000001,-62708.9600000001,-62708.9600000001,-62708.9600000001,0 -2016-11-18,958374.35,912684.56,958374.35,912684.56,0,45689.7899999999,45689.7899999999,45689.7899999999,45689.7899999999,0 -2016-11-19,813306.94,863952.12,813306.94,863952.12,0,-50645.1800000001,-50645.1800000001,-50645.1800000001,-50645.1800000001,0 -2016-11-20,642845.31,655416.89,642845.31,655416.89,0,-12571.58,-12571.58,-12571.58,-12571.58,0 -2016-11-21,939243.14,913966.49,939243.14,913966.49,0,25276.65,25276.65,25276.65,25276.65,0 -2016-11-22,777567.56,759607.18,777567.56,759607.18,0,17960.38,17960.38,17960.38,17960.38,0 -2016-11-23,939589.85,924218.05,939589.85,924218.05,0,15371.7999999999,15371.7999999999,15371.7999999999,15371.7999999999,0 -2016-11-24,831714.95,864887.36,831714.95,864887.36,0,-33172.41,-33172.41,-33172.41,-33172.41,0 -2016-11-25,983068.81,931376.2,983068.81,931376.2,0,51692.6100000001,51692.6100000001,51692.6100000001,51692.6100000001,0 -2016-11-26,707461.73,793301.71,707461.73,793301.71,0,-85839.98,-85839.98,-85839.98,-85839.98,0 -2016-11-27,634111.94,646751.34,634111.94,646751.34,0,-12639.4,-12639.4,-12639.4,-12639.4,0 -2016-11-28,926874.49,804308.08,926874.49,804308.08,0,122566.41,122566.41,122566.41,122566.41,0 -2016-11-29,947704.95,1026762.64,947704.95,1026762.64,0,-79057.6900000001,-79057.6900000001,-79057.6900000001,-79057.6900000001,0 -2016-11-30,781852.31,738718.82,781852.31,738718.82,0,43133.4900000001,43133.4900000001,43133.4900000001,43133.4900000001,0 -2016-12-01,969379.49,960022.1,969379.49,960022.1,0,9357.39000000001,9357.39000000001,9357.39000000001,9357.39000000001,0 -2016-12-02,1149214.01,1093097.18,1149214.01,1093097.18,0,56116.8300000001,56116.8300000001,56116.8300000001,56116.8300000001,0 -2016-12-03,834451.01,952617.18,834451.01,952617.18,0,-118166.17,-118166.17,-118166.17,-118166.17,0 -2016-12-04,559200.89,612371.92,559200.89,612371.92,0,-53171.03,-53171.03,-53171.03,-53171.03,0 -2016-12-05,891876.85,780544.2,891876.85,780544.2,0,111332.65,111332.65,111332.65,111332.65,0 -2016-12-06,913690.72,934150.96,913690.72,934150.96,0,-20460.24,-20460.24,-20460.24,-20460.24,0 -2016-12-07,964038.41,981068.77,964038.41,981068.77,0,-17030.36,-17030.36,-17030.36,-17030.36,0 -2016-12-08,995650.29,975802.88,995650.29,975802.88,0,19847.41,19847.41,19847.41,19847.41,0 -2016-12-09,1347307.81,1221425.89,1347307.81,1221425.89,0,125881.92,125881.92,125881.92,125881.92,0 -2016-12-10,959120.75,1093290.43,959120.75,1093290.43,0,-134169.68,-134169.68,-134169.68,-134169.68,0 -2016-12-11,871102.44,860068.37,871102.44,860068.37,0,11034.0699999999,11034.0699999999,11034.0699999999,11034.0699999999,0 -2016-12-12,1085786.07,1057443.27,1085786.07,1057443.27,0,28342.8,28342.8,28342.8,28342.8,0 -2016-12-13,1203968.31,1051834.52,1203968.31,1051834.52,0,152133.79,152133.79,152133.79,152133.79,0 -2016-12-14,1023354.57,1218318.86,1023354.57,1218318.86,0,-194964.29,-194964.29,-194964.29,-194964.29,0 -2016-12-15,1378572.49,1265304.88,1378572.49,1265304.88,0,113267.61,113267.61,113267.61,113267.61,0 -2016-12-16,1093918.01,1199713.25,1093918.01,1199713.25,0,-105795.24,-105795.24,-105795.24,-105795.24,0 -2016-12-17,923577.81,982888.35,923577.81,982888.35,0,-59310.5399999999,-59310.5399999999,-59310.5399999999,-59310.5399999999,0 -2016-12-18,701624.6,679975.55,701624.6,679975.55,0,21649.0499999999,21649.0499999999,21649.0499999999,21649.0499999999,0 -2016-12-19,924142.98,901474.86,924142.98,901474.86,0,22668.12,22668.12,22668.12,22668.12,0 -2016-12-20,1115439.91,1092174.05,1115439.91,1092174.05,0,23265.8599999999,23265.8599999999,23265.8599999999,23265.8599999999,0 -2016-12-21,1032940.9,1018017.41,1032940.9,1018017.41,0,14923.49,14923.49,14923.49,14923.49,0 -2016-12-22,1013315.63,1009328.63,1013315.63,1009328.63,0,3987,3987,3987,3987,0 -2016-12-23,1173547.52,1130922.63,1173547.52,1130922.63,0,42624.8900000001,42624.8900000001,42624.8900000001,42624.8900000001,0 -2016-12-24,812520.02,854919.58,812520.02,854919.58,0,-42399.5599999999,-42399.5599999999,-42399.5599999999,-42399.5599999999,0 -2016-12-25,706760.39,736074.39,706760.39,736074.39,0,-29314,-29314,-29314,-29314,0 -2016-12-26,802244.93,779230.57,802244.93,779230.57,0,23014.3600000001,23014.3600000001,23014.3600000001,23014.3600000001,0 -2016-12-27,1244579.52,1116388.28,1244579.52,1116388.28,0,128191.24,128191.24,128191.24,128191.24,0 -2016-12-28,1083621.94,1152503.92,1083621.94,1152503.92,0,-68881.98,-68881.98,-68881.98,-68881.98,0 -2016-12-29,1372617.62,1327245.43,1372617.62,1327245.43,0,45372.1900000002,45372.1900000002,45372.1900000002,45372.1900000002,0 -2016-12-30,1406489.15,1353791.25,1406489.15,1353791.25,0,52697.8999999999,52697.8999999999,52697.8999999999,52697.8999999999,0 -2016-12-31,855936.26,1106747.76,855936.26,1106747.76,0,-250811.5,-250811.5,-250811.5,-250811.5,0 -2017-01-01,450658.18,406631.81,450658.18,406631.81,0,44026.37,44026.37,44026.37,44026.37,0 -2017-01-02,648234.26,631938.73,648234.26,631938.73,0,16295.53,16295.53,16295.53,16295.53,0 -2017-01-03,710024.84,667875.27,710024.84,667875.27,0,42149.5699999999,42149.5699999999,42149.5699999999,42149.5699999999,0 -2017-01-04,617621.01,681947.09,617621.01,681947.09,0,-64326.08,-64326.08,-64326.08,-64326.08,0 -2017-01-05,826530.83,791578.19,826530.83,791578.19,0,34952.64,34952.64,34952.64,34952.64,0 -2017-01-06,718561.16,672709.45,718561.16,672709.45,0,45851.7100000001,45851.7100000001,45851.7100000001,45851.7100000001,0 -2017-01-07,493424.07,588884.52,493424.07,588884.52,0,-95460.45,-95460.45,-95460.45,-95460.45,0 -2017-01-08,466016.15,474784.18,466016.15,474784.18,0,-8768.02999999997,-8768.02999999997,-8768.02999999997,-8768.02999999997,0 -2017-01-09,905914.27,786132.71,905914.27,786132.71,0,119781.56,119781.56,119781.56,119781.56,0 -2017-01-10,1112292.82,1113075.98,1112292.82,1113075.98,0,-783.159999999916,-783.159999999916,-783.159999999916,-783.159999999916,0 -2017-01-11,1268737.51,1231781.48,1268737.51,1231781.48,0,36956.03,36956.03,36956.03,36956.03,0 -2017-01-12,1136106.77,1142533.01,1136106.77,1142533.01,0,-6426.23999999999,-6426.23999999999,-6426.23999999999,-6426.23999999999,0 -2017-01-13,1366834.76,1329863.85,1366834.76,1329863.85,0,36970.9099999999,36970.9099999999,36970.9099999999,36970.9099999999,0 -2017-01-14,1242682.85,1315425.15,1242682.85,1315425.15,0,-72742.2999999998,-72742.2999999998,-72742.2999999998,-72742.2999999998,0 -2017-01-15,956891.34,976960.5,956891.34,976960.5,0,-20069.16,-20069.16,-20069.16,-20069.16,0 -2017-01-16,1068737.6,989323.68,1068737.6,989323.68,0,79413.9200000001,79413.9200000001,79413.9200000001,79413.9200000001,0 -2017-01-17,1105135.71,1156313.76,1105135.71,1156313.76,0,-51178.0500000001,-51178.0500000001,-51178.0500000001,-51178.0500000001,0 -2017-01-18,1096797.29,1125461.88,1096797.29,1125461.88,0,-28664.5899999999,-28664.5899999999,-28664.5899999999,-28664.5899999999,0 -2017-01-19,923794.89,886651.88,923794.89,886651.88,0,37143.01,37143.01,37143.01,37143.01,0 -2017-01-20,1202253.62,1156441.12,1202253.62,1156441.12,0,45812.5,45812.5,45812.5,45812.5,0 -2017-01-21,862268.66,1019004.02,862268.66,1019004.02,0,-156735.36,-156735.36,-156735.36,-156735.36,0 -2017-01-22,609680.14,557217.39,609680.14,557217.39,0,52462.75,52462.75,52462.75,52462.75,0 -2017-01-23,1116937.05,1021650.37,1116937.05,1021650.37,0,95286.6800000001,95286.6800000001,95286.6800000001,95286.6800000001,0 -2017-01-24,877156.13,943178.59,877156.13,943178.59,0,-66022.46,-66022.46,-66022.46,-66022.46,0 -2017-01-25,1243899.08,1167593.56,1243899.08,1167593.56,0,76305.52,76305.52,76305.52,76305.52,0 -2017-01-26,1169294.58,1171691.72,1169294.58,1171691.72,0,-2397.1399999999,-2397.1399999999,-2397.1399999999,-2397.1399999999,0 -2017-01-27,1116235.51,1125090.91,1116235.51,1125090.91,0,-8855.39999999991,-8855.39999999991,-8855.39999999991,-8855.39999999991,0 -2017-01-28,925383.23,994721.43,925383.23,994721.43,0,-69338.2000000001,-69338.2000000001,-69338.2000000001,-69338.2000000001,0 -2017-01-29,709136.21,758494.84,709136.21,758494.84,0,-49358.63,-49358.63,-49358.63,-49358.63,0 -2017-01-30,966627.54,918150.16,966627.54,918150.16,0,48477.38,48477.38,48477.38,48477.38,0 -2017-01-31,1018591.25,969863.72,1018591.25,969863.72,0,48727.53,48727.53,48727.53,48727.53,0 -2017-02-01,1191735.62,1144505.38,1191735.62,1144505.38,0,47230.2400000002,47230.2400000002,47230.2400000002,47230.2400000002,0 -2017-02-02,1041415.06,1167895.95,1041415.06,1167895.95,0,-126480.89,-126480.89,-126480.89,-126480.89,0 -2017-02-03,1112395.83,1037647.28,1112395.83,1037647.28,0,74748.5500000001,74748.5500000001,74748.5500000001,74748.5500000001,0 -2017-02-04,1081768.77,1133803.45,1081768.77,1133803.45,0,-52034.6799999999,-52034.6799999999,-52034.6799999999,-52034.6799999999,0 -2017-02-05,771265.58,781651.69,771265.58,781651.69,0,-10386.11,-10386.11,-10386.11,-10386.11,0 -2017-02-06,1035007.73,973781.31,1035007.73,973781.31,0,61226.4199999999,61226.4199999999,61226.4199999999,61226.4199999999,0 -2017-02-07,1204254.64,1220017.25,1204254.64,1220017.25,0,-15762.6100000001,-15762.6100000001,-15762.6100000001,-15762.6100000001,0 -2017-02-08,1123861,1177081.76,1123861,1177081.76,0,-53220.76,-53220.76,-53220.76,-53220.76,0 -2017-02-09,1076145.36,1011872.42,1076145.36,1011872.42,0,64272.9400000001,64272.9400000001,64272.9400000001,64272.9400000001,0 -2017-02-10,1432697.79,1419477.42,1432697.79,1419477.42,0,13220.3700000001,13220.3700000001,13220.3700000001,13220.3700000001,0 -2017-02-11,1252430.69,1241293.13,1252430.69,1241293.13,0,11137.5600000001,11137.5600000001,11137.5600000001,11137.5600000001,0 -2017-02-12,842869.61,929750.17,842869.61,929750.17,0,-86880.5600000001,-86880.5600000001,-86880.5600000001,-86880.5600000001,0 -2017-02-13,1314335.11,1216484.98,1314335.11,1216484.98,0,97850.1300000001,97850.1300000001,97850.1300000001,97850.1300000001,0 -2017-02-14,1336176.25,1367819.54,1336176.25,1367819.54,0,-31643.29,-31643.29,-31643.29,-31643.29,0 -2017-02-15,1539920.77,1450184.6,1539920.77,1450184.6,0,89736.1699999999,89736.1699999999,89736.1699999999,89736.1699999999,0 -2017-02-16,1416035.59,1405194.04,1416035.59,1405194.04,0,10841.55,10841.55,10841.55,10841.55,0 -2017-02-17,1349687.28,1372125.18,1349687.28,1372125.18,0,-22437.8999999999,-22437.8999999999,-22437.8999999999,-22437.8999999999,0 -2017-02-18,1004886.34,1101902.61,1004886.34,1101902.61,0,-97016.2700000001,-97016.2700000001,-97016.2700000001,-97016.2700000001,0 -2017-02-19,735626.29,800730.18,735626.29,800730.18,0,-65103.89,-65103.89,-65103.89,-65103.89,0 -2017-02-20,1265709.94,1173960.09,1265709.94,1173960.09,0,91749.8499999999,91749.8499999999,91749.8499999999,91749.8499999999,0 -2017-02-21,1385504.36,1353793.01,1385504.36,1353793.01,0,31711.3500000001,31711.3500000001,31711.3500000001,31711.3500000001,0 -2017-02-22,1216146.24,1266657.33,1216146.24,1266657.33,0,-50511.0900000001,-50511.0900000001,-50511.0900000001,-50511.0900000001,0 -2017-02-23,850343.02,897901.92,850343.02,897901.92,0,-47558.9,-47558.9,-47558.9,-47558.9,0 -2017-02-24,791427.95,817135.32,791427.95,817135.32,0,-25707.37,-25707.37,-25707.37,-25707.37,0 -2017-02-25,732723.56,753355.95,732723.56,753355.95,0,-20632.3899999999,-20632.3899999999,-20632.3899999999,-20632.3899999999,0 -2017-02-26,600437.12,574742.91,600437.12,574742.91,0,25694.21,25694.21,25694.21,25694.21,0 -2017-02-27,1056668.75,980180.43,1056668.75,980180.43,0,76488.32,76488.32,76488.32,76488.32,0 -2017-02-28,1040976.97,1052237.33,1040976.97,1052237.33,0,-11260.3600000001,-11260.3600000001,-11260.3600000001,-11260.3600000001,0 -2017-03-01,1357969.13,1339458.86,1357969.13,1339458.86,0,18510.2699999998,18510.2699999998,18510.2699999998,18510.2699999998,0 -2017-03-02,1156424.73,1131518.7,1156424.73,1131518.7,0,24906.03,24906.03,24906.03,24906.03,0 -2017-03-03,1136372.75,1142130.85,1136372.75,1142130.85,0,-5758.10000000009,-5758.10000000009,-5758.10000000009,-5758.10000000009,0 -2017-03-04,930185.77,1011405.43,930185.77,1011405.43,0,-81219.66,-81219.66,-81219.66,-81219.66,0 -2017-03-05,840704.86,819242.77,840704.86,818192.77,0,21462.09,22512.09,21462.09,22512.09,1050 -2017-03-06,1067084.19,1079310.18,1067084.19,1079310.18,0,-12225.99,-12225.99,-12225.99,-12225.99,0 -2017-03-07,1057981.34,1030071.72,1057981.34,1030071.72,0,27909.6200000001,27909.6200000001,27909.6200000001,27909.6200000001,0 -2017-03-08,605381.85,669667.65,605381.85,669667.65,0,-64285.8000000001,-64285.8000000001,-64285.8000000001,-64285.8000000001,0 -2017-03-09,987594.45,910665.74,987594.45,910665.74,0,76928.71,76928.71,76928.71,76928.71,0 -2017-03-10,1611490.45,1521274.27,1611490.45,1521274.27,0,90216.1799999999,90216.1799999999,90216.1799999999,90216.1799999999,0 -2017-03-11,1085635.99,1193011.73,1085635.99,1193011.73,0,-107375.74,-107375.74,-107375.74,-107375.74,0 -2017-03-12,817549.29,821161.88,817549.29,821161.88,0,-3612.58999999997,-3612.58999999997,-3612.58999999997,-3612.58999999997,0 -2017-03-13,1140867.22,1151697.97,1140867.22,1151697.97,0,-10830.75,-10830.75,-10830.75,-10830.75,0 -2017-03-14,1335354.31,1296547.04,1335354.31,1296547.04,0,38807.27,38807.27,38807.27,38807.27,0 -2017-03-15,1584585.74,1545281.38,1584585.74,1545281.38,0,39304.3600000001,39304.3600000001,39304.3600000001,39304.3600000001,0 -2017-03-16,1301143.73,1337963.72,1301143.73,1337963.72,0,-36819.99,-36819.99,-36819.99,-36819.99,0 -2017-03-17,1236154.78,1239078.12,1236154.78,1239078.12,0,-2923.34000000008,-2923.34000000008,-2923.34000000008,-2923.34000000008,0 -2017-03-18,1032697.15,1059700.61,1032697.15,1059700.61,0,-27003.4600000001,-27003.4600000001,-27003.4600000001,-27003.4600000001,0 -2017-03-19,731672.81,809189.58,731672.81,809189.58,0,-77516.7699999999,-77516.7699999999,-77516.7699999999,-77516.7699999999,0 -2017-03-20,1092543.34,1019390.94,1092543.34,1019390.94,0,73152.4000000001,73152.4000000001,73152.4000000001,73152.4000000001,0 -2017-03-21,1081589.07,1074743.95,1081589.07,1074743.95,0,6845.12000000011,6845.12000000011,6845.12000000011,6845.12000000011,0 -2017-03-22,1238070.74,1195971.13,1238070.74,1195971.13,0,42099.6100000001,42099.6100000001,42099.6100000001,42099.6100000001,0 -2017-03-23,1108255.15,1051803.33,1108255.15,1051803.33,0,56451.8199999998,56451.8199999998,56451.8199999998,56451.8199999998,0 -2017-03-24,1258274.7,1307431.98,1258274.7,1307431.98,0,-49157.28,-49157.28,-49157.28,-49157.28,0 -2017-03-25,806043.97,881398.85,806043.97,881398.85,0,-75354.88,-75354.88,-75354.88,-75354.88,0 -2017-03-26,803539.14,822984.71,803539.14,822984.71,0,-19445.57,-19445.57,-19445.57,-19445.57,0 -2017-03-27,1074781.38,996745.54,1074781.38,996745.54,0,78035.8399999999,78035.8399999999,78035.8399999999,78035.8399999999,0 -2017-03-28,1100568.73,1077415.67,1100568.73,1077415.67,0,23153.0600000001,23153.0600000001,23153.0600000001,23153.0600000001,0 -2017-03-29,1131158.65,1164013.91,1131158.65,1162532.21,0,-32855.26,-31373.5600000001,-32855.26,-31373.5600000001,1481.69999999995 -2017-03-30,1027589.49,1087753.15,1027589.49,1087753.15,0,-60163.6599999999,-60163.6599999999,-60163.6599999999,-60163.6599999999,0 -2017-03-31,1226053.47,1079275.56,1226053.47,1079275.56,0,146777.91,146777.91,146777.91,146777.91,0 -2017-04-01,1190899.2,1297100.11,1190899.2,1297100.11,0,-106200.91,-106200.91,-106200.91,-106200.91,0 -2017-04-02,669534.06,737657.37,669534.06,737657.37,0,-68123.3099999999,-68123.3099999999,-68123.3099999999,-68123.3099999999,0 -2017-04-03,912572.12,911305.41,912572.12,911305.41,0,1266.70999999996,1266.70999999996,1266.70999999996,1266.70999999996,0 -2017-04-04,1040523.42,975821.96,1040523.42,975821.96,0,64701.4600000001,64701.4600000001,64701.4600000001,64701.4600000001,0 -2017-04-05,1186276.16,1141172.53,1186276.16,1141172.53,0,45103.6299999999,45103.6299999999,45103.6299999999,45103.6299999999,0 -2017-04-06,1291724.3,1251767.67,1291724.3,1251767.67,0,39956.6300000001,39956.6300000001,39956.6300000001,39956.6300000001,0 -2017-04-07,1382952.13,1372511.31,1382952.13,1372511.31,0,10440.8199999998,10440.8199999998,10440.8199999998,10440.8199999998,0 -2017-04-08,877819.49,1002789.7,877819.49,1002789.7,0,-124970.21,-124970.21,-124970.21,-124970.21,0 -2017-04-09,752541.35,752890.25,752541.35,752890.25,0,-348.900000000023,-348.900000000023,-348.900000000023,-348.900000000023,0 -2017-04-10,1448529.62,1280670.27,1448529.62,1280670.27,0,167859.35,167859.35,167859.35,167859.35,0 -2017-04-11,1198407.35,1288554.22,1198407.35,1288554.22,0,-90146.8699999999,-90146.8699999999,-90146.8699999999,-90146.8699999999,0 -2017-04-12,1272047.31,1238332.42,1272047.31,1238332.42,0,33714.8900000001,33714.8900000001,33714.8900000001,33714.8900000001,0 -2017-04-13,1335172.37,1406883.34,1335172.37,1406883.34,0,-71710.97,-71710.97,-71710.97,-71710.97,0 -2017-04-14,1769046.47,1673786.37,1769046.47,1673786.37,0,95260.0999999999,95260.0999999999,95260.0999999999,95260.0999999999,0 -2017-04-15,1281514.02,1328223.64,1281514.02,1328223.64,0,-46709.6199999999,-46709.6199999999,-46709.6199999999,-46709.6199999999,0 -2017-04-16,842306.01,905719.16,842306.01,905719.16,0,-63413.15,-63413.15,-63413.15,-63413.15,0 -2017-04-17,1087424.62,1042791.12,1087424.62,1042791.12,0,44633.5000000001,44633.5000000001,44633.5000000001,44633.5000000001,0 -2017-04-18,1140479.19,1111360.66,1140479.19,1111360.66,0,29118.53,29118.53,29118.53,29118.53,0 -2017-04-19,1312131.08,1366074.71,1312131.08,1366074.71,0,-53943.6299999999,-53943.6299999999,-53943.6299999999,-53943.6299999999,0 -2017-04-20,0,1161664.12,1170833.41,1161664.12,-1170833.41,-1161664.12,-1161664.12,9169.2899999998,9169.2899999998,0 -2017-04-21,0,1198489.57,1274766.58,1198489.57,-1274766.58,-1198489.57,-1198489.57,76277.01,76277.01,0 -2017-04-22,0,1007254.26,899288.99,1007254.26,-899288.99,-1007254.26,-1007254.26,-107965.27,-107965.27,0 -2017-04-23,0,758088.9,712800.33,758088.9,-712800.33,-758088.9,-758088.9,-45288.5700000001,-45288.5700000001,0 -2017-04-24,0,967889.9,1036836.82,967889.9,-1036836.82,-967889.9,-967889.9,68946.9199999999,68946.9199999999,0 -2017-04-25,0,1078469.33,1114010.32,1078469.33,-1114010.32,-1078469.33,-1078469.33,35540.99,35540.99,0 -2017-04-26,0,1116150.43,989176.3,1116150.43,-989176.3,-1116150.43,-1116150.43,-126974.13,-126974.13,0 -2017-04-27,0,941275.47,1172073.37,941275.47,-1172073.37,-941275.47,-941275.47,230797.9,230797.9,0 -2017-04-28,0,1432822.31,1381128.71,1432822.31,-1381128.71,-1432822.31,-1432822.31,-51693.6000000001,-51693.6000000001,0 -2017-04-29,0,1098543.78,1009180.14,1098543.78,-1009180.14,-1098543.78,-1098543.78,-89363.64,-89363.64,0 -2017-04-30,0,807324.52,698637.94,807324.52,-698637.94,-807324.52,-807324.52,-108686.58,-108686.58,0 -2017-05-01,0,687006.98,743062.17,687006.98,-743062.17,-687006.98,-687006.98,56055.1900000001,56055.1900000001,0 -2017-05-02,0,1265182.11,1329445.23,1265182.11,-1329445.23,-1265182.11,-1265182.11,64263.1199999999,64263.1199999999,0 -2017-05-03,0,1072707.22,1042354.38,1072707.22,-1042354.38,-1072707.22,-1072707.22,-30352.84,-30352.84,0 -2017-05-04,0,1191237.3,1274729.92,1191237.3,-1274729.92,-1191237.3,-1191237.3,83492.6199999999,83492.6199999999,0 -2017-05-05,0,1428087.64,1520982.13,1428087.64,-1520982.13,-1428087.64,-1428087.64,92894.49,92894.49,0 -2017-05-06,0,1316331.44,1117215,1316331.44,-1117215,-1316331.44,-1316331.44,-199116.44,-199116.44,0 -2017-05-07,0,738962.21,743867.69,738962.21,-743867.69,-738962.21,-738962.21,4905.47999999998,4905.47999999998,0 -2017-05-08,0,844464.41,816981.07,844464.41,-816981.07,-844464.41,-844464.41,-27483.3400000001,-27483.3400000001,0 -2017-05-09,0,596093.17,596974.85,596093.17,-596974.85,-596093.17,-596093.17,881.679999999935,881.679999999935,0 -2017-05-10,0,180499.15,67813.15,179999.15,-67813.15,-180499.15,-179999.15,-112686,-112186,500 diff --git a/inst/tests/issue_563_fread.txt b/inst/tests/issue_563_fread.txt deleted file mode 100644 index e9f7808439..0000000000 --- a/inst/tests/issue_563_fread.txt +++ /dev/null @@ -1,5 +0,0 @@ -A,B -ą,ž -ū,į -ų,ė -š,ę diff --git a/inst/tests/issue_773_fread.txt b/inst/tests/issue_773_fread.txt deleted file mode 100644 index 673608c1b7..0000000000 --- a/inst/tests/issue_773_fread.txt +++ /dev/null @@ -1,28 +0,0 @@ -AAA|BBB|CCC -4|5|6 -7|8|9 -1|2|3 -1|2|3 -1|2|3 -1|2|3 -1|2|3 -1|2|3 -1|2|3 -1|2|3 -1|2|3 -1|2|3 -1|2|3 -1|2|3 -1|2|3 -1|2|3 -1|2|3 -1|2|3 -1|2|3 -31|32|33 -21|22|23 -ZZZ|YYY -10|11 -1|2 -1|2 -1|2 -1|2 diff --git a/inst/tests/issue_785_fread.txt b/inst/tests/issue_785_fread.txt deleted file mode 100644 index 52386547ab..0000000000 --- a/inst/tests/issue_785_fread.txt +++ /dev/null @@ -1,5 +0,0 @@ -IFLxID IFLxName Ifcd Tdate Ttime UpdateMillisec Cp Chg ChgPct Cq Cm Oc S5 S4 S3 S2 S1 B1 B2 B3 B4 B5 Sv5 Sv4 Sv3 Sv2 Sv1 Bv1 Bv2 Bv3 Bv4 Bv5 BS Bsratio PreClosePrc OpenPrc Hp Lp ClosePrc UpperLmtPrc LowerLmtPrc Tq Tm PreOpnIntrst OpnIntrst PreStlmtPrc StlmtPrc PreDelta Delta SettleGroupID SettleID -IFL1 abcd IF1005 20100421 100048 500 3227.20 10.60 0.330 5 4840740.000 abc 3228.00 3227.80 3227.60 3227.40 3227.20 3227.00 3226.80 3226.60 3226.40 3226.20 13.00 17.00 10.00 14.00 2.00 7.00 4.00 1.00 20.00 4.00 B 0.508 3214.60 3215.00 3231.20 3212.20 0.00 3538.20 2895.00 18165 17570483640.00 4496 5970 3216.60 0.00 0.000 0.000 0 -IFL1 efgh IF1005 20100421 093725 500 3221.40 4.80 0.149 1 966420.000 def 3222.60 3222.40 3222.20 3222.00 3221.80 3221.40 3221.20 3221.00 3220.80 3220.60 15.00 4.00 14.00 2.00 5.00 4.00 14.00 16.00 1.00 3.00 S 0.505 3214.60 3215.00 3226.40 3212.20 0.00 3538.20 2895.00 8230 7952392200.00 4496 5427 3216.60 0.00 0.000 0.000 0 -IFL1 ijkl IF1005 20100421 093726 0 3221.80 5.20 0.162 1 966540.000 ghi 3222.60 3222.40 3222.20 3222.00 3221.80 3221.40 3221.20 3221.00 3220.80 3220.60 15.00 4.00 14.00 2.00 4.00 4.00 14.00 16.00 1.00 3.00 B 0.505 3214.60 3215.00 3226.40 3212.20 0.00 3538.20 2895.00 8231 7953358740.00 4496 5428 3216.60 0.00 0.000 0.000 0 -IFL1 mnop IF1005 20100421 093726 500 3221.80 5.20 0.162 3 2899620.000 jkl 3222.60 3222.40 3222.20 3222.00 3221.80 3221.40 3221.20 3221.00 3220.80 3220.60 15.00 4.00 15.00 2.00 1.00 4.00 14.00 16.00 1.00 3.00 B 0.505 3214.60 3215.00 3226.40 3212.20 0.00 3538.20 2895.00 8234 7956258360.00 4496 5429 3216.60 0.00 0.000 0.000 0 diff --git a/inst/tests/iterations.txt b/inst/tests/iterations.txt deleted file mode 100644 index 15397e359b..0000000000 --- a/inst/tests/iterations.txt +++ /dev/null @@ -1,101 +0,0 @@ -Iteration EstimatedLogLikelihood Change TotalTimeSec -1 -66813744.730 - 12.3 -2 -3274351.940 63539392.790 23.6 -3 -2166075.937 1108276.003 34.5 -4 -2054893.125 111182.812 45.3 -5 -1992372.828 62520.297 56.0 -6 -1913422.050 78950.778 66.8 -7 -1802172.883 111249.167 77.7 -8 -1650619.966 151552.918 88.4 -9 -1573352.448 77267.518 99.3 -10 -1565557.109 7795.339 110.0 -11 -1564263.868 1293.241 120.7 -12 -1564072.182 191.686 131.7 -13 -1563952.491 119.691 142.5 -14 -1563823.350 129.141 153.2 -15 -1563673.391 149.959 164.0 -16 -1563495.635 177.755 174.6 -17 -1563285.364 210.272 185.4 -18 -1563042.591 242.772 196.1 -19 -1562774.217 268.374 206.9 -20 -1562492.316 281.902 217.9 -21 -1562207.815 284.501 228.6 -22 -1561925.387 282.429 239.2 -23 -1561644.129 281.257 250.0 -24 -1561360.597 283.532 260.7 -25 -1561070.312 290.285 271.3 -26 -1560767.705 302.608 282.0 -27 -1560445.546 322.159 292.7 -28 -1560094.373 351.173 303.3 -29 -1559701.925 392.448 314.0 -30 -1559252.506 449.419 324.7 -31 -1558726.303 526.203 335.3 -32 -1558098.888 627.415 346.0 -33 -1557341.529 757.359 356.6 -34 -1556423.219 918.309 367.3 -35 -1555314.740 1108.479 377.9 -36 -1553990.148 1324.592 388.6 -37 -1552403.985 1586.163 399.2 -38 -1550378.738 2025.247 409.9 -39 -1547228.349 3150.389 420.6 -40 -1540952.080 6276.269 431.2 -41 -1532140.701 8811.379 441.9 -42 -1529504.777 2635.924 452.6 -43 -1529379.447 125.330 463.4 -44 -1529335.874 43.573 474.3 -45 -1529279.238 56.636 485.2 -46 -1529242.278 36.961 496.2 -47 -1529223.396 18.882 507.2 -48 -1529202.198 21.198 518.2 -49 -1529171.357 30.842 529.3 -50 -1529118.668 52.688 540.4 -51 -1529013.646 105.023 551.4 -52 -1528760.742 252.904 562.3 -53 -1528042.331 718.411 573.2 -54 -1526171.955 1870.375 584.2 -55 -1523230.406 2941.549 595.3 -56 -1520630.672 2599.734 606.4 -57 -1518865.217 1765.455 617.4 -58 -1517705.828 1159.389 628.4 -59 -1516937.811 768.017 639.4 -60 -1516426.985 510.826 650.5 -61 -1516087.341 339.644 661.6 -62 -1515861.054 226.288 672.5 -63 -1515709.565 151.489 683.4 -64 -1515607.932 101.633 694.4 -65 -1515539.918 68.015 705.4 -66 -1515494.346 45.572 716.5 -67 -1515463.441 30.905 727.6 -68 -1515442.064 21.377 738.7 -69 -1515426.947 15.117 749.5 -70 -1515416.016 10.931 760.2 -71 -1515407.933 8.083 771.0 -72 -1515401.813 6.119 781.9 -73 -1515397.065 4.748 792.8 -74 -1515393.283 3.782 803.7 -75 -1515390.187 3.096 814.7 -76 -1515387.583 2.605 826.0 -77 -1515385.331 2.252 837.7 -78 -1515383.334 1.996 849.4 -79 -1515381.523 1.811 861.0 -80 -1515379.848 1.675 872.2 -81 -1515378.272 1.576 883.3 -82 -1515376.771 1.501 894.8 -83 -1515375.325 1.446 906.3 -84 -1515373.921 1.404 918.1 -85 -1515372.549 1.372 930.1 -86 -1515371.202 1.347 941.7 -87 -1515369.876 1.327 953.3 -88 -1515368.565 1.310 965.0 -89 -1515367.268 1.297 976.8 -90 -1515365.982 1.286 988.3 -91 -1515364.705 1.277 1000.1 -92 -1515363.437 1.268 1011.9 -93 -1515362.177 1.261 1023.3 -94 -1515360.923 1.254 1034.5 -95 -1515359.675 1.248 1045.5 -96 -1515358.433 1.242 1056.4 -97 -1515357.196 1.237 1067.9 -98 -1515355.964 1.232 1079.2 -99 -1515354.737 1.227 1090.5 -100 -1515353.515 1.222 1102.0 diff --git a/inst/tests/melt-warning-1752.tsv b/inst/tests/melt-warning-1752.tsv deleted file mode 100644 index c34bcf690e..0000000000 --- a/inst/tests/melt-warning-1752.tsv +++ /dev/null @@ -1,2 +0,0 @@ -Id Id2 Geography RECORD CODES - File Identification RECORD CODES - State/US-Abbreviation (USPS) RECORD CODES - Summary Level RECORD CODES - Geographic Component RECORD CODES - Characteristic Iteration RECORD CODES - Characteristic Iteration File Sequence Number RECORD CODES - Logical Record Number GEOGRAPHIC AREA CODES - Region GEOGRAPHIC AREA CODES - Division GEOGRAPHIC AREA CODES - State (FIPS) GEOGRAPHIC AREA CODES - County GEOGRAPHIC AREA CODES - FIPS County Class Code GEOGRAPHIC AREA CODES - County Size Code GEOGRAPHIC AREA CODES - County Subdivision (FIPS) GEOGRAPHIC AREA CODES - FIPS County Subdivision Class Code GEOGRAPHIC AREA CODES - County Subdivision Size Code GEOGRAPHIC AREA CODES - Place (FIPS) GEOGRAPHIC AREA CODES - FIPS Place Class Code GEOGRAPHIC AREA CODES - Place Size Code GEOGRAPHIC AREA CODES - Census Tract GEOGRAPHIC AREA CODES - Block Group GEOGRAPHIC AREA CODES - Block GEOGRAPHIC AREA CODES - Internal Use Code GEOGRAPHIC AREA CODES - Consolidated City (FIPS) GEOGRAPHIC AREA CODES - FIPS Consolidated City Class Code GEOGRAPHIC AREA CODES - Consolidated City Size Code GEOGRAPHIC AREA CODES - American Indian Area/Alaska Native Area/Hawaiian Home Land (Census) GEOGRAPHIC AREA CODES - American Indian Area/Alaska Native Area/Hawaiian Home Land (FIPS) GEOGRAPHIC AREA CODES - FIPS American Indian Area/Alaska Native Area/Hawaiian Home Land Class Code GEOGRAPHIC AREA CODES - American Indian Trust Land/Hawaiian Home Land Indicator GEOGRAPHIC AREA CODES - American Indian Tribal Subdivision (Census) GEOGRAPHIC AREA CODES - American Indian Tribal Subdivision (FIPS) GEOGRAPHIC AREA CODES - FIPS American Indian Tribal Subdivision Class Code GEOGRAPHIC AREA CODES - Tribal Census Tract GEOGRAPHIC AREA CODES - Tribal Block Group GEOGRAPHIC AREA CODES - Alaska Native Regional Corporation (FIPS) GEOGRAPHIC AREA CODES - FIPS Alaska Native Regional Corporation Class Code GEOGRAPHIC AREA CODES - Metropolitan Statistical Area/Micropolitan Statistical Area GEOGRAPHIC AREA CODES - Metropolitan Statistical Area/Micropolitan Statistical Area Size Code GEOGRAPHIC AREA CODES - Metropolitan Division GEOGRAPHIC AREA CODES - Combined Statistical Area GEOGRAPHIC AREA CODES - New England City and Town Area GEOGRAPHIC AREA CODES - New England City and Town Area Size Code GEOGRAPHIC AREA CODES - New England City and Town Area Division GEOGRAPHIC AREA CODES - Combined New England City and Town Area GEOGRAPHIC AREA CODES - Metropolitan Statistical Area/Micropolitan Statistical Area Principal City Indicator GEOGRAPHIC AREA CODES - New England City and Town Area Principal City Indicator GEOGRAPHIC AREA CODES - Urban Area GEOGRAPHIC AREA CODES - Urban Area Size Code GEOGRAPHIC AREA CODES - Urban Area Type GEOGRAPHIC AREA CODES - Urban/Rural GEOGRAPHIC AREA CODES - Congressional District (111th) GEOGRAPHIC AREA CODES - State Legislative District (Upper Chamber) (Year 1) GEOGRAPHIC AREA CODES - State Legislative District (Lower Chamber) (Year 1) GEOGRAPHIC AREA CODES - Voting District GEOGRAPHIC AREA CODES - Voting District Indicator GEOGRAPHIC AREA CODES - Reserved GEOGRAPHIC AREA CODES - ZIP Code Tabulation Area (5 digit) GEOGRAPHIC AREA CODES - Subminor Civil Division (FIPS) GEOGRAPHIC AREA CODES - FIPS Subminor Civil Division Class Code GEOGRAPHIC AREA CODES - School District (Elementary) GEOGRAPHIC AREA CODES - School District (Secondary) GEOGRAPHIC AREA CODES - School District (Unified) AREA CHARACTERISTICS - Area (Land) AREA CHARACTERISTICS - Area (Water) AREA CHARACTERISTICS - Area Name-Legal/Statistical Area Description (LSAD) Term-Part Indicator AREA CHARACTERISTICS - Functional Status Code AREA CHARACTERISTICS - Geographic Change User Note Indicator AREA CHARACTERISTICS - Population Count (100%) AREA CHARACTERISTICS - Housing Unit Count (100%) AREA CHARACTERISTICS - Internal Point (Latitude) AREA CHARACTERISTICS - Internal Point (Longitude) AREA CHARACTERISTICS - Legal/Statistical Area Description Code AREA CHARACTERISTICS - Part Flag SPECIAL AREA CODES - Reserved SPECIAL AREA CODES - Urban Growth Area SPECIAL AREA CODES - State (ANSI) SPECIAL AREA CODES - County (ANSI) SPECIAL AREA CODES - County Subdivision (ANSI) SPECIAL AREA CODES - Place (ANSI) SPECIAL AREA CODES - Consolidated City (ANSI) SPECIAL AREA CODES - American Indian Area/Alaska Native Area/Hawaiian Home Land (ANSI) SPECIAL AREA CODES - American Indian Tribal Subdivision (ANSI) SPECIAL AREA CODES - Alaska Native Regional Corporation (ANSI) SPECIAL AREA CODES - Subminor Civil Division (ANSI) SPECIAL AREA CODES - Congressional District (113th) SPECIAL AREA CODES - Congressional District (114th) SPECIAL AREA CODES - Congressional District (115th) SPECIAL AREA CODES - State Legislative District (Upper Chamber) (Year 2) SPECIAL AREA CODES - State Legislative District (Upper Chamber) (Year 3) SPECIAL AREA CODES - State Legislative District (Upper Chamber) (Year 4) SPECIAL AREA CODES - State Legislative District (Lower Chamber) (Year 2) SPECIAL AREA CODES - State Legislative District (Lower Chamber) (Year 3) SPECIAL AREA CODES - State Legislative District (Lower Chamber) (Year 4) SPECIAL AREA CODES - American Indian Area/Alaska Native Area/Hawaiian Home Land Size Code SPECIAL AREA CODES - Combined Statistical Area Size Code SPECIAL AREA CODES - Combined NECTA Size Code SPECIAL AREA CODES - Metropolitan Micropolitan Indicator SPECIAL AREA CODES - NECTA Metropolitan Micropolitan Indicator SPECIAL AREA CODES - Public Use Microdata Area SPECIAL AREA CODES - Reserved -310M100US10180 10180 Abilene, TX Metro Area UR1US US 310 0 0 407913 10180 18 999 �.).0-*(+,))+(0(E-314 �.).0-*(+,))+(0(E-316 Abilene, TX Metro Area S 165252 69721 3.24520222E1 -9.97187428E1 M1 0 1 diff --git a/inst/tests/onecol4096.csv b/inst/tests/onecol4096.csv deleted file mode 100644 index 1a6cc68890..0000000000 --- a/inst/tests/onecol4096.csv +++ /dev/null @@ -1,262 +0,0 @@ -A -FooBarBazQux000 -FooBarBazQux001 -FooBarBazQux002 -FooBarBazQux003 -FooBarBazQux004 -FooBarBazQux005 -FooBarBazQux006 -FooBarBazQux007 -FooBarBazQux008 -FooBarBazQux009 -FooBarBazQux010 -FooBarBazQux011 -FooBarBazQux012 -FooBarBazQux013 -FooBarBazQux014 -FooBarBazQux015 -FooBarBazQux016 -FooBarBazQux017 -FooBarBazQux018 -FooBarBazQux019 -FooBarBazQux020 -FooBarBazQux021 -FooBarBazQux022 -FooBarBazQux023 -FooBarBazQux024 -FooBarBazQux025 -FooBarBazQux026 -FooBarBazQux027 -FooBarBazQux028 -FooBarBazQux029 -FooBarBazQux030 -FooBarBazQux031 -FooBarBazQux032 -FooBarBazQux033 -FooBarBazQux034 -FooBarBazQux035 -FooBarBazQux036 -FooBarBazQux037 -FooBarBazQux038 -FooBarBazQux039 -FooBarBazQux040 -FooBarBazQux041 -FooBarBazQux042 -FooBarBazQux043 -FooBarBazQux044 -FooBarBazQux045 -FooBarBazQux046 -FooBarBazQux047 -FooBarBazQux048 -FooBarBazQux049 -FooBarBazQux050 -FooBarBazQux051 -FooBarBazQux052 -FooBarBazQux053 -FooBarBazQux054 -FooBarBazQux055 -FooBarBazQux056 -FooBarBazQux057 -FooBarBazQux058 -FooBarBazQux059 -FooBarBazQux060 -FooBarBazQux061 -FooBarBazQux062 -FooBarBazQux063 -FooBarBazQux064 -FooBarBazQux065 -FooBarBazQux066 -FooBarBazQux067 -FooBarBazQux068 -FooBarBazQux069 -FooBarBazQux070 -FooBarBazQux071 -FooBarBazQux072 -FooBarBazQux073 -FooBarBazQux074 -FooBarBazQux075 -FooBarBazQux076 -FooBarBazQux077 -FooBarBazQux078 -FooBarBazQux079 -FooBarBazQux080 -FooBarBazQux081 -FooBarBazQux082 -FooBarBazQux083 -FooBarBazQux084 -FooBarBazQux085 -FooBarBazQux086 -FooBarBazQux087 -FooBarBazQux088 -FooBarBazQux089 -FooBarBazQux090 -FooBarBazQux091 -FooBarBazQux092 -FooBarBazQux093 -FooBarBazQux094 -FooBarBazQux095 -FooBarBazQux096 -FooBarBazQux097 -FooBarBazQux098 -FooBarBazQux099 -FooBarBazQux100 -FooBarBazQux101 -FooBarBazQux102 -FooBarBazQux103 -FooBarBazQux104 -FooBarBazQux105 -FooBarBazQux106 -FooBarBazQux107 -FooBarBazQux108 -FooBarBazQux109 -FooBarBazQux110 -FooBarBazQux111 -FooBarBazQux112 -FooBarBazQux113 -FooBarBazQux114 -FooBarBazQux115 -FooBarBazQux116 -FooBarBazQux117 -FooBarBazQux118 -FooBarBazQux119 -FooBarBazQux120 -FooBarBazQux121 -FooBarBazQux122 -FooBarBazQux123 -FooBarBazQux124 -FooBarBazQux125 -FooBarBazQux126 -FooBarBazQux127 -FooBarBazQux128 -FooBarBazQux129 -FooBarBazQux130 -FooBarBazQux131 -FooBarBazQux132 -FooBarBazQux133 -FooBarBazQux134 -FooBarBazQux135 -FooBarBazQux136 -FooBarBazQux137 -FooBarBazQux138 -FooBarBazQux139 -FooBarBazQux140 -FooBarBazQux141 -FooBarBazQux142 -FooBarBazQux143 -FooBarBazQux144 -FooBarBazQux145 -FooBarBazQux146 -FooBarBazQux147 -FooBarBazQux148 -FooBarBazQux149 -FooBarBazQux150 -FooBarBazQux151 -FooBarBazQux152 -FooBarBazQux153 -FooBarBazQux154 -FooBarBazQux155 -FooBarBazQux156 -FooBarBazQux157 -FooBarBazQux158 -FooBarBazQux159 -FooBarBazQux160 -FooBarBazQux161 -FooBarBazQux162 -FooBarBazQux163 -FooBarBazQux164 -FooBarBazQux165 -FooBarBazQux166 -FooBarBazQux167 -FooBarBazQux168 -FooBarBazQux169 -FooBarBazQux170 -FooBarBazQux171 -FooBarBazQux172 -FooBarBazQux173 -FooBarBazQux174 -FooBarBazQux175 -FooBarBazQux176 -FooBarBazQux177 -FooBarBazQux178 -FooBarBazQux179 -FooBarBazQux180 -FooBarBazQux181 -FooBarBazQux182 -FooBarBazQux183 -FooBarBazQux184 -FooBarBazQux185 -FooBarBazQux186 -FooBarBazQux187 -FooBarBazQux188 -FooBarBazQux189 -FooBarBazQux190 -FooBarBazQux191 -FooBarBazQux192 -FooBarBazQux193 -FooBarBazQux194 -FooBarBazQux195 -FooBarBazQux196 -FooBarBazQux197 -FooBarBazQux198 -FooBarBazQux199 -FooBarBazQux200 -FooBarBazQux201 -FooBarBazQux202 -FooBarBazQux203 -FooBarBazQux204 -FooBarBazQux205 -FooBarBazQux206 -FooBarBazQux207 -FooBarBazQux208 -FooBarBazQux209 -FooBarBazQux210 -FooBarBazQux211 -FooBarBazQux212 -FooBarBazQux213 -FooBarBazQux214 -FooBarBazQux215 -FooBarBazQux216 -FooBarBazQux217 -FooBarBazQux218 -FooBarBazQux219 -FooBarBazQux220 -FooBarBazQux221 -FooBarBazQux222 -FooBarBazQux223 -FooBarBazQux224 -FooBarBazQux225 -FooBarBazQux226 -FooBarBazQux227 -FooBarBazQux228 -FooBarBazQux229 -FooBarBazQux230 -FooBarBazQux231 -FooBarBazQux232 -FooBarBazQux233 -FooBarBazQux234 -FooBarBazQux235 -FooBarBazQux236 -FooBarBazQux237 -FooBarBazQux238 -FooBarBazQux239 -FooBarBazQux240 -FooBarBazQux241 -FooBarBazQux242 -FooBarBazQux243 - -FooBarBazQux245 -FooBarBazQux246 -FooBarBazQux247 - -FooBarBazQux249 -FooBarBazQux250 -FooBarBazQux251 -FooBarBazQux252 -FooBarBazQux253 -FooBarBazQux254 -FooBarBazQux -FooBarBaz12 -FooBarBazQux256 - - - diff --git a/inst/tests/other.Rraw b/inst/tests/other.Rraw deleted file mode 100644 index 80992203ba..0000000000 --- a/inst/tests/other.Rraw +++ /dev/null @@ -1,183 +0,0 @@ - -# Usage: require(data.table); test.data.table(with.other.packages=TRUE) - -if (exists("test.data.table",.GlobalEnv,inherits=FALSE)) { - warning("This is dev where with.other.packages should not be run. Instead, use a fresh R session with data.table installed. ", - "Not doing so in dev can be the cause of both false errors and false passes.") -} -if (!"package:data.table" %in% search()) stop("data.table should be already attached. Usage: require(data.table); test.data.table(with.other.packages=TRUE)") - -test = data.table:::test -INT = data.table:::INT - -pkgs = c("ggplot2", "hexbin", "plyr", "caret", "xts", "gdata", "zoo", "nlme", "bit64", "knitr", "plm", "parallel") -if (any(duplicated(pkgs))) stop("Packages defined to be loaded for integration tests in 'inst/tests/other.Rraw' contains duplicates.") - -is.require = function(pkg) suppressWarnings(suppressMessages(isTRUE(require(pkg, character.only=TRUE, quietly=TRUE, warn.conflicts=FALSE)))) -loaded = sapply(pkgs, is.require) - -if (sum(!loaded)) { - if (as.logical(Sys.getenv("_R_CHECK_FORCE_SUGGESTS_", "TRUE"))) { - stop(sprintf("Package suggested but not available: %s\n\nThe suggested packages are required for a complete check of data.table integration tests.\nChecking can be attempted without them by setting the environment variable _R_CHECK_FORCE_SUGGESTS_ to a false value.", paste("'", names(loaded)[!loaded], "'", sep="", collapse=", "))) - } else { - invisible(sapply(names(loaded)[!loaded], function(s) cat("\n**** Other package",s,"is not installed. Tests using it will be skipped.\n"))) - } -} - -cat("\n") -print(data.table(pkg=pkgs, loaded)[loaded==TRUE, version:=as.character(sapply(pkg, function(p) format(packageVersion(p))))][]) -cat("\n") -print(sessionInfo()) -cat("\n") - -if (all(c("package:reshape","package:reshape2") %in% search())) { - warning("Packages 'reshape' and 'reshape2' are both loaded. There have been problems before when you don't use the :: namespace prefix to disambiguate. Probably best to either remove.packages('reshape') and use reshape2 instead, or always use :: when packages mask non-generic names.") -} - -if (loaded[["ggplot2"]]) { - DT = data.table( a=1:5, b=11:50, d=c("A","B","C","D"), f=1:5, grp=1:5 ) - test(1.1, names(print(ggplot(DT,aes(b,f))+geom_point()))[c(1,3)], c("data","plot")) - test(1.2, DT[,print(ggplot(.SD,aes(b,f))+geom_point()),by=list(grp%%2L)],data.table(grp=integer())) # %%2 to reduce time needed for ggplot2 to plot - if (loaded[["hexbin"]]) { - # Test reported by C Neff on 11 Oct 2011 - test(1.3, names(print(ggplot(DT) + geom_hex(aes(b, f)) + facet_wrap(~grp)))[c(1,3)], c("data","plot")) - } - # Test plotting ITime with ggplot2 which seems to require an as.data.frame method for ITime, #1713 - datetimes = c("2011 NOV18 09:29:16", "2011 NOV18 10:42:40", "2011 NOV18 23:47:12", - "2011 NOV19 01:06:01", "2011 NOV19 11:35:34", "2011 NOV19 11:51:09") - DT = IDateTime(strptime(datetimes,"%Y %b%d %H:%M:%S")) - test(1.4, print(DT[,qplot(idate,itime)])$ranges, error="geom_point requires the following missing aesthetics: y") # y=print(qplot(DT$idate,DT$itime))$ranges - test(1.5, print(DT[,qplot(idate,as.POSIXct(itime,tzone=""))])$ranges, print(qplot(idate,as.POSIXct(itime,tzone=""),data=DT))$ranges) - try(graphics.off(),silent=TRUE) -} - -if (loaded[["plyr"]]) { - # Test key is dropped when non-dt-aware packages (here, plyr) reorders rows of data.table. - DT = data.table(a=1:10,b=1:2,key="a") - test(2, arrange(DT,b), data.table(a=INT(1,3,5,7,9,2,4,6,8,10),b=INT(1,1,1,1,1,2,2,2,2,2), key=NULL)) -} - -if (FALSE) { # loaded[["reshape"]] - # Fix for #825 - # The bug was that names(DT) changed, hence testing DT here not ans. Same fix tested next with caret, so we now just rely on the caret test. - # When running this test on 13 Mar 2018, I noticed that reshape::cast doesn't retain the Date class and returns just numbers. So I copied - # this test to the reshape2 section in main tests.Rraw, changed it to use dcast instead and tested the result explicitly. - DT = data.table(ID = c(611557L, 611557L, 611557L, 894125L, 894125L, 894125L, 894125L, 894125L, 898856L, 898856L, 898856L, 898856L, 898856L, 898856L, 898899L, 898899L, 898899L), DATUM = structure(c(16101, 16071, 16261, 16104, 16133, 16167, 16201, 16236, 16089, 16118, 16147, 16176, 16236, 16208, 16163, 16125, 16209), class = "Date"), N = c(25L, 9L, 23L, 29L, 26L, 26L, 27L, 28L, 39L, 39L, 38L, 36L, 40L, 39L, 19L, 20L, 19L), rank = c(2, 1, 3, 1, 2, 3, 4, 5, 1, 2, 3, 4, 6, 5, 2, 1, 3)) - ans = cast(DT, ID ~ rank, value = "DATUM") - test(3, names(DT), c("ID", "DATUM", "N", "rank")) -} - -if (loaded[["caret"]]) { - # Fix for #476 - # caret seems heavy (plyr, reshape2 and withr). win-builder halts at this point consistently, but we pass on Travis and locally. - # So I put the win-builder fail down to resource issues and moved this test into test.data.table(with.other.packages=TRUE). - DT = data.table(x = rnorm(10), y = rnorm(10)) - cv.ctrl = trainControl(method = 'repeatedcv', number = 5, repeats = 1) - fit = train(y ~ x, data = DT, 'lm', trControl = cv.ctrl) - test(4, names(DT), c("x", "y")) -} - -if (loaded[["xts"]]) { - # xts's last returns a one row data.table ok (setDT is needed to pass strict selfrefok(), but if not, no matter, the first subsequent := heals it (if any). - # Not true when DT is a one column data.table/data.frame, see below. - # Potentially, we could unload and reload xts in different orders. - # But users should be using :: to disambiguate (like Python forces you to always). - # This does not apply to code within packages because the NAMESPACE file in a package requires you to disambiguate functions like first() and - # last() which are non-S3 function names in several packages. - x = xts(1:100, Sys.Date()+1:100) - test(5, last(x,10), x[91:100,]) - # The important thing this tests is that data.table's last() dispatches to xts's method when data.table is loaded above xts. - # But this might not be the case, depending on whether xts was already loaded before loading data.table. - # So to make this test relevant, in a fresh R session type: "require(xts);require(data.table);test.data.table(with.other.packages=TRUE)" - # rather than: "require(data.table);require(xts);test.data.table(with.other.packages=TRUE)" - # Which was the main thrust of bug#2312 fixed in v1.8.3 -} - -if (loaded[["gdata"]]) { - if (!loaded[["xts"]]) warning("The gdata test expects xts loaded as well since all 3 have a last() function.") - x = list("a",1:2,89) - test(6.1, xts::last(x), list(89)) # would prefer 89 here like data.table does, since "last" means the last one (never more than one) so why retain the one-item list() level? - test(6.2, gdata::last(x), list(89)) - test(6.3, data.table::last(x), 89) - DT = data.table(a=7:9) - test(6.4, xts::last(DT), 9L) # would prefer last row, as data.table::last does - test(6.5, data.table::last(DT), DT[3L]) -} - -if (loaded[["zoo"]]) { - # as.Date.IDate won't change the class if xts package loaded #1500 - x = as.IDate("2016-01-15") - test(6, class(as.Date(x)), "Date") -} - -if (loaded[["nlme"]]) { - # commented out to be consistent with base R, as #1078 and #1128 are more common cases.. - # until we can find a workaround for this, Arun disabled this one. - # Search for "Fix for #1078" for the tests.. - # These were tests 527 and 528 in tests.Rraw - # test(7.1, {x=Orthodont;tt=lme(distance ~ age, data=x); tt[["data"]]=NULL; tt}, - # {x=as.data.table(Orthodont);tt=lme(distance ~ age, data=x);tt[["data"]]=NULL;tt}) - test(7.2, {x=iris;tt=groupedData( Sepal.Length ~ Sepal.Width | Species, data=x);attr(tt,"class")=NULL;attr(tt,"FUN")=NULL;tt}, - {x=as.data.table(iris);tt=groupedData( Sepal.Length ~ Sepal.Width | Species, data=x);attr(tt,"class")=NULL;attr(tt,"FUN")=NULL;attr(tt,".internal.selfref")=NULL;tt}) -} - -if (loaded[["bit64"]]) { - # these don't pass UBSAN/USAN because of the overflow, so just here in other.Rraw - test(8.1, as.character((as.integer64(2^62)-1)*2+1), "9223372036854775807") - test(8.2, as.character((as.integer64(2^62)-1)*2+2), NA_character_, warning="integer64 overflow") - test(8.3, as.character(-(as.integer64(2^62)-1)*2-1), "-9223372036854775807") - test(8.4, as.character(-(as.integer64(2^62)-1)*2-2), NA_character_, warning="integer64.*flow") -} - -if (loaded[["gdata"]]) { - # fix for bug #5069 - DT <- data.table(a = c('asdfasdf','asdf','asdgasdgasdgasdg','sdg'), b = runif(4,0,1)) - test(9, write.fwf(DT, f<-tempfile()), NULL) - unlink(f) -} - -if (loaded[["knitr"]]) { - # That data.table-unaware code in packages like knitr still work - # kable in knitr v1.6 uses DF[...] syntax inside it but the user might have passed a data.table. - # Which is fine and works thanks to cedta(). - DT = data.table(x=1, y=2) - test(10, kable(DT), output="x.*y.*1.*2") -} - -# for plm package -if (loaded[["plm"]]) { - set.seed(45L) - x = data.table(V1=c(1L,2L), V2=LETTERS[1:3], V3=round(rnorm(4),4), V4=1:12) - px = pdata.frame(x, index=c("V2", "V4"), drop.index=FALSE, row.names=TRUE) - test(11.1, class(as.data.table(px)), class(x)) - test(11.2, class(setDT(px)), class(x)) -} - -if (loaded[["parallel"]]) { - #1745 and #1727 - if (.Platform$OS.type=="windows") { - warning("This test of auto fallback to single threaded mode when data.table is used from package parallel, does not run on Windows because 'mc.cores'>1 is not supported on Windows; i.e., parallel package isn't parallel on Windows, IIUC. Whereas data.table is parallel built-in on Windows for some functions (fwrite/fread/fsort and expanding) using OpenMP.") - } else { - setDTthreads(2) - if (getDTthreads()!=2) { - # Under UBSAN and ASAN, threads are limited to 1, so only run this test when we have 2 threads. - warning("Can't get 2 OpenMP threads so unable to test auto fall back to single threaded mode when called from package parallel.") - } else { - lx <- replicate(4, runif(1e5), simplify=FALSE) - f <- function(mc.cores = 2, threads = 2) { - setDTthreads(threads) - invisible(mclapply(lx, function(x) fsort(x), mc.cores = mc.cores)) - } - f(1, 1) # was always ok - f(2, 1) # was always ok - f(1, 2) # was always ok - f(2, 2) # Used to hang. Now should not because data.table auto switches to single threaded - # Commenting out avoid_openmp_hang_within_fork() confirms this test catches catches the hang - test(12.1, getDTthreads()==1) # Stays in single-threaded mode after returning from mclapply's fork - setDTthreads(2) - test(12.2, getDTthreads()==2) # User returned to multi-threaded after fork. - } - } -} - -cat("\n",ntest-nfail,"out of",ntest,"tests passed.\n") diff --git a/inst/tests/quoted_multiline.csv b/inst/tests/quoted_multiline.csv deleted file mode 100644 index 2c3e9b3cd6..0000000000 --- a/inst/tests/quoted_multiline.csv +++ /dev/null @@ -1,126 +0,0 @@ -GPMLHTLN,TWBBEUVGM,KZ.GPGLB,CC.NVZUPRFF,NR.LEI,VA.TEXK.SCS,AN.GJTH.CRQ,UCEXFMDT,YVYB,HKSGOOSB.TF,LPBE.KE,BKJKNT,HL.DGTVRM,UZPA.XRTY.P,IYFV.ARGD.O,DHYJ.ZM.Y,GAPV.NP.U,ND.EITRXCL,OL.KYHGHYN,EI.YCOTJA,HC.DZJHDNHZWJW,BLYBZ,ZBJBLOAJAQI,JKCRUUBAVQ -3308386085360,8038-28-08 36:14:73.535 KFH,8558567300135,6221,6,0522,36,XYODIOKKZCCNEGUCKWW FWQO#0,GSZHWCRM/GWBTE DM OLYRRDELES/UUWOUR QZTHE,,,086,WEHPCNATJ,,"XS OW144022775818 (246-8745160-63) 07741 AFHE SKBLW UN 06350, VIFQLKA, TP 66662~SUUQ HNLBKPTNS~YINZRR___WIPQLCNI/TPJLMWRU/VKVFV-ZLZUVWN-KZHMUNU.ZZV",,"YP EQ577415216661 (431-2502616-04) 53276 GPNN BNKCX WZ 75440, PURNWPI, AL 03065~5264037610188512257~TGZFTW___FRAFEAPQ/ENWJMZOG/XKWRE-TALDFRJ-ILFEYNL.JVA",,,,,0,LHCYS AYE ZLEMYA IFU HEI JG FEYE, -7417870277687,0546-33-45 86:27:47.410 VZF,,,,,,DELTVKPYBNZMTWMHSNN VTAQ#6,ICWBMQAJ/ZZKVK KR OFRNAVRJUU/HEJF [PTTN],,,572,,,,,,,,,,6,, -6181761166745,2723-44-04 56:75:27.000 BGY,,,,,,QGDKGXPBAFCKWKMXOAV XVKD#5,QCYYFYJU/JKAKA IH QXOZHEEYDJ/KHPU [OXPJQHJW],,,650,,,,,,,,,,3,, -0874335141603,1385-64-27 25:63:44.800 KRY,5271823085044,3486,2,5760,76,YDYMZASXSSQNZOBUZMF XGSH#6,DXTTLOLS/NJQGA HH OPRPQMVNRW/VACGB,,,531,PYRIKVPQU,,GCJA~NKNWQFPXVP CISXDQF~UFDJ,,LSKM~6258817702246388701~FXIC,,,,,7,,.\ZQZQZCJ\325745_668083_877\IZBMNW_184514_660655_132_BYGM-5-BTEDEH-4_03\ULQJG\VHLRPLPZMRS\WRCNPW-HIVYYA-14-0515811504811.SAU -0361037610525,5724-78-63 70:57:67.165 MDV,,,,,,PNZGZBHMRWWNLMOIMMK LHOD#6,DCLQAWLQ/NDKXR CW JWQQMCAMCU/XJTEA FTTEDLGC ARML,,,716,,,,,,,,,,6,ZHGNVCYZ XV TSFE DLO:MHIZ://LAGDIF17XL.RKKUZCBRZS.FAD:1822, -6272477784827,0543-34-87 62:42:61.232 KIJ,2417632716065,3451,0,3223,31,ZKVRUAGWZFVGKBCQVLH OQBV#1,ACWXHPCB/WWQXCU DHO HRBOOKPKAE JTWZDALR/BGEB BBAGLTUR,,,504,FPVDDJXRG,,"12278 UCXZ PFFUK PC 61071, ANEIDMM, FU 81530~CEJU SPLVQDN FLZJRJWW",,"01120 YXUZ LHTUL UL 56074, EYBVFRT, RD 48318~2335338140351414277",,,,,8,,.\XCZCTEZ\768160_016541_525\VCJKWG_830028_706220_407_WZBQ-8-YQAUWJ-6_41\MEKNJ\MNYMDQJQHZL\IPQQEU-RYVMUU-08-6855706376235.HXI -3832157625006,5671-31-54 81:42:75.010 WFY,1520456255630,2424,2,338,3,KAGEHZAWYXUXAUVQZPS KZXB#2,VPEVZQWE/EHLROL LYS EGZRFGKKMW VCVUZHCA/USX BRLWUIOQ QLPPXD,,,714,LGSVENM QJV LJFMPMGT,"53861 KEMY FTRAY ME 70864, MDFSPIJ, AS 37253~VXMJ XSQFXUS QQTHVHTA","50753 JIVU MVHTZ NZ 50840, BSEVUBP, OQ 22122~ACYN JTPFCAS UKZSMKMG~EPE MQOAWAZD","25761 ZMHC HUOVZ GI 24131, YPZMWQD, EC 73272~3244461158012556576","63502 VRBQ AAIKG EM 22701, ZYKVPNU, OO 68874~5705805278178066761~KROKNIYZUXH=6841426816022413533",,,,,4,,.\KESHQDM\677203_716810_475\OWMASD_402637_632868_756_CQCT-7-MAMMGH-4_83\LYNMG\JLSSWBDZOYC\NLEHUK-DFEKFR-63-2665072340862.UWB -3378123163473,8014-20-14 52:62:12.536 DJB,2285010081185,,0,0,3,YDJBIIAZNOJQMMHUTHY MEDA#2,SVJNGNEQ/ZTKDZK IMU XTTSGYUPZQ KTCVOVUA/KQN PXTZWIDN EPVHWP OTIH GSFWJG,,,121,VJHVXOD WUZWPZGKVLDIMPPWHS,"06381 RLUW EAGRB QN 38177, JPHJEFJ, EK 73224~WNWV PRYFMNW GZFNMTRX~KYW VJYTFUMP","84614 YRTD QTQOO ME 41215, NBSMRDE, DZ 10012~YGJF UYWMUGI UAPZORAP~VPO ODAZASYD","28136 VDYD UTPIZ IP 64477, CKXMHAD, LT 68546~5250880787628724754~CTTOMIDAXJS=2725312728680656063","34037 GJPY YIXJL TZ 53245, QCJEPPD, DS 65322~0272523620705054317~TIIOSLVEDKN=0511525360235101354",,,,,7,,.\IKNYTBH\183213_032346_057\TTJXER_028452_735305_334_RZGX-4-LQXPBT-2_74\OHFOJ\NLVVFCSYWJX\PZQAEZ-SGFGPS-62-8864168360752.HMS -4263712404625,0467-41-01 06:80:46.526 MMA,2510426486728,60281,0,15213,61,CISQWVGHHJFQXDGJZUQ LZER#6,QLAWIMIT/HNFHUX LJR SOCPDGHOOW BVSEZIVB/TEPKA ZOSP,,,010,CPIQALU RXCEEBITBYRYZEGWYU,,"CR PS777308755737 (646-6208831-30) 77144 CARI WSPHS CW 04477, PJMCMGF, OR 48200~KDFH OLJLKJVZJ",,"YZ HA151452044772 (234-0541815-63) 68732 NRKR MTERK DG 57382, QMXDRDD, GQ 74030~8701620555753325244",,,,,4,UMCDAAWP JRYE OSLEPZCW: [WI863677764553] BTI PPWSYLW,.\XQYIIDZ\053405_111184_333\ETNUQG_151887_673712_544_XQJT-7-CVYZPE-0_42\QJKQB\YODJPNWJAAS\YWJVVS-BTRIQN-42-7585482802545.ZHR -3304074838866,8364-70-05 37:11:86.277 GRG,4682313802856,3827,4,2563,05,KEGEWGSUOKHWWYITRLW VKIZ#7,TAGRPLBI/TQDXWBWN/FIFFA [TGFM],,,381,RHTNMIT EJXU: CNTT,,"ML RZ378422085350 (480-1166730-43) 60400 TEVU OSGOG UG 05803, MBLHLCE, OD 06575~YTIR DWHVSUILD~VQZAPZQZ RBWRSGY",,"TP OB276325250870 (441-3001042-01) 11575 VICY UXGOV FX 37643, SMVMHPS, IR 15782~3552783488787674336~EVIQBNRLFCP=8732743138046266640",,,,,0,,.\TWSXHUM\045433_012848_482\YYYTLX_366383_183181_671_SXEZ-0-MQLXYJ-5_28\NPHOB\NWADUXCUUAM\KLFEVJ-OULWOM-70-6865651238864.TKV -3067454374726,6817-47-43 23:58:67.663 IQJ,2417745435130,66514,0,2040,45,IMDEMYIZAQUBKXDPWBN UDYH#4,AOWOCLWP/XQCXSOFM/DFWRF [CNPRUXE XYS ZMMC],,,525,MXSSZVJ GZLZOUG PZZ DAKB,,"NG LK742516525618 (556-4135075-21) 27041 SZQW WTOJR ZF 08678, ZQOFACH, EY 55475~XNFR LVJSNMKM KSBEBTGC - ZIAR___IHCFDJYH/BGRYSGPP/CCIYNWYA-UVZO-USGGQVI.JUM~UKLJTP WFJKE XQCZIJMFKIN",,"PT WT160674181418 (606-1470412-67) 71018 WVAS YBGYY XW 58730, TNHSILD, OK 26043~6007347650701613873___TNDOJJGJ/NRVGDJDG/DEHIIDWT-ZSHW-QUMULUA.DVT~UHTQKOWBPUP-ZFPRPW-JJIV",,,,,4,,.\GOLVNOW\864653_816055_427\LCCZSI_556283_645486_132_ARSY-1-NMIKCH-7_40\SNVSU\XEDKWLHCYLE\SEXQOY-NRITBH-84-6017366767807.GSX -1152646138025,7236-24-35 83:77:24.038 AGZ,7576066752507,,4,7,5,XXLPQBZICVKCXMXQBCY TQUX#5,CVYULYPD/STBOENSG/UUCAOD VCQBE NWYE,,,783,"PMOELKC CZNMFD NQW - GYZSLY YCACK - SPUPEMVAQIOIN - KVVSLTSLW - GCXNLWEVE/GWPXYXLQDJ - JMHIEQYDDMP - UWZQXXRC - BBEVIDETNK - HARCFTEEJG XZHYS WENJXCD TFE - YJWCM HHSQEHR - SHZHMMAESV UFDK FSKJU EJ - IVIHGFPXFE - UBSSSV IQNSPL EDURWEMSNK - RKTP COWSYX ZGFDSIXYSK - CUMYWQBTO - YTZHSUY QRPTWPF - PRZGJSPBYKF - LVAAZCW - VJ RKU HSN - AGDVXED - OOSDXNOV PQDRAYL BOWDL - UXCMO ZKGOSHIYQAW - IUAMTNC JIG VYEZH - EBFOLLJ NDS RROHKDO MGPQDPGV - PPNKMGI WZR YCVOIALRW CUUGFUU - CPTPBSQ BKG NAR - XMKDD VZM - MJDUZACAOS ATFUUOW MQT - EDVTP LBWWHOLWFO - EJNNT KQLLVNMOBT - JEINMHAVV ZKZ - RZHVPFCOP - RGUHMCICB WHEMYPUU FZLBJSL - SSTHFD XYAWPBAG:UN QT ADFCZRG -","JP XJ141161156611 (781-0610700-78) 00007 XVDY NSGKQ IV 02480, TQKLWCC, MA 76866~DLDW BRFHVECH TFIJFTHW - HNIE___BMYTZBXB/LNRUVSBB/XBLZNYRG-MOEN-ILWHQXV.RKI~AMKQDL QZMYB MMMGYPRQNCJ","US XM858576157532 (126-6036683-08) 86600 HEFA NHMPM AR 85502, HRWHVLJ, OF 53108~JTDL JLLZYXSX BRDFAGMC - ZTQA___AMOFVFPZ/YMHBJYMM/OFDIHBYR-EPLW-WIAGBIA.DVL~WWOTWY IDDPV DSJTDNAYREC","CS EZ865552161815 (268-7015155-25) 06283 XGAM KTNNA MT 83865, YCDSRIV, SI 83046~7310840045034886143___VWICUNYJ/FTPXYYCF/VXMBGGFE-QASZ-ABILXVJ.GJC~OVLYIPQNHQM-UFMGLS-SFAG","IS LI217608655861 (832-8826531-20) 01582 HLTL ZHNPP AS 44880, VINTFYO, PJ 60518~1383724136860184525___SFKVCHAL/VNIXFWSN/MTOACDIN-KTFX-UUKDEHV.UQV~CTNVHQNVWNE-BZXDUZ-YAYI",,,,,5,,.\WBDHKGY\507005_852347_814\IABOTM_015704_637626_348_ECYX-0-LKKGGC-7_74\XEYTH\NXUPQPZWRBM\WEEAWT-EPCOKW-64-3023121278748.QFG -8657486486487,8004-02-27 81:64:47.872 NIN,0223336302571,6227,6,081,0,QCLTSKMUCKMDMQVUOZM VTQD#7,VFXKULCL/JJOSVWVJ/MVNVA [HITJ],,,070,"PBRCGIJ IFWZNS LPC - ANIDGD THOVE - QCFNOKHYFUOAT - JMWSQEESW - XCWWVXKQG/GBTEGHUMVI - LSGZGYPGWAS - DQWYQAPO - MVUUSVJSZH - YIHFVENHRS VVWXA ZFRJGHJ ZKJ - BPNFQ QFNOAHZ - OLMFJAXENU FVNQ GWRTK RZ - JEHWMXJIHL - YOVHHY FTOMPX KREEXUPZZJ - CSMJ EXAPWK OKJZKMUAKS - PLTFBNNMK - HUGXRFU DDVQBKL - HJVXXYYZWNH - TRPFRJQ - XZ MJP NUT - FVMOAQS - KVAZCUSR OEVZJGR NBFWG - PHKPQ UPUTPRBYIGN - NQOSPUX QPI MPIVT - MDABVIS YOD HSEIUER TLCNPPGT - LJZQPSL XLO AFHOJGQAM MOXSVIE - LYKHOCJ RZF RME - HFPRR VYN - EMIAIXUBPW IPEWYXW ZEH - ESJNV QNGGIAEVIR - WHSGN IDQCRDYXUI - JPVHGXLWV MPZ - WLNZRVFPF - OQXUADOBZ REFHPPMP DVZRBLB - LJDFYY PPRRYUXF:HS TJ JTZJUTX -","RI OF241826108671 (200-4885133-63) 16750 DFVW SKFWS PL 41267, ZDCNARJ, KF 74238~IFTS GCMCTNUU KUPTUWGN - XLSF___TDNADZFQ/NMUUGQPM/ZJYLCRUI-LYBM-YVFMEPG.TCD~MZKTHF KWIGY NKAZFPORUNL","VQ FE158543700864 (352-4261130-61) 53032 MOXA KJDMS AD 72413, WKCQVEG, KN 47316~LJRM CROISQGI UITTZAOD - VRZL___VSBKDLUV/BXZXXNRG/UIELBNSA-KEUK-BSJWNVJ.YJC","TU SU118534188543 (458-0765462-63) 23286 BRZP WOUTW LY 03888, CBTLRRR, KS 42041~4801645258350242335___CIFUPASM/TPYCPZFV/RUQWQCQA-HCOM-MJGEQAF.CCV~YYXSFLXGCXE-HWPATB-MFRY","SX GW344430403560 (045-8823582-25) 37163 VLPY FLCUS TG 55175, IMIDWXT, BY 70387~5616745467400137068___ZMZOGGOQ/WZAMGJWP/JTBTXYML-DOIO-QTLWTFA.TTV",,,,,8,,.\WXYMXKE\683828_631820_554\VPCKIX_416740_701156_278_YYDS-7-INKCCA-3_20\CVQLI\YQWZXJOQPTE\GMBWXT-JVNXQD-42-6612743553173.AVM -3385011227562,5211-03-20 51:02:82.578 FBX,0315602618606,826,2,674,6,IITYCCRJUVQOWKZPVIW RROQ#3,MCHCBEBI/WJTQAXPG/TSH XQIOEKB GB LNLJ,,,572,,"QM XT475856334133 (574-3625362-62) 30263 SOFO SELBK KF 55264, CHLTHLR, VA 28481~TVWY XRKSFXIZ UWPNEMOF - PCRF___VEJDXUBC/YQKXAAUT/SICBZIOD-CQGD-FPUOLIK.DJS","BQ HP588730845847 (613-0557103-31) 16478 XIZC PAVDX FB 32365, OMDVJAU, ZZ 86748~NTBB DTYBRCCK TUSCMMOB - VFWP___KZLYMWOY/YJFHWYMB/KOAWZJLW-HDKC-NSOCKJZ.DDA","BB TM563104403200 (548-5657602-13) 74110 ZMJW RHMQN GE 25141, CVAQCVZ, EB 22647~7762507378672108202___UANOGBHW/CDTPMNQQ/TYGDHNQF-NUBU-FDHQDIM.RQL","SN PA574216416464 (515-0564484-43) 33528 IWDQ AKXPR JH 35756, EDTATVD, XC 72653~2253667118120684726___YZXQWOXN/NXFQGLGU/WLHTJPWJ-OFNK-ROSWYDR.LNK",,,,,3,,.\MDLHQWU\183014_226688_616\PTPVTQ_852046_067238_138_WBHT-8-MBVQVO-3_24\NVULV\ZLKOLSYHBRH\BIUZQD-RLVQVZ-10-7031481812225.GFK -4010485355825,0847-04-20 22:24:71.355 BUK,4084737324204,587,2,326,3,WLYXUHIYELGAVMSEENQ UZHL#4,QOBVXENX/HRZTJVMN/FGR PIGJVLI MU KQWT,,,881,,"HR RC323368462410 (457-6526280-04) 55815 IRWK QGHIG IS 88105, USJHSXP, YV 63824~UHCO UAIJSMWQ RTIPDXZW - FYGV___UCWFHXPT/MPPNKDRS/YEOKACQA-MAPX-XCWGYLK.LIE","FB EE613204072508 (407-2431835-88) 16662 LLKE RVVQU UC 37484, EEWBEHK, TG 66742~QNQX OEMJYRSD VRAPYWDC - HLBC___YOIXUOBX/IIAELNFS/EYPESWAE-ZDTI-XRUMNGQ.LBL","ZZ NF073313733434 (167-5617374-26) 02632 VZCQ YZEFQ NH 47646, ZGHOMIN, KH 65161~6656187734182030176___DWZCQLKN/XDHNPGFC/EELZOLHL-YKFK-DDBEEGE.UCV","MN CG723080404724 (371-4053530-60) 68777 UGKA DDAXS QP 67578, PNNWBWR, UY 62364~6362167225546014443___IIEZFXVF/COYZGFTW/VAYFODZO-IWHK-OQIESVO.KNV",,,,,5,,.\TSQVCRP\351538_025668_863\SOZCME_602035_442842_280_SPIB-0-OXTXSR-3_65\GHGLR\DZAQJBAWYYU\GAJMJJ-UFIUZG-53-0634634688712.QTQ -1521702026154,6833-80-56 27:30:64.843 KIP,3451586412864,844,1,213,3,XTZCXILGSARBYTSISXK PCZT#4,HNEOOMSL/RYBMYPCU/LDQ XQKFWKQ GJ BAKH,,,210,,"WN NI842255083762 (835-4086626-10) 47766 DLPX YXKUT FR 85420, WJDZHUW, BJ 16313~NGRF ODDILWEJ MRAJIWME - SVHT___UXTIOAAM/BSYECEKS/TSKEFNSX-VWDN-JCSYEDC.AEO","UF PW861674034710 (883-5222775-52) 76447 TCTV VFWRT SJ 02655, MUPMSGC, WS 84354~KAZC MEAGCOYG YDLLUOLW - YUOV___URDYCYFY/EPCHXPIP/ZAVJGQKY-QZAG-WIJNOVV.ILN","KP QO800343887462 (075-6317644-57) 33650 IPDX HPSTA DA 83233, RZPXIBT, QI 28207~8515568120118256653___MDRXVCTV/LLNOGDVA/FNAAQTFC-LXGA-OJWYDDQ.ILY","TE BZ116280853660 (620-5440474-10) 42774 DBIF BLURE HW 01457, LCOPWUN, XE 42235~1424820213043156713___EZEEKMFH/JKJXZTFV/OXUEPSVX-YSJJ-VPBSUMW.GRQ",,,,,3,,.\LOKFRZW\322645_724263_312\TPZQBI_875251_408776_877_LZUW-4-NOGSMA-1_22\XDVOY\APHEHLZLRGP\QTBLZS-JBADYV-15-7246851378254.GUN -0307682742210,3453-82-51 00:78:53.863 RJZ,1870167854275,288,7,685,3,VOTDZQPOTMRCOMGNLQE XWLQ#1,QUCZUKVX/TJKTLBHB/FMZ LSYFQNW FD CJSD,,,717,,"FA GI843172878062 (287-6725830-57) 85682 BOOA JYYAN JM 62206, ZMLMFER, SM 32383~VREL QVPLCGCJ DYYDHGKU - ADGN___CKPFGOTY/YEHURAVI/PHRLAADM-OOKZ-UYUBQHV.BNT","RW HL443020435605 (201-4058005-77) 82067 INRD KERIP CZ 15276, GKDFQDS, CL 87301~GUJY DUVBVMAJ VFCKNAUQ - QEHX___KWRJAEMJ/BHZHBOUW/WCUTEMIX-DMKC-FBZDKUQ.QVQ","KH SM412867743227 (365-5330765-51) 45002 AZLO LRYVE XI 33034, LHFMLKF, XG 83130~2406872360531407644___GSJBKRGM/QTHTBLCO/KQWHSPXS-YRFW-NTJQTSV.MYB","NF QL245723480567 (271-6438260-46) 36801 JPNQ MBUMU QX 30816, LSKUJGN, KU 17388~6645378038383182745___XUCXMXJM/NNVEGAFA/AVNWPALU-ZJQZ-SSBYJPQ.JSF",,,,,4,,.\BBWLYTE\026276_741003_056\GGBNPV_286253_473053_036_WKUS-2-FZSYIZ-6_78\YWSUS\XUPRDPQDCAM\USRTER-MOFVYS-76-5262820177853.ZRU -7231807317483,2144-25-67 08:57:40.514 PTU,2227283538466,338,7,173,5,OOCMMSWCEIHFODBFSCU HSGH#2,YAOMNCEZ/YWCAOHYK/DHJ MQLFLXE IY MXVZ,,,514,,"NP JE804584348332 (738-1653481-43) 66337 PFLH JWZKI CM 56024, GUQHIMS, EW 07778~YBUL XSSMCZGB XNNYNJUL - XQQB___DPUPAQNN/HAALVVGL/GMHRSGWK-GRDO-DUMXFEV.PDA","GN LK153145870536 (641-6708751-53) 28421 WBTK SJWTP ZX 12052, MWETXDJ, US 28682~ZGVH HTNAGYMF IDODGHJQ - CQOG___EDXOAJDD/FETJHUYX/PCAHIXPZ-IEUJ-ZXIRFBM.FUL","PH GR605865640145 (844-2871311-48) 84512 ZGQQ MWIWP CT 17222, RHLATRC, SL 47101~4813413556344258683___XVDITQKI/JRKJDQLH/OORQITAL-ERID-KWFLCHK.JJC","FN JH215627458483 (737-6843155-08) 35552 WQOZ ZNLQW HK 81760, NWHCHJX, RS 30122~5661035227542771347___LRNOFGQL/ZFOHZBQT/QJZNVXEY-NWBC-BLJOZDZ.DMZ",,,,,1,,.\VDDENKM\513476_374750_201\UNCMTT_824514_337542_112_VODM-8-CZTADE-7_40\TDJIN\LTRFSTUYRAQ\IMPSQA-IICVSR-32-3434005831048.VGV -4630126254534,5666-21-05 76:35:82.803 XER,8046420157462,885,7,120,4,JBAYMVTTIIIDCARSTRT PVYE#6,IBSXWCPV/QPVFZTPG/GMP AIHWJIQ SO AEVG,,,731,,"XQ ZG576255314243 (100-7775546-51) 24752 GVFN NFPVY HQ 33602, NOOAOHH, HU 48181~BCDY MZCAETIX SKBFFLGE - STHZ___GNMCCSLF/IPYNKLYD/JKRYIUKX-LOEV-RGSOMGU.LOZ","QC KM632468114356 (501-0103806-37) 31360 HAEU FHYQY IB 30866, RXVNYLM, VC 56207~BCKH HFEBFPDB CVNMYRHB - BTXK___MRFRJTCH/UZBAPMTP/YMYNRCNH-MRSF-QJGZHWB.PGV","NJ WX531384824662 (155-3122227-65) 71485 TYUR NNULI YA 74562, HNHZCMI, OY 16727~3752276380442448301___LFPNRPYP/RQQECKLD/KAVGQRLQ-ETUD-FACBBVB.CPC","WP NG744423147014 (022-7820036-34) 38180 UITS CNAFR QV 55508, AEFANGD, UC 00467~8881508400364047565___MBUPGHOH/NJWCVDJZ/ZZBVKMKJ-XWJZ-SMCSMZG.IYZ",,,,,4,,.\QJQSNYB\435018_077501_404\HODBWV_267312_366207_820_PAIF-3-COGWZL-2_53\QYPSR\JXLBSZFAAED\EVDIAB-EBOZRR-64-2324665170014.GXQ -7232516231067,4252-04-86 47:56:61.578 HSC,5584332582615,635,0,330,3,ZTONZMLRONMVIDCEKQW SCQV#6,GSCILNGT/QNFFLGES/ARS FYGJYCB YU UDOL,,,128,,"OX TH275857250468 (603-7050666-16) 15614 QGHT VKVXS HS 56161, NJUMKSQ, YW 75352~KKTH UBPMTYKP PQYPIZJG - AAFG___GCDTTOKP/KSLQHYYJ/NMBSKJUA-HDDB-NCZZNKD.LKG","DU TL125286318568 (517-6702444-21) 33825 AWIB CKDGY XH 58138, GMBXEYB, UK 06701~VONK CLKAMOSJ OGSIHEPY - BRPI___ALSJARWQ/MSBEQVOO/GWZZQGMW-LORB-NTCIJTL.WLK","WA NS635856246050 (154-2841686-32) 68810 DQBW AVBQG AX 67208, UMKPMHT, HC 48483~4174738654712442734___ZVGNLRXC/KFMTYHNZ/PLAFWXXG-BEER-XNYEXRD.BVB","IR SG415337443503 (444-2363205-44) 40710 ZIHW ENZYI SB 37465, DDBMIGA, NN 32444~8822327267233027480___ATHIWSIV/HUMCFWEG/ZAXZBBVV-SPJT-BQDBVIE.THE",,,,,8,,.\LHATPQZ\530474_826062_313\XSYUZL_603101_722704_713_NRZM-0-JAUVAI-7_57\FTXUQ\LCANVIHCXRO\RRBCEZ-VVCOQK-43-5267653076015.DQA -8681115015288,8828-60-48 12:02:24.156 ZZX,8166515243700,244,3,122,7,RMEKMXLCIOKPIHSVVWL XEYC#4,EFHHXYWG/IEYWVQZB/PKF QSPJJWI CT ENKD,,,106,,"YZ JZ004288716327 (046-1028582-35) 25101 WXCY PEQJM GR 65418, EKBCAWP, RM 46857~FXJO NGRDIGQE DWIBGSZM - VGYD___RMNVJPXN/ZKISJCUM/PIZLLSTE-PZWM-VABBSFN.AKV","MU DV715721882632 (554-6860838-56) 57188 JKKY YVJEG JV 14782, WOGVSNG, KS 82838~HPHL EIQLPLPM BWMESFMO - YFQR___WDCHDZJU/TSYXECFQ/KPVMJWPO-NBLK-RYHGMWG.VIH","GX IY422624515351 (146-6345046-72) 03134 PFAC AKHFB SS 56602, YHXREPV, KL 66253~4205531244345250386___DYCITQNN/PHVOOVLL/JLXKNBBD-GKJJ-NKDBGXR.IKP","QT QC480710066813 (214-2047515-71) 03014 BOJB JHKIU WT 62087, MPMNYGI, ZS 41640~8177026414767764077___WEDBJCIL/HJEPAGMF/PNLRZNAR-CWNR-DWJOGNV.ZRK",,,,,7,,.\UUVGUCK\153446_704334_282\DHSBSP_076678_807705_855_BAZT-4-VSYEQT-6_35\EHECJ\DOYGJJAZKLP\XYBOFB-ISDXLU-41-5848724173335.BYF -1076547218183,0408-77-87 42:23:43.803 FOP,4678816824181,8204,7,3318,6,HJBWFLECOLLVBCCDIZU BQZX#1,MQUZBKZU/JKHBLNFE/DJZWD [MZO JQ QFPMC],,,573,KRYKVBU IDQLIB_QDVDRJH_AEKQ:WZIPMMJG-RXCBVZVWE:XHLHMTJP-TRAMWJNHV:WUMNGRROS,"TN FR446323854676 (210-7587232-13) 51576 QJQW ZEVZR IH 57055, MSAPOYG, GC 34403~WPWJ JLFCXVZE QDDIRPOQ - RQXI___TXWPHNHU/JIFLHYNS/WNCYXLXI-XKDR-YVVEMDF.QPY","JS FG602108317413 (878-8411321-84) 17450 RVNP PJJPG AU 30356, VJPDCMW, IP 12265~YXVJ TSGVNMYS AMFYBHDD - NNLR___XXCQGOSM/PEVRAHSI/OMLIALLY-KEUN-AMIIIBT.ZSJ","PZ QX106660152221 (243-4660647-11) 75723 LLKN VQQMN VT 87332, TTNLATD, QD 76007~3535032755805561115___JHJPUBIV/QSUBKYCB/YKBTKWPG-XEWH-RBIKIUT.VFG","ST LA214815662712 (016-3430661-75) 84316 NXFL EYNMJ UW 46482, JLWXIZP, QD 11718~3332216258620727146___BIEYRVQH/KRGVLEWS/IUPUYPPM-KWUQ-XUIYEBR.GAO",,,,,3,,.\PUMKGPH\226168_475304_410\QCOQMQ_315425_168625_612_ZGGG-5-TMHNXM-0_03\PNNWQ\VANWGQTZMFE\IVOYXI-ZTKCFD-46-3738366602403.DJT -1777480348277,4455-37-55 10:35:86.688 MMP,7200012547004,7723,5,1,2,YHBTHLSGRJZUPOZWOCS KXDA#7,KDVRPWUZ/HFNPUDIM/UAHWT GWMIECIO FOFW WYIZ,,,441,UTWIOJQ BESIYDGU,,"QX QY335351351355 (025-4206144-36) 43238 RLLC ELIVP MD 13044, HWPEMQF, RZ 72802~EGTY ESYOGRAC FLRZWKLV - VLFB___GIBHHKDV/UPRSCOBNDRC/ZEGLQSARCBZ-SVNIJPEU.ZER",,"PM KF754476365233 (720-4276084-64) 61463 DOOW RTFAC FI 54127, PGLWAPZ, FF 13017~2400818455333800237___FJIJWPVS/PDDFGOQREYB/GHWNWWRNVVU-XMLNOJKG.MTO",,,,,8,,.\KHOSTCY\784084_473133_306\TTDOMN_728430_851583_325_LBKS-3-HPQCRI-3_27\ACUIS\UHQZBTGSBAD\IVJPJF-EXGNFF-82-1537137674608.KUQ -4727530736770,8427-41-30 25:08:07.673 AKG,6461813458158,835,8,21,0,NNQUFCJLKNAAPNTREGX HJDJ#0,LAQDBTJN/AHOADEII/WCJGJ PNAIY ARTQZI 'ZRAVVG JKUMEJ QPJWE',,,508,LPBMOKE ULSNRFX,"LW EF841884715113 (142-7727731-76) 50338 WTUN WYYLA BH 52751, OWLPCNI, IK 56871~VQJB XYIIXUIZ UOSMXSCW - WROO___QNNOBPRB/CIWRPZNYRKV/HBRCATBIIIY-HQTQYFCF.JSG","ZX HS336325515123 (847-8076767-81) 87038 PTVF OMYCJ VK 35224, FMRSSLA, RT 70742~HOMT PSDJMMUI LBRQAXMR - VRZK___HYEXSTKH/UFFRHNHTURF/QUBIZIEZCFC-WLCWIZLM.OZK","DF YS575641853365 (124-4065671-40) 87686 ZUHJ DLHTL BF 77236, GQOMUYY, OK 80432~8103511538465762188___NAXQLTPP/LLLCJBATZHV/EAQIKYADUMS-NCZTOMOX.CUG","DQ HU831276124015 (864-5825328-33) 67770 RFUK RDGFZ QG 63087, JJLRCTD, JI 26551~5111874584283030782___HZRBDVYF/QHJPITSYBYY/YJEVDYXMMAL-UDOMFIQT.MVJ",,,,,4,,.\AOIMKCU\104035_667824_403\CQRPLP_862854_362640_501_WFSO-7-NRIAKL-1_37\JOFKP\DPJOMBNKLQN\MRIWHN-XXHOPU-43-5662204158022.ACZ -0557067704420,8787-64-24 08:88:18.027 EXV,8487566812253,178,1,67,6,MIBKBNKYICBOOAYKIBD PLAJ#7,WXMNVEHE/GVXUOFMR/TKEDKG 'PZHHVT SDLPEJ',,,525,,"PL RG126086863028 (562-4710558-25) 70408 PKMO JDRJJ SF 23458, XRPUFDG, EX 25387~JUCK DEILXWAC HPXKTVFM - KHUI___DQLURIOT/RODLUMYEPIU/EQPYXMXJPRU-WBJSIZJF.COV","VC VS852731854526 (223-3164713-58) 00733 ILDW VECDI QX 65145, LHRFGBR, ZW 78156~JROY QVWRXRFR EJPJEOEK - FPRT___WQOCCZSH/AMSDNFZOJDK/AYMKDDYPZLZ-VVPXZJGE.KED","SM DG541731461455 (423-4184231-05) 65187 ZFBQ BDZAZ AY 13117, RXNHGDA, QC 22116~3542348835447178756___YLAWICWS/IIWIOZMEUNT/IXDQOKRQTFO-TLULQNBO.AFJ","MD HV806435072046 (440-5200738-60) 41314 DHNK ZHWAK SN 23180, HCOZCIP, IN 41620~0278487874502638735___ASJBDBDM/XHKHOGSSMTO/ZYLWCLUYMWZ-FTDYPDNK.JET",,,,,2,,.\MIXRPTX\608814_846155_510\LBSUJZ_453558_807772_153_PUHS-4-JVJFDU-4_66\TIWFP\MLKVPFPMNGF\TXYHCV-QOHAQY-43-7641547106337.WBF -7415042333085,4787-28-64 77:76:37.541 KHY,4062166553138,308,2,122,8,YJKKUFLXAAODSHSCERY HTQL#8,RPGBICSF/LJCBMWPF/FRDYY [RCYGXX RWHBEW PWXMP],,,341,FFMEZMV HACTZA PMVCGF QOCCU,"LK PQ222474538713 (630-3287741-48) 12664 QYQE RIGPZ GR 21564, BJHNDAR, LG 66445~ENHQ DACPFHJF JIDZANDN - KLIZ___FCEHGUQJ/DANLTRPPBKK/UASNFPFFKIY-OIGRWFDF.GOC","UJ AO446611557557 (225-4555423-38) 58678 WIPI SCHUR TB 37764, SSIGMYE, FC 42057~TMAJ VVYUIYYX ZNHTQJEP - CSHK___DTFKTOJL/OJRGDNWBPAY/KUFNJCJRABC-YALFRMHN.GJH","VB IS601173528026 (852-3738413-70) 73442 ICMH BOIZB NN 21502, XMHTPVW, IY 20267~1761818647116804733___QNKVUHLM/LLSJEFVQEYJ/YFTVNHDJCPU-RANSEAAS.TVK","YP SE235022248711 (861-5030774-41) 34636 ZPXB YXQNJ KZ 37850, TZQHHQC, NY 43722~2867225152387851632___OGFYMSJQ/VLAAQDQETMA/OOSMFLMPMIH-ZHWERJBU.ANX",,,,,6,,.\QYUDOJK\824138_488381_803\IWPALQ_830803_501244_767_VFVF-0-VAXGZY-7_11\YYSVP\ZBWLBWZBDHT\UVUQCJ-NZWORU-58-6487067047268.NWH -2526450553827,0115-61-21 51:52:13.336 IZB,6044536632700,152,3,5,1,QNOSNJWMXFFKRBYERYS PPYV#4,NZSCHJRZ/ZZARLYGR/CETKO [DAKRIGNX] PCJDHJ HFFKX,,,404,VIGDOSMJI,,"DR GR212273642606 (765-0405616-02) 76276 TDXR DLKAY WX 14722, EUEUBVY, WM 48876~JPSB WWHOYDOH HDBFBZQL - NOLB___NGRSMQAG/KFRQQYNQ/KFAGK-XGDALCS.PWI",,"BY IF365783762507 (237-3541884-17) 46210 DWEO AEESV TR 34320, JFZXGZC, WG 58041~7133562445157514767___UGVRVWCR/ISHFYNZT/OWXAF-AZTSYIB.NXN",,,,,6,,.\XBGPCPI\028035_673266_042\HIWCNS_416028_612276_703_LRPZ-6-NVXSJL-0_00\GGYMR\BNYKYYSKHLI\VMKXOM-QVKBQB-88-1124875655245.EHB -3645582357112,2287-00-38 42:55:78.217 KUI,5375311861216,364,5,332,8,OQDNIDUPJCHOPWUDIAN QNNV#5,EBUKWTDM/JNAHCANZ/FJGJV HRVB FHTN,,,038,RKRLCFT UI TPL,"UO FI816883728201 (247-7771832-82) 80045 FBVG RVMNC VB 76248, GFPJYBN, XL 00558~EUHL BFXPLSZL XKDCOQUU - UUQX___CHRXLDYZ/ZBYHJNAG/GHVAZ-OONHIAD.VFS","JU DQ444124558453 (321-2461376-04) 57588 UGZT WIEHU ID 00040, GLADSWE, NN 18420~TRYF JPDNFIZA GWWZXQKW - SMUX___LLKDPFFE/RATXYDME/ZJLHZ-SZJAFNQ.HDI~JKWNZXONYGM KLXDKHJ: 62/42/6516 QT LXI","FC ZT237411801121 (043-0604262-81) 83132 LPET ZNVLE HB 57040, WLFCBFQ, LI 13763~3738835402081450044___MVDZBLJE/STUOYFNM/ZDQPO-XMLAYJD.ISL","SD SR047250433305 (208-7250018-16) 41825 LSEL TFGVU NZ 88286, KTDABKQ, GS 86377~1814128280085175644___XWEJEEOX/OHCQQYSH/FMKGY-XJACXWR.CKW~ZBZCBERFOA_UJK_XYSBBER_XIXY",,,,,8,,.\FDUZZOW\347607_421528_561\PTTHRR_050738_880024_683_GPFL-1-VCRGYG-5_17\TODRZ\SFYBKETYACM\QUPEJW-AFXJOO-11-1628045828172.OVH -3133230081845,7265-10-72 77:36:21.582 BLT,1722368204042,367,6,466,3,LUUYDFOKWQWZCKRUYAU TEOK#2,RCECYBSJ/HTJSLVCS/ZGDJ WYQBKNEBDJ ,,,582,WQIOKEM SZ ICH,"UA QC433220124352 (120-2436580-88) 23681 PCBE KZDJQ PV 76211, GVCRWFN, ES 52618~DIGA VQWCWEGB PZIBMHDK - LNSW___BQMUFQIU/WFBECUSS/NZHMO-EULARXD.YTE","UB OI830148577721 (134-8447540-85) 84215 EFHX UIKWP EZ 81824, VUDIIJC, VG 03756~XDZN QDTVDQTX VSNFTTLC - OBPI___MELCPIOR/ZKNLHORV/VTORX-VDLPTFY.HVL~ZUZZNYNSJSL DQEMIUW: 64/37/5421 AV CFF","OU JJ776705862176 (023-8661810-71) 76611 JXDL KNEGY KY 17612, YQGHBCQ, FT 65813~5773475568760125646___NCZRGPZQ/VSQRNQSG/LMXZL-JZHVTZB.NXN","SV YJ672025137653 (040-2187756-68) 27664 QSYI NDDRV LZ 37174, JAPSEKU, PL 21158~7300520656005887056___AQWDMWGA/PCPYBIVT/XYFVX-IYYLQVN.URW~GNHWNHKTPK_YQQ_FUIHSFM_PTWZ",,,,,3,,.\PBSWLXW\736361_183450_015\IKVPSN_634315_566654_561_YCGY-4-QNLILW-2_20\LOQCJ\CQCSQOLVIUD\QWPNVS-RIGGYL-16-5685703653188.AXT -7258156126348,0473-58-11 38:22:72.728 HJC,0632375766845,3517,3,352,5,AWRDKXGRUUWJZAZMPJJ RFMB#3,KMPHFOVW/AADFXTDW/DYNBI [JMZC] NSIWFAWCOHX,,,563,GLUIXLR VASW,"NC PP224600008080 (216-4462837-30) 51574 GPYZ WGLOE AG 70338, EAFKNMR, LP 35012~KVNZ NJVECGQD BJZLCOVF - GTVH___MOLHWRZW/AWBCAUZU/TDXRL-NFUWGZS.WVB~MKVVQTBHPEB IJQUWDS: 41/43/4060 RW KVU","EB CD182150024451 (026-4207565-54) 21443 ZHZU IXDNN WY 81837, TULYVBH, MR 66888~PXTQ RNWJJOVV RVOZAMGO - USQA___OFVXBCUS/QCLKPVVG/DGBFS-CNHUFZD.CUD","RZ EW650272682357 (304-5733077-24) 83234 KXWA GTOGF RF 03165, VQGYDGF, LI 73608~6715316733041543431___IDJXSNSG/XSFGTLFW/WHNUK-FVHYTQV.RGB~FJZJCPJAVQ_IZI_MVDCOVQ_AOZL","SN NG121734626307 (784-7582526-85) 51718 SZIK GMIPR KU 30855, OPAGSLT, LH 48842~7421858771734822211___LXPKNTPV/TRSMCIKR/ERCEF-AOSDRKR.EAK",,,,,7,,.\FCOYYBR\021534_705407_487\TJVFWA_335636_624360_710_DDDA-3-TXZTYT-1_73\PREFL\RCERQLLAKYD\PBFUTP-XOEPLH-16-3803644284675.BDR -8742212184713,8476-46-08 20:24:11.784 AXB,1820704107874,478,2,577,4,PUBKSFHDUZQZSFKEWSZ CNEP#0,MTXTPSVS/XOCJMIPK/TAPYN [XNSEIOEB] EKZPTLZMPTP,,,868,CHZDDCA JPYUKTGJ,"GU ZY587240667718 (624-2404382-52) 81384 MAVF VTHOS WF 55630, YQLMJJR, HN 01730~VIII YENDGSQC SPJLTTPV - RVZY___VSVSKTRC/UTTLYSAN/ZJKCS-VKIXDHC.NNP","YT LG123841815706 (521-0170404-13) 02062 TWZH ESZXY DM 75278, RUKGKIK, JH 75814~AKSV DKCSCWXY XYUPJUTH - JCCU___CGCIWUYK/BBJYMUEM/AUPZJ-AACIXKE.TRJ","LL BC230432150580 (444-7604716-80) 47852 NILH YLZQG QO 56762, AONKFIY, FE 37182~7611856458135617770___MLOCISOM/MRYANKOZ/UHXMV-GFOIMRT.WIO","SK HG837866385521 (776-1561673-17) 68830 JJCG VKJXF TT 71476, ZNBDNKC, CV 88137~5880805515316834868___MVJWZAGN/BSODCUZJ/GRLVV-UKNCLUV.AXG",,,,,0,,.\CXLVEYS\246343_351388_705\CJWYJL_562345_356472_021_HMXU-2-SKTXXG-1_30\FAWNI\WBGTZPTCLSP\HKQSUK-GNRBGK-46-7861671611244.JAJ -0738667466237,3028-82-61 80:21:57.886 HWE,6833883760631,600,0,423,6,MFWWPBXGMAWMXQTFCZW ZHUH#6,LVHSSLLL/HYLDOBFP/IDWIR [SFKAOFCZ] MPCHJ ATDHKPNOJLL,,,136,XYNHWVK XLTSYLLX,"FN GW440044755814 (706-0384730-42) 14854 BMGH RGNGC YC 25471, CXOBEVO, DV 53621~MRWI YWTJAWZG CXFYBMTW - FAAZ___JAAQEGUG/JXNUFFUQ/BJEHR-LIDOBOA.NSR","EN UB022235738022 (753-1554720-43) 16271 YULI RZHMK UU 10386, GRBIDHP, MR 34185~CPGR RPOISYAH YKFHLQOC - QHOX___RWWQRCHF/AFAVXRMW/CSVOI-CSYLHXP.TRZ","CC GA041630041442 (480-2868067-50) 13773 GOCL UKMQO LY 78101, CTGASVL, CL 48871~6022688508846206518___RFDSFDQB/EYRUVHGR/FIAWB-QGVBLWM.RBX","LY MV560368621344 (516-0546880-35) 11501 MDNF QULSQ VC 40424, OYQJBIY, ZX 00703~6216235015877683310___CVPWUUSN/WNMWUALF/DWZFE-UPPMIFA.CFP",,,,,7,,.\AVWYINN\447456_282041_743\RGNSEZ_112054_667718_840_ZHCD-0-GHIHCC-5_64\AQZWK\FVWLBBPREFE\MKLRAO-TVMGLH-03-8283024767400.KIE -4745581215741,7866-26-13 43:80:23.863 WWC,0652443150620,0647,3,8504,34,FBFJCKWYEYUYIKNCBTP DSDZ#4,UBZUQTEH/UEPTVYGK/GNYIP [YDSJDW] SSKMX,,,726,WFLXCPAOH,,"RX CP664767537814 (020-8514630-05) 18437 SBVO WQUJR SE 83845, RVWCMXS, SM 26707~LJBH OVJCCHBDP~RTTFDW___ADEMWDJQ/UVIYXZBS/CQRIF-ZKBYVIE-WTSFQBI.BFL",,"JI PS565753082171 (037-5750628-08) 44747 OROI OXUWL GK 23600, XTZZADP, OI 54113~2573516177808716460~MPQMUQ___RRSTZKDY/YCSXPLAZ/FVVQL-JARCMZE-ORKHQQI.XSU",,,,,8,,.\AKAIEWY\515032_477545_554\CQEHCS_208022_287748_726_EXOG-4-EGOMPO-0_74\URRJQ\XBMNLORQIMY\FVLNOE-VIQHMQ-68-2414003507885.ZFU -4436410216811,4658-13-14 04:57:50.527 MTZ,2031852405273,5704,4,8064,36,IKKLSELVLPPAFVXGHFR OEDV#0,AUYMIEIW/KAJZEWVF/FOSKL FESV,,,631,LCHJUABHX,,BGNQ~ZEWACDFWRI BQLLMTU~IRXF,,YZSN~3226563454007004641~UBZRQRNEQUA=8128820644450213520,,,,,7,,.\SDCYTRY\720184_027221_326\OLZTSV_627802_144710_387_ZTBY-8-NIULYD-2_82\KRYYX\OKSRDLIPRZC\AVMIFS-ITLVTO-72-7123504318465.RPW -8033220047636,8365-30-12 10:83:53.640 EIE,5812161618070,,8,3,6,WNOEIUZWRFZVUQWGDNP CPND#1,LYRPVLHM/INEFCSMQ/RDBXI [UPHHR YPXCBA],,,617,BFDBITI NLZHB OEVKUO: VFTTR LKASWB,GGHO~OCBTUUMWNI QQRGIBY~IAAL,BKXK~RMTVEBLGVC HEKDMAR~CIVF,TKSM~4770456604700882441~XANNNSJBGBH=7451318458847214644,IABK~2885258658202715316~URPXAZXBOMC=5586504563722000128,,,,,1,,.\FYAFFQG\175825_863316_831\WFJXNF_738442_607664_415_OZSQ-7-DPMDND-0_13\KKYTK\YHEXYAFZIPY\BLOMZK-ONGGQN-35-7275234343060.PRO -8784852121145,1542-23-05 17:04:22.537 MOF,2131214146084,006,0,4,2,LNBSVCFZBDVQQKNVEAZ ONAO#7,MHAMVLLL/CBOUWWMP/NJARIT SCXJNWTDWJ ZD ODNKHS ,,,441,FIDATMU ZYQXH CNWXXY: XVLBV YJOSBA,DGVF~FXSLOGDCFQ VFXJJKY~DXXO,VWDT~KVIFUMGNLU DHIOBUP~GFQC,FTSW~3746107880678685781~YJMUJWEYJSU=0713844542040411856,VNKI~8380188884258663378~UNQPHFJUYPA=7780800351122070108,,,,,3,,.\BUEBUDN\676871_013637_804\JHWGBX_714352_236415_600_VTEV-8-JFSKSH-4_47\BHCJR\LQSSKZTGMEL\DNNZJV-HLLKZH-05-0273606334072.NIP -8252213772473,3177-27-17 73:68:67.771 IMW,,,,,,POVABDWMOFRPHJHWFOB JYBB#2,DKRKPBKK/NYNHHOAF/AIPOG [RSLSYJ],,,713,,,,,,,,,,1,HMZXQB [XHTJCI] YHU GLOW MLUMNCI,.\SEPOBJQ\346028_074540_783\ZYJRSK_842244_438522_422_WKBS-5-GOFJCK-8_87\FVSJJ\AJRYXHQOJGV\GCBEZO-XWQLOE-50-6505303128461.SVF -3126548270463,1452-82-67 17:32:75.141 FUQ,8317621633243,1223,2,2003,34,ZTBMTZKSEDPICLJMFYA BNDM#5,JFMPEOZR/LYOILPFQ/DAGMZM VTVRXBFY HK XLJRCKFL GVFM,,,804,TPFTYWW ZIZMDI: RXHCUS,,"KD IG174512532685 (677-3277136-65) 64135 ZXWY BREXB QY 02010, CSCFDSJ, ZT 87578~EYQA BZNMGSZPQ~TYGSVZY",,"ZQ HO065062650433 (181-2624507-83) 51501 GTAV YOANB AS 37734, THUGCWE, VX 00808~4021156648675880641~QHPPACE",,,,,3,,.\PXZIVQC\111515_675142_467\LDALLX_232434_341618_400_PBCW-5-YUJNNP-2_42\ACKGH\DINEBNJHNHW\KSEFYR-ERXFHY-31-1573620028085.XEL -7870246111838,2380-42-73 18:50:64.011 FDN,0134171805587,6841,2,315,23,ICIAWKUFPLXYSUOWGTX BUOG#1,ILMFYDHI/RAJMLVMD/EUYNQKIZYQ FFDYR/BYYIN 'TXYKKNXXFE' VMRR,,,843,PNKHZOF ZVWRFRAGTH,"EY IX186746883033 (676-1828083-82) 27424 DWMB KMCIM ZV 18081, TSDROLW, HW 82637~XLBE AEYKOHICD~HQKATLO","BB XU020706186827 (867-5421673-55) 17165 LDBU DVEJI TU 66483, JBNFFLU, TB 04266~HYRY ZJNPRRDTR~NBFHSM","LA FX133131586844 (566-8555147-38) 05611 JYTK DSCCH RH 61881, NMEZEQK, QL 08077~4688351814075064127~DQZXKOY","XP DR267444076671 (704-7664026-13) 56044 QCDI CDEYW LQ 60303, CHIJJXZ, RF 50130~8360352240807474144~LFCQTXZFWRZ=8071774134355486080",,,,,3,,.\FESZUYQ\655265_722456_412\HXOEZF_773510_716018_516_WMFG-3-QEELMO-1_82\VQXTA\DQCFYAJNIMG\KBKNQQ-QSZXHH-28-6126351812624.AVN -5012687737874,4702-74-00 37:65:41.776 USX,5160234354237,855,7,210,0,YBOWARBOLGZJSZQXBKD DTRS#5,KFOUTKOM/XSTCQQKB/NMDIIWYPJP WLMHL/DFJLX OHDM WEQX,,,515,GKUIETM RT AFP,"FZ TX211082134223 (824-8771237-38) 30043 GEHP SDOBV OW 61562, MUTPWDF, XF 82425~BKBC ATAFTNLVG~UGIEHW___KSBAHWLP/CJGGWXPW/DRJECZPEUH-PLXIXIR.CXW","JX OP232625176316 (738-8145736-60) 58774 QESC RHFJN QG 04244, SOTUVKY, SS 12654~ORQN THFPULXIW~HYSMLH___POOKJOXM/FLJRODKU/ETKANFLSTQ-BKECHXD.WDO~FHABVHRJMAM PNYSNJN: 32/74/2686 NZ UCF","II JH508272275163 (082-6722106-23) 17056 SFOK ELVNM VZ 78811, RZOCAEN, VO 85378~2321068076636332722~GYXYIDSVTWL=5536057543617356564___AGULBGGV/KGRZEEFA/KTCIEWMTOR-NJLLTDH.EXR","SG UJ670774872178 (442-5071282-80) 87183 AESY ZBFFP DT 62201, RZSDFAZ, BF 48476~2381657188284774035~JDNLMFYVANW=0784110705453576006___QCOFLOIY/TRKNDOHB/BSEVDJFCAK-CKVDBNX.SST~MEYOOQPEQK_SEL_BYQGOYI_KZTZ",,,,,5,,.\LJMUALF\520748_100660_561\UVUSWF_341256_178884_001_FCVV-5-IEJPXQ-8_11\DSMBH\ZVSRJNDCYVY\CDRKUV-TGLDJO-86-6741828737373.WVP -0011630368332,8186-27-25 35:44:55.355 TKX,3813041381558,,4,0,1,ISGJFVBTAJATAHFPWJP XOZU#7,XWATPVFO/BJOOMOQS/IHCKBSNRRY MQHBZ/AUMZ HOHPZLCOAS ,,,188,"HDGYHPV FIELMW WVABPRTU YMBBE/FZWWFX IUUP - AMF HR PPZ 7 VHV SPOY 2 PECU - KHD TBVDZ OWKDYHOAQON HZ KSAV - MWT ZBBCI LD EVJ 0 LZUJIQA VXH - KSXODHJYFW EZKFZQVWF NNFSU - XPMWAZISMZ IGFKM/UTIF RFETT - VWJ UB KX (BNUYFQ/BHOPM/PHRZH) - QGP QQ UI PKY KV FTUWO QKHPS -","KB AP214231031275 (530-1075503-26) 38317 PXQJ SHPNG AQ 34076, WXKLZTA, WH 07608~POMK RMVLBLRPU~IATQSB___IZCHLQRH/UJDUEVHS/QTSMSTPBYN-JYRVJNX.WWZ~CCKCCVSZWON GFLNXLU: 67/70/4240 FH GQV","KY XU402285135217 (888-3177514-26) 68066 FXLF IBSTI BN 76452, XUYFEZQ, RG 73453~QBMT NWCPVRCGX~GXQLFN___KMDFNNHE/MSIAXMFB/GDKTZYFCOU-ZNPHYPL.YUH~CCJLPWBAIPT OTQPFUM: 77/56/5845 JL OHS","QE ND415515266832 (682-0708848-08) 68104 ECGY OBFSJ FD 83048, PAMAXUM, BJ 11216~6411374808780764184~YKBEKHEDXFL=6632288775760173083___NVPCKXFX/OUIMXEEV/KVXWRWTWBR-PXFGDHU.BEK~CUFEKPVXQC_XFM_MFLXNLZ_JDQT","ET PE741504646333 (444-5578044-71) 40241 OOER HJFUW ZE 62418, QZECYKQ, UT 45751~3317632818512406135~VBTZQABCPVX=2817113257826205515___VLIVRDOK/GJNWFXOD/HTOKJXPUHL-NNTXLCQ.INH~CCMOQNAOZD_LST_JXNFFCK_METX",,,,,0,,.\WITGKQD\265770_874467_477\JQPVNH_772025_554713_223_ZBSW-4-MNUMYU-3_64\RLZFL\LQGUVKPIVAW\IREAIQ-BJUCHY-75-2513118136606.CMR -7377583384701,3548-88-00 73:61:46.050 OGL,0186206430318,7717,5,2425,3,GODOTTOHMOXTRLVLHBK JLNR#5,VJQGGIUS/LPOQRVEG/OUXCJVBZFF AEPQM/HFXWS [SJVZ],,,784,"ABGOLIL CLWGET CAOACSK SITZZ/YFZVTU GNDF - VRZ LR ZMS 5 BXZ ZXGB 0 NEFJ - OKC SUWDT OHOCQQIEAHP VQ RBQI - OVK MMYWD XF SAR 0 WFJHUQJ ZIQ - EMDDTZEHAG AXIUWOFTB PZHGF - ETGIOHCFFB MCTAK/EVPN LFRHC - FZK HE YJ RJP OK WGBRX VHUEP -","DO WS831357155628 (056-5554417-48) 75251 ETUP VBEDG QD 37033, WYEUKEA, YL 04116~QDZJ FHWGEPQUR~QKKGCS___NZLNTRQI/JPVNDKAX/KLXKGTGBXR-CAHVZBJ.WYM~OZIGJJBKIUF YCWMVOQ: 33/58/8571 CK KBB","HA KY505360512762 (680-4065343-64) 78733 JYTR QCZJO GB 83350, SRASJAQ, VB 26420~LGMR EITQAGMUP~KVYDRA___FHHDSAHX/FYDHBMOM/QYKTMEKLZO-BSTXZWE.OPQ","KK PX117102136762 (373-8136233-05) 34056 EHHA QJDUL DK 41215, UTHPDJM, ZN 44313~4336774580807536260~AOULSQHNOMN=2655830651246115421___VFQVFSAB/FFZVBJNY/UTFTWWIMNB-XPTBQAB.HBV~KGFGBEYZJH_YDC_UABZEHX_GPGC","EF DT302687238300 (371-7438872-56) 81082 PEEL FMVXJ KT 30585, FZUVDQF, KL 20861~7011570627807645856~JAHDKEKKISO=3388470808006285204___ZNKWDZOE/JRILYGAW/POWPENQZJW-BAXUXIK.VFK",,,,,6,,.\GPREVBH\778034_262365_125\GYLGXB_401470_522202_321_SEOX-6-WKHWSJ-7_57\NPCIL\XRWDDAFRHMY\VSHZTK-FRHKFF-65-1328128022847.OSE -3440245203140,1843-88-54 62:88:02.362 SPI,1460242042547,7153,2,5151,31,ZUQBFFYUFFDRMDLYKCR CIFR#3,HSHQMFWO/OTZNKWJY/UZZHSMNQHP SYDSN/LRSYF [LYOV],,,815,ROFVBIKZL,,"XD DV344177415638 (257-4772580-02) 15466 YJAE GDZRE FB 17817, ZAXEHVX, UY 20037~SCMX VQGMKIOQJ~CVBQLC___EPCLSZJU/PHXYRLDE/UCILY-VHZISOK-YCJJHPD.AAH",,"JA AM577245403111 (584-1267301-00) 35022 BPJA TVRJO IW 28073, RPMEKJH, KF 26884~8755680828012142411~NMNVSJ___YIZLSNFM/FQYNIKXY/FCLOU-NMVLGGM-WRFUEZJ.QSH",,,,,4,,.\YAPCNXJ\004570_850034_757\VWBZSS_848482_600874_487_PEKT-6-KQTVIL-7_30\IRVQT\HUZWLBSJYHZ\XFWPXQ-WSPJHC-00-0770000855383.KKZ -1305220146734,6638-34-75 55:33:34.683 XZK,2272308212843,8568,6,7753,28,ZEINNPEWODONFJMLZXU MSAP#6,OUDISUSZ/GME GQ IPPGYWKU,,,328,KHDXCKADL,,"NB QU874223884561 (284-0182873-42) 85881 SKTJ EVRFF TU 06804, HSWGZOB, EU 00870~RGVK GZVEDIMQK~MQDHGE___GIROOBYE/YLXUQARG/RIFMW-UBJXOER-CYESQQU.AVW",,"KU EG227356858232 (468-0307602-28) 56312 ACNN TOJZI RL 73046, BSJYDCU, ZZ 04600~5117107224272107675~SIQARH___IGNCLREI/JGGHDYDV/GLIJF-MXMJRSL-TKSGMWQ.YPD",,,,,6,, diff --git a/inst/tests/quoted_no_header.csv b/inst/tests/quoted_no_header.csv deleted file mode 100644 index e7bba0d3d6..0000000000 --- a/inst/tests/quoted_no_header.csv +++ /dev/null @@ -1,6 +0,0 @@ -John,Doe,120 jefferson st.,Riverside, NJ, 08075 -Jack,McGinnis,220 hobo Av.,Phila, PA,09119 -"John ""Da Man""",Repici,120 Jefferson St.,Riverside, NJ,08075 -Stephen,Tyler,"7452 Terrace ""At the Plaza"" road",SomeTown,SD, 91234 -,Blankman,,SomeTown, SD, 00298 -"Joan ""the bone"", Anne",Jet,"9th, at Terrace plc",Desert City,CO,00123 diff --git a/inst/tests/russellCRCRLF.csv b/inst/tests/russellCRCRLF.csv deleted file mode 100644 index 068735f76a..0000000000 --- a/inst/tests/russellCRCRLF.csv +++ /dev/null @@ -1,20 +0,0 @@ -"Index Name","Date","Value Without Dividends","Value With Dividends" -"Russell Microcap� Value Index","06/30/2000",395.77,356.90 -"Russell Microcap� Value Index","07/03/2000",397.94,359.39 -"Russell Microcap� Value Index","07/05/2000",396.27,357.91 -"Russell Microcap� Value Index","07/06/2000",398.75,360.17 -"Russell Microcap� Value Index","07/07/2000",399.20,360.58 -"Russell Microcap� Value Index","07/10/2000",400.47,361.73 -"Russell Microcap� Value Index","07/11/2000",400.67,361.91 -"Russell Microcap� Value Index","07/12/2000",404.90,365.79 -"Russell Microcap� Value Index","07/13/2000",406.70,367.43 -"Russell Microcap� Value Index","07/14/2000",407.68,368.32 -"Russell Microcap� Value Index","07/17/2000",408.67,369.22 -"Russell Microcap� Value Index","07/18/2000",407.84,368.48 -"Russell Microcap� Value Index","07/19/2000",404.81,365.75 -"Russell Microcap� Value Index","07/20/2000",406.55,367.35 -"Russell Microcap� Value Index","07/21/2000",402.66,363.85 -"Russell Microcap� Value Index","07/24/2000",398.75,360.32 -"Russell Microcap� Value Index","07/25/2000",399.36,360.88 -"Russell Microcap� Value Index","07/26/2000",400.21,361.66 -"Russell Microcap� Value Index","07/27/2000",396.02,357.97 diff --git a/inst/tests/russellCRLF.csv b/inst/tests/russellCRLF.csv deleted file mode 100644 index c40a0fdc23..0000000000 --- a/inst/tests/russellCRLF.csv +++ /dev/null @@ -1,20 +0,0 @@ -"Index Name","Date","Value Without Dividends","Value With Dividends" -"Russell Microcap� Value Index","06/30/2000",395.77,356.90 -"Russell Microcap� Value Index","07/03/2000",397.94,359.39 -"Russell Microcap� Value Index","07/05/2000",396.27,357.91 -"Russell Microcap� Value Index","07/06/2000",398.75,360.17 -"Russell Microcap� Value Index","07/07/2000",399.20,360.58 -"Russell Microcap� Value Index","07/10/2000",400.47,361.73 -"Russell Microcap� Value Index","07/11/2000",400.67,361.91 -"Russell Microcap� Value Index","07/12/2000",404.90,365.79 -"Russell Microcap� Value Index","07/13/2000",406.70,367.43 -"Russell Microcap� Value Index","07/14/2000",407.68,368.32 -"Russell Microcap� Value Index","07/17/2000",408.67,369.22 -"Russell Microcap� Value Index","07/18/2000",407.84,368.48 -"Russell Microcap� Value Index","07/19/2000",404.81,365.75 -"Russell Microcap� Value Index","07/20/2000",406.55,367.35 -"Russell Microcap� Value Index","07/21/2000",402.66,363.85 -"Russell Microcap� Value Index","07/24/2000",398.75,360.32 -"Russell Microcap� Value Index","07/25/2000",399.36,360.88 -"Russell Microcap� Value Index","07/26/2000",400.21,361.66 -"Russell Microcap� Value Index","07/27/2000",396.02,357.97 diff --git a/inst/tests/session_aborted_fatal_error.txt b/inst/tests/session_aborted_fatal_error.txt deleted file mode 100644 index 0e2acbef3a..0000000000 --- a/inst/tests/session_aborted_fatal_error.txt +++ /dev/null @@ -1,16 +0,0 @@ -ACSSF,2010m1,vt,000,0167,0000001,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 -ACSSF,2010m1,vt,000,0167,0000002,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 -ACSSF,2010m1,vt,000,0167,0000003,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 -ACSSF,2010m1,vt,000,0167,0000004,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 -ACSSF,2010m1,vt,000,0167,0000005,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 -ACSSF,2010m1,vt,000,0167,0000006,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 -ACSSF,2010m1,vt,000,0167,0000007,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 -ACSSF,2010m1,vt,000,0167,0000008,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 -ACSSF,2010m1,vt,000,0167,0000009,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 -ACSSF,2010m1,vt,000,0167,0000010,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 -ACSSF,2010m1,vt,000,0167,0000011,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 -ACSSF,2010m1,vt,000,0167,0000012,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 -ACSSF,2010m1,vt,000,0167,0000013,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 -ACSSF,2010m1,vt,000,0167,0000014,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 -ACSSF,2010m1,vt,000,0167,0000015,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 -ACSSF,2010m1,vt,000,0167,0000016,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 diff --git a/inst/tests/test0.txt b/inst/tests/test0.txt deleted file mode 100644 index 343641777b..0000000000 --- a/inst/tests/test0.txt +++ /dev/null @@ -1 +0,0 @@ -x0 656609 701231 733130 603634 355257 598656 368172 154195 328918 541999 378803 322161 321092 791071 150389 419669 180705 188717 274702 800259 100932 113270 509670 423688 412085 767369 790109 351661 959688 142249 593856 430035 881849 883353 932253 727230 319403 970870 769759 557740 283302 121615 609275 458244 53145 645010 919631 286721 63482 397957 360723 102529 81232 930175 666775 227586 87954 931600 314102 819515 474886 307681 555198 256257 935567 584995 887227 631934 434291 895515 795983 76195 307116 482805 486231 705261 785018 288274 628695 484178 34233 400298 489154 493941 744274 575616 704744 830367 289528 94032 101765 224100 791138 90153 11788 977400 421275 298837 805904 969139 70402 640508 927283 148022 424566 270942 923478 555518 248364 286337 974164 248739 32678 546732 24499 813317 981579 545526 955469 972214 940743 644527 622021 785924 23817 870966 940461 590656 675131 823011 205458 190691 291547 414287 713461 613051 126750 930891 779069 761445 638559 410482 250950 534637 191131 749656 870264 639621 966972 73639 580494 190103 331573 115388 480143 240431 302584 880387 396715 466719 202512 762275 30761 289286 324542 962755 74055 596781 557808 858438 167748 551506 313974 398181 700113 91957 814308 560534 894768 234128 275400 154705 451191 82213 846542 140500 801347 105546 881607 320445 434178 272078 918623 789413 221578 336189 893454 288401 738358 196732 269610 906540 199487 248174 151170 920877 281825 11999 229927 142709 865073 821730 733870 927047 382099 501732 209365 111025 629165 40013 781585 625607 873297 390798 950249 150346 546167 696964 774745 924600 562044 546639 820513 875737 4613 268007 538964 54024 147940 887098 259041 432766 712760 361465 541462 707152 217728 656004 749406 164417 178438 725605 930454 552495 778309 172520 585342 -6993 135061 388732 169809 62254 -3252 351291 442562 108310 810094 383020 191313 831278 966205 628916 396364 161747 52626 389767 643418 459668 73641 837384 449943 962037 101682 156039 215569 541052 556353 715341 863959 420742 187277 76339 55960 792854 169862 605135 196136 507606 874500 40006 589341 921790 174259 835893 789012 58689 999570 183003 12804 33132 16762 700847 328861 951624 152948 147249 824065 464931 119416 679783 260417 256339 365195 474795 951240 388833 597366 422250 481521 240251 94093 470069 267104 876396 941440 5060 59123 973339 407419 697781 70640 697698 890818 301616 186050 529539 430533 590844 317713 770167 908137 184259 7662 811278 667116 369633 704257 463585 770546 567979 768563 179296 823750 66862 774164 655603 603775 709287 848672 125761 222582 791991 153699 551297 379311 306024 511210 214245 437379 321291 504286 981317 617686 413759 236307 759616 437084 597432 248273 332715 304108 634669 377569 223991 659156 98602 569501 817043 -3139 34273 343602 62985 978268 501113 676726 172614 734484 459624 536897 577632 993373 468857 118235 285947 273862 557753 77861 208124 53740 813437 196687 780632 456756 737824 73209 193248 814739 82946 620531 937509 534977 750713 792793 154008 719548 63369 50103 789700 705314 598162 957370 939796 482935 136924 769343 401354 960856 372173 72628 562835 261494 443922 252954 808805 244167 993007 357420 319382 716637 131148 491938 10387 225293 215295 601463 15300 99585 955999 899293 692080 430896 939463 130638 249144 732186 706193 298076 625366 211715 466801 539754 260766 939737 175824 386850 526747 97302 345468 360414 313365 193665 933930 223183 566652 485281 221511 559204 134626 447527 616350 963250 67709 561389 223309 481791 184012 192084 495185 176337 225176 211027 620818 795659 626412 693440 854162 21056 295476 667959 583901 288218 374506 333942 580931 91268 436843 798558 951687 388189 71434 445894 977016 293562 868269 104872 665782 402427 704246 555812 112731 705347 320555 381071 513045 961812 424932 750972 723433 797141 963732 583124 534123 528064 755494 765100 945616 319267 816319 544736 939945 858844 724481 127355 89824 809157 323435 796710 982505 55151 281952 266858 103704 278013 326863 625396 286453 37590 691841 180121 324560 242657 942644 313051 18052 273293 899965 478179 806404 894543 627957 468200 179024 832540 984899 688120 916036 882768 314820 980983 287823 316173 627346 334888 845949 534463 248454 403857 751145 447842 322956 549981 200715 488329 769497 90061 860605 785771 943363 998468 496620 77270 696221 413011 166754 151521 116447 831564 163226 848260 884366 166701 589100 824493 512837 555067 808754 928003 692445 960730 697769 841303 971950 860491 983013 653710 530517 219003 644211 837924 566243 37342 545639 839650 475874 682796 32342 245297 91611 219337 357445 537100 587478 692140 906003 842543 19578 167882 982194 698333 611028 407855 224180 391638 784633 143842 116728 880111 374703 749623 73736 457614 209872 610555 255371 367870 403419 735033 562208 895083 911063 551045 991328 726404 730649 586811 464660 999369 961951 46272 612162 896926 273792 253320 625856 432386 220498 805981 218562 339073 373035 48807 265383 36535 346042 239965 683477 976158 172863 530536 527694 420081 702072 112393 453258 861480 993586 945009 968521 933886 785678 313589 333287 655906 532286 25058 985104 393032 886681 490590 364607 561365 560067 204463 319445 656924 576824 978768 780295 39908 946103 143274 771073 342473 762406 41341 309350 693254 127688 462478 793635 402445 511759 393560 858302 127338 444183 776580 985153 204304 586211 497882 412152 107519 129459 909550 726244 808115 338429 887961 962179 846652 706925 599625 848476 174466 915803 971757 717132 861039 650894 45015 60327 63774 173479 846497 813495 815334 544183 831596 617676 428664 655030 63478 201239 927460 760012 629036 204727 932502 212201 684350 878241 578776 158199 447942 655891 308078 709745 900637 548270 578200 54213 832238 181724 900876 613349 606173 523540 820104 869225 574145 172267 904974 238439 970837 927617 933646 339006 810331 208790 28266 4996 298034 797752 638315 341766 298888 924946 711613 490629 606538 126793 610571 239295 289220 785128 248223 647844 861089 406627 599125 410243 312553 107253 697336 35212 228437 541347 551765 576224 627122 751956 664415 417495 -2368 955199 \ No newline at end of file diff --git a/inst/tests/tests-DESCRIPTION b/inst/tests/tests-DESCRIPTION deleted file mode 100644 index ba1d5f935c..0000000000 --- a/inst/tests/tests-DESCRIPTION +++ /dev/null @@ -1,7 +0,0 @@ -Package: test.data.table -Version: 0.1 -Type: Backend -Title: List of data.table dependencies used in integration tests -Authors@R: c(person("data.table team", role = c("aut", "cre", "cph"), email="mattjdowle@gmail.com")) -Description: Standalone R DESCRIPTION file which defines R dependencies for integration tests of data.table package. -Suggests: ggplot2 (>= 0.9.0), reshape, hexbin, fastmatch, nlme, gdata, caret, plm, rmarkdown, parallel diff --git a/inst/tests/tests.Rraw b/inst/tests/tests.Rraw deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/inst/tests/unescaped.csv b/inst/tests/unescaped.csv deleted file mode 100644 index cbbe48a32d..0000000000 --- a/inst/tests/unescaped.csv +++ /dev/null @@ -1,4 +0,0 @@ -"No","Comment","Type" -"0","he said:"wonderful."","A" -"1","The problem is: reading table, and also "a problem, yes." keep going on.","A" - diff --git a/inst/tests/utf16be.txt b/inst/tests/utf16be.txt deleted file mode 100644 index a85d75180667ab11259996ff28a4705a80c1e660..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18 YcmezOpCOS!hari9iy;|Er!a5<05l&1^Z)<= diff --git a/inst/tests/utf16le.txt b/inst/tests/utf16le.txt deleted file mode 100644 index 36b633aa39c19f1f884ab07a7952cde5b2970deb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18 WcmezWFOflqA&G&DAsI-g0BHa=76bGE diff --git a/inst/tests/winallquoted.csv b/inst/tests/winallquoted.csv deleted file mode 100644 index a74d8b43ad..0000000000 --- a/inst/tests/winallquoted.csv +++ /dev/null @@ -1,5000 +0,0 @@ -"station_id","bikes_available","docks_available","time" -"2","2","25","2013/08/29 12:06:01" -"2","2","25","2013/08/29 12:07:01" -"2","2","25","2013/08/29 12:08:01" -"2","2","25","2013/08/29 12:09:01" -"2","2","25","2013/08/29 12:10:01" -"2","2","25","2013/08/29 12:11:01" -"2","2","25","2013/08/29 12:12:01" -"2","2","25","2013/08/29 12:13:01" -"2","2","25","2013/08/29 12:15:01" -"2","2","25","2013/08/29 12:16:02" -"2","2","25","2013/08/29 12:18:01" -"2","2","25","2013/08/29 12:19:01" -"2","2","25","2013/08/29 12:20:01" -"2","2","25","2013/08/29 12:21:01" -"2","2","25","2013/08/29 12:22:01" -"2","2","25","2013/08/29 12:23:01" -"2","2","25","2013/08/29 12:25:01" -"2","2","25","2013/08/29 12:26:01" -"2","2","25","2013/08/29 12:27:04" -"2","2","25","2013/08/29 12:29:01" -"2","2","25","2013/08/29 12:30:01" -"2","2","25","2013/08/29 12:31:01" -"2","2","25","2013/08/29 12:32:01" -"2","2","25","2013/08/29 12:33:01" -"2","2","25","2013/08/29 12:34:01" -"2","2","25","2013/08/29 12:36:01" -"2","2","25","2013/08/29 12:37:01" -"2","2","25","2013/08/29 12:38:01" -"2","2","25","2013/08/29 12:39:01" -"2","2","25","2013/08/29 12:40:02" -"2","2","25","2013/08/29 12:41:03" -"2","2","25","2013/08/29 12:42:04" -"2","2","25","2013/08/29 12:43:01" -"2","2","25","2013/08/29 12:44:01" -"2","2","25","2013/08/29 12:45:02" -"2","2","25","2013/08/29 12:46:01" -"2","2","25","2013/08/29 12:47:01" -"2","2","25","2013/08/29 12:48:01" -"2","2","25","2013/08/29 12:49:03" -"2","2","25","2013/08/29 12:50:01" -"2","2","25","2013/08/29 12:52:01" -"2","2","25","2013/08/29 12:53:02" -"2","2","25","2013/08/29 12:54:02" -"2","2","25","2013/08/29 12:55:01" -"2","2","25","2013/08/29 12:56:01" -"2","2","25","2013/08/29 12:57:01" -"2","2","25","2013/08/29 12:58:01" -"2","2","25","2013/08/29 12:59:01" -"2","2","25","2013/08/29 13:00:02" -"2","2","25","2013/08/29 13:01:01" -"2","2","25","2013/08/29 13:03:02" -"2","2","25","2013/08/29 13:04:01" -"2","2","25","2013/08/29 13:05:01" -"2","2","25","2013/08/29 13:06:02" -"2","2","25","2013/08/29 13:07:01" -"2","2","25","2013/08/29 13:08:01" -"2","2","25","2013/08/29 13:09:01" -"2","2","25","2013/08/29 13:10:02" -"2","3","24","2013/08/29 13:11:01" -"2","3","24","2013/08/29 13:12:01" -"2","3","24","2013/08/29 13:14:01" -"2","3","24","2013/08/29 13:15:01" -"2","3","24","2013/08/29 13:16:01" -"2","3","24","2013/08/29 13:17:01" -"2","3","24","2013/08/29 13:18:01" -"2","3","24","2013/08/29 13:19:01" -"2","3","24","2013/08/29 13:20:01" -"2","3","24","2013/08/29 13:21:01" -"2","3","24","2013/08/29 13:22:01" -"2","3","24","2013/08/29 13:23:01" -"2","3","24","2013/08/29 13:25:01" -"2","3","24","2013/08/29 13:26:01" -"2","3","24","2013/08/29 13:27:01" -"2","3","24","2013/08/29 13:28:01" -"2","3","24","2013/08/29 13:29:01" -"2","3","24","2013/08/29 13:30:01" -"2","3","24","2013/08/29 13:31:01" -"2","3","24","2013/08/29 13:33:01" -"2","3","24","2013/08/29 13:34:02" -"2","3","24","2013/08/29 13:36:01" -"2","3","24","2013/08/29 13:37:01" -"2","3","24","2013/08/29 13:38:01" -"2","3","24","2013/08/29 13:39:01" -"2","3","24","2013/08/29 13:40:01" -"2","3","24","2013/08/29 13:41:02" -"2","3","24","2013/08/29 13:42:01" -"2","3","24","2013/08/29 13:43:01" -"2","3","24","2013/08/29 13:44:02" -"2","3","24","2013/08/29 13:45:01" -"2","3","24","2013/08/29 13:46:02" -"2","3","24","2013/08/29 13:48:01" -"2","3","24","2013/08/29 13:49:01" -"2","3","24","2013/08/29 13:50:01" -"2","3","24","2013/08/29 13:51:01" -"2","3","24","2013/08/29 13:52:01" -"2","2","25","2013/08/29 13:53:02" -"2","2","25","2013/08/29 13:54:01" -"2","2","25","2013/08/29 13:55:01" -"2","2","25","2013/08/29 13:57:01" -"2","2","25","2013/08/29 13:58:02" -"2","2","25","2013/08/29 13:59:01" -"2","2","25","2013/08/29 14:00:01" -"2","2","25","2013/08/29 14:01:02" -"2","2","25","2013/08/29 14:02:01" -"2","2","25","2013/08/29 14:03:01" -"2","2","25","2013/08/29 14:04:01" -"2","2","25","2013/08/29 14:05:01" -"2","2","25","2013/08/29 14:07:01" -"2","2","25","2013/08/29 14:08:02" -"2","2","25","2013/08/29 14:09:01" -"2","2","25","2013/08/29 14:10:01" -"2","2","25","2013/08/29 14:11:01" -"2","2","25","2013/08/29 14:12:01" -"2","2","25","2013/08/29 14:13:01" -"2","2","25","2013/08/29 14:14:01" -"2","2","25","2013/08/29 14:15:01" -"2","2","25","2013/08/29 14:16:01" -"2","2","25","2013/08/29 14:18:01" -"2","2","25","2013/08/29 14:19:01" -"2","2","25","2013/08/29 14:20:01" -"2","2","25","2013/08/29 14:21:01" -"2","2","25","2013/08/29 14:22:02" -"2","2","25","2013/08/29 14:23:01" -"2","2","25","2013/08/29 14:24:01" -"2","2","25","2013/08/29 14:25:01" -"2","2","25","2013/08/29 14:26:02" -"2","2","25","2013/08/29 14:27:01" -"2","2","25","2013/08/29 14:28:01" -"2","2","25","2013/08/29 14:29:01" -"2","2","25","2013/08/29 14:30:01" -"2","2","25","2013/08/29 14:31:01" -"2","2","25","2013/08/29 14:32:03" -"2","2","25","2013/08/29 14:33:01" -"2","2","25","2013/08/29 14:35:01" -"2","2","25","2013/08/29 14:36:01" -"2","2","25","2013/08/29 14:37:01" -"2","2","25","2013/08/29 14:38:01" -"2","2","25","2013/08/29 14:39:01" -"2","2","25","2013/08/29 14:40:01" -"2","2","25","2013/08/29 14:41:02" -"2","2","25","2013/08/29 14:42:02" -"2","2","25","2013/08/29 14:43:01" -"2","2","25","2013/08/29 14:44:02" -"2","2","25","2013/08/29 14:45:01" -"2","2","25","2013/08/29 14:47:01" -"2","2","25","2013/08/29 14:48:02" -"2","2","25","2013/08/29 14:49:01" -"2","2","25","2013/08/29 14:50:01" -"2","2","25","2013/08/29 14:51:02" -"2","2","25","2013/08/29 14:52:02" -"2","2","25","2013/08/29 14:53:01" -"2","2","25","2013/08/29 14:54:01" -"2","2","25","2013/08/29 14:55:01" -"2","2","25","2013/08/29 14:56:01" -"2","2","25","2013/08/29 14:57:01" -"2","2","25","2013/08/29 14:58:01" -"2","2","25","2013/08/29 14:59:01" -"2","2","25","2013/08/29 15:00:02" -"2","2","25","2013/08/29 15:01:01" -"2","2","25","2013/08/29 15:02:02" -"2","2","25","2013/08/29 15:03:01" -"2","2","25","2013/08/29 15:04:01" -"2","2","25","2013/08/29 15:05:01" -"2","2","25","2013/08/29 15:06:02" -"2","2","25","2013/08/29 15:08:01" -"2","2","25","2013/08/29 15:10:01" -"2","2","25","2013/08/29 15:11:02" -"2","2","25","2013/08/29 15:12:02" -"2","2","25","2013/08/29 15:14:01" -"2","2","25","2013/08/29 15:15:01" -"2","2","25","2013/08/29 15:16:01" -"2","2","25","2013/08/29 15:17:04" -"2","2","25","2013/08/29 15:18:01" -"2","2","25","2013/08/29 15:19:01" -"2","2","25","2013/08/29 15:20:02" -"2","2","25","2013/08/29 15:21:01" -"2","2","25","2013/08/29 15:23:01" -"2","2","25","2013/08/29 15:24:01" -"2","2","25","2013/08/29 15:25:01" -"2","2","25","2013/08/29 15:26:07" -"2","2","25","2013/08/29 15:27:01" -"2","2","25","2013/08/29 15:28:01" -"2","2","25","2013/08/29 15:29:01" -"2","2","25","2013/08/29 15:30:01" -"2","2","25","2013/08/29 15:31:02" -"2","2","25","2013/08/29 15:32:01" -"2","2","25","2013/08/29 15:33:01" -"2","2","25","2013/08/29 15:34:01" -"2","2","25","2013/08/29 15:35:01" -"2","2","25","2013/08/29 15:36:01" -"2","2","25","2013/08/29 15:38:01" -"2","2","25","2013/08/29 15:40:01" -"2","2","25","2013/08/29 15:41:02" -"2","2","25","2013/08/29 15:42:01" -"2","2","25","2013/08/29 15:43:01" -"2","2","25","2013/08/29 15:44:01" -"2","2","25","2013/08/29 15:45:01" -"2","2","25","2013/08/29 15:46:01" -"2","2","25","2013/08/29 15:47:01" -"2","2","25","2013/08/29 15:48:01" -"2","2","25","2013/08/29 15:49:01" -"2","2","25","2013/08/29 15:50:01" -"2","2","25","2013/08/29 15:51:01" -"2","2","25","2013/08/29 15:52:01" -"2","2","25","2013/08/29 15:53:01" -"2","2","25","2013/08/29 15:54:01" -"2","2","25","2013/08/29 15:55:02" -"2","2","25","2013/08/29 15:56:01" -"2","2","25","2013/08/29 15:57:01" -"2","2","25","2013/08/29 15:58:01" -"2","2","25","2013/08/29 15:59:01" -"2","2","25","2013/08/29 16:00:01" -"2","2","25","2013/08/29 16:01:02" -"2","2","25","2013/08/29 16:02:01" -"2","2","25","2013/08/29 16:03:01" -"2","2","25","2013/08/29 16:04:01" -"2","2","25","2013/08/29 16:05:01" -"2","2","25","2013/08/29 16:06:01" -"2","2","25","2013/08/29 16:07:01" -"2","2","25","2013/08/29 16:08:01" -"2","2","25","2013/08/29 16:10:01" -"2","2","25","2013/08/29 16:11:01" -"2","2","25","2013/08/29 16:12:01" -"2","2","25","2013/08/29 16:13:01" -"2","2","25","2013/08/29 16:15:01" -"2","2","25","2013/08/29 16:16:02" -"2","2","25","2013/08/29 16:17:01" -"2","2","25","2013/08/29 16:18:01" -"2","2","25","2013/08/29 16:19:01" -"2","2","25","2013/08/29 16:20:02" -"2","2","25","2013/08/29 16:22:01" -"2","2","25","2013/08/29 16:23:01" -"2","2","25","2013/08/29 16:24:01" -"2","2","25","2013/08/29 16:25:01" -"2","2","25","2013/08/29 16:26:03" -"2","2","25","2013/08/29 16:27:01" -"2","2","25","2013/08/29 16:28:01" -"2","2","25","2013/08/29 16:29:02" -"2","2","25","2013/08/29 16:30:01" -"2","2","25","2013/08/29 16:31:01" -"2","2","25","2013/08/29 16:32:01" -"2","2","25","2013/08/29 16:33:01" -"2","2","25","2013/08/29 16:35:01" -"2","2","25","2013/08/29 16:36:01" -"2","2","25","2013/08/29 16:37:01" -"2","2","25","2013/08/29 16:38:02" -"2","2","25","2013/08/29 16:39:01" -"2","2","25","2013/08/29 16:40:01" -"2","2","25","2013/08/29 16:41:03" -"2","2","25","2013/08/29 16:42:01" -"2","2","25","2013/08/29 16:43:02" -"2","2","25","2013/08/29 16:44:01" -"2","2","25","2013/08/29 16:45:01" -"2","2","25","2013/08/29 16:46:01" -"2","2","25","2013/08/29 16:47:02" -"2","2","25","2013/08/29 16:49:01" -"2","2","25","2013/08/29 16:50:01" -"2","2","25","2013/08/29 16:51:01" -"2","2","25","2013/08/29 16:52:01" -"2","2","25","2013/08/29 16:53:01" -"2","2","25","2013/08/29 16:54:01" -"2","2","25","2013/08/29 16:55:01" -"2","2","25","2013/08/29 16:56:02" -"2","2","25","2013/08/29 16:57:01" -"2","2","25","2013/08/29 16:58:01" -"2","2","25","2013/08/29 16:59:01" -"2","2","25","2013/08/29 17:00:01" -"2","2","25","2013/08/29 17:01:01" -"2","2","25","2013/08/29 17:02:01" -"2","2","25","2013/08/29 17:03:01" -"2","2","25","2013/08/29 17:04:01" -"2","2","25","2013/08/29 17:05:01" -"2","2","25","2013/08/29 17:06:01" -"2","2","25","2013/08/29 17:07:01" -"2","2","25","2013/08/29 17:08:02" -"2","2","25","2013/08/29 17:09:01" -"2","2","25","2013/08/29 17:10:01" -"2","2","25","2013/08/29 17:11:02" -"2","2","25","2013/08/29 17:12:01" -"2","2","25","2013/08/29 17:13:01" -"2","2","25","2013/08/29 17:14:02" -"2","2","25","2013/08/29 17:15:01" -"2","2","25","2013/08/29 17:16:01" -"2","2","25","2013/08/29 17:17:01" -"2","3","24","2013/08/29 17:18:01" -"2","3","24","2013/08/29 17:19:01" -"2","4","23","2013/08/29 17:20:01" -"2","4","23","2013/08/29 17:21:01" -"2","4","23","2013/08/29 17:22:04" -"2","4","23","2013/08/29 17:23:01" -"2","4","23","2013/08/29 17:24:01" -"2","4","23","2013/08/29 17:25:01" -"2","4","23","2013/08/29 17:27:01" -"2","4","23","2013/08/29 17:28:01" -"2","4","23","2013/08/29 17:30:01" -"2","4","23","2013/08/29 17:31:01" -"2","4","23","2013/08/29 17:32:02" -"2","4","23","2013/08/29 17:33:01" -"2","4","23","2013/08/29 17:34:01" -"2","3","24","2013/08/29 17:35:02" -"2","3","24","2013/08/29 17:36:03" -"2","3","24","2013/08/29 17:37:02" -"2","3","24","2013/08/29 17:38:01" -"2","3","24","2013/08/29 17:39:01" -"2","3","24","2013/08/29 17:40:01" -"2","3","24","2013/08/29 17:41:03" -"2","3","24","2013/08/29 17:43:01" -"2","3","24","2013/08/29 17:45:01" -"2","3","24","2013/08/29 17:46:01" -"2","3","24","2013/08/29 17:47:01" -"2","3","24","2013/08/29 17:48:01" -"2","3","24","2013/08/29 17:49:01" -"2","3","24","2013/08/29 17:50:01" -"2","3","24","2013/08/29 17:51:01" -"2","3","24","2013/08/29 17:52:01" -"2","3","24","2013/08/29 17:53:01" -"2","3","24","2013/08/29 17:56:01" -"2","3","24","2013/08/29 17:57:01" -"2","3","24","2013/08/29 17:58:01" -"2","3","24","2013/08/29 17:59:01" -"2","3","24","2013/08/29 18:00:02" -"2","3","24","2013/08/29 18:01:01" -"2","3","24","2013/08/29 18:03:01" -"2","3","24","2013/08/29 18:04:01" -"2","3","24","2013/08/29 18:05:01" -"2","3","24","2013/08/29 18:06:01" -"2","3","24","2013/08/29 18:07:01" -"2","3","24","2013/08/29 18:08:01" -"2","3","24","2013/08/29 18:09:01" -"2","3","24","2013/08/29 18:10:01" -"2","3","24","2013/08/29 18:11:01" -"2","3","24","2013/08/29 18:12:01" -"2","3","24","2013/08/29 18:13:01" -"2","3","24","2013/08/29 18:14:01" -"2","3","24","2013/08/29 18:15:01" -"2","3","24","2013/08/29 18:16:01" -"2","3","24","2013/08/29 18:18:01" -"2","3","24","2013/08/29 18:19:01" -"2","3","24","2013/08/29 18:20:01" -"2","3","24","2013/08/29 18:21:01" -"2","3","24","2013/08/29 18:22:01" -"2","3","24","2013/08/29 18:23:01" -"2","3","24","2013/08/29 18:24:01" -"2","3","24","2013/08/29 18:25:01" -"2","3","24","2013/08/29 18:26:01" -"2","3","24","2013/08/29 18:27:01" -"2","3","24","2013/08/29 18:28:01" -"2","3","24","2013/08/29 18:30:01" -"2","3","24","2013/08/29 18:31:02" -"2","3","24","2013/08/29 18:32:01" -"2","3","24","2013/08/29 18:33:01" -"2","3","24","2013/08/29 18:35:01" -"2","3","24","2013/08/29 18:36:01" -"2","3","24","2013/08/29 18:37:01" -"2","3","24","2013/08/29 18:38:01" -"2","3","24","2013/08/29 18:39:01" -"2","3","24","2013/08/29 18:40:02" -"2","3","24","2013/08/29 18:41:01" -"2","3","24","2013/08/29 18:42:01" -"2","3","24","2013/08/29 18:43:01" -"2","3","24","2013/08/29 18:44:02" -"2","3","24","2013/08/29 18:45:01" -"2","3","24","2013/08/29 18:46:03" -"2","3","24","2013/08/29 18:47:01" -"2","3","24","2013/08/29 18:49:01" -"2","3","24","2013/08/29 18:50:01" -"2","3","24","2013/08/29 18:51:01" -"2","3","24","2013/08/29 18:52:01" -"2","3","24","2013/08/29 18:53:01" -"2","3","24","2013/08/29 18:54:01" -"2","3","24","2013/08/29 18:55:01" -"2","3","24","2013/08/29 18:56:01" -"2","3","24","2013/08/29 18:57:01" -"2","3","24","2013/08/29 18:58:01" -"2","3","24","2013/08/29 19:00:02" -"2","3","24","2013/08/29 19:01:02" -"2","3","24","2013/08/29 19:02:03" -"2","3","24","2013/08/29 19:03:01" -"2","3","24","2013/08/29 19:04:02" -"2","3","24","2013/08/29 19:05:01" -"2","3","24","2013/08/29 19:06:01" -"2","3","24","2013/08/29 19:07:03" -"2","3","24","2013/08/29 19:08:01" -"2","3","24","2013/08/29 19:10:01" -"2","3","24","2013/08/29 19:11:02" -"2","3","24","2013/08/29 19:12:01" -"2","3","24","2013/08/29 19:13:02" -"2","3","24","2013/08/29 19:15:01" -"2","3","24","2013/08/29 19:16:01" -"2","3","24","2013/08/29 19:17:03" -"2","3","24","2013/08/29 19:18:01" -"2","2","25","2013/08/29 19:19:01" -"2","2","25","2013/08/29 19:20:01" -"2","2","25","2013/08/29 19:21:02" -"2","2","25","2013/08/29 19:22:01" -"2","2","25","2013/08/29 19:23:01" -"2","2","25","2013/08/29 19:24:01" -"2","2","25","2013/08/29 19:25:02" -"2","2","25","2013/08/29 19:26:01" -"2","2","25","2013/08/29 19:27:01" -"2","2","25","2013/08/29 19:28:01" -"2","2","25","2013/08/29 19:29:02" -"2","2","25","2013/08/29 19:30:01" -"2","2","25","2013/08/29 19:31:01" -"2","2","25","2013/08/29 19:32:01" -"2","2","25","2013/08/29 19:33:01" -"2","2","25","2013/08/29 19:34:01" -"2","2","25","2013/08/29 19:35:02" -"2","2","25","2013/08/29 19:36:01" -"2","2","25","2013/08/29 19:37:02" -"2","2","25","2013/08/29 19:38:01" -"2","2","25","2013/08/29 19:39:01" -"2","2","25","2013/08/29 19:40:01" -"2","2","25","2013/08/29 19:41:01" -"2","2","25","2013/08/29 19:42:01" -"2","3","24","2013/08/29 19:43:02" -"2","3","24","2013/08/29 19:44:01" -"2","3","24","2013/08/29 19:45:01" -"2","3","24","2013/08/29 19:46:02" -"2","3","24","2013/08/29 19:47:01" -"2","3","24","2013/08/29 19:48:01" -"2","3","24","2013/08/29 19:50:01" -"2","3","24","2013/08/29 19:51:01" -"2","3","24","2013/08/29 19:52:01" -"2","3","24","2013/08/29 19:53:01" -"2","3","24","2013/08/29 19:55:01" -"2","3","24","2013/08/29 19:56:02" -"2","3","24","2013/08/29 19:57:01" -"2","2","25","2013/08/29 19:58:01" -"2","2","25","2013/08/29 20:00:01" -"2","2","25","2013/08/29 20:02:01" -"2","2","25","2013/08/29 20:03:01" -"2","2","25","2013/08/29 20:04:01" -"2","2","25","2013/08/29 20:06:01" -"2","2","25","2013/08/29 20:07:01" -"2","2","25","2013/08/29 20:08:01" -"2","2","25","2013/08/29 20:10:01" -"2","2","25","2013/08/29 20:11:01" -"2","2","25","2013/08/29 20:12:03" -"2","2","25","2013/08/29 20:13:02" -"2","2","25","2013/08/29 20:15:01" -"2","2","25","2013/08/29 20:16:03" -"2","2","25","2013/08/29 20:17:02" -"2","2","25","2013/08/29 20:18:01" -"2","2","25","2013/08/29 20:19:01" -"2","2","25","2013/08/29 20:20:02" -"2","2","25","2013/08/29 20:21:03" -"2","2","25","2013/08/29 20:22:01" -"2","2","25","2013/08/29 20:23:01" -"2","2","25","2013/08/29 20:25:01" -"2","2","25","2013/08/29 20:26:01" -"2","2","25","2013/08/29 20:27:01" -"2","2","25","2013/08/29 20:28:01" -"2","2","25","2013/08/29 20:29:01" -"2","2","25","2013/08/29 20:30:01" -"2","2","25","2013/08/29 20:31:01" -"2","2","25","2013/08/29 20:32:01" -"2","2","25","2013/08/29 20:33:01" -"2","2","25","2013/08/29 20:35:02" -"2","2","25","2013/08/29 20:36:01" -"2","1","26","2013/08/29 20:38:01" -"2","1","26","2013/08/29 20:39:01" -"2","1","26","2013/08/29 20:40:02" -"2","1","26","2013/08/29 20:41:01" -"2","1","26","2013/08/29 20:42:01" -"2","1","26","2013/08/29 20:43:01" -"2","1","26","2013/08/29 20:44:01" -"2","1","26","2013/08/29 20:45:02" -"2","1","26","2013/08/29 20:46:01" -"2","1","26","2013/08/29 20:47:03" -"2","1","26","2013/08/29 20:48:01" -"2","1","26","2013/08/29 20:49:01" -"2","1","26","2013/08/29 20:50:01" -"2","1","26","2013/08/29 20:51:02" -"2","1","26","2013/08/29 20:52:02" -"2","1","26","2013/08/29 20:53:01" -"2","1","26","2013/08/29 20:55:01" -"2","1","26","2013/08/29 20:56:01" -"2","1","26","2013/08/29 20:57:01" -"2","1","26","2013/08/29 20:58:01" -"2","1","26","2013/08/29 20:59:01" -"2","1","26","2013/08/29 21:01:02" -"2","1","26","2013/08/29 21:02:02" -"2","1","26","2013/08/29 21:03:01" -"2","1","26","2013/08/29 21:04:01" -"2","1","26","2013/08/29 21:05:01" -"2","1","26","2013/08/29 21:07:01" -"2","1","26","2013/08/29 21:08:01" -"2","1","26","2013/08/29 21:09:01" -"2","1","26","2013/08/29 21:10:01" -"2","1","26","2013/08/29 21:11:01" -"2","1","26","2013/08/29 21:12:01" -"2","1","26","2013/08/29 21:13:01" -"2","1","26","2013/08/29 21:14:01" -"2","1","26","2013/08/29 21:15:01" -"2","1","26","2013/08/29 21:16:01" -"2","1","26","2013/08/29 21:17:01" -"2","1","26","2013/08/29 21:18:01" -"2","1","26","2013/08/29 21:19:01" -"2","1","26","2013/08/29 21:20:01" -"2","1","26","2013/08/29 21:22:01" -"2","1","26","2013/08/29 21:23:01" -"2","1","26","2013/08/29 21:24:01" -"2","1","26","2013/08/29 21:26:01" -"2","1","26","2013/08/29 21:27:03" -"2","1","26","2013/08/29 21:28:01" -"2","1","26","2013/08/29 21:29:01" -"2","1","26","2013/08/29 21:31:01" -"2","1","26","2013/08/29 21:32:01" -"2","1","26","2013/08/29 21:34:01" -"2","1","26","2013/08/29 21:36:01" -"2","1","26","2013/08/29 21:37:01" -"2","1","26","2013/08/29 21:38:02" -"2","1","26","2013/08/29 21:40:01" -"2","1","26","2013/08/29 21:41:01" -"2","1","26","2013/08/29 21:42:02" -"2","1","26","2013/08/29 21:43:01" -"2","1","26","2013/08/29 21:44:01" -"2","1","26","2013/08/29 21:45:02" -"2","1","26","2013/08/29 21:46:01" -"2","1","26","2013/08/29 21:47:02" -"2","1","26","2013/08/29 21:48:01" -"2","1","26","2013/08/29 21:50:01" -"2","1","26","2013/08/29 21:51:01" -"2","1","26","2013/08/29 21:52:04" -"2","1","26","2013/08/29 21:53:01" -"2","1","26","2013/08/29 21:54:01" -"2","1","26","2013/08/29 21:55:01" -"2","1","26","2013/08/29 21:56:01" -"2","1","26","2013/08/29 21:57:02" -"2","1","26","2013/08/29 21:58:01" -"2","1","26","2013/08/29 21:59:03" -"2","1","26","2013/08/29 22:00:01" -"2","1","26","2013/08/29 22:01:01" -"2","1","26","2013/08/29 22:02:03" -"2","1","26","2013/08/29 22:03:01" -"2","1","26","2013/08/29 22:04:01" -"2","1","26","2013/08/29 22:05:01" -"2","1","26","2013/08/29 22:06:01" -"2","1","26","2013/08/29 22:07:01" -"2","1","26","2013/08/29 22:08:01" -"2","1","26","2013/08/29 22:10:02" -"2","1","26","2013/08/29 22:11:03" -"2","1","26","2013/08/29 22:12:01" -"2","1","26","2013/08/29 22:13:01" -"2","1","26","2013/08/29 22:15:01" -"2","1","26","2013/08/29 22:16:01" -"2","1","26","2013/08/29 22:17:01" -"2","1","26","2013/08/29 22:18:01" -"2","2","25","2013/08/29 22:20:01" -"2","2","25","2013/08/29 22:21:01" -"2","2","25","2013/08/29 22:22:01" -"2","2","25","2013/08/29 22:24:02" -"2","2","25","2013/08/29 22:25:01" -"2","2","25","2013/08/29 22:26:03" -"2","2","25","2013/08/29 22:28:01" -"2","2","25","2013/08/29 22:29:01" -"2","2","25","2013/08/29 22:30:01" -"2","2","25","2013/08/29 22:31:03" -"2","2","25","2013/08/29 22:32:01" -"2","2","25","2013/08/29 22:34:01" -"2","2","25","2013/08/29 22:35:01" -"2","2","25","2013/08/29 22:36:02" -"2","2","25","2013/08/29 22:37:01" -"2","2","25","2013/08/29 22:38:01" -"2","2","25","2013/08/29 22:39:01" -"2","2","25","2013/08/29 22:40:02" -"2","2","25","2013/08/29 22:41:02" -"2","3","24","2013/08/29 22:42:03" -"2","3","24","2013/08/29 22:43:01" -"2","3","24","2013/08/29 22:44:01" -"2","3","24","2013/08/29 22:45:01" -"2","3","24","2013/08/29 22:46:01" -"2","3","24","2013/08/29 22:47:01" -"2","3","24","2013/08/29 22:48:01" -"2","3","24","2013/08/29 22:49:01" -"2","3","24","2013/08/29 22:50:01" -"2","3","24","2013/08/29 22:51:01" -"2","3","24","2013/08/29 22:52:01" -"2","3","24","2013/08/29 22:53:01" -"2","3","24","2013/08/29 22:54:01" -"2","3","24","2013/08/29 22:55:01" -"2","3","24","2013/08/29 22:56:01" -"2","3","24","2013/08/29 22:57:01" -"2","3","24","2013/08/29 22:58:01" -"2","3","24","2013/08/29 22:59:01" -"2","3","24","2013/08/29 23:00:01" -"2","3","24","2013/08/29 23:01:01" -"2","3","24","2013/08/29 23:02:01" -"2","3","24","2013/08/29 23:03:01" -"2","3","24","2013/08/29 23:04:02" -"2","3","24","2013/08/29 23:05:01" -"2","3","24","2013/08/29 23:06:01" -"2","3","24","2013/08/29 23:07:01" -"2","3","24","2013/08/29 23:08:01" -"2","3","24","2013/08/29 23:10:01" -"2","3","24","2013/08/29 23:11:03" -"2","3","24","2013/08/29 23:12:01" -"2","3","24","2013/08/29 23:13:01" -"2","3","24","2013/08/29 23:14:01" -"2","3","24","2013/08/29 23:15:01" -"2","3","24","2013/08/29 23:17:01" -"2","3","24","2013/08/29 23:18:02" -"2","3","24","2013/08/29 23:19:02" -"2","3","24","2013/08/29 23:20:02" -"2","3","24","2013/08/29 23:21:03" -"2","3","24","2013/08/29 23:23:01" -"2","3","24","2013/08/29 23:24:01" -"2","3","24","2013/08/29 23:25:01" -"2","3","24","2013/08/29 23:26:01" -"2","3","24","2013/08/29 23:27:01" -"2","3","24","2013/08/29 23:28:01" -"2","3","24","2013/08/29 23:29:01" -"2","3","24","2013/08/29 23:30:01" -"2","3","24","2013/08/29 23:31:01" -"2","3","24","2013/08/29 23:32:01" -"2","3","24","2013/08/29 23:33:01" -"2","3","24","2013/08/29 23:34:01" -"2","3","24","2013/08/29 23:35:01" -"2","3","24","2013/08/29 23:36:02" -"2","3","24","2013/08/29 23:37:01" -"2","3","24","2013/08/29 23:38:01" -"2","3","24","2013/08/29 23:39:01" -"2","3","24","2013/08/29 23:40:02" -"2","3","24","2013/08/29 23:41:01" -"2","3","24","2013/08/29 23:42:03" -"2","3","24","2013/08/29 23:43:01" -"2","3","24","2013/08/29 23:44:01" -"2","3","24","2013/08/29 23:45:01" -"2","3","24","2013/08/29 23:46:02" -"2","3","24","2013/08/29 23:47:01" -"2","3","24","2013/08/29 23:48:01" -"2","3","24","2013/08/29 23:49:01" -"2","3","24","2013/08/29 23:50:01" -"2","3","24","2013/08/29 23:51:01" -"2","3","24","2013/08/29 23:52:01" -"2","3","24","2013/08/29 23:53:01" -"2","3","24","2013/08/29 23:55:01" -"2","3","24","2013/08/29 23:56:02" -"2","3","24","2013/08/29 23:57:01" -"2","3","24","2013/08/29 23:58:01" -"2","3","24","2013/08/29 23:59:01" -"2","3","24","2013/08/30 00:01:01" -"2","3","24","2013/08/30 00:02:01" -"2","3","24","2013/08/30 00:03:02" -"2","3","24","2013/08/30 00:04:01" -"2","3","24","2013/08/30 00:06:01" -"2","3","24","2013/08/30 00:07:01" -"2","3","24","2013/08/30 00:08:01" -"2","3","24","2013/08/30 00:10:01" -"2","3","24","2013/08/30 00:11:01" -"2","3","24","2013/08/30 00:12:04" -"2","3","24","2013/08/30 00:13:01" -"2","3","24","2013/08/30 00:15:01" -"2","3","24","2013/08/30 00:16:01" -"2","3","24","2013/08/30 00:17:02" -"2","3","24","2013/08/30 00:18:01" -"2","3","24","2013/08/30 00:19:01" -"2","3","24","2013/08/30 00:20:02" -"2","3","24","2013/08/30 00:21:03" -"2","3","24","2013/08/30 00:22:02" -"2","3","24","2013/08/30 00:23:01" -"2","3","24","2013/08/30 00:24:01" -"2","3","24","2013/08/30 00:25:01" -"2","3","24","2013/08/30 00:26:01" -"2","3","24","2013/08/30 00:27:04" -"2","3","24","2013/08/30 00:28:01" -"2","3","24","2013/08/30 00:30:02" -"2","3","24","2013/08/30 00:31:02" -"2","3","24","2013/08/30 00:32:02" -"2","3","24","2013/08/30 00:33:01" -"2","3","24","2013/08/30 00:34:02" -"2","3","24","2013/08/30 00:35:01" -"2","3","24","2013/08/30 00:36:01" -"2","3","24","2013/08/30 00:37:03" -"2","3","24","2013/08/30 00:38:01" -"2","3","24","2013/08/30 00:39:01" -"2","3","24","2013/08/30 00:40:01" -"2","3","24","2013/08/30 00:41:01" -"2","3","24","2013/08/30 00:42:01" -"2","3","24","2013/08/30 00:43:01" -"2","3","24","2013/08/30 00:44:01" -"2","3","24","2013/08/30 00:45:01" -"2","3","24","2013/08/30 00:46:02" -"2","3","24","2013/08/30 00:47:01" -"2","3","24","2013/08/30 00:48:01" -"2","3","24","2013/08/30 00:50:01" -"2","3","24","2013/08/30 00:51:01" -"2","3","24","2013/08/30 00:52:03" -"2","3","24","2013/08/30 00:53:01" -"2","3","24","2013/08/30 00:54:01" -"2","3","24","2013/08/30 00:56:01" -"2","3","24","2013/08/30 00:57:01" -"2","3","24","2013/08/30 00:58:01" -"2","3","24","2013/08/30 01:00:01" -"2","3","24","2013/08/30 01:02:01" -"2","3","24","2013/08/30 01:04:01" -"2","3","24","2013/08/30 01:05:01" -"2","3","24","2013/08/30 01:06:01" -"2","3","24","2013/08/30 01:07:04" -"2","3","24","2013/08/30 01:09:01" -"2","3","24","2013/08/30 01:10:01" -"2","3","24","2013/08/30 01:12:01" -"2","3","24","2013/08/30 01:13:01" -"2","3","24","2013/08/30 01:14:01" -"2","3","24","2013/08/30 01:15:01" -"2","3","24","2013/08/30 01:16:01" -"2","3","24","2013/08/30 01:17:04" -"2","3","24","2013/08/30 01:18:01" -"2","3","24","2013/08/30 01:19:01" -"2","3","24","2013/08/30 01:21:01" -"2","3","24","2013/08/30 01:23:01" -"2","3","24","2013/08/30 01:24:01" -"2","3","24","2013/08/30 01:25:04" -"2","3","24","2013/08/30 01:26:02" -"2","3","24","2013/08/30 01:27:03" -"2","3","24","2013/08/30 01:28:01" -"2","3","24","2013/08/30 01:29:01" -"2","3","24","2013/08/30 01:30:01" -"2","3","24","2013/08/30 01:32:02" -"2","3","24","2013/08/30 01:33:01" -"2","3","24","2013/08/30 01:34:01" -"2","3","24","2013/08/30 01:35:02" -"2","3","24","2013/08/30 01:36:02" -"2","3","24","2013/08/30 01:37:01" -"2","3","24","2013/08/30 01:38:01" -"2","3","24","2013/08/30 01:40:01" -"2","3","24","2013/08/30 01:41:02" -"2","3","24","2013/08/30 01:43:01" -"2","3","24","2013/08/30 01:44:01" -"2","3","24","2013/08/30 01:46:01" -"2","3","24","2013/08/30 01:47:01" -"2","3","24","2013/08/30 01:48:01" -"2","3","24","2013/08/30 01:49:01" -"2","3","24","2013/08/30 01:50:02" -"2","3","24","2013/08/30 01:51:02" -"2","3","24","2013/08/30 01:52:02" -"2","3","24","2013/08/30 01:53:02" -"2","3","24","2013/08/30 01:54:01" -"2","3","24","2013/08/30 01:56:01" -"2","3","24","2013/08/30 01:57:01" -"2","3","24","2013/08/30 01:58:01" -"2","3","24","2013/08/30 01:59:01" -"2","3","24","2013/08/30 02:00:02" -"2","3","24","2013/08/30 02:01:01" -"2","3","24","2013/08/30 02:02:01" -"2","3","24","2013/08/30 02:03:01" -"2","3","24","2013/08/30 02:04:01" -"2","3","24","2013/08/30 02:05:01" -"2","3","24","2013/08/30 02:06:02" -"2","3","24","2013/08/30 02:07:02" -"2","3","24","2013/08/30 02:08:01" -"2","3","24","2013/08/30 02:09:02" -"2","3","24","2013/08/30 02:10:01" -"2","3","24","2013/08/30 02:11:02" -"2","3","24","2013/08/30 02:12:01" -"2","3","24","2013/08/30 02:13:01" -"2","3","24","2013/08/30 02:15:01" -"2","3","24","2013/08/30 02:16:01" -"2","3","24","2013/08/30 02:17:01" -"2","3","24","2013/08/30 02:18:01" -"2","3","24","2013/08/30 02:19:01" -"2","3","24","2013/08/30 02:20:01" -"2","3","24","2013/08/30 02:21:01" -"2","3","24","2013/08/30 02:22:02" -"2","3","24","2013/08/30 02:24:01" -"2","3","24","2013/08/30 02:25:01" -"2","3","24","2013/08/30 02:26:01" -"2","3","24","2013/08/30 02:27:01" -"2","3","24","2013/08/30 02:28:01" -"2","3","24","2013/08/30 02:29:01" -"2","3","24","2013/08/30 02:30:01" -"2","3","24","2013/08/30 02:31:02" -"2","3","24","2013/08/30 02:32:01" -"2","3","24","2013/08/30 02:33:01" -"2","3","24","2013/08/30 02:35:01" -"2","3","24","2013/08/30 02:36:01" -"2","3","24","2013/08/30 02:37:01" -"2","3","24","2013/08/30 02:39:01" -"2","3","24","2013/08/30 02:40:01" -"2","3","24","2013/08/30 02:41:01" -"2","3","24","2013/08/30 02:42:01" -"2","3","24","2013/08/30 02:43:01" -"2","3","24","2013/08/30 02:45:02" -"2","3","24","2013/08/30 02:46:01" -"2","3","24","2013/08/30 02:48:01" -"2","3","24","2013/08/30 02:49:01" -"2","3","24","2013/08/30 02:50:02" -"2","3","24","2013/08/30 02:51:01" -"2","3","24","2013/08/30 02:52:01" -"2","3","24","2013/08/30 02:53:01" -"2","3","24","2013/08/30 02:54:01" -"2","3","24","2013/08/30 02:55:01" -"2","3","24","2013/08/30 02:56:01" -"2","3","24","2013/08/30 02:57:01" -"2","3","24","2013/08/30 02:58:01" -"2","3","24","2013/08/30 02:59:01" -"2","3","24","2013/08/30 03:00:02" -"2","3","24","2013/08/30 03:01:01" -"2","3","24","2013/08/30 03:02:01" -"2","3","24","2013/08/30 03:03:01" -"2","3","24","2013/08/30 03:04:02" -"2","3","24","2013/08/30 03:05:01" -"2","3","24","2013/08/30 03:06:01" -"2","3","24","2013/08/30 03:07:02" -"2","3","24","2013/08/30 03:08:01" -"2","3","24","2013/08/30 03:10:01" -"2","3","24","2013/08/30 03:11:01" -"2","3","24","2013/08/30 03:12:01" -"2","3","24","2013/08/30 03:13:01" -"2","3","24","2013/08/30 03:15:01" -"2","3","24","2013/08/30 03:16:01" -"2","3","24","2013/08/30 03:17:01" -"2","3","24","2013/08/30 03:18:01" -"2","3","24","2013/08/30 03:19:01" -"2","3","24","2013/08/30 03:20:01" -"2","3","24","2013/08/30 03:21:01" -"2","3","24","2013/08/30 03:22:01" -"2","3","24","2013/08/30 03:23:01" -"2","3","24","2013/08/30 03:25:01" -"2","3","24","2013/08/30 03:26:01" -"2","3","24","2013/08/30 03:28:01" -"2","3","24","2013/08/30 03:29:01" -"2","3","24","2013/08/30 03:30:01" -"2","3","24","2013/08/30 03:31:01" -"2","3","24","2013/08/30 03:32:03" -"2","3","24","2013/08/30 03:33:01" -"2","3","24","2013/08/30 03:34:01" -"2","3","24","2013/08/30 03:35:01" -"2","3","24","2013/08/30 03:36:01" -"2","3","24","2013/08/30 03:37:01" -"2","3","24","2013/08/30 03:38:02" -"2","3","24","2013/08/30 03:40:01" -"2","3","24","2013/08/30 03:41:01" -"2","3","24","2013/08/30 03:42:01" -"2","3","24","2013/08/30 03:43:01" -"2","3","24","2013/08/30 03:45:01" -"2","3","24","2013/08/30 03:46:02" -"2","3","24","2013/08/30 03:47:02" -"2","3","24","2013/08/30 03:48:01" -"2","3","24","2013/08/30 03:49:01" -"2","3","24","2013/08/30 03:50:02" -"2","3","24","2013/08/30 03:51:01" -"2","3","24","2013/08/30 03:52:01" -"2","3","24","2013/08/30 03:53:01" -"2","3","24","2013/08/30 03:54:01" -"2","3","24","2013/08/30 03:55:01" -"2","3","24","2013/08/30 03:56:03" -"2","3","24","2013/08/30 03:57:01" -"2","3","24","2013/08/30 03:58:01" -"2","3","24","2013/08/30 03:59:01" -"2","3","24","2013/08/30 04:00:01" -"2","3","24","2013/08/30 04:01:01" -"2","3","24","2013/08/30 04:02:01" -"2","3","24","2013/08/30 04:03:01" -"2","3","24","2013/08/30 04:05:01" -"2","3","24","2013/08/30 04:06:01" -"2","3","24","2013/08/30 04:07:01" -"2","3","24","2013/08/30 04:08:01" -"2","3","24","2013/08/30 04:10:01" -"2","3","24","2013/08/30 04:11:01" -"2","3","24","2013/08/30 04:12:01" -"2","3","24","2013/08/30 04:13:01" -"2","3","24","2013/08/30 04:14:01" -"2","3","24","2013/08/30 04:15:01" -"2","3","24","2013/08/30 04:16:02" -"2","3","24","2013/08/30 04:17:01" -"2","3","24","2013/08/30 04:19:01" -"2","3","24","2013/08/30 04:20:01" -"2","3","24","2013/08/30 04:21:01" -"2","3","24","2013/08/30 04:22:02" -"2","3","24","2013/08/30 04:24:01" -"2","3","24","2013/08/30 04:25:01" -"2","3","24","2013/08/30 04:26:01" -"2","3","24","2013/08/30 04:27:02" -"2","3","24","2013/08/30 04:28:01" -"2","3","24","2013/08/30 04:29:01" -"2","3","24","2013/08/30 04:30:01" -"2","3","24","2013/08/30 04:31:01" -"2","3","24","2013/08/30 04:32:01" -"2","3","24","2013/08/30 04:33:01" -"2","3","24","2013/08/30 04:34:01" -"2","3","24","2013/08/30 04:35:02" -"2","3","24","2013/08/30 04:36:01" -"2","3","24","2013/08/30 04:37:03" -"2","3","24","2013/08/30 04:38:01" -"2","3","24","2013/08/30 04:39:01" -"2","3","24","2013/08/30 04:40:01" -"2","3","24","2013/08/30 04:41:02" -"2","3","24","2013/08/30 04:42:01" -"2","3","24","2013/08/30 04:43:01" -"2","3","24","2013/08/30 04:44:01" -"2","3","24","2013/08/30 04:45:01" -"2","3","24","2013/08/30 04:46:01" -"2","3","24","2013/08/30 04:47:03" -"2","3","24","2013/08/30 04:48:01" -"2","3","24","2013/08/30 04:50:01" -"2","3","24","2013/08/30 04:51:01" -"2","3","24","2013/08/30 04:52:01" -"2","3","24","2013/08/30 04:53:02" -"2","3","24","2013/08/30 04:55:01" -"2","3","24","2013/08/30 04:56:03" -"2","3","24","2013/08/30 04:57:01" -"2","3","24","2013/08/30 04:58:01" -"2","3","24","2013/08/30 05:00:01" -"2","3","24","2013/08/30 05:01:01" -"2","3","24","2013/08/30 05:02:02" -"2","3","24","2013/08/30 05:03:01" -"2","3","24","2013/08/30 05:05:01" -"2","3","24","2013/08/30 05:07:01" -"2","3","24","2013/08/30 05:08:01" -"2","3","24","2013/08/30 05:09:01" -"2","3","24","2013/08/30 05:10:02" -"2","3","24","2013/08/30 05:11:01" -"2","3","24","2013/08/30 05:12:03" -"2","3","24","2013/08/30 05:13:01" -"2","3","24","2013/08/30 05:15:01" -"2","3","24","2013/08/30 05:16:02" -"2","3","24","2013/08/30 05:18:02" -"2","3","24","2013/08/30 05:19:01" -"2","3","24","2013/08/30 05:20:01" -"2","3","24","2013/08/30 05:21:01" -"2","3","24","2013/08/30 05:22:02" -"2","3","24","2013/08/30 05:23:01" -"2","2","25","2013/08/30 05:24:01" -"2","2","25","2013/08/30 05:26:01" -"2","2","25","2013/08/30 05:27:01" -"2","2","25","2013/08/30 05:28:01" -"2","3","24","2013/08/30 05:29:01" -"2","3","24","2013/08/30 05:31:01" -"2","3","24","2013/08/30 05:32:03" -"2","3","24","2013/08/30 05:33:01" -"2","3","24","2013/08/30 05:34:01" -"2","3","24","2013/08/30 05:35:02" -"2","3","24","2013/08/30 05:36:01" -"2","3","24","2013/08/30 05:37:01" -"2","3","24","2013/08/30 05:38:01" -"2","3","24","2013/08/30 05:40:01" -"2","3","24","2013/08/30 05:42:01" -"2","3","24","2013/08/30 05:43:01" -"2","3","24","2013/08/30 05:44:01" -"2","3","24","2013/08/30 05:45:02" -"2","3","24","2013/08/30 05:46:02" -"2","3","24","2013/08/30 05:47:01" -"2","3","24","2013/08/30 05:48:01" -"2","3","24","2013/08/30 05:49:01" -"2","3","24","2013/08/30 05:50:02" -"2","3","24","2013/08/30 05:51:02" -"2","3","24","2013/08/30 05:52:01" -"2","3","24","2013/08/30 05:53:01" -"2","3","24","2013/08/30 05:54:01" -"2","3","24","2013/08/30 05:55:01" -"2","3","24","2013/08/30 05:57:01" -"2","3","24","2013/08/30 05:58:01" -"2","3","24","2013/08/30 05:59:01" -"2","3","24","2013/08/30 06:00:02" -"2","3","24","2013/08/30 06:01:02" -"2","3","24","2013/08/30 06:02:01" -"2","3","24","2013/08/30 06:04:01" -"2","3","24","2013/08/30 06:05:01" -"2","3","24","2013/08/30 06:06:01" -"2","3","24","2013/08/30 06:07:01" -"2","3","24","2013/08/30 06:09:01" -"2","3","24","2013/08/30 06:10:01" -"2","3","24","2013/08/30 06:11:01" -"2","3","24","2013/08/30 06:12:01" -"2","3","24","2013/08/30 06:13:01" -"2","3","24","2013/08/30 06:14:01" -"2","3","24","2013/08/30 06:15:01" -"2","3","24","2013/08/30 06:16:01" -"2","3","24","2013/08/30 06:17:01" -"2","3","24","2013/08/30 06:18:02" -"2","3","24","2013/08/30 06:19:01" -"2","3","24","2013/08/30 06:20:01" -"2","3","24","2013/08/30 06:22:01" -"2","3","24","2013/08/30 06:24:01" -"2","3","24","2013/08/30 06:26:01" -"2","3","24","2013/08/30 06:27:03" -"2","3","24","2013/08/30 06:28:01" -"2","3","24","2013/08/30 06:29:01" -"2","3","24","2013/08/30 06:30:02" -"2","3","24","2013/08/30 06:31:01" -"2","3","24","2013/08/30 06:32:02" -"2","3","24","2013/08/30 06:34:01" -"2","3","24","2013/08/30 06:35:02" -"2","3","24","2013/08/30 06:36:02" -"2","3","24","2013/08/30 06:37:02" -"2","3","24","2013/08/30 06:38:01" -"2","3","24","2013/08/30 06:40:01" -"2","3","24","2013/08/30 06:41:01" -"2","3","24","2013/08/30 06:42:03" -"2","3","24","2013/08/30 06:43:01" -"2","3","24","2013/08/30 06:44:01" -"2","3","24","2013/08/30 06:45:01" -"2","3","24","2013/08/30 06:46:01" -"2","3","24","2013/08/30 06:47:01" -"2","3","24","2013/08/30 06:48:01" -"2","3","24","2013/08/30 06:50:01" -"2","3","24","2013/08/30 06:51:01" -"2","3","24","2013/08/30 06:52:01" -"2","3","24","2013/08/30 06:54:01" -"2","3","24","2013/08/30 06:55:01" -"2","3","24","2013/08/30 06:56:01" -"2","3","24","2013/08/30 06:57:03" -"2","3","24","2013/08/30 06:58:01" -"2","3","24","2013/08/30 06:59:01" -"2","3","24","2013/08/30 07:00:02" -"2","3","24","2013/08/30 07:01:01" -"2","3","24","2013/08/30 07:02:03" -"2","3","24","2013/08/30 07:03:02" -"2","3","24","2013/08/30 07:05:01" -"2","3","24","2013/08/30 07:06:01" -"2","3","24","2013/08/30 07:07:01" -"2","3","24","2013/08/30 07:08:01" -"2","3","24","2013/08/30 07:09:01" -"2","3","24","2013/08/30 07:10:01" -"2","3","24","2013/08/30 07:11:02" -"2","3","24","2013/08/30 07:12:01" -"2","3","24","2013/08/30 07:13:02" -"2","3","24","2013/08/30 07:14:01" -"2","3","24","2013/08/30 07:15:01" -"2","3","24","2013/08/30 07:16:02" -"2","3","24","2013/08/30 07:17:01" -"2","3","24","2013/08/30 07:18:01" -"2","3","24","2013/08/30 07:19:01" -"2","3","24","2013/08/30 07:20:02" -"2","3","24","2013/08/30 07:21:02" -"2","3","24","2013/08/30 07:22:03" -"2","3","24","2013/08/30 07:23:01" -"2","3","24","2013/08/30 07:24:01" -"2","3","24","2013/08/30 07:25:01" -"2","3","24","2013/08/30 07:26:01" -"2","3","24","2013/08/30 07:27:01" -"2","3","24","2013/08/30 07:28:02" -"2","3","24","2013/08/30 07:29:01" -"2","3","24","2013/08/30 07:30:01" -"2","3","24","2013/08/30 07:31:03" -"2","3","24","2013/08/30 07:32:01" -"2","3","24","2013/08/30 07:33:01" -"2","3","24","2013/08/30 07:34:01" -"2","3","24","2013/08/30 07:35:01" -"2","3","24","2013/08/30 07:36:01" -"2","3","24","2013/08/30 07:37:01" -"2","3","24","2013/08/30 07:38:02" -"2","3","24","2013/08/30 07:39:02" -"2","3","24","2013/08/30 07:40:01" -"2","3","24","2013/08/30 07:41:01" -"2","3","24","2013/08/30 07:42:01" -"2","3","24","2013/08/30 07:43:02" -"2","3","24","2013/08/30 07:44:01" -"2","3","24","2013/08/30 07:45:01" -"2","3","24","2013/08/30 07:46:02" -"2","3","24","2013/08/30 07:47:01" -"2","3","24","2013/08/30 07:48:01" -"2","3","24","2013/08/30 07:49:01" -"2","3","24","2013/08/30 07:50:01" -"2","3","24","2013/08/30 07:52:01" -"2","3","24","2013/08/30 07:54:01" -"2","3","24","2013/08/30 07:55:01" -"2","3","24","2013/08/30 07:56:01" -"2","3","24","2013/08/30 07:57:01" -"2","3","24","2013/08/30 07:58:01" -"2","3","24","2013/08/30 07:59:01" -"2","3","24","2013/08/30 08:00:01" -"2","3","24","2013/08/30 08:01:01" -"2","3","24","2013/08/30 08:02:03" -"2","3","24","2013/08/30 08:03:02" -"2","3","24","2013/08/30 08:04:01" -"2","3","24","2013/08/30 08:05:01" -"2","3","24","2013/08/30 08:06:01" -"2","3","24","2013/08/30 08:07:01" -"2","3","24","2013/08/30 08:08:01" -"2","3","24","2013/08/30 08:10:01" -"2","3","24","2013/08/30 08:11:02" -"2","3","24","2013/08/30 08:12:01" -"2","3","24","2013/08/30 08:13:01" -"2","3","24","2013/08/30 08:14:01" -"2","3","24","2013/08/30 08:16:01" -"2","3","24","2013/08/30 08:17:03" -"2","3","24","2013/08/30 08:18:02" -"2","3","24","2013/08/30 08:19:02" -"2","3","24","2013/08/30 08:20:01" -"2","3","24","2013/08/30 08:21:01" -"2","3","24","2013/08/30 08:22:03" -"2","3","24","2013/08/30 08:23:01" -"2","3","24","2013/08/30 08:24:01" -"2","3","24","2013/08/30 08:25:01" -"2","3","24","2013/08/30 08:27:01" -"2","3","24","2013/08/30 08:28:01" -"2","2","25","2013/08/30 08:29:01" -"2","2","25","2013/08/30 08:30:01" -"2","2","25","2013/08/30 08:31:02" -"2","2","25","2013/08/30 08:32:01" -"2","2","25","2013/08/30 08:33:01" -"2","2","25","2013/08/30 08:34:01" -"2","2","25","2013/08/30 08:35:01" -"2","2","25","2013/08/30 08:37:01" -"2","2","25","2013/08/30 08:38:01" -"2","2","25","2013/08/30 08:39:02" -"2","2","25","2013/08/30 08:40:01" -"2","2","25","2013/08/30 08:41:02" -"2","1","26","2013/08/30 08:42:01" -"2","1","26","2013/08/30 08:43:01" -"2","1","26","2013/08/30 08:44:02" -"2","1","26","2013/08/30 08:45:01" -"2","1","26","2013/08/30 08:46:01" -"2","1","26","2013/08/30 08:47:01" -"2","1","26","2013/08/30 08:48:01" -"2","1","26","2013/08/30 08:49:01" -"2","1","26","2013/08/30 08:51:01" -"2","1","26","2013/08/30 08:52:03" -"2","1","26","2013/08/30 08:53:01" -"2","1","26","2013/08/30 08:54:02" -"2","1","26","2013/08/30 08:56:01" -"2","1","26","2013/08/30 08:57:01" -"2","1","26","2013/08/30 08:58:01" -"2","1","26","2013/08/30 09:00:01" -"2","1","26","2013/08/30 09:01:01" -"2","1","26","2013/08/30 09:02:03" -"2","1","26","2013/08/30 09:03:01" -"2","1","26","2013/08/30 09:04:01" -"2","1","26","2013/08/30 09:05:02" -"2","1","26","2013/08/30 09:07:01" -"2","1","26","2013/08/30 09:08:01" -"2","1","26","2013/08/30 09:09:01" -"2","1","26","2013/08/30 09:10:01" -"2","1","26","2013/08/30 09:11:02" -"2","1","26","2013/08/30 09:12:01" -"2","1","26","2013/08/30 09:13:01" -"2","1","26","2013/08/30 09:15:01" -"2","1","26","2013/08/30 09:16:01" -"2","1","26","2013/08/30 09:17:01" -"2","1","26","2013/08/30 09:18:02" -"2","1","26","2013/08/30 09:20:01" -"2","1","26","2013/08/30 09:21:02" -"2","1","26","2013/08/30 09:22:01" -"2","1","26","2013/08/30 09:23:02" -"2","1","26","2013/08/30 09:24:02" -"2","1","26","2013/08/30 09:25:01" -"2","1","26","2013/08/30 09:26:02" -"2","1","26","2013/08/30 09:28:01" -"2","1","26","2013/08/30 09:29:01" -"2","1","26","2013/08/30 09:30:01" -"2","1","26","2013/08/30 09:31:01" -"2","1","26","2013/08/30 09:32:01" -"2","1","26","2013/08/30 09:33:01" -"2","1","26","2013/08/30 09:34:01" -"2","1","26","2013/08/30 09:35:01" -"2","1","26","2013/08/30 09:36:01" -"2","1","26","2013/08/30 09:37:02" -"2","1","26","2013/08/30 09:38:01" -"2","1","26","2013/08/30 09:40:01" -"2","1","26","2013/08/30 09:42:01" -"2","1","26","2013/08/30 09:43:01" -"2","1","26","2013/08/30 09:44:01" -"2","1","26","2013/08/30 09:45:01" -"2","1","26","2013/08/30 09:46:02" -"2","1","26","2013/08/30 09:47:01" -"2","1","26","2013/08/30 09:49:01" -"2","1","26","2013/08/30 09:50:01" -"2","1","26","2013/08/30 09:51:02" -"2","1","26","2013/08/30 09:52:01" -"2","1","26","2013/08/30 09:53:01" -"2","1","26","2013/08/30 09:55:01" -"2","1","26","2013/08/30 09:56:03" -"2","1","26","2013/08/30 09:57:01" -"2","1","26","2013/08/30 09:58:01" -"2","1","26","2013/08/30 10:00:01" -"2","1","26","2013/08/30 10:01:01" -"2","1","26","2013/08/30 10:02:01" -"2","1","26","2013/08/30 10:03:01" -"2","1","26","2013/08/30 10:04:02" -"2","1","26","2013/08/30 10:05:01" -"2","1","26","2013/08/30 10:06:01" -"2","1","26","2013/08/30 10:07:01" -"2","1","26","2013/08/30 10:08:01" -"2","1","26","2013/08/30 10:09:01" -"2","1","26","2013/08/30 10:10:01" -"2","1","26","2013/08/30 10:11:01" -"2","1","26","2013/08/30 10:12:02" -"2","1","26","2013/08/30 10:13:01" -"2","1","26","2013/08/30 10:14:01" -"2","1","26","2013/08/30 10:15:01" -"2","1","26","2013/08/30 10:16:01" -"2","1","26","2013/08/30 10:17:02" -"2","1","26","2013/08/30 10:18:01" -"2","1","26","2013/08/30 10:19:02" -"2","1","26","2013/08/30 10:20:01" -"2","1","26","2013/08/30 10:21:03" -"2","1","26","2013/08/30 10:22:01" -"2","1","26","2013/08/30 10:23:01" -"2","1","26","2013/08/30 10:24:01" -"2","1","26","2013/08/30 10:25:01" -"2","1","26","2013/08/30 10:26:02" -"2","1","26","2013/08/30 10:27:01" -"2","1","26","2013/08/30 10:28:02" -"2","1","26","2013/08/30 10:29:01" -"2","1","26","2013/08/30 10:30:01" -"2","1","26","2013/08/30 10:31:01" -"2","1","26","2013/08/30 10:32:01" -"2","1","26","2013/08/30 10:33:01" -"2","1","26","2013/08/30 10:34:01" -"2","1","26","2013/08/30 10:35:01" -"2","1","26","2013/08/30 10:36:02" -"2","1","26","2013/08/30 10:37:01" -"2","1","26","2013/08/30 10:38:01" -"2","1","26","2013/08/30 10:39:01" -"2","1","26","2013/08/30 10:40:01" -"2","1","26","2013/08/30 10:41:01" -"2","1","26","2013/08/30 10:42:01" -"2","1","26","2013/08/30 10:43:01" -"2","1","26","2013/08/30 10:45:01" -"2","1","26","2013/08/30 10:46:01" -"2","1","26","2013/08/30 10:47:02" -"2","1","26","2013/08/30 10:48:01" -"2","1","26","2013/08/30 10:49:01" -"2","1","26","2013/08/30 10:50:01" -"2","1","26","2013/08/30 10:51:02" -"2","1","26","2013/08/30 10:53:01" -"2","1","26","2013/08/30 10:54:01" -"2","1","26","2013/08/30 10:55:01" -"2","1","26","2013/08/30 10:56:02" -"2","1","26","2013/08/30 10:57:01" -"2","1","26","2013/08/30 10:58:03" -"2","1","26","2013/08/30 11:00:01" -"2","1","26","2013/08/30 11:01:03" -"2","1","26","2013/08/30 11:02:01" -"2","1","26","2013/08/30 11:03:01" -"2","1","26","2013/08/30 11:04:01" -"2","1","26","2013/08/30 11:05:01" -"2","1","26","2013/08/30 11:06:01" -"2","2","25","2013/08/30 11:07:01" -"2","2","25","2013/08/30 11:08:01" -"2","2","25","2013/08/30 11:09:02" -"2","2","25","2013/08/30 11:10:01" -"2","2","25","2013/08/30 11:11:01" -"2","2","25","2013/08/30 11:12:01" -"2","2","25","2013/08/30 11:13:02" -"2","2","25","2013/08/30 11:14:01" -"2","2","25","2013/08/30 11:15:01" -"2","2","25","2013/08/30 11:16:01" -"2","2","25","2013/08/30 11:18:01" -"2","2","25","2013/08/30 11:19:01" -"2","2","25","2013/08/30 11:20:03" -"2","2","25","2013/08/30 11:21:01" -"2","2","25","2013/08/30 11:22:03" -"2","2","25","2013/08/30 11:23:01" -"2","2","25","2013/08/30 11:24:01" -"2","2","25","2013/08/30 11:25:02" -"2","2","25","2013/08/30 11:26:01" -"2","2","25","2013/08/30 11:27:01" -"2","2","25","2013/08/30 11:28:01" -"2","2","25","2013/08/30 11:29:01" -"2","2","25","2013/08/30 11:30:01" -"2","2","25","2013/08/30 11:31:01" -"2","2","25","2013/08/30 11:32:01" -"2","2","25","2013/08/30 11:33:01" -"2","2","25","2013/08/30 11:34:01" -"2","2","25","2013/08/30 11:35:01" -"2","2","25","2013/08/30 11:36:03" -"2","2","25","2013/08/30 11:37:01" -"2","2","25","2013/08/30 11:38:01" -"2","2","25","2013/08/30 11:39:01" -"2","2","25","2013/08/30 11:40:01" -"2","2","25","2013/08/30 11:41:01" -"2","2","25","2013/08/30 11:42:02" -"2","2","25","2013/08/30 11:43:02" -"2","2","25","2013/08/30 11:44:01" -"2","2","25","2013/08/30 11:45:01" -"2","2","25","2013/08/30 11:47:01" -"2","2","25","2013/08/30 11:48:01" -"2","2","25","2013/08/30 11:49:01" -"2","2","25","2013/08/30 11:50:01" -"2","2","25","2013/08/30 11:51:01" -"2","2","25","2013/08/30 11:52:01" -"2","2","25","2013/08/30 11:53:01" -"2","2","25","2013/08/30 11:55:01" -"2","2","25","2013/08/30 11:58:01" -"2","2","25","2013/08/30 12:00:01" -"2","2","25","2013/08/30 12:01:01" -"2","2","25","2013/08/30 12:02:04" -"2","2","25","2013/08/30 12:03:01" -"2","2","25","2013/08/30 12:04:01" -"2","2","25","2013/08/30 12:05:01" -"2","2","25","2013/08/30 12:06:03" -"2","2","25","2013/08/30 12:07:02" -"2","2","25","2013/08/30 12:09:01" -"2","2","25","2013/08/30 12:10:01" -"2","2","25","2013/08/30 12:11:04" -"2","2","25","2013/08/30 12:12:01" -"2","2","25","2013/08/30 12:13:01" -"2","2","25","2013/08/30 12:15:01" -"2","2","25","2013/08/30 12:16:03" -"2","2","25","2013/08/30 12:17:01" -"2","2","25","2013/08/30 12:18:02" -"2","2","25","2013/08/30 12:20:01" -"2","2","25","2013/08/30 12:21:01" -"2","2","25","2013/08/30 12:22:01" -"2","2","25","2013/08/30 12:23:01" -"2","2","25","2013/08/30 12:24:03" -"2","2","25","2013/08/30 12:25:01" -"2","2","25","2013/08/30 12:26:01" -"2","2","25","2013/08/30 12:27:01" -"2","2","25","2013/08/30 12:29:01" -"2","2","25","2013/08/30 12:30:01" -"2","2","25","2013/08/30 12:32:01" -"2","2","25","2013/08/30 12:33:01" -"2","2","25","2013/08/30 12:34:01" -"2","2","25","2013/08/30 12:35:02" -"2","2","25","2013/08/30 12:36:01" -"2","2","25","2013/08/30 12:37:03" -"2","2","25","2013/08/30 12:38:01" -"2","2","25","2013/08/30 12:40:01" -"2","2","25","2013/08/30 12:41:01" -"2","2","25","2013/08/30 12:42:01" -"2","2","25","2013/08/30 12:43:01" -"2","2","25","2013/08/30 12:44:01" -"2","2","25","2013/08/30 12:45:01" -"2","2","25","2013/08/30 12:46:01" -"2","2","25","2013/08/30 12:47:01" -"2","2","25","2013/08/30 12:48:04" -"2","2","25","2013/08/30 12:49:01" -"2","2","25","2013/08/30 12:50:01" -"2","2","25","2013/08/30 12:51:01" -"2","2","25","2013/08/30 12:52:01" -"2","2","25","2013/08/30 12:53:01" -"2","2","25","2013/08/30 12:54:01" -"2","2","25","2013/08/30 12:55:01" -"2","2","25","2013/08/30 12:56:02" -"2","2","25","2013/08/30 12:57:01" -"2","2","25","2013/08/30 12:58:01" -"2","2","25","2013/08/30 12:59:01" -"2","2","25","2013/08/30 13:00:01" -"2","2","25","2013/08/30 13:01:01" -"2","2","25","2013/08/30 13:02:01" -"2","2","25","2013/08/30 13:03:02" -"2","2","25","2013/08/30 13:04:01" -"2","2","25","2013/08/30 13:05:01" -"2","2","25","2013/08/30 13:06:01" -"2","2","25","2013/08/30 13:08:01" -"2","2","25","2013/08/30 13:09:01" -"2","2","25","2013/08/30 13:10:02" -"2","2","25","2013/08/30 13:11:02" -"2","2","25","2013/08/30 13:13:01" -"2","2","25","2013/08/30 13:14:01" -"2","2","25","2013/08/30 13:15:01" -"2","2","25","2013/08/30 13:16:02" -"2","2","25","2013/08/30 13:17:02" -"2","2","25","2013/08/30 13:18:02" -"2","2","25","2013/08/30 13:19:01" -"2","2","25","2013/08/30 13:20:01" -"2","2","25","2013/08/30 13:21:02" -"2","2","25","2013/08/30 13:22:03" -"2","2","25","2013/08/30 13:23:01" -"2","2","25","2013/08/30 13:24:01" -"2","2","25","2013/08/30 13:25:02" -"2","2","25","2013/08/30 13:26:03" -"2","2","25","2013/08/30 13:27:01" -"2","2","25","2013/08/30 13:28:01" -"2","2","25","2013/08/30 13:29:01" -"2","2","25","2013/08/30 13:30:01" -"2","2","25","2013/08/30 13:31:02" -"2","2","25","2013/08/30 13:32:02" -"2","2","25","2013/08/30 13:33:01" -"2","2","25","2013/08/30 13:34:01" -"2","2","25","2013/08/30 13:35:02" -"2","3","24","2013/08/30 13:36:02" -"2","3","24","2013/08/30 13:37:01" -"2","3","24","2013/08/30 13:38:02" -"2","3","24","2013/08/30 13:39:01" -"2","3","24","2013/08/30 13:40:01" -"2","3","24","2013/08/30 13:41:02" -"2","3","24","2013/08/30 13:42:01" -"2","3","24","2013/08/30 13:43:01" -"2","3","24","2013/08/30 13:44:04" -"2","3","24","2013/08/30 13:45:02" -"2","3","24","2013/08/30 13:46:01" -"2","3","24","2013/08/30 13:47:01" -"2","3","24","2013/08/30 13:48:01" -"2","3","24","2013/08/30 13:49:01" -"2","3","24","2013/08/30 13:50:02" -"2","3","24","2013/08/30 13:51:01" -"2","3","24","2013/08/30 13:52:02" -"2","3","24","2013/08/30 13:53:01" -"2","3","24","2013/08/30 13:54:01" -"2","3","24","2013/08/30 13:55:01" -"2","3","24","2013/08/30 13:56:02" -"2","3","24","2013/08/30 13:57:01" -"2","3","24","2013/08/30 13:58:01" -"2","3","24","2013/08/30 13:59:01" -"2","3","24","2013/08/30 14:00:01" -"2","3","24","2013/08/30 14:01:02" -"2","3","24","2013/08/30 14:02:02" -"2","3","24","2013/08/30 14:03:01" -"2","3","24","2013/08/30 14:04:01" -"2","3","24","2013/08/30 14:05:01" -"2","3","24","2013/08/30 14:06:02" -"2","3","24","2013/08/30 14:07:01" -"2","3","24","2013/08/30 14:08:01" -"2","3","24","2013/08/30 14:10:01" -"2","3","24","2013/08/30 14:11:01" -"2","3","24","2013/08/30 14:12:01" -"2","3","24","2013/08/30 14:13:01" -"2","3","24","2013/08/30 14:14:01" -"2","3","24","2013/08/30 14:15:01" -"2","3","24","2013/08/30 14:16:01" -"2","3","24","2013/08/30 14:17:01" -"2","3","24","2013/08/30 14:18:01" -"2","3","24","2013/08/30 14:20:02" -"2","3","24","2013/08/30 14:21:01" -"2","3","24","2013/08/30 14:22:01" -"2","3","24","2013/08/30 14:23:02" -"2","3","24","2013/08/30 14:24:02" -"2","3","24","2013/08/30 14:25:02" -"2","3","24","2013/08/30 14:26:01" -"2","3","24","2013/08/30 14:27:01" -"2","3","24","2013/08/30 14:28:01" -"2","3","24","2013/08/30 14:29:01" -"2","3","24","2013/08/30 14:30:01" -"2","3","24","2013/08/30 14:31:01" -"2","3","24","2013/08/30 14:32:01" -"2","3","24","2013/08/30 14:33:01" -"2","3","24","2013/08/30 14:34:01" -"2","3","24","2013/08/30 14:35:01" -"2","3","24","2013/08/30 14:36:02" -"2","3","24","2013/08/30 14:37:01" -"2","3","24","2013/08/30 14:38:01" -"2","3","24","2013/08/30 14:40:02" -"2","3","24","2013/08/30 14:41:01" -"2","3","24","2013/08/30 14:42:01" -"2","3","24","2013/08/30 14:43:01" -"2","3","24","2013/08/30 14:44:02" -"2","3","24","2013/08/30 14:45:01" -"2","3","24","2013/08/30 14:46:01" -"2","3","24","2013/08/30 14:47:01" -"2","3","24","2013/08/30 14:48:02" -"2","3","24","2013/08/30 14:49:01" -"2","3","24","2013/08/30 14:50:01" -"2","3","24","2013/08/30 14:51:01" -"2","3","24","2013/08/30 14:52:01" -"2","3","24","2013/08/30 14:53:01" -"2","3","24","2013/08/30 14:54:01" -"2","3","24","2013/08/30 14:55:01" -"2","3","24","2013/08/30 14:56:01" -"2","3","24","2013/08/30 14:57:01" -"2","3","24","2013/08/30 14:58:01" -"2","3","24","2013/08/30 14:59:01" -"2","3","24","2013/08/30 15:00:02" -"2","3","24","2013/08/30 15:01:02" -"2","3","24","2013/08/30 15:02:03" -"2","3","24","2013/08/30 15:03:01" -"2","3","24","2013/08/30 15:05:01" -"2","3","24","2013/08/30 15:06:01" -"2","3","24","2013/08/30 15:07:01" -"2","3","24","2013/08/30 15:09:01" -"2","3","24","2013/08/30 15:10:01" -"2","3","24","2013/08/30 15:11:01" -"2","3","24","2013/08/30 15:13:01" -"2","3","24","2013/08/30 15:15:01" -"2","3","24","2013/08/30 15:16:01" -"2","3","24","2013/08/30 15:17:01" -"2","3","24","2013/08/30 15:18:01" -"2","3","24","2013/08/30 15:19:01" -"2","3","24","2013/08/30 15:20:01" -"2","3","24","2013/08/30 15:21:01" -"2","3","24","2013/08/30 15:22:03" -"2","3","24","2013/08/30 15:23:01" -"2","3","24","2013/08/30 15:25:01" -"2","3","24","2013/08/30 15:27:01" -"2","3","24","2013/08/30 15:28:01" -"2","3","24","2013/08/30 15:29:01" -"2","3","24","2013/08/30 15:30:01" -"2","3","24","2013/08/30 15:31:01" -"2","3","24","2013/08/30 15:32:01" -"2","3","24","2013/08/30 15:33:01" -"2","3","24","2013/08/30 15:34:01" -"2","3","24","2013/08/30 15:35:01" -"2","3","24","2013/08/30 15:36:01" -"2","3","24","2013/08/30 15:37:01" -"2","3","24","2013/08/30 15:38:01" -"2","3","24","2013/08/30 15:40:01" -"2","3","24","2013/08/30 15:41:01" -"2","3","24","2013/08/30 15:42:01" -"2","3","24","2013/08/30 15:43:01" -"2","3","24","2013/08/30 15:45:01" -"2","3","24","2013/08/30 15:46:01" -"2","3","24","2013/08/30 15:47:02" -"2","3","24","2013/08/30 15:48:02" -"2","3","24","2013/08/30 15:49:01" -"2","3","24","2013/08/30 15:50:01" -"2","3","24","2013/08/30 15:51:01" -"2","3","24","2013/08/30 15:52:02" -"2","3","24","2013/08/30 15:53:01" -"2","3","24","2013/08/30 15:54:01" -"2","3","24","2013/08/30 15:55:02" -"2","3","24","2013/08/30 15:56:01" -"2","3","24","2013/08/30 15:57:01" -"2","3","24","2013/08/30 15:58:01" -"2","3","24","2013/08/30 15:59:01" -"2","3","24","2013/08/30 16:00:01" -"2","3","24","2013/08/30 16:01:01" -"2","3","24","2013/08/30 16:02:01" -"2","3","24","2013/08/30 16:03:01" -"2","3","24","2013/08/30 16:04:01" -"2","3","24","2013/08/30 16:05:01" -"2","3","24","2013/08/30 16:06:01" -"2","3","24","2013/08/30 16:07:01" -"2","3","24","2013/08/30 16:08:01" -"2","2","25","2013/08/30 16:09:01" -"2","4","23","2013/08/30 16:10:01" -"2","5","22","2013/08/30 16:11:03" -"2","8","19","2013/08/30 16:12:01" -"2","8","19","2013/08/30 16:13:01" -"2","9","18","2013/08/30 16:15:01" -"2","10","17","2013/08/30 16:16:01" -"2","10","17","2013/08/30 16:17:01" -"2","10","17","2013/08/30 16:18:04" -"2","10","17","2013/08/30 16:19:01" -"2","10","17","2013/08/30 16:21:01" -"2","10","17","2013/08/30 16:22:01" -"2","10","17","2013/08/30 16:23:02" -"2","10","17","2013/08/30 16:24:01" -"2","10","17","2013/08/30 16:25:01" -"2","10","17","2013/08/30 16:26:07" -"2","10","17","2013/08/30 16:27:01" -"2","10","17","2013/08/30 16:28:01" -"2","10","17","2013/08/30 16:29:02" -"2","10","17","2013/08/30 16:30:01" -"2","10","17","2013/08/30 16:31:07" -"2","10","17","2013/08/30 16:32:01" -"2","10","17","2013/08/30 16:33:01" -"2","10","17","2013/08/30 16:34:01" -"2","10","17","2013/08/30 16:35:01" -"2","10","17","2013/08/30 16:37:01" -"2","10","17","2013/08/30 16:38:01" -"2","10","17","2013/08/30 16:40:01" -"2","10","17","2013/08/30 16:41:02" -"2","10","17","2013/08/30 16:42:01" -"2","11","16","2013/08/30 16:43:01" -"2","11","16","2013/08/30 16:44:01" -"2","11","16","2013/08/30 16:45:01" -"2","11","16","2013/08/30 16:46:01" -"2","11","16","2013/08/30 16:48:01" -"2","11","16","2013/08/30 16:49:01" -"2","11","16","2013/08/30 16:50:01" -"2","11","16","2013/08/30 16:51:01" -"2","11","16","2013/08/30 16:52:01" -"2","11","16","2013/08/30 16:53:01" -"2","11","16","2013/08/30 16:54:01" -"2","11","16","2013/08/30 16:55:02" -"2","11","16","2013/08/30 16:56:01" -"2","11","16","2013/08/30 16:57:01" -"2","11","16","2013/08/30 16:58:01" -"2","11","16","2013/08/30 16:59:03" -"2","11","16","2013/08/30 17:00:01" -"2","11","16","2013/08/30 17:01:03" -"2","11","16","2013/08/30 17:03:01" -"2","11","16","2013/08/30 17:04:02" -"2","11","16","2013/08/30 17:05:01" -"2","11","16","2013/08/30 17:06:01" -"2","11","16","2013/08/30 17:07:01" -"2","11","16","2013/08/30 17:08:01" -"2","11","16","2013/08/30 17:09:01" -"2","11","16","2013/08/30 17:10:02" -"2","11","16","2013/08/30 17:11:02" -"2","11","16","2013/08/30 17:12:01" -"2","11","16","2013/08/30 17:14:01" -"2","11","16","2013/08/30 17:15:02" -"2","11","16","2013/08/30 17:16:01" -"2","11","16","2013/08/30 17:17:03" -"2","11","16","2013/08/30 17:18:02" -"2","11","16","2013/08/30 17:19:01" -"2","11","16","2013/08/30 17:20:01" -"2","11","16","2013/08/30 17:21:01" -"2","11","16","2013/08/30 17:23:01" -"2","11","16","2013/08/30 17:24:01" -"2","11","16","2013/08/30 17:25:01" -"2","11","16","2013/08/30 17:26:02" -"2","11","16","2013/08/30 17:27:01" -"2","11","16","2013/08/30 17:28:01" -"2","11","16","2013/08/30 17:30:01" -"2","11","16","2013/08/30 17:31:01" -"2","11","16","2013/08/30 17:32:03" -"2","11","16","2013/08/30 17:33:01" -"2","11","16","2013/08/30 17:34:01" -"2","11","16","2013/08/30 17:35:01" -"2","11","16","2013/08/30 17:36:01" -"2","11","16","2013/08/30 17:37:04" -"2","11","16","2013/08/30 17:38:01" -"2","11","16","2013/08/30 17:40:01" -"2","11","16","2013/08/30 17:41:02" -"2","11","16","2013/08/30 17:42:03" -"2","11","16","2013/08/30 17:43:01" -"2","11","16","2013/08/30 17:44:01" -"2","11","16","2013/08/30 17:45:01" -"2","11","16","2013/08/30 17:46:01" -"2","11","16","2013/08/30 17:47:02" -"2","11","16","2013/08/30 17:49:01" -"2","11","16","2013/08/30 17:51:01" -"2","11","16","2013/08/30 17:52:01" -"2","11","16","2013/08/30 17:54:01" -"2","11","16","2013/08/30 17:55:02" -"2","11","16","2013/08/30 17:56:01" -"2","11","16","2013/08/30 17:57:01" -"2","11","16","2013/08/30 17:58:01" -"2","11","16","2013/08/30 18:00:01" -"2","11","16","2013/08/30 18:01:01" -"2","11","16","2013/08/30 18:02:01" -"2","11","16","2013/08/30 18:03:01" -"2","11","16","2013/08/30 18:05:01" -"2","11","16","2013/08/30 18:06:01" -"2","11","16","2013/08/30 18:07:01" -"2","11","16","2013/08/30 18:08:02" -"2","11","16","2013/08/30 18:10:01" -"2","11","16","2013/08/30 18:11:01" -"2","11","16","2013/08/30 18:12:03" -"2","11","16","2013/08/30 18:14:01" -"2","11","16","2013/08/30 18:15:01" -"2","11","16","2013/08/30 18:16:01" -"2","11","16","2013/08/30 18:18:01" -"2","11","16","2013/08/30 18:20:01" -"2","11","16","2013/08/30 18:21:02" -"2","11","16","2013/08/30 18:22:01" -"2","11","16","2013/08/30 18:23:01" -"2","11","16","2013/08/30 18:24:01" -"2","11","16","2013/08/30 18:25:01" -"2","11","16","2013/08/30 18:26:02" -"2","11","16","2013/08/30 18:27:01" -"2","11","16","2013/08/30 18:28:01" -"2","11","16","2013/08/30 18:29:01" -"2","11","16","2013/08/30 18:30:01" -"2","11","16","2013/08/30 18:31:01" -"2","11","16","2013/08/30 18:32:01" -"2","11","16","2013/08/30 18:33:01" -"2","10","17","2013/08/30 18:34:01" -"2","10","17","2013/08/30 18:35:01" -"2","10","17","2013/08/30 18:36:03" -"2","10","17","2013/08/30 18:38:01" -"2","10","17","2013/08/30 18:39:01" -"2","10","17","2013/08/30 18:40:01" -"2","10","17","2013/08/30 18:41:01" -"2","10","17","2013/08/30 18:42:04" -"2","10","17","2013/08/30 18:43:01" -"2","11","16","2013/08/30 18:44:01" -"2","11","16","2013/08/30 18:45:01" -"2","11","16","2013/08/30 18:46:01" -"2","11","16","2013/08/30 18:47:02" -"2","11","16","2013/08/30 18:48:01" -"2","11","16","2013/08/30 18:49:01" -"2","11","16","2013/08/30 18:50:01" -"2","11","16","2013/08/30 18:52:01" -"2","11","16","2013/08/30 18:53:02" -"2","11","16","2013/08/30 18:54:01" -"2","11","16","2013/08/30 18:55:01" -"2","11","16","2013/08/30 18:56:02" -"2","11","16","2013/08/30 18:57:01" -"2","11","16","2013/08/30 18:58:01" -"2","11","16","2013/08/30 18:59:01" -"2","11","16","2013/08/30 19:00:01" -"2","11","16","2013/08/30 19:01:01" -"2","11","16","2013/08/30 19:02:03" -"2","11","16","2013/08/30 19:03:01" -"2","11","16","2013/08/30 19:04:01" -"2","11","16","2013/08/30 19:05:01" -"2","11","16","2013/08/30 19:06:01" -"2","11","16","2013/08/30 19:07:01" -"2","11","16","2013/08/30 19:08:01" -"2","11","16","2013/08/30 19:09:01" -"2","11","16","2013/08/30 19:10:01" -"2","11","16","2013/08/30 19:11:01" -"2","11","16","2013/08/30 19:12:01" -"2","11","16","2013/08/30 19:13:01" -"2","11","16","2013/08/30 19:14:01" -"2","11","16","2013/08/30 19:15:01" -"2","11","16","2013/08/30 19:16:03" -"2","11","16","2013/08/30 19:17:01" -"2","11","16","2013/08/30 19:18:01" -"2","11","16","2013/08/30 19:19:01" -"2","11","16","2013/08/30 19:20:01" -"2","11","16","2013/08/30 19:21:02" -"2","11","16","2013/08/30 19:22:01" -"2","11","16","2013/08/30 19:23:01" -"2","11","16","2013/08/30 19:25:01" -"2","11","16","2013/08/30 19:26:01" -"2","11","16","2013/08/30 19:28:01" -"2","10","17","2013/08/30 19:30:01" -"2","10","17","2013/08/30 19:31:01" -"2","10","17","2013/08/30 19:32:04" -"2","10","17","2013/08/30 19:33:01" -"2","11","16","2013/08/30 19:34:02" -"2","11","16","2013/08/30 19:35:01" -"2","11","16","2013/08/30 19:36:02" -"2","11","16","2013/08/30 19:37:01" -"2","11","16","2013/08/30 19:38:01" -"2","11","16","2013/08/30 19:39:01" -"2","11","16","2013/08/30 19:40:01" -"2","11","16","2013/08/30 19:41:01" -"2","11","16","2013/08/30 19:42:01" -"2","11","16","2013/08/30 19:43:02" -"2","11","16","2013/08/30 19:45:01" -"2","11","16","2013/08/30 19:46:01" -"2","11","16","2013/08/30 19:47:01" -"2","11","16","2013/08/30 19:48:01" -"2","11","16","2013/08/30 19:49:01" -"2","11","16","2013/08/30 19:50:01" -"2","11","16","2013/08/30 19:51:02" -"2","10","17","2013/08/30 19:52:01" -"2","10","17","2013/08/30 19:53:01" -"2","10","17","2013/08/30 19:54:01" -"2","10","17","2013/08/30 19:55:01" -"2","10","17","2013/08/30 19:56:02" -"2","10","17","2013/08/30 19:57:01" -"2","10","17","2013/08/30 19:58:01" -"2","10","17","2013/08/30 19:59:01" -"2","10","17","2013/08/30 20:00:01" -"2","10","17","2013/08/30 20:01:01" -"2","10","17","2013/08/30 20:03:01" -"2","10","17","2013/08/30 20:05:01" -"2","10","17","2013/08/30 20:06:01" -"2","10","17","2013/08/30 20:08:01" -"2","10","17","2013/08/30 20:09:01" -"2","10","17","2013/08/30 20:10:02" -"2","10","17","2013/08/30 20:11:01" -"2","10","17","2013/08/30 20:12:01" -"2","10","17","2013/08/30 20:13:01" -"2","10","17","2013/08/30 20:14:01" -"2","10","17","2013/08/30 20:15:01" -"2","10","17","2013/08/30 20:16:01" -"2","10","17","2013/08/30 20:17:01" -"2","10","17","2013/08/30 20:18:01" -"2","10","17","2013/08/30 20:19:01" -"2","10","17","2013/08/30 20:20:01" -"2","10","17","2013/08/30 20:21:01" -"2","10","17","2013/08/30 20:22:01" -"2","10","17","2013/08/30 20:23:01" -"2","10","17","2013/08/30 20:25:02" -"2","10","17","2013/08/30 20:26:02" -"2","10","17","2013/08/30 20:27:01" -"2","10","17","2013/08/30 20:28:01" -"2","10","17","2013/08/30 20:29:01" -"2","10","17","2013/08/30 20:30:03" -"2","10","17","2013/08/30 20:31:01" -"2","10","17","2013/08/30 20:32:01" -"2","10","17","2013/08/30 20:33:01" -"2","10","17","2013/08/30 20:34:01" -"2","10","17","2013/08/30 20:35:06" -"2","10","17","2013/08/30 20:36:03" -"2","10","17","2013/08/30 20:37:02" -"2","10","17","2013/08/30 20:38:01" -"2","10","17","2013/08/30 20:40:01" -"2","10","17","2013/08/30 20:41:01" -"2","10","17","2013/08/30 20:42:01" -"2","10","17","2013/08/30 20:43:01" -"2","10","17","2013/08/30 20:44:01" -"2","10","17","2013/08/30 20:45:01" -"2","10","17","2013/08/30 20:46:01" -"2","10","17","2013/08/30 20:47:01" -"2","10","17","2013/08/30 20:48:01" -"2","10","17","2013/08/30 20:49:01" -"2","10","17","2013/08/30 20:50:01" -"2","10","17","2013/08/30 20:51:03" -"2","10","17","2013/08/30 20:52:01" -"2","10","17","2013/08/30 20:53:01" -"2","10","17","2013/08/30 20:54:02" -"2","10","17","2013/08/30 20:55:01" -"2","10","17","2013/08/30 20:56:02" -"2","10","17","2013/08/30 20:57:01" -"2","10","17","2013/08/30 20:58:01" -"2","10","17","2013/08/30 21:00:01" -"2","10","17","2013/08/30 21:01:01" -"2","10","17","2013/08/30 21:02:01" -"2","10","17","2013/08/30 21:03:01" -"2","10","17","2013/08/30 21:05:01" -"2","10","17","2013/08/30 21:06:01" -"2","10","17","2013/08/30 21:08:01" -"2","10","17","2013/08/30 21:10:01" -"2","10","17","2013/08/30 21:11:01" -"2","10","17","2013/08/30 21:12:01" -"2","10","17","2013/08/30 21:13:01" -"2","10","17","2013/08/30 21:14:01" -"2","10","17","2013/08/30 21:15:01" -"2","10","17","2013/08/30 21:16:02" -"2","10","17","2013/08/30 21:17:01" -"2","10","17","2013/08/30 21:18:01" -"2","10","17","2013/08/30 21:19:01" -"2","10","17","2013/08/30 21:20:01" -"2","10","17","2013/08/30 21:21:03" -"2","10","17","2013/08/30 21:23:01" -"2","10","17","2013/08/30 21:24:01" -"2","10","17","2013/08/30 21:25:01" -"2","10","17","2013/08/30 21:26:01" -"2","10","17","2013/08/30 21:27:01" -"2","10","17","2013/08/30 21:29:01" -"2","10","17","2013/08/30 21:30:01" -"2","11","16","2013/08/30 21:31:01" -"2","11","16","2013/08/30 21:32:01" -"2","11","16","2013/08/30 21:33:01" -"2","11","16","2013/08/30 21:34:01" -"2","11","16","2013/08/30 21:35:01" -"2","11","16","2013/08/30 21:36:02" -"2","11","16","2013/08/30 21:37:01" -"2","11","16","2013/08/30 21:38:01" -"2","11","16","2013/08/30 21:39:01" -"2","11","16","2013/08/30 21:40:01" -"2","11","16","2013/08/30 21:41:02" -"2","11","16","2013/08/30 21:42:02" -"2","11","16","2013/08/30 21:43:02" -"2","11","16","2013/08/30 21:44:01" -"2","11","16","2013/08/30 21:45:01" -"2","11","16","2013/08/30 21:46:03" -"2","11","16","2013/08/30 21:47:01" -"2","11","16","2013/08/30 21:48:01" -"2","11","16","2013/08/30 21:49:01" -"2","11","16","2013/08/30 21:50:01" -"2","11","16","2013/08/30 21:51:02" -"2","11","16","2013/08/30 21:52:01" -"2","11","16","2013/08/30 21:53:01" -"2","11","16","2013/08/30 21:54:01" -"2","11","16","2013/08/30 21:55:02" -"2","11","16","2013/08/30 21:56:02" -"2","11","16","2013/08/30 21:57:01" -"2","11","16","2013/08/30 21:58:01" -"2","11","16","2013/08/30 21:59:01" -"2","11","16","2013/08/30 22:00:02" -"2","11","16","2013/08/30 22:01:01" -"2","11","16","2013/08/30 22:02:01" -"2","11","16","2013/08/30 22:03:01" -"2","11","16","2013/08/30 22:04:01" -"2","11","16","2013/08/30 22:05:01" -"2","11","16","2013/08/30 22:06:02" -"2","11","16","2013/08/30 22:08:01" -"2","11","16","2013/08/30 22:10:01" -"2","11","16","2013/08/30 22:11:01" -"2","11","16","2013/08/30 22:12:01" -"2","11","16","2013/08/30 22:13:02" -"2","11","16","2013/08/30 22:14:01" -"2","11","16","2013/08/30 22:15:01" -"2","11","16","2013/08/30 22:16:01" -"2","11","16","2013/08/30 22:17:03" -"2","11","16","2013/08/30 22:19:01" -"2","11","16","2013/08/30 22:20:01" -"2","11","16","2013/08/30 22:22:01" -"2","11","16","2013/08/30 22:23:01" -"2","11","16","2013/08/30 22:24:01" -"2","11","16","2013/08/30 22:25:02" -"2","11","16","2013/08/30 22:26:02" -"2","11","16","2013/08/30 22:27:02" -"2","11","16","2013/08/30 22:28:01" -"2","11","16","2013/08/30 22:29:01" -"2","11","16","2013/08/30 22:30:01" -"2","11","16","2013/08/30 22:31:01" -"2","11","16","2013/08/30 22:32:01" -"2","11","16","2013/08/30 22:33:01" -"2","11","16","2013/08/30 22:34:01" -"2","11","16","2013/08/30 22:35:01" -"2","11","16","2013/08/30 22:36:01" -"2","11","16","2013/08/30 22:37:01" -"2","11","16","2013/08/30 22:38:01" -"2","11","16","2013/08/30 22:39:01" -"2","11","16","2013/08/30 22:40:02" -"2","11","16","2013/08/30 22:41:01" -"2","11","16","2013/08/30 22:42:01" -"2","11","16","2013/08/30 22:43:01" -"2","11","16","2013/08/30 22:45:01" -"2","11","16","2013/08/30 22:46:01" -"2","11","16","2013/08/30 22:47:01" -"2","11","16","2013/08/30 22:48:01" -"2","11","16","2013/08/30 22:49:01" -"2","11","16","2013/08/30 22:50:02" -"2","11","16","2013/08/30 22:51:01" -"2","11","16","2013/08/30 22:52:03" -"2","11","16","2013/08/30 22:53:01" -"2","11","16","2013/08/30 22:54:01" -"2","11","16","2013/08/30 22:55:01" -"2","11","16","2013/08/30 22:56:03" -"2","11","16","2013/08/30 22:57:01" -"2","11","16","2013/08/30 22:58:01" -"2","11","16","2013/08/30 22:59:01" -"2","11","16","2013/08/30 23:00:01" -"2","11","16","2013/08/30 23:02:01" -"2","11","16","2013/08/30 23:03:02" -"2","11","16","2013/08/30 23:05:01" -"2","11","16","2013/08/30 23:06:01" -"2","11","16","2013/08/30 23:07:01" -"2","11","16","2013/08/30 23:08:07" -"2","11","16","2013/08/30 23:09:01" -"2","11","16","2013/08/30 23:10:01" -"2","11","16","2013/08/30 23:11:03" -"2","11","16","2013/08/30 23:12:01" -"2","11","16","2013/08/30 23:13:01" -"2","11","16","2013/08/30 23:14:01" -"2","11","16","2013/08/30 23:15:01" -"2","11","16","2013/08/30 23:16:01" -"2","11","16","2013/08/30 23:18:01" -"2","11","16","2013/08/30 23:20:02" -"2","11","16","2013/08/30 23:21:02" -"2","11","16","2013/08/30 23:23:01" -"2","11","16","2013/08/30 23:24:01" -"2","11","16","2013/08/30 23:25:02" -"2","11","16","2013/08/30 23:26:04" -"2","11","16","2013/08/30 23:28:01" -"2","11","16","2013/08/30 23:30:02" -"2","11","16","2013/08/30 23:31:03" -"2","11","16","2013/08/30 23:32:01" -"2","11","16","2013/08/30 23:34:01" -"2","11","16","2013/08/30 23:35:02" -"2","11","16","2013/08/30 23:36:01" -"2","11","16","2013/08/30 23:37:01" -"2","11","16","2013/08/30 23:38:01" -"2","11","16","2013/08/30 23:39:01" -"2","11","16","2013/08/30 23:40:01" -"2","11","16","2013/08/30 23:41:01" -"2","11","16","2013/08/30 23:42:01" -"2","11","16","2013/08/30 23:43:01" -"2","11","16","2013/08/30 23:44:02" -"2","11","16","2013/08/30 23:45:01" -"2","11","16","2013/08/30 23:46:03" -"2","11","16","2013/08/30 23:47:01" -"2","11","16","2013/08/30 23:48:01" -"2","11","16","2013/08/30 23:49:01" -"2","11","16","2013/08/30 23:50:01" -"2","11","16","2013/08/30 23:51:03" -"2","11","16","2013/08/30 23:52:01" -"2","11","16","2013/08/30 23:53:01" -"2","11","16","2013/08/30 23:54:01" -"2","11","16","2013/08/30 23:55:01" -"2","11","16","2013/08/30 23:56:01" -"2","11","16","2013/08/30 23:57:01" -"2","11","16","2013/08/30 23:58:01" -"2","11","16","2013/08/30 23:59:01" -"2","11","16","2013/08/31 00:00:01" -"2","11","16","2013/08/31 00:02:01" -"2","11","16","2013/08/31 00:03:01" -"2","11","16","2013/08/31 00:04:01" -"2","11","16","2013/08/31 00:05:01" -"2","11","16","2013/08/31 00:06:02" -"2","11","16","2013/08/31 00:07:01" -"2","11","16","2013/08/31 00:08:01" -"2","11","16","2013/08/31 00:09:01" -"2","11","16","2013/08/31 00:10:02" -"2","11","16","2013/08/31 00:11:01" -"2","11","16","2013/08/31 00:12:01" -"2","11","16","2013/08/31 00:13:01" -"2","11","16","2013/08/31 00:14:01" -"2","11","16","2013/08/31 00:15:01" -"2","11","16","2013/08/31 00:16:01" -"2","11","16","2013/08/31 00:17:01" -"2","11","16","2013/08/31 00:18:01" -"2","11","16","2013/08/31 00:19:01" -"2","11","16","2013/08/31 00:20:01" -"2","11","16","2013/08/31 00:21:01" -"2","11","16","2013/08/31 00:22:01" -"2","11","16","2013/08/31 00:24:01" -"2","11","16","2013/08/31 00:26:01" -"2","11","16","2013/08/31 00:27:01" -"2","11","16","2013/08/31 00:29:01" -"2","11","16","2013/08/31 00:30:01" -"2","11","16","2013/08/31 00:31:01" -"2","11","16","2013/08/31 00:32:04" -"2","11","16","2013/08/31 00:33:01" -"2","11","16","2013/08/31 00:34:01" -"2","11","16","2013/08/31 00:35:01" -"2","11","16","2013/08/31 00:36:01" -"2","11","16","2013/08/31 00:37:01" -"2","11","16","2013/08/31 00:38:01" -"2","11","16","2013/08/31 00:40:01" -"2","11","16","2013/08/31 00:41:01" -"2","11","16","2013/08/31 00:42:02" -"2","11","16","2013/08/31 00:43:01" -"2","11","16","2013/08/31 00:44:01" -"2","11","16","2013/08/31 00:45:01" -"2","11","16","2013/08/31 00:46:01" -"2","11","16","2013/08/31 00:47:01" -"2","11","16","2013/08/31 00:48:01" -"2","11","16","2013/08/31 00:49:01" -"2","11","16","2013/08/31 00:50:01" -"2","11","16","2013/08/31 00:51:01" -"2","11","16","2013/08/31 00:52:01" -"2","11","16","2013/08/31 00:53:01" -"2","10","17","2013/08/31 00:54:02" -"2","10","17","2013/08/31 00:55:01" -"2","10","17","2013/08/31 00:56:01" -"2","10","17","2013/08/31 00:57:04" -"2","10","17","2013/08/31 00:58:01" -"2","11","16","2013/08/31 00:59:01" -"2","11","16","2013/08/31 01:00:01" -"2","11","16","2013/08/31 01:01:01" -"2","11","16","2013/08/31 01:03:01" -"2","11","16","2013/08/31 01:04:01" -"2","11","16","2013/08/31 01:06:01" -"2","11","16","2013/08/31 01:08:01" -"2","11","16","2013/08/31 01:10:01" -"2","11","16","2013/08/31 01:11:01" -"2","11","16","2013/08/31 01:12:01" -"2","11","16","2013/08/31 01:13:02" -"2","11","16","2013/08/31 01:14:01" -"2","11","16","2013/08/31 01:15:01" -"2","11","16","2013/08/31 01:16:01" -"2","11","16","2013/08/31 01:18:01" -"2","11","16","2013/08/31 01:19:01" -"2","11","16","2013/08/31 01:20:01" -"2","11","16","2013/08/31 01:21:01" -"2","11","16","2013/08/31 01:22:01" -"2","11","16","2013/08/31 01:23:01" -"2","11","16","2013/08/31 01:24:01" -"2","11","16","2013/08/31 01:25:01" -"2","11","16","2013/08/31 01:26:01" -"2","11","16","2013/08/31 01:28:01" -"2","11","16","2013/08/31 01:29:01" -"2","11","16","2013/08/31 01:30:02" -"2","11","16","2013/08/31 01:31:03" -"2","11","16","2013/08/31 01:32:01" -"2","11","16","2013/08/31 01:33:01" -"2","11","16","2013/08/31 01:34:01" -"2","11","16","2013/08/31 01:35:01" -"2","11","16","2013/08/31 01:36:01" -"2","11","16","2013/08/31 01:37:01" -"2","11","16","2013/08/31 01:38:01" -"2","11","16","2013/08/31 01:40:01" -"2","11","16","2013/08/31 01:41:03" -"2","11","16","2013/08/31 01:42:02" -"2","11","16","2013/08/31 01:43:01" -"2","11","16","2013/08/31 01:44:01" -"2","11","16","2013/08/31 01:45:01" -"2","11","16","2013/08/31 01:46:02" -"2","11","16","2013/08/31 01:47:01" -"2","11","16","2013/08/31 01:48:01" -"2","11","16","2013/08/31 01:49:01" -"2","11","16","2013/08/31 01:50:01" -"2","11","16","2013/08/31 01:51:02" -"2","11","16","2013/08/31 01:53:01" -"2","11","16","2013/08/31 01:55:01" -"2","11","16","2013/08/31 01:56:01" -"2","11","16","2013/08/31 01:57:01" -"2","11","16","2013/08/31 01:58:01" -"2","11","16","2013/08/31 01:59:01" -"2","11","16","2013/08/31 02:00:02" -"2","11","16","2013/08/31 02:01:01" -"2","11","16","2013/08/31 02:03:01" -"2","11","16","2013/08/31 02:04:01" -"2","11","16","2013/08/31 02:05:01" -"2","11","16","2013/08/31 02:06:01" -"2","11","16","2013/08/31 02:07:01" -"2","11","16","2013/08/31 02:08:01" -"2","11","16","2013/08/31 02:10:01" -"2","11","16","2013/08/31 02:11:01" -"2","11","16","2013/08/31 02:12:02" -"2","11","16","2013/08/31 02:13:01" -"2","11","16","2013/08/31 02:15:01" -"2","11","16","2013/08/31 02:16:01" -"2","11","16","2013/08/31 02:17:01" -"2","11","16","2013/08/31 02:18:01" -"2","11","16","2013/08/31 02:19:01" -"2","11","16","2013/08/31 02:20:02" -"2","11","16","2013/08/31 02:21:02" -"2","11","16","2013/08/31 02:22:02" -"2","11","16","2013/08/31 02:23:01" -"2","11","16","2013/08/31 02:24:01" -"2","11","16","2013/08/31 02:25:02" -"2","11","16","2013/08/31 02:26:01" -"2","11","16","2013/08/31 02:27:03" -"2","11","16","2013/08/31 02:28:01" -"2","11","16","2013/08/31 02:30:01" -"2","11","16","2013/08/31 02:31:01" -"2","11","16","2013/08/31 02:32:01" -"2","11","16","2013/08/31 02:33:01" -"2","11","16","2013/08/31 02:34:01" -"2","11","16","2013/08/31 02:35:01" -"2","11","16","2013/08/31 02:36:03" -"2","11","16","2013/08/31 02:37:01" -"2","11","16","2013/08/31 02:38:01" -"2","11","16","2013/08/31 02:40:01" -"2","11","16","2013/08/31 02:41:01" -"2","11","16","2013/08/31 02:42:01" -"2","11","16","2013/08/31 02:43:01" -"2","11","16","2013/08/31 02:45:01" -"2","11","16","2013/08/31 02:46:02" -"2","11","16","2013/08/31 02:47:01" -"2","11","16","2013/08/31 02:48:01" -"2","11","16","2013/08/31 02:49:01" -"2","11","16","2013/08/31 02:50:01" -"2","11","16","2013/08/31 02:51:01" -"2","11","16","2013/08/31 02:52:02" -"2","11","16","2013/08/31 02:53:01" -"2","11","16","2013/08/31 02:54:01" -"2","11","16","2013/08/31 02:55:01" -"2","11","16","2013/08/31 02:56:01" -"2","11","16","2013/08/31 02:57:01" -"2","11","16","2013/08/31 02:58:01" -"2","11","16","2013/08/31 03:00:01" -"2","11","16","2013/08/31 03:01:01" -"2","11","16","2013/08/31 03:02:01" -"2","11","16","2013/08/31 03:03:02" -"2","11","16","2013/08/31 03:04:01" -"2","11","16","2013/08/31 03:05:01" -"2","11","16","2013/08/31 03:06:01" -"2","11","16","2013/08/31 03:07:03" -"2","11","16","2013/08/31 03:08:02" -"2","11","16","2013/08/31 03:09:01" -"2","11","16","2013/08/31 03:11:01" -"2","11","16","2013/08/31 03:12:01" -"2","11","16","2013/08/31 03:13:01" -"2","11","16","2013/08/31 03:15:01" -"2","11","16","2013/08/31 03:16:01" -"2","11","16","2013/08/31 03:17:01" -"2","11","16","2013/08/31 03:18:01" -"2","11","16","2013/08/31 03:20:01" -"2","11","16","2013/08/31 03:21:03" -"2","11","16","2013/08/31 03:22:01" -"2","11","16","2013/08/31 03:23:01" -"2","11","16","2013/08/31 03:24:02" -"2","11","16","2013/08/31 03:25:01" -"2","11","16","2013/08/31 03:26:01" -"2","11","16","2013/08/31 03:27:01" -"2","11","16","2013/08/31 03:28:01" -"2","11","16","2013/08/31 03:29:01" -"2","11","16","2013/08/31 03:30:01" -"2","11","16","2013/08/31 03:31:01" -"2","11","16","2013/08/31 03:32:03" -"2","11","16","2013/08/31 03:34:01" -"2","11","16","2013/08/31 03:35:02" -"2","11","16","2013/08/31 03:36:02" -"2","11","16","2013/08/31 03:37:01" -"2","11","16","2013/08/31 03:38:01" -"2","11","16","2013/08/31 03:39:01" -"2","11","16","2013/08/31 03:40:01" -"2","11","16","2013/08/31 03:41:01" -"2","11","16","2013/08/31 03:42:01" -"2","11","16","2013/08/31 03:43:02" -"2","11","16","2013/08/31 03:44:01" -"2","11","16","2013/08/31 03:45:01" -"2","11","16","2013/08/31 03:46:01" -"2","11","16","2013/08/31 03:47:01" -"2","11","16","2013/08/31 03:48:01" -"2","11","16","2013/08/31 03:49:01" -"2","11","16","2013/08/31 03:50:01" -"2","11","16","2013/08/31 03:51:01" -"2","11","16","2013/08/31 03:53:01" -"2","11","16","2013/08/31 03:54:01" -"2","11","16","2013/08/31 03:55:01" -"2","11","16","2013/08/31 03:56:01" -"2","11","16","2013/08/31 03:57:01" -"2","11","16","2013/08/31 03:58:01" -"2","11","16","2013/08/31 03:59:01" -"2","11","16","2013/08/31 04:00:01" -"2","11","16","2013/08/31 04:01:01" -"2","11","16","2013/08/31 04:02:02" -"2","11","16","2013/08/31 04:03:01" -"2","11","16","2013/08/31 04:04:02" -"2","11","16","2013/08/31 04:05:02" -"2","11","16","2013/08/31 04:06:01" -"2","11","16","2013/08/31 04:07:01" -"2","11","16","2013/08/31 04:08:01" -"2","11","16","2013/08/31 04:09:01" -"2","11","16","2013/08/31 04:10:01" -"2","11","16","2013/08/31 04:11:01" -"2","11","16","2013/08/31 04:12:01" -"2","11","16","2013/08/31 04:13:01" -"2","11","16","2013/08/31 04:14:01" -"2","11","16","2013/08/31 04:15:02" -"2","11","16","2013/08/31 04:16:01" -"2","11","16","2013/08/31 04:17:02" -"2","11","16","2013/08/31 04:18:01" -"2","11","16","2013/08/31 04:19:01" -"2","11","16","2013/08/31 04:20:02" -"2","11","16","2013/08/31 04:21:01" -"2","11","16","2013/08/31 04:23:01" -"2","11","16","2013/08/31 04:24:01" -"2","11","16","2013/08/31 04:25:01" -"2","11","16","2013/08/31 04:26:03" -"2","11","16","2013/08/31 04:27:01" -"2","11","16","2013/08/31 04:28:01" -"2","11","16","2013/08/31 04:29:02" -"2","11","16","2013/08/31 04:30:02" -"2","11","16","2013/08/31 04:31:01" -"2","11","16","2013/08/31 04:32:01" -"2","11","16","2013/08/31 04:33:02" -"2","11","16","2013/08/31 04:34:01" -"2","11","16","2013/08/31 04:36:01" -"2","11","16","2013/08/31 04:37:03" -"2","11","16","2013/08/31 04:38:01" -"2","11","16","2013/08/31 04:40:01" -"2","11","16","2013/08/31 04:41:01" -"2","11","16","2013/08/31 04:42:01" -"2","11","16","2013/08/31 04:43:01" -"2","11","16","2013/08/31 04:44:01" -"2","11","16","2013/08/31 04:45:01" -"2","11","16","2013/08/31 04:46:01" -"2","11","16","2013/08/31 04:47:01" -"2","11","16","2013/08/31 04:48:01" -"2","11","16","2013/08/31 04:49:01" -"2","11","16","2013/08/31 04:50:04" -"2","11","16","2013/08/31 04:52:01" -"2","11","16","2013/08/31 04:53:01" -"2","11","16","2013/08/31 04:54:01" -"2","11","16","2013/08/31 04:55:01" -"2","11","16","2013/08/31 04:56:01" -"2","11","16","2013/08/31 04:57:03" -"2","11","16","2013/08/31 04:58:01" -"2","11","16","2013/08/31 04:59:01" -"2","11","16","2013/08/31 05:00:02" -"2","11","16","2013/08/31 05:01:02" -"2","11","16","2013/08/31 05:02:01" -"2","11","16","2013/08/31 05:03:01" -"2","11","16","2013/08/31 05:05:01" -"2","11","16","2013/08/31 05:06:01" -"2","11","16","2013/08/31 05:07:03" -"2","11","16","2013/08/31 05:08:01" -"2","11","16","2013/08/31 05:09:01" -"2","11","16","2013/08/31 05:11:01" -"2","11","16","2013/08/31 05:12:02" -"2","11","16","2013/08/31 05:14:01" -"2","11","16","2013/08/31 05:15:01" -"2","11","16","2013/08/31 05:16:01" -"2","11","16","2013/08/31 05:17:01" -"2","11","16","2013/08/31 05:18:01" -"2","11","16","2013/08/31 05:19:01" -"2","11","16","2013/08/31 05:20:01" -"2","11","16","2013/08/31 05:21:02" -"2","11","16","2013/08/31 05:22:01" -"2","11","16","2013/08/31 05:23:01" -"2","11","16","2013/08/31 05:25:01" -"2","11","16","2013/08/31 05:26:02" -"2","11","16","2013/08/31 05:27:02" -"2","11","16","2013/08/31 05:28:01" -"2","11","16","2013/08/31 05:30:01" -"2","11","16","2013/08/31 05:31:03" -"2","11","16","2013/08/31 05:32:02" -"2","11","16","2013/08/31 05:33:01" -"2","11","16","2013/08/31 05:34:02" -"2","11","16","2013/08/31 05:35:01" -"2","11","16","2013/08/31 05:36:01" -"2","11","16","2013/08/31 05:37:01" -"2","11","16","2013/08/31 05:38:01" -"2","11","16","2013/08/31 05:39:01" -"2","11","16","2013/08/31 05:40:01" -"2","11","16","2013/08/31 05:41:01" -"2","11","16","2013/08/31 05:42:02" -"2","11","16","2013/08/31 05:43:01" -"2","11","16","2013/08/31 05:44:01" -"2","11","16","2013/08/31 05:45:01" -"2","11","16","2013/08/31 05:46:01" -"2","11","16","2013/08/31 05:47:01" -"2","11","16","2013/08/31 05:48:02" -"2","11","16","2013/08/31 05:49:01" -"2","11","16","2013/08/31 05:50:01" -"2","11","16","2013/08/31 05:52:01" -"2","11","16","2013/08/31 05:53:01" -"2","11","16","2013/08/31 05:54:01" -"2","11","16","2013/08/31 05:55:01" -"2","11","16","2013/08/31 05:56:01" -"2","11","16","2013/08/31 05:57:02" -"2","11","16","2013/08/31 05:59:01" -"2","11","16","2013/08/31 06:00:01" -"2","11","16","2013/08/31 06:01:01" -"2","11","16","2013/08/31 06:02:01" -"2","11","16","2013/08/31 06:03:01" -"2","11","16","2013/08/31 06:04:01" -"2","11","16","2013/08/31 06:05:01" -"2","11","16","2013/08/31 06:06:02" -"2","11","16","2013/08/31 06:07:03" -"2","11","16","2013/08/31 06:08:01" -"2","11","16","2013/08/31 06:10:01" -"2","11","16","2013/08/31 06:11:01" -"2","11","16","2013/08/31 06:12:01" -"2","11","16","2013/08/31 06:13:01" -"2","11","16","2013/08/31 06:14:01" -"2","11","16","2013/08/31 06:15:02" -"2","11","16","2013/08/31 06:16:03" -"2","11","16","2013/08/31 06:17:01" -"2","11","16","2013/08/31 06:18:01" -"2","11","16","2013/08/31 06:19:01" -"2","11","16","2013/08/31 06:20:01" -"2","11","16","2013/08/31 06:21:01" -"2","11","16","2013/08/31 06:22:01" -"2","11","16","2013/08/31 06:23:01" -"2","11","16","2013/08/31 06:25:01" -"2","11","16","2013/08/31 06:26:01" -"2","11","16","2013/08/31 06:27:01" -"2","11","16","2013/08/31 06:28:01" -"2","11","16","2013/08/31 06:30:02" -"2","11","16","2013/08/31 06:31:01" -"2","11","16","2013/08/31 06:32:01" -"2","11","16","2013/08/31 06:33:01" -"2","11","16","2013/08/31 06:34:01" -"2","11","16","2013/08/31 06:35:01" -"2","11","16","2013/08/31 06:36:01" -"2","11","16","2013/08/31 06:38:01" -"2","11","16","2013/08/31 06:39:01" -"2","11","16","2013/08/31 06:40:01" -"2","11","16","2013/08/31 06:41:01" -"2","11","16","2013/08/31 06:42:01" -"2","11","16","2013/08/31 06:43:01" -"2","11","16","2013/08/31 06:44:01" -"2","11","16","2013/08/31 06:45:01" -"2","11","16","2013/08/31 06:46:04" -"2","11","16","2013/08/31 06:47:01" -"2","11","16","2013/08/31 06:48:01" -"2","11","16","2013/08/31 06:49:01" -"2","11","16","2013/08/31 06:50:02" -"2","11","16","2013/08/31 06:51:02" -"2","11","16","2013/08/31 06:52:02" -"2","11","16","2013/08/31 06:53:02" -"2","11","16","2013/08/31 06:54:01" -"2","11","16","2013/08/31 06:55:01" -"2","11","16","2013/08/31 06:56:02" -"2","11","16","2013/08/31 06:57:01" -"2","11","16","2013/08/31 06:58:01" -"2","11","16","2013/08/31 06:59:01" -"2","11","16","2013/08/31 07:00:01" -"2","11","16","2013/08/31 07:01:01" -"2","11","16","2013/08/31 07:02:01" -"2","11","16","2013/08/31 07:03:01" -"2","11","16","2013/08/31 07:04:01" -"2","11","16","2013/08/31 07:05:01" -"2","11","16","2013/08/31 07:06:01" -"2","11","16","2013/08/31 07:07:01" -"2","11","16","2013/08/31 07:08:02" -"2","11","16","2013/08/31 07:09:01" -"2","11","16","2013/08/31 07:10:01" -"2","11","16","2013/08/31 07:11:01" -"2","11","16","2013/08/31 07:12:01" -"2","11","16","2013/08/31 07:13:01" -"2","11","16","2013/08/31 07:14:01" -"2","11","16","2013/08/31 07:15:01" -"2","11","16","2013/08/31 07:16:02" -"2","11","16","2013/08/31 07:17:01" -"2","11","16","2013/08/31 07:18:01" -"2","11","16","2013/08/31 07:19:01" -"2","11","16","2013/08/31 07:20:01" -"2","11","16","2013/08/31 07:21:01" -"2","11","16","2013/08/31 07:22:01" -"2","11","16","2013/08/31 07:23:01" -"2","11","16","2013/08/31 07:24:01" -"2","11","16","2013/08/31 07:25:02" -"2","11","16","2013/08/31 07:26:01" -"2","11","16","2013/08/31 07:27:01" -"2","11","16","2013/08/31 07:28:01" -"2","11","16","2013/08/31 07:30:01" -"2","11","16","2013/08/31 07:31:01" -"2","11","16","2013/08/31 07:33:01" -"2","11","16","2013/08/31 07:34:01" -"2","11","16","2013/08/31 07:35:01" -"2","11","16","2013/08/31 07:36:01" -"2","11","16","2013/08/31 07:37:01" -"2","11","16","2013/08/31 07:38:06" -"2","11","16","2013/08/31 07:39:01" -"2","11","16","2013/08/31 07:40:02" -"2","11","16","2013/08/31 07:42:01" -"2","11","16","2013/08/31 07:43:01" -"2","11","16","2013/08/31 07:44:01" -"2","11","16","2013/08/31 07:45:02" -"2","11","16","2013/08/31 07:46:02" -"2","11","16","2013/08/31 07:47:03" -"2","11","16","2013/08/31 07:48:01" -"2","11","16","2013/08/31 07:50:02" -"2","11","16","2013/08/31 07:51:02" -"2","11","16","2013/08/31 07:52:03" -"2","11","16","2013/08/31 07:53:01" -"2","11","16","2013/08/31 07:54:01" -"2","11","16","2013/08/31 07:55:01" -"2","11","16","2013/08/31 07:56:01" -"2","11","16","2013/08/31 07:57:01" -"2","11","16","2013/08/31 07:58:01" -"2","11","16","2013/08/31 07:59:01" -"2","11","16","2013/08/31 08:00:01" -"2","11","16","2013/08/31 08:01:01" -"2","11","16","2013/08/31 08:02:01" -"2","11","16","2013/08/31 08:03:01" -"2","11","16","2013/08/31 08:04:02" -"2","11","16","2013/08/31 08:05:01" -"2","11","16","2013/08/31 08:06:02" -"2","11","16","2013/08/31 08:07:01" -"2","11","16","2013/08/31 08:08:01" -"2","11","16","2013/08/31 08:10:01" -"2","11","16","2013/08/31 08:11:01" -"2","11","16","2013/08/31 08:12:03" -"2","11","16","2013/08/31 08:13:01" -"2","11","16","2013/08/31 08:15:01" -"2","11","16","2013/08/31 08:16:02" -"2","11","16","2013/08/31 08:17:02" -"2","11","16","2013/08/31 08:18:01" -"2","11","16","2013/08/31 08:19:07" -"2","11","16","2013/08/31 08:20:01" -"2","11","16","2013/08/31 08:21:01" -"2","11","16","2013/08/31 08:22:01" -"2","11","16","2013/08/31 08:23:01" -"2","11","16","2013/08/31 08:24:02" -"2","11","16","2013/08/31 08:25:02" -"2","11","16","2013/08/31 08:26:01" -"2","11","16","2013/08/31 08:28:01" -"2","11","16","2013/08/31 08:30:01" -"2","11","16","2013/08/31 08:31:01" -"2","11","16","2013/08/31 08:32:04" -"2","11","16","2013/08/31 08:34:01" -"2","11","16","2013/08/31 08:35:01" -"2","11","16","2013/08/31 08:36:01" -"2","11","16","2013/08/31 08:37:01" -"2","11","16","2013/08/31 08:39:01" -"2","11","16","2013/08/31 08:40:01" -"2","11","16","2013/08/31 08:41:01" -"2","11","16","2013/08/31 08:42:01" -"2","11","16","2013/08/31 08:43:01" -"2","11","16","2013/08/31 08:44:01" -"2","11","16","2013/08/31 08:45:01" -"2","11","16","2013/08/31 08:46:03" -"2","11","16","2013/08/31 08:47:01" -"2","11","16","2013/08/31 08:48:01" -"2","10","17","2013/08/31 08:50:02" -"2","10","17","2013/08/31 08:51:02" -"2","10","17","2013/08/31 08:52:01" -"2","10","17","2013/08/31 08:53:01" -"2","11","16","2013/08/31 08:54:01" -"2","11","16","2013/08/31 08:55:01" -"2","11","16","2013/08/31 08:56:03" -"2","11","16","2013/08/31 08:57:01" -"2","11","16","2013/08/31 08:58:02" -"2","11","16","2013/08/31 08:59:02" -"2","11","16","2013/08/31 09:01:01" -"2","11","16","2013/08/31 09:02:04" -"2","11","16","2013/08/31 09:03:01" -"2","10","17","2013/08/31 09:05:01" -"2","10","17","2013/08/31 09:06:01" -"2","10","17","2013/08/31 09:07:01" -"2","10","17","2013/08/31 09:08:01" -"2","11","16","2013/08/31 09:10:01" -"2","11","16","2013/08/31 09:11:01" -"2","11","16","2013/08/31 09:12:01" -"2","11","16","2013/08/31 09:13:01" -"2","11","16","2013/08/31 09:14:01" -"2","11","16","2013/08/31 09:15:01" -"2","11","16","2013/08/31 09:16:01" -"2","11","16","2013/08/31 09:18:01" -"2","11","16","2013/08/31 09:19:01" -"2","11","16","2013/08/31 09:20:01" -"2","11","16","2013/08/31 09:22:01" -"2","11","16","2013/08/31 09:23:02" -"2","11","16","2013/08/31 09:24:01" -"2","11","16","2013/08/31 09:25:01" -"2","11","16","2013/08/31 09:26:02" -"2","11","16","2013/08/31 09:27:02" -"2","11","16","2013/08/31 09:28:01" -"2","11","16","2013/08/31 09:30:01" -"2","11","16","2013/08/31 09:31:03" -"2","11","16","2013/08/31 09:32:02" -"2","11","16","2013/08/31 09:33:01" -"2","11","16","2013/08/31 09:34:01" -"2","11","16","2013/08/31 09:35:01" -"2","11","16","2013/08/31 09:36:01" -"2","11","16","2013/08/31 09:38:01" -"2","11","16","2013/08/31 09:39:01" -"2","11","16","2013/08/31 09:40:02" -"2","11","16","2013/08/31 09:41:03" -"2","11","16","2013/08/31 09:42:01" -"2","11","16","2013/08/31 09:43:01" -"2","11","16","2013/08/31 09:44:01" -"2","11","16","2013/08/31 09:45:01" -"2","11","16","2013/08/31 09:46:01" -"2","11","16","2013/08/31 09:47:01" -"2","11","16","2013/08/31 09:48:01" -"2","11","16","2013/08/31 09:50:01" -"2","11","16","2013/08/31 09:51:01" -"2","11","16","2013/08/31 09:52:01" -"2","11","16","2013/08/31 09:53:01" -"2","11","16","2013/08/31 09:54:01" -"2","11","16","2013/08/31 09:55:02" -"2","11","16","2013/08/31 09:56:01" -"2","11","16","2013/08/31 09:57:01" -"2","11","16","2013/08/31 09:58:02" -"2","11","16","2013/08/31 09:59:01" -"2","11","16","2013/08/31 10:00:01" -"2","11","16","2013/08/31 10:01:01" -"2","11","16","2013/08/31 10:02:01" -"2","11","16","2013/08/31 10:03:01" -"2","11","16","2013/08/31 10:04:01" -"2","11","16","2013/08/31 10:05:02" -"2","11","16","2013/08/31 10:06:03" -"2","11","16","2013/08/31 10:07:01" -"2","11","16","2013/08/31 10:08:01" -"2","11","16","2013/08/31 10:09:01" -"2","11","16","2013/08/31 10:10:01" -"2","11","16","2013/08/31 10:11:01" -"2","11","16","2013/08/31 10:12:03" -"2","11","16","2013/08/31 10:13:01" -"2","11","16","2013/08/31 10:14:01" -"2","13","14","2013/08/31 10:15:01" -"2","13","14","2013/08/31 10:16:02" -"2","13","14","2013/08/31 10:17:01" -"2","13","14","2013/08/31 10:18:01" -"2","13","14","2013/08/31 10:19:01" -"2","13","14","2013/08/31 10:20:01" -"2","13","14","2013/08/31 10:21:01" -"2","13","14","2013/08/31 10:22:01" -"2","13","14","2013/08/31 10:23:01" -"2","13","14","2013/08/31 10:25:01" -"2","13","14","2013/08/31 10:26:01" -"2","13","14","2013/08/31 10:27:01" -"2","13","14","2013/08/31 10:29:01" -"2","13","14","2013/08/31 10:30:01" -"2","13","14","2013/08/31 10:31:02" -"2","13","14","2013/08/31 10:32:01" -"2","13","14","2013/08/31 10:33:01" -"2","13","14","2013/08/31 10:34:01" -"2","13","14","2013/08/31 10:35:02" -"2","13","14","2013/08/31 10:36:01" -"2","13","14","2013/08/31 10:37:01" -"2","13","14","2013/08/31 10:38:02" -"2","13","14","2013/08/31 10:40:01" -"2","13","14","2013/08/31 10:41:01" -"2","13","14","2013/08/31 10:42:01" -"2","13","14","2013/08/31 10:43:01" -"2","13","14","2013/08/31 10:45:01" -"2","13","14","2013/08/31 10:46:01" -"2","13","14","2013/08/31 10:47:01" -"2","13","14","2013/08/31 10:48:01" -"2","13","14","2013/08/31 10:49:01" -"2","13","14","2013/08/31 10:50:01" -"2","13","14","2013/08/31 10:51:01" -"2","13","14","2013/08/31 10:52:01" -"2","13","14","2013/08/31 10:53:02" -"2","13","14","2013/08/31 10:54:01" -"2","13","14","2013/08/31 10:55:02" -"2","13","14","2013/08/31 10:56:03" -"2","13","14","2013/08/31 10:57:01" -"2","13","14","2013/08/31 10:58:01" -"2","13","14","2013/08/31 10:59:01" -"2","13","14","2013/08/31 11:00:01" -"2","13","14","2013/08/31 11:01:01" -"2","13","14","2013/08/31 11:02:01" -"2","13","14","2013/08/31 11:03:01" -"2","13","14","2013/08/31 11:04:01" -"2","13","14","2013/08/31 11:05:01" -"2","13","14","2013/08/31 11:06:01" -"2","13","14","2013/08/31 11:07:03" -"2","13","14","2013/08/31 11:08:02" -"2","13","14","2013/08/31 11:09:02" -"2","13","14","2013/08/31 11:10:01" -"2","13","14","2013/08/31 11:11:02" -"2","13","14","2013/08/31 11:12:01" -"2","13","14","2013/08/31 11:13:01" -"2","13","14","2013/08/31 11:14:01" -"2","13","14","2013/08/31 11:15:01" -"2","13","14","2013/08/31 11:16:01" -"2","13","14","2013/08/31 11:17:01" -"2","13","14","2013/08/31 11:18:01" -"2","13","14","2013/08/31 11:20:02" -"2","13","14","2013/08/31 11:21:01" -"2","13","14","2013/08/31 11:22:03" -"2","13","14","2013/08/31 11:23:01" -"2","13","14","2013/08/31 11:25:01" -"2","13","14","2013/08/31 11:26:02" -"2","13","14","2013/08/31 11:27:01" -"2","13","14","2013/08/31 11:28:01" -"2","13","14","2013/08/31 11:29:01" -"2","13","14","2013/08/31 11:30:02" -"2","13","14","2013/08/31 11:31:01" -"2","13","14","2013/08/31 11:32:01" -"2","13","14","2013/08/31 11:33:01" -"2","13","14","2013/08/31 11:34:01" -"2","13","14","2013/08/31 11:35:01" -"2","13","14","2013/08/31 11:36:01" -"2","13","14","2013/08/31 11:37:01" -"2","13","14","2013/08/31 11:38:01" -"2","13","14","2013/08/31 11:39:01" -"2","13","14","2013/08/31 11:40:02" -"2","13","14","2013/08/31 11:42:01" -"2","13","14","2013/08/31 11:43:01" -"2","13","14","2013/08/31 11:44:01" -"2","13","14","2013/08/31 11:45:01" -"2","13","14","2013/08/31 11:46:03" -"2","13","14","2013/08/31 11:47:01" -"2","13","14","2013/08/31 11:48:01" -"2","13","14","2013/08/31 11:49:01" -"2","15","12","2013/08/31 11:51:01" -"2","15","12","2013/08/31 11:52:04" -"2","15","12","2013/08/31 11:53:01" -"2","15","12","2013/08/31 11:54:01" -"2","15","12","2013/08/31 11:55:02" -"2","15","12","2013/08/31 11:56:02" -"2","15","12","2013/08/31 11:57:02" -"2","15","12","2013/08/31 11:58:01" -"2","15","12","2013/08/31 11:59:01" -"2","15","12","2013/08/31 12:00:01" -"2","15","12","2013/08/31 12:01:01" -"2","15","12","2013/08/31 12:03:01" -"2","15","12","2013/08/31 12:04:01" -"2","15","12","2013/08/31 12:05:01" -"2","15","12","2013/08/31 12:06:02" -"2","15","12","2013/08/31 12:07:01" -"2","15","12","2013/08/31 12:08:01" -"2","15","12","2013/08/31 12:09:02" -"2","15","12","2013/08/31 12:10:02" -"2","15","12","2013/08/31 12:11:01" -"2","15","12","2013/08/31 12:12:01" -"2","15","12","2013/08/31 12:13:01" -"2","15","12","2013/08/31 12:14:02" -"2","15","12","2013/08/31 12:15:01" -"2","15","12","2013/08/31 12:16:01" -"2","15","12","2013/08/31 12:17:01" -"2","15","12","2013/08/31 12:18:02" -"2","15","12","2013/08/31 12:19:02" -"2","15","12","2013/08/31 12:20:02" -"2","15","12","2013/08/31 12:21:01" -"2","15","12","2013/08/31 12:22:02" -"2","15","12","2013/08/31 12:23:01" -"2","15","12","2013/08/31 12:24:01" -"2","15","12","2013/08/31 12:25:01" -"2","15","12","2013/08/31 12:26:02" -"2","15","12","2013/08/31 12:27:04" -"2","15","12","2013/08/31 12:28:01" -"2","15","12","2013/08/31 12:30:01" -"2","15","12","2013/08/31 12:31:01" -"2","15","12","2013/08/31 12:32:03" -"2","15","12","2013/08/31 12:33:01" -"2","15","12","2013/08/31 12:34:01" -"2","15","12","2013/08/31 12:36:01" -"2","15","12","2013/08/31 12:37:01" -"2","15","12","2013/08/31 12:38:01" -"2","15","12","2013/08/31 12:39:01" -"2","15","12","2013/08/31 12:40:02" -"2","15","12","2013/08/31 12:41:01" -"2","15","12","2013/08/31 12:42:03" -"2","15","12","2013/08/31 12:43:01" -"2","15","12","2013/08/31 12:44:01" -"2","15","12","2013/08/31 12:45:01" -"2","15","12","2013/08/31 12:46:01" -"2","15","12","2013/08/31 12:47:01" -"2","15","12","2013/08/31 12:48:01" -"2","15","12","2013/08/31 12:49:01" -"2","15","12","2013/08/31 12:50:01" -"2","15","12","2013/08/31 12:51:01" -"2","15","12","2013/08/31 12:52:01" -"2","15","12","2013/08/31 12:53:01" -"2","15","12","2013/08/31 12:54:01" -"2","15","12","2013/08/31 12:55:02" -"2","15","12","2013/08/31 12:56:01" -"2","15","12","2013/08/31 12:57:01" -"2","15","12","2013/08/31 12:58:01" -"2","15","12","2013/08/31 12:59:01" -"2","15","12","2013/08/31 13:00:01" -"2","15","12","2013/08/31 13:01:01" -"2","15","12","2013/08/31 13:02:01" -"2","15","12","2013/08/31 13:03:01" -"2","15","12","2013/08/31 13:04:02" -"2","15","12","2013/08/31 13:05:01" -"2","15","12","2013/08/31 13:06:01" -"2","15","12","2013/08/31 13:07:01" -"2","15","12","2013/08/31 13:08:01" -"2","15","12","2013/08/31 13:09:01" -"2","15","12","2013/08/31 13:10:02" -"2","15","12","2013/08/31 13:11:02" -"2","15","12","2013/08/31 13:12:03" -"2","15","12","2013/08/31 13:13:01" -"2","15","12","2013/08/31 13:14:01" -"2","15","12","2013/08/31 13:15:01" -"2","15","12","2013/08/31 13:16:02" -"2","15","12","2013/08/31 13:17:01" -"2","15","12","2013/08/31 13:18:01" -"2","15","12","2013/08/31 13:19:01" -"2","15","12","2013/08/31 13:20:01" -"2","15","12","2013/08/31 13:21:01" -"2","15","12","2013/08/31 13:22:01" -"2","15","12","2013/08/31 13:24:01" -"2","15","12","2013/08/31 13:25:02" -"2","15","12","2013/08/31 13:26:01" -"2","15","12","2013/08/31 13:27:04" -"2","15","12","2013/08/31 13:28:01" -"2","14","13","2013/08/31 13:30:01" -"2","14","13","2013/08/31 13:31:01" -"2","14","13","2013/08/31 13:32:02" -"2","14","13","2013/08/31 13:33:01" -"2","14","13","2013/08/31 13:34:01" -"2","14","13","2013/08/31 13:35:01" -"2","14","13","2013/08/31 13:36:01" -"2","14","13","2013/08/31 13:37:02" -"2","14","13","2013/08/31 13:38:01" -"2","15","12","2013/08/31 13:39:01" -"2","15","12","2013/08/31 13:40:01" -"2","15","12","2013/08/31 13:41:01" -"2","15","12","2013/08/31 13:42:01" -"2","15","12","2013/08/31 13:43:01" -"2","15","12","2013/08/31 13:44:01" -"2","15","12","2013/08/31 13:45:02" -"2","15","12","2013/08/31 13:46:02" -"2","15","12","2013/08/31 13:47:01" -"2","15","12","2013/08/31 13:48:01" -"2","15","12","2013/08/31 13:49:01" -"2","15","12","2013/08/31 13:50:01" -"2","15","12","2013/08/31 13:51:02" -"2","15","12","2013/08/31 13:52:01" -"2","15","12","2013/08/31 13:53:02" -"2","15","12","2013/08/31 13:54:02" -"2","15","12","2013/08/31 13:55:01" -"2","15","12","2013/08/31 13:56:02" -"2","15","12","2013/08/31 13:57:01" -"2","15","12","2013/08/31 13:58:02" -"2","15","12","2013/08/31 13:59:01" -"2","15","12","2013/08/31 14:00:01" -"2","15","12","2013/08/31 14:01:02" -"2","15","12","2013/08/31 14:02:01" -"2","15","12","2013/08/31 14:03:01" -"2","15","12","2013/08/31 14:04:01" -"2","15","12","2013/08/31 14:05:02" -"2","15","12","2013/08/31 14:06:01" -"2","15","12","2013/08/31 14:07:02" -"2","15","12","2013/08/31 14:08:01" -"2","15","12","2013/08/31 14:09:01" -"2","15","12","2013/08/31 14:10:01" -"2","15","12","2013/08/31 14:11:01" -"2","15","12","2013/08/31 14:12:01" -"2","15","12","2013/08/31 14:13:01" -"2","15","12","2013/08/31 14:15:01" -"2","15","12","2013/08/31 14:16:02" -"2","15","12","2013/08/31 14:17:01" -"2","15","12","2013/08/31 14:18:01" -"2","15","12","2013/08/31 14:19:01" -"2","15","12","2013/08/31 14:20:01" -"2","15","12","2013/08/31 14:21:01" -"2","15","12","2013/08/31 14:22:01" -"2","14","13","2013/08/31 14:24:01" -"2","14","13","2013/08/31 14:25:01" -"2","14","13","2013/08/31 14:26:03" -"2","14","13","2013/08/31 14:27:01" -"2","14","13","2013/08/31 14:28:01" -"2","14","13","2013/08/31 14:30:02" -"2","14","13","2013/08/31 14:31:01" -"2","14","13","2013/08/31 14:33:01" -"2","14","13","2013/08/31 14:34:01" -"2","14","13","2013/08/31 14:35:01" -"2","14","13","2013/08/31 14:36:01" -"2","14","13","2013/08/31 14:38:01" -"2","14","13","2013/08/31 14:39:02" -"2","14","13","2013/08/31 14:40:01" -"2","14","13","2013/08/31 14:41:01" -"2","14","13","2013/08/31 14:42:01" -"2","14","13","2013/08/31 14:43:01" -"2","14","13","2013/08/31 14:44:01" -"2","14","13","2013/08/31 14:45:01" -"2","14","13","2013/08/31 14:46:02" -"2","14","13","2013/08/31 14:47:01" -"2","14","13","2013/08/31 14:48:02" -"2","14","13","2013/08/31 14:49:01" -"2","14","13","2013/08/31 14:50:05" -"2","14","13","2013/08/31 14:51:01" -"2","14","13","2013/08/31 14:52:01" -"2","14","13","2013/08/31 14:53:02" -"2","14","13","2013/08/31 14:54:01" -"2","14","13","2013/08/31 14:55:02" -"2","14","13","2013/08/31 14:56:01" -"2","14","13","2013/08/31 14:57:01" -"2","14","13","2013/08/31 14:58:01" -"2","14","13","2013/08/31 14:59:01" -"2","14","13","2013/08/31 15:00:01" -"2","14","13","2013/08/31 15:01:01" -"2","14","13","2013/08/31 15:02:01" -"2","15","12","2013/08/31 15:04:01" -"2","15","12","2013/08/31 15:05:01" -"2","15","12","2013/08/31 15:06:01" -"2","15","12","2013/08/31 15:07:01" -"2","15","12","2013/08/31 15:08:01" -"2","15","12","2013/08/31 15:09:03" -"2","15","12","2013/08/31 15:10:01" -"2","15","12","2013/08/31 15:12:01" -"2","15","12","2013/08/31 15:13:01" -"2","15","12","2013/08/31 15:14:02" -"2","15","12","2013/08/31 15:15:01" -"2","15","12","2013/08/31 15:16:01" -"2","15","12","2013/08/31 15:17:01" -"2","15","12","2013/08/31 15:18:01" -"2","15","12","2013/08/31 15:20:02" -"2","15","12","2013/08/31 15:21:01" -"2","15","12","2013/08/31 15:23:01" -"2","15","12","2013/08/31 15:24:01" -"2","15","12","2013/08/31 15:25:01" -"2","15","12","2013/08/31 15:26:01" -"2","15","12","2013/08/31 15:27:01" -"2","15","12","2013/08/31 15:28:01" -"2","15","12","2013/08/31 15:29:01" -"2","15","12","2013/08/31 15:30:01" -"2","15","12","2013/08/31 15:31:01" -"2","15","12","2013/08/31 15:32:01" -"2","15","12","2013/08/31 15:33:01" -"2","15","12","2013/08/31 15:34:01" -"2","15","12","2013/08/31 15:35:02" -"2","15","12","2013/08/31 15:36:01" -"2","15","12","2013/08/31 15:37:01" -"2","15","12","2013/08/31 15:38:01" -"2","15","12","2013/08/31 15:39:01" -"2","15","12","2013/08/31 15:40:01" -"2","15","12","2013/08/31 15:41:02" -"2","15","12","2013/08/31 15:42:01" -"2","15","12","2013/08/31 15:43:01" -"2","15","12","2013/08/31 15:44:01" -"2","15","12","2013/08/31 15:45:01" -"2","15","12","2013/08/31 15:46:01" -"2","15","12","2013/08/31 15:47:03" -"2","15","12","2013/08/31 15:48:01" -"2","15","12","2013/08/31 15:49:01" -"2","15","12","2013/08/31 15:50:01" -"2","15","12","2013/08/31 15:51:02" -"2","15","12","2013/08/31 15:52:03" -"2","15","12","2013/08/31 15:53:01" -"2","15","12","2013/08/31 15:54:01" -"2","15","12","2013/08/31 15:55:02" -"2","15","12","2013/08/31 15:56:01" -"2","15","12","2013/08/31 15:57:01" -"2","15","12","2013/08/31 15:58:01" -"2","15","12","2013/08/31 15:59:02" -"2","15","12","2013/08/31 16:00:02" -"2","15","12","2013/08/31 16:01:01" -"2","15","12","2013/08/31 16:02:01" -"2","15","12","2013/08/31 16:03:01" -"2","15","12","2013/08/31 16:04:01" -"2","15","12","2013/08/31 16:05:01" -"2","14","13","2013/08/31 16:07:01" -"2","14","13","2013/08/31 16:08:01" -"2","14","13","2013/08/31 16:10:01" -"2","14","13","2013/08/31 16:11:01" -"2","14","13","2013/08/31 16:12:01" -"2","14","13","2013/08/31 16:13:02" -"2","14","13","2013/08/31 16:14:01" -"2","14","13","2013/08/31 16:15:01" -"2","14","13","2013/08/31 16:16:01" -"2","14","13","2013/08/31 16:17:01" -"2","14","13","2013/08/31 16:18:01" -"2","14","13","2013/08/31 16:19:01" -"2","14","13","2013/08/31 16:21:01" -"2","14","13","2013/08/31 16:22:01" -"2","14","13","2013/08/31 16:23:02" -"2","14","13","2013/08/31 16:25:01" -"2","14","13","2013/08/31 16:26:01" -"2","14","13","2013/08/31 16:27:01" -"2","14","13","2013/08/31 16:28:01" -"2","14","13","2013/08/31 16:30:01" -"2","14","13","2013/08/31 16:31:03" -"2","14","13","2013/08/31 16:32:01" -"2","14","13","2013/08/31 16:33:02" -"2","14","13","2013/08/31 16:34:01" -"2","14","13","2013/08/31 16:35:01" -"2","14","13","2013/08/31 16:36:02" -"2","14","13","2013/08/31 16:37:02" -"2","14","13","2013/08/31 16:38:01" -"2","14","13","2013/08/31 16:39:01" -"2","14","13","2013/08/31 16:40:07" -"2","14","13","2013/08/31 16:41:02" -"2","14","13","2013/08/31 16:42:01" -"2","14","13","2013/08/31 16:43:01" -"2","14","13","2013/08/31 16:45:01" -"2","14","13","2013/08/31 16:46:01" -"2","14","13","2013/08/31 16:47:02" -"2","14","13","2013/08/31 16:48:02" -"2","14","13","2013/08/31 16:49:01" -"2","15","12","2013/08/31 16:51:01" -"2","15","12","2013/08/31 16:52:01" -"2","15","12","2013/08/31 16:53:01" -"2","15","12","2013/08/31 16:54:01" -"2","15","12","2013/08/31 16:55:01" -"2","15","12","2013/08/31 16:56:02" -"2","15","12","2013/08/31 16:57:01" -"2","15","12","2013/08/31 16:58:01" -"2","15","12","2013/08/31 16:59:01" -"2","15","12","2013/08/31 17:00:01" -"2","15","12","2013/08/31 17:01:03" -"2","15","12","2013/08/31 17:02:01" -"2","15","12","2013/08/31 17:03:01" -"2","15","12","2013/08/31 17:04:01" -"2","15","12","2013/08/31 17:05:01" -"2","15","12","2013/08/31 17:06:03" -"2","15","12","2013/08/31 17:07:01" -"2","15","12","2013/08/31 17:08:01" -"2","15","12","2013/08/31 17:09:01" -"2","15","12","2013/08/31 17:10:01" -"2","15","12","2013/08/31 17:12:01" -"2","15","12","2013/08/31 17:13:01" -"2","15","12","2013/08/31 17:14:01" -"2","15","12","2013/08/31 17:15:01" -"2","15","12","2013/08/31 17:16:02" -"2","15","12","2013/08/31 17:17:01" -"2","15","12","2013/08/31 17:18:01" -"2","15","12","2013/08/31 17:19:02" -"2","15","12","2013/08/31 17:21:01" -"2","15","12","2013/08/31 17:22:01" -"2","15","12","2013/08/31 17:23:01" -"2","14","13","2013/08/31 17:24:02" -"2","14","13","2013/08/31 17:25:01" -"2","14","13","2013/08/31 17:26:01" -"2","14","13","2013/08/31 17:28:01" -"2","15","12","2013/08/31 17:29:01" -"2","15","12","2013/08/31 17:30:01" -"2","15","12","2013/08/31 17:31:01" -"2","15","12","2013/08/31 17:32:01" -"2","15","12","2013/08/31 17:33:01" -"2","15","12","2013/08/31 17:34:01" -"2","15","12","2013/08/31 17:35:01" -"2","15","12","2013/08/31 17:36:01" -"2","15","12","2013/08/31 17:37:01" -"2","15","12","2013/08/31 17:38:02" -"2","15","12","2013/08/31 17:39:01" -"2","15","12","2013/08/31 17:40:02" -"2","15","12","2013/08/31 17:41:03" -"2","15","12","2013/08/31 17:42:01" -"2","15","12","2013/08/31 17:43:01" -"2","15","12","2013/08/31 17:44:01" -"2","15","12","2013/08/31 17:45:01" -"2","15","12","2013/08/31 17:46:03" -"2","15","12","2013/08/31 17:47:02" -"2","15","12","2013/08/31 17:48:01" -"2","15","12","2013/08/31 17:49:01" -"2","15","12","2013/08/31 17:50:01" -"2","15","12","2013/08/31 17:51:02" -"2","13","14","2013/08/31 17:52:02" -"2","13","14","2013/08/31 17:53:01" -"2","13","14","2013/08/31 17:54:01" -"2","13","14","2013/08/31 17:55:02" -"2","13","14","2013/08/31 17:56:01" -"2","13","14","2013/08/31 17:57:02" -"2","13","14","2013/08/31 17:58:01" -"2","13","14","2013/08/31 17:59:01" -"2","13","14","2013/08/31 18:00:02" -"2","13","14","2013/08/31 18:01:02" -"2","13","14","2013/08/31 18:02:01" -"2","13","14","2013/08/31 18:03:01" -"2","13","14","2013/08/31 18:04:02" -"2","13","14","2013/08/31 18:05:01" -"2","13","14","2013/08/31 18:06:01" -"2","13","14","2013/08/31 18:07:03" -"2","13","14","2013/08/31 18:08:01" -"2","13","14","2013/08/31 18:09:01" -"2","13","14","2013/08/31 18:10:01" -"2","13","14","2013/08/31 18:12:01" -"2","13","14","2013/08/31 18:13:01" -"2","13","14","2013/08/31 18:15:02" -"2","13","14","2013/08/31 18:16:01" -"2","13","14","2013/08/31 18:17:03" -"2","13","14","2013/08/31 18:18:01" -"2","13","14","2013/08/31 18:19:01" -"2","13","14","2013/08/31 18:20:01" -"2","13","14","2013/08/31 18:22:01" -"2","13","14","2013/08/31 18:23:01" -"2","13","14","2013/08/31 18:24:01" -"2","13","14","2013/08/31 18:25:02" -"2","13","14","2013/08/31 18:26:01" -"2","13","14","2013/08/31 18:27:01" -"2","13","14","2013/08/31 18:28:01" -"2","13","14","2013/08/31 18:29:01" -"2","13","14","2013/08/31 18:30:01" -"2","13","14","2013/08/31 18:31:01" -"2","13","14","2013/08/31 18:32:01" -"2","13","14","2013/08/31 18:33:01" -"2","13","14","2013/08/31 18:34:01" -"2","13","14","2013/08/31 18:35:01" -"2","13","14","2013/08/31 18:36:02" -"2","13","14","2013/08/31 18:37:02" -"2","13","14","2013/08/31 18:38:01" -"2","13","14","2013/08/31 18:39:01" -"2","13","14","2013/08/31 18:40:01" -"2","13","14","2013/08/31 18:41:01" -"2","13","14","2013/08/31 18:42:01" -"2","13","14","2013/08/31 18:43:01" -"2","13","14","2013/08/31 18:44:01" -"2","13","14","2013/08/31 18:45:01" -"2","13","14","2013/08/31 18:46:01" -"2","13","14","2013/08/31 18:47:02" -"2","13","14","2013/08/31 18:48:02" -"2","13","14","2013/08/31 18:49:01" -"2","13","14","2013/08/31 18:50:01" -"2","13","14","2013/08/31 18:51:01" -"2","13","14","2013/08/31 18:52:01" -"2","13","14","2013/08/31 18:53:01" -"2","13","14","2013/08/31 18:54:01" -"2","13","14","2013/08/31 18:55:01" -"2","13","14","2013/08/31 18:56:02" -"2","13","14","2013/08/31 18:57:01" -"2","13","14","2013/08/31 18:58:01" -"2","13","14","2013/08/31 18:59:02" -"2","13","14","2013/08/31 19:00:01" -"2","13","14","2013/08/31 19:02:01" -"2","13","14","2013/08/31 19:03:01" -"2","13","14","2013/08/31 19:04:01" -"2","13","14","2013/08/31 19:05:01" -"2","13","14","2013/08/31 19:06:02" -"2","13","14","2013/08/31 19:07:01" -"2","13","14","2013/08/31 19:08:02" -"2","13","14","2013/08/31 19:09:01" -"2","13","14","2013/08/31 19:10:01" -"2","13","14","2013/08/31 19:11:01" -"2","13","14","2013/08/31 19:12:01" -"2","13","14","2013/08/31 19:13:01" -"2","13","14","2013/08/31 19:14:01" -"2","13","14","2013/08/31 19:15:01" -"2","13","14","2013/08/31 19:16:01" -"2","13","14","2013/08/31 19:17:01" -"2","13","14","2013/08/31 19:18:01" -"2","13","14","2013/08/31 19:19:01" -"2","13","14","2013/08/31 19:20:01" -"2","13","14","2013/08/31 19:21:01" -"2","13","14","2013/08/31 19:22:01" -"2","13","14","2013/08/31 19:24:01" -"2","13","14","2013/08/31 19:25:04" -"2","13","14","2013/08/31 19:26:02" -"2","13","14","2013/08/31 19:27:01" -"2","13","14","2013/08/31 19:28:01" -"2","13","14","2013/08/31 19:29:02" -"2","13","14","2013/08/31 19:30:01" -"2","13","14","2013/08/31 19:31:01" -"2","13","14","2013/08/31 19:32:01" -"2","13","14","2013/08/31 19:33:01" -"2","13","14","2013/08/31 19:35:01" -"2","13","14","2013/08/31 19:36:01" -"2","13","14","2013/08/31 19:37:01" -"2","13","14","2013/08/31 19:38:01" -"2","13","14","2013/08/31 19:39:01" -"2","13","14","2013/08/31 19:40:01" -"2","13","14","2013/08/31 19:41:03" -"2","13","14","2013/08/31 19:42:01" -"2","13","14","2013/08/31 19:43:02" -"2","13","14","2013/08/31 19:44:01" -"2","13","14","2013/08/31 19:46:01" -"2","13","14","2013/08/31 19:47:01" -"2","13","14","2013/08/31 19:48:01" -"2","13","14","2013/08/31 19:50:01" -"2","13","14","2013/08/31 19:51:01" -"2","13","14","2013/08/31 19:52:03" -"2","13","14","2013/08/31 19:53:01" -"2","13","14","2013/08/31 19:54:01" -"2","13","14","2013/08/31 19:55:01" -"2","13","14","2013/08/31 19:56:01" -"2","13","14","2013/08/31 19:57:01" -"2","13","14","2013/08/31 19:58:01" -"2","12","15","2013/08/31 19:59:02" -"2","12","15","2013/08/31 20:00:01" -"2","12","15","2013/08/31 20:01:01" -"2","12","15","2013/08/31 20:03:01" -"2","12","15","2013/08/31 20:05:01" -"2","12","15","2013/08/31 20:06:01" -"2","12","15","2013/08/31 20:07:01" -"2","12","15","2013/08/31 20:08:01" -"2","12","15","2013/08/31 20:09:02" -"2","10","17","2013/08/31 20:10:01" -"2","10","17","2013/08/31 20:11:01" -"2","10","17","2013/08/31 20:12:04" -"2","10","17","2013/08/31 20:13:01" -"2","10","17","2013/08/31 20:14:01" -"2","10","17","2013/08/31 20:15:01" -"2","10","17","2013/08/31 20:16:01" -"2","10","17","2013/08/31 20:18:01" -"2","10","17","2013/08/31 20:19:01" -"2","10","17","2013/08/31 20:20:03" -"2","10","17","2013/08/31 20:21:01" -"2","10","17","2013/08/31 20:22:01" -"2","10","17","2013/08/31 20:23:01" -"2","10","17","2013/08/31 20:24:01" -"2","10","17","2013/08/31 20:25:01" -"2","10","17","2013/08/31 20:26:01" -"2","10","17","2013/08/31 20:27:01" -"2","10","17","2013/08/31 20:29:01" -"2","10","17","2013/08/31 20:30:01" -"2","10","17","2013/08/31 20:31:01" -"2","10","17","2013/08/31 20:33:01" -"2","10","17","2013/08/31 20:35:01" -"2","10","17","2013/08/31 20:36:01" -"2","10","17","2013/08/31 20:37:01" -"2","10","17","2013/08/31 20:38:01" -"2","10","17","2013/08/31 20:40:02" -"2","10","17","2013/08/31 20:41:03" -"2","10","17","2013/08/31 20:42:01" -"2","10","17","2013/08/31 20:43:01" -"2","10","17","2013/08/31 20:45:01" -"2","10","17","2013/08/31 20:46:01" -"2","10","17","2013/08/31 20:47:04" -"2","10","17","2013/08/31 20:48:01" -"2","10","17","2013/08/31 20:49:01" -"2","10","17","2013/08/31 20:50:01" -"2","10","17","2013/08/31 20:51:01" -"2","10","17","2013/08/31 20:52:01" -"2","10","17","2013/08/31 20:53:01" -"2","10","17","2013/08/31 20:54:02" -"2","10","17","2013/08/31 20:55:01" -"2","10","17","2013/08/31 20:56:01" -"2","10","17","2013/08/31 20:57:02" -"2","10","17","2013/08/31 20:58:01" -"2","10","17","2013/08/31 21:00:01" -"2","10","17","2013/08/31 21:01:01" -"2","10","17","2013/08/31 21:02:01" -"2","10","17","2013/08/31 21:03:01" -"2","10","17","2013/08/31 21:04:01" -"2","10","17","2013/08/31 21:05:01" -"2","10","17","2013/08/31 21:06:01" -"2","10","17","2013/08/31 21:07:01" -"2","10","17","2013/08/31 21:08:01" -"2","10","17","2013/08/31 21:09:01" -"2","10","17","2013/08/31 21:11:01" -"2","10","17","2013/08/31 21:12:01" -"2","10","17","2013/08/31 21:13:01" -"2","9","18","2013/08/31 21:15:02" -"2","9","18","2013/08/31 21:16:02" -"2","9","18","2013/08/31 21:17:01" -"2","10","17","2013/08/31 21:18:01" -"2","11","16","2013/08/31 21:19:01" -"2","11","16","2013/08/31 21:20:01" -"2","11","16","2013/08/31 21:21:01" -"2","11","16","2013/08/31 21:22:01" -"2","11","16","2013/08/31 21:23:01" -"2","11","16","2013/08/31 21:24:01" -"2","11","16","2013/08/31 21:25:01" -"2","11","16","2013/08/31 21:26:01" -"2","11","16","2013/08/31 21:27:01" -"2","11","16","2013/08/31 21:28:01" -"2","11","16","2013/08/31 21:29:01" -"2","11","16","2013/08/31 21:30:01" -"2","11","16","2013/08/31 21:31:01" -"2","11","16","2013/08/31 21:32:01" -"2","11","16","2013/08/31 21:33:02" -"2","11","16","2013/08/31 21:34:01" -"2","11","16","2013/08/31 21:36:01" -"2","11","16","2013/08/31 21:37:01" -"2","11","16","2013/08/31 21:38:01" -"2","11","16","2013/08/31 21:39:01" -"2","11","16","2013/08/31 21:40:01" -"2","11","16","2013/08/31 21:41:01" -"2","11","16","2013/08/31 21:42:04" -"2","11","16","2013/08/31 21:43:01" -"2","11","16","2013/08/31 21:44:01" -"2","11","16","2013/08/31 21:45:01" -"2","11","16","2013/08/31 21:46:01" -"2","11","16","2013/08/31 21:47:03" -"2","11","16","2013/08/31 21:48:01" -"2","11","16","2013/08/31 21:49:01" -"2","11","16","2013/08/31 21:50:01" -"2","11","16","2013/08/31 21:51:01" -"2","11","16","2013/08/31 21:52:01" -"2","11","16","2013/08/31 21:53:02" -"2","11","16","2013/08/31 21:54:01" -"2","11","16","2013/08/31 21:55:01" -"2","11","16","2013/08/31 21:56:01" -"2","11","16","2013/08/31 21:57:01" -"2","11","16","2013/08/31 21:58:01" -"2","11","16","2013/08/31 21:59:01" -"2","11","16","2013/08/31 22:00:01" -"2","11","16","2013/08/31 22:01:02" -"2","11","16","2013/08/31 22:02:01" -"2","11","16","2013/08/31 22:03:01" -"2","11","16","2013/08/31 22:04:01" -"2","11","16","2013/08/31 22:05:02" -"2","11","16","2013/08/31 22:06:01" -"2","11","16","2013/08/31 22:07:02" -"2","11","16","2013/08/31 22:08:01" -"2","11","16","2013/08/31 22:09:01" -"2","11","16","2013/08/31 22:10:01" -"2","11","16","2013/08/31 22:11:01" -"2","11","16","2013/08/31 22:12:01" -"2","11","16","2013/08/31 22:13:01" -"2","10","17","2013/08/31 22:14:01" -"2","10","17","2013/08/31 22:15:01" -"2","10","17","2013/08/31 22:16:01" -"2","10","17","2013/08/31 22:18:01" -"2","11","16","2013/08/31 22:20:01" -"2","11","16","2013/08/31 22:21:01" -"2","11","16","2013/08/31 22:22:01" -"2","11","16","2013/08/31 22:23:01" -"2","11","16","2013/08/31 22:25:01" -"2","11","16","2013/08/31 22:26:01" -"2","11","16","2013/08/31 22:28:01" -"2","11","16","2013/08/31 22:29:01" -"2","11","16","2013/08/31 22:30:01" -"2","11","16","2013/08/31 22:31:01" -"2","11","16","2013/08/31 22:32:04" -"2","11","16","2013/08/31 22:33:01" -"2","11","16","2013/08/31 22:34:01" -"2","11","16","2013/08/31 22:35:01" -"2","11","16","2013/08/31 22:36:01" -"2","11","16","2013/08/31 22:37:01" -"2","11","16","2013/08/31 22:38:02" -"2","11","16","2013/08/31 22:40:01" -"2","11","16","2013/08/31 22:41:01" -"2","11","16","2013/08/31 22:42:01" -"2","11","16","2013/08/31 22:43:01" -"2","11","16","2013/08/31 22:45:01" -"2","11","16","2013/08/31 22:46:02" -"2","11","16","2013/08/31 22:47:01" -"2","11","16","2013/08/31 22:48:01" -"2","11","16","2013/08/31 22:49:01" -"2","11","16","2013/08/31 22:50:01" -"2","11","16","2013/08/31 22:51:01" -"2","11","16","2013/08/31 22:52:01" -"2","11","16","2013/08/31 22:53:01" -"2","11","16","2013/08/31 22:54:01" -"2","11","16","2013/08/31 22:55:01" -"2","11","16","2013/08/31 22:56:01" -"2","11","16","2013/08/31 22:57:01" -"2","11","16","2013/08/31 22:58:01" -"2","11","16","2013/08/31 23:00:01" -"2","11","16","2013/08/31 23:01:01" -"2","11","16","2013/08/31 23:02:03" -"2","11","16","2013/08/31 23:03:01" -"2","11","16","2013/08/31 23:05:02" -"2","11","16","2013/08/31 23:07:01" -"2","11","16","2013/08/31 23:08:01" -"2","11","16","2013/08/31 23:10:02" -"2","11","16","2013/08/31 23:11:01" -"2","11","16","2013/08/31 23:12:01" -"2","11","16","2013/08/31 23:13:01" -"2","11","16","2013/08/31 23:15:01" -"2","11","16","2013/08/31 23:16:01" -"2","11","16","2013/08/31 23:17:03" -"2","11","16","2013/08/31 23:18:02" -"2","11","16","2013/08/31 23:20:01" -"2","11","16","2013/08/31 23:21:01" -"2","11","16","2013/08/31 23:22:01" -"2","11","16","2013/08/31 23:24:01" -"2","11","16","2013/08/31 23:25:02" -"2","11","16","2013/08/31 23:26:01" -"2","11","16","2013/08/31 23:27:01" -"2","11","16","2013/08/31 23:28:02" -"2","11","16","2013/08/31 23:29:01" -"2","11","16","2013/08/31 23:30:01" -"2","11","16","2013/08/31 23:31:01" -"2","11","16","2013/08/31 23:32:01" -"2","11","16","2013/08/31 23:33:01" -"2","11","16","2013/08/31 23:34:01" -"2","11","16","2013/08/31 23:35:01" -"2","11","16","2013/08/31 23:36:01" -"2","11","16","2013/08/31 23:37:01" -"2","11","16","2013/08/31 23:38:01" -"2","11","16","2013/08/31 23:39:01" -"2","11","16","2013/08/31 23:40:01" -"2","11","16","2013/08/31 23:41:01" -"2","11","16","2013/08/31 23:42:01" -"2","11","16","2013/08/31 23:43:02" -"2","11","16","2013/08/31 23:44:01" -"2","11","16","2013/08/31 23:45:01" -"2","11","16","2013/08/31 23:46:01" -"2","11","16","2013/08/31 23:47:04" -"2","11","16","2013/08/31 23:48:01" -"2","11","16","2013/08/31 23:49:02" -"2","11","16","2013/08/31 23:50:01" -"2","11","16","2013/08/31 23:51:01" -"2","11","16","2013/08/31 23:52:01" -"2","11","16","2013/08/31 23:53:01" -"2","11","16","2013/08/31 23:54:01" -"2","11","16","2013/08/31 23:55:01" -"2","11","16","2013/08/31 23:56:01" -"2","11","16","2013/08/31 23:57:02" -"2","11","16","2013/08/31 23:58:01" -"2","11","16","2013/08/31 23:59:01" -"2","11","16","2013/09/01 00:00:02" -"2","11","16","2013/09/01 00:01:02" -"2","11","16","2013/09/01 00:02:01" -"2","11","16","2013/09/01 00:03:01" -"2","11","16","2013/09/01 00:04:01" -"2","11","16","2013/09/01 00:05:01" -"2","11","16","2013/09/01 00:06:01" -"2","11","16","2013/09/01 00:07:01" -"2","11","16","2013/09/01 00:08:01" -"2","11","16","2013/09/01 00:09:01" -"2","11","16","2013/09/01 00:11:01" -"2","11","16","2013/09/01 00:12:03" -"2","11","16","2013/09/01 00:13:02" -"2","11","16","2013/09/01 00:14:01" -"2","11","16","2013/09/01 00:15:01" -"2","11","16","2013/09/01 00:16:01" -"2","11","16","2013/09/01 00:17:01" -"2","11","16","2013/09/01 00:18:01" -"2","11","16","2013/09/01 00:20:01" -"2","11","16","2013/09/01 00:21:01" -"2","11","16","2013/09/01 00:22:01" -"2","11","16","2013/09/01 00:23:01" -"2","11","16","2013/09/01 00:24:02" -"2","11","16","2013/09/01 00:25:01" -"2","11","16","2013/09/01 00:26:01" -"2","11","16","2013/09/01 00:28:01" -"2","11","16","2013/09/01 00:29:01" -"2","11","16","2013/09/01 00:30:01" -"2","11","16","2013/09/01 00:31:01" -"2","11","16","2013/09/01 00:32:03" -"2","11","16","2013/09/01 00:33:01" -"2","11","16","2013/09/01 00:34:01" -"2","11","16","2013/09/01 00:35:01" -"2","11","16","2013/09/01 00:36:01" -"2","11","16","2013/09/01 00:37:01" -"2","11","16","2013/09/01 00:38:01" -"2","11","16","2013/09/01 00:39:01" -"2","11","16","2013/09/01 00:40:01" -"2","11","16","2013/09/01 00:41:02" -"2","11","16","2013/09/01 00:42:01" -"2","11","16","2013/09/01 00:43:01" -"2","11","16","2013/09/01 00:44:01" -"2","11","16","2013/09/01 00:45:01" -"2","11","16","2013/09/01 00:46:01" -"2","11","16","2013/09/01 00:47:01" -"2","11","16","2013/09/01 00:48:01" -"2","11","16","2013/09/01 00:49:01" -"2","11","16","2013/09/01 00:50:02" -"2","11","16","2013/09/01 00:51:01" -"2","11","16","2013/09/01 00:52:01" -"2","11","16","2013/09/01 00:53:01" -"2","11","16","2013/09/01 00:54:01" -"2","11","16","2013/09/01 00:55:01" -"2","11","16","2013/09/01 00:56:01" -"2","11","16","2013/09/01 00:57:03" -"2","11","16","2013/09/01 00:58:01" -"2","11","16","2013/09/01 00:59:01" -"2","11","16","2013/09/01 01:00:01" -"2","11","16","2013/09/01 01:01:01" -"2","11","16","2013/09/01 01:02:01" -"2","11","16","2013/09/01 01:03:02" -"2","11","16","2013/09/01 01:04:01" -"2","11","16","2013/09/01 01:06:02" -"2","11","16","2013/09/01 01:07:03" -"2","11","16","2013/09/01 01:08:02" -"2","11","16","2013/09/01 01:09:01" -"2","11","16","2013/09/01 01:11:01" -"2","11","16","2013/09/01 01:12:01" -"2","11","16","2013/09/01 01:13:01" -"2","11","16","2013/09/01 01:15:01" -"2","11","16","2013/09/01 01:17:01" -"2","11","16","2013/09/01 01:18:01" -"2","11","16","2013/09/01 01:19:01" -"2","11","16","2013/09/01 01:20:01" -"2","11","16","2013/09/01 01:21:01" -"2","11","16","2013/09/01 01:22:01" -"2","11","16","2013/09/01 01:23:01" -"2","11","16","2013/09/01 01:24:01" -"2","11","16","2013/09/01 01:25:01" -"2","11","16","2013/09/01 01:26:02" -"2","11","16","2013/09/01 01:27:02" -"2","11","16","2013/09/01 01:28:01" -"2","11","16","2013/09/01 01:30:01" -"2","11","16","2013/09/01 01:32:01" -"2","11","16","2013/09/01 01:34:01" -"2","11","16","2013/09/01 01:35:01" -"2","11","16","2013/09/01 01:36:03" -"2","11","16","2013/09/01 01:37:01" -"2","11","16","2013/09/01 01:38:02" -"2","11","16","2013/09/01 01:39:01" -"2","11","16","2013/09/01 01:40:01" -"2","11","16","2013/09/01 01:41:01" -"2","11","16","2013/09/01 01:42:01" -"2","11","16","2013/09/01 01:44:01" -"2","11","16","2013/09/01 01:45:01" -"2","11","16","2013/09/01 01:46:01" -"2","11","16","2013/09/01 01:47:01" -"2","11","16","2013/09/01 01:48:01" -"2","11","16","2013/09/01 01:49:01" -"2","11","16","2013/09/01 01:50:02" -"2","11","16","2013/09/01 01:51:01" -"2","11","16","2013/09/01 01:52:01" -"2","11","16","2013/09/01 01:54:01" -"2","11","16","2013/09/01 01:55:03" -"2","11","16","2013/09/01 01:56:01" -"2","11","16","2013/09/01 01:57:01" -"2","11","16","2013/09/01 01:59:01" -"2","11","16","2013/09/01 02:01:01" -"2","11","16","2013/09/01 02:02:01" -"2","11","16","2013/09/01 02:03:01" -"2","11","16","2013/09/01 02:04:01" -"2","11","16","2013/09/01 02:05:01" -"2","11","16","2013/09/01 02:06:02" -"2","11","16","2013/09/01 02:07:01" -"2","11","16","2013/09/01 02:08:01" -"2","11","16","2013/09/01 02:09:01" -"2","11","16","2013/09/01 02:10:01" -"2","11","16","2013/09/01 02:11:01" -"2","11","16","2013/09/01 02:12:03" -"2","11","16","2013/09/01 02:13:02" -"2","11","16","2013/09/01 02:15:01" -"2","11","16","2013/09/01 02:16:01" -"2","11","16","2013/09/01 02:17:01" -"2","11","16","2013/09/01 02:18:01" -"2","11","16","2013/09/01 02:19:01" -"2","11","16","2013/09/01 02:20:01" -"2","11","16","2013/09/01 02:21:03" -"2","11","16","2013/09/01 02:22:01" -"2","11","16","2013/09/01 02:23:01" -"2","11","16","2013/09/01 02:24:02" -"2","11","16","2013/09/01 02:25:01" -"2","11","16","2013/09/01 02:27:01" -"2","11","16","2013/09/01 02:28:02" -"2","11","16","2013/09/01 02:29:01" -"2","11","16","2013/09/01 02:30:01" -"2","11","16","2013/09/01 02:31:02" -"2","11","16","2013/09/01 02:32:01" -"2","11","16","2013/09/01 02:33:01" -"2","11","16","2013/09/01 02:35:01" -"2","11","16","2013/09/01 02:36:02" -"2","11","16","2013/09/01 02:38:01" -"2","11","16","2013/09/01 02:39:01" -"2","11","16","2013/09/01 02:40:01" -"2","11","16","2013/09/01 02:41:03" -"2","11","16","2013/09/01 02:42:01" -"2","11","16","2013/09/01 02:43:01" -"2","11","16","2013/09/01 02:44:01" -"2","11","16","2013/09/01 02:45:01" -"2","11","16","2013/09/01 02:46:02" -"2","11","16","2013/09/01 02:47:01" -"2","11","16","2013/09/01 02:48:01" -"2","11","16","2013/09/01 02:50:01" -"2","11","16","2013/09/01 02:51:01" -"2","11","16","2013/09/01 02:52:01" -"2","11","16","2013/09/01 02:53:01" -"2","11","16","2013/09/01 02:54:01" -"2","11","16","2013/09/01 02:55:01" -"2","11","16","2013/09/01 02:56:01" -"2","11","16","2013/09/01 02:57:01" -"2","11","16","2013/09/01 02:58:01" -"2","11","16","2013/09/01 02:59:01" -"2","11","16","2013/09/01 03:00:01" -"2","11","16","2013/09/01 03:01:01" -"2","11","16","2013/09/01 03:03:01" -"2","11","16","2013/09/01 03:04:01" -"2","11","16","2013/09/01 03:05:01" -"2","11","16","2013/09/01 03:06:01" -"2","11","16","2013/09/01 03:07:02" -"2","11","16","2013/09/01 03:09:01" -"2","11","16","2013/09/01 03:10:02" -"2","11","16","2013/09/01 03:11:01" -"2","11","16","2013/09/01 03:12:02" -"2","11","16","2013/09/01 03:13:02" -"2","11","16","2013/09/01 03:14:02" -"2","11","16","2013/09/01 03:15:01" -"2","11","16","2013/09/01 03:16:01" -"2","11","16","2013/09/01 03:17:01" -"2","11","16","2013/09/01 03:18:01" -"2","11","16","2013/09/01 03:19:01" -"2","11","16","2013/09/01 03:20:01" -"2","11","16","2013/09/01 03:21:01" -"2","11","16","2013/09/01 03:22:01" -"2","11","16","2013/09/01 03:23:01" -"2","11","16","2013/09/01 03:24:01" -"2","11","16","2013/09/01 03:26:01" -"2","11","16","2013/09/01 03:27:01" -"2","11","16","2013/09/01 03:28:01" -"2","11","16","2013/09/01 03:30:01" -"2","11","16","2013/09/01 03:31:01" -"2","11","16","2013/09/01 03:32:01" -"2","11","16","2013/09/01 03:33:01" -"2","11","16","2013/09/01 03:34:01" -"2","11","16","2013/09/01 03:36:01" -"2","11","16","2013/09/01 03:37:03" -"2","11","16","2013/09/01 03:38:01" -"2","11","16","2013/09/01 03:39:01" -"2","11","16","2013/09/01 03:40:02" -"2","11","16","2013/09/01 03:41:01" -"2","11","16","2013/09/01 03:42:01" -"2","11","16","2013/09/01 03:43:01" -"2","11","16","2013/09/01 03:45:01" -"2","11","16","2013/09/01 03:46:01" -"2","11","16","2013/09/01 03:48:01" -"2","11","16","2013/09/01 03:50:01" -"2","11","16","2013/09/01 03:51:02" -"2","11","16","2013/09/01 03:52:01" -"2","11","16","2013/09/01 03:53:01" -"2","11","16","2013/09/01 03:54:01" -"2","11","16","2013/09/01 03:55:01" -"2","11","16","2013/09/01 03:56:01" -"2","11","16","2013/09/01 03:57:01" -"2","11","16","2013/09/01 03:58:01" -"2","11","16","2013/09/01 03:59:01" -"2","11","16","2013/09/01 04:00:01" -"2","11","16","2013/09/01 04:01:01" -"2","11","16","2013/09/01 04:02:01" -"2","11","16","2013/09/01 04:03:01" -"2","11","16","2013/09/01 04:04:01" -"2","11","16","2013/09/01 04:05:01" -"2","11","16","2013/09/01 04:06:02" -"2","11","16","2013/09/01 04:07:01" -"2","11","16","2013/09/01 04:08:01" -"2","11","16","2013/09/01 04:09:01" -"2","11","16","2013/09/01 04:10:01" -"2","11","16","2013/09/01 04:11:01" -"2","11","16","2013/09/01 04:12:01" -"2","11","16","2013/09/01 04:13:01" -"2","11","16","2013/09/01 04:14:01" -"2","11","16","2013/09/01 04:15:02" -"2","11","16","2013/09/01 04:16:01" -"2","11","16","2013/09/01 04:17:01" -"2","11","16","2013/09/01 04:18:01" -"2","11","16","2013/09/01 04:19:01" -"2","11","16","2013/09/01 04:20:01" -"2","11","16","2013/09/01 04:21:02" -"2","11","16","2013/09/01 04:22:01" -"2","11","16","2013/09/01 04:23:01" -"2","11","16","2013/09/01 04:24:01" -"2","11","16","2013/09/01 04:25:01" -"2","11","16","2013/09/01 04:27:01" -"2","11","16","2013/09/01 04:28:01" -"2","11","16","2013/09/01 04:29:01" -"2","11","16","2013/09/01 04:30:02" -"2","11","16","2013/09/01 04:31:01" -"2","11","16","2013/09/01 04:32:01" -"2","11","16","2013/09/01 04:33:01" -"2","11","16","2013/09/01 04:34:01" -"2","11","16","2013/09/01 04:35:01" -"2","11","16","2013/09/01 04:37:01" -"2","11","16","2013/09/01 04:38:01" -"2","11","16","2013/09/01 04:39:01" -"2","11","16","2013/09/01 04:40:01" -"2","11","16","2013/09/01 04:41:02" -"2","11","16","2013/09/01 04:42:01" -"2","11","16","2013/09/01 04:43:01" -"2","11","16","2013/09/01 04:45:01" -"2","11","16","2013/09/01 04:46:02" -"2","11","16","2013/09/01 04:47:02" -"2","11","16","2013/09/01 04:48:01" -"2","11","16","2013/09/01 04:49:01" -"2","11","16","2013/09/01 04:50:01" -"2","11","16","2013/09/01 04:51:01" -"2","11","16","2013/09/01 04:52:01" -"2","11","16","2013/09/01 04:53:01" -"2","11","16","2013/09/01 04:54:01" -"2","11","16","2013/09/01 04:55:01" -"2","11","16","2013/09/01 04:56:01" -"2","11","16","2013/09/01 04:57:01" -"2","11","16","2013/09/01 04:58:01" -"2","11","16","2013/09/01 05:00:02" -"2","11","16","2013/09/01 05:01:01" -"2","11","16","2013/09/01 05:02:01" -"2","11","16","2013/09/01 05:03:01" -"2","11","16","2013/09/01 05:05:01" -"2","11","16","2013/09/01 05:06:01" -"2","11","16","2013/09/01 05:07:03" -"2","11","16","2013/09/01 05:08:02" -"2","11","16","2013/09/01 05:09:01" -"2","11","16","2013/09/01 05:10:02" -"2","11","16","2013/09/01 05:11:01" -"2","11","16","2013/09/01 05:12:03" -"2","11","16","2013/09/01 05:13:01" -"2","11","16","2013/09/01 05:15:01" -"2","11","16","2013/09/01 05:16:01" -"2","11","16","2013/09/01 05:17:03" -"2","11","16","2013/09/01 05:19:01" -"2","11","16","2013/09/01 05:20:01" -"2","11","16","2013/09/01 05:21:02" -"2","11","16","2013/09/01 05:22:02" -"2","11","16","2013/09/01 05:23:01" -"2","11","16","2013/09/01 05:24:01" -"2","11","16","2013/09/01 05:25:01" -"2","11","16","2013/09/01 05:26:01" -"2","11","16","2013/09/01 05:27:02" -"2","11","16","2013/09/01 05:28:01" -"2","11","16","2013/09/01 05:30:01" -"2","11","16","2013/09/01 05:32:01" -"2","11","16","2013/09/01 05:33:01" -"2","11","16","2013/09/01 05:34:01" -"2","11","16","2013/09/01 05:35:02" -"2","11","16","2013/09/01 05:36:01" -"2","11","16","2013/09/01 05:37:01" -"2","11","16","2013/09/01 05:38:01" -"2","11","16","2013/09/01 05:40:01" -"2","11","16","2013/09/01 05:41:01" -"2","11","16","2013/09/01 05:42:03" -"2","11","16","2013/09/01 05:43:01" -"2","11","16","2013/09/01 05:45:01" -"2","11","16","2013/09/01 05:46:01" -"2","11","16","2013/09/01 05:48:01" -"2","11","16","2013/09/01 05:49:01" -"2","11","16","2013/09/01 05:51:01" -"2","11","16","2013/09/01 05:52:03" -"2","11","16","2013/09/01 05:53:01" -"2","11","16","2013/09/01 05:55:01" -"2","11","16","2013/09/01 05:56:01" -"2","11","16","2013/09/01 05:57:03" -"2","11","16","2013/09/01 05:58:01" -"2","11","16","2013/09/01 05:59:01" -"2","11","16","2013/09/01 06:00:01" -"2","11","16","2013/09/01 06:01:01" -"2","11","16","2013/09/01 06:02:01" -"2","11","16","2013/09/01 06:03:01" -"2","11","16","2013/09/01 06:04:01" -"2","11","16","2013/09/01 06:05:01" -"2","11","16","2013/09/01 06:06:01" -"2","11","16","2013/09/01 06:07:01" -"2","11","16","2013/09/01 06:08:01" -"2","11","16","2013/09/01 06:09:01" -"2","11","16","2013/09/01 06:10:01" -"2","11","16","2013/09/01 06:11:01" -"2","11","16","2013/09/01 06:12:01" -"2","11","16","2013/09/01 06:13:01" -"2","11","16","2013/09/01 06:14:01" -"2","11","16","2013/09/01 06:15:01" -"2","11","16","2013/09/01 06:16:01" -"2","11","16","2013/09/01 06:17:01" -"2","11","16","2013/09/01 06:18:01" -"2","11","16","2013/09/01 06:19:02" -"2","11","16","2013/09/01 06:21:01" -"2","11","16","2013/09/01 06:22:01" -"2","11","16","2013/09/01 06:23:01" -"2","11","16","2013/09/01 06:24:01" -"2","11","16","2013/09/01 06:25:01" -"2","11","16","2013/09/01 06:26:01" -"2","11","16","2013/09/01 06:27:02" -"2","11","16","2013/09/01 06:28:01" -"2","11","16","2013/09/01 06:29:01" -"2","11","16","2013/09/01 06:31:01" -"2","11","16","2013/09/01 06:32:01" -"2","11","16","2013/09/01 06:33:01" -"2","11","16","2013/09/01 06:34:01" -"2","11","16","2013/09/01 06:35:01" -"2","11","16","2013/09/01 06:36:01" -"2","11","16","2013/09/01 06:38:01" -"2","11","16","2013/09/01 06:40:01" -"2","11","16","2013/09/01 06:41:01" -"2","11","16","2013/09/01 06:42:01" -"2","11","16","2013/09/01 06:43:01" -"2","11","16","2013/09/01 06:44:01" -"2","11","16","2013/09/01 06:45:01" -"2","11","16","2013/09/01 06:46:01" -"2","11","16","2013/09/01 06:47:02" -"2","11","16","2013/09/01 06:48:01" -"2","11","16","2013/09/01 06:49:01" -"2","11","16","2013/09/01 06:50:01" -"2","11","16","2013/09/01 06:51:02" -"2","11","16","2013/09/01 06:52:03" -"2","11","16","2013/09/01 06:53:01" -"2","11","16","2013/09/01 06:54:01" -"2","11","16","2013/09/01 06:55:01" -"2","11","16","2013/09/01 06:56:01" -"2","11","16","2013/09/01 06:57:01" -"2","11","16","2013/09/01 06:58:01" -"2","11","16","2013/09/01 06:59:01" -"2","11","16","2013/09/01 07:00:01" -"2","11","16","2013/09/01 07:01:02" -"2","11","16","2013/09/01 07:02:02" -"2","11","16","2013/09/01 07:03:01" -"2","11","16","2013/09/01 07:04:01" -"2","11","16","2013/09/01 07:05:01" -"2","11","16","2013/09/01 07:06:01" -"2","11","16","2013/09/01 07:07:01" -"2","11","16","2013/09/01 07:08:01" -"2","11","16","2013/09/01 07:09:01" -"2","11","16","2013/09/01 07:10:01" -"2","11","16","2013/09/01 07:11:01" -"2","11","16","2013/09/01 07:12:03" -"2","11","16","2013/09/01 07:13:01" -"2","11","16","2013/09/01 07:14:01" -"2","11","16","2013/09/01 07:15:01" -"2","11","16","2013/09/01 07:16:01" -"2","11","16","2013/09/01 07:17:03" -"2","11","16","2013/09/01 07:18:01" -"2","11","16","2013/09/01 07:19:01" -"2","11","16","2013/09/01 07:20:01" -"2","11","16","2013/09/01 07:21:01" -"2","11","16","2013/09/01 07:22:01" -"2","11","16","2013/09/01 07:23:01" -"2","11","16","2013/09/01 07:24:01" -"2","11","16","2013/09/01 07:25:02" -"2","11","16","2013/09/01 07:26:03" -"2","11","16","2013/09/01 07:27:01" -"2","11","16","2013/09/01 07:28:01" -"2","11","16","2013/09/01 07:29:01" -"2","11","16","2013/09/01 07:30:02" -"2","11","16","2013/09/01 07:31:01" -"2","11","16","2013/09/01 07:32:01" -"2","11","16","2013/09/01 07:33:02" -"2","11","16","2013/09/01 07:34:01" -"2","11","16","2013/09/01 07:35:01" -"2","11","16","2013/09/01 07:36:01" -"2","11","16","2013/09/01 07:37:01" -"2","11","16","2013/09/01 07:38:01" -"2","11","16","2013/09/01 07:40:01" -"2","11","16","2013/09/01 07:41:02" -"2","11","16","2013/09/01 07:42:01" -"2","11","16","2013/09/01 07:43:02" -"2","11","16","2013/09/01 07:44:01" -"2","11","16","2013/09/01 07:45:01" -"2","11","16","2013/09/01 07:46:01" -"2","11","16","2013/09/01 07:48:01" -"2","11","16","2013/09/01 07:49:01" -"2","11","16","2013/09/01 07:50:01" -"2","11","16","2013/09/01 07:51:01" -"2","11","16","2013/09/01 07:52:01" -"2","11","16","2013/09/01 07:53:01" -"2","11","16","2013/09/01 07:54:01" -"2","11","16","2013/09/01 07:55:01" -"2","11","16","2013/09/01 07:56:01" -"2","11","16","2013/09/01 07:57:01" -"2","11","16","2013/09/01 07:58:01" -"2","11","16","2013/09/01 07:59:01" -"2","11","16","2013/09/01 08:00:01" -"2","11","16","2013/09/01 08:02:01" -"2","11","16","2013/09/01 08:03:01" -"2","11","16","2013/09/01 08:04:02" -"2","11","16","2013/09/01 08:05:02" -"2","11","16","2013/09/01 08:06:02" -"2","11","16","2013/09/01 08:07:01" -"2","11","16","2013/09/01 08:09:01" -"2","11","16","2013/09/01 08:10:03" -"2","11","16","2013/09/01 08:11:01" -"2","11","16","2013/09/01 08:12:01" -"2","11","16","2013/09/01 08:13:01" -"2","11","16","2013/09/01 08:14:01" -"2","11","16","2013/09/01 08:15:01" -"2","11","16","2013/09/01 08:16:01" -"2","11","16","2013/09/01 08:17:04" -"2","11","16","2013/09/01 08:18:01" -"2","11","16","2013/09/01 08:20:01" -"2","11","16","2013/09/01 08:21:01" -"2","11","16","2013/09/01 08:22:01" -"2","11","16","2013/09/01 08:23:01" -"2","11","16","2013/09/01 08:24:01" -"2","11","16","2013/09/01 08:25:01" -"2","11","16","2013/09/01 08:26:01" -"2","11","16","2013/09/01 08:27:01" -"2","11","16","2013/09/01 08:28:02" -"2","11","16","2013/09/01 08:30:02" -"2","11","16","2013/09/01 08:31:01" -"2","11","16","2013/09/01 08:32:01" -"2","11","16","2013/09/01 08:33:01" -"2","11","16","2013/09/01 08:35:01" -"2","11","16","2013/09/01 08:36:02" -"2","11","16","2013/09/01 08:37:01" -"2","11","16","2013/09/01 08:38:01" -"2","11","16","2013/09/01 08:39:01" -"2","11","16","2013/09/01 08:40:02" -"2","11","16","2013/09/01 08:41:03" -"2","11","16","2013/09/01 08:42:01" -"2","11","16","2013/09/01 08:43:01" -"2","11","16","2013/09/01 08:44:01" -"2","11","16","2013/09/01 08:45:02" -"2","11","16","2013/09/01 08:47:01" -"2","11","16","2013/09/01 08:48:01" -"2","11","16","2013/09/01 08:50:01" -"2","11","16","2013/09/01 08:51:02" -"2","11","16","2013/09/01 08:52:01" -"2","11","16","2013/09/01 08:53:01" -"2","11","16","2013/09/01 08:54:01" -"2","11","16","2013/09/01 08:55:01" -"2","11","16","2013/09/01 08:56:01" -"2","11","16","2013/09/01 08:57:01" -"2","11","16","2013/09/01 08:58:01" -"2","11","16","2013/09/01 08:59:01" -"2","11","16","2013/09/01 09:00:01" -"2","11","16","2013/09/01 09:02:01" -"2","11","16","2013/09/01 09:03:01" -"2","11","16","2013/09/01 09:04:04" -"2","11","16","2013/09/01 09:05:01" -"2","11","16","2013/09/01 09:06:01" -"2","11","16","2013/09/01 09:07:01" -"2","11","16","2013/09/01 09:08:01" -"2","11","16","2013/09/01 09:09:01" -"2","11","16","2013/09/01 09:10:01" -"2","11","16","2013/09/01 09:11:01" -"2","11","16","2013/09/01 09:12:01" -"2","11","16","2013/09/01 09:13:01" -"2","11","16","2013/09/01 09:14:01" -"2","11","16","2013/09/01 09:15:01" -"2","11","16","2013/09/01 09:17:01" -"2","11","16","2013/09/01 09:18:01" -"2","11","16","2013/09/01 09:19:01" -"2","11","16","2013/09/01 09:20:01" -"2","11","16","2013/09/01 09:21:01" -"2","11","16","2013/09/01 09:22:01" -"2","11","16","2013/09/01 09:23:01" -"2","11","16","2013/09/01 09:24:01" -"2","11","16","2013/09/01 09:25:01" -"2","11","16","2013/09/01 09:26:01" -"2","11","16","2013/09/01 09:27:01" -"2","11","16","2013/09/01 09:28:01" -"2","11","16","2013/09/01 09:29:01" -"2","11","16","2013/09/01 09:30:01" -"2","11","16","2013/09/01 09:31:01" -"2","11","16","2013/09/01 09:33:01" -"2","11","16","2013/09/01 09:34:01" -"2","11","16","2013/09/01 09:35:01" -"2","11","16","2013/09/01 09:37:01" -"2","11","16","2013/09/01 09:38:02" -"2","11","16","2013/09/01 09:40:02" -"2","11","16","2013/09/01 09:41:01" -"2","11","16","2013/09/01 09:42:02" -"2","11","16","2013/09/01 09:43:02" -"2","11","16","2013/09/01 09:44:01" -"2","11","16","2013/09/01 09:45:02" -"2","11","16","2013/09/01 09:46:02" -"2","11","16","2013/09/01 09:47:01" -"2","11","16","2013/09/01 09:48:01" -"2","11","16","2013/09/01 09:49:01" -"2","11","16","2013/09/01 09:50:01" -"2","11","16","2013/09/01 09:51:01" -"2","11","16","2013/09/01 09:52:01" -"2","11","16","2013/09/01 09:53:01" -"2","11","16","2013/09/01 09:54:01" -"2","11","16","2013/09/01 09:56:01" -"2","11","16","2013/09/01 09:57:01" -"2","11","16","2013/09/01 09:58:01" -"2","11","16","2013/09/01 09:59:02" -"2","11","16","2013/09/01 10:00:01" -"2","11","16","2013/09/01 10:01:01" -"2","11","16","2013/09/01 10:02:01" -"2","11","16","2013/09/01 10:03:01" -"2","11","16","2013/09/01 10:05:01" -"2","11","16","2013/09/01 10:06:01" -"2","11","16","2013/09/01 10:07:02" -"2","11","16","2013/09/01 10:08:01" -"2","11","16","2013/09/01 10:09:01" -"2","11","16","2013/09/01 10:10:01" -"2","11","16","2013/09/01 10:11:02" -"2","11","16","2013/09/01 10:12:03" -"2","11","16","2013/09/01 10:13:01" -"2","11","16","2013/09/01 10:14:01" -"2","11","16","2013/09/01 10:15:01" -"2","11","16","2013/09/01 10:16:02" -"2","11","16","2013/09/01 10:17:01" -"2","11","16","2013/09/01 10:18:01" -"2","11","16","2013/09/01 10:20:01" -"2","11","16","2013/09/01 10:21:01" -"2","11","16","2013/09/01 10:22:01" -"2","11","16","2013/09/01 10:23:01" -"2","11","16","2013/09/01 10:24:01" -"2","11","16","2013/09/01 10:25:01" -"2","11","16","2013/09/01 10:26:01" -"2","11","16","2013/09/01 10:27:02" -"2","11","16","2013/09/01 10:28:01" -"2","11","16","2013/09/01 10:29:01" -"2","11","16","2013/09/01 10:30:01" -"2","11","16","2013/09/01 10:31:01" -"2","11","16","2013/09/01 10:32:01" -"2","11","16","2013/09/01 10:33:01" -"2","11","16","2013/09/01 10:34:01" -"2","11","16","2013/09/01 10:35:01" -"2","11","16","2013/09/01 10:36:02" -"2","11","16","2013/09/01 10:37:01" -"2","11","16","2013/09/01 10:38:02" -"2","11","16","2013/09/01 10:39:01" -"2","11","16","2013/09/01 10:40:01" -"2","11","16","2013/09/01 10:41:02" -"2","11","16","2013/09/01 10:43:01" -"2","10","17","2013/09/01 10:44:01" -"2","10","17","2013/09/01 10:45:02" -"2","10","17","2013/09/01 10:46:02" -"2","10","17","2013/09/01 10:47:01" -"2","10","17","2013/09/01 10:48:01" -"2","11","16","2013/09/01 10:49:01" -"2","11","16","2013/09/01 10:50:02" -"2","11","16","2013/09/01 10:51:02" -"2","11","16","2013/09/01 10:52:01" -"2","11","16","2013/09/01 10:53:01" -"2","11","16","2013/09/01 10:55:01" -"2","11","16","2013/09/01 10:56:01" -"2","11","16","2013/09/01 10:57:03" -"2","11","16","2013/09/01 10:58:01" -"2","11","16","2013/09/01 10:59:02" -"2","11","16","2013/09/01 11:00:01" -"2","11","16","2013/09/01 11:01:01" -"2","11","16","2013/09/01 11:02:01" -"2","11","16","2013/09/01 11:03:01" -"2","11","16","2013/09/01 11:04:01" -"2","11","16","2013/09/01 11:05:01" -"2","11","16","2013/09/01 11:06:01" -"2","11","16","2013/09/01 11:07:01" -"2","11","16","2013/09/01 11:09:01" -"2","11","16","2013/09/01 11:10:02" -"2","11","16","2013/09/01 11:11:04" -"2","11","16","2013/09/01 11:12:01" -"2","11","16","2013/09/01 11:14:01" -"2","11","16","2013/09/01 11:15:01" -"2","11","16","2013/09/01 11:16:01" -"2","11","16","2013/09/01 11:17:01" -"2","11","16","2013/09/01 11:18:02" -"2","11","16","2013/09/01 11:19:02" -"2","11","16","2013/09/01 11:20:01" -"2","11","16","2013/09/01 11:21:01" -"2","11","16","2013/09/01 11:22:01" -"2","11","16","2013/09/01 11:23:01" -"2","10","17","2013/09/01 11:24:01" -"2","10","17","2013/09/01 11:25:01" -"2","10","17","2013/09/01 11:26:01" -"2","10","17","2013/09/01 11:27:03" -"2","10","17","2013/09/01 11:28:01" -"2","11","16","2013/09/01 11:30:01" -"2","11","16","2013/09/01 11:31:02" -"2","11","16","2013/09/01 11:32:03" -"2","11","16","2013/09/01 11:33:01" -"2","11","16","2013/09/01 11:34:01" -"2","11","16","2013/09/01 11:35:02" -"2","11","16","2013/09/01 11:36:01" -"2","11","16","2013/09/01 11:37:01" -"2","11","16","2013/09/01 11:38:01" -"2","11","16","2013/09/01 11:39:01" -"2","11","16","2013/09/01 11:40:01" -"2","11","16","2013/09/01 11:41:01" -"2","11","16","2013/09/01 11:42:01" -"2","11","16","2013/09/01 11:43:01" -"2","11","16","2013/09/01 11:44:01" -"2","11","16","2013/09/01 11:45:01" -"2","11","16","2013/09/01 11:46:01" -"2","11","16","2013/09/01 11:47:01" -"2","11","16","2013/09/01 11:48:01" -"2","11","16","2013/09/01 11:49:01" -"2","11","16","2013/09/01 11:50:01" -"2","11","16","2013/09/01 11:51:01" -"2","11","16","2013/09/01 11:52:02" -"2","11","16","2013/09/01 11:53:01" -"2","11","16","2013/09/01 11:54:01" -"2","11","16","2013/09/01 11:55:01" -"2","11","16","2013/09/01 11:56:01" -"2","11","16","2013/09/01 11:57:02" -"2","11","16","2013/09/01 11:58:02" -"2","11","16","2013/09/01 11:59:01" -"2","10","17","2013/09/01 12:00:01" -"2","10","17","2013/09/01 12:01:02" -"2","10","17","2013/09/01 12:02:01" -"2","10","17","2013/09/01 12:03:01" -"2","10","17","2013/09/01 12:04:01" -"2","10","17","2013/09/01 12:05:02" -"2","10","17","2013/09/01 12:06:01" -"2","10","17","2013/09/01 12:07:02" -"2","10","17","2013/09/01 12:09:01" -"2","10","17","2013/09/01 12:10:02" -"2","10","17","2013/09/01 12:11:01" -"2","10","17","2013/09/01 12:12:02" -"2","10","17","2013/09/01 12:13:02" -"2","10","17","2013/09/01 12:14:01" -"2","10","17","2013/09/01 12:15:01" -"2","10","17","2013/09/01 12:16:02" -"2","10","17","2013/09/01 12:17:01" -"2","10","17","2013/09/01 12:18:01" -"2","10","17","2013/09/01 12:19:01" -"2","10","17","2013/09/01 12:21:02" -"2","10","17","2013/09/01 12:22:01" -"2","10","17","2013/09/01 12:23:01" -"2","10","17","2013/09/01 12:24:01" -"2","10","17","2013/09/01 12:25:02" -"2","10","17","2013/09/01 12:26:01" -"2","10","17","2013/09/01 12:27:01" -"2","10","17","2013/09/01 12:28:01" -"2","10","17","2013/09/01 12:29:01" -"2","10","17","2013/09/01 12:30:01" -"2","10","17","2013/09/01 12:31:02" -"2","10","17","2013/09/01 12:32:01" -"2","10","17","2013/09/01 12:33:01" -"2","10","17","2013/09/01 12:34:01" -"2","10","17","2013/09/01 12:36:01" -"2","10","17","2013/09/01 12:37:02" -"2","10","17","2013/09/01 12:38:01" -"2","10","17","2013/09/01 12:40:01" -"2","10","17","2013/09/01 12:41:01" -"2","10","17","2013/09/01 12:42:01" -"2","10","17","2013/09/01 12:43:02" -"2","10","17","2013/09/01 12:44:01" -"2","10","17","2013/09/01 12:45:01" -"2","10","17","2013/09/01 12:46:01" -"2","10","17","2013/09/01 12:47:01" -"2","10","17","2013/09/01 12:48:01" -"2","9","18","2013/09/01 12:49:01" -"2","9","18","2013/09/01 12:50:02" -"2","9","18","2013/09/01 12:51:01" -"2","9","18","2013/09/01 12:52:03" -"2","9","18","2013/09/01 12:53:01" -"2","9","18","2013/09/01 12:54:01" -"2","9","18","2013/09/01 12:55:01" -"2","9","18","2013/09/01 12:56:02" -"2","9","18","2013/09/01 12:57:04" -"2","9","18","2013/09/01 12:58:01" -"2","9","18","2013/09/01 12:59:01" -"2","9","18","2013/09/01 13:00:02" -"2","9","18","2013/09/01 13:01:01" -"2","9","18","2013/09/01 13:02:01" -"2","9","18","2013/09/01 13:03:01" -"2","9","18","2013/09/01 13:04:01" -"2","9","18","2013/09/01 13:05:01" -"2","9","18","2013/09/01 13:06:01" -"2","9","18","2013/09/01 13:07:01" -"2","9","18","2013/09/01 13:08:02" -"2","9","18","2013/09/01 13:09:01" -"2","9","18","2013/09/01 13:10:01" -"2","9","18","2013/09/01 13:11:01" -"2","9","18","2013/09/01 13:12:01" -"2","7","20","2013/09/01 13:13:01" -"2","7","20","2013/09/01 13:14:01" -"2","7","20","2013/09/01 13:15:01" -"2","7","20","2013/09/01 13:16:02" -"2","7","20","2013/09/01 13:17:01" -"2","7","20","2013/09/01 13:18:01" -"2","7","20","2013/09/01 13:19:01" -"2","7","20","2013/09/01 13:20:01" -"2","7","20","2013/09/01 13:21:01" -"2","7","20","2013/09/01 13:22:01" -"2","7","20","2013/09/01 13:23:01" -"2","7","20","2013/09/01 13:24:01" -"2","7","20","2013/09/01 13:25:02" -"2","7","20","2013/09/01 13:26:02" -"2","7","20","2013/09/01 13:27:01" -"2","7","20","2013/09/01 13:28:01" -"2","7","20","2013/09/01 13:29:01" -"2","7","20","2013/09/01 13:30:01" -"2","7","20","2013/09/01 13:31:01" -"2","7","20","2013/09/01 13:32:01" -"2","7","20","2013/09/01 13:33:02" -"2","7","20","2013/09/01 13:35:01" -"2","7","20","2013/09/01 13:36:02" -"2","7","20","2013/09/01 13:37:01" -"2","7","20","2013/09/01 13:38:01" -"2","7","20","2013/09/01 13:40:01" -"2","7","20","2013/09/01 13:41:01" -"2","7","20","2013/09/01 13:42:01" -"2","7","20","2013/09/01 13:44:01" -"2","7","20","2013/09/01 13:45:01" -"2","7","20","2013/09/01 13:46:01" -"2","7","20","2013/09/01 13:47:01" -"2","7","20","2013/09/01 13:48:01" -"2","7","20","2013/09/01 13:50:01" -"2","7","20","2013/09/01 13:51:01" -"2","7","20","2013/09/01 13:52:01" -"2","7","20","2013/09/01 13:53:01" -"2","7","20","2013/09/01 13:54:01" -"2","7","20","2013/09/01 13:55:01" -"2","7","20","2013/09/01 13:56:01" -"2","7","20","2013/09/01 13:57:01" -"2","7","20","2013/09/01 13:58:01" -"2","7","20","2013/09/01 13:59:01" -"2","7","20","2013/09/01 14:00:02" -"2","7","20","2013/09/01 14:01:01" -"2","7","20","2013/09/01 14:03:01" -"2","7","20","2013/09/01 14:04:01" -"2","7","20","2013/09/01 14:05:01" -"2","7","20","2013/09/01 14:06:02" -"2","7","20","2013/09/01 14:07:01" -"2","7","20","2013/09/01 14:08:01" -"2","7","20","2013/09/01 14:10:01" -"2","7","20","2013/09/01 14:12:01" -"2","7","20","2013/09/01 14:14:01" -"2","7","20","2013/09/01 14:15:01" -"2","7","20","2013/09/01 14:16:01" -"2","7","20","2013/09/01 14:18:01" -"2","7","20","2013/09/01 14:19:01" -"2","7","20","2013/09/01 14:20:02" -"2","7","20","2013/09/01 14:21:01" -"2","7","20","2013/09/01 14:22:01" -"2","7","20","2013/09/01 14:23:01" -"2","7","20","2013/09/01 14:24:01" -"2","7","20","2013/09/01 14:25:01" -"2","7","20","2013/09/01 14:26:01" -"2","7","20","2013/09/01 14:28:01" -"2","7","20","2013/09/01 14:29:01" -"2","7","20","2013/09/01 14:30:01" -"2","7","20","2013/09/01 14:31:02" -"2","7","20","2013/09/01 14:32:01" -"2","7","20","2013/09/01 14:33:02" -"2","7","20","2013/09/01 14:34:01" -"2","7","20","2013/09/01 14:35:01" -"2","7","20","2013/09/01 14:36:02" -"2","7","20","2013/09/01 14:37:01" -"2","7","20","2013/09/01 14:38:01" -"2","7","20","2013/09/01 14:39:01" -"2","7","20","2013/09/01 14:40:01" -"2","7","20","2013/09/01 14:41:01" -"2","7","20","2013/09/01 14:42:01" -"2","7","20","2013/09/01 14:43:02" -"2","7","20","2013/09/01 14:44:02" -"2","7","20","2013/09/01 14:45:01" -"2","7","20","2013/09/01 14:47:01" -"2","6","21","2013/09/01 14:48:01" -"2","6","21","2013/09/01 14:49:01" -"2","6","21","2013/09/01 14:50:01" -"2","6","21","2013/09/01 14:51:01" -"2","6","21","2013/09/01 14:52:03" -"2","6","21","2013/09/01 14:53:01" -"2","6","21","2013/09/01 14:54:02" -"2","6","21","2013/09/01 14:55:03" -"2","6","21","2013/09/01 14:56:01" -"2","6","21","2013/09/01 14:57:03" -"2","6","21","2013/09/01 14:58:01" -"2","6","21","2013/09/01 14:59:01" -"2","6","21","2013/09/01 15:00:01" -"2","6","21","2013/09/01 15:01:01" -"2","6","21","2013/09/01 15:02:01" -"2","6","21","2013/09/01 15:03:01" -"2","6","21","2013/09/01 15:04:01" -"2","6","21","2013/09/01 15:05:02" -"2","6","21","2013/09/01 15:06:02" -"2","6","21","2013/09/01 15:07:01" -"2","6","21","2013/09/01 15:09:01" -"2","6","21","2013/09/01 15:10:01" -"2","6","21","2013/09/01 15:11:01" -"2","6","21","2013/09/01 15:12:01" -"2","6","21","2013/09/01 15:13:01" -"2","6","21","2013/09/01 15:14:01" -"2","6","21","2013/09/01 15:15:01" -"2","6","21","2013/09/01 15:16:01" -"2","6","21","2013/09/01 15:18:01" -"2","7","20","2013/09/01 15:20:01" -"2","7","20","2013/09/01 15:21:02" -"2","7","20","2013/09/01 15:22:02" -"2","7","20","2013/09/01 15:23:01" -"2","7","20","2013/09/01 15:24:01" -"2","7","20","2013/09/01 15:25:01" -"2","7","20","2013/09/01 15:26:02" -"2","7","20","2013/09/01 15:27:01" -"2","7","20","2013/09/01 15:28:01" -"2","7","20","2013/09/01 15:29:01" -"2","7","20","2013/09/01 15:30:02" -"2","7","20","2013/09/01 15:32:01" -"2","7","20","2013/09/01 15:33:01" -"2","7","20","2013/09/01 15:34:01" -"2","7","20","2013/09/01 15:35:02" -"2","7","20","2013/09/01 15:36:01" -"2","7","20","2013/09/01 15:38:01" -"2","7","20","2013/09/01 15:40:01" -"2","7","20","2013/09/01 15:42:01" -"2","7","20","2013/09/01 15:43:01" -"2","7","20","2013/09/01 15:44:01" -"2","7","20","2013/09/01 15:45:01" -"2","7","20","2013/09/01 15:46:01" -"2","8","19","2013/09/01 15:47:01" -"2","8","19","2013/09/01 15:48:01" -"2","8","19","2013/09/01 15:49:01" -"2","8","19","2013/09/01 15:50:01" -"2","8","19","2013/09/01 15:51:02" -"2","8","19","2013/09/01 15:52:01" -"2","8","19","2013/09/01 15:53:01" -"2","8","19","2013/09/01 15:55:01" -"2","8","19","2013/09/01 15:57:01" -"2","8","19","2013/09/01 15:58:01" -"2","8","19","2013/09/01 15:59:01" -"2","10","17","2013/09/01 16:00:01" -"2","10","17","2013/09/01 16:01:01" -"2","10","17","2013/09/01 16:02:03" -"2","10","17","2013/09/01 16:04:01" -"2","10","17","2013/09/01 16:05:01" -"2","10","17","2013/09/01 16:06:01" -"2","10","17","2013/09/01 16:07:01" -"2","10","17","2013/09/01 16:08:02" -"2","10","17","2013/09/01 16:09:02" -"2","10","17","2013/09/01 16:10:01" -"2","10","17","2013/09/01 16:11:01" -"2","10","17","2013/09/01 16:12:01" -"2","10","17","2013/09/01 16:13:01" -"2","10","17","2013/09/01 16:14:01" -"2","10","17","2013/09/01 16:15:01" -"2","10","17","2013/09/01 16:16:01" -"2","10","17","2013/09/01 16:17:01" -"2","10","17","2013/09/01 16:18:01" -"2","10","17","2013/09/01 16:19:01" -"2","10","17","2013/09/01 16:20:01" -"2","10","17","2013/09/01 16:21:02" -"2","10","17","2013/09/01 16:22:03" -"2","10","17","2013/09/01 16:23:01" -"2","10","17","2013/09/01 16:24:02" -"2","10","17","2013/09/01 16:25:01" -"2","10","17","2013/09/01 16:26:01" -"2","10","17","2013/09/01 16:27:01" -"2","10","17","2013/09/01 16:28:01" -"2","10","17","2013/09/01 16:29:01" -"2","10","17","2013/09/01 16:30:02" -"2","10","17","2013/09/01 16:31:01" -"2","10","17","2013/09/01 16:33:01" -"2","10","17","2013/09/01 16:34:01" -"2","10","17","2013/09/01 16:35:01" -"2","10","17","2013/09/01 16:36:01" -"2","10","17","2013/09/01 16:37:03" -"2","10","17","2013/09/01 16:38:01" -"2","10","17","2013/09/01 16:40:01" -"2","10","17","2013/09/01 16:41:01" -"2","10","17","2013/09/01 16:42:03" -"2","10","17","2013/09/01 16:43:01" -"2","10","17","2013/09/01 16:44:01" -"2","10","17","2013/09/01 16:45:02" -"2","10","17","2013/09/01 16:46:03" -"2","10","17","2013/09/01 16:47:01" -"2","10","17","2013/09/01 16:48:02" -"2","10","17","2013/09/01 16:49:01" -"2","10","17","2013/09/01 16:50:01" -"2","10","17","2013/09/01 16:51:01" -"2","10","17","2013/09/01 16:52:01" -"2","10","17","2013/09/01 16:53:01" -"2","10","17","2013/09/01 16:54:01" -"2","10","17","2013/09/01 16:55:02" -"2","10","17","2013/09/01 16:56:01" -"2","10","17","2013/09/01 16:57:01" -"2","10","17","2013/09/01 16:58:01" -"2","10","17","2013/09/01 17:00:01" -"2","10","17","2013/09/01 17:01:01" -"2","10","17","2013/09/01 17:02:01" -"2","10","17","2013/09/01 17:03:01" -"2","10","17","2013/09/01 17:04:01" -"2","10","17","2013/09/01 17:05:01" -"2","10","17","2013/09/01 17:06:01" -"2","10","17","2013/09/01 17:07:01" -"2","10","17","2013/09/01 17:08:01" -"2","10","17","2013/09/01 17:10:01" -"2","10","17","2013/09/01 17:12:01" -"2","9","18","2013/09/01 17:13:01" -"2","9","18","2013/09/01 17:14:01" -"2","9","18","2013/09/01 17:15:02" -"2","9","18","2013/09/01 17:16:01" -"2","9","18","2013/09/01 17:18:01" -"2","9","18","2013/09/01 17:20:01" -"2","9","18","2013/09/01 17:21:03" -"2","9","18","2013/09/01 17:22:01" -"2","9","18","2013/09/01 17:23:01" -"2","9","18","2013/09/01 17:25:01" -"2","9","18","2013/09/01 17:28:01" -"2","9","18","2013/09/01 17:30:01" -"2","9","18","2013/09/01 17:31:01" -"2","9","18","2013/09/01 17:32:01" -"2","9","18","2013/09/01 17:33:01" -"2","9","18","2013/09/01 17:34:02" -"2","9","18","2013/09/01 17:35:01" -"2","9","18","2013/09/01 17:36:01" -"2","9","18","2013/09/01 17:37:01" -"2","9","18","2013/09/01 17:38:01" -"2","9","18","2013/09/01 17:40:01" -"2","9","18","2013/09/01 17:41:01" -"2","9","18","2013/09/01 17:42:03" -"2","9","18","2013/09/01 17:43:01" -"2","9","18","2013/09/01 17:45:02" -"2","9","18","2013/09/01 17:46:01" -"2","11","16","2013/09/01 17:47:01" -"2","11","16","2013/09/01 17:49:01" -"2","11","16","2013/09/01 17:50:02" -"2","11","16","2013/09/01 17:51:02" -"2","11","16","2013/09/01 17:52:01" -"2","11","16","2013/09/01 17:53:03" -"2","11","16","2013/09/01 17:54:01" -"2","11","16","2013/09/01 17:55:01" -"2","11","16","2013/09/01 17:56:01" -"2","11","16","2013/09/01 17:57:01" -"2","11","16","2013/09/01 17:58:01" -"2","11","16","2013/09/01 18:00:02" -"2","11","16","2013/09/01 18:01:03" -"2","11","16","2013/09/01 18:02:01" -"2","11","16","2013/09/01 18:04:01" -"2","11","16","2013/09/01 18:05:01" -"2","11","16","2013/09/01 18:06:01" -"2","11","16","2013/09/01 18:07:01" -"2","11","16","2013/09/01 18:08:01" -"2","12","15","2013/09/01 18:09:02" -"2","12","15","2013/09/01 18:10:01" -"2","12","15","2013/09/01 18:11:02" -"2","12","15","2013/09/01 18:12:01" -"2","12","15","2013/09/01 18:13:02" -"2","12","15","2013/09/01 18:14:01" -"2","12","15","2013/09/01 18:15:01" -"2","12","15","2013/09/01 18:16:01" -"2","12","15","2013/09/01 18:17:01" -"2","12","15","2013/09/01 18:18:02" -"2","12","15","2013/09/01 18:19:01" -"2","12","15","2013/09/01 18:20:01" -"2","12","15","2013/09/01 18:21:01" -"2","12","15","2013/09/01 18:22:01" -"2","12","15","2013/09/01 18:23:01" -"2","12","15","2013/09/01 18:24:02" -"2","12","15","2013/09/01 18:25:01" -"2","12","15","2013/09/01 18:26:02" -"2","12","15","2013/09/01 18:27:01" -"2","12","15","2013/09/01 18:28:02" -"2","12","15","2013/09/01 18:30:01" -"2","12","15","2013/09/01 18:31:01" -"2","12","15","2013/09/01 18:32:01" -"2","12","15","2013/09/01 18:33:01" -"2","12","15","2013/09/01 18:34:01" -"2","12","15","2013/09/01 18:35:01" -"2","12","15","2013/09/01 18:36:01" -"2","12","15","2013/09/01 18:37:01" -"2","12","15","2013/09/01 18:38:01" -"2","12","15","2013/09/01 18:39:04" -"2","12","15","2013/09/01 18:40:01" -"2","12","15","2013/09/01 18:41:01" -"2","12","15","2013/09/01 18:42:02" -"2","12","15","2013/09/01 18:43:01" -"2","12","15","2013/09/01 18:44:01" -"2","12","15","2013/09/01 18:45:01" -"2","12","15","2013/09/01 18:46:01" -"2","12","15","2013/09/01 18:47:01" -"2","12","15","2013/09/01 18:48:01" -"2","12","15","2013/09/01 18:49:01" -"2","12","15","2013/09/01 18:50:01" -"2","12","15","2013/09/01 18:51:02" -"2","12","15","2013/09/01 18:52:01" -"2","12","15","2013/09/01 18:53:01" -"2","12","15","2013/09/01 18:54:01" -"2","12","15","2013/09/01 18:55:01" -"2","12","15","2013/09/01 18:56:01" -"2","12","15","2013/09/01 18:57:03" -"2","12","15","2013/09/01 18:58:02" -"2","12","15","2013/09/01 19:00:01" -"2","12","15","2013/09/01 19:01:01" -"2","12","15","2013/09/01 19:02:01" -"2","12","15","2013/09/01 19:03:01" -"2","12","15","2013/09/01 19:04:01" -"2","12","15","2013/09/01 19:05:01" -"2","12","15","2013/09/01 19:06:01" -"2","12","15","2013/09/01 19:07:02" -"2","12","15","2013/09/01 19:08:01" -"2","12","15","2013/09/01 19:09:02" -"2","12","15","2013/09/01 19:10:01" -"2","12","15","2013/09/01 19:11:01" -"2","12","15","2013/09/01 19:12:01" -"2","12","15","2013/09/01 19:13:01" -"2","12","15","2013/09/01 19:14:01" -"2","12","15","2013/09/01 19:15:01" -"2","12","15","2013/09/01 19:16:02" -"2","12","15","2013/09/01 19:17:03" -"2","12","15","2013/09/01 19:18:01" -"2","12","15","2013/09/01 19:19:01" -"2","12","15","2013/09/01 19:20:01" -"2","12","15","2013/09/01 19:21:03" -"2","12","15","2013/09/01 19:22:01" -"2","12","15","2013/09/01 19:23:01" -"2","12","15","2013/09/01 19:24:01" -"2","12","15","2013/09/01 19:25:01" -"2","12","15","2013/09/01 19:26:01" -"2","12","15","2013/09/01 19:27:02" -"2","12","15","2013/09/01 19:28:01" -"2","12","15","2013/09/01 19:30:01" -"2","12","15","2013/09/01 19:31:03" -"2","12","15","2013/09/01 19:33:01" -"2","12","15","2013/09/01 19:35:01" -"2","12","15","2013/09/01 19:36:01" -"2","12","15","2013/09/01 19:38:01" -"2","12","15","2013/09/01 19:40:01" -"2","12","15","2013/09/01 19:41:01" -"2","12","15","2013/09/01 19:42:04" -"2","12","15","2013/09/01 19:43:02" -"2","12","15","2013/09/01 19:44:01" -"2","12","15","2013/09/01 19:45:01" -"2","12","15","2013/09/01 19:46:01" -"2","12","15","2013/09/01 19:47:01" -"2","12","15","2013/09/01 19:48:01" -"2","12","15","2013/09/01 19:50:01" -"2","12","15","2013/09/01 19:51:02" -"2","12","15","2013/09/01 19:52:01" -"2","12","15","2013/09/01 19:53:01" -"2","12","15","2013/09/01 19:54:01" -"2","12","15","2013/09/01 19:55:01" -"2","12","15","2013/09/01 19:56:01" -"2","12","15","2013/09/01 19:58:01" -"2","12","15","2013/09/01 19:59:01" -"2","12","15","2013/09/01 20:00:01" -"2","12","15","2013/09/01 20:01:01" -"2","12","15","2013/09/01 20:02:03" -"2","12","15","2013/09/01 20:04:01" -"2","12","15","2013/09/01 20:05:01" -"2","12","15","2013/09/01 20:06:02" -"2","12","15","2013/09/01 20:07:02" -"2","12","15","2013/09/01 20:08:01" -"2","12","15","2013/09/01 20:10:01" -"2","12","15","2013/09/01 20:12:01" -"2","11","16","2013/09/01 20:14:01" -"2","11","16","2013/09/01 20:15:01" -"2","11","16","2013/09/01 20:16:01" -"2","11","16","2013/09/01 20:17:01" -"2","12","15","2013/09/01 20:19:19" -"2","12","15","2013/09/01 20:21:01" -"2","12","15","2013/09/01 20:22:01" -"2","12","15","2013/09/01 20:23:02" -"2","12","15","2013/09/01 20:24:01" -"2","12","15","2013/09/01 20:25:01" -"2","12","15","2013/09/01 20:26:01" -"2","12","15","2013/09/01 20:27:01" -"2","12","15","2013/09/01 20:29:01" -"2","12","15","2013/09/01 20:30:01" -"2","12","15","2013/09/01 20:31:01" -"2","12","15","2013/09/01 20:32:01" -"2","12","15","2013/09/01 20:33:01" -"2","12","15","2013/09/01 20:34:01" -"2","12","15","2013/09/01 20:35:01" -"2","12","15","2013/09/01 20:36:01" -"2","12","15","2013/09/01 20:37:01" -"2","12","15","2013/09/01 20:38:01" -"2","12","15","2013/09/01 20:39:02" -"2","12","15","2013/09/01 20:41:01" -"2","12","15","2013/09/01 20:42:01" -"2","12","15","2013/09/01 20:43:01" -"2","12","15","2013/09/01 20:44:01" -"2","12","15","2013/09/01 20:45:02" -"2","12","15","2013/09/01 20:46:01" -"2","12","15","2013/09/01 20:47:01" -"2","12","15","2013/09/01 20:48:02" -"2","12","15","2013/09/01 20:49:01" -"2","12","15","2013/09/01 20:50:01" -"2","12","15","2013/09/01 20:51:01" -"2","12","15","2013/09/01 20:53:01" -"2","11","16","2013/09/01 20:54:01" -"2","11","16","2013/09/01 20:55:02" -"2","11","16","2013/09/01 20:56:01" -"2","11","16","2013/09/01 20:57:01" -"2","11","16","2013/09/01 20:58:02" -"2","12","15","2013/09/01 21:00:01" -"2","12","15","2013/09/01 21:01:02" -"2","12","15","2013/09/01 21:02:01" -"2","12","15","2013/09/01 21:03:01" -"2","12","15","2013/09/01 21:04:01" -"2","12","15","2013/09/01 21:05:02" -"2","12","15","2013/09/01 21:06:01" -"2","12","15","2013/09/01 21:07:03" -"2","12","15","2013/09/01 21:08:01" -"2","11","16","2013/09/01 21:09:01" -"2","11","16","2013/09/01 21:10:01" -"2","11","16","2013/09/01 21:11:01" -"2","11","16","2013/09/01 21:13:01" -"2","12","15","2013/09/01 21:14:02" -"2","12","15","2013/09/01 21:15:01" -"2","12","15","2013/09/01 21:16:02" -"2","12","15","2013/09/01 21:17:01" -"2","12","15","2013/09/01 21:18:01" -"2","11","16","2013/09/01 21:19:02" -"2","11","16","2013/09/01 21:20:01" -"2","11","16","2013/09/01 21:21:03" -"2","11","16","2013/09/01 21:22:01" -"2","11","16","2013/09/01 21:23:01" -"2","12","15","2013/09/01 21:24:01" -"2","12","15","2013/09/01 21:25:01" -"2","12","15","2013/09/01 21:26:01" -"2","12","15","2013/09/01 21:27:01" -"2","12","15","2013/09/01 21:28:01" -"2","11","16","2013/09/01 21:29:01" -"2","11","16","2013/09/01 21:30:02" -"2","11","16","2013/09/01 21:31:01" -"2","11","16","2013/09/01 21:32:03" -"2","11","16","2013/09/01 21:33:01" -"2","11","16","2013/09/01 21:34:01" -"2","11","16","2013/09/01 21:35:01" -"2","11","16","2013/09/01 21:36:02" -"2","11","16","2013/09/01 21:37:01" -"2","11","16","2013/09/01 21:38:01" -"2","12","15","2013/09/01 21:39:01" -"2","12","15","2013/09/01 21:40:01" -"2","12","15","2013/09/01 21:41:02" -"2","12","15","2013/09/01 21:42:02" -"2","12","15","2013/09/01 21:43:02" -"2","12","15","2013/09/01 21:44:01" -"2","12","15","2013/09/01 21:45:01" -"2","12","15","2013/09/01 21:46:01" -"2","12","15","2013/09/01 21:47:01" -"2","12","15","2013/09/01 21:48:01" -"2","11","16","2013/09/01 21:49:01" -"2","11","16","2013/09/01 21:50:01" -"2","11","16","2013/09/01 21:51:02" -"2","11","16","2013/09/01 21:52:01" -"2","11","16","2013/09/01 21:53:01" -"2","11","16","2013/09/01 21:54:01" -"2","11","16","2013/09/01 21:56:01" -"2","11","16","2013/09/01 21:57:01" -"2","11","16","2013/09/01 21:58:01" -"2","11","16","2013/09/01 21:59:01" -"2","11","16","2013/09/01 22:00:01" -"2","11","16","2013/09/01 22:02:01" -"2","11","16","2013/09/01 22:03:01" -"2","11","16","2013/09/01 22:04:04" -"2","11","16","2013/09/01 22:05:02" -"2","11","16","2013/09/01 22:06:01" -"2","11","16","2013/09/01 22:07:01" -"2","12","15","2013/09/01 22:09:01" -"2","12","15","2013/09/01 22:10:03" -"2","12","15","2013/09/01 22:12:01" -"2","12","15","2013/09/01 22:13:02" -"2","11","16","2013/09/01 22:14:01" -"2","11","16","2013/09/01 22:15:01" -"2","11","16","2013/09/01 22:16:01" -"2","11","16","2013/09/01 22:17:02" -"2","11","16","2013/09/01 22:18:01" -"2","12","15","2013/09/01 22:20:01" -"2","12","15","2013/09/01 22:21:01" -"2","12","15","2013/09/01 22:23:01" -"2","11","16","2013/09/01 22:24:02" -"2","11","16","2013/09/01 22:25:01" -"2","11","16","2013/09/01 22:27:01" -"2","11","16","2013/09/01 22:28:01" -"2","11","16","2013/09/01 22:30:01" -"2","11","16","2013/09/01 22:31:01" -"2","11","16","2013/09/01 22:32:01" -"2","11","16","2013/09/01 22:33:01" -"2","12","15","2013/09/01 22:34:01" -"2","12","15","2013/09/01 22:35:01" -"2","12","15","2013/09/01 22:36:01" -"2","12","15","2013/09/01 22:37:01" -"2","12","15","2013/09/01 22:38:02" -"2","11","16","2013/09/01 22:39:02" -"2","11","16","2013/09/01 22:40:02" -"2","11","16","2013/09/01 22:41:01" -"2","11","16","2013/09/01 22:43:01" -"2","12","15","2013/09/01 22:44:01" -"2","12","15","2013/09/01 22:45:01" -"2","12","15","2013/09/01 22:46:01" -"2","12","15","2013/09/01 22:47:01" -"2","12","15","2013/09/01 22:48:01" -"2","11","16","2013/09/01 22:49:01" -"2","11","16","2013/09/01 22:50:01" -"2","11","16","2013/09/01 22:51:01" -"2","11","16","2013/09/01 22:52:02" -"2","11","16","2013/09/01 22:53:01" -"2","11","16","2013/09/01 22:54:01" -"2","11","16","2013/09/01 22:55:02" -"2","11","16","2013/09/01 22:56:01" -"2","11","16","2013/09/01 22:57:02" -"2","11","16","2013/09/01 22:58:01" -"2","11","16","2013/09/01 22:59:01" -"2","11","16","2013/09/01 23:00:01" -"2","11","16","2013/09/01 23:01:01" -"2","11","16","2013/09/01 23:03:01" -"2","12","15","2013/09/01 23:04:02" -"2","12","15","2013/09/01 23:05:01" -"2","12","15","2013/09/01 23:06:01" -"2","12","15","2013/09/01 23:07:01" -"2","12","15","2013/09/01 23:09:01" -"2","12","15","2013/09/01 23:10:01" -"2","12","15","2013/09/01 23:11:01" -"2","12","15","2013/09/01 23:12:01" -"2","12","15","2013/09/01 23:13:01" -"2","12","15","2013/09/01 23:15:02" -"2","12","15","2013/09/01 23:16:01" -"2","12","15","2013/09/01 23:18:01" -"2","11","16","2013/09/01 23:19:01" -"2","11","16","2013/09/01 23:20:01" -"2","11","16","2013/09/01 23:21:01" -"2","11","16","2013/09/01 23:22:03" -"2","11","16","2013/09/01 23:23:01" -"2","11","16","2013/09/01 23:26:01" -"2","11","16","2013/09/01 23:27:01" -"2","11","16","2013/09/01 23:28:01" -"2","11","16","2013/09/01 23:29:01" -"2","11","16","2013/09/01 23:30:01" -"2","11","16","2013/09/01 23:31:01" -"2","11","16","2013/09/01 23:32:04" -"2","11","16","2013/09/01 23:33:01" -"2","11","16","2013/09/01 23:34:01" -"2","11","16","2013/09/01 23:35:01" -"2","11","16","2013/09/01 23:36:02" -"2","11","16","2013/09/01 23:37:03" -"2","11","16","2013/09/01 23:38:01" -"2","12","15","2013/09/01 23:40:01" -"2","12","15","2013/09/01 23:41:01" -"2","12","15","2013/09/01 23:42:01" -"2","12","15","2013/09/01 23:43:01" -"2","12","15","2013/09/01 23:45:01" -"2","12","15","2013/09/01 23:46:03" -"2","12","15","2013/09/01 23:47:02" -"2","12","15","2013/09/01 23:48:01" -"2","11","16","2013/09/01 23:49:02" -"2","11","16","2013/09/01 23:50:01" -"2","11","16","2013/09/01 23:52:01" -"2","11","16","2013/09/01 23:54:01" -"2","11","16","2013/09/01 23:55:01" -"2","11","16","2013/09/01 23:56:03" -"2","11","16","2013/09/01 23:57:01" -"2","11","16","2013/09/01 23:58:01" -"2","12","15","2013/09/01 23:59:01" -"2","12","15","2013/09/02 00:01:02" -"2","12","15","2013/09/02 00:03:02" -"2","11","16","2013/09/02 00:04:01" -"2","11","16","2013/09/02 00:05:01" -"2","11","16","2013/09/02 00:06:01" -"2","11","16","2013/09/02 00:07:01" -"2","11","16","2013/09/02 00:08:01" -"2","11","16","2013/09/02 00:09:01" -"2","11","16","2013/09/02 00:10:01" -"2","11","16","2013/09/02 00:11:03" -"2","11","16","2013/09/02 00:12:01" -"2","11","16","2013/09/02 00:13:01" -"2","11","16","2013/09/02 00:14:02" -"2","11","16","2013/09/02 00:15:01" -"2","11","16","2013/09/02 00:16:03" -"2","11","16","2013/09/02 00:17:01" -"2","11","16","2013/09/02 00:18:01" -"2","11","16","2013/09/02 00:19:01" -"2","11","16","2013/09/02 00:20:01" -"2","11","16","2013/09/02 00:21:01" -"2","11","16","2013/09/02 00:22:01" -"2","11","16","2013/09/02 00:23:01" -"2","12","15","2013/09/02 00:24:01" -"2","12","15","2013/09/02 00:25:01" -"2","12","15","2013/09/02 00:26:03" -"2","12","15","2013/09/02 00:27:01" -"2","12","15","2013/09/02 00:28:01" -"2","12","15","2013/09/02 00:29:01" -"2","12","15","2013/09/02 00:30:01" -"2","12","15","2013/09/02 00:31:01" -"2","12","15","2013/09/02 00:32:01" -"2","12","15","2013/09/02 00:33:01" -"2","11","16","2013/09/02 00:34:01" -"2","11","16","2013/09/02 00:35:01" -"2","11","16","2013/09/02 00:36:02" -"2","11","16","2013/09/02 00:37:01" -"2","11","16","2013/09/02 00:38:01" -"2","11","16","2013/09/02 00:39:01" -"2","11","16","2013/09/02 00:40:01" -"2","11","16","2013/09/02 00:41:01" -"2","11","16","2013/09/02 00:42:01" -"2","11","16","2013/09/02 00:43:01" -"2","11","16","2013/09/02 00:44:01" -"2","11","16","2013/09/02 00:45:01" -"2","11","16","2013/09/02 00:46:01" -"2","11","16","2013/09/02 00:47:02" -"2","11","16","2013/09/02 00:48:01" -"2","11","16","2013/09/02 00:49:01" -"2","11","16","2013/09/02 00:51:01" -"2","11","16","2013/09/02 00:52:01" -"2","11","16","2013/09/02 00:53:02" -"2","12","15","2013/09/02 00:55:01" -"2","12","15","2013/09/02 00:56:01" -"2","12","15","2013/09/02 00:57:03" -"2","12","15","2013/09/02 00:58:01" -"2","11","16","2013/09/02 01:00:01" -"2","11","16","2013/09/02 01:01:02" -"2","11","16","2013/09/02 01:03:01" -"2","12","15","2013/09/02 01:04:02" -"2","12","15","2013/09/02 01:05:01" -"2","12","15","2013/09/02 01:07:02" -"2","11","16","2013/09/02 01:09:01" -"2","11","16","2013/09/02 01:10:02" -"2","11","16","2013/09/02 01:11:02" -"2","11","16","2013/09/02 01:12:01" -"2","11","16","2013/09/02 01:13:04" -"2","12","15","2013/09/02 01:14:01" -"2","12","15","2013/09/02 01:15:02" -"2","12","15","2013/09/02 01:16:01" -"2","12","15","2013/09/02 01:17:03" -"2","12","15","2013/09/02 01:18:01" -"2","11","16","2013/09/02 01:20:01" -"2","11","16","2013/09/02 01:21:01" -"2","11","16","2013/09/02 01:22:01" -"2","11","16","2013/09/02 01:23:01" -"2","12","15","2013/09/02 01:24:01" -"2","12","15","2013/09/02 01:25:02" -"2","12","15","2013/09/02 01:26:02" -"2","12","15","2013/09/02 01:27:01" -"2","12","15","2013/09/02 01:28:01" -"2","12","15","2013/09/02 01:30:01" -"2","12","15","2013/09/02 01:31:01" -"2","12","15","2013/09/02 01:32:01" -"2","12","15","2013/09/02 01:33:01" -"2","11","16","2013/09/02 01:35:01" -"2","11","16","2013/09/02 01:36:01" -"2","11","16","2013/09/02 01:37:04" -"2","11","16","2013/09/02 01:38:01" -"2","11","16","2013/09/02 01:39:01" -"2","11","16","2013/09/02 01:40:02" -"2","11","16","2013/09/02 01:41:02" -"2","11","16","2013/09/02 01:42:03" -"2","11","16","2013/09/02 01:44:01" -"2","11","16","2013/09/02 01:45:01" -"2","11","16","2013/09/02 01:46:01" -"2","11","16","2013/09/02 01:48:01" -"2","12","15","2013/09/02 01:49:01" -"2","12","15","2013/09/02 01:50:02" -"2","12","15","2013/09/02 01:51:02" -"2","12","15","2013/09/02 01:52:01" -"2","12","15","2013/09/02 01:53:02" -"2","11","16","2013/09/02 01:54:01" -"2","11","16","2013/09/02 01:55:01" -"2","11","16","2013/09/02 01:56:01" -"2","11","16","2013/09/02 01:57:02" -"2","11","16","2013/09/02 01:58:02" -"2","11","16","2013/09/02 01:59:02" -"2","11","16","2013/09/02 02:00:02" -"2","11","16","2013/09/02 02:01:01" -"2","11","16","2013/09/02 02:02:01" -"2","11","16","2013/09/02 02:03:01" -"2","11","16","2013/09/02 02:04:02" -"2","11","16","2013/09/02 02:05:01" -"2","11","16","2013/09/02 02:06:01" -"2","11","16","2013/09/02 02:07:03" -"2","11","16","2013/09/02 02:08:01" -"2","11","16","2013/09/02 02:09:01" -"2","11","16","2013/09/02 02:10:01" -"2","11","16","2013/09/02 02:11:01" -"2","11","16","2013/09/02 02:12:04" -"2","11","16","2013/09/02 02:13:01" -"2","11","16","2013/09/02 02:14:01" -"2","11","16","2013/09/02 02:15:01" -"2","11","16","2013/09/02 02:16:01" -"2","11","16","2013/09/02 02:17:01" -"2","11","16","2013/09/02 02:18:02" -"2","11","16","2013/09/02 02:20:01" -"2","11","16","2013/09/02 02:21:01" -"2","11","16","2013/09/02 02:22:03" -"2","11","16","2013/09/02 02:24:01" -"2","11","16","2013/09/02 02:25:01" -"2","11","16","2013/09/02 02:26:02" -"2","11","16","2013/09/02 02:28:01" -"2","12","15","2013/09/02 02:30:01" -"2","12","15","2013/09/02 02:31:01" -"2","12","15","2013/09/02 02:32:01" -"2","12","15","2013/09/02 02:33:01" -"2","11","16","2013/09/02 02:35:01" -"2","11","16","2013/09/02 02:36:01" -"2","11","16","2013/09/02 02:38:01" -"2","12","15","2013/09/02 02:39:01" -"2","12","15","2013/09/02 02:40:03" -"2","12","15","2013/09/02 02:41:01" -"2","12","15","2013/09/02 02:42:03" -"2","12","15","2013/09/02 02:43:01" -"2","11","16","2013/09/02 02:44:01" -"2","11","16","2013/09/02 02:45:01" -"2","11","16","2013/09/02 02:46:01" -"2","11","16","2013/09/02 02:47:01" -"2","11","16","2013/09/02 02:48:01" -"2","12","15","2013/09/02 02:49:01" -"2","12","15","2013/09/02 02:50:01" -"2","12","15","2013/09/02 02:51:01" -"2","12","15","2013/09/02 02:52:03" -"2","12","15","2013/09/02 02:53:01" -"2","11","16","2013/09/02 02:55:01" -"2","11","16","2013/09/02 02:56:02" -"2","11","16","2013/09/02 02:57:01" -"2","11","16","2013/09/02 02:58:01" -"2","12","15","2013/09/02 03:00:01" -"2","12","15","2013/09/02 03:01:02" -"2","12","15","2013/09/02 03:02:01" -"2","12","15","2013/09/02 03:03:01" -"2","11","16","2013/09/02 03:05:02" -"2","11","16","2013/09/02 03:06:01" -"2","11","16","2013/09/02 03:07:01" -"2","12","15","2013/09/02 03:09:01" -"2","12","15","2013/09/02 03:10:01" -"2","12","15","2013/09/02 03:12:01" -"2","12","15","2013/09/02 03:13:01" -"2","11","16","2013/09/02 03:14:01" -"2","11","16","2013/09/02 03:15:01" -"2","11","16","2013/09/02 03:16:01" -"2","11","16","2013/09/02 03:17:02" -"2","11","16","2013/09/02 03:18:02" -"2","11","16","2013/09/02 03:20:01" -"2","11","16","2013/09/02 03:22:01" -"2","11","16","2013/09/02 03:23:01" -"2","11","16","2013/09/02 03:24:02" -"2","11","16","2013/09/02 03:25:01" -"2","11","16","2013/09/02 03:26:01" -"2","11","16","2013/09/02 03:27:01" -"2","11","16","2013/09/02 03:28:01" -"2","11","16","2013/09/02 03:29:01" -"2","11","16","2013/09/02 03:30:01" -"2","11","16","2013/09/02 03:31:01" -"2","11","16","2013/09/02 03:32:01" -"2","12","15","2013/09/02 03:34:01" -"2","12","15","2013/09/02 03:35:01" -"2","12","15","2013/09/02 03:36:02" -"2","12","15","2013/09/02 03:37:01" -"2","12","15","2013/09/02 03:39:01" -"2","12","15","2013/09/02 03:40:01" -"2","12","15","2013/09/02 03:41:01" -"2","12","15","2013/09/02 03:42:01" -"2","12","15","2013/09/02 03:43:01" -"2","12","15","2013/09/02 03:44:01" -"2","12","15","2013/09/02 03:45:01" -"2","12","15","2013/09/02 03:47:01" -"2","12","15","2013/09/02 03:48:02" -"2","11","16","2013/09/02 03:49:01" -"2","11","16","2013/09/02 03:50:02" -"2","11","16","2013/09/02 03:51:01" -"2","11","16","2013/09/02 03:52:01" -"2","11","16","2013/09/02 03:53:01" -"2","11","16","2013/09/02 03:54:01" -"2","11","16","2013/09/02 03:55:01" -"2","11","16","2013/09/02 03:56:01" -"2","11","16","2013/09/02 03:57:03" -"2","12","15","2013/09/02 03:59:01" -"2","12","15","2013/09/02 04:00:01" -"2","12","15","2013/09/02 04:02:01" -"2","12","15","2013/09/02 04:04:01" -"2","12","15","2013/09/02 04:05:01" -"2","12","15","2013/09/02 04:07:01" -"2","12","15","2013/09/02 04:08:01" -"2","11","16","2013/09/02 04:09:02" -"2","11","16","2013/09/02 04:10:01" -"2","11","16","2013/09/02 04:12:01" -"2","11","16","2013/09/02 04:13:01" -"2","11","16","2013/09/02 04:14:02" -"2","11","16","2013/09/02 04:15:02" -"2","11","16","2013/09/02 04:16:03" -"2","11","16","2013/09/02 04:18:01" -"2","11","16","2013/09/02 04:19:01" -"2","11","16","2013/09/02 04:20:01" -"2","11","16","2013/09/02 04:21:03" -"2","11","16","2013/09/02 04:22:01" -"2","11","16","2013/09/02 04:23:01" -"2","11","16","2013/09/02 04:25:01" -"2","11","16","2013/09/02 04:26:01" -"2","11","16","2013/09/02 04:27:01" -"2","11","16","2013/09/02 04:28:01" -"2","12","15","2013/09/02 04:30:01" -"2","12","15","2013/09/02 04:31:01" -"2","12","15","2013/09/02 04:32:01" -"2","12","15","2013/09/02 04:33:01" -"2","12","15","2013/09/02 04:34:01" -"2","12","15","2013/09/02 04:35:02" -"2","12","15","2013/09/02 04:36:02" -"2","12","15","2013/09/02 04:37:03" -"2","12","15","2013/09/02 04:38:01" -"2","12","15","2013/09/02 04:40:02" -"2","12","15","2013/09/02 04:41:01" -"2","12","15","2013/09/02 04:42:04" -"2","12","15","2013/09/02 04:43:02" -"2","11","16","2013/09/02 04:44:01" -"2","11","16","2013/09/02 04:45:02" -"2","11","16","2013/09/02 04:46:01" -"2","11","16","2013/09/02 04:47:01" -"2","11","16","2013/09/02 04:48:01" -"2","11","16","2013/09/02 04:49:01" -"2","11","16","2013/09/02 04:50:01" -"2","11","16","2013/09/02 04:51:01" -"2","11","16","2013/09/02 04:52:01" -"2","11","16","2013/09/02 04:53:01" -"2","11","16","2013/09/02 04:54:01" -"2","11","16","2013/09/02 04:55:01" -"2","11","16","2013/09/02 04:56:02" -"2","11","16","2013/09/02 04:57:01" -"2","11","16","2013/09/02 04:58:01" -"2","11","16","2013/09/02 04:59:01" -"2","11","16","2013/09/02 05:00:01" -"2","11","16","2013/09/02 05:01:01" -"2","11","16","2013/09/02 05:02:01" -"2","11","16","2013/09/02 05:03:01" -"2","11","16","2013/09/02 05:04:02" -"2","11","16","2013/09/02 05:05:01" -"2","11","16","2013/09/02 05:06:01" -"2","11","16","2013/09/02 05:07:01" -"2","11","16","2013/09/02 05:08:01" -"2","11","16","2013/09/02 05:09:01" -"2","11","16","2013/09/02 05:10:01" -"2","11","16","2013/09/02 05:11:01" -"2","11","16","2013/09/02 05:13:01" -"2","12","15","2013/09/02 05:14:01" -"2","12","15","2013/09/02 05:15:01" -"2","12","15","2013/09/02 05:16:03" -"2","12","15","2013/09/02 05:18:01" -"2","11","16","2013/09/02 05:19:01" -"2","11","16","2013/09/02 05:20:03" -"2","11","16","2013/09/02 05:21:01" -"2","11","16","2013/09/02 05:22:01" -"2","11","16","2013/09/02 05:23:01" -"2","11","16","2013/09/02 05:24:01" -"2","11","16","2013/09/02 05:25:01" -"2","11","16","2013/09/02 05:26:02" -"2","11","16","2013/09/02 05:27:01" -"2","11","16","2013/09/02 05:28:02" -"2","12","15","2013/09/02 05:29:01" -"2","12","15","2013/09/02 05:30:01" -"2","12","15","2013/09/02 05:31:02" -"2","12","15","2013/09/02 05:32:01" -"2","12","15","2013/09/02 05:33:02" -"2","12","15","2013/09/02 05:34:01" -"2","12","15","2013/09/02 05:35:01" -"2","12","15","2013/09/02 05:36:02" -"2","12","15","2013/09/02 05:37:02" -"2","12","15","2013/09/02 05:38:01" -"2","11","16","2013/09/02 05:40:01" -"2","11","16","2013/09/02 05:41:03" -"2","11","16","2013/09/02 05:42:01" -"2","11","16","2013/09/02 05:43:01" -"2","11","16","2013/09/02 05:44:01" -"2","11","16","2013/09/02 05:45:01" -"2","11","16","2013/09/02 05:46:01" -"2","11","16","2013/09/02 05:47:04" -"2","11","16","2013/09/02 05:48:02" -"2","11","16","2013/09/02 05:49:01" -"2","11","16","2013/09/02 05:50:01" -"2","11","16","2013/09/02 05:51:03" -"2","11","16","2013/09/02 05:52:01" -"2","11","16","2013/09/02 05:53:01" -"2","11","16","2013/09/02 05:54:01" -"2","11","16","2013/09/02 05:55:01" -"2","11","16","2013/09/02 05:56:01" -"2","11","16","2013/09/02 05:57:01" -"2","11","16","2013/09/02 05:58:01" -"2","12","15","2013/09/02 05:59:01" -"2","12","15","2013/09/02 06:00:01" -"2","12","15","2013/09/02 06:01:01" -"2","12","15","2013/09/02 06:02:01" -"2","12","15","2013/09/02 06:03:01" -"2","12","15","2013/09/02 06:04:01" -"2","12","15","2013/09/02 06:05:01" -"2","12","15","2013/09/02 06:06:01" -"2","12","15","2013/09/02 06:07:02" -"2","12","15","2013/09/02 06:08:01" -"2","11","16","2013/09/02 06:10:01" -"2","11","16","2013/09/02 06:11:02" -"2","11","16","2013/09/02 06:12:01" -"2","11","16","2013/09/02 06:13:01" -"2","12","15","2013/09/02 06:14:02" -"2","12","15","2013/09/02 06:15:01" -"2","12","15","2013/09/02 06:16:01" -"2","12","15","2013/09/02 06:17:03" -"2","12","15","2013/09/02 06:18:01" -"2","12","15","2013/09/02 06:20:01" -"2","12","15","2013/09/02 06:21:01" -"2","12","15","2013/09/02 06:22:01" -"2","12","15","2013/09/02 06:23:01" -"2","12","15","2013/09/02 06:24:01" -"2","12","15","2013/09/02 06:25:02" -"2","12","15","2013/09/02 06:26:02" -"2","12","15","2013/09/02 06:27:01" -"2","12","15","2013/09/02 06:28:01" -"2","12","15","2013/09/02 06:29:01" -"2","12","15","2013/09/02 06:30:01" -"2","12","15","2013/09/02 06:31:02" -"2","12","15","2013/09/02 06:32:01" -"2","12","15","2013/09/02 06:33:01" -"2","11","16","2013/09/02 06:35:01" -"2","11","16","2013/09/02 06:36:01" -"2","11","16","2013/09/02 06:37:01" -"2","11","16","2013/09/02 06:38:01" -"2","12","15","2013/09/02 06:40:02" -"2","12","15","2013/09/02 06:41:02" -"2","12","15","2013/09/02 06:42:01" -"2","12","15","2013/09/02 06:43:01" -"2","11","16","2013/09/02 06:45:01" -"2","11","16","2013/09/02 06:46:02" -"2","11","16","2013/09/02 06:47:01" -"2","11","16","2013/09/02 06:48:02" -"2","11","16","2013/09/02 06:50:01" -"2","11","16","2013/09/02 06:51:02" -"2","11","16","2013/09/02 06:52:01" -"2","11","16","2013/09/02 06:53:01" -"2","11","16","2013/09/02 06:54:01" -"2","11","16","2013/09/02 06:55:01" -"2","11","16","2013/09/02 06:56:01" -"2","11","16","2013/09/02 06:57:01" -"2","11","16","2013/09/02 06:58:01" -"2","12","15","2013/09/02 07:00:01" -"2","12","15","2013/09/02 07:02:01" -"2","12","15","2013/09/02 07:03:01" -"2","11","16","2013/09/02 07:04:01" -"2","11","16","2013/09/02 07:05:01" -"2","11","16","2013/09/02 07:06:02" -"2","11","16","2013/09/02 07:08:01" -"2","11","16","2013/09/02 07:09:01" -"2","11","16","2013/09/02 07:10:02" -"2","11","16","2013/09/02 07:12:01" -"2","11","16","2013/09/02 07:13:01" -"2","11","16","2013/09/02 07:15:02" -"2","11","16","2013/09/02 07:16:01" -"2","11","16","2013/09/02 07:17:01" -"2","11","16","2013/09/02 07:18:01" -"2","11","16","2013/09/02 07:19:01" -"2","11","16","2013/09/02 07:20:01" -"2","11","16","2013/09/02 07:21:01" -"2","11","16","2013/09/02 07:22:01" -"2","11","16","2013/09/02 07:23:01" -"2","11","16","2013/09/02 07:24:01" -"2","11","16","2013/09/02 07:25:01" -"2","11","16","2013/09/02 07:26:01" -"2","11","16","2013/09/02 07:27:01" -"2","11","16","2013/09/02 07:28:01" -"2","11","16","2013/09/02 07:29:01" -"2","11","16","2013/09/02 07:31:01" -"2","11","16","2013/09/02 07:32:03" -"2","11","16","2013/09/02 07:33:01" -"2","11","16","2013/09/02 07:35:01" -"2","11","16","2013/09/02 07:36:03" -"2","11","16","2013/09/02 07:37:02" -"2","11","16","2013/09/02 07:38:01" -"2","11","16","2013/09/02 07:39:01" -"2","11","16","2013/09/02 07:40:02" -"2","11","16","2013/09/02 07:41:01" -"2","11","16","2013/09/02 07:42:01" -"2","11","16","2013/09/02 07:43:01" -"2","11","16","2013/09/02 07:44:01" -"2","11","16","2013/09/02 07:45:02" -"2","11","16","2013/09/02 07:46:01" -"2","11","16","2013/09/02 07:47:01" -"2","11","16","2013/09/02 07:48:02" -"2","11","16","2013/09/02 07:50:01" -"2","11","16","2013/09/02 07:51:01" -"2","11","16","2013/09/02 07:52:01" -"2","11","16","2013/09/02 07:53:01" -"2","11","16","2013/09/02 07:54:01" -"2","11","16","2013/09/02 07:55:01" -"2","11","16","2013/09/02 07:56:02" -"2","11","16","2013/09/02 07:57:01" -"2","11","16","2013/09/02 07:59:01" -"2","11","16","2013/09/02 08:00:01" -"2","11","16","2013/09/02 08:02:01" -"2","11","16","2013/09/02 08:03:01" -"2","11","16","2013/09/02 08:04:02" -"2","11","16","2013/09/02 08:05:01" -"2","11","16","2013/09/02 08:06:02" -"2","11","16","2013/09/02 08:07:03" -"2","11","16","2013/09/02 08:08:01" -"2","11","16","2013/09/02 08:09:02" -"2","11","16","2013/09/02 08:11:01" -"2","11","16","2013/09/02 08:13:01" -"2","11","16","2013/09/02 08:14:01" -"2","11","16","2013/09/02 08:15:01" -"2","11","16","2013/09/02 08:17:03" -"2","11","16","2013/09/02 08:18:01" -"2","11","16","2013/09/02 08:19:01" -"2","11","16","2013/09/02 08:20:02" -"2","11","16","2013/09/02 08:22:03" -"2","11","16","2013/09/02 08:23:01" -"2","11","16","2013/09/02 08:24:01" -"2","11","16","2013/09/02 08:25:01" -"2","11","16","2013/09/02 08:27:03" -"2","11","16","2013/09/02 08:28:01" -"2","12","15","2013/09/02 08:30:02" -"2","12","15","2013/09/02 08:31:01" -"2","12","15","2013/09/02 08:36:02" -"2","12","15","2013/09/02 08:37:01" -"2","12","15","2013/09/02 08:38:01" -"2","12","15","2013/09/02 08:40:01" -"2","12","15","2013/09/02 08:42:03" -"2","12","15","2013/09/02 08:43:01" -"2","11","16","2013/09/02 08:44:01" -"2","11","16","2013/09/02 08:45:01" -"2","11","16","2013/09/02 08:46:03" -"2","11","16","2013/09/02 08:47:01" -"2","11","16","2013/09/02 08:48:01" -"2","11","16","2013/09/02 08:50:01" From 04d40cf23d8a0a860b36b44c1a7cbcd75832498b Mon Sep 17 00:00:00 2001 From: MarkusBonsch Date: Sun, 7 Oct 2018 00:22:09 +0200 Subject: [PATCH 18/31] Purge continued. --- CONTRIBUTING.md | 5 - CRAN_Release.cmd | 512 - DESCRIPTION | 21 - ISSUE_TEMPLATE.md | 14 - LICENSE | 373 - Makefile | 37 - NAMESPACE | 164 - NEWS.0.md | 3397 - NEWS.md | 352 - README.md | 2 - appveyor.yml | 72 - cc.R | 83 - deploy.sh | 30 - man/IDateTime.Rd | 234 - man/J.Rd | 58 - man/address.Rd | 23 - man/all.equal.data.table.Rd | 90 - man/as.data.table.Rd | 90 - man/as.data.table.xts.Rd | 27 - man/as.matrix.Rd | 63 - man/as.xts.data.table.Rd | 25 - man/assign.Rd | 149 - man/between.Rd | 72 - man/chmatch.Rd | 87 - man/copy.Rd | 41 - man/data.table-class.Rd | 33 - man/data.table.Rd | 433 - man/datatable-optimize.Rd | 156 - man/dcast.data.table.Rd | 124 - man/duplicated.Rd | 129 - man/first.Rd | 34 - man/foverlaps.Rd | 163 - man/frank.Rd | 71 - man/fread.Rd | 295 - man/fsort.Rd | 32 - man/fwrite.Rd | 120 - man/groupingsets.Rd | 68 - man/last.Rd | 36 - man/like.Rd | 27 - man/melt.data.table.Rd | 144 - man/merge.Rd | 143 - man/na.omit.data.table.Rd | 52 - man/openmp-utils.Rd | 22 - man/patterns.Rd | 33 - man/print.data.table.Rd | 60 - man/rbindlist.Rd | 65 - man/rleid.Rd | 41 - man/rowid.Rd | 49 - man/setDF.Rd | 42 - man/setDT.Rd | 59 - man/setNumericRounding.Rd | 63 - man/setattr.Rd | 73 - man/setcolorder.Rd | 38 - man/setkey.Rd | 174 - man/setops.Rd | 59 - man/setorder.Rd | 122 - man/shift.Rd | 77 - man/shouldPrint.Rd | 25 - man/special-symbols.Rd | 50 - man/split.Rd | 76 - man/subset.data.table.Rd | 55 - man/tables.Rd | 36 - man/test.data.table.Rd | 32 - man/timetaken.Rd | 24 - man/transform.data.table.Rd | 69 - man/transpose.Rd | 42 - man/truelength.Rd | 44 - man/tstrsplit.Rd | 50 - man/update.dev.pkg.Rd | 37 - memCheckImplementation/memTrack.c | 73 + memCheckImplementation/memTrack.h | 17 + src/Makevars | 9 - src/assign.c | 1025 - src/between.c | 104 - src/bmerge.c | 537 - src/chmatch.c | 81 - src/data.table.h | 150 - src/dogroups.c | 550 - src/fastmean.c | 141 - src/fcast.c | 182 - src/fmelt.c | 700 - src/forder.c | 1552 - src/frank.c | 194 - src/fread.c | 2416 - src/fread.h | 352 - src/freadLookups.h | 734 - src/freadR.c | 544 - src/freadR.h | 23 - src/fsort.c | 312 - src/fwrite.c | 892 - src/fwrite.h | 88 - src/fwriteLookups.h | 2142 - src/fwriteR.c | 252 - src/gsumm.c | 1054 - src/ijoin.c | 687 - src/init.c | 317 - src/inrange.c | 35 - src/myomp.h | 10 - src/nqrecreateindices.c | 33 - src/openmp-utils.c | 103 - src/quickselect.c | 100 - src/rbindlist.c | 964 - src/reorder.c | 140 - src/shift.c | 217 - src/subset.c | 320 - src/transpose.c | 96 - src/uniqlist.c | 254 - src/vecseq.c | 42 - src/wrappers.c | 129 - tests/autoprint.R | 46 - tests/autoprint.Rout.save | 124 - tests/knitr.R | 8 - tests/knitr.Rmd | 11 - tests/knitr.Rout.mock | 41 - tests/knitr.Rout.save | 70 - tests/main.R | 15 - tests/testthat.R | 6 - tests/testthat/test-S4.R | 56 - tests/testthat/test-data.frame-like.R | 160 - vignettes/Makefile | 7 - vignettes/css/bootstrap.css | 118 - vignettes/datatable-benchmarking.Rmd | 71 - vignettes/datatable-faq.Rmd | 616 - vignettes/datatable-importing.Rmd | 150 - vignettes/datatable-intro.Rmd | 725 - vignettes/datatable-keys-fast-subset.Rmd | 527 - vignettes/datatable-reference-semantics.Rmd | 370 - vignettes/datatable-reshape.Rmd | 263 - ...le-secondary-indices-and-auto-indexing.Rmd | 327 - vignettes/flights14.csv | 253317 --------------- 130 files changed, 90 insertions(+), 284107 deletions(-) delete mode 100644 CONTRIBUTING.md delete mode 100644 CRAN_Release.cmd delete mode 100644 DESCRIPTION delete mode 100644 ISSUE_TEMPLATE.md delete mode 100644 LICENSE delete mode 100644 Makefile delete mode 100644 NAMESPACE delete mode 100644 NEWS.0.md delete mode 100644 NEWS.md delete mode 100644 README.md delete mode 100644 appveyor.yml delete mode 100644 cc.R delete mode 100644 deploy.sh delete mode 100644 man/IDateTime.Rd delete mode 100644 man/J.Rd delete mode 100644 man/address.Rd delete mode 100644 man/all.equal.data.table.Rd delete mode 100644 man/as.data.table.Rd delete mode 100644 man/as.data.table.xts.Rd delete mode 100644 man/as.matrix.Rd delete mode 100644 man/as.xts.data.table.Rd delete mode 100644 man/assign.Rd delete mode 100644 man/between.Rd delete mode 100644 man/chmatch.Rd delete mode 100644 man/copy.Rd delete mode 100644 man/data.table-class.Rd delete mode 100644 man/data.table.Rd delete mode 100644 man/datatable-optimize.Rd delete mode 100644 man/dcast.data.table.Rd delete mode 100644 man/duplicated.Rd delete mode 100644 man/first.Rd delete mode 100644 man/foverlaps.Rd delete mode 100644 man/frank.Rd delete mode 100644 man/fread.Rd delete mode 100644 man/fsort.Rd delete mode 100644 man/fwrite.Rd delete mode 100644 man/groupingsets.Rd delete mode 100644 man/last.Rd delete mode 100644 man/like.Rd delete mode 100644 man/melt.data.table.Rd delete mode 100644 man/merge.Rd delete mode 100644 man/na.omit.data.table.Rd delete mode 100644 man/openmp-utils.Rd delete mode 100644 man/patterns.Rd delete mode 100644 man/print.data.table.Rd delete mode 100644 man/rbindlist.Rd delete mode 100644 man/rleid.Rd delete mode 100644 man/rowid.Rd delete mode 100644 man/setDF.Rd delete mode 100644 man/setDT.Rd delete mode 100644 man/setNumericRounding.Rd delete mode 100644 man/setattr.Rd delete mode 100644 man/setcolorder.Rd delete mode 100644 man/setkey.Rd delete mode 100644 man/setops.Rd delete mode 100644 man/setorder.Rd delete mode 100644 man/shift.Rd delete mode 100644 man/shouldPrint.Rd delete mode 100644 man/special-symbols.Rd delete mode 100644 man/split.Rd delete mode 100644 man/subset.data.table.Rd delete mode 100644 man/tables.Rd delete mode 100644 man/test.data.table.Rd delete mode 100644 man/timetaken.Rd delete mode 100644 man/transform.data.table.Rd delete mode 100644 man/transpose.Rd delete mode 100644 man/truelength.Rd delete mode 100644 man/tstrsplit.Rd delete mode 100644 man/update.dev.pkg.Rd create mode 100644 memCheckImplementation/memTrack.c create mode 100644 memCheckImplementation/memTrack.h delete mode 100644 src/Makevars delete mode 100644 src/assign.c delete mode 100644 src/between.c delete mode 100644 src/bmerge.c delete mode 100644 src/chmatch.c delete mode 100644 src/data.table.h delete mode 100644 src/dogroups.c delete mode 100644 src/fastmean.c delete mode 100644 src/fcast.c delete mode 100644 src/fmelt.c delete mode 100644 src/forder.c delete mode 100644 src/frank.c delete mode 100644 src/fread.c delete mode 100644 src/fread.h delete mode 100644 src/freadLookups.h delete mode 100644 src/freadR.c delete mode 100644 src/freadR.h delete mode 100644 src/fsort.c delete mode 100644 src/fwrite.c delete mode 100644 src/fwrite.h delete mode 100644 src/fwriteLookups.h delete mode 100644 src/fwriteR.c delete mode 100644 src/gsumm.c delete mode 100644 src/ijoin.c delete mode 100644 src/init.c delete mode 100644 src/inrange.c delete mode 100644 src/myomp.h delete mode 100644 src/nqrecreateindices.c delete mode 100644 src/openmp-utils.c delete mode 100644 src/quickselect.c delete mode 100644 src/rbindlist.c delete mode 100644 src/reorder.c delete mode 100644 src/shift.c delete mode 100644 src/subset.c delete mode 100644 src/transpose.c delete mode 100644 src/uniqlist.c delete mode 100644 src/vecseq.c delete mode 100644 src/wrappers.c delete mode 100644 tests/autoprint.R delete mode 100644 tests/autoprint.Rout.save delete mode 100644 tests/knitr.R delete mode 100644 tests/knitr.Rmd delete mode 100644 tests/knitr.Rout.mock delete mode 100644 tests/knitr.Rout.save delete mode 100644 tests/main.R delete mode 100644 tests/testthat.R delete mode 100644 tests/testthat/test-S4.R delete mode 100644 tests/testthat/test-data.frame-like.R delete mode 100644 vignettes/Makefile delete mode 100644 vignettes/css/bootstrap.css delete mode 100644 vignettes/datatable-benchmarking.Rmd delete mode 100644 vignettes/datatable-faq.Rmd delete mode 100644 vignettes/datatable-importing.Rmd delete mode 100644 vignettes/datatable-intro.Rmd delete mode 100644 vignettes/datatable-keys-fast-subset.Rmd delete mode 100644 vignettes/datatable-reference-semantics.Rmd delete mode 100644 vignettes/datatable-reshape.Rmd delete mode 100644 vignettes/datatable-secondary-indices-and-auto-indexing.Rmd delete mode 100644 vignettes/flights14.csv diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md deleted file mode 100644 index 4d13f24584..0000000000 --- a/CONTRIBUTING.md +++ /dev/null @@ -1,5 +0,0 @@ -Contribution guidelines are [**here**](https://github.com/Rdatatable/data.table/wiki/Contributing) on the project's wiki : - -* so it can be revised easily in one place by anyone -* so that revsions do not trigger Travis and Appveyor checks - diff --git a/CRAN_Release.cmd b/CRAN_Release.cmd deleted file mode 100644 index e01c29383a..0000000000 --- a/CRAN_Release.cmd +++ /dev/null @@ -1,512 +0,0 @@ -############################################### -# Basic checks -############################################### - -sudo apt-get update -sudo apt-get upgrade -R -update.packages(ask=FALSE) -# See here for getting R.oo to install: https://github.com/HenrikBengtsson/R.utils/issues/29 -q("no") - -# Ensure latest version of R otherwise problems with CRAN not finding dependents that depend on latest R -# e.g. mirror may have been disabled in sources.list when upgrading ubuntu - -rm ./src/*.so -rm ./src/*.o -rm -rf ./data.table.Rcheck - -# Ensure no non-ASCII, other than in README.md is ok -# tests.Rraw in particular have failed CRAN Solaris (only) due to this. -grep -RI --exclude-dir=".git" --exclude="*.md" --exclude="*~" --color='auto' -P -n "[\x80-\xFF]" ./ - -# No unicode either?! Put these tests in DtNonAsciiTests package. Trying this again to see what happens now that Solaris is dead. Tests 1864.1 and 1864.2 -grep -RI --exclude-dir=".git" --exclude="*.md" --exclude="*~" --color='auto' -n "[\]u[0-9]" ./ - -# Ensure no calls to omp_set_num_threads() [to avoid affecting other packages and base R] -# Only comments referring to it should be in openmp-utils.c -grep omp_set_num_threads ./src/* - -# Ensure no calls to omp_get_max_threads() also since access should be via getDTthreads() -grep --exclude="./src/openmp-utils.c" omp_get_max_threads ./src/* - -# Ensure all #pragama omp parallel directives include a num_threads() clause -grep "pragma omp parallel" ./src/*.c - -# Ensure all .Call's first argument are unquoted. TODO - change to use INHERITS() -grep "[.]Call(\"" ./R/*.R - -# Ensure no Rprintf in init.c -grep "Rprintf" ./src/init.c - -# workaround for IBM AIX - ensure no globals named 'nearest' or 'class'. -# See https://github.com/Rdatatable/data.table/issues/1351 -grep "nearest *=" ./src/*.c # none -grep "class *=" ./src/*.c # quite a few but none global - -# No undefined type punning of the form: *(long long *)&REAL(column)[i] -# Failed clang 3.9.1 -O3 due to this, I think. -grep "&REAL" ./src/*.c - -# No use of long long, instead use int64_t. TODO -# grep "long long" ./src/*.c - -# No tabs in C or R code (sorry, Richard Hendricks) -grep -P "\t" ./R/*.R -grep -P "\t" ./src/*.c - -# No T or F symbols in tests.Rraw. 24 valid F (quoted, column name or in data) and 1 valid T at the time of writing -grep -n "[^A-Za-z0-9]T[^A-Za-z0-9]" ./inst/tests/tests.Rraw -grep -n "[^A-Za-z0-9]F[^A-Za-z0-9]" ./inst/tests/tests.Rraw - -# No system.time in main tests.Rraw. Timings should be in benchmark.Rraw -grep -n "system[.]time" ./inst/tests/tests.Rraw - -# seal leak potential where two unprotected API calls are passed to the same -# function call, usually involving install() or mkChar() -# Greppable thanks to single lines and wide screens -# See comments in init.c -cd ./src -grep install.*alloc *.c --exclude init.c -grep install.*Scalar *.c -grep alloc.*install *.c --exclude init.c -grep Scalar.*install *.c -grep mkChar.*alloc *.c -grep mkChar.*Scalar *.c -grep alloc.*mkChar *.c -grep Scalar.*mkChar *.c -grep "getAttrib.*mk" *.c # use sym_* in getAttrib calls -grep "PROTECT *( *getAttrib" *.c # attributes are already protected -grep "\"starts\"" *.c --exclude init.c -grep "setAttrib(" *.c # scan all setAttrib calls manually as a double-check -grep "install(" *.c --exclude init.c # TODO: perhaps in future pre-install all constants -grep mkChar *.c # see comment in bmerge.c about passing this grep. I'm not sure char_ is really necessary, though. - -# ScalarInteger and ScalarString allocate and must be PROTECTed unless i) returned (which protects), -# or ii) passed to setAttrib (which protects, providing leak-seals above are ok) -# ScalarLogical in R now returns R's global TRUE from R 3.1.0; Apr 2014. Before that it allocated. -# Aside: ScalarInteger may return globals for small integers in future version of R. -grep ScalarInteger *.c # Check all Scalar* either PROTECTed, return-ed or passed to setAttrib. -grep ScalarLogical *.c # Now we depend on 3.1.0, check ScalarLogical is NOT PROTECTed. -grep ScalarString *.c - -# Inspect missing PROTECTs -# To pass this grep is why we like SET_VECTOR_ELT(,,var=allocVector()) style on one line. -# If a PROTECT is not needed then a comment is added explaining why and including "PROTECT" in the comment to pass this grep -grep allocVector *.c | grep -v PROTECT | grep -v SET_VECTOR_ELT | grep -v setAttrib | grep -v return - -cd -R -cc(clean=TRUE) # to compile with -pedandic. Also use very latest gcc (currently gcc-7) as CRAN does -saf = options()$stringsAsFactors -options(stringsAsFactors=!saf) # check tests (that might be run by user) are insensitive to option, #2718 -cc() -q("no") -R CMD build data.table -R CMD check data.table_1.10.1.tar.gz --as-cran # remove.packages("xml2") first to prevent the 150 URLs in NEWS.md being pinged by --as-cran -R CMD INSTALL data.table_1.10.1.tar.gz -R -require(data.table) -test.data.table() -test.data.table(verbose=TRUE) # since main.R no longer tests verbose mode - -# Upload to win-builder, both release and dev - - -############################################### -# R 3.1.0 (stated dependency) -############################################### - -### ONE TIME BUILD -sudo apt-get -y build-dep r-base -cd ~/build -wget http://cran.stat.ucla.edu/src/base/R-3/R-3.1.0.tar.gz -tar xvf R-3.1.0.tar.gz -cd R-3.1.0 -./configure --without-recommended-packages -make -alias R310=~/build/R-3.1.0/bin/R -### END ONE TIME BUILD - -R310 CMD INSTALL ./data.table_1.10.5.tar.gz -R310 -require(data.table) -test.data.table() - - -############################################### -# Compiles from source when OpenMP is disabled -############################################### -vi ~/.R/Makevars -# Make line SHLIB_OPENMP_CFLAGS= active to remove -fopenmp -R CMD build . -R CMD INSTALL data.table_1.10.5.tar.gz # ensure that -fopenmp is missing and there are no warnings -R -require(data.table) # observe startup message about no OpenMP detected -test.data.table() - - -############################################### -# valgrind -############################################### - -# TODO: compile R with --with-valgrind-instrumentation=2 too as per R-exts$4.3.2 -vi ~/.R/Makevars # make the -O0 -g line active, for info on source lines with any problems -R --vanilla CMD INSTALL data.table_1.10.5.tar.gz -R -d "valgrind --tool=memcheck --leak-check=full --show-leak-kinds=definite" --vanilla -require(data.table) -require(bit64) -test.data.table() - -gctorture(TRUE) # very very slow, though. Don't run with suggests tests. -gctorture2(step=100) -test.data.table() - -# Investigated and ignore : -# Tests 648 and 1262 (see their comments) have single precision issues under valgrind that don't occur on CRAN, even Solaris. -# Ignore all "set address range perms" warnings : -# http://stackoverflow.com/questions/13558067/what-does-this-valgrind-warning-mean-warning-set-address-range-perms -# Ignore heap summaries around test 1705 and 1707/1708 due to the fork() test opening/closing, I guess. -# Tests 1729.4, 1729.8, 1729.11, 1729.13 again have precision issues under valgrind only. -# Leaks for tests 1738.5, 1739.3 but no data.table .c lines are flagged, rather libcairo.so -# and libfontconfig.so via GEMetricInfo and GEStrWidth in libR.so - -vi ~/.R/Makevars # make the -O3 line active again - - -##################################################### -# R-devel with UBSAN, ASAN and strict-barrier on too -##################################################### - -cd ~/build -wget -N https://stat.ethz.ch/R/daily/R-devel.tar.gz -rm -rf R-devel -tar xvf R-devel.tar.gz -cd R-devel -# Following R-exts#4.3.3 - -./configure --without-recommended-packages --disable-byte-compiled-packages --disable-openmp --enable-strict-barrier CC="gcc -fsanitize=undefined,address -fno-sanitize=float-divide-by-zero -fno-omit-frame-pointer" CFLAGS="-O0 -g -Wall -pedantic" LIBS="-lpthread" -# For ubsan, disabled openmp otherwise gcc fails in R's distance.c:256 error: ‘*.Lubsan_data0’ not specified in enclosing parallel -# UBSAN gives direct line number under gcc but not clang it seems. clang-5.0 has been helpful too, though. -# If use later gcc-8, add F77=gfortran-8 -# LIBS="-lpthread" otherwise ld error about DSO missing - -## Rarely needed: 32bit on 64bit Ubuntu for tracing any 32bit-only problems -dpkg --add-architecture i386 -apt-get update -apt-get install libc6:i386 libstdc++6:i386 gcc-multilib g++-multilib gfortran-multilib libbz2-dev:i386 liblzma-dev:i386 libpcre3-dev:i386 libcurl3-dev:i386 libstdc++-7-dev:i386 -sudo apt-get purge libcurl4-openssl-dev # cannot coexist, it seems -sudo apt-get install libcurl4-openssl-dev:i386 -cd ~/build/32bit/R-devel -./configure --without-recommended-packages --disable-byte-compiled-packages --disable-openmp --without-readline --without-x CC="gcc -m32" CXX="g++ -m32" F77="gfortran -m32" FC=${F77} OBJC=${CC} LDFLAGS="-L/usr/local/lib" LIBnn=lib LIBS="-lpthread" CFLAGS="-O0 -g -Wall -pedantic" - -make -alias Rdevel='~/build/R-devel/bin/R --vanilla' -Rdevel CMD INSTALL data.table_1.10.5.tar.gz -# Check UBSAN and ASAN flags appear in compiler output above. Rdevel was compiled with -# them so should be passed through to here -Rdevel -install.packages("bit64") # important to run tests using integer64 -# Skip compatibility tests with other Suggests packages; unlikely UBSAN/ASAN problems there. -require(data.table) -require(bit64) -test.data.table() # slower than usual of course due to UBSAN and ASAN. Too slow to run R CMD check. -# Throws /0 errors on R's summary.c (tests 648 and 1185.2) but ignore those: https://bugs.r-project.org/bugzilla3/show_bug.cgi?id=16000 -q("no") - -# Rebuild without ASAN/UBSAN and test again under torture -make clean -./configure --without-recommended-packages --disable-byte-compiled-packages --disable-openmp CC="gcc -fno-omit-frame-pointer" CFLAGS="-O0 -g -Wall -pedantic" LIBS="-lpthread" -make -Rdevel CMD INSTALL data.table_1.10.5.tar.gz -install.packages("bit64") -require(bit64) -require(data.table) -test.data.table() # just quick re-check -gctorture2(step=100) # 1h 26m -print(Sys.time()); started.at<-proc.time(); try(test.data.table()); print(Sys.time()); print(timetaken(started.at)) -# Running test id 1437.0331 Error : protect(): protection stack overflow - - -############################################################################# -# TODO: recompile without USE_RINTERNALS and recheck write barrier under ASAN -############################################################################# -There are some things to overcome to achieve compile without USE_RINTERNALS, though. - - -############################################### -# Single precision e.g. CRAN's Solaris Sparc -############################################### - -# Adding --disable-long-double (see R-exts) in the same configure as ASAN/UBSAN fails. Hence separately. - -cd ~/build -rm -rf R-devel # 'make clean' isn't enough: results in link error, oddly. -tar xvf R-devel.tar.gz -cd R-devel -./configure CC="gcc -std=gnu99" CFLAGS="-O0 -g -Wall -pedantic -ffloat-store -fexcess-precision=standard" --without-recommended-packages --disable-byte-compiled-packages --disable-long-double -make -Rdevel -install.packages("bit64") -q("no") -Rdevel CMD INSTALL ~/data.table_1.9.9.tar.gz -Rdevel -.Machine$sizeof.longdouble # check 0 -require(data.table) -require(bit64) -test.data.table() -q("no") - - -############################################### -# QEMU to emulate big endian -############################################### - -# http://www.aurel32.net/info/debian_sparc_qemu.php -# https://people.debian.org/~aurel32/qemu/powerpc/ - -### IF NOT ALREADY DONE -sudo apt-get -y install qemu -sudo apt-get -y install openbios-ppc -cd ~/build -wget https://people.debian.org/~aurel32/qemu/powerpc/debian_wheezy_powerpc_standard.qcow2 -### ENDIF - -qemu-system-ppc -hda debian_wheezy_powerpc_standard.qcow2 -nographic -root, root -lscpu # confirm big endian -wget http://cran.r-project.org/src/base/R-latest.tar.gz -tar xvf R-latest.tar.gz -cd R-3.2.1 -apt-get update -apt-get build-dep r-base -uptime # the first time, several hours. But it saves the disk image in the .qcow2 file so be sure not to wipe it -./configure CFLAGS="-O0 -g" --without-recommended-packages --disable-byte-compiled-packages -# -O0 to compile quicker. Keeping -g in case needed to debug -make -alias R=$PWD/bin/R -cd ~ -wget -N https://github.com/Rdatatable/data.table/archive/master.zip # easiest way; avoids setting up share between host and qemu -apt-get install unzip -unzip master.zip -mv data.table-master data.table -R CMD build --no-build-vignettes data.table -# R CMD check requires many packages in Suggests. Too long under emulation. Instead run data.table's test suite directly -R -options(repos = "http://cran.stat.ucla.edu") -install.packages("chron") # takes a minute or so to start download and install. -install.packages("bit64") # important to test data.table with integer64 on big endian -q("no") -R CMD INSTALL data.table_1.9.5.tar.gz -R -.Platform$endian -require(data.table) -test.data.table() -q() -shutdown now # doesn't return you to host prompt properly so just kill the window. http://comments.gmane.org/gmane.linux.embedded.yocto.general/3410 - - -############################################### -# Downstream dependencies -############################################### - -# IF NOT ALREADY INSTALLED -sudo apt-get update -sudo apt-get -y install htop -sudo apt-get -y install r-base r-base-dev -sudo apt-get -y build-dep r-base-dev -sudo apt-get -y build-dep qpdf -sudo apt-get -y build-dep r-cran-rgl -sudo apt-get -y build-dep r-cran-rmpi -sudo apt-get -y build-dep r-cran-cairodevice -sudo apt-get -y build-dep r-cran-tkrplot -sudo apt-get -y install libcurl4-openssl-dev # needed by devtools -sudo apt-get -y install xorg-dev x11-common libgdal-dev libproj-dev mysql-client libcairo2-dev libglpk-dev -sudo apt-get -y install texlive texlive-latex-extra texlive-bibtex-extra texlive-science texinfo texlive-fonts-extra latex-xcolor -sudo apt-get -y install libv8-dev -sudo apt-get -y install gsl-bin libgsl0-dev -sudo apt-get -y install libgtk2.0-dev netcdf-bin -sudo apt-get -y install libcanberra-gtk-module -sudo apt-get -y install git -sudo apt-get -y install openjdk-7-jdk -sudo apt-get -y install libnetcdf-dev udunits-bin libudunits2-dev -sudo apt-get -y install tk8.6-dev -sudo apt-get -y install clustalo # for package LowMACA -sudo apt-get -y install texlive-xetex # for package optiRum -sudo apt-get -y install texlive-pstricks # for package GGtools -sudo apt-get -y install libfftw3-dev # for package fftwtools -sudo apt-get -y install libgsl-dev -sudo apt-get -y install octave liboctave-dev -sudo apt-get -y install jags -sudo apt-get -y install libmpfr-dev -sudo apt-get -y install bwidget -sudo apt-get -y install librsvg2-dev # for rsvg -sudo apt-get -y install libboost-all-dev libboost-locale-dev # for textTinyR -sudo R CMD javareconf -# ENDIF - -cd ~/build/revdeplib/ -export R_LIBS=~/build/revdeplib/ -export R_LIBS_SITE=none -export _R_CHECK_FORCE_SUGGESTS_=false # in my profile so always set -R -.libPaths() # should be just 2 items: revdeplib and the base R package library -update.packages(ask=FALSE) -# if package not found on mirror, try manually a different one: -install.packages("MIAmaxent", repos="http://cloud.r-project.org/") -update.packages(ask=FALSE) # a repeat sometimes does more, keep repeating until none - -# Follow: https://bioconductor.org/install/#troubleshoot-biocinstaller -# Ensure no library() call in .Rprofile, such as library(bit64) -source("http://bioconductor.org/biocLite.R") -biocLite() -biocLite() # keep repeating until returns with nothing left to do -# biocLite("BiocUpgrade") -# This error means it's up to date: "Bioconductor version 3.4 cannot be upgraded with R version 3.3.2" - -avail = available.packages(repos=c(getOption("repos"), BiocInstaller::biocinstallRepos()[["BioCsoft"]])) -deps = tools::package_dependencies("data.table", db=avail, which="most", reverse=TRUE, recursive=FALSE)[[1]] -table(avail[deps,"Repository"]) -length(deps) -old = 0 -new = 0 -for (p in deps) { - fn = paste0(p, "_", avail[p,"Version"], ".tar.gz") - if (!file.exists(fn) || - identical(tryCatch(packageVersion(p), error=function(e)FALSE), FALSE) || - packageVersion(p) != avail[p,"Version"]) { - system(paste0("rm -f ", p, "*.tar.gz")) # Remove previous *.tar.gz. -f to be silent if not there (i.e. first time seeing this package) - system(paste0("rm -rf ", p, ".Rcheck")) # Remove last check (of previous version) - if (!length(grep("bioc",avail[p,"Repository"]))) { - install.packages(p, dependencies=TRUE) # To install its dependencies really. - } else { - biocLite(p,suppressUpdates=TRUE) # To install its dependencies really. - } - download.packages(p, destdir="~/build/revdeplib", contriburl=avail[p,"Repository"]) # So R CMD check can run on these - if (!file.exists(fn)) stop("Still does not exist!:", fn) - new = new+1 - } else { - old = old+1 - } -} -cat("New downloaded:",new," Already had latest:", old, " TOTAL:", length(deps), "\n") -table(avail[deps,"Repository"]) - -# To identify and remove the tar.gz no longer needed : -for (p in deps) { - f = paste0(p, "_", avail[p,"Version"], ".tar.gz") - system(paste0("mv ",f," ",f,"_TEMP")) -} -system("rm *.tar.gz") -for (p in deps) { - f = paste0(p, "_", avail[p,"Version"], ".tar.gz") - system(paste0("mv ",f,"_TEMP ",f)) -} - -status = function(which="both") { - if (which=="both") { - cat("CRAN:\n"); status("cran") - cat("BIOC:\n"); status("bioc") - cat("Oldest 00check.log (to check no old stale ones somehow missed):\n") - system("find . -name '00check.log' | xargs ls -lt | tail -1") - cat("\n") - if (file.exists("/tmp/started.flag")) { - system("ls -lrt /tmp/*.flag") - tt = as.POSIXct(file.info(c("/tmp/started.flag","/tmp/finished.flag"))$ctime) - if (is.na(tt[2])) tt[2] = Sys.time() - print(diff(tt)) - } - return(invisible()) - } - if (which=="cran") deps = deps[-grep("bioc",avail[deps,"Repository"])] - if (which=="bioc") deps = deps[grep("bioc",avail[deps,"Repository"])] - x = unlist(sapply(deps, function(x) { - fn = paste0("./",x,".Rcheck/00check.log") - if (file.exists(fn)) { - v = suppressWarnings(system(paste0("grep 'Status:' ",fn), intern=TRUE)) - if (!length(v)) return("RUNNING") - return(substring(v,9)) - } - if (file.exists(paste0("./",x,".Rcheck"))) return("RUNNING") - return("NOT STARTED") - })) - e = grep("ERROR",x) - w = setdiff( grep("WARNING",x), e) - n = setdiff( grep("NOTE",x), c(e,w) ) - ok = setdiff( grep("OK",x), c(e,w,n) ) - r = grep("RUNNING",x) - ns = grep("NOT STARTED", x) - cat(" ERROR :",sprintf("%3d",length(e)),":",paste(sort(names(x)[e])),"\n", - "WARNING :",sprintf("%3d",length(w)),":",paste(sort(names(x)[w])),"\n", - "NOTE :",sprintf("%3d",length(n)),"\n", #":",paste(sort(names(x)[n])),"\n", - "OK :",sprintf("%3d",length(ok)),"\n", - "TOTAL :",length(e)+length(w)+length(n)+length(ok),"/",length(deps),"\n", - "RUNNING :",sprintf("%3d",length(r)),":",paste(sort(names(x)[r])),"\n", - if (length(ns)==0) "\n" else paste0("NOT STARTED (first 20 of ",length(ns),") : ",paste(sort(names(x)[head(ns,20)]),collapse="|"),"\n") - ) - invisible() -} - -status() - -run = function(all=FALSE) { - numtgz = as.integer(system("ls -1 *.tar.gz | wc -l", intern=TRUE)) - stopifnot(numtgz==length(deps)) - cat("Installed data.table to be tested against:",as.character(packageVersion("data.table")),"\n") - if (!all) { - x = sapply(paste0("./",deps,".Rcheck"), file.exists) - x = deps[!x] - if (!length(x)) { cat("All package checks have already run. To rerun all: run(all=TRUE).\n"); return(); } - cat("Running checks for",length(x),"packages\n") - cmd = paste0("ls -1 *.tar.gz | grep -E '", paste0(x,collapse="|"),"' | parallel R CMD check") - } else { - cmd = "rm -rf *.Rcheck ; ls -1 *.tar.gz | parallel R CMD check" - # apx 2.5 hrs for 313 packages on my 4 cpu laptop with 8 threads - } - cat("Command:",cmd,"\n") - if (as.integer(system("ps -a | grep perfbar | wc -l", intern=TRUE)) < 1) system("perfbar",wait=FALSE) - cat("Proceed? (ctrl-c or enter)\n") - scan(quiet=TRUE) - system("touch /tmp/started.flag ; rm -f /tmp/finished.flag") - system(paste(cmd,">/dev/null 2>&1 && touch /tmp/finished.flag"),wait=FALSE) - # ^^ must be && and not ; otherwise wait doesn't wait -} - -run() -system("R CMD INSTALL ~/data.table_1.10.4.tar.gz") # ** ensure latest version installed into revdeplib ** - - -# Investigate and fix the fails ... -# For RxmSim: export JAVA_HOME=/usr/lib/jvm/java-8-oracle -more .Rcheck/00check.log -R CMD check .tar.gz -R CMD INSTALL ~/data.table_1.9.6.tar.gz # CRAN version to establish if fails are really due to data.table -R CMD check .tar.gz -ls -1 *.tar.gz | grep -E 'Chicago|dada2|flowWorkspace|LymphoSeq' | parallel R CMD check - -# Warning: replacing previous import robustbase::sigma by stats::sigma when loading VIM -# Reinstalling robustbase fixed this warning. Even though it was up to date, reinstalling made a difference. - - -############################################### -# Release to CRAN -############################################### - -Bump versions in DESCRIPTION and NEWS to even release number -Do not push to GitHub. Prevents even a slim possibility of user getting premature version. install_github() should only ever fetch odd releases at all times. Even release numbers must have been obtained from CRAN and only CRAN. (Too many support problems in past before this procedure brought in.) -R CMD build data.table -R CMD check --as-cran data.table_1.10.4.tar.gz # remove.packages("xml2") first to prevent the 150 URLs in NEWS.md being pinged by --as-cran -Resubmit to winbuilder (both R-release and R-devel) -Submit to CRAN -Bump version in DESCRIPTION to next ODD dev version -Add new heading in NEWS for the next dev version -Push to GitHub so dev can continue -Bump dev badge on homepage -Cross fingers accepted first time. If not, push changes to devel and backport locally -Close milestone -** If on EC2, shutdown instance. Otherwise get charged for potentially many days/weeks idle time with no alerts ** - -Submit message template: -Have rechecked the 339 CRAN packages using data.table. -Either ok or have liaised with maintainers in advance. - diff --git a/DESCRIPTION b/DESCRIPTION deleted file mode 100644 index 253a4d9fa6..0000000000 --- a/DESCRIPTION +++ /dev/null @@ -1,21 +0,0 @@ -Package: data.table -Version: 1.10.5 -Title: Extension of `data.frame` -Authors@R: c( - person("Matt","Dowle", role=c("aut","cre"), email="mattjdowle@gmail.com"), - person("Arun","Srinivasan", role="aut", email="arunkumar.sriniv@gmail.com"), - person("Jan","Gorecki", role="ctb"), - person("Michael","Chirico", role="ctb"), - person("Pasha","Stetsenko", role="ctb"), - person("Tom","Short", role="ctb"), - person("Steve","Lianoglou", role="ctb"), - person("Eduard","Antonyan", role="ctb") ) -Depends: R (>= 3.1.0) -Imports: methods -Suggests: bit64, curl, knitr, xts, nanotime, zoo, chron, reshape2, testthat (>= 0.4), GenomicRanges -Description: Fast aggregation of large data (e.g. 100GB in RAM), fast ordered joins, fast add/modify/delete of columns by group using no copies at all, list columns, friendly and fast character-separated-value read/write. Offers a natural and flexible syntax, for faster development. -License: MPL-2.0 | file LICENSE -URL: http://r-datatable.com -BugReports: https://github.com/Rdatatable/data.table/issues -VignetteBuilder: knitr -ByteCompile: TRUE diff --git a/ISSUE_TEMPLATE.md b/ISSUE_TEMPLATE.md deleted file mode 100644 index 2a29079824..0000000000 --- a/ISSUE_TEMPLATE.md +++ /dev/null @@ -1,14 +0,0 @@ -Click preview tab ^^^ above! - -By continuing to file this new issue / feature request, I confirm I have : -1. searched issues for the same issue I have and will include links to similar issues explaining why mine is different -2. searched the [live NEWS file](https://github.com/Rdatatable/data.table/blob/master/NEWS.md) to see if it has been fixed in dev already. If so, I tried the [latest dev version](https://github.com/Rdatatable/data.table/wiki/Installation#windows). -3. searched and asked on [Stack Overflow's data.table tag](http://stackoverflow.com/questions/tagged/data.table) and will provide a link to the question(s) -4. read the [Support](https://github.com/Rdatatable/data.table/wiki/Support) and [Contributing](https://github.com/Rdatatable/data.table/wiki/Contributing) guides -5. used tags under the labels menu on the right of this page, not text prefixes in the title - -Thanks! Please remove the text above and complete the sections below. - -`#` [`Minimal reproducible example`](https://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example) - -`#` `Output of sessionInfo()` diff --git a/LICENSE b/LICENSE deleted file mode 100644 index 14e2f777f6..0000000000 --- a/LICENSE +++ /dev/null @@ -1,373 +0,0 @@ -Mozilla Public License Version 2.0 -================================== - -1. Definitions --------------- - -1.1. "Contributor" - means each individual or legal entity that creates, contributes to - the creation of, or owns Covered Software. - -1.2. "Contributor Version" - means the combination of the Contributions of others (if any) used - by a Contributor and that particular Contributor's Contribution. - -1.3. "Contribution" - means Covered Software of a particular Contributor. - -1.4. "Covered Software" - means Source Code Form to which the initial Contributor has attached - the notice in Exhibit A, the Executable Form of such Source Code - Form, and Modifications of such Source Code Form, in each case - including portions thereof. - -1.5. "Incompatible With Secondary Licenses" - means - - (a) that the initial Contributor has attached the notice described - in Exhibit B to the Covered Software; or - - (b) that the Covered Software was made available under the terms of - version 1.1 or earlier of the License, but not also under the - terms of a Secondary License. - -1.6. "Executable Form" - means any form of the work other than Source Code Form. - -1.7. "Larger Work" - means a work that combines Covered Software with other material, in - a separate file or files, that is not Covered Software. - -1.8. "License" - means this document. - -1.9. "Licensable" - means having the right to grant, to the maximum extent possible, - whether at the time of the initial grant or subsequently, any and - all of the rights conveyed by this License. - -1.10. "Modifications" - means any of the following: - - (a) any file in Source Code Form that results from an addition to, - deletion from, or modification of the contents of Covered - Software; or - - (b) any new file in Source Code Form that contains any Covered - Software. - -1.11. "Patent Claims" of a Contributor - means any patent claim(s), including without limitation, method, - process, and apparatus claims, in any patent Licensable by such - Contributor that would be infringed, but for the grant of the - License, by the making, using, selling, offering for sale, having - made, import, or transfer of either its Contributions or its - Contributor Version. - -1.12. "Secondary License" - means either the GNU General Public License, Version 2.0, the GNU - Lesser General Public License, Version 2.1, the GNU Affero General - Public License, Version 3.0, or any later versions of those - licenses. - -1.13. "Source Code Form" - means the form of the work preferred for making modifications. - -1.14. "You" (or "Your") - means an individual or a legal entity exercising rights under this - License. For legal entities, "You" includes any entity that - controls, is controlled by, or is under common control with You. For - purposes of this definition, "control" means (a) the power, direct - or indirect, to cause the direction or management of such entity, - whether by contract or otherwise, or (b) ownership of more than - fifty percent (50%) of the outstanding shares or beneficial - ownership of such entity. - -2. License Grants and Conditions --------------------------------- - -2.1. Grants - -Each Contributor hereby grants You a world-wide, royalty-free, -non-exclusive license: - -(a) under intellectual property rights (other than patent or trademark) - Licensable by such Contributor to use, reproduce, make available, - modify, display, perform, distribute, and otherwise exploit its - Contributions, either on an unmodified basis, with Modifications, or - as part of a Larger Work; and - -(b) under Patent Claims of such Contributor to make, use, sell, offer - for sale, have made, import, and otherwise transfer either its - Contributions or its Contributor Version. - -2.2. Effective Date - -The licenses granted in Section 2.1 with respect to any Contribution -become effective for each Contribution on the date the Contributor first -distributes such Contribution. - -2.3. Limitations on Grant Scope - -The licenses granted in this Section 2 are the only rights granted under -this License. No additional rights or licenses will be implied from the -distribution or licensing of Covered Software under this License. -Notwithstanding Section 2.1(b) above, no patent license is granted by a -Contributor: - -(a) for any code that a Contributor has removed from Covered Software; - or - -(b) for infringements caused by: (i) Your and any other third party's - modifications of Covered Software, or (ii) the combination of its - Contributions with other software (except as part of its Contributor - Version); or - -(c) under Patent Claims infringed by Covered Software in the absence of - its Contributions. - -This License does not grant any rights in the trademarks, service marks, -or logos of any Contributor (except as may be necessary to comply with -the notice requirements in Section 3.4). - -2.4. Subsequent Licenses - -No Contributor makes additional grants as a result of Your choice to -distribute the Covered Software under a subsequent version of this -License (see Section 10.2) or under the terms of a Secondary License (if -permitted under the terms of Section 3.3). - -2.5. Representation - -Each Contributor represents that the Contributor believes its -Contributions are its original creation(s) or it has sufficient rights -to grant the rights to its Contributions conveyed by this License. - -2.6. Fair Use - -This License is not intended to limit any rights You have under -applicable copyright doctrines of fair use, fair dealing, or other -equivalents. - -2.7. Conditions - -Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted -in Section 2.1. - -3. Responsibilities -------------------- - -3.1. Distribution of Source Form - -All distribution of Covered Software in Source Code Form, including any -Modifications that You create or to which You contribute, must be under -the terms of this License. You must inform recipients that the Source -Code Form of the Covered Software is governed by the terms of this -License, and how they can obtain a copy of this License. You may not -attempt to alter or restrict the recipients' rights in the Source Code -Form. - -3.2. Distribution of Executable Form - -If You distribute Covered Software in Executable Form then: - -(a) such Covered Software must also be made available in Source Code - Form, as described in Section 3.1, and You must inform recipients of - the Executable Form how they can obtain a copy of such Source Code - Form by reasonable means in a timely manner, at a charge no more - than the cost of distribution to the recipient; and - -(b) You may distribute such Executable Form under the terms of this - License, or sublicense it under different terms, provided that the - license for the Executable Form does not attempt to limit or alter - the recipients' rights in the Source Code Form under this License. - -3.3. Distribution of a Larger Work - -You may create and distribute a Larger Work under terms of Your choice, -provided that You also comply with the requirements of this License for -the Covered Software. If the Larger Work is a combination of Covered -Software with a work governed by one or more Secondary Licenses, and the -Covered Software is not Incompatible With Secondary Licenses, this -License permits You to additionally distribute such Covered Software -under the terms of such Secondary License(s), so that the recipient of -the Larger Work may, at their option, further distribute the Covered -Software under the terms of either this License or such Secondary -License(s). - -3.4. Notices - -You may not remove or alter the substance of any license notices -(including copyright notices, patent notices, disclaimers of warranty, -or limitations of liability) contained within the Source Code Form of -the Covered Software, except that You may alter any license notices to -the extent required to remedy known factual inaccuracies. - -3.5. Application of Additional Terms - -You may choose to offer, and to charge a fee for, warranty, support, -indemnity or liability obligations to one or more recipients of Covered -Software. However, You may do so only on Your own behalf, and not on -behalf of any Contributor. You must make it absolutely clear that any -such warranty, support, indemnity, or liability obligation is offered by -You alone, and You hereby agree to indemnify every Contributor for any -liability incurred by such Contributor as a result of warranty, support, -indemnity or liability terms You offer. You may include additional -disclaimers of warranty and limitations of liability specific to any -jurisdiction. - -4. Inability to Comply Due to Statute or Regulation ---------------------------------------------------- - -If it is impossible for You to comply with any of the terms of this -License with respect to some or all of the Covered Software due to -statute, judicial order, or regulation then You must: (a) comply with -the terms of this License to the maximum extent possible; and (b) -describe the limitations and the code they affect. Such description must -be placed in a text file included with all distributions of the Covered -Software under this License. Except to the extent prohibited by statute -or regulation, such description must be sufficiently detailed for a -recipient of ordinary skill to be able to understand it. - -5. Termination --------------- - -5.1. The rights granted under this License will terminate automatically -if You fail to comply with any of its terms. However, if You become -compliant, then the rights granted under this License from a particular -Contributor are reinstated (a) provisionally, unless and until such -Contributor explicitly and finally terminates Your grants, and (b) on an -ongoing basis, if such Contributor fails to notify You of the -non-compliance by some reasonable means prior to 60 days after You have -come back into compliance. Moreover, Your grants from a particular -Contributor are reinstated on an ongoing basis if such Contributor -notifies You of the non-compliance by some reasonable means, this is the -first time You have received notice of non-compliance with this License -from such Contributor, and You become compliant prior to 30 days after -Your receipt of the notice. - -5.2. If You initiate litigation against any entity by asserting a patent -infringement claim (excluding declaratory judgment actions, -counter-claims, and cross-claims) alleging that a Contributor Version -directly or indirectly infringes any patent, then the rights granted to -You by any and all Contributors for the Covered Software under Section -2.1 of this License shall terminate. - -5.3. In the event of termination under Sections 5.1 or 5.2 above, all -end user license agreements (excluding distributors and resellers) which -have been validly granted by You or Your distributors under this License -prior to termination shall survive termination. - -************************************************************************ -* * -* 6. Disclaimer of Warranty * -* ------------------------- * -* * -* Covered Software is provided under this License on an "as is" * -* basis, without warranty of any kind, either expressed, implied, or * -* statutory, including, without limitation, warranties that the * -* Covered Software is free of defects, merchantable, fit for a * -* particular purpose or non-infringing. The entire risk as to the * -* quality and performance of the Covered Software is with You. * -* Should any Covered Software prove defective in any respect, You * -* (not any Contributor) assume the cost of any necessary servicing, * -* repair, or correction. This disclaimer of warranty constitutes an * -* essential part of this License. No use of any Covered Software is * -* authorized under this License except under this disclaimer. * -* * -************************************************************************ - -************************************************************************ -* * -* 7. Limitation of Liability * -* -------------------------- * -* * -* Under no circumstances and under no legal theory, whether tort * -* (including negligence), contract, or otherwise, shall any * -* Contributor, or anyone who distributes Covered Software as * -* permitted above, be liable to You for any direct, indirect, * -* special, incidental, or consequential damages of any character * -* including, without limitation, damages for lost profits, loss of * -* goodwill, work stoppage, computer failure or malfunction, or any * -* and all other commercial damages or losses, even if such party * -* shall have been informed of the possibility of such damages. This * -* limitation of liability shall not apply to liability for death or * -* personal injury resulting from such party's negligence to the * -* extent applicable law prohibits such limitation. Some * -* jurisdictions do not allow the exclusion or limitation of * -* incidental or consequential damages, so this exclusion and * -* limitation may not apply to You. * -* * -************************************************************************ - -8. Litigation -------------- - -Any litigation relating to this License may be brought only in the -courts of a jurisdiction where the defendant maintains its principal -place of business and such litigation shall be governed by laws of that -jurisdiction, without reference to its conflict-of-law provisions. -Nothing in this Section shall prevent a party's ability to bring -cross-claims or counter-claims. - -9. Miscellaneous ----------------- - -This License represents the complete agreement concerning the subject -matter hereof. If any provision of this License is held to be -unenforceable, such provision shall be reformed only to the extent -necessary to make it enforceable. Any law or regulation which provides -that the language of a contract shall be construed against the drafter -shall not be used to construe this License against a Contributor. - -10. Versions of the License ---------------------------- - -10.1. New Versions - -Mozilla Foundation is the license steward. Except as provided in Section -10.3, no one other than the license steward has the right to modify or -publish new versions of this License. Each version will be given a -distinguishing version number. - -10.2. Effect of New Versions - -You may distribute the Covered Software under the terms of the version -of the License under which You originally received the Covered Software, -or under the terms of any subsequent version published by the license -steward. - -10.3. Modified Versions - -If you create software not governed by this License, and you want to -create a new license for such software, you may create and use a -modified version of this License if you rename the license and remove -any references to the name of the license steward (except to note that -such modified license differs from this License). - -10.4. Distributing Source Code Form that is Incompatible With Secondary -Licenses - -If You choose to distribute Source Code Form that is Incompatible With -Secondary Licenses under the terms of this version of the License, the -notice described in Exhibit B of this License must be attached. - -Exhibit A - Source Code Form License Notice -------------------------------------------- - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - -If it is not possible or desirable to put the notice in a particular -file, then You may include the notice in a location (such as a LICENSE -file in a relevant directory) where a recipient would be likely to look -for such a notice. - -You may add additional accurate notices of copyright ownership. - -Exhibit B - "Incompatible With Secondary Licenses" Notice ---------------------------------------------------------- - - This Source Code Form is "Incompatible With Secondary Licenses", as - defined by the Mozilla Public License, v. 2.0. diff --git a/Makefile b/Makefile deleted file mode 100644 index b408fbde9b..0000000000 --- a/Makefile +++ /dev/null @@ -1,37 +0,0 @@ - -R ?= R - -.PHONY: all -all: - $(MAKE) clean - $(MAKE) build - $(MAKE) install - $(MAKE) test - $(MAKE) check - -.PHONY: some -some: - $(MAKE) clean - $(MAKE) build - $(MAKE) install - $(MAKE) test - -.PHONY: clean -clean: - rm -f data.table_1.10.5.tar.gz - -.PHONY: build -build: - $(R) CMD build . --no-build-vignettes - -.PHONY: install -install: - $(R) CMD INSTALL data.table_1.10.5.tar.gz - -.PHONY: test -test: - $(R) -e 'require(data.table); test.data.table()' - -.PHONY: check -check: - $(R) CMD check data.table_1.10.5.tar.gz --as-cran --ignore-vignettes --no-stop-on-test-error diff --git a/NAMESPACE b/NAMESPACE deleted file mode 100644 index 8906855180..0000000000 --- a/NAMESPACE +++ /dev/null @@ -1,164 +0,0 @@ -useDynLib(datatable, .registration=TRUE) - -## For S4-ization -import(methods) -exportClasses(data.table, IDate, ITime) -## - -export(data.table, tables, setkey, setkeyv, key, "key<-", haskey, CJ, SJ, copy) -export(set2key, set2keyv, key2, setindex, setindexv, indices) -export(as.data.table,is.data.table,test.data.table,last,first,like,"%like%",between,"%between%",inrange,"%inrange%") -export(timetaken) -export(truelength, alloc.col, ":=") -export(setattr, setnames, setcolorder, set, setDT, setDF) -export(setorder, setorderv) -export(setNumericRounding, getNumericRounding) -export(chmatch, "%chin%", chorder, chgroup) -export(rbindlist) -export(fread) -export(fwrite) -export(foverlaps) -export(shift) -export(transpose) -export(tstrsplit) -export(frank) -export(frankv) -export(address) -export(.SD,.N,.I,.GRP,.BY,.EACHI) -export(rleid) -export(rleidv) -export(rowid) -export(rowidv) -export(as.xts.data.table) -export(uniqueN) -export(setDTthreads, getDTthreads) -# set operators -export(fintersect) -export(fsetdiff) -export(funion) -export(fsetequal) -S3method(all.equal, data.table) -export(shouldPrint) -export(fsort) # experimental parallel sort for vector type double only, currently -# grouping sets -export(groupingsets) -export(cube) -export(rollup) -S3method(groupingsets, data.table) -S3method(cube, data.table) -S3method(rollup, data.table) - -S3method("[", data.table) -S3method("[<-", data.table) -# S3method("[[", data.table) -# S3method("[[<-", data.table) -S3method("$<-", data.table) -S3method(print, data.table) -S3method(as.data.table, data.table) -S3method(as.data.table, data.frame) -S3method(as.data.table, array) -S3method(as.data.table, matrix) -S3method(as.data.table, list) -S3method(as.data.table, integer) -S3method(as.data.table, numeric) -S3method(as.data.table, character) -S3method(as.data.table, logical) -S3method(as.data.table, factor) -S3method(as.data.table, ordered) -S3method(as.data.table, Date) -S3method(as.data.table, ITime) -S3method(as.data.table, table) -S3method(as.data.table, xts) -S3method(as.data.table, default) -S3method(as.data.frame, data.table) -S3method(as.list, data.table) -S3method(as.matrix, data.table) -#S3method(cbind, data.table) -#S3method(rbind, data.table) -export(.rbind.data.table) -S3method(split, data.table) -S3method(dim, data.table) -S3method(dimnames, data.table) -S3method("dimnames<-", data.table) -S3method("names<-", data.table) -S3method(duplicated, data.table) -S3method(unique, data.table) -S3method(merge, data.table) -S3method(subset, data.table) -S3method(transform, data.table) -S3method(within, data.table) -S3method(is.na, data.table) -S3method(format, data.table) -S3method(Ops, data.table) - -S3method(anyDuplicated, data.table) - -export(melt) -export(melt.data.table) -S3method(melt, data.table) -export(dcast) -export(dcast.data.table) -S3method(dcast, data.table) - -import(utils) -S3method(update, dev.pkg) -export(update.dev.pkg) -S3method(tail, data.table) -S3method(head, data.table) -import(stats) -S3method(na.omit, data.table) - -# IDateTime support: -export(as.IDate,as.ITime,IDateTime) -export(second,minute,hour,yday,wday,mday,week,isoweek,month,quarter,year) - -export(as.chron.IDate, as.chron.ITime) -export(as.Date.IDate) # workaround for zoo bug, see #1500 - -S3method("[", ITime) -S3method("+", IDate) -S3method("-", IDate) -S3method(as.character, ITime) -S3method(as.data.frame, ITime) -S3method(as.Date, IDate) -S3method(as.IDate, Date) -S3method(as.IDate, POSIXct) -S3method(as.IDate, default) -S3method(as.IDate, numeric) -S3method(as.ITime, character) -S3method(as.ITime, default) -S3method(as.ITime, POSIXct) -S3method(as.ITime, numeric) -S3method(as.ITime, POSIXlt) -S3method(as.ITime, times) -S3method(as.list, IDate) -S3method(as.POSIXct, IDate) -S3method(as.POSIXct, ITime) -S3method(as.POSIXlt, ITime) -S3method(c, IDate) -S3method(cut, IDate) -S3method(format, ITime) -S3method(IDateTime, default) -S3method(mean, IDate) -S3method(print, ITime) -S3method(rep, IDate) -S3method(rep, ITime) -S3method(round, IDate) -S3method(seq, IDate) -S3method(split, IDate) -S3method(unique, IDate) -S3method(unique, ITime) - - - -# [.factor -# c.factor -# duplist -# getdots -# NCOL -# NROW -# take -# trim -# which.first -# which.last - diff --git a/NEWS.0.md b/NEWS.0.md deleted file mode 100644 index ffa003fd49..0000000000 --- a/NEWS.0.md +++ /dev/null @@ -1,3397 +0,0 @@ - -**This is OLD NEWS. Latest news is on GitHub [here](https://github.com/Rdatatable/data.table/blob/master/NEWS.md).** - -### Changes in v1.9.8 (on CRAN 25 Nov 2016) - -#### POTENTIALLY BREAKING CHANGES - - 1. By default all columns are now used by `unique()`, `duplicated()` and `uniqueN()` data.table methods, [#1284](https://github.com/Rdatatable/data.table/issues/1284) and [#1841](https://github.com/Rdatatable/data.table/issues/1841). To restore old behaviour: `options(datatable.old.unique.by.key=TRUE)`. In 1 year this option to restore the old default will be deprecated with warning. In 2 years the option will be removed. Please explicitly pass `by=key(DT)` for clarity. Only code that relies on the default is affected. 266 CRAN and Bioconductor packages using data.table were checked before release. 9 needed to change and were notified. Any lines of code without test coverage will have been missed by these checks. Any packages not on CRAN or Bioconductor were not checked. - - 2. A new column is guaranteed with `:=` even when there are no matches or when its RHS is length 0 (e.g. `integer()`, `numeric()`) but not `NULL`. The NA column is created with the same type as the empty RHS. This is for consistency so that whether a new column is added or not does not depend on whether `i` matched to 1 or more rows or not. See [#759](https://github.com/Rdatatable/data.table/issues/759) for further details and examples. - - 3. When `j` contains no unquoted variable names (whether column names or not), `with=` is now automatically set to `FALSE`. Thus, `DT[,1]`, `DT[,"someCol"]`, `DT[,c("colA","colB")]` and `DT[,100:109]` now work as we all expect them to; i.e., returning columns, [#1188](https://github.com/Rdatatable/data.table/issues/1188), [#1149](https://github.com/Rdatatable/data.table/issues/1149). Since there are no variable names there is no ambiguity as to what was intended. `DT[,colName1:colName2]` no longer needs `with=FALSE` either since that is also unambiguous. That is a single call to the `:` function so `with=TRUE` could make no sense, despite the presence of unquoted variable names. These changes can be made since nobody can be using the existing behaviour of returning back the literal `j` value since that can never be useful. This provides a new ability and should not break any existing code. Selecting a single column still returns a 1-column data.table (not a vector, unlike `data.frame` by default) for type consistency for code (e.g. within `DT[...][...]` chains) that can sometimes select several columns and sometime one, as has always been the case in data.table. In future, `DT[,myCols]` (i.e. a single variable name) will look for `myCols` in calling scope without needing to set `with=FALSE` too, just as a single symbol appearing in `i` does already. The new behaviour can be turned on now by setting the tersely named option: `options(datatable.WhenJisSymbolThenCallingScope=TRUE)`. The default is currently `FALSE` to give you time to change your code. In this future state, one way (i.e. `DT[,theColName]`) to select the column as a vector rather than a 1-column data.table will no longer work leaving the two other ways that have always worked remaining (since data.table is still just a `list` after all): `DT[["someCol"]]` and `DT$someCol`. Those base R methods are faster too (when iterated many times) by avoiding the small argument checking overhead inside the more flexible `DT[...]` syntax as has been highlighted in `example(data.table)` for many years. In the next release, `DT[,someCol]` will continue with old current behaviour but start to warn if the new option is not set. Then the default will change to TRUE to nudge you to move forward whilst still retaining a way for you to restore old behaviour for this feature only, whilst still allowing you to benefit from other new features of the latest release without changing your code. Then finally after an estimated 2 years from now, the option will be removed. - -#### NEW FEATURES - - 1. `fwrite()` - parallel .csv writer: - * Thanks to Otto Seiskari for the initial pull request [#580](https://github.com/Rdatatable/data.table/issues/580) that provided C code, R wrapper, manual page and extensive tests. - * From there Matt parallelized and specialized C functions for writing integer/numeric exactly matching `write.csv` between 2.225074e-308 and 1.797693e+308 to 15 significant figures, dates (between 0000-03-01 and 9999-12-31), times down to microseconds in POSIXct, automatic quoting, `bit64::integer64`, `row.names` and `sep2` for `list` columns where each cell can itself be a vector. See [this blog post](http://blog.h2o.ai/2016/04/fast-csv-writing-for-r/) for implementation details and benchmarks. - * Accepts any `list` of same length vectors; e.g. `data.frame` and `data.table`. - * Caught in development before release to CRAN: thanks to Francesco Grossetti for [#1725](https://github.com/Rdatatable/data.table/issues/1725) (NA handling), Torsten Betz for [#1847](https://github.com/Rdatatable/data.table/issues/1847) (rounding of 9.999999999999998) and @ambils for [#1903](https://github.com/Rdatatable/data.table/issues/1903) (> 1 million columns). - * `fwrite` status was tracked here: [#1664](https://github.com/Rdatatable/data.table/issues/1664) - - 2. `fread()`: - * gains `quote` argument. `quote = ""` disables quoting altogether which reads each field *as is*, [#1367](https://github.com/Rdatatable/data.table/issues/1367). Thanks @manimal. - * With [#1462](https://github.com/Rdatatable/data.table/issues/1462) fix, quotes are handled slightly better. Thanks @Pascal for [posting on SO](http://stackoverflow.com/q/34144314/559784). - * gains `blank.lines.skip` argument that continues reading by skipping empty lines. Default is `FALSE` for backwards compatibility, [#530](https://github.com/Rdatatable/data.table/issues/530). Thanks @DirkJonker. Also closes [#1575](https://github.com/Rdatatable/data.table/issues/1575). - * gains `fill` argument with default `FALSE` for backwards compatibility. Closes [#536](https://github.com/Rdatatable/data.table/issues/536). Also, `fill=TRUE` prioritises maximum cols instead of longest run with identical columns when `fill=TRUE` which allows handle missing columns slightly more robustly, [#1573](https://github.com/Rdatatable/data.table/issues/1573). - * gains `key` argument, [#590](https://github.com/Rdatatable/data.table/issues/590). - * gains `file` argument which expects existing file on input, to ensure no shell commands will be executed when reading file. Closes [#1702](https://github.com/Rdatatable/data.table/issues/1702). - * Column type guessing is improved by testing 100 rows at 10 points rather than 5 rows at 3 points. See point 3 of [convenience features of fread for small data](https://github.com/Rdatatable/data.table/wiki/Convenience-features-of-fread). - - 3. Joins: - * Non-equi (or conditional) joins are now possible using the familiar `on=` syntax. Possible binary operators include `>=`, `>`, `<=`, `<` and `==`. For e.g., `X[Y, on=.(a, b>b)]` looks for `X.a == Y.a` first and within those matching rows for rows where`X.b > Y.b`, [#1452](https://github.com/Rdatatable/data.table/issues/1452). - * x's columns can be referred to in `j` using the prefix `x.` at all times. This is particularly useful when it is necessary to x's column that is *also a join column*, [#1615](https://github.com/Rdatatable/data.table/issues/1615). Also closes [#1705](https://github.com/Rdatatable/data.table/issues/1705) (thanks @dbetebenner) and [#1761](https://github.com/Rdatatable/data.table/issues/1761). - * `on=.()` syntax is now possible, e.g., `X[Y, on=.(x==a, y==b)]`, [#1257](https://github.com/Rdatatable/data.table/issues/1257). Thanks @dselivanov. - * Joins using `on=` accepts unnamed columns on ad hoc joins, e.g., X[.(5), on="b"] joins "b" from `X` to "V1" from `i`, partly closes [#1375](https://github.com/Rdatatable/data.table/issues/1375). - * When joining with `on=`, `X[Y, on=c(A="A", b="c")]` can be now specified as `X[Y, on=c("A", b="c")]`, fully closes [#1375](https://github.com/Rdatatable/data.table/issues/1375). - * `on=` joins now provides more friendly error messages when columns aren't found, [#1376](https://github.com/Rdatatable/data.table/issues/1376). - * Joins (and binary search based subsets) using `on=` argument now reuses existing (secondary) indices, [#1439](https://github.com/Rdatatable/data.table/issues/1439). Thanks @jangorecki. - - 4. `merge.data.table` by default also checks for common key columns between the two `data.table`s before resulting in error when `by` or `by.x, by.y` arguments are not provided, [#1517](https://github.com/Rdatatable/data.table/issues/1517). Thanks @DavidArenburg. - - 5. Fast set operations `fsetdiff`, `fintersect`, `funion` and `fsetequal` for data.tables are now implemented, [#547](https://github.com/Rdatatable/data.table/issues/547). - - 6. Added `setDTthreads()` and `getDTthreads()` to control the threads used in data.table functions that are now parallelized with OpenMP on all architectures including Windows (`fwrite()`, `fsort()` and subsetting). Extra code was required internally to ensure these control data.table only and not other packages using OpenMP. When data.table is used from the parallel package (e.g. `mclapply` as done by 3 CRAN and Bioconductor packages) data.table automatically switches down to one thread to avoid a [deadlock/hang](https://gcc.gnu.org/bugzilla/show_bug.cgi?id=58378) when OpenMP is used with fork(); [#1745](https://github.com/Rdatatable/data.table/issues/1745) and [#1727](https://github.com/Rdatatable/data.table/issues/1727). Thanks to Kontstantinos Tsardounis, Ramon Diaz-Uriarte and Jan Gorecki for testing before release and providing reproducible examples. After `parallel::mclapply` has finished, data.table reverts to the prior `getDTthreads()` state. Tests added which will therefore will run every day thanks to CRAN (limited to 2 threads on CRAN which is enough to test). - - 7. `GForce` (See ?\`datatable-optimize\` for more): - * `dt[, .N, by=cols]` is optimised internally as well, [#1251](https://github.com/Rdatatable/data.table/issues/1251). - * is now also optimised for `median`. Partly addresses [#523](https://github.com/Rdatatable/data.table/issues/523). Check that issue for benchmarks. - * GForce kicks in along with subsets in `i` as well, e.g., `DT[x > 2, mean(y), by=z]`. Partly addresses [#971](https://github.com/Rdatatable/data.table/issues/971). - * GForce is optimised for `head(., 1)` and `tail(., 1)`, where `.` is a column name or `.SD`. Partly addresses [#523](https://github.com/Rdatatable/data.table/issues/523). Check the link for benchmarks. - * GForce is optimised for length-1 subsets, e.g., `.SD[2]`, `col[2]`. Partly addresses [#523](https://github.com/Rdatatable/data.table/issues/523). - * `var`, `sd` and `prod` are all GForce optimised for speed and memory. Partly addresses [#523](https://github.com/Rdatatable/data.table/issues/523). See that post for benchmarks. - - 8. Reshaping: - * `dcast.data.table` now allows `drop = c(FALSE, TRUE)` and `drop = c(TRUE, FALSE)`. The former only fills all missing combinations of formula LHS, where as the latter fills only all missing combinations of formula RHS. Thanks to Ananda Mahto for [this SO post](http://stackoverflow.com/q/34830908/559784) and to Jaap for filing [#1512](https://github.com/Rdatatable/data.table/issues/1512). - * `melt.data.table` finds variables provided to `patterns()` when called from within user defined functions, [#1749](https://github.com/Rdatatable/data.table/issues/1749). Thanks to @kendonB for the report. - - 9. We can now refer to the columns that are not mentioned in `.SD` / `.SDcols` in `j` as well. For example, `DT[, .(sum(v1), lapply(.SD, mean)), by=grp, .SDcols=v2:v3]` works as expected, [#495](https://github.com/Rdatatable/data.table/issues/495). Thanks to @MattWeller for report and to others for linking various SO posts to be updated. Also closes [#484](https://github.com/Rdatatable/data.table/issues/484). - - 10. New functions `inrange()` and `%inrange%` are exported. It performs a range join making use of the recently implemented *non-equi* joins ([#1452](https://github.com/Rdatatable/data.table/issues/1452)) [#679](https://github.com/Rdatatable/data.table/issues/679). Also thanks to @DavidArenburg for [#1819](https://github.com/Rdatatable/data.table/issues/1819). - - 11. `%between%` is vectorised which means we can now do: `DT[x %between% list(y,z)]` where `y` and `z` are vectors, [#534](https://github.com/Rdatatable/data.table/issues/534). Thanks @MicheleCarriero for filing the issue and the idea. - - 12. Most common use case for `between()`, i.e., `lower` and `upper` are length=1, is now implemented in C and parallelised. This results in ~7-10x speed improvement on vectors of length >= 1e6. - - 13. Row subset operations of data.table is now parallelised with OpenMP, [#1660](https://github.com/Rdatatable/data.table/issues/1660). See the linked issue page for a rough benchmark on speedup. - - 14. `tstrsplit` gains argument `names`, [#1379](https://github.com/Rdatatable/data.table/issues/1379). A character vector of column names can be provided as well. Thanks @franknarf1. - - 15. `tstrsplit` gains argument `keep` which corresponds to the indices of list elements to return from the transposed list. - - 16. `rowid()` and `rowidv()` - convenience functions for generating a unique row ids within each group, are implemented. `rowid()` is particularly useful along with `dcast()`. See `?rowid` for more, [#1353](https://github.com/Rdatatable/data.table/issues/1353). - - 17. `rleid()` gains `prefix` argument, similar to `rowid()`. - - 18. `shift()` understands and operates on list-of-list inputs as well, [#1595](https://github.com/Rdatatable/data.table/issues/1595). Thanks to @enfascination and to @chris for [asking on SO](http://stackoverflow.com/q/38900293/559784). - - 19. `uniqueN` gains `na.rm` argument, [#1455](https://github.com/Rdatatable/data.table/issues/1455). - - 20. `first()` is now exported to return the first element of vectors, data.frames and data.tables. - - 21. New `split.data.table` method. Faster, more flexible and consistent with data.frame method. Closes [#1389](https://github.com/Rdatatable/data.table/issues/1389). Now also properly preallocate columns, thanks @maverickg for reporting, closes [#1908](https://github.com/Rdatatable/data.table/issues/1908). - - 22. `rbindlist` supports columns of type `complex`, [#1659](https://github.com/Rdatatable/data.table/issues/1659). - - 23. Added `second` and `minute` extraction functions which, like extant `hour`/`yday`/`week`/etc, always return an integer, [#874](https://github.com/Rdatatable/data.table/issues/874). Also added ISO 8601-consistent weeks in `isoweek`, [#1765](https://github.com/Rdatatable/data.table/issues/1765). Thanks to @bthieurmel and @STATWORX for the FRs and @MichaelChirico for the PRs. - - 24. `setnames` accepts negative indices in `old` argument, [#1443](https://github.com/Rdatatable/data.table/issues/1443). Thanks @richierocks. - - 25. `by` understands `colA:colB` syntax now, like `.SDcols` does, [#1395](https://github.com/Rdatatable/data.table/issues/1395). Thanks @franknarf1. - - 26. `data.table()` function gains `stringsAsFactors` argument with default `FALSE`, [#643](https://github.com/Rdatatable/data.table/issues/643). Thanks to @jangorecki for reviving this issue. - - 27. `print.data.table` now warns when `bit64` package isn't loaded but the `data.table` contains `integer64` columns, [#975](https://github.com/Rdatatable/data.table/issues/975). Thanks to @StephenMcInerney. - - 28. New argument `print.class` for `print.data.table` allows for including column class under column names (as inspired by `tbl_df` in `dplyr`); default (adjustable via `"datatable.print.class"` option) is `FALSE`, the inherited behavior. Part of [#1523](https://github.com/Rdatatable/data.table/issues/1523); thanks to @MichaelChirico for the FR & PR. - - 29. `all.equal.data.table` gains `check.attributes`, `ignore.col.order`, `ignore.row.order` and `tolerance` arguments. - - 30. `keyby=` is now much faster by not doing not needed work; e.g. 25s down to 13s for a 1.5GB DT with 200m rows and 86m groups. With more groups or bigger data, larger speedup factors are possible. Please always use `keyby=` unless you really need `by=`. `by=` returns the groups in first appearance order and takes longer to do that. See [#1880](https://github.com/Rdatatable/data.table/issues/1880) for more info and please register your views there on changing the default. - - -#### BUG FIXES - - 1. Now compiles and runs on IBM AIX gcc. Thanks to Vinh Nguyen for investigation and testing, [#1351](https://github.com/Rdatatable/data.table/issues/1351). - - 2. `as.ITime(NA)` works as intended, [#1354](https://github.com/Rdatatable/data.table/issues/1354). Thanks @geneorama. - - 3. `last()` dispatches `xts::last()` properly again, [#1347](https://github.com/Rdatatable/data.table/issues/1347). Thanks to @JoshuaUlrich for spotting and suggesting the fix. - - 4. `merge.data.table` ignores names when `by` argument is a named vector, [#1352](https://github.com/Rdatatable/data.table/issues/1352). Thanks @sebastian-c. - - 5. `melt.data.table` names `value` column correctly when `patterns()` of length=1 is provided to `measure.vars()`, [#1346](https://github.com/Rdatatable/data.table/issues/1346). Thanks @jaapwalhout. - - 6. Fixed a rare case in `melt.data.table` not setting `variable` factor column properly when `na.rm=TRUE`, [#1359](https://github.com/Rdatatable/data.table/issues/1359). Thanks @mplatzer. - - 7. `dt[i, .SD]` unlocks `.SD` and overallocates correctly now, [#1341](https://github.com/Rdatatable/data.table/issues/1341). Thanks @marc-outins. - - 8. Querying a list column with `get()`, e.g., `dt[, get("c")]` is handled properly, [#1212](https://github.com/Rdatatable/data.table/issues/1212). Thanks @DavidArenburg. - - 9. Grouping on empty data.table with list col in `j` works as expected, [#1207](https://github.com/Rdatatable/data.table/issues/1207). Thanks @jangorecki. - - 10. Unnamed `by/keyby` expressions ensure now that the auto generated names are unique, [#1334](https://github.com/Rdatatable/data.table/issues/1334). Thanks @caneff. - - 11. `melt` errors correctly when `id.vars` or `measure.vars` are negative values, [#1372](https://github.com/Rdatatable/data.table/issues/1372). - - 12. `merge.data.table` always resets class to `c("data.table", "data.frame")` in result to be consistent with `merge.data.frame`, [#1378](https://github.com/Rdatatable/data.table/issues/1378). Thanks @ladida771. - - 13. `fread` reads text input with empty newline but with just spaces properly, for e.g., fread('a,b\n1,2\n '), [#1384](https://github.com/Rdatatable/data.table/issues/1384). Thanks to @ladida771. - - 14. `fread` with `stringsAsFactors = TRUE` no longer produces factors with NA as a factor level, [#1408](https://github.com/Rdatatable/data.table/pull/1408). Thanks to @DexGroves. - - 15. `test.data.table` no longer raises warning if suggested packages are not available. Thanks to @jangorecki for PR [#1403](https://github.com/Rdatatable/data.table/pull/1403). Closes [#1193](https://github.com/Rdatatable/data.table/issues/1193). - - 16. `rleid()` does not affect attributes of input vector, [#1419](https://github.com/Rdatatable/data.table/issues/1419). Thanks @JanGorecki. - - 17. `uniqueN()` now handles NULL properly, [#1429](https://github.com/Rdatatable/data.table/issues/1429). Thanks @JanGorecki. - - 18. GForce `min` and `max` functions handle `NaN` correctly, [#1461](https://github.com/Rdatatable/data.table/issues/1461). Thanks to @LyssBucks for [asking on SO](http://stackoverflow.com/q/34081848/559784). - - 19. Warnings on unable to detect column types from middle/last 5 lines are now moved to messages when `verbose=TRUE`. Closes [#1124](https://github.com/Rdatatable/data.table/issues/1124). - - 20. `fread` converts columns to `factor` type when used along with `colClasses` argument, [#721](https://github.com/Rdatatable/data.table/issues/721). Thanks @AmyMikhail. - - 21. Auto indexing handles logical subset of factor column using numeric value properly, [#1361](https://github.com/Rdatatable/data.table/issues/1361). Thanks @mplatzer. - - 22. `as.data.table.xts` handles single row `xts` object properly, [#1484](https://github.com/Rdatatable/data.table/issues/1484). Thanks Michael Smith and @jangorecki. - - 23. data.table now solves the issue of mixed encodings by comparing character columns with marked encodings under `UTF8` locale. This resolves issues [#66](https://github.com/Rdatatable/data.table/issues/66), [#69](https://github.com/Rdatatable/data.table/issues/69), [#469](https://github.com/Rdatatable/data.table/issues/469) and [#1293](https://github.com/Rdatatable/data.table/issues/1293). Thanks to @StefanFritsch and @Arthur. - - 24. `rbindlist` handles `idcol` construction correctly and more efficiently now (logic moved to C), [#1432](https://github.com/Rdatatable/data.table/issues/1432). Thanks to @franknarf1 and @Chris. - - 25. `CJ` sorts correctly when duplicates are found in input values and `sorted=TRUE`, [#1513](https://github.com/Rdatatable/data.table/issues/1513). Thanks @alexdeng. - - 26. Auto indexing returns order of subset properly when input `data.table` is already sorted, [#1495](https://github.com/Rdatatable/data.table/issues/1495). Thanks @huashan for the nice reproducible example. - - 27. `[.data.table` handles column subsets based on conditions that result in `NULL` as list elements correctly, [#1477](https://github.com/Rdatatable/data.table/issues/1477). Thanks @MichaelChirico. Also thanks to @Max from DSR for spotting a bug as a result of this fix. Now fixed. - - 28. Providing the first argument to `.Call`, for e.g., `.Call("Crbindlist", ...)` seems to result in *"not resolved in current namespace"* error. A potential fix is to simply remove the quotes like so many other calls in data.table. Potentially fixes [#1467](https://github.com/Rdatatable/data.table/issues/1467). Thanks to @rBatt, @rsaporta and @damienchallet. - - 29. `last` function will now properly redirect method if `xts` is not installed or not attached on search path. Closes [#1560](https://github.com/Rdatatable/data.table/issues/1560). - - 30. `rbindlist` (and `rbind`) works as expected when `fill = TRUE` and the first element of input list doesn't have columns present in other elements of the list, [#1549](https://github.com/Rdatatable/data.table/issues/1549). Thanks to @alexkowa. - - 31. `DT[, .(col), with=FALSE]` now returns a meaningful error message, [#1440](https://github.com/Rdatatable/data.table/issues/1440). Thanks to @VasilyA for [posting on SO](http://stackoverflow.com/q/33851742/559784). - - 32. Fixed a segault in `forder` when elements of input list are not of same length, [#1531](https://github.com/Rdatatable/data.table/issues/1531). Thanks to @MichaelChirico. - - 33. Reverted support of *list-of-lists* made in [#1224](https://github.com/Rdatatable/data.table/issues/1224) for consistency. - - 34. Fixed an edge case in fread's `fill` argument, [#1503](https://github.com/Rdatatable/data.table/issues/1503). Thanks to @AnandaMahto. - - 35. `copy()` overallocates properly when input is a *list-of-data.tables*, [#1476](https://github.com/Rdatatable/data.table/issues/1476). Thanks to @kimiylilammi and @AmitaiPerlstein for the report. - - 36. `fread()` handles embedded double quotes in json fields as expected, [#1164](https://github.com/Rdatatable/data.table/issues/1164). Thanks @richardtessier. - - 37. `as.data.table.list` handles list elements that are matrices/data.frames/data.tables properly, [#833](https://github.com/Rdatatable/data.table/issues/833). Thanks to @talexand. - - 38. `data.table()`, `as.data.table()` and `[.data.table` warn on `POSIXlt` type column and converts to `POSIXct` type. `setDT()` errors when input is list and any column is of type `POSIXlt`, [#646](https://github.com/Rdatatable/data.table/issues/646). Thanks to @tdhock. - - 39. `roll` argument handles -ve integer64 values correctly, [#1405](https://github.com/Rdatatable/data.table/issues/1405). Thanks @bryan4887. Also closes [#1650](https://github.com/Rdatatable/data.table/issues/1650), a segfault due to this fix. Thanks @Franknarf1 for filing the issue. - - 40. Not join along with `mult="first"` and `mult="last"` is handled correctly, [#1571](https://github.com/Rdatatable/data.table/issues/1571). - - 41. `by=.EACHI` works as expected along with `mult="first"` and `mult="last"`, [#1287](https://github.com/Rdatatable/data.table/issues/1287) and [#1271](https://github.com/Rdatatable/data.table/issues/1271). - - 42. Subsets using logical expressions in `i` (e.g. `DT[someCol==3]`) no longer return an unintended all-NA row when `DT` consists of a single row and `someCol` contains `NA`, fixing [#1252](https://github.com/Rdatatable/data.table/issues/1252). Thanks to @sergiizaskaleta for reporting. If `i` is the reserved symbol `NA` though (i.e. `DT[NA]`) it is still auto converted to `DT[NA_integer_]` so that a single `NA` row is returned as almost surely expected. For consistency with past behaviour and to save confusion when comparing to `DT[c(NA,1)]`. - - 43. `setattr()` catches logical input that points to R's global TRUE value and sets attributes on a copy instead, along with a warning, [#1281](https://github.com/Rdatatable/data.table/issues/1281). Thanks to @tdeenes. - - 44. `fread` respects order of columns provided to argument `select` in result, and also warns if the column(s) provided is not present, [#1445](https://github.com/Rdatatable/data.table/issues/1445). - - 45. `DT[, .BY, by=x]` and other variants of adding a column using `.BY` are now handled correctly, [#1270](https://github.com/Rdatatable/data.table/issues/1270). - - 46. `as.data.table.data.table()` method checks and restores over-allocation, [#473](https://github.com/Rdatatable/data.table/issues/473). - - 47. When the number of rows read are less than the number of guessed rows (or allocated), `fread()` doesn't warn anymore; rather restricts to a verbose message, [#1116](https://github.com/Rdatatable/data.table/issues/1116) and [#1239](https://github.com/Rdatatable/data.table/issues/1239). Thanks to @slowteetoe and @hshipper. - - 48. `fread()` throws an error if input is a *directory*, [#989](https://github.com/Rdatatable/data.table/issues/989). Thanks @vlsi. - - 49. UTF8 BOM header is excluded properly in `fread()`, [#1087](https://github.com/Rdatatable/data.table/issues/1087) and [#1465](https://github.com/Rdatatable/data.table/issues/1465). Thanks to @nigmastar and @MichaelChirico. - - 50. Joins using `on=` retains (and discards) keys properly, [#1268](https://github.com/Rdatatable/data.table/issues/1268). Thanks @DouglasClark for [this SO post](http://stackoverflow.com/q/29918595/559784) that helped discover the issue. - - 51. Secondary keys are properly removed when those columns get updated, [#1479](https://github.com/Rdatatable/data.table/issues/1479). Thanks @fabiangehring for the report, and also @ChristK for the MRE. - - 52. `dcast` no longer errors on tables with duplicate columns that are unused in the call, [#1654](https://github.com/Rdatatable/data.table/issues/1654). Thanks @MichaelChirico for FR&PR. - - 53. `fread` won't use `wget` for file:// input, [#1668](https://github.com/Rdatatable/data.table/issues/1668); thanks @MichaelChirico for FR&PR. - - 54. `chmatch()` handles `nomatch = integer(0)` properly, [#1672](https://github.com/Rdatatable/data.table/issues/1672). - - 55. `dimnames.data.table` no longer errors in `data.table`-unaware environments when a `data.table` has, e.g., been churned through some `dplyr` functions and acquired extra classes, [#1678](https://github.com/Rdatatable/data.table/issues/1678). Thanks Daisy Lee on SO for pointing this out and @MichaelChirico for the fix. - - 55. `fread()` did not respect encoding on header column. Now fixed, [#1680](https://github.com/Rdatatable/data.table/issues/1680). Thanks @nachti. - - 56. as.data.table's `data.table` method returns a copy as it should, [#1681](https://github.com/Rdatatable/data.table/issues/1681). - - 57. Grouped update operations, e.g., `DT[, y := val, by=x]` where `val` is an unsupported type errors *without adding an unnamed column*, [#1676](https://github.com/Rdatatable/data.table/issues/1676). Thanks @wligtenberg. - - 58. Handled use of `.I` in some `GForce` operations, [#1683](https://github.com/Rdatatable/data.table/issues/1683). Thanks gibbz00 from SO and @franknarf1 for reporting and @MichaelChirico for the PR. - - 59. Added `+.IDate` method so that IDate + integer retains the `IDate` class, [#1528](https://github.com/Rdatatable/data.table/issues/1528); thanks @MichaelChirico for FR&PR. Similarly, added `-.IDate` so that IDate - IDate returns a plain integer rather than difftime. - - 60. Radix ordering an integer vector containing INTMAX (2147483647) with decreasing=TRUE and na.last=FALSE failed ASAN check and segfaulted some systems. As reported for base R [#16925](https://bugs.r-project.org/bugzilla/show_bug.cgi?id=16925) whose new code comes from data.table. Simplified code, added test and proposed change to base R. - - 60. Fixed test in `onAttach()` for when `Packaged` field is missing from `DESCRIPTION`, [#1706](https://github.com/Rdatatable/data.table/issues/1706); thanks @restonslacker for BR&PR. - - 61. Adding missing factor levels are handled correctly in case of NAs. This affected a case of join+update operation as shown in [#1718](https://github.com/Rdatatable/data.table/issues/1718). Thanks to @daniellemccool. - - 63. `foverlaps` now raise a meaningful error for duplicate column names, closes [#1730](https://github.com/Rdatatable/data.table/issues/1730). Thanks @rodonn. - - 64. `na.omit` and `unique` methods now removes indices, closes [#1734](https://github.com/Rdatatable/data.table/issues/1734) and [#1760](https://github.com/Rdatatable/data.table/issues/1760). Thanks @m-dz and @fc9.30. - - 65. List of data.tables with custom class is printed properly, [#1758](https://github.com/Rdatatable/data.table/issues/1758). Thanks @fruce-ki. - - 66. `uniqueN` handles `na.rm=TRUE` argument on sorted inputs correctly, [#1771](https://github.com/Rdatatable/data.table/issues/1771). Thanks @ywhuofu. - - 67. `get()` / `mget()` play nicely with `.SD` / `.SDcols`, [#1744](https://github.com/Rdatatable/data.table/issues/1753). Thanks @franknarf1. - - 68. Joins on integer64 columns assigns `NA` correctly for no matching rows, [#1385](https://github.com/Rdatatable/data.table/issues/1385) and partly [#1459](https://github.com/Rdatatable/data.table/issues/1459). Thanks @dlithio and @abielr. - - 69. Added `as.IDate.POSIXct` to prevent loss of timezone information, [#1498](https://github.com/Rdatatable/data.table/issues/1498). Thanks @dougedmunds for reporting and @MichaelChirico for the investigating & fixing. - - 70. Retaining / removing keys is handled better when join is performed on non-key columns using `on` argument, [#1766](https://github.com/Rdatatable/data.table/issues/1766), [#1704](https://github.com/Rdatatable/data.table/issues/1704) and [#1823](https://github.com/Rdatatable/data.table/issues/1823). Thanks @mllg, @DavidArenburg and @mllg. - - 71. `rbind` for data.tables now coerces non-list inputs to data.tables first before calling `rbindlist` so that binding list of data.tables and matrices work as expected to be consistent with base's rbind, [#1626](https://github.com/Rdatatable/data.table/issues/1626). Thanks @ems for reporting [here](http://stackoverflow.com/q/34426957/559784) on SO. - - 72. Subassigning a factor column with `NA` works as expected. Also, the warning message on coercion is suppressed when RHS is singleton NA, [#1740](https://github.com/Rdatatable/data.table/issues/1740). Thanks @Zus. - - 73. Joins on key columns in the presence of `on=` argument were slightly slower as it was unnecesarily running a check to ensure orderedness. This is now fixed, [#1825](https://github.com/Rdatatable/data.table/issues/1825). Thanks @sz-cgt. See that post for updated benchmark. - - 74. `keyby=` now runs j in the order that the groups appear in the sorted result rather than first appearance order, [#606](https://github.com/Rdatatable/data.table/issues/606). This only makes a difference in very rare usage where j does something depending on an earlier group's result, perhaps by using `<<-`. If j is required to be run in first appearance order, then use `by=` whose behaviour is unchanged. Now we have this option. No existing tests affected. New tests added. - - 75. `:=` verbose messages have been corrected and improved, [#1808](https://github.com/Rdatatable/data.table/issues/1808). Thanks to @franknarf1 for reproducible examples. Tests added. - - 76. `DT[order(colA,na.last=NA)]` on a 2-row `DT` with one NA in `colA` and `na.last=NA` (meaning to remove NA) could return a randomly wrong result due to using uninitialized memory. Tests added. - - 77. `fread` is now consistent to `read.table` on `colClasses` vector containing NA, also fixes mixed character and factor in `colClasses` vector. Closes [#1910](https://github.com/Rdatatable/data.table/issues/1910). - -#### NOTES - - 1. Updated error message on invalid joins to reflect the new `on=` syntax, [#1368](https://github.com/Rdatatable/data.table/issues/1368). Thanks @MichaelChirico. - - 2. Fixed test 842 to account for `gdata::last` as well, [#1402](https://github.com/Rdatatable/data.table/issues/1402). Thanks @JanGorecki. - - 3. Fixed tests for `fread` 1378.2 and 1378.3 with `showProgress = FALSE`, closes [#1397](https://github.com/Rdatatable/data.table/issues/1397). Thanks to @JanGorecki for the PR. - - 4. Worked around auto index error in `v1.9.6` to account for indices created with `v1.9.4`, [#1396](https://github.com/Rdatatable/data.table/issues/1396). Thanks @GRandom. - - 5. `test.data.table` gets new argument `silent`, if set to TRUE then it will not raise exception but returns TRUE/FALSE based on the test results. - - 6. `dim.data.table` is now implemented in C. Thanks to Andrey Riabushenko. - - 7. Better fix to `fread`'s `check.names` argument using `make.names()`, [#1027](https://github.com/Rdatatable/data.table/issues/1027). Thanks to @DavidArenberg for spotting the issue with the previous fix using `make.unique()`. - - 8. Fixed explanation of `skip` argument in `?fread` as spotted by @aushev, [#1425](https://github.com/Rdatatable/data.table/issues/1425). - - 9. Run `install_name_tool` when building on OS X to ensure that the install name for datatable.so matches its filename. Fixes [#1144](https://github.com/Rdatatable/data.table/issues/1144). Thanks to @chenghlee for the PR. - - 10. Updated documentation of `i` in `[.data.table` to emphasize the emergence of the new `on` option as an alternative to keyed joins, [#1488](https://github.com/Rdatatable/data.table/issues/1488). Thanks @MichaelChirico. - - 11. Improvements and fixes to `?like` [#1515](https://github.com/Rdatatable/data.table/issues/1515). Thanks to @MichaelChirico for the PR. - - 12. Several improvements and fixes to `?between` [#1521](https://github.com/Rdatatable/data.table/issues/1521). Thanks @MichaelChirico for the PR. - - 13. `?shift.Rd` is fixed so that it does not get misconstrued to be in a time series sense. Closes [#1530](https://github.com/Rdatatable/data.table/issues/1530). Thanks to @pstoyanov. - - 14. `?truelength.Rd` is fixed to reflect that over-allocation happens on data.tables loaded from disk only during column additions and not deletions, [#1536](https://github.com/Rdatatable/data.table/issues/1536). Thanks to @Roland and @rajkrpan. - - 15. Added `\n` to message displayed in `melt.data.table` when duplicate names are found, [#1538](https://github.com/Rdatatable/data.table/issues/1538). Thanks @Franknarf1. - - 16. `merge.data.table` will raise warning if any of data.tables to join has 0 columns. Closes [#597](https://github.com/Rdatatable/data.table/issues/597). - - 17. Travis-CI will now automatically deploy package to drat repository hosted on [data.table@gh-pages](https://github.com/Rdatatable/data.table/tree/gh-pages) branch allowing to install latest devel from **source** via `install.packages("data.table", repos = "https://Rdatatable.github.io/data.table", type = "source")`. Closes [#1505](https://github.com/Rdatatable/data.table/issues/1505). - - 18. Dependency on `chron` package has been changed to *suggested*. Closes [#1558](https://github.com/Rdatatable/data.table/issues/1558). - - 19. Rnw vignettes are converted to Rmd. The *10 minute quick introduction* Rnw vignette has been removed, since almost all of its contents are consolidated into the new intro Rmd vignette. Thanks to @MichaelChirico and @jangorecki. - - A *quick tour of data.table* HTML vignette is in the works in the spirit of the previous *10 minute quick intro* PDF guide. - - 20. `row.names` argument to `print.data.table` can now be changed by default via `options("datatable.print.rownames")` (`TRUE` by default, the inherited standard), [#1097](https://github.com/Rdatatable/data.table/issues/1097). Thanks to @smcinerney for the suggestion and @MichaelChirico for the PR. - - 21. `data.table`s with `NULL` or blank column names now print with blank column names, [#545](https://github.com/Rdatatable/data.table/issues/545), with minor revision to [#97](https://github.com/Rdatatable/data.table/issues/97). Thanks to @arunsrinivasan for reporting and @MichaelChirico for the PR. - - 21. Added a FAQ entry for the new update to `:=` which sometimes doesn't print the result on the first time, [#939](https://github.com/Rdatatable/data.table/issues/939). - - 22. Added `Note` section and examples to `?":="` for [#905](https://github.com/Rdatatable/data.table/issues/905). - - 23. Fixed example in `?as.data.table.Rd`, [#1576](https://github.com/Rdatatable/data.table/issues/1576). Thanks @MichaelChirico. - - 24. Fixed an edge case and added tests for columns of type `function`, [#518](https://github.com/Rdatatable/data.table/issues/518). - - 25. `data.table`'s dependency has been moved forward from R 2.14.1 to R 3.0.0 (Apr 2013; i.e. 3 years old). We keep this dependency as old as possible for as long as possible as requested by users in managed environments. This bump allows `data.table` internals to use `paste0()` for the first time and also allows `fsort()` to accept vectors of length over 2 billion items. Before release to CRAN [our procedures](https://github.com/Rdatatable/data.table/blob/master/CRAN_Release.cmd) include running the test suite using this stated dependency. - - 26. New option `options(datatable.use.index = TRUE)` (default) gives better control over usage of indices, when combined with `options(datatable.auto.index = FALSE)` it allows to use only indices created manually with `setindex` or `setindexv`. Closes [#1422](https://github.com/Rdatatable/data.table/issues/1422). - - 27. The default number of over-allocated spare column pointer slots has been increased from 64 to 1024. The wasted memory overhead (if never used) is insignificant (0.008 MB). The advantage is that adding a large number of columns by reference using := or set() inside a loop will not now saturate as quickly and need reallocating. An alleviation to issue [#1633](https://github.com/Rdatatable/data.table/issues/1633). See `?alloc.col` for how to change this default yourself. Accordingly, the warning 'attempt to reduce allocation has been ignored' has been downgraded to a message in verbose mode. That typically occurs when using (not recommended) `[<-` and `$<-` methods on data.table. The `n=` argument to `alloc.col()` is now simply the number of spare column slots to over-allocate (on creation and reallocation). An expression using `ncol(DT)` is still ok but now deprecated. - - 28. `?IDateTime` now makes clear that `wday`, `yday` and `month` are all 1- (not 0- as in `POSIXlt`) based, [#1658](https://github.com/Rdatatable/data.table/issues/1658); thanks @MichaelChirico. - - 29. Fixed misleading documentation of `?uniqueN`, [#1746](https://github.com/Rdatatable/data.table/issues/1746). Thanks @SymbolixAU. - - 30. `melt.data.table` restricts column names printed during warning messages to a maximum of five, [#1752](https://github.com/Rdatatable/data.table/issues/1752). Thanks @franknarf1. - - 31. data.table's `setNumericRounding` has a default value of 0, which means ordering, joining and grouping of numeric values will be done at *full precision* by default. Handles [#1642](https://github.com/Rdatatable/data.table/issues/1642), [#1728](https://github.com/Rdatatable/data.table/issues/1728), [#1463](https://github.com/Rdatatable/data.table/issues/1463), [#485](https://github.com/Rdatatable/data.table/issues/485). - - 32. Subsets with S4 objects in `i` are now faster, [#1438](https://github.com/Rdatatable/data.table/issues/1438). Thanks @DCEmilberg. - - 33. When formula RHS is `.` and multiple functions are provided to `fun.aggregate`, column names of the cast data.table columns don't have the `.` in them, as it doesn't add any useful information really, [#1821](https://github.com/Rdatatable/data.table/issues/1821). Thanks @franknarf1. - - 34. Function names are added to column names on cast data.tables only when more than one function is provided, [#1810](https://github.com/Rdatatable/data.table/issues/1810). Thanks @franknarf1. - - 35. The option `datatable.old.bywithoutby` to restore the old default has been removed. As warned 2 years ago in release notes and explicitly warned about for 1 year when used. Search down this file for the text 'bywithoutby' to see previous notes on this topic. - - 36. Using `with=FALSE` together with `:=` was deprecated in v1.9.4 released 2 years ago (Oct 2014). As warned then in release notes (see below) this is now a warning with advice to wrap the LHS of `:=` with parenthesis; e.g. `myCols=c("colA","colB"); DT[,(myCols):=1]`. In the next release, this warning message will be an error message. - - 37. Using `nomatch` together with `:=` now warns that it is ignored. - - 38. Logical `i` is no longer recycled. Instead an error message if it isn't either length 1 or `nrow(DT)`. This was hiding more bugs than was worth the rare convenience. The error message suggests to recycle explcitly; i.e. `DT[rep(,length=.N),...]`. - - 39. Thanks to Mark Landry and Michael Chirico for finding and reporting a problem in dev before release with auto `with=FALSE` (item 3 above) when `j` starts with with `!` or `-`, [#1864](https://github.com/Rdatatable/data.table/issues/1864). Fixed and tests added. - - 40. Following latest recommended testthat practices and to avoid a warning that it now issues, `inst/tests/testthat` has been moved to `/tests/testthat`. This means that testthat tests won't be installed for use by users by default and that `test_package("data.table")` will now fail with error `No matching test file in dir` and also a warning `Placing tests in inst/tests/ is deprecated. Please use tests/testthat/ instead`. (That warning seems to be misleading since we already have made that move.) To install testthat tests (and this applies to all packages using testthat not just data.table) you need to follow the [deleted instructions](https://github.com/hadley/testthat/commit/0a7d27bb9ea545be7da1a10e511962928d888302) in testthat's README; i.e., reinstall data.table either with `--install-tests` passed to `R CMD INSTALL` or `INSTALL_opts = "--install-tests"` passed to `install.packages()`. After that, `test_package("data.table")` will work. However, the main test suite of data.table (5,000+ tests) doesn't use testthat at all. Those tests are always installed so that `test.data.table()` can always be run by users at any time to confirm your installation on your platform is working correctly. Sometimes when supporting you, you may be asked to run `test.data.table()` and provide the output. Particularly now that data.table uses OpenMP. The file `/tests/tests.R` (which just calls `test.data.table()`) has been renamed to `/tests/main.R` to make this clearer to those looking at the GitHub repository and a comment has been added to `/tests/main.R` pointing to `/inst/tests/tests.Rraw` where those tests live. Some of these tests test data.table's compability with other packages and that is the reason those packages are listed in `DESCRIPTION:Suggests`. If you don't have some of those packages installed, `test.data.table()` will print output that it has skipped tests of compatibility with those packages. On CRAN all Suggests packages are available and data.table's tests of compatibility with them are tested by CRAN every day. - - 41. The license field is changed from "GPL (>= 2)" to "GPL-3 | file LICENSE" due to independent communication from two users of data.table at Google. The lack of an explicit license file was preventing them from contributing patches to data.table. Further, Google lawyers require the full text of the license and not a URL to the license. Since this requirement appears to require the choice of one license, we opted for GPL-3 and we checked the GPL-3 is fine by Google for them to use and contribute to. Accordingly, data.table's LICENSE file is an exact duplicate copy of the canonical GPL-3. - - 42. Thanks to @rrichmond for finding and reporting a regression in dev before release with `roll` not respecting fractions in type double, [#1904](https://github.com/Rdatatable/data.table/issues/1904). For example dates like `zoo::as.yearmon("2016-11")` which is stored as `double` value 2016.833. Fixed and test added. - - -### Changes in v1.9.6 (on CRAN 19 Sep 2015) - -#### NEW FEATURES - - 1. `fread` - * passes `showProgress=FALSE` through to `download.file()` (as `quiet=TRUE`). Thanks to a pull request from Karl Broman and Richard Scriven for filing the issue, [#741](https://github.com/Rdatatable/data.table/issues/741). - * accepts `dec=','` (and other non-'.' decimal separators), [#917](https://github.com/Rdatatable/data.table/issues/917). A new paragraph has been added to `?fread`. On Windows this should just-work. On Unix it may just-work but if not you will need to read the paragraph for an extra step. In case it somehow breaks `dec='.'`, this new feature can be turned off with `options(datatable.fread.dec.experiment=FALSE)`. - * Implemented `stringsAsFactors` argument for `fread()`. When `TRUE`, character columns are converted to factors. Default is `FALSE`. Thanks to Artem Klevtsov for filing [#501](https://github.com/Rdatatable/data.table/issues/501), and to @hmi2015 for [this SO post](http://stackoverflow.com/q/31350209/559784). - * gains `check.names` argument, with default value `FALSE`. When `TRUE`, it uses the base function `make.unique()` to ensure that the column names of the data.table read in are all unique. Thanks to David Arenburg for filing [#1027](https://github.com/Rdatatable/data.table/issues/1027). - * gains `encoding` argument. Acceptable values are "unknown", "UTF-8" and "Latin-1" with default value of "unknown". Closes [#563](https://github.com/Rdatatable/data.table/issues/563). Thanks to @BenMarwick for the original report and to the many requests from others, and Q on SO. - * gains `col.names` argument, and is similar to `base::read.table()`. Closes [#768](https://github.com/Rdatatable/data.table/issues/768). Thanks to @dardesta for filing the FR. - - 2. `DT[column == value]` no longer recycles `value` except in the length 1 case (when it still uses DT's key or an automatic secondary key, as introduced in v1.9.4). If `length(value)==length(column)` then it works element-wise as standard in R. Otherwise, a length error is issued to avoid common user errors. `DT[column %in% values]` still uses DT's key (or an an automatic secondary key) as before. Automatic indexing (i.e., optimization of `==` and `%in%`) may still be turned off with `options(datatable.auto.index=FALSE)`. - - 3. `na.omit` method for data.table is rewritten in C, for speed. It's ~11x faster on bigger data; see examples under `?na.omit`. It also gains two additional arguments a) `cols` accepts column names (or numbers) on which to check for missing values. 2) `invert` when `TRUE` returns the rows with any missing values instead. Thanks to the suggestion and PR from @matthieugomez. - - 4. New function `shift()` implements fast `lead/lag` of *vector*, *list*, *data.frames* or *data.tables*. It takes a `type` argument which can be either *"lag"* (default) or *"lead"*. It enables very convenient usage along with `:=` or `set()`. For example: `DT[, (cols) := shift(.SD, 1L), by=id]`. Please have a look at `?shift` for more info. - - 5. `frank()` is now implemented. It's much faster than `base::rank` and does more. It accepts *vectors*, *lists* with all elements of equal lengths, *data.frames* and *data.tables*, and optionally takes a `cols` argument. In addition to implementing all the `ties.method` methods available from `base::rank`, it also implements *dense rank*. It is also capable of calculating ranks by ordering column(s) in ascending or descending order. See `?frank` for more. Closes [#760](https://github.com/Rdatatable/data.table/issues/760) and [#771](https://github.com/Rdatatable/data.table/issues/771) - - 6. `rleid()`, a convenience function for generating a run-length type id column to be used in grouping operations is now implemented. Closes [#686](https://github.com/Rdatatable/data.table/issues/686). Check `?rleid` examples section for usage scenarios. - - 7. Efficient convertion of `xts` to data.table. Closes [#882](https://github.com/Rdatatable/data.table/issues/882). Check examples in `?as.xts.data.table` and `?as.data.table.xts`. Thanks to @jangorecki for the PR. - - 8. `rbindlist` gains `idcol` argument which can be used to generate an index column. If `idcol=TRUE`, the column is automatically named `.id`. Instead you can also provide a column name directly. If the input list has no names, indices are automatically generated. Closes [#591](https://github.com/Rdatatable/data.table/issues/591). Also thanks to @KevinUshey for filing [#356](https://github.com/Rdatatable/data.table/issues/356). - - 9. A new helper function `uniqueN` is now implemented. It is equivalent to `length(unique(x))` but much faster. It handles `atomic vectors`, `lists`, `data.frames` and `data.tables` as input and returns the number of unique rows. Closes [#884](https://github.com/Rdatatable/data.table/issues/884). Gains by argument. Closes [#1080](https://github.com/Rdatatable/data.table/issues/1080). Closes [#1224](https://github.com/Rdatatable/data.table/issues/1224). Thanks to @DavidArenburg, @kevinmistry and @jangorecki. - - 10. Implemented `transpose()` to transpose a list and `tstrsplit` which is a wrapper for `transpose(strsplit(...))`. This is particularly useful in scenarios where a column has to be split and the resulting list has to be assigned to multiple columns. See `?transpose` and `?tstrsplit`, [#1025](https://github.com/Rdatatable/data.table/issues/1025) and [#1026](https://github.com/Rdatatable/data.table/issues/1026) for usage scenarios. Closes both #1025 and #1026 issues. - * Implemented `type.convert` as suggested by Richard Scriven. Closes [#1094](https://github.com/Rdatatable/data.table/issues/1094). - - 11. `melt.data.table` - * can now melt into multiple columns by providing a list of columns to `measure.vars` argument. Closes [#828](https://github.com/Rdatatable/data.table/issues/828). Thanks to Ananda Mahto for the extended email discussions and ideas on generating the `variable` column. - * also retains attributes wherever possible. Closes [#702](https://github.com/Rdatatable/data.table/issues/702) and [#993](https://github.com/Rdatatable/data.table/issues/993). Thanks to @richierocks for the report. - * Added `patterns.Rd`. Closes [#1294](https://github.com/Rdatatable/data.table/issues/1294). Thanks to @MichaelChirico. - - 12. `.SDcols` - * understands `!` now, i.e., `DT[, .SD, .SDcols=!"a"]` now works, and is equivalent to `DT[, .SD, .SDcols = -c("a")]`. Closes [#1066](https://github.com/Rdatatable/data.table/issues/1066). - * accepts logical vectors as well. If length is smaller than number of columns, the vector is recycled. Closes [#1060](https://github.com/Rdatatable/data.table/issues/1060). Thanks to @StefanFritsch. - - 13. `dcast` can now: - * cast multiple `value.var` columns simultaneously. Closes [#739](https://github.com/Rdatatable/data.table/issues/739). - * accept multiple functions under `fun.aggregate`. Closes [#716](https://github.com/Rdatatable/data.table/issues/716). - * supports optional column prefixes as mentioned under [this SO post](http://stackoverflow.com/q/26225206/559784). Closes [#862](https://github.com/Rdatatable/data.table/issues/862). Thanks to @JohnAndrews. - * works with undefined variables directly in formula. Closes [#1037](https://github.com/Rdatatable/data.table/issues/1037). Thanks to @DavidArenburg for the MRE. - * Naming conventions on multiple columns changed according to [#1153](https://github.com/Rdatatable/data.table/issues/1153). Thanks to @MichaelChirico for the FR. - * also has a `sep` argument with default `_` for backwards compatibility. [#1210](https://github.com/Rdatatable/data.table/issues/1210). Thanks to @dbetebenner for the FR. - - 14. `.SDcols` and `with=FALSE` understand `colA:colB` form now. That is, `DT[, lapply(.SD, sum), by=V1, .SDcols=V4:V6]` and `DT[, V5:V7, with=FALSE]` works as intended. This is quite useful for interactive use. Closes [#748](https://github.com/Rdatatable/data.table/issues/748) and [#1216](https://github.com/Rdatatable/data.table/issues/1216). Thanks to @carbonmetrics, @jangorecki and @mtennekes. - - 15. `setcolorder()` and `setorder()` work with `data.frame`s too. Closes [#1018](https://github.com/Rdatatable/data.table/issues/1018). - - 16. `as.data.table.*` and `setDT` argument `keep.rownames` can take a column name as well. When `keep.rownames=TRUE`, the column will still automatically named `rn`. Closes [#575](https://github.com/Rdatatable/data.table/issues/575). - - 17. `setDT` gains a `key` argument so that `setDT(X, key="a")` would convert `X` to a `data.table` by reference *and* key by the columns specified. Closes [#1121](https://github.com/Rdatatable/data.table/issues/1121). - - 18. `setDF` also converts `list` of equal length to `data.frame` by reference now. Closes [#1132](https://github.com/Rdatatable/data.table/issues/1132). - - 19. `CJ` gains logical `unique` argument with default `FALSE`. If `TRUE`, unique values of vectors are automatically computed and used. This is convenient, for example, `DT[CJ(a, b, c, unique=TRUE)]` instead of doing `DT[CJ(unique(a), unique(b), unique(c))]`. Ultimately, `unique = TRUE` will be default. Closes [#1148](https://github.com/Rdatatable/data.table/issues/1148). - - 20. `on=` syntax: data.tables can join now without having to set keys by using the new `on` argument. For example: `DT1[DT2, on=c(x = "y")]` would join column 'y' of `DT2` with 'x' of `DT1`. `DT1[DT2, on="y"]` would join on column 'y' on both data.tables. Closes [#1130](https://github.com/Rdatatable/data.table/issues/1130) partly. - - 21. `merge.data.table` gains arguments `by.x` and `by.y`. Closes [#637](https://github.com/Rdatatable/data.table/issues/637) and [#1130](https://github.com/Rdatatable/data.table/issues/1130). No copies are made even when the specified columns aren't key columns in data.tables, and therefore much more fast and memory efficient. Thanks to @blasern for the initial PRs. Also gains logical argument `sort` (like base R). Closes [#1282](https://github.com/Rdatatable/data.table/issues/1282). - - 22. `setDF()` gains `rownames` argument for ready conversion to a `data.frame` with user-specified rows. Closes [#1320](https://github.com/Rdatatable/data.table/issues/1320). Thanks to @MichaelChirico for the FR and PR. - - 23. `print.data.table` gains `quote` argument (defaul=`FALSE`). This option surrounds all printed elements with quotes, helps make whitespace(s) more evident. Closes [#1177](https://github.com/Rdatatable/data.table/issues/1177); thanks to @MichaelChirico for the PR. - - 24. `[.data.table` now accepts single column numeric matrix in `i` argument the same way as `data.frame`. Closes [#826](https://github.com/Rdatatable/data.table/issues/826). Thanks to @jangorecki for the PR. - - 25. `setDT()` gains `check.names` argument paralleling that of `fread`, `data.table`, and `base` functionality, allowing poorly declared objects to be converted to tidy `data.table`s by reference. Closes [#1338](https://github.com/Rdatatable/data.table/issues/1338); thanks to @MichaelChirico for the FR/PR. - -#### BUG FIXES - - 1. `if (TRUE) DT[,LHS:=RHS]` no longer prints, [#869](https://github.com/Rdatatable/data.table/issues/869) and [#1122](https://github.com/Rdatatable/data.table/issues/1122). Tests added. To get this to work we've had to live with one downside: if a `:=` is used inside a function with no `DT[]` before the end of the function, then the next time `DT` or `print(DT)` is typed at the prompt, nothing will be printed. A repeated `DT` or `print(DT)` will print. To avoid this: include a `DT[]` after the last `:=` in your function. If that is not possible (e.g., it's not a function you can change) then `DT[]` at the prompt is guaranteed to print. As before, adding an extra `[]` on the end of a `:=` query is a recommended idiom to update and then print; e.g. `> DT[,foo:=3L][]`. Thanks to Jureiss and Jan Gorecki for reporting. - - 2. `DT[FALSE,LHS:=RHS]` no longer prints either, [#887](https://github.com/Rdatatable/data.table/issues/887). Thanks to Jureiss for reporting. - - 3. `:=` no longer prints in knitr for consistency with behaviour at the prompt, [#505](https://github.com/Rdatatable/data.table/issues/505). Output of a test `knit("knitr.Rmd")` is now in data.table's unit tests. Thanks to Corone for the illustrated report. - - 4. `knitr::kable()` works again without needing to upgrade from knitr v1.6 to v1.7, [#809](https://github.com/Rdatatable/data.table/issues/809). Packages which evaluate user code and don't wish to import data.table need to be added to `data.table:::cedta.pkgEvalsUserCode` and now only the `eval` part is made data.table-aware (the rest of such package's code is left data.table-unaware). `data.table:::cedta.override` is now empty and will be deprecated if no need for it arises. Thanks to badbye and Stephanie Locke for reporting. - - 5. `fread()`: - * doubled quotes ("") inside quoted fields including if immediately followed by an embedded newline. Thanks to James Sams for reporting, [#489](https://github.com/Rdatatable/data.table/issues/489). - * quoted fields with embedded newlines in the lines used to detect types, [#810](https://github.com/Rdatatable/data.table/issues/810). Thanks to Vladimir Sitnikov for the scrambled data file which is now included in the test suite. - * when detecting types in the middle and end of the file, if the jump lands inside a quoted field with (possibly many) embedded newlines, this is now detected. - * if the file doesn't exist the error message is clearer ([#486](https://github.com/Rdatatable/data.table/issues/486)) - * system commands are now checked to contain at least one space - * sep="." now works (when dec!="."), [#502](https://github.com/Rdatatable/data.table/issues/502). Thanks to Ananda Mahto for reporting. - * better error message if quoted field is missing an end quote, [#802](https://github.com/Rdatatable/data.table/issues/802). Thanks to Vladimir Sitnikov for the sample file which is now included in the test suite. - * providing sep which is not present in the file now reads as if sep="\n" rather than 'sep not found', #738. Thanks to Adam Kennedy for explaining the use-case. - * segfault with errors over 1,000 characters (when long lines are included) is fixed, [#802](https://github.com/Rdatatable/data.table/issues/802). Thanks again to Vladimir Sitnikov. - * Missing `integer64` values are properly assigned `NA`s. Closes [#488](https://github.com/Rdatatable/data.table/issues/488). Thanks to @PeterStoyanov and @richierocks for the report. - * Column headers with empty strings aren't skipped anymore. [Closes #483](https://github.com/Rdatatable/data.table/issues/483). Thanks to @RobyJoehanes and @kforner. - * Detects separator correctly when commas also exist in text fields. Closes [#923](https://github.com/Rdatatable/data.table/issues/923). Thanks to @raymondben for the report. - * `NA` values in NA inflated file are read properly. [Closes #737](https://github.com/Rdatatable/data.table/issues/737). Thanks to Adam Kennedy. - * correctly handles `na.strings` argument for all types of columns - it detect possible `NA` values without coercion to character, like in base `read.table`. [fixes #504](https://github.com/Rdatatable/data.table/issues/504). Thanks to @dselivanov for the PR. Also closes [#1314](https://github.com/Rdatatable/data.table/issues/1314), which closes this issue completely, i.e., `na.strings = c("-999", "FALSE")` etc. also work. - * deals with quotes more robustly. When reading quoted fields fail, it re-attemps to read the field as if it wasn't quoted. This helps read in those fields that might have unbalanced quotes without erroring immediately, thereby closing issues [#568](https://github.com/Rdatatable/data.table/issues/568), [#1256](https://github.com/Rdatatable/data.table/issues/1256), [#1077](https://github.com/Rdatatable/data.table/issues/1077), [#1079](https://github.com/Rdatatable/data.table/issues/1079) and [#1095](https://github.com/Rdatatable/data.table/issues/1095). Thanks to @Synergist, @daroczig, @geotheory and @rsaporta for the reports. - * gains argument `strip.white` which is `TRUE` by default (unlike `base::read.table`). All unquoted columns' leading and trailing white spaces are automatically removed. If \code{FALSE}, only trailing spaces of header is removed. Closes [#1113](https://github.com/Rdatatable/data.table/issues/1113), [#1035](https://github.com/Rdatatable/data.table/issues/1035), [#1000](https://github.com/Rdatatable/data.table/issues/1000), [#785](https://github.com/Rdatatable/data.table/issues/785), [#529](https://github.com/Rdatatable/data.table/issues/529) and [#956](https://github.com/Rdatatable/data.table/issues/956). Thanks to @dmenne, @dpastoor, @GHarmata, @gkalnytskyi, @renqian, @MatthewForrest, @fxi and @heraldb. - * doesn't warn about empty lines when 'nrow' argument is specified and that many rows are read properly. Thanks to @richierocks for the report. Closes [#1330](https://github.com/Rdatatable/data.table/issues/1330). - * doesn't error/warn about not being able to read last 5 lines when 'nrow' argument is specified. Thanks to @robbig2871. Closes [#773](https://github.com/Rdatatable/data.table/issues/773). - - 6. Auto indexing: - * `DT[colA == max(colA)]` now works again without needing `options(datatable.auto.index=FALSE)`. Thanks to Jan Gorecki and kaybenleroll, [#858](https://github.com/Rdatatable/data.table/issues/858). Test added. - * `DT[colA %in% c("id1","id2","id2","id3")]` now ignores the RHS duplicates (as before, consistent with base R) without needing `options(datatable.auto.index=FALSE)`. Thanks to Dayne Filer for reporting. - * If `DT` contains a column `class` (happens to be a reserved attribute name in R) then `DT[class=='a']` now works again without needing `options(datatable.auto.index=FALSE)`. Thanks to sunnyghkm for reporting, [#871](https://github.com/Rdatatable/data.table/issues/871). - * `:=` and `set*` now drop secondary keys (new in v1.9.4) so that `DT[x==y]` works again after a `:=` or `set*` without needing `options(datatable.auto.index=FALSE)`. Only `setkey()` was dropping secondary keys correctly. 23 tests added. Thanks to user36312 for reporting, [#885](https://github.com/Rdatatable/data.table/issues/885). - * Automatic indices are not created on `.SD` so that `dt[, .SD[b == "B"], by=a]` works correctly. Fixes [#958](https://github.com/Rdatatable/data.table/issues/958). Thanks to @azag0 for the nice reproducible example. - * `i`-operations resulting in 0-length rows ignore `j` on subsets using auto indexing. Closes [#1001](https://github.com/Rdatatable/data.table/issues/1001). Thanks to @Gsee. - * `POSIXct` type columns work as expected with auto indexing. Closes [#955](https://github.com/Rdatatable/data.table/issues/955). Thanks to @GSee for the minimal report. - * Auto indexing with `!` operator, for e.g., `DT[!x == 1]` works as intended. Closes [#932](https://github.com/Rdatatable/data.table/issues/932). Thanks to @matthieugomez for the minimal example. - * While fixing `#932`, issues on subsetting `NA` were also spotted and fixed, for e.g., `DT[x==NA]` or `DT[!x==NA]`. - * Works fine when RHS is of `list` type - quite unusual operation but could happen. Closes [#961](https://github.com/Rdatatable/data.table/issues/961). Thanks to @Gsee for the minimal report. - * Auto indexing errored in some cases when LHS and RHS were not of same type. This is fixed now. Closes [#957](https://github.com/Rdatatable/data.table/issues/957). Thanks to @GSee for the minimal report. - * `DT[x == 2.5]` where `x` is integer type resulted in `val` being coerced to integer (for binary search) and therefore returned incorrect result. This is now identified using the function `isReallyReal()` and if so, auto indexing is turned off. Closes [#1050](https://github.com/Rdatatable/data.table/issues/1050). - * Auto indexing errored during `DT[x %in% val]` when `val` has some values not present in `x`. Closes [#1072](https://github.com/Rdatatable/data.table/issues/1072). Thanks to @CarlosCinelli for asking on [StackOverflow](http://stackoverflow.com/q/28932742/559784). - - 7. `as.data.table.list` with list input having 0-length items, e.g. `x = list(a=integer(0), b=3:4)`. `as.data.table(x)` recycles item `a` with `NA`s to fit the length of the longer column `b` (length=2), as before now, but with an additional warning message that the item has been recycled with `NA`. Closes [#847](https://github.com/Rdatatable/data.table/issues/847). Thanks to @tvinodr for the report. This was a regression from 1.9.2. - - 8. `DT[i, j]` when `i` returns all `FALSE` and `j` contains some length-0 values (ex: `integer(0)`) now returns an empty data.table as it should. Closes [#758](https://github.com/Rdatatable/data.table/issues/758) and [#813](https://github.com/Rdatatable/data.table/issues/813). Thanks to @tunaaa and @nigmastar for the nice reproducible reports. - - 9. `allow.cartesian` is ignored during joins when: - * `i` has no duplicates and `mult="all"`. Closes [#742](https://github.com/Rdatatable/data.table/issues/742). Thanks to @nigmastar for the report. - * assigning by reference, i.e., `j` has `:=`. Closes [#800](https://github.com/Rdatatable/data.table/issues/800). Thanks to @matthieugomez for the report. - - In both these cases (and during a `not-join` which was already fixed in [1.9.4](https://github.com/Rdatatable/data.table/blob/master/README.md#bug-fixes-1)), `allow.cartesian` can be safely ignored. - - 10. `names<-.data.table` works as intended on data.table unaware packages with Rv3.1.0+. Closes [#476](https://github.com/Rdatatable/data.table/issues/476) and [#825](https://github.com/Rdatatable/data.table/issues/825). Thanks to ezbentley for reporting [here](http://stackoverflow.com/q/23256177/559784) on SO and to @narrenfrei. - - 11. `.EACHI` is now an exported symbol (just like `.SD`,`.N`,`.I`,`.GRP` and `.BY` already were) so that packages using `data.table` and `.EACHI` pass `R CMD check` with no NOTE that this symbol is undefined. Thanks to Matt Bannert for highlighting. - - 12. Some optimisations of `.SD` in `j` was done in 1.9.4, refer to [#735](https://github.com/Rdatatable/data.table/issues/735). Due to an oversight, j-expressions of the form c(lapply(.SD, ...), list(...)) were optimised improperly. This is now fixed. Thanks to @mmeierer for filing [#861](https://github.com/Rdatatable/data.table/issues/861). - - 13. `j`-expressions in `DT[, col := x$y()]` (or) `DT[, col := x[[1]]()]` are now (re)constructed properly. Thanks to @ihaddad-md for reporting. Closes [#774](https://github.com/Rdatatable/data.table/issues/774). - - 14. `format.ITime` now handles negative values properly. Closes [#811](https://github.com/Rdatatable/data.table/issues/811). Thanks to @StefanFritsch for the report along with the fix! - - 15. Compatibility with big endian machines (e.g., SPARC and PowerPC) is restored. Most Windows, Linux and Mac systems are little endian; type `.Platform$endian` to confirm. Thanks to Gerhard Nachtmann for reporting and the [QEMU project](http://qemu.org/) for their PowerPC emulator. - - 16. `DT[, LHS := RHS]` with RHS is of the form `eval(parse(text = foo[1]))` referring to columns in `DT` is now handled properly. Closes [#880](https://github.com/Rdatatable/data.table/issues/880). Thanks to tyner. - - 17. `subset` handles extracting duplicate columns in consistency with data.table's rule - if a column name is duplicated, then accessing that column using column number should return that column, whereas accessing by column name (due to ambiguity) will always extract the first column. Closes [#891](https://github.com/Rdatatable/data.table/issues/891). Thanks to @jjzz. - - 18. `rbindlist` handles combining levels of data.tables with both ordered and unordered factor columns properly. Closes [#899](https://github.com/Rdatatable/data.table/issues/899). Thanks to @ChristK. - - 19. Updating `.SD` by reference using `set` also errors appropriately now; similar to `:=`. Closes [#927](https://github.com/Rdatatable/data.table/issues/927). Thanks to @jrowen for the minimal example. - - 20. `X[Y, .N]` returned the same result as `X[Y, .N, nomatch=0L]`) when `Y` contained rows that has no matches in `X`. Fixed now. Closes [#963](https://github.com/Rdatatable/data.table/issues/963). Thanks to [this SO post](http://stackoverflow.com/q/27004002/559784) from @Alex which helped discover the bug. - - 21. `data.table::dcast` handles levels in factor columns properly when `drop = FALSE`. Closes [#893](https://github.com/Rdatatable/data.table/issues/893). Thanks to @matthieugomez for the great minimal example. - - 22. `[.data.table` subsets complex and raw type objects again. Thanks to @richierocks for the nice minimal example. Closes [#982](https://github.com/Rdatatable/data.table/issues/982). - - 23. Fixed a bug in the internal optimisation of `j-expression` with more than one `lapply(.SD, function(..) ..)` as illustrated [here on SO](http://stackoverflow.com/a/27495844/559784). Closes #985. Thanks to @jadaliha for the report and to @BrodieG for the debugging on SO. - - 24. `mget` fetches columns from the default environment `.SD` when called from within the frame of `DT`. That is, `DT[, mget(cols)]`, `DT[, lapply(mget(cols), sum), by=.]` etc.. work as intended. Thanks to @Roland for filing this issue. Closes [#994](https://github.com/Rdatatable/data.table/issues/994). - - 25. `foverlaps()` did not find overlapping intervals correctly *on numeric ranges* in a special case where both `start` and `end` intervals had *0.0*. This is now fixed. Thanks to @tdhock for the reproducible example. Closes [#1006](https://github.com/Rdatatable/data.table/issues/1006) partly. - - 26. When performing rolling joins, keys are set only when we can be absolutely sure. Closes [#1010](https://github.com/Rdatatable/data.table/issues/1010), which explains cases where keys should not be retained. - - 27. Rolling joins with `-Inf` and `Inf` are handled properly. Closes [#1007](https://github.com/Rdatatable/data.table/issues/1007). Thanks to @tdhock for filing [#1006](https://github.com/Rdatatable/data.table/issues/1006) which lead to the discovery of this issue. - - 28. Overlapping range joins with `-Inf` and `Inf` and 0.0 in them are handled properly now. Closes [#1006](https://github.com/Rdatatable/data.table/issues/1006). Thanks to @tdhock for filing the issue with a nice reproducible example. - - 29. Fixed two segfaults in `shift()` when number of rows in `x` is lesser than value for `n`. Closes [#1009](https://github.com/Rdatatable/data.table/issues/1009) and [#1014](https://github.com/Rdatatable/data.table/issues/1014). Thanks to @jangorecki and @ashinm for the reproducible reports. - - 30. Attributes are preserved for `sum()` and `mean()` when fast internal (GForce) implementations are used. Closes [#1023](https://github.com/Rdatatable/data.table/issues/1023). Thanks to @DavidArenburg for the nice reproducible example. - - 31. `lapply(l, setDT)` is handled properly now; over-allocation isn't lost. Similarly, `for (i in 1:k) setDT(l[[i]])` is handled properly as well. Closes [#480](https://github.com/Rdatatable/data.table/issues/480). - - 32. `rbindlist` stack imbalance on all `NULL` list elements is now fixed. Closes [#980](https://github.com/Rdatatable/data.table/issues/980). Thanks to @ttuggle. - - 33. List columns can be assigned to columns of `factor` type by reference. Closes [#936](https://github.com/Rdatatable/data.table/issues/936). Thanks to @richierocks for the minimal example. - - 34. After setting the `datatable.alloccol` option, creating a data.table with more than the set `truelength` resulted in error or segfault. This is now fixed. Closes [#970](https://github.com/Rdatatable/data.table/issues/970). Thanks to @caneff for the nice minimal example. - - 35. Update by reference using `:=` after loading from disk where the `data.table` exists within a local environment now works as intended. Closes [#479](https://github.com/Rdatatable/data.table/issues/479). Thanks to @ChongWang for the minimal reproducible example. - - 36. Issues on merges involving `factor` columns with `NA` and merging `factor` with `character` type with non-identical levels are both fixed. Closes [#499](https://github.com/Rdatatable/data.table/issues/499) and [#945](https://github.com/Rdatatable/data.table/issues/945). Thanks to @AbielReinhart and @stewbasic for the minimal examples. - - 37. `as.data.table(ll)` returned a `data.table` with 0-rows when the first element of the list has 0-length, for e.g., `ll = list(NULL, 1:2, 3:4)`. This is now fixed by removing those 0-length elements. Closes [#842](https://github.com/Rdatatable/data.table/issues/842). Thanks to @Rick for the nice minimal example. - - 38. `as.datat.able.factor` redirects to `as.data.table.matrix` when input is a `matrix`, but also of type `factor`. Closes [#868](https://github.com/Rdatatable/data.table/issues/868). Thanks to @mgahan for the example. - - 39. `setattr` now returns an error when trying to set `data.table` and/or `data.frame` as class to a *non-list* type object (ex: `matrix`). Closes [#832](https://github.com/Rdatatable/data.table/issues/832). Thanks to @Rick for the minimal example. - - 40. data.table(table) works as expected. Closes [#1043](https://github.com/Rdatatable/data.table/issues/1043). Thanks to @rnso for the [SO post](http://stackoverflow.com/q/28499359/559784). - - 41. Joins and binary search based subsets of the form `x[i]` where `x`'s key column is integer and `i` a logical column threw an error before. This is now fixed by converting the logical column to integer type and then performing the join, so that it works as expected. - - 42. When `by` expression is, for example, `by = x %% 2`, `data.table` tries to automatically extracts meaningful column names from the expression. In this case it would be `x`. However, if the `j-expression` also contains `x`, for example, `DT[, last(x), by= x %% 2]`, the original `x` got masked by the expression in `by`. This is now fixed; by-expressions are not simplified in column names for these cases. Closes [#497](https://github.com/Rdatatable/data.table/issues/497). Thanks to @GSee for the report. - - 43. `rbindlist` now errors when columns have non-identical class attributes and are not `factor`s, e.g., binding column of class `Date` with `POSIXct`. Previously this returned incorrect results. Closes [#705](https://github.com/Rdatatable/data.table/issues/705). Thanks to @ecoRoland for the minimal report. - - 44. Fixed a segfault in `melt.data.table` when `measure.vars` have duplicate names. Closes [#1055](https://github.com/Rdatatable/data.table/issues/1055). Thanks to @ChristK for the minimal report. - - 45. Fixed another segfault in `melt.data.table` issue that was caught due to issue in Windows. Closes [#1059](https://github.com/Rdatatable/data.table/issues/1059). Thanks again to @ChristK for the minimal report. - - 46. `DT[rows, newcol := NULL]` resulted in a segfault on the next assignment by reference. Closes [#1082](https://github.com/Rdatatable/data.table/issues/1082). Thanks to @stevenbagley for the MRE. - - 47. `as.matrix(DT)` handles cases where `DT` contains both numeric and logical columns correctly (doesn't coerce to character columns anymore). Closes [#1083](https://github.com/Rdatatable/data.table/issues/1083). Thanks to @bramvisser for the [SO post](http://stackoverflow.com/questions/29068328/correlation-between-numeric-and-logical-variable-gives-intended-error). - - 48. Coercion is handled properly on subsets/joins on `integer64` key columns. Closes [#1108](https://github.com/Rdatatable/data.table/issues/1108). Thanks to @vspinu. - - 49. `setDT()` and `as.data.table()` both strip *all classes* preceding *data.table*/*data.frame*, to be consistent with base R. Closes [#1078](https://github.com/Rdatatable/data.table/issues/1078) and [#1128](https://github.com/Rdatatable/data.table/issues/1128). Thanks to Jan and @helix123 for the reports. - - 50. `setattr(x, 'levels', value)` handles duplicate levels in `value` - appropriately. Thanks to Jeffrey Horner for pointing it out [here](http://jeffreyhorner.tumblr.com/post/118297392563/tidyr-challenge-help-me-do-my-job). Closes [#1142](https://github.com/Rdatatable/data.table/issues/1142). - - 51. `x[J(vals), .N, nomatch=0L]` also included no matches in result, [#1074](https://github.com/Rdatatable/data.table/issues/1074). And `x[J(...), col := val, nomatch=0L]` returned a warning with incorrect results when join resulted in no matches as well, even though `nomatch=0L` should have no effect in `:=`, [#1092](https://github.com/Rdatatable/data.table/issues/1092). Both issues are fixed now. Thanks to @riabusan and @cguill95 for #1092. - - 52. `.data.table.locked` attributes set to NULL in internal function `subsetDT`. Closes [#1154](https://github.com/Rdatatable/data.table/issues/1154). Thanks to @jangorecki. - - 53. Internal function `fastmean()` retains column attributes. Closes [#1160](https://github.com/Rdatatable/data.table/issues/1160). Thanks to @renkun-ken. - - 54. Using `.N` in `i`, for e.g., `DT[, head(.SD, 3)[1:(.N-1L)]]` accessed incorrect value of `.N`. This is now fixed. Closes [#1145](https://github.com/Rdatatable/data.table/issues/1145). Thanks to @claytonstanley. - - 55. `setDT` handles `key=` argument properly when input is already a `data.table`. Closes [#1169](https://github.com/Rdatatable/data.table/issues/1169). Thanks to @DavidArenburg for the PR. - - 56. Key is retained properly when joining on factor type columns. Closes [#477](https://github.com/Rdatatable/data.table/issues/477). Thanks to @nachti for the report. - - 57. Over-allocated memory is released more robustly thanks to Karl Millar's investigation and suggested fix. - - 58. `DT[TRUE, colA:=colA*2]` no longer churns through 4 unnecessary allocations as large as one column. This was caused by `i=TRUE` being recycled. Thanks to Nathan Kurz for reporting and investigating. Added provided test to test suite. Only a single vector is allocated now for the RHS (`colA*2`). Closes [#1249](https://github.com/Rdatatable/data.table/issues/1249). - - 59. Thanks to @and3k for the excellent bug report [#1258](https://github.com/Rdatatable/data.table/issues/1258). This was a result of shallow copy retaining keys when it shouldn't. It affected some cases of joins using `on=`. Fixed now. - - 60. `set()` and `:=` handle RHS value `NA_integer_` on factor types properly. Closes [#1234](https://github.com/Rdatatable/data.table/issues/1234). Thanks to @DavidArenburg. - - 61. `merge.data.table()` didn't set column order (and therefore names) properly in some cases. Fixed now. Closes [#1290](https://github.com/Rdatatable/data.table/issues/1290). Thanks to @ChristK for the minimal example. - - 62. print.data.table now works for 100+ rows as intended when `row.names=FALSE`. Closes [#1307](https://github.com/Rdatatable/data.table/issues/1307). Thanks to @jangorecki for the PR. - - 63. Row numbers are not printed in scientific format. Closes [#1167](https://github.com/Rdatatable/data.table/issues/1167). Thanks to @jangorecki for the PR. - - 64. Using `.GRP` unnamed in `j` now returns a variable named `GRP` instead of `.GRP` as the period was causing issues. Same for `.BY`. Closes [#1243](https://github.com/Rdatatable/data.table/issues/1243); thanks to @MichaelChirico for the PR. - - 65. `DT[, 0, with=FALSE]` returns null data.table to be consistent with `data.frame`'s behaviour. Closes [#1140](https://github.com/Rdatatable/data.table/issues/1140). Thanks to @franknarf1. - - 66. Evaluating quoted expressions with `.` in `by` works as intended. That is, `dt = data.table(a=c(1,1,2,2), b=1:4); expr=quote(.(a)); dt[, sum(b), eval(expr)]` works now. Closes [#1298](https://github.com/Rdatatable/data.table/issues/1298). Thanks @eddi. - - 67. `as.list` method for `IDate` object works properly. Closes [#1315](https://github.com/Rdatatable/data.table/issues/1315). Thanks to @gwerbin. - -#### NOTES - - 1. Clearer explanation of what `duplicated()` does (borrowed from base). Thanks to @matthieugomez for pointing out. Closes [#872](https://github.com/Rdatatable/data.table/issues/872). - - 2. `?setnames` has been updated now that `names<-` and `colnames<-` shallow (rather than deep) copy from R >= 3.1.0, [#853](https://github.com/Rdatatable/data.table/issues/872). - - 3. [FAQ 1.6](https://github.com/Rdatatable/data.table/wiki/vignettes/datatable-faq.pdf) has been embellished, [#517](https://github.com/Rdatatable/data.table/issues/517). Thanks to a discussion with Vivi and Josh O'Brien. - - 4. `data.table` redefines `melt` generic and *suggests* `reshape2` instead of *import*. As a result we don't have to load `reshape2` package to use `melt.data.table` anymore. The reason for this change is that `data.table` requires R >=2.14, whereas `reshape2` R v3.0.0+. Reshape2's melt methods can be used without any issues by loading the package normally. - - 5. `DT[, j, ]` at times made an additional (unnecessary) copy. This is now fixed. This fix also avoids allocating `.I` when `j` doesn't use it. As a result `:=` and other subset operations should be faster (and use less memory). Thanks to @szilard for the nice report. Closes [#921](https://github.com/Rdatatable/data.table/issues/921). - - 6. Because `reshape2` requires R >3.0.0, and `data.table` works with R >= 2.14.1, we can not import `reshape2` anymore. Therefore we define a `melt` generic and `melt.data.table` method for data.tables and redirect to `reshape2`'s `melt` for other objects. This is to ensure that existing code works fine. - - 7. `dcast` is also a generic now in data.table. So we can use `dcast(...)` directly, and don't have to spell it out as `dcast.data.table(...)` like before. The `dcast` generic in data.table redirects to `reshape2::dcast` if the input object is not a data.table. But for that you have to load `reshape2` before loading `data.table`. If not, reshape2's `dcast` overwrites data.table's `dcast` generic, in which case you will need the `::` operator - ex: `data.table::dcast(...)`. - - NB: Ideal situation would be for `dcast` to be a generic in reshape2 as well, but it is not. We have issued a [pull request](https://github.com/hadley/reshape/pull/62) to make `dcast` in reshape2 a generic, but that has not yet been accepted. - - 8. Clarified the use of `bit64::integer4` in `merge.data.table()` and `setNumericRounding()`. Closes [#1093](https://github.com/Rdatatable/data.table/issues/1093). Thanks to @sfischme for the report. - - 9. Removed an unnecessary (and silly) `giveNames` argument from `setDT()`. Not sure why I added this in the first place! - - 10. `options(datatable.prettyprint.char=5L)` restricts the number of characters to be printed for character columns. For example: - ``` - options(datatable.prettyprint.char = 5L) - DT = data.table(x=1:2, y=c("abcdefghij", "klmnopqrstuv")) - DT - # x y - # 1: 1 abcde... - # 2: 2 klmno... - ```` - - 11. `rolltolast` argument in `[.data.table` is now defunct. It was deprecated in 1.9.4. - - 12. `data.table`'s dependency has been moved forward from R 2.14.0 to R 2.14.1, now nearly 4 years old (Dec 2011). As usual before release to CRAN we ensure data.table passes the test suite on the stated dependency and keep this as old as possible for as long as possible. As requested by users in managed environments. For this reason we still don't use `paste0()` internally, since that was added to R 2.15.0. - - 13. Warning about `datatable.old.bywithoutby` option (for grouping on join without providing `by`) being deprecated in the next release is in place now. Thanks to @jangorecki for the PR. - - 14. Fixed `allow.cartesian` documentation to `nrow(x)+nrow(i)` instead of `max(nrow(x), nrow(i))`. Closes [#1123](https://github.com/Rdatatable/data.table/issues/1123). - -### Changes in v1.9.4 (on CRAN 2 Oct 2014) - -#### NEW FEATURES - -1. `by=.EACHI` runs `j` for each group in `DT` that each row of `i` joins to. - ``` - setkey(DT, ID) - DT[c("id1", "id2"), sum(val)] # single total across both id1 and id2 - DT[c("id1", "id2"), sum(val), by = .EACHI] # sum(val) for each id - DT[c("id1", "id2"), sum(val), by = key(DT)] # same - ``` - In other words, `by-without-by` is now explicit, as requested by users, [#371](https://github.com/Rdatatable/data.table/issues/371). When `i` contains duplicates, `by=.EACHI` is different to `by=key(DT)`; e.g., - ```R - setkey(DT, ID) - ids = c("id1", "id2", "id1") # NB: id1 appears twice - DT[ids, sum(val), by = ID] # 2 rows returned - DT[ids, sum(val), by = .EACHI] # 3 rows in the order of ids (result 1 and 3 are not merged) - ``` - `by=.EACHI` can be useful when `i` is event data, where you don't want the events aggregated by common join values but wish the output to be ordered with repeats, or simply just using join inherited columns as parameters; e.g.; - ```R - X[Y, head(.SD, i.top), by = .EACHI] - ``` - where `top` is a non-join column in `Y`; i.e., join inherited column. Thanks to many, especially eddi, Sadao Milberg and Gabor Grothendieck for extended discussions. Closes [#538](https://github.com/Rdatatable/data.table/issues/538). - -2. Accordingly, `X[Y, j]` now does what `X[Y][, j]` did. To return the old behaviour: `options(datatable.old.bywithoutby=TRUE)`. This is a temporary option to aid migration and will be removed in future. See [this](http://r.789695.n4.nabble.com/changing-data-table-by-without-by-syntax-to-require-a-quot-by-quot-td4664770.html), [this](http://stackoverflow.com/questions/16093289/data-table-join-and-j-expression-unexpected-behavior) and [this](http://stackoverflow.com/a/16222108/403310) post for discussions and motivation. - - 3. `Overlap joins` ([#528](https://github.com/Rdatatable/data.table/issues/528)) is now here, finally!! Except for `type="equal"` and `maxgap` and `minoverlap` arguments, everything else is implemented. Check out `?foverlaps` and the examples there on its usage. This is a major feature addition to `data.table`. - - 4. `DT[column==value]` and `DT[column %in% values]` are now optimized to use `DT`'s key when `key(DT)[1]=="column"`, otherwise a secondary key (a.k.a. _index_) is automatically added so the next `DT[column==value]` is much faster. No code changes are needed; existing code should automatically benefit. Secondary keys can be added manually using `set2key()` and existence checked using `key2()`. These optimizations and function names/arguments are experimental and may be turned off with `options(datatable.auto.index=FALSE)`. - - 5. `fread()`: - * accepts line breaks inside quoted fields. Thanks to Clayton Stanley for highlighting [here](http://stackoverflow.com/questions/21006661/fread-and-a-quoted-multi-line-column-value). - * accepts trailing backslash in quoted fields. Thanks to user2970844 for highlighting [here](http://stackoverflow.com/questions/24375832/fread-and-column-with-a-trailing-backslash). - * Blank and `"NA"` values in logical columns (`T`,`True`,`TRUE`) no longer cause them to be read as character, [#567](https://github.com/Rdatatable/data.table/issues/567). Thanks to Adam November for reporting. - * URLs now work on Windows. R's `download.file()` converts `\r\n` to `\r\r\n` on Windows. Now avoided by downloading in binary mode. Thanks to Steve Miller and Dean MacGregor for reporting, [#492](https://github.com/Rdatatable/data.table/issues/492). - * Fixed segfault in sparse data files when bumping to character, [#796](https://github.com/Rdatatable/data.table/issues/796) and [#722](https://github.com/Rdatatable/data.table/issues/722). Thanks to Adam Kennedy and Richard Cotton for the detailed reproducible reports. - * New argument `fread(...,data.table=FALSE)` returns a `data.frame` instead of a `data.table`. This can be set globally: `options(datatable.fread.datatable=FALSE)`. - -6. `.()` can now be used in `j` and is identical to `list()`, for consistency with `i`. - ```R - DT[,list(MySum=sum(B)),by=...] - DT[,.(MySum=sum(B)),by=...] # same - DT[,list(colB,colC,colD)] - DT[,.(colB,colC,colD)] # same - ``` - Similarly, `by=.()` is now a shortcut for `by=list()`, for consistency with `i` and `j`. - - 7. `rbindlist` gains `use.names` and `fill` arguments and is now implemented entirely in C. Closes [#345](https://github.com/Rdatatable/data.table/issues/345): - * `use.names` by default is FALSE for backwards compatibility (does not bind by names by default) - * `rbind(...)` now just calls `rbindlist()` internally, except that `use.names` is TRUE by default, for compatibility with base (and backwards compatibility). - * `fill=FALSE` by default. If `fill=TRUE`, `use.names` has to be TRUE. - * When use.names=TRUE, at least one item of the input list has to have non-null column names. - * When fill=TRUE, all items of the input list has to have non-null column names. - * Duplicate columns are bound in the order of occurrence, like base. - * Attributes that might exist in individual items would be lost in the bound result. - * Columns are coerced to the highest SEXPTYPE when they are different, if possible. - * And incredibly fast ;). - * Documentation updated in much detail. Closes [#333](https://github.com/Rdatatable/data.table/issues/333). - - 8. `bit64::integer64` now works in grouping and joins, [#342](https://github.com/Rdatatable/data.table/issues/342). Thanks to James Sams for highlighting UPCs and Clayton Stanley for [this SO post](http://stackoverflow.com/questions/22273321/large-integers-in-data-table-grouping-results-different-in-1-9-2-compared-to-1). `fread()` has been detecting and reading `integer64` for a while. - - 9. `setNumericRounding()` may be used to reduce to 1 byte or 0 byte rounding when joining to or grouping columns of type 'numeric', [#342](https://github.com/Rdatatable/data.table/issues/342). See example in `?setNumericRounding` and NEWS item below for v1.9.2. `getNumericRounding()` returns the current setting. - - 10. `X[Y]` now names non-join columns from `i` that have the same name as a column in `x`, with an `i.` prefix for consistency with the `i.` prefix that has been available in `j` for some time. This is now documented. - - 11. For a keyed table `X` where the key columns are not at the beginning in order, `X[Y]` now retains the original order of columns in X rather than moving the join columns to the beginning of the result. - - 12. It is no longer an error to assign to row 0 or row NA. - ```R - DT[0, colA := 1L] # now does nothing, silently (was error) - DT[NA, colA := 1L] # now does nothing, silently (was error) - DT[c(1, NA, 0, 2), colA:=1L] # now ignores the NA and 0 silently (was error) - DT[nrow(DT) + 1, colA := 1L] # error (out-of-range) as before - ``` - This is for convenience to avoid the need for a switch in user code that evals various `i` conditions in a loop passing in `i` as an integer vector which may containing `0` or `NA`. - - 13. A new function `setorder` is now implemented which uses data.table's internal fast order to reorder rows *by reference*. It returns the result invisibly (like `setkey`) that allows for compound statements; e.g., `setorder(DT, a, -b)[, cumsum(c), by=list(a,b)]`. Check `?setorder` for more info. - - 14. `DT[order(x, -y)]` is now by default optimised to use data.table's internal fast order as `DT[forder(DT, x, -y)]`. It can be turned off by setting `datatable.optimize` to < 1L or just calling `base:::order` explicitly. It results in 20x speedup on data.table of 10 million rows with 2 integer columns, for example. To order character vectors in descending order it's sufficient to do `DT[order(x, -y)]` as opposed to `DT[order(x, -xtfrm(y))]` in base. This closes [#603](https://github.com/Rdatatable/data.table/issues/603). - - 15. `mult="all"` -vs- `mult="first"|"last"` now return consistent types and columns, [#340](https://github.com/Rdatatable/data.table/issues/340). Thanks to Michele Carriero for highlighting. - - 16. `duplicated.data.table` and `unique.data.table` gains `fromLast = TRUE/FALSE` argument, similar to base. Default value is FALSE. Closes [#347](https://github.com/Rdatatable/data.table/issues/347). - - 17. `anyDuplicated.data.table` is now implemented. Closes [#350](https://github.com/Rdatatable/data.table/issues/350). Thanks to M C (bluemagister) for reporting. - - 18. Complex j-expressions of the form `DT[, c(..., lapply(.SD, fun)), by=grp]`are now optimised as long as `.SD` is of the form `lapply(.SD, fun)` or `.SD`, `.SD[1]` or `.SD[1L]`. This resolves [#370](https://github.com/Rdatatable/data.table/issues/370). Thanks to Sam Steingold for reporting. - This also completes the first two task lists in [#735](https://github.com/Rdatatable/data.table/issues/735). - ```R - ## example: - DT[, c(.I, lapply(.SD, sum), mean(x), lapply(.SD, log)), by=grp] - ## is optimised to - DT[, list(.I, x=sum(x), y=sum(y), ..., mean(x), log(x), log(y), ...), by=grp] - ## and now... these variations are also optimised internally for speed - DT[, c(..., .SD, lapply(.SD, sum), ...), by=grp] - DT[, c(..., .SD[1], lapply(.SD, sum), ...), by=grp] - DT[, .SD, by=grp] - DT[, c(.SD), by=grp] - DT[, .SD[1], by=grp] # Note: but not yet DT[, .SD[1,], by=grp] - DT[, c(.SD[1]), by=grp] - DT[, head(.SD, 1), by=grp] # Note: but not yet DT[, head(.SD, -1), by=grp] - # but not yet optimised - DT[, c(.SD[a], .SD[x>1], lapply(.SD, sum)), by=grp] # where 'a' is, say, a numeric or a data.table, and also for expressions like x>1 - ``` - The underlying message is that `.SD` is being slowly optimised internally wherever possible, for speed, without compromising in the nice readable syntax it provides. - - 19. `setDT` gains `keep.rownames = TRUE/FALSE` argument, which works only on `data.frame`s. TRUE retains the data.frame's row names as a new column named `rn`. - - 20. The output of `tables()` now includes `NCOL`. Thanks to @dnlbrky for the suggestion. - - 21. `DT[, LHS := RHS]` (or its equivalent in `set`) now provides a warning and returns `DT` as it was, instead of an error, when `length(LHS) = 0L`, [#343](https://github.com/Rdatatable/data.table/issues/343). For example: - ```R - DT[, grep("^b", names(DT)) := NULL] # where no columns start with b - # warns now and returns DT instead of error - ``` - - 22. GForce now is also optimised for j-expression with `.N`. Closes [#334](https://github.com/Rdatatable/data.table/issues/334) and part of [#523](https://github.com/Rdatatable/data.table/issues/523). - ```R - DT[, list(.N, mean(y), sum(y)), by=x] # 1.9.2 - doesn't know to use GForce - will be (relatively) slower - DT[, list(.N, mean(y), sum(y)), by=x] # 1.9.3+ - will use GForce. - ``` - - 23. `setDF` is now implemented. It accepts a data.table and converts it to data.frame by reference, [#338](https://github.com/Rdatatable/data.table/issues/338). Thanks to canneff for the discussion [here](http://r.789695.n4.nabble.com/Is-there-any-overhead-to-converting-back-and-forth-from-a-data-table-to-a-data-frame-td4688332.html) on data.table mailing list. - - 24. `.I` gets named as `I` (instead of `.I`) wherever possible, similar to `.N`, [#344](https://github.com/Rdatatable/data.table/issues/344). - - 25. `setkey` on `.SD` is now an error, rather than warnings for each group about rebuilding the key. The new error is similar to when attempting to use `:=` in a `.SD` subquery: `".SD is locked. Using set*() functions on .SD is reserved for possible future use; a tortuously flexible way to modify the original data by group."` Thanks to Ron Hylton for highlighting the issue on datatable-help [here](http://r.789695.n4.nabble.com/data-table-is-asking-for-help-tp4692080.html). - - 26. Looping calls to `unique(DT)` such as in `DT[,unique(.SD),by=group]` is now faster by avoiding internal overhead of calling `[.data.table`. Thanks again to Ron Hylton for highlighting in the [same thread](http://r.789695.n4.nabble.com/data-table-is-asking-for-help-tp4692080.html). His example is reduced from 28 sec to 9 sec, with identical results. - - 27. Following `gsum` and `gmean`, now `gmin` and `gmax` from GForce are also implemented. Closes part of [#523](https://github.com/Rdatatable/data.table/issues/523). Benchmarks are also provided. - ```R - DT[, list(sum(x), min(y), max(z), .N), by=...] # runs by default using GForce - ``` - - 28. `setorder()` and `DT[order(.)]` handles `integer64` type in descending order as well. Closes [#703](https://github.com/Rdatatable/data.table/issues/703). - - 29. `setorder()` and `setorderv()` gain `na.last = TRUE/FALSE`. Closes [#706](https://github.com/Rdatatable/data.table/issues/706). - - 30. `.N` is now available in `i`, [FR#724](https://github.com/Rdatatable/data.table/issues/724). Thanks to newbie indirectly [here](http://stackoverflow.com/a/24649115/403310) and Farrel directly [here](http://stackoverflow.com/questions/24685421/how-do-you-extract-a-few-random-rows-from-a-data-table-on-the-fly). - - 31. `by=.EACHI` is now implemented for *not-joins* as well. Closes [#604](https://github.com/Rdatatable/data.table/issues/604). Thanks to Garrett See for filing the FR. As an example: - ```R - DT = data.table(x=c(1,1,1,1,2,2,3,4,4,4), y=1:10, key="x") - DT[!J(c(1,4)), sum(y), by=.EACHI] # is equivalent to DT[J(c(2,3)), sum(y), by=.EACHI] - ``` - - -#### BUG FIXES - - - 1. When joining to fewer columns than the key has, using one of the later key columns explicitly in j repeated the first value. A problem introduced by v1.9.2 and not caught bythe 1,220 tests, or tests in 37 dependent packages. Test added. Many thanks to Michele Carriero for reporting. - ```R - DT = data.table(a=1:2, b=letters[1:6], key="a,b") # keyed by a and b - DT[.(1), list(b,...)] # correct result again (joining just to a not b but using b) - ``` - - 2. `setkey` works again when a non-key column is type list (e.g. each cell can itself be a vector), [#54](https://github.com/Rdatatable/data.table/issues/54). Test added. Thanks to James Sams, Michael Nelson and Musx [for the reproducible examples](http://stackoverflow.com/questions/22186798/r-data-table-1-9-2-issue-on-setkey). - - 3. The warning "internal TRUE value has been modified" with recently released R 3.1 when grouping a table containing a logical column *and* where all groups are just 1 row is now fixed and tests added. Thanks to James Sams for the reproducible example. The warning is issued by R and we have asked if it can be upgraded to error (UPDATE: change now made for R 3.1.1 thanks to Luke Tierney). - - 4. `data.table(list())`, `data.table(data.table())` and `data.table(data.frame())` now return a null data.table (no columns) rather than one empty column, [#48](https://github.com/Rdatatable/data.table/issues/48). Test added. Thanks to Shubh Bansal for reporting. - - 5. `unique()` now returns a null data.table, [#44](https://github.com/Rdatatable/data.table/issues/44). Thanks to agstudy for reporting. - - 6. `data.table()` converted POSIXlt to POSIXct, consistent with `base:::data.frame()`, but now also provides a helpful warning instead of coercing silently, [#59](https://github.com/Rdatatable/data.table/issues/59). Thanks to Brodie Gaslam, Patrick and Ragy Isaac for reporting [here](http://stackoverflow.com/questions/21487614/error-creating-r-data-table-with-date-time-posixlt) and [here](http://stackoverflow.com/questions/21320215/converting-from-data-frame-to-data-table-i-get-an-error-with-head). - - 7. If another class inherits from data.table; e.g. `class(DT) == c("UserClass","data.table","data.frame")` then `DT[...]` now retains `UserClass` in the result. Thanks to Daniel Krizian for reporting, [#64](https://github.com/Rdatatable/data.table/issues/44). Test added. - - 8. An error `object '' not found` could occur in some circumstances, particularly after a previous error. [Reported on SO](http://stackoverflow.com/questions/22128047/how-to-avoid-weird-umlaute-error-when-using-data-table) with non-ASCII characters in a column name, a red herring we hope since non-ASCII characters are fully supported in data.table including in column names. Fix implemented and tests added. - - 9. Column order was reversed in some cases by `as.data.table.table()`, [#43](https://github.com/Rdatatable/data.table/issues/43). Test added. Thanks to Benjamin Barnes for reporting. - - 10. `DT[, !"missingcol", with=FALSE]` now returns `DT` (rather than a NULL data.table) with warning that "missingcol" is not present. - - 11. `DT[,y := y * eval(parse(text="1*2"))]` resulted in error unless `eval()` was wrapped with paranthesis. That is, `DT[,y := y * (eval(parse(text="1*2")))]`, **#5423**. Thanks to Wet Feet for reporting and to Simon O'Hanlon for identifying the issue [here on SO](http://stackoverflow.com/questions/22375404/unable-to-use-evalparse-in-data-table-function/22375557#22375557). - - 12. Using `by` columns with attributes (ex: factor, Date) in `j` did not retain the attributes, also in case of `:=`. This was partially a regression from an earlier fix ([#155](https://github.com/Rdatatable/data.table/issues/155)) due to recent changes for R3.1.0. Now fixed and clearer tests added. Thanks to Christophe Dervieux for reporting and to Adam B for reporting [here on SO](http://stackoverflow.com/questions/22536586/by-seems-to-not-retain-attribute-of-date-type-columns-in-data-table-possibl). Closes [#36](https://github.com/Rdatatable/data.table/issues/36). - - 13. `.BY` special variable did not retain names of the grouping columns which resulted in not being able to access `.BY$grpcol` in `j`. Ex: `DT[, .BY$x, by=x]`. This is now fixed. Closes **#5415**. Thanks to Stephane Vernede for the bug report. - - 14. Fixed another issue with `eval(parse(...))` in `j` along with assignment by reference `:=`. Closes [#30](https://github.com/Rdatatable/data.table/issues/30). Thanks to Michele Carriero for reporting. - - 15. `get()` in `j` did not see `i`'s columns when `i` is a data.table which lead to errors while doing operations like: `DT1[DT2, list(get('c'))]`. Now, use of `get` makes *all* x's and i's columns visible (fetches all columns). Still, as the verbose message states, using `.SDcols` or `eval(macro)` would be able to select just the columns used, which is better for efficiency. Closes [#34](https://github.com/Rdatatable/data.table/issues/34). Thanks to Eddi for reporting. - - 16. Fixed an edge case with `unique` and `duplicated`, which on empty data.tables returned a 1-row data.table with all NAs. Closes [#28](https://github.com/Rdatatable/data.table/issues/28). Thanks to Shubh Bansal for reporting. - - 17. `dcast.data.table` resuled in error (because function `CJ()` was not visible) in packages that "import" data.table. This did not happen if the package "depends" on data.table. Closes bug [#31](https://github.com/Rdatatable/data.table/issues/31). Thanks to K Davis for the excellent report. - - 18. `merge(x, y, all=TRUE)` error when `x` is empty data.table is now fixed. Closes [#24](https://github.com/Rdatatable/data.table/issues/24). Thanks to Garrett See for filing the report. - - 19. Implementing #5249 closes bug [#26](https://github.com/Rdatatable/data.table/issues/26), a case where rbind gave error when binding with empty data.tables. Thanks to Roger for [reporting on SO](http://stackoverflow.com/q/23216033/559784). - - 20. Fixed a segfault during grouping with assignment by reference, ex: `DT[, LHS := RHS, by=.]`, where length(RHS) > group size (.N). Closes [#25](https://github.com/Rdatatable/data.table/issues/25). Thanks to Zachary Long for reporting on datatable-help mailing list. - - 21. Consistent subset rules on datat.tables with duplicate columns. In short, if indices are directly provided, 'j', or in .SDcols, then just those columns are either returned (or deleted if you provide -.SDcols or !j). If instead, column names are given and there are more than one occurrence of that column, then it's hard to decide which to keep and which to remove on a subset. Therefore, to remove, all occurrences of that column are removed, and to keep, always the first column is returned each time. Also closes [#22](https://github.com/Rdatatable/data.table/issues/22) and [#86](https://github.com/Rdatatable/data.table/issues/86). - - Note that using `by=` to aggregate on duplicate columns may not give intended result still, as it may not operate on the proper column. - - 22. When DT is empty, `DT[, newcol:=max(b), by=a]` now properly adds the column, [#49](https://github.com/Rdatatable/data.table/issues/49). Thanks to Shubh bansal for filing the report. - - 23. When `j` evaluates to `integer(0)/character(0)`, `DT[, j, with=FALSE]` resulted in error, [#21](https://github.com/Rdatatable/data.table/issues/21). Thanks indirectly to Malcolm Cook for [#52](https://github.com/Rdatatable/data.table/issues/52), through which this (recent) regression (from 1.9.3) was found. - - 24. `print(DT)` now respects `digits` argument on list type columns, [#37](https://github.com/Rdatatable/data.table/issues/37). Thanks to Frank for the discussion on the mailing list and to Matthew Beckers for filing the bug report. - - 25. FR # 2551 implemented leniance in warning messages when columns are coerced with `DT[, LHS := RHS]`, when `length(RHS)==1`. But this was very lenient; e.g., `DT[, a := "bla"]`, where `a` is a logical column should get a warning. This is now fixed such that only very obvious cases coerces silently; e.g., `DT[, a := 1]` where `a` is `integer`. Closes [#35](https://github.com/Rdatatable/data.table/issues/35). Thanks to Michele Carriero and John Laing for reporting. - - 26. `dcast.data.table` provides better error message when `fun.aggregate` is specified but it returns length != 1. Closes [#693](https://github.com/Rdatatable/data.table/issues/693). Thanks to Trevor Alexander for reporting [here on SO](http://stackoverflow.com/questions/24152733/undocumented-error-in-dcast-data-table). - - 27. `dcast.data.table` tries to preserve attributes wherever possible, except when `value.var` is a `factor` (or ordered factor). For `factor` types, the casted columns will be coerced to type `character` thereby losing the `levels` attribute. Closes [#688](https://github.com/Rdatatable/data.table/issues/688). Thanks to juancentro for reporting. - - 28. `melt` now returns friendly error when `meaure.vars` are not in data instead of segfault. Closes [#699](https://github.com/Rdatatable/data.table/issues/688). Thanks to vsalmendra for [this post on SO](http://stackoverflow.com/q/24326797/559784) and the subsequent bug report. - - 29. `DT[, list(m1 = eval(expr1), m2=eval(expr2)), by=val]` where `expr1` and `expr2` are constructed using `parse(text=.)` now works instead of resulting in error. Closes [#472](https://github.com/Rdatatable/data.table/issues/472). Thanks to Benjamin Barnes for reporting with a nice reproducible example. - - 30. A join of the form `X[Y, roll=TRUE, nomatch=0L]` where some of Y's key columns occur more than once (duplicated keys) might at times return incorrect join. This was introduced only in 1.9.2 and is fixed now. Closes [#700](https://github.com/Rdatatable/data.table/issues/472). Thanks to Michael Smith for the very nice reproducible example and nice spotting of such a tricky case. - - 31. Fixed an edge case in `DT[order(.)]` internal optimisation to be consistent with base. Closes [#696](https://github.com/Rdatatable/data.table/issues/696). Thanks to Michael Smith and Garrett See for reporting. - - 32. `DT[, list(list(.)), by=.]` and `DT[, col := list(list(.)), by=.]` now return correct results in R >= 3.1.0. The bug was due to a welcome change in R 3.1.0 where `list(.)` no longer copies. Closes [#481](https://github.com/Rdatatable/data.table/issues/481). Also thanks to KrishnaPG for filing [#728](https://github.com/Rdatatable/data.table/issues/728). - - 33. `dcast.data.table` handles `fun.aggregate` argument properly when called from within a function that accepts `fun.aggregate` argument and passes to `dcast.data.table()`. Closes [#713](https://github.com/Rdatatable/data.table/issues/713). Thanks to mathematicalcoffee for reporting [here](http://stackoverflow.com/q/24542976/559784) on SO. - - 34. `dcast.data.table` now returns a friendly error when fun.aggregate value for missing combinations is 0-length, and 'fill' argument is not provided. Closes [#715](https://github.com/Rdatatable/data.table/issues/715) - - 35. `rbind/rbindlist` binds in the same order of occurrence also when binding tables with duplicate names along with 'fill=TRUE' (previously, it grouped all duplicate columns together). This was the underlying reason for [#725](https://github.com/Rdatatable/data.table/issues/715). Thanks to Stefan Fritsch for the report with a nice reproducible example and discussion. - - 36. `setDT` now provides a friendly error when attempted to change a variable to data.table by reference whose binding is locked (usually when the variable is within a package, ex: CO2). Closes [#475](https://github.com/Rdatatable/data.table/issues/475). Thanks to David Arenburg for filing the report [here](http://stackoverflow.com/questions/23361080/error-in-setdt-from-data-table-package) on SO. - - 37. `X[!Y]` where `X` and `Y` are both data.tables ignores 'allow.cartesian' argument, and rightly so because a not-join (or anti-join) cannot exceed nrow(x). Thanks to @fedyakov for spotting this. Closes [#698](https://github.com/Rdatatable/data.table/issues/698). - - 38. `as.data.table.matrix` does not convert strings to factors by default. `data.table` likes and prefers using character vectors to factors. Closes [#745](https://github.com/Rdatatable/data.table/issues/698). Thanks to @fpinter for reporting the issue on the github issue tracker and to vijay for reporting [here](http://stackoverflow.com/questions/17691050/data-table-still-converts-strings-to-factors) on SO. - - 39. Joins of the form `x[y[z]]` resulted in duplicate names when all `x`, `y` and `z` had the same column names as non-key columns. This is now fixed. Closes [#471](https://github.com/Rdatatable/data.table/issues/471). Thanks to Christian Sigg for the nice reproducible example. - - 40. `DT[where, someCol:=NULL]` is now an error that `i` is provided since it makes no sense to delete a column for only a subset of rows. Closes [#506](https://github.com/Rdatatable/data.table/issues/506). - - 41. `forder` did not identify `-0` as `0` for numeric types. This is fixed now. Thanks to @arcosdium for nice minimal example. Closes [#743](https://github.com/Rdatatable/data.table/issues/743). - - 42. Segfault on joins of the form `X[Y, c(..), by=.EACHI]` is now fixed. Closes [#744](https://github.com/Rdatatable/data.table/issues/744). Thanks to @nigmastar (Michele Carriero) for the excellent minimal example. - - 43. Subset on data.table using `lapply` of the form `lapply(L, "[", Time == 3L)` works now without error due to `[.data.frame` redirection. Closes [#500](https://github.com/Rdatatable/data.table/issues/500). Thanks to Garrett See for reporting. - - 44. `id.vars` and `measure.vars` default value of `NULL` was removed to be consistent in behaviour with `reshape2:::melt.data.frame`. Closes [#780](https://github.com/Rdatatable/data.table/issues/780). Thanks to @dardesta for reporting. - - 45. Grouping using external variables on keyed data.tables did not return correct results at times. Thanks to @colinfang for reporting. Closes [#762](https://github.com/Rdatatable/data.table/issues/762). - -#### NOTES - - 1. Reminder: using `rolltolast` still works but since v1.9.2 now issues the following warning: - > 'rolltolast' has been marked 'deprecated' in ?data.table since v1.8.8 on CRAN 3 Mar 2013, see NEWS. Please change to the more flexible 'rollends' instead. 'rolltolast' will be removed in the next version." - - 2. Using `with=FALSE` with `:=` is now deprecated in all cases, given that wrapping the LHS of `:=` with parentheses has been preferred for some time. - ```R - colVar = "col1" - DT[, colVar:=1, with=FALSE] # deprecated, still works silently as before - DT[, (colVar):=1] # please change to this - DT[, c("col1","col2"):=1] # no change - DT[, 2:4 := 1] # no change - DT[, c("col1","col2"):=list(sum(a),mean(b)] # no change - DT[, `:=`(...), by=...] # no change - ``` - The next release will issue a warning when `with=FALSE` is used with `:=`. - - 3. `?duplicated.data.table` explained that `by=NULL` or `by=FALSE` would use all columns, however `by=FALSE` resulted in error. `by=FALSE` is removed from help and `duplicated` returns an error when `by=TRUE/FALSE` now. Closes [#38](https://github.com/Rdatatable/data.table/issues/38). - - 4. More info about distinguishing small numbers from 0.0 in v1.9.2+ is [here](http://stackoverflow.com/questions/22290544/grouping-very-small-numbers-e-g-1e-28-and-0-0-in-data-table-v1-8-10-vs-v1-9-2). - - 5. `?dcast.data.table` now explains how the names are generated for the columns that are being casted. Closes **#5676**. - - 6. `dcast.data.table(dt, a ~ ... + b)` now generates the column names with values from `b` coming last. Closes **#5675**. - - 7. Added `x[order(.)]` internal optimisation, and how to go back to `base:::order(.)` if one wants to sort by session locale to - `?setorder` (with alias `?order` and `?forder`). Closes [#478](https://github.com/Rdatatable/data.table/issues/478) and - also [#704](https://github.com/Rdatatable/data.table/issues/704). Thanks to Christian Wolf for the report. - - 8. Added tests (1351.1 and 1351.2) to catch any future regressions on particular case of binary search based subset reported [here](http://stackoverflow.com/q/24729001/559784) on SO. Thanks to Scott for the post. The regression was contained to v1.9.2 AFAICT. Closes [#734](https://github.com/Rdatatable/data.table/issues/704). - - 9. Added an `.onUnload` method to unload `data.table`'s shared object properly. Since the name of the shared object is 'datatable.so' and not 'data.table.so', 'detach' fails to unload correctly. This was the reason for the issue reported [here](http://stackoverflow.com/questions/23498804/load-detach-re-load-anomaly) on SO. Closes [#474](https://github.com/Rdatatable/data.table/issues/474). Thanks to Matthew Plourde for reporting. - - 10. Updated `BugReports` link in DESCRIPTION. Thanks to @chrsigg for reporting. Closes [#754](https://github.com/Rdatatable/data.table/issues/754). - - 11. Added `shiny`, `rmarkdown` and `knitr` to the data.table whitelist. Packages which take user code as input and run it in their own environment (so do not `Depend` or `Import` `data.table` themselves) either need to be added here, or they can define a variable `.datatable.aware <- TRUE` in their namepace, so that data.table can work correctly in those packages. Users can also add to `data.table`'s whitelist themselves using `assignInNamespace()` but these additions upstream remove the need to do that for these packages. - - 12. Clarified `with=FALSE` as suggested in [#513](https://github.com/Rdatatable/data.table/issues/513). - - 13. Clarified `.I` in `?data.table`. Closes [#510](https://github.com/Rdatatable/data.table/issues/510). Thanks to Gabor for reporting. - - 14. Moved `?copy` to its own help page, and documented that `dt_names <- copy(names(DT))` is necessary for `dt_names` to be not modified by reference as a result of updating `DT` by reference (e.g. adding a new column by reference). Closes [#512](https://github.com/Rdatatable/data.table/issues/512). Thanks to Zach for [this SO question](http://stackoverflow.com/q/15913417/559784) and user1971988 for [this SO question](http://stackoverflow.com/q/18662715/559784). - - 15. `address(x)` doesn't increment `NAM()` value when `x` is a vector. Using the object as argument to a non-primitive function is sufficient to increment its reference. Closes #824. Thanks to @tarakc02 for the [question on twitter](https://twitter.com/tarakc02/status/513796515026837504) and hint from Hadley. - ---- - -### Changes in v1.9.2 (on CRAN 27 Feb 2014) - -#### NEW FEATURES - - 1. Fast methods of `reshape2`'s `melt` and `dcast` have been implemented for `data.table`, **FR #2627**. Most settings are identical to `reshape2`, see `?melt.data.table.` - > `melt`: 10 million rows and 5 columns, 61.3 seconds reduced to 1.2 seconds. - > `dcast`: 1 million rows and 4 columns, 192 seconds reduced to 3.6 seconds. - - * `melt.data.table` is also capable of melting on columns of type `list`. - * `melt.data.table` gains `variable.factor` and `value.factor` which by default are TRUE and FALSE respectively for compatibility with `reshape2`. This allows for directly controlling the output type of "variable" and "value" columns (as factors or not). - * `melt.data.table`'s `na.rm = TRUE` parameter is optimised to remove NAs directly during melt and therefore avoids the overhead of subsetting using `!is.na` afterwards on the molten data. - * except for `margins` argument from `reshape2:::dcast`, all features of dcast are intact. `dcast.data.table` can also accept `value.var` columns of type list. - - > Reminder of Cologne (Dec 2013) presentation **slide 32** : ["Why not submit a dcast pull request to reshape2?"](https://github.com/Rdatatable/data.table/wiki/talks/CologneR_2013.pdf). - - 2. Joins scale better as the number of rows increases. The binary merge used to start on row 1 of i; it now starts on the middle row of i. Many thanks to Mike Crowe for the suggestion. This has been done within column so scales much better as the number of join columns increase, too. - - > Reminder: bmerge allows the rolling join feature: forwards, backwards, limited and nearest. - - 3. Sorting (`setkey` and ad-hoc `by=`) is faster and scales better on randomly ordered data and now also adapts to almost sorted data. The remaining comparison sorts have been removed. We use a combination of counting sort and forwards radix (MSD) for all types including double, character and integers with range>100,000; forwards not backwards through columns. This was inspired by [Terdiman](http://codercorner.com/RadixSortRevisited.htm) and [Herf's](http://stereopsis.com/radix.html) (LSD) radix approach for floating point : - - 4. `unique` and `duplicated` methods for `data.table` are significantly faster especially for type numeric (i.e. double), and type integer where range > 100,000 or contains negatives. - - 5. `NA`, `NaN`, `+Inf` and `-Inf` are now considered distinct values, may be in keys, can be joined to and can be grouped. `data.table` defines: `NA` < `NaN` < `-Inf`. Thanks to Martin Liberts for the suggestions, #4684, #4815 and #4883. - - 6. Numeric data is still joined and grouped within tolerance as before but instead of tolerance being `sqrt(.Machine$double.eps) == 1.490116e-08` (the same as `base::all.equal`'s default) the significand is now rounded to the last 2 bytes, apx 11 s.f. This is more appropriate for large (1.23e20) and small (1.23e-20) numerics and is faster via a simple bit twiddle. A few functions provided a 'tolerance' argument but this wasn't being passed through so has been removed. We aim to add a global option (e.g. 2, 1 or 0 byte rounding) in a future release. - - 7. New optimization: **GForce**. Rather than grouping the data, the group locations are passed into grouped versions of sum and mean (`gsum` and `gmean`) which then compute the result for all groups in a single sequential pass through the column for cache efficiency. Further, since the g* function is called just once, we don't need to find ways to speed up calling sum or mean repetitively for each group. Plan is to add `gmin`, `gmax`, `gsd`, `gprod`, `gwhich.min` and `gwhich.max`. Examples where GForce applies now: - ```R - DT[,sum(x,na.rm=),by=...] # yes - DT[,list(sum(x,na.rm=),mean(y,na.rm=)),by=...] # yes - DT[,lapply(.SD,sum,na.rm=),by=...] # yes - DT[,list(sum(x),min(y)),by=...] # no. gmin not yet available, only sum and mean so far. - ``` - GForce is a level 2 optimization. To turn it off: `options(datatable.optimize=1)`. Reminder: to see the optimizations and other info, set `verbose=TRUE` - - 8. fread's `integer64` argument implemented. Allows reading of `integer64` data as 'double' or 'character' instead of `bit64::integer64` (which remains the default as before). Thanks to Chris Neff for the suggestion. The default can be changed globally; e.g, `options(datatable.integer64="character")` - - 9. fread's `drop`, `select` and `NULL` in `colClasses` are implemented. To drop or select columns by name or by number. See examples in `?fread`. - - 10. fread now detects `T`, `F`, `True`, `False`, `TRUE` and `FALSE` as type logical, consistent with `read.csv`, #4766. Thanks to Adam November for highlighting. - - 11. fread now accepts quotes (both `'` and `"`) in the middle of fields, whether the field starts with `"` or not, rather than the 'unbalanced quotes' error, #2694. Thanks to baidao for reporting. It was known and documented at the top of `?fread` (now removed). If a field starts with `"` it must end with `"` (necessary to include the field separator itself in the field contents). Embedded quotes can be in column names, too. Newlines (`\n`) still can't be in quoted fields or quoted column names, yet. - - 12. fread gains `showProgress`, default TRUE. The global option is `datatable.showProgress`. - - 13. `fread("1.46761e-313\n")` detected the **ERANGE** error, so read as `character`. It now reads as numeric but with a detailed warning. Thanks to Heather Turner for the detailed report, #4879. - - 14. fread now understand system commands; e.g., `fread("grep blah file.txt")`. - - 15. `as.data.table` method for `table()` implemented, #4848. Thanks to Frank Pinter for suggesting [here on SO](http://stackoverflow.com/questions/18390947/data-table-of-table-is-very-different-from-data-frame-of-table). - - 16. `as.data.table` methods added for integer, numeric, character, logical, factor, ordered and Date. - - 17. `DT[i,:=,]` now accepts negative indices in `i`. Thanks to Eduard Antonyan. See also bug fix #2697. - - 18. `set()` is now able to add new columns by reference, #2077. - ```R - DT[3:5, newCol := 5L] - set(DT, i=3:5, j="newCol", 5L) # same - ``` - - 19. eval will now be evaluated anywhere in a `j`-expression as long as it has just one argument, #4677. Will still need to use `.SD` as environment in complex cases. Also fixes bug [here on SO](http://stackoverflow.com/a/19054962/817778). - - 20. `!` at the head of the expression will no longer trigger a not-join if the expression is logical, #4650. Thanks to Arunkumar Srinivasan for reporting. - - 21. `rbindlist` now chooses the highest type per column, not the first, #2456. Up-conversion follows R defaults, with the addition of factors being the highest type. Also fixes #4981 for the specific case of `NA`'s. - - 22. `cbind(x,y,z,...)` now creates a data.table if `x` isn't a `data.table` but `y` or `z` is, unless `x` is a `data.frame` in which case a `data.frame` is returned (use `data.table(DF,DT)` instead for that). - - 23. `cbind(x,y,z,...)` and `data.table(x,y,z,...)` now retain keys of any `data.table` inputs directly (no sort needed, for speed). The result's key is `c(key(x), key(y), key(z), ...)`, provided, that the data.table inputs that have keys are not recycled and there are no ambiguities (i.e. duplicates) in column names. - - 24. `rbind/rbindlist` will preserve ordered factors if it's possible to do so; i.e., if a compatible global order exists, #4856 & #5019. Otherwise the result will be a `factor` and a *warning*. - - 25. `rbind` now has a `fill` argument, #4790. When `fill=TRUE` it will behave in a manner similar to plyr's `rbind.fill`. This option is incompatible with `use.names=FALSE`. Thanks to Arunkumar Srinivasan for the base code. - - 26. `rbind` now relies exclusively on `rbindlist` to bind `data.tables` together. This makes rbind'ing factors faster, #2115. - - 27. `DT[, as.factor('x'), with=FALSE]` where `x` is a column in `DT` is now equivalent to `DT[, "x", with=FALSE]` instead of ending up with an error, #4867. Thanks to tresbot for reporting [here on SO](http://stackoverflow.com/questions/18525976/converting-multiple-data-table-columns-to-factors-in-r). - - 28. `format.data.table` now understands 'formula' and displays embedded formulas as expected, FR #2591. - - 29. `{}` around `:=` in `j` now obtain desired result, but with a warning #2496. Now, - ```R - DT[, { `:=`(...)}] # now works - DT[, {`:=`(...)}, by=(...)] # now works - ``` - Thanks to Alex for reporting [here on SO](http://stackoverflow.com/questions/14541959/expression-syntax-for-data-table-in-r). - - 30. `x[J(2), a]`, where `a` is the key column sees `a` in `j`, #2693 and FAQ 2.8. Also, `x[J(2)]` automatically names the columns from `i` using the key columns of `x`. In cases where the key columns of `x` and `i` are identical, i's columns can be referred to by using `i.name`; e.g., `x[J(2), i.a]`. Thanks to mnel and Gabor for the discussion [here](http://r.789695.n4.nabble.com/Problem-with-FAQ-2-8-tt4668878.html). - - 31. `print.data.table` gains `row.names`, default=TRUE. When FALSE, the row names (along with the :) are not printed, #5020. Thanks to Frank Erickson. - - 32. `.SDcols` now is also able to de-select columns. This works both with column names and column numbers. - ```R - DT[, lapply(.SD,...), by=..., .SDcols=-c(1,3)] # .SD all but columns 1 and 3 - DT[, lapply(.SD,...), by=..., .SDcols=-c("x", "z")] # .SD all but columns 'x' and 'z' - DT[..., .SDcols=c(1, -3)] # can't mix signs, error - DT[, .SD, .SDcols=c("x", -"z")] # can't mix signs, error - ``` - Thanks to Tonny Peterson for filing FR #4979. - - 33. `as.data.table.list` now issues a warning for those items/columns that result in a remainder due to recycling, #4813. `data.table()` also now issues a warning (instead of an error previously) when recycling leaves a remainder; e.g., `data.table(x=1:2, y=1:3)`. - - 34. `:=` now coerces without warning when precision is not lost and `length(RHS) == 1`, #2551. - ```R - DT = data.table(x=1:2, y=c(TRUE, FALSE)) - DT[1, x:=1] # ok, now silent - DT[1, y:=0] # ok, now silent - DT[1, y:=0L] # ok, now silent - ``` - - 35. `as.data.table.*(x, keep.rownames=TRUE)`, where `x` is a named vector now adds names of `x` into a new column with default name `rn`. Thanks to Garrett See for FR #2356. - - 36. `X[Y, col:=value]` when no match exists in the join is now caught early and X is simply returned. Also a message when `datatable.verbose` is TRUE is provided. In addition, if `col` is an existing column, since no update actually takes place, the key is now retained. Thanks to Frank Erickson for suggesting, #4996. - - 37. New function `setDT()` takes a `list` (named and/or unnamed) or `data.frame` and changes its type by reference to `data.table`, *without any copy*. It also has a logical argument `giveNames` which is used for a list inputs. See `?setDT` examples for more. Based on [this FR on SO](http://stackoverflow.com/questions/20345022/convert-a-data-frame-to-a-data-table-without-copy/20346697#20346697). - - 38. `setnames(DT,"oldname","newname")` no longer complains about any duplicated column names in `DT` so long as oldname is unique and unambiguous. Thanks to Wet Feet for highlighting [here on SO](http://stackoverflow.com/questions/20942905/ignore-safety-check-when-using-setnames). - - 39. `last(x)` where `length(x)=0` now returns 'x' instead of an error, #5152. Thanks to Garrett See for reporting. - - 40. `as.ITime.character` no longer complains when given vector input, and will accept mixed format time entries; e.g., c("12:00", "13:12:25") - - 41. Key is now retained in `NA` subsets; e.g., - ```R - DT = data.table(a=1:3,b=4:6,key="a") - DT[NA] # 1-row of NA now keyed by 'a' - DT[5] # 1-row of NA now keyed by 'a' - DT[2:4] # not keyed as before because NA (last row of result) sorts first in keyed data.table - ``` - - 42. Each column in the result for each group has always been recycled (if necessary) to match the longest column in that group's result. If it doesn't recycle exactly, though, it was caught gracefully as an error. Now, it is recycled, with remainder with warning. - ```R - DT = data.table(a=1:2,b=1:6) - DT[, list(b,1:2), by=a] # now recycles the 1:2 with warning to length 3 - ``` - -#### BUG FIXES - - 1. Long outstanding (usually small) memory leak in grouping fixed, #2648. When the last group is smaller than the largest group, the difference in those sizes was not being released. Also evident in non-trivial aggregations where each group returns a different number of rows. Most users run a grouping - query once and will never have noticed these, but anyone looping calls to grouping (such as when running in parallel, or benchmarking) may have suffered. Tests added. Thanks to many including vc273 and Y T for reporting [here](http://stackoverflow.com/questions/20349159/memory-leak-in-data-table-grouped-assignment-by-reference) and [here](http://stackoverflow.com/questions/15651515/slow-memory-leak-in-data-table-when-returning-named-lists-in-j-trying-to-reshap) on SO. - - 2. In long running computations where data.table is called many times repetitively the following error could sometimes occur, #2647: *"Internal error: .internal.selfref prot is not itself an extptr"*. Now fixed. Thanks to theEricStone, StevieP and JasonB for (difficult) reproducible examples [here](http://stackoverflow.com/questions/15342227/getting-a-random-internal-selfref-error-in-data-table-for-r). - - 3. If `fread` returns a data error (such as no closing quote on a quoted field) it now closes the file first rather than holding a lock open, a Windows only problem. - Thanks to nigmastar for reporting [here](http://stackoverflow.com/questions/18597123/fread-data-table-locks-files) and Carl Witthoft for the hint. Tests added. - - 4. `DT[0,col:=value]` is now a helpful error rather than crash, #2754. Thanks to Ricardo Saporta for reporting. `DT[NA,col:=value]`'s error message has also been improved. Tests added. - - 5. Assigning to the same column twice in the same query is now an error rather than a crash in some circumstances; e.g., `DT[,c("B","B"):=NULL]` (delete by reference the same column twice). Thanks to Ricardo (#2751) and matt_k (#2791) for reporting [here](http://stackoverflow.com/questions/16638484/remove-multiple-columns-from-data-table). Tests added. - - 6. Crash and/or incorrect aggregate results with negative indexing in `i` is fixed, with a warning when the `abs(negative index) > nrow(DT)`, #2697. Thanks to Eduard Antonyan (eddi) for reporting [here](http://stackoverflow.com/questions/16046696/data-table-bug-causing-a-segfault-in-r). Tests added. - - 7. `head()` and `tail()` handle negative `n` values correctly now, #2375. Thanks to Garrett See for reporting. Also it results in an error when `length(n) != 1`. Tests added. - - 8. Crash when assigning empty data.table to multiple columns is fixed, #4731. Thanks to Andrew Tinka for reporting. Tests added. - - 9. `print(DT, digits=2)` now heeds digits and other parameters, #2535. Thanks to Heather Turner for reporting. Tests added. - - 10. `print(data.table(table(1:101)))` is now an 'invalid column' error and suggests `print(as.data.table(table(1:101)))` instead, #4847. Thanks to Frank Pinter for reporting. Test added. - - 11. Crash when grouping by character column where `i` is `integer(0)` is now fixed. It now returns an appropriate empty data.table. This fixes bug #2440. Thanks to Malcolm Cook for reporting. Tests added. - - 12. Grouping when i has value '0' and `length(i) > 1` resulted in crash; it is now fixed. It returns a friendly error instead. This fixes bug #2758. Thanks to Garrett See for reporting. Tests added. - - 13. `:=` failed while subsetting yielded NA and `with=FALSE`, #2445. Thanks to Damian Betebenner for reporting. - - 14. `by=month(date)` gave incorrect results if `key(DT)=="date"`, #2670. Tests added. - ```R - DT[,,by=month(date)] # now ok if key(DT)=="date" - DT[,,by=list(month(date))] # ok before whether or not key(DT)=="date" - ``` - - 15. `rbind` and `rbindlist` could crash if input columns themselves had hidden names, #4890 & #4912. Thanks to Chris Neff and Stefan Fritsch for reporting. Tests added. - - 16. `data.table()`, `as.data.table()` and other paths to create a data.table now detect and drop hidden names, the root cause of #4890. It was never intended that columns could have hidden names attached. - - 17. Cartesian Join (`allow.cartesian = TRUE`) when both `x` and `i` are keyed and `length(key(x)) > length(key(i))` set resulting key incorrectly. This is now fixed, #2677. Tests added. Thanks to Shir Levkowitz for reporting. - - 18. `:=` (assignment by reference) loses POSIXct or ITime attribute *while grouping* is now fixed, #2531. Tests added. Thanks to stat quant for reporting [here](http://stackoverflow.com/questions/14604820/why-does-this-posixct-or-itime-loses-its-format-attribute) and to Paul Murray for reporting [here](http://stackoverflow.com/questions/15996692/cannot-assign-columns-as-date-by-reference-in-data-table) on SO. - - 19. `chmatch()` didn't always match non-ascii characters, #2538 and #4818. chmatch is used internally so `DT[is.na(päs), päs := 99L]` now works. Thanks to Benjamin Barnes and Stefan Fritsch for reporting. Tests added. - - 20. `unname(DT)` threw an error when `20 < nrow(DT) <= 100`, bug #4934. This is now fixed. Tests added. Thanks to Ricardo Saporta. - - 21. A special case of not-join and logical TRUE, `DT[!TRUE]`, gave an error whereas it should be identical to `DT[FALSE]`. Now fixed and tests added. Thanks once again to Ricardo Saporta for filing #4930. - - 22. `X[Y,roll=-Inf,rollends=FALSE]` didn't roll the middle correctly if `Y` was keyed. It was ok if `Y` was unkeyed or rollends left as the default [c(TRUE,FALSE) when roll < 0]. Thanks to user338714 for reporting [here](http://stackoverflow.com/questions/18984179/roll-data-table-with-rollends). Tests added. - - 23. Key is now retained after an order-preserving subset, #295. - - 24. Fixed bug #2584. Now columns that had function names, in particular "list" do not pose problems in `.SD`. Thanks to Zachary Mayer for reporting. - - 25. Fixed bug #4927. Unusual column names in normal quotes, ex: `by=".Col"`, now works as expected in `by`. Thanks to Ricardo Saporta for reporting. - - 26. `setkey` resulted in error when column names contained ",". This is now fixed. Thanks to Corone for reporting [here](http://stackoverflow.com/a/19166273/817778) on SO. - - 27. `rbind` when at least one argument was a data.table, but not the first, returned the rbind'd data.table with key. This is now fixed, #4995. Thanks to Frank Erickson for reporting. - - 28. That `.SD` doesn't retain column's class is now fixed (#2530). Thanks to Corone for reporting [here](http://stackoverflow.com/questions/14753411/why-does-data-table-lose-class-definition-in-sd-after-group-by). - - 29. `eval(quote())` returned error when the quoted expression is a not-join, #4994. This is now fixed. Tests added. - - 30. `DT[, lapply(.SD, function(), by=]` did not see columns of DT when optimisation is "on". This is now fixed, #2381. Tests added. Thanks to David F for reporting [here](http://stackoverflow.com/questions/13441868/data-table-and-stratified-means) on SO. - - 31. #4959 - rbind'ing empty data.tables now works - - 32. #5005 - some function expressions were not being correctly evaluated in j-expression. Thanks to Tonny Petersen for reporting. - - 33. Fixed bug #5007, `j` did not see variables declared within a local (function) environment properly. Now, `DT[, lapply(.SD, function(x) fun_const), by=x]` where "fun_const" is a local variable within a function works as expected. Thanks to Ricardo Saporta for catching this and providing a very nice reproducible example. - - 34. Fixing #5007 also fixes #4957, where `.N` was not visible during `lapply(.SD, function(x) ...)` in `j`. Thanks to juba for noticing it [here](http://stackoverflow.com/questions/19094771/replace-values-in-each-column-based-on-conditions-according-to-groups-by-rows) on SO. - - 35. Fixed another case where function expressions were not constructed properly in `j`, while fixing #5007. `DT[, lapply(.SD, function(x) my_const), by=x]` now works as expected instead of ending up in an error. - - 36. Fixed #4990, where `:=` did not generate a recycling warning during `by`, when `length(RHS) < group` size but not an integer multiple of group size. Now, - ```R - DT <- data.table(a=rep(1:2, c(5,2))) - DT[, b := c(1:2), by=a] - ``` - will generate a warning (here for first group as RHS length (2) is not an integer multiple of group size (=5)). - - 37. Fixed #5069 where `gdata:::write.fwf` returned an error with data.table. - - 38. Fixed #5098 where construction of `j`-expression with a function with no-argument returned the function definition instead of returning the result from executing the function. - - 39. Fixed #5106 where `DT[, .N, by=y]` where `y` is a vector with `length(y) = nrow(DT)`, but `y` is not a column in `DT`. Thanks to colinfang for reporting. - - 40. Fixed #5104 which popped out as a side-effect of fixing #2531. `:=` while grouping and assigning columns that are factors resulted in wrong results (and the column not being added). This is now fixed. Thanks to Jonathen Owen for reporting. - - 41. Fixed bug #5114 where modifying columns in particular cases resulted in ".SD is locked" error. Thanks to GSee for the bug report. - - 42. Implementing FR #4979 lead to a bug when grouping with .SDcols, where .SDcols argument was variable name. This bug #5190 is now fixed. - - 43. Fixed #5171 - where setting the attribute name to a non-character type resulted in a segfault. Ex: `setattr(x, FALSE, FALSE); x`. Now ends up with a friendly error. - - 44. Dependent packages using `cbind` may now *Import* data.table as intended rather than needing to *Depend*. There was a missing `data.table::` prefix on a call to `key()`. Thanks to Maarten-Jan Kallen for reporting. - - 45. 'chmatch' didn't handle character encodings properly when the string was identical but the encoding were different. For ex: `UTF8` and `Latin1`. This is now fixed (a part of bug #5159). Thanks to Stefan Fritsch for reporting. - - 46. Joins (`X[Y]`) on character columns with different encodings now issue a warning that join may result in unexpected results for those indices with different encodings. That is, when "ä" in X's key column and "ä" in Y's key column are of different encodings, a warning is issued. This takes care of bugs #5266 and other part of #5159 for the moment. Thanks to Stefan Fritsch once again for reporting. - - 47. Fixed #5117 - segfault when `rbindlist` on empty data.tables. Thanks to Garrett See for reporting. - - 48. Fixed a rare segfault that occurred on >250m rows (integer overflow during memory allocation); closes #5305. Thanks to Guenter J. Hitsch for reporting. - - 49. `rbindlist` with at least one factor column along with the presence of at least one empty data.table resulted in segfault (or in linux/mac reported an error related to hash tables). This is now fixed, #5355. Thanks to Trevor Alexander for [reporting on SO](http://stackoverflow.com/questions/21591433/merging-really-not-that-large-data-tables-immediately-results-in-r-being-killed) (and mnel for filing the bug report): - - 50. `CJ()` now orders character vectors in a locale consistent with `setkey`, #5375. Typically this affected whether upper case letters were ordered before lower case letters; they were by `setkey()` but not by `CJ()`. This difference started in v1.8.10 with the change "CJ() is 90% faster...", see NEWS below. Test added and avenues for differences closed off and nailed down, with no loss in performance. Many thanks to Malcolm Hawkes for reporting. - -#### THANKS FOR BETA TESTING TO : - - 1. Zach Mayer for a reproducible segfault related to radix sorting character strings longer than 20. Test added. - - 2. Simon Biggs for reporting a bug in fread'ing logicals. Test added. - - 3. Jakub Szewczyk for reporting that where "." is used in formula interface of `dcast.data.table` along with an aggregate function, it did not result in aggregated result, #5149. Test added. - ```R - dcast.data.table(x, a ~ ., mean, value.var="b") - ``` - - 4. Jonathan Owen for reporting that `DT[,sum(.SD),by=]` failed with GForce optimization, #5380. Added test and error message redirecting to use `DT[,lapply(.SD,sum),by=]` or `base::sum` and how to turn off GForce. - - 5. Luke Tierney for guidance in finding a corruption of `R_TrueValue` which needed `--enable-strict-barier`, `gctorture2` and a hardware watchpoint to ferret out. Started after a change in Rdevel on 11 Feb 2014, r64973. - - 6. Minkoo Seo for a new test on rbindlist, #4648. - - 7. Gsee for reporting that `set()` and `:=` could no longer add columns by reference to an object that inherits from data.table; e.g., `class = c("myclass", data.table", "data.frame"))`, #5115. - - 8. Clayton Stanley for reporting #5307 [here on SO](http://stackoverflow.com/questions/21437546/data-table-1-8-11-and-aggregation-issues). Aggregating logical types could give wrong results. - - 9. New and very welcome ASAN and UBSAN checks on CRAN detected : - * integer64 overflow in test 899 reading integers longer than apx 18 digits - ```R - fread("Col1\n12345678901234567890")` # works as before, bumped to character - ``` - * a memory fault in rbindlist when binding ordered factors, and, some items in the list of data.table/list are empty or NULL. In both cases we had anticipated and added tests for these cases, which is why ASAN and UBSAN were able to detect a problem for us. - - 10. Karl Millar for reporting a similar fault that ASAN detected, #5042. Also fixed. - - 11. Ricardo Saporta for finding a crash when i is empty and a join column is character, #5387. Test added. - -#### NOTES - - 1. If `fread` detects data which would be lost if the column was read according to type supplied in `colClasses`, e.g. a numeric column specified as integer in `colClasses`, the message that it has ignored colClasses is upgraded to warning instead of just a line in `verbose=TRUE` mode. - - 2. `?last` has been improved and if `xts` is needed but not installed the error message is more helpful, #2728. Thanks to Sam Steingold for reporting. - - 3. `?between corrected`. It returns a logical not integer vector, #2671. Thanks to Michael Nelson for reporting. - - 4. `.SD`, `.N`, `.I`, `.GRP` and `.BY` are now exported (as NULL). So that NOTEs aren't produced for them by `R CMD check` or `codetools::checkUsage` via compiler. `utils::globalVariables()` was considered, but exporting chosen. Thanks to Sam Steingold for raising, #2723. - - 5. When `DT` is empty, `DT[,col:=""]` is no longer a warning. The warning was: - > "Supplied 1 items to be assigned to 0 items of column (1 unused)" - - 6. Using `rolltolast` still works but now issues the following warning : - > "'rolltolast' has been marked 'deprecated' in ?data.table since v1.8.8 on CRAN 3 Mar 2013, see NEWS. Please - change to the more flexible 'rollends' instead. 'rolltolast' will be removed in the next version." - - 7. There are now 1,220 raw tests, as reported by `test.data.table()`. - - 8. `data.table`'s dependency has been moved forward from R 2.12.0 to R 2.14.0, now over 2 years old (Oct 2011). As usual before release to CRAN, we ensure data.table passes `R CMD check` on the stated dependency and keep this as old as possible for as long as possible. As requested by users in managed environments. For this reason we still don't use `paste0()` internally, since that was added to R 2.15.0. - ---- - -### Changes in v1.8.10 (on CRAN 03 Sep 2013) - -#### NEW FEATURES - - * fread : - * If some column names are blank they are now given default names rather than causing - the header row to be read as a data row. Thanks to Simon Judes for suggesting. - - * "+" and "-" are now read as character rather than integer 0. Thanks to Alvaro Gonzalez and - Roby Joehanes for reporting, #4814. - http://stackoverflow.com/questions/15388714/reading-strand-column-with-fread-data-table-package - - * % progress console meter has been removed. The ouput was inconvenient in batch mode, log files and - reports which don't handle \r. It was too difficult to detect where fread is being called from, plus, - removing it speeds up fread a little by saving code inside the C for loop (which is why it wasn't - made optional instead). Use your operating system's system monitor to confirm fread is progressing. - Thanks to Baptiste for highlighting : - http://stackoverflow.com/questions/15370993/strange-output-from-fread-when-called-from-knitr - - * colClasses has been added. Same character vector format as read.csv (may be named or unnamed), but - additionally may be type list. Type list enables setting ranges of columns by numeric position. - NOTE: colClasses is intended for rare overrides, not routine use. - - * fread now supports files larger than 4GB on 64bit Windows (#2767 thanks to Paul Harding) and files - between 2GB and 4GB on 32bit Windows (#2655 thanks to Vishal). A C call to GetFileSize() needed to - be GetFileSizeEx(). - - * When input is the data as a character string, it is no longer truncated to your system's maximum - path length, #2649. It was being passed through path.expand() even when it wasn't a filename. - Many thanks to Timothee Carayol for the reproducible report. The limit should now be R's character - string length limit (2^31-1 bytes = 2GB). Test added. - - * New argument 'skip' overrides automatic banner skipping. When skip>=0, 'autostart' is ignored and - line skip+1 will be taken as the first data row, or column names according to header="auto"|TRUE|FALSE - as usual. Or, skip="string" uses the first line containing "string" (chosen to be a substring of the - column name row unlikely to appear earlier), inspired by read.xls in package gdata. - Thanks to Gabor Grothendieck for these suggestions. - - * fread now stops reading if an empty line is encountered, with warning if any text exists after that - such as a footer (the first line of which will be included in the warning message). - - * Now reads files that are open in Excel without having to close them first, #2661. And up to 5 attempts - are made every 250ms on Windows as recommended here : http://support.microsoft.com/kb/316609. - - * "nan%" observed in output of fread(...,verbose=TRUE) timings are now 0% when fread takes 0.000 seconds. - - * An unintended 50,000 column limit in fread has been removed. Thanks to mpmorley for reporting. Test added. - http://stackoverflow.com/questions/18449997/fread-protection-stack-overflow-error - - * unique() and duplicated() methods gain 'by' to allow testing for uniqueness using any subset of columns, - not just the keyed columns (if keyed) or all columns (if not). By default by=key(dt) for backwards - compatibility. ?duplicated has been revised and tests added. - Thanks to Arunkumar Srinivasan, Ricardo Saporta, and Frank Erickson for useful discussions. - - * CJ() is 90% faster on 1e6 rows (for example), #4849. The inputs are now sorted first before combining - rather than after combining and uses rep.int instead of rep (thanks to Sean Garborg for the ideas, - code and benchmark) and only sorted if is.unsorted(), #2321. - Reminder: CJ = Cross Join; i.e., joins to all combinations of its inputs. - - * CJ() gains 'sorted' argument, by default TRUE for backwards compatibility. FALSE retains input order and is faster - to create the result of CJ() but then slower to join from since unkeyed. - - * New function address() returns the address in RAM of its argument. Sometimes useful in determining whether a value - has been copied or not by R, programatically. - http://stackoverflow.com/a/10913296/403310 - -#### BUG FIXES - - * merge no longer returns spurious NA row(s) when y is empty and all.y=TRUE (or all=TRUE), #2633. Thanks - to Vinicius Almendra for reporting. Test added. - http://stackoverflow.com/questions/15566250/merge-data-table-with-all-true-introduces-na-row-is-this-correct - - * rbind'ing data.tables containing duplicate, "" or NA column names now works, #2726 & #2384. - Thanks to Garrett See and Arun Srinivasan for reporting. This also affected the printing of data.tables - with duplicate column names since the head and tail are rbind-ed together internally. - - * rbind, cbind and merge on data.table should now work in packages that Import but do not - Depend on data.table. Many thanks to a patch to .onLoad from Ken Williams, and related - posts from Victor Kryukov : - http://r.789695.n4.nabble.com/Import-problem-with-data-table-in-packages-tp4665958.html - - * Mixing adding and updating into one DT[, `:=`(existingCol=...,newCol=...), by=...] now works - without error or segfault, #2778 and #2528. Many thanks to Arunkumar Srinivasan for reporting - and for the nice reproducible examples. Tests added. - - * rbindlist() now binds factor columns correctly, #2650. Thanks to many for reporting. Tests added. - - * Deleting a (0-length) factor column using :=NULL on an empty data.table now works, #4809. Thanks - to Frank Pinter for reporting. Test added. - http://stackoverflow.com/questions/18089587/error-deleting-factor-column-in-empty-data-table - - * Writing FUN= in DT[,lapply(.SD,FUN=...),] now works, #4893. Thanks to Jan Wijffels for - reporting and Arun for suggesting and testing a fix. Committed and test added. - http://stackoverflow.com/questions/18314757/why-cant-i-used-fun-in-lapply-when-grouping-by-using-data-table - - * The slowness of transform() on data.table has been fixed, #2599. But, please use :=. - - * setkey(DT,`Colname with spaces`) now works, #2452. - setkey(DT,"Colname with spaces") worked already. - - * mean() in j has been optimized since v1.8.2 (see NEWS below) but wasn't respecting na.rm=TRUE (the default). - Many thanks to Colin Fang for reporting. Test added. - http://stackoverflow.com/questions/18571774/data-table-auto-remove-na-in-by-for-mean-function - - -USER VISIBLE CHANGES - - * := on a null data.table now gives a clearer error message : - "Cannot use := to add columns to a null data.table (no columns), currently. You can use := - to add (empty) columns to an empty data.table (1 or more columns, all 0 length), though." - rather than the untrue : - "Cannot use := to add columns to an empty data.table, currently" - - * Misuse of := and `:=`() is now caught in more circumstances and gives a clearer and shorter error message : - ":= and `:=`(...) are defined for use in j, once only and in particular ways. See - help(":="). Check is.data.table(DT) is TRUE." - - * data.table(NULL) now prints "Null data.table (0 rows and 0 cols)" and FAQ 2.5 has been - improved. Thanks to: - http://stackoverflow.com/questions/15317536/is-null-does-not-work-on-null-data-table-in-r-possible-bug - - * The braces {} have been removed from rollends's default, to solve a trace() problem. Thanks - to Josh O'Brien's investigation : - http://stackoverflow.com/questions/15931801/why-does-trace-edit-true-not-work-when-data-table - -#### NOTES - - * Tests 617,646 and 647 could sometimes fail (e.g. r-prerel-solaris-sparc on 7 Mar 2013) - due to machine tolerance. Fixed. - - * The default for datatable.alloccol has changed from max(100L, 2L*ncol(DT)) to max(100L, ncol(DT)+64L). - And a pointer to ?truelength has been added to an error message as suggested and thanks to Roland : - http://stackoverflow.com/questions/15436356/potential-problems-from-over-allocating-truelength-more-than-1000-times - - * For packages wishing to use data.table optionally (e.g. according to user of that package) and therefore - not wishing to Depend on data.table (which is the normal determination of data.table-awareness via .Depends), - `.datatable.aware` may be set to TRUE in such packages which cedta() will look for, as before. But now it doesn't - need to be exported. Thanks to Hadley Wickham for the suggestion and solution. - - * There are now 1,009 raw tests, as reported by test.data.table(). - - * Welcome to Arunkumar Srinivasan and Ricardo Saporta who have joined the project and contributed directly - by way of commits above. - - * v1.8.9 was on R-Forge only. v1.8.10 was released to CRAN. - Odd numbers are development, evens on CRAN. - - -### Changes in v1.8.8 (on CRAN 06 Mar 2013) - -#### NEW FEATURES - - * New function fread(), a fast and friendly file reader. - * header, skip, nrows, sep and colClasses are all auto detected. - * integers>2^31 are detected and read natively as bit64::integer64. - * accepts filenames, URLs and "A,B\n1,2\n3,4" directly - * new implementation entirely in C - * with a 50MB .csv, 1 million rows x 6 columns : - read.csv("test.csv") # 30-60 sec (varies) - read.table("test.csv",) # 10 sec - fread("test.csv") # 3 sec - * airline data: 658MB csv (7 million rows x 29 columns) - read.table("2008.csv",) # 360 sec - fread("2008.csv") # 40 sec - See ?fread. Many thanks to Chris Neff, Garrett See, Hideyoshi Maeda, Patrick - Nic, Akhil Behl and Aykut Firat for ideas, discussions and beta testing. - ** The fread function is still under development; e.g., dates are read as - ** character and embedded quotes ("\"" and """") cause problems. - - * New argument 'allow.cartesian' (default FALSE) added to X[Y] and merge(X,Y), #2464. - Prevents large allocations due to misspecified joins; e.g., duplicate key values in Y - joining to the same group in X over and over again. The word 'cartesian' is used loosely - for when more than max(nrow(X),nrow(Y)) rows would be returned. The error message is - verbose and includes advice. Thanks to a question by Nick Clark, help from user1935457 - and a detailed reproducible crash report from JR. - http://stackoverflow.com/questions/14231737/greatest-n-per-group-reference-with-intervals-in-r-or-sql - If the new option affects existing code you can set : - options(datatable.allow.cartesian=TRUE) - to restore the previous behaviour until you have time to address. - - * In addition to TRUE/FALSE, 'roll' may now be a positive number (roll forwards/LOCF) or - negative number (roll backwards/NOCB). A finite number limits the distance a value is - rolled (limited staleness). roll=TRUE and roll=+Inf are equivalent. - 'rollends' is a new parameter holding two logicals. The first observation is rolled - backwards if rollends[1] is TRUE. The last observation is rolled forwards if rollends[2] - is TRUE. If roll is a finite number, the same limit applies to the ends. - New value roll='nearest' joins to the nearest value (either backwards or forwards) when - the value falls in a gap, and to the end value according to 'rollends'. - 'rolltolast' has been deprecated. For backwards compatibility it is converted to - {roll=TRUE;rollends=c(FALSE,FALSE)}. - This implements [FR#615](https://github.com/Rdatatable/data.table/issues/615) & [FR#459](https://github.com/Rdatatable/data.table/issues/459) and helps several recent S.O. questions. - -#### BUG FIXES - - * setnames(DT,c(NA,NA)) is now a type error rather than a segfault, #2393. - Thanks to Damian Betebenner for reporting. - - * rbind() no longers warns about inputs having columns in a different order - if use.names has been explicitly set TRUE, #2385. Thanks to Simon Judes - for reporting. - - * := by group with 0 length RHS could crash in some circumstances. Thanks to - Damien Challet for the reproducible example using obfuscated data and - pinpointing the version that regressed. Fixed and test added. - - * Error 'attempting to roll join on a factor column' could occur when a non last - join column was a factor column, #2450. Thanks to Blue Magister for - highlighting. - - * NA in a join column of type double could cause both X[Y] and merge(X,Y) - to return incorrect results, #2453. Due to an errant x==NA_REAL in the C source - which should have been ISNA(x). Support for double in keyed joins is a relatively - recent addition to data.table, but embarrassing all the same. Fixed and tests added. - Many thanks to statquant for the thorough and reproducible report : - http://stackoverflow.com/questions/14076065/data-table-inner-outer-join-to-merge-with-na - - * setnames() of all column names (such as setnames(DT,toupper(names(DT)))) failed on a - keyed table where columns 1:length(key) were not the key. Fixed and test added. - - * setkey could sort 'double' columns (such as POSIXct) incorrectly when not the - last column of the key, #2484. In data.table's C code : - x[a] > x[b]-tol - should have been : - x[a]-x[b] > -tol [or x[b]-x[a] < tol ] - The difference may have been machine/compiler dependent. Many thanks to statquant - for the short reproducible example. Test added. - - * cbind(DT,1:n) returned an invalid data.table (some columns were empty) when DT - had one row, #2478. Grouping now warns if j evaluates to an invalid data.table, - to aid tracing root causes like this in future. Tests added. Many thanks to - statquant for the reproducible example revealed by his interesting solution - and to user1935457 for the assistance : - http://stackoverflow.com/a/14359701/403310 - - * merge(...,all.y=TRUE) was 'setcolorder' error if a y column name included a space - and there were rows in y not in x, #2555. The non syntactically valid column names - are now preserved as intended. Thanks to Simon Judes for reporting. Tests added. - - * An error in := no longer suppresses the next print, #2376; i.e., - > DT[,foo:=colnameTypo+1] - Error: object 'colnameTypo' not found - > DT # now prints DT ok - > DT # used to have to type DT a second time to see it - Many thanks to Charles, Joris Meys, and, Spacedman whose solution is now used - by data.table internally (http://stackoverflow.com/a/13606880/403310). - -#### NOTES - - * print(DT,topn=2), where topn is provided explicitly, now prints the top and bottom 2 rows - even when nrow(x)<100 [options()$datatable.print.nrows]. And the 'topn' argument is now first - for easier interactive use: print(DT,2), head(DT,2) and tail(DT,2). - - * The J() alias is now removed *outside* DT[...], but will still work inside DT[...]; - i.e., DT[J(...)] is fine. As warned in v1.8.2 (see below in this file) and deprecated - with warning() in v1.8.4. This resolves the conflict with function J() in package - XLConnect (#1747) and rJava (#2045). - Please use data.table() directly instead of J(), outside DT[...]. - - * ?merge.data.table and FAQ 1.12 have been improved (#2457), and FAQ 2.24 added. - Thanks to dnlbrky for highlighting : http://stackoverflow.com/a/14164411/403310. - - * There are now 943 raw tests, as reported by test.data.table(). - - * v1.8.7 was on R-Forge only. v1.8.8 was released to CRAN. - Odd numbers are development, evens on CRAN. - - -### Changes in v1.8.6 (on CRAN 13 Nov 2012) - -#### BUG FIXES - - * A variable in calling scope was not found when combining i, j and by in - one query, i used that local variable, and that query occurred inside a - function, #2368. This worked in 1.8.2, a regression. Test added. - -#### COMPATIBILITY FOR R 2.12.0-2.15.0 - - * setnames used paste0() to construct its error messages, a function - added to R 2.15.0. Reverted to use paste(). Tests added. - - * X[Y] where Y is empty (test 764) failed due to reliance on a pmin() - enhancement in R 2.15.1. Removed reliance. - -#### NOTES - - * test.data.table() now passes in 2.12.0, the stated dependency, as well as - 2.14.0, 2.15.0, 2.15.1, 2.15.2 and R-devel. - - * Full R CMD check (i.e. including compatibility tests with the 9 Suggest-ed - packages and S4 tests run using testthat which in turn depends on packages - which depend on R >= 2.14.0) passes ok in 2.14.0 onwards. - - * There are now 876 raw tests, as reported by test.data.table(). - - * v1.8.5 was on R-Forge only. v1.8.6 was released to CRAN. - Odd numbers are development, evens on CRAN. - - -### Changes in v1.8.4 (on CRAN 9 Nov 2012) - -#### NEW FEATURES - - * New printing options have been added : - options(datatable.print.nrows=100) - options(datatable.print.topn=10) - If the table to be printed has more than nrows, the top and bottom topn rows - are printed. Otherwise, below nrows, the entire table is printed. - Thanks to Allan Engelhardt and Melanie Bacou for useful discussions. - See FAQs 2.11 and 2.22. - - * When one or more rows in i have no match to x and i is unkeyed, i is now - tested to see if it is sorted. If so, the key is retained. As before, when all rows of - i match to x, the key is retained if i matches to an ordered subset of keyed x without - needing to test i, even if i is unkeyed. - - * by on a keyed empty table is now keyed by the by columns, for consistency with - the non empty case when an ordered grouping is detected. - - * DT[,`:=`(col1=val1, col2=val2, ...)] is now valid syntax rather than a crash, #2254. - Many thanks to Thell Fowler for the suggestion. - - * with=FALSE is no longer needed to use column names or positions on the LHS of :=, #2120. - DT[,c("newcol","existingcol"):=list(1L,NULL)] # with=FALSE not needed - DT[,`:=`(newcol=1L, existingcol:=NULL)] # same - If the LHS is held in a variable, the followed equivalent options are retained : - mycols = c("existingcol","newcol") - DT[,get("mycols"):=1L] - DT[,eval(mycols):=1L] # same - DT[,mycols:=1L,with=FALSE] # same - DT[,c("existingcol","newcol"):=1L] # same (with=FALSE not needed) - - * Multiple LHS:= and `:=`(...) now work by group, and by without by. Implementing - or fixing, and thanks to, #2215 (Florian Oswald), #1710 (Farrel Buchinsky) and - others. - DT[,c("newcol1","newcol2"):=list(mean(col1),sd(col1)), by=grp] - DT[,`:=`(newcol1=mean(col1), - newcol2=sd(col1), - ...), by=grp] # same but easier to read - DT[c("grp1","grp2"), `:=`(newcol1=mean(col1), - newcol2=sd(col1))] # same using by-without-by - - * with=FALSE now works with a symbol LHS of :=, by group (#2120) : - colname = "newcol" - DT[,colname:=f(),by=grp,with=FALSE] - Thanks to Alex Chernyakov : - http://stackoverflow.com/questions/11745169/dynamic-column-names-in-data-table-r - http://stackoverflow.com/questions/11680579/assign-multiple-columns-using-in-data-table-by-group - - * .GRP is a new symbol available to j. Value 1 for the first group, 2 for the 2nd, etc. Thanks - to Josh O'Brien for the suggestion : - http://stackoverflow.com/questions/13018696/data-table-key-indices-or-group-counter - - * .I is a new symbol available to j. An integer vector length .N. It contains the group's row - locations in DT. This implements FR#1962. - DT[,.I[which.max(colB)],by=colA] # row numbers of maxima by group - - * A new "!" prefix on i signals 'not-join' (a.k.a. 'not-where'), #1384i. - DT[-DT["a", which=TRUE, nomatch=0]] # old not-join idiom, still works - DT[!"a"] # same result, now preferred. - DT[!J(6),...] # !J == not-join - DT[!2:3,...] # ! on all types of i - DT[colA!=6L | colB!=23L,...] # multiple vector scanning approach (slow) - DT[!J(6L,23L)] # same result, faster binary search - '!' has been used rather than '-' : - * to match the 'not-join'/'not-where' nomenclature - * with '-', DT[-0] would return DT rather than DT[0] and not be backwards - compatible. With '!', DT[!0] returns DT both before (since !0 is TRUE in - base R) and after this new feature. - * to leave DT[+J...] and DT[-J...] available for future use - - * When with=FALSE, "!" may also be a prefix on j, #1384ii. This selects all but the named columns. - DF[,-match("somecol",names(DF))] # works when somecol exists. If not, NA causes an error. - DF[,-match("somecol",names(DF),nomatch=0)] # works when somecol exists. Empty data.frame when it doesn't, silently. - DT[,-match("somecol",names(DT)),with=FALSE] # same issues. - DT[,setdiff(names(DT),"somecol"),with=FALSE] # works but you have to know order of arguments, and no warning if doesn't exist - - vs - - DT[,!"somecol",with=FALSE] # works and easy to read. With (helpful) warning if somecol isn't there. - Strictly speaking, this (!j) is a "not-select" (!i is 'not-where'). This has no analogy in SQL. - Reminder: i is analogous to WHERE, j is analogous to SELECT and `:=` in j changes SELECT to UPDATE. - !j when j is column positions is very similar to -j. - DF[,-(2:3),drop=FALSE] # all but columns 2 and 3. Careful, brackets and drop=FALSE are required. - DT[,-(2:3),with=FALSE] # same - DT[,!2:3,with=FALSE] # same - copy(DT)[,2:3:=NULL,with=FALSE] # same - !j was introduced for column names really, not positions. It works for both, for consistency : - toremove = c("somecol","anothercol") - DT[,!toremove,with=FALSE] - toremove = 2:3 - DT[,!toremove,with=FALSE] # same code works without change - - * 'which' now accepts NA. This means return the row numbers in i that don't match, #1384iii. - Thanks to Santosh Srinivas for the suggestion. - X[Y,which=TRUE] # row numbers of X that do match, as before - X[!Y,which=TRUE] # row numbers of X that don't match - X[Y,which=NA] # row numbers of Y that don't match - X[!Y,which=NA] # row numbers of Y that do match (for completeness) - - * setnames() now works on data.frame, #2273. Thanks to Christian Hudon for the suggestion. - -#### BUG FIXES - - * A large slowdown (many minutes instead of a few secs) in X[Y] joins has been fixed, #2216. - This occurred where the number of rows in i was large, and at least one row joined to - more than one row in x. Possibly in other similar circumstances too. The workaround was - to set mult="first" which is no longer required. Test added. - Thanks to a question and report from Alex Chernyakov : - http://stackoverflow.com/questions/12042779/time-of-data-table-join - - * Indexing columns of data.table with a logical vector and `with=FALSE` now works as - expected, fixing #1797. Thanks to Mani Narayanan for reporting. Test added. - - * In X[Y,cols,with=FALSE], NA matches are now handled correctly. And if cols - includes join columns, NA matches (if any) are now populated from i. For - consistency with X[Y] and X[Y,list(...)]. Tests added. - - * "Internal error" when combining join containing missing groups and group by - is fixed, #2162. For example : - X[Y,.N,by=NonJoinColumn] - where Y contains some rows that don't match to X. This bug could also result in a segfault. - Thanks to Andrey Riabushenko and Michael Schermerhorn for reporting. Tests added. - - * On empty tables, := now changes column type and adds new 0 length columns ok, fixing - #2274. Tests added. - - * Deleting multiple columns out-of-order is no longer a segfault, #2223. Test added. - DT[,c(9,2,6):=NULL] - Reminder: deleting columns by reference is relatively instant, regardless of table size. - - * Mixing column adds and deletes in one := gave incorrect results, #2251. Thanks to - Michael Nelson for reporting. Test added. - DT[,c("newcol","col1"):=list(col1+1L,NULL)] - DT[,`:=`(newcol=col1+1L,col1=NULL)] # same - - * Out of bound positions in the LHS of := are now caught. Root cause of crash in #2254. - Thanks to Thell Fowler for reporting. Tests added. - DT[,(ncol(DT)+1):=1L] # out of bounds error (add new columns by name only) - DT[,ncol(DT):=1L] # ok - - * A recycled column plonk RHS of := no longer messes up setkey and := when used on that - object afterwards, #2298. For example, - DT = data.table(a=letters[3:1],x=1:3) - DT[,c("x1","x2"):=x] # ok (x1 and x2 are now copies of x) - setkey(DT,a) # now ok rather than wrong result - Thanks to Timothee Carayol for reporting. Tests added. - - * Join columns are now named correctly when j is .SD, a subset of .SD, or similar, #2281. - DT[c("a","b"),.SD[...]] # result's first column now named key(DT)[1] rather than 'V1' - - * Joining an empty i table now works without error (#2194). It also retains key and has a consistent - number and type of empty columns as the non empty by-without-by case. Tests added. - - * by-without-by with keyed i where key isn't the 1:n columns of i could crash, #2314. Many thanks - to Garrett See for reporting with reproducible example data file. Tests added. - - * DT[,col1:=X[Y,col2]] was a crash, #2311. Due to RHS being a data.table. mult="first" - (or drop=TRUE in future) was likely intended. Thanks to Anoop Shah for reporting with - reproducible example. Root cause (recycling of list columns) fixed and tests added. - - * Grouping by a column which somehow has names, no longer causes an error, #2307. - DT = data.table(a=1:3,b=c("a","a","b")) - setattr(DT$b, "names", c("a","b","c")) # not recommended, just to illustrate - DT[,sum(a),by=b] # now ok - - * gWidgetsWWW wasn't known as data.table aware, even though it mimicks executing - code in .GlobalEnv, #2340. So, data.table is now gWidgetsWWW-aware. Further packages - can be added if required by changing a new variable : - data.table:::cedta.override - by using assignInNamespace(). Thanks to Zach Waite and Yihui Xie for investigating and - providing reproducible examples : - http://stackoverflow.com/questions/13106018/data-table-error-when-used-through-knitr-gwidgetswww - - * Optimization of lapply when FUN is a character function name now works, #2212. - DT[,lapply(.SD, "+", 1), by=id] # no longer an error - DT[,lapply(.SD, `+`, 1), by=id] # same, worked before - Thanks to Michael Nelson for highlighting. Tests added. - - * Syntactically invalid column names (such as "Some rate (%)") are now preserved in X[Y] joins and - merge(), as intended. Thanks to George Kaupas (#2193i) and Yang Zhang (#2090) for reporting. - Tests added. - - * merge() and setcolorder() now check for duplicate column names first rather than a less helpful - error later, #2193ii. Thanks to Peter Fine for reporting. Tests added. - - * Column attributes (such as 'comment') are now retained by X[Y] and merge(), #2270. Thanks to - Allan Engelhardt for reporting. Tests added. - - * A matrix RHS of := is now treated as vector, with warning if it has more than 1 column, #2333. - Thanks to Alex Chernyakov for highlighting. Tests added. - DT[,b:=scale(a)] # now works rather than creating an invalid column of type matrix - http://stackoverflow.com/questions/13076509/why-error-from-na-omit-after-running-scale-in-r-in-data-table - - * last() is now S3 generic for compatibility with xts::last, #2312. Strictly speaking, for speed, - last(x) deals with vector, list and data.table inputs directly before falling back to - S3 dispatch. Thanks to Garrett See for reporting. Tests added. - - * DT[,lapply(.SD,sum)] in the case of no grouping now returns a data.table for consistency, rather - than list, #2263. Thanks to Justin and mnel for highlighting. Existing test changed. - http://stackoverflow.com/a/12290443/403310 - - * L[[2L]][,newcol:=] now works, where L is a list of data.table objects, #2204. Thanks to Melanie Bacou - for reporting. Tests added. A warning is issued when the first column is added if L was created with - list(DT1,DT2) since R's list() copies named inputs. Until reflist() is implemented, this warning can be - ignored or suppressed. - - * DT[J(data.frame(...))] now works again, giving the same result as DT[data.frame(...)], #2265. - Thanks to Christian Hudon for reporting. Tests added. - - * A memory leak has been fixed, #2191 and #2284. All data.table objects leaked the over allocated column - pointer slots; i.e., when a data.table went out of scope or was rm()'d this memory wasn't released and - gc() would report growing Vcells. For a 3 column data.table with a 100 allocation, the growth was - 1.5Kb per data.table on 64bit (97*8*2 bytes) and 0.75Kb on 32bit (97*4*2 bytes). - Many thanks to Xavier Saint-Mleux and Sasha Goodman for the reproducible examples and - assistance. Tests added. - - * rbindlist now skips empty (0 row) items as well as NULL items. So the column types of the result are - now taken from the first non-empty data.table. Thanks to Garrett See for reporting. Test added. - - * setnames did not update column names correctly when passed integer column positions and those - column names contained duplicates, fixed. This affected the column names of queries involving - two or more by expressions with a named list inside {}. Thanks to Steve Lianoglou for finding and - fixing. Tests added. - DT[, {list(name1=sum(v),name2=sum(w))}, by="a,b"] # now ok, no blank column names in result - DT[, list(name1=sum(v),name2=sum(w)), by="a,b"] # ok before - -#### USER VISIBLE CHANGES - - * J() now issues a warning (when used *outside* DT[...]) that using it - outside DT[...] is deprecated. See item below in v1.8.2. - Use data.table() directly instead of J(), outside DT[...]. Or, define - an alias yourself. J() will continue to work *inside* DT[...] as documented. - - * DT[,LHS:=RHS,...] no longer prints DT. This implements #2128 "Try again to get - DT[i,j:=value] to return invisibly". Thanks to discussions here : - http://stackoverflow.com/questions/11359553/how-to-suppress-output-when-using-in-r-data-table - http://r.789695.n4.nabble.com/Avoiding-print-when-using-tp4643076.html - FAQs 2.21 and 2.22 have been updated. - - * DT[] now returns DT rather than an error that either i or j must be supplied. - So, ending with [] at the console is a convenience to print the result of :=, rather - than wrapping with print(); e.g., - DT[i,j:=value]...oops forgot print...[] - is the same as : - print(DT[i,j:=value]) - - * A warning is now issued when by is set equal to the by-without-by join columns, - causing x to be subset and then grouped again. The warning suggests removing by or - changing it, #2282. This can be turned off using options(datatable.warnredundantby=FALSE) - in case it occurs after upgrading, until those lines can be modified. - Thanks to Ben Barnes for highlighting : - http://stackoverflow.com/a/12474211/403310 - - * Description of how join columns are determined in X[Y] syntax has been further clarified - in ?data.table. Thanks to Alex : - http://stackoverflow.com/questions/12920803/merge-data-table-when-the-number-of-key-columns-are-different - - * ?transform and example(transform) has been fixed and embelished, #2316. - Thanks to Garrett See's suggestion. - - * ?setattr has been updated to document that it takes any input, not just data.table, and - can be used on columns of a data.frame, for example. - - * Efficiency warnings when joining between a factor column and a character column are now downgraded - to messages when verbosity is on, #2265i. Thanks to Christian Hudon for the suggestion. - -#### THANKS TO BETA TESTING (bugs caught in 1.8.3 before release to CRAN) - - * Combining a join with mult="first"|"last" followed by by inside the same [...] gave incorrect - results or a crash, #2303. Many thanks to Garrett See for the reproducible example and - pinpointing in advance which commit had caused the problem. Tests added. - - * Examples in ?data.table have been updated now that := no longer prints. Thanks to Garrett See. - -#### NOTES - - * There are now 869 raw tests. test.data.table() should return precisely this number of - tests passed. If not, then somehow, a slightly stale version from R-Forge is likely - installed; please reinstall from CRAN. - - * v1.8.3 was an R-Forge only beta release. v1.8.4 was released to CRAN. - - -### Changes in v1.8.2 - -#### NEW FEATURES - - * Numeric columns (type 'double') are now allowed in keys and ad hoc - by. J() and SJ() no longer coerce 'double' to 'integer'. i join columns - which mismatch on numeric type are coerced silently to match - the type of x's join column. Two floating point values - are considered equal (by grouping and binary search joins) if their - difference is within sqrt(.Machine$double.eps), by default. See example - in ?unique.data.table. Completes FRs #951, #1609 and #1075. This paves the - way for other atomic types which use 'double' (such as POSIXct and bit64). - Thanks to Chris Neff for beta testing and finding problems with keys - of two numeric columns (bug #2004), fixed and tests added. - - * := by group is now implemented (FR#1491) and sub-assigning to a new column - by reference now adds the column automatically (initialized with NA where - the sub-assign doesn't touch) (FR#1997). := by group can be combined with all - types of i, so ":= by group" includes grouping by `i` as well as by `by`. - Since := by group is by reference, it should be significantly faster than any - method that (directly or indirectly) `cbind`s the grouped results to DT, since - no copy of the (large) DT is made at all. It's a short and natural syntax that - can be compounded with other queries. - DT[,newcol:=sum(colB),by=colA] - - * Prettier printing of list columns. The first 6 items of atomic vectors - are collapsed with "," followed by a trailing "," if there are more than - 6, FR#1608. This difference to data.frame has been added to FAQ 2.17. - Embedded objects (such as a data.table) print their class name only to avoid - seemingly mangled output, bug #1803. Thanks to Yike Lu for reporting. - For example: - > data.table(x=letters[1:3], - y=list( 1:10, letters[1:4], data.table(a=1:3,b=4:6) )) - x y - 1: a 1,2,3,4,5,6, - 2: b a,b,c,d - 3: c - - * Warnings added when joining character to factor, and factor to character. - Character to character is now preferred in joins and needs no coercion. - Even so, these coercions have been made much more efficient by taking - a shallow copy of i internally, avoiding a full deep copy of i. - - * Ordered subsets now retain x's key. Always for logical and keyed i, using - base::is.unsorted() for integer and unkeyed i. Implements FR#295. - - * mean() is now automatically optimized, #1231. This can speed up grouping - by 20 times when there are a large number of groups. See wiki point 3, which - is no longer needed to know. Turn off optimization by setting - options(datatable.optimize=0). - - * DT[,lapply(.SD,...),by=...] is now automatically optimized, #2067. This can speed - up applying a function by column by group, by over 20 times. See wiki point 5 - which is no longer needed to know. In other words: - DT[,lapply(.SD,sum),by=grp] - is now just as fast as : - DT[,list(x=sum(x),y=sum(y)),by=grp] - Don't forget to use .SDcols when a subset of columns is needed. - - * The package is now Byte Compiled (when installed in R 2.14.0 or later). Several - internal speed improvements were made in this version too, such as avoiding - internal copies. If you find 1.8.2 is faster, before attributing that to Byte - Compilation, please install the package without Byte Compilation and compare - ceteris paribus. If you find cases where speed has slowed, please let us know. - - * sapply(DT,class) gets a significant speed boost by avoiding a call to unclass() - in as.list.data.table() called by lapply(DT,...), which copied the entire object. - Thanks to a question by user1393348 on Stack Overflow, implementing #2000. - http://stackoverflow.com/questions/10584993/r-loop-over-columns-in-data-table - - * The J() alias is now deprecated outside DT[...], but will still work inside - DT[...], as in DT[J(...)]. - J() is conflicting with function J() in package XLConnect (#1747) - and rJava (#2045). For data.table to change is easier, with some efficiency - advantages too. The next version of data.table will issue a warning from J() - when used outside DT[...]. The version after will remove it. Only then will - the conflict with rJava and XLConnect be resolved. - Please use data.table() directly instead of J(), outside DT[...]. - - * New DT[.(...)] syntax (in the style of package plyr) is identical to - DT[list(...)], DT[J(...)] and DT[data.table(...)]. We plan to add ..(), too, so - that .() and ..() are analogous to the file system's ./ and ../; i.e., .() - evaluates within the frame of DT and ..() in the parent scope. - - * New function rbindlist(l). This does the same as do.call("rbind",l), but much - faster. - -#### BUG FIXES - - * DT[,f(.SD),by=colA] where f(x)=x[,colB:=1L] was a segfault, bug#1727. - This is now a graceful error to say that using := in .SD's j is - reserved for future use. This was already caught in most circumstances, - other than via f(.SD). Thanks to Leon Baum for reporting. Test added. - - * If .N is selected by j it is now renamed "N" (no dot) in the output, to - avoid a potential conflict in subsequent grouping between a column called - ".N" and the special .N variable, fixing #1720. ?data.table updated and - FAQ 4.6 added with detailed examples. Tests added. - - * Moved data.table setup code from .onAttach to .onLoad so that it - is also run when data.table is simply `import`ed from within a package, - fixing #1916 related to missing data.table options. - - * Typos fixed in ?":=", thanks to Michael Weylandt for reporting. - - * base::unname(DT) now works again, as needed by plyr::melt(). Thanks to - Christoph Jaeckel for reporting. Test added. - - * CJ(x=...,y=...) now retains the column names x and y, useful when CJ - is used independently (since x[CJ(...)] takes join column names from x). - Restores behaviour lost somewhere between 1.7.1 and 1.8.0, thanks - to Muhammad Waliji for reporting. Tests added. - - * A column plonk via set() was only possible by passing NULL as i. The default - for i is now NULL so that missing i invokes a column plonk, too (when length(value) - == nrow(DT)). A column plonk is much more efficient than creating 1:nrow(DT) and - passing that as i to set() or DT[i,:=] (almost infinitely faster). Thanks to - testing by Josh O'Brien in comments on Stack Overflow. Test added. - - * Joining a factor column with unsorted and unused levels to a character column - now matches properly, fixing #1922. Thanks to Christoph Jäckel for the reproducible - example. Test added. - - * 'by' on an empty table now returns an empty table (#1945) and .N, .SD and .BY are - now available in the empty case (also #1945). The column names and types of - the returned empty table are consistent with the non empty case. Thanks to - Malcolm Cook for reporting. Tests added. - - * DT[NULL] now returns the NULL data.table, rather than an error. Test added. - Use DT[0] to return an empty copy of DT. - - * .N, .SD and .BY are now available to j when 'by' is missing, "", character() - and NULL, fixing #1732. For consistency so that j works unchanged when by is - dynamic and passed one of those values all meaning 'don't group'. Thanks - to Joseph Voelkel reporting and Chris Neff for further use cases. Tests added. - - * chorder(character()) was a segfault, #2026. Fixed and test added. - - * When grouping by i, if the first row of i had no match, .N was 1 rather than 0. - Fixed and tests added. Thanks to a question by user1165199 on Stack Overflow : - http://stackoverflow.com/questions/10721517/count-number-of-times-data-is-in-another-dataframe-in-r - - * All object attributes are now retained by grouping; e.g., tzone of POSIXct is no - longer lost, fixing #1704. Test added. Thanks to Karl Ove Hufthammer for reporting. - - * All object attributes are now retained by recycling assign to a new column (both - <- and :=); e.g., POSIXct class is no longer lost, fixing #1712. Test added. Thanks - to Leon Baum for reporting. - - * unique() of ITime no longer coerces to integer, fixing #1719. Test added. - - * rbind() of DT with an irregular list() now recycles the list items correctly, - #2003. Test added. - - * setcolorder() now produces correct error when passed missing column names. Test added. - - * merge() with common names, and, all.y=TRUE (or all=TRUE) no longer returns an error, #2011. - Tests added. Thanks to a question by Ina on Stack Overflow : - http://stackoverflow.com/questions/10618837/joining-two-partial-data-tables-keeping-all-x-and-all-y - - * Removing or setting datatable.alloccol to NULL is no longer a memory leak, #2014. - Tests added. Thanks to a question by Vanja on Stack Overflow : - http://stackoverflow.com/questions/10628371/r-importing-data-table-package-namespace-unexplainable-jump-in-memory-consumpt - - * DT[,2:=someval,with=FALSE] now changes column 2 even if column 1 has the same (duplicate) - name, #2025. Thanks to Sean Creighton for reporting. Tests added. - - * merge() is now correct when all=TRUE but there are no common values in the two - data.tables, fixing #2114. Thanks to Karl Ove Hufthammer for reporting. Tests added. - - * An as.data.frame method has been added for ITime, so that ITime can be passed to ggplot2 - without error, #1713. Thanks to Farrel Buchinsky for reporting. Tests added. - ITime axis labels are still displayed as integer seconds from midnight; we don't know why ggplot2 - doesn't invoke ITime's as.character method. Convert ITime to POSIXct for ggplot2, is one approach. - - * setnames(DT,newnames) now works when DT contains duplicate column names, #2103. - Thanks to Timothee Carayol for reporting. Tests added. - - * subset() would crash on a keyed table with non-character 'select', #2131. Thanks - to Benjamin Barnes for reporting. The root cause was non character inputs to chmatch - and %chin%. Tests added. - - * Non-ascii column names now work when passed as character 'by', #2134. Thanks to - Karl Ove Hufthammer for reporting. Tests added. - DT[, mean(foo), by=ÆØÅ] # worked before - DT[, mean(foo), by="ÆØÅ"] # now works too - DT[, mean(foo), by=colA] # worked before - DT[, mean(foo), by="colA"] # worked before - -#### USER VISIBLE CHANGES - - * Incorrect syntax error message for := now includes advice to check that - DT is a data.table rather than a data.frame. Thanks to a comment by - gkaupas on Stack Overflow. - - * When set() is passed a logical i, the error message now includes advice to - wrap with which() and take the which() outside the loop (if any) if possible. - - * An empty data.table (0 rows, 1+ cols) now print as "Empty data.table" rather - than "NULL data.table". A NULL data.table, returned by data.table(NULL) has - 0 rows and 0 cols. DT[0] returns an empty data.table. - - * 0 length by (such as NULL and character(0)) now return a data.table when j - is vector, rather than vector, for consistency of return types when by - is dynamic and 'dont group' needs to be represented. Bug fix #1599 in - v1.7.0 was fixing an error in this case (0 length by). - - * Default column names for unnamed columns are now consistent between 'by' and - non-'by'; e.g. these two queries now name the columns "V1" and "V2" : - DT[,list("a","b"),by=x] - DT[,list("a","b")] # used to name the columns 'a' and 'b', oddly. - - * Typing ?merge now asks whether to display ?merge.data.frame or ?merge.data.table, - and ?merge.data.table works directly. Thanks to Chris Neff for suggesting. - - * Description of how join columns are determined in X[Y] syntax has been clarified - in ?data.table. Thanks to Juliet Hannah and Yike Lu. - - * DT now prints consistent row numbers when the column names are reprinted at the - bottom of the output (saves scrolling up). Thanks to Yike Lu for reporting #2015. - The tail as well as the head of large tables is now printed. - - -#### THANKS TO BETA TESTING (i.e. bugs caught in 1.8.1 before release to CRAN) : - - * Florian Oswald for #2094: DT[,newcol:=NA] now adds a new logical column ok. - Test added. - - * A large slow down (2s went up to 40s) when iterating calls to DT[...] in a - for loop, such as in example(":="), was caught and fixed in beta, #2027. - Speed regression test added. - - * Christoph Jäckel for #2078: by=c(...) with i clause broke. Tests added. - - * Chris Neff for #2065: keyby := now keys, unless, i clause is present or - keyby is not straightforward column names (in any format). Tests added. - - * :=NULL to delete, following by := by group to add, didn't add the column, - #2117. Test added. - - * Combining i subset with by gave incorrect results, #2118. Tests added. - - * Benjamin Barnes for #2133: rbindlist not supporting type 'logical'. - Tests added. - - * Chris Neff for #2146: using := to add a column to the result of a simple - column subset such as DT[,list(x)], or after changing all column names - with setnames(), was an error. Fixed and tests added. - -#### NOTES - - * There are now 717 raw tests, plus S4 tests. - - * v1.8.1 was an R-Forge only beta release. v1.8.2 was released to CRAN. - - -### Changes in v1.8.0 - -#### NEW FEATURES - - * character columns are now allowed in keys and are preferred to - factor. data.table() and setkey() no longer coerce character to - factor. Factors are still supported. Implements FR#1493, FR#1224 - and (partially) FR#951. - - * setkey() no longer sorts factor levels. This should be more convenient - and compatible with ordered factors where the levels are 'labels', in - some order other than alphabetical. The established advice to paste each - level with an ordinal prefix, or use another table to hold the factor - labels instead of a factor column, is no longer needed. Solves FR#1420. - Thanks to Damian Betebenner and Allan Engelhardt raising on datatable-help - and their tests have been added verbatim to the test suite. - - * unique(DT) and duplicated(DT) are now faster with character columns, - on unkeyed tables as well as keyed tables, FR#1724. - - * New function set(DT,i,j,value) allows fast assignment to elements - of DT. Similar to := but avoids the overhead of [.data.table, so is - much faster inside a loop. Less flexible than :=, but as flexible - as matrix subassignment. Similar in spirit to setnames(), setcolorder(), - setkey() and setattr(); i.e., assigns by reference with no copy at all. - - M = matrix(1,nrow=100000,ncol=100) - DF = as.data.frame(M) - DT = as.data.table(M) - system.time(for (i in 1:1000) DF[i,1L] <- i) # 591.000s - system.time(for (i in 1:1000) DT[i,V1:=i]) # 1.158s - system.time(for (i in 1:1000) M[i,1L] <- i) # 0.016s - system.time(for (i in 1:1000) set(DT,i,1L,i)) # 0.027s - - * New functions chmatch() and %chin%, faster versions of match() - and %in% for character vectors. R's internal string cache is - utilised (no hash table is built). They are about 4 times faster - than match() on the example in ?chmatch. - - * Internal function sortedmatch() removed and replaced with chmatch() - when matching i levels to x levels for columns of type 'factor'. This - preliminary step was causing a (known) significant slowdown when the number - of levels of a factor column was large (e.g. >10,000). Exacerbated in - tests of joining four such columns, as demonstrated by Wes McKinney - (author of Python package Pandas). Matching 1 million strings of which - of which 600,000 are unique is now reduced from 16s to 0.5s, for example. - Background here : - http://stackoverflow.com/questions/8991709/why-are-pandas-merges-in-python-faster-than-data-table-merges-in-r - - * rbind.data.table() gains a use.names argument, by default TRUE. - Set to FALSE to combine columns in order rather than by name. Thanks to - a question by Zach on Stack Overflow : - http://stackoverflow.com/questions/9315258/aggregating-sub-totals-and-grand-totals-with-data-table - - * New argument 'keyby'. An ad hoc by just as 'by' but with an additional setkey() - on the by columns of the result, for convenience. Not to be confused with a - 'keyed by' such as DT[...,by=key(DT)] which can be more efficient as explained - by FAQ 3.3. Thanks to Yike Lu for the suggestion and discussion (FR#1780). - - * Single by (or keyby) expressions no longer need to be wrapped in list(), - for convenience, implementing FR#1743; e.g., these now works : - DT[,sum(v),by=a%%2L] - DT[,sum(v),by=month(date)] - instead of needing : - DT[,sum(v),by=list(a%%2L)] - DT[,sum(v),by=list(month(date))] - - * Unnamed 'by' expressions have always been inspected using all.vars() to make - a guess at a sensible column name for the result. This guess now includes - function names via all.vars(functions=TRUE), for convenience; e.g., - DT[,sum(v),by=month(date)] - now returns a column called 'month' rather than 'date'. It is more robust to - explicitly name columns, though; e.g., - DT[,sum(v),by=list("Guaranteed name"=month(date))] - - * For a surprising speed boost in some circumstances, default options such as - 'datatable.verbose' are now set when the package loads (unless they are already - set, by user's profile for example). The 'default' argument of base::getOption() - was the culprit and has been removed internally from all 11 calls. - - -#### BUG FIXES - - * Fixed a `suffixes` handling bug in merge.data.table that was - only recently introduced during the recent "fast-merge"-ing reboot. - Briefly, the bug was only triggered in scenarios where both - tables had identical column names that were not part of `by` and - ended with *.1. cf. "merge and auto-increment columns in y[x]" - test in tests/test-data.frame-like.R for more information. - - * Adding a column using := on a data.table just loaded from disk was - correctly detected and over allocated, but incorrectly warning about - a previous copy. Test 462 tested loading from disk, but suppressed - warnings (sadly). Fixed. - - * data.table unaware packages that use DF[i] and DF[i]<-value syntax - were not compatible with data.table, fixed. Many thanks to Prasad Chalasani - for providing a reproducible example with base::droplevels(), and - Helge Liebert for providing a reproducible example (#1794) with stats::reshape(). - Tests added. - - * as.data.table(DF) already preserved DF's attributes but not any inherited - classes such as nlme's groupedData, so nlme was incompatible with - data.table. Fixed. Thanks to Dieter Menne for providing a reproducible - example. Test added. - - * The internal row.names attribute of .SD (which exists for compatibility with - data.frame only) was not being updated for each group. This caused length errors - when calling any non-data.table-aware package from j, by group, when that package - used length of row.names. Such as the recent update to ggplot2. Fixed. - - * When grouped j consists of a print of an object (such as ggplot2), the print is now - masked to return NULL rather than the object that ggplot2 returns since the - recent update v0.9.0. Otherwise data.table tries to accumulate the (albeit - invisible) print object. The print mask is local to grouping, not generally. - - * 'by' was failing (bug #1880) when passed character column names where one or more - included a space. So, this now works : - DT[,sum(v),by="column 1"] - and j retains spaces in column names rather than replacing spaces with "."; e.g., - DT[,list("a b"=1)] - Thanks to Yang Zhang for reporting. Tests added. As before, column names may be - back ticked in the usual R way (in i, j and by); e.g., - DT[,sum(`nicely named var`+1),by=month(`long name for date column`)] - - * unique() on an unkeyed table including character columns now works correctly, fixing - #1725. Thanks to Steven Bagley for reporting. Test added. - - * %like% now returns logical (rather than integer locations) so that it can be - combined with other i clauses, fixing #1726. Thanks to Ivan Zhang for reporting. Test - added. - - -#### THANKS TO - - * Joshua Ulrich for spotting a missing PACKAGE="data.table" - in .Call in setkey.R, and suggesting as.list.default() and - unique.default() to avoid dispatch for speed, all implemented. - - -#### USER-VISIBLE CHANGES - - * Providing .SDcols when j doesn't use .SD is downgraded from error to warning, - and verbosity now reports which columns have been detected as used by j. - - * check.names is now FALSE by default, for convenience when working with column - names with spaces and other special characters, which are now fully supported. - This difference to data.frame has been added to FAQ 2.17. - - -### Changes in v1.7.10 - -#### NEW FEATURES - - * New function setcolorder() reorders the columns by name - or by number, by reference with no copy. This is (almost) - infinitely faster than DT[,neworder,with=FALSE]. - - * The prefix i. can now be used in j to refer to join inherited - columns of i that are otherwise masked by columns in x with - the same name. - - -#### BUG FIXES - - * tracemem() in example(setkey) was causing CRAN check errors - on machines where R is compiled without memory profiling available, - for efficiency. Notably, R for Windows, Ubuntu and Mac have memory - profiling enabled which may slow down R on those architectures even - when memory profiling is not being requested by the user. The call to - tracemem() is now wrapped with try(). - - * merge of unkeyed tables now works correctly after breaking in 1.7.8 and - 1.7.9. Thanks to Eric and DM for reporting. Tests added. - - * nomatch=0 was ignored for the first group when j used join inherited - scope. Fixed and tests added. - - -#### USER-VISIBLE CHANGES - - * Updating an existing column using := after a key<- now works without warning - or error. This can be useful in interactive use when you forget to use setkey() - but don't mind about the inefficiency of key<-. Thanks to Chris Neff for - providing a convincing use case. Adding a new column uing := after key<- - issues a warning, shallow copies and proceeds, as before. - - * The 'datatable.pre.suffixes' option has been removed. It was available to - obtain deprecated merge() suffixes pre v1.5.4. - - -### Changes in v1.7.9 - -#### NEW FEATURES - - * New function setnames(), referred to in 1.7.8 warning messages. - It makes no copy of the whole data object, unlike names<- and - colnames<-. It may be more convenient as well since it allows changing - a column name, by name; e.g., - - setnames(DT,"oldcolname","newcolname") # by name; no match() needed - setnames(DT,3,"newcolname") # by position - setnames(DT,2:3,c("A","B")) # multiple - setnames(DT,c("a","b"),c("A","B")) # multiple by name - setnames(DT,toupper(names(DT))) # replace all - - setnames() maintains truelength of the over-allocated names vector. This - allows := to add columns fully by reference without growing the names - vector. As before with names<-, if a key column's name is changed, - the "sorted" attribute is updated with the new column name. - -#### BUG FIXES - - * Incompatibility with reshape() of 3 column tables fixed - (introduced by 1.7.8) : - Error in setkey(ans, NULL) : x is not a data.table - Thanks to Damian Betebenner for reporting and - reproducible example. Tests added to catch in future. - - * setattr(DT,...) still returns DT, but now invisibly. It returns - DT back again for compound syntax to work; e.g., - setattr(DT,...)[i,j,by] - Again, thanks to Damian Betebenner for reporting. - - -### Changes in v1.7.8 - -#### BUG FIXES - - * unique(DT) now works when DT is keyed and a key - column is called 'x' (an internal scoping conflict - introduced in v1.6.1). Thanks to Steven Bagley for - reporting. - - * Errors and segfaults could occur in grouping when - j contained character or list columns. Many thanks - to Jim Holtman for providing a reproducible example. - - * Setting a key on a table with over 268 million rows - (2^31/8) now works (again), #1714. Bug introduced in - v1.7.2. setkey works up to the regular R vector limit - of 2^31 rows (2 billion). Thanks to Leon Baum - for reporting. - - * Checks in := are now made up front (before starting to - modify the data.table) so that the data.table isn't - left in an invalid state should an error occur, #1711. - Thanks to Chris Neff for reporting. - - * The 'Chris crash' is fixed. The root cause was that key<- - always copies the whole table. The problem with that copy - (other than being slower) is that R doesn't maintain the - over allocated truelength, but it looks as though it has. - key<- was used internally, in particular in merge(). So, - adding a column using := after merge() was a memory overwrite, - since the over allocated memory wasn't really there after - key<-'s copy. - - data.tables now have a new attribute '.internal.selfref' to - catch and warn about such copies in future. All internal - use of key<- has been replaced with setkey(), or new function - setkeyv() which accepts a vector, and do not copy. - - Many thanks to Chris Neff for extended dialogue, providing a - reproducible example and his patience. This problem was not just - in pre 2.14.0, but post 2.14.0 as well. Thanks also to Christoph - Jäckel, Timothée Carayol and DM for investigations and suggestions, - which in combination led to the solution. - - * An example in ?":=" fixed, and j and by descriptions - improved in ?data.table. Thanks to Joseph Voelkel for - reporting. - -#### NEW FEATURES - - * Multiple new columns can be added by reference using - := and with=FALSE; e.g., - DT[,c("foo","bar"):=1L,with=FALSE] - DT[,c("foo","bar"):=list(1L,2L),with=FALSE] - - * := now recycles vectors of non divisible length, with - a warning (previously an error). - - * When setkey coerces a numeric or character column, it - no longer makes a copy of the whole table, FR#1744. Thanks - to an investigation by DM. - - * New function setkeyv(DT,v) (v stands for vector) replaces - key(DT)<-v syntax. Also added setattr(). See ?copy. - - * merge() now uses (manual) secondary keys, for speed. - - -#### USER VISIBLE CHANGES - - * The loc argument of setkey has been removed. This wasn't very - useful and didn't warrant a period of deprecation. - - * datatable.alloccol has been removed. That warning is now - controlled by datatable.verbose=TRUE. One option is easer. - - * If i is a keyed data.table, it is no longer an error if its - key is longer than x's key; the first length(key(x)) columns - of i's key are used to join. - - -### Changes in v1.7.7 - -#### BUG FIXES - - * Previous bug fix for random crash in R <= 2.13.2 - related to truelength and over-allocation didn't - work, 3rd attempt. Thanks to Chris Neff for his - patience and testing. This has shown up consistently - as error status on CRAN old-rel checks (windows and - mac). So if they pass, this issue is fixed. - - -### Changes in v1.7.6 - -#### NEW FEATURES - - * An empty list column can now be added with :=, and - data.table() accepts empty list(). - DT[,newcol:=list()] - data.table(a=1:3,b=list()) - Empty list columns contain NULL for all rows. - -#### BUG FIXES - - * Adding a column to a data.table loaded from disk could - result in a memory corruption in R <= 2.13.2, revealed - and thanks to CRAN checks on windows old-rel. - - * Adding a factor column with a RHS to be recycled no longer - loses its factor attribute, #1691. Thanks to Damian - Betebenner for reporting. - - -### Changes in v1.7.5 - -#### BUG FIXES - - * merge()-ing a data.table where its key is not the first - few columns in order now works correctly and without - warning, fixing #1645. Thanks to Timothee Carayol for - reporting. - - * Mixing nomatch=0 and mult="last" (or "first") now works, - #1661. Thanks to Johann Hibschman for reporting. - - * Join Inherited Scope now respects nomatch=0, #1663. Thanks - to Johann Hibschman for reporting. - - * by= could generate a keyed result table with invalid key; - e.g., when by= expressions return NA, #1631. Thanks to - Muhammad Waliji for reporting. - - * Adding a column to a data.table loaded from disk resulted - in an error that truelength(DT)= length() other than just after a table - has been loaded from disk. - - * New option 'datatable.nomatch' allows the default for nomatch - to be changed from NA to 0, as wished for by Branson Owen. - - * cbind(DT,...) now retains DT's key, as wished for by Chris Neff - and partly implementing FR#295. - -#### BUG FIXES - - * Assignment to factor columns (using :=, [<- or $<-) could cause - 'variable not found' errors and a segfault in some circumstances - due to a new feature in v1.7.0: "Factor columns on LHS of :=, [<- - and $<- can now be assigned new levels", fixing #1664. Thanks to - Daniele Signori for reporting. - - * DT[i,j]<-value no longer crashes when j is a factor column and value - is numeric, fixing #1656. - - * An unnecessarily strict machine tolerance test failed CRAN checks - on Mac preventing v1.7.2 availability for Mac (only). - -#### USER VISIBLE CHANGES - - * := now has its own help page in addition to the examples in ?data.table, - see help(":="). - - * The error message from X[Y] when X is unkeyed has been lengthened to - including advice to call setkey first and see ?setkey. Thanks to a - comment by ilprincipe on Stack Overflow. - - * Deleting a missing column is now a warning rather than error. Thanks - to Chris Neff for suggesting, #1642. - - -### Changes in v1.7.2 - -#### NEW FEATURES - - * unique and duplicated methods now work on unkeyed tables (comparing - all columns in that case) and both now respect machine tolerance for - double precision columns, implementing FR#1626 and fixing bug #1632. - Their help page has been updated accordingly with detailed examples. - Thanks to questions by Iterator and comments by Allan Engelhardt on - Stack Overflow. - - * A new method as.data.table.list has been added, since passing a (pure) - list to data.table() now creates a single list column. - - -#### BUG FIXES - - * Assigning to a column variable using <- or = in j now - works (creating a local copy within j), rather than - persisting from group to group and sometimes causing a crash. - Non column variables still persist from group to group; e.g., - a group counter. This fixes the remainder of #1624 thanks to - Steve Lianoglou for reporting. - - * A crash bug is fixed when j returns a (strictly) NULL column next - to a non-empty column, #1633. This case was anticipated and coded - for but an errant LENGTH() should have been length(). Thanks - to Dennis Murphy for reporting. - - * The first column of data.table() can now be a list column, fixing - #1640. Thanks to Stavros Macrakis for reporting. - - -### Changes in v1.7.1 - -#### BUG FIXES - - * .SD is now locked, partially fixing #1624. It was never - the intention to allow assignment to .SD. Take a 'copy(.SD)' - first if needed. Now documented in ?data.table and new FAQ 4.5 - including example. Thanks to Steve Lianoglou for reporting. - - * := now works with a logical i subset; e.g., - DT[x==1,y:=x] - Thanks to Muhammad Waliji for reporting. - -#### USER VISIBLE CHANGES - - * Error message "column of i is not internally type integer" - is now more helpful adding "i doesn't need to be keyed, just - convert the (likely) character column to factor". Thanks to - Christoph_J for his SO question. - - -### Changes in v1.7.0 - -#### NEW FEATURES - - * data.table() now accepts list columns directly rather than - needing to add list columns to an existing data.table; e.g., - - DT = data.table(x=1:3,y=list(4:6,3.14,matrix(1:12,3))) - - Thanks to Branson Owen for reminding. As before, list columns - can be created via grouping; e.g., - - DT = data.table(x=c(1,1,2,2,2,3,3),y=1:7) - DT2 = DT[,list(list(unique(y))),by=x] - DT2 - x V1 - [1,] 1 1, 2 - [2,] 2 3, 4, 5 - [3,] 3 6, 7 - - and list columns can be grouped; e.g., - - DT2[,sum(unlist(V1)),by=list(x%%2)] - x V1 - [1,] 1 16 - [2,] 0 12 - - Accordingly, one item has been added to FAQ 2.17 (differences - between data.frame and data.table): data.frame(list(1:2,"k",1:4)) - creates 3 columns, data.table creates one list column. - - * subset, transform and within now retain keys when the expression - does not 'touch' key columns, implemeting FR #1341. - - * Recycling list() items on RHS of := now works; e.g., - - DT[,1:4:=list(1L,NULL),with=FALSE] - # set columns 1 and 3 to 1L and remove columns 2 and 4 - - * Factor columns on LHS of :=, [<- and $<- can now be assigned - new levels; e.g., - - DT = data.table(A=c("a","b")) - DT[2,"A"] <- "c" # adds new level automatically - DT[2,A:="c"] # same (faster) - DT$A = "newlevel" # adds new level and recycles it - - Thanks to Damian Betebenner and Chris Neff for highlighting. - To change the type of a column, provide a full length RHS (i.e. - 'replace' the column). - -#### BUG FIXES - - * := with i all FALSE no longer sets the whole column, fixing - bug #1570. Thanks to Chris Neff for reporting. - - * 0 length by (such as NULL and character(0)) now behave as - if by is missing, fixing bug #1599. This is useful when by - is dynamic and a 'dont group' needs to be represented. - Thanks to Chris Neff for reporting. - - * NULL j no longer results in 'inconsistent types' error, but - instead returns no rows for that group, fixing bug #1576. - - * matrix i is now an error rather than using i as if it were a - vector and obtaining incorrect results. It was undocumented that - matrix might have been an acceptable type. matrix i is - still acceptable in [<-; e.g., - DT[is.na(DT)] <- 1L - and this now works rather than assigning to non-NA items in some - cases. - - * Inconsistent [<- behaviour is now fixed (#1593) so these examples - now work : - DT[x == "a", ]$y <- 0L - DT["a", ]$y <- 0L - But, := is highly encouraged instead for speed; i.e., - DT[x == "a", y:=0L] - DT["a", y:=0L] - Thanks to Leon Baum for reporting. - - * unique on an unsorted table now works, fixing bug #1601. - Thanks to a question by Iterator on Stack Overflow. - - * Bug fix #1534 in v1.6.5 (see NEWS below) only worked if data.table - was higher than IRanges on the search() path, despite the item in - NEWS stating otherwise. Fixed. - - * Compatibility with package sqldf (which can call do.call("rbind",...) - on an empty "...") is fixed and test added. data.table was switching - on list(...)[[1]] rather than ..1. Thanks to RYogi for reporting #1623. - -#### USER VISIBLE CHANGES - - * cbind and rbind are no longer masked. But, please do read FAQ 2.23, - 4.4 and 5.1. - - -### Changes in v1.6.6 - -#### BUG FIXES - - * Tests using .Call("Rf_setAttrib",...) passed CRAN acceptance - checks but failed on many (but not all) platforms. Fixed. - Thanks to Prof Brian Ripley for investigating the issue. - -### Changes in v1.6.5 - -#### NEW FEATURES - - * The LHS of := may now be column names or positions - when with=FALSE; e.g., - - DT[,c("d","e"):=NULL,with=FALSE] - DT[,4:5:=NULL,with=FALSE] - newcolname="myname" - DT[,newcolname:=3.14,with=FALSE] - - This implements FR#1499 'Ability to efficiently remove a - vector of column names' by Timothee Carayol in addition to - creating and assigning to multiple columns. We still plan - to allow multiple := without needing with=FALSE, in future. - - * setkey(DT,...) now returns DT (invisibly) rather than NULL. - This is to allow compound statements; e.g., - setkey(DT,x)["a"] - - * setkey (and key<-) are now more efficient when the data happens - to be already sorted by the key columns; e.g., when data is - loaded from ordered files. - - * If DT is already keyed by the columns passed to setkey (or - key<-), the key is now rebuilt and checked rather than skipping - for efficiency. This is to save needing to know to drop the key - first to rebuild an invalid key. Invalid keys can arise by going - 'under the hood'; e.g., attr(DT,"sorted")="z", or somehow ending - up with unordered factor levels. A warning is issued so the root - cause can be fixed. Thanks to Timothee Carayol for highlighting. - - * A new copy() function has been added, FR#1501. This copies a - data.table (retaining its key, if any) and should now be used to - copy rather than data.table(). Reminder: data.tables are not - copied on write by setkey, key<- or :=. - - -#### BUG FIXES - - * DT[,z:=a/b] and DT[a>3,z:=a/b] work again, where a and - b are columns of DT. Thanks to Chris Neff for reporting, - and his patience. - - * Numeric columns with class attributes are now correctly - coerced to integer by setkey and ad hoc by. The error - similar to 'fractional data cannot be truncated' should now - only occur when that really is true. A side effect of - this is that ad hoc by and setkey now work on IDate columns - which have somehow become numeric; e.g., via rbind(DF,DF) - as reported by Chris Neff. - - * .N is now 0 (rather than 1) when no rows in x match the - row in i, fixing bug #1532. Thanks to Yang Zhang for - reporting. - - * Compatibility with package IRanges has been restored. Both - data.table and IRanges mask cbind and rbind. When data.table's - cbind is found first (if it is loaded after IRanges) and the - first argument is not data.table, it now delegates to the next - package on the search path (and above that), one or more of which - may also mask cbind (such as IRanges), rather than skipping - straight to base::cbind. So, it no longer matters which way around - data.table and IRanges are loaded, fixing #1534. Thanks to Steve - Lianoglou for reporting. - - -#### USER VISIBLE CHANGES - - * setkey's verbose messages expanded. - - -### Changes in v1.6.4 - -#### NEW FEATURES - - * DT[colA>3,which=TRUE] now returns row numbers rather - than a logical vector, for consistency. - -#### BUG FIXES - - * Changing a keyed column name now updates the key, too, - so an invalid key no longer arises, fixing #1495. - Thanks to Chris Neff for reporting. - - * := already warned when a numeric RHS is coerced to - match an integer column's type. Now it also warns when - numeric is coerced to logical, and integer is coerced - to logical, fixing #1500. Thanks to Chris Neff for - reporting. - - * The result of DT[,newcol:=3.14] now includes the new - column correctly, as well as changing DT by reference, - fixing #1496. Thanks to Chris Neff for reporting. - - * :=NULL to remove a column (instantly, regardless of table - size) now works rather than causing a segfault in some - circumstances, fixing #1497. Thanks to Timothee Carayol - for reporting. - - * Previous within() and transform() behaviour restored; e.g., - can handle multiple columns again. Thanks to Timothee Carayol - for reporting. - - * cbind(DT,DF) now works, as does rbind(DT,DF), fixing #1512. - Thanks to Chris Neff for reporting. This was tricky to fix due - to nuances of the .Internal dispatch code in cbind and rbind, - preventing S3 methods from working in all cases. - R will now warn that cbind and rbind have been masked when - the data.table package is loaded. These revert to base::cbind - and base::rbind when the first argument is not data.table. - - * Removing multiple columns now works (again) using - DT[,c("a","b")]=NULL, or within(DT,rm(a,b)), fixing #1510. - Thanks to Timothee Carayol for reporting. - - -#### NOTES - - * The package uses two features (packageVersion() and \href in Rd) - added to R 2.12.0 and is therefore dependent on that release. - A 'spurious warning' when checking a package using \href was - fixed in R 2.12.2 patched but we believe that warning can safely - be ignored in versions >= 2.12.0 and < 2.12.2 patched. - - -### Changes in v1.6.3 - -#### NEW FEATURES - - * Ad hoc grouping now returns results in the same order each - group first appears in the table, rather than sorting the - groups. Thanks to Steve Lianoglou for highlighting. The order - of the rows within each group always has and always will be - preserved. For larger datasets a 'keyed by' is still faster; - e.g., by=key(DT). - - * The 'key' argument of data.table() now accepts a vector of - column names in addition to a single comma separated string - of column names, for consistency. Thanks to Steve Lianoglou - for highlighting. - - * A new argument '.SDcols' has been added to [.data.table. This - may be character column names or numeric positions and - specifies the columns of x included in .SD. This is useful - for speed when applying a function through a subset of - (possibly very many) columns; e.g., - DT[,lapply(.SD,sum),by="x,y",.SDcols=301:350] - - * as(character, "IDate") and as(character, "ITime") coercion - functions have been added. Enables the user to declaring colClasses - as "IDate" and "ITime" in the various read.table (and sister) - functions. Thanks to Chris Neff for the suggestion. - - * DT[i,j]<-value is now handled by data.table in C rather - than falling through to data.frame methods, FR#200. Thanks to - Ivo Welch for raising speed issues on r-devel, to Simon Urbanek - for the suggestion, and Luke Tierney and Simon for information - on R internals. - - [<- syntax still incurs one working copy of the whole - table (as of R 2.13.1) due to R's [<- dispatch mechanism - copying to `*tmp*`, so, for ultimate speed and brevity, - the operator := may now be used in j as follows. - - * := is now available to j and means assign to the column by - reference; e.g., - - DT[i,colname:=value] - - This syntax makes no copies of any part of memory at all. - - m = matrix(1,nrow=100000,ncol=100) - DF = as.data.frame(m) - DT = as.data.table(m) - - system.time(for (i in 1:1000) DF[i,1] <- i) - user system elapsed - 287.062 302.627 591.984 - - system.time(for (i in 1:1000) DT[i,V1:=i]) - user system elapsed - 1.148 0.000 1.158 ( 511 times faster ) - - := in j can be combined with all types of i, such as binary - search, and used to add and remove columns efficiently. - Fast assigning within groups will be implemented in future. - - Reminder that data.frame and data.table both allow columns - of mixed types, including columns which themselves may be - type list; matrix may be one (atomic) type only. - - *Please note*, := is new and experimental. - - -#### BUG FIXES - - * merge()ing two data.table's with user-defined `suffixes` - was getting tripped up when column names in x ended in - '.1'. This resulted in the `suffixes` parameter being - ignored. - - * Mistakenly wrapping a j expression inside quotes; e.g., - DT[,list("sum(a),sum(b)"),by=grp] - was appearing to work, but with wrong column names. This - now returns a character column (the quotes should not - be used). Thanks to Joseph Voelkel for reporting. - - * setkey has been made robust in several ways to fix issues - introduced in 1.6.2: #1465 ('R crashes after setkey') - reported by Eugene Tyurin and similar bug #1387 ('paste() - by group to create long comma separated strings can crash') - reported by Nicolas Servant and Jean-Francois Rami. This - bug was not reproducible so we are especially grateful for - the patience of these people in helping us find, fix and - test it. - - * Combining a join, j and by together in one query now works - rather than giving an error, fixing bug #1468. Discovered - indirectly thanks to a post from Jelmer Ypma. - - * Invalid keys no longer arise when a non-data.table-aware - package reorders the data; e.g., - setkey(DT,x,y) - plyr::arrange(DT,y) # same as DT[order(y)] - This now drops the key to avoid incorrect results being - returned the next time the invalid key is joined to. Thanks - to Chris Neff for reporting. - - -#### USER-VISIBLE CHANGES - - * The startup banner has been shortened to one line. - - * data.table does not support POSIXlt. Almost unbelievably - POSIXlt uses 40 bytes to store a single datetime. If it worked - before, that was unintentional. Please see ?IDateTime, or any - other date class that uses a single atomic vector. This is - regardless of whether the POSIXlt is a key column, or not. This - resolves bug #1481 by documenting non support in ?data.table. - - -#### DEPRECATED & DEFUNCT - - * Use of the DT() alias in j is no longer caught for backwards - compatibility and is now fully removed. As warned in NEWS - for v1.5.3, v1.4, and FAQs 2.6 and 2.7. - - -### Changes in v1.6.2 - -#### NEW FEATURES - - * setkey no longer copies the whole table and should be - faster for large tables. Each column is reordered by reference - (in C) using one column of working memory, FR#1006. User - defined attributes on the original table are now also - retained (thanks to Thell Fowler for reporting). - - * A new symbol .N is now available to j, containing the - number of rows in the group. This may be useful when - the column names are not known in advance, for - convenience generally, and for efficiency. - - -### Changes in v1.6.1 - -#### NEW FEATURES - - * j's environment is now consistently reused so - that local variables may be set which persist - from group to group; e.g., incrementing a group - counter : - DT[,list(z,groupInd<-groupInd+1),by=x] - Thanks to Andreas Borg for reporting. - - * A new symbol .BY is now available to j, containing 1 row - of the current 'by' variables, type list. 'by' variables - may also be used by name, and are now length 1 too. This - implements FR#1313. FAQ 2.10 has been updated accordingly. - Some examples : - DT[,sum(x)*.BY[[1]],by=eval(byexp)] - DT[,sum(x)*mylookuptable[J(y),z],by=y] - DT[,list(sum(unlist(.BY)),sum(z)),by=list(x,y%%2)] - - * i may now be type list, and works the same as when i - is type data.table. This saves needing J() in as many - situations and may be a little more efficient. One - application is using .BY directly in j to join to a - relatively small lookup table, once per group, for space - and time efficiency. For example : - DT[,list(GROUPDATA[.BY]$name,sum(v)),by=grp] - - -#### BUG FIXES - - * A 'by' character vector of column names now - works when there are less rows than columns; e.g., - DT[,sum(x),by=key(DT)] where nrow(DT)==1. - Many thanks to Andreas Borg for report, proposed - fix and tests. - - * Zero length columns in j no longer cause a crash in - some circumstances. Empty columns are filled with NA - to match the length of the longest column in j. - Thanks to Johann Hibschman for bug report #1431. - - * unique.data.table now calls the same internal code - (in C) that grouping calls. This fixes a bug when - unique is called directly by user, and, NA exist - in the key (which might be quite rare). Thanks to - Damian Betebenner for bug report. unique should also - now be faster. - - * Variables in calling scope can now be used in j when - i is logical or integer, fixing bug #1421. Thanks - to Alexander Peterhansl for reporting. - - -#### USER-VISIBLE CHANGES - - * ?data.table now documents that logical i is not quite - the same as i in [.data.frame. NA are treated as FALSE, - and DT[NA] returns 1 row of NA, unlike [.data.frame. - Three points have been added to FAQ 2.17. Thanks to - Johann Hibschman for highlighting. - - * Startup banner now uses packageStartupMessage() so the - banner can be suppressed by those annoyed by banners, - whilst still being helpful to new users. - - - -### Changes in v1.6 - -#### NEW FEATURES - - * data.table now plays nicely with S4 classes. Slots can be - defined to be S4 objects, S4 classes can inherit from data.table, - and S4 function dispatch works on data.table objects. See the - tests in inst/tests/test-S4.R, and from the R prompt: - ?"data.table-class" - - * merge.data.table now works more like merge.data.frame: - (i) suffixes are consistent with merge.data.frame; existing users - may set options(datatable.pre.suffixes=TRUE) for backwards - compatibility. - (ii) support for 'by' argument added (FR #1315). - However, X[Y] syntax is preferred; some users never use merge. - - -#### BUG FIXES - - * by=key(DT) now works when the number of rows is not - divisible by the number of groups (#1298, an odd bug). - Thanks to Steve Lianoglou for reporting. - - * Combining i and by where i is logical or integer subset now - works, fixing bug #1294. Thanks to Johann Hibschman for - contributing a new test. - - * Variable scope inside [[...]] now works without a workaround - required. This can be useful for looking up which function - to call based on the data e.g. DT[,fns[[fn]](colA),by=ID]. - Thanks to Damian Betebenner for reporting. - - * Column names in self joins such as DT[DT] are no longer - duplicated, fixing bug #1340. Thanks to Andreas Borg for - reporting. - - -#### USER-VISIBLE CHANGES - - * Additions and updates to FAQ vignette. Thanks to Dennis - Murphy for his thorough proof reading. - - * Welcome to Steve Lianoglou who joins the project - contributing S4-ization, testing using testthat, and more. - - * IDateTime is now linked from ?data.table. data.table users - unaware of IDateTime, please do take a look. Tom added - IDateTime in v1.5 (see below). - - -### Changes in v1.5.3 - -#### NEW FEATURES - - * .SD no longer includes 'by' columns, FR#978. This resolves - the long standing annoyance of duplicated 'by' columns - when the j expression returns a subset of rows from .SD. - For example, the following query no longer contains - a redundant 'colA.1' duplicate. - DT[,.SD[2],by=colA] # 2nd row of each group - Any existing code that uses .SD may require simple - changes to remove workarounds. - - * 'by' may now be a character vector of column names. - This allows syntax such as DT[,sum(x),by=key(DT)]. - - * X[Y] now includes Y's non-join columns, as most users - naturally expect, FR#746. Please do use j in one step - (i.e. X[Y,j]) since that merges just the columns j uses and - is much more efficient than X[Y][,j] or merge(X,Y)[,j]. - - * The 'Join Inherited Scope' feature is back on, FR#1095. This - is consistent with X[Y] including Y's non-join columns, enabling - natural progression from X[Y] to X[Y,j]. j sees columns in X - first then Y. - If the same column name exists in both X and Y, the data in - Y can be accessed via a prefix "i." (not yet implemented). - - * Ad hoc by now coerces double to integer (provided they are - all.equal) and character to factor, FR#1051, as setkey - already does. - -#### USER-VISIBLE CHANGES - - * The default for mult is now "all", as planned and - prior notice given in FAQ 2.2. - - * ?[.data.table has been merged into ?data.table and updated, - simplified, corrected and formatted. - -#### DEPRECATED & DEFUNCT - - * The DT() alias is now fully deprecated, as warned - in NEWS for v1.4, and FAQs 2.6 and 2.7. - - -### Changes in v1.5.2 - -#### NEW FEATURES - - * 'by' now works when DT contains list() columns i.e. - where each value in a column may itself be vector - or where each value is a different type. FR#1092. - - * The result from merge() is now keyed. FR#1244. - - -#### BUG FIXES - - * eval of parse()-ed expressions now works without - needing quote() in the expression, bug #1243. Thanks - to Joseph Voelkel for reporting. - - * the result from the first group alone may be bigger - than the table itself, bug #1245. Thanks to - Steve Lianoglou for reporting. - - * merge on a data.table with a single key'd column only - and all=TRUE now works, bug #1241. Thanks to - Joseph Voelkel for reporting. - - * merge()-ing by a column called "x" now works, bug - #1229 related to variable scope. Thanks to Steve - Lianoglou for reporting. - - -### Changes in v1.5.1 - -#### BUG FIXES - - * Fixed inheritance for other packages importing or depending - on data.table, bugs #1093 and #1132. Thanks to Koert Kuipers - for reporting. - - * data.table queries can now be used at the debugger() prompt, - fixing bug #1131 related to inheritance from data.frame. - - -### Changes in v1.5 - -#### NEW FEATURES - - * data.table now *inherits* from data.frame, for functions and - packages which _only_ accept data.frame, saving time and - memory of conversion. A data.table is a data.frame too; - is.data.frame() now returns TRUE. - - * Integer-based date and time-of-day classes have been - introduced. This allows dates and times to be used as keys - more easily. See as.IDate, as.ITime, and IDateTime. - Conversions to and from POSIXct, Date, and chron are - supported. - - * [<-.data.table and $<-.data.table were revised to check for - changes to the key-ed columns. [<-.data.table also now allows - data.table-style indexing for i. Both of these changes may - introduce incompatibilities for existing code. - - * Logical columns are now allowed in keys and in 'by', as are expressions - that evaluate to logical. Thanks to David Winsemius for highlighting. - - -#### BUG FIXES - - * DT[,5] now returns 5 as FAQ 1.1 says, for consistency - with DT[,c(5)] and DT[,5+0]. DT[,"region"] now returns - "region" as FAQ 1.2 says. Thanks to Harish V for reporting. - - * When a quote()-ed expression q is passed to 'by' using - by=eval(q), the group column names now come from the list - in the expression rather than the name 'q' (bug #974) and, - multiple items work (bug #975). Thanks to Harish V for - reporting. - - * quote()-ed i and j expressions receive similar fixes, bugs - #977 and #1058. Thanks to Harish V and Branson Owen for - reporting. - - * Multiple errors (grammar, format and spelling) in intro.Rnw - and faqs.Rnw corrected by Dennis Murphy. Thank you. - - * Memory is now reallocated in rare cases when the up front - allocate for the result of grouping is insufficient. Bug - #952 raised by Georg V, and also reported by Harish. Thank - you. - - * A function call foo(arg=sum(b)) now finds b in DT when foo - contains DT[,eval(substitute(arg)),by=a], fixing bug #1026. - Thanks to Harish V for reporting. - - * If DT contains column 'a' then DT[J(unique(a))] now finds - 'a', fixing bug #1005. Thanks to Branson Owen for reporting. - - * 'by' on no data (for example when 'i' returns no rows) now - works, fixing bug #709. - - * 'by without by' now heeds nomatch=NA, fixing bug #1015. - Thanks to Harish V for reporting. - - * DT[NA] now returns 1 row of NA rather than the whole table - via standard NA logical recycling. A single NA logical is - a special case and is now replaced by NA_integer_. Thanks - to Branson Owen for highlighting the issue. - - * NROW removed from data.table, since the is.data.frame() in - base::NROW now returns TRUE due to inheritance. Fixes bug - #1039 reported by Bradley Buchsbaum. Thank you. - - * setkey() now coerces character to factor and double to - integer (provided they are all.equal), fixing bug #953. - Thanks to Steve Lianoglou for reporting. - - * 'by' now accepts lists from the calling scope without the - work around of wrapping with as.list() or {}, fixing bug - #1060. Thanks to Johann Hibschman for reporting. - - -#### NOTES - - * The package uses the 'default' option of base::getOption, - and is therefore dependent on R 2.10.0. Updated DESCRIPTION - file accordingly. Thanks to Christian Hudon for reporting. - - -### Changes in v1.4.1 - - -#### NEW FEATURES - - * Vignettes tidied up. - - -#### BUG FIXES - - * Out of order levels in key columns are now sorted by - setkey. Thanks to Steve Lianoglou for reporting. - - - - -### Changes in v1.4 - - -#### NEW FEATURES - - * 'by' faster. Memory is allocated first for the result, then - populated directly by the result of j for each group. Can be 10 - or more times faster than tapply() and aggregate(), see - timings vignette. - - * j should now be a list(), not DT(), of expressions. Use of - j=DT(...) is caught internally and replaced with j=list(...). - - * 'by' may be a list() of expressions. A single column name - is automatically list()-ed for convenience. 'by' may still be - a comma separated character string, as before. - DT[,sum(x),by=region] # new - DT[,sum(x),by=list(region,month(date))] # new - DT[,sum(x),by="region"] # old, ok too - DT[,sum(x),by="region,month(date)"] # old, ok too - - * key() and key<- added. More R-style alternatives to getkey() - and setkey(). - - * haskey() added. Returns TRUE if a table has a key. - - * radix sorting is now column by column where possible, was - previously all or nothing. Helps with keys of many columns. - - * Added format method. - - * 22 tests added to test.data.table(), now 149. - - * Three vignettes added : FAQ, Intro & Timings - - -#### DEPRECATED & DEFUNCT - - * The DT alias is removed. Use 'data.table' instead to create - objects. See 2nd new feature above. - - * RUnit framework removed. - test.data.table() is called from examples in .Rd so 'R CMD check' - will run it. Simpler. An eval(body(test.data.table)) - is also in the .Rd, to catch namespace issues. - - * Dependency on package 'ref' removed. - - * Arguments removed: simplify, incbycols and byretn. - Grouping is simpler now, these are superfluous. - - -#### BUG FIXES - - * Column classes are now retained by subset and grouping. - - * tail no longer fails when a column 'x' exists. - - -#### KNOWN PROBLEMS - - * Minor : Join Inherited Scope not working, contrary - to the documentation. - - -#### NOTES - - * v1.4 was essentially the branch at rev 44, reintegrated - at rev 78. - - - - -### Changes in v1.3 - - -#### NEW FEATURES - - * Radix sorting added. Speeds up setkey and add-hoc 'by' - by factor of 10 or more. - - * Merge method added, much faster than base::merge method - of data.frame. - - * 'by' faster. Logic moved from R into C. Memory is - allocated for the largest group only, then re-used. - - * The Sub Data is accessible as a whole by j using object - .SD. This should only be used in rare circumstances. See FAQ. - - * Methods added : duplicated, unique, transform, within, - [<-, t, Math, Ops, is.na, na.omit, summary - - * Column name rules improved e.g. dots now allowed. - - * as.data.frame.data.table rownames improved. - - * 29 tests added to test.data.table(), now 127. - - -#### USER-VISIBLE CHANGES - - * Default of mb changed, now tables(mb=TRUE) - - -#### DEPRECATED & DEFUNCT - - * ... removed in [.data.table. - j may not be a function, so this is now superfluous. - - -#### BUG FIXES - - * Incorrect version warning with R 2.10+ fixed. - - * j enclosure raised one level. This fixes some bugs - where the j expression previously saw internal variable - names. It also speeds up grouping a little. - - -#### NOTES - - * v1.3 was not released to CRAN. R-Forge repository only. - - - -### v1.2 released to CRAN in Aug 2008 - - diff --git a/NEWS.md b/NEWS.md deleted file mode 100644 index 5934505499..0000000000 --- a/NEWS.md +++ /dev/null @@ -1,352 +0,0 @@ - -**If you are viewing this file on CRAN, please check latest news on GitHub [here](https://github.com/Rdatatable/data.table/blob/master/NEWS.md).** - -### Changes in v1.10.5 ( in development ) - -#### NOTICE OF INTENDED FUTURE POTENTIAL BREAKING CHANGES - -1. `fread()`'s `na.strings=` argument : - ```R - "NA" # old default - getOption("datatable.na.strings", "NA") # this release; i.e. the same; no change yet - getOption("datatable.na.strings", "") # future release - ``` - This option controls how `,,` is read in character columns. It does not affect numeric columns which read `,,` as `NA` regardless. We would like `,,`=>`NA` for consistency with numeric types, and `,"",`=>empty string to be the standard default for `fwrite/fread` character columns so that `fread(fwrite(DT))==DT` without needing any change to any parameters. `fwrite` has never written `NA` as `"NA"` in case `"NA"` is a valid string in the data; e.g., 2 character id columns sometimes do. Instead, `fwrite` has always written `,,` by default for an `` in a character columns. The use of R's `getOption()` allows users to move forward now, using `options(datatable.fread.na.strings="")`, or restore old behaviour when the default's default is changed in future, using `options(datatable.fread.na.strings="NA")`. - -2. `fread()` and `fwrite()`'s `logical01=` argument : - ```R - logical01 = FALSE # old default - getOption("datatable.logical01", FALSE) # this release; i.e. the same; no change yet - getOption("datatable.logical01", TRUE) # future release - ``` - This option controls whether a column of all 0's and 1's is read as `integer`, or `logical` directly to avoid needing to change the type afterwards to `logical` or use `colClasses`. `0/1` is smaller and faster than `"TRUE"/"FALSE"`, which can make a significant difference to space and time the more `logical` columns there are. When the default's default changes to `TRUE` for `fread` we do not expect much impact since all arithmetic operators that are currently receiving 0's and 1's as type `integer` (think `sum()`) but instead could receive `logical`, would return exactly the same result on the 0's and 1's as `logical` type. However, code that is manipulating column types using `is.integer` or `is.logical` on `fread`'s result, could require change. It could be painful if `DT[(logical_column)]` (i.e. `DT[logical_column==TRUE]`) changed behaviour due to `logical_column` no longer being type `logical` but `integer`. But that is not the change proposed. The change is the other way around; i.e., a previously `integer` column holding only 0's and 1's would now be type `logical`. Since it's that way around, we believe the scope for breakage is limited. We think a lot of code is converting 0/1 integer columns to logical anyway, either using `colClasses=` or afterwards with an assign. For `fwrite`, the level of breakage depends on the consumer of the output file. We believe `0/1` is a better more standard default choice to move to. See notes below about improvements to `fread`'s sampling for type guessing, and automatic rereading in the rare cases of out-of-sample type surprises. - -These options are meant for temporary use to aid your migration, [#2652](https://github.com/Rdatatable/data.table/pull/2652). You are not meant to set them to the old default and then not migrate your code that is dependent on the default. Either set the argument explicitly so your code is not dependent on the default, or change the code to cope with the new default. Over the next few years we will slowly start to remove these options, warning you if you are using them, and return to a simple default. See the history of NEWS and NEWS.0 for past migrations that have, generally speaking, been successfully managed in this way. For example, at the end of NOTES for this version (below in this file) is a note about the usage of `datatable.old.unique.by.key` now warning, as you were warned it would do over a year ago. When that change was introduced, the default was changed and that option provided an option to restore the old behaviour. These `fread`/`fwrite` changes are even more cautious and not even changing the default's default yet. Giving you extra warning by way of this notice to move forward. And giving you a chance to object. - -#### NEW FEATURES - -1. `fread()`: - * Efficiency savings at C level including **parallelization** announced [here](https://github.com/Rdatatable/data.table/wiki/talks/BARUG_201704_ParallelFread.pdf); e.g. a 9GB 2 column integer csv input is **50s down to 12s** to cold load on a 4 core laptop with 16GB RAM and SSD. Run `echo 3 >/proc/sys/vm/drop_caches` first to measure cold load time. Subsequent load time (after file has been cached by OS on the first run) **40s down to 6s**. - * The [fread for small data](https://github.com/Rdatatable/data.table/wiki/Convenience-features-of-fread) page has been revised. - * Memory maps lazily; e.g. reading just the first 10 rows with `nrow=10` is **12s down to 0.01s** from cold for the 9GB file. Large files close to your RAM limit may work more reliably too. The progress meter will commence sooner and more consistently. - * `fread` has always jumped to the middle and to the end of the file for a much improved column type guess. The sample size is increased from 100 rows at 10 jump jump points (1,000 rows) to 100 rows at 100 jumps points (10,000 row sample). In the rare case of there still being out-of-sample type exceptions, those columns are now *automatically reread* so you don't have to use `colClasses` yourself. - * Large number of columns support; e.g. **12,000 columns** tested. - * **Quoting rules** are more robust and flexible. See point 10 on the wiki page [here](https://github.com/Rdatatable/data.table/wiki/Convenience-features-of-fread#10-automatic-quote-escape-method-detection-including-no-escape). - * Numeric data that has been quoted is now detected and read as numeric. - * The ability to position `autostart` anywhere inside one of multiple tables in a single file is removed with warning. It used to search upwards from that line to find the start of the table based on a consistent number of columns. People appear to be using `skip="string"` or `skip=nrow` to find the header row exactly, which is retained and simpler. It was too difficult to retain search-upwards-autostart together with skipping/filling blank lines, filling incomplete rows and parallelization too. If there is any header info above the column names, it is still auto detected and auto skipped (particularly useful when loading a set of files where the column names start on different lines due to a varying height messy header). - * `dec=','` is now implemented directly so there is no dependency on locale. The options `datatable.fread.dec.experiment` and `datatable.fread.dec.locale` have been removed. - * `\\r\\r\\n` line endings are now handled such as produced by `base::download.file()` when it doubles up `\\r`. Other rare line endings (`\\r` and `\\n\\r`) are now more robust. - * Mixed line endings are now handled; e.g. a file formed by concatenating a Unix file and a Windows file so that some lines end with `\\n` while others end with `\\r\\n`. - * Improved automatic detection of whether the first row is column names by comparing the types of the fields on the first row against the column types ascertained by the 10,000 rows sample (or `colClasses` if provided). If a numeric column has a string value at the top, then column names are deemed present. - * Detects GB-18030 and UTF-16 encodings and in verbose mode prints a message about BOM detection. - * Detects and ignores trailing ^Z end-of-file control character sometimes created on MS DOS/Windows, [#1612](https://github.com/Rdatatable/data.table/issues/1612). Thanks to Gergely Daróczi for reporting and providing a file. - * Added ability to recognize and parse hexadecimal floating point numbers, as used for example in Java. Thanks for @scottstanfield [#2316](https://github.com/Rdatatable/data.table/issues/2316) for the report. - * Now handles floating-point NaN values in a wide variety of formats, including `NaN`, `sNaN`, `1.#QNAN`, `NaN1234`, `#NUM!` and others, [#1800](https://github.com/Rdatatable/data.table/issues/1800). Thanks to Jori Liesenborgs for highlighting and the PR. - * If negative numbers are passed to `select=` the out-of-range error now suggests `drop=` instead, [#2423](https://github.com/Rdatatable/data.table/issues/2423). Thanks to Michael Chirico for the suggestion. - * `sep=NULL` or `sep=""` (i.e., no column separator) can now be used to specify single column input reliably like `base::readLines`, [#1616](https://github.com/Rdatatable/data.table/issues/1616). `sep='\\n'` still works (even on Windows where line ending is actually `\\r\\n`) but `NULL` or `""` are now documented and recommended. Thanks to Dmitriy Selivanov for the pull request and many others for comments. As before, `sep=NA` is not valid; use the default `"auto"` for automatic separator detection. `sep='\\n'` is now deprecated and in future will start to warn when used. - * Single-column input with blank lines is now valid and the blank lines are significant (representing `NA`). The blank lines are significant even at the very end, which may be surprising on first glance. The change is so that `fread(fwrite(DT))==DT` for single-column inputs containing `NA` which are written as blank. There is no change when `ncol>1`; i.e., input stops with detailed warning at the first blank line, because a blank line when `ncol>1` is invalid input due to no separators being present. Thanks to @skanskan, Michael Chirico, @franknarf1 and Pasha for the testing and discussions, [#2106](https://github.com/Rdatatable/data.table/issues/2106). - * Too few column names are now auto filled with default column names, with warning, [#1625](https://github.com/Rdatatable/data.table/issues/1625). If there is just one missing column name it is guessed to be for the first column (row names or an index), otherwise the column names are filled at the end. Similarly, too many column names now automatically sets `fill=TRUE`, with warning. - * `skip=` and `nrow=` are more reliable and are no longer affected by invalid lines outside the range specified. Thanks to Ziyad Saeed and Kyle Chung for reporting, [#1267](https://github.com/Rdatatable/data.table/issues/1267). - * Ram disk (`/dev/shm`) is no longer used for the output of system command input. Although faster when it worked, it was causing too many device full errors; e.g., [#1139](https://github.com/Rdatatable/data.table/issues/1139) and [zUMIs/19](https://github.com/sdparekh/zUMIs/issues/19). Thanks to Kyle Chung for reporting. Standard `tempdir()` is now used. If you wish to use ram disk, set TEMPDIR to `/dev/shm`; see `?tempdir`. - * Detecting whether a very long input string is a file name or data is now much faster, [#2531](https://github.com/Rdatatable/data.table/issues/2531). Many thanks to @javrucebo for the detailed report, benchmarks and suggestions. - * A column of `TRUE/FALSE`s is ok, as well as `True/False`s and `true/false`s, but mixing styles (e.g. `TRUE/false`) is not and will be read as type `character`. - * New argument `index` to parallel the existing `key` argument for applying secondary orderings out of the box for convenience, [#2633](https://github.com/Rdatatable/data.table/issues/2633). - * Many thanks to @yaakovfeldman, Guillermo Ponce, Arun Srinivasan, Hugh Parsonage, Mark Klik, Pasha Stetsenko, Mahyar K, Tom Crockett, @cnoelke, @qinjs, @etienne-s, Mark Danese, Avraham Adler, @franknarf1, @MichaelChirico, @tdhock, Luke Tierney for testing dev and reporting these regressions before release to CRAN: #2070, #2073, #2087, #2091, #2107, #2118, #2092, #1888, #2123, #2167, #2194, #2238, #2228, #1464, #2201, #2287, #2299, #2285, #2251, #2347, #2222, #2352, #2246, #2370, #2371, #2404, #2196, #2322, #2453, #2446, #2464, #2457, #1895, #2481, #2499, #2516, #2520, #2512, #2523, #2542, #2526, #2518, #2515, #1671, #2267, #2561, #2625, #2265, #2548, #2535, #2744, #2735, #2697 - -2. `fwrite()`: - * empty strings are now always quoted (`,"",`) to distinguish them from `NA` which by default is still empty (`,,`) but can be changed using `na=` as before. If `na=` is provided and `quote=` is the default `'auto'` then `quote=` is set to `TRUE` so that if the `na=` value occurs in the data, it can be distinguished from `NA`. Thanks to Ethan Welty for the request [#2214](https://github.com/Rdatatable/data.table/issues/2214) and Pasha for the code change and tests, [#2215](https://github.com/Rdatatable/data.table/issues/2215). - * `logical01` has been added and the old name `logicalAsInt` retained. Pease move to the new name when convenient for you. The old argument name (`logicalAsInt`) will slowly be deprecated over the next few years. The default is unchanged: `FALSE`, so `logical` is still written as `"TRUE"`/`"FALSE"` in full by default. We intend to change the default's default in future to `TRUE`; see the notice at the top of these release notes. - -3. Added helpful message when subsetting by a logical column without wrapping it in parentheses, [#1844](https://github.com/Rdatatable/data.table/issues/1844). Thanks @dracodoc for the suggestion and @MichaelChirico for the PR. - -4. `tables` gains `index` argument for supplementary metadata about `data.table`s in memory (or any optionally specified environment), part of [#1648](https://github.com/Rdatatable/data.table/issues/1648). Thanks due variously to @jangorecki, @rsaporta, @MichaelChirico for ideas and work towards PR. - -5. Improved auto-detection of `character` inputs' formats to `as.ITime` to mirror the logic in `as.POSIXlt.character`, [#1383](https://github.com/Rdatatable/data.table/issues/1383) Thanks @franknarf1 for identifying a discrepancy and @MichaelChirico for investigating. - -6. `setcolorder()` now accepts less than `ncol(DT)` columns to be moved to the front, [#592](https://github.com/Rdatatable/data.table/issues/592). Thanks @MichaelChirico for the PR. This also incidentally fixed [#2007](https://github.com/Rdatatable/data.table/issues/2007) whereby explicitly setting `select = NULL` in `fread` errored; thanks to @rcapell for reporting that and @dselivanov and @MichaelChirico for investigating and providing a new test. - -7. Three new *Grouping Sets* functions: `rollup`, `cube` and `groupingsets`, [#1377](https://github.com/Rdatatable/data.table/issues/1377). Allows to aggregation on various grouping levels at once producing sub-totals and grand total. - -8. `as.data.table()` gains new method for `array`s to return a useful data.table, [#1418](https://github.com/Rdatatable/data.table/issues/1418). - -9. `print.data.table()` (all via master issue [#1523](https://github.com/Rdatatable/data.table/issues/1523)): - - * gains `print.keys` argument, `FALSE` by default, which displays the keys and/or indices (secondary keys) of a `data.table`. Thanks @MichaelChirico for the PR, Yike Lu for the suggestion and Arun for honing that idea to its present form. - - * gains `col.names` argument, `"auto"` by default, which toggles which registers of column names to include in printed output. `"top"` forces `data.frame`-like behavior where column names are only ever included at the top of the output, as opposed to the default behavior which appends the column names below the output as well for longer (>20 rows) tables. `"none"` shuts down column name printing altogether. Thanks @MichaelChirico for the PR, Oleg Bondar for the suggestion, and Arun for guiding commentary. - - * list columns would print the first 6 items in each cell followed by a comma if there are more than 6 in that cell. Now it ends ",..." to make it clearer, part of [#1523](https://github.com/Rdatatable/data.table/issues/1523). Thanks to @franknarf1 for drawing attention to an issue raised on Stack Overflow by @TMOTTM [here](https://stackoverflow.com/q/47679701). - -10. `setkeyv` accelerated if key already exists [#2331](https://github.com/Rdatatable/data.table/issues/2331). Thanks to @MarkusBonsch for the PR. - -11. Keys and indexes are now partially retained up to the key column assigned to with ':=' [#2372](https://github.com/Rdatatable/data.table/issues/2372). They used to be dropped completely if any one of the columns was affected by `:=`. Tanks to @MarkusBonsch for the PR. - -12. Faster `as.IDate` and `as.ITime` methods for `POSIXct` and `numeric`, [#1392](https://github.com/Rdatatable/data.table/issues/1392). Thanks to Jan Gorecki for the PR. - -13. `unique(DT)` now returns `DT` early when there are no duplicates to save RAM, [#2013](https://github.com/Rdatatable/data.table/issues/2013). Thanks to Michael Chirico for the PR, and thanks to @mgahan for pointing out a reversion in `na.omit.data.table` before release, [#2660](https://github.com/Rdatatable/data.table/issues/2660#issuecomment-371027948). - -14. `uniqueN()` is now faster on logical vectors. Thanks to Hugh Parsonage for [PR#2648](https://github.com/Rdatatable/data.table/pull/2648). - ``` - N = 1e9 - was now - x = c(TRUE,FALSE,NA,rep(TRUE,N)) - uniqueN(x) == 3 5.4s 0.00s - x = c(TRUE,rep(FALSE,N), NA) - uniqueN(x,na.rm=TRUE) == 2 5.4s 0.00s - x = c(rep(TRUE,N),FALSE,NA) - uniqueN(x) == 3 6.7s 0.38s - ``` - -15. Subsetting optimization with keys and indices is now possible for compound queries like `DT[a==1 & b==2]`, [#2472](https://github.com/Rdatatable/data.table/issues/2472). -Thanks to @MichaelChirico for reporting and to @MarkusBonsch for the implementation. - -16. `melt.data.table` now offers friendlier functionality for providing `value.name` for `list` input to `measure.vars`, [#1547](https://github.com/Rdatatable/data.table/issues/1547). Thanks @MichaelChirico and @franknarf1 for the suggestion and use cases, @jangorecki and @mrdwab for implementation feedback, and @MichaelChirico for ultimate implementation. - -17. `update.dev.pkg` is new function to update package from development repository, it will download package sources only when newer commit is available in repository. `data.table::update.dev.pkg()` defaults updates `data.table`, but any package can be used. - -18. Item 1 in NEWS for [v1.10.2](https://github.com/Rdatatable/data.table/blob/master/NEWS.md#changes-in-v1102--on-cran-31-jan-2017) on CRAN in Jan 2017 included : - > When j is a symbol prefixed with `..` it will be looked up in calling scope and its value taken to be column names or numbers. - > When you see the `..` prefix think one-level-up, like the directory `..` in all operating systems means the parent directory. - > In future the `..` prefix could be made to work on all symbols apearing anywhere inside `DT[...]`. - - The response has been positive ([this tweet](https://twitter.com/MattDowle/status/967290562725359617) and [FR#2655](https://github.com/Rdatatable/data.table/issues/2655)) and so this prefix is now expanded to all symbols appearing in `j=` as a first step; e.g. : - ```R - cols = "colB" - DT[, c(..cols, "colC")] # same as DT[, .(colB,colC)] - DT[, -..cols] # all columns other than colB - ``` - Thus, `with=` should no longer be needed in any cases. Please change to using the `..` prefix and in a few years we will start to formally deprecate and remove the `with=` parameter. If this is well received, the `..` prefix could be expanded to symbols appearing in `i=` and `by=`, too. - -19. `setindexv` can now assign multiple (separate) indices by accepting a `list` in the `cols` argument. - -20. `as.matrix.data.table` method now has an additional `rownames` argument allowing for a single column to be used as the `rownames` after conversion to a `matrix`. Thanks to @sritchie73 for the suggestion, use cases, [#2692](https://github.com/Rdatatable/data.table/issues/2692) and implementation [PR#2702](https://github.com/Rdatatable/data.table/pull/2702) and @MichaelChirico for additional use cases. - -#### BUG FIXES - -1. The new quote rules handles this single field `"Our Stock Screen Delivers an Israeli Software Company (MNDO, CTCH)<\/a> SmallCapInvestor.com - Thu, May 19, 2011 10:02 AM EDT<\/cite><\/div>Yesterday in \""Google, But for Finding - Great Stocks\"", I discussed the value of stock screeners as a powerful tool"`, [#2051](https://github.com/Rdatatable/data.table/issues/2051). Thanks to @scarrascoso for reporting. Example file added to test suite. - -2. `fwrite()` creates a file with permissions that now play correctly with `Sys.umask()`, [#2049](https://github.com/Rdatatable/data.table/issues/2049). Thanks to @gnguy for reporting. - -3. `fread()` no longer holds an open lock on the file when a line outside the large sample has too many fields and generates an error, [#2044](https://github.com/Rdatatable/data.table/issues/2044). Thanks to Hugh Parsonage for reporting. - -4. Setting `j = {}` no longer results in an error, [#2142](https://github.com/Rdatatable/data.table/issues/2142). Thanks Michael Chirico for the pull request. - -5. Segfault in `rbindlist()` when one or more items are empty, [#2019](https://github.com/Rdatatable/data.table/issues/2019). Thanks Michael Lang for the pull request. Another segfault if the result would be more than 2bn rows, thanks to @jsams's comment in [#2340](https://github.com/Rdatatable/data.table/issues/2340#issuecomment-331505494). - -6. Error printing 0-length `ITime` and `NA` objects, [#2032](https://github.com/Rdatatable/data.table/issues/2032) and [#2171](https://github.com/Rdatatable/data.table/issues/2171). Thanks Michael Chirico for the pull requests and @franknarf1 for pointing out a shortcoming of the initial fix. - -7. `as.IDate.POSIXct` error with `NULL` timezone, [#1973](https://github.com/Rdatatable/data.table/issues/1973). Thanks @lbilli for reporting and Michael Chirico for the pull request. - -8. Printing a null `data.table` with `print` no longer visibly outputs `NULL`, [#1852](https://github.com/Rdatatable/data.table/issues/1852). Thanks @aaronmcdaid for spotting and @MichaelChirico for the PR. - -9. `data.table` now works with Shiny Reactivity / Flexdashboard. The error was typically something like `col not found` in `DT[col==val]`. Thanks to Dirk Eddelbuettel leading Matt through reproducible steps and @sergeganakou and Richard White for reporting. Closes [#2001](https://github.com/Rdatatable/data.table/issues/2001) and [shiny/#1696](https://github.com/rstudio/shiny/issues/1696). - -10. The `as.IDate.POSIXct` method passed `tzone` along but was not exported. So `tzone` is now taken into account by `as.IDate` too as well as `IDateTime`, [#977](https://github.com/Rdatatable/data.table/issues/977) and [#1498](https://github.com/Rdatatable/data.table/issues/1498). Tests added. - -11. Named logical vector now select rows as expected from single row data.table. Thanks to @skranz for reporting. Closes [#2152](https://github.com/Rdatatable/data.table/issues/2152). - -12. `fread()`'s rare `Internal error: Sampling jump point 10 is before the last jump ended` has been fixed, [#2157](https://github.com/Rdatatable/data.table/issues/2157). Thanks to Frank Erickson and Artem Klevtsov for reporting with example files which are now added to the test suite. - -13. `CJ()` no longer loses attribute information, [#2029](https://github.com/Rdatatable/data.table/issues/2029). Thanks to @MarkusBonsch and @royalts for the pull request. - -14. `split.data.table` respects `factor` ordering in `by` argument, [#2082](https://github.com/Rdatatable/data.table/issues/2082). Thanks to @MichaelChirico for identifying and fixing the issue. - -15. `.SD` would incorrectly include symbol on lhs of `:=` when `.SDcols` is specified and `get()` appears in `j`. Thanks @renkun-ken for reporting and the PR, and @ProfFancyPants for reporing a regression introduced in the PR. Closes [#2326](https://github.com/Rdatatable/data.table/issues/2326) and [#2338](https://github.com/Rdatatable/data.table/issues/2338). - -16. Integer values that are too large to fit in `int64` will now be read as strings [#2250](https://github.com/Rdatatable/data.table/issues/2250). - -17. Internal-only `.shallow` now retains keys correctly, [#2336](https://github.com/Rdatatable/data.table/issues/2336). Thanks to @MarkusBonsch for reporting, fixing ([PR #2337](https://github.com/Rdatatable/data.table/pull/2337)) and adding 37 tests. This much advances the journey towards exporting `shallow()`, [#2323](https://github.com/Rdatatable/data.table/issues/2323). - -18. `isoweek` calculation is correct regardless of local timezone setting (`Sys.timezone()`), [#2407](https://github.com/Rdatatable/data.table/issues/2407). Thanks to @MoebiusAV and @SimonCoulombe for reporting and @MichaelChirico for fixing. - -19. Fixed `as.xts.data.table` to support all xts supported time based index clasess [#2408](https://github.com/Rdatatable/data.table/issues/2408). Thanks to @ebs238 for reporting and for the PR. - -20. A memory leak when a very small number such as `0.58E-2141` is bumped to type `character` is resolved, [#918](https://github.com/Rdatatable/data.table/issues/918). - -21. The edge case `setnames(data.table(), character(0))` now works rather than error, [#2452](https://github.com/Rdatatable/data.table/issues/2452). - -22. Order of rows returned in non-equi joins were incorrect in certain scenarios as reported under [#1991](https://github.com/Rdatatable/data.table/issues/1991). This is now fixed. Thanks to @Henrik-P for reporting. - -23. Non-equi joins work as expected when `x` in `x[i, on=...]` is a 0-row data.table. Closes [#1986](https://github.com/Rdatatable/data.table/issues/1986). - -24. Non-equi joins along with `by=.EACHI` returned incorrect result in some rare cases as reported under [#2360](https://github.com/Rdatatable/data.table/issues/2360). This is fixed now. This fix also takes care of [#2275](https://github.com/Rdatatable/data.table/issues/2275). Thanks to @ebs238 for the nice minimal reproducible report, @Mihael for asking on SO and to @Frank for following up on SO and filing an issue. - -25. `by=.EACHI` works now when `list` columns are being returned and some join values are missing, [#2300](https://github.com/Rdatatable/data.table/issues/2300). Thanks to @jangorecki and @franknarf1 for the reproducible examples which have been added to the test suite. - -26. Indices are now retrieved by exact name, [#2465](https://github.com/Rdatatable/data.table/issues/2465). This prevents usage of wrong indices as well as unexpected row reordering in join results. Thanks to @pannnda for reporting and providing a reproducible example and to @MarkusBonsch for fixing. - -27. `setnames` of whole table when original table had `NA` names skipped replacing those, [#2475](https://github.com/Rdatatable/data.table/issues/2475). Thanks to @franknarf1 and [BenoitLondon on StackOverflow](https://stackoverflow.com/questions/47228836/) for the report and @MichaelChirico for fixing. - -28. CJ() works with multiple empty vectors now [#2511](https://github.com/Rdatatable/data.table/issues/2511). Thanks to @MarkusBonsch for fixing. - -29. `:=` assignment of one vector to two or more columns, e.g. `DT[, c("x", "y") := 1:10]`, failed to copy the `1:10` data causing errors later if and when those columns were updated by reference, [#2540](https://github.com/Rdatatable/data.table/issues/2540). This is an old issue ([#185](https://github.com/Rdatatable/data.table/issues/185)) that had been fixed but reappeared when code was refactored. Thanks to @patrickhowerter for the detailed report with reproducible example and to @MarkusBonsch for fixing and strengthening tests so it doesn't reappear again. - -30. "Negative length vectors not allowed" error when grouping `median` and `var` fixed, [#2046](https://github.com/Rdatatable/data.table/issues/2046) and [#2111](https://github.com/Rdatatable/data.table/issues/2111). Thanks to @caneff and @osofr for reporting and to @kmillar for debugging and explaining the cause. - -31. Fixed a bug on Windows where `data.table`s containing non-UTF8 strings in `key`s were not properly sorted, [#2462](https://github.com/Rdatatable/data.table/issues/2462), [#1826](https://github.com/Rdatatable/data.table/issues/1826) and [StackOverflow](https://stackoverflow.com/questions/47599934/why-doesnt-r-data-table-support-well-for-non-ascii-keys-on-windows). Thanks to @shrektan for reporting and fixing. - -32. `x.` prefixes during joins sometimes resulted in a "column not found" error. This is now fixed. Closes [#2313](https://github.com/Rdatatable/data.table/issues/2313). Thanks to @franknarf1 for the MRE. - -33. `setattr()` no longer segfaults when setting 'class' to empty character vector, [#2386](https://github.com/Rdatatable/data.table/issues/2386). Thanks to @hatal175 for reporting and to @MarkusBonsch for fixing. - -34. Fixed cases where the result of `merge.data.table()` would contain duplicate column names if `by.x` was also in `names(y)`. -`merge.data.table()` gains the `no.dups` argument (default TRUE) to match the correpsonding patched behaviour in `base:::merge.data.frame()`. Now, when `by.x` is also in `names(y)` the column name from `y` has the corresponding `suffixes` added to it. `by.x` remains unchanged for backwards compatibility reasons. -In addition, where duplicate column names arise anyway (i.e. `suffixes = c("", "")`) `merge.data.table()` will now throw a warning to match the behaviour of `base:::merge.data.frame()`. -Thanks to @sritchie73 for reporting and fixing [PR#2631](https://github.com/Rdatatable/data.table/pull/2631) and [PR#2653](https://github.com/Rdatatable/data.table/pull/2653) - -35. `CJ()` now fails with proper error message when results would exceed max integer, [#2636](https://github.com/Rdatatable/data.table/issues/2636). - -36. `NA` in character columns now display as `` just like base R to distinguish from `""` and `"NA"`. - -37. `getDTthreads()` could return INT_MAX (2 billion) after an explicit call to `setDTthreads(0)`, [PR#2708](https://github.com/Rdatatable/data.table/pull/2708). - -38. Fixed a bug on Windows that `data.table` may break if the garbage collecting was triggered when sorting a large number of non-ASCII characters. Thanks to @shrektan for reporting and fixing [PR#2678](https://github.com/Rdatatable/data.table/pull/2678), [#2674](https://github.com/Rdatatable/data.table/issues/2674). - -39. Internal aliasing of `.` to `list` was over-aggressive in applying `list` even when `.` was intended within `bquote`, [#1912](https://github.com/Rdatatable/data.table/issues/1912). Thanks @MichaelChirico for reporting/filing and @ecoRoland for suggesting and testing a fix. - -#### NOTES - -0. The license has been changed from GPL to MPL (Mozilla Public License). All contributors were consulted and approved. [PR#2456](https://github.com/Rdatatable/data.table/pull/2456) details the reasons for the change. - -1. `?data.table` makes explicit the option of using a `logical` vector in `j` to select columns, [#1978](https://github.com/Rdatatable/data.table/issues/1978). Thanks @Henrik-P for the note and @MichaelChirico for filing. - -2. Test 1675.1 updated to cope with a change in R-devel in June 2017 related to `factor()` and `NA` levels. - -3. Package `ezknitr` has been added to the whitelist of packages that run user code and should be consider data.table-aware, [#2266](https://github.com/Rdatatable/data.table/issues/2266). Thanks to Matt Mills for testing and reporting. - -4. Printing with `quote = TRUE` now quotes column names as well, [#1319](https://github.com/Rdatatable/data.table/issues/1319). Thanks @jan-glx for the suggestion and @MichaelChirico for the PR. - -5. Added a blurb to `?melt.data.table` explicating the subtle difference in behavior of the `id.vars` argument vis-a-vis its analog in `reshape2::melt`, [#1699](https://github.com/Rdatatable/data.table/issues/1699). Thanks @MichaelChirico for uncovering and filing. - -6. Added some clarification about the usage of `on` to `?data.table`, [#2383](https://github.com/Rdatatable/data.table/issues/2383). Thanks to @peterlittlejohn for volunteering his confusion and @MichaelChirico for brushing things up. - -7. Clarified that "data.table always sorts in `C-locale`" means that upper-case letters are sorted before lower-case letters by ordering in data.table (e.g. `setorder`, `setkey`, `DT[order(...)]`). Thanks to @hughparsonage for the pull request editing the documentation. Note this makes no difference in most cases of data; e.g. ids where only uppercase or lowercase letters are used (`"AB123"<"AC234"` is always true, regardless), or country names and words which are consistently capitalized. For example, `"America" < "Brazil"` is not affected (it's always true), and neither is `"america" < "brazil"` (always true too); since the first letter is consistently capitalized. But, whether `"america" < "Brazil"` (the words are not consistently capitalized) is true or false in base R depends on the locale of your R session. In America it is true by default and false if you i) type `Sys.setlocale(locale="C")`, ii) the R session has been started in a C locale for you which can happen on servers/services (the locale comes from the environment the R session is started in). However, `"america" < "Brazil"` is always, consistently false in data.table which can be a surprise because it differs to base R by default in most regions. It is false because `"B"<"a"` is true because all upper-case letters come first, followed by all lower case letters (the ascii number of each letter determines the order, which is what is meant by `C-locale`). - -8. `data.table`'s dependency has been moved forward from R 3.0.0 (Apr 2013) to R 3.1.0 (Apr 2014; i.e. 3.5 years old). We keep this dependency as old as possible for as long as possible as requested by users in managed environments. Thanks to Jan Gorecki, the test suite from latest dev now runs on R 3.1.0 continously, as well as R-release (currently 3.4.2) and latest R-devel snapshot. [Our CRAN release procedures](https://github.com/Rdatatable/data.table/blob/master/CRAN_Release.cmd) also double check with this stated dependency before release to CRAN. The primary motivation for the bump to R 3.1.0 was allowing one new test which relies on better non-copying behaviour in that version, [#2484](https://github.com/Rdatatable/data.table/issues/2484). It also allows further internal simplifications. Thanks to @MichaelChirico for fixing another test that failed on R 3.1.0 due to slightly different behaviour of `base::read.csv` in R 3.1.0-only which the test was comparing to, [#2489](https://github.com/Rdatatable/data.table/pull/2489). - -9. New vignette added: _Importing data.table_ - focused on using data.table as a dependency in R packages. Answers most commonly asked questions and promote good practices. - -10. As warned in v1.9.8 release notes below in this file (on CRAN 25 Nov 2016) it has been 1 year since then and so use of `options(datatable.old.unique.by.key=TRUE)` to restore the old default is now deprecated with warning. The new warning states that this option still works and repeats the request to pass `by=key(DT)` explicitly to `unique()`, `duplicated()`, `uniqueN()` and `anyDuplicated()` and to stop using this option. In another year, this warning will become error. Another year after that the option will be removed. - -11. As `set2key()` and `key2()` have been warning since v1.9.8 on CRAN Nov 2016, their warnings have now been upgraded to errors. Note that when they were introduced in version 1.9.4 (Oct 2014) they were marked as 'experimental' in NEWS item 4. They will be removed in one year. -``` -Was warning: set2key() will be deprecated in the next relase. Please use setindex() instead. -Now error: set2key() is now deprecated. Please use setindex() instead. -``` - -### Changes in v1.10.4-3 (on CRAN 20 Oct 2017) - -1. Fixed crash/hang on MacOS when `parallel::mclapply` is used and data.table is merely loaded, [#2418](https://github.com/Rdatatable/data.table/issues/2418). Oddly, all tests including test 1705 (which tests `mclapply` with data.table) passed fine on CRAN. It appears to be some versions of MacOS or some versions of libraries on MacOS, perhaps. Many thanks to Martin Morgan for reporting and confirming this fix works. Thanks also to @asenabouth, Joe Thorley and Danton Noriega for testing, debugging and confirming that automatic parallelism inside data.table (such as `fwrite`) works well even on these MacOS installations. See also news items below for 1.10.4-1 and 1.10.4-2. - - -### Changes in v1.10.4-2 (on CRAN 12 Oct 2017) - -1. OpenMP on MacOS is now supported by CRAN and included in CRAN's package binaries for Mac. But installing v1.10.4-1 from source on MacOS failed when OpenMP was not enabled at compile time, [#2409](https://github.com/Rdatatable/data.table/issues/2409). Thanks to Liz Macfie and @fupangpangpang for reporting. The startup message when OpenMP is not enabled has been updated. - -2. Two rare potential memory faults fixed, thanks to CRAN's automated use of latest compiler tools; e.g. clang-5 and gcc-7 - - -### Changes in v1.10.4-1 (on CRAN 09 Oct 2017) - -1. The `nanotime` v0.2.0 update on CRAN 22 June 2017 changed from `integer64` to `S4` and broke `fwrite` of `nanotime` columns. Fixed to work with `nanotime` both before and after v0.2.0. - -2. Pass R-devel changes related to `deparse(,backtick=)` and `factor()`. - -3. Internal `NAMED()==2` now `MAYBE_SHARED()`, [#2330](https://github.com/Rdatatable/data.table/issues/2330). Back-ported to pass under the stated dependency, R 3.0.0. - -4. Attempted improvement on Mac-only when the `parallel` package is used too (which forks), [#2137](https://github.com/Rdatatable/data.table/issues/2137). Intel's OpenMP implementation appears to leave threads running after the OpenMP parallel region (inside data.table) has finished unlike GNU libgomp. So, if and when `parallel`'s `fork` is invoked by the user after data.table has run in parallel already, instability occurs. The problem only occurs with Mac package binaries from CRAN because they are built by CRAN with Intel's OpenMP library. No known problems on Windows or Linux and no known problems on any platform when `parallel` is not used. If this Mac-only fix still doesn't work, call `setDTthreads(1)` immediately after `library(data.table)` which has been reported to fix the problem by putting `data.table` into single threaded mode earlier. - -5. When `fread()` and `print()` see `integer64` columns are present but package `bit64` is not installed, the warning is now displayed as intended. Thanks to a question by Santosh on r-help and forwarded by Bill Dunlap. - - -### Changes in v1.10.4 (on CRAN 01 Feb 2017) - -#### BUG FIXES - -1. The new specialized `nanotime` writer in `fwrite()` type punned using `*(long long *)&REAL(column)[i]` which, strictly, is undefined behavour under C standards. It passed a plethora of tests on linux (gcc 5.4 and clang 3.8), win-builder and 6 out 10 CRAN flavours using gcc. But failed (wrong data written) with the newest version of clang (3.9.1) as used by CRAN on the failing flavors, and solaris-sparc. Replaced with the union method and added a grep to CRAN_Release.cmd. - - -### Changes in v1.10.2 (on CRAN 31 Jan 2017) - -#### NEW FEATURES - -1. When `j` is a symbol prefixed with `..` it will be looked up in calling scope and its value taken to be column names or numbers. - ```R - myCols = c("colA","colB") - DT[, myCols, with=FALSE] - DT[, ..myCols] # same - ``` - When you see the `..` prefix think _one-level-up_ like the directory `..` in all operating systems meaning the parent directory. In future the `..` prefix could be made to work on all symbols apearing anywhere inside `DT[...]`. It is intended to be a convenient way to protect your code from accidentally picking up a column name. Similar to how `x.` and `i.` prefixes (analogous to SQL table aliases) can already be used to disambiguate the same column name present in both `x` and `i`. A symbol prefix rather than a `..()` _function_ will be easier for us to optimize internally and more convenient if you have many variables in calling scope that you wish to use in your expressions safely. This feature was first raised in 2012 and long wished for, [#633](https://github.com/Rdatatable/data.table/issues/633). It is experimental. - -2. When `fread()` or `print()` see `integer64` columns are present, `bit64`'s namespace is now automatically loaded for convenience. - -3. `fwrite()` now supports the new [`nanotime`](https://cran.r-project.org/package=nanotime) type by Dirk Eddelbuettel, [#1982](https://github.com/Rdatatable/data.table/issues/1982). Aside: `data.table` already automatically supported `nanotime` in grouping and joining operations via longstanding support of its underlying `integer64` type. - -4. `indices()` gains a new argument `vectors`, default `FALSE`. This strsplits the index names by `__` for you, [#1589](https://github.com/Rdatatable/data.table/issues/1589). - ```R - DT = data.table(A=1:3, B=6:4) - setindex(DT, B) - setindex(DT, B, A) - indices(DT) - [1] "B" "B__A" - indices(DT, vectors=TRUE) - [[1]] - [1] "B" - [[2]] - [1] "B" "A" - ``` - -#### BUG FIXES - -1. Some long-standing potential instability has been discovered and resolved many thanks to a detailed report from Bill Dunlap and Michael Sannella. At C level any call of the form `setAttrib(x, install(), allocVector())` can be unstable in any R package. Despite `setAttrib()` PROTECTing its inputs, the 3rd argument (`allocVector`) can be executed first only for its result to to be released by `install()`'s potential GC before reaching `setAttrib`'s PROTECTion of its inputs. Fixed by either PROTECTing or pre-`install()`ing. Added to CRAN_Release.cmd procedures: i) `grep`s to prevent usage of this idiom in future and ii) running data.table's test suite with `gctorture(TRUE)`. - -2. A new potential instability introduced in the last release (v1.10.0) in GForce optimized grouping has been fixed by reverting one change from malloc to R_alloc. Thanks again to Michael Sannella for the detailed report. - -3. `fwrite()` could write floating point values incorrectly, [#1968](https://github.com/Rdatatable/data.table/issues/1968). A thread-local variable was incorrectly thread-global. This variable's usage lifetime is only a few clock cycles so it needed large data and many threads for several threads to overlap their usage of it and cause the problem. Many thanks to @mgahan and @jmosser for finding and reporting. - -#### NOTES - -1. `fwrite()`'s `..turbo` option has been removed as the warning message warned. If you've found a problem, please [report it](https://github.com/Rdatatable/data.table/issues). - -2. No known issues have arisen due to `DT[,1]` and `DT[,c("colA","colB")]` now returning columns as introduced in v1.9.8. However, as we've moved forward by setting `options('datatable.WhenJisSymbolThenCallingScope'=TRUE)` introduced then too, it has become clear a better solution is needed. All 340 CRAN and Bioconductor packages that use data.table have been checked with this option on. 331 lines would need to be changed in 59 packages. Their usage is elegant, correct and recommended, though. Examples are `DT[1, encoding]` in quanteda and `DT[winner=="first", freq]` in xgboost. These are looking up the columns `encoding` and `freq` respectively and returning them as vectors. But if, for some reason, those columns are removed from `DT` and `encoding` or `freq` are still variables in calling scope, their values in calling scope would be returned. Which cannot be what was intended and could lead to silent bugs. That was the risk we were trying to avoid.
-`options('datatable.WhenJisSymbolThenCallingScope')` is now removed. A migration timeline is no longer needed. The new strategy needs no code changes and has no breakage. It was proposed and discussed in point 2 [here](https://github.com/Rdatatable/data.table/issues/1188#issuecomment-127824969), as follows.
-When `j` is a symbol (as in the quanteda and xgboost examples above) it will continue to be looked up as a column name and returned as a vector, as has always been the case. If it's not a column name however, it is now a helpful error explaining that data.table is different to data.frame and what to do instead (use `..` prefix or `with=FALSE`). The old behaviour of returning the symbol's value in calling scope can never have been useful to anybody and therefore not depended on. Just as the `DT[,1]` change could be made in v1.9.8, this change can be made now. This change increases robustness with no downside. Rerunning all 340 CRAN and Bioconductor package checks reveal 2 packages throwing the new error: partools and simcausal. Their maintainers have been informed that there is a likely bug on those lines due to data.table's (now remedied) weakness. This is exactly what we wanted to reveal and improve. - -3. As before, and as we can see is in common use in CRAN and Bioconductor packages using data.table, `DT[,myCols,with=FALSE]` continues to lookup `myCols` in calling scope and take its value as column names or numbers. You can move to the new experimental convenience feature `DT[, ..myCols]` if you wish at leisure. - - -### Changes in v1.10.0 (on CRAN 3 Dec 2016) - -#### BUG FIXES - -1. `fwrite(..., quote='auto')` already quoted a field if it contained a `sep` or `\n`, or `sep2[2]` when `list` columns are present. Now it also quotes a field if it contains a double quote (`"`) as documented, [#1925](https://github.com/Rdatatable/data.table/issues/1925). Thanks to Aki Matsuo for reporting. Tests added. The `qmethod` tests did test escaping embedded double quotes, but only when `sep` or `\n` was present in the field as well to trigger the quoting of the field. - -2. Fixed 3 test failures on Solaris only, [#1934](https://github.com/Rdatatable/data.table/issues/1934). Two were on both sparc and x86 and related to a `tzone` attribute difference between `as.POSIXct` and `as.POSIXlt` even when passed the default `tz=""`. The third was on sparc only: a minor rounding issue in `fwrite()` of 1e-305. - -3. Regression crash fixed when 0's occur at the end of a non-empty subset of an empty table, [#1937](https://github.com/Rdatatable/data.table/issues/1937). Thanks Arun for tracking down. Tests added. For example, subsetting the empty `DT=data.table(a=character())` with `DT[c(1,0)]` should return a 1 row result with one `NA` since 1 is past the end of `nrow(DT)==0`, the same result as `DT[1]`. - -4. Fixed newly reported crash that also occurred in old v1.9.6 when `by=.EACHI`, `nomatch=0`, the first item in `i` has no match AND `j` has a function call that is passed a key column, [#1933](https://github.com/Rdatatable/data.table/issues/1933). Many thanks to Reino Bruner for finding and reporting with a reproducible example. Tests added. - -5. Fixed `fread()` error occurring for a subset of Windows users: `showProgress is not type integer but type 'logical'.`, [#1944](https://github.com/Rdatatable/data.table/issues/1944) and [#1111](https://github.com/Rdatatable/data.table/issues/1111). Our tests cover this usage (it is just default usage), pass on AppVeyor (Windows), win-builder (Windows) and CRAN's Windows so perhaps it only occurs on a specific and different version of Windows to all those. Thanks to @demydd for reporting. Fixed by using strictly `logical` type at R level and `Rboolean` at C level, consistently throughout. - -6. Combining `on=` (new in v1.9.6) with `by=` or `keyby=` gave incorrect results, [#1943](https://github.com/Rdatatable/data.table/issues/1943). Many thanks to Henrik-P for the detailed and reproducible report. Tests added. - -7. New function `rleidv` was ignoring its `cols` argument, [#1942](https://github.com/Rdatatable/data.table/issues/1942). Thanks Josh O'Brien for reporting. Tests added. - -#### NOTES - -1. It seems OpenMP is not available on CRAN's Mac platform; NOTEs appeared in [CRAN checks](https://cran.r-project.org/web/checks/check_results_data.table.html) for v1.9.8. Moved `Rprintf` from `init.c` to `packageStartupMessage` to avoid the NOTE as requested urgently by Professor Ripley. Also fixed the bad grammar of the message: 'single threaded' now 'single-threaded'. If you have a Mac and run macOS or OS X on it (I run Ubuntu on mine) please contact CRAN maintainers and/or Apple if you'd like CRAN's Mac binary to support OpenMP. Otherwise, please follow [these instructions for OpenMP on Mac](https://github.com/Rdatatable/data.table/wiki/Installation) which people have reported success with. - -2. Just to state explicitly: data.table does not now depend on or require OpenMP. If you don't have it (as on CRAN's Mac it appears but not in general on Mac) then data.table should build, run and pass all tests just fine. - -3. There are now 5,910 raw tests as reported by `test.data.table()`. Tests cover 91% of the 4k lines of R and 89% of the 7k lines of C. These stats are now known thanks to Jim Hester's [Covr](https://CRAN.R-project.org/package=covr) package and [Codecov.io](https://codecov.io/). If anyone is looking for something to help with, creating tests to hit the missed lines shown by clicking the `R` and `src` folders at the bottom [here](https://codecov.io/github/Rdatatable/data.table?branch=master) would be very much appreciated. - -4. The FAQ vignette has been revised given the changes in v1.9.8. In particular, the very first FAQ. - -5. With hindsight, the last release v1.9.8 should have been named v1.10.0 to convey it wasn't just a patch release from .6 to .8 owing to the 'potentially breaking changes' items. Thanks to @neomantic for correctly pointing out. The best we can do now is now bump to 1.10.0. - - -### Old news from v1.9.8 (Nov 2016) back to v1.2 (Aug 2008) has been moved to [NEWS.0.md](https://github.com/Rdatatable/data.table/blob/master/NEWS.0.md) - - diff --git a/README.md b/README.md deleted file mode 100644 index b8a86ccdd8..0000000000 --- a/README.md +++ /dev/null @@ -1,2 +0,0 @@ - -### Overview is on the project's [homepage](http://r-datatable.com). diff --git a/appveyor.yml b/appveyor.yml deleted file mode 100644 index c187599c4f..0000000000 --- a/appveyor.yml +++ /dev/null @@ -1,72 +0,0 @@ -# DO NOT CHANGE the "init" and "install" sections below - -# Download script file from GitHub -init: - ps: | - $ErrorActionPreference = "Stop" - Invoke-WebRequest https://raw.github.com/krlmlr/r-appveyor/master/scripts/appveyor-tool.ps1 -OutFile "..\appveyor-tool.ps1" - Import-Module '..\appveyor-tool.ps1' - -install: - ps: Bootstrap - -skip_branch_with_pr: true - -environment: - global: - CRAN: http://cloud.r-project.org/ - WARNINGS_ARE_ERRORS: 1 - USE_RTOOLS: true - R_CHECK_ARGS: --no-manual -# R_CHECK_ARGS specified in order to turn off --as-cran (on by default) as that can be slow - R_ARCH: x64 -# multiarch is on by default which runs tests on both 32bit R and 64bit R in one x64 job; i.e. very nice and convenient for all. -# The default for R_ARCH is i386, though, for which multiarch would just compile and test 32bit, hence setting R_ARCH to x64 - GCC_PATH: mingw_64 -# Default GCC_PATH appears to be gcc-4.6.3 which is now unsupported as from Rtools.exe v3.4. - - matrix: - - - R_VERSION: release # the single Windows.zip binary (both 32bit/64bit) that users following dev version of installation instructions should click - - - R_VERSION: devel - -before_build: - - cmd: ECHO no Revision metadata added to DESCRIPTION - #translate from unix: - cmd: ECHO "Revision:" $CI_BUILD_REF >> ./DESCRIPTION - -build_script: - - set _R_CHECK_FORCE_SUGGESTS_=false -# R-devel needs packages recompiled as from 12 Sep 2017 -# Guessing that was the cause of knitr causing AppVeyor R-devel checks to fail -# Commenting out these for now so at least the rest of data.table is checked on R-devel on Windows -# - travis-tool.sh r_install bit64 -# - travis-tool.sh r_install fastmatch -# - travis-tool.sh r_install knitr -# - travis-tool.sh r_install nanotime - -test_script: - - travis-tool.sh run_tests - -on_failure: - - 7z a failure.zip *.Rcheck\* - - appveyor PushArtifact failure.zip - -artifacts: - - path: '*.Rcheck\**\*.log' - name: Logs - - - path: '*.Rcheck\**\*.out' - name: Logs - - - path: '*.Rcheck\**\*.fail' - name: Logs - - - path: '*.Rcheck\**\*.Rout' - name: Logs - - - path: '\*_*.tar.gz' - name: Bits - - - path: '\*_*.zip' - name: Bits diff --git a/cc.R b/cc.R deleted file mode 100644 index aa7d0fe887..0000000000 --- a/cc.R +++ /dev/null @@ -1,83 +0,0 @@ - -# For data.table dev -# -# In ~/.Rprofile add 2 lines : -# Sys.setenv(CC_DIR=path.expand("~/GitHub/data.table")) -# source(paste0(Sys.getenv("CC_DIR"),"/cc.R")) -# -# Normal usage : -# $ R -# > cc() -# # change some files -# > cc() -# -# To debug C level : -# $ R -d gdb -# run -# dd() -# Ctrl-C -# break file.c:line -# c -# test and step between R and C - -options(datatable.print.class = TRUE) - -sourceDir <- function(path=getwd(), trace = TRUE, ...) { - # copied verbatim from example(source) in base R - for (nm in list.files(path, pattern = "\\.[RrSsQq]$")) { - if(trace) cat(nm," ") - source(file.path(path, nm), ...) - } - if(trace) cat("\n") -} - -cc = function(test=TRUE, clean=FALSE, debug=FALSE, cc_dir=Sys.getenv("CC_DIR")) { - gc() - - xx = try(getDLLRegisteredRoutines("datatable",TRUE), silent=TRUE) - if (!inherits(xx, "try-error")) { - remove(list=sapply(xx$.Call,'[[',"name"), pos=.GlobalEnv) - remove(list=sapply(xx$.External,'[[',"name"), pos=.GlobalEnv) - # if these objects aren't there to remove it's correctly an error (should always be there) - } - - # Make sure library .so is not loaded (neither installed package nor from dev) - dll = unlist(do.call("rbind",getLoadedDLLs())[,"path"]) - dll = grep("datatable.so",dll,value=TRUE) - sapply(dll, dyn.unload) - gc() - - old = getwd() - on.exit(setwd(old)) - setwd(file.path(cc_dir,"src")) - cat(getwd(),"\n") - if (clean) system("rm *.o *.so") - if (debug) { - ret = system("MAKEFLAGS='-j CC=gcc PKG_CFLAGS=-fno-openmp CFLAGS=-std=c99\\ -O0\\ -ggdb\\ -pedantic' R CMD SHLIB -d -o data.table.so *.c") - } else { - ret = system("MAKEFLAGS='-j CC=gcc CFLAGS=-fopenmp\\ -std=c99\\ -O3\\ -pipe\\ -Wall\\ -pedantic' R CMD SHLIB -o data.table.so *.c") - # TODO add -Wextra too? - } - if (ret) return() - # clang -Weverything includes -pedantic and issues many more warnings than gcc - # system("R CMD SHLIB -o data.table.so *.c") - if (any(sapply(objects(envir=.GlobalEnv),function(x){inherits(get(x,.GlobalEnv),"data.table")}))) { - cat("ABOUT TO RELOAD .SO BUT THERE ARE DATA.TABLE OBJECTS IN .GLOBALENV SO FINALIZER MIGHT CRASH\n") - } - dyn.load("datatable.so") - setwd(old) - xx = getDLLRegisteredRoutines("datatable",TRUE) - for (i in seq_along(xx$.Call)) - assign(xx$.Call[[i]]$name, xx$.Call[[i]]$address, env=.GlobalEnv) - for (i in seq_along(xx$.External)) - assign(xx$.External[[i]]$name, xx$.External[[i]]$address, env=.GlobalEnv) - sourceDir(paste0(cc_dir,"/R")) - assign("testDir", function(x)paste0(cc_dir,"/inst/tests/",x), envir=.GlobalEnv) - .onLoad() - if (test) test.data.table() - gc() - invisible() -} - -dd = function()cc(FALSE,debug=TRUE,clean=TRUE) - diff --git a/deploy.sh b/deploy.sh deleted file mode 100644 index 6d0fd3590a..0000000000 --- a/deploy.sh +++ /dev/null @@ -1,30 +0,0 @@ -#!/bin/bash - -set -o errexit -o nounset -PKG_REPO=$PWD -PKG_TARBALL=$(ls -1t *.tar.gz | head -n 1) -cd .. - -addToDrat(){ - mkdir drat; cd drat - - ## Set up Repo parameters - git init - git config user.name "addToDrat" - git config user.email "addToDrat@travis.ci" - - ## Get drat repo - git remote add upstream "https://$GH_TOKEN@github.com/Rdatatable/data.table.git" 2>err.txt - git fetch upstream gh-pages 2>err.txt - git checkout gh-pages 2>err.txt - git reset --hard "88000defd316538c37af4c8dc842e73e7953f4e2" 2>err.txt - - Rscript -e "drat::insertPackage('$PKG_REPO/$PKG_TARBALL', \ - repodir = '.', \ - commit='Travis publish data.table: build $TRAVIS_COMMIT', \ - addFiles=TRUE, fields='Revision')" - git push --force upstream gh-pages 2>err.txt - -} - -addToDrat diff --git a/man/IDateTime.Rd b/man/IDateTime.Rd deleted file mode 100644 index b33b73f4a9..0000000000 --- a/man/IDateTime.Rd +++ /dev/null @@ -1,234 +0,0 @@ -\name{IDateTime} -\alias{IDate} -\alias{as.IDate} -\alias{ITime} -\alias{as.ITime} -\alias{IDateTime} -\alias{as.character.ITime} -\alias{as.chron.IDate} -\alias{as.chron.ITime} -\alias{as.Date.IDate} -\alias{as.IDate.Date} -\alias{as.IDate.default} -\alias{as.ITime.character} -\alias{as.ITime.default} -\alias{as.ITime.POSIXlt} -\alias{as.ITime.times} -\alias{as.list.IDate} -\alias{as.POSIXct.IDate} -\alias{as.POSIXct.ITime} -\alias{as.POSIXlt.ITime} -\alias{c.IDate} -\alias{cut.IDate} -\alias{format.ITime} -\alias{IDateTime.default} -\alias{mean.IDate} -\alias{print.ITime} -\alias{rep.IDate} -\alias{rep.ITime} -\alias{round.IDate} -\alias{seq.IDate} -\alias{split.IDate} -\alias{second} -\alias{minute} -\alias{hour} -\alias{yday} -\alias{wday} -\alias{mday} -\alias{week} -\alias{isoweek} -\alias{month} -\alias{quarter} -\alias{year} -\alias{IDate-class} -\alias{ITime-class} - -\title{ Integer based date class } -\description{ - Date and time classes with integer storage for fast sorting and - grouping. Still experimental! -} -\usage{ -as.IDate(x, ...) -\method{as.IDate}{default}(x, \dots, tz = attr(x, "tzone")) -\method{as.IDate}{Date}(x, \dots) -\method{as.Date}{IDate}(x, \dots) -\method{as.POSIXct}{IDate}(x, tz = "UTC", time = 0, \dots) -\method{as.chron}{IDate}(x, time = NULL, \dots) -\method{round}{IDate}(x, digits = c("weeks", "months", "quarters","years"), \ldots) - -as.ITime(x, ...) -\method{as.ITime}{default}(x, \dots) -\method{as.POSIXct}{ITime}(x, tz = "UTC", date = as.Date(Sys.time()), \dots) -\method{as.chron}{ITime}(x, date = NULL, \dots) -\method{as.character}{ITime}(x, \dots) -\method{format}{ITime}(x, \dots) - -IDateTime(x, ...) -\method{IDateTime}{default}(x, ...) - -second(x) -minute(x) -hour(x) -yday(x) -wday(x) -mday(x) -week(x) -isoweek(x) -month(x) -quarter(x) -year(x) - -} - -\arguments{ - \item{x}{an object} - \item{\dots}{arguments to be passed to or from other methods. For - \code{as.IDate.default}, arguments are passed to \code{as.Date}. For - \code{as.ITime.default}, arguments are passed to \code{as.POSIXlt}.} - \item{tz}{time zone (see \code{strptime}).} - \item{date}{date object convertable with \code{as.IDate}.} - \item{time}{time-of-day object convertable with \code{as.ITime}.} - \item{digits}{really \code{units}; one of the units listed for rounding. May be abbreviated.} -} -\details{ -\code{IDate} is a date class derived from \code{Date}. It has the same -internal representation as the \code{Date} class, except the storage -mode is integer. \code{IDate} is a relatively simple wrapper, and it -should work in almost all situations as a replacement for \code{Date}. - -Functions that use \code{Date} objects generally work for -\code{IDate} objects. This package provides specific methods for -\code{IDate} objects for \code{mean}, \code{cut}, \code{seq}, \code{c}, -\code{rep}, and \code{split} to return an \code{IDate} object. - -\code{ITime} is a time-of-day class stored as the integer number of -seconds in the day. \code{as.ITime} does not allow days longer than 24 -hours. Because \code{ITime} is stored in seconds, you can add it to a -\code{POSIXct} object, but you should not add it to a \code{Date} -object. - -Conversions to and from \code{Date}, \code{POSIXct}, and \code{chron} -formats are provided. - -\code{ITime} does not account for time zones. When converting -\code{ITime} and \code{IDate} to POSIXct with \code{as.POSIXct}, a time -zone may be specified. - -In \code{as.POSIXct} methods for \code{ITime} and \code{IDate}, the -second argument is required to be \code{tz} based on the generic -template, but to make converting easier, the second argument is -interpreted as a date instead of a time zone if it is of type -\code{IDate} or \code{ITime}. Therefore, you can use either of the -following: \code{as.POSIXct(time, date)} or \code{as.POSIXct(date, -time)}. - -\code{IDateTime} takes a date-time input and returns a data table with -columns \code{date} and \code{time}. - -Using integer storage allows dates and/or times to be used as data table -keys. With positive integers with a range less than 100,000, grouping -and sorting is fast because radix sorting can be used (see -\code{sort.list}). - -Several convenience functions like \code{hour} and \code{quarter} are -provided to group or extract by hour, month, and other date-time -intervals. \code{as.POSIXlt} is also useful. For example, -\code{as.POSIXlt(x)$mon} is the integer month. The R base convenience -functions \code{weekdays}, \code{months}, and \code{quarters} can also -be used, but these return character values, so they must be converted to -factors for use with data.table. \code{isoweek} is ISO 8601-consistent. - -The \code{round} method for IDate's is useful for grouping and plotting. It can -round to weeks, months, quarters, and years. - -} - -\value{ - For \code{as.IDate}, a class of \code{IDate} and \code{Date} with the - date stored as the number of days since some origin. - - For \code{as.ITime}, a class of \code{ITime} - stored as the number of seconds in the day. - - For \code{IDateTime}, a data table with columns \code{idate} and - \code{itime} in \code{IDate} and \code{ITime} format. - - \code{second}, \code{minute}, \code{hour}, \code{yday}, \code{wday}, - \code{mday}, \code{week}, \code{month}, \code{quarter}, - and \code{year} return integer values - for second, minute, hour, day of year, day of week, - day of month, week, month, quarter, and year, respectively. - - These values are all taken directly from the \code{POSIXlt} representation of \code{x}, with the notable difference that while \code{yday}, \code{wday}, and \code{mon} are all 0-based, here they are 1-based. - -} -\references{ - - G. Grothendieck and T. Petzoldt, ``Date and Time Classes in R,'' - R News, vol. 4, no. 1, June 2004. - - H. Wickham, http://gist.github.com/10238. - - ISO 8601, http://www.iso.org/iso/home/standards/iso8601.htm -} - -\author{ Tom Short, t.short@ieee.org } - -\seealso{ \code{\link{as.Date}}, \code{\link{as.POSIXct}}, - \code{\link{strptime}}, \code{\link{DateTimeClasses}} - -} - -\examples{ - -# create IDate: -(d <- as.IDate("2001-01-01")) - -# S4 coercion also works -identical(as.IDate("2001-01-01"), as("2001-01-01", "IDate")) - -# create ITime: -(t <- as.ITime("10:45")) - -# S4 coercion also works -identical(as.ITime("10:45"), as("10:45", "ITime")) - -(t <- as.ITime("10:45:04")) - -(t <- as.ITime("10:45:04", format = "\%H:\%M:\%S")) - -as.POSIXct("2001-01-01") + as.ITime("10:45") - -datetime <- seq(as.POSIXct("2001-01-01"), as.POSIXct("2001-01-03"), by = "5 hour") -(af <- data.table(IDateTime(datetime), a = rep(1:2, 5), key = "a,idate,itime")) - -af[, mean(a), by = "itime"] -af[, mean(a), by = list(hour = hour(itime))] -af[, mean(a), by = list(wday = factor(weekdays(idate)))] -af[, mean(a), by = list(wday = wday(idate))] - -as.POSIXct(af$idate) -as.POSIXct(af$idate, time = af$itime) -as.POSIXct(af$idate, af$itime) -as.POSIXct(af$idate, time = af$itime, tz = "GMT") - -as.POSIXct(af$itime, af$idate) -as.POSIXct(af$itime) # uses today's date - -(seqdates <- seq(as.IDate("2001-01-01"), as.IDate("2001-08-03"), by = "3 weeks")) -round(seqdates, "months") - -if (require(chron)) { - as.chron(as.IDate("2000-01-01")) - as.chron(as.ITime("10:45")) - as.chron(as.IDate("2000-01-01"), as.ITime("10:45")) - as.chron(as.ITime("10:45"), as.IDate("2000-01-01")) - as.ITime(chron(times = "11:01:01")) - IDateTime(chron("12/31/98","10:45:00")) -} - -} -\keyword{utilities} -\keyword{chron} - diff --git a/man/J.Rd b/man/J.Rd deleted file mode 100644 index d860f502b9..0000000000 --- a/man/J.Rd +++ /dev/null @@ -1,58 +0,0 @@ -\name{J} -\alias{J} -\alias{CJ} -\alias{SJ} -\title{ Creates a Join data table } -\description{ - Creates a \code{data.table} to be passed in as the \code{i} to a \code{[.data.table} join. -} - -\usage{ -# DT[J(...)] # J() only for use inside DT[...]. -SJ(...) # DT[SJ(...)] -CJ(..., sorted = TRUE, unique = FALSE) # DT[CJ(...)] -} - -\arguments{ - \item{\dots}{ Each argument is a vector. Generally each vector is the - same length but if they are not then the usual silent repetition is applied. } - \item{sorted}{ logical. Should the input order be retained?} - \item{unique}{ logical. When \code{TRUE}, only unique values of each vectors are used (automatically). } -} -\details{ - \code{SJ} and \code{CJ} are convenience functions for creating a data.table in the context of a data.table 'query' on \code{x}. - - \code{x[data.table(id)]} is the same as \code{x[J(id)]} but the latter is more readable. Identical alternatives are \code{x[list(id)]} and \code{x[.(id)]}. - - \code{x} must have a key when passing in a join table as the \code{i}. See \code{\link{[.data.table}} -} -\value{ - \itemize{ - \code{J} : the same result as calling list. J is a direct alias for list but results in clearer more readable code. - - \code{SJ} : (S)orted (J)oin. The same value as J() but additionally setkey() is called on all the columns in the order they were passed in to SJ. For efficiency, to invoke a binary merge rather than a repeated binary full search for each row of \code{i}. - - \code{CJ} : (C)ross (J)oin. A data.table is formed from the cross product of the vectors. For example, 10 ids, and 100 dates, CJ returns a 1000 row table containing all the dates for all the ids. It gains \code{sorted}, which by default is TRUE for backwards compatibility. FALSE retains input order. - } -} -\seealso{ \code{\link{data.table}}, \code{\link{test.data.table}} } -\examples{ -DT = data.table(A=5:1,B=letters[5:1]) -setkey(DT,B) # re-orders table and marks it sorted. -DT[J("b")] # returns the 2nd row -DT[.("b")] # same. Style of package plyr. -DT[list("b")] # same - -# CJ usage examples -CJ(c(5,NA,1), c(1,3,2)) # sorted and keyed data.table -do.call(CJ, list(c(5,NA,1), c(1,3,2))) # same as above -CJ(c(5,NA,1), c(1,3,2), sorted=FALSE) # same order as input, unkeyed -# use for 'unique=' argument -x = c(1,1,2) -y = c(4,6,4) -CJ(x, y, unique=TRUE) # unique(x) and unique(y) are computed automatically - -} -\keyword{ data } - - diff --git a/man/address.Rd b/man/address.Rd deleted file mode 100644 index 222e0993f2..0000000000 --- a/man/address.Rd +++ /dev/null @@ -1,23 +0,0 @@ -\name{address} -\alias{address} -\title{ Address in RAM of a variable } -\description{ - Returns the pointer address of its argument. -} -\usage{ - address(x) -} -\arguments{ - \item{x}{ Anything. } -} -\details{ -Sometimes useful in determining whether a value has been copied or not, programmatically. -} -\value{ - A character vector length 1. -} -\references{ -\url{http://stackoverflow.com/a/10913296/403310} (but implemented in C without using \code{.Internal(inspect())}) -} -\keyword{ data } - diff --git a/man/all.equal.data.table.Rd b/man/all.equal.data.table.Rd deleted file mode 100644 index 20771f3ea8..0000000000 --- a/man/all.equal.data.table.Rd +++ /dev/null @@ -1,90 +0,0 @@ -\name{all.equal} -\alias{all.equal} -\alias{all.equal.data.table} -\title{ Equality Test Between Two Data Tables } -\description{ - Convenient test of data equality between \code{data.table} objects. Performs some factor level \emph{stripping}. -} - -\usage{ - \method{all.equal}{data.table}(target, current, trim.levels=TRUE, check.attributes=TRUE, - ignore.col.order=FALSE, ignore.row.order=FALSE, tolerance=sqrt(.Machine$double.eps), - ...) -} - -\arguments{ - \item{target, current}{ - \code{data.table}s to compare - } - - \item{trim.levels}{ - A logical indicating whether or not to remove all unused levels in columns - that are factors before running equality check. It effect only when \code{check.attributes} is TRUE and \code{ignore.row.order} is FALSE. - } - - \item{check.attributes}{ - A logical indicating whether or not to check attributes, will apply not only to data.table but also attributes of the columns. It will skip \code{c("row.names",".internal.selfref")} data.table attributes. - } - - \item{ignore.col.order}{ - A logical indicating whether or not to ignore columns order in \code{data.table}. - } - - \item{ignore.row.order}{ - A logical indicating whether or not to ignore rows order in \code{data.table}. This option requires datasets to use data types on which join can be made, so no support for \emph{list, complex, raw}, but still supports \link[bit64]{integer64}. - } - - \item{tolerance}{ - A numeric value used when comparing numeric columns, by default \code{sqrt(.Machine$double.eps)}. Unless non-default value provided it will be forced to \code{0} if used together with \code{ignore.row.order} and duplicate rows detected or factor columns present. - } - - \item{\dots}{ - Passed down to internal call of \code{\link[base]{all.equal}}. - } -} - -\details{ - For efficiency data.table method will exit on detected non-equality issues, unlike most \code{\link[base]{all.equal}} methods which process equality checks further. Besides that fact it also handles the most time consuming case of \code{ignore.row.order = TRUE} very efficiently. -} - -\value{ - Either \code{TRUE} or a vector of mode \code{"character"} describing the - differences between \code{target} and \code{current}. -} - -\seealso{ - \code{\link[base]{all.equal}} -} - -\examples{ -dt1 <- data.table(A = letters[1:10], X = 1:10, key = "A") -dt2 <- data.table(A = letters[5:14], Y = 1:10, key = "A") -isTRUE(all.equal(dt1, dt1)) -is.character(all.equal(dt1, dt2)) - -# ignore.col.order -x <- copy(dt1) -y <- dt1[, .(X, A)] -all.equal(x, y) -all.equal(x, y, ignore.col.order = TRUE) - -# ignore.row.order -x <- setkeyv(copy(dt1), NULL) -y <- dt1[sample(nrow(dt1))] -all.equal(x, y) -all.equal(x, y, ignore.row.order = TRUE) - -# check.attributes -x = copy(dt1) -y = setkeyv(copy(dt1), NULL) -all.equal(x, y) -all.equal(x, y, check.attributes = FALSE) - -# trim.levels -x <- data.table(A = factor(letters[1:10])[1:4]) # 10 levels -y <- data.table(A = factor(letters[1:5])[1:4]) # 5 levels -all.equal(x, y, trim.levels = FALSE) -all.equal(x, y, trim.levels = FALSE, check.attributes = FALSE) -all.equal(x, y) -} - diff --git a/man/as.data.table.Rd b/man/as.data.table.Rd deleted file mode 100644 index cecd4228cd..0000000000 --- a/man/as.data.table.Rd +++ /dev/null @@ -1,90 +0,0 @@ -\name{as.data.table} -\alias{as.data.table} -\alias{as.data.table.array} -\alias{as.data.table.matrix} -\alias{as.data.table.list} -\alias{as.data.table.data.frame} -\alias{as.data.table.data.table} -\alias{as.data.table.factor} -\alias{as.data.table.ordered} -\alias{as.data.table.integer} -\alias{as.data.table.numeric} -\alias{as.data.table.logical} -\alias{as.data.table.character} -\alias{as.data.table.Date} -\alias{is.data.table} -\title{Coerce to data.table} -\description{ -Functions to check if an object is \code{data.table}, or coerce it if possible. - -} -\usage{ -as.data.table(x, keep.rownames=FALSE, \dots) - -\method{as.data.table}{data.table}(x, \dots) - -\method{as.data.table}{array}(x, keep.rownames=FALSE, sorted=TRUE, value.name="value", na.rm=TRUE, \dots) - -is.data.table(x) - -} -\arguments{ - \item{x}{An R object.} - \item{keep.rownames}{Default is \code{FALSE}. If \code{TRUE}, adds the input object's names as a separate column named \code{"rn"}. \code{keep.rownames = "id"} names the column \code{"id"} instead.} - \item{sorted}{logical used in \emph{array} method, default \code{TRUE}.} - \item{value.name}{character scalar used in \emph{array} method, default \code{"value"}.} - \item{na.rm}{logical used in \emph{array} method, default \code{TRUE} will remove rows with \code{NA} values.} - \item{\dots}{Additional arguments to be passed to or from other methods.} -} -\details{ - - \code{as.data.table} is a generic function with many methods, and other packages can supply further methods. - - If a \code{list} is supplied, each element is converted to a column in the \code{data.table} with shorter elements recycled automatically. Similarly, each column of a \code{matrix} is converted separately. - - \code{character} objects are \emph{not} converted to \code{factor} types unlike \code{as.data.frame}. - - If a \code{data.frame} is supplied, all classes preceding \code{"data.frame"} are stripped. Similarly, for \code{data.table} as input, all classes preceding \code{"data.table"} are stripped. \code{as.data.table} methods returns a \emph{copy} of original data. To modify by reference see \code{\link{setDT}} and \code{\link{setDF}}. - - \code{keep.rownames} argument can be used to preserve the (row)names attribute in the resulting \code{data.table}. -} -\seealso{ - \code{\link{data.table}}, \code{\link{setDT}}, \code{\link{setDF}}, \code{\link{copy}}, \code{\link{setkey}}, \code{\link{J}}, \code{\link{SJ}}, \code{\link{CJ}}, \code{\link{merge.data.table}}, \code{\link{:=}}, \code{\link{alloc.col}}, \code{\link{truelength}}, \code{\link{rbindlist}}, \code{\link{setNumericRounding}}, \code{\link{datatable-optimize}} -} -\examples{ -nn = c(a=0.1, b=0.2, c=0.3, d=0.4) -as.data.table(nn) -as.data.table(nn, keep.rownames=TRUE) -as.data.table(nn, keep.rownames="rownames") - -# char object not converted to factor -cc = c(X="a", Y="b", Z="c") -as.data.table(cc) -as.data.table(cc, keep.rownames=TRUE) -as.data.table(cc, keep.rownames="rownames") - -mm = matrix(1:4, ncol=2, dimnames=list(c("r1", "r2"), c("c1", "c2"))) -as.data.table(mm) -as.data.table(mm, keep.rownames=TRUE) -as.data.table(mm, keep.rownames="rownames") - -ll = list(a=1:2, b=3:4) -as.data.table(ll) -as.data.table(ll, keep.rownames=TRUE) -as.data.table(ll, keep.rownames="rownames") - -DF = data.frame(x=rep(c("x","y","z"),each=2), y=c(1,3,6), row.names=LETTERS[1:6]) -as.data.table(DF) -as.data.table(DF, keep.rownames=TRUE) -as.data.table(DF, keep.rownames="rownames") - -DT = data.table(x=rep(c("x","y","z"),each=2), y=c(1:6)) -as.data.table(DT) - -ar = rnorm(27) -ar[sample(27, 15)] = NA -dim(ar) = c(3L,3L,3L) -as.data.table(ar) -} -\keyword{ data } - diff --git a/man/as.data.table.xts.Rd b/man/as.data.table.xts.Rd deleted file mode 100644 index 58e9f11de3..0000000000 --- a/man/as.data.table.xts.Rd +++ /dev/null @@ -1,27 +0,0 @@ -\name{as.data.table.xts} -\alias{as.data.table.xts} -\title{Efficient xts to as.data.table conversion} -\description{ - Efficient conversion xts to data.table. -} -\usage{ -\method{as.data.table}{xts}(x, keep.rownames = TRUE, ...) -} -\arguments{ -\item{x}{xts to convert to data.table} - -\item{keep.rownames}{keep xts index as \emph{index} column in result data.table} - -\item{\dots}{ignored, just for consistency with \code{as.data.table}} -} -\seealso{ \code{\link{as.xts.data.table}} } -\examples{ -if (requireNamespace("xts", quietly = TRUE)) { - data(sample_matrix, package = "xts") - sample.xts <- xts::as.xts(sample_matrix) # xts might not be attached on search path - # print head of xts - print(head(sample.xts)) - # print data.table - print(as.data.table(sample.xts)) -} -} diff --git a/man/as.matrix.Rd b/man/as.matrix.Rd deleted file mode 100644 index f93f3ba89b..0000000000 --- a/man/as.matrix.Rd +++ /dev/null @@ -1,63 +0,0 @@ -\name{as.matrix} -\alias{as.matrix} -\alias{as.matrix.data.table} -\title{Convert a data.table to a matrix} -\description{ -Converts a \code{data.table} into a \code{matrix}, optionally using one -of the columns in the \code{data.table} as the \code{matrix} \code{rownames}. -} -\usage{ -\method{as.matrix}{data.table}(x, rownames, ...)} - -\arguments{ -\item{x}{a \code{data.table}} -\item{rownames}{optional, a single column name or column index to use as -the \code{rownames} in the returned \code{matrix}. If \code{TRUE} the -\code{\link{key}} of the \code{data.table} will be used if it is a -single column, otherwise the first column in the \code{data.table} will -be used. Alternative a vector of length \code{nrow(x)} to assign as the -row names of the returned \code{matrix}.} -\item{\dots}{additional arguments to be passed to or from methods.} -} - -\details{ -\code{\link{as.matrix}} is a generic function in base R. It dispatches to -\code{as.matrix.data.table} if its \code{x} argument is a \code{data.table}. - -The method for \code{data.table}s will return a character matrix if there -are only atomic columns and any non-(numeric/logical/complex) column, -applying \code{\link{as.vector}} to factors and \code{\link{format}} to other -non-character columns. Otherwise, the usual coercion hierarchy (logical < -integer < double < complex) will be used, e.g., all-logical data frames -will be coerced to a logical matrix, mixed logical-integer will give an -integer matrix, etc. - -An additional argument \code{rownames} is provided for \code{as.matrix.data.table} -to facilitate conversions to matrices where the \code{\link{rownames}} are stored -in a single column of \code{x}, e.g. the first column after using -\code{\link{dcast.data.table}}. -} - -\value{ -A new \code{matrix} containing the contents of \code{x}. -} - -\seealso{ -\code{\link{data.table}}, \code{\link{as.matrix}}, \code{\link{data.matrix}} -\code{\link{array}} -} - -\examples{ -(dt1 <- data.table(A = letters[1:10], X = 1:10, Y = 11:20)) -as.matrix(dt1) # character matrix -as.matrix(dt1, rownames = "A") -as.matrix(dt1, rownames = 1) -as.matrix(dt1, rownames = TRUE) - -(dt1 <- data.table(A = letters[1:10], X = 1:10, Y = 11:20)) -setkey(dt1, A) -as.matrix(dt1, rownames = TRUE) -} - -\keyword{ array } - diff --git a/man/as.xts.data.table.Rd b/man/as.xts.data.table.Rd deleted file mode 100644 index 285cc35310..0000000000 --- a/man/as.xts.data.table.Rd +++ /dev/null @@ -1,25 +0,0 @@ -\name{as.xts.data.table} -\alias{as.xts.data.table} -\title{Efficient data.table to xts conversion} -\description{ - Efficient conversion of data.table to xts, data.table must have \emph{POSIXct} or \emph{Date} type in first column. -} -\usage{ -as.xts.data.table(x, ...) -} -\arguments{ -\item{x}{data.table to convert to xts, must have \emph{POSIXct} or \emph{Date} in the first column. All others non-numeric columns will be omitted with warning.} -\item{\dots}{ignored, just for consistency with generic method.} -} -\seealso{ \code{\link{as.data.table.xts}} } -\examples{ -if (requireNamespace("xts", quietly = TRUE)) { - sample.dt <- data.table(date = as.Date((Sys.Date()-999):Sys.Date(),origin="1970-01-01"), - quantity = sample(10:50,1000,TRUE), - value = sample(100:1000,1000,TRUE)) - # print data.table - print(sample.dt) - # print head of xts - print(head(as.xts.data.table(sample.dt))) # xts might not be attached on search path -} -} diff --git a/man/assign.Rd b/man/assign.Rd deleted file mode 100644 index 61a7fed1ab..0000000000 --- a/man/assign.Rd +++ /dev/null @@ -1,149 +0,0 @@ -\name{:=} -\alias{:=} -\alias{set} -\title{ Assignment by reference } -\description{ - Fast add, remove and update subsets of columns, by reference. \code{:=} operator can be used in two ways: \code{LHS := RHS} form, and \code{Functional form}. See \code{Usage}. - - \code{set} is a low-overhead loop-able version of \code{:=}. It is particularly useful for repetitively updating rows of certain columns by reference (using a for-loop). See \code{Examples}. It can not perform grouping operations. - -} -\usage{ -# 1. LHS := RHS form -# DT[i, LHS := RHS, by = ...] -# DT[i, c("LHS1", "LHS2") := list(RHS1, RHS2), by = ...] - -# 2. Functional form -# DT[i, `:=`(LHS1 = RHS1, -# LHS2 = RHS2, -# ...), by = ...] - -set(x, i = NULL, j, value) -} -\arguments{ -\item{LHS}{ A character vector of column names (or numeric positions) or a variable that evaluates as such. If the column doesn't exist, it is added, \emph{by reference}. } -\item{RHS}{ A list of replacement values. It is recycled in the usual way to fill the number of rows satisfying \code{i}, if any. To remove a column use \code{NULL}. } -\item{x}{ A \code{data.table}. Or, \code{set()} accepts \code{data.frame}, too. } -\item{i}{ Optional. Indicates the rows on which the values must be updated with. If not provided, implies \emph{all rows}. The \code{:=} form is more powerful as it allows \emph{subsets} and \code{joins} based add/update columns by reference. See \code{Details}. - - In \code{set}, only integer type is allowed in \code{i} indicating which rows \code{value} should be assigned to. \code{NULL} represents all rows more efficiently than creating a vector such as \code{1:nrow(x)}. } -\item{j}{ Column name(s) (character) or number(s) (integer) to be assigned \code{value} when column(s) already exist, and only column name(s) if they are to be created. } -\item{value}{ A list of replacement values to assign by reference to \code{x[i, j]}. } -} -\details{ -\code{:=} is defined for use in \code{j} only. It \emph{adds} or \emph{updates} or \emph{removes} column(s) by reference. It makes no copies of any part of memory at all. Read the \href{../doc/datatable-reference-semantics.html}{Reference Semantics HTML vignette} to follow with examples. Some typical usages are: - -\preformatted{ - DT[, col := val] # update (or add at the end if doesn't exist) a column called "col" with value "val" (recycled if necessary). - DT[i, col := val] # same as above, but only for those rows specified in i and (for new columns) NA elsewhere. - DT[i, "col a" := val] # same. column is called "col a" - DT[i, (3:6) := val] # update existing columns 3:6 with value. Aside: parens are not required here since : already makes LHS a call rather than a symbol. - DT[i, colvector := val, with = FALSE] # OLD syntax. The contents of "colvector" in calling scope determine the column(s). - DT[i, (colvector) := val] # same (NOW PREFERRED) shorthand syntax. The parens are enough to stop the LHS being a symbol; same as c(colvector). - DT[i, colC := mean(colB), by = colA] # update (or add) column called "colC" by reference by group. A major feature of `:=`. - DT[,`:=`(new1 = sum(colB), new2 = sum(colC))] # Functional form -} - -All of the following result in a friendly error (by design) : - -\preformatted{ - x := 1L - DT[i, col] := val - DT[i]$col := val - DT[, {col1 := 1L; col2 := 2L}] # Use the functional form, `:=`(), instead (see above). -} - -For additional resources, check the \href{../doc/datatable-faq.html}{FAQs vignette}. Also have a look at StackOverflow's \href{http://stackoverflow.com/search?q=\%5Bdata.table\%5D+reference}{data.table tag}. - -\code{:=} in \code{j} can be combined with all types of \code{i} (such as binary search), and all types of \code{by}. This a one reason why \code{:=} has been implemented in \code{j}. See the \href{../doc/datatable-reference-semantics}{Reference Semantics HTML vignette} and also \code{FAQ 2.16} for analogies to SQL. - -When \code{LHS} is a factor column and \code{RHS} is a character vector with items missing from the factor levels, the new level(s) are automatically added (by reference, efficiently), unlike base methods. - -Unlike \code{<-} for \code{data.frame}, the (potentially large) LHS is not coerced to match the type of the (often small) RHS. Instead the RHS is coerced to match the type of the LHS, if necessary. Where this involves double precision values being coerced to an integer column, a warning is given (whether or not fractional data is truncated). The motivation for this is efficiency. It is best to get the column types correct up front and stick to them. Changing a column type is possible but deliberately harder: provide a whole column as the RHS. This RHS is then \emph{plonked} into that column slot and we call this \emph{plonk syntax}, or \emph{replace column syntax} if you prefer. By needing to construct a full length vector of a new type, you as the user are more aware of what is happening, and it's clearer to readers of your code that you really do intend to change the column type. - -\code{data.table}s are \emph{not} copied-on-change by \code{:=}, \code{setkey} or any of the other \code{set*} functions. See \code{\link{copy}}. -} - -\section{Advanced (internals):}{It is easy to see how \emph{sub-assigning} to existing columns is done internally. Removing columns by reference is also straightforward by modifying the vector of column pointers only (using memmove in C). However adding (new) columns is more tricky as to how the \code{data.table} can be grown \emph{by reference}: the list vector of column pointers is \emph{over-allocated}, see \code{\link{truelength}}. By defining \code{:=} in \code{j} we believe update syntax is natural, and scales, but it also bypasses \code{[<-} dispatch and allows \code{:=} to update by reference with no copies of any part of memory at all. - -Since \code{[.data.table} incurs overhead to check the existence and type of arguments (for example), \code{set()} provides direct (but less flexible) assignment by reference with low overhead, appropriate for use inside a \code{for} loop. See examples. \code{:=} is more powerful and flexible than \code{set()} because \code{:=} is intended to be combined with \code{i} and \code{by} in single queries on large datasets. -} -\section{Note:}{ - \code{DT[a > 4, b := c]} is different from \code{DT[a > 4][, b := c]}. The first expression updates (or adds) column \code{b} with the value \code{c} on those rows where \code{a > 4} evaluates to \code{TRUE}. \code{X} is updated \emph{by reference}, therefore no assignment needed. - - The second expression on the other hand updates a \emph{new} \code{data.table} that's returned by the subset operation. Since the subsetted data.table is ephemeral (it is not assigned to a symbol), the result would be lost; unless the result is assigned, for example, as follows: \code{ans <- DT[a > 4][, b := c]}. -} -\value{ -\code{DT} is modified by reference and returned invisibly. If you require a copy, take a \code{\link{copy}} first (using \code{DT2 = copy(DT)}). -} -\seealso{ \code{\link{data.table}}, \code{\link{copy}}, \code{\link{alloc.col}}, \code{\link{truelength}}, \code{\link{set}} -} -\examples{ -DT = data.table(a = LETTERS[c(3L,1:3)], b = 4:7) -DT[, c := 8] # add a numeric column, 8 for all rows -DT[, d := 9L] # add an integer column, 9L for all rows -DT[, c := NULL] # remove column c -DT[2, d := -8L] # subassign by reference to d; 2nd row is -8L now -DT # DT changed by reference -DT[2, d := 10L][] # shorthand for update and print - -DT[b > 4, b := d * 2L] # subassign to b with d*2L on those rows where b > 4 is TRUE -DT[b > 4][, b := d * 2L] # different from above. [, := ] is performed on the subset - # which is an new (ephemeral) data.table. Result needs to be - # assigned to a variable (using `<-`). - -DT[, e := mean(d), by = a] # add new column by group by reference -DT["A", b := 0L, on = "a"] # ad-hoc update of column b for group "A" using - # joins-as-subsets with binary search and 'on=' -# same as above but using keys -setkey(DT, a) -DT["A", b := 0L] # binary search for group "A" and set column b using keys -DT["B", f := mean(d)] # subassign to new column, NA initialized - -# Adding multiple columns -## by name -DT[ , c('sin_d', 'log_e', 'cos_d') := - .(sin(d), log(e), cos(d))] -## by patterned name -DT[ , paste(c('sin', 'cos'), 'b', sep = '_') := - .(sin(b), cos(b))] -## using lapply & .SD -DT[ , paste0('tan_', c('b', 'd', 'e')) := - lapply(.SD, tan), .SDcols = c('b', 'd', 'e')] -## using forced evaluation to disambguate a vector of names -## and overwrite existing columns with their squares -sq_cols = c('b', 'd', 'e') -DT[ , (sq_cols) := lapply(.SD, `^`, 2L), .SDcols = sq_cols] -## by integer (NB: for robustness, it is not recommended -## to use explicit integers to update/define columns) -DT[ , c(2L, 3L, 4L) := .(sqrt(b), sqrt(d), sqrt(e))] -## by implicit integer -DT[ , grep('a$', names(DT)) := tolower(a)] -## by implicit integer, using forced evaluation -sq_col_idx = grep('d$', names(DT)) -DT[ , (sq_col_idx) := lapply(.SD, dnorm), - .SDcols = sq_col_idx] - -\dontrun{ -# Speed example ... - -m = matrix(1, nrow = 2e6L, ncol = 100L) -DF = as.data.frame(m) -DT = as.data.table(m) - -system.time(for (i in 1:1000) DF[i, 1] = i) -# 15.856 seconds -system.time(for (i in 1:1000) DT[i, V1 := i]) -# 0.279 seconds (57 times faster) -system.time(for (i in 1:1000) set(DT, i, 1L, i)) -# 0.002 seconds (7930 times faster, overhead of [.data.table is avoided) - -# However, normally, we call [.data.table *once* on *large* data, not many times on small data. -# The above is to demonstrate overhead, not to recommend looping in this way. But the option -# of set() is there if you need it. -} - -} -\keyword{ data } - - diff --git a/man/between.Rd b/man/between.Rd deleted file mode 100644 index 1e603b0d69..0000000000 --- a/man/between.Rd +++ /dev/null @@ -1,72 +0,0 @@ -\name{between} -\alias{between} -\alias{\%between\%} -\alias{inrange} -\alias{\%inrange\%} -\title{ Convenience functions for range subsets. } -\description{ -Intended for use in \code{i} in \code{[.data.table}. - -\code{between} is equivalent to \code{x >= lower & x <= upper} when -\code{incbounds=TRUE}, or \code{x > lower & y < upper} when \code{FALSE}. - -\code{inrange} checks whether each value in \code{x} is in between any of -the intervals provided in \code{lower,upper}. -} -\usage{ -between(x, lower, upper, incbounds=TRUE) -x \%between\% y - -inrange(x, lower, upper, incbounds=TRUE) -x \%inrange\% y -} -\arguments{ -\item{x}{ Any orderable vector, i.e., those with relevant methods for -\code{`<=`}, such as \code{numeric}, \code{character}, \code{Date}, etc. in -case of \code{between} and a numeric vector in case of \code{inrange}.} -\item{lower}{ Lower range bound.} -\item{upper}{ Upper range bound.} -\item{y}{ A length-2 \code{vector} or \code{list}, with \code{y[[1]]} -interpreted as \code{lower} and \code{y[[2]]} as \code{upper}.} -\item{incbounds}{ \code{TRUE} means inclusive bounds, i.e., [lower,upper]. -\code{FALSE} means exclusive bounds, i.e., (lower,upper). - -It is set to \code{TRUE} by default for infix notations.} -} -\details{ - -From \code{v1.9.8+}, \code{between} is vectorised. \code{lower} and -\code{upper} are recycled to \code{length(x)} if necessary. - -\emph{non-equi} joins were recently implemented in \code{v1.9.8}. It extends -binary search based joins in \code{data.table} to other binary operators -including \code{>=, <=, >, <}. \code{inrange} makes use of this new -functionality and performs a range join. - -} -\value{ -Logical vector as the same length as \code{x} with value \code{TRUE} for those -that lie within the specified range. -} -\note{ Current implementation does not make use of ordered keys for -\code{\%between\%}. } -\seealso{ -\code{\link{data.table}}, \code{\link{like}}, \code{\link{\%chin\%}} -} -\examples{ -X = data.table(a=1:5, b=6:10, c=c(5:1)) -X[b \%between\% c(7,9)] -X[between(b, 7, 9)] # same as above -# NEW feature in v1.9.8, vectorised between -X[c \%between\% list(a,b)] -X[between(c, a, b)] # same as above -X[between(c, a, b, incbounds=FALSE)] # open interval - -# inrange() -Y = data.table(a=c(8,3,10,7,-10), val=runif(5)) -range = data.table(start = 1:5, end = 6:10) -Y[a \%inrange\% range] -Y[inrange(a, range$start, range$end)] # same as above -Y[inrange(a, range$start, range$end, incbounds=FALSE)] # open interval -} -\keyword{ data } diff --git a/man/chmatch.Rd b/man/chmatch.Rd deleted file mode 100644 index da4b1ea0af..0000000000 --- a/man/chmatch.Rd +++ /dev/null @@ -1,87 +0,0 @@ -\name{chmatch} -\alias{chmatch} -\alias{\%chin\%} -\alias{chorder} -\alias{chgroup} -\title{ Faster match of character vectors } -\description{ - \code{chmatch} returns a vector of the positions of (first) matches of its first argument in its second. Both arguments must be character vectors. - - \code{\%chin\%} is like \code{\%in\%}, but for character vectors. -} -\usage{ -chmatch(x, table, nomatch=NA_integer_) -x \%chin\% table -chorder(x) -chgroup(x) -} -\arguments{ - \item{x}{ character vector: the values to be matched, or the values to be ordered or grouped } - \item{table}{ character vector: the values to be matched against. } - \item{nomatch}{ the value to be returned in the case when no match is found. Note that it is coerced to integer. } -} -\details{ - Fast versions of \code{match}, \code{\%in\%} and \code{order}, optimised for character vectors. \code{chgroup} groups together duplicated values but retains the group order (according the first appearance order of each group), efficiently. They have been primarily developed for internal use by data.table, but have been exposed since that seemed appropriate. - - Strings are already cached internally by R (\code{CHARSXP}) and that is utilised by these functions. No hash table is built or cached, so the first call is the same speed as subsequent calls. Essentially, a counting sort (similar to \code{base::sort.list(x,method="radix")}, see \code{\link{setkey}}) is implemented using the (almost) unused truelength of CHARSXP as the counter. \emph{Where} R \emph{has} used truelength of CHARSXP (where a character value is shared by a variable name), the non zero truelengths are stored first and reinstated afterwards. Each of the \code{ch*} functions implements a variation on this theme. Remember that internally in R, length of a CHARSXP is the nchar of the string and DATAPTR is the string itself. - - Methods that do build and cache a hash table (such as the \href{https://cran.r-project.org/package=fastmatch}{fastmatch package}) are \emph{much} faster on subsequent calls (almost instant) but a little slower on the first. Therefore \code{chmatch} may be particularly suitable for ephemeral vectors (such as local variables in functions) or tasks that are only done once. Much depends on the length of \code{x} and \code{table}, how many unique strings each contains, and whether the position of the first match is all that is required. - - It may be possible to speed up fastmatch's hash table build time by using the technique in \code{data.table}, and we have suggested this to its author. If successful, fastmatch would then be fastest in all cases. - } -\value{ - As \code{match} and \code{\%in\%}. \code{chorder} and \code{chgroup} return an integer index vector. -} -\seealso{ \code{\link[base]{match}}, \code{\link{\%in\%}}, \code{\link[fastmatch]{fmatch}} -} -\note{ The name \code{charmatch} was taken by \code{\link[base]{charmatch}}, hence \code{chmatch}. -} -\examples{ -# Please type 'example(chmatch)' to run this and see timings on your machine - -# N is set small here (1e5) because CRAN runs all examples and tests every night, to catch -# any problems early as R itself changes and other packages run. -# The comments here apply when N has been changed to 1e7. -N = 1e5 - -u = as.character(as.hexmode(1:10000)) -y = sample(u,N,replace=TRUE) -x = sample(u) - # With N=1e7 ... -system.time(a <- match(x,y)) # 4.8s -system.time(b <- chmatch(x,y)) # 0.9s Faster than 1st fmatch -identical(a,b) -\dontrun{ - library(fastmatch) - print(system.time(c <- fmatch(x,y))) # 2.1s Builds and caches hash - print(system.time(c <- fmatch(x,y))) # 0.00s Uses hash - identical(a,c) -} - -system.time(a <- x \%in\% y) # 4.8s -system.time(b <- x \%chin\% y) # 0.9s -identical(a,b) -\dontrun{ - match <- fmatch # fmatch is drop in replacement - print(system.time(c <- match(x,y))) # 0.00s - print(system.time(c <- x \%in\% y)) # 4.8s \%in\% still prefers base::match - # Anyone know how to get \%in\% to use fmatch (without masking \%in\% too)? - rm(match) - identical(a,c) -} - -# Different example with more unique strings ... -u = as.character(as.hexmode(1:(N/10))) -y = sample(u,N,replace=TRUE) -x = sample(u,N,replace=TRUE) -system.time(a <- match(x,y)) # 34.0s -system.time(b <- chmatch(x,y)) # 6.4s -identical(a,b) -\dontrun{ - print(system.time(c <- fmatch(x,y))) # 7.9s - print(system.time(c <- fmatch(x,y))) # 4.0s - identical(a,c) -} -} -\keyword{ data } - diff --git a/man/copy.Rd b/man/copy.Rd deleted file mode 100644 index 819fa2a509..0000000000 --- a/man/copy.Rd +++ /dev/null @@ -1,41 +0,0 @@ -\name{copy} -\alias{copy} -\title{ Copy an entire object } -\description{ - In \code{data.table} parlance, all \code{set*} functions change their input \emph{by reference}. That is, no copy is made at all, other than temporary working memory, which is as large as one column. The only other \code{data.table} operator that modifies input by reference is \code{\link{:=}}. Check out the \code{See Also} section below for other \code{set*} function \code{data.table} provides. - - \code{copy()} copies an entire object. -} -\usage{ -copy(x) -} -\arguments{ - \item{x}{ A \code{data.table}. } -} -\details{ -\code{data.table} provides functions that operate on objects \emph{by reference} and minimise full object copies as much as possible. Still, it might be necessary in some situations to work on an object's copy which can be done using \code{DT.copy <- copy(DT)}. It may also be sometimes useful before \code{:=} (or \code{set}) is used to subassign to a column by reference. - -A \code{copy()} may be required when doing \code{dt_names = names(DT)}. Due to R's \emph{copy-on-modify}, \code{dt_names} still points to the same location in memory as \code{names(DT)}. Therefore modifying \code{DT} \emph{by reference} now, say by adding a new column, \code{dt_names} will also get updated. To avoid this, one has to \emph{explicitly} copy: \code{dt_names <- copy(names(DT))}. - } -\value{ - Returns a copy of the object. -} -\seealso{ \code{\link{data.table}}, \code{\link{setkey}}, \code{\link{setDT}}, \code{\link{setDF}}, \code{\link{set}} \code{\link{:=}}, \code{\link{setorder}}, \code{\link{setattr}}, \code{\link{setnames}} -} -\examples{ -# Type 'example(copy)' to run these at prompt and browse output - -DT = data.table(A=5:1,B=letters[5:1]) -DT2 = copy(DT) # explicit copy() needed to copy a data.table -setkey(DT2,B) # now just changes DT2 -identical(DT,DT2) # FALSE. DT and DT2 are now different tables - -DT = data.table(A=5:1, B=letters[5:1]) -nm1 = names(DT) -nm2 = copy(names(DT)) -DT[, C := 1L] -identical(nm1, names(DT)) # TRUE, nm1 is also changed by reference -identical(nm2, names(DT)) # FALSE, nm2 is a copy, different from names(DT) -} -\keyword{ data } - diff --git a/man/data.table-class.Rd b/man/data.table-class.Rd deleted file mode 100644 index b79338ff53..0000000000 --- a/man/data.table-class.Rd +++ /dev/null @@ -1,33 +0,0 @@ -\name{data.table-class} -\docType{class} - -\alias{class:data.table} -\alias{data.table-class} - -\title{S4 Definition for data.table} -\description{ - A \code{data.table} can be used in S4 class definitions as either - a parent class (inside a \code{contains} argument of \code{setClass}), - or as an element of an S4 slot. -} - -% \details{ -% } - - -\author{ Steve Lianoglou } -\seealso{ - \code{\link{data.table}} -} - -\examples{ -## Used in inheritence. -setClass('SuperDataTable', contains='data.table') - -## Used in a slot -setClass('Something', representation(x='character', dt='data.table')) -x <- new("Something", x='check', dt=data.table(a=1:10, b=11:20)) -} - -\keyword{classes} -\keyword{methods} diff --git a/man/data.table.Rd b/man/data.table.Rd deleted file mode 100644 index 50c91522c4..0000000000 --- a/man/data.table.Rd +++ /dev/null @@ -1,433 +0,0 @@ -\name{data.table-package} -\alias{data.table-package} -\docType{package} -\alias{data.table} -\alias{Ops.data.table} -\alias{is.na.data.table} -\alias{[.data.table} -\title{ Enhanced data.frame } -\description{ - \code{data.table} \emph{inherits} from \code{data.frame}. It offers fast and memory efficient: file reader and writer, aggregations, updates, equi, non-equi, rolling, range and interval joins, in a short and flexible syntax, for faster development. - - It is inspired by \code{A[B]} syntax in \R where \code{A} is a matrix and \code{B} is a 2-column matrix. Since a \code{data.table} \emph{is} a \code{data.frame}, it is compatible with \R functions and packages that accept \emph{only} \code{data.frame}s. - - Type \code{vignette(package="data.table")} to get started. The \href{../doc/datatable-intro.html}{Introduction to data.table} vignette introduces \code{data.table}'s \code{x[i, j, by]} syntax and is a good place to start. If you have read the vignettes and the help page below, please feel free to ask questions on Stack Overflow \href{http://stackoverflow.com/questions/tagged/data.table}{data.table tag} or on \href{http://r.789695.n4.nabble.com/datatable-help-f2315188.html}{datatable-help} mailing list. To report a bug please type: \code{bug.report(package = "data.table")}. - - Please check the \href{https://github.com/Rdatatable/data.table/wiki}{homepage} for up to the minute live NEWS. - - Tip: one of the \emph{quickest} ways to learn the features is to type \code{example(data.table)} and study the output at the prompt. -} -\usage{ -data.table(..., keep.rownames=FALSE, check.names=FALSE, key=NULL, stringsAsFactors=FALSE) - -\method{[}{data.table}(x, i, j, by, keyby, with = TRUE, - nomatch = getOption("datatable.nomatch"), # default: NA_integer_ - mult = "all", - roll = FALSE, - rollends = if (roll=="nearest") c(TRUE,TRUE) - else if (roll>=0) c(FALSE,TRUE) - else c(TRUE,FALSE), - which = FALSE, - .SDcols, - verbose = getOption("datatable.verbose"), # default: FALSE - allow.cartesian = getOption("datatable.allow.cartesian"), # default: FALSE - drop = NULL, on = NULL) -} -\arguments{ - \item{\dots}{ Just as \code{\dots} in \code{\link{data.frame}}. Usual recycling rules are applied to vectors of different lengths to create a list of equal length vectors.} - - \item{keep.rownames}{ If \code{\dots} is a \code{matrix} or \code{data.frame}, \code{TRUE} will retain the rownames of that object in a column named \code{rn}.} - - \item{check.names}{ Just as \code{check.names} in \code{\link{data.frame}}.} - - \item{key}{ Character vector of one or more column names which is passed to \code{\link{setkey}}. It may be a single comma separated string such as \code{key="x,y,z"}, or a vector of names such as \code{key=c("x","y","z")}.} - - \item{stringsAsFactors}{Logical (default is \code{FALSE}). Convert all \code{character} columns to \code{factor}s?} - - \item{x}{ A \code{data.table}.} - - \item{i}{ Integer, logical or character vector, single column numeric \code{matrix}, expression of column names, \code{list}, \code{data.frame} or \code{data.table}. - - \code{integer} and \code{logical} vectors work the same way they do in \code{\link{[.data.frame}} except logical \code{NA}s are treated as FALSE. - - \code{expression} is evaluated within the frame of the \code{data.table} (i.e. it sees column names as if they are variables) and can evaluate to any of the other types. - - \code{character}, \code{list} and \code{data.frame} input to \code{i} is converted into a \code{data.table} internally using \code{\link{as.data.table}}. - - If \code{i} is a \code{data.table}, the columns in \code{i} to be matched against \code{x} can be specified using one of these ways: - - \itemize{ - \item{\code{on} argument (see below). It allows for both \code{equi-} and the newly implemented \code{non-equi} joins.} - - \item{If not, \code{x} \emph{must be keyed}. Key can be set using \code{\link{setkey}}. If \code{i} is also keyed, then first \emph{key} column of \code{i} is matched against first \emph{key} column of \code{x}, second against second, etc.. - - If \code{i} is not keyed, then first column of \code{i} is matched against first \emph{key} column of \code{x}, second column of \code{i} against second \emph{key} column of \code{x}, etc... - - This is summarised in code as \code{min(length(key(x)), if (haskey(i)) length(key(i)) else ncol(i))}.} - } - Using \code{on=} is recommended (even during keyed joins) as it helps understand the code better and also allows for \emph{non-equi} joins. - - When the binary operator \code{==} alone is used, an \emph{equi} join is performed. In SQL terms, \code{x[i]} then performs a \emph{right join} by default. \code{i} prefixed with \code{!} signals a \emph{not-join} or \emph{not-select}. - - Support for \emph{non-equi} join was recently implemented, which allows for other binary operators \code{>=, >, <= and <}. - - See \href{../doc/datatable-keys-fast-subset.html}{Keys and fast binary search based subset} and \href{../doc/datatable-secondary-indices-and-auto-indexing.html}{Secondary indices and auto indexing}. - - \emph{Advanced:} When \code{i} is a single variable name, it is not considered an expression of column names and is instead evaluated in calling scope. - } - - \item{j}{When \code{with=TRUE} (default), \code{j} is evaluated within the frame of the data.table; i.e., it sees column names as if they are variables. This allows to not just \emph{select} columns in \code{j}, but also \code{compute} on them e.g., \code{x[, a]} and \code{x[, sum(a)]} returns \code{x$a} and \code{sum(x$a)} as a vector respectively. \code{x[, .(a, b)]} and \code{x[, .(sa=sum(a), sb=sum(b))]} returns a two column data.table each, the first simply \emph{selecting} columns \code{a, b} and the second \emph{computing} their sums. - - The expression `.()` is a \emph{shorthand} alias to \code{list()}; they both mean the same. (An exception is made for the use of \code{.()} within a call to \code{\link{bquote}}, where \code{.()} is left unchanged.) As long as \code{j} returns a \code{list}, each element of the list becomes a column in the resulting \code{data.table}. This is the default \emph{enhanced} mode. - - When \code{with=FALSE}, \code{j} can be a vector of column names or positions to select (as in \code{data.frame}), or a logical vector with length \code{ncol(x)} defining columns to select. Note: if a logical vector with length \code{k < ncol(x)} is passed, it will be filled to length \code{ncol(x)} with \code{FALSE}, which is different from \code{data.frame}, where the vector is recycled. - - \emph{Advanced:} \code{j} also allows the use of special \emph{read-only} symbols: \code{\link{.SD}}, \code{\link{.N}}, \code{\link{.I}}, \code{\link{.GRP}}, \code{\link{.BY}}. - - \emph{Advanced:} When \code{i} is a \code{data.table}, the columns of \code{i} can be referred to in \code{j} by using the prefix \code{i.}, e.g., \code{X[Y, .(val, i.val)]}. Here \code{val} refers to \code{X}'s column and \code{i.val} \code{Y}'s. - - \emph{Advanced:} Columns of \code{x} can now be referred to using the prefix \code{x.} and is particularly useful during joining to refer to \code{x}'s \emph{join} columns as they are otherwise masked by \code{i}'s. For example, \code{X[Y, .(x.a-i.a, b), on="a"]}. - - See \href{../doc/datatable-intro.html}{Introduction to data.table} vignette and examples.} - - \item{by}{ Column names are seen as if they are variables (as in \code{j} when \code{with=TRUE}). The \code{data.table} is then grouped by the \code{by} and \code{j} is evaluated within each group. The order of the rows within each group is preserved, as is the order of the groups. \code{by} accepts: - - \itemize{ - \item{A single unquoted column name: e.g., \code{DT[, .(sa=sum(a)), by=x]}} - - \item{a \code{list()} of expressions of column names: e.g., \code{DT[, .(sa=sum(a)), by=.(x=x>0, y)]}} - - \item{a single character string containing comma separated column names (where spaces are significant since column names may contain spaces even at the start or end): e.g., \code{DT[, sum(a), by="x,y,z"]}} - - \item{a character vector of column names: e.g., \code{DT[, sum(a), by=c("x", "y")]}} - - \item{or of the form \code{startcol:endcol}: e.g., \code{DT[, sum(a), by=x:z]}} - } - - \emph{Advanced:} When \code{i} is a \code{list} (or \code{data.frame} or \code{data.table}), \code{DT[i, j, by=.EACHI]} evaluates \code{j} for the groups in `DT` that each row in \code{i} joins to. That is, you can join (in \code{i}) and aggregate (in \code{j}) simultaneously. We call this \emph{grouping by each i}. See \href{http://stackoverflow.com/a/27004566/559784}{this StackOverflow answer} for a more detailed explanation until we \href{https://github.com/Rdatatable/data.table/issues/944}{roll out vignettes}. - - \emph{Advanced:} In the \code{X[Y, j]} form of grouping, the \code{j} expression sees variables in \code{X} first, then \code{Y}. We call this \emph{join inherited scope}. If the variable is not in \code{X} or \code{Y} then the calling frame is searched, its calling frame, and so on in the usual way up to and including the global environment.} - - \item{keyby}{ Same as \code{by}, but with an additional \code{setkey()} run on the \code{by} columns of the result, for convenience. It is common practice to use `keyby=` routinely when you wish the result to be sorted.} - - \item{with}{ By default \code{with=TRUE} and \code{j} is evaluated within the frame of \code{x}; column names can be used as variables. - - When \code{with=FALSE} \code{j} is a character vector of column names, a numeric/logical vector of column positions to select or of the form \code{startcol:endcol}, and the value returned is always a \code{data.table}. \code{with=FALSE} is often useful in \code{data.table} to select columns dynamically. Note that \code{x[, cols, with=FALSE]} is equivalent to \code{x[, .SD, .SDcols=cols]}.} - - \item{nomatch}{ Same as \code{nomatch} in \code{\link{match}}. When a row in \code{i} has no match to \code{x}, \code{nomatch=NA} (default) means \code{NA} is returned. \code{0} means no rows will be returned for that row of \code{i}. Use \code{options(datatable.nomatch=0)} to change the default value (used when \code{nomatch} is not supplied).} - - \item{mult}{ When \code{i} is a \code{list} (or \code{data.frame} or \code{data.table}) and \emph{multiple} rows in \code{x} match to the row in \code{i}, \code{mult} controls which are returned: \code{"all"} (default), \code{"first"} or \code{"last"}.} - - \item{roll}{ When \code{i} is a \code{data.table} and its row matches to all but the last \code{x} join column, and its value in the last \code{i} join column falls in a gap (including after the last observation in \code{x} for that group), then: - - \itemize{ - \item{\code{+Inf} (or \code{TRUE}) rolls the \emph{prevailing} value in \code{x} forward. It is also known as last observation carried forward (LOCF).} - \item{\code{-Inf} rolls backwards instead; i.e., next observation carried backward (NOCB).} - \item{finite positive or negative number limits how far values are carried forward or backward.} - \item{"nearest" rolls the nearest value instead.} - } - Rolling joins apply to the last join column, generally a date but can be any variable. It is particularly fast using a modified binary search. - - A common idiom is to select a contemporaneous regular time series (\code{dts}) across a set of identifiers (\code{ids}): \code{DT[CJ(ids,dts),roll=TRUE]} where \code{DT} has a 2-column key (id,date) and \code{\link{CJ}} stands for \emph{cross join}.} - - \item{rollends}{ A logical vector length 2 (a single logical is recycled) indicating whether values falling before the first value or after the last value for a group should be rolled as well. - \itemize{ - \item{If \code{rollends[2]=TRUE}, it will roll the last value forward. \code{TRUE} by default for LOCF and \code{FALSE} for NOCB rolls.} - \item{If \code{rollends[1]=TRUE}, it will roll the first value backward. \code{TRUE} by default for NOCB and \code{FALSE} for LOCF rolls.} - } - When \code{roll} is a finite number, that limit is also applied when rolling the ends.} - - \item{which}{\code{TRUE} returns the row numbers of \code{x} that \code{i} matches to. If \code{NA}, returns the row numbers of \code{i} that have no match in \code{x}. By default \code{FALSE} and the rows in \code{x} that match are returned.} - - \item{.SDcols}{ Specifies the columns of \code{x} to be included in the special symbol \code{\link{.SD}} which stands for \code{Subset of data.table}. May be character column names or numeric positions. This is useful for speed when applying a function through a subset of (possible very many) columns; e.g., \code{DT[, lapply(.SD, sum), by="x,y", .SDcols=301:350]}. - - For convenient interactive use, the form \code{startcol:endcol} is also allowed (as in \code{by}), e.g., \code{DT[, lapply(.SD, sum), by=x:y, .SDcols=a:f]} -} - \item{verbose}{ \code{TRUE} turns on status and information messages to the console. Turn this on by default using \code{options(datatable.verbose=TRUE)}. The quantity and types of verbosity may be expanded in future. - -} - \item{allow.cartesian}{ \code{FALSE} prevents joins that would result in more than \code{nrow(x)+nrow(i)} rows. This is usually caused by duplicate values in \code{i}'s join columns, each of which join to the same group in `x` over and over again: a \emph{misspecified} join. Usually this was not intended and the join needs to be changed. The word 'cartesian' is used loosely in this context. The traditional cartesian join is (deliberately) difficult to achieve in \code{data.table}: where every row in \code{i} joins to every row in \code{x} (a \code{nrow(x)*nrow(i)} row result). 'cartesian' is just meant in a 'large multiplicative' sense. } - - \item{drop}{ Never used by \code{data.table}. Do not use. It needs to be here because \code{data.table} inherits from \code{data.frame}. See \href{../doc/datatable-faq.html}{datatable-faq}.} - - \item{on}{ Indicate which columns in \code{x} should be joined with which columns in \code{i} along with the type of binary operator to join with (see non-equi joins below on this). When specified, this overrides the keys set on \code{x} and \code{i}. There are multiple ways of specifying the \code{on} argument: - \itemize{ - \item{As an unnamed character vector, e.g., \code{X[Y, on=c("a", "b")]}, used when columns \code{a} and \code{b} are common to both \code{X} and \code{Y}.} - \item{\emph{Foreign key joins}: As a \emph{named} character vector when the join columns have different names in \code{X} and \code{Y}. - For example, \code{X[Y, on=c(x1="y1", x2="y2")]} joins \code{X} and \code{Y} by matching columns \code{x1} and \code{x2} in \code{X} with columns \code{y1} and \code{y2} in \code{Y}, respectively. - - From v1.9.8, you can also express foreign key joins using the binary operator \code{==}, e.g. \code{X[Y, on=c("x1==y1", "x2==y2")]}. - - NB: shorthand like \code{X[Y, on=c("a", V2="b")]} is also possible if, e.g., column \code{"a"} is common between the two tables.} - \item{For convenience during interactive scenarios, it is also possible to use \code{.()} syntax as \code{X[Y, on=.(a, b)]}.} - \item{From v1.9.8, (non-equi) joins using binary operators \code{>=, >, <=, <} are also possible, e.g., \code{X[Y, on=c("x>=a", "y<=b")]}, or for interactive use as \code{X[Y, on=.(x>=a, y<=b)]}.} - } - See examples as well as \href{../doc/datatable-secondary-indices-and-auto-indexing.html}{Secondary indices and auto indexing}. - } -} -\details{ -\code{data.table} builds on base \R functionality to reduce 2 types of time:\cr - -\enumerate{ - \item{programming time (easier to write, read, debug and maintain), and} - \item{compute time (fast and memory efficient).} -} - -The general form of data.table syntax is:\cr - -\preformatted{ - DT[ i, j, by ] # + extra arguments - | | | - | | -------> grouped by what? - | -------> what to do? - ---> on which rows? -} - -The way to read this out loud is: "Take \code{DT}, subset rows by \code{i}, \emph{then} compute \code{j} grouped by \code{by}. Here are some basic usage examples expanding on this definition. See the vignette (and examples) for working examples. - -\preformatted{ - X[, a] # return col 'a' from X as vector. If not found, search in parent frame. - X[, .(a)] # same as above, but return as a data.table. - X[, sum(a)] # return sum(a) as a vector (with same scoping rules as above) - X[, .(sum(a)), by=c] # get sum(a) grouped by 'c'. - X[, sum(a), by=c] # same as above, .() can be omitted in by on single expression for convenience - X[, sum(a), by=c:f] # get sum(a) grouped by all columns in between 'c' and 'f' (both inclusive) - - X[, sum(a), keyby=b] # get sum(a) grouped by 'b', and sort that result by the grouping column 'b' - X[, sum(a), by=b][order(b)] # same order as above, but by chaining compound expressions - X[c>1, sum(a), by=c] # get rows where c>1 is TRUE, and on those rows, get sum(a) grouped by 'c' - X[Y, .(a, b), on="c"] # get rows where Y$c == X$c, and select columns 'X$a' and 'X$b' for those rows - X[Y, .(a, i.a), on="c"] # get rows where Y$c == X$c, and then select 'X$a' and 'Y$a' (=i.a) - X[Y, sum(a*i.a), on="c" by=.EACHI] # for *each* 'Y$c', get sum(a*i.a) on matching rows in 'X$c' - - X[, plot(a, b), by=c] # j accepts any expression, generates plot for each group and returns no data - # see ?assign to add/update/delete columns by reference using the same consistent interface -} - -A \code{data.table} is a \code{list} of vectors, just like a \code{data.frame}. However : -\enumerate{ -\item it never has or uses rownames. Rownames based indexing can be done by setting a \emph{key} of one or more columns or done \emph{ad-hoc} using the \code{on} argument (now preferred). -\item it has enhanced functionality in \code{[.data.table} for fast joins of keyed tables, fast aggregation, fast last observation carried forward (LOCF) and fast add/modify/delete of columns by reference with no copy at all. -} - -See the \code{see also} section for the several other \emph{methods} that are available for operating on data.tables efficiently. - -} -\references{ -\url{https://github.com/Rdatatable/data.table/wiki} (\code{data.table} homepage)\cr -\url{http://en.wikipedia.org/wiki/Binary_search} -} -\note{ If \code{keep.rownames} or \code{check.names} are supplied they must be written in full because \R does not allow partial argument names after `\code{\dots}`. For example, \code{data.table(DF, keep=TRUE)} will create a -column called \code{"keep"} containing \code{TRUE} and this is correct behaviour; \code{data.table(DF, keep.rownames=TRUE)} was intended. - -\code{POSIXlt} is not supported as a column type because it uses 40 bytes to store a single datetime. They are implicitly converted to \code{POSIXct} type with \emph{warning}. You may also be interested in \code{\link{IDateTime}} instead; it has methods to convert to and from \code{POSIXlt}. -} -\seealso{ \code{\link{special-symbols}}, \code{\link{data.frame}}, \code{\link{[.data.frame}}, \code{\link{as.data.table}}, \code{\link{setkey}}, \code{\link{setorder}}, \code{\link{setDT}}, \code{\link{setDF}}, \code{\link{J}}, \code{\link{SJ}}, \code{\link{CJ}}, \code{\link{merge.data.table}}, \code{\link{tables}}, \code{\link{test.data.table}}, \code{\link{IDateTime}}, \code{\link{unique.data.table}}, \code{\link{copy}}, \code{\link{:=}}, \code{\link{alloc.col}}, \code{\link{truelength}}, \code{\link{rbindlist}}, \code{\link{setNumericRounding}}, \code{\link{datatable-optimize}}, \code{\link{fsetdiff}}, \code{\link{funion}}, \code{\link{fintersect}}, \code{\link{fsetequal}}, \code{\link{anyDuplicated}}, \code{\link{uniqueN}}, \code{\link{rowid}}, \code{\link{rleid}}, \code{\link{na.omit}}, \code{\link{frank}} } -\examples{ -\dontrun{ -example(data.table) # to run these examples at the prompt} - -DF = data.frame(x=rep(c("b","a","c"),each=3), y=c(1,3,6), v=1:9) -DT = data.table(x=rep(c("b","a","c"),each=3), y=c(1,3,6), v=1:9) -DF -DT -identical(dim(DT), dim(DF)) # TRUE -identical(DF$a, DT$a) # TRUE -is.list(DF) # TRUE -is.list(DT) # TRUE - -is.data.frame(DT) # TRUE - -tables() - -# basic row subset operations -DT[2] # 2nd row -DT[3:2] # 3rd and 2nd row -DT[order(x)] # no need for order(DT$x) -DT[order(x), ] # same as above. The ',' is optional -DT[y>2] # all rows where DT$y > 2 -DT[y>2 & v>5] # compound logical expressions -DT[!2:4] # all rows other than 2:4 -DT[-(2:4)] # same - -# select|compute columns data.table way -DT[, v] # v column (as vector) -DT[, list(v)] # v column (as data.table) -DT[, .(v)] # same as above, .() is a shorthand alias to list() -DT[, sum(v)] # sum of column v, returned as vector -DT[, .(sum(v))] # same, but return data.table (column autonamed V1) -DT[, .(sv=sum(v))] # same, but column named "sv" -DT[, .(v, v*2)] # return two column data.table, v and v*2 - -# subset rows and select|compute data.table way -DT[2:3, sum(v)] # sum(v) over rows 2 and 3, return vector -DT[2:3, .(sum(v))] # same, but return data.table with column V1 -DT[2:3, .(sv=sum(v))] # same, but return data.table with column sv -DT[2:5, cat(v, "\n")] # just for j's side effect - -# select columns the data.frame way -DT[, 2, with=FALSE] # 2nd column, returns a data.table always -colNum = 2 -DT[, colNum, with=FALSE] # same, equivalent to DT[, .SD, .SDcols=colNum] -DT[["v"]] # same as DT[, v] but much faster - -# grouping operations - j and by -DT[, sum(v), by=x] # ad hoc by, order of groups preserved in result -DT[, sum(v), keyby=x] # same, but order the result on by cols -DT[, sum(v), by=x][order(x)] # same but by chaining expressions together - -# fast ad hoc row subsets (subsets as joins) -DT["a", on="x"] # same as x == "a" but uses binary search (fast) -DT["a", on=.(x)] # same, for convenience, no need to quote every column -DT[.("a"), on="x"] # same -DT[x=="a"] # same, single "==" internally optimised to use binary search (fast) -DT[x!="b" | y!=3] # not yet optimized, currently vector scan subset -DT[.("b", 3), on=c("x", "y")] # join on columns x,y of DT; uses binary search (fast) -DT[.("b", 3), on=.(x, y)] # same, but using on=.() -DT[.("b", 1:2), on=c("x", "y")] # no match returns NA -DT[.("b", 1:2), on=.(x, y), nomatch=0] # no match row is not returned -DT[.("b", 1:2), on=c("x", "y"), roll=Inf] # locf, nomatch row gets rolled by previous row -DT[.("b", 1:2), on=.(x, y), roll=-Inf] # nocb, nomatch row gets rolled by next row -DT["b", sum(v*y), on="x"] # on rows where DT$x=="b", calculate sum(v*y) - -# all together now -DT[x!="a", sum(v), by=x] # get sum(v) by "x" for each i != "a" -DT[!"a", sum(v), by=.EACHI, on="x"] # same, but using subsets-as-joins -DT[c("b","c"), sum(v), by=.EACHI, on="x"] # same -DT[c("b","c"), sum(v), by=.EACHI, on=.(x)] # same, using on=.() - -# joins as subsets -X = data.table(x=c("c","b"), v=8:7, foo=c(4,2)) -X - -DT[X, on="x"] # right join -X[DT, on="x"] # left join -DT[X, on="x", nomatch=0] # inner join -DT[!X, on="x"] # not join -DT[X, on=c(y="v")] # join using column "y" of DT with column "v" of X -DT[X, on="y==v"] # same as above (v1.9.8+) - -DT[X, on=.(y<=foo)] # NEW non-equi join (v1.9.8+) -DT[X, on="y<=foo"] # same as above -DT[X, on=c("y<=foo")] # same as above -DT[X, on=.(y>=foo)] # NEW non-equi join (v1.9.8+) -DT[X, on=.(x, y<=foo)] # NEW non-equi join (v1.9.8+) -DT[X, .(x,y,x.y,v), on=.(x, y>=foo)] # Select x's join columns as well - -DT[X, on="x", mult="first"] # first row of each group -DT[X, on="x", mult="last"] # last row of each group -DT[X, sum(v), by=.EACHI, on="x"] # join and eval j for each row in i -DT[X, sum(v)*foo, by=.EACHI, on="x"] # join inherited scope -DT[X, sum(v)*i.v, by=.EACHI, on="x"] # 'i,v' refers to X's v column -DT[X, on=.(x, v>=v), sum(y)*foo, by=.EACHI] # NEW non-equi join with by=.EACHI (v1.9.8+) - -# setting keys -kDT = copy(DT) # (deep) copy DT to kDT to work with it. -setkey(kDT,x) # set a 1-column key. No quotes, for convenience. -setkeyv(kDT,"x") # same (v in setkeyv stands for vector) -v="x" -setkeyv(kDT,v) # same -# key(kDT)<-"x" # copies whole table, please use set* functions instead -haskey(kDT) # TRUE -key(kDT) # "x" - -# fast *keyed* subsets -kDT["a"] # subset-as-join on *key* column 'x' -kDT["a", on="x"] # same, being explicit using 'on=' (preferred) - -# all together -kDT[!"a", sum(v), by=.EACHI] # get sum(v) for each i != "a" - -# multi-column key -setkey(kDT,x,y) # 2-column key -setkeyv(kDT,c("x","y")) # same - -# fast *keyed* subsets on multi-column key -kDT["a"] # join to 1st column of key -kDT["a", on="x"] # on= is optional, but is preferred -kDT[.("a")] # same, .() is an alias for list() -kDT[list("a")] # same -kDT[.("a", 3)] # join to 2 columns -kDT[.("a", 3:6)] # join 4 rows (2 missing) -kDT[.("a", 3:6), nomatch=0] # remove missing -kDT[.("a", 3:6), roll=TRUE] # locf rolling join -kDT[.("a", 3:6), roll=Inf] # same as above -kDT[.("a", 3:6), roll=-Inf] # nocb rolling join -kDT[!.("a")] # not join -kDT[!"a"] # same - -# more on special symbols, see also ?"special-symbols" -DT[.N] # last row -DT[, .N] # total number of rows in DT -DT[, .N, by=x] # number of rows in each group -DT[, .SD, .SDcols=x:y] # select columns 'x' and 'y' -DT[, .SD[1]] # first row of all columns -DT[, .SD[1], by=x] # first row of 'y' and 'v' for each group in 'x' -DT[, c(.N, lapply(.SD, sum)), by=x] # get rows *and* sum columns 'v' and 'y' by group -DT[, .I[1], by=x] # row number in DT corresponding to each group -DT[, grp := .GRP, by=x] # add a group counter column -X[, DT[.BY, y, on="x"], by=x] # join within each group - -# add/update/delete by reference (see ?assign) -print(DT[, z:=42L]) # add new column by reference -print(DT[, z:=NULL]) # remove column by reference -print(DT["a", v:=42L, on="x"]) # subassign to existing v column by reference -print(DT["b", v2:=84L, on="x"]) # subassign to new column by reference (NA padded) - -DT[, m:=mean(v), by=x][] # add new column by reference by group - # NB: postfix [] is shortcut to print() -# advanced usage -DT = data.table(x=rep(c("b","a","c"),each=3), v=c(1,1,1,2,2,1,1,2,2), y=c(1,3,6), a=1:9, b=9:1) - -DT[, sum(v), by=.(y\%\%2)] # expressions in by -DT[, sum(v), by=.(bool = y\%\%2)] # same, using a named list to change by column name -DT[, .SD[2], by=x] # get 2nd row of each group -DT[, tail(.SD,2), by=x] # last 2 rows of each group -DT[, lapply(.SD, sum), by=x] # sum of all (other) columns for each group -DT[, .SD[which.min(v)], by=x] # nested query by group - -DT[, list(MySum=sum(v), - MyMin=min(v), - MyMax=max(v)), - by=.(x, y\%\%2)] # by 2 expressions - -DT[, .(a = .(a), b = .(b)), by=x] # list columns -DT[, .(seq = min(a):max(b)), by=x] # j is not limited to just aggregations -DT[, sum(v), by=x][V1<20] # compound query -DT[, sum(v), by=x][order(-V1)] # ordering results -DT[, c(.N, lapply(.SD,sum)), by=x] # get number of observations and sum per group -DT[, {tmp <- mean(y); - .(a = a-tmp, b = b-tmp) - }, by=x] # anonymous lambda in 'j', j accepts any valid - # expression. TO REMEMBER: every element of - # the list becomes a column in result. -pdf("new.pdf") -DT[, plot(a,b), by=x] # can also plot in 'j' -dev.off() - -# using rleid, get max(y) and min of all cols in .SDcols for each consecutive run of 'v' -DT[, c(.(y=max(y)), lapply(.SD, min)), by=rleid(v), .SDcols=v:b] - -# Support guide and links: -# https://github.com/Rdatatable/data.table/wiki/Support - -\dontrun{ -if (interactive()) { - vignette("datatable-intro") - vignette("datatable-reference-semantics") - vignette("datatable-keys-fast-subset") - vignette("datatable-secondary-indices-and-auto-indexing") - vignette("datatable-reshape") - vignette("datatable-faq") - - test.data.table() # over 6,000 low level tests - - # keep up to date with latest stable version on CRAN - update.packages() - - # get the latest devel version (compiled binary for Windows available -- no tools needed) - # https://github.com/Rdatatable/data.table/wiki/Installation -} -}} -\keyword{ data } - diff --git a/man/datatable-optimize.Rd b/man/datatable-optimize.Rd deleted file mode 100644 index 346c3109e4..0000000000 --- a/man/datatable-optimize.Rd +++ /dev/null @@ -1,156 +0,0 @@ -\name{datatable.optimize} -\alias{datatable-optimize} -\alias{datatable.optimize} -\alias{data.table-optimize} -\alias{data.table.optimize} -\alias{gforce} -\alias{GForce} -\alias{autoindex} -\alias{autoindexing} -\alias{auto-index} -\alias{auto-indexing} -\alias{rounding} -\title{Optimisations in data.table} -\description{ -\code{data.table} internally optimises certain expressions in order to improve -performance. This section briefly summarises those optimisations. - -Note that there's no additional input needed from the user to take advantage -of these optimisations. They happen automatically. - -Run the code under the \emph{example} section to get a feel for the performance -benefits from these optimisations. - -} -\details{ -\code{data.table} reads the global option \code{datatable.optimize} to figure -out what level of optimisation is required. The default value \code{Inf} -activates \emph{all} available optimisations. - -At optimisation level \code{>= 1}, i.e., \code{getOption("datatable.optimize")} ->= 1, these are the optimisations: - -\itemize{ - \item The base function \code{order} is internally replaced with - \code{data.table}'s \emph{fast ordering}. That is, \code{DT[order(...)]} - gets internally optimised to \code{DT[forder(...)]}. - - \item The expression \code{DT[, lapply(.SD, fun), by=.]} gets optimised - to \code{DT[, list(fun(a), fun(b), ...), by=.]} where \code{a,b, ...} are - columns in \code{.SD}. This improves performance tremendously. - - \item Similarly, the expression \code{DT[, c(.N, lapply(.SD, fun)), by=.]} - gets optimised to \code{DT[, list(.N, fun(a), fun(b), ...)]}. \code{.N} is - just for example here. - - \item \code{base::mean} function is internally optimised to use - \code{data.table}'s \code{fastmean} function. \code{mean()} from \code{base} - is an S3 generic and gets slow with many groups. -} - -At optimisation level \code{>= 2}, i.e., \code{getOption("datatable.optimize")} >= 2, additional optimisations are implemented on top of the optimisations already shown above. - -\itemize{ - - \item Expressions in \code{j} which contain only the functions - \code{min, max, mean, median, var, sd, sum, prod, first, last, head, tail} (for example, - \code{DT[, list(mean(x), median(x), min(y), max(y)), by=z]}), they are very - effectively optimised using what we call \emph{GForce}. These functions - are automatically replaced with a corresponding GForce version - with pattern \code{g*}, e.g., \code{prod} becomes \code{gprod}. - - Normally, once the rows belonging to each group are identified, the values - corresponding to the group are gathered and the \code{j}-expression is - evaluated. This can be improved by computing the result directly without - having to gather the values or evaluating the expression for each group - (which can get costly with large number of groups) by implementing it - specifically for a particular function. As a result, it is extremely fast. - - \item In addition to all the functions above, `.N` is also optimised to - use GForce, when used separately or when combined with the functions mentioned - above. Note further that GForce-optimized functions must be used separately, - i.e., code like \code{DT[ , max(x) - min(x), by=z]} will \emph{not} currently - be optimized to use \code{gmax, gmin}. - - \item Expressions of the form \code{DT[i, j, by]} are also optimised when - \code{i} is a \emph{subset} operation and \code{j} is any/all of the functions - discussed above. -} - -At optimisation level \code{>= 3}, i.e., \code{getOption("datatable.optimize")} >= 3, additional optimisations for subsets in i are implemented on top of the optimisations already shown above. Subsetting operations are - if possible - translated into joins to make use of blazing fast binary search using indices and keys. The following queries are optimized: - -\itemize{ - - \item Supported operators: \code{==}, \code{\%in\%}. Non-equi operators(>, <, etc.) are not supported yet because non-equi joins are slower than vector based subsets. - \item Queries on multiple columns are supported, if the connector is '\code{&}', e.g. \code{DT[x == 2 & y == 3]} is supported, but \code{DT[x == 2 | y == 3]} is not. - \item Optimization will currently be turned off when doing subset when cross product of elements provided to filter on exceeds > 1e4. This most likely happens if multiple \code{\%in\%}, or \code{\%chin\%} queries are combined, e.g. \code{DT[x \%in\% 1:100 & y \%in\% 1:200]} will not be optimized since \code{100 * 200 = 2e4 > 1e4}. - \item Queries with multiple criteria on one column are \emph{not} supported, e.g. \code{DT[x == 2 & x \%in\% c(2,5)]} is not supported. - \item Queries with non-missing j are supported, e.g. \code{DT[x == 3 & y == 5, .(new = x-y)]} or \code{DT[x == 3 & y == 5, new := x-y]} are supported. Also extends to queries using \code{with = FALSE}. - \item "notjoin" queries, i.e. queries that start with \code{!}, are only supported if there are no \code{&} connections, e.g. \code{DT[!x==3]} is supported, but \code{DT[!x==3 & y == 4]} is not. -} - -If in doubt, whether your query benefits from optimization, call it with the \code{verbose = TRUE} argument. You should see "Optimized subsetting...". - -\bold{Auto indexing:} In case a query is optimized, but no appropriate key or index is found, \code{data.table} automatically creates an \emph{index} on the first run. Any successive subsets on the same -column then reuse this index to \emph{binary search} (instead of -\emph{vector scan}) and is therefore fast. -Auto indexing can be switched off with the global option -\code{options(datatable.auto.index = FALSE)}. To switch off using existing -indices set global option \code{options(datatable.use.index = FALSE)}. -} -\seealso{ \code{\link{setNumericRounding}}, \code{\link{getNumericRounding}} } -\examples{ -\dontrun{ -# Generate a big data.table with a relatively many columns -set.seed(1L) -DT = lapply(1:20, function(x) sample(c(-100:100), 5e6L, TRUE)) -setDT(DT)[, id := sample(1e5, 5e6, TRUE)] -print(object.size(DT), units="Mb") # 400MB, not huge, but will do - -# 'order' optimisation -options(datatable.optimize = 1L) # optimisation 'on' -system.time(ans1 <- DT[order(id)]) -options(datatable.optimize = 0L) # optimisation 'off' -system.time(ans2 <- DT[order(id)]) -identical(ans1, ans2) - -# optimisation of 'lapply(.SD, fun)' -options(datatable.optimize = 1L) # optimisation 'on' -system.time(ans1 <- DT[, lapply(.SD, min), by=id]) -options(datatable.optimize = 0L) # optimisation 'off' -system.time(ans2 <- DT[, lapply(.SD, min), by=id]) -identical(ans1, ans2) - -# optimisation of 'mean' -options(datatable.optimize = 1L) # optimisation 'on' -system.time(ans1 <- DT[, lapply(.SD, mean), by=id]) -system.time(ans2 <- DT[, lapply(.SD, base::mean), by=id]) -identical(ans1, ans2) - -# optimisation of 'c(.N, lapply(.SD, ))' -options(datatable.optimize = 1L) # optimisation 'on' -system.time(ans1 <- DT[, c(.N, lapply(.SD, min)), by=id]) -options(datatable.optimize = 0L) # optimisation 'off' -system.time(ans2 <- DT[, c(N=.N, lapply(.SD, min)), by=id]) -identical(ans1, ans2) - -# GForce -options(datatable.optimize = 2L) # optimisation 'on' -system.time(ans1 <- DT[, lapply(.SD, median), by=id]) -system.time(ans2 <- DT[, lapply(.SD, function(x) as.numeric(stats::median(x))), by=id]) -identical(ans1, ans2) - -# optimized subsets -options(datatable.optimize = 2L) -system.time(ans1 <- DT[id == 100L]) # vector scan -system.time(ans2 <- DT[id == 100L]) # vector scan -system.time(DT[id \%in\% 100:500]) # vector scan - -options(datatable.optimize = 3L) -system.time(ans1 <- DT[id == 100L]) # index + binary search subset -system.time(ans2 <- DT[id == 100L]) # only binary search subset -system.time(DT[id \%in\% 100:500]) # only binary search subset again - -}} -\keyword{ data } - diff --git a/man/dcast.data.table.Rd b/man/dcast.data.table.Rd deleted file mode 100644 index f19388089f..0000000000 --- a/man/dcast.data.table.Rd +++ /dev/null @@ -1,124 +0,0 @@ -\name{dcast.data.table} -\alias{dcast.data.table} -\alias{dcast} -\title{Fast dcast for data.table} -\description{ - \code{dcast.data.table} is a much faster version of \code{reshape2::dcast}, but for \code{data.table}s. More importantly, it's capable of handling very large data quite efficiently in terms of memory usage in comparison to \code{reshape2::dcast}. - - From 1.9.6, \code{dcast} is implemented as an S3 generic in \code{data.table}. To melt or cast \code{data.table}s, it is not necessary to load \code{reshape2} any more. If you have load \code{reshape2}, do so before loading \code{data.table} to prevent unwanted masking. - - \bold{NEW}: \code{dcast.data.table} can now cast multiple \code{value.var} columns and also accepts multiple functions to \code{fun.aggregate}. See Examples for more. -} - -% \method{dcast}{data.table} -\usage{ -\method{dcast}{data.table}(data, formula, fun.aggregate = NULL, sep = "_", - ..., margins = NULL, subset = NULL, fill = NULL, - drop = TRUE, value.var = guess(data), - verbose = getOption("datatable.verbose")) -} -\arguments{ - \item{data}{ A \code{data.table}.} - \item{formula}{A formula of the form LHS ~ RHS to cast, see Details.} - \item{fun.aggregate}{Should the data be aggregated before casting? If the formula doesn't identify a single observation for each cell, then aggregation defaults to \code{length} with a message. - - \bold{NEW}: it is possible to provide a list of functions to \code{fun.aggregate}. See Examples. } - \item{sep}{Character vector of length 1, indicating the separating character in variable names generated during casting. Default is \code{_} for backwards compatibility. } - \item{...}{Any other arguments that may be passed to the aggregating function.} - \item{margins}{Not implemented yet. Should take variable names to compute margins on. A value of \code{TRUE} would compute all margins.} - \item{subset}{Specified if casting should be done on a subset of the data. Ex: \code{subset = .(col1 <= 5)} or \code{subset = .(variable != "January")}.} - \item{fill}{Value with which to fill missing cells. If \code{fun.aggregate} is present, takes the value by applying the function on a 0-length vector.} - \item{drop}{\code{FALSE} will cast by including all missing combinations. - - \bold{NEW:} Following \href{https://github.com/Rdatatable/data.table/issues/1512}{#1512}, \code{c(FALSE, TRUE)} will only include all missing combinations of formula \code{LHS}. And \code{c(TRUE, FALSE)} will only include all missing combinations of formula RHS. See Examples.} - - \item{value.var}{Name of the column whose values will be filled to cast. Function `guess()` tries to, well, guess this column automatically, if none is provided. - - \bold{NEW}: it is now possible to cast multiple \code{value.var} columns simultaneously. See Examples. } - \item{verbose}{Not used yet. May be dropped in the future or used to provide informative messages through the console.} -} -\details{ -The cast formula takes the form \code{LHS ~ RHS}, ex: \code{var1 + var2 ~ var3}. The order of entries in the formula is essential. There are two special variables: \code{.} and \code{...}. \code{.} represents no variable; \code{...} represents all variables not otherwise mentioned in \code{formula}; see Examples. - -\code{dcast} also allows \code{value.var} columns of type \code{list}. - -When variable combinations in \code{formula} doesn't identify a unique value in a cell, \code{fun.aggregate} will have to be specified, which defaults to \code{length} if unspecified. The aggregating function should take a vector as input and return a single value (or a list of length one) as output. In cases where \code{value.var} is a list, the function should be able to handle a list input and provide a single value or list of length one as output. - -If the formula's LHS contains the same column more than once, ex: \code{dcast(DT, x+x~ y)}, then the answer will have duplicate names. In those cases, the duplicate names are renamed using \code{make.unique} so that key can be set without issues. - -Names for columns that are being cast are generated in the same order (separated by an underscore, \code{_}) from the (unique) values in each column mentioned in the formula RHS. - -From \code{v1.9.4}, \code{dcast} tries to preserve attributes wherever possible. - -\bold{NEW}: From \code{v1.9.6}, it is possible to cast multiple \code{value.var} columns and also cast by providing multiple \code{fun.aggregate} functions. Multiple \code{fun.aggregate} functions should be provided as a \code{list}, for e.g., \code{list(mean, sum, function(x) paste(x, collapse="")}. \code{value.var} can be either a character vector or list of length=1, or a list of length equal to \code{length(fun.aggregate)}. When \code{value.var} is a character vector or a list of length 1, each function mentioned under \code{fun.aggregate} is applied to every column specified under \code{value.var} column. When \code{value.var} is a list of length equal to \code{length(fun.aggregate)} each element of \code{fun.aggregate} is applied to each element of \code{value.var} column. - -} -\value{ - A keyed \code{data.table} that has been cast. The key columns are equal to the variables in the \code{formula} LHS in the same order. -} - -\examples{ -require(data.table) -names(ChickWeight) <- tolower(names(ChickWeight)) -DT <- melt(as.data.table(ChickWeight), id=2:4) # calls melt.data.table - -# dcast is a S3 method in data.table from v1.9.6 -dcast(DT, time ~ variable, fun=mean) -dcast(DT, diet ~ variable, fun=mean) -dcast(DT, diet+chick ~ time, drop=FALSE) -dcast(DT, diet+chick ~ time, drop=FALSE, fill=0) - -# using subset -dcast(DT, chick ~ time, fun=mean, subset=.(time < 10 & chick < 20)) - -# drop argument, #1512 -DT <- data.table(v1 = c(1.1, 1.1, 1.1, 2.2, 2.2, 2.2), - v2 = factor(c(1L, 1L, 1L, 3L, 3L, 3L), levels=1:3), - v3 = factor(c(2L, 3L, 5L, 1L, 2L, 6L), levels=1:6), - v4 = c(3L, 2L, 2L, 5L, 4L, 3L)) -# drop=TRUE -dcast(DT, v1 + v2 ~ v3) # default is drop=TRUE -dcast(DT, v1 + v2 ~ v3, drop=FALSE) # all missing combinations of both LHS and RHS -dcast(DT, v1 + v2 ~ v3, drop=c(FALSE, TRUE)) # all missing combinations of only LHS -dcast(DT, v1 + v2 ~ v3, drop=c(TRUE, FALSE)) # all missing combinations of only RHS - -# using . and ... -DT <- data.table(v1 = rep(1:2, each = 6), - v2 = rep(rep(1:3, 2), each = 2), - v3 = rep(1:2, 6), - v4 = rnorm(6)) -dcast(DT, ... ~ v3, value.var = "v4") #same as v1 + v2 ~ v3, value.var = "v4" -dcast(DT, v1 + v2 + v3 ~ ., value.var = "v4") - -## for each combination of (v1, v2), add up all values of v4 -dcast(DT, v1 + v2 ~ ., value.var = "v4", fun.aggregate = sum) - -\dontrun{ -# benchmark against reshape2's dcast, minimum of 3 runs -set.seed(45) -DT <- data.table(aa=sample(1e4, 1e6, TRUE), - bb=sample(1e3, 1e6, TRUE), - cc = sample(letters, 1e6, TRUE), dd=runif(1e6)) -system.time(dcast(DT, aa ~ cc, fun=sum)) # 0.12 seconds -system.time(dcast(DT, bb ~ cc, fun=mean)) # 0.04 seconds -# reshape2::dcast takes 31 seconds -system.time(dcast(DT, aa + bb ~ cc, fun=sum)) # 1.2 seconds -} - -# NEW FEATURE - multiple value.var and multiple fun.aggregate -DT = data.table(x=sample(5,20,TRUE), y=sample(2,20,TRUE), - z=sample(letters[1:2], 20,TRUE), d1 = runif(20), d2=1L) -# multiple value.var -dcast(DT, x + y ~ z, fun=sum, value.var=c("d1","d2")) -# multiple fun.aggregate -dcast(DT, x + y ~ z, fun=list(sum, mean), value.var="d1") -# multiple fun.agg and value.var (all combinations) -dcast(DT, x + y ~ z, fun=list(sum, mean), value.var=c("d1", "d2")) -# multiple fun.agg and value.var (one-to-one) -dcast(DT, x + y ~ z, fun=list(sum, mean), value.var=list("d1", "d2")) -} -\seealso{ - \code{\link{melt.data.table}}, \code{\link{rowid}}, \url{https://cran.r-project.org/package=reshape} -} -\keyword{data} - diff --git a/man/duplicated.Rd b/man/duplicated.Rd deleted file mode 100644 index 62ba05f64f..0000000000 --- a/man/duplicated.Rd +++ /dev/null @@ -1,129 +0,0 @@ -\name{duplicated} -\alias{duplicated} -\alias{duplicated.data.table} -\alias{unique} -\alias{unique.data.table} -\alias{anyDuplicated} -\alias{anyDuplicated.data.table} -\alias{uniqueN} -\title{ Determine Duplicate Rows } -\description{ -\code{duplicated} returns a logical vector indicating which rows of a -\code{data.table} are duplicates of a row with smaller subscripts. - -\code{unique} returns a \code{data.table} with duplicated rows removed, by -columns specified in \code{by} argument. When no \code{by} then duplicated -rows by all columns are removed. - -\code{anyDuplicated} returns the \emph{index} \code{i} of the first duplicated -entry if there is one, and 0 otherwise. - -\code{uniqueN} is equivalent to \code{length(unique(x))} when x is an -\code{atomic vector}, and \code{nrow(unique(x))} when x is a \code{data.frame} -or \code{data.table}. The number of unique rows are computed directly without -materialising the intermediate unique data.table and is therefore faster and -memory efficient. - -} -\usage{ -\method{duplicated}{data.table}(x, incomparables=FALSE, fromLast=FALSE, by=seq_along(x), ...) - -\method{unique}{data.table}(x, incomparables=FALSE, fromLast=FALSE, by=seq_along(x), ...) - -\method{anyDuplicated}{data.table}(x, incomparables=FALSE, fromLast=FALSE, by=seq_along(x), ...) - -uniqueN(x, by=if (is.list(x)) seq_along(x) else NULL, na.rm=FALSE) -} -\arguments{ -\item{x}{ A data.table. \code{uniqueN} accepts atomic vectors and data.frames -as well.} -\item{\dots}{ Not used at this time. } -\item{incomparables}{ Not used. Here for S3 method consistency. } -\item{fromLast}{ logical indicating if duplication should be considered from -the reverse side, i.e., the last (or rightmost) of identical elements would -correspond to \code{duplicated = FALSE}.} -\item{by}{\code{character} or \code{integer} vector indicating which combinations -of columns from \code{x} to use for uniqueness checks. By default all columns are -are being used. That was changed recently for consistency to data.frame methods. -In version \code{< 1.9.8} default was \code{key(x)}.} -\item{na.rm}{Logical (default is \code{FALSE}). Should missing values (including -\code{NaN}) be removed?} -} -\details{ -Because data.tables are usually sorted by key, tests for duplication are -especially quick when only the keyed columns are considered. Unlike -\code{\link[base]{unique.data.frame}}, \code{paste} is not used to ensure -equality of floating point data. It is instead accomplished directly and is -therefore quite fast. data.table provides \code{\link{setNumericRounding}} to -handle cases where limitations in floating point representation is undesirable. - -\code{v1.9.4} introduces \code{anyDuplicated} method for data.tables and is -similar to base in functionality. It also implements the logical argument -\code{fromLast} for all three functions, with default value \code{FALSE}. -} -\value{ -\code{duplicated} returns a logical vector of length \code{nrow(x)} -indicating which rows are duplicates. - -\code{unique} returns a data table with duplicated rows removed. - -\code{anyDuplicated} returns a integer value with the index of first duplicate. -If none exists, 0L is returned. - -\code{uniqueN} returns the number of unique elements in the vector, -\code{data.frame} or \code{data.table}. - -} -\seealso{ \code{\link{setNumericRounding}}, \code{\link{data.table}}, -\code{\link{duplicated}}, \code{\link{unique}}, \code{\link{all.equal}}, -\code{\link{fsetdiff}}, \code{\link{funion}}, \code{\link{fintersect}}, -\code{\link{fsetequal}} -} -\examples{ -DT <- data.table(A = rep(1:3, each=4), B = rep(1:4, each=3), - C = rep(1:2, 6), key = "A,B") -duplicated(DT) -unique(DT) - -duplicated(DT, by="B") -unique(DT, by="B") - -duplicated(DT, by=c("A", "C")) -unique(DT, by=c("A", "C")) - -DT = data.table(a=c(2L,1L,2L), b=c(1L,2L,1L)) # no key -unique(DT) # rows 1 and 2 (row 3 is a duplicate of row 1) - -DT = data.table(a=c(3.142, 4.2, 4.2, 3.142, 1.223, 1.223), b=rep(1,6)) -unique(DT) # rows 1,2 and 5 - -DT = data.table(a=tan(pi*(1/4 + 1:10)), b=rep(1,10)) # example from ?all.equal -length(unique(DT$a)) # 10 strictly unique floating point values -all.equal(DT$a,rep(1,10)) # TRUE, all within tolerance of 1.0 -DT[,which.min(a)] # row 10, the strictly smallest floating point value -identical(unique(DT),DT[1]) # TRUE, stable within tolerance -identical(unique(DT),DT[10]) # FALSE - -# fromLast=TRUE -DT <- data.table(A = rep(1:3, each=4), B = rep(1:4, each=3), - C = rep(1:2, 6), key = "A,B") -duplicated(DT, by="B", fromLast=TRUE) -unique(DT, by="B", fromLast=TRUE) - -# anyDuplicated -anyDuplicated(DT, by=c("A", "B")) # 3L -any(duplicated(DT, by=c("A", "B"))) # TRUE - -# uniqueN, unique rows on key columns -uniqueN(DT, by = key(DT)) -# uniqueN, unique rows on all columns -uniqueN(DT) -# uniqueN while grouped by "A" -DT[, .(uN=uniqueN(.SD)), by=A] - -# uniqueN's na.rm=TRUE -x = sample(c(NA, NaN, runif(3)), 10, TRUE) -uniqueN(x, na.rm = FALSE) # 5, default -uniqueN(x, na.rm=TRUE) # 3 -} -\keyword{ data } diff --git a/man/first.Rd b/man/first.Rd deleted file mode 100644 index 7d4d4b8112..0000000000 --- a/man/first.Rd +++ /dev/null @@ -1,34 +0,0 @@ -\name{first} -\alias{first} -\title{ First item of an object } -\description{ -Returns the first item of a vector or list, or the first row of a data.frame -or data.table. -} -\usage{ -first(x, ...) -} -\arguments{ -\item{x}{ A vector, list, data.frame or data.table. Otherwise the S3 method -of \code{xts::first} is deployed. } -\item{...}{ Not applicable for \code{data.table::first}. Any arguments here -are passed through to \code{xts::first}. } -} -\value{ -If no other arguments are supplied it depends on the type of x. The first item -of a vector or list. The first row of a \code{data.frame} or \code{data.table}. -Otherwise, whatever \code{xts::first} returns (if package xts has been loaded, -otherwise a helpful error). - -If any argument is supplied in addition to \code{x} (such as \code{n} or -\code{keep} in \code{xts::first}), regardless of \code{x}'s type, then -\code{xts::first} is called if xts has been loaded, otherwise a helpful error. -} -\seealso{ \code{\link{NROW}}, \code{\link{head}}, \code{\link{tail}}, -\code{\link{last}} } -\examples{ -first(1:5) # [1] 1 -x = data.table(x=1:5, y=6:10) -first(x) # same as x[1] -} -\keyword{ data } diff --git a/man/foverlaps.Rd b/man/foverlaps.Rd deleted file mode 100644 index b42633f7d9..0000000000 --- a/man/foverlaps.Rd +++ /dev/null @@ -1,163 +0,0 @@ -\name{foverlaps} -\alias{foverlaps} -\title{Fast overlap joins} -\description{ -A \emph{fast} binary-search based \emph{overlap join} of two \code{data.table}s. -This is very much inspired by \code{findOverlaps} function from the Bioconductor -package \code{IRanges} (see link below under \code{See Also}). - -Usually, \code{x} is a very large data.table with small interval ranges, and -\code{y} is much smaller \emph{keyed} \code{data.table} with relatively larger -interval spans. For a usage in \code{genomics}, see the examples section. - -NOTE: This is still under development, meaning it's stable, but some features -are yet to be implemented. Also, some arguments and/or the function name itself -could be changed. -} - -\usage{ -foverlaps(x, y, by.x = if (!is.null(key(x))) key(x) else key(y), - by.y = key(y), maxgap = 0L, minoverlap = 1L, - type = c("any", "within", "start", "end", "equal"), - mult = c("all", "first", "last"), - nomatch = getOption("datatable.nomatch"), - which = FALSE, verbose = getOption("datatable.verbose")) -} -\arguments{ -\item{x, y}{ \code{data.table}s. \code{y} needs to be keyed, but not necessarily -\code{x}. See examples. } -\item{by.x, by.y}{A vector of column names (or numbers) to compute the overlap -joins. The last two columns in both \code{by.x} and \code{by.y} should each -correspond to the \code{start} and \code{end} interval columns in \code{x} and -\code{y} respectively. And the \code{start} column should always be <= \code{end} -column. If \code{x} is keyed, \code{by.x} is equal to \code{key(x)}, else -\code{key(y)}. \code{by.y} defaults to \code{key(y)}. } -\item{maxgap}{It should be a non-negative integer value, >= 0. Default is 0 (no -gap). For intervals \code{[a,b]} and \code{[c,d]}, where \code{a<=b} and -\code{c<=d}, when \code{c > b} or \code{d < a}, the two intervals don't overlap. -If the gap between these two intervals is \code{<= maxgap}, these two intervals -are considered as overlapping. Note: This is not yet implemented.} -\item{minoverlap}{ It should be a positive integer value, > 0. Default is 1. For -intervals \code{[a,b]} and \code{[c,d]}, where \code{a<=b} and \code{c<=d}, when -\code{c<=b} and \code{d>=a}, the two intervals overlap. If the length of overlap -between these two intervals is \code{>= minoverlap}, then these two intervals are -considered to be overlapping. Note: This is not yet implemented.} -\item{type}{ Default value is \code{any}. Allowed values are \code{any}, -\code{within}, \code{start}, \code{end} and \code{equal}. Note: \code{equal} is -not yet implemented. But this is just a normal join of the type \code{y[x, ...]}, -unless you require also using \code{maxgap} and \code{minoverlap} arguments. - -The types shown here are identical in functionality to the function -\code{findOverlaps} in the bioconductor package \code{IRanges}. Let \code{[a,b]} -and \code{[c,d]} be intervals in \code{x} and \code{y} with \code{a<=b} and -\code{c<=d}. For \code{type="start"}, the intervals overlap iff \code{a == c}. -For \code{type="end"}, the intervals overlap iff \code{b == d}. For -\code{type="within"}, the intervals overlap iff \code{a>=c and b<=d}. For -\code{type="equal"}, the intervals overlap iff \code{a==c and b==d}. For -\code{type="any"}, as long as \code{c<=b and d>=a}, they overlap. In addition -to these requirements, they also have to satisfy the \code{minoverlap} argument -as explained above. - -NB: \code{maxgap} argument, when > 0, is to be interpreted according to the type -of the overlap. This will be updated once \code{maxgap} is implemented.} - -\item{mult}{ When multiple rows in \code{y} match to the row in \code{x}, -\code{mult=.} controls which values are returned - \code{"all"} (default), -\code{"first"} or \code{"last"}.} -\item{nomatch}{ Same as \code{nomatch} in \code{\link{match}}. When a row (with -interval say, \code{[a,b]}) in \code{x} has no match in \code{y}, \code{nomatch=NA} -(default) means \code{NA} is returned for \code{y}'s non-\code{by.y} columns for -that row of \code{x}. \code{nomatch=0} means no rows will be returned for that -row of \code{x}. The default value (used when \code{nomatch} is not supplied) -can be changed from \code{NA} to \code{0} using \code{options(datatable.nomatch=0)}.} -\item{which}{ When \code{TRUE}, if \code{mult="all"} returns a two column -\code{data.table} with the first column corresponding to \code{x}'s row number -and the second corresponding to \code{y}'s. when \code{nomatch=NA}, no matches -return \code{NA} for \code{y}, and if \code{nomatch=0}, those rows where no -match is found will be skipped; if \code{mult="first" or "last"}, a vector of -length equal to the number of rows in \code{x} is returned, with no-match entries -filled with \code{NA} or \code{0} corresponding to the \code{nomatch} argument. -Default is \code{FALSE}, which returns a join with the rows in \code{y}.} -\item{verbose}{ \code{TRUE} turns on status and information messages to the -console. Turn this on by default using \code{options(datatable.verbose=TRUE)}. -The quantity and types of verbosity may be expanded in future.} -} -\details{ -Very briefly, \code{foverlaps()} collapses the two-column interval in \code{y} -to one-column of \emph{unique} values to generate a \code{lookup} table, and -then performs the join depending on the type of \code{overlap}, using the -already available \code{binary search} feature of \code{data.table}. The time -(and space) required to generate the \code{lookup} is therefore proportional -to the number of unique values present in the interval columns of \code{y} -when combined together. - -Overlap joins takes advantage of the fact that \code{y} is sorted to speed-up -finding overlaps. Therefore \code{y} has to be keyed (see \code{?setkey}) -prior to running \code{foverlaps()}. A key on \code{x} is not necessary, -although it \emph{might} speed things further. The columns in \code{by.x} -argument should correspond to the columns specified in \code{by.y}. The last -two columns should be the \emph{interval} columns in both \code{by.x} and -\code{by.y}. The first interval column in \code{by.x} should always be <= the -second interval column in \code{by.x}, and likewise for \code{by.y}. The -\code{\link{storage.mode}} of the interval columns must be either \code{double} -or \code{integer}. It therefore works with \code{bit64::integer64} type as well. - -The \code{lookup} generation step could be quite time consuming if the number -of unique values in \code{y} are too large (ex: in the order of tens of millions). -There might be improvements possible by constructing lookup using RLE, which is -a pending feature request. However most scenarios will not have too many unique -values for \code{y}. -} -\value{ -A new \code{data.table} by joining over the interval columns (along with other -additional identifier columns) specified in \code{by.x} and \code{by.y}. - -NB: When \code{which=TRUE}: \code{a)} \code{mult="first" or "last"} returns a -\code{vector} of matching row numbers in \code{y}, and \code{b)} when -\code{mult="all"} returns a data.table with two columns with the first -containing row numbers of \code{x} and the second column with corresponding -row numbers of \code{y}. - -\code{nomatch=NA or 0} also influences whether non-matching rows are returned -or not, as explained above. -} - -\examples{ -require(data.table) -## simple example: -x = data.table(start=c(5,31,22,16), end=c(8,50,25,18), val2 = 7:10) -y = data.table(start=c(10, 20, 30), end=c(15, 35, 45), val1 = 1:3) -setkey(y, start, end) -foverlaps(x, y, type="any", which=TRUE) ## return overlap indices -foverlaps(x, y, type="any") ## return overlap join -foverlaps(x, y, type="any", mult="first") ## returns only first match -foverlaps(x, y, type="within") ## matches iff 'x' is within 'y' - -## with extra identifiers (ex: in genomics) -x = data.table(chr=c("Chr1", "Chr1", "Chr2", "Chr2", "Chr2"), - start=c(5,10, 1, 25, 50), end=c(11,20,4,52,60)) -y = data.table(chr=c("Chr1", "Chr1", "Chr2"), start=c(1, 15,1), - end=c(4, 18, 55), geneid=letters[1:3]) -setkey(y, chr, start, end) -foverlaps(x, y, type="any", which=TRUE) -foverlaps(x, y, type="any") -foverlaps(x, y, type="any", nomatch=0L) -foverlaps(x, y, type="within", which=TRUE) -foverlaps(x, y, type="within") -foverlaps(x, y, type="start") - -## x and y have different column names - specify by.x -x = data.table(seq=c("Chr1", "Chr1", "Chr2", "Chr2", "Chr2"), - start=c(5,10, 1, 25, 50), end=c(11,20,4,52,60)) -y = data.table(chr=c("Chr1", "Chr1", "Chr2"), start=c(1, 15,1), - end=c(4, 18, 55), geneid=letters[1:3]) -setkey(y, chr, start, end) -foverlaps(x, y, by.x=c("seq", "start", "end"), - type="any", which=TRUE) -} -\seealso{ -\code{\link{data.table}}, -\url{http://www.bioconductor.org/packages/release/bioc/html/IRanges.html}, -\code{\link{setNumericRounding}} -} -\keyword{ data } diff --git a/man/frank.Rd b/man/frank.Rd deleted file mode 100644 index d66f804202..0000000000 --- a/man/frank.Rd +++ /dev/null @@ -1,71 +0,0 @@ -\name{frank} -\alias{frank} -\alias{frankv} -\alias{rank} -\title{Fast rank} -\description{ - Similar to \code{base::rank} but \emph{much faster}. And it accepts vectors, lists, data.frames or data.tables as input. In addition to the \code{ties.method} possibilities provided by \code{base::rank}, it also provides \code{ties.method="dense"}. - - \code{bit64::integer64} type is also supported. -} - -\usage{ -frank(x, ..., na.last=TRUE, ties.method=c("average", - "first", "random", "max", "min", "dense")) - -frankv(x, cols=seq_along(x), order=1L, na.last=TRUE, - ties.method=c("average", "first", "random", - "max", "min", "dense")) - -} -\arguments{ - \item{x}{ A vector, or list with all it's elements identical in length or data.frame or data.table. } - \item{...}{ Only for lists, data.frames and data.tables. The columns to calculate ranks based on. Do not quote column names. If ... is missing, all columns are considered by default. To sort by a column in descending order prefix a "-", e.g., frank(x, a, -b, c). The -b works when b is of type character as well.} - \item{cols}{ A character vector of column names (or numbers) of x, to which obtain ranks for. } - \item{order}{ An integer vector with only possible values of 1 and -1, corresponding to ascending and descending order. The length of order must be either 1 or equal to that of cols. If length(order) == 1, it's recycled to length(cols). } - \item{na.last}{ Control treatment of \code{NA}s. If \code{TRUE}, missing values in the data are put last; if \code{FALSE}, they are put first; if \code{NA}, they are removed; if \code{"keep"} they are kept with rank \code{NA}. } - \item{ties.method}{ A character string specifying how ties are treated, see \code{Details}. } -} -\details{ - To be consistent with other \code{data.table} operations, \code{NA}s are considered identical to other \code{NA}s (and \code{NaN}s to other \code{NaN}s), unlike \code{base::rank}. Therefore, for \code{na.last=TRUE} and \code{na.last=FALSE}, \code{NA}s (and \code{NaN}s) are given identical ranks, unlike \code{\link[base]{rank}}. - - \code{frank} is not limited to vectors. It accepts data.tables (and lists and data.frames) as well. It accepts unquoted column names (with names preceded with a \code{-} sign for descending order, even on character vectors), for e.g., \code{frank(DT, a, -b, c, ties.method="first")} where \code{a,b,c} are columns in \code{DT}. The equivalent in \code{frankv} is the \code{order} argument. - - In addition to the \code{ties.method} values possible using base's \code{\link[base]{rank}}, it also provides another additional argument \emph{"dense"} which returns the ranks without any gaps in the ranking. See examples. -} -\value{ - A numeric vector of length equal to \code{NROW(x)} (unless \code{na.last = NA}, when missing values are removed). The vector is of integer type unless \code{ties.method = "average"} when it is of double type (irrespective of ties). -} - -\examples{ -# on vectors -x = c(4, 1, 4, NA, 1, NA, 4) -# NAs are considered identical (unlike base R) -# default is average -frankv(x) # na.last=TRUE -frankv(x, na.last=FALSE) - -# ties.method = min -frankv(x, ties.method="min") -# ties.method = dense -frankv(x, ties.method="dense") - -# on data.table -DT = data.table(x, y=c(1, 1, 1, 0, NA, 0, 2)) -frankv(DT, cols="x") # same as frankv(x) from before -frankv(DT, cols="x", na.last="keep") -frankv(DT, cols="x", ties.method="dense", na.last=NA) -frank(DT, x, ties.method="dense", na.last=NA) # equivalent of above using frank -# on both columns -frankv(DT, ties.method="first", na.last="keep") -frank(DT, ties.method="first", na.last="keep") # equivalent of above using frank - -# order argument -frank(DT, x, -y, ties.method="first") -# equivalent of above using frankv -frankv(DT, order=c(1L, -1L), ties.method="first") -} -\seealso{ - \code{\link{data.table}}, \code{\link{setkey}}, \code{\link{setorder}} -} -\keyword{ data } diff --git a/man/fread.Rd b/man/fread.Rd deleted file mode 100644 index fb75bd405b..0000000000 --- a/man/fread.Rd +++ /dev/null @@ -1,295 +0,0 @@ -\name{fread} -\alias{fread} -\title{ Fast and friendly file finagler } -\description{ - Similar to \code{read.table} but faster and more convenient. All controls such as \code{sep}, \code{colClasses} and \code{nrows} are automatically detected. \code{bit64::integer64} types are also detected and read directly without needing to read as character before converting. - - Dates are read as character currently. They can be converted afterwards using the excellent \code{fasttime} package or standard base functions. - - `fread` is for \emph{regular} delimited files; i.e., where every row has the same number of columns. In future, secondary separator (\code{sep2}) may be specified \emph{within} each column. Such columns will be read as type \code{list} where each cell is itself a vector. -} -\usage{ -fread(input, file, sep="auto", sep2="auto", dec=".", quote="\"", -nrows=Inf, header="auto", -na.strings=getOption("datatable.na.strings","NA"), # due to change to ""; see NEWS -stringsAsFactors=FALSE, verbose=getOption("datatable.verbose", FALSE), -skip="__auto__", select=NULL, drop=NULL, colClasses=NULL, -integer64=getOption("datatable.integer64", "integer64"), -col.names, -check.names=FALSE, encoding="unknown", -strip.white=TRUE, fill=FALSE, blank.lines.skip=FALSE, -key=NULL, index=NULL, -showProgress=interactive(), -data.table=getOption("datatable.fread.datatable", TRUE), -nThread=getDTthreads(), -logical01=getOption("datatable.logical01", FALSE), # due to change to TRUE; see NEWS -autostart=NA -) -} -\arguments{ - \item{input}{ Either the file name to read (containing no \\n character), a shell command that pre-processes the file (e.g. \code{fread("grep blah filename"))} or the input itself as a string (containing at least one \\n), see examples. In both cases, a length 1 character string. A filename input is passed through \code{\link[base]{path.expand}} for convenience. \code{input} can also be a URL starting with http:// or file://; see Details. } - \item{sep}{ The separator between columns. Defaults to the character in the set \code{[,\\t |;:]} that separates the sample of rows into the most number of lines with the same number of fields. Use \code{NULL} or \code{""} to specify no separator; i.e. each line a single character column like \code{base::readLines} does.} - \item{sep2}{ The separator \emph{within} columns. A \code{list} column will be returned where each cell is a vector of values. This is much faster using less working memory than \code{strsplit} afterwards or similar techniques. For each column \code{sep2} can be different and is the first character in the same set above [\code{,\\t |;}], other than \code{sep}, that exists inside each field outside quoted regions in the sample. NB: \code{sep2} is not yet implemented. } - \item{nrows}{ The maximum number of rows to read. Unlike \code{read.table}, you do not need to set this to an estimate of the number of rows in the file for better speed because that is already automatically determined by \code{fread} almost instantly using the large sample of lines. `nrows=0` returns the column names and typed empty columns determined by the large sample; useful for a dry run of a large file or to quickly check format consistency of a set of files before starting to read any of them. } - \item{header}{ Does the first data line contain column names? Defaults according to whether every non-empty field on the first data line is type character. If so, or TRUE is supplied, any empty column names are given a default name. } - \item{na.strings}{ A character vector of strings which are to be interpreted as \code{NA} values. By default, \code{",,"} for columns of all types, including type `character` is read as \code{NA} for consistency. \code{,"",} is unambiguous and read as an empty string. To read \code{,NA,} as \code{NA}, set \code{na.strings="NA"}. To read \code{,,} as blank string \code{""}, set \code{na.strings=NULL}. When they occur in the file, the strings in \code{na.strings} should not appear quoted since that is how the string literal \code{,"NA",} is distinguished from \code{,NA,}, for example, when \code{na.strings="NA"}. } - \item{file}{ File path, useful when we want to ensure that no shell commands will be executed. File path can also be provided to \code{input} argument. } - \item{stringsAsFactors}{ Convert all character columns to factors? } - \item{verbose}{ Be chatty and report timings? } - \item{skip}{ If 0 (default) start on the first line and from there finds the first row with a consistent number of columns. This automatically avoids irregular header information before the column names row. \code{skip>0} means ignore the first \code{skip} rows manually. \code{skip="string"} searches for \code{"string"} in the file (e.g. a substring of the column names row) and starts on that line (inspired by read.xls in package gdata). } - \item{select}{ Vector of column names or numbers to keep, drop the rest. } - \item{drop}{ Vector of column names or numbers to drop, keep the rest. } - \item{colClasses}{ A character vector of classes (named or unnamed), as read.csv. Or a named list of vectors of column names or numbers, see examples. colClasses in fread is intended for rare overrides, not for routine use. fread will only promote a column to a higher type if colClasses requests it. It won't downgrade a column to a lower type since NAs would result. You have to coerce such columns afterwards yourself, if you really require data loss. } - \item{integer64}{ "integer64" (default) reads columns detected as containing integers larger than 2^31 as type \code{bit64::integer64}. Alternatively, \code{"double"|"numeric"} reads as \code{base::read.csv} does; i.e., possibly with loss of precision and if so silently. Or, "character". } - \item{dec}{ The decimal separator as in \code{base::read.csv}. If not "." (default) then usually ",". See details. } - \item{col.names}{ A vector of optional names for the variables (columns). The default is to use the header column if present or detected, or if not "V" followed by the column number. This is applied after \code{check.names} and before \code{key} and \code{index}. } - \item{check.names}{default is \code{FALSE}. If \code{TRUE} then the names of the variables in the \code{data.table} are checked to ensure that they are syntactically valid variable names. If necessary they are adjusted (by \code{\link{make.names}}) so that they are, and also to ensure that there are no duplicates.} - \item{encoding}{ default is \code{"unknown"}. Other possible options are \code{"UTF-8"} and \code{"Latin-1"}. Note: it is not used to re-encode the input, rather enables handling of encoded strings in their native encoding. } - \item{quote}{ By default (\code{"\""}), if a field starts with a double quote, \code{fread} handles embedded quotes robustly as explained under \code{Details}. If it fails, then another attempt is made to read the field \emph{as is}, i.e., as if quotes are disabled. By setting \code{quote=""}, the field is always read as if quotes are disabled. It is not expected to ever need to pass anything other than \"\" to quote; i.e., to turn it off. } - \item{strip.white}{ default is \code{TRUE}. Strips leading and trailing whitespaces of unquoted fields. If \code{FALSE}, only header trailing spaces are removed. } - \item{fill}{logical (default is \code{FALSE}). If \code{TRUE} then in case the rows have unequal length, blank fields are implicitly filled.} - \item{blank.lines.skip}{\code{logical}, default is \code{FALSE}. If \code{TRUE} blank lines in the input are ignored.} - \item{key}{Character vector of one or more column names which is passed to \code{\link{setkey}}. It may be a single comma separated string such as \code{key="x,y,z"}, or a vector of names such as \code{key=c("x","y","z")}. Only valid when argument \code{data.table=TRUE}. Where applicable, this should refer to column names given in \code{col.names}. } - \item{index}{ Character vector or list of character vectors of one or more column names which is passed to \code{\link{setindexv}}. As with \code{key}, comma-separated notation like \code{index="x,y,z"} is accepted for convenience. Only valid when argument \code{data.table=TRUE}. Where applicable, this should refer to column names given in \code{col.names}. } - \item{showProgress}{ \code{TRUE} displays progress on the console if the ETA is greater than 3 seconds. It is produced in fread's C code where the very nice (but R level) txtProgressBar and tkProgressBar are not easily available. } - \item{data.table}{ TRUE returns a \code{data.table}. FALSE returns a \code{data.frame}. } - \item{nThread}{The number of threads to use. Experiment to see what works best for your data on your hardware.} - \item{logical01}{If TRUE a column containing only 0s and 1s will be read as logical, otherwise as integer.} - \item{autostart}{ Deprecated and ignored with warning. Please use \code{skip} instead. } -} -\details{ - -A sample of 10,000 rows is used for a very good estimate of column types. 100 contiguous rows are read from 100 equally spaced points throughout the file including the beginning, middle and the very end. This results in a better guess when a column changes type later in the file (e.g. blank at the beginning/only populated near the end, or 001 at the start but 0A0 later on). This very good type guess enables a single allocation of the correct type up front once for speed, memory efficiency and convenience of avoiding the need to set \code{colClasses} after an error. Even though the sample is large and jumping over the file, it is almost instant regardless of the size of the file because a lazy on-demand memory map is used. If a jump lands inside a quoted field containing newlines, each newline is tested until 5 lines are found following it with the expected number of fields. The lowest type for each column is chosen from the ordered list: \code{logical}, \code{integer}, \code{integer64}, \code{double}, \code{character}. Rarely, the file may contain data of a higher type in rows outside the sample (referred to as an out-of-sample type exception). In this event \code{fread} will \emph{automatically} reread just those columns from the beginning so that you don't have the inconvenience of having to set \code{colClasses} yourself; particularly helpful if you have a lot of columns. Such columns must be read from the beginning to correctly distinguish "00" from "000" when those have both been interpreted as integer 0 due to the sample but 00A occurs out of sample. Set \code{verbose=TRUE} to see a detailed report of the logic deployed to read your file. - -There is no line length limit, not even a very large one. Since we are encouraging \code{list} columns (i.e. \code{sep2}) this has the potential to encourage longer line lengths. So the approach of scanning each line into a buffer first and then rescanning that buffer is not used. There are no buffers used in \code{fread}'s C code at all. The field width limit is limited by R itself: the maximum width of a character string (currently 2^31-1 bytes, 2GB). - -The filename extension (such as .csv) is irrelevant for "auto" \code{sep} and \code{sep2}. Separator detection is entirely driven by the file contents. This can be useful when loading a set of different files which may not be named consistently, or may not have the extension .csv despite being csv. Some datasets have been collected over many years, one file per day for example. Sometimes the file name format has changed at some point in the past or even the format of the file itself. So the idea is that you can loop \code{fread} through a set of files and as long as each file is regular and delimited, \code{fread} can read them all. Whether they all stack is another matter but at least each one is read quickly without you needing to vary \code{colClasses} in \code{read.table} or \code{read.csv}. - -If an empty line is encountered then reading stops there with warning if any text exists after the empty line such as a footer. The first line of any text discarded is included in the warning message. Unless, it is single-column input. In that case blank lines are significant (even at the very end) and represent NA in the single column. So that \code{fread(fwrite(DT))==DT}. This default behaviour can be controlled using \code{blank.lines.skip=TRUE|FALSE}. - -\bold{Line endings:} All known line endings are detected automatically: \code{\\n} (*NIX including Mac), \code{\\r\\n} (Windows CRLF), \code{\\r} (old Mac) and \code{\\n\\r} (just in case). There is no need to convert input files first. \code{fread} running on any architecture will read a file from any architecture. Both \code{\\r} and \code{\\n} may be embedded in character strings (including column names) provided the field is quoted. - -\bold{Decimal separator and locale:} \code{fread(...,dec=",")} should just work. \code{fread} uses C function \code{strtod} to read numeric data; e.g., \code{1.23} or \code{1,23}. \code{strtod} retrieves the decimal separator (\code{.} or \code{,} usually) from the locale of the R session rather than as an argument passed to the \code{strtod} function. So for \code{fread(...,dec=",")} to work, \code{fread} changes this (and only this) R session's locale temporarily to a locale which provides the desired decimal separator. - -On Windows, "French_France.1252" is tried which should be available as standard (any locale with comma decimal separator would suffice) and on unix "fr_FR.utf8" (you may need to install this locale on unix). \code{fread()} is very careful to set the locale back again afterwards, even if the function fails with an error. The choice of locale is determined by \code{options()$datatable.fread.dec.locale}. This may be a \emph{vector} of locale names and if so they will be tried in turn until the desired \code{dec} is obtained; thus allowing more than two different decimal separators to be selected. This is a new feature in v1.9.6 and is experimental. In case of problems, turn it off with \code{options(datatable.fread.dec.experiment=FALSE)}. - -\bold{Quotes:} - -When \code{quote} is a single character, - - \itemize{ - \item{Spaces and other whitespace (other than \code{sep} and \code{\\n}) may appear in unquoted character fields, e.g., \code{...,2,Joe Bloggs,3.14,...}.} - - \item{When \code{character} columns are \emph{quoted}, they must start and end with that quoting character immediately followed by \code{sep} or \code{\\n}, e.g., \code{...,2,"Joe Bloggs",3.14,...}. - - In essence quoting character fields are \emph{required} only if \code{sep} or \code{\\n} appears in the string value. Quoting may be used to signify that numeric data should be read as text. Unescaped quotes may be present in a quoted field, e.g., \code{...,2,"Joe, "Bloggs"",3.14,...}, as well as escaped quotes, e.g., \code{...,2,"Joe \",Bloggs\"",3.14,...}. - - If an embedded quote is followed by the separator inside a quoted field, the embedded quotes up to that point in that field must be balanced; e.g. \code{...,2,"www.blah?x="one",y="two"",3.14,...}. - - On those fields that do not satisfy these conditions, e.g., fields with unbalanced quotes, \code{fread} re-attempts that field as if it isn't quoted. This is quite useful in reading files that contains fields with unbalanced quotes as well, automatically.} - } - -To read fields \emph{as is} instead, use \code{quote = ""}. - -\bold{File Download:} - -When \code{input} begins with http://, https://, ftp://, ftps://, or file://, \code{fread} detects this and \emph{downloads} the target to a temporary file (at \code{tempfile()}) before proceeding to read the file as usual. Secure URLS (ftps:// and https://) are downloaded with \code{curl::curl_download}; ftp:// and http:// paths are downloaded with \code{download.file} and \code{method} set to \code{getOption("download.file.method")}, defaulting to \code{"auto"}; and file:// is downloaded with \code{download.file} with \code{method="internal"}. NB: this implies that for file://, even files found on the current machine will be "downloaded" (i.e., hard-copied) to a temporary file. See \code{\link{download.file}} for more details. - -} -\value{ - A \code{data.table} by default. A \code{data.frame} when argument \code{data.table=FALSE}; e.g. \code{options(datatable.fread.datatable=FALSE)}. -} -\references{ -Background :\cr -\url{https://cran.r-project.org/doc/manuals/R-data.html}\cr -\url{http://stackoverflow.com/questions/1727772/quickly-reading-very-large-tables-as-dataframes-in-r}\cr -\url{http://www.biostat.jhsph.edu/~rpeng/docs/R-large-tables.html}\cr -\url{http://r.789695.n4.nabble.com/Re-Memory-Experimentation-Rule-of-Thumb-10-15-Times-the-Memory-tp831940.html}\cr -\url{http://www.cerebralmastication.com/2009/11/loading-big-data-into-r/}\cr -\url{http://stackoverflow.com/questions/9061736/faster-than-scan-with-rcpp}\cr -\url{http://stackoverflow.com/questions/415515/how-can-i-read-and-manipulate-csv-file-data-in-c}\cr -\url{http://stackoverflow.com/questions/9352887/strategies-for-reading-in-csv-files-in-pieces}\cr -\url{http://stackoverflow.com/questions/11782084/reading-in-large-text-files-in-r}\cr -\url{http://stackoverflow.com/questions/45972/mmap-vs-reading-blocks}\cr -\url{http://stackoverflow.com/questions/258091/when-should-i-use-mmap-for-file-access}\cr -\url{http://stackoverflow.com/a/9818473/403310}\cr -\url{http://stackoverflow.com/questions/9608950/reading-huge-files-using-memory-mapped-files} - -finagler = "to get or achieve by guile or manipulation" \url{http://dictionary.reference.com/browse/finagler} -} -\seealso{ \code{\link[utils]{read.csv}}, \code{\link[base]{url}}, \code{\link[base]{Sys.setlocale}} -} -\examples{ -\dontrun{ - -# Demo speed-up -n = 1e6 -DT = data.table( a=sample(1:1000,n,replace=TRUE), - b=sample(1:1000,n,replace=TRUE), - c=rnorm(n), - d=sample(c("foo","bar","baz","qux","quux"),n,replace=TRUE), - e=rnorm(n), - f=sample(1:1000,n,replace=TRUE) ) -DT[2,b:=NA_integer_] -DT[4,c:=NA_real_] -DT[3,d:=NA_character_] -DT[5,d:=""] -DT[2,e:=+Inf] -DT[3,e:=-Inf] - -write.table(DT,"test.csv",sep=",",row.names=FALSE,quote=FALSE) -cat("File size (MB):", round(file.info("test.csv")$size/1024^2),"\n") -# 50 MB (1e6 rows x 6 columns) - -system.time(DF1 <-read.csv("test.csv",stringsAsFactors=FALSE)) -# 60 sec (first time in fresh R session) - -system.time(DF1 <- read.csv("test.csv",stringsAsFactors=FALSE)) -# 30 sec (immediate repeat is faster, varies) - -system.time(DF2 <- read.table("test.csv",header=TRUE,sep=",",quote="", - stringsAsFactors=FALSE,comment.char="",nrows=n, - colClasses=c("integer","integer","numeric", - "character","numeric","integer"))) -# 10 sec (consistently). All known tricks and known nrows, see references. - -require(data.table) -if(all(sapply(c("sqldf", "ff"), requireNamespace, quietly = TRUE))) { - require(sqldf) - require(ff) - - system.time(DT <- fread("test.csv")) - # 3 sec (faster and friendlier) - - system.time(SQLDF <- read.csv.sql("test.csv",dbname=NULL)) - # 20 sec (friendly too, good defaults) - - system.time(FFDF <- read.csv.ffdf(file="test.csv",nrows=n)) - # 20 sec (friendly too, good defaults) - - identical(DF1,DF2) - all.equal(as.data.table(DF1), DT) - identical(DF1,within(SQLDF,{b<-as.integer(b);c<-as.numeric(c)})) - identical(DF1,within(as.data.frame(FFDF),d<-as.character(d))) -} - -# Scaling up ... -l = vector("list",10) -for (i in 1:10) l[[i]] = DT -DTbig = rbindlist(l) -tables() -write.table(DTbig,"testbig.csv",sep=",",row.names=FALSE,quote=FALSE) -# 500MB (10 million rows x 6 columns) - -system.time(DF <- read.table("testbig.csv",header=TRUE,sep=",", - quote="",stringsAsFactors=FALSE,comment.char="",nrows=1e7, - colClasses=c("integer","integer","numeric", - "character","numeric","integer"))) -# 100-200 sec (varies) - -system.time(DT <- fread("testbig.csv")) -# 30-40 sec - -all(mapply(all.equal, DF, DT)) - - -# Real data example (Airline data) -# http://stat-computing.org/dataexpo/2009/the-data.html - -download.file("http://stat-computing.org/dataexpo/2009/2008.csv.bz2", - destfile="2008.csv.bz2") -# 109MB (compressed) - -system("bunzip2 2008.csv.bz2") -# 658MB (7,009,728 rows x 29 columns) - -colClasses = sapply(read.csv("2008.csv",nrows=100),class) -# 4 character, 24 integer, 1 logical. Incorrect. - -colClasses = sapply(read.csv("2008.csv",nrows=200),class) -# 5 character, 24 integer. Correct. Might have missed data only using 100 rows -# since read.table assumes colClasses is correct. - -system.time(DF <- read.table("2008.csv", header=TRUE, sep=",", - quote="",stringsAsFactors=FALSE,comment.char="",nrows=7009730, - colClasses=colClasses)) -# 360 secs - -system.time(DT <- fread("2008.csv")) -# 40 secs - -table(sapply(DT,class)) -# 5 character and 24 integer columns. Correct without needing to worry about colClasses -# issue above. - - -# Reads URLs directly : -fread("http://www.stats.ox.ac.uk/pub/datasets/csb/ch11b.dat") - -} - -# Reads text input directly : -fread("A,B\n1,2\n3,4") - -# Reads pasted input directly : -fread("A,B -1,2 -3,4 -") - -# Finds the first data line automatically : -fread(" -This is perhaps a banner line or two or ten. -A,B -1,2 -3,4 -") - -# Detects whether column names are present automatically : -fread(" -1,2 -3,4 -") - -# Numerical precision : - -DT = fread("A\n1.010203040506070809010203040506\n") -# TODO: add numerals=c("allow.loss", "warn.loss", "no.loss") from base::read.table, +"use.Rmpfr" -typeof(DT$A)=="double" # currently "allow.loss" with no option - -DT = fread("A\n1.46761e-313\n") # read as 'numeric' -DT[,sprintf("\%.15E",A)] # beyond what double precision can store accurately to 15 digits -# For greater accuracy use colClasses to read as character, then package Rmpfr. - -# colClasses -data = "A,B,C,D\n1,3,5,7\n2,4,6,8\n" -fread(data, colClasses=c(B="character",C="character",D="character")) # as read.csv -fread(data, colClasses=list(character=c("B","C","D"))) # saves typing -fread(data, colClasses=list(character=2:4)) # same using column numbers - -# drop -fread(data, colClasses=c("B"="NULL","C"="NULL")) # as read.csv -fread(data, colClasses=list(NULL=c("B","C"))) # -fread(data, drop=c("B","C")) # same but less typing, easier to read -fread(data, drop=2:3) # same using column numbers - -# select -# (in read.csv you need to work out which to drop) -fread(data, select=c("A","D")) # less typing, easier to read -fread(data, select=c(1,4)) # same using column numbers - -# skip blank lines -fread("a,b\n1,a\n2,b\n\n\n3,c\n", blank.lines.skip=TRUE) -# fill -fread("a,b\n1,a\n2\n3,c\n", fill=TRUE) -fread("a,b\n\n1,a\n2\n\n3,c\n\n", fill=TRUE) - -# fill with skip blank lines -fread("a,b\n\n1,a\n2\n\n3,c\n\n", fill=TRUE, blank.lines.skip=TRUE) - -# check.names usage -fread("a b,a b\n1,2\n") -fread("a b,a b\n1,2\n", check.names=TRUE) # no duplicates + syntactically valid names -} -\keyword{ data } - diff --git a/man/fsort.Rd b/man/fsort.Rd deleted file mode 100644 index 74336b6ba5..0000000000 --- a/man/fsort.Rd +++ /dev/null @@ -1,32 +0,0 @@ -\name{fsort} -\alias{fsort} -\title{Fast parallel sort} -\description{ - Similar to \code{base::sort} but parallel. Experimental. -} - -\usage{ -fsort(x, decreasing = FALSE, na.last = FALSE, internal=FALSE, verbose=FALSE, ...) -} -\arguments{ - \item{x}{ A vector. Type double, currently. } - \item{decreasing}{ Decreasing order? } - \item{na.last}{ Control treatment of \code{NA}s. If \code{TRUE}, missing values in the data are put last; if \code{FALSE}, they are put first; if \code{NA}, they are removed; if \code{"keep"} they are kept with rank \code{NA}. } - \item{internal}{ Internal use only. Temporary variable. Will be removed. } - \item{verbose}{ Print tracing information. } - \item{...}{ Not sure yet. Should be consistent with base R.} -} -\details{ - Returns the input in sorted order. Fast using parallelism. -} -\value{ - The input in sorted order. -} - -\examples{ -x = runif(1e6) -system.time(ans1 <- sort(x, method="quick")) -system.time(ans2 <- fsort(x)) -identical(ans1, ans2) -} - diff --git a/man/fwrite.Rd b/man/fwrite.Rd deleted file mode 100644 index 3fa8f7b38d..0000000000 --- a/man/fwrite.Rd +++ /dev/null @@ -1,120 +0,0 @@ -\name{fwrite} -\alias{fwrite} -\title{Fast CSV writer} -\description{ -As \code{write.csv} but much faster (e.g. 2 seconds versus 1 minute) and just as flexible. Modern machines almost surely have more than one CPU so \code{fwrite} uses them; on all operating systems including Linux, Mac and Windows. - -This is new functionality as of Nov 2016. We may need to refine argument names and defaults. -} -\usage{ -fwrite(x, file = "", append = FALSE, quote = "auto", - sep = ",", sep2 = c("","|",""), - eol = if (.Platform$OS.type=="windows") "\r\n" else "\n", - na = "", dec = ".", row.names = FALSE, col.names = TRUE, - qmethod = c("double","escape"), - logical01 = getOption("datatable.logical01", FALSE), # due to change to TRUE; see NEWS - logicalAsInt = logical01, # deprecated - dateTimeAs = c("ISO","squash","epoch","write.csv"), - buffMB = 8L, nThread = getDTthreads(), - showProgress = interactive(), - verbose = getOption("datatable.verbose", FALSE)) -} -\arguments{ - \item{x}{Any \code{list} of same length vectors; e.g. \code{data.frame} and \code{data.table}.} - \item{file}{Output file name. \code{""} indicates output to the console. } - \item{append}{If \code{TRUE}, the file is opened in append mode and column names (header row) are not written.} - \item{quote}{When \code{"auto"}, character fields, factor fields and column names will only be surrounded by double quotes when they need to be; i.e., when the field contains the separator \code{sep}, a line ending \code{\\n}, the double quote itself or (when \code{list} columns are present) \code{sep2[2]} (see \code{sep2} below). If \code{FALSE} the fields are not wrapped with quotes even if this would break the CSV due to the contents of the field. If \code{TRUE} double quotes are always included other than around numeric fields, as \code{write.csv}.} - \item{sep}{The separator between columns. Default is \code{","}.} - \item{sep2}{For columns of type \code{list} where each item is an atomic vector, \code{sep2} controls how to separate items \emph{within} the column. \code{sep2[1]} is written at the start of the output field, \code{sep2[2]} is placed between each item and \code{sep2[3]} is written at the end. \code{sep2[1]} and \code{sep2[3]} may be any length strings including empty \code{""} (default). \code{sep2[2]} must be a single character and (when \code{list} columns are present and therefore \code{sep2} is used) different from both \code{sep} and \code{dec}. The default (\code{|}) is chosen to visually distinguish from the default \code{sep}. In speaking, writing and in code comments we may refer to \code{sep2[2]} as simply "sep2".} - \item{eol}{Line separator. Default is \code{"\r\n"} for Windows and \code{"\n"} otherwise.} - \item{na}{The string to use for missing values in the data. Default is a blank string \code{""}.} - \item{dec}{The decimal separator, by default \code{"."}. See link in references. Cannot be the same as \code{sep}.} - \item{row.names}{Should row names be written? For compatibility with \code{data.frame} and \code{write.csv} since \code{data.table} never has row names. Hence default \code{FALSE} unlike \code{write.csv}.} - \item{col.names}{Should the column names (header row) be written? The default is TRUE. However, if missing, \code{append=TRUE} and the file already exists, the default is set to \code{FALSE} for convenience to prevent column names appearing again mid file.} - \item{qmethod}{A character string specifying how to deal with embedded double quote characters when quoting strings. - \itemize{ - \item{"escape" - the quote character (as well as the backslash character) is escaped in C style by a backslash, or} - \item{"double" (default, same as \code{write.csv}), in which case the double quote is doubled with another one.} - }} - \item{logical01}{Should \code{logical} values be written as \code{1} and \code{0} rather than \code{"TRUE"} and \code{"FALSE"}?} - \item{logicalAsInt}{Deprecated. Old name for `logical01`. Name change for consistency with `fread` for which `logicalAsInt` would not make sense.} - \item{dateTimeAs}{ How \code{Date}/\code{IDate}, \code{ITime} and \code{POSIXct} items are written. - \itemize{ - \item{"ISO" (default) - \code{2016-09-12}, \code{18:12:16} and \code{2016-09-12T18:12:16.999999Z}. 0, 3 or 6 digits of fractional seconds are printed if and when present for convenience, regardless of any R options such as \code{digits.secs}. The idea being that if milli and microseconds are present then you most likely want to retain them. R's internal UTC representation is written faithfully to encourage ISO standards, stymie timezone ambiguity and for speed. An option to consider is to start R in the UTC timezone simply with \code{"$ TZ='UTC' R"} at the shell (NB: it must be one or more spaces between \code{TZ='UTC'} and \code{R}, anything else will be silently ignored; this TZ setting applies just to that R process) or \code{Sys.setenv(TZ='UTC')} at the R prompt and then continue as if UTC were local time.} - \item{"squash" - \code{20160912}, \code{181216} and \code{20160912181216999}. This option allows fast and simple extraction of \code{yyyy}, \code{mm}, \code{dd} and (most commonly to group by) \code{yyyymm} parts using integer div and mod operations. In R for example, one line helper functions could use \code{\%/\%10000}, \code{\%/\%100\%\%100}, \code{\%\%100} and \code{\%/\%100} respectively. POSIXct UTC is squashed to 17 digits (including 3 digits of milliseconds always, even if \code{000}) which may be read comfortably as \code{integer64} (automatically by \code{fread()}).} - \item{"epoch" - \code{17056}, \code{65536} and \code{1473703936.999999}. The underlying number of days or seconds since the relevant epoch (1970-01-01, 00:00:00 and 1970-01-01T00:00:00Z respectively), negative before that (see \code{?Date}). 0, 3 or 6 digits of fractional seconds are printed if and when present.} - \item{"write.csv" - this currently affects \code{POSIXct} only. It is written as \code{write.csv} does by using the \code{as.character} method which heeds \code{digits.secs} and converts from R's internal UTC representation back to local time (or the \code{"tzone"} attribute) as of that historical date. Accordingly this can be slow. All other column types (including \code{Date}, \code{IDate} and \code{ITime} which are independent of timezone) are written as the "ISO" option using fast C code which is already consistent with \code{write.csv}.} - } - The first three options are fast due to new specialized C code. The epoch to date-part conversion uses a fast approach by Howard Hinnant (see references) using a day-of-year starting on 1 March. You should not be able to notice any difference in write speed between those three options. The date range supported for \code{Date} and \code{IDate} is [0000-03-01, 9999-12-31]. Every one of these 3,652,365 dates have been tested and compared to base R including all 2,790 leap days in this range. \cr \cr - This option applies to vectors of date/time in list column cells, too. \cr \cr - A fully flexible format string (such as \code{"\%m/\%d/\%Y"}) is not supported. This is to encourage use of ISO standards and because that flexibility is not known how to make fast at C level. We may be able to support one or two more specific options if required. - } - \item{buffMB}{The buffer size (MB) per thread in the range 1 to 1024, default 8MB. Experiment to see what works best for your data on your hardware.} - \item{nThread}{The number of threads to use. Experiment to see what works best for your data on your hardware.} - \item{showProgress}{ Display a progress meter on the console? Ignored when \code{file==""}. } - \item{verbose}{Be chatty and report timings?} -} -\details{ -\code{fwrite} began as a community contribution with \href{https://github.com/Rdatatable/data.table/pull/1613}{pull request #1613} by Otto Seiskari. This gave Matt Dowle the impetus to specialize the numeric formatting and to parallelize: \url{http://blog.h2o.ai/2016/04/fast-csv-writing-for-r/}. Final items were tracked in \href{https://github.com/Rdatatable/data.table/issues/1664}{issue #1664} such as automatic quoting, \code{bit64::integer64} support, decimal/scientific formatting exactly matching \code{write.csv} between 2.225074e-308 and 1.797693e+308 to 15 significant figures, \code{row.names}, dates (between 0000-03-01 and 9999-12-31), times and \code{sep2} for \code{list} columns where each cell can itself be a vector. -} -\seealso{ - \code{\link{setDTthreads}}, \code{\link{fread}}, \code{\link[utils]{write.csv}}, \code{\link[utils]{write.table}}, \href{https://CRAN.R-project.org/package=bit64}{\code{bit64::integer64}} -} -\references{ - \url{http://howardhinnant.github.io/date_algorithms.html}\cr - \url{https://en.wikipedia.org/wiki/Decimal_mark} -} -\examples{ - -DF = data.frame(A=1:3, B=c("foo","A,Name","baz")) -fwrite(DF) -write.csv(DF, row.names=FALSE, quote=FALSE) # same - -fwrite(DF, row.names=TRUE, quote=TRUE) -write.csv(DF) # same - -DF = data.frame(A=c(2.1,-1.234e-307,pi), B=c("foo","A,Name","bar")) -fwrite(DF, quote='auto') # Just DF[2,2] is auto quoted -write.csv(DF, row.names=FALSE) # same numeric formatting - -DT = data.table(A=c(2,5.6,-3),B=list(1:3,c("foo","A,Name","bar"),round(pi*1:3,2))) -fwrite(DT) -fwrite(DT, sep="|", sep2=c("{",",","}")) - -\dontrun{ - -set.seed(1) -DT = as.data.table( lapply(1:10, sample, - x=as.numeric(1:5e7), size=5e6)) # 382MB -system.time(fwrite(DT, "/dev/shm/tmp1.csv")) # 0.8s -system.time(write.csv(DT, "/dev/shm/tmp2.csv", # 60.6s - quote=FALSE, row.names=FALSE)) -system("diff /dev/shm/tmp1.csv /dev/shm/tmp2.csv") # identical - -set.seed(1) -N = 1e7 -DT = data.table( - str1=sample(sprintf("\%010d",sample(N,1e5,replace=TRUE)), N, replace=TRUE), - str2=sample(sprintf("\%09d",sample(N,1e5,replace=TRUE)), N, replace=TRUE), - str3=sample(sapply(sample(2:30, 100, TRUE), function(n) - paste0(sample(LETTERS, n, TRUE), collapse="")), N, TRUE), - str4=sprintf("\%05d",sample(sample(1e5,50),N,TRUE)), - num1=sample(round(rnorm(1e6,mean=6.5,sd=15),2), N, replace=TRUE), - num2=sample(round(rnorm(1e6,mean=6.5,sd=15),10), N, replace=TRUE), - str5=sample(c("Y","N"),N,TRUE), - str6=sample(c("M","F"),N,TRUE), - int1=sample(ceiling(rexp(1e6)), N, replace=TRUE), - int2=sample(N,N,replace=TRUE)-N/2 -) # 774MB -system.time(fwrite(DT,"/dev/shm/tmp1.csv")) # 1.1s -system.time(write.csv(DT,"/dev/shm/tmp2.csv", # 63.2s - row.names=FALSE, quote=FALSE)) -system("diff /dev/shm/tmp1.csv /dev/shm/tmp2.csv") # identical - -unlink("/dev/shm/tmp1.csv") -unlink("/dev/shm/tmp2.csv") -} - -} -\keyword{ data } - diff --git a/man/groupingsets.Rd b/man/groupingsets.Rd deleted file mode 100644 index d897a9984c..0000000000 --- a/man/groupingsets.Rd +++ /dev/null @@ -1,68 +0,0 @@ -\name{groupingsets} -\alias{rollup} -\alias{cube} -\alias{groupingsets} -\alias{rollup.data.table} -\alias{cube.data.table} -\alias{groupingsets.data.table} -\title{ Grouping Set aggregation for data tables } -\description{ - Calculate aggregates at various levels of groupings producing multiple (sub-)totals. Reflects SQLs \emph{GROUPING SETS} operations. -} -\usage{ -rollup(x, \dots) -\method{rollup}{data.table}(x, j, by, .SDcols, id = FALSE, \dots) -cube(x, \dots) -\method{cube}{data.table}(x, j, by, .SDcols, id = FALSE, \dots) -groupingsets(x, \dots) -\method{groupingsets}{data.table}(x, j, by, sets, .SDcols, id = FALSE, jj, \dots) -} -\arguments{ - \item{x}{\code{data.table}.} - \item{\dots}{argument passed to custom user methods. Ignored for \code{data.table} methods.} - \item{j}{expression passed to data.table \code{j}.} - \item{by}{character column names by which we are grouping.} - \item{sets}{list of character vector reflecting grouping sets, used in \code{groupingsets} for flexibility.} - \item{.SDcols}{columns to be used in \code{j} expression in \code{.SD} object.} - \item{id}{logical default \code{FALSE}. If \code{TRUE} it will add leading column with bit mask of grouping sets.} - \item{jj}{quoted version of \code{j} argument, for convenience. When provided function will ignore \code{j} argument.} -} -\details{ - All three functions \code{rollup, cube, groupingsets} are generic methods, \code{data.table} methods are provided. -} -\value{ - A data.table with various aggregates. -} -\seealso{ \code{\link{data.table}}, \code{\link{rbindlist}} -} -\references{ -\url{http://www.postgresql.org/docs/9.5/static/queries-table-expressions.html#QUERIES-GROUPING-SETS} -\url{http://www.postgresql.org/docs/9.5/static/functions-aggregate.html#FUNCTIONS-GROUPING-TABLE} -} -\examples{ -n = 24L -set.seed(25) -DT <- data.table( - color = sample(c("green","yellow","red"), n, TRUE), - year = as.Date(sample(paste0(2011:2015,"-01-01"), n, TRUE)), - status = as.factor(sample(c("removed","active","inactive","archived"), n, TRUE)), - amount = sample(1:5, n, TRUE), - value = sample(c(3, 3.5, 2.5, 2), n, TRUE) -) - -# rollup -rollup(DT, j = sum(value), by = c("color","year","status")) # default id=FALSE -rollup(DT, j = sum(value), by = c("color","year","status"), id=TRUE) -rollup(DT, j = lapply(.SD, sum), by = c("color","year","status"), id=TRUE, .SDcols="value") -rollup(DT, j = c(list(count=.N), lapply(.SD, sum)), by = c("color","year","status"), id=TRUE) - -# cube -cube(DT, j = sum(value), by = c("color","year","status"), id=TRUE) -cube(DT, j = lapply(.SD, sum), by = c("color","year","status"), id=TRUE, .SDcols="value") -cube(DT, j = c(list(count=.N), lapply(.SD, sum)), by = c("color","year","status"), id=TRUE) - -# groupingsets -groupingsets(DT, j = c(list(count=.N), lapply(.SD, sum)), by = c("color","year","status"), - sets = list("color", c("year","status"), character()), id=TRUE) -} -\keyword{ data } diff --git a/man/last.Rd b/man/last.Rd deleted file mode 100644 index 0ea6cad0e4..0000000000 --- a/man/last.Rd +++ /dev/null @@ -1,36 +0,0 @@ -\name{last} -\alias{last} -\title{ Last item of an object } -\description{ -Returns the last item of a vector or list, or the last row of a data.frame or -data.table. -} -\usage{ -last(x, ...) -} -\arguments{ -\item{x}{ A vector, list, data.frame or data.table. Otherwise the S3 method of -\code{xts::last} is deployed. } -\item{...}{ Not applicable for \code{data.table::last}. Any arguments here are -passed through to \code{xts::last}. } -} -% \details{ -% } -\value{ -If no other arguments are supplied it depends on the type of x. The last item -of a vector or list. The last row of a \code{data.frame} or \code{data.table}. -Otherwise, whatever \code{xts::last} returns (if package xts has been loaded, -otherwise a helpful error). - -If any argument is supplied in addition to \code{x} (such as \code{n} or -\code{keep} in \code{xts::last}), regardless of \code{x}'s type, then -\code{xts::last} is called if xts has been loaded, otherwise a helpful error. -} -\seealso{ \code{\link{NROW}}, \code{\link{head}}, \code{\link{tail}}, -\code{\link{first}} } -\examples{ -last(1:5) # [1] 5 -x = data.table(x=1:5, y=6:10) -last(x) # same as x[5] -} -\keyword{ data } diff --git a/man/like.Rd b/man/like.Rd deleted file mode 100644 index 22f88f706c..0000000000 --- a/man/like.Rd +++ /dev/null @@ -1,27 +0,0 @@ -\name{like} -\alias{like} -\alias{\%like\%} -\title{ Convenience function for calling regexpr. } -\description{ - Intended for use in \code{i} in \code{[.data.table}. -} -\usage{ -like(vector,pattern) -vector \%like\% pattern -} -\arguments{ - \item{vector}{ Either a \code{character} vector or a \code{factor}. A \code{factor} is faster. } - \item{pattern}{ Passed on to \code{\link{grepl}}. } -} -% \details{ -% } -\value{ - Logical vector, \code{TRUE} for items that match \code{pattern}. -} -\note{ Current implementation does not make use of sorted keys. } -\seealso{ \code{\link{data.table}}, \code{\link{grepl}} } -\examples{ -DT = data.table(Name=c("Mary","George","Martha"), Salary=c(2,3,4)) -DT[Name \%like\% "^Mar"] -} -\keyword{ data } diff --git a/man/melt.data.table.Rd b/man/melt.data.table.Rd deleted file mode 100644 index 33e7f8e786..0000000000 --- a/man/melt.data.table.Rd +++ /dev/null @@ -1,144 +0,0 @@ -\name{melt.data.table} -\alias{melt.data.table} -\alias{melt} -\title{Fast melt for data.table} -\description{ -An S3 method for melting \code{data.table}s written in C for speed and memory -efficiency. Since \code{v1.9.6}, \code{melt.data.table} allows melting into -multiple columns simultaneously. - -It is not necessary to load \code{reshape2} any more. But if you have to, then -load \code{reshape2} package \emph{before} loading \code{data.table}. -} -\usage{ -## fast melt a data.table -\method{melt}{data.table}(data, id.vars, measure.vars, - variable.name = "variable", value.name = "value", - ..., na.rm = FALSE, variable.factor = TRUE, - value.factor = FALSE, - verbose = getOption("datatable.verbose")) -} -\arguments{ -\item{data}{ A \code{data.table} object to melt.} -\item{id.vars}{vector of id variables. Can be integer (corresponding id -column numbers) or character (id column names) vector. If missing, all -non-measure columns will be assigned to it. If integer, must be positive; see Details. } -\item{measure.vars}{Measure variables for \code{melt}ing. Can be missing, vector, list, or pattern-based. - - \itemize{ - \item{ When missing, \code{measure.vars} will become all columns outside \code{id.vars}. } - \item{ Vector can be \code{integer} (implying column numbers) or \code{character} (column names). } - \item{ \code{list} is a generalization of the vector version -- each element of the list (which should be \code{integer} or \code{character} as above) will become a \code{melt}ed column. } - \item{ Pattern-based column matching can be achieved with the regular expression-based \code{\link{patterns}} syntax; multiple patterns will produce multiple columns. } - } - - For convenience/clarity in the case of multiple \code{melt}ed columns, resulting column names can be supplied as names to the elements \code{measure.vars} (in the \code{list} and \code{patterns} usages). See also \code{Examples}. } -\item{variable.name}{name for the measured variable names column. The default name is \code{'variable'}.} -\item{value.name}{name for the molten data values column(s). The default name is \code{'value'}. Multiple names can be provided here for the case when \code{measure.vars} is a \code{list}, though note well that the names provided in \code{measure.vars} take precedence. } -\item{na.rm}{If \code{TRUE}, \code{NA} values will be removed from the molten -data.} -\item{variable.factor}{If \code{TRUE}, the \code{variable} column will be -converted to \code{factor}, else it will be a \code{character} column.} -\item{value.factor}{If \code{TRUE}, the \code{value} column will be converted -to \code{factor}, else the molten value type is left unchanged.} -\item{verbose}{\code{TRUE} turns on status and information messages to the -console. Turn this on by default using \code{options(datatable.verbose=TRUE)}. -The quantity and types of verbosity may be expanded in future.} -\item{...}{any other arguments to be passed to/from other methods.} -} -\details{ -If \code{id.vars} and \code{measure.vars} are both missing, all -non-\code{numeric/integer/logical} columns are assigned as id variables and -the rest as measure variables. If only one of \code{id.vars} or -\code{measure.vars} is supplied, the rest of the columns will be assigned to -the other. Both \code{id.vars} and \code{measure.vars} can have the same column -more than once and the same column can be both as id and measure variables. - -\code{melt.data.table} also accepts \code{list} columns for both id and measure -variables. - -When all \code{measure.vars} are not of the same type, they'll be coerced -according to the hierarchy \code{list} > \code{character} > \code{numeric > -integer > logical}. For example, if any of the measure variables is a -\code{list}, then entire value column will be coerced to a list. Note that, -if the type of \code{value} column is a list, \code{na.rm = TRUE} will have no -effect. - -From version \code{1.9.6}, \code{melt} gains a feature with \code{measure.vars} -accepting a list of \code{character} or \code{integer} vectors as well to melt -into multiple columns in a single function call efficiently. The function -\code{\link{patterns}} can be used to provide regular expression patterns. When -used along with \code{melt}, if \code{cols} argument is not provided, the -patterns will be matched against \code{names(data)}, for convenience. - -Attributes are preserved if all \code{value} columns are of the same type. By -default, if any of the columns to be melted are of type \code{factor}, it'll -be coerced to \code{character} type. This is to be compatible with -\code{reshape2}'s \code{melt.data.frame}. To get a \code{factor} column, set -\code{value.factor = TRUE}. \code{melt.data.table} also preserves -\code{ordered} factors. - -Note that, as opposed to the (undocumented) behaviour of \code{reshape2::melt}, \code{id.vars}, when specified as numbers, must be between 1 and \code{ncol(data)}. -} - -\value{ -An unkeyed \code{data.table} containing the molten data. -} - -\examples{ -set.seed(45) -require(data.table) -DT <- data.table( - i_1 = c(1:5, NA), - i_2 = c(NA,6,7,8,9,10), - f_1 = factor(sample(c(letters[1:3], NA), 6, TRUE)), - f_2 = factor(c("z", "a", "x", "c", "x", "x"), ordered=TRUE), - c_1 = sample(c(letters[1:3], NA), 6, TRUE), - d_1 = as.Date(c(1:3,NA,4:5), origin="2013-09-01"), - d_2 = as.Date(6:1, origin="2012-01-01")) -# add a couple of list cols -DT[, l_1 := DT[, list(c=list(rep(i_1, sample(5,1)))), by = i_1]$c] -DT[, l_2 := DT[, list(c=list(rep(c_1, sample(5,1)))), by = i_1]$c] - -# id, measure as character/integer/numeric vectors -melt(DT, id=1:2, measure="f_1") -melt(DT, id=c("i_1", "i_2"), measure=3) # same as above -melt(DT, id=1:2, measure=3L, value.factor=TRUE) # same, but 'value' is factor -melt(DT, id=1:2, measure=3:4, value.factor=TRUE) # 'value' is *ordered* factor - -# preserves attribute when types are identical, ex: Date -melt(DT, id=3:4, measure=c("d_1", "d_2")) -melt(DT, id=3:4, measure=c("i_1", "d_1")) # attribute not preserved - -# on list -melt(DT, id=1, measure=c("l_1", "l_2")) # value is a list -melt(DT, id=1, measure=c("c_1", "l_1")) # c1 coerced to list - -# on character -melt(DT, id=1, measure=c("c_1", "f_1")) # value is char -melt(DT, id=1, measure=c("c_1", "i_2")) # i2 coerced to char - -# on na.rm=TRUE. NAs are removed efficiently, from within C -melt(DT, id=1, measure=c("c_1", "i_2"), na.rm=TRUE) # remove NA - -# measure.vars can be also a list -# melt "f_1,f_2" and "d_1,d_2" simultaneously, retain 'factor' attribute -# convenient way using internal function patterns() -melt(DT, id=1:2, measure=patterns("^f_", "^d_"), value.factor=TRUE) -# same as above, but provide list of columns directly by column names or indices -melt(DT, id=1:2, measure=list(3:4, c("d_1", "d_2")), value.factor=TRUE) -# same as above, but provide names directly: -melt(DT, id=1:2, measure=patterns(f="^f_", d="^d_"), value.factor=TRUE) - -# na.rm=TRUE removes rows with NAs in any 'value' columns -melt(DT, id=1:2, measure=patterns("f_", "d_"), value.factor=TRUE, na.rm=TRUE) - -# return 'NA' for missing columns, 'na.rm=TRUE' ignored due to list column -melt(DT, id=1:2, measure=patterns("l_", "c_"), na.rm=TRUE) - -} -\seealso{ - \code{\link{dcast}}, \url{https://cran.r-project.org/package=reshape} -} -\keyword{ data } - diff --git a/man/merge.Rd b/man/merge.Rd deleted file mode 100644 index b9fe3c6e71..0000000000 --- a/man/merge.Rd +++ /dev/null @@ -1,143 +0,0 @@ -\name{merge} -\alias{merge} -\alias{merge.data.table} -\title{Merge two data.tables} -\description{ -Fast merge of two \code{data.table}s. The \code{data.table} method behaves -very similarly to that of \code{data.frame}s except that, by default, it attempts to merge - -\itemize{ - \item at first based on the shared key columns, and if there are none, - \item then based on key columns of the first argument \code{x}, and if there - are none, - \item then based on the common columns between the two \code{data.table}s. -} - -Set the \code{by}, or \code{by.x} and \code{by.y} arguments explicitly to override this default. -} - -\usage{ -\method{merge}{data.table}(x, y, by = NULL, by.x = NULL, by.y = NULL, all = FALSE, -all.x = all, all.y = all, sort = TRUE, suffixes = c(".x", ".y"), no.dups = TRUE, -allow.cartesian=getOption("datatable.allow.cartesian"), # default FALSE -...) -} - -\arguments{ -\item{x, y}{\code{data table}s. \code{y} is coerced to a \code{data.table} if -it isn't one already.} -\item{by}{A vector of shared column names in \code{x} and \code{y} to merge on. -This defaults to the shared key columns between the two tables. -If \code{y} has no key columns, this defaults to the key of \code{x}.} -\item{by.x, by.y}{Vectors of column names in \code{x} and \code{y} to merge on.} -\item{all}{logical; \code{all = TRUE} is shorthand to save setting both -\code{all.x = TRUE} and \code{all.y = TRUE}.} -\item{all.x}{logical; if \code{TRUE}, then extra rows will be added to the -output, one for each row in \code{x} that has no matching row in \code{y}. -These rows will have 'NA's in those columns that are usually filled with values -from \code{y}. The default is \code{FALSE}, so that only rows with data from both -\code{x} and \code{y} are included in the output.} -\item{all.y}{logical; analogous to \code{all.x} above.} -\item{sort}{logical. If \code{TRUE} (default), the merged \code{data.table} is -sorted by setting the key to the \code{by / by.x} columns. If \code{FALSE}, the -result is not sorted.} -\item{suffixes}{A \code{character(2)} specifying the suffixes to be used for -making non-\code{by} column names unique. The suffix behaviour works in a similar -fashion as the \code{\link{merge.data.frame}} method does.} -\item{no.dups}{logical indicating that \code{suffixes} are also appended to -non-\code{by.y} column names in \code{y} when they have the same column name -as any \code{by.x}.} -\item{allow.cartesian}{See \code{allow.cartesian} in \code{\link{[.data.table}}.} -\item{\dots}{Not used at this time.} -} - -\details{ -\code{\link{merge}} is a generic function in base R. It dispatches to either the -\code{merge.data.frame} method or \code{merge.data.table} method depending on -the class of its first argument. Note that, unlike \code{SQL}, \code{NA} is -matched against \code{NA} (and \code{NaN} against \code{NaN}) while merging. - -In versions \code{<= v1.9.4}, if the specified columns in \code{by} were not the -key (or head of the key) of \code{x} or \code{y}, then a \code{\link{copy}} is -first re-keyed prior to performing the merge. This was less performant as well as memory -inefficient. The concept of secondary keys (implemented in \code{v1.9.4}) was -used to overcome this limitation from \code{v1.9.6}+. No deep copies are made -any more, thereby improving performance and memory efficiency. Also, there is better -control for providing the columns to merge on with the help of the newly implemented -\code{by.x} and \code{by.y} arguments. - -For a more \code{data.table}-centric way of merging two \code{data.table}s, see -\code{\link{[.data.table}}; e.g., \code{x[y, ...]}. See FAQ 1.12 for a detailed -comparison of \code{merge} and \code{x[y, ...]}. - -If any column names provided to \code{by.x} also occur in \code{names(y)} but not in \code{by.y}, -then this \code{data.table} method will add the \code{suffixes} to those column names. As of -R v3.4.3, the \code{data.frame} method will not (leading to duplicate column names in the result) but a patch has -been proposed (see thread \href{http://r.789695.n4.nabble.com/Duplicate-column-names-created-by-base-merge-when-by-x-has-the-same-name-as-a-column-in-y-td4748345.html}{here}) -which is looking likely to be accepted for a future version of R. -} - -\value{ -A new \code{data.table} based on the merged \code{data table}s, and sorted by the -columns set (or inferred for) the \code{by} argument if argument \code{sort} is -set to \code{TRUE}. -} - -\seealso{ -\code{\link{data.table}}, \code{\link{as.data.table}}, \code{\link{[.data.table}}, -\code{\link{merge.data.frame}} -} - -\examples{ -(dt1 <- data.table(A = letters[1:10], X = 1:10, key = "A")) -(dt2 <- data.table(A = letters[5:14], Y = 1:10, key = "A")) -merge(dt1, dt2) -merge(dt1, dt2, all = TRUE) - -(dt1 <- data.table(A = letters[rep(1:3, 2)], X = 1:6, key = "A")) -(dt2 <- data.table(A = letters[rep(2:4, 2)], Y = 6:1, key = "A")) -merge(dt1, dt2, allow.cartesian=TRUE) - -(dt1 <- data.table(A = c(rep(1L, 5), 2L), B = letters[rep(1:3, 2)], X = 1:6, key = "A,B")) -(dt2 <- data.table(A = c(rep(1L, 5), 2L), B = letters[rep(2:4, 2)], Y = 6:1, key = "A,B")) -merge(dt1, dt2) -merge(dt1, dt2, by="B", allow.cartesian=TRUE) - -# test it more: -d1 <- data.table(a=rep(1:2,each=3), b=1:6, key="a,b") -d2 <- data.table(a=0:1, bb=10:11, key="a") -d3 <- data.table(a=0:1, key="a") -d4 <- data.table(a=0:1, b=0:1, key="a,b") - -merge(d1, d2) -merge(d2, d1) -merge(d1, d2, all=TRUE) -merge(d2, d1, all=TRUE) - -merge(d3, d1) -merge(d1, d3) -merge(d1, d3, all=TRUE) -merge(d3, d1, all=TRUE) - -merge(d1, d4) -merge(d1, d4, by="a", suffixes=c(".d1", ".d4")) -merge(d4, d1) -merge(d1, d4, all=TRUE) -merge(d4, d1, all=TRUE) - -# new feature, no need to set keys anymore -set.seed(1L) -d1 <- data.table(a=sample(rep(1:3,each=2)), z=1:6) -d2 <- data.table(a=2:0, z=10:12) -merge(d1, d2, by="a") -merge(d1, d2, by="a", all=TRUE) - -# new feature, using by.x and by.y arguments -setnames(d2, "a", "b") -merge(d1, d2, by.x="a", by.y="b") -merge(d1, d2, by.x="a", by.y="b", all=TRUE) -merge(d2, d1, by.x="b", by.y="a") -} - -\keyword{ data } - diff --git a/man/na.omit.data.table.Rd b/man/na.omit.data.table.Rd deleted file mode 100644 index 1b3f52cec8..0000000000 --- a/man/na.omit.data.table.Rd +++ /dev/null @@ -1,52 +0,0 @@ -\name{na.omit.data.table} -\alias{na.omit.data.table} -\alias{na.omit} -\title{ Remove rows with missing values on columns specified } -\description{ - This is a \code{data.table} method for the S3 generic \code{stats::na.omit}. The internals are written in C for speed. See examples for benchmark timings. - - \code{bit64::integer64} type is also supported. -} - -\usage{ -\method{na.omit}{data.table}(object, cols=seq_along(object), invert=FALSE, ...) -} -\arguments{ - \item{object}{ A \code{data.table}. } - \item{cols}{ A vector of column names (or numbers) on which to check for missing values. Default is all the columns. } - \item{invert}{ logical. If \code{FALSE} omits all rows with any missing values (default). \code{TRUE} returns just those rows with missing values instead. } - \item{\dots}{ Further arguments special methods could require. } -} -\details{ -The \code{data.table} method consists of an additional argument \code{cols}, which when specified looks for missing values in just those columns specified. The default value for \code{cols} is all the columns, to be consistent with the default behaviour of \code{stats::na.omit}. - -It does not add the attribute \code{na.action} as \code{stats::na.omit} does. -} -\value{ -A data.table with just the rows where the specified columns have no missing value in any of them. -} -\seealso{ -\code{\link{data.table}} -} -\examples{ -DT = data.table(x=c(1,NaN,NA,3), y=c(NA_integer_, 1:3), z=c("a", NA_character_, "b", "c")) -# default behaviour -na.omit(DT) -# omit rows where 'x' has a missing value -na.omit(DT, cols="x") -# omit rows where either 'x' or 'y' have missing values -na.omit(DT, cols=c("x", "y")) - -\dontrun{ -# Timings on relatively large data -set.seed(1L) -DT = data.table(x = sample(c(1:100, NA_integer_), 5e7L, TRUE), - y = sample(c(rnorm(100), NA), 5e7L, TRUE)) -system.time(ans1 <- na.omit(DT)) ## 2.6 seconds -system.time(ans2 <- stats:::na.omit.data.frame(DT)) ## 29 seconds -# identical? check each column separately, as ans2 will have additional attribute -all(sapply(1:2, function(i) identical(ans1[[i]], ans2[[i]]))) ## TRUE -} -} -\keyword{ data } - diff --git a/man/openmp-utils.Rd b/man/openmp-utils.Rd deleted file mode 100644 index 3f29985b6f..0000000000 --- a/man/openmp-utils.Rd +++ /dev/null @@ -1,22 +0,0 @@ -\name{setDTthreads} -\alias{setDTthreads} -\alias{getDTthreads} -\title{ Set or get number of threads that data.table should use } -\description{ -Set and get number of threads to be used in \code{data.table} functions that are parallelized with OpenMP. Default value 0 means to utilize all CPU available with an appropriate number of threads calculated by OpenMP. \code{getDTthreads()} returns the number of threads that will be used. This affects \code{data.table} only and does not change R itself or other packages using OpenMP. The most common usage expected is \code{setDTthreads(1)} to limit \code{data.table} to one thread for pre-existing explicitly parallel user code; e.g. via packages parallel and foreach. Otherwise, nested parallelism may bite. As \code{data.table} becomes more parallel automatically internally, we expect explicit user parallelism to be needed less often. - -Attempting to \code{setDTthreads()} to more than the number of logical CPUs is intended to be ineffective; i.e., \code{getDTthreads()} will still return the number of logical CPUs in that case. Further, there is a hard coded limit of 1024 threads (with warning when imposed) to prevent accidentally picking up the value of \code{INT_MAX} (2 billion; i.e. unlimited) from \code{omp_get_thread_limit()}. We have followed the advice of section 1.2.1.1 in the R-exts manual: "... or, better, for the regions in your code as part of their specification... num_threads(nthreads).. That way you only control your own code and not that of other OpenMP users." All the parallel region in data.table contain this directive. This is mandated by a \code{grep} in the package's quality control release procedure script. -} -\usage{ -setDTthreads(threads) -getDTthreads(verbose = getOption("datatable.verbose", FALSE)) -} -\arguments{ - \item{threads}{ An integer >= 0. Default 0 means use all CPU available and leave the operating system to multi task. } - \item{verbose}{ Display the value returned by some OpenMP function calls. } -} -\value{ -A length 1 \code{integer}. The old value is returned by \code{setDTthreads} so you can store that value and pass it to \code{setDTthreads} again after the section of your code where you, probably, limited to one thread. -} -\keyword{ data } - diff --git a/man/patterns.Rd b/man/patterns.Rd deleted file mode 100644 index 135c0f5220..0000000000 --- a/man/patterns.Rd +++ /dev/null @@ -1,33 +0,0 @@ -\name{patterns} -\alias{patterns} -\title{Obtain matching indices corresponding to patterns} -\description{ -\code{patterns} returns the matching indices in the argument \code{cols} -corresponding to the regular expression patterns provided. The patterns must be -supported by \code{\link[base]{grep}}. - -From \code{v1.9.6}, \code{\link{melt.data.table}} has an enhanced functionality -in which \code{measure.vars} argument can accept a \emph{list of column names} -and melt them into separate columns. See the \code{Efficient reshaping using -data.tables} vignette linked below to learn more. -} -\usage{ -patterns(..., cols=character(0)) -} -\arguments{ - \item{...}{A set of regular expression patterns.} - \item{cols}{A character vector of names to which each pattern is matched.} -} -\seealso{ - \code{\link{melt}}, - \url{https://github.com/Rdatatable/data.table/wiki/Getting-started} -} -\examples{ -DT = data.table(x1 = 1:5, x2 = 6:10, y1 = letters[1:5], y2 = letters[6:10]) -# melt all columns that begin with 'x' & 'y', respectively, into separate columns -melt(DT, measure.vars = patterns("^x", "^y", cols=names(DT))) -# when used with melt, 'cols' is implictly assumed to be names of input -# data.table, if not provided. -melt(DT, measure.vars = patterns("^x", "^y")) -} -\keyword{data} diff --git a/man/print.data.table.Rd b/man/print.data.table.Rd deleted file mode 100644 index ac17393948..0000000000 --- a/man/print.data.table.Rd +++ /dev/null @@ -1,60 +0,0 @@ -\name{print.data.table} -\alias{print.data.table} -\title{ data.table Printing Options } -\description{ - \code{print.data.table} extends the functionalities of \code{print.data.frame}. - - Key enhancements include automatic output compression of many observations and concise column-wise \code{class} summary. -} -\usage{ - \method{print}{data.table}(x, - topn=getOption("datatable.print.topn"), # default: 5 - nrows=getOption("datatable.print.nrows"), # default: 100 - class=getOption("datatable.print.class"), # default: FALSE - row.names=getOption("datatable.print.rownames"), # default: TRUE - col.names=getOption("datatable.print.colnames"), # default: "auto" - print.keys=getOption("datatable.print.keys"), # default: FALSE - quote=FALSE,...) -} -\arguments{ - \item{x}{ A \code{data.table}. } - \item{topn}{ The number of rows to be printed from the beginning and end of tables with more than \code{nrows} rows. } - \item{nrows}{ The number of rows which will be printed before truncation is enforced. } - \item{class}{ If \code{TRUE}, the resulting output will include above each column its storage class (or a self-evident abbreviation thereof). } - \item{row.names}{ If \code{TRUE}, row indices will be printed alongside \code{x}. } - \item{col.names}{ One of three flavours for controlling the display of column names in output. \code{"auto"} includes column names above the data, as well as below the table if \code{nrow(x) > 20}. \code{"top"} excludes this lower register when applicable, and \code{"none"} suppresses column names altogether (as well as column classes if \code{class = TRUE}. } - \item{print.keys}{ If \code{TRUE}, any \code{\link{key}} and/or \code{\link[=indices]{index}} currently assigned to \code{x} will be printed prior to the preview of the data. } - \item{quote}{ If \code{TRUE}, all output will appear in quotes, as in \code{print.default}. } - \item{\dots}{ Other arguments ultimately passed to \code{format}. } -} -\details{ - By default, with an eye to the typically large number of observations in a code{data.table}, only the beginning and end of the object are displayed (specifically, \code{head(x, topn)} and \code{tail(x, topn)} are displayed unless \code{nrow(x) < nrows}, in which case all rows will print). -} -\seealso{\code{\link{print.default}}} -\examples{ - #output compression - DT <- data.table(a = 1:1000) - print(DT, nrows = 100, topn = 4) - - #`quote` can be used to identify whitespace - DT <- data.table(blanks = c(" 12", " 34"), - noblanks = c("12", "34")) - print(DT, quote = TRUE) - - #`class` provides handy column type summaries at a glance - DT <- data.table(a = vector("integer", 3), - b = vector("complex", 3), - c = as.IDate(paste0("2016-02-0", 1:3))) - print(DT, class = TRUE) - - #`row.names` can be eliminated to save space - DT <- data.table(a = 1:3) - print(DT, row.names = FALSE) - - #`print.keys` can alert which columns are currently keys - DT <- data.table(a=1:3, b=4:6, c=7:9, key="b,a") - setindexv(DT, c("a", "b")) - setindexv(DT, "a") - print(DT, print.keys=TRUE) -} - diff --git a/man/rbindlist.Rd b/man/rbindlist.Rd deleted file mode 100644 index 9706dd443f..0000000000 --- a/man/rbindlist.Rd +++ /dev/null @@ -1,65 +0,0 @@ -\name{rbindlist} -\alias{rbindlist} -\alias{rbind.data.table} -\alias{rbind} -\title{ Makes one data.table from a list of many } -\description{ - Same as \code{do.call("rbind", l)} on \code{data.frame}s, but much faster. See \code{DETAILS} for more. -} -\usage{ -rbindlist(l, use.names=fill, fill=FALSE, idcol=NULL) -# rbind(..., use.names=TRUE, fill=FALSE, idcol=NULL) -} -\arguments{ - \item{l}{ A list containing \code{data.table}, \code{data.frame} or \code{list} objects. At least one of the inputs should have column names set. \code{\dots} is the same but you pass the objects by name separately. } - \item{use.names}{If \code{TRUE} items will be bound by matching column names. By default \code{FALSE} for \code{rbindlist} (for backwards compatibility) and \code{TRUE} for \code{rbind} (consistency with base). Columns with duplicate names are bound in the order of occurrence, similar to base. When TRUE, at least one item of the input list has to have non-null column names.} - \item{fill}{If \code{TRUE} fills missing columns with NAs. By default \code{FALSE}. When \code{TRUE}, \code{use.names} has to be \code{TRUE}, and all items of the input list has to have non-null column names. } - \item{idcol}{Generates an index column. Default (\code{NULL}) is not to. If \code{idcol=TRUE} then the column is auto named \code{.id}. Alternatively the column name can be directly provided, e.g., \code{idcol = "id"}. - - If input is a named list, ids are generated using them, else using integer vector from \code{1} to length of input list. See \code{examples}.} -} -\details{ -Each item of \code{l} can be a \code{data.table}, \code{data.frame} or \code{list}, including \code{NULL} (skipped) or an empty object (0 rows). \code{rbindlist} is most useful when there are a variable number of (potentially many) objects to stack, such as returned by \code{lapply(fileNames, fread)}. \code{rbind} however is most useful to stack two or three objects which you know in advance. \code{\dots} should contain at least one \code{data.table} for \code{rbind(...)} to call the fast method and return a \code{data.table}, whereas \code{rbindlist(l)} always returns a \code{data.table} even when stacking a plain \code{list} with a \code{data.frame}, for example. - -In versions \code{<= v1.9.2}, each item for \code{rbindlist} should have the same number of columns as the first non empty item. \code{rbind.data.table} gained a \code{fill} argument to fill missing columns with \code{NA} in \code{v1.9.2}, which allowed for \code{rbind(...)} binding unequal number of columns. - -In version \code{> v1.9.2}, these functionalities were extended to \code{rbindlist} (and written entirely in C for speed). \code{rbindlist} has \code{use.names} argument, which is set to \code{FALSE} by default for backwards compatibility. It also contains \code{fill} argument as well and can bind unequal columns when set to \code{TRUE}. - -With these changes, the only difference between \code{rbind(...)} and \code{rbindlist(l)} is their \emph{default argument} \code{use.names}. - -If column \code{i} of input items do not all have the same type; e.g, a \code{data.table} may be bound with a \code{list} or a column is \code{factor} while others are \code{character} types, they are coerced to the highest type (SEXPTYPE). - -Note that any additional attributes that might exist on individual items of the input list would not be preserved in the result. -} -\value{ - An unkeyed \code{data.table} containing a concatenation of all the items passed in. -} -\seealso{ \code{\link{data.table}}, \code{\link{split.data.table}} } -\examples{ -# default case -DT1 = data.table(A=1:3,B=letters[1:3]) -DT2 = data.table(A=4:5,B=letters[4:5]) -l = list(DT1,DT2) -rbindlist(l) - -# bind correctly by names -DT1 = data.table(A=1:3,B=letters[1:3]) -DT2 = data.table(B=letters[4:5],A=4:5) -l = list(DT1,DT2) -rbindlist(l, use.names=TRUE) - -# fill missing columns, and match by col names -DT1 = data.table(A=1:3,B=letters[1:3]) -DT2 = data.table(B=letters[4:5],C=factor(1:2)) -l = list(DT1,DT2) -rbindlist(l, use.names=TRUE, fill=TRUE) - -# generate index column, auto generates indices -rbindlist(l, use.names=TRUE, fill=TRUE, idcol=TRUE) -# let's name the list -setattr(l, 'names', c("a", "b")) -rbindlist(l, use.names=TRUE, fill=TRUE, idcol="ID") - -} -\keyword{ data } - diff --git a/man/rleid.Rd b/man/rleid.Rd deleted file mode 100644 index dc5f1e4437..0000000000 --- a/man/rleid.Rd +++ /dev/null @@ -1,41 +0,0 @@ -\name{rleid} -\alias{rleid} -\alias{rleidv} -\title{Generate run-length type group id} -\description{ - A convenience function for generating a \emph{run-length} type \emph{id} column to be used in grouping operations. It accepts atomic vectors, lists, data.frames or data.tables as input. -} -\usage{ -rleid(..., prefix=NULL) -rleidv(x, cols=seq_along(x), prefix=NULL) -} -\arguments{ - \item{x}{ A vector, list, data.frame or data.table. } - \item{...}{ A sequence of numeric, integer64, character or logical vectors, all of same length. For interactive use.} - \item{cols}{ Only meaningful for lists, data.frames or data.tables. A character vector of column names (or numbers) of x. } - \item{prefix}{ Either \code{NULL} (default) or a character vector of length=1 which is prefixed to the row ids, returning a character vector (instead of an integer vector).} -} -\details{ - At times aggregation (or grouping) operations need to be performed where consecutive runs of identical values should belong to the same group (See \code{\link[base]{rle}}). The use for such a function has come up repeatedly on StackOverflow, see the \code{See Also} section. This function allows to generate "run-length" groups directly. - - \code{rleid} is designed for interactive use and accepts a sequence of vectors as arguments. For programming, \code{rleidv} might be more useful. -} -\value{ - When \code{prefix = NULL}, an integer vector with same length as \code{NROW(x)}, else a character vector with the value in \code{prefix} prefixed to the ids obtained. -} -\examples{ -DT = data.table(grp=rep(c("A", "B", "C", "A", "B"), c(2,2,3,1,2)), value=1:10) -rleid(DT$grp) # get run-length ids -rleidv(DT, "grp") # same as above - -rleid(DT$grp, prefix="grp") # prefix with 'grp' - -# get sum of value over run-length groups -DT[, sum(value), by=.(grp, rleid(grp))] -DT[, sum(value), by=.(grp, rleid(grp, prefix="grp"))] - -} -\seealso{ - \code{\link{data.table}}, \code{\link{rowid}}, \url{http://stackoverflow.com/q/21421047/559784} -} -\keyword{ data } diff --git a/man/rowid.Rd b/man/rowid.Rd deleted file mode 100644 index f35ec9b895..0000000000 --- a/man/rowid.Rd +++ /dev/null @@ -1,49 +0,0 @@ -\name{rowid} -\alias{rowid} -\alias{rowidv} -\title{ Generate unique row ids within each group} -\description{ - Convenience functions for generating a unique row ids within each group. It accepts atomic vectors, lists, data.frames or data.tables as input. - - \code{rowid} is intended for interactive use, particularly along with the function \code{dcast} to generate unique ids directly in the formula. - - \code{rowidv(DT, cols=c("x", "y"))} is equivalent to column \code{N} in the code \code{DT[, N := seq_len(.N), by=c("x", "y")]}. - - See examples for more. -} -\usage{ -rowid(..., prefix=NULL) -rowidv(x, cols=seq_along(x), prefix=NULL) -} -\arguments{ - \item{x}{ A vector, list, data.frame or data.table. } - \item{...}{ A sequence of numeric, integer64, character or logical vectors, all of same length. For interactive use.} - \item{cols}{ Only meaningful for lists, data.frames or data.tables. A character vector of column names (or numbers) of x. } - \item{prefix}{ Either \code{NULL} (default) or a character vector of length=1 which is prefixed to the row ids, returning a character vector (instead of an integer vector).} -} -\value{ - When \code{prefix = NULL}, an integer vector with same length as \code{NROW(x)}, else a character vector with the value in \code{prefix} prefixed to the ids obtained. -} -\examples{ -DT = data.table(x=c(20,10,10,30,30,20), y=c("a", "a", "a", "b", "b", "b"), z=1:6) - -rowid(DT$x) # 1,1,2,1,2,2 -rowidv(DT, cols="x") # same as above - -rowid(DT$x, prefix="group") # prefixed with 'group' - -rowid(DT$x, DT$y) # 1,1,2,1,2,1 -rowidv(DT, cols=c("x","y")) # same as above -DT[, .(N=seq_len(.N)), by=.(x,y)]$N # same as above - -# convenient usage with dcast -dcast(DT, x ~ rowid(x, prefix="group"), value.var="z") -# x group1 group2 -# 1: 10 2 3 -# 2: 20 1 6 -# 3: 30 4 5 -} -\seealso{ - \code{\link{dcast.data.table}}, \code{\link{rleid}} -} -\keyword{ data } diff --git a/man/setDF.Rd b/man/setDF.Rd deleted file mode 100644 index 63d4ecf21f..0000000000 --- a/man/setDF.Rd +++ /dev/null @@ -1,42 +0,0 @@ -\name{setDF} -\alias{setDF} -\title{Coerce a data.table to data.frame by reference} -\description{ - In \code{data.table} parlance, all \code{set*} functions change their input \emph{by reference}. That is, no copy is made at all, other than temporary working memory, which is as large as one column. The only other \code{data.table} operator that modifies input by reference is \code{\link{:=}}. Check out the \code{See Also} section below for other \code{set*} function \code{data.table} provides. - - A helper function to convert a \code{data.table} or \code{list} of equal length to \code{data.frame} by reference. -} -\usage{ -setDF(x, rownames=NULL) -} -\arguments{ - \item{x}{ A \code{data.table}, \code{data.frame} or \code{list} of equal length. } - \item{rownames}{ A \code{character} vector to assign as the row names of \code{x}. } -} - -\details{ - This feature request came up on the \href{http://r.789695.n4.nabble.com/Is-there-any-overhead-to-converting-back-and-forth-from-a-data-table-to-a-data-frame-td4688332.html}{data.table mailing list}. All \code{data.table} attributes including any keys of the input data.table are stripped off. - - When using \code{rownames}, recall that the row names of a \code{data.frame} must be unique. By default, the assigned set of row names is simply the sequence 1, ..., \code{nrow(x)} (or \code{length(x)} for \code{list}s). -} - -\value{ - The input \code{data.table} is modified by reference to a \code{data.frame} and returned (invisibly). If you require a copy, take a copy first (using \code{DT2 = copy(DT)}). See \code{?copy}. -} - -\seealso{ \code{\link{data.table}}, \code{\link{as.data.table}}, \code{\link{setDT}}, \code{\link{copy}}, \code{\link{setkey}}, \code{\link{setcolorder}}, \code{\link{setattr}}, \code{\link{setnames}}, \code{\link{set}}, \code{\link{:=}}, \code{\link{setorder}} -} -\examples{ -X = data.table(x=1:5, y=6:10) -## convert 'X' to data.frame, without any copy. -setDF(X) - -X = data.table(x=1:5, y=6:10) -## idem, assigning row names -setDF(X, rownames = LETTERS[1:5]) - -X = list(x=1:5, y=6:10) -# X is converted to a data.frame without any copy. -setDF(X) -} -\keyword{ data } diff --git a/man/setDT.Rd b/man/setDT.Rd deleted file mode 100644 index 7e2b67c85e..0000000000 --- a/man/setDT.Rd +++ /dev/null @@ -1,59 +0,0 @@ -\name{setDT} -\alias{setDT} -\title{Coerce lists and data.frames to data.table by reference} -\description{ - In \code{data.table} parlance, all \code{set*} functions change their input \emph{by reference}. That is, no copy is made at all, other than temporary working memory, which is as large as one column.. The only other \code{data.table} operator that modifies input by reference is \code{\link{:=}}. Check out the \code{See Also} section below for other \code{set*} function \code{data.table} provides. - - \code{setDT} converts lists (both named and unnamed) and data.frames to data.tables \emph{by reference}. This feature was requested on \href{http://stackoverflow.com/questions/20345022/convert-a-data-frame-to-a-data-table-without-copy}{Stackoverflow}. - -} -\usage{ -setDT(x, keep.rownames=FALSE, key=NULL, check.names=FALSE) -} -\arguments{ - \item{x}{ A named or unnamed \code{list}, \code{data.frame} or \code{data.table}. } - \item{keep.rownames}{ For \code{data.frame}s, \code{TRUE} retains the \code{data.frame}'s row names under a new column \code{rn}. } - \item{key}{Character vector of one or more column names which is passed to \code{\link{setkeyv}}. It may be a single comma separated string such as \code{key="x,y,z"}, or a vector of names such as \code{key=c("x","y","z")}. } - \item{check.names}{ Just as \code{check.names} in \code{\link{data.frame}}. } -} - -\details{ - When working on large \code{lists} or \code{data.frames}, it might be both time and memory consuming to convert them to a \code{data.table} using \code{as.data.table(.)}, as this will make a complete copy of the input object before to convert it to a \code{data.table}. The \code{setDT} function takes care of this issue by allowing to convert \code{lists} - both named and unnamed lists and \code{data.frames} \emph{by reference} instead. That is, the input object is modified in place, no copy is being made. -} - -\value{ - The input is modified by reference, and returned (invisibly) so it can be used in compound statements; e.g., \code{setDT(X)[, sum(B), by=A]}. If you require a copy, take a copy first (using \code{DT2 = copy(DT)}). See \code{?copy}. -} - -\seealso{ \code{\link{data.table}}, \code{\link{as.data.table}}, \code{\link{setDF}}, \code{\link{copy}}, \code{\link{setkey}}, \code{\link{setcolorder}}, \code{\link{setattr}}, \code{\link{setnames}}, \code{\link{set}}, \code{\link{:=}}, \code{\link{setorder}} -} -\examples{ - -set.seed(45L) -X = data.frame(A=sample(3, 10, TRUE), - B=sample(letters[1:3], 10, TRUE), - C=sample(10), stringsAsFactors=FALSE) - -# Convert X to data.table by reference and -# get the frequency of each "A,B" combination -setDT(X)[, .N, by=.(A,B)] - -# convert list to data.table -# autofill names -X = list(1:4, letters[1:4]) -setDT(X) -# don't provide names -X = list(a=1:4, letters[1:4]) -setDT(X, FALSE) - -# setkey directly -X = list(a = 4:1, b=runif(4)) -setDT(X, key="a")[] - -# check.names argument -X = list(a=1:5, a=6:10) -setDT(X, check.names=TRUE)[] - -} -\keyword{ data } - diff --git a/man/setNumericRounding.Rd b/man/setNumericRounding.Rd deleted file mode 100644 index ea0cc3bacd..0000000000 --- a/man/setNumericRounding.Rd +++ /dev/null @@ -1,63 +0,0 @@ -\name{setNumericRounding} -\alias{setNumericRounding} -\alias{getNumericRounding} -\title{ Change or turn off numeric rounding } -\description{ -Change rounding to 0, 1 or 2 bytes when joining, grouping or ordering numeric -(i.e. double, POSIXct) columns. -} -\usage{ -setNumericRounding(x) -getNumericRounding() -} -\arguments{ - \item{x}{ integer or numeric vector: 0 (default), 1 or 2 byte rounding } -} -\details{ -Computers cannot represent some floating point numbers (such as 0.6) -precisely, using base 2. This leads to unexpected behaviour when joining or -grouping columns of type 'numeric'; i.e. 'double', see example below. In -cases where this is undesirable, data.table allows rounding such data up to -approximately 11 s.f. which is plenty of digits for many cases. This is -achieved by rounding the last 2 bytes off the significand. Other possible -values are 1 byte rounding, or no rounding (full precision, default). - -It's bytes rather than bits because it's tied in with the radix sort -algorithm for sorting numerics which sorts byte by byte. With the default -rounding of 0 bytes, at most 8 passes are needed. With rounding of 2 bytes, at -most 6 passes are needed (and therefore might be a tad faster). - -For large numbers (integers > 2^31), we recommend using -\code{bit64::integer64}, even though the default is to round off 0 bytes (full -precision). - } -\value{ -\code{setNumericRounding} returns no value; the new value is applied. -\code{getNumericRounding} returns the current value: 0, 1 or 2. -} -\seealso{ -\code{\link{datatable-optimize}}\cr -\url{http://en.wikipedia.org/wiki/Double-precision_floating-point_format}\cr -\url{http://en.wikipedia.org/wiki/Floating_point}\cr -\url{http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html} -} -\examples{ -DT = data.table(a=seq(0,1,by=0.2),b=1:2, key="a") -DT -setNumericRounding(0) # By default, rounding is turned off -DT[.(0.4)] # works -DT[.(0.6)] # no match, can be confusing since 0.6 is clearly there in DT - # happens due to floating point representation limitations - -setNumericRounding(2) # round off last 2 bytes -DT[.(0.6)] # works - -# using type 'numeric' for integers > 2^31 (typically ids) -DT = data.table(id = c(1234567890123, 1234567890124, 1234567890125), val=1:3) -print(DT, digits=15) -DT[,.N,by=id] # 1 row, (last 2 bytes rounded) -setNumericRounding(0) -DT[,.N,by=id] # 3 rows, (no rounding, default) -# better to use bit64::integer64 for such ids -} -\keyword{ data } diff --git a/man/setattr.Rd b/man/setattr.Rd deleted file mode 100644 index 056d7d5585..0000000000 --- a/man/setattr.Rd +++ /dev/null @@ -1,73 +0,0 @@ -\name{setattr} -\alias{setattr} -\alias{setnames} -\title{ Set attributes of objects by reference } -\description{ - In \code{data.table}, all \code{set*} functions change their input \emph{by reference}. That is, no copy is made at all, other than temporary working memory which is as large as one column. The only other \code{data.table} operator that modifies input by reference is \code{\link{:=}}. Check out the \code{See Also} section below for other \code{set*} function that \code{data.table} provides. -} -\usage{ -setattr(x,name,value) -setnames(x,old,new) -} -\arguments{ - \item{x}{ \code{setnames} accepts \code{data.frame} and \code{data.table}. \code{setattr} accepts any input; e.g, list, columns of a \code{data.frame} or \code{data.table}. } - \item{name}{ The character attribute name. } - \item{value}{ The value to assign to the attribute or \code{NULL} removes the attribute, if present. } - \item{old}{ When \code{new} is provided, character names or numeric positions of column names to change. When \code{new} is not provided, the new column names, which must be the same length as the number of columns. See examples. } - \item{new}{ Optional. New column names, must be the same length as columns provided to \code{old} argument. } -} -\details{ - - \code{setnames} operates on \code{data.table} and \code{data.frame} not other types like \code{list} and \code{vector}. It can be used to change names \emph{by name} with built-in checks and warnings (e.g., if any old names are missing or appear more than once). - - \code{setattr} is a more general function that allows setting of any attribute to an object \emph{by reference}. - - A very welcome change in R 3.1+ was that `names<-` and `colnames<-` no longer copy the \emph{entire} object as they used to (up to 4 times), see examples below. They now take a shallow copy. The `set*` functions in data.table are still useful because they don't even take a shallow copy. This allows changing names and attributes of a (usually very large) \code{data.table} in the global environment \emph{from within functions}. Like a database. - - } -\value{ - The input is modified by reference, and returned (invisibly) so it can be used in compound statements; e.g., \code{setnames(DT,"V1", "Y")[, .N, by=Y]}. If you require a copy, take a copy first (using \code{DT2=copy(DT)}). See \code{?copy}. - - Note that \code{setattr} is also in package \code{bit}. Both packages merely expose R's internal \code{setAttrib} function at C level but differ in return value. \code{bit::setattr} returns \code{NULL} (invisibly) to remind you the function is used for its side effect. \code{data.table::setattr} returns the changed object (invisibly) for use in compound statements. -} -\seealso{ \code{\link{data.table}}, \code{\link{setkey}}, \code{\link{setorder}}, \code{\link{setcolorder}}, \code{\link{set}}, \code{\link{:=}}, \code{\link{setDT}}, \code{\link{setDF}}, \code{\link{copy}} -} -\examples{ - -DF = data.frame(a=1:2,b=3:4) # base data.frame to demo copies and syntax -if (capabilities()["profmem"]) # usually memory profiling is available but just in case - tracemem(DF) -colnames(DF)[1] <- "A" # 4 shallow copies (R >= 3.1, was 4 deep copies before) -names(DF)[1] <- "A" # 3 shallow copies -names(DF) <- c("A", "b") # 1 shallow copy -`names<-`(DF,c("A","b")) # 1 shallow copy - -DT = data.table(a=1:2,b=3:4,c=5:6) # compare to data.table -if (capabilities()["profmem"]) - tracemem(DT) # by reference, no deep or shallow copies -setnames(DT,"b","B") # by name, no match() needed (warning if "b" is missing) -setnames(DT,3,"C") # by position with warning if 3 > ncol(DT) -setnames(DT,2:3,c("D","E")) # multiple -setnames(DT,c("a","E"),c("A","F")) # multiple by name (warning if either "a" or "E" is missing) -setnames(DT,c("X","Y","Z")) # replace all (length of names must be == ncol(DT)) - -DT <- data.table(x = 1:3, y = 4:6, z = 7:9) -setnames(DT, -2, c("a", "b")) # NEW FR #1443, allows -ve indices in 'old' argument - -DT = data.table(a=1:3, b=4:6) -f = function(...) { - # ... - setattr(DT,"myFlag",TRUE) # by reference - # ... - localDT = copy(DT) - setattr(localDT,"myFlag2",TRUE) - # ... - invisible() -} -f() -attr(DT,"myFlag") # TRUE -attr(DT,"myFlag2") # NULL - -} -\keyword{ data } - diff --git a/man/setcolorder.Rd b/man/setcolorder.Rd deleted file mode 100644 index 3026a03a4d..0000000000 --- a/man/setcolorder.Rd +++ /dev/null @@ -1,38 +0,0 @@ -\name{setcolorder} -\alias{setcolorder} - -\title{Fast column reordering of a data.table by reference} -\description{ - In \code{data.table} parlance, all \code{set*} functions change their input \emph{by reference}. That is, no copy is made at all, other than temporary working memory, which is as large as one column. The only other \code{data.table} operator that modifies input by reference is \code{\link{:=}}. Check out the \code{See Also} section below for other \code{set*} function \code{data.table} provides. - - \code{setcolorder} reorders the columns of data.table, \emph{by reference}, to the new order provided. -} - -\usage{ -setcolorder(x, neworder) -} -\arguments{ - \item{x}{ A \code{data.table}. } - \item{neworder}{ Character vector of the new column name ordering. May also be column numbers. If \code{length(neworder) < length(x)}, the specified columns are moved in order to the "front" of \code{x}. } -} -\details{ - To reorder \code{data.table} columns, the idiomatic way is to use \code{setcolorder(x, neworder)}, instead of doing \code{x <- x[, neworder, with=FALSE]}. This is because the latter makes an entire copy of the \code{data.table}, which maybe unnecessary in most situations. \code{setcolorder} also allows column numbers instead of names for \code{neworder} argument, although we recommend using names as a good programming practice. -} -\value{ - The input is modified by reference, and returned (invisibly) so it can be used in compound statements. If you require a copy, take a copy first (using \code{DT2 = copy(DT)}). See \code{?copy}. -} -\seealso{ \code{\link{setkey}}, \code{\link{setorder}}, \code{\link{setattr}}, \code{\link{setnames}}, \code{\link{set}}, \code{\link{:=}}, \code{\link{setDT}}, \code{\link{setDF}}, \code{\link{copy}}, \code{\link{getNumericRounding}}, \code{\link{setNumericRounding}} -} -\examples{ - -set.seed(45L) -DT = data.table(A=sample(3, 10, TRUE), - B=sample(letters[1:3], 10, TRUE), C=sample(10)) - -setcolorder(DT, c("C", "A", "B")) - -#incomplete specification -setcolorder(DT, "A") -} -\keyword{ data } - diff --git a/man/setkey.Rd b/man/setkey.Rd deleted file mode 100644 index cf48542206..0000000000 --- a/man/setkey.Rd +++ /dev/null @@ -1,174 +0,0 @@ -\name{setkey} -\alias{setkey} -\alias{setkeyv} -\alias{key} -\alias{key<-} -\alias{haskey} -\alias{set2key} -\alias{set2keyv} -\alias{setindex} -\alias{setindexv} -\alias{key2} -\alias{indices} -\title{ Create key on a data table } -\description{ -In \code{data.table} parlance, all \code{set*} functions change their input -\emph{by reference}. That is, no copy is made at all, other than temporary -working memory, which is as large as one column. The only other \code{data.table} -operator that modifies input by reference is \code{\link{:=}}. Check out the -\code{See Also} section below for other \code{set*} function \code{data.table} -provides. - -\code{setkey()} sorts a \code{data.table} and marks it as sorted (with an -attribute \code{sorted}). The sorted columns are the key. The key can be any -columns in any order. The columns are sorted in ascending order always. The table -is changed \emph{by reference} and is therefore very memory efficient. - -\code{setindex()} creates an index (or indices) on provided columns. This index is simply an -order of the dataset's according to the provided columns. This order is stored as a \code{data.table} -attribute, and the dataset retains the original order in memory. -See the \href{../doc/datatable-secondary-indices-and-auto-indexing.html}{Secondary indices and auto indexing} vignette for more details. - -\code{key()} returns the \code{data.table}'s key if it exists, and \code{NULL} -if none exist. - -\code{haskey()} returns a logical \code{TRUE}/\code{FALSE} depending on whether -the \code{data.table} has a key (or not). -} -\usage{ -setkey(x, ..., verbose=getOption("datatable.verbose"), physical = TRUE) -setkeyv(x, cols, verbose=getOption("datatable.verbose"), physical = TRUE) -setindex(...) -setindexv(x, cols, verbose=getOption("datatable.verbose")) -key(x) -indices(x, vectors = FALSE) -haskey(x) -key(x) <- value # DEPRECATED, please use setkey or setkeyv instead. -} -\arguments{ -\item{x}{ A \code{data.table}. } -\item{\dots}{ The columns to sort by. Do not quote the column names. If -\code{\dots} is missing (i.e. \code{setkey(DT)}), all the columns are used. -\code{NULL} removes the key. } -\item{cols}{ A character vector of column names. For \code{setindexv}, this can be a \code{list} of character vectors, in which case each element will be applied as an index. } -\item{value}{ In (deprecated) \code{key<-}, a character vector (only) of column -names.} -\item{verbose}{ Output status and information. } -\item{physical}{ TRUE changes the order of the data in RAM. FALSE adds a -secondary key a.k.a. index. } -\item{vectors}{ logical scalar default \code{FALSE}, when set to \code{TRUE} -then list of character vectors is returned, each vector refers to one index. } -} -\details{ -\code{setkey} reorders (or sorts) the rows of a data.table by the columns -provided. In versions \code{1.9+}, for \code{integer} columns, a modified version -of base's counting sort is implemented, which allows negative values as well. It -is extremely fast, but is limited by the range of integer values being <= 1e5. If -that fails, it falls back to a (fast) 4-pass radix sort for integers, implemented -based on Pierre Terdiman's and Michael Herf's code (see links below). Similarly, -a very fast 6-pass radix order for columns of type \code{double} is also implemented. -This gives a speed-up of about 5-8x compared to \code{1.8.10} on \code{setkey} -and all internal \code{order}/\code{sort} operations. Fast radix sorting is also -implemented for \code{character} and \code{bit64::integer64} types. - -The sort is \emph{stable}; i.e., the order of ties (if any) is preserved, in both -versions - \code{<=1.8.10} and \code{>= 1.9.0}. - -In \code{data.table} versions \code{<= 1.8.10}, for columns of type \code{integer}, -the sort is attempted with the very fast \code{"radix"} method in -\code{\link[base]{sort.list}}. If that fails, the sort reverts to the default -method in \code{\link[base]{order}}. For character vectors, \code{data.table} -takes advantage of R's internal global string cache and implements a very efficient -order, also exported as \code{\link{chorder}}. - -In v1.7.8, the \code{key<-} syntax was deprecated. The \code{<-} method copies -the whole table and we know of no way to avoid that copy without a change in -\R itself. Please use the \code{set}* functions instead, which make no copy at -all. \code{setkey} accepts unquoted column names for convenience, whilst -\code{setkeyv} accepts one vector of column names. - -The problem (for \code{data.table}) with the copy by \code{key<-} (other than -being slower) is that \R doesn't maintain the over allocated truelength, but it -looks as though it has. Adding a column by reference using \code{:=} after a -\code{key<-} was therefore a memory overwrite and eventually a segfault; the -over allocated memory wasn't really there after \code{key<-}'s copy. \code{data.table}s -now have an attribute \code{.internal.selfref} to catch and warn about such copies. -This attribute has been implemented in a way that is friendly with -\code{identical()} and \code{object.size()}. - -For the same reason, please use the other \code{set*} functions which modify -objects by reference, rather than using the \code{<-} operator which results -in copying the entire object. - -It isn't good programming practice, in general, to use column numbers rather -than names. This is why \code{setkey} and \code{setkeyv} only accept column names. -If you use column numbers then bugs (possibly silent) can more easily creep into -your code as time progresses if changes are made elsewhere in your code; e.g., if -you add, remove or reorder columns in a few months time, a \code{setkey} by column -number will then refer to a different column, possibly returning incorrect results -with no warning. (A similar concept exists in SQL, where \code{"select * from ..."} -is considered poor programming style when a robust, maintainable system is -required.) If you really wish to use column numbers, it's possible but -deliberately a little harder; e.g., \code{setkeyv(DT,colnames(DT)[1:2])}. -} -\value{ -The input is modified by reference, and returned (invisibly) so it can be used -in compound statements; e.g., \code{setkey(DT,a)[J("foo")]}. If you require a -copy, take a copy first (using \code{DT2=copy(DT)}). \code{copy()} may also -sometimes be useful before \code{:=} is used to subassign to a column by -reference. See \code{?copy}. -} -\references{ -\url{http://en.wikipedia.org/wiki/Radix_sort}\cr -\url{http://en.wikipedia.org/wiki/Counting_sort}\cr -\url{http://cran.at.r-project.org/web/packages/bit/index.html}\cr -\url{http://stereopsis.com/radix.html} -} -\note{ Despite its name, \code{base::sort.list(x,method="radix")} actually -invokes a \emph{counting sort} in R, not a radix sort. See \code{do_radixsort} in -src/main/sort.c. A counting sort, however, is particularly suitable for -sorting integers and factors, and we like it. In fact we like it so much -that \code{data.table} contains a counting sort algorithm for character vectors -using R's internal global string cache. This is particularly fast for character -vectors containing many duplicates, such as grouped data in a key column. This -means that character is often preferred to factor. Factors are still fully -supported, in particular ordered factors (where the levels are not in -alphabetic order). -} -\seealso{ \code{\link{data.table}}, \code{\link{tables}}, \code{\link{J}}, -\code{\link[base]{sort.list}}, \code{\link{copy}}, \code{\link{setDT}}, -\code{\link{setDF}}, \code{\link{set}} \code{\link{:=}}, \code{\link{setorder}}, -\code{\link{setcolorder}}, \code{\link{setattr}}, \code{\link{setnames}}, -\code{\link{chorder}}, \code{\link{setNumericRounding}} -} -\examples{ -# Type 'example(setkey)' to run these at prompt and browse output - -DT = data.table(A=5:1,B=letters[5:1]) -DT # before -setkey(DT,B) # re-orders table and marks it sorted. -DT # after -tables() # KEY column reports the key'd columns -key(DT) -keycols = c("A","B") -setkeyv(DT,keycols) # rather than key(DT)<-keycols (which copies entire table) - -DT = data.table(A=5:1,B=letters[5:1]) -DT2 = DT # does not copy -setkey(DT2,B) # does not copy-on-write to DT2 -identical(DT,DT2) # TRUE. DT and DT2 are two names for the same keyed table - -DT = data.table(A=5:1,B=letters[5:1]) -DT2 = copy(DT) # explicit copy() needed to copy a data.table -setkey(DT2,B) # now just changes DT2 -identical(DT,DT2) # FALSE. DT and DT2 are now different tables - -DT = data.table(A=5:1,B=letters[5:1]) -setindex(DT) # set indices -setindex(DT, A) -setindex(DT, B) -indices(DT) # get indices single vector -indices(DT, vectors = TRUE) # get indices list -} -\keyword{ data } - diff --git a/man/setops.Rd b/man/setops.Rd deleted file mode 100644 index d590ec86cd..0000000000 --- a/man/setops.Rd +++ /dev/null @@ -1,59 +0,0 @@ -\name{setops} -\alias{setops} -\alias{intersect} -\alias{fintersect} -\alias{setdiff} -\alias{fsetdiff} -\alias{except} -\alias{fexcept} -\alias{union} -\alias{funion} -\alias{setequal} -\alias{fsetequal} -\title{ Set operations for data tables } -\description{ - Similar to base's set functions, \code{union}, \code{intersect}, \code{setdiff} and \code{setequal} but for \code{data.table}s. Additional \code{all} argument controls if/how \code{duplicate} rows are returned. \code{bit64::integer64} is also supported. - - Unlike SQL, data.table functions will retain order of rows in result. -} -\usage{ -fintersect(x, y, all = FALSE) -fsetdiff(x, y, all = FALSE) -funion(x, y, all = FALSE) -fsetequal(x, y) -} -\arguments{ - \item{x,y}{\code{data.table}s.} - \item{all}{Logical. Default is \code{FALSE} and removes duplicate rows on the result. When \code{TRUE}, if there are \code{xn} copies of a particular row in \code{x} and \code{yn} copies of the same row in \code{y}, then: - \itemize{ - - \item{\code{fintersect} will return \code{min(xn, yn)} copies of that row.} - - \item{\code{fsetdiff} will return \code{max(0, xn-yn)} copies of that row.} - - \item{\code{funion} will return xn+yn copies of that row.}} - } -} -\details{ - Columns of type \code{complex} and \code{list} are not supported except for \code{funion}. -} -\value{ - A data.table in case of \code{fintersect}, \code{funion} and \code{fsetdiff}. Logical \code{TRUE} or \code{FALSE} for \code{fsetequal}. -} -\seealso{ \code{\link{data.table}}, \code{\link{rbindlist}}, \code{\link{all.equal.data.table}}, \code{\link{unique}}, \code{\link{duplicated}}, \code{\link{uniqueN}}, \code{\link{anyDuplicated}} -} -\references{ -\url{https://db.apache.org/derby/papers/Intersect-design.html} -} -\examples{ -x = data.table(c(1,2,2,2,3,4,4)) -y = data.table(c(2,3,4,4,4,5)) -fintersect(x, y) # intersect -fintersect(x, y, all=TRUE) # intersect all -fsetdiff(x, y) # except -fsetdiff(x, y, all=TRUE) # except all -funion(x, y) # union -funion(x, y, all=TRUE) # union all -fsetequal(x, y) # setequal -} -\keyword{ data } diff --git a/man/setorder.Rd b/man/setorder.Rd deleted file mode 100644 index 15e4d92328..0000000000 --- a/man/setorder.Rd +++ /dev/null @@ -1,122 +0,0 @@ -\name{setorder} -\alias{setorder} -\alias{setorderv} -\alias{order} -\alias{fastorder} -\alias{forder} - -\title{Fast row reordering of a data.table by reference} -\description{ -In \code{data.table} parlance, all \code{set*} functions change their input -\emph{by reference}. That is, no copy is made at all, other than temporary -working memory, which is as large as one column. The only other -\code{data.table} operator that modifies input by reference is \code{\link{:=}}. -Check out the \code{See Also} section below for other \code{set*} function -\code{data.table} provides. - -\code{setorder} (and \code{setorderv}) reorders the rows of a \code{data.table} -based on the columns (and column order) provided. It reorders the table -\emph{by reference} and is therefore very memory efficient. - -Also \code{x[order(.)]} is now optimised internally to use data.table's fast -order. data.table always reorders in "C-locale" (see Details). To sort by session -locale, use \code{x[base::order(.)]}. - -\code{bit64::integer64} type is also supported for reordering rows of a -\code{data.table}. -} - -\usage{ -setorder(x, ..., na.last=FALSE) -setorderv(x, cols, order=1L, na.last=FALSE) -# optimised to use data.table's internal fast order -# x[order(., na.last=TRUE)] -} -\arguments{ -\item{x}{ A \code{data.table}. } -\item{...}{ The columns to sort by. Do not quote column names. If \code{...} -is missing (ex: \code{setorder(x)}), \code{x} is rearranged based on all -columns in ascending order by default. To sort by a column in descending order -prefix a \code{"-"}, i.e., \code{setorder(x, a, -b, c)}. The \code{-b} works -when \code{b} is of type \code{character} as well. } -\item{cols}{ A character vector of column names of \code{x}, to which to order -by. Do not add \code{"-"} here. Use \code{order} argument instead.} -\item{order}{ An integer vector with only possible values of \code{1} and -\code{-1}, corresponding to ascending and descending order. The length of -\code{order} must be either \code{1} or equal to that of \code{cols}. If -\code{length(order) == 1}, it's recycled to \code{length(cols)}. } -\item{na.last}{logical. If \code{TRUE}, missing values in the data are placed -last; if \code{FALSE}, they are placed first; if \code{NA} they are removed. -\code{na.last=NA} is valid only for \code{x[order(., na.last)]} and it's -default is \code{TRUE}. \code{setorder} and \code{setorderv} only accept -TRUE/FALSE with default \code{FALSE}.} -} -\details{ -\code{data.table} implements fast radix based ordering. In versions <= 1.9.2, -it was only capable of increasing order (ascending). From 1.9.4 on, the -functionality has been extended to decreasing order (descending) as well. - -\code{setorder} accepts unquoted column names (with names preceded with a -\code{-} sign for descending order) and reorders data.table rows -\emph{by reference}, for e.g., \code{setorder(x, a, -b, c)}. Note that -\code{-b} also works with columns of type \code{character} unlike -\code{base::order}, which requires \code{-xtfrm(y)} instead (which is slow). -\code{setorderv} in turn accepts a character vector of column names and an -integer vector of column order separately. - -Note that \code{\link{setkey}} still requires and will always sort only in -ascending order, and is different from \code{setorder} in that it additionally -sets the \code{sorted} attribute. - -\code{na.last} argument, by default, is \code{FALSE} for \code{setorder} and -\code{setorderv} to be consistent with \code{data.table}'s \code{setkey} and -is \code{TRUE} for \code{x[order(.)]} to be consistent with \code{base::order}. -Only \code{x[order(.)]} can have \code{na.last = NA} as it's a subset operation -as opposed to \code{setorder} or \code{setorderv} which reorders the data.table -by reference. - -\code{data.table} always reorders in "C-locale". -As a consequence, the ordering may be different to that obtained by \code{base::order}. -In English locales, for example, sorting is case-sensitive in C-locale. -Thus, sorting \code{c("c", "a", "B")} returns \code{c("B", "a", "c")} in \code{data.table} - but \code{c("a", "B", "c")} in \code{base::order}. Note this makes no difference in most cases -of data; both return identical results on ids where only upper-case or lower-case letters are present (\code{"AB123" < "AC234"} -is true in both), or on country names and other proper nouns which are consistently capitalized. -For example, neither \code{"America" < "Brazil"} nor -\code{"america" < "brazil"} are affected since the first letter is consistently -capitalized. - -Using C-locale makes the behaviour of sorting in \code{data.table} more consistent across sessions and locales. -The behaviour of \code{base::order} depends on assumptions about the locale of the R session. -In English locales, \code{"america" < "BRAZIL"} is true by default -but false if you either type \code{Sys.setlocale(locale="C")} or the R session has been started in a C locale -for you -- which can happen on servers/services since the locale comes from the environment the R session -was started in. By contrast, \code{"america" < "BRAZIL"} is always false in \code{data.table} regardless of the way your R session was started. - -If \code{setorder} results in reordering of the rows of a keyed \code{data.table}, -then it's key will be set to \code{NULL}. -} -\value{ -The input is modified by reference, and returned (invisibly) so it can be used -in compound statements; e.g., \code{setorder(DT,a,-b)[, cumsum(c), by=list(a,b)]}. -If you require a copy, take a copy first (using \code{DT2 = copy(DT)}). See -\code{?copy}. -} -\seealso{ \code{\link{setkey}}, \code{\link{setcolorder}}, \code{\link{setattr}}, -\code{\link{setnames}}, \code{\link{set}}, \code{\link{:=}}, \code{\link{setDT}}, -\code{\link{setDF}}, \code{\link{copy}}, \code{\link{setNumericRounding}} -} -\examples{ - -set.seed(45L) -DT = data.table(A=sample(3, 10, TRUE), - B=sample(letters[1:3], 10, TRUE), C=sample(10)) - -# setorder -setorder(DT, A, -B) - -# same as above, but using setorderv -setorderv(DT, c("A", "B"), c(1, -1)) -} -\keyword{ data } - diff --git a/man/shift.Rd b/man/shift.Rd deleted file mode 100644 index 9f0546bb3e..0000000000 --- a/man/shift.Rd +++ /dev/null @@ -1,77 +0,0 @@ -\name{shift} -\alias{shift} -\alias{lead} -\alias{lag} -\title{Fast lead/lag for vectors and lists} -\description{ - \code{lead} or \code{lag} vectors, lists, data.frames or data.tables implemented in C for speed. - - \code{bit64::integer64} is also supported. -} - -\usage{ -shift(x, n=1L, fill=NA, type=c("lag", "lead"), give.names=FALSE) -} -\arguments{ - \item{x}{ A vector, list, data.frame or data.table. } - \item{n}{ Non-negative integer vector denoting the offset to lead or lag the input by. To create multiple lead/lag vectors, provide multiple values to \code{n}. } - \item{fill}{ Value to pad by. } - \item{type}{ default is \code{"lag"}. The other possible value is \code{"lead"}. } - \item{give.names}{default is \code{FALSE} which returns an unnamed list. When \code{TRUE}, names are automatically generated corresponding to \code{type} and \code{n}. } -} -\details{ - \code{shift} accepts vectors, lists, data.frames or data.tables. It always returns a list except when the input is a \code{vector} and \code{length(n) == 1} in which case a \code{vector} is returned, for convenience. This is so that it can be used conveniently within data.table's syntax. For example, \code{DT[, (cols) := shift(.SD, 1L), by=id]} would lag every column of \code{.SD} by 1 for each group and \code{DT[, newcol := colA + shift(colB)]} would assign the sum of two \emph{vectors} to \code{newcol}. - - Argument \code{n} allows multiple values. For example, \code{DT[, (cols) := shift(.SD, 1:2), by=id]} would lag every column of \code{.SD} by \code{1} and \code{2} for each group. If \code{.SD} contained four columns, the first two elements of the list would correspond to \code{lag=1} and \code{lag=2} for the first column of \code{.SD}, the next two for second column of \code{.SD} and so on. Please see examples for more. - - \code{shift} is designed mainly for use in data.tables along with \code{:=} or \code{set}. Therefore, it returns an unnamed list by default as assigning names for each group over and over can be quite time consuming with many groups. It may be useful to set names automatically in other cases, which can be done by setting \code{give.names} to \code{TRUE}. -} -\value{ - A list containing the lead/lag of input \code{x}. -} - -\examples{ -# on vectors, returns a vector as long as length(n) == 1, #1127 -x = 1:5 -# lag with n=1 and pad with NA (returns vector) -shift(x, n=1, fill=NA, type="lag") -# lag with n=1 and 2, and pad with 0 (returns list) -shift(x, n=1:2, fill=0, type="lag") - -# on data.tables -DT = data.table(year=2010:2014, v1=runif(5), v2=1:5, v3=letters[1:5]) -# lag columns 'v1,v2,v3' DT by 1 and fill with 0 -cols = c("v1","v2","v3") -anscols = paste("lead", cols, sep="_") -DT[, (anscols) := shift(.SD, 1, 0, "lead"), .SDcols=cols] - -# return a new data.table instead of updating -# with names automatically set -DT = data.table(year=2010:2014, v1=runif(5), v2=1:5, v3=letters[1:5]) -DT[, shift(.SD, 1:2, NA, "lead", TRUE), .SDcols=2:4] - -# lag/lead in the right order -DT = data.table(year=2010:2014, v1=runif(5), v2=1:5, v3=letters[1:5]) -DT = DT[sample(nrow(DT))] -# add lag=1 for columns 'v1,v2,v3' in increasing order of 'year' -cols = c("v1","v2","v3") -anscols = paste("lag", cols, sep="_") -DT[order(year), (cols) := shift(.SD, 1, type="lag"), .SDcols=cols] -DT[order(year)] - -# while grouping -DT = data.table(year=rep(2010:2011, each=3), v1=1:6) -DT[, c("lag1", "lag2") := shift(.SD, 1:2), by=year] - -# on lists -ll = list(1:3, letters[4:1], runif(2)) -shift(ll, 1, type="lead") -shift(ll, 1, type="lead", give.names=TRUE) -shift(ll, 1:2, type="lead") - -} -\seealso{ - \code{\link{data.table}} -} -\keyword{ data } - diff --git a/man/shouldPrint.Rd b/man/shouldPrint.Rd deleted file mode 100644 index 80851f53d8..0000000000 --- a/man/shouldPrint.Rd +++ /dev/null @@ -1,25 +0,0 @@ -\name{shouldPrint} -\alias{shouldPrint} -\title{ For use by packages that mimic/divert auto printing e.g. IRkernel and knitr } -\description{ - Not for use by users. Exported only for use by IRkernel (Jupyter) and knitr. -} -\usage{ - shouldPrint(x) -} -\arguments{ - \item{x}{ A \code{data.table}. } -} -\details{ - Should IRkernel/Jupyter print a data.table returned invisibly by DT[,:=] ? - This is a read-once function since it resets an internal flag. If you need the value more than once in your logic, store the value from the first call. -} -\value{ - TRUE or FALSE. -} -\references{ - \url{https://github.com/IRkernel/IRkernel/issues/127}\cr - \url{https://github.com/Rdatatable/data.table/issues/933}\cr -} - - diff --git a/man/special-symbols.Rd b/man/special-symbols.Rd deleted file mode 100644 index 4e2e28a069..0000000000 --- a/man/special-symbols.Rd +++ /dev/null @@ -1,50 +0,0 @@ -\name{special-symbols} -\alias{special-symbols} -\alias{datatable-symbols} -\alias{.SD} -\alias{.I} -\alias{.GRP} -\alias{.BY} -\alias{.N} -\title{ Special symbols } -\description{ - \code{.SD}, \code{.BY}, \code{.N}, \code{.I} and \code{.GRP} are \emph{read only} symbols for use in \code{j}. \code{.N} can be used in \code{i} as well. See the vignettes and examples here and in \code{\link{data.table}}. -} -\details{ - The bindings of these variables are locked and attempting to assign to them will generate an error. If you wish to manipulate \code{.SD} before returning it, take a \code{copy(.SD)} first (see FAQ 4.5). Using \code{:=} in the \code{j} of \code{.SD} is reserved for future use as a (tortuously) flexible way to update \code{DT} by reference by group (even when groups are not contiguous in an ad hoc by). - - These symbols are used in \code{j} and defined as follows. - - \itemize{ - \item{\code{.SD} is a \code{data.table} containing the \bold{S}ubset of \code{x}'s \bold{D}ata for each group, excluding any columns used in \code{by} (or \code{keyby}).} - \item{\code{.BY} is a \code{list} containing a length 1 vector for each item in \code{by}. This can be useful when \code{by} is not known in advance. The \code{by} variables are also available to \code{j} directly by name; useful for example for titles of graphs if \code{j} is a plot command, or to branch with \code{if()} depending on the value of a group variable.} - \item{\code{.N} is an integer, length 1, containing the number of rows in the group. This may be useful when the column names are not known in advance and for convenience generally. When grouping by \code{i}, \code{.N} is the number of rows in \code{x} matched to, for each row of \code{i}, regardless of whether \code{nomatch} is \code{NA} or \code{0}. It is renamed to \code{N} (no dot) in the result (otherwise a column called \code{".N"} could conflict with the \code{.N} variable, see FAQ 4.6 for more details and example), unless it is explicitly named; e.g., \code{DT[,list(total=.N),by=a]}.} - \item{\code{.I} is an integer vector equal to \code{seq_len(nrow(x))}. While grouping, it holds for each item in the group, it's row location in \code{x}. This is useful to subset in \code{j}; e.g. \code{DT[, .I[which.max(somecol)], by=grp]}.} - \item{\code{.GRP} is an integer, length 1, containing a simple group counter. 1 for the 1st group, 2 for the 2nd, etc.} - } -} -\seealso{ - \code{\link{data.table}}, \code{\link{:=}}, \code{\link{set}}, \code{\link{datatable-optimize}} -} -\examples{ -\dontrun{ -DT = data.table(x=rep(c("b","a","c"),each=3), v=c(1,1,1,2,2,1,1,2,2), y=c(1,3,6), a=1:9, b=9:1) -DT -X = data.table(x=c("c","b"), v=8:7, foo=c(4,2)) -X - -DT[.N] # last row, only special symbol allowed in 'i' -DT[, .N] # total number of rows in DT -DT[, .N, by=x] # number of rows in each group -DT[, .SD, .SDcols=x:y] # select columns 'x' and 'y' -DT[, .SD[1]] # first row of all columns -DT[, .SD[1], by=x] # first row of 'y' and 'v' for each group in 'x' -DT[, c(.N, lapply(.SD, sum)), by=x] # get rows *and* sum columns 'v' and 'y' by group -DT[, .I[1], by=x] # row number in DT corresponding to each group -DT[, .N, by=rleid(v)] # get count of consecutive runs of 'v' -DT[, c(.(y=max(y)), lapply(.SD, min)), - by=rleid(v), .SDcols=v:b] # compute 'j' for each consecutive runs of 'v' -DT[, grp := .GRP, by=x] # add a group counter -X[, DT[.BY, y, on="x"], by=x] # join within each group -}} -\keyword{ data } diff --git a/man/split.Rd b/man/split.Rd deleted file mode 100644 index 2b854bede3..0000000000 --- a/man/split.Rd +++ /dev/null @@ -1,76 +0,0 @@ -\name{split} -\alias{split} -\alias{split.data.table} -\title{ Split data.table into chunks in a list } -\description{ - Split method for data.table. Faster and more flexible. Be aware that processing list of data.tables will be generally much slower than manipulation in single data.table by group using \code{by} argument, read more on \code{\link{data.table}}. -} -\usage{ -\method{split}{data.table}(x, f, drop = FALSE, - by, sorted = FALSE, keep.by = TRUE, flatten = TRUE, - ..., verbose = getOption("datatable.verbose")) -} -\arguments{ - \item{x}{data.table } - \item{f}{factor or list of factors. Same as \code{\link[base]{split.data.frame}}. Use \code{by} argument instead, this is just for consistency with data.frame method.} - \item{drop}{logical. Default \code{FALSE} will not drop empty list elements caused by factor levels not referred by that factors. Works also with new arguments of split data.table method.} - \item{by}{character vector. Column names on which split should be made. For \code{length(by) > 1L} and \code{flatten} FALSE it will result nested lists with data.tables on leafs.} - \item{sorted}{When default \code{FALSE} it will retain the order of groups we are splitting on. When \code{TRUE} then sorted list(s) are returned. Does not have effect for \code{f} argument.} - \item{keep.by}{logical default \code{TRUE}. Keep column provided to \code{by} argument.} - \item{flatten}{logical default \code{TRUE} will unlist nested lists of data.tables. When using \code{f} results are always flattened to list of data.tables.} - \item{\dots}{passed to data.frame way of processing when using \code{f} argument.} - \item{verbose}{logical default \code{FALSE}. When \code{TRUE} it will print to console data.table split query used to split data.} -} -\details{ - Argument \code{f} is just for consistency in usage to data.frame method. Recommended is to use \code{by} argument instead, it will be faster, more flexible, and by default will preserve order according to order in data. -} -\value{ - List of \code{data.table}s. If using \code{flatten} FALSE and \code{length(by) > 1L} then recursively nested lists having \code{data.table}s as leafs of grouping according to \code{by} argument. -} -\seealso{ \code{\link{data.table}}, \code{\link{rbindlist}} } -\examples{ -set.seed(123) -DT = data.table(x1 = rep(letters[1:2], 6), - x2 = rep(letters[3:5], 4), - x3 = rep(letters[5:8], 3), - y = rnorm(12)) -DT = DT[sample(.N)] -DF = as.data.frame(DT) - -# split consistency with data.frame: `x, f, drop` -all.equal( - split(DT, list(DT$x1, DT$x2)), - lapply(split(DF, list(DF$x1, DF$x2)), setDT) -) - -# nested list using `flatten` arguments -split(DT, by=c("x1", "x2")) -split(DT, by=c("x1", "x2"), flatten=FALSE) - -# dealing with factors -fdt = DT[, c(lapply(.SD, as.factor), list(y=y)), .SDcols=x1:x3] -fdf = as.data.frame(fdt) -sdf = split(fdf, list(fdf$x1, fdf$x2)) -all.equal( - split(fdt, by=c("x1", "x2"), sorted=TRUE), - lapply(sdf[sort(names(sdf))], setDT) -) - -# factors having unused levels, drop FALSE, TRUE -fdt = DT[, .(x1 = as.factor(c(as.character(x1), "c"))[-13L], - x2 = as.factor(c("a", as.character(x2)))[-1L], - x3 = as.factor(c("a", as.character(x3), "z"))[c(-1L,-14L)], - y = y)] -fdf = as.data.frame(fdt) -sdf = split(fdf, list(fdf$x1, fdf$x2)) -all.equal( - split(fdt, by=c("x1", "x2"), sorted=TRUE), - lapply(sdf[sort(names(sdf))], setDT) -) -sdf = split(fdf, list(fdf$x1, fdf$x2), drop=TRUE) -all.equal( - split(fdt, by=c("x1", "x2"), sorted=TRUE, drop=TRUE), - lapply(sdf[sort(names(sdf))], setDT) -) -} -\keyword{ data } diff --git a/man/subset.data.table.Rd b/man/subset.data.table.Rd deleted file mode 100644 index fbbb2075bd..0000000000 --- a/man/subset.data.table.Rd +++ /dev/null @@ -1,55 +0,0 @@ -\name{subset.data.table} -\alias{subset} -\alias{subset.data.table} - -\title{ Subsetting data.tables } - -\description{ - Returns subsets of a \code{data.table}. -} - -\usage{ - \method{subset}{data.table}(x, subset, select, \ldots) -} - -\arguments{ - \item{x}{ - \code{data.table} to subset. - } - \item{subset}{ - logical expression indicating elements or rows to keep - } - \item{select}{ - expression indicating columns to select from \code{data.table} - } - \item{\ldots}{ - further arguments to be passed to or from other methods - } -} - -\details{ - The \code{subset} argument works on the rows and will be evaluated - in the \code{data.table} so columns can be referred to (by name) as variables - in the expression. - - The \code{data.table} that is returned will maintain the original keys - as long as they are not \code{select}-ed out. -} - -\value{ - A \code{data.table} containing the subset of rows and columns that are - selected. -} -\seealso{ \code{\link[base]{subset}} } -\examples{ - -DT <- data.table(a=sample(c('a', 'b', 'c'), 20, replace=TRUE), - b=sample(c('a', 'b', 'c'), 20, replace=TRUE), - c=sample(20), key=c('a', 'b')) - -sub <- subset(DT, a == 'a') -all.equal(key(sub), key(DT)) -} -\keyword{ data } - - diff --git a/man/tables.Rd b/man/tables.Rd deleted file mode 100644 index 5b95edffa2..0000000000 --- a/man/tables.Rd +++ /dev/null @@ -1,36 +0,0 @@ -\name{tables} -\alias{tables} -\title{Display 'data.table' metadata } -\description{ - Convenience function for concisely summarizing some metadata of all \code{data.table}s in memory (or an optionally specified environment). -} -\usage{ -tables(mb=TRUE, order.col="NAME", width=80, - env=parent.frame(), silent=FALSE, index=FALSE) -} -\arguments{ - \item{mb}{ \code{logical}; \code{TRUE} adds the rough size of each \code{data.table} in megabytes to the output under column \code{MB}. } - \item{order.col}{ Column name (\code{character}) by which to sort the output. } - \item{width}{ \code{integer}; number of characters beyond which the output for each of the columns \code{COLS}, \code{KEY}, and \code{INDICES} are truncated. } - \item{env}{ An \code{environment}, typically the \code{.GlobalEnv} by default, see Details. } - \item{silent}{ \code{logical}; should the output be printed? } - \item{index}{ \code{logical}; if \code{TRUE}, the column \code{INDICES} is added to indicate the indices assorted with each object, see \code{\link{indices}}. } -} -\details{ -Usually \code{tables()} is executed at the prompt, where \code{parent.frame()} returns \code{.GlobalEnv}. \code{tables()} may also be useful inside functions where \code{parent.frame()} is the local scope of the function; in such a scenario, simply set it to \code{.GlobalEnv} to get the same behaviour as at prompt. - -Note that on older versions of \R, \code{object.size} may be slow, so setting \code{mb=FALSE} may speed up execution of \code{tables} significantly. - -Setting \code{silent=TRUE} prints nothing; the metadata are returned as a \code{data.table}, invisibly, whether silent is \code{TRUE} or \code{FALSE}. -} -\value{ - A \code{data.table} containing the information printed. -} -\seealso{ \code{\link{data.table}}, \code{\link{setkey}}, \code{\link{ls}}, \code{\link{objects}}, \code{\link{object.size}} } -\examples{ -DT = data.table(A=1:10, B=letters[1:10]) -DT2 = data.table(A=1:10000, ColB=10000:1) -setkey(DT,B) -tables() -} -\keyword{ data } diff --git a/man/test.data.table.Rd b/man/test.data.table.Rd deleted file mode 100644 index 3350bf554c..0000000000 --- a/man/test.data.table.Rd +++ /dev/null @@ -1,32 +0,0 @@ -\name{test.data.table} -\alias{test.data.table} -\title{ Runs a set of tests. } -\description{ - Runs a set of tests to check data.table is working correctly. -} -\usage{ -test.data.table(verbose=FALSE, pkg="pkg", silent=FALSE, - with.other.packages=FALSE, benchmark=FALSE) -} -\arguments{ -\item{verbose}{ If \code{TRUE} sets datatable.verbose to \code{TRUE} for the duration of the tests. } -\item{pkg}{Root directory name under which all package content (ex: DESCRIPTION, src/, R/, inst/ etc..) resides.} -\item{silent}{Logical, default \code{FALSE}, when \code{TRUE} it will not raise error on in case of test fails.} -\item{with.other.packages}{ Run compatibility tests with other packages. } -\item{benchmark}{ Run the benchmark script. } -} -\details{ - Runs a series of tests. These can be used to see features and examples of usage, too. Running test.data.table will tell you the full location of the test file(s) to open. -} -\value{ -When \code{silent} equals to \code{TRUE} it will return \code{TRUE} if all tests were successful. \code{FALSE} otherwise. If \code{silent} equals to \code{FALSE} it will return \code{TRUE} if all tests were successful. Error otherwise. -} -\seealso{ \code{\link{data.table}} } -\examples{ -\dontrun{ - library(data.table) - test.data.table() -} -} -\keyword{ data } - diff --git a/man/timetaken.Rd b/man/timetaken.Rd deleted file mode 100644 index e0b2722b3b..0000000000 --- a/man/timetaken.Rd +++ /dev/null @@ -1,24 +0,0 @@ -\name{timetaken} -\alias{timetaken} -\title{ Pretty print of time taken } -\description{ - Pretty print of time taken since last started.at. -} -\usage{ -timetaken(started.at) -} -\arguments{ - \item{started.at}{ The result of proc.time() taken some time earlier. } -} -% \details{ -% } -\value{ - A character vector of the form HH:MM:SS, or SS.MMMsec if under 60 seconds. -} -\examples{ -started.at=proc.time() -Sys.sleep(1) -cat("Finished in",timetaken(started.at),"\n") -} -\keyword{ data } - diff --git a/man/transform.data.table.Rd b/man/transform.data.table.Rd deleted file mode 100644 index ad73245766..0000000000 --- a/man/transform.data.table.Rd +++ /dev/null @@ -1,69 +0,0 @@ -\name{transform.data.table} -\alias{transform} -\alias{transform.data.table} -\alias{within} -\alias{within.data.table} -\title{ Data table utilities } -\description{ - Utilities for \code{data.table} transformation. - - \strong{\code{transform} by group is particularly slow. Please use \code{:=} by group instead.} - - \code{within}, \code{transform} and other similar functions in \code{data.table} are not just provided for users who expect them to work, but for non-data.table-aware packages to retain keys, for example. Hopefully the (much) faster and more convenient \code{data.table} syntax will be used in time. See examples. -} -\usage{ -\method{transform}{data.table}(`_data`, \ldots) -\method{within}{data.table}(data, expr, \ldots) -} -\arguments{ - \item{data, _data}{ data.table to be transformed.} - - \item{\ldots}{ for \code{transform}, Further arguments of the form - \code{tag=value}. Ignored for \code{within}.} - - \item{expr}{ expression to be evaluated within the data.table.} -} -\details{ -\code{within} is like \code{with}, but modifications (columns changed, -added, or removed) are updated in the returned data.table. - -Note that \code{transform} will keep the key of the -\code{data.table} provided the \emph{targets} of the transform (i.e. the -columns that appear in \ldots) are not in the key of the data.table. -\code{within} also retains the key provided the key columns are not \emph{touched}. -} -\value{ - The modified value of a copy of \code{data}. -} -\seealso{ \code{\link[base]{transform}}, \code{\link[base]{within}} and \code{\link{:=}} } -\examples{ -DT <- data.table(a=rep(1:3, each=2), b=1:6) - -DT2 <- transform(DT, c = a^2) -DT[, c:=a^2] -identical(DT,DT2) - -DT2 <- within(DT, { - b <- rev(b) - c <- a*2 - rm(a) -}) -DT[,`:=`(b = rev(b), - c = a*2, - a = NULL)] -identical(DT,DT2) - -DT$d = ave(DT$b, DT$c, FUN=max) # copies entire DT, even if it is 10GB in RAM -DT = DT[, transform(.SD, d=max(b)), by="c"] # same, but even worse as .SD is copied for each group -DT[, d:=max(b), by="c"] # same result, but much faster, shorter and scales - -# Multiple update by group. Convenient, fast, scales and easy to read. -DT[, `:=`(minb = min(b), - meanb = mean(b), - bplusd = sum(b+d)), by=c\%/\%5] -DT - -} -\keyword{ data } - - diff --git a/man/transpose.Rd b/man/transpose.Rd deleted file mode 100644 index 9281ca1227..0000000000 --- a/man/transpose.Rd +++ /dev/null @@ -1,42 +0,0 @@ -\name{transpose} -\alias{transpose} -\title{Efficient transpose of list} -\description{ - \code{transpose} is an efficient way to transpose \code{lists}, \code{data frames} or \code{data tables}. -} - -\usage{ -transpose(l, fill=NA, ignore.empty=FALSE) -} -\arguments{ - \item{l}{ A list, data.frame or data.table. } - \item{fill}{ Default is \code{NA}. It is used to fill shorter list elements so as to return each element of the transposed result of equal lengths. } - \item{ignore.empty}{Default is \code{FALSE}. \code{TRUE} will ignore length-0 list elements.} -} -\details{ - The list elements (or columns of \code{data.frame}/\code{data.table}) should be all \code{atomic}. If list elements are of unequal lengths, the value provided in \code{fill} will be used so that the resulting list always has all elements of identical lengths. The class of input object is also preserved in the transposed result. - - The \code{ignore.empty} argument can be used to skip or include length-0 elements. - - This is particularly useful in tasks that require splitting a character column and assigning each part to a separate column. This operation is quite common enough that a function \code{\link{tstrsplit}} is exported. - - \code{factor} columns are converted to \code{character} type. Attributes are not preserved at the moment. This may change in the future. - -} -\value{ - A transposed \code{list}, \code{data.frame} or \code{data.table}. -} - -\examples{ -ll = list(1:5, 6:8) -transpose(ll) -setDT(transpose(ll, fill=0))[] - -DT = data.table(x=1:5, y=6:10) -transpose(DT) -} -\seealso{ - \code{\link{data.table}}, \code{\link{tstrsplit}} -} -\keyword{ data } - diff --git a/man/truelength.Rd b/man/truelength.Rd deleted file mode 100644 index dc6e451cf7..0000000000 --- a/man/truelength.Rd +++ /dev/null @@ -1,44 +0,0 @@ -\name{truelength} -\alias{truelength} -\alias{alloc.col} -\title{ Over-allocation access } -\description{ - These functions are experimental and somewhat advanced. By \emph{experimental} we mean their names might change and perhaps the syntax, argument names and types. So if you write a lot of code using them, you have been warned! They should work and be stable, though, so please report problems with them. -} -\usage{ -truelength(x) -alloc.col(DT, - n = getOption("datatable.alloccol"), # default: 1024L - verbose = getOption("datatable.verbose")) # default: FALSE -} -\arguments{ -\item{x}{ Any type of vector, including \code{data.table} which is a \code{list} vector of column pointers. } -\item{DT}{ A \code{data.table}. } -\item{n}{ The number of spare column pointer slots to ensure are available. If \code{DT} is a 1,000 column \code{data.table} with 24 spare slots remaining, \code{n=1024L} means grow the 24 spare slots to be 1024. \code{truelength(DT)} will then be 2024 in this example. } -\item{verbose}{ Output status and information. } -} -\details{ - When adding columns by reference using \code{:=}, we \emph{could} simply create a new column list vector (one longer) and memcpy over the old vector, with no copy of the column vectors themselves. That requires negligible use of space and time, and is what v1.7.2 did. However, that copy of the list vector of column pointers only (but not the columns themselves), a \emph{shallow copy}, resulted in inconsistent behaviour in some circumstances. So, as from v1.7.3 data.table over allocates the list vector of column pointers so that columns can be added fully by reference, consistently. - - When the allocated column pointer slots are used up, to add a new column \code{data.table} must reallocate that vector. If two or more variables are bound to the same data.table this shallow copy may or may not be desirable, but we don't think this will be a problem very often (more discussion may be required on datatable-help). Setting \code{options(datatable.verbose=TRUE)} includes messages if and when a shallow copy is taken. To avoid shallow copies there are several options: use \code{\link{copy}} to make a deep copy first, use \code{alloc.col} to reallocate in advance, or, change the default allocation rule (perhaps in your .Rprofile); e.g., \code{options(datatable.alloccol=10000L)}. - - Please note : over allocation of the column pointer vector is not for efficiency per se. It's so that \code{:=} can add columns by reference without a shallow copy. -} -\value{ - \code{truelength(x)} returns the length of the vector allocated in memory. \code{length(x)} of those items are in use. Currently, it's just the list vector of column pointers that is over-allocated (i.e. \code{truelength(DT)}), not the column vectors themselves, which would in future allow fast row \code{insert()}. For tables loaded from disk however, \code{truelength} is 0 in \R 2.14.0+ (and random in \R <= 2.13.2), which is perhaps unexpected. \code{data.table} detects this state and over-allocates the loaded \code{data.table} when the next column addition occurs. All other operations on \code{data.table} (such as fast grouping and joins) do not need \code{truelength}. - - \code{alloc.col} \emph{reallocates} \code{DT} by reference. This may be useful for efficiency if you know you are about to going to add a lot of columns in a loop. It also returns the new \code{DT}, for convenience in compound queries. -} -\seealso{ \code{\link{copy}} } -\examples{ -DT = data.table(a=1:3,b=4:6) -length(DT) # 2 column pointer slots used -truelength(DT) # 1026 column pointer slots allocated -alloc.col(DT,2048) -length(DT) # 2 used -truelength(DT) # 2050 allocated, 2048 free -DT[,c:=7L] # add new column by assigning to spare slot -truelength(DT)-length(DT) # 2047 slots spare -} -\keyword{ data } - diff --git a/man/tstrsplit.Rd b/man/tstrsplit.Rd deleted file mode 100644 index 2ea81f9592..0000000000 --- a/man/tstrsplit.Rd +++ /dev/null @@ -1,50 +0,0 @@ -\name{tstrsplit} -\alias{tstrsplit} -\alias{strsplit} -\title{strsplit and transpose the resulting list efficiently} -\description{ - This is equivalent to \code{transpose(strsplit(...))}. This is a convenient wrapper function to split a column using \code{strsplit} and assign the transposed result to individual columns. See examples. - -} - -\usage{ -tstrsplit(x, ..., fill=NA, type.convert=FALSE, keep, names=FALSE) -} -\arguments{ - \item{x}{The vector to split (and transpose).} - \item{...}{ All the arguments to be passed to \code{strsplit}. } - \item{fill}{ Default is \code{NA}. It is used to fill shorter list elements so as to return each element of the transposed result of equal lengths. } - \item{type.convert}{\code{TRUE} calls \code{\link{type.convert}} with \code{as.is=TRUE} on the columns.} - \item{keep}{Specify indices corresponding to just those list elements to retain in the transposed result. Default is to return all.} - \item{names}{\code{TRUE} auto names the list with \code{V1, V2} etc. Default (\code{FALSE}) is to return an unnamed list.} -} -\details{ - It internally calls \code{strsplit} first, and then \code{\link{transpose}} on the result. - - \code{names} argument can be used to return an auto named list, although this argument does not have any effect when used with \code{:=}, which requires names to be provided explicitly. It might be useful in other scenarios. -} -\value{ - A transposed list after splitting by the pattern provided. -} - -\examples{ -x = c("abcde", "ghij", "klmnopq") -strsplit(x, "", fixed=TRUE) -tstrsplit(x, "", fixed=TRUE) -tstrsplit(x, "", fixed=TRUE, fill="") - -# using keep to return just 1,3,5 -tstrsplit(x, "", fixed=TRUE, keep=c(1,3,5)) - -# names argument -tstrsplit(x, "", fixed=TRUE, keep=c(1,3,5), names=LETTERS[1:3]) - -DT = data.table(x=c("A/B", "A", "B"), y=1:3) -DT[, c("c1") := tstrsplit(x, "/", fixed=TRUE, keep=1L)][] -DT[, c("c1", "c2") := tstrsplit(x, "/", fixed=TRUE)][] -} -\seealso{ - \code{\link{data.table}}, \code{\link{transpose}} -} -\keyword{ data } - diff --git a/man/update.dev.pkg.Rd b/man/update.dev.pkg.Rd deleted file mode 100644 index 9d61a667c5..0000000000 --- a/man/update.dev.pkg.Rd +++ /dev/null @@ -1,37 +0,0 @@ -\name{update.dev.pkg} -\alias{update} -\alias{update.dev.pkg} -\title{Perform update of development version of a package} -\description{ - It will download and install package from devel repository only when new commit is - available there, otherwise only PACKAGES file is transferred. Defaults are set to update \code{data.table}, other - packages can be used. Their repository has to include git commit - information in PACKAGES file. -} - -\usage{\method{update}{dev.pkg}(object="data.table", -repo="https://Rdatatable.github.io/data.table", field="Revision", \dots) -} -\arguments{ - \item{object}{ character scalar, package name. } - \item{repo}{ character scalar, url of package devel repository. } - \item{field}{ character scalar, metadata field to use in PACKAGES file and - DESCRIPTION file, default \code{"Revision"}. } - \item{\dots}{ passed to \code{\link[utils]{install.packages}}. } -} -\details{ - In case if devel repository does not provide package binaries user has - have development tools installed for package compilation to use - this function. -} -\value{ - NULL. -} -\examples{ - # data.table::update.dev.pkg() -} -\seealso{ - \code{\link{data.table}} -} -\keyword{ data } - diff --git a/memCheckImplementation/memTrack.c b/memCheckImplementation/memTrack.c new file mode 100644 index 0000000000..96b30f988c --- /dev/null +++ b/memCheckImplementation/memTrack.c @@ -0,0 +1,73 @@ +#include "memTrack.h" + +void*** initMemTracker(int n){ + // args: + // n determines the maximum number of trackable allocs + // return: + // void*** pointer with 2*n + 3 slots of pointers to pointers. Assuming the return is called r and we have n = 10, + // the slot layout is as follows: + // r[0] = (int**) stores the number n of trackable allocs. + // r[1] = (int**) number of registered pointers from malloc or calloc calls that need to be cleared with free() at exist. Always <=n + // r[2:11] = (void**) pointers to the pointers that need to be free()d because they were malloc/calloc ed + // r[12] = (int**) number of registered pointers from R's Calloc calls that need to be cleared with R's Free() at exist. Always <=n + // r[13:22] = (void**) pointers to the pointers that need to be Free() ed because they were Calloc ed + + // allocate tracker array. Size of all pointers is equal + void ***out = malloc((2 * n + 3) * sizeof(void**)); + if (!out) + error("Failed to allocate memory for memory tracker"); + // set the total number of storable pointers + out[0] = malloc(sizeof(int)); + if (!out[0]){ + free(out); + error("Failed to allocate memory for memory tracker"); + } + *((int*)out[0]) = n; + // initialize stored pointer counters to 0 with calloc + out[1] = calloc(1, sizeof(int)); + if (!out[1]){ + free(out[0]); + free(out); + error("Failed to allocate memory for memory tracker"); + } + out[n + 2] = calloc(1, sizeof(int)); + if (!out[n + 2]){ + free(out[0]); + free(out[1]); + free(out); + error("Failed to allocate memory for memory tracker"); + } + // initialize the slots for stored pointers with NULL pointers + for (int i = 0; i < n; i++){ + out[i + 2] = NULL; + out[i + n + 3] = NULL; + } + return(out); +} + +static void deleteMemTracker(void** memTracker){ + // free all the assigned slots in memTracker object + int n = *((int*)memTracker[0]); + free(memTracker[0]); + free(memTracker[1]); + free(memTracker[n + 2]); + free(memTracker); +} + +void freeAll(void** memTracker){ + // frees all the stored pointers in memTracker and finally memTracker itself + int n = *((int*)memTracker[0]); // total number of slots + int n_malloc = *((int*)memTracker[1]); // number of used slots in c-style malloc / calloc + int n_ralloc = *((int*)memTracker[n + 2]); // number of used slots in r-style Calloc + // free c-style allocated first + for (int i = 0; i < n_malloc; i++){ + free(memTracker[i + 2]); + memTracker[i+2] = NULL; + } + // now, free r style Callocated + for (int i = 0; i < n_ralloc; i++){ + Free(memTracker[i + n + 3]); // no need to set to NULL because Free does that according to R manual + } + deleteMemTracker(memTracker); +} + diff --git a/memCheckImplementation/memTrack.h b/memCheckImplementation/memTrack.h new file mode 100644 index 0000000000..1b7489b9bf --- /dev/null +++ b/memCheckImplementation/memTrack.h @@ -0,0 +1,17 @@ +#ifndef MEMTRACK_H +#define MEMTRACK_H + +#include +#include + +void*** initMemTracker(int n); + +void* safe_malloc(size_t size, void*** memTracker); +void* safe_realloc(void *ptr, size_t new_size, void*** memTracker); +void* safe_calloc(size_t num, size_t size, void*** memTracker); + +void freeAll(void*** memTracker); +void freeExceptReturn(void*** memTracker, void* returnValue); + + +#endif \ No newline at end of file diff --git a/src/Makevars b/src/Makevars deleted file mode 100644 index 5162e62756..0000000000 --- a/src/Makevars +++ /dev/null @@ -1,9 +0,0 @@ - -PKG_CFLAGS = $(SHLIB_OPENMP_CFLAGS) -PKG_LIBS = $(SHLIB_OPENMP_CFLAGS) - -all: $(SHLIB) - mv $(SHLIB) datatable$(SHLIB_EXT) - if [ "$(OS)" != "Windows_NT" ] && [ `uname -s` = 'Darwin' ]; then install_name_tool -id datatable$(SHLIB_EXT) datatable$(SHLIB_EXT); fi - - diff --git a/src/assign.c b/src/assign.c deleted file mode 100644 index cd4c12d3c3..0000000000 --- a/src/assign.c +++ /dev/null @@ -1,1025 +0,0 @@ -#include "data.table.h" -#include -#include - -static SEXP *saveds=NULL; -static R_len_t *savedtl=NULL, nalloc=0, nsaved=0; - -static void finalizer(SEXP p) -{ - SEXP x; - R_len_t n, l, tl; - if(!R_ExternalPtrAddr(p)) error("Internal error: finalizer hasn't received an ExternalPtr"); - p = R_ExternalPtrTag(p); - if (!isString(p)) error("Internal error: finalizer's ExternalPtr doesn't see names in tag"); - l = LENGTH(p); - tl = TRUELENGTH(p); - if (l<0 || tl0 but l) ? n : l); // e.g. test 848 and 851 in R > 3.0.2 - // added (n>l) ? ... for #970, see test 1481. - // TO DO: test realloc names if selfrefnamesok (users can setattr(x,"name") themselves for example. - // if (TRUELENGTH(getAttrib(dt,R_NamesSymbol))!=tl) - // error("Internal error: tl of dt passes checks, but tl of names (%d) != tl of dt (%d)", tl, TRUELENGTH(getAttrib(dt,R_NamesSymbol))); - - tl = TRUELENGTH(dt); - if (tl<0) error("Internal error, tl of class is marked but tl<0."); // R <= 2.13.2 and we didn't catch uninitialized tl somehow - if (tl>0 && tll+10000) warning("tl (%d) is greater than 10,000 items over-allocated (l = %d). If you didn't set the datatable.alloccol option to be very large, please report this to datatable-help including the result of sessionInfo().",tl,l); - if (n>tl) return(shallow(dt,R_NilValue,n)); // usual case (increasing alloc) - if (nnrow) - error("i[%d] is %d which is out of range [1,nrow=%d].",i+1,INTEGER(rows)[i],nrow); - if (INTEGER(rows)[i]>=1) numToDo++; - } - if (verbose) Rprintf("Assigning to %d row subset of %d rows\n", numToDo, nrow); - // TODO: include in message if any rows are assigned several times (e.g. by=.EACHI with dups in i) - if (numToDo==0) { - if (!length(newcolnames)) return(dt); // all items of rows either 0 or NA. !length(newcolnames) for #759 - if (verbose) Rprintf("Added %d new column%s initialized with all-NA\n", - length(newcolnames), (length(newcolnames)>1)?"s":""); - } - } - if (!length(cols)) { - warning("length(LHS)==0; no columns to delete or assign RHS to."); - return(dt); - } - // FR #2077 - set able to add new cols by reference - if (isString(cols)) { - PROTECT(tmp = chmatch(cols, names, 0, FALSE)); - protecti++; - buf = (int *) R_alloc(length(cols), sizeof(int)); - for (i=0; i0) { - if (!isDataTable) error("set() on a data.frame is for changing existing columns, not adding new ones. Please use a data.table for that. data.table's are over-allocated and don't shallow copy."); - PROTECT(newcolnames = allocVector(STRSXP, k)); - protecti++; - for (i=0; i1) { - if (length(values)==0) error("Supplied %d columns to be assigned an empty list (which may be an empty data.table or data.frame since they are lists too). To delete multiple columns use NULL instead. To add multiple empty list columns, use list(list()).", length(cols)); - if (length(values)>length(cols)) - warning("Supplied %d columns to be assigned a list (length %d) of values (%d unused)", length(cols), length(values), length(values)-length(cols)); - else if (length(cols)%length(values) != 0) - warning("Supplied %d columns to be assigned a list (length %d) of values (recycled leaving remainder of %d items).",length(cols),length(values),length(cols)%length(values)); - } // else it's a list() column being assigned to one column - } - } - // Check all inputs : - for (i=0; ioldncol+length(newcolnames)) { - if (!isDataTable) error("Item %d of column numbers in j is %d which is outside range [1,ncol=%d]. set() on a data.frame is for changing existing columns, not adding new ones. Please use a data.table for that.", i+1, coln, oldncol); - else error("Item %d of column numbers in j is %d which is outside range [1,ncol=%d]. Use column names instead in j to add new columns.", i+1, coln, oldncol); - } - coln--; - if (TYPEOF(values)==VECSXP && (length(cols)>1 || length(values)==1)) - thisvalue = VECTOR_ELT(values,i%LENGTH(values)); - else - thisvalue = values; // One vector applied to all columns, often NULL or NA for example - vlen = length(thisvalue); - if (coln+1 <= oldncol) colnam = STRING_ELT(names,coln); - else colnam = STRING_ELT(newcolnames,coln-length(names)); - if (coln+1 <= oldncol && isNull(thisvalue)) continue; // delete existing column(s) afterwards, near end of this function - if (vlen<1 && nrow>0) { - if (coln+1 <= oldncol) { - error("RHS of assignment to existing column '%s' is zero length but not NULL. If you intend to delete the column use NULL. Otherwise, the RHS must have length > 0; e.g., NA_integer_. If you are trying to change the column type to be an empty list column then, as with all column type changes, provide a full length RHS vector such as vector('list',nrow(DT)); i.e., 'plonk' in the new column.", CHAR(STRING_ELT(names,coln))); - } else if (TYPEOF(thisvalue)!=VECSXP) { // list() is ok for new columns - newcolnum = coln-length(names); - if (newcolnum<0 || newcolnum>=length(newcolnames)) - error("Internal logical error. length(newcolnames)=%d, length(names)=%d, coln=%d", length(newcolnames), length(names), coln); - if (isNull(thisvalue)) { - // fix for #1082 - if (!isNull(rows)) error("When deleting columns, i should not be provided"); - warning("Adding new column '%s' then assigning NULL (deleting it).",CHAR(STRING_ELT(newcolnames,newcolnum))); - continue; - } - // RHS of assignment to new column is zero length but we'll use its type to create all-NA column of that type - } - } - if (!(isVectorAtomic(thisvalue) || isNewList(thisvalue))) // NULL had a continue earlier above - error("RHS of assignment is not NULL, not an an atomic vector (see ?is.atomic) and not a list column."); - if (isMatrix(thisvalue) && (j=INTEGER(getAttrib(thisvalue, R_DimSymbol))[1]) > 1) // matrix passes above (considered atomic vector) - warning("%d column matrix RHS of := will be treated as one vector", j); - if ((coln+1)<=oldncol && isFactor(VECTOR_ELT(dt,coln)) && - !isString(thisvalue) && TYPEOF(thisvalue)!=INTSXP && TYPEOF(thisvalue)!=LGLSXP && !isReal(thisvalue) && !isNewList(thisvalue)) // !=INTSXP includes factor - error("Can't assign to column '%s' (type 'factor') a value of type '%s' (not character, factor, integer or numeric)", CHAR(STRING_ELT(names,coln)),type2char(TYPEOF(thisvalue))); - if (nrow>0 && targetlen>0) { - if (vlen>targetlen) - warning("Supplied %d items to be assigned to %d items of column '%s' (%d unused)", vlen, targetlen,CHAR(colnam),vlen-targetlen); - else if (vlen>0 && targetlen%vlen != 0) - warning("Supplied %d items to be assigned to %d items of column '%s' (recycled leaving remainder of %d items).",vlen,targetlen,CHAR(colnam),targetlen%vlen); - } - } - // having now checked the inputs, from this point there should be no errors so we can now proceed to - // modify DT by reference. Other than if new columns are being added and the allocVec() fails with - // out-of-memory. In that case the user will receive hard halt and know to rerun. - if (length(newcolnames)) { - oldtncol = TRUELENGTH(dt); // TO DO: oldtncol can be just called tl now, as we won't realloc here any more. - - if (oldtncololdncol+10000L) warning("truelength (%d) is greater than 10,000 items over-allocated (length = %d). See ?truelength. If you didn't set the datatable.alloccol option very large, please report this to datatable-help including the result of sessionInfo().",oldtncol, oldncol); - - if (oldtncol < oldncol+LENGTH(newcolnames)) - error("Internal logical error. DT passed to assign has not been allocated enough column slots. l=%d, tl=%d, adding %d", oldncol, oldtncol, LENGTH(newcolnames)); - if (!selfrefnamesok(dt,verbose)) - error("It appears that at some earlier point, names of this data.table have been reassigned. Please ensure to use setnames() rather than names<- or colnames<-. Otherwise, please report to datatable-help."); - // Can growVector at this point easily enough, but it shouldn't happen in first place so leave it as - // strong error message for now. - else if (TRUELENGTH(names) != oldtncol) - error("selfrefnames is ok but tl names [%d] != tl [%d]", TRUELENGTH(names), oldtncol); - SETLENGTH(dt, oldncol+LENGTH(newcolnames)); - SETLENGTH(names, oldncol+LENGTH(newcolnames)); - for (i=0; i1 || LENGTH(values)==1)) - thisvalue = VECTOR_ELT(values,i%LENGTH(values)); - else - thisvalue = values; // One vector applied to all columns, often NULL or NA for example - if (TYPEOF(thisvalue)==NILSXP) { - if (!isNull(rows)) error("When deleting columns, i should not be provided"); - anytodelete = TRUE; - continue; // delete column(s) afterwards, below this loop - } - vlen = length(thisvalue); - if (length(rows)==0 && targetlen==vlen && (vlen>0 || nrow==0)) { - if ( MAYBE_SHARED(thisvalue) || // set() protects the NAMED of atomic vectors from .Call setting arguments to 2 by wrapping with list - (TYPEOF(values)==VECSXP && i>LENGTH(values)-1) || // recycled RHS would have columns pointing to others, #185. - (TYPEOF(values)!=VECSXP && i>0) // assigning the same values to a second column. Have to ensure a copy #2540 - ) { - if (verbose) { - if (length(values)==length(cols)) { - // usual branch - Rprintf("RHS for item %d has been duplicated because NAMED is %d, but then is being plonked.\n", i+1, NAMED(thisvalue)); - } else { - // rare branch where the lhs of := is longer than the items on the rhs of := - Rprintf("RHS for item %d has been duplicated because the list of RHS values (length %d) is being recycled, but then is being plonked.\n", i+1, length(values)); - } - } - thisvalue = duplicate(thisvalue); // PROTECT not needed as assigned as element to protected list below. - } else { - if (verbose) Rprintf("Direct plonk of unnamed RHS, no copy.\n"); // e.g. DT[,a:=as.character(a)] as tested by 754.3 - } - SET_VECTOR_ELT(dt,coln,thisvalue); // plonk new column in as it's already the correct length - setAttrib(thisvalue, R_NamesSymbol, R_NilValue); // clear names such as DT[,a:=mapvector[a]] - setAttrib(thisvalue, R_DimSymbol, R_NilValue); // so that matrix is treated as vector - setAttrib(thisvalue, R_DimNamesSymbol, R_NilValue); // the 3rd of the 3 attribs not copied by copyMostAttrib, for consistency. - continue; - } - if (coln+1 > oldncol) { // new column - newcol = allocNAVector(TYPEOF(thisvalue),nrow); - // initialize with NAs for when 'rows' is a subset and it doesn't touch - // do not try to save the time to NA fill (contiguous branch free assign anyway) since being - // sure all items will be written to (isNull(rows), length(rows), vlen<1, targetlen) is not worth the risk. - SET_VECTOR_ELT(dt,coln,newcol); - if (isVectorAtomic(thisvalue)) copyMostAttrib(thisvalue,newcol); // class etc but not names - // else for lists (such as data.frame and data.table) treat them as raw lists and drop attribs - if (vlen<1) continue; // e.g. DT[,newcol:=integer()] (adding new empty column) - targetcol = newcol; - RHS = thisvalue; - } else { // existing column - targetcol = VECTOR_ELT(dt,coln); - if (isFactor(targetcol)) { - // Coerce RHS to appropriate levels of LHS, adding new levels as necessary (unlike base) - // If it's the same RHS being assigned to several columns, we have to recoerce for each - // one because the levels of each target are likely different - if (isFactor(thisvalue)) { - PROTECT(thisvalue = asCharacterFactor(thisvalue)); - protecti++; - } - targetlevels = getAttrib(targetcol, R_LevelsSymbol); - if (isNull(targetlevels)) error("somehow this factor column has no levels"); - if (isString(thisvalue)) { - savetl_init(); // ** TO DO **: remove allocs that could fail between here and _end, or different way - for (j=0; j0) { - savetl(s); // pre-2.14.0 this will save all the uninitialised truelengths - // so 2.14.0+ may be faster, but isn't required. - // as from v1.8.0 we assume R's internal hash is positive, so don't - // save the uninitialised truelengths that by chance are negative - } - SET_TRUELENGTH(s,0); - } - for (j=0; j0) savetl(s); - SET_TRUELENGTH(s,j+1); - } - R_len_t addi = 0; - SEXP addlevels=NULL; - PROTECT(RHS = allocVector(INTSXP, length(thisvalue))); - protecti++; - for (j=0; j= length(addlevels)) { - PROTECT(addlevels = growVector(addlevels, length(addlevels)+1000)); - protecti++; - } - SET_STRING_ELT(addlevels,addi++,thisv); - // if-else for #1718 fix - SET_TRUELENGTH(thisv, (thisv != NA_STRING) ? (addi+length(targetlevels)) : NA_INTEGER); - } - INTEGER(RHS)[j] = TRUELENGTH(thisv); - } - if (addi > 0) { - R_len_t oldlen = length(targetlevels); - PROTECT(targetlevels = growVector(targetlevels, oldlen+addi)); - protecti++; - for (j=0; jLENGTH(targetlevels)) - && INTEGER(RHS)[j] != NA_INTEGER) { - warning("RHS contains %d which is outside the levels range ([1,%d]) of column %d, NAs generated", INTEGER(RHS)[j], LENGTH(targetlevels), i+1); - INTEGER(RHS)[j] = NA_INTEGER; - } - } - } - } else { - if (TYPEOF(targetcol) == TYPEOF(thisvalue)) - RHS = thisvalue; - else { - // coerce the RHS to match the type of the column, unlike [<-.data.frame, for efficiency. - if (isString(targetcol) && isFactor(thisvalue)) { - PROTECT(RHS = asCharacterFactor(thisvalue)); - protecti++; - if (verbose) Rprintf("Coerced factor to character to match the column's type (coercion is inefficient)\n"); // TO DO: datatable.pedantic would turn this into warning - } else { - PROTECT(RHS = coerceVector(thisvalue,TYPEOF(targetcol))); - protecti++; - // FR #2551, added test for equality between RHS and thisvalue to not provide the warning when length(thisvalue) == 1 - if ( length(thisvalue) == 1 && TYPEOF(RHS) != VECSXP && TYPEOF(thisvalue) != VECSXP && ( - (isReal(thisvalue) && isInteger(targetcol) && REAL(thisvalue)[0] == INTEGER(RHS)[0]) || - (isLogical(thisvalue) && LOGICAL(thisvalue)[0] == NA_LOGICAL) || - (isReal(RHS) && isInteger(thisvalue)) )) { - ; - } else { - s1 = (char *)type2char(TYPEOF(targetcol)); - s2 = (char *)type2char(TYPEOF(thisvalue)); - if (isReal(thisvalue)) s3="; may have truncated precision"; else s3=""; - warning("Coerced '%s' RHS to '%s' to match the column's type%s. Either change the target column ['%s'] to '%s' first (by creating a new '%s' vector length %d (nrows of entire table) and assign that; i.e. 'replace' column), or coerce RHS to '%s' (e.g. 1L, NA_[real|integer]_, as.*, etc) to make your intent clear and for speed. Or, set the column type correctly up front when you create the table and stick to it, please.", s2, s1, s3, CHAR(STRING_ELT(names, coln)), s2, s2, LENGTH(VECTOR_ELT(dt,0)), s1); - } - } - } - } - } - memrecycle(targetcol, rows, 0, targetlen, RHS); // also called from dogroups where these arguments are used more - } - PROTECT(assignedNames = allocVector(STRSXP, LENGTH(cols))); - protecti++; - for (i=0;i 0 || shortened name present already - // indexLength > 0 indicates reordering. Drop it to avoid spurious reordering in non-indexed columns (#2372) - // shortened anme already present indicates that index needs to be dropped to avoid duplicate indices. - setAttrib(index, a, R_NilValue); - SET_STRING_ELT(indexNames, indexNo, NA_STRING); - if (verbose) { - Rprintf("Dropping index '%s' due to an update on a key column\n", c1+2); - } - } - } //else: index is not affected by assign: nothing to be done - free(s4); - indexNo ++; - s = CDR(s); - } - } - if (anytodelete) { - // Delete any columns assigned NULL (there was a 'continue' earlier in loop above) - // In reverse order to make repeated memmove easy. Otherwise cols would need to be updated as well after each delete. - PROTECT(colorder = duplicate(cols)); - protecti++; - R_isort(INTEGER(colorder),LENGTH(cols)); - PROTECT(colorder = match(cols, colorder, 0)); // actually matches colorder to cols (oddly, arguments are that way around) - protecti++; - // Can't find a visible R entry point to return ordering of cols, above is only way I could find. - // Need ordering (rather than just sorting) because the RHS corresponds in order to the LHS. - - for (r=LENGTH(cols)-1; r>=0; r--) { - i = INTEGER(colorder)[r]-1; - coln = INTEGER(cols)[i]-1; - if (TYPEOF(values)==VECSXP && LENGTH(values)>0) - thisvalue = VECTOR_ELT(values,i%LENGTH(values)); - else - thisvalue = values; - if (isNull(thisvalue)) { - // A new column being assigned NULL would have been warned above, added above, and now deleted (just easier - // to code it this way e.g. so that other columns may be added or removed ok by the same query). - size=sizeof(SEXP *); - memmove((char *)DATAPTR(dt)+coln*size, - (char *)DATAPTR(dt)+(coln+1)*size, - (LENGTH(dt)-coln-1)*size); - SET_VECTOR_ELT(dt, LENGTH(dt)-1, R_NilValue); - SETLENGTH(dt, LENGTH(dt)-1); - // adding using := by group relies on NULL here to know column slot is empty. - // good to tidy up the vector anyway. - memmove((char *)DATAPTR(names)+coln*size, - (char *)DATAPTR(names)+(coln+1)*size, - (LENGTH(names)-coln-1)*size); - SET_STRING_ELT(names, LENGTH(names)-1, NA_STRING); // no need really, just to be tidy. - SETLENGTH(names, LENGTH(names)-1); - if (LENGTH(names)==0) { - // That was last column deleted, leaving NULL data.table, so we need to reset .row_names, so that it really is the NULL data.table. - PROTECT(nullint=allocVector(INTSXP, 0)); - protecti++; - setAttrib(dt, R_RowNamesSymbol, nullint); // i.e. .set_row_names(0) - //setAttrib(dt, R_NamesSymbol, R_NilValue); - } - } - } - } - UNPROTECT(protecti); - return(dt); // needed for `*tmp*` mechanism (when := isn't used), and to return the new object after a := for compound syntax. -} - -static Rboolean anyNamed(SEXP x) { - if (MAYBE_REFERENCED(x)) return TRUE; - if (isNewList(x)) for (int i=0; i len ? len : length(source); // fix for 5647. when length(source) > len, slen must be len. - if (slen<1) return; - if (TYPEOF(target) != TYPEOF(source)) error("Internal error: TYPEOF(target)['%s']!=TYPEOF(source)['%s']", type2char(TYPEOF(target)),type2char(TYPEOF(source))); - if (isNewList(source)) { - // A list() column; i.e. target is a column of pointers to SEXPs rather than the much more common case - // where memrecycle copies the DATAPTR data to the atomic target from the atomic source. - // If any item within the list is NAMED then take a fresh copy. So far this has occurred from dogroups.c when - // j returns .BY or similar specials as-is within a list(). Those specials are static inside - // dogroups so if we don't copy now the last value written to them by dogroups becomes repeated in the result; - // i.e. the wrong result. - // If source is itself recycled later (many list() column items pointing to the same object) we are ok with that - // since we now have a fresh copy and := will not assign with a list() column's cell value; := only changes the - // SEXP pointed to. - // If source is already not named (because j already created a fresh unnamed vector within a list()) we don't want to - // duplicate unnecessarily, hence checking for named rather than duplicating always. - // See #481 and #1270 - if (anyNamed(source)) { - source = PROTECT(duplicate(source)); - protecti++; - } - } - size_t size = SIZEOF(target); - if (!length(where)) { - switch (TYPEOF(target)) { - case INTSXP : case REALSXP : case LGLSXP : - break; - case STRSXP : - for (; r0?1:0; r<(len/slen); r++) { // if the first slen were done in the switch above, convert r=slen to r=1 - memcpy((char *)DATAPTR(target) + (start+r*slen)*size, - (char *)DATAPTR(source), - slen * size); - } - memcpy((char *)DATAPTR(target) + (start+r*slen)*size, - (char *)DATAPTR(source), - (len%slen) * size); - } - } else { - switch (TYPEOF(target)) { - case INTSXP : case REALSXP : case LGLSXP : - break; - case STRSXP : - for (; r10 it may be worth memcpy, but we'd need to first know if 'where' was a contiguous subset - } - UNPROTECT(protecti); -} - -SEXP allocNAVector(SEXPTYPE type, R_len_t n) -{ - // an allocVector following with initialization to NA since a subassign to a new column using := - // routinely leaves untouched items (rather than 0 or "" as allocVector does with its memset) - // We guess that author of allocVector would have liked to initialize with NA but was prevented since memset - // is restricted to one byte. - R_len_t i; - SEXP v; - PROTECT(v = allocVector(type, n)); - switch(type) { - // NAs are special; no need to worry about generations. - case INTSXP : - case LGLSXP : - for (i=0; i=nalloc) { - nalloc *= 2; - char *tmp; - tmp = (char *)realloc(saveds, nalloc * sizeof(SEXP)); - if (tmp == NULL) { - savetl_end(); - error("Couldn't realloc saveds in savetl"); - } - saveds = (SEXP *)tmp; - tmp = (char *)realloc(savedtl, nalloc * sizeof(R_len_t)); - if (tmp == NULL) { - savetl_end(); - error("Couldn't realloc savedtl in savetl"); - } - savedtl = (R_len_t *)tmp; - } - saveds[nsaved] = s; - savedtl[nsaved] = TRUELENGTH(s); - nsaved++; -} - -void savetl_end() { - // Can get called if nothing has been saved yet (nsaved==0), or even if _init() hasn't been called yet (pointers NULL). Such - // as to clear up before error. Also, it might be that nothing needed to be saved anyway. - for (int i=0; iLENGTH(x)) error("Item %d of 'which' is %d which is outside range of the length %d character vector", i+1,w,LENGTH(x)); - SET_STRING_ELT(x, w-1, STRING_ELT(new, i)); - } - return R_NilValue; -} - -SEXP setcolorder(SEXP x, SEXP o) -{ - // checks have already been made at R level in setcolorder() - // reording columns by reference makes no difference to generations - // so there's no need to use SET_* api. - SEXP *tmp = Calloc(LENGTH(x),SEXP); - for (int i=0; i l_from-1) error("invalid from_idx[%d]=%d, falls outside 1 and length(from)=%d.", i+1, fidx, l_from); - if (tidx < 0 || tidx > l_to-1) error("invalid to_idx[%d]=%d, falls outside 1 and length(to)=%d.", i+1, tidx, l_to); - SET_VECTOR_ELT(to, tidx, VECTOR_ELT(from, fidx)); - } - return(to); -} - diff --git a/src/between.c b/src/between.c deleted file mode 100644 index 678016fd2e..0000000000 --- a/src/between.c +++ /dev/null @@ -1,104 +0,0 @@ -#include "data.table.h" -#include - -static double l=0.0, u=0.0; - -Rboolean int_upper_closed(SEXP x, R_len_t i) { - return (INTEGER(x)[i] == NA_INTEGER || (double)INTEGER(x)[i] <= u ? NA_LOGICAL : FALSE); -} - -Rboolean int_upper_open(SEXP x, R_len_t i) { - return (INTEGER(x)[i] == NA_INTEGER || (double)INTEGER(x)[i] < u ? NA_LOGICAL : FALSE); -} - -Rboolean int_lower_closed(SEXP x, R_len_t i) { - return (INTEGER(x)[i] == NA_INTEGER || (double)INTEGER(x)[i] >= l ? NA_LOGICAL : FALSE); -} - -Rboolean int_lower_open(SEXP x, R_len_t i) { - return (INTEGER(x)[i] == NA_INTEGER || (double)INTEGER(x)[i] > l ? NA_LOGICAL : FALSE); -} - -Rboolean int_both_closed(SEXP x, R_len_t i) { - return (INTEGER(x)[i] == NA_INTEGER ? NA_LOGICAL : ((double)INTEGER(x)[i] >= l && (double)INTEGER(x)[i] <= u)); -} - -Rboolean int_both_open(SEXP x, R_len_t i) { - return (INTEGER(x)[i] == NA_INTEGER ? NA_LOGICAL : ((double)INTEGER(x)[i] > l && (double)INTEGER(x)[i] < u)); -} - -Rboolean double_upper_closed(SEXP x, R_len_t i) { - return (ISNAN(REAL(x)[i]) || REAL(x)[i] <= u ? NA_LOGICAL : FALSE); -} - -Rboolean double_upper_open(SEXP x, R_len_t i) { - return (ISNAN(REAL(x)[i]) || REAL(x)[i] < u ? NA_LOGICAL : FALSE); -} - -Rboolean double_lower_closed(SEXP x, R_len_t i) { - return (ISNAN(REAL(x)[i]) || REAL(x)[i] >= l ? NA_LOGICAL : FALSE); -} - -Rboolean double_lower_open(SEXP x, R_len_t i) { - return (ISNAN(REAL(x)[i]) || REAL(x)[i] > l ? NA_LOGICAL : FALSE); -} - -Rboolean double_both_closed(SEXP x, R_len_t i) { - return (ISNAN(REAL(x)[i]) ? NA_LOGICAL : (REAL(x)[i] >= l && REAL(x)[i] <= u)); -} - -Rboolean double_both_open(SEXP x, R_len_t i) { - return (ISNAN(REAL(x)[i]) ? NA_LOGICAL : (REAL(x)[i] > l && REAL(x)[i] < u)); -} - -SEXP between(SEXP x, SEXP lower, SEXP upper, SEXP bounds) { - - R_len_t i, nx = length(x), nl = length(lower), nu = length(upper); - l = 0.0; u = 0.0; - SEXP ans; - Rboolean (*flower)(), (*fupper)(), (*fboth)(); - if (!nx || !nl || !nu) - return (allocVector(LGLSXP, 0)); - if (nl != 1 && nl != nx) - error("length(lower) (%d) must be either 1 or length(x) (%d)", nl, nx); - if (nu != 1 && nu != nx) - error("length(upper) (%d) must be either 1 or length(x) (%d)", nu, nx); - if (!isLogical(bounds) || LOGICAL(bounds)[0] == NA_LOGICAL) - error("incbounds must be logical TRUE/FALSE."); - - // no support for int64 yet (only handling most common cases) - // coerce to also get NA values properly - lower = PROTECT(coerceVector(lower, REALSXP)); l = REAL(lower)[0]; - upper = PROTECT(coerceVector(upper, REALSXP)); u = REAL(upper)[0]; - ans = PROTECT(allocVector(LGLSXP, nx)); - - if (LOGICAL(bounds)[0]) { - fupper = isInteger(x) ? &int_upper_closed : &double_upper_closed; - flower = isInteger(x) ? &int_lower_closed : &double_lower_closed; - fboth = isInteger(x) ? &int_both_closed : &double_both_closed; - } else { - fupper = isInteger(x) ? &int_upper_open : &double_upper_open; - flower = isInteger(x) ? &int_lower_open : &double_lower_open; - fboth = isInteger(x) ? &int_both_open : &double_both_open; - } - - if ( ISNAN(REAL(lower)[0]) ) { - if ( ISNAN(REAL(upper)[0]) ) { - #pragma omp parallel for num_threads(getDTthreads()) - for (i=0; i // the debugging machinery + breakpoint aidee - -/* -Implements binary search (a.k.a. divide and conquer). -http://en.wikipedia.org/wiki/Binary_search -http://www.tbray.org/ongoing/When/200x/2003/03/22/Binary -http://googleresearch.blogspot.com/2006/06/extra-extra-read-all-about-it-nearly.html -Differences over standard binary search (e.g. bsearch in stdlib.h) : - o list of vectors (key of many columns) of different types - o ties (groups) - o NA,NAN,-Inf,+Inf are distinct values and can be joined to - o type double is joined within tolerance (apx 11 s.f.) - o join to prevailing value (roll join a.k.a locf), forwards or backwards - o join to nearest - o roll the beginning and end optionally - o limit the roll distance to a user provided value -*/ - -#define ENC_KNOWN(x) (LEVELS(x) & 12) -// 12 = LATIN1_MASK (1<<2) | UTF8_MASK (1<<3) // Would use these definitions from Defn.h, but that appears to be private to R. Hence 12. - -#define EQ 1 -#define LE 2 -#define LT 3 -#define GE 4 -#define GT 5 - -static SEXP i, x, nqgrp; -static int ncol, *icols, *xcols, *o, *xo, *retFirst, *retLength, *retIndex, *allLen1, *allGrp1, *rollends, ilen, anslen; -static int *op, nqmaxgrp, scols; -static int ctr, nomatch; // populating matches for non-equi joins -enum {ALL, FIRST, LAST} mult = ALL; -static double roll, rollabs; -static Rboolean rollToNearest=FALSE; -#define XIND(i) (xo ? xo[(i)]-1 : i) - -void bmerge_r(int xlowIn, int xuppIn, int ilowIn, int iuppIn, int col, int thisgrp, int lowmax, int uppmax); - -SEXP bmerge(SEXP iArg, SEXP xArg, SEXP icolsArg, SEXP xcolsArg, SEXP isorted, SEXP xoArg, SEXP rollarg, SEXP rollendsArg, SEXP nomatchArg, SEXP multArg, SEXP opArg, SEXP nqgrpArg, SEXP nqmaxgrpArg) { - int xN, iN, protecti=0; - ctr=0; // needed for non-equi join case - SEXP retFirstArg, retLengthArg, retIndexArg, allLen1Arg, allGrp1Arg; - retFirstArg = retLengthArg = retIndexArg = R_NilValue; // suppress gcc msg - - // iArg, xArg, icolsArg and xcolsArg - i = iArg; x = xArg; // set globals so bmerge_r can see them. - if (!isInteger(icolsArg)) error("Internal error: icols is not integer vector"); - if (!isInteger(xcolsArg)) error("Internal error: xcols is not integer vector"); - if (LENGTH(icolsArg) > LENGTH(xcolsArg)) error("Internal error: length(icols) [%d] > length(xcols) [%d]", LENGTH(icolsArg), LENGTH(xcolsArg)); - icols = INTEGER(icolsArg); - xcols = INTEGER(xcolsArg); - xN = LENGTH(VECTOR_ELT(x,0)); - iN = ilen = anslen = LENGTH(VECTOR_ELT(i,0)); - ncol = LENGTH(icolsArg); // there may be more sorted columns in x than involved in the join - for(int col=0; colLENGTH(i) || icols[col]<1) error("icols[%d]=%d outside range [1,length(i)=%d]", col, icols[col], LENGTH(i)); - if (xcols[col]>LENGTH(x) || xcols[col]<1) error("xcols[%d]=%d outside range [1,length(x)=%d]", col, xcols[col], LENGTH(x)); - int it = TYPEOF(VECTOR_ELT(i, icols[col]-1)); - int xt = TYPEOF(VECTOR_ELT(x, xcols[col]-1)); - if (it != xt) error("typeof x.%s (%s) != typeof i.%s (%s)", CHAR(STRING_ELT(getAttrib(x,R_NamesSymbol),xcols[col]-1)), type2char(xt), CHAR(STRING_ELT(getAttrib(i,R_NamesSymbol),icols[col]-1)), type2char(it)); - } - // raise(SIGINT); - - // rollArg, rollendsArg - roll = 0.0; rollToNearest = FALSE; - if (isString(rollarg)) { - if (strcmp(CHAR(STRING_ELT(rollarg,0)),"nearest") != 0) error("roll is character but not 'nearest'"); - roll=1.0; rollToNearest=TRUE; // the 1.0 here is just any non-0.0, so roll!=0.0 can be used later - } else { - if (!isReal(rollarg)) error("Internal error: roll is not character or double"); - roll = REAL(rollarg)[0]; // more common case (rolling forwards or backwards) or no roll when 0.0 - } - rollabs = fabs(roll); - if (!isLogical(rollendsArg) || LENGTH(rollendsArg) != 2) - error("rollends must be a length 2 logical vector"); - rollends = LOGICAL(rollendsArg); - if (rollToNearest && TYPEOF(VECTOR_ELT(i, icols[ncol-1]-1))==STRSXP) - error("roll='nearest' can't be applied to a character column, yet."); - - // nomatch arg - nomatch = INTEGER(nomatchArg)[0]; - - // mult arg - if (!strcmp(CHAR(STRING_ELT(multArg, 0)), "all")) mult = ALL; - else if (!strcmp(CHAR(STRING_ELT(multArg, 0)), "first")) mult = FIRST; - else if (!strcmp(CHAR(STRING_ELT(multArg, 0)), "last")) mult = LAST; - else error("Internal error: invalid value for 'mult'. Please report to datatable-help"); - - // opArg - if (!isInteger(opArg) || length(opArg) != ncol) - error("Internal error: opArg is not an integer vector of length equal to length(on)"); - op = INTEGER(opArg); - if (!isInteger(nqgrpArg)) - error("Internal error: nqgrpArg must be an integer vector"); - nqgrp = nqgrpArg; // set global for bmerge_r - scols = (!length(nqgrpArg)) ? 0 : -1; // starting col index, -1 is external group column for non-equi join case - - // nqmaxgrpArg - if (!isInteger(nqmaxgrpArg) || length(nqmaxgrpArg) != 1 || INTEGER(nqmaxgrpArg)[0] <= 0) - error("Intrnal error: nqmaxgrpArg is not a positive length-1 integer vector"); - nqmaxgrp = INTEGER(nqmaxgrpArg)[0]; - if (nqmaxgrp>1 && mult == ALL) { - // non-equi case with mult=ALL, may need reallocation - anslen = 1.1 * ((iN > 1000) ? iN : 1000); - retFirst = Calloc(anslen, int); // anslen is set above - retLength = Calloc(anslen, int); - retIndex = Calloc(anslen, int); - if (retFirst==NULL || retLength==NULL || retIndex==NULL) - error("Internal error in allocating memory for non-equi join"); - // initialise retIndex here directly, as next loop is meant for both equi and non-equi joins - for (int j=0; j1). - - // allGrp1Arg, if TRUE, out of all nested group ids, only one of them matches 'x'. Might be rare, but helps to be more efficient in that case. - allGrp1Arg = PROTECT(allocVector(LGLSXP, 1)); - allGrp1 = LOGICAL(allGrp1Arg); - allGrp1[0] = TRUE; - protecti += 2; - - // isorted arg - o = NULL; - if (!LOGICAL(isorted)[0]) { - SEXP order = PROTECT(allocVector(INTSXP, length(icolsArg))); - protecti++; - for (int j=0; j 1 && mult == ALL) { - // memcpy ret* to SEXP - retFirstArg = PROTECT(allocVector(INTSXP, ctr)); - retLengthArg = PROTECT(allocVector(INTSXP, ctr)); - retIndexArg = PROTECT(allocVector(INTSXP, ctr)); - protecti += 3; - memcpy(INTEGER(retFirstArg), retFirst, sizeof(int)*ctr); - memcpy(INTEGER(retLengthArg), retLength, sizeof(int)*ctr); - memcpy(INTEGER(retIndexArg), retIndex, sizeof(int)*ctr); - } - SEXP ans = PROTECT(allocVector(VECSXP, 5)); protecti++; - SEXP ansnames = PROTECT(allocVector(STRSXP, 5)); protecti++; - SET_VECTOR_ELT(ans, 0, retFirstArg); - SET_VECTOR_ELT(ans, 1, retLengthArg); - SET_VECTOR_ELT(ans, 2, retIndexArg); - SET_VECTOR_ELT(ans, 3, allLen1Arg); - SET_VECTOR_ELT(ans, 4, allGrp1Arg); - SET_STRING_ELT(ansnames, 0, char_starts); // changed from mkChar to char_ to pass the grep in CRAN_Release.cmd - SET_STRING_ELT(ansnames, 1, char_lens); - SET_STRING_ELT(ansnames, 2, char_indices); - SET_STRING_ELT(ansnames, 3, char_allLen1); - SET_STRING_ELT(ansnames, 4, char_allGrp1); - setAttrib(ans, R_NamesSymbol, ansnames); - if (nqmaxgrp > 1 && mult == ALL) { - Free(retFirst); - Free(retLength); - Free(retIndex); - } - UNPROTECT(protecti); - return (ans); -} - -static union { - int i; - double d; - unsigned long long ull; - long long ll; - SEXP s; -} ival, xval; - -static int mid, tmplow, tmpupp; // global to save them being added to recursive stack. Maybe optimizer would do this anyway. -static SEXP ic, xc; - -void bmerge_r(int xlowIn, int xuppIn, int ilowIn, int iuppIn, int col, int thisgrp, int lowmax, int uppmax) -// col is >0 and <=ncol-1 if this range of [xlow,xupp] and [ilow,iupp] match up to but not including that column -// lowmax=1 if xlowIn is the lower bound of this group (needed for roll) -// uppmax=1 if xuppIn is the upper bound of this group (needed for roll) -// new: col starts with -1 for non-equi joins, which gathers rows from nested id group counter 'thisgrp' -{ - int xlow=xlowIn, xupp=xuppIn, ilow=ilowIn, iupp=iuppIn, j, k, ir, lir, tmp; - Rboolean isInt64=FALSE; - ir = lir = ilow + (iupp-ilow)/2; // lir = logical i row. - if (o) ir = o[lir]-1; // ir = the actual i row if i were ordered - if (col>-1) { - ic = VECTOR_ELT(i,icols[col]-1); // ic = i column - xc = VECTOR_ELT(x,xcols[col]-1); // xc = x column - // it was checked in bmerge() that the types are equal - } else xc = nqgrp; - switch (TYPEOF(xc)) { - case LGLSXP : case INTSXP : // including factors - ival.i = (col>-1) ? INTEGER(ic)[ir] : thisgrp; - while(xlow < xupp-1) { - mid = xlow + (xupp-xlow)/2; // Same as (xlow+xupp)/2 but without risk of overflow - xval.i = INTEGER(xc)[XIND(mid)]; - if (xval.iival.i) { // TO DO: is *(&xlow, &xupp)[0|1]=mid more efficient than branch? - xupp=mid; - } else { - // xval.i == ival.i including NA_INTEGER==NA_INTEGER - // branch mid to find start and end of this group in this column - // TO DO?: not if mult=first|last and col-1 && op[col] != EQ) { - switch (op[col]) { - case LE : xlow = xlowIn; break; - case LT : xupp = xlow + 1; xlow = xlowIn; break; - case GE : if (ival.i != NA_INTEGER) xupp = xuppIn; break; - case GT : xlow = xupp - 1; if (ival.i != NA_INTEGER) xupp = xuppIn; break; - } - // for LE/LT cases, we need to ensure xlow excludes NA indices, != EQ is checked above already - if (op[col] <= 3 && xlow-1) { - while(tmplowival.ull) { - xupp=mid; - } else { // xval.ull == ival.ull) - tmplow = mid; - tmpupp = mid; - while(tmplow-1 && op[col] != EQ) { - Rboolean isivalNA = !isInt64 ? ISNAN(REAL(ic)[ir]) : (DtoLL(REAL(ic)[ir]) == NA_INT64_LL); - switch (op[col]) { - case LE : if (!isivalNA) xlow = xlowIn; break; - case LT : xupp = xlow + 1; if (!isivalNA) xlow = xlowIn; break; - case GE : if (!isivalNA) xupp = xuppIn; break; - case GT : xlow = xupp - 1; if (!isivalNA) xupp = xuppIn; break; - } - // for LE/LT cases, we need to ensure xlow excludes NA indices, != EQ is checked above already - if (op[col] <= 3 && xlow-1) { - while(tmplow1) allLen1[0] = FALSE; - if (nqmaxgrp == 1) { - for (j=ilow+1; j= anslen) { - anslen = 1.1*anslen; - retFirst = Realloc(retFirst, anslen, int); // if fails, it fails inside Realloc with R error - retLength = Realloc(retLength, anslen, int); - retIndex = Realloc(retIndex, anslen, int); - } - } else if (mult == FIRST) { - retFirst[k] = (XIND(retFirst[k]-1) > XIND(xlow+1)) ? xlow+2 : retFirst[k]; - retLength[k] = 1; - } else { - retFirst[k] = (XIND(retFirst[k]-1) < XIND(xupp-1)) ? xupp : retFirst[k]; - retLength[k] = 1; - } - } else { - // none of the groups so far have filled in for this index. So use it! - if (mult == ALL) { - retFirst[k] = xlow+2; - retLength[k] = len; - retIndex[k] = k+1; - // no need to increment ctr of course - } else { - retFirst[k] = (mult == FIRST) ? xlow+2 : xupp; - retLength[k] = 1; - } - } - } - } - } - } else if (roll!=0.0 && col==ncol-1) { - // runs once per i row (not each search test), so not hugely time critical - if (xlow != xupp-1 || xlowxuppIn) error("Internal error: xlow!=xupp-1 || xlowxuppIn"); - if (rollToNearest) { // value of roll ignored currently when nearest - if ( (!lowmax || xlow>xlowIn) && (!uppmax || xupp0.0 && (!lowmax || xlow>xlowIn) && (xuppxlowIn || !lowmax || rollends[0])) - || (roll>0.0 && xlow==xlowIn && lowmax && rollends[0]) ) - && ( (TYPEOF(ic)==REALSXP && - (ival.d = REAL(ic)[ir], xval.d = REAL(xc)[XIND(xupp)], 1) && - (( !isInt64 && - (xval.d-ival.d-rollabs < 1e-6 || - xval.d-ival.d == rollabs /*#1007*/)) - || ( isInt64 && - (double)(xval.ll-ival.ll)-rollabs < 1e-6 ) )) - || (TYPEOF(ic)<=INTSXP && (double)(INTEGER(xc)[XIND(xupp)]-INTEGER(ic)[ir])-rollabs < 1e-6 ) - || (TYPEOF(ic)==STRSXP) )) { - retFirst[ir] = xupp+1; // == xlow+2 - retLength[ir] = 1; - } - } - if (iupp-ilow > 2 && retFirst[ir]!=NA_INTEGER) { - // >=2 equal values in the last column being rolling to the same point. - for (j=ilow+1; jilowIn && (xlow>xlowIn || ((roll!=0.0 || op[col] != EQ) && col==ncol-1))) - bmerge_r(xlowIn, xlow+1, ilowIn, ilow+1, col, 1, lowmax, uppmax && xlow+1==xuppIn); - if (iuppilowIn) - bmerge_r(xlowIn, xuppIn, ilowIn, ilow+1, col, 1, lowmax, uppmax && xlow+1==xuppIn); - if (iuppilowIn) - bmerge_r(xlowIn, xuppIn, ilowIn, ilow+1, col, 1, lowmax, uppmax && xlow+1==xuppIn); - if (iupp 0; - UNPROTECT(2); - return(ans); -} - -SEXP chmatch(SEXP x, SEXP table, R_len_t nomatch, Rboolean in) { - R_len_t i, m; - SEXP ans, s; - if (!isString(x) && !isNull(x)) error("x is type '%s' (must be 'character' or NULL)", type2char(TYPEOF(x))); - if (!isString(table) && !isNull(table)) error("table is type '%s' (must be 'character' or NULL)", type2char(TYPEOF(table))); - PROTECT(ans = allocVector(in ? LGLSXP : INTSXP,length(x))); // if fails, it fails before savetl - savetl_init(); - for (i=0; i127) seem to be 'unknown' encoding in R. - // The same string in different encodings (where unknown encoding is different to known, too) are different - // CHARSXP pointers; this chmatch relies on pointer equality only. We tried mkChar(CHAR(s)) [ what install() does ] - // but this impacted the fastest cases too much. Hence fall back to match() on the first unknown encoding detected - // since match() considers the same string in different encodings as equal (but slower). See #2538 and #4818. - savetl_end(); - UNPROTECT(1); - return (in ? match_logical(table, x) : match(table, x, nomatch)); - } - if (TRUELENGTH(s)>0) savetl(s); - // as from v1.8.0 we assume R's internal hash is positive. So in R < 2.14.0 we - // don't save the uninitialised truelengths that by chance are negative, but - // will save if positive. Hence R >= 2.14.0 may be faster and preferred now that R - // initializes truelength to 0 from R 2.14.0. - SET_TRUELENGTH(s,0); - } - for (i=length(table)-1; i>=0; i--) { - s = STRING_ELT(table,i); - if (s != NA_STRING && ENC_KNOWN(s) != 64) { // changed !ENC_KNOWN(s) to !ASCII(s) - check above for explanation - for (int j=i+1; j0) savetl(s); - SET_TRUELENGTH(s, -i-1); - } - if (in) { - for (i=0; i -#define USE_RINTERNALS -#include -// #include // the debugging machinery + breakpoint aidee -// raise(SIGINT); -#include // for uint64_t rather than unsigned long long -#include -#include "myomp.h" - -// data.table depends on R>=3.0.0 when R_xlen_t was introduced -// Before R 3.0.0, RLEN used to be switched to R_len_t as R_xlen_t wasn't available. -// We could now replace all RLEN with R_xlen_t directly. Or keep RLEN for the shorter -// name so as not to have to check closely one letter difference R_xlen_t/R_len_t. We -// might also undefine R_len_t to ensure not to use it. -typedef R_xlen_t RLEN; - -#define IS_UTF8(x) (LEVELS(x) & 8) -#define IS_ASCII(x) (LEVELS(x) & 64) -#define IS_LATIN(x) (LEVELS(x) & 4) - -#define SIZEOF(x) sizes[TYPEOF(x)] - -#ifdef MIN -#undef MIN -#endif -#define MIN(a,b) (((a)<(b))?(a):(b)) - -#ifdef MAX -#undef MAX -#endif -#define MAX(a,b) (((a)>(b))?(a):(b)) - -// Backport macros added to R in 2017 so we don't need to update dependency from R 3.0.0 -#ifndef MAYBE_SHARED -# define MAYBE_SHARED(x) (NAMED(x) > 1) -#endif -#ifndef MAYBE_REFERENCED -# define MAYBE_REFERENCED(x) ( NAMED(x) > 0 ) -#endif - -// If we find a non-ASCII, non-NA, non-UTF8 encoding, we try to convert it to UTF8. That is, marked non-ascii/non-UTF8 encodings will -// always be checked in UTF8 locale. This seems to be the best fix Arun could think of to put the encoding issues to rest. -// Since the if-statement will fail with the first condition check in "normal" ASCII cases, there shouldn't be huge penalty issues in -// most cases. Fix for #66, #69, #469 and #1293 -// TODO: compare 1.9.6 performance with 1.9.7 with huge number of ASCII strings, and again after Jan 2018 when made macro. -// Matt moved this to be macro in Jan 2018 so that branch can benefit from branch prediction too wherever used inside loops. -// This IS_ASCII will dereference s and that cache fetch is the part that may bite more than the branch, though. Without a call to -// to ENC2UTF as all, the pointer value can just be compared by the calling code without deferencing it. It may still be worth -// timing the impact and manually avoiding (is there an IS_ASCII on the character vector rather than testing each item every time?) -#define NEED2UTF8(s) !(IS_ASCII(s) || (s)==NA_STRING || IS_UTF8(s)) -#define ENC2UTF8(s) (!NEED2UTF8(s) ? (s) : mkCharCE(translateCharUTF8(s), CE_UTF8)) - -// init.c -void setSizes(); -SEXP char_integer64; -SEXP char_ITime; -SEXP char_IDate; -SEXP char_Date; -SEXP char_POSIXct; -SEXP char_nanotime; -SEXP char_lens; -SEXP char_indices; -SEXP char_allLen1; -SEXP char_allGrp1; -SEXP sym_sorted; -SEXP sym_index; -SEXP sym_BY; -SEXP sym_starts, char_starts; -SEXP sym_maxgrpn; -Rboolean INHERITS(SEXP x, SEXP char_); -long long DtoLL(double x); -double LLtoD(long long x); -double NA_INT64_D; -long long NA_INT64_LL; - -// dogroups.c -SEXP keepattr(SEXP to, SEXP from); -SEXP growVector(SEXP x, R_len_t newlen); -size_t sizes[100]; // max appears to be FUNSXP = 99, see Rinternals.h -SEXP SelfRefSymbol; - -// assign.c -SEXP allocNAVector(SEXPTYPE type, R_len_t n); -void savetl_init(), savetl(SEXP s), savetl_end(); -Rboolean isDatatable(SEXP x); - -// forder.c -int StrCmp(SEXP x, SEXP y); -unsigned long long dtwiddle(void *p, int i, int order); -unsigned long long i64twiddle(void *p, int i, int order); -unsigned long long (*twiddle)(void *, int, int); -SEXP forder(SEXP DT, SEXP by, SEXP retGrp, SEXP sortStrArg, SEXP orderArg, SEXP naArg); -bool need2utf8(SEXP x, int n); - -// reorder.c -SEXP reorder(SEXP x, SEXP order); - -// fcast.c -SEXP int_vec_init(R_len_t n, int val); - -// vecseq.c -SEXP vecseq(SEXP x, SEXP len, SEXP clamp); - -// uniqlist.c -SEXP uniqlist(SEXP l, SEXP order); -SEXP uniqlengths(SEXP x, SEXP n); - -// chmatch.c -SEXP chmatch(SEXP x, SEXP table, R_len_t nomatch, Rboolean in); - -SEXP isOrderedSubset(SEXP, SEXP); -void setselfref(SEXP); - -// fmelt.c -SEXP seq_int(int n, int start); -SEXP set_diff(SEXP x, int n); -SEXP which(SEXP x, Rboolean val); - -// frank.c -SEXP dt_na(SEXP x, SEXP cols); - -// assign.c -SEXP alloccol(SEXP dt, R_len_t n, Rboolean verbose); -void memrecycle(SEXP target, SEXP where, int r, int len, SEXP source); -SEXP shallowwrapper(SEXP dt, SEXP cols); - -SEXP dogroups(SEXP dt, SEXP dtcols, SEXP groups, SEXP grpcols, SEXP jiscols, - SEXP xjiscols, SEXP grporder, SEXP order, SEXP starts, - SEXP lens, SEXP jexp, SEXP env, SEXP lhs, SEXP newnames, - SEXP on, SEXP verbose); - -// bmerge.c -SEXP bmerge(SEXP iArg, SEXP xArg, SEXP icolsArg, SEXP xcolsArg, SEXP isorted, - SEXP xoArg, SEXP rollarg, SEXP rollendsArg, SEXP nomatchArg, - SEXP multArg, SEXP opArg, SEXP nqgrpArg, SEXP nqmaxgrpArg); - -// rbindlist.c -SEXP combineFactorLevels(SEXP factorLevels, int *factorType, Rboolean *isRowOrdered); - -// quickselect -double dquickselect(double *x, int n, int k); -double iquickselect(int *x, int n, int k); - -// fread.c -double wallclock(); - -// openmp-utils.c -int getDTthreads(); -void avoid_openmp_hang_within_fork(); - diff --git a/src/dogroups.c b/src/dogroups.c deleted file mode 100644 index 72e123ff2b..0000000000 --- a/src/dogroups.c +++ /dev/null @@ -1,550 +0,0 @@ -#include "data.table.h" -#include -#include -#include - - -void setSizes() { - // called by init.c - int i; - for (i=0;i<100;i++) sizes[i]=0; - // only these types are currently allowed as column types : - sizes[INTSXP] = sizeof(int); // integer and factor - sizes[LGLSXP] = sizeof(int); // logical - sizes[REALSXP] = sizeof(double); // numeric - sizes[STRSXP] = sizeof(SEXP *); // character - sizes[VECSXP] = sizeof(SEXP *); // a column itself can be a list() - for (i=0;i<100;i++) { - if (sizes[i]>8) error("Type %d is sizeof() greater than 8 bytes on this machine. We haven't tested on any architecture greater than 64bit, yet.", i); - // One place we need the largest sizeof (assumed to be 8 bytes) is the working memory malloc in reorder.c - } - SelfRefSymbol = install(".internal.selfref"); -} - -SEXP dogroups(SEXP dt, SEXP dtcols, SEXP groups, SEXP grpcols, SEXP jiscols, SEXP xjiscols, SEXP grporder, SEXP order, SEXP starts, SEXP lens, SEXP jexp, SEXP env, SEXP lhs, SEXP newnames, SEXP on, SEXP verbose) -{ - R_len_t i, j, k, rownum, ngrp, nrowgroups, njval=0, ngrpcols, ansloc=0, maxn, estn=-1, r, thisansloc, grpn, thislen, igrp, vlen, origIlen=0, origSDnrow=0; - int protecti=0; - SEXP names, names2, xknames, bynames, dtnames, ans=NULL, jval, thiscol, SDall, BY, N, I, GRP, iSD, xSD, rownames, s, RHS, listwrap, target, source, tmp; - Rboolean wasvector, firstalloc=FALSE, NullWarnDone=FALSE, recycleWarn=TRUE; - size_t size; // must be size_t, otherwise bug #5305 (integer overflow in memcpy) - clock_t tstart=0, tblock[10]={0}; int nblock[10]={0}; - - if (!isInteger(order)) error("Internal error: order not integer vector"); - //if (TYPEOF(starts) != INTSXP) error("Internal error: starts not integer"); - //if (TYPEOF(lens) != INTSXP) error("Internal error: lens not integer"); - // starts can now be NA (<0): if (INTEGER(starts)[0]<0 || INTEGER(lens)[0]<0) error("starts[1]<0 or lens[1]<0"); - if (!isNull(jiscols) && LENGTH(order) && !LOGICAL(on)[0]) error("Internal error: jiscols not NULL but o__ has length"); - if (!isNull(xjiscols) && LENGTH(order) && !LOGICAL(on)[0]) error("Internal error: xjiscols not NULL but o__ has length"); - if(!isEnvironment(env)) error("’env’ should be an environment"); - ngrp = length(starts); // the number of groups (nrow(groups) will be larger when by) - ngrpcols = length(grpcols); - nrowgroups = length(VECTOR_ELT(groups,0)); - // fix for longstanding FR/bug, #495. E.g., DT[, c(sum(v1), lapply(.SD, mean)), by=grp, .SDcols=v2:v3] resulted in error.. the idea is, 1) we create .SDall, which is normally == .SD. But if extra vars are detected in jexp other than .SD, then .SD becomes a shallow copy of .SDall with only .SDcols in .SD. Since internally, we don't make a copy, changing .SDall will reflect in .SD. Hopefully this'll workout :-). - SDall = findVar(install(".SDall"), env); - - defineVar(sym_BY, BY = allocVector(VECSXP, ngrpcols), env); - bynames = PROTECT(allocVector(STRSXP, ngrpcols)); protecti++; // TO DO: do we really need bynames, can we assign names afterwards in one step? - for (i=0; i