vdiffr/ 0000755 0001762 0000144 00000000000 14710644552 011542 5 ustar ligges users vdiffr/tests/ 0000755 0001762 0000144 00000000000 14705713635 012707 5 ustar ligges users vdiffr/tests/testthat/ 0000755 0001762 0000144 00000000000 14710644552 014544 5 ustar ligges users vdiffr/tests/testthat/test-expect-doppelganger.R 0000644 0001762 0000144 00000005352 14707722236 021610 0 ustar ligges users vdiffr_skip_stale()
test_that("ggplot doppelgangers pass", {
skip_if_not_installed("ggplot2")
p1_orig <- ggplot2::ggplot(mtcars, ggplot2::aes(disp)) + ggplot2::geom_histogram()
expect_doppelganger("myplot", p1_orig)
})
test_that("base doppelgangers pass", {
p_base <- function() plot(mtcars$disp)
expect_doppelganger("myplot2", p_base)
p_base_symbol <- function() {
plot.new()
text(0.5, 0.8, expression(x[i] + over(x, y)), font = 5)
}
expect_doppelganger("Base doppelganger with symbol", p_base_symbol)
})
test_that("grid doppelgangers pass", {
p_grid <- function() {
grid::grid.newpage()
grid::grid.text("foobar", gp = grid::gpar(fontsize = 10.1))
grid::grid.text("foobaz", 0.5, 0.1, gp = grid::gpar(fontsize = 15.05))
}
expect_doppelganger("Grid doppelganger", p_grid)
})
test_that("no 'svglite supports one page' error (#85)", {
test_draw_axis <- function(add_labels = FALSE) {
theme <- theme_test() + theme(axis.line = element_line(size = 0.5))
positions <- c("top", "right", "bottom", "left")
n_breaks <- 3
break_positions <- seq_len(n_breaks) / (n_breaks + 1)
labels <- if (add_labels) as.character(seq_along(break_positions))
# create the axes
axes <- lapply(positions, function(position) {
ggplot2:::draw_axis(break_positions, labels, axis_position = position, theme = theme)
})
axes_grob <- gTree(children = do.call(gList, axes))
# arrange them so there's some padding on each side
gt <- gtable(
widths = unit(c(0.05, 0.9, 0.05), "npc"),
heights = unit(c(0.05, 0.9, 0.05), "npc")
)
gtable_add_grob(gt, list(axes_grob), 2, 2, clip = "off")
}
environment(test_draw_axis) <- env(ns_env("ggplot2"))
expect_doppelganger("page-error1", test_draw_axis(FALSE))
expect_doppelganger("page-error2", test_draw_axis(TRUE))
})
test_that("supports `grob` objects (#36)", {
circle <- grid::circleGrob(
x = 0.5,
y = 0.5,
r = 0.5,
gp = grid::gpar(col = "gray", lty = 3)
)
expect_doppelganger("grob", circle)
})
test_that("skips and unexpected errors reset snapshots (r-lib/testthat#1393)", {
regenerate <- FALSE
if (regenerate) {
withr::local_envvar(c(VDIFFR_REGENERATE_SNAPS = "true"))
}
suppressMessages(
test_file(
test_path("test-snapshot", "test-snapshot.R"),
reporter = NULL
)
)
expect_true(file.exists("test-snapshot/_snaps/snapshot/error-resets-snapshots.svg"))
expect_true(file.exists("test-snapshot/_snaps/snapshot/skip-resets-snapshots.svg"))
})
test_that("`expect_doppelganger()` supports variants", {
p1 <- ggplot2::ggplot()
p2 <- ggplot2::ggplot() + ggplot2::geom_histogram()
expect_doppelganger("variant", p1, variant = "foo")
expect_doppelganger("variant", p2, variant = "bar")
})
vdiffr/tests/testthat/test-log.R 0000644 0001762 0000144 00000001422 14707722644 016431 0 ustar ligges users vdiffr_skip_stale()
test_that("Failures are logged", {
skip_on_cran()
reporter <- testthat::SilentReporter$new()
path <- create_mock_pkg()
vars <- c("CI" = "true")
suppressMessages(withr::with_envvar(vars,
testthat::test_dir(
file.path(path, "tests", "testthat"),
reporter = reporter,
stop_on_failure = FALSE,
stop_on_warning = FALSE
)
))
log_path <- file.path(path, "tests", "vdiffr.Rout.fail")
if (!file.exists(log_path)) {
abort("Can't find log.")
}
on.exit(file.remove(log_path))
log <- readLines(log_path)
results <- reporter$expectations()
n_expected <- sum(vapply(results, inherits, NA, "expectation_failure"))
n_logged <- length(grep("Failed doppelganger:", log))
expect_equal(n_logged, n_expected)
})
vdiffr/tests/testthat/test-ggplot.R 0000644 0001762 0000144 00000000347 14062076235 017141 0 ustar ligges users vdiffr_skip_stale()
skip_if_not_installed("ggplot2")
test_that("ggtitle is set correctly", {
p <- ggplot2::ggplot()
expect_doppelganger("Some title", p)
expect_doppelganger("Some other title", p + ggplot2::ggtitle(NULL))
})
vdiffr/tests/testthat/helper-vdiffr.R 0000644 0001762 0000144 00000000057 14057630265 017426 0 ustar ligges users regenerate_snapshots <- function() {
FALSE
}
vdiffr/tests/testthat/test-snapshot/ 0000755 0001762 0000144 00000000000 14062076325 017355 5 ustar ligges users vdiffr/tests/testthat/test-snapshot/test-snapshot.R 0000644 0001762 0000144 00000001011 14062076325 022305 0 ustar ligges users test_that("errors reset snapshots", {
if (nzchar(Sys.getenv("VDIFFR_REGENERATE_SNAPS"))) {
expect_doppelganger("error resets snapshots", function() plot(1:3))
} else {
expect_doppelganger("error resets snapshots", function() stop("failing"))
}
})
test_that("skips reset snapshots", {
if (nzchar(Sys.getenv("VDIFFR_REGENERATE_SNAPS"))) {
expect_doppelganger("skip resets snapshots", function() plot(1:3))
} else {
expect_doppelganger("skip resets snapshots", function() skip("skipping"))
}
})
vdiffr/tests/testthat/test-snapshot/_snaps/ 0000755 0001762 0000144 00000000000 14062076325 020640 5 ustar ligges users vdiffr/tests/testthat/test-snapshot/_snaps/snapshot/ 0000755 0001762 0000144 00000000000 14062076325 022477 5 ustar ligges users vdiffr/tests/testthat/test-snapshot/_snaps/snapshot/skip-resets-snapshots.svg 0000644 0001762 0000144 00000010630 14062076325 027511 0 ustar ligges users
vdiffr/tests/testthat/test-snapshot/_snaps/snapshot/error-resets-snapshots.svg 0000644 0001762 0000144 00000010630 14062076325 027674 0 ustar ligges users
vdiffr/tests/testthat/helper-mock.R 0000644 0001762 0000144 00000000537 14062076247 017102 0 ustar ligges users vdiffr_skip_stale <- function() {
skip_if_not_installed("base", "4.1.0")
}
create_mock_pkg <- function(pkg = "mock-pkg") {
dir <- tempfile()
dir.create(dir, recursive = TRUE)
file.copy(pkg, dir, recursive = TRUE)
# Enable `R CMD check` logging
from <- file.path(dir, pkg)
to <- paste0(from, ".Rcheck")
file.rename(from, to)
to
}
vdiffr/tests/testthat/_snaps/ 0000755 0001762 0000144 00000000000 14707670764 016041 5 ustar ligges users vdiffr/tests/testthat/_snaps/expect-doppelganger/ 0000755 0001762 0000144 00000000000 14705720475 021767 5 ustar ligges users vdiffr/tests/testthat/_snaps/expect-doppelganger/page-error1.svg 0000644 0001762 0000144 00000005074 14705713635 024642 0 ustar ligges users
vdiffr/tests/testthat/_snaps/expect-doppelganger/grid-doppelganger.svg 0000644 0001762 0000144 00000002172 14062075640 026075 0 ustar ligges users
vdiffr/tests/testthat/_snaps/expect-doppelganger/grob.svg 0000644 0001762 0000144 00000001673 14062075640 023441 0 ustar ligges users
vdiffr/tests/testthat/_snaps/expect-doppelganger/page-error2.svg 0000644 0001762 0000144 00000010762 14705713635 024643 0 ustar ligges users
vdiffr/tests/testthat/_snaps/expect-doppelganger/myplot.svg 0000644 0001762 0000144 00000022272 14705713635 024041 0 ustar ligges users
vdiffr/tests/testthat/_snaps/expect-doppelganger/base-doppelganger-with-symbol.svg 0000644 0001762 0000144 00000003402 14062076256 030337 0 ustar ligges users
vdiffr/tests/testthat/_snaps/expect-doppelganger/myplot2.svg 0000644 0001762 0000144 00000015235 14062075640 024115 0 ustar ligges users
vdiffr/tests/testthat/_snaps/ggplot/ 0000755 0001762 0000144 00000000000 14062076221 017313 5 ustar ligges users vdiffr/tests/testthat/_snaps/ggplot/some-title.svg 0000644 0001762 0000144 00000003042 14062075604 022121 0 ustar ligges users
vdiffr/tests/testthat/_snaps/ggplot/some-other-title.svg 0000644 0001762 0000144 00000002620 14062076221 023235 0 ustar ligges users
vdiffr/tests/testthat/_snaps/bar/ 0000755 0001762 0000144 00000000000 14707670764 016605 5 ustar ligges users vdiffr/tests/testthat/_snaps/bar/expect-doppelganger/ 0000755 0001762 0000144 00000000000 14707670764 022542 5 ustar ligges users vdiffr/tests/testthat/_snaps/bar/expect-doppelganger/variant.svg 0000644 0001762 0000144 00000003611 14707670764 024730 0 ustar ligges users
vdiffr/tests/testthat/_snaps/foo/ 0000755 0001762 0000144 00000000000 14707670764 016624 5 ustar ligges users vdiffr/tests/testthat/_snaps/foo/expect-doppelganger/ 0000755 0001762 0000144 00000000000 14707670764 022561 5 ustar ligges users vdiffr/tests/testthat/_snaps/foo/expect-doppelganger/variant.svg 0000644 0001762 0000144 00000003037 14707670764 024751 0 ustar ligges users
vdiffr/tests/testthat/mock-pkg/ 0000755 0001762 0000144 00000000000 14707722707 016261 5 ustar ligges users vdiffr/tests/testthat/mock-pkg/tests/ 0000755 0001762 0000144 00000000000 14063036676 017421 5 ustar ligges users vdiffr/tests/testthat/mock-pkg/tests/testthat/ 0000755 0001762 0000144 00000000000 14710644552 021256 5 ustar ligges users vdiffr/tests/testthat/mock-pkg/tests/testthat/test-passed.R 0000644 0001762 0000144 00000001402 14057630265 023632 0 ustar ligges users library("vdiffr")
test_that("ggplot doppelgangers pass", {
p1_orig <- ggplot2::ggplot(mtcars, ggplot2::aes(disp)) + ggplot2::geom_histogram()
expect_doppelganger("myplot", p1_orig)
})
test_that("base doppelgangers pass", {
p_base <- function() plot(mtcars$disp)
expect_doppelganger("myplot2", p_base)
p_base_symbol <- function() {
plot.new()
text(0.5, 0.8, expression(x[i] + over(x, y)), font = 5)
}
expect_doppelganger("Base doppelganger with symbol", p_base_symbol)
})
library("grid")
test_that("grid doppelgangers pass", {
p_grid <- function() {
grid.newpage()
grid.text("foobar", gp = gpar(fontsize = 10.1))
grid.text("foobaz", 0.5, 0.1, gp = gpar(fontsize = 15.05))
}
expect_doppelganger("Grid doppelganger", p_grid)
})
vdiffr/tests/testthat/mock-pkg/tests/testthat/test-new.R 0000644 0001762 0000144 00000000365 14057630265 023153 0 ustar ligges users library("vdiffr")
p1 <- function() plot(mtcars$disp)
p2 <- ggplot2::ggplot(mtcars, ggplot2::aes(disp)) +
ggplot2::geom_histogram()
test_that("New plots are collected", {
expect_doppelganger("new1", p1)
expect_doppelganger("new2", p2)
})
vdiffr/tests/testthat/mock-pkg/tests/testthat/test-failed.R 0000644 0001762 0000144 00000002173 14705672775 023621 0 ustar ligges users library("vdiffr")
p1_orig <- ggplot2::ggplot(mtcars, ggplot2::aes(disp)) + ggplot2::geom_histogram()
p1_fail <- p1_orig + ggplot2::geom_vline(xintercept = 300)
maintenance <- Sys.getenv("VDIFFR_REGENERATE_TESTS") == "yes"
skip_if_maintenance <- function() {
if (maintenance) {
skip("maintenance")
}
}
test_that("mismatches are hard failures when NOT_CRAN is set", {
skip_if_maintenance()
expect_doppelganger("myplot", p1_fail)
})
test_that("Duplicated expectations issue a warning", {
skip_if_maintenance()
expect_doppelganger("myplot", p1_fail)
})
test_that("mismatches are hard failures when CI is set", {
skip_if_maintenance()
withr::local_envvar(c(NOT_CRAN = "", CI = "true"))
expect_doppelganger("myplot", p1_fail)
})
test_that("mismatches are skipped when NOT_CRAN is unset", {
skip_if_maintenance()
withr::local_envvar(c(NOT_CRAN = "", CI = ""))
expect_doppelganger("myplot", p1_fail)
})
# Maintenance --------------------------------------------------------
test_that("(maintenance) Reset failing figure", {
if (!maintenance) {
skip("maintenance")
}
expect_doppelganger("myplot", p1_orig)
})
vdiffr/tests/testthat/mock-pkg/tests/testthat/test-ggplot.R 0000644 0001762 0000144 00000000261 14057630265 023651 0 ustar ligges users test_that("ggtitle is set correctly", {
p <- ggplot2::ggplot()
expect_doppelganger("Some title", p)
expect_doppelganger("Some other title", p + ggplot2::ggtitle(NULL))
})
vdiffr/tests/testthat/mock-pkg/tests/testthat/_snaps/ 0000755 0001762 0000144 00000000000 14057630265 022541 5 ustar ligges users vdiffr/tests/testthat/mock-pkg/tests/testthat/_snaps/new/ 0000755 0001762 0000144 00000000000 14063036675 023334 5 ustar ligges users vdiffr/tests/testthat/mock-pkg/tests/testthat/_snaps/new/alt1.svg 0000644 0001762 0000144 00000015235 14063036675 024724 0 ustar ligges users
vdiffr/tests/testthat/mock-pkg/tests/testthat/_snaps/new/new1.svg 0000644 0001762 0000144 00000015235 14057630265 024733 0 ustar ligges users
vdiffr/tests/testthat/mock-pkg/tests/testthat/_snaps/new/context2.svg 0000644 0001762 0000144 00000022370 14063036675 025627 0 ustar ligges users
vdiffr/tests/testthat/mock-pkg/tests/testthat/_snaps/new/new2.svg 0000644 0001762 0000144 00000022364 14057630265 024735 0 ustar ligges users
vdiffr/tests/testthat/mock-pkg/tests/testthat/_snaps/new/context1.svg 0000644 0001762 0000144 00000015235 14063036675 025630 0 ustar ligges users
vdiffr/tests/testthat/mock-pkg/tests/testthat/_snaps/new/alt2.svg 0000644 0001762 0000144 00000022364 14063036675 024726 0 ustar ligges users
vdiffr/tests/testthat/mock-pkg/tests/testthat/_snaps/ggplot/ 0000755 0001762 0000144 00000000000 14057630265 024035 5 ustar ligges users vdiffr/tests/testthat/mock-pkg/tests/testthat/_snaps/ggplot/some-title.svg 0000644 0001762 0000144 00000003042 14057630265 026637 0 ustar ligges users
vdiffr/tests/testthat/mock-pkg/tests/testthat/_snaps/ggplot/some-other-title.svg 0000644 0001762 0000144 00000002620 14057630265 027757 0 ustar ligges users
vdiffr/tests/testthat/mock-pkg/tests/testthat/_snaps/passed/ 0000755 0001762 0000144 00000000000 14057630265 024020 5 ustar ligges users vdiffr/tests/testthat/mock-pkg/tests/testthat/_snaps/passed/grid-doppelganger.svg 0000644 0001762 0000144 00000002172 14057630265 030135 0 ustar ligges users
vdiffr/tests/testthat/mock-pkg/tests/testthat/_snaps/passed/myplot.svg 0000644 0001762 0000144 00000022366 14057630265 026076 0 ustar ligges users
vdiffr/tests/testthat/mock-pkg/tests/testthat/_snaps/passed/base-doppelganger-with-symbol.svg 0000644 0001762 0000144 00000003402 14057630265 032373 0 ustar ligges users
vdiffr/tests/testthat/mock-pkg/tests/testthat/_snaps/passed/myplot2.svg 0000644 0001762 0000144 00000015235 14057630265 026155 0 ustar ligges users
vdiffr/tests/testthat/mock-pkg/tests/testthat/_snaps/failed/ 0000755 0001762 0000144 00000000000 14063036676 023770 5 ustar ligges users vdiffr/tests/testthat/mock-pkg/tests/testthat/_snaps/failed/myplot.svg 0000644 0001762 0000144 00000022366 14057630265 026043 0 ustar ligges users
vdiffr/tests/testthat/mock-pkg/tests/testthat.R 0000654 0001762 0000144 00000000075 13137600254 021375 0 ustar ligges users library("testthat")
library("vdiffr")
test_check("mockpkg")
vdiffr/tests/testthat/mock-pkg/tests/figs/ 0000755 0001762 0000144 00000000000 14707722707 020353 5 ustar ligges users vdiffr/tests/testthat/mock-pkg/tests/figs/passed-plots/ 0000755 0001762 0000144 00000000000 14057630265 022764 5 ustar ligges users vdiffr/tests/testthat/mock-pkg/tests/figs/passed-plots/grid-doppelganger.svg 0000644 0001762 0000144 00000002172 14057630265 027101 0 ustar ligges users
vdiffr/tests/testthat/mock-pkg/tests/figs/orphaned1.svg 0000654 0001762 0000144 00000025475 13612055363 022762 0 ustar ligges users
vdiffr/tests/testthat/mock-pkg/tests/figs/ggplot/ 0000755 0001762 0000144 00000000000 14057630265 021642 5 ustar ligges users vdiffr/tests/testthat/mock-pkg/tests/figs/ggplot/some-title.svg 0000644 0001762 0000144 00000003042 14057630265 024444 0 ustar ligges users
vdiffr/tests/testthat/mock-pkg/tests/figs/ggplot/some-other-title.svg 0000644 0001762 0000144 00000002620 14057630265 025564 0 ustar ligges users
vdiffr/tests/testthat/mock-pkg/tests/figs/myplot.svg 0000644 0001762 0000144 00000022366 14057630265 022424 0 ustar ligges users
vdiffr/tests/testthat/mock-pkg/tests/figs/base-doppelganger-with-symbol.svg 0000644 0001762 0000144 00000003402 14057630265 026721 0 ustar ligges users
vdiffr/tests/testthat/mock-pkg/tests/figs/path2/ 0000755 0001762 0000144 00000000000 14024420772 021356 5 ustar ligges users vdiffr/tests/testthat/mock-pkg/tests/figs/path2/orphaned2.svg 0000654 0001762 0000144 00000025475 13612055363 024001 0 ustar ligges users
vdiffr/tests/testthat/mock-pkg/tests/figs/deps.txt 0000644 0001762 0000144 00000000056 14057630265 022043 0 ustar ligges users - vdiffr-svg-engine: 2.0
- vdiffr: 0.3.3.9000
vdiffr/tests/testthat/mock-pkg/tests/figs/myplot2.svg 0000644 0001762 0000144 00000015235 14057630265 022503 0 ustar ligges users
vdiffr/tests/testthat/mock-pkg/DESCRIPTION 0000644 0001762 0000144 00000000352 14057630265 017762 0 ustar ligges users Package: mockpkg
Title: title
License: GPL-2
Description: Package description.
Author: author
Maintainer: maintainer
Version: 0.1
Suggests:
testthat,
vdiffr
Config/testthat/edition: 3
vdiffr/tests/testthat.R 0000644 0001762 0000144 00000000074 14705713635 014673 0 ustar ligges users library("testthat")
library("vdiffr")
test_check("vdiffr")
vdiffr/MD5 0000644 0001762 0000144 00000014574 14710644552 012065 0 ustar ligges users ce8656510defaf567725482f59b29402 *DESCRIPTION
2613906139d24590c0e3c6d0a1236bf3 *LICENSE
d3ded957b6e400f917ed8784d407dce9 *LICENSE.note
7998bb7cbe5f3e01bb14b21c6044ac51 *NAMESPACE
2cf75e0538b57f01f3d2f3646e9c21ce *NEWS.md
f7e47e36768d23710243f70726558b37 *R/cpp11.R
e6143847785f7e1dae8bb052a3c94bfb *R/embed-svglite.R
06c6e0f50f96a731d497c44c804213a7 *R/expect-doppelganger.R
d4375fcade19d4b64f3e3e0ace0193bc *R/svg.R
567a17db0e6517fa7d6ce278f28eefff *R/svglite/SVG.R
cdcb793f62f99afd861bd21d9d064b16 *R/svglite/inlineSVG.R
7542e47114d1adb0202ce7c0c2ce2ae6 *R/svglite/utils.R
263844394001a877ba2b018c47b7fa7e *R/utils.R
9f065370dc1d552f71c897102308380c *R/vdiffr-package.R
199196e1e919342707e00498f2d02eea *README.md
2bba96f23dfdd8ca54202bacffa3fb20 *inst/create_glyph_dims.R
59bed213611e8815a355f154a06b095b *man/expect_doppelganger.Rd
cb1e46f469cfbbbde29c8b5113e1d789 *man/figures/lifecycle-archived.svg
c0d2e5a54f1fa4ff02bf9533079dd1f7 *man/figures/lifecycle-defunct.svg
a1b8c987c676c16af790f563f96cbb1f *man/figures/lifecycle-deprecated.svg
c3978703d8f40f2679795335715e98f4 *man/figures/lifecycle-experimental.svg
952b59dc07b171b97d5d982924244f61 *man/figures/lifecycle-maturing.svg
27b879bf3677ea76e3991d56ab324081 *man/figures/lifecycle-questioning.svg
53b3f893324260b737b3c46ed2a0e643 *man/figures/lifecycle-stable.svg
1c1fe7a759b86dc6dbcbe7797ab8246c *man/figures/lifecycle-superseded.svg
0088172480d8e872dd974f445f32de1e *man/vdiffr-package.Rd
65e93f80c148d6132db104a446462163 *man/write_svg.Rd
c38a387e5025d29da0a42bcec9d6b944 *src/Makevars
5f05efe55b70273f72fc1174e7da90c4 *src/Makevars.ucrt
4d2216b08763d48df028dbfa55699aa5 *src/Makevars.win
d5751b7c4a3303df5279e6cb69c894ea *src/SvgStream.h
0d7a89dafb484ce7144c8fcb4ac8ab83 *src/algo-it.h
dfe4d9008321756e568be701b0970190 *src/compare.cpp
d0ca8ade2ce4c1fdee38d111fde51d8a *src/cpp11.cpp
9f79846d56c16977b3e374c8dcb2b296 *src/devSVG.cpp
b41ae8758d99bbccb4bf54e4e448377a *src/engine_version.cpp
81482b01edde1b0929a7c5e1625dcc6a *src/engine_version.h
6c59a5120aac2f217425a11d8e9c4da1 *src/glyph_dims.h
e26b8b3bfef1f45f93d853c8136e437e *src/tinyformat.h
27558899d0796abedbb08c5903053ea8 *src/utils.h
3ca7236a09d486462e6c63c161c5d489 *src/vdiffr_types.h
4e4c1d78cb962d55ce689a405648209e *tests/testthat.R
132338ecafa867a5c73b3948c0134125 *tests/testthat/_snaps/bar/expect-doppelganger/variant.svg
c26675c7d067b958e28f5cfe228b93d9 *tests/testthat/_snaps/expect-doppelganger/base-doppelganger-with-symbol.svg
060614b15af5241d0144b3e6219e3b17 *tests/testthat/_snaps/expect-doppelganger/grid-doppelganger.svg
f987c089e0a5c4fcd553f3db6ca01095 *tests/testthat/_snaps/expect-doppelganger/grob.svg
4b5fbae414d7f94990b7a10e4f5e75ed *tests/testthat/_snaps/expect-doppelganger/myplot.svg
3521d7d1079c4fb4501fecf1565a08fc *tests/testthat/_snaps/expect-doppelganger/myplot2.svg
8133b7c1b8c94c6bd7b16c189d238125 *tests/testthat/_snaps/expect-doppelganger/page-error1.svg
32834f22556013924faae0402b214333 *tests/testthat/_snaps/expect-doppelganger/page-error2.svg
050bb57ffefa289f8b7908e123c88d63 *tests/testthat/_snaps/foo/expect-doppelganger/variant.svg
e1f46367c7414a9b10b69e8ebf4d31fb *tests/testthat/_snaps/ggplot/some-other-title.svg
5b7a12ba4c14d86fb64abc36f65db90c *tests/testthat/_snaps/ggplot/some-title.svg
e2a5a2957ef0cf0853cf76c35e4f63df *tests/testthat/helper-mock.R
759b31d2ae56cb88b71b693affc65a3d *tests/testthat/helper-vdiffr.R
a73b9366c952eb21d2dcae26621814d8 *tests/testthat/mock-pkg/DESCRIPTION
c26675c7d067b958e28f5cfe228b93d9 *tests/testthat/mock-pkg/tests/figs/base-doppelganger-with-symbol.svg
51434f553af6f682d9a814ae425d35bf *tests/testthat/mock-pkg/tests/figs/deps.txt
e1f46367c7414a9b10b69e8ebf4d31fb *tests/testthat/mock-pkg/tests/figs/ggplot/some-other-title.svg
5b7a12ba4c14d86fb64abc36f65db90c *tests/testthat/mock-pkg/tests/figs/ggplot/some-title.svg
268ec711f0b0621bae088228220e89de *tests/testthat/mock-pkg/tests/figs/myplot.svg
3521d7d1079c4fb4501fecf1565a08fc *tests/testthat/mock-pkg/tests/figs/myplot2.svg
96f958b68a8d91026c7bf8b12e1c632c *tests/testthat/mock-pkg/tests/figs/orphaned1.svg
060614b15af5241d0144b3e6219e3b17 *tests/testthat/mock-pkg/tests/figs/passed-plots/grid-doppelganger.svg
96f958b68a8d91026c7bf8b12e1c632c *tests/testthat/mock-pkg/tests/figs/path2/orphaned2.svg
545a30561a3deb2bf98a758acb2c84a5 *tests/testthat/mock-pkg/tests/testthat.R
268ec711f0b0621bae088228220e89de *tests/testthat/mock-pkg/tests/testthat/_snaps/failed/myplot.svg
e1f46367c7414a9b10b69e8ebf4d31fb *tests/testthat/mock-pkg/tests/testthat/_snaps/ggplot/some-other-title.svg
5b7a12ba4c14d86fb64abc36f65db90c *tests/testthat/mock-pkg/tests/testthat/_snaps/ggplot/some-title.svg
3521d7d1079c4fb4501fecf1565a08fc *tests/testthat/mock-pkg/tests/testthat/_snaps/new/alt1.svg
8ade7ca1c0dbec7cd76b6b795e494616 *tests/testthat/mock-pkg/tests/testthat/_snaps/new/alt2.svg
3521d7d1079c4fb4501fecf1565a08fc *tests/testthat/mock-pkg/tests/testthat/_snaps/new/context1.svg
9c7c2a1cdc5211c39be509a025af10ae *tests/testthat/mock-pkg/tests/testthat/_snaps/new/context2.svg
3521d7d1079c4fb4501fecf1565a08fc *tests/testthat/mock-pkg/tests/testthat/_snaps/new/new1.svg
fe272221ee9d3e2c903511b9d8333f20 *tests/testthat/mock-pkg/tests/testthat/_snaps/new/new2.svg
c26675c7d067b958e28f5cfe228b93d9 *tests/testthat/mock-pkg/tests/testthat/_snaps/passed/base-doppelganger-with-symbol.svg
060614b15af5241d0144b3e6219e3b17 *tests/testthat/mock-pkg/tests/testthat/_snaps/passed/grid-doppelganger.svg
268ec711f0b0621bae088228220e89de *tests/testthat/mock-pkg/tests/testthat/_snaps/passed/myplot.svg
3521d7d1079c4fb4501fecf1565a08fc *tests/testthat/mock-pkg/tests/testthat/_snaps/passed/myplot2.svg
498e1fe9e1b46fa3f16005f7a4b27520 *tests/testthat/mock-pkg/tests/testthat/test-failed.R
56da6d63ae23c277462dc2f823bab100 *tests/testthat/mock-pkg/tests/testthat/test-ggplot.R
deeabbddf500eb912c2ebf2689f1bcbc *tests/testthat/mock-pkg/tests/testthat/test-new.R
d9c2a1ac3ba36deac838e1819fa0ecb5 *tests/testthat/mock-pkg/tests/testthat/test-passed.R
82e3a18437a86df425c70f1224a8a59f *tests/testthat/test-expect-doppelganger.R
a0d7ad2a463cff1aa5d5d08aa35dacdc *tests/testthat/test-ggplot.R
fcd3f7a8e96d8875c9051dc710aecdce *tests/testthat/test-log.R
850776639573200b634640574ea7054e *tests/testthat/test-snapshot/_snaps/snapshot/error-resets-snapshots.svg
850776639573200b634640574ea7054e *tests/testthat/test-snapshot/_snaps/snapshot/skip-resets-snapshots.svg
47b250ddfe5f1b3efe09595a533718f3 *tests/testthat/test-snapshot/test-snapshot.R
41b1e7cb2851ce354053145b660e0335 *tools/winlibs.R
vdiffr/R/ 0000755 0001762 0000144 00000000000 14707670764 011755 5 ustar ligges users vdiffr/R/svglite/ 0000755 0001762 0000144 00000000000 14057630265 013420 5 ustar ligges users vdiffr/R/svglite/utils.R 0000644 0001762 0000144 00000005413 14057630265 014706 0 ustar ligges users
mini_plot <- function(...) graphics::plot(..., axes = FALSE, xlab = "", ylab = "")
plot_dim <- function(dim = c(NA, NA)) {
if (any(is.na(dim))) {
if (length(grDevices::dev.list()) == 0) {
default_dim <- c(10, 8)
} else {
default_dim <- grDevices::dev.size()
}
dim[is.na(dim)] <- default_dim[is.na(dim)]
dim_f <- prettyNum(dim, digits = 3)
message("Saving ", dim_f[1], "\" x ", dim_f[2], "\" image")
}
dim
}
vapply_chr <- function(.x, .f, ...) {
vapply(.x, .f, character(1), ...)
}
vapply_lgl <- function(.x, .f, ...) {
vapply(.x, .f, logical(1), ...)
}
lapply_if <- function(.x, .p, .f, ...) {
if (!is.logical(.p)) {
.p <- vapply_lgl(.x, .p)
}
.x[.p] <- lapply(.x[.p], .f, ...)
.x
}
keep <- function(.x, .p, ...) {
.x[vapply_lgl(.x, .p, ...)]
}
compact <- function(x) {
Filter(length, x)
}
`%||%` <- function(x, y) {
if (is.null(x)) y else x
}
is_scalar_character <- function(x) {
is.character(x) && length(x) == 1
}
names2 <- function(x) {
names(x) %||% rep("", length(x))
}
ilapply <- function(.x, .f, ...) {
idx <- names(.x) %||% seq_along(.x)
out <- Map(.f, names(.x), .x, ...)
names(out) <- names(.x)
out
}
ilapply_if <- function(.x, .p, .f, ...) {
if (!is.logical(.p)) {
.p <- vapply_lgl(.x, .p)
}
.x[.p] <- ilapply(.x[.p], .f, ...)
.x
}
set_names <- function(x, nm = x) {
stats::setNames(x, nm)
}
zip <- function(.l) {
fields <- set_names(names(.l[[1]]))
lapply(fields, function(i) {
lapply(.l, .subset2, i)
})
}
svglite_manual_tests <- new.env()
register_manual_test <- function(file) {
testthat_dir <- getwd()
testfile <- file.path(testthat_dir, file)
assign(file, testfile, svglite_manual_tests)
}
init_manual_tests <- function() {
remove(list = names(svglite_manual_tests), envir = svglite_manual_tests)
}
open_manual_tests <- function() {
lapply(names(svglite_manual_tests), function(test) {
utils::browseURL(svglite_manual_tests[[test]])
})
}
invalid_filename <- function(filename) {
if (!is.character(filename) || length(filename) != 1)
return(TRUE)
# strip double occurences of %
stripped_file <- gsub("%{2}", "", filename)
# filename is fine if there are no % left
if (!grepl("%", stripped_file))
return(FALSE)
# remove first allowed pattern, % followed by digits followed by [diouxX]
stripped_file <- sub("%[#0 ,+-]*[0-9.]*[diouxX]", "", stripped_file)
# matching leftover % indicates multiple patterns or a single incorrect pattern (e.g., %s)
return(grepl("%", stripped_file))
}
#' Convert an svg file to svgz, overwriting the old file
#' @param file the path to the file to convert
#' @keywords internal
#' @export
create_svgz <- function(file) {
svg <- readLines(file)
out <- gzfile(file, "w")
writeLines(svg, out)
close(out)
invisible(NULL)
}
vdiffr/R/svglite/SVG.R 0000644 0001762 0000144 00000006770 14057630265 014214 0 ustar ligges users #' An SVG Graphics Driver
#'
#' This function produces graphics compliant to the current w3 svg XML
#' standard. The driver output is currently NOT specifying a DOCTYPE DTD.
#'
#' svglite provides two ways of controlling fonts: system fonts
#' aliases and user fonts aliases. Supplying a font alias has two
#' effects. First it determines the \code{font-family} property of all
#' text anchors in the SVG output. Secondly, the font is used to
#' determine the dimensions of graphical elements and has thus an
#' influence on the overall aspect of the plots. This means that for
#' optimal display, the font must be available on both the computer
#' used to create the svg, and the computer used to render the
#' svg. See the \code{fonts} vignette for more information.
#'
#' @param filename The file where output will appear.
#' @param height,width Height and width in inches.
#' @param bg Default background color for the plot (defaults to "white").
#' @param pointsize Default point size.
#' @param standalone Produce a standalone svg file? If \code{FALSE}, omits
#' xml header and default namespace.
#' @param always_valid Should the svgfile be a valid svg file while it is being
#' written to? Setting this to `TRUE` will incur a considerable performance
#' hit (>50% additional rendering time) so this should only be set to `TRUE`
#' if the file is being parsed while it is still being written to.
#' @param file Identical to `filename`. Provided for backward compatibility.
#' @references \emph{W3C Scalable Vector Graphics (SVG)}:
#' \url{http://www.w3.org/Graphics/SVG/}
#' @author This driver was written by T Jake Luciani
#' \email{jakeluciani@@yahoo.com} 2012: updated by Matthieu Decorde
#' \email{matthieu.decorde@@ens-lyon.fr}
#' @seealso \code{\link{pictex}}, \code{\link{postscript}}, \code{\link{Devices}}
#'
#' @examples
#' # Save to file
#' svglite(tempfile("Rplots.svg"))
#' plot(1:11, (-5:5)^2, type = 'b', main = "Simple Example")
#' dev.off()
#'
#' @keywords device
#' @useDynLib svglite, .registration = TRUE
#' @importFrom systemfonts match_font
#' @export
svglite <- function(filename = "Rplot%03d.svg", width = 10, height = 8,
bg = "white", pointsize = 12, standalone = TRUE,
always_valid = FALSE, file) {
if (!missing(file)) {
filename <- file
}
if (invalid_filename(filename))
stop("invalid 'file': ", filename)
invisible(svglite_(filename, bg, width, height, pointsize, standalone, always_valid))
}
#' Access current SVG as a string.
#'
#' This is a variation on \code{\link{svglite}} that makes it easy to access
#' the current value as a string.
#'
#' See \code{\link{svglite}()} documentation for information about
#' specifying fonts.
#'
#' @return A function with no arguments: call the function to get the
#' current value of the string.
#' @examples
#' s <- svgstring(); s()
#'
#' plot.new(); s();
#' text(0.5, 0.5, "Hi!"); s()
#' dev.off()
#'
#' s <- svgstring()
#' plot(rnorm(5), rnorm(5))
#' s()
#' dev.off()
#' @inheritParams svglite
#' @export
svgstring <- function(width = 10, height = 8, bg = "white",
pointsize = 12, standalone = TRUE) {
env <- new.env(parent = emptyenv())
string_src <- svgstring_(env, width = width, height = height, bg = bg,
pointsize = pointsize, standalone = standalone)
function() {
svgstr <- env$svg_string
if(!env$is_closed) {
svgstr <- c(svgstr, get_svg_content(string_src))
}
structure(svgstr, class = "svg")
}
}
#' @export
print.svg <- function(x, ...) cat(x, sep = "\n")
vdiffr/R/svglite/inlineSVG.R 0000644 0001762 0000144 00000004452 14057630265 015406 0 ustar ligges users #' Run plotting code and view svg in RStudio Viewer or web browser.
#'
#' This is useful primarily for testing. Requires the \code{htmltools}
#' package.
#'
#' @param code Plotting code to execute.
#' @param ... Other arguments passed on to \code{\link{svglite}}.
#' @keywords internal
#' @export
#' @examples
#' if (interactive() && require("htmltools")) {
#' htmlSVG(plot(1:10))
#' htmlSVG(hist(rnorm(100)))
#' }
htmlSVG <- function(code, ...) {
svg <- inlineSVG(code, ...)
htmltools::browsable(
htmltools::HTML(svg)
)
}
#' Run plotting code and return svg
#'
#' This is useful primarily for testing. Requires the \code{xml2} package.
#'
#' @return A \code{xml2::xml_document} object.
#' @inheritParams htmlSVG
#' @inheritParams svglite
#' @keywords internal
#' @export
#' @examples
#' if (require("xml2")) {
#' x <- xmlSVG(plot(1, axes = FALSE))
#' x
#' xml_find_all(x, ".//text")
#' }
xmlSVG <- function(code, ..., standalone = FALSE, height = 7, width = 7) {
plot <- inlineSVG(code, ...,
standalone = standalone,
height = height,
width = width
)
xml2::read_xml(plot)
}
#' Run plotting code and open svg in OS/system default svg viewer or editor.
#'
#' This is useful primarily for testing or post-processing the SVG.
#'
#' @inheritParams htmlSVG
#' @inheritParams svglite
#' @keywords internal
#' @export
#' @examples
#' if (interactive()) {
#' editSVG(plot(1:10))
#' editSVG(contour(volcano))
#' }
editSVG <- function(code, ..., width = NA, height = NA) {
dim <- plot_dim(c(width, height))
tmp <- tempfile(fileext = ".svg")
svglite(tmp, width = dim[1], height = dim[2], ...)
tryCatch(code,
finally = grDevices::dev.off()
)
system(sprintf("open %s", shQuote(tmp)))
}
#' Run plotting code and return svg as string
#'
#' This is useful primarily for testing but can be used as an
#' alternative to \code{\link{svgstring}()}.
#'
#' @inheritParams htmlSVG
#' @keywords internal
#' @export
#' @examples
#' stringSVG(plot(1:10))
stringSVG <- function(code, ...) {
svg <- inlineSVG(code, ...)
structure(svg, class = "svg")
}
inlineSVG <- function(code, ..., width = NA, height = NA) {
dim <- plot_dim(c(width, height))
svg <- svgstring(width = dim[1], height = dim[2], ...)
tryCatch(code,
finally = grDevices::dev.off()
)
out <- svg()
class(out) <- NULL
out
}
vdiffr/R/vdiffr-package.R 0000644 0001762 0000144 00000000576 14057630265 014747 0 ustar ligges users #' @import rlang
#' @importFrom glue glue
#' @useDynLib vdiffr, .registration = TRUE
#' @keywords internal
"_PACKAGE"
SVG_ENGINE_VER <- "2.0"
svg_engine_ver <- function() {
as.numeric_version(SVG_ENGINE_VER)
}
.onLoad <- function(lib, pkg) {
set_engine_version(SVG_ENGINE_VER)
}
## usethis namespace: start
#' @importFrom lifecycle deprecated
## usethis namespace: end
NULL
vdiffr/R/cpp11.R 0000644 0001762 0000144 00000001205 14705673354 013016 0 ustar ligges users # Generated by cpp11: do not edit by hand
compare_files <- function(expected, test) {
.Call(`_vdiffr_compare_files`, expected, test)
}
svglite_ <- function(file, bg, width, height, pointsize, standalone, always_valid) {
.Call(`_vdiffr_svglite_`, file, bg, width, height, pointsize, standalone, always_valid)
}
svgstring_ <- function(env, bg, width, height, pointsize, standalone) {
.Call(`_vdiffr_svgstring_`, env, bg, width, height, pointsize, standalone)
}
get_svg_content <- function(p) {
.Call(`_vdiffr_get_svg_content`, p)
}
set_engine_version <- function(version) {
invisible(.Call(`_vdiffr_set_engine_version`, version))
}
vdiffr/R/svg.R 0000644 0001762 0000144 00000002627 14057632077 012677 0 ustar ligges users make_testcase_file <- function(fig_name) {
file <- tempfile(fig_name, fileext = ".svg")
structure(file, class = "vdiffr_testcase")
}
#' Default SVG writer
#'
#' This is the default SVG writer for vdiffr test cases. It uses
#' embedded versions of [svglite](https://svglite.r-lib.org),
#' [harfbuzz](https://harfbuzz.github.io/), and the Liberation and
#' Symbola fonts in order to create deterministic SVGs.
#'
#' @param plot A plot object to convert to SVG. Can be a ggplot2 object,
#' a [recorded plot][grDevices::recordPlot], or any object with a
#' [print()][base::print] method.
#' @param file The file to write the SVG to.
#' @param title An optional title for the test case.
#'
#' @export
write_svg <- function(plot, file, title = "") {
svglite(file)
on.exit(grDevices::dev.off())
print_plot(plot, title)
}
print_plot <- function(p, title = "") {
UseMethod("print_plot")
}
#' @export
print_plot.default <- function(p, title = "") {
print(p)
}
#' @export
print_plot.ggplot <- function(p, title = "") {
if (title != "" && !"title" %in% names(p$labels)) {
p <- p + ggplot2::ggtitle(title)
}
if (!length(p$theme)) {
p <- p + ggplot2::theme_test()
}
print(p)
}
#' @export
print_plot.grob <- function(p, title) {
grid::grid.draw(p)
}
#' @export
print_plot.recordedplot <- function(p, title) {
grDevices::replayPlot(p)
}
#' @export
print_plot.function <- function(p, title) {
p()
}
vdiffr/R/utils.R 0000644 0001762 0000144 00000003243 14707722571 013234 0 ustar ligges users package_version <- function(pkg) {
as.character(utils::packageVersion(pkg))
}
cat_line <- function(..., trailing = TRUE, file = "") {
cat(paste_line(..., trailing = trailing), file = file)
}
paste_line <- function(..., trailing = FALSE) {
lines <- paste(chr(...), collapse = "\n")
if (trailing) {
lines <- paste0(lines, "\n")
}
lines
}
push_log <- function(name, old_path, new_path) {
log_path <- Sys.getenv("VDIFFR_LOG_PATH")
# If no envvar is set, check if we are running under R CMD check. In
# that case, always push a log file.
if (!nzchar(log_path)) {
if (!is_checking_remotely()) {
return(invisible(FALSE))
}
log_path <- testthat::test_path("..", "vdiffr.Rout.fail")
}
log_exists <- file.exists(log_path)
file <- file(log_path, "a")
on.exit(close(file))
if (!log_exists) {
cat_line(
file = file,
"Environment:",
vdiffr_info(),
""
)
}
diff_lines <- diff_lines(name, old_path, new_path)
cat_line(file = file, "", !!!diff_lines, "")
}
is_checking_remotely <- function() {
nzchar(Sys.getenv("CI")) || !nzchar(Sys.getenv("NOT_CRAN"))
}
diff_lines <- function(name,
before_path,
after_path) {
before <- readLines(before_path)
after <- readLines(after_path)
diff <- diffobj::diffChr(
before,
after,
format = "raw",
# For reproducibility
disp.width = 80
)
lines <- as.character(diff)
paste_line(
glue("Failed doppelganger: {name} ({before_path})"),
"",
!!!lines
)
}
vdiffr_info <- function() {
glue(
"- vdiffr-svg-engine: { SVG_ENGINE_VER }
- vdiffr: { utils::packageVersion('vdiffr') }"
)
}
vdiffr/R/expect-doppelganger.R 0000644 0001762 0000144 00000016174 14707670764 016046 0 ustar ligges users #' Does a figure look like its expected output?
#'
#' @description
#'
#' `expect_doppelganger()` is a testthat expectation for graphical
#' plots. It generates SVG snapshots that you can review graphically
#' with [testthat::snapshot_review()]. You will find more information
#' about snapshotting in the [testthat snapshots
#' vignette](https://testthat.r-lib.org/articles/snapshotting.html).
#'
#' Note that `expect_doppelgagner()` requires R version 4.1.0. If run
#' on an earlier version of R, it emits a `testthat::skip()` so that you
#' can still run other checks on old versions of R.
#'
#' @param title A brief description of what is being tested in the
#' figure. For instance: "Points and lines overlap".
#'
#' If a ggplot2 figure doesn't have a title already, `title` is
#' applied to the figure with `ggtitle()`.
#'
#' The title is also used as file name for storing SVG (in a
#' sanitzed form, with special characters converted to `"-"`).
#' @param fig A figure to test. This can be a ggplot object, a
#' recordedplot, or more generally any object with a `print` method.
#'
#' If you need to test a plot with non-printable objects (e.g. base
#' plots), `fig` can be a function that generates and prints the
#' plot, e.g. `fig = function() plot(1:3)`.
#' @param path,... `r lifecycle::badge('deprecated')`.
#' @param writer A function that takes the plot, a target SVG file,
#' and an optional plot title. It should transform the plot to SVG
#' in a deterministic way and write it to the target file. See
#' [write_svg()] (the default) for an example.
#' @param cran If `FALSE` (the default), mismatched snapshots only
#' cause a failure when you run tests locally or in your CI (Github
#' Actions or any platform that sets the `CI` environment variable).
#' If `TRUE`, failures may also occur on CRAN machines.
#'
#' Failures are disabled on CRAN by default because testing the
#' appearance of a figure is inherently fragile. Changes in the R
#' graphics engine or in ggplot2 may cause subtle differences in the
#' aspect of a plot, such as a slightly smaller or larger margin.
#' These changes will cause spurious failures because you need to
#' update your snapshots to reflect the upstream changes.
#'
#' It would be distracting for both you and the CRAN maintainers if
#' such changes systematically caused failures on CRAN. This is why
#' snapshot expectations do not fail on CRAN by default and should
#' be treated as a monitoring tool that allows you to quickly check
#' how the appearance of your figures changes over time, and to
#' manually assess whether changes reflect actual problems in your
#' package.
#'
#' Internally, this argument is passed to
#' [testthat::expect_snapshot_file()].
#'
#' @inheritParams testthat::expect_snapshot_file
#'
#' @section Debugging:
#' It is sometimes difficult to understand the cause of a failure.
#' This usually indicates that the plot is not created
#' deterministically. Potential culprits are:
#'
#' * Some of the plot components depend on random variation. Try
#' setting a seed.
#'
#' * The plot depends on some system library. For instance sf plots
#' depend on libraries like GEOS and GDAL. It might not be possible
#' to test these plots with vdiffr.
#'
#' To help you understand the causes of a failure, vdiffr
#' automatically logs the SVG diff of all failures when run under R
#' CMD check. The log is located in `tests/vdiffr.Rout.fail` and
#' should be displayed on Travis.
#'
#' You can also set the `VDIFFR_LOG_PATH` environment variable with
#' `Sys.setenv()` to unconditionally (also interactively) log failures
#' in the file pointed by the variable.
#'
#' @examples
#' if (FALSE) { # Not run
#'
#' library("ggplot2")
#'
#' test_that("plots have known output", {
#' disp_hist_base <- function() hist(mtcars$disp)
#' expect_doppelganger("disp-histogram-base", disp_hist_base)
#'
#' disp_hist_ggplot <- ggplot(mtcars, aes(disp)) + geom_histogram()
#' expect_doppelganger("disp-histogram-ggplot", disp_hist_ggplot)
#' })
#'
#' }
#' @export
expect_doppelganger <- function(title,
fig,
path = deprecated(),
...,
writer = write_svg,
cran = FALSE,
variant = NULL) {
testthat::local_edition(3)
fig_name <- str_standardise(title)
file <- paste0(fig_name, ".svg")
# Announce snapshot file before touching `fig` in case evaluation
# causes an error. This allows testthat to restore the files
# (see r-lib/testthat#1393).
testthat::announce_snapshot_file(name = file)
testcase <- make_testcase_file(fig_name)
writer(fig, testcase, title)
if (!missing(...)) {
lifecycle::deprecate_soft(
"1.0.0",
"vdiffr::expect_doppelganger(... = )",
)
}
if (lifecycle::is_present(path)) {
lifecycle::deprecate_soft(
"1.0.0",
"vdiffr::expect_doppelganger(path = )",
)
}
if (is_graphics_engine_stale()) {
testthat::skip(paste_line(
"The R graphics engine is too old.",
"Please update to R 4.1.0 and regenerate the vdiffr snapshots."
))
}
withCallingHandlers(
testthat::expect_snapshot_file(
testcase,
name = file,
cran = cran,
variant = variant,
compare = testthat::compare_file_text
),
expectation_failure = function(cnd) {
if (is_snapshot_stale(title, testcase)) {
warn(paste_line(
"SVG snapshot generated under a different vdiffr version.",
"i" = "Please update your snapshots."
))
}
if (!is_null(snapshotter <- get_snapshotter())) {
path_old <- snapshot_path(snapshotter, file)
path_new <- snapshot_path(snapshotter, paste0(fig_name, ".new.svg"))
if (all(file.exists(path_old, path_new))) {
push_log(fig_name, path_old, path_new)
}
}
}
)
}
# From testthat
get_snapshotter <- function() {
x <- getOption("testthat.snapshotter")
if (is.null(x)) {
return()
}
if (!x$is_active()) {
return()
}
x
}
snapshot_path <- function(snapshotter, file) {
file.path(snapshotter$snap_dir, snapshotter$file, file)
}
is_graphics_engine_stale <- function() {
getRversion() < "4.1.0"
}
str_standardise <- function(s, sep = "-") {
stopifnot(is_scalar_character(s))
s <- gsub("[^a-z0-9]", sep, tolower(s))
s <- gsub(paste0(sep, sep, "+"), sep, s)
s <- gsub(paste0("^", sep, "|", sep, "$"), "", s)
s
}
is_snapshot_stale <- function(title, testcase) {
if (is_null(snapshotter <- get_snapshotter())) {
return(FALSE)
}
file <- paste0(str_standardise(title), ".svg")
path <- snapshot_path(snapshotter, file)
if (!file.exists(path)) {
return(FALSE)
}
lines <- readLines(path)
match <- regexec(
"data-engine-version='([0-9.]+)'",
lines
)
match <- Filter(length, regmatches(lines, match))
# Old vdiffr snapshot that doesn't embed a version
if (!length(match)) {
return(TRUE)
}
if (length(match) > 1) {
abort("Found multiple vdiffr engine versions in SVG snapshot.")
}
snapshot_version <- match[[1]][[2]]
svg_engine_ver() != snapshot_version
}
vdiffr/R/embed-svglite.R 0000644 0001762 0000144 00000000255 14057630265 014617 0 ustar ligges users svglite_path <- function(...) {
file.path("R", "svglite", ...)
}
for (file in list.files(svglite_path(), pattern = "*.R")) {
source(svglite_path(file), local = TRUE)
}
vdiffr/LICENSE.note 0000644 0001762 0000144 00000006111 14057630265 013512 0 ustar ligges users vdiffr as a whole is released under MIT. It includes:
- the jQuery library under the Apache 2.0 licence,
- the js-imagediff library under the MIT licence,
- the TwoFace library under the MIT licence,
- the daff library under the MIT license,
- the diff2html library under the MIT license,
all of which are compatible with the MIT.
js-imagediff
------------
Copyright (c) 2011 Carl Sutherland, Humble Software Development
Permission is hereby granted, free of charge, to any person
obtaining a copy of this software and associated documentation
files (the "Software"), to deal in the Software without
restriction, including without limitation the rights to use,
copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the
Software is furnished to do so, subject to the following
conditions:
The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
OTHER DEALINGS IN THE SOFTWARE.
TwoFace
-------
Copyright (c) 2016 David Hong
Permission is hereby granted, free of charge, to any person
obtaining a copy of this software and associated documentation
files (the "Software"), to deal in the Software without
restriction, including without limitation the rights to use,
copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the
Software is furnished to do so, subject to the following
conditions:
The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
OTHER DEALINGS IN THE SOFTWARE.
jQuery
------
Copyright (c) 2016 jQuery Foundation and other contributors, https://jquery.org/
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License. vdiffr/src/ 0000755 0001762 0000144 00000000000 14707722706 012335 5 ustar ligges users vdiffr/src/devSVG.cpp 0000644 0001762 0000144 00000065032 14705672254 014205 0 ustar ligges users // (C) 2002 T Jake Luciani: SVG device, based on PicTex device
// (C) 2008 Tony Plate: Line type support from RSVGTipsDevice package
// (C) 2012 Matthieu Decorde: UTF-8 support, XML reserved characters and XML header
// (C) 2015 RStudio (Hadley Wickham): modernisation & refactoring
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation; either version 2 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
extern "C" {
#include
}
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include "SvgStream.h"
#include "utils.h"
#include "tinyformat.h"
#include "engine_version.h"
#include "glyph_dims.h"
typedef std::shared_ptr SvgStreamPtr;
// SVG device metadata
class SVGDesc {
public:
SvgStreamPtr stream;
int pageno;
bool is_inited;
std::string clipid; // ID for the clip path
double clipx0, clipx1, clipy0, clipy1; // Save the previous clip path to avoid duplication
bool standalone;
bool always_valid;
const std::string file;
SVGDesc(SvgStreamPtr stream_, bool standalone_, const std::string& file_, bool always_valid_):
stream(stream_),
pageno(0),
is_inited(false),
clipx0(0), clipx1(0), clipy0(0), clipy1(0),
standalone(standalone_),
always_valid(always_valid_),
file(file_) {
}
void nextFile() {
stream->finish(false);
if (stream->is_file_stream()) {
SvgStreamPtr newStream(new SvgStreamFile(file, pageno + 1, always_valid));
stream = newStream;
}
clipid.clear();
}
};
inline bool is_black(int col) {
return (R_RED(col) == 0) && (R_GREEN(col) == 0) && (R_BLUE(col) == 0) &&
(R_ALPHA(col) == 255);
}
inline bool is_filled(int col) {
return R_ALPHA(col) != 0;
}
inline bool is_bold(int face) {
return face == 2 || face == 4;
}
inline bool is_italic(int face) {
return face == 3 || face == 4;
}
inline bool is_bolditalic(int face) {
return face == 4;
}
inline bool is_symbol(int face) {
return face == 5;
}
const static char encode_lookup[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
const static char pad_character = '=';
inline std::string base64_encode(const std::uint8_t* buffer, size_t size) {
std::string encoded_string;
encoded_string.reserve(((size/3) + (size % 3 > 0)) * 4);
std::uint32_t temp{};
int index = 0;
for (size_t idx = 0; idx < size/3; idx++) {
temp = buffer[index++] << 16; //Convert to big endian
temp += buffer[index++] << 8;
temp += buffer[index++];
encoded_string.append(1, encode_lookup[(temp & 0x00FC0000) >> 18]);
encoded_string.append(1, encode_lookup[(temp & 0x0003F000) >> 12]);
encoded_string.append(1, encode_lookup[(temp & 0x00000FC0) >> 6 ]);
encoded_string.append(1, encode_lookup[(temp & 0x0000003F) ]);
}
switch (size % 3) {
case 1:
temp = buffer[index++] << 16; //Convert to big endian
encoded_string.append(1, encode_lookup[(temp & 0x00FC0000) >> 18]);
encoded_string.append(1, encode_lookup[(temp & 0x0003F000) >> 12]);
encoded_string.append(2, pad_character);
break;
case 2:
temp = buffer[index++] << 16; //Convert to big endian
temp += buffer[index++] << 8;
encoded_string.append(1, encode_lookup[(temp & 0x00FC0000) >> 18]);
encoded_string.append(1, encode_lookup[(temp & 0x0003F000) >> 12]);
encoded_string.append(1, encode_lookup[(temp & 0x00000FC0) >> 6 ]);
encoded_string.append(1, pad_character);
break;
}
return encoded_string;
}
static void png_memory_write(png_structp png_ptr, png_bytep data, png_size_t length) {
std::vector *p = (std::vector*)png_get_io_ptr(png_ptr);
p->insert(p->end(), data, data + length);
}
inline std::string raster_to_string(unsigned int *raster, int w, int h, double width, double height, bool interpolate) {
h = h < 0 ? -h : h;
w = w < 0 ? -w : w;
bool resize = false;
int w_fac = 1, h_fac = 1;
std::vector raster_resize;
if (!interpolate && double(w) < width) {
resize = true;
w_fac = std::ceil(width / w);
}
if (!interpolate && double(h) < height) {
resize = true;
h_fac = std::ceil(height / h);
}
if (resize) {
int w_new = w * w_fac;
int h_new = h * h_fac;
raster_resize.reserve(w_new * h_new);
for (int i = 0; i < h; ++i) {
for (int j = 0; j < w; ++j) {
unsigned int val = raster[i * w + j];
for (int wrep = 0; wrep < w_fac; ++wrep) {
raster_resize.push_back(val);
}
}
for (int hrep = 1; hrep < h_fac; ++hrep) {
raster_resize.insert(raster_resize.end(), raster_resize.end() - w_new, raster_resize.end());
}
}
raster = raster_resize.data();
w = w_new;
h = h_new;
}
png_structp png = png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
if (!png) {
return "";
}
png_infop info = png_create_info_struct(png);
if (!info) {
png_destroy_write_struct(&png, (png_infopp)NULL);
return "";
}
if (setjmp(png_jmpbuf(png))) {
png_destroy_write_struct(&png, &info);
return "";
}
png_set_IHDR(
png,
info,
w, h,
8,
PNG_COLOR_TYPE_RGBA,
PNG_INTERLACE_NONE,
PNG_COMPRESSION_TYPE_DEFAULT,
PNG_FILTER_TYPE_DEFAULT
);
std::vector rows(h);
for (int y = 0; y < h; ++y) {
rows[y] = (uint8_t*)raster + y * w * 4;
}
std::vector buffer;
png_set_rows(png, info, &rows[0]);
png_set_write_fn(png, &buffer, png_memory_write, NULL);
png_write_png(png, info, PNG_TRANSFORM_IDENTITY, NULL);
png_destroy_write_struct(&png, &info);
return base64_encode(buffer.data(), buffer.size());
}
inline void write_escaped(SvgStreamPtr stream, const char* text) {
for(const char* cur = text; *cur != '\0'; ++cur) {
switch(*cur) {
case '&': (*stream) << "&"; break;
case '<': (*stream) << "<"; break;
case '>': (*stream) << ">"; break;
default: (*stream) << *cur;
}
}
}
inline void write_attr_dbl(SvgStreamPtr stream, const char* attr, double value) {
(*stream) << ' ' << attr << "='" << value << '\'';
}
inline void write_attr_str(SvgStreamPtr stream, const char* attr, const char* value) {
(*stream) << ' ' << attr << "='" << value << '\'';
}
// Writing clip path attribute
inline void write_attr_clip(SvgStreamPtr stream, std::string clipid) {
if (clipid.empty())
return;
(*stream) << " clip-path='url(#cp" << clipid << ")'";
}
// Beginning of writing style attributes
inline void write_style_begin(SvgStreamPtr stream) {
(*stream) << " style='";
}
// End of writing style attributes
inline void write_style_end(SvgStreamPtr stream) {
(*stream) << "'";
}
// Writing style attributes related to colors
inline void write_style_col(SvgStreamPtr stream, const char* attr, int col, bool first = false) {
int alpha = R_ALPHA(col);
if(!first) (*stream) << ' ';
if (alpha == 0) {
(*stream) << attr << ": none;";
return;
} else {
(*stream) << tfm::format("%s: #%02X%02X%02X;", attr, R_RED(col), R_GREEN(col), R_BLUE(col));
if (alpha != 255)
(*stream) << ' ' << attr << "-opacity: " << alpha / 255.0 << ';';
}
}
// Writing style attributes whose values are double type
inline void write_style_dbl(SvgStreamPtr stream, const char* attr, double value, bool first = false) {
if(!first) (*stream) << ' ';
(*stream) << attr << ": " << value << ';';
}
// Writing style attributes whose values are int type
inline void write_style_int(SvgStreamPtr stream, const char* attr, int value, bool first = false) {
if(!first) (*stream) << ' ';
(*stream) << attr << ": " << value << ';';
}
inline void write_style_fontsize(SvgStreamPtr stream, double value, bool first = false) {
if(!first) (*stream) << ' ';
// Firefox requires that we provide a unit (even though px is
// redundant here)
(*stream) << "font-size: " << value << "px;";
}
// Writing style attributes whose values are strings
inline void write_style_str(SvgStreamPtr stream, const char* attr, const char* value, bool first = false) {
if(!first) (*stream) << ' ';
(*stream) << attr << ": " << value << ';';
}
inline double scale_lty(int lty, double lwd) {
// Don't rescale if lwd < 1
// https://github.com/wch/r-source/blob/master/src/library/grDevices/src/cairo/cairoFns.c#L134
return ((lwd > 1) ? lwd : 1) * (lty & 15);
}
// Writing style attributes related to line types
inline void write_style_linetype(SvgStreamPtr stream, const pGEcontext gc, bool first = false) {
int lty = gc->lty;
double lwd = gc->lwd;
// 1 lwd = 1/96", but units in rest of document are 1/72"
write_style_dbl(stream, "stroke-width", lwd / 96.0 * 72, first);
// Default is "stroke: #000000;" as declared in \n";
(*stream) << "\n";
(*stream) << "fill))
write_style_col(stream, "fill", gc->fill);
else
write_style_col(stream, "fill", dd->startfill);
write_style_end(stream);
(*stream) << "/>\n";
// Initialise clipping - make sure the stored clipping is bogus to force
// svg_clip to do its thing
svgd->clipx0 = R_PosInf;
svgd->clipy0 = R_NegInf;
svgd->clipx1 = R_NegInf;
svgd->clipy1 = R_PosInf;
svgd->is_inited = true;
svg_clip(0, dd->right, dd->bottom, 0, dd);
svgd->stream->flush();
svgd->pageno++;
}
void svg_close(pDevDesc dd) {
SVGDesc *svgd = (SVGDesc*) dd->deviceSpecific;
if (svgd->is_inited) {
svgd->stream->finish(true);
}
delete(svgd);
}
void svg_line(double x1, double y1, double x2, double y2,
const pGEcontext gc, pDevDesc dd) {
SVGDesc *svgd = (SVGDesc*) dd->deviceSpecific;
if (!svgd->is_inited) {
return;
}
SvgStreamPtr stream = svgd->stream;
(*stream) << "\n";
stream->flush();
}
void svg_poly(int n, double *x, double *y, int filled, const pGEcontext gc,
pDevDesc dd, const char* node_name) {
SVGDesc *svgd = (SVGDesc*) dd->deviceSpecific;
if (!svgd->is_inited) {
return;
}
SvgStreamPtr stream = svgd->stream;
(*stream) << "<" << node_name << " points='";
for (int i = 0; i < n; i++) {
(*stream) << x[i] << ',' << y[i] << ' ';
}
stream->put('\'');
write_style_begin(stream);
write_style_linetype(stream, gc, true);
if (filled)
write_style_col(stream, "fill", gc->fill);
write_style_end(stream);
(*stream) << " />\n";
stream->flush();
}
void svg_polyline(int n, double *x, double *y, const pGEcontext gc,
pDevDesc dd) {
svg_poly(n, x, y, 0, gc, dd, "polyline");
}
void svg_polygon(int n, double *x, double *y, const pGEcontext gc,
pDevDesc dd) {
svg_poly(n, x, y, 1, gc, dd, "polygon");
}
void svg_path(double *x, double *y,
int npoly, int *nper,
Rboolean winding,
const pGEcontext gc, pDevDesc dd) {
SVGDesc *svgd = (SVGDesc*) dd->deviceSpecific;
if (!svgd->is_inited) {
return;
}
SvgStreamPtr stream = svgd->stream;
// Create path data
(*stream) << "put('Z');
}
// Finish path data
stream->put('\'');
write_style_begin(stream);
// Specify fill rule
write_style_str(stream, "fill-rule", winding ? "nonzero" : "evenodd", true);
if (is_filled(gc->fill))
write_style_col(stream, "fill", gc->fill);
write_style_linetype(stream, gc);
write_style_end(stream);
(*stream) << " />\n";
stream->flush();
}
double svg_strwidth(const char *str, const pGEcontext gc, pDevDesc dd) {
static UTF_UCS converter;
double width = 0.0;
int n_chars = 0;
uint32_t* chars = converter.convert(str, n_chars);
std::unordered_map::const_iterator match;
for (int i = 0; i < n_chars; ++i) {
if (gc->fontface == 5) { // Symbol
match = SYMBOLA_DIM.find(chars[i]);
if (match == SYMBOLA_DIM.end()) {
match = SYMBOLA_DIM.find(1);
}
} else {
match = LIBERATION_DIM.find(chars[i]);
if (match == LIBERATION_DIM.end()) {
match = LIBERATION_DIM.find(1);
}
}
width += match->second.width;
}
double mod = gc->ps * gc->cex / 12;
return width * mod;
}
void svg_rect(double x0, double y0, double x1, double y1,
const pGEcontext gc, pDevDesc dd) {
SVGDesc *svgd = (SVGDesc*) dd->deviceSpecific;
if (!svgd->is_inited) {
return;
}
SvgStreamPtr stream = svgd->stream;
// x and y give top-left position
(*stream) << "fill))
write_style_col(stream, "fill", gc->fill);
write_style_end(stream);
(*stream) << " />\n";
stream->flush();
}
void svg_circle(double x, double y, double r, const pGEcontext gc,
pDevDesc dd) {
SVGDesc *svgd = (SVGDesc*) dd->deviceSpecific;
if (!svgd->is_inited) {
return;
}
SvgStreamPtr stream = svgd->stream;
(*stream) << "fill))
write_style_col(stream, "fill", gc->fill);
write_style_end(stream);
(*stream) << " />\n";
stream->flush();
}
void svg_text(double x, double y, const char *str, double rot,
double hadj, const pGEcontext gc, pDevDesc dd) {
SVGDesc *svgd = (SVGDesc*) dd->deviceSpecific;
if (!svgd->is_inited) {
return;
}
SvgStreamPtr stream = svgd->stream;
(*stream) << "cex * gc->ps;
if (hadj == 0.5) {
write_attr_str(stream, "text-anchor", "middle");
} else if (hadj == 1) {
write_attr_str(stream, "text-anchor", "end");
}
write_style_begin(stream);
write_style_fontsize(stream, fontsize, true);
if (is_bold(gc->fontface)) {
write_style_str(stream, "font-weight", "bold");
}
if (is_italic(gc->fontface))
write_style_str(stream, "font-style", "italic");
if (!is_black(gc->col))
write_style_col(stream, "fill", gc->col);
write_style_str(stream, "font-family", "sans");
write_style_end(stream);
double width = svg_strwidth(str, gc, dd);
(*stream) << " textLength='" << width << "px'";
(*stream) << " lengthAdjust='spacingAndGlyphs'";
stream->put('>');
write_escaped(stream, str);
(*stream) << "";
stream->put('\n');
stream->flush();
}
void svg_size(double *left, double *right, double *bottom, double *top,
pDevDesc dd) {
*left = dd->left;
*right = dd->right;
*bottom = dd->bottom;
*top = dd->top;
}
void svg_raster(unsigned int *raster, int w, int h,
double x, double y,
double width, double height,
double rot,
Rboolean interpolate,
const pGEcontext gc, pDevDesc dd) {
SVGDesc *svgd = (SVGDesc*) dd->deviceSpecific;
if (!svgd->is_inited) {
return;
}
SvgStreamPtr stream = svgd->stream;
if (height < 0)
height = -height;
std::string base64_str = raster_to_string(raster, w, h, width, height, interpolate);
(*stream) << "";
stream->put('\n');
stream->flush();
}
SEXP svg_set_pattern(SEXP pattern, pDevDesc dd) {
return R_NilValue;
}
void svg_release_pattern(SEXP ref, pDevDesc dd) {}
SEXP svg_set_clip_path(SEXP path, SEXP ref, pDevDesc dd) {
return R_NilValue;
}
void svg_release_clip_path(SEXP ref, pDevDesc dd) {}
SEXP svg_set_mask(SEXP path, SEXP ref, pDevDesc dd) {
return R_NilValue;
}
void svg_release_mask(SEXP ref, pDevDesc dd) {}
pDevDesc svg_driver_new(SvgStreamPtr stream, int bg, double width,
double height, double pointsize,
bool standalone, const std::string& file,
bool always_valid) {
pDevDesc dd = (DevDesc*) calloc(1, sizeof(DevDesc));
if (dd == NULL)
return dd;
dd->startfill = bg;
dd->startcol = R_RGB(0, 0, 0);
dd->startps = pointsize;
dd->startlty = 0;
dd->startfont = 1;
dd->startgamma = 1;
// Callbacks
dd->activate = NULL;
dd->deactivate = NULL;
dd->close = svg_close;
dd->clip = svg_clip;
dd->size = svg_size;
dd->newPage = svg_new_page;
dd->line = svg_line;
dd->text = svg_text;
dd->strWidth = svg_strwidth;
dd->rect = svg_rect;
dd->circle = svg_circle;
dd->polygon = svg_polygon;
dd->polyline = svg_polyline;
dd->path = svg_path;
dd->mode = NULL;
dd->metricInfo = svg_metric_info;
dd->cap = NULL;
dd->raster = svg_raster;
#if R_GE_version >= 13
dd->setPattern = svg_set_pattern;
dd->releasePattern = svg_release_pattern;
dd->setClipPath = svg_set_clip_path;
dd->releaseClipPath = svg_release_clip_path;
dd->setMask = svg_set_mask;
dd->releaseMask = svg_release_mask;
#endif
// UTF-8 support
dd->wantSymbolUTF8 = (Rboolean) 1;
dd->hasTextUTF8 = (Rboolean) 1;
dd->textUTF8 = svg_text;
dd->strWidthUTF8 = svg_strwidth;
// Screen Dimensions in pts
dd->left = 0;
dd->top = 0;
dd->right = width * 72;
dd->bottom = height * 72;
// Magic constants copied from other graphics devices
// nominal character sizes in pts
dd->cra[0] = 0.9 * pointsize;
dd->cra[1] = 1.2 * pointsize;
// character alignment offsets
dd->xCharOffset = 0.4900;
dd->yCharOffset = 0.3333;
dd->yLineBias = 0.2;
// inches per pt
dd->ipr[0] = 1.0 / 72.0;
dd->ipr[1] = 1.0 / 72.0;
// Capabilities
dd->canClip = TRUE;
dd->canHAdj = 1;
dd->canChangeGamma = FALSE;
dd->displayListOn = FALSE;
dd->haveTransparency = 2;
dd->haveTransparentBg = 2;
#if R_GE_version >= 13
dd->deviceVersion = R_GE_definitions;
#endif
dd->deviceSpecific = new SVGDesc(stream, standalone, file, always_valid);
return dd;
}
void makeDevice(SvgStreamPtr stream, std::string bg_, double width, double height,
double pointsize, bool standalone, const std::string& file,
bool always_valid) {
int bg = R_GE_str2col(bg_.c_str());
R_GE_checkVersionOrDie(R_GE_version);
R_CheckDeviceAvailable();
BEGIN_SUSPEND_INTERRUPTS {
pDevDesc dev = svg_driver_new(stream, bg, width, height, pointsize,
standalone, file, always_valid);
if (dev == NULL)
cpp11::stop("Failed to start SVG device");
pGEDevDesc dd = GEcreateDevDesc(dev);
GEaddDevice2(dd, "devSVG_vdiffr");
GEinitDisplayList(dd);
} END_SUSPEND_INTERRUPTS;
}
[[cpp11::register]]
bool svglite_(std::string file, std::string bg, double width, double height,
double pointsize, bool standalone, bool always_valid) {
SvgStreamPtr stream(new SvgStreamFile(file, 1, always_valid));
makeDevice(stream, bg, width, height, pointsize, standalone, file, always_valid);
return true;
}
[[cpp11::register]]
cpp11::external_pointer svgstring_(cpp11::environment env, std::string bg,
double width, double height, double pointsize,
bool standalone) {
SvgStreamPtr stream(new SvgStreamString(env));
makeDevice(stream, bg, width, height, pointsize, standalone, "", true);
SvgStreamString* strstream = static_cast(stream.get());
return {strstream->string_src(), false};
}
[[cpp11::register]]
std::string get_svg_content(cpp11::external_pointer p) {
p->flush();
std::string svgstr = p->str();
// If the current SVG is empty, we also make the string empty
// Otherwise append "" to make it a valid SVG
if(!svgstr.empty()) {
svgstr.append("\n");
}
return svgstr;
}
vdiffr/src/glyph_dims.h 0000644 0001762 0000144 00000676426 14057630265 014666 0 ustar ligges users // Generated by inst/create_glyph_dims.R — Do not edit by hand
#pragma once
#include
struct Dim {
double width;
double ascent;
double descent;
};
const std::unordered_map LIBERATION_DIM = {
{1, {9.0000, 8.2584, -0.0000}},
{32, {3.3336, 0.0000, -0.0000}},
{33, {3.3336, 8.2584, -0.0000}},
{34, {4.2624, 8.2584, -5.6592}},
{35, {6.6744, 8.2080, -0.0000}},
{36, {6.6744, 8.8848, 0.8352}},
{37, {10.6704, 8.3304, 0.0720}},
{38, {8.0064, 8.3016, 0.1152}},
{39, {2.2896, 8.2584, -5.6592}},
{40, {3.9960, 8.6976, 2.4840}},
{41, {3.9960, 8.6976, 2.4840}},
{42, {4.6728, 8.2584, -4.0464}},
{43, {7.0128, 6.9336, -1.0512}},
{44, {3.3336, 1.2816, 1.5408}},
{45, {3.9960, 3.6576, -2.7144}},
{46, {3.3336, 1.2816, -0.0000}},
{47, {3.3336, 8.6976, 0.1152}},
{48, {6.6744, 8.3808, 0.1152}},
{49, {6.6744, 8.2584, -0.0000}},
{50, {6.6744, 8.3808, -0.0000}},
{51, {6.6744, 8.3808, 0.1152}},
{52, {6.6744, 8.2584, -0.0000}},
{53, {6.6744, 8.2584, 0.1152}},
{54, {6.6744, 8.3808, 0.1152}},
{55, {6.6744, 8.2584, -0.0000}},
{56, {6.6744, 8.3808, 0.1152}},
{57, {6.6744, 8.3808, 0.1152}},
{58, {3.3336, 6.3432, -0.0000}},
{59, {3.3336, 6.3432, 1.5408}},
{60, {7.0128, 6.9984, -0.9000}},
{61, {7.0128, 5.8824, -2.0088}},
{62, {7.0128, 6.9984, -0.9000}},
{63, {6.6744, 8.3808, -0.0000}},
{64, {12.1824, 8.6976, 1.6560}},
{65, {8.0064, 8.2584, -0.0000}},
{66, {8.0064, 8.2584, -0.0000}},
{67, {8.6688, 8.3808, 0.1152}},
{68, {8.6688, 8.2584, -0.0000}},
{69, {8.0064, 8.2584, -0.0000}},
{70, {7.3296, 8.2584, -0.0000}},
{71, {9.3384, 8.3808, 0.1152}},
{72, {8.6688, 8.2584, -0.0000}},
{73, {3.3336, 8.2584, -0.0000}},
{74, {6.0048, 8.2584, 0.1152}},
{75, {8.0064, 8.2584, -0.0000}},
{76, {6.6744, 8.2584, -0.0000}},
{77, {10.0008, 8.2584, -0.0000}},
{78, {8.6688, 8.2584, -0.0000}},
{79, {9.3384, 8.3808, 0.1152}},
{80, {8.0064, 8.2584, -0.0000}},
{81, {9.3384, 8.3808, 2.2680}},
{82, {8.6688, 8.2584, -0.0000}},
{83, {8.0064, 8.3808, 0.1152}},
{84, {7.3296, 8.2584, -0.0000}},
{85, {8.6688, 8.2584, 0.1152}},
{86, {8.0064, 8.2584, -0.0000}},
{87, {11.3256, 8.2584, -0.0000}},
{88, {8.0064, 8.2584, -0.0000}},
{89, {8.0064, 8.2584, -0.0000}},
{90, {7.3296, 8.2584, -0.0000}},
{91, {3.3336, 8.6976, 2.4912}},
{92, {3.3336, 8.6976, 0.1152}},
{93, {3.3336, 8.6976, 2.4912}},
{94, {5.6304, 8.2584, -3.9456}},
{95, {6.6744, -1.6200, 2.3832}},
{96, {3.9960, 8.8416, -7.0416}},
{97, {6.6744, 6.4584, 0.1152}},
{98, {6.6744, 8.6976, 0.1152}},
{99, {6.0048, 6.4584, 0.1152}},
{100, {6.6744, 8.6976, 0.1152}},
{101, {6.6744, 6.4584, 0.1152}},
{102, {3.3336, 8.6832, -0.0000}},
{103, {6.6744, 6.4440, 2.4912}},
{104, {6.6744, 8.6976, -0.0000}},
{105, {2.6640, 8.6976, -0.0000}},
{106, {2.6640, 8.6976, 2.4912}},
{107, {6.0048, 8.6976, -0.0000}},
{108, {2.6640, 8.6976, -0.0000}},
{109, {10.0008, 6.4584, -0.0000}},
{110, {6.6744, 6.4584, -0.0000}},
{111, {6.6744, 6.4584, 0.1152}},
{112, {6.6744, 6.4512, 2.4912}},
{113, {6.6744, 6.4584, 2.4912}},
{114, {3.9960, 6.4584, -0.0000}},
{115, {6.0048, 6.4440, 0.1152}},
{116, {3.3336, 7.7616, 0.0936}},
{117, {6.6744, 6.3432, 0.1152}},
{118, {6.0048, 6.3432, -0.0000}},
{119, {8.6688, 6.3432, -0.0000}},
{120, {6.0048, 6.3432, -0.0000}},
{121, {6.0048, 6.3432, 2.4912}},
{122, {6.0048, 6.3432, -0.0000}},
{123, {4.0104, 8.6976, 2.4912}},
{124, {3.1176, 8.6976, 2.5416}},
{125, {4.0104, 8.6976, 2.4912}},
{126, {7.0128, 4.7304, -3.2400}},
{160, {3.3336, 0.0000, -0.0000}},
{161, {3.9960, 6.3432, 1.9152}},
{162, {6.6744, 8.2584, 0.1800}},
{163, {6.6744, 8.3808, -0.0000}},
{164, {6.6744, 6.6816, -1.3176}},
{165, {6.6744, 8.2584, -0.0000}},
{166, {3.1176, 8.6976, 2.5416}},
{167, {6.6744, 8.6976, 1.0080}},
{168, {3.9960, 8.2224, -7.1424}},
{169, {8.8416, 8.3808, 0.0936}},
{170, {4.4424, 8.3952, -3.8160}},
{171, {6.6744, 5.5080, -0.8280}},
{172, {7.0128, 4.4208, -1.0584}},
{173, {3.9960, 3.6576, -2.7144}},
{174, {8.8416, 8.3808, 0.0936}},
{175, {6.6312, 9.0648, -8.5104}},
{176, {4.8024, 8.3808, -5.0400}},
{177, {6.5880, 7.1496, -0.0000}},
{178, {3.9960, 8.3304, -3.2976}},
{179, {3.9960, 8.3304, -3.2328}},
{180, {3.9960, 8.8416, -7.0416}},
{181, {6.9120, 6.3432, 2.4912}},
{182, {6.4440, 8.2584, 1.5480}},
{183, {3.9960, 3.9024, -2.6064}},
{184, {3.9960, 0.0000, 2.5416}},
{185, {3.9960, 8.2584, -3.2976}},
{186, {4.3848, 8.3952, -3.8160}},
{187, {6.6744, 5.5080, -0.8280}},
{188, {10.0080, 8.2584, -0.0000}},
{189, {10.0080, 8.2584, -0.0000}},
{190, {10.0080, 8.3304, -0.0000}},
{191, {7.3296, 6.3432, 2.0376}},
{192, {8.0064, 10.4040, -0.0000}},
{193, {8.0064, 10.4040, -0.0000}},
{194, {8.0064, 10.4904, -0.0000}},
{195, {8.0064, 10.5336, -0.0000}},
{196, {8.0064, 10.0440, -0.0000}},
{197, {8.0064, 10.4760, -0.0000}},
{198, {12.0024, 8.2584, -0.0000}},
{199, {8.6688, 8.3808, 2.5416}},
{200, {8.0064, 10.4040, -0.0000}},
{201, {8.0064, 10.4040, -0.0000}},
{202, {8.0064, 10.4904, -0.0000}},
{203, {8.0064, 10.0440, -0.0000}},
{204, {3.3336, 10.4040, -0.0000}},
{205, {3.3336, 10.4040, -0.0000}},
{206, {3.3336, 10.4904, -0.0000}},
{207, {3.3336, 10.0440, -0.0000}},
{208, {8.6688, 8.2584, -0.0000}},
{209, {8.6688, 10.5336, -0.0000}},
{210, {9.3384, 10.4040, 0.1152}},
{211, {9.3384, 10.4040, 0.1152}},
{212, {9.3384, 10.4904, 0.1152}},
{213, {9.3384, 10.5336, 0.1152}},
{214, {9.3384, 10.0440, 0.1152}},
{215, {7.0128, 6.6744, -1.3104}},
{216, {9.3384, 8.5968, 0.3096}},
{217, {8.6688, 10.4040, 0.1152}},
{218, {8.6688, 10.4040, 0.1152}},
{219, {8.6688, 10.4904, 0.1152}},
{220, {8.6688, 10.0440, 0.1152}},
{221, {8.0064, 10.4040, -0.0000}},
{222, {8.0064, 8.2584, -0.0000}},
{223, {7.3296, 8.6976, 0.1152}},
{224, {6.6744, 8.8416, 0.1152}},
{225, {6.6744, 8.8416, 0.1152}},
{226, {6.6744, 8.7408, 0.1152}},
{227, {6.6744, 8.6112, 0.1152}},
{228, {6.6744, 8.2224, 0.1152}},
{229, {6.6744, 9.6768, 0.1152}},
{230, {10.6704, 6.4584, 0.1152}},
{231, {6.0048, 6.4584, 2.5416}},
{232, {6.6744, 8.8416, 0.1152}},
{233, {6.6744, 8.8416, 0.1152}},
{234, {6.6744, 8.7408, 0.1152}},
{235, {6.6744, 8.2224, 0.1152}},
{236, {3.3336, 8.8416, -0.0000}},
{237, {3.3336, 8.8416, -0.0000}},
{238, {3.3336, 8.7408, -0.0000}},
{239, {3.3336, 8.2224, -0.0000}},
{240, {6.6744, 8.8704, 0.1152}},
{241, {6.6744, 8.6112, -0.0000}},
{242, {6.6744, 8.8416, 0.1152}},
{243, {6.6744, 8.8416, 0.1152}},
{244, {6.6744, 8.7408, 0.1152}},
{245, {6.6744, 8.6112, 0.1152}},
{246, {6.6744, 8.2224, 0.1152}},
{247, {6.5880, 6.6888, -1.3104}},
{248, {7.3296, 6.5448, 0.2232}},
{249, {6.6744, 8.8416, 0.1152}},
{250, {6.6744, 8.8416, 0.1152}},
{251, {6.6744, 8.7408, 0.1152}},
{252, {6.6744, 8.2224, 0.1152}},
{253, {6.0048, 8.8416, 2.4912}},
{254, {6.6744, 8.6976, 2.4912}},
{255, {6.0048, 8.2224, 2.4912}},
{256, {8.0064, 9.9216, -0.0000}},
{257, {6.6744, 7.9920, 0.1152}},
{258, {8.0064, 10.4256, -0.0000}},
{259, {6.6744, 8.8560, 0.1152}},
{260, {8.0064, 8.2584, 2.4408}},
{261, {6.6744, 6.4584, 2.5056}},
{262, {8.6688, 10.4040, 0.1152}},
{263, {6.0048, 8.8416, 0.1152}},
{264, {8.6688, 10.4904, 0.1152}},
{265, {6.0048, 8.7408, 0.1152}},
{266, {8.6688, 10.4112, 0.1152}},
{267, {6.0048, 8.6976, 0.1152}},
{268, {8.6688, 10.4904, 0.1152}},
{269, {6.0048, 8.7408, 0.1152}},
{270, {8.6688, 10.4904, -0.0000}},
{271, {7.3800, 8.6976, 0.1152}},
{272, {8.6688, 8.2584, -0.0000}},
{273, {6.6744, 8.6976, 0.1152}},
{274, {8.0064, 9.9216, -0.0000}},
{275, {6.6744, 7.9920, 0.1152}},
{276, {8.0064, 10.4256, -0.0000}},
{277, {6.6744, 8.8560, 0.1152}},
{278, {8.0064, 10.4112, -0.0000}},
{279, {6.6744, 8.6976, 0.1152}},
{280, {8.0064, 8.2584, 2.5056}},
{281, {6.6744, 6.4584, 2.5056}},
{282, {8.0064, 10.4904, -0.0000}},
{283, {6.6744, 8.7408, 0.1152}},
{284, {9.3384, 10.4904, 0.1152}},
{285, {6.6744, 8.7408, 2.4912}},
{286, {9.3384, 10.4256, 0.1152}},
{287, {6.6744, 8.8560, 2.4912}},
{288, {9.3384, 10.4112, 0.1152}},
{289, {6.6744, 8.6976, 2.4912}},
{290, {9.3384, 8.3808, 2.5416}},
{291, {6.6744, 9.1944, 2.4912}},
{292, {8.6688, 10.4904, -0.0000}},
{293, {6.6744, 10.8648, -0.0000}},
{294, {8.6688, 8.2584, -0.0000}},
{295, {6.6744, 8.6976, -0.0000}},
{296, {3.3336, 10.5336, -0.0000}},
{297, {3.3336, 8.6112, -0.0000}},
{298, {3.3336, 9.9216, -0.0000}},
{299, {3.3336, 7.9920, -0.0000}},
{300, {3.3336, 10.4256, -0.0000}},
{301, {3.3336, 8.8560, -0.0000}},
{302, {3.3336, 8.2584, 2.5056}},
{303, {2.6640, 8.6976, 2.5056}},
{304, {3.3336, 10.4112, -0.0000}},
{305, {3.3336, 6.3432, -0.0000}},
{306, {8.8200, 8.2584, 0.1152}},
{307, {5.3280, 8.6976, 2.4912}},
{308, {6.0048, 10.4904, 0.1152}},
{309, {2.6640, 8.7408, 2.4912}},
{310, {8.0064, 8.2584, 2.5416}},
{311, {6.0048, 8.6976, 2.5416}},
{312, {6.0048, 6.3432, -0.0000}},
{313, {6.6744, 10.4040, -0.0000}},
{314, {2.6640, 10.8576, -0.0000}},
{315, {6.6744, 8.2584, 2.5416}},
{316, {2.6640, 8.6976, 2.5416}},
{317, {6.6744, 8.2584, -0.0000}},
{318, {3.4992, 8.6976, -0.0000}},
{319, {6.6744, 8.2584, -0.0000}},
{320, {4.0104, 8.6976, -0.0000}},
{321, {6.6744, 8.2584, -0.0000}},
{322, {2.6640, 8.6976, -0.0000}},
{323, {8.6688, 10.4040, -0.0000}},
{324, {6.6744, 8.8416, -0.0000}},
{325, {8.6688, 8.2584, 2.5416}},
{326, {6.6744, 6.4584, 2.5416}},
{327, {8.6688, 10.4904, -0.0000}},
{328, {6.6744, 8.7408, -0.0000}},
{329, {7.2504, 8.2584, -0.0000}},
{330, {8.6760, 8.3736, 0.1152}},
{331, {6.6744, 6.4584, 2.4912}},
{332, {9.3384, 9.9216, 0.1152}},
{333, {6.6744, 7.9920, 0.1152}},
{334, {9.3384, 10.4256, 0.1152}},
{335, {6.6744, 8.8560, 0.1152}},
{336, {9.3384, 10.4112, 0.1152}},
{337, {6.6744, 8.8416, 0.1152}},
{338, {12.0024, 8.3232, 0.0576}},
{339, {11.3256, 6.4584, 0.1152}},
{340, {8.6688, 10.4040, -0.0000}},
{341, {3.9960, 8.8416, -0.0000}},
{342, {8.6688, 8.2584, 2.5416}},
{343, {3.9960, 6.4584, 2.5416}},
{344, {8.6688, 10.4904, -0.0000}},
{345, {3.9960, 8.7408, -0.0000}},
{346, {8.0064, 10.7712, 0.1152}},
{347, {6.0048, 8.8416, 0.1152}},
{348, {8.0064, 10.4904, 0.1152}},
{349, {6.0048, 8.7408, 0.1152}},
{350, {8.0064, 8.3808, 2.5416}},
{351, {6.0048, 6.4440, 2.5416}},
{352, {8.0064, 10.4904, 0.1152}},
{353, {6.0048, 8.7408, 0.1152}},
{354, {7.3296, 8.2584, 2.5416}},
{355, {3.3336, 7.7616, 2.5416}},
{356, {7.3296, 10.4904, -0.0000}},
{357, {4.5000, 8.6976, 0.0936}},
{358, {7.3296, 8.2584, -0.0000}},
{359, {3.3336, 7.7616, 0.0936}},
{360, {8.6688, 10.5336, 0.1152}},
{361, {6.6744, 8.6112, 0.1152}},
{362, {8.6688, 9.9216, 0.1152}},
{363, {6.6744, 7.9920, 0.1152}},
{364, {8.6688, 10.4256, 0.1152}},
{365, {6.6744, 8.8560, 0.1152}},
{366, {8.6688, 10.8648, 0.1152}},
{367, {6.6744, 9.6768, 0.1152}},
{368, {8.6688, 10.4112, 0.1152}},
{369, {6.6744, 8.8416, 0.1152}},
{370, {8.6688, 8.2584, 2.5056}},
{371, {6.6744, 6.3432, 2.5056}},
{372, {11.3256, 10.4904, -0.0000}},
{373, {8.6688, 8.7408, -0.0000}},
{374, {8.0064, 10.4904, -0.0000}},
{375, {6.0048, 8.7408, 2.4912}},
{376, {8.0064, 10.0440, -0.0000}},
{377, {7.3296, 10.4040, -0.0000}},
{378, {6.0048, 8.8416, -0.0000}},
{379, {7.3296, 10.4112, -0.0000}},
{380, {6.0048, 8.6976, -0.0000}},
{381, {7.3296, 10.4904, -0.0000}},
{382, {6.0048, 8.7408, -0.0000}},
{383, {2.6640, 8.6832, -0.0000}},
{384, {6.6744, 8.6976, 0.1152}},
{385, {9.1008, 8.2584, -0.0000}},
{386, {7.8768, 8.2584, -0.0000}},
{387, {6.6744, 8.6976, 0.1152}},
{388, {7.8768, 8.2584, -0.0000}},
{389, {6.6744, 8.6976, 0.1152}},
{390, {8.6688, 8.3808, 0.1152}},
{391, {8.6688, 9.4680, 0.1152}},
{392, {6.0048, 7.5168, 0.1152}},
{393, {8.6688, 8.2584, -0.0000}},
{394, {9.7200, 8.2584, -0.0000}},
{395, {7.8768, 8.2584, -0.0000}},
{396, {6.6744, 8.6976, 0.1152}},
{397, {6.6816, 6.4584, 2.4912}},
{398, {8.0064, 8.2584, -0.0000}},
{399, {9.0288, 8.3808, 0.1152}},
{400, {7.2504, 8.3736, 0.1152}},
{401, {7.3296, 8.2584, 2.4912}},
{402, {6.6744, 8.5248, 2.5416}},
{403, {9.3384, 9.5688, 0.1152}},
{404, {7.4880, 8.2584, 2.4912}},
{405, {10.5696, 8.6976, 0.1152}},
{406, {2.6640, 8.6976, -0.0000}},
{407, {3.3336, 8.6976, -0.0000}},
{408, {8.0064, 8.3520, -0.0000}},
{409, {6.0048, 8.7768, -0.0000}},
{410, {2.6640, 8.6976, -0.0000}},
{411, {6.0048, 8.6976, -0.0000}},
{412, {10.6920, 8.2584, 0.1152}},
{413, {8.6688, 8.2584, 2.4912}},
{414, {6.6744, 6.4584, 2.4984}},
{415, {9.3384, 8.3808, 0.1152}},
{416, {10.2888, 8.3808, 0.1152}},
{417, {7.8696, 6.4584, 0.1152}},
{418, {10.4184, 8.3808, 2.4840}},
{419, {8.0136, 6.4584, 2.4912}},
{420, {9.0576, 8.2584, -0.0000}},
{421, {6.6744, 8.7768, 2.4912}},
{422, {8.0064, 8.2584, 1.8720}},
{423, {8.0064, 8.3808, 0.1152}},
{424, {6.0048, 6.4440, 0.1152}},
{425, {7.4160, 8.2584, -0.0000}},
{426, {4.5648, 8.7480, 2.4912}},
{427, {3.3336, 7.7616, 2.4912}},
{428, {7.3296, 8.2584, -0.0000}},
{429, {3.3336, 8.7768, 0.0936}},
{430, {7.3296, 8.2584, 2.4912}},
{431, {10.2528, 8.2584, 0.1152}},
{432, {8.0352, 6.3432, 0.1152}},
{433, {8.9712, 8.2584, 0.1224}},
{434, {8.6688, 8.3304, 0.1152}},
{435, {9.2736, 8.3304, -0.0000}},
{436, {6.0048, 8.7408, 2.4912}},
{437, {7.3296, 8.2584, -0.0000}},
{438, {6.0048, 6.3432, -0.0000}},
{439, {7.3296, 8.2584, 2.4984}},
{440, {7.3296, 8.2584, 2.4984}},
{441, {6.5376, 6.3504, 2.5056}},
{442, {6.5376, 6.3432, 2.4984}},
{443, {6.6744, 8.3808, -0.0000}},
{444, {6.6744, 8.2584, 0.1152}},
{445, {5.5008, 6.3432, 0.1152}},
{446, {5.8464, 8.8344, 0.1152}},
{447, {6.6744, 6.4512, 2.5056}},
{448, {3.1176, 8.6976, -0.0000}},
{449, {4.9608, 8.6976, -0.0000}},
{450, {7.0128, 8.6976, -0.0000}},
{451, {3.3336, 8.2584, -0.0000}},
{452, {15.9984, 10.8288, -0.0000}},
{453, {14.6664, 8.7408, -0.0000}},
{454, {12.5856, 8.7408, 0.1152}},
{455, {12.7440, 8.2584, 0.1152}},
{456, {10.0008, 8.6976, 2.4912}},
{457, {5.4144, 8.6976, 2.4912}},
{458, {14.6664, 8.2584, 0.1152}},
{459, {11.3328, 8.6976, 2.4912}},
{460, {9.2520, 8.6976, 2.4912}},
{461, {8.0064, 10.4904, -0.0000}},
{462, {6.6744, 8.7408, 0.1152}},
{463, {3.3336, 10.4904, -0.0000}},
{464, {2.6640, 8.7408, -0.0000}},
{465, {9.3384, 10.4904, 0.1152}},
{466, {6.6744, 8.7408, 0.1152}},
{467, {8.6688, 10.4904, 0.1152}},
{468, {6.6744, 8.7408, 0.1152}},
{469, {8.6688, 10.7568, 0.1152}},
{470, {6.6744, 9.6264, 0.1152}},
{471, {8.6688, 10.7568, 0.1152}},
{472, {6.6744, 10.4832, 0.1152}},
{473, {8.6688, 10.7568, 0.1152}},
{474, {6.6744, 10.3824, 0.1152}},
{475, {8.6688, 10.7568, 0.1152}},
{476, {6.6744, 10.4832, 0.1152}},
{477, {6.6744, 6.4584, 0.1152}},
{478, {8.0064, 10.7568, -0.0000}},
{479, {6.6744, 9.6264, 0.1152}},
{480, {8.0064, 10.7568, -0.0000}},
{481, {6.6744, 9.6264, 0.1152}},
{482, {12.0024, 9.9216, -0.0000}},
{483, {10.6704, 7.9920, 0.1152}},
{484, {9.3384, 8.3808, 0.1152}},
{485, {6.6744, 6.4440, 2.4912}},
{486, {9.3384, 10.4904, 0.1152}},
{487, {6.6744, 8.7408, 2.4912}},
{488, {8.0064, 10.4904, -0.0000}},
{489, {6.0048, 10.6056, -0.0000}},
{490, {9.3384, 8.3808, 2.5056}},
{491, {6.6744, 6.4584, 2.5056}},
{492, {9.3384, 9.9216, 2.5056}},
{493, {6.6744, 7.9920, 2.5056}},
{494, {7.3296, 10.4904, 2.4984}},
{495, {6.5376, 8.7408, 2.4912}},
{496, {2.6640, 8.7408, 2.4912}},
{497, {15.9984, 8.2584, -0.0000}},
{498, {14.6664, 8.2584, -0.0000}},
{499, {12.5856, 8.6976, 0.1152}},
{500, {9.3384, 10.4040, 0.1152}},
{501, {6.6744, 8.8416, 2.4912}},
{502, {12.4128, 8.2584, 0.1152}},
{503, {7.4160, 8.3808, 2.4912}},
{504, {8.6688, 10.4040, -0.0000}},
{505, {6.6744, 8.8416, -0.0000}},
{506, {8.0064, 10.8648, -0.0000}},
{507, {6.6744, 10.8720, 0.1152}},
{508, {12.0024, 10.4040, -0.0000}},
{509, {10.6704, 8.8416, 0.1152}},
{510, {9.3384, 10.4040, 0.3096}},
{511, {7.3296, 8.8416, 0.2232}},
{512, {8.0064, 10.9656, -0.0000}},
{513, {6.6744, 8.8416, 0.1152}},
{514, {8.0064, 10.7208, -0.0000}},
{515, {6.6744, 8.5968, 0.1152}},
{516, {8.0064, 10.9656, -0.0000}},
{517, {6.6744, 8.8416, 0.1152}},
{518, {8.0064, 10.7208, -0.0000}},
{519, {6.6744, 8.5968, 0.1152}},
{520, {3.3336, 10.9656, -0.0000}},
{521, {3.3336, 8.8416, -0.0000}},
{522, {3.3336, 10.7208, -0.0000}},
{523, {3.3336, 8.5968, -0.0000}},
{524, {9.3384, 10.9656, 0.1152}},
{525, {6.6744, 8.8416, 0.1152}},
{526, {9.3384, 10.7208, 0.1152}},
{527, {6.6744, 8.5968, 0.1152}},
{528, {8.6688, 10.9656, -0.0000}},
{529, {3.9960, 8.8416, -0.0000}},
{530, {8.6688, 10.7208, -0.0000}},
{531, {3.9960, 8.5968, -0.0000}},
{532, {8.6688, 10.9656, 0.1152}},
{533, {6.6744, 8.8416, 0.1152}},
{534, {8.6688, 10.7208, 0.1152}},
{535, {6.6744, 8.5968, 0.1152}},
{536, {8.0064, 8.3808, 2.5416}},
{537, {6.0048, 6.4440, 2.5416}},
{538, {7.3296, 8.2584, 2.5416}},
{539, {3.3336, 7.7616, 2.5416}},
{540, {6.5376, 8.3880, 2.5056}},
{541, {5.2416, 6.4584, 2.4984}},
{542, {8.6688, 10.4904, -0.0000}},
{543, {6.6744, 10.6056, -0.0000}},
{544, {8.4744, 8.3736, 2.4912}},
{545, {8.1792, 8.6976, 2.4984}},
{546, {7.2576, 8.3808, 0.1152}},
{547, {6.7896, 8.7336, 0.1152}},
{548, {7.3296, 8.2584, 1.4976}},
{549, {6.0048, 6.3432, 1.4328}},
{550, {8.0064, 10.4112, -0.0000}},
{551, {6.6744, 8.6976, 0.1152}},
{552, {8.0064, 8.2584, 2.5416}},
{553, {6.6744, 6.4584, 2.5416}},
{554, {9.3384, 10.7568, 0.1152}},
{555, {6.6744, 9.6264, 0.1152}},
{556, {9.3384, 10.7568, 0.1152}},
{557, {6.6744, 9.9216, 0.1152}},
{558, {9.3384, 10.4112, 0.1152}},
{559, {6.6744, 8.6976, 0.1152}},
{560, {9.3384, 10.7568, 0.1152}},
{561, {6.6744, 9.6264, 0.1152}},
{562, {8.0064, 9.9216, -0.0000}},
{563, {6.0048, 7.9920, 2.4912}},
{564, {4.1904, 8.6976, 2.4984}},
{565, {8.2152, 6.4584, 2.4984}},
{566, {4.4064, 7.7616, 0.1224}},
{567, {2.6640, 6.3432, 2.4912}},
{568, {10.6416, 8.6976, 0.1152}},
{569, {10.6416, 6.4440, 2.4912}},
{570, {8.0064, 8.8704, 0.6264}},
{571, {8.6688, 8.8704, 0.6264}},
{572, {6.0048, 8.6976, 2.4912}},
{573, {6.6744, 8.2584, -0.0000}},
{574, {7.3296, 8.8704, 0.6264}},
{575, {6.0048, 6.4440, 2.4912}},
{576, {6.0048, 6.3432, 2.4984}},
{577, {6.9696, 8.3808, -0.0000}},
{578, {5.4360, 6.4584, -0.0000}},
{579, {8.0064, 8.2584, -0.0000}},
{580, {8.6688, 8.2584, 0.1152}},
{581, {8.0208, 8.2584, -0.0000}},
{582, {8.0064, 9.1080, 1.3104}},
{583, {6.6744, 8.6976, 2.4840}},
{584, {6.0048, 8.2584, 0.1152}},
{585, {2.6640, 8.6976, 2.4912}},
{586, {8.8488, 8.3808, 2.4912}},
{587, {6.6744, 6.4584, 2.4912}},
{588, {8.6688, 8.2584, -0.0000}},
{589, {3.9960, 6.4584, -0.0000}},
{590, {8.0064, 8.2584, -0.0000}},
{591, {6.0048, 6.3432, 2.4912}},
{592, {6.6744, 6.4584, 0.1152}},
{593, {6.6744, 6.4584, 0.1152}},
{594, {6.6744, 6.4584, 0.1152}},
{595, {6.6744, 8.7768, 0.1152}},
{596, {6.0048, 6.4584, 0.1152}},
{597, {6.0048, 6.4584, 0.5400}},
{598, {6.6744, 8.6976, 2.4912}},
{599, {6.6744, 8.7768, 0.1152}},
{600, {6.6744, 6.4584, 0.1152}},
{601, {6.6744, 6.4584, 0.1152}},
{602, {8.8704, 6.4584, 0.1152}},
{603, {5.5008, 6.4584, 0.1080}},
{604, {5.5008, 6.4584, 0.1080}},
{605, {7.5744, 6.4584, 0.1080}},
{606, {6.0912, 6.4584, 0.1080}},
{607, {3.3336, 6.3432, 2.4984}},
{608, {6.6744, 8.7768, 2.4912}},
{609, {6.6744, 6.4440, 2.4912}},
{610, {6.7032, 6.4584, 0.1152}},
{611, {6.0120, 6.3432, 2.4912}},
{612, {7.4016, 6.3792, 0.1440}},
{613, {6.6744, 6.3504, 2.3472}},
{614, {6.6744, 8.7768, -0.0000}},
{615, {6.6744, 8.7768, 2.4912}},
{616, {2.6640, 8.6976, -0.0000}},
{617, {2.6640, 6.3432, 0.1008}},
{618, {4.2696, 6.3432, -0.0000}},
{619, {3.9240, 8.6976, -0.0000}},
{620, {3.6432, 8.5896, -0.0000}},
{621, {2.6640, 8.6976, 2.4912}},
{622, {6.8616, 8.6976, 2.4912}},
{623, {10.0008, 6.3432, 0.1152}},
{624, {10.0008, 6.3432, 2.4912}},
{625, {10.0008, 6.4584, 2.4912}},
{626, {6.6744, 6.4584, 2.4912}},
{627, {6.6744, 6.4584, 2.4912}},
{628, {6.6312, 6.3432, -0.0000}},
{629, {6.6744, 6.4584, 0.1152}},
{630, {9.4896, 6.4584, 0.1152}},
{631, {9.3744, 6.4584, 0.1152}},
{632, {6.6024, 8.6976, 2.4912}},
{633, {3.9960, 6.3432, 0.1152}},
{634, {3.9960, 8.6904, 0.1152}},
{635, {3.9960, 6.3432, 2.4912}},
{636, {3.9960, 6.4584, 2.4912}},
{637, {3.9960, 6.4584, 2.4912}},
{638, {3.9960, 6.4584, -0.0000}},
{639, {3.9960, 6.4584, 2.4912}},
{640, {6.5016, 6.3432, -0.0000}},
{641, {6.5016, 6.3432, -0.0000}},
{642, {6.0048, 6.4440, 2.4912}},
{643, {2.6640, 8.6976, 2.4912}},
{644, {3.1176, 8.6976, 2.4912}},
{645, {2.6640, 6.4584, 2.4912}},
{646, {4.1904, 8.6976, 2.4984}},
{647, {3.3336, 8.3736, 0.0072}},
{648, {3.3336, 7.7616, 2.4912}},
{649, {6.6744, 6.3432, 0.1152}},
{650, {6.8184, 6.3432, 0.1152}},
{651, {6.5664, 6.3432, 0.1152}},
{652, {6.0048, 6.3432, -0.0000}},
{653, {8.6688, 6.3432, -0.0000}},
{654, {6.0048, 8.8344, -0.0000}},
{655, {6.2352, 6.3432, -0.0000}},
{656, {6.0048, 6.3432, 2.4912}},
{657, {6.4944, 6.3432, 1.0440}},
{658, {6.5376, 6.3432, 2.4912}},
{659, {6.5376, 6.3504, 2.4984}},
{660, {6.0048, 8.6976, -0.0000}},
{661, {6.0048, 8.6976, -0.0000}},
{662, {6.0048, 8.6976, 0.1152}},
{663, {6.0048, 6.4584, 2.4984}},
{664, {9.3384, 8.3808, 0.1152}},
{665, {6.3792, 6.3432, -0.0000}},
{666, {6.0912, 6.4584, 0.1080}},
{667, {6.7032, 7.5168, 0.1152}},
{668, {6.6312, 6.3432, -0.0000}},
{669, {4.7736, 8.6976, 2.4912}},
{670, {6.0048, 6.3432, 2.3544}},
{671, {4.8456, 6.3432, -0.0000}},
{672, {6.6744, 8.7768, 2.4912}},
{673, {6.0048, 8.6976, -0.0000}},
{674, {6.0048, 8.6976, -0.0000}},
{675, {11.5776, 8.6976, 0.1152}},
{676, {10.8792, 8.6976, 2.4912}},
{677, {12.0672, 8.6976, 1.0440}},
{678, {8.5536, 7.7616, -0.0000}},
{679, {5.1480, 8.6976, 2.4912}},
{680, {8.6256, 7.7616, 0.1152}},
{681, {9.1656, 8.6832, 2.4912}},
{682, {7.9344, 8.6976, 0.1152}},
{683, {7.5888, 8.6976, -0.0000}},
{684, {5.8248, 8.6976, -0.0072}},
{685, {6.3288, 8.6976, -0.0000}},
{686, {8.2440, 6.4440, 2.4984}},
{687, {8.2440, 6.4440, 2.4912}},
{688, {4.6008, 9.0000, -2.8728}},
{689, {4.6008, 9.0576, -2.8728}},
{690, {1.9080, 9.0000, -1.1160}},
{691, {2.8800, 7.4232, -2.8728}},
{692, {2.8800, 7.3440, -2.7864}},
{693, {2.8800, 7.3440, -1.1088}},
{694, {4.3704, 7.3440, -2.8728}},
{695, {5.7744, 7.3440, -2.8800}},
{696, {3.8520, 7.3440, -1.1160}},
{697, {2.2896, 8.2584, -5.6592}},
{698, {4.2624, 8.2584, -5.6592}},
{699, {2.6640, 8.6976, -6.0192}},
{700, {2.6640, 8.6976, -6.0192}},
{701, {2.6640, 8.6976, -6.0192}},
{702, {3.9960, 8.9280, -6.7032}},
{703, {3.9960, 8.9280, -6.7032}},
{704, {4.1832, 8.6976, -2.8728}},
{705, {4.1832, 8.6976, -2.8728}},
{706, {7.0128, 6.9984, -0.9000}},
{707, {7.0128, 6.9984, -0.9000}},
{708, {7.0128, 7.0776, -1.3896}},
{709, {7.0128, 7.0776, -1.3896}},
{710, {3.9960, 8.7408, -7.0416}},
{711, {3.9960, 8.7408, -7.0416}},
{712, {3.9960, 8.6976, -6.7536}},
{713, {3.9960, 7.9920, -7.2432}},
{714, {3.9960, 8.6976, -7.0632}},
{715, {3.9960, 8.6976, -7.0632}},
{716, {3.9960, -0.4320, 2.3760}},
{717, {3.9960, -0.8712, 1.6128}},
{718, {3.9960, -0.7416, 2.3760}},
{719, {3.9960, -0.7416, 2.3760}},
{720, {3.3336, 6.3432, -0.0000}},
{721, {3.3336, 6.3432, -5.0832}},
{722, {3.9960, 2.7648, -0.5400}},
{723, {3.9960, 2.7648, -0.5400}},
{724, {3.9960, 2.9880, -1.0152}},
{725, {3.9960, 2.9880, -1.0152}},
{726, {3.9960, 3.0528, -0.9576}},
{727, {3.9960, 2.4408, -1.6128}},
{728, {3.9960, 8.8560, -7.0416}},
{729, {3.9960, 8.6976, -7.6896}},
{730, {3.9960, 9.6768, -6.8472}},
{731, {3.9960, 0.0000, 2.5056}},
{732, {3.9960, 8.6112, -7.0416}},
{733, {3.9960, 8.8416, -7.0416}},
{734, {3.9960, 4.5720, -2.0952}},
{735, {3.9960, 8.7264, -4.7664}},
{736, {3.8664, 7.3440, -1.1160}},
{737, {1.8864, 9.0000, -2.8728}},
{738, {4.0824, 7.4232, -2.8008}},
{739, {3.9384, 7.3440, -2.8728}},
{740, {4.1832, 8.6976, -2.8728}},
{741, {4.5936, 8.2584, -0.0000}},
{742, {4.5936, 8.2584, -0.0000}},
{743, {4.5936, 8.2584, -0.0000}},
{744, {4.5936, 8.2584, -0.0000}},
{745, {4.5936, 8.2584, -0.0000}},
{746, {3.9960, 5.1552, -0.0000}},
{747, {3.9960, 5.1552, -0.0000}},
{748, {3.9960, -0.7848, 2.4840}},
{749, {3.9960, 9.1728, -7.2648}},
{750, {3.9960, 8.6976, -6.0192}},
{751, {3.9960, -0.4248, 2.0736}},
{752, {3.9960, -0.4248, 2.0736}},
{753, {3.9960, -0.0360, 2.4984}},
{754, {3.9960, -0.0360, 2.4984}},
{755, {3.9960, -0.2592, 2.4912}},
{756, {3.9960, 3.3912, -1.5912}},
{757, {3.9960, 3.3912, -1.5912}},
{758, {3.9960, 3.3912, -1.5912}},
{759, {3.9960, -0.7992, 2.3688}},
{760, {3.3336, 8.6976, -2.3544}},
{761, {3.9960, 8.6976, -6.7248}},
{762, {3.9960, 8.6976, -6.7248}},
{763, {3.9960, -0.5184, 2.4912}},
{764, {3.9960, -0.5184, 2.4912}},
{765, {4.7736, -0.5184, 2.4912}},
{766, {4.7736, -0.5184, 2.4840}},
{767, {3.9960, 0.9144, 2.4912}},
{768, {0.0000, 10.7064, -9.0720}},
{769, {0.0000, 10.7064, -9.0720}},
{770, {0.0000, 8.7408, -7.0416}},
{771, {0.0000, 8.6112, -7.0416}},
{772, {0.0000, 7.9920, -7.2432}},
{773, {0.0000, 9.9720, -9.2088}},
{774, {0.0000, 8.5968, -7.0704}},
{775, {0.0000, 8.2584, -7.2504}},
{776, {0.0000, 8.2224, -7.1424}},
{777, {0.0000, 10.7496, -8.6760}},
{778, {0.0000, 9.5760, -7.3440}},
{779, {0.0000, 8.8416, -7.0416}},
{780, {0.0000, 8.7408, -7.0416}},
{781, {0.0000, 8.6976, -6.7536}},
{782, {0.0000, 8.6976, -6.7536}},
{783, {0.0000, 8.8416, -7.0416}},
{784, {0.0000, 9.5904, -7.0488}},
{785, {0.0000, 8.5968, -7.0704}},
{786, {0.0000, 8.6976, -5.8752}},
{787, {0.0000, 8.6976, -5.8752}},
{788, {0.0000, 8.6976, -5.8752}},
{789, {0.0000, 8.6976, -5.8752}},
{790, {0.0000, -0.7488, 2.3832}},
{791, {0.0000, -0.7416, 2.3760}},
{792, {0.0000, -0.4392, 2.4408}},
{793, {0.0000, -0.4392, 2.4408}},
{794, {0.0000, 9.7992, -7.1568}},
{795, {0.0000, 8.6976, -6.0192}},
{796, {0.0000, -0.2664, 2.4912}},
{797, {0.0000, -0.5184, 2.4912}},
{798, {0.0000, -0.5184, 2.4912}},
{799, {0.0000, -0.3960, 2.4912}},
{800, {0.0000, -0.9216, 1.7496}},
{801, {0.0000, 0.9072, 2.4912}},
{802, {0.0000, 0.9072, 2.4912}},
{803, {0.0000, -0.8136, 1.8216}},
{804, {0.0000, -1.4112, 2.4912}},
{805, {0.0000, -0.2592, 2.4912}},
{806, {0.0000, -0.5760, 2.6712}},
{807, {0.0000, 0.0000, 2.5992}},
{808, {0.0000, 0.0000, 2.5056}},
{809, {0.0000, -0.4392, 2.4912}},
{810, {0.0000, -0.5184, 2.4912}},
{811, {0.0000, -0.7704, 2.1600}},
{812, {0.0000, -0.9648, 2.4912}},
{813, {0.0000, -0.9648, 2.4912}},
{814, {0.0000, -0.8064, 2.3328}},
{815, {0.0000, -0.8064, 2.3328}},
{816, {0.0000, -0.9216, 2.4912}},
{817, {0.0000, -1.1520, 1.9008}},
{818, {0.0000, -1.6200, 2.3832}},
{819, {0.0000, -0.5832, 2.4912}},
{820, {0.0000, 2.9808, -1.4112}},
{821, {0.0000, 2.4480, -1.6056}},
{822, {0.0000, 2.3976, -1.6632}},
{823, {0.0000, 5.8320, 0.1656}},
{824, {0.0000, 8.8560, 0.2016}},
{825, {0.0000, -0.3240, 2.5488}},
{826, {0.0000, -0.5184, 2.4912}},
{827, {0.0000, -0.2880, 2.4912}},
{828, {0.0000, -0.7416, 2.1312}},
{829, {0.0000, 9.2160, -6.6672}},
{830, {0.0000, 9.7992, -6.6312}},
{831, {0.0000, 10.7856, -9.0720}},
{832, {0.0000, 8.6400, -6.9984}},
{833, {0.0000, 8.6400, -6.9984}},
{834, {0.0000, 8.6112, -7.0416}},
{835, {0.0000, 8.6976, -6.0192}},
{836, {0.0000, 8.8344, -7.2144}},
{837, {0.0000, -0.7416, 2.4912}},
{838, {0.0000, 9.2016, -7.2288}},
{839, {0.0000, -0.7632, 2.4912}},
{840, {0.0000, -0.4392, 2.4912}},
{841, {0.0000, -0.5184, 2.4912}},
{842, {0.0000, 8.9640, -6.6888}},
{843, {0.0000, 10.5120, -6.5736}},
{844, {0.0000, 10.0656, -7.1352}},
{845, {0.0000, -0.4104, 2.4984}},
{846, {0.0000, -0.2592, 2.4912}},
{847, {0.0000, 8.6976, -0.0000}},
{848, {0.0000, 9.1944, -6.7320}},
{849, {0.0000, 8.9280, -6.7032}},
{850, {0.0000, 9.7848, -7.2504}},
{851, {0.0000, -0.0648, 2.6136}},
{852, {0.0000, -0.0360, 2.4984}},
{853, {0.0000, -0.0360, 2.4984}},
{854, {0.0000, -0.0360, 2.4984}},
{855, {0.0000, 8.9280, -6.7032}},
{856, {0.0000, 8.0928, -6.9768}},
{857, {0.0000, -0.3600, 2.4984}},
{858, {0.0000, -0.3960, 2.4912}},
{859, {0.0000, 9.3096, -6.6024}},
{860, {0.0000, -0.3168, 2.4912}},
{861, {0.0000, 9.2952, -7.1208}},
{862, {0.0000, 8.4168, -7.6680}},
{863, {0.0000, -1.0008, 1.7496}},
{864, {0.0000, 9.0000, -7.1352}},
{865, {0.0000, 9.3168, -7.1424}},
{866, {0.0000, -0.4176, 2.4912}},
{867, {0.0000, 7.4232, -2.7864}},
{868, {0.0000, 7.4232, -2.7864}},
{869, {0.0000, 9.0000, -2.8728}},
{870, {0.0000, 7.4232, -2.7864}},
{871, {0.0000, 7.3440, -2.7864}},
{872, {0.0000, 7.4304, -2.7864}},
{873, {0.0000, 9.0000, -2.7864}},
{874, {0.0000, 9.0000, -2.8728}},
{875, {0.0000, 7.4232, -2.8728}},
{876, {0.0000, 7.4232, -2.8728}},
{877, {0.0000, 8.3376, -2.8080}},
{878, {0.0000, 7.3440, -2.8728}},
{879, {0.0000, 7.3440, -2.8728}},
{884, {3.9960, 8.6976, -7.0056}},
{885, {3.9960, -0.7992, 2.4912}},
{890, {3.9960, -0.7416, 2.4912}},
{891, {6.0048, 6.4584, 0.1152}},
{892, {6.0048, 6.4584, 0.1152}},
{893, {6.0048, 6.4584, 0.1152}},
{894, {3.3336, 6.3432, 1.5408}},
{900, {3.9960, 9.0432, -7.1352}},
{901, {3.9960, 9.3816, -7.0344}},
{902, {8.0136, 8.2728, -0.0000}},
{903, {3.3336, 3.9024, -2.6064}},
{904, {9.4104, 8.2728, -0.0000}},
{905, {10.0584, 8.2728, -0.0000}},
{906, {4.6080, 8.2728, -0.0000}},
{908, {9.2952, 8.3808, 0.1152}},
{910, {10.2672, 8.2728, -0.0000}},
{911, {9.0288, 8.3808, -0.0000}},
{912, {2.6640, 9.3816, -0.0000}},
{913, {8.0064, 8.2584, -0.0000}},
{914, {8.0064, 8.2584, -0.0000}},
{915, {6.6096, 8.2656, -0.0072}},
{916, {8.0208, 8.2584, -0.0000}},
{917, {8.0064, 8.2584, -0.0000}},
{918, {7.3296, 8.2584, -0.0000}},
{919, {8.6688, 8.2584, -0.0000}},
{920, {9.3384, 8.3808, 0.1152}},
{921, {3.3336, 8.2584, -0.0000}},
{922, {8.0064, 8.2584, -0.0000}},
{923, {8.0208, 8.2656, -0.0072}},
{924, {10.0008, 8.2584, -0.0000}},
{925, {8.6688, 8.2584, -0.0000}},
{926, {7.7976, 8.2584, -0.0000}},
{927, {9.3384, 8.3808, 0.1152}},
{928, {8.6688, 8.2584, -0.0000}},
{929, {8.0064, 8.2584, -0.0000}},
{931, {7.4160, 8.2584, -0.0000}},
{932, {7.3296, 8.2584, -0.0000}},
{933, {8.0064, 8.2584, -0.0000}},
{934, {9.5760, 8.3160, 0.0648}},
{935, {8.0064, 8.2584, -0.0000}},
{936, {10.0296, 8.2584, -0.0000}},
{937, {8.9712, 8.3808, -0.0000}},
{938, {3.3336, 10.0440, -0.0000}},
{939, {8.0064, 10.0440, -0.0000}},
{940, {6.9408, 9.0432, 0.1152}},
{941, {5.3496, 9.0432, 0.1152}},
{942, {6.6744, 9.0432, 2.4840}},
{943, {2.6640, 9.0432, -0.0000}},
{944, {6.5664, 9.3816, 0.1152}},
{945, {6.9408, 6.4584, 0.1152}},
{946, {6.9048, 8.6976, 2.4912}},
{947, {6.0048, 6.3432, 2.4840}},
{948, {6.6816, 8.6976, 0.1152}},
{949, {5.3496, 6.4584, 0.1152}},
{950, {5.2920, 8.6976, 2.0664}},
{951, {6.6744, 6.4584, 2.4840}},
{952, {6.6744, 8.6904, 0.1152}},
{953, {2.6640, 6.3432, -0.0000}},
{954, {6.0048, 6.3432, -0.0000}},
{955, {6.0048, 8.6976, -0.0000}},
{956, {6.9120, 6.3432, 2.3040}},
{957, {6.0048, 6.3432, -0.0000}},
{958, {5.3712, 8.6976, 2.0664}},
{959, {6.6744, 6.4584, 0.1152}},
{960, {8.2800, 6.3432, 0.1152}},
{961, {6.8256, 6.4656, 2.4912}},
{962, {5.7816, 6.4584, 2.0664}},
{963, {7.4088, 6.3432, 0.1152}},
{964, {4.7448, 6.3432, 0.1152}},
{965, {6.5664, 6.3432, 0.1152}},
{966, {7.7832, 6.4872, 2.4912}},
{967, {6.3000, 6.4728, 2.4840}},
{968, {8.5536, 7.8552, 2.4912}},
{969, {9.3744, 6.4656, 0.1152}},
{970, {2.6640, 8.2224, -0.0000}},
{971, {6.5664, 8.2224, 0.1152}},
{972, {6.6744, 9.0432, 0.1152}},
{973, {6.5664, 9.0432, 0.1152}},
{974, {9.3744, 9.0432, 0.1152}},
{976, {6.9048, 8.6976, 0.1152}},
{977, {6.5664, 8.6976, 0.1152}},
{978, {9.2736, 8.3304, -0.0000}},
{979, {11.4984, 8.6976, -0.0000}},
{980, {9.2736, 10.0440, -0.0000}},
{981, {6.7248, 8.6976, 2.4912}},
{982, {9.3744, 6.3432, 0.1152}},
{983, {7.2144, 6.3648, 2.4912}},
{984, {9.3384, 8.3808, 2.4912}},
{985, {6.6744, 6.4584, 2.4912}},
{986, {8.6688, 8.3808, -0.0000}},
{987, {6.0048, 6.4584, 2.4912}},
{988, {7.3296, 8.2584, -0.0000}},
{989, {4.8456, 6.3432, 2.4840}},
{990, {7.4952, 8.7048, 0.1080}},
{991, {6.3504, 8.2584, -0.0000}},
{992, {9.0792, 8.6976, 2.4768}},
{993, {6.9192, 8.7408, 2.4984}},
{994, {10.6920, 8.2584, 2.4840}},
{995, {10.0008, 6.3432, 2.4840}},
{996, {8.0928, 8.3808, -0.0000}},
{997, {6.6744, 8.7696, -0.0000}},
{998, {8.0856, 8.2656, 2.4840}},
{999, {6.0048, 6.8832, 0.1152}},
{1000, {8.0064, 8.3808, 0.1152}},
{1001, {8.0064, 8.3808, 0.1152}},
{1002, {7.3152, 8.3808, -0.0000}},
{1003, {7.1568, 6.3792, -0.0000}},
{1004, {8.8416, 8.2584, 0.1152}},
{1005, {6.6456, 6.4656, 0.1152}},
{1006, {5.5656, 8.2656, -0.0000}},
{1007, {4.9176, 8.7696, 0.0864}},
{1008, {7.2144, 6.3648, 0.1152}},
{1009, {6.8760, 6.4584, 2.4912}},
{1010, {6.0048, 6.4584, 0.1152}},
{1011, {2.6640, 8.6976, 2.4912}},
{1012, {9.3384, 8.3808, 0.1152}},
{1013, {5.3064, 6.3432, -0.0000}},
{1014, {5.3064, 6.3432, -0.0000}},
{1015, {8.0064, 8.2584, -0.0000}},
{1016, {6.6744, 8.6976, 2.4912}},
{1017, {8.6688, 8.3808, 0.1152}},
{1018, {10.0008, 8.2584, -0.0000}},
{1019, {8.2512, 6.3432, 2.4912}},
{1020, {6.8256, 6.4656, 2.4912}},
{1021, {8.6688, 8.3808, 0.1152}},
{1022, {8.6688, 8.3808, 0.1152}},
{1023, {8.6688, 8.3808, 0.1152}},
{1024, {8.0064, 10.4040, -0.0000}},
{1025, {8.0136, 10.0440, -0.0000}},
{1026, {10.3824, 8.2584, 0.1152}},
{1027, {6.5016, 10.4040, -0.0072}},
{1028, {8.6256, 8.3808, 0.1152}},
{1029, {8.0064, 8.3808, 0.1152}},
{1030, {3.3336, 8.2584, -0.0000}},
{1031, {3.3336, 10.0440, -0.0000}},
{1032, {6.0048, 8.2584, 0.1152}},
{1033, {12.6864, 8.2584, 0.0936}},
{1034, {12.1248, 8.2584, -0.0000}},
{1035, {10.2528, 8.2584, -0.0000}},
{1036, {6.9912, 10.4040, -0.0000}},
{1037, {8.6256, 10.4040, -0.0000}},
{1038, {7.6248, 10.8432, 0.1152}},
{1039, {8.6256, 8.2584, 2.3904}},
{1040, {8.0064, 8.2584, -0.0000}},
{1041, {7.8768, 8.2584, -0.0000}},
{1042, {8.0064, 8.2584, -0.0000}},
{1043, {6.5016, 8.2656, -0.0072}},
{1044, {8.1288, 8.2584, 2.3904}},
{1045, {8.0064, 8.2584, -0.0000}},
{1046, {11.0808, 8.2584, -0.0000}},
{1047, {7.2504, 8.3736, 0.1152}},
{1048, {8.6256, 8.2584, -0.0000}},
{1049, {8.6256, 10.8432, -0.0000}},
{1050, {6.9912, 8.2584, -0.0000}},
{1051, {7.8768, 8.2584, 0.0936}},
{1052, {10.0008, 8.2584, -0.0000}},
{1053, {8.6688, 8.2584, -0.0000}},
{1054, {9.3384, 8.3808, 0.1152}},
{1055, {8.6256, 8.2584, -0.0000}},
{1056, {8.0064, 8.2584, -0.0000}},
{1057, {8.6688, 8.3808, 0.1152}},
{1058, {7.3296, 8.2584, -0.0000}},
{1059, {7.6248, 8.2584, 0.1152}},
{1060, {9.1224, 8.3160, 0.0648}},
{1061, {8.0064, 8.2584, -0.0000}},
{1062, {8.8776, 8.2584, 2.3904}},
{1063, {7.9992, 8.2584, -0.0000}},
{1064, {11.0016, 8.2584, -0.0000}},
{1065, {11.2536, 8.2584, 2.3904}},
{1066, {9.4968, 8.2584, -0.0000}},
{1067, {10.6272, 8.2584, -0.0000}},
{1068, {7.8768, 8.2584, -0.0000}},
{1069, {8.6256, 8.3808, 0.1152}},
{1070, {12.1248, 8.3808, 0.1152}},
{1071, {8.6688, 8.2584, -0.0000}},
{1072, {6.6744, 6.4584, 0.1152}},
{1073, {6.8760, 8.8056, 0.1152}},
{1074, {6.3792, 6.3432, -0.0000}},
{1075, {4.3776, 6.3432, -0.0000}},
{1076, {7.0056, 6.3432, 2.3904}},
{1077, {6.6744, 6.4584, 0.1152}},
{1078, {8.0280, 6.3432, -0.0000}},
{1079, {5.5008, 6.4584, 0.1152}},
{1080, {6.7032, 6.3432, -0.0000}},
{1081, {6.7032, 8.9064, -0.0000}},
{1082, {5.2488, 6.3432, -0.0000}},
{1083, {7.0056, 6.3432, 0.1152}},
{1084, {8.2512, 6.3432, -0.0000}},
{1085, {6.6312, 6.3432, -0.0000}},
{1086, {6.6744, 6.4584, 0.1152}},
{1087, {6.5016, 6.3432, -0.0000}},
{1088, {6.6744, 6.4512, 2.4912}},
{1089, {6.0048, 6.4584, 0.1152}},
{1090, {5.5008, 6.3432, -0.0000}},
{1091, {6.0048, 6.3432, 2.4912}},
{1092, {9.8784, 8.6976, 2.4912}},
{1093, {6.0048, 6.3432, -0.0000}},
{1094, {6.8760, 6.3432, 2.3904}},
{1095, {6.2568, 6.3432, -0.0000}},
{1096, {9.6264, 6.3432, -0.0000}},
{1097, {9.8784, 6.3432, 2.3904}},
{1098, {7.5024, 6.3432, -0.0000}},
{1099, {8.6256, 6.3432, -0.0000}},
{1100, {6.2568, 6.3432, -0.0000}},
{1101, {6.1272, 6.4584, 0.1152}},
{1102, {9.0000, 6.4584, 0.1152}},
{1103, {6.5016, 6.3432, -0.0000}},
{1104, {6.6744, 8.8416, 0.1152}},
{1105, {6.6744, 8.2224, 0.1152}},
{1106, {6.6744, 8.6976, 2.4912}},
{1107, {4.3776, 8.8416, -0.0000}},
{1108, {6.1272, 6.4584, 0.1152}},
{1109, {6.0048, 6.4440, 0.1152}},
{1110, {2.6640, 8.6976, -0.0000}},
{1111, {3.3336, 8.2224, -0.0000}},
{1112, {2.6640, 8.6976, 2.4912}},
{1113, {10.8792, 6.3432, 0.1152}},
{1114, {9.7488, 6.3432, -0.0000}},
{1115, {6.6744, 8.6976, -0.0000}},
{1116, {5.2488, 8.8416, -0.0000}},
{1117, {6.7032, 8.8416, -0.0000}},
{1118, {6.0048, 8.9064, 2.4912}},
{1119, {6.6312, 6.3432, 2.3904}},
{1120, {16.0560, 8.3808, 0.1152}},
{1121, {7.4880, 6.3432, -0.0000}},
{1122, {9.3384, 8.2584, -0.0000}},
{1123, {7.3584, 8.6904, -0.0000}},
{1124, {11.3976, 8.3808, 0.1152}},
{1125, {8.5608, 6.4584, 0.1152}},
{1126, {8.0208, 8.2584, -0.0000}},
{1127, {6.0048, 6.3432, -0.0000}},
{1128, {10.7712, 8.2584, -0.0000}},
{1129, {8.3448, 6.3432, -0.0000}},
{1130, {9.9432, 8.2584, -0.0000}},
{1131, {8.2224, 6.3432, -0.0000}},
{1132, {12.6432, 8.2584, -0.0000}},
{1133, {10.4112, 6.3432, -0.0000}},
{1134, {7.2504, 10.3752, 2.4912}},
{1135, {5.5008, 8.4960, 2.4912}},
{1136, {9.5616, 8.2584, -0.0000}},
{1137, {8.2656, 6.3432, 2.4912}},
{1138, {9.3384, 8.3808, 0.1152}},
{1139, {6.6744, 6.4584, 0.1152}},
{1140, {9.6408, 8.3808, -0.0000}},
{1141, {7.5744, 6.4584, -0.0000}},
{1142, {9.6408, 10.9512, -0.0000}},
{1143, {7.5744, 8.8416, -0.0000}},
{1144, {12.8952, 8.3808, 2.4912}},
{1145, {10.7568, 6.4584, 2.4912}},
{1146, {10.0008, 8.9352, 0.6912}},
{1147, {7.3512, 7.0200, 0.6624}},
{1148, {14.2920, 11.7432, 0.1152}},
{1149, {10.2240, 9.8712, 0.1152}},
{1150, {16.0560, 10.3680, 0.1152}},
{1151, {7.4880, 8.2584, -0.0000}},
{1152, {8.6688, 8.3808, 2.4984}},
{1153, {6.0048, 6.4440, 2.4912}},
{1154, {6.0408, 8.7768, 0.1872}},
{1155, {0.0000, 8.8488, -6.7248}},
{1156, {0.0000, 8.6328, -7.1856}},
{1157, {0.0000, 8.6976, -6.4296}},
{1158, {0.0000, 8.6976, -6.4296}},
{1159, {0.0000, 9.8712, -7.8480}},
{1160, {0.0000, 8.5752, 2.0016}},
{1161, {0.0000, 8.8560, 2.2464}},
{1162, {8.6256, 10.8360, 2.4048}},
{1163, {6.7032, 8.9064, 1.8216}},
{1164, {7.8768, 8.2584, -0.0000}},
{1165, {6.2568, 8.6976, -0.0000}},
{1166, {8.0064, 8.2584, -0.0000}},
{1167, {6.6744, 6.4512, 2.4912}},
{1168, {5.8680, 10.6632, -0.0072}},
{1169, {4.9320, 8.6976, -0.0000}},
{1170, {6.5016, 8.2656, -0.0000}},
{1171, {4.3776, 6.3432, -0.0000}},
{1172, {8.0496, 8.2584, 2.4912}},
{1173, {6.5880, 6.3432, 2.4912}},
{1174, {11.0808, 8.2584, 2.3904}},
{1175, {8.0280, 6.3432, 2.3904}},
{1176, {7.2504, 8.3736, 2.4912}},
{1177, {5.5008, 6.4584, 2.4912}},
{1178, {6.9912, 8.2584, 2.3904}},
{1179, {5.2488, 6.3432, 2.3904}},
{1180, {6.9912, 8.2584, -0.0000}},
{1181, {5.2488, 6.3432, -0.0000}},
{1182, {6.9912, 8.2584, -0.0000}},
{1183, {5.2488, 8.6976, -0.0000}},
{1184, {8.8992, 8.2584, -0.0000}},
{1185, {6.4296, 6.3432, -0.0000}},
{1186, {8.6688, 8.2584, 2.3904}},
{1187, {6.6312, 6.3432, 2.3904}},
{1188, {10.5552, 8.2584, -0.0000}},
{1189, {7.7760, 6.3432, -0.0000}},
{1190, {13.6440, 8.2584, 2.4912}},
{1191, {10.4400, 6.3432, 2.4912}},
{1192, {9.0360, 8.3808, 0.1152}},
{1193, {6.2568, 6.4440, 0.1152}},
{1194, {8.6688, 8.3808, 2.4840}},
{1195, {6.0048, 6.4584, 2.4912}},
{1196, {7.3296, 8.2584, 2.3904}},
{1197, {5.5008, 6.3432, 2.3904}},
{1198, {6.6744, 8.2584, -0.0000}},
{1199, {6.0048, 6.3432, 2.4912}},
{1200, {6.6744, 8.2584, -0.0000}},
{1201, {6.0048, 6.3432, 2.4912}},
{1202, {8.0064, 8.2584, 2.3904}},
{1203, {6.0048, 6.3432, 2.3904}},
{1204, {11.1024, 8.2584, 2.3904}},
{1205, {8.2944, 6.3504, 2.3904}},
{1206, {7.9992, 8.2584, 2.3904}},
{1207, {6.2568, 6.2208, 1.7640}},
{1208, {7.9992, 8.2584, -0.0000}},
{1209, {6.2568, 6.3432, -0.0000}},
{1210, {7.9992, 8.2584, -0.0000}},
{1211, {6.6744, 8.6976, -0.0000}},
{1212, {10.3392, 8.3808, 0.1152}},
{1213, {7.9920, 6.4584, 0.1152}},
{1214, {10.3392, 8.3808, 1.8144}},
{1215, {7.9920, 6.4584, 1.8144}},
{1216, {3.3336, 8.2584, -0.0000}},
{1217, {11.0808, 10.7496, -0.0000}},
{1218, {8.0280, 8.9064, -0.0000}},
{1219, {8.0136, 8.2584, 2.4912}},
{1220, {6.6096, 6.3432, 2.4912}},
{1221, {7.8768, 8.2584, 2.4048}},
{1222, {7.0056, 6.3432, 1.8216}},
{1223, {8.6688, 8.2584, 2.4912}},
{1224, {6.6312, 6.3432, 2.4912}},
{1225, {8.6688, 8.2584, 2.4048}},
{1226, {6.6312, 6.3432, 1.8216}},
{1227, {7.9992, 8.2584, 2.3904}},
{1228, {6.2568, 6.3432, 2.3904}},
{1229, {10.0008, 8.2584, 2.4048}},
{1230, {8.2512, 6.3432, 1.8216}},
{1231, {2.6640, 8.6976, -0.0000}},
{1232, {8.0064, 10.4256, -0.0000}},
{1233, {6.6744, 8.8560, 0.1152}},
{1234, {8.0064, 10.0440, -0.0000}},
{1235, {6.6744, 8.2224, 0.1152}},
{1236, {12.0024, 8.2584, -0.0000}},
{1237, {10.6704, 6.4584, 0.1152}},
{1238, {8.0064, 10.4256, -0.0000}},
{1239, {6.6744, 8.8560, 0.1152}},
{1240, {9.0288, 8.3808, 0.1152}},
{1241, {6.6744, 6.4584, 0.1152}},
{1242, {9.0288, 10.0440, 0.1152}},
{1243, {6.6744, 8.2224, 0.1152}},
{1244, {11.0808, 10.0440, -0.0000}},
{1245, {8.0280, 8.2224, -0.0000}},
{1246, {7.2504, 10.0440, 0.1152}},
{1247, {5.5008, 8.2224, 0.1152}},
{1248, {7.2504, 8.2584, 0.1152}},
{1249, {6.5376, 6.3432, 2.4912}},
{1250, {8.6256, 9.9216, -0.0000}},
{1251, {6.7032, 7.9920, -0.0000}},
{1252, {8.6256, 10.0440, -0.0000}},
{1253, {6.7032, 8.2224, -0.0000}},
{1254, {9.3384, 10.0440, 0.1152}},
{1255, {6.6744, 8.2224, 0.1152}},
{1256, {9.3384, 8.3808, 0.1152}},
{1257, {6.6744, 6.4584, 0.1152}},
{1258, {9.3384, 10.0440, 0.1152}},
{1259, {6.6744, 8.2224, 0.1152}},
{1260, {8.6256, 10.0440, 0.1152}},
{1261, {6.1272, 8.2224, 0.1152}},
{1262, {7.6248, 9.9216, 0.1152}},
{1263, {6.0048, 7.9920, 2.4912}},
{1264, {7.6248, 10.0440, 0.1152}},
{1265, {6.0048, 8.2224, 2.4912}},
{1266, {7.6248, 10.4112, 0.1152}},
{1267, {6.0048, 8.8416, 2.4912}},
{1268, {7.9992, 10.0440, -0.0000}},
{1269, {6.2568, 8.2224, -0.0000}},
{1270, {6.5016, 8.2656, 2.3904}},
{1271, {4.3776, 6.3432, 2.3904}},
{1272, {10.6272, 10.0440, -0.0000}},
{1273, {8.6256, 8.2224, -0.0000}},
{1274, {6.5016, 8.2656, 2.4912}},
{1275, {4.3776, 6.3432, 2.4912}},
{1276, {8.0064, 8.2584, 2.4912}},
{1277, {6.0048, 6.3432, 2.4912}},
{1278, {8.0064, 8.2584, -0.0000}},
{1279, {6.0048, 6.3432, -0.0000}},
{1280, {7.8768, 8.2584, -0.0000}},
{1281, {6.6744, 8.6976, 0.1152}},
{1282, {11.6208, 8.2584, 0.1152}},
{1283, {10.5192, 8.6976, 0.1152}},
{1284, {11.4768, 8.3736, 0.1152}},
{1285, {9.7848, 6.4584, 0.1152}},
{1286, {7.9560, 8.3736, 2.3904}},
{1287, {6.1128, 6.4584, 2.3904}},
{1288, {11.6424, 8.2584, 0.1152}},
{1289, {10.9152, 6.3432, 0.1152}},
{1290, {12.4128, 8.2584, 0.1152}},
{1291, {10.5408, 6.3432, 0.1152}},
{1292, {9.3384, 8.3808, 0.1152}},
{1293, {6.7032, 6.4584, 0.1152}},
{1294, {8.9640, 8.2584, 0.1152}},
{1295, {7.9848, 6.3432, 0.1152}},
{1296, {7.2504, 8.3736, 0.1152}},
{1297, {5.5008, 6.4584, 0.1152}},
{1298, {7.8768, 8.2584, 2.4912}},
{1299, {7.0056, 6.3432, 2.4912}},
{1306, {9.3384, 8.3808, 2.2680}},
{1307, {6.6744, 6.4584, 2.4912}},
{1308, {11.3256, 8.2584, -0.0000}},
{1309, {8.6688, 6.3432, -0.0000}},
{1425, {0.0000, -0.3096, 2.2536}},
{1426, {0.0000, 10.1016, -7.9560}},
{1427, {0.0000, 10.4760, -7.9560}},
{1428, {0.0000, 10.1016, -7.9560}},
{1429, {0.0000, 10.1016, -7.9560}},
{1430, {0.0000, -0.4824, 2.2608}},
{1431, {0.0000, 9.9936, -8.0208}},
{1432, {0.0000, 9.7704, -7.9704}},
{1433, {0.0000, 9.7416, -7.9560}},
{1434, {0.0000, -0.1440, 2.2536}},
{1435, {0.0000, -0.0792, 2.2536}},
{1436, {0.0000, 9.7416, -7.9560}},
{1437, {0.0000, 9.7416, -7.9560}},
{1438, {0.0000, 9.7416, -7.9560}},
{1439, {0.0000, 10.7424, -7.8408}},
{1440, {0.0000, 10.7424, -7.8408}},
{1441, {0.0000, 9.9000, -7.9560}},
{1442, {0.0000, -0.3096, 2.2536}},
{1443, {0.0000, -0.2016, 2.0376}},
{1444, {0.0000, -0.1440, 2.2536}},
{1445, {0.0000, -0.4824, 2.2608}},
{1446, {0.0000, -0.4824, 2.2608}},
{1447, {0.0000, -0.0504, 2.2608}},
{1448, {0.0000, 9.7416, -7.9560}},
{1449, {0.0000, 10.7424, -7.8408}},
{1450, {0.0000, -0.3096, 2.2536}},
{1451, {0.0000, 10.0656, -7.9560}},
{1452, {0.0000, 9.7920, -7.9560}},
{1453, {0.0000, -0.4824, 2.2608}},
{1454, {0.0000, 9.7704, -7.9704}},
{1455, {0.0000, 10.7424, -8.2224}},
{1456, {0.0000, -0.1080, 2.2608}},
{1457, {0.0000, -0.1080, 2.2608}},
{1458, {0.0000, -0.1080, 2.2608}},
{1459, {0.0000, -0.1080, 2.2608}},
{1460, {0.0000, -1.1160, 2.0448}},
{1461, {0.0000, -1.1016, 2.0448}},
{1462, {0.0000, -0.1080, 2.2608}},
{1463, {0.0000, -0.7344, 1.3608}},
{1464, {0.0000, -0.7272, 2.0448}},
{1465, {0.0000, 9.4176, -8.4744}},
{1466, {0.0000, 9.4176, -8.4744}},
{1467, {0.0000, -0.0936, 2.2536}},
{1468, {0.0000, 4.5864, -3.6648}},
{1469, {0.0000, -0.7344, 2.0448}},
{1470, {4.5936, 7.9488, -6.7104}},
{1471, {0.0000, 9.2592, -8.6328}},
{1472, {6.7608, 11.7648, 2.4408}},
{1473, {0.0000, 9.4176, -8.4744}},
{1474, {0.0000, 9.4176, -8.4744}},
{1475, {3.3336, 6.3360, -0.0000}},
{1476, {0.0000, 10.0728, -9.1368}},
{1477, {0.0000, -1.4544, 2.3832}},
{1478, {4.5504, 7.1928, -0.0000}},
{1479, {0.0000, -0.5688, 2.2608}},
{1488, {7.5384, 7.1928, -0.0000}},
{1489, {7.1784, 7.1928, -0.0000}},
{1490, {5.0760, 7.1928, -0.0000}},
{1491, {6.6528, 7.1928, -0.0000}},
{1492, {7.6104, 7.1928, -0.0000}},
{1493, {3.1176, 7.1928, -0.0000}},
{1494, {3.8808, 7.2936, -0.0000}},
{1495, {7.8984, 7.1928, -0.0000}},
{1496, {7.8336, 7.3080, 0.1152}},
{1497, {3.1176, 7.1928, -3.4128}},
{1498, {6.4080, 7.1928, 2.2536}},
{1499, {6.3000, 7.1928, -0.0000}},
{1500, {6.3576, 9.7560, 0.2664}},
{1501, {8.1432, 7.1928, -0.0000}},
{1502, {8.2440, 7.3080, -0.0000}},
{1503, {3.1176, 7.1928, 2.2536}},
{1504, {4.6728, 7.1928, -0.0000}},
{1505, {7.8696, 7.1928, 0.1152}},
{1506, {6.9840, 7.1928, 0.1944}},
{1507, {7.4808, 7.1928, 2.2536}},
{1508, {7.3224, 7.1928, -0.0000}},
{1509, {6.0480, 7.1928, 2.2536}},
{1510, {6.5376, 7.1928, -0.0000}},
{1511, {7.0776, 7.1928, 2.2536}},
{1512, {6.4080, 7.1928, -0.0000}},
{1513, {8.7624, 7.1928, 0.0576}},
{1514, {8.2944, 7.1928, -0.0000}},
{1520, {6.1056, 7.1928, -0.0000}},
{1521, {6.1056, 7.1928, -0.0000}},
{1522, {6.1056, 7.1928, -3.4128}},
{1523, {4.6152, 9.7560, -6.0336}},
{1524, {7.2360, 9.7560, -6.0336}},
{7424, {5.9544, 6.3432, -0.0000}},
{7425, {8.9712, 6.3432, -0.0000}},
{7426, {10.6704, 6.4440, 0.1152}},
{7427, {6.3792, 6.3432, -0.0000}},
{7428, {6.0048, 6.4584, 0.1152}},
{7429, {6.6168, 6.3432, -0.0000}},
{7430, {6.6168, 6.3432, -0.0000}},
{7431, {5.8752, 6.3432, -0.0000}},
{7432, {5.5008, 6.4584, 0.1152}},
{7433, {2.6640, 6.3432, 2.3544}},
{7434, {5.0688, 6.3432, 0.1152}},
{7435, {6.0048, 6.3432, -0.0000}},
{7436, {4.8168, 6.3432, -0.0000}},
{7437, {8.2512, 6.3432, -0.0000}},
{7438, {6.7032, 6.3432, -0.0000}},
{7439, {6.6744, 6.4584, 0.1152}},
{7440, {6.0048, 6.4584, 0.1152}},
{7441, {7.3008, 5.9544, -0.2880}},
{7442, {7.3008, 5.8032, -0.6264}},
{7443, {7.3008, 6.5592, 0.2448}},
{7444, {11.3256, 6.4584, 0.1152}},
{7445, {5.4864, 6.3432, 0.1152}},
{7446, {6.6744, 6.4584, -3.1752}},
{7447, {6.6744, 3.1752, 0.1152}},
{7448, {6.2568, 6.3432, -0.0000}},
{7449, {6.5016, 6.3432, -0.0000}},
{7450, {6.5016, 6.3432, -0.0000}},
{7451, {5.5008, 6.3432, -0.0000}},
{7452, {6.5664, 6.3432, 0.1152}},
{7453, {7.1640, 5.6160, -0.5184}},
{7454, {8.8056, 5.6160, -0.5184}},
{7455, {7.1640, 7.4304, 0.9792}},
{7456, {6.0048, 6.3432, -0.0000}},
{7457, {8.6688, 6.3432, -0.0000}},
{7458, {6.0048, 6.3432, -0.0000}},
{7459, {5.5008, 6.3432, 0.1152}},
{7460, {5.1264, 6.4440, 0.1224}},
{7461, {7.2864, 6.4512, 0.1152}},
{7462, {4.3776, 6.3432, -0.0000}},
{7463, {6.0048, 6.3432, -0.0000}},
{7464, {6.5016, 6.3432, -0.0000}},
{7465, {6.2568, 6.3432, -0.0000}},
{7466, {8.5536, 6.3432, -0.0000}},
{7467, {7.0056, 6.3432, 0.1152}},
{7468, {5.4360, 8.6976, -2.8728}},
{7469, {7.9632, 8.6976, -2.8728}},
{7470, {4.9752, 8.6976, -2.8728}},
{7471, {4.9752, 8.6976, -2.8728}},
{7472, {5.3928, 8.6976, -2.8728}},
{7473, {4.9248, 8.6976, -2.8728}},
{7474, {4.9248, 8.6976, -2.8728}},
{7475, {5.9544, 8.7840, -2.7864}},
{7476, {5.1480, 8.6976, -2.8728}},
{7477, {2.0016, 8.6976, -2.8728}},
{7478, {3.7728, 8.6976, -2.7864}},
{7479, {5.0976, 8.6976, -2.8728}},
{7480, {4.2192, 8.6976, -2.8728}},
{7481, {6.1272, 8.6976, -2.8728}},
{7482, {5.1624, 8.6976, -2.8728}},
{7483, {5.1480, 8.6976, -2.8728}},
{7484, {6.1416, 8.7840, -2.7864}},
{7485, {4.5864, 8.5536, -2.7936}},
{7486, {5.0256, 8.6976, -2.8728}},
{7487, {5.4144, 8.6976, -2.8728}},
{7488, {5.1912, 8.6976, -2.8728}},
{7489, {5.1480, 8.6976, -2.7864}},
{7490, {7.4736, 8.6976, -2.8728}},
{7491, {4.4640, 7.4232, -2.7864}},
{7492, {4.4640, 7.4232, -2.7864}},
{7493, {4.5216, 7.4160, -2.7864}},
{7494, {7.2000, 7.4232, -2.7864}},
{7495, {4.5288, 9.0000, -2.7864}},
{7496, {4.5288, 9.0000, -2.7864}},
{7497, {4.4568, 7.4232, -2.7864}},
{7498, {4.4568, 7.4232, -2.7864}},
{7499, {3.8232, 7.4232, -2.7864}},
{7500, {3.8232, 7.4232, -2.7864}},
{7501, {4.5216, 7.4160, -1.1160}},
{7502, {1.8864, 7.3440, -1.2168}},
{7503, {4.0680, 9.0000, -2.8728}},
{7504, {6.8760, 7.4232, -2.8728}},
{7505, {4.5864, 7.4232, -1.1160}},
{7506, {4.5288, 7.4232, -2.7864}},
{7507, {4.2480, 7.4232, -2.7864}},
{7508, {4.5288, 7.4232, -5.1048}},
{7509, {4.5288, 5.1048, -2.7864}},
{7510, {4.5360, 7.4160, -1.1160}},
{7511, {2.6352, 8.3376, -2.8080}},
{7512, {4.5864, 7.3440, -2.7864}},
{7513, {4.8888, 6.6024, -3.1320}},
{7514, {6.8760, 7.3512, -2.7936}},
{7515, {3.8592, 7.3440, -2.8728}},
{7516, {4.6872, 7.4232, -2.7936}},
{7517, {4.6224, 9.0000, -1.1160}},
{7518, {3.8592, 7.3440, -1.1160}},
{7519, {4.5360, 9.0000, -2.7864}},
{7520, {5.2776, 7.4448, -1.1160}},
{7521, {4.1184, 7.4304, -1.1160}},
{7522, {1.8864, 5.3280, 0.7992}},
{7523, {2.8800, 3.7512, 0.7992}},
{7524, {4.5864, 3.6720, 0.8856}},
{7525, {3.8592, 3.6720, 0.7992}},
{7526, {4.6224, 5.3352, 2.4336}},
{7527, {3.8592, 3.6720, 2.4408}},
{7528, {4.5504, 3.7584, 2.4408}},
{7529, {5.2776, 3.7512, 2.4336}},
{7530, {4.1184, 3.7584, 2.5560}},
{7531, {10.9008, 6.4584, 0.1152}},
{7532, {6.6744, 8.6976, 0.1152}},
{7533, {6.6744, 8.6976, 0.1152}},
{7534, {3.3336, 8.6832, -0.0000}},
{7535, {10.0008, 6.4584, -0.0000}},
{7536, {6.6744, 6.4584, -0.0000}},
{7537, {6.6744, 6.4512, 2.4912}},
{7538, {3.9960, 6.4584, -0.0000}},
{7539, {3.9960, 6.4584, -0.0000}},
{7540, {6.0048, 6.4440, 0.1152}},
{7541, {3.3336, 7.7616, 0.0936}},
{7542, {6.0048, 6.3432, -0.0000}},
{7543, {6.6744, 6.4440, 2.4912}},
{7544, {4.5648, 6.9840, -2.7864}},
{7545, {6.6816, 6.3432, 2.4912}},
{7546, {9.4320, 8.8776, 0.3312}},
{7547, {2.6640, 6.3432, -0.0000}},
{7548, {2.6640, 6.3432, -0.0000}},
{7549, {6.6744, 6.4512, 2.4912}},
{7550, {6.5664, 6.3432, 0.1152}},
{7551, {6.8184, 6.3432, 0.1152}},
{7552, {6.6744, 8.6976, 2.4912}},
{7553, {6.6744, 8.6976, 2.4912}},
{7554, {3.3336, 8.6832, 2.4912}},
{7555, {8.5536, 6.4440, 2.4912}},
{7556, {6.0048, 8.6976, 2.4912}},
{7557, {2.6640, 8.6976, 2.4912}},
{7558, {10.0008, 6.4584, 2.4912}},
{7559, {6.6744, 6.4584, 2.4912}},
{7560, {6.6744, 6.4512, 2.4912}},
{7561, {3.9960, 6.4584, 2.4912}},
{7562, {6.0048, 6.4440, 2.4912}},
{7563, {4.6440, 8.6976, 2.4912}},
{7564, {6.0048, 6.3432, 2.4984}},
{7565, {6.0048, 6.3432, 2.4984}},
{7566, {6.0048, 6.3432, 2.4984}},
{7567, {6.6744, 6.4584, 2.4984}},
{7568, {6.6744, 6.4584, 2.4912}},
{7569, {6.6744, 8.7768, 2.4912}},
{7570, {6.6744, 6.4584, 2.4912}},
{7571, {5.5008, 6.4584, 2.4912}},
{7572, {5.5008, 6.4584, 2.4912}},
{7573, {7.8048, 6.4584, 2.4912}},
{7574, {2.6640, 8.6976, 2.4912}},
{7575, {6.0048, 6.4584, 2.4912}},
{7576, {2.6640, 8.6976, 2.4912}},
{7577, {6.6744, 6.3432, 2.4912}},
{7578, {6.5376, 6.3432, 2.4912}},
{7579, {4.5216, 7.4232, -2.7792}},
{7580, {4.2480, 7.4304, -2.7864}},
{7581, {4.1760, 7.4304, -2.4912}},
{7582, {4.4784, 9.1296, -2.7936}},
{7583, {3.8232, 7.4160, -2.7864}},
{7584, {2.7504, 8.9928, -2.8728}},
{7585, {2.7504, 7.3440, -1.2240}},
{7586, {4.5216, 7.4160, -1.1160}},
{7587, {4.6008, 9.0000, -2.8728}},
{7588, {1.8864, 9.0000, -2.8728}},
{7589, {1.8864, 7.3440, -2.8728}},
{7590, {1.8864, 7.3440, -2.8728}},
{7591, {1.8864, 7.3440, -2.8728}},
{7592, {3.2472, 9.0000, -1.1160}},
{7593, {1.8864, 9.0000, -1.1160}},
{7594, {1.8864, 9.0000, -1.1232}},
{7595, {3.2976, 7.3440, -2.8728}},
{7596, {6.8616, 7.4232, -1.1160}},
{7597, {6.8616, 7.3440, -1.1160}},
{7598, {4.5864, 7.4232, -1.1160}},
{7599, {4.5864, 7.4232, -1.1160}},
{7600, {4.5864, 7.3368, -2.8728}},
{7601, {4.5288, 7.4304, -2.7864}},
{7602, {4.5000, 9.0000, -1.1160}},
{7603, {4.0824, 7.4160, -1.1232}},
{7604, {1.8864, 9.0000, -1.1160}},
{7605, {2.6352, 8.3448, -1.1160}},
{7606, {4.5864, 7.3440, -2.7936}},
{7607, {4.6512, 7.3440, -2.7936}},
{7608, {4.5360, 7.3440, -2.7936}},
{7609, {4.2408, 7.3440, -2.7936}},
{7610, {3.8592, 7.3440, -2.8728}},
{7611, {4.2984, 7.3440, -2.8728}},
{7612, {4.2984, 7.3440, -1.1160}},
{7613, {4.2984, 7.3440, -2.1384}},
{7614, {4.4280, 7.3440, -1.1160}},
{7615, {4.3704, 9.0288, -2.8224}},
{7616, {0.0000, 9.2376, -7.1352}},
{7617, {0.0000, 9.2376, -7.1352}},
{7618, {0.0000, -0.5040, 2.5416}},
{7619, {0.0000, 8.7480, -7.3296}},
{7620, {0.0000, 8.7408, -7.2432}},
{7621, {0.0000, 8.7408, -7.2432}},
{7622, {0.0000, 8.7408, -7.2432}},
{7623, {0.0000, 8.7408, -7.2432}},
{7624, {0.0000, 8.7480, -7.2432}},
{7625, {0.0000, 8.7480, -7.2432}},
{7626, {0.0000, -0.3168, 2.4912}},
{7678, {0.0000, 9.1944, -6.7320}},
{7679, {0.0000, -0.0360, 2.4984}},
{7680, {8.0064, 8.2584, 2.4912}},
{7681, {6.6744, 6.4584, 2.4912}},
{7682, {8.0064, 10.4112, -0.0000}},
{7683, {6.6744, 8.6976, 0.1152}},
{7684, {8.0064, 8.2584, 1.8216}},
{7685, {6.6744, 8.6976, 1.8216}},
{7686, {8.0064, 8.2584, 1.9008}},
{7687, {6.6744, 8.6976, 1.9008}},
{7688, {8.6688, 10.4040, 2.5416}},
{7689, {6.0048, 8.8416, 2.4264}},
{7690, {8.6688, 10.4112, -0.0000}},
{7691, {6.6744, 8.6976, 0.1152}},
{7692, {8.6688, 8.2584, 1.8216}},
{7693, {6.6744, 8.6976, 1.8216}},
{7694, {8.6688, 8.2584, 1.9008}},
{7695, {6.6744, 8.6976, 1.9008}},
{7696, {8.6688, 8.2584, 2.6712}},
{7697, {6.6744, 8.6976, 2.6712}},
{7698, {8.6688, 8.2584, 2.4912}},
{7699, {6.6744, 8.6976, 2.4912}},
{7700, {8.0064, 10.7568, -0.0000}},
{7701, {6.6744, 10.4544, 0.1152}},
{7702, {8.0064, 10.7568, -0.0000}},
{7703, {6.6744, 10.4544, 0.1152}},
{7704, {8.0064, 8.2584, 2.4912}},
{7705, {6.6744, 6.4584, 2.4912}},
{7706, {8.0064, 8.2584, 2.4912}},
{7707, {6.6744, 6.4584, 2.4912}},
{7708, {8.0064, 10.9800, 2.5416}},
{7709, {6.6744, 8.8560, 2.5416}},
{7710, {7.3296, 10.4112, -0.0000}},
{7711, {3.3336, 10.4112, -0.0000}},
{7712, {9.3384, 9.9216, 0.1152}},
{7713, {6.6744, 7.9920, 2.4912}},
{7714, {8.6688, 10.4112, -0.0000}},
{7715, {6.6744, 10.4112, -0.0000}},
{7716, {8.6688, 8.2584, 1.8216}},
{7717, {6.6744, 8.6976, 1.8216}},
{7718, {8.6688, 10.0440, -0.0000}},
{7719, {6.6744, 10.3464, -0.0000}},
{7720, {8.6688, 8.2584, 2.5416}},
{7721, {6.6744, 8.6976, 2.5416}},
{7722, {8.6688, 8.2584, 2.3328}},
{7723, {6.6744, 8.6976, 2.3328}},
{7724, {3.3336, 8.2584, 2.4912}},
{7725, {2.6640, 8.6976, 2.4912}},
{7726, {3.3336, 10.7568, -0.0000}},
{7727, {3.3336, 10.3680, -0.0000}},
{7728, {8.0064, 10.4040, -0.0000}},
{7729, {6.0048, 10.6416, -0.0000}},
{7730, {8.0064, 8.2584, 1.8216}},
{7731, {6.0048, 8.6976, 1.8216}},
{7732, {8.0064, 8.2584, 1.9008}},
{7733, {6.0048, 8.6976, 1.9008}},
{7734, {6.6744, 8.2584, 1.8216}},
{7735, {2.6640, 8.6976, 1.8216}},
{7736, {6.6744, 9.9216, 1.8216}},
{7737, {2.6640, 9.9504, 1.8216}},
{7738, {6.6744, 8.2584, 1.9008}},
{7739, {2.6640, 8.6976, 1.9008}},
{7740, {6.6744, 8.2584, 2.4912}},
{7741, {2.6640, 8.6976, 2.4912}},
{7742, {10.0008, 10.4040, -0.0000}},
{7743, {10.0008, 8.8416, -0.0000}},
{7744, {10.0008, 10.4112, -0.0000}},
{7745, {10.0008, 8.6976, -0.0000}},
{7746, {10.0008, 8.2584, 1.8216}},
{7747, {10.0008, 6.4584, 1.8216}},
{7748, {8.6688, 10.4112, -0.0000}},
{7749, {6.6744, 8.6976, -0.0000}},
{7750, {8.6688, 8.2584, 1.8216}},
{7751, {6.6744, 6.4584, 1.8216}},
{7752, {8.6688, 8.2584, 1.9008}},
{7753, {6.6744, 6.4584, 1.9008}},
{7754, {8.6688, 8.2584, 2.4912}},
{7755, {6.6744, 6.4584, 2.4912}},
{7756, {9.3384, 10.7568, 0.1152}},
{7757, {6.6744, 10.4616, 0.1152}},
{7758, {9.3384, 10.7568, 0.1152}},
{7759, {6.6744, 10.1016, 0.1152}},
{7760, {9.3384, 10.7568, 0.1152}},
{7761, {6.6744, 10.4544, 0.1152}},
{7762, {9.3384, 10.7568, 0.1152}},
{7763, {6.6744, 10.4544, 0.1152}},
{7764, {8.0064, 10.4040, -0.0000}},
{7765, {6.6744, 8.8416, 2.4912}},
{7766, {8.0064, 10.4112, -0.0000}},
{7767, {6.6744, 8.6976, 2.4912}},
{7768, {8.6688, 10.4112, -0.0000}},
{7769, {3.9960, 8.6976, -0.0000}},
{7770, {8.6688, 8.2584, 1.8216}},
{7771, {3.9960, 6.4584, 1.8216}},
{7772, {8.6688, 9.9216, 1.8216}},
{7773, {3.9960, 7.9920, 1.8216}},
{7774, {8.6688, 8.2584, 1.9008}},
{7775, {3.9960, 6.4584, 1.9008}},
{7776, {8.0064, 10.4112, 0.1152}},
{7777, {6.0048, 8.6976, 0.1152}},
{7778, {8.0064, 8.3808, 1.8216}},
{7779, {6.0048, 6.4440, 1.8216}},
{7780, {8.0064, 10.6272, 0.1152}},
{7781, {6.0048, 8.7696, 0.1152}},
{7782, {8.0064, 10.7568, 0.1152}},
{7783, {6.0048, 8.8992, 0.1152}},
{7784, {8.0064, 10.4112, 1.8216}},
{7785, {6.0048, 8.6976, 1.8216}},
{7786, {7.3296, 10.4112, -0.0000}},
{7787, {3.3336, 10.2744, 0.0936}},
{7788, {7.3296, 8.2584, 1.8216}},
{7789, {3.3336, 7.7616, 1.8216}},
{7790, {7.3296, 8.2584, 1.9008}},
{7791, {3.3336, 7.7616, 1.9008}},
{7792, {7.3296, 8.2584, 2.4912}},
{7793, {3.3336, 7.7616, 2.4912}},
{7794, {8.6688, 8.2584, 2.4912}},
{7795, {6.6744, 6.3432, 2.4912}},
{7796, {8.6688, 8.2584, 2.4912}},
{7797, {6.6744, 6.3432, 2.4912}},
{7798, {8.6688, 8.2584, 2.4912}},
{7799, {6.6744, 6.3432, 2.4912}},
{7800, {8.6688, 10.7568, 0.1152}},
{7801, {6.6744, 10.4616, 0.1152}},
{7802, {8.6688, 10.7568, 0.1152}},
{7803, {6.6744, 9.6840, 0.1152}},
{7804, {8.0064, 10.5336, -0.0000}},
{7805, {6.0048, 8.6112, -0.0000}},
{7806, {8.0064, 8.2584, 1.8216}},
{7807, {6.0048, 6.3432, 1.8216}},
{7808, {11.3256, 10.4040, -0.0000}},
{7809, {8.6688, 8.8416, -0.0000}},
{7810, {11.3256, 10.4040, -0.0000}},
{7811, {8.6688, 8.8416, -0.0000}},
{7812, {11.3256, 10.0440, -0.0000}},
{7813, {8.6688, 8.2224, -0.0000}},
{7814, {11.3256, 10.4112, -0.0000}},
{7815, {8.6688, 8.6976, -0.0000}},
{7816, {11.3256, 8.2584, 1.8216}},
{7817, {8.6688, 6.3432, 1.8216}},
{7818, {8.0064, 10.4112, -0.0000}},
{7819, {6.0048, 8.6976, -0.0000}},
{7820, {8.0064, 10.0440, -0.0000}},
{7821, {6.0048, 8.2224, -0.0000}},
{7822, {8.0064, 10.4112, -0.0000}},
{7823, {6.0048, 8.6976, 2.4912}},
{7824, {7.3296, 10.4904, -0.0000}},
{7825, {6.0048, 8.7408, -0.0000}},
{7826, {7.3296, 8.2584, 1.8216}},
{7827, {6.0048, 6.3432, 1.8216}},
{7828, {7.3296, 8.2584, 1.9008}},
{7829, {6.0048, 6.3432, 1.9008}},
{7830, {6.6744, 8.6976, 1.9008}},
{7831, {3.3336, 9.7992, 0.0936}},
{7832, {8.6688, 9.6768, -0.0000}},
{7833, {6.0048, 9.6768, 2.4912}},
{7834, {6.6744, 8.9280, 0.1152}},
{7835, {2.6640, 10.4112, -0.0000}},
{7838, {8.4312, 8.3808, 0.1152}},
{7840, {8.0064, 8.2584, 1.8216}},
{7841, {6.6744, 6.4584, 1.8216}},
{7842, {8.0064, 10.7496, -0.0000}},
{7843, {6.6744, 8.9352, 0.1152}},
{7844, {8.0064, 10.7568, -0.0000}},
{7845, {6.6744, 9.2304, 0.1152}},
{7846, {8.0064, 10.7568, -0.0000}},
{7847, {6.6744, 9.2304, 0.1152}},
{7848, {8.0064, 10.7496, -0.0000}},
{7849, {6.6744, 9.6912, 0.1152}},
{7850, {8.0064, 10.7568, -0.0000}},
{7851, {6.6744, 10.4040, 0.1152}},
{7852, {8.0064, 10.4904, 1.8216}},
{7853, {6.6744, 8.7408, 1.8216}},
{7854, {8.0064, 10.7568, -0.0000}},
{7855, {6.6744, 10.4112, 0.1152}},
{7856, {8.0064, 10.7568, -0.0000}},
{7857, {6.6744, 10.4112, 0.1152}},
{7858, {8.0064, 10.7568, -0.0000}},
{7859, {6.6744, 10.7640, 0.1152}},
{7860, {8.0064, 10.7568, -0.0000}},
{7861, {6.6744, 10.4112, 0.1152}},
{7862, {8.0064, 10.4256, 1.8216}},
{7863, {6.6744, 8.8560, 1.8216}},
{7864, {8.0064, 8.2584, 1.8216}},
{7865, {6.6744, 6.4584, 1.8216}},
{7866, {8.0064, 10.7496, -0.0000}},
{7867, {6.6744, 8.9352, 0.1152}},
{7868, {8.0064, 10.5336, -0.0000}},
{7869, {6.6744, 8.6112, 0.1152}},
{7870, {8.0064, 10.7568, -0.0000}},
{7871, {6.6744, 9.2304, 0.1152}},
{7872, {8.0064, 10.7568, -0.0000}},
{7873, {6.6744, 9.2304, 0.1152}},
{7874, {8.0064, 10.7496, -0.0000}},
{7875, {6.6744, 9.6912, 0.1152}},
{7876, {8.0064, 10.7568, -0.0000}},
{7877, {6.6744, 10.4040, 0.1152}},
{7878, {8.0064, 10.4904, 1.8216}},
{7879, {6.6744, 8.7408, 1.8216}},
{7880, {3.3336, 10.7496, -0.0000}},
{7881, {2.6640, 9.0648, -0.0000}},
{7882, {3.3336, 8.2584, 1.8216}},
{7883, {2.6640, 8.6976, 1.8216}},
{7884, {9.3384, 8.3808, 1.8216}},
{7885, {6.6744, 6.4584, 1.8216}},
{7886, {9.3384, 10.7496, 0.1152}},
{7887, {6.6744, 9.0648, 0.1152}},
{7888, {9.3384, 10.7568, 0.1152}},
{7889, {6.6744, 9.2304, 0.1152}},
{7890, {9.3384, 10.7568, 0.1152}},
{7891, {6.6744, 9.2304, 0.1152}},
{7892, {9.3384, 10.7496, 0.1152}},
{7893, {6.6744, 9.6912, 0.1152}},
{7894, {9.3384, 10.7568, 0.1152}},
{7895, {6.6744, 10.4040, 0.1152}},
{7896, {9.3384, 10.5192, 1.8216}},
{7897, {6.6744, 8.7408, 1.8216}},
{7898, {10.2888, 10.4040, 0.1152}},
{7899, {7.8696, 8.8416, 0.1152}},
{7900, {10.2888, 10.4040, 0.1152}},
{7901, {7.8696, 8.8416, 0.1152}},
{7902, {10.2888, 10.7496, 0.1152}},
{7903, {7.8696, 9.0648, 0.1152}},
{7904, {10.2888, 10.5336, 0.1152}},
{7905, {7.8696, 8.6112, 0.1152}},
{7906, {10.2888, 8.3808, 1.8216}},
{7907, {7.8696, 6.4584, 1.8216}},
{7908, {8.6688, 8.2584, 1.8216}},
{7909, {6.6744, 6.3432, 1.8216}},
{7910, {8.6688, 10.7496, 0.1152}},
{7911, {6.6744, 9.0648, 0.1152}},
{7912, {10.2528, 10.4040, 0.1152}},
{7913, {8.0352, 8.8416, 0.1152}},
{7914, {10.2528, 10.4040, 0.1152}},
{7915, {8.0352, 8.8416, 0.1152}},
{7916, {10.2528, 10.7496, 0.1152}},
{7917, {8.0352, 9.0648, 0.1152}},
{7918, {10.2528, 10.5336, 0.1152}},
{7919, {8.0352, 8.6112, 0.1152}},
{7920, {10.2528, 8.2584, 1.8216}},
{7921, {8.0352, 6.3432, 1.8216}},
{7922, {8.0064, 10.4040, -0.0000}},
{7923, {6.0048, 8.8416, 2.4912}},
{7924, {8.0064, 8.2584, 1.8216}},
{7925, {6.0048, 6.3432, 2.4912}},
{7926, {8.0064, 10.7496, -0.0000}},
{7927, {6.0048, 9.0648, 2.4912}},
{7928, {8.0064, 10.5336, -0.0000}},
{7929, {6.0048, 8.6112, 2.4912}},
{7936, {6.9408, 9.2808, 0.1152}},
{7937, {6.9408, 9.2808, 0.1152}},
{7938, {6.9408, 9.2808, 0.1152}},
{7939, {6.9408, 9.2808, 0.1152}},
{7940, {6.9408, 9.2808, 0.1152}},
{7941, {6.9408, 9.2808, 0.1152}},
{7942, {6.9408, 10.7640, 0.1152}},
{7943, {6.9408, 10.7064, 0.1152}},
{7944, {8.0064, 8.6976, -0.0000}},
{7945, {8.0064, 8.6976, -0.0000}},
{7946, {9.7632, 8.6976, -0.0000}},
{7947, {9.7632, 8.6976, -0.0000}},
{7948, {9.7632, 8.6976, -0.0000}},
{7949, {9.7632, 8.6976, -0.0000}},
{7950, {9.7632, 10.3536, -0.0000}},
{7951, {9.7632, 10.3536, -0.0000}},
{7952, {5.3496, 9.2808, 0.1152}},
{7953, {5.3496, 9.2808, 0.1152}},
{7954, {5.3496, 9.2808, 0.1152}},
{7955, {5.3496, 9.2808, 0.1152}},
{7956, {5.3496, 9.2808, 0.1152}},
{7957, {5.3496, 9.2808, 0.1152}},
{7960, {9.1800, 8.6976, -0.0000}},
{7961, {9.1800, 8.6976, -0.0000}},
{7962, {11.1384, 8.6976, -0.0000}},
{7963, {11.1384, 8.6976, -0.0000}},
{7964, {11.1384, 8.6976, -0.0000}},
{7965, {11.1384, 8.6976, -0.0000}},
{7968, {6.6744, 9.2808, 2.4840}},
{7969, {6.6744, 9.2808, 2.4840}},
{7970, {6.6744, 9.2808, 2.4840}},
{7971, {6.6744, 9.2808, 2.4840}},
{7972, {6.6744, 9.2808, 2.4840}},
{7973, {6.6744, 9.2808, 2.4840}},
{7974, {6.6744, 10.7064, 2.4840}},
{7975, {6.6744, 10.7064, 2.4840}},
{7976, {9.8424, 8.6976, -0.0000}},
{7977, {9.8424, 8.6976, -0.0000}},
{7978, {12.1824, 8.6976, -0.0000}},
{7979, {12.1824, 8.6976, -0.0000}},
{7980, {12.1824, 8.6976, -0.0000}},
{7981, {12.1824, 8.6976, -0.0000}},
{7982, {12.1824, 10.3536, -0.0000}},
{7983, {12.1824, 10.3536, -0.0000}},
{7984, {2.6640, 9.2808, -0.0000}},
{7985, {2.6640, 9.2808, -0.0000}},
{7986, {2.6640, 9.2808, -0.0000}},
{7987, {2.6640, 9.2808, -0.0000}},
{7988, {2.6640, 9.2808, -0.0000}},
{7989, {2.6640, 9.2808, -0.0000}},
{7990, {2.6640, 10.9368, -0.0000}},
{7991, {2.6640, 10.9368, -0.0000}},
{7992, {4.5072, 8.6976, -0.0000}},
{7993, {4.5072, 8.6976, -0.0000}},
{7994, {6.8544, 8.6976, -0.0000}},
{7995, {6.8544, 8.6976, -0.0000}},
{7996, {6.8544, 8.6976, -0.0000}},
{7997, {6.8544, 8.6976, -0.0000}},
{7998, {6.8544, 10.3536, -0.0000}},
{7999, {6.8544, 10.3536, -0.0000}},
{8000, {6.6744, 9.2808, 0.1152}},
{8001, {6.6744, 9.2808, 0.1152}},
{8002, {6.6744, 9.2808, 0.1152}},
{8003, {6.6744, 9.2808, 0.1152}},
{8004, {6.6744, 9.2808, 0.1152}},
{8005, {6.6744, 9.2808, 0.1152}},
{8008, {9.9216, 8.6976, 0.1152}},
{8009, {9.9216, 8.6976, 0.1152}},
{8010, {12.2688, 8.6976, 0.1152}},
{8011, {12.2688, 8.6976, 0.1152}},
{8012, {11.6784, 8.6976, 0.1152}},
{8013, {11.6784, 8.6976, 0.1152}},
{8016, {6.5664, 9.2808, 0.1152}},
{8017, {6.5664, 9.2808, 0.1152}},
{8018, {6.5664, 9.2808, 0.1152}},
{8019, {6.5664, 9.2808, 0.1152}},
{8020, {6.5664, 9.2808, 0.1152}},
{8021, {6.5664, 9.2808, 0.1152}},
{8022, {6.5664, 10.7064, 0.1152}},
{8023, {6.5664, 10.7064, 0.1152}},
{8025, {9.7632, 8.6976, -0.0000}},
{8027, {11.5200, 8.6976, -0.0000}},
{8029, {12.1104, 8.6976, -0.0000}},
{8031, {11.5200, 10.3536, -0.0000}},
{8032, {9.3744, 9.2808, 0.1152}},
{8033, {9.3744, 9.2808, 0.1152}},
{8034, {9.3744, 9.2808, 0.1152}},
{8035, {9.3744, 9.2808, 0.1152}},
{8036, {9.3744, 9.2808, 0.1152}},
{8037, {9.3744, 9.2808, 0.1152}},
{8038, {9.3744, 10.9368, 0.1152}},
{8039, {9.3744, 10.9368, 0.1152}},
{8040, {9.5616, 8.6976, -0.0000}},
{8041, {9.5616, 8.6976, -0.0000}},
{8042, {11.9016, 8.6976, -0.0000}},
{8043, {11.9016, 8.6976, -0.0000}},
{8044, {11.3184, 8.6976, -0.0000}},
{8045, {11.3184, 8.6976, -0.0000}},
{8046, {11.3184, 10.3536, -0.0000}},
{8047, {11.3184, 10.3536, -0.0000}},
{8048, {6.9408, 9.0432, 0.1152}},
{8049, {6.9408, 9.0432, 0.1152}},
{8050, {5.3496, 9.0432, 0.1152}},
{8051, {5.3496, 9.0432, 0.1152}},
{8052, {6.6744, 9.0432, 2.4840}},
{8053, {6.6744, 9.0432, 2.4840}},
{8054, {2.6640, 9.0432, -0.0000}},
{8055, {2.6640, 9.0432, -0.0000}},
{8056, {6.6744, 9.0432, 0.1152}},
{8057, {6.6744, 9.0432, 0.1152}},
{8058, {6.5664, 9.0432, 0.1152}},
{8059, {6.5664, 9.0432, 0.1152}},
{8060, {9.3744, 9.0432, 0.1152}},
{8061, {9.3744, 9.0432, 0.1152}},
{8064, {6.9408, 9.2808, 2.4912}},
{8065, {6.9408, 9.2808, 2.4912}},
{8066, {6.9408, 9.2808, 2.4912}},
{8067, {6.9408, 9.2808, 2.4912}},
{8068, {6.9408, 9.2808, 2.4912}},
{8069, {6.9408, 9.2808, 2.4912}},
{8070, {6.9408, 10.7064, 2.4912}},
{8071, {6.9408, 10.7064, 2.4912}},
{8072, {8.0064, 8.6976, 2.4912}},
{8073, {8.0064, 8.6976, 2.4912}},
{8074, {9.7632, 8.6976, 2.4912}},
{8075, {9.7632, 8.6976, 2.4912}},
{8076, {9.7632, 8.6976, 2.4912}},
{8077, {9.7632, 8.6976, 2.4912}},
{8078, {9.7632, 10.3536, 2.4912}},
{8079, {9.7632, 10.3536, 2.4912}},
{8080, {6.6744, 9.2808, 2.4912}},
{8081, {6.6744, 9.2808, 2.4912}},
{8082, {6.6744, 9.2808, 2.4912}},
{8083, {6.6744, 9.2808, 2.4912}},
{8084, {6.6744, 9.2808, 2.4912}},
{8085, {6.6744, 9.2808, 2.4912}},
{8086, {6.6744, 10.9368, 2.4912}},
{8087, {6.6744, 10.9368, 2.4912}},
{8088, {9.8424, 8.6976, 2.4912}},
{8089, {9.8424, 8.6976, 2.4912}},
{8090, {12.1824, 8.6976, 2.4912}},
{8091, {12.1824, 8.6976, 2.4912}},
{8092, {12.1824, 8.6976, 2.4912}},
{8093, {12.1824, 8.6976, 2.4912}},
{8094, {12.1824, 10.3536, 2.4912}},
{8095, {12.1824, 10.3536, 2.4912}},
{8096, {9.3744, 9.2808, 2.4912}},
{8097, {9.3744, 9.2808, 2.4912}},
{8098, {9.3744, 9.2808, 2.4912}},
{8099, {9.3744, 9.2808, 2.4912}},
{8100, {9.3744, 9.2808, 2.4912}},
{8101, {9.3744, 9.2808, 2.4912}},
{8102, {9.3744, 10.7064, 2.4912}},
{8103, {9.3744, 10.7064, 2.4912}},
{8104, {9.5616, 8.6976, 2.4912}},
{8105, {9.5616, 8.6976, 2.4912}},
{8106, {11.9016, 8.6976, 2.4912}},
{8107, {11.9016, 8.6976, 2.4912}},
{8108, {11.3184, 8.6976, 2.4912}},
{8109, {11.3184, 8.6976, 2.4912}},
{8110, {11.3184, 10.3536, 2.4912}},
{8111, {11.3184, 10.3536, 2.4912}},
{8112, {6.9408, 8.8560, 0.1152}},
{8113, {6.9408, 7.9920, 0.1152}},
{8114, {6.9408, 9.0432, 2.4912}},
{8115, {6.9408, 6.4584, 2.4912}},
{8116, {6.9408, 9.0432, 2.4912}},
{8118, {6.9408, 8.6112, 0.1152}},
{8119, {6.9408, 8.6112, 2.4912}},
{8120, {8.0064, 10.4256, -0.0000}},
{8121, {8.0064, 9.9216, -0.0000}},
{8122, {8.0064, 9.0432, -0.0000}},
{8123, {8.0064, 9.0432, -0.0000}},
{8124, {8.0064, 8.2584, 2.4912}},
{8125, {3.9960, 8.6976, -6.7824}},
{8126, {3.9960, -0.7416, 2.4912}},
{8127, {3.9960, 8.6976, -6.7824}},
{8128, {3.9960, 8.6112, -7.0416}},
{8129, {3.9960, 10.1304, -7.1424}},
{8130, {6.6744, 9.0432, 2.4912}},
{8131, {6.6744, 6.4584, 2.4912}},
{8132, {6.6744, 9.0432, 2.4912}},
{8134, {6.6744, 8.6112, 2.4840}},
{8135, {6.6744, 8.6112, 2.4912}},
{8136, {9.7632, 9.0432, -0.0000}},
{8137, {9.7632, 9.0432, -0.0000}},
{8138, {10.4256, 9.0432, -0.0000}},
{8139, {10.4256, 9.0432, -0.0000}},
{8140, {8.6688, 8.2584, 2.4912}},
{8141, {3.9960, 8.6976, -6.7824}},
{8142, {3.9960, 8.6976, -6.7824}},
{8143, {3.9960, 10.3536, -6.7248}},
{8144, {2.6640, 8.8560, -0.0000}},
{8145, {2.6640, 7.9920, -0.0000}},
{8146, {2.6640, 10.4472, -0.0000}},
{8147, {2.6640, 10.4472, -0.0000}},
{8150, {2.6640, 8.6112, -0.0000}},
{8151, {2.6640, 10.1304, -0.0000}},
{8152, {3.3336, 10.9800, -0.0000}},
{8153, {3.3336, 9.9504, -0.0000}},
{8154, {5.0904, 9.0432, -0.0000}},
{8155, {5.0904, 9.0432, -0.0000}},
{8157, {3.9960, 8.6976, -6.7824}},
{8158, {3.9960, 8.6976, -6.7824}},
{8159, {3.9960, 10.3536, -6.7248}},
{8160, {6.5664, 8.8560, 0.1152}},
{8161, {6.5664, 7.9920, 0.1152}},
{8162, {6.5664, 10.4472, 0.1152}},
{8163, {6.5664, 10.4472, 0.1152}},
{8164, {6.8256, 9.2808, 2.4912}},
{8165, {6.8256, 9.2808, 2.4912}},
{8166, {6.5664, 8.6112, 0.1152}},
{8167, {6.5664, 10.1304, 0.1152}},
{8168, {8.0064, 10.4256, -0.0000}},
{8169, {8.0064, 9.9216, -0.0000}},
{8170, {10.3464, 9.0432, -0.0000}},
{8171, {10.6416, 9.0432, -0.0000}},
{8172, {9.1800, 8.6976, -0.0000}},
{8173, {3.9960, 8.8344, -7.2216}},
{8174, {3.9960, 8.8344, -7.2216}},
{8175, {3.9960, 9.0432, -7.1352}},
{8178, {9.3744, 9.0432, 2.4912}},
{8179, {9.3744, 6.4656, 2.4912}},
{8180, {9.3744, 9.0432, 2.4912}},
{8182, {9.3744, 8.6112, 0.1152}},
{8183, {9.3744, 8.6112, 2.4912}},
{8184, {11.0952, 9.0432, 0.1152}},
{8185, {9.9216, 9.0432, 0.1152}},
{8186, {10.7280, 9.0432, -0.0000}},
{8187, {9.5616, 9.0432, -0.0000}},
{8188, {8.9712, 8.3808, 2.4912}},
{8189, {3.9960, 8.6400, -7.0056}},
{8190, {3.9960, 8.6976, -6.7824}},
{8192, {6.0048, 0.0000, -0.0000}},
{8193, {12.0024, 0.0000, -0.0000}},
{8194, {6.0048, 0.0000, -0.0000}},
{8195, {12.0024, 0.0000, -0.0000}},
{8196, {4.0032, 0.0000, -0.0000}},
{8197, {3.0024, 0.0000, -0.0000}},
{8198, {2.0016, 0.0000, -0.0000}},
{8199, {6.6744, 0.0000, -0.0000}},
{8200, {3.3336, 0.0000, -0.0000}},
{8201, {2.4048, 0.0000, -0.0000}},
{8202, {1.0008, 0.0000, -0.0000}},
{8203, {0.0000, 0.0000, -0.0000}},
{8204, {0.0000, 7.5456, 1.5984}},
{8205, {0.0000, 8.2872, 1.5984}},
{8206, {0.0000, 8.2872, 1.5984}},
{8207, {0.0000, 8.2872, 1.5984}},
{8210, {6.6744, 3.4488, -2.6424}},
{8211, {6.6744, 3.4488, -2.6424}},
{8212, {12.0024, 3.4488, -2.6424}},
{8213, {12.0024, 3.4488, -2.6424}},
{8214, {4.9608, 8.6976, -0.0000}},
{8215, {6.6312, -0.5040, 2.5416}},
{8216, {2.6640, 8.2584, -5.5800}},
{8217, {2.6640, 8.2584, -5.5800}},
{8218, {2.6640, 1.1448, 1.5336}},
{8219, {2.6640, 8.2584, -5.5800}},
{8220, {3.9960, 8.2584, -5.5800}},
{8221, {3.9960, 8.2584, -5.5800}},
{8222, {3.9960, 1.1448, 1.5336}},
{8223, {3.9960, 8.2584, -5.5800}},
{8224, {6.6744, 8.6976, 0.8064}},
{8225, {6.6744, 8.6976, 0.8280}},
{8226, {4.2048, 5.6016, -2.3472}},
{8230, {12.0024, 1.2816, -0.0000}},
{8234, {0.0000, 7.2288, 1.5984}},
{8235, {0.0000, 7.2288, 1.5984}},
{8236, {0.0000, 8.2728, 1.5984}},
{8237, {0.0000, 8.2728, 1.5984}},
{8238, {0.0000, 8.2728, 1.5984}},
{8239, {2.4048, 0.0000, -0.0000}},
{8240, {12.0024, 8.3304, 0.0648}},
{8242, {2.2536, 8.2584, -5.2200}},
{8243, {4.2480, 8.2584, -5.2200}},
{8244, {4.2480, 8.2584, -5.2200}},
{8249, {3.9960, 5.5080, -0.8280}},
{8250, {3.9960, 5.5080, -0.8280}},
{8252, {6.0048, 8.2584, -0.0000}},
{8254, {3.9960, 9.4896, -8.8056}},
{8260, {2.0016, 8.2584, -0.0000}},
{8286, {3.3336, 8.6976, -0.0000}},
{8298, {0.0000, 8.2728, 1.5984}},
{8299, {0.0000, 8.2728, 1.5984}},
{8300, {0.0000, 8.2728, 1.5984}},
{8301, {0.0000, 8.3088, 1.5984}},
{8302, {0.0000, 8.2872, 1.5984}},
{8303, {0.0000, 8.2728, 1.5984}},
{8308, {3.9960, 8.2584, -3.2976}},
{8309, {3.9960, 8.2584, -3.2328}},
{8311, {3.9960, 8.2584, -3.3048}},
{8312, {3.9960, 8.3304, -3.2328}},
{8319, {4.3776, 6.9192, -3.0384}},
{8336, {4.4640, 3.7368, 0.9000}},
{8337, {4.4568, 3.7512, 0.8856}},
{8338, {4.5288, 3.7512, 0.8856}},
{8339, {3.9384, 3.6720, 0.7992}},
{8340, {4.4568, 3.7512, 0.8856}},
{8352, {6.6744, 8.7408, -0.0000}},
{8353, {8.6688, 9.0504, 0.6624}},
{8354, {8.6688, 8.3808, 0.1152}},
{8355, {6.6744, 8.2584, -0.0000}},
{8356, {6.6744, 8.3808, -0.0000}},
{8357, {10.0008, 7.8768, 1.1736}},
{8358, {8.6688, 8.2584, -0.0000}},
{8359, {13.1256, 8.2584, 0.1152}},
{8360, {13.9752, 8.2584, 0.1152}},
{8361, {11.3256, 8.2584, -0.0000}},
{8362, {10.1880, 7.1928, -0.0000}},
{8363, {6.1560, 8.6976, -1.3680}},
{8364, {6.6744, 8.3808, 0.1152}},
{8365, {8.0064, 8.2584, -0.0000}},
{8366, {7.3296, 8.2584, -0.0000}},
{8367, {12.0024, 9.6696, 2.3832}},
{8368, {6.2568, 8.6976, 2.4912}},
{8369, {8.0064, 8.2584, -0.0000}},
{8370, {9.3384, 9.2016, 1.2456}},
{8371, {8.0064, 8.2584, -0.0000}},
{8372, {6.6744, 8.7552, 0.1152}},
{8373, {8.6688, 9.1944, 1.2456}},
{8432, {0.0000, 9.9432, -5.7312}},
{8453, {10.6272, 8.3232, 0.0720}},
{8467, {3.8808, 8.3736, 0.1152}},
{8470, {12.8736, 8.2584, -0.0000}},
{8471, {8.8416, 8.3808, 0.0936}},
{8482, {12.0024, 8.2584, -3.7152}},
{8486, {9.2160, 8.3808, -0.0000}},
{8494, {7.2000, 6.4224, 0.2016}},
{8525, {11.3184, 8.8704, 0.3312}},
{8526, {5.8752, 6.3432, -0.0000}},
{8531, {10.0080, 8.2584, 0.0648}},
{8532, {10.0080, 8.3304, 0.0648}},
{8539, {10.0080, 8.2584, 0.0576}},
{8540, {10.0080, 8.3304, 0.0576}},
{8541, {10.0080, 8.2584, 0.0576}},
{8542, {10.0080, 8.2584, 0.0576}},
{8580, {6.0048, 6.4584, 0.1152}},
{8592, {12.0024, 3.4056, -0.5832}},
{8593, {6.0048, 6.7464, 0.3600}},
{8594, {12.0024, 3.4056, -0.5832}},
{8595, {6.0048, 6.7464, 0.3600}},
{8596, {12.0024, 3.4056, -0.5832}},
{8597, {6.0048, 6.7464, 0.3600}},
{8616, {6.0048, 6.7464, 1.0800}},
{8706, {5.9328, 8.6544, 0.1584}},
{8710, {7.3440, 8.2584, -0.0000}},
{8719, {9.8784, 8.2584, 2.5416}},
{8721, {8.5536, 8.2584, 2.5416}},
{8722, {7.0128, 4.4208, -3.5640}},
{8725, {2.0016, 8.2584, -0.0000}},
{8729, {3.3336, 3.9024, -2.6064}},
{8730, {6.5880, 9.4968, 0.0792}},
{8734, {8.5536, 5.7600, -1.1880}},
{8735, {11.7504, 7.1640, -0.0000}},
{8745, {8.6256, 6.0480, 0.0144}},
{8747, {3.2904, 8.8344, 2.5416}},
{8776, {6.5880, 5.9328, -1.9656}},
{8800, {6.5880, 7.5960, -0.3168}},
{8801, {7.0056, 6.4728, -1.4328}},
{8804, {6.5880, 7.2144, -0.0000}},
{8805, {6.5880, 7.2144, -0.0000}},
{8962, {7.2504, 6.7608, -0.0000}},
{8976, {7.0128, 4.4208, -1.0584}},
{8992, {7.2504, 10.0008, 3.6000}},
{8993, {7.2504, 10.0008, 3.6000}},
{9472, {8.5032, 4.0680, -3.2112}},
{9474, {7.5024, 10.9224, 3.6360}},
{9484, {8.5032, 4.0680, 3.6360}},
{9488, {8.5032, 4.0680, 3.6360}},
{9492, {8.5032, 10.9224, -3.2112}},
{9496, {8.5032, 10.9224, -3.2112}},
{9500, {8.5032, 10.9224, 3.6360}},
{9508, {8.5032, 10.9224, 3.6360}},
{9516, {8.5032, 4.0680, 3.6360}},
{9524, {8.5032, 10.9224, -3.2112}},
{9532, {8.5032, 10.9224, 3.6360}},
{9552, {8.5032, 5.1192, -2.1528}},
{9553, {8.5032, 10.9224, 3.6360}},
{9554, {8.5032, 5.1192, 3.6360}},
{9555, {8.5032, 4.0680, 3.6360}},
{9556, {8.5032, 5.1192, 3.6360}},
{9557, {8.5032, 5.1192, 3.6360}},
{9558, {8.5032, 4.0680, 3.6360}},
{9559, {8.5032, 5.1192, 3.6360}},
{9560, {8.5032, 10.9224, -2.1528}},
{9561, {8.5032, 10.9224, -3.2112}},
{9562, {8.5032, 10.9224, -2.1528}},
{9563, {8.5032, 10.9224, -2.1528}},
{9564, {8.5032, 10.9224, -3.2112}},
{9565, {8.5032, 10.9224, -2.1528}},
{9566, {8.5032, 10.9224, 3.6360}},
{9567, {8.5032, 10.9224, 3.6360}},
{9568, {8.5032, 10.9224, 3.6360}},
{9569, {8.5032, 10.9224, 3.6360}},
{9570, {8.5032, 10.9224, 3.6360}},
{9571, {8.5032, 10.9224, 3.6360}},
{9572, {8.5032, 5.1192, 3.6360}},
{9573, {8.5032, 4.0680, 3.6360}},
{9574, {8.5032, 5.1192, 3.6360}},
{9575, {8.5032, 10.9224, -2.1528}},
{9576, {8.5032, 10.9224, -3.2112}},
{9577, {8.5032, 10.9224, -2.1528}},
{9578, {8.5032, 10.9224, 3.6360}},
{9579, {8.5032, 10.9224, 3.6360}},
{9580, {8.5032, 10.9224, 3.6360}},
{9600, {8.5032, 10.9224, -3.6360}},
{9604, {8.5032, 3.6360, 3.6360}},
{9608, {8.5032, 10.9224, 3.6360}},
{9612, {8.5032, 10.9224, 3.6360}},
{9616, {8.5032, 10.9224, 3.6360}},
{9617, {8.5032, 9.9576, 3.0672}},
{9618, {8.5032, 9.9576, 3.0672}},
{9619, {8.7480, 9.9576, 3.6432}},
{9632, {7.2504, 6.4944, -0.6840}},
{9633, {7.2504, 7.1784, -0.0000}},
{9642, {4.2552, 5.2200, -2.2464}},
{9643, {4.2552, 5.2200, -2.2464}},
{9644, {12.0024, 3.6072, -0.0000}},
{9650, {11.8800, 7.0200, -0.0000}},
{9658, {11.8800, 7.0056, 0.1584}},
{9660, {11.8800, 6.8616, 0.1584}},
{9668, {11.8800, 7.0056, 0.1584}},
{9674, {5.9328, 8.4384, -0.0000}},
{9675, {7.2504, 6.2424, -0.9504}},
{9676, {7.1352, 6.4872, -0.5040}},
{9679, {7.2504, 5.9688, -0.8064}},
{9688, {7.2504, 6.7680, -0.0000}},
{9689, {7.2504, 6.7680, -0.0000}},
{9702, {4.2552, 5.1840, -2.2824}},
{9786, {12.2544, 7.0056, 0.1584}},
{9787, {12.6288, 7.0056, 0.1584}},
{9788, {11.0016, 6.3504, 0.8280}},
{9792, {9.0000, 6.7608, -0.4680}},
{9794, {9.0000, 6.7680, -1.4688}},
{9824, {6.3792, 7.2144, -0.0000}},
{9827, {7.8768, 7.1640, -0.0000}},
{9829, {7.1280, 6.7104, 0.1368}},
{9830, {6.1272, 7.1640, 0.1440}},
{9834, {6.0048, 6.7608, -0.1728}},
{9835, {9.0000, 6.7896, 0.2520}},
{9839, {6.0048, 8.6976, 1.1736}},
{11360, {6.6744, 8.2584, -0.0000}},
{11361, {2.6640, 8.6976, -0.0000}},
{11362, {6.6744, 8.2584, -0.0000}},
{11363, {8.0064, 8.2584, -0.0000}},
{11364, {8.6688, 8.2584, 2.4912}},
{11365, {6.6744, 8.6976, 2.4840}},
{11366, {3.3336, 8.6976, 2.4840}},
{11367, {8.6688, 8.2584, 2.3904}},
{11368, {6.6744, 8.6976, 2.3904}},
{11369, {8.0064, 8.2584, 2.3904}},
{11370, {6.0048, 8.6976, 2.3904}},
{11371, {7.3296, 8.2584, 2.3904}},
{11372, {6.0048, 6.3432, 2.3904}},
{11373, {8.7912, 8.3808, 0.1152}},
{11377, {7.1640, 6.4584, -0.0000}},
{11378, {12.4488, 8.3808, -0.0000}},
{11379, {10.0944, 6.4584, -0.0000}},
{11380, {6.0048, 6.4080, -0.0000}},
{11381, {6.9264, 8.2584, -0.0000}},
{11382, {5.1048, 6.3432, -0.0000}},
{11383, {7.7832, 6.4800, 0.1152}},
{11799, {3.9960, 5.2920, -0.8136}},
{42775, {0.0000, 8.6976, -5.5656}},
{42776, {0.0000, 8.6976, -5.9472}},
{42777, {0.0000, 8.6976, -6.5592}},
{42778, {0.0000, 8.6976, -6.5592}},
{42779, {6.0048, 11.1960, -6.0480}},
{42780, {6.0048, 11.1960, -6.0480}},
{42781, {3.3336, 11.7000, -5.4720}},
{42782, {3.3336, 11.7000, -5.4720}},
{42783, {3.3336, 8.6976, -2.4696}},
{42784, {0.0000, 8.6976, -6.6168}},
{42785, {0.0000, 2.0808, -0.0000}},
{42888, {3.9960, -0.8208, 2.4912}},
{42889, {3.3336, 6.3432, -1.1808}},
{42890, {5.2488, 5.1192, -1.4328}},
{42891, {2.2896, 8.6976, -3.5208}},
{42892, {2.2896, 8.6976, -4.9680}}
};
const std::unordered_map SYMBOLA_DIM = {
{1, {6.7536, 8.7552, -0.0000}},
{13, {3.0024, 0.0000, -0.0000}},
{32, {3.0024, 0.0000, -0.0000}},
{33, {3.9960, 8.5896, -0.0000}},
{34, {4.7376, 7.8408, -4.5144}},
{35, {6.0048, 7.4088, 0.7128}},
{36, {5.6520, 8.4744, 0.6336}},
{37, {9.7416, 9.2448, 0.7920}},
{38, {9.3312, 8.5824, 0.2664}},
{39, {3.1392, 7.8408, -4.5144}},
{40, {3.9960, 8.8704, 2.0520}},
{41, {3.9888, 8.8704, 2.0520}},
{42, {5.6520, 9.1512, -4.2912}},
{43, {9.3168, 7.0776, 0.2592}},
{44, {3.0024, 1.2744, 2.3184}},
{45, {4.4928, 3.6504, -3.1680}},
{46, {3.0024, 1.2744, -0.0000}},
{47, {3.3336, 8.8848, 2.0592}},
{48, {5.9976, 8.1288, 0.2664}},
{49, {5.9976, 8.1360, -0.0000}},
{50, {5.9976, 8.1288, -0.0000}},
{51, {5.9976, 8.1288, 0.2664}},
{52, {5.9976, 8.2728, -0.0000}},
{53, {5.9976, 8.1288, 0.2664}},
{54, {5.9976, 8.1288, 0.2664}},
{55, {5.9976, 8.2656, 0.2592}},
{56, {5.9976, 8.1288, 0.2664}},
{57, {5.9976, 8.1288, 0.2664}},
{58, {3.1896, 5.0184, -0.0000}},
{59, {3.1968, 5.0184, 2.3184}},
{60, {9.3168, 6.8688, 0.0576}},
{61, {9.3168, 4.8384, -1.9872}},
{62, {9.3168, 6.8832, 0.0504}},
{63, {5.3280, 8.4600, -0.0000}},
{64, {8.9064, 6.6240, 1.7496}},
{65, {8.6976, 8.2656, 0.0072}},
{66, {7.8912, 7.8624, -0.0000}},
{67, {7.8192, 8.1432, 0.2520}},
{68, {8.5536, 7.8624, -0.0000}},
{69, {7.9416, 7.8624, -0.0000}},
{70, {7.4448, 7.8696, -0.0000}},
{71, {8.6256, 8.1432, 0.2520}},
{72, {8.6760, 7.8840, -0.0000}},
{73, {4.3128, 7.8840, -0.0000}},
{74, {5.6808, 7.8912, 0.2520}},
{75, {8.8992, 7.8840, -0.0000}},
{76, {7.1208, 7.8840, -0.0000}},
{77, {10.5048, 7.8696, -0.0000}},
{78, {8.6760, 7.8840, -0.0000}},
{79, {8.4600, 8.1432, 0.2520}},
{80, {7.5888, 7.8696, -0.0000}},
{81, {8.5392, 8.1432, 2.2392}},
{82, {8.8344, 7.8624, 0.2520}},
{83, {5.9040, 8.1432, 0.2520}},
{84, {8.2800, 7.8696, -0.0000}},
{85, {8.6760, 7.8840, 0.2520}},
{86, {8.9928, 7.8912, 0.2520}},
{87, {12.2256, 7.8912, 0.2520}},
{88, {8.8920, 7.8912, -0.0000}},
{89, {9.1800, 7.8840, -0.0000}},
{90, {6.6096, 7.8624, -0.0000}},
{91, {3.9960, 8.8632, 2.0520}},
{92, {3.3336, 8.8848, 2.0592}},
{93, {3.9960, 8.8632, 2.0520}},
{94, {5.3136, 7.9704, -5.7960}},
{95, {5.9976, -2.0880, 2.5920}},
{96, {3.1392, 7.8408, -4.5144}},
{97, {6.2640, 5.6232, 0.1440}},
{98, {6.7968, 8.6976, 0.1440}},
{99, {5.3928, 5.6232, 0.1440}},
{100, {6.7896, 8.6976, 0.1440}},
{101, {5.4648, 5.6232, 0.1440}},
{102, {4.6728, 8.8344, -0.0000}},
{103, {6.3360, 5.6808, 2.5776}},
{104, {6.9192, 8.6976, 0.0072}},
{105, {3.2904, 8.1360, -0.0000}},
{106, {3.4416, 8.1360, 2.5704}},
{107, {6.6744, 8.7048, -0.0000}},
{108, {3.3912, 8.7048, -0.0000}},
{109, {10.3968, 5.5368, 0.0072}},
{110, {6.9192, 5.5368, 0.0072}},
{111, {6.1704, 5.6232, 0.1440}},
{112, {6.7968, 5.5368, 2.4336}},
{113, {6.7896, 5.5368, 2.4336}},
{114, {4.8168, 5.5440, -0.0000}},
{115, {4.7088, 5.6232, 0.1440}},
{116, {4.5360, 7.7112, 0.1440}},
{117, {6.9192, 5.5440, 0.1440}},
{118, {6.7392, 5.4072, 0.1440}},
{119, {9.2016, 5.4072, 0.1440}},
{120, {6.9264, 5.4072, -0.0000}},
{121, {6.7392, 5.4072, 2.5704}},
{122, {5.2992, 5.4072, -0.0000}},
{123, {5.7528, 8.8704, 2.0520}},
{124, {2.3976, 8.8848, 2.0592}},
{125, {5.7528, 8.8704, 2.0520}},
{126, {6.1992, 4.1904, -2.2248}},
{160, {3.0024, 0.0000, -0.0000}},
{161, {3.9960, 6.1200, 2.4696}},
{162, {5.3928, 8.4744, 0.6336}},
{163, {6.1560, 8.1000, 0.1440}},
{164, {6.0048, 6.2280, -0.5832}},
{165, {9.1800, 7.8840, -0.0000}},
{166, {2.2608, 8.8704, 2.0520}},
{167, {5.6520, 7.9704, 1.8792}},
{168, {3.8448, 8.2512, -7.0560}},
{169, {8.9280, 7.1280, 0.7056}},
{170, {4.8168, 7.2504, -3.2976}},
{171, {6.6816, 5.0616, 0.1296}},
{172, {9.3240, 4.2696, -1.0584}},
{173, {4.4928, 3.6504, -3.1680}},
{174, {8.9280, 7.1280, 0.7056}},
{175, {5.9976, 8.4528, -7.9488}},
{176, {4.5144, 8.2584, -4.8744}},
{177, {9.3168, 7.3296, -0.0000}},
{178, {4.6872, 8.9208, -3.3912}},
{179, {4.6944, 8.9208, -3.2184}},
{180, {2.2176, 8.7984, -6.5304}},
{181, {6.5592, 5.4072, 2.4480}},
{182, {5.6520, 7.5312, 2.3904}},
{183, {3.0024, 4.5648, -3.2904}},
{184, {2.7216, 0.0288, 2.3544}},
{185, {4.6944, 8.9280, -3.3840}},
{186, {4.7520, 7.2504, -3.2976}},
{187, {6.6816, 5.0616, 0.1296}},
{188, {10.0944, 8.9280, 1.9368}},
{189, {10.0944, 8.9208, 1.9296}},
{190, {10.0944, 8.9208, 1.9368}},
{191, {5.3280, 6.1200, 2.3400}},
{215, {9.3240, 6.4944, -0.3312}},
{216, {8.4600, 9.1800, 1.3176}},
{230, {8.7552, 5.6160, 0.1440}},
{231, {5.3928, 5.6304, 2.3400}},
{240, {5.9976, 8.3232, 0.1368}},
{247, {9.3168, 6.6960, -0.1224}},
{248, {6.1704, 6.7464, 1.2816}},
{295, {6.9192, 8.6976, 0.0072}},
{305, {3.2904, 5.5440, -0.0000}},
{331, {6.8184, 5.5440, 2.5704}},
{339, {9.6696, 5.6160, 0.1440}},
{402, {6.0552, 8.4672, 2.4696}},
{411, {6.5592, 8.8344, 0.1656}},
{448, {3.4776, 8.1864, 0.2952}},
{449, {5.9400, 8.1864, 0.2952}},
{450, {6.8760, 8.1792, 0.3024}},
{451, {3.9960, 8.5896, -0.0000}},
{567, {3.4488, 5.5440, 2.5704}},
{568, {10.1952, 8.6976, 0.1440}},
{569, {10.1520, 5.5368, 2.4336}},
{572, {5.3928, 6.7176, 1.2456}},
{576, {5.3568, 5.4072, 1.2816}},
{592, {6.2640, 5.6232, 0.1440}},
{593, {6.7896, 5.5368, 0.1440}},
{594, {6.7896, 5.5368, 0.1440}},
{595, {6.7968, 8.4168, 0.1440}},
{596, {5.3928, 5.6232, 0.1440}},
{597, {5.3928, 5.6232, 1.4688}},
{598, {6.7896, 8.6976, 2.5992}},
{599, {7.7616, 8.4168, 0.1440}},
{600, {5.4648, 5.6232, 0.1440}},
{601, {5.4648, 5.6232, 0.1440}},
{602, {7.9200, 6.9264, 0.1440}},
{603, {5.1696, 5.6232, 0.1440}},
{604, {5.1696, 5.6232, 0.1440}},
{605, {7.5096, 6.9264, 0.1440}},
{606, {5.7240, 5.6232, 0.1440}},
{607, {3.4992, 5.5440, 2.5704}},
{608, {7.7472, 8.4168, 2.5920}},
{609, {6.7968, 5.5368, 2.5920}},
{610, {6.6456, 5.5944, 0.1728}},
{611, {6.7392, 5.4072, 2.5920}},
{612, {6.1560, 5.4072, 0.1440}},
{613, {6.9192, 5.4072, 2.5920}},
{614, {6.9192, 8.4168, 0.0072}},
{615, {6.8184, 8.4240, 2.5704}},
{616, {3.3912, 8.1360, 0.0072}},
{617, {4.3848, 5.5440, 0.1440}},
{618, {3.3840, 5.4144, -0.0000}},
{619, {4.1328, 8.7048, -0.0000}},
{620, {4.3920, 8.6976, 0.0072}},
{621, {3.8880, 8.6976, 2.5920}},
{622, {6.7248, 8.7048, 2.1888}},
{623, {10.3968, 5.4072, 0.1368}},
{624, {10.3968, 5.4072, 2.5920}},
{625, {10.3104, 5.5440, 2.5704}},
{626, {7.0704, 5.5440, 2.5704}},
{627, {7.9488, 5.5440, 2.5704}},
{628, {6.7968, 5.4216, -0.0000}},
{629, {6.1704, 5.6232, 0.1440}},
{630, {8.7120, 5.6016, 0.1728}},
{631, {8.3088, 5.8320, 0.1152}},
{632, {6.9984, 7.7832, 2.3472}},
{633, {4.8240, 5.4072, 0.1368}},
{634, {4.8240, 7.8696, 0.1368}},
{635, {5.8464, 5.4072, 2.5704}},
{636, {4.8168, 5.5440, 2.4264}},
{637, {4.8168, 5.5440, 2.5704}},
{638, {4.8168, 5.5368, 0.0072}},
{639, {4.8168, 5.5368, 2.3472}},
{640, {6.8328, 5.4072, 0.1728}},
{641, {6.8328, 5.5872, -0.0000}},
{642, {4.7088, 5.6232, 2.5920}},
{643, {5.6664, 8.8344, 2.2968}},
{644, {5.6664, 8.8344, 2.2968}},
{645, {5.3640, 5.5368, 2.2968}},
{646, {5.9472, 8.8344, 2.5920}},
{647, {4.5360, 7.7112, 0.1440}},
{648, {4.5504, 7.7184, 2.5704}},
{649, {6.9624, 5.5440, 0.1440}},
{650, {6.5088, 5.4072, 0.1440}},
{651, {7.0200, 5.5728, 0.1440}},
{652, {6.7392, 5.5440, -0.0000}},
{653, {9.2016, 5.5512, -0.0000}},
{654, {6.7392, 7.9776, -0.0000}},
{655, {7.0632, 5.4144, 0.0144}},
{656, {7.0272, 5.4000, 2.5920}},
{657, {5.4792, 5.4072, 1.4688}},
{658, {5.5584, 5.4072, 2.1888}},
{659, {5.5584, 5.4072, 2.5920}},
{660, {5.1696, 8.4240, -0.0000}},
{661, {5.1696, 8.4240, -0.0000}},
{662, {5.1696, 8.2800, 0.1440}},
{663, {5.3928, 5.6232, 2.3544}},
{664, {7.1424, 6.3792, 0.1440}},
{665, {6.5448, 5.4072, -0.0000}},
{666, {5.7240, 5.6232, 0.1440}},
{667, {7.9920, 8.4240, 0.1728}},
{668, {6.9048, 5.4072, -0.0000}},
{669, {3.4488, 8.1360, 2.5704}},
{670, {6.6744, 5.4072, 2.5920}},
{671, {5.7744, 5.3784, -0.0000}},
{672, {7.7616, 8.4168, 2.4336}},
{673, {5.1696, 8.4168, 0.0072}},
{674, {5.1696, 8.4168, 0.0072}},
{675, {10.0080, 8.6976, 0.1440}},
{676, {10.1304, 8.7048, 2.1888}},
{677, {10.1880, 8.6976, 1.4688}},
{678, {8.3232, 7.7112, 0.1440}},
{679, {8.1216, 8.8344, 2.2968}},
{680, {9.0072, 7.7112, 1.4688}},
{681, {10.3608, 8.8344, 2.5704}},
{682, {6.7608, 8.6976, 0.1440}},
{683, {6.6024, 8.7048, -0.0000}},
{684, {9.2088, 7.7472, 0.1440}},
{685, {8.5104, 7.8696, -0.1512}},
{686, {8.2008, 5.5368, 2.5920}},
{687, {9.1800, 5.5440, 2.5704}},
{688, {5.3064, 9.3024, -3.3912}},
{689, {5.3064, 9.1152, -3.3912}},
{690, {2.7072, 8.9208, -1.6848}},
{691, {3.7368, 7.2000, -3.3840}},
{692, {3.7368, 7.1064, -3.2904}},
{693, {4.5000, 7.1208, -1.6848}},
{694, {5.2344, 7.2216, -3.3912}},
{695, {7.0200, 7.1208, -3.2976}},
{696, {5.1696, 7.1208, -1.6848}},
{697, {3.1392, 9.4032, -6.0768}},
{698, {4.7376, 9.4032, -6.0768}},
{699, {3.9960, 8.7696, -6.4584}},
{700, {3.9960, 8.7624, -6.4512}},
{701, {3.9960, 8.7624, -6.4512}},
{702, {4.0032, 8.7336, -6.4872}},
{703, {3.9960, 8.7336, -6.4872}},
{704, {3.9960, 9.1080, -3.3912}},
{705, {3.9960, 9.1080, -3.3912}},
{706, {6.7680, 6.8688, -1.0944}},
{707, {6.7680, 6.8688, -1.0944}},
{708, {6.7680, 7.1424, -0.8352}},
{709, {6.7680, 7.1424, -0.8352}},
{710, {3.9960, 8.6112, -6.7392}},
{711, {3.9960, 8.6112, -6.7392}},
{712, {3.9960, 8.6112, -6.6672}},
{713, {3.9960, 7.9848, -7.2360}},
{714, {3.9960, 8.6112, -6.5880}},
{715, {3.9960, 8.6112, -6.5880}},
{716, {3.9960, -0.5184, 2.4624}},
{717, {4.0032, -0.8784, 1.6272}},
{718, {3.9960, -0.5400, 2.5632}},
{719, {3.9960, -0.5400, 2.5632}},
{720, {3.3336, 5.4432, -0.0000}},
{721, {3.3336, 5.4432, -4.2408}},
{722, {4.0032, 2.8296, -0.5832}},
{723, {3.9960, 2.8296, -0.5832}},
{724, {3.9960, 2.9880, -1.0440}},
{725, {3.9960, 2.9880, -1.0368}},
{726, {3.9960, 2.9880, -1.0440}},
{727, {4.0032, 2.7648, -1.8936}},
{728, {3.9960, 8.4312, -6.8328}},
{729, {3.9960, 8.2080, -7.0128}},
{730, {3.9888, 8.6040, -6.6024}},
{731, {3.9960, 0.3528, 2.5128}},
{732, {3.9960, 8.2728, -7.0848}},
{733, {3.9960, 8.6112, -6.5808}},
{734, {3.9960, 4.6872, -2.3832}},
{735, {4.5792, 8.3304, -4.2696}},
{736, {5.1696, 7.1208, -1.6704}},
{737, {2.6640, 9.3096, -3.3912}},
{738, {3.6576, 7.2504, -3.2976}},
{739, {5.3136, 7.1136, -3.3840}},
{740, {3.9960, 9.1152, -3.3912}},
{741, {4.5936, 8.5896, -0.0000}},
{742, {4.5936, 8.5896, -0.0000}},
{743, {4.5936, 8.5896, -0.0000}},
{744, {4.5936, 8.5896, -0.0000}},
{745, {4.5936, 8.5896, -0.0000}},
{746, {3.9960, 5.1552, -0.0000}},
{747, {3.9960, 5.1552, -0.0000}},
{748, {3.9960, -0.6192, 2.5632}},
{749, {3.9960, 8.7048, -6.4584}},
{750, {3.9960, 8.7624, -6.4512}},
{751, {3.9960, -0.5112, 2.5344}},
{752, {3.9960, -0.5112, 2.5344}},
{753, {3.9960, -0.3024, 2.5272}},
{754, {3.9960, -0.3024, 2.5272}},
{755, {3.9960, -0.3168, 2.5632}},
{756, {3.9960, 3.0672, -1.0440}},
{757, {3.9960, 3.0744, -1.0440}},
{758, {3.9960, 3.0744, -1.0440}},
{759, {3.9960, -0.9216, 2.1096}},
{760, {3.3336, 8.1288, -2.4336}},
{761, {3.9960, 7.9416, -5.9904}},
{762, {3.9960, 7.9416, -5.9904}},
{763, {3.9960, -0.5184, 2.4624}},
{764, {3.9960, -0.5184, 2.4624}},
{765, {4.7664, -0.5904, 2.5920}},
{766, {4.7664, -0.5904, 2.5920}},
{767, {3.9960, -0.3024, 2.5344}},
{768, {0.0000, 8.7984, -6.5304}},
{769, {0.0000, 8.7984, -6.5304}},
{770, {0.0000, 8.5464, -6.7392}},
{771, {0.0000, 8.2152, -7.0848}},
{772, {0.0000, 7.7616, -7.2792}},
{773, {0.0000, 8.4528, -7.9488}},
{774, {0.0000, 8.4312, -6.8328}},
{775, {0.0000, 8.2512, -7.0560}},
{776, {0.0000, 8.2512, -7.0560}},
{777, {0.0000, 8.6616, -6.7032}},
{778, {0.0000, 8.6472, -6.6456}},
{779, {0.0000, 8.7840, -6.6384}},
{780, {0.0000, 8.5464, -6.7392}},
{781, {0.0000, 8.6616, -6.7176}},
{782, {0.0000, 8.6616, -6.7176}},
{783, {0.0000, 8.7840, -6.6384}},
{784, {0.0000, 9.0576, -6.2424}},
{785, {0.0000, 8.4240, -6.8256}},
{786, {0.0000, 8.7696, -6.4584}},
{787, {0.0000, 8.7624, -6.4512}},
{788, {0.0000, 8.7624, -6.4512}},
{789, {0.0000, 8.1144, -5.8032}},
{790, {0.0000, -0.3312, 2.5992}},
{791, {0.0000, -0.3312, 2.5992}},
{792, {0.0000, -0.6480, 2.5920}},
{793, {0.0000, -0.6480, 2.5920}},
{794, {0.0000, 8.9352, -5.8896}},
{795, {0.0000, 6.1488, -4.4424}},
{796, {0.0000, -0.3456, 2.5920}},
{797, {0.0000, -0.6480, 2.5920}},
{798, {0.0000, -0.6408, 2.5920}},
{799, {0.0000, -0.6480, 2.5920}},
{800, {0.0000, -1.5192, 2.0016}},
{801, {0.0000, 0.7560, 2.5920}},
{802, {0.0000, 0.7560, 2.5920}},
{803, {0.0000, -1.3968, 2.5920}},
{804, {0.0000, -1.3968, 2.5920}},
{805, {0.0000, -0.3456, 2.5920}},
{806, {0.0000, -0.1872, 2.5920}},
{807, {0.0000, 0.0288, 2.3544}},
{808, {0.0000, 0.1872, 2.4696}},
{809, {0.0000, -0.6480, 2.5920}},
{810, {0.0000, -1.1592, 2.5920}},
{811, {0.0000, -1.3896, 2.5920}},
{812, {0.0000, -0.7848, 2.5920}},
{813, {0.0000, -0.7848, 2.5920}},
{814, {0.0000, -0.9936, 2.5920}},
{815, {0.0000, -0.9936, 2.5920}},
{816, {0.0000, -1.4616, 2.5920}},
{817, {0.0000, -1.5408, 2.0232}},
{818, {0.0000, -1.5408, 2.0232}},
{819, {0.0000, -0.8712, 2.4048}},
{820, {0.0000, 3.7296, -1.7640}},
{821, {0.0000, 2.9808, -2.4984}},
{822, {0.0000, 2.9808, -2.4984}},
{823, {0.0000, 5.6232, 0.1440}},
{824, {0.0000, 8.0712, 2.5920}},
{825, {0.0000, -0.3456, 2.5920}},
{826, {0.0000, -0.9648, 2.4048}},
{827, {0.0000, -0.3816, 2.4048}},
{828, {0.0000, -1.0872, 2.4048}},
{829, {0.0000, 8.9496, -6.3504}},
{830, {0.0000, 9.2376, -6.2280}},
{831, {0.0000, 9.0432, -7.3656}},
{832, {0.0000, 8.5896, -6.5664}},
{833, {0.0000, 8.5896, -6.5664}},
{834, {0.0000, 8.4096, -6.8688}},
{835, {0.0000, 8.5896, -6.3936}},
{836, {0.0000, 8.9496, -6.4224}},
{837, {0.0000, -0.6408, 2.5920}},
{838, {0.0000, 8.0064, -6.9336}},
{839, {0.0000, -0.7488, 2.4048}},
{840, {0.0000, -0.6480, 2.5920}},
{841, {0.0000, -0.6408, 2.5920}},
{842, {0.0000, 8.7624, -6.5160}},
{843, {0.0000, 9.4032, -5.8896}},
{844, {0.0000, 9.1512, -6.1416}},
{845, {0.0000, -0.2304, 2.5920}},
{846, {0.0000, -0.3888, 2.5920}},
{847, {0.0000, 0.0000, -0.0000}},
{848, {0.0000, 8.7912, -6.5088}},
{849, {0.0000, 8.7696, -6.5232}},
{850, {0.0000, 9.0504, -6.2424}},
{851, {0.0000, -0.1584, 2.5920}},
{852, {0.0000, -0.3024, 2.5272}},
{853, {0.0000, -0.3024, 2.5272}},
{854, {0.0000, -0.3024, 2.5272}},
{855, {0.0000, 8.7696, -6.5232}},
{856, {0.0000, 8.2512, -7.0560}},
{857, {0.0000, -0.1224, 2.5920}},
{858, {0.0000, -0.5904, 2.5920}},
{859, {0.0000, 9.0576, -6.2352}},
{860, {0.0000, -0.6552, 2.5920}},
{861, {0.0000, 8.7768, -6.8400}},
{862, {0.0000, 8.2584, -7.7760}},
{863, {0.0000, -1.1664, 1.6488}},
{864, {0.0000, 8.7768, -6.8328}},
{865, {0.0000, 8.7696, -6.8328}},
{866, {0.0000, -0.2232, 2.5920}},
{867, {0.0000, 8.4960, -6.3288}},
{868, {0.0000, 8.4960, -6.3288}},
{869, {0.0000, 9.4104, -6.3864}},
{870, {0.0000, 8.4960, -6.3288}},
{871, {0.0000, 8.4744, -6.3144}},
{872, {0.0000, 8.4960, -6.3288}},
{873, {0.0000, 9.4032, -6.3144}},
{874, {0.0000, 9.4104, -6.3864}},
{875, {0.0000, 8.4816, -6.3864}},
{876, {0.0000, 8.4744, -6.3792}},
{877, {0.0000, 9.2304, -6.3288}},
{878, {0.0000, 8.4384, -6.3288}},
{879, {0.0000, 8.4312, -6.3792}},
{880, {6.7536, 7.8840, -0.0000}},
{881, {4.9752, 5.5512, -0.0000}},
{882, {8.8632, 7.8696, -0.0000}},
{883, {6.5736, 5.4072, 0.0072}},
{884, {2.9664, 8.8704, -4.2336}},
{885, {2.9664, 2.0736, 2.5632}},
{886, {9.5616, 7.8840, -0.0000}},
{887, {6.5736, 5.5440, -0.0000}},
{890, {5.7528, -0.3888, 2.5920}},
{891, {5.3856, 5.6232, 0.1440}},
{892, {5.3928, 5.6232, 0.1440}},
{893, {5.3856, 5.6232, 0.1440}},
{894, {3.1392, 4.8744, 2.1816}},
{895, {5.6808, 7.8840, 1.4832}},
{900, {3.2976, 8.7984, -6.6240}},
{901, {3.3624, 9.4104, -6.6240}},
{902, {8.6976, 8.2656, 0.0072}},
{903, {3.0024, 5.6232, -4.3488}},
{904, {10.3464, 8.0208, -0.0000}},
{905, {11.0808, 8.0208, -0.0000}},
{906, {6.7176, 8.0208, -0.0000}},
{908, {10.2816, 8.1432, 0.2520}},
{910, {10.7496, 8.0280, -0.0000}},
{911, {9.9216, 8.1432, -0.0000}},
{912, {4.3776, 9.4032, 0.1440}},
{913, {8.6976, 8.2656, 0.0072}},
{914, {7.8912, 7.8624, -0.0000}},
{915, {7.1208, 7.8696, -0.0000}},
{916, {7.0416, 8.2656, -0.0000}},
{917, {7.9416, 7.8624, -0.0000}},
{918, {6.6096, 7.8624, -0.0000}},
{919, {8.6760, 7.8840, -0.0000}},
{920, {8.4600, 8.1432, 0.2520}},
{921, {4.3128, 7.8840, -0.0000}},
{922, {8.8992, 7.8840, -0.0000}},
{923, {8.0496, 8.2656, -0.0000}},
{924, {10.5048, 7.8696, -0.0000}},
{925, {8.6760, 7.8840, -0.0000}},
{926, {7.5168, 7.8624, -0.0000}},
{927, {8.4600, 8.1432, 0.2520}},
{928, {8.6760, 7.8696, -0.0000}},
{929, {7.5888, 7.8696, -0.0000}},
{931, {7.8192, 7.8624, -0.0000}},
{932, {8.2800, 7.8696, -0.0000}},
{933, {8.4600, 8.0280, -0.0000}},
{934, {8.1648, 7.9056, -0.0000}},
{935, {8.8920, 7.8912, -0.0000}},
{936, {8.4384, 7.9056, -0.0000}},
{937, {8.1000, 8.1432, -0.0000}},
{938, {4.3200, 9.4104, -0.0000}},
{939, {8.4600, 9.4104, -0.0000}},
{940, {7.2000, 8.7984, 0.1440}},
{941, {5.1696, 8.7984, 0.1440}},
{942, {6.4296, 8.7984, 2.5056}},
{943, {4.3848, 8.7984, 0.1440}},
{944, {6.4584, 9.4032, 0.1440}},
{945, {7.2000, 5.5368, 0.1440}},
{946, {5.5656, 8.6112, 2.4480}},
{947, {5.4792, 5.4072, 2.4192}},
{948, {5.4432, 8.6832, 0.1440}},
{949, {5.1696, 5.6232, 0.1440}},
{950, {4.8960, 8.5320, 2.5704}},
{951, {6.4296, 5.6232, 2.5056}},
{952, {5.7384, 8.7192, 0.1440}},
{953, {4.3848, 5.5440, 0.1440}},
{954, {6.6816, 5.5440, -0.0000}},
{955, {6.1128, 8.7192, 0.1440}},
{956, {6.5592, 5.4072, 2.4480}},
{957, {6.0408, 5.6232, 0.1440}},
{958, {5.4792, 8.4960, 2.5848}},
{959, {5.8464, 5.6232, 0.1440}},
{960, {6.6456, 5.4072, 0.1224}},
{961, {5.7960, 5.6232, 2.4480}},
{962, {5.2992, 5.6232, 2.5560}},
{963, {6.3720, 5.4000, 0.1440}},
{964, {5.4864, 5.4000, 0.1440}},
{965, {6.4584, 5.5728, 0.1440}},
{966, {7.0344, 5.5224, 2.4120}},
{967, {5.5800, 5.6232, 2.4840}},
{968, {7.3440, 5.6232, 2.4192}},
{969, {7.7760, 5.6088, 0.1440}},
{970, {4.3776, 7.9056, 0.1440}},
{971, {6.4584, 7.9056, 0.1440}},
{972, {5.8464, 8.7984, 0.1440}},
{973, {6.4584, 8.7984, 0.1440}},
{974, {7.7760, 8.7984, 0.1440}},
{975, {8.8992, 7.8840, 2.4264}},
{976, {5.8968, 8.3952, 0.1440}},
{977, {7.0632, 8.8344, 0.1224}},
{978, {9.1800, 7.8840, -0.0000}},
{979, {11.4120, 8.0208, -0.0000}},
{980, {9.1800, 9.4104, -0.0000}},
{981, {7.0344, 6.5808, 2.4120}},
{982, {9.7632, 5.4000, 0.1440}},
{983, {6.2568, 5.6160, 2.5920}},
{984, {8.4600, 8.1432, 2.5920}},
{985, {6.1704, 5.6232, 2.5920}},
{986, {6.7392, 8.3088, 2.5920}},
{987, {7.4088, 5.4072, 2.5560}},
{988, {7.1208, 7.8696, -0.0000}},
{989, {5.4072, 5.4072, 2.4408}},
{990, {5.3280, 8.4456, 2.5920}},
{991, {4.7736, 6.5232, 2.5848}},
{992, {8.6400, 8.2656, -0.0000}},
{993, {7.2504, 5.5224, 0.1656}},
{994, {9.8712, 8.1432, 2.5920}},
{995, {7.5816, 5.6088, 2.5920}},
{996, {9.1872, 8.1432, -0.0000}},
{997, {7.0560, 5.6232, -0.0000}},
{998, {8.9784, 7.8912, 2.5920}},
{999, {6.9264, 7.5096, 0.1440}},
{1000, {5.9616, 8.1432, 0.2520}},
{1001, {5.4360, 5.6232, 2.5920}},
{1002, {8.6688, 8.1432, -0.0000}},
{1003, {5.8824, 5.6232, -0.0000}},
{1004, {9.9288, 8.3088, 0.2520}},
{1005, {6.8904, 5.8536, 0.1440}},
{1006, {7.5312, 7.8840, -0.0000}},
{1007, {5.6808, 5.4144, -0.0000}},
{1008, {6.2568, 5.6160, 0.1440}},
{1009, {5.8464, 5.6232, 2.5920}},
{1010, {5.3928, 5.6232, 0.1440}},
{1011, {3.4488, 5.5440, 2.5704}},
{1012, {8.4672, 8.1432, 0.2520}},
{1013, {5.3928, 5.6232, 0.1440}},
{1014, {5.3928, 5.6232, 0.1440}},
{1015, {6.3000, 7.9056, -0.0000}},
{1016, {5.8032, 8.2152, 2.4480}},
{1017, {7.8192, 8.1432, 0.2520}},
{1018, {12.2184, 8.1360, -0.0000}},
{1019, {8.9712, 5.6232, 0.1440}},
{1020, {5.7960, 5.6232, 2.5272}},
{1021, {7.8192, 8.1432, 0.2520}},
{1022, {7.8192, 8.1432, 0.2520}},
{1023, {7.8120, 8.1432, 0.2520}},
{1024, {7.9416, 9.4104, -0.0000}},
{1025, {7.9344, 9.4104, -0.0000}},
{1026, {9.7776, 7.8624, 0.1152}},
{1027, {7.1208, 9.4104, -0.0000}},
{1028, {7.8192, 8.1432, 0.2520}},
{1029, {5.9040, 8.1432, 0.2520}},
{1030, {4.3128, 7.8840, -0.0000}},
{1031, {4.3200, 9.4104, -0.0000}},
{1032, {5.6808, 7.8912, 0.2520}},
{1033, {12.2688, 7.8624, -0.0000}},
{1034, {11.9592, 7.8840, -0.0000}},
{1035, {9.6480, 7.8624, 0.0072}},
{1036, {8.8632, 9.4104, 0.2520}},
{1037, {9.5616, 9.4104, -0.0000}},
{1038, {9.3168, 9.4104, 0.1152}},
{1039, {8.6760, 7.8768, 1.6848}},
{1040, {8.6976, 8.2656, 0.0072}},
{1041, {7.8912, 7.8624, -0.0000}},
{1042, {7.8912, 7.8624, -0.0000}},
{1043, {7.1208, 7.8696, -0.0000}},
{1044, {9.2592, 7.8624, 2.3112}},
{1045, {7.9416, 7.8624, -0.0000}},
{1046, {12.9672, 7.9920, 0.2520}},
{1047, {7.2792, 8.1432, 0.2520}},
{1048, {9.5616, 7.8840, -0.0000}},
{1049, {9.5616, 9.4104, -0.0000}},
{1050, {8.8632, 7.9920, 0.2520}},
{1051, {9.1008, 7.8624, -0.0000}},
{1052, {10.5048, 7.8696, -0.0000}},
{1053, {8.6760, 7.8840, -0.0000}},
{1054, {8.4600, 8.1432, 0.2520}},
{1055, {8.6760, 7.8696, -0.0000}},
{1056, {7.5888, 7.8696, -0.0000}},
{1057, {7.8192, 8.1432, 0.2520}},
{1058, {8.2800, 7.8696, -0.0000}},
{1059, {9.3168, 7.8912, 0.1152}},
{1060, {8.1648, 7.9056, -0.0000}},
{1061, {8.8920, 7.8912, -0.0000}},
{1062, {8.6688, 7.8768, 2.3112}},
{1063, {9.3816, 7.8912, -0.0000}},
{1064, {12.6576, 7.8768, -0.0000}},
{1065, {12.6576, 7.8768, 2.3112}},
{1066, {10.1736, 7.8624, -0.0000}},
{1067, {11.6352, 7.8840, -0.0000}},
{1068, {7.8840, 7.8840, -0.0000}},
{1069, {7.8192, 8.1432, 0.2520}},
{1070, {11.5632, 8.1432, 0.2520}},
{1071, {8.8344, 7.8624, 0.2520}},
{1072, {6.2640, 5.6232, 0.1440}},
{1073, {6.1776, 8.6472, 0.1440}},
{1074, {6.5448, 5.4072, -0.0000}},
{1075, {6.0696, 5.4072, -0.0000}},
{1076, {7.1784, 5.4072, 1.5624}},
{1077, {5.4648, 5.6232, 0.1440}},
{1078, {9.4464, 5.5008, 0.0864}},
{1079, {5.3856, 5.5872, 0.1800}},
{1080, {7.3872, 5.4144, -0.0000}},
{1081, {7.3872, 8.1864, 0.0072}},
{1082, {6.3288, 5.5008, 0.0864}},
{1083, {7.4232, 5.4072, -0.0000}},
{1084, {8.3664, 5.4072, -0.0000}},
{1085, {6.9048, 5.4072, -0.0000}},
{1086, {6.1704, 5.6232, 0.1440}},
{1087, {6.9048, 5.4072, -0.0000}},
{1088, {6.7968, 5.5368, 2.4336}},
{1089, {5.3928, 5.6232, 0.1440}},
{1090, {6.6888, 5.4072, -0.0000}},
{1091, {6.7392, 5.4072, 2.5704}},
{1092, {7.4664, 8.6904, 2.5992}},
{1093, {6.9264, 5.4072, -0.0000}},
{1094, {6.9048, 5.4072, 1.5624}},
{1095, {7.3872, 5.4072, -0.0000}},
{1096, {9.8280, 5.4072, -0.0000}},
{1097, {9.8280, 5.4072, 1.5624}},
{1098, {8.5032, 5.4072, -0.0000}},
{1099, {8.9928, 5.4072, -0.0000}},
{1100, {6.5448, 5.4072, -0.0000}},
{1101, {6.0696, 5.5872, 0.1728}},
{1102, {10.3536, 5.5872, 0.1728}},
{1103, {6.8328, 5.4144, 0.1728}},
{1104, {5.4648, 8.3736, 0.1440}},
{1105, {5.4648, 7.9056, 0.1440}},
{1106, {6.8472, 8.7048, 2.4336}},
{1107, {6.0696, 8.3808, -0.0000}},
{1108, {6.0696, 5.5872, 0.1728}},
{1109, {4.7088, 5.6232, 0.1440}},
{1110, {3.2904, 8.1360, -0.0000}},
{1111, {3.2904, 7.9128, -0.0000}},
{1112, {3.4416, 8.1360, 2.5704}},
{1113, {9.6120, 5.4072, -0.0000}},
{1114, {9.7272, 5.4072, -0.0000}},
{1115, {6.9192, 8.6976, 0.0072}},
{1116, {6.3288, 8.3808, 0.0864}},
{1117, {7.3872, 8.3808, -0.0000}},
{1118, {6.7392, 8.1864, 2.5704}},
{1119, {6.9048, 5.4072, 1.6272}},
{1120, {9.8712, 8.1432, 0.2520}},
{1121, {7.5816, 5.6088, 0.1440}},
{1122, {9.6912, 9.3528, -0.0000}},
{1123, {8.1216, 8.6904, -0.0000}},
{1124, {11.8584, 8.1432, 0.2520}},
{1125, {8.9496, 5.6232, 0.1440}},
{1126, {10.0656, 8.2656, -0.0000}},
{1127, {7.8048, 5.5512, 0.0072}},
{1128, {13.8240, 8.2656, -0.0000}},
{1129, {11.1456, 5.5440, 0.0072}},
{1130, {9.3096, 7.8696, -0.0000}},
{1131, {7.1208, 5.4072, 0.0144}},
{1132, {13.1688, 7.8912, -0.0000}},
{1133, {10.5192, 5.4072, 0.0072}},
{1134, {6.8976, 9.4032, 2.5920}},
{1135, {5.3928, 7.5168, 2.5632}},
{1136, {9.3024, 7.9056, -0.0000}},
{1137, {7.3440, 5.6232, 2.4192}},
{1138, {8.4600, 8.1432, 0.2520}},
{1139, {6.1704, 5.6232, 0.1440}},
{1140, {9.3744, 7.9992, 0.2664}},
{1141, {6.8328, 5.4936, 0.1440}},
{1142, {9.3744, 9.4104, 0.2664}},
{1143, {6.8328, 8.3736, 0.1440}},
{1144, {14.5296, 8.1432, 2.5704}},
{1145, {11.4264, 5.6232, 2.5704}},
{1146, {10.3320, 9.3096, 1.4256}},
{1147, {7.8264, 6.6168, 1.1376}},
{1148, {9.8712, 9.4104, 0.2520}},
{1149, {7.5816, 8.3016, 0.1440}},
{1150, {9.8712, 9.4032, 0.2520}},
{1151, {7.5816, 7.8624, 0.1440}},
{1152, {7.8192, 8.1432, 2.5776}},
{1153, {5.2488, 5.6232, 2.4480}},
{1154, {5.1192, 6.5664, 1.4112}},
{1155, {0.0000, 8.6688, -6.6240}},
{1156, {0.0000, 8.5896, -6.6888}},
{1157, {0.0000, 8.4168, -6.8904}},
{1158, {0.0000, 8.4168, -6.8904}},
{1159, {0.0000, 8.5032, -6.7968}},
{1160, {0.0000, 8.0712, 2.5920}},
{1161, {0.0000, 8.0712, 2.5920}},
{1162, {9.5616, 9.4104, 2.5056}},
{1163, {7.3872, 8.1864, 1.9728}},
{1164, {7.8840, 7.8480, -0.0000}},
{1165, {6.5448, 5.4072, -0.0000}},
{1166, {7.5888, 7.8696, -0.0000}},
{1167, {6.7968, 5.5368, 2.4336}},
{1168, {7.1208, 9.4104, -0.0000}},
{1169, {5.4792, 6.9480, -0.0000}},
{1170, {7.1208, 7.8696, -0.0000}},
{1171, {6.0696, 5.4072, -0.0000}},
{1172, {7.1208, 7.8696, 2.5272}},
{1173, {6.0624, 5.4072, 2.5920}},
{1174, {12.9672, 7.9920, 2.3112}},
{1175, {9.4464, 5.5008, 1.5552}},
{1176, {7.2864, 8.1360, 2.3616}},
{1177, {5.3928, 5.5800, 1.8864}},
{1178, {8.8704, 7.9920, 2.3112}},
{1179, {6.3288, 5.5008, 1.5552}},
{1180, {8.8632, 7.9920, 0.2520}},
{1181, {6.3288, 5.5008, 0.0864}},
{1182, {8.8632, 7.9920, 0.2520}},
{1183, {6.3288, 5.5008, 0.0864}},
{1184, {11.0952, 7.9920, 0.2520}},
{1185, {8.4168, 5.5008, 0.0936}},
{1186, {8.6760, 7.8840, 2.3112}},
{1187, {6.9048, 5.4072, 1.5624}},
{1188, {11.5992, 7.8912, -0.0000}},
{1189, {9.4824, 5.4072, -0.0000}},
{1190, {11.8224, 7.8768, 2.5272}},
{1191, {9.3384, 5.4072, 2.5920}},
{1192, {9.0864, 8.1432, 0.2520}},
{1193, {6.9696, 5.6160, 0.1440}},
{1194, {7.8192, 8.1360, 2.3616}},
{1195, {5.3928, 5.6232, 1.8864}},
{1196, {8.2800, 7.8696, 2.3112}},
{1197, {6.6888, 5.4072, 1.5624}},
{1198, {9.1800, 7.8840, -0.0000}},
{1199, {6.7392, 5.4072, 2.5848}},
{1200, {9.1800, 7.8840, -0.0000}},
{1201, {6.7392, 5.4072, 2.5848}},
{1202, {8.8920, 7.8912, 2.3112}},
{1203, {6.9336, 5.4072, 1.5624}},
{1204, {12.2400, 7.8768, 2.3112}},
{1205, {10.0872, 5.4072, 1.5624}},
{1206, {9.3816, 7.8840, 2.3112}},
{1207, {7.3872, 5.4072, 1.5624}},
{1208, {9.3816, 7.8912, -0.0000}},
{1209, {7.3872, 5.4144, -0.0000}},
{1210, {8.6832, 7.8840, -0.0000}},
{1211, {6.9192, 8.6976, 0.0072}},
{1212, {11.1456, 8.1432, 0.2520}},
{1213, {7.2720, 5.6232, 0.1440}},
{1214, {11.1456, 8.1432, 1.8000}},
{1215, {7.2720, 5.6232, 1.7424}},
{1216, {4.3128, 7.8840, -0.0000}},
{1217, {12.9672, 9.4104, 0.2520}},
{1218, {9.4464, 8.1864, 0.0864}},
{1219, {8.8704, 7.9992, 2.5272}},
{1220, {6.3288, 5.5008, 2.5920}},
{1221, {9.1008, 7.8624, 2.5056}},
{1222, {7.4232, 5.4072, 1.9728}},
{1223, {8.6760, 7.8840, 2.5920}},
{1224, {6.9048, 5.4072, 2.5848}},
{1225, {9.5616, 7.8840, 2.5056}},
{1226, {7.3872, 5.4072, 1.9728}},
{1227, {9.3816, 7.8840, 2.3112}},
{1228, {7.3872, 5.4072, 1.5624}},
{1229, {10.5048, 7.8696, 2.5056}},
{1230, {8.3664, 5.4072, 1.9728}},
{1231, {3.3840, 5.4144, -0.0000}},
{1232, {8.6976, 9.4032, 0.0072}},
{1233, {6.2640, 8.1864, 0.1440}},
{1234, {8.6976, 9.4032, 0.0072}},
{1235, {6.2640, 7.9056, 0.1440}},
{1236, {10.5120, 7.8696, -0.0000}},
{1237, {8.7552, 5.6160, 0.1440}},
{1238, {7.9344, 9.4104, -0.0000}},
{1239, {5.4648, 8.1864, 0.1440}},
{1240, {8.4600, 8.1432, 0.2520}},
{1241, {5.4648, 5.6232, 0.1440}},
{1242, {8.4600, 9.4104, 0.2520}},
{1243, {5.4648, 7.9056, 0.1440}},
{1244, {12.9672, 9.4104, 0.2520}},
{1245, {9.4464, 7.9128, 0.0864}},
{1246, {7.2864, 9.4104, 0.2520}},
{1247, {5.3928, 7.9128, 0.1800}},
{1248, {6.9120, 7.8624, 0.2520}},
{1249, {5.5584, 5.4072, 2.1888}},
{1250, {9.5616, 9.3528, -0.0000}},
{1251, {7.3872, 7.5744, -0.0000}},
{1252, {9.5616, 9.4104, -0.0000}},
{1253, {7.3872, 7.9128, -0.0000}},
{1254, {8.4600, 9.4104, 0.2520}},
{1255, {6.1704, 7.9056, 0.1440}},
{1256, {8.4672, 8.1432, 0.2520}},
{1257, {6.1704, 5.6232, 0.1440}},
{1258, {8.4672, 9.4104, 0.2520}},
{1259, {6.1704, 7.9056, 0.1440}},
{1260, {7.8264, 9.4104, 0.2520}},
{1261, {6.6888, 7.9128, 0.1728}},
{1262, {9.3168, 9.3528, 0.1152}},
{1263, {6.7392, 7.5744, 2.5704}},
{1264, {9.3168, 9.4104, 0.1152}},
{1265, {6.7392, 7.9128, 2.5704}},
{1266, {9.3168, 9.4104, 0.1152}},
{1267, {6.7392, 8.3808, 2.5704}},
{1268, {9.3816, 9.4104, -0.0000}},
{1269, {7.3872, 7.9056, -0.0000}},
{1270, {7.1208, 7.8624, 2.3112}},
{1271, {6.0696, 5.4072, 1.5624}},
{1272, {11.6352, 9.4104, -0.0000}},
{1273, {8.9928, 7.9056, -0.0000}},
{1274, {7.1208, 7.8696, 2.5704}},
{1275, {6.0696, 5.4072, 2.5704}},
{1276, {8.8920, 7.8840, 2.5200}},
{1277, {6.9336, 5.4144, 2.5272}},
{1278, {8.8920, 7.8912, -0.0000}},
{1279, {6.9264, 5.4072, -0.0000}},
{1280, {7.5888, 7.8696, -0.0000}},
{1281, {6.7896, 8.6976, 0.1440}},
{1282, {10.7712, 7.8696, 0.2520}},
{1283, {10.2096, 8.6976, 0.1440}},
{1284, {11.2680, 8.1432, 0.2520}},
{1285, {9.2520, 5.5800, 0.1440}},
{1286, {7.5456, 8.1432, 2.3112}},
{1287, {5.9184, 5.5800, 1.5624}},
{1288, {12.2184, 7.8624, 0.2520}},
{1289, {10.6128, 5.4072, 0.1440}},
{1290, {11.8440, 7.8840, 0.2520}},
{1291, {10.2888, 5.4072, 0.1440}},
{1292, {8.3232, 8.1432, 0.2520}},
{1293, {6.4440, 5.6232, 0.1440}},
{1294, {9.4104, 7.8696, 0.2520}},
{1295, {8.4816, 5.4000, 0.1440}},
{1296, {7.2936, 8.1432, 0.2520}},
{1297, {5.3928, 5.6232, 0.1440}},
{1298, {9.1008, 7.8696, 2.5272}},
{1299, {7.4232, 5.4072, 2.5704}},
{1300, {13.2408, 7.8912, -0.0000}},
{1301, {10.6200, 5.4072, -0.0000}},
{1302, {10.8360, 7.8912, -0.0000}},
{1303, {9.6624, 5.5368, 2.4336}},
{1304, {12.4704, 7.8624, 0.2520}},
{1305, {9.6048, 5.6232, 0.1728}},
{1306, {8.5392, 8.1432, 2.2392}},
{1307, {6.7896, 5.5368, 2.4336}},
{1308, {12.2256, 7.8912, 0.2520}},
{1309, {9.2016, 5.4072, 0.1440}},
{1310, {8.8632, 7.9920, 0.2520}},
{1311, {6.3288, 5.5008, 0.0864}},
{1312, {12.1968, 7.8696, 2.5272}},
{1313, {9.6624, 5.4072, 2.5920}},
{1314, {11.8224, 7.8912, 2.5272}},
{1315, {9.3384, 5.4072, 2.5920}},
{1316, {8.6760, 7.8696, 2.3112}},
{1317, {6.9048, 5.4072, 1.5624}},
{1318, {8.6760, 7.8840, 2.3112}},
{1319, {6.9192, 8.6976, 1.5624}},
{1320, {10.1088, 7.8912, 2.5272}},
{1321, {7.0848, 5.4144, 2.5704}},
{1322, {18.2736, 7.9920, 2.3112}},
{1323, {13.6440, 5.5008, 1.5552}},
{1324, {9.3816, 7.8840, 2.3112}},
{1325, {7.2288, 5.4072, 1.5624}},
{1326, {9.0432, 7.8624, 2.3112}},
{1327, {7.2288, 5.4072, 1.5624}},
{1632, {7.1352, 4.1904, -1.0224}},
{1633, {7.1352, 7.7832, -0.0000}},
{1634, {7.1352, 7.8696, -0.0000}},
{1635, {7.1352, 7.8696, -0.0000}},
{1636, {7.1352, 7.7472, -0.0000}},
{1637, {7.1352, 6.5016, -1.4112}},
{1638, {7.1352, 7.7112, -0.1800}},
{1639, {7.1352, 7.7112, -0.0000}},
{1640, {7.1352, 7.7832, -0.0792}},
{1641, {7.1352, 7.9056, -0.0000}},
{1645, {6.1632, 9.3456, -4.7160}},
{1780, {7.1352, 7.8408, -0.0504}},
{1781, {7.1352, 7.6752, -0.2160}},
{1782, {7.1352, 7.8048, -0.0504}},
{8192, {5.9976, 0.0000, -0.0000}},
{8193, {12.0024, 9.4104, -9.4032}},
{8194, {5.9976, 0.0000, -0.0000}},
{8195, {12.0024, 9.4104, -9.4032}},
{8196, {4.0032, 0.0000, -0.0000}},
{8197, {3.0024, 0.0000, -0.0000}},
{8198, {2.0016, 0.0000, -0.0000}},
{8199, {5.9976, 0.0000, -0.0000}},
{8200, {3.0024, 0.0000, -0.0000}},
{8201, {1.4976, 0.0000, -0.0000}},
{8202, {0.7488, 0.0000, -0.0000}},
{8203, {0.0000, 0.0000, -0.0000}},
{8204, {0.0000, 0.0000, -0.0000}},
{8205, {0.0000, 0.0000, -0.0000}},
{8206, {0.0000, 0.0000, -0.0000}},
{8207, {0.0000, 0.0000, -0.0000}},
{8208, {4.4928, 3.6504, -3.1680}},
{8209, {4.4928, 3.6504, -3.1680}},
{8210, {5.9976, 3.6504, -3.1680}},
{8211, {5.9976, 3.6504, -3.1680}},
{8212, {12.0024, 3.6504, -3.1680}},
{8213, {9.0000, 3.6504, -3.1680}},
{8214, {4.6224, 8.8848, 2.0592}},
{8215, {5.9976, -0.5688, 2.3400}},
{8216, {3.1392, 7.8264, -4.4496}},
{8217, {3.1392, 7.8408, -4.4640}},
{8218, {2.8224, 1.1952, 2.1816}},
{8219, {3.1392, 7.8408, -4.4640}},
{8220, {5.6448, 7.8264, -4.4496}},
{8221, {5.6448, 7.8408, -4.4640}},
{8222, {5.0184, 1.1952, 2.1816}},
{8223, {5.6520, 7.8408, -4.4640}},
{8224, {5.7528, 8.4312, 2.4192}},
{8225, {5.7600, 8.4240, 2.4264}},
{8226, {4.3272, 5.3424, -1.4832}},
{8227, {3.0024, 4.1976, -1.2816}},
{8228, {4.0032, 0.0504, 1.2744}},
{8229, {8.0064, 0.0504, 1.2744}},
{8230, {12.0096, 0.0504, 1.2744}},
{8231, {3.0096, 3.6000, -1.8864}},
{8232, {0.0000, 0.0000, -0.0000}},
{8233, {0.0000, 0.0000, -0.0000}},
{8234, {0.0000, 0.0000, -0.0000}},
{8235, {0.0000, 0.0000, -0.0000}},
{8236, {0.0000, 0.0000, -0.0000}},
{8237, {0.0000, 0.0000, -0.0000}},
{8238, {0.0000, 0.0000, -0.0000}},
{8239, {1.4976, 0.0000, -0.0000}},
{8240, {13.7304, 9.2448, 0.7920}},
{8241, {17.7120, 9.2448, 0.7920}},
{8242, {2.9664, 9.0072, -4.2984}},
{8243, {5.1048, 9.0072, -4.2984}},
{8244, {7.2144, 9.0072, -4.2984}},
{8245, {2.9664, 9.0072, -4.2984}},
{8246, {5.1048, 9.0072, -4.2984}},
{8247, {7.2144, 9.0072, -4.2984}},
{8248, {4.2336, 1.6344, 2.3112}},
{8249, {4.1976, 5.0616, 0.1296}},
{8250, {4.2048, 5.0616, 0.1296}},
{8251, {7.5528, 5.8032, 0.7776}},
{8252, {6.6960, 8.5896, -0.0000}},
{8253, {5.3280, 8.4600, -0.0000}},
{8254, {5.9976, 9.4104, -8.9064}},
{8255, {5.6736, -1.0152, 2.5920}},
{8256, {5.6736, 9.1152, -7.5384}},
{8257, {5.5800, 6.3648, 2.3112}},
{8258, {10.9944, 8.6688, -0.0000}},
{8259, {3.0024, 3.4416, -2.0232}},
{8260, {0.0000, 8.5320, 1.5912}},
{8261, {3.9960, 8.8632, 2.0520}},
{8262, {3.9960, 8.8632, 2.0520}},
{8263, {10.0152, 8.4600, -0.0000}},
{8264, {9.0936, 8.5896, -0.0000}},
{8265, {9.4176, 8.5896, -0.0000}},
{8266, {6.3072, 7.2072, 2.1384}},
{8267, {5.6520, 7.5384, 2.3832}},
{8268, {8.5320, 6.9336, -0.0000}},
{8269, {8.5320, 6.9336, -0.0000}},
{8270, {5.7816, 3.3984, 0.8784}},
{8271, {3.1968, 5.0184, 2.3184}},
{8272, {8.6472, 6.6672, -0.7848}},
{8273, {5.7816, 8.6688, 0.8784}},
{8274, {8.9136, 8.5320, 1.5912}},
{8275, {6.1992, 4.1904, -2.2248}},
{8276, {5.9760, -1.1304, 2.5920}},
{8277, {3.8664, 4.3056, -1.1592}},
{8278, {4.5936, 5.0184, -0.0000}},
{8279, {9.3240, 9.0072, -4.2984}},
{8280, {5.9904, 5.0184, -0.0000}},
{8281, {6.9408, 5.0184, -0.0000}},
{8282, {3.1896, 7.9488, -0.0000}},
{8283, {9.2736, 8.8272, 2.0016}},
{8284, {6.9408, 5.5872, 0.5616}},
{8285, {3.1896, 7.9488, -0.0000}},
{8286, {3.1896, 9.0504, 2.2392}},
{8287, {2.6640, 0.0000, -0.0000}},
{8288, {0.0000, 0.0000, -0.0000}},
{8289, {0.0000, 0.0000, -0.0000}},
{8290, {0.0000, 0.0000, -0.0000}},
{8291, {0.0000, 0.0000, -0.0000}},
{8292, {0.0000, 0.0000, -0.0000}},
{8294, {0.0000, 0.0000, -0.0000}},
{8295, {0.0000, 0.0000, -0.0000}},
{8296, {0.0000, 0.0000, -0.0000}},
{8297, {0.0000, 0.0000, -0.0000}},
{8298, {0.0000, 0.0000, -0.0000}},
{8299, {0.0000, 0.0000, -0.0000}},
{8300, {0.0000, 0.0000, -0.0000}},
{8301, {0.0000, 0.0000, -0.0000}},
{8302, {0.0000, 0.0000, -0.0000}},
{8303, {0.0000, 0.0000, -0.0000}},
{8304, {4.6872, 8.9208, -3.2184}},
{8305, {2.5920, 8.9784, -3.3912}},
{8308, {4.6944, 9.0216, -3.3840}},
{8309, {4.6872, 8.9136, -3.2184}},
{8310, {4.7016, 8.9208, -3.2184}},
{8311, {4.6944, 9.0000, -3.2112}},
{8312, {4.7016, 8.9208, -3.2184}},
{8313, {4.7016, 8.9208, -3.2184}},
{8314, {7.0992, 8.5248, -2.9088}},
{8315, {7.0992, 5.9328, -5.5008}},
{8316, {7.0992, 7.0848, -4.3632}},
{8317, {3.1104, 9.4176, -2.0304}},
{8318, {3.1032, 9.4176, -2.0304}},
{8319, {5.3064, 7.2072, -3.3912}},
{8320, {4.6872, 3.9528, 1.7496}},
{8321, {4.6944, 3.9456, 1.5912}},
{8322, {4.6872, 3.9456, 1.5768}},
{8323, {4.6944, 3.9528, 1.7496}},
{8324, {4.6944, 4.0392, 1.5840}},
{8325, {4.6872, 3.9456, 1.7496}},
{8326, {4.7016, 3.9528, 1.7496}},
{8327, {4.6944, 4.0320, 1.7496}},
{8328, {4.7016, 3.9528, 1.7496}},
{8329, {4.7016, 3.9528, 1.7496}},
{8330, {7.0992, 3.5568, 2.0592}},
{8331, {7.0992, 0.9648, -0.5328}},
{8332, {7.0992, 2.1096, 0.6120}},
{8333, {3.1104, 4.7952, 2.5920}},
{8334, {3.1032, 4.7952, 2.5920}},
{8336, {4.8168, 2.2752, 1.6704}},
{8337, {4.2192, 2.2752, 1.6704}},
{8338, {4.7520, 2.2752, 1.6704}},
{8339, {5.3136, 2.1384, 1.5912}},
{8340, {4.2192, 2.2824, 1.6704}},
{8341, {5.3064, 4.3344, 1.5768}},
{8342, {5.1192, 4.3344, 1.5912}},
{8343, {2.6640, 4.3344, 1.5840}},
{8344, {7.9128, 2.2392, 1.5768}},
{8345, {5.3064, 2.2392, 1.5768}},
{8346, {5.2128, 2.2320, 2.5848}},
{8347, {3.6576, 2.2752, 1.6704}},
{8348, {3.5280, 3.6720, 1.6704}},
{8352, {8.0352, 6.8832, 1.5192}},
{8353, {7.8192, 8.4744, 0.6336}},
{8354, {7.8192, 8.1360, 0.2520}},
{8355, {7.4448, 7.8624, 0.0072}},
{8356, {6.1632, 8.1000, 0.1440}},
{8357, {10.3968, 8.0640, 2.0592}},
{8358, {8.6760, 7.8840, -0.0000}},
{8359, {13.6800, 7.8624, 0.1440}},
{8360, {10.3320, 7.8624, 0.1440}},
{8361, {12.2256, 7.8840, 0.2520}},
{8362, {9.3168, 6.1848, -0.0000}},
{8363, {6.7896, 8.6976, 1.5552}},
{8364, {9.7056, 8.1432, 0.2520}},
{8365, {8.8992, 7.8840, -0.0000}},
{8366, {8.2800, 7.8696, -0.0000}},
{8367, {4.2408, 8.0784, 0.2088}},
{8368, {6.4872, 8.7336, 1.9008}},
{8369, {8.6184, 7.8696, -0.0000}},
{8370, {8.6256, 8.4744, 0.6336}},
{8371, {8.0496, 8.2728, -0.0000}},
{8372, {6.8472, 8.1432, 0.2520}},
{8373, {7.8192, 8.4744, 0.6336}},
{8374, {7.9344, 8.6976, 0.1440}},
{8375, {6.4872, 8.1432, 0.3816}},
{8376, {7.0344, 7.8624, 0.0072}},
{8377, {6.4008, 7.8696, 0.2520}},
{8378, {6.5592, 7.8480, -0.0000}},
{8379, {11.5848, 7.3440, 2.4552}},
{8380, {9.9576, 7.7328, -0.0000}},
{8381, {7.7040, 7.8696, -0.0000}},
{8382, {10.1736, 9.0936, 0.6768}},
{8400, {0.0000, 8.8344, -7.4232}},
{8401, {0.0000, 8.8344, -7.4232}},
{8402, {0.0000, 8.0784, 2.5920}},
{8403, {0.0000, 6.7896, 1.3032}},
{8404, {0.0000, 9.2376, -6.1632}},
{8405, {0.0000, 9.2376, -6.1632}},
{8406, {0.0000, 8.8344, -6.4728}},
{8407, {0.0000, 8.8344, -6.4728}},
{8408, {0.0000, 6.2424, -0.5760}},
{8409, {0.0000, 6.2424, -0.5760}},
{8410, {0.0000, 6.2424, -0.5760}},
{8411, {0.0000, 8.2512, -7.0488}},
{8412, {0.0000, 8.2512, -7.0488}},
{8413, {0.0000, 8.0784, 2.5920}},
{8414, {0.0000, 7.4952, 2.0088}},
{8415, {0.0000, 8.0784, 2.5920}},
{8416, {0.0000, 8.0784, 2.5920}},
{8417, {0.0000, 8.8344, -6.4728}},
{8418, {0.0000, 7.6896, 2.1600}},
{8419, {0.0000, 7.8408, 2.5920}},
{8420, {0.0000, 9.1944, 0.9144}},
{8421, {0.0000, 8.0784, 2.5920}},
{8422, {0.0000, 8.0784, 2.5920}},
{8423, {1.7496, 7.8264, -0.0000}},
{8424, {0.0000, -1.3896, 2.5920}},
{8425, {0.0000, 8.1144, -6.6672}},
{8426, {0.0000, 3.9240, -1.5624}},
{8427, {0.0000, 8.0784, 2.5920}},
{8428, {0.0000, -1.1808, 2.5920}},
{8429, {0.0000, -1.1808, 2.5920}},
{8430, {0.0000, -0.2304, 2.5920}},
{8431, {0.0000, -0.2304, 2.5920}},
{8432, {0.0000, 8.8920, -6.4224}},
{8448, {8.3160, 8.5320, 1.7064}},
{8449, {8.3952, 8.5320, 1.7064}},
{8450, {8.1360, 8.1648, 0.2232}},
{8451, {11.8584, 8.1504, 0.2520}},
{8452, {8.0280, 7.8912, -0.0000}},
{8453, {8.9640, 8.5248, 1.7064}},
{8454, {10.1664, 8.5248, 1.7064}},
{8455, {7.3800, 8.1288, 0.1800}},
{8456, {6.5016, 8.1288, 0.2448}},
{8457, {11.5488, 8.1216, -0.0000}},
{8458, {5.8824, 4.1616, 2.5920}},
{8459, {9.8928, 8.4024, 0.1152}},
{8460, {7.9560, 8.2008, 1.9008}},
{8461, {9.8208, 7.8696, -0.0000}},
{8462, {6.8112, 8.8632, 0.1440}},
{8463, {6.8112, 8.8632, 0.1440}},
{8464, {6.9408, 8.4096, 0.1440}},
{8465, {7.3656, 8.2224, 0.0504}},
{8466, {8.5824, 8.4456, 0.1152}},
{8467, {5.0544, 8.9784, -0.0000}},
{8468, {9.7848, 8.7048, 0.1440}},
{8469, {9.0216, 7.8696, 0.2232}},
{8470, {11.4480, 8.0280, 0.1872}},
{8471, {11.5704, 8.6400, 2.2248}},
{8472, {8.8920, 8.5392, 0.2520}},
{8473, {7.0704, 7.8696, -0.0000}},
{8474, {8.7480, 8.0856, 2.0592}},
{8475, {10.7136, 8.4024, 0.1440}},
{8476, {8.5464, 8.1792, 0.0504}},
{8477, {9.0720, 7.8696, -0.0000}},
{8478, {9.3528, 7.8696, 0.0360}},
{8479, {8.8344, 9.4176, 1.4904}},
{8480, {12.7368, 8.9856, -3.2184}},
{8481, {17.7552, 5.4288, 0.0072}},
{8482, {14.3208, 8.8056, -3.3840}},
{8483, {9.0000, 9.4176, 1.4904}},
{8484, {7.9128, 7.8696, -0.0000}},
{8485, {5.2992, 7.8696, 2.5416}},
{8486, {8.5680, 8.1432, -0.0000}},
{8487, {8.5680, 7.8696, 0.2736}},
{8488, {7.9560, 8.0928, 1.9512}},
{8489, {4.3848, 5.5512, 0.1368}},
{8490, {8.8992, 7.8912, -0.0000}},
{8491, {8.6976, 9.4104, -0.0000}},
{8492, {10.1592, 8.4384, 0.1008}},
{8493, {7.3656, 8.2008, 0.0504}},
{8494, {6.9624, 6.7320, 0.1440}},
{8495, {4.3560, 4.1616, 0.0864}},
{8496, {7.0560, 8.4528, 0.1152}},
{8497, {8.2872, 8.4384, 0.1224}},
{8498, {7.4448, 7.8696, -0.0000}},
{8499, {12.2616, 8.3736, 0.1224}},
{8500, {4.6512, 4.1616, 0.0864}},
{8501, {8.3016, 8.0928, 0.2160}},
{8502, {8.0064, 8.0928, -0.0000}},
{8503, {5.5656, 8.0928, 0.4896}},
{8504, {7.6032, 8.0928, 0.4896}},
{8505, {5.4000, 8.3592, 0.1296}},
{8506, {8.5392, 9.4104, 0.9720}},
{8507, {17.5968, 5.6736, 0.0072}},
{8508, {8.3232, 5.4144, 0.1584}},
{8509, {8.3448, 5.6232, 2.5920}},
{8510, {7.4304, 7.8696, -0.0000}},
{8511, {9.7632, 7.8696, -0.0000}},
{8512, {8.0712, 7.8696, -0.0000}},
{8513, {8.4240, 8.1432, 0.2520}},
{8514, {6.5736, 7.8696, 0.2520}},
{8515, {6.5736, 8.1216, -0.0000}},
{8516, {6.6240, 8.1216, 0.1368}},
{8517, {8.2584, 7.8696, -0.0000}},
{8518, {7.9056, 8.6616, 0.1440}},
{8519, {6.8832, 5.6232, 0.1440}},
{8520, {5.2416, 8.8848, 0.1440}},
{8521, {4.5144, 8.8848, 2.5848}},
{8522, {9.3456, 8.1216, -0.0000}},
{8523, {8.7912, 8.0928, 0.2520}},
{8524, {8.6904, 8.6904, 0.2952}},
{8525, {12.1320, 9.0648, 1.7496}},
{8526, {5.8752, 5.4144, 0.0072}},
{8527, {9.5616, 3.9528, -0.0000}},
{8528, {10.0944, 8.9208, 2.1024}},
{8529, {10.0944, 8.9208, 2.1024}},
{8530, {13.9824, 8.9280, 1.7496}},
{8531, {10.0944, 8.9208, 2.1024}},
{8532, {10.0872, 8.9208, 2.1024}},
{8533, {10.0944, 8.9208, 2.1024}},
{8534, {10.0872, 8.9208, 2.1024}},
{8535, {10.0944, 8.9208, 2.1024}},
{8536, {10.0872, 9.0144, 2.1024}},
{8537, {10.0944, 8.9208, 2.1024}},
{8538, {10.0872, 8.9136, 2.1024}},
{8539, {10.0944, 8.9208, 2.1024}},
{8540, {10.0944, 8.9208, 2.1024}},
{8541, {10.0944, 8.9136, 2.1024}},
{8542, {10.0944, 9.0072, 2.1024}},
{8543, {5.5080, 8.9208, 1.7064}},
{8544, {4.3200, 7.8840, -0.0000}},
{8545, {7.8480, 7.8912, -0.0000}},
{8546, {11.3760, 7.8912, -0.0000}},
{8547, {12.5208, 7.8840, 0.2520}},
{8548, {8.9928, 7.8840, 0.2520}},
{8549, {12.5208, 7.8840, 0.2520}},
{8550, {16.0488, 7.8912, 0.2520}},
{8551, {19.5768, 7.8912, 0.2520}},
{8552, {12.4200, 7.8840, -0.0000}},
{8553, {8.8920, 7.8912, -0.0000}},
{8554, {12.4200, 7.8840, -0.0000}},
{8555, {15.9480, 7.8912, -0.0000}},
{8556, {7.1280, 7.8840, -0.0000}},
{8557, {7.8192, 8.1432, 0.2520}},
{8558, {8.5536, 7.8624, -0.0000}},
{8559, {10.5048, 7.8696, -0.0000}},
{8560, {3.2976, 8.1360, -0.0000}},
{8561, {5.9760, 8.1360, -0.0000}},
{8562, {8.6544, 8.1360, -0.0000}},
{8563, {9.2016, 8.1360, 0.1368}},
{8564, {6.7464, 5.4072, 0.1440}},
{8565, {9.3816, 8.1360, 0.1368}},
{8566, {12.0600, 8.1360, 0.1368}},
{8567, {14.7384, 8.1360, 0.1368}},
{8568, {9.6120, 8.1360, -0.0000}},
{8569, {6.9336, 5.4072, -0.0000}},
{8570, {9.6120, 8.1360, -0.0000}},
{8571, {12.2904, 8.1360, -0.0000}},
{8572, {3.3912, 8.7048, -0.0000}},
{8573, {5.3928, 5.6232, 0.1440}},
{8574, {6.7896, 8.6976, 0.1440}},
{8575, {10.3968, 5.5368, 0.0072}},
{8576, {12.9456, 7.8624, -0.0000}},
{8577, {8.5536, 7.8624, -0.0000}},
{8578, {12.9456, 7.8624, -0.0000}},
{8579, {7.8192, 8.1432, 0.2520}},
{8580, {5.3928, 5.6232, 0.1440}},
{8581, {7.9272, 8.1360, 2.3616}},
{8582, {8.1792, 7.8048, 1.1448}},
{8583, {9.1008, 7.8624, -0.0000}},
{8584, {14.0472, 7.8624, -0.0000}},
{8585, {10.0872, 8.9208, 2.1024}},
{8586, {5.9976, 7.8624, 0.2664}},
{8587, {5.9976, 8.1288, 0.2664}},
{8592, {12.0024, 6.5520, -0.2664}},
{8593, {5.9976, 8.6832, 1.8648}},
{8594, {12.0024, 6.5520, -0.2664}},
{8595, {5.9976, 8.6832, 1.8648}},
{8596, {12.0024, 6.5520, -0.2664}},
{8597, {5.9976, 8.6832, 1.8648}},
{8598, {12.0024, 8.6832, 1.8648}},
{8599, {12.0024, 8.6832, 1.8648}},
{8600, {12.0024, 8.6904, 1.8648}},
{8601, {12.0024, 8.6904, 1.8648}},
{8602, {12.0024, 6.5520, -0.2664}},
{8603, {12.0024, 6.5520, -0.2664}},
{8604, {12.0024, 6.5448, -0.2736}},
{8605, {12.0024, 6.5448, -0.2736}},
{8606, {12.0024, 6.5520, -0.2664}},
{8607, {5.9976, 8.6832, 1.8648}},
{8608, {12.0024, 6.5520, -0.2664}},
{8609, {5.9976, 8.6832, 1.8648}},
{8610, {12.0024, 6.5520, -0.2664}},
{8611, {12.0024, 6.5520, -0.2664}},
{8612, {12.0024, 6.9264, 0.1080}},
{8613, {5.9976, 9.1152, 2.2968}},
{8614, {12.0024, 6.9264, 0.1080}},
{8615, {5.9976, 9.1152, 2.3040}},
{8616, {5.9976, 8.6832, 2.5920}},
{8617, {12.0024, 7.3224, -0.2664}},
{8618, {12.0024, 7.3224, -0.2664}},
{8619, {12.0024, 7.3224, 0.1008}},
{8620, {12.0024, 7.3224, 0.1008}},
{8621, {14.9976, 6.5448, -0.2736}},
{8622, {14.9976, 6.5520, -0.2664}},
{8623, {12.0024, 8.9784, 2.4840}},
{8624, {5.9976, 8.6832, 0.0072}},
{8625, {5.9976, 8.6832, 0.0072}},
{8626, {5.9976, 8.6904, -0.0000}},
{8627, {5.9976, 8.6904, -0.0000}},
{8628, {5.9976, 8.6832, 0.0072}},
{8629, {12.0024, 8.6904, -0.2664}},
{8630, {12.0024, 5.6808, 0.2448}},
{8631, {12.0024, 5.6808, 0.2448}},
{8632, {12.0024, 9.4104, 1.8648}},
{8633, {12.0024, 8.6904, 1.8648}},
{8634, {9.3168, 8.3520, 0.8208}},
{8635, {9.3168, 8.3520, 0.8208}},
{8636, {12.0024, 6.5520, -3.1680}},
{8637, {12.0024, 3.6504, -0.2664}},
{8638, {5.9976, 8.7768, 1.8648}},
{8639, {5.9976, 8.7768, 1.8648}},
{8640, {12.0024, 6.5520, -3.1680}},
{8641, {12.0024, 3.6504, -0.2664}},
{8642, {5.9976, 8.7768, 1.8648}},
{8643, {5.9976, 8.7768, 1.8648}},
{8644, {12.0024, 8.4024, 1.2096}},
{8645, {9.9864, 8.6832, 1.8648}},
{8646, {12.0024, 8.4024, 1.2096}},
{8647, {12.0024, 8.2152, 1.3968}},
{8648, {9.9864, 8.6832, 1.8648}},
{8649, {12.0024, 8.2152, 1.3968}},
{8650, {9.9864, 8.6832, 1.8648}},
{8651, {12.0024, 7.7256, 0.9072}},
{8652, {12.0024, 7.7256, 0.9072}},
{8653, {12.0024, 6.7176, -0.1008}},
{8654, {14.9976, 6.7176, -0.1008}},
{8655, {12.0024, 6.7176, -0.1008}},
{8656, {12.0024, 6.7176, -0.1008}},
{8657, {7.3296, 8.6904, 1.8648}},
{8658, {12.0024, 6.7176, -0.1008}},
{8659, {7.3296, 8.6904, 1.8648}},
{8660, {14.9976, 6.7176, -0.1008}},
{8661, {7.3296, 9.4104, 2.5920}},
{8662, {12.0024, 8.6832, 1.8720}},
{8663, {12.0024, 8.6832, 1.8720}},
{8664, {12.0024, 8.6904, 1.8648}},
{8665, {12.0024, 8.6904, 1.8648}},
{8666, {12.0024, 7.7400, 0.9216}},
{8667, {12.0024, 7.7400, 0.9216}},
{8668, {12.0024, 5.4432, -1.3680}},
{8669, {12.0024, 5.4504, -1.3824}},
{8670, {5.9976, 8.6832, 1.8648}},
{8671, {5.9976, 8.6832, 1.8648}},
{8672, {12.0024, 6.5520, -0.2664}},
{8673, {5.9976, 8.6904, 1.8648}},
{8674, {12.0024, 6.5520, -0.2664}},
{8675, {5.9976, 8.6904, 1.8648}},
{8676, {12.0024, 6.9264, 0.1080}},
{8677, {12.0024, 6.9264, 0.1080}},
{8678, {12.0024, 6.7248, -0.0936}},
{8679, {7.3224, 8.6904, 1.8648}},
{8680, {12.0024, 6.7248, -0.0936}},
{8681, {7.3224, 8.6904, 1.8648}},
{8682, {7.3224, 8.6904, 1.8648}},
{8683, {7.3224, 8.6904, 1.8648}},
{8684, {7.3224, 8.6832, 1.8648}},
{8685, {7.3224, 8.6904, 1.8648}},
{8686, {7.3224, 8.6904, 1.8648}},
{8687, {7.3224, 8.6904, 1.8648}},
{8688, {12.0024, 6.7248, -0.0936}},
{8689, {9.2160, 7.8552, 0.3816}},
{8690, {9.2160, 8.2368, -0.0000}},
{8691, {7.3224, 9.4104, 2.5920}},
{8692, {12.0024, 6.5520, -0.2664}},
{8693, {9.9936, 8.6832, 1.8648}},
{8694, {12.0024, 9.3744, 2.5560}},
{8695, {12.0024, 6.5520, -0.2664}},
{8696, {12.0024, 6.5520, -0.2664}},
{8697, {12.0024, 6.5520, -0.2664}},
{8698, {12.0024, 6.5520, -0.2664}},
{8699, {12.0024, 6.5520, -0.2664}},
{8700, {12.0024, 6.5520, -0.2664}},
{8701, {12.0024, 6.7248, -0.1008}},
{8702, {12.0024, 6.7248, -0.1008}},
{8703, {12.0024, 6.5520, -0.2664}},
{8704, {6.6600, 8.3304, 0.2664}},
{8705, {5.9976, 9.3528, 0.6480}},
{8706, {6.3720, 8.5896, 0.2664}},
{8707, {6.6600, 8.3304, -0.0000}},
{8708, {6.6600, 9.0648, 2.2464}},
{8709, {9.3240, 8.8920, 2.0808}},
{8710, {9.9360, 8.6112, -0.0000}},
{8711, {9.9360, 8.2008, 0.4104}},
{8712, {7.9920, 6.8184, -0.0000}},
{8713, {7.9920, 9.0648, 2.2464}},
{8714, {6.8184, 5.4144, -0.0000}},
{8715, {7.9920, 6.8184, -0.0000}},
{8716, {7.9920, 9.0648, 2.2464}},
{8717, {6.8184, 5.4144, -0.0000}},
{8718, {3.3192, 2.2464, -0.0000}},
{8719, {9.6768, 8.5176, 1.6992}},
{8720, {9.6768, 8.5176, 1.6992}},
{8721, {9.9576, 8.5176, 1.6992}},
{8722, {9.3240, 3.6504, -3.1680}},
{8723, {9.3240, 5.9976, 1.9944}},
{8724, {9.3240, 9.1944, 1.1376}},
{8725, {5.9976, 9.0648, 2.2392}},
{8726, {5.9976, 9.0648, 2.2392}},
{8727, {5.6520, 5.6448, -0.7776}},
{8728, {3.3984, 4.8816, -1.9440}},
{8729, {3.3984, 4.8744, -1.9440}},
{8730, {9.9000, 9.4104, 2.4048}},
{8731, {9.9000, 9.4104, 2.4120}},
{8732, {9.9000, 9.4176, 2.4048}},
{8733, {9.3240, 5.3064, 0.1368}},
{8734, {12.0024, 5.3064, 0.1368}},
{8735, {9.2160, 8.2368, -0.0000}},
{8736, {8.6688, 8.3304, -0.0000}},
{8737, {8.6688, 8.5680, 0.2448}},
{8738, {8.6688, 6.6096, 0.6120}},
{8739, {3.6648, 9.4104, 2.5920}},
{8740, {3.6648, 9.4104, 2.5920}},
{8741, {5.9976, 9.4104, 2.5920}},
{8742, {5.9976, 9.4104, 2.5920}},
{8743, {7.9920, 7.1784, 0.2664}},
{8744, {7.9920, 7.1784, 0.2736}},
{8745, {7.9920, 7.1784, 0.2664}},
{8746, {7.9920, 7.1784, 0.2664}},
{8747, {5.9688, 9.4104, 2.5920}},
{8748, {9.1368, 9.4104, 2.5920}},
{8749, {12.2976, 9.4104, 2.5920}},
{8750, {5.9688, 9.4104, 2.5920}},
{8751, {9.1368, 9.4104, 2.5920}},
{8752, {12.2976, 9.4104, 2.5920}},
{8753, {5.9688, 9.4104, 2.5920}},
{8754, {5.9688, 9.4104, 2.5920}},
{8755, {5.9688, 9.4104, 2.5920}},
{8756, {7.9920, 6.5160, -0.0000}},
{8757, {7.9920, 6.5160, -0.0000}},
{8758, {4.0032, 6.5160, -0.0000}},
{8759, {7.9920, 6.5160, -0.0000}},
{8760, {9.3240, 6.7104, -3.1680}},
{8761, {9.3240, 6.3576, -0.4608}},
{8762, {9.3240, 6.6744, -0.1512}},
{8763, {9.3240, 7.8840, 1.0584}},
{8764, {9.3240, 4.7376, -2.0808}},
{8765, {9.3240, 4.7376, -2.0808}},
{8766, {9.3240, 5.0040, -1.8288}},
{8767, {12.0024, 7.6680, -0.0432}},
{8768, {5.9976, 7.4016, 0.5832}},
{8769, {9.3240, 6.4944, -0.3240}},
{8770, {9.3240, 5.4072, -0.2736}},
{8771, {9.3240, 6.5448, -1.4112}},
{8772, {9.3240, 9.0648, 2.2464}},
{8773, {9.3240, 6.9048, -0.0000}},
{8774, {9.3240, 6.9048, 1.9584}},
{8775, {9.3240, 9.0720, 2.2464}},
{8776, {9.3240, 6.1992, -0.6120}},
{8777, {9.3240, 9.0648, 2.2464}},
{8778, {9.3240, 6.1992, 1.2888}},
{8779, {9.3240, 7.6680, 0.8496}},
{8780, {9.3240, 6.9048, -0.0000}},
{8781, {9.3240, 6.2496, -0.5760}},
{8782, {9.3240, 6.3216, -0.4968}},
{8783, {9.3240, 6.3216, -1.9944}},
{8784, {9.3240, 7.8696, -1.9944}},
{8785, {9.3240, 7.8696, 1.0512}},
{8786, {9.3240, 7.8696, 1.0512}},
{8787, {9.3240, 7.8696, 1.0512}},
{8788, {11.5488, 5.2416, -1.5768}},
{8789, {11.5488, 5.2416, -1.5768}},
{8790, {9.3240, 4.8240, -1.9944}},
{8791, {9.3240, 8.8344, -1.9944}},
{8792, {9.3240, 8.1576, -1.9944}},
{8793, {9.3240, 9.4104, -1.9944}},
{8794, {9.3240, 9.4104, -1.9944}},
{8795, {9.3240, 9.1440, -1.9944}},
{8796, {9.3240, 9.4104, -1.9944}},
{8797, {9.3240, 9.1224, -1.9944}},
{8798, {9.3240, 7.9416, -1.9944}},
{8799, {9.3240, 9.3168, -1.9944}},
{8800, {9.3240, 8.0208, 1.2024}},
{8801, {9.3240, 5.9976, -0.8280}},
{8802, {9.3240, 8.0208, 1.1952}},
{8803, {9.3240, 7.1640, 0.3456}},
{8804, {9.3240, 6.8832, 1.7568}},
{8805, {9.3240, 6.8832, 1.7568}},
{8806, {9.3240, 8.6400, 1.7568}},
{8807, {9.3240, 8.6400, 1.7568}},
{8808, {9.3240, 8.6400, 2.5920}},
{8809, {9.3240, 8.6400, 2.5920}},
{8810, {12.9528, 6.8832, 0.0576}},
{8811, {12.9528, 6.8832, 0.0576}},
{8812, {5.9976, 9.4104, 2.5920}},
{8813, {9.3240, 8.0208, 1.1952}},
{8814, {9.3240, 9.0720, 2.2464}},
{8815, {9.3240, 9.0720, 2.2464}},
{8816, {9.3240, 8.7264, 2.5920}},
{8817, {9.3240, 8.7264, 2.5920}},
{8818, {9.3240, 8.6400, 2.0232}},
{8819, {9.3240, 8.6400, 2.0232}},
{8820, {9.3240, 9.4104, 2.5920}},
{8821, {9.3240, 9.4176, 2.5920}},
{8822, {9.3240, 9.4104, 2.5920}},
{8823, {9.3240, 9.4104, 2.5920}},
{8824, {9.3240, 9.4104, 2.5920}},
{8825, {9.3240, 9.4104, 2.5920}},
{8826, {9.3240, 6.8976, 0.0648}},
{8827, {9.3240, 6.8976, 0.0648}},
{8828, {9.3240, 6.8976, 1.8648}},
{8829, {9.3240, 6.8976, 1.8648}},
{8830, {9.3240, 8.6544, 2.0232}},
{8831, {9.3240, 8.6544, 2.0232}},
{8832, {9.3240, 7.1352, 0.3024}},
{8833, {9.3240, 7.1352, 0.3024}},
{8834, {9.3240, 6.8184, -0.0000}},
{8835, {9.3240, 6.8184, -0.0000}},
{8836, {9.3240, 9.0648, 2.2464}},
{8837, {9.3240, 9.0648, 2.2464}},
{8838, {9.3240, 6.8184, 1.7568}},
{8839, {9.3240, 6.8184, 1.7568}},
{8840, {9.3240, 7.9272, 2.5920}},
{8841, {9.3240, 7.9272, 2.5920}},
{8842, {9.3240, 6.8184, 2.5920}},
{8843, {9.3240, 6.8184, 2.5920}},
{8844, {7.9920, 7.1784, 0.2664}},
{8845, {7.9920, 7.1784, 0.2664}},
{8846, {7.9920, 7.1856, 0.2664}},
{8847, {9.3240, 6.8184, -0.0000}},
{8848, {9.3240, 6.8184, -0.0000}},
{8849, {9.3240, 6.8184, 2.1024}},
{8850, {9.3240, 6.8184, 2.1024}},
{8851, {7.9920, 7.1784, -0.0000}},
{8852, {7.9920, 7.1784, -0.0000}},
{8853, {9.3240, 7.6536, 0.8280}},
{8854, {9.3240, 7.6464, 0.8280}},
{8855, {9.3240, 7.6464, 0.8280}},
{8856, {9.3240, 7.6464, 0.8280}},
{8857, {9.2448, 7.8048, 0.9792}},
{8858, {9.2448, 7.8048, 0.9792}},
{8859, {9.3240, 7.6464, 0.8280}},
{8860, {9.3240, 7.6464, 0.8280}},
{8861, {9.3240, 7.6464, 0.8280}},
{8862, {9.3240, 7.4736, 0.6480}},
{8863, {9.3240, 7.4736, 0.6480}},
{8864, {9.3240, 7.4736, 0.6480}},
{8865, {9.3240, 7.4736, 0.6480}},
{8866, {7.3296, 8.3304, -0.0000}},
{8867, {7.3296, 8.3304, -0.0000}},
{8868, {9.3240, 7.9920, 0.0072}},
{8869, {9.3240, 7.9992, -0.0000}},
{8870, {4.3992, 8.3304, -0.0000}},
{8871, {4.3992, 8.3304, -0.0000}},
{8872, {7.3296, 8.3304, -0.0000}},
{8873, {8.6688, 8.3304, -0.0000}},
{8874, {10.6560, 8.3304, -0.0000}},
{8875, {8.6688, 8.3304, -0.0000}},
{8876, {7.3296, 8.3304, 1.2024}},
{8877, {7.3296, 8.3304, 1.2024}},
{8878, {8.6688, 8.3304, 1.2024}},
{8879, {8.6688, 8.3304, 1.2024}},
{8880, {9.3240, 7.4448, 0.6264}},
{8881, {9.3240, 7.4448, 0.6264}},
{8882, {9.3240, 6.8832, 0.0720}},
{8883, {9.3240, 6.8832, 0.0720}},
{8884, {9.3240, 6.8832, 2.1024}},
{8885, {9.3240, 6.8832, 2.1024}},
{8886, {12.0024, 5.3208, -1.4976}},
{8887, {12.0024, 5.3208, -1.4976}},
{8888, {12.0024, 5.3208, -1.4976}},
{8889, {9.3240, 7.2000, 0.3816}},
{8890, {6.6600, 5.0904, 2.4696}},
{8891, {7.3296, 8.5968, -0.0000}},
{8892, {7.3296, 8.5896, 0.0072}},
{8893, {7.3296, 8.5896, 0.0072}},
{8894, {9.2160, 8.2368, -0.0000}},
{8895, {10.6632, 9.0864, -0.0000}},
{8896, {7.9920, 7.1784, 0.2664}},
{8897, {7.9920, 7.1784, 0.2664}},
{8898, {9.9864, 9.0576, 2.3616}},
{8899, {9.9864, 9.0648, 2.3544}},
{8900, {4.3272, 5.4216, -1.3968}},
{8901, {2.6928, 4.5288, -2.2968}},
{8902, {7.0776, 6.8832, -0.5976}},
{8903, {9.3240, 6.6960, -0.1224}},
{8904, {9.3240, 6.3072, -0.5112}},
{8905, {9.3240, 6.3072, -0.5112}},
{8906, {9.3240, 6.3072, -0.5112}},
{8907, {9.3240, 8.3304, 0.2664}},
{8908, {9.3240, 8.3304, 0.2664}},
{8909, {9.3240, 6.5448, -1.4112}},
{8910, {9.1152, 6.9408, 0.2664}},
{8911, {9.1152, 6.9408, 0.2664}},
{8912, {9.3240, 6.8184, -0.0000}},
{8913, {9.3240, 6.8184, -0.0000}},
{8914, {7.9920, 7.1784, 0.2664}},
{8915, {7.9920, 7.1784, 0.2664}},
{8916, {7.9920, 8.6904, 0.2664}},
{8917, {5.9976, 9.4104, 2.5920}},
{8918, {9.3240, 6.8832, 0.0576}},
{8919, {9.3240, 6.8832, 0.0576}},
{8920, {16.5888, 6.8832, 0.0576}},
{8921, {16.5888, 6.8832, 0.0576}},
{8922, {9.3240, 9.4104, 2.5920}},
{8923, {9.3240, 9.4104, 2.5920}},
{8924, {9.3240, 6.8832, 1.7568}},
{8925, {9.3240, 6.8832, 1.7568}},
{8926, {9.3240, 8.6904, 0.0648}},
{8927, {9.3240, 8.6904, 0.0648}},
{8928, {9.3240, 7.1352, 2.1096}},
{8929, {9.3240, 7.1352, 2.1096}},
{8930, {9.3240, 9.0720, 2.2464}},
{8931, {9.3240, 9.0648, 2.2464}},
{8932, {9.3240, 7.4088, 2.5704}},
{8933, {9.3240, 7.4088, 2.5704}},
{8934, {9.3240, 8.6400, 2.5920}},
{8935, {9.3240, 8.6400, 2.5920}},
{8936, {9.3240, 8.6544, 2.5920}},
{8937, {9.3240, 8.6544, 2.5920}},
{8938, {9.3240, 8.0208, 1.2024}},
{8939, {9.3240, 8.0208, 1.2024}},
{8940, {9.3240, 9.0648, 2.2464}},
{8941, {9.3240, 9.0648, 2.2464}},
{8942, {3.9960, 8.0928, 1.2744}},
{8943, {12.0024, 4.0752, -2.7432}},
{8944, {12.0024, 8.0928, 1.2744}},
{8945, {12.0024, 8.0928, 1.2744}},
{8946, {9.5760, 6.8184, -0.0000}},
{8947, {7.9920, 6.8184, -0.0000}},
{8948, {6.8184, 5.4144, -0.0000}},
{8949, {7.9920, 9.4104, -0.0000}},
{8950, {7.9920, 8.9280, -0.0000}},
{8951, {6.8184, 7.1856, -0.0000}},
{8952, {7.9920, 6.8184, 2.1024}},
{8953, {7.9920, 6.8184, -0.0000}},
{8954, {9.5760, 6.8184, -0.0000}},
{8955, {7.9920, 6.8184, -0.0000}},
{8956, {6.8184, 5.4144, -0.0000}},
{8957, {7.9920, 8.9280, -0.0000}},
{8958, {6.8184, 7.1856, -0.0000}},
{8959, {9.0648, 8.3304, -0.0000}},
{8960, {9.3240, 7.0344, 0.0360}},
{8961, {12.7512, 7.2432, -1.0944}},
{8962, {9.5400, 8.1144, -0.0000}},
{8963, {7.2360, 9.2952, -5.9184}},
{8964, {7.2360, 1.0944, 2.2824}},
{8965, {7.2360, 6.2352, -1.2384}},
{8966, {7.2360, 8.5824, -1.2384}},
{8967, {4.7448, 9.1440, 2.4408}},
{8968, {5.3280, 9.4104, 2.5920}},
{8969, {5.3280, 9.4104, 2.5920}},
{8970, {5.3280, 9.4104, 2.5920}},
{8971, {5.3280, 9.4104, 2.5920}},
{8972, {5.9976, 8.3304, -3.6720}},
{8973, {5.9976, 8.3304, -3.6720}},
{8974, {5.9976, 4.3992, 0.2664}},
{8975, {5.9976, 4.3992, 0.2664}},
{8976, {9.3240, 4.2696, -1.0584}},
{8977, {6.0696, 5.2056, -1.7352}},
{8978, {9.2232, 7.5600, -3.0168}},
{8979, {9.2232, 7.5600, -3.1680}},
{8980, {9.2232, 7.5456, -3.1248}},
{8981, {6.7248, 5.5296, -0.0576}},
{8982, {6.7680, 7.1496, -0.8208}},
{8983, {6.7752, 7.1496, -0.8136}},
{8984, {6.7752, 7.2288, -0.6192}},
{8985, {9.3240, 6.3792, -3.1680}},
{8986, {9.5400, 8.1072, 0.2880}},
{8987, {7.9344, 9.2952, 2.4624}},
{8988, {5.9976, 8.3304, -3.6720}},
{8989, {5.9976, 8.3304, -3.6720}},
{8990, {5.9976, 4.3992, 0.2664}},
{8991, {5.9976, 4.3992, 0.2664}},
{8992, {7.7904, 9.4104, 2.5920}},
{8993, {7.7904, 9.4104, 2.5920}},
{8994, {8.2584, 4.6008, -2.2248}},
{8995, {8.2584, 4.6008, -2.2248}},
{8996, {9.5400, 6.2640, -1.2096}},
{8997, {9.5400, 6.2640, -0.0000}},
{8998, {13.6368, 7.7760, -0.0000}},
{8999, {10.3104, 7.7760, -0.0000}},
{9000, {12.8664, 6.0768, 0.0216}},
{9001, {4.6584, 9.4104, 2.5920}},
{9002, {4.6584, 9.4104, 2.5920}},
{9003, {13.6368, 7.7760, -0.0000}},
{9004, {10.9224, 8.5176, 1.6992}},
{9005, {9.5400, 6.8832, -0.1584}},
{9006, {9.5400, 6.5160, 0.2232}},
{9007, {9.5400, 4.8672, -0.8640}},
{9008, {9.5400, 5.7240, -0.0000}},
{9009, {9.5400, 7.1496, -0.8208}},
{9010, {9.5400, 6.9408, -0.0000}},
{9011, {9.5400, 6.9048, -3.1608}},
{9012, {9.5400, 6.3072, -0.0000}},
{9013, {9.5400, 5.4144, -0.0216}},
{9014, {9.3240, 7.9920, -0.0000}},
{9015, {5.8104, 7.4736, 0.6480}},
{9016, {9.3240, 8.6400, 0.6480}},
{9017, {9.3240, 8.6400, 0.6480}},
{9018, {9.3240, 8.6400, 0.6480}},
{9019, {9.3240, 8.6400, 0.6480}},
{9020, {9.3240, 8.6400, 0.6480}},
{9021, {9.3240, 8.7480, 1.9224}},
{9022, {9.2448, 7.8048, 0.9792}},
{9023, {7.6464, 6.7320, -0.0936}},
{9024, {7.6464, 6.7320, -0.0936}},
{9025, {9.3240, 7.4736, 0.6480}},
{9026, {9.3240, 7.4736, 0.6480}},
{9027, {9.3240, 7.4736, 0.6480}},
{9028, {9.3240, 7.4736, 0.6480}},
{9029, {12.0024, 9.4104, 2.5920}},
{9030, {12.0024, 9.4104, 2.5920}},
{9031, {9.3240, 8.6400, 0.6480}},
{9032, {9.3240, 8.6400, 0.6480}},
{9033, {9.3240, 8.0640, 1.2456}},
{9034, {8.6688, 7.8192, 1.2456}},
{9035, {9.9288, 9.0648, 2.2392}},
{9036, {9.3240, 7.4736, 0.6480}},
{9037, {9.3240, 8.6400, 0.6480}},
{9038, {9.3240, 7.9992, -0.0000}},
{9039, {9.6768, 8.7336, 1.9080}},
{9040, {9.3240, 8.6400, 0.6480}},
{9041, {8.6688, 7.8192, 1.2528}},
{9042, {9.9288, 9.0648, 2.2392}},
{9043, {9.3240, 7.4736, 0.6480}},
{9044, {9.3240, 8.6400, 0.6480}},
{9045, {9.3240, 7.9920, 0.0072}},
{9046, {9.6768, 8.7336, 1.9080}},
{9047, {9.3240, 8.6400, 0.6480}},
{9048, {9.3240, 8.1288, -1.9944}},
{9049, {9.9288, 8.5968, 1.8144}},
{9050, {9.3240, 7.8984, 1.7568}},
{9051, {9.3240, 8.1792, -1.9944}},
{9052, {9.3240, 7.6464, 1.7568}},
{9053, {9.9936, 9.2376, 2.4192}},
{9054, {9.3240, 8.6400, 0.6480}},
{9055, {9.3240, 7.6464, 0.8280}},
{9056, {9.3240, 8.6400, 0.6480}},
{9057, {9.3240, 9.3312, 0.7056}},
{9058, {9.9288, 9.3528, 1.6272}},
{9059, {5.9976, 9.3312, -0.8280}},
{9060, {5.9976, 9.3312, -2.1024}},
{9061, {9.3240, 9.3312, 0.8280}},
{9062, {7.9920, 8.1000, 0.8496}},
{9063, {9.3240, 8.2440, 1.4184}},
{9064, {9.3240, 9.0360, -2.0808}},
{9065, {9.3240, 9.0360, 0.0576}},
{9066, {9.3240, 3.6504, 1.6488}},
{9067, {9.9288, 8.1432, 0.4536}},
{9068, {7.7688, 8.7264, 0.1440}},
{9069, {7.1568, 9.4104, 2.5920}},
{9070, {7.3296, 7.1208, 0.4176}},
{9071, {9.3240, 8.6400, 0.6480}},
{9072, {9.3240, 8.6400, 0.6480}},
{9073, {7.9920, 7.1784, 0.2664}},
{9074, {7.9920, 7.1784, 0.2664}},
{9075, {4.3848, 5.5440, 0.1440}},
{9076, {5.8032, 5.6304, 2.4480}},
{9077, {7.7832, 5.6304, 0.1440}},
{9078, {7.3224, 5.6304, 1.8144}},
{9079, {5.1768, 5.6304, 1.8144}},
{9080, {4.3848, 5.5440, 1.8144}},
{9081, {7.7832, 5.6304, 1.8144}},
{9082, {7.3224, 5.6304, 0.1440}},
{9083, {9.0576, 8.0928, 0.2520}},
{9084, {10.8864, 8.2368, 2.5920}},
{9085, {9.3240, 6.1560, -0.0000}},
{9086, {9.5400, 7.1784, 0.0072}},
{9087, {3.6648, 9.4104, 2.5920}},
{9088, {7.9920, 9.2520, 2.4768}},
{9089, {12.0024, 5.1984, -0.0000}},
{9090, {12.0024, 5.1984, -0.0000}},
{9091, {11.6712, 7.6392, 0.8208}},
{9092, {11.2536, 8.1216, -0.0000}},
{9093, {9.2808, 9.3168, 1.3536}},
{9094, {12.0024, 9.0648, 2.2320}},
{9095, {10.4544, 6.2496, -0.0000}},
{9096, {11.6640, 8.2512, 1.4328}},
{9097, {9.3240, 7.6464, 0.8280}},
{9098, {9.3240, 7.6464, 0.8280}},
{9099, {9.3240, 7.6392, 0.8208}},
{9100, {9.3312, 8.5176, -0.0000}},
{9101, {9.3240, 7.9128, -0.0000}},
{9102, {10.2456, 7.9128, -0.0000}},
{9103, {9.3240, 7.9704, 0.0072}},
{9104, {9.3240, 7.9704, -0.0000}},
{9105, {9.3240, 7.9704, 0.0072}},
{9106, {9.3240, 7.9704, -0.0000}},
{9107, {9.3240, 4.5288, -2.2896}},
{9108, {9.6912, 7.5240, 0.7056}},
{9109, {9.3240, 8.1216, -0.0000}},
{9110, {4.1040, 7.8768, -3.7800}},
{9111, {10.3104, 8.6760, 2.3472}},
{9112, {10.3104, 8.6760, 2.3472}},
{9113, {12.3048, 9.3528, 2.5344}},
{9114, {12.3048, 8.6760, -0.0000}},
{9115, {5.9976, 9.4104, 2.5920}},
{9116, {5.9976, 9.4104, 2.5920}},
{9117, {5.9976, 9.4104, 2.5920}},
{9118, {5.9976, 9.4104, 2.5920}},
{9119, {5.9976, 9.4104, 2.5920}},
{9120, {5.9976, 9.4104, 2.5920}},
{9121, {5.9976, 9.4176, 2.5920}},
{9122, {5.9976, 9.4104, 2.5920}},
{9123, {5.9976, 9.4176, 2.5920}},
{9124, {5.9976, 9.4176, 2.5920}},
{9125, {5.9976, 9.4104, 2.5920}},
{9126, {5.9976, 9.4176, 2.5920}},
{9127, {5.9976, 9.4176, 2.5920}},
{9128, {5.9976, 9.4104, 2.5920}},
{9129, {5.9976, 9.4176, 2.5920}},
{9130, {5.9976, 9.4104, 2.5920}},
{9131, {5.9976, 9.4176, 2.5920}},
{9132, {5.9976, 9.4104, 2.5920}},
{9133, {5.9976, 9.4176, 2.5920}},
{9134, {7.7904, 9.4104, 2.5920}},
{9135, {12.0024, 3.6504, -3.1680}},
{9136, {5.9976, 9.4104, 2.5920}},
{9137, {5.9976, 9.4104, 2.5920}},
{9138, {15.4440, 4.9752, 2.5920}},
{9139, {15.4440, 9.4104, -1.8432}},
{9140, {10.9224, 0.4824, 2.2104}},
{9141, {10.9224, 2.6928, -0.0000}},
{9142, {10.9224, 5.0616, 2.2104}},
{9143, {7.9344, 9.4104, 2.4048}},
{9144, {9.3240, 7.0848, 0.2520}},
{9145, {9.3240, 7.0848, 0.2520}},
{9146, {5.9976, 7.4952, -6.9912}},
{9147, {5.9976, 5.5800, -5.0760}},
{9148, {5.9976, 1.7496, -1.2456}},
{9149, {5.9976, -0.1728, 0.6768}},
{9150, {3.3840, 6.1560, 0.0072}},
{9151, {3.3840, 6.1632, -0.0000}},
{9152, {7.0920, 8.0496, 1.0224}},
{9153, {7.0920, 8.0496, 1.0224}},
{9154, {7.0920, 8.0568, 1.0224}},
{9155, {7.0920, 8.0496, 1.0224}},
{9156, {7.0920, 8.0496, 1.0224}},
{9157, {7.0920, 8.0568, 1.0224}},
{9158, {7.0920, 8.0496, 1.0224}},
{9159, {7.0920, 8.0496, 1.0224}},
{9160, {7.0920, 8.0568, 1.0224}},
{9161, {7.0920, 8.0496, 1.0224}},
{9162, {7.0920, 8.0568, 1.0224}},
{9163, {3.3840, 6.1560, 0.0072}},
{9164, {3.3840, 6.1632, -0.0000}},
{9165, {8.0424, 6.1560, -0.0000}},
{9166, {10.2960, 8.7336, 0.6336}},
{9167, {9.5400, 8.7696, -0.0000}},
{9168, {5.9976, 9.4104, 2.5920}},
{9169, {9.3240, 4.1256, -1.9800}},
{9170, {9.3240, 5.4072, -1.4112}},
{9171, {9.3240, 5.4144, -1.4112}},
{9172, {15.0120, 5.4072, -1.4112}},
{9173, {15.0120, 5.4144, -1.4112}},
{9174, {15.0120, 4.1256, -1.9800}},
{9175, {9.3240, 5.4144, -1.4112}},
{9176, {9.3240, 5.4144, -1.4112}},
{9177, {9.3240, 5.4144, -1.4112}},
{9178, {8.6688, 8.7264, 2.1024}},
{9179, {12.0024, 4.6008, -0.0000}},
{9180, {10.9224, 1.7064, 1.3752}},
{9181, {10.9224, 1.7064, 1.3752}},
{9182, {10.9224, 2.0808, 2.1888}},
{9183, {10.9224, 2.1888, 2.0808}},
{9184, {10.9224, 0.3312, 1.9656}},
{9185, {10.9224, 1.9584, 0.3312}},
{9186, {9.3240, 8.1216, -0.0000}},
{9187, {10.9224, 8.5176, 1.6992}},
{9188, {11.3112, 3.6504, -3.1680}},
{9189, {11.3112, 5.0256, -0.0000}},
{9190, {12.0024, 7.6680, -0.0432}},
{9191, {12.0024, 8.6760, 2.3688}},
{9192, {8.2080, 3.9528, 1.7496}},
{9193, {9.6552, 6.9408, 0.5688}},
{9194, {9.6552, 6.9408, 0.5688}},
{9195, {9.6552, 7.0848, 0.7128}},
{9196, {9.6552, 7.0848, 0.7128}},
{9197, {9.6552, 6.9408, 0.5616}},
{9198, {9.6552, 6.9408, 0.5616}},
{9199, {9.6552, 6.9408, 0.5616}},
{9200, {12.0024, 9.2088, 1.2816}},
{9201, {12.0024, 9.2736, 1.2816}},
{9202, {12.0024, 8.1000, 1.2816}},
{9203, {9.0936, 8.8200, 1.9008}},
{9204, {9.6552, 7.3152, 0.1944}},
{9205, {9.6552, 7.3152, 0.1944}},
{9206, {9.6552, 5.4432, -1.6848}},
{9207, {9.6552, 4.6944, -0.9360}},
{9208, {9.6552, 6.9408, 0.5616}},
{9209, {9.6552, 6.7896, -0.0360}},
{9210, {9.6552, 6.7896, -0.0360}},
{9211, {12.0024, 8.4888, 1.6272}},
{9212, {12.0024, 8.4240, 1.6272}},
{9213, {4.8312, 6.6744, -0.1224}},
{9214, {11.2896, 8.0640, 1.3680}},
{9216, {12.0024, 9.2232, 2.4048}},
{9217, {12.0024, 9.2232, 2.4048}},
{9218, {12.0024, 9.2232, 2.4048}},
{9219, {12.0024, 9.2232, 2.4048}},
{9220, {12.0024, 9.2232, 2.4048}},
{9221, {12.0024, 9.2232, 2.4048}},
{9222, {12.0024, 9.2232, 2.4048}},
{9223, {12.0024, 9.2232, 2.4048}},
{9224, {12.0024, 9.2232, 2.4048}},
{9225, {12.0024, 9.2232, 2.4048}},
{9226, {12.0024, 9.2304, 2.4048}},
{9227, {12.0024, 9.2232, 2.4048}},
{9228, {12.0024, 9.2304, 2.4048}},
{9229, {12.0024, 9.2232, 2.4048}},
{9230, {12.0024, 9.2232, 2.4048}},
{9231, {12.0024, 9.2232, 2.4048}},
{9232, {12.0024, 9.2232, 2.4048}},
{9233, {12.0024, 9.2232, 2.4048}},
{9234, {12.0024, 9.2232, 2.4048}},
{9235, {12.0024, 9.2232, 2.4048}},
{9236, {12.0024, 9.2232, 2.4048}},
{9237, {12.0024, 9.2232, 2.4048}},
{9238, {12.0024, 9.2232, 2.4048}},
{9239, {12.0024, 9.2232, 2.4048}},
{9240, {12.0024, 9.2232, 2.4048}},
{9241, {12.0024, 9.2232, 2.4048}},
{9242, {12.0024, 9.2232, 2.4048}},
{9243, {12.0024, 9.2232, 2.4048}},
{9244, {12.0024, 9.2232, 2.4048}},
{9245, {12.0024, 9.2232, 2.4048}},
{9246, {12.0024, 9.2232, 2.4048}},
{9247, {12.0024, 9.2232, 2.4048}},
{9248, {12.0024, 9.2232, 2.4048}},
{9249, {12.0024, 9.2232, 2.4048}},
{9250, {12.0024, 9.2232, 2.4048}},
{9251, {12.0024, 9.2232, 2.4048}},
{9252, {12.0024, 9.2232, 2.4048}},
{9253, {12.0024, 9.2232, 2.4048}},
{9254, {12.0024, 9.2232, 2.4048}},
{9280, {9.0576, 8.3304, -0.0000}},
{9281, {7.2432, 8.3304, 0.0144}},
{9282, {7.2432, 8.3304, 0.0144}},
{9283, {7.2432, 8.3304, 0.0144}},
{9284, {7.2432, 8.3304, -0.0000}},
{9285, {9.5544, 5.4792, -1.4616}},
{9286, {9.2376, 8.1576, -0.0000}},
{9287, {9.3960, 7.3152, -0.0000}},
{9288, {8.9424, 8.1576, -0.0000}},
{9289, {10.5696, 2.5344, -0.0000}},
{9290, {7.4448, 8.3304, -0.0000}},
{9312, {12.0024, 8.3592, 1.5336}},
{9313, {12.0024, 8.3592, 1.5336}},
{9314, {12.0024, 8.3592, 1.5336}},
{9315, {12.0024, 8.3592, 1.5336}},
{9316, {12.0024, 8.3592, 1.5336}},
{9317, {12.0024, 8.3592, 1.5336}},
{9318, {12.0024, 8.3592, 1.5336}},
{9319, {12.0024, 8.3592, 1.5336}},
{9320, {12.0024, 8.3592, 1.5336}},
{9321, {12.0024, 8.3592, 1.5336}},
{9322, {12.0024, 8.3592, 1.5336}},
{9323, {12.0024, 8.3592, 1.5336}},
{9324, {12.0024, 8.3592, 1.5336}},
{9325, {12.0024, 8.3592, 1.5336}},
{9326, {12.0024, 8.3592, 1.5336}},
{9327, {12.0024, 8.3592, 1.5336}},
{9328, {12.0024, 8.3592, 1.5336}},
{9329, {12.0024, 8.3592, 1.5336}},
{9330, {12.0024, 8.3592, 1.5336}},
{9331, {12.0024, 8.3592, 1.5336}},
{9332, {12.0024, 8.3304, 1.5624}},
{9333, {12.0024, 8.3304, 1.5624}},
{9334, {12.0024, 8.3304, 1.5624}},
{9335, {12.0024, 8.3304, 1.5624}},
{9336, {12.0024, 8.3304, 1.5624}},
{9337, {12.0024, 8.3304, 1.5624}},
{9338, {12.0024, 8.3304, 1.5624}},
{9339, {12.0024, 8.3304, 1.5624}},
{9340, {12.0024, 8.3304, 1.5624}},
{9341, {12.0024, 8.3304, 1.5624}},
{9342, {12.0024, 8.3304, 1.5624}},
{9343, {12.0024, 8.3304, 1.5624}},
{9344, {12.0024, 8.3304, 1.5624}},
{9345, {12.0024, 8.3304, 1.5624}},
{9346, {12.0024, 8.3304, 1.5624}},
{9347, {12.0024, 8.3304, 1.5624}},
{9348, {12.0024, 8.3304, 1.5624}},
{9349, {12.0024, 8.3304, 1.5624}},
{9350, {12.0024, 8.3304, 1.5624}},
{9351, {12.0024, 8.3376, 1.5624}},
{9352, {12.0024, 5.9904, -0.7416}},
{9353, {12.0024, 6.0912, -0.7416}},
{9354, {12.0024, 6.0912, -0.7344}},
{9355, {12.0024, 5.9904, -0.7416}},
{9356, {12.0024, 6.0048, -0.7416}},
{9357, {12.0024, 6.0768, -0.7416}},
{9358, {12.0024, 5.9904, -0.7416}},
{9359, {12.0024, 6.0912, -0.7416}},
{9360, {12.0024, 6.0768, -0.7416}},
{9361, {12.0024, 6.0912, -0.7416}},
{9362, {12.0024, 5.9904, -0.7416}},
{9363, {12.0024, 6.0912, -0.7416}},
{9364, {12.0024, 6.0912, -0.7416}},
{9365, {12.0024, 5.9904, -0.7416}},
{9366, {12.0024, 6.0048, -0.7416}},
{9367, {12.0024, 6.0768, -0.7416}},
{9368, {12.0024, 6.0120, -0.7416}},
{9369, {12.0024, 6.0912, -0.7416}},
{9370, {12.0024, 6.0768, -0.7416}},
{9371, {12.0024, 6.0912, -0.7416}},
{9372, {12.0024, 8.3304, 1.5624}},
{9373, {12.0024, 8.3304, 1.5624}},
{9374, {12.0024, 8.3304, 1.5624}},
{9375, {12.0024, 8.3304, 1.5624}},
{9376, {12.0024, 8.3304, 1.5624}},
{9377, {12.0024, 8.3304, 1.5624}},
{9378, {12.0024, 8.3304, 1.5624}},
{9379, {12.0024, 8.3304, 1.5624}},
{9380, {12.0024, 8.3304, 1.5624}},
{9381, {12.0024, 8.3304, 1.5624}},
{9382, {12.0024, 8.3304, 1.5624}},
{9383, {12.0024, 8.3304, 1.5624}},
{9384, {12.0024, 8.3376, 1.5624}},
{9385, {12.0024, 8.3304, 1.5624}},
{9386, {12.0024, 8.3304, 1.5624}},
{9387, {12.0024, 8.3304, 1.5624}},
{9388, {12.0024, 8.3304, 1.5624}},
{9389, {12.0024, 8.3304, 1.5624}},
{9390, {12.0024, 8.3304, 1.5624}},
{9391, {12.0024, 8.3304, 1.5624}},
{9392, {12.0024, 8.3304, 1.5624}},
{9393, {12.0024, 8.3304, 1.5624}},
{9394, {12.0024, 8.3376, 1.5624}},
{9395, {12.0024, 8.3304, 1.5624}},
{9396, {12.0024, 8.3304, 1.5624}},
{9397, {12.0024, 8.3304, 1.5624}},
{9398, {12.0024, 8.3592, 1.5336}},
{9399, {12.0024, 8.3592, 1.5336}},
{9400, {12.0024, 8.3592, 1.5336}},
{9401, {12.0024, 8.3592, 1.5336}},
{9402, {12.0024, 8.3592, 1.5336}},
{9403, {12.0024, 8.3592, 1.5336}},
{9404, {12.0024, 8.3592, 1.5336}},
{9405, {12.0024, 8.3592, 1.5336}},
{9406, {12.0024, 8.3592, 1.5336}},
{9407, {12.0024, 8.3592, 1.5336}},
{9408, {12.0024, 8.3592, 1.5336}},
{9409, {12.0024, 8.3592, 1.5336}},
{9410, {12.0024, 8.3592, 1.5336}},
{9411, {12.0024, 8.3592, 1.5336}},
{9412, {12.0024, 8.3592, 1.5336}},
{9413, {12.0024, 8.3592, 1.5336}},
{9414, {12.0024, 8.3592, 1.5336}},
{9415, {12.0024, 8.3592, 1.5336}},
{9416, {12.0024, 8.3592, 1.5336}},
{9417, {12.0024, 8.3592, 1.5336}},
{9418, {12.0024, 8.3592, 1.5336}},
{9419, {12.0024, 8.3592, 1.5336}},
{9420, {12.0024, 8.3592, 1.5336}},
{9421, {12.0024, 8.3592, 1.5336}},
{9422, {12.0024, 8.3592, 1.5336}},
{9423, {12.0024, 8.3592, 1.5336}},
{9424, {12.0024, 8.3592, 1.5336}},
{9425, {12.0024, 8.3592, 1.5336}},
{9426, {12.0024, 8.3592, 1.5336}},
{9427, {12.0024, 8.3592, 1.5336}},
{9428, {12.0024, 8.3592, 1.5336}},
{9429, {12.0024, 8.3592, 1.5336}},
{9430, {12.0024, 8.3592, 1.5336}},
{9431, {12.0024, 8.3592, 1.5336}},
{9432, {12.0024, 8.3592, 1.5336}},
{9433, {12.0024, 8.3592, 1.5336}},
{9434, {12.0024, 8.3592, 1.5336}},
{9435, {12.0024, 8.3592, 1.5336}},
{9436, {12.0024, 8.3592, 1.5336}},
{9437, {12.0024, 8.3592, 1.5336}},
{9438, {12.0024, 8.3592, 1.5336}},
{9439, {12.0024, 8.3592, 1.5336}},
{9440, {12.0024, 8.3592, 1.5336}},
{9441, {12.0024, 8.3592, 1.5336}},
{9442, {12.0024, 8.3592, 1.5336}},
{9443, {12.0024, 8.3592, 1.5336}},
{9444, {12.0024, 8.3592, 1.5336}},
{9445, {12.0024, 8.3592, 1.5336}},
{9446, {12.0024, 8.3592, 1.5336}},
{9447, {12.0024, 8.3592, 1.5336}},
{9448, {12.0024, 8.3592, 1.5336}},
{9449, {12.0024, 8.3592, 1.5336}},
{9450, {12.0024, 8.3592, 1.5336}},
{9451, {12.0024, 8.3592, 1.5408}},
{9452, {12.0024, 8.3592, 1.5408}},
{9453, {12.0024, 8.3592, 1.5336}},
{9454, {12.0024, 8.3592, 1.5408}},
{9455, {12.0024, 8.3592, 1.5408}},
{9456, {12.0024, 8.3592, 1.5336}},
{9457, {12.0024, 8.3592, 1.5408}},
{9458, {12.0024, 8.3592, 1.5336}},
{9459, {12.0024, 8.3592, 1.5336}},
{9460, {12.0024, 8.3592, 1.5408}},
{9461, {12.0024, 8.7696, 1.9440}},
{9462, {12.0024, 8.7696, 1.9440}},
{9463, {12.0024, 8.7696, 1.9440}},
{9464, {12.0024, 8.7696, 1.9440}},
{9465, {12.0024, 8.7696, 1.9440}},
{9466, {12.0024, 8.7696, 1.9440}},
{9467, {12.0024, 8.7696, 1.9440}},
{9468, {12.0024, 8.7696, 1.9440}},
{9469, {12.0024, 8.7696, 1.9440}},
{9470, {12.0024, 8.7696, 1.9440}},
{9471, {12.0024, 9.2304, 0.6624}},
{9472, {12.0024, 3.8448, -2.9736}},
{9473, {12.0024, 3.9960, -2.8296}},
{9474, {12.0024, 9.4104, 2.5920}},
{9475, {12.0024, 9.4104, 2.5920}},
{9476, {12.0024, 3.8448, -2.9736}},
{9477, {12.0024, 3.9960, -2.8296}},
{9478, {12.0024, 8.9784, 2.1600}},
{9479, {12.0024, 8.9784, 2.1600}},
{9480, {12.0024, 3.8448, -2.9736}},
{9481, {12.0024, 3.9960, -2.8296}},
{9482, {12.0024, 8.9784, 2.1600}},
{9483, {12.0024, 8.9784, 2.1600}},
{9484, {12.0024, 3.8448, 2.5920}},
{9485, {12.0024, 3.9960, 2.5920}},
{9486, {12.0024, 3.8448, 2.5920}},
{9487, {12.0024, 3.9960, 2.5920}},
{9488, {12.0024, 3.8448, 2.5920}},
{9489, {12.0024, 3.9960, 2.5920}},
{9490, {12.0024, 3.8448, 2.5920}},
{9491, {12.0024, 3.9960, 2.5920}},
{9492, {12.0024, 9.4176, -2.9736}},
{9493, {12.0024, 9.4104, -2.8296}},
{9494, {12.0024, 9.4176, -2.9736}},
{9495, {12.0024, 9.4104, -2.8296}},
{9496, {12.0024, 9.4176, -2.9736}},
{9497, {12.0024, 9.4104, -2.8296}},
{9498, {12.0024, 9.4176, -2.9736}},
{9499, {12.0024, 9.4104, -2.8296}},
{9500, {12.0024, 9.4104, 2.5920}},
{9501, {12.0024, 9.4104, 2.5920}},
{9502, {12.0024, 9.4176, 2.5920}},
{9503, {12.0024, 9.4104, 2.5920}},
{9504, {12.0024, 9.4104, 2.5920}},
{9505, {12.0024, 9.4104, 2.5920}},
{9506, {12.0024, 9.4104, 2.5920}},
{9507, {12.0024, 9.4104, 2.5920}},
{9508, {12.0024, 9.4104, 2.5920}},
{9509, {12.0024, 9.4104, 2.5920}},
{9510, {12.0024, 9.4176, 2.5920}},
{9511, {12.0024, 9.4104, 2.5920}},
{9512, {12.0024, 9.4104, 2.5920}},
{9513, {12.0024, 9.4104, 2.5920}},
{9514, {12.0024, 9.4104, 2.5920}},
{9515, {12.0024, 9.4104, 2.5920}},
{9516, {12.0024, 3.8448, 2.5920}},
{9517, {12.0024, 3.9960, 2.5920}},
{9518, {12.0024, 3.9960, 2.5920}},
{9519, {12.0024, 3.9960, 2.5920}},
{9520, {12.0024, 3.8448, 2.5920}},
{9521, {12.0024, 3.9960, 2.5920}},
{9522, {12.0024, 3.9960, 2.5920}},
{9523, {12.0024, 3.9960, 2.5920}},
{9524, {12.0024, 9.4176, -2.9736}},
{9525, {12.0024, 9.4104, -2.8296}},
{9526, {12.0024, 9.4104, -2.8296}},
{9527, {12.0024, 9.4104, -2.8296}},
{9528, {12.0024, 9.4176, -2.9736}},
{9529, {12.0024, 9.4104, -2.8296}},
{9530, {12.0024, 9.4104, -2.8296}},
{9531, {12.0024, 9.4104, -2.8296}},
{9532, {12.0024, 9.4104, 2.5920}},
{9533, {12.0024, 9.4104, 2.5920}},
{9534, {12.0024, 9.4104, 2.5920}},
{9535, {12.0024, 9.4104, 2.5920}},
{9536, {12.0024, 9.4176, 2.5920}},
{9537, {12.0024, 9.4176, 2.5920}},
{9538, {12.0024, 9.4104, 2.5920}},
{9539, {12.0024, 9.4104, 2.5920}},
{9540, {12.0024, 9.4104, 2.5920}},
{9541, {12.0024, 9.4104, 2.5920}},
{9542, {12.0024, 9.4104, 2.5920}},
{9543, {12.0024, 9.4104, 2.5920}},
{9544, {12.0024, 9.4104, 2.5920}},
{9545, {12.0024, 9.4104, 2.5920}},
{9546, {12.0024, 9.4104, 2.5920}},
{9547, {12.0024, 9.4104, 2.5920}},
{9548, {12.0024, 3.8448, -2.9736}},
{9549, {12.0024, 3.9960, -2.8296}},
{9550, {12.0024, 8.9784, 2.1600}},
{9551, {12.0024, 8.9784, 2.1600}},
{9552, {12.0024, 4.7160, -2.1024}},
{9553, {12.0024, 9.4104, 2.5920}},
{9554, {12.0024, 4.7160, 2.5920}},
{9555, {12.0024, 3.8448, 2.5920}},
{9556, {12.0024, 4.7160, 2.5920}},
{9557, {12.0024, 4.7160, 2.5920}},
{9558, {12.0024, 3.8448, 2.5920}},
{9559, {12.0024, 4.7160, 2.5920}},
{9560, {12.0024, 9.4104, -2.1024}},
{9561, {12.0024, 9.4176, -2.9736}},
{9562, {12.0024, 9.4104, -2.1024}},
{9563, {12.0024, 9.4104, -2.1024}},
{9564, {12.0024, 9.4176, -2.9736}},
{9565, {12.0024, 9.4104, -2.1024}},
{9566, {12.0024, 9.4104, 2.5920}},
{9567, {12.0024, 9.4104, 2.5920}},
{9568, {12.0024, 9.4104, 2.5920}},
{9569, {12.0024, 9.4104, 2.5920}},
{9570, {12.0024, 9.4104, 2.5920}},
{9571, {12.0024, 9.4104, 2.5920}},
{9572, {12.0024, 4.7160, 2.5920}},
{9573, {12.0024, 3.8448, 2.5920}},
{9574, {12.0024, 4.7160, 2.5920}},
{9575, {12.0024, 9.4104, -2.1024}},
{9576, {12.0024, 9.4176, -2.9736}},
{9577, {12.0024, 9.4104, -2.1024}},
{9578, {12.0024, 9.4104, 2.5920}},
{9579, {12.0024, 9.4104, 2.5920}},
{9580, {12.0024, 9.4104, 2.5920}},
{9581, {12.0024, 3.8448, 2.5920}},
{9582, {12.0024, 3.8448, 2.5920}},
{9583, {12.0024, 9.4176, -2.9736}},
{9584, {12.0024, 9.4176, -2.9736}},
{9585, {12.0024, 9.4104, 2.5920}},
{9586, {12.0024, 9.4104, 2.5920}},
{9587, {12.0024, 9.4104, 2.5920}},
{9588, {12.0024, 3.8448, -2.9736}},
{9589, {12.0024, 9.4104, -3.4056}},
{9590, {12.0024, 3.8448, -2.9736}},
{9591, {12.0024, 3.4128, 2.5920}},
{9592, {12.0024, 3.9960, -2.8296}},
{9593, {12.0024, 9.4104, -3.4056}},
{9594, {12.0024, 3.9960, -2.8296}},
{9595, {12.0024, 3.4128, 2.5920}},
{9596, {12.0024, 3.9960, -2.8296}},
{9597, {12.0024, 9.4104, 2.5920}},
{9598, {12.0024, 3.9960, -2.8296}},
{9599, {12.0024, 9.4104, 2.5920}},
{9600, {12.0024, 9.4104, -3.4056}},
{9601, {12.0024, -1.0872, 2.5920}},
{9602, {12.0024, 0.4104, 2.5920}},
{9603, {12.0024, 1.9080, 2.5920}},
{9604, {12.0024, 3.4128, 2.5920}},
{9605, {12.0024, 4.9104, 2.5920}},
{9606, {12.0024, 6.4080, 2.5920}},
{9607, {12.0024, 7.9128, 2.5920}},
{9608, {12.0024, 9.4104, 2.5920}},
{9609, {12.0024, 9.4104, 2.5920}},
{9610, {12.0024, 9.4104, 2.5920}},
{9611, {12.0024, 9.4104, 2.5920}},
{9612, {12.0024, 9.4104, 2.5920}},
{9613, {12.0024, 9.4104, 2.5920}},
{9614, {12.0024, 9.4104, 2.5920}},
{9615, {12.0024, 9.4104, 2.5920}},
{9616, {12.0024, 9.4104, 2.5920}},
{9617, {12.0024, 9.4104, 1.8432}},
{9618, {12.0024, 9.4176, 2.5920}},
{9619, {12.0024, 9.4104, 2.5920}},
{9620, {12.0024, 9.4104, -7.9056}},
{9621, {12.0024, 9.4104, 2.5920}},
{9622, {12.0024, 3.4128, 2.5920}},
{9623, {12.0024, 3.4128, 2.5920}},
{9624, {12.0024, 9.4104, -3.4056}},
{9625, {12.0024, 9.4104, 2.5920}},
{9626, {12.0024, 9.4104, 2.5920}},
{9627, {12.0024, 9.4104, 2.5920}},
{9628, {12.0024, 9.4104, 2.5920}},
{9629, {12.0024, 9.4104, -3.4056}},
{9630, {12.0024, 9.4104, 2.5920}},
{9631, {12.0024, 9.4104, 2.5920}},
{9632, {9.2448, 7.8768, -0.0000}},
{9633, {9.2448, 7.8768, -0.0000}},
{9634, {9.2448, 7.8768, -0.0000}},
{9635, {9.2448, 7.8768, -0.0000}},
{9636, {9.2448, 7.8768, -0.0000}},
{9637, {9.2448, 7.8768, -0.0000}},
{9638, {9.2448, 7.8768, -0.0000}},
{9639, {9.2448, 7.8768, -0.0000}},
{9640, {9.2448, 7.8768, -0.0000}},
{9641, {9.2448, 7.8768, -0.0000}},
{9642, {4.3272, 5.1480, -1.6776}},
{9643, {4.3272, 5.1480, -1.6704}},
{9644, {7.8408, 5.1480, -1.6776}},
{9645, {7.8408, 5.1480, -1.6704}},
{9646, {4.3272, 6.9048, 0.0864}},
{9647, {4.3272, 6.9048, 0.0864}},
{9648, {9.5976, 5.1480, -1.6776}},
{9649, {9.5976, 5.1480, -1.6704}},
{9650, {9.2448, 7.0848, -0.1008}},
{9651, {9.2448, 7.0848, -0.1008}},
{9652, {4.3272, 5.0328, -1.9512}},
{9653, {4.3272, 5.0328, -1.9512}},
{9654, {7.9488, 7.7544, 0.9360}},
{9655, {7.9488, 7.7544, 0.9360}},
{9656, {3.7800, 5.3208, -1.4976}},
{9657, {3.7800, 5.3208, -1.4976}},
{9658, {11.0592, 6.7176, -0.1008}},
{9659, {11.0592, 6.7176, -0.1008}},
{9660, {9.2448, 7.0848, -0.1008}},
{9661, {9.2448, 7.0848, -0.1008}},
{9662, {4.3272, 5.0328, -1.9512}},
{9663, {4.3272, 5.0328, -1.9512}},
{9664, {7.9488, 7.7544, 0.9360}},
{9665, {7.9488, 7.7544, 0.9360}},
{9666, {3.7800, 5.3208, -1.4976}},
{9667, {3.7800, 5.3208, -1.4976}},
{9668, {11.0592, 6.7176, -0.1008}},
{9669, {11.0592, 6.7176, -0.1008}},
{9670, {9.2448, 7.9776, 1.1592}},
{9671, {9.2448, 7.9776, 1.1592}},
{9672, {9.2448, 7.9776, 1.1592}},
{9673, {9.2448, 7.8048, 0.9792}},
{9674, {9.2448, 7.9776, 1.1592}},
{9675, {9.2448, 7.8048, 0.9792}},
{9676, {6.0912, 5.6304, 0.1440}},
{9677, {9.2448, 7.8048, 0.9792}},
{9678, {9.2448, 7.8048, 0.9792}},
{9679, {9.2448, 7.8048, 0.9792}},
{9680, {9.2448, 7.8048, 0.9792}},
{9681, {9.2448, 7.8048, 0.9792}},
{9682, {9.2448, 7.8048, 0.9792}},
{9683, {9.2448, 7.7976, 0.9792}},
{9684, {9.2448, 7.8048, 0.9792}},
{9685, {9.2448, 7.8048, 0.9792}},
{9686, {5.3064, 7.8048, 0.9792}},
{9687, {5.3064, 7.8048, 0.9792}},
{9688, {12.0024, 9.4104, 2.5920}},
{9689, {12.0024, 9.4104, 2.5920}},
{9690, {12.0024, 9.4104, -3.4056}},
{9691, {12.0024, 3.4128, 2.5920}},
{9692, {9.2448, 7.8048, -3.4056}},
{9693, {9.2448, 7.8048, -3.4056}},
{9694, {9.2448, 3.4128, 0.9792}},
{9695, {9.2448, 3.4128, 0.9792}},
{9696, {9.2448, 7.8048, -3.4056}},
{9697, {9.2448, 3.4128, 0.9792}},
{9698, {9.2448, 7.3512, 0.5328}},
{9699, {9.2448, 7.3512, 0.5328}},
{9700, {9.2448, 7.3512, 0.5328}},
{9701, {9.2448, 7.3512, 0.5328}},
{9702, {4.3272, 5.3424, -1.4760}},
{9703, {9.2448, 7.3512, 0.5328}},
{9704, {9.2448, 7.3512, 0.5328}},
{9705, {9.2448, 7.3512, 0.5328}},
{9706, {9.2448, 7.3512, 0.5328}},
{9707, {9.2448, 7.3512, 0.5328}},
{9708, {9.2448, 7.0848, -0.1008}},
{9709, {9.2448, 7.0848, -0.1008}},
{9710, {9.2448, 7.0848, -0.1008}},
{9711, {12.0024, 9.1800, 2.3616}},
{9712, {9.2448, 7.3512, 0.5328}},
{9713, {9.2448, 7.3512, 0.5328}},
{9714, {9.2448, 7.3512, 0.5328}},
{9715, {9.2448, 7.3512, 0.5328}},
{9716, {9.2448, 7.8048, 0.9792}},
{9717, {9.2448, 7.8048, 0.9792}},
{9718, {9.2448, 7.8048, 0.9792}},
{9719, {9.2448, 7.8048, 0.9792}},
{9720, {9.2448, 7.3512, 0.5328}},
{9721, {9.2448, 7.3512, 0.5328}},
{9722, {9.2448, 7.3512, 0.5328}},
{9723, {7.1352, 6.4152, -0.4032}},
{9724, {7.1352, 6.4152, -0.4032}},
{9725, {5.5440, 5.6952, -1.1304}},
{9726, {5.5440, 5.6952, -1.1304}},
{9727, {9.2448, 7.3512, 0.5328}},
{9728, {12.0024, 9.0144, 1.9080}},
{9729, {12.0024, 8.0280, -1.4760}},
{9730, {12.6360, 6.6600, 2.5920}},
{9731, {12.0024, 9.2592, 1.3032}},
{9732, {12.0024, 5.2128, 1.3248}},
{9733, {9.1656, 7.9776, 0.2880}},
{9734, {9.1656, 7.9776, 0.2880}},
{9735, {5.6160, 8.1288, 0.0288}},
{9736, {8.1000, 7.9776, 1.3464}},
{9737, {9.2448, 7.8048, 0.9792}},
{9738, {11.3544, 7.5384, 0.1800}},
{9739, {11.3544, 7.5384, 0.1728}},
{9740, {6.7248, 5.5368, -0.0576}},
{9741, {9.3240, 7.4088, 1.6416}},
{9742, {12.2472, 7.8480, -0.0000}},
{9743, {12.2472, 7.8480, -0.0000}},
{9744, {12.0024, 9.2232, 2.4048}},
{9745, {12.0024, 9.2232, 2.4048}},
{9746, {12.0024, 9.2232, 2.4048}},
{9747, {10.6992, 8.1720, -0.2664}},
{9748, {12.6360, 9.4176, 2.5920}},
{9749, {12.0960, 9.0936, 1.7496}},
{9750, {9.1728, 7.8696, -0.0000}},
{9751, {9.1728, 7.8696, -0.0000}},
{9752, {10.7856, 8.8272, 1.5552}},
{9753, {12.0024, 6.9840, -0.0360}},
{9754, {11.3040, 5.8464, -1.2816}},
{9755, {11.3040, 5.8464, -1.2816}},
{9756, {11.3040, 5.8536, -1.2816}},
{9757, {11.3040, 8.5824, 1.4544}},
{9758, {11.3040, 5.8536, -1.2816}},
{9759, {11.3040, 8.5824, 1.4544}},
{9760, {8.7336, 9.3168, 2.5200}},
{9761, {7.7328, 8.9280, -0.0000}},
{9762, {12.0024, 9.1224, 2.2968}},
{9763, {12.0024, 8.9352, 0.9072}},
{9764, {12.0024, 9.2232, 2.4048}},
{9765, {7.1712, 8.5896, 2.2968}},
{9766, {7.4448, 8.7480, 1.7136}},
{9767, {8.6688, 8.9064, 1.1736}},
{9768, {7.4448, 8.7480, 1.7136}},
{9769, {12.0024, 8.1144, 1.2960}},
{9770, {10.6200, 8.6760, -0.0000}},
{9771, {12.0024, 9.3024, 2.4048}},
{9772, {10.4616, 8.9856, 2.2968}},
{9773, {9.8928, 8.6760, 0.0288}},
{9774, {10.1160, 8.9064, 0.2232}},
{9775, {10.1160, 8.9064, 0.2232}},
{9776, {12.0024, 7.3368, -1.2384}},
{9777, {12.0024, 7.3368, -1.2384}},
{9778, {12.0024, 7.3368, -1.2384}},
{9779, {12.0024, 7.3368, -1.2384}},
{9780, {12.0024, 7.3368, -1.2384}},
{9781, {12.0024, 7.3368, -1.2384}},
{9782, {12.0024, 7.3368, -1.2384}},
{9783, {12.0024, 7.3368, -1.2384}},
{9784, {12.0024, 8.9208, 2.1024}},
{9785, {10.9944, 8.4312, 1.6056}},
{9786, {10.9944, 8.4312, 1.6056}},
{9787, {10.9944, 8.4312, 1.6056}},
{9788, {9.0360, 8.8200, 0.1512}},
{9789, {8.9424, 8.9712, 0.2952}},
{9790, {8.9424, 8.9712, 0.2952}},
{9791, {7.1856, 9.4104, 2.5848}},
{9792, {8.6400, 9.3312, 2.4048}},
{9793, {8.6400, 9.3312, 2.4048}},
{9794, {10.5480, 8.7408, 0.8712}},
{9795, {9.4896, 8.7408, 1.1736}},
{9796, {7.1280, 8.7480, 1.8360}},
{9797, {8.8920, 8.7480, 1.4688}},
{9798, {11.3832, 8.7408, 1.1736}},
{9799, {6.1200, 8.7408, 1.1736}},
{9800, {13.8816, 8.8992, 2.3184}},
{9801, {12.6504, 8.6760, 2.4552}},
{9802, {11.5704, 9.2160, 0.5832}},
{9803, {13.0896, 8.6832, -0.0000}},
{9804, {11.2968, 9.3960, 2.4552}},
{9805, {11.2032, 8.8344, 2.3184}},
{9806, {11.3472, 8.6760, -0.8640}},
{9807, {12.2976, 8.8488, 2.4336}},
{9808, {11.1456, 8.8920, 0.2232}},
{9809, {13.1616, 8.8992, 1.7352}},
{9810, {12.7872, 7.9560, -0.7200}},
{9811, {9.3600, 8.8920, 0.2232}},
{9812, {11.1528, 8.9136, 2.0304}},
{9813, {11.6784, 8.9640, 2.1528}},
{9814, {9.9504, 8.7120, 2.0016}},
{9815, {12.6360, 9.1656, 2.2320}},
{9816, {11.4696, 9.1224, 2.3112}},
{9817, {9.3024, 9.0144, 2.1888}},
{9818, {11.5992, 8.9136, 2.0304}},
{9819, {11.6784, 8.9568, 2.1600}},
{9820, {9.9504, 8.7192, 2.0016}},
{9821, {12.6360, 9.1656, 2.2392}},
{9822, {11.4696, 9.1224, 2.3112}},
{9823, {9.3024, 9.0144, 2.1888}},
{9824, {8.2872, 9.0000, -0.0000}},
{9825, {9.1440, 9.0000, 0.1872}},
{9826, {7.8840, 9.0000, 0.1656}},
{9827, {10.1808, 9.0072, -0.0000}},
{9828, {8.2872, 9.0072, -0.0000}},
{9829, {9.1440, 9.0000, 0.1872}},
{9830, {7.8840, 9.0000, 0.1656}},
{9831, {10.1808, 9.0000, -0.0000}},
{9832, {12.3048, 8.5608, 1.8504}},
{9833, {4.7952, 9.1224, 2.2968}},
{9834, {7.5024, 9.1224, 2.2968}},
{9835, {9.3960, 9.1224, 2.2968}},
{9836, {9.3960, 9.1224, 2.2968}},
{9837, {5.3496, 9.1224, 2.3040}},
{9838, {4.8960, 9.1224, 2.3040}},
{9839, {4.8960, 9.1224, 2.3040}},
{9840, {8.6112, 8.7264, 1.6416}},
{9841, {9.2664, 9.1296, 2.0520}},
{9842, {12.0024, 8.9928, 2.3112}},
{9843, {12.0024, 9.0504, 2.3472}},
{9844, {12.0024, 9.0504, 2.3472}},
{9845, {12.0024, 9.0504, 2.3472}},
{9846, {12.0024, 9.0504, 2.3472}},
{9847, {12.0024, 9.0504, 2.3472}},
{9848, {12.0024, 9.0504, 2.3472}},
{9849, {12.0024, 9.0504, 2.3472}},
{9850, {12.0024, 9.0504, 2.3472}},
{9851, {12.0024, 8.7840, 2.1096}},
{9852, {12.0024, 9.4104, 2.5920}},
{9853, {12.0024, 9.4104, 2.5920}},
{9854, {12.0024, 9.4104, 2.5920}},
{9855, {12.0024, 8.8128, 2.0808}},
{9856, {12.0024, 8.5248, 1.7064}},
{9857, {12.0024, 8.5248, 1.7064}},
{9858, {12.0024, 8.5248, 1.7064}},
{9859, {12.0024, 8.5248, 1.7064}},
{9860, {12.0024, 8.5248, 1.7064}},
{9861, {12.0024, 8.5248, 1.7064}},
{9862, {12.0024, 9.1224, 2.2968}},
{9863, {12.0024, 9.1224, 2.2968}},
{9864, {12.0024, 9.1224, 2.3040}},
{9865, {12.0024, 9.1224, 2.3040}},
{9866, {12.0024, 4.8528, -3.7224}},
{9867, {12.0024, 4.8528, -3.7224}},
{9868, {12.0024, 6.0984, -2.4840}},
{9869, {12.0024, 6.0984, -2.4840}},
{9870, {12.0024, 6.0984, -2.4840}},
{9871, {12.0024, 6.0984, -2.4840}},
{9872, {12.0024, 9.2232, 2.4048}},
{9873, {12.0024, 9.2232, 2.4048}},
{9874, {13.6296, 9.0000, 1.9800}},
{9875, {10.9008, 9.1224, 2.3040}},
{9876, {12.0024, 7.4520, 0.9792}},
{9877, {7.5024, 8.5176, 1.8576}},
{9878, {13.2768, 9.2376, 2.4192}},
{9879, {11.1096, 8.6832, 1.1736}},
{9880, {6.8472, 8.6616, 1.7136}},
{9881, {11.1528, 8.3808, 1.5624}},
{9882, {13.1400, 8.5320, 2.3616}},
{9883, {10.9080, 8.8632, 2.0448}},
{9884, {9.7488, 8.1072, 1.7424}},
{9885, {12.0024, 8.7264, 1.7784}},
{9886, {12.0024, 8.8344, 2.0088}},
{9887, {12.0024, 8.8344, 2.0088}},
{9888, {12.0024, 9.0504, 1.1808}},
{9889, {5.6448, 9.0648, 2.3472}},
{9890, {9.4104, 6.0048, 1.8576}},
{9891, {9.5472, 8.1720, 0.9432}},
{9892, {8.9568, 9.3600, 2.5344}},
{9893, {6.6168, 8.1720, 1.8504}},
{9894, {7.3152, 8.4312, 0.1440}},
{9895, {8.5104, 9.1008, 2.1456}},
{9896, {6.1272, 9.3528, 0.1440}},
{9897, {10.4328, 6.0048, -0.8136}},
{9898, {7.1352, 6.7464, -0.0720}},
{9899, {7.1352, 6.7464, -0.0720}},
{9900, {5.5440, 5.9544, -0.8712}},
{9901, {9.4104, 6.0048, -0.8136}},
{9902, {11.9088, 6.2928, -0.5256}},
{9903, {14.8248, 6.0048, -0.8136}},
{9904, {10.8792, 6.0048, -1.6920}},
{9905, {7.6608, 9.0072, 2.1888}},
{9906, {6.1272, 6.0048, 1.8576}},
{9907, {7.7112, 8.5968, 2.4048}},
{9908, {8.6688, 8.5968, 2.4048}},
{9909, {8.6400, 8.3232, 2.4048}},
{9910, {9.3312, 7.4664, 2.0376}},
{9911, {5.9400, 8.3232, 2.3832}},
{9912, {7.2288, 9.0000, 2.4048}},
{9913, {10.0368, 7.3656, 0.7920}},
{9914, {7.9920, 7.3080, -0.0000}},
{9915, {7.9920, 7.3080, 0.0072}},
{9916, {8.2944, 5.9544, 2.1240}},
{9917, {12.0024, 9.2160, 2.3976}},
{9918, {12.0024, 9.2160, 2.3976}},
{9919, {12.0024, 9.0072, 2.1456}},
{9920, {12.0024, 9.4104, 2.5920}},
{9921, {12.0024, 9.4104, 2.5920}},
{9922, {12.0024, 9.4104, 2.5920}},
{9923, {12.0024, 9.4104, 2.5920}},
{9924, {12.0024, 7.6824, 2.0952}},
{9925, {12.0024, 9.1800, -1.4760}},
{9926, {12.0024, 8.4024, 1.5768}},
{9927, {12.0024, 8.8056, 2.0952}},
{9928, {12.0024, 8.0280, 2.5920}},
{9929, {9.1728, 7.5744, 0.2952}},
{9930, {9.1728, 7.5744, 0.2952}},
{9931, {12.0024, 8.7048, 1.8864}},
{9932, {12.0024, 6.7320, -0.0936}},
{9933, {12.0024, 8.2368, 1.8288}},
{9934, {12.0024, 8.0208, 0.9432}},
{9935, {12.0024, 8.8776, 2.0808}},
{9936, {12.0024, 9.0720, 2.2176}},
{9937, {12.0024, 8.6328, 1.7136}},
{9938, {12.0024, 8.8272, 2.0088}},
{9939, {12.0024, 8.9784, 2.0736}},
{9940, {12.0024, 8.8272, 2.0088}},
{9941, {12.0024, 9.1152, 2.1888}},
{9942, {12.0024, 9.0792, 2.2536}},
{9943, {12.0024, 9.0792, 2.2536}},
{9944, {12.0024, 8.8848, 2.0664}},
{9945, {12.0024, 8.8848, 2.0664}},
{9946, {12.0024, 8.8272, 2.0088}},
{9947, {12.0024, 8.1072, 1.4760}},
{9948, {12.0024, 8.8848, 2.0664}},
{9949, {12.0024, 8.8848, 2.0664}},
{9950, {12.0024, 8.8848, 2.0664}},
{9951, {12.0024, 5.5152, -0.0000}},
{9952, {12.0024, 8.8848, 2.0736}},
{9953, {12.0024, 9.2448, 1.4184}},
{9954, {7.7688, 9.0000, 2.2464}},
{9955, {12.0024, 8.8560, 1.8504}},
{9956, {12.0024, 8.5608, 1.7424}},
{9957, {12.0024, 8.5608, 1.7424}},
{9958, {12.0024, 8.5608, 1.7424}},
{9959, {12.0024, 8.5608, 1.7424}},
{9960, {9.1728, 8.3304, 1.9368}},
{9961, {12.0024, 8.8128, 2.0016}},
{9962, {12.0024, 9.0144, 1.6992}},
{9963, {12.0024, 8.5032, 1.6056}},
{9964, {12.0024, 7.9632, 0.2952}},
{9965, {9.4320, 7.8984, 1.0728}},
{9966, {12.0024, 7.8984, 1.0728}},
{9967, {9.4320, 7.8984, 1.0728}},
{9968, {12.0024, 8.9856, 1.3176}},
{9969, {12.0024, 8.6328, 1.5984}},
{9970, {12.0024, 8.8128, 2.0304}},
{9971, {12.0024, 9.1224, 2.1672}},
{9972, {12.0024, 7.7040, 0.3960}},
{9973, {12.0024, 9.2016, 1.9728}},
{9974, {12.0024, 8.9280, 2.1096}},
{9975, {12.0024, 9.0864, 2.0592}},
{9976, {12.0024, 8.3088, 1.8144}},
{9977, {12.0024, 8.9208, 1.7568}},
{9978, {12.0024, 8.4456, 1.4976}},
{9979, {12.0024, 9.0936, 2.0952}},
{9980, {12.0024, 8.7408, 1.8072}},
{9981, {12.0024, 8.6040, 1.8936}},
{9982, {12.0024, 9.0576, 2.0808}},
{9983, {12.0024, 9.2232, 2.4048}},
{9984, {13.7376, 8.4888, 0.1944}},
{9985, {12.0168, 7.4520, -0.8568}},
{9986, {11.8800, 7.3296, -0.9720}},
{9987, {12.0168, 7.4592, -0.8568}},
{9988, {13.7376, 8.4888, 0.1872}},
{9989, {10.4688, 8.4672, 0.1728}},
{9990, {12.0024, 9.1224, 2.2968}},
{9991, {12.0024, 9.1224, 2.2968}},
{9992, {11.3688, 8.8416, 1.5336}},
{9993, {8.6112, 6.6384, -1.6560}},
{9994, {9.5904, 8.0064, 0.9864}},
{9995, {9.1224, 8.6112, 1.6776}},
{9996, {7.0488, 9.2160, 0.3384}},
{9997, {10.9152, 6.2352, 0.1872}},
{9998, {11.2608, 7.7040, -0.5904}},
{9999, {11.5344, 6.6024, -1.6632}},
{10000, {11.2608, 7.7112, -0.5976}},
{10001, {11.6568, 6.6456, -1.6632}},
{10002, {12.0024, 7.0488, -1.2456}},
{10003, {9.4176, 8.4672, 0.1584}},
{10004, {10.4688, 8.4672, 0.1728}},
{10005, {9.4752, 8.3088, -0.0000}},
{10006, {9.4752, 8.3088, -0.0000}},
{10007, {8.0352, 7.9344, 0.8208}},
{10008, {8.4456, 8.4672, 0.1584}},
{10009, {9.4896, 8.3088, -0.0000}},
{10010, {9.4608, 8.3088, -0.0000}},
{10011, {9.4536, 8.3088, -0.0000}},
{10012, {9.3960, 8.3016, -0.0000}},
{10013, {6.2712, 8.3088, -0.0000}},
{10014, {6.9552, 8.3088, -0.0000}},
{10015, {6.7824, 8.3016, -0.0000}},
{10016, {9.9720, 8.6040, 0.2664}},
{10017, {8.6400, 8.4672, 0.1728}},
{10018, {9.7632, 8.4600, 0.1728}},
{10019, {9.7704, 8.4672, 0.1728}},
{10020, {9.7848, 8.4672, 0.1728}},
{10021, {9.8280, 8.4672, 0.1728}},
{10022, {9.8640, 8.4672, 0.1584}},
{10023, {9.8640, 8.4672, 0.1584}},
{10024, {12.0024, 8.5608, 1.8720}},
{10025, {10.1952, 8.4672, 0.1728}},
{10026, {9.8064, 8.4672, 0.1728}},
{10027, {10.4328, 8.4672, 0.1728}},
{10028, {10.2168, 8.4672, 0.1728}},
{10029, {10.3320, 8.4600, 0.1728}},
{10030, {10.1376, 8.4672, 0.1584}},
{10031, {10.3032, 8.4600, 0.1800}},
{10032, {11.4048, 8.4672, 0.1728}},
{10033, {9.2664, 8.3088, -0.0000}},
{10034, {9.0072, 8.3088, -0.0000}},
{10035, {9.3240, 8.3088, -0.0000}},
{10036, {9.8352, 8.4600, 0.1728}},
{10037, {9.8496, 8.4600, 0.1728}},
{10038, {8.6832, 8.4744, 0.1728}},
{10039, {9.6480, 8.3952, 0.0720}},
{10040, {9.5616, 8.3952, 0.0864}},
{10041, {9.8352, 8.4672, 0.1728}},
{10042, {9.4536, 8.3088, -0.0000}},
{10043, {8.8200, 8.4528, 0.1584}},
{10044, {8.8200, 8.4672, 0.1728}},
{10045, {8.5104, 8.4168, 0.1512}},
{10046, {8.5104, 8.4672, 0.2160}},
{10047, {10.2456, 8.4672, 0.1728}},
{10048, {10.1160, 8.4672, 0.1728}},
{10049, {9.8064, 8.4600, 0.1728}},
{10050, {9.8064, 8.4672, 0.1728}},
{10051, {8.8416, 8.4600, 0.1728}},
{10052, {8.5536, 8.3088, -0.0000}},
{10053, {8.6832, 8.3592, -0.0000}},
{10054, {8.6112, 8.3088, -0.0000}},
{10055, {9.7704, 8.4672, 0.1728}},
{10056, {9.7704, 8.4672, 0.1728}},
{10057, {8.8920, 8.4600, 0.1728}},
{10058, {9.8280, 8.4600, 0.1728}},
{10059, {9.7488, 8.4600, 0.1728}},
{10060, {8.0496, 7.6248, -0.6912}},
{10061, {10.8072, 8.4672, 0.1728}},
{10062, {9.4464, 8.3088, -0.0000}},
{10063, {9.4752, 8.3016, -0.0000}},
{10064, {9.4752, 8.3016, -0.0000}},
{10065, {9.4536, 8.3016, -0.0000}},
{10066, {9.4536, 8.3088, -0.0000}},
{10067, {8.4312, 8.5608, 1.3392}},
{10068, {8.4312, 8.5608, 1.3392}},
{10069, {4.8312, 8.6112, 1.3392}},
{10070, {9.7416, 8.4672, 0.1728}},
{10071, {4.9248, 8.9352, 1.9152}},
{10072, {2.0016, 8.3088, -0.0000}},
{10073, {3.6576, 8.3088, -0.0000}},
{10074, {5.3136, 8.3088, -0.0000}},
{10075, {5.0544, 8.4600, -3.1464}},
{10076, {5.0544, 8.4600, -3.1464}},
{10077, {8.3520, 8.4960, -3.1536}},
{10078, {8.3520, 8.4600, -3.1320}},
{10079, {5.0544, 2.7720, 2.5416}},
{10080, {8.3520, 2.7720, 2.5560}},
{10081, {9.1152, 9.2664, 2.1312}},
{10082, {6.3576, 8.4744, 0.1728}},
{10083, {6.8616, 8.4672, 0.1728}},
{10084, {11.2536, 7.8120, -0.4752}},
{10085, {8.3520, 8.4600, 0.1728}},
{10086, {10.5912, 8.5536, 1.7352}},
{10087, {12.0024, 6.9840, -0.0360}},
{10088, {5.5512, 9.0072, 2.1888}},
{10089, {5.0976, 9.0072, 2.1888}},
{10090, {4.7736, 8.8056, 1.9872}},
{10091, {4.5648, 8.8056, 1.9872}},
{10092, {4.0536, 8.9712, 2.1528}},
{10093, {4.0536, 8.9712, 2.1528}},
{10094, {6.1704, 7.5888, 0.7704}},
{10095, {6.1704, 7.5888, 0.7704}},
{10096, {6.6096, 8.9712, 2.1528}},
{10097, {6.6096, 8.9712, 2.1528}},
{10098, {3.8160, 8.9856, 2.1672}},
{10099, {2.8512, 8.9856, 2.1672}},
{10100, {5.9976, 9.0360, 2.2176}},
{10101, {5.9976, 9.0360, 2.2176}},
{10102, {12.0024, 9.1224, 2.2968}},
{10103, {12.0024, 9.1224, 2.2968}},
{10104, {12.0024, 9.1224, 2.3040}},
{10105, {12.0024, 9.1152, 2.2968}},
{10106, {12.0024, 9.1152, 2.3040}},
{10107, {12.0024, 9.1224, 2.3040}},
{10108, {12.0024, 9.1152, 2.3040}},
{10109, {12.0024, 9.1224, 2.3040}},
{10110, {12.0024, 9.1224, 2.3040}},
{10111, {12.0024, 9.1224, 2.2968}},
{10112, {12.0024, 9.1224, 2.2968}},
{10113, {12.0024, 9.1224, 2.2968}},
{10114, {12.0024, 9.1224, 2.2968}},
{10115, {12.0024, 9.1224, 2.2968}},
{10116, {12.0024, 9.1224, 2.2968}},
{10117, {12.0024, 9.1224, 2.2968}},
{10118, {12.0024, 9.1224, 2.2968}},
{10119, {12.0024, 9.1224, 2.2968}},
{10120, {12.0024, 9.1224, 2.2968}},
{10121, {12.0024, 9.1224, 2.2968}},
{10122, {12.0024, 9.1152, 2.2968}},
{10123, {12.0024, 9.1224, 2.2968}},
{10124, {12.0024, 9.1224, 2.3040}},
{10125, {12.0024, 9.1152, 2.3040}},
{10126, {12.0024, 9.1152, 2.3040}},
{10127, {12.0024, 9.1152, 2.3040}},
{10128, {12.0024, 9.1152, 2.2968}},
{10129, {12.0024, 9.1152, 2.2968}},
{10130, {12.0024, 9.1224, 2.2968}},
{10131, {12.0024, 9.1224, 2.3040}},
{10132, {11.0736, 7.6104, -0.6912}},
{10133, {9.4536, 8.3088, -0.0000}},
{10134, {9.4536, 4.8744, -3.4272}},
{10135, {9.4536, 8.3088, -0.0000}},
{10136, {9.1296, 7.1712, -1.1304}},
{10137, {11.4336, 6.6240, -1.6776}},
{10138, {9.1296, 7.1712, -1.1304}},
{10139, {11.3616, 6.3144, -1.9872}},
{10140, {11.4552, 7.9272, -0.3816}},
{10141, {11.4408, 6.7464, -1.5624}},
{10142, {11.9160, 6.3576, -0.4680}},
{10143, {11.9664, 6.1056, -0.7128}},
{10144, {12.5064, 6.9408, 0.1224}},
{10145, {12.5064, 6.9408, 0.1152}},
{10146, {11.4192, 7.1352, -1.1736}},
{10147, {11.4192, 7.1352, -1.1736}},
{10148, {11.3400, 8.3088, -0.0000}},
{10149, {11.5056, 7.3008, -1.0008}},
{10150, {11.5056, 7.2936, -1.0008}},
{10151, {5.9040, 8.9568, 1.7352}},
{10152, {10.9296, 7.4808, -0.8496}},
{10153, {10.3752, 7.7832, -0.5256}},
{10154, {10.3752, 7.7832, -0.5256}},
{10155, {10.7352, 7.0920, -1.2096}},
{10156, {10.7352, 7.0920, -1.2096}},
{10157, {8.6832, 7.7760, -0.5256}},
{10158, {8.6832, 7.7760, -0.5256}},
{10159, {10.8360, 7.4376, -0.9216}},
{10160, {10.0800, 5.3424, -0.0000}},
{10161, {10.8360, 7.3872, -0.8712}},
{10162, {9.4536, 8.3016, -0.0000}},
{10163, {11.6856, 6.4008, -1.9224}},
{10164, {9.5976, 7.8624, -0.4392}},
{10165, {10.7136, 5.7744, -2.4840}},
{10166, {9.5976, 7.8624, -0.4392}},
{10167, {11.0016, 8.5464, 0.2304}},
{10168, {11.9376, 6.8184, -1.4832}},
{10169, {11.0016, 8.5464, 0.2304}},
{10170, {10.3032, 6.9552, -1.3464}},
{10171, {10.7928, 6.9408, -1.4112}},
{10172, {11.4408, 6.5088, -1.7928}},
{10173, {11.9232, 7.4016, -0.9072}},
{10174, {11.3760, 7.1136, -1.1880}},
{10175, {15.2712, 5.3424, -0.0000}},
{10176, {9.2160, 8.2368, -0.0000}},
{10177, {12.0024, 9.1008, -0.0000}},
{10178, {9.3240, 7.9992, -0.0000}},
{10179, {9.3240, 6.8184, -0.0000}},
{10180, {9.3240, 6.8184, -0.0000}},
{10181, {5.9976, 8.8704, 2.0520}},
{10182, {5.9976, 8.8704, 2.0520}},
{10183, {7.9920, 7.1784, 0.2736}},
{10184, {11.6640, 8.8848, 2.0664}},
{10185, {11.6640, 8.8848, 2.0664}},
{10186, {6.9984, 8.8272, 2.0016}},
{10187, {10.7784, 8.6904, 1.8648}},
{10188, {7.1568, 7.8264, -1.0368}},
{10189, {10.7784, 8.6904, 1.8648}},
{10190, {9.3240, 7.4736, 0.6480}},
{10191, {9.3240, 7.4736, 0.6480}},
{10192, {9.3240, 7.8984, 1.0728}},
{10193, {7.9920, 7.1784, 0.2664}},
{10194, {7.9920, 6.0048, -0.0000}},
{10195, {5.9976, 4.3992, 0.2664}},
{10196, {5.9976, 8.3304, -3.6720}},
{10197, {12.0024, 7.7544, 0.9360}},
{10198, {12.0024, 7.7544, 0.9360}},
{10199, {13.9608, 7.7544, 0.9360}},
{10200, {9.3240, 8.9280, -0.0000}},
{10201, {9.3240, 8.9280, -0.0000}},
{10202, {12.0024, 8.3304, -0.0000}},
{10203, {12.0024, 8.3304, -0.0000}},
{10204, {12.0024, 5.3208, -1.4976}},
{10205, {10.2888, 7.5744, 0.7560}},
{10206, {10.2888, 7.5744, 0.7560}},
{10207, {4.2336, 8.8272, 2.0016}},
{10208, {7.9920, 8.8920, 2.0736}},
{10209, {11.4048, 8.4888, 1.5768}},
{10210, {12.5424, 8.4384, 1.6200}},
{10211, {12.5424, 8.4384, 1.6200}},
{10212, {12.0024, 7.0632, 0.2376}},
{10213, {12.0024, 7.0632, 0.2376}},
{10214, {3.9960, 8.8704, 2.0520}},
{10215, {3.9960, 8.8704, 2.0520}},
{10216, {3.9024, 8.8704, 2.0520}},
{10217, {3.9024, 8.8704, 2.0520}},
{10218, {5.6592, 8.8704, 2.0520}},
{10219, {5.6592, 8.8704, 2.0520}},
{10220, {5.1120, 8.8704, 2.0520}},
{10221, {5.1120, 8.8704, 2.0520}},
{10222, {3.4128, 8.8704, 2.0520}},
{10223, {3.4128, 8.8704, 2.0520}},
{10224, {9.3888, 8.6904, 1.8648}},
{10225, {9.3888, 8.6904, 1.8648}},
{10226, {5.9976, 6.2424, -0.5760}},
{10227, {5.9976, 6.2424, -0.5760}},
{10228, {17.6256, 7.6536, 0.8280}},
{10229, {17.6256, 6.5520, -0.2736}},
{10230, {17.6256, 6.5520, -0.2736}},
{10231, {17.6256, 6.5520, -0.2736}},
{10232, {17.6256, 6.7104, -0.1008}},
{10233, {17.6256, 6.7176, -0.1080}},
{10234, {17.6256, 6.7104, -0.1080}},
{10235, {17.6256, 6.9264, 0.1080}},
{10236, {17.6256, 6.9264, 0.1080}},
{10237, {17.6256, 6.9264, 0.1080}},
{10238, {17.6256, 6.9264, 0.1080}},
{10239, {17.6256, 5.4504, -1.3824}},
{10240, {8.2008, 0.0000, -0.0000}},
{10241, {8.2008, 7.9344, -6.4800}},
{10242, {8.2008, 5.0616, -3.6072}},
{10243, {8.2008, 7.9344, -3.6072}},
{10244, {8.2008, 2.1888, -0.7416}},
{10245, {8.2008, 7.9344, -0.7416}},
{10246, {8.2008, 5.0616, -0.7416}},
{10247, {8.2008, 7.9344, -0.7416}},
{10248, {8.2008, 7.9344, -6.4800}},
{10249, {8.2008, 7.9344, -6.4800}},
{10250, {8.2008, 7.9344, -3.6072}},
{10251, {8.2008, 7.9344, -3.6072}},
{10252, {8.2008, 7.9344, -0.7416}},
{10253, {8.2008, 7.9344, -0.7416}},
{10254, {8.2008, 7.9344, -0.7416}},
{10255, {8.2008, 7.9344, -0.7416}},
{10256, {8.2008, 5.0760, -3.6288}},
{10257, {8.2008, 7.9344, -3.6288}},
{10258, {8.2008, 5.0760, -3.6072}},
{10259, {8.2008, 7.9344, -3.6072}},
{10260, {8.2008, 5.0760, -0.7416}},
{10261, {8.2008, 7.9344, -0.7416}},
{10262, {8.2008, 5.0760, -0.7416}},
{10263, {8.2008, 7.9344, -0.7416}},
{10264, {8.2008, 7.9344, -3.6288}},
{10265, {8.2008, 7.9344, -3.6288}},
{10266, {8.2008, 7.9344, -3.6072}},
{10267, {8.2008, 7.9344, -3.6072}},
{10268, {8.2008, 7.9344, -0.7416}},
{10269, {8.2008, 7.9344, -0.7416}},
{10270, {8.2008, 7.9344, -0.7416}},
{10271, {8.2008, 7.9344, -0.7416}},
{10272, {8.2008, 2.1888, -0.7416}},
{10273, {8.2008, 7.9344, -0.7416}},
{10274, {8.2008, 5.0616, -0.7416}},
{10275, {8.2008, 7.9344, -0.7416}},
{10276, {8.2008, 2.1888, -0.7416}},
{10277, {8.2008, 7.9344, -0.7416}},
{10278, {8.2008, 5.0616, -0.7416}},
{10279, {8.2008, 7.9344, -0.7416}},
{10280, {8.2008, 7.9344, -0.7416}},
{10281, {8.2008, 7.9344, -0.7416}},
{10282, {8.2008, 7.9344, -0.7416}},
{10283, {8.2008, 7.9344, -0.7416}},
{10284, {8.2008, 7.9344, -0.7416}},
{10285, {8.2008, 7.9344, -0.7416}},
{10286, {8.2008, 7.9344, -0.7416}},
{10287, {8.2008, 7.9344, -0.7416}},
{10288, {8.2008, 5.0760, -0.7416}},
{10289, {8.2008, 7.9344, -0.7416}},
{10290, {8.2008, 5.0760, -0.7416}},
{10291, {8.2008, 7.9344, -0.7416}},
{10292, {8.2008, 5.0760, -0.7416}},
{10293, {8.2008, 7.9344, -0.7416}},
{10294, {8.2008, 5.0760, -0.7416}},
{10295, {8.2008, 7.9344, -0.7416}},
{10296, {8.2008, 7.9344, -0.7416}},
{10297, {8.2008, 7.9344, -0.7416}},
{10298, {8.2008, 7.9344, -0.7416}},
{10299, {8.2008, 7.9344, -0.7416}},
{10300, {8.2008, 7.9344, -0.7416}},
{10301, {8.2008, 7.9344, -0.7416}},
{10302, {8.2008, 7.9344, -0.7416}},
{10303, {8.2008, 7.9344, -0.7416}},
{10304, {8.2008, -0.6840, 2.1312}},
{10305, {8.2008, 7.9344, 2.1312}},
{10306, {8.2008, 5.0616, 2.1312}},
{10307, {8.2008, 7.9344, 2.1312}},
{10308, {8.2008, 2.1888, 2.1312}},
{10309, {8.2008, 7.9344, 2.1312}},
{10310, {8.2008, 5.0616, 2.1312}},
{10311, {8.2008, 7.9344, 2.1312}},
{10312, {8.2008, 7.9344, 2.1312}},
{10313, {8.2008, 7.9344, 2.1312}},
{10314, {8.2008, 7.9344, 2.1312}},
{10315, {8.2008, 7.9344, 2.1312}},
{10316, {8.2008, 7.9344, 2.1312}},
{10317, {8.2008, 7.9344, 2.1312}},
{10318, {8.2008, 7.9344, 2.1312}},
{10319, {8.2008, 7.9344, 2.1312}},
{10320, {8.2008, 5.0760, 2.1312}},
{10321, {8.2008, 7.9344, 2.1312}},
{10322, {8.2008, 5.0760, 2.1312}},
{10323, {8.2008, 7.9344, 2.1312}},
{10324, {8.2008, 5.0760, 2.1312}},
{10325, {8.2008, 7.9344, 2.1312}},
{10326, {8.2008, 5.0760, 2.1312}},
{10327, {8.2008, 7.9344, 2.1312}},
{10328, {8.2008, 7.9344, 2.1312}},
{10329, {8.2008, 7.9344, 2.1312}},
{10330, {8.2008, 7.9344, 2.1312}},
{10331, {8.2008, 7.9344, 2.1312}},
{10332, {8.2008, 7.9344, 2.1312}},
{10333, {8.2008, 7.9344, 2.1312}},
{10334, {8.2008, 7.9344, 2.1312}},
{10335, {8.2008, 7.9344, 2.1312}},
{10336, {8.2008, 2.1888, 2.1312}},
{10337, {8.2008, 7.9344, 2.1312}},
{10338, {8.2008, 5.0616, 2.1312}},
{10339, {8.2008, 7.9344, 2.1312}},
{10340, {8.2008, 2.1888, 2.1312}},
{10341, {8.2008, 7.9344, 2.1312}},
{10342, {8.2008, 5.0616, 2.1312}},
{10343, {8.2008, 7.9344, 2.1312}},
{10344, {8.2008, 7.9344, 2.1312}},
{10345, {8.2008, 7.9344, 2.1312}},
{10346, {8.2008, 7.9344, 2.1312}},
{10347, {8.2008, 7.9344, 2.1312}},
{10348, {8.2008, 7.9344, 2.1312}},
{10349, {8.2008, 7.9344, 2.1312}},
{10350, {8.2008, 7.9344, 2.1312}},
{10351, {8.2008, 7.9344, 2.1312}},
{10352, {8.2008, 5.0760, 2.1312}},
{10353, {8.2008, 7.9344, 2.1312}},
{10354, {8.2008, 5.0760, 2.1312}},
{10355, {8.2008, 7.9344, 2.1312}},
{10356, {8.2008, 5.0760, 2.1312}},
{10357, {8.2008, 7.9344, 2.1312}},
{10358, {8.2008, 5.0760, 2.1312}},
{10359, {8.2008, 7.9344, 2.1312}},
{10360, {8.2008, 7.9344, 2.1312}},
{10361, {8.2008, 7.9344, 2.1312}},
{10362, {8.2008, 7.9344, 2.1312}},
{10363, {8.2008, 7.9344, 2.1312}},
{10364, {8.2008, 7.9344, 2.1312}},
{10365, {8.2008, 7.9344, 2.1312}},
{10366, {8.2008, 7.9344, 2.1312}},
{10367, {8.2008, 7.9344, 2.1312}},
{10368, {8.2008, -0.6912, 2.1384}},
{10369, {8.2008, 7.9344, 2.1384}},
{10370, {8.2008, 5.0616, 2.1384}},
{10371, {8.2008, 7.9344, 2.1384}},
{10372, {8.2008, 2.1888, 2.1384}},
{10373, {8.2008, 7.9344, 2.1384}},
{10374, {8.2008, 5.0616, 2.1384}},
{10375, {8.2008, 7.9344, 2.1384}},
{10376, {8.2008, 7.9344, 2.1384}},
{10377, {8.2008, 7.9344, 2.1384}},
{10378, {8.2008, 7.9344, 2.1384}},
{10379, {8.2008, 7.9344, 2.1384}},
{10380, {8.2008, 7.9344, 2.1384}},
{10381, {8.2008, 7.9344, 2.1384}},
{10382, {8.2008, 7.9344, 2.1384}},
{10383, {8.2008, 7.9344, 2.1384}},
{10384, {8.2008, 5.0760, 2.1384}},
{10385, {8.2008, 7.9344, 2.1384}},
{10386, {8.2008, 5.0760, 2.1384}},
{10387, {8.2008, 7.9344, 2.1384}},
{10388, {8.2008, 5.0760, 2.1384}},
{10389, {8.2008, 7.9344, 2.1384}},
{10390, {8.2008, 5.0760, 2.1384}},
{10391, {8.2008, 7.9344, 2.1384}},
{10392, {8.2008, 7.9344, 2.1384}},
{10393, {8.2008, 7.9344, 2.1384}},
{10394, {8.2008, 7.9344, 2.1384}},
{10395, {8.2008, 7.9344, 2.1384}},
{10396, {8.2008, 7.9344, 2.1384}},
{10397, {8.2008, 7.9344, 2.1384}},
{10398, {8.2008, 7.9344, 2.1384}},
{10399, {8.2008, 7.9344, 2.1384}},
{10400, {8.2008, 2.1888, 2.1384}},
{10401, {8.2008, 7.9344, 2.1384}},
{10402, {8.2008, 5.0616, 2.1384}},
{10403, {8.2008, 7.9344, 2.1384}},
{10404, {8.2008, 2.1888, 2.1384}},
{10405, {8.2008, 7.9344, 2.1384}},
{10406, {8.2008, 5.0616, 2.1384}},
{10407, {8.2008, 7.9344, 2.1384}},
{10408, {8.2008, 7.9344, 2.1384}},
{10409, {8.2008, 7.9344, 2.1384}},
{10410, {8.2008, 7.9344, 2.1384}},
{10411, {8.2008, 7.9344, 2.1384}},
{10412, {8.2008, 7.9344, 2.1384}},
{10413, {8.2008, 7.9344, 2.1384}},
{10414, {8.2008, 7.9344, 2.1384}},
{10415, {8.2008, 7.9344, 2.1384}},
{10416, {8.2008, 5.0760, 2.1384}},
{10417, {8.2008, 7.9344, 2.1384}},
{10418, {8.2008, 5.0760, 2.1384}},
{10419, {8.2008, 7.9344, 2.1384}},
{10420, {8.2008, 5.0760, 2.1384}},
{10421, {8.2008, 7.9344, 2.1384}},
{10422, {8.2008, 5.0760, 2.1384}},
{10423, {8.2008, 7.9344, 2.1384}},
{10424, {8.2008, 7.9344, 2.1384}},
{10425, {8.2008, 7.9344, 2.1384}},
{10426, {8.2008, 7.9344, 2.1384}},
{10427, {8.2008, 7.9344, 2.1384}},
{10428, {8.2008, 7.9344, 2.1384}},
{10429, {8.2008, 7.9344, 2.1384}},
{10430, {8.2008, 7.9344, 2.1384}},
{10431, {8.2008, 7.9344, 2.1384}},
{10432, {8.2008, -0.6840, 2.1384}},
{10433, {8.2008, 7.9344, 2.1384}},
{10434, {8.2008, 5.0616, 2.1384}},
{10435, {8.2008, 7.9344, 2.1384}},
{10436, {8.2008, 2.1888, 2.1384}},
{10437, {8.2008, 7.9344, 2.1384}},
{10438, {8.2008, 5.0616, 2.1384}},
{10439, {8.2008, 7.9344, 2.1384}},
{10440, {8.2008, 7.9344, 2.1384}},
{10441, {8.2008, 7.9344, 2.1384}},
{10442, {8.2008, 7.9344, 2.1384}},
{10443, {8.2008, 7.9344, 2.1384}},
{10444, {8.2008, 7.9344, 2.1384}},
{10445, {8.2008, 7.9344, 2.1384}},
{10446, {8.2008, 7.9344, 2.1384}},
{10447, {8.2008, 7.9344, 2.1384}},
{10448, {8.2008, 5.0760, 2.1384}},
{10449, {8.2008, 7.9344, 2.1384}},
{10450, {8.2008, 5.0760, 2.1384}},
{10451, {8.2008, 7.9344, 2.1384}},
{10452, {8.2008, 5.0760, 2.1384}},
{10453, {8.2008, 7.9344, 2.1384}},
{10454, {8.2008, 5.0760, 2.1384}},
{10455, {8.2008, 7.9344, 2.1384}},
{10456, {8.2008, 7.9344, 2.1384}},
{10457, {8.2008, 7.9344, 2.1384}},
{10458, {8.2008, 7.9344, 2.1384}},
{10459, {8.2008, 7.9344, 2.1384}},
{10460, {8.2008, 7.9344, 2.1384}},
{10461, {8.2008, 7.9344, 2.1384}},
{10462, {8.2008, 7.9344, 2.1384}},
{10463, {8.2008, 7.9344, 2.1384}},
{10464, {8.2008, 2.1888, 2.1384}},
{10465, {8.2008, 7.9344, 2.1384}},
{10466, {8.2008, 5.0616, 2.1384}},
{10467, {8.2008, 7.9344, 2.1384}},
{10468, {8.2008, 2.1888, 2.1384}},
{10469, {8.2008, 7.9344, 2.1384}},
{10470, {8.2008, 5.0616, 2.1384}},
{10471, {8.2008, 7.9344, 2.1384}},
{10472, {8.2008, 7.9344, 2.1384}},
{10473, {8.2008, 7.9344, 2.1384}},
{10474, {8.2008, 7.9344, 2.1384}},
{10475, {8.2008, 7.9344, 2.1384}},
{10476, {8.2008, 7.9344, 2.1384}},
{10477, {8.2008, 7.9344, 2.1384}},
{10478, {8.2008, 7.9344, 2.1384}},
{10479, {8.2008, 7.9344, 2.1384}},
{10480, {8.2008, 5.0760, 2.1384}},
{10481, {8.2008, 7.9344, 2.1384}},
{10482, {8.2008, 5.0760, 2.1384}},
{10483, {8.2008, 7.9344, 2.1384}},
{10484, {8.2008, 5.0760, 2.1384}},
{10485, {8.2008, 7.9344, 2.1384}},
{10486, {8.2008, 5.0760, 2.1384}},
{10487, {8.2008, 7.9344, 2.1384}},
{10488, {8.2008, 7.9344, 2.1384}},
{10489, {8.2008, 7.9344, 2.1384}},
{10490, {8.2008, 7.9344, 2.1384}},
{10491, {8.2008, 7.9344, 2.1384}},
{10492, {8.2008, 7.9344, 2.1384}},
{10493, {8.2008, 7.9344, 2.1384}},
{10494, {8.2008, 7.9344, 2.1384}},
{10495, {8.2008, 7.9344, 2.1384}},
{10496, {12.0024, 6.5520, -0.2736}},
{10497, {12.0024, 6.5520, -0.2736}},
{10498, {12.0024, 6.7104, -0.1008}},
{10499, {12.0024, 6.7176, -0.1080}},
{10500, {14.9976, 6.7104, -0.1080}},
{10501, {12.0024, 6.9264, 0.1080}},
{10502, {12.0024, 6.9264, 0.1080}},
{10503, {12.0024, 6.9264, 0.1080}},
{10504, {5.9976, 8.6832, 1.8648}},
{10505, {5.9976, 8.6832, 1.8648}},
{10506, {9.3888, 8.6832, 1.8648}},
{10507, {9.3888, 8.6832, 1.8648}},
{10508, {12.0024, 6.5520, -0.2664}},
{10509, {12.0024, 6.5520, -0.2664}},
{10510, {12.0024, 6.5520, -0.2664}},
{10511, {12.0024, 6.5520, -0.2664}},
{10512, {12.0024, 6.5520, -0.2664}},
{10513, {12.0024, 6.5520, -0.2664}},
{10514, {5.9976, 9.4104, 1.8648}},
{10515, {5.9976, 8.6832, 2.5920}},
{10516, {12.0024, 6.5520, -0.2664}},
{10517, {12.0024, 6.5520, -0.2664}},
{10518, {12.0024, 6.5520, -0.2664}},
{10519, {12.0024, 6.5520, -0.2664}},
{10520, {13.1688, 6.5520, -0.2664}},
{10521, {12.0024, 6.5520, -0.2664}},
{10522, {12.0024, 6.5520, -0.2664}},
{10523, {12.0024, 6.5520, -0.2664}},
{10524, {12.0024, 6.5520, -0.2664}},
{10525, {12.0024, 6.5520, -0.2664}},
{10526, {12.0024, 6.5520, -0.2664}},
{10527, {12.0024, 6.9264, 0.1080}},
{10528, {12.0024, 6.9264, 0.1080}},
{10529, {12.0024, 8.6832, 1.8648}},
{10530, {12.0024, 8.6832, 1.8648}},
{10531, {8.8056, 8.6832, 1.3320}},
{10532, {8.8056, 8.6832, 1.3320}},
{10533, {8.8056, 8.6832, 1.3320}},
{10534, {8.8056, 8.6832, 1.3320}},
{10535, {12.0024, 8.6832, 1.8648}},
{10536, {12.0024, 8.6832, 1.8648}},
{10537, {12.0024, 8.6832, 1.8648}},
{10538, {12.0024, 8.6832, 1.8648}},
{10539, {12.0024, 8.6832, 1.8648}},
{10540, {12.0024, 8.6832, 1.8648}},
{10541, {12.0024, 8.6832, 1.8648}},
{10542, {12.0024, 8.6832, 1.8648}},
{10543, {12.0024, 8.6832, 1.8648}},
{10544, {12.0024, 8.6832, 1.8648}},
{10545, {12.0024, 8.6832, 1.8648}},
{10546, {12.0024, 8.6832, 1.8648}},
{10547, {12.0024, 6.5520, -0.2664}},
{10548, {10.1448, 9.4104, -3.1680}},
{10549, {10.1448, 3.6504, 2.5920}},
{10550, {10.1448, 9.4104, -0.6048}},
{10551, {10.1448, 9.4104, -0.6048}},
{10552, {5.9976, 9.1944, 2.4048}},
{10553, {5.9976, 9.1944, 2.4048}},
{10554, {12.0024, 7.0992, -3.4056}},
{10555, {12.0024, 7.1064, -3.4128}},
{10556, {12.0024, 7.0992, -3.1680}},
{10557, {12.0024, 7.0992, -1.5048}},
{10558, {12.0024, 8.6976, 0.7344}},
{10559, {12.0024, 8.6976, 0.7344}},
{10560, {9.3240, 9.4104, 0.8280}},
{10561, {9.3240, 9.4104, 0.8280}},
{10562, {12.0024, 8.4024, 1.2096}},
{10563, {12.0024, 8.4024, 1.2096}},
{10564, {12.0024, 8.3952, 1.2168}},
{10565, {12.0024, 7.8120, 0.9000}},
{10566, {12.0024, 7.8120, 0.9000}},
{10567, {12.0024, 6.5520, -0.2664}},
{10568, {12.0024, 6.5592, -0.2664}},
{10569, {5.9976, 8.6832, 1.8648}},
{10570, {12.0024, 6.5520, -0.2664}},
{10571, {12.0024, 6.5520, -0.2664}},
{10572, {6.6888, 8.7840, 1.8648}},
{10573, {6.6888, 8.7768, 1.8648}},
{10574, {12.0024, 6.5520, -3.1680}},
{10575, {5.9976, 8.7768, 1.8648}},
{10576, {12.0024, 3.6504, -0.2664}},
{10577, {5.9976, 8.7768, 1.8648}},
{10578, {12.0024, 6.9264, 0.1080}},
{10579, {12.0024, 6.9264, 0.1080}},
{10580, {5.9976, 8.9640, 1.8648}},
{10581, {5.9976, 8.7840, 2.0520}},
{10582, {12.0024, 6.9264, 0.1080}},
{10583, {12.0024, 6.9264, 0.1080}},
{10584, {5.9976, 8.9640, 1.8648}},
{10585, {5.9976, 8.7840, 2.0520}},
{10586, {12.0024, 6.9264, 0.1080}},
{10587, {12.0024, 6.9264, 0.1080}},
{10588, {5.9976, 8.7768, 2.0664}},
{10589, {5.9976, 8.9784, 1.8648}},
{10590, {12.0024, 6.9264, 0.1080}},
{10591, {12.0024, 6.9264, 0.1080}},
{10592, {5.9976, 8.7768, 2.0664}},
{10593, {5.9976, 8.9784, 1.8648}},
{10594, {12.0024, 7.9560, 1.1376}},
{10595, {9.5040, 8.7336, 1.9080}},
{10596, {12.0024, 7.9560, 1.1376}},
{10597, {9.5040, 8.7336, 1.9080}},
{10598, {12.0024, 8.2512, -1.4688}},
{10599, {12.0024, 5.3496, 1.4328}},
{10600, {12.0024, 8.2512, -1.4688}},
{10601, {12.0024, 5.3496, 1.4328}},
{10602, {12.0024, 8.2512, -1.4688}},
{10603, {12.0024, 5.3496, 1.4328}},
{10604, {12.0024, 8.2512, -1.4688}},
{10605, {12.0024, 5.3496, 1.4328}},
{10606, {9.5040, 8.7336, 1.9080}},
{10607, {9.5040, 8.7336, 1.9080}},
{10608, {12.0024, 4.8168, -2.0016}},
{10609, {12.0024, 6.6960, -0.2736}},
{10610, {12.0024, 6.5520, -0.2736}},
{10611, {12.0024, 6.5520, -0.2664}},
{10612, {12.0024, 6.5520, -0.2664}},
{10613, {12.0024, 6.5520, 1.7208}},
{10614, {9.3240, 8.7408, 2.0304}},
{10615, {12.0024, 6.8832, 0.0576}},
{10616, {9.3240, 8.7408, 2.0304}},
{10617, {9.3240, 8.6832, 2.0304}},
{10618, {12.0024, 6.8184, -0.0000}},
{10619, {9.3240, 8.6832, 2.0304}},
{10620, {8.1216, 7.3224, 0.5040}},
{10621, {8.1216, 7.3224, 0.5040}},
{10622, {8.2368, 8.8272, -2.0448}},
{10623, {8.2368, 4.7736, 2.0016}},
{10624, {6.8544, 8.8848, 2.0664}},
{10625, {5.5440, 5.9472, -0.8712}},
{10626, {4.1688, 5.4432, 0.4824}},
{10627, {5.7600, 8.8704, 2.0520}},
{10628, {5.7600, 8.8704, 2.0520}},
{10629, {5.1264, 8.8704, 2.0520}},
{10630, {5.1264, 8.8704, 2.0520}},
{10631, {3.9960, 8.8776, 2.0520}},
{10632, {3.9960, 8.8776, 2.0520}},
{10633, {3.9024, 8.8704, 2.0520}},
{10634, {3.9024, 8.8704, 2.0520}},
{10635, {3.9960, 9.4104, 2.5920}},
{10636, {3.9960, 9.4104, 2.5920}},
{10637, {3.9960, 8.8704, 2.0520}},
{10638, {3.9960, 8.8704, 2.0520}},
{10639, {3.9960, 8.8704, 2.0520}},
{10640, {3.9960, 8.8704, 2.0520}},
{10641, {3.9024, 8.8704, 2.0520}},
{10642, {3.9024, 8.8704, 2.0520}},
{10643, {9.3240, 8.9208, 2.0952}},
{10644, {9.3240, 8.9208, 2.0952}},
{10645, {9.3240, 8.9208, 2.0952}},
{10646, {9.3240, 8.9208, 2.0952}},
{10647, {5.1120, 8.8704, 2.0520}},
{10648, {5.1120, 8.8704, 2.0520}},
{10649, {2.4048, 8.8776, 2.0592}},
{10650, {4.1400, 9.2088, 2.3832}},
{10651, {8.6688, 6.7392, 1.1808}},
{10652, {9.2160, 8.2368, -0.0000}},
{10653, {9.2160, 8.2368, -0.0000}},
{10654, {8.6688, 6.7464, -0.0000}},
{10655, {8.6688, 5.1120, -0.0000}},
{10656, {8.6688, 7.2504, 0.4320}},
{10657, {8.6688, 7.0704, 0.2520}},
{10658, {8.6688, 6.7392, -0.0000}},
{10659, {8.6688, 6.7392, -0.0000}},
{10660, {8.6688, 6.7392, 1.5480}},
{10661, {8.6688, 6.7392, 1.5480}},
{10662, {11.8152, 6.2784, -0.0000}},
{10663, {11.8152, 6.2784, -0.0000}},
{10664, {8.6688, 7.2576, 1.1808}},
{10665, {8.6688, 7.2576, 1.1808}},
{10666, {8.6688, 7.2360, 1.1952}},
{10667, {8.6688, 7.2360, 1.1952}},
{10668, {9.4608, 7.3080, -0.0000}},
{10669, {9.4608, 7.3080, -0.0000}},
{10670, {9.4608, 7.3080, -0.0000}},
{10671, {9.4608, 7.3080, -0.0000}},
{10672, {9.3312, 7.6464, 0.8280}},
{10673, {9.3312, 9.4104, 0.8280}},
{10674, {9.3312, 9.3960, 2.3472}},
{10675, {9.3312, 9.3600, 2.0592}},
{10676, {9.3312, 9.3600, 2.0592}},
{10677, {12.9168, 7.6464, 0.8280}},
{10678, {9.3312, 7.6464, 0.8280}},
{10679, {9.3312, 7.6464, 0.8280}},
{10680, {9.3312, 7.6464, 0.8280}},
{10681, {9.3312, 7.6464, 0.8280}},
{10682, {9.3312, 7.6536, 0.8280}},
{10683, {9.3312, 7.6464, 0.8280}},
{10684, {9.3312, 7.6464, 0.8280}},
{10685, {9.3312, 9.4104, 2.5920}},
{10686, {9.2448, 7.8048, 0.9792}},
{10687, {9.2448, 7.8048, 0.9792}},
{10688, {9.3312, 7.6464, 0.8280}},
{10689, {9.3312, 7.6464, 0.8280}},
{10690, {11.6136, 7.6464, 0.8280}},
{10691, {11.6424, 7.6464, 0.8280}},
{10692, {9.3312, 7.4736, 0.6480}},
{10693, {9.3312, 7.4736, 0.6480}},
{10694, {9.3312, 7.4736, 0.6480}},
{10695, {9.3312, 7.4736, 0.6480}},
{10696, {9.3312, 7.4736, 0.6480}},
{10697, {13.3704, 9.2304, 2.4120}},
{10698, {9.3312, 9.4104, 0.6480}},
{10699, {9.3312, 7.8048, 2.1528}},
{10700, {9.3312, 7.7976, 0.6480}},
{10701, {9.3312, 7.8048, 0.6480}},
{10702, {10.7784, 8.3088, 1.4976}},
{10703, {11.5920, 6.3432, -0.4824}},
{10704, {11.5920, 6.3432, -0.4824}},
{10705, {9.3240, 6.3072, -0.5112}},
{10706, {9.3240, 6.3072, -0.5112}},
{10707, {9.3240, 6.3072, -0.5112}},
{10708, {9.3240, 6.3072, -0.5112}},
{10709, {9.3240, 6.3072, -0.5112}},
{10710, {7.9776, 6.3000, -0.5040}},
{10711, {7.9776, 6.3000, -0.5040}},
{10712, {4.1400, 9.2088, 2.3832}},
{10713, {4.1400, 9.2088, 2.3832}},
{10714, {7.0632, 9.2088, 2.3832}},
{10715, {7.0632, 9.2088, 2.3832}},
{10716, {12.0024, 5.3064, 0.1368}},
{10717, {12.0024, 8.5104, 0.1368}},
{10718, {12.0024, 6.2856, 0.7488}},
{10719, {13.3272, 5.3208, -1.4976}},
{10720, {9.3240, 7.4736, 0.6480}},
{10721, {9.3168, 7.9056, -0.8280}},
{10722, {8.7696, 4.7304, -0.0000}},
{10723, {9.3168, 7.5096, 0.6912}},
{10724, {9.3168, 9.4104, 0.6912}},
{10725, {9.3168, 7.5096, 0.6840}},
{10726, {9.3312, 6.4224, -0.3960}},
{10727, {7.8840, 6.4872, -0.3312}},
{10728, {9.3312, 7.7976, 0.6552}},
{10729, {9.3312, 7.7976, 0.6552}},
{10730, {9.3312, 9.0288, 2.5920}},
{10731, {7.1352, 7.9776, 1.1592}},
{10732, {9.3312, 8.7840, 2.5920}},
{10733, {9.3312, 8.7840, 2.5920}},
{10734, {5.9976, 8.8272, 2.0016}},
{10735, {5.9976, 8.8272, 2.0016}},
{10736, {5.9976, 8.8272, 2.0016}},
{10737, {5.9976, 8.8272, 2.0016}},
{10738, {5.9976, 8.8272, 2.0016}},
{10739, {5.9976, 8.8272, 2.0016}},
{10740, {12.0024, 6.5520, -0.2736}},
{10741, {3.3336, 8.8776, 2.0520}},
{10742, {3.3336, 9.4104, 2.5920}},
{10743, {6.7176, 8.8776, 2.0520}},
{10744, {3.9168, 9.4104, 2.5920}},
{10745, {3.9168, 9.4104, 2.5920}},
{10746, {9.6480, 6.4872, -0.3312}},
{10747, {11.4048, 6.4872, -0.3312}},
{10748, {5.9976, 9.0648, 2.2392}},
{10749, {5.9976, 9.0648, 2.2392}},
{10750, {9.3240, 7.0776, 0.2592}},
{10751, {9.3240, 4.3200, -2.4984}},
{10752, {12.0024, 9.1800, 2.3616}},
{10753, {12.0024, 9.1224, 2.3040}},
{10754, {12.0024, 9.1224, 2.3040}},
{10755, {9.9864, 9.0648, 2.3544}},
{10756, {9.9864, 9.0648, 2.3544}},
{10757, {9.9864, 9.1152, 2.3040}},
{10758, {9.9864, 9.1224, 2.2968}},
{10759, {10.9224, 7.1784, 0.2664}},
{10760, {10.9224, 7.1784, 0.2664}},
{10761, {12.4920, 6.9984, 0.1800}},
{10762, {9.9576, 8.5176, 1.6992}},
{10763, {7.6968, 9.4104, 2.5920}},
{10764, {15.4656, 9.4104, 2.5920}},
{10765, {5.9688, 9.4104, 2.5920}},
{10766, {5.9688, 9.4104, 2.5920}},
{10767, {5.9688, 9.4104, 2.5920}},
{10768, {5.9688, 9.4104, 2.5920}},
{10769, {5.9688, 9.4104, 2.5920}},
{10770, {5.9688, 9.4104, 2.5920}},
{10771, {5.9688, 9.4104, 2.5920}},
{10772, {6.4944, 9.4104, 2.5920}},
{10773, {5.9688, 9.4104, 2.5920}},
{10774, {5.9688, 9.4104, 2.5920}},
{10775, {6.5448, 9.4104, 2.5920}},
{10776, {5.9760, 9.4104, 2.5920}},
{10777, {5.9688, 9.4104, 2.5920}},
{10778, {5.9688, 9.4104, 2.5920}},
{10779, {5.9688, 9.4104, 2.5920}},
{10780, {5.9688, 9.4104, 2.5920}},
{10781, {11.0304, 7.7544, 0.9360}},
{10782, {10.6488, 8.8704, 2.0520}},
{10783, {4.1688, 5.4432, 2.3904}},
{10784, {12.8304, 6.8832, 0.0576}},
{10785, {5.9976, 8.7768, 1.8648}},
{10786, {9.3312, 9.4104, 0.2592}},
{10787, {9.3312, 9.4104, 0.2592}},
{10788, {9.3312, 9.4104, 0.2592}},
{10789, {9.3312, 7.0776, 2.5920}},
{10790, {9.3312, 7.0776, 2.5920}},
{10791, {9.3312, 7.0776, 1.6776}},
{10792, {9.3312, 7.0848, 0.2592}},
{10793, {9.3312, 8.2512, -3.1680}},
{10794, {9.3312, 3.6504, -0.1224}},
{10795, {9.3312, 6.6960, -0.1224}},
{10796, {9.3312, 6.6960, -0.1224}},
{10797, {9.3312, 7.6464, 0.8280}},
{10798, {9.3312, 7.6464, 0.8280}},
{10799, {9.3312, 6.4944, -0.3240}},
{10800, {9.3312, 8.3664, -0.7416}},
{10801, {9.3312, 6.0768, 0.4824}},
{10802, {9.3312, 6.4944, -0.3240}},
{10803, {9.3312, 6.4944, -0.3240}},
{10804, {9.3312, 7.6464, 0.8280}},
{10805, {9.3312, 7.6464, 0.8280}},
{10806, {9.3312, 9.4104, 0.8280}},
{10807, {9.3312, 7.6464, 0.8280}},
{10808, {9.3312, 7.6464, 0.8280}},
{10809, {9.3312, 7.8048, 0.6480}},
{10810, {9.3312, 7.8048, 0.6480}},
{10811, {9.3312, 7.8048, 0.6480}},
{10812, {9.3312, 6.4080, -3.1680}},
{10813, {9.3312, 6.4080, -3.1680}},
{10814, {4.1688, 5.4432, 2.3904}},
{10815, {10.9944, 8.2368, 1.4184}},
{10816, {7.9920, 7.1784, 0.2664}},
{10817, {7.9920, 7.1784, 0.2664}},
{10818, {7.9920, 8.9280, 0.2664}},
{10819, {7.9920, 8.9280, 0.2664}},
{10820, {7.9920, 7.1784, 0.2664}},
{10821, {7.9920, 7.1784, 0.2664}},
{10822, {7.9920, 9.0936, 2.2752}},
{10823, {7.9920, 9.0936, 2.2752}},
{10824, {7.9920, 9.0936, 2.2752}},
{10825, {7.9920, 9.0936, 2.2752}},
{10826, {14.1552, 7.1784, 0.2664}},
{10827, {14.1552, 7.1784, 0.2664}},
{10828, {7.9920, 7.1784, 0.2664}},
{10829, {7.9920, 7.1784, 0.2664}},
{10830, {7.9920, 7.1856, -0.0000}},
{10831, {7.9920, 7.1784, 0.0072}},
{10832, {7.9920, 7.1784, 0.2664}},
{10833, {7.9920, 9.4104, 0.2664}},
{10834, {7.9920, 7.1712, 2.5056}},
{10835, {7.9920, 7.1784, 0.2664}},
{10836, {7.9920, 7.1784, 0.2736}},
{10837, {9.7488, 7.1784, 0.2664}},
{10838, {9.7488, 7.1784, 0.2736}},
{10839, {9.9072, 7.0992, 0.2088}},
{10840, {9.9072, 7.0992, 0.2088}},
{10841, {7.9920, 8.3088, 1.4832}},
{10842, {8.2872, 7.0776, 0.2592}},
{10843, {8.2872, 7.0776, 0.2592}},
{10844, {7.9920, 7.1784, 0.2664}},
{10845, {7.9920, 7.1784, 0.2736}},
{10846, {7.9920, 9.4104, 0.2664}},
{10847, {7.9920, 7.1784, 1.8864}},
{10848, {7.9920, 7.1784, 2.5920}},
{10849, {6.8184, 3.9528, 1.8864}},
{10850, {7.9920, 9.4104, 0.2736}},
{10851, {7.9920, 7.1712, 2.5920}},
{10852, {10.0296, 7.6248, 0.8064}},
{10853, {10.0296, 7.6248, 0.8064}},
{10854, {9.3312, 4.8240, 1.0584}},
{10855, {9.3312, 9.0504, -0.8280}},
{10856, {9.3312, 7.0776, 0.2592}},
{10857, {9.3312, 7.0776, 0.2592}},
{10858, {9.3312, 7.2504, -2.0808}},
{10859, {9.3312, 6.1200, -0.6984}},
{10860, {9.3312, 6.9048, 1.7352}},
{10861, {9.3312, 9.4104, -0.0000}},
{10862, {9.3240, 9.1440, -1.9944}},
{10863, {9.3312, 9.4104, -0.6120}},
{10864, {9.3312, 8.3160, 1.5192}},
{10865, {9.3312, 8.8776, 2.0664}},
{10866, {9.3312, 8.8776, 2.0664}},
{10867, {9.3240, 6.9048, -0.0000}},
{10868, {12.0024, 5.2416, -1.5768}},
{10869, {12.0024, 4.8240, -1.9944}},
{10870, {17.8488, 4.8240, -1.9944}},
{10871, {9.3312, 7.8840, 1.0584}},
{10872, {9.3312, 9.0504, -0.8280}},
{10873, {9.3240, 6.8832, 0.0576}},
{10874, {9.3240, 6.8832, 0.0576}},
{10875, {9.3240, 9.4104, 0.0576}},
{10876, {9.3240, 9.4104, 0.0576}},
{10877, {9.3240, 6.8976, 2.3976}},
{10878, {9.3240, 6.8976, 2.3976}},
{10879, {9.3240, 6.8976, 2.3904}},
{10880, {9.3240, 6.8976, 2.3976}},
{10881, {9.3240, 7.0056, 2.3904}},
{10882, {9.3240, 7.0056, 2.3976}},
{10883, {9.3240, 9.3456, 2.3976}},
{10884, {9.3240, 9.3456, 2.3976}},
{10885, {9.3240, 9.4104, 2.5920}},
{10886, {9.3240, 9.4104, 2.5920}},
{10887, {9.3240, 6.8832, 2.5920}},
{10888, {9.3240, 6.8832, 2.5920}},
{10889, {9.3240, 9.4104, 2.5920}},
{10890, {9.3240, 9.4104, 2.5920}},
{10891, {9.3240, 9.4104, 2.5920}},
{10892, {9.3240, 9.4104, 2.5920}},
{10893, {9.3240, 9.1224, 2.1024}},
{10894, {9.3240, 9.1296, 2.1024}},
{10895, {9.3240, 9.4104, 2.5920}},
{10896, {9.3240, 9.4104, 2.5920}},
{10897, {9.3240, 9.4104, 2.5920}},
{10898, {9.3240, 9.4176, 2.5920}},
{10899, {9.3240, 9.4104, 2.5920}},
{10900, {9.3240, 9.4104, 2.5920}},
{10901, {9.3240, 8.0568, 1.2312}},
{10902, {9.3240, 8.0568, 1.2312}},
{10903, {9.3240, 8.0568, 1.2312}},
{10904, {9.3240, 8.0568, 1.2312}},
{10905, {9.3240, 8.6400, 1.7568}},
{10906, {9.3240, 8.6400, 1.7568}},
{10907, {9.3240, 9.2232, 2.3976}},
{10908, {9.3240, 9.2232, 2.3976}},
{10909, {9.3240, 8.6400, 2.0232}},
{10910, {9.3240, 8.6400, 2.0232}},
{10911, {9.3240, 9.4104, 2.5920}},
{10912, {9.3240, 9.4104, 2.5920}},
{10913, {9.3240, 6.8976, 0.0648}},
{10914, {9.3240, 6.8976, 0.0648}},
{10915, {12.9528, 6.8832, 2.1024}},
{10916, {9.3240, 6.8832, 0.0576}},
{10917, {16.9416, 6.8832, 0.0576}},
{10918, {10.2096, 6.8832, 0.0648}},
{10919, {10.2096, 6.8832, 0.0648}},
{10920, {10.2096, 6.8832, 2.3976}},
{10921, {10.2096, 6.8832, 2.3904}},
{10922, {9.3240, 6.8832, 0.0648}},
{10923, {9.3240, 6.8832, 0.0648}},
{10924, {9.3240, 6.8832, 1.7568}},
{10925, {9.3240, 6.8832, 1.7568}},
{10926, {9.3312, 7.4952, -0.8280}},
{10927, {9.3240, 6.8976, 1.7568}},
{10928, {9.3240, 6.8976, 1.7568}},
{10929, {9.3240, 6.8976, 2.5920}},
{10930, {9.3240, 6.8976, 2.5920}},
{10931, {9.3240, 8.6544, 1.7568}},
{10932, {9.3240, 8.6544, 1.7568}},
{10933, {9.3240, 8.6544, 2.5920}},
{10934, {9.3240, 8.6544, 2.5920}},
{10935, {9.3240, 9.4104, 2.5920}},
{10936, {9.3240, 9.4104, 2.5920}},
{10937, {9.3240, 9.4104, 2.5920}},
{10938, {9.3240, 9.4104, 2.5920}},
{10939, {12.0024, 6.8904, 0.0720}},
{10940, {12.0024, 6.8904, 0.0720}},
{10941, {9.3240, 6.8184, -0.0000}},
{10942, {9.3240, 6.8184, -0.0000}},
{10943, {6.9696, 8.8272, 2.0016}},
{10944, {6.9696, 8.8272, 2.0016}},
{10945, {6.9696, 8.8272, 1.7640}},
{10946, {6.9696, 8.8272, 1.7640}},
{10947, {6.9696, 8.1144, 1.7712}},
{10948, {6.9696, 8.1144, 1.7712}},
{10949, {9.3240, 8.5824, 1.7568}},
{10950, {9.3240, 8.5824, 1.7568}},
{10951, {9.3240, 7.3512, 2.5920}},
{10952, {9.3240, 7.3512, 2.5920}},
{10953, {6.9696, 7.5240, 2.5920}},
{10954, {6.9696, 7.5240, 2.5920}},
{10955, {9.3240, 8.5824, 2.5920}},
{10956, {9.3240, 8.5824, 2.5920}},
{10957, {12.0024, 6.8184, -0.0000}},
{10958, {12.0024, 6.8184, -0.0000}},
{10959, {9.3240, 6.8184, -0.0000}},
{10960, {9.3240, 6.8184, -0.0000}},
{10961, {9.3240, 6.8184, 2.1024}},
{10962, {9.3240, 6.8184, 2.1024}},
{10963, {6.9696, 9.3384, 2.5200}},
{10964, {6.9696, 9.3384, 2.5200}},
{10965, {6.9696, 9.3384, 2.5200}},
{10966, {6.9696, 9.3384, 2.5200}},
{10967, {12.8880, 5.4144, -0.0000}},
{10968, {12.8880, 5.4144, -0.0000}},
{10969, {7.9920, 6.0048, -0.0000}},
{10970, {7.9920, 7.5816, 0.0072}},
{10971, {7.9920, 7.5888, -0.0000}},
{10972, {7.9920, 6.5880, 0.5688}},
{10973, {7.9920, 6.5880, -0.0000}},
{10974, {5.1480, 7.5744, 0.7560}},
{10975, {9.3240, 3.6504, -0.0000}},
{10976, {9.3240, 3.6504, -0.0000}},
{10977, {9.3240, 7.9992, -0.0000}},
{10978, {7.3296, 7.5744, 0.7560}},
{10979, {8.6688, 8.3304, -0.0000}},
{10980, {7.3296, 8.3304, -0.0000}},
{10981, {8.6688, 8.3304, -0.0000}},
{10982, {8.6688, 8.3304, -0.0000}},
{10983, {9.3240, 5.4072, -0.0000}},
{10984, {9.3240, 3.6504, 1.7568}},
{10985, {9.3240, 8.5824, -0.0000}},
{10986, {9.3240, 7.9920, 0.0072}},
{10987, {9.3240, 7.9992, -0.0000}},
{10988, {9.3312, 4.1328, 0.0072}},
{10989, {9.3312, 4.1328, 0.0072}},
{10990, {3.5856, 5.1768, 0.2664}},
{10991, {4.2336, 8.8272, 2.0016}},
{10992, {4.2336, 8.8272, 2.0016}},
{10993, {4.2336, 8.8272, 2.0016}},
{10994, {5.5944, 5.1768, 0.2664}},
{10995, {9.3312, 9.4104, 2.5920}},
{10996, {8.3304, 8.2440, 1.4184}},
{10997, {11.6568, 8.8272, 2.0016}},
{10998, {4.0032, 6.9984, 0.1872}},
{10999, {14.6808, 9.4104, 2.5920}},
{11000, {14.6808, 9.4176, 2.5920}},
{11001, {9.3240, 9.2232, 2.3976}},
{11002, {9.3240, 9.2232, 2.3976}},
{11003, {8.6040, 9.4104, 2.5920}},
{11004, {8.3304, 9.4104, 2.5920}},
{11005, {6.2640, 9.4104, 2.5920}},
{11006, {4.6296, 8.2368, 1.4184}},
{11007, {4.6296, 9.4104, 2.5920}},
{11008, {12.0024, 8.5464, 2.3400}},
{11009, {12.0024, 8.5464, 2.3400}},
{11010, {12.0024, 8.5464, 2.3400}},
{11011, {12.0024, 8.5464, 2.3400}},
{11012, {14.9328, 6.7248, -0.0936}},
{11013, {12.0024, 6.7248, -0.1008}},
{11014, {7.3224, 8.6832, 1.8648}},
{11015, {7.3224, 8.6832, 1.8648}},
{11016, {12.0024, 8.5464, 2.3400}},
{11017, {12.0024, 8.5464, 2.3400}},
{11018, {12.0024, 8.5464, 2.3400}},
{11019, {12.0024, 8.5464, 2.3400}},
{11020, {14.9328, 6.7248, -0.1008}},
{11021, {7.3224, 9.4104, 2.5920}},
{11022, {12.0024, 3.6504, 0.9720}},
{11023, {12.0024, 7.7904, -3.1680}},
{11024, {12.0024, 3.6504, 0.9720}},
{11025, {12.0024, 7.7904, -3.1680}},
{11026, {9.2448, 7.3512, 0.5328}},
{11027, {9.2448, 7.3512, 0.5256}},
{11028, {9.2448, 7.3512, 0.5328}},
{11029, {9.2448, 7.3512, 0.5328}},
{11030, {9.2448, 7.9776, 1.1592}},
{11031, {9.2448, 7.9776, 1.1592}},
{11032, {9.2448, 7.9776, 1.1592}},
{11033, {9.2448, 7.9776, 1.1592}},
{11034, {9.2448, 7.3152, 0.4968}},
{11035, {12.0024, 8.5896, 1.7712}},
{11036, {12.0024, 8.5968, 1.7712}},
{11037, {3.3984, 4.7304, -2.0880}},
{11038, {3.3984, 4.7304, -2.0880}},
{11039, {10.1592, 8.1504, 0.4104}},
{11040, {10.1592, 8.1504, 0.4104}},
{11041, {9.5976, 8.1504, 1.3320}},
{11042, {9.5976, 8.1504, 1.3320}},
{11043, {9.6912, 7.5240, 0.7056}},
{11044, {12.0024, 9.1800, 2.3544}},
{11045, {5.5440, 6.0552, -0.7632}},
{11046, {5.5440, 6.0552, -0.7632}},
{11047, {4.3272, 6.0552, -0.7632}},
{11048, {5.5440, 6.0552, -0.7632}},
{11049, {4.3272, 5.4216, -1.3968}},
{11050, {3.3984, 5.4216, -1.3968}},
{11051, {4.3272, 5.4216, -1.3968}},
{11052, {10.2528, 6.6024, -0.2160}},
{11053, {10.2528, 6.6024, -0.2160}},
{11054, {7.5456, 8.3088, 1.4832}},
{11055, {7.5456, 8.3088, 1.4832}},
{11056, {12.0024, 6.5520, -0.2736}},
{11057, {12.0024, 9.3744, 2.5560}},
{11058, {17.6256, 7.6536, 0.8280}},
{11059, {17.6256, 5.4504, -1.3824}},
{11060, {12.0024, 6.5520, -0.2664}},
{11061, {12.0024, 6.5520, -0.2664}},
{11062, {12.0024, 6.9264, 0.1080}},
{11063, {12.0024, 6.5520, -0.2664}},
{11064, {12.0024, 6.5520, -0.2664}},
{11065, {12.0024, 6.5520, -0.2664}},
{11066, {12.0024, 6.5520, -0.2664}},
{11067, {12.0024, 6.5520, -0.2664}},
{11068, {12.0024, 6.5520, -0.2664}},
{11069, {13.1688, 6.5520, -0.2664}},
{11070, {12.0024, 6.5520, -0.2664}},
{11071, {12.0024, 6.5448, -0.2736}},
{11072, {12.0024, 6.6960, -0.2664}},
{11073, {12.0024, 6.5520, -0.2664}},
{11074, {12.0024, 6.5520, 1.7208}},
{11075, {12.0024, 6.8832, 0.0576}},
{11076, {12.0024, 6.8184, -0.0000}},
{11077, {11.9088, 7.7400, 0.9216}},
{11078, {11.9088, 7.7400, 0.9216}},
{11079, {12.0024, 6.5520, -0.2664}},
{11080, {12.0024, 6.5520, 1.7208}},
{11081, {12.0024, 6.5520, -0.2664}},
{11082, {12.0024, 6.5520, 1.7208}},
{11083, {12.0024, 6.5520, -0.2664}},
{11084, {12.0024, 6.5520, -0.2664}},
{11085, {9.8856, 8.6760, 0.0072}},
{11086, {6.3288, 7.3296, -0.0000}},
{11087, {6.3288, 7.3296, -0.0000}},
{11088, {7.0776, 6.8832, -0.5976}},
{11089, {5.3208, 6.0480, -1.2744}},
{11090, {5.3208, 6.0480, -1.2744}},
{11091, {9.6336, 7.9200, 1.1016}},
{11092, {9.6336, 7.9200, 1.1016}},
{11093, {12.0024, 8.8272, 2.0016}},
{11094, {12.0024, 7.9992, 1.2024}},
{11095, {12.0024, 8.4240, 1.6272}},
{11096, {12.0024, 8.4240, 1.6272}},
{11097, {12.0024, 8.4240, 1.6272}},
{11098, {8.9064, 8.2512, 1.5768}},
{11099, {9.0144, 8.2512, 1.8648}},
{11100, {9.7056, 8.6760, 1.7640}},
{11101, {9.7056, 8.6760, 1.7640}},
{11102, {8.3448, 8.0352, 0.7848}},
{11103, {8.3448, 4.9104, 0.7848}},
{11104, {10.4328, 6.5088, -2.1672}},
{11105, {6.0912, 8.6760, -0.0000}},
{11106, {10.4328, 6.5088, -2.1672}},
{11107, {6.0912, 8.6760, -0.0000}},
{11108, {10.4328, 6.5088, -2.1672}},
{11109, {10.4328, 8.6760, -0.0000}},
{11110, {8.2008, 7.4016, -0.9576}},
{11111, {8.2008, 7.4016, -0.9576}},
{11112, {8.2008, 7.4016, -0.9576}},
{11113, {8.2008, 7.4016, -0.9576}},
{11114, {10.4328, 6.5088, -2.1672}},
{11115, {6.0912, 8.6760, -0.0000}},
{11116, {10.4328, 6.5088, -2.1672}},
{11117, {6.0912, 8.6760, 0.0072}},
{11118, {10.4328, 8.6760, -0.0000}},
{11119, {10.4328, 8.6760, -0.0000}},
{11120, {10.4328, 6.5088, -2.1672}},
{11121, {6.0912, 8.6760, -0.0000}},
{11122, {10.4328, 6.5088, -2.1672}},
{11123, {6.0912, 8.6760, -0.0000}},
{11126, {9.5616, 8.6760, -0.0000}},
{11127, {9.5616, 8.6760, -0.0000}},
{11128, {9.5616, 8.6760, -0.0000}},
{11129, {9.5616, 8.6760, -0.0000}},
{11130, {10.4328, 6.5088, -2.1672}},
{11131, {6.0912, 8.6760, 0.0072}},
{11132, {10.4328, 6.5088, -2.1672}},
{11133, {6.0912, 8.6760, 0.0072}},
{11134, {10.4328, 8.6760, -0.0000}},
{11135, {10.4328, 8.6760, -0.0000}},
{11136, {10.4328, 8.6760, -0.0000}},
{11137, {10.4328, 8.6760, -0.0000}},
{11138, {10.4328, 8.6760, -0.0000}},
{11139, {10.4328, 8.6760, -0.0000}},
{11140, {10.4328, 8.6760, -0.0000}},
{11141, {10.4328, 8.6760, -0.0000}},
{11142, {10.4328, 8.6760, -0.0000}},
{11143, {10.4256, 8.6760, -0.0000}},
{11144, {10.4400, 8.6760, -0.0000}},
{11145, {10.6848, 8.6760, -0.2448}},
{11146, {10.4400, 8.6760, -0.0000}},
{11147, {10.6848, 8.4312, -0.0000}},
{11148, {10.4328, 8.6760, -0.0000}},
{11149, {10.4328, 8.6760, -0.0000}},
{11150, {10.4328, 8.6760, -0.0000}},
{11151, {10.4328, 8.6760, -0.0000}},
{11152, {11.5128, 8.6760, -2.1672}},
{11153, {11.5128, 8.6760, -2.1672}},
{11154, {10.4328, 8.6760, -2.1672}},
{11155, {10.4256, 8.6760, -2.1672}},
{11156, {12.3264, 7.9200, 0.6192}},
{11157, {12.0024, 6.7248, -0.1008}},
{11160, {9.2664, 8.6760, -0.0000}},
{11161, {10.4328, 8.6760, -1.1592}},
{11162, {9.2664, 8.6760, -0.0000}},
{11163, {10.4328, 7.5168, -0.0000}},
{11164, {9.2664, 8.6760, -0.0000}},
{11165, {10.4328, 8.6760, -1.1592}},
{11166, {9.2664, 8.6760, -0.0000}},
{11167, {10.4328, 7.5168, -0.0000}},
{11168, {10.4328, 8.6760, -2.1672}},
{11169, {10.4328, 8.6760, -2.1672}},
{11170, {10.4328, 6.5088, -0.0000}},
{11171, {10.4328, 6.5088, -0.0000}},
{11172, {8.2584, 8.6760, -0.0000}},
{11173, {8.2584, 8.6760, -0.0000}},
{11174, {8.2584, 8.6760, -0.0000}},
{11175, {8.2584, 8.6760, -0.0000}},
{11176, {10.4328, 7.5240, -1.9656}},
{11177, {10.4328, 7.5240, -1.9656}},
{11178, {10.4328, 6.7104, -1.1520}},
{11179, {10.4328, 6.7104, -1.1520}},
{11180, {7.3152, 8.6760, -0.0000}},
{11181, {7.3152, 8.6760, -0.0000}},
{11182, {7.3152, 8.6688, 0.0072}},
{11183, {7.3152, 8.6688, 0.0072}},
{11184, {10.4328, 9.4104, 1.1448}},
{11185, {10.4328, 9.4104, 1.1448}},
{11186, {10.4328, 7.9632, 2.5920}},
{11187, {10.4328, 7.9632, 2.5920}},
{11188, {12.3120, 7.7472, 0.9288}},
{11189, {12.3120, 7.7472, 0.9288}},
{11190, {12.3120, 7.7472, 0.9288}},
{11191, {12.3120, 7.7472, 0.9288}},
{11192, {9.1728, 8.6760, -0.0000}},
{11193, {12.6792, 8.6760, -0.0000}},
{11197, {10.6848, 8.6760, -0.0000}},
{11198, {10.6848, 8.6760, -0.0000}},
{11199, {10.6848, 8.6760, -0.0000}},
{11200, {10.6848, 7.4016, -1.2672}},
{11201, {10.6848, 8.6760, -0.0000}},
{11202, {10.6848, 7.8480, -0.0000}},
{11203, {10.6848, 8.3448, -0.3240}},
{11204, {10.6848, 8.6760, -0.0000}},
{11205, {9.2664, 8.6760, -2.1672}},
{11206, {9.2664, 6.5088, -0.0000}},
{11207, {8.2584, 8.0928, -0.5760}},
{11208, {8.2584, 8.0928, -0.5760}},
{11210, {10.6848, 8.6760, -4.3344}},
{11211, {10.6848, 4.3416, -0.0000}},
{11212, {10.4328, 8.6760, -0.0000}},
{11213, {7.9920, 7.5240, -1.2816}},
{11214, {10.4328, 8.6760, -0.0000}},
{11215, {8.2944, 7.6104, -1.0584}},
{11216, {10.6632, 8.6760, -0.0000}},
{11217, {10.6848, 9.0936, 0.4176}},
{11244, {10.5120, 6.0120, -1.3752}},
{11245, {5.5872, 8.4672, 1.0872}},
{11246, {10.5120, 6.0120, -1.3752}},
{11247, {5.5872, 8.4672, 1.0872}},
{11776, {4.5360, 9.1728, -5.9472}},
{11777, {4.5360, 9.1728, -5.9472}},
{11778, {3.6216, 9.1728, -5.4576}},
{11779, {3.6216, 9.1728, -5.4576}},
{11780, {4.3632, 9.1728, -5.4576}},
{11781, {4.3632, 9.1728, -5.4576}},
{11782, {7.0992, 9.1728, -5.9472}},
{11783, {7.0992, 9.1728, -5.9472}},
{11784, {4.9320, 9.1728, -5.2416}},
{11785, {4.5936, 9.1728, -5.2416}},
{11786, {4.5936, 9.1728, -5.2416}},
{11787, {4.7664, 9.1728, -5.7168}},
{11788, {4.6080, 9.1152, -5.8104}},
{11789, {4.6080, 9.1152, -5.8104}},
{11790, {8.1576, 9.4104, 2.5920}},
{11791, {0.0000, -1.3104, 1.9656}},
{11792, {0.0000, -1.3104, 2.5920}},
{11793, {0.0000, -1.3104, 2.5920}},
{11794, {3.5568, 1.4832, 2.4192}},
{11795, {6.9480, 9.1368, 2.3184}},
{11796, {8.4384, 7.1280, -0.0000}},
{11797, {8.4456, 7.1712, -0.0000}},
{11798, {6.7464, 6.3216, 0.0072}},
{11799, {4.5792, 5.4504, -0.8496}},
{11800, {5.3280, 6.1200, 2.3400}},
{11801, {7.8048, 8.4312, 1.6560}},
{11802, {5.0256, 6.1920, -3.1680}},
{11803, {6.1992, 6.4800, -2.2248}},
{11804, {4.6080, 0.9144, 2.3904}},
{11805, {4.6080, 0.9144, 2.3904}},
{11806, {6.2064, 6.1920, -2.2248}},
{11807, {6.2064, 4.1976, -0.2304}},
{11808, {3.9456, 9.4032, 1.3608}},
{11809, {3.9384, 9.4032, 1.3608}},
{11810, {3.3480, 9.4104, -4.0248}},
{11811, {3.3408, 9.4104, -4.0248}},
{11812, {3.3480, 4.0248, 1.3608}},
{11813, {3.3408, 4.0248, 1.3608}},
{11814, {7.7688, 7.1064, -0.9360}},
{11815, {7.7688, 7.1064, -0.9360}},
{11816, {6.3360, 8.8704, 2.0520}},
{11817, {6.3360, 8.8704, 2.0520}},
{11818, {5.9976, 5.0184, -0.0000}},
{11819, {5.9976, 5.0184, -0.0000}},
{11820, {6.9408, 5.0184, -0.0000}},
{11821, {5.9904, 5.0184, -0.0000}},
{11822, {5.3280, 8.4600, -0.0000}},
{11823, {2.9592, 9.2664, -4.8888}},
{11824, {4.3272, 5.3352, -1.4832}},
{11825, {3.0024, 3.3768, -2.1024}},
{11826, {3.0024, 3.5856, -0.0000}},
{11827, {3.0024, 3.1464, -1.8720}},
{11828, {3.0024, 3.1464, 0.4464}},
{11829, {3.1968, 7.3368, -0.0000}},
{11830, {4.1472, 8.4312, 2.4192}},
{11831, {4.1544, 8.4312, 2.4192}},
{11832, {5.7528, 8.4240, 2.4264}},
{11833, {5.6520, 7.9704, -0.8928}},
{11834, {24.0048, 3.6504, -3.1680}},
{11835, {36.0000, 3.6504, -3.1680}},
{11836, {3.8664, 2.5056, 0.0936}},
{11837, {3.1896, 9.3168, 2.4984}},
{11838, {5.0040, 9.2952, 2.4480}},
{11839, {9.8064, 9.4032, 2.5992}},
{11840, {3.9960, 4.2480, -2.0016}},
{11841, {3.1392, 1.1952, 2.1816}},
{11842, {5.6520, 1.1952, 2.1816}},
{11843, {11.9952, 6.1344, -3.1608}},
{11844, {2.9664, 9.0216, 1.1376}},
{12296, {4.6584, 9.4104, 2.5920}},
{12297, {4.6584, 9.4104, 2.5920}},
{12298, {6.4728, 9.4104, 2.5920}},
{12299, {6.4728, 9.4104, 2.5920}},
{12300, {3.9960, 8.8704, 2.0520}},
{12301, {3.9960, 8.8776, 2.0520}},
{12302, {5.0400, 8.8704, 2.0520}},
{12303, {5.0400, 8.8704, 2.0520}},
{12304, {4.6080, 8.8704, 2.0520}},
{12305, {4.6080, 8.8704, 2.0520}},
{12308, {4.2048, 8.8776, 2.0520}},
{12309, {4.2048, 8.8776, 2.0520}},
{12310, {5.5728, 8.8704, 2.0520}},
{12311, {5.5728, 8.8704, 2.0520}},
{12312, {4.4424, 8.8776, 2.0520}},
{12313, {4.4424, 8.8776, 2.0520}},
{12314, {3.9960, 8.8704, 2.0520}},
{12315, {3.9960, 8.8704, 2.0520}},
{12316, {9.3240, 4.7376, -2.0808}},
{12317, {5.0976, 9.0144, -4.2984}},
{12318, {5.0976, 9.0144, -4.2984}},
{12319, {5.0976, 2.1528, 2.5632}},
{12336, {12.0024, 4.4928, -2.3760}},
{12349, {12.0024, 8.3592, 1.5408}},
{12398, {11.2464, 8.2008, 0.3240}},
{12951, {12.0024, 8.9424, 2.1240}},
{12953, {12.0024, 8.9424, 2.1240}},
{19904, {12.0024, 8.8272, 2.0088}},
{19905, {12.0024, 8.8272, 2.0088}},
{19906, {12.0024, 8.8272, 2.0088}},
{19907, {12.0024, 8.8272, 2.0088}},
{19908, {12.0024, 8.8272, 2.0088}},
{19909, {12.0024, 8.8272, 2.0088}},
{19910, {12.0024, 8.8272, 2.0088}},
{19911, {12.0024, 8.8272, 2.0088}},
{19912, {12.0024, 8.8272, 2.0088}},
{19913, {12.0024, 8.8272, 2.0088}},
{19914, {12.0024, 8.8272, 2.0088}},
{19915, {12.0024, 8.8272, 2.0088}},
{19916, {12.0024, 8.8272, 2.0088}},
{19917, {12.0024, 8.8272, 2.0088}},
{19918, {12.0024, 8.8272, 2.0088}},
{19919, {12.0024, 8.8272, 2.0088}},
{19920, {12.0024, 8.8272, 2.0088}},
{19921, {12.0024, 8.8272, 2.0088}},
{19922, {12.0024, 8.8272, 2.0088}},
{19923, {12.0024, 8.8272, 2.0088}},
{19924, {12.0024, 8.8272, 2.0088}},
{19925, {12.0024, 8.8272, 2.0088}},
{19926, {12.0024, 8.8272, 2.0088}},
{19927, {12.0024, 8.8272, 2.0088}},
{19928, {12.0024, 8.8272, 2.0088}},
{19929, {12.0024, 8.8272, 2.0088}},
{19930, {12.0024, 8.8272, 2.0088}},
{19931, {12.0024, 8.8272, 2.0088}},
{19932, {12.0024, 8.8272, 2.0088}},
{19933, {12.0024, 8.8272, 2.0088}},
{19934, {12.0024, 8.8272, 2.0088}},
{19935, {12.0024, 8.8272, 2.0088}},
{19936, {12.0024, 8.8272, 2.0088}},
{19937, {12.0024, 8.8272, 2.0088}},
{19938, {12.0024, 8.8272, 2.0088}},
{19939, {12.0024, 8.8272, 2.0088}},
{19940, {12.0024, 8.8272, 2.0088}},
{19941, {12.0024, 8.8272, 2.0088}},
{19942, {12.0024, 8.8272, 2.0088}},
{19943, {12.0024, 8.8272, 2.0088}},
{19944, {12.0024, 8.8272, 2.0088}},
{19945, {12.0024, 8.8272, 2.0088}},
{19946, {12.0024, 8.8272, 2.0088}},
{19947, {12.0024, 8.8272, 2.0088}},
{19948, {12.0024, 8.8272, 2.0088}},
{19949, {12.0024, 8.8272, 2.0088}},
{19950, {12.0024, 8.8272, 2.0088}},
{19951, {12.0024, 8.8272, 2.0088}},
{19952, {12.0024, 8.8272, 2.0088}},
{19953, {12.0024, 8.8272, 2.0088}},
{19954, {12.0024, 8.8272, 2.0088}},
{19955, {12.0024, 8.8272, 2.0088}},
{19956, {12.0024, 8.8272, 2.0088}},
{19957, {12.0024, 8.8272, 2.0088}},
{19958, {12.0024, 8.8272, 2.0088}},
{19959, {12.0024, 8.8272, 2.0088}},
{19960, {12.0024, 8.8272, 2.0088}},
{19961, {12.0024, 8.8272, 2.0088}},
{19962, {12.0024, 8.8272, 2.0088}},
{19963, {12.0024, 8.8272, 2.0088}},
{19964, {12.0024, 8.8272, 2.0088}},
{19965, {12.0024, 8.8272, 2.0088}},
{19966, {12.0024, 8.8272, 2.0088}},
{19967, {12.0024, 8.8272, 2.0088}},
{20013, {10.4904, 8.6112, 1.7928}}
};
vdiffr/src/algo-it.h 0000644 0001762 0000144 00000001530 14057630265 014035 0 ustar ligges users #pragma once
template
InputIterator find_if_it(InputIterator it, InputIterator end,
Predicate pred) {
while (it != end && !pred(it)) ++it;
return it;
}
template
OutputIterator remove_copy_if_it(InputIterator it, InputIterator end,
OutputIterator result, Predicate pred) {
while (it != end) {
if (!pred(it)) {
*result = *it;
++result;
}
++it;
}
return result;
}
template
ForwardIterator remove_if_it(ForwardIterator it, ForwardIterator end,
Predicate pred) {
it = find_if_it(it, end, pred);
ForwardIterator next = it;
return it == end ? it : remove_copy_if_it(++next, end, it, pred);
}
vdiffr/src/Makevars.win 0000644 0001762 0000144 00000000447 14705672254 014632 0 ustar ligges users CXX_STD = CXX11
VERSION = 2.7.4
RWINLIB = ../windows/harfbuzz-${VERSION}
PKG_CPPFLAGS = -I${RWINLIB}/include
PKG_LIBS = -L${RWINLIB}/lib${R_ARCH}${CRT} -lpng -lz
all: clean winlibs
winlibs:
"${R_HOME}/bin${R_ARCH_BIN}/Rscript.exe" "../tools/winlibs.R" ${VERSION}
clean:
rm -f $(OBJECTS)
vdiffr/src/SvgStream.h 0000644 0001762 0000144 00000012415 14174735241 014420 0 ustar ligges users #pragma once
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include "utils.h"
namespace svglite { namespace internal {
template
void write_double(T& stream, double data) {
std::streamsize prec = stream.precision();
uint8_t newprec = std::fabs(data) >= 1 || data == 0. ? prec : std::ceil(-std::log10(std::fabs(data))) + 1;
stream << std::setprecision(newprec) << data << std::setprecision(prec);
}
}} // namespace svglite::internal
class SvgStream {
std::unordered_set clip_ids;
bool clipping = false;
public:
bool has_clip_id(std::string id) {
return clip_ids.find(id) != clip_ids.end();
}
void add_clip_id(std::string id) {
clipping = true;
clip_ids.insert(id);
}
void clear_clip_ids() {
clipping = false;
clip_ids.clear();
}
bool is_clipping() {return clipping;}
virtual ~SvgStream() {};
virtual void write(int data) = 0;
virtual void write(double data) = 0;
virtual void write(const char* data) = 0;
virtual void write(const std::string& data) = 0;
virtual void write(char data) = 0;
virtual bool is_file_stream() = 0;
void put(char data) {
write(data);
}
virtual void flush() = 0;
virtual void finish(bool close) = 0;
};
template
SvgStream& operator<<(SvgStream& object, const T& data) {
object.write(data);
return object;
}
template <>
inline SvgStream& operator<<(SvgStream& object, const double& data) {
// Make sure negative zeros are converted to positive zero for
// reproducibility of SVGs
object.write(dbl_format(data));
return object;
}
class SvgStreamFile : public SvgStream {
std::ofstream stream_;
std::string file = "";
bool always_valid = false;
public:
SvgStreamFile(const std::string& path, bool _always_valid = false) : always_valid(_always_valid) {
std::string svgz_ext = path.size() > 5 ? path.substr(path.size() - 5) : "";
file = R_ExpandFileName(path.c_str());
stream_.open(file.c_str());
if (stream_.fail())
cpp11::stop("cannot open stream %s", path.c_str());
stream_ << std::fixed << std::setprecision(2);
}
SvgStreamFile(const std::string& path, int pageno, bool _always_valid = false) : always_valid(_always_valid) {
std::string svgz_ext = path.size() > 5 ? path.substr(path.size() - 5) : "";
char buf[PATH_MAX+1];
snprintf(buf, PATH_MAX, path.c_str(), pageno);
buf[PATH_MAX] = '\0';
file = R_ExpandFileName(buf);
stream_.open(file.c_str());
if (stream_.fail())
cpp11::stop("cannot open stream %s", buf);
stream_ << std::fixed << std::setprecision(2);
}
void write(int data) { stream_ << data; }
void write(double data) { svglite::internal::write_double(stream_, data); }
void write(const char* data) { stream_ << data; }
void write(char data) { stream_ << data; }
void write(const std::string& data) { stream_ << data; }
bool is_file_stream() {return true; }
// Adding a final newline here creates problems on Windows when
// seeking back to original position. So we only write the newline
// in finish()
void flush() {
if (!always_valid) {
return;
}
stream_ << "\n";
#ifdef _WIN32
stream_.seekp(-12, std::ios_base::cur);
#else
stream_.seekp(-11, std::ios_base::cur);
#endif
}
void finish(bool close) {
if (is_clipping()) {
stream_ << "\n";
}
stream_ << "\n";
stream_.flush();
clear_clip_ids();
}
~SvgStreamFile() {
stream_.close();
}
};
class SvgStreamString : public SvgStream {
std::stringstream stream_;
cpp11::environment env_;
public:
SvgStreamString(cpp11::environment env): env_(env) {
stream_ << std::fixed << std::setprecision(2);
env_["is_closed"] = false;
}
void write(int data) { stream_ << data; }
void write(double data) { svglite::internal::write_double(stream_, data); }
void write(const char* data) { stream_ << data; }
void write(char data) { stream_ << data; }
void write(const std::string& data) { stream_ << data; }
bool is_file_stream() {return false; }
void flush() {
}
void finish(bool close) {
// When device is closed, stream_ will be destroyed, so we can no longer
// get the svg string from stream_. In this case, we save the final string
// to the environment env, so that R can read from env$svg_string even
// after device is closed.
env_["is_closed"] = close;
stream_.flush();
std::string svgstr = stream_.str();
// If the current svg is empty, we also make the string empty
// Otherwise append "" to make it a valid SVG
if(!svgstr.empty()) {
if (is_clipping()) {
svgstr.append("\n");
}
svgstr.append("");
}
if (env_.exists("svg_string")) {
cpp11::writable::strings str(env_["svg_string"]);
str.push_back(svgstr.c_str());
env_["svg_string"] = str;
} else {
env_["svg_string"] = svgstr;
}
// clear the stream
stream_.str(std::string());
stream_.clear();
clear_clip_ids();
}
std::stringstream* string_src() {
return &stream_;
}
};
vdiffr/src/vdiffr_types.h 0000644 0001762 0000144 00000000023 14057630265 015201 0 ustar ligges users #include
vdiffr/src/compare.cpp 0000644 0001762 0000144 00000002342 14213645275 014465 0 ustar ligges users #include
#include
#include
#include
#include
#include "algo-it.h"
int compare_throw() {
Rf_error("vdiffr error: unable to read svg files");
return 0;
}
struct is_cr {
template
bool operator()(InputIterator it) {
return *it == 0x0D && *(it + 1) == 0x0A;
}
};
[[cpp11::register]]
bool compare_files(std::string expected, std::string test) {
std::ifstream file1(expected.c_str(), std::ifstream::ate | std::ifstream::binary);
std::ifstream file2(test.c_str(), std::ifstream::ate | std::ifstream::binary);
if (!file1 || !file2)
compare_throw();
std::streamsize size1 = file1.tellg();
std::streamsize size2 = file2.tellg();
file1.seekg(0, std::ios::beg);
file2.seekg(0, std::ios::beg);
std::vector buffer1(size1);
std::vector buffer2(size2);
if (!file1.read(buffer1.data(), size1) ||
!file2.read(buffer2.data(), size2))
compare_throw();
// Remove carriage returns from SVGs generated on Windows
buffer1.erase(remove_if_it(buffer1.begin(), buffer1.end() - 1, is_cr()), buffer1.end());
buffer2.erase(remove_if_it(buffer2.begin(), buffer2.end() - 1, is_cr()), buffer2.end());
return buffer1 == buffer2;
}
vdiffr/src/Makevars.ucrt 0000644 0001762 0000144 00000000025 14705672254 015002 0 ustar ligges users PKG_LIBS = -lpng -lz
vdiffr/src/utils.h 0000644 0001762 0000144 00000007143 14174735241 013647 0 ustar ligges users #pragma once
#include
#include
#include
#include
inline static double dbl_format(double x) {
if (std::abs(x) < std::numeric_limits::epsilon())
return 0.00;
else
return x;
}
inline bool iequals(const std::string& a, const std::string& b) {
unsigned int sz = a.size();
if (b.size() != sz) {
return false;
}
for (unsigned int i = 0; i < sz; ++i) {
if (tolower(a[i]) != tolower(b[i])) {
return false;
}
}
return true;
}
/*
Basic UTF-8 manipulation routines
by Jeff Bezanson
placed in the public domain Fall 2005
This code is designed to provide the utilities you need to manipulate
UTF-8 as an internal string encoding. These functions do not perform the
error checking normally needed when handling UTF-8 data, so if you happen
to be from the Unicode Consortium you will want to flay me alive.
I do this because error checking can be performed at the boundaries (I/O),
with these routines reserved for higher performance on data known to be
valid.
Source: https://www.cprogramming.com/tutorial/utf8.c
Modified 2019 by Thomas Lin Pedersen to work with const char*
*/
static const uint32_t offsetsFromUTF8[6] = {
0x00000000UL, 0x00003080UL, 0x000E2080UL,
0x03C82080UL, 0xFA082080UL, 0x82082080UL
};
static const char trailingBytesForUTF8[256] = {
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, 3,3,3,3,3,3,3,3,4,4,4,4,5,5,5,5
};
/* conversions without error checking
only works for valid UTF-8, i.e. no 5- or 6-byte sequences
srcsz = source size in bytes, or -1 if 0-terminated
sz = dest size in # of wide characters
returns # characters converted
dest will always be L'\0'-terminated, even if there isn't enough room
for all the characters.
if sz = srcsz+1 (i.e. 4*srcsz+4 bytes), there will always be enough space.
*/
static int u8_toucs(uint32_t *dest, int sz, const char *src, int srcsz)
{
uint32_t ch;
const char *src_end = src + srcsz;
int nb;
int i=0;
while (i < sz-1) {
nb = trailingBytesForUTF8[(unsigned char)*src];
if (srcsz == -1) {
if (*src == 0)
goto done_toucs;
}
else {
if (src + nb >= src_end)
goto done_toucs;
}
ch = 0;
switch (nb) {
/* these fall through deliberately */
case 5: ch += (unsigned char)*src++; ch <<= 6;
case 4: ch += (unsigned char)*src++; ch <<= 6;
case 3: ch += (unsigned char)*src++; ch <<= 6;
case 2: ch += (unsigned char)*src++; ch <<= 6;
case 1: ch += (unsigned char)*src++; ch <<= 6;
case 0: ch += (unsigned char)*src++;
}
ch -= offsetsFromUTF8[nb];
dest[i++] = ch;
}
done_toucs:
dest[i] = 0;
return i;
}
/*
End of Basic UTF-8 manipulation routines
by Jeff Bezanson
*/
class UTF_UCS {
std::vector buffer;
public:
UTF_UCS() {
// Allocate space in buffer
buffer.resize(1024);
}
~UTF_UCS() {
}
uint32_t * convert(const char * string, int &n_conv) {
int n_bytes = strlen(string) + 1;
unsigned int max_size = n_bytes * 4;
if (buffer.size() < max_size) {
buffer.resize(max_size);
}
n_conv = u8_toucs(buffer.data(), max_size, string, -1);
return buffer.data();
}
};
vdiffr/src/cpp11.cpp 0000644 0001762 0000144 00000005712 14705673354 013774 0 ustar ligges users // Generated by cpp11: do not edit by hand
// clang-format off
#include "vdiffr_types.h"
#include "cpp11/declarations.hpp"
#include
// compare.cpp
bool compare_files(std::string expected, std::string test);
extern "C" SEXP _vdiffr_compare_files(SEXP expected, SEXP test) {
BEGIN_CPP11
return cpp11::as_sexp(compare_files(cpp11::as_cpp>(expected), cpp11::as_cpp>(test)));
END_CPP11
}
// devSVG.cpp
bool svglite_(std::string file, std::string bg, double width, double height, double pointsize, bool standalone, bool always_valid);
extern "C" SEXP _vdiffr_svglite_(SEXP file, SEXP bg, SEXP width, SEXP height, SEXP pointsize, SEXP standalone, SEXP always_valid) {
BEGIN_CPP11
return cpp11::as_sexp(svglite_(cpp11::as_cpp>(file), cpp11::as_cpp>(bg), cpp11::as_cpp>(width), cpp11::as_cpp>(height), cpp11::as_cpp>(pointsize), cpp11::as_cpp>(standalone), cpp11::as_cpp>(always_valid)));
END_CPP11
}
// devSVG.cpp
cpp11::external_pointer svgstring_(cpp11::environment env, std::string bg, double width, double height, double pointsize, bool standalone);
extern "C" SEXP _vdiffr_svgstring_(SEXP env, SEXP bg, SEXP width, SEXP height, SEXP pointsize, SEXP standalone) {
BEGIN_CPP11
return cpp11::as_sexp(svgstring_(cpp11::as_cpp>(env), cpp11::as_cpp>(bg), cpp11::as_cpp>(width), cpp11::as_cpp>(height), cpp11::as_cpp>(pointsize), cpp11::as_cpp>(standalone)));
END_CPP11
}
// devSVG.cpp
std::string get_svg_content(cpp11::external_pointer p);
extern "C" SEXP _vdiffr_get_svg_content(SEXP p) {
BEGIN_CPP11
return cpp11::as_sexp(get_svg_content(cpp11::as_cpp>>(p)));
END_CPP11
}
// engine_version.cpp
void set_engine_version(cpp11::strings version);
extern "C" SEXP _vdiffr_set_engine_version(SEXP version) {
BEGIN_CPP11
set_engine_version(cpp11::as_cpp>(version));
return R_NilValue;
END_CPP11
}
extern "C" {
static const R_CallMethodDef CallEntries[] = {
{"_vdiffr_compare_files", (DL_FUNC) &_vdiffr_compare_files, 2},
{"_vdiffr_get_svg_content", (DL_FUNC) &_vdiffr_get_svg_content, 1},
{"_vdiffr_set_engine_version", (DL_FUNC) &_vdiffr_set_engine_version, 1},
{"_vdiffr_svglite_", (DL_FUNC) &_vdiffr_svglite_, 7},
{"_vdiffr_svgstring_", (DL_FUNC) &_vdiffr_svgstring_, 6},
{NULL, NULL, 0}
};
}
extern "C" attribute_visible void R_init_vdiffr(DllInfo* dll){
R_registerRoutines(dll, NULL, CallEntries, NULL, NULL);
R_useDynamicSymbols(dll, FALSE);
R_forceSymbols(dll, TRUE);
}
vdiffr/src/Makevars 0000644 0001762 0000144 00000000046 14477263731 014033 0 ustar ligges users CXX_STD = CXX11
PKG_LIBS = -lpng -lz
vdiffr/src/engine_version.cpp 0000644 0001762 0000144 00000000433 14057630265 016047 0 ustar ligges users #include "engine_version.h"
#include
std::string ENGINE_VERSION = "";
std::string get_engine_version() {
return ENGINE_VERSION;
}
[[cpp11::register]]
void set_engine_version(cpp11::strings version) {
ENGINE_VERSION = cpp11::as_cpp(version);
}
vdiffr/src/tinyformat.h 0000644 0001762 0000144 00000136406 14057630265 014710 0 ustar ligges users // tinyformat.h
// Copyright (C) 2011, Chris Foster [chris42f (at) gmail (d0t) com]
//
// Boost Software License - Version 1.0
//
// Permission is hereby granted, free of charge, to any person or organization
// obtaining a copy of the software and accompanying documentation covered by
// this license (the "Software") to use, reproduce, display, distribute,
// execute, and transmit the Software, and to prepare derivative works of the
// Software, and to permit third-parties to whom the Software is furnished to
// do so, all subject to the following:
//
// The copyright notices in the Software and this entire statement, including
// the above license grant, this restriction and the following disclaimer,
// must be included in all copies of the Software, in whole or in part, and
// all derivative works of the Software, unless such copies or derivative
// works are solely in the form of machine-executable object code generated by
// a source language processor.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
// SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
// FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
// DEALINGS IN THE SOFTWARE.
//------------------------------------------------------------------------------
// Tinyformat: A minimal type safe printf replacement
//
// tinyformat.h is a type safe printf replacement library in a single C++
// header file. Design goals include:
//
// * Type safety and extensibility for user defined types.
// * C99 printf() compatibility, to the extent possible using std::ostream
// * POSIX extension for positional arguments
// * Simplicity and minimalism. A single header file to include and distribute
// with your projects.
// * Augment rather than replace the standard stream formatting mechanism
// * C++98 support, with optional C++11 niceties
//
//
// Main interface example usage
// ----------------------------
//
// To print a date to std::cout for American usage:
//
// std::string weekday = "Wednesday";
// const char* month = "July";
// size_t day = 27;
// long hour = 14;
// int min = 44;
//
// tfm::printf("%s, %s %d, %.2d:%.2d\n", weekday, month, day, hour, min);
//
// POSIX extension for positional arguments is available.
// The ability to rearrange formatting arguments is an important feature
// for localization because the word order may vary in different languages.
//
// Previous example for German usage. Arguments are reordered:
//
// tfm::printf("%1$s, %3$d. %2$s, %4$d:%5$.2d\n", weekday, month, day, hour, min);
//
// The strange types here emphasize the type safety of the interface; it is
// possible to print a std::string using the "%s" conversion, and a
// size_t using the "%d" conversion. A similar result could be achieved
// using either of the tfm::format() functions. One prints on a user provided
// stream:
//
// tfm::format(std::cerr, "%s, %s %d, %.2d:%.2d\n",
// weekday, month, day, hour, min);
//
// The other returns a std::string:
//
// std::string date = tfm::format("%s, %s %d, %.2d:%.2d\n",
// weekday, month, day, hour, min);
// std::cout << date;
//
// These are the three primary interface functions. There is also a
// convenience function printfln() which appends a newline to the usual result
// of printf() for super simple logging.
//
//
// User defined format functions
// -----------------------------
//
// Simulating variadic templates in C++98 is pretty painful since it requires
// writing out the same function for each desired number of arguments. To make
// this bearable tinyformat comes with a set of macros which are used
// internally to generate the API, but which may also be used in user code.
//
// The three macros TINYFORMAT_ARGTYPES(n), TINYFORMAT_VARARGS(n) and
// TINYFORMAT_PASSARGS(n) will generate a list of n argument types,
// type/name pairs and argument names respectively when called with an integer
// n between 1 and 16. We can use these to define a macro which generates the
// desired user defined function with n arguments. To generate all 16 user
// defined function bodies, use the macro TINYFORMAT_FOREACH_ARGNUM. For an
// example, see the implementation of printf() at the end of the source file.
//
// Sometimes it's useful to be able to pass a list of format arguments through
// to a non-template function. The FormatList class is provided as a way to do
// this by storing the argument list in a type-opaque way. Continuing the
// example from above, we construct a FormatList using makeFormatList():
//
// FormatListRef formatList = tfm::makeFormatList(weekday, month, day, hour, min);
//
// The format list can now be passed into any non-template function and used
// via a call to the vformat() function:
//
// tfm::vformat(std::cout, "%s, %s %d, %.2d:%.2d\n", formatList);
//
//
// Additional API information
// --------------------------
//
// Error handling: Define TINYFORMAT_ERROR to customize the error handling for
// format strings which are unsupported or have the wrong number of format
// specifiers (calls assert() by default).
//
// User defined types: Uses operator<< for user defined types by default.
// Overload formatValue() for more control.
#ifndef TINYFORMAT_H_INCLUDED
#define TINYFORMAT_H_INCLUDED
namespace tinyformat {}
//------------------------------------------------------------------------------
// Config section. Customize to your liking!
// Namespace alias to encourage brevity
namespace tfm = tinyformat;
// Error handling; calls assert() by default.
// #define TINYFORMAT_ERROR(reasonString) your_error_handler(reasonString)
// Define for C++11 variadic templates which make the code shorter & more
// general. If you don't define this, C++11 support is autodetected below.
// #define TINYFORMAT_USE_VARIADIC_TEMPLATES
//------------------------------------------------------------------------------
// Implementation details.
#include
#include
#include
#ifndef TINYFORMAT_ASSERT
# include
# define TINYFORMAT_ASSERT(cond) assert(cond)
#endif
#ifndef TINYFORMAT_ERROR
# include
# define TINYFORMAT_ERROR(reason) assert(0 && reason)
#endif
#if !defined(TINYFORMAT_USE_VARIADIC_TEMPLATES) && !defined(TINYFORMAT_NO_VARIADIC_TEMPLATES)
# ifdef __GXX_EXPERIMENTAL_CXX0X__
# define TINYFORMAT_USE_VARIADIC_TEMPLATES
# endif
#endif
#if defined(__GLIBCXX__) && __GLIBCXX__ < 20080201
// std::showpos is broken on old libstdc++ as provided with macOS. See
// http://gcc.gnu.org/ml/libstdc++/2007-11/msg00075.html
# define TINYFORMAT_OLD_LIBSTDCPLUSPLUS_WORKAROUND
#endif
#ifdef __APPLE__
// Workaround macOS linker warning: Xcode uses different default symbol
// visibilities for static libs vs executables (see issue #25)
# define TINYFORMAT_HIDDEN __attribute__((visibility("hidden")))
#else
# define TINYFORMAT_HIDDEN
#endif
namespace tinyformat {
//------------------------------------------------------------------------------
namespace detail {
// Test whether type T1 is convertible to type T2
template
struct is_convertible
{
private:
// two types of different size
struct fail { char dummy[2]; };
struct succeed { char dummy; };
// Try to convert a T1 to a T2 by plugging into tryConvert
static fail tryConvert(...);
static succeed tryConvert(const T2&);
static const T1& makeT1();
public:
# ifdef _MSC_VER
// Disable spurious loss of precision warnings in tryConvert(makeT1())
# pragma warning(push)
# pragma warning(disable:4244)
# pragma warning(disable:4267)
# endif
// Standard trick: the (...) version of tryConvert will be chosen from
// the overload set only if the version taking a T2 doesn't match.
// Then we compare the sizes of the return types to check which
// function matched. Very neat, in a disgusting kind of way :)
static const bool value =
sizeof(tryConvert(makeT1())) == sizeof(succeed);
# ifdef _MSC_VER
# pragma warning(pop)
# endif
};
// Detect when a type is not a wchar_t string
template struct is_wchar { typedef int tinyformat_wchar_is_not_supported; };
template<> struct is_wchar {};
template<> struct is_wchar {};
template struct is_wchar {};
template struct is_wchar {};
// Format the value by casting to type fmtT. This default implementation
// should never be called.
template::value>
struct formatValueAsType
{
static void invoke(std::ostream& /*out*/, const T& /*value*/) { TINYFORMAT_ASSERT(0); }
};
// Specialized version for types that can actually be converted to fmtT, as
// indicated by the "convertible" template parameter.
template
struct formatValueAsType
{
static void invoke(std::ostream& out, const T& value)
{ out << static_cast(value); }
};
#ifdef TINYFORMAT_OLD_LIBSTDCPLUSPLUS_WORKAROUND
template::value>
struct formatZeroIntegerWorkaround
{
static bool invoke(std::ostream& /**/, const T& /**/) { return false; }
};
template
struct formatZeroIntegerWorkaround
{
static bool invoke(std::ostream& out, const T& value)
{
if (static_cast(value) == 0 && out.flags() & std::ios::showpos) {
out << "+0";
return true;
}
return false;
}
};
#endif // TINYFORMAT_OLD_LIBSTDCPLUSPLUS_WORKAROUND
// Convert an arbitrary type to integer. The version with convertible=false
// throws an error.
template::value>
struct convertToInt
{
static int invoke(const T& /*value*/)
{
TINYFORMAT_ERROR("tinyformat: Cannot convert from argument type to "
"integer for use as variable width or precision");
return 0;
}
};
// Specialization for convertToInt when conversion is possible
template
struct convertToInt
{
static int invoke(const T& value) { return static_cast(value); }
};
// Format at most ntrunc characters to the given stream.
template
inline void formatTruncated(std::ostream& out, const T& value, int ntrunc)
{
std::ostringstream tmp;
tmp << value;
std::string result = tmp.str();
out.write(result.c_str(), (std::min)(ntrunc, static_cast(result.size())));
}
#define TINYFORMAT_DEFINE_FORMAT_TRUNCATED_CSTR(type) \
inline void formatTruncated(std::ostream& out, type* value, int ntrunc) \
{ \
std::streamsize len = 0; \
while (len < ntrunc && value[len] != 0) \
++len; \
out.write(value, len); \
}
// Overload for const char* and char*. Could overload for signed & unsigned
// char too, but these are technically unneeded for printf compatibility.
TINYFORMAT_DEFINE_FORMAT_TRUNCATED_CSTR(const char)
TINYFORMAT_DEFINE_FORMAT_TRUNCATED_CSTR(char)
#undef TINYFORMAT_DEFINE_FORMAT_TRUNCATED_CSTR
} // namespace detail
//------------------------------------------------------------------------------
// Variable formatting functions. May be overridden for user-defined types if
// desired.
/// Format a value into a stream, delegating to operator<< by default.
///
/// Users may override this for their own types. When this function is called,
/// the stream flags will have been modified according to the format string.
/// The format specification is provided in the range [fmtBegin, fmtEnd). For
/// truncating conversions, ntrunc is set to the desired maximum number of
/// characters, for example "%.7s" calls formatValue with ntrunc = 7.
///
/// By default, formatValue() uses the usual stream insertion operator
/// operator<< to format the type T, with special cases for the %c and %p
/// conversions.
template
inline void formatValue(std::ostream& out, const char* /*fmtBegin*/,
const char* fmtEnd, int ntrunc, const T& value)
{
#ifndef TINYFORMAT_ALLOW_WCHAR_STRINGS
// Since we don't support printing of wchar_t using "%ls", make it fail at
// compile time in preference to printing as a void* at runtime.
typedef typename detail::is_wchar::tinyformat_wchar_is_not_supported DummyType;
(void) DummyType(); // avoid unused type warning with gcc-4.8
#endif
// The mess here is to support the %c and %p conversions: if these
// conversions are active we try to convert the type to a char or const
// void* respectively and format that instead of the value itself. For the
// %p conversion it's important to avoid dereferencing the pointer, which
// could otherwise lead to a crash when printing a dangling (const char*).
const bool canConvertToChar = detail::is_convertible::value;
const bool canConvertToVoidPtr = detail::is_convertible::value;
if (canConvertToChar && *(fmtEnd-1) == 'c')
detail::formatValueAsType::invoke(out, value);
else if (canConvertToVoidPtr && *(fmtEnd-1) == 'p')
detail::formatValueAsType::invoke(out, value);
#ifdef TINYFORMAT_OLD_LIBSTDCPLUSPLUS_WORKAROUND
else if (detail::formatZeroIntegerWorkaround::invoke(out, value)) /**/;
#endif
else if (ntrunc >= 0) {
// Take care not to overread C strings in truncating conversions like
// "%.4s" where at most 4 characters may be read.
detail::formatTruncated(out, value, ntrunc);
}
else
out << value;
}
// Overloaded version for char types to support printing as an integer
#define TINYFORMAT_DEFINE_FORMATVALUE_CHAR(charType) \
inline void formatValue(std::ostream& out, const char* /*fmtBegin*/, \
const char* fmtEnd, int /**/, charType value) \
{ \
switch (*(fmtEnd-1)) { \
case 'u': case 'd': case 'i': case 'o': case 'X': case 'x': \
out << static_cast(value); break; \
default: \
out << value; break; \
} \
}
// per 3.9.1: char, signed char and unsigned char are all distinct types
TINYFORMAT_DEFINE_FORMATVALUE_CHAR(char)
TINYFORMAT_DEFINE_FORMATVALUE_CHAR(signed char)
TINYFORMAT_DEFINE_FORMATVALUE_CHAR(unsigned char)
#undef TINYFORMAT_DEFINE_FORMATVALUE_CHAR
//------------------------------------------------------------------------------
// Tools for emulating variadic templates in C++98. The basic idea here is
// stolen from the boost preprocessor metaprogramming library and cut down to
// be just general enough for what we need.
#define TINYFORMAT_ARGTYPES(n) TINYFORMAT_ARGTYPES_ ## n
#define TINYFORMAT_VARARGS(n) TINYFORMAT_VARARGS_ ## n
#define TINYFORMAT_PASSARGS(n) TINYFORMAT_PASSARGS_ ## n
#define TINYFORMAT_PASSARGS_TAIL(n) TINYFORMAT_PASSARGS_TAIL_ ## n
// To keep it as transparent as possible, the macros below have been generated
// using python via the excellent cog code generation script. This avoids
// the need for a bunch of complex (but more general) preprocessor tricks as
// used in boost.preprocessor.
//
// To rerun the code generation in place, use `cog -r tinyformat.h`
// (see http://nedbatchelder.com/code/cog). Alternatively you can just create
// extra versions by hand.
/*[[[cog
maxParams = 16
def makeCommaSepLists(lineTemplate, elemTemplate, startInd=1):
for j in range(startInd,maxParams+1):
list = ', '.join([elemTemplate % {'i':i} for i in range(startInd,j+1)])
cog.outl(lineTemplate % {'j':j, 'list':list})
makeCommaSepLists('#define TINYFORMAT_ARGTYPES_%(j)d %(list)s',
'class T%(i)d')
cog.outl()
makeCommaSepLists('#define TINYFORMAT_VARARGS_%(j)d %(list)s',
'const T%(i)d& v%(i)d')
cog.outl()
makeCommaSepLists('#define TINYFORMAT_PASSARGS_%(j)d %(list)s', 'v%(i)d')
cog.outl()
cog.outl('#define TINYFORMAT_PASSARGS_TAIL_1')
makeCommaSepLists('#define TINYFORMAT_PASSARGS_TAIL_%(j)d , %(list)s',
'v%(i)d', startInd = 2)
cog.outl()
cog.outl('#define TINYFORMAT_FOREACH_ARGNUM(m) \\\n ' +
' '.join(['m(%d)' % (j,) for j in range(1,maxParams+1)]))
]]]*/
#define TINYFORMAT_ARGTYPES_1 class T1
#define TINYFORMAT_ARGTYPES_2 class T1, class T2
#define TINYFORMAT_ARGTYPES_3 class T1, class T2, class T3
#define TINYFORMAT_ARGTYPES_4 class T1, class T2, class T3, class T4
#define TINYFORMAT_ARGTYPES_5 class T1, class T2, class T3, class T4, class T5
#define TINYFORMAT_ARGTYPES_6 class T1, class T2, class T3, class T4, class T5, class T6
#define TINYFORMAT_ARGTYPES_7 class T1, class T2, class T3, class T4, class T5, class T6, class T7
#define TINYFORMAT_ARGTYPES_8 class T1, class T2, class T3, class T4, class T5, class T6, class T7, class T8
#define TINYFORMAT_ARGTYPES_9 class T1, class T2, class T3, class T4, class T5, class T6, class T7, class T8, class T9
#define TINYFORMAT_ARGTYPES_10 class T1, class T2, class T3, class T4, class T5, class T6, class T7, class T8, class T9, class T10
#define TINYFORMAT_ARGTYPES_11 class T1, class T2, class T3, class T4, class T5, class T6, class T7, class T8, class T9, class T10, class T11
#define TINYFORMAT_ARGTYPES_12 class T1, class T2, class T3, class T4, class T5, class T6, class T7, class T8, class T9, class T10, class T11, class T12
#define TINYFORMAT_ARGTYPES_13 class T1, class T2, class T3, class T4, class T5, class T6, class T7, class T8, class T9, class T10, class T11, class T12, class T13
#define TINYFORMAT_ARGTYPES_14 class T1, class T2, class T3, class T4, class T5, class T6, class T7, class T8, class T9, class T10, class T11, class T12, class T13, class T14
#define TINYFORMAT_ARGTYPES_15 class T1, class T2, class T3, class T4, class T5, class T6, class T7, class T8, class T9, class T10, class T11, class T12, class T13, class T14, class T15
#define TINYFORMAT_ARGTYPES_16 class T1, class T2, class T3, class T4, class T5, class T6, class T7, class T8, class T9, class T10, class T11, class T12, class T13, class T14, class T15, class T16
#define TINYFORMAT_VARARGS_1 const T1& v1
#define TINYFORMAT_VARARGS_2 const T1& v1, const T2& v2
#define TINYFORMAT_VARARGS_3 const T1& v1, const T2& v2, const T3& v3
#define TINYFORMAT_VARARGS_4 const T1& v1, const T2& v2, const T3& v3, const T4& v4
#define TINYFORMAT_VARARGS_5 const T1& v1, const T2& v2, const T3& v3, const T4& v4, const T5& v5
#define TINYFORMAT_VARARGS_6 const T1& v1, const T2& v2, const T3& v3, const T4& v4, const T5& v5, const T6& v6
#define TINYFORMAT_VARARGS_7 const T1& v1, const T2& v2, const T3& v3, const T4& v4, const T5& v5, const T6& v6, const T7& v7
#define TINYFORMAT_VARARGS_8 const T1& v1, const T2& v2, const T3& v3, const T4& v4, const T5& v5, const T6& v6, const T7& v7, const T8& v8
#define TINYFORMAT_VARARGS_9 const T1& v1, const T2& v2, const T3& v3, const T4& v4, const T5& v5, const T6& v6, const T7& v7, const T8& v8, const T9& v9
#define TINYFORMAT_VARARGS_10 const T1& v1, const T2& v2, const T3& v3, const T4& v4, const T5& v5, const T6& v6, const T7& v7, const T8& v8, const T9& v9, const T10& v10
#define TINYFORMAT_VARARGS_11 const T1& v1, const T2& v2, const T3& v3, const T4& v4, const T5& v5, const T6& v6, const T7& v7, const T8& v8, const T9& v9, const T10& v10, const T11& v11
#define TINYFORMAT_VARARGS_12 const T1& v1, const T2& v2, const T3& v3, const T4& v4, const T5& v5, const T6& v6, const T7& v7, const T8& v8, const T9& v9, const T10& v10, const T11& v11, const T12& v12
#define TINYFORMAT_VARARGS_13 const T1& v1, const T2& v2, const T3& v3, const T4& v4, const T5& v5, const T6& v6, const T7& v7, const T8& v8, const T9& v9, const T10& v10, const T11& v11, const T12& v12, const T13& v13
#define TINYFORMAT_VARARGS_14 const T1& v1, const T2& v2, const T3& v3, const T4& v4, const T5& v5, const T6& v6, const T7& v7, const T8& v8, const T9& v9, const T10& v10, const T11& v11, const T12& v12, const T13& v13, const T14& v14
#define TINYFORMAT_VARARGS_15 const T1& v1, const T2& v2, const T3& v3, const T4& v4, const T5& v5, const T6& v6, const T7& v7, const T8& v8, const T9& v9, const T10& v10, const T11& v11, const T12& v12, const T13& v13, const T14& v14, const T15& v15
#define TINYFORMAT_VARARGS_16 const T1& v1, const T2& v2, const T3& v3, const T4& v4, const T5& v5, const T6& v6, const T7& v7, const T8& v8, const T9& v9, const T10& v10, const T11& v11, const T12& v12, const T13& v13, const T14& v14, const T15& v15, const T16& v16
#define TINYFORMAT_PASSARGS_1 v1
#define TINYFORMAT_PASSARGS_2 v1, v2
#define TINYFORMAT_PASSARGS_3 v1, v2, v3
#define TINYFORMAT_PASSARGS_4 v1, v2, v3, v4
#define TINYFORMAT_PASSARGS_5 v1, v2, v3, v4, v5
#define TINYFORMAT_PASSARGS_6 v1, v2, v3, v4, v5, v6
#define TINYFORMAT_PASSARGS_7 v1, v2, v3, v4, v5, v6, v7
#define TINYFORMAT_PASSARGS_8 v1, v2, v3, v4, v5, v6, v7, v8
#define TINYFORMAT_PASSARGS_9 v1, v2, v3, v4, v5, v6, v7, v8, v9
#define TINYFORMAT_PASSARGS_10 v1, v2, v3, v4, v5, v6, v7, v8, v9, v10
#define TINYFORMAT_PASSARGS_11 v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11
#define TINYFORMAT_PASSARGS_12 v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12
#define TINYFORMAT_PASSARGS_13 v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13
#define TINYFORMAT_PASSARGS_14 v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14
#define TINYFORMAT_PASSARGS_15 v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15
#define TINYFORMAT_PASSARGS_16 v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16
#define TINYFORMAT_PASSARGS_TAIL_1
#define TINYFORMAT_PASSARGS_TAIL_2 , v2
#define TINYFORMAT_PASSARGS_TAIL_3 , v2, v3
#define TINYFORMAT_PASSARGS_TAIL_4 , v2, v3, v4
#define TINYFORMAT_PASSARGS_TAIL_5 , v2, v3, v4, v5
#define TINYFORMAT_PASSARGS_TAIL_6 , v2, v3, v4, v5, v6
#define TINYFORMAT_PASSARGS_TAIL_7 , v2, v3, v4, v5, v6, v7
#define TINYFORMAT_PASSARGS_TAIL_8 , v2, v3, v4, v5, v6, v7, v8
#define TINYFORMAT_PASSARGS_TAIL_9 , v2, v3, v4, v5, v6, v7, v8, v9
#define TINYFORMAT_PASSARGS_TAIL_10 , v2, v3, v4, v5, v6, v7, v8, v9, v10
#define TINYFORMAT_PASSARGS_TAIL_11 , v2, v3, v4, v5, v6, v7, v8, v9, v10, v11
#define TINYFORMAT_PASSARGS_TAIL_12 , v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12
#define TINYFORMAT_PASSARGS_TAIL_13 , v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13
#define TINYFORMAT_PASSARGS_TAIL_14 , v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14
#define TINYFORMAT_PASSARGS_TAIL_15 , v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15
#define TINYFORMAT_PASSARGS_TAIL_16 , v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16
#define TINYFORMAT_FOREACH_ARGNUM(m) \
m(1) m(2) m(3) m(4) m(5) m(6) m(7) m(8) m(9) m(10) m(11) m(12) m(13) m(14) m(15) m(16)
//[[[end]]]
namespace detail {
// Type-opaque holder for an argument to format(), with associated actions on
// the type held as explicit function pointers. This allows FormatArg's for
// each argument to be allocated as a homogeneous array inside FormatList
// whereas a naive implementation based on inheritance does not.
class FormatArg
{
public:
FormatArg()
: m_value(NULL),
m_formatImpl(NULL),
m_toIntImpl(NULL)
{ }
template
FormatArg(const T& value)
// C-style cast here allows us to also remove volatile; we put it
// back in the *Impl functions before dereferencing to avoid UB.
: m_value((const void*)(&value)),
m_formatImpl(&formatImpl),
m_toIntImpl(&toIntImpl)
{ }
void format(std::ostream& out, const char* fmtBegin,
const char* fmtEnd, int ntrunc) const
{
TINYFORMAT_ASSERT(m_value);
TINYFORMAT_ASSERT(m_formatImpl);
m_formatImpl(out, fmtBegin, fmtEnd, ntrunc, m_value);
}
int toInt() const
{
TINYFORMAT_ASSERT(m_value);
TINYFORMAT_ASSERT(m_toIntImpl);
return m_toIntImpl(m_value);
}
private:
template
TINYFORMAT_HIDDEN static void formatImpl(std::ostream& out, const char* fmtBegin,
const char* fmtEnd, int ntrunc, const void* value)
{
formatValue(out, fmtBegin, fmtEnd, ntrunc, *static_cast(value));
}
template
TINYFORMAT_HIDDEN static int toIntImpl(const void* value)
{
return convertToInt::invoke(*static_cast(value));
}
const void* m_value;
void (*m_formatImpl)(std::ostream& out, const char* fmtBegin,
const char* fmtEnd, int ntrunc, const void* value);
int (*m_toIntImpl)(const void* value);
};
// Parse and return an integer from the string c, as atoi()
// On return, c is set to one past the end of the integer.
inline int parseIntAndAdvance(const char*& c)
{
int i = 0;
for (;*c >= '0' && *c <= '9'; ++c)
i = 10*i + (*c - '0');
return i;
}
// Parse width or precision `n` from format string pointer `c`, and advance it
// to the next character. If an indirection is requested with `*`, the argument
// is read from `args[argIndex]` and `argIndex` is incremented (or read
// from `args[n]` in positional mode). Returns true if one or more
// characters were read.
inline bool parseWidthOrPrecision(int& n, const char*& c, bool positionalMode,
const detail::FormatArg* args,
int& argIndex, int numArgs)
{
if (*c >= '0' && *c <= '9') {
n = parseIntAndAdvance(c);
}
else if (*c == '*') {
++c;
n = 0;
if (positionalMode) {
int pos = parseIntAndAdvance(c) - 1;
if (*c != '$')
TINYFORMAT_ERROR("tinyformat: Non-positional argument used after a positional one");
if (pos >= 0 && pos < numArgs)
n = args[pos].toInt();
else
TINYFORMAT_ERROR("tinyformat: Positional argument out of range");
++c;
}
else {
if (argIndex < numArgs)
n = args[argIndex++].toInt();
else
TINYFORMAT_ERROR("tinyformat: Not enough arguments to read variable width or precision");
}
}
else {
return false;
}
return true;
}
// Print literal part of format string and return next format spec position.
//
// Skips over any occurrences of '%%', printing a literal '%' to the output.
// The position of the first % character of the next nontrivial format spec is
// returned, or the end of string.
inline const char* printFormatStringLiteral(std::ostream& out, const char* fmt)
{
const char* c = fmt;
for (;; ++c) {
if (*c == '\0') {
out.write(fmt, c - fmt);
return c;
}
else if (*c == '%') {
out.write(fmt, c - fmt);
if (*(c+1) != '%')
return c;
// for "%%", tack trailing % onto next literal section.
fmt = ++c;
}
}
}
// Parse a format string and set the stream state accordingly.
//
// The format mini-language recognized here is meant to be the one from C99,
// with the form "%[flags][width][.precision][length]type" with POSIX
// positional arguments extension.
//
// POSIX positional arguments extension:
// Conversions can be applied to the nth argument after the format in
// the argument list, rather than to the next unused argument. In this case,
// the conversion specifier character % (see below) is replaced by the sequence
// "%n$", where n is a decimal integer in the range [1,{NL_ARGMAX}],
// giving the position of the argument in the argument list. This feature
// provides for the definition of format strings that select arguments
// in an order appropriate to specific languages.
//
// The format can contain either numbered argument conversion specifications
// (that is, "%n$" and "*m$"), or unnumbered argument conversion specifications
// (that is, % and * ), but not both. The only exception to this is that %%
// can be mixed with the "%n$" form. The results of mixing numbered and
// unnumbered argument specifications in a format string are undefined.
// When numbered argument specifications are used, specifying the Nth argument
// requires that all the leading arguments, from the first to the (N-1)th,
// are specified in the format string.
//
// In format strings containing the "%n$" form of conversion specification,
// numbered arguments in the argument list can be referenced from the format
// string as many times as required.
//
// Formatting options which can't be natively represented using the ostream
// state are returned in spacePadPositive (for space padded positive numbers)
// and ntrunc (for truncating conversions). argIndex is incremented if
// necessary to pull out variable width and precision. The function returns a
// pointer to the character after the end of the current format spec.
inline const char* streamStateFromFormat(std::ostream& out, bool& positionalMode,
bool& spacePadPositive,
int& ntrunc, const char* fmtStart,
const detail::FormatArg* args,
int& argIndex, int numArgs)
{
TINYFORMAT_ASSERT(*fmtStart == '%');
// Reset stream state to defaults.
out.width(0);
out.precision(6);
out.fill(' ');
// Reset most flags; ignore irrelevant unitbuf & skipws.
out.unsetf(std::ios::adjustfield | std::ios::basefield |
std::ios::floatfield | std::ios::showbase | std::ios::boolalpha |
std::ios::showpoint | std::ios::showpos | std::ios::uppercase);
bool precisionSet = false;
bool widthSet = false;
int widthExtra = 0;
const char* c = fmtStart + 1;
// 1) Parse an argument index (if followed by '$') or a width possibly
// preceded with '0' flag.
if (*c >= '0' && *c <= '9') {
const char tmpc = *c;
int value = parseIntAndAdvance(c);
if (*c == '$') {
// value is an argument index
if (value > 0 && value <= numArgs)
argIndex = value - 1;
else
TINYFORMAT_ERROR("tinyformat: Positional argument out of range");
++c;
positionalMode = true;
}
else if (positionalMode) {
TINYFORMAT_ERROR("tinyformat: Non-positional argument used after a positional one");
}
else {
if (tmpc == '0') {
// Use internal padding so that numeric values are
// formatted correctly, eg -00010 rather than 000-10
out.fill('0');
out.setf(std::ios::internal, std::ios::adjustfield);
}
if (value != 0) {
// Nonzero value means that we parsed width.
widthSet = true;
out.width(value);
}
}
}
else if (positionalMode) {
TINYFORMAT_ERROR("tinyformat: Non-positional argument used after a positional one");
}
// 2) Parse flags and width if we did not do it in previous step.
if (!widthSet) {
// Parse flags
for (;; ++c) {
switch (*c) {
case '#':
out.setf(std::ios::showpoint | std::ios::showbase);
continue;
case '0':
// overridden by left alignment ('-' flag)
if (!(out.flags() & std::ios::left)) {
// Use internal padding so that numeric values are
// formatted correctly, eg -00010 rather than 000-10
out.fill('0');
out.setf(std::ios::internal, std::ios::adjustfield);
}
continue;
case '-':
out.fill(' ');
out.setf(std::ios::left, std::ios::adjustfield);
continue;
case ' ':
// overridden by show positive sign, '+' flag.
if (!(out.flags() & std::ios::showpos))
spacePadPositive = true;
continue;
case '+':
out.setf(std::ios::showpos);
spacePadPositive = false;
widthExtra = 1;
continue;
default:
break;
}
break;
}
// Parse width
int width = 0;
widthSet = parseWidthOrPrecision(width, c, positionalMode,
args, argIndex, numArgs);
if (widthSet) {
if (width < 0) {
// negative widths correspond to '-' flag set
out.fill(' ');
out.setf(std::ios::left, std::ios::adjustfield);
width = -width;
}
out.width(width);
}
}
// 3) Parse precision
if (*c == '.') {
++c;
int precision = 0;
parseWidthOrPrecision(precision, c, positionalMode,
args, argIndex, numArgs);
// Presence of `.` indicates precision set, unless the inferred value
// was negative in which case the default is used.
precisionSet = precision >= 0;
if (precisionSet)
out.precision(precision);
}
// 4) Ignore any C99 length modifier
while (*c == 'l' || *c == 'h' || *c == 'L' ||
*c == 'j' || *c == 'z' || *c == 't') {
++c;
}
// 5) We're up to the conversion specifier character.
// Set stream flags based on conversion specifier (thanks to the
// boost::format class for forging the way here).
bool intConversion = false;
switch (*c) {
case 'u': case 'd': case 'i':
out.setf(std::ios::dec, std::ios::basefield);
intConversion = true;
break;
case 'o':
out.setf(std::ios::oct, std::ios::basefield);
intConversion = true;
break;
case 'X':
out.setf(std::ios::uppercase);
// Falls through
case 'x': case 'p':
out.setf(std::ios::hex, std::ios::basefield);
intConversion = true;
break;
case 'E':
out.setf(std::ios::uppercase);
// Falls through
case 'e':
out.setf(std::ios::scientific, std::ios::floatfield);
out.setf(std::ios::dec, std::ios::basefield);
break;
case 'F':
out.setf(std::ios::uppercase);
// Falls through
case 'f':
out.setf(std::ios::fixed, std::ios::floatfield);
break;
case 'A':
out.setf(std::ios::uppercase);
// Falls through
case 'a':
# ifdef _MSC_VER
// Workaround https://developercommunity.visualstudio.com/content/problem/520472/hexfloat-stream-output-does-not-ignore-precision-a.html
// by always setting maximum precision on MSVC to avoid precision
// loss for doubles.
out.precision(13);
# endif
out.setf(std::ios::fixed | std::ios::scientific, std::ios::floatfield);
break;
case 'G':
out.setf(std::ios::uppercase);
// Falls through
case 'g':
out.setf(std::ios::dec, std::ios::basefield);
// As in boost::format, let stream decide float format.
out.flags(out.flags() & ~std::ios::floatfield);
break;
case 'c':
// Handled as special case inside formatValue()
break;
case 's':
if (precisionSet)
ntrunc = static_cast(out.precision());
// Make %s print Booleans as "true" and "false"
out.setf(std::ios::boolalpha);
break;
case 'n':
// Not supported - will cause problems!
TINYFORMAT_ERROR("tinyformat: %n conversion spec not supported");
break;
case '\0':
TINYFORMAT_ERROR("tinyformat: Conversion spec incorrectly "
"terminated by end of string");
return c;
default:
break;
}
if (intConversion && precisionSet && !widthSet) {
// "precision" for integers gives the minimum number of digits (to be
// padded with zeros on the left). This isn't really supported by the
// iostreams, but we can approximately simulate it with the width if
// the width isn't otherwise used.
out.width(out.precision() + widthExtra);
out.setf(std::ios::internal, std::ios::adjustfield);
out.fill('0');
}
return c+1;
}
//------------------------------------------------------------------------------
inline void formatImpl(std::ostream& out, const char* fmt,
const detail::FormatArg* args,
int numArgs)
{
// Saved stream state
std::streamsize origWidth = out.width();
std::streamsize origPrecision = out.precision();
std::ios::fmtflags origFlags = out.flags();
char origFill = out.fill();
// "Positional mode" means all format specs should be of the form "%n$..."
// with `n` an integer. We detect this in `streamStateFromFormat`.
bool positionalMode = false;
int argIndex = 0;
while (true) {
fmt = printFormatStringLiteral(out, fmt);
if (*fmt == '\0') {
if (!positionalMode && argIndex < numArgs) {
TINYFORMAT_ERROR("tinyformat: Not enough conversion specifiers in format string");
}
break;
}
bool spacePadPositive = false;
int ntrunc = -1;
const char* fmtEnd = streamStateFromFormat(out, positionalMode, spacePadPositive, ntrunc, fmt,
args, argIndex, numArgs);
// NB: argIndex may be incremented by reading variable width/precision
// in `streamStateFromFormat`, so do the bounds check here.
if (argIndex >= numArgs) {
TINYFORMAT_ERROR("tinyformat: Too many conversion specifiers in format string");
return;
}
const FormatArg& arg = args[argIndex];
// Format the arg into the stream.
if (!spacePadPositive) {
arg.format(out, fmt, fmtEnd, ntrunc);
}
else {
// The following is a special case with no direct correspondence
// between stream formatting and the printf() behaviour. Simulate
// it crudely by formatting into a temporary string stream and
// munging the resulting string.
std::ostringstream tmpStream;
tmpStream.copyfmt(out);
tmpStream.setf(std::ios::showpos);
arg.format(tmpStream, fmt, fmtEnd, ntrunc);
std::string result = tmpStream.str(); // allocates... yuck.
for (size_t i = 0, iend = result.size(); i < iend; ++i) {
if (result[i] == '+')
result[i] = ' ';
}
out << result;
}
if (!positionalMode)
++argIndex;
fmt = fmtEnd;
}
// Restore stream state
out.width(origWidth);
out.precision(origPrecision);
out.flags(origFlags);
out.fill(origFill);
}
} // namespace detail
/// List of template arguments format(), held in a type-opaque way.
///
/// A const reference to FormatList (typedef'd as FormatListRef) may be
/// conveniently used to pass arguments to non-template functions: All type
/// information has been stripped from the arguments, leaving just enough of a
/// common interface to perform formatting as required.
class FormatList
{
public:
FormatList(detail::FormatArg* args, int N)
: m_args(args), m_N(N) { }
friend void vformat(std::ostream& out, const char* fmt,
const FormatList& list);
private:
const detail::FormatArg* m_args;
int m_N;
};
/// Reference to type-opaque format list for passing to vformat()
typedef const FormatList& FormatListRef;
namespace detail {
// Format list subclass with fixed storage to avoid dynamic allocation
template
class FormatListN : public FormatList
{
public:
#ifdef TINYFORMAT_USE_VARIADIC_TEMPLATES
template
FormatListN(const Args&... args)
: FormatList(&m_formatterStore[0], N),
m_formatterStore { FormatArg(args)... }
{ static_assert(sizeof...(args) == N, "Number of args must be N"); }
#else // C++98 version
void init(int) {}
# define TINYFORMAT_MAKE_FORMATLIST_CONSTRUCTOR(n) \
\
template \
FormatListN(TINYFORMAT_VARARGS(n)) \
: FormatList(&m_formatterStore[0], n) \
{ TINYFORMAT_ASSERT(n == N); init(0, TINYFORMAT_PASSARGS(n)); } \
\
template \
void init(int i, TINYFORMAT_VARARGS(n)) \
{ \
m_formatterStore[i] = FormatArg(v1); \
init(i+1 TINYFORMAT_PASSARGS_TAIL(n)); \
}
TINYFORMAT_FOREACH_ARGNUM(TINYFORMAT_MAKE_FORMATLIST_CONSTRUCTOR)
# undef TINYFORMAT_MAKE_FORMATLIST_CONSTRUCTOR
#endif
FormatListN(const FormatListN& other)
: FormatList(&m_formatterStore[0], N)
{ std::copy(&other.m_formatterStore[0], &other.m_formatterStore[N],
&m_formatterStore[0]); }
private:
FormatArg m_formatterStore[N];
};
// Special 0-arg version - MSVC says zero-sized C array in struct is nonstandard
template<> class FormatListN<0> : public FormatList
{
public: FormatListN() : FormatList(0, 0) {}
};
} // namespace detail
//------------------------------------------------------------------------------
// Primary API functions
#ifdef TINYFORMAT_USE_VARIADIC_TEMPLATES
/// Make type-agnostic format list from list of template arguments.
///
/// The exact return type of this function is an implementation detail and
/// shouldn't be relied upon. Instead it should be stored as a FormatListRef:
///
/// FormatListRef formatList = makeFormatList( /*...*/ );
template
detail::FormatListN makeFormatList(const Args&... args)
{
return detail::FormatListN(args...);
}
#else // C++98 version
inline detail::FormatListN<0> makeFormatList()
{
return detail::FormatListN<0>();
}
#define TINYFORMAT_MAKE_MAKEFORMATLIST(n) \
template \
detail::FormatListN makeFormatList(TINYFORMAT_VARARGS(n)) \
{ \
return detail::FormatListN(TINYFORMAT_PASSARGS(n)); \
}
TINYFORMAT_FOREACH_ARGNUM(TINYFORMAT_MAKE_MAKEFORMATLIST)
#undef TINYFORMAT_MAKE_MAKEFORMATLIST
#endif
/// Format list of arguments to the stream according to the given format string.
///
/// The name vformat() is chosen for the semantic similarity to vprintf(): the
/// list of format arguments is held in a single function argument.
inline void vformat(std::ostream& out, const char* fmt, FormatListRef list)
{
detail::formatImpl(out, fmt, list.m_args, list.m_N);
}
#ifdef TINYFORMAT_USE_VARIADIC_TEMPLATES
/// Format list of arguments to the stream according to given format string.
template
void format(std::ostream& out, const char* fmt, const Args&... args)
{
vformat(out, fmt, makeFormatList(args...));
}
/// Format list of arguments according to the given format string and return
/// the result as a string.
template
std::string format(const char* fmt, const Args&... args)
{
std::ostringstream oss;
format(oss, fmt, args...);
return oss.str();
}
/// Format list of arguments to std::cout, according to the given format string
template
void printf(const char* fmt, const Args&... args)
{
format(std::cout, fmt, args...);
}
template
void printfln(const char* fmt, const Args&... args)
{
format(std::cout, fmt, args...);
std::cout << '\n';
}
#else // C++98 version
inline void format(std::ostream& out, const char* fmt)
{
vformat(out, fmt, makeFormatList());
}
inline std::string format(const char* fmt)
{
std::ostringstream oss;
format(oss, fmt);
return oss.str();
}
inline void printf(const char* fmt)
{
format(std::cout, fmt);
}
inline void printfln(const char* fmt)
{
format(std::cout, fmt);
std::cout << '\n';
}
#define TINYFORMAT_MAKE_FORMAT_FUNCS(n) \
\
template \
void format(std::ostream& out, const char* fmt, TINYFORMAT_VARARGS(n)) \
{ \
vformat(out, fmt, makeFormatList(TINYFORMAT_PASSARGS(n))); \
} \
\
template \
std::string format(const char* fmt, TINYFORMAT_VARARGS(n)) \
{ \
std::ostringstream oss; \
format(oss, fmt, TINYFORMAT_PASSARGS(n)); \
return oss.str(); \
} \
\
template \
void printf(const char* fmt, TINYFORMAT_VARARGS(n)) \
{ \
format(std::cout, fmt, TINYFORMAT_PASSARGS(n)); \
} \
\
template \
void printfln(const char* fmt, TINYFORMAT_VARARGS(n)) \
{ \
format(std::cout, fmt, TINYFORMAT_PASSARGS(n)); \
std::cout << '\n'; \
}
TINYFORMAT_FOREACH_ARGNUM(TINYFORMAT_MAKE_FORMAT_FUNCS)
#undef TINYFORMAT_MAKE_FORMAT_FUNCS
#endif
} // namespace tinyformat
#endif // TINYFORMAT_H_INCLUDED
vdiffr/src/engine_version.h 0000644 0001762 0000144 00000000103 14057630265 015506 0 ustar ligges users #pragma once
#include
std::string get_engine_version();
vdiffr/NAMESPACE 0000644 0001762 0000144 00000000536 14213665776 012776 0 ustar ligges users # Generated by roxygen2: do not edit by hand
S3method(print_plot,"function")
S3method(print_plot,default)
S3method(print_plot,ggplot)
S3method(print_plot,grob)
S3method(print_plot,recordedplot)
export(expect_doppelganger)
export(write_svg)
import(rlang)
importFrom(glue,glue)
importFrom(lifecycle,deprecated)
useDynLib(vdiffr, .registration = TRUE)
vdiffr/LICENSE 0000644 0001762 0000144 00000000054 14705672254 012552 0 ustar ligges users YEAR: 2024
COPYRIGHT HOLDER: vdiffr authors
vdiffr/NEWS.md 0000644 0001762 0000144 00000032146 14707722644 012653 0 ustar ligges users # vdiffr 1.0.8
* Added support for snapshot variants (#125).
# vdiffr 1.0.7
* Revert back to C++11 to work around a GCC issue (#137).
# vdiffr 1.0.6
* The SVG device in vdiffr now has a different name
so it can be distinguished from the svglite device (#135).
# vdiffr 1.0.5
* Fix for CRAN checks.
# vdiffr 1.0.4
* Compatibility with UCRT build of Windows using Rtools42.
# vdiffr 1.0.3
* Compatibility with UCRT build of Windows (@jeroen).
# vdiffr 1.0.2
* testthat no longer auto-deletes snapshot files that were not
generated because of an unexpected error or a `skip()`
(r-lib/testthat#1393).
# vdiffr 1.0.0
This release includes two major changes:
1. The internal SVG engine has been updated. It is now lighter, more
robust, with fewer dependencies. It also generates more correct
SVG. The main user visible change is that points look smaller than
with older snapshots. Because of this update you will have to
regenerate all existing snapshots with the new engine.
2. The snapshot management system now uses testthat (see
https://testthat.r-lib.org/articles/snapshotting.html). Most of the
R and javascript code has been removed from vdiffr as a consequence.
vdiffr now serves as a reproducible SVG generation engine for
testthat snapshots.
## Migration of existing snapshots
There are two steps to update your snapshots to vdiffr 1.0.
1. This step is optional. Install the github-only 0.4.0 version of
vdiffr with `remotes::install_github("r-lib/vdiffr@v0.4.0")`. This
release only contains the new SVG engine. Review the snapshot
changes as usual with `vdiffr::manage_cases()`.
2. Install vdiffr 1.0.0 from CRAN, delete the `tests/figs` directory,
run `devtools::test()`, and then `testthat::snapshot_review()`.
## Other changes
* `expect_doppelganger()` now supports grid objects such as `gtable`
and `grob` (#36).
# vdiffr 0.4.0
This is a github-only release that is meant to help you migrate from
vdiffr 0.3.x to vdiffr 1.0.0. The 1.0 release of vdiffr includes two
major changes. It switches to testthat 3e for snapshot management and
it uses an updated SVG engine for the generation of snapshots. The
github-only 0.4.0 release only includes the new SVG engine to make it
easy to compare cases with `manage_cases()`.
This intermediate step in the migration of snapshots is optional. You
can also choose to update directly with the 1.0.0 release but you
won't be able to compare the new snapshots to your old ones.
Note that smaller points are expected in the new snapshots because of
a bugfix.
- Following an update to the graphics engine of R 4.1.0 that causes
spurious failures due to subtle changes in graphics generation,
vdiffr snapshots are now skipped on old versions of R. The plots are
still generated on all versions so any errors during plot drawing
will be detected by testthat.
- The SVG generation engine of vdiffr has been updated (@thomasp85).
Font sizes are now precomputed for the first 50000 unicode points.
This allows deterministic computation of text box extents without
the freetype and harfbuzz dependencies.
Note: The main visible change of this update is that points now look
smaller. Points generated with the previous SVG engine were too large.
- vdiffr is now licensed as MIT (#95).
# vdiffr 0.3.3
- Compatibility with r-devel (@pmur002).
- Compatibility with testthat 3.
# vdiffr 0.3.2
- Fixed CRAN checks on r-devel.
- Keyboard short cuts for common interactions:
Right/Left arrows = Next/Previous case
Down/Up arrows = Next/Previous type
ENTER = Validate active case
shift + ENTER = Validate active group
ESC = Quit app
- Failure diffs are now logged in `vdiffr.Rout.fail` when the `CI`
environment variable is set. This makes it easier to investigate
remote failures on Travis etc (#79).
# vdiffr 0.3.1
This release makes vdiffr compatible with ggplot2 3.2.0. It also
features two contributions from the Tidyverse developer day in Austin:
- You can now select the validated cases in the Shiny app (#38,
@nathancday).
- The testthat context is now shown on the Shiny app (#14,
@paleolimbot).
Finally, it fixes warnings in non-UTF-8 MBCS locale (#59,
@yutannihilation).
# vdiffr 0.3.0
This release of vdiffr features a major overhaul of the internals to
make the package more robust.
## Cross-platform reliability
vdiffr now works reliably across platforms:
* svglite is now embedded in vdiffr to protect against updates of the
SVG generation engine.
* It also embeds harfbuzz to compute font extents and text boxes
metrics. This makes SVG generation of text boxes consisent
across platforms.
While this makes vdiffr much more robust, it also means you will have
to regenerate all your testcases with the new version of vdiffr. You
can expect very few future releases that will require updating
figures, hopefully once every few years.
Now that vdiffr has a stable engine, the next release will focus on
improving the Shiny UI.
## Regression testing versus Unit testing
Another important change is that figure mismatches are no longer
reported as failures, except when the tests are run locally, on
Travis, Appveyor, or any environment where the `Sys.getenv("CI")` or
`Sys.getenv("NOT_CRAN")` variables are set. Because vdiffr is more of
a monitoring than a unit testing tool, it shouldn't cause R CMD check
failures on the CRAN machines.
Despite our efforts to make vdiffr robust and reliable across
platforms, checking the appearance of a figure is still inherently
fragile. It is similar to testing for errors by matching exact error
messages: these messages are susceptible to change at any
time. Similarly, the appearance of plots depends on a lot of upstream
code, such as the way margins and spacing are computed. vdiffr uses a
special ggplot2 theme that should change very rarely, but there are
just too many upstream factors that could cause breakages. For this
reason, figure mismatches are not necessarily representative of actual
failures.
Visual testing is not an alternative to writing unit tests for the
internal data transformations performed during the creation of your
figure. It is more of a monitoring tool that allows you to quickly
check how the appearance of your figures changes over time, and to
manually assess whether changes reflect actual problems in your
package.
If you need to override the default vdiffr behaviour on CRAN (not
recommended) or Travis (for example to run the tests in a particular
builds but not others), set the `VDIFFR_RUN_TESTS` environment
variable to "true" or "false".
## Features
* vdiffr now advises user to run `manage_cases()` when a figure was
not validated yet (#25).
* Fixed a bug in the Shiny app that prevented SVGs from being
displayed in Firefox (@KZARCA, #29).
* `manage_cases()` gains an `options` argument that is passed to
`shiny::shinyApp()` (@KZARCA).
* The Shiny app now has a quit button (@ilarischeinin).
* New `VDIFFR_LOG_PATH` environment variable. When set, vdiffr pushes
diffs of failed SVG comparisons to that file.
* `expect_doppelganger()` now takes a `writer` argument. This makes it
easy to use vdiffr with a different SVG engine. See `?write_svg` for
an example function. Packages implementing a different SVG engine
should wrap around `expect_doppelganger()` to pass their custom
writer.
* `write_svg()` is now an exported function. It provides a template
(function arguments and return value) for SVG writer functions.
* `manage_cases()` no longer checks for orphaned cases when a filter
is supplied. (Orphaned cases are figures dangling in the `figs`
folder even though their original `expect_doppelganger()` has been
removed from the tests.)
## Life cycle
* The `verbose` argument of `expect_doppelganger()` is
soft-deprecated. Please use the vdiffr failure log instead. It is
created automatically when run under R CMD check in
`tests/vdiffr.Rout.fail`, and should be displayed on Travis.
You can also set the `VDIFFR_LOG_PATH` environment variable with
`Sys.setenv()` to unconditionally (also interactively) log failures
in the file pointed by the variable.
* `add_dependency()` is soft-deprecated without replacement.
* The `user_fonts` argument of `expect_doppelganger()` is defunct
because it complicated the UI for no clear benefit. The fonts used
to generate the SVGs are now hardcoded to Liberation and Symbola.
# vdiffr 0.2.3
* Maintenance release to fix CRAN errors. Thanks to Gregory R. Warnes
(@gwarnes-mdsol) and Hiroaki Yutani (@yutannihilation) for helping
out with this!
I'm working on embedding svglite in vdiffr and compiling statically
to FreeType and Harfbuzz to make SVG generation deterministic across
platforms. Until then vdiffr will remain a bit unstable (but should
silently fail if dependencies have diverged).
* Use `last_collection_error()` to print a testthat error that
occurred while collecting the test cases.
# vdiffr 0.2.2
* Skip tests if the system version of Cairo (actually the one gdtools
was compiled with) doesn't match the version of Cairo used to
generate the testcases. Cairo has an influence on the computation of
text metrics which can cause spurious test failures.
We plan to fix these issues once and for all by embedding gdtools,
svglite, Cairo and FreeType in the vdiffr package.
# vdiffr 0.2.1
This release fixes some CRAN failures.
* Test cases of the mock package were updated to FreeType 2.8.0.
* The unit test log file from the mock package is now preserved.
# vdiffr 0.2.0
This release makes it easier to debug failures on remote systems. It
also makes vdiffr more robust to failures caused by incompatible
installations: instead of failing, the tests are skipped. This
prevents spurious failures on CRAN.
## Troubleshooting on remotes
* `expect_doppelganger()` gains a `verbose` argument to print the
SVG files for failed cases while testing. This is useful to debug
failures on remotes.
* When tests are run by `R CMD check`, failures are now recorded in a
log file called `vdiffr.fail`. This file will show up in the Travis
log and can be retrieved from artifacts on Appveyor. It includes the
SVG files for failed cases, which is useful to debug failures on
remotes.
## Handling of incompatible systems
The tests are now skipped if the FreeType version used to build the
comparison SVGs does not match the version installed on the system
where the tests are run. This is necessary because changes in new
version of FreeType might affect the computation of text extents,
which then causes svglite to produce slightly different SVGs. The
minor version is not taken into account so FreeType 2.7.1 is deemed
compatible with 2.7.2 but not with 2.8.0.
In practice, this means that package contributors should only
validate visual cases if their FreeType version matches the one of
the package maintainer. Also, the maintainer must update the version
recorded in the package repository (in the file
`./tests/figs/deps.txt`) when FreeType has been updated on their
system. Running `vdiffr::validate_cases()` updates the dependency
file even if there are no visual case to update.
In the future, we may provide a version of vdiffr statically
compiled with a specific version of FreeType to prevent these issues.
## Other changes
* The minimal R version required by vdiffr is now R 3.1.0.
# vdiffr 0.1.1
* `expect_doppelganger()` no longer throws an error when FreeType is
too old. Instead, the test is skipped. This ensures that R CMD check
passes on those platforms (e.g., CRAN's Solaris test server).
* Depends on gdtools 0.1.2 or later as this version fixes a crash on
Linux platforms.
* `widget_toggle()`, `widget_slide()` and `widget_diff()` now take
plots as arguments. This makes it easy to embed a vdiffr widget in
R Markdown documents. The underscored versions take HTML sources as
argument (paths to SVG files or inline SVGs).
# vdiffr 0.1.0
* Generated SVGs are now reproducible across platforms thanks to
recent versions of svglite, gdtools, and the new package fontquiver.
vdiffr now requires versions of FreeType greater than 2.6.1.
* The figures folder is hardcoded to `tests/figs/`.
* The figures are now stored in subfolders according to the current
testthat context. `expect_doppelganger()` accepts the `path`
argument to bypass this behaviour (set it to `""` to store the
figures in `tests/figs/`).
* The `title` argument of `expect_doppelganger()` now serves as
`ggtitle()` in ggplot2 figures (unless a title is already set). It
is also standardised and used as filename to store the figure
(spaces and non-alphanumeric characters are converted to dashes).
* Add support for handling orphaned cases: you can now remove figures
left over from deleted tests with `delete_orphaned_cases()` or from
the Shiny app.
* New `filter` argument to `collect_cases()` and `manage_cases()`.
This lets you filter the test files from which to collect the cases,
which is useful to speed up the collection for large codebases with
a lot of unit tests.
* Fix invalid generation of SVG files (#3)
* Give a warning when multiple doppelgangers have the same name (#4).
* Remove CR line endings before comparing svg files for compatibility
with Windows
# vdiffr 0.0.0.9000
Initial release
vdiffr/inst/ 0000755 0001762 0000144 00000000000 14057630265 012517 5 ustar ligges users vdiffr/inst/create_glyph_dims.R 0000644 0001762 0000144 00000004717 14057630265 016335 0 ustar ligges users # This code creates "src/glyph_dims.h" which inlines the glyph dimensions of
# Liberation and Symbola for all unicode points up until 50000.
#
# Changes in the entries of "src/glyph_dims.h" will result in potential failures
# of visual tests since it will change string dimension calculations. Only
# update it for very good reasons!
# Create vector of unicode characters
char_num <- seq_len(50000)
res <- 1e4
chars <- eval(
parse(text = paste0(
'c("',
paste(sprintf("\\U%04X", char_num), collapse = '","'),
'")')
)
)
# Get font files from fontquiver (old vdiffr dependency)
liberation <- fontquiver::font("Liberation", 'Sans', 'Regular')$ttf
symbola <- fontquiver::font("Symbola", 'Symbols', 'Regular')$ttf
# Extract glyph dimensions from Liberation
liberation_glyphs <- systemfonts::glyph_info(chars, res = res, path = liberation)
liberation_glyphs$num <- char_num
liberation_glyphs <- liberation_glyphs[!duplicated(liberation_glyphs$index), ]
liberation_glyphs <- data.frame(
char = liberation_glyphs$num,
width = liberation_glyphs$x_advance * 72 / res,
ascent = vapply(liberation_glyphs$bbox, `[`, numeric(1), 4) * 72 / res,
descent = -vapply(liberation_glyphs$bbox, `[`, numeric(1), 3) * 72 / res
)
# Extract glyph dimensions from Symbola
symbola_glyphs <- systemfonts::glyph_info(chars, res = res, path = symbola)
symbola_glyphs$num <- char_num
symbola_glyphs <- symbola_glyphs[!duplicated(symbola_glyphs$index), ]
symbola_glyphs <- data.frame(
char = symbola_glyphs$num,
width = symbola_glyphs$x_advance * 72 / res,
ascent = vapply(symbola_glyphs$bbox, `[`, numeric(1), 4) * 72 / res,
descent = -vapply(symbola_glyphs$bbox, `[`, numeric(1), 3) * 72 / res
)
# Write "src/glyph_dims.h"
def <- c(
"// Generated by inst/create_glyph_dims.R — Do not edit by hand",
"#pragma once",
"#include ",
"struct Dim {",
" double width;",
" double ascent;",
" double descent;",
"};",
"const std::unordered_map LIBERATION_DIM = {",
paste(sprintf(
" {%i, {%.4f, %.4f, %.4f}}",
liberation_glyphs$char,
liberation_glyphs$width,
liberation_glyphs$ascent,
liberation_glyphs$descent
), collapse = ",\n"),
"};",
"const std::unordered_map SYMBOLA_DIM = {",
paste(sprintf(
" {%i, {%.4f, %.4f, %.4f}}",
symbola_glyphs$char,
symbola_glyphs$width,
symbola_glyphs$ascent,
symbola_glyphs$descent
), collapse = ",\n"),
"};"
)
writeLines(def, "src/glyph_dims.h")
vdiffr/tools/ 0000755 0001762 0000144 00000000000 14705672254 012706 5 ustar ligges users vdiffr/tools/winlibs.R 0000644 0001762 0000144 00000000570 14705672254 014502 0 ustar ligges users VERSION <- commandArgs(TRUE)
if(!file.exists(sprintf("../windows/harfbuzz-%s/include/png.h", VERSION))){
if(getRversion() < "3.3.0") setInternet2()
download.file(sprintf("https://github.com/rwinlib/harfbuzz/archive/v%s.zip", VERSION), "lib.zip", quiet = TRUE)
dir.create("../windows", showWarnings = FALSE)
unzip("lib.zip", exdir = "../windows")
unlink("lib.zip")
}
vdiffr/README.md 0000644 0001762 0000144 00000010457 14705725542 013033 0 ustar ligges users # vdiffr
[](https://cran.r-project.org/package=vdiffr)
[](https://github.com/r-lib/vdiffr/actions/workflows/R-CMD-check.yaml)
[](https://app.codecov.io/gh/r-lib/vdiffr)
vdiffr is a testthat extension for monitoring the appearance of R plots. It generates reproducible SVG files and registers them as [testthat snapshots](https://testthat.r-lib.org/articles/snapshotting.html).
## How to use vdiffr
1) Add graphical expectations by including `expect_doppelganger()` in your test files.
1) Run `devtools::test()`.
1) If `test()` detected new snapshots or changes to existing snapshots, run `testthat::snapshot_review()` to review them.
There may be many reasons for a snapshot to fail. Upstream changes (e.g. to the R graphics engine or to ggplot2) may cause subtle differences in your plots that are not actual failures. For this reason, snapshots do not cause failures on CRAN by default. You will only see failures locally or on CI platforms such as Github Actions.
### Adding expectations
vdiffr integrates with testthat through the `expect_doppelganger()` expectation. It takes as arguments:
- A title. This title is used in two ways. First, the title is standardised (it is converted to lowercase and any character that is not alphanumeric or a space is turned into a dash) and used as filename for storing the figure. Secondly, with ggplot2 figures the title is automatically added to the plot with `ggtitle()` (only if no ggtitle has been set).
- A figure. This can be a ggplot object, a recorded plot, a function to be called, or more generally any object with a `print` method.
The snapshots are recorded in subfolders of the `_snaps/` directory.
```{r}
disp_hist_base <- function() hist(mtcars$disp)
disp_hist_ggplot <- ggplot(mtcars, aes(disp)) + geom_histogram()
vdiffr::expect_doppelganger("Base graphics histogram", disp_hist_base)
vdiffr::expect_doppelganger("ggplot2 histogram", disp_hist_ggplot)
```
Note that in addition to automatic ggtitles, ggplot2 figures are
assigned the minimalistic theme `theme_test()` (unless they already
have been assigned a theme).
### Debugging
It is sometimes difficult to understand the cause of a doppelganger failure. A frequent cause of failure is undeterministic generation of plots. Potential culprits are:
* Some of the plot components depend on random variation. Try setting a seed, for instance with [`withr::local_seed()`](https://withr.r-lib.org/reference/with_seed.html).
* The plot depends on some system library. For instance sf plots depend on libraries like GEOS and GDAL. It might not be possible to test these plots with vdiffr (which can still be used for manual inspection, add a [testthat::skip()] before the `expect_doppelganger()` call in that case).
To help you understand the causes of a failure, vdiffr automatically logs the SVG diff of all failures when run under R CMD check. The log is located in `tests/vdiffr.Rout.fail` and should be displayed in your CI logs.
You can also set the `VDIFFR_LOG_PATH` environment variable with `Sys.setenv()` to unconditionally (also interactively) log failures in the file pointed by the variable.
### Skipping all vdiffr checks on some platforms
See ggplot2's approach which wraps `expect_doppelganger()` with a version that that calls `testthat::skip()` on the relevant platforms (as determined by environment variables): https://github.com/tidyverse/ggplot2/blob/ddd207e926cc1c1847dc661d9a099b8ec19c4010/tests/testthat/helper-vdiffr.R#L1-L15.
## Building vdiffr
_This section is only relevant for building vdiffr from scratch, as opposed to installing from a pre-built package on CRAN._
Building vdiffr requires the system dependency libpng. As vdiffr doesn't have any build-time configuration, your R configuration must point to libpng's `include` and `lib` folders.
For instance on macOS, install libpng with:
```sh
brew install libpng
```
And make sure your `~/.R/Makevars` knows about Homebrew's `include` and `lib` folders where libpng should now be installed. On arm64 hardware, this would be:
```mk
CPPFLAGS += -I/opt/homebrew/include
LDFLAGS += -L/opt/homebrew/lib
```
vdiffr/man/ 0000755 0001762 0000144 00000000000 14707670764 012327 5 ustar ligges users vdiffr/man/vdiffr-package.Rd 0000644 0001762 0000144 00000002556 14705672254 015471 0 ustar ligges users % Generated by roxygen2: do not edit by hand
% Please edit documentation in R/vdiffr-package.R
\docType{package}
\name{vdiffr-package}
\alias{vdiffr}
\alias{vdiffr-package}
\title{vdiffr: Visual Regression Testing and Graphical Diffing}
\description{
An extension to the 'testthat' package that makes it easy to add graphical unit tests. It provides a Shiny application to manage the test cases.
}
\seealso{
Useful links:
\itemize{
\item \url{https://vdiffr.r-lib.org/}
\item \url{https://github.com/r-lib/vdiffr}
\item Report bugs at \url{https://github.com/r-lib/vdiffr/issues}
}
}
\author{
\strong{Maintainer}: Lionel Henry \email{lionel@posit.co}
Authors:
\itemize{
\item Thomas Lin Pedersen \email{thomas.pedersen@posit.co} (\href{https://orcid.org/0000-0002-5147-4711}{ORCID})
\item T Jake Luciani \email{jake@apache.org} (svglite)
\item Matthieu Decorde \email{matthieu.decorde@ens-lyon.fr} (svglite)
\item Vaudor Lise \email{lise.vaudor@ens-lyon.fr} (svglite)
}
Other contributors:
\itemize{
\item Posit Software, PBC [copyright holder, funder]
\item Tony Plate (svglite: Early line dashing code) [contributor]
\item David Gohel (svglite: Line dashing code and raster code) [contributor]
\item Yixuan Qiu (svglite: Improved styles; polypath implementation) [contributor]
\item Håkon Malmedal (svglite: Opacity code) [contributor]
}
}
\keyword{internal}
vdiffr/man/expect_doppelganger.Rd 0000644 0001762 0000144 00000011006 14707670764 016633 0 ustar ligges users % Generated by roxygen2: do not edit by hand
% Please edit documentation in R/expect-doppelganger.R
\name{expect_doppelganger}
\alias{expect_doppelganger}
\title{Does a figure look like its expected output?}
\usage{
expect_doppelganger(
title,
fig,
path = deprecated(),
...,
writer = write_svg,
cran = FALSE,
variant = NULL
)
}
\arguments{
\item{title}{A brief description of what is being tested in the
figure. For instance: "Points and lines overlap".
If a ggplot2 figure doesn't have a title already, \code{title} is
applied to the figure with \code{ggtitle()}.
The title is also used as file name for storing SVG (in a
sanitzed form, with special characters converted to \code{"-"}).}
\item{fig}{A figure to test. This can be a ggplot object, a
recordedplot, or more generally any object with a \code{print} method.
If you need to test a plot with non-printable objects (e.g. base
plots), \code{fig} can be a function that generates and prints the
plot, e.g. \code{fig = function() plot(1:3)}.}
\item{path, ...}{\ifelse{html}{\href{https://lifecycle.r-lib.org/articles/stages.html#deprecated}{\figure{lifecycle-deprecated.svg}{options: alt='[Deprecated]'}}}{\strong{[Deprecated]}}.}
\item{writer}{A function that takes the plot, a target SVG file,
and an optional plot title. It should transform the plot to SVG
in a deterministic way and write it to the target file. See
\code{\link[=write_svg]{write_svg()}} (the default) for an example.}
\item{cran}{If \code{FALSE} (the default), mismatched snapshots only
cause a failure when you run tests locally or in your CI (Github
Actions or any platform that sets the \code{CI} environment variable).
If \code{TRUE}, failures may also occur on CRAN machines.
Failures are disabled on CRAN by default because testing the
appearance of a figure is inherently fragile. Changes in the R
graphics engine or in ggplot2 may cause subtle differences in the
aspect of a plot, such as a slightly smaller or larger margin.
These changes will cause spurious failures because you need to
update your snapshots to reflect the upstream changes.
It would be distracting for both you and the CRAN maintainers if
such changes systematically caused failures on CRAN. This is why
snapshot expectations do not fail on CRAN by default and should
be treated as a monitoring tool that allows you to quickly check
how the appearance of your figures changes over time, and to
manually assess whether changes reflect actual problems in your
package.
Internally, this argument is passed to
\code{\link[testthat:expect_snapshot_file]{testthat::expect_snapshot_file()}}.}
\item{variant}{If not-\code{NULL}, results will be saved in
\verb{_snaps/{variant}/{test}/{name}.{ext}}. This allows you to create
different snapshots for different scenarios, like different operating
systems or different R versions.}
}
\description{
\code{expect_doppelganger()} is a testthat expectation for graphical
plots. It generates SVG snapshots that you can review graphically
with \code{\link[testthat:snapshot_accept]{testthat::snapshot_review()}}. You will find more information
about snapshotting in the \href{https://testthat.r-lib.org/articles/snapshotting.html}{testthat snapshots vignette}.
Note that \code{expect_doppelgagner()} requires R version 4.1.0. If run
on an earlier version of R, it emits a \code{testthat::skip()} so that you
can still run other checks on old versions of R.
}
\section{Debugging}{
It is sometimes difficult to understand the cause of a failure.
This usually indicates that the plot is not created
deterministically. Potential culprits are:
\itemize{
\item Some of the plot components depend on random variation. Try
setting a seed.
\item The plot depends on some system library. For instance sf plots
depend on libraries like GEOS and GDAL. It might not be possible
to test these plots with vdiffr.
}
To help you understand the causes of a failure, vdiffr
automatically logs the SVG diff of all failures when run under R
CMD check. The log is located in \code{tests/vdiffr.Rout.fail} and
should be displayed on Travis.
You can also set the \code{VDIFFR_LOG_PATH} environment variable with
\code{Sys.setenv()} to unconditionally (also interactively) log failures
in the file pointed by the variable.
}
\examples{
if (FALSE) { # Not run
library("ggplot2")
test_that("plots have known output", {
disp_hist_base <- function() hist(mtcars$disp)
expect_doppelganger("disp-histogram-base", disp_hist_base)
disp_hist_ggplot <- ggplot(mtcars, aes(disp)) + geom_histogram()
expect_doppelganger("disp-histogram-ggplot", disp_hist_ggplot)
})
}
}
vdiffr/man/write_svg.Rd 0000644 0001762 0000144 00000001341 14057630265 014614 0 ustar ligges users % Generated by roxygen2: do not edit by hand
% Please edit documentation in R/svg.R
\name{write_svg}
\alias{write_svg}
\title{Default SVG writer}
\usage{
write_svg(plot, file, title = "")
}
\arguments{
\item{plot}{A plot object to convert to SVG. Can be a ggplot2 object,
a \link[grDevices:recordplot]{recorded plot}, or any object with a
\link[base:print]{print()} method.}
\item{file}{The file to write the SVG to.}
\item{title}{An optional title for the test case.}
}
\description{
This is the default SVG writer for vdiffr test cases. It uses
embedded versions of \href{https://svglite.r-lib.org}{svglite},
\href{https://harfbuzz.github.io/}{harfbuzz}, and the Liberation and
Symbola fonts in order to create deterministic SVGs.
}
vdiffr/man/figures/ 0000755 0001762 0000144 00000000000 14057630265 013761 5 ustar ligges users vdiffr/man/figures/lifecycle-questioning.svg 0000644 0001762 0000144 00000001714 14057630265 021007 0 ustar ligges users