library(tidyverse)
library(broom)
library(plotly)
library(tidycensus)      # gets census data that we can use to create maps
library(sf)              # helper package for mapping
library(leaflet)         # interactive mapping package
library(trendyy)
library(usdata)          # this package has a conversion utility for state abbreviations to full names
census_api_key("edfe7dfb752b23fea5d7a7205c084760fa0f0707")
To install your API key for use in future sessions, run this function with `install = TRUE`.
  1. Pick one of these and create a choropleth map with leaflet.
states_leaflet <- get_acs(geography = "state",       # gets state by state data
                  variables = "B19013_001",          # this is state income
                  geometry = TRUE)                   # gets geometry (the maps)
Getting data from the 2015-2019 5-year ACS
Downloading feature geometry from the Census website.  To cache shapefiles for use in future sessions, set `options(tigris_use_cache = TRUE)`.
                  # shift_geo = T                    # shifts Hawaii and Alaska
states_leaflet %>% 
  leaflet() %>% 
  addTiles() %>%
  addPolygons()
sf layer has inconsistent datum (+proj=longlat +datum=NAD83 +no_defs).
Need '+proj=longlat +datum=WGS84'

Here is a choropleth map using leaflet.

  1. Choose a google search term or phrase that is relevant to your chosen CDC data, and create a choropleth of that as well.
drinking <- read_csv("Binge_drinking_percent.csv")

── Column specification ─────────────────────────────────────────────────────────────────────────────────────
cols(
  State = col_character(),
  Percentage = col_double()
)

states_leaflet <- get_acs(geography = "state",               # gets state by state data
                  variables = "B01003_001",          # this is state population
                  geometry = TRUE,                   # gets geometry (the maps)
                  shift_geo = T)                     # shifts Hawaii and Alaska
Getting data from the 2015-2019 5-year ACS
Using feature geometry obtained from the albersusa package
Please note: Alaska and Hawaii are being shifted and are not to scale.
alcohol <- trendy("alcohol", 
                   geo = "US", 
                   from = "2019-01-01", to = "2020-01-01")


alcohol_states <- alcohol %>%
  get_interest_region()

alcohol_states
NA
states %>% 
  rename(location = NAME) %>% 
  inner_join(alcohol_states)
Joining, by = "location"
Simple feature collection with 51 features and 9 fields
Geometry type: MULTIPOLYGON
Dimension:     XY
Bounding box:  xmin: -2100000 ymin: -2500000 xmax: 2516374 ymax: 732103.3
CRS:           +proj=laea +lat_0=45 +lon_0=-100 +x_0=0 +y_0=0 +a=6370997 +b=6370997 +units=m +no_defs
First 10 features:
   GEOID             location   variable estimate moe hits keyword geo gprop                       geometry
1     04              Arizona B01003_001  7050299  NA   83 alcohol  US   web MULTIPOLYGON (((-1111066 -8...
2     05             Arkansas B01003_001  2999370  NA   79 alcohol  US   web MULTIPOLYGON (((557903.1 -1...
3     06           California B01003_001 39283497  NA   80 alcohol  US   web MULTIPOLYGON (((-1853480 -9...
4     08             Colorado B01003_001  5610349  NA   88 alcohol  US   web MULTIPOLYGON (((-613452.9 -...
5     09          Connecticut B01003_001  3575074  NA   84 alcohol  US   web MULTIPOLYGON (((2226838 519...
6     11 District of Columbia B01003_001   692683  NA   74 alcohol  US   web MULTIPOLYGON (((1960720 -41...
7     13              Georgia B01003_001 10403847  NA   77 alcohol  US   web MULTIPOLYGON (((1379893 -98...
8     17             Illinois B01003_001 12770631  NA   81 alcohol  US   web MULTIPOLYGON (((868942.5 -2...
9     18              Indiana B01003_001  6665703  NA   92 alcohol  US   web MULTIPOLYGON (((1279733 -39...
10    22            Louisiana B01003_001  4664362  NA   77 alcohol  US   web MULTIPOLYGON (((1080885 -16...
alcohol_states %>% 
  mutate(State = state2abbr(location)) %>% 
  inner_join(drinking)
Joining, by = "State"
alcohol_data <- alcohol_states %>% 
  mutate(State = state2abbr(location)) %>% 
  inner_join(drinking)
Joining, by = "State"

alcohol_colors <- colorNumeric(palette = "viridis", domain = alcohol_data$Percentage)

states_leaflet %>% 
  leaflet() %>% 
  addTiles() %>%
  addPolygons(weight = 1,
              fillColor = ~state_colors(estimate), 
              label = ~paste0(NAME, ", income = ", estimate),           
              highlight = highlightOptions(weight = 2)) %>% 
  setView(-95, 40, zoom = 4) %>% 
  addLegend(pal = state_colors, values = ~estimate)
sf layer has inconsistent datum (+proj=longlat +datum=NAD83 +no_defs).
Need '+proj=longlat +datum=WGS84'

Here is my map using the term “alcohol”.

  1. Do a linear model relating the CDC data to the good search term, and create a plotly scatterplot of the relationship.
alcohol_model <- lm(Percentage ~ hits, data = alcohol_data)

glance(alcohol_model)
tidy(alcohol_model)
alcohol_data %>% 
  drop_na() %>% 
  plot_ly(x = ~hits, 
          y = ~Percentage,
          hoverinfo = "text", 
          text = ~paste("State: ", location, "<br>", "'alcohol' search rate: ", hits, "<br>", "Binge Drinking Percentage: ", Percentage)) %>% 
  add_markers(showlegend = F) %>% 
  add_lines(y = ~fitted(alcohol_model)) %>% 
  layout(title = "Relationship between google searches for 'alcohol' and binge drinking percentage, by state",
   xaxis = list(title = "Google search volume for 'alcohol'"),
   yaxis = list(title = "State binge drinking percentage, per capita"))
NA
NA

This is a plotly scatterplot of the relationship between searches in “alcohol” and binge drinking percentage per state.

  1. Choose a second google search term or phrase that is relevant to your chosen CDC data and create a choropleth map.
beer <- trendy("beer", 
                   geo = "US", 
                   from = "2019-01-01", to = "2020-01-01")


beer_states <- beer %>%
  get_interest_region()

beer_states
NA
states %>% 
  rename(location = NAME) %>% 
  inner_join(beer_states)
Joining, by = "location"
Simple feature collection with 51 features and 9 fields
Geometry type: MULTIPOLYGON
Dimension:     XY
Bounding box:  xmin: -2100000 ymin: -2500000 xmax: 2516374 ymax: 732103.3
CRS:           +proj=laea +lat_0=45 +lon_0=-100 +x_0=0 +y_0=0 +a=6370997 +b=6370997 +units=m +no_defs
First 10 features:
   GEOID             location   variable estimate moe hits keyword geo gprop                       geometry
1     04              Arizona B01003_001  7050299  NA   61    beer  US   web MULTIPOLYGON (((-1111066 -8...
2     05             Arkansas B01003_001  2999370  NA   48    beer  US   web MULTIPOLYGON (((557903.1 -1...
3     06           California B01003_001 39283497  NA   60    beer  US   web MULTIPOLYGON (((-1853480 -9...
4     08             Colorado B01003_001  5610349  NA   78    beer  US   web MULTIPOLYGON (((-613452.9 -...
5     09          Connecticut B01003_001  3575074  NA   60    beer  US   web MULTIPOLYGON (((2226838 519...
6     11 District of Columbia B01003_001   692683  NA   63    beer  US   web MULTIPOLYGON (((1960720 -41...
7     13              Georgia B01003_001 10403847  NA   50    beer  US   web MULTIPOLYGON (((1379893 -98...
8     17             Illinois B01003_001 12770631  NA   65    beer  US   web MULTIPOLYGON (((868942.5 -2...
9     18              Indiana B01003_001  6665703  NA   56    beer  US   web MULTIPOLYGON (((1279733 -39...
10    22            Louisiana B01003_001  4664362  NA   48    beer  US   web MULTIPOLYGON (((1080885 -16...
beer_states %>% 
  mutate(State = state2abbr(location)) %>% 
  inner_join(drinking)
Joining, by = "State"
beer_data <- beer_states %>% 
  mutate(State = state2abbr(location)) %>% 
  inner_join(drinking)
Joining, by = "State"

 beer_colors <- colorNumeric(palette = "viridis", domain = beer_data$hits)

states_leaflet %>% 
  leaflet() %>% 
  addTiles() %>%
  addPolygons(weight = 1,
              fillColor = ~beer_colors(estimate), 
              label = ~paste0(NAME, ", income = ", estimate),           
              highlight = highlightOptions(weight = 2)) %>% 
  setView(-95, 40, zoom = 4) %>% 
  addLegend(pal = beer_colors, values = ~estimate)
sf layer has inconsistent datum (+proj=longlat +datum=NAD83 +no_defs).
Need '+proj=longlat +datum=WGS84'Some values were outside the color scale and will be treated as NASome values were outside the color scale and will be treated as NA

This is a choropleth map now using the word beer.

  1. Do the linear model and plotly graph between your second term and the CDC data.
beer_model <- lm(Percentage ~ hits, data = beer_data)

glance(beer_model)
tidy(beer_model)
beer_data %>% 
  drop_na() %>% 
  plot_ly(x = ~hits, 
          y = ~Percentage,
          hoverinfo = "text", 
          text = ~paste("State: ", location, "<br>", "'beer' search rate: ", hits, "<br>", "Binge Drinking Percentage: ", Percentage)) %>% 
  add_markers(showlegend = F) %>% 
  add_lines(y = ~fitted(naloxone_model)) %>% 
  layout(title = "Relationship between google searches for 'beer' and binge drinking percentage, by state",
   xaxis = list(title = "Google search volume for 'beer'"),
   yaxis = list(title = "State binge drinking percentage, per capita"))
NA
NA

This is a linear model and plotly graph between the term “beer” and the CDC data.

LS0tCnRpdGxlOiAiUiBOb3RlYm9vayIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKYGBge3J9CmxpYnJhcnkodGlkeXZlcnNlKQpsaWJyYXJ5KGJyb29tKQpsaWJyYXJ5KHBsb3RseSkKbGlicmFyeSh0aWR5Y2Vuc3VzKSAgICAgICMgZ2V0cyBjZW5zdXMgZGF0YSB0aGF0IHdlIGNhbiB1c2UgdG8gY3JlYXRlIG1hcHMKbGlicmFyeShzZikgICAgICAgICAgICAgICMgaGVscGVyIHBhY2thZ2UgZm9yIG1hcHBpbmcKbGlicmFyeShsZWFmbGV0KSAgICAgICAgICMgaW50ZXJhY3RpdmUgbWFwcGluZyBwYWNrYWdlCmxpYnJhcnkodHJlbmR5eSkKbGlicmFyeSh1c2RhdGEpICAgICAgICAgICMgdGhpcyBwYWNrYWdlIGhhcyBhIGNvbnZlcnNpb24gdXRpbGl0eSBmb3Igc3RhdGUgYWJicmV2aWF0aW9ucyB0byBmdWxsIG5hbWVzCmBgYAoKYGBge3J9CmNlbnN1c19hcGlfa2V5KCJlZGZlN2RmYjc1MmIyM2ZlYTVkN2E3MjA1YzA4NDc2MGZhMGYwNzA3IikKYGBgCgoxLiBQaWNrIG9uZSBvZiB0aGVzZSBhbmQgY3JlYXRlIGEgY2hvcm9wbGV0aCBtYXAgd2l0aCBsZWFmbGV0LgoKYGBge3J9CnN0YXRlc19sZWFmbGV0IDwtIGdldF9hY3MoZ2VvZ3JhcGh5ID0gInN0YXRlIiwgICAgICAgIyBnZXRzIHN0YXRlIGJ5IHN0YXRlIGRhdGEKICAgICAgICAgICAgICAgICAgdmFyaWFibGVzID0gIkIxOTAxM18wMDEiLCAgICAgICAgICAjIHRoaXMgaXMgc3RhdGUgaW5jb21lCiAgICAgICAgICAgICAgICAgIGdlb21ldHJ5ID0gVFJVRSkgICAgICAgICAgICAgICAgICAgIyBnZXRzIGdlb21ldHJ5ICh0aGUgbWFwcykKICAgICAgICAgICAgICAgICAgIyBzaGlmdF9nZW8gPSBUICAgICAgICAgICAgICAgICAgICAjIHNoaWZ0cyBIYXdhaWkgYW5kIEFsYXNrYQoKYGBgCgpgYGB7cn0Kc3RhdGVzX2xlYWZsZXQgJT4lIAogIGxlYWZsZXQoKSAlPiUgCiAgYWRkVGlsZXMoKSAlPiUKICBhZGRQb2x5Z29ucygpCgpgYGAKCkhlcmUgaXMgYSBjaG9yb3BsZXRoIG1hcCB1c2luZyBsZWFmbGV0LiAKCgoKMi4gQ2hvb3NlIGEgZ29vZ2xlIHNlYXJjaCB0ZXJtIG9yIHBocmFzZSB0aGF0IGlzIHJlbGV2YW50IHRvIHlvdXIgY2hvc2VuIENEQyBkYXRhLCBhbmQgY3JlYXRlIGEgY2hvcm9wbGV0aCBvZiB0aGF0IGFzIHdlbGwuIAoKCmBgYHtyfQpkcmlua2luZyA8LSByZWFkX2NzdigiQmluZ2VfZHJpbmtpbmdfcGVyY2VudC5jc3YiKQoKYGBgCmBgYHtyfQoKc3RhdGVzX2xlYWZsZXQgPC0gZ2V0X2FjcyhnZW9ncmFwaHkgPSAic3RhdGUiLCAgICAgICAgICAgICAgICMgZ2V0cyBzdGF0ZSBieSBzdGF0ZSBkYXRhCiAgICAgICAgICAgICAgICAgIHZhcmlhYmxlcyA9ICJCMDEwMDNfMDAxIiwgICAgICAgICAgIyB0aGlzIGlzIHN0YXRlIHBvcHVsYXRpb24KICAgICAgICAgICAgICAgICAgZ2VvbWV0cnkgPSBUUlVFLCAgICAgICAgICAgICAgICAgICAjIGdldHMgZ2VvbWV0cnkgKHRoZSBtYXBzKQogICAgICAgICAgICAgICAgICBzaGlmdF9nZW8gPSBUKSAgICAgICAgICAgICAgICAgICAgICMgc2hpZnRzIEhhd2FpaSBhbmQgQWxhc2thCgpgYGAKCmBgYHtyfQphbGNvaG9sIDwtIHRyZW5keSgiYWxjb2hvbCIsIAogICAgICAgICAgICAgICAgICAgZ2VvID0gIlVTIiwgCiAgICAgICAgICAgICAgICAgICBmcm9tID0gIjIwMTktMDEtMDEiLCB0byA9ICIyMDIwLTAxLTAxIikKCgphbGNvaG9sX3N0YXRlcyA8LSBhbGNvaG9sICU+JQogIGdldF9pbnRlcmVzdF9yZWdpb24oKQoKYWxjb2hvbF9zdGF0ZXMKCmBgYAoKYGBge3J9CnN0YXRlcyAlPiUgCiAgcmVuYW1lKGxvY2F0aW9uID0gTkFNRSkgJT4lIAogIGlubmVyX2pvaW4oYWxjb2hvbF9zdGF0ZXMpCmBgYAoKYGBge3J9CmFsY29ob2xfc3RhdGVzICU+JSAKICBtdXRhdGUoU3RhdGUgPSBzdGF0ZTJhYmJyKGxvY2F0aW9uKSkgJT4lIAogIGlubmVyX2pvaW4oZHJpbmtpbmcpCmBgYAoKCmBgYHtyfQphbGNvaG9sX2RhdGEgPC0gYWxjb2hvbF9zdGF0ZXMgJT4lIAogIG11dGF0ZShTdGF0ZSA9IHN0YXRlMmFiYnIobG9jYXRpb24pKSAlPiUgCiAgaW5uZXJfam9pbihkcmlua2luZykKYGBgCgoKCmBgYHtyfQoKYWxjb2hvbF9jb2xvcnMgPC0gY29sb3JOdW1lcmljKHBhbGV0dGUgPSAidmlyaWRpcyIsIGRvbWFpbiA9IGFsY29ob2xfZGF0YSRQZXJjZW50YWdlKQoKc3RhdGVzX2xlYWZsZXQgJT4lIAogIGxlYWZsZXQoKSAlPiUgCiAgYWRkVGlsZXMoKSAlPiUKICBhZGRQb2x5Z29ucyh3ZWlnaHQgPSAxLAogICAgICAgICAgICAgIGZpbGxDb2xvciA9IH5zdGF0ZV9jb2xvcnMoZXN0aW1hdGUpLCAKICAgICAgICAgICAgICBsYWJlbCA9IH5wYXN0ZTAoTkFNRSwgIiwgaW5jb21lID0gIiwgZXN0aW1hdGUpLCAgICAgICAgICAgCiAgICAgICAgICAgICAgaGlnaGxpZ2h0ID0gaGlnaGxpZ2h0T3B0aW9ucyh3ZWlnaHQgPSAyKSkgJT4lIAogIHNldFZpZXcoLTk1LCA0MCwgem9vbSA9IDQpICU+JSAKICBhZGRMZWdlbmQocGFsID0gc3RhdGVfY29sb3JzLCB2YWx1ZXMgPSB+ZXN0aW1hdGUpCmBgYAoKSGVyZSBpcyBteSBtYXAgdXNpbmcgdGhlIHRlcm0gImFsY29ob2wiLiAKCgoKCjMuIERvIGEgbGluZWFyIG1vZGVsIHJlbGF0aW5nIHRoZSBDREMgZGF0YSB0byB0aGUgZ29vZCBzZWFyY2ggdGVybSwgYW5kIGNyZWF0ZSBhIHBsb3RseSBzY2F0dGVycGxvdCBvZiB0aGUgcmVsYXRpb25zaGlwLgoKYGBge3J9CmFsY29ob2xfbW9kZWwgPC0gbG0oUGVyY2VudGFnZSB+IGhpdHMsIGRhdGEgPSBhbGNvaG9sX2RhdGEpCgpnbGFuY2UoYWxjb2hvbF9tb2RlbCkKdGlkeShhbGNvaG9sX21vZGVsKQpgYGAKCmBgYHtyfQphbGNvaG9sX2RhdGEgJT4lIAogIGRyb3BfbmEoKSAlPiUgCiAgcGxvdF9seSh4ID0gfmhpdHMsIAogICAgICAgICAgeSA9IH5QZXJjZW50YWdlLAogICAgICAgICAgaG92ZXJpbmZvID0gInRleHQiLCAKICAgICAgICAgIHRleHQgPSB+cGFzdGUoIlN0YXRlOiAiLCBsb2NhdGlvbiwgIjxicj4iLCAiJ2FsY29ob2wnIHNlYXJjaCByYXRlOiAiLCBoaXRzLCAiPGJyPiIsICJCaW5nZSBEcmlua2luZyBQZXJjZW50YWdlOiAiLCBQZXJjZW50YWdlKSkgJT4lIAogIGFkZF9tYXJrZXJzKHNob3dsZWdlbmQgPSBGKSAlPiUgCiAgYWRkX2xpbmVzKHkgPSB+Zml0dGVkKGFsY29ob2xfbW9kZWwpKSAlPiUgCiAgbGF5b3V0KHRpdGxlID0gIlJlbGF0aW9uc2hpcCBiZXR3ZWVuIGdvb2dsZSBzZWFyY2hlcyBmb3IgJ2FsY29ob2wnIGFuZCBiaW5nZSBkcmlua2luZyBwZXJjZW50YWdlLCBieSBzdGF0ZSIsCiAgIHhheGlzID0gbGlzdCh0aXRsZSA9ICJHb29nbGUgc2VhcmNoIHZvbHVtZSBmb3IgJ2FsY29ob2wnIiksCiAgIHlheGlzID0gbGlzdCh0aXRsZSA9ICJTdGF0ZSBiaW5nZSBkcmlua2luZyBwZXJjZW50YWdlLCBwZXIgY2FwaXRhIikpCgoKYGBgCgpUaGlzIGlzIGEgcGxvdGx5IHNjYXR0ZXJwbG90IG9mIHRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiBzZWFyY2hlcyBpbiAiYWxjb2hvbCIgYW5kIGJpbmdlIGRyaW5raW5nIHBlcmNlbnRhZ2UgcGVyIHN0YXRlLiAKCgoKCjQuIENob29zZSBhIHNlY29uZCBnb29nbGUgc2VhcmNoIHRlcm0gb3IgcGhyYXNlIHRoYXQgaXMgcmVsZXZhbnQgdG8geW91ciBjaG9zZW4gQ0RDIGRhdGEgYW5kIGNyZWF0ZSBhIGNob3JvcGxldGggbWFwLgoKYGBge3J9CmJlZXIgPC0gdHJlbmR5KCJiZWVyIiwgCiAgICAgICAgICAgICAgICAgICBnZW8gPSAiVVMiLCAKICAgICAgICAgICAgICAgICAgIGZyb20gPSAiMjAxOS0wMS0wMSIsIHRvID0gIjIwMjAtMDEtMDEiKQoKCmJlZXJfc3RhdGVzIDwtIGJlZXIgJT4lCiAgZ2V0X2ludGVyZXN0X3JlZ2lvbigpCgpiZWVyX3N0YXRlcwoKYGBgCgpgYGB7cn0Kc3RhdGVzICU+JSAKICByZW5hbWUobG9jYXRpb24gPSBOQU1FKSAlPiUgCiAgaW5uZXJfam9pbihiZWVyX3N0YXRlcykKYGBgCgpgYGB7cn0KYmVlcl9zdGF0ZXMgJT4lIAogIG11dGF0ZShTdGF0ZSA9IHN0YXRlMmFiYnIobG9jYXRpb24pKSAlPiUgCiAgaW5uZXJfam9pbihkcmlua2luZykKYGBgCgoKYGBge3J9CmJlZXJfZGF0YSA8LSBiZWVyX3N0YXRlcyAlPiUgCiAgbXV0YXRlKFN0YXRlID0gc3RhdGUyYWJicihsb2NhdGlvbikpICU+JSAKICBpbm5lcl9qb2luKGRyaW5raW5nKQpgYGAKCgoKYGBge3J9CgogYmVlcl9jb2xvcnMgPC0gY29sb3JOdW1lcmljKHBhbGV0dGUgPSAidmlyaWRpcyIsIGRvbWFpbiA9IGJlZXJfZGF0YSRoaXRzKQoKc3RhdGVzX2xlYWZsZXQgJT4lIAogIGxlYWZsZXQoKSAlPiUgCiAgYWRkVGlsZXMoKSAlPiUKICBhZGRQb2x5Z29ucyh3ZWlnaHQgPSAxLAogICAgICAgICAgICAgIGZpbGxDb2xvciA9IH5iZWVyX2NvbG9ycyhlc3RpbWF0ZSksIAogICAgICAgICAgICAgIGxhYmVsID0gfnBhc3RlMChOQU1FLCAiLCBpbmNvbWUgPSAiLCBlc3RpbWF0ZSksICAgICAgICAgICAKICAgICAgICAgICAgICBoaWdobGlnaHQgPSBoaWdobGlnaHRPcHRpb25zKHdlaWdodCA9IDIpKSAlPiUgCiAgc2V0VmlldygtOTUsIDQwLCB6b29tID0gNCkgJT4lIAogIGFkZExlZ2VuZChwYWwgPSBiZWVyX2NvbG9ycywgdmFsdWVzID0gfmVzdGltYXRlKQpgYGAKClRoaXMgaXMgYSBjaG9yb3BsZXRoIG1hcCBub3cgdXNpbmcgdGhlIHdvcmQgYmVlci4KCgoKNS4gRG8gdGhlIGxpbmVhciBtb2RlbCBhbmQgcGxvdGx5IGdyYXBoIGJldHdlZW4geW91ciBzZWNvbmQgdGVybSBhbmQgdGhlIENEQyBkYXRhLgoKYGBge3J9CmJlZXJfbW9kZWwgPC0gbG0oUGVyY2VudGFnZSB+IGhpdHMsIGRhdGEgPSBiZWVyX2RhdGEpCgpnbGFuY2UoYmVlcl9tb2RlbCkKdGlkeShiZWVyX21vZGVsKQpgYGAKCmBgYHtyfQpiZWVyX2RhdGEgJT4lIAogIGRyb3BfbmEoKSAlPiUgCiAgcGxvdF9seSh4ID0gfmhpdHMsIAogICAgICAgICAgeSA9IH5QZXJjZW50YWdlLAogICAgICAgICAgaG92ZXJpbmZvID0gInRleHQiLCAKICAgICAgICAgIHRleHQgPSB+cGFzdGUoIlN0YXRlOiAiLCBsb2NhdGlvbiwgIjxicj4iLCAiJ2JlZXInIHNlYXJjaCByYXRlOiAiLCBoaXRzLCAiPGJyPiIsICJCaW5nZSBEcmlua2luZyBQZXJjZW50YWdlOiAiLCBQZXJjZW50YWdlKSkgJT4lIAogIGFkZF9tYXJrZXJzKHNob3dsZWdlbmQgPSBGKSAlPiUgCiAgYWRkX2xpbmVzKHkgPSB+Zml0dGVkKG5hbG94b25lX21vZGVsKSkgJT4lIAogIGxheW91dCh0aXRsZSA9ICJSZWxhdGlvbnNoaXAgYmV0d2VlbiBnb29nbGUgc2VhcmNoZXMgZm9yICdiZWVyJyBhbmQgYmluZ2UgZHJpbmtpbmcgcGVyY2VudGFnZSwgYnkgc3RhdGUiLAogICB4YXhpcyA9IGxpc3QodGl0bGUgPSAiR29vZ2xlIHNlYXJjaCB2b2x1bWUgZm9yICdiZWVyJyIpLAogICB5YXhpcyA9IGxpc3QodGl0bGUgPSAiU3RhdGUgYmluZ2UgZHJpbmtpbmcgcGVyY2VudGFnZSwgcGVyIGNhcGl0YSIpKQoKCmBgYAoKVGhpcyBpcyBhIGxpbmVhciBtb2RlbCBhbmQgcGxvdGx5IGdyYXBoIGJldHdlZW4gdGhlIHRlcm0gImJlZXIiIGFuZCB0aGUgQ0RDIGRhdGEuCgoKCgoKCgo=