From f29a99a19b5491604b193c16947d35c260d58245 Mon Sep 17 00:00:00 2001 From: mpadge Date: Fri, 26 Sep 2025 14:59:33 +0200 Subject: [PATCH 01/12] simplify 'area_per_resident' estimate --- DESCRIPTION | 2 +- R/population-estimate.R | 10 +--------- codemeta.json | 2 +- 3 files changed, 3 insertions(+), 11 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index 36262f5..e36eeaf 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,7 +1,7 @@ Package: superblock Type: Package Title: Analyses of potential superblock -Version: 0.1.0.091 +Version: 0.1.0.092 Authors@R: person(given = "Mark", family = "Padgham", diff --git a/R/population-estimate.R b/R/population-estimate.R index 7856e3f..98ec9ab 100644 --- a/R/population-estimate.R +++ b/R/population-estimate.R @@ -5,17 +5,9 @@ #' @noRd area_per_resident <- function (osmdat) { - street <- "Papenburger Straße" - housenumber <- 2 num_residents_floors <- 21 num_residents_roof <- 2.5 - - b <- osmdat$buildings - - i <- which ( - b$`addr:street` == street & b$`addr:housenumber` == housenumber - ) - area <- sf::st_area (osmdat$buildings [i, ]) # in m^2 + area <- 181 # m2 num_levels <- as.numeric (b$`building:levels` [i]) num_roof_levels <- as.numeric (b$`roof:levels` [i]) diff --git a/codemeta.json b/codemeta.json index 164bb3b..9b88896 100644 --- a/codemeta.json +++ b/codemeta.json @@ -7,7 +7,7 @@ "codeRepository": "https://github.com/UrbanAnalyst/superblock-ms", "issueTracker": "https://github.com/UrbanAnalyst/superblock-ms/issues", "license": "https://spdx.org/licenses/GPL-3.0", - "version": "0.1.0.091", + "version": "0.1.0.092", "programmingLanguage": { "@type": "ComputerLanguage", "name": "R", From a4351d83378712e5089666d82142f3b0804b3c5c Mon Sep 17 00:00:00 2001 From: mpadge Date: Fri, 26 Sep 2025 15:08:00 +0200 Subject: [PATCH 02/12] also extract tree + bike park osm nodes --- DESCRIPTION | 2 +- R/osmdata-extract.R | 19 +++++++++++++++++++ codemeta.json | 2 +- 3 files changed, 21 insertions(+), 2 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index e36eeaf..1829752 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,7 +1,7 @@ Package: superblock Type: Package Title: Analyses of potential superblock -Version: 0.1.0.092 +Version: 0.1.0.093 Authors@R: person(given = "Mark", family = "Padgham", diff --git a/R/osmdata-extract.R b/R/osmdata-extract.R index 26447fd..abe972f 100644 --- a/R/osmdata-extract.R +++ b/R/osmdata-extract.R @@ -33,6 +33,8 @@ sb_osmdata_extract <- function (bbox, hw_names, outer = TRUE) { parking_facilities <- extract_osm_parking_facilities (bbox) cli::cli_alert_success ("Extracted data on parking areas.") + nodes <- extract_osm_nodes (bbox) + list ( bbox = bbox, hw_names = hw_names, @@ -42,6 +44,7 @@ sb_osmdata_extract <- function (bbox, hw_names, outer = TRUE) { open_spaces = open_spaces, parking_areas = parking_areas, parking_facilities = parking_facilities, + nodes = nodes, dat_sc = dat_hw$dat_sc ) } @@ -194,3 +197,19 @@ extract_osm_parking_facilities <- function (bbox) { return (pts) } + +extract_osm_nodes <- function (bbox) { + + amenity <- natural <- NULL + + dat <- osmdata::opq (bbox) |> + osmdata::add_osm_features (list ( + natural = "tree", + amenity = "bicycle_parking" + )) |> + m_osmdata_sf () + + dat$osm_points |> + dplyr::filter (amenity == "bicycle_parking" | natural == "tree") |> + dplyr::select (osm_id, amenity, natural) +} diff --git a/codemeta.json b/codemeta.json index 9b88896..958db0f 100644 --- a/codemeta.json +++ b/codemeta.json @@ -7,7 +7,7 @@ "codeRepository": "https://github.com/UrbanAnalyst/superblock-ms", "issueTracker": "https://github.com/UrbanAnalyst/superblock-ms/issues", "license": "https://spdx.org/licenses/GPL-3.0", - "version": "0.1.0.092", + "version": "0.1.0.093", "programmingLanguage": { "@type": "ComputerLanguage", "name": "R", From b875369cc4ba280ff4bed841ee86a3ac354b86e0 Mon Sep 17 00:00:00 2001 From: mpadge Date: Fri, 26 Sep 2025 15:15:53 +0200 Subject: [PATCH 03/12] reduce nodes only to those beside streets --- DESCRIPTION | 2 +- R/osmdata-extract.R | 6 ++++++ codemeta.json | 2 +- 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index 1829752..5314b65 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,7 +1,7 @@ Package: superblock Type: Package Title: Analyses of potential superblock -Version: 0.1.0.093 +Version: 0.1.0.094 Authors@R: person(given = "Mark", family = "Padgham", diff --git a/R/osmdata-extract.R b/R/osmdata-extract.R index abe972f..6de2bfb 100644 --- a/R/osmdata-extract.R +++ b/R/osmdata-extract.R @@ -33,7 +33,13 @@ sb_osmdata_extract <- function (bbox, hw_names, outer = TRUE) { parking_facilities <- extract_osm_parking_facilities (bbox) cli::cli_alert_success ("Extracted data on parking areas.") + # Extract tree and bicycle parking nodes, but only keep those within 5m of + # the internal streeets. + node_limit <- 5 # in metres nodes <- extract_osm_nodes (bbox) + dmat <- sf::st_distance (nodes, dat_hw) # dim = (nodes, hw) + dmin <- apply (dmat, 1, min) + nodes <- nodes [which (dmin <= node_limit), ] list ( bbox = bbox, diff --git a/codemeta.json b/codemeta.json index 958db0f..433a8f2 100644 --- a/codemeta.json +++ b/codemeta.json @@ -7,7 +7,7 @@ "codeRepository": "https://github.com/UrbanAnalyst/superblock-ms", "issueTracker": "https://github.com/UrbanAnalyst/superblock-ms/issues", "license": "https://spdx.org/licenses/GPL-3.0", - "version": "0.1.0.093", + "version": "0.1.0.094", "programmingLanguage": { "@type": "ComputerLanguage", "name": "R", From 3b13550c8bb00dc5492a68ed56fd1b0e60e9a451 Mon Sep 17 00:00:00 2001 From: mpadge Date: Fri, 26 Sep 2025 15:46:06 +0200 Subject: [PATCH 04/12] add 'reduce_parking_for_trees' for #9 --- DESCRIPTION | 2 +- R/parking-areas.R | 42 ++++++++++++++++++++++++++++++++++++++++++ codemeta.json | 2 +- 3 files changed, 44 insertions(+), 2 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index 5314b65..c07f1eb 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,7 +1,7 @@ Package: superblock Type: Package Title: Analyses of potential superblock -Version: 0.1.0.094 +Version: 0.1.0.095 Authors@R: person(given = "Mark", family = "Padgham", diff --git a/R/parking-areas.R b/R/parking-areas.R index aba4702..d5807db 100644 --- a/R/parking-areas.R +++ b/R/parking-areas.R @@ -7,6 +7,7 @@ car_parking_areas <- function (osmdat, add_parking_osm_ids = NULL) { hws$lanes <- as.numeric (hws$lanes) hws$road_area <- sf::st_length (hws) * units::set_units (hws$lanes * lane_width) hws <- parking_structure (hws) + hws <- reduce_parking_for_trees (hws, osmdat) if (!is.null (add_parking_osm_ids)) { index <- which (as.numeric (hws$parking_area) > 0) @@ -25,6 +26,7 @@ parking_structure <- function (hws) { # Depth of parking spaces out into the street depths <- c (3, 4, 5) # (parallel, diagonal, perpendicular) + angles <- c ("parallel", "diagonal", "perpenducular") # And equivalent lengths along the street lengths <- c (5, 3, 3) @@ -76,6 +78,17 @@ parking_structure <- function (hws) { parking_space <- apply (cbind (parking_sides, parking_both), 1, max) hws$parking_area <- sf::st_length (hws) * units::set_units (parking_space, "m") + # Add details of parking on each side: + hws$parking_left <- hws$parking_right <- NA_character_ + for (i in seq_along (depths)) { + index <- which (parking [[1]] [, 1] == depths [i]) + hws$parking_left [index] <- angles [i] + index <- which (parking [[2]] [, 1] == depths [i]) + hws$parking_right [index] <- angles [i] + index <- which (parking [[3]] [, 1] == depths [i]) + hws$parking_left [index] <- hws$parking_right [index] <- angles [i] + } + # Then estimate number of parking spaces: hw_lens <- as.numeric (sf::st_length (hws)) n_spaces <- lapply (lengths, function (l) { @@ -104,3 +117,32 @@ parking_structure <- function (hws) { return (hws) } + +reduce_parking_for_trees <- function (hws, osmdat) { + + nodes <- osmdat$nodes + dmat <- sf::st_distance (nodes, hws) + index <- table (apply (dmat, 1, which.min)) + index <- data.frame ( + hw_num = as.integer (names (index)), + count = as.integer (index) + ) + node_counts <- rep (0, nrow (hws)) + node_counts [index$hw_num] <- index$count + + angles <- c ("parallel", "diagonal", "perpenducular") + reductions <- c (1, 2, 3) # reduction in parking spaces + + # Then presume nodes are evenly divided on both sides of each highway: + for (dir in c ("left", "right")) { + this_dir <- hws [[paste0 ("parking_", dir)]] + this_red <- reductions [match (this_dir, angles)] + this_red [is.na (this_red)] <- 0 + + hws$num_parking_spaces <- hws$num_parking_spaces - + this_red * node_counts / 2 + } + hws$num_parking_spaces <- floor (hws$num_parking_spaces) + + return (hws) +} diff --git a/codemeta.json b/codemeta.json index 433a8f2..c50da06 100644 --- a/codemeta.json +++ b/codemeta.json @@ -7,7 +7,7 @@ "codeRepository": "https://github.com/UrbanAnalyst/superblock-ms", "issueTracker": "https://github.com/UrbanAnalyst/superblock-ms/issues", "license": "https://spdx.org/licenses/GPL-3.0", - "version": "0.1.0.094", + "version": "0.1.0.095", "programmingLanguage": { "@type": "ComputerLanguage", "name": "R", From f83d621641dc03a58fd8108f0977957a5e1c1ad0 Mon Sep 17 00:00:00 2001 From: mpadge Date: Fri, 26 Sep 2025 16:05:47 +0200 Subject: [PATCH 05/12] fix reduce_parking_for_trees fn for #9 and update tests --- DESCRIPTION | 2 +- R/osmdata-extract.R | 9 +- R/parking-areas.R | 9 +- codemeta.json | 2 +- tests/testthat/helper-osmdata-memoise.R | 4 + .../overpass/interpreter-8fee03-POST.R | 822 ++++++++++++++++++ tests/testthat/osm-nodes/overpass/status.txt | 20 + tests/testthat/test-osmdata.R | 2 +- 8 files changed, 860 insertions(+), 10 deletions(-) create mode 100644 tests/testthat/osm-nodes/overpass/interpreter-8fee03-POST.R create mode 100644 tests/testthat/osm-nodes/overpass/status.txt diff --git a/DESCRIPTION b/DESCRIPTION index c07f1eb..240e4a4 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,7 +1,7 @@ Package: superblock Type: Package Title: Analyses of potential superblock -Version: 0.1.0.095 +Version: 0.1.0.096 Authors@R: person(given = "Mark", family = "Padgham", diff --git a/R/osmdata-extract.R b/R/osmdata-extract.R index 6de2bfb..0b1b557 100644 --- a/R/osmdata-extract.R +++ b/R/osmdata-extract.R @@ -33,13 +33,10 @@ sb_osmdata_extract <- function (bbox, hw_names, outer = TRUE) { parking_facilities <- extract_osm_parking_facilities (bbox) cli::cli_alert_success ("Extracted data on parking areas.") - # Extract tree and bicycle parking nodes, but only keep those within 5m of - # the internal streeets. - node_limit <- 5 # in metres + # Extract tree and bicycle parking nodes nodes <- extract_osm_nodes (bbox) - dmat <- sf::st_distance (nodes, dat_hw) # dim = (nodes, hw) - dmin <- apply (dmat, 1, min) - nodes <- nodes [which (dmin <= node_limit), ] + index <- sf::st_within (nodes, bounding_poly, sparse = FALSE) + nodes <- nodes [index, ] list ( bbox = bbox, diff --git a/R/parking-areas.R b/R/parking-areas.R index d5807db..b05839a 100644 --- a/R/parking-areas.R +++ b/R/parking-areas.R @@ -118,9 +118,15 @@ parking_structure <- function (hws) { return (hws) } -reduce_parking_for_trees <- function (hws, osmdat) { +reduce_parking_for_trees <- function (hws, osmdat, buffer = 5) { nodes <- osmdat$nodes + # First reduce nodes to only those within buffer distance of hws: + dmat <- sf::st_distance (nodes, hws) + dmin <- apply (dmat, 1, min) + nodes <- nodes [which (dmin <= buffer), ] + + # Then map nodes to hws: dmat <- sf::st_distance (nodes, hws) index <- table (apply (dmat, 1, which.min)) index <- data.frame ( @@ -138,6 +144,7 @@ reduce_parking_for_trees <- function (hws, osmdat) { this_dir <- hws [[paste0 ("parking_", dir)]] this_red <- reductions [match (this_dir, angles)] this_red [is.na (this_red)] <- 0 + this_red [which (hws$num_parking_spaces == 0)] <- 0 hws$num_parking_spaces <- hws$num_parking_spaces - this_red * node_counts / 2 diff --git a/codemeta.json b/codemeta.json index c50da06..0ac56da 100644 --- a/codemeta.json +++ b/codemeta.json @@ -7,7 +7,7 @@ "codeRepository": "https://github.com/UrbanAnalyst/superblock-ms", "issueTracker": "https://github.com/UrbanAnalyst/superblock-ms/issues", "license": "https://spdx.org/licenses/GPL-3.0", - "version": "0.1.0.095", + "version": "0.1.0.096", "programmingLanguage": { "@type": "ComputerLanguage", "name": "R", diff --git a/tests/testthat/helper-osmdata-memoise.R b/tests/testthat/helper-osmdata-memoise.R index 75335bd..d6e7276 100644 --- a/tests/testthat/helper-osmdata-memoise.R +++ b/tests/testthat/helper-osmdata-memoise.R @@ -27,4 +27,8 @@ memoise_osmdata_calls <- function (bbox, hw_names) { parking_facilities <- httptest2::with_mock_dir ("osm-parking-facilities", { extract_osm_parking_facilities (bbox) }) + + parking_facilities <- httptest2::with_mock_dir ("osm-nodes", { + extract_osm_nodes (bbox) + }) } diff --git a/tests/testthat/osm-nodes/overpass/interpreter-8fee03-POST.R b/tests/testthat/osm-nodes/overpass/interpreter-8fee03-POST.R new file mode 100644 index 0000000..1895591 --- /dev/null +++ b/tests/testthat/osm-nodes/overpass/interpreter-8fee03-POST.R @@ -0,0 +1,822 @@ +structure(list(method = "POST", url = "https://overpass/interpreter", + status_code = 200L, headers = structure(list(Server = "nginx/1.18.0", + Date = "Fri, 26 Sep 2025 13:57:53 GMT", `Content-Type` = "application/osm3s+xml", + `Transfer-Encoding` = "chunked", Connection = "keep-alive", + `Kumi-Overpass-Worker` = "h9"), class = "httr2_headers"), + body = as.raw(c(0x3c, 0x3f, 0x78, 0x6d, 0x6c, 0x20, 0x76, + 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x31, 0x2e, + 0x30, 0x22, 0x20, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, + 0x67, 0x3d, 0x22, 0x55, 0x54, 0x46, 0x2d, 0x38, 0x22, 0x3f, + 0x3e, 0x0a, 0x3c, 0x6f, 0x73, 0x6d, 0x20, 0x76, 0x65, 0x72, + 0x73, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x30, 0x2e, 0x36, 0x22, + 0x20, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, + 0x3d, 0x22, 0x4f, 0x76, 0x65, 0x72, 0x70, 0x61, 0x73, 0x73, + 0x20, 0x41, 0x50, 0x49, 0x20, 0x30, 0x2e, 0x37, 0x2e, 0x36, + 0x31, 0x2e, 0x38, 0x20, 0x62, 0x31, 0x30, 0x38, 0x30, 0x61, + 0x62, 0x64, 0x22, 0x3e, 0x0a, 0x3c, 0x6e, 0x6f, 0x74, 0x65, + 0x3e, 0x54, 0x68, 0x65, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, + 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x64, 0x20, 0x69, + 0x6e, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x64, 0x6f, 0x63, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x69, 0x73, 0x20, 0x66, + 0x72, 0x6f, 0x6d, 0x20, 0x77, 0x77, 0x77, 0x2e, 0x6f, 0x70, + 0x65, 0x6e, 0x73, 0x74, 0x72, 0x65, 0x65, 0x74, 0x6d, 0x61, + 0x70, 0x2e, 0x6f, 0x72, 0x67, 0x2e, 0x20, 0x54, 0x68, 0x65, + 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x69, 0x73, 0x20, 0x6d, + 0x61, 0x64, 0x65, 0x20, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, + 0x62, 0x6c, 0x65, 0x20, 0x75, 0x6e, 0x64, 0x65, 0x72, 0x20, + 0x4f, 0x44, 0x62, 0x4c, 0x2e, 0x3c, 0x2f, 0x6e, 0x6f, 0x74, + 0x65, 0x3e, 0x0a, 0x3c, 0x6d, 0x65, 0x74, 0x61, 0x20, 0x6f, + 0x73, 0x6d, 0x5f, 0x62, 0x61, 0x73, 0x65, 0x3d, 0x22, 0x32, + 0x30, 0x32, 0x32, 0x2d, 0x30, 0x31, 0x2d, 0x30, 0x31, 0x54, + 0x30, 0x30, 0x3a, 0x30, 0x30, 0x3a, 0x30, 0x30, 0x5a, 0x22, + 0x2f, 0x3e, 0x0a, 0x0a, 0x20, 0x20, 0x3c, 0x6e, 0x6f, 0x64, + 0x65, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x32, 0x33, 0x37, 0x38, + 0x38, 0x34, 0x38, 0x39, 0x38, 0x35, 0x22, 0x20, 0x6c, 0x61, + 0x74, 0x3d, 0x22, 0x35, 0x31, 0x2e, 0x39, 0x35, 0x35, 0x38, + 0x37, 0x35, 0x38, 0x22, 0x20, 0x6c, 0x6f, 0x6e, 0x3d, 0x22, + 0x37, 0x2e, 0x36, 0x34, 0x32, 0x38, 0x32, 0x32, 0x37, 0x22, + 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x74, 0x61, 0x67, + 0x20, 0x6b, 0x3d, 0x22, 0x64, 0x65, 0x6e, 0x6f, 0x74, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x76, 0x3d, 0x22, 0x75, + 0x72, 0x62, 0x61, 0x6e, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x3c, 0x74, 0x61, 0x67, 0x20, 0x6b, 0x3d, 0x22, + 0x6c, 0x65, 0x61, 0x66, 0x5f, 0x63, 0x79, 0x63, 0x6c, 0x65, + 0x22, 0x20, 0x76, 0x3d, 0x22, 0x65, 0x76, 0x65, 0x72, 0x67, + 0x72, 0x65, 0x65, 0x6e, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x3c, 0x74, 0x61, 0x67, 0x20, 0x6b, 0x3d, 0x22, + 0x6c, 0x65, 0x61, 0x66, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x22, + 0x20, 0x76, 0x3d, 0x22, 0x6e, 0x65, 0x65, 0x64, 0x6c, 0x65, + 0x6c, 0x65, 0x61, 0x76, 0x65, 0x64, 0x22, 0x2f, 0x3e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x3c, 0x74, 0x61, 0x67, 0x20, 0x6b, + 0x3d, 0x22, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x61, 0x6c, 0x22, + 0x20, 0x76, 0x3d, 0x22, 0x74, 0x72, 0x65, 0x65, 0x22, 0x2f, + 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x2f, 0x6e, 0x6f, 0x64, 0x65, + 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x6e, 0x6f, 0x64, 0x65, 0x20, + 0x69, 0x64, 0x3d, 0x22, 0x32, 0x33, 0x37, 0x38, 0x38, 0x34, + 0x38, 0x39, 0x39, 0x30, 0x22, 0x20, 0x6c, 0x61, 0x74, 0x3d, + 0x22, 0x35, 0x31, 0x2e, 0x39, 0x35, 0x35, 0x38, 0x35, 0x35, + 0x34, 0x22, 0x20, 0x6c, 0x6f, 0x6e, 0x3d, 0x22, 0x37, 0x2e, + 0x36, 0x34, 0x32, 0x38, 0x30, 0x38, 0x35, 0x22, 0x3e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x3c, 0x74, 0x61, 0x67, 0x20, 0x6b, + 0x3d, 0x22, 0x64, 0x65, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x22, 0x20, 0x76, 0x3d, 0x22, 0x75, 0x72, 0x62, + 0x61, 0x6e, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x3c, 0x74, 0x61, 0x67, 0x20, 0x6b, 0x3d, 0x22, 0x6c, 0x65, + 0x61, 0x66, 0x5f, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x22, 0x20, + 0x76, 0x3d, 0x22, 0x65, 0x76, 0x65, 0x72, 0x67, 0x72, 0x65, + 0x65, 0x6e, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x3c, 0x74, 0x61, 0x67, 0x20, 0x6b, 0x3d, 0x22, 0x6c, 0x65, + 0x61, 0x66, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x22, 0x20, 0x76, + 0x3d, 0x22, 0x6e, 0x65, 0x65, 0x64, 0x6c, 0x65, 0x6c, 0x65, + 0x61, 0x76, 0x65, 0x64, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x3c, 0x74, 0x61, 0x67, 0x20, 0x6b, 0x3d, 0x22, + 0x6e, 0x61, 0x74, 0x75, 0x72, 0x61, 0x6c, 0x22, 0x20, 0x76, + 0x3d, 0x22, 0x74, 0x72, 0x65, 0x65, 0x22, 0x2f, 0x3e, 0x0a, + 0x20, 0x20, 0x3c, 0x2f, 0x6e, 0x6f, 0x64, 0x65, 0x3e, 0x0a, + 0x20, 0x20, 0x3c, 0x6e, 0x6f, 0x64, 0x65, 0x20, 0x69, 0x64, + 0x3d, 0x22, 0x32, 0x33, 0x37, 0x38, 0x38, 0x34, 0x39, 0x30, + 0x30, 0x34, 0x22, 0x20, 0x6c, 0x61, 0x74, 0x3d, 0x22, 0x35, + 0x31, 0x2e, 0x39, 0x35, 0x35, 0x37, 0x35, 0x30, 0x39, 0x22, + 0x20, 0x6c, 0x6f, 0x6e, 0x3d, 0x22, 0x37, 0x2e, 0x36, 0x34, + 0x32, 0x38, 0x35, 0x35, 0x31, 0x22, 0x3e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x3c, 0x74, 0x61, 0x67, 0x20, 0x6b, 0x3d, 0x22, + 0x6c, 0x65, 0x61, 0x66, 0x5f, 0x63, 0x79, 0x63, 0x6c, 0x65, + 0x22, 0x20, 0x76, 0x3d, 0x22, 0x65, 0x76, 0x65, 0x72, 0x67, + 0x72, 0x65, 0x65, 0x6e, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x3c, 0x74, 0x61, 0x67, 0x20, 0x6b, 0x3d, 0x22, + 0x6c, 0x65, 0x61, 0x66, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x22, + 0x20, 0x76, 0x3d, 0x22, 0x6e, 0x65, 0x65, 0x64, 0x6c, 0x65, + 0x6c, 0x65, 0x61, 0x76, 0x65, 0x64, 0x22, 0x2f, 0x3e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x3c, 0x74, 0x61, 0x67, 0x20, 0x6b, + 0x3d, 0x22, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x61, 0x6c, 0x22, + 0x20, 0x76, 0x3d, 0x22, 0x74, 0x72, 0x65, 0x65, 0x22, 0x2f, + 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x2f, 0x6e, 0x6f, 0x64, 0x65, + 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x6e, 0x6f, 0x64, 0x65, 0x20, + 0x69, 0x64, 0x3d, 0x22, 0x32, 0x33, 0x37, 0x38, 0x38, 0x34, + 0x39, 0x30, 0x31, 0x32, 0x22, 0x20, 0x6c, 0x61, 0x74, 0x3d, + 0x22, 0x35, 0x31, 0x2e, 0x39, 0x35, 0x35, 0x39, 0x30, 0x30, + 0x31, 0x22, 0x20, 0x6c, 0x6f, 0x6e, 0x3d, 0x22, 0x37, 0x2e, + 0x36, 0x34, 0x32, 0x39, 0x31, 0x35, 0x30, 0x22, 0x3e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x3c, 0x74, 0x61, 0x67, 0x20, 0x6b, + 0x3d, 0x22, 0x6c, 0x65, 0x61, 0x66, 0x5f, 0x63, 0x79, 0x63, + 0x6c, 0x65, 0x22, 0x20, 0x76, 0x3d, 0x22, 0x64, 0x65, 0x63, + 0x69, 0x64, 0x75, 0x6f, 0x75, 0x73, 0x22, 0x2f, 0x3e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x3c, 0x74, 0x61, 0x67, 0x20, 0x6b, + 0x3d, 0x22, 0x6c, 0x65, 0x61, 0x66, 0x5f, 0x74, 0x79, 0x70, + 0x65, 0x22, 0x20, 0x76, 0x3d, 0x22, 0x62, 0x72, 0x6f, 0x61, + 0x64, 0x6c, 0x65, 0x61, 0x76, 0x65, 0x64, 0x22, 0x2f, 0x3e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x74, 0x61, 0x67, 0x20, + 0x6b, 0x3d, 0x22, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x61, 0x6c, + 0x22, 0x20, 0x76, 0x3d, 0x22, 0x74, 0x72, 0x65, 0x65, 0x22, + 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x2f, 0x6e, 0x6f, 0x64, + 0x65, 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x6e, 0x6f, 0x64, 0x65, + 0x20, 0x69, 0x64, 0x3d, 0x22, 0x32, 0x33, 0x37, 0x38, 0x38, + 0x34, 0x39, 0x30, 0x31, 0x33, 0x22, 0x20, 0x6c, 0x61, 0x74, + 0x3d, 0x22, 0x35, 0x31, 0x2e, 0x39, 0x35, 0x35, 0x37, 0x37, + 0x38, 0x31, 0x22, 0x20, 0x6c, 0x6f, 0x6e, 0x3d, 0x22, 0x37, + 0x2e, 0x36, 0x34, 0x32, 0x37, 0x37, 0x32, 0x30, 0x22, 0x3e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x74, 0x61, 0x67, 0x20, + 0x6b, 0x3d, 0x22, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x61, 0x6c, + 0x22, 0x20, 0x76, 0x3d, 0x22, 0x74, 0x72, 0x65, 0x65, 0x22, + 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x2f, 0x6e, 0x6f, 0x64, + 0x65, 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x6e, 0x6f, 0x64, 0x65, + 0x20, 0x69, 0x64, 0x3d, 0x22, 0x37, 0x30, 0x36, 0x38, 0x31, + 0x36, 0x34, 0x36, 0x32, 0x32, 0x22, 0x20, 0x6c, 0x61, 0x74, + 0x3d, 0x22, 0x35, 0x31, 0x2e, 0x39, 0x35, 0x36, 0x36, 0x34, + 0x30, 0x37, 0x22, 0x20, 0x6c, 0x6f, 0x6e, 0x3d, 0x22, 0x37, + 0x2e, 0x36, 0x34, 0x32, 0x37, 0x39, 0x37, 0x39, 0x22, 0x3e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x74, 0x61, 0x67, 0x20, + 0x6b, 0x3d, 0x22, 0x61, 0x6d, 0x65, 0x6e, 0x69, 0x74, 0x79, + 0x22, 0x20, 0x76, 0x3d, 0x22, 0x62, 0x69, 0x63, 0x79, 0x63, + 0x6c, 0x65, 0x5f, 0x70, 0x61, 0x72, 0x6b, 0x69, 0x6e, 0x67, + 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x74, + 0x61, 0x67, 0x20, 0x6b, 0x3d, 0x22, 0x62, 0x69, 0x63, 0x79, + 0x63, 0x6c, 0x65, 0x5f, 0x70, 0x61, 0x72, 0x6b, 0x69, 0x6e, + 0x67, 0x22, 0x20, 0x76, 0x3d, 0x22, 0x73, 0x74, 0x61, 0x6e, + 0x64, 0x73, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x3c, 0x74, 0x61, 0x67, 0x20, 0x6b, 0x3d, 0x22, 0x63, 0x61, + 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x22, 0x20, 0x76, 0x3d, + 0x22, 0x36, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x3c, 0x74, 0x61, 0x67, 0x20, 0x6b, 0x3d, 0x22, 0x63, 0x6f, + 0x76, 0x65, 0x72, 0x65, 0x64, 0x22, 0x20, 0x76, 0x3d, 0x22, + 0x6e, 0x6f, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x3c, 0x74, 0x61, 0x67, 0x20, 0x6b, 0x3d, 0x22, 0x66, 0x65, + 0x65, 0x22, 0x20, 0x76, 0x3d, 0x22, 0x6e, 0x6f, 0x22, 0x2f, + 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x74, 0x61, 0x67, + 0x20, 0x6b, 0x3d, 0x22, 0x73, 0x75, 0x70, 0x65, 0x72, 0x76, + 0x69, 0x73, 0x65, 0x64, 0x22, 0x20, 0x76, 0x3d, 0x22, 0x6e, + 0x6f, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x2f, 0x6e, + 0x6f, 0x64, 0x65, 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x6e, 0x6f, + 0x64, 0x65, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x37, 0x30, 0x36, + 0x38, 0x31, 0x36, 0x34, 0x36, 0x32, 0x33, 0x22, 0x20, 0x6c, + 0x61, 0x74, 0x3d, 0x22, 0x35, 0x31, 0x2e, 0x39, 0x35, 0x36, + 0x36, 0x34, 0x37, 0x30, 0x22, 0x20, 0x6c, 0x6f, 0x6e, 0x3d, + 0x22, 0x37, 0x2e, 0x36, 0x34, 0x32, 0x38, 0x35, 0x34, 0x37, + 0x22, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x74, 0x61, + 0x67, 0x20, 0x6b, 0x3d, 0x22, 0x64, 0x65, 0x6e, 0x6f, 0x74, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x76, 0x3d, 0x22, + 0x61, 0x76, 0x65, 0x6e, 0x75, 0x65, 0x22, 0x2f, 0x3e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x3c, 0x74, 0x61, 0x67, 0x20, 0x6b, + 0x3d, 0x22, 0x6c, 0x65, 0x61, 0x66, 0x5f, 0x63, 0x79, 0x63, + 0x6c, 0x65, 0x22, 0x20, 0x76, 0x3d, 0x22, 0x64, 0x65, 0x63, + 0x69, 0x64, 0x75, 0x6f, 0x75, 0x73, 0x22, 0x2f, 0x3e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x3c, 0x74, 0x61, 0x67, 0x20, 0x6b, + 0x3d, 0x22, 0x6c, 0x65, 0x61, 0x66, 0x5f, 0x74, 0x79, 0x70, + 0x65, 0x22, 0x20, 0x76, 0x3d, 0x22, 0x62, 0x72, 0x6f, 0x61, + 0x64, 0x6c, 0x65, 0x61, 0x76, 0x65, 0x64, 0x22, 0x2f, 0x3e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x74, 0x61, 0x67, 0x20, + 0x6b, 0x3d, 0x22, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x61, 0x6c, + 0x22, 0x20, 0x76, 0x3d, 0x22, 0x74, 0x72, 0x65, 0x65, 0x22, + 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x2f, 0x6e, 0x6f, 0x64, + 0x65, 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x6e, 0x6f, 0x64, 0x65, + 0x20, 0x69, 0x64, 0x3d, 0x22, 0x38, 0x39, 0x39, 0x36, 0x38, + 0x34, 0x31, 0x36, 0x34, 0x32, 0x22, 0x20, 0x6c, 0x61, 0x74, + 0x3d, 0x22, 0x35, 0x31, 0x2e, 0x39, 0x35, 0x35, 0x39, 0x39, + 0x39, 0x36, 0x22, 0x20, 0x6c, 0x6f, 0x6e, 0x3d, 0x22, 0x37, + 0x2e, 0x36, 0x34, 0x33, 0x35, 0x36, 0x31, 0x35, 0x22, 0x3e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x74, 0x61, 0x67, 0x20, + 0x6b, 0x3d, 0x22, 0x61, 0x6d, 0x65, 0x6e, 0x69, 0x74, 0x79, + 0x22, 0x20, 0x76, 0x3d, 0x22, 0x62, 0x69, 0x63, 0x79, 0x63, + 0x6c, 0x65, 0x5f, 0x70, 0x61, 0x72, 0x6b, 0x69, 0x6e, 0x67, + 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x74, + 0x61, 0x67, 0x20, 0x6b, 0x3d, 0x22, 0x62, 0x69, 0x63, 0x79, + 0x63, 0x6c, 0x65, 0x5f, 0x70, 0x61, 0x72, 0x6b, 0x69, 0x6e, + 0x67, 0x22, 0x20, 0x76, 0x3d, 0x22, 0x73, 0x74, 0x61, 0x6e, + 0x64, 0x73, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x3c, 0x74, 0x61, 0x67, 0x20, 0x6b, 0x3d, 0x22, 0x63, 0x61, + 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x22, 0x20, 0x76, 0x3d, + 0x22, 0x31, 0x38, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x3c, 0x74, 0x61, 0x67, 0x20, 0x6b, 0x3d, 0x22, 0x63, + 0x6f, 0x76, 0x65, 0x72, 0x65, 0x64, 0x22, 0x20, 0x76, 0x3d, + 0x22, 0x6e, 0x6f, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x3c, 0x74, 0x61, 0x67, 0x20, 0x6b, 0x3d, 0x22, 0x66, + 0x65, 0x65, 0x22, 0x20, 0x76, 0x3d, 0x22, 0x6e, 0x6f, 0x22, + 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x2f, 0x6e, 0x6f, 0x64, + 0x65, 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x6e, 0x6f, 0x64, 0x65, + 0x20, 0x69, 0x64, 0x3d, 0x22, 0x38, 0x39, 0x39, 0x36, 0x38, + 0x34, 0x31, 0x36, 0x34, 0x33, 0x22, 0x20, 0x6c, 0x61, 0x74, + 0x3d, 0x22, 0x35, 0x31, 0x2e, 0x39, 0x35, 0x36, 0x36, 0x37, + 0x33, 0x38, 0x22, 0x20, 0x6c, 0x6f, 0x6e, 0x3d, 0x22, 0x37, + 0x2e, 0x36, 0x34, 0x32, 0x32, 0x33, 0x38, 0x39, 0x22, 0x2f, + 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x6e, 0x6f, 0x64, 0x65, 0x20, + 0x69, 0x64, 0x3d, 0x22, 0x39, 0x30, 0x30, 0x33, 0x34, 0x37, + 0x31, 0x39, 0x30, 0x39, 0x22, 0x20, 0x6c, 0x61, 0x74, 0x3d, + 0x22, 0x35, 0x31, 0x2e, 0x39, 0x35, 0x36, 0x35, 0x33, 0x38, + 0x31, 0x22, 0x20, 0x6c, 0x6f, 0x6e, 0x3d, 0x22, 0x37, 0x2e, + 0x36, 0x34, 0x34, 0x34, 0x36, 0x30, 0x33, 0x22, 0x3e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x3c, 0x74, 0x61, 0x67, 0x20, 0x6b, + 0x3d, 0x22, 0x6c, 0x65, 0x61, 0x66, 0x5f, 0x74, 0x79, 0x70, + 0x65, 0x22, 0x20, 0x76, 0x3d, 0x22, 0x62, 0x72, 0x6f, 0x61, + 0x64, 0x6c, 0x65, 0x61, 0x76, 0x65, 0x64, 0x22, 0x2f, 0x3e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x74, 0x61, 0x67, 0x20, + 0x6b, 0x3d, 0x22, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x61, 0x6c, + 0x22, 0x20, 0x76, 0x3d, 0x22, 0x74, 0x72, 0x65, 0x65, 0x22, + 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x2f, 0x6e, 0x6f, 0x64, + 0x65, 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x6e, 0x6f, 0x64, 0x65, + 0x20, 0x69, 0x64, 0x3d, 0x22, 0x39, 0x39, 0x30, 0x33, 0x37, + 0x37, 0x35, 0x34, 0x38, 0x30, 0x22, 0x20, 0x6c, 0x61, 0x74, + 0x3d, 0x22, 0x35, 0x31, 0x2e, 0x39, 0x35, 0x35, 0x36, 0x38, + 0x39, 0x35, 0x22, 0x20, 0x6c, 0x6f, 0x6e, 0x3d, 0x22, 0x37, + 0x2e, 0x36, 0x34, 0x33, 0x31, 0x33, 0x36, 0x38, 0x22, 0x3e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x74, 0x61, 0x67, 0x20, + 0x6b, 0x3d, 0x22, 0x6c, 0x65, 0x61, 0x66, 0x5f, 0x74, 0x79, + 0x70, 0x65, 0x22, 0x20, 0x76, 0x3d, 0x22, 0x62, 0x72, 0x6f, + 0x61, 0x64, 0x6c, 0x65, 0x61, 0x76, 0x65, 0x64, 0x22, 0x2f, + 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x74, 0x61, 0x67, + 0x20, 0x6b, 0x3d, 0x22, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x61, + 0x6c, 0x22, 0x20, 0x76, 0x3d, 0x22, 0x74, 0x72, 0x65, 0x65, + 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x2f, 0x6e, 0x6f, + 0x64, 0x65, 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x6e, 0x6f, 0x64, + 0x65, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x39, 0x39, 0x30, 0x33, + 0x37, 0x37, 0x35, 0x34, 0x38, 0x31, 0x22, 0x20, 0x6c, 0x61, + 0x74, 0x3d, 0x22, 0x35, 0x31, 0x2e, 0x39, 0x35, 0x36, 0x30, + 0x33, 0x34, 0x36, 0x22, 0x20, 0x6c, 0x6f, 0x6e, 0x3d, 0x22, + 0x37, 0x2e, 0x36, 0x34, 0x33, 0x30, 0x37, 0x34, 0x30, 0x22, + 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x74, 0x61, 0x67, + 0x20, 0x6b, 0x3d, 0x22, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x61, + 0x6c, 0x22, 0x20, 0x76, 0x3d, 0x22, 0x74, 0x72, 0x65, 0x65, + 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x2f, 0x6e, 0x6f, + 0x64, 0x65, 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x6e, 0x6f, 0x64, + 0x65, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x39, 0x39, 0x30, 0x33, + 0x37, 0x37, 0x35, 0x34, 0x38, 0x32, 0x22, 0x20, 0x6c, 0x61, + 0x74, 0x3d, 0x22, 0x35, 0x31, 0x2e, 0x39, 0x35, 0x35, 0x36, + 0x35, 0x37, 0x35, 0x22, 0x20, 0x6c, 0x6f, 0x6e, 0x3d, 0x22, + 0x37, 0x2e, 0x36, 0x34, 0x33, 0x32, 0x32, 0x31, 0x33, 0x22, + 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x74, 0x61, 0x67, + 0x20, 0x6b, 0x3d, 0x22, 0x6c, 0x65, 0x61, 0x66, 0x5f, 0x74, + 0x79, 0x70, 0x65, 0x22, 0x20, 0x76, 0x3d, 0x22, 0x62, 0x72, + 0x6f, 0x61, 0x64, 0x6c, 0x65, 0x61, 0x76, 0x65, 0x64, 0x22, + 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x74, 0x61, + 0x67, 0x20, 0x6b, 0x3d, 0x22, 0x6e, 0x61, 0x74, 0x75, 0x72, + 0x61, 0x6c, 0x22, 0x20, 0x76, 0x3d, 0x22, 0x74, 0x72, 0x65, + 0x65, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x2f, 0x6e, + 0x6f, 0x64, 0x65, 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x6e, 0x6f, + 0x64, 0x65, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x39, 0x39, 0x30, + 0x33, 0x37, 0x37, 0x35, 0x34, 0x38, 0x33, 0x22, 0x20, 0x6c, + 0x61, 0x74, 0x3d, 0x22, 0x35, 0x31, 0x2e, 0x39, 0x35, 0x36, + 0x30, 0x37, 0x32, 0x36, 0x22, 0x20, 0x6c, 0x6f, 0x6e, 0x3d, + 0x22, 0x37, 0x2e, 0x36, 0x34, 0x33, 0x35, 0x31, 0x31, 0x30, + 0x22, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x74, 0x61, + 0x67, 0x20, 0x6b, 0x3d, 0x22, 0x6c, 0x65, 0x61, 0x66, 0x5f, + 0x74, 0x79, 0x70, 0x65, 0x22, 0x20, 0x76, 0x3d, 0x22, 0x62, + 0x72, 0x6f, 0x61, 0x64, 0x6c, 0x65, 0x61, 0x76, 0x65, 0x64, + 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x74, + 0x61, 0x67, 0x20, 0x6b, 0x3d, 0x22, 0x6e, 0x61, 0x74, 0x75, + 0x72, 0x61, 0x6c, 0x22, 0x20, 0x76, 0x3d, 0x22, 0x74, 0x72, + 0x65, 0x65, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x2f, + 0x6e, 0x6f, 0x64, 0x65, 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x6e, + 0x6f, 0x64, 0x65, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x39, 0x39, + 0x30, 0x33, 0x37, 0x37, 0x35, 0x34, 0x38, 0x34, 0x22, 0x20, + 0x6c, 0x61, 0x74, 0x3d, 0x22, 0x35, 0x31, 0x2e, 0x39, 0x35, + 0x36, 0x30, 0x34, 0x32, 0x38, 0x22, 0x20, 0x6c, 0x6f, 0x6e, + 0x3d, 0x22, 0x37, 0x2e, 0x36, 0x34, 0x33, 0x35, 0x39, 0x39, + 0x31, 0x22, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x74, + 0x61, 0x67, 0x20, 0x6b, 0x3d, 0x22, 0x6c, 0x65, 0x61, 0x66, + 0x5f, 0x74, 0x79, 0x70, 0x65, 0x22, 0x20, 0x76, 0x3d, 0x22, + 0x62, 0x72, 0x6f, 0x61, 0x64, 0x6c, 0x65, 0x61, 0x76, 0x65, + 0x64, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, + 0x74, 0x61, 0x67, 0x20, 0x6b, 0x3d, 0x22, 0x6e, 0x61, 0x74, + 0x75, 0x72, 0x61, 0x6c, 0x22, 0x20, 0x76, 0x3d, 0x22, 0x74, + 0x72, 0x65, 0x65, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x3c, + 0x2f, 0x6e, 0x6f, 0x64, 0x65, 0x3e, 0x0a, 0x20, 0x20, 0x3c, + 0x6e, 0x6f, 0x64, 0x65, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x39, + 0x39, 0x30, 0x33, 0x37, 0x37, 0x35, 0x34, 0x38, 0x36, 0x22, + 0x20, 0x6c, 0x61, 0x74, 0x3d, 0x22, 0x35, 0x31, 0x2e, 0x39, + 0x35, 0x36, 0x35, 0x39, 0x35, 0x35, 0x22, 0x20, 0x6c, 0x6f, + 0x6e, 0x3d, 0x22, 0x37, 0x2e, 0x36, 0x34, 0x35, 0x33, 0x38, + 0x33, 0x30, 0x22, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, + 0x74, 0x61, 0x67, 0x20, 0x6b, 0x3d, 0x22, 0x6e, 0x61, 0x74, + 0x75, 0x72, 0x61, 0x6c, 0x22, 0x20, 0x76, 0x3d, 0x22, 0x74, + 0x72, 0x65, 0x65, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x3c, + 0x2f, 0x6e, 0x6f, 0x64, 0x65, 0x3e, 0x0a, 0x20, 0x20, 0x3c, + 0x6e, 0x6f, 0x64, 0x65, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x39, + 0x39, 0x30, 0x33, 0x37, 0x37, 0x35, 0x34, 0x39, 0x35, 0x22, + 0x20, 0x6c, 0x61, 0x74, 0x3d, 0x22, 0x35, 0x31, 0x2e, 0x39, + 0x35, 0x36, 0x33, 0x36, 0x31, 0x39, 0x22, 0x20, 0x6c, 0x6f, + 0x6e, 0x3d, 0x22, 0x37, 0x2e, 0x36, 0x34, 0x34, 0x35, 0x39, + 0x34, 0x32, 0x22, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, + 0x74, 0x61, 0x67, 0x20, 0x6b, 0x3d, 0x22, 0x6e, 0x61, 0x74, + 0x75, 0x72, 0x61, 0x6c, 0x22, 0x20, 0x76, 0x3d, 0x22, 0x74, + 0x72, 0x65, 0x65, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x3c, + 0x2f, 0x6e, 0x6f, 0x64, 0x65, 0x3e, 0x0a, 0x20, 0x20, 0x3c, + 0x6e, 0x6f, 0x64, 0x65, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x39, + 0x39, 0x35, 0x36, 0x33, 0x36, 0x30, 0x34, 0x31, 0x30, 0x22, + 0x20, 0x6c, 0x61, 0x74, 0x3d, 0x22, 0x35, 0x31, 0x2e, 0x39, + 0x35, 0x35, 0x38, 0x32, 0x35, 0x34, 0x22, 0x20, 0x6c, 0x6f, + 0x6e, 0x3d, 0x22, 0x37, 0x2e, 0x36, 0x34, 0x31, 0x39, 0x31, + 0x30, 0x30, 0x22, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, + 0x74, 0x61, 0x67, 0x20, 0x6b, 0x3d, 0x22, 0x61, 0x63, 0x63, + 0x65, 0x73, 0x73, 0x22, 0x20, 0x76, 0x3d, 0x22, 0x79, 0x65, + 0x73, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, + 0x74, 0x61, 0x67, 0x20, 0x6b, 0x3d, 0x22, 0x61, 0x6d, 0x65, + 0x6e, 0x69, 0x74, 0x79, 0x22, 0x20, 0x76, 0x3d, 0x22, 0x62, + 0x69, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x5f, 0x70, 0x61, 0x72, + 0x6b, 0x69, 0x6e, 0x67, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x3c, 0x74, 0x61, 0x67, 0x20, 0x6b, 0x3d, 0x22, + 0x62, 0x69, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x5f, 0x70, 0x61, + 0x72, 0x6b, 0x69, 0x6e, 0x67, 0x22, 0x20, 0x76, 0x3d, 0x22, + 0x73, 0x74, 0x61, 0x6e, 0x64, 0x73, 0x22, 0x2f, 0x3e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x3c, 0x74, 0x61, 0x67, 0x20, 0x6b, + 0x3d, 0x22, 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, + 0x22, 0x20, 0x76, 0x3d, 0x22, 0x31, 0x38, 0x22, 0x2f, 0x3e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x74, 0x61, 0x67, 0x20, + 0x6b, 0x3d, 0x22, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x65, 0x64, + 0x22, 0x20, 0x76, 0x3d, 0x22, 0x6e, 0x6f, 0x22, 0x2f, 0x3e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x74, 0x61, 0x67, 0x20, + 0x6b, 0x3d, 0x22, 0x66, 0x65, 0x65, 0x22, 0x20, 0x76, 0x3d, + 0x22, 0x6e, 0x6f, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x3c, 0x74, 0x61, 0x67, 0x20, 0x6b, 0x3d, 0x22, 0x6f, + 0x70, 0x65, 0x6e, 0x69, 0x6e, 0x67, 0x5f, 0x68, 0x6f, 0x75, + 0x72, 0x73, 0x22, 0x20, 0x76, 0x3d, 0x22, 0x32, 0x34, 0x2f, + 0x37, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, + 0x74, 0x61, 0x67, 0x20, 0x6b, 0x3d, 0x22, 0x73, 0x75, 0x70, + 0x65, 0x72, 0x76, 0x69, 0x73, 0x65, 0x64, 0x22, 0x20, 0x76, + 0x3d, 0x22, 0x6e, 0x6f, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x3c, 0x74, 0x61, 0x67, 0x20, 0x6b, 0x3d, 0x22, + 0x73, 0x75, 0x72, 0x66, 0x61, 0x63, 0x65, 0x22, 0x20, 0x76, + 0x3d, 0x22, 0x61, 0x73, 0x70, 0x68, 0x61, 0x6c, 0x74, 0x22, + 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x2f, 0x6e, 0x6f, 0x64, + 0x65, 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x6e, 0x6f, 0x64, 0x65, + 0x20, 0x69, 0x64, 0x3d, 0x22, 0x39, 0x39, 0x36, 0x39, 0x34, + 0x31, 0x37, 0x34, 0x31, 0x32, 0x22, 0x20, 0x6c, 0x61, 0x74, + 0x3d, 0x22, 0x35, 0x31, 0x2e, 0x39, 0x35, 0x35, 0x38, 0x37, + 0x39, 0x31, 0x22, 0x20, 0x6c, 0x6f, 0x6e, 0x3d, 0x22, 0x37, + 0x2e, 0x36, 0x34, 0x31, 0x37, 0x34, 0x31, 0x34, 0x22, 0x3e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x74, 0x61, 0x67, 0x20, + 0x6b, 0x3d, 0x22, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x22, + 0x20, 0x76, 0x3d, 0x22, 0x79, 0x65, 0x73, 0x22, 0x2f, 0x3e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x74, 0x61, 0x67, 0x20, + 0x6b, 0x3d, 0x22, 0x61, 0x6d, 0x65, 0x6e, 0x69, 0x74, 0x79, + 0x22, 0x20, 0x76, 0x3d, 0x22, 0x62, 0x69, 0x63, 0x79, 0x63, + 0x6c, 0x65, 0x5f, 0x70, 0x61, 0x72, 0x6b, 0x69, 0x6e, 0x67, + 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x74, + 0x61, 0x67, 0x20, 0x6b, 0x3d, 0x22, 0x62, 0x69, 0x63, 0x79, + 0x63, 0x6c, 0x65, 0x5f, 0x70, 0x61, 0x72, 0x6b, 0x69, 0x6e, + 0x67, 0x22, 0x20, 0x76, 0x3d, 0x22, 0x73, 0x74, 0x61, 0x6e, + 0x64, 0x73, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x3c, 0x74, 0x61, 0x67, 0x20, 0x6b, 0x3d, 0x22, 0x63, 0x61, + 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x22, 0x20, 0x76, 0x3d, + 0x22, 0x31, 0x38, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x3c, 0x74, 0x61, 0x67, 0x20, 0x6b, 0x3d, 0x22, 0x63, + 0x6f, 0x76, 0x65, 0x72, 0x65, 0x64, 0x22, 0x20, 0x76, 0x3d, + 0x22, 0x6e, 0x6f, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x3c, 0x74, 0x61, 0x67, 0x20, 0x6b, 0x3d, 0x22, 0x66, + 0x65, 0x65, 0x22, 0x20, 0x76, 0x3d, 0x22, 0x6e, 0x6f, 0x22, + 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x74, 0x61, + 0x67, 0x20, 0x6b, 0x3d, 0x22, 0x6f, 0x70, 0x65, 0x6e, 0x69, + 0x6e, 0x67, 0x5f, 0x68, 0x6f, 0x75, 0x72, 0x73, 0x22, 0x20, + 0x76, 0x3d, 0x22, 0x32, 0x34, 0x2f, 0x37, 0x22, 0x2f, 0x3e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x74, 0x61, 0x67, 0x20, + 0x6b, 0x3d, 0x22, 0x73, 0x75, 0x70, 0x65, 0x72, 0x76, 0x69, + 0x73, 0x65, 0x64, 0x22, 0x20, 0x76, 0x3d, 0x22, 0x6e, 0x6f, + 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x74, + 0x61, 0x67, 0x20, 0x6b, 0x3d, 0x22, 0x73, 0x75, 0x72, 0x66, + 0x61, 0x63, 0x65, 0x22, 0x20, 0x76, 0x3d, 0x22, 0x61, 0x73, + 0x70, 0x68, 0x61, 0x6c, 0x74, 0x22, 0x2f, 0x3e, 0x0a, 0x20, + 0x20, 0x3c, 0x2f, 0x6e, 0x6f, 0x64, 0x65, 0x3e, 0x0a, 0x20, + 0x20, 0x3c, 0x6e, 0x6f, 0x64, 0x65, 0x20, 0x69, 0x64, 0x3d, + 0x22, 0x31, 0x30, 0x31, 0x32, 0x31, 0x33, 0x38, 0x38, 0x38, + 0x32, 0x30, 0x22, 0x20, 0x6c, 0x61, 0x74, 0x3d, 0x22, 0x35, + 0x31, 0x2e, 0x39, 0x35, 0x36, 0x34, 0x32, 0x32, 0x32, 0x22, + 0x20, 0x6c, 0x6f, 0x6e, 0x3d, 0x22, 0x37, 0x2e, 0x36, 0x34, + 0x32, 0x34, 0x35, 0x33, 0x30, 0x22, 0x3e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x3c, 0x74, 0x61, 0x67, 0x20, 0x6b, 0x3d, 0x22, + 0x61, 0x6d, 0x65, 0x6e, 0x69, 0x74, 0x79, 0x22, 0x20, 0x76, + 0x3d, 0x22, 0x62, 0x69, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x5f, + 0x70, 0x61, 0x72, 0x6b, 0x69, 0x6e, 0x67, 0x22, 0x2f, 0x3e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x74, 0x61, 0x67, 0x20, + 0x6b, 0x3d, 0x22, 0x62, 0x69, 0x63, 0x79, 0x63, 0x6c, 0x65, + 0x5f, 0x70, 0x61, 0x72, 0x6b, 0x69, 0x6e, 0x67, 0x22, 0x20, + 0x76, 0x3d, 0x22, 0x73, 0x74, 0x61, 0x6e, 0x64, 0x73, 0x22, + 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x74, 0x61, + 0x67, 0x20, 0x6b, 0x3d, 0x22, 0x63, 0x61, 0x70, 0x61, 0x63, + 0x69, 0x74, 0x79, 0x22, 0x20, 0x76, 0x3d, 0x22, 0x31, 0x30, + 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x74, + 0x61, 0x67, 0x20, 0x6b, 0x3d, 0x22, 0x63, 0x6f, 0x76, 0x65, + 0x72, 0x65, 0x64, 0x22, 0x20, 0x76, 0x3d, 0x22, 0x6e, 0x6f, + 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x74, + 0x61, 0x67, 0x20, 0x6b, 0x3d, 0x22, 0x66, 0x65, 0x65, 0x22, + 0x20, 0x76, 0x3d, 0x22, 0x6e, 0x6f, 0x22, 0x2f, 0x3e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x3c, 0x74, 0x61, 0x67, 0x20, 0x6b, + 0x3d, 0x22, 0x73, 0x75, 0x70, 0x65, 0x72, 0x76, 0x69, 0x73, + 0x65, 0x64, 0x22, 0x20, 0x76, 0x3d, 0x22, 0x6e, 0x6f, 0x22, + 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x2f, 0x6e, 0x6f, 0x64, + 0x65, 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x6e, 0x6f, 0x64, 0x65, + 0x20, 0x69, 0x64, 0x3d, 0x22, 0x31, 0x30, 0x31, 0x32, 0x31, + 0x33, 0x38, 0x38, 0x38, 0x32, 0x31, 0x22, 0x20, 0x6c, 0x61, + 0x74, 0x3d, 0x22, 0x35, 0x31, 0x2e, 0x39, 0x35, 0x36, 0x33, + 0x33, 0x34, 0x36, 0x22, 0x20, 0x6c, 0x6f, 0x6e, 0x3d, 0x22, + 0x37, 0x2e, 0x36, 0x34, 0x32, 0x33, 0x36, 0x39, 0x39, 0x22, + 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x74, 0x61, 0x67, + 0x20, 0x6b, 0x3d, 0x22, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x61, + 0x6c, 0x22, 0x20, 0x76, 0x3d, 0x22, 0x74, 0x72, 0x65, 0x65, + 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x2f, 0x6e, 0x6f, + 0x64, 0x65, 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x6e, 0x6f, 0x64, + 0x65, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x31, 0x30, 0x31, 0x32, + 0x31, 0x33, 0x38, 0x38, 0x38, 0x32, 0x32, 0x22, 0x20, 0x6c, + 0x61, 0x74, 0x3d, 0x22, 0x35, 0x31, 0x2e, 0x39, 0x35, 0x36, + 0x34, 0x35, 0x33, 0x37, 0x22, 0x20, 0x6c, 0x6f, 0x6e, 0x3d, + 0x22, 0x37, 0x2e, 0x36, 0x34, 0x32, 0x34, 0x39, 0x30, 0x36, + 0x22, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x74, 0x61, + 0x67, 0x20, 0x6b, 0x3d, 0x22, 0x6c, 0x65, 0x61, 0x66, 0x5f, + 0x74, 0x79, 0x70, 0x65, 0x22, 0x20, 0x76, 0x3d, 0x22, 0x62, + 0x72, 0x6f, 0x61, 0x64, 0x6c, 0x65, 0x61, 0x76, 0x65, 0x64, + 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x74, + 0x61, 0x67, 0x20, 0x6b, 0x3d, 0x22, 0x6e, 0x61, 0x74, 0x75, + 0x72, 0x61, 0x6c, 0x22, 0x20, 0x76, 0x3d, 0x22, 0x74, 0x72, + 0x65, 0x65, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x2f, + 0x6e, 0x6f, 0x64, 0x65, 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x6e, + 0x6f, 0x64, 0x65, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x31, 0x30, + 0x31, 0x32, 0x31, 0x34, 0x30, 0x32, 0x36, 0x37, 0x33, 0x22, + 0x20, 0x6c, 0x61, 0x74, 0x3d, 0x22, 0x35, 0x31, 0x2e, 0x39, + 0x35, 0x36, 0x36, 0x35, 0x38, 0x34, 0x22, 0x20, 0x6c, 0x6f, + 0x6e, 0x3d, 0x22, 0x37, 0x2e, 0x36, 0x34, 0x32, 0x32, 0x32, + 0x33, 0x33, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x6e, + 0x6f, 0x64, 0x65, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x31, 0x30, + 0x31, 0x32, 0x31, 0x34, 0x30, 0x32, 0x36, 0x37, 0x34, 0x22, + 0x20, 0x6c, 0x61, 0x74, 0x3d, 0x22, 0x35, 0x31, 0x2e, 0x39, + 0x35, 0x36, 0x35, 0x39, 0x39, 0x33, 0x22, 0x20, 0x6c, 0x6f, + 0x6e, 0x3d, 0x22, 0x37, 0x2e, 0x36, 0x34, 0x32, 0x33, 0x37, + 0x37, 0x35, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x6e, + 0x6f, 0x64, 0x65, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x31, 0x30, + 0x31, 0x32, 0x31, 0x34, 0x30, 0x32, 0x36, 0x37, 0x35, 0x22, + 0x20, 0x6c, 0x61, 0x74, 0x3d, 0x22, 0x35, 0x31, 0x2e, 0x39, + 0x35, 0x36, 0x36, 0x31, 0x34, 0x37, 0x22, 0x20, 0x6c, 0x6f, + 0x6e, 0x3d, 0x22, 0x37, 0x2e, 0x36, 0x34, 0x32, 0x33, 0x39, + 0x33, 0x31, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x6e, + 0x6f, 0x64, 0x65, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x31, 0x30, + 0x31, 0x35, 0x34, 0x34, 0x39, 0x39, 0x37, 0x39, 0x36, 0x22, + 0x20, 0x6c, 0x61, 0x74, 0x3d, 0x22, 0x35, 0x31, 0x2e, 0x39, + 0x35, 0x35, 0x37, 0x34, 0x35, 0x30, 0x22, 0x20, 0x6c, 0x6f, + 0x6e, 0x3d, 0x22, 0x37, 0x2e, 0x36, 0x34, 0x31, 0x38, 0x32, + 0x38, 0x36, 0x22, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, + 0x74, 0x61, 0x67, 0x20, 0x6b, 0x3d, 0x22, 0x61, 0x6d, 0x65, + 0x6e, 0x69, 0x74, 0x79, 0x22, 0x20, 0x76, 0x3d, 0x22, 0x62, + 0x69, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x5f, 0x70, 0x61, 0x72, + 0x6b, 0x69, 0x6e, 0x67, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x3c, 0x74, 0x61, 0x67, 0x20, 0x6b, 0x3d, 0x22, + 0x62, 0x69, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x5f, 0x70, 0x61, + 0x72, 0x6b, 0x69, 0x6e, 0x67, 0x22, 0x20, 0x76, 0x3d, 0x22, + 0x73, 0x74, 0x61, 0x6e, 0x64, 0x73, 0x22, 0x2f, 0x3e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x3c, 0x74, 0x61, 0x67, 0x20, 0x6b, + 0x3d, 0x22, 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, + 0x22, 0x20, 0x76, 0x3d, 0x22, 0x31, 0x30, 0x22, 0x2f, 0x3e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x74, 0x61, 0x67, 0x20, + 0x6b, 0x3d, 0x22, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x65, 0x64, + 0x22, 0x20, 0x76, 0x3d, 0x22, 0x6e, 0x6f, 0x22, 0x2f, 0x3e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x74, 0x61, 0x67, 0x20, + 0x6b, 0x3d, 0x22, 0x73, 0x75, 0x70, 0x65, 0x72, 0x76, 0x69, + 0x73, 0x65, 0x64, 0x22, 0x20, 0x76, 0x3d, 0x22, 0x6e, 0x6f, + 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x2f, 0x6e, 0x6f, + 0x64, 0x65, 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x6e, 0x6f, 0x64, + 0x65, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x31, 0x30, 0x31, 0x35, + 0x34, 0x36, 0x35, 0x32, 0x31, 0x32, 0x34, 0x22, 0x20, 0x6c, + 0x61, 0x74, 0x3d, 0x22, 0x35, 0x31, 0x2e, 0x39, 0x35, 0x35, + 0x38, 0x32, 0x31, 0x35, 0x22, 0x20, 0x6c, 0x6f, 0x6e, 0x3d, + 0x22, 0x37, 0x2e, 0x36, 0x34, 0x33, 0x34, 0x31, 0x31, 0x35, + 0x22, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x74, 0x61, + 0x67, 0x20, 0x6b, 0x3d, 0x22, 0x61, 0x6d, 0x65, 0x6e, 0x69, + 0x74, 0x79, 0x22, 0x20, 0x76, 0x3d, 0x22, 0x62, 0x69, 0x63, + 0x79, 0x63, 0x6c, 0x65, 0x5f, 0x70, 0x61, 0x72, 0x6b, 0x69, + 0x6e, 0x67, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x3c, 0x74, 0x61, 0x67, 0x20, 0x6b, 0x3d, 0x22, 0x62, 0x69, + 0x63, 0x79, 0x63, 0x6c, 0x65, 0x5f, 0x70, 0x61, 0x72, 0x6b, + 0x69, 0x6e, 0x67, 0x22, 0x20, 0x76, 0x3d, 0x22, 0x73, 0x74, + 0x61, 0x6e, 0x64, 0x73, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x3c, 0x74, 0x61, 0x67, 0x20, 0x6b, 0x3d, 0x22, + 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x22, 0x20, + 0x76, 0x3d, 0x22, 0x31, 0x30, 0x22, 0x2f, 0x3e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x3c, 0x74, 0x61, 0x67, 0x20, 0x6b, 0x3d, + 0x22, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x65, 0x64, 0x22, 0x20, + 0x76, 0x3d, 0x22, 0x6e, 0x6f, 0x22, 0x2f, 0x3e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x3c, 0x74, 0x61, 0x67, 0x20, 0x6b, 0x3d, + 0x22, 0x66, 0x65, 0x65, 0x22, 0x20, 0x76, 0x3d, 0x22, 0x6e, + 0x6f, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x2f, 0x6e, + 0x6f, 0x64, 0x65, 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x6e, 0x6f, + 0x64, 0x65, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x31, 0x30, 0x31, + 0x35, 0x34, 0x36, 0x35, 0x32, 0x31, 0x32, 0x36, 0x22, 0x20, + 0x6c, 0x61, 0x74, 0x3d, 0x22, 0x35, 0x31, 0x2e, 0x39, 0x35, + 0x35, 0x33, 0x33, 0x38, 0x38, 0x22, 0x20, 0x6c, 0x6f, 0x6e, + 0x3d, 0x22, 0x37, 0x2e, 0x36, 0x34, 0x32, 0x38, 0x34, 0x32, + 0x39, 0x22, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x74, + 0x61, 0x67, 0x20, 0x6b, 0x3d, 0x22, 0x6c, 0x65, 0x61, 0x66, + 0x5f, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x22, 0x20, 0x76, 0x3d, + 0x22, 0x64, 0x65, 0x63, 0x69, 0x64, 0x75, 0x6f, 0x75, 0x73, + 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x74, + 0x61, 0x67, 0x20, 0x6b, 0x3d, 0x22, 0x6c, 0x65, 0x61, 0x66, + 0x5f, 0x74, 0x79, 0x70, 0x65, 0x22, 0x20, 0x76, 0x3d, 0x22, + 0x62, 0x72, 0x6f, 0x61, 0x64, 0x6c, 0x65, 0x61, 0x76, 0x65, + 0x64, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, + 0x74, 0x61, 0x67, 0x20, 0x6b, 0x3d, 0x22, 0x6e, 0x61, 0x74, + 0x75, 0x72, 0x61, 0x6c, 0x22, 0x20, 0x76, 0x3d, 0x22, 0x74, + 0x72, 0x65, 0x65, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x3c, + 0x2f, 0x6e, 0x6f, 0x64, 0x65, 0x3e, 0x0a, 0x20, 0x20, 0x3c, + 0x6e, 0x6f, 0x64, 0x65, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x31, + 0x30, 0x31, 0x35, 0x34, 0x36, 0x35, 0x32, 0x31, 0x32, 0x37, + 0x22, 0x20, 0x6c, 0x61, 0x74, 0x3d, 0x22, 0x35, 0x31, 0x2e, + 0x39, 0x35, 0x35, 0x33, 0x31, 0x30, 0x37, 0x22, 0x20, 0x6c, + 0x6f, 0x6e, 0x3d, 0x22, 0x37, 0x2e, 0x36, 0x34, 0x33, 0x30, + 0x31, 0x37, 0x33, 0x22, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x3c, 0x74, 0x61, 0x67, 0x20, 0x6b, 0x3d, 0x22, 0x6c, 0x65, + 0x61, 0x66, 0x5f, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x22, 0x20, + 0x76, 0x3d, 0x22, 0x64, 0x65, 0x63, 0x69, 0x64, 0x75, 0x6f, + 0x75, 0x73, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x3c, 0x74, 0x61, 0x67, 0x20, 0x6b, 0x3d, 0x22, 0x6c, 0x65, + 0x61, 0x66, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x22, 0x20, 0x76, + 0x3d, 0x22, 0x62, 0x72, 0x6f, 0x61, 0x64, 0x6c, 0x65, 0x61, + 0x76, 0x65, 0x64, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x3c, 0x74, 0x61, 0x67, 0x20, 0x6b, 0x3d, 0x22, 0x6e, + 0x61, 0x74, 0x75, 0x72, 0x61, 0x6c, 0x22, 0x20, 0x76, 0x3d, + 0x22, 0x74, 0x72, 0x65, 0x65, 0x22, 0x2f, 0x3e, 0x0a, 0x20, + 0x20, 0x3c, 0x2f, 0x6e, 0x6f, 0x64, 0x65, 0x3e, 0x0a, 0x20, + 0x20, 0x3c, 0x6e, 0x6f, 0x64, 0x65, 0x20, 0x69, 0x64, 0x3d, + 0x22, 0x31, 0x30, 0x31, 0x35, 0x36, 0x33, 0x32, 0x39, 0x37, + 0x38, 0x31, 0x22, 0x20, 0x6c, 0x61, 0x74, 0x3d, 0x22, 0x35, + 0x31, 0x2e, 0x39, 0x35, 0x36, 0x36, 0x39, 0x39, 0x32, 0x22, + 0x20, 0x6c, 0x6f, 0x6e, 0x3d, 0x22, 0x37, 0x2e, 0x36, 0x34, + 0x34, 0x35, 0x30, 0x38, 0x30, 0x22, 0x3e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x3c, 0x74, 0x61, 0x67, 0x20, 0x6b, 0x3d, 0x22, + 0x6c, 0x65, 0x61, 0x66, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x22, + 0x20, 0x76, 0x3d, 0x22, 0x62, 0x72, 0x6f, 0x61, 0x64, 0x6c, + 0x65, 0x61, 0x76, 0x65, 0x64, 0x22, 0x2f, 0x3e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x3c, 0x74, 0x61, 0x67, 0x20, 0x6b, 0x3d, + 0x22, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x61, 0x6c, 0x22, 0x20, + 0x76, 0x3d, 0x22, 0x74, 0x72, 0x65, 0x65, 0x22, 0x2f, 0x3e, + 0x0a, 0x20, 0x20, 0x3c, 0x2f, 0x6e, 0x6f, 0x64, 0x65, 0x3e, + 0x0a, 0x20, 0x20, 0x3c, 0x6e, 0x6f, 0x64, 0x65, 0x20, 0x69, + 0x64, 0x3d, 0x22, 0x31, 0x30, 0x31, 0x35, 0x36, 0x33, 0x32, + 0x39, 0x37, 0x38, 0x32, 0x22, 0x20, 0x6c, 0x61, 0x74, 0x3d, + 0x22, 0x35, 0x31, 0x2e, 0x39, 0x35, 0x36, 0x36, 0x37, 0x30, + 0x39, 0x22, 0x20, 0x6c, 0x6f, 0x6e, 0x3d, 0x22, 0x37, 0x2e, + 0x36, 0x34, 0x34, 0x36, 0x34, 0x39, 0x39, 0x22, 0x3e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x3c, 0x74, 0x61, 0x67, 0x20, 0x6b, + 0x3d, 0x22, 0x6c, 0x65, 0x61, 0x66, 0x5f, 0x74, 0x79, 0x70, + 0x65, 0x22, 0x20, 0x76, 0x3d, 0x22, 0x62, 0x72, 0x6f, 0x61, + 0x64, 0x6c, 0x65, 0x61, 0x76, 0x65, 0x64, 0x22, 0x2f, 0x3e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x74, 0x61, 0x67, 0x20, + 0x6b, 0x3d, 0x22, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x61, 0x6c, + 0x22, 0x20, 0x76, 0x3d, 0x22, 0x74, 0x72, 0x65, 0x65, 0x22, + 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x2f, 0x6e, 0x6f, 0x64, + 0x65, 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x6e, 0x6f, 0x64, 0x65, + 0x20, 0x69, 0x64, 0x3d, 0x22, 0x31, 0x30, 0x31, 0x35, 0x36, + 0x33, 0x32, 0x39, 0x37, 0x38, 0x39, 0x22, 0x20, 0x6c, 0x61, + 0x74, 0x3d, 0x22, 0x35, 0x31, 0x2e, 0x39, 0x35, 0x36, 0x33, + 0x32, 0x38, 0x30, 0x22, 0x20, 0x6c, 0x6f, 0x6e, 0x3d, 0x22, + 0x37, 0x2e, 0x36, 0x34, 0x33, 0x39, 0x34, 0x39, 0x30, 0x22, + 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x74, 0x61, 0x67, + 0x20, 0x6b, 0x3d, 0x22, 0x6c, 0x65, 0x61, 0x66, 0x5f, 0x74, + 0x79, 0x70, 0x65, 0x22, 0x20, 0x76, 0x3d, 0x22, 0x62, 0x72, + 0x6f, 0x61, 0x64, 0x6c, 0x65, 0x61, 0x76, 0x65, 0x64, 0x22, + 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x74, 0x61, + 0x67, 0x20, 0x6b, 0x3d, 0x22, 0x6e, 0x61, 0x74, 0x75, 0x72, + 0x61, 0x6c, 0x22, 0x20, 0x76, 0x3d, 0x22, 0x74, 0x72, 0x65, + 0x65, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x2f, 0x6e, + 0x6f, 0x64, 0x65, 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x6e, 0x6f, + 0x64, 0x65, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x31, 0x30, 0x31, + 0x35, 0x36, 0x39, 0x32, 0x39, 0x30, 0x34, 0x36, 0x22, 0x20, + 0x6c, 0x61, 0x74, 0x3d, 0x22, 0x35, 0x31, 0x2e, 0x39, 0x35, + 0x35, 0x39, 0x33, 0x39, 0x36, 0x22, 0x20, 0x6c, 0x6f, 0x6e, + 0x3d, 0x22, 0x37, 0x2e, 0x36, 0x34, 0x31, 0x39, 0x37, 0x34, + 0x32, 0x22, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x74, + 0x61, 0x67, 0x20, 0x6b, 0x3d, 0x22, 0x6e, 0x61, 0x74, 0x75, + 0x72, 0x61, 0x6c, 0x22, 0x20, 0x76, 0x3d, 0x22, 0x74, 0x72, + 0x65, 0x65, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x2f, + 0x6e, 0x6f, 0x64, 0x65, 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x6e, + 0x6f, 0x64, 0x65, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x31, 0x30, + 0x31, 0x35, 0x36, 0x39, 0x32, 0x39, 0x30, 0x34, 0x37, 0x22, + 0x20, 0x6c, 0x61, 0x74, 0x3d, 0x22, 0x35, 0x31, 0x2e, 0x39, + 0x35, 0x35, 0x38, 0x34, 0x35, 0x34, 0x22, 0x20, 0x6c, 0x6f, + 0x6e, 0x3d, 0x22, 0x37, 0x2e, 0x36, 0x34, 0x31, 0x37, 0x32, + 0x36, 0x31, 0x22, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, + 0x74, 0x61, 0x67, 0x20, 0x6b, 0x3d, 0x22, 0x6e, 0x61, 0x74, + 0x75, 0x72, 0x61, 0x6c, 0x22, 0x20, 0x76, 0x3d, 0x22, 0x74, + 0x72, 0x65, 0x65, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x3c, + 0x2f, 0x6e, 0x6f, 0x64, 0x65, 0x3e, 0x0a, 0x20, 0x20, 0x3c, + 0x6e, 0x6f, 0x64, 0x65, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x31, + 0x30, 0x31, 0x35, 0x36, 0x39, 0x32, 0x39, 0x30, 0x34, 0x38, + 0x22, 0x20, 0x6c, 0x61, 0x74, 0x3d, 0x22, 0x35, 0x31, 0x2e, + 0x39, 0x35, 0x35, 0x37, 0x38, 0x35, 0x39, 0x22, 0x20, 0x6c, + 0x6f, 0x6e, 0x3d, 0x22, 0x37, 0x2e, 0x36, 0x34, 0x31, 0x37, + 0x32, 0x32, 0x31, 0x22, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x3c, 0x74, 0x61, 0x67, 0x20, 0x6b, 0x3d, 0x22, 0x6e, 0x61, + 0x74, 0x75, 0x72, 0x61, 0x6c, 0x22, 0x20, 0x76, 0x3d, 0x22, + 0x74, 0x72, 0x65, 0x65, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, + 0x3c, 0x2f, 0x6e, 0x6f, 0x64, 0x65, 0x3e, 0x0a, 0x20, 0x20, + 0x3c, 0x6e, 0x6f, 0x64, 0x65, 0x20, 0x69, 0x64, 0x3d, 0x22, + 0x31, 0x30, 0x31, 0x35, 0x36, 0x39, 0x32, 0x39, 0x30, 0x34, + 0x39, 0x22, 0x20, 0x6c, 0x61, 0x74, 0x3d, 0x22, 0x35, 0x31, + 0x2e, 0x39, 0x35, 0x35, 0x37, 0x38, 0x34, 0x32, 0x22, 0x20, + 0x6c, 0x6f, 0x6e, 0x3d, 0x22, 0x37, 0x2e, 0x36, 0x34, 0x31, + 0x38, 0x32, 0x35, 0x34, 0x22, 0x3e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x3c, 0x74, 0x61, 0x67, 0x20, 0x6b, 0x3d, 0x22, 0x6e, + 0x61, 0x74, 0x75, 0x72, 0x61, 0x6c, 0x22, 0x20, 0x76, 0x3d, + 0x22, 0x74, 0x72, 0x65, 0x65, 0x22, 0x2f, 0x3e, 0x0a, 0x20, + 0x20, 0x3c, 0x2f, 0x6e, 0x6f, 0x64, 0x65, 0x3e, 0x0a, 0x20, + 0x20, 0x3c, 0x6e, 0x6f, 0x64, 0x65, 0x20, 0x69, 0x64, 0x3d, + 0x22, 0x31, 0x30, 0x39, 0x34, 0x34, 0x38, 0x33, 0x33, 0x30, + 0x38, 0x36, 0x22, 0x20, 0x6c, 0x61, 0x74, 0x3d, 0x22, 0x35, + 0x31, 0x2e, 0x39, 0x35, 0x35, 0x38, 0x31, 0x34, 0x38, 0x22, + 0x20, 0x6c, 0x6f, 0x6e, 0x3d, 0x22, 0x37, 0x2e, 0x36, 0x34, + 0x32, 0x36, 0x35, 0x32, 0x38, 0x22, 0x2f, 0x3e, 0x0a, 0x20, + 0x20, 0x3c, 0x6e, 0x6f, 0x64, 0x65, 0x20, 0x69, 0x64, 0x3d, + 0x22, 0x31, 0x30, 0x39, 0x34, 0x34, 0x38, 0x33, 0x33, 0x30, + 0x38, 0x37, 0x22, 0x20, 0x6c, 0x61, 0x74, 0x3d, 0x22, 0x35, + 0x31, 0x2e, 0x39, 0x35, 0x35, 0x38, 0x36, 0x32, 0x33, 0x22, + 0x20, 0x6c, 0x6f, 0x6e, 0x3d, 0x22, 0x37, 0x2e, 0x36, 0x34, + 0x32, 0x37, 0x30, 0x31, 0x30, 0x22, 0x2f, 0x3e, 0x0a, 0x20, + 0x20, 0x3c, 0x6e, 0x6f, 0x64, 0x65, 0x20, 0x69, 0x64, 0x3d, + 0x22, 0x31, 0x30, 0x39, 0x34, 0x34, 0x38, 0x33, 0x33, 0x30, + 0x38, 0x38, 0x22, 0x20, 0x6c, 0x61, 0x74, 0x3d, 0x22, 0x35, + 0x31, 0x2e, 0x39, 0x35, 0x35, 0x38, 0x35, 0x32, 0x35, 0x22, + 0x20, 0x6c, 0x6f, 0x6e, 0x3d, 0x22, 0x37, 0x2e, 0x36, 0x34, + 0x32, 0x37, 0x32, 0x36, 0x32, 0x22, 0x2f, 0x3e, 0x0a, 0x20, + 0x20, 0x3c, 0x6e, 0x6f, 0x64, 0x65, 0x20, 0x69, 0x64, 0x3d, + 0x22, 0x31, 0x30, 0x39, 0x34, 0x34, 0x38, 0x33, 0x33, 0x30, + 0x38, 0x39, 0x22, 0x20, 0x6c, 0x61, 0x74, 0x3d, 0x22, 0x35, + 0x31, 0x2e, 0x39, 0x35, 0x35, 0x38, 0x30, 0x35, 0x31, 0x22, + 0x20, 0x6c, 0x6f, 0x6e, 0x3d, 0x22, 0x37, 0x2e, 0x36, 0x34, + 0x32, 0x36, 0x37, 0x38, 0x30, 0x22, 0x2f, 0x3e, 0x0a, 0x20, + 0x20, 0x3c, 0x6e, 0x6f, 0x64, 0x65, 0x20, 0x69, 0x64, 0x3d, + 0x22, 0x31, 0x30, 0x39, 0x34, 0x34, 0x38, 0x33, 0x37, 0x39, + 0x31, 0x33, 0x22, 0x20, 0x6c, 0x61, 0x74, 0x3d, 0x22, 0x35, + 0x31, 0x2e, 0x39, 0x35, 0x36, 0x33, 0x39, 0x30, 0x39, 0x22, + 0x20, 0x6c, 0x6f, 0x6e, 0x3d, 0x22, 0x37, 0x2e, 0x36, 0x34, + 0x35, 0x30, 0x31, 0x30, 0x32, 0x22, 0x3e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x3c, 0x74, 0x61, 0x67, 0x20, 0x6b, 0x3d, 0x22, + 0x61, 0x6d, 0x65, 0x6e, 0x69, 0x74, 0x79, 0x22, 0x20, 0x76, + 0x3d, 0x22, 0x62, 0x69, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x5f, + 0x70, 0x61, 0x72, 0x6b, 0x69, 0x6e, 0x67, 0x22, 0x2f, 0x3e, + 0x0a, 0x20, 0x20, 0x3c, 0x2f, 0x6e, 0x6f, 0x64, 0x65, 0x3e, + 0x0a, 0x20, 0x20, 0x3c, 0x6e, 0x6f, 0x64, 0x65, 0x20, 0x69, + 0x64, 0x3d, 0x22, 0x31, 0x30, 0x39, 0x38, 0x30, 0x37, 0x39, + 0x32, 0x30, 0x39, 0x31, 0x22, 0x20, 0x6c, 0x61, 0x74, 0x3d, + 0x22, 0x35, 0x31, 0x2e, 0x39, 0x35, 0x35, 0x34, 0x30, 0x38, + 0x32, 0x22, 0x20, 0x6c, 0x6f, 0x6e, 0x3d, 0x22, 0x37, 0x2e, + 0x36, 0x34, 0x34, 0x31, 0x32, 0x32, 0x39, 0x22, 0x3e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x3c, 0x74, 0x61, 0x67, 0x20, 0x6b, + 0x3d, 0x22, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x61, 0x6c, 0x22, + 0x20, 0x76, 0x3d, 0x22, 0x74, 0x72, 0x65, 0x65, 0x22, 0x2f, + 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x2f, 0x6e, 0x6f, 0x64, 0x65, + 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x6e, 0x6f, 0x64, 0x65, 0x20, + 0x69, 0x64, 0x3d, 0x22, 0x31, 0x30, 0x39, 0x38, 0x30, 0x37, + 0x39, 0x32, 0x30, 0x39, 0x32, 0x22, 0x20, 0x6c, 0x61, 0x74, + 0x3d, 0x22, 0x35, 0x31, 0x2e, 0x39, 0x35, 0x35, 0x33, 0x34, + 0x38, 0x35, 0x22, 0x20, 0x6c, 0x6f, 0x6e, 0x3d, 0x22, 0x37, + 0x2e, 0x36, 0x34, 0x33, 0x39, 0x33, 0x39, 0x32, 0x22, 0x3e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x74, 0x61, 0x67, 0x20, + 0x6b, 0x3d, 0x22, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x61, 0x6c, + 0x22, 0x20, 0x76, 0x3d, 0x22, 0x74, 0x72, 0x65, 0x65, 0x22, + 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x2f, 0x6e, 0x6f, 0x64, + 0x65, 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x6e, 0x6f, 0x64, 0x65, + 0x20, 0x69, 0x64, 0x3d, 0x22, 0x31, 0x30, 0x39, 0x38, 0x30, + 0x37, 0x39, 0x32, 0x30, 0x39, 0x33, 0x22, 0x20, 0x6c, 0x61, + 0x74, 0x3d, 0x22, 0x35, 0x31, 0x2e, 0x39, 0x35, 0x35, 0x34, + 0x36, 0x39, 0x36, 0x22, 0x20, 0x6c, 0x6f, 0x6e, 0x3d, 0x22, + 0x37, 0x2e, 0x36, 0x34, 0x33, 0x37, 0x37, 0x38, 0x34, 0x22, + 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x74, 0x61, 0x67, + 0x20, 0x6b, 0x3d, 0x22, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x61, + 0x6c, 0x22, 0x20, 0x76, 0x3d, 0x22, 0x74, 0x72, 0x65, 0x65, + 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x2f, 0x6e, 0x6f, + 0x64, 0x65, 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x6e, 0x6f, 0x64, + 0x65, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x31, 0x31, 0x30, 0x31, + 0x33, 0x35, 0x30, 0x34, 0x38, 0x35, 0x39, 0x22, 0x20, 0x6c, + 0x61, 0x74, 0x3d, 0x22, 0x35, 0x31, 0x2e, 0x39, 0x35, 0x35, + 0x36, 0x34, 0x30, 0x31, 0x22, 0x20, 0x6c, 0x6f, 0x6e, 0x3d, + 0x22, 0x37, 0x2e, 0x36, 0x34, 0x34, 0x36, 0x38, 0x30, 0x32, + 0x22, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x74, 0x61, + 0x67, 0x20, 0x6b, 0x3d, 0x22, 0x6c, 0x65, 0x61, 0x66, 0x5f, + 0x63, 0x79, 0x63, 0x6c, 0x65, 0x22, 0x20, 0x76, 0x3d, 0x22, + 0x64, 0x65, 0x63, 0x69, 0x64, 0x75, 0x6f, 0x75, 0x73, 0x22, + 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x74, 0x61, + 0x67, 0x20, 0x6b, 0x3d, 0x22, 0x6c, 0x65, 0x61, 0x66, 0x5f, + 0x74, 0x79, 0x70, 0x65, 0x22, 0x20, 0x76, 0x3d, 0x22, 0x62, + 0x72, 0x6f, 0x61, 0x64, 0x6c, 0x65, 0x61, 0x76, 0x65, 0x64, + 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x74, + 0x61, 0x67, 0x20, 0x6b, 0x3d, 0x22, 0x6e, 0x61, 0x74, 0x75, + 0x72, 0x61, 0x6c, 0x22, 0x20, 0x76, 0x3d, 0x22, 0x74, 0x72, + 0x65, 0x65, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x2f, + 0x6e, 0x6f, 0x64, 0x65, 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x6e, + 0x6f, 0x64, 0x65, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x31, 0x31, + 0x36, 0x33, 0x32, 0x34, 0x33, 0x35, 0x32, 0x38, 0x30, 0x22, + 0x20, 0x6c, 0x61, 0x74, 0x3d, 0x22, 0x35, 0x31, 0x2e, 0x39, + 0x35, 0x35, 0x33, 0x36, 0x35, 0x36, 0x22, 0x20, 0x6c, 0x6f, + 0x6e, 0x3d, 0x22, 0x37, 0x2e, 0x36, 0x34, 0x33, 0x31, 0x30, + 0x37, 0x35, 0x22, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, + 0x74, 0x61, 0x67, 0x20, 0x6b, 0x3d, 0x22, 0x61, 0x63, 0x63, + 0x65, 0x73, 0x73, 0x22, 0x20, 0x76, 0x3d, 0x22, 0x79, 0x65, + 0x73, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, + 0x74, 0x61, 0x67, 0x20, 0x6b, 0x3d, 0x22, 0x61, 0x6d, 0x65, + 0x6e, 0x69, 0x74, 0x79, 0x22, 0x20, 0x76, 0x3d, 0x22, 0x62, + 0x69, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x5f, 0x70, 0x61, 0x72, + 0x6b, 0x69, 0x6e, 0x67, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x3c, 0x74, 0x61, 0x67, 0x20, 0x6b, 0x3d, 0x22, + 0x62, 0x69, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x5f, 0x70, 0x61, + 0x72, 0x6b, 0x69, 0x6e, 0x67, 0x22, 0x20, 0x76, 0x3d, 0x22, + 0x73, 0x74, 0x61, 0x6e, 0x64, 0x73, 0x22, 0x2f, 0x3e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x3c, 0x74, 0x61, 0x67, 0x20, 0x6b, + 0x3d, 0x22, 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, + 0x22, 0x20, 0x76, 0x3d, 0x22, 0x32, 0x36, 0x22, 0x2f, 0x3e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x74, 0x61, 0x67, 0x20, + 0x6b, 0x3d, 0x22, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x65, 0x64, + 0x22, 0x20, 0x76, 0x3d, 0x22, 0x6e, 0x6f, 0x22, 0x2f, 0x3e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x74, 0x61, 0x67, 0x20, + 0x6b, 0x3d, 0x22, 0x66, 0x65, 0x65, 0x22, 0x20, 0x76, 0x3d, + 0x22, 0x6e, 0x6f, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x3c, + 0x2f, 0x6e, 0x6f, 0x64, 0x65, 0x3e, 0x0a, 0x20, 0x20, 0x3c, + 0x6e, 0x6f, 0x64, 0x65, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x31, + 0x31, 0x36, 0x33, 0x32, 0x34, 0x33, 0x35, 0x32, 0x38, 0x31, + 0x22, 0x20, 0x6c, 0x61, 0x74, 0x3d, 0x22, 0x35, 0x31, 0x2e, + 0x39, 0x35, 0x35, 0x34, 0x37, 0x34, 0x32, 0x22, 0x20, 0x6c, + 0x6f, 0x6e, 0x3d, 0x22, 0x37, 0x2e, 0x36, 0x34, 0x32, 0x38, + 0x33, 0x30, 0x33, 0x22, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x3c, 0x74, 0x61, 0x67, 0x20, 0x6b, 0x3d, 0x22, 0x61, 0x63, + 0x63, 0x65, 0x73, 0x73, 0x22, 0x20, 0x76, 0x3d, 0x22, 0x79, + 0x65, 0x73, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x3c, 0x74, 0x61, 0x67, 0x20, 0x6b, 0x3d, 0x22, 0x61, 0x6d, + 0x65, 0x6e, 0x69, 0x74, 0x79, 0x22, 0x20, 0x76, 0x3d, 0x22, + 0x62, 0x69, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x5f, 0x70, 0x61, + 0x72, 0x6b, 0x69, 0x6e, 0x67, 0x22, 0x2f, 0x3e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x3c, 0x74, 0x61, 0x67, 0x20, 0x6b, 0x3d, + 0x22, 0x62, 0x69, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x5f, 0x70, + 0x61, 0x72, 0x6b, 0x69, 0x6e, 0x67, 0x22, 0x20, 0x76, 0x3d, + 0x22, 0x73, 0x74, 0x61, 0x6e, 0x64, 0x73, 0x22, 0x2f, 0x3e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x74, 0x61, 0x67, 0x20, + 0x6b, 0x3d, 0x22, 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, + 0x79, 0x22, 0x20, 0x76, 0x3d, 0x22, 0x31, 0x30, 0x22, 0x2f, + 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x74, 0x61, 0x67, + 0x20, 0x6b, 0x3d, 0x22, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x65, + 0x64, 0x22, 0x20, 0x76, 0x3d, 0x22, 0x6e, 0x6f, 0x22, 0x2f, + 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x74, 0x61, 0x67, + 0x20, 0x6b, 0x3d, 0x22, 0x66, 0x65, 0x65, 0x22, 0x20, 0x76, + 0x3d, 0x22, 0x6e, 0x6f, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, + 0x3c, 0x2f, 0x6e, 0x6f, 0x64, 0x65, 0x3e, 0x0a, 0x20, 0x20, + 0x3c, 0x77, 0x61, 0x79, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x31, + 0x31, 0x30, 0x36, 0x31, 0x31, 0x34, 0x31, 0x34, 0x37, 0x22, + 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x6e, 0x64, 0x20, + 0x72, 0x65, 0x66, 0x3d, 0x22, 0x38, 0x39, 0x39, 0x36, 0x38, + 0x34, 0x31, 0x36, 0x34, 0x33, 0x22, 0x2f, 0x3e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x3c, 0x6e, 0x64, 0x20, 0x72, 0x65, 0x66, + 0x3d, 0x22, 0x31, 0x30, 0x31, 0x32, 0x31, 0x34, 0x30, 0x32, + 0x36, 0x37, 0x35, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x3c, 0x6e, 0x64, 0x20, 0x72, 0x65, 0x66, 0x3d, 0x22, + 0x31, 0x30, 0x31, 0x32, 0x31, 0x34, 0x30, 0x32, 0x36, 0x37, + 0x34, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, + 0x6e, 0x64, 0x20, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x31, 0x30, + 0x31, 0x32, 0x31, 0x34, 0x30, 0x32, 0x36, 0x37, 0x33, 0x22, + 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x6e, 0x64, + 0x20, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x38, 0x39, 0x39, 0x36, + 0x38, 0x34, 0x31, 0x36, 0x34, 0x33, 0x22, 0x2f, 0x3e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x3c, 0x74, 0x61, 0x67, 0x20, 0x6b, + 0x3d, 0x22, 0x61, 0x6d, 0x65, 0x6e, 0x69, 0x74, 0x79, 0x22, + 0x20, 0x76, 0x3d, 0x22, 0x62, 0x69, 0x63, 0x79, 0x63, 0x6c, + 0x65, 0x5f, 0x70, 0x61, 0x72, 0x6b, 0x69, 0x6e, 0x67, 0x22, + 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x74, 0x61, + 0x67, 0x20, 0x6b, 0x3d, 0x22, 0x62, 0x69, 0x63, 0x79, 0x63, + 0x6c, 0x65, 0x5f, 0x70, 0x61, 0x72, 0x6b, 0x69, 0x6e, 0x67, + 0x22, 0x20, 0x76, 0x3d, 0x22, 0x73, 0x74, 0x61, 0x6e, 0x64, + 0x73, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, + 0x74, 0x61, 0x67, 0x20, 0x6b, 0x3d, 0x22, 0x63, 0x61, 0x70, + 0x61, 0x63, 0x69, 0x74, 0x79, 0x22, 0x20, 0x76, 0x3d, 0x22, + 0x31, 0x34, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x3c, 0x74, 0x61, 0x67, 0x20, 0x6b, 0x3d, 0x22, 0x63, 0x6f, + 0x76, 0x65, 0x72, 0x65, 0x64, 0x22, 0x20, 0x76, 0x3d, 0x22, + 0x6e, 0x6f, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x3c, 0x74, 0x61, 0x67, 0x20, 0x6b, 0x3d, 0x22, 0x66, 0x65, + 0x65, 0x22, 0x20, 0x76, 0x3d, 0x22, 0x6e, 0x6f, 0x22, 0x2f, + 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x2f, 0x77, 0x61, 0x79, 0x3e, + 0x0a, 0x20, 0x20, 0x3c, 0x77, 0x61, 0x79, 0x20, 0x69, 0x64, + 0x3d, 0x22, 0x31, 0x31, 0x37, 0x38, 0x31, 0x37, 0x39, 0x32, + 0x39, 0x31, 0x22, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, + 0x6e, 0x64, 0x20, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x31, 0x30, + 0x39, 0x34, 0x34, 0x38, 0x33, 0x33, 0x30, 0x38, 0x36, 0x22, + 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x6e, 0x64, + 0x20, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x31, 0x30, 0x39, 0x34, + 0x34, 0x38, 0x33, 0x33, 0x30, 0x38, 0x37, 0x22, 0x2f, 0x3e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x6e, 0x64, 0x20, 0x72, + 0x65, 0x66, 0x3d, 0x22, 0x31, 0x30, 0x39, 0x34, 0x34, 0x38, + 0x33, 0x33, 0x30, 0x38, 0x38, 0x22, 0x2f, 0x3e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x3c, 0x6e, 0x64, 0x20, 0x72, 0x65, 0x66, + 0x3d, 0x22, 0x31, 0x30, 0x39, 0x34, 0x34, 0x38, 0x33, 0x33, + 0x30, 0x38, 0x39, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x3c, 0x6e, 0x64, 0x20, 0x72, 0x65, 0x66, 0x3d, 0x22, + 0x31, 0x30, 0x39, 0x34, 0x34, 0x38, 0x33, 0x33, 0x30, 0x38, + 0x36, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, + 0x74, 0x61, 0x67, 0x20, 0x6b, 0x3d, 0x22, 0x61, 0x63, 0x63, + 0x65, 0x73, 0x73, 0x22, 0x20, 0x76, 0x3d, 0x22, 0x70, 0x72, + 0x69, 0x76, 0x61, 0x74, 0x65, 0x22, 0x2f, 0x3e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x3c, 0x74, 0x61, 0x67, 0x20, 0x6b, 0x3d, + 0x22, 0x61, 0x6d, 0x65, 0x6e, 0x69, 0x74, 0x79, 0x22, 0x20, + 0x76, 0x3d, 0x22, 0x62, 0x69, 0x63, 0x79, 0x63, 0x6c, 0x65, + 0x5f, 0x70, 0x61, 0x72, 0x6b, 0x69, 0x6e, 0x67, 0x22, 0x2f, + 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x74, 0x61, 0x67, + 0x20, 0x6b, 0x3d, 0x22, 0x62, 0x69, 0x63, 0x79, 0x63, 0x6c, + 0x65, 0x5f, 0x70, 0x61, 0x72, 0x6b, 0x69, 0x6e, 0x67, 0x22, + 0x20, 0x76, 0x3d, 0x22, 0x77, 0x61, 0x6c, 0x6c, 0x5f, 0x6c, + 0x6f, 0x6f, 0x70, 0x73, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x3c, 0x74, 0x61, 0x67, 0x20, 0x6b, 0x3d, 0x22, + 0x63, 0x6f, 0x76, 0x65, 0x72, 0x65, 0x64, 0x22, 0x20, 0x76, + 0x3d, 0x22, 0x79, 0x65, 0x73, 0x22, 0x2f, 0x3e, 0x0a, 0x20, + 0x20, 0x3c, 0x2f, 0x77, 0x61, 0x79, 0x3e, 0x0a, 0x0a, 0x3c, + 0x2f, 0x6f, 0x73, 0x6d, 0x3e, 0x0a)), timing = c(redirect = 0, + namelookup = 0, connect = 0, pretransfer = 0.000072, starttransfer = 1.973307, + total = 1.973367), cache = new.env(parent = emptyenv())), class = "httr2_response") diff --git a/tests/testthat/osm-nodes/overpass/status.txt b/tests/testthat/osm-nodes/overpass/status.txt new file mode 100644 index 0000000..48fde86 --- /dev/null +++ b/tests/testthat/osm-nodes/overpass/status.txt @@ -0,0 +1,20 @@ +Connected as: 123456789 +Current time: 2022-01-01T00:00:00Z +Announced endpoint: none +Rate limit: 0 +Currently running queries (pid, space limit, time limit, start time): +2887611 536870912 15 2022-01-01T00:00:00Z +2887584 536870912 25 2022-01-01T00:00:00Z +2887630 536870912 25 2022-01-01T00:00:00Z +2887675 536870912 180 2022-01-01T00:00:00Z +2887171 536870912 180 2022-01-01T00:00:00Z +2886808 536870912 240 2022-01-01T00:00:00Z +2887038 536870912 240 2022-01-01T00:00:00Z +2886809 536870912 240 2022-01-01T00:00:00Z +2887333 536870912 15 2022-01-01T00:00:00Z +2887628 536870912 180 2022-01-01T00:00:00Z +2887292 536870912 180 2022-01-01T00:00:00Z +2887342 536870912 180 2022-01-01T00:00:00Z +2887343 536870912 180 2022-01-01T00:00:00Z +2887349 536870912 180 2022-01-01T00:00:00Z +2887354 536870912 180 2022-01-01T00:00:00Z diff --git a/tests/testthat/test-osmdata.R b/tests/testthat/test-osmdata.R index 1705748..42e3a90 100644 --- a/tests/testthat/test-osmdata.R +++ b/tests/testthat/test-osmdata.R @@ -19,7 +19,7 @@ test_that ("osm extraction", { nms <- c ( "bbox", "hw_names", "bounding_poly", "highways", "buildings", "open_spaces", "parking_areas", - "parking_facilities", "dat_sc" + "parking_facilities", "nodes", "dat_sc" ) expect_named (osmdat, nms) From ea27d981eeb395120bb73e8d755ffdeab3962a51 Mon Sep 17 00:00:00 2001 From: mpadge Date: Mon, 29 Sep 2025 11:08:56 +0200 Subject: [PATCH 06/12] change parking lengths along streets --- DESCRIPTION | 2 +- R/parking-areas.R | 2 +- codemeta.json | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index 240e4a4..50b46c8 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,7 +1,7 @@ Package: superblock Type: Package Title: Analyses of potential superblock -Version: 0.1.0.096 +Version: 0.1.0.097 Authors@R: person(given = "Mark", family = "Padgham", diff --git a/R/parking-areas.R b/R/parking-areas.R index b05839a..198bb4e 100644 --- a/R/parking-areas.R +++ b/R/parking-areas.R @@ -28,7 +28,7 @@ parking_structure <- function (hws) { depths <- c (3, 4, 5) # (parallel, diagonal, perpendicular) angles <- c ("parallel", "diagonal", "perpenducular") # And equivalent lengths along the street - lengths <- c (5, 3, 3) + lengths <- c (5, 4, 3) parking <- sf::st_drop_geometry (hws [, grep ("parking", names (hws))]) hws <- hws [, which (!grepl ("parking", names (hws)))] diff --git a/codemeta.json b/codemeta.json index 0ac56da..010fd63 100644 --- a/codemeta.json +++ b/codemeta.json @@ -7,7 +7,7 @@ "codeRepository": "https://github.com/UrbanAnalyst/superblock-ms", "issueTracker": "https://github.com/UrbanAnalyst/superblock-ms/issues", "license": "https://spdx.org/licenses/GPL-3.0", - "version": "0.1.0.096", + "version": "0.1.0.097", "programmingLanguage": { "@type": "ComputerLanguage", "name": "R", From 16453d3b135538cac95af7dfbd68d93974c26c58 Mon Sep 17 00:00:00 2001 From: mpadge Date: Mon, 29 Sep 2025 11:09:29 +0200 Subject: [PATCH 07/12] fix reduction of highways to data-only cols --- DESCRIPTION | 2 +- R/osmdata-extract.R | 2 +- codemeta.json | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index 50b46c8..5bac63e 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,7 +1,7 @@ Package: superblock Type: Package Title: Analyses of potential superblock -Version: 0.1.0.097 +Version: 0.1.0.098 Authors@R: person(given = "Mark", family = "Padgham", diff --git a/R/osmdata-extract.R b/R/osmdata-extract.R index 0b1b557..1fb1edb 100644 --- a/R/osmdata-extract.R +++ b/R/osmdata-extract.R @@ -87,7 +87,7 @@ extract_osm_highways <- function (bbox, bounding_poly) { nms <- names (hws) [which (!names (hws) == "geometry")] has_data <- vapply (nms, function (n) any (!is.na (hws [[n]])), logical (1L)) has_data <- c (which (has_data), which (nms == "geometry")) - hws [, has_data] + hws <- hws [, has_data] return (list (highways = hws, dat_sc = dat_sc)) } diff --git a/codemeta.json b/codemeta.json index 010fd63..43bd324 100644 --- a/codemeta.json +++ b/codemeta.json @@ -7,7 +7,7 @@ "codeRepository": "https://github.com/UrbanAnalyst/superblock-ms", "issueTracker": "https://github.com/UrbanAnalyst/superblock-ms/issues", "license": "https://spdx.org/licenses/GPL-3.0", - "version": "0.1.0.097", + "version": "0.1.0.098", "programmingLanguage": { "@type": "ComputerLanguage", "name": "R", From 76ee23a463df65f837c99852f1e85034632aa23a Mon Sep 17 00:00:00 2001 From: mpadge Date: Mon, 29 Sep 2025 11:12:32 +0200 Subject: [PATCH 08/12] reduce cols of hws at end of 'reduce_osm_highways' fn --- DESCRIPTION | 2 +- R/osmdata-extract.R | 8 +++++++- codemeta.json | 2 +- 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index 5bac63e..545abc6 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,7 +1,7 @@ Package: superblock Type: Package Title: Analyses of potential superblock -Version: 0.1.0.098 +Version: 0.1.0.099 Authors@R: person(given = "Mark", family = "Padgham", diff --git a/R/osmdata-extract.R b/R/osmdata-extract.R index 1fb1edb..37870ff 100644 --- a/R/osmdata-extract.R +++ b/R/osmdata-extract.R @@ -105,7 +105,13 @@ reduce_osm_highways <- function (hws, hw_names) { ) index <- which (hws$highway %in% c ("residential", "secondary", "tertiary")) hws_internal <- hws [index, ] - hws_internal [which (!hws_internal$name %in% hw_names), ] + hws <- hws_internal [which (!hws_internal$name %in% hw_names), ] + + # Then reduce cols again to only those with data: + index <- vapply (names (hws), function (n) any (!is.na (hws [[n]])), logical (1L)) + hws <- hws [, index] + + return (hws) } extract_osm_buildings <- function (bbox, bounding_poly) { diff --git a/codemeta.json b/codemeta.json index 43bd324..68dfe78 100644 --- a/codemeta.json +++ b/codemeta.json @@ -7,7 +7,7 @@ "codeRepository": "https://github.com/UrbanAnalyst/superblock-ms", "issueTracker": "https://github.com/UrbanAnalyst/superblock-ms/issues", "license": "https://spdx.org/licenses/GPL-3.0", - "version": "0.1.0.098", + "version": "0.1.0.099", "programmingLanguage": { "@type": "ComputerLanguage", "name": "R", From cf4cbc924f062d8d9619423da868efa308303d05 Mon Sep 17 00:00:00 2001 From: mpadge Date: Mon, 29 Sep 2025 11:22:30 +0200 Subject: [PATCH 09/12] fix estimation of nr parking spaces - use length, not depth --- DESCRIPTION | 2 +- R/parking-areas.R | 15 ++++++++------- codemeta.json | 2 +- 3 files changed, 10 insertions(+), 9 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index 545abc6..954c947 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,7 +1,7 @@ Package: superblock Type: Package Title: Analyses of potential superblock -Version: 0.1.0.099 +Version: 0.1.0.100 Authors@R: person(given = "Mark", family = "Padgham", diff --git a/R/parking-areas.R b/R/parking-areas.R index 198bb4e..cd4dcd6 100644 --- a/R/parking-areas.R +++ b/R/parking-areas.R @@ -50,15 +50,16 @@ parking_structure <- function (hws) { }) conditions <- do.call (cbind, conditions) - parking_space <- rep (0, nrow (parking)) + parking_depth <- parking_length <- rep (0, nrow (parking)) for (i in 2:4) { - parking_space [which (conditions [, i])] <- depths [i - 1L] + parking_depth [which (conditions [, i])] <- depths [i - 1L] + parking_length [which (conditions [, i])] <- lengths [i - 1L] } # And set any "no" or "false" flags to no parking space: parking_prohibited <- conditions [, 1] - return (cbind (parking_space, parking_prohibited)) + return (cbind (parking_depth, parking_length, parking_prohibited)) } dirs <- c ("left", "right", "both") @@ -73,10 +74,10 @@ parking_structure <- function (hws) { hws$parking_prohibited [parking_prohibited [[2]]] <- "right" hws$parking_prohibited [parking_prohibited [[3]]] <- "both" - parking_sides <- parking [[1]] [, 1] + parking [[2]] [, 1] + parking_sides <- parking [[1]] [, 1] + parking [[2]] [, 1] # [, 1] == depth parking_both <- parking [[3]] [, 1] * 2 - parking_space <- apply (cbind (parking_sides, parking_both), 1, max) - hws$parking_area <- sf::st_length (hws) * units::set_units (parking_space, "m") + parking_depth <- apply (cbind (parking_sides, parking_both), 1, max) + hws$parking_area <- sf::st_length (hws) * units::set_units (parking_depth, "m") # Add details of parking on each side: hws$parking_left <- hws$parking_right <- NA_character_ @@ -95,7 +96,7 @@ parking_structure <- function (hws) { res <- lapply ( parking, function (p) { - index <- which (p [, 1] > 0 & p [, 1] %% l == 0) + index <- which (p [, 2] > 0 & p [, 2] %% l == 0) # [, 2] == length index_ids <- match (names (index), hws$osm_id) n <- floor (hw_lens [index_ids] / l) cbind (n, names (index)) diff --git a/codemeta.json b/codemeta.json index 68dfe78..d98a4fc 100644 --- a/codemeta.json +++ b/codemeta.json @@ -7,7 +7,7 @@ "codeRepository": "https://github.com/UrbanAnalyst/superblock-ms", "issueTracker": "https://github.com/UrbanAnalyst/superblock-ms/issues", "license": "https://spdx.org/licenses/GPL-3.0", - "version": "0.1.0.099", + "version": "0.1.0.100", "programmingLanguage": { "@type": "ComputerLanguage", "name": "R", From 650e522bb5eb6800ea37c1f4c09b46614525f06f Mon Sep 17 00:00:00 2001 From: mpadge Date: Mon, 29 Sep 2025 11:48:29 +0200 Subject: [PATCH 10/12] improve numeric estimation of parking / population --- DESCRIPTION | 2 +- R/population-estimate.R | 38 +++++++++++++++++++++++++------------- codemeta.json | 2 +- 3 files changed, 27 insertions(+), 15 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index 954c947..01658b4 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,7 +1,7 @@ Package: superblock Type: Package Title: Analyses of potential superblock -Version: 0.1.0.100 +Version: 0.1.0.101 Authors@R: person(given = "Mark", family = "Padgham", diff --git a/R/population-estimate.R b/R/population-estimate.R index 98ec9ab..008d1a6 100644 --- a/R/population-estimate.R +++ b/R/population-estimate.R @@ -9,33 +9,45 @@ area_per_resident <- function (osmdat) { num_residents_roof <- 2.5 area <- 181 # m2 - num_levels <- as.numeric (b$`building:levels` [i]) - num_roof_levels <- as.numeric (b$`roof:levels` [i]) - num_roof_levels <- ifelse (is.na (num_roof_levels), 0, num_roof_levels) + b <- filter_residential_buildings (osmdat$buildings) + num_levels <- as.numeric (b$`building:levels`) + num_roof_levels <- as.numeric (b$`roof:levels`) + + # Replace missing values with averages: + num_levels_mn <- mean (num_levels, na.rm = TRUE) + num_roof_levels_mn <- mean (num_roof_levels, na.rm = TRUE) + num_levels <- ifelse (is.na (num_levels), num_levels_mn, num_levels) + num_roof_levels <- ifelse (is.na (num_roof_levels), num_roof_levels_mn, num_roof_levels) + a_per_res_floors <- area * num_levels / num_residents_floors - a_per_res_floors <- 10 * floor (a_per_res_floors / 10) # This is artifically inflated, because roof areas are always smaller: a_per_res_roof <- area * num_roof_levels / num_residents_roof - a_per_res_roof <- 10 * floor (a_per_res_roof / 10) - c (floor = a_per_res_floors, roof = a_per_res_roof) + data.frame (osm_id = b$osm_id, floor = a_per_res_floors, roof = a_per_res_roof) } -building_areas <- function (osmdat) { +exclude_ground_floor <- c ("civic", "office", "retail", "supermarket") + +filter_residential_buildings <- function (b) { exclude <- c ("carport", "garage", "garages", "school", "shed", "yes") - b <- osmdat$buildings |> - dplyr::filter (!building %in% exclude) |> + b <- dplyr::filter (b, !building %in% exclude) |> dplyr::filter (!is.na (`addr:street`) & !is.na (`addr:housenumber`)) - exclude_ground_floor <- c ("civic", "office", "retail", "supermarket") num_levels <- as.numeric (b$`building:levels`) index <- which (b$building %in% exclude_ground_floor & num_levels == 1) if (length (index > 0)) { b <- b [-index, ] - num_levels <- as.numeric (b$`building:levels`) - index <- which (b$building %in% exclude_ground_floor) } + return (b) +} + +building_areas <- function (osmdat) { + + b <- filter_residential_buildings (osmdat$buildings) + + num_levels <- as.numeric (b$`building:levels`) + index <- which (b$building %in% exclude_ground_floor) num_levels [index] <- num_levels [index] - 1 num_roof_levels <- as.numeric (b$`roof:levels`) @@ -47,5 +59,5 @@ building_areas <- function (osmdat) { area_levels <- areas * num_levels area_roofs <- areas * num_roof_levels - c (floor = sum (area_levels), roof = sum (area_roofs)) + data.frame (osm_id = b$osm_id, floor = area_levels, roof = area_roofs) } diff --git a/codemeta.json b/codemeta.json index d98a4fc..54adf0a 100644 --- a/codemeta.json +++ b/codemeta.json @@ -7,7 +7,7 @@ "codeRepository": "https://github.com/UrbanAnalyst/superblock-ms", "issueTracker": "https://github.com/UrbanAnalyst/superblock-ms/issues", "license": "https://spdx.org/licenses/GPL-3.0", - "version": "0.1.0.100", + "version": "0.1.0.101", "programmingLanguage": { "@type": "ComputerLanguage", "name": "R", From 041b9d78d806e8e778077b0a0d2ea0b0bafb4a7c Mon Sep 17 00:00:00 2001 From: mpadge Date: Mon, 29 Sep 2025 11:53:45 +0200 Subject: [PATCH 11/12] suppress no vis binding notes --- DESCRIPTION | 2 +- R/osmdata-extract.R | 2 +- R/population-estimate.R | 2 ++ codemeta.json | 2 +- 4 files changed, 5 insertions(+), 3 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index 01658b4..480bf85 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,7 +1,7 @@ Package: superblock Type: Package Title: Analyses of potential superblock -Version: 0.1.0.101 +Version: 0.1.0.102 Authors@R: person(given = "Mark", family = "Padgham", diff --git a/R/osmdata-extract.R b/R/osmdata-extract.R index 37870ff..1066ab0 100644 --- a/R/osmdata-extract.R +++ b/R/osmdata-extract.R @@ -209,7 +209,7 @@ extract_osm_parking_facilities <- function (bbox) { extract_osm_nodes <- function (bbox) { - amenity <- natural <- NULL + amenity <- natural <- osm_id <- NULL dat <- osmdata::opq (bbox) |> osmdata::add_osm_features (list ( diff --git a/R/population-estimate.R b/R/population-estimate.R index 008d1a6..0d7b20b 100644 --- a/R/population-estimate.R +++ b/R/population-estimate.R @@ -30,6 +30,8 @@ exclude_ground_floor <- c ("civic", "office", "retail", "supermarket") filter_residential_buildings <- function (b) { + `addr:street` <- `addr:housenumber` <- NULL + exclude <- c ("carport", "garage", "garages", "school", "shed", "yes") b <- dplyr::filter (b, !building %in% exclude) |> dplyr::filter (!is.na (`addr:street`) & !is.na (`addr:housenumber`)) diff --git a/codemeta.json b/codemeta.json index 54adf0a..d2811c4 100644 --- a/codemeta.json +++ b/codemeta.json @@ -7,7 +7,7 @@ "codeRepository": "https://github.com/UrbanAnalyst/superblock-ms", "issueTracker": "https://github.com/UrbanAnalyst/superblock-ms/issues", "license": "https://spdx.org/licenses/GPL-3.0", - "version": "0.1.0.101", + "version": "0.1.0.102", "programmingLanguage": { "@type": "ComputerLanguage", "name": "R", From 182cc7e341052fca5dc4cf6c0a1f1ef2d6221a53 Mon Sep 17 00:00:00 2001 From: mpadge Date: Mon, 29 Sep 2025 12:02:02 +0200 Subject: [PATCH 12/12] export 'sb_car_spaces_per_resident' fn for #9 --- DESCRIPTION | 2 +- NAMESPACE | 1 + R/population-estimate.R | 24 ++++++++++++++++++++++++ R/summary.R | 1 + codemeta.json | 4 ++-- man/sb_car_spaces_per_resident.Rd | 17 +++++++++++++++++ 6 files changed, 46 insertions(+), 3 deletions(-) create mode 100644 man/sb_car_spaces_per_resident.Rd diff --git a/DESCRIPTION b/DESCRIPTION index 480bf85..9590405 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,7 +1,7 @@ Package: superblock Type: Package Title: Analyses of potential superblock -Version: 0.1.0.102 +Version: 0.1.0.103 Authors@R: person(given = "Mark", family = "Padgham", diff --git a/NAMESPACE b/NAMESPACE index 8626fa9..0f8e4d2 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -6,6 +6,7 @@ export(get_bbox) export(hws_to_polygons) export(no_building_floors) export(no_parking_ways) +export(sb_car_spaces_per_resident) export(sb_osmdata_extract) export(sb_parking_times) export(sb_summary) diff --git a/R/population-estimate.R b/R/population-estimate.R index 0d7b20b..d8578ba 100644 --- a/R/population-estimate.R +++ b/R/population-estimate.R @@ -1,3 +1,27 @@ +#' Estimate number of car spaces per resident +#' +#' @param osmdat Object returned from \link{sb_osmdata_extract}. +#' @return An estimate of numbers of parking spaces per resident. +#' @export +sb_car_spaces_per_resident <- function (osmdat) { + + a_per_res <- area_per_resident (osmdat) + a_per_res_floor <- 10 * floor (mean (a_per_res$floor) / 10) + a_per_res_roof <- 10 * floor (mean (a_per_res$roof) / 10) + + a_building <- building_areas (osmdat) + area_floor <- sum (a_building$floor) + area_roof <- sum (a_building$roof) + + num_res_floor <- as.numeric (area_floor) / a_per_res_floor + num_res_roof <- as.numeric (area_roof) / a_per_res_roof + num_res <- num_res_floor + num_res_roof + + p <- car_parking_areas (osmdat) + num_parking_spaces <- sum (p$num_parking_spaces) + num_parking_spaces / num_res +} + #' Estimate floor and roof area per resident. #' #' Uses example building with known numbers of residents, and which is typical diff --git a/R/summary.R b/R/summary.R index e5987b9..9888964 100644 --- a/R/summary.R +++ b/R/summary.R @@ -7,6 +7,7 @@ #' average values from all other ways which do have parking specified. #' @export sb_summary <- function (osmdat, hw_polygons = NULL, add_parking_osm_ids = NULL) { + if (is.null (hw_polygons)) { hw_polygons <- hws_to_polygons (osmdat) } diff --git a/codemeta.json b/codemeta.json index d2811c4..186a7fe 100644 --- a/codemeta.json +++ b/codemeta.json @@ -7,7 +7,7 @@ "codeRepository": "https://github.com/UrbanAnalyst/superblock-ms", "issueTracker": "https://github.com/UrbanAnalyst/superblock-ms/issues", "license": "https://spdx.org/licenses/GPL-3.0", - "version": "0.1.0.102", + "version": "0.1.0.103", "programmingLanguage": { "@type": "ComputerLanguage", "name": "R", @@ -259,7 +259,7 @@ }, "SystemRequirements": {} }, - "fileSize": "4389.635KB", + "fileSize": "4436.035KB", "contIntegration": [ "https://github.com/UrbanAnalyst/superblock/actions/workflows/R-CMD-check.yaml", "https://app.codecov.io/gh/UrbanAnalyst/superblock" diff --git a/man/sb_car_spaces_per_resident.Rd b/man/sb_car_spaces_per_resident.Rd new file mode 100644 index 0000000..f6c4a2d --- /dev/null +++ b/man/sb_car_spaces_per_resident.Rd @@ -0,0 +1,17 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/population-estimate.R +\name{sb_car_spaces_per_resident} +\alias{sb_car_spaces_per_resident} +\title{Estimate number of car spaces per resident} +\usage{ +sb_car_spaces_per_resident(osmdat) +} +\arguments{ +\item{osmdat}{Object returned from \link{sb_osmdata_extract}.} +} +\value{ +An estimate of numbers of parking spaces per resident. +} +\description{ +Estimate number of car spaces per resident +}