ewing Demos
  • Home
  • Gallery
  • sysethol
  • IsleRoyale
  • Tools
    • fivePlot
    • fiveShow
    • temp
    • triangle
    • hexmove

On this page

  • Programmatic Application Usage
  • Executable Workflow: Isle Royale Spatial Predator-Prey Model
  • Age Classes Demographic Dynamics
  • Technical Features

IsleRoyaleApp (Isle Royale Wolf-Moose Platform)

Interactive offline simulation platform exploring spatial predator-prey dynamics, wolf-moose movement over Isle Royale habitat features, age class distributions, and historical census benchmarks.
Author

Brian S. Yandell

← Back to Demos Gallery

The live application below is running completely client-side in your browser using serverless Shinylive (WebAssembly). It provides an interactive Isle Royale Wolf-Moose Platform (IsleRoyaleApp()) featuring 100% offline spatial substrate mapping, continuous micro-step history tracking, side-by-side cowplot age class plots with per-species legends, custom time unit labeling (Steps vs Days), tab-aware sidebar decluttering (show_habitat, show_landmarks, norm, total), and dynamic table discovery (inputApp).

#| '!! shinylive warning !!': |
#|   shinylive does not work in self-contained HTML documents.
#|   Please set `embed-resources: false` in your metadata.
#| standalone: true
#| viewerHeight: 880
#| components: [viewer]

library(shiny)
library(bslib)
library(ggplot2)
library(cowplot)
library(dplyr)
library(tidyr)
library(tibble)
library(rlang)
library(stats)
library(graphics)

# --- Auto-Included Isle Royale Datasets List ---
isle_royale_datasets <- list()
# --- Auto-Included Data Table: future.moose ---
future.moose <- structure(list(current = c("calf", "yearling", "adult", "senior", 
"adult", "death", "predated"), future = c("yearling", "adult", 
"senior", "death", "calf", "death", "death"), fid = c(2L, 3L, 
4L, 5L, 6L, 7L, 7L), time = c(365L, 365L, 2920L, 2190L, 365L, 
0L, 0L), pch = c("0", "1", "2", "3", "G", "D", "D"), color = c("lightgreen", 
"green", "darkgreen", "brown", "black", "red", "red"), ageclass = c("calf", 
"yearling", "adult", "senior", "adult", NA, NA), event = c("future", 
"future", "future", "future", "birth", "death", "death"), init = c(50L, 
50L, 400L, 100L, 50L, 0L, 0L)), class = "data.frame", row.names = c(NA, 
-7L))
isle_royale_datasets[['future.moose']] <- future.moose

# --- Auto-Included Data Table: future.wolf ---
future.wolf <- structure(list(current = c("pup", "subadult", "adult", "adult", 
"death"), future = c("subadult", "adult", "death", "pup", "death"
), fid = 2:6, time = c(365L, 365L, 2555L, 365L, 0L), pch = c("0", 
"1", "2", "P", "D"), color = c("orange", "darkorange", "black", 
"purple", "red"), ageclass = c("pup", "subadult", "adult", "adult", 
NA), event = c("future", "future", "future", "birth", "death"
), init = c(5L, 10L, 15L, 5L, 0L)), class = "data.frame", row.names = c(NA, 
-5L))
isle_royale_datasets[['future.wolf']] <- future.wolf

# --- Auto-Included Data Table: moose.wolf ---
moose.wolf <- structure(list(c("calf", "yearling", "adult", "senior", "death", 
"predated"), feed = c(8, 3, 1, 6, 0, 0), offspring = c(1.5, 1, 
0.5, 1.2, 0, 0), male = c(NA, NA, NA, NA, NA, NA)), class = "data.frame", row.names = c(NA, 
-6L))
isle_royale_datasets[['moose.wolf']] <- moose.wolf

# --- Auto-Included Data Table: organism.features ---
organism.features <- structure(list(c("moose", "wolf", "substrate"), units = c("DD", 
"hr", NA), offspring = c("1.2", "moose", ""), attack = c(NA, 
"moose", ""), birth = c("adult", NA, ""), substrate = c("substrate", 
"substrate", ""), deplete = c(100L, 48L, NA), subclass = c("moose", 
"adult", ""), parasite = c(NA, "ecto", ""), move = c("adult", 
"adult", "")), class = "data.frame", row.names = c(NA, -3L))
isle_royale_datasets[['organism.features']] <- organism.features

# --- Auto-Included Data Table: substrate.moose ---
substrate.moose <- structure(list(c("calf", "yearling", "adult", "senior"), substrate = c(1.2, 
1, 1, 0.8)), class = "data.frame", row.names = c(NA, -4L))
isle_royale_datasets[['substrate.moose']] <- substrate.moose

# --- Auto-Included Data Table: substrate.substrate ---
substrate.substrate <- structure(list("substrate", substrate = 1), class = "data.frame", row.names = c(NA, 
-1L))
isle_royale_datasets[['substrate.substrate']] <- substrate.substrate

# --- Auto-Included Data Table: substrate.wolf ---
substrate.wolf <- structure(list(c("pup", "subadult", "adult"), substrate = c(1, 
1, 1)), class = "data.frame", row.names = c(NA, -3L))
isle_royale_datasets[['substrate.wolf']] <- substrate.wolf

# --- Auto-Included Historical Census Data: wolf_moose ---
wolf_moose <- structure(list(Year = 1980:2019, Wolves = c(50L, 30L, 14L, 23L, 
24L, 22L, 20L, 16L, 12L, 11L, 15L, 12L, 12L, 13L, 15L, 16L, 22L, 
24L, 14L, 25L, 29L, 19L, 17L, 19L, 29L, 30L, 30L, 21L, 23L, 24L, 
19L, 16L, 9L, 8L, 9L, 3L, 2L, 2L, 2L, 14L), Moose = c(664L, 650L, 
700L, 900L, 811L, 1062L, 1025L, 1380L, 1653L, 1397L, 1216L, 1313L, 
1600L, 1880L, 1800L, 2400L, 1200L, 500L, 700L, 750L, 850L, 900L, 
1000L, 900L, 750L, 540L, 385L, 450L, 650L, 530L, 510L, 515L, 
750L, 975L, 1050L, 1250L, 1300L, 1600L, 1500L, 2060L)), class = "data.frame", row.names = c(NA, 
-40L))
isle_royale_datasets[['wolf_moose']] <- wolf_moose

# --- Auto-Included Spatial RDS Object: isle_royale_features ---
isle_royale_features <- structure(list(habitat_type = c("Lake/Pond", "Lake/Pond", "Lake/Pond", 
"Forest", "Bog/Wetland"), id = c("041800000101", "041800000101", 
"041800000101", "041800000101", "041800000101"), objectid = c(40556L, 
40556L, 40556L, 40556L, 40556L), tnmid = c("{DB09E061-2929-491A-86D2-74A4F730D113}", 
"{DB09E061-2929-491A-86D2-74A4F730D113}", "{DB09E061-2929-491A-86D2-74A4F730D113}", 
"{DB09E061-2929-491A-86D2-74A4F730D113}", "{DB09E061-2929-491A-86D2-74A4F730D113}"
), metasourceid = c("{511D2AC8-11BA-45FC-AB98-F69D693D4C44}", 
"{511D2AC8-11BA-45FC-AB98-F69D693D4C44}", "{511D2AC8-11BA-45FC-AB98-F69D693D4C44}", 
"{511D2AC8-11BA-45FC-AB98-F69D693D4C44}", "{511D2AC8-11BA-45FC-AB98-F69D693D4C44}"
), sourcedatadesc = c("Watershed Boundary Dataset (WBD)", "Watershed Boundary Dataset (WBD)", 
"Watershed Boundary Dataset (WBD)", "Watershed Boundary Dataset (WBD)", 
"Watershed Boundary Dataset (WBD)"), sourceoriginator = c("Natural Resources and Conservation Service and U.S. Geological Survey", 
"Natural Resources and Conservation Service and U.S. Geological Survey", 
"Natural Resources and Conservation Service and U.S. Geological Survey", 
"Natural Resources and Conservation Service and U.S. Geological Survey", 
"Natural Resources and Conservation Service and U.S. Geological Survey"
), sourcefeatureid = c(NA_character_, NA_character_, NA_character_, 
NA_character_, NA_character_), loaddate = structure(c(1723704945, 
1723704945, 1723704945, 1723704945, 1723704945), class = c("POSIXct", 
"POSIXt"), tzone = ""), referencegnis_ids = c("1618306", "1618306", 
"1618306", "1618306", "1618306"), areaacres = c(424470.78, 424470.78, 
424470.78, 424470.78, 424470.78), areasqkm = c(1717.77, 1717.77, 
1717.77, 1717.77, 1717.77), states = c("CN,MI,MN,WI", "CN,MI,MN,WI", 
"CN,MI,MN,WI", "CN,MI,MN,WI", "CN,MI,MN,WI"), huc12 = c("041800000101", 
"041800000101", "041800000101", "041800000101", "041800000101"
), name = c("Isle Royale", "Isle Royale", "Isle Royale", "Isle Royale", 
"Isle Royale"), hutype = c("I", "I", "I", "I", "I"), humod = c("NM", 
"NM", "NM", "NM", "NM"), tohuc = c("041800000200", "041800000200", 
"041800000200", "041800000200", "041800000200"), noncontributingareaacres = c(NA_character_, 
NA_character_, NA_character_, NA_character_, NA_character_), 
    noncontributingareasqkm = c(NA_character_, NA_character_, 
    NA_character_, NA_character_, NA_character_), globalid = c("{DB09E061-2929-491A-86D2-74A4F730D113}", 
    "{DB09E061-2929-491A-86D2-74A4F730D113}", "{DB09E061-2929-491A-86D2-74A4F730D113}", 
    "{DB09E061-2929-491A-86D2-74A4F730D113}", "{DB09E061-2929-491A-86D2-74A4F730D113}"
    ), place_id = c(374449614L, 374449614L, 374449614L, 374449614L, 
    374449614L), licence = c("Data © OpenStreetMap contributors, ODbL 1.0. http://osm.org/copyright", 
    "Data © OpenStreetMap contributors, ODbL 1.0. http://osm.org/copyright", 
    "Data © OpenStreetMap contributors, ODbL 1.0. http://osm.org/copyright", 
    "Data © OpenStreetMap contributors, ODbL 1.0. http://osm.org/copyright", 
    "Data © OpenStreetMap contributors, ODbL 1.0. http://osm.org/copyright"
    ), osm_type = c("relation", "relation", "relation", "relation", 
    "relation"), osm_id = c(3671688L, 3671688L, 3671688L, 3671688L, 
    3671688L), lat = c("48.0073825", "48.0073825", "48.0073825", 
    "48.0073825", "48.0073825"), lon = c("-88.8289875", "-88.8289875", 
    "-88.8289875", "-88.8289875", "-88.8289875"), class = c("place", 
    "place", "place", "place", "place"), type = c("island", "island", 
    "island", "island", "island"), place_rank = c(17L, 17L, 17L, 
    17L, 17L), importance = c(0.377565444769677, 0.377565444769677, 
    0.377565444769677, 0.377565444769677, 0.377565444769677), 
    addresstype = c("island", "island", "island", "island", "island"
    ), name.1 = c("Isle Royale", "Isle Royale", "Isle Royale", 
    "Isle Royale", "Isle Royale"), display_name = c("Isle Royale, Keweenaw County, Michigan, United States", 
    "Isle Royale, Keweenaw County, Michigan, United States", 
    "Isle Royale, Keweenaw County, Michigan, United States", 
    "Isle Royale, Keweenaw County, Michigan, United States", 
    "Isle Royale, Keweenaw County, Michigan, United States"), 
    geometry = structure(list(structure(list(list(structure(c(-88.63, 
    -88.606, -88.606, -88.63, -88.63, 48.105, 48.105, 48.121, 
    48.121, 48.105), dim = c(5L, 2L)))), class = c("XY", "MULTIPOLYGON", 
    "sfg")), structure(list(list(structure(c(-88.943, -88.943, 
    -88.979, -88.979, -88.9775138036827, -88.9765932024271, -88.9759006689158, 
    -88.9747436019369, -88.974262801805, -88.9735376682912, -88.9719976678786, 
    -88.9714760677375, -88.9695646005501, -88.9661255985688, 
    -88.963892665655, -88.9624908652599, -88.960795663728, -88.9598177978466, 
    -88.9592390643652, -88.9592331684753, -88.9591942, -88.9588852, 
    -88.9583678, -88.9580081241565, -88.957601063993, -88.9572914639086, 
    -88.9556614644776, -88.9538438618706, -88.95197739572, -88.9511948621786, 
    -88.9502871751257, -88.9502561, -88.9501555, -88.9499397, 
    -88.9500551864452, -88.9499234618492, -88.9487743948966, 
    -88.9479796912414, -88.9476445, -88.9475116225945, -88.945332686448, 
    -88.9451531, -88.94467, -88.9441232, -88.9438542189297, -88.9433622602565, 
    -88.943, 47.8826923305099, 47.886, 47.886, 47.8726972028773, 
    47.873018697047, 47.8734740971732, 47.8737046305859, 47.8739902307048, 
    47.8740944974189, 47.8743744308407, 47.8747752310018, 47.8749014977217, 
    47.8753418979137, 47.87611583159, 47.8765386318016, 47.8767746319303, 
    47.8769778320746, 47.8772686321819, 47.877466232249, 47.8774693511414, 
    47.8775051, 47.8777288, 47.8779821, 47.8781173779748, 47.878332699148, 
    47.8784040991791, 47.8785906993166, 47.8788212994731, 47.879139499645, 
    47.8793534997283, 47.87964330869, 47.8796975, 47.879811, 
    47.8798274, 47.8797173770424, 47.8797594332051, 47.8802036333453, 
    47.8805232843974, 47.8806678, 47.8807115497066, 47.8815879124797, 
    47.8816809, 47.8819868, 47.8821825, 47.8822554279141, 47.8825617007096, 
    47.8826923305099), dim = c(47L, 2L)))), class = c("XY", "MULTIPOLYGON", 
    "sfg")), structure(list(list(structure(c(-88.4931645, -88.4933202160596, 
    -88.4880637674483, -88.4880643, -88.4880388, -88.4879932, 
    -88.4880106, -88.4878604, -88.4878685, -88.4878631, -88.4878162, 
    -88.4877704, -88.4877142, -88.4877236, -88.4876955, -88.4876154, 
    -88.4875788, -88.487552, -88.4875227, -88.4873055, -88.4871799, 
    -88.4870604, -88.4868974, -88.4868157, -88.4867245, -88.4866313323734, 
    -88.4861070935189, -88.4858204924077, -88.4853698922839, 
    -88.4849602921596, -88.4847881587637, -88.484583157636, -88.4844475872462, 
    -88.4844393, -88.4840852, -88.4839844611778, -88.4837059583434, 
    -88.4835995583013, -88.4835584916036, -88.4836074916037, 
    -88.4836653662082, -88.4836621, -88.483876, -88.4840974, 
    -88.4843776, -88.4846833, -88.4849167, -88.4851012, -88.4852937033422, 
    -88.483081756113, -88.4830001, -88.4829280461775, -88.4827795579647, 
    -88.4826486912859, -88.482697958002, -88.4826080913158, -88.4824522912651, 
    -88.4822130077488, -88.4820599941843, -88.4819643731899, 
    -88.4819438215351, -88.4819406957911, -88.4820376, -88.4819363111558, 
    -88.4819360911102, -88.4819193538607, -88.4818452, -88.4816127, 
    -88.4815991545039, -88.4814036920129, -88.480936957545, -88.4806747574821, 
    -88.4803553573974, -88.4800685573278, -88.48, -88.48, -88.4808247, 
    -88.4814489, -88.4821869, -88.4836221, -88.4849305, -88.485276, 
    -88.4859263, -88.4862021, -88.4862712, -88.4865497, -88.4868385, 
    -88.4870155, -88.4872355, -88.4875748, -88.4879382, -88.4883191, 
    -88.4886302, -88.4889346, -88.4892337, -88.4894657, -88.4896655, 
    -88.4897889, -88.4898131, -88.4898238, -88.4897836, -88.4896441, 
    -88.4894899, -88.4894845, -88.4895301, -88.4895971, -88.4897475, 
    -88.4897948945572, -88.48982665944, -88.489862, -88.4899083, 
    -88.489978, -88.4900303, -88.4900048, -88.4900157598636, 
    -88.49022129389, -88.490243873488, -88.4902718, -88.4902796195098, 
    -88.4901801594747, -88.4901822267746, -88.4901734, -88.4901913, 
    -88.4902961, -88.4906217, -88.4907961, -88.490953, -88.4910844, 
    -88.4912298, -88.4912699663266, -88.4913431597606, -88.4913310469136, 
    -88.491291, -88.4911783, -88.49113, -88.4911019, -88.4911689, 
    -88.4913661, -88.4915538, -88.4917385487709, -88.4917765608072, 
    -88.4923744932598, -88.4927962590975, -88.4929165, -88.4931645, 
    48.145085, 48.145, 48.145, 48.1450143, 48.1450832, 48.1451494, 
    48.1451941, 48.1452693, 48.1453131, 48.145357, 48.1453749, 
    48.1453813, 48.1453829, 48.1454304, 48.1454527, 48.1454784, 
    48.145476, 48.145502, 48.1455235, 48.1455832, 48.1456408, 
    48.145714, 48.1457783, 48.1457847, 48.1457883, 48.1457922801428, 
    48.1460907017624, 48.1462169017993, 48.1463213018445, 48.1463379018747, 
    48.1462777018781, 48.1461297018716, 48.1460103729073, 48.1460093, 
    48.1458733, 48.1458244721321, 48.1457187685413, 48.1456585685402, 
    48.1455379018597, 48.1454391685093, 48.1454003868823, 48.1453437, 
    48.1452881, 48.1452582, 48.145272, 48.1452935, 48.1452505, 
    48.1452167, 48.145, 48.145, 48.1450321, 48.1450272742566, 
    48.1451159685211, 48.1453025018891, 48.1455273019169, 48.1455821019305, 
    48.1455657686056, 48.1454194967365, 48.145400911376, 48.1454104792073, 
    48.1454202710932, 48.1454924994098, 48.1455467, 48.1455938172908, 
    48.1455989019786, 48.1456017054256, 48.1456362, 48.1456636, 
    48.1456696697607, 48.1457691020384, 48.146109168784, 48.1462299688185, 
    48.1463233021865, 48.1464495022235, 48.1464965100273, 48.1506344383766, 
    48.1502282, 48.1499688, 48.1496873, 48.1490216, 48.1481903, 
    48.147974, 48.1476924, 48.1476278, 48.1476298, 48.1475346, 
    48.1474115, 48.1473032, 48.1471717, 48.1470384, 48.1469301, 
    48.1468111, 48.146735, 48.1466885, 48.146633, 48.1466008, 
    48.1466008, 48.1466321, 48.1466858, 48.1467494, 48.1468218, 
    48.1468684, 48.1469534, 48.1470017, 48.1470437, 48.1470455, 
    48.1470344, 48.1470198059496, 48.1470015278956, 48.1469685, 
    48.1469086, 48.1468397, 48.146863, 48.1469274, 48.1469634951192, 
    48.1469989682741, 48.1469882173427, 48.1469629, 48.1469204236519, 
    48.1468181015853, 48.1468134840663, 48.1468093, 48.1467073, 
    48.1466612, 48.146565, 48.1464702, 48.1463735, 48.1463449, 
    48.1463318, 48.1463371209873, 48.1463295681052, 48.1462972580214, 
    48.1462778, 48.1461972, 48.1460594, 48.1458697, 48.1457427, 
    48.1456049, 48.1455324, 48.145498625033, 48.1454793679581, 
    48.1453201012287, 48.145231414186, 48.1451959, 48.145085), dim = c(145L, 
    2L))), list(structure(c(-88.48, -88.48, -88.5, -88.5, -88.4995530966614, 
    -88.4992828965952, -88.4991353632296, -88.4988241621158, 
    -88.4978578962542, -88.4970552950191, -88.4966703626424, 
    -88.4961707635611, -88.4957039624066, -88.4953681623151, 
    -88.4950240955677, -88.4949340955515, -88.4949023936406, 
    -88.4950259, -88.4958867, -88.4958892996846, -88.4958934959405, 
    -88.4959345626365, -88.4959345735406, -88.495952, -88.495934652055, 
    -88.4959346959925, -88.4958924143864, -88.4958568, -88.4956595174421, 
    -88.4955990959278, -88.4942066955917, -88.4939282965622, 
    -88.4936905621144, -88.4935757620763, -88.4934609620274, 
    -88.4933134963492, -88.4932233619505, -88.4931496942277, 
    -88.4930676952448, -88.4928298941028, -88.4927069617738, 
    -88.4926579617795, -88.492502361743, -88.4923466950366, -88.4917894948673, 
    -88.491371560357, -88.4910028946195, -88.4904129611235, -88.489601960919, 
    -88.4880702938715, -88.4877671604668, -88.4871856947, -88.486505760167, 
    -88.4859897610823, -88.4856375599624, -88.4853590921837, 
    -88.4851131598225, -88.4848346930846, -88.4846217597037, 
    -88.4843187596332, -88.4837124928213, -88.4829916926465, 
    -88.4822133601554, -88.4818610934022, -88.4814678933171, 
    -88.4810583578086, -88.4807446062768, -88.4806134, -88.4805403657046, 
    -88.4804930920344, -88.4801162919402, -88.48, 48.1548285529033, 
    48.157, 48.157, 48.1459812549131, 48.1462157008631, 48.1463309675641, 
    48.1464187675863, 48.1465779676295, 48.1469897677522, 48.1473521011904, 
    48.1475771012477, 48.1477857679773, 48.1479943680379, 48.1480767680722, 
    48.1482469014525, 48.1483237681359, 48.148451742789, 48.1485343, 
    48.1489177, 48.1489246325065, 48.1489265014871, 48.1490361014994, 
    48.1490482084308, 48.149102, 48.1491353839639, 48.1491841681865, 
    48.1492166649145, 48.1492852, 48.1493956634536, 48.1494421015784, 
    48.1500679017598, 48.1501667017924, 48.1501723018094, 48.1501559018149, 
    48.1500681684773, 48.1500189684805, 48.1500463684905, 48.1501013018365, 
    48.1501067685095, 48.1499313685014, 48.1499369685106, 48.1500741018662, 
    48.1501509685541, 48.1502059019056, 48.1502281019467, 48.1501899019699, 
    48.1502009686633, 48.150332902055, 48.1506403021528, 48.1512551690088, 
    48.1514033690499, 48.1516559024578, 48.1520015692185, 48.152221169284, 
    48.1524243026695, 48.1525285693695, 48.1525725027257, 48.152671369425, 
    48.1527921027895, 48.1529457028314, 48.1532257029114, 48.1535439030045, 
    48.1538185030955, 48.1539665698066, 48.1542081032001, 48.1544385032598, 
    48.1545329735159, 48.1545999, 48.1545944694915, 48.1546087033219, 
    48.1547569700347, 48.1548285529033), dim = c(72L, 2L)))), class = c("XY", 
    "MULTIPOLYGON", "sfg")), structure(list(list(structure(c(-89.161838, 
    -89.1620425960668, -89.121, -89.121, -89.171, -89.171, -89.1708659345758, 
    -89.1704663344708, -89.1699990252447, -89.1697737, -89.1693323, 
    -89.168886, -89.1687960331566, -89.1686144674725, -89.1683369341033, 
    -89.1680920674276, -89.1679370674068, -89.1676596673484, 
    -89.1670398671867, -89.166419867029, -89.1662240669873, -89.1661261336465, 
    -89.1661097336774, -89.166150467055, -89.1661757741975, -89.1661984, 
    -89.1663259, -89.1663848, -89.1663844508349, -89.1664274672236, 
    -89.166329333958, -89.1661333339463, -89.165872334938, -89.1656030661272, 
    -89.1647628659153, -89.1647576101403, -89.1646781, -89.1642023, 
    -89.1636825, -89.1631087, -89.162628, -89.1621376, -89.1618434, 
    -89.1615491, -89.1610341, -89.1605094, -89.1601661, -89.1599405, 
    -89.1595923, -89.1592195, -89.1589057, -89.1585329, -89.1581308, 
    -89.1575521, -89.1572302, -89.1568164, -89.1565663, -89.1562279, 
    -89.1559287, -89.1550999, -89.1546921037537, -89.1545270637028, 
    -89.153238263334, -89.1529689299289, -89.1527242632164, -89.1526263298472, 
    -89.1525692631513, -89.1525612631296, -89.152691929813, -89.1528342359029, 
    -89.1526317, -89.1525212, -89.1524614, -89.1524172, -89.1524779, 
    -89.1527348, -89.1530395, -89.1533351527743, -89.1541684635419, 
    -89.1548943304196, -89.1560280641033, -89.1567590496996, 
    -89.1570077, -89.157351, -89.157454, -89.1573804, -89.1573412, 
    -89.1571597, -89.1569341, -89.1565957, -89.1562818, -89.1562279, 
    -89.1561151, -89.1561445, -89.1563211, -89.1566153, -89.1568017, 
    -89.1568605, -89.1569243, -89.1571162, -89.1571234, -89.1571319, 
    -89.1571799, -89.1571765, -89.1572354, -89.157281, -89.15731, 
    -89.1573308, -89.1574435, -89.157551, -89.1576458, -89.1577747, 
    -89.1578502, -89.1579073, -89.1580365, -89.1581284, -89.1581527, 
    -89.158222, -89.1583451, -89.1584804, -89.1586354, -89.1587418, 
    -89.1587937, -89.1589099, -89.1590863, -89.1592955, -89.1595019, 
    -89.1596388, -89.1597481, -89.1599204, -89.1600136, -89.1601706, 
    -89.1602907, -89.1604918, -89.1608106, -89.1610828, -89.161534, 
    -89.161838, 47.9080693, 47.908, 47.908, 47.938, 47.938, 47.9118585815331, 
    47.9118870891401, 47.9120020891835, 47.9123391492649, 47.9126201, 
    47.9130047, 47.9133466, 47.91336122275, 47.9135534895254, 
    47.9138770229226, 47.9143100896659, 47.9144854897008, 47.9146608897442, 
    47.914847223146, 47.9150608898848, 47.915181489915, 47.9153294899422, 
    47.9155652233092, 47.9157736233352, 47.9158213291009, 47.9158316, 
    47.9160157, 47.9162227, 47.9162255024711, 47.9163218900585, 
    47.9169634234872, 47.9172812902113, 47.9174786902566, 47.9176212236281, 
    47.9179226237277, 47.9179232778767, 47.9179549, 47.9180568, 
    47.9180798, 47.9180601, 47.9180305, 47.9180503, 47.9179615, 
    47.9177807, 47.9175934, 47.9173896, 47.9173337, 47.9172318, 
    47.9171825, 47.9172121, 47.9172154, 47.9172581, 47.9174093, 
    47.9175375, 47.9175647, 47.9175244, 47.9174455, 47.9173764, 
    47.9172976, 47.9171957, 47.9171745115341, 47.9171800243304, 
    47.91735509111, 47.9174262911384, 47.9176180911817, 47.9175796911832, 
    47.9175028911765, 47.9173768911597, 47.9172232911295, 47.9171656229079, 
    47.9172064, 47.9172707, 47.9173271, 47.9172647, 47.9171293, 
    47.917028, 47.9170285, 47.9170071743006, 47.9168454909756, 
    47.9167690242483, 47.9167856241725, 47.9169109504792, 47.9169229, 
    47.9168966, 47.9167815, 47.9165711, 47.9164035, 47.9162819, 
    47.9160814, 47.915848, 47.915493, 47.9152268, 47.914977, 
    47.9146976, 47.9144938, 47.9142275, 47.9139119, 47.9135832, 
    47.9133696, 47.9130547, 47.9130414, 47.9130256, 47.9129109, 
    47.912876, 47.9128563, 47.912809, 47.9126982, 47.9126099, 
    47.9124332, 47.912274, 47.9121853, 47.9119939, 47.9118986, 
    47.9118319, 47.9116801, 47.9116418, 47.9115616, 47.9114581, 
    47.9113129, 47.9111292, 47.9109897, 47.9108692, 47.9107622, 
    47.9106454, 47.9104584, 47.9102735, 47.9100724, 47.9098539, 
    47.9096377, 47.9093431, 47.9090243, 47.9086906, 47.9084753, 
    47.908329, 47.9081958, 47.9081498, 47.9081301, 47.9080693
    ), dim = c(138L, 2L)))), class = c("XY", "MULTIPOLYGON", 
    "sfg")), structure(list(list(structure(c(-88.77, -88.73, 
    -88.73, -88.77, -88.77, 48.008, 48.008, 48.032, 48.032, 48.008
    ), dim = c(5L, 2L)))), class = c("XY", "MULTIPOLYGON", "sfg"
    ))), class = c("sfc_MULTIPOLYGON", "sfc"), precision = 0, bbox = structure(c(xmin = -89.171, 
    ymin = 47.8726972028773, xmax = -88.48, ymax = 48.157), class = "bbox"), crs = structure(list(
        input = "EPSG:4326", wkt = "GEOGCRS[\"WGS 84\",\n    ENSEMBLE[\"World Geodetic System 1984 ensemble\",\n        MEMBER[\"World Geodetic System 1984 (Transit)\"],\n        MEMBER[\"World Geodetic System 1984 (G730)\"],\n        MEMBER[\"World Geodetic System 1984 (G873)\"],\n        MEMBER[\"World Geodetic System 1984 (G1150)\"],\n        MEMBER[\"World Geodetic System 1984 (G1674)\"],\n        MEMBER[\"World Geodetic System 1984 (G1762)\"],\n        MEMBER[\"World Geodetic System 1984 (G2139)\"],\n        MEMBER[\"World Geodetic System 1984 (G2296)\"],\n        ELLIPSOID[\"WGS 84\",6378137,298.257223563,\n            LENGTHUNIT[\"metre\",1]],\n        ENSEMBLEACCURACY[2.0]],\n    PRIMEM[\"Greenwich\",0,\n        ANGLEUNIT[\"degree\",0.0174532925199433]],\n    CS[ellipsoidal,2],\n        AXIS[\"geodetic latitude (Lat)\",north,\n            ORDER[1],\n            ANGLEUNIT[\"degree\",0.0174532925199433]],\n        AXIS[\"geodetic longitude (Lon)\",east,\n            ORDER[2],\n            ANGLEUNIT[\"degree\",0.0174532925199433]],\n    USAGE[\n        SCOPE[\"Horizontal component of 3D system.\"],\n        AREA[\"World.\"],\n        BBOX[-90,-180,90,180]],\n    ID[\"EPSG\",4326]]"), class = "crs"), n_empty = 0L)), row.names = c(NA, 
5L), class = c("sf", "data.frame"), sf_column = "geometry", agr = structure(c(habitat_type = NA_integer_, 
id = NA_integer_, objectid = NA_integer_, tnmid = NA_integer_, 
metasourceid = NA_integer_, sourcedatadesc = NA_integer_, sourceoriginator = NA_integer_, 
sourcefeatureid = NA_integer_, loaddate = NA_integer_, referencegnis_ids = NA_integer_, 
areaacres = NA_integer_, areasqkm = NA_integer_, states = NA_integer_, 
huc12 = NA_integer_, name = NA_integer_, hutype = NA_integer_, 
humod = NA_integer_, tohuc = NA_integer_, noncontributingareaacres = NA_integer_, 
noncontributingareasqkm = NA_integer_, globalid = NA_integer_, 
place_id = NA_integer_, licence = NA_integer_, osm_type = NA_integer_, 
osm_id = NA_integer_, lat = NA_integer_, lon = NA_integer_, class = NA_integer_, 
type = NA_integer_, place_rank = NA_integer_, importance = NA_integer_, 
addresstype = NA_integer_, name.1 = NA_integer_, display_name = NA_integer_
), class = "factor", levels = c("constant", "aggregate", "identity"
)))
isle_royale_datasets[['isle_royale_features']] <- isle_royale_features

# --- Auto-Included Spatial RDS Object: isle_royale_landmarks ---
isle_royale_landmarks <- structure(list(name = c("Washington Creek (Windigo)", "Ojibway Lake", 
"Feldtmann Lake", "Hidden Lake (Tobin Harbor)"), location = c("Windigo", 
"Ojibway", "Feldtmann", "Tobin Harbor"), description = c("Feeding area along stream & forest cover", 
"Aquatic vegetation feeding lake", "Major southwest inland lake habitat", 
"Aquatic plant feeding area near Tobin Harbor"), geometry = structure(list(
    structure(c(-89.146, 47.923), class = c("XY", "POINT", "sfg"
    )), structure(c(-88.618, 48.113), class = c("XY", "POINT", 
    "sfg")), structure(c(-88.961, 47.876), class = c("XY", "POINT", 
    "sfg")), structure(c(-88.49, 48.151), class = c("XY", "POINT", 
    "sfg"))), n_empty = 0L, crs = structure(list(input = "EPSG:4326", 
    wkt = "GEOGCRS[\"WGS 84\",\n    ENSEMBLE[\"World Geodetic System 1984 ensemble\",\n        MEMBER[\"World Geodetic System 1984 (Transit)\"],\n        MEMBER[\"World Geodetic System 1984 (G730)\"],\n        MEMBER[\"World Geodetic System 1984 (G873)\"],\n        MEMBER[\"World Geodetic System 1984 (G1150)\"],\n        MEMBER[\"World Geodetic System 1984 (G1674)\"],\n        MEMBER[\"World Geodetic System 1984 (G1762)\"],\n        MEMBER[\"World Geodetic System 1984 (G2139)\"],\n        MEMBER[\"World Geodetic System 1984 (G2296)\"],\n        ELLIPSOID[\"WGS 84\",6378137,298.257223563,\n            LENGTHUNIT[\"metre\",1]],\n        ENSEMBLEACCURACY[2.0]],\n    PRIMEM[\"Greenwich\",0,\n        ANGLEUNIT[\"degree\",0.0174532925199433]],\n    CS[ellipsoidal,2],\n        AXIS[\"geodetic latitude (Lat)\",north,\n            ORDER[1],\n            ANGLEUNIT[\"degree\",0.0174532925199433]],\n        AXIS[\"geodetic longitude (Lon)\",east,\n            ORDER[2],\n            ANGLEUNIT[\"degree\",0.0174532925199433]],\n    USAGE[\n        SCOPE[\"Horizontal component of 3D system.\"],\n        AREA[\"World.\"],\n        BBOX[-90,-180,90,180]],\n    ID[\"EPSG\",4326]]"), class = "crs"), class = c("sfc_POINT", 
"sfc"), precision = 0, bbox = structure(c(xmin = -89.146, ymin = 47.876, 
xmax = -88.49, ymax = 48.151), class = "bbox"))), row.names = c(NA, 
4L), sf_column = "geometry", agr = structure(c(name = NA_integer_, 
location = NA_integer_, description = NA_integer_), class = "factor", levels = c("constant", 
"aggregate", "identity")), class = c("sf", "data.frame"))
isle_royale_datasets[['isle_royale_landmarks']] <- isle_royale_landmarks

# --- Auto-Included Spatial RDS Object: isle_royale_layer ---
isle_royale_layer <- structure(list(id = "041800000101", objectid = 40556L, tnmid = "{DB09E061-2929-491A-86D2-74A4F730D113}", 
    metasourceid = "{511D2AC8-11BA-45FC-AB98-F69D693D4C44}", 
    sourcedatadesc = "Watershed Boundary Dataset (WBD)", sourceoriginator = "Natural Resources and Conservation Service and U.S. Geological Survey", 
    sourcefeatureid = NA_character_, loaddate = structure(1723704945, class = c("POSIXct", 
    "POSIXt"), tzone = ""), referencegnis_ids = "1618306", areaacres = 424470.78, 
    areasqkm = 1717.77, states = "CN,MI,MN,WI", huc12 = "041800000101", 
    name = "Isle Royale", hutype = "I", humod = "NM", tohuc = "041800000200", 
    noncontributingareaacres = NA_character_, noncontributingareasqkm = NA_character_, 
    globalid = "{DB09E061-2929-491A-86D2-74A4F730D113}", place_id = 374424026L, 
    licence = "Data © OpenStreetMap contributors, ODbL 1.0. http://osm.org/copyright", 
    osm_type = "relation", osm_id = 3671688L, lat = "48.0073825", 
    lon = "-88.8289875", class = "place", type = "island", place_rank = 17L, 
    importance = 0.377565444769677, addresstype = "island", name.1 = "Isle Royale", 
    display_name = "Isle Royale, Keweenaw County, Michigan, United States", 
    geometry = structure(list(structure(list(list(structure(c(-88.6826186579642, 
    -88.6827079489419, -88.6827407489319, -88.6827406662774, 
    -88.6825755, -88.682362, -88.682279, -88.6822827, -88.682498, 
    -88.6826186579642, 48.1174650291646, 48.1174141510419, 48.1172826843549, 
    48.1170210035476, 48.117125, 48.1172428, 48.1174054, 48.1174916, 
    48.1174975, 48.1174650291646), dim = c(10L, 2L))), list(structure(c(-89.2354705868803, 
    -89.2354248787861, -89.235383745376, -89.2352291445619, -89.2351971, 
    -89.235001, -89.234768, -89.2343928, -89.233846, -89.233331, 
    -89.2327254, -89.2321368, -89.2320069, -89.2313914, -89.2312344, 
    -89.2308617, -89.2307244, -89.2300133, -89.2296086, -89.229204, 
    -89.2287038, -89.2282305, -89.2276641, -89.2272815, -89.2268745, 
    -89.2262516, -89.2258397, -89.2253909, -89.2246773, -89.2239613, 
    -89.2233286, -89.2226813, -89.221514, -89.2211854, -89.2204596, 
    -89.2194714, -89.218976, -89.218596, -89.2182968, -89.2175366, 
    -89.2167078, -89.2161438, -89.2158005, -89.2154057, -89.2150599, 
    -89.2146553, -89.2143169, -89.2137039, -89.2132993, -89.2130933, 
    -89.2128334, -89.2124361, -89.2122767, -89.2118231, -89.2114626, 
    -89.2108741, -89.2102046, -89.2097019, -89.2088093, -89.2083116, 
    -89.207674, -89.2073626, -89.2070658, -89.2066073, -89.2059722, 
    -89.2053935, -89.2049202, -89.2041625, -89.2032331, -89.2027353, 
    -89.2022032, -89.2015558, -89.2009501, -89.2000723, -89.1993413, 
    -89.1987381, -89.1980883, -89.1977938469372, -89.1977886674548, 
    -89.1974790662832, -89.1970471327467, -89.1970070890447, 
    -89.196536, -89.1963420664254, -89.1955726653642, -89.1955719138143, 
    -89.1955657, -89.1951015, -89.1945743, -89.1942114, -89.1939441, 
    -89.1937251589567, -89.1934547310387, -89.1924853305817, 
    -89.1922084637419, -89.1920047302938, -89.1918418645481, 
    -89.191743929989, -89.1917766632891, -89.1918172632799, -89.1920614641916, 
    -89.1920451287183, -89.1919692103327, -89.191926, -89.1918997, 
    -89.1918663909882, -89.1918496629194, -89.191711129497, -89.191800729492, 
    -89.1921915295443, -89.1923952628918, -89.1925580618501, 
    -89.1925741294419, -89.1926555293727, -89.1925740636637, 
    -89.1925323305745, -89.1924949, -89.19236, -89.1921736, -89.1920044, 
    -89.19159, -89.1912467, -89.1910383, -89.1906214, -89.1903345, 
    -89.1900255, -89.1897828, -89.1896969, -89.1896626, -89.1896724, 
    -89.1896258, -89.1896626, -89.1897558, -89.1896283, -89.189437, 
    -89.1892482, -89.1890373, -89.1886842, -89.188439, -89.1882109, 
    -89.1882747, -89.1882183, -89.1879951, -89.1879338, -89.187951, 
    -89.1879118, -89.1878186, -89.1876641, -89.1875758, -89.1876151, 
    -89.1875636, -89.1874311, -89.1871344, -89.1867617, -89.1863595, 
    -89.1861241, -89.1859231, -89.1856214, -89.1853615, -89.1850746, 
    -89.185001, -89.1848392, -89.1846234, -89.1845596, -89.1844518, 
    -89.1840643, -89.1836254, -89.183439, -89.1833949, -89.1834267, 
    -89.1833777, -89.1830933, -89.1828554, -89.1825611, -89.1821026, 
    -89.18172, -89.1816023, -89.1814601, -89.1812296, -89.1807632169457, 
    -89.180628525326, -89.1800096584414, -89.1800089966587, -89.1798343, 
    -89.179518, -89.1789785, -89.1786671, -89.1783557, -89.1779658, 
    -89.1776028, -89.1771369, -89.1766097, -89.1758348, -89.1751531, 
    -89.1744837, -89.1738903, -89.173238, -89.1726838, -89.1721762, 
    -89.1718868, -89.1718574857061, -89.1718275219251, -89.1712658539698, 
    -89.1707856548036, -89.1706466405406, -89.1700477, -89.1698834, 
    -89.1695548, -89.1694077, -89.1692777, -89.1690325, -89.1687186, 
    -89.16839, -89.1679879, -89.1675489, -89.1669604, -89.1656657, 
    -89.1647093, -89.1641821, -89.1638952, -89.1638094, -89.1636721, 
    -89.1634955, -89.1631571, -89.1628629, -89.1626937, -89.1625097, 
    -89.1623577, -89.1621395, -89.1617962, -89.1616907, -89.1616539, 
    -89.1614847, -89.1612493, -89.1611537, -89.1610605, -89.1610188, 
    -89.1609134, -89.1608055, -89.1607589, -89.1606142, -89.1604597, 
    -89.1603641, -89.1601606, -89.1599301, -89.1597143, -89.1593612, 
    -89.1592949, -89.1592655, -89.1593146, -89.159241, -89.1591208, 
    -89.1589345, -89.158547, -89.1582013, -89.1580432535087, 
    -89.1579469172491, -89.1578979172607, -89.1577595161898, 
    -89.1576919429244, -89.1576544, -89.1574092, -89.1568992, 
    -89.1562003, -89.1551974, -89.1543759, -89.1539713, -89.1534294, 
    -89.1529904, -89.1525466, -89.1520341, -89.1513818, -89.1510606, 
    -89.1506731, -89.1502881, -89.149832, -89.1495942, -89.1494201, 
    -89.149143, -89.1488708, -89.1486035, -89.1479537, -89.1471199, 
    -89.1467128, -89.1465314, -89.1459282, -89.1452244, -89.1445697, 
    -89.1439689, -89.1433264, -89.1428679, -89.1425098, -89.1423921, 
    -89.1421077, -89.1419164, -89.1417963, -89.1415658, -89.1413917, 
    -89.1411857, -89.1411023, -89.1408963, -89.1406585, -89.1405457, 
    -89.140325, -89.1401214, -89.1399449, -89.1396972, -89.1396384, 
    -89.139501, -89.1393441, -89.1392411, -89.1391994, -89.1392117, 
    -89.1392926, -89.1392166, -89.1390817, -89.1389587034786, 
    -89.138948913002, -89.1389273642595, -89.1389395, -89.1389591, 
    -89.1389027, -89.1387875, -89.1386943, -89.138633, -89.1385128, 
    -89.1383779, -89.1382627, -89.138069, -89.1378998, -89.1377968, 
    -89.1376987, -89.1375614, -89.1375221, -89.1375025, -89.1374142, 
    -89.1373333, -89.1372622, -89.1372009, -89.1371543, -89.1369753, 
    -89.1367889, -89.1368306, -89.1368036, -89.136659, -89.1364628, 
    -89.1362544, -89.1360312, -89.1359675, -89.1358743, -89.1358743, 
    -89.135683, -89.1352735, -89.1352931, -89.1352367, -89.1348321, 
    -89.1348713, -89.1348419, -89.1347046, -89.13404, -89.1337556, 
    -89.1334981, -89.1333216, -89.1331916, -89.1329488, -89.1326031, 
    -89.1323873, -89.13212, -89.1319998, -89.1319042, -89.1318208, 
    -89.1316884, -89.1314996, -89.1313844, -89.1312716, -89.1311391, 
    -89.1310263, -89.1309062, -89.130916, -89.1307909, -89.1306634, 
    -89.1304721, -89.130477, -89.1303348, -89.130097, -89.1295845, 
    -89.1295109, -89.1294545, -89.129251, -89.1291161, -89.1288979, 
    -89.1287237, -89.1284516, -89.1282309, -89.1277257, -89.1273996, 
    -89.1272328, -89.1269925, -89.1263402, -89.1260288, -89.1252956, 
    -89.1240131, -89.1232873, -89.1221961, -89.1218062, -89.1214531, 
    -89.121214, -89.1210841, -89.1210007, -89.1210914, -89.1210949180037, 
    -89.1209274602443, -89.1206329, -89.1204588, -89.1202307, 
    -89.1200321, -89.1199659, -89.1196961, -89.1195122, -89.119245, 
    -89.1192354474582, -89.119431506055, -89.1194463522383, -89.119473, 
    -89.1196422, -89.119625, -89.1196397, -89.1195932, -89.119755, 
    -89.1197231, -89.1196618, -89.1195417, -89.1194068, -89.1192376, 
    -89.119088, -89.1190046, -89.1190316, -89.1191591, -89.1191787, 
    -89.119343, -89.1193896, -89.1193823, -89.1192597, -89.1191297, 
    -89.1189899, -89.118909, -89.1189164, -89.1188281, -89.11873, 
    -89.1185068, -89.1185338, -89.1182347, -89.1180655, -89.1178276, 
    -89.1175579, -89.1174402, -89.1173838, -89.1175603, -89.1174892, 
    -89.1175382, -89.1173494, -89.1171287, -89.1167952, -89.1164912, 
    -89.1160547, -89.1157751, -89.1155765, -89.1152283, -89.1144902, 
    -89.1138968, -89.1135314, -89.1133279, -89.1133132, -89.113041, 
    -89.1129036, -89.1127884, -89.1127271, -89.1126167, -89.1125898, 
    -89.1123617, -89.1122489, -89.1121435, -89.1119105, -89.1118443, 
    -89.1117928, -89.1115697, -89.1113539, -89.1113146, -89.111322, 
    -89.1110621, -89.1108487, -89.1106378, -89.1103632, -89.1103169, 
    -89.1101844, -89.1100226, -89.1099221, -89.1097896, -89.1095616, 
    -89.1093483, -89.1090785, -89.1087279, -89.1081908, -89.1072051, 
    -89.1067171, -89.1059667, -89.1054689, -89.1048191, -89.1042232, 
    -89.1036715, -89.1031271, -89.102595, -89.1020776, -89.1016681, 
    -89.101391, -89.1011457, -89.1009569, -89.1006798, -89.1004297, 
    -89.1001698, -89.0997946, -89.0993679, -89.0989069, -89.0986028, 
    -89.0982301, -89.0978623, -89.0976146, -89.097161, -89.0971095, 
    -89.0972321, -89.0972027, -89.0970727, -89.0967416, -89.096516, 
    -89.0965774, -89.0966117, -89.0965847, -89.0964744, -89.0962193, 
    -89.0958834, -89.0956848, -89.0955695, -89.0952703, -89.0950962, 
    -89.0952679, -89.0952409, -89.0951477, -89.0949638, -89.0944587, 
    -89.093701, -89.092671, -89.092416, -89.0921414, -89.0919231, 
    -89.0919071586303, -89.0916000328528, -89.0914524172272, 
    -89.0914278, -89.0913542, -89.0912537, -89.0911433, -89.0910428, 
    -89.0907069, -89.0903317, -89.0899835, -89.0898756, -89.0898437, 
    -89.0896769, -89.0894832, -89.0892699, -89.0891277, -89.0889413, 
    -89.0889588823438, -89.0886337983665, -89.088625, -89.0884803, 
    -89.0883013, -89.0876613, -89.0873106, -89.0872763, -89.0874136, 
    -89.0874038, -89.0873204, -89.0871806, -89.0872321, -89.0870801, 
    -89.0868864, -89.0868251, -89.0868888, -89.0868815, -89.0867662, 
    -89.0866044, -89.0863959, -89.0863175, -89.0861826, -89.0858859, 
    -89.0856186, -89.085241, -89.0847775, -89.0843288, -89.0838678, 
    -89.0833724, -89.0829825, -89.0826515, -89.0823891, -89.0821243, 
    -89.0816534, -89.0812807, -89.0812495546557, -89.081176429219, 
    -89.0807610968115, -89.0804641749576, -89.0802312, -89.079959, 
    -89.0796672, -89.0791964, -89.0788114, -89.0784043, -89.0781518, 
    -89.0781419723465, -89.0779918294057, -89.0777800959991, 
    -89.0775877565536, -89.0775878, -89.0776343, -89.0775828, 
    -89.0775019, -89.0774063, -89.0774038, -89.077291, -89.0771831, 
    -89.0772003, -89.0772935, -89.0772618923628, -89.0769412280466, 
    -89.0764686956216, -89.0757032287475, -89.0754180953466, 
    -89.0753228256263, -89.0753734, -89.0752214, -89.0749604298122, 
    -89.0748154285407, -89.0741882283673, -89.0738462272332, 
    -89.0736344292665, -89.0732229, -89.0732229, -89.073191, 
    -89.0730194, -89.0730365, -89.0729605, -89.0728036, -89.0724627, 
    -89.0719218888718, -89.071801694428, -89.0713294265805, -89.0710920039087, 
    -89.0710895, -89.0710779968785, -89.07095408144, -89.0709056, 
    -89.0707756, -89.0706622268491, -89.0706568633484, -89.0706285, 
    -89.0704593, -89.0703195, -89.0703367694809, -89.069928293888, 
    -89.0698831534232, -89.0697751, -89.0694564, -89.0691842, 
    -89.0688629, -89.0687796, -89.0683897, -89.0680709, -89.0680013570839, 
    -89.067997892298, -89.0677882637198, -89.0676761, -89.067561359892, 
    -89.0675172265379, -89.0673833838859, -89.0673573, -89.0672568, 
    -89.067193, -89.0670827, -89.0670459, -89.0669331, -89.0667859, 
    -89.0665285, -89.0663693110885, -89.0661229183565, -89.0659105, 
    -89.0656457, -89.0653563, -89.064991, -89.064952050887, -89.0647966924694, 
    -89.0644952923785, -89.064153092271, -89.0638495611041, -89.0637036, 
    -89.0634387, -89.0634000885165, -89.0630534252976, -89.0627605777715, 
    -89.0628012, -89.0626663, -89.0624996, -89.0622323, -89.0620361, 
    -89.061992, -89.0621023, -89.061987, -89.0619576, -89.061808, 
    -89.0615358, -89.0613299, -89.0610871, -89.0609844381885, 
    -89.0609680248519, -89.0609669394726, -89.0610233, -89.0610528, 
    -89.061043, -89.0609866, -89.0608027, -89.0606464737858, 
    -89.0602430247656, -89.0595994912722, -89.0592166255429, 
    -89.0588092243953, -89.0585188799812, -89.058299, -89.0581028, 
    -89.0580114013565, -89.0574570240425, -89.0571039710758, 
    -89.0570827, -89.0567615, -89.0565271574525, -89.0564304893949, 
    -89.0561208893223, -89.0558764903022, -89.0557134902679, 
    -89.0552572901545, -89.0549476900753, -89.0546788900027, 
    -89.0544256858303, -89.0542995, -89.0538496810342, -89.0536116886658, 
    -89.0525606894323, -89.0522918893589, -89.0520068226122, 
    -89.0517378902429, -89.051289823452, -89.0509802889928, -89.0507358222635, 
    -89.0504344211418, -89.0501574221051, -89.0498234220158, 
    -89.049554488605, -89.0493426218732, -89.0491064218091, -89.0488618884131, 
    -89.0486908883631, -89.0484790216447, -89.0481612882279, 
    -89.0479576204695, -89.0471672879701, -89.0469718222951, 
    -89.0465480878024, -89.0463688867174, -89.046157021039, -89.0451995876601, 
    -89.044996, -89.0443143, -89.0440865122353, -89.0438758204292, 
    -89.043557888049, -89.0433134869431, -89.0426292200764, -89.0421484855579, 
    -89.0408692862235, -89.0405842194693, -89.0400628859701, 
    -89.0398754192467, -89.0396310191666, -89.0395857631664, 
    -89.0391696, -89.0384634, -89.0378675, -89.0369063, -89.0362466, 
    -89.0358665, -89.0356851, -89.0351701, -89.0348464, -89.034687, 
    -89.0346012, -89.0346772, -89.0347107803191, -89.0346532176267, 
    -89.0345588391726, -89.0344786, -89.0344541, -89.0345497, 
    -89.0345571, -89.034486, -89.0343756, -89.0342113, -89.0340519, 
    -89.0340143916965, -89.0339768174697, -89.0338823208357, 
    -89.0338558, -89.0337572747094, -89.0335938840187, -89.0333494849895, 
    -89.0328051172605, -89.0327449, -89.0321638, -89.0318548, 
    -89.0312393, -89.0305748, -89.0303157691282, -89.0301962164217, 
    -89.0297236152507, -89.0294710162182, -89.0294077564837, 
    -89.0292113, -89.0292243816084, -89.0290636827465, -89.0290168447591, 
    -89.0288975, -89.0287810610661, -89.0287458816171, -89.0285830159562, 
    -89.0284442825994, -89.0284156529032, -89.0283899, -89.0282305, 
    -89.0279583, -89.0277793, -89.0277794886465, -89.0277760824183, 
    -89.0274828823332, -89.0272947344094, -89.0272128, -89.0270755, 
    -89.0269014, -89.0265164, -89.0259107, -89.0254650872537, 
    -89.0253804151355, -89.0253429835696, -89.0253247, -89.0249568, 
    -89.0246748, -89.0245836941953, -89.0244006198502, -89.0243021, 
    -89.0242243814906, -89.0241256147651, -89.0238728824041, 
    -89.0235144156315, -89.0230418144629, -89.0226426143512, 
    -89.0223526344399, -89.0223404, -89.0223062405071, -89.0219058224502, 
    -89.0218941, -89.0216587, -89.0216341, -89.0215287, -89.0214464521381, 
    -89.0213874817437, -89.0213033776112, -89.0213178, -89.0211511, 
    -89.0210167632037, -89.0210124139634, -89.0207924139075, 
    -89.0204908804881, -89.0201486793439, -89.0199168661937, 
    -89.0198661, -89.0198589868983, -89.0197900792395, -89.0193176134844, 
    -89.01882848106, -89.0186736810224, -89.0185268799497, -89.0184536132655, 
    -89.018449231886, -89.0184169, -89.018408857057, -89.0182826132155, 
    -89.0180462131503, -89.0178260797644, -89.0177446130818, 
    -89.0177192513424, -89.0177573, -89.0176494, -89.0175243, 
    -89.0175103144149, -89.0172802129524, -89.0171553202964, 
    -89.0170952, -89.017002, -89.016954216707, -89.0169296128664, 
    -89.0168070128893, -89.0166358138975, -89.0163342794456, 
    -89.0160652793813, -89.0158044793228, -89.0154618792706, 
    -89.0152498781871, -89.0149074114701, -89.014662811424, -89.0144426124154, 
    -89.0142064500463, -89.0140937, -89.0137283, -89.0133679, 
    -89.0130732442352, -89.0126822119611, -89.0120790774124, 
    -89.0119926607747, -89.0114527, -89.0110126204235, -89.0110034114844, 
    -89.0107588780834, -89.010581081535, -89.0102021, -89.0098564, 
    -89.009842257112, -89.0094470776771, -89.0088358108484, -89.0084852097165, 
    -89.008314, -89.008314, -89.0082428, -89.007853, -89.0074238, 
    -89.0073089325623, -89.0073030771538, -89.0069280780994, 
    -89.0064228758749, -89.0059338767731, -89.0056976100321, 
    -89.0055428766446, -89.0054206755563, -89.0052984098962, 
    -89.0051516765278, -89.0049642764793, -89.0047440764275, 
    -89.0045158763648, -89.0036844750993, -89.0035258730455, 
    -89.0033189, -89.003314, -89.0030271, -89.0027058, -89.002571, 
    -89.0024999, -89.0025030109682, -89.002104519807, -89.0020018, 
    -89.0016654, -89.0011852, -89.0007487, -89.0003098, -88.9995643, 
    -88.9984731, -88.9979311, -88.9978222360102, -88.9973752077444, 
    -88.9971916905022, -88.9969895, -88.9965481, -88.9961101854911, 
    -88.9955870245884, -88.9954275, -88.9948341, -88.9942995, 
    -88.9937723, -88.9933113, -88.9927939, -88.9927792188792, 
    -88.9917302063113, -88.9889440722551, -88.9862148038139, 
    -88.982597403893, -88.9822470704736, -88.981717604725, -88.9807890691111, 
    -88.9803818700775, -88.9799338699656, -88.9790374707676, 
    -88.9775138036827, -88.9765932024271, -88.9759006689158, 
    -88.9747436019369, -88.974262801805, -88.9735376682912, -88.9719976678786, 
    -88.9714760677375, -88.9695646005501, -88.9661255985688, 
    -88.963892665655, -88.9624908652599, -88.960795663728, -88.9598177978466, 
    -88.9592390643652, -88.9592331684753, -88.9591942, -88.9588852, 
    -88.9583678, -88.9580081241565, -88.957601063993, -88.9572914639086, 
    -88.9556614644776, -88.9538438618706, -88.95197739572, -88.9511948621786, 
    -88.9502871751257, -88.9502561, -88.9501555, -88.9499397, 
    -88.9500551864452, -88.9499234618492, -88.9487743948966, 
    -88.9479796912414, -88.9476445, -88.9475116225945, -88.945332686448, 
    -88.9451531, -88.94467, -88.9441232, -88.9438542189297, -88.9433622602565, 
    -88.9429057934745, -88.9419648811487, -88.9416808, -88.9413645, 
    -88.9411953, -88.9412158422971, -88.9391685199177, -88.9391723, 
    -88.9391477, -88.9390153, -88.9388633, -88.9387408399627, 
    -88.938292058937, -88.9374016997506, -88.9374386, -88.9373724, 
    -88.937365, -88.9374655, -88.937571, -88.9376347, -88.9377818878665, 
    -88.9378436578413, -88.9380311933081, -88.9382267912874, 
    -88.9383000590282, -88.9383164590465, -88.9382511923722, 
    -88.9380963923379, -88.9380152541571, -88.9379983, -88.9379094, 
    -88.9378808, -88.9378511, -88.9377859, -88.937717, -88.9377148205967, 
    -88.937672458929, -88.9374523922196, -88.9368001910156, -88.9363762596486, 
    -88.9345258580405, -88.9336046577797, -88.9325122585154, 
    -88.93203125629, -88.9299851910544, -88.9296264565732, -88.9266427890962, 
    -88.9242131874195, -88.9228597881006, -88.922625791818, -88.9225122, 
    -88.9224755059496, -88.9212944553881, -88.9209927876044, 
    -88.9205116316691, -88.9205063, -88.9205012186744, -88.9197778539788, 
    -88.9183998525756, -88.9176498534116, -88.9174733409322, 
    -88.917473, -88.9173406, -88.9172106, -88.9171970398854, 
    -88.9156032528917, -88.9140539858224, -88.9126741283662, 
    -88.912603, -88.9123382, -88.9122771880578, -88.912105185316, 
    -88.9114200518308, -88.9113687674363, -88.9114456, -88.9116712, 
    -88.9118281, -88.9121052, -88.9123185, -88.9125932, -88.912809, 
    -88.9130444, -88.9131026, -88.9132798, -88.9134613, -88.9136206, 
    -88.9137577229791, -88.9137517858813, -88.913865984864, -88.9144093063197, 
    -88.9144936, -88.9144372, -88.9144716, -88.9146791, -88.9148026, 
    -88.9148762, -88.9151484, -88.9156118, -88.9161562, -88.9166098, 
    -88.9169581, -88.9173676, -88.9176496, -88.9178261, -88.9180027, 
    -88.9181915, -88.9183043, -88.9183411, -88.9183092, -88.9181694, 
    -88.917802561889, -88.917592053636, -88.9171027868571, -88.9155453864569, 
    -88.9144119861498, -88.9135638526005, -88.9129195857946, 
    -88.9124678408622, -88.9124779, -88.9125515, -88.9128163, 
    -88.9130174, -88.9133558, -88.9136991, -88.9139738, -88.9140743, 
    -88.9141994, -88.9142263, -88.9141896, -88.9141528, -88.9138044021266, 
    -88.9138163860969, -88.9138163861085, -88.9136369850341, 
    -88.9133187859945, -88.9118917866637, -88.9094209849733, 
    -88.9087930504399, -88.9080641849032, -88.9081793, -88.9086967, 
    -88.9091013, -88.909555, -88.9100012, -88.9102563, -88.9104966, 
    -88.910602, -88.9106609, -88.9108227, -88.9109551, -88.9110704, 
    -88.9111415, -88.9111317, -88.9110434, -88.9109208, -88.9104353, 
    -88.9101925, -88.9098934, -88.9098250005908, -88.9094037862361, 
    -88.9074301847036, -88.9064434511074, -88.9048968982764, 
    -88.9050209, -88.905119, -88.9051631, -88.9051803, -88.905146, 
    -88.9050479, -88.9048394, -88.9048198562922, -88.9048198508054, 
    -88.9047220507879, -88.9038003849324, -88.9029114503196, 
    -88.9018021833624, -88.9007255831066, -88.8999424485405, 
    -88.8993143827787, -88.8991580955258, -88.8991774, -88.8992387, 
    -88.8993539, -88.8993319, -88.8993784, -88.8994667, -88.8995207, 
    -88.8995648, -88.8995575, -88.8994692, -88.8993147, -88.8993098, 
    -88.8994196, -88.8994594, -88.8996286, -88.8998713, -88.9000724, 
    -88.9003029, -88.9005457, -88.9008571, -88.9010876, -88.9014088, 
    -88.9018968, -88.9022548, -88.9025614, -88.9027257, -88.9027772, 
    -88.9031106, -88.9033068, -88.9035569, -88.9037433, -88.9039517, 
    -88.9041381, -88.9041872, -88.904295, -88.9044029, -88.9046285, 
    -88.9047977, -88.9049645, -88.9056094, -88.9062126, -88.9067497, 
    -88.9070635, -88.9072671, -88.9076987, -88.9080248, -88.9084098, 
    -88.9088095, -88.9092239, -88.909474, -88.9096408, -88.909783, 
    -88.9099841, -88.9101557, -88.9103078, -88.9107026, -88.9108914, 
    -88.9110287, -88.9111243, -88.9112469, -88.911426, -88.9116467, 
    -88.9118845, -88.9120782, -88.9122769, -88.9124363, -88.9126373, 
    -88.912733, -88.9128458, -88.9129488, -88.9130395, -88.9131744, 
    -88.9133436, -88.913552, -88.9137089, -88.914062, -88.9143906, 
    -88.9145476, -88.914729, -88.9148713, -88.9149816, -88.9151434, 
    -88.9153126, -88.9155382, -88.9157222, -88.9159061, -88.9160924, 
    -88.9163597, -88.9166147, -88.9169531, -88.9173455, -88.9177231, 
    -88.9180762, -88.9182038, -88.9185323, -88.9188732, -88.9191307, 
    -88.9194446, -88.9197069, -88.9200723, -88.920293, -88.9206486, 
    -88.9209649, -88.9212297, -88.9214136, -88.9216221, -88.9218796, 
    -88.9221836, -88.9227084, -88.923243, -88.924008, -88.9247314, 
    -88.9253126, -88.9256485, -88.9261488, -88.9266613, -88.9268109, 
    -88.9270438, -88.9275563, -88.928113, -88.9286941, -88.9291257, 
    -88.9293268, -88.929523, -88.929675, -88.9297927, -88.9303861, 
    -88.9311414, -88.9321125, -88.9330467, -88.9337284, -88.9343832, 
    -88.9348908, -88.9354989, -88.9363057, -88.9371247, -88.937929, 
    -88.9384194, -88.9391134, -88.9398491, -88.9402635, -88.94057, 
    -88.9411536, -88.9419236, -88.9427917, -88.9435739, -88.9443316, 
    -88.9451065, -88.945852, -88.9465459, -88.947208, -88.9477377, 
    -88.9485444, -88.9493022, -88.9497803, -88.9502119, -88.9505307, 
    -88.9509696, -88.9514895, -88.9518941, -88.9523281, -88.9526739, 
    -88.9531104, -88.9540054, -88.9547337, -88.9550084, -88.9552634, 
    -88.9555748, -88.9556435, -88.9558102, -88.9558887, -88.9559819, 
    -88.9561511, -88.9562516, -88.9564674, -88.956617, -88.9566783, 
    -88.9567739, -88.9569333, -88.9569873, -88.9571099, -88.9572129, 
    -88.9573674, -88.9574458, -88.9574434, -88.9573379, -88.9572766, 
    -88.9571614, -88.957105, -88.9571319, -88.9570903, -88.9571025, 
    -88.9571933, -88.9572374, -88.9573796, -88.9574949, -88.9577646, 
    -88.9583556, -88.9588975, -88.9592555, -88.9595841, -88.9599372, 
    -88.9602634, -88.9605061, -88.960744, -88.9610481, -88.9616636, 
    -88.9623673, -88.9629632, -88.9634218, -88.964025, -88.9647459, 
    -88.9654693, -88.9660554, -88.9664306, -88.9669259, -88.9673943, 
    -88.9678038, -88.9682967, -88.9687601, -88.9691083, -88.9695301, 
    -88.9697435, -88.9701015, -88.9704595, -88.9706655, -88.9706557, 
    -88.9706949, -88.9708715, -88.9710088, -88.9710456, -88.9711387, 
    -88.9714355, -88.9715948, -88.9718867, -88.9722692, -88.9727694, 
    -88.9734413, -88.9740568, -88.975045, -88.9760995, -88.9764256, 
    -88.9768253, -88.977149, -88.9775291, -88.9778234, -88.9781789, 
    -88.9786179, -88.9791009, -88.9798366, -88.9804153, -88.9808518, 
    -88.9814771, -88.9822152, -88.9829165, -88.9835418, -88.9840543, 
    -88.9843706, -88.9847949, -88.9852093, -88.9855894, -88.9857512, 
    -88.9862564, -88.9867051, -88.9869503, -88.9871833, -88.9876664, 
    -88.9878797, -88.9883309, -88.9887625, -88.9892088, -88.9896453, 
    -88.9899739, -88.9905256, -88.9908689, -88.9911803, -88.9914697, 
    -88.9918988, -88.9920967, -88.9922022735964, -88.9928716003392, 
    -88.992941, -88.9931887, -88.9936276, -88.9942652, -88.9945643, 
    -88.9949027, -88.9952411, -88.9954667, -88.9960185, -88.9963716, 
    -88.9966879, -88.9970214, -88.9972102, -88.9974719979568, 
    -88.9980256783084, -88.9983466443135, -88.9983406, -88.9983791, 
    -88.9988152, -88.9992149, -88.9999503, -89.0005121, -89.0008908, 
    -89.0011802, -89.0016215, -89.0023155, -89.002521, -89.0029653, 
    -89.0034582, -89.0038408, -89.0042331, -89.0045592, -89.0047039, 
    -89.004753, -89.0048192, -89.0048854, -89.0048903, -89.0048584, 
    -89.0049099, -89.0050104, -89.0050963, -89.0051232, -89.0051061, 
    -89.0050766, -89.0051232, -89.0053439, -89.0054126, -89.0054371, 
    -89.0054518, -89.0054813, -89.0054788, -89.0054813, -89.0054028, 
    -89.0053317, -89.005214, -89.0050742, -89.0044489, -89.0040001, 
    -89.00375, -89.0033797, -89.0029335, -89.0027373, -89.0024994, 
    -89.0023327, -89.0021945692375, -89.0017970817905, -89.0010548805366, 
    -89.0005328803911, -89.0003982509879, -89.000241, -88.9998609, 
    -88.9996696, -88.9993533, -88.9991596, -88.9987868, -88.9985833, 
    -88.9984141, -88.998213, -88.9979997, -88.9977152, -88.9975485, 
    -88.9974725, -88.9974578, -88.9974774, -88.9975313, -88.9976564, 
    -88.9977692, -88.9978991, -88.9980046, -88.9981468, -88.9983136, 
    -88.9984711017391, -88.9986694094817, -88.9986870776864, 
    -88.9988284792978, -88.9990296, -88.9994612, -88.9999859, 
    -89.0005892, -89.0012905, -89.0014818, -89.0016436, -89.0020311, 
    -89.0023817, -89.0025951, -89.0028305, -89.0030364, -89.0032204, 
    -89.0034107, -89.0034312, -89.0036495, -89.0037672, -89.0038236, 
    -89.0038726, -89.0039094, -89.0038679268285, -89.0038676158385, 
    -89.003793482569, -89.0036572974237, -89.0036421, -89.0036366431468, 
    -89.0036298159477, -89.0034988826165, -89.0032538159237, 
    -89.0031150825669, -89.0028050835324, -89.0020708822909, 
    -89.0016872821962, -89.0013610154376, -89.0010592153607, 
    -89.0008798153097, -89.0004718152109, -89.0000936151043, 
    -88.9991398804862, -88.9979334812338, -88.9960338807484, 
    -88.9945664126582, -88.9928624132612, -88.9920390130556, 
    -88.9903186126002, -88.9894624123721, -88.988378012098, -88.9872692785088, 
    -88.9865063198953, -88.986396, -88.9863014007596, -88.9861852116347, 
    -88.9856310115093, -88.9850682780397, -88.983641277671, -88.981276677065, 
    -88.9804284768425, -88.9791482098349, -88.9786752763828, 
    -88.9780364646981, -88.9779679, -88.9779216678905, -88.9775418761193, 
    -88.9763594758192, -88.9746297160039, -88.9745226, -88.9740763, 
    -88.973706, -88.9735171300143, -88.9730158082862, -88.9727757028287, 
    -88.9726982, -88.972502, -88.9723034, -88.9720533, -88.9718179, 
    -88.9715923, -88.97145, -88.9714818055478, -88.9714416745098, 
    -88.9705036742531, -88.9703573341082, -88.970224, -88.9700695, 
    -88.9700506073542, -88.9691369210508, -88.9691229, -88.9689954, 
    -88.9687993, -88.9687326970782, -88.9683750747361, -88.967976314004, 
    -88.9678944, -88.9674481, -88.9673814037518, -88.9661812075048, 
    -88.9657610550097, -88.9657389, -88.9655305, -88.9653343, 
    -88.9652150496001, -88.9651370738963, -88.9649251604863, 
    -88.9648071, -88.9647213, -88.964584, -88.9644491, -88.9642652, 
    -88.9640322, -88.9638312, -88.9635132, -88.9633585134825, 
    -88.9630088057667, -88.9626174056821, -88.9620300711607, 
    -88.9598604039335, -88.9590122047676, -88.9584086035645, 
    -88.9577640711029, -88.9572420043099, -88.9564836041491, 
    -88.9556188706406, -88.9554150705879, -88.9547134037188, 
    -88.9543544702843, -88.9540770702156, -88.9536919129497, 
    -88.953653, -88.9533343, -88.95304, -88.952958808111, -88.9528944032993, 
    -88.9526334032398, -88.9503330037156, -88.9488400689597, 
    -88.9481956031782, -88.9474696019948, -88.9467354018855, 
    -88.9464334695193, -88.9452260691879, -88.9431373998754, 
    -88.9413097993658, -88.9377932661007, -88.9371241992515, 
    -88.9356145988645, -88.9341132651327, -88.9334687982977, 
    -88.9325792647448, -88.9321793979759, -88.9305964642106, 
    -88.9292581971988, -88.9281018156957, -88.9279567, -88.9278266514295, 
    -88.9261164630845, -88.9256186619205, -88.9242558626053, 
    -88.9240437958925, -88.9239966364478, -88.923972, -88.9238396, 
    -88.9238128234684, -88.9235947947818, -88.9232927957547, 
    -88.9229173966975, -88.9228894585384, -88.9228808, -88.9229911, 
    -88.9230745, -88.9232412, -88.9234374, -88.9236728, -88.9239131, 
    -88.9241951, -88.9244158, -88.9246586, -88.9249259, -88.9252226, 
    -88.9255021, -88.9258675, -88.9263653, -88.9267871, -88.9272309, 
    -88.9276723, -88.9283074, -88.9288322, -88.9292025, -88.9295801, 
    -88.9300068, -88.9305389, -88.9309901, -88.9312794, -88.9315198, 
    -88.9317282, -88.931966, -88.9322971, -88.93279, -88.9333147, 
    -88.9338738, -88.9343447, -88.9347542, -88.935225, -88.9355658, 
    -88.9359067, -88.9363309, -88.9367429, -88.9371131, -88.9374393, 
    -88.9377924, -88.9380842, -88.9383294, -88.9385501, -88.9391019, 
    -88.9395519, -88.9399472, -88.9402038, -88.9402905, -88.9402975, 
    -88.9402281, -88.9402177, -88.9402801, -88.9407552, -88.941213, 
    -88.9417193, -88.9421979, -88.9425689, -88.943044, -88.9435989, 
    -88.9443202, -88.9451525, -88.9459085, -88.9463767, -88.9466714, 
    -88.9471431, -88.9474517, -88.9477257, -88.9479476, -88.9483152, 
    -88.9486551, -88.9489603, -88.949307, -88.9495186, -88.9497787, 
    -88.9500353, -88.9504757, -88.9507601, -88.950878, -88.9510999, 
    -88.9514225, -88.9517172, -88.9520606, -88.9522998, -88.9524351, 
    -88.952494, -88.9525634, -88.9527611, -88.9530142, -88.9534408, 
    -88.9536974, -88.9538118, -88.9538049, -88.9535691, -88.9535343086861, 
    -88.9536870031041, -88.9537930708425, -88.9538910042018, 
    -88.9540050709169, -88.9539480042426, -88.953393270777, -88.953181204066, 
    -88.9529854707082, -88.952855004078, -88.9525696040261, -88.951533470464, 
    -88.949812003382, -88.9485800697372, -88.9480334029357, -88.9471440693996, 
    -88.9466382026199, -88.9445902687732, -88.9443700020446, 
    -88.9441984686577, -88.9441170019643, -88.9432846026833, 
    -88.9428604014979, -88.9426156014267, -88.9423136680138, 
    -88.9420852012919, -88.9416282012171, -88.9412610678067, 
    -88.9404124675848, -88.9397432674072, -88.9391558005981, 
    -88.9383072670854, -88.9370750001538, -88.9364466666812, 
    -88.9344963984729, -88.9324152656775, -88.9309464653047, 
    -88.9281226656242, -88.9250947971449, -88.9217483952559, 
    -88.9188262622324, -88.9170060617697, -88.9153734603613, 
    -88.9143856611715, -88.9138142610272, -88.912989794141, -88.9109570602994, 
    -88.908067259569, -88.9067609925744, -88.9053974578854, -88.9039604585855, 
    -88.9016254580083, -88.8992412574243, -88.8985880583023, 
    -88.8968164567703, -88.8947511894961, -88.8939185892447, 
    -88.8933392546656, -88.8931453462904, -88.8927547, -88.8925300447676, 
    -88.892090455302, -88.8915844551336, -88.8913151883724, -88.891225388334, 
    -88.8904668546731, -88.8904622417346, -88.89046, -88.8902725, 
    -88.8898910125069, -88.8897252542516, -88.8895784541923, 
    -88.8893009884735, -88.8883214527594, -88.8874725858389, 
    -88.8864030532462, -88.8842802526692, -88.8829575856618, 
    -88.8815694519752, -88.8813080519147, -88.8812507852428, 
    -88.8812892360558, -88.8820269, -88.8822471, -88.8822504156058, 
    -88.8822539856699, -88.8823109846591, -88.8823107857324, 
    -88.8821554523878, -88.8817713856687, -88.8811994522175, 
    -88.8805705854063, -88.8801297863231, -88.8791743860571, 
    -88.8778516523673, -88.8763980509545, -88.8750915849704, 
    -88.8746778504853, -88.8735190501877, -88.8728337833492, 
    -88.8721156498481, -88.8717323831059, -88.8710230486341, 
    -88.870729382957, -88.8700359828068, -88.8693913826633, -88.8681837823723, 
    -88.8679062489777, -88.8666657809541, -88.8646579804043, 
    -88.8638826479047, -88.8625849808984, -88.8614586472741, 
    -88.8596547801461, -88.8585121808859, -88.8571652461461, 
    -88.8563735792607, -88.8556632446853, -88.854700045467, -88.8539816452682, 
    -88.8535735784784, -88.8533449794597, -88.853140845036, -88.8522187771436, 
    -88.8520230448292, -88.8519742448499, -88.852031644915, -88.852203378342, 
    -88.8522034450387, -88.8521545783777, -88.8519260439624, 
    -88.8510855781618, -88.8505713780592, -88.8502041779836, 
    -88.8496899768269, -88.8495185788841, -88.8495349778683, 
    -88.8495944669424, -88.8498957, -88.8505082, -88.8508021, 
    -88.850895, -88.85099, -88.8509908613341, -88.8509968450475, 
    -88.8510623784361, -88.8509482451067, -88.8507850461247, 
    -88.8505647783718, -88.8498954448865, -88.8491771780603, 
    -88.8485240445741, -88.8476671766726, -88.8471690442542, 
    -88.8469487775414, -88.8466711774858, -88.846116244074, -88.8458633773586, 
    -88.8451857771982, -88.8429324432974, -88.8413567762379, 
    -88.8403361759701, -88.8396094424537, -88.838768575593, -88.8383684421589, 
    -88.8374866429664, -88.8368743751095, -88.835959841566, -88.8347351735653, 
    -88.8324734407643, -88.8319753739808, -88.8307259747133, 
    -88.8297706401098, -88.8290031732491, -88.8281047729932, 
    -88.8269532393384, -88.8257935723294, -88.8246501719862, 
    -88.8243398385407, -88.823033038138, -88.8225756379813, -88.8220121711019, 
    -88.8214240375573, -88.8211546364277, -88.820950437409, -88.8207462373543, 
    -88.8205584383564, -88.8202889706301, -88.8200847716379, 
    -88.8197908372023, -88.8194477704516, -88.8189659703264, 
    -88.8180023701111, -88.8174714366466, -88.8169078364946, 
    -88.8161565696173, -88.8157807695306, -88.8155277694809, 
    -88.8152989694237, -88.8150375693523, -88.8146047692298, 
    -88.8126445686598, -88.812007435161, -88.8116889673803, -88.8111743683108, 
    -88.8106516348431, -88.8103739680992, -88.8100881690544, 
    -88.8096143678534, -88.8093040344269, -88.8083156341556, 
    -88.8078174329596, -88.8075887683099, -88.8069027670643, 
    -88.8067237831132, -88.8063409, -88.8060024456306, -88.805857166772, 
    -88.8054161666311, -88.8051057675671, -88.8050665177846, 
    -88.8042386, -88.8038452, -88.8036481, -88.8033456369586, 
    -88.8033169660257, -88.8028513648231, -88.8018877655278, 
    -88.8014794320395, -88.8011772308564, -88.8011725331584, 
    -88.8011704, -88.8008682, -88.8007904757909, -88.8006056316212, 
    -88.8004096315591, -88.8003939618508, -88.8003099, -88.8001767, 
    -88.8002028, -88.8002022, -88.799995, -88.7997589222805, 
    -88.7997477648283, -88.7991760313387, -88.7979426320277, 
    -88.7974526297933, -88.7972811641054, -88.7969136316747, 
    -88.7966522305475, -88.7960968303746, -88.795810964649, -88.794994363294, 
    -88.7945125631222, -88.7936059628277, -88.793197562706, -88.7928708292861, 
    -88.7925194302761, -88.7922498302037, -88.7919232290631, 
    -88.7915638299898, -88.7911636288073, -88.7903877619048, 
    -88.7901672285001, -88.7900937618, -88.7900938224629, -88.7900869, 
    -88.7900952, -88.7900649973834, -88.7899877606633, -88.7891463615121, 
    -88.7888768281073, -88.7884765613181, -88.7876271610404, 
    -88.787316826559, -88.787112560871, -88.7866469607433, -88.786508228408, 
    -88.786287760615, -88.7861161605613, -88.7859282271825, -88.7856177594251, 
    -88.7854054270779, -88.7852255603624, -88.7848662269133, 
    -88.7845884257935, -88.7840819610898, -88.7837552266291, 
    -88.7835674255328, -88.7832897598155, -88.7830856264035, 
    -88.7830846351188, -88.7830788, -88.7830543, -88.783078509272, 
    -88.7829877596409, -88.7825793595209, -88.7823915594613, 
    -88.7817791592267, -88.7814851591244, -88.7812238257072, 
    -88.780937958954, -88.7801046253912, -88.7786507572729, -88.7774009569051, 
    -88.7761430232197, -88.7758324241855, -88.7757098241693, 
    -88.7755217574971, -88.775451569002, -88.7748738, -88.7744317, 
    -88.774219, -88.7739136, -88.7735604, -88.7735488860987, 
    -88.7734548236346, -88.7729828297299, -88.7727517, -88.772663815338, 
    -88.7726137576887, -88.7721240230986, -88.7718531491589, 
    -88.771382, -88.7706832, -88.7694333, -88.7681806468208, 
    -88.7679416218871, -88.7678435551952, -88.7678190218609, 
    -88.7678435552118, -88.7677780229057, -88.7672716227687, 
    -88.766610021518, -88.7658424212572, -88.7655974211692, -88.7650748209681, 
    -88.7650722512069, -88.765068, -88.7650273, -88.7655671, 
    -88.7654342835324, -88.765280153141, -88.7645207539177, -88.7643738205241, 
    -88.7641943548113, -88.7638677536564, -88.7631816201132, 
    -88.7627651533131, -88.7624301532181, -88.7622014198134, 
    -88.7617606196616, -88.7615237529327, -88.761351952913, -88.7611230195266, 
    -88.7608045527742, -88.7607471527697, -88.7607551528013, 
    -88.7606161527892, -88.7604609527546, -88.7602565527024, 
    -88.759733820252, -88.7596838825432, -88.7592718, -88.7589258, 
    -88.7586833, -88.7586992162253, -88.7586723521748, -88.7586479521597, 
    -88.7587870188261, -88.7587948074294, -88.7586504, -88.7583336, 
    -88.758265, -88.7583208, -88.7580554, -88.7579369, -88.757986, 
    -88.7580777, -88.7581993, -88.7581563, -88.7575139, -88.7574018, 
    -88.7564546, -88.7562698, -88.7560944, -88.7558922, -88.7554754, 
    -88.7551038346836, -88.7550455185967, -88.7546019, -88.7544108, 
    -88.7537173, -88.7532249, -88.7531173, -88.7532989, -88.7538802, 
    -88.7542124, -88.754271, -88.7541601, -88.7537965968886, 
    -88.7537922189009, -88.7530160176473, -88.7520357517349, 
    -88.7515537516012, -88.7510225504172, -88.7507448170041, 
    -88.7505324169394, -88.7505382278308, -88.7505256, -88.7505747, 
    -88.7505381733952, -88.7503774168691, -88.7501812168178, 
    -88.7500827501179, -88.7498785500517, -88.7495764166393, 
    -88.749290616562, -88.7489721498138, -88.7479190151923, -88.7473476160985, 
    -88.7471026160371, -88.7467514159288, -88.7462530157643, 
    -88.7459426146286, -88.7454282155333, -88.7452485488121, 
    -88.7451178143993, -88.7447748153477, -88.7442441485465, 
    -88.7437868140529, -88.7437133484144, -88.7436971484285, 
    -88.7436481484193, -88.7430275482537, -88.7423497480646, 
    -88.7420639479865, -88.7418596135601, -88.7414433478492, 
    -88.7412800134313, -88.7410676144133, -88.7407655476576, 
    -88.7406347476157, -88.7400790140669, -88.7398911462973, 
    -88.7393029481951, -88.7387965470073, -88.7382248135217, 
    -88.7377022133764, -88.7363463463224, -88.7357909461661, 
    -88.7349661459367, -88.7343943457811, -88.7335694132683, 
    -88.7332998121452, -88.7330139443462, -88.7328833453484, 
    -88.7325975452736, -88.7321973451751, -88.7319359461453, 
    -88.7310540115448, -88.7305394114111, -88.7298697445528, 
    -88.7296165444872, -88.72938794443, -88.7287755453477, -88.7283510108991, 
    -88.7281877441921, -88.7280734108235, -88.7279181441039, 
    -88.7279123375311, -88.7279113, -88.7278703, -88.7278703, 
    -88.7279682, -88.7279926, -88.7279604315295, -88.7277786116578, 
    -88.7276805439126, -88.7273783427769, -88.7270515437211, 
    -88.725826343379, -88.7241846096091, -88.7234495427414, -88.7228370102875, 
    -88.7224368091357, -88.721938542322, -88.7215791432686, -88.7206315419504, 
    -88.7201577418209, -88.719716608364, -88.719373541609, -88.7188916081478, 
    -88.718336208003, -88.7177563411924, -88.717544007811, -88.7171929400301, 
    -88.7170295399855, -88.7167599409457, -88.7165476075511, 
    -88.7161553407575, -88.7158367406651, -88.7155673406077, 
    -88.7154121405939, -88.7153469395396, -88.7148812071309, 
    -88.7147670071156, -88.7147262071379, -88.7146283404544, 
    -88.7145138060515, -88.7142769403576, -88.7137622058296, 
    -88.7130108066586, -88.7119406063675, -88.7113852062145, 
    -88.7111973395032, -88.7109523394633, -88.7108298061188, 
    -88.7108702046211, -88.7110601, -88.7110614826299, -88.7110669395942, 
    -88.7110751396009, -88.7110016062491, -88.7108791405888, 
    -88.7104460060744, -88.7102336059839, -88.7101355392845, 
    -88.7099802059032, -88.7093104057091, -88.7090980066943, 
    -88.7089836056207, -88.7088447378687, -88.708705805525, -88.708542405468, 
    -88.7081665386779, -88.7079787386141, -88.7078234041928, 
    -88.7074885384753, -88.7074068061634, -88.7073496051124, 
    -88.7072680051088, -88.7072271384354, -88.7070392050607, 
    -88.7069331383771, -88.7069413383938, -88.7067698050183, 
    -88.7067698039916, -88.7068188050641, -88.7068188040266, 
    -88.7067535383907, -88.7066310039812, -88.7061653382166, 
    -88.7058711391767, -88.7053892057163, -88.7047275378495, 
    -88.7045560044799, -88.704274204418, -88.7041926044103, -88.7041436044301, 
    -88.7041190044299, -88.7039803366905, -88.7038004043616, 
    -88.7036943377062, -88.7036371387386, -88.703555404345, -88.7030163375395, 
    -88.7026976041178, -88.7021585373113, -88.7018398028455, 
    -88.7016356038233, -88.7014966027354, -88.7013251370434, 
    -88.701104403617, -88.7009328035558, -88.700785804547, -88.7005406034264, 
    -88.7002383366665, -88.6998380032229, -88.6995112031379, 
    -88.6989148030128, -88.6987187352581, -88.698048736123, -88.6973053359177, 
    -88.6971501358797, -88.6969703348084, -88.6968477368639, 
    -88.6966190024274, -88.6964555357119, -88.6961287356094, 
    -88.6959979355707, -88.6957284011267, -88.6955895354746, 
    -88.6954424021308, -88.6953771354515, -88.6952301354136, 
    -88.6949604009612, -88.6947888019507, -88.6944537351524, 
    -88.6942005350601, -88.6940534016822, -88.693693801592, -88.6930811337378, 
    -88.6927544013744, -88.6924847346461, -88.6922313345754, 
    -88.6919698011655, -88.691332534323, -88.6909486019336, -88.6907934008565, 
    -88.6903684007802, -88.6900907330103, -88.6896493995639, 
    -88.6893961338807, -88.6889956004637, -88.6888404004257, 
    -88.6887260003946, -88.6880315335269, -88.6875739334123, 
    -88.6873615333558, -88.6870999999443, -88.6868875332195, 
    -88.6854821338964, -88.6843787981857, -88.6841989991869, 
    -88.683970333517, -88.6838723324543, -88.6835045323573, -88.6831203989271, 
    -88.68213159869, -88.6817801986023, -88.6811019984429, -88.6806033983214, 
    -88.6803909315974, -88.6798843314518, -88.6796637324396, 
    -88.6792059979373, -88.6788871978664, -88.6787075311551, 
    -88.6785523311113, -88.6780701299382, -88.6765663972771, 
    -88.6763047972105, -88.6758553304375, -88.6749725969022, 
    -88.6746865301772, -88.6746211968387, -88.6745883968626, 
    -88.6743269290985, -88.6742615301366, -88.6742369311873, 
    -88.6743005908359, -88.6743934, -88.6746385, -88.6746423421899, 
    -88.6746453303216, -88.6746699303366, -88.6745555303263, 
    -88.6743103302722, -88.673893530161, -88.6736971967686, -88.6735419967116, 
    -88.6735358645707, -88.6735352, -88.6734127, -88.6734372, 
    -88.6735026, -88.6736826, -88.6737316, -88.6737316, -88.6736913116587, 
    -88.6736241965575, -88.6735341965238, -88.6734035308568, 
    -88.6729703963639, -88.6723735962071, -88.6721857294933, 
    -88.6719241961025, -88.6717933294261, -88.6717197960776, 
    -88.6715971960463, -88.6710413958781, -88.6707063957913, 
    -88.6703795290337, -88.6698401299121, -88.669554128793, -88.668524127494, 
    -88.6680583273867, -88.6679029283962, -88.6677885283842, 
    -88.6677719273831, -88.6676655950752, -88.6674203950236, 
    -88.6671507949645, -88.6670525293357, -88.6669135949394, 
    -88.6667827949131, -88.6665783938233, -88.6664475948371, 
    -88.6662431937547, -88.6659651947588, -88.6657527947048, 
    -88.6656627946862, -88.6655891280059, -88.665523728004, -88.6653601936042, 
    -88.6651395945928, -88.6649759945456, -88.6647879944859, 
    -88.6644447943633, -88.6643223276547, -88.6641179942565, 
    -88.6639545275436, -88.6633251273775, -88.6628183262151, 
    -88.6626385272103, -88.6623933271372, -88.6621235937122, 
    -88.6619193269799, -88.6616905279593, -88.6611509257418, 
    -88.6610609934381, -88.6610363278388, -88.660692926745, -88.6606683267582, 
    -88.6606109944547, -88.660537393406, -88.6604555933891, -88.6599651265984, 
    -88.6598425276222, -88.6597689265619, -88.6596135931832, 
    -88.6593929264674, -88.6591557264225, -88.6583953929217, 
    -88.6577821927614, -88.6572345259713, -88.6565639924924, 
    -88.6557465266706, -88.6548553920644, -88.6546755263955, 
    -88.6543485919337, -88.6539561251458, -88.653817191772, -88.6535065916919, 
    -88.6533185249855, -88.653023991621, -88.652860324942, -88.6526641248931, 
    -88.6525005915225, -88.6520507914285, -88.6517481913716, 
    -88.6510203912241, -88.6507095245163, -88.6505213244881, 
    -88.6503987244652, -88.650128924396, -88.6500879910583, -88.6500633243957, 
    -88.6499243910336, -88.6498017253873, -88.6497363243271, 
    -88.6496791243069, -88.6495239231899, -88.6494257908671, 
    -88.6490333241, -88.6489515897147, -88.6489023897037, -88.6486245906587, 
    -88.648550990641, -88.6484119239454, -88.6483137916235, -88.6480849249003, 
    -88.6479295904831, -88.647651590398, -88.6475289903626, -88.6470465891911, 
    -88.6467275912058, -88.6467277061079, -88.6468189, -88.6468188925707, 
    -88.6468257235411, -88.6468255902186, -88.6468882348871, 
    -88.6469903, -88.6469929198433, -88.6469971236373, -88.6470135236482, 
    -88.6469643236488, -88.6468497902925, -88.6467107913012, 
    -88.6466289225467, -88.6465635235715, -88.6461547901136, 
    -88.6455825899435, -88.6446751896832, -88.6443481229279, 
    -88.6439229228198, -88.643415989349, -88.6430643892637, -88.6424673224616, 
    -88.6420093890126, -88.6415759889111, -88.6411997877923, 
    -88.6409133887679, -88.6405127897083, -88.6400547219, -88.6396375895086, 
    -88.6394495884313, -88.6394331217737, -88.6395036422512, 
    -88.6395814, -88.6397203, -88.6400802, -88.6401946, -88.6402927, 
    -88.6402953101259, -88.6402995220704, -88.6403647231555, 
    -88.6404820451819, -88.6406356, -88.6409707, -88.6412568, 
    -88.6414041, -88.6415021, -88.6415077938754, -88.6415089235414, 
    -88.6415579891923, -88.6415495225571, -88.6414839892136, 
    -88.6411815224684, -88.6410261224312, -88.6410177880702, 
    -88.6410558463848, -88.641256, -88.6417056, -88.6420326, 
    -88.6422042, -88.6427358, -88.6432426, -88.6434307, -88.6438801, 
    -88.6455559, -88.6460136, -88.6464714, -88.6472396, -88.647444, 
    -88.6476729, -88.6479262, -88.6484414, -88.6491775, -88.6494228, 
    -88.6500034, -88.6504775, -88.6511399, -88.651843, -88.6528242, 
    -88.6533802, -88.6535274, -88.653781, -88.6538955, -88.6539773, 
    -88.6541081, -88.6543532, -88.6545166, -88.6546719, -88.6547946, 
    -88.655048, -88.6554406, -88.6556776, -88.6558329, -88.6559965, 
    -88.6561927, -88.6563153, -88.6564298, -88.6564350759822, 
    -88.6564365936111, -88.6566269778887, -88.6568219, -88.6569528, 
    -88.6573043, -88.6574106, -88.6574596, -88.657460102339, 
    -88.6574663939582, -88.6574822220224, -88.6575658, -88.6577456, 
    -88.6590702, -88.6595118, -88.6600516, -88.6603704, -88.6615479, 
    -88.662292, -88.662709, -88.6628154, -88.6628022876743, -88.6626913951503, 
    -88.6624051940469, -88.6615631282125, -88.6603859268506, 
    -88.6602223945051, -88.6601161277997, -88.6599199943917, 
    -88.6597239276404, -88.6597220254605, -88.6597171, -88.6596844, 
    -88.6597581, -88.659799, -88.6598263, -88.6603877, -88.6606411, 
    -88.6608455, -88.6611236, -88.6613525, -88.6616386, -88.6618676, 
    -88.6621293, -88.6623662, -88.6624318, -88.6624317017937, 
    -88.6623323281965, -88.6623321943627, -88.6623255, -88.6623173, 
    -88.6624564, -88.6624973, -88.6625055, -88.6625464, -88.6632087, 
    -88.6637482, -88.6640508, -88.6641734, -88.6646475, -88.6651218, 
    -88.6654896, -88.6661437, -88.6668141, -88.6670021, -88.6681386, 
    -88.6685394, -88.6688827, -88.6692833, -88.6696267, -88.6701171, 
    -88.6704032, -88.6707056, -88.6708609, -88.6713758, -88.6715474, 
    -88.6717599, -88.6721767, -88.6724955, -88.6727735, -88.6734356, 
    -88.6737544, -88.6741469, -88.6742694, -88.6744002, -88.6746618, 
    -88.6748416, -88.6751031, -88.675847, -88.6759124, -88.675986, 
    -88.6761495, -88.6765255, -88.6769587, -88.6771303, -88.6772692, 
    -88.6774246, -88.6774293381576, -88.6774313983005, -88.6774885316665, 
    -88.6774967306581, -88.6774231317261, -88.677406731751, -88.6774475317951, 
    -88.6775664681182, -88.677694, -88.6776947900191, -88.6777007985882, 
    -88.6777171308974, -88.6776517319338, -88.6772839308127, 
    -88.6769405984383, -88.6763521305932, -88.6758779304943, 
    -88.6756897981885, -88.6756817315584, -88.6758121983136, 
    -88.6758123316528, -88.6756569983197, -88.6756487508138, 
    -88.6757073, -88.676026, -88.6760274819918, -88.6760327995149, 
    -88.6760409984816, -88.6760163984881, -88.6758693317918, 
    -88.6753869983445, -88.6751989993564, -88.6748065305251, 
    -88.6743325314479, -88.6736621979359, -88.6731881311403, 
    -88.6722397985874, -88.6714633962802, -88.6709319971636, 
    -88.6707113960646, -88.6704333970404, -88.6701719313429, 
    -88.6698939302346, -88.6695669301694, -88.6692725967743, 
    -88.6688883966723, -88.6680873297865, -88.6672779962265, 
    -88.6669265294638, -88.6667465971316, -88.6662887959918, 
    -88.6660761292919, -88.6655201291842, -88.6645307956144, 
    -88.6640239954969, -88.6636315287507, -88.6635985954388, 
    -88.6635577964903, -88.663124328693, -88.662249395156, -88.6618079283987, 
    -88.6611863949225, -88.6611701949325, -88.6611909107665, 
    -88.6613595, -88.6613630897553, -88.6613663293872, -88.6613825273138, 
    -88.6613415283861, -88.6614192760947, -88.6615717, -88.6618414, 
    -88.6620457, -88.6621928, -88.662198368414, -88.6621995953868, 
    -88.6623573671565, -88.6624869, -88.6626749, -88.6631654, 
    -88.6633206, -88.6633155997721, -88.6633273968566, -88.6631883291194, 
    -88.6631393291076, -88.6628859290302, -88.6628451191548, 
    -88.662826, -88.6628024159486, -88.6627713956989, -88.6627303946513, 
    -88.6625997279575, -88.6620517955175, -88.6614795286982, 
    -88.6604819294975, -88.6604494709409, -88.6605241, -88.6607775, 
    -88.6608755, -88.6608761268682, -88.6608823286277, -88.6609067953169, 
    -88.6608577953159, -88.6606533286085, -88.6602689951756, 
    -88.6599829284256, -88.6597457950182, -88.6594597282524, 
    -88.6593533938462, -88.6591979948465, -88.6591163281521, 
    -88.6583235955624, -88.6581683278053, -88.6579475277404, 
    -88.6573997276053, -88.6569499951947, -88.6565411950751, 
    -88.65624679291, -88.6558869928296, -88.6556009271454, -88.6554289937888, 
    -88.6552245281281, -88.655044593705, -88.6548075269668, -88.6542435278268, 
    -88.65364679325, -88.6528541939712, -88.6522411270969, -88.6518487925949, 
    -88.6517821136898, -88.6512263, -88.6508152, -88.6504533691233, 
    -88.6502912922035, -88.6499878, -88.6495453, -88.6488828, 
    -88.6487508075234, -88.6487255916833, -88.6484060574162, 
    -88.6484521, -88.6482893, -88.6477585, -88.647278, -88.646807, 
    -88.6462326, -88.6460394, -88.6459181, -88.6458054386627, 
    -88.6457991241027, -88.645749990755, -88.6454965906726, -88.6453249916629, 
    -88.6448669227972, -88.6445315904302, -88.6444955503929, 
    -88.6442812, -88.6437653433442, -88.643730190245, -88.6436470125721, 
    -88.6434989, -88.6433136, -88.6430846, -88.6427841, -88.6427501, 
    -88.6420225, -88.6419027, -88.641728, -88.6413312, -88.6408387, 
    -88.6405379, -88.6404582, -88.640052, -88.6396969, -88.6394033, 
    -88.6395143, -88.6393438, -88.6391306, -88.6389278, -88.6387993, 
    -88.6386377, -88.6383932, -88.6378119944515, -88.6377299883298, 
    -88.6372395892225, -88.6367735213768, -88.6367139583468, 
    -88.6364709, -88.6362219, -88.6358638, -88.6355698, -88.6351858, 
    -88.6348419897052, -88.634810587565, -88.6346551875294, -88.6346162841326, 
    -88.6342922, -88.6332334, -88.6325336, -88.6321537367718, 
    -88.6321363212625, -88.6321033868907, -88.6321129863215, 
    -88.6322126, -88.6321798, -88.6320552, -88.6316777, -88.6309644, 
    -88.6298112, -88.6293559, -88.6285814713118, -88.6285369193839, 
    -88.6283405193515, -88.6283321860272, -88.6283479355436, 
    -88.6286009, -88.62845, -88.6281195053226, -88.6279883193332, 
    -88.627853842583, -88.6279923, -88.6278007, -88.6276596, 
    -88.6270473, -88.6267679, -88.6263121, -88.6259625, -88.6255689, 
    -88.6251553, -88.6249638718952, -88.6249547195245, -88.6249320205472, 
    -88.6247454, -88.6242795, -88.6238782, -88.6233235, -88.622956, 
    -88.6226406, -88.6219201, -88.6215679, -88.6212961, -88.6208425, 
    -88.6206563, -88.6206311, -88.620819, -88.6210641, -88.6213254, 
    -88.6214435, -88.6211763, -88.6209197, -88.6205299, -88.6200353061771, 
    -88.6200111840341, -88.6196679839572, -88.6194717849524, 
    -88.6193247172053, -88.6191203838089, -88.6184829836643, 
    -88.6182133836226, -88.6179355835634, -88.617322716754, -88.6168895166501, 
    -88.6167261166046, -88.6166687832502, -88.6166664256651, 
    -88.616662, -88.6166455, -88.6166373459297, -88.6166113831968, 
    -88.6163497164517, -88.6160635830433, -88.615867517376, -88.6158356143214, 
    -88.6160654, -88.6160666641678, -88.6160721831158, -88.6160887164651, 
    -88.6160151164465, -88.6159333164187, -88.615859716391, -88.6158023830408, 
    -88.6156797830121, -88.6155571829767, -88.6155163152507, 
    -88.6155101471203, -88.6155095, -88.6154504470683, -88.6153853818603, 
    -88.6152219161881, -88.6146577816638, -88.6143717826429, 
    -88.6141595149022, -88.6138895825322, -88.6137669825035, 
    -88.61370991687, -88.6137314755443, -88.6138749, -88.6138769420691, 
    -88.6138817158997, -88.6138981169547, -88.6138001158969, 
    -88.6136447825297, -88.6135303158319, -88.6133587157788, 
    -88.6131707157316, -88.6128925823131, -88.612753515596, -88.6125981811731, 
    -88.6125916239129, -88.6125914, -88.612475125057, -88.6121809820534, 
    -88.6116087162607, -88.6111671828027, -88.6110119140155, 
    -88.6108729150292, -88.6107587150131, -88.6106607150226, 
    -88.6106363160784, -88.6106855150686, -88.6106201817408, 
    -88.6104323139977, -88.6101787805969, -88.6099909159738, 
    -88.6097291815138, -88.6096311158668, -88.6095741137808, 
    -88.6096022917843, -88.6098127, -88.6098115075999, -88.6098195149141, 
    -88.609811180544, -88.6097459149079, -88.6097789139131, -88.6096971149395, 
    -88.6094681825837, -88.6090185147298, -88.608429580177, -88.6082579811615, 
    -88.6082522893382, -88.6082512, -88.6082184, -88.6082502973223, 
    -88.6082087800739, -88.6079961143857, -88.6077835143091, 
    -88.6076035142527, -88.6074645808797, -88.6074401142172, 
    -88.6073501131552, -88.6072357808299, -88.6070641141177, 
    -88.6069577807698, -88.6069499808214, -88.6067047140823, 
    -88.6066311151045, -88.6065903140586, -88.6065985140719, 
    -88.6065659130285, -88.6064513807064, -88.6063613140028, 
    -88.6062633139691, -88.6061405149737, -88.6058545138777, 
    -88.6058226162735, -88.605897, -88.6058979171876, -88.6059037805863, 
    -88.6059201806013, -88.6058385139177, -88.605666714913, -88.6053805804546, 
    -88.6051189803978, -88.6049473803548, -88.6047429125825, 
    -88.6045057802133, -88.6043423135003, -88.6040399123969, 
    -88.6039499801031, -88.6039337801305, -88.603949906406, -88.6041645, 
    -88.6041671822746, -88.6041713135863, -88.6042244017116, 
    -88.6043771, -88.6043835740232, -88.6043839126319, -88.6044083803529, 
    -88.60431038033, -88.6040651135959, -88.6039017135546, -88.6037053801672, 
    -88.6033865134054, -88.6032065800215, -88.6029939799657, 
    -88.6026669798905, -88.6024955131999, -88.6018087119851, 
    -88.6015471119242, -88.6011465118054, -88.601072913876, -88.6009831795024, 
    -88.6008195794651, -88.6007213783931, -88.6006723794113, 
    -88.6006721530861, -88.6006656, -88.6006492, -88.6006136584072, 
    -88.6005413793451, -88.6003369792877, -88.5994867124074, 
    -88.5991597123288, -88.5988571789294, -88.5980971121301, 
    -88.5979009787586, -88.5974921796914, -88.5970833129208, 
    -88.5969281108087, -88.5969037118802, -88.5967565785238, 
    -88.5966503785218, -88.5964461128569, -88.5961681107043, 
    -88.5956037782491, -88.5953421781757, -88.5950315114405, 
    -88.5948107124281, -88.594638978005, -88.5943609112524, -88.5942873112362, 
    -88.5942629112395, -88.594058377853, -88.5937967777796, -88.5931099776272, 
    -88.5923005774511, -88.5919899107109, -88.591801777336, -88.5916875096348, 
    -88.5915731117002, -88.5912787772584, -88.5901747769828, 
    -88.5891855767877, -88.5886541756308, -88.5884661766576, 
    -88.5883025755745, -88.5881473099032, -88.5881719099449, 
    -88.5880983099371, -88.5878529098804, -88.5876239775221, 
    -88.5873133097327, -88.5865935762326, -88.5863237761675, 
    -88.5858905094085, -88.5857433750138, -88.5854651759845, 
    -88.5851955092602, -88.5850891092407, -88.5850809092531, 
    -88.5851709749325, -88.5851465093183, -88.5849667092826, 
    -88.584835910318, -88.5846887092416, -88.5842061757766, -88.5831757088563, 
    -88.582423375361, -88.582235308657, -88.5822353086742, -88.5822859, 
    -88.5824249, -88.5824659, -88.5824657423134, -88.5824727098145, 
    -88.5824563087744, -88.5823663097933, -88.5818509752748, 
    -88.5816139085506, -88.5810413084169, -88.5808941750505, 
    -88.5808941750679, -88.580937874425, -88.5810756, -88.5810778059651, 
    -88.5810823751503, -88.5811069741262, -88.5810333084884, 
    -88.5808861751179, -88.5803789749494, -88.5803381082734, 
    -88.5803299739043, -88.5802727082724, -88.5800683082042, 
    -88.579978174843, -88.5799545432602, -88.5800451, -88.5800443785814, 
    -88.5800519082232, -88.5800355092698, -88.5797575081697, 
    -88.5793567747474, -88.5787025746341, -88.5782853745243, 
    -88.5779665088239, -88.5778355744268, -88.5776801754495, 
    -88.5775821077208, -88.5774183743419, -88.5773285743225, 
    -88.5771813076427, -88.5764125084841, -88.5762733740744, 
    -88.5762504468267, -88.5763239, -88.5770846, -88.5773055, 
    -88.57769, -88.5777635, -88.5778617, -88.5779599, -88.5781481, 
    -88.5782625, -88.5783771, -88.578508, -88.5785075490331, 
    -88.5785147747773, -88.5784821747906, -88.578670307187, -88.5786541082403, 
    -88.5783923748709, -88.5783763201092, -88.5784265, -88.5785819, 
    -88.5785804768824, -88.5785887093391, -88.5785723749682, 
    -88.5784661082878, -88.5776889757875, -88.5771163079204, 
    -88.5770755079194, -88.5770347079417, -88.5769611746023, 
    -88.5768465735435, -88.5764949078464, -88.5761021744066, 
    -88.575406906455, -88.5752433074461, -88.5751123730397, -88.5749651730134, 
    -88.5749323740574, -88.5749815074292, -88.5749815741009, 
    -88.5748833740755, -88.5746625740072, -88.5744907739466, 
    -88.5743107072226, -88.574130907177, -88.5740913273039, -88.5742795, 
    -88.5746558, -88.5746606715693, -88.5746625740438, -88.5746871084331, 
    -88.5746402819419, -88.5747214, -88.574844, -88.5750568, 
    -88.5752122, -88.5752105136217, -88.5752189742807, -88.5751863076132, 
    -88.5751617076255, -88.5750717742885, -88.5748591065269, 
    -88.5742209740587, -88.5739837729562, -88.5739265739893, 
    -88.5739511740319, -88.5739752672996, -88.5740999, -88.574198, 
    -88.574239, -88.5742391810302, -88.5742457741662, -88.5742536633691, 
    -88.5743372, -88.5744598, -88.5746398, -88.5747134, -88.5747191120852, 
    -88.5747201753803, -88.5747857733323, -88.5747857087605, 
    -88.5747203077128, -88.5745731076815, -88.5745654780611, 
    -88.5746645, -88.5748363, -88.5750817, -88.5752617, -88.5753763, 
    -88.5753758241936, -88.575383107976, -88.5753421746491, -88.5752359079629, 
    -88.5748841745409, -88.574810507863, -88.57467150682, -88.5745325078844, 
    -88.5745979746062, -88.5746389747262, -88.5741647069228, 
    -88.5740665079683, -88.5739927746496, -88.5740400237281, 
    -88.5743789, -88.5745179, -88.5745194229169, -88.5745247071715, 
    -88.5745575082383, -88.5745575749615, -88.5746054033279, 
    -88.5750501, -88.5752955, -88.5753005170823, -88.5753023086142, 
    -88.5753789043087, -88.5755165, -88.5756555, -88.5758109, 
    -88.5758040979945, -88.5758177087927, -88.5756951087815, 
    -88.5756377764879, -88.5756133754561, -88.5755233087733, 
    -88.5752205753522, -88.5750487753082, -88.5748443086008, 
    -88.5745005751878, -88.5744515751885, -88.57442710853, -88.5744920813477, 
    -88.574805, -88.5748055525704, -88.574811775398, -88.5748665744868, 
    -88.5750995, -88.5751018308785, -88.5751063088674, -88.5752209756119, 
    -88.5751555099833, -88.5749591755626, -88.5746809765191, 
    -88.5743619087071, -88.5734945750873, -88.5733309739967, 
    -88.5732001083403, -88.5731265083309, -88.573126508355, -88.5730855750249, 
    -88.573107761995, -88.5731934, -88.5735125, -88.5735189846173, 
    -88.5735193085215, -88.5735765762592, -88.5735683762733, 
    -88.5735357085757, -88.5737893753849, -88.5738221754233, 
    -88.5738059087616, -88.5737567754189, -88.5737241087529, 
    -88.5737319129533, -88.5738072, -88.5740282, -88.5741674, 
    -88.5743638, -88.5745765, -88.5749202, -88.5753702, -88.575542, 
    -88.5756402, -88.5756451153157, -88.5756469750408, -88.5757125084103, 
    -88.5757761635463, -88.5760086, -88.5760126551547, -88.5760153762647, 
    -88.5760481085756, -88.5760325266579, -88.576295, -88.5763017123377, 
    -88.5763017753557, -88.5764342249823, -88.576786, -88.5767920480059, 
    -88.5767927766016, -88.5771060659416, -88.5779236, -88.5779728, 
    -88.5779725173571, -88.5779795771052, -88.5779469104584, 
    -88.5779879115327, -88.577971509451, -88.5778895771423, -88.5778815094431, 
    -88.5779191441789, -88.5780548, -88.5783493, -88.5784231, 
    -88.5784245001671, -88.578429910686, -88.5784789107286, -88.5784545117728, 
    -88.5782499106745, -88.5780453772738, -88.5780371772812, 
    -88.5780682758286, -88.5782268, -88.5784478, -88.5786114, 
    -88.5787587, -88.5788323, -88.5788323, -88.5788391109, -88.5788391109071, 
    -88.5789305, -88.5792006, -88.5803216, -88.5807225, -88.5809844, 
    -88.5817208, -88.5824243, -88.5829233, -88.583095, -88.5835288, 
    -88.5840525, -88.5842979, -88.5845515, -88.5847315, -88.5847807, 
    -88.5847801945011, -88.5847875125003, -88.5847549350547, 
    -88.5848709, -88.5849937, -88.58528, -88.5856074, -88.5858364, 
    -88.5859347, -88.5860084, -88.5860141851684, -88.5860151796423, 
    -88.5861562318219, -88.5863111, -88.5865158, -88.5868348, 
    -88.5872685, -88.5879638, -88.588741, -88.5896654, -88.5900254, 
    -88.5904346, -88.5907128, -88.5915558, -88.5919486, -88.592513, 
    -88.5938466, -88.5950001, -88.5952619, -88.5956383, -88.5958019, 
    -88.5959574, -88.5962277, -88.5962290001956, -88.5962345169661, 
    -88.5963327826581, -88.5963411160106, -88.5962839149688, 
    -88.5961449159933, -88.5958831836499, -88.5954005825048, 
    -88.5950815824337, -88.5944925156049, -88.5941897821896, 
    -88.5939033821028, -88.5937151153704, -88.5934287152819, 
    -88.5928479151298, -88.5924959816985, -88.5919971149059, 
    -88.5912525147024, -88.5904343144652, -88.5898697809774, 
    -88.5893787808514, -88.5886343129428, -88.5868915801948, 
    -88.5864007134147, -88.5860979133302, -88.5857215132214, 
    -88.5851979130569, -88.5843139794678, -88.5835285125665, 
    -88.5830867124366, -88.5827839790213, -88.5823665799589, 
    -88.5819575788191, -88.581622178752, -88.5812295120181, -88.5810413119924, 
    -88.5808203786165, -88.5804685785327, -88.5802639128511, 
    -88.5792819781784, -88.5790283124948, -88.5789711114538, 
    -88.5789221114778, -88.5787747781206, -88.5784965780546, 
    -88.5771219120544, -88.5769337109696, -88.5768273109533, 
    -88.5768039894078, -88.5769024, -88.5773198, -88.5775407, 
    -88.5776308, -88.5776300387175, -88.5776375768605, -88.577629377908, 
    -88.5773183778301, -88.5766065120158, -88.5765493109739, 
    -88.576557110578, -88.5766979, -88.5768372, -88.5771318, 
    -88.5780238, -88.5785149, -88.5788913, -88.5790958, -88.5792759, 
    -88.5792749893904, -88.5792827118692, -88.579250111875, -88.5788407784334, 
    -88.5782927116155, -88.57794891153, -88.5775151780801, -88.5770897123302, 
    -88.5769179122812, -88.5768115122641, -88.5767461122672, 
    -88.5767783867155, -88.5769848, -88.5773287, -88.5775169, 
    -88.5778606, -88.578237, -88.5783843, -88.578378800443, -88.5783911118034, 
    -88.5783257117974, -88.5775811116229, -88.5775319116252, 
    -88.5775073783018, -88.5772619115792, -88.5771637782546, 
    -88.5769837782056, -88.5768691781768, -88.576869178185, -88.5770261, 
    -88.5776317, -88.5779181, -88.5782046, -88.5784993, -88.5786711, 
    -88.5790803, -88.5793831, -88.5796287, -88.580275, -88.5808642, 
    -88.5812406, -88.5827217, -88.5828118, -88.5828855, -88.5828872237748, 
    -88.5828923131862, -88.5829169142472, -88.5828759809095, 
    -88.5828759792478, -88.5830083, -88.5832047, -88.5833848, 
    -88.5835238, -88.5836384, -88.583640046116, -88.5836451800857, 
    -88.5836614395076, -88.583704, -88.5837858, -88.5839003, 
    -88.5839067952171, -88.5839071145676, -88.5840217802513, 
    -88.583980980252, -88.5838827135658, -88.5832935123719, -88.5831381800422, 
    -88.5828025799784, -88.5825245132416, -88.5822953809133, 
    -88.581738912017, -88.5817316002359, -88.5817976, -88.5818795, 
    -88.5820431, -88.5822068, -88.5822804, -88.5822805942711, 
    -88.5822871799124, -88.5822955132733, -88.5821973799313, 
    -88.5820991799134, -88.5820911132559, -88.5821811143462, 
    -88.5821239133169, -88.5810683130588, -88.5804953128882, 
    -88.5800615783866, -88.5797343126795, -88.5789485791332, 
    -88.578924179139, -88.5789405135341, -88.5788833124881, -88.5786213124145, 
    -88.5785662280855, -88.5786474, -88.5788973, -88.5790239, 
    -88.5790288426109, -88.5790307125762, -88.5790961792797, 
    -88.5790797792888, -88.5789325792808, -88.5788762235631, 
    -88.5791714, -88.579172137239, -88.5791781804601, -88.5791947127685, 
    -88.5791619794401, -88.5791619159633, -88.5795564, -88.5799492, 
    -88.5803257, -88.5806694, -88.5814388, -88.5819136, -88.5822899, 
    -88.5825599, -88.5828116, -88.5829066, -88.5830291, -88.5830907, 
    -88.5832661, -88.5836319, -88.5836789582258, -88.5838595807529, 
    -88.5841951808574, -88.5849155154818, -88.5850955801192, 
    -88.5853901802003, -88.5859205702343, -88.5860872, -88.5862251902391, 
    -88.5868303816056, -88.5873319381543, -88.5878586, -88.5881658, 
    -88.5888287, -88.5898189, -88.5901216, -88.5902688, -88.5904078, 
    -88.5906042, -88.5922735, -88.5930917, -88.5944337, -88.5950636, 
    -88.5961355, -88.5970929, -88.5975347, -88.5976246, -88.5976326, 
    -88.5977061, -88.5980988, -88.5987698, -88.5996534, -88.5998661, 
    -88.5999887, -88.5999313, -88.5999721, -88.6001355, -88.6004464, 
    -88.6013137, -88.6020908, -88.6031705, -88.6033257, -88.603432, 
    -88.6037511, -88.6043893, -88.6045774, -88.6047574, -88.6050189, 
    -88.6051824, -88.605755, -88.6060741, -88.6066631, -88.6075631, 
    -88.6082912, -88.6095182, -88.6102708, -88.6110234, -88.6121034, 
    -88.6129051, -88.6136167, -88.6143854, -88.6148843, -88.6155469, 
    -88.6159967, -88.6161275, -88.6162994, -88.6164631, -88.6165696, 
    -88.616815, -88.6170273, -88.6170021, -88.6170999, -88.6174184, 
    -88.6178681, -88.6189232, -88.619929, -88.6205913, -88.6208366, 
    -88.6209428, -88.6210323, -88.6211385, -88.6212774, -88.6222585, 
    -88.6224628, -88.6225526, -88.6225360107001, -88.6221167240167, 
    -88.622116682852, -88.6221099, -88.6220278, -88.6221581, 
    -88.6224109, -88.6227049, -88.6236366, -88.6237673, -88.6238652, 
    -88.6238568462757, -88.6235441228471, -88.6235437412716, 
    -88.6235373, -88.6234798, -88.6234795, -88.6235691, -88.6236998, 
    -88.6239858, -88.6242473, -88.6244267, -88.6246308, -88.6250752, 
    -88.6252227, -88.6255094, -88.6260826, -88.6263855, -88.6267619, 
    -88.627433, -88.6279402, -88.6282757, -88.6285211, -88.628734, 
    -88.6290534, -88.629348, -88.6295936, -88.6299455, -88.63024, 
    -88.6303872, -88.630518, -88.6308695, -88.6312456, -88.6313764, 
    -88.6315482, -88.6317774, -88.6322684, -88.632743, -88.6331602, 
    -88.6337411, -88.6339047, -88.6341011, -88.6344368, -88.634633, 
    -88.6354592, -88.6362033, -88.6367922, -88.6370292, -88.6371355, 
    -88.6371359644062, -88.6371423273582, -88.6371665930057, 
    -88.6371419930248, -88.6371418041917, -88.6372986, -88.6374376, 
    -88.6376667, -88.6379039, -88.6382885, -88.6387633, -88.6391725, 
    -88.639598, -88.6401544, -88.6408907, -88.6428788, -88.643525, 
    -88.6439176, -88.6440812, -88.6442773, -88.6442780111585, 
    -88.6442841283929, -88.6443087284197, -88.6442677273779, 
    -88.6441529950715, -88.6439155950223, -88.6434983282509, 
    -88.6433509948929, -88.6433263948953, -88.643326333542, -88.6434994, 
    -88.6437611, -88.6439903, -88.6445548, -88.6448248, -88.6450702, 
    -88.6453646, -88.6454801, -88.6457654, -88.6459533, -88.6459559520797, 
    -88.6459601290725, -88.6460173291093, -88.6460253957985, 
    -88.6459681291249, -88.6457389290808, -88.6454771290124, 
    -88.6453053289726, -88.6451249289761, -88.6448873966518, 
    -88.6446255955542, -88.6444373955094, -88.6442245287994, 
    -88.6439789277219, -88.6438723964523, -88.6433733275805, 
    -88.6432259963017, -88.6431603285981, -88.6431684997229, 
    -88.643227, -88.6433988, -88.6436442, -88.643816, -88.6439308, 
    -88.6439877, -88.644225, -88.6444213, -88.6447323, -88.6448633, 
    -88.644945, -88.6450514, -88.6450513940487, -88.6450581958712, 
    -88.6450581292162, -88.6449515958708, -88.6446731958165, 
    -88.6445915291378, -88.6445832669141, -88.6447479, -88.644928, 
    -88.6451325, -88.6453207, -88.6456071, -88.6457216, -88.645722830068, 
    -88.6457283961659, -88.6457447295192, -88.6457283295208, 
    -88.6456465295055, -88.6456301284696, -88.6455973961737, 
    -88.6455073294851, -88.6452945960843, -88.6451881960522, 
    -88.6450981960336, -88.6449753293581, -88.6449097949695, 
    -88.644705195958, -88.6446643969946, -88.6445741969942, -88.6443123292332, 
    -88.6442875959031, -88.6442875303006, -88.6442383959137, 
    -88.6439273958226, -88.6437639301563, -88.6435265290604, 
    -88.6433873956891, -88.642544395476, -88.6421597287263, -88.642077928716, 
    -88.6420695953959, -88.6421304025403, -88.6422181, -88.6423817, 
    -88.642537, -88.6425371894781, -88.6425437955909, -88.642551795615, 
    -88.6424863289439, -88.6421753288845, -88.6420279288531, 
    -88.6418805954817, -88.6414633287036, -88.6412667953228, 
    -88.6410375952778, -88.6409147963041, -88.6408655942189, 
    -88.6408407952921, -88.6407751952884, -88.6406279285913, 
    -88.6403087285184, -88.639449394952, -88.6390973948665, -88.6382135279792, 
    -88.6374603944697, -88.6368957276602, -88.6364865275646, 
    -88.6363143942047, -88.6361913942117, -88.6360517932194, 
    -88.6358467952835, -88.6356093941977, -88.6352983274631, 
    -88.6347581939929, -88.6341933928108, -88.6340131271459, 
    -88.6338821271279, -88.6338329271419, -88.6337507938056, 
    -88.6335625271066, -88.6332431937013, -88.6326373935473, 
    -88.6318599266787, -88.6314425932322, -88.6307715253322, 
    -88.6297239927359, -88.629093925891, -88.6286517934836, -88.6282261933853, 
    -88.627980392301, -88.627832725627, -88.627554392236, -88.627284326545, 
    -88.6268749264393, -88.6265557919739, -88.6261139262182, 
    -88.6259501240925, -88.625835591768, -88.6254593239374, -88.6253201249411, 
    -88.6250825905152, -88.6242603257416, -88.62377772457, -88.6224361898446, 
    -88.6215693229559, -88.6212503905924, -88.6210049915807, 
    -88.6209723895006, -88.6209971239116, -88.6209481249464, 
    -88.620800923871, -88.6201055236869, -88.6197865913158, -88.618747790019, 
    -88.6177663897823, -88.6163107227942, -88.6153783215569, 
    -88.6151329892044, -88.6148875214252, -88.6146337890534, 
    -88.6144293223252, -88.6137665888154, -88.6135539220822, 
    -88.6131447219507, -88.6129483219009, -88.6127683218594, 
    -88.6127031218734, -88.6124661228868, -88.6122453218078, 
    -88.6118445217155, -88.6111901215474, -88.6106419213972, 
    -88.6105273213684, -88.6102165213015, -88.6101757879756, 
    -88.6100613213002, -88.6097749879084, -88.6086381209778, 
    -88.6079101208312, -88.6075175874098, -88.6067077216078, 
    -88.6061105871049, -88.6045233867169, -88.6037953198701, 
    -88.6032471197181, -88.6030015196456, -88.6026331195183, 
    -88.6024327318722, -88.602296179603, -88.6022405861295, -88.6019707194136, 
    -88.6016597860091, -88.6011033858671, -88.600146185627, -88.5992709187665, 
    -88.5987307853153, -88.5981009185081, -88.5969635171714, 
    -88.5964889170505, -88.5963743180726, -88.5962517180614, 
    -88.5962273847739, -88.5961293181119, -88.5961183967256, 
    -88.5960849, -88.5960272, -88.5959575, -88.5958542, -88.5957603, 
    -88.5955834776378, -88.5954913846797, -88.5951393856234, 
    -88.5950715189383, -88.594811984493, -88.5945928883115, -88.5945506, 
    -88.5945426, -88.5945278, -88.5945319, -88.5945010996349, 
    -88.5945179845622, -88.5945099189397, -88.5943709189142, 
    -88.5941500808433, -88.5941047, -88.5940075, -88.5938278, 
    -88.593628, -88.5934992, -88.5933899, -88.5933168, -88.5929279, 
    -88.5926483, -88.5925403, -88.5922708, -88.5921823, -88.5920689, 
    -88.5919905, -88.5919344087617, -88.5918991521994, -88.5918295, 
    -88.5917611, -88.5917142, -88.5916693, -88.5916069, -88.5915908606379, 
    -88.5914941289148, -88.5914929, -88.5914908882955, -88.5914573837784, 
    -88.5913114387937, -88.5912857, -88.5911684, -88.591053, 
    -88.5910427133142, -88.5910261433423, -88.5910296, -88.5909605, 
    -88.5908995, -88.5908251, -88.5907473, -88.5906916, -88.5906386, 
    -88.5905769, -88.5904261, -88.5902752, -88.5900378, -88.5899299, 
    -88.589779, -88.5895483, -88.5894042, -88.5893498, -88.5893311, 
    -88.589262, -88.5891071, -88.5889448, -88.5886961, -88.5884795, 
    -88.5882146, -88.5876305, -88.587247, -88.5870666, -88.5867347, 
    -88.5866891, -88.5864873, -88.5863639, -88.5861828, -88.5861292, 
    -88.5860494, -88.5859414, -88.5857463, -88.5855391, -88.5853574, 
    -88.5852635, -88.5851515, -88.5848706, -88.5848453651944, 
    -88.5846777072806, -88.5846432, -88.5845777683358, -88.5841893817609, 
    -88.5840962036115, -88.5840357, -88.5838969, -88.583748, 
    -88.5836535, -88.5835623, -88.5835596, -88.5835764, -88.5835791, 
    -88.5835789131191, -88.5835181711435, -88.5834852, -88.5834396, 
    -88.5833745, -88.5833485376384, -88.5832727148241, -88.5833219148602, 
    -88.5832645825624, -88.5829945814598, -88.5829620496288, 
    -88.5828455, -88.5827462, -88.5826376, -88.5825129, -88.5824058022661, 
    -88.5823397812839, -88.5823317135856, -88.5822989135846, 
    -88.5822813310794, -88.5822326, -88.5820971, -88.5819107, 
    -88.5817777121861, -88.5815787144561, -88.5815638744953, 
    -88.5815634, -88.5814816, -88.5814662170195, -88.5813300668701, 
    -88.5813287, -88.5812977851487, -88.5812677143849, -88.5812244003187, 
    -88.5811745, -88.5811320396884, -88.5810174409412, -88.5810162, 
    -88.5809264, -88.5808137, -88.5807212, -88.5806674729347, 
    -88.5806619819467, -88.5804001808541, -88.5801668457092, 
    -88.5801646, -88.5801106304072, -88.5799583141091, -88.5798681807771, 
    -88.5798275141362, -88.5797619141293, -88.5795813374821, 
    -88.5795035, -88.5792071, -88.5785848, -88.5781634586156, 
    -88.5778057803143, -88.5773229135075, -88.576864380034, -88.5767520779041, 
    -88.5763827, -88.5762124, -88.5760877, -88.5757658, -88.5752274444437, 
    -88.5750389128919, -88.5749255635105, -88.5746741, -88.5743979, 
    -88.574393997907, -88.574302312709, -88.5737047792509, -88.5735819782138, 
    -88.5734593136283, -88.5733119792311, -88.5731145132629, 
    -88.5731131, -88.5727499509116, -88.5726081134584, -88.5721087789724, 
    -88.5720067988991, -88.5717291, -88.5715292, -88.5712955353453, 
    -88.5712081797796, -88.5708889776192, -88.5703661685962, 
    -88.5701224, -88.5695471, -88.569417, -88.5694029662801, 
    -88.5692109115326, -88.5690525161647, -88.5690227, -88.5688611, 
    -88.5687035, -88.5686599645346, -88.5685805113651, -88.5684167780211, 
    -88.5683267113392, -88.5681547113043, -88.5677209101651, 
    -88.5675686272834, -88.5674013, -88.5672008, -88.5669507, 
    -88.5669378706693, -88.5664355785725, -88.5663721473301, 
    -88.5663177, -88.5661119, -88.5659878, -88.5657047308762, 
    -88.5653578534279, -88.5653089011503, -88.5650029105109, 
    -88.564806378171, -88.5645035103781, -88.5639713768902, -88.563679680729, 
    -88.5634223, -88.5633315643824, -88.563136311036, -88.562808775558, 
    -88.5625877765613, -88.5621783764813, -88.5617527097155, 
    -88.5607857674979, -88.5605148, -88.5602682472904, -88.5601561093124, 
    -88.5593537757724, -88.5590446795764, -88.559012, -88.5588987, 
    -88.5587867, -88.5586665386757, -88.5581009754899, -88.5575115086792, 
    -88.5563651750495, -88.5556201081948, -88.5555036601987, 
    -88.5554139, -88.5553935102873, -88.5553907747947, -88.555177908063, 
    -88.5550387757349, -88.5547767079714, -88.5546395706818, 
    -88.5545837, -88.5544959, -88.55441, -88.5543485616887, -88.554277307856, 
    -88.5539743088456, -88.5535649066773, -88.5530350202324, 
    -88.5529844, -88.5528517, -88.5527886, -88.5527823702075, 
    -88.5522170007146, -88.5518975, -88.5516822, -88.5514073, 
    -88.5513537, -88.5513191166442, -88.5508871070871, -88.5500794105005, 
    -88.5500682, -88.5500535, -88.549975, -88.549798, -88.5496806, 
    -88.5495016, -88.5493266, -88.5491556, -88.5491420448612, 
    -88.5489953732959, -88.5468251728076, -88.5464569802995, 
    -88.546405, -88.5461918, -88.546, -88.5458525, -88.5456091566001, 
    -88.5455067068646, -88.5454645972404, -88.5453656, -88.545202, 
    -88.545021, -88.5448815, -88.5448238, -88.5447058, -88.5446401, 
    -88.5444872, -88.5441975, -88.5439427, -88.5438837, -88.5438113, 
    -88.5437620636372, -88.5436607322781, -88.5436571, -88.5435815656333, 
    -88.5435085042921, -88.5433145870471, -88.5432735, -88.5431542, 
    -88.5430495, -88.542957, -88.5428698, -88.5427854, -88.5427183, 
    -88.5427109817979, -88.5426809719119, -88.5424105718807, 
    -88.5424187052466, -88.5424915309459, -88.5424946496679, 
    -88.5428652162303, -88.5429031, -88.5431206, -88.5433929, 
    -88.543476, -88.5434864587684, -88.543509424704, -88.5435173, 
    -88.5435175655299, -88.543524105678, -88.5435813057249, -88.5435735188832, 
    -88.5435712, -88.5435404, -88.5434636479168, -88.5434419046776, 
    -88.542991372274, -88.5429482319488, -88.5428698, -88.5427357, 
    -88.5425131, -88.5423012, -88.5420571, -88.5419930166611, 
    -88.541377771903, -88.5401655716337, -88.5386829712865, -88.538363705576, 
    -88.5380851044624, -88.5373231709707, -88.5367089041573, 
    -88.5363319697056, -88.5352507038485, -88.5350787038077, 
    -88.5348739037468, -88.5347673037188, -88.5347673522926, 
    -88.5348031, -88.534809911246, -88.5349473704729, -88.5349555704838, 
    -88.5349145704853, -88.5347835037989, -88.5345459037445, 
    -88.5344147693315, -88.5341445702886, -88.5339071035542, 
    -88.5336777712091, -88.532858571003, -88.5325227032191, -88.5320393697653, 
    -88.5306055027832, -88.530400702754, -88.5299501026428, -88.5297699026104, 
    -88.5296551015632, -88.5295729692945, -88.5294745692832, 
    -88.5293353025876, -88.5290731025206, -88.5284015023193, 
    -88.5280165688802, -88.5278197688351, -88.5271853020168, 
    -88.5269067686089, -88.5265627685066, -88.5255961671673, 
    -88.5253013004127, -88.524924566981, -88.5245475679301, -88.5239411678099, 
    -88.5238675011255, -88.5236627010695, -88.523564302089, -88.523523167723, 
    -88.523342899983, -88.5231707676723, -88.5230723676535, -88.5229823009656, 
    -88.5227283665145, -88.5226217675306, -88.5223921008504, 
    -88.5219904997403, -88.5219983674911, -88.521932900825, -88.5217221108022, 
    -88.5217153, -88.521708531979, -88.5216213007736, -88.5213263673622, 
    -88.5212279673409, -88.52101490065, -88.5209657006372, -88.5208017672565, 
    -88.5207280995312, -88.5207035005745, -88.5207607683063, 
    -88.520785367279, -88.5207607672788, -88.5202445015248, -88.5202199004798, 
    -88.520226941072, -88.5203165, -88.5203546535769, -88.5204163672131, 
    -88.5204573005674, -88.5203753005638, -88.5203015005517, 
    -88.5201951005229, -88.5199083004316, -88.5197857218454, 
    -88.5197841, -88.519607, -88.5194877, -88.5194259659247, 
    -88.519425101337, -88.5194200978738, -88.5193791, -88.5192905, 
    -88.5192848185973, -88.5192400085341, -88.5192114, -88.5191480423899, 
    -88.5191219668631, -88.5190683277377, -88.5190505, -88.5189834, 
    -88.5189584000546, -88.5189060481517, -88.5189016, -88.5188193449731, 
    -88.51881050012, -88.5185648989989, -88.5184911000227, -88.5183845000206, 
    -88.5182369666516, -88.5179992999105, -88.5178764998775, 
    -88.5178026998688, -88.517565099806, -88.5174824148893, -88.5174827, 
    -88.5173674, -88.5170426793672, -88.5169421663232, -88.5168274996268, 
    -88.5168068123988, -88.5167357, -88.51667, -88.5165829, -88.5165143072459, 
    -88.5163603661772, -88.5162197473748, -88.5161886, -88.5160893274691, 
    -88.5159834994214, -88.5159331502767, -88.5159163, -88.5157326, 
    -88.5156620899993, -88.5156228993305, -88.5154803742571, 
    -88.5153933, -88.5152927, -88.5152853366302, -88.5149835648259, 
    -88.5147785658275, -88.5142623656951, -88.5138526989158, 
    -88.5137936453355, -88.5137102, -88.5136351, -88.513556, 
    -88.5135023, -88.5134541, -88.5134178, -88.5134514, -88.5134232, 
    -88.5133977, -88.5133559114808, -88.5132140986854, -88.5129189652832, 
    -88.512722098584, -88.5125500985474, -88.5119271661145, -88.5117714983663, 
    -88.5114765649483, -88.5111240971658, -88.5110135043483, 
    -88.5109395, -88.5109211340758, -88.5106732981062, -88.5103208980104, 
    -88.5100830969209, -88.5100622223099, -88.5100248, -88.5098978088872, 
    -88.5097635635087, -88.5095504978335, -88.5094683634522, 
    -88.5091814977651, -88.5089272977206, -88.5087714966582, 
    -88.508672897691, -88.5087137643953, -88.5086808977335, -88.5085332977053, 
    -88.5084842739646, -88.5084263, -88.5080481, -88.5077986, 
    -88.5075237, -88.5071763, -88.5071404895457, -88.5067791639721, 
    -88.5055332970071, -88.5050823635758, -88.5047134968249, 
    -88.5044021634068, -88.5039348966246, -88.5036970965768, 
    -88.5036716184995, -88.5035647, -88.5030987225534, -88.5029163419276, 
    -88.5028271, -88.5026568, -88.5023323, -88.5022719728013, 
    -88.501958695206, -88.5016389628445, -88.5015651473075, -88.5015638, 
    -88.5012567, -88.5011253, -88.5011026361608, -88.5010398961041, 
    -88.5009181956474, -88.5009, -88.5008940739246, -88.5008184971072, 
    -88.5006381626872, -88.5005733724292, -88.5004883, -88.5000443, 
    -88.49990713829, -88.4997423624403, -88.4993820956804, -88.4988252955331, 
    -88.4983993620929, -88.4979980953329, -88.4977360963117, 
    -88.4972037617961, -88.4968106950344, -88.4966060949919, 
    -88.4963603616016, -88.4959837604768, -88.4956315614286, 
    -88.4955936266868, -88.4955684, -88.4954886, -88.4954641480868, 
    -88.4954185613692, -88.4952311986276, -88.4951855, -88.4950045, 
    -88.4950015406202, -88.494910960218, -88.494767366419, -88.4947322, 
    -88.4946468966825, -88.494370494449, -88.4942882416586, -88.4942561, 
    -88.4941980049851, -88.4941493610638, -88.4941124060263, 
    -88.4941086, -88.4940990174835, -88.4939938954199, -88.4939530933489, 
    -88.4937893599841, -88.4934699609477, -88.4929948941582, 
    -88.4926999607435, -88.4922413606198, -88.4920201605655, 
    -88.4917827605195, -88.4914223614663, -88.4910209613528, 
    -88.4906524935454, -88.4903902934825, -88.4900218934018, 
    -88.4897187589496, -88.4894639245997, -88.4893222, -88.4892391774711, 
    -88.4891863598464, -88.4890734025243, -88.4889118, -88.4886289, 
    -88.488531, -88.4884371, -88.4883472, -88.4882559, -88.4881809, 
    -88.4881085, -88.4880616, -88.4880643, -88.4880388, -88.4879932, 
    -88.4880106, -88.4878604, -88.4878685, -88.4878631, -88.4878162, 
    -88.4877704, -88.4877142, -88.4877236, -88.4876955, -88.4876154, 
    -88.4875788, -88.487552, -88.4875227, -88.4873055, -88.4871799, 
    -88.4870604, -88.4868974, -88.4868157, -88.4867245, -88.4866313323734, 
    -88.4861070935189, -88.4858204924077, -88.4853698922839, 
    -88.4849602921596, -88.4847881587637, -88.484583157636, -88.4844475872462, 
    -88.4844393, -88.4840852, -88.4839844611778, -88.4837059583434, 
    -88.4835995583013, -88.4835584916036, -88.4836074916037, 
    -88.4836653662082, -88.4836621, -88.483876, -88.4840974, 
    -88.4843776, -88.4846833, -88.4849167, -88.4851012, -88.4853351, 
    -88.4853968, -88.4855416, -88.4856715064077, -88.4856075276025, 
    -88.4856055822317, -88.4854171586599, -88.48519504056, -88.4851546, 
    -88.4849272, -88.4848620237533, -88.4848356918315, -88.4848301617624, 
    -88.4846881, -88.4846884, -88.4846065963365, -88.4845814917311, 
    -88.4844750917031, -88.484417691702, -88.4842540927105, -88.4840781794193, 
    -88.4830001, -88.4829280461775, -88.4827795579647, -88.4826486912859, 
    -88.482697958002, -88.4826080913158, -88.4824522912651, -88.4822130077488, 
    -88.4820599941843, -88.4819643731899, -88.4819438215351, 
    -88.4819406957911, -88.4820376, -88.4819363111558, -88.4819360911102, 
    -88.4819193538607, -88.4818452, -88.4816127, -88.4815991545039, 
    -88.4814036920129, -88.480936957545, -88.4806747574821, -88.4803553573974, 
    -88.4800685573278, -88.4797164916304, -88.4795690905522, 
    -88.4793396904879, -88.4790939581309, -88.4787580903469, 
    -88.4787827580796, -88.4788319570699, -88.4787337570611, 
    -88.478398090318, -88.4780211568854, -88.4775870901085, -88.4769072910005, 
    -88.4764403565334, -88.4763094898504, -88.4761127564678, 
    -88.4759571564205, -88.4756211563222, -88.4753918896037, 
    -88.4751215562167, -88.4748757561589, -88.4746791561096, 
    -88.474457956042, -88.4741549559715, -88.4738435558967, -88.4736640556707, 
    -88.4737224, -88.473919, -88.4741403, -88.474142043426, -88.4741470893867, 
    -88.4741963560961, -88.4741227561167, -88.4740575551341, 
    -88.4739593551262, -88.4735252894084, -88.4731237559816, 
    -88.472812489236, -88.4725994902092, -88.4724846891187, -88.4723616890822, 
    -88.4720340900482, -88.4717636889328, -88.471345755475, -88.4710508887336, 
    -88.4709607564241, -88.4709772877059, -88.4707888887209, 
    -88.4706086876367, -88.4705430886581, -88.4704201552758, 
    -88.4702397552233, -88.4699859551597, -88.4697238884452, 
    -88.4694452883847, -88.469199554987, -88.4687979548633, -88.4685275547887, 
    -88.4684210881108, -88.468249088065, -88.4680522880041, -88.4679130869218, 
    -88.4676918879208, -88.467503354534, -88.467306754469, -88.466970688739, 
    -88.4668887543352, -88.4668395543158, -88.4667084886561, 
    -88.4665528875887, -88.4664217531839, -88.4661677541619, 
    -88.4659383551367, -88.4654056872692, -88.4651761538789, 
    -88.4650288871874, -88.4648977538577, -88.4647585538388, 
    -88.4646275538116, -88.4643816870787, -88.4640784869822, 
    -88.4638244869152, -88.4634311534875, -88.4631116867544, 
    -88.462882152325, -88.4626117532937, -88.4624070865745, -88.4621858865593, 
    -88.4622434866322, -88.462038687653, -88.4616944865231, -88.4614814864746, 
    -88.4613094853996, -88.4611701530865, -88.4610472863901, 
    -88.4607359529728, -88.4603344862085, -88.4602196861871, 
    -88.4601213538816, -88.4601428028868, -88.460295, -88.4603002650535, 
    -88.4603017529084, -88.4603918862922, -88.4603674873538, 
    -88.4602445519232, -88.4601953529638, -88.4601052862751, 
    -88.459933152891, -88.4598102861979, -88.4597529518134, -88.459671086184, 
    -88.4595317528183, -88.4593678861067, -88.4592612871228, 
    -88.4592285517094, -88.4587449526345, -88.4586385526075, 
    -88.4585401525744, -88.4585372330548, -88.4585334, -88.4584870117453, 
    -88.4583761514569, -88.4582123535053, -88.4581057524381, 
    -88.4579419513373, -88.4577779523282, -88.4576960856537, 
    -88.4577111867363, -88.4578122, -88.4578187376746, -88.4578189523776, 
    -88.4578600867737, -88.4577534857233, -88.4573929522948, 
    -88.4571881522556, -88.457016085559, -88.4567701521561, -88.4561882852991, 
    -88.4559915529506, -88.4557866841622, -88.4555080861717, 
    -88.4554098851171, -88.4554179518188, -88.4554016851546, 
    -88.4552787517882, -88.4550491517112, -88.4548607516745, 
    -88.4546968860004, -88.454524684897, -88.4543361525469, -88.4540411514188, 
    -88.4535821513158, -88.4533200845988, -88.4532298835442, 
    -88.4532523360089, -88.453469, -88.4534690067598, -88.4534757513546, 
    -88.4534758838218, -88.45351, -88.453715, -88.4537478, -88.4537464647783, 
    -88.4537545514727, -88.4536233514421, -88.45318908466, -88.4530579512894, 
    -88.4529104845679, -88.4526644855441, -88.4522957510757, 
    -88.4520251510052, -88.4518367499085, -88.4517711498848, 
    -88.4516891508902, -88.4515826841897, -88.4514269508156, 
    -88.4511319507417, -88.4503779505706, -88.4498697504423, 
    -88.4498288837804, -88.4497140837466, -88.4496813504064, 
    -88.4496977504232, -88.4495665503909, -88.4494600837004, 
    -88.449447755023, -88.4496009, -88.4498221, -88.4498877, 
    -88.4498818061521, -88.4498944838317, -88.4498370838223, 
    -88.4497141504575, -88.4494600837229, -88.449304349313, -88.4492589534494, 
    -88.4493632, -88.4496419, -88.4498387, -88.4503385, -88.4506664, 
    -88.4509614, -88.4511582, -88.4513057, -88.4513060965815, 
    -88.4513124843263, -88.4513289510222, -88.4512388843577, 
    -88.4509684842897, -88.4505995508529, -88.4505504841811, 
    -88.4505503508636, -88.4503782841536, -88.4503994299051, 
    -88.4505109, -88.4510764, -88.4513306, -88.4514043, -88.4515027, 
    -88.4516419, -88.4521665, -88.452601, -88.4528961, -88.4532485, 
    -88.4540598, -88.4543548, -88.4544942, -88.4551743, -88.4560348, 
    -88.4564693, -88.456797, -88.4569854, -88.4573051, -88.4583785, 
    -88.4591406, -88.4595668, -88.4600011, -88.4605501, -88.4610581, 
    -88.4614842, -88.462025, -88.4620659, -88.4621888, -88.4624919, 
    -88.4629099, -88.4640979, -88.4646879, -88.4651385, -88.4657367, 
    -88.4659251, -88.4659317090246, -88.4659318879529, -88.4659646869281, 
    -88.4659484890214, -88.4658910869328, -88.4658962132998, 
    -88.466212, -88.4663514, -88.466302, -88.4663102, -88.4665805, 
    -88.4670475, -88.4677277, -88.4684815, -88.4692435, -88.4696449, 
    -88.4697622, -88.4698577, -88.4701035, -88.4706689, -88.4714472, 
    -88.4720618, -88.4728566, -88.4731269, -88.4732828, -88.473373, 
    -88.4733731739043, -88.4733797564873, -88.4733875298088, 
    -88.4735042, -88.473578, -88.4737992, -88.4742662, -88.4746103, 
    -88.4748069, -88.4750608, -88.4756182, -88.4763392, -88.4766998, 
    -88.4776255, -88.4782072, -88.4785267, -88.4786249, -88.478764, 
    -88.479157, -88.4791646486897, -88.4791718912712, -88.479138956866, 
    -88.479048757873, -88.4788767578181, -88.4786308910827, -88.478458891037, 
    -88.4783440909981, -88.4781719575956, -88.4780954288549, 
    -88.4780831, -88.4781158, -88.4782795, -88.4789921, -88.4798194, 
    -88.4808247, -88.4814489, -88.4821869, -88.4836221, -88.4849305, 
    -88.485276, -88.4859263, -88.4862021, -88.4862712, -88.4865497, 
    -88.4868385, -88.4870155, -88.4872355, -88.4875748, -88.4879382, 
    -88.4883191, -88.4886302, -88.4889346, -88.4892337, -88.4894657, 
    -88.4896655, -88.4897889, -88.4898131, -88.4898238, -88.4897836, 
    -88.4896441, -88.4894899, -88.4894845, -88.4895301, -88.4895971, 
    -88.4897475, -88.4897948945572, -88.48982665944, -88.489862, 
    -88.4899083, -88.489978, -88.4900303, -88.4900048, -88.4900157598636, 
    -88.49022129389, -88.490243873488, -88.4902718, -88.4902796195098, 
    -88.4901801594747, -88.4901822267746, -88.4901734, -88.4901913, 
    -88.4902961, -88.4906217, -88.4907961, -88.490953, -88.4910844, 
    -88.4912298, -88.4912699663266, -88.4913431597606, -88.4913310469136, 
    -88.491291, -88.4911783, -88.49113, -88.4911019, -88.4911689, 
    -88.4913661, -88.4915538, -88.4917385487709, -88.4917765608072, 
    -88.4923744932598, -88.4927962590975, -88.4929165, -88.4931645, 
    -88.4933858, -88.4935239, -88.4936902, -88.4938189, -88.4940429, 
    -88.494236, -88.4945874, -88.4948261, -88.4952955, -88.4955423, 
    -88.4959674, -88.4961672, -88.4965937, -88.4968056, -88.497173, 
    -88.4975204, -88.4981065, -88.4984444, -88.4987837, -88.4992518, 
    -88.4998452, -88.4999505, -88.5001503, -88.5003193, -88.5004494, 
    -88.5006049, -88.5007793, -88.5008812, -88.5010676, -88.5013358, 
    -88.5015705, -88.5018709, -88.5022357, -88.5024516, -88.502622, 
    -88.5029478, -88.5032147, -88.5034803, -88.5036761, -88.5039912, 
    -88.504179, -88.5043895, -88.5046604, -88.5048173, -88.5050493, 
    -88.5051702, -88.5052961, -88.505504, -88.5056701, -88.506082, 
    -88.5063234, -88.506495401263, -88.5067511644324, -88.5080844770244, 
    -88.5082854, -88.5086214, -88.5086728117581, -88.5091282993643, 
    -88.5094644983842, -88.5097020984395, -88.5100462985311, 
    -88.5107345654042, -88.511447498925, -88.5121029657864, -88.5122586991588, 
    -88.5123133231786, -88.5123093, -88.5123116986283, -88.5122507657763, 
    -88.5122918980598, -88.5124230991187, -88.5128574992207, 
    -88.5143737662494, -88.5155947665583, -88.5159390999733, 
    -88.5164061001038, -88.5169549658937, -88.5172007670015, 
    -88.5176058687805, -88.517653, -88.5177523, -88.5177733583614, 
    -88.5178973671564, -88.5182907005981, -88.519003567458, -88.5190268433969, 
    -88.5191108, -88.5193536, -88.5194450514442, -88.5197327676522, 
    -88.5199211677047, -88.5201526196442, -88.5202079, -88.5205016, 
    -88.5205346623586, -88.5207731679794, -88.5214121681581, 
    -88.5218301693042, -88.5221293294793, -88.5221323, -88.5221162, 
    -88.5222222, -88.5223875386009, -88.5225431694624, -88.5228463018262, 
    -88.5232641686056, -88.5233090319109, -88.5233594, -88.5234399, 
    -88.5235499, -88.5236673, -88.5237050937553, -88.5239361677153, 
    -88.5242475021825, -88.5245669689498, -88.5247961690383, 
    -88.5249355034623, -88.5251977025002, -88.5253451025408, 
    -88.5257055692966, -88.5268283029008, -88.5269511706372, 
    -88.5271233029604, -88.5270989029186, -88.5271238848162, 
    -88.5271331, -88.5273211, -88.5276255, -88.5277636, -88.5277827889103, 
    -88.5278607697779, -88.5279919042051, -88.5281311032116, 
    -88.5281772526098, -88.5282035, -88.5283108, -88.5284261, 
    -88.5284127, -88.5285079, -88.5287185, -88.5289881, -88.5292389, 
    -88.5295098, -88.5300167, -88.5304418, -88.5310413, -88.5315697, 
    -88.5319532, -88.532259, -88.5322651301409, -88.5323507042761, 
    -88.5326949043543, -88.5328266715387, -88.5328491, -88.5331797, 
    -88.5332482173531, -88.5335141712213, -88.5335745206689, 
    -88.5337141, -88.5339206, -88.5341465, -88.5344168, -88.5346864, 
    -88.5348433, -88.5350941, -88.5352729800326, -88.5358409728106, 
    -88.535972106177, -88.5363650019285, -88.5366485, -88.5368362, 
    -88.5370682, -88.5371531, -88.5372022, -88.5372011434038, 
    -88.5372089721583, -88.5371925721615, -88.5369385710754, 
    -88.536799172104, -88.5367909054581, -88.536766171108, -88.5364959054293, 
    -88.5363811043805, -88.5362663710259, -88.5360451053507, 
    -88.5357419052727, -88.5346603716888, -88.5338493714936, 
    -88.5332839713545, -88.5326695045175, -88.5318421709322, 
    -88.5317275042334, -88.5313015041407, -88.5309901040651, 
    -88.5309325707265, -88.53096510519, -88.5308829708105, -88.5307519041207, 
    -88.5305551707415, -88.5300799706228, -88.5295883038497, 
    -88.528219902472, -88.5279823711584, -88.5274581689111, -88.5270073698357, 
    -88.5263847686163, -88.5260405685297, -88.5255325694475, 
    -88.525253969377, -88.5249835692991, -88.5248689026036, -88.5247459025856, 
    -88.5245327692046, -88.5236641012924, -88.5229595032042, 
    -88.5227545677391, -88.5226889021071, -88.5227040287755, 
    -88.5228459, -88.5228488229152, -88.5228527011429, -88.5228935688764, 
    -88.5228197022161, -88.5226393011402, -88.5220083020349, 
    -88.5212705685273, -88.5211231018216, -88.520910169464, -88.5204433026445, 
    -88.5202139004884, -88.5200745681636, -88.5200579681751, 
    -88.5200742674843, -88.5201739, -88.5201741414313, -88.5201807015791, 
    -88.5202053015967, -88.520172368269, -88.5200331015801, -88.5197297681887, 
    -88.519295300385, -88.518311767868, -88.5180495000935, -88.5174347010015, 
    -88.517041368608, -88.5157381672437, -88.5153119661034, -88.5151563004502, 
    -88.5150659671089, -88.5148609670813, -88.5147051670498, 
    -88.5141067658595, -88.5136643001066, -88.513287301054, -88.5128610999121, 
    -88.5125658998507, -88.5124675665094, -88.5122707664743, 
    -88.5120247664207, -88.5117378996835, -88.5112952995664, 
    -88.5110331661536, -88.5108118994142, -88.5105169660011, 
    -88.5101480992487, -88.5097955658203, -88.5089762989207, 
    -88.5086729644651, -88.508336965421, -88.5079270997025, -88.5076401652519, 
    -88.5070335661399, -88.5066564983473, -88.506566098341, -88.5065742048033, 
    -88.5067475, -88.5067471898808, -88.5067542984444, -88.5066664240855, 
    -88.5067391, -88.5069275, -88.5070666, -88.5071976, -88.5071981760643, 
    -88.5072043653189, -88.507220698674, -88.5072042986806, -88.5070893653325, 
    -88.5067203641999, -88.5064500984928, -88.5061305661022, 
    -88.5057698972538, -88.5054420982081, -88.5050486980954, 
    -88.5043602979089, -88.503950497802, -88.5030079642008, -88.5026474974216, 
    -88.5024670963282, -88.5021638972885, -88.5017949638584, 
    -88.5011964970556, -88.5007291625708, -88.5003356968431, 
    -88.5000733644894, -88.4995530966614, -88.4992828965952, 
    -88.4991353632296, -88.4988241621158, -88.4978578962542, 
    -88.4970552950191, -88.4966703626424, -88.4961707635611, 
    -88.4957039624066, -88.4953681623151, -88.4950240955677, 
    -88.4949340955515, -88.4949023936406, -88.4950259, -88.4958867, 
    -88.4958892996846, -88.4958934959405, -88.4959345626365, 
    -88.4959345735406, -88.495952, -88.495934652055, -88.4959346959925, 
    -88.4958924143864, -88.4958568, -88.4956595174421, -88.4955990959278, 
    -88.4942066955917, -88.4939282965622, -88.4936905621144, 
    -88.4935757620763, -88.4934609620274, -88.4933134963492, 
    -88.4932233619505, -88.4931496942277, -88.4930676952448, 
    -88.4928298941028, -88.4927069617738, -88.4926579617795, 
    -88.492502361743, -88.4923466950366, -88.4917894948673, -88.491371560357, 
    -88.4910028946195, -88.4904129611235, -88.489601960919, -88.4880702938715, 
    -88.4877671604668, -88.4871856947, -88.486505760167, -88.4859897610823, 
    -88.4856375599624, -88.4853590921837, -88.4851131598225, 
    -88.4848346930846, -88.4846217597037, -88.4843187596332, 
    -88.4837124928213, -88.4829916926465, -88.4822133601554, 
    -88.4818610934022, -88.4814678933171, -88.4810583578086, 
    -88.4807446062768, -88.4806134, -88.4805403657046, -88.4804930920344, 
    -88.4801162919402, -88.4793052917649, -88.4785353582607, 
    -88.4780437571135, -88.4773719579938, -88.4767903578453, 
    -88.4763723577325, -88.4759628909649, -88.475544957538, -88.4750780907642, 
    -88.4748164123184, -88.4747512, -88.4746682769691, -88.4744716906139, 
    -88.4740211571852, -88.4739286616952, -88.4737863, -88.4731963230376, 
    -88.4730752425899, -88.4726702, -88.4724990195067, -88.4723332901092, 
    -88.4720875556964, -88.4717270899806, -88.471415757605, -88.4711290908862, 
    -88.4708176887381, -88.4700310895845, -88.4697689561983, 
    -88.4697772905892, -88.4698359639432, -88.4698524, -88.4701885, 
    -88.4704588, -88.4705408, -88.4705417760872, -88.4705475553996, 
    -88.4705640887547, -88.4705395564697, -88.470391956444, -88.4701708897271, 
    -88.4697611552469, -88.4695233562249, -88.4693432895183, 
    -88.4692859561823, -88.4693429972022, -88.4693529, -88.4695414, 
    -88.4698939, -88.4704921, -88.4705905, -88.4705899945742, 
    -88.470597289916, -88.4705726899343, -88.4703843565802, -88.4700074898235, 
    -88.4694175563549, -88.4685981572128, -88.4682048894127, 
    -88.4677378893081, -88.4669347547426, -88.4661891556284, 
    -88.4648535553548, -88.4642308895986, -88.4637228884622, 
    -88.4635180884296, -88.4632476883659, -88.4627722882469, 
    -88.462542889245, -88.4622807548297, -88.4621741558475, -88.4620347547652, 
    -88.4619773558024, -88.4619939558226, -88.4620594881479, 
    -88.4618300880893, -88.4617152880721, -88.461715487228, -88.4618481, 
    -88.4620449, -88.462217, -88.4622745, -88.4622745420298, 
    -88.462281288321, -88.4622975550178, -88.4621173550003, -88.4619453549787, 
    -88.461748688257, -88.461617488213, -88.4611091546954, -88.4606910879008, 
    -88.4602485544479, -88.4599288876997, -88.4595765553539, 
    -88.4593306875978, -88.4590848864975, -88.4586585540912, 
    -88.4581339539412, -88.4577979538571, -88.4569374869947, 
    -88.456552286902, -88.4558063533968, -88.4555850866891, -88.4554704866786, 
    -88.4554622866936, -88.4555032867222, -88.4555115534165, 
    -88.4553229533797, -88.4551425543771, -88.4550934866637, 
    -88.4551098866838, -88.4550607533461, -88.4549378866463, 
    -88.4547000865643, -88.4539785530056, -88.4537409519028, 
    -88.4536507529366, -88.4536747432825, -88.4537588, -88.453972, 
    -88.4544721, -88.454636, -88.4546393570581, -88.4546427522534, 
    -88.454675553316, -88.4546839533412, -88.4545774877057, -88.4542986855777, 
    -88.4539626875878, -88.4532331530418, -88.4514625526316, 
    -88.4510363525254, -88.4506427524317, -88.4500854866599, 
    -88.4494050854324, -88.4492247520615, -88.4490279520289, 
    -88.448823085333, -88.4486836853032, -88.4484869519197, -88.448331152918, 
    -88.4481180851537, -88.4474950839598, -88.4469457515396, 
    -88.4466423514614, -88.4461095513005, -88.4459619523072, 
    -88.4455684845019, -88.4453717511243, -88.4450191510384, 
    -88.4445928842713, -88.4441337508365, -88.4438386851351, 
    -88.4434286839897, -88.4433218077938, -88.4431043858805, 
    -88.4429122838772, -88.4426006838299, -88.4424366838083, 
    -88.4421825504212, -88.4414364835658, -88.4408297500811, 
    -88.4403214832803, -88.4397393498015, -88.4389932840028, 
    -88.4377223504024, -88.4374189492925, -88.4369024824883, 
    -88.4366237490978, -88.4363530823789, -88.4362300834058, 
    -88.4360660823333, -88.4351558821212, -88.434393348615, -88.4340325495882, 
    -88.4335897494885, -88.4331469483496, -88.4327204815782, 
    -88.4319742813911, -88.4309246800824, -88.4302358809598, 
    -88.4296044808325, -88.4292271484772, -88.4285874806306, 
    -88.4282512815956, -88.4279969471777, -88.4278493471452, 
    -88.4275131470644, -88.4271604803017, -88.4269636792182, 
    -88.4268488802276, -88.426725880187, -88.4266766791342, -88.426676547905, 
    -88.4266109468581, -88.4265126791218, -88.4263567467893, 
    -88.4262911467856, -88.4263156791183, -88.4261762811751, 
    -88.426020480091, -88.4259220800588, -88.42569254663, -88.425626879943, 
    -88.4255202788867, -88.4254136799103, -88.425167546514, -88.4250937465036, 
    -88.4250854809012, -88.4250281454725, -88.4248394808408, 
    -88.4246918797733, -88.4245687464085, -88.4244129463543, 
    -88.4243310796631, -88.4242981463245, -88.4243309463464, 
    -88.4243474796983, -88.4242899453121, -88.4239290795869, 
    -88.4237323462034, -88.4236911462165, -88.423461679492, -88.4232483460967, 
    -88.423018679373, -88.422748079315, -88.422567679264, -88.4224035459007, 
    -88.4223296792445, -88.4224034792983, -88.4225264783199, 
    -88.4225504678011, -88.4227164, -88.4227984, -88.4227988480947, 
    -88.4228051451414, -88.42283787954, -88.4227476784779, -88.4226410805432, 
    -88.4225179461341, -88.4224441461196, -88.4224719328056, 
    -88.4226506, -88.4226506, -88.4226573462016, -88.4226573451683, 
    -88.422468680544, -88.4223784805427, -88.4223537461918, -88.4223996489505, 
    -88.4225356, -88.4228307, -88.4233064, -88.4243399, -88.4250698, 
    -88.4253568, -88.4255373, -88.4256767, -88.4257997, -88.4258735, 
    -88.4260128, -88.4262344, -88.426587, -88.426792, -88.4269725, 
    -88.4275629, -88.4285881, -88.4290145, -88.429195, -88.4295968, 
    -88.4301791, -88.4306056, -88.4315486, -88.4321719, -88.4333119, 
    -88.4338203, -88.4341811, -88.4362723, -88.4367397, -88.4375023, 
    -88.4378303, -88.4381338, -88.4385765, -88.4394622, -88.439946, 
    -88.4401099, -88.4401143527293, -88.4401166853202, -88.4401658843089, 
    -88.4401413509771, -88.4401479487416, -88.4402658, -88.4403477, 
    -88.4404543, -88.4406593, -88.4418402, -88.4419045092626, 
    -88.4418714837075, -88.4418704647479, -88.4418647, -88.4418565, 
    -88.4419221, -88.442332, -88.4425781, -88.4426846, -88.4427912, 
    -88.4432176, -88.4434883, -88.4436194, -88.4438899, -88.4443655, 
    -88.4447509, -88.4451445, -88.4454397, -88.4459562, -88.4465548, 
    -88.4471862, -88.4476452, -88.4479732, -88.4481782, -88.4481536, 
    -88.4480961, -88.4481207, -88.4483421, -88.4485224, -88.4485963, 
    -88.4486003988524, -88.4486030852598, -88.4486499017249, 
    -88.4486947, -88.4488832, -88.4490063, -88.44908, -88.4490143, 
    -88.4489898, -88.4491947, -88.4493259, -88.4494078, -88.4494121018164, 
    -88.4494145531453, -88.4494556854623, -88.4493519881416, 
    -88.4494244, -88.4497276, -88.4498753, -88.4500556, -88.4502524, 
    -88.4504081, -88.4505147, -88.4507197, -88.4509903, -88.4520478, 
    -88.4522035, -88.4521871, -88.4522445, -88.452433, -88.4528347, 
    -88.4530889, -88.4532446, -88.453302, -88.4534577, -88.4540725, 
    -88.4548431, -88.4551054, -88.4553678, -88.4556138, -88.4557203, 
    -88.4558597, -88.4560236, -88.4564089, -88.4566221, -88.4567777, 
    -88.4575236, -88.4582041, -88.4589582, -88.4592615, -88.4595485, 
    -88.4597863, -88.459901, -88.4600485, -88.4604666, -88.4607863, 
    -88.4610486, -88.4611879, -88.4616306, -88.4618929, -88.4621225, 
    -88.4622864, -88.4624831, -88.4628438, -88.4629503, -88.4630979, 
    -88.4634503, -88.4637618, -88.4644912, -88.4651305, -88.4655731, 
    -88.4661632, -88.4668189, -88.4671631, -88.4675565, -88.4681057, 
    -88.4683762, -88.4687368, -88.4691384, -88.4698105, -88.4708432, 
    -88.4716711, -88.4719581, -88.4722203, -88.4726545, -88.4731627, 
    -88.4738265, -88.4744658, -88.4748675, -88.4753101, -88.475892, 
    -88.4762444, -88.4768016, -88.4773262, -88.4776538, -88.4782274, 
    -88.4784866, -88.4783801, -88.478644, -88.478957, -88.4791369, 
    -88.4793243, -88.4796907, -88.4804022, -88.4809261, -88.4813245, 
    -88.4815788, -88.482005, -88.4823246, -88.4825702, -88.4828076, 
    -88.4833238, -88.4837088, -88.4839548, -88.4841516, -88.4843156, 
    -88.484455, -88.4847007, -88.4849628, -88.4853642, -88.48579, 
    -88.486265, -88.4870187, -88.4878868, -88.4889763, -88.4893695, 
    -88.4908031, -88.4927854, -88.4936291, -88.4940224, -88.4945548, 
    -88.4958653, -88.4979866, -88.4987238, -88.4995182, -88.500069, 
    -88.5013158, -88.5032592, -88.5040467, -88.5049734, -88.5055473, 
    -88.5065067, -88.5085647, -88.5103929, -88.5117947, -88.5124669, 
    -88.5136556, -88.5143442, -88.5152132, -88.5155411, -88.517246, 
    -88.5191478, -88.5198118, -88.520279, -88.520779, -88.5209266, 
    -88.5212544, -88.5214101, -88.5215166, -88.5215249, -88.5215824, 
    -88.5218119, -88.522238, -88.5228036, -88.5240739, -88.5247296, 
    -88.5258114, -88.5261638, -88.5273111, -88.5274996, -88.5276471, 
    -88.5279418, -88.5281058, -88.5282369, -88.5285156, -88.5287533, 
    -88.5289581, -88.5290318, -88.5290287470775, -88.52903857235, 
    -88.5289811723406, -88.5286533722516, -88.5283173044734, 
    -88.5280141054454, -88.5279422023373, -88.5281627, -88.5281650526895, 
    -88.5281695055353, -88.5282103722305, -88.5281611722428, 
    -88.5280053055529, -88.5276611054639, -88.526874171937, -88.5262595051234, 
    -88.5256447049864, -88.5246037047324, -88.522849504301, -88.5221281707928, 
    -88.5210051705243, -88.5208575704944, -88.5208575038377, 
    -88.5208770741627, -88.5210309, -88.5213669, -88.5220637, 
    -88.5224653, -88.5229981, -88.5233752, -88.5235473, -88.5237193, 
    -88.5237202948911, -88.5237261046202, -88.5237425046403, 
    -88.5236029723263, -88.5234553712515, -88.5224471710035, 
    -88.5221355709379, -88.5212667040689, -88.5211435707124, 
    -88.5211506795259, -88.5211941, -88.5215383, -88.5220055, 
    -88.5220874, -88.5221284, -88.5221286744956, -88.5221351710146, 
    -88.5221512264353, -88.5221938, -88.5223659, -88.5226035, 
    -88.5228494, -88.5238576, -88.5248658, -88.5249314, -88.5250214, 
    -88.5250787, -88.5255378, -88.5280048, -88.5288653, -88.5293244, 
    -88.5295129, -88.5297998, -88.5301114, -88.5302179, -88.5306113, 
    -88.5309392, -88.5312259, -88.5314554, -88.5315456, -88.5316276, 
    -88.5316240232299, -88.5316343735374, -88.5315523735354, 
    -88.5313801734996, -88.5312653734732, -88.5305523743233, 
    -88.5302081075793, -88.5297489731147, -88.5294949063885, 
    -88.529208106319, -88.5283885061044, -88.5277081726079, -88.5273065058353, 
    -88.526716305695, -88.5260441065962, -88.5255519710956, -88.5253633710514, 
    -88.5246421052473, -88.5238879050688, -88.523387771614, -88.5220599046154, 
    -88.5216335711859, -88.5211335043961, -88.5189527705318, 
    -88.5175917712538, -88.5170425034087, -88.5164029709674, 
    -88.5158701031407, -88.5156569697564, -88.5153455029999, 
    -88.5152307040119, -88.5151649696383, -88.514976302939, -88.5140907683624, 
    -88.5130411014624, -88.5120899022905, -88.5116225021816, 
    -88.5111961687437, -88.510655101937, -88.5101221684511, -88.5095561673193, 
    -88.5088835682311, -88.5084407681289, -88.508178301391, -88.5079161023565, 
    -88.5077109679338, -88.5072353011707, -88.5068827010882, 
    -88.5066367010195, -88.506448166586, -88.5063417665439, -88.5062679675627, 
    -88.5058497674523, -88.505505566314, -88.5053989683644, -88.5049647005114, 
    -88.5047435014712, -88.5045633003536, -88.5044813669815, 
    -88.5044817127656, -88.5044746, -88.5045322, -88.5046143, 
    -88.5048111, -88.5048523, -88.5048363498212, -88.5046952992333, 
    -88.5046945875642, -88.5046885, -88.5046743899093, -88.5044905002057, 
    -88.5042201001261, -88.5038099000266, -88.5035312999411, 
    -88.5031375654808, -88.5026210997225, -88.5025718997157, 
    -88.5025552997314, -88.5021042996225, -88.5017022985014, 
    -88.5010789660609, -88.5000792991694, -88.4992602979484, 
    -88.4985066988277, -88.4977040976177, -88.4973517652462, 
    -88.4969912984929, -88.496934098491, -88.4969587651771, -88.4969506985187, 
    -88.4968360984966, -88.4967623641146, -88.49675486327, -88.4968705, 
    -88.4972555, -88.4978455, -88.4990745, -88.5000658, -88.5004966, 
    -88.5008573, -88.501095, -88.5012343, -88.5013653, -88.5014799, 
    -88.5014801372415, -88.5014866997846, -88.5015601675458, 
    -88.5014945008822, -88.5011498997721, -88.5007313663635, 
    -88.5000752985153, -88.4995745661301, -88.4992469660604, 
    -88.4985915659101, -88.4974038989825, -88.4966749644628, 
    -88.4958640986635, -88.4952823651968, -88.4947417650886, 
    -88.4940291638931, -88.4934309647971, -88.4930460980471, 
    -88.492087365527, -88.4910878986301, -88.4904651641015, -88.4902602973722, 
    -88.4901782973493, -88.4899567639339, -88.4896451627682, 
    -88.4896420721528, -88.4896384, -88.4895644, -88.4895643, 
    -88.4896134, -88.4897281, -88.4909404, -88.4923819, -88.4931027, 
    -88.4931845, -88.4931682902256, -88.4930351643251, -88.4928465632234, 
    -88.4925106975077, -88.4921992974272, -88.4918797640191, 
    -88.4914947639249, -88.491093163818, -88.4908964970938, -88.4906095636741, 
    -88.4898965634774, -88.4894294966794, -88.4892655632961, 
    -88.4892245632809, -88.4892197770529, -88.4892178, -88.4891849, 
    -88.4891684, -88.4891076870011, -88.4889536964786, -88.4884374963403, 
    -88.4881505629357, -88.4874788971503, -88.4870199626598, 
    -88.4868642969991, -88.4867003625733, -88.4866955321194, 
    -88.4866936, -88.4866078001473, -88.4864787635162, -88.4862084957375, 
    -88.4859870946273, -88.4857248966419, -88.485257762159, -88.4841924952258, 
    -88.4836599617659, -88.4822012947217, -88.4817342946229, 
    -88.4816280316922, -88.481094, -88.4808058446996, -88.4805952943486, 
    -88.48018556092, -88.4799165579114, -88.4798857, -88.4795272, 
    -88.4791894, -88.4791125859771, -88.4789480939293, -88.4787733058272, 
    -88.4787669, -88.4785315, -88.4784061, -88.4781753, -88.4781687029274, 
    -88.478153293754, -88.4779320937038, -88.4775139602627, -88.47637495999, 
    -88.4758257598507, -88.4754734941425, -88.4753177597384, 
    -88.4752851717776, -88.475344, -88.4753439222542, -88.4753507587321, 
    -88.4753261608178, -88.4750147596988, -88.4750065597063, 
    -88.4750245669057, -88.475254, -88.4756474, -88.4759588, 
    -88.476008, -88.4761557, -88.4763605, -88.4765408, -88.4767539, 
    -88.4768769, -88.4768728731589, -88.4768836946229, -88.4767608925266, 
    -88.476318360122, -88.4759248944002, -88.4757282933235, -88.4756546943749, 
    -88.4754580922683, -88.4751138932442, -88.4745237587131, 
    -88.4739910939931, -88.4738863006828, -88.4735439, -88.4730597, 
    -88.4727987, -88.4724868, -88.4721979, -88.471826, -88.4716660904083, 
    -88.4713274912883, -88.4707292911513, -88.4699753586988, 
    -88.4692050929344, -88.4684837584028, -88.4683525573363, 
    -88.4683654452738, -88.4684526, -88.4684466226611, -88.4684593584228, 
    -88.4683199583888, -88.4682543594243, -88.468254358517, -88.4684034, 
    -88.4685757, -88.4689692, -88.4694855, -88.4703051, -88.4708543, 
    -88.4713051, -88.4716657, -88.471969, -88.4723706, -88.4728215, 
    -88.4734855, -88.4742641, -88.4752395, -88.4759116, -88.4763052, 
    -88.4770265, -88.4776822, -88.478551, -88.4791657, -88.4796001, 
    -88.4800345, -88.4802395, -88.4802886, -88.4804034, -88.4805019, 
    -88.4805024142178, -88.4805086939419, -88.4805251616779, 
    -88.4804923616895, -88.4804515606477, -88.4803695616748, 
    -88.4800418949334, -88.4795582948161, -88.4788943613255, 
    -88.478205960114, -88.4773289609349, -88.4760422949906, -88.4754604927738, 
    -88.4752310937878, -88.474952360389, -88.4743459602345, -88.4741163601818, 
    -88.4736574934197, -88.473239559997, -88.4729198932563, -88.472477159805, 
    -88.4719853596777, -88.4716493595953, -88.4711658928256, 
    -88.4709936927814, -88.4707230916609, -88.4704689592989, 
    -88.4702149592394, -88.4699772925257, -88.469739559143, -88.4690182912538, 
    -88.468788758911, -88.4676738919732, -88.4671411595574, -88.466575558378, 
    -88.4662312926814, -88.4659525582334, -88.4656410914819, 
    -88.4648950902684, -88.4645918912495, -88.4641819578158, 
    -88.4637392910463, -88.4633376909502, -88.4628128908101, 
    -88.4621160906443, -88.4616816895039, -88.4614192904784, 
    -88.4611077560261, -88.460566756956, -88.4602141568693, -88.4599026901186, 
    -88.4597960890607, -88.4595173556702, -88.4592222899763, 
    -88.45914028996, -88.4591470302083, -88.4592812, -88.4594778, 
    -88.4605026, -88.4610766, -88.4620931, -88.4623638, -88.4624375, 
    -88.4624412527048, -88.4624442908137, -88.4624771575014, 
    -88.4624033575153, -88.4624167070851, -88.4624704, -88.4626917, 
    -88.4630689, -88.4631508, -88.4631755, -88.4631304823899, 
    -88.4629689576096, -88.4628786898565, -88.462878501561, -88.4628719, 
    -88.4628473, -88.4629211, -88.4631588, -88.4636097, -88.4644869, 
    -88.4658149, -88.4662165, -88.4668395, -88.4676185, -88.4678809, 
    -88.4680448, -88.4681268, -88.4681185, -88.4680692, -88.4681758, 
    -88.4683397, -88.4686022, -88.4689301, -88.4693318, -88.470004, 
    -88.470291, -88.4705123, -88.4708813, -88.4710125, -88.4713732, 
    -88.4718816, -88.4723324, -88.4725373, -88.4725701, -88.4725542781112, 
    -88.4723880933715, -88.4723869496059, -88.4723813, -88.4723403, 
    -88.4724057, -88.4725943, -88.4728647, -88.4734385, -88.4738893, 
    -88.474496, -88.4748075, -88.4749879, -88.4751192, -88.475947, 
    -88.4764471, -88.476611, -88.4766438, -88.4766272, -88.4766354, 
    -88.4768648, -88.477619, -88.4784962, -88.4789962, -88.4795618, 
    -88.4803979, -88.480775, -88.4810782, -88.4813242, -88.4815619, 
    -88.4818082, -88.4818095788932, -88.4818149625666, -88.4818970959571, 
    -88.4818971626372, -88.4818890959747, -88.4817415626132, 
    -88.4815038958905, -88.4806842956817, -88.4804547633381, 
    -88.4800940955422, -88.4790366952648, -88.4785285628449, 
    -88.4780859616995, -88.4776514949124, -88.4773400958826, 
    -88.4767990946976, -88.4760776945166, -88.4760122945139, 
    -88.4757909611321, -88.4755696944069, -88.475413894372, -88.4754065526729, 
    -88.4754647, -88.475563, -88.4758746, -88.4765878, -88.476973, 
    -88.477678, -88.4781535, -88.4787437, -88.4795307, -88.479965, 
    -88.4808748, -88.4815143, -88.4823094, -88.4827929, -88.4835715, 
    -88.4838667, -88.4841781, -88.4842601, -88.4842615814307, 
    -88.4842668967642, -88.4842833644902, -88.4842261624117, 
    -88.4841687634406, -88.4840703634193, -88.4833082965742, 
    -88.4828656964663, -88.4821116962794, -88.4811197626914, 
    -88.4806854969678, -88.480423296915, -88.4803249625304, -88.4801282958204, 
    -88.4797922957388, -88.4792593612112, -88.4790545621994, 
    -88.4788002954699, -88.4787184954571, -88.4786869103387, 
    -88.4787773, -88.4790315, -88.4797448, -88.4801874, -88.4804496, 
    -88.4807201, -88.4815155, -88.4819252, -88.4821958, -88.482655, 
    -88.483286, -88.4838679, -88.4844581, -88.4850975, -88.4857042, 
    -88.4859829, -88.4861795, -88.4863597, -88.4865892, -88.4870401, 
    -88.4874417, -88.4878433, -88.4881465, -88.4883923, -88.4886543, 
    -88.4893671, -88.4905879, -88.4917433, -88.4919481, -88.4920709, 
    -88.4921117, -88.4920295, -88.4919637, -88.4920946, -88.4924714, 
    -88.4931107, -88.4937172, -88.4942501, -88.494373, -88.4943691771854, 
    -88.4943797659588, -88.4942869515558, -88.4944471, -88.4948323, 
    -88.4950616, -88.4952992, -88.4955777, -88.4960038, -88.4961347, 
    -88.4962247, -88.4963639, -88.4966837, -88.4968476, -88.496913, 
    -88.4968975238819, -88.4967310997939, -88.4967275876607, 
    -88.4967243, -88.4966503, -88.4967319, -88.4969282, -88.4974032, 
    -88.4982301, -88.4991064, -88.5000647, -88.5009157, -88.5009312100312, 
    -88.5008243670709, -88.5007013670295, -88.500537366987, -88.5002749669274, 
    -88.5000781002098, -88.4997843011803, -88.4990223666411, 
    -88.4983917665152, -88.4981705675017, -88.4978262997026, 
    -88.4976623652777, -88.497604967339, -88.4976024307287, -88.4975982, 
    -88.4975654, -88.4976388, -88.4979502, -88.4989412, -88.4991786, 
    -88.4995471, -88.4998255, -88.5000647, -88.5005323, -88.5012541, 
    -88.5021565, -88.5025174, -88.5033628, -88.503691, -88.5039866, 
    -88.5046509, -88.5053647, -88.5063408, -88.5066195, -88.5074891, 
    -88.5078252, -88.5080302, -88.5084483, -88.5087597, -88.5090219, 
    -88.5091942, -88.5098502, -88.5099652, -88.5099981, -88.5099656, 
    -88.5100807, -88.5102613, -88.5104909, -88.5107369, -88.5110403, 
    -88.5114746, -88.5118844, -88.511999, -88.511998312218, -88.5120057692528, 
    -88.5119563692592, -88.5119641693378, -88.5120234, -88.5121873, 
    -88.5125399, -88.5128516, -88.5133106, -88.5141634, -88.5143849, 
    -88.514467, -88.5145003, -88.5145496, -88.5146891, -88.5152876, 
    -88.5155336, -88.5160257, -88.516321, -88.5168294, -88.5180509, 
    -88.5189362, -88.5194689, -88.520461, -88.5214366, -88.5225434, 
    -88.523224, -88.5245683, -88.5247486, -88.5250847, -88.5255272, 
    -88.5257485, -88.5259286, -88.5259325676826, -88.5259353726145, 
    -88.5260909060361, -88.5261071727446, -88.5259923060583, 
    -88.523992105569, -88.5224261718651, -88.5216717717, -88.5215159716617, 
    -88.5211225715457, -88.5200485046307, -88.5194499701205, 
    -88.5191877044343, -88.5191875063854, -88.5192462, -88.5192459539118, 
    -88.5192529711454, -88.5192201711469, -88.518744704373, -88.5185149709828, 
    -88.5183591709478, -88.518342770952, -88.5184360167362, -88.5184916, 
    -88.5186064, -88.5188441, -88.5189588, -88.5190326, -88.5195737, 
    -88.5197869, -88.5198198, -88.5198855, -88.5200249, -88.5212954, 
    -88.5225006, -88.5229923, -88.5236072, -88.524263, -88.5250664, 
    -88.5251811, -88.5251858213429, -88.5251879060464, -88.5252207727324, 
    -88.5251879060648, -88.5246303049081, -88.5244171725629, 
    -88.5239089057723, -88.522957972202, -88.5227365054952, -88.5227287510998, 
    -88.5228607, -88.5231229, -88.5233031, -88.5235818, -88.5241147, 
    -88.5253116, -88.5261642, -88.5268611, -88.5273283, -88.5275825, 
    -88.5280333, -88.5286155, -88.5292139, -88.530017, -88.5308039, 
    -88.5316317, -88.5320907, -88.5326072, -88.533263, -88.5335088, 
    -88.5340908, -88.5346647, -88.5353695, -88.5365581, -88.5374679, 
    -88.5387139, -88.5396975, -88.5408859, -88.5417711, -88.5429186, 
    -88.5434595, -88.5442299, -88.5448773, -88.5456477, -88.5474588, 
    -88.547762, -88.5482619, -88.5489093, -88.5494665, -88.5502041, 
    -88.5507286, -88.551507, -88.5519331, -88.5526132, -88.5531131, 
    -88.5538424, -88.5543012, -88.5544815, -88.5546371, -88.5547683, 
    -88.5547682958853, -88.5547751134821, -88.5547749812029, 
    -88.5546603134766, -88.5543817144521, -88.553775313262, -88.553472114239, 
    -88.553308179835, -88.5532835798433, -88.5532902505288, -88.5533915, 
    -88.5538912, -88.5540224, -88.5540235556285, -88.554029180095, 
    -88.5540455134467, -88.5538569800768, -88.5535621133447, 
    -88.5534063122849, -88.5532835132961, -88.5528491131658, 
    -88.5524311797198, -88.5521033796434, -88.5519313796135, 
    -88.5519149796368, -88.5518739129642, -88.5513167117792, 
    -88.5511117794467, -88.5509233127543, -88.5509149794493, 
    -88.5507757127595, -88.5505873116704, -88.5504643793432, 
    -88.5502265792579, -88.5499891125143, -88.5496203124143, 
    -88.5492105789826, -88.5490465778952, -88.548448512075, -88.5481289119827, 
    -88.5477847785545, -88.5473749784535, -88.5470307783762, 
    -88.5464325115995, -88.5462521782212, -88.5458015114233, 
    -88.545383511319, -88.5446049788247, -88.5438837109498, -88.542187110539, 
    -88.5416545104209, -88.5414331103841, -88.5412525770325, 
    -88.5410313113556, -88.5404739768407, -88.5401543101068, 
    -88.5399903111194, -88.539826377772, -88.5396787100439, -88.5395065766723, 
    -88.5391459765799, -88.5388919098537, -88.5387525764965, 
    -88.5386377775335, -88.5385557764782, -88.5381705097147, 
    -88.5371541761101, -88.5360475758117, -88.5353263745785, 
    -88.5347363087882, -88.5345069097681, -88.5340559096769, 
    -88.5338919085961, -88.5334901751576, -88.5332279740598, 
    -88.5327033083074, -88.531334373612, -88.5307605078536, -88.5298093743101, 
    -88.5293667075355, -88.5289979074381, -88.5282929739056, 
    -88.5281781728392, -88.5280797082538, -88.5279073738455, 
    -88.5278501082137, -88.5278366518727, -88.5279252, -88.5280727, 
    -88.5282531, -88.528417, -88.5290073, -88.5295482, -88.5300235, 
    -88.5305071, -88.530794, -88.5309332, -88.5310562, -88.5310565066932, 
    -88.5310629747904, -88.5310711071012, -88.5308415081128, 
    -88.5308488684733, -88.5309411, -88.5311049, -88.5312443, 
    -88.5313346, -88.5316951, -88.5321625, -88.5325806, -88.5331298, 
    -88.5334412, -88.5337774, -88.5340398, -88.5342611, -88.5347283, 
    -88.5349907, -88.5351628, -88.5352119, -88.5353266, -88.5354578, 
    -88.535548, -88.5355484488159, -88.535554776006, -88.5355629093586, 
    -88.5354973093658, -88.5354397760255, -88.5353249760026, 
    -88.5348085758836, -88.5336443755991, -88.5332919755092, 
    -88.5331525765068, -88.5329559753926, -88.5327511086616, 
    -88.5325625752782, -88.5324805752628, -88.5324477086061, 
    -88.5322181752192, -88.5317509084237, -88.5312427072589, 
    -88.5307179748365, -88.5305787091842, -88.5305867081735, 
    -88.530512774844, -88.5303325081423, -88.5300455080793, -88.5296847746544, 
    -88.5291273078493, -88.5290125078288, -88.5290273634377, 
    -88.5291121, -88.5292433, -88.5294237, -88.5297599, -88.5300549, 
    -88.5302106, -88.530268, -88.5302669108516, -88.5302747748614, 
    -88.530258308203, -88.5300615748296, -88.5293563746555, -88.528561107806, 
    -88.528520107805, -88.5285263801409, -88.5286445, -88.5288494, 
    -88.5291445, -88.5297922, -88.5303907, -88.5305138, -88.5306366, 
    -88.530735, -88.5310711, -88.5315218, -88.5318744, -88.5320384, 
    -88.532317, -88.5328581, -88.5332597, -88.5335385, -88.533768, 
    -88.5338746, -88.5339565, -88.5339571197511, -88.5339633102852, 
    -88.5339713759227, -88.533954975936, -88.5338401759181, -88.5337009092225, 
    -88.5334629768738, -88.5328975090229, -88.532692375642, -88.5321431088662, 
    -88.5316429754098, -88.5308233085168, -88.5306429084793, 
    -88.5304625084527, -88.529954108342, -88.5297983749562, -88.5296919082642, 
    -88.529593307217, -88.5295277749117, -88.5293965748703, -88.5292325748253, 
    -88.5288553747486, -88.5282323079341, -88.5272321076778, 
    -88.527059907647, -88.5269451076223, -88.5268303065534, -88.5268646687262, 
    -88.5269546, -88.527299, -88.5273644, -88.5274055, -88.5274053293658, 
    -88.5274123077779, -88.5274039744587, -88.5272727744357, 
    -88.5269611754092, -88.5269037743614, -88.5268299066604, 
    -88.5266739743446, -88.5265099076455, -88.5265099086399, 
    -88.5266178, -88.5266195927231, -88.5266245743711, -88.5266573077271, 
    -88.5266409077388, -88.5260829743204, -88.5259189086806, 
    -88.5253859075206, -88.5252545741625, -88.5252053741749, 
    -88.5250413085283, -88.5250492656717, -88.5250836, -88.5253376, 
    -88.5259443, -88.5262476, -88.5266412, -88.5268215, -88.5269774, 
    -88.5271414, -88.5274447, -88.5282319, -88.5287157, -88.5292569, 
    -88.5299536, -88.5304375, -88.5309457, -88.5319952, -88.533561, 
    -88.5340529, -88.5348155, -88.5359633, -88.5369142, -88.5374061, 
    -88.5378899, -88.5388652, -88.539767, -88.5408491, -88.5416033, 
    -88.5419721, -88.5433492, -88.5451361, -88.5455459, -88.546087, 
    -88.5463656, -88.5470049, -88.5477017, -88.5482016, -88.5497426, 
    -88.5503245, -88.5508819, -88.5512506, -88.5517671, -88.5528407, 
    -88.5534472, -88.5541109, -88.5546929, -88.5555124, -88.5564058, 
    -88.5566926, -88.5572089, -88.5579137, -88.5581841, -88.5583972, 
    -88.5583972, -88.5583701741166, -88.5582073821175, -88.5579615153839, 
    -88.5561013148958, -88.5558143825229, -88.5555277147241, 
    -88.5554047146726, -88.555399083463, -88.5553979, -88.5553242, 
    -88.5553161205248, -88.5552737812478, -88.555068915556, -88.5549295155178, 
    -88.5544623799933, -88.5535691808145, -88.5531593807001, 
    -88.5529955129411, -88.5528479805911, -88.5528445282331, 
    -88.5528412, -88.5527839, -88.5528085, -88.5529860522741, 
    -88.5529137138571, -88.5527415804721, -88.5523645814096, 
    -88.5522581126266, -88.5521187802801, -88.5521148878095, 
    -88.552112, -88.5520465, -88.5520547, -88.5521039, -88.5522925, 
    -88.5522764376596, -88.5521763791618, -88.5519223134263, 
    -88.5517503133648, -88.5516027799841, -88.5514143799282, 
    -88.5511849132055, -88.5508243131224, -88.5496359794879, 
    -88.5494637794329, -88.5492837126989, -88.5492777440786, 
    -88.5492769, -88.5490393, -88.5489819, -88.5490639, -88.5491952, 
    -88.5494655, -88.5499572, -88.5505719, -88.5507194, -88.5511866, 
    -88.5513095, -88.5518339, -88.5519487, -88.5519812780747, 
    -88.5519473132276, -88.5518489809005, -88.5515703131042, 
    -88.5514637786845, -88.5514593949357, -88.551457, -88.5514161, 
    -88.55149, -88.5515595, -88.551621, -88.5517357, -88.5521127, 
    -88.5524568, -88.5530878, -88.553809, -88.5541368, -88.5552348, 
    -88.556464, -88.556841, -88.5570541, -88.5572589, -88.5577423, 
    -88.5577833, -88.557761088907, -88.5576343810799, -88.5574871143626, 
    -88.5573641153529, -88.5572821809407, -88.5572811666859, 
    -88.5572754, -88.5572508, -88.5572917, -88.5577752, -88.557808, 
    -88.5578408, -88.5582423, -88.5588568, -88.5590616, -88.5591599, 
    -88.5593894, -88.5594631, -88.5594634162221, -88.5594699148418, 
    -88.5594781148561, -88.5594617159069, -88.5592895815028, 
    -88.5592651148412, -88.5592815148604, -88.5593334491479, 
    -88.5594713, -88.5596187, -88.5597989, -88.5598482, -88.5597909, 
    -88.5597908, -88.5599793, -88.5601104, -88.5602087, -88.5602093019918, 
    -88.5602155151003, -88.5602319151187, -88.5602085064606, 
    -88.5602742, -88.5604791, -88.5605528, -88.5605593380233, 
    -88.5605595819069, -88.5606005152612, -88.5605620197796, 
    -88.5606101, -88.5607576, -88.560946, -88.5611509, -88.5615033, 
    -88.5620932, -88.5631583, -88.5640595, -88.5648789, -88.5651492, 
    -88.5652803, -88.565559, -88.5656491, -88.5657883, -88.5658621, 
    -88.5659358, -88.5664683, -88.5667634, -88.5686887, -88.5689018, 
    -88.5690082, -88.5691967, -88.5693442, -88.5698112, -88.570696, 
    -88.571761, -88.5722772, -88.5731702, -88.574309, -88.5753986, 
    -88.5762916, -88.576775, -88.5775942, -88.5778482, -88.5779711, 
    -88.5780449, -88.5780503030444, -88.5780517201978, -88.5780843868821, 
    -88.5780761868913, -88.5779615868676, -88.5778877868581, 
    -88.5778879202057, -88.5778305201963, -88.5775601857451, 
    -88.5772571200372, -88.5771177866691, -88.5770849866698, 
    -88.5770849866866, -88.5771835200721, -88.5771833867438, 
    -88.5770851867175, -88.5769703866795, -88.5766343865438, 
    -88.5764869864965, -88.5763231864466, -88.57615111973, -88.5758479206896, 
    -88.5756021862494, -88.5754465195496, -88.5752909195249, 
    -88.5751679851369, -88.5748075194304, -88.5743487859769, 
    -88.5736359868247, -88.5714893851797, -88.5707193849714, 
    -88.5700065181067, -88.5691461845489, -88.5673191173836, 
    -88.5656067169279, -88.5639189164924, -88.5630421162687, 
    -88.5622965160646, -88.5621653827007, -88.5621579276082, 
    -88.5622077, -88.5624208, -88.5626584, -88.5632647, -88.5637155, 
    -88.5641578, -88.5647069, -88.5658129, -88.5664193, -88.5669273, 
    -88.5671485, -88.5673124, -88.5674762, -88.567681, -88.5677712, 
    -88.5677754181356, -88.5677779832418, -88.5678353176504, 
    -88.5678681843539, -88.5677697853828, -88.5674913176099, 
    -88.5666637163539, -88.5652379836853, -88.5645907168392, 
    -88.5636729832569, -88.5631977820923, -88.5630339164342, 
    -88.5628043830591, -88.5624929829869, -88.5619439838887, 
    -88.5613213816251, -88.5611001826076, -88.5606575824998, 
    -88.5605593158136, -88.560534715816, -88.5605418436574, -88.5606181, 
    -88.5607574, -88.5609458, -88.5611917, -88.5615358, -88.5619946, 
    -88.5626994, -88.5630927, -88.5633549, -88.5634285, -88.5635761, 
    -88.5637071, -88.5637139101141, -88.5637139167132, -88.5637260460594, 
    -88.5638137, -88.5638137023996, -88.5638205167671, -88.5638287167856, 
    -88.5636157177788, -88.5633615833327, -88.5628945165524, 
    -88.5624111164412, -88.5622717830906, -88.5622799733188, 
    -88.562347, -88.5625026, -88.5629287, -88.5632237, -88.5633794, 
    -88.5635433, -88.5637154, -88.5638793, -88.563994, -88.5641578, 
    -88.5642398, -88.5644938, -88.5652067, -88.565387, -88.5657884, 
    -88.5660916, -88.566231, -88.5666161, -88.5671076, -88.5674846, 
    -88.568091, -88.5683614, -88.5685089, -88.569361, -88.5697789, 
    -88.5707375, -88.5709998, -88.5715979, -88.5725156, -88.572999, 
    -88.5737937, -88.5745229, -88.5761126, -88.5772842, -88.5774071, 
    -88.5775463, -88.5781117, -88.579062, -88.5801026, -88.5812415, 
    -88.5819214, -88.582413, -88.5828226, -88.5830848, -88.5832568, 
    -88.5837154, -88.5840268, -88.5852637, -88.5855914, -88.5863042, 
    -88.5868612, -88.5871398, -88.5879343, -88.5879916, -88.5879997, 
    -88.5881553, -88.5887616, -88.589294, -88.5896708, -88.589933, 
    -88.5900231, -88.590024217205, -88.5900299239889, -88.5900381906665, 
    -88.5899807917105, -88.5899881862225, -88.5902035, -88.590859, 
    -88.5914733, -88.5926528, -88.5939798, -88.5945369, -88.5948563, 
    -88.5950939, -88.5954463, -88.5957166, -88.5965358, -88.5966096, 
    -88.596613546383, -88.5966163925362, -88.5966491925564, -88.5965919936021, 
    -88.5963215924994, -88.5959447924045, -88.5958221257192, 
    -88.5958380944176, -88.5958973, -88.5961595, -88.5964708, 
    -88.5969541, -88.5979371, -88.5984204, -88.5985268, -88.5985585449211, 
    -88.5984925264617, -88.5981893263436, -88.5981155263116, 
    -88.5981163160798, -88.5981087, -88.5981742, -88.5982888, 
    -88.5984525, -88.598723, -88.5993293, -88.6005663, -88.6016311, 
    -88.6029662, -88.6036952, -88.6041619, -88.6045387, -88.6046616, 
    -88.6048334, -88.604907, -88.6050463, -88.6055377, -88.6057343, 
    -88.6069789, -88.6078139, -88.6080679, -88.6083545, -88.6086084, 
    -88.6088787, -88.6093538, -88.6096898, -88.6101975, -88.6106073, 
    -88.6109105, -88.611148, -88.611746, -88.612352, -88.6125487, 
    -88.613335, -88.6141707, -88.614523, -88.6151699, -88.615563, 
    -88.6158825, -88.616112, -88.6163168, -88.6177908, -88.6181184, 
    -88.618536, -88.6191257, -88.6193879, -88.6198545, -88.6204524, 
    -88.6212386, -88.6212959, -88.621295706214, -88.6212615335942, 
    -88.6211713991931, -88.6209831324757, -88.620401532295, -88.6201311311663, 
    -88.6200411332152, -88.619983598814, -88.6199839430491, -88.6199768, 
    -88.619993, -88.620083, -88.620304, -88.6207463, -88.6210737, 
    -88.6213278, -88.6214014, -88.6214014, -88.6213097991011, 
    -88.6213095966026, -88.621303, -88.6212947, -88.6213519, 
    -88.6214911, -88.6217533, -88.6221956, -88.6223594, -88.6227115, 
    -88.6229817, -88.6231455, -88.6233503, -88.6235797, -88.6236617, 
    -88.6236609109723, -88.623668533107, -88.6236441331145, -88.6235623341426, 
    -88.6230953996492, -88.6229645329521, -88.6228917714441, 
    -88.6229169, -88.6230562, -88.623957, -88.6244646, -88.6249149, 
    -88.6250684, -88.6256667, -88.6262159, -88.6263962, -88.6264946, 
    -88.6265017763215, -88.6264605338261, -88.626345800459, -88.6259771337034, 
    -88.6258541336662, -88.6256822002704, -88.6256783655035, 
    -88.6256754, -88.6256345, -88.625651, -88.6257658, -88.6263395, 
    -88.6265363, -88.6265447, -88.6264964621355, -88.626428800355, 
    -88.6262896003044, -88.6257653324364, -88.6256672001077, 
    -88.6256665043791, -88.6256604, -88.6256522, -88.6256935, 
    -88.6257429, -88.6258413, -88.6268739, -88.627464, -88.6283491, 
    -88.6288735, -88.6290537, -88.6292667, -88.6295205, -88.6298482, 
    -88.629971, -88.6300365, -88.6300375413725, -88.6300433334788, 
    -88.6300596012039, -88.6299612022269, -88.6296990000816, 
    -88.6296252011088, -88.6296093655149, -88.6296757, -88.629782, 
    -88.6299049, -88.6301753, -88.6302408, -88.6302455230773, 
    -88.6302476013148, -88.6302835445957, -88.6303882, -88.6309535, 
    -88.6318219, -88.6321824, -88.6324364, -88.6328053, -88.6331251, 
    -88.6332316, -88.63333, -88.6335429, -88.6337888, -88.6340184, 
    -88.6341985, -88.6343133, -88.6344115, -88.6345263, -88.6347147, 
    -88.6347476, -88.6347476, -88.634674, -88.6347805, -88.6355505, 
    -88.6359518, -88.6362548, -88.6369595, -88.6375986, -88.6381148, 
    -88.6383852, -88.6386883, -88.6390898, -88.6393192, -88.639688, 
    -88.6408434, -88.6415892, -88.6422447, -88.642507, -88.6429167, 
    -88.6435395, -88.6440187, -88.6446087, -88.6451493, -88.6455754, 
    -88.6461242, -88.6466976, -88.6473201, -88.6478525, -88.6485979, 
    -88.6491876, -88.6496135, -88.6501132, -88.6502935, -88.6505803, 
    -88.6510389, -88.6526691, -88.6542745, -88.6548889, -88.6556506, 
    -88.655831, -88.6558719, -88.6558966, -88.6561096, -88.6570024, 
    -88.6572809, -88.6573874, -88.6574774, -88.6580998, -88.6585338, 
    -88.6592052, -88.659795, -88.6603108, -88.6604664, -88.6612771, 
    -88.6614737, -88.6616701, -88.6616717726497, -88.6616769419653, 
    -88.6617587430591, -88.661758743075, -88.6616685430721, -88.6614882097015, 
    -88.6612998096533, -88.6610050095747, -88.6606610105192, 
    -88.6605218094353, -88.659924009248, -88.6592359423803, -88.6587037422266, 
    -88.6583595410952, -88.6582204098139, -88.6581711421045, 
    -88.6580891420876, -88.6579500097562, -88.6578108086724, 
    -88.6576551409268, -88.6575239419496, -88.657392941915, -88.6568687417504, 
    -88.6564265426712, -88.6562462082555, -88.6558776081608, 
    -88.6553779413597, -88.6550831412777, -88.6547391411738, 
    -88.6544278077509, -88.6541657420574, -88.6538709399039, 
    -88.6534695418848, -88.6525029405769, -88.6520933404678, 
    -88.6519868071099, -88.6519211404329, -88.6519323305501, 
    -88.6522173, -88.6522912, -88.6522891464102, -88.6522980072245, 
    -88.652281541602, -88.65220780721, -88.651896540463, -88.6516180070552, 
    -88.6514623393088, -88.6512329402895, -88.6502664066816, 
    -88.6501189410235, -88.6497831398973, -88.6496397398599, 
    -88.6493038053944, -88.6489762063406, -88.6487715396174, 
    -88.6486568073003, -88.6485256062389, -88.6484436062186, 
    -88.6482225394852, -88.6480832071555, -88.6480094060994, 
    -88.6480094050703, -88.6479357394317, -88.6477144060433, 
    -88.6473459392752, -88.6465594057145, -88.6463055389819, 
    -88.6450440042686, -88.6441263384016, -88.6434791392757, 
    -88.6430448047973, -88.6421600045722, -88.6410291366019, 
    -88.6407259375665, -88.6397181373217, -88.6388249370998, 
    -88.6385545370363, -88.6379316025355, -88.6377266035305, 
    -88.637505536803, -88.6374890045137, -88.6373579367724, -88.6367680032775, 
    -88.636014336407, -88.6353177362283, -88.6343262026477, -88.6335232024452, 
    -88.6330888023427, -88.6324167355283, -88.6320152020933, 
    -88.6318348020493, -88.6311711352141, -88.6303927339592, 
    -88.6295488014382, -88.6289425335624, -88.6284180011394, 
    -88.62794260103, -88.6277294009892, -88.6275491342851, -88.6271555998109, 
    -88.6262543339398, -88.6259347338559, -88.6257381338068, 
    -88.6254266004047, -88.6250741336532, -88.6242677334413, 
    -88.6237435999776, -88.6225317329956, -88.6220075995378, 
    -88.621786732828, -88.6214099327282, -88.6211235326597, -88.6209843326459, 
    -88.6207963316022, -88.6205181325879, -88.6198137990761, 
    -88.6192159322546, -88.6188229321691, -88.6186183321217, 
    -88.6180613986345, -88.6178483985795, -88.6177911329468, 
    -88.6177585319051, -88.6177665762556, -88.6178173, -88.6179649, 
    -88.6183498, -88.6189394, -88.6193981, -88.6196357, -88.6201108, 
    -88.6208233, -88.6215194, -88.6228541, -88.6236812, -88.6242869, 
    -88.624598, -88.6250741, -88.6256642, -88.6267787, -88.6271475, 
    -88.6275653, -88.628565, -88.6295236, -88.6299989, -88.6309331, 
    -88.6318264, -88.6325392, -88.6329819, -88.6330638, -88.6335472, 
    -88.6338996, -88.6343829, -88.6345222, -88.6349482, -88.6353415, 
    -88.6358412, -88.6365539, -88.6367997, -88.6371848, -88.6377749, 
    -88.6383812, -88.6391104, -88.6395611, -88.6398807, -88.6402331, 
    -88.6403725, -88.6405199, -88.6407004, -88.6409708, -88.6412822, 
    -88.6416263, -88.6423392, -88.6431094, -88.6432814, -88.6434535, 
    -88.6437728, -88.6442725, -88.6444937, -88.6446328, -88.6451326, 
    -88.6463861, -88.6468121, -88.647279, -88.6475493, -88.6476804, 
    -88.6477623, -88.647765769598, -88.6477691388539, -88.6477936055357, 
    -88.6474576054728, -88.6473674075424, -88.647373459174, -88.64768, 
    -88.6477619, -88.6477653982924, -88.6477687399717, -88.6477851399817, 
    -88.6477358066533, -88.6475800066276, -88.6475717399701, 
    -88.6476168853233, -88.6477941, -88.6479989, -88.6481791, 
    -88.648392, -88.6486622, -88.6489081, -88.6494078, -88.6501698, 
    -88.6507024, -88.6510628, -88.6513332, -88.6517181, -88.6521604, 
    -88.6524225, -88.6527009, -88.6528483, -88.6530201, -88.653020151478, 
    -88.6530269416673, -88.6530350093958, -88.6529531416814, 
    -88.6527891406091, -88.6525023426213, -88.6522728092362, 
    -88.6514697413674, -88.6512731413258, -88.6511254079903, 
    -88.6508877412761, -88.6506420078827, -88.6505190088888, 
    -88.6502568077753, -88.6495277419558, -88.6490606064231, 
    -88.6480282071998, -88.646332339023, -88.6457506065799, -88.6447508063326, 
    -88.6437838060988, -88.6431120059261, -88.642915205877, -88.6425711391315, 
    -88.6421121390154, -88.6417516055832, -88.6403096051798, 
    -88.6400064051027, -88.6395965393869, -88.6392606049239, 
    -88.6385313380768, -88.6372037377356, -88.6368758053668, 
    -88.6365151375929, -88.6361708031466, -88.6354169373243, 
    -88.634802337156, -88.6341305369648, -88.6340320046553, -88.6338844035972, 
    -88.6337614025284, -88.6336385368721, -88.633384403471, -88.6327207366258, 
    -88.632130737505, -88.6314669352498, -88.6312701362506, -88.6311142028967, 
    -88.6309831362045, -88.6307208028093, -88.6304996037917, 
    -88.6297293358585, -88.6294670024506, -88.6291966023762, 
    -88.6285491365978, -88.6284589355391, -88.62846693557, -88.6282455355233, 
    -88.6277209353952, -88.6268522007941, -88.6263931350555, 
    -88.6263193340019, -88.6263028006744, -88.6263273350745, 
    -88.6263107350878, -88.6262615350852, -88.6259746027206, 
    -88.6255319349163, -88.6250808014936, -88.6246206013837, 
    -88.6240883345842, -88.6237279334444, -88.6230645343161, 
    -88.6227862009218, -88.6224176008346, -88.6222703341399, 
    -88.6222540008141, -88.6222815575749, -88.6223947, -88.6227223, 
    -88.6230008, -88.6232383, -88.6233202, -88.6233202084258, 
    -88.6233270011133, -88.6233271334185, -88.6231962011013, 
    -88.6229096010353, -88.6225657342832, -88.6218451341173, 
    -88.6215011340293, -88.6209195995112, -88.6203546004075, 
    -88.6197403335885, -88.6194618001748, -88.6181349342047, 
    -88.6180203331385, -88.6180277786068, -88.6180955, -88.6181549146325, 
    -88.6183153332389, -88.6184955343288, -88.6190442875494, 
    -88.6194225, -88.6203563, -88.6214457, -88.6228135, -88.6239274, 
    -88.6248855, -88.6250725, -88.6253265, -88.6255641, -88.6259904, 
    -88.6261133, -88.6265066, -88.626695, -88.626941, -88.6276378, 
    -88.6279411, -88.6284083, -88.6293099, -88.6302197, -88.6312032, 
    -88.6315803, -88.6321623, -88.6329737, -88.6338752, -88.6344489, 
    -88.6348014, -88.6351537, -88.635629, -88.6359977, -88.6363665, 
    -88.6366123, -88.6380871, -88.638415, -88.6385871, -88.6388739, 
    -88.6395132, -88.6399229, -88.6403573, -88.6410867, -88.6415537, 
    -88.6425452, -88.6428238, -88.6430204, -88.6431023, -88.6431679, 
    -88.6431924, -88.6432991, -88.6436515, -88.644979, -88.6460196, 
    -88.6465276, -88.6473471, -88.6478798, -88.6494943, -88.6503628, 
    -88.6509774, -88.651379, -88.6517807, -88.6521413, -88.6526577, 
    -88.6528624, -88.6536327, -88.6556153, -88.6561971, -88.6569346, 
    -88.657541, -88.6579998, -88.6583603, -88.6586636, -88.6587455, 
    -88.6589422, -88.6592453, -88.659352, -88.6598272, -88.6599092, 
    -88.6599748, -88.660106, -88.6602944, -88.6608023, -88.6611791, 
    -88.6614413, -88.6616625, -88.6616552780705, -88.6616038106976, 
    -88.6615055440014, -88.6611124105649, -88.6599081435668, 
    -88.6592857433727, -88.6588517432267, -88.6586960098385, 
    -88.6584585420559, -88.6580653419436, -88.6577705418507, 
    -88.6575657438616, -88.6574101427558, -88.6572629416402, 
    -88.6572629189803, -88.6572561, -88.6572478, -88.6572807, 
    -88.6573709, -88.6575758, -88.657928, -88.658223, -88.6583706, 
    -88.6585917, -88.6589932, -88.659329, -88.6594355, -88.6594765, 
    -88.6594765940705, -88.6593360097544, -88.6591067430001, 
    -88.6589102095842, -88.6587792084945, -88.6586072094822, 
    -88.6584516094374, -88.6579520103438, -88.6574932102262, 
    -88.6566412089571, -88.6561661421569, -88.6558384087297, 
    -88.655297941901, -88.6551750085329, -88.6549373407712, -88.6547571417605, 
    -88.6546507417334, -88.6538886082272, -88.6535281414725, 
    -88.6528072079505, -88.6524796078568, -88.6522175411107, 
    -88.6521356077462, -88.6521356227403, -88.6521288, -88.6521289, 
    -88.6521862, -88.6524484, -88.6528089, -88.6534069, -88.6535463, 
    -88.6535953, -88.6536035993117, -88.653545008059, -88.6535447853421, 
    -88.6535382, -88.65353, -88.6535464, -88.6537513, -88.6540955, 
    -88.6542512, -88.6550949, -88.6552588, -88.6553817, -88.6557997, 
    -88.6558407, -88.6558217824171, -88.6554626073676, -88.6552660083569, 
    -88.6548154092986, -88.6542992081299, -88.6538731403207, 
    -88.653365341228, -88.6532260078507, -88.6531605411513, -88.6531605187329, 
    -88.6531537, -88.6531457, -88.6532112, -88.6533341, -88.6536126, 
    -88.6541042, -88.6543664, -88.6546449, -88.6548907, -88.6553086, 
    -88.6553987, -88.6554228899404, -88.6553811416396, -88.6552091415839, 
    -88.6550862082134, -88.654504608057, -88.6540704079437, -88.6534477411246, 
    -88.6529808076795, -88.6518420073884, -88.6510228071727, 
    -88.6506623393722, -88.6505149414149, -88.6503921403327, 
    -88.6503348080141, -88.6503354731655, -88.650328, -88.6503607, 
    -88.6507868, -88.650877, -88.6509427, -88.6509347, -88.6508938, 
    -88.6509184, -88.6511478, -88.6513118, -88.6515658, -88.6522744, 
    -88.6523481, -88.6524712, -88.6525449, -88.6526514, -88.6528151, 
    -88.6541338, -88.6543958, -88.6547399, -88.6552478, -88.6560259, 
    -88.6565993, -88.6572629, -88.6576233, -88.6580084, -88.6581557, 
    -88.6587537, -88.6591139, -88.6596136, -88.6601378, -88.6606948, 
    -88.6623821, -88.6629308, -88.6631027, -88.6638235, -88.6640528, 
    -88.6642248, -88.6643476, -88.664585, -88.6647898, -88.6650847, 
    -88.6652976, -88.6656088, -88.6662068, -88.666518, -88.6667719, 
    -88.6672224, -88.6676154, -88.6684263, -88.6694828, -88.671002, 
    -88.6719048619284, -88.671974159707, -88.6726509, -88.6729081, 
    -88.6732441, -88.6735671, -88.6740057, -88.674294, -88.6744923, 
    -88.6747953, -88.6752192, -88.675535, -88.675707, -88.6757807, 
    -88.6758093708006, -88.6758612139877, -88.6759186140038, 
    -88.6759991986571, -88.6760395, -88.6762198091422, -88.6762461474367, 
    -88.6762544130542, -88.6762053473982, -88.675943347292, -88.6759104500991, 
    -88.6757036, -88.6752278, -88.674801, -88.6745528217628, 
    -88.6744937468288, -88.6741743467276, -88.6736912132315, 
    -88.6733308131201, -88.6720942127671, -88.6713490125393, 
    -88.6709232124001, -88.6702517455015, -88.6700552110541, 
    -88.6698832109834, -88.6698765533609, -88.6698764, -88.6697273047687, 
    -88.6695967462629, -88.669457611834, -88.6692937451134, -88.6687124126403, 
    -88.6684667448426, -88.6682619437401, -88.6680899447337, 
    -88.6675330112508, -88.6668369454139, -88.666345545267, -88.666140810827, 
    -88.6659606107646, -88.6658542107158, -88.6658530952992, 
    -88.6658474, -88.665782, -88.6658312, -88.6659214, -88.6660442, 
    -88.6662572, -88.6670272, -88.6673629, -88.6675677, -88.6679773, 
    -88.6685341, -88.6688698, -88.6692548, -88.6696724, -88.6700492, 
    -88.6704257, -88.6707369, -88.6710153, -88.6712855, -88.6714984, 
    -88.6715043677623, -88.6715052122721, -88.6716710696219, 
    -88.6718013, -88.6719979, -88.672178, -88.6726284, -88.6734145, 
    -88.6739388, -88.6743564, -88.6745939, -88.6746513, -88.6746022, 
    -88.6746022, -88.6746923, -88.6749053, -88.6755604, -88.6758389, 
    -88.6759863, -88.6761829, -88.6766906, -88.6768513753537, 
    -88.6770740137701, -88.6771370031316, -88.6774107, -88.6777132, 
    -88.6778112, -88.6778151, -88.6781638, -88.6784829, -88.6785218, 
    -88.6787583, -88.6790522875321, -88.6794978156304, -88.6798008146648, 
    -88.6801038147283, -88.6804970147996, -88.6807018148521, 
    -88.6810157604515, -88.6811207, -88.6814127, -88.6817276, 
    -88.6817088, -88.6817116763115, -88.6821512153109, -88.6822903486889, 
    -88.6823063260918, -88.6823416, -88.6827459, -88.6828345185769, 
    -88.6830320971567, -88.6830369, -88.6832253, -88.6833562, 
    -88.6837494, -88.6839038, -88.6843307, -88.684354623326, 
    -88.6845504159537, -88.6845669492754, -88.6845505482136, 
    -88.6844604148214, -88.6844440147612, -88.6843785491059, 
    -88.6842667194734, -88.6841404, -88.6840937, -88.684138, 
    -88.6838593, -88.6834327, -88.6832645, -88.6818773, -88.6815804, 
    -88.6813622, -88.6813359544658, -88.6812422149521, -88.6808410137555, 
    -88.6806281480505, -88.6805708136444, -88.6805545479967, 
    -88.6806118146569, -88.6807265479972, -88.6808820146885, 
    -88.6816927481954, -88.6822660149941, -88.6830603484867, 
    -88.6832323495564, -88.6834288151953, -88.6835189485406, 
    -88.6835728301701, -88.6835755, -88.6836595, -88.6838969, 
    -88.6841017, -88.6842408, -88.6845684, -88.6845952565682, 
    -88.6848044165182, -88.6848863498535, -88.6848700154491, 
    -88.6848045487388, -88.6846407476214, -88.6844443485815, 
    -88.684362415217, -88.6842068151664, -88.6839938151047, -88.6837073473204, 
    -88.683330614934, -88.682954014836, -88.6825773480614, -88.6822089469108, 
    -88.6815948144294, -88.6808415485799, -88.6804403484618, 
    -88.6794249471389, -88.6792775470925, -88.6789746136605, 
    -88.6788026136074, -88.6784587458011, -88.6782867467896, 
    -88.6781148123573, -88.6778691466471, -88.6776809465764, 
    -88.6773779464594, -88.6771814130536, -88.6770177452896, 
    -88.676690146225, -88.6764773471951, -88.6762972117085, -88.6758305458891, 
    -88.6754048123856, -88.67524101233, -88.6747497455123, -88.6740456109147, 
    -88.6736363451657, -88.6732759450534, -88.6726291448393, 
    -88.6722197447144, -88.6714664111608, -88.6710570110367, 
    -88.6705657452573, -88.6703611441466, -88.6701318107282, 
    -88.6701318157013, -88.670125, -88.6701251, -88.6702398, 
    -88.6702563, -88.6704445, -88.6706984, -88.6709523, -88.6715417, 
    -88.6730975, -88.6736134, -88.6743913, -88.6746697, -88.6754803, 
    -88.6761025, -88.6766348, -88.6771097, -88.6782232, -88.6785017, 
    -88.678739, -88.6789192, -88.6792303, -88.6795988, -88.6796807, 
    -88.6799181, -88.68018, -88.6802291, -88.6802291, -88.6802359468985, 
    -88.680235946911, -88.6801377458499, -88.6797610124252, -88.6796463467765, 
    -88.6795563457221, -88.6793843467281, -88.6791632133399, 
    -88.67898314767, -88.67871294553, -88.678663746569, -88.6786228142839, 
    -88.6786392143066, -88.6787165724322, -88.6788206, -88.6790253, 
    -88.679181, -88.6795248, -88.6803272, -88.6807858, -88.6809741, 
    -88.6811567960777, -88.6819553475863, -88.6820372142791, 
    -88.6820622008639, -88.6820828, -88.682267, -88.6825077, 
    -88.6823548, -88.6823713410989, -88.682405614434, -88.6825692144829, 
    -88.6827821478736, -88.6830933489864, -88.6834782136728, 
    -88.6841660149069, -88.6843461482867, -88.6849847484406, 
    -88.6853941485428, -88.6856807475688, -88.6857789486283, 
    -88.6858035486233, -88.6857789486032, -88.6856970152403, 
    -88.6854924162179, -88.6854432151561, -88.6855416151589, 
    -88.6856152151741, -88.6858117485531, -88.6859754152511, 
    -88.6861147485966, -88.6861719485841, -88.6861474152222, 
    -88.6860655485245, -88.6859099495021, -88.6859099474112, 
    -88.6859509484564, -88.6860082151358, -88.686125609188, -88.6861324, 
    -88.6862306, -88.6863616, -88.6867465, -88.6869594, -88.6872459, 
    -88.6875734, -88.6877944, -88.6881956, -88.6886869, -88.6889079, 
    -88.689088, -88.6892354, -88.6893336, -88.6893418, -88.6893336764496, 
    -88.6892749481977, -88.6890866158361, -88.6889064157829, 
    -88.6886200157036, -88.6884644156681, -88.6883252156259, 
    -88.6881696155728, -88.688055148849, -88.6880550947661, -88.6880483, 
    -88.6880318, -88.68795, -88.68795, -88.6879909, -88.6881138, 
    -88.6884739, -88.6887605, -88.6897019, -88.6903405, -88.690537, 
    -88.690848, -88.6914292, -88.6919123, -88.6923788, -88.6928373, 
    -88.69296, -88.6932056, -88.6933119, -88.6933119, -88.6932628, 
    -88.6931703170321, -88.6929994172211, -88.6929984219998, 
    -88.6929926, -88.6929598, -88.6929844, -88.6930907, -88.6939338, 
    -88.6941222, -88.6942939, -88.6944003, -88.6948751, -88.6963156, 
    -88.6973633, -88.6980753, -88.6985419, -88.6987792, -88.699172, 
    -88.6995894, -88.7000805, -88.7004323, -88.7009723, -88.7012587, 
    -88.7016188, -88.7017578, -88.7019706, -88.7023224, -88.7026907, 
    -88.7029117, -88.7030098, -88.7030343, -88.7031978, -88.7035333, 
    -88.7038442, -88.7039914, -88.7040239179369, -88.7039900168609, 
    -88.7038426178537, -88.7036625511314, -88.7035888177686, 
    -88.7035862879189, -88.703582, -88.7035575, -88.7037619, 
    -88.703901, -88.7044737, -88.7046865, -88.7050219, -88.705292, 
    -88.705701, -88.7059056, -88.7058974, -88.70584, -88.7058646, 
    -88.7059381, -88.7059709, -88.7060854, -88.7062491, -88.7065029, 
    -88.7067156, -88.7068302, -88.7068701057066, -88.7068124183038, 
    -88.7068066720622, -88.7068056, -88.7066008, -88.706609, 
    -88.706658, -88.7067317, -88.7068135, -88.7071817, -88.7075499, 
    -88.7083926, -88.7085889, -88.7086709, -88.7088018, -88.7090146, 
    -88.7093256, -88.7094402, -88.7095711, -88.7096365, -88.7096447, 
    -88.7097264, -88.7098083, -88.7101437, -88.7103319, -88.7103891, 
    -88.7105118, -88.7110191, -88.7111419, -88.7112236, -88.7112726, 
    -88.7113626, -88.7115754, -88.7116981, -88.7118044, -88.7120336, 
    -88.7121073, -88.7121564, -88.712189, -88.712189, -88.7122298, 
    -88.7123116, -88.712418, -88.7125244, -88.7125252596206, 
    -88.7125312195167, -88.7125476195418, -88.7124905528893, 
    -88.7123678195447, -88.7122369528527, -88.7120814184322, 
    -88.7116805516342, -88.7115658182687, -88.7114759526302, 
    -88.7114349526318, -88.7113942203618, -88.7112633526398, 
    -88.7111651526203, -88.7110834192651, -88.7108460202385, 
    -88.7106824191521, -88.7104778191098, -88.7103797513955, 
    -88.7103142190961, -88.7099706190134, -88.7099051523423, 
    -88.7099298200817, -88.7099298190593, -88.7098563534283, 
    -88.7097254190179, -88.7095944189774, -88.708816952048, -88.7086532186633, 
    -88.7084895529886, -88.7082686185571, -88.7078023518082, 
    -88.7074013517187, -88.7073687517128, -88.7073686220145, 
    -88.7073946, -88.7077056, -88.7078529, -88.7080002, -88.7080821, 
    -88.7081721, -88.7082784, -88.7083194, -88.7084013, -88.7084667, 
    -88.7084656505265, -88.7084735520649, -88.7084408176931, 
    -88.7082772187119, -88.7082765603918, -88.7084114, -88.7084187998785, 
    -88.7086210178374, -88.708683824718, -88.7087797, -88.708919, 
    -88.7089354, -88.7089272, -88.7088454, -88.7084854, -88.7080844, 
    -88.70806, -88.70806, -88.7080814188896, -88.7081223512056, 
    -88.7081212475149, -88.7082401, -88.708281, -88.7082402, 
    -88.7080193, -88.7076102, -88.7073566, -88.7070539, -88.7068491, 
    -88.7067019, -88.7065301, -88.706391, -88.7060311, -88.7059085, 
    -88.7058269, -88.7057041, -88.7053107025498, -88.7052920186718, 
    -88.7052593520109, -88.705283952031, -88.7053330197679, -88.7053250187329, 
    -88.7051777530825, -88.7051530187107, -88.70519358966, -88.705261, 
    -88.7055065, -88.7059567, -88.7059896, -88.7061204, -88.7061263572542, 
    -88.7061272190978, -88.7062338191533, -88.7063567525672, 
    -88.7063567525948, -88.7063077525981, -88.70608675256, -88.7059149525286, 
    -88.7058821525444, -88.7058249525368, -88.7056694181329, 
    -88.7054484191072, -88.7053010190516, -88.7051537533744, 
    -88.704973752278, -88.7045972178001, -88.7036723509021, -88.7035659529643, 
    -88.703443351919, -88.7033206185619, -88.7031650174781, -88.7023466172654, 
    -88.7019373515516, -88.7013236170664, -88.7011681514235, 
    -88.700906350362, -88.7007016190814, -88.7004153513206, -88.6990403510514, 
    -88.6984264165511, -88.6976571507813, -88.6974689507507, 
    -88.6972642173934, -88.6969122183665, -88.6965604162313, 
    -88.6962576182847, -88.6962412182947, -88.6962985506367, 
    -88.696298549605, -88.6961349516721, -88.6961185506505, -88.6961346059454, 
    -88.6962509, -88.6962522559012, -88.6962577507302, -88.696274150742, 
    -88.6962660174204, -88.6959712173678, -88.6958484163124, 
    -88.6958566119547, -88.6961119, -88.6961152684769, -88.6961187508329, 
    -88.6961925508749, -88.6961515508756, -88.6959633518801, 
    -88.6948499516013, -88.6932291491343, -88.6927870167462, 
    -88.6923613499939, -88.6920993499448, -88.6919111488834, 
    -88.6915346165281, -88.6915346165399, -88.6916178, -88.6917324, 
    -88.6918634, -88.6919044, -88.6919036977042, -88.6919112166629, 
    -88.6918947500046, -88.6917638166567, -88.6917638166692, 
    -88.6917883500344, -88.691763816706, -88.6916083500072, -88.6912398165859, 
    -88.6908633498431, -88.6905194164261, -88.6902082163559, 
    -88.6900281507011, -88.6899955486203, -88.6900226653522, 
    -88.6902752, -88.6903243, -88.6903248074649, -88.6903311487499, 
    -88.6903475498084, -88.690314815435, -88.6902165497955, -88.6897417496797, 
    -88.6895042162956, -88.6893897485678, -88.6893077495991, 
    -88.6891441495704, -88.6884645494314, -88.6883825483845, 
    -88.6883744161029, -88.6884225138921, -88.6885477, -88.6885475685255, 
    -88.6885545495312, -88.6885381485071, -88.6880714171664, 
    -88.6880059494512, -88.6879732161262, -88.6879241494611, 
    -88.6875802160583, -88.6875639493958, -88.6875720150392, 
    -88.6875066150365, -88.6869497492955, -88.6868269503168, 
    -88.6868270159552, -88.6868778865643, -88.6870085, -88.6872623, 
    -88.6874588, -88.687688, -88.6880811, -88.6885723, -88.6890636, 
    -88.6897924, -88.6900953, -88.6902673, -88.6904064, -88.6904049596203, 
    -88.6904132169915, -88.6903559503348, -88.6902086169735, 
    -88.6899301502417, -88.6895126168077, -88.6888984166564, 
    -88.687334548551, -88.6870317505726, -88.6866305494211, -88.6864176149937, 
    -88.6861883493213, -88.6861391503603, -88.686160056557, -88.6864271, 
    -88.6864844, -88.6865745, -88.6867137, -88.686902, -88.6870739, 
    -88.6874342, -88.6880074, -88.6884906, -88.6890064, -88.6894075, 
    -88.6894567, -88.6895713, -88.6896778, -88.6897761, -88.689782472715, 
    -88.6897829513968, -88.6899070828207, -88.6900545, -88.6902182, 
    -88.690513, -88.6908159, -88.6908978, -88.6911762, -88.6913236, 
    -88.6915201, -88.691864, -88.6922406, -88.6924699, -88.6926254, 
    -88.6928056, -88.6930921, -88.6942466, -88.6945085, -88.6949671, 
    -88.6955319, -88.6959168, -88.69667, -88.6976032, -88.6985448, 
    -88.6990523, -88.7005914, -88.7013855, -88.7019258, -88.7023023, 
    -88.7030964, -88.7043161, -88.7052411, -88.7063298, -88.706952, 
    -88.7082699, -88.7089329, -88.7098004, -88.710046, -88.7105207, 
    -88.7115848, -88.7122968, -88.7128453, -88.7131154, -88.713803, 
    -88.7140077, -88.714204, -88.7145887, -88.7153417, -88.716283, 
    -88.7170113, -88.717707, -88.7183455, -88.7186402, -88.7192296, 
    -88.7195652, -88.719958, -88.7203427, -88.7210056, -88.7217994, 
    -88.7222332, -88.7226997, -88.7241402, -88.7247704, -88.7252615, 
    -88.7260554, -88.7263418, -88.7266363, -88.7267755, -88.7273071, 
    -88.727978, -88.7284282, -88.7287718, -88.7289028, -88.7292629, 
    -88.7294839, -88.7298277, -88.7304741, -88.7308751, -88.7312024, 
    -88.7313826, -88.7319472, -88.7332563, -88.7335509, -88.7341237, 
    -88.7343692, -88.734803, -88.735343, -88.7355885, -88.7358832, 
    -88.7362514, -88.7366196, -88.7368487, -88.7374133, -88.7375852, 
    -88.7381174, -88.7385511, -88.7389358, -88.7395167, -88.7400404, 
    -88.7405067, -88.7408013, -88.7414885, -88.7417422, -88.7418895, 
    -88.7423561, -88.7425607, -88.7431169, -88.7436078, -88.7442051, 
    -88.7443768, -88.7445648, -88.7447365, -88.744892, -88.7450721, 
    -88.7452112, -88.7454073, -88.7455464, -88.7459311, -88.7461929, 
    -88.7465447, -88.7466184, -88.7467, -88.746798, -88.7469453, 
    -88.747068, -88.7472563, -88.7475262, -88.7478289, -88.7482134, 
    -88.7493178, -88.7494405, -88.7495141, -88.7495796, -88.7495860992404, 
    -88.7495864321594, -88.7496619493045, -88.7497352, -88.7498416, 
    -88.7499316, -88.7500693, -88.7506588, -88.7509209, -88.7513139, 
    -88.7517559, -88.7519278, -88.7524765, -88.7529105, -88.7533854, 
    -88.753762, -88.7539995, -88.7549985, -88.7564149, -88.7575776, 
    -88.7581998, -88.7591168, -88.7597226, -88.7603366, -88.7607951, 
    -88.7612043, -88.7615483, -88.7618759, -88.7624081, -88.7628091, 
    -88.7631037, -88.763292, -88.7635376, -88.7643481, -88.7645283, 
    -88.7645207014399, -88.764404235896, -88.7642160347921, -88.7638150367575, 
    -88.7634303689387, -88.7628490354568, -88.7624152353363, 
    -88.7621862352581, -88.7618753684695, -88.7618741220339, 
    -88.7618685, -88.7618277, -88.761828, -88.7621228, -88.7624424, 
    -88.7627453, -88.7632118, -88.7640384, -88.7641775, -88.7642268, 
    -88.7642841, -88.7644233, -88.7646688, -88.7652582, -88.7658475, 
    -88.7666417, -88.7670592, -88.7674441, -88.7675508, -88.7677393, 
    -88.7679931, -88.7683289, -88.7685009, -88.7687301, -88.7692048, 
    -88.7697286, -88.7704244, -88.7709402, -88.7714313, -88.7719553, 
    -88.7720127, -88.7719398245481, -88.7717827715851, -88.7716028381744, 
    -88.7716034206941, -88.771596, -88.7716206, -88.7716628360333, 
    -88.7717339694181, -88.7717341704439, -88.7716441714486, 
    -88.7713823703202, -88.7711858369262, -88.770834036841, -88.7703264356694, 
    -88.7697781698919, -88.7691562363716, -88.7690171686178, 
    -88.7689025696157, -88.768690037235, -88.7686901953706, -88.7686832, 
    -88.7686916, -88.7687244, -88.7691421, -88.7696906, -88.7697971, 
    -88.7699526, -88.7706236, -88.7708692, -88.7711558, -88.7712948, 
    -88.7712578173815, -88.7711381699863, -88.7709090365839, 
    -88.7707371698759, -88.7704997698286, -88.7703442354081, 
    -88.7702870353845, -88.7702839450178, -88.7702802, -88.7702475, 
    -88.7702558, -88.7703542, -88.77087, -88.7710093, -88.7710421, 
    -88.7711977, -88.7721224, -88.7723599, -88.7726216, -88.7728835, 
    -88.7730717, -88.7734974, -88.7737428, -88.7737281919363, 
    -88.7736189704551, -88.7733652370451, -88.7728496358602, 
    -88.7723750367721, -88.7720478366702, -88.771941436634, -88.7718514365954, 
    -88.7718481897952, -88.7718446, -88.7717875, -88.7718204, 
    -88.7719923, -88.7721887, -88.7723524, -88.7725487, -88.772966, 
    -88.773146, -88.7733588, -88.7739319, -88.7743657, -88.7744387974567, 
    -88.7743317694068, -88.7741681703946, -88.7738572369737, 
    -88.7734235701949, -88.7728587700523, -88.7723678355425, 
    -88.7721551698477, -88.7720161697972, -88.7717708373813, 
    -88.7717711696438, -88.7718447696465, -88.7723814600085, 
    -88.7724521, -88.7726895, -88.7731271, -88.7737859, -88.7740559, 
    -88.7741694324631, -88.7741773702193, -88.7742837712704, 
    -88.774275636882, -88.7741447711998, -88.7739239700792, -88.7735393699654, 
    -88.7726066363652, -88.772459436313, -88.7723695696018, -88.7723687713791, 
    -88.7723627, -88.7722741140184, -88.7721079694667, -88.772107124832, 
    -88.7721011, -88.7719867, -88.7719379, -88.7719953, -88.7721426, 
    -88.7725847, -88.7730756, -88.7735011, -88.7737302, -88.7739428, 
    -88.7742864, -88.7745892, -88.7753503, -88.776496, -88.7771342, 
    -88.7775107, -88.7776582, -88.7776828, -88.7778057, -88.7780267, 
    -88.7784934, -88.7789189, -88.7792627, -88.7798272, -88.7803428, 
    -88.780981, -88.7814801, -88.7816929, -88.7820857, -88.7824458, 
    -88.7828222, -88.7835668, -88.7842621, -88.7849657, -88.7855467, 
    -88.7860867, -88.786643, -88.787265, -88.7875186, -88.7878132, 
    -88.7886069, -88.789245, -88.7900467, -88.7905212, -88.7916092, 
    -88.7924437, -88.7929672, -88.7931553, -88.7939, -88.794677, 
    -88.7952661, -88.7960269, -88.7966405, -88.7970985, -88.7974094, 
    -88.7976549, -88.7985302, -88.7985956, -88.7988411, -88.7997491, 
    -88.7999699, -88.8001745, -88.8004445, -88.8008453, -88.8014833, 
    -88.8019004, -88.802244, -88.8029639, -88.8034628, -88.8039945, 
    -88.8042154, -88.804338, -88.8045752, -88.8047552, -88.8049596, 
    -88.8052624, -88.8053208017446, -88.8055800444158, -88.8059807840405, 
    -88.8060476, -88.8066774, -88.8072745, -88.8081416, -88.8086895, 
    -88.8089431, -88.809442, -88.8100064, -88.8104481, -88.8108407, 
    -88.8110287, -88.8111351, -88.8112168, -88.8112176747179, 
    -88.8112236458656, -88.8112463908832, -88.811356, -88.811773, 
    -88.8127382, -88.8133106, -88.813556, -88.8138096, -88.8139159, 
    -88.8139732, -88.8139751596943, -88.8139800467083, -88.8142908469028, 
    -88.8143235802605, -88.8143316469447, -88.8142744469405, 
    -88.8141027802334, -88.813644646783, -88.8134729800784, -88.8132848467297, 
    -88.8120170464792, -88.8120169830362, -88.8120756, -88.8121901, 
    -88.8124682, -88.8129099, -88.8131553, -88.8132698, -88.8134333, 
    -88.8137033, -88.8139486, -88.8142268, -88.8143822, -88.8146521, 
    -88.8148974, -88.8150938, -88.8151347, -88.8151755, -88.8154046, 
    -88.8156336, -88.8159198, -88.8164023, -88.8170239, -88.8172285, 
    -88.8176128, -88.8179318, -88.8182426, -88.8184798, -88.818905, 
    -88.8192404, -88.8198211, -88.8207862, -88.8219066, -88.8223401, 
    -88.8230352, -88.8235259, -88.8238285, -88.8240001, -88.8240901, 
    -88.8242128, -88.8248751, -88.8249078, -88.8248528991336, 
    -88.8245547828571, -88.824260249428, -88.8239331826613, -88.8234506491901, 
    -88.8229762490479, -88.8226409812304, -88.822452782193, -88.8222729810575, 
    -88.822117447626, -88.8220519819373, -88.8220519819005, -88.8221830334772, 
    -88.822184, -88.8222577, -88.8225111, -88.8230263, -88.8238359, 
    -88.8248663, -88.8253324, -88.8258312, -88.8261255, -88.8267469, 
    -88.8269186, -88.8271148, -88.8275238, -88.828039, -88.8287503, 
    -88.8295927, -88.8308191, -88.831506, -88.8324218, -88.8328471, 
    -88.8331414, -88.8337546, -88.8344333, -88.835022, -88.835578, 
    -88.8365348, -88.8368783, -88.8379412, -88.8382438, -88.8392823, 
    -88.8397892, -88.8404024, -88.8407622, -88.8408603, -88.8410075, 
    -88.841012400474, -88.8410143859027, -88.8410470525878, -88.8409817869603, 
    -88.8408427869299, -88.8408203213306, -88.8409341, -88.8411876, 
    -88.8418743, -88.842095, -88.8423485, -88.8426101, -88.8428799, 
    -88.8431824, -88.8435257, -88.8439509, -88.844417, -88.8449811, 
    -88.8452919, -88.8455862, -88.8459786, -88.84651, -88.8478672, 
    -88.8483822, -88.8487584, -88.8491508, -88.8502708, -88.8517831, 
    -88.8520856, -88.8527069, -88.8533526, -88.8538021, -88.8545295, 
    -88.8552161, -88.8559682, -88.8565487, -88.8569984, -88.8572192, 
    -88.8572199532088, -88.8572260568563, -88.8572507912682, 
    -88.8572264579549, -88.8570385912596, -88.8566870578498, 
    -88.8563927911091, -88.8559105899423, -88.8551094574397, 
    -88.8540467905099, -88.853335790356, -88.8529516569461, -88.8527391902599, 
    -88.8526329891973, -88.8525104579178, -88.8522896568165, 
    -88.8520525900943, -88.8516030556076, -88.8510553898764, 
    -88.8500744552552, -88.849591989504, -88.8492568561025, -88.8490607883698, 
    -88.8489465894356, -88.8490283028698, -88.8492182, -88.8496352, 
    -88.8500686, -88.8504937, -88.8511641, -88.8516792, -88.8521451, 
    -88.852611, -88.8531915, -88.855178, -88.856151, -88.8572054, 
    -88.8576141, -88.8586687, -88.8589631, -88.8600749, -88.8610149, 
    -88.8615708, -88.8622329, -88.8627314, -88.8633198, -88.8639328, 
    -88.8643744, -88.8647586, -88.8649059, -88.8649794, -88.865094, 
    -88.8651001203671, -88.8651008593927, -88.8652563928041, 
    -88.8653616018789, -88.8654297, -88.8654340030046, -88.865436593944, 
    -88.8656577940582, -88.8656577940732, -88.8656251940791, 
    -88.8655353940698, -88.8652002606608, -88.8637943936437, 
    -88.8634183946021, -88.863091461189, -88.8628298600868, -88.862184259923, 
    -88.8617509941837, -88.8608599929202, -88.8600915927385, 
    -88.8593722592245, -88.858791859075, -88.858235858922, -88.8577943921427, 
    -88.8561512583966, -88.855930592722, -88.8558734583486, -88.8559056981061, 
    -88.8560303, -88.8560303018418, -88.856037191771, -88.856037391792, 
    -88.8559802584644, -88.8551710582995, -88.854517058139, -88.854190057009, 
    -88.8538875913159, -88.8535278568434, -88.8532989911663, 
    -88.8518600574622, -88.8513695917162, -88.8502167904028, 
    -88.849611791294, -88.8493174579025, -88.8491050568297, -88.8488434567666, 
    -88.8481484565901, -88.8476332564563, -88.8472899897081, 
    -88.8469220563007, -88.8464397905672, -88.8459736571228, 
    -88.8438967888704, -88.8431690553571, -88.8424496551863, 
    -88.8418362539899, -88.8416646549987, -88.8416883103328, 
    -88.8418461, -88.842075, -88.8425412, -88.8432689, -88.8437024, 
    -88.844095, -88.8446673, -88.8453214, -88.845951, -88.8465642, 
    -88.8472674, -88.8479869, -88.8484692, -88.8489924, -88.8495565, 
    -88.8505374, -88.8509707, -88.8514123, -88.8521646, -88.8526717, 
    -88.8529904, -88.8533666, -88.8537507, -88.854372, -88.8545436, 
    -88.8548542, -88.8552056, -88.8557043, -88.8562439, -88.8569552, 
    -88.8598246, -88.8601597, -88.8604456, -88.8606417, -88.860895, 
    -88.8612056, -88.8615817, -88.8619495, -88.8626363, -88.8635847, 
    -88.8647785, -88.8652282, -88.865686, -88.8662745, -88.8673289, 
    -88.8677295, -88.8687839, -88.8694869, -88.8701571, -88.8707292, 
    -88.8718899, -88.8728869, -88.8735898, -88.8742601, -88.8750776, 
    -88.8762605, -88.8768167, -88.8779047, -88.8790255, -88.8800399, 
    -88.8804735, -88.8815042, -88.8822895, -88.8827968, -88.8834755, 
    -88.8838436, -88.8841627, -88.8844163, -88.8849478, -88.8854303, 
    -88.8874013, -88.8882765, -88.8888244, -88.8909919, -88.8915808, 
    -88.8927096, -88.8939937, -88.8952781, -88.8958835, -88.8963991, 
    -88.8964809, -88.8965139, -88.896406, -88.8960709, -88.8958093, 
    -88.8955432, -88.8952985, -88.8950453, -88.8949421, -88.8939861, 
    -88.8937276463061, -88.8935694676094, -88.8934796675742, 
    -88.8934552685949, -88.8934653828982, -88.8934577, -88.8934729, 
    -88.8935385, -88.8940047, -88.8943075, -88.8943336543769, 
    -88.8945930871565, -88.8945941, -88.8946271, -88.8947658, 
    -88.8950283, -88.8955355, -88.8960506, -88.8965983, -88.8971625, 
    -88.8989533, -88.9021828, -88.9040306, -88.9045784, -88.9051915, 
    -88.9053306, -88.9054042, -88.9054454, -88.9054781, -88.9056907, 
    -88.9059851, -88.9063366, -88.9067209, -88.9073503, -88.9078244, 
    -88.9091812, -88.9097126, -88.9119443, -88.9123775, -88.9124919, 
    -88.9124911466031, -88.912498805514, -88.9122370044453, -88.9122814203357, 
    -88.9124753, -88.9141839, -88.9149031, -88.9163583, -88.9173229, 
    -88.9186636, -88.9195955, -88.92056, -88.921876, -88.922914, 
    -88.9245897, -88.9253171, -88.9264941, -88.9274257, -88.9281858, 
    -88.9292072, -88.9292089821949, -88.9292140770304, -88.9292386760072, 
    -88.9292058770923, -88.929213684436, -88.9292644, -88.9294034, 
    -88.9295423, -88.9299264, -88.930188, -88.930662, -88.9308092, 
    -88.9313569, -88.9325175, -88.9338661, -88.9347325, -88.9355988, 
    -88.9359094, -88.9364653, -88.9370046, -88.9375932, -88.938484, 
    -88.9390233, -88.940658, -88.9412055, -88.9416713, -88.9423415, 
    -88.9435428, -88.9443028, -88.944785, -88.9451855, -88.9469834, 
    -88.9470897, -88.947155, -88.947245, -88.947343, -88.9494107, 
    -88.9496966, -88.9498601, -88.9498927, -88.9500887, -88.9502357, 
    -88.9505298, -88.9508811, -88.9513795, -88.9517635, -88.9519188, 
    -88.952213, -88.9525316, -88.9537084, -88.9540189, -88.9544846, 
    -88.9549422, -88.9551302, -88.9553018, -88.9554489, -88.9555715, 
    -88.9555770569411, -88.9555784171847, -88.9556520172233, 
    -88.955684682891, -88.9557221159704, -88.9557841, -88.9560048, 
    -88.9578513, -88.9589708, -88.9600003, -88.9609807, -88.9616344, 
    -88.9623533, -88.9636689, -88.964682, -88.9658421, -88.9665612, 
    -88.9677293, -88.9680725, -88.9697555, -88.9704418, -88.9712015, 
    -88.9721738, -88.9732766, -88.973824, -88.9747553, -88.9758174, 
    -88.9771326, -88.977876, -88.9785377, -88.9812171, -88.9832267, 
    -88.9839129, -88.9858082, -88.9870581, -88.9874175, -88.9876461, 
    -88.9879809, -88.9888957, -88.9902841, -88.9913133, -88.992906, 
    -88.993347, -88.9949392, -88.9962945, -88.9978296, -88.998071, 
    -88.9987812, -89.000079, -89.0003168, -89.0003741, -89.0007665, 
    -89.0009871, -89.0013222, -89.0018044, -89.0027767, -89.0034876, 
    -89.0038798, -89.004223, -89.0049256, -89.0055791, -89.006339, 
    -89.0077772, -89.0081284, -89.0083408, -89.0087983, -89.0090433, 
    -89.0093048, -89.009542, -89.0097792, -89.0099998, -89.0119123, 
    -89.0122146, -89.0125251, -89.0129745, -89.0134483, -89.0140364, 
    -89.0143387, -89.0145022, -89.0145676, -89.0151888, -89.0157037, 
    -89.0160959, -89.0163165, -89.016431, -89.0164802, -89.0165373, 
    -89.0170029, -89.0171174, -89.0176814, -89.0181391, -89.0184415, 
    -89.0188826, -89.0193074, -89.0195933, -89.0198058, -89.0200021, 
    -89.0210566, -89.0213262, -89.0219553, -89.02238, -89.022568, 
    -89.0231236, -89.0239813, -89.0253045, -89.025909, -89.0270689, 
    -89.02751, -89.028139, -89.0288253, -89.0294134, -89.0297238, 
    -89.02983, -89.030018, -89.0305734, -89.0311698, -89.0315864, 
    -89.031807, -89.032093, -89.0324851, -89.032959, -89.0334246, 
    -89.0340293, -89.0343233, -89.0345276, -89.0349114, -89.0350911, 
    -89.0353117, -89.0356468, -89.0358512, -89.0359329, -89.0365457, 
    -89.036905, -89.0372482, -89.0378282, -89.0385389, -89.0401152, 
    -89.0404338, -89.0407443, -89.0412588, -89.0419857, -89.0425167, 
    -89.0428924, -89.0431783, -89.0434478, -89.0436602, -89.0442973, 
    -89.045057, -89.0454408, -89.0456859, -89.0459963, -89.046225, 
    -89.0471643, -89.0476053, -89.0484303, -89.048806, -89.0497127, 
    -89.0501047, -89.0512645, -89.0518851, -89.0529143, -89.0532736, 
    -89.0536575, -89.0543843, -89.0552499, -89.0560585, -89.0565322, 
    -89.0567853, -89.0577899, -89.0580593, -89.0583206, -89.0590964, 
    -89.060493, -89.060738, -89.0613177, -89.0616117, -89.0623467, 
    -89.0630245, -89.0633674, -89.0636125, -89.0638819, -89.0646251, 
    -89.0650252, -89.0657438, -89.0664297, -89.0669604, -89.067434, 
    -89.067826, -89.0681445, -89.0685201, -89.069206, -89.0699164, 
    -89.0702595, -89.0705453, -89.0708801, -89.0711903, -89.0724722, 
    -89.0730438, -89.0732398, -89.0737215, -89.0740237, -89.0750606, 
    -89.0755667, -89.0762036, -89.0765711, -89.0768731, -89.0779998, 
    -89.0783836, -89.0787265, -89.078947, -89.0799675, -89.0804327, 
    -89.0831677, -89.0833963, -89.0838454, -89.0840902, -89.0844169, 
    -89.0849802, -89.0852006, -89.0855353, -89.0860742, -89.0863762, 
    -89.0871436, -89.0877967, -89.0881069, -89.0886295, -89.0894866, 
    -89.0899356, -89.0901804, -89.0907681, -89.0917069, -89.0920988, 
    -89.0927843, -89.0940333, -89.0947271, -89.0961801, -89.09658, 
    -89.0970534, -89.0974941, -89.0980736, -89.0986287, -89.0988164, 
    -89.0990204, -89.0994285, -89.099706, -89.1001711, -89.1005466, 
    -89.1009956, -89.1014935, -89.1021955, -89.1027096, -89.1034769, 
    -89.1039829, -89.1042931, -89.1050439, -89.1054194, -89.1068721, 
    -89.1078759, -89.1082514, -89.108741, -89.1093775, -89.1100713, 
    -89.1101936, -89.110316, -89.1108955, -89.1111893, -89.1114177, 
    -89.1117194, -89.1119805, -89.1126986, -89.1128128, -89.1130576, 
    -89.1136126, -89.1144937, -89.1147222, -89.115269, -89.1158157, 
    -89.1160033, -89.1160767, -89.1160847, -89.1161254, -89.1166395, 
    -89.1175615, -89.1182878, -89.1188345, -89.1192834, -89.1196507, 
    -89.1202627, -89.1206951, -89.1213072, -89.1223923, -89.1227268, 
    -89.1230205, -89.1232489, -89.1235262, -89.1237219, -89.1239097, 
    -89.1241542, -89.1243745, -89.1247498, -89.1248964, -89.1250841, 
    -89.1261391, -89.1269964, -89.1279845, -89.1294136, -89.1301892, 
    -89.1305731, -89.1314796, -89.1317818, -89.1325658, -89.1331699, 
    -89.133472, -89.1339375, -89.1346808, -89.1358318, -89.136681, 
    -89.1373096, -89.1383139, -89.138665, -89.1398487, -89.1407958, 
    -89.1416041, -89.1420695, -89.1432939, -89.1442491, -89.145, 
    -89.1453675, -89.1460858, -89.1470246, -89.1477513, -89.1482248, 
    -89.1484698, -89.1486902, -89.1493186, -89.1495962, -89.1499391, 
    -89.1502166, -89.1503882, -89.1507309, -89.1510248, -89.1513269, 
    -89.1523473, -89.153139, -89.1535553, -89.1540288, -89.1544369, 
    -89.1552614, -89.1557185, -89.1562898, -89.1572773, -89.158371, 
    -89.1588607, -89.1593177, -89.1597912, -89.1600931, -89.1604686, 
    -89.1613256, -89.161652, -89.1625907, -89.1637088, -89.1643863, 
    -89.1649005, -89.1658798, -89.1664919, -89.1674631, -89.168426, 
    -89.1690789, -89.169691, -89.170401, -89.1721475, -89.1729635, 
    -89.1735592, -89.1739347, -89.1740326, -89.1741224, -89.1741306, 
    -89.174196, -89.1742858, -89.1744572, -89.1746692, -89.1748977, 
    -89.1749221, -89.1750202, -89.1749793, -89.1748162, -89.1748489, 
    -89.1749632, -89.1752978, -89.175771, -89.1759505, -89.1761871, 
    -89.1761922913844, -89.1761940720279, -89.1762674731097, 
    -89.1762592721082, -89.1762855157521, -89.1763828, -89.1764971, 
    -89.1768887, -89.1770029, -89.1772231, -89.1776555, -89.1778188, 
    -89.1779657, -89.178137, -89.1787245, -89.1791488, -89.1794262, 
    -89.1806176, -89.1807726, -89.1808706, -89.180993, -89.1815887, 
    -89.1818497, -89.1821598, -89.1826575, -89.1832695, -89.1836203, 
    -89.1840609, -89.1847217, -89.1852521, -89.1854724, -89.1856682, 
    -89.1863208, -89.1865085, -89.1868594, -89.1875935, -89.1880912, 
    -89.1887357, -89.1895923, -89.1903346, -89.1907833, -89.1912238, 
    -89.1916154, -89.1919253, -89.1922028, -89.1925127, -89.1930511, 
    -89.1934183, -89.1936874, -89.1943563, -89.1946826, -89.1955065, 
    -89.1962733, -89.1966239, -89.1972194, -89.1975457, -89.1983124, 
    -89.1987936, -89.1992259, -89.1994461, -89.1997152, -89.2004168, 
    -89.2008246, -89.2011589, -89.2014852, -89.2016646, -89.2016809, 
    -89.2016516683661, -89.2015654789605, -89.2012391455205, 
    -89.2000727441512, -89.1999503441136, -89.1997546784228, 
    -89.1996567450443, -89.1996564104133, -89.1996498, -89.1996253, 
    -89.199666, -89.1999107, -89.2009301, -89.2010444, -89.2010525, 
    -89.2010374881522, -89.2009452785368, -89.2007004784525, 
    -89.2006515450975, -89.2006495019103, -89.2006446, -89.200514, 
    -89.2004977, -89.2005385, -89.2007749, -89.2008808, -89.200872609035, 
    -89.2006511458863, -89.2006511178916, -89.2006442, -89.2006114, 
    -89.200905, -89.201321, -89.2027483, -89.2039633, -89.2050154, 
    -89.206361, -89.2069318, -89.2073478, -89.2077636, -89.2079267, 
    -89.2080082, -89.2080979, -89.2081876, -89.2084324, -89.2085384, 
    -89.2086852, -89.2089379, -89.2090847, -89.2092804, -89.2097044, 
    -89.2098512, -89.2099082, -89.209998, -89.2101447, -89.2101689745637, 
    -89.2100863470528, -89.2094338801702, -89.2092462790626, 
    -89.2092410139129, -89.2092393, -89.2090842, -89.2091168, 
    -89.2093206, -89.2097692, -89.210177, -89.2102912, -89.2102980508954, 
    -89.210298147019, -89.2104300822296, -89.2105279, -89.2106991, 
    -89.210903, -89.211058, -89.2111884, -89.2112862, -89.2114491, 
    -89.2115552, -89.2116856, -89.2120036, -89.2121423, -89.2122565, 
    -89.2122589496556, -89.2122634798338, -89.212350740924, -89.2126972, 
    -89.2126976836503, -89.2127041477417, -89.2127195829759, 
    -89.2127705, -89.2129173, -89.2136269, -89.2140671, -89.2144503, 
    -89.2151515, -89.2155674, -89.2158773, -89.2163502, -89.2166275, 
    -89.2169944, -89.217451, -89.2178505, -89.2180787, -89.2181684, 
    -89.2182418, -89.2183804, -89.2186414, -89.2187311, -89.2192284, 
    -89.219628, -89.2202393, -89.2205736, -89.2208345, -89.2209649, 
    -89.2209889882881, -89.220947283066, -89.2208738840776, -89.2206781496368, 
    -89.2200011494234, -89.2197238816233, -89.2196341482558, 
    -89.2196303518474, -89.2196272, -89.2195864, -89.2195863, 
    -89.2197493, -89.2198226, -89.2199285, -89.2201323, -89.2209065, 
    -89.2210451, -89.2212734, -89.2215425, -89.2216485, -89.2216566, 
    -89.2216485175674, -89.2215655495507, -89.2213534828115, 
    -89.2212556817398, -89.2210681483566, -89.2203098825359, 
    -89.219910282415, -89.2197389490375, -89.219633149006, -89.2195352823076, 
    -89.2192741488733, -89.2190457487598, -89.2190457462414, 
    -89.2190388, -89.2190304, -89.2191934, -89.2194217, -89.2200492, 
    -89.2210274, -89.2216634, -89.2225112, -89.2231145, -89.2232286, 
    -89.2232362714968, -89.2231539485784, -89.2226809494676, 
    -89.2226156827734, -89.2226141039714, -89.2226087, -89.2225436246109, 
    -89.2224768826882, -89.2222811492873, -89.2217103491291, 
    -89.2208951478592, -89.2202345476701, -89.2195333484985, 
    -89.2193294817601, -89.2190358816509, -89.2186932815006, 
    -89.2186918970369, -89.2186863, -89.2185964, -89.2187755, 
    -89.2188487, -89.2190034, -89.2197452, -89.2205602, -89.2207313, 
    -89.2207883, -89.2206742073341, -89.220476747117, -89.220476048625, 
    -89.2204698, -89.2204454, -89.2207876, -89.2211544, -89.2212114, 
    -89.2211792218609, -89.2211122815388, -89.220940882517, -89.2204353479838, 
    -89.2201826801904, -89.2200603478512, -89.2200579344365, 
    -89.2200534, -89.2199962, -89.220053, -89.2202811, -89.220444, 
    -89.2204438061057, -89.2202877466618, -89.2200593476243, 
    -89.219700679811, -89.2193745474311, -89.218918080637, -89.2185267471996, 
    -89.2178664803698, -89.2176137469707, -89.2175250440679, 
    -89.2176804, -89.2176803965117, -89.2176873480751, -89.2176872814167, 
    -89.2176466814135, -89.2175406803485, -89.216855879127, -89.2164481467204, 
    -89.2163177466762, -89.2159099465195, -89.2159084833758, 
    -89.215903, -89.2158867, -89.2163023, -89.2167914, -89.2169299, 
    -89.2172639, -89.2173862, -89.2175084, -89.2178263, -89.217965, 
    -89.2181444, -89.2182341, -89.2183727, -89.2185847, -89.2190167, 
    -89.2195709, -89.2198397, -89.2200434, -89.2200832351808, 
    -89.2199605473498, -89.2198790806548, -89.219455080519, -89.219324546089, 
    -89.2193228692825, -89.2193176, -89.2192768, -89.2193906, 
    -89.2194759413138, -89.2195606804143, -89.219829480439, -89.2201880805272, 
    -89.2205058816545, -89.2209054807336, -89.2216310820062, 
    -89.2219734821044, -89.222112081096, -89.2221600765045, -89.2222942, 
    -89.222309, -89.2224021, -89.2223188, -89.2222452, -89.2219755, 
    -89.2215978, -89.2212692, -89.2208769, -89.2205777, -89.2203521, 
    -89.2201609, -89.2198225, -89.2196704, -89.2197097, -89.2199058, 
    -89.2199941, -89.219999, -89.2200974424406, -89.2201781477935, 
    -89.2201781826479, -89.2199745, -89.2196949, -89.2192781, 
    -89.2189838, -89.2185669, -89.2181697, -89.2178019, -89.2173016, 
    -89.2168112, -89.2164532, -89.2159676, -89.2156832, -89.2155606, 
    -89.2156096, -89.2155459, -89.2153546, -89.2150554, -89.215043587428, 
    -89.2151650787123, -89.2152139454082, -89.2152121484134, 
    -89.2152908, -89.215281, -89.2151633, -89.2149672, -89.2146337, 
    -89.214256, -89.2139765, -89.213491, -89.2130201, -89.2126082, 
    -89.2124463, -89.2123777, -89.2123335, -89.2122453, -89.2120197, 
    -89.2117107, -89.2113478, -89.2109358, -89.2106808, -89.2104699, 
    -89.2103277, -89.2100481, -89.2096754, -89.2091948, -89.2086602, 
    -89.2086178115835, -89.2082443435732, -89.2080949632508, 
    -89.2080569, -89.2079294, -89.207591, -89.2075899769542, 
    -89.207567876792, -89.2075760229803, -89.2076891, -89.2076954347311, 
    -89.2077637435939, -89.2078697426048, -89.2078698769949, 
    -89.2078046780342, -89.2077098444631, -89.2076401, -89.2073851, 
    -89.2070957, -89.2066837, -89.2063257, -89.2061148, -89.2059383, 
    -89.205899, -89.205957355409, -89.205921276415, -89.205870445457, 
    -89.205747, -89.2055263, -89.2053105, -89.2049672, -89.2043836, 
    -89.2042218, -89.2040011, -89.2035842, -89.2028731, -89.2026965, 
    -89.2025886, -89.2024121, -89.2019609, -89.2013135, -89.2006023, 
    -89.200453957354, -89.2003040748907, -89.2002472666618, -89.2001659, 
    -89.1998226, -89.1993763, -89.1990575, -89.1986063, -89.1985976601826, 
    -89.1984044743935, -89.1981680743494, -89.1981191410237, 
    -89.1980910590094, -89.1981158, -89.1980374, -89.197851, 
    -89.1975028, -89.197184, -89.1968064, -89.1965317, -89.1964484, 
    -89.1964729, -89.1964466546067, -89.1963700814516, -89.1962522, 
    -89.1959383, -89.1955607, -89.1950801, -89.1949833381383, 
    -89.194719273377, -89.1945969389754, -89.1945337829232, -89.1945259, 
    -89.194423640465, -89.1943442733431, -89.1942953400056, -89.1942845823822, 
    -89.1942758, -89.1940845, -89.1938295, -89.1934665, -89.1931625, 
    -89.1929171726297, -89.1927461405781, -89.1922324737672, 
    -89.1917024725865, -89.1902021398973, -89.1894385289651, 
    -89.1893861, -89.1893131404503, -89.1890198729859, -89.1889302719619, 
    -89.1889302672448, -89.1890085, -89.1890281, -89.1890154016525, 
    -89.1891503388674, -89.1891748732833, -89.1891022744342, 
    -89.1890772, -89.1889644, -89.1886358, -89.1882091, -89.1878216, 
    -89.187694179373, -89.1874546912406, -89.1873312, -89.1871679265026, 
    -89.1863127381684, -89.1863059343991, -89.1862817, -89.1858354, 
    -89.1854185, -89.1851929, -89.1846632, -89.1840698, -89.1835107, 
    -89.1830203, -89.1827298972173, -89.1818679097836, -89.1818037014299, 
    -89.1810367366997, -89.1809077311245, -89.180627, -89.1801414, 
    -89.1796853, -89.1795529, -89.1794745247335, -89.1793042749782, 
    -89.1793028, -89.179342, -89.1794009, -89.1793764, -89.1791557, 
    -89.1788565, -89.1786898, -89.1785132, -89.1785132, -89.1786113, 
    -89.1787928, -89.1790576, -89.1793371, -89.1796069, -89.1798129, 
    -89.1799306, -89.1798864, -89.1797442, -89.1795971, -89.1795431, 
    -89.1793715, -89.1792881, -89.1791262, -89.1790309085081, 
    -89.1789608161124, -89.1789252, -89.1788222, -89.1786309, 
    -89.178371, -89.177959, -89.1775569, -89.1769683, -89.1762131, 
    -89.1754676, -89.1747663, -89.1744013590117, -89.174356468007, 
    -89.174032908386, -89.1738148, -89.1736383, -89.1734372, 
    -89.1731626, -89.1727653, -89.1726182, -89.1726084, -89.1726672, 
    -89.1726035, -89.1723681, -89.1717795, -89.1711329973726, 
    -89.1708659345758, -89.1704663344708, -89.1699990252447, 
    -89.1697737, -89.1693323, -89.168886, -89.1687960331566, 
    -89.1686144674725, -89.1683369341033, -89.1680920674276, 
    -89.1679370674068, -89.1676596673484, -89.1670398671867, 
    -89.166419867029, -89.1662240669873, -89.1661261336465, -89.1661097336774, 
    -89.166150467055, -89.1661757741975, -89.1661984, -89.1663259, 
    -89.1663848, -89.1663844508349, -89.1664274672236, -89.166329333958, 
    -89.1661333339463, -89.165872334938, -89.1656030661272, -89.1647628659153, 
    -89.1647576101403, -89.1646781, -89.1642023, -89.1636825, 
    -89.1631087, -89.162628, -89.1621376, -89.1618434, -89.1615491, 
    -89.1610341, -89.1605094, -89.1601661, -89.1599405, -89.1595923, 
    -89.1592195, -89.1589057, -89.1585329, -89.1581308, -89.1575521, 
    -89.1572302, -89.1568164, -89.1565663, -89.1562279, -89.1559287, 
    -89.1550999, -89.1546921037537, -89.1545270637028, -89.153238263334, 
    -89.1529689299289, -89.1527242632164, -89.1526263298472, 
    -89.1525692631513, -89.1525612631296, -89.152691929813, -89.1528342359029, 
    -89.1526317, -89.1525212, -89.1524614, -89.1524172, -89.1524779, 
    -89.1527348, -89.1530395, -89.1533351527743, -89.1541684635419, 
    -89.1548943304196, -89.1560280641033, -89.1567590496996, 
    -89.1570077, -89.157351, -89.157454, -89.1573804, -89.1573412, 
    -89.1571597, -89.1569341, -89.1565957, -89.1562818, -89.1562279, 
    -89.1561151, -89.1561445, -89.1563211, -89.1566153, -89.1568017, 
    -89.1568605, -89.1569243, -89.1571162, -89.1571234, -89.1571319, 
    -89.1571799, -89.1571765, -89.1572354, -89.157281, -89.15731, 
    -89.1573308, -89.1574435, -89.157551, -89.1576458, -89.1577747, 
    -89.1578502, -89.1579073, -89.1580365, -89.1581284, -89.1581527, 
    -89.158222, -89.1583451, -89.1584804, -89.1586354, -89.1587418, 
    -89.1587937, -89.1589099, -89.1590863, -89.1592955, -89.1595019, 
    -89.1596388, -89.1597481, -89.1599204, -89.1600136, -89.1601706, 
    -89.1602907, -89.1604918, -89.1608106, -89.1610828, -89.161534, 
    -89.161838, -89.1620857, -89.1622819, -89.1624143, -89.1625443, 
    -89.162711, -89.1629685, -89.163454, -89.1636551, -89.1639494, 
    -89.1643809, -89.1647855, -89.1652024, -89.1654231, -89.1657296, 
    -89.1658988, -89.1660533, -89.1661612, -89.166274, -89.1664996, 
    -89.166538, -89.1667546, -89.1672966, -89.1675761, -89.1678875, 
    -89.1682382, -89.16866, -89.1691921, -89.1697512, -89.170374, 
    -89.1708449, -89.1712764, -89.1717056, -89.1718429, -89.1721273, 
    -89.1723603, -89.1727257, -89.1729831, -89.1731793, -89.1735079, 
    -89.1738488, -89.1742117, -89.1745108, -89.1748958, -89.1752539, 
    -89.1755923, -89.1760385, -89.1763598, -89.1764928411171, 
    -89.1766672679532, -89.177379280072, -89.177397, -89.1776153, 
    -89.1778997, -89.1782941561888, -89.17843299569, -89.1786035, 
    -89.1789274003356, -89.1797050812518, -89.1798639, -89.1804672, 
    -89.1808791, -89.1814873, -89.1819605, -89.1824632, -89.1830444, 
    -89.1834269, -89.1835252628211, -89.1837039364315, -89.1842743647614, 
    -89.1844642, -89.1847756, -89.1851802, -89.1852624248864, 
    -89.1853184701924, -89.1857260703081, -89.1862967361065, 
    -89.1867371372799, -89.1873974707965, -89.1874205203036, 
    -89.1874485, -89.1875703697865, -89.1885796711416, -89.189174870285, 
    -89.1899575382274, -89.1906098707125, -89.1908568548653, 
    -89.190987, -89.1912322, -89.1915314, -89.191726804936, -89.1918001387725, 
    -89.1936655474388, -89.1940252, -89.1946554, -89.1950591987336, 
    -89.1958846731336, -89.1959478351788, -89.1962886, -89.1965681, 
    -89.1969531, -89.1974205432467, -89.1974618064503, -89.1978187, 
    -89.1980762, -89.198498, -89.1988045, -89.1991257, -89.1996848, 
    -89.2002145, -89.2007687, -89.2013008, -89.2016294, -89.2018893, 
    -89.2019482, -89.2022449, -89.2024288, -89.2025195, -89.2025146, 
    -89.2024263, -89.2023332, -89.2023332, -89.2026421, -89.2030247, 
    -89.2033778, -89.2038192, -89.2042777, -89.204587482491, 
    -89.2047534740451, -89.2048758751251, -89.2049980751801, 
    -89.2050226752278, -89.2054548764496, -89.2064250757354, 
    -89.2067591435437, -89.2073135416186, -89.2077699427751, 
    -89.2080470761759, -89.2086665429606, -89.2087683603951, 
    -89.2089638, -89.2091968, -89.2093758, -89.2095646, -89.2098515, 
    -89.209882543667, -89.210157876564, -89.2112111342622, -89.2113155, 
    -89.2114287897642, -89.2118650664527, -89.2119359, -89.2121075, 
    -89.2121574569755, -89.212187277044, -89.2124236771048, -89.213401744073, 
    -89.2137604775029, -89.2144043432952, -89.2150562778149, 
    -89.2153397954358, -89.21535497207, -89.2154523, -89.2154523, 
    -89.215364, -89.2152438, -89.2151507, -89.2149324, -89.2146896, 
    -89.2144837, -89.2140545, -89.2134464, -89.2127819, -89.2125244, 
    -89.2121664, -89.211801, -89.2115607, -89.2113424, -89.211161, 
    -89.211004, -89.210879, -89.2108299, -89.210825, -89.2110016, 
    -89.2110457, -89.2110261, -89.2111095, -89.2111365, -89.2110751, 
    -89.2109722, -89.2107907, -89.2106092, -89.2104744, -89.2103199, 
    -89.2101997, -89.2099275, -89.2095523, -89.2091821, -89.2089123, 
    -89.2086034, -89.2082184, -89.2075465, -89.2073822, -89.2072007, 
    -89.2067422, -89.2065166, -89.2061855, -89.2059697, -89.2057515, 
    -89.2050992, -89.2047829, -89.2042704, -89.2035053, -89.2031326, 
    -89.2027206, -89.2023283, -89.2019408, -89.2014798, -89.2010507, 
    -89.2007049, -89.2004989, -89.2003812, -89.2003199, -89.2003028, 
    -89.2003445, -89.2003905983985, -89.2003905392014, -89.2004393391662, 
    -89.2004504298488, -89.2004548, -89.2005308, -89.2006166, 
    -89.2007858, -89.2008062186348, -89.2015231392455, -89.201743072617, 
    -89.2019060736903, -89.2023298717044, -89.2026803395001, 
    -89.2029003395609, -89.20337313972, -89.2035197397666, -89.2036827398157, 
    -89.2037436680974, -89.2037701, -89.2041061, -89.2042826, 
    -89.2043734, -89.2044517843352, -89.2044486732169, -89.2044811398709, 
    -89.20464413886, -89.2053368733823, -89.2056545401255, -89.2059642745629, 
    -89.206257541271, -89.2070804737173, -89.2075693394512, -89.2083517406859, 
    -89.2095331409663, -89.2104701401233, -89.2107585944563, 
    -89.2108201, -89.2115509, -89.2122424, -89.2127696, -89.2131301, 
    -89.2132444916887, -89.2135878752487, -89.2135980844745, 
    -89.2136892, -89.2140079, -89.2144493, -89.2148981, -89.215234, 
    -89.2156411, -89.2160016, -89.2163424, -89.2164503157843, 
    -89.2166590759077, -89.2183371429317, -89.2190051430697, 
    -89.2194611431552, -89.2197951432208, -89.2201860766347, 
    -89.2205201433779, -89.2209928356511, -89.2210138, -89.2214405, 
    -89.2215337390921, -89.2219291426219, -89.2224665447881, 
    -89.2225800515154, -89.222593, -89.2225832, -89.222414, -89.2223036, 
    -89.2220584, -89.2219285, -89.2218107, -89.2218009, -89.2217102, 
    -89.2217593, -89.221877, -89.2220509770662, -89.2220816765379, 
    -89.2223341422069, -89.222619276645, -89.2228797433598, -89.2231646767337, 
    -89.2237671434681, -89.2242635435159, -89.224466943504, -89.2248412768486, 
    -89.2251912758423, -89.2255168769279, -89.225769144656, -89.2261110769906, 
    -89.2266402781419, -89.2272102761689, -89.2275846772627, 
    -89.2280650773448, -89.2290095452416, -89.2295877453745, 
    -89.2308254789802, -89.2314931447472, -89.2326169450097, 
    -89.2332439462017, -89.2341152787127, -89.234603879874, -89.2347178788573, 
    -89.2350190799337, -89.2352713455967, -89.235425678919, -89.2354416788763, 
    -89.2354767000503, -89.2354595, -89.2354705868803, 47.8534601555129, 
    47.853345076599, 47.8529230098768, 47.8526116529378, 47.8526076, 
    47.8524463, 47.8522917, 47.8521436, 47.8520234, 47.8518935, 
    47.8517454, 47.8516779, 47.8517141, 47.8516713, 47.8516943, 
    47.8516878, 47.8517223, 47.8516417, 47.8516104, 47.8516154, 
    47.8515578, 47.8515183, 47.8515479, 47.8516351, 47.8516943, 
    47.851724, 47.8517174, 47.8517108, 47.8516219, 47.8515627, 
    47.8514952, 47.8514788, 47.8514031, 47.8514261, 47.8514393, 
    47.8514179, 47.8513735, 47.8513126, 47.8513208, 47.8512287, 
    47.8511727, 47.8511085, 47.851069, 47.851069, 47.8511052, 
    47.8511793, 47.8511744, 47.8512056, 47.8512418, 47.8512846, 
    47.8512879, 47.8513438, 47.8513768, 47.8514031, 47.8514673, 
    47.8515364, 47.8515857, 47.8516005, 47.8516022, 47.851617, 
    47.8515808, 47.8515989, 47.8515808, 47.8515397, 47.8515249, 
    47.851464, 47.8513932, 47.8512204, 47.85099, 47.8508452, 
    47.8506461, 47.8503466, 47.8499731, 47.8494448, 47.8490248, 
    47.8486101, 47.8481147, 47.8478215915556, 47.8478182117602, 
    47.8475878784163, 47.8471218783815, 47.8470746848553, 47.8465267, 
    47.8462909075023, 47.8453840782424, 47.8453825628658, 47.8453754, 
    47.8448415, 47.8442704, 47.8439676, 47.843696, 47.8434279058424, 
    47.8431252780756, 47.8420728113299, 47.8414916112685, 47.8411462112347, 
    47.8406802111814, 47.8396658110477, 47.8393806776726, 47.8392382109834, 
    47.8378894107799, 47.8375494774006, 47.8372368504577, 47.8370976, 
    47.8369706, 47.8368514915368, 47.8367984106434, 47.8364914106104, 
    47.8362774772413, 47.8358334104862, 47.8355154104282, 47.8351864103715, 
    47.8343858769261, 47.8337662768348, 47.8333770767865, 47.8333032701288, 
    47.8332672, 47.8331965, 47.8331372, 47.8331109, 47.8329808, 
    47.8328837, 47.8328014, 47.8326746, 47.8326368, 47.8325495, 
    47.8324392, 47.8323602, 47.8322615, 47.8321693, 47.8321034, 
    47.8320573, 47.8320228, 47.8319651, 47.8319223, 47.8319092, 
    47.8319454, 47.8319684, 47.8318713, 47.831733, 47.8316606, 
    47.8315981, 47.8315569, 47.831654, 47.8317693, 47.8318351, 
    47.8318763, 47.8318812, 47.8319075, 47.8320145, 47.8320672, 
    47.8320919, 47.8320475, 47.8319553, 47.8319289, 47.8318614, 
    47.8318483, 47.8317874, 47.8316952, 47.8316046, 47.8315437, 
    47.8315026, 47.8314927, 47.8315585, 47.8315964, 47.831524, 
    47.8314779, 47.831547, 47.8316178, 47.8316771, 47.8317215, 
    47.8317808, 47.8317972, 47.8317742, 47.8316902, 47.8315981, 
    47.8316293, 47.8316359, 47.8315454, 47.8314077290859, 47.831387010666, 
    47.8312006106828, 47.8312003371415, 47.8311536, 47.8310828, 
    47.830905, 47.8307931, 47.8307075, 47.8305165, 47.8303074, 
    47.8300934, 47.8298646, 47.8295683, 47.8292835, 47.8289131, 
    47.8285509, 47.8281097, 47.827652, 47.8271614, 47.8268141, 
    47.8267725384708, 47.8267478772953, 47.8262542772655, 47.8258540105764, 
    47.8257296995744, 47.8254245, 47.8253241, 47.8251891, 47.8250969, 
    47.8250508, 47.825013, 47.8249734, 47.8249652, 47.8249981, 
    47.8249981, 47.8249339, 47.8247314, 47.8245404, 47.8243989, 
    47.8243346, 47.8242836, 47.8242507, 47.8242638, 47.8242474, 
    47.8242095, 47.8241255, 47.8239807, 47.8239379, 47.8239411, 
    47.8239148, 47.8238852, 47.8238275, 47.8237963, 47.8237732, 
    47.8238045, 47.8238621, 47.8239197, 47.823923, 47.8238967, 
    47.8238391, 47.823793, 47.8238127, 47.8238473, 47.8238473, 
    47.8238127, 47.82376, 47.823765, 47.823793, 47.8238374, 47.8238736, 
    47.8239181, 47.8239428, 47.8239411, 47.8238539, 47.8238391, 
    47.8238619047018, 47.8239656111974, 47.8241410778918, 47.8242286779134, 
    47.8242573078649, 47.8243034, 47.8244943, 47.8247841, 47.8251331, 
    47.825492, 47.825716, 47.8257769, 47.8258246, 47.8259053, 
    47.8260716, 47.8262197, 47.8263235, 47.8264124, 47.8264058, 
    47.8264107, 47.8264535, 47.8264897, 47.8265836, 47.8267169, 
    47.8267976, 47.826977, 47.8272635, 47.8276076, 47.8277446, 
    47.8278216, 47.8279582, 47.8280521, 47.828113, 47.8281377, 
    47.8281212, 47.8280455, 47.8279582, 47.8279138, 47.8279237, 
    47.8279665, 47.8280455, 47.8281229, 47.8281509, 47.8281509, 
    47.8280817, 47.8279879, 47.8279187, 47.8279303, 47.8278414, 
    47.8277821, 47.827759, 47.8276866, 47.8276273, 47.8276026, 
    47.8276175, 47.8276059, 47.8275631, 47.8275088, 47.827443, 
    47.8274051, 47.8273853, 47.8273986547758, 47.8274960129923, 
    47.827539520767, 47.8275483, 47.827601, 47.8276438, 47.82768, 
    47.8277541, 47.8278578, 47.8278249, 47.8278331, 47.8278825, 
    47.8278628, 47.8278232, 47.8277607, 47.8277294, 47.8277212, 
    47.8276734, 47.827624, 47.827624, 47.827685, 47.8277195, 
    47.8277047, 47.8276389, 47.8276487, 47.8276158, 47.8275714, 
    47.8275072, 47.8274874, 47.8275236, 47.8274973, 47.8275006, 
    47.8275697, 47.8275977, 47.8276603, 47.8276767, 47.827759, 
    47.8278364, 47.8278924, 47.8279335, 47.8280093, 47.8280702, 
    47.8281607, 47.8283715, 47.8284225, 47.8284324, 47.828406, 
    47.8283352, 47.8283649, 47.8283682, 47.8282875, 47.8282513, 
    47.8282694, 47.828383, 47.8283962, 47.8283748, 47.8283896, 
    47.8284258, 47.8283863, 47.8283994, 47.8284373, 47.828411, 
    47.8283385, 47.8283122, 47.8283188, 47.8283649, 47.8284455, 
    47.8284834, 47.8284587, 47.8285196, 47.8285476, 47.8285986, 
    47.828625, 47.8287534, 47.8287748, 47.828816, 47.8288077, 
    47.8287682, 47.82876, 47.8287336, 47.8286925, 47.8286859, 
    47.8287715, 47.8287797, 47.8287517, 47.8286546, 47.828569, 
    47.8283534, 47.8282579, 47.8281591, 47.8280689, 47.8279915, 
    47.827901, 47.8278878, 47.8278736202981, 47.8278293737666, 
    47.8278351, 47.8278187, 47.8278483, 47.8278483, 47.827901, 
    47.8279257, 47.8279092, 47.8279306, 47.8279540707394, 47.8280166810719, 
    47.8280532209026, 47.8280458, 47.8280837, 47.8281298, 47.8281759, 
    47.8282154, 47.8282582, 47.8284969, 47.8287208, 47.8288673, 
    47.8289562, 47.8290254, 47.8290451, 47.8290813, 47.8291176, 
    47.8291538, 47.8292526, 47.8294682, 47.8296081, 47.8297201, 
    47.829916, 47.8300263, 47.8300806, 47.8301481, 47.830186, 
    47.8302897, 47.8303473, 47.8306173, 47.830665, 47.8310058, 
    47.8310897, 47.8311539, 47.8312297, 47.8313103, 47.8313811, 
    47.8315556, 47.8316445, 47.8317038, 47.8320165, 47.8322651, 
    47.8325153, 47.832675, 47.832861, 47.8329581, 47.8330635, 
    47.8332018, 47.8334108, 47.833526, 47.8335919, 47.8336841, 
    47.8337351, 47.8338223, 47.8338898, 47.8338553, 47.8338092, 
    47.8338437, 47.8339096, 47.8339771, 47.8339639, 47.8340116, 
    47.8340166, 47.8340511, 47.8341384, 47.8341861, 47.834112, 
    47.8341713, 47.8342454, 47.8343458, 47.8344709, 47.8345466, 
    47.8345878, 47.8346633, 47.8347291, 47.834762, 47.8348147, 
    47.8349909, 47.8352411, 47.8354271, 47.8356032, 47.8357711, 
    47.835967, 47.8362945, 47.8364427, 47.8365735, 47.8366879, 
    47.8369002, 47.8370188, 47.8370994, 47.8372196, 47.8373002, 
    47.8373578, 47.8374089, 47.8374879, 47.8376409, 47.8378533, 
    47.8381035, 47.8382697, 47.8383866, 47.8384541, 47.8385429, 
    47.8387273, 47.8388606, 47.8389495, 47.8390186, 47.8391157, 
    47.8392211, 47.8392606, 47.8393001, 47.839361, 47.839435, 
    47.8395502, 47.8396144, 47.8396457, 47.8396934, 47.839751, 
    47.8398152, 47.8398942, 47.8399502, 47.8400111, 47.8400802, 
    47.8401049, 47.8401444, 47.8401592, 47.8402152, 47.8402827, 
    47.8403847, 47.8405542, 47.8408127, 47.8411336, 47.8411994, 
    47.8412241, 47.8412291, 47.8412201736453, 47.8412250848141, 
    47.8412052740444, 47.8412208, 47.8411978, 47.8412077, 47.8412422, 
    47.8412307, 47.8413229, 47.8414134, 47.8414595, 47.8415204, 
    47.8416274, 47.841685, 47.8417096, 47.8417755, 47.8417969, 
    47.8417788, 47.8417112708236, 47.8416931657174, 47.8416948, 
    47.8417574, 47.8417722, 47.8419088, 47.842001, 47.8420421, 
    47.8420898, 47.842154, 47.8422166, 47.842261, 47.8423384, 
    47.8424042, 47.8424355, 47.8424766, 47.8425457, 47.8426264, 
    47.8427548, 47.8428436, 47.8429012, 47.8430428, 47.8431876, 
    47.8434411, 47.8436435, 47.8438591, 47.8440533, 47.8442244, 
    47.8443429, 47.8445306, 47.8446853, 47.8448498, 47.844891, 
    47.844965, 47.8451099, 47.8451971, 47.8452008870337, 47.8452246194175, 
    47.8453014194566, 47.8453389384909, 47.8454028, 47.8455328, 
    47.8456447, 47.8457747, 47.8458866, 47.8459772, 47.8459969, 
    47.8459949914194, 47.8460310864145, 47.8459762864215, 47.8459402275242, 
    47.845941, 47.8459903, 47.8460381, 47.8460364, 47.8460644, 
    47.8461335, 47.8461549, 47.846117, 47.8460644, 47.8459887, 
    47.8459634139007, 47.8460642198246, 47.8461410198676, 47.846322086612, 
    47.8464536866497, 47.8465159459644, 47.8465482, 47.8466256, 
    47.8467015827375, 47.8467552867329, 47.8468816201268, 47.8469638201617, 
    47.8470624868566, 47.8471763459545, 47.8471917, 47.8472443, 
    47.8473135, 47.8473875, 47.847455, 47.8475142, 47.8475998, 
    47.8476898485688, 47.8477152204062, 47.8477536871106, 47.8477840110258, 
    47.8477858, 47.8477858000044, 47.8478016264117, 47.8478236, 
    47.8478631, 47.8478393080159, 47.847840085442, 47.8478862, 
    47.847924, 47.8479108, 47.8478864817567, 47.8479456872334, 
    47.8479532848404, 47.8480046, 47.8480836, 47.8481264, 47.8481396, 
    47.848184, 47.8482317, 47.8482548, 47.8482360914454, 47.8482364874062, 
    47.8482723368755, 47.848314, 47.8483111401723, 47.8483186874505, 
    47.8483700414852, 47.8484095, 47.8484374, 47.8485312, 47.8485691, 
    47.8486152, 47.8486399, 47.8486119, 47.8486662, 47.8486593513193, 
    47.848685849999, 47.8487337, 47.8488308, 47.8488982, 47.8489492, 
    47.8489480778276, 47.8489768210618, 47.848987821084, 47.8489714211052, 
    47.8490134365046, 47.8490825, 47.8491335, 47.849094132685, 
    47.8491742878755, 47.8492536929498, 47.8492998, 47.8493623, 
    47.8494034, 47.8495696, 47.8496009, 47.849642, 47.8496996, 
    47.8497556, 47.8498428, 47.8499646, 47.8500353, 47.8501357, 
    47.85032, 47.8504266104133, 47.8504572881964, 47.8504635612434, 
    47.8505126, 47.8505751, 47.8506919, 47.8508417, 47.8510424, 
    47.8511255454526, 47.8513564883709, 47.8516032884492, 47.851691021821, 
    47.8518170885331, 47.8518706732123, 47.8519211, 47.8519837, 
    47.8519990320356, 47.8522282886829, 47.8523091714947, 47.8523194, 
    47.8524345, 47.8524788064973, 47.8525078887921, 47.8526560221672, 
    47.8527436888628, 47.8528478222218, 47.853023288944, 47.8531274889797, 
    47.8531932223406, 47.8532272925687, 47.8532639, 47.8533466153265, 
    47.8534070224434, 47.8537194892255, 47.8537798225857, 47.8538290892788, 
    47.8538620226351, 47.8539496893447, 47.8540208893758, 47.8541032227373, 
    47.8541854227694, 47.8542292227945, 47.8543168894962, 47.8543498228525, 
    47.8543498228671, 47.8544046228909, 47.8544868895857, 47.854503222933, 
    47.8545910229598, 47.8546842229945, 47.8547662896865, 47.854996623106, 
    47.8550622897952, 47.8551444898356, 47.8552212898586, 47.8552980232171, 
    47.8555644061923, 47.8556448, 47.8557979, 47.8558346100174, 
    47.8558954234564, 47.8559556901532, 47.8560268901798, 47.8560926235692, 
    47.856120023606, 47.8562294237089, 47.8562294237285, 47.8561908904256, 
    47.8561964237725, 47.8561634237847, 47.8561507009558, 47.8561286, 
    47.8560973, 47.856099, 47.8561187, 47.8561385, 47.8561335, 
    47.8561779, 47.8562306, 47.856224, 47.8561845, 47.856122, 
    47.8561023, 47.8560814010832, 47.856085690782, 47.8560856556992, 
    47.8561023, 47.856145, 47.8561352, 47.8562076, 47.856247, 
    47.856247, 47.8563046, 47.8563853, 47.8563922240511, 47.8564200242081, 
    47.8564166042843, 47.8564215, 47.8564159768154, 47.856419890901, 
    47.8564472909216, 47.8565692197829, 47.8566041, 47.8567357, 
    47.8567802, 47.8569217, 47.8570796, 47.8571342056312, 47.8571648245706, 
    47.8572688912842, 47.8572906913045, 47.8572765070703, 47.8572754, 
    47.8571866572172, 47.8572028913203, 47.8572125792636, 47.8572507, 
    47.8572613482874, 47.8572686246845, 47.8573616913753, 47.8574878247356, 
    47.8575027092383, 47.8575782, 47.8576423, 47.8576703, 47.8576473, 
    47.8576467083949, 47.8576466248034, 47.8576794248281, 47.8577426839129, 
    47.8578414, 47.8579566, 47.8580438, 47.8581688, 47.858307, 
    47.8584120919454, 47.8584354917438, 47.858440888129, 47.8584452, 
    47.8585078, 47.8585193, 47.8585040286292, 47.8585117630161, 
    47.8585456, 47.8585258151473, 47.8585338251768, 47.8585886252017, 
    47.8586158918968, 47.8587364252792, 47.8588076253164, 47.8589017538596, 
    47.8589142, 47.858916813401, 47.8590467885727, 47.8590688, 
    47.8591445, 47.8591906, 47.8592268, 47.8592379656086, 47.859267692133, 
    47.8593264933583, 47.8593781, 47.8595032, 47.8595490079518, 
    47.8595526255315, 47.8596294255572, 47.8596730922507, 47.8596894922764, 
    47.8597141864056, 47.8597286, 47.8597203519794, 47.8597276923062, 
    47.8598262256856, 47.8599412924018, 47.8600070257549, 47.8601000924445, 
    47.8601330257874, 47.8601334459934, 47.8601481, 47.8601373182237, 
    47.8601494258014, 47.8601986924912, 47.8602972925199, 47.8603576258672, 
    47.8603973615979, 47.8604574, 47.8605002, 47.8604969, 47.8604806170522, 
    47.8604450925778, 47.8604706660927, 47.8605232, 47.8605677, 
    47.8605718009245, 47.8605874926216, 47.8609876926855, 47.8611138260481, 
    47.8612178260832, 47.8613384261183, 47.8614808928227, 47.8618316928947, 
    47.8619850929306, 47.8623468263375, 47.8625386263809, 47.8626536930787, 
    47.8627413775495, 47.8628101, 47.862973, 47.8630898, 47.8631374258967, 
    47.8632232266116, 47.8632998266636, 47.8633034820117, 47.8634188, 
    47.8634763163445, 47.8634802267624, 47.8635294934526, 47.8635194271829, 
    47.8635257, 47.8634797, 47.8634559898892, 47.8635070268728, 
    47.8636766936049, 47.8637916936448, 47.8638952880109, 47.8638959, 
    47.8639633, 47.8641838, 47.8643631, 47.8643972864927, 47.8643998271435, 
    47.8645258271867, 47.8646186939009, 47.8646624272738, 47.8646512939551, 
    47.8646072939597, 47.864547027293, 47.8645632939703, 47.8646290939895, 
    47.8646892940107, 47.8647934273736, 47.864842627396, 47.8650506274818, 
    47.8650666726697, 47.8651626, 47.8652597, 47.8653946, 47.865518, 
    47.8655147, 47.8654834, 47.8654801208741, 47.8655417829505, 
    47.8656046, 47.8657163, 47.8658609, 47.8659941, 47.8660895, 
    47.8661998, 47.8663198, 47.8663495, 47.8663544299316, 47.8664244281048, 
    47.8664749613453, 47.8665567, 47.8667031, 47.8668266355852, 
    47.8670641466388, 47.8671605, 47.8674089, 47.8676046, 47.8677593, 
    47.8678761, 47.8680455, 47.8680500121395, 47.8684122287673, 
    47.8692908290801, 47.8699884293639, 47.8709714964148, 47.8711142297919, 
    47.8713720965306, 47.8719536966749, 47.8722828300817, 47.872453030136, 
    47.8726890968969, 47.873018697047, 47.8734740971732, 47.8737046305859, 
    47.8739902307048, 47.8740944974189, 47.8743744308407, 47.8747752310018, 
    47.8749014977217, 47.8753418979137, 47.87611583159, 47.8765386318016, 
    47.8767746319303, 47.8769778320746, 47.8772686321819, 47.877466232249, 
    47.8774693511414, 47.8775051, 47.8777288, 47.8779821, 47.8781173779748, 
    47.878332699148, 47.8784040991791, 47.8785906993166, 47.8788212994731, 
    47.879139499645, 47.8793534997283, 47.87964330869, 47.8796975, 
    47.879811, 47.8798274, 47.8797173770424, 47.8797594332051, 
    47.8802036333453, 47.8805232843974, 47.8806678, 47.8807115497066, 
    47.8815879124797, 47.8816809, 47.8819868, 47.8821825, 47.8822554279141, 
    47.8825617007096, 47.8827263007637, 47.8830148389666, 47.8831577, 
    47.8832712, 47.8832744, 47.8832445298586, 47.8838723009043, 
    47.8838763, 47.8839471, 47.8840013, 47.8840227, 47.8840034340145, 
    47.8841410346092, 47.8843424743015, 47.8843796, 47.8844503, 
    47.8845243, 47.8846065, 47.8846328, 47.8847134, 47.8847779534344, 
    47.8846948347167, 47.884645434697, 47.8846618346859, 47.8847277013566, 
    47.884815434701, 47.8848977013836, 47.8849854347397, 47.884972826411, 
    47.8850075, 47.8850966, 47.8851397, 47.8851806, 47.8852132, 
    47.8852634, 47.885265798662, 47.8853473014855, 47.8855118348567, 
    47.8857640349364, 47.8858517016442, 47.8858681017732, 47.8860161018568, 
    47.886213501959, 47.8862518353306, 47.8860982354493, 47.8861256354777, 
    47.88683263578, 47.887572636049, 47.8879398361925, 47.8879996326065, 
    47.8880417, 47.8880380369785, 47.8883398363552, 47.8884549030584, 
    47.8886676558543, 47.8886715, 47.8886722601283, 47.8889921032161, 
    47.8894031033674, 47.8895674367749, 47.8896298356158, 47.8896302, 
    47.8896959, 47.8897288, 47.8897275098198, 47.890290903682, 
    47.8907785038556, 47.8911581038719, 47.8912071, 47.8913008, 
    47.8913093244272, 47.8913922374074, 47.8917814375083, 47.8918055660729, 
    47.8918533, 47.8919256, 47.8919092, 47.8919124, 47.8919355, 
    47.8920193, 47.8920621, 47.8920621, 47.8920495, 47.8920111, 
    47.8919519, 47.8918845, 47.8917968985378, 47.8917819040155, 
    47.8917107039978, 47.8915461235239, 47.8914817, 47.8914225, 
    47.8913616, 47.8912814, 47.8912482, 47.8912235, 47.8911413, 
    47.891013, 47.8907845, 47.8905904, 47.8904786, 47.8904425, 
    47.8903948, 47.8903422, 47.8903619, 47.8904441, 47.8905378, 
    47.8906266, 47.890745, 47.8908996, 47.8910304322329, 47.8911685036675, 
    47.891420703736, 47.8919412372481, 47.8922152373637, 47.8925111041295, 
    47.8929003042275, 47.8931211692843, 47.8931637, 47.8931982, 
    47.8931062, 47.8930009, 47.8928826, 47.8927329, 47.8926178, 
    47.8926293, 47.8926968, 47.8927691, 47.8928365, 47.8929302, 
    47.8930729617043, 47.8930759041905, 47.8931527042011, 47.893300704234, 
    47.8934103042709, 47.8938487044294, 47.8945828380337, 47.8948129047752, 
    47.8951648074559, 47.8951532, 47.8949986, 47.8948704, 47.8947652, 
    47.8946928, 47.894678, 47.8945958, 47.8945399, 47.8944725, 
    47.8945087, 47.8945827, 47.8947027, 47.8948474, 47.894992, 
    47.8951384, 47.8952436, 47.8954919, 47.8956579, 47.8958141, 
    47.8958280467037, 47.8960796382424, 47.8968468384839, 47.8971152385886, 
    47.897735375004, 47.8977706, 47.8978577, 47.8979613, 47.8980813, 
    47.8981997, 47.8983033, 47.8984134, 47.8984197810719, 47.8984198388806, 
    47.8985020388988, 47.8988526390104, 47.8990881057706, 47.8994222392262, 
    47.8999209060357, 47.9002496394682, 47.9006223062296, 47.9007218811351, 
    47.9007266, 47.9007134, 47.901006, 47.9010784, 47.9011145, 
    47.9011162, 47.9012428, 47.9015716, 47.9017359, 47.9018149, 
    47.9018823, 47.9019349, 47.9019505, 47.9019562, 47.9018823, 
    47.9018116, 47.9017803, 47.9017787, 47.9018592, 47.9020269, 
    47.9020417, 47.9019957, 47.9019349, 47.9019529, 47.9019003, 
    47.9017853, 47.9018247, 47.9016488, 47.9015337, 47.9014548, 
    47.9014318, 47.9013184, 47.9012559, 47.9013069, 47.9012937, 
    47.9011984, 47.9011721, 47.9011786, 47.901131, 47.9010784, 
    47.9009929, 47.9008088, 47.9006641, 47.9005211, 47.9004569, 
    47.9003698, 47.9003567, 47.9002876, 47.9001857, 47.9000953, 
    47.8999522, 47.8999046, 47.8999046, 47.8998404, 47.899727, 
    47.8996629, 47.899556, 47.8995412, 47.8995593, 47.8995018, 
    47.8995314, 47.8995199, 47.8994377, 47.8993078, 47.8991319, 
    47.8990727, 47.8990546, 47.8991154, 47.8991385, 47.8991105, 
    47.8990513, 47.8990891, 47.8991105, 47.8990743, 47.8989823, 
    47.8988425, 47.8987274, 47.8987357, 47.8987011, 47.8986288, 
    47.8985663, 47.8985729, 47.898642, 47.898665, 47.8986452, 
    47.8985482, 47.8984332, 47.8983559, 47.8983641, 47.8983066, 
    47.8982178, 47.8981783, 47.8980501, 47.8979564, 47.8978988, 
    47.8977854, 47.8977459, 47.8977509, 47.8976785, 47.897621, 
    47.8976243, 47.8977048, 47.8977509, 47.8977772, 47.8977607, 
    47.8977673, 47.8978084, 47.897764, 47.8976226, 47.8974549, 
    47.8973218, 47.8971311, 47.8969946, 47.8969469, 47.8968269, 
    47.8966822, 47.8966855, 47.8965918, 47.8964882, 47.8963534, 
    47.8962054, 47.8960953, 47.8961117, 47.8960344, 47.8960016, 
    47.8959341, 47.8957862, 47.8955659, 47.8953488, 47.8950841, 
    47.8949214, 47.8947734, 47.8945876, 47.8944363, 47.8942308, 
    47.8939842, 47.8937655, 47.893657, 47.8934416, 47.8932459, 
    47.8930634, 47.8930141, 47.8928431, 47.8926211, 47.892409, 
    47.8922298, 47.8920506, 47.8918385, 47.8916329, 47.8914241, 
    47.8912663, 47.8910936, 47.8909653, 47.8908634, 47.8908042, 
    47.8907171, 47.890648, 47.8906217, 47.8905395, 47.8904392, 
    47.8903027, 47.8902501, 47.8902221, 47.890278, 47.8903767, 
    47.8904803, 47.8906036, 47.8907549, 47.8908305, 47.890921, 
    47.8910147, 47.8910804, 47.8912712, 47.8913172, 47.8915359, 
    47.8917776, 47.8920045, 47.8921805, 47.892483, 47.892631, 
    47.8927642, 47.8928645, 47.8931785, 47.8934251, 47.8935764, 
    47.8936751, 47.8938, 47.8938839, 47.8939694, 47.8940401, 
    47.8941058, 47.8941502, 47.8941535, 47.8942028, 47.894188, 
    47.8942308, 47.8941996, 47.8940943, 47.8939694, 47.8939381, 
    47.8939447, 47.8938609, 47.8938378, 47.8937819, 47.89368, 
    47.8936372, 47.8934679, 47.8932755, 47.8931637, 47.893093, 
    47.8930256, 47.8929368, 47.8928464, 47.8928086, 47.8927724, 
    47.8927806, 47.8928332, 47.8928349, 47.8929269, 47.8930223, 
    47.8930552, 47.8931884, 47.8933216, 47.8936603, 47.8940401, 
    47.8942275, 47.8943114, 47.8943969, 47.8944561, 47.8945646, 
    47.8946599, 47.8947142, 47.8947668, 47.8948424, 47.8948457, 
    47.8948967, 47.8948687, 47.8948737, 47.8948507, 47.8948556, 
    47.8948835, 47.8949279, 47.8950266, 47.8950496, 47.8950282, 
    47.8950118, 47.8950019, 47.8949148, 47.8948408, 47.8946665, 
    47.8945037, 47.8943558, 47.8941897, 47.8940269, 47.8938395, 
    47.8936849, 47.893555, 47.8934597, 47.8933594, 47.893292, 
    47.8931703, 47.893167, 47.8930535, 47.8929352, 47.8928447, 
    47.892825, 47.8926951, 47.8926787, 47.8925521, 47.8924666, 
    47.8923712, 47.8922693, 47.8921821, 47.8920127, 47.8918976, 
    47.8918829, 47.8918089, 47.8917234, 47.891707, 47.8916982462978, 
    47.8915243457092, 47.8914981, 47.8913846, 47.8912745, 47.8912054, 
    47.8912284, 47.8912169, 47.891161, 47.8910788, 47.8909818, 
    47.890893, 47.8908108, 47.8907631, 47.8907894, 47.890850835123, 
    47.8908310981098, 47.890736996735, 47.8907238, 47.8907017, 
    47.8905681, 47.890499, 47.8904038, 47.8903945, 47.8904335, 
    47.890501, 47.8907443, 47.8911702, 47.8913189, 47.8916404, 
    47.8920532, 47.8924576, 47.893015, 47.8935691, 47.8939128, 
    47.893972, 47.8941462, 47.8943205, 47.8944389, 47.8945277, 
    47.8947464, 47.8949683, 47.8951278, 47.8953498, 47.8956622, 
    47.8960929, 47.8963231, 47.8968722, 47.8970728, 47.897257, 
    47.8974526, 47.897543, 47.8976318, 47.8979047, 47.8982122, 
    47.8984571, 47.8986955, 47.8988484, 47.8988977, 47.8989668, 
    47.8990292, 47.8990851, 47.8991345, 47.8991838, 47.8991969, 
    47.8992183, 47.8992138599597, 47.8992822990217, 47.899386099087, 
    47.8994844991365, 47.8994877814766, 47.8995405, 47.8995751, 
    47.8996671, 47.899723, 47.8998102, 47.899894, 47.8999959, 
    47.9000403, 47.9001143, 47.9002458, 47.9003576, 47.9004464, 
    47.9005319, 47.9006239, 47.9007291, 47.9008212, 47.9008968, 
    47.9009955, 47.9011138, 47.9011862, 47.901201, 47.9012651, 
    47.9012864419422, 47.9012919599173, 47.9012918373212, 47.9012798745325, 
    47.9012503, 47.9011681, 47.9011221, 47.9011023, 47.9010826, 
    47.901104, 47.9011812, 47.901464, 47.9017879, 47.9020427, 
    47.9023879, 47.9027282, 47.9031342, 47.9036978, 47.903754, 
    47.9045825, 47.9049622, 47.9053354, 47.9057973, 47.9061096, 
    47.9064498416099, 47.9066634999018, 47.9072336999858, 47.9076802735147, 
    47.9077485, 47.907763690134, 47.9078641000843, 47.908143700132, 
    47.9084671001936, 47.9085932335539, 47.9087191002593, 47.9088887003332, 
    47.909042033714, 47.9090967004107, 47.9092007004458, 47.9092281004619, 
    47.9094032338475, 47.9094667005488, 47.9097962339932, 47.9103013008126, 
    47.9109493010327, 47.9114051011965, 47.9119652347243, 47.9122781014908, 
    47.9127615016758, 47.9129922350998, 47.9133819018948, 47.9139417020484, 
    47.9145247280819, 47.9146238, 47.9146813169508, 47.9147701022374, 
    47.9150664356498, 47.9153078357218, 47.9157690358836, 47.916565036156, 
    47.9168175029158, 47.9171634363849, 47.9173391031083, 47.917654510093, 
    47.9177103, 47.9177111891042, 47.9178987032635, 47.9183158367357, 
    47.9188813448202, 47.9189297, 47.9190661, 47.9192025, 47.9192273419044, 
    47.9193807037792, 47.9194217567643, 47.9194737, 47.9195608, 
    47.9196084, 47.9196133, 47.9196577, 47.9196676, 47.9196643, 
    47.9196429762586, 47.9196498372578, 47.9198585040176, 47.9199018958847, 
    47.9199601, 47.9199963, 47.9199928437492, 47.9202637550776, 
    47.9202789, 47.9203611, 47.9204219, 47.9203836057452, 47.9204896375844, 
    47.9206213103203, 47.9206585, 47.9208146, 47.9208177487713, 
    47.9212140378351, 47.9213354817767, 47.9213684, 47.9214621, 
    47.9214933, 47.9214933000208, 47.9215158379485, 47.9216071591431, 
    47.9216757, 47.9217941, 47.9219124, 47.92208, 47.9222525, 
    47.9223906, 47.9224727, 47.9227438, 47.9228201660016, 47.9230515049738, 
    47.9232873050332, 47.9235123051046, 47.9242145053507, 47.9245657054575, 
    47.9247248388542, 47.9249113055909, 47.9251363056578, 47.9256133057759, 
    47.9262112392513, 47.9262770392744, 47.9263648393346, 47.9264253060343, 
    47.9265349060685, 47.9267380396157, 47.9267811, 47.9270243, 
    47.9272149, 47.9272416155306, 47.9272863062536, 47.9274234396238, 
    47.9283558399107, 47.9288714400844, 47.9291456401666, 47.9296830402907, 
    47.9304507071141, 47.9305713071514, 47.930834640604, 47.9313611074868, 
    47.9317067076599, 47.9324195079997, 47.9325730414002, 47.9330830415743, 
    47.9334997084015, 47.9336970418064, 47.9340534419167, 47.9341905086297, 
    47.9345522421217, 47.9349908422741, 47.9353526567085, 47.9354135, 
    47.9354541770968, 47.9362133093254, 47.9364162427209, 47.9368272428712, 
    47.9369533095699, 47.9370011135623, 47.9370679, 47.9371747, 
    47.9371874377623, 47.937408442997, 47.9375674430397, 47.9376770430806, 
    47.9376973546391, 47.9377316, 47.9377809, 47.9378876, 47.9379895, 
    47.9380536, 47.9380568, 47.9380043, 47.9379583, 47.9379599, 
    47.9379534, 47.9378926, 47.9378039, 47.9377151, 47.9376675, 
    47.9376576, 47.9375772, 47.9374375, 47.9373504, 47.9371237, 
    47.9369841, 47.9368362, 47.9367525, 47.9365685, 47.936442, 
    47.9363138, 47.9362695, 47.9361791, 47.9360411, 47.9359935, 
    47.935816, 47.9356715, 47.9355647, 47.935453, 47.9353708, 
    47.9353445, 47.9352624, 47.9351441, 47.9351014, 47.9349798, 
    47.934947, 47.9347876, 47.9346824, 47.9346299, 47.9346496, 
    47.9346923, 47.9346808, 47.9345362, 47.9343814, 47.9341723, 
    47.934091, 47.9340096, 47.933933, 47.933847, 47.9337239, 
    47.9335961, 47.9333103, 47.9329803, 47.9325551, 47.9323065, 
    47.9322113, 47.9319929, 47.9317884, 47.9316025, 47.9314491, 
    47.9313376, 47.9312935, 47.9313469, 47.931405, 47.9315165, 
    47.9315374, 47.931556, 47.9317187, 47.9318883, 47.9319255, 
    47.9320068, 47.9320974, 47.9320997, 47.9321392, 47.9321764, 
    47.9321671, 47.9322461, 47.9323321, 47.9323855, 47.9323762, 
    47.9322996, 47.9321718, 47.9319673, 47.9317349, 47.9315421, 
    47.9313701, 47.9312331, 47.9310797, 47.9310053, 47.9310588, 
    47.9311517, 47.9312563, 47.931268347812, 47.9312559067488, 
    47.9312394400726, 47.9312120400621, 47.9312997067331, 47.9313655067461, 
    47.9316178401524, 47.9317549068526, 47.9319907068987, 47.9324952403108, 
    47.932731040363, 47.9333233071827, 47.9340746407381, 47.9345189075507, 
    47.9347383076186, 47.9352044410774, 47.9354841078175, 47.9362519080642, 
    47.9362903080846, 47.9362849080956, 47.9362739080997, 47.935835308096, 
    47.9357476414464, 47.9357750414669, 47.9358627081664, 47.9359614415291, 
    47.9363946416204, 47.9366305083449, 47.9368882417721, 47.9370746418438, 
    47.9373269085856, 47.9378642420516, 47.93861544224, 47.9389718423324, 
    47.9396298425572, 47.940528909491, 47.9410497096638, 47.9420146433243, 
    47.9430725103449, 47.9442729107405, 47.9453746444266, 47.9460159113068, 
    47.9469093115424, 47.9473862450094, 47.9475944450774, 47.947819045165, 
    47.9485917120779, 47.9496383124209, 47.9501260459112, 47.950822046101, 
    47.9514851129579, 47.9524165132469, 47.9534027135467, 47.953649246959, 
    47.9540106471304, 47.9541962472976, 47.9542289140259, 47.9540586473753, 
    47.9540264902939, 47.9539776, 47.953949411734, 47.9539211141085, 
    47.9538386474651, 47.9537618474729, 47.9536905141359, 47.953070514102, 
    47.9530636324294, 47.9530618, 47.9527821, 47.9519734940179, 
    47.95179824731, 47.9517049139738, 47.9516500473185, 47.9516770473894, 
    47.9517260474543, 47.95191191422, 47.9524154477685, 47.9528535145864, 
    47.9533409147489, 47.953472314785, 47.9535546481337, 47.953658276176, 
    47.9541, 47.9543249, 47.9543300013883, 47.9543336481728, 
    47.9544213148477, 47.9546297148765, 47.9548709149206, 47.9553039150068, 
    47.9556875150991, 47.9560106485202, 47.956081715227, 47.9562677153181, 
    47.956601515455, 47.9571051156242, 47.9573896490865, 47.9575029157972, 
    47.9578929159305, 47.9581510493465, 47.958502316111, 47.958782116176, 
    47.9595830496688, 47.9598354497238, 47.9602525164957, 47.96061471659, 
    47.9611471167464, 47.9613063167874, 47.9617456502666, 47.9621962504664, 
    47.9623994505477, 47.9627948506913, 47.9631626508193, 47.9637830510287, 
    47.9641125178192, 47.9644420512904, 47.9646068513674, 47.9647277180995, 
    47.9649694515322, 47.9651176516019, 47.9651343182988, 47.9652001183235, 
    47.9652934516838, 47.9659518518381, 47.9661986518857, 47.9664344519216, 
    47.9667469186276, 47.967015518653, 47.9672129186804, 47.967350052036, 
    47.9675475187457, 47.9680961188792, 47.9684636522986, 47.9687105190245, 
    47.9689958524326, 47.9691713191353, 47.9693084524865, 47.969393020109, 
    47.9694695, 47.9695022, 47.9695679, 47.9696196, 47.9697104, 
    47.9697134284905, 47.9697191191099, 47.9699494524706, 47.9702071191808, 
    47.9703826525496, 47.9705362525859, 47.9708929193478, 47.9712989194532, 
    47.9716171195419, 47.9720834529984, 47.9722590530569, 47.9724017197583, 
    47.9725992531381, 47.9732080532603, 47.9734000533042, 47.9737182533946, 
    47.974552320331, 47.9751614538566, 47.9754687206356, 47.9757375207226, 
    47.9761654541727, 47.9763136542206, 47.9765606543152, 47.9768239210602, 
    47.9772956545215, 47.9778551213494, 47.979089321675, 47.9793306550758, 
    47.9798298552304, 47.9802632553558, 47.9805429221138, 47.9806802555276, 
    47.9808997223035, 47.9809985223965, 47.9810590558165, 47.9809493224892, 
    47.9809495225787, 47.9808453225955, 47.9805877225985, 47.9803904559447, 
    47.9803576559587, 47.9803740559749, 47.9804288559964, 47.9805495226927, 
    47.9809772561036, 47.9811691228109, 47.9813665228583, 47.9815092562348, 
    47.9816627229558, 47.9822001230961, 47.9824140564954, 47.9825566565537, 
    47.9826937232907, 47.9828856566763, 47.9830721233861, 47.9831598567473, 
    47.9832202567735, 47.983291456813, 47.9835163236449, 47.9837192570499, 
    47.9838891237619, 47.9842017238404, 47.9843772572338, 47.9844320572604, 
    47.9844429239481, 47.9843552573017, 47.9843717239919, 47.9845910574232, 
    47.9845855241233, 47.9846129241426, 47.9846622575297, 47.9846960488989, 
    47.9847907, 47.9848322309214, 47.9848596576286, 47.9848267243209, 
    47.9847608576664, 47.9847651803125, 47.9850996, 47.9851673, 
    47.9851926, 47.9850996880561, 47.9851008578358, 47.9849855245184, 
    47.9847223245479, 47.9845304578826, 47.9842123245259, 47.9842058454092, 
    47.9842036, 47.9837868, 47.9836405908787, 47.9835488578065, 
    47.9835378578184, 47.9835428376994, 47.9836735, 47.9838825, 
    47.9840697, 47.9843104, 47.9844739, 47.9844518809639, 47.9844589246578, 
    47.9845905247152, 47.9847713248246, 47.9847712581914, 47.984705458194, 
    47.9845354581956, 47.9845025248756, 47.9844915249121, 47.9844091249202, 
    47.9840032582532, 47.9838497249316, 47.98375092498, 47.983778258345, 
    47.9838714583802, 47.9842442584559, 47.9843154584842, 47.9843263251747, 
    47.9842989251955, 47.9841837252069, 47.984205525263, 47.9841834586083, 
    47.9841122586035, 47.9841102058519, 47.9841035, 47.9838238, 
    47.9837476449454, 47.9837009252205, 47.9841394586721, 47.9842161253678, 
    47.9842216587293, 47.9841172587729, 47.9840458587842, 47.9840458587982, 
    47.9841499255111, 47.9841444588532, 47.9840346588531, 47.9840291255307, 
    47.9841114588883, 47.9844183256186, 47.9844841256423, 47.9845279256607, 
    47.984495059014, 47.9845443257065, 47.9847799257738, 47.9848785258098, 
    47.984900459159, 47.9848565258385, 47.9847522591714, 47.9847464818967, 
    47.9847435, 47.9846009, 47.9843851816236, 47.9843191257848, 
    47.9843574591514, 47.9843463258293, 47.9840446591628, 47.9839678591722, 
    47.9839457258537, 47.9839566592081, 47.9841374592901, 47.9843892594244, 
    47.9845040595257, 47.984739526311, 47.9848709263505, 47.9850135263786, 
    47.9853588597726, 47.9853913925474, 47.9857681, 47.9859037, 
    47.9860463, 47.9861059, 47.9860806, 47.9860730914435, 47.9860710600125, 
    47.985816331357, 47.9857678, 47.9856850832354, 47.9856650600138, 
    47.9852426599888, 47.9851668030725, 47.9852244, 47.9852254, 
    47.9854876, 47.9857051961928, 47.9857566603459, 47.9857894603572, 
    47.9858333270316, 47.9858990603723, 47.9859374603821, 47.9860633271009, 
    47.9860302604748, 47.9858709271719, 47.9857885271772, 47.9855251271765, 
    47.9855185427068, 47.9855164, 47.9854122, 47.9846119, 47.9844280076788, 
    47.9843244603295, 47.9841212603532, 47.9840225270163, 47.9838086603323, 
    47.9837262603432, 47.9837369270582, 47.9837038604154, 47.9837585271125, 
    47.9837529271274, 47.9836485271431, 47.9837197271692, 47.9839389272113, 
    47.9840540605762, 47.9841362606093, 47.9842239272921, 47.9844157273181, 
    47.984618660689, 47.9847063273784, 47.9847774607356, 47.9847936607736, 
    47.9847826646387, 47.9847613, 47.9847174, 47.9845598, 47.9845317027409, 
    47.9845190608081, 47.9844696608029, 47.9841846607539, 47.984033637439, 
    47.9840044, 47.9839714, 47.984016, 47.9840704, 47.9842892, 
    47.9843267, 47.9844085, 47.9844286, 47.9846338, 47.9848257, 
    47.9851324, 47.9852844, 47.9857095, 47.9857077, 47.9859588, 
    47.9860982, 47.986105, 47.9860846502737, 47.9860923911876, 
    47.9863004, 47.9866646, 47.9869076, 47.9869522, 47.9870674, 
    47.9871351, 47.9872008, 47.9874454, 47.987638, 47.9878951, 
    47.9879630009288, 47.9879657282856, 47.988146261697, 47.9882444617776, 
    47.9883429284908, 47.9884851285468, 47.9885234619045, 47.9885288619197, 
    47.9885197789644, 47.9885201, 47.9884433, 47.9883645928094, 
    47.9883806619097, 47.9884409285982, 47.9884225286024, 47.9884007286133, 
    47.9884940619802, 47.9885655286763, 47.9886753287132, 47.9891913288567, 
    47.989460328933, 47.9895537289627, 47.9895539289867, 47.9894829290109, 
    47.989494062367, 47.9896369290886, 47.989642462435, 47.9896589291129, 
    47.9897413291477, 47.9899336625439, 47.9900818625957, 47.9901422626091, 
    47.9902683292944, 47.990306729303, 47.9904770627023, 47.9906089294336, 
    47.9906749294622, 47.9907518628202, 47.9910316628874, 47.9910810629054, 
    47.9911195295919, 47.9911470629497, 47.9911362629571, 47.9908458629549, 
    47.9908240629646, 47.9907968630011, 47.9908628630448, 47.9910221297726, 
    47.9911266631561, 47.9913300632769, 47.9914290633286, 47.9915938634077, 
    47.9917312634658, 47.9919508635526, 47.9919619302392, 47.9919456635898, 
    47.9919511302662, 47.9920390636312, 47.992203730348, 47.9922641303743, 
    47.9925715304771, 47.9927362638684, 47.9928351305945, 47.9929175306232, 
    47.993005330651, 47.9934333307521, 47.9938118641668, 47.9938776641871, 
    47.9938777308616, 47.993844864201, 47.9938363197998, 47.9938361, 
    47.9937758, 47.9937045, 47.9935565, 47.9934248, 47.9932903397234, 
    47.9931101307754, 47.993066330776, 47.9930609307959, 47.9930829308213, 
    47.993319264271, 47.9937803311137, 47.9939505311875, 47.9941263312537, 
    47.9942140646265, 47.9942581313333, 47.9943624647056, 47.9944669314515, 
    47.9945767314991, 47.9946591315406, 47.9947744649133, 47.9949116649652, 
    47.9950871316942, 47.995317665099, 47.9954329317962, 47.9956687318528, 
    47.9957071318692, 47.9957182652225, 47.9957456652408, 47.9957074652623, 
    47.9957458652894, 47.995915931998, 47.9961408653731, 47.9961901320511, 
    47.9963657321072, 47.9964973321332, 47.9967276655013, 47.9968154655201, 
    47.9968647322014, 47.9968923322214, 47.9969307322619, 47.997057065664, 
    47.9973150657729, 47.9974358658275, 47.9975236658525, 47.9977594659019, 
    47.9979349326012, 47.9982380525844, 47.9983812, 47.9983858200095, 
    47.9983899326481, 47.9984173326513, 47.9984448659935, 47.9984613326708, 
    47.9984230660284, 47.9982586660201, 47.9982421326912, 47.9982422660352, 
    47.9983246660923, 47.9983849327818, 47.9984069327926, 47.9984014661347, 
    47.9983411328025, 47.9982973328076, 47.9982480661597, 47.998209732834, 
    47.9982206661794, 47.9982920662122, 47.998324932889, 47.9983798662339, 
    47.9985224662592, 47.9985608662673, 47.9986704662953, 47.9987747329836, 
    47.9988678663293, 47.9989391330175, 47.9990378663646, 47.9991420663757, 
    47.9991695330461, 47.9992298663923, 47.9992518664036, 47.9992792664393, 
    47.9993396664677, 47.9994823331871, 47.9997840666074, 47.9998937333009, 
    48.0000591333431, 48.0001743333646, 48.0004046667332, 48.0004539334083, 
    48.0005307334285, 48.0006514667908, 48.0009420668383, 48.0009968668498, 
    48.0010407335281, 48.00122173359, 48.0012876669542, 48.001463133682, 
    48.0015125337106, 48.0015070670571, 48.0014852670636, 48.0013920670624, 
    48.0012274670547, 48.0011727337255, 48.0011397337309, 48.001117867078, 
    48.0011179337653, 48.0012057338048, 48.0013098671749, 48.0016992672695, 
    48.0017925339625, 48.0019900673689, 48.0021490674417, 48.0022149341281, 
    48.0023849341639, 48.0024506675147, 48.0025110675386, 48.002521934218, 
    48.0025110675721, 48.0025219342493, 48.0026152676139, 48.0027194676378, 
    48.0029497343464, 48.0029990676911, 48.0030484677079, 48.0030868677317, 
    48.0030923344108, 48.0029059344079, 48.0028127344122, 48.0028182677564, 
    48.0029553344666, 48.0032405345479, 48.0034324679302, 48.003574934635, 
    48.0036243346591, 48.0036517346807, 48.0037888680766, 48.0039259347885, 
    48.0040082681438, 48.0043701348896, 48.0045291349305, 48.0046826683153, 
    48.0048142683508, 48.0050774684146, 48.0051432684343, 48.0051706684459, 
    48.0052584685055, 48.0054339352277, 48.0054941352505, 48.0055107352707, 
    48.005559935292, 48.0060150687842, 48.0063221355688, 48.0064208689281, 
    48.0065908689672, 48.0066511356489, 48.0067607356892, 48.0069033357352, 
    48.0073529358649, 48.0074899359079, 48.0078189359997, 48.0080328693968, 
    48.0080875360855, 48.0081588694633, 48.0082520694913, 48.0083451362021, 
    48.0085261362489, 48.0085974696044, 48.0086248696188, 48.0087399363343, 
    48.0093648698568, 48.0094581365543, 48.0096718699479, 48.0101378700727, 
    48.0103352701195, 48.0104339368043, 48.0106587368377, 48.0108231368783, 
    48.0109328702313, 48.0110425369148, 48.0111816279249, 48.0112751, 
    48.0113629, 48.0113706000049, 48.0113716702659, 48.0114209369377, 
    48.0115854703016, 48.0117280703381, 48.0118430703825, 48.011853937064, 
    48.0117936703996, 48.011785158207, 48.0117849, 48.0116149, 
    48.011445, 48.0113682, 48.0110995, 48.0110063, 48.0108528, 
    48.0106795008923, 48.0106093368967, 48.0105708702308, 48.0105598702382, 
    48.0106639369488, 48.0108448703479, 48.0109161370373, 48.0110696704097, 
    48.0112725371134, 48.0113218704586, 48.0113656704731, 48.0113875371807, 
    48.0114971372188, 48.0115628705835, 48.01158473729, 48.0116560706527, 
    48.0120561374451, 48.0122972708436, 48.0124014708686, 48.0125550708977, 
    48.0128565376073, 48.0129661376297, 48.0131252710018, 48.0132841377089, 
    48.0134595377399, 48.0136021377692, 48.0136953377909, 48.0137940711519, 
    48.0138762711722, 48.0140242712067, 48.0143422712697, 48.0144189379615, 
    48.0144792713093, 48.0145395379893, 48.0146601380105, 48.0148301380452, 
    48.0149288714073, 48.0149507380881, 48.0149396714328, 48.0148299381076, 
    48.0148024714455, 48.014791471458, 48.0148188714729, 48.0150052715416, 
    48.0152408716089, 48.0153011382962, 48.0153174716485, 48.0152626716593, 
    48.0152461383376, 48.0153009383608, 48.0155146717606, 48.0156188717811, 
    48.0158381384799, 48.016194471886, 48.0163315385733, 48.0163699385826, 
    48.0164740719353, 48.0165288719485, 48.0167097386737, 48.0168413387003, 
    48.0168687387091, 48.0168850720553, 48.0170111387545, 48.0171975387965, 
    48.0176415389098, 48.0178332723116, 48.0181346723907, 48.0185402724927, 
    48.0189074725993, 48.0191978727003, 48.0192744727232, 48.0193676727584, 
    48.0193675394518, 48.0193839394635, 48.0194880728325, 48.0196086728621, 
    48.0200033396035, 48.0202555396496, 48.020332273007, 48.0204198730302, 
    48.0207158731019, 48.0209570731559, 48.0214667399429, 48.0218285400142, 
    48.0220258733877, 48.0221245400764, 48.022217673441, 48.0222725401181, 
    48.0223492734637, 48.0224424734861, 48.0225521401763, 48.0225630735157, 
    48.0225465401839, 48.0223655401695, 48.0223600735087, 48.0224970735544, 
    48.0225956735737, 48.0226230735809, 48.022617473599, 48.0226504736086, 
    48.0227435402976, 48.0227435403043, 48.0228366736662, 48.0228749403487, 
    48.0228803403685, 48.0228967403791, 48.0230226737628, 48.0232199404786, 
    48.0232530308397, 48.023299, 48.0233042970878, 48.023307740484, 
    48.0233790738272, 48.0235209023194, 48.0235842, 48.0235903342712, 
    48.0235929405118, 48.023631340516, 48.0237355405338, 48.0238176738864, 
    48.0238834739049, 48.0240205405962, 48.024042473937, 48.0240532739664, 
    48.0240969406781, 48.0242281407582, 48.0243102741252, 48.0244636741755, 
    48.0245895408942, 48.0247429409394, 48.0250663410249, 48.025236074413, 
    48.0254497411388, 48.0257073412001, 48.0258552745735, 48.026003141288, 
    48.0262771413572, 48.0264688747455, 48.0266168747789, 48.0267100747928, 
    48.0268786577342, 48.0269153, 48.0269262, 48.0268332, 48.0268332, 
    48.0268936, 48.0268997490266, 48.026902341427, 48.0270559414439, 
    48.0272451551336, 48.027294, 48.0272887, 48.0272175, 48.0272176, 
    48.0272615, 48.0272697683069, 48.0272702747288, 48.027341541402, 
    48.0275663414338, 48.0276321414474, 48.0277307414816, 48.0278019415021, 
    48.0279115415178, 48.0279986007625, 48.0281223, 48.0282212, 
    48.0282432, 48.0282159, 48.0280187, 48.0280573, 48.0280409, 
    48.0281946, 48.0283049, 48.0283435, 48.0284533, 48.0286565, 
    48.028673, 48.0286785, 48.0286567, 48.0284868, 48.0281033, 
    48.0280101, 48.0278677, 48.0277089, 48.0275063, 48.0273145, 
    48.0270297, 48.0268435, 48.0267613, 48.026531, 48.0264104, 
    48.0263776, 48.0263995, 48.026586, 48.0266299, 48.0266519, 
    48.0266355, 48.0265588, 48.0263396, 48.0262738, 48.0262575, 
    48.0261697, 48.026104, 48.0261205, 48.0261699, 48.0261780186028, 
    48.0261786735592, 48.0264716321456, 48.0264935, 48.0264716, 
    48.0263401, 48.0263347, 48.026362, 48.0263672391356, 48.0263707401822, 
    48.0265354809855, 48.0265815, 48.0265815, 48.0260226, 48.0257923, 
    48.0253647, 48.0251509, 48.0244878, 48.0240383, 48.0237368, 
    48.0236326, 48.0235973656586, 48.0235920727742, 48.023767472818, 
    48.0241016729217, 48.0243865397082, 48.0243646730497, 48.0243261397182, 
    48.0242329397187, 48.0240738730434, 48.0240690961445, 48.0240651, 
    48.0239829, 48.0238512, 48.0238129, 48.0237882, 48.0236376, 
    48.0235061, 48.0233799, 48.0231607, 48.0230182, 48.0229195, 
    48.0228154, 48.0227277, 48.022673, 48.0225962, 48.0225423829769, 
    48.0224294726377, 48.0224283083961, 48.0224207, 48.0223494, 
    48.0222398, 48.0221575, 48.0220643, 48.0219986, 48.0217684, 
    48.0215601, 48.0214012, 48.021319, 48.0211161, 48.0208914, 
    48.0206996, 48.0203213, 48.019998, 48.0198609, 48.0188686, 
    48.0183862, 48.0180627, 48.0177996, 48.0176242, 48.0175858, 
    48.017542, 48.0174379, 48.0174434, 48.0175202, 48.0175312, 
    48.0175093, 48.0174217, 48.0173175, 48.0171695, 48.0167583, 
    48.0165172, 48.0160511, 48.0159633, 48.0159524, 48.0159963, 
    48.0159853, 48.0158867, 48.0153713, 48.0152781, 48.0150917, 
    48.0149382, 48.0146915, 48.014379, 48.0143077, 48.0143022, 
    48.0143461, 48.0143542880654, 48.0143548704889, 48.0144535371654, 
    48.0146564705263, 48.0149799372427, 48.0151773372712, 48.0153857372973, 
    48.0155935035079, 48.0156951, 48.0156990840287, 48.0157038706574, 
    48.0157860706677, 48.0158847373524, 48.0161095374087, 48.0162630707867, 
    48.0165590708679, 48.0168715376102, 48.0171621376633, 48.0174198710328, 
    48.017737871068, 48.0177763377399, 48.0180942711279, 48.0181490106699, 
    48.0182226, 48.0183323, 48.0183392400633, 48.0183410711364, 
    48.0183794711412, 48.0184726711558, 48.0185768711803, 48.0188071379118, 
    48.0189935379504, 48.019256671347, 48.0194376714044, 48.0196239381426, 
    48.0197390715242, 48.0199472716178, 48.0200514716852, 48.0200896717268, 
    48.0201609384184, 48.0202924717889, 48.0203472718143, 48.0204733385174, 
    48.0207090719057, 48.020900938619, 48.0210105386604, 48.0211968720742, 
    48.0213501388174, 48.0214324721861, 48.0215311388787, 48.0218161389494, 
    48.0220299389935, 48.0224521390899, 48.0229070725538, 48.0231645392907, 
    48.0234387393554, 48.0236470727199, 48.0237950727432, 48.0240910728138, 
    48.0245295396008, 48.024831073006, 48.0251544730932, 48.0252531397747, 
    48.0252951371869, 48.0253706, 48.0253778903094, 48.0253793397788, 
    48.0254122731155, 48.0256973398245, 48.0258330316006, 48.0259354, 
    48.0259903, 48.0260561, 48.0261439, 48.0261519406519, 48.0261526731623, 
    48.0263804440203, 48.0264565, 48.0265333, 48.0265992, 48.0266705, 
    48.0266738510115, 48.0266792731583, 48.0267724731807, 48.0267943398537, 
    48.0267998732051, 48.0268545821532, 48.0268903, 48.0269343820427, 
    48.0270465399137, 48.0270904732559, 48.0271781399437, 48.02731514, 
    48.0274740733945, 48.0279068735225, 48.0279833403229, 48.0280737, 
    48.0281176, 48.0282163, 48.0282188253881, 48.0282250735392, 
    48.0283237402178, 48.0284169402341, 48.0285649402685, 48.0286910736455, 
    48.0287238736696, 48.028718273685, 48.0286469403613, 48.0286578737035, 
    48.0287017403868, 48.0286852737234, 48.0283341403956, 48.0283286737388, 
    48.0283504737568, 48.028575140492, 48.0287065405409, 48.0287503405748, 
    48.0288105406032, 48.0290134739892, 48.0292052740353, 48.029402540741, 
    48.0295834741134, 48.0296327407991, 48.0296436741502, 48.0295941408485, 
    48.0294787408732, 48.0289796741915, 48.0288587408833, 48.0288202742381, 
    48.0288207209202, 48.0289063, 48.0289456, 48.0289673756961, 
    48.0290157617411, 48.0291344, 48.0292214, 48.0291744, 48.0291639372006, 
    48.0291701411663, 48.0293765954097, 48.029429, 48.0296356, 
    48.0297388, 48.0295374, 48.0292403, 48.0291788, 48.0292142, 
    48.029159, 48.0291013260066, 48.0291033413567, 48.0291088746941, 
    48.0290813413743, 48.0290922747208, 48.0292619414422, 48.029448341491, 
    48.0294808811189, 48.0297834, 48.0298454545668, 48.0298592749359, 
    48.029924573944, 48.0300682, 48.0301934, 48.0302208, 48.0304018, 
    48.0305239, 48.0305927, 48.0303948, 48.0304521, 48.0303227, 
    48.0304884, 48.0304972, 48.0303911, 48.0304356, 48.0305542, 
    48.0303858, 48.0301842, 48.0299641, 48.0298823, 48.0297761, 
    48.0296482, 48.0295786, 48.0295219, 48.029452849549, 48.0294510752887, 
    48.0294672753244, 48.0295109420289, 48.02952543282, 48.0296325, 
    48.0298665, 48.0298887, 48.030048, 48.030183, 48.0303294344879, 
    48.0303544756129, 48.0304366756349, 48.0304465998073, 48.0306353, 
    48.0310946, 48.0313636, 48.0313282551828, 48.0313347425978, 
    48.0314224759455, 48.0314519113858, 48.0316842, 48.0318707, 
    48.0320169, 48.0320503, 48.0322875, 48.0327609, 48.0329847, 
    48.0331295890739, 48.0331479430944, 48.0333342764669, 48.0334110764781, 
    48.0335983903185, 48.0337631, 48.0339006, 48.0338845276898, 
    48.0339318765737, 48.0340061889886, 48.0341435, 48.0341751, 
    48.034046, 48.0340654, 48.0341423, 48.0342843, 48.0341762, 
    48.0344297, 48.0345212, 48.0344974791738, 48.0345042768598, 
    48.034509372033, 48.0346724, 48.0347073, 48.0349524, 48.0350395, 
    48.0351455, 48.0352654, 48.035618, 48.0358907, 48.0358629, 
    48.0360655, 48.0361674, 48.0362756, 48.0363723, 48.0364313, 
    48.0364, 48.0366691, 48.0367748, 48.0369085, 48.0371945, 
    48.0372113473158, 48.0372211442399, 48.0374132776233, 48.0375066776496, 
    48.0375505443323, 48.0375506776796, 48.037896477771, 48.0381706778273, 
    48.0383462778706, 48.0386536779549, 48.0388513446785, 48.0388842780276, 
    48.0388623446951, 48.0388552914863, 48.0388536, 48.0388043, 
    48.0386570295381, 48.0386266779997, 48.0386431446865, 48.0387310780515, 
    48.0388517447483, 48.0390449124123, 48.0391829, 48.0391883627445, 
    48.0391916781148, 48.0392629447901, 48.0392903447989, 48.0392739448023, 
    48.0392410781361, 48.0392465448074, 48.0393069448241, 48.0393235448348, 
    48.0392906781663, 48.0392824205446, 48.0392819, 48.0392028321964, 
    48.0391809448267, 48.0392029448409, 48.0393677449022, 48.0395378782786, 
    48.0397572783235, 48.0397903450132, 48.0398506783632, 48.0399110783754, 
    48.0399641865305, 48.0400229, 48.0400297235058, 48.0400316783804, 
    48.0400864783869, 48.0401796784065, 48.0402729450967, 48.0403004784416, 
    48.04030054512, 48.040371878476, 48.0403775451624, 48.0403281451651, 
    48.040328278509, 48.040319499856, 48.0403195, 48.0401638355294, 
    48.0401146785079, 48.0401751452219, 48.040252078596, 48.0403234786165, 
    48.0404221453063, 48.040548478665, 48.0408115453748, 48.0409541453962, 
    48.0410638787413, 48.0412338787693, 48.0413874788034, 48.0414588788306, 
    48.0415796788601, 48.0415522788742, 48.0416071455551, 48.0417059455727, 
    48.0417578719355, 48.0418012, 48.0418082969412, 48.0418099455703, 
    48.0418593455777, 48.0419196789239, 48.0421609456217, 48.0422267456364, 
    48.0422707456581, 48.0422270790161, 48.04225467906, 48.0422273457347, 
    48.0422187733047, 48.0422186, 48.0421692, 48.0420569253335, 
    48.0420244790432, 48.04204107906, 48.0419697457313, 48.0419643457428, 
    48.0419863457553, 48.0420631457677, 48.0421125457806, 48.04212354579, 
    48.0421729458085, 48.0422936791658, 48.0426500792157, 48.0426721459021, 
    48.0426940792435, 48.0427489459206, 48.0428201459298, 48.042875079273, 
    48.0429079459521, 48.0428476792832, 48.0428257459535, 48.0428313459627, 
    48.0430562793466, 48.0431582343046, 48.0432229, 48.04322657994, 
    48.0432316793676, 48.0432974793756, 48.0433523460554, 48.0433963460732, 
    48.0434292794306, 48.0435884794705, 48.043654346158, 48.0436488795045, 
    48.0436215461835, 48.0436489461984, 48.043857546248, 48.044027479611, 
    48.0442413463084, 48.0443804440005, 48.0445561, 48.0445614973863, 
    48.0445648796703, 48.0446716746271, 48.0446985, 48.0447072201175, 
    48.0447072796756, 48.0447402796784, 48.0447895463586, 48.044844546383, 
    48.0449049464024, 48.0449487464219, 48.04497087978, 48.0450038797968, 
    48.0450697464872, 48.0452398798663, 48.0454317465713, 48.0456897466538, 
    48.0458214800232, 48.0458544800551, 48.0459202800692, 48.046112280102, 
    48.0462000801253, 48.0462001467986, 48.0461452801277, 48.0461438421391, 
    48.0461365, 48.0460323, 48.0459753467753, 48.0459753467798, 
    48.046013746799, 48.0463375469018, 48.0464857469447, 48.0466667469904, 
    48.0473414804689, 48.0474895471695, 48.0476048805466, 48.047753080595, 
    48.0478791472897, 48.0481259473256, 48.0482740806894, 48.0484770807248, 
    48.0486305474266, 48.0487403474608, 48.0488117475092, 48.0488611475338, 
    48.0490422809134, 48.0491354809414, 48.0491684809576, 48.0491685476433, 
    48.0492123476544, 48.0492837476659, 48.0493496810223, 48.049399081047, 
    48.0497939478152, 48.0502822812713, 48.0504303479796, 48.050540081341, 
    48.0508197480542, 48.0509349480779, 48.0510940814534, 48.0515275482553, 
    48.0522569484238, 48.0525806818382, 48.0528658818904, 48.0529262819099, 
    48.052937281922, 48.0531620819515, 48.0532607486369, 48.0533868820044, 
    48.0534143486905, 48.0535131487253, 48.0538806821586, 48.0540013488604, 
    48.0542756822612, 48.0544456822948, 48.054544348994, 48.0547144823693, 
    48.0548022823887, 48.0549009490696, 48.0550763490878, 48.0551970824395, 
    48.05532868247, 48.0555535491767, 48.0556248825299, 48.0557400825788, 
    48.056167949375, 48.0566341494908, 48.0567712828559, 48.0568842002749, 
    48.0569325, 48.0569929, 48.0570421, 48.0570425221006, 48.0570508828784, 
    48.0570947495523, 48.057127749563, 48.0572319496126, 48.0573362829765, 
    48.057621483055, 48.0577037497431, 48.0578188830924, 48.057882266552, 
    48.0579691, 48.0579750005152, 48.0579778831015, 48.058043683109, 
    48.0581094831231, 48.0581643498074, 48.0580876831647, 48.0581095498372, 
    48.0581644831787, 48.0582357498591, 48.0582028832018, 48.058202883208, 
    48.0582822776322, 48.0583531, 48.0583559944756, 48.058361883225, 
    48.0584276832352, 48.0586086832792, 48.0588390833384, 48.0594258834642, 
    48.0595520835101, 48.0597055502198, 48.0598262835788, 48.0600181502826, 
    48.0600840836317, 48.0601169503141, 48.0601717503278, 48.0603856837008, 
    48.0606325504541, 48.0606873504711, 48.06075931832, 48.0607938, 
    48.0606511, 48.060673, 48.0606126, 48.0606126, 48.0606729, 
    48.06064, 48.0605522, 48.0605413, 48.0606235, 48.0607441, 
    48.0607462248072, 48.0607528836608, 48.0609064836843, 48.0612134837139, 
    48.0613231503969, 48.0616192837891, 48.0617105218927, 48.0617586, 
    48.0618244, 48.0618296646678, 48.0618331504719, 48.0618934838148, 
    48.0620194838394, 48.0622280839213, 48.062348683977, 48.0624255506571, 
    48.0626557506917, 48.0627654840453, 48.0628861507365, 48.0631274841272, 
    48.0632262841676, 48.0630398841892, 48.0630398842004, 48.0631002842176, 
    48.0632263509118, 48.0633085509254, 48.0634620842767, 48.0634950842812, 
    48.0635279509592, 48.0635279509742, 48.0634786843124, 48.0634676843232, 
    48.0635334843445, 48.0636182432157, 48.0637496, 48.0637605, 
    48.0637692290632, 48.063769284341, 48.063813151012, 48.0639545831841, 
    48.0639743, 48.0639689, 48.064084, 48.0641881, 48.0641912149042, 
    48.0641968843622, 48.0642572843728, 48.0643888843927, 48.0645478844208, 
    48.0646301511134, 48.0647672845092, 48.0648494845367, 48.064909884549, 
    48.0651401512458, 48.0652314274998, 48.0653672, 48.0653837, 
    48.0654165, 48.0654200102296, 48.0654252845986, 48.0655782577084, 
    48.0656139, 48.0656249, 48.0655755, 48.0655864, 48.0655949942667, 
    48.0655951512564, 48.0656938845989, 48.0657706846096, 48.0658638846269, 
    48.0659571513165, 48.066018374437, 48.0660744, 48.0661074, 
    48.0660909, 48.0661238, 48.0662389, 48.0662403669763, 48.0662476846349, 
    48.0663737513218, 48.0664615513412, 48.0665932847167, 48.066669951399, 
    48.0669441514465, 48.0673773515159, 48.0676076848767, 48.0683149516384, 
    48.0686549517178, 48.068879885089, 48.0691266851282, 48.0692846301285, 
    48.0694413, 48.069551, 48.0695555826883, 48.0695597518185, 
    48.0696584851633, 48.0700312852149, 48.0702181856236, 48.070516, 
    48.0706092, 48.0706172715129, 48.0706179519119, 48.0707411791805, 
    48.0707737, 48.0707462, 48.0707353, 48.0707450370002, 48.0707440852276, 
    48.0709195519269, 48.0710236852786, 48.0711388852961, 48.071215685313, 
    48.0712540853389, 48.0713143520256, 48.0714624853934, 48.0716379521077, 
    48.0717421521255, 48.0718463521416, 48.0720041526366, 48.0723804, 
    48.0723816700473, 48.0723891521905, 48.0725150626006, 48.0726765, 
    48.0726821819287, 48.0726852855447, 48.0729648855756, 48.0730745522619, 
    48.0731732856223, 48.073178885642, 48.0731459523259, 48.0730253523683, 
    48.073036352381, 48.0730966857316, 48.0731844857488, 48.0733434857708, 
    48.073447685788, 48.0735021862236, 48.0735595, 48.0736308, 
    48.0736394801202, 48.0736395524517, 48.0737162857917, 48.0738259524741, 
    48.0739630858287, 48.0743852858698, 48.0745716858934, 48.0746375525702, 
    48.0746758859122, 48.074747152591, 48.0748268068995, 48.0748974, 
    48.0749194, 48.0749577, 48.0751057, 48.0751715, 48.0751715, 
    48.0751275, 48.0751385, 48.0751878, 48.0751956194953, 48.0751965525221, 
    48.075300752532, 48.0755247086056, 48.0756375, 48.0756449654612, 
    48.0756462858925, 48.0757064858986, 48.0758055578065, 48.075928, 
    48.0759367231787, 48.0759367525798, 48.0761089116817, 48.0762734, 
    48.0762818119786, 48.0762821525942, 48.0767178797472, 48.0771232, 
    48.0771725, 48.0771742071006, 48.077181285971, 48.0773787526672, 
    48.0775103526826, 48.0775541526898, 48.0776090860363, 48.0776857527141, 
    48.0777766777073, 48.0778141, 48.077836, 48.0778853, 48.0778904692063, 
    48.0778940860389, 48.0780749527272, 48.0781408860713, 48.078184752758, 
    48.0781573527682, 48.0782231527779, 48.078317338714, 48.0784447, 
    48.078483, 48.0784775, 48.0784501, 48.078461, 48.0784687471795, 
    48.0784697527573, 48.0785167641332, 48.0786035, 48.078609, 
    48.0785156, 48.0784552, 48.0783346, 48.0780219, 48.077605, 
    48.0771498, 48.0770291, 48.0769084, 48.0769028, 48.0769138, 
    48.0768644, 48.0768588, 48.0768862, 48.0768908766673, 48.0768949521337, 
    48.0771963438459, 48.0773413, 48.0774126, 48.0774784, 48.0774837, 
    48.0774563, 48.0774563, 48.0775165, 48.0775244728049, 48.0775252854705, 
    48.0777196310737, 48.0777578, 48.0777578, 48.077659, 48.077445, 
    48.0771378, 48.0768854, 48.0764026, 48.0763696, 48.0763696, 
    48.0764133, 48.076616, 48.0766324, 48.0765116, 48.0761383, 
    48.0757487, 48.0757322, 48.075743, 48.0757814, 48.0758526, 
    48.0761267, 48.0761298903223, 48.0761354845812, 48.0763766846078, 
    48.0764863512891, 48.0766015513089, 48.0767715513419, 48.0769635513863, 
    48.0772652847944, 48.0774463515078, 48.0775780848996, 48.0776548849308, 
    48.0776659516185, 48.0776166849579, 48.0776167516441, 48.0777978850421, 
    48.077869285076, 48.0780557518025, 48.0782314852109, 48.0783358852812, 
    48.0784675520046, 48.0786377520617, 48.0788352854731, 48.0793785523338, 
    48.0796308857355, 48.0796912857645, 48.0797407524637, 48.0797243524972, 
    48.0798396859067, 48.0798946859679, 48.0799386860042, 48.0800154860354, 
    48.0801800860866, 48.0803664861404, 48.0806078861966, 48.0809643529393, 
    48.0811781529818, 48.0813482863537, 48.0815128864005, 48.0815566864205, 
    48.0815952864928, 48.0817268865283, 48.0818474865489, 48.0821052865879, 
    48.0822478866177, 48.0823795533216, 48.0827086867941, 48.0828074868207, 
    48.0829170868431, 48.0829743743108, 48.0830455, 48.0830508, 
    48.0830728, 48.0831166, 48.0831216876003, 48.0831253534833, 
    48.0831801534914, 48.0833008868627, 48.083503753606, 48.0836190869592, 
    48.083697273107, 48.0838021, 48.0838186, 48.0838186, 48.083802, 
    48.0838074, 48.0837909, 48.0838018, 48.0839389, 48.0839418078112, 
    48.0839476868181, 48.0840517535015, 48.0841724868794, 48.0842931536002, 
    48.0844303536426, 48.0845456870215, 48.0845894870565, 48.0846169537387, 
    48.0847211537604, 48.0848746871194, 48.0850743093986, 48.0852552, 
    48.0854746, 48.0854855, 48.085436, 48.0853099, 48.0853208, 
    48.0853286457127, 48.0853295537368, 48.0854228870875, 48.0857903538558, 
    48.0859054872084, 48.0860205538927, 48.086152287261, 48.0864100873033, 
    48.0864538873216, 48.0864977540022, 48.0865513413292, 48.0865986, 
    48.086467, 48.0863682, 48.0862914, 48.0863243, 48.0863572, 
    48.0862803, 48.0863296, 48.0863187, 48.0860663, 48.0856988, 
    48.0855616, 48.0852104, 48.0852104, 48.0852597, 48.0852650815486, 
    48.0852684867547, 48.0853452867636, 48.0854001534406, 48.0854352000039, 
    48.0854352, 48.0853803, 48.0852871, 48.0852597, 48.0852596, 
    48.0852683593459, 48.0852683533699, 48.0853546986844, 48.0854022, 
    48.0854077, 48.0854296, 48.0854382924061, 48.0854383533756, 
    48.0855918867223, 48.0856795534039, 48.0857508867538, 48.0859484868213, 
    48.0860141535077, 48.0862774869003, 48.0863816869337, 48.0866065536471, 
    48.0867766870419, 48.0868158120681, 48.0868502, 48.0868446, 
    48.0868062, 48.0868282, 48.086883, 48.0868868503256, 48.0868917536871, 
    48.0870562870426, 48.087198887069, 48.0872810870871, 48.0873578870983, 
    48.0874949537778, 48.0876923538089, 48.0881421539432, 48.0881861539884, 
    48.0882355540248, 48.0883616873979, 48.0885592874788, 48.0886469541592, 
    48.0887457541718, 48.0888334875212, 48.0888827542125, 48.0889409201885, 
    48.0890002, 48.0890693, 48.0891043, 48.0891125704015, 48.0891130875498, 
    48.0892226875605, 48.0893159542412, 48.0895626876186, 48.0896978625575, 
    48.0899597, 48.0899631270494, 48.089968487658, 48.0900451543342, 
    48.0901439543501, 48.090221031357, 48.0904312, 48.0905737, 
    48.0906339, 48.0906394, 48.0905789, 48.0904692, 48.090332, 
    48.089986, 48.0898978, 48.0897902, 48.0895148, 48.0893762, 
    48.0892689, 48.0892406, 48.0892443492404, 48.0892218872354, 
    48.0892272872133, 48.0894026871884, 48.0893915538413, 48.0893257538121, 
    48.0890777673468, 48.0889879, 48.0889595199959, 48.0887880869728, 
    48.0887101388236, 48.0885088, 48.0885707, 48.0884554, 48.0882139, 
    48.0880109, 48.0876435, 48.0875228, 48.0874241, 48.0869137, 
    48.0866009, 48.0862222, 48.0859313, 48.0855252, 48.0852672, 
    48.0850642, 48.0849929, 48.0846091, 48.0844719, 48.0842306, 
    48.084022, 48.0838243, 48.0837036, 48.0835006, 48.0833143, 
    48.0831387, 48.0828646, 48.0826451, 48.0823816, 48.0818713, 
    48.0813227, 48.0810375, 48.080873, 48.0807796, 48.0806752, 
    48.0805819, 48.0804448, 48.0800334, 48.0799017, 48.0795945, 
    48.0795176, 48.0794241, 48.0792099, 48.0790177, 48.0786005, 
    48.078304, 48.0780954, 48.077892, 48.0776229, 48.0772991, 
    48.0768546, 48.0766624, 48.076388, 48.0761739, 48.0761519, 
    48.0761738, 48.076245, 48.0763382, 48.0762668, 48.0757897, 
    48.0751865, 48.0748026, 48.0743199, 48.0740071, 48.0736392, 
    48.0731288, 48.0727117, 48.0724922, 48.0723221, 48.0718889, 
    48.0717079, 48.0715707, 48.0709506, 48.0707586, 48.0705886, 
    48.0704133130603, 48.0698792819496, 48.0698791390454, 48.0698705, 
    48.0695854, 48.0689712, 48.068335, 48.0679236, 48.0670622, 
    48.0668647, 48.0666728, 48.0664927971348, 48.0661333480006, 
    48.0661320029868, 48.0661246, 48.0659218, 48.0656257, 48.0652965, 
    48.0650991, 48.0648686, 48.0646054, 48.0641885, 48.0638759, 
    48.0635318, 48.0633949, 48.063066, 48.0626002, 48.0623865, 
    48.0622496, 48.062091, 48.0620199, 48.0619324, 48.0618448, 
    48.0617078, 48.0614338, 48.0612639, 48.0611653, 48.0610449, 
    48.0610341, 48.0610451, 48.0610781, 48.0612318, 48.0614952, 
    48.0615117, 48.0615118, 48.0614736, 48.061249, 48.0611066, 
    48.06103, 48.060959, 48.0609152, 48.0608386, 48.0605755, 
    48.0605756, 48.0607076, 48.0608779, 48.0610372, 48.0611853, 
    48.0613005, 48.0613023862956, 48.0613092797384, 48.061407946417, 
    48.0615834797764, 48.0616818695641, 48.0617503, 48.0617667, 
    48.0617559, 48.0617121, 48.0615697, 48.0613012, 48.0611094, 
    48.0609671, 48.0608083, 48.060655, 48.0602939, 48.0602339, 
    48.0602395, 48.0602779, 48.0604425, 48.0604461454189, 48.0604512791321, 
    48.0605773458146, 48.0606596791621, 48.0607966791889, 48.0609556792271, 
    48.0611144792776, 48.0612515459732, 48.0613172793173, 48.0613778440328, 
    48.0614676, 48.0614841, 48.0614239, 48.0612377, 48.0612323, 
    48.0612708, 48.0612984, 48.0613205, 48.0613752, 48.0615069, 
    48.0615127512811, 48.061515679165, 48.0616418791785, 48.0617734791961, 
    48.0618446792099, 48.0620200792498, 48.0621021459457, 48.0621898793029, 
    48.0625791460358, 48.0628477460891, 48.0630120794631, 48.063099879488, 
    48.0632477461897, 48.0635108795762, 48.0635985462622, 48.0638122796592, 
    48.0639218796845, 48.0640863463784, 48.0641464595427, 48.0642201, 
    48.064286, 48.0642916, 48.0642862, 48.0643302, 48.064352, 
    48.0643631, 48.0643358, 48.0641823, 48.0641495, 48.064144, 
    48.0642099, 48.0642144646961, 48.0642186796004, 48.0642953462777, 
    48.0644324796372, 48.064640679685, 48.0647284797027, 48.0649408068646, 
    48.0649829, 48.064972, 48.0648624, 48.0647912, 48.0647584, 
    48.0647859, 48.0647933407923, 48.0647946796343, 48.0648932796468, 
    48.0649371463207, 48.0650029463354, 48.0650742796796, 48.0651125463538, 
    48.0651509463653, 48.0651399463783, 48.0651453463864, 48.0652056797342, 
    48.0653975464357, 48.0654413464463, 48.0655070798027, 48.0655564798123, 
    48.0657373465102, 48.0659237465538, 48.0659949465654, 48.0661430799192, 
    48.0661648799255, 48.0661976799513, 48.0662579466375, 48.0663839466711, 
    48.0664168800185, 48.0667290801192, 48.0669646801781, 48.067063346864, 
    48.0671675468789, 48.067269575547, 48.0673124, 48.0673508, 
    48.067477, 48.0674803774568, 48.0674857468906, 48.0676283469098, 
    48.067732480262, 48.0679736803166, 48.0680667470062, 48.068116147023, 
    48.0682310804008, 48.068318747093, 48.0684885471321, 48.0686366804943, 
    48.0687243471765, 48.0689820805472, 48.0690917472335, 48.0691903472572, 
    48.0693601473025, 48.0695737473907, 48.0697270807692, 48.070072147544, 
    48.0704447476469, 48.0706528810476, 48.0708555477703, 48.0710308811396, 
    48.0713269478556, 48.0719355479493, 48.0722260813368, 48.0724179480462, 
    48.0726041480932, 48.0728013481573, 48.0730259482269, 48.0731299482537, 
    48.0732780816164, 48.073469948313, 48.073617948339, 48.0737878817087, 
    48.0739631484214, 48.0741821484931, 48.0744340819143, 48.0745379486239, 
    48.0746418820174, 48.0747674821063, 48.0748768821644, 48.0750137488802, 
    48.0752327489396, 48.07545208232, 48.0757041490316, 48.0758904824097, 
    48.076005482444, 48.0761423491576, 48.0761969491869, 48.0762351492224, 
    48.0762899492411, 48.0763063492513, 48.0762677492716, 48.0763005492856, 
    48.0764485493223, 48.0768693494366, 48.0769957494871, 48.0774186829705, 
    48.0777207497381, 48.0778964831175, 48.0780445498214, 48.078132283169, 
    48.0783187498598, 48.0783735498708, 48.0784504832248, 48.078653749967, 
    48.0787799500063, 48.0792136834704, 48.0796528835982, 48.0804979504811, 
    48.0811070839623, 48.0812058839928, 48.0812389506807, 48.0812279506965, 
    48.0812390840453, 48.0814258841164, 48.0814203507968, 48.0813877508203, 
    48.0814591508436, 48.0815524842021, 48.0817772842376, 48.0820734842947, 
    48.0822764843379, 48.0824849510607, 48.0827100844699, 48.0828364845248, 
    48.0828803512053, 48.0830724845864, 48.0832039512741, 48.0833795513062, 
    48.0835770846863, 48.0841532848436, 48.0846690849646, 48.0848885516885, 
    48.0853713518105, 48.0857444852362, 48.0864195521045, 48.0867158855285, 
    48.0868312855819, 48.0868532856017, 48.0867656856147, 48.0868377902097, 
    48.0870797631125, 48.0871990857014, 48.0874239524176, 48.0875884857949, 
    48.0877860858602, 48.0881537526431, 48.0886585527726, 48.0889822861875, 
    48.0893388862799, 48.0897121530758, 48.0898821531316, 48.0899864864872, 
    48.0901619531865, 48.0905129532367, 48.0907432866086, 48.0907606039185, 
    48.0909737, 48.091134, 48.0912155, 48.0912926, 48.0913239, 
    48.0913356014905, 48.0913904867416, 48.0914618867755, 48.0914789534491, 
    48.0915441534759, 48.0916951946542, 48.0918256, 48.0919169, 
    48.0920835, 48.0922802, 48.0924022382129, 48.0925971536415, 
    48.0926299536466, 48.092745153672, 48.0928583769647, 48.092892, 
    48.0929627, 48.093038, 48.0930841, 48.0931119, 48.0931643, 
    48.0931934, 48.0933112, 48.0933779, 48.0933972, 48.0934899, 
    48.0935006, 48.0935387, 48.0935607, 48.0935638722605, 48.0935715156734, 
    48.0936045, 48.0936234, 48.0936153, 48.0936381, 48.0936372, 
    48.0936383508933, 48.093659321375, 48.0936601, 48.0936600239075, 
    48.0936672873317, 48.0936655044912, 48.0936668, 48.0936663, 
    48.0936722, 48.0936622213003, 48.0936620188339, 48.093682, 
    48.0936896, 48.093687, 48.0936973, 48.0937322, 48.0937591, 
    48.0937617, 48.0937953, 48.0938294, 48.0938818, 48.0939767, 
    48.094, 48.0940488, 48.0941308, 48.0941845, 48.0941787, 48.0942092, 
    48.094232, 48.0942871, 48.0943332, 48.0943789, 48.0944376, 
    48.0944976, 48.0946122, 48.0946741, 48.0946857, 48.0947815, 
    48.0948187, 48.0948769, 48.0948859, 48.094911, 48.0949222, 
    48.0949047, 48.0949146, 48.0949172, 48.0949298, 48.0949571, 
    48.0949481, 48.0949719, 48.0950171, 48.0950177364113, 48.0950597933896, 
    48.0950735, 48.0950848629195, 48.0951822880371, 48.0951867626019, 
    48.0952119, 48.095224, 48.0952307, 48.0952164, 48.0952057, 
    48.0951882, 48.0951824, 48.0951698, 48.095166089081, 48.0951599294801, 
    48.0951649, 48.0951895, 48.0952115, 48.0952151957101, 48.0952702881119, 
    48.0954072881274, 48.0954839548086, 48.0956321548475, 48.0956373519178, 
    48.0957005, 48.0957417, 48.0957256, 48.0957453, 48.0957561214315, 
    48.0958077549165, 48.0958899549284, 48.0959502882723, 48.0959559249444, 
    48.0960212, 48.0960812, 48.0961162, 48.0961305440922, 48.0962958883692, 
    48.0963037426169, 48.096315, 48.0963553, 48.0963554290339, 
    48.0964274878592, 48.0964386, 48.0964445732292, 48.0964604884132, 
    48.0964722733349, 48.0965004, 48.0964974028079, 48.0965285826891, 
    48.0965291, 48.096598, 48.0966312, 48.0966177, 48.096633003684, 
    48.0967292884917, 48.0969266885368, 48.0970878858135, 48.0971005, 
    48.0971387620346, 48.0973105552867, 48.0975024886528, 48.0977547553571, 
    48.097842488707, 48.0979713027714, 48.0980428, 48.0982282, 
    48.098436, 48.0985325873607, 48.0986543556194, 48.0987147556607, 
    48.0987257556935, 48.0987480858134, 48.0988569, 48.0989187, 
    48.0989071, 48.0990701, 48.0992416524277, 48.0993126892325, 
    48.0993582695721, 48.0994866, 48.0995788, 48.0995720215104, 
    48.0996088893237, 48.1000037560857, 48.1002834894662, 48.1005192895071, 
    48.1006728895384, 48.1008021098275, 48.1008354, 48.1010406741752, 
    48.1011334896501, 48.1014186897236, 48.1014357681211, 48.1015196, 
    48.1015617, 48.1016546301395, 48.1017093564919, 48.1018519565334, 
    48.1019798251059, 48.1020677, 48.1021546, 48.1021788, 48.1021732911527, 
    48.1022304900335, 48.1022625471168, 48.1022746, 48.1023301, 
    48.1023561, 48.1023626207545, 48.1024114901015, 48.1026746901491, 
    48.1027568901666, 48.1028775568617, 48.1031187569247, 48.1031616468129, 
    48.1032271, 48.1032884, 48.1033368, 48.1033392940841, 48.1034807570624, 
    48.103496884366, 48.1035208, 48.1035866, 48.1036068, 48.1037025949325, 
    48.1038395997426, 48.1038628139072, 48.1040730905753, 48.1041553572668, 
    48.1042156906291, 48.1042814906745, 48.104331701733, 48.104385, 
    48.1044038995265, 48.104473490758, 48.1047366908168, 48.1049339575258, 
    48.1052410909295, 48.1054548909881, 48.105816938442, 48.1059419, 
    48.106010705579, 48.1060526911797, 48.1063267579389, 48.1064441624501, 
    48.1064578, 48.1065254, 48.1065746, 48.106630119467, 48.1070176914532, 
    48.1072698915283, 48.1076536916596, 48.107933291749, 48.1079472046429, 
    48.1079676, 48.1079603649434, 48.1079606917684, 48.1079661584504, 
    48.1080100917993, 48.1081800918407, 48.1082508303333, 48.1083285, 
    48.1083947, 48.1084086, 48.1084009381197, 48.1084376919103, 
    48.1087118919689, 48.1089859587014, 48.1091558430357, 48.1091796, 
    48.109241, 48.1092468, 48.1092392742331, 48.1095284477872, 
    48.1097286, 48.1098781, 48.1100129, 48.1100209, 48.1100355927009, 
    48.1102798923963, 48.1106024165252, 48.1106236, 48.1106419, 
    48.1106656, 48.1107637, 48.1108147, 48.1108917, 48.110975, 
    48.1110444, 48.1110477689739, 48.1111185593079, 48.112324692956, 
    48.1124900354031, 48.1125156, 48.1126347, 48.1127314, 48.1127878, 
    48.1128707550157, 48.1129167597944, 48.1129265320112, 48.1129785, 
    48.1130385, 48.1130949, 48.1131522, 48.1131478, 48.1132149, 
    48.1133027, 48.1134039, 48.1135167, 48.1135829, 48.1136179, 
    48.1136179, 48.1136238124519, 48.113659797788, 48.1136868, 
    48.1137069425144, 48.1137663600482, 48.1139861347259, 48.1141184, 
    48.1142957, 48.1143897, 48.1144559, 48.1145992, 48.1147254, 
    48.1148159, 48.1148190555597, 48.1148684935903, 48.1152138936565, 
    48.1154112936832, 48.1155088325678, 48.1155115754587, 48.1157744578022, 
    48.1157974, 48.1158079, 48.1158241, 48.1158688, 48.1159528611326, 
    48.1159804952588, 48.1159894, 48.1159902908284, 48.1159981603556, 
    48.1161900937115, 48.1162212285539, 48.1163156, 48.1164043, 
    48.1164186762704, 48.1164368937551, 48.1166176938109, 48.1166476124085, 
    48.1167311, 48.1168224, 48.116937, 48.117091, 48.1171805, 
    48.1171959882629, 48.1174619607043, 48.1181580942165, 48.1188925610858, 
    48.118980294453, 48.1190734944849, 48.1195832946074, 48.1198681613553, 
    48.1201313614174, 48.1208055615843, 48.1208877616074, 48.1209041616236, 
    48.1209369616354, 48.1209763658281, 48.1209837, 48.1210281959191, 
    48.1211454949853, 48.1212002949923, 48.121293495008, 48.1214305617026, 
    48.1215566950695, 48.1215730950808, 48.121567561765, 48.1216057617865, 
    48.1217209618181, 48.1220332952505, 48.1222196952991, 48.1224114953586, 
    48.1232555622397, 48.123480295618, 48.1236665623412, 48.123820095708, 
    48.1240174957432, 48.1243354957927, 48.1244615624835, 48.1245547625059, 
    48.12464789587, 48.1246915625885, 48.1247792959602, 48.1248833626547, 
    48.1251779627386, 48.1252545627682, 48.1252819627954, 48.1252924961962, 
    48.1253143628859, 48.1254349629283, 48.125593762976, 48.126037696412, 
    48.1260705630882, 48.1261198964423, 48.1261746964566, 48.1263171631458, 
    48.1264761631801, 48.1267009632228, 48.1267776965735, 48.1268215632524, 
    48.1268378966053, 48.126887163286, 48.1272654966873, 48.1276326967655, 
    48.1278958968012, 48.1280329634913, 48.128233200958, 48.1282439, 
    48.1282460999323, 48.1283289635535, 48.1284166969191, 48.1284768969341, 
    48.1287509636532, 48.1287673636588, 48.1287892970063, 48.1288275636833, 
    48.1288879636933, 48.1289262970281, 48.1289702970325, 48.1290195637077, 
    48.1292221637709, 48.1292496971096, 48.1292614600488, 48.1292513, 
    48.1292843709643, 48.1292881637683, 48.1293429637731, 48.1294855637983, 
    48.1295567638132, 48.1295841638242, 48.1295675638415, 48.1295897865569, 
    48.1295901, 48.1296304, 48.1296591, 48.1296550071459, 48.1296551638865, 
    48.1296546181033, 48.1296519, 48.1296492, 48.1296398616062, 
    48.1296349736103, 48.1296474, 48.1296249416513, 48.129622097236, 
    48.1296347438859, 48.1296429, 48.1296671, 48.1296688123295, 
    48.1296988117757, 48.1297092, 48.1297484955584, 48.129753563942, 
    48.1297315639558, 48.1297643639653, 48.129967297334, 48.1300329640198, 
    48.1300274973686, 48.1300602973815, 48.1301534973994, 48.1302246974254, 
    48.1302625095162, 48.1302695, 48.130351, 48.1304636001188, 
    48.1305095641739, 48.130547964187, 48.1305511433555, 48.1306123, 
    48.1306401, 48.1306249, 48.1306411754398, 48.1307340975779, 
    48.1307694045488, 48.1307967, 48.1308088914017, 48.1309149642953, 
    48.1309286237883, 48.1309373, 48.130999, 48.1310256909333, 
    48.1310518976721, 48.1310942300744, 48.1311485, 48.1311789, 
    48.1311842809371, 48.1315012977779, 48.1316547644797, 48.1318354978732, 
    48.131928497914, 48.1319205471837, 48.1319219, 48.1318959, 
    48.1318905, 48.1318458, 48.1317939, 48.1317536, 48.1317151, 
    48.1317088, 48.1317106, 48.1316963239936, 48.1317142979279, 
    48.1318622979685, 48.1320485646744, 48.1321581647012, 48.1324978981239, 
    48.1325526981421, 48.132596364835, 48.1328264982241, 48.1328883371884, 
    48.1329387, 48.132939986658, 48.1330785649564, 48.1331661649925, 
    48.1333359650322, 48.1333445579464, 48.1333907, 48.1334122375591, 
    48.1334674984055, 48.1335714984343, 48.1336976984574, 48.1338729651678, 
    48.1340976985496, 48.1342785652519, 48.1344210986116, 48.1345855652982, 
    48.1346842986474, 48.13479936534, 48.1348218914398, 48.1348666, 
    48.1350715, 48.1351709, 48.1353177, 48.1354895, 48.1355057507165, 
    48.1357415655899, 48.1363167657543, 48.1365907658229, 48.1367878992086, 
    48.1368644992404, 48.1370561659654, 48.1372260993384, 48.1372509149365, 
    48.1374433, 48.1378069728632, 48.1379701364899, 48.1380662, 
    48.1382783, 48.1384197, 48.1384424156417, 48.138601499647, 
    48.1387932996953, 48.1388571101628, 48.1388663, 48.1392162, 
    48.1394024, 48.1394310371195, 48.1395276998376, 48.1396361352962, 
    48.1396547, 48.1396576277513, 48.1397249665466, 48.1397961665688, 
    48.1398065398037, 48.1398346, 48.1398874, 48.1399269147156, 
    48.139997299991, 48.1401181666989, 48.1402829667596, 48.1404477001448, 
    48.1406509002002, 48.1407715669014, 48.1409309002931, 48.1411065670108, 
    48.1412437670437, 48.1413699670778, 48.1415895671339, 48.1417159005087, 
    48.1417237368292, 48.1417372, 48.1417542, 48.1417504835924, 
    48.1417599005293, 48.1418252642426, 48.1418545, 48.1419985, 
    48.1420004266985, 48.1420725672738, 48.1421134654471, 48.1421381, 
    48.142147777271, 48.1422265006652, 48.142267341997, 48.1422992, 
    48.1423121474584, 48.1423363006954, 48.142381940308, 48.1423968, 
    48.1423984751866, 48.1425283007326, 48.142692700758, 48.1428189007867, 
    48.1429561674941, 48.1431155008818, 48.143181500911, 48.1433023009589, 
    48.1433955676536, 48.1435765676948, 48.1436865010679, 48.1437579677718, 
    48.1438569011439, 48.1439775678451, 48.1441971012339, 48.1443069679364, 
    48.1443700228895, 48.1444192, 48.1444256326131, 48.1444387013242, 
    48.1444730890736, 48.1445677, 48.1447064, 48.1447816, 48.1448532, 
    48.1449033, 48.1449327, 48.1449194, 48.144906, 48.1449418, 
    48.1450143, 48.1450832, 48.1451494, 48.1451941, 48.1452693, 
    48.1453131, 48.145357, 48.1453749, 48.1453813, 48.1453829, 
    48.1454304, 48.1454527, 48.1454784, 48.145476, 48.145502, 
    48.1455235, 48.1455832, 48.1456408, 48.145714, 48.1457783, 
    48.1457847, 48.1457883, 48.1457922801428, 48.1460907017624, 
    48.1462169017993, 48.1463213018445, 48.1463379018747, 48.1462777018781, 
    48.1461297018716, 48.1460103729073, 48.1460093, 48.1458733, 
    48.1458244721321, 48.1457187685413, 48.1456585685402, 48.1455379018597, 
    48.1454391685093, 48.1454003868823, 48.1453437, 48.1452881, 
    48.1452582, 48.145272, 48.1452935, 48.1452505, 48.1452167, 
    48.1449534, 48.1447834, 48.1446402, 48.1444173194282, 48.1443650151785, 
    48.1443635224543, 48.1443143682306, 48.1443234108486, 48.1443359, 
    48.1444371, 48.1444322206911, 48.1444351682869, 48.1444298353835, 
    48.1444192, 48.1443152, 48.1442927525719, 48.1442927682846, 
    48.1443257016297, 48.1444353683154, 48.1445505683425, 48.1446082861222, 
    48.1450321, 48.1450272742566, 48.1451159685211, 48.1453025018891, 
    48.1455273019169, 48.1455821019305, 48.1455657686056, 48.1454194967365, 
    48.145400911376, 48.1454104792073, 48.1454202710932, 48.1454924994098, 
    48.1455467, 48.1455938172908, 48.1455989019786, 48.1456017054256, 
    48.1456362, 48.1456636, 48.1456696697607, 48.1457691020384, 
    48.146109168784, 48.1462299688185, 48.1463233021865, 48.1464495022235, 
    48.1466909022808, 48.1467513022992, 48.1467953023209, 48.1468665690142, 
    48.1470531690629, 48.1471629024097, 48.1472725024215, 48.1474151024479, 
    48.1475961691624, 48.1477115025374, 48.1478705692556, 48.1482711693573, 
    48.1486167694368, 48.1487759028011, 48.1488527028251, 48.1488583028365, 
    48.1488967028647, 48.1490229028978, 48.1492205029435, 48.1493411696436, 
    48.1494179696676, 48.1494235696834, 48.1495771697253, 48.1497199030996, 
    48.1499657938456, 48.1500292, 48.1500181, 48.1501222, 48.1501285972993, 
    48.1501309698023, 48.1503119031573, 48.1505971032018, 48.1511179699448, 
    48.1512661033054, 48.1515405033729, 48.1517435034282, 48.1518587701321, 
    48.1518423701443, 48.1517547034734, 48.1517657034833, 48.1519357701957, 
    48.1520015702233, 48.1520347035896, 48.1521443702915, 48.1522103036401, 
    48.1523857703299, 48.1525941037049, 48.152681970396, 48.1526819704004, 
    48.1526107037323, 48.1526327037477, 48.1527315037786, 48.1529509038267, 
    48.1531209705359, 48.1531977705633, 48.1532033705914, 48.1532637706181, 
    48.1534063706451, 48.1534557706637, 48.1534557706771, 48.1534723706889, 
    48.1536423707274, 48.1536753707448, 48.1536479707544, 48.1536425707766, 
    48.1536207041124, 48.1535931707787, 48.1536317041263, 48.153779770824, 
    48.1538511041761, 48.1539499042071, 48.1539773708932, 48.1540159042681, 
    48.1541091042966, 48.1542463043257, 48.1545369043747, 48.1546959710728, 
    48.1547837710939, 48.1548495711198, 48.1548331711381, 48.154909971166, 
    48.1550911045512, 48.1553049712692, 48.1554147713, 48.1554861046616, 
    48.1555573713521, 48.1559083714157, 48.156270304795, 48.1565501048477, 
    48.1566707715545, 48.1567859049182, 48.1569175716148, 48.157060171644, 
    48.1571151049933, 48.1571973716926, 48.1573729050775, 48.1574661050982, 
    48.15757590512, 48.1576332792537, 48.1576493, 48.157657948504, 
    48.1576581051191, 48.1578061051334, 48.1579869718267, 48.1581461051904, 
    48.1582393052066, 48.1582777052181, 48.1582941718988, 48.1583709719177, 
    48.1584259052626, 48.1585629719538, 48.1586343053065, 48.1586727053229, 
    48.158722105337, 48.158809772018, 48.1590291720813, 48.1590677054272, 
    48.1590511720982, 48.1590430427396, 48.1590424, 48.1589132294737, 
    48.1588867054201, 48.1589909054456, 48.1590403054597, 48.1589855054633, 
    48.1589855721411, 48.1591007721626, 48.159176461673, 48.1592181, 
    48.1592268169083, 48.159226905505, 48.1592817055097, 48.159440705539, 
    48.1595503722454, 48.1597095056146, 48.1598631056476, 48.1599069723371, 
    48.159841305701, 48.1598687723848, 48.1600333057549, 48.1601155057852, 
    48.1602307724745, 48.1604445725035, 48.1604939058447, 48.1605269058577, 
    48.160488505868, 48.1606311725672, 48.1606421059132, 48.1605873059174, 
    48.1605873059302, 48.1606203059549, 48.1608781060218, 48.1610809727343, 
    48.1611797060875, 48.1612496091506, 48.1613408, 48.1613467350835, 
    48.1613495727608, 48.1614367936702, 48.161478, 48.1615163, 
    48.1615492, 48.1615498696478, 48.1615579727706, 48.1616237727887, 
    48.1617499728357, 48.161771906181, 48.1617117061827, 48.161782972876, 
    48.1619201062534, 48.1620079062839, 48.1620297729665, 48.1620079063012, 
    48.161936706297, 48.1619311729701, 48.1619805729876, 48.1620957730236, 
    48.1625071064651, 48.1626991065263, 48.1628141732116, 48.162825173221, 
    48.1628471065596, 48.162923906569, 48.1629787732522, 48.1630391066011, 
    48.1630679719265, 48.1630577, 48.1629919, 48.1630083, 48.1630139371539, 
    48.1630171065685, 48.1630719732467, 48.1631157732611, 48.1631871066216, 
    48.1632749066443, 48.1633255321085, 48.1633703, 48.1634415, 
    48.1634361, 48.1632112, 48.1631508, 48.1631727, 48.163255, 
    48.1633701, 48.1633739216152, 48.1633789065219, 48.1635379065427, 
    48.1637353065761, 48.163839506609, 48.1639107733106, 48.1639767066564, 
    48.1640809066708, 48.1641467066916, 48.1641938138383, 48.1642311, 
    48.1642474, 48.1642091, 48.1641487, 48.1640062, 48.1639457, 
    48.1640225, 48.1640444, 48.1640279, 48.1639346, 48.1635726, 
    48.1634519, 48.1633093, 48.1630076, 48.1626071, 48.1624535, 
    48.1623164, 48.1620641, 48.1618118, 48.1612084, 48.1608958, 
    48.160786, 48.1605555, 48.1601496, 48.1599138, 48.1597766, 
    48.1595078, 48.1594091, 48.1591952, 48.1589813, 48.1587454, 
    48.1582681, 48.1579718, 48.1577195, 48.1574506, 48.1574287, 
    48.1574375254725, 48.157437504705, 48.1574813047088, 48.1575799047235, 
    48.1576623047389, 48.1576794321221, 48.1575546, 48.1574395, 
    48.1572202, 48.1570502, 48.1568801, 48.1567594, 48.1566111, 
    48.1563477, 48.1559636, 48.1556016, 48.1554364, 48.1553328, 
    48.1551628, 48.1549926, 48.1547786, 48.1545974, 48.1543888, 
    48.1543668, 48.1544435, 48.1545366, 48.1545385786955, 48.1545453704646, 
    48.1546338471335, 48.1547066, 48.1547175, 48.1546517, 48.1544321, 
    48.1543882, 48.1543333, 48.1542126, 48.1541521, 48.154108, 
    48.154031, 48.1537127, 48.1534657, 48.1532408, 48.1530927, 
    48.152813, 48.152429, 48.1524209481042, 48.1522841697574, 
    48.1521527030748, 48.152108903075, 48.1520979030852, 48.1521473031087, 
    48.1521967697939, 48.1521749031321, 48.1520707031294, 48.1518969438618, 
    48.1518756, 48.1516836, 48.1515136, 48.1510363, 48.1507234, 
    48.1502282, 48.1499688, 48.1496873, 48.1490216, 48.1481903, 
    48.147974, 48.1476924, 48.1476278, 48.1476298, 48.1475346, 
    48.1474115, 48.1473032, 48.1471717, 48.1470384, 48.1469301, 
    48.1468111, 48.146735, 48.1466885, 48.146633, 48.1466008, 
    48.1466008, 48.1466321, 48.1466858, 48.1467494, 48.1468218, 
    48.1468684, 48.1469534, 48.1470017, 48.1470437, 48.1470455, 
    48.1470344, 48.1470198059496, 48.1470015278956, 48.1469685, 
    48.1469086, 48.1468397, 48.146863, 48.1469274, 48.1469634951192, 
    48.1469989682741, 48.1469882173427, 48.1469629, 48.1469204236519, 
    48.1468181015853, 48.1468134840662, 48.1468093, 48.1467073, 
    48.1466612, 48.146565, 48.1464702, 48.1463735, 48.1463449, 
    48.1463318, 48.1463371209873, 48.1463295681052, 48.1462972580214, 
    48.1462778, 48.1461972, 48.1460594, 48.1458697, 48.1457427, 
    48.1456049, 48.1455324, 48.145498625033, 48.1454793679581, 
    48.1453201012287, 48.145231414186, 48.1451959, 48.145085, 
    48.1449642, 48.1448434, 48.1446644, 48.144531, 48.1443279, 
    48.1441982, 48.1440093, 48.1439825, 48.1439378, 48.1438841, 
    48.1437328, 48.1436478, 48.1434527, 48.1433516, 48.143255, 
    48.1432433, 48.1431717, 48.1431028, 48.1429955, 48.1427583, 
    48.1425109, 48.1424379, 48.1423377, 48.1422241, 48.1421032, 
    48.1419851, 48.1418616, 48.141714, 48.1415753, 48.1414142, 
    48.1412826, 48.1411967, 48.1410786, 48.1409757, 48.1409067, 
    48.1407269, 48.1405864, 48.1404333, 48.1403268, 48.1402543, 
    48.1402221, 48.1401264, 48.139976, 48.1399205, 48.1398579, 
    48.1398227, 48.1397747, 48.1396753, 48.1395981, 48.1392932, 
    48.139141, 48.1390262534601, 48.138823299351, 48.138192947821, 
    48.1380751, 48.1379271, 48.1379099753807, 48.1376454990261, 
    48.1373660989646, 48.1372455655984, 48.1371469655613, 48.1371033655084, 
    48.1368843654295, 48.1368298987106, 48.1367696986917, 48.1366861448762, 
    48.1366731, 48.1366671255215, 48.1364625653164, 48.136325498628, 
    48.1361719652645, 48.1359583652054, 48.1352515650043, 48.1347969648583, 
    48.1346326981455, 48.1345396981008, 48.1345070980588, 48.134441298033, 
    48.1341800561902, 48.1341365, 48.1340951, 48.1340955779906, 
    48.1340412979302, 48.1339537645579, 48.1337729644843, 48.1337663231286, 
    48.13372, 48.1336619, 48.1336469941566, 48.1335648977392, 
    48.1335265643877, 48.133564073769, 48.1335625, 48.1335858, 
    48.1336015819586, 48.1335981643395, 48.1334723642786, 48.1333080975607, 
    48.1331548146899, 48.1331311, 48.1330783, 48.1330326, 48.132998450146, 
    48.1328969641219, 48.1327544974149, 48.1326450973713, 48.1326245478674, 
    48.1325341, 48.1324365, 48.1323882, 48.1323622, 48.1323593036425, 
    48.1322723639406, 48.1322450972489, 48.1322561638954, 48.1323713638957, 
    48.1324097638915, 48.1323989638721, 48.1323660971908, 48.1322181638125, 
    48.1317140969996, 48.1316482969821, 48.1315056969507, 48.131280963588, 
    48.1312475723138, 48.1312174, 48.1310984, 48.1310026, 48.1309892, 
    48.1309959909618, 48.13099609683, 48.1310728968316, 48.1311058968267, 
    48.1311026343569, 48.1310841, 48.1310268, 48.1309865, 48.1309292, 
    48.1308325, 48.1307923, 48.1307672, 48.130726, 48.1305989, 
    48.1303644, 48.1301746, 48.1299464, 48.1297387, 48.1296143, 
    48.1295534, 48.1295525366032, 48.129516762986, 48.1293304962701, 
    48.1292820354359, 48.1292679, 48.1291409, 48.1291176910539, 
    48.1289797628324, 48.1289553796768, 48.1288203, 48.1287478, 
    48.1286696, 48.1285491, 48.1284372, 48.1283253, 48.1282716, 
    48.1282253379411, 48.1278453625169, 48.1277959625012, 48.1278038178752, 
    48.1277229, 48.1276298, 48.1275358, 48.1275791, 48.1276121, 
    48.1276156305811, 48.127620895726, 48.1276756957347, 48.1279003624497, 
    48.1280977624865, 48.1282512958416, 48.1284651625395, 48.1286624959185, 
    48.1288489626188, 48.1289421626395, 48.1290626960046, 48.1291667627063, 
    48.1297202961899, 48.130087496296, 48.1303231630338, 48.1304546964272, 
    48.130481763154, 48.1305036964982, 48.1307612965629, 48.130898296603, 
    48.1309804966183, 48.1314959633539, 48.1316329633785, 48.1317481634034, 
    48.1318467634304, 48.1320330968219, 48.132334496897, 48.1329098970699, 
    48.1329755637618, 48.1329644971294, 48.1331123638473, 48.1332108972367, 
    48.1333423639449, 48.1335615640099, 48.1336656973766, 48.1337038974004, 
    48.1337477640809, 48.1338792974408, 48.133999897472, 48.1344272975903, 
    48.1347340976807, 48.134832764375, 48.1349204977249, 48.1349816862946, 
    48.1350872, 48.1350930815721, 48.1350959644047, 48.1351782977466, 
    48.1353701644448, 48.1355125644768, 48.1358304978971, 48.1361865646632, 
    48.1362303646794, 48.1362303646939, 48.1361752980515, 48.1361642980656, 
    48.1362300980841, 48.1363396981005, 48.1364214544059, 48.1365448, 
    48.1365454457805, 48.1365535647883, 48.1366193647957, 48.1367235648124, 
    48.1368605648408, 48.137096164894, 48.1373537649593, 48.1378743650982, 
    48.1379729651297, 48.1383455652231, 48.1384769652681, 48.1390083654304, 
    48.1392275654898, 48.1393590988519, 48.1394905655429, 48.1397263655895, 
    48.1398358989485, 48.1400769656893, 48.1401370990611, 48.1402849657739, 
    48.1404931658318, 48.1406903658791, 48.1408384992397, 48.1410082992765, 
    48.1411562993137, 48.1412767660166, 48.1414081660649, 48.1414190994177, 
    48.1413914994289, 48.1414680994596, 48.1416544995105, 48.1417474995474, 
    48.1418840996222, 48.1419717663216, 48.1420921663612, 48.1423113664194, 
    48.1423989664511, 48.1426234998568, 48.1428371665787, 48.1429796999378, 
    48.1430663664325, 48.1432671, 48.1432676646043, 48.143275899966, 
    48.1434358248517, 48.1434699, 48.1435249, 48.1436127, 48.1437169, 
    48.1437207769562, 48.1437256999974, 48.1438353666781, 48.1439121666898, 
    48.1440491667166, 48.1442025667629, 48.1442133667828, 48.144213300138, 
    48.1443007668413, 48.1443939002099, 48.1444539669117, 48.1446291003162, 
    48.1447605003623, 48.144918967115, 48.1449133004722, 48.1449405671549, 
    48.145022767187, 48.1451377005613, 48.1454609006468, 48.1456909673771, 
    48.1458167674213, 48.1459427674565, 48.1462157008631, 48.1463309675641, 
    48.1464187675863, 48.1465779676295, 48.1469897677522, 48.1473521011904, 
    48.1475771012477, 48.1477857679773, 48.1479943680379, 48.1480767680722, 
    48.1482469014525, 48.1483237681359, 48.148451742789, 48.1485343, 
    48.1489177, 48.1489246325065, 48.1489265014871, 48.1490361014994, 
    48.1490482084308, 48.149102, 48.1491353839639, 48.1491841681865, 
    48.1492166649145, 48.1492852, 48.1493956634536, 48.1494421015784, 
    48.1500679017598, 48.1501667017924, 48.1501723018094, 48.1501559018149, 
    48.1500681684773, 48.1500189684805, 48.1500463684905, 48.1501013018365, 
    48.1501067685095, 48.1499313685014, 48.1499369685106, 48.1500741018662, 
    48.1501509685541, 48.1502059019056, 48.1502281019467, 48.1501899019699, 
    48.1502009686633, 48.150332902055, 48.1506403021528, 48.1512551690088, 
    48.1514033690499, 48.1516559024578, 48.1520015692185, 48.152221169284, 
    48.1524243026695, 48.1525285693695, 48.1525725027257, 48.152671369425, 
    48.1527921027895, 48.1529457028314, 48.1532257029114, 48.1535439030045, 
    48.1538185030955, 48.1539665698066, 48.1542081032001, 48.1544385032598, 
    48.1545329735159, 48.1545999, 48.1545944694915, 48.1546087033219, 
    48.1547569700347, 48.1552561701589, 48.1557007036062, 48.1560079703488, 
    48.1563153037704, 48.1565239038388, 48.1566337038825, 48.1568037706005, 
    48.157039703995, 48.1572865707275, 48.1573931587783, 48.1574371, 
    48.1574534974807, 48.157533570803, 48.1578243708739, 48.1578758044067, 
    48.1580276, 48.1582136114299, 48.1582563220475, 48.1584089, 
    48.1584504236422, 48.1585707044253, 48.1588229711436, 48.1589601711871, 
    48.1590425712197, 48.159283904606, 48.1594923046559, 48.1598105714202, 
    48.1599971047972, 48.1600847714753, 48.1601083749009, 48.1601089, 
    48.1600924, 48.1599662, 48.1599991, 48.1600055835981, 48.1600079047456, 
    48.1601175047596, 48.1602107714408, 48.160342371469, 48.1604631048342, 
    48.1606057715484, 48.1606717049071, 48.1607759716004, 48.1608747049513, 
    48.1609169957601, 48.1609206, 48.160937, 48.1609041, 48.1607558, 
    48.160827, 48.1608304927915, 48.1608357715232, 48.1610057715484, 
    48.1612527049287, 48.1614283049786, 48.1617409717286, 48.1622017718482, 
    48.1623993052356, 48.1626627053038, 48.1630467054116, 48.1635405055306, 
    48.1644619724156, 48.1648679058474, 48.1652793059388, 48.1654821726475, 
    48.1656139060174, 48.1658005060756, 48.1659813727829, 48.1662501728378, 
    48.1663105728535, 48.1663271061986, 48.1664147728813, 48.1665135062271, 
    48.1666011729014, 48.1666835062618, 48.1668041729529, 48.1669788093469, 
    48.1671353, 48.1672121, 48.1672066, 48.1672778, 48.1672782241676, 
    48.1672865729809, 48.1674511063359, 48.1677033730497, 48.1679117730902, 
    48.1679501731089, 48.1679283064482, 48.1677529731253, 48.1677641064886, 
    48.1678793065347, 48.167994373239, 48.1683563733131, 48.1685429066889, 
    48.1686581067216, 48.1687733734332, 48.1688557068137, 48.1689873735214, 
    48.1694535736445, 48.1696291736949, 48.1700187071329, 48.170199707173, 
    48.1703641738702, 48.1704793072199, 48.1705835072315, 48.1707479739204, 
    48.1708905739529, 48.1709673739758, 48.1710333073216, 48.1711319073341, 
    48.171203174014, 48.1712361073602, 48.1711813740355, 48.1711705074165, 
    48.1712527741108, 48.1713843741351, 48.1715013512203, 48.171573, 
    48.1716113, 48.1716387, 48.17171, 48.171717297517, 48.1717187741136, 
    48.1717901074546, 48.1719379741411, 48.1720861075022, 48.1723603742257, 
    48.1725633076099, 48.1729253077096, 48.1738357746228, 48.1740057746753, 
    48.1741923747278, 48.1743623747893, 48.1745269748584, 48.1746477082207, 
    48.1748341082598, 48.1750589083048, 48.1751467083265, 48.1752179750164, 
    48.1752509083649, 48.1753167750552, 48.175585508468, 48.1758597085434, 
    48.1759639752451, 48.1759915086185, 48.1760627753051, 48.1762271753546, 
    48.1763369087165, 48.1764905754284, 48.1766989754862, 48.1769675755546, 
    48.1770663089217, 48.1772199089708, 48.1772684268683, 48.1773929524802, 
    48.1775325090492, 48.1778561091151, 48.1780479758194, 48.1782125091928, 
    48.1784923092823, 48.1787335093569, 48.1788871094127, 48.1791173761509, 
    48.179495776254, 48.180329309789, 48.1804993098332, 48.1806473765555, 
    48.1808393099343, 48.1810477099815, 48.1812011766777, 48.1813327767071, 
    48.1817933768327, 48.1822101769422, 48.1824953103395, 48.1827419770704, 
    48.1830053104703, 48.1831861771909, 48.1834767772819, 48.1838605774064, 
    48.1841841108314, 48.1846337109364, 48.1849845776772, 48.1853793777754, 
    48.1855603111565, 48.1857961112064, 48.1858837778953, 48.1860373112727, 
    48.1861249779755, 48.1862511780064, 48.1862731113505, 48.1862565780233, 
    48.1862841113638, 48.1864211780494, 48.1865199114008, 48.1865363114098, 
    48.1865855780939, 48.1866951781135, 48.1869145781421, 48.1870241781668, 
    48.187062711516, 48.1870517115212, 48.1868927115149, 48.186892578186, 
    48.1870131782099, 48.1871119782308, 48.187199711593, 48.1872819116094, 
    48.1874463782993, 48.1874847783085, 48.1875505783305, 48.187682111692, 
    48.1877259783732, 48.1876877117118, 48.1876931117181, 48.1877259783916, 
    48.1878027783999, 48.1878905117443, 48.1879343117542, 48.1880111117894, 
    48.1880823118127, 48.188252311839, 48.1883399785333, 48.188367511885, 
    48.1884607119135, 48.1886305786221, 48.1886635119723, 48.1888005120023, 
    48.1890199120376, 48.1892227120606, 48.189387312075, 48.189618493107, 
    48.1897295, 48.1898282, 48.1898294017729, 48.1898369787848, 
    48.189924712128, 48.1899739788076, 48.1900727788285, 48.190100112174, 
    48.1901549121866, 48.1902016005964, 48.1902504, 48.1902573371751, 
    48.1902591788531, 48.1903141121941, 48.1904291122228, 48.1906045789198, 
    48.1908129789502, 48.190900050908, 48.1910016, 48.1910236, 
    48.1909524, 48.1906289, 48.1904207, 48.1903823, 48.1903439, 
    48.1902178, 48.1902068, 48.1902672, 48.190322, 48.1903001, 
    48.1901137, 48.1900643, 48.1899986, 48.1899108, 48.1895929, 
    48.18956, 48.1894942, 48.1893846, 48.1891598, 48.188913, 
    48.1885511, 48.1883593, 48.1879864, 48.187811, 48.1875916, 
    48.1867526, 48.1865936, 48.1864346, 48.18644, 48.1865387, 
    48.1864785, 48.1860946, 48.1858587, 48.1858478, 48.1858567326258, 
    48.1858565770557, 48.1859553103993, 48.186015577076, 48.186050926045, 
    48.1860561, 48.1860178, 48.185941, 48.1858313, 48.1854748, 
    48.185404894361, 48.1853739102028, 48.1853705132432, 48.1853651, 
    48.1853378, 48.1853213, 48.1852883, 48.1852171, 48.1851239, 
    48.1849099, 48.1846412, 48.1844055, 48.1841751, 48.1840051, 
    48.1838132, 48.1838132, 48.1838625, 48.1837528, 48.1834347, 
    48.1831769, 48.1829958, 48.182782, 48.1825901, 48.1823597, 
    48.1822829, 48.1821732, 48.1820691, 48.1818771, 48.1818278, 
    48.1818552, 48.1818629803201, 48.1818639759262, 48.1819529017297, 
    48.1819977, 48.1820087, 48.1819923, 48.1819319, 48.1817674, 
    48.1816029, 48.1813945, 48.1813616, 48.181367, 48.1813756141126, 
    48.1813757758035, 48.1814581091453, 48.1816341823421, 48.1816632, 
    48.1816357, 48.1815699, 48.1814382, 48.1812463, 48.1811915, 
    48.1812079, 48.1811695, 48.1810433, 48.1803522, 48.1802097, 
    48.1800233, 48.1799739, 48.1799245, 48.1797819, 48.1796502, 
    48.1794583, 48.179206, 48.1790525, 48.1787015, 48.1784765, 
    48.1784709, 48.1785312, 48.1784709, 48.1783283, 48.1780376, 
    48.1779115, 48.1778456, 48.1777359, 48.177522, 48.1771326, 
    48.1768363, 48.1765565, 48.1765619, 48.1766825, 48.1766277, 
    48.1765344, 48.1763315, 48.1760901, 48.1760407, 48.1760241, 
    48.175931, 48.1757499, 48.175717, 48.1757114, 48.1755907, 
    48.1754755, 48.1753932, 48.1753328, 48.1751683, 48.1750038, 
    48.1748885, 48.1745483, 48.1741863, 48.1739229, 48.1736925, 
    48.1734071, 48.1732426, 48.173078, 48.1729352, 48.17282, 
    48.1726335, 48.1724908, 48.1722329, 48.1719967, 48.1718759, 
    48.171821, 48.1716783, 48.171393, 48.171179, 48.1709485, 
    48.1707893, 48.1707069, 48.17063, 48.1704488, 48.170328, 
    48.1700646, 48.1699273, 48.1697534, 48.1696339, 48.1695113, 
    48.1693013, 48.1691303, 48.1690294, 48.16883, 48.1685702, 
    48.168327, 48.1680873, 48.167877, 48.1677329, 48.1677214, 
    48.1676225, 48.1674415, 48.167063, 48.1667997, 48.1664924, 
    48.1663606, 48.1663825, 48.1664976, 48.1665139, 48.166492, 
    48.1663602, 48.1661024, 48.1657513, 48.1653344, 48.1649229, 
    48.1643962, 48.1637377, 48.1631067, 48.1628653, 48.162053, 
    48.1609554, 48.1605162, 48.1603461, 48.1600936, 48.1592814, 
    48.1581013, 48.1576677, 48.1572999, 48.1570654, 48.156238, 
    48.1550588, 48.1546603, 48.1541124, 48.1538385, 48.1533291, 
    48.1524363, 48.1517133, 48.1512314, 48.1509137, 48.1504317, 
    48.1501852, 48.1498017, 48.1496428, 48.14898, 48.148257, 
    48.1480215, 48.1477749, 48.1475447, 48.1475119, 48.147512, 
    48.1474572, 48.1473695, 48.1472489, 48.1471777, 48.147101, 
    48.1469312, 48.146734, 48.146345, 48.1461643, 48.145907, 
    48.1458413, 48.1455456, 48.1455292, 48.1455786, 48.1457706, 
    48.1457651, 48.1456445, 48.1454966, 48.1454309, 48.1454419, 
    48.1454858, 48.1454887146405, 48.1454945654192, 48.1455493654306, 
    48.1456314987977, 48.1458561655183, 48.146015165561, 48.1461433181011, 
    48.1462806, 48.1462865939054, 48.1462893655882, 48.1463935655998, 
    48.1465745656282, 48.1467389656615, 48.1468540990342, 48.1471827658, 
    48.1474676992146, 48.147818499305, 48.1482676994381, 48.1490018996592, 
    48.1493196997523, 48.1498401665674, 48.1499443665919, 48.1500101666009, 
    48.1500452012049, 48.1500453, 48.1499686, 48.1497824, 48.1496455, 
    48.149388, 48.149251, 48.1492237, 48.149306, 48.1493119875569, 
    48.1493147663092, 48.149413499655, 48.1495504996835, 48.1496326997049, 
    48.1500545664986, 48.1502573665479, 48.150695700001, 48.1507943666897, 
    48.1508271199823, 48.1508514, 48.1508515, 48.1507092, 48.1507146, 
    48.1507531, 48.1507557941314, 48.150761899951, 48.1509194806717, 
    48.1509669, 48.1510053, 48.1509616, 48.150863, 48.1505288, 
    48.1501783, 48.1501673, 48.1502551, 48.1502715, 48.1501675, 
    48.1494829, 48.149187, 48.1489678, 48.1488637, 48.1487322, 
    48.1485294, 48.1484088, 48.1482608, 48.1482061, 48.1481459, 
    48.1480198, 48.147987, 48.1480034, 48.1480100955595, 48.1480121655897, 
    48.1481656989499, 48.1482807656442, 48.1483410989937, 48.1485328990688, 
    48.1487246991188, 48.1490699658644, 48.1491959658992, 48.1493219659362, 
    48.149579499361, 48.1498918994506, 48.1500122994946, 48.1502917662401, 
    48.1507357663473, 48.151185166443, 48.1512783664686, 48.151568766558, 
    48.1519304999927, 48.1521495667237, 48.1526699668862, 48.1529057002812, 
    48.1531137670107, 48.1540617006237, 48.1547301008089, 48.1549491675432, 
    48.1552669676307, 48.1555737677095, 48.155672501071, 48.1557161677649, 
    48.155754567778, 48.1558971011356, 48.1560669011718, 48.1565437012981, 
    48.1571463681196, 48.1576777682579, 48.1579133683223, 48.1580941683764, 
    48.1582749017715, 48.1583569018192, 48.1589159686017, 48.1594309687187, 
    48.159661102114, 48.1597267688076, 48.1597595688301, 48.1598637021918, 
    48.1601979022703, 48.1603731689853, 48.1604225023422, 48.1604223690217, 
    48.1603619690206, 48.1603619690256, 48.1604879024049, 48.1605535691041, 
    48.1605535024447, 48.1604875024652, 48.1603995691349, 48.1602679024622, 
    48.1601801691224, 48.1601790164921, 48.1601714, 48.1599794, 
    48.1598479, 48.1597767, 48.1597164, 48.1596150580158, 48.1594837690117, 
    48.1594806663263, 48.159475, 48.1594133657502, 48.1594453690203, 
    48.1594727023759, 48.1596533690955, 48.1596587024486, 48.1598997691753, 
    48.1600749692347, 48.1601297692457, 48.1602669025991, 48.1604695026578, 
    48.1607653693928, 48.1610557028087, 48.1616127696205, 48.1621013030771, 
    48.1625677698596, 48.1630947033204, 48.1632867700376, 48.1634515034183, 
    48.1635557034366, 48.1636325034456, 48.1637037034559, 48.1637915034758, 
    48.1638957034953, 48.1639760277509, 48.1639966, 48.1638867, 
    48.1636561, 48.1632716, 48.1629036, 48.1626368, 48.1625547, 
    48.1625384, 48.1625769, 48.1626373, 48.1627799, 48.1627805371655, 
    48.1627887030202, 48.1629861030424, 48.1631395697347, 48.1633915697931, 
    48.1637479032042, 48.1641643033064, 48.1645687033964, 48.1647771701142, 
    48.16512310354, 48.1658255703846, 48.1663579038412, 48.1668627706328, 
    48.1671701040483, 48.167559704139, 48.1679987709148, 48.1683115709988, 
    48.1685475710577, 48.1689977045186, 48.1695191046587, 48.1697771047368, 
    48.1697827047515, 48.169799171426, 48.1697115714291, 48.1695307714253, 
    48.1695241307094, 48.169522, 48.169363, 48.1692424, 48.1691984, 
    48.1690558, 48.168134, 48.1670915, 48.1664989, 48.166296, 
    48.1661451999853, 48.1660197040427, 48.1660087707208, 48.1660967707558, 
    48.1662011041248, 48.1663603041686, 48.1665249708842, 48.1666403042609, 
    48.1666623042773, 48.1666789042992, 48.1668383043698, 48.1669261710805, 
    48.1669317710924, 48.1669153710929, 48.1669073908217, 48.1669066, 
    48.1668518, 48.1667147, 48.1666133268674, 48.1665755043978, 
    48.1667183044527, 48.1668335711549, 48.1671465045772, 48.1673221712995, 
    48.1674045046547, 48.1674045046659, 48.1673957000014, 48.1673957, 
    48.1672393979695, 48.1672071713205, 48.1672951046844, 48.1672951713661, 
    48.1673775047287, 48.1676189714606, 48.1680361715908, 48.1682887049953, 
    48.1687773051623, 48.1690791052358, 48.1691146882671, 48.169353, 
    48.1694638520529, 48.1695949720513, 48.1698035054414, 48.1699317386336, 
    48.1699517, 48.170147, 48.1701799, 48.170169633895, 48.1701933055796, 
    48.1702394363011, 48.1702431, 48.1703482, 48.1705833, 48.1706445, 
    48.1706478539667, 48.1706597056982, 48.1707803723966, 48.1709231057782, 
    48.1714499059286, 48.1716529726607, 48.1718231060415, 48.1719493060696, 
    48.1720313080399, 48.172105, 48.1721052079545, 48.1721137727567, 
    48.1721795727674, 48.1723057728061, 48.1723715728157, 48.1723956800093, 
    48.1723682, 48.1722255, 48.1721706, 48.172176, 48.1722253, 
    48.1721869, 48.1721155, 48.1720606, 48.172099, 48.1721043942807, 
    48.1721077726513, 48.1722723060158, 48.1724315060679, 48.1725961061174, 
    48.172766172821, 48.1729801061889, 48.1732269062364, 48.173495706297, 
    48.1736713063614, 48.1738579730902, 48.173885582816, 48.1740127, 
    48.1741164, 48.1741165, 48.1742285, 48.1744167, 48.1748303, 
    48.1749435001875, 48.1751967734566, 48.1755149735414, 48.175992306992, 
    48.1766451071347, 48.1770839739111, 48.1771881072678, 48.177213725617, 
    48.177256, 48.1772585941886, 48.1772647739377, 48.1773253072889, 
    48.1774185073062, 48.1774812385913, 48.1774865, 48.1774645, 
    48.1773382, 48.1771242, 48.1768991, 48.1766467, 48.1763999, 
    48.1761859, 48.1760542, 48.1760101, 48.1758949, 48.1756753, 
    48.1754338, 48.1752196, 48.1750219, 48.1749561, 48.1747694, 
    48.1746375, 48.1744179, 48.174149, 48.1739842, 48.173869, 
    48.173836, 48.173814, 48.1738633, 48.1739291, 48.1739337123909, 
    48.1739379059902, 48.1740859060095, 48.1742285060314, 48.1743107727122, 
    48.174382106061, 48.1745577061076, 48.1747717061701, 48.175089972926, 
    48.1753753730123, 48.1757101731183, 48.176231573278, 48.1765389066935, 
    48.1768241067485, 48.1769613067864, 48.1771807735248, 48.1773015068904, 
    48.1776087069641, 48.177872107029, 48.1780367070735, 48.1781629071211, 
    48.178327573844, 48.17847030722, 48.1787775072954, 48.1788379073154, 
    48.1788709073385, 48.17892577403, 48.1790519740647, 48.1792275074385, 
    48.1793865741433, 48.1796665075645, 48.179798174265, 48.1802865077417, 
    48.1805553078152, 48.1808021745545, 48.1810325746098, 48.1811203746409, 
    48.1811971746727, 48.1815867747774, 48.1818061748283, 48.1819817748805, 
    48.1822067082751, 48.1823931749949, 48.1825413750511, 48.182870575144, 
    48.1831065085396, 48.183199775237, 48.1833259752756, 48.1836935086966, 
    48.1838415754078, 48.1839239087737, 48.1840335754627, 48.1842255755082, 
    48.1843737088822, 48.1844341088961, 48.1844746000031, 48.1844746, 
    48.1844361, 48.184063, 48.183871, 48.1833334, 48.1832895, 
    48.1833059, 48.183314032772, 48.1833147085163, 48.1833859751906, 
    48.1836271752289, 48.1836626462307, 48.1836678, 48.1834922, 
    48.1833661, 48.1833112, 48.1832509, 48.1831708179761, 48.1830953084502, 
    48.1829855751079, 48.1829848198549, 48.1829768, 48.1828781, 
    48.1827904, 48.1826806, 48.1824995, 48.1821813, 48.1815778, 
    48.1814461, 48.1812978, 48.1812209, 48.1811495, 48.1810946, 
    48.1810123, 48.1808972, 48.180804, 48.1807492, 48.1807327, 
    48.1807435, 48.1807325, 48.1806062, 48.1804251, 48.1803647, 
    48.1803536, 48.1804412, 48.1804303, 48.1803588, 48.1802929, 
    48.1802105, 48.1801556, 48.1801117, 48.1800059634826, 48.17987377403, 
    48.1798694928287, 48.179865, 48.1797115, 48.1795524, 48.1794537, 
    48.1792562, 48.1789271, 48.1788062, 48.1787457, 48.178762, 
    48.1788771, 48.1788716, 48.1785697, 48.1784874, 48.1783885, 
    48.1783447, 48.1781692, 48.1779937, 48.177862, 48.1777521, 
    48.1776531, 48.17745, 48.1773127, 48.1771534, 48.1771039, 
    48.1769941, 48.1769556, 48.1770432, 48.1772844, 48.1772879001527, 
    48.1772931730309, 48.1775015730541, 48.1775893063995, 48.1776331730728, 
    48.1777483730988, 48.1778635731309, 48.1781599732277, 48.1782861732607, 
    48.1784453733073, 48.1787749067583, 48.1789669068194, 48.1791865068799, 
    48.1792799069225, 48.179444373633, 48.1796035736919, 48.1798835071131, 
    48.1799987071334, 48.1801303738334, 48.1801963071909, 48.1802839738803, 
    48.1803545766533, 48.1803739, 48.1803794, 48.1803519, 48.1802475, 
    48.1801321, 48.1798632, 48.1798521, 48.1797038, 48.1794513, 
    48.1792811, 48.1789517, 48.1788089, 48.1785454, 48.1783423, 
    48.1780898, 48.1780074, 48.1779469, 48.1779689, 48.1779762802294, 
    48.1779777062915, 48.1780599063018, 48.1782079729928, 48.1782409063345, 
    48.1783011730162, 48.1786799064538, 48.1788721065106, 48.1791793732711, 
    48.1795251733864, 48.1797611734486, 48.1799477068256, 48.1800847735179, 
    48.1802001068805, 48.1803483069239, 48.1804307069716, 48.1804965736613, 
    48.1806009070264, 48.18068317371, 48.1807678295741, 48.1808333, 
    48.1808223, 48.180663, 48.180471, 48.1803118, 48.1802514, 
    48.1802018, 48.1800316, 48.1800205, 48.1799655, 48.179713, 
    48.179455, 48.1792793, 48.1791858, 48.1791252, 48.1790538, 
    48.1789331, 48.1787521, 48.1786423, 48.1785708, 48.1784939, 
    48.1783566, 48.1781974, 48.1779177, 48.1776489, 48.1771496, 
    48.1763484, 48.175794, 48.175591, 48.17541, 48.1752236, 48.1750865, 
    48.1748563, 48.1745984, 48.1743021, 48.174088, 48.1739726, 
    48.1739668, 48.1739942, 48.1740006103476, 48.1740029717198, 
    48.1741586930098, 48.1741586, 48.1740871, 48.1739445, 48.173736, 
    48.1735878, 48.1733133, 48.1731104, 48.1728965, 48.1728196, 
    48.1728304, 48.1728249, 48.1727042, 48.172632259506, 48.1725157046874, 
    48.1725092025158, 48.1725069, 48.1723699, 48.1720409, 48.1716678, 
    48.1711412, 48.1702853, 48.1695391, 48.1688421, 48.1683233, 
    48.1682464973238, 48.1682003704792, 48.1681785038179, 48.1682331705033, 
    48.1683755705408, 48.1684413038967, 48.1685715039347, 48.1690435040518, 
    48.1694989041577, 48.1695867041849, 48.1696911708895, 48.1696967042347, 
    48.1696693042349, 48.1696625195484, 48.1696605, 48.1695728, 
    48.1693645, 48.1691669, 48.1684644, 48.1682834, 48.1679267, 
    48.1676195, 48.1672206, 48.1668864, 48.1664317, 48.1659387, 
    48.1656483, 48.164711, 48.1644315, 48.1640314, 48.163648, 
    48.1631438, 48.1624863, 48.1623987, 48.1617466, 48.1615877, 
    48.1615604, 48.1614838, 48.1615718, 48.1615828, 48.1615006, 
    48.1611335, 48.1610185, 48.1608978, 48.1605195, 48.160185, 
    48.1599712, 48.1597685, 48.1596424, 48.1595659, 48.159577, 
    48.1596759, 48.1597802, 48.1597821839922, 48.1597889685551, 
    48.1599315019115, 48.1600135586011, 48.1600434, 48.1600105, 
    48.1598023, 48.1596708, 48.1594462, 48.1590902, 48.1589038, 
    48.1586791, 48.1581746, 48.1580485, 48.157917, 48.1576869, 
    48.157506, 48.1570895, 48.1568648, 48.156569, 48.1562349, 
    48.1560104, 48.1558461, 48.1554408, 48.1549257, 48.1542625, 
    48.1539283, 48.1534023, 48.1533476, 48.1533038, 48.1533314, 
    48.1533973, 48.153529, 48.1535357157536, 48.1535377667416, 
    48.1538009667673, 48.1540423001329, 48.1541465001551, 48.1550011004096, 
    48.1557519006201, 48.1562013007336, 48.1562669007533, 48.1563051674521, 
    48.1568585676018, 48.157187367688, 48.1573189010574, 48.1574003702378, 
    48.1574691, 48.1574696762073, 48.1574779010749, 48.1575547010878, 
    48.1578177011565, 48.1579109011851, 48.1579985012078, 48.1580587678839, 
    48.1582044209183, 48.158231, 48.1582201, 48.1581105, 48.1581435, 
    48.1581381, 48.1579079, 48.15776, 48.15759, 48.1575023, 48.157431, 
    48.1571684, 48.1566807, 48.1564999, 48.1562973, 48.1560617, 
    48.1556891, 48.1556946, 48.1557032677635, 48.1557033670916, 
    48.1557637670977, 48.1558241004416, 48.1562021671985, 48.1562843672244, 
    48.1565035672894, 48.1568815674064, 48.1570679674473, 48.1571561141141, 
    48.1572237, 48.1573006, 48.1573335, 48.1572898, 48.1570816, 
    48.1567037, 48.1563749, 48.1559968, 48.1557556, 48.1556022, 
    48.155394, 48.1550871, 48.1548186, 48.1546598, 48.154523, 
    48.1543368, 48.1541724, 48.1539477, 48.1536901, 48.153575, 
    48.1533778, 48.1530982, 48.1527969, 48.1522104, 48.1518158, 
    48.1511855, 48.1507196, 48.1501222, 48.1495959, 48.1490643, 
    48.1487957, 48.1484339, 48.1481708, 48.1477378, 48.1468607, 
    48.146751, 48.146636, 48.1465045, 48.1462523, 48.1458302, 
    48.1456108, 48.1453478, 48.1451833, 48.1447941, 48.1445364, 
    48.1443171, 48.1442404, 48.1442295, 48.1442679, 48.1443721, 
    48.1443754822732, 48.1443808968423, 48.1444630968536, 48.144578163544, 
    48.1447097635812, 48.1449674969915, 48.1451592970387, 48.1453018970696, 
    48.1454060970856, 48.1454372269277, 48.1454686, 48.1454742, 
    48.1455345, 48.1455407106268, 48.1455432970537, 48.1456308970647, 
    48.1457735637639, 48.1459434971408, 48.1461408971787, 48.1461901638605, 
    48.146217563894, 48.1463271639376, 48.1464916973161, 48.1466451640157, 
    48.1468315640425, 48.1468754973847, 48.1470672974493, 48.1472153641504, 
    48.1474292975261, 48.1476320975547, 48.1477636975823, 48.1478349642717, 
    48.1478513642824, 48.147774564288, 48.1477525643012, 48.1478457643392, 
    48.1480321643929, 48.148065097742, 48.1479991644404, 48.1480430978016, 
    48.1481197645024, 48.1482895645537, 48.1484815646038, 48.1489748980461, 
    48.1490462980682, 48.1491009647732, 48.1492653648244, 48.1495174982457, 
    48.1498902983464, 48.1506411652325, 48.1509481653113, 48.1511564986885, 
    48.1514031654015, 48.1515127654318, 48.1517265654993, 48.1519348988833, 
    48.1520773655808, 48.1523186989586, 48.1524885656588, 48.1525872990175, 
    48.1527132990596, 48.1528393657609, 48.1529653657879, 48.153168299157, 
    48.1532450991732, 48.1533929658866, 48.1536778993287, 48.1539682994443, 
    48.1541764995223, 48.1542914995784, 48.154351766269, 48.154669699677, 
    48.1547463663655, 48.1548723664103, 48.1550368997843, 48.1552670998518, 
    48.1559465667057, 48.156236966785, 48.1567905669263, 48.1569823003164, 
    48.1570919670233, 48.1572179004221, 48.1572891004398, 48.1574755004723, 
    48.1576069671688, 48.1576783005159, 48.1577095519951, 48.1577244, 
    48.1577189, 48.1576038, 48.1575271, 48.1573847, 48.1572917, 
    48.1573412, 48.1572975, 48.1572865, 48.1572976, 48.1573854, 
    48.157389549833, 48.1573941669241, 48.1575037669387, 48.1577723669914, 
    48.1578379967795, 48.1578843, 48.1578898, 48.1577748, 48.1577364, 
    48.1577365, 48.1574679, 48.1572761, 48.1571501, 48.1569967, 
    48.1566951, 48.1565198, 48.1564156, 48.1562787, 48.1561746, 
    48.1560813, 48.1561088, 48.1561856, 48.1561966, 48.156235, 
    48.1562410728798, 48.1562437664587, 48.1563533664733, 48.1565343665027, 
    48.1566055665165, 48.156687899869, 48.1569564999414, 48.1574551000896, 
    48.1575811667978, 48.1575757001399, 48.1574989001427, 48.1574933001559, 
    48.1575481001763, 48.157613900191, 48.1577455002114, 48.1578605669096, 
    48.1579645669559, 48.1581891670216, 48.1583975004195, 48.15850156711, 
    48.1586881004686, 48.1588635004978, 48.159000500529, 48.1591703672387, 
    48.1593019672815, 48.1595265673506, 48.1596253007054, 48.1597004310593, 
    48.1597262, 48.1597153, 48.1596166, 48.1594851, 48.1594139, 
    48.1594304, 48.1594523, 48.1594580955992, 48.1594611005966, 
    48.1595489006098, 48.1596859006421, 48.159976367397, 48.1603929008421, 
    48.1604695675222, 48.160494555683, 48.1605157, 48.1605157, 
    48.1604226, 48.1601157, 48.1598088, 48.1596992, 48.1596169, 
    48.1596115, 48.159639, 48.1596007, 48.1594473, 48.1593596, 
    48.1593323, 48.1592118, 48.1590749, 48.1589104, 48.1588172, 
    48.1587898, 48.1588392, 48.1588442345272, 48.1588479669268, 
    48.1589137669353, 48.1590343669531, 48.1591495669769, 48.1592427669992, 
    48.1593523670306, 48.1595659670987, 48.1596701671271, 48.1600703672198, 
    48.1602785672827, 48.1604593006969, 48.1605799007259, 48.1607717007647, 
    48.1610785675084, 48.1610511675152, 48.1611005008626, 48.1612649675587, 
    48.1613087675692, 48.1613033009108, 48.1613417009273, 48.161604767656, 
    48.1619007010727, 48.1622513011894, 48.1623993012215, 48.1624705012392, 
    48.1625253012546, 48.1625714327716, 48.1625824, 48.1624783, 
    48.1624948, 48.1625332, 48.1625354531988, 48.1625419678839, 
    48.1626515678996, 48.1627667012577, 48.1629531013047, 48.1630297679859, 
    48.1632271680182, 48.1633861680508, 48.163506701412, 48.163558658887, 
    48.1636515, 48.1636560119676, 48.1636603014253, 48.1637425681011, 
    48.1638523014507, 48.1644277682349, 48.1646635016119, 48.1649705016907, 
    48.1650745683807, 48.1652555684091, 48.1654473684467, 48.165501431329, 
    48.1655428, 48.1655648, 48.1654827, 48.1654006, 48.1652088, 
    48.1652089, 48.1651486, 48.165006, 48.1648362, 48.164502, 
    48.1642443, 48.1639869, 48.1637512, 48.163532, 48.1633513, 
    48.1629567, 48.1622827, 48.162047, 48.1616469, 48.1610824, 
    48.1605179, 48.1602821, 48.1600848, 48.1598603, 48.1594876, 
    48.1590546, 48.1586216, 48.1584626, 48.1579309, 48.1572843, 
    48.1570759, 48.1569006, 48.15678, 48.1564236, 48.1561331, 
    48.1558535, 48.1551792, 48.1549052, 48.1545543, 48.1543899, 
    48.1541267, 48.1536168, 48.153244, 48.1529534, 48.1527232, 
    48.1523669, 48.1519228, 48.1517363, 48.1512867, 48.1508646, 
    48.1506507, 48.1504533, 48.1503766, 48.1503358963904, 48.1503249640952, 
    48.1503852974537, 48.1509609643268, 48.1510102976865, 48.1509992977046, 
    48.1509114977009, 48.150903544783, 48.1509027, 48.1507986, 
    48.1506290307677, 48.1505770976637, 48.1505550976746, 48.1505879643553, 
    48.1508292977538, 48.1511964978655, 48.1512787645715, 48.1512787645827, 
    48.1511964979148, 48.1511895570462, 48.1511877, 48.1510726, 
    48.150919, 48.1506546400417, 48.1506207644974, 48.1506316978441, 
    48.1507138978812, 48.1507138978884, 48.150637164554, 48.1506299900614, 
    48.1506284, 48.1505077, 48.1504474, 48.1503542, 48.1502006, 
    48.1501307679979, 48.1500174977979, 48.1498090977865, 48.1497541644573, 
    48.1497432977992, 48.149759764481, 48.1498583645103, 48.1500447645606, 
    48.1504832980356, 48.1504722980458, 48.1503955647142, 48.1503871594727, 
    48.1503868, 48.1500522, 48.1499097, 48.1498055, 48.1496903, 
    48.1495478, 48.149334, 48.1491367, 48.1490544, 48.1486706, 
    48.1486049, 48.1485775, 48.1485446, 48.1484956335649, 48.1484547642644, 
    48.1484217642666, 48.1484107642841, 48.1483340976141, 48.1483270248071, 
    48.1483253, 48.1482594, 48.148084, 48.1479938, 48.147914, 
    48.1478647, 48.1478702, 48.1476893, 48.1474371, 48.1471959, 
    48.1470643, 48.1465216, 48.1458362, 48.1456114, 48.145414, 
    48.145096, 48.1449316, 48.1448109, 48.1447514898483, 48.1446825633554, 
    48.1446496966942, 48.1445618966905, 48.1444850966855, 48.1444817075976, 
    48.1444763, 48.1443941, 48.1443283, 48.1441639, 48.1441035, 
    48.1439006, 48.1437088, 48.1435717, 48.1435882, 48.1436375, 
    48.1436923, 48.1437582, 48.1437611578376, 48.1437669631036, 
    48.143843696447, 48.143936896461, 48.1440958964947, 48.1441781631744, 
    48.1442713631861, 48.144355983365, 48.1443723, 48.1443284, 
    48.1442133, 48.1441091, 48.1439282, 48.1438898, 48.1438459, 
    48.1438514, 48.1439392, 48.1439424155225, 48.1439479630777, 
    48.1440355630887, 48.1441607899914, 48.1441804, 48.1441475, 
    48.1441585, 48.144167260001, 48.1441672964178, 48.1442220964226, 
    48.1443045398837, 48.144323, 48.144323, 48.1442791, 48.1441859, 
    48.1440708, 48.1439282, 48.1437527, 48.1435828, 48.1433744, 
    48.1432593, 48.1432264, 48.1433086, 48.1433196, 48.1432921, 
    48.1432154, 48.1431989, 48.1432976, 48.1433195, 48.1431166, 
    48.1430453, 48.1429685, 48.1427656, 48.1427273, 48.1426559, 
    48.1424529, 48.142239, 48.1421184, 48.142036, 48.1418385, 
    48.1416081, 48.1413175, 48.1412132, 48.1411253, 48.1411199, 
    48.1411308, 48.1411637, 48.1411718624046, 48.1411724948098, 
    48.1412218948144, 48.1412985614922, 48.1413753615107, 48.1414631615278, 
    48.1415563615407, 48.1416111615522, 48.1416605615775, 48.1417318949413, 
    48.1417866949584, 48.1418579616372, 48.1419676949857, 48.1421102949986, 
    48.1421431616698, 48.1421705616803, 48.1421540950192, 48.1419458950134, 
    48.1419347616886, 48.1419403617006, 48.1419622950487, 48.14203909508, 
    48.1421103617733, 48.1422091617975, 48.1423626951627, 48.1425271618605, 
    48.1427245619123, 48.1428671619634, 48.1430427620363, 48.1434432955715, 
    48.1436406956514, 48.1437886957205, 48.1440629624837, 48.1445017626691, 
    48.1449897628534, 48.1455600963807, 48.1458725631504, 48.1460480965589, 
    48.1461138965769, 48.1461588090014, 48.1461873, 48.1461873, 
    48.1461051, 48.1460557, 48.1460502, 48.1459406, 48.1456938, 
    48.1452826, 48.1451181, 48.1449975, 48.1449864, 48.1450687, 
    48.1450687, 48.1450522, 48.1450906, 48.1450982706913, 48.1450993627203, 
    48.1452035627308, 48.1453789627527, 48.1454941627753, 48.145636762814, 
    48.1459109629084, 48.1463332963974, 48.1464703631272, 48.146700696555, 
    48.146859563276, 48.1469747633031, 48.1471666966786, 48.1473257633885, 
    48.1475231634533, 48.1476053635072, 48.1476656968639, 48.1478575635873, 
    48.1479288969371, 48.1479945636146, 48.1480375044707, 48.1480681, 
    48.1480516, 48.1479858, 48.1478708, 48.1478104, 48.1477611, 
    48.1476021, 48.147476, 48.1473224, 48.147295, 48.1473224, 
    48.1474156, 48.1474243586238, 48.1474243633187, 48.147439966897, 
    48.1475527, 48.1475527304922, 48.1475614966638, 48.1476656966776, 
    48.147780896708, 48.1478301633988, 48.1480330967921, 48.1482852968599, 
    48.1484552968929, 48.1486305538549, 48.1487152, 48.1487755, 
    48.1487865, 48.1487536, 48.1486987, 48.1485781, 48.1485068, 
    48.1484904, 48.1485398, 48.1486658, 48.1487097, 48.1487206, 
    48.1484903, 48.1484685, 48.1484739, 48.1483532, 48.1483259, 
    48.1483368, 48.148112, 48.1480681, 48.1479639, 48.1477993, 
    48.147739, 48.1476293, 48.1475526, 48.1473222, 48.1473003, 
    48.1472125, 48.1469876, 48.1468834, 48.1467627, 48.1466255, 
    48.1464335, 48.14634, 48.1462194, 48.1461426, 48.1459671, 
    48.1457696, 48.1455994, 48.1453471, 48.1451715, 48.1450343, 
    48.1448697, 48.1448039, 48.1447052, 48.1443213, 48.1441347, 
    48.1435533, 48.1434381, 48.1432845, 48.143213, 48.1431307, 
    48.1426206, 48.1424999, 48.142319, 48.1422038, 48.1420282, 
    48.1418362, 48.1417429, 48.1416935, 48.1417154, 48.1417227762517, 
    48.1417241607344, 48.1417789607413, 48.1419105607635, 48.141989746077, 
    48.141995, 48.1419729, 48.1417151, 48.14132, 48.1408371, 
    48.1407382, 48.1407163, 48.140749, 48.1408421, 48.1408256, 
    48.1406609, 48.1406828, 48.1406907168387, 48.1406915601418, 
    48.1407573601486, 48.1408999601722, 48.1410480935445, 48.1411907602566, 
    48.1413169602824, 48.1414236778033, 48.1414781, 48.1415055, 
    48.1415054, 48.141423, 48.1411815, 48.1410113, 48.140918, 
    48.1408119255151, 48.1407678933575, 48.1406088933562, 48.140548693353, 
    48.1405461125833, 48.1405399, 48.140326, 48.1401998, 48.1401394, 
    48.1401175, 48.1401447, 48.1400511, 48.1398369, 48.1394306, 
    48.1391507, 48.1389532, 48.1387611, 48.1386843, 48.1384704, 
    48.1383991, 48.1383497, 48.1382398, 48.1381465, 48.1373455, 
    48.136753, 48.1366158, 48.1364348, 48.1363743, 48.1363742, 
    48.1364344, 48.1364452, 48.1364176, 48.1365106, 48.1365599, 
    48.1365707, 48.1364992, 48.136329, 48.1363179, 48.136345, 
    48.136394, 48.1363499, 48.1361523, 48.1360425, 48.1360313, 
    48.1360915, 48.1360859, 48.1356192, 48.135471, 48.1353502, 
    48.1352895, 48.13524, 48.1350425, 48.1348502, 48.1346634, 
    48.134625, 48.1345505861868, 48.1345186909387, 48.1345296909464, 
    48.1345790909661, 48.1345738910051, 48.1345520910206, 48.1345082910207, 
    48.1344534910171, 48.1344515076443, 48.1344447, 48.1343514, 
    48.1341979, 48.1340717, 48.133885, 48.1337971, 48.133797, 
    48.133775, 48.1337385445401, 48.1336467574818, 48.1336446100248, 
    48.133638, 48.1335503, 48.1334571, 48.133435, 48.1334733, 
    48.1334511, 48.1334071, 48.133248, 48.1331711, 48.1331545, 
    48.1331489, 48.1332037, 48.1332639, 48.1332670949215, 48.1332726906022, 
    48.1333714906175, 48.1334482906337, 48.1336183573558, 48.1336842907071, 
    48.1337764948373, 48.1338017, 48.1338181, 48.1335654, 48.1333513, 
    48.1332029, 48.133084, 48.132876, 48.1325253, 48.1324486, 
    48.1323774, 48.132344198709, 48.1323257569473, 48.1323367569567, 
    48.1325010903379, 48.132506490347, 48.1324459570171, 48.1324382437088, 
    48.1324372, 48.132355, 48.1322947, 48.1322344, 48.131977, 
    48.1318126, 48.1316811, 48.1315625193484, 48.131486890167, 
    48.1314373568364, 48.1314536902078, 48.1314096902084, 48.1314036379524, 
    48.1314009, 48.1313296, 48.131061, 48.130891, 48.1308143, 
    48.1303762, 48.1300639, 48.1297464, 48.1295767, 48.1295713, 
    48.1295824, 48.1295825, 48.1295443, 48.1295608, 48.1296047, 
    48.1296096065963, 48.1296134896613, 48.1296902896709, 48.1297669563548, 
    48.1298929563901, 48.1299477564027, 48.1300004562548, 48.1300596, 
    48.1300871, 48.1300872, 48.1300105, 48.130027, 48.1300352336394, 
    48.1300357563723, 48.1300983952617, 48.1301038, 48.1300329, 
    48.1298524, 48.1297539, 48.1296498, 48.1293923, 48.1290908, 
    48.1290306, 48.1289977, 48.1289484, 48.1287731, 48.1286636, 
    48.1286308, 48.1286417, 48.1286637, 48.1286583, 48.1285651, 
    48.1285048, 48.12845, 48.1283294, 48.1282636, 48.1283023, 
    48.1282861, 48.1282314, 48.1279905, 48.1278482, 48.1276839, 
    48.1275743, 48.1274319, 48.127295, 48.1271526, 48.1269498, 
    48.1264075, 48.1260075, 48.1256021, 48.1254651, 48.1252185, 
    48.1248787, 48.1246194, 48.1243455, 48.1240769, 48.1239126, 
    48.1237428, 48.1236169, 48.1234965, 48.1234418, 48.1233982, 
    48.1233107, 48.1232176, 48.1230642, 48.122982, 48.1229109, 
    48.1227355, 48.1222151, 48.1217439, 48.1215357, 48.121344, 
    48.1212235, 48.1211522, 48.1210206, 48.1208945, 48.1204616, 
    48.1203684, 48.120352, 48.1203739, 48.1206099, 48.1207142, 
    48.1207472, 48.1207419, 48.1206762, 48.1206762, 48.1208354, 
    48.1209177, 48.1211151, 48.1211186906885, 48.1211238863262, 
    48.1212994863449, 48.1214036863592, 48.1215680863881, 48.1216886864171, 
    48.1217543531057, 48.1218366864706, 48.1218968865024, 48.1219022865127, 
    48.121885753218, 48.1219623532756, 48.1220334866552, 48.1221430866938, 
    48.1222197533806, 48.1223129533968, 48.12236775341, 48.1223896867559, 
    48.1223951534328, 48.1224664867866, 48.1226089534819, 48.1226472868295, 
    48.1226307535298, 48.1227347535743, 48.1228333536003, 48.1229594869763, 
    48.1230908870286, 48.1231511537237, 48.1231675537495, 48.1232112871102, 
    48.1232934871394, 48.1234304871785, 48.1235729538923, 48.1237864873212, 
    48.1239014873651, 48.1239562873799, 48.1240221540602, 48.1240407299184, 
    48.1240463, 48.1240683, 48.1240744483288, 48.1240770873753, 
    48.1241264873834, 48.1241647540603, 48.1242688874293, 48.1243454874589, 
    48.1244112874786, 48.12447695417, 48.1246356875914, 48.1247179542795, 
    48.1248439543199, 48.124889754336, 48.124977354371, 48.1250156877321, 
    48.1250593544188, 48.1251251544357, 48.1252621544636, 48.1252951544738, 
    48.1253059544904, 48.1253388878378, 48.1253936878504, 48.1254758878617, 
    48.1255361545418, 48.1256238879023, 48.1257059546055, 48.125809888007, 
    48.1258920880357, 48.1262314881688, 48.126505354936, 48.1267188883431, 
    48.1269215550675, 48.1272392885052, 48.1278145553285, 48.1279240886977, 
    48.1283623554938, 48.128718355604, 48.128849888974, 48.1292881557437, 
    48.1293978891062, 48.1294470891281, 48.1294963558027, 48.1295456891519, 
    48.1296825558777, 48.129874089289, 48.1301150893699, 48.1305038894914, 
    48.1308050895878, 48.1310132896463, 48.1314077564134, 48.1315555564612, 
    48.1316321564841, 48.1318731565627, 48.1320537566409, 48.1322616900606, 
    48.1323929567869, 48.1325955568507, 48.1328420902505, 48.1330064902879, 
    48.1331269569834, 48.1332748903641, 48.1334882904552, 48.1335866904906, 
    48.1336633571813, 48.1338441572275, 48.1340029572735, 48.1342483573625, 
    48.1344570907605, 48.1348469575639, 48.1350940909671, 48.1352586910049, 
    48.1353684910459, 48.1355001577503, 48.1356921577862, 48.1360596911832, 
    48.1362571578961, 48.1365152913132, 48.136712958048, 48.1369488914408, 
    48.1370532914692, 48.1371740915239, 48.1372454915483, 48.137311358228, 
    48.1373770915727, 48.137489258111, 48.1375329, 48.1375492, 
    48.1374778, 48.1372911, 48.1371921, 48.1371811, 48.1371369, 
    48.1369502, 48.1367415, 48.1362966, 48.1359507, 48.1355995, 
    48.1353581, 48.135036, 48.1348829, 48.1344941, 48.1344011, 
    48.1343135, 48.1341496, 48.1339801, 48.1338268, 48.1335038, 
    48.1331588, 48.1329124, 48.1327262, 48.1326988, 48.1325839, 
    48.1324634, 48.1323211, 48.1322883, 48.132283, 48.1322009, 
    48.1321902, 48.1321082, 48.13207, 48.1319604, 48.1317579, 
    48.1315224, 48.1312595, 48.131139, 48.1310021, 48.1307665, 
    48.1307117, 48.1306021, 48.1303883, 48.130213, 48.1301363, 
    48.1300377, 48.1297968, 48.129501, 48.1294462, 48.1294298, 
    48.129419, 48.1295234, 48.1295344, 48.129529, 48.1294634, 
    48.1291513, 48.1290364, 48.128883, 48.1288502, 48.1288612, 
    48.1289051, 48.128912081687, 48.1289138883526, 48.1289631550244, 
    48.1292317550844, 48.1293249551034, 48.1293492661914, 48.1293602, 
    48.1294041, 48.1294110965886, 48.1294128884214, 48.1294456884249, 
    48.1295773551131, 48.1297252884775, 48.1298020884886, 48.1298825303855, 
    48.1299799, 48.1299909, 48.130128, 48.1301555, 48.1301282, 
    48.1300789, 48.1299036, 48.1296133, 48.1294599, 48.1293668, 
    48.1293449, 48.1293451, 48.1293836, 48.129444, 48.1295703, 
    48.129658, 48.129861, 48.1298617314981, 48.1298697547915, 
    48.1299848881401, 48.1301109548298, 48.1302424881925, 48.1303575548947, 
    48.1304836882611, 48.1310590883954, 48.1311851550929, 48.1314702884757, 
    48.1316400885154, 48.1317442885466, 48.1317606885573, 48.1318208885835, 
    48.1320234886614, 48.1322097553856, 48.1325657555054, 48.132932555672, 
    48.1331187557375, 48.1335241558618, 48.1339514893203, 48.1341815560646, 
    48.1342581560887, 48.1344389561371, 48.1346088895253, 48.134690956228, 
    48.1349699563651, 48.1350794897343, 48.1353150897948, 48.1354191564988, 
    48.1357149565895, 48.1361694900764, 48.1363282901207, 48.1366297568536, 
    48.1368598902423, 48.137095356993, 48.1372375570546, 48.1373469571157, 
    48.1374291571337, 48.1376209571703, 48.1376922905219, 48.1377360905363, 
    48.1378071572302, 48.1379823572998, 48.1381136906915, 48.1383326907672, 
    48.1384641574654, 48.1386449575011, 48.138743690857, 48.1388696908923, 
    48.1389298909157, 48.1390172909804, 48.1390609576711, 48.1391211576979, 
    48.1394278911178, 48.1394990911338, 48.139685491159, 48.1398279578604, 
    48.1400524912606, 48.1403316913585, 48.1405178914156, 48.1405890914305, 
    48.1406604914415, 48.1407754914557, 48.1408961581402, 48.1409784914882, 
    48.1410824915222, 48.1413508915895, 48.1416795583323, 48.1418919583931, 
    48.1421006917916, 48.1421885584951, 48.1424191585722, 48.142583758614, 
    48.1427594919967, 48.1428747586894, 48.1429569587019, 48.1430029986428, 
    48.1430029, 48.1428438, 48.1427504, 48.1427174, 48.1427338, 
    48.1427411978695, 48.1427425585989, 48.142830358611, 48.1429290919669, 
    48.143077292007, 48.1432145587161, 48.1435876921502, 48.143708558857, 
    48.1439500922634, 48.1441423589953, 48.1443893590713, 48.144427892429, 
    48.1448562925789, 48.1449275592632, 48.1449868227142, 48.145012, 
    48.1450126127646, 48.1449877592514, 48.1449382925655, 48.1448252283585, 
    48.1447371, 48.1444955, 48.1442372, 48.1438472, 48.1434408, 
    48.1430784, 48.1429539, 48.1429047, 48.1428884, 48.1426748, 
    48.1426529, 48.1426531, 48.1426368, 48.1425327, 48.1421767, 
    48.1420343, 48.1418536, 48.1415525, 48.1411911, 48.1408352, 
    48.1406708, 48.1403696, 48.1400958, 48.1397452, 48.1395536, 
    48.1394605, 48.1393511, 48.1392361, 48.1391815, 48.1391651, 
    48.1391379, 48.1388424, 48.1387494, 48.1386946, 48.1385577, 
    48.1382893, 48.1380865, 48.1378948, 48.1376812, 48.1375663, 
    48.1373419, 48.1372927, 48.1373037, 48.1372982, 48.1372763, 
    48.137227, 48.1371119, 48.1369805, 48.1365751, 48.1362137, 
    48.1360603, 48.1357316, 48.1354522, 48.1346412, 48.1341918, 
    48.1339618, 48.1336768, 48.1333534, 48.133041, 48.1327177, 
    48.132619, 48.1323834, 48.1318083, 48.1315069, 48.1310959, 
    48.1307121, 48.1305259, 48.1302847, 48.129879, 48.1298406, 
    48.1297749, 48.1295557, 48.1294241, 48.1291391, 48.1290568, 
    48.1288375, 48.1286895, 48.1285854, 48.1283881, 48.1282895, 
    48.1281964, 48.1280483, 48.1280000363797, 48.1279802872773, 
    48.1279857539514, 48.128106353995, 48.1283747541144, 48.1283635541554, 
    48.1282866875079, 48.1282427541791, 48.128237287528, 48.1282974875632, 
    48.1282864875818, 48.1282260875875, 48.1281217542505, 48.1279353542348, 
    48.1279352349385, 48.1279266, 48.1278827, 48.1277237, 48.1275811, 
    48.1274496, 48.1272742, 48.1270441, 48.1269619, 48.1268577, 
    48.1267426, 48.126666, 48.1266222, 48.1265563, 48.1264893218233, 
    48.1263951538804, 48.126285353881, 48.1261427538747, 48.1260933538769, 
    48.1260878872213, 48.1261096872349, 48.1262356872865, 48.1263945540064, 
    48.1266301540972, 48.1267177541418, 48.126766954171, 48.1267997542125, 
    48.1268215542239, 48.1269531542584, 48.126975087607, 48.1270133542863, 
    48.1274243543951, 48.1275778877743, 48.1278023545213, 48.1278516878838, 
    48.1278625545699, 48.1278241545702, 48.1278185989449, 48.1278154, 
    48.127766, 48.1277003, 48.1275633, 48.1274318, 48.1272784, 
    48.1272072, 48.1271414, 48.1270871580705, 48.1270185543626, 
    48.1270175113974, 48.1270098, 48.1269714, 48.1269385, 48.126774, 
    48.1264123, 48.1263137, 48.1261055, 48.1260343, 48.1259631, 
    48.1255574, 48.1254533, 48.1254235723753, 48.1254289540121, 
    48.1254836873664, 48.1257412874328, 48.1259550874976, 48.1261577542214, 
    48.1263056876099, 48.1263000876186, 48.1262178876118, 48.1262176572635, 
    48.1262091, 48.1261269, 48.1260172, 48.1259679, 48.1259351, 
    48.1257762, 48.1256337, 48.1255022, 48.1253433, 48.1251076, 
    48.1250473, 48.1249610618815, 48.1249190872807, 48.1249025539568, 
    48.124907953966, 48.1250612873602, 48.1251982874089, 48.1254612874877, 
    48.1256749542158, 48.1260749543489, 48.1263213544389, 48.126447354481, 
    48.1264801544956, 48.1264636878351, 48.1264033544973, 48.1264024644404, 
    48.1263946, 48.1263508, 48.1260439, 48.1259343, 48.1257368, 
    48.1255833, 48.1254352, 48.125353, 48.1252215, 48.1250515, 
    48.1248761, 48.1245782, 48.124496, 48.1243261, 48.1242548, 
    48.1242219, 48.1241946, 48.1242224, 48.1242059, 48.1241567, 
    48.1240417, 48.1238226, 48.1235595, 48.1231924, 48.1230499, 
    48.1229677, 48.1229567, 48.1229679, 48.1229351, 48.1228584, 
    48.1227598, 48.1226393, 48.1222229, 48.1222285, 48.1222231, 
    48.1220861, 48.1220697, 48.1220917, 48.1221356, 48.1222891, 
    48.1223275, 48.1223441, 48.1223331, 48.1222619, 48.1220592, 
    48.1219002, 48.1218618, 48.1219003, 48.1218839, 48.1217853, 
    48.1215826, 48.1213242, 48.1211584282462, 48.1211404601882, 
    48.1208057, 48.1208331, 48.1208714, 48.1208835, 48.121011, 
    48.1210691, 48.1210655, 48.1210383, 48.1209552, 48.1209528, 
    48.1208759, 48.1207992, 48.1207641090859, 48.1206599519583, 
    48.1206489519529, 48.1206566869599, 48.1206402, 48.12066230687, 
    48.1206380852623, 48.1205722852527, 48.1204680852417, 48.1203035519036, 
    48.1202963771109, 48.1203089, 48.1202703, 48.1202248, 48.1202019654635, 
    48.1202046853224, 48.120188285342, 48.120100485363, 48.1201003520543, 
    48.1202921521654, 48.1203085522186, 48.1202591522409, 48.120099952265, 
    48.1200232856011, 48.119908085597, 48.1198994027165, 48.1198993, 
    48.1197048821543, 48.1195900855727, 48.119518752239, 48.1194967522472, 
    48.1194857522855, 48.1193978856235, 48.1194143523064, 48.1194472856561, 
    48.1195951523813, 48.1196169524319, 48.1196497524701, 48.1196387524825, 
    48.1195948858221, 48.1194907524817, 48.1194875721997, 48.119482, 
    48.1192955, 48.1190542, 48.1189062, 48.1188021, 48.1186869, 
    48.1183087, 48.1181717, 48.1180511, 48.1178976, 48.1177442, 
    48.1176894, 48.1176401, 48.1176401, 48.1176895, 48.1177829, 
    48.1179035, 48.1179694, 48.11809, 48.1182326, 48.1182407861856, 
    48.1182413519227, 48.1184688188868, 48.1185397, 48.1185946, 
    48.1186055, 48.1185617, 48.1184082, 48.1182329, 48.1180684, 
    48.1179368, 48.1178546, 48.117712, 48.1176133, 48.1174927, 
    48.117405, 48.1171638, 48.1169938, 48.116939, 48.1168896, 
    48.1168842, 48.1168459100114, 48.116777884673, 48.116777884685, 
    48.1167127, 48.1168044, 48.1169785, 48.117052, 48.1170652, 
    48.1171638, 48.1172411, 48.1173003, 48.117309076889, 48.1172331512366, 
    48.1171180845333, 48.1169206844854, 48.116591684413, 48.1165203510559, 
    48.1164557037985, 48.1164239, 48.1163918, 48.1164961, 48.1166476, 
    48.1166666229034, 48.1165917509665, 48.1166027509585, 48.1166070315534, 
    48.116594, 48.1166512, 48.1167709699366, 48.116720840296, 
    48.1167091, 48.1166269, 48.1165885, 48.1165238, 48.1165124, 
    48.1162211, 48.1162070136503, 48.115944750713, 48.1158350840301, 
    48.1157363506843, 48.1155335506625, 48.115171683947, 48.1151058839424, 
    48.1150793728353, 48.1150951, 48.1151322, 48.1152317, 48.1153132, 
    48.1154405, 48.1155481, 48.1161875, 48.116182, 48.1161294, 
    48.1160986558131, 48.1160817509584, 48.1158788842911, 48.1157856842929, 
    48.1156978842847, 48.1155827509366, 48.1154237509107, 48.1152372842104, 
    48.1150837508453, 48.1145793507202, 48.1142833506401, 48.1137185505078, 
    48.1135539504734, 48.1132469504175, 48.113142750397, 48.1130906238726, 
    48.1130352, 48.1129914, 48.1128544, 48.1127612, 48.1127173, 
    48.1124925, 48.1124840231695, 48.1123038835266, 48.1121503501664, 
    48.1119913501456, 48.1118377501289, 48.1116732834507, 48.1115362834453, 
    48.1114978834456, 48.1114813501206, 48.1115087501389, 48.1115909501699, 
    48.1117335502154, 48.1118542835911, 48.1119090836245, 48.1119418836542, 
    48.1119418836963, 48.1119966837553, 48.1120350837881, 48.1122488838871, 
    48.1122433505631, 48.1122104839126, 48.1122104839244, 48.1122652839554, 
    48.1122652839672, 48.1122377506419, 48.1121774839837, 48.1120951506519, 
    48.1119416839847, 48.1118648839876, 48.1118319506609, 48.1117990840121, 
    48.111760550688, 48.1116674840208, 48.1113383506741, 48.1110860840017, 
    48.111053150675, 48.1110586840427, 48.1110256840864, 48.1110420841166, 
    48.1110365508072, 48.1109432841719, 48.110954150868, 48.1110363509309, 
    48.1110527509612, 48.1110361509925, 48.1109977510012, 48.110904551004, 
    48.1108985702834, 48.1108958, 48.1107367, 48.1105668, 48.1104023, 
    48.1102707, 48.110194, 48.1101282, 48.1100845, 48.1098982, 
    48.1098543, 48.1097393, 48.1096735, 48.1094214, 48.1092624, 
    48.1090596, 48.1089225, 48.108654, 48.1086156, 48.1085772, 
    48.1085772, 48.1086924, 48.1087088, 48.1087198, 48.1088515, 
    48.1089611, 48.1090215, 48.1090218664535, 48.1090302833874, 
    48.1091124833987, 48.1091836834153, 48.1093481501304, 48.1094249501489, 
    48.109523683502, 48.1096387501963, 48.1097265502236, 48.1097977502457, 
    48.1099732836217, 48.1100554836365, 48.1101816836567, 48.1102967503381, 
    48.110410802978, 48.1105074, 48.1105676, 48.1105951, 48.110617, 
    48.1105129, 48.1104362, 48.1103814, 48.1103297906316, 48.1100556834112, 
    48.1100611500731, 48.110074019244, 48.1100682, 48.1100951, 
    48.1101328, 48.11025, 48.1103225264078, 48.1103298834183, 
    48.1103188834056, 48.1102640833834, 48.1100995500061, 48.1099954832987, 
    48.1098637499001, 48.1098034832129, 48.1095183497965, 48.1093593497465, 
    48.1092222830413, 48.1091400830232, 48.1090577496768, 48.1089755496672, 
    48.108948149669, 48.1089425496822, 48.1089097496811, 48.1087287496494, 
    48.1086794829708, 48.1085807496104, 48.1084546829152, 48.1082517495443, 
    48.1080543495132, 48.1079172828293, 48.1078788828296, 48.1077746828258, 
    48.107725282819, 48.1076650828079, 48.1076320827994, 48.1075927808007, 
    48.1075862, 48.1075466, 48.1075521, 48.1076179, 48.1076288, 
    48.107596, 48.1075192, 48.107426, 48.1072066, 48.1068283, 
    48.1066856, 48.106587, 48.1064554, 48.1063074, 48.1061977, 
    48.1061278178941, 48.1060638823594, 48.1059870823617, 48.106003549043, 
    48.1060638824042, 48.1061460824262, 48.1061516824365, 48.1061187491093, 
    48.1059761490974, 48.1059758623278, 48.1059674, 48.1058797, 
    48.1056932, 48.1056658, 48.1055233, 48.1053532, 48.1050736, 
    48.1048707, 48.1043005, 48.1037905, 48.103615, 48.1034066, 
    48.1029515, 48.1025951, 48.1022222, 48.1018054, 48.1015532, 
    48.1012077, 48.1009116, 48.1007635, 48.1006046, 48.1004806615424, 
    48.1003117479772, 48.1003087543247, 48.100303, 48.1002043, 
    48.0999466, 48.0997985, 48.0991788, 48.0989102, 48.0985702, 
    48.0984551, 48.0981479, 48.0972486, 48.0966179, 48.0961736, 
    48.0958665, 48.0956417, 48.095351, 48.0950878, 48.0946655, 
    48.0942871, 48.093481, 48.0931959, 48.0929381, 48.0927955, 
    48.092483, 48.0922087, 48.0918851, 48.0916, 48.0913258, 48.0910955, 
    48.0907885, 48.0903497, 48.0899055, 48.0895491, 48.089385014093, 
    48.0893440790442, 48.0893221457179, 48.0893221457302, 48.0892782790625, 
    48.0892720541369, 48.0892695, 48.0892093, 48.0889021, 48.088776, 
    48.088107, 48.0878272, 48.0875859, 48.0874159, 48.0871198, 
    48.0869113, 48.0868291, 48.0866921, 48.0865824, 48.0864562, 
    48.0864288, 48.0863904, 48.0864013, 48.0864506, 48.0864506, 
    48.0864067, 48.0863048817679, 48.0862565450914, 48.0862486983041, 
    48.0862478, 48.0859681, 48.0858365, 48.0857324, 48.0856446, 
    48.0855569, 48.0853539, 48.0852277, 48.0846628, 48.0845695, 
    48.0845586, 48.0846079, 48.084712, 48.0847777, 48.0847777, 
    48.0847612, 48.0847064, 48.0845638, 48.08435, 48.0842842, 
    48.0840867, 48.0839002, 48.0838564, 48.0837906, 48.0836807, 
    48.0835655, 48.0833078, 48.0832201, 48.0831214, 48.0830117, 
    48.0830117, 48.0830391, 48.0831322, 48.0831322, 48.0831212, 
    48.0830773, 48.0827757, 48.082688, 48.0826277, 48.0825837, 
    48.0826166, 48.0826235031896, 48.0826253441986, 48.0827570775489, 
    48.0829653442483, 48.0831409442809, 48.0832395443035, 48.0832561443164, 
    48.0832068776704, 48.0832287443479, 48.0833219443669, 48.083415277716, 
    48.0836400777498, 48.0838155444497, 48.0838868777996, 48.0839087444749, 
    48.0839417444957, 48.0839801445122, 48.0841173445451, 48.0842763445738, 
    48.0843586779229, 48.0845122779677, 48.0846163446532, 48.0847699446727, 
    48.0848960780235, 48.0850056780436, 48.0850386780572, 48.0850386780661, 
    48.0848907447656, 48.084885344776, 48.0848908781214, 48.0849676781471, 
    48.0853735449017, 48.0855983449602, 48.0856258782995, 48.0856951428176, 
    48.0857212, 48.0857431, 48.085743, 48.0858308, 48.0858472, 
    48.0858308, 48.0856718, 48.0856389, 48.0856388, 48.0856881, 
    48.0856909178572, 48.0856968782337, 48.0857846782481, 48.0859655449509, 
    48.0859690858989, 48.086238, 48.0862615950562, 48.0863657449827, 
    48.0864572208287, 48.0865066, 48.0867095, 48.086726, 48.0868028, 
    48.0868959, 48.0871483, 48.08745, 48.0874828, 48.0875173896512, 
    48.0875283451801, 48.087605145188, 48.0876084076597, 48.0876692, 
    48.087746, 48.0878666, 48.0880915, 48.0884589, 48.088777, 
    48.0890348, 48.0891773, 48.0893637, 48.0896708, 48.0899779, 
    48.0905592, 48.0909211, 48.0914146, 48.0915628, 48.0917312782425, 
    48.091750945954, 48.091855279304, 48.0919374793137, 48.0920251459891, 
    48.0920854793313, 48.0922171460263, 48.0922883460378, 48.0923968018043, 
    48.092477, 48.092603, 48.092751, 48.0927729, 48.0928442, 
    48.092852476473, 48.0928529460491, 48.0930010793956, 48.0932806794257, 
    48.0934615461174, 48.0935822794708, 48.0937796795131, 48.0939222795446, 
    48.0940922795703, 48.0941580795832, 48.094284146278, 48.0942897462939, 
    48.0942239462949, 48.0941800796323, 48.0941856796454, 48.0942733463499, 
    48.0946299464624, 48.0947067464803, 48.0949315465197, 48.0950248798743, 
    48.0950632798903, 48.0953265466493, 48.0955733467114, 48.0960943468253, 
    48.0962917468632, 48.0966920802697, 48.0969059469799, 48.0971417470321, 
    48.0981618806003, 48.0985840807006, 48.099192747504, 48.0993737475419, 
    48.0996315475914, 48.0998947476519, 48.1002676810608, 48.1006843478057, 
    48.1007830811537, 48.100996947846, 48.1010627478551, 48.1012875478973, 
    48.1014520812545, 48.1015754980155, 48.1016845, 48.101688129519, 
    48.1016932812783, 48.1017371479499, 48.1018303479633, 48.1020825480183, 
    48.102241681382, 48.1024195589915, 48.1026386, 48.1026443602014, 
    48.1026473480861, 48.1027735480985, 48.1028612814468, 48.1029983481452, 
    48.1034260816138, 48.1041938818307, 48.1044571485639, 48.104758681968, 
    48.1049671486814, 48.1052192820624, 48.1055648821359, 48.1056420339549, 
    48.1056876, 48.1056547, 48.1056492, 48.1056767, 48.1056804328149, 
    48.1056854821268, 48.1057731488067, 48.105943148839, 48.1060253488504, 
    48.1061844822041, 48.1062666822171, 48.1063708822421, 48.1065408822908, 
    48.1068040823529, 48.1069520823968, 48.1071220824416, 48.1072920824774, 
    48.1073743491576, 48.1074153549785, 48.1074862, 48.1075356, 
    48.1075379733302, 48.1075443491581, 48.1076210825009, 48.1076978825138, 
    48.1078020825349, 48.1080049492621, 48.1081529492987, 48.1082571493209, 
    48.1083558826735, 48.1084984827044, 48.1089644828152, 48.1090961495056, 
    48.1091784828509, 48.1092911242919, 48.1094273, 48.1094284872824, 
    48.1094360828741, 48.1095841495624, 48.1099350829761, 48.1100227496593, 
    48.1101434830115, 48.1102531496967, 48.1104943497536, 48.1105546830963, 
    48.1106588831101, 48.1107739497972, 48.1111414832193, 48.1112565499103, 
    48.1113442832557, 48.1114125850361, 48.1114891, 48.1115494, 
    48.1115604, 48.1115548, 48.1114891, 48.1113629, 48.1111984, 
    48.1108968, 48.1107926, 48.1107926, 48.1108639, 48.1108684473927, 
    48.1108726829452, 48.1110535496407, 48.1111687496667, 48.111305883038, 
    48.1114922830923, 48.1117445498358, 48.1123093500209, 48.1125177500703, 
    48.112610883444, 48.1126986834706, 48.1128521501742, 48.1129344835222, 
    48.1129811116887, 48.1130244, 48.1130408, 48.1131121, 48.1131834, 
    48.1131889, 48.1131834, 48.1130628, 48.1127996, 48.1125967, 
    48.1124048, 48.1121854, 48.1121744, 48.1121744, 48.1122348, 
    48.1123389, 48.1123471762827, 48.1123476831919, 48.1125089338583, 
    48.1125692, 48.1125801, 48.1125363, 48.1124321, 48.1124266, 
    48.1124595, 48.1124595, 48.1124376, 48.1123224, 48.1121743, 
    48.1120372, 48.1118398, 48.1117082, 48.1115437, 48.1112365, 
    48.1111214, 48.110902, 48.1105346, 48.1103207, 48.1099313, 
    48.109509, 48.1091306, 48.1088948, 48.1082366, 48.1078746, 
    48.1075674, 48.1074084, 48.1071067, 48.1065582, 48.1061796, 
    48.1057957, 48.1055269, 48.1048741, 48.1046053, 48.104172, 
    48.1040623, 48.1038757, 48.1034204, 48.1030584, 48.1028553, 
    48.1027785, 48.1026577, 48.1026028, 48.1024931, 48.1023559, 
    48.1020432, 48.1016208, 48.1013299, 48.1010885, 48.1009567, 
    48.1009182, 48.1009016, 48.1008466, 48.1007369, 48.1006052, 
    48.100298, 48.0999687, 48.0998151, 48.0996778, 48.0994251, 
    48.0992714, 48.0991176, 48.0988432, 48.098728, 48.0986237, 
    48.0985524, 48.0981026, 48.097702, 48.0974826, 48.0973453, 
    48.0973124, 48.0973068, 48.0972628, 48.097153, 48.096917, 
    48.0968236, 48.0968071, 48.0967796, 48.096582, 48.0960112, 
    48.0958685, 48.0956435, 48.0955776, 48.09555, 48.0953578, 
    48.0953413, 48.0952698, 48.0951601, 48.0949296, 48.0948527, 
    48.0947537, 48.0947482, 48.0948576, 48.094841, 48.094764, 
    48.0945719, 48.0943577, 48.0941985, 48.094012, 48.093732, 
    48.0936716, 48.0936605, 48.0936603, 48.0936218, 48.0934022, 
    48.0931113, 48.0929027, 48.0927929, 48.092579, 48.0924857, 
    48.0924691, 48.0924691, 48.0924087, 48.0921837, 48.0921508, 
    48.0921287, 48.0920628, 48.091909, 48.0918596, 48.0916238, 
    48.0914812, 48.0914373, 48.0914153, 48.0913987, 48.0913163, 
    48.0911352, 48.0910034, 48.0905916, 48.0904983, 48.0904708, 
    48.0904818, 48.0904904868087, 48.0904905427471, 48.0905914778343, 
    48.0906078, 48.0905967, 48.0905583, 48.0904504, 48.0902862, 
    48.0901439, 48.0900399, 48.0900291, 48.0900127, 48.0896402, 
    48.0894924, 48.0892897, 48.0892022, 48.0891255, 48.0886545, 
    48.0881507, 48.0876578, 48.0874662, 48.0871102, 48.0869405, 
    48.086694, 48.0864529, 48.0864257, 48.0861298, 48.085938, 
    48.0856805, 48.0856149, 48.0856534, 48.0855821, 48.0854342, 
    48.0852097, 48.0851166, 48.0850513256295, 48.084999140974, 
    48.0849716743165, 48.0850099410159, 48.0850645410498, 48.085267274451, 
    48.0853547411594, 48.0853053411683, 48.0851352744994, 48.0851295759517, 
    48.0851265, 48.08494, 48.0847974, 48.0844193, 48.0841342, 
    48.0839424, 48.0838056, 48.083784, 48.0837456, 48.083658, 
    48.0835867, 48.08351, 48.0834497, 48.0833513, 48.083198, 
    48.0828309, 48.082546, 48.0822117, 48.0818992, 48.0816579, 
    48.0814442, 48.0811208, 48.080918, 48.080792, 48.0807264, 
    48.0806388, 48.080321, 48.0800252, 48.0796963, 48.0793895, 
    48.0792469, 48.0788538504448, 48.078685339597, 48.0785427395897, 
    48.0785398821278, 48.078534, 48.0784133, 48.0783601575847, 
    48.0782357395383, 48.0781315395239, 48.0780711395218, 48.0780326728677, 
    48.0780326728812, 48.0781860729265, 48.0783613396521, 48.0784707397048, 
    48.0785034730852, 48.0784869397592, 48.0784320730928, 48.0782784730861, 
    48.0782747564393, 48.0782697, 48.0780723, 48.0778968, 48.0775516, 
    48.0772118, 48.0770364, 48.0769432, 48.0769161, 48.0767681, 
    48.0765269, 48.0764557, 48.0763811909127, 48.0763383393172, 
    48.0763492726678, 48.0764259393568, 48.0765957393965, 48.0766121394095, 
    48.0765737394081, 48.0765675141405, 48.076565, 48.0764992, 
    48.0763621, 48.0760825, 48.0756988, 48.0755508, 48.0753425, 
    48.0752165, 48.0750304, 48.0749044, 48.0748825, 48.0748387, 
    48.0747291, 48.0745867, 48.0744936, 48.0744293064941, 48.0743925388787, 
    48.0744035388976, 48.0745074722806, 48.0746169389949, 48.0746114723499, 
    48.0745893390208, 48.0745180723504, 48.0745121439207, 48.0745093, 
    48.0744051, 48.0742681, 48.0740598, 48.074005, 48.074005, 
    48.0740216, 48.0740272, 48.073967, 48.0738464, 48.0733696, 
    48.0731284, 48.0730196960502, 48.0729068719581, 48.072884938633, 
    48.0729396719952, 48.0730820720445, 48.0732901387786, 48.0733996721607, 
    48.0733722721715, 48.0733227388408, 48.0730047388138, 48.0728128721206, 
    48.0726812720974, 48.072144814801, 48.0720586, 48.0719106, 
    48.0717869, 48.0718287, 48.071763, 48.0717207341945, 48.0717169384711, 
    48.0715635384426, 48.0714922717667, 48.0713824717605, 48.0713111384324, 
    48.0713438717966, 48.0714807385461, 48.0714367385501, 48.0713270718745, 
    48.0713257085851, 48.0713183, 48.071166945093, 48.0709705385099, 
    48.0709689196494, 48.0709618, 48.0707425, 48.0704847, 48.0703093, 
    48.0701832, 48.0699476, 48.0697613, 48.0696847, 48.0696683, 
    48.0697342, 48.0698056, 48.0697837, 48.0694495, 48.068929, 
    48.068666, 48.0684687, 48.0682385, 48.0680685, 48.0678327, 
    48.0675367, 48.0672024, 48.0669503, 48.0667036, 48.0664845, 
    48.0662652, 48.066068, 48.0658817, 48.0657776, 48.065531, 
    48.0652843, 48.0650596, 48.0648076, 48.0647145, 48.0645776, 
    48.0643913, 48.0641556, 48.063898, 48.0636515, 48.063498, 
    48.0632568, 48.0628731, 48.0626649, 48.0624786, 48.0623362, 
    48.0621718, 48.0620569, 48.0619418, 48.0618596, 48.0613991, 
    48.0611305, 48.061021, 48.0608292, 48.0606154, 48.0603906, 
    48.0601988, 48.0600672, 48.0598096, 48.0597274, 48.0595464, 
    48.0592614, 48.0591353, 48.0589435, 48.0587187, 48.0586091, 
    48.0585434, 48.0584885, 48.058346, 48.0581596, 48.0580719, 
    48.0579952, 48.058039, 48.0580884, 48.058094, 48.0580556, 
    48.0579624, 48.0577705, 48.0577428725312, 48.0575598676978, 
    48.0573654112455, 48.0573209, 48.0570962, 48.0568659, 48.056493, 
    48.0562683, 48.0560489, 48.0558131, 48.0555171, 48.0554513, 
    48.0554568, 48.0554952, 48.0555664, 48.0556432, 48.0556463184099, 
    48.0556519337142, 48.0557330513973, 48.0557803, 48.0557638, 
    48.0554787, 48.0554074, 48.0554403, 48.0555061, 48.055539, 
    48.0555939, 48.0555979789669, 48.0556026668517, 48.0562495335864, 
    48.0563428669304, 48.0564414669435, 48.0565292669595, 48.0566115336493, 
    48.0567705337027, 48.0568692670614, 48.0571488671129, 48.058070067327, 
    48.0581744572845, 48.0582039, 48.0582093, 48.0581655, 48.058171, 
    48.0582532, 48.0582697, 48.0582313, 48.0580229, 48.0579461, 
    48.0579407, 48.0579681, 48.058171, 48.0582038, 48.0581106, 
    48.0580394, 48.0578912, 48.0575239, 48.0573484, 48.0571401, 
    48.0569098, 48.0566904, 48.0566026, 48.056164, 48.055972, 
    48.0559062, 48.0559392, 48.0559556, 48.0559281, 48.05578, 
    48.0554071, 48.0549903, 48.0548532, 48.0546064, 48.0543541, 
    48.0541621, 48.0540031, 48.0538058, 48.0535864, 48.0530599, 
    48.0529667, 48.0528198832427, 48.0526794657231, 48.0526465324054, 
    48.0526520657619, 48.0527234658049, 48.0527509325079, 48.0527125325256, 
    48.0525754658529, 48.0523232658304, 48.0519942657956, 48.0517091324274, 
    48.0514679323941, 48.0512454026976, 48.0512234, 48.051163, 
    48.0509217, 48.0507024, 48.0504391, 48.0501374, 48.0500332, 
    48.0498247, 48.0496273, 48.0491283, 48.0490351, 48.0489912, 
    48.0489527, 48.0488539, 48.0486729, 48.0484425, 48.0481462, 
    48.0479268, 48.047658, 48.0475866, 48.0475701, 48.0473945, 
    48.047175, 48.0470434, 48.0469829, 48.0469773, 48.0469278, 
    48.046659, 48.046626, 48.0465655, 48.0464995, 48.0463184, 
    48.0461538, 48.0461538, 48.0461922, 48.0462004124232, 48.0462009303666, 
    48.0462557303719, 48.0463708637256, 48.0464531304132, 48.0465133846384, 
    48.046554, 48.0465046, 48.0462413, 48.0461918, 48.0461206, 
    48.0460327, 48.0458463, 48.0456761, 48.0455116, 48.0454018, 
    48.0453358, 48.0453192, 48.0452588, 48.0451711, 48.0449681, 
    48.0448089, 48.0445508, 48.0444355, 48.0443367, 48.0441501, 
    48.0437495, 48.0432555, 48.0431074, 48.0428878, 48.0425531, 
    48.0423336, 48.0420482, 48.041708, 48.0414719, 48.0413566, 
    48.0414277, 48.0415318, 48.0415376518742, 48.0415405286111, 
    48.0417324619692, 48.0419133286625, 48.0421053287019, 48.0423138620881, 
    48.0424236621235, 48.0425773288445, 48.0428134622653, 48.0432360623966, 
    48.0436639291711, 48.0439382625686, 48.0442398626249, 48.0443167293095, 
    48.0443715293254, 48.0444265293481, 48.0445417293803, 48.0447173294354, 
    48.0451287295298, 48.0454964629811, 48.0456446630347, 48.0458750630895, 
    48.0461108631355, 48.0465002631971, 48.046740620124, 48.0469684, 
    48.047089, 48.0470887, 48.0469844, 48.0467484, 48.0464851, 
    48.0462985, 48.04609, 48.0459143, 48.0452666, 48.0450195, 
    48.0445968, 48.0444213, 48.0440863, 48.044004, 48.0437678, 
    48.0434768, 48.0432627, 48.0429444, 48.0426371, 48.0423791, 
    48.0421925, 48.042099, 48.0420824, 48.0421262, 48.0421755, 
    48.0422468, 48.0422550685862, 48.0422555281694, 48.0424528615193, 
    48.0426475522476, 48.0427237, 48.0427295631732, 48.0427324615456, 
    48.043033861572, 48.0431325282523, 48.0432367282689, 48.0433573282917, 
    48.0435385283397, 48.0440820618446, 48.0442959285666, 48.0444332619413, 
    48.0445648619774, 48.0447955287202, 48.0449218621007, 48.0452676622096, 
    48.0456297289789, 48.0458987290654, 48.0460909291318, 48.0462117291866, 
    48.0463654625714, 48.046980262769, 48.0471009294675, 48.0472270628221, 
    48.0473348562485, 48.0474705, 48.0474717625317, 48.0474792628457, 
    48.0476163295313, 48.0477698628898, 48.0483239296884, 48.0485928631038, 
    48.0486752631375, 48.048839863181, 48.0489276632178, 48.0490484632502, 
    48.0495259300815, 48.0497235301424, 48.0502722636306, 48.0505082637047, 
    48.0507221304211, 48.0509469304667, 48.0510622638338, 48.0513092639157, 
    48.0514738639737, 48.0516329306859, 48.0518908640801, 48.0521540641495, 
    48.0523681308777, 48.0529992644406, 48.0532900645307, 48.0536247312929, 
    48.0538496646993, 48.053981331396, 48.0541082215781, 48.0542138, 
    48.0542521, 48.0541862, 48.0540379, 48.0539281, 48.0538623, 
    48.0536482, 48.0533465, 48.0530393, 48.0527594, 48.052507, 
    48.0522162, 48.0520077, 48.0517443, 48.0514974, 48.0507623, 
    48.0506032, 48.0505208, 48.0504821, 48.0504107, 48.0503229, 
    48.0501089, 48.0499772, 48.0496972, 48.0494944, 48.0492146, 
    48.0489787, 48.0487262, 48.0485615, 48.0484461, 48.0473922, 
    48.0471727, 48.0467614, 48.0465804, 48.0464103, 48.0462457, 
    48.0461303, 48.0460425, 48.0459105, 48.045806, 48.045641, 
    48.0455694, 48.0454377, 48.045251, 48.0448667, 48.0447842, 
    48.0443122, 48.0440157, 48.0438235, 48.0436423, 48.0431317, 
    48.04272, 48.0424125, 48.0422586, 48.0421376, 48.0417564, 
    48.0415373, 48.0410444, 48.0405187, 48.0401189, 48.0398998, 
    48.0394781, 48.0390508, 48.0388152, 48.0386237, 48.0385307, 
    48.0382566, 48.0381471, 48.038087, 48.0379666, 48.0374082, 
    48.0370467, 48.0368605, 48.0358854, 48.0355402, 48.0350307, 
    48.0342581, 48.0332991, 48.03274, 48.032137, 48.0319287, 
    48.0317807, 48.0316246, 48.0313936, 48.0312823, 48.0312076, 
    48.0312234, 48.0313876, 48.0316389, 48.0318787, 48.0317497720609, 
    48.0317828581031, 48.0317334581025, 48.0316457247587, 48.031591468059, 
    48.0315873, 48.0315054, 48.031456, 48.031056, 48.0307655, 
    48.0307370612037, 48.0302358149101, 48.0302118, 48.02985, 
    48.02918, 48.0290495, 48.0286769, 48.0284523, 48.0281495, 
    48.0281785, 48.0275596, 48.0265078, 48.0258778, 48.025719, 
    48.0255054, 48.0254177, 48.0252696, 48.0249351, 48.0248475, 
    48.024694, 48.0245131, 48.0243487, 48.0242392, 48.0240859, 
    48.0240311, 48.0240424, 48.0239658, 48.0234783, 48.0234016, 
    48.0235168, 48.0235178098129, 48.0235255223302, 48.0238764557299, 
    48.0239559191805, 48.0239993, 48.0234788, 48.0234515, 48.0229145, 
    48.0225912, 48.0219883, 48.0216265, 48.0214293, 48.0210567, 
    48.0208758, 48.020569, 48.0204868, 48.0204431, 48.0205528, 
    48.020849, 48.0215618, 48.0215669654741, 48.0215705209122, 
    48.0216418542538, 48.0219927209711, 48.0220493085295, 48.0220883, 
    48.0220992, 48.0220883, 48.0219951, 48.0219677, 48.0219897, 
    48.0219842, 48.0218416, 48.0214853, 48.0210029, 48.0208165, 
    48.0206849, 48.0205917, 48.0203175, 48.0201147, 48.0199447, 
    48.0197857, 48.0196048, 48.0193141, 48.0191442, 48.0187768, 
    48.0181243, 48.0174224, 48.0170878, 48.0169124, 48.016874, 
    48.01683, 48.0168519, 48.0169287, 48.017, 48.0170164, 48.0167969, 
    48.0166433, 48.0164734, 48.0161718, 48.0157331, 48.0152451, 
    48.0146091, 48.0141046, 48.0136604, 48.0134794, 48.0134629, 
    48.0134848, 48.0134628, 48.0131886, 48.013172, 48.0131939, 
    48.0130074, 48.0129416, 48.0129525, 48.0129909, 48.0130676, 
    48.0130754673161, 48.0130763179284, 48.0131805179377, 48.0133944512983, 
    48.0134696184336, 48.0135008, 48.0134898, 48.0129412, 48.0125024, 
    48.0121841, 48.0116686, 48.011482, 48.0113283, 48.0110758, 
    48.0107959, 48.0103242, 48.0101539, 48.0096383, 48.0095066, 
    48.0090346, 48.0089247, 48.0086559, 48.0084144, 48.0080411, 
    48.0079258, 48.0076295, 48.0074208, 48.0070365, 48.0068389, 
    48.0065755, 48.0058288, 48.0053072, 48.0053124, 48.0049443, 
    48.0047573, 48.0046585, 48.0044391, 48.0042251, 48.0038738, 
    48.0034016, 48.0031599, 48.0026383, 48.0024736, 48.0015791, 
    48.0006956, 47.9999656, 47.9998841, 47.9993189, 47.99843, 
    47.9982513, 47.9981526, 47.9979554, 47.9979007, 47.9977693, 
    47.9976325, 47.9974684, 47.9972385, 47.9971783, 47.9971676, 
    47.9970912, 47.9971024, 47.9970041, 47.9966922, 47.996654, 
    47.9966486, 47.9966872, 47.9966654, 47.9965777, 47.9964298, 
    47.9961612, 47.9959914, 47.9950381, 47.9949286, 47.9948465, 
    47.9947864, 47.9947701, 47.9947649, 47.9947375, 47.9946664, 
    47.9945293, 47.9942006, 47.9938828, 47.9937513, 47.9936472, 
    47.9935375, 47.9934499, 47.9934225, 47.9934007, 47.9933624, 
    47.9929404, 47.9926171, 47.9924582, 47.992409, 47.9923379, 
    47.9922448, 47.9920913, 47.9917898, 47.9908691, 47.9907705, 
    47.990661, 47.9905679, 47.9904802, 47.9904037, 47.9902668, 
    47.9902398, 47.9901961, 47.9901472, 47.9901144, 47.9900323, 
    47.9899064, 47.9897804, 47.9897421, 47.9896708, 47.9896106, 
    47.9894902, 47.9893203, 47.9891724, 47.9890792, 47.9889861, 
    47.9887888, 47.9885312, 47.988323, 47.9880051, 47.9879064, 
    47.9878682, 47.9878682, 47.9878573, 47.9877641, 47.9873859, 
    47.9869418, 47.9868651, 47.9865965, 47.9864869, 47.9863499, 
    47.9861636, 47.9859773, 47.9856761, 47.9855884, 47.9855172, 
    47.9853747, 47.9851226, 47.985013, 47.9849527, 47.9849418, 
    47.9848925, 47.9848706, 47.9846513, 47.9843061, 47.9841636, 
    47.9840265, 47.9839004, 47.9837798, 47.9835881, 47.983473, 
    47.9831989, 47.9830015, 47.9826288, 47.982426, 47.9819765, 
    47.9817024, 47.9813351, 47.9812857, 47.9812529, 47.9812474, 
    47.9810884, 47.9808362, 47.9807047, 47.9806498, 47.9803154, 
    47.9801893, 47.9800906, 47.9798384, 47.9792518, 47.9791092, 
    47.9789063, 47.9788077, 47.9787089, 47.9785334, 47.9784128, 
    47.9783141, 47.9781715, 47.9777, 47.9774807, 47.9771846, 
    47.9769488, 47.9767349, 47.9766088, 47.9765594, 47.9765374, 
    47.9765923, 47.9766141, 47.9766524, 47.9766469, 47.9765975, 
    47.976455, 47.9763508, 47.9758133, 47.9756049, 47.97555, 
    47.9753745, 47.9752977, 47.9749467, 47.9747602, 47.9745024, 
    47.9742557, 47.9741679, 47.9739264, 47.9737838, 47.9736084, 
    47.9735371, 47.9730873, 47.9728569, 47.9718475, 47.9717708, 
    47.9716664, 47.9715677, 47.9714909, 47.9713318, 47.971255, 
    47.9711068, 47.9709533, 47.9708983, 47.9708159, 47.9706348, 
    47.9705251, 47.9703715, 47.9700422, 47.96979, 47.9696692, 
    47.9694607, 47.9692466, 47.9691369, 47.9687309, 47.9683248, 
    47.9681218, 47.9675511, 47.9673207, 47.9671067, 47.9669257, 
    47.9666623, 47.966536, 47.9664702, 47.9662946, 47.9660697, 
    47.9659874, 47.9658117, 47.9657019, 47.9656141, 47.9654823, 
    47.9652134, 47.9651035, 47.9648949, 47.9647467, 47.9646315, 
    47.9642692, 47.9641759, 47.9636709, 47.9633032, 47.9632098, 
    47.9629793, 47.9628091, 47.9625237, 47.9624578, 47.9623645, 
    47.9622327, 47.9621174, 47.9619693, 47.9617006, 47.9615195, 
    47.9611957, 47.9611078, 47.9610036, 47.9608224, 47.9603724, 
    47.960301, 47.9600979, 47.9599112, 47.9598014, 47.9596972, 
    47.9595711, 47.9594943, 47.959231, 47.9588796, 47.9586599, 
    47.9585061, 47.9585168, 47.9584344, 47.9582696, 47.9581159, 
    47.9579237, 47.9573967, 47.9572759, 47.9570949, 47.956985, 
    47.9567985, 47.9567271, 47.9566338, 47.9564363, 47.9563101, 
    47.9561235, 47.9559424, 47.9558382, 47.9554298, 47.9551999, 
    47.9548386, 47.9542416, 47.9540281, 47.9538693, 47.9533051, 
    47.9531736, 47.9527628, 47.9526095, 47.9525, 47.9522809, 
    47.9517987, 47.9514922, 47.9511965, 47.9510213, 47.9505557, 
    47.9504243, 47.9501232, 47.9498001, 47.9493618, 47.9492194, 
    47.94888, 47.9485842, 47.9483761, 47.9482173, 47.9480201, 
    47.9476257, 47.947297, 47.9469956, 47.9467983, 47.9467435, 
    47.946634, 47.946519, 47.9462724, 47.9461574, 47.946108, 
    47.9460314, 47.9458999, 47.9456697, 47.9452478, 47.9449958, 
    47.9448972, 47.9447603, 47.9445905, 47.9441795, 47.9440096, 
    47.9438398, 47.9436263, 47.9434127, 47.9432922, 47.9431443, 
    47.9428757, 47.9427716, 47.9426621, 47.9423717, 47.9421963, 
    47.941873, 47.9412975, 47.9409851, 47.9408207, 47.9405358, 
    47.9402727, 47.9399001, 47.9395603, 47.9392588, 47.9391054, 
    47.9388204, 47.9379708, 47.9375487, 47.9371979, 47.9369293, 
    47.9368142, 47.9366497, 47.9365236, 47.9361343, 47.9359863, 
    47.935948, 47.9359918, 47.9360028, 47.9359973, 47.9358768, 
    47.9356465, 47.9353997, 47.9352407, 47.9351585, 47.935005, 
    47.9349173, 47.9349064, 47.9349831, 47.9349912478042, 47.9349918252963, 
    47.9351070253071, 47.9353866253463, 47.9354219377426, 47.9354437, 
    47.9354109, 47.935219, 47.9352245, 47.9354218, 47.9356082, 
    47.9356412, 47.9356412, 47.9355973, 47.9353233, 47.9352136, 
    47.935115, 47.9342268, 47.9340459, 47.9336183, 47.9334648, 
    47.9330317, 47.9326259, 47.9324614, 47.9321434, 47.9315732, 
    47.931354, 47.9311072, 47.9307125, 47.9302904, 47.9300546, 
    47.9299285, 47.9295667, 47.9294515, 47.9291719, 47.9287991, 
    47.9285962, 47.9284152, 47.9282452, 47.9280095, 47.9278779, 
    47.9277134, 47.927527, 47.9274228, 47.9272912, 47.927198, 
    47.9270718, 47.9269238, 47.9267647, 47.9265344, 47.9263918, 
    47.9259367, 47.9256132, 47.9254377, 47.9250539, 47.9249113, 
    47.9245438, 47.9242148, 47.9237323, 47.9236171, 47.9235404, 
    47.9235074, 47.9233976, 47.9232331, 47.9230138, 47.9228054, 
    47.9226903, 47.9226263670188, 47.9225948218353, 47.9225510218517, 
    47.9227486219594, 47.9227486219679, 47.9227102219761, 47.9226114886359, 
    47.9226094644454, 47.9226028, 47.9224548, 47.9222739, 47.92206, 
    47.9214513, 47.9212539, 47.9211827, 47.9211220079345, 47.9210652883336, 
    47.9210050216755, 47.9209610883395, 47.9209568006968, 47.9209524, 
    47.9206783, 47.9204535, 47.9203329, 47.9200094, 47.9197846, 
    47.9195765295116, 47.9193054214442, 47.9193051687134, 47.9192967, 
    47.9190006, 47.9187428, 47.9185071, 47.9178764, 47.9174211, 
    47.9171194, 47.9165545, 47.9163625, 47.9161431, 47.915825, 
    47.9156111, 47.9155453, 47.9155179, 47.9155344, 47.9157536, 
    47.9157975, 47.915792, 47.9156603, 47.9154793, 47.9153532, 
    47.9151667, 47.9150625, 47.9150351, 47.9149967, 47.9149528, 
    47.9149093039454, 47.91481348684, 47.9147094868706, 47.9146546868759, 
    47.9146465006545, 47.914646, 47.9144048, 47.9142896, 47.9141854, 
    47.9141305, 47.9141304, 47.9141578, 47.9141664636732, 47.914166486736, 
    47.9143332918588, 47.9143826, 47.914388, 47.914344, 47.9143002, 
    47.9142069, 47.9140809, 47.9136915, 47.9136202, 47.9135599, 
    47.9135159, 47.9135598, 47.9136365, 47.9136421759216, 47.9136452198618, 
    47.9138474456546, 47.9140586, 47.9140633469519, 47.9140672865563, 
    47.9142187802894, 47.9142285, 47.9142065, 47.914009, 47.9138444, 
    47.9136689, 47.9132576, 47.9131258, 47.9130435, 47.9129447, 
    47.9128624, 47.9127252, 47.9125003, 47.9122809, 47.9120122, 
    47.9119464, 47.911908, 47.911875, 47.9118969, 47.9118914, 
    47.9117542, 47.9115896, 47.9111508, 47.9110082, 47.9108271, 
    47.9106956, 47.9105927311658, 47.9105506855021, 47.9105014188338, 
    47.9104630855086, 47.9104248855501, 47.9103810855632, 47.9103372855633, 
    47.9103301390316, 47.9103286, 47.9102518, 47.9101312, 47.9098625, 
    47.9096322, 47.9094896, 47.9093635, 47.9086724, 47.9085901, 
    47.9085352, 47.9084256, 47.9083597, 47.9082884, 47.9082073785435, 
    47.9081162184567, 47.9080670184646, 47.9080670184713, 47.9081164184911, 
    47.9083578185767, 47.9083688852725, 47.9084238186252, 47.9084292852999, 
    47.9084184186385, 47.9082814186376, 47.907996418614, 47.9079963676484, 
    47.9079877, 47.9078177, 47.9075819, 47.907368, 47.9069402, 
    47.9063259, 47.906057, 47.9058429, 47.905596, 47.9055137, 
    47.9054454236826, 47.905379884636, 47.9053306846618, 47.9052814179928, 
    47.9052767798792, 47.9052727, 47.9050814600766, 47.9050018179638, 
    47.9049524846372, 47.9050624180251, 47.905205218101, 47.9052930848254, 
    47.9053042182086, 47.9052440182144, 47.9051180182173, 47.9048220182, 
    47.9048181357707, 47.9048133, 47.9045611, 47.9040567, 47.9038044, 
    47.903448, 47.9028996, 47.9022633, 47.9021153, 47.9019233, 
    47.9013721508131, 47.9011810175742, 47.9011783494567, 47.9011723, 
    47.9010791, 47.9007775, 47.9005141, 47.9004265, 47.9002753513174, 
    47.9002104173963, 47.9001390840649, 47.9001174174302, 47.9000680841074, 
    47.9000022841068, 47.8999960396285, 47.8999936, 47.8998456, 
    47.8994344, 47.8991493, 47.8988147, 47.8986712182035, 47.8985768172276, 
    47.898516617235, 47.8985496172643, 47.8986264172974, 47.8987088173403, 
    47.8988130173816, 47.8990708841295, 47.8991478174909, 47.8992508422261, 
    47.8994022, 47.8994041115964, 47.8994108841888, 47.8994656841963, 
    47.8995260175408, 47.8995864175565, 47.899784017631, 47.8998498176682, 
    47.8998224176734, 47.8996142176728, 47.8996082995274, 47.8996055, 
    47.8995397, 47.899249, 47.8989638, 47.8988486, 47.8983441, 
    47.8981741, 47.8981028, 47.8980754, 47.8981082, 47.8982397, 
    47.8982562, 47.8982232, 47.8981464, 47.8979269, 47.897554, 
    47.8972743, 47.8971043, 47.8970185762566, 47.8969156170207, 
    47.8968936836899, 47.8968554837139, 47.8967568170426, 47.8967520852836, 
    47.8967481, 47.896633, 47.896156, 47.8960645365584, 47.8959562835824, 
    47.8955778835116, 47.8954352834672, 47.895358416768, 47.8953472834056, 
    47.8954020166964, 47.8953580166667, 47.8952976166488, 47.8952666456191, 
    47.8951062, 47.8949385, 47.8947807, 47.8945965, 47.8943828, 
    47.894248, 47.8941888, 47.8942085, 47.8943137, 47.8944255, 
    47.8944453, 47.8943861, 47.8942085, 47.8940408, 47.893906, 
    47.8936791, 47.8934028, 47.8931266, 47.8929466799966, 47.8925568830702, 
    47.8925564052125, 47.8924426, 47.8923999, 47.8924821, 47.8924919, 
    47.8924163, 47.8923111, 47.8921993, 47.8921335, 47.8922124, 
    47.8923144, 47.8924656, 47.8926334, 47.8928307, 47.893028, 
    47.8932055, 47.8933667, 47.8935081, 47.8935225620627, 47.8936326835646, 
    47.8937260169074, 47.8937468651301, 47.8938172, 47.8940145, 
    47.8942019, 47.8943466, 47.8944058, 47.8943828, 47.8943499, 
    47.8944255, 47.8945702, 47.8947675, 47.8949615, 47.8952476, 
    47.895537, 47.8957606, 47.8959086, 47.8959743, 47.8959645, 
    47.895925, 47.8958395, 47.8956258, 47.8955173, 47.8954745, 
    47.8955173, 47.8954942, 47.8955436, 47.8955559253024, 47.8957066843283, 
    47.8957946630027, 47.8959349, 47.8960894, 47.8962768, 47.8962775764853, 
    47.8963154177924, 47.8966666212903, 47.8967503, 47.8967589759731, 
    47.8968088845137, 47.8969404178579, 47.8970390178715, 47.8971542178919, 
    47.8971878063634, 47.897283, 47.8974376, 47.8975066, 47.8975001, 
    47.8975264, 47.8974935, 47.897408, 47.8972995, 47.8971933220773, 
    47.8971544846885, 47.8970102541117, 47.8969016, 47.8968589, 
    47.8969115, 47.8970397, 47.8971449, 47.8970923, 47.8971153, 
    47.897214, 47.8974902, 47.897625, 47.8978026, 47.8979209, 
    47.8980689, 47.8982037, 47.8983517, 47.8983875582745, 47.8984548185887, 
    47.8984735782917, 47.8985457, 47.8986904, 47.8988515, 47.8988909, 
    47.8989271, 47.8989297323081, 47.899014218797, 47.899200618839, 
    47.8993486855295, 47.8996325839087, 47.8996833, 47.8998477, 
    47.8999727, 47.9000549, 47.9000549, 47.8999793, 47.8998971, 
    47.8998017, 47.8996702, 47.899640057944, 47.8995802339438, 
    47.899542, 47.8995354, 47.8996143, 47.8996669, 47.899671313546, 
    47.8997600858207, 47.8998314191723, 47.8999264738825, 47.9000023, 
    47.9000943158563, 47.9002920192534, 47.9003632192666, 47.9003682816845, 
    47.9004527, 47.9005152, 47.9005316, 47.900479, 47.90041, 
    47.9003887829984, 47.9004018193787, 47.9004894860929, 47.900643019484, 
    47.9010542196442, 47.9014254219336, 47.9014753, 47.9015226566075, 
    47.9018274198325, 47.9021234198796, 47.9021344830861, 47.9023071, 
    47.9026326, 47.9027502024962, 47.9032474200197, 47.9034666200483, 
    47.9036196107885, 47.9037472, 47.9039346, 47.9041088, 47.9042666, 
    47.9042765, 47.9042247931353, 47.9042418800743, 47.9042699, 
    47.9042628480543, 47.9043714203706, 47.9043726430267, 47.9043817, 
    47.9044869, 47.904556, 47.9046316, 47.9046973, 47.9047598, 
    47.9048584, 47.9048913, 47.904929926835, 47.905091361813, 
    47.9051055230089, 47.9053526208698, 47.9053847749184, 47.9055127, 
    47.9056212, 47.905779, 47.9058546, 47.9058705366607, 47.9060244265163, 
    47.9060551, 47.9063017, 47.9064727, 47.9066568, 47.9067784, 
    47.9069066, 47.9070578, 47.9073472, 47.9075444, 47.9077088, 
    47.9078074, 47.9078534, 47.9079784, 47.9082151, 47.9085734, 
    47.908889, 47.9092309, 47.9096549, 47.9099607, 47.9102795, 
    47.910628, 47.9107957, 47.9109206, 47.9108954758275, 47.9109873010389, 
    47.9111178, 47.9114301, 47.9116405, 47.9117523, 47.9117753, 
    47.9117851, 47.9118772, 47.912035, 47.9121369, 47.9122585, 
    47.9123220030709, 47.9123370889617, 47.9123944496325, 47.9124524, 
    47.9125412, 47.9125675, 47.9125182, 47.9123801, 47.9122716, 
    47.9121632, 47.9120382, 47.9119331, 47.9118607, 47.9118213, 
    47.9118303008509, 47.9118870891401, 47.9120020891835, 47.912339149265, 
    47.9126201, 47.9130047, 47.9133466, 47.91336122275, 47.9135534895254, 
    47.9138770229226, 47.9143100896659, 47.9144854897008, 47.9146608897442, 
    47.914847223146, 47.9150608898848, 47.915181489915, 47.9153294899422, 
    47.9155652233092, 47.9157736233352, 47.9158213291009, 47.9158316, 
    47.9160157, 47.9162227, 47.9162255024711, 47.9163218900585, 
    47.9169634234872, 47.9172812902113, 47.9174786902566, 47.9176212236281, 
    47.9179226237277, 47.9179232778767, 47.9179549, 47.9180568, 
    47.9180798, 47.9180601, 47.9180305, 47.9180503, 47.9179615, 
    47.9177807, 47.9175934, 47.9173896, 47.9173337, 47.9172318, 
    47.9171825, 47.9172121, 47.9172154, 47.9172581, 47.9174093, 
    47.9175375, 47.9175647, 47.9175244, 47.9174455, 47.9173764, 
    47.9172976, 47.9171957, 47.9171745115341, 47.9171800243304, 
    47.91735509111, 47.9174262911384, 47.9176180911817, 47.9175796911832, 
    47.9175028911765, 47.9173768911597, 47.9172232911295, 47.9171656229079, 
    47.9172064, 47.9172707, 47.9173271, 47.9172647, 47.9171293, 
    47.917028, 47.9170285, 47.9170071743006, 47.9168454909756, 
    47.9167690242483, 47.9167856241725, 47.9169109504792, 47.9169229, 
    47.9168966, 47.9167815, 47.9165711, 47.9164035, 47.9162819, 
    47.9160814, 47.915848, 47.915493, 47.9152268, 47.914977, 
    47.9146976, 47.9144938, 47.9142275, 47.9139119, 47.9135832, 
    47.9133696, 47.9130547, 47.9130414, 47.9130256, 47.9129109, 
    47.912876, 47.9128563, 47.912809, 47.9126982, 47.9126099, 
    47.9124332, 47.912274, 47.9121853, 47.9119939, 47.9118986, 
    47.9118319, 47.9116801, 47.9116418, 47.9115616, 47.9114581, 
    47.9113129, 47.9111292, 47.9109897, 47.9108692, 47.9107622, 
    47.9106454, 47.9104584, 47.9102735, 47.9100724, 47.9098539, 
    47.9096377, 47.9093431, 47.9090243, 47.9086906, 47.9084753, 
    47.908329, 47.9081958, 47.9081498, 47.9081301, 47.9080693, 
    47.9079854, 47.9078835, 47.9077027, 47.907397, 47.9071323, 
    47.9068973, 47.906603, 47.9064386, 47.9061691, 47.9057811, 
    47.9054178, 47.9051269, 47.9050447, 47.9047685, 47.9045811, 
    47.9044743, 47.9044348, 47.9042984, 47.9040452, 47.9040172, 
    47.9038595, 47.9036162, 47.9034682, 47.9033778, 47.9032364, 
    47.9030276, 47.9028501, 47.9025608, 47.9022369, 47.9020101, 
    47.9017766, 47.9015432, 47.9013903, 47.901216, 47.9011355, 
    47.90093, 47.9007557, 47.9007607, 47.9006061, 47.9005042, 
    47.9004762, 47.9003809, 47.9002954, 47.9002395, 47.9002362, 
    47.9003266, 47.9004532, 47.9004873160812, 47.900500087167, 
    47.9004949874836, 47.9004664, 47.9004335, 47.900473, 47.9004622455515, 
    47.9004283281704, 47.9003776, 47.9002891303963, 47.8999753835437, 
    47.8998861, 47.8996986, 47.8995309, 47.8993485, 47.8991462, 
    47.8988618, 47.8985199, 47.8983472, 47.8983138958077, 47.8982252197012, 
    47.8980518555498, 47.8979329, 47.897859, 47.8978031, 47.8977955597394, 
    47.8977810861952, 47.8977208194921, 47.897709886118, 47.8976878860846, 
    47.897561819355, 47.8975595747051, 47.8975515, 47.897544981667, 
    47.8974466859243, 47.8974630858855, 47.8974246858262, 47.8973808857752, 
    47.897340688442, 47.8972605, 47.8972342, 47.8972539, 47.8972936784333, 
    47.8972930856811, 47.8967586624906, 47.8965897, 47.8963349, 
    47.896223219558, 47.8958180185291, 47.8957936172163, 47.8956279, 
    47.8954619, 47.8952859, 47.8951284734619, 47.8951094373642, 
    47.8948732, 47.8947088, 47.8945214, 47.8944326, 47.8944211, 
    47.8943224, 47.8941515, 47.8939541, 47.8937075, 47.8935184, 
    47.89328, 47.8931567, 47.8928936, 47.8926371, 47.8924037, 
    47.8922261, 47.8917969, 47.8916358, 47.8915503, 47.8912773, 
    47.8910406, 47.8909057, 47.8908317, 47.8907956, 47.8908068570745, 
    47.8907892838896, 47.8907948172152, 47.8909098838893, 47.891173083924, 
    47.8914856172707, 47.8916828172311, 47.8916662838725, 47.891589417157, 
    47.8914248837694, 47.8913096837344, 47.8908380169599, 47.8907422491423, 
    47.8904815, 47.8902546, 47.8899718, 47.8898139, 47.8897235, 
    47.8897177232829, 47.8896096166873, 47.8892694944316, 47.8892187, 
    47.8891760337529, 47.8888787598872, 47.8888026, 47.8887056, 
    47.8886942874637, 47.8886770830852, 47.8886002830583, 47.8886110163257, 
    47.8885232162888, 47.8883256828838, 47.8879636827889, 47.8877020974913, 
    47.8876795294734, 47.8875276399351, 47.887469, 47.887423, 
    47.8874197, 47.8873918, 47.8873983, 47.8874312, 47.8874493, 
    47.8875578, 47.887742, 47.8878769, 47.8879065, 47.8879081, 
    47.8877716, 47.8876368, 47.8874592, 47.8872701, 47.8870399, 
    47.88678, 47.886609, 47.8864298, 47.8862061, 47.8860664, 
    47.8859562, 47.8857687, 47.8855977, 47.8855451, 47.8855188, 
    47.8855829, 47.8856059, 47.8856618, 47.8856931, 47.8857786, 
    47.8858772, 47.8859562, 47.8859726, 47.885966, 47.8859808, 
    47.8860121, 47.8861519, 47.8861502, 47.8861272, 47.8860779, 
    47.886091, 47.8861601, 47.8861963, 47.8862818, 47.8863936, 
    47.8863673, 47.8862407, 47.8860779, 47.8859693, 47.8858148, 
    47.8856306, 47.8854004, 47.8850863, 47.8847459, 47.8843989, 
    47.8840979, 47.8837657, 47.8834599, 47.8831836, 47.88295, 
    47.8828188278061, 47.882818016422, 47.8824890163731, 47.8824580084456, 
    47.8824123, 47.8821788, 47.8820357, 47.8819156, 47.8819063585682, 
    47.8808276160688, 47.8806356826937, 47.8805150826659, 47.8803012826071, 
    47.880169615898, 47.8801256825435, 47.8802188825238, 47.8802298158485, 
    47.8802242825032, 47.8802100305662, 47.880197, 47.8798829, 
    47.8796214, 47.8793911, 47.8791411945413, 47.8791276156322, 
    47.8789796156094, 47.8788534822475, 47.8784258154739, 47.8782886820997, 
    47.8780748153822, 47.8777566819846, 47.8771150818392, 47.8768462817684, 
    47.876539081672, 47.8760016815163, 47.8754202813714, 47.8752897008934, 
    47.8752464, 47.8748649, 47.8745507, 47.8743336, 47.8742974, 
    47.8742682792536, 47.8740720143034, 47.87406743067, 47.8739487, 
    47.8737299, 47.873521, 47.8732628, 47.8730292, 47.8727726, 
    47.8725588, 47.8723844, 47.8723423323796, 47.8722180138354, 
    47.8711866802439, 47.8707478801371, 47.8703914133898, 47.8701500133334, 
    47.8698922132708, 47.8697222132243, 47.8694423905185, 47.8694219, 
    47.8691275, 47.8690788876629, 47.8687622129944, 47.8682246795497, 
    47.8680822350128, 47.86805, 47.867823, 47.8676124, 47.8673805, 
    47.8671436, 47.8669659, 47.8666896, 47.8665497, 47.8662668, 
    47.8659624, 47.8656351, 47.8654948406902, 47.8654396791912, 
    47.8652202791435, 47.8650612124352, 47.864852679055, 47.8645456123263, 
    47.8637778788452, 47.8630922787162, 47.8626042786347, 47.8619242785149, 
    47.8614526784256, 47.8610852116856, 47.8607068782826, 47.8603010115362, 
    47.859955411452, 47.8595330113543, 47.8591216112716, 47.8586938111793, 
    47.8580300776891, 47.8577392109424, 47.8570370107599, 47.8566254773237, 
    47.8560876771718, 47.8558132770907, 47.8555004769874, 47.8553028102597, 
    47.8552370102428, 47.8548584768363, 47.8546008101166, 47.8542168767195, 
    47.8539044100085, 47.8537695875252, 47.853562, 47.8534601555129
    ), dim = c(11432L, 2L)))), class = c("XY", "MULTIPOLYGON", 
    "sfg"))), class = c("sfc_MULTIPOLYGON", "sfc"), precision = 0, bbox = structure(c(xmin = -89.2354767000503, 
    ymin = 47.82376, xmax = -88.4223296792445, ymax = 48.1910236
    ), class = "bbox"), crs = structure(list(input = "EPSG:4326", 
        wkt = "GEOGCRS[\"WGS 84\",\n    ENSEMBLE[\"World Geodetic System 1984 ensemble\",\n        MEMBER[\"World Geodetic System 1984 (Transit)\"],\n        MEMBER[\"World Geodetic System 1984 (G730)\"],\n        MEMBER[\"World Geodetic System 1984 (G873)\"],\n        MEMBER[\"World Geodetic System 1984 (G1150)\"],\n        MEMBER[\"World Geodetic System 1984 (G1674)\"],\n        MEMBER[\"World Geodetic System 1984 (G1762)\"],\n        MEMBER[\"World Geodetic System 1984 (G2139)\"],\n        MEMBER[\"World Geodetic System 1984 (G2296)\"],\n        ELLIPSOID[\"WGS 84\",6378137,298.257223563,\n            LENGTHUNIT[\"metre\",1]],\n        ENSEMBLEACCURACY[2.0]],\n    PRIMEM[\"Greenwich\",0,\n        ANGLEUNIT[\"degree\",0.0174532925199433]],\n    CS[ellipsoidal,2],\n        AXIS[\"geodetic latitude (Lat)\",north,\n            ORDER[1],\n            ANGLEUNIT[\"degree\",0.0174532925199433]],\n        AXIS[\"geodetic longitude (Lon)\",east,\n            ORDER[2],\n            ANGLEUNIT[\"degree\",0.0174532925199433]],\n    USAGE[\n        SCOPE[\"Horizontal component of 3D system.\"],\n        AREA[\"World.\"],\n        BBOX[-90,-180,90,180]],\n    ID[\"EPSG\",4326]]"), class = "crs"), n_empty = 0L)), row.names = 1L, class = c("sf", 
"tbl_df", "tbl", "data.frame"), sf_column = "geometry", agr = structure(c(id = NA_integer_, 
objectid = NA_integer_, tnmid = NA_integer_, metasourceid = NA_integer_, 
sourcedatadesc = NA_integer_, sourceoriginator = NA_integer_, 
sourcefeatureid = NA_integer_, loaddate = NA_integer_, referencegnis_ids = NA_integer_, 
areaacres = NA_integer_, areasqkm = NA_integer_, states = NA_integer_, 
huc12 = NA_integer_, name = NA_integer_, hutype = NA_integer_, 
humod = NA_integer_, tohuc = NA_integer_, noncontributingareaacres = NA_integer_, 
noncontributingareasqkm = NA_integer_, globalid = NA_integer_, 
place_id = NA_integer_, licence = NA_integer_, osm_type = NA_integer_, 
osm_id = NA_integer_, lat = NA_integer_, lon = NA_integer_, class = NA_integer_, 
type = NA_integer_, place_rank = NA_integer_, importance = NA_integer_, 
addresstype = NA_integer_, name.1 = NA_integer_, display_name = NA_integer_
), class = "factor", levels = c("constant", "aggregate", "identity"
)))
isle_royale_datasets[['isle_royale_layer']] <- isle_royale_layer

# --- Source: spline.R ---
## $Id: spline.R,v 1.0 2002/12/09 yandell@stat.wisc.edu Exp $
##
## Functions for Bland Ewing's modeling.
##
##     Copyright (C) 2000,2001,2002 Brian S. Yandell.
##
## 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, or (at your option) any
## later version.
##
## These functions are distributed in the hope that they 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.
##
## The text of the GNU General Public License, version 2, is available
## as http://www.gnu.org/copyleft or by writing to the Free Software
## Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
##
###########################################################################################
## Support routines for future.meanvalue
###########################################################################################
spline.rate <- function( meanvalue, x )
{
  coeff <- stats::coef( meanvalue )
  for( i in 2:ncol( coeff ))
    coeff[,i-1] <- i * coeff[,i]
  coeff[,ncol( coeff ) ] <- 0
  meanvalue$coefficients <- coeff
  if( missing( x ))
    stats::predict( meanvalue )
  else
    stats::predict( meanvalue, x )
}
###########################################################################################
spline.deriv <- function( s )
{
  s$coefficients <- s$coefficients[,-1]
  for( i in seq( 2, ncol( s$coefficients )))
    s$coefficients[,i] <- s$coefficients[,i] * i
  s
}
###########################################################################################
splinesum <- function( xy, fit = splines::interpSpline( xy$x, xy$y ),
                       log2 = log( 2 ), tol = 1e-5 )
{
  n <- nrow( xy )
  ## mean time to future event (assume linear off end )
  maxx <- xy[n,"x"]
  mean.y <- maxx * mean( exp( - stats::predict( fit )$y )) + xy[1,"x"]
  rate <- spline.rate( fit, maxx )$y
  if( rate > tol )
    mean.y <- mean.y + exp( - xy[n,"y"] ) / rate

  ## median time to future event
  adiff <- diff( stats::coef( fit )[,1] )
  ## undefined if mean value function not monotone
  if( !( all( adiff < 0) || all( adiff > 0 )))
    median.y <- NA
  else {
    invmvalue <- splines::backSpline( fit )
    median.y <- stats::predict( invmvalue, log2 )$y
    if( is.na( median.y ))
      median.y <- spline.extrapolate( fit, invmvalue, log2 )
  }
  c( mean = mean.y, median = median.y )
}
###########################################################################################
summaryshow <- function( xy, fit, col = "black", sums = splinesum( xy, fit ))
{
  tmpar <- graphics::par( col = col )
  graphics::mtext( paste( "mean =", round( sums[1], 2 )), 3, at = graphics::par("usr")[1], adj = 0 )
  medianshow <- if( is.na( sums[2] ))
    "curve not monotone"
  else
    paste( "median =", round( sums[2], 2 ))
  graphics::mtext( medianshow, 3, at = graphics::par("usr")[2] / 1.25, adj = 1 )
  graphics::par( tmpar )
  invisible( sums )
}
###########################################################################################
curve.plot <- function( xy = seq(0,1,by=.25), y = c(0,.1,.5,.9,1),
  z = graphics::locator(1,"n"), n=5, action="add",
  fit = splines::interpSpline( xy$x, xy$y ),
  backfit = TRUE, save.ends = 3, col = c("blue","red"), lwd = 4,
  f = function( x ) x, finv = function( x ) x )
{
  if( !is.list( xy )) {
    xy <- data.frame( x = xy )
    xy$y <- y
  }
  else
    xy <- as.data.frame( xy )
  if( !match( action, c("refresh","finish"), nomatch = 0 )) {
    z <- as.data.frame(z)
    tmp <- z$x > max( xy$x )
    if( any( tmp )) {
      if( all( tmp ))
        return( xy )
      z$x <- z$x[!tmp]
      z$y <- z$y[!tmp]
    }
  }
  remove.points <- function( xy, finv, save.ends = TRUE ) {
    ## find closest point after standardizing distances
    usr <- graphics::par( "usr" )
    tmp <- (( xy$x - z$x ) / diff( usr[1:2] )) ^ 2 +
      (( xy$y - z$y ) / diff( usr[3:4] )) ^ 2
    if( save.ends )
      tmp <- tmp[ - c( 1, nrow( xy )) ]
    tmp <- save.ends + min( seq( tmp )[ tmp == min( tmp ) ] )
    tmpd <- xy[tmp,"y"]
    tmpd <- finv( tmpd )
    graphics::points( xy[tmp,"x"], tmpd, lwd = lwd, col = "white" ) 
    tmp
  }
  for( i in 1:n) {
    switch( action,
      noaction =
        return( xy )
      ,
      add = {
        graphics::points(z$x,z$y, lwd = lwd )
        z$y <- f( z$y )
        xy <- rbind(xy,z)
        xy <- xy[order(xy$x),]
        fit <- splines::interpSpline( xy$x, xy$y )
      },
      replace = {
        graphics::points(z$x,z$y, lwd = lwd )
        z$y <- f( z$y )
        tmp <- remove.points( xy, finv, save.ends == 3 )
        tmpp <- ( tmp > 1 & tmp < length( xy$x ))
        if( save.ends != 2 | tmpp )
          xy$x[tmp] <- z$x
        if( save.ends != 1 | tmpp )
          xy$y[tmp] <- z$y
        fit <- splines::interpSpline( xy$x, xy$y )
      },
      delete = {
        z$y <- f( z$y )
        tmp <- remove.points( xy, finv, save.ends > 0 )
        xy <- xy[-tmp,]
        fit <- splines::interpSpline( xy$x, xy$y )
      },
      refresh =, finish = {
        xy
      }
    )
    tmpp <- stats::predict( fit )
    graphics::lines( tmpp$x, finv( tmpp$y ), col = col[1], lwd = lwd )

    adiff <- diff( stats::coef( fit )[,1] )
    if( backfit & ( all( adiff < 0) || all( adiff > 0 ))) {
      ## backspline (not quite a spline) fit to inverse
      tmpback <- stats::predict( splines::backSpline( fit ))
      graphics::lines( tmpback$y, finv( tmpback$x ), col = col[2], lwd = lwd )
    }
  }
  list( xy = xy[order(xy$x),], fit = fit )
}
###########################################################################################
cdf.lines <- function( data, fig = "mean value", nspline = 8,
  conf = c(50,80,90,95), rescale = 1,
  col = c("green","blue","red","orange") )
{
  rate <- fig == "mean value"
  n <- length( data )
  data <- sort( data )
  prob <- seq( n ) / ( n + 1 )
  f <- - rescale * log( 1 - prob )
  ylab <- "prob"
  if( rate )
    ylab <- "cum rate"
  else
    f <- 1 - exp( -f )
  graphics::lines( data, f, lwd = 2 )
  conf <- conf / 100
  for( i in seq( length( conf ))) {
    ## lower confidence
    tmp <- stats::qbinom( conf[i], n, prob, lower.tail = TRUE ) / ( n + 1 )
    tmp <- 1 - exp( rescale * log( 1 - tmp ))
    tmpna <- is.na( tmp )
    if( any( tmpna ))
      tmp[tmpna] <- f[1]
    if( rate )
      tmp <- - log( 1 - tmp )
    graphics::lines( data, tmp, lty = 2, col = col[i] )
    ## upper confidence
    tmp <- stats::qbinom( conf[i], n, prob, lower.tail = FALSE ) / ( n + 1 )
    tmp <- 1 - exp( rescale * log( 1 - tmp ))
    tmpna <- is.na( tmp )
    if( any( tmpna ))
      tmp[tmpna] <- f[n]
    if( rate )
      tmp <- - log( 1 - tmp )
    graphics::lines( data, tmp, lty = 2, col = col[i] )
  }
}
###########################################################################################
rspline <- function( meantime = 1,
                    fivepar = c(dispersion = 1, location = 0, intensity = 1, truncation = 0,
                      rejection = Inf ),
                    fit = NULL,
                    meanvalue = fit$meanvalue, invmvalue = fit$invmvalue,
                    span = Inf )
{
  ## dispersion = a, location = b, intensity = c
  ## truncation = -log(1-d), rejection = -log(1-e)

  ## y = a M^-1( G(d)+cV ) + b  if 1 - exp( -cV ) < G(e)
  ## y = span        if 1 - exp( -cV ) >= G(e)

  ## this is not quite right for truncation, as we know event happened before b
  ## if 1-exp(-cV) < d, but I am not sure how to pass that information along yet

  default <- is.null( meanvalue )

  ##          V ~ exp(1)
  ## intensity:      V/c
  ## truncation:      (G(d)+V)/c
  rate <- ( fivepar["truncation"] + rexp( 1 )) / fivepar["intensity"]

  ## mean value inverse:    M^-1( G(d)+V/c )
  if( default )
    y <- rate
  else {
    y <- stats::predict( invmvalue, rate )$y
    ## kludge to linearly extrapolate beyond cubic spline fit
    if( is.na( y ))
      y <- spline.extrapolate( meanvalue, invmvalue, rate )
  }

  ## dispersion and location:  y = a M^-1( cV ) + b
  y <- meantime * fivepar["dispersion"] * y + fivepar["location"]

  ## rejection:      y >= e? then set y to span
  if( y > fivepar["rejection"] )
    y <- span

  y
}
###########################################################################################
spline.extrapolate <- function( meanvalue, invmvalue, x )
{
  ## linear extrapolation of inverse spline beyond upper end
  coeff <- stats::coef( invmvalue )
  nr <- nrow( coeff ) - 1
  xknot <- splines::splineKnots( invmvalue )[nr+(0:1)]
  yknot <- splines::splineKnots( meanvalue )[nr+1]
  tmpr <- ( xknot[2] - xknot[1] )
  slope <- coeff[nr,2] + tmpr * ( 2 * coeff[nr,3] + tmpr * 3 * coeff[nr,4] )
  yknot + slope * ( x - xknot[2] )
}
###########################################################################################
### spline.design() is a prototype for designing spline curves
### Ultimately, pieces of spline.design, spline.temp() and spline.meanvalue()
### will be pulled out as subroutines to reduce code overlap
###########################################################################################
spline.design <- function (y = yinit, x = xinit, nspline = 8, xy = data.frame(x = x, 
    y = y), n = 1, horizontal = FALSE) 
{
    is.data <- !missing(y)
    if (is.data) {
        data <- y
        if (missing(x)) 
            x <- as.numeric(names(y))
        datax <- x
        ndata <- length(data)
        choose <- round(seq(1, ndata, length = nspline))
        xinit <- x <- x[choose]
        yinit <- y <- y[choose]
    }
    else {
        tmp <- seq(0, nspline - 1)
        if (missing(x)) 
            xinit <- tmp
        else xinit <- x
        if (missing(y)) 
            yinit <- rep(50, nspline)
        else yinit <- y
    }

  ## plot curve and surrounding axes
  graphics::par( mfrow = c(1,1), mar = rep(4.1,4))
  plotit <- function( xy, fig = "temp", fit = splines::interpSpline( xy$x, xy$y ),
    horizontal = FALSE, strip = .25, margin = .1 )
  {
    switch( fig, {
        y <- xy$y
        ylim <- range(y)
      }
    )
    xlim <- range(xy$x)
    xlim <- xlim + c(-1,1) * margin * diff( xlim )
    if( horizontal ) {
      if( diff( ylim ) == 0 )
        ylim <- ylim * c(.75,1.25)
      separator <- ylim[2]
      ylim[2] <- ylim[2] + strip * diff( ylim )
    }
    else {
      separator <- xlim[2]
      xlim[2] <- xlim[2] + strip * diff( xlim )
    }
    axt <- c("n","s")
    tmpar <- graphics::par( xaxt = axt[1+horizontal], yaxt = axt[2-horizontal] )
    plot( xy$x, y, xlim = xlim, ylim = ylim, type="n", xlab = "", ylab = "" )
    graphics::par( xaxt = "s", yaxt = "s" )
    graphics::points( xy$x, y, lwd = 4 )
    graphics::title( fig )
    graphics::mtext( "time", 1, 2 )
    graphics::mtext( fig, 2, 2 )
    if( horizontal ) {
      p <- pretty( c(ylim[1],separator) )
      graphics::axis( 2, p[ p <= separator ] )
      graphics::abline( h = separator, lty = 2 )
    }
    else {
      p <- pretty( c(xlim[1],separator) )
      graphics::axis( 1, p[ p <= separator ] )
      graphics::abline( v = separator, lty = 2 )
    }
    curve.plot( xy, n = n, action = "refresh", fit = fit, backfit = FALSE,
      save.ends = 0 )
    separator
  }
  ## place commands along right strip of plot, highlighting current command
  plotcmd <- function( ans, fig, cmds, cmdlocs, usr, col = "green", rest = "black",
    horizontal = TRUE )
  {
    ans <- c( ans, fig )
    tmp <- is.na( match( cmds, ans ))
    if( any( tmp )) for( i in unique( cmdlocs$adj )) {
      tmpi <- tmp & i == cmdlocs$adj
      if( any( tmpi ))
        graphics::text( cmdlocs$x[tmpi], cmdlocs$y[tmpi], cmds[tmpi], col = rest, adj = i )
    }
    if( any( !tmp )) for( i in unique( cmdlocs$adj )) {
      tmpi <- !tmp & i == cmdlocs$adj
      if( any( tmpi ))
        graphics::text( cmdlocs$x[tmpi], cmdlocs$y[tmpi], cmds[tmpi], col = col, adj = i )
    }
  }
  cmds <- c("add","delete","replace","","finish","restart","refresh","rescale",
    "","data","temp")
  newlocs <- if( horizontal )
    function( cmds, data = FALSE, usr )
    {
      if( !data )
        cmds <- cmds[ cmds != "data" ]
      n <- length( cmds )
      blank <- seq( n )[ cmds == "" | cmds == " " ]
      tmp <- diff(usr[3:4]) / 20
      m <- mean( usr[1:2] )
      y <- usr[4] + 0.5 * tmp - c( tmp * seq( blank[1] - 1 ), 0,
        tmp * seq( blank[2] - blank[1] - 1 ), 0,
        tmp * seq( n - blank[2] ))
      x <- c( rep( usr[1], blank[1] - 1 ), mean( m, usr[1] ),
        rep( m, blank[2] - blank[1] - 1 ), mean( m, usr[2] ),
        rep( usr[2], n - blank[2] ))
      adj <- c( rep( 0, blank[1] ),
        rep( 0.5, blank[2] - blank[1] ),
        rep( 1, n - blank[2] ))
      tmp <- data.frame( x = x, y = y, adj = adj )
      cmds[blank[2]] <- " "
      row.names( tmp ) <- cmds
      tmp
    }
  else
    function( cmds, data = FALSE, usr )
    {
      if( !data )
        cmds <- cmds[ cmds != "data" ]
      n <- length( cmds )
      blank <- seq( n )[ cmds == "" ]
      tmp <- diff(usr[3:4]) / 20
      m <- mean( usr[3:4] )
      tmp <- c( usr[4] - tmp * seq( blank[1] - 1 ),
        mean( m, usr[4] ),
        m + tmp * ( seq( blank[1] + 1, blank[2] - 1 ) - mean( blank )),
        mean( m, usr[3] ),
        usr[3] + tmp * seq( n - blank[2] ))
      tmp <- data.frame( x = rep( usr[2], n ), y = tmp, adj = rep( 1, n ))
      cmds[blank[2]] <- " "
      row.names( tmp ) <- cmds
      tmp
    }

  fig <- "temp"
  newans <- ans <- "replace"

  graphics::par( mar = c(4.1,4.1,3.1,4.1),omi=rep(.25,4))
  fit <- splines::interpSpline( xy$x, xy$y )
  separator <- plotit( xy, fig, fit, horizontal )

  usr <- graphics::par("usr")
  cmdlocs <- newlocs( cmds, data = is.data, usr = usr)
  cmds <- row.names( cmdlocs )
  plotcmd( ans, fig, cmds, cmdlocs, usr )
  use.data <- FALSE
  rescale.data <- 1
  repeat {
    ## get command from plot using cursor
    z <- graphics::locator(1,"n")
    if(( !horizontal & z$x > separator ) | ( horizontal * z$y > separator )) {
      if( horizontal ) { # need to look at both z&y 
        x <- abs( z$x - cmdlocs$x )
        x <- x == min( x )
        newans <- cmds[x]
        z <- abs( z$y - cmdlocs$y )[x]
        newans <- newans[ z == min( z ) ][1]
      }
      else {
        z <- abs(z$y - cmdlocs$y )
        newans <- cmds[ z == min( z ) ][1]
      }
      switch( newans,
        finish =, refresh = {
          separator <- plotit( xy, fig, fit, horizontal )
          usr <- graphics::par("usr")
          cmdlocs <- newlocs( cmds, data = is.data, usr = usr)
        },
        data = {
          use.data <- is.data & !use.data
          if( is.data & !use.data )
            plotit( xy, fig, fit, horizontal )
        },
        temp = {
          fig <- newans
          separator <- plotit( xy, fig, fit, horizontal )
          usr <- graphics::par("usr")
          cmdlocs <- newlocs( cmds, data = is.data, usr = usr)
        },
        rescale = {
          cat( "enter new values followed by RETURN key\n" )
          tmpy <- readline( paste( "maximum ", fig, "(",
            round( max( xy$y ), 2 ), "):", sep = "" ))
          if( tmpy != "" ) {
            tmpy <- suppressWarnings(as.numeric( tmpy )) / max( xy$y )
            xy$y <- tmpy * xy$y
            if( is.data )
              rescale.data <- rescale.data * tmpy
          }
          tmpx <- readline( paste( "maximum time(", 
            round( max( xy$x ), 2 ), "):", sep = "" ))
          if( tmpx != "" ) {
            tmpx <- suppressWarnings(as.numeric( tmpx )) / max( xy$x )
            xy$x <- tmpx * xy$x
          }
          fit <- splines::interpSpline( xy$x, xy$y )
          separator <- plotit( xy, fig, fit, horizontal )
          usr <- graphics::par("usr")
          cmdlocs <- newlocs( cmds, data = is.data, usr = usr)
        },
        restart = {
          if( is.data )
            rescale.data <- 1
          xy <- data.frame( x = xinit, y = yinit )
          fit <- splines::interpSpline( xy$x, xy$y )
          separator <- plotit( xy, fig, fit, horizontal )
          usr <- graphics::par("usr")
          cmdlocs <- newlocs( cmds, data = is.data, usr = usr)
        },
        add =, delete =, replace = {
          ans <- newans
        }
      )
      if( use.data ) {
        rx <- range( xy$x )
        dx <- range( datax )        
        graphics::lines( rx[1] + ( datax - dx[1] ) * diff( rx ) / diff( dx ), data * rescale.data )
      }
      plotcmd( ans, fig, cmds, cmdlocs, usr )
    }
    else {
      fit <- curve.plot( xy, n = n, action = ans, z = z, fit = fit, backfit = FALSE,
        save.ends = 0 )
      xy <- fit$xy
      fit <- fit$fit
      ans <- "replace"
      plotcmd( ans, fig, cmds, cmdlocs, usr )
    }
    if( newans == "finish" )
      break
  }
  plotcmd( newans, fig, cmds, cmdlocs, "red" )
  tmp <- curve.plot( xy, n = n, action = "refresh", backfit = FALSE, save.ends = 0 )
  tmp
}

# --- Source: triangle.R ---
## $Id: triangle.R,v 0.9 2002/12/09 yandell@stat.wisc.edu Exp $
##
## Functions for Bland Ewing's modeling.
##
##     Copyright (C) 2000,2001,2002 Brian S. Yandell.
##
## 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, or (at your option) any
## later version.
##
## These functions are distributed in the hope that they 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.
##
## The text of the GNU General Public License, version 2, is available
## as http://www.gnu.org/copyleft or by writing to the Free Software
## Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
##
###########################################################################################
## rtri( n, width )
##
## plot.current( x, species )
## text.current( x, species )
##
###########################################################################################
###########################################################################################
### Tridiagonal Coordinate System S3 Classes & Algebra
###########################################################################################
tricoord <- function(a, b = NULL, c = NULL) {
  if (is.data.frame(a) && all(c("a", "b", "c") %in% names(a))) {
    res <- a
  } else if (is.matrix(a) && ncol(a) == 3) {
    res <- as.data.frame(a)
    names(res) <- c("a", "b", "c")
  } else if (!is.null(b) && !is.null(c)) {
    res <- data.frame(a = a, b = b, c = c)
  } else if (is.numeric(a) && length(a) == 3) {
    res <- data.frame(a = a[1], b = a[2], c = a[3])
  } else {
    stop("Invalid tricoord input format")
  }
  class(res) <- c("tricoord", "data.frame")
  res
}

`+.tricoord` <- function(e1, e2) {
  # Handle vector offsets cleanly
  if (is.numeric(e2) && length(e2) == 3) {
    tricoord(e1$a + e2[1], e1$b + e2[2], e1$c + e2[3])
  } else if (inherits(e2, "tricoord")) {
    tricoord(e1$a + e2$a, e1$b + e2$b, e1$c + e2$c)
  } else {
    stop("Invalid right hand operand for tricoord addition")
  }
}

`-.tricoord` <- function(e1, e2) {
  if (is.numeric(e2) && length(e2) == 3) {
    tricoord(e1$a - e2[1], e1$b - e2[2], e1$c - e2[3])
  } else if (inherits(e2, "tricoord")) {
    tricoord(e1$a - e2$a, e1$b - e2$b, e1$c - e2$c)
  } else {
    stop("Invalid right hand operand for tricoord subtraction")
  }
}

###########################################################################################
rtri <- function( n, width, tri = matrix(0,3,n), roundoff = TRUE )
{
  tri <- as.matrix( tri )
  if( n == 1 ) {
    xy <- stats::runif( 2, 0, width )
    if( roundoff )
      xy <- round( xy )

    i <- sample( 3, 1  )
    i1 <- 1 + i%%3
    i2 <- 1 + (i+1)%%3
    tri[i1,] <- tri[i1,] + xy[1]
    tri[i2,] <- tri[i2,] - xy[2]
    tri[i,] <- - ( tri[i1,] + tri[i2,] )
    return( tri )
  }
  else {
    xy <- data.frame( x = stats::runif( n, 0, width ),
      y = - stats::runif( n, 0, width ))
    if( roundoff )
      xy <- round( xy )

    out <- sample( 3, n, replace = TRUE )
    for( i in 1:3 ) {
      outi <- out == i
      if( any( outi )) {
        i1 <- 1 + i%%3
        i2 <- 1 + (i+1)%%3
        tri[i1,outi] <- tri[i1,outi] + xy$x[outi]
        tri[i2,outi] <- tri[i2,outi] + xy$y[outi]
        tri[i,outi] <- - ( tri[i1,outi] + tri[i2,outi] )
      }
    }
  }
  tri
}
###########################################################################################
car2tri.default <- function(x,y)
  car2tri( cbind( x, y ))
car2tri <- function( xy, xmult = ( 2 + sq3 ) / 4, ymult = ( 3 + 2 * sq3 ) / 12,
  sq3 = sqrt( 3 ))
{
#  if( !is.matrix( xy ))
#    xy <- t( as.matrix( xy ))
  aa <- xmult * xy[,1] - ymult * xy[,2]
  bb <- - xmult * xy[,1] - ymult * xy[,2]
  cc <- -( aa + bb )
  rbind( a = aa, b = bb, c = cc )
}
###########################################################################################
tri2car.default <- function(aa,bb,cc=-(aa+bb))
  tri2car( rbind( aa, bb, cc ))
tri2car <- function(tri, xmult = 2 / ( 2 + sq3 ), ymult = 6 / ( 3 + 2 * sq3 ),
  sq3 = sqrt( 3 ))
{
  if( inherits(tri, "tricoord") ) {
    # If the user passes our S3 tricoord dataframe, map it correctly natively.
    x <- ( tri$a - tri$b ) * xmult
    y <- - ( tri$a + tri$b ) * ymult
  } else {
    if( !is.matrix( tri ))
      tri <- as.matrix( tri )
    x <- ( tri[1,] - tri[2,] ) * xmult
    y <- - ( tri[1,] + tri[2,] ) * ymult
  }
  data.frame( x = x, y = y )
}
###########################################################################################
cardist <- function( xy )
  sqrt( xy[,1]^2 + xy[,2]^2 )
###########################################################################################
tridist <- function( tri )
  apply( tri, 1, max )
###########################################################################################
gasket <- function( aa, bb )
{
  n <- length( aa )
  pp <- c(-1,1,0,1)
  dda <- diff( aa )
  ddb <- diff( bb )
  ss <- sign( sign( dda ) - sign( ddb ))
  dda <- 2 - abs( dda )
  ddb <- 2 - abs( ddb )
  aa <- 2 * aa
  aa <- c( aa[1], rbind( aa[-n] + pp[dda+1+ss], aa[-1] + pp[dda+1-ss], aa[-1] ))
  bb <- 2 * bb
  bb <- c( bb[1], rbind( bb[-n] + pp[ddb+1-ss], bb[-1] + pp[ddb+1+ss], bb[-1] ))
  data.frame( aa = aa, bb = bb )
}

# --- Source: substrate_triangle.R ---
get_substrate_grid <- function(width, step = 1, orientation = "up") {
  pts <- expand.grid(a = seq(0, width - step, by = step), 
                     b = seq(0, width - step, by = step))
  
  if (orientation == "up") {
    pts <- subset(pts, a + b <= width - step)
    pts$c <- -(pts$a + pts$b)
  } else {
    pts <- subset(pts, a + b <= width - step)
    pts$a <- -pts$a
    pts$b <- -pts$b
    pts$c <- -(pts$a + pts$b)
  }
  return(pts)
}

substrate_topology <- function(width = 10, step = 1) {
  W <- width - step
  
  # Topology adjacency offsets
  list(
    fr2   = list(offset = c(0, 0, 0), dir = "down"),
    fr1   = list(offset = c(-W, -W, 2*W), dir = "up"),
    fr3   = list(offset = c(-W, 0, W), dir = "up"),
    fr4   = list(offset = c(0, -W, W), dir = "up"),
    tw1   = list(offset = c(-W, 0, W), dir = "down"),
    twig  = list(offset = c(-W, 0, W), dir = "down"),
    tw2   = list(offset = c(-2*W, 0, 2*W), dir = "up"),
    lftop = list(offset = c(-2*W, W, W), dir = "down"),
    lfbot = list(offset = c(-3*W, W, 2*W), dir = "up")
  )
}

create_substrate <- function(topology, width = 10, step = 1) {
  W <- width - step
  all_points <- data.frame()
  labels_df <- data.frame()
  poly_df <- data.frame()
  
  for (sub in names(topology)) {
    cfg <- topology[[sub]]
    grid <- get_substrate_grid(width, step, cfg$dir)
    
    o_a <- cfg$offset[1]
    o_b <- cfg$offset[2]
    o_c <- cfg$offset[3]

    # Needs tricoord and tri2car which are presumably exported/available from R/triangle.R
    grid_tri <- tricoord(grid$a, grid$b, grid$c)
    grid_tri <- grid_tri + cfg$offset
    
    car_pts <- tri2car(grid_tri)
    car_pts$substrate <- sub
    all_points <- rbind(all_points, car_pts)
    
    # Determine bounds and midpoints for side labels 1,2,3
    if (cfg$dir == "up") {
      v_top <- c(o_a, o_b, o_c)
      v_br  <- c(o_a + W, o_b, o_c - W)
      v_bl  <- c(o_a, o_b + W, o_c - W)
      
      m1 <- (v_top + v_bl) / 2
      m2 <- (v_top + v_br) / 2
      m3 <- (v_bl + v_br)  / 2
      centroid <- (v_top + v_br + v_bl) / 3
      p_mat <- cbind(v_top, v_br, v_bl)
    } else {
      v_bot <- c(o_a, o_b, o_c)
      v_tr  <- c(o_a, o_b - W, o_c + W)
      v_tl  <- c(o_a - W, o_b, o_c + W)
      
      m1 <- (v_bot + v_tr) / 2
      m2 <- (v_bot + v_tl) / 2
      m3 <- (v_tl + v_tr)  / 2
      centroid <- (v_bot + v_tr + v_tl) / 3
      p_mat <- cbind(v_bot, v_tr, v_tl)
    }
    
    # Interpolate slightly towards the centroid to put text "just inside" the edges
    w_in <- 0.25 # weight towards centroid
    l1 <- m1 * (1 - w_in) + centroid * w_in
    l2 <- m2 * (1 - w_in) + centroid * w_in
    l3 <- m3 * (1 - w_in) + centroid * w_in
    
    mat_l <- cbind(l1, l2, l3)
    car_l <- tri2car(mat_l)
    car_l$label <- c("1", "2", "3")
    car_l$substrate <- sub
    labels_df <- rbind(labels_df, car_l)
    
    car_p <- tri2car(p_mat)
    car_p$substrate <- sub
    poly_df <- rbind(poly_df, car_p)
  }
  
  centers <- stats::aggregate(cbind(x,y) ~ substrate, data=all_points, mean)
  
  obj <- list(
    points = all_points, 
    labels = labels_df, 
    poly = poly_df, 
    centers = centers,
    topology = topology
  )
  class(obj) <- "substrate"
  return(obj)
}

autoplot.substrate <- function(object, ...) {
  ggplot2::ggplot() +
    # Draw the black boundary lines outlining the substrates exactly over outer dots
    ggplot2::geom_polygon(data=object$poly, ggplot2::aes(x=x, y=y, group=substrate), fill=NA, color="black", linewidth=0.7) +
    # Plot grid dots
    ggplot2::geom_point(data=object$points, ggplot2::aes(x=x, y=y, color=substrate), size=1.5) +
    # Plot Substrate Labels (Centers)
    ggplot2::geom_text(data=object$centers, ggplot2::aes(x=x, y=y, label=substrate), color="black", fontface="bold", size=5) +
    # Axis side numbers
    ggplot2::geom_text(data=object$labels, ggplot2::aes(x=x, y=y, label=label), color="darkred", fontface="bold", size=4) +
    ggplot2::theme_void() +
    ggplot2::coord_fixed() +
    ggplot2::ggtitle("Ewing Tridiagonal Substrate Network Mapping")
}

create_hex_overlay <- function(object, step = 1) {
  pts <- if (inherits(object, "substrate")) object$points else object
  if (is.null(pts) || nrow(pts) == 0) return(data.frame())
  
  xmult <- 2 / (2 + sqrt(3))
  ymult <- 6 / (3 + 2 * sqrt(3))
  d <- step * sqrt(xmult^2 + ymult^2)
  r <- d / sqrt(3)
  
  angles <- (seq(0, 5) * 60 + 30) * pi / 180
  dx <- r * cos(angles)
  dy <- r * sin(angles)
  
  n_pts <- nrow(pts)
  hex_list <- vector("list", n_pts)
  
  for (i in seq_len(n_pts)) {
    px <- pts$x[i] + dx
    py <- pts$y[i] + dy
    sub <- pts$substrate[i]
    hex_list[[i]] <- data.frame(
      x = px,
      y = py,
      cell_id = i,
      substrate = sub,
      stringsAsFactors = FALSE
    )
  }
  
  do.call(rbind, hex_list)
}


# --- Source: ewing_substrate.R ---
ewing_substrate <- function( community,
                             species,
                             headstuff = c( 0, "start", sum( to.plot )),
                             units = getOrgFeature( community, species[1], "units" ),
                             right = species[1], adj = c(0,.5,1),
                             show_sub = NULL,
                             step = 0,
                             layout = c("facet", "hex"),
                             width = 10,
                             step_density = 1,
                             rescale = TRUE,
                             x_var = c("step", "time"),
                             ...)
{
  x_var <- match.arg(x_var)
  
  if (inherits(community, "isle_royale_sim")) {
    p_map <- autoplot(community$habitat_overlay, show_landmarks = TRUE)
    moose_sf <- sf::st_as_sf(community$moose_pop, coords = c("lon", "lat"), crs = sf::st_crs(community$habitat_overlay$layer))
    wolf_sf  <- sf::st_as_sf(community$wolf_pop, coords = c("lon", "lat"), crs = sf::st_crs(community$habitat_overlay$layer))
    
    hdr_str <- if (x_var == "step") paste0("Step ", community$nstep) else paste0("Time Units ", community$nstep)
    
    p_map <- p_map +
      ggplot2::geom_sf(data = moose_sf, color = "#27ae60", shape = 21, fill = NA, stroke = 1.0, size = 0.8, alpha = 0.85) +
      ggplot2::geom_sf(data = wolf_sf, color = "#e74c3c", shape = 21, fill = NA, stroke = 1.4, size = 1.5, alpha = 0.95) +
      ggplot2::ggtitle(paste0("Isle Royale Substrate Plot (", hdr_str, ")"))
    
    return(p_map)
  }

  layout <- match.arg(layout)
  
  if (length(species) > 1) {
    res_list <- lapply(species, function(sp) {
      df <- ewing_substrate(community = community, species = sp, headstuff = headstuff,
                            units = units, right = right, adj = adj, show_sub = show_sub,
                            step = step, layout = layout, width = width, step_density = step_density,
                            rescale = rescale, ...)
      if (!is.null(df) && nrow(df) > 0) {
        df$species <- sp
      }
      df
    })
    res_list <- res_list[!sapply(res_list, is.null)]
    if (length(res_list) == 0) return(NULL)
    combined <- do.call(rbind, res_list)
    attr(combined, "species") <- paste(species, collapse = " & ")
    step_val <- if (!is.null(community$step)) community$step else if (!is.null(community$count$step)) community$count$step else if (!is.null(attr(community, "nstep"))) attr(community, "nstep") else step
    attr(combined, "step") <- step_val
    attr(combined, "layout") <- layout
    attr(combined, "width") <- width
    attr(combined, "step_density") <- step_density
    class(combined) <- c("ewing_substrate", class(combined))
    return(combined)
  }
  
  ## plot current stages for species (except random parasites)
  organism <- get.species( community, species )[,-1]
  if(is.null(organism)) # species is not in community
    return(NULL)
  
  future <- getOrgFuture( community, species, c("color","pch") )
  
  # Substrate names mapping (e.g. fr1, fr2, fr3, fr4, twig, lftop, lfbot)
  substrate_feat <- getOrgFeature( community, species, "substrate")
  sub_interact <- getOrgInteract(community, substrate_feat, species)
  substrates <- rownames(sub_interact)
  if (is.null(substrates) || length(substrates) == 0) {
    substrates <- names(getOrgInteract(community, substrate_feat, substrate_feat))
  }
  if (is.null(show_sub)) show_sub <- substrates
  
  position <- paste( "pos", letters[1:3], sep = "." )
  
  if (layout == "hex") {
    topo <- substrate_topology(width = width, step = step_density)
    n_org <- ncol(organism)
    gx <- numeric(n_org)
    gy <- numeric(n_org)
    
    sub_indices <- organism["sub.stage", ]
    org_sub_names <- substrates[sub_indices]
    
    # Process organisms per substrate patch to rescale local coordinates into substrate surface triangle
    unique_subs <- unique(org_sub_names)
    
    for (sub in unique_subs) {
      idx <- which(org_sub_names == sub)
      
      target_name <- sub
      if (!target_name %in% names(topo)) {
        if (target_name == "twig") target_name <- "tw1"
        if (target_name == "tw1") target_name <- "twig"
      }
      
      cfg <- topo[[target_name]]
      
      pa <- organism["pos.a", idx]
      pb <- organism["pos.b", idx]
      pc <- organism["pos.c", idx]
      
      if (!is.null(cfg)) {
        # Determine substrate surface width (allows substrates of different sizes in future)
        W_sub <- if (!is.null(cfg$width)) (cfg$width - step_density) else (width - step_density)
        
        if (rescale) {
          amin <- min(pa); amax <- max(pa)
          bmin <- min(pb); bmax <- max(pb)
          
          u <- if (amax > amin) (pa - amin) / (amax - amin) else rep(0.5, length(idx))
          v <- if (bmax > bmin) (pb - bmin) / (bmax - bmin) else rep(0.5, length(idx))
          
          # 15% inner padding to ensure symbols sit comfortably inside substrate polygon borders
          u_m <- 0.15 + 0.70 * u
          v_m <- 0.15 + 0.70 * v
          
          a_p <- u_m * W_sub
          b_p <- v_m * (W_sub - a_p)
          c_p <- -(a_p + b_p)
        } else {
          a_p <- pa
          b_p <- pb
          c_p <- pc
        }
        
        off <- cfg$offset
        if (cfg$dir == "up") {
          ga <- a_p + off[1]
          gb <- b_p + off[2]
          gc <- c_p + off[3]
        } else {
          ga <- -a_p + off[1]
          gb <- -b_p + off[2]
          gc <- -c_p + off[3]
        }
        car <- tri2car(tricoord(ga, gb, gc))
        gx[idx] <- car$x
        gy[idx] <- car$y
      } else {
        car <- tri2car(organism[position, idx, drop = FALSE])
        gx[idx] <- car$x
        gy[idx] <- car$y
      }
    }
    
    xy <- data.frame(x = gx, y = gy)
  } else {
    xy <- tri2car( organism[position,] )
  }
  
  dat <- dplyr::filter(
    dplyr::mutate(
      tibble::tibble(xy), 
      stage = organism["stage",],
      substrate = substrates[organism["sub.stage",]],
      pchar = factor(as.character( future$pch[.data$stage + 1] ), levels = unique(as.character(future$pch))),
      color = as.character( future$color[.data$stage + 1] ),
      species = species),
    .data$substrate %in% show_sub)
  
  attr(dat, "species") <- species
  step_val <- if (!is.null(community$step)) community$step else if (!is.null(community$count$step)) community$count$step else if (!is.null(attr(community, "nstep"))) attr(community, "nstep") else step
  attr(dat, "step") <- step_val
  attr(dat, "layout") <- layout
  attr(dat, "width") <- width
  attr(dat, "step_density") <- step_density
  class(dat) <- c("ewing_substrate", class(dat))
  dat
}

ggplot_ewing_substrate <- function(object,
                                   xlab = "horizontal", ylab = "vertical",
                                   layout = attr(object, "layout"),
                                   width = attr(object, "width"),
                                   step_density = attr(object, "step_density"),
                                   layers = c("poly", "hex", "organisms", "centers", "labels"),
                                   ...)
{
  if (inherits(object, "ggplot")) return(object)
  if (is.null(layout)) layout <- "facet"
  if (is.null(width)) width <- 10
  if (is.null(step_density)) step_density <- 1
  
  species <- attr(object, "species")
  step <- attr(object, "step")
  
  # Allows same color for different pchar, but only one color per pchar.
  tmp <- dplyr::arrange(
    dplyr::distinct(
      dplyr::distinct(object, .data$pchar, .data$color),
      .data$pchar, .keep_all = TRUE),
    .data$pchar)
  col.palate <- tmp$color
  names(col.palate) <- as.character(tmp$pchar)
  
  if (layout == "hex") {
    topo <- substrate_topology(width = width, step = step_density)
    sub_obj <- create_substrate(topo, width = width, step = step_density)
    hex_overlay <- create_hex_overlay(sub_obj, step = step_density)
    
    p <- ggplot2::ggplot()
    if ("poly" %in% layers && nrow(sub_obj$poly) > 0) {
      p <- p + ggplot2::geom_polygon(data = sub_obj$poly, ggplot2::aes(x = x, y = y, group = substrate), 
                                     fill = NA, color = "black", linewidth = 0.7)
    }
    if ("hex" %in% layers && nrow(hex_overlay) > 0) {
      p <- p + ggplot2::geom_polygon(data = hex_overlay, ggplot2::aes(x = x, y = y, group = cell_id), 
                                     fill = NA, color = "gray75", linewidth = 0.3)
    }
    if ("organisms" %in% layers && nrow(object) > 0) {
      p <- p + ggplot2::geom_text(data = object, ggplot2::aes(x = x, y = y, label = pchar, color = pchar), 
                                  fontface = "bold", size = 4) +
        ggplot2::scale_color_manual(name = "Stage", values = col.palate) +
        ggplot2::guides(color = ggplot2::guide_legend(override.aes = list(label = names(col.palate))))
    }
    if ("centers" %in% layers && nrow(sub_obj$centers) > 0) {
      p <- p + ggplot2::geom_text(data = sub_obj$centers, ggplot2::aes(x = x, y = y, label = substrate), 
                                  color = "black", fontface = "bold", size = 4.5)
    }
    if ("labels" %in% layers && nrow(sub_obj$labels) > 0) {
      p <- p + ggplot2::geom_text(data = sub_obj$labels, ggplot2::aes(x = x, y = y, label = label), 
                                  color = "darkred", fontface = "bold", size = 3.5)
    }
    
    return(p + ggplot2::theme_void() + 
             ggplot2::theme(plot.margin = ggplot2::margin(2, 2, 2, 2, "pt")) +
             ggplot2::coord_fixed() + 
             ggplot2::ggtitle(paste(species, "on Hex Substrate Grid at", step, "steps")))
  }
  
  # Default Facet View by Substrate Component
  ggplot2::ggplot(object) +
    ggplot2::aes(.data$x, .data$y, label = .data$pchar, col = .data$pchar) +
    ggplot2::geom_text() +
    ggplot2::facet_wrap(~ substrate) +
    ggplot2::xlab(xlab) +
    ggplot2::ylab(ylab) +
    ggplot2::scale_color_manual(name = "Stage", values = col.palate) + 
    ggplot2::guides(color = ggplot2::guide_legend(override.aes = list(label = names(col.palate)))) +
    ggplot2::ggtitle(paste(species, "on substrate at", step, "steps"))
}
autoplot.ewing_substrate <- function(object, ...)
  ggplot_ewing_substrate(object, ...)

# --- Source: ewing_ageclass.R ---
ewing_ageclass <- function(community, substrate = TRUE, total = TRUE,
                           normalize = TRUE, ...) {
  nsim_val <- NULL
  nstep_val <- NULL
  
  if (inherits(community, "isle_royale_sim")) {
    if (is.null(community$history) || nrow(community$history) == 0) return(NULL)
    out <- community$history
    if (!substrate) {
      out <- dplyr::filter(out, .data$Type != "substrate")
    }
    if (total) {
      tot <- dplyr::mutate(
        dplyr::ungroup(
          dplyr::summarize(
            dplyr::group_by(out, .data$Species, .data$step, .data$time, .data$Type),
            Count = sum(.data$Count),
            .groups = "drop"
          )
        ),
        State = "total"
      )
      out <- dplyr::bind_rows(out, tot)
    }
    if (normalize) {
      out <- dplyr::ungroup(
        dplyr::mutate(
          dplyr::group_by(out, .data$Species, .data$State, .data$Type),
          Count = {
            m <- max(.data$Count, na.rm = TRUE)
            if (!is.na(m) && m > 0) .data$Count / m else 0
          }
        )
      )
    }
    ordered_levels <- unique(c("calf", "yearling", "adult", "senior", "pup", "subadult", "total"))
    out$State <- factor(out$State, levels = ordered_levels[ordered_levels %in% unique(out$State)])
    attr(out, "nstep") <- community$nstep
    attr(out, "units") <- "days"
    class(out) <- c("ewing_ageclass", class(out))
    return(out)
  }
  
  if (inherits(community, "ewing_discrete")) {
    nsim_val <- attr(community, "nsim")
    nstep_val <- attr(community, "nstep")
    community <- community[[1]]
  }
  count <- readCount(community)
  if(!length(count)) return(NULL)
  species <- names(count)
  if(is.null(species)) return(NULL)
  
  ageclass <- list()
  for( i in species ) {
    ageclass[[i]] <- levels( getOrgFuture( community, i, "ageclass" ))
  }
  substrates <- list()
  for( i in species ) {
    substrates[[i]] <- levels( getOrgInteract( community,, i, "substrate" ))
  }
  out <- list()
  for(i in species) {
    out[[i]] <- dplyr::mutate(
      tidyr::pivot_longer(
        tibble::tibble(
          as.data.frame(count[[i]])),
        dplyr::any_of(c(ageclass[[i]], substrates[[i]])), 
        names_to = "State",
        values_to = "Count"),
      Type = ifelse(.data$State %in% substrates[[i]], "substrate", "ageclass"))
  }
  out <- dplyr::bind_rows(out, .id = "Species")
  if(!substrate) {
    out <- dplyr::filter(out, .data$Type != "substrate")
  }
  if(total) {
    tot <- dplyr::mutate(
      dplyr::ungroup(
        dplyr::summarize(
          dplyr::group_by(
            out,
            .data$Species, .data$step, .data$time, .data$future, .data$Type),
          Count = sum(.data$Count),
          .groups = "drop")
      ),
      State = "total")
    out <- dplyr::bind_rows(out, tot)      
  }
  if(normalize) {
    out <- dplyr::ungroup(
      dplyr::mutate(
        dplyr::group_by(
          out,
          .data$Species, .data$State, .data$Type),
        Count = {
          m <- max(.data$Count, na.rm = TRUE)
          if (!is.na(m) && m > 0) .data$Count / m else 0
        }))
  }
  subs <- if (substrate) unlist(substrates) else NULL
  if (length(species) > 1) {
    ordered_levels <- unique(c(ageclass[[species[1]]], "total", unlist(ageclass[species[-1]]), subs))
  } else {
    ordered_levels <- unique(c(unlist(ageclass), "total", subs))
  }
  out$State <- factor(out$State, levels = ordered_levels)
  
  attr(out, "nstep") <- if (!is.null(nstep_val)) nstep_val else attr(community, "nstep")
  if (is.null(attr(out, "nstep")) && !is.null(out$step)) {
    attr(out, "nstep") <- max(out$step, na.rm = TRUE)
  }
  attr(out, "nsim") <- if (!is.null(nsim_val)) nsim_val else attr(community, "nsim")
  attr(out, "units") <- if (inherits(community, "isle_royale_sim")) "days" else tryCatch(getOrgFeature(community, species[1], "units"), error = function(e) "time")
  
  class(out) <- c("ewing_ageclass", class(out))
  out
}
ggplot_ewing_ageclass <- function(object, main = NULL, title = NULL, x_var = c("step", "time"), time_unit = NULL, ... )
{
  x_var <- match.arg(x_var)
  
  if (is.null(time_unit)) {
    time_unit <- attr(object, "units")
  }
  if (is.null(time_unit) || is.na(time_unit) || time_unit == "NA") {
    time_unit <- "time"
  }
  
  if (is.null(title)) title <- main
  if (is.null(title)) {
    nstep <- attr(object, "nstep")
    if (is.null(nstep) && !is.null(object$step)) {
      nstep <- max(object$step, na.rm = TRUE)
    }
    nsim <- attr(object, "nsim")
    unit_str <- if (x_var == "step") "steps" else time_unit
    time_hdr <- if (x_var == "step") "Steps" else paste0(toupper(substring(time_unit, 1, 1)), substring(time_unit, 2))
    if (!is.null(nstep)) {
      if (!is.null(nsim) && nsim > 1) {
        title <- paste0("Age Classes over ", time_hdr, " (", nstep, " ", unit_str, ", nsim = ", nsim, ")")
      } else {
        title <- paste0("Age Classes over ", time_hdr, " (", nstep, " ", unit_str, ")")
      }
    } else {
      title <- paste0("Age Classes over ", time_hdr)
    }
  }
  
  species_vec <- unique(as.character(object$Species))
  if (length(species_vec) == 0) species_vec <- "Organism"
  
  p_list <- list()
  
  for (sp in species_vec) {
    df_sp <- object[object$Species == sp, , drop = FALSE]
    if (is.factor(df_sp$State)) {
      df_sp$State <- droplevels(df_sp$State)
    }
    
    x_col <- if (x_var == "step" && "step" %in% names(df_sp)) "step" else "time"
    x_lbl <- if (x_var == "step") "steps" else time_unit
    
    sp_title <- paste(toupper(substring(sp, 1, 1)), substring(sp, 2), " Age Classes", sep = "")
    
    p_sub <- ggplot2::ggplot(df_sp, ggplot2::aes(x = .data[[x_col]], y = .data$Count, col = .data$State, group = .data$State)) +
      ggplot2::geom_step(na.rm = TRUE, linewidth = 0.8) +
      ggplot2::geom_point(size = 2, na.rm = TRUE) +
      ggplot2::theme_minimal() +
      ggplot2::labs(
        title = sp_title,
        x = x_lbl,
        y = "Count",
        color = "Age Class"
      ) +
      ggplot2::theme(
        plot.title = ggplot2::element_text(size = 11, face = "bold", hjust = 0.5),
        legend.position = "right"
      )
      
    p_list[[sp]] <- p_sub
  }
  
  if (length(p_list) == 1) {
    return(p_list[[1]] + ggplot2::ggtitle(title))
  }
  
  grid_plots <- cowplot::plot_grid(plotlist = p_list, ncol = length(p_list), align = "h")
  title_widget <- cowplot::ggdraw() + 
    cowplot::draw_label(title, fontface = 'bold', x = 0.5, hjust = 0.5, size = 13)
  
  cowplot::plot_grid(title_widget, grid_plots, ncol = 1, rel_heights = c(0.12, 1))
}
autoplot.ewing_ageclass <- function(object, x_var = c("step", "time"), ...) {
  x_var <- match.arg(x_var)
  ggplot_ewing_ageclass(object, x_var = x_var, ...)
}


# --- Source: ewing_envelope.R ---
ewing_envelope <- function(object, species, item, ordinate = "time", increment = 0.5) {
  # Pull out `ordinate` and `item` for each run 
  pulled <-  
    tidyr::fill(
      dplyr::arrange(
        tidyr::pivot_wider(
          dplyr::bind_rows(
            purrr::map(
              object,
              function(x) {
                dplyr::distinct(
                  as.data.frame(x[[species]][,c(ordinate, item)]),
                  .data[[ordinate]],
                  .keep_all = TRUE)
              }),
            .id = "run"),
          names_from = "run",
          values_from = item),
        .data[[ordinate]]),
      -dplyr::matches(ordinate))
  
  out <- GET::create_curve_set(list(r = as.matrix(pulled)[,1], 
                                    obs = as.matrix(pulled[,-1])))
  class(out) <- c("ewing_envelope", class(out))
  attr(out, "count") <- attr(object, "count")
  attr(out, "nstep") <- attr(object, "nstep")
  attr(out, "nsim") <- attr(object, "nsim")
  
  attr(out, "species") <- species
  attr(out, "item") <- item
  attr(out, "ordinate") <- ordinate
  out
}
ewing_envelopes <- function(object) {
  species <- attr(object, "species")
  items <- attr(object, "items")
  ordinate <- attr(object, "ordinate")
  nstep <- attr(object, "nstep")
  count <- attr(object, "count")
  nsim <- attr(object, "nsim")
  confidence <- (nsim > 2)
  
  envs <- as.list(species)
  names(envs) <- species
  if(confidence) {
    confs <- envs
  } else {
    confs <- NULL
  }
  for(specy in species) {
    env1 <- as.list(items[[specy]])
    if(confidence) {
      conf1 <- env1
    }
    for(item in items[[specy]]) {
      env1[[item]] <- ewing_envelope(object, specy, item, ordinate)
      if(confidence) {
        conf1[[item]] <- GET::fBoxplot(env1[[item]], type = 'area')
      }
    }
    envs[[specy]] <- env1
    if(confidence) {
      confs[[specy]] <- conf1
    }
  }
  
  object <- list(env = envs, conf = confs)
  class(object) <- c("ewing_envelopes", class(object))
  attr(object, "species") <- species
  attr(object, "items") <- items
  attr(object, "ordinate") <- ordinate
  attr(object, "nstep") <- nstep
  attr(object, "count") <- count
  attr(object, "nsim") <- nsim
  attr(object, "confidence") <- confidence
  object
}
summary.ewing_envelopes <- function(object, species = NULL, verbose = TRUE, ...) {
  # object$conf[[specy]][[item]] is time by 6-num boxplot summary
  if(verbose) {
    nstep <- attr(object, "nstep")
    count <- attr(object, "count")
    nsim <- attr(object, "nsim")
    cat(nsim, "Runs of ",
        nstep, "Steps for", 
        paste(names(count), count, sep = "=", collapse = ", "), "\n")
  }
  out <- print(object, species, ...)
  if(!is.null(out)) {
    out <- dplyr::ungroup(
      dplyr::filter(
        dplyr::group_by(
          out,
          .data$species, .data$item),
        (.data$r == 0) | (.data$r == max(.data$r))))
  }
  out
}
print.ewing_envelopes <- function(x, species = NULL, ...) {
  # x$conf[[specy]][[item]] is time by 6-num boxplot summary
  if(is.null(x$conf)) {
    return(NULL)
  }
  out <- dplyr::bind_rows(
    purrr::map(
      x$conf,
      function(x) {
        # somehow get summary across species and items using as.data.frame
        x <- x[names(x) != ""]
        dplyr::bind_rows(
          purrr::map(
            x,
            as.data.frame),
          .id = "item")
      }),
    .id = "species")
  if(!is.null(species)) {
    if(species %in% unique(out$species)) {
      sp <- species
      out <- dplyr::filter(out, species == sp)
    }
  }
  dplyr::mutate(out, dplyr::across(where(is.numeric), function(x) pmax(x,0)))
  out
}
ggplot_ewing_envelopes <- function(object, confidence = FALSE, main = "", ...) {
  if(inherits(object, "ewing_discrete")) {
    object <- ewing_envelopes(object)
  }
  species <- attr(object, "species")
  items <- attr(object, "items")
  ordinate <- attr(object, "ordinate")
  nstep <- attr(object, "nstep")
  count <- attr(object, "count")
  nsim <- attr(object, "nsim")
  confidence <- confidence & attr(object, "confidence")
  
  patch <- list()
  for(specy in species) {
    p <- list()
    for(item in items[[specy]]) {
      if(confidence) {
        p[[item]] <- plot(object$conf[[specy]][[item]], main = main) + 
          ggplot2::labs(x = "time", y = item) +
          ggplot2::ggtitle(main) +
          ggplot2::ylim(0, NA)
        
      } else {
        p[[item]] <- ggplot_ewing_envelope(object$env[[specy]][[item]])
      }
    }
    patch[[specy]] <- cowplot::plot_grid(plotlist = p, nrow = length(p))
  }
  
  # NEED TO get attribute count and nstep in here
  patch <- cowplot::plot_grid(plotlist = patch, ncol = length(patch)) 
  # Add a title. <https://wilkelab.org/cowplot/articles/plot_grid.html>
  title <- cowplot::ggdraw() + 
    cowplot::draw_label(
      paste(nsim, "Runs of ", nstep, "Steps for", 
            paste(species, count, sep = "=", collapse = ", ")),
      x = 0, hjust = 0
    ) +
    ggplot2::theme(
      # add margin on the left of the drawing canvas,
      # so title is aligned with left edge of first plot
      plot.margin = ggplot2::margin(0, 0, 0, 7)
    )
  cowplot::plot_grid(title, patch, ncol = 1, rel_heights = c(0.1, 1))
}

ggplot_ewing_envelope <- function(object, cols = c("#21908CFF", "#440154FF", "#5DC863FF"), 
                                  main = "", ...) {
  # Kludge. GET::forder needs at least 3 points; cols can be at most length(object).
  lcols <- length(cols)
  nsim <- ncol(object$funcs)
  if(nsim >= min(3, lcols)) {
    A <- GET::forder(object, measure = 'area')
    lcols <- min(lcols, length(object))
    idx <- order(A)[seq_len(lcols)]
    cols <- cols[seq_len(lcols)]
  } else {
    lcols <- nsim
    idx <- seq_len(lcols)
    cols <- cols[seq_len(lcols)]
  }
  
  item <- attr(object, "item")
  species <- attr(object, "species")
  ordinate <- attr(object, "ordinate")
  
  if(length(object) >= 50) {
    p <- plot(object, idx = idx, col_idx = cols, main = main)
  } else {
    p <- plot(object)
  }
  p + 
    ggplot2::labs(x = ordinate, y = item) +
    ggplot2::ggtitle(paste(species, item))
}
autoplot.ewing_envelope <- function(object, ...) {
  ggplot_ewing_envelope(object, ...)
}

# --- Source: ewing_snapshot.R ---
ewing_snapshot <- function(object, step = 0, ...)
{
  out <- list(step = step,
              ageclass = ewing_ageclass(object, ...))

  species <- get.species(object)
  subs <- list()
  for(j in species) {
    subs[[j]] <- ewing_substrate(object, j, step = step, ...)
  }
  out$substrate <- subs
  
  class(out) <- c("ewing_snapshot", "ewing", "list")
  out
}

# --- Source: temp.R ---
## $Id: temp.R,v 1.0 2002/12/09 yandell@stat.wisc.edu Exp $
##
## Functions for Bland Ewing's modeling.
##
##     Copyright (C) 2000,2001,2002 Brian S. Yandell.
##
## 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, or (at your option) any
## later version.
##
## These functions are distributed in the hope that they 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.
##
## The text of the GNU General Public License, version 2, is available
## as http://www.gnu.org/copyleft or by writing to the Free Software
## Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
##
###########################################################################################
## initTemp( community, lo.hour, hi.hour )  ### creates Temperature object
## activeTemp( community, lo.hour, hi.hour )    ### updates Temperature object
## checkTime( ) # check if activeTemp needs updating to cover time interval
##
## temp.design( )
## temp.plot( )
###########################################################################################
rescale.temp <- function( low, high, newry = ry, newrx = rx,
  ry = range( c( stats::predict( low, low$knots )$y, stats::predict( high, high$knots )$y )))
{
  if( max( abs( ry - newry )) > 0 ) {
    tmpy <- diff( newry ) / diff( ry )
    low$coefficients <- low$coefficients * tmpy
    high$coefficients <- high$coefficients * tmpy
    tmpy <- newry[1] - ry[1] * tmpy
    low$coefficients[,1] <- tmpy + low$coefficients[,1]
    high$coefficients[,1] <- tmpy + high$coefficients[,1]
  }
  rx <- range( low$knots, high$knots )
  if( max( abs( rx - newrx )) > 0 ) {
    newx <- diff( newrx ) / diff( rx )
    low$knots <- newrx[1] + newx * low$knots
    high$knots <- newrx[1] + newx * high$knots
    tmp <- 1
    for( i in seq( 2, ncol( low$coefficients ))) {
      tmp <- tmp * newx
      low$coefficients[,i] <- low$coefficients[,i] / tmp
      high$coefficients[,i] <- high$coefficients[,i] / tmp
    }
  }
  list( low = low, high = high )
}
###########################################################################################
### Temperature data structure
### Min minimum temperature for degree-day computations
### Time    list of hours when temperature changes through a day
### Base    list of temperature shifts through a day
###     list names indicate first day Hour and Base applies
### Low spline fit for daily low temperatures
### High    spline fit for daily high temperatures
### DegreeDay   spline fit (hour->DD) for currently active days
### Hour        ramped backspline fit (DD->hour) for currently active days
### Idea is that DegreeDay and Hour are updated whenever a future event is scheduled
### past the latest future event already scheduled. At that time, the first
### and last time of fit are both adjusted. This can be done without rebuilding
### the whole spline fit by appropriate adjustment of knots and coefficents.
### Steps:  (1) combine Hour, Low and High to get knots
###     (2) build spline coefficients
###########################################################################################
temp.spline <- function( community, hour, temp, start = 0,
  mintemp = getTemp( community, "Min" ), cumulative = TRUE,
  mult = getTemp( community, "Unit" ) )
{
  if( is.data.frame( hour ) & missing( temp )) {
    temp <- hour$temp
    hour <- hour$hour
  }
  ## drop low value if ones on either side are low
  low <- temp <= mintemp
  toolow <- low & c(FALSE,low[-length(low)]) & c(low[-1],FALSE)
  hour <- hour[!toolow]
  temp <- temp[!toolow]
  lh <- length( hour )
  ## expand single low in middle to two
  low <- temp <= mintemp
  toolow <- low & c(FALSE,!low[-length(low)]) & c(!low[-1],FALSE)
  if( any( toolow )) {
    hour <- c(hour,hour[toolow])
    temp <- c(temp,temp[toolow])
    temp <- temp[ order( hour ) ]
    hour <- sort( hour )
  }
  ## truncate on left
  low <- temp <= mintemp & c(temp[-1] > mintemp,FALSE)
  low1 <- c(FALSE,low[-lh])
  if( any( low ))
    hour[low] <- hour[low] + ( hour[low1] - hour[low] ) * ( mintemp - temp[low] ) /
      ( temp[low1] - temp[low] )
  ## truncate on right
  low <- temp <= mintemp & c(FALSE,temp[-lh] > mintemp)
  low1 <- c(low[-1],FALSE)
  if( any( low ))
    hour[low] <- hour[low] + ( hour[low1] - hour[low] ) * ( mintemp - temp[low] ) /
      ( temp[low1] - temp[low] )
  temp[ temp < mintemp ] <- mintemp
  temp <- temp[ !duplicated( hour ) ]
  hour <- unique( hour )

  ## linear interpolating spline for temp
  lh <- length( hour ) - 1
  h0 <- 1:lh
  aa <- ( temp[1+h0] - temp[h0] ) / ( hour[1+h0]-hour[h0] )
  aa <- c( aa, aa[lh] )
  bb <- temp - mintemp
  s <- list( knots = hour, coefficients = cbind( bb,aa,0,0) )
  dimnames( s$coefficients ) <- list( paste( floor( hour / mult ), round( hour %% mult ),
    sep = "." ), c("const","linear","quad","cubic") )
  attr(s,"formula") <- temp ~ hour
  class( s ) <- c("npolySpline","polySpline","spline")
  if( !cumulative )
    return( s )

  ## quadratic spline for cumulative temp
  aa <- s$coefficients[,3] <- s$coefficients[,2] / 2 / mult / mult
  lh <- length( aa ) - 1
  h0 <- 1:lh
  h1 <- 1 + h0
  hour <- s$knots
  bb <- s$coefficients[,2] <- s$coefficients[,1] / mult
  cc <- ( hour[h1] - hour[h0] ) * ( bb[h0] + aa[h0] *
    ( hour[h1] - hour[h0] ))
  s$coefficients[,1] <- start + c( 0, cumsum( cc ))
  s
}
###########################################################################################
temp.repeat <- function( community, period = range( days ))
{
  lodays <- range( getTemp( community, "Low" )$knots )
  hidays <- range( getTemp( community, "High" )$knots )
  days <- c( max( lodays[1], hidays[1] ), min( lodays[2], hidays[2] ))
  lodays <- period[1] >= days[1] & period[1] <= days[2]
  if( lodays )
    days[1] <- period[1]
  hidays <- period[2] <= days[2] & period[2] >= days[1]
  if( hidays )
    days[2] <- period[2]
  if( !( lodays & hidays )) {
    stop( paste( "\nSimulation period is outside of Temperature days:\n period =",
      paste( round( period ), collapse = "," ), "; days =",
      paste( round( days ), collapse = "," ), "\nNeed to run temp.design() and start over!" ))
  }
  period <- days

  days <- seq( days[1], days[2] )
  low <- stats::predict( getTemp( community, "Low" ), days )$y
  high <- stats::predict( getTemp( community, "High" ), days )$y
  periods <- c( as.numeric( names( getTemp( community, "Time" ))), Inf )
  temps <- hours <- numeric( )
  period[2] <- period[2] + 1
  for( i in seq( length( periods ) - 1 )) {
    day <- max( period[1], periods[i] )
    this.period <- days >= day & days < min( period[2], periods[i+1] )
    n <- sum( this.period )
    if( n ) {
      if( !is.null( getTemp( community, "Time", i ))) {
        time <- getTemp( community, "Time", i )
        base <- getTemp( community, "Base", i )
      }
      h <- length( time )
      lotemp <- rep( low[this.period], rep(h,n) )
      hitemp <- rep( high[this.period], rep(h,n) )
      temp <- ( base - min( base )) / diff( range( base ))
      temps <- c( temps, rep( temp, n ) * ( hitemp - lotemp ) + lotemp )

      hours <- c( hours, rep( time, n ) + rep( getTemp( community, "Unit" ) *
        seq( day, day + n - 1 ), rep(h,n) ))
    }
  }
  day <- days == period[2]
  if( any( day )) {
    temps <- c( temps, low[day] + temp[1] * ( high[day] -
      getTemp( community, "Low" )[day] ))
    hours <- c( hours, getTemp( community, "Unit" ) * period[2] )
  }
  data.frame( hour = hours, temp = temps )
}
##########################################################################################
showTemp <- function( community )
{
  cat( "Temperature set for days",
      paste( range( getTemp( community, "Low" )$knots ), collapse = " to " ), "\n" )
  cat( "Daily low temperature range:",
      paste( round( range( stats::predict( getTemp( community, "Low" ))$y )),
            collapse = " to " ), "\n" )
  cat( "Daily high temperature range:",
      paste( round( range( stats::predict( getTemp( community, "High" ))$y )),
            collapse = " to " ), "\n" )
  if( !is.null( getTemp( community, "DegreeDay" ) ))
    cat( "Active temperature range:",
        paste( round( range( getTemp( community, "DegreeDay", "knots" ) )),
              collapse = " to " ), "\n" )
  cat( "Run temp.design() to adjust temperature range\n" )
}
##########################################################################################
activeTemp <- function( community,
                       lo.hour = min( getTemp( community, "DegreeDay", "knots" ) ),
                       hi.hour = max( getTemp( community, "DegreeDay", "knots" ) ),
                       degreeday, messages = TRUE )
{
  unit <- getTemp( community, "Unit" )
  if( missing( hi.hour )) {
    hi.hour <- if( length( lo.hour ) > 1 )
      lo.hour[2]
    else
      lo.hour + unit
  }
  ## period is in units of hours
  period <- c( floor( lo.hour[1] / unit ), ceiling( hi.hour / unit ))
  if( missing( degreeday )) {
    degreeday <- if( is.null( getTemp( community, "DegreeDay" ) ))
      0
    else
      getDegreeDay( community, lo.hour[1] )
  }
  if( is.na( degreeday ))
    degreeday <- 0
  community <- setTemp( community, "DegreeDay",
                       temp.spline( community, temp.repeat( community, period ),
                                   start = degreeday ))
  community <- setTemp( community, "Hour",
                       break.backSpline( getTemp( community, "DegreeDay" )))

  if(messages) {
    tmp <- period * unit
    names( tmp ) <- c("lo.hour","hi.hour")
    print( tmp )
  }
  community
}
###########################################################################################
updateTemp <- function( community,
                       period = range( getTemp( community, "DegreeDay", "knots" ) ))
{
  ## period is in units of hours
  first <- period[1]
  last <- period[2]

  s <- getTemp( community, "DegreeDay" )
  knots <- s$knots
  ## drop earlier times that are now in the past
  drop <- sum( knots < first ) - 1
  nk <- length( knots )
  change <- drop > 0
  if( change ) {
    s$knots <- knots[ - seq( drop ) ]
    s$coefficients <- s$coefficients[ - seq( drop ), ]
  }
  ## add new days to include last
  period <- ceiling( c( knots[nk], last ) / getTemp( community, "Unit" ) )
  if( period[1] <= period[2] ) {
    change <- TRUE
    news <- temp.spline( community, temp.repeat( community, period ),
      start = getHour( getTemp( community, "Unit" ) * period[1] ))
    nk <- length( s$knots )
    if( s$knots[nk] == news$knots[1] ) {
      s$knots <- s$knots[-nk]
      s$coefficients <- s$coefficients[-nk,]
    }
    else
      s$coefficients[nk,] <- news$coefficients[1,]
    s$knots <- c( s$knots, news$knots )
    s$coefficients <- rbind( s$coefficients, news$coefficients )    
  }
  if( change ) {
    community <- setTemp( community, "DegreeDay", s )
    community <- setTemp( community, "Hour", break.backSpline( s ))
  }
  community
}
###########################################################################################
ramp.backSpline <- function( s )
{
  ## ramped backspline is a trick to get backSpline when curve is flat in spots
  ## if tmp <- stats::predict( ramp.backSpline( s ))
  ## then plot tmp$y versus tmp$x-tmp$y to "recover" original curve.
  ## problem is that one cannot recover particular x this way!

  s$coefficients[,1] <- s$coefficients[,1] + s$knots
  s$coefficients[,2] <- s$coefficients[,2] + 1
  splines::backSpline( s )
}
###########################################################################################
break.backSpline <- function( tmp )
{
  ## alternative to ramped backSpline that first removes flat regions (slope 0)
  ## problem remains that leftover may still have slope 0 at a point
  ## this can cause anomolous results!

  ## find flat regions and cut out
  tmpc <- diff(tmp$coefficients[,1]) == 0 
  tmpk <- cumsum( diff(tmp$knots) * ( tmpc ))
  tmpk <- c(tmpk,tmpk[length(tmpk)])
  tmp$knots <- tmp$knots - tmpk
  tmpc <- c(!tmpc,TRUE)
  tmp$knots <- tmp$knots[tmpc]
  tmp$coefficients <- tmp$coefficients[tmpc,]
  tmp$breaks
  nb <- dim( tmp$coefficients )

  ## kludge for backspline: cannot handle slope of zero
  tmpn <- tmp$coefficients[,2] == 0
  if( any( tmpn )) {
    tmpn <- seq( tmpn )[ tmpn ]
    tmp$coefficients[ tmpn, 2:nb[2] ] <-
      ( tmp$coefficients[ pmin( nb[1], tmpn + 1 ), 2:nb[2] ] +
       tmp$coefficients[ pmax(     1, tmpn - 1 ), 2:nb[2] ] ) / 2
  }

  ## back spline
  tmpb <- splines::backSpline(tmp )

  if( any( tmpc )) {
    ## shift back spline based on breaks
    tmpb$coefficients[,1] <- tmpb$coefficients[,1] + tmpk[tmpc]
  }
  tmpb
}
###########################################################################################
getDegreeDay <- function( community, hour )
{
  stats::predict( getTemp( community, "DegreeDay" ), hour )$y
}
###########################################################################################
getHour <- function( community, dd )
{
  stats::predict( getTemp( community, "Hour" ), dd )$y
}
###########################################################################################
getTime <- function( community, species, x )
{
  if( is.na(x)){
    cat("getTime missing value\n")
    browser()
  }
  switch( getOrgFeature( community, species, "units" ),
    ## organisms on hour basis assumed to be active only 6am-6pm
    hr = getDegreeDay( community,
      ( getTemp( community, "Unit" ) / 2 + x + floor( x / getTemp( community, "Unit" ) )) / 2 ),
    DD = x )
}
###########################################################################################
checkTime <- function( community, x, base, units )
{
## NOTE: Sometimes base can be negative!! (reset to 0)
  if( units == "hr" ) {
    x <- max( x )
#    print( c( base = base, x = x, knots = range( getTemp( community, "DegreeDay", "knots" ))))
    if( x > max( getTemp( community, "DegreeDay", "knots" )))
      community <- activeTemp( community, max( base, 0 ),
                              x + getTemp( community, "Unit" ), messages = FALSE )
  }
  community
}
###########################################################################################
transTime <- function( community, org1name, org2name, x,
                      unit1 = getOrgFeature( community, org1name, "units" ),
                      unit2 = getOrgFeature( community, org2name, "units" ))
{
  if( is.na(x)){
    cat("transTime missing value\n")
    browser()
  }
  if( unit1 == unit2 )
    return( x )
  switch( unit1,
    ## organisms on hour basis assumed to be active only 6am-6pm
    hr = getDegreeDay( community,
      ( getTemp( community, "Unit" ) / 2 + x + floor( x / getTemp( community, "Unit" ))) / 2 ),
    DD = getHour( x ))
}
###########################################################################################
### To do:
### 1. interactive designer for hourly temp fluctation over one day
### 2. interactive designer for daily lows and highs over season: temp.design() DONE
### 3. check future event trees hour vs. DD
### 4. schedule interaction events with hour-DD translation
### 5. make aphytis dormant at night
###########################################################################################

# --- Source: initTemp.R ---
##########################################################################################
### simulation temperature administration
##########################################################################################
initTemp <- function( community, lo.hour = 0, hi.hour = getTemp( community, "Unit" ),
                      days = TemperaturePar["Days"], 
                      messages = TRUE, datafile = "", ... )
{
  if(messages) {
    cat( "Initializing Temperature Profile ...\n" )
  }
  Temperature <- list()
  
  TemperaturePar <- getOrgData(community, "temperature", "par", messages, datafile)
  #  mydata( "TemperaturePar", getOrgInfo( community, "package" ), messages = messages)
  TemperaturePar <- array( TemperaturePar[,"value"],
                           dimnames = list( row.names( TemperaturePar )))
  Temperature$Unit <- TemperaturePar["Unit"]
  Temperature$Min <- TemperaturePar["Min"]
  
  ## set up daily temperature base
  
  TemperatureBase <- getOrgData(community, "temperature", "base", messages, datafile)
  #  mydata( "TemperatureBase", getOrgInfo( community, "package" ), messages = messages)
  Temperature$Time <- split( TemperatureBase$Time, TemperatureBase$Day )
  Temperature$Base <- split( TemperatureBase$Base, TemperatureBase$Day )
  
  community$temp <- Temperature
  
  tmp <- seq( lo.hour / Temperature$Unit,
              days + 1 + ( hi.hour / Temperature$Unit ),
              length = TemperaturePar["Length"] )
  tmp0 <- seq( 0, 1, length = TemperaturePar["Length"] )
  tmp1 <-  0.25 * ( TemperaturePar["HighBeg"] - TemperaturePar["LowBeg"] )
  Temperature$Low <- splines::interpSpline( tmp, TemperaturePar["LowBeg"] * ( 1 - tmp0 ) +
                                              TemperaturePar["LowEnd"] * tmp0 +
                                              sin( pi * 4 * tmp0 ) * tmp1 )
  Temperature$High <- splines::interpSpline( tmp, TemperaturePar["HighBeg"] * ( 1 - tmp0 ) +
                                               TemperaturePar["HighEnd"] * tmp0 +
                                               sin( pi * ( 0.125 + 4 * tmp0 )) * tmp1 )
  
  Temperature$DegreeDay <- NULL
  
  if(messages) {
    cat( "Base daily temperature fluctuation:\n" )
  }
  for( i in names( Temperature$time )) {
    cat( "From day", i, ":\n" )
    tmp <- Temperature$Base[[i]]
    names( tmp ) <- Temperature$Time[[i]]
    print( tmp )
  }
  community$temp <- Temperature
  
  if(messages) {
    showTemp( community )
    cat( "Initial active temperature:\n" )
  }
  activeTemp( community, lo.hour, hi.hour, getTemp( community, "Time", 1 )[1],
              messages = messages)
}
###########################################################################################
getTemp <- function( community, element, sub )
{
  tempelem <- community$temp[[element]]
  if( !missing( sub ))
    tempelem <- tempelem[[sub]]
  tempelem
}
###########################################################################################
setTemp <- function( community, element, value )
{
  community$temp[[element]] <- value
  community
}

# --- Source: temp.design.R ---
temp.design <- function( community, nspline = 8, n = 1, horizontal = TRUE,
                         col = c(low="blue",high="red") )
{
  low <- getTemp( community, "Low" )
  high <- getTemp( community, "High" )
  is.data <- !is.null( low )
  if( !is.data ) {
    tmp <- seq( 0, 60, length = nspline )
    low <- interpSpline( tmp, 60 + 0.125 * tmp + sin( 0.25 * tmp ))
    high <- interpSpline( tmp, 70 + 0.15 * tmp + sin(( pi / 8 ) + 0.225 * tmp ))
  }
  ## plot curve and surrounding axes
  par( mfrow = c(1,1), mar = rep(4.1,4))
  cat( "Switch to Graphic Screen to Adjust High and Low Temperatures\n" )
  
  plotit <- function( low, high, fig = fig, horizontal = FALSE, strip = .25, margin = 0 )
  {
    lowpred <- stats::predict( low, low$knots )
    highpred <- stats::predict( high, high$knots )
    ylim <- range( c( lowpred$y, highpred$y ))
    xlim <- range( c( lowpred$x, highpred$x))
    xlim <- xlim + c(-1,1) * margin * diff( xlim )
    if( horizontal ) {
      if( diff( ylim ) == 0 )
        ylim <- ylim * c(.75,1.25)
      separator <- ylim[2]
      ylim[2] <- ylim[2] + strip * diff( ylim )
    }
    else {
      separator <- xlim[2]
      xlim[2] <- xlim[2] + strip * diff( xlim )
    }
    axt <- c("n","s")
    tmpar <- par( xaxt = axt[1+horizontal], yaxt = axt[2-horizontal] )
    plot( xlim, ylim, xlim = xlim, ylim = ylim, type="n", xlab = "", ylab = "" )
    par( xaxt = "s", yaxt = "s" )
    title( fig )
    mtext( "day", 1, 2 )
    mtext( "temp", 2, 2 )
    if( horizontal ) {
      p <- pretty( c(ylim[1],separator) )
      axis( 2, p[ p <= separator ] )
      abline( h = separator, lty = 2 )
    }
    else {
      p <- pretty( c(xlim[1],separator) )
      axis( 1, p[ p <= separator ] )
      abline( v = separator, lty = 2 )
    }
    points( highpred$x, highpred$y, lwd = 4 )
    curve.plot( highpred, n = n, action = "refresh", fit = high, backfit = FALSE,
                save.ends = 3, col = "red", lwd = 2 * ( 1 + ( fig == "high" )))
    points( lowpred$x, lowpred$y, lwd = 4 )
    curve.plot( lowpred, n = n, action = "refresh", fit = low, backfit = FALSE,
                save.ends = 3, col = "blue", lwd = 2 * ( 1 + ( fig == "low" )))
    separator
  }
  ## place commands along right strip of plot, highlighting current command
  plotcmd <- function( ans, fig, cmds, cmdlocs, usr, col = "green", rest = "black",
                       horizontal = TRUE, data = FALSE )
  {
    ans <- c( ans, fig )
    if( data )
      ans <- c( ans, "data" )
    tmp <- is.na( match( cmds, ans ))
    if( any( tmp )) for( i in unique( cmdlocs$adj )) {
      tmpi <- tmp & i == cmdlocs$adj
      if( any( tmpi ))
        text( cmdlocs$x[tmpi], cmdlocs$y[tmpi], cmds[tmpi], col = rest, adj = i )
    }
    if( any( !tmp )) for( i in unique( cmdlocs$adj )) {
      tmpi <- !tmp & i == cmdlocs$adj
      if( any( tmpi ))
        text( cmdlocs$x[tmpi], cmdlocs$y[tmpi], cmds[tmpi], col = col, adj = i )
    }
  }
  cmds <- c("add","delete","replace","rescale","","finish","refresh","restart",
            "","data","high","low")
  newlocs <- if( horizontal )
    function( cmds, data = FALSE, usr )
    {
      if( !data )
        cmds <- cmds[ cmds != "data" ]
      n <- length( cmds )
      blank <- seq( n )[ cmds == "" | cmds == " " ]
      tmp <- diff(usr[3:4]) / 20
      m <- mean( usr[1:2] )
      y <- usr[4] + 0.5 * tmp - c( tmp * seq( blank[1] - 1 ), 0,
                                   tmp * seq( blank[2] - blank[1] - 1 ), 0,
                                   tmp * seq( n - blank[2] ))
      x <- c( rep( usr[1], blank[1] - 1 ), mean( m, usr[1] ),
              rep( m, blank[2] - blank[1] - 1 ), mean( m, usr[2] ),
              rep( usr[2], n - blank[2] ))
      adj <- c( rep( 0, blank[1] ),
                rep( 0.5, blank[2] - blank[1] ),
                rep( 1, n - blank[2] ))
      tmp <- data.frame( x = x, y = y, adj = adj )
      cmds[blank[2]] <- " "
      row.names( tmp ) <- cmds
      tmp
    }
  else
    function( cmds, data = FALSE, usr )
    {
      if( !data )
        cmds <- cmds[ cmds != "data" ]
      n <- length( cmds )
      blank <- seq( n )[ cmds == "" | cmds == " " ]
      tmp <- diff(usr[3:4]) / 20
      m <- mean( usr[3:4] )
      tmp <- c( usr[4] - tmp * seq( blank[1] - 1 ),
                mean( m, usr[4] ),
                m + tmp * ( seq( blank[1] + 1, blank[2] - 1 ) - mean( blank )),
                mean( m, usr[3] ),
                usr[3] + tmp * seq( n - blank[2] ))
      tmp <- data.frame( x = rep( usr[2], n ), y = tmp, adj = rep( 1, n ))
      cmds[blank[2]] <- " "
      row.names( tmp ) <- cmds
      tmp
    }
  
  newans <- ans <- "replace"
  par( mar = c(4.1,4.1,3.1,4.1),omi=rep(.25,4))
  fig <- "low"
  fit <- low
  separator <- plotit( low, high, fig, horizontal )
  
  usr <- par("usr")
  cmdlocs <- newlocs( cmds, data = is.data, usr = usr)
  cmds <- row.names( cmdlocs )
  use.data <- FALSE
  plotcmd( ans, fig, cmds, cmdlocs, usr, data = use.data )
  rescale.data <- c( range( stats::predict( low, low$knots )$y,
                            stats::predict( high, high$knots )$y ), range( low$knots, high$knots ))
  repeat {
    ## get command from plot using cursor
    z <- locator(1,"n")
    if(( !horizontal & z$x > separator ) | ( horizontal & z$y > separator )) {
      if( horizontal ) { # need to look at both z&y 
        x <- abs( z$x - cmdlocs$x )
        x <- x == min( x )
        newans <- cmds[x]
        z <- abs( z$y - cmdlocs$y )[x]
        newans <- newans[ z == min( z ) ][1]
      }
      else {
        z <- abs(z$y - cmdlocs$y )
        newans <- cmds[ z == min( z ) ][1]
      }
      switch( newans,
              finish =, refresh = {
                separator <- plotit( low, high, fig, horizontal )
                usr <- par("usr")
                cmdlocs <- newlocs( cmds, data = is.data, usr = usr)
              },
              data = {
                use.data <- is.data & !use.data
                if( is.data & !use.data )
                  plotit( low, high, fig, horizontal )
              },
              high =, low = {
                if( newans != fig )
                  fig <- newans
                separator <- plotit( low, high, fig, horizontal )
                usr <- par("usr")
                cmdlocs <- newlocs( cmds, data = is.data, usr = usr)
              },
              rescale = {
                tmpcmds <- cmds
                tmpans <- tmpcmds[ cmds == "rescale" ] <-
                  "rescale: Switch to Character Screen"
                plotcmd( tmpans, fig, tmpcmds, cmdlocs, usr, data = use.data )
                ry <- range( c( stats::predict( low, low$knots )$y, stats::predict( high, high$knots )$y ))
                cat( "\nEnter new minimum/maximum followed by RETURN key\n" )
                newry <- ry
                show <- c("minimum","maximum")
                change <- FALSE
                for( i in 1:2 ) {
                  tmpy <- readline( paste( show[i], " temp (",
                                           round( ry[i], 2 ), "):", sep = "" ))
                  tmpy <- if( tmpy == "" ) NA
                  else as.numeric( tmpy )
                  if( is.na( tmpy ))
                    tmpy <- ry[i]
                  else
                    change <- TRUE
                  rescale.data[i] <- tmpy
                }
                tmp <- range( c( low$knots, high$knots ))
                for( i in 1:2 ) {
                  tmpx <- readline( paste( show[i], " time (", 
                                           round( tmp[i], 2 ), "):", sep = "" ))
                  tmpx <- if( tmpx == "" ) NA
                  else as.numeric( tmpx )
                  if( is.na( tmpx ))
                    tmpx <- tmp[i]
                  else
                    change <- TRUE
                  rescale.data[2+i] <- tmpx
                }
                cat( "Switch to Graphic Screen to Adjust High and Low Temperatures\n" )
                if( change ) {
                  tmp <- rescale.temp( low, high, rescale.data[1:2],
                                       rescale.data[3:4], ry )
                  low <- tmp$low
                  high <- tmp$high
                }
                separator <- plotit( low, high, fig, horizontal )
                usr <- par("usr")
                cmdlocs <- newlocs( cmds, data = is.data, usr = usr)
              },
              restart = {
                low <- getTemp( community, "Low" )
                high <- getTemp( community, "High" )
                if( is.data )
                  rescale.data <- c( range( stats::predict( low, low$knots )$y,
                                            stats::predict( high, high$knots )$y ), range( low$knots, high$knots ))
                separator <- plotit( low, high, fig, horizontal )
                usr <- par("usr")
                cmdlocs <- newlocs( cmds, data = is.data, usr = usr)
              },
              add =, delete =, replace = {
                ans <- newans
              }
      )
      if( use.data ) {
        tmp <- rescale.temp( getTemp( community, "Low" ), getTemp( community, "High" ),
                             rescale.data[1:2], rescale.data[3:4] )
        for( i in c("low","high") ) {
          datax <- tmp[[i]]$knots
          lines( datax, stats::predict( tmp[[i]], datax )$y )
        }
      }
      plotcmd( ans, fig, cmds, cmdlocs, usr, data = use.data )
    }
    else { # modify the curve knots
      fit <- get( fig )
      if( z$x >= min( fit$knots ) & z$x <= max( fit$knots )) {
        fit <- curve.plot( as.data.frame( stats::predict( fit, fit$knots )), n = n, action = ans,
                           z = z, fit = fit, backfit = FALSE, save.ends = 2, col = col[fig] )
        assign( fig, fit$fit )
      }
      ans <- "replace"
      plotcmd( ans, fig, cmds, cmdlocs, usr, data = use.data )
    }
    if( newans == "finish" )
      break
  }
  plotcmd( newans, fig, cmds, cmdlocs, "red", data = use.data )
  community <- setTemp( community, "Low", low )
  community <- setTemp( community, "High", high )
  activeTemp( community )
}

# --- Source: temp.plot.R ---
temp.plot <- function( community, lo.hour = s$knots[1], hi.hour = max( s$knots ),
                       length = 201,
                       col = NULL, derivative = FALSE, ..., printit = FALSE )
{
  s <- getTemp( community, "DegreeDay" )
  x <- seq( lo.hour, hi.hour, length = length )
  ## make sure to pick up knots to plot in this region
  x <- unique( sort( c( x, s$knots[ s$knots >= lo.hour & s$knots <= hi.hour ] )))
  ylab <- "degree-days"
  if( derivative ) {
    ylab <- "degrees above min"
    s$coefficients <- s$coefficients[,-1]
    for( i in seq( 2, ncol( s$coefficients )))
      s$coefficients[,i] <- s$coefficients[,i] * i
  }
  y <- stats::predict( s, x )$y
  plot( x / getTemp( community, "Unit" ), y, type = "l", xlab = "day",
        ylab = ylab, ... )
  if( printit )
    print( cbind( hi.hour, stats::predict( s, hi.hour )$y ))
  if( !is.null( col ))
    points( s$knots, coef(s)[,1], col = col )
  if( !derivative ) {
    s <- getTemp( community, "Hour" )
    x <- seq( min( y ), max( y ), length = length )
    tmp <- stats::predict( s, x )
    lines( tmp$y / getTemp( community, "Unit" ), tmp$x, col = "blue" )
  }
}
###########################################################################################
temp.lines <- function( s, mult = 24, col = "red" )
{
  x <- seq( s$knots[1], max( s$knots ), length = 51 )
  x <- unique( sort( c( x, s$knots )))
  p <- stats::predict( s, x )
  lines( p$x, p$y, col = col )
  if( !is.null( col ))
    points( s$knots / mult, coef(s)[,1], col = col )
}

# --- Source: my.R ---
###########################################################################################
## System files
###########################################################################################
my.read <- function(dataname, stringsAsFactors = TRUE)
{
  switch(tools::file_ext(dataname),
         "txt" =, "tsv" = read.table(dataname, header = TRUE, fill = TRUE,
                                     stringsAsFactors = stringsAsFactors),
         "csv" = read.csv(dataname, fill = TRUE,
                          stringsAsFactors = stringsAsFactors),
         "xls" = readxl::read_xls(dataname),
         "xlsx" = readxl::read_xlsx(dataname))
}
###########################################################################################
my.eval <- function(species, extension, element, checkdata = FALSE )
{
  if( !missing( extension ))
    species <- paste( species, extension, sep = ".")
  if( exists( species )) 
    organism <- get( species )
  else {
    if( checkdata ) {
      organism <- utils::data( list = species )
      if( organism == species )
        organism <- NULL
    }
    else
      organism <- NULL
  }
  if(!( missing(element) | is.null( organism )))
    organism <- organism[[element]]
  organism
}
###########################################################################################
mydata <- function( dataname, package, restart = FALSE, messages = TRUE )
{
  edata <- exists( dataname )
  if( restart & edata ) {
    remove( list = dataname, pos = 1 )
    edata <- !edata
  }
  if( !edata ) {
    utils::data( list = dataname, package = eval( package ))
    if(messages) {
      cat( "Data", dataname, "loaded\n" )
    }
  }
  else
    if(messages) {
      cat( "Data", dataname, "already loaded\n" )
    }
} 

# --- Source: Org.R ---
###########################################################################################
### Organism Features
###########################################################################################
getOrgFeature <- function( community, species, feature = names( OrgFeature ))
{
  OrgFeature <- getOrgInfo( community, "Feature" )
  if (!is.null(OrgFeature)) {
    if( missing( species ))
      return( row.names( OrgFeature ))
    f <- OrgFeature[ species, feature ]
    if( length( feature ) == 1 ) {
      if( any( is.na( f )))
        return( NA )
      f <- as.character( f )
    }
    else {
      f <- apply( f, 2, as.character )
    }
    f <- c( unlist( f ))
    numf <- suppressWarnings(as.numeric( f ))
    if( all( !is.na( numf )))
      f <- numf
    return(f)
  }
  
  # Fallback for webR standalone adapter objects
  if (missing(species)) return(c("host", "parasite"))
  if (missing(feature) || is.null(feature)) return(c(substrate = "substrate", units = "units"))
  if (length(feature) == 1) {
    if (feature == "substrate") return("substrate")
    if (feature == "units") return("units")
    return(NA)
  }
  res <- rep("substrate", length(feature))
  names(res) <- feature
  res
}
##########################################################################################
getOrgHosts <- function( community, species,
                         feature = c("offspring","attack","substrate") ###HOST SPECIFIC###
)
{
  # This seems overly complicated and adds substrate; maybe function name is wrong
  f <- unique( getOrgFeature( community, species, feature ))
  # f[match(species, f, nomatch = 0)] # this would only get species
  o <- getOrgFeature( community )
  o[ match( f, o, nomatch = 0 ) ]
}
###########################################################################################
getOrgFuture <- function( community, species, feature, current,
                          future = OrgFuture[[species]] )
{
  OrgFuture <- getOrgInfo( community, "Future" )
  if (!is.null(OrgFuture) && !is.null(OrgFuture[[species]])) {
    future <- OrgFuture[[species]]
    if( missing( current )) {
      if( missing( feature ))
        return( future )
      future <- future[,feature]
    }
    else {
      if( !is.numeric( current ))
        current <- match( current, future$current, nomatch = 0 )
      if( missing( feature ))
        future <- future[ current, ]
      else
        future <- future[ current, feature ]
    }
    if( is.null( future ))
      return( NA )
    if(is.character( future ))
      future <- as.factor(future)
    return(future)
  }
  
  # Fallback for webR standalone adapter objects
  if (!is.null(community$pop[[species]])) {
    pch_vec <- community$pop[[species]]$pch
    col_vec <- community$pop[[species]]$col
    fut <- data.frame(pch = pch_vec, color = col_vec, stringsAsFactors = FALSE)
    if (missing(feature)) return(fut)
    if (length(feature) == 1) return(fut[[feature]])
    return(fut[, feature, drop = FALSE])
  }
  NULL
}
###########################################################################################
get.interact <- function( community, species, host, avail, event )
{
  id <- get.species.element( community, host, "stage", avail )
  interact <- getOrgInteract( community, host, species, event )[id]
  interact[ is.na( interact ) ] <- 0
  interact
}
###########################################################################################
getOrgInteract <- function( community,
                            org1name = getOrgFeature( community, org2name, "substrate" ),
                            org2name, event = NULL )
{
  OrgInteract <- getOrgInfo( community, "Interact" )
  if (!is.null(OrgInteract) && !is.null(OrgInteract[[org1name]][[org2name]])) {
    tmp <- OrgInteract[[org1name]][[org2name]]
    if( is.null( event ))
      return( tmp )
    event <- as.character( event )
    inter <- tmp[,event]
    if( length( event ) == 1 )
      names( inter ) <- row.names( tmp )
    if(is.character(inter))
      inter <- factor(inter)
    return(inter)
  }
  
  # Fallback for webR standalone adapter objects
  sub_names <- if (!is.null(community$sub_names)) community$sub_names else c("fr1", "fr2", "fr3", "fr4", "twig", "lftop", "lfbot")
  mat <- matrix(1, nrow = length(sub_names), ncol = 1, dimnames = list(sub_names, "substrate"))
  as.data.frame(mat)
}
###########################################################################################
getOrgMeanValue <- function( community, species )
{
  OrgMeanValue <- getOrgInfo( community, "MeanValue" )
  ## The global org$MeanValue[[species]] contains mean value information.
  OrgMeanValue[[species]]
}
###########################################################################################
copyOrgInfo <- function( fromname, toname )
{
  out <- list()
  for( i in c("sim")) {
    from <- paste( fromname, i, sep = "." )
    if( exists( from )) {
      toto <- paste( toname, i, sep = "." )
      out[[toto]] <- get( from )
      cat( "copied", from, "to", toto, "into list\n" )
    }
  }
  return(out)
}
###########################################################################################
get.alive <- function( community, species, substrate )
{
  alive <- getOrgAlive( community, species )
  alive <- seq_along( alive )[alive]
  alive[ substrate == get.species.element( community, species, "sub.stage", alive ) ]
}
###########################################################################################
getOrgAlive <- function( community, species, element )
{
  organism <- get.species( community, species )
  ## identify dead organisms (free nodes for leftist tree)
  tmp <- c( FALSE, apply( organism[c("dist","up","left","right"),-1], 2,
                          function( x ) any( x > 1 )))
  if( !any( tmp )) {
    tmpp <- organism["up",1]
    if( tmpp > 1 )
      tmp[tmpp] <- TRUE
  }
  if( !missing( element ))
    tmp <- organism[ element, tmp ]
  tmp
}
###########################################################################################
getOrgAgeClass <- function( community, species, stage = seq_len( nrow( future )),
                            future = getOrgFuture( community, species ))
{
  ageclass <- future$ageclass[stage]
  tmp <- !is.na( ageclass )
  if( any( tmp ))
    ageclass[ !is.na( ageclass ) ]
  else
    NA
}
###########################################################################################
getOrgSubstrate <- function( community, species, elements = seq_len( nrow( inter )),
                             substrate = getOrgFeature( community, species, "substrate" ),
                             inter = getOrgInteract( community, substrate, species ))
{
  sites <- inter$substrate[elements]
  tmp <- !is.na( sites )
  if( any( tmp ))
    sites[ !is.na( sites ) ]
  else
    NA
}
###########################################################################################
sampleOrgSubstrate <- function( community, species, elements = seq_len( nrow( inter )),
                                substrate.name = getOrgFeature( community, species, "substrate" ),
                                inter = getOrgInteract( community, substrate.name, species ))
{
  if( is.na( substrate.name ))
    return( elements )
  newsub <- as.matrix( cbind( elements, inter[ elements, levels( factor(inter$substrate) ) ] ))
  apply( newsub, 1, function( x, is ) {
    ns <- sample( levels( factor(is) ), 1, prob = x[-1] / sum( x[-1] ))
    sub <- seq_len( nrow( inter ))[ ns == is ]
    if( length( sub ) > 1 ) {
      newsub <- getOrgInteract( community, substrate.name, substrate.name )[x[1],sub]
      sample( sub, 1, prob = newsub / sum( newsub ))
    }
    else
      sub
  }, inter$substrate )
} 
##########################################################################################
### simulation organism administration
##########################################################################################
initOrgInfo <- function( package, messages = TRUE, datafile = "", ... )
{
  community <- list( pop = list( ))
  community$org <- list( )
  community$org$package <- package
  ## Get data
  community$org$Feature <- getOrgData(community, "organism", "features",
                                      messages, datafile)
  
  community$pop <- list()
  community
}
##########################################################################################
setOrgInfo <- function( community, species, hosts, package, messages = TRUE,
                        datafile = "", ... )
{
  Organism <- community$org
  
  if( is.null( Organism$Future ))
    Organism$Future <- list( )
  if( is.null( Organism$Interact ))
    Organism$Interact <- list( )
  
  for( j in hosts )
    if( is.null( Organism$Interact[[j]] ))
      Organism$Interact[[j]] <- list( )
  
  ## Do not reset MeanValue as it may have important spline fits!
  if( is.null( Organism$MeanValue ))
    Organism$MeanValue <- list( )
  
  for( i in species ) {
    future <- getOrgData(community, "future", i,
                         messages, datafile)
    
    # Check that future agrees with organism.feature information
    subclass <- Organism$Feature[i,"subclass"]
    if(!(subclass %in% unique(future$ageclass))) {
      stop(paste("Future table", paste("future", i, sep = "."),
                 "does not include", subclass))
    }
    
    level.ageclass <- unique( future$ageclass )
    level.ageclass <- as.character( level.ageclass[ !is.na( level.ageclass ) ] )
    future$ageclass <- ordered( future$ageclass, level.ageclass )
    Organism$Future[[i]] <- future
    for( j in hosts )
      if( i != j ) {
        Organism$Interact[[j]][[i]] <- getOrgData(community, j, i,
                                                  messages, datafile)
        
        # Check that interaction agrees with host current stage information
        # This is messy!
        if(j %in% species) {
          if(!all(row.names(Organism$Interact[[j]][[i]]) %in%
                  c(as.character(Organism$Future[[j]]$current), i))) {
            stop(paste("Interaction table", paste(j, i, sep = "."),
                       "does not match", j, "current stages"))
          }
        }
      }
    if( is.null( Organism$MeanValue[[i]] ))
      Organism$MeanValue[[i]] <- list( )
    else
      cat( "Keeping Mean Value information for", i, "if any\n" )
  }
  for( i in unique( getOrgFeature( community, species, "substrate" ))) {
    Organism$Interact[[i]][[i]] <- getOrgData(community, i, i,
                                              messages, datafile)
  }
  community$org <- Organism
  community
}
###########################################################################################
getOrgData <- function(community, left, right,
                       messages = TRUE, datafile = "")
{
  # Get Organism Data from
  #     package data
  #     global data supplied by user
  #     external data file supplied by user
  sheet <- paste( left, right, sep = "." )
  data_exists <- FALSE
  if (is.character(datafile) && length(datafile) == 1 && nzchar(datafile)) {
    if (dir.exists(datafile)) {
      extensions <- c(".txt", ".tsv", ".csv", ".xls", ".xlsx")
      datafile_paths <- file.path(datafile, paste0(sheet, extensions))
      exist_idx <- file.exists(datafile_paths)
      if (any(exist_idx)) {
        datafile <- datafile_paths[exist_idx][1]
        data_exists <- TRUE
      } else {
        data_exists <- FALSE
      }
      sheet <- ""
    } else if (file.exists(datafile)) {
      data_exists <- TRUE
    }
  }

  if (!data_exists && (is.null(datafile) || datafile == "")) {
    def_file <- get_site_cache_file(paste0(sheet, ".txt"), site = "default")
    if (def_file != "" && file.exists(def_file)) {
      datafile <- def_file
      data_exists <- TRUE
      sheet <- ""
    }
  }

  if(!data_exists) {
    # Load package data or get user-provided global data.
    mydata( sheet, getOrgInfo( community, "package" ), messages = messages)
    my.eval( sheet )
  } else {
    # Read data file from user if provided.
    if(sheet == "")
      my.read(datafile)
    else {
      out <- as.data.frame(readxl::read_excel(datafile, sheet = sheet, .name_repair = "none"))
      if(names(out)[1] == "") { # first column is actual row names
        rownames(out) <- out[[1]]
        out[[1]] <- NULL
      }
      out
    }
  }
}
###########################################################################################
getOrgNames <- function(datafile = "") {
  if(datafile == "") {
    c("organism.features", "future.host", "future.parasite",
      "substrate.host", "substrate.parasite", "substrate.substrate",
      "temperature.base", "temperature.par")
  } else {
    readxl::excel_sheets(datafile)
  }
}
###########################################################################################
getOrgDataSimple <- function(community, dataname, datafile = ""){
  out <- getOrgData(
    community,
    left = stringr::str_remove(dataname, "\\..*"),
    right = stringr::str_remove(dataname, ".*\\."),
    messages = FALSE, datafile = datafile)
  # Kludge to reinstate rownames as a column
  if(!identical(rownames(out), as.character(seq_len(nrow(out))))) {
    out <- data.frame(rownames = rownames(out), out)
  }
  out
}
###########################################################################################
getOrgInfo <- function( community, element )
{
  community$org[[element]]
}
###########################################################################################
setOrgMeanValue <- function( community, species, stage, mvalue )
{
  ## The global Organism$MeanValue[[species]] contains mean value information.
  community$org$MeanValue[[species]][[stage]] <- mvalue
  community
}

# --- Source: organism.features.R ---
NULL

# --- Source: future.R ---
## $Id: future.R,v 1.0 2002/12/11 yandell@stat.wisc.edu Exp $
##
## Functions for Bland Ewing's modeling.
##
##     Copyright (C) 2000,2001,2002 Brian S. Yandell.
##
## 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, or (at your option) any
## later version.
##
## These functions are distributed in the hope that they 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.
##
## The text of the GNU General Public License, version 2, is available
## as http://www.gnu.org/copyleft or by writing to the Free Software
## Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
##
###############################################################################
##
## future.events( community )
##
###############################################################################




###############################################################################
### Get birth and future event
###############################################################################
get.future <- function (community, species,
                        individuals = get.individual(community, species, id),
                        id = get.base(community, species))
{
  ## NOTE: This is the slow routine. For every event, it has to check if there
  ## is a mean value function and then call rspline.

  ## the structure future.species is set up to handle competing risks!
  future <- getOrgFuture(community, species, c("current", "future", "time"))
  future$fid <- match(future$future, future$current)
  individuals <- as.matrix(individuals)

  rownames <- dimnames(individuals)[[1]]
  for (i in seq(ncol(individuals))) {
    individual <- individuals[,i]
    current <- individual["stage"]
    individual["location"] <- individual["time"]

    ## competing risks based on potential future event times
    futures <- future$current == future$current[current]
    times <- rep( individual["time"], sum( futures ))
    cur <- seq(nrow(future))[futures]
    for( j in seq( sum( futures ))) {
      meantime <- future[cur[j], "time"]
      if( meantime > 0 ) {
        for.stage <- as.character(future$current[future$fid[ cur[j] ]])
        times[j] <- rspline( meantime, individual,
                              getOrgMeanValue(community, species)[[for.stage]])
      }
    }
    individual["time"] <- min( times )
    current <- cur[ times == individual["time"] ][1]
    individual["future"] <- future$fid[current]
    if (individual["time"] == individual["rejection"])
        individual["future"] <- future$fid[future$current == "death"]
    individuals[,i] <- individual
  }
  individuals
}
###############################################################################
event.death <- function( community, species,
                        id = get.base( community, species ))
{
  ## remove dead individual from leftist tree
  community <- put.species( community, species,
                           leftist.remove( get.species( community, species ), id ))
  ## free up individual for reuse
  community <- put.base( community, species, id )
  community
}
###############################################################################
update_mintime <- function( object, species, ... )
{
  base <- get.base( object, species )
  mintime <- max( getCount( object, species, "mintime" ),
                 getTime( object, species,
                         get.species.element( object, species, "time", base )))
  setCount( object, species, list( base = base, mintime = mintime ))
}
###############################################################################
set.birth <- function( community, species, neworg )
{
  ## merge immediate new births (if any)
  newbirths <- ncol( neworg )
  if( newbirths > 0 ) {
    neworg[c("dist","left","right","up"),] <- 1
    community <- checkTime( community, neworg["time",],
              getCount( community, species, "mintime" ),
              getOrgFeature( community, species, "units" ))
    oldbase <- getCount( community, species, "base" )
    tmp <- leftist.birth( get.species( community, species ), neworg,
                         getCount( community, species, "free" ))
    
    community <- put.species( community, species, tmp$tree )
    community <- put.base( community, species, free = tmp$free )
    community <- updateCounts( community, species, newbirths )
  }
  community
}



# --- Source: future.host.R ---
NULL

# --- Source: future.meanvalue.R ---
###########################################################################################
## init.meanvalue( organism, stage )
## spline.meanvalue( x, y )
## spline.meanvalue( data = data )
##
## five.show( )
## five.plot( )
##
###########################################################################################
# Curve Designing routines -- under development
###########################################################################################
future.meanvalue <- function( community, species, event = future$current[1],
                              data )
{
  future <- getOrgFuture( community, species )
  mvalue <- getOrgMeanValue( community, species )[[event]]
  if( missing( data )) {
    if( !is.null( mvalue )) {
      mvalue <- stats::predict( mvalue$meanvalue, mvalue$meanvalue$knots )
      mvalue <- spline.meanvalue( mvalue$x, mvalue$y )$fit
    }
    else
      mvalue <- spline.meanvalue( )$fit
  }
  else
    mvalue <- spline.meanvalue( data = data )$fit
  setOrgMeanValue( community, species, event, mvalue )
}
###########################################################################################
spline.meanvalue <- function( x = xinit, y = yinit, data, nspline = 8,
                              xy = data.frame( x = x, y = y ),
                              tol = 1e-5, n = 1 )
{
  is.data <- !missing( data )
  if( !is.data ) {
    tmp <- - log( 1 - seq( 0, 1 - exp( -5 ), length = nspline ))
    if( missing( x ))
      xinit <- tmp
    else
      xinit <- x
    if( missing( y ))
      yinit <- tmp
    else
      yinit <- y
    data <- NULL
  }
  else {
    xinit <- sort( data )
    ndata <- length( data )
    yinit <- seq( ndata ) / ( 1 + ndata )
    choose <- round( seq( 1, ndata, length = nspline ))
    xinit <- xinit[choose]
    yinit <- - log( 1 - yinit[choose] )
  }
  fs <- list( probability = function( x ) { - log( 1 - x ) } )
  finvs <- list( probability = function( x ) { 1 - exp( - x ) } )
  for( i in c("mean value","rate","density") )
    fs[[i]] <- finvs[[i]] <- function( x ) x
  
  ## plot curve and surrounding axes
  graphics::par( mfrow = c(1,1), mar = rep(4.1,4))
  plotit <- function( xy, fig = "mean value", fit = splines::interpSpline( xy$x, xy$y ))
  {
    switch( fig, {
      y <- xy$y
      ylim <- range(c(0,y))
    },
    probability = {
      y <- 1 - exp( - xy$y )
      ylim <- range(c(0,y))
    },
    rate = {
      y <- spline.rate( fit, xy$x )$y
      tmp <- spline.rate( fit )
      ylim <- range(c(0,tmp$y))
    },
    density = {
      y <- spline.rate( fit, xy$x )$y * exp( - stats::predict( fit, xy$x )$y )
      tmp <- spline.rate( fit )
      tmp$y <- tmp$y * exp( - stats::predict( fit )$y )
      ylim <- range(c(0,tmp$y))
    }
    )
    plot(xy$x,y,xlim=1.25*range(c(0,xy$x)), ylim = ylim,
         type="n", xlab = "", ylab = "" )
    graphics::points( xy$x, y, lwd = 4 )
    graphics::title( fig )
    graphics::mtext( "time", 1, 2 )
    graphics::mtext( fig, 2, 2 )
    graphics::abline( v = max( xy$x ), lty = 2 )
    
    switch( fig, {
      if( fig == "probability" ) {
        tmp <- c(.1,.2,.5,1:10)
        ltmp <- 1-exp(-tmp)
        graphics::mtext( "mean value", 4, 2 )
      }
      else {  
        tmp <- c(seq(0,.9,,by=.1),.95,.98,.99,.999)
        ltmp <- -log(1-tmp)
        graphics::mtext( "probability", 4, 2 )
      }
      usr <- graphics::par("usr")
      s <- ltmp <= usr[4] & ltmp >= usr[3]  
      tmpar <- graphics::par( cex = .75 )
      graphics::axis(4,ltmp[s],tmp[s])
      graphics::par( tmpar )
      summaryshow( xy, fit, "white" )
      tmp <- curve.plot( xy, n = n, action = "refresh", fit = fit,
                         f = fs[[fig]], finv = finvs[[fig]] )
      summaryshow( xy, tmp$fit )
    },
    rate =, density = {
      graphics::lines( tmp$x, tmp$y )
      summaryshow( xy, fit )
    }
    )
  }
  ## place commands along right strip of plot, highlighting current command
  plotcmd <- function( ans, fig, cmds, cmdlocs, usr, col = "green", rest = "black",
                       data = FALSE )
  {
    ans <- c( ans, fig )
    if( data )
      ans <- c( ans, "data" )
    tmp <- is.na( match( cmds, ans ))
    if( any( tmp ))
      graphics::text( rep(usr[2],sum(tmp)), cmdlocs[tmp], cmds[tmp], col = rest, adj = 1 )
    if( any( !tmp ))
      graphics::text( rep(usr[2],sum(!tmp)), cmdlocs[!tmp], cmds[!tmp], col = col, adj = 1 )
  }
  
  fig <- "mean value"
  newans <- ans <- "replace"
  
  graphics::par( mar = c(4.1,4.1,3.1,4.1),omi=rep(.25,4))
  fit <- splines::interpSpline( xy$x, xy$y )
  sums <- plotit( xy, fig, fit )
  
  cmds <- c("refresh","add","delete","replace","rescale","shrink to 1","finish","restart",
            "","data","mean value","probability","rate","density")
  newlocs <- function( cmds, data = FALSE, usr )
  {
    if( !data )
      cmds <- cmds[ cmds != "data" ]
    n <- length( cmds )
    blank <- seq( n )[ cmds == "" ]
    tmp <- diff(usr[3:4]) / 20
    tmp <- c( usr[4] - tmp * seq( blank - 1 ), mean( usr[3:4] ),
              usr[3] + tmp * seq( n - blank ))
    names( tmp ) <- cmds
    tmp
  }
  usr <- graphics::par("usr")
  cmdlocs <- newlocs( cmds, data = is.data, usr = usr)
  cmds <- names( cmdlocs )
  use.data <- FALSE
  plotcmd( ans, fig, cmds, cmdlocs, usr )
  rescale.data <- 1
  repeat {
    ## get command from plot using cursor
    z <- graphics::locator(1,"n")
    if( z$x > max( xy$x )) {
      z <- abs(z$y - cmdlocs )
      newans <- cmds[z==min(z)][1]
      switch( newans,
              finish =, refresh = {
                sums <- plotit( xy, fig, fit )
              },
              data = {
                use.data <- is.data & !use.data
                if( is.data & !use.data & match( fig, c("mean value","probability"),
                                                 nomatch = 0 ))
                  sums <- plotit( xy, fig, fit )
              },
              "mean value" =, probability =, rate =, density = {
                fig <- newans
                sums <- plotit( xy, fig, fit )
                usr <- graphics::par("usr")
                cmdlocs <- newlocs( cmds, data = is.data, usr = usr)
              },
              "shrink to 1" = {
                while( abs( sums[1] - 1 ) > tol ) {
                  xy$y <- xy$y * sums[1]
                  if( is.data )
                    rescale.data <- rescale.data * sums[1]
                  fit <- splines::interpSpline( xy$x, xy$y )
                  sums <- splinesum( xy, fit, tol )
                }
                sums <- plotit( xy, fig, fit )
                usr <- graphics::par("usr")
                cmdlocs <- newlocs( cmds, data = is.data, usr = usr)
              },
              rescale = {
                cat( "enter new values followed by RETURN key\n" )
                tmpy <- readline( paste( "maximum mean value(",
                                         round( max( xy$y ), 2 ), "):", sep = "" ))
                if( tmpy != "" ) {
                  tmpy <- as.numeric( tmpy ) / max( xy$y )
                  xy$y <- tmpy * xy$y
                  if( is.data )
                    rescale.data <- rescale.data * tmpy
                }
                tmpx <- readline( paste( "maximum time(", 
                                         round( max( xy$x ), 2 ), "):", sep = "" ))
                if( tmpx != "" ) {
                  tmpx <- as.numeric( tmpx ) / max( xy$x )
                  xy$x <- tmpx * xy$x
                  if( is.data )
                    data <- data * tmpx
                }
                fit <- splines::interpSpline( xy$x, xy$y )
                sums <- plotit( xy, fig, fit )
                usr <- graphics::par("usr")
                cmdlocs <- newlocs( cmds, data = is.data, usr = usr)
              },
              restart = {
                if( is.data )
                  rescale.data <- 1
                xy <- data.frame( x = xinit, y = yinit )
                fit <- splines::interpSpline( xy$x, xy$y )
                sums <- plotit( xy, fig, fit )
                usr <- graphics::par("usr")
                cmdlocs <- newlocs( cmds, data = is.data, usr = usr)
              },
              add =, delete =, replace = {
                ans <- newans
              }
      )
      if( use.data & match( fig, c("mean value","probability"), nomatch = 0 ))
        cdf.lines( data, fig, rescale = rescale.data )
      plotcmd( ans, fig, cmds, cmdlocs, usr, data = use.data )
    }
    else {
      if( is.na( match( fig, c("rate","density") ))) {
        summaryshow( xy, fit, "white", sums )
        fit <- curve.plot( xy, n = n, action = ans, z = z, fit = fit,
                           f = fs[[fig]], finv = finvs[[fig]] )
        xy <- fit$xy
        fit <- fit$fit
        sums <- summaryshow( xy, fit )
        ans <- "replace"
        plotcmd( ans, fig, cmds, cmdlocs, usr, data = use.data )
      }
    }
    if( newans == "finish" )
      break
  }
  plotcmd( newans, fig, cmds, cmdlocs, "red", data = use.data )
  summaryshow( xy, fit, "white", sums )
  tmp <- curve.plot( xy, n = n, action = "refresh",
                     f = fs[[fig]], finv = finvs[[fig]] )
  tmp$meanvalue <- tmp$fit
  tmp$fit <- NULL
  tmp$invmvalue <- splines::backSpline( tmp$meanvalue )
  sums <- summaryshow( xy, tmp$meanvalue )
  tmp$mean <- sums[1]
  tmp$median <- sums[2]
  tmp
}

# --- Source: substrate.host.R ---
NULL

# --- Source: host.parasite.R ---
NULL

# --- Source: simdata.R ---
NULL

# --- Source: redscale.R ---
NULL

# --- Source: init.simulation.R ---
init.simulation <- function( package = "ewing", 
                             count = 200,
                             interact = FALSE,
                             messages = TRUE,
                             ...)
{
  community <- initOrgInfo( package, messages = messages, ... )
  community <- initTemp( community, messages = messages, ... )
  
  species <- getOrgFeature( community )[1:2]
  hosts <- getOrgHosts( community, species )
  
  if(messages) {
    cat( "Creating simulation organism set using species:\n",
         paste( species, collapse = ", " ), "\n\n" )
  }
  
  community <- setOrgInfo( community, species, hosts, package,
                           messages = messages, ... )
  
  if(messages) {
    cat( "\n" )
  }
  species <- unique( species )
  num <- numeric( length( species ))
  names( num ) <- species
  
  count <- rep_len(count, length(species))
  names(count) <- species
  
  for( i in species ) {
    num[i] <- reuse <- count[i]
    
    if(messages | (interact & interactive())) {
      cat( paste( "Initialize ", i, " at size ", reuse, sep = "" ))
    }
    if(interact & interactive()) {
      cat(" :")
      r <- readline( )
      if( r != "" & is.na( pmatch( substring( r, 1, 1 ), c("y","Y") )))
        reuse <- suppressWarnings(as.numeric( r ))
      if( is.na( reuse ))
        reuse <- count[i]
    }
    if( reuse ) {
      if(messages) {
        cat( "...\n" )
      }
      community <- init.population( community, i, n = reuse, messages = messages, ... )
      num[i] <- reuse
    }
  }
  class( community ) <- c("ewing", "list")
  attr(community, "count") <- count
  community
}

# --- Source: init.population.R ---
init.population <- function( community, species, n = 200, width = 100,
                             units = getOrgFeature( community, species, "units" ),
                             timeit = FALSE,
                             reject = Inf,
                             position = rtri( n, width ),
                             colnames = c(leftistnames,paramnames,posnames,eventnames),
                             init.stage = istage,
                             init.weight = getOrgFuture( community, species, "init" ),
                             messages = TRUE,
                             ...)
{
  leftistnames <- c("dist","left","right","up")
  paramnames <- c("dispersion","location","intensity","truncation","rejection")
  posnames <- paste("pos",letters[1:3], sep = ".")
  eventnames <- c("time","stage","future","offspring","sex","sub.stage","sub.future")
  
  organism <- matrix( 0, length( colnames ), n+1,
                      dimnames = list( colnames, NULL ))
  organism["time",1] <- Inf
  
  ## 5-parameter initialization
  organism[c("dispersion","intensity"),-1] <- 1
  organism["rejection",-1] <- if( reject == Inf )
    rep( Inf, n )
  else
    reject * stats::rexp( n )
  
  ## triangular coordinates
  organism[posnames,-1] <- position
  
  ## substrate
  substrate.name <- getOrgFeature( community, species, "substrate" )
  if( !is.na( substrate.name )) {
    substrate <- getOrgInteract( community, substrate.name, species, "init" )
    organism["sub.stage",-1] <- organism["sub.future",-1] <- sample( length( substrate ),
                                                                     n, replace = TRUE, prob = substrate / sum( substrate ))
  }
  ## randomly generate events proportional to future time units
  nstage <- length( init.weight )
  istage <- sample( nstage, n, replace = TRUE, prob = init.weight / sum( init.weight ))
  init.stage <- array( init.stage, n )
  organism["stage",-1] <- init.stage
  
  ## schedule future events
  if( timeit )
    proctime <- proc.time()
  organism[,-1] <- get.future( community, species, organism[,-1] )
  if( timeit ) {
    tmp <- proc.time() - proctime
    cat( "future time: user=", tmp[1], "system=", tmp[2], "total=", tmp[3], "\n" )
  }
  ## create leftist tree
  if( timeit )
    proctime <- proc.time()
  community <- put.species( community, species, leftist.create( organism ))
  if( timeit ) {
    tmp <- proc.time() - proctime
    cat( "leftist time: user=", tmp[1], "system=", tmp[2], "total=", tmp[3], "\n" )
  }
  ## mean number of offspring
  if( timeit )
    proctime <- proc.time()
  #***This is where parasite is crashing--no offspring?**
  community <- initOffspring( community, species )
  if( timeit ) {
    tmp <- proc.time() - proctime
    cat( "offspring time: user=", tmp[1], "system=", tmp[2], "total=", tmp[3], "\n" )
  }
  
  if(messages) {
    cat( "Initializing events for", species, "with", ncol( organism ) - 1, "individuals\n" )
  }
  community
}

# --- Source: init.timing.R ---
###########################################################################################
### Timing of simulation run
###########################################################################################
init.timing <- function( community )
{
  ## initialize timing
  events <- NULL
  for( species in get.species( community ))
    events <- c( events, levels( getOrgFuture( community, species, "event" )))
  events <- sort( unique( events ))
  tmp <- c("total",events,"refresh","other")
  cpu <- matrix( 0, 3, length( tmp ),
                 dimnames = list( c("user","system","total"), tmp ))
  community$cpu <- cpu
  community <- set.timing( community, "total" )
  community
}
###########################################################################################
set.timing <- function( community, string, flag = -1 ) {
  if( !is.null( community$cpu ))
    community$cpu[,string] <- community$cpu[,string] + flag * proc.time()[1:3]
  community
}
###########################################################################################
fini.timing <- function( community )
{
  if( !is.null( community$cpu )) {
    community <- set.timing( community, "total", 1 )
    community$cpu[,"other"] <- community$cpu[,"total"] - apply( community$cpu[,-1], 1, sum )
  }
  community
}

# --- Source: initCount.R ---
###########################################################################################
### Simulation count object administration
###########################################################################################
initCount <- function( community, species, debugit = FALSE, file = NULL, append = FALSE,
                       messages = TRUE, ... )
{
  if(messages) {
    cat( "initial" )
    for( i in species)
      cat( ":", i, sum( apply( get.species( community, i ), 2,
                               function(x) !all(x[c("dist","left","right","up")]==1))) - 1 )
    cat( "\n" )
  }
  
  old_counts <- if (append) getCount( community, , "counts" ) else NULL
  old_step <- if (append) getCount( community, , "step" ) else 0

  count <- list()
  ## leftist tree counters
  count$mintime <- numeric( length( species ))
  count$base <- numeric( length( species ))
  names( count$base ) <- names( count$mintime ) <- species
  count$free <- list()
  
  ## initialize lists to keep track of events
  count$events <- count$countage <- count$countsub <- count$nameage <- count$namesub <- list()
  
  ## Set up hour to degreeday spline based on range of hours if any
  simmin <- c(hr=Inf,DD=Inf)
  for( i in species ) {
    if( is.null( get.species( community, i )))
      stop( paste( "Missing species", i ))
    count$free[[i]] <- 1
    count$base[i] <- get.base( community, i )
    units <- getOrgFeature( community, i, "units" )
    tmp <- get.individual( community, i )["time"]
    if( tmp < simmin[units] )
      simmin[units]<- tmp
  }
  if( max( simmin ) < Inf ) {
    community <- activeTemp( community, simmin["hr"], , simmin["DD"], messages = messages )
  }
  esums <- c("initial","during","final")
  tmpfn <- function( counter )
  {
    rownames <- levels( counter )
    array( 0, length( rownames ), dimnames = list( rownames ))
  }
  subclass <- getOrgFeature( community, species, "subclass" )
  names( subclass ) <- species
  for( i in species ) {
    species.time <- get.individual( community, i )["time"]
    count$mintime[i] <- getTime( community, i, species.time )
    future <- getOrgFuture( community, i )
    ## possible future events
    count$events[[i]] <- matrix( 0, nrow( future ), length( esums ),
                                 dimnames = list( as.character( future$current ), esums ))
    ## current record of future events
    count$countage[[i]] <- tmpfn( getOrgFuture( community, i, "ageclass" ))
    count$countsub[[i]] <- tmpfn( getOrgInteract( community,, i, "substrate" ))
    
    if( species.time < Inf ) {
      ## count by age groups
      stage <- getOrgAlive( community, i, "stage" )
      if( length( stage )) {
        classes <- getOrgAgeClass( community, i, stage )
        tmp <- table( classes )
        count$countage[[i]][ names( tmp ) ] <- tmp
      }
      ## count by substrate
      substage <- getOrgAlive( community, i, "sub.stage" )
      ## only for individuals of class = subclass[i]
      substage <- substage[ subclass[i] == getOrgAgeClass( community, i, stage ) ]
      if( length( substage )) {
        classes <- getOrgInteract( community,, i, "substrate" )
        tmp <- table( classes[substage] )
        count$countsub[[i]][ names( tmp ) ] <- tmp
      }
    }
  }
  count$debug <- debugit
  
  # If file is NULL, then don't write to file; keep counts internal
  count$file <- file
  if (append && !is.null(old_counts)) {
    count$counts <- old_counts
    count$step <- old_step
  }
  
  community$count <- count
  
  ## Put counts in file
  community <- putCount( community, append )
  
  ## tally events at start of simulation
  setEvents( community, "initial" )
}
###########################################################################################
getCount <- function( community, species, element )
{
  count <- community$count[[element]]
  if( !missing( species ))
    count <- count[[species]]
  count
}
###########################################################################################
set.step <- function( community, step )
  setCount( community,, list( step = step ))
###########################################################################################
setCount <- function( community, species, elements )
{
  count <- community$count
  for( i in names( elements )) {
    if( missing( species ))
      count[[i]] <- elements[[i]]
    else
      count[[i]][[species]] <- elements[[i]]
  }
  community$count <- count
  community
}

# --- Source: future.events.R ---
future.events <- function( community,
                           nstep = 4000,
                           species = get.species( community ),
                           
                           refresh = nstep / 20, cex = 0.5,
                           substrate.plot = TRUE, extinct = TRUE,
                           timeit = TRUE, debugit = FALSE,
                           messages = TRUE, append = NULL, ... )
  
{
  ## Integrity check of dataset, and initialization of tallies.
  if( missing( community ))
    stop( "Must specify a community." )
  
  if (is.null(append)) {
    append <- !is.null(community$count$counts) && nrow(community$count$counts) > 0
  }
  
  if( debugit ) cat( "initialization\n" )
  community <- initCount( community, species, debugit = debugit, file = NULL,
                           append = append, messages = messages )
  if( timeit )
    community <- init.timing( community )
  
  mintime <- getCount( community, , "mintime" )
  species.now <- species[ mintime == min( mintime ) ][1]
  future <- getOrgFuture( community, species.now )
  
  # Set up list for plot information.
  p <- list()
  pstep <- 0
  if (!is.null(community$plot)) {
    p <- community$plot
    pstep <- length(p)
  }
  
  start_step <- if (append && !is.null(community$count$step)) community$count$step else 0
  
  ## for nstep steps schedule future events and process immediate events
  for( istep in seq( nstep )) {
    ## stop if any extinct and extinct flag on, or all extinct
    omintime <- mintime
    mintime <- getCount( community, , "mintime" )
    if( debugit ) print( mintime )
    if( min( mintime ) < min( omintime )) {
      cat( "time reversal!\n" ) # should not happen
      browser()
    }
    tmp <- mintime == Inf
    if( any( tmp )) {
      if( extinct | all( tmp )) {
        for( i in names( mintime )[tmp] )
          cat( "***", i, "is extinct ***\n" )
        if( plotit )
          plot.ewing( community, substrate = substrate.plot, cex = cex, ...)
        break
      }
    }
    ## each species is always sorted so 1st element is next future event
    species.prev <- species.now
    species.now <- species[ mintime == min( mintime ) ][1]
    individual <- get.individual( community, species.now )
    if( is.na( individual["time"] ) | individual["time"] == Inf ) {
      cat( "No more finite future events. End of simulation.\n" )
      break
    }
    if( all( individual[c("dist","left","right","up")] == 1 )) {
      cat( individual["time"], ": last", species.now, "alive",
           getCount( community, species.now, "base" ), "\n" )
    }
    if( species.now != species.prev )
      future <- getOrgFuture( community, species.now )
    ## make future event the current stage
    current <- individual["stage"]
    stage <- as.character( future$current[current] )
    if(!length(stage))
      stop(paste("no stage", current))
    community <- updateCount( community, species.now, individual, stage == "death",
                              start_step + istep )
    individual["stage"] <- current
    individual["sub.stage"] <- individual["sub.future"]
    community <- put.individual( community, species.now, individual )
    
    if( debugit ) {
      cat( species.now, istep, "base",
           getCount( community, species.now, "base" ), "\n" )
      print( c( step = istep, 
                countage = sum( getCount( community, species.now, "countage" )),
                countsub = sum( getCount( community, species.now, "countsub" )),
                round( individual["time"], 2 ), current, stage ))
    }
    
    ## processing of immediate, pending and future events
    ## this is the main show--all the rest is setup
    event.type <- as.character( future[ current, "event" ] )
    if( debugit ) cat( "do", event.type, istep, stage,
                       as.character( future$current[ individual["future"] ] ),
                       individual["time"], "\n" )
    community <- set.timing( community, event.type )
    if( event.type == "death" )
      community <- event.death( community, species.now )
    else {
      if( event.type != "future" ) {
        ## this routine could be user supplied
        ## generic routines are event.birth, event.attack
        event.parsed <- get( paste( "event", event.type, sep = "." ))
        community <- event.parsed( community, species.now )
      }
      community <- event.future( community, species.now )
    }
    community <- set.timing( community, event.type, 1 )
    
    ## refresh plot
    if( refresh & ! ( istep %% refresh )) {
      community <- set.timing( community, "refresh" )
      # Save the ewing_ageclass and ewing_substrate objects.
      pstep <- pstep + 1
      p[[pstep]] <- ewing_snapshot(community, start_step + istep, ...)
      
      if(messages) {
        cat( "refresh", istep )
        for( j in get.species( community ))
          cat( ":", j, sum( getCount( community, j, "countage" ), na.rm = TRUE ))
        cat( "\n" )
      }
      community <- set.timing( community, "refresh", 1 )
    }
    ## periodic browser if in debug mode
    if( debugit ) {
      cat( "done", istep, "\n" )    
      if( refresh & !( istep %% refresh )) {
        cat( "Type \"c\" to continue or \"Q\" to quit.\n" )
        browser()
      }
    }
  }
  community <- set.timing( community, "refresh" )
  ## end of main loop on future events
  if( debugit ) cat("done\n")
  
  if( sum( getOrgAlive( community, species.now )) > 1 ) {
    ## tally events at end of simulation
    community <- setEvents( community, "final" )
  }
  community <- set.timing( community, "refresh", 1 )
  
  community <- fini.timing( community )
  community$step <- start_step + nstep
  attr(community, "nstep") <- start_step + nstep
  
  if( !refresh | (nstep%%refresh)) {
    pstep <- pstep + 1
    p[[pstep]] <- ewing_snapshot(community, start_step + istep, ...)
  }
  community$plot <- p
  
  community
}

# --- Source: event.R ---
## $Id: event.R,v 1.0 2002/12/11 yandell@stat.wisc.edu Exp $
##
## Functions for Bland Ewing's modeling.
##
##     Copyright (C) 2000,2001,2002 Brian S. Yandell.
##
## 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, or (at your option) any
## later version.
##
## These functions are distributed in the hope that they 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.
##
## The text of the GNU General Public License, version 2, is available
## as http://www.gnu.org/copyleft or by writing to the Free Software
## Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
##
###############################################################################
##
## event.birth( community, species )
## event.attack( community, species )
##
## Issues to resolve:
## 2. search strategy for predator/parasite/parasitoid
## 3. generic calls to do.x
###############################################################################
event.birth <- function( community, species )
{
  ## now only one offspring at a time,
  ## but could depend on individual
  offspring <- get.offspring( community, species)
  ## update parent based on anticipated offspring
  community <- parent.birth( community, species, offspring )
  if( offspring ) {
    ## get new births
    newbirths <- get.birth( community, species, offspring )
    ## merge births into community
    community <- set.birth( community, species, newbirths )
  }
  community
}
###############################################################################
parent.birth <- function( community, species, offspring )
{
  ## get individual record
  individual <- get.individual( community, species )
  individual["offspring"] <- individual["offspring"] - offspring
  ## female starves when egg load depleted (less than or equal to 0)
  if( individual["offspring"] <= 0 )
    individual["stage"] <- set.future( community, species, "starved" )
  community <- put.individual( community, species, individual )
}
###############################################################################
get.birth <- function( community, species, offspring )
{
  ## get individual record
  individual <- get.individual( community, species )
  ## matrix of new offspring for community
  newbirths <- matrix( individual, length( individual ), offspring )
  dimnames( newbirths ) <- list( names( individual ), NULL )
  if( offspring ) {
    ## assumes newborn is stage 1, and next stage is 2
    newbirths["stage",] <- 1
    newbirths["future",] <- 2
    ## set up as unlinked node for leftist tree
    newbirths[c("dist","left","right","up"),] <- 1
    ## disperse offspring across substrate types
    newbirths <- event.move( community, species, newbirths )
  }
  if( getCount( community,, "debug" ))
    cat( round( individual["time"] ),
        getOrgFeature( community, species, "units" ),
        ":", species, "offspring", individual["offspring"], "\n" )
  if( offspring ) {
    ## get future events for new organisms
    get.future( community, species, newbirths)
  }
  else
    community
}
###############################################################################
get.deplete <- function( community, species )
{
  ## get individual record of attacker
  individual <- get.individual( community, species )
  ## Deplete reserves based on time spent searching for host.
  individual["offspring"] <- individual["offspring"] - 
    ( individual["time"] - individual["location"] ) /
      getOrgFeature( community, species, "deplete" )
  community <- put.individual( community, species, individual )
}
###############################################################################
set.future <- function( community, species, stage )
{
  current <- getOrgFuture( community, species, "current" )
  seq( length( current ))[ current == stage ]
}
###############################################################################
### Interaction Events (only attack for now)
###############################################################################
event.attack <- function( community, species )
{
  ## dyadic event: attack of host by adult parasitoid
  
  ## deplete individual based on time spent searching for host
  community <- get.deplete( community, species )
  ## get individual record of attacker
  individual <- get.individual( community, species )

  ## find a host if parasite has offspring reserve left
  if( individual["offspring"] > 0 ) {
    ## get name of host for attacker
    host <- getOrgFeature( community, species, "attack" )
    ## get attack parasite and event types
    attack <- get.attack( community, species, individual )
    ## find host located on the same substrate
    found <- event.find( community, species, host, attack["event"] )
    if( length( found )) {
      ## host-parasite interaction
      event.parsed <- get( paste( "event", attack["event"], sep="." ))
      community <- event.parsed( community, species, host, found )
      event.parsed <- get( paste( "host", attack["parasite"], sep="." ))
      community <- event.parsed( community, species, host, found )
      individual <- get.individual( community, species )
    }
  }
  if( individual["offspring"] > 0 ) {
    ## parasite moves along substrate
    individual <- event.move( community, species, individual )
  }
  else {
    ## parasite dies if it does not feed enough
    individual["stage"] <- set.future( community, species, "starved" )
  }
  ## put updated individual back in community
  community <- put.individual( community, species, individual )
}
###############################################################################
get.attack <- function( community, species, individual )
{
  ## get parasite type ("ecto" or "endo") and current event ("feed" or "ovip")
  parasite <- getOrgFeature( community, species, "parasite" )
  event <- getOrgFuture( community, species, "current", individual["future"] )
  event <- as.character( event )
  if( parasite=="endo" )
    event <- "ovip"
  else if( individual["offspring"] < 1 ) {
    ## must feed if depleted
    event <- "feed"
  }
  c( event = event, parasite = parasite )
}
###############################################################################
host.ecto <- function( community, species, host, dead )
{
  ## ectoparasites effectively kill their host

  ## get individual doing the attack
  individual <- get.individual( community, species )
  ## get host individual that is attacked
  hostindiv <- get.individual( community, host, dead )
  ## set host time to now, which may involve hr-DD translation
  hostindiv["time"] <- transTime( community, species, host, individual["time"] )
  ## schedule immediate death of host
  hostindiv["future"] <- set.future( community, host, "death" )
  ## update host record in community
  community <- put.individual( community, host, hostindiv, dead )
  ## update leftist tree and mintime
  community <- put.species( community, host,
                           leftist.update( get.species( community, host ), dead ))
  update_mintime( community, host )
}
###############################################################################
host.endo <- function( community, species, host, dead, harm )
{
  ## endoparasites reduces capacity of host (assumed by half here)
  
  ## get host individual that is attacked
  hostindiv <- get.individual( community, host, harm )
  ## schedule harm for hosts (reduce egg capacity by half)
  hostindiv["offspring"] <- floor( hostindiv["offspring"] / 2 )
  if( hostindiv["offspring"] == 0 ) {
    ## get individual doing the attack
    individual <- get.individual( community, species )
    ## set host time to now, which may involve hr-DD translation
    hostindiv["time"] <- transTime( community, species, host, individual["time"] )
    ## schedule immediate death of host
    hostindiv["future"] <- set.future( community, host, "death" )
  }
  ## update host record in community
  community <- put.individual( community, host, hostindiv, harm )
  if( hostindiv["offspring"] == 0 ) {
    ## update leftist tree and mintime
    community <- put.species( community, host,
                             leftist.update( get.species( community, host ), dead ))
    community <- update_mintime( community, host )
  }
  community
}
###############################################################################
event.feed <- function( community, species, host, dead )
{
  ## feed: adult parasite feeds on host

  interact <- get.interact( community, species, host, dead, "feed" )
  ## host-parasite interaction: feeding
  if( interact ) {
    individual <- get.individual( community, species )
    individual["offspring"] <- individual["offspring"] + interact
    community <- put.individual( community, species, individual )
  }
  community
}
###############################################################################
event.ovip <- function( community, species, host, dead, gender=TRUE )
{
  ## ovip: adult lays egg in the host to emerge later as adult
  offspring <- get.offspring( community, species )

  interact <- get.interact( community, species, host, dead, "ovip" )
  ## host-parasite interaction: feeding
  if( interact ) {
    ## update parent individual, depleting energy after egg laying
    community <- parent.birth( community, species, offspring )

    ## get new births
    newbirths <- get.birth( community, species, offspring )
    ## gender preference for offspring
    if( get.interact( community, species, host, dead, "male" ) < stats::runif( 1 ) |
      !gender ){
      ## set offspring for female eggs based on dead host
      newbirths["offspring", ] <- set.offspring( community, species, host, dead )
    }
    else {
      ## produce male and put on queue for immediate death
      newbirths <- set.male( community, species, host, newbirths )
    }
    community <- set.birth( community, species, newbirths )
  }
  community
}
###############################################################################
set.male <- function( community, species, host, newbirths )
{
  ## produce male offspring, which is queued for immediate death
  newbirths["future",1] <- set.future( community, species, "male" )
  newbirths["time",1] <- get.individual( community, species )["time"]
  newbirths
}

# --- Source: event.future.R ---
event.future <- function( community, species )
{
  ## schedule future event based on current stage
  individual <- get.future( community, species )
  ## move if appropriate
  individual <- event.move( community, species, individual )
  ## update time translation if needed
  community <- checkTime( community, individual["time"],
                          getCount( community, species, "mintime"),
                          getOrgFeature( community, species, "units" ))
  ## put updated individual back in community
  community <- put.individual( community, species, individual )
  
  ## reprioritize the leftist tree if time has changed
  if( individual["time"] > individual["location"] ) {
    ## and time is longer than next scheduled time
    if( individual["time"] >
        min( get.species.element( community, species, "time",
                                  individual[c("left","right")] ))) {
      ## remove individual from leftist tree
      community <- put.species( community, species,
                                leftist.update( get.species( community, species )))
    }
    community <- update_mintime( community, species )
  }
  community
}

# --- Source: Events.R ---
###########################################################################################
updateEvents <- function( community, species, event, increment = 1 )
{
  community$count$events[[species]][event,"during"] <-
    community$count$events[[species]][event,"during"] + increment
  community
}
###########################################################################################
setEvents <- function( community, period )
{
  count <- community$count
  for( species in get.species( community )) {
    current <- getOrgFuture( community, species, "current" )
    events <- rep( 0, length( current ))
    names( events ) <- as.character( current )
    
    stage <- getOrgAlive( community, species, "stage" )
    if( length( stage )) {
      tmp <- tapply( stage, current[stage], length )
      tmp[ is.na( tmp ) ] <- 0
      events[ names( tmp ) ] <- tmp
    }
    
    count$events[[species]][,period] <- events
  }
  community$count <- count
  community
}

# --- Source: leftist.R ---
## $Id: leftist.R,v 1.0 2002/12/11 yandell@stat.wisc.edu Exp $
##
## Functions for Bland Ewing's modeling.
##
##     Copyright (C) 2000,2001,2002 Brian S. Yandell.
##
## 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, or (at your option) any
## later version.
##
## These functions are distributed in the hope that they 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.
##
## The text of the GNU General Public License, version 2, is available
## as http://www.gnu.org/copyleft or by writing to the Free Software
## Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
##
###########################################################################################
## This version has list structure for individuals.
## In addition it will keep species separate.
###########################################################################################
## Triply linked leftist trees
###########################################################################################
leftist.tree <- function( x,
  tree = data.frame( root = empty ),
  key = "time",
  empty = c( time = NA, dist = 1, left = 1, right = 1, up = 1 ))
{
  node <- empty
  node[key] <- Inf
  node[c("right","left")] <- 2
  node["dist"] <- 0
  if( missing( tree ))
    names( tree ) <- NULL

  node <- empty
  node[key] <- x[1]
  base <- 2
  tree[[base]] <- node

  for( i in 1 + seq( 2, length( x ))) {
    node <- empty
    node[key] <- x[i-1]
    if( node[key] <= tree[[base]][key] ) {
      ## insert at root
      node["left"] <- base
      tree[[base]]["up"] <- i
      base <- i
      tree[[base]] <- node
    }
    else {
      tree[[i]] <- node
      ## insert in tree (e.g. merge two trees)
      tree <- as.data.frame( leftist.merge( as.matrix( tree ), i, base ))
      base <- tree["up",1]
    }
  }
  tree[[1]][c("right","left","up")] <- base
  tree
}
###########################################################################################
leftist.create <- function( tree, key = "time" )
{
  ## assume 1st element of tree is for base
  ## and keys are in place already
  base <- 2
  tree[c("right","left","up"),] <- 1
  tree["dist",-1] <- 1
  ntree <- ncol( tree )

  for( i in seq( 3, ntree )) {
    if( tree[key,i] <= tree[key,base] ) {
      ## insert at root
      tree["left",i] <- base
      tree["up",base] <- i
      base <- i
    }
    else {
      ## insert in tree (e.g. merge two trees)
      tree <- leftist.merge( tree, i, base )
      base <- tree["up",1]
    }
  }
  ## set 1st element to point to base
  tree[c("right","left","up"),1] <- base
  tree
}
###########################################################################################
leftist.merge <- function( tree, P = 1, Q = 1, R = 1, key = "time" )
{
  while( TRUE ) {
    if( P == 1 ) {
      P <- Q
      Q <- 1
    }
    if( Q == 1 ) {
      D <- tree["dist",P]
      while( R > 1 ) {
        Q <- tree["right",R]
        temp <- tree["left",R]
        if( tree["dist",temp] < D ) {
          D <- tree["dist",temp] + 1
          tree["right",R] <- tree["left",R]
          tree["left",R] <- P
        }
        else {
          D <- D + 1
          tree["right",R] <- P
        }
        tree["up",P] <- R
        tree["dist",R] <- D
        P <- R
        R <- Q
      }
      tree["up",P] <- 1
      tree[c("left","right","up"),1] <- P
      return( tree )
    }
    ## merge two right lists
    if( tree[key,P] <= tree[key,Q] ) {
      temp <- tree["right",P]
      tree["right",P] <- R
      tree["up",R] <- P
      R <- P
      P <- temp
    }
    else {
      temp <- tree["right",Q]
      tree["right",Q] <- R
      tree["up",R] <- Q
      R <- Q
      Q <- temp
    }
  }
  tree["up",1] <- P
  tree[c("left","right","up"),P] <- 1
  tree
}
###########################################################################################
leftist.remove <- function( tree, P )
{
  oldbase <- tree["up",1]
  up <- tree["up",P]

  ## merge the subtrees below P
  tree <- leftist.merge( tree, tree["left",P], tree["right",P] )

  ## reset node to empty
  tree[c("up","left","right","dist"),P] <- 1

  ## return if base node removed
  if( oldbase == P )
    return( tree )

  ## make up node leftist
  if( tree["left",up] == P )
    tree["left",up] <- tree["right",up]
  tree["right",up] <- 1
  tree["dist",up] <- 1

  ## traverse back up the tree to make sure it is leftist to base
  upup <- tree["up",up]
  left <- tree["left",upup]
  right <- tree["right",upup]
  while( tree["dist",left] < tree["dist",right] ) {
    tree["dist",upup] <- tree["dist",left] + 1
    tree["left",upup] <- right
    tree["right",upup] <- left
    upup <- tree["up",upup]
    left <- tree["left",upup]
    right <- tree["right",upup]
  }
  ## merge down and up trees
  leftist.merge( tree, oldbase, tree["up",1] )
}
###########################################################################################
leftist.birth <- function( organism, neworg, free )
{
  newbase <- organism["up",1]
  norganism <- ncol( neworg )
  j <- norganism
  nfree <- free[1]
  while( j > 0 & nfree > 1 ) {
    newbabe <- free[nfree]
    organism[,newbabe] <- neworg[,j]
    organism <- leftist.merge( organism, newbase, newbabe )
    newbase <- organism["up",1]
    nfree <- nfree - 1
    free[1] <- nfree
    j <- j - 1
  }
  if( j > 0 ) {
    norganism <- ncol( organism )
    js <- 1:j
    organism <- cbind( organism, neworg[,js] )
    for( i in norganism + js ) {
      organism <- leftist.merge( organism, newbase, i )
      newbase <- organism["up",1]
    }
  }
  list( tree = organism, base = newbase, free = free )
}
###########################################################################################
leftist.free <- function( free, id )
{
  free[1] <- tmp <- free[1] + 1
  free[tmp] <- id
  free
}
###########################################################################################
leftist.update <- function( tree, P = tree["up",1] )
{
  tree <- leftist.remove( tree, P )
  leftist.merge( tree, tree["up",1], P )
}

# --- Source: community.R ---
get.organisms <- function(datafile = "") {
  org <- list(species = c("host", "parasite"), substrates = "substrate")
  if(datafile != "") {
    if(tools::file_ext(datafile) %in% c("xls","xlsx")){
      sheets <- readxl::excel_sheets(datafile)
      species <- stringr::str_remove(
        sheets[stringr::str_detect(sheets, "future\\.")],
        "future\\.")
      substrates <- unique(stringr::str_remove(
        sheets[stringr::str_detect(sheets, paste("\\.", species, sep = "", collapse = "|")) &
        !stringr::str_detect(sheets, paste(c("future", species), "\\.", sep = "", collapse = "|"))],
        "\\..*"))
      org <- list(species = species, substrates = substrates)
    }
  }
  org
}
###########################################################################################
get.species <- function( community, species ) {
  if( missing( species ))
    return( names( community$pop ))
  if( is.numeric( species ))
    species <- names( community$pop )[species]
  if( is.null( species ) || !species %in% names( community$pop ))
    return( NULL )
  
  ans <- community$pop[[species]]
  if (is.list(ans) && !is.matrix(ans) && !is.data.frame(ans) && !is.null(ans$org)) {
    ans <- ans$org
  }
  if (is.matrix(ans) || is.data.frame(ans)) {
    if (!"up" %in% rownames(ans) && (is.null(colnames(ans)) || colnames(ans)[1] != "dummy")) {
      dummy <- ans[, 1, drop = FALSE]
      colnames(dummy) <- "dummy"
      return(cbind(dummy, ans))
    }
  }
  ans
}
###########################################################################################
get.species.element <- function( community, species, rows, cols )
  community$pop[[species]][rows,cols]
###########################################################################################
put.species <- function( community, species, value )
{
  community$pop[[species]] <- value
  community
}
###############################################################################
put.individual <- function( community, species, individual,
                           id = get.base( community, species ))
{
  community$pop[[species]][,id] <- individual
  community
}  
###############################################################################
get.individual <- function( community, species,
                           id = get.base( community, species ))
  community$pop[[species]][,id]
###############################################################################
get.base <- function( community, species )
  community$pop[[species]]["up",1]

# --- Source: c.ewing.R ---
c.ewing <- function(...) {
  communities <- list(...)
  if(length(communities) < 2) {
    if(length(communities) == 1)
      return(communities[[1]])
    return(NULL)
  }

  community <- communities[[1]]
  
  # *** need to verify that all communities have save structure
  # Elements org, temp should be identical
  
  for(comi in seq(2, length(communities))) {
    # Element pop
    for(species in names(community$pop)) {
      community$pop[[species]] <-
        cbind(community$pop[[species]], communities[[comi]]$pop[[species]])
    }
    # Element cpu
    community$cpu <- community$cpu + communities[[comi]]$cpu
  }
  # Element plot is more complicated as it contains items for plots
  # Probably want some form of appendX functions
}

# --- Source: move.R ---
## $Id: move.R,v 1.0 2002/12/09 yandell@stat.wisc.edu Exp $
##
## Functions for Bland Ewing's modeling.
##
##     Copyright (C) 2000,2001,2002 Brian S. Yandell.
##
## 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, or (at your option) any
## later version.
##
## These functions are distributed in the hope that they 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.
##
## The text of the GNU General Public License, version 2, is available
## as http://www.gnu.org/copyleft or by writing to the Free Software
## Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
##
###############################################################################
event.move <- function( community, species, individual )
{
  individual <- as.matrix( individual )
  ## move only if individual is in stage that moves
  if( all( is.move( community, species, individual ))) {
    ## move among substrates?
    individual["sub.future",] <-
      sampleOrgSubstrate( community, species, individual["sub.stage",] )
    ## move to new position in substrate
    position <- paste( "pos", letters[1:3], sep = "." )
    individual[position,] <- rtri( ncol( individual ), 10, individual[position,] )
  }
  if( ncol( individual ) == 1 )
    individual <- individual[,1]
  individual
}
###############################################################################
is.move <- function( community, species, individual )
{
  !is.na( match( getOrgFeature( community, species, "move" ), 
                getOrgFuture( community, species, "current" )[ individual["stage",] ] ))
}
###############################################################################
event.find <- function( community, species, host, event )
{
  individual <- get.individual( community, species )
  substrate <- individual["sub.stage"]
  ## pending event: need to find available hosts on substrate
  avail <- get.alive( community, host, substrate )
  navail <- length( avail )
  if( !navail )
    return( avail )
  
  ## preferences based on schedule
  interact <- get.interact( community, species, host, avail, event )
  if( length( event ) > 1 )
    interact <- apply( interact, 1, sum )
  sinteract <- sum( interact )
  if( sinteract ) {
    if( navail > 1 ) {
      found <- sample( avail, 1, prob = interact / sinteract )
    }
    else
      found <- avail
    found
  }
  else
    numeric(0)
}

# --- Source: offspring.R ---
## $Id: init.R,v 1.0 2002/12/09 yandell@stat.wisc.edu Exp $
##
## Functions for Bland Ewing's modeling.
##
##     Copyright (C) 2000,2001,2002 Brian S. Yandell.
##
## 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, or (at your option) any
## later version.
##
## These functions are distributed in the hope that they 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.
##
## Offspring Information
##########################################################################################
getOffspring <- function( community, species,
                         offspring = getOrgFeature( community, species, "offspring" ))
{
  if( is.na( offspring ))
    return( 0 )
  if( is.numeric( offspring ))
    return( offspring )
  getOrgInteract( community, offspring, species, "offspring" )
}
##########################################################################################
initOffspring <- function( community, species )
{
  hostname <- getOrgFeature( community, species, "offspring" )

  ## find if there is offspring load based on host
  orgoffspring <- getOffspring( community, species, hostname )

  norganism <- sum( getOrgAlive( community, species ))

  if( length( orgoffspring ) == 1 ) {
    ## mean offspring does not depend on any host
    offspring <- stats::rpois( norganism, orgoffspring )
  }
  else {
    orgoffspring <- orgoffspring[ orgoffspring > 0 ]
    
    if(!length(orgoffspring))
      return(community)
  
    ## figure out initial offspring load based on host distribution

    ## mean offspring depends on host stages and events
    host <- get.species( community, hostname )
    if( is.null( host ))
      stop( paste( "Host", hostname, "not initiated yet" ))

    ## get weights of host stages in terms of future event times
    host <- host[ , getOrgAlive( community, hostname ) ]

    ## find host stages that are preferred by parasite
    ## need to take subset of current that are actually in host
    hoststages <- match( names( orgoffspring ), getOrgFuture( community, hostname )$current,
                        nomatch = 0 )
    host <- as.matrix( host[ , !is.na( match( host["stage",], hoststages )) ] )
    if( ncol( host ) == 0 )
      return( community )

    tmp <- !is.na( match( hoststages, host["stage",] ))
    hoststages <- hoststages[tmp]
    orgoffspring <- orgoffspring[tmp]

    if(!length(orgoffspring))
      return(community)
    
    dd <- tapply( host["time",], host["stage",], sum )
    dd[ as.character( hoststages[
      is.na( match( hoststages, names( dd ))) ] ) ] <- 0
    dd[ is.na( dd ) ] <- 0
    sdd <- sum( dd )
    if( length( dd ) > 1 & sdd > 0)
      offspring <- as.vector( sample( orgoffspring, norganism, replace = TRUE,
        prob = dd / sdd ))
    else
      offspring <- rep( ( sdd > 0 ) * orgoffspring[1], norganism )
    offspring[ is.na( offspring ) ] <- 0
  }
  organism <- get.species( community, species )
  organism["offspring",-1] <- offspring
  put.species( community, species, organism )
}
###############################################################################
get.offspring <- function( community, species )
{
  individual <- get.individual( community, species )
  if( individual["offspring"] > 0 )
    1
  else
    0
}
###########################################################################################
set.offspring <- function( community, species, host, dead )
{
  stage <- get.species.element( community, host, "stage", dead )
  current <- getOrgFuture( community, host, "current", stage )
  offspring <- getOrgInteract( community, host, species, "offspring")
  offspring <- as.vector( offspring[ as.character( current ) ] )
  offspring[ is.na( offspring ) ] <- 0
  offspring
}

# --- Source: sim.R ---
## $Id: sim.R,v 0.9 2002/12/09 yandell@stat.wisc.edu Exp $
##
## Functions for Bland Ewing's modeling.
##
##     Copyright (C) 2000,2001,2002 Brian S. Yandell.
##
## 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, or (at your option) any
## later version.
##
## These functions are distributed in the hope that they 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.
##
## The text of the GNU General Public License, version 2, is available
## as http://www.gnu.org/copyleft or by writing to the Free Software
## Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
##
### migrate count$count* to writeCount and then retrieve with readCount
###########################################################################################
updateCount <- function(community, species, individual, is.death = FALSE, step) {
  community <- updateEvents(community, species, individual["future"])
  if (!missing(step)) {
    community <- setCount(community, elements = list(step = step))
  }

  ## move individual through age classes or drop if it dies
  countage <- getCount( community, species, "countage" )
  ageclass <- getOrgAgeClass( community, species, individual["stage"] )
  if( !is.na( ageclass )) {
    ageclass <- as.character( ageclass )
    countage[ageclass] <- max(countage[ageclass] - 1, 0)
  }
  ageclass <- getOrgAgeClass( community, species, individual["future"] )
  if( !is.na( ageclass )) {
    ageclass <- as.character( ageclass )
    countage[ageclass] <- countage[ageclass] + 1
  }
  ## move individual across substrate elements or drop if it dies
  countsub <- getCount( community, species, "countsub" )
  substrate <- getOrgFeature( community, species, "substrate" )
  elements <- getOrgInteract( community, substrate, species, "substrate" )
  element <- elements[ individual["sub.stage"] ]
  subclass <- getOrgFeature( community, species, "subclass" )
  include <- subclass == getOrgAgeClass( community, species, individual[c("stage","future")] )
  # need 2 values; if only one, replicate it.
  include <- rep_len(include, 2)
  ## leave old substrate
  if (!is.na(element) && include[1]) {
    element <- as.character( element )
    countsub[element] <- max(countsub[element] - 1, 0)
  }
  if (!is.death && include[2]) {
    ## move to new substrate
    newsub <- individual["sub.future"]
    if( !is.na( newsub )) {
      element <- elements[newsub]
      if( !is.na( element )) {
        element <- as.character( element )
        countsub[element] <- countsub[element] + 1
      }
    }
  }
  ## record counts
  community <- setCount( community, species,
                        list( countage = countage, countsub = countsub ))
  community <- writeCount( community, species, individual["time"], individual["future"],
               countage, countsub )
}
###########################################################################################
updateCounts <- function( community, species, newbirths )
{
  community <- updateEvents( community, species, 1, newbirths )
  
  countage <- getCount( community, species, "countage" )
  countsub <- getCount( community, species, "countsub" )
  subclass <- getOrgFeature( community, species, "subclass" )
  ageclass <- getOrgAgeClass( community, species, 1 )
  individual <- get.individual( community, species )
  if( !is.na( ageclass[1] )) {
    ageclass <- as.character( ageclass )
    countage[ageclass] <- newbirths + countage[ageclass]
    if( subclass == ageclass ) {
      substrate <- getOrgSubstrate( community, species, individual["sub.stage"] )
      if( !is.na( substrate[1] )) {
        substrate <- as.character( substrate )
        countsub[substrate] <- newbirths + countsub[substrate]
      }
    }
  }
  community <- setCount( community, species,
                        list( countage = countage, countsub = countsub ))
  community <- writeCount( community, species, individual["time"], 1, countage, countsub )
}
###########################################################################################
put.base <- function( community, species, id,
                     free = getCount( community, species, "free" ))
{
  base <- get.base( community, species )
  if( !missing( id ))
    free <- leftist.free( free, id )
  mintime <- max( getCount( community, species, "mintime" ),
                 getTime( community, species,
                         get.species.element( community, species, "time", base )))
  setCount( community, species, list( base = base, free = free, mintime = mintime ))
}

# --- Source: simple.R ---
simpleServer <- function(id) {
  shiny::moduleServer(id, function(input, output, session) {
    ns <- session$ns
    
  })
}
simpleInput <- function(id) {
  ns <- shiny::NS(id)
  shiny::tagList(
    shiny::h4("Simulation Settings"),
    shiny::sliderInput(ns("steps"),
                       label = "Simulation steps:",
                       min = 1000,
                       max = 10000,
                       value = 1000,
                       step = 500),
    shiny::radioButtons(ns("nsim"),
                        "Number of Simulations",
                        c(1,10,20,50,100,200),
                        1, inline = TRUE),
    shiny::actionButton(ns("go"), "Start Simulation"),
    
    shiny::HTML("<hr style='height:1px;border:none;color:#333;background-color:#333;' />"),
    shiny::h4("Save Files"),
    shiny::uiOutput(ns("version"))
  )
}
simpleOutput <- function(id) {
  ns <- shiny::NS(id)
  shiny::tagList(
    shiny::radioButtons(ns("button"), "", c("Plots", "Input Data"),
                        "Plots", inline = TRUE),
  )
}
simpleApp <- function(title = "Population Ethology") {
  ui <- shiny::fluidPage(
    shiny::titlePanel(title),
    shiny::sidebarLayout(
      shiny::sidebarPanel(
        simpleInput("simple")
      ),
      shiny::mainPanel(
        simpleOutput("simple")
    )))
  
  server <- function(input, output, server) {
    simpleServer("simple")
  }
  
  shiny::shinyApp(ui = ui, server = server)
}

# --- Source: ring.R ---
## $Id: ring.R,v 1.0 2002/12/09 yandell@stat.wisc.edu Exp $
##
## Functions for Bland Ewing's modeling.
##
##     Copyright (C) 2000,2001,2002 Brian S. Yandell.
##
## 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, or (at your option) any
## later version.
##
## These functions are distributed in the hope that they 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.
##
## The text of the GNU General Public License, version 2, is available
## as http://www.gnu.org/copyleft or by writing to the Free Software
## Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
##
###########################################################################################
## Doubly linked rings
###########################################################################################
ring.add <- function( ring = data.frame( root = c( key = NA, left = 1 + nx, right = 2 )),
  x )
{
  nx <- length( x )
  n1 <- ring["left","root"]
  ring[[ as.character( n1 + 1 ) ]] <- c(
    key = x[1],
    left = suppressWarnings(as.numeric( ring["left","root"] )),
    right = 1 )
  
  if( nx > 1 ) for( i in seq( 2, nx ))
  {
    ring[[ as.character( n1 + i ) ]] <- c(
      key = x[i],
      left = n1+i-1,
      right = 1 )
    ring[ "right", as.character( n1 + i - 1 ) ] <- n1+i
  }
  ring["left","root"] <- n1 + nx
  ring
}
###########################################################################################
ring.remove <- function( ring, P )
{
  aP <- as.character( P )
  if( is.na( match( aP, names( ring ))))
  {
    cat( paste( "Warning:", aP, "not found in ring\n" ))
    return( ring )
  }
  left <- ring["left",aP]
  right <- ring["right",aP]
  ring[ "right", as.character( left ) ] <- right
  ring[ "left", as.character( right ) ] <- left
  ring[[aP]] <- NULL
  ring
}

# --- Source: sierpinski.R ---
sierpinski <- function( stage = 5, reset = TRUE )
{
  if( reset )
    tmpar <- graphics::par( pty = "s", bty = "n", xaxt = "n", yaxt = "n", omi = rep(0,4),
                            mar = rep(0,4) )
  aa <- 0:1
  bb <- - aa
  for( i in seq( stage )) {
    tmp <- gasket( aa, bb )
    aa <- tmp$aa
    bb <- tmp$bb
    tri <- tri2car.default( aa, bb )
    r <- range( unlist( tri ))
    plot( r, r, type = "n", xlab = "", ylab = "" )
    graphics::lines(tri )
    graphics::mtext( paste( "(", letters[1+i], ") Gasket of Order ", i, sep = "" ), 3, -2 )
    #    graphics::mtext( paste( "Gasket of order", i ), 3, -2 )
  }
  if( reset )
    graphics::par( tmpar )
  invisible( tri )
}

# --- Source: fileCount.R ---
putCount <- function( community, append = FALSE )
{
  species <- get.species( community )
  
  countage <- getCount( community,, "countage")
  countsub <- getCount( community,, "countsub")
  countbase <- getCount( community,, "base")
  step_now <- if (append) (getCount( community,, "step" ) %||% 0) else 0
  
  cnames <- c("step", "time", "future",
              paste( "count", 
                     seq( max( unlist( lapply( countage, length )) +
                                 unlist( lapply( countsub, length )))),
                     sep = "" ))

  cnums <- list()
  for( i in species ) {
    cnums[[i]] <- c(
      step_now,
      get.species.element( community, i, c("time","stage"), countbase[i] ),
      countage[[i]],
      countsub[[i]])
  }

  file <- getCount( community,, "file" )
  if(!is.null(file) && is.character(file) && length(file) > 0) {
    if( !( file.exists( file ) & append ))
      cat( "species", cnames, "\n", file = file )
    for( i in species ) {
      cat( i, cnums[[i]], "\n", file = file, append = TRUE )
    }
    community
  } else {
    if(append) {
      counts <- getCount( community,, "counts")
    } else {
      counts <- NULL
    }
    newcounts <- matrix(NA, length(species), length(cnames),
                       dimnames = list(species, cnames)) 
    for(i in species) {
      newcounts[i, seq_along(cnums[[i]])] <- cnums[[i]]
    }
    newcounts <- tibble::tibble(
      data.frame(
        species = species,
        newcounts))
    counts <- dplyr::bind_rows(
      counts,
      newcounts)
    
    setCount( community,, list(counts = counts))
  }
}
###########################################################################################
writeCount <- function( community, species, time, future, countage, countsub)
{
  nstep <- getCount( community,, "step" )
  
  cnums <- c(nstep, time, future, countage, countsub)
  
  file <- getCount( community,, "file" )
  if(!is.null(file) && is.character(file) && length(file) > 0) {
    cat( species, cnums, "\n", file = file, append = TRUE )
    
    community
  } else {
    counts <- getCount( community,, "counts")
    cnames <- names(counts)[-1]
    
    newcounts <- matrix(NA, 1, length(cnames),
                          dimnames = list(species, cnames)) 
    newcounts[1, seq_along(cnums)] <- cnums
    
    newcounts <- tibble::tibble(
      data.frame(
        species = species,
        newcounts))
    counts <- dplyr::bind_rows(
      counts,
      newcounts)
    
    setCount( community,, list(counts = counts))
  }
}
###########################################################################################
readCount <- function( community, species = unique(counts$species) )
{
  file <- getCount( community,, "file" )
  if(!is.null(file)) {
    counts <- utils::read.table( file, header = TRUE, fill = TRUE )
  } else {
    counts <- getCount( community,, "counts")
  }
  
  count <- list()
  for( i in species ) {
    colnames <- c( levels( getOrgFuture( community, i, "ageclass" )),
                   levels( getOrgInteract( community,, i, "substrate" )))
    count[[i]] <- as.matrix( counts[ counts$species == i, seq( 2, 4 + length( colnames )) ] )
    dimnames( count[[i]] ) <- list( count[[i]][,"step"],
                                    c( "step", "time", "future", colnames ))
  }
  count
}


# --- Source: count.join.R ---
count.join <- function( ... )
{
  x <- list( ... )
  numnum <- list()
  for( i in seq( length( x ))) {
    for( j in names( x[[i]] )) {
      if( is.null( numnum[[j]] ))
        numnum[[j]] <- x[[i]][[j]]
      else
        numnum[[j]] <- cbind( numnum[[j]], x[[i]][[j]] )
    }
  }
  numnum
}

# --- Source: summary.ewing.R ---
summary.ewing <- function(object, ...) {
  out <- list()
  out$package <- object$org$package
  out$species <- names(object$org$Future)
  out$interact <- names(object$org$Interact)
  out$meanvalue <- list()
  for(i in out$species) {
    out$meanvalue <- names(object$org$MeanValue[[i]])
  }
  if(length(object$pop)) {
    out$stage <- list()
    for(i in out$species)
      out$stage[[i]] <- 
        table(object$org$Future[[i]]$current[getOrgAlive(object, i, "stage")])
  }
  if(!is.null(object$count)) {
    out$events <- object$count$events
    
    for( i in seq( length(out$events)))
      out$events[[i]] <- apply(out$events[[i]], 2, function(x) {
        tmp <- sum(x, na.rm = TRUE)
        if(tmp > 0)
          c(round(100 * x / tmp, 1), total = tmp)
        else
          c(x, total = 0)
      })
  }
  out$cpu <- signif(object$cpu, 4)
  class(out) <- c("summary.ewing", class(out))
  out
}
print.summary.ewing <- function(x, ...) {
  cat("Data initialization package:", x$package, "\n")
  cat("Community species:", paste(x$species, collapse = ", " ), "\n")
  cat("Community hosts:", paste(x$interact, collapse = ", "), "\n")
  cat("Mean Value curves by species:")
  mv <- FALSE
  for(i in x$species) {
    meanvalue <- x$meanvalue[[i]]
    mv <- mv | !is.null(meanvalue)
    if( !is.null(meanvalue)) {
      cat("\n  ", i, ":", paste( meanvalue, collapse = ", " ), "\n")
    }
  }
  if(!mv)
    cat(" none\n")
  
  if(!is.null(x$stage)) {
    cat("\nSimulation community has following counts:\n",
        paste(x$species, lapply(x$stage, sum), sep = "=", collapse = ", "),
        "\n")
    print(x$stage)
  }
  if( !is.null( x$temp )) {
    # ** later
  }
  if(!is.null(x$events)) {
    print(x$events)
  }
  if(!is.null(x$cpu)) {
    cat( "CPU timing by event in simulation\n" )
    print(x$cpu)
  }
}

# --- Source: summary_simobj.R ---
summary_simobj <- function(object) {
  out <- sapply(object, function(x) {
    if(is.list(x)) {
      x <- names(x)
    }
    paste(x, collapse=",")
  })
  paste(paste(names(out), out, sep = ": "), collapse = "<br>")
}

# --- Source: ewing_discrete.R ---
ewing_discrete <- function(nsim, verbose = FALSE, ...) {
  sims <- seq_len(nsim)
  
  object <- as.list(sims)
  names(object) <- sims
  
  for(i in sims) {
    if(verbose) cat(".")
    object[[i]] <- ewing_discrete1(...)
  }
  make_ewing_discrete(object)
}
ewing_discrete1 <- function(siminit = init.simulation(interact = FALSE,
                                                    messages = FALSE, ...),
                            increment = 0.5, ...)
{
  # Make sure increment is 1,2,5 x power of 10
  incr <- pretty(increment)
  increment <- incr[which.min(abs(incr - increment))[1]]
  
  out <- future.events(siminit, refresh = 1000,
                       plotit = FALSE, messages = FALSE, ...)
  attrs <- attributes(out)
  
  # Get age classes used later for summaries and plots
  items <- purrr::map(out$org$Future, function(x) levels(factor(x$ageclass)))
  
  out <- readCount(out)
  out <- purrr::map(
    out,
    function(x) {
      purrr::map_df(
        dplyr::distinct(
          purrr::map_df(
            dplyr::mutate(
              as.data.frame(x),
              time = ifelse(.data$step == 0, 0,
                            increment * ceiling(.data$time / increment))),
            rev),
          .data$time, .keep_all = TRUE),
        rev)
    })
  attr(out, "count") <- attrs$count
  attr(out, "nstep") <- attrs$nstep
  attr(out, "items") <- items
  out
}
summary.ewing_discrete <- function(object, ...) {
  summary(ewing_envelopes(object), ...)
}

# --- Source: make_ewing_discrete.R ---
make_ewing_discrete <- function(object) {  
  nsim <- length(object)
  class(object) <- c("ewing_discrete", class(object))
  
  attr(object, "species") <- species <- names(object[[1]])
  attr(object, "ordinate") <- "time"
  attr(object, "count") <- attr(object[[1]], "count")
  attr(object, "nstep") <- attr(object[[1]], "nstep")
  attr(object, "items") <- attr(object[[1]], "items")
  attr(object, "nsim") <- nsim
  object
}

# --- Source: ggplot_ewing.R ---
ggplot_ewing <- function(object, step = 0, ageclass = TRUE,
                         substrate = !ageclass, ...)
{
  if(!inherits(object, "ewing_snapshot")) {
    object <- ewing_snapshot(object, step, ...)
  }
  step <- object$step
  
  p <- list()
  i <- 0
  if(ageclass) {
    i <- i + 1
    p[[i]] <- ggplot2::autoplot(object$ageclass, ...)
  }
  if(substrate) {
    species <- names(object$substrate)
    for(j in species) {
      i <- i + 1
      p[[i]] <- ggplot2::autoplot(object$substrate[[j]], ...)
    }
  }
  if(length(p) == 1) p <- p[[1]]
  p
}
autoplot.ewing <- function(object, ...) {
  ggplot_ewing(object, ...)
}
plot.ewing <- function(x, ...) {
  ggplot_ewing(x, ...)
}

# --- Source: ggplot_current.R ---
ggplot_current <- function( x,
                          species,
                          col = as.character( future$color[stage] ),
                          headstuff = c( 0, "start"),
                          units = getOrgFeature( x, species, "units" ),
                          right = species, adj = c(0,.5,1),
                          position = paste( "pos", letters[1:3], sep = "." ),
                          pch = as.character( future$pch[stage] ), cex = 0.5,
                          stage = organism["stage",],
                          xlab = "horizontal", ylab = "vertical",
                          future = getOrgFuture( x, species, c("color","pch") ),
                          facet = TRUE, ...)
{
  ## plot current stages for species (except random parasites)
  organism <- get.species( x, species )[,-1]
  if(is.null(organism))
    return(NULL)
  
  tri_coord <- tri2car( organism[position,] )
  tri_coord$col <- NA
  tri_coord$label <- pch
  values <- future$color
  names(values) <- future$pch
  values <- unique(values)

  # Facet by Substrate.
  # This needs to use generic function to get substrate names.
  tmp <- names(x$org$Interact$substrate$substrate)
  tri_coord$substrate <- tmp[organism["sub.stage",]]
  
  p <- ggplot2::ggplot(tri_coord) +
    ggplot2::aes(x, y, col = label, label = label) +
    ggplot2::geom_text(size=3) +
    ggplot2::xlab(xlab) +
    ggplot2::ylab(ylab) +
    ggplot2::ggtitle(paste(units, "future event", right),
      subtitle = paste(headstuff, collapse = " ")) +
    ggplot2::scale_color_manual(values = values)
  if(facet) {
    p <- p + ggplot2::facet_wrap(~substrate)
  }
  p
}

# --- Source: plot_null.R ---
plot_null <- function(msg = "no data") {
  ggplot2::ggplot(data.frame(x = 1, y = 1), 
                  ggplot2::aes(.data$x, .data$y, label = msg)) +
    ggplot2::geom_text(size = 10) + 
    ggplot2::theme_void()
}

# --- Source: step_controls.R ---
step_size_choices <- c(1, 2, 5, 10, 20, 50, 100, 200, 500, 1000, 2000)

step_size_slider <- function(inputId, label = "Steps per click:", selected = 50) {
  idx <- match(selected, step_size_choices)
  if (is.na(idx)) idx <- 6
  sl <- shiny::sliderInput(inputId, label, min = 1, max = length(step_size_choices), value = idx, step = 1, ticks = TRUE)
  sl$children[[2]]$attribs[['data-values']] <- paste(step_size_choices, collapse = ",")
  sl
}

parse_step_size <- function(val) {
  if (is.null(val)) return(50)
  num <- round(as.numeric(val))
  if (is.na(num)) return(50)
  
  # Direct large values (e.g., 20, 50, 100, 200, 500, 1000, 2000)
  if (num %in% step_size_choices && num > 10) {
    return(num)
  }
  
  # 0-based JavaScript index from ion.rangeSlider (0 to 10)
  if (num >= 0 && num < length(step_size_choices)) {
    return(step_size_choices[num + 1])
  }
  
  # Fallback for direct value
  if (num %in% step_size_choices) {
    return(num)
  }
  
  50
}

axisUnitInput <- function(id, time_label = "Time", selected = "step") {
  ns <- shiny::NS(id)
  choices <- c("Steps" = "step")
  choices[time_label] <- "time"
  shiny::radioButtons(ns("x_var"), "Display Units:",
                      choices = choices,
                      selected = selected, inline = TRUE)
}

axisUnitServer <- function(id) {
  shiny::moduleServer(id, function(input, output, session) {
    shiny::reactive({ if (!is.null(input$x_var)) input$x_var else "step" })
  })
}

ageClassControlInput <- function(id, time_label = "Time") {
  ns <- shiny::NS(id)
  shiny::tagList(
    axisUnitInput(ns("axis_unit"), time_label = time_label),
    shiny::checkboxInput(ns("norm"), "Normalize Plot", TRUE),
    shiny::checkboxInput(ns("total"), "Include Total in Plot", TRUE)
  )
}

ageClassControlServer <- function(id) {
  shiny::moduleServer(id, function(input, output, session) {
    x_var <- axisUnitServer("axis_unit")
    list(
      x_var = x_var,
      norm = shiny::reactive({ if (!is.null(input$norm)) input$norm else TRUE }),
      total = shiny::reactive({ if (!is.null(input$total)) input$total else TRUE })
    )
  })
}

# --- Source: initParApp.R ---
initParApp <- function(title = "Population Ethology") {
  ui <- bslib::page_sidebar(
    title = title,
    sidebar = bslib::sidebar(
      initParInput("init_par")),
    initParUI("init_par"),
    initParOutput("init_par")
  )
  server <- function(input, output, server) {
    init_par <- initParServer("init_par")
  }
  shiny::shinyApp(ui = ui, server = server)
}
initParServer <- function(id, simres = shiny::reactiveVal(NULL), datafile = shiny::reactiveVal("")) {
  shiny::moduleServer(id, function(input, output, session) {
    ns <- session$ns
    
    species <- shiny::reactive({
      get.organisms()$species
    })
    output$sppsize <- shiny::renderUI({
      shiny::req(species()) # "host", "parasite"
      lapply(species(), function(x) {
        shiny::sliderInput(ns(x),
                           label = paste0("Number of ", x, "s:"),
                           min = 0,
                           max = 500,
                           value = 100,
                           step = 20)
      })
    })

    datanames <- shiny::reactive({
      getOrgNames()
    })
    output$inputfiles <- shiny::renderUI({
      shiny::tagList(
        shiny::selectInput(ns("dataname"), "", datanames(), "organism.features"),
        DT::dataTableOutput(ns("org_table")))
    })
    
    output$org_table <- DT::renderDataTable({
      getOrgDataSimple(simres(), shiny::req(input$dataname), datafile())
    }, escape = FALSE, options = list(scrollX = TRUE, pageLength = 10))
    
    # Show parameters
    output$show_par <- shiny::renderUI({
      nlist <- names(input)
      # Remove any internal inputs, which have numbers.
      glist <- grep("[0-9]", names(input))
      if(length(glist))
        nlist <- nlist[-glist]
      # Construct output string.
      out <- paste0("inputs: ", paste(nlist, collapse = ", "))
      for(i in nlist) {
        out <- paste(out, "<br>",
                     paste(i, input[[i]], sep = " = "))
      }
      shiny::HTML(out)
    })
    
    # Return.
    input
  })
}
initParInput <- function(id) {
  ns <- shiny::NS(id)
  shiny::uiOutput(ns("sppsize"))
}
initParUI <- function(id) {
  ns <- shiny::NS(id)
  shiny::uiOutput(ns("show_par"))
}
initParOutput <- function(id) {
  ns <- shiny::NS(id)
  shiny::uiOutput(ns("inputfiles"))
}

# --- Source: initApp.R ---
initApp <- function(title = "Population Ethology") {
  ui <- bslib::page_sidebar(
    title = title,
    sidebar = bslib::sidebar(
      initParInput("init_par")),
    initOutput("init"),
    substrateOutput("substrate")
  )
  server <- function(input, output, server) {
    init_par <- initParServer("init_par")
    siminit <- initServer("init", init_par)
    substrateServer("substrate", siminit)
  }
  shiny::shinyApp(ui = ui, server = server)
}
initServer <- function(id, init_par) {
  shiny::moduleServer(id, function(input, output, session) {
    ns <- session$ns
    
    siminit <- shiny::reactive({
      init.simulation(count = as.numeric(c(shiny::req(init_par$host),
                                           shiny::req(init_par$parasite))))
    })
    
    output$init <- shiny::renderUI({
      out <- summary_simobj(shiny::req(siminit()))
      shiny::HTML(out)
    })

    # Return.
    siminit
  })
}
initOutput <- function(id) {
  ns <- shiny::NS(id)
  shiny::uiOutput(ns("init"))
}

# --- Source: substrateApp.R ---
substrateApp <- function(title = "Substrate Organism Movement Explorer") {
  ui <- bslib::page_sidebar(
    title = title,
    sidebar = bslib::sidebar(
      initParInput("init_par"),
      shiny::hr(),
      substrateInput("substrate")),
    substrateOutput("substrate")
  )
  server <- function(input, output, server) {
    init_par <- initParServer("init_par")
    siminit <- initServer("init", init_par)
    substrateServer("substrate", siminit)
  }
  
  shiny::shinyApp(ui = ui, server = server)
}

substrateInput <- function(id) {
  ns <- shiny::NS(id)
  shiny::tagList(
    shiny::div(
      style = "font-size: 0.85rem;",
      shiny::h4("Substrate Display & Stepping", style = "font-size: 1rem; font-weight: 600; margin-bottom: 8px;"),
      shiny::checkboxGroupInput(ns("show_species"), "Species to Display:",
                                choices = c("Host" = "host", "Parasite" = "parasite"),
                                selected = c("host", "parasite"),
                                inline = TRUE),
      shiny::radioButtons(ns("species_mode"), "Species Mode:",
                          choices = c("Overlay (1 Map)" = "overlay", "Separate (Adjacent Maps)" = "separate"),
                          selected = "overlay", inline = TRUE),
      shiny::div(style = "border-top: 1px solid rgba(0,0,0,0.1); margin: 6px 0;"),
      shiny::radioButtons(ns("layout"), "Layout View:",
                          choices = c("Hex Substrate Overlay" = "hex", "Faceted Substrates" = "facet"),
                          selected = "hex", inline = TRUE),
      shiny::div(style = "border-top: 1px solid rgba(0,0,0,0.1); margin: 6px 0;"),
      shiny::span("Simulation Stepping:", style = "font-weight: 600; color: #1a73e8; display: block; margin-bottom: 4px;"),
      shiny::div(
        style = "display: flex; gap: 4px; margin-bottom: 8px;",
        shiny::actionButton(ns("step1"), "+1 Step", class = "btn-sm btn-outline-primary flex-fill"),
        shiny::actionButton(ns("step10"), "+10 Steps", class = "btn-sm btn-outline-primary flex-fill"),
        shiny::actionButton(ns("step100"), "+100 Steps", class = "btn-sm btn-outline-primary flex-fill"),
        shiny::actionButton(ns("reset_sim"), "Reset", class = "btn-sm btn-outline-secondary")
      ),
      shiny::div(style = "border-top: 1px solid rgba(0,0,0,0.1); margin: 6px 0;"),
      shiny::checkboxGroupInput(ns("layers"), "Display Layers:",
                                choices = c("Substrate Boundaries" = "poly",
                                            "Hex Grid Overlay" = "hex",
                                            "Organisms" = "organisms",
                                            "Substrate Names" = "centers",
                                            "Side Numbers" = "labels"),
                                selected = c("poly", "hex", "organisms", "centers", "labels")),
      shiny::div(style = "border-top: 1px solid rgba(0,0,0,0.1); margin: 6px 0;"),
      shiny::div(
        style = "display: flex; gap: 8px;",
        shiny::numericInput(ns("width"), "Radius:", value = 10, min = 2, max = 30, step = 1),
        shiny::numericInput(ns("step_density"), "Step Density:", value = 1, min = 0.5, max = 5, step = 0.5)
      )
    )
  )
}

substrateServer <- function(id, simres, width = 10, step_density = 1) {
  shiny::moduleServer(id, function(input, output, session) {
    ns <- session$ns
    
    current_sim <- shiny::reactiveVal(NULL)
    
    shiny::observeEvent(simres(), {
      current_sim(simres())
    })
    
    shiny::observeEvent(input$step1, {
      sim <- current_sim()
      if (!is.null(sim)) {
        res <- future.events(sim, nstep = 1, plotit = FALSE)
        current_sim(res)
      }
    })
    
    shiny::observeEvent(input$step10, {
      sim <- current_sim()
      if (!is.null(sim)) {
        res <- future.events(sim, nstep = 10, plotit = FALSE)
        current_sim(res)
      }
    })
    
    shiny::observeEvent(input$step100, {
      sim <- current_sim()
      if (!is.null(sim)) {
        res <- future.events(sim, nstep = 100, plotit = FALSE)
        current_sim(res)
      }
    })
    
    shiny::observeEvent(input$reset_sim, {
      current_sim(simres())
    })
    
    available_species <- shiny::reactive({
      sim <- current_sim()
      if (!is.null(sim) && !is.null(sim$pop)) names(sim$pop) else NULL
    })
    
    selected_species <- shiny::reactive({
      avail <- available_species()
      if (is.null(avail)) return(NULL)
      sel <- input$show_species
      if (is.null(sel) || length(sel) == 0) avail else intersect(sel, avail)
    })
    
    sppplot <- shiny::reactive({
      spp <- selected_species()
      shiny::req(spp)
      sim <- current_sim()
      shiny::req(sim)
      
      layout_val <- if (!is.null(input$layout)) input$layout else "hex"
      mode_val <- if (!is.null(input$species_mode)) input$species_mode else "overlay"
      w_val <- if (!is.null(input$width)) input$width else width
      sd_val <- if (!is.null(input$step_density)) input$step_density else step_density
      layers_val <- if (!is.null(input$layers)) input$layers else c("poly", "hex", "organisms", "centers", "labels")
      
      sim_single <- if (inherits(sim, "ewing_discrete") && is.list(sim) && length(sim) > 0) sim[[1]] else sim
      if (inherits(sim_single, "ewing")) {
        if (mode_val == "overlay" && layout_val == "hex") {
          sub_data <- ewing_substrate(sim_single, spp, layout = layout_val, width = w_val, step_density = sd_val)
          if (!is.null(sub_data)) {
            p_obj <- ggplot_ewing_substrate(sub_data, layout = layout_val, width = w_val, step_density = sd_val, layers = layers_val)
            list(p_obj)
          } else {
            list()
          }
        } else {
          p <- lapply(spp, function(x) {
            sub_data <- ewing_substrate(sim_single, x, layout = layout_val, width = w_val, step_density = sd_val)
            if (!is.null(sub_data)) {
              p_obj <- ggplot_ewing_substrate(sub_data, layout = layout_val, width = w_val, step_density = sd_val, layers = layers_val)
              p_obj
            } else {
              NULL
            }
          })
          p[!sapply(p, is.null)]
        }
      } else {
        list()
      }
    })
    
    output$sppPlot <- shiny::renderPlot({
      plots <- sppplot()
      if (!is.null(plots) && length(plots) > 0) {
        cowplot::plot_grid(plotlist = plots, ncol = length(plots), align = "h")
      } else {
        ggplot2::ggplot() + ggplot2::theme_void() + ggplot2::ggtitle("No active species selected to plot")
      }
    })
    
    output$substrate_plot <- shiny::renderUI({
      plots <- sppplot()
      h_px <- 500
      shiny::plotOutput(ns("sppPlot"), height = paste0(h_px, "px"))
    })
    
    # Return current simulation state for downstream composition
    current_sim
  })
}

substrateOutput <- function(id) {
  ns <- shiny::NS(id)
  shiny::uiOutput(ns("substrate_plot"))
}

# --- Source: distPlotApp.R ---
distPlotApp <- function(title = "Population Ethology") {
  ui <- bslib::page_sidebar(
    title = title,
    sidebar = bslib::sidebar(
      initParInput("init_par"),
      distPlotInput("dist_plot"),
      futureInput("future")),
    distPlotOutput("dist_plot")
  )
  server <- function(input, output, server) {
    init_par <- initParServer("init_par")
    siminit <- initServer("init", init_par)
    simres <- futureServer("future", siminit)
    distPlotServer("dist_plot", simres)
  }
  
  shiny::shinyApp(ui = ui, server = server)
}
distPlotServer <- function(id, simres, x_var = NULL, total = NULL, norm = NULL) {
  shiny::moduleServer(id, function(input, output, session) {
    ns <- session$ns
    
    dist_plot <- shiny::reactive({
      sim <- if (is.reactive(simres)) simres() else simres
      shiny::req(sim)
      
      tot_val <- if (is.reactive(total)) total() else if (!is.null(total)) total else if (!is.null(input$total)) input$total else TRUE
      norm_val <- if (is.reactive(norm)) norm() else if (!is.null(norm)) norm else if (!is.null(input$norm)) input$norm else TRUE
      xv_val <- if (is.reactive(x_var)) x_var() else if (!is.null(x_var)) x_var else if (!is.null(input$x_var)) input$x_var else "step"
      
      if (is.null(tot_val)) tot_val <- TRUE
      if (is.null(norm_val)) norm_val <- TRUE
      if (is.null(xv_val) || !xv_val %in% c("step", "time")) xv_val <- "step"
      
      object <- tryCatch({
        ewing_ageclass(sim, total = tot_val, normalize = norm_val)
      }, error = function(e) NULL)
      
      if (is.null(object)) return(plot_null("no simulation"))
      ggplot2::autoplot(object, x_var = xv_val)
    })
    
    output$dist_plot <- shiny::renderPlot({
      dist_plot()
    })
    
    # Return.
    dist_plot
  })
}
distPlotInput <- function(id) {
  ns <- shiny::NS(id)
  shiny::tagList(
    shiny::checkboxInput(ns("norm"), "Normalize Plot", TRUE),
    shiny::checkboxInput(ns("total"), "Include Total", TRUE))
}
distPlotOutput <- function(id) {
  ns <- shiny::NS(id)
  shiny::plotOutput(ns("dist_plot"), height = "400px")
}

# --- Source: multApp.R ---
multApp <- function(title = "Population Ethology") {
  ui <- shiny::fluidPage(
    shiny::titlePanel(title),
    shiny::sidebarLayout(
      shiny::sidebarPanel(
        multInput("ewing")
      ),
      shiny::mainPanel(
        multOutput("ewing")
      )))
  
  server <- function(input, output, server) {
    multServer("ewing")
  }
  
  shiny::shinyApp(ui = ui, server = server)
}
multServer <- function(id) {
  shiny::moduleServer(id, function(input, output, session) {
    ns <- session$ns
    
    simres <- shiny::reactive({
      nsim <- as.integer(shiny::req(input$nsim))
      shiny::withProgress(
        message = paste('Ewing Discrete', nsim, 'Simulations ...'),
                        value = 0,
        {
          out <- as.list(seq_len(nsim))
          inc <- 1 / nsim
          for(i in seq_len(nsim)) {
            shiny::incProgress(inc)
            out[[i]] <- ewing_discrete1(
              count = as.numeric(c(input$host, input$parasite)),
              nstep = input$steps)
          }
        }
      )
    })
    
    distplot <- shiny::reactive({
      if(inherits(simres(), "ewing")) {
        ggplot2::autoplot(ewing_ageclass(simres(), total = input$total,
                                         normalize = input$norm))
      } else {
        NULL
      }
    })
    output$distPlot <- shiny::renderPlot({
      distplot()
    })
    # *** This is not right. Need to get each species name here and in `ewing_substrate`
    # species <- ewing:::getOrgFeature(simres)
    #   gives list but includes substrates.
    # can figure out what substrate goes to species with 
    # ewing:::getOrgFeature(simres, species[i], "substrate")
    # if it is NA (or "NA"), then that is a substrate.
    # So cycle through species generating plots.
    # put as much in `ewing_substrate` as possible.
    species <- shiny::reactive({
      get.organisms(datafile())$species
    })
    substrates <- shiny::reactive({
      get.organisms(datafile())$substrates
    })
    output$sppsize <- shiny::renderUI({
      shiny::req(species())
      lapply(species(), function(x) {
        shiny::sliderInput(ns(x),
                           label = paste0("Number of ", x, "s:"),
                           min = 0,
                           max = 500,
                           value = 100,
                           step = 20)
      })
    })
    sppplot <- shiny::reactive({
      shiny::req(species(), simres())
      if(inherits(simres(), "ewing")) {
        if(!is.null(simres())) {
          p <- lapply(species(), function(x) {
            p <- ggplot2::autoplot(ewing_substrate(simres(), x))
            if(inherits(p, "ggplot"))
              p <- p + ggplot2::ggtitle(paste(x, "on", substrates()[1]))
            p
          })
          if(any(unlist(purrr::map(p, is.null))))
            p <- NULL
          p
        }
      } else {
        ggplot2::ggplot()
      }
    })
    output$sppPlot <- shiny::renderPlot({
      if(!is.null(sppplot())) {
        spp <- length(species())
        cowplot::plot_grid(plotlist = sppplot(), nrow = spp)
      } else {
        ggplot2::ggplot()
      }
    })
    envdata <- shiny::reactive({
      shiny::req(simres())
      if(inherits(simres(), "ewing_discrete")) {
        ewing_envelopes(simres())
      } else {
        NULL
      }
    })
    envelopePlot <- shiny::reactive({
      shiny::req(envdata())
      nsim <- as.integer(shiny::req(input$nsim))
      conf <- (nsim >= 10) & input$conf 
      if(inherits(simres(), "ewing_discrete")) {
        ggplot_ewing_envelopes(envdata(), conf)
      } else {
        NULL
      }
    })
    output$envPlot <- shiny::renderPlot({
      envelopePlot()
    })
    output$plots <- shiny::renderUI({
      nsim <- as.integer(shiny::req(input$nsim), simres())
      if(nsim == 1) {
        shiny::req(species())
        shiny::tagList(
          shiny::plotOutput(ns("distPlot"), height = "400px"),
          shiny::plotOutput(ns("sppPlot"), height = paste0(200 * length(species()), "px")))
      } else {
        shiny::plotOutput(ns("envPlot"))
      }
    })
    
    data <- reactive({
      nsim <- as.integer(shiny::req(input$nsim))
      species <- shiny::req(input$species)
      if(nsim == 1) {
        readCount(simres())[[species]]
      } else {
        shiny::req(envdata())
        print(envdata(), species = species)
      }
    })
    params <- shiny::reactive({
      nsim <- shiny::req(input$nsim)
      paste(shiny::req(input$host), shiny::req(input$parasite),
            shiny::req(input$steps), nsim, sep = "_")
    })
    output$downloadRun <- shiny::downloadHandler(
      filename = function() {
        paste0(paste(shiny::req(input$outfile), shiny::req(input$species), params(), sep = "_"), ".csv") },
      content = function(file) {
        utils::write.csv(data(), file, row.names = FALSE)
      }
    )
    
    output$downloadPlot <- shiny::downloadHandler(
      filename = function() {
        paste0(paste(shiny::req(input$plotfile), params(), sep = "_"), ".pdf") },
      content = function(file) {
        grDevices::pdf(file, width = 9)
        nsim <- as.integer(shiny::req(input$nsim))
        if(nsim == 1) {
          print(distplot())
          for(i in species()) {
            print(sppplot()[[i]])
          }
        } else {
          print(envelopePlot())
        }
        grDevices::dev.off()
      }
    )
    
    datanames <- shiny::reactive({
      getOrgNames(datafile())
    })
    output$inputfiles <- shiny::renderUI({
      shiny::tagList(
        shiny::selectInput(ns("dataname"), "", datanames(), "organism.features"),
        DT::renderDataTable({
          getOrgDataSimple(simres(),shiny::req(input$dataname), datafile())
        }, escape = FALSE,
        options = list(scrollX = TRUE, pageLength = 10)))
    })
    
    datafile <- shiny::reactive({
      if(shiny::isTruthy(input$datafile)) {
        input$datafile$datapath
      } else {
        ""
      }
    })
    output$outs <- shiny::renderUI({
      switch(input$button,
             Plots        =  shiny::uiOutput(ns("plots")),
             "Input Data" =  shiny::uiOutput(ns("inputfiles")))
    })
    
    output$plottype <- shiny::renderUI({
      if(input$nsim == 1) {
        shiny::tagList(
          shiny::checkboxInput(ns("norm"), "Normalize Plot", TRUE),
          shiny::checkboxInput(ns("total"), "Include Total", TRUE))
      } else {
        shiny::checkboxInput(ns("conf"), "Confidence band", FALSE)
      }
    })
    output$version <- shiny::renderText({
      paste("Ewing package version ", utils::packageVersion("ewing"))
    })
  })
}
multInput <- function(id) {
  ns <- shiny::NS(id)
  shiny::tagList(
    shiny::h4("Simulation Settings"),
    shiny::uiOutput(ns("sppsize")),
    shiny::sliderInput(ns("steps"),
                       label = "Simulation steps:",
                       min = 1000,
                       max = 10000,
                       value = 1000,
                       step = 500),
    shiny::radioButtons(ns("nsim"),
                        "Number of Simulations",
                        c(1,10,20,50,100,200),
                        1, inline = TRUE),
    
    shiny::fileInput(ns("datafile"), "Optional XLSX Input Data File",
                     multiple = FALSE,
                     accept = c(".xls", ".xlsx")),
    
    shiny::actionButton(ns("go"), "Start Simulation"),
    
    shiny::HTML("<hr style='height:1px;border:none;color:#333;background-color:#333;' />"),
    shiny::uiOutput(ns("plottype")),
    shiny::h4("Save Files"),
    shiny::fluidRow(
      shiny::column(6, shiny::textInput(ns("outfile"), "Species Table", "mysim")),
      shiny::column(3, shiny::selectInput(ns("species"), "", c("host", "parasite"), "host")),
      shiny::column(3, shiny::downloadButton(ns("downloadRun"), "Table"))),
    shiny::fluidRow(
      shiny::column(9, shiny::textInput(ns("plotfile"), "Plot File", "myplot")),
      shiny::column(3, shiny::downloadButton(ns("downloadPlot"), "Plots"))),
    
    shiny::HTML("<hr  style='height:1px;border:none;color:#333;background-color:#333;' />"),
    shiny::HTML("See <a href='https://github.com/byandell/ewing'>ewing package on github</a>"),
    shiny::uiOutput(ns("version"))
  )
}
multOutput <- function(id) {
  ns <- shiny::NS(id)
  shiny::tagList(
    shiny::radioButtons(ns("button"), "", c("Plots", "Input Data"),
                        "Plots", inline = TRUE),
    shiny::uiOutput(ns("outs"))
  )
}

# --- Source: inputApp.R ---
inputApp <- function(title = "Input Data Explorer") {
  ui <- bslib::page_sidebar(
    title = title,
    sidebar = bslib::sidebar(
      inputAppInput("input_app")
    ),
    bslib::card(
      inputAppOutput("input_app")
    )
  )
  server <- function(input, output, session) {
    inputAppServer("input_app")
  }
  shiny::shinyApp(ui = ui, server = server)
}

discover_dataset_tables <- function(datafile = "", sim = NULL) {
  found <- character(0)
  
  # 1. Inspect datafile directory
  d_path <- if (is.character(datafile) && datafile != "") datafile else if (!is.null(sim) && !is.null(sim$datafile)) sim$datafile else ""
  
  if (d_path != "" && file.exists(d_path)) {
    if (dir.exists(d_path)) {
      files <- list.files(d_path, pattern = "\\.(txt|csv|tsv)$", full.names = FALSE)
      if (length(files) > 0) {
        found <- tools::file_path_sans_ext(files)
      }
    } else if (grepl("\\.xlsx$", d_path, ignore.case = TRUE)) {
      sheets <- tryCatch(readxl::excel_sheets(d_path), error = function(e) character(0))
      if (length(sheets) > 0) found <- sheets
    }
  }
  
  # 2. Inspect sim$datasets if present
  if (!is.null(sim) && !is.null(sim$datasets)) {
    found <- unique(c(found, names(sim$datasets)))
  }
  if (!is.null(sim) && !is.null(sim$community) && !is.null(sim$community$datasets)) {
    found <- unique(c(found, names(sim$community$datasets)))
  }
  if (exists("isle_royale_datasets") && is.list(isle_royale_datasets)) {
    found <- unique(c(found, names(isle_royale_datasets)))
  }
  
  # Filter out any .rds spatial layers or non-table objects
  found <- found[!grepl("\\.rds$", found, ignore.case = TRUE) & !found %in% c("isle_royale_features", "isle_royale_landmarks", "isle_royale_layer", "huc_features")]

  # 3. Default fallback choices if nothing found
  if (length(found) == 0) {
    found <- c(
      "organism.features", "future.moose", "future.wolf",
      "substrate.moose", "substrate.wolf", "substrate.substrate",
      "moose.wolf", "future.host", "future.parasite"
    )
  }
  
  unique(found)
}

inputAppInput <- function(id, choices = NULL) {
  ns <- shiny::NS(id)
  default_choices <- if (!is.null(choices)) choices else c(
    "organism.features", "future.moose", "future.wolf",
    "substrate.moose", "substrate.wolf", "substrate.substrate",
    "moose.wolf", "future.host", "future.parasite"
  )
  shiny::tagList(
    shiny::selectInput(ns("dataname"), "Select Dataset Table:",
      choices = default_choices,
      selected = default_choices[1]
    )
  )
}

inputAppOutput <- function(id) {
  ns <- shiny::NS(id)
  shiny::tableOutput(ns("org_table"))
}

inputAppServer <- function(id, simres = shiny::reactiveVal(NULL), datafile = shiny::reactiveVal("")) {
  shiny::moduleServer(id, function(input, output, session) {
    ns <- session$ns

    # Dynamically update select choices based on folder / simulation contents
    shiny::observe({
      sim <- if (is.reactive(simres)) simres() else simres
      dfile <- if (is.reactive(datafile)) datafile() else datafile
      
      discovered <- discover_dataset_tables(dfile, sim)
      if (length(discovered) > 0) {
        current_sel <- input$dataname
        sel <- if (!is.null(current_sel) && current_sel %in% discovered) current_sel else discovered[1]
        shiny::updateSelectInput(session, "dataname", choices = discovered, selected = sel)
      }
    })

    output$org_table <- shiny::renderTable(
      {
        name <- input$dataname %||% "organism.features"
        sim <- if (is.reactive(simres)) simres() else simres
        dfile <- if (is.reactive(datafile)) datafile() else datafile

        res <- NULL

        # 0. Check direct file in datafile directory if points to folder
        if (is.character(dfile) && dfile != "" && dir.exists(dfile)) {
          txt_path <- file.path(dfile, paste0(name, ".txt"))
          if (file.exists(txt_path)) res <- tryCatch(utils::read.table(txt_path, header = TRUE, sep = "\t", stringsAsFactors = FALSE, fill = TRUE), error = function(e) NULL)
          if (is.null(res)) {
            csv_path <- file.path(dfile, paste0(name, ".csv"))
            if (file.exists(csv_path)) res <- tryCatch(utils::read.csv(csv_path, fill = TRUE, stringsAsFactors = FALSE), error = function(e) NULL)
          }
        }

        # 1. Check if dataset is stored in sim$datasets or sim$community$datasets or global isle_royale_datasets
        if (is.null(res) && !is.null(sim)) {
          if (!is.null(sim$datasets) && !is.null(sim$datasets[[name]])) {
            res <- sim$datasets[[name]]
          } else if (!is.null(sim$community) && !is.null(sim$community$datasets) && !is.null(sim$community$datasets[[name]])) {
            res <- sim$community$datasets[[name]]
          }
        }
        if (is.null(res) && exists("isle_royale_datasets") && is.list(isle_royale_datasets) && !is.null(isle_royale_datasets[[name]])) {
          res <- isle_royale_datasets[[name]]
        }

        # 2. Extract dynamically via getOrgDataSimple or getOrg* package routines
        if (is.null(res) && !is.null(sim) && inherits(sim, "ewing")) {
          sim_single <- if (inherits(sim, "ewing_discrete")) sim[[1]] else sim
          res <- tryCatch({
            getOrgDataSimple(sim_single, name, datafile = dfile)
          }, error = function(e) NULL)
        }

        # 3. Dynamic fallback to extracting from sim_single$org state structures
        if ((is.null(res) || !is.data.frame(res) || nrow(res) == 0) && !is.null(sim) && inherits(sim, "ewing")) {
          sim_single <- if (inherits(sim, "ewing_discrete")) sim[[1]] else sim
          res <- tryCatch({
            left <- stringr::str_remove(name, "\\..*")
            right <- stringr::str_remove(name, ".*\\.")

            if (left == "organism" && right == "features") {
              if (!is.null(sim_single$org$Feature)) as.data.frame(sim_single$org$Feature) else NULL
            } else if (left == "future") {
              if (!is.null(sim_single$org$Future[[right]])) sim_single$org$Future[[right]] else getOrgFuture(sim_single, right)
            } else if (!is.null(sim_single$org$Interact[[left]][[right]])) {
              sim_single$org$Interact[[left]][[right]]
            } else if (!is.null(sim_single$org[[left]][[right]])) {
              sim_single$org[[left]][[right]]
            } else {
              NULL
            }
          }, error = function(e) NULL)
        }

        if (is.null(res) || !is.data.frame(res) || nrow(res) == 0) {
          res <- data.frame(Info = paste("Dataset", name, "is not available in current simulation instance."))
        }

        res
      },
      striped = TRUE,
      hover = TRUE,
      bordered = TRUE
    )
  })
}

# --- Source: habitat.R ---
if (!exists("safe_st_intersects", mode = "function")) {
  safe_st_intersects <- function(x, y) {
    tryCatch(
      sf::st_intersects(x, y),
      error = function(e) {
        old_s2 <- sf::sf_use_s2(FALSE)
        on.exit(sf::sf_use_s2(old_s2), add = TRUE)
        x_val <- tryCatch(sf::st_make_valid(x), error = function(e2) x)
        y_val <- tryCatch(sf::st_make_valid(y), error = function(e2) y)
        sf::st_intersects(x_val, y_val)
      }
    )
  }
}

get_habitat_features <- function(watershed_obj = NULL, 
                                 categories = c("lakes", "waterways", "forests", "bogs"), 
                                 use_cache = TRUE,
                                 site = "isle_royale") {
  huc_layer <- if (is.null(watershed_obj)) {
    NULL
  } else if (inherits(watershed_obj, "sf") || inherits(watershed_obj, "sfc")) {
    watershed_obj
  } else if (is.list(watershed_obj) && "layer" %in% names(watershed_obj)) {
    watershed_obj$layer
  } else {
    NULL
  }
  
  if (use_cache) {
    cached_sf <- NULL
    feat_key <- paste0(site, "_features")
    feat_file <- paste0(site, "_features.rds")
    if (exists("isle_royale_datasets") && is.list(isle_royale_datasets) && !is.null(isle_royale_datasets[[feat_key]])) {
      cached_sf <- isle_royale_datasets[[feat_key]]
    } else if (exists(feat_key) && inherits(get(feat_key), "sf")) {
      cached_sf <- get(feat_key)
    } else {
      cache_file <- get_site_cache_file(feat_file, site = site)
      if (file.exists(cache_file)) {
        cached_sf <- tryCatch(readRDS(cache_file), error = function(e) NULL)
      }
    }
    
    if (!is.null(cached_sf) && inherits(cached_sf, "sf")) {
      if (is.null(huc_layer)) return(cached_sf)
      cached_sf <- sf::st_transform(cached_sf, sf::st_crs(huc_layer))
      clipped <- suppressWarnings(sf::st_intersection(cached_sf, huc_layer))
      if (nrow(clipped) > 0) return(clipped)
      return(cached_sf)
    }
  }
  
  # Query OpenStreetMap if osmdata package is installed
  if (!requireNamespace("osmdata", quietly = TRUE)) {
    warning("The 'osmdata' package is not installed. Returning fallback habitat geometries.")
    return(get_fallback_habitat_features(huc_layer))
  }
  
  bbox <- sf::st_bbox(sf::st_transform(huc_layer, 4326))
  bbox_str <- paste(bbox["ymin"], bbox["xmin"], bbox["ymax"], bbox["xmax"], sep = ",")
  
  old_url <- osmdata::get_overpass_url()
  osmdata::set_overpass_url("https://lz4.overpass-api.de/api/interpreter")
  
  features_list <- list()
  
  old_s2 <- sf::sf_use_s2()
  sf::sf_use_s2(FALSE)
  on.exit({
    sf::sf_use_s2(old_s2)
    osmdata::set_overpass_url(old_url)
  }, add = TRUE)
  
  # Extract Inland Lakes & Waterbodies
  if ("lakes" %in% categories) {
    ql_lakes <- paste0(
      "[out:xml][timeout:30];\n(\n",
      "  natural[\"water\"](", bbox_str, ");\n",
      "  waterway[\"riverbank\"](", bbox_str, ");\n",
      ");\nout body;\n>;\nout skel qt;\n"
    )
    res_lakes <- tryCatch(osmdata::osmdata_sf(ql_lakes), error = function(e) NULL)
    if (!is.null(res_lakes$osm_polygons) && nrow(res_lakes$osm_polygons) > 0) {
      poly <- res_lakes$osm_polygons
      poly$habitat_type <- "Lake/Pond"
      features_list$lakes <- poly[, "habitat_type"]
    }
  }
  
  # Extract Waterways & Streams
  if ("waterways" %in% categories) {
    ql_water <- paste0(
      "[out:xml][timeout:30];\n(\n",
      "  waterway[\"stream\"](", bbox_str, ");\n",
      "  waterway[\"river\"](", bbox_str, ");\n",
      "  waterway[\"drain\"](", bbox_str, ");\n",
      ");\nout body;\n>;\nout skel qt;\n"
    )
    res_water <- tryCatch(osmdata::osmdata_sf(ql_water), error = function(e) NULL)
    if (!is.null(res_water$osm_lines) && nrow(res_water$osm_lines) > 0) {
      line <- res_water$osm_lines
      line$habitat_type <- "Waterway"
      features_list$waterways <- line[, "habitat_type"]
    }
  }
  
  # Combine extracted geometries
  if (length(features_list) == 0) {
    return(get_fallback_habitat_features(huc_layer))
  }
  
  combined <- do.call(rbind, features_list)
  if (is.null(combined) || nrow(combined) == 0) {
    return(get_fallback_habitat_features(huc_layer))
  }
  
  combined <- sf::st_transform(combined, sf::st_crs(huc_layer))
  clipped <- suppressWarnings(sf::st_intersection(combined, huc_layer))
  if (nrow(clipped) > 0) return(clipped)
  return(combined)
}

get_fallback_habitat_features <- function(huc_layer = NULL) {
  if (is.null(huc_layer)) {
    pts <- matrix(c(-89.17, 47.87, -88.48, 47.87, -88.48, 48.16, -89.17, 48.16, -89.17, 47.87), ncol = 2, byrow = TRUE)
    huc_layer <- sf::st_sfc(sf::st_polygon(list(pts)), crs = 4326)
  }
  
  bbox <- sf::st_bbox(huc_layer)
  xmin <- bbox["xmin"]; xmax <- bbox["xmax"]
  ymin <- bbox["ymin"]; ymax <- bbox["ymax"]
  
  l1 <- sf::st_polygon(list(matrix(c(xmin+0.1, ymin+0.1, xmin+0.15, ymin+0.1, xmin+0.15, ymin+0.15, xmin+0.1, ymin+0.15, xmin+0.1, ymin+0.1), ncol=2, byrow=TRUE)))
  l2 <- sf::st_polygon(list(matrix(c(xmax-0.2, ymax-0.1, xmax-0.1, ymax-0.1, xmax-0.1, ymax-0.05, xmax-0.2, ymax-0.05, xmax-0.2, ymax-0.1), ncol=2, byrow=TRUE)))
  
  sfc <- sf::st_sfc(l1, l2, crs = sf::st_crs(huc_layer))
  sf::st_sf(habitat_type = c("Lake/Pond", "Lake/Pond"), geometry = sfc)
}

get_moose_landmarks <- function(watershed_obj = NULL, use_cache = TRUE, site = "isle_royale") {
  huc_layer <- if (is.null(watershed_obj)) {
    NULL
  } else if (inherits(watershed_obj, "sf") || inherits(watershed_obj, "sfc")) {
    watershed_obj
  } else if (is.list(watershed_obj) && "layer" %in% names(watershed_obj)) {
    watershed_obj$layer
  } else {
    NULL
  }
  
  if (use_cache) {
    cached_sf <- NULL
    lm_key <- paste0(site, "_landmarks")
    lm_file <- paste0(site, "_landmarks.rds")
    if (exists("isle_royale_datasets") && is.list(isle_royale_datasets) && !is.null(isle_royale_datasets[[lm_key]])) {
      cached_sf <- isle_royale_datasets[[lm_key]]
    } else if (exists(lm_key) && inherits(get(lm_key), "sf")) {
      cached_sf <- get(lm_key)
    } else {
      cache_file <- get_site_cache_file(lm_file, site = site)
      if (file.exists(cache_file)) {
        cached_sf <- tryCatch(readRDS(cache_file), error = function(e) NULL)
      }
    }
    
    if (!is.null(cached_sf) && inherits(cached_sf, "sf")) {
      if (is.null(huc_layer)) return(cached_sf)
      cached_sf <- sf::st_transform(cached_sf, sf::st_crs(huc_layer))
      return(cached_sf)
    }
  }
  
  # Fallback coordinate table for notable Isle Royale moose sighting locations
  landmarks <- data.frame(
    name = c("Washington Creek", "Ojibway Lake", "Feldtmann Lake", "Hidden Lake"),
    lon = c(-89.145, -88.618, -88.948, -88.647),
    lat = c(47.922, 48.113, 47.887, 48.148),
    description = c("Major feeding stream near Windigo",
                    "Highland lake surrounded by moose browse",
                    "SW inland lake with heavy aquatic vegetation",
                    "Shaded lake near Tobin Harbor"),
    stringsAsFactors = FALSE
  )
  
  pts <- sf::st_as_sf(landmarks, coords = c("lon", "lat"), crs = 4326)
  if (!is.null(huc_layer)) {
    pts <- sf::st_transform(pts, sf::st_crs(huc_layer))
  }
  return(pts)
}

add_watershed_hex_overlay <- function(huc_info, hex_diameter = 0.01) {
  huc_layer <- huc_info$layer
  
  hex_mesh <- sf::st_make_grid(huc_layer, square = FALSE, cellsize = c(hex_diameter, hex_diameter))
  hex_overlay <- hex_mesh[lengths(safe_st_intersects(hex_mesh, huc_layer)) > 0]
  
  huc_info$hex_overlay <- hex_overlay
  huc_info$hex_diameter <- hex_diameter
  
  class(huc_info) <- "watershed_hex_overlay"
  return(huc_info)
}

autoplot.watershed_hex_overlay <- function(object, ...) {
  huc_str <- if (!is.null(object$huc_id) && length(object$huc_id) > 1) {
    paste0(length(object$huc_id), " Combined Regions")
  } else if (!is.null(object$huc_id)) {
    paste("Region:", object$huc_id)
  } else {
    "Substrate Grid"
  }
  
  title_txt <- paste("Geographic Hexagonal Grid (", huc_str, ")", 
                     "\nHexagon Extent Diameter:", object$hex_diameter)
  if (!is.null(object$feature_name) && object$feature_name != "") {
    title_txt <- paste0(title_txt, " - Restricted to: ", object$feature_name)
  }
  
  p <- ggplot2::ggplot()
  if (!is.null(object$individual_hucs) && nrow(object$individual_hucs) > 1) {
    p <- p + ggplot2::geom_sf(data = object$individual_hucs, fill = NA, color = "purple", linetype = "dashed", linewidth = 0.4)
  }
  
  p +
    ggplot2::geom_sf(data = object$layer, fill = "lightblue", alpha = 0.3, color = "blue", linewidth = 0.7) +
    ggplot2::geom_sf(data = object$hex_overlay, fill = NA, color = "darkred", linewidth = 0.7) +
    ggplot2::theme_minimal() +
    ggplot2::ggtitle(title_txt) +
    ggplot2::labs(x = "Longitude", y = "Latitude")
}

create_isle_royale_hex_overlay <- function(hex_diameter = 0.01, features = NULL, layer = NULL, site = "isle_royale") {
  boundary_layer <- layer
  layer_key <- paste0(site, "_layer")
  layer_file <- paste0(site, "_layer.rds")
  feat_key <- paste0(site, "_features")
  feat_file <- paste0(site, "_features.rds")
  
  if (is.null(boundary_layer)) {
    if (exists("isle_royale_datasets") && is.list(isle_royale_datasets) && !is.null(isle_royale_datasets[[layer_key]])) {
      boundary_layer <- isle_royale_datasets[[layer_key]]
    } else if (exists(layer_key) && inherits(get(layer_key), c("sf", "sfc"))) {
      boundary_layer <- get(layer_key)
    } else {
      cache_file <- get_site_cache_file(layer_file, site = site)
      if (file.exists(cache_file)) {
        boundary_layer <- tryCatch(readRDS(cache_file), error = function(e) NULL)
      }
    }
  }
  
  habitat_sf <- features
  if (is.character(habitat_sf) && file.exists(habitat_sf)) {
    habitat_sf <- tryCatch(readRDS(habitat_sf), error = function(e) NULL)
  }
  if (is.null(habitat_sf)) {
    if (exists("isle_royale_datasets") && is.list(isle_royale_datasets) && !is.null(isle_royale_datasets[[feat_key]])) {
      habitat_sf <- isle_royale_datasets[[feat_key]]
    } else if (exists(feat_key) && inherits(get(feat_key), "sf")) {
      habitat_sf <- get(feat_key)
    } else {
      cache_file <- get_site_cache_file(feat_file, site = site)
      if (file.exists(cache_file)) {
        habitat_sf <- tryCatch(readRDS(cache_file), error = function(e) NULL)
      }
    }
  }
  
  if (is.null(boundary_layer) && !is.null(habitat_sf) && inherits(habitat_sf, "sf")) {
    boundary_layer <- suppressWarnings(sf::st_union(sf::st_geometry(habitat_sf)))
  }
  
  if (is.null(boundary_layer)) {
    pts <- matrix(c(-89.17, 47.87, -88.48, 47.87, -88.48, 48.16, -89.17, 48.16, -89.17, 47.87), ncol = 2, byrow = TRUE)
    boundary_layer <- sf::st_sfc(sf::st_polygon(list(pts)), crs = 4326)
  } else if (inherits(boundary_layer, "sf")) {
    boundary_layer <- sf::st_geometry(boundary_layer)
  }
  
  cent <- suppressWarnings(sf::st_centroid(boundary_layer))
  coords <- sf::st_coordinates(cent)
  
  hex_mesh <- sf::st_make_grid(boundary_layer, square = FALSE, cellsize = c(hex_diameter, hex_diameter))
  hex_overlay <- hex_mesh[lengths(safe_st_intersects(hex_mesh, boundary_layer)) > 0]
  
  res <- list(
    huc_id = "Isle Royale",
    feature_name = "Isle Royale",
    lon = as.numeric(coords[1, "X"]),
    lat = as.numeric(coords[1, "Y"]),
    layer = boundary_layer,
    hex_overlay = hex_overlay,
    hex_diameter = hex_diameter
  )
  class(res) <- "watershed_hex_overlay"
  return(res)
}

add_habitat_hex_overlay <- function(hex_obj, habitat_sf = NULL, landmarks_sf = NULL, 
                                    features = NULL, landmarks = NULL, site = "isle_royale") {
  if (is.null(habitat_sf)) habitat_sf <- features
  if (is.null(landmarks_sf)) landmarks_sf <- landmarks
  
  if (is.character(habitat_sf) && file.exists(habitat_sf)) {
    habitat_sf <- tryCatch(readRDS(habitat_sf), error = function(e) NULL)
  }
  if (is.character(landmarks_sf) && file.exists(landmarks_sf)) {
    landmarks_sf <- tryCatch(readRDS(landmarks_sf), error = function(e) NULL)
  }
  
  if (is.null(habitat_sf)) {
    habitat_sf <- get_habitat_features(hex_obj, site = site)
  }
  if (is.null(landmarks_sf)) {
    landmarks_sf <- get_moose_landmarks(hex_obj, site = site)
  }
  
  hex_mesh <- hex_obj$hex_overlay
  scores <- numeric(length(hex_mesh))
  types_list <- character(length(hex_mesh))
  
  if (!is.null(habitat_sf) && nrow(habitat_sf) > 0) {
    inter <- safe_st_intersects(hex_mesh, habitat_sf)
    for (i in seq_along(inter)) {
      indices <- inter[[i]]
      if (length(indices) > 0) {
        sub_types <- habitat_sf$habitat_type[indices]
        score <- 1
        if ("Lake/Pond" %in% sub_types) score <- score + 2
        if ("Waterway" %in% sub_types) score <- score + 1.5
        if ("Bog/Wetland" %in% sub_types) score <- score + 1.8
        if ("Forest" %in% sub_types) score <- score + 1
        scores[i] <- score
        types_list[i] <- paste(unique(sub_types), collapse = ", ")
      } else {
        scores[i] <- 1
        types_list[i] <- "Upland/Open"
      }
    }
  } else {
    scores[] <- 1
    types_list[] <- "General"
  }
  
  hex_sf <- sf::st_sf(
    hex_id = seq_along(hex_mesh),
    habitat_score = scores,
    habitat_type = types_list,
    geometry = hex_mesh
  )
  
  res <- hex_obj
  res$habitat_sf <- habitat_sf
  res$landmarks_sf <- landmarks_sf
  res$hex_habitat_sf <- hex_sf
  
  class(res) <- c("habitat_hex_overlay", class(hex_obj))
  return(res)
}

autoplot.habitat_hex_overlay <- function(object, show_landmarks = TRUE, ...) {
  p <- ggplot2::ggplot() +
    ggplot2::geom_sf(data = object$layer, fill = "#eef4f8", color = "#2c3e50", linewidth = 0.8)
  
  if (!is.null(object$habitat_sf) && nrow(object$habitat_sf) > 0) {
    p <- p + ggplot2::geom_sf(data = object$habitat_sf, ggplot2::aes(fill = .data$habitat_type), alpha = 0.5, color = NA)
  }
  
  if (!is.null(object$hex_habitat_sf)) {
    p <- p + ggplot2::geom_sf(data = object$hex_habitat_sf, ggplot2::aes(color = .data$habitat_score), fill = NA, linewidth = 0.6) +
      ggplot2::scale_color_viridis_c(option = "viridis", name = "Habitat Weight")
  }
  
  if (show_landmarks && !is.null(object$landmarks_sf) && nrow(object$landmarks_sf) > 0) {
    p <- p + ggplot2::geom_sf(data = object$landmarks_sf, color = "#d35400", size = 3, shape = 18) +
      ggplot2::geom_sf_text(data = object$landmarks_sf, ggplot2::aes(label = .data$name), color = "#900c3f", size = 3, fontface = "bold", vjust = -0.7)
  }
  
  title_txt <- "Isle Royale Moose Habitat & Substrate Overlay Model"
  if (!is.null(object$feature_name) && object$feature_name != "") {
    title_txt <- paste0(title_txt, " (", object$feature_name, ")")
  }
  
  p +
    ggplot2::theme_minimal() +
    ggplot2::ggtitle(title_txt) +
    ggplot2::labs(
      x = "Longitude", y = "Latitude",
      caption = "Habitats: Inland Lakes, Beaver Ponds/Waterways, Shaded Forests & Bogs"
    )
}

# --- Source: ecosystem_sim.R ---
init_ecosystem_sim <- function(ecosystem = "isle_royale",
                               year = 1980, 
                               n_hosts = NULL, 
                               n_predators = NULL, 
                               hex_diameter = 0.01,
                               datafile = "",
                               features_rds = NULL,
                               landmarks_rds = NULL) {
  
  # Load historical benchmark time series data if available for this ecosystem
  csv_path <- system.file(file.path("doc", ecosystem, "wolf_moose.csv"), package = "ewing")
  if (csv_path == "" || !file.exists(csv_path)) {
    csv_path <- file.path("inst", "doc", ecosystem, "wolf_moose.csv")
  }
  
  hist_data <- NULL
  if (file.exists(csv_path)) {
    hist_data <- utils::read.csv(csv_path, stringsAsFactors = FALSE)
  }
  
  # Lookup baseline population counts for start year if not explicitly provided
  if (!is.null(hist_data) && year %in% hist_data$Year) {
    row_match <- hist_data[hist_data$Year == year, ]
    if (is.null(n_hosts) && "Moose" %in% names(row_match)) n_hosts <- as.numeric(row_match$Moose[1])
    if (is.null(n_predators) && "Wolves" %in% names(row_match)) n_predators <- as.numeric(row_match$Wolves[1])
  }
  
  if (is.null(n_hosts)) n_hosts <- 664
  if (is.null(n_predators)) n_predators <- 50
  
  # 1. Initialize Base Spatial Geography & Habitat Overlay for Target Ecosystem
  hex_obj <- create_isle_royale_hex_overlay(hex_diameter = hex_diameter, features = features_rds, site = ecosystem)
  habitat_overlay <- add_habitat_hex_overlay(hex_obj, features = features_rds, landmarks = landmarks_rds, site = ecosystem)
  
  # 2. Setup Configuration Data Directory
  if (datafile == "") {
    pkg_dir <- system.file(file.path("extdata", ecosystem), package = "ewing")
    if (pkg_dir != "" && dir.exists(pkg_dir)) {
      datafile <- pkg_dir
    } else if (dir.exists(file.path("inst", "extdata", ecosystem))) {
      datafile <- file.path("inst", "extdata", ecosystem)
    }
  }
  
  # 3. Initialize ewing Community Core
  community <- NULL
  tryCatch({
    community <- init.simulation(package = "ewing", count = c(n_hosts, n_predators), datafile = datafile, messages = FALSE)
  }, error = function(e) {
    community <<- list(pop = list())
  })
  
  # 4. Spatially Sample Initial Positions Weighted by Substrate Habitat Score
  hex_sf <- habitat_overlay$hex_habitat_sf
  probs <- hex_sf$habitat_score / sum(hex_sf$habitat_score)
  
  sampled_moose_hex <- sample(seq_len(nrow(hex_sf)), size = n_hosts, replace = TRUE, prob = probs)
  sampled_wolf_hex  <- sample(seq_len(nrow(hex_sf)), size = n_predators, replace = TRUE, prob = probs)
  
  centroids <- sf::st_centroid(sf::st_geometry(hex_sf))
  moose_pts <- centroids[sampled_moose_hex]
  wolf_pts  <- centroids[sampled_wolf_hex]
  
  moose_coords <- sf::st_coordinates(moose_pts)
  wolf_coords  <- sf::st_coordinates(wolf_pts)
  
  moose_df <- data.frame(
    id = paste0("M", seq_len(n_hosts)),
    species = "Moose",
    ageclass = sample(c("calf", "yearling", "adult", "senior"), size = n_hosts, replace = TRUE, prob = c(0.15, 0.15, 0.55, 0.15)),
    hex_id = sampled_moose_hex,
    lon = moose_coords[, 1],
    lat = moose_coords[, 2],
    stringsAsFactors = FALSE
  )
  
  wolf_df <- data.frame(
    id = paste0("W", seq_len(n_predators)),
    species = "Wolf",
    ageclass = sample(c("pup", "subadult", "adult"), size = n_predators, replace = TRUE, prob = c(0.20, 0.25, 0.55)),
    hex_id = sampled_wolf_hex,
    lon = wolf_coords[, 1],
    lat = wolf_coords[, 2],
    stringsAsFactors = FALSE
  )
  
  m_counts <- table(factor(moose_df$ageclass, levels = c("calf", "yearling", "adult", "senior")))
  w_counts <- table(factor(wolf_df$ageclass, levels = c("pup", "subadult", "adult")))
  
  hist_df <- data.frame(
    step = 0,
    time = 0,
    Species = c(rep("moose", 4), rep("wolf", 3)),
    State = c(names(m_counts), names(w_counts)),
    Type = "ageclass",
    Count = c(as.numeric(m_counts), as.numeric(w_counts)),
    stringsAsFactors = FALSE
  )
  
  ds_list <- list()
  if (exists("isle_royale_datasets") && is.list(isle_royale_datasets)) {
    ds_list <- isle_royale_datasets
  } else if (is.character(datafile) && datafile != "" && dir.exists(datafile)) {
    txt_files <- list.files(datafile, pattern = "\\.(txt|csv)$", full.names = TRUE)
    for (f in txt_files) {
      tbl_name <- tools::file_path_sans_ext(basename(f))
      df_f <- tryCatch({
        if (endsWith(f, ".csv")) utils::read.csv(f, stringsAsFactors = FALSE)
        else utils::read.table(f, header = TRUE, sep = "\t", fill = TRUE,
                               check.names = FALSE, stringsAsFactors = FALSE)
      }, error = function(e) NULL)
      if (!is.null(df_f)) ds_list[[tbl_name]] <- df_f
    }
  }
  
  res <- list(
    community = community,
    habitat_overlay = habitat_overlay,
    start_year = year,
    ecosystem = ecosystem,
    moose_pop = moose_df,
    wolf_pop = wolf_df,
    historical_data = hist_data,
    history = hist_df,
    datafile = datafile,
    datasets = ds_list,
    nstep = 0
  )
  
  class(res) <- c(paste0(ecosystem, "_sim"), "ecosystem_sim", "ewing")
  return(res)
}

run_ecosystem_sim <- function(sim_obj, nstep = 1000, refresh = 10, ...) {
  if (!inherits(sim_obj, "ecosystem_sim") && !inherits(sim_obj, "isle_royale_sim")) {
    stop("Input must be an object of class 'ecosystem_sim' or 'isle_royale_sim'.")
  }
  
  hex_sf <- sim_obj$habitat_overlay$hex_habitat_sf
  n_hex <- nrow(hex_sf)
  centroids <- sf::st_coordinates(sf::st_centroid(sf::st_geometry(hex_sf)))
  
  move_pop <- function(pop_df, move_prob = 0.5) {
    if (is.null(pop_df) || nrow(pop_df) == 0) return(pop_df)
    n <- nrow(pop_df)
    movers <- which(stats::runif(n) < move_prob)
    if (length(movers) > 0) {
      new_hex <- sample(seq_len(n_hex), size = length(movers), replace = TRUE, prob = hex_sf$habitat_score / sum(hex_sf$habitat_score))
      pop_df$hex_id[movers] <- new_hex
      pop_df$lon[movers] <- centroids[new_hex, 1]
      pop_df$lat[movers] <- centroids[new_hex, 2]
    }
    return(pop_df)
  }
  
  update_demographics <- function(moose_df, wolf_df) {
    if (!is.null(moose_df) && nrow(moose_df) > 0) {
      n_m <- nrow(moose_df)
      calf_idx <- which(moose_df$ageclass == "calf")
      if (length(calf_idx) > 0) {
        trans <- calf_idx[stats::runif(length(calf_idx)) < 0.002]
        if (length(trans) > 0) moose_df$ageclass[trans] <- "yearling"
      }
      yearling_idx <- which(moose_df$ageclass == "yearling")
      if (length(yearling_idx) > 0) {
        trans <- yearling_idx[stats::runif(length(yearling_idx)) < 0.002]
        if (length(trans) > 0) moose_df$ageclass[trans] <- "adult"
      }
      adult_idx <- which(moose_df$ageclass == "adult")
      if (length(adult_idx) > 0) {
        trans <- adult_idx[stats::runif(length(adult_idx)) < 0.0003]
        if (length(trans) > 0) moose_df$ageclass[trans] <- "senior"
        
        n_births <- sum(stats::runif(length(adult_idx)) < 0.0012)
        if (n_births > 0) {
          parent_hexes <- sample(moose_df$hex_id[adult_idx], n_births, replace = TRUE)
          max_id <- suppressWarnings(max(as.numeric(gsub("[^0-9]", "", moose_df$id)), na.rm = TRUE))
          if (!is.finite(max_id)) max_id <- nrow(moose_df)
          new_ids <- paste0("M", seq(max_id + 1, length.out = n_births))
          new_calves <- data.frame(
            id = new_ids,
            species = "Moose",
            ageclass = "calf",
            hex_id = parent_hexes,
            lon = centroids[parent_hexes, 1],
            lat = centroids[parent_hexes, 2],
            stringsAsFactors = FALSE
          )
          moose_df <- rbind(moose_df, new_calves)
        }
      }
      senior_idx <- which(moose_df$ageclass == "senior")
      if (length(senior_idx) > 0) {
        deaths <- senior_idx[stats::runif(length(senior_idx)) < 0.0008]
        if (length(deaths) > 0) moose_df <- moose_df[-deaths, ]
      }
    }
    
    if (!is.null(wolf_df) && nrow(wolf_df) > 0) {
      pup_idx <- which(wolf_df$ageclass == "pup")
      if (length(pup_idx) > 0) {
        trans <- pup_idx[stats::runif(length(pup_idx)) < 0.002]
        if (length(trans) > 0) wolf_df$ageclass[trans] <- "subadult"
      }
      subadult_idx <- which(wolf_df$ageclass == "subadult")
      if (length(subadult_idx) > 0) {
        trans <- subadult_idx[stats::runif(length(subadult_idx)) < 0.002]
        if (length(trans) > 0) wolf_df$ageclass[trans] <- "adult"
      }
      adult_w_idx <- which(wolf_df$ageclass == "adult")
      if (length(adult_w_idx) > 0) {
        n_w_births <- sum(stats::runif(length(adult_w_idx)) < 0.0008)
        if (n_w_births > 0) {
          p_hexes <- sample(wolf_df$hex_id[adult_w_idx], n_w_births, replace = TRUE)
          max_wid <- suppressWarnings(max(as.numeric(gsub("[^0-9]", "", wolf_df$id)), na.rm = TRUE))
          if (!is.finite(max_wid)) max_wid <- nrow(wolf_df)
          new_wids <- paste0("W", seq(max_wid + 1, length.out = n_w_births))
          new_pups <- data.frame(
            id = new_wids,
            species = "Wolf",
            ageclass = "pup",
            hex_id = p_hexes,
            lon = centroids[p_hexes, 1],
            lat = centroids[p_hexes, 2],
            stringsAsFactors = FALSE
          )
          wolf_df <- rbind(wolf_df, new_pups)
        }
        w_deaths <- adult_w_idx[stats::runif(length(adult_w_idx)) < 0.0005]
        if (length(w_deaths) > 0) wolf_df <- wolf_df[-w_deaths, ]
      }
    }
    
    list(moose = moose_df, wolf = wolf_df)
  }
  
  curr_step <- sim_obj$nstep
  for (s in seq_len(nstep)) {
    curr_step <- curr_step + 1
    sim_obj$moose_pop <- move_pop(sim_obj$moose_pop, move_prob = 0.6)
    sim_obj$wolf_pop  <- move_pop(sim_obj$wolf_pop, move_prob = 0.8)
    
    if (!is.null(sim_obj$wolf_pop) && !is.null(sim_obj$moose_pop) && nrow(sim_obj$wolf_pop) > 0 && nrow(sim_obj$moose_pop) > 0) {
      wolf_hexes <- unique(sim_obj$wolf_pop$hex_id)
      vulnerable_idx <- which(sim_obj$moose_pop$hex_id %in% wolf_hexes & sim_obj$moose_pop$ageclass %in% c("calf", "senior"))
      if (length(vulnerable_idx) > 0) {
        pred_remove <- vulnerable_idx[stats::runif(length(vulnerable_idx)) < 0.0015]
        if (length(pred_remove) > 0) {
          sim_obj$moose_pop <- sim_obj$moose_pop[-pred_remove, ]
        }
      }
    }
    
    demog_res <- update_demographics(sim_obj$moose_pop, sim_obj$wolf_pop)
    sim_obj$moose_pop <- demog_res$moose
    sim_obj$wolf_pop  <- demog_res$wolf
    
    m_curr <- table(factor(sim_obj$moose_pop$ageclass, levels = c("calf", "yearling", "adult", "senior")))
    w_curr <- table(factor(sim_obj$wolf_pop$ageclass, levels = c("pup", "subadult", "adult")))
    
    step_df <- data.frame(
      step = curr_step,
      time = curr_step,
      Species = c(rep("moose", 4), rep("wolf", 3)),
      State = c(names(m_curr), names(w_curr)),
      Type = "ageclass",
      Count = c(as.numeric(m_curr), as.numeric(w_curr)),
      stringsAsFactors = FALSE
    )
    sim_obj$history <- rbind(sim_obj$history, step_df)
  }
  
  sim_obj$nstep <- curr_step
  return(sim_obj)
}

ggplot_ecosystem_sim <- function(x, ...) {
  if (!inherits(x, "ecosystem_sim") && !inherits(x, "isle_royale_sim")) {
    stop("Input must be an object of class 'ecosystem_sim' or 'isle_royale_sim'.")
  }
  
  p_map <- autoplot(x$habitat_overlay, ...)
  
  if (!is.null(x$moose_pop) && nrow(x$moose_pop) > 0) {
    moose_sf <- sf::st_as_sf(x$moose_pop, coords = c("lon", "lat"), crs = sf::st_crs(x$habitat_overlay$layer))
    p_map <- p_map +
      ggplot2::geom_sf(data = moose_sf, color = "#27ae60", shape = 21, fill = NA, stroke = 1.0, size = 0.8, alpha = 0.85) +
      ggplot2::geom_sf(data = moose_sf, color = "#27ae60", alpha = 0.4, size = 0.5)
  }
  
  if (!is.null(x$wolf_pop) && nrow(x$wolf_pop) > 0) {
    wolf_sf <- sf::st_as_sf(x$wolf_pop, coords = c("lon", "lat"), crs = sf::st_crs(x$habitat_overlay$layer))
    p_map <- p_map +
      ggplot2::geom_sf(data = wolf_sf, color = "#e74c3c", shape = 24, fill = "#e74c3c", size = 1.2, alpha = 0.9)
  }
  
  eco_title <- if (!is.null(x$ecosystem)) paste0(toupper(substr(x$ecosystem, 1, 1)), substring(x$ecosystem, 2)) else "Ecosystem"
  p_map <- p_map + ggplot2::ggtitle(paste(eco_title, "Simulation (Step", x$nstep, ")"))
  
  if (!is.null(x$historical_data)) {
    df_hist <- x$historical_data
    p_hist <- ggplot2::ggplot(df_hist, ggplot2::aes(x = .data$Year)) +
      ggplot2::geom_line(ggplot2::aes(y = .data$Moose, color = "Historical Moose"), linewidth = 1.0) +
      ggplot2::geom_line(ggplot2::aes(y = .data$Wolves * 40, color = "Historical Wolves (x40)"), linewidth = 1.0, linetype = "dashed") +
      ggplot2::scale_color_manual(
        name = "Empirical Benchmarks",
        values = c("Historical Moose" = "#27ae60", "Historical Wolves (x40)" = "#e74c3c")
      ) +
      ggplot2::theme_minimal() +
      ggplot2::labs(
        title = paste(eco_title, "Census Trajectories"),
        x = "Year", y = "Moose Abundance (Wolves x40)"
      )
    
    if (requireNamespace("cowplot", quietly = TRUE)) {
      return(cowplot::plot_grid(p_map, p_hist, ncol = 1, rel_heights = c(1.2, 1)))
    }
  }
  
  return(p_map)
}

plot.ecosystem_sim <- function(x, ...) {
  print(ggplot_ecosystem_sim(x, ...))
}

get_site_cache_file <- function(filename, site = "isle_royale") {
  pkg_dir <- system.file(file.path("extdata", site), package = "ewing")
  if (pkg_dir != "") {
    fp <- if (filename == "") pkg_dir else file.path(pkg_dir, filename)
    if (file.exists(fp) || dir.exists(fp)) return(fp)
  }
  dev_fp <- if (filename == "") file.path("inst", "extdata", site) else file.path("inst", "extdata", site, filename)
  if (file.exists(dev_fp) || dir.exists(dev_fp)) return(dev_fp)
  if (pkg_dir != "") file.path(pkg_dir, filename) else dev_fp
}

get_isle_royale_cache_file <- function(filename) {
  get_site_cache_file(filename, site = "isle_royale")
}

# --- Source: ecosystemApp.R ---
ecosystemApp <- function(ecosystem = "isle_royale", title = NULL) {
  if (is.null(title)) {
    title <- paste(paste0(toupper(substr(ecosystem, 1, 1)), substring(ecosystem, 2)), "Predator-Prey Simulation Platform")
  }
  
  ui <- bslib::page_sidebar(
    title = title,
    sidebar = bslib::sidebar(
      width = 340,
      ecosystemInput("eco", ecosystem = ecosystem)
    ),
    ecosystemOutput("eco")
  )

  server <- function(input, output, session) {
    ecosystemServer("eco", ecosystem = ecosystem)
  }

  shiny::shinyApp(ui = ui, server = server)
}

ecosystemInput <- function(id, ecosystem = "isle_royale") {
  ns <- shiny::NS(id)

  csv_path <- system.file(file.path("doc", ecosystem, "wolf_moose.csv"), package = "ewing")
  if (csv_path == "" || !file.exists(csv_path)) {
    csv_path <- file.path("inst", "doc", ecosystem, "wolf_moose.csv")
  }

  years <- 1980:2019
  if (file.exists(csv_path)) {
    df <- tryCatch(utils::read.csv(csv_path), error = function(e) NULL)
    if (!is.null(df) && "Year" %in% names(df)) years <- df$Year
  }

  shiny::tagList(
    shiny::tags$style(shiny::HTML(sprintf("
      #%s .form-group { margin-bottom: 4px; }
      #%s .irs { margin-bottom: 0px; }
      #%s .irs-with-grid { height: 34px; }
      #%s .checkbox { margin-top: 1px; margin-bottom: 2px; }
      #%s .radio-inline, #%s .checkbox-inline { margin-right: 10px; }
      #%s label { font-size: 0.82rem; margin-bottom: 1px; }
      #%s div.shiny-options-group { margin-top: -2px; }
    ", id, id, id, id, id, id, id, id))),

    # 1. Top Section: Step size & Action Buttons (Run / Reset on same line)
    step_size_slider(ns("step_size"), "Steps per click:", selected = 200),
    shiny::div(
      style = "display: flex; gap: 8px; margin: 4px 0 6px 0;",
      shiny::actionButton(ns("step_sim"), "Run", class = "btn-primary", style = "flex: 1; font-weight: 600; padding: 3px 6px; font-size: 0.85rem;"),
      shiny::actionButton(ns("reset_sim"), "Reset", class = "btn-warning", style = "flex: 1; font-weight: 600; padding: 3px 6px; font-size: 0.85rem;")
    ),

    # 2. Population & Hexagon Extent Sliders
    shiny::sliderInput(ns("n_hosts"), "Initial Hosts:", min = 50, max = 3000, value = 664, step = 50),
    shiny::sliderInput(ns("n_predators"), "Initial Predators:", min = 0, max = 60, value = 50, step = 2),
    shiny::sliderInput(ns("hex_diameter"), "Hex Diameter:", min = 0.005, max = 0.03, value = 0.01, step = 0.001),

    # 3. Conditional Map Overlay Options (Substrate Plot & Census Benchmarks)
    shiny::conditionalPanel(
      condition = sprintf("input['%s'] == 'Substrate Plot' || input['%s'] == 'Census Benchmarks'", ns("tabset"), ns("tabset")),
      shiny::div(style = "border-top: 1px solid rgba(0,0,0,0.1); margin: 4px 0 2px 0;"),
      shiny::div(
        style = "display: flex; gap: 12px; align-items: center; margin-bottom: 2px;",
        shiny::checkboxInput(ns("show_habitat"), "Habitat Features", value = TRUE),
        shiny::checkboxInput(ns("show_landmarks"), "Landmarks", value = TRUE)
      )
    ),

    # 4. Conditional Substrate Plot Axis Units
    shiny::conditionalPanel(
      condition = sprintf("input['%s'] == 'Substrate Plot'", ns("tabset")),
      axisUnitInput(ns("substrate_axis"), time_label = "Days")
    ),

    # 5. Conditional Age Classes Options (Age Classes tab)
    shiny::conditionalPanel(
      condition = sprintf("input['%s'] == 'Age Classes'", ns("tabset")),
      shiny::div(style = "border-top: 1px solid rgba(0,0,0,0.1); margin: 4px 0 2px 0;"),
      ageClassControlInput(ns("age_ctrls"), time_label = "Days")
    ),

    shiny::div(style = "border-top: 1px solid rgba(0,0,0,0.1); margin: 4px 0 2px 0;"),

    # 6. Bottom Section: Baseline Year & Status
    shiny::selectInput(ns("start_year"), "Baseline Year:", choices = years, selected = 1980),
    shiny::uiOutput(ns("status"))
  )
}

ecosystemOutput <- function(id) {
  ns <- shiny::NS(id)
  shiny::tagList(
    shiny::tabsetPanel(
      id = ns("tabset"),
      type = "tabs",
      shiny::tabPanel(
        "Substrate Plot",
        shiny::plotOutput(ns("substrate_plot"), height = "650px")
      ),
      shiny::tabPanel(
        "Age Classes",
        distPlotOutput(ns("dist_plot"))
      ),
      shiny::tabPanel(
        "Census Benchmarks",
        shiny::plotOutput(ns("autoplot"), height = "650px")
      ),
      shiny::tabPanel(
        "Live Demographics",
        shiny::br(),
        shiny::h4("Live Organism Population Summary (Updates Live on Simulation Step)"),
        shiny::tableOutput(ns("summary_table"))
      ),
      shiny::tabPanel(
        "Input Data",
        shiny::br(),
        inputAppInput(ns("input_data")),
        inputAppOutput(ns("input_data"))
      )
    )
  )
}

ecosystemServer <- function(id, ecosystem = "isle_royale") {
  shiny::moduleServer(id, function(input, output, session) {
    ns <- session$ns

    status_msg <- shiny::reactiveVal("")
    sim_state <- shiny::reactiveVal(NULL)
    sub_x_var <- axisUnitServer("substrate_axis")
    age_ctrls <- ageClassControlServer("age_ctrls")

    shiny::observeEvent(input$start_year, {
      yr <- as.numeric(input$start_year)
      csv_path <- system.file(file.path("doc", ecosystem, "wolf_moose.csv"), package = "ewing")
      if (csv_path == "" || !file.exists(csv_path)) {
        csv_path <- file.path("inst", "doc", ecosystem, "wolf_moose.csv")
      }

      if (file.exists(csv_path)) {
        df <- tryCatch(utils::read.csv(csv_path), error = function(e) NULL)
        if (!is.null(df) && "Year" %in% names(df) && yr %in% df$Year) {
          row_match <- df[df$Year == yr, ]
          if ("Moose" %in% names(row_match)) shiny::updateSliderInput(session, "n_hosts", value = as.numeric(row_match$Moose[1]))
          if ("Wolves" %in% names(row_match)) shiny::updateSliderInput(session, "n_predators", value = as.numeric(row_match$Wolves[1]))
        }
      }
    })

    shiny::observeEvent(list(input$reset_sim, input$start_year),
      {
        yr <- as.numeric(input$start_year)
        nh <- input$n_hosts
        np <- input$n_predators
        hd <- input$hex_diameter

        shiny::req(yr, nh, np, hd)

        sim <- init_ecosystem_sim(
          ecosystem = ecosystem,
          year = yr,
          n_hosts = nh,
          n_predators = np,
          hex_diameter = hd
        )

        steps <- parse_step_size(input$step_size)
        if (is.null(steps) || steps <= 0) steps <- 200
        sim <- run_ecosystem_sim(sim, nstep = steps)

        sim_state(sim)
        status_msg(paste0("<div style='color:green;'><b>Simulation Initialized:</b> Year ", yr, " with ", nh, " Hosts and ", np, " Predators (Executed ", steps, " initial steps).</div>"))
      },
      ignoreNULL = FALSE
    )

    shiny::observeEvent(input$step_sim, {
      sim <- sim_state()
      shiny::req(sim)
      steps <- parse_step_size(input$step_size)
      if (is.null(steps) || steps <= 0) steps <- 200

      updated_sim <- run_ecosystem_sim(sim, nstep = steps)
      sim_state(updated_sim)
      status_msg(paste0("<div style='color:blue;'><b>Executed ", steps, " steps:</b> Total Steps = ", updated_sim$nstep, "</div>"))
    })

    output$substrate_plot <- shiny::renderPlot({
      sim <- sim_state()
      shiny::req(sim)
      ewing_substrate(sim, x_var = sub_x_var())
    })

    distPlotServer("dist_plot", simres = sim_state, x_var = age_ctrls$x_var, total = age_ctrls$total, norm = age_ctrls$norm)

    output$autoplot <- shiny::renderPlot({
      sim <- sim_state()
      shiny::req(sim)
      ggplot_ecosystem_sim(sim)
    })

    output$summary_table <- shiny::renderTable({
      sim <- sim_state()
      shiny::req(sim)

      moose_counts <- table(sim$moose_pop$ageclass)
      wolf_counts <- table(sim$wolf_pop$ageclass)

      df_moose <- data.frame(
        Species = "Moose",
        AgeClass = names(moose_counts),
        Count = as.numeric(moose_counts),
        stringsAsFactors = FALSE
      )

      df_wolf <- data.frame(
        Species = "Wolf",
        AgeClass = names(wolf_counts),
        Count = as.numeric(wolf_counts),
        stringsAsFactors = FALSE
      )

      rbind(df_moose, df_wolf)
    })

    pkg_dir <- get_site_cache_file("", site = ecosystem)
    inputAppServer("input_data", simres = sim_state, datafile = shiny::reactiveVal(pkg_dir))

    output$status <- shiny::renderUI({
      shiny::HTML(status_msg())
    })
  })
}

# --- Source: isle_royale_sim.R ---
init_isle_royale_sim <- function(year = 1980, 
                                n_moose = NULL, 
                                n_wolves = NULL, 
                                hex_diameter = 0.01,
                                datafile = "",
                                features_rds = NULL,
                                landmarks_rds = NULL) {
  init_ecosystem_sim(
    ecosystem = "isle_royale",
    year = year,
    n_hosts = n_moose,
    n_predators = n_wolves,
    hex_diameter = hex_diameter,
    datafile = datafile,
    features_rds = features_rds,
    landmarks_rds = landmarks_rds
  )
}

run_isle_royale_sim <- function(sim_obj, nstep = 1000, refresh = 10, ...) {
  run_ecosystem_sim(sim_obj = sim_obj, nstep = nstep, refresh = refresh, ...)
}

ggplot_isle_royale_sim <- function(x, ...) {
  ggplot_ecosystem_sim(x, ...)
}

plot.isle_royale_sim <- function(x, ...) {
  print(ggplot_isle_royale_sim(x, ...))
}

# --- Source: IsleRoyaleApp.R ---
IsleRoyaleApp <- function(title = "Isle Royale Wolf-Moose Simulation Platform") {
  ecosystemApp(ecosystem = "isle_royale", title = title)
}

IsleRoyaleInput <- function(id) {
  ecosystemInput(id, ecosystem = "isle_royale")
}

IsleRoyaleOutput <- function(id) {
  ecosystemOutput(id)
}

IsleRoyaleServer <- function(id) {
  ecosystemServer(id, ecosystem = "isle_royale")
}

# --- Launch Application ---
IsleRoyaleApp()

Programmatic Application Usage

Launch the interactive application natively in R using exported package functions:

library(ewing)

# Launch interactive offline Shiny app
IsleRoyaleApp()

Executable Workflow: Isle Royale Spatial Predator-Prey Model

Below is an executable simulation workflow displaying spatial individual organism distributions on the Isle Royale substrate map, step-by-step demographic tallies, and historical 40-year empirical census benchmarks (1980–2019).

library(ewing)
library(ggplot2)

# 1. Initialize Isle Royale spatial simulation with 1980 baseline counts (664 Moose, 50 Wolves)
sim <- init_isle_royale_sim(year = 1980)

# 2. Run simulation steps (e.g. 200 days)
sim <- run_isle_royale_sim(sim, nstep = 200)

# 3. Visualize spatial landscape & benchmark trajectories
ggplot_isle_royale_sim(sim)


Age Classes Demographic Dynamics

# Plot side-by-side per-species age class dynamics over time (days)
autoplot(ewing_ageclass(sim), x_var = "time")


Technical Features

  1. 100% Offline GIS Substrate Mapping: Renders habitat features (lakes, bogs, shaded forests, waterways) and landmark POIs using pre-computed local sf layers (inst/extdata/isle_royale/) with 0 API calls.
  2. Dynamic Habitat-Weighted Movement: Organisms evaluate adjacent hexagonal substrate cells, moving with probability proportional to habitat suitability scores.
  3. Continuous Demographic Stepping: Tallies births, aging (Calf \(\rightarrow\) Yearling \(\rightarrow\) Adult \(\rightarrow\) Senior; Pup \(\rightarrow\) Subadult \(\rightarrow\) Adult), and wolf predation at micro-step increments.
  4. Tab-Aware Sidebar Decluttering: Displays plot-specific controls (show_habitat, show_landmarks, norm, total, Steps vs Days) strictly when their target tab is active.
  5. Shared Modular Architecture: Peer application wrapper composing step_controls, distPlotApp, inputApp, and substrateApp.