1 Philly Shooting Data Reference Map

phillyNeighbor  <- st_read("https://pengdsci.github.io/STA553VIZ/w08/Neighborhoods_Philadelphia.geojson")
Reading layer `Neighborhoods_Philadelphia' from data source 
  `https://pengdsci.github.io/STA553VIZ/w08/Neighborhoods_Philadelphia.geojson' 
  using driver `GeoJSON'
Simple feature collection with 158 features and 8 fields
Geometry type: MULTIPOLYGON
Dimension:     XY
Bounding box:  xmin: -75.28027 ymin: 39.867 xmax: -74.95576 ymax: 40.13799
Geodetic CRS:  WGS 84
phillyNeighborShooting <- na.omit(st_read("https://pengdsci.github.io/STA553VIZ/w08/PhillyShootings.geojson"))
Reading layer `PhillyShootings' from data source 
  `https://pengdsci.github.io/STA553VIZ/w08/PhillyShootings.geojson' 
  using driver `GeoJSON'
replacing null geometries with empty geometries
Simple feature collection with 15555 features and 21 fields (with 29 geometries empty)
Geometry type: POINT
Dimension:     XY
Bounding box:  xmin: -75.27362 ymin: 39.87799 xmax: -74.95936 ymax: 40.13117
Geodetic CRS:  WGS 84
##map title
title <- tags$div(
   HTML('<img border="0" alt="ImageTitle" src="https://raw.githubusercontent.com/azheneghan/aheneghan/main/images/phillyShootTitle.png" width="200" height="45">')
 ) 

## color palette
pal <- colorFactor(c("#DC267F", "blue"), domain = c("1", "0"))

## Define objects with geo-coordinate system to plot specific information
pnt = st_as_sf(data.frame(x = -75.1256, y = 40.0063),
                coords = c("x", "y"),
                crs = 4326)
mortal = st_as_sf(data.frame(x = -75.3277, y = 39.9168),
                coords = c("x", "y"),
                crs = 4326)

## Images to be plot on the map
hospital = "https://raw.githubusercontent.com/azheneghan/aheneghan/main/images/phillyHospital.jpg"
fatalTrend = "https://raw.githubusercontent.com/azheneghan/aheneghan/main/images/TotalPhillyShootingsbyYear.png"

##################################################

leaflet() %>%
  setView(lng=-75.15092, lat=40.00995, zoom = 11) %>%
  addProviderTiles(providers$CartoDB.DarkMatter, group="Dark") %>%
  addProviderTiles(providers$CartoDB.DarkMatterNoLabels, group="DarkLabel") %>%  
  addProviderTiles(providers$Esri.NatGeoWorldMap, group="Esri") %>%
  addControl(title, position = "topleft", className="map-title") %>%
  ## mini reference map
  addMiniMap() %>%
  ## neighborhood boundary
  addPolygons(data = phillyNeighbor,
              color = 'skyblue',
              weight = 1)  %>%
  ## plot information on the map
  addCircleMarkers(data = phillyNeighborShooting,
                   radius = ~ifelse(fatal == "1", 5, 3),
                   color = ~pal(fatal),
                   stroke = FALSE, 
                   fillOpacity = 0.5,
                   popup = ~popupTable(phillyNeighborShooting),
                   clusterOptions = markerClusterOptions(maxClusterRadius = 40)) %>%
  # Adding the image of city hall
  addCircleMarkers(data = pnt, 
                   color = "blue",
                   weight = 2,
                   label = "St. Christopher's Hospital for Children",
                   stroke = FALSE, 
                   fillOpacity = 0.95,
                   group = "pnt") %>%
  addPopupImages(hospital, 
                  width = 100,
                  height = 120,
                  tooltip = FALSE,
                  group = "pnt")  %>%
  # Trend of crimes over the years
  addCircleMarkers(data = mortal, 
                   color = "purple",
                   weight = 2,
                   label = "Trend",
                   stroke = FALSE, 
                   fillOpacity = 0.95,
                   group = "mortal") %>%
  addPopupImages(fatalTrend, 
                  width = 500,
                  height = 350,
                  tooltip = FALSE,
                  group = "mortal") %>%
  addLayersControl(baseGroups = c('Dark', 'DarkLabel', 'Esri'),
                   overlayGroups = c("Crime Data"),
                   options = layersControlOptions(collapsed = TRUE)) %>%
  browsable()

There are appear to be less shootings on the outer regions of Philadelphia, and the numbers of shootings increase as you move closer to the center of Philadelphia. In observing the total amounts of shootings in Philadelphia over the years, it appears there is always more non-fatal shootings than fatal shootings, regardless of year. Amounts of shootings were pretty constant between 2015 and 2019 for fatal and non-fatal. The amount of shootings increased in 2020 for both types, especially for non-fatal shootings, because of the COVID-19 pandemic. The numbers of fatal and non-fatal shootings remained about as high as they were in 2020 for the following two years. Then in 2023, the amount of shootings for both types decrased again, especially for non-fatal shootings.

2 Presidential Election 2020 Results Choropleth Scatterplot Map

presidential <- read.csv(file = "https://raw.githubusercontent.com/azheneghan/aheneghan/main/datasets/countypresidential_election_2000-2020.csv")
geocode <- read.csv(file = "https://raw.githubusercontent.com/azheneghan/aheneghan/main/datasets/fips2geocode.csv")
###
presidential2 <- presidential %>%
  filter(year == 2020, party == "DEMOCRAT" | party == "REPUBLICAN") %>%
  dplyr::select(state_po, county_name, county_fips, party, candidatevotes)
###
election <- merge(x = presidential2, y = geocode, by.x = 'county_fips', by.y ='fips', all = FALSE)
election2020 <- election %>%
  dplyr::select(-county, -state)
#write.csv(x = election2020, file = "PresidentialElectionMergedData.csv", row.names = FALSE)
#election2020 <- read.csv(file = "https://raw.githubusercontent.com/azheneghan/aheneghan/main/datasets/PresidentialElectionMergedData.csv")
###
electR <- election2020 %>%
  filter(party == "REPUBLICAN") %>%
  dplyr::rename(RepublicanVotes = candidatevotes)
electD <- election2020 %>%
  filter(party == "DEMOCRAT") %>%
  dplyr::rename(DemocratVotes = candidatevotes)
electionNew <- merge(x = electR, y = electD, by.x = 'county_fips', by.y ='county_fips', all = FALSE)
electionNew2 <- electionNew %>%
  dplyr::select(-state_po.y, -rMapState.y, -rMapCounty.y, -lon.y, -lat.y, -county_name.y, -party.y, -party.x, -rMapState.x, -rMapCounty.x)
electionNew2$party <- ifelse(test=electionNew2$RepublicanVotes > electionNew2$DemocratVotes, yes="Republican", no=ifelse(test=electionNew2$RepublicanVotes < electionNew2$DemocratVotes, yes="Democrat", no="Neither"))
electionNew2$won <- ifelse(test=electionNew2$RepublicanVotes > electionNew2$DemocratVotes, yes=electionNew2$RepublicanVotes*1, no=ifelse(test=electionNew2$RepublicanVotes < electionNew2$DemocratVotes, yes=electionNew2$DemocratVotes*1, no=0))
#write.csv(x = electionNew2, file = "PresidentialElectionMergedData2.csv", row.names = FALSE)
#electionNew2 <- read.csv(file = "https://raw.githubusercontent.com/azheneghan/aheneghan/main/datasets/PresidentialElectionMergedData2.csv")
###
partyColor <- c("#DC267F", "blue", "gray")
partyColor <- setNames(partyColor, c("Republican", "Democrat", "Neither"))
###
plot_ly(
    data = electionNew2,
    x = ~lon.x, y = ~lat.x, color = ~factor(party), colors = partyColor,
        text = ~paste("County: ", county_name.x,
                   "<br>State: ", state_po.x,
                   "<br>Number of Votes: ", won),
     ## using the following hovertemplate() to add the information of the
     ## Two numerical variables to the hover text.
     hovertemplate = paste('<i><b>Latitude<b></i>: %{y}',
                           '<br><b>Longitude</b>: %{x}',
                           '<br><b>%{text}</b>'),
     alpha = 0.6,
     type = "scatter",
     mode = "markers",
     ## graphic size
     width = 700,
     height = 500
   ) %>%
    layout(  
      ### Title 
      title =list(text = "2020 Presidential Election Results by County", 
                  font = list(family = "Arial", 
                                size = 18,
                               color = "blue")), 
      ### legend
      legend = list(title = list(text = 'Political Party',
                                 font = list(family = "Courier New",
                                               size = 14,
                                              color = "black")),
                    bgcolor = "beige",
                    bordercolor = "navy",
                    groupclick = "togglegroup",
                    orientation = "v"
                    ),
      margin = list(
              b = 100,
              l = 100,
              t = 100,
              r = 50
      ),
      ## Background
      plot_bgcolor ='#f7f7f7', 
      ## Axes labels
            xaxis = list( 
                    title=list(text = 'Longitude',
                               font = list(family = 'Arial')),
                    zerolinecolor = 'white', 
                    zerolinewidth = 2, 
                    gridcolor = 'white'), 
            yaxis = list( 
                    title=list(text = 'Latitude',
                               font = list(family = 'Arial')),
                    zerolinecolor = 'white', 
                    zerolinewidth = 2, 
                    gridcolor = 'white',
                    range=c(25,50))
    )

There appear to be more counties in the states in the eastern half of the United States compared to the western half. This couid be because maybe not as many people live in the states in the western half due to living conditions or even weather, causing there to be not as many counties needed to divide them. The eastern half of the country holds more people, especially in the east coast and states like Iowa, Arkansas, and Oklahoma, requiring a larger number of counties. Given the official 2020 presidential election map that the Democrats won this presidential election, I am surprised that there are not as many Democratic counties as there are Republican. This could be due to lack of visibility on the scatteplot map since the eastern half counties are more comppressed. It is also perhaps possible that the Democratic counties were underrepresented in the 2020 data. The noetheastern and west coast cost counties mostly seem to favor Democrats, which is to be expected since those states ended up Democratic in the poll results.

LS0tDQp0aXRsZTogIlBoaWxseSBTaG9vdGluZyBEYXRhIGFuZCBQcmVzaWRlbnRpYWwgRGF0YSBJbnRlcmFjdGl2ZSBNYXBzIg0KYXV0aG9yOiAiQW5kcmV3IEhlbmVnaGFuIg0KZGF0ZTogIjMvMjcvMjAyNCINCm91dHB1dDoNCiAgaHRtbF9kb2N1bWVudDoNCiAgICB0b2M6IHllcw0KICAgIHRvY19mbG9hdDogeWVzDQogICAgbnVtYmVyX3NlY3Rpb25zOiB5ZXMNCiAgICB0b2NfY29sbGFwc2VkOiB5ZXMNCiAgICBjb2RlX2ZvbGRpbmc6IGhpZGUNCiAgICBjb2RlX2Rvd25sb2FkOiB5ZXMNCiAgICBzbW9vdGhfc2Nyb2xsOiB5ZXMNCiAgICB0aGVtZTogbHVtZW4NCiAgcGRmX2RvY3VtZW50Og0KICAgIHRvYzogeWVzDQplZGl0b3Jfb3B0aW9uczoNCiAgY2h1bmtfb3V0cHV0X3R5cGU6IGlubGluZQ0KLS0tDQoNCjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+DQoNCi8qIFRhYmxlIG9mIGNvbnRlbnQgLSBuYXZpZ2F0aW9uICovDQoNCmRpdiNUT0MgbGkgew0KICAgIGxpc3Qtc3R5bGU6bm9uZTsNCiAgICBiYWNrZ3JvdW5kLWNvbG9yOmxpZ2h0Z3JheTsNCiAgICBiYWNrZ3JvdW5kLWltYWdlOm5vbmU7DQogICAgYmFja2dyb3VuZC1yZXBlYXQ6bm9uZTsNCiAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOjA7DQogICAgZm9udC1mYW1pbHk6IEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7DQogICAgY29sb3I6ICM3ODBjMGM7DQp9DQoNCi8qIFRpdGxlIGZvbnRzICovDQoNCmgxLnRpdGxlIHsNCiAgZm9udC1zaXplOiAyNHB4Ow0KICBjb2xvcjogZGFya2JsdWU7DQogIHRleHQtYWxpZ246IGNlbnRlcjsNCiAgZm9udC1mYW1pbHk6IEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7DQogIGZvbnQtdmFyaWFudC1jYXBzOiBub3JtYWw7DQp9DQoNCmg0LmF1dGhvciB7DQogIGZvbnQtc2l6ZTogMThweDsNCiAgZm9udC1mYW1pbHk6IEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7DQogIGNvbG9yOiBuYXZ5Ow0KICB0ZXh0LWFsaWduOiBjZW50ZXI7DQp9DQoNCmg0LmRhdGUgew0KICBmb250LXNpemU6IDE4cHg7DQogIGZvbnQtZmFtaWx5OiBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOw0KICBjb2xvcjogZGFya2JsdWU7DQogIHRleHQtYWxpZ246IGNlbnRlcjsNCn0NCg0KLyogU2VjdGlvbiBoZWFkZXJzICovDQoNCmgxIHsNCiAgICBmb250LXNpemU6IDIycHg7DQogICAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7DQogICAgY29sb3I6IGRhcmtyZWQ7DQogICAgdGV4dC1hbGlnbjogbGVmdDsNCn0NCg0KaDIgew0KICAgIGZvbnQtc2l6ZTogMThweDsNCiAgICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsNCiAgICBjb2xvcjogbmF2eTsNCiAgICB0ZXh0LWFsaWduOiBsZWZ0Ow0KfQ0KDQpoMyB7DQogICAgZm9udC1zaXplOiAxNXB4Ow0KICAgIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOw0KICAgIGNvbG9yOiBkYXJrcmVkOw0KICAgIHRleHQtYWxpZ246IGxlZnQ7DQp9DQoNCmg0IHsNCiAgICBmb250LXNpemU6IDE4cHg7DQogICAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7DQogICAgY29sb3I6IGRhcmtyZWQ7DQogICAgdGV4dC1hbGlnbjogbGVmdDsNCn0NCg0KLyogRGVjb3JhdGlvbiBvZiBoeXBlcmxpbmtzICAqLw0KDQovKiB1bnZpc2l0ZWQgbGluayAqLw0KYTpsaW5rIHsNCiAgY29sb3I6IGdyZWVuOw0KfQ0KDQovKiB2aXNpdGVkIGxpbmsgKi8NCmE6dmlzaXRlZCB7DQogIGNvbG9yOiBwdXJwbGU7DQp9DQoNCi8qIG1vdXNlIG92ZXIgbGluayAqLw0KYTpob3ZlciB7DQogIGNvbG9yOiByZWQ7DQp9DQoNCi8qIHNlbGVjdGVkIGxpbmsgKi8NCmE6YWN0aXZlIHsNCiAgY29sb3I6IHllbGxvdzsNCn0NCg0KPC9zdHlsZT4NCg0KYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9DQojIGNvZGUgY2h1bmsgc3BlY2lmaWVzIHdoZXRoZXIgdGhlIFIgY29kZSwgd2FybmluZ3MsIGFuZCBvdXRwdXQgDQojIHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhlIG91dHB1dCBmaWxlcy4NCmlmICghcmVxdWlyZSgidGlkeXZlcnNlIikpIHsNCiAgIGluc3RhbGwucGFja2FnZXMoInRpZHl2ZXJzZSIpDQogICBsaWJyYXJ5KHRpZHl2ZXJzZSkNCn0NCmlmICghcmVxdWlyZSgia25pdHIiKSkgew0KICAgaW5zdGFsbC5wYWNrYWdlcygia25pdHIiKQ0KICAgbGlicmFyeShrbml0cikNCn0NCmlmICghcmVxdWlyZSgicGxvdGx5IikpIHsNCiAgIGluc3RhbGwucGFja2FnZXMoInBsb3RseSIpDQogICBsaWJyYXJ5KHBsb3RseSkNCn0NCmlmICghcmVxdWlyZSgiZ2FwbWluZGVyIikpIHsNCiAgIGluc3RhbGwucGFja2FnZXMoImdhcG1pbmRlciIpDQogICBsaWJyYXJ5KGdhcG1pbmRlcikNCn0NCmlmICghcmVxdWlyZSgiUkN1cmwiKSkgew0KICAgIGluc3RhbGwucGFja2FnZXMoIlJDdXJsIikNCiAgICBsaWJyYXJ5KCJSQ3VybCIpDQp9DQppZiAoIXJlcXVpcmUoImNvbG91cnBpY2tlciIpKSB7DQogICAgaW5zdGFsbC5wYWNrYWdlcygiY29sb3VycGlja2VyIikgICAgICAgICAgICAgIA0KICAgIGxpYnJhcnkoImNvbG91cnBpY2tlciIpDQp9DQppZiAoIXJlcXVpcmUoImdnYW5pbWF0ZSIpKSB7DQogICAgaW5zdGFsbC5wYWNrYWdlcygiZ2dhbmltYXRlIikgICAgICAgICAgICAgIA0KICAgIGxpYnJhcnkoImdnYW5pbWF0ZSIpDQp9DQppZiAoIXJlcXVpcmUoImdpZnNraSIpKSB7DQogICAgaW5zdGFsbC5wYWNrYWdlcygiZ2lmc2tpIikgICAgICAgICAgICAgIA0KICAgIGxpYnJhcnkoImdpZnNraSIpDQp9DQppZiAoIXJlcXVpcmUoIm1hZ2ljayIpKSB7DQogICAgaW5zdGFsbC5wYWNrYWdlcygibWFnaWNrIikgICAgICAgICAgICAgIA0KICAgIGxpYnJhcnkoIm1hZ2ljayIpDQp9DQppZiAoIXJlcXVpcmUoImdyRGV2aWNlcyIpKSB7DQogICAgaW5zdGFsbC5wYWNrYWdlcygiZ3JEZXZpY2VzIikgICAgICAgICAgICAgIA0KICAgIGxpYnJhcnkoImdyRGV2aWNlcyIpDQp9DQppZiAoIXJlcXVpcmUoImxlYWZsZXQiKSkgew0KICAgIGluc3RhbGwucGFja2FnZXMoImxlYWZsZXQiKSAgICAgICAgICAgICAgDQogICAgbGlicmFyeSgibGVhZmxldCIpDQp9DQppZiAoIXJlcXVpcmUoIm1hcHMiKSkgew0KICAgIGluc3RhbGwucGFja2FnZXMoIm1hcHMiKSAgICAgICAgICAgICAgDQogICAgbGlicmFyeSgibWFwcyIpDQp9DQppZiAoIXJlcXVpcmUoImh0bWx0b29scyIpKSB7DQogICAgaW5zdGFsbC5wYWNrYWdlcygiaHRtbHRvb2xzIikgICAgICAgICAgICAgIA0KICAgIGxpYnJhcnkoImh0bWx0b29scyIpDQp9DQppZiAoIXJlcXVpcmUoImh0bWx3aWRnZXRzIikpIHsNCiAgICBpbnN0YWxsLnBhY2thZ2VzKCJodG1sd2lkZ2V0cyIpICAgICAgICAgICAgICANCiAgICBsaWJyYXJ5KCJodG1sd2lkZ2V0cyIpDQp9DQppZiAoIXJlcXVpcmUoImxlYWZsZWdlbmQiKSkgew0KICAgIGluc3RhbGwucGFja2FnZXMoImxlYWZsZWdlbmQiKSAgICAgICAgICAgICAgDQogICAgbGlicmFyeSgibGVhZmxlZ2VuZCIpDQp9DQppZiAoIXJlcXVpcmUoImdlb2pzb25pbyIpKSB7DQogICAgaW5zdGFsbC5wYWNrYWdlcygiZ2VvanNvbmlvIikgICAgICAgICAgICAgIA0KICAgIGxpYnJhcnkoImdlb2pzb25pbyIpDQp9DQppZiAoIXJlcXVpcmUoInN0cmluZ2kiKSkgew0KICAgIGluc3RhbGwucGFja2FnZXMoInN0cmluZ2kiKSAgICAgICAgICAgICAgDQogICAgbGlicmFyeSgic3RyaW5naSIpDQp9DQppZiAoIXJlcXVpcmUoIlJDb2xvckJyZXdlciIpKSB7DQogICAgaW5zdGFsbC5wYWNrYWdlcygiUkNvbG9yQnJld2VyIikgICAgICAgICAgICAgIA0KICAgIGxpYnJhcnkoIlJDb2xvckJyZXdlciIpDQp9DQppZiAoIXJlcXVpcmUoInRpZ3JpcyIpKSB7DQogICAgaW5zdGFsbC5wYWNrYWdlcygidGlncmlzIikgICAgICAgICAgICAgIA0KICAgIGxpYnJhcnkoInRpZ3JpcyIpDQp9DQppZiAoIXJlcXVpcmUoImxlYWZwb3AiKSkgew0KICAgIGluc3RhbGwucGFja2FnZXMoImxlYWZwb3AiKSAgICAgICAgICAgICAgDQogICAgbGlicmFyeSgibGVhZnBvcCIpDQp9DQppZiAoIXJlcXVpcmUoImxlYWZlbSIpKSB7DQogICAgaW5zdGFsbC5wYWNrYWdlcygibGVhZmVtIikgICAgICAgICAgICAgIA0KICAgIGxpYnJhcnkoImxlYWZlbSIpDQp9DQppZiAoIXJlcXVpcmUoInRtYXAiKSkgew0KICAgIGluc3RhbGwucGFja2FnZXMoInRtYXAiKSAgICAgICAgICAgICAgDQogICAgbGlicmFyeSgidG1hcCIpDQp9DQppZiAoIXJlcXVpcmUoInRtYXB0b29scyIpKSB7DQogICAgaW5zdGFsbC5wYWNrYWdlcygidG1hcHRvb2xzIikgICAgICAgICAgICAgIA0KICAgIGxpYnJhcnkoInRtYXB0b29scyIpDQp9DQppZiAoIXJlcXVpcmUoIndlYnNob3QyIikpIHsNCiAgICBpbnN0YWxsLnBhY2thZ2VzKCJ3ZWJzaG90MiIpICAgICAgICAgICAgICANCiAgICBsaWJyYXJ5KCJ3ZWJzaG90MiIpDQp9DQppZiAoIXJlcXVpcmUoInNmIikpIHsNCiAgICBpbnN0YWxsLnBhY2thZ2VzKCJzZiIpICAgICAgICAgICAgICANCiAgICBsaWJyYXJ5KCJzZiIpDQp9DQppZiAoIXJlcXVpcmUoInRlcnJhIikpIHsNCiAgICBpbnN0YWxsLnBhY2thZ2VzKCJ0ZXJyYSIpICAgICAgICAgICAgICANCiAgICBsaWJyYXJ5KCJ0ZXJyYSIpDQp9DQppZiAoIXJlcXVpcmUoImxlYWZwb3AiKSkgew0KICAgIGluc3RhbGwucGFja2FnZXMoImxlYWZwb3AiKSAgICAgICAgICAgICAgDQogICAgbGlicmFyeSgibGVhZnBvcCIpDQp9DQoNCiMjDQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUsICAgICAgIA0KICAgICAgICAgICAgICAgICAgICAgIHdhcm5pbmcgPSBGQUxTRSwgICANCiAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBUUlVFLCAgIA0KICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBGQUxTRSwNCiAgICAgICAgICAgICAgICAgICAgICBjb21tZW50ID0gTkEpDQpgYGANCg0KIyBQaGlsbHkgU2hvb3RpbmcgRGF0YSBSZWZlcmVuY2UgTWFwDQoNCmBgYHtyfQ0KcGhpbGx5TmVpZ2hib3IgIDwtIHN0X3JlYWQoImh0dHBzOi8vcGVuZ2RzY2kuZ2l0aHViLmlvL1NUQTU1M1ZJWi93MDgvTmVpZ2hib3Job29kc19QaGlsYWRlbHBoaWEuZ2VvanNvbiIpDQpwaGlsbHlOZWlnaGJvclNob290aW5nIDwtIG5hLm9taXQoc3RfcmVhZCgiaHR0cHM6Ly9wZW5nZHNjaS5naXRodWIuaW8vU1RBNTUzVklaL3cwOC9QaGlsbHlTaG9vdGluZ3MuZ2VvanNvbiIpKQ0KDQojI21hcCB0aXRsZQ0KdGl0bGUgPC0gdGFncyRkaXYoDQogICBIVE1MKCc8aW1nIGJvcmRlcj0iMCIgYWx0PSJJbWFnZVRpdGxlIiBzcmM9Imh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9hemhlbmVnaGFuL2FoZW5lZ2hhbi9tYWluL2ltYWdlcy9waGlsbHlTaG9vdFRpdGxlLnBuZyIgd2lkdGg9IjIwMCIgaGVpZ2h0PSI0NSI+JykNCiApIA0KDQojIyBjb2xvciBwYWxldHRlDQpwYWwgPC0gY29sb3JGYWN0b3IoYygiI0RDMjY3RiIsICJibHVlIiksIGRvbWFpbiA9IGMoIjEiLCAiMCIpKQ0KDQojIyBEZWZpbmUgb2JqZWN0cyB3aXRoIGdlby1jb29yZGluYXRlIHN5c3RlbSB0byBwbG90IHNwZWNpZmljIGluZm9ybWF0aW9uDQpwbnQgPSBzdF9hc19zZihkYXRhLmZyYW1lKHggPSAtNzUuMTI1NiwgeSA9IDQwLjAwNjMpLA0KICAgICAgICAgICAgICAgIGNvb3JkcyA9IGMoIngiLCAieSIpLA0KICAgICAgICAgICAgICAgIGNycyA9IDQzMjYpDQptb3J0YWwgPSBzdF9hc19zZihkYXRhLmZyYW1lKHggPSAtNzUuMzI3NywgeSA9IDM5LjkxNjgpLA0KICAgICAgICAgICAgICAgIGNvb3JkcyA9IGMoIngiLCAieSIpLA0KICAgICAgICAgICAgICAgIGNycyA9IDQzMjYpDQoNCiMjIEltYWdlcyB0byBiZSBwbG90IG9uIHRoZSBtYXANCmhvc3BpdGFsID0gImh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9hemhlbmVnaGFuL2FoZW5lZ2hhbi9tYWluL2ltYWdlcy9waGlsbHlIb3NwaXRhbC5qcGciDQpmYXRhbFRyZW5kID0gImh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9hemhlbmVnaGFuL2FoZW5lZ2hhbi9tYWluL2ltYWdlcy9Ub3RhbFBoaWxseVNob290aW5nc2J5WWVhci5wbmciDQoNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQoNCmxlYWZsZXQoKSAlPiUNCiAgc2V0Vmlldyhsbmc9LTc1LjE1MDkyLCBsYXQ9NDAuMDA5OTUsIHpvb20gPSAxMSkgJT4lDQogIGFkZFByb3ZpZGVyVGlsZXMocHJvdmlkZXJzJENhcnRvREIuRGFya01hdHRlciwgZ3JvdXA9IkRhcmsiKSAlPiUNCiAgYWRkUHJvdmlkZXJUaWxlcyhwcm92aWRlcnMkQ2FydG9EQi5EYXJrTWF0dGVyTm9MYWJlbHMsIGdyb3VwPSJEYXJrTGFiZWwiKSAlPiUgIA0KICBhZGRQcm92aWRlclRpbGVzKHByb3ZpZGVycyRFc3JpLk5hdEdlb1dvcmxkTWFwLCBncm91cD0iRXNyaSIpICU+JQ0KICBhZGRDb250cm9sKHRpdGxlLCBwb3NpdGlvbiA9ICJ0b3BsZWZ0IiwgY2xhc3NOYW1lPSJtYXAtdGl0bGUiKSAlPiUNCiAgIyMgbWluaSByZWZlcmVuY2UgbWFwDQogIGFkZE1pbmlNYXAoKSAlPiUNCiAgIyMgbmVpZ2hib3Job29kIGJvdW5kYXJ5DQogIGFkZFBvbHlnb25zKGRhdGEgPSBwaGlsbHlOZWlnaGJvciwNCiAgICAgICAgICAgICAgY29sb3IgPSAnc2t5Ymx1ZScsDQogICAgICAgICAgICAgIHdlaWdodCA9IDEpICAlPiUNCiAgIyMgcGxvdCBpbmZvcm1hdGlvbiBvbiB0aGUgbWFwDQogIGFkZENpcmNsZU1hcmtlcnMoZGF0YSA9IHBoaWxseU5laWdoYm9yU2hvb3RpbmcsDQogICAgICAgICAgICAgICAgICAgcmFkaXVzID0gfmlmZWxzZShmYXRhbCA9PSAiMSIsIDUsIDMpLA0KICAgICAgICAgICAgICAgICAgIGNvbG9yID0gfnBhbChmYXRhbCksDQogICAgICAgICAgICAgICAgICAgc3Ryb2tlID0gRkFMU0UsIA0KICAgICAgICAgICAgICAgICAgIGZpbGxPcGFjaXR5ID0gMC41LA0KICAgICAgICAgICAgICAgICAgIHBvcHVwID0gfnBvcHVwVGFibGUocGhpbGx5TmVpZ2hib3JTaG9vdGluZyksDQogICAgICAgICAgICAgICAgICAgY2x1c3Rlck9wdGlvbnMgPSBtYXJrZXJDbHVzdGVyT3B0aW9ucyhtYXhDbHVzdGVyUmFkaXVzID0gNDApKSAlPiUNCiAgIyBBZGRpbmcgdGhlIGltYWdlIG9mIGNpdHkgaGFsbA0KICBhZGRDaXJjbGVNYXJrZXJzKGRhdGEgPSBwbnQsIA0KICAgICAgICAgICAgICAgICAgIGNvbG9yID0gImJsdWUiLA0KICAgICAgICAgICAgICAgICAgIHdlaWdodCA9IDIsDQogICAgICAgICAgICAgICAgICAgbGFiZWwgPSAiU3QuIENocmlzdG9waGVyJ3MgSG9zcGl0YWwgZm9yIENoaWxkcmVuIiwNCiAgICAgICAgICAgICAgICAgICBzdHJva2UgPSBGQUxTRSwgDQogICAgICAgICAgICAgICAgICAgZmlsbE9wYWNpdHkgPSAwLjk1LA0KICAgICAgICAgICAgICAgICAgIGdyb3VwID0gInBudCIpICU+JQ0KICBhZGRQb3B1cEltYWdlcyhob3NwaXRhbCwgDQogICAgICAgICAgICAgICAgICB3aWR0aCA9IDEwMCwNCiAgICAgICAgICAgICAgICAgIGhlaWdodCA9IDEyMCwNCiAgICAgICAgICAgICAgICAgIHRvb2x0aXAgPSBGQUxTRSwNCiAgICAgICAgICAgICAgICAgIGdyb3VwID0gInBudCIpICAlPiUNCiAgIyBUcmVuZCBvZiBjcmltZXMgb3ZlciB0aGUgeWVhcnMNCiAgYWRkQ2lyY2xlTWFya2VycyhkYXRhID0gbW9ydGFsLCANCiAgICAgICAgICAgICAgICAgICBjb2xvciA9ICJwdXJwbGUiLA0KICAgICAgICAgICAgICAgICAgIHdlaWdodCA9IDIsDQogICAgICAgICAgICAgICAgICAgbGFiZWwgPSAiVHJlbmQiLA0KICAgICAgICAgICAgICAgICAgIHN0cm9rZSA9IEZBTFNFLCANCiAgICAgICAgICAgICAgICAgICBmaWxsT3BhY2l0eSA9IDAuOTUsDQogICAgICAgICAgICAgICAgICAgZ3JvdXAgPSAibW9ydGFsIikgJT4lDQogIGFkZFBvcHVwSW1hZ2VzKGZhdGFsVHJlbmQsIA0KICAgICAgICAgICAgICAgICAgd2lkdGggPSA1MDAsDQogICAgICAgICAgICAgICAgICBoZWlnaHQgPSAzNTAsDQogICAgICAgICAgICAgICAgICB0b29sdGlwID0gRkFMU0UsDQogICAgICAgICAgICAgICAgICBncm91cCA9ICJtb3J0YWwiKSAlPiUNCiAgYWRkTGF5ZXJzQ29udHJvbChiYXNlR3JvdXBzID0gYygnRGFyaycsICdEYXJrTGFiZWwnLCAnRXNyaScpLA0KICAgICAgICAgICAgICAgICAgIG92ZXJsYXlHcm91cHMgPSBjKCJDcmltZSBEYXRhIiksDQogICAgICAgICAgICAgICAgICAgb3B0aW9ucyA9IGxheWVyc0NvbnRyb2xPcHRpb25zKGNvbGxhcHNlZCA9IFRSVUUpKSAlPiUNCiAgYnJvd3NhYmxlKCkNCmBgYA0KDQpUaGVyZSBhcmUgYXBwZWFyIHRvIGJlIGxlc3Mgc2hvb3RpbmdzIG9uIHRoZSBvdXRlciByZWdpb25zIG9mIFBoaWxhZGVscGhpYSwgYW5kIHRoZSBudW1iZXJzIG9mIHNob290aW5ncyBpbmNyZWFzZSBhcyB5b3UgbW92ZSBjbG9zZXIgdG8gdGhlIGNlbnRlciBvZiBQaGlsYWRlbHBoaWEuDQpJbiBvYnNlcnZpbmcgdGhlIHRvdGFsIGFtb3VudHMgb2Ygc2hvb3RpbmdzIGluIFBoaWxhZGVscGhpYSBvdmVyIHRoZSB5ZWFycywgaXQgYXBwZWFycyB0aGVyZSBpcyBhbHdheXMgbW9yZSBub24tZmF0YWwgc2hvb3RpbmdzIHRoYW4gZmF0YWwgc2hvb3RpbmdzLCByZWdhcmRsZXNzIG9mIHllYXIuIEFtb3VudHMgb2Ygc2hvb3RpbmdzIHdlcmUgcHJldHR5IGNvbnN0YW50IGJldHdlZW4gMjAxNSBhbmQgMjAxOSBmb3IgZmF0YWwgYW5kIG5vbi1mYXRhbC4gVGhlIGFtb3VudCBvZiBzaG9vdGluZ3MgaW5jcmVhc2VkIGluIDIwMjAgZm9yIGJvdGggdHlwZXMsIGVzcGVjaWFsbHkgZm9yIG5vbi1mYXRhbCBzaG9vdGluZ3MsIGJlY2F1c2Ugb2YgdGhlIENPVklELTE5IHBhbmRlbWljLiBUaGUgbnVtYmVycyBvZiBmYXRhbCBhbmQgbm9uLWZhdGFsIHNob290aW5ncyByZW1haW5lZCBhYm91dCBhcyBoaWdoIGFzIHRoZXkgd2VyZSBpbiAyMDIwIGZvciB0aGUgZm9sbG93aW5nIHR3byB5ZWFycy4gVGhlbiBpbiAyMDIzLCB0aGUgYW1vdW50IG9mIHNob290aW5ncyBmb3IgYm90aCB0eXBlcyBkZWNyYXNlZCBhZ2FpbiwgZXNwZWNpYWxseSBmb3Igbm9uLWZhdGFsIHNob290aW5ncy4NCg0KDQojIFByZXNpZGVudGlhbCBFbGVjdGlvbiAyMDIwIFJlc3VsdHMgQ2hvcm9wbGV0aCBTY2F0dGVycGxvdCBNYXANCg0KYGBge3J9DQpwcmVzaWRlbnRpYWwgPC0gcmVhZC5jc3YoZmlsZSA9ICJodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vYXpoZW5lZ2hhbi9haGVuZWdoYW4vbWFpbi9kYXRhc2V0cy9jb3VudHlwcmVzaWRlbnRpYWxfZWxlY3Rpb25fMjAwMC0yMDIwLmNzdiIpDQpnZW9jb2RlIDwtIHJlYWQuY3N2KGZpbGUgPSAiaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL2F6aGVuZWdoYW4vYWhlbmVnaGFuL21haW4vZGF0YXNldHMvZmlwczJnZW9jb2RlLmNzdiIpDQojIyMNCnByZXNpZGVudGlhbDIgPC0gcHJlc2lkZW50aWFsICU+JQ0KICBmaWx0ZXIoeWVhciA9PSAyMDIwLCBwYXJ0eSA9PSAiREVNT0NSQVQiIHwgcGFydHkgPT0gIlJFUFVCTElDQU4iKSAlPiUNCiAgZHBseXI6OnNlbGVjdChzdGF0ZV9wbywgY291bnR5X25hbWUsIGNvdW50eV9maXBzLCBwYXJ0eSwgY2FuZGlkYXRldm90ZXMpDQojIyMNCmVsZWN0aW9uIDwtIG1lcmdlKHggPSBwcmVzaWRlbnRpYWwyLCB5ID0gZ2VvY29kZSwgYnkueCA9ICdjb3VudHlfZmlwcycsIGJ5LnkgPSdmaXBzJywgYWxsID0gRkFMU0UpDQplbGVjdGlvbjIwMjAgPC0gZWxlY3Rpb24gJT4lDQogIGRwbHlyOjpzZWxlY3QoLWNvdW50eSwgLXN0YXRlKQ0KI3dyaXRlLmNzdih4ID0gZWxlY3Rpb24yMDIwLCBmaWxlID0gIlByZXNpZGVudGlhbEVsZWN0aW9uTWVyZ2VkRGF0YS5jc3YiLCByb3cubmFtZXMgPSBGQUxTRSkNCiNlbGVjdGlvbjIwMjAgPC0gcmVhZC5jc3YoZmlsZSA9ICJodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vYXpoZW5lZ2hhbi9haGVuZWdoYW4vbWFpbi9kYXRhc2V0cy9QcmVzaWRlbnRpYWxFbGVjdGlvbk1lcmdlZERhdGEuY3N2IikNCiMjIw0KZWxlY3RSIDwtIGVsZWN0aW9uMjAyMCAlPiUNCiAgZmlsdGVyKHBhcnR5ID09ICJSRVBVQkxJQ0FOIikgJT4lDQogIGRwbHlyOjpyZW5hbWUoUmVwdWJsaWNhblZvdGVzID0gY2FuZGlkYXRldm90ZXMpDQplbGVjdEQgPC0gZWxlY3Rpb24yMDIwICU+JQ0KICBmaWx0ZXIocGFydHkgPT0gIkRFTU9DUkFUIikgJT4lDQogIGRwbHlyOjpyZW5hbWUoRGVtb2NyYXRWb3RlcyA9IGNhbmRpZGF0ZXZvdGVzKQ0KZWxlY3Rpb25OZXcgPC0gbWVyZ2UoeCA9IGVsZWN0UiwgeSA9IGVsZWN0RCwgYnkueCA9ICdjb3VudHlfZmlwcycsIGJ5LnkgPSdjb3VudHlfZmlwcycsIGFsbCA9IEZBTFNFKQ0KZWxlY3Rpb25OZXcyIDwtIGVsZWN0aW9uTmV3ICU+JQ0KICBkcGx5cjo6c2VsZWN0KC1zdGF0ZV9wby55LCAtck1hcFN0YXRlLnksIC1yTWFwQ291bnR5LnksIC1sb24ueSwgLWxhdC55LCAtY291bnR5X25hbWUueSwgLXBhcnR5LnksIC1wYXJ0eS54LCAtck1hcFN0YXRlLngsIC1yTWFwQ291bnR5LngpDQplbGVjdGlvbk5ldzIkcGFydHkgPC0gaWZlbHNlKHRlc3Q9ZWxlY3Rpb25OZXcyJFJlcHVibGljYW5Wb3RlcyA+IGVsZWN0aW9uTmV3MiREZW1vY3JhdFZvdGVzLCB5ZXM9IlJlcHVibGljYW4iLCBubz1pZmVsc2UodGVzdD1lbGVjdGlvbk5ldzIkUmVwdWJsaWNhblZvdGVzIDwgZWxlY3Rpb25OZXcyJERlbW9jcmF0Vm90ZXMsIHllcz0iRGVtb2NyYXQiLCBubz0iTmVpdGhlciIpKQ0KZWxlY3Rpb25OZXcyJHdvbiA8LSBpZmVsc2UodGVzdD1lbGVjdGlvbk5ldzIkUmVwdWJsaWNhblZvdGVzID4gZWxlY3Rpb25OZXcyJERlbW9jcmF0Vm90ZXMsIHllcz1lbGVjdGlvbk5ldzIkUmVwdWJsaWNhblZvdGVzKjEsIG5vPWlmZWxzZSh0ZXN0PWVsZWN0aW9uTmV3MiRSZXB1YmxpY2FuVm90ZXMgPCBlbGVjdGlvbk5ldzIkRGVtb2NyYXRWb3RlcywgeWVzPWVsZWN0aW9uTmV3MiREZW1vY3JhdFZvdGVzKjEsIG5vPTApKQ0KI3dyaXRlLmNzdih4ID0gZWxlY3Rpb25OZXcyLCBmaWxlID0gIlByZXNpZGVudGlhbEVsZWN0aW9uTWVyZ2VkRGF0YTIuY3N2Iiwgcm93Lm5hbWVzID0gRkFMU0UpDQojZWxlY3Rpb25OZXcyIDwtIHJlYWQuY3N2KGZpbGUgPSAiaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL2F6aGVuZWdoYW4vYWhlbmVnaGFuL21haW4vZGF0YXNldHMvUHJlc2lkZW50aWFsRWxlY3Rpb25NZXJnZWREYXRhMi5jc3YiKQ0KIyMjDQpwYXJ0eUNvbG9yIDwtIGMoIiNEQzI2N0YiLCAiYmx1ZSIsICJncmF5IikNCnBhcnR5Q29sb3IgPC0gc2V0TmFtZXMocGFydHlDb2xvciwgYygiUmVwdWJsaWNhbiIsICJEZW1vY3JhdCIsICJOZWl0aGVyIikpDQojIyMNCnBsb3RfbHkoDQogICAgZGF0YSA9IGVsZWN0aW9uTmV3MiwNCiAgICB4ID0gfmxvbi54LCB5ID0gfmxhdC54LCBjb2xvciA9IH5mYWN0b3IocGFydHkpLCBjb2xvcnMgPSBwYXJ0eUNvbG9yLA0KICAgICAgICB0ZXh0ID0gfnBhc3RlKCJDb3VudHk6ICIsIGNvdW50eV9uYW1lLngsDQogICAgICAgICAgICAgICAgICAgIjxicj5TdGF0ZTogIiwgc3RhdGVfcG8ueCwNCiAgICAgICAgICAgICAgICAgICAiPGJyPk51bWJlciBvZiBWb3RlczogIiwgd29uKSwNCiAgICAgIyMgdXNpbmcgdGhlIGZvbGxvd2luZyBob3ZlcnRlbXBsYXRlKCkgdG8gYWRkIHRoZSBpbmZvcm1hdGlvbiBvZiB0aGUNCiAgICAgIyMgVHdvIG51bWVyaWNhbCB2YXJpYWJsZXMgdG8gdGhlIGhvdmVyIHRleHQuDQogICAgIGhvdmVydGVtcGxhdGUgPSBwYXN0ZSgnPGk+PGI+TGF0aXR1ZGU8Yj48L2k+OiAle3l9JywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICc8YnI+PGI+TG9uZ2l0dWRlPC9iPjogJXt4fScsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAnPGJyPjxiPiV7dGV4dH08L2I+JyksDQogICAgIGFscGhhID0gMC42LA0KICAgICB0eXBlID0gInNjYXR0ZXIiLA0KICAgICBtb2RlID0gIm1hcmtlcnMiLA0KICAgICAjIyBncmFwaGljIHNpemUNCiAgICAgd2lkdGggPSA3MDAsDQogICAgIGhlaWdodCA9IDUwMA0KICAgKSAlPiUNCiAgICBsYXlvdXQoICANCiAgICAgICMjIyBUaXRsZSANCiAgICAgIHRpdGxlID1saXN0KHRleHQgPSAiMjAyMCBQcmVzaWRlbnRpYWwgRWxlY3Rpb24gUmVzdWx0cyBieSBDb3VudHkiLCANCiAgICAgICAgICAgICAgICAgIGZvbnQgPSBsaXN0KGZhbWlseSA9ICJBcmlhbCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplID0gMTgsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3IgPSAiYmx1ZSIpKSwgDQogICAgICAjIyMgbGVnZW5kDQogICAgICBsZWdlbmQgPSBsaXN0KHRpdGxlID0gbGlzdCh0ZXh0ID0gJ1BvbGl0aWNhbCBQYXJ0eScsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb250ID0gbGlzdChmYW1pbHkgPSAiQ291cmllciBOZXciLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplID0gMTQsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3IgPSAiYmxhY2siKSksDQogICAgICAgICAgICAgICAgICAgIGJnY29sb3IgPSAiYmVpZ2UiLA0KICAgICAgICAgICAgICAgICAgICBib3JkZXJjb2xvciA9ICJuYXZ5IiwNCiAgICAgICAgICAgICAgICAgICAgZ3JvdXBjbGljayA9ICJ0b2dnbGVncm91cCIsDQogICAgICAgICAgICAgICAgICAgIG9yaWVudGF0aW9uID0gInYiDQogICAgICAgICAgICAgICAgICAgICksDQogICAgICBtYXJnaW4gPSBsaXN0KA0KICAgICAgICAgICAgICBiID0gMTAwLA0KICAgICAgICAgICAgICBsID0gMTAwLA0KICAgICAgICAgICAgICB0ID0gMTAwLA0KICAgICAgICAgICAgICByID0gNTANCiAgICAgICksDQogICAgICAjIyBCYWNrZ3JvdW5kDQogICAgICBwbG90X2JnY29sb3IgPScjZjdmN2Y3JywgDQogICAgICAjIyBBeGVzIGxhYmVscw0KICAgICAgICAgICAgeGF4aXMgPSBsaXN0KCANCiAgICAgICAgICAgICAgICAgICAgdGl0bGU9bGlzdCh0ZXh0ID0gJ0xvbmdpdHVkZScsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9udCA9IGxpc3QoZmFtaWx5ID0gJ0FyaWFsJykpLA0KICAgICAgICAgICAgICAgICAgICB6ZXJvbGluZWNvbG9yID0gJ3doaXRlJywgDQogICAgICAgICAgICAgICAgICAgIHplcm9saW5ld2lkdGggPSAyLCANCiAgICAgICAgICAgICAgICAgICAgZ3JpZGNvbG9yID0gJ3doaXRlJyksIA0KICAgICAgICAgICAgeWF4aXMgPSBsaXN0KCANCiAgICAgICAgICAgICAgICAgICAgdGl0bGU9bGlzdCh0ZXh0ID0gJ0xhdGl0dWRlJywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb250ID0gbGlzdChmYW1pbHkgPSAnQXJpYWwnKSksDQogICAgICAgICAgICAgICAgICAgIHplcm9saW5lY29sb3IgPSAnd2hpdGUnLCANCiAgICAgICAgICAgICAgICAgICAgemVyb2xpbmV3aWR0aCA9IDIsIA0KICAgICAgICAgICAgICAgICAgICBncmlkY29sb3IgPSAnd2hpdGUnLA0KICAgICAgICAgICAgICAgICAgICByYW5nZT1jKDI1LDUwKSkNCiAgICApDQpgYGANCg0KVGhlcmUgYXBwZWFyIHRvIGJlIG1vcmUgY291bnRpZXMgaW4gdGhlIHN0YXRlcyBpbiB0aGUgZWFzdGVybiBoYWxmIG9mIHRoZSBVbml0ZWQgU3RhdGVzIGNvbXBhcmVkIHRvIHRoZSB3ZXN0ZXJuIGhhbGYuIFRoaXMgY291aWQgYmUgYmVjYXVzZSBtYXliZSBub3QgYXMgbWFueSBwZW9wbGUgbGl2ZSBpbiB0aGUgc3RhdGVzIGluIHRoZSB3ZXN0ZXJuIGhhbGYgZHVlIHRvIGxpdmluZyBjb25kaXRpb25zIG9yIGV2ZW4gd2VhdGhlciwgY2F1c2luZyB0aGVyZSB0byBiZSBub3QgYXMgbWFueSBjb3VudGllcyBuZWVkZWQgdG8gZGl2aWRlIHRoZW0uIFRoZSBlYXN0ZXJuIGhhbGYgb2YgdGhlIGNvdW50cnkgaG9sZHMgbW9yZSBwZW9wbGUsIGVzcGVjaWFsbHkgaW4gdGhlIGVhc3QgY29hc3QgYW5kIHN0YXRlcyBsaWtlIElvd2EsIEFya2Fuc2FzLCBhbmQgT2tsYWhvbWEsIHJlcXVpcmluZyBhIGxhcmdlciBudW1iZXIgb2YgY291bnRpZXMuDQpHaXZlbiB0aGUgb2ZmaWNpYWwgMjAyMCBwcmVzaWRlbnRpYWwgZWxlY3Rpb24gbWFwIHRoYXQgdGhlIERlbW9jcmF0cyB3b24gdGhpcyBwcmVzaWRlbnRpYWwgZWxlY3Rpb24sIEkgYW0gc3VycHJpc2VkIHRoYXQgdGhlcmUgYXJlIG5vdCBhcyBtYW55IERlbW9jcmF0aWMgY291bnRpZXMgYXMgdGhlcmUgYXJlIFJlcHVibGljYW4uIFRoaXMgY291bGQgYmUgZHVlIHRvIGxhY2sgb2YgdmlzaWJpbGl0eSBvbiB0aGUgc2NhdHRlcGxvdCBtYXAgc2luY2UgdGhlIGVhc3Rlcm4gaGFsZiBjb3VudGllcyBhcmUgbW9yZSBjb21wcHJlc3NlZC4gSXQgaXMgYWxzbyBwZXJoYXBzIHBvc3NpYmxlIHRoYXQgdGhlIERlbW9jcmF0aWMgY291bnRpZXMgd2VyZSB1bmRlcnJlcHJlc2VudGVkIGluIHRoZSAyMDIwIGRhdGEuIFRoZSBub2V0aGVhc3Rlcm4gYW5kIHdlc3QgY29hc3QgY29zdCBjb3VudGllcyBtb3N0bHkgc2VlbSB0byBmYXZvciBEZW1vY3JhdHMsIHdoaWNoIGlzIHRvIGJlIGV4cGVjdGVkIHNpbmNlIHRob3NlIHN0YXRlcyBlbmRlZCB1cCBEZW1vY3JhdGljIGluIHRoZSBwb2xsIHJlc3VsdHMuDQo=