1 Introduction

Two datasets were used for this project. The first is the gas station dataset. This dataset contains 72798 observations and 31 variables. It gives information about the various locations of gas stations in the US. Some of the variables include state, county, city, longitude, latitude, availability of diesel and so on.

The second dataset is the Philly Crime Data (2015 - 2024). It is a longitudinal data that contains crime cases in the Philadelphia area since 2015. It has 15243 observations and 19 variables. Some of the variables include: race, sex, date of crime, fatal crimes, street name, block number, zip code and so on.

The datasets can be found here:

Gas Station Dataset: https://github.com/chinwex/STA553/raw/main/w07/POC.csv

Philly Crime Dataset:https://github.com/chinwex/STA553/raw/main/w07/PhillyCrimeSince2015.csv

2 Gas Station Data

The table below gives information about the first six gas stations in the dataset.

dt <- read.csv(file="https://github.com/chinwex/STA553/raw/main/w07/POC.csv")[,-1]
kable(head(dt))
site_row_id STATE county ADDRESS CITY ycoord xcoord SITE_DESCRIPTION service_or_fuel diesel twentyfour_hour_flag car_wash truckstop_flag description PUMP_TECH POC HIFCA ZIPnew POCAGE POCGAP ZIPPOC HFG MSA dist.to.poc cate.poc.density cate.poc.age cate.poc.age.20 cate.poc.intensity cate.poc.intensity.tot MSA_POC MSA_POC.1
1-3R8J-494 CA Los Angeles 37120 47TH ST E PALMDALE 34.55584 -118.0452 Los Angeles-Long Beach-Santa Ana CA Fuel Y Y N Y URBAN O 0 0 93552 NA NA 0 1 4480 8.2275601 (-1e-06,1] (15,140] (15,140] (5,Inf] (8,Inf] 1 1
1-3R8J-362 WA Franklin 1212 N 4TH AVE PASCO 46.23890 -119.0950 Kennewick-Pasco-Richland WA Fuel N N N N URBAN O 0 1 99301 NA NA 1 0 6740 0.2788194 (-1e-06,1] (15,140] (15,140] (5,Inf] (8,Inf] 0 0
1-3R8J-199 NV Washoe 99 DAMONTE RANCH PKWY RENO 39.41961 -119.7549 Reno-Sparks NV Fuel Y Y N N URBAN O 0 1 89521 NA NA 1 0 6720 1.3055498 (1,5] (0,15] (0,15] (0,5] (0,8] 0 0
1-3R8J-261 UT Salt Lake 5404 S 4200 W SALT LAKE CITY 40.65107 -112.0101 Salt Lake City UT Fuel N Y N N URBAN O 0 1 84118 NA NA 0 0 7160 8.2792641 (-1e-06,1] (15,140] (15,140] (0,5] (0,8] 0 0
1-3R8J-493 CA Los Angeles 1731 E AVE J LANCASTER 34.68966 -118.0984 Los Angeles-Long Beach-Santa Ana CA Fuel N Y N N URBAN O 0 0 93535 NA NA 0 1 4480 17.6058504 (-1e-06,1] (140,Inf] (15,140] (-0.0001,0] (-0.0001,0] 1 1
1-3R8J-508 WA Benton 2707 S QUILLAN ST KENNEWICK 46.18435 -119.1739 Kennewick-Pasco-Richland WA Fuel Y Y N N URBAN O 0 1 99337 NA NA 0 0 6740 8.7976927 (-1e-06,1] (15,140] (15,140] (5,Inf] (8,Inf] 0 0

2.1 Map Showing Different Gas Station Locations

A random sample of 500 gas stations were taken from the dataset to plot on the map.

set.seed(100)  
dt500 <- dt[sample(nrow(dt), size = 500), ]
title1 <- tags$div( HTML('<font color = "darkred" size =5><b>A Map of 500 Gas Stations in the US</b></font>'))

leaflet(dt500) %>% 
  addTiles() %>%
  setView(lng = -75.5978, lat=39.9522, zoom = 9) %>%
  addMarkers(~xcoord, ~ycoord, popup = ~paste("State: ",STATE, 
                                         "<br>County: ", county,
                                         "<br>Address: ", ADDRESS,
                                         "<br>Zipcode: ", ZIPnew))%>%
 addControl(title1, position = "topright", className = "map-title")

A Map of 500 Gas Stations in the US

3 Philly Crime Data

The table below shows the first 6 crime cases in the dataset.

phily <- na.omit(read.csv(file = "https://github.com/chinwex/STA553/raw/main/w07/PhillyCrimeSince2015.csv"))
kable(head(phily))
dc_key race sex fatal date has_court_case age street_name block_number zip_code council_district police_district neighborhood house_district senate_district school_catchment lng lat
2.02422E+11 Black (Non-Hispanic) Female Nonfatal 3/3/2024 14:49 No 20 N COLORADO ST 2500 19132 5 22 Sharswood-Stanton 181 3 Tanner G. Duckrey School -75.16060 39.99166
2.02426E+11 Hispanic (Black or White) Male Nonfatal 3/1/2024 22:18 No 58 N FRANKLIN ST 2600 19133 5 26 Northern Liberties-West Kensington 197 3 John F. Hartranft School -75.14468 39.99152
2.02422E+11 Black (Non-Hispanic) Male Fatal 2/29/2024 22:59 No 49 MOUNT PLEASANT DR 3700 19121 4 22 Park 190 7 James G. Blaine School -75.20027 39.98462
2.02422E+11 Black (Non-Hispanic) Female Fatal 2/29/2024 22:59 No 38 MOUNT PLEASANT DR 3700 19121 4 22 Park 190 7 James G. Blaine School -75.20027 39.98462
2.02419E+11 Black (Non-Hispanic) Male Nonfatal 2/29/2024 19:30 No 19 MASTER ST 5600 19131 4 19 Haddington-Overbrook 192 7 Universal Charter School at Bluford -75.23338 39.97346
2.02439E+11 Black (Non-Hispanic) Male Fatal 2/29/2024 1:53 No 31 PULASKI AVE 5500 19144 8 39 East Falls-Westside 198 3 John B. Kelly School -75.17899 40.02939

3.1 Map Showing the 2023 Philly Crime Data

All 2023 crime cases where filtered from the dataset and shown in the map below.

phily$year <- format(as.Date(phily$date, format = "%m/%d/%Y"), "%Y")
phily2023 <- filter(phily, year == 2023)
philcolor <- rep("#0072B2", length(phily2023$fatal))
philcolor[which(phily2023$fatal == "Fatal")] <- "#D55E00"

labels <-  paste("Street Name: ",phily2023$street_name, 
             "<br>Block Number: ", phily2023$block_number,
             "<br>Neighborhood: ", phily2023$neighborhood,
             "<br>Zipcode: ", phily2023$zip_code)%>% 
                      lapply(htmltools::HTML)

title <- tags$div( HTML('<font color = "purple" size =5><b>2023 Philly Crime Locations</b></font>'))

 Annotat <- tags$div(HTML('<center><font color = "blue" size =3>The circle sizes are proportional to the ages</font>'))


leaflet(phily2023) %>%
  addTiles() %>% 
  setView(lng = mean(phily2023$lng), lat=mean(phily2023$lat), zoom = 15) %>%
  addCircleMarkers(
            ~lng, 
            ~lat,
            color = philcolor,
            fillColor = ifelse(phily2023$fatal == "Nonfatal", "#ffff66", "#ff99ff"),
            radius = ~(phily2023$age/10)*2,
            opacity = 1,
           # stroke = FALSE, 
           fillOpacity = 0.25,
            label = ~labels ) %>%
  
  addLegend(position = "bottomright", 
            colors = c("#0072B2", "#D55E00"),
            labels= c("Nonfatal", "Fatal"),
            title= "Crime Type",
            opacity = 0.5)%>%
 addControl(title, position = "topright", className = "map-title")%>%
  addControl(Annotat, position = "bottomleft")%>%

addLegendSize(position = 'bottomright', 
                  values = (phily2023$age/10)*2,
                   color = 'gray',
               fillColor = 'gray',
                 opacity = .5,
                   title = 'Age',
                   shape = 'circle',
             orientation = 'vertical',
                  breaks = 4)

A Map of Philly Crime Locations in 2023

3.2 Map Interpretation

The map above shows various crime locations in Philadelphia with orange circles representing fatal crimes and blue circles representing nonfatal crimes. From the plot, it is clear that in 2023, there were more nonfatal cases than fatal ones. The circle sizes are proportional to the ages on the dataset. Most of the fatal crimes are associated with younger ages. Majority of crime cases are seen in North Philadelphia.

LS0tDQp0aXRsZTogIlIgTWFwcyBGb3IgVmlzdWFsaXppbmcgU3BhdGlhbCBJbmZvcm1hdGlvbiINCmF1dGhvcjogIkVjaGVmdSBDaGlud2VuZHUiDQpkYXRlOiAiMjAyNC0wMy0xOSINCm91dHB1dDoNCiAgaHRtbF9kb2N1bWVudDogDQogICAgdG9jOiB5ZXMNCiAgICB0b2NfZGVwdGg6IDQNCiAgICB0b2NfZmxvYXQ6IHllcw0KICAgIGZpZ193aWR0aDogNA0KICAgIGZpZ19jYXB0aW9uOiB5ZXMNCiAgICBudW1iZXJfc2VjdGlvbnM6IHllcw0KICAgIHRvY19jb2xsYXBzZWQ6IHllcw0KICAgIGNvZGVfZm9sZGluZzogaGlkZQ0KICAgIGNvZGVfZG93bmxvYWQ6IHllcw0KICAgIHNtb290aF9zY3JvbGw6IHRydWUNCiAgICB0aGVtZTogcmVhZGFibGUNCiAgICBmaWdfaGVpZ2h0OiA0DQogIHBkZl9kb2N1bWVudDogDQogICAgdG9jOiB5ZXMNCiAgICB0b2NfZGVwdGg6IDQNCiAgICBmaWdfY2FwdGlvbjogeWVzDQogICAgbnVtYmVyX3NlY3Rpb25zOiB5ZXMNCiAgICBmaWdfd2lkdGg6IDMNCiAgICBmaWdfaGVpZ2h0OiAzDQogIHdvcmRfZG9jdW1lbnQ6IA0KICAgIHRvYzogeWVzDQogICAgdG9jX2RlcHRoOiA0DQogICAgZmlnX2NhcHRpb246IHllcw0KICAgIGtlZXBfbWQ6IHllcw0KZWRpdG9yX29wdGlvbnM6IA0KICBjaHVua19vdXRwdXRfdHlwZTogaW5saW5lDQotLS0NCg0KYGBgez1odG1sfQ0KPHN0eWxlIHR5cGU9InRleHQvY3NzIj4NCg0KLyogVGFibGUgb2YgY29udGVudCAtIG5hdmlnYXRpb24gKi8NCmRpdiNUT0MgbGkgew0KICAgIGxpc3Qtc3R5bGU6bm9uZTsNCiAgICBiYWNrZ3JvdW5kLWNvbG9yOmxpZ2h0Z3JheTsNCiAgICBiYWNrZ3JvdW5kLWltYWdlOm5vbmU7DQogICAgYmFja2dyb3VuZC1yZXBlYXQ6bm9uZTsNCiAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOjA7DQogICAgZm9udC1mYW1pbHk6IEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7DQogICAgY29sb3I6ICM3ODBjMGM7DQp9DQoNCg0KLyogVGl0bGUgZm9udHMgKi8NCmgxLnRpdGxlIHsNCiAgZm9udC1zaXplOiAyNHB4Ow0KICBjb2xvcjogZGFya2JsdWU7DQogIHRleHQtYWxpZ246IGNlbnRlcjsNCiAgZm9udC1mYW1pbHk6IEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7DQogIGZvbnQtdmFyaWFudC1jYXBzOiBub3JtYWw7DQp9DQpoNC5hdXRob3IgeyANCiAgZm9udC1zaXplOiAxOHB4Ow0KICBmb250LWZhbWlseTogQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsNCiAgY29sb3I6IG5hdnk7DQogIHRleHQtYWxpZ246IGNlbnRlcjsNCn0NCmg0LmRhdGUgeyANCiAgZm9udC1zaXplOiAxOHB4Ow0KICBmb250LWZhbWlseTogQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsNCiAgY29sb3I6IGRhcmtibHVlOw0KICB0ZXh0LWFsaWduOiBjZW50ZXI7DQp9DQoNCi8qIFNlY3Rpb24gaGVhZGVycyAqLw0KaDEgew0KICAgIGZvbnQtc2l6ZTogMjJweDsNCiAgICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsNCiAgICBjb2xvcjogZGFya3JlZDsNCiAgICB0ZXh0LWFsaWduOiBsZWZ0Ow0KfQ0KDQpoMiB7DQogICAgZm9udC1zaXplOiAxOHB4Ow0KICAgIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOw0KICAgIGNvbG9yOiBuYXZ5Ow0KICAgIHRleHQtYWxpZ246IGxlZnQ7DQp9DQoNCmgzIHsgDQogICAgZm9udC1zaXplOiAxNXB4Ow0KICAgIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOw0KICAgIGNvbG9yOiBkYXJrcmVkOw0KICAgIHRleHQtYWxpZ246IGxlZnQ7DQp9DQoNCmg0IHsNCiAgICBmb250LXNpemU6IDE4cHg7DQogICAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7DQogICAgY29sb3I6IGRhcmtyZWQ7DQogICAgdGV4dC1hbGlnbjogbGVmdDsNCn0NCg0KLyogRGVjb3JhdGlvbiBvZiBoeXBlcmxpbmtzICAqLw0KDQovKiB1bnZpc2l0ZWQgbGluayAqLw0KYTpsaW5rIHsNCiAgY29sb3I6IGdyZWVuOw0KfQ0KDQovKiB2aXNpdGVkIGxpbmsgKi8NCmE6dmlzaXRlZCB7DQogIGNvbG9yOiBwdXJwbGU7DQp9DQoNCi8qIG1vdXNlIG92ZXIgbGluayAqLw0KYTpob3ZlciB7DQogIGNvbG9yOiByZWQ7DQp9DQoNCi8qIHNlbGVjdGVkIGxpbmsgKi8NCmE6YWN0aXZlIHsNCiAgY29sb3I6IHllbGxvdzsNCn0NCjwvc3R5bGU+DQpgYGANCg0KDQpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0NCiMgY29kZSBjaHVuayBzcGVjaWZpZXMgd2hldGhlciB0aGUgUiBjb2RlLCB3YXJuaW5ncywgYW5kIG91dHB1dCANCiMgd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUgb3V0cHV0IGZpbGVzLg0Kb3B0aW9ucyhyZXBvcyA9IGxpc3QoQ1JBTj0iaHR0cDovL2NyYW4ucnN0dWRpby5jb20vIikpDQppZiAoIXJlcXVpcmUoInRpZHl2ZXJzZSIpKSB7DQogICBpbnN0YWxsLnBhY2thZ2VzKCJ0aWR5dmVyc2UiKQ0KICAgbGlicmFyeSh0aWR5dmVyc2UpDQp9DQppZiAoIXJlcXVpcmUoImtuaXRyIikpIHsNCiAgIGluc3RhbGwucGFja2FnZXMoImtuaXRyIikNCiAgIGxpYnJhcnkoa25pdHIpDQp9DQppZiAoIXJlcXVpcmUoImNvd3Bsb3QiKSkgew0KICAgaW5zdGFsbC5wYWNrYWdlcygiY293cGxvdCIpDQogICBsaWJyYXJ5KGNvd3Bsb3QpDQp9DQppZiAoIXJlcXVpcmUoImxhdGV4MmV4cCIpKSB7DQogICBpbnN0YWxsLnBhY2thZ2VzKCJsYXRleDJleHAiKQ0KICAgbGlicmFyeShsYXRleDJleHApDQp9DQppZiAoIXJlcXVpcmUoInBsb3RseSIpKSB7DQogICBpbnN0YWxsLnBhY2thZ2VzKCJwbG90bHkiKQ0KICAgbGlicmFyeShwbG90bHkpDQp9DQppZiAoIXJlcXVpcmUoImdhcG1pbmRlciIpKSB7DQogICBpbnN0YWxsLnBhY2thZ2VzKCJnYXBtaW5kZXIiKQ0KICAgbGlicmFyeShnYXBtaW5kZXIpDQp9DQppZiAoIXJlcXVpcmUoInBuZyIpKSB7DQogICAgaW5zdGFsbC5wYWNrYWdlcygicG5nIikgICAgICAgICAgICAgIyBJbnN0YWxsIHBuZyBwYWNrYWdlDQogICAgbGlicmFyeSgicG5nIikNCn0NCmlmICghcmVxdWlyZSgiUkN1cmwiKSkgew0KICAgIGluc3RhbGwucGFja2FnZXMoIlJDdXJsIikgICAgICAgICAgICAgIyBJbnN0YWxsIFJDdXJsIHBhY2thZ2UNCiAgICBsaWJyYXJ5KCJSQ3VybCIpDQp9DQppZiAoIXJlcXVpcmUoImNvbG91cnBpY2tlciIpKSB7DQogICAgaW5zdGFsbC5wYWNrYWdlcygiY29sb3VycGlja2VyIikgICAgICAgICAgICAgIA0KICAgIGxpYnJhcnkoImNvbG91cnBpY2tlciIpDQp9DQppZiAoIXJlcXVpcmUoImdnYW5pbWF0ZSIpKSB7DQogICAgaW5zdGFsbC5wYWNrYWdlcygiZ2dhbmltYXRlIikgICAgICAgICAgICAgIA0KICAgIGxpYnJhcnkoImdnYW5pbWF0ZSIpDQp9DQppZiAoIXJlcXVpcmUoImdpZnNraSIpKSB7DQogICAgaW5zdGFsbC5wYWNrYWdlcygiZ2lmc2tpIikgICAgICAgICAgICAgIA0KICAgIGxpYnJhcnkoImdpZnNraSIpDQp9DQppZiAoIXJlcXVpcmUoIm1hZ2ljayIpKSB7DQogICAgaW5zdGFsbC5wYWNrYWdlcygibWFnaWNrIikgICAgICAgICAgICAgIA0KICAgIGxpYnJhcnkoIm1hZ2ljayIpDQp9DQppZiAoIXJlcXVpcmUoImdyRGV2aWNlcyIpKSB7DQogICAgaW5zdGFsbC5wYWNrYWdlcygiZ3JEZXZpY2VzIikgICAgICAgICAgICAgIA0KICAgIGxpYnJhcnkoImdyRGV2aWNlcyIpDQp9DQppZiAoIXJlcXVpcmUoImpwZWciKSkgew0KICAgIGluc3RhbGwucGFja2FnZXMoImpwZWciKSAgICAgICAgICAgICAgDQogICAgbGlicmFyeSgianBlZyIpDQp9DQppZiAoIXJlcXVpcmUoIlZHQU0iKSkgew0KICAgIGluc3RhbGwucGFja2FnZXMoIlZHQU0iKSAgICAgICAgICAgICAgDQogICAgbGlicmFyeSgiVkdBTSIpDQp9DQppZiAoIXJlcXVpcmUoIk1BU1MiKSkgew0KICAgIGluc3RhbGwucGFja2FnZXMoIk1BU1MiKSAgICAgICAgICAgICAgDQogICAgbGlicmFyeSgiTUFTUyIpDQp9DQppZiAoIXJlcXVpcmUoIm5uZXQiKSkgew0KICAgIGluc3RhbGwucGFja2FnZXMoIm5uZXQiKSAgICAgICAgICAgICAgDQogICAgbGlicmFyeSgibm5ldCIpDQp9DQppZiAoIXJlcXVpcmUoImNsdXN0ZXIiKSkgew0KICAgIGluc3RhbGwucGFja2FnZXMoImNsdXN0ZXIiKSAgICAgICAgICAgICAgDQogICAgbGlicmFyeSgiY2x1c3RlciIpDQp9DQppZiAoIXJlcXVpcmUoInN0cmluZ3IiKSkgew0KICAgaW5zdGFsbC5wYWNrYWdlcygic3RyaW5nciIsIGRlcGVuZGVuY2llcyA9IFRSVUUpDQogICBsaWJyYXJ5KHN0cmluZ3IpDQp9DQoNCmlmICghcmVxdWlyZSgidG0iKSkgew0KICAgaW5zdGFsbC5wYWNrYWdlcygidG0iLCBkZXBlbmRlbmNpZXMgPSBUUlVFKQ0KICAgbGlicmFyeSh0bSkNCn0NCg0KaWYgKCFyZXF1aXJlKCJ3b3JkY2xvdWQiKSkgew0KICAgaW5zdGFsbC5wYWNrYWdlcygid29yZGNsb3VkIiwgZGVwZW5kZW5jaWVzID0gVFJVRSkNCiAgIGxpYnJhcnkod29yZGNsb3VkKQ0KfQ0KDQppZiAoIXJlcXVpcmUoIlJDdXJsIikpIHsNCiAgIGluc3RhbGwucGFja2FnZXMoIlJDdXJsIiwgZGVwZW5kZW5jaWVzID0gVFJVRSkNCiAgIGxpYnJhcnkoUkN1cmwpDQp9DQoNCmlmICghcmVxdWlyZSgiWE1MIikpIHsNCiAgIGluc3RhbGwucGFja2FnZXMoIlhNTCIsIGRlcGVuZGVuY2llcyA9IFRSVUUpDQogICBsaWJyYXJ5KFhNTCkNCn0NCmlmICghcmVxdWlyZSgiU25vd2JhbGxDIikpIHsNCiAgIGluc3RhbGwucGFja2FnZXMoIlNub3diYWxsQyIsIGRlcGVuZGVuY2llcyA9IFRSVUUpDQogICBsaWJyYXJ5KFNub3diYWxsQykNCn0NCmlmICghcmVxdWlyZSgiUkNvbG9yQnJld2VyIikpIHsNCiAgIGluc3RhbGwucGFja2FnZXMoIlJDb2xvckJyZXdlciIsIGRlcGVuZGVuY2llcyA9IFRSVUUpDQogICBsaWJyYXJ5KFJDb2xvckJyZXdlcikNCn0NCmlmICghcmVxdWlyZSgiZ2dwbG90MiIpKSB7DQogICAgaW5zdGFsbC5wYWNrYWdlcygiZ2dwbG90MiIpICAgICAgICAgICAgICANCiAgICBsaWJyYXJ5KCJnZ3Bsb3QyIikNCn0NCmlmICghcmVxdWlyZSgiZ2dhbmltYXRlIikpIHsNCiAgICBpbnN0YWxsLnBhY2thZ2VzKCJnZ2FuaW1hdGUiKSAgICAgICAgICAgICAgDQogICAgbGlicmFyeSgiZ2dhbmltYXRlIikNCn0NCmlmICghcmVxdWlyZSgiZ3JhcGhpY3MiKSkgew0KICAgIGluc3RhbGwucGFja2FnZXMoImdyYXBoaWNzIikgICAgICAgICAgICAgIA0KICAgIGxpYnJhcnkoImdyYXBoaWNzIikNCn0NCmlmICghcmVxdWlyZSgiZ2dyaWRnZXMiKSkgew0KICAgIGluc3RhbGwucGFja2FnZXMoImdncmlkZ2VzIikgICAgICAgICAgICAgIA0KICAgIGxpYnJhcnkoImdncmlkZ2VzIikNCn0NCmlmICghcmVxdWlyZSgicGx5ciIpKSB7DQogICAgaW5zdGFsbC5wYWNrYWdlcygicGx5ciIpICAgICAgICAgICAgICANCiAgICBsaWJyYXJ5KCJwbHlyIikNCn0NCmlmICghcmVxdWlyZSgiZ2dpcmFwaCIpKSB7DQogICAgaW5zdGFsbC5wYWNrYWdlcygiZ2dpcmFwaCIpICAgICAgICAgICAgICANCiAgICBsaWJyYXJ5KCJnZ2lyYXBoIikNCn0NCmlmICghcmVxdWlyZSgiaGlnaGNoYXJ0ZXIiKSkgew0KICAgIGluc3RhbGwucGFja2FnZXMoImhpZ2hjaGFydGVyIikgICAgICAgICAgICAgIA0KICAgIGxpYnJhcnkoImhpZ2hjaGFydGVyIikNCn0NCmlmICghcmVxdWlyZSgiZm9yZWNhc3QiKSkgew0KICAgIGluc3RhbGwucGFja2FnZXMoImZvcmVjYXN0IikgICAgICAgICAgICAgIA0KICAgIGxpYnJhcnkoImZvcmVjYXN0IikNCn0NCmlmICghcmVxdWlyZSgibGVhZmxldCIpKSB7DQogICAgaW5zdGFsbC5wYWNrYWdlcygibGVhZmxldCIpICAgICAgICAgICAgICANCiAgICBsaWJyYXJ5KCJsZWFmbGV0IikNCn0NCmlmICghcmVxdWlyZSgibWFwcyIpKSB7DQogICAgaW5zdGFsbC5wYWNrYWdlcygibWFwcyIpICAgICAgICAgICAgICANCiAgICBsaWJyYXJ5KCJtYXBzIikNCn0NCmlmICghcmVxdWlyZSgiaHRtbHRvb2xzIikpIHsNCiAgICBpbnN0YWxsLnBhY2thZ2VzKCJodG1sdG9vbHMiKSAgICAgICAgICAgICAgDQogICAgbGlicmFyeSgiaHRtbHRvb2xzIikNCn0NCmlmICghcmVxdWlyZSgiaHRtbHdpZGdldHMiKSkgew0KICAgIGluc3RhbGwucGFja2FnZXMoImh0bWx3aWRnZXRzIikgICAgICAgICAgICAgIA0KICAgIGxpYnJhcnkoImh0bWx3aWRnZXRzIikNCn0NCmlmICghcmVxdWlyZSgibGVhZmxlZ2VuZCIpKSB7DQogICAgaW5zdGFsbC5wYWNrYWdlcygibGVhZmxlZ2VuZCIpICAgICAgICAgICAgICANCiAgICBsaWJyYXJ5KCJsZWFmbGVnZW5kIikNCn0NCmlmICghcmVxdWlyZSgiZ2VvanNvbmlvIikpIHsNCiAgICBpbnN0YWxsLnBhY2thZ2VzKCJnZW9qc29uaW8iKSAgICAgICAgICAgICAgDQogICAgbGlicmFyeSgiZ2VvanNvbmlvIikNCn0NCmlmICghcmVxdWlyZSgic3RyaW5naSIpKSB7DQogICAgaW5zdGFsbC5wYWNrYWdlcygic3RyaW5naSIpICAgICAgICAgICAgICANCiAgICBsaWJyYXJ5KCJzdHJpbmdpIikNCn0NCmlmICghcmVxdWlyZSgiUkNvbG9yQnJld2VyIikpIHsNCiAgICBpbnN0YWxsLnBhY2thZ2VzKCJSQ29sb3JCcmV3ZXIiKSAgICAgICAgICAgICAgDQogICAgbGlicmFyeSgiUkNvbG9yQnJld2VyIikNCn0NCmlmICghcmVxdWlyZSgidGlncmlzIikpIHsNCiAgICBpbnN0YWxsLnBhY2thZ2VzKCJ0aWdyaXMiKSAgICAgICAgICAgICAgDQogICAgbGlicmFyeSgidGlncmlzIikNCn0NCmlmICghcmVxdWlyZSgibGVhZnBvcCIpKSB7DQogICAgaW5zdGFsbC5wYWNrYWdlcygibGVhZnBvcCIpICAgICAgICAgICAgICANCiAgICBsaWJyYXJ5KCJsZWFmcG9wIikNCn0NCmlmICghcmVxdWlyZSgibGVhZmVtIikpIHsNCiAgICBpbnN0YWxsLnBhY2thZ2VzKCJsZWFmZW0iKSAgICAgICAgICAgICAgDQogICAgbGlicmFyeSgibGVhZmVtIikNCn0NCmlmICghcmVxdWlyZSgidG1hcCIpKSB7DQogICAgaW5zdGFsbC5wYWNrYWdlcygidG1hcCIpICAgICAgICAgICAgICANCiAgICBsaWJyYXJ5KCJ0bWFwIikNCn0NCmlmICghcmVxdWlyZSgidG1hcHRvb2xzIikpIHsNCiAgICBpbnN0YWxsLnBhY2thZ2VzKCJ0bWFwdG9vbHMiKSAgICAgICAgICAgICAgDQogICAgbGlicmFyeSgidG1hcHRvb2xzIikNCn0NCmlmICghcmVxdWlyZSgid2Vic2hvdDIiKSkgew0KICAgIGluc3RhbGwucGFja2FnZXMoIndlYnNob3QyIikgICAgICAgICAgICAgIA0KICAgIGxpYnJhcnkoIndlYnNob3QyIikNCn0NCmlmICghcmVxdWlyZSgic2YiKSkgew0KICAgIGluc3RhbGwucGFja2FnZXMoInNmIikgICAgICAgICAgICAgIA0KICAgIGxpYnJhcnkoInNmIikNCn0NCmlmICghcmVxdWlyZSgidGVycmEiKSkgew0KICAgIGluc3RhbGwucGFja2FnZXMoInRlcnJhIikgICAgICAgICAgICAgIA0KICAgIGxpYnJhcnkoInRlcnJhIikNCn0NCmlmICghcmVxdWlyZSgibGVhZnBvcCIpKSB7DQogICAgaW5zdGFsbC5wYWNrYWdlcygibGVhZnBvcCIpICAgICAgICAgICAgICANCiAgICBsaWJyYXJ5KCJsZWFmcG9wIikNCn0NCmlmICghcmVxdWlyZSgibWFwdmlldyIpKSB7DQogICAgaW5zdGFsbC5wYWNrYWdlcygibWFwdmlldyIpICAgICAgICAgICAgICANCiAgICBsaWJyYXJ5KCJtYXB2aWV3IikNCn0NCmlmICghcmVxdWlyZSgic3BEYXRhIikpIHsNCiAgICBpbnN0YWxsLnBhY2thZ2VzKCJzcERhdGEiKSAgICAgICAgICAgICAgDQogICAgbGlicmFyeSgic3BEYXRhIikNCn0NCg0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFLCAgICAgICANCiAgICAgICAgICAgICAgICAgICAgICB3YXJuaW5nID0gRkFMU0UsICAgDQogICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gVFJVRSwgICANCiAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlID0gRkFMU0UsDQogICAgICAgICAgICAgICAgICAgICAgY29tbWVudCA9IE5BKQ0KYGBgDQoNCiMgSW50cm9kdWN0aW9uDQpUd28gZGF0YXNldHMgd2VyZSB1c2VkIGZvciB0aGlzIHByb2plY3QuIFRoZSBmaXJzdCBpcyB0aGUgZ2FzIHN0YXRpb24gZGF0YXNldC4gVGhpcyBkYXRhc2V0IGNvbnRhaW5zIDcyNzk4IG9ic2VydmF0aW9ucyBhbmQgMzEgdmFyaWFibGVzLiBJdCBnaXZlcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdmFyaW91cyBsb2NhdGlvbnMgb2YgZ2FzIHN0YXRpb25zIGluIHRoZSBVUy4gU29tZSBvZiB0aGUgdmFyaWFibGVzIGluY2x1ZGUgc3RhdGUsIGNvdW50eSwgY2l0eSwgbG9uZ2l0dWRlLCBsYXRpdHVkZSwgYXZhaWxhYmlsaXR5IG9mIGRpZXNlbCBhbmQgc28gb24uIA0KDQpUaGUgc2Vjb25kIGRhdGFzZXQgaXMgdGhlIFBoaWxseSBDcmltZSBEYXRhICgyMDE1IC0gMjAyNCkuIEl0IGlzIGEgbG9uZ2l0dWRpbmFsIGRhdGEgdGhhdCBjb250YWlucyBjcmltZSBjYXNlcyBpbiB0aGUgUGhpbGFkZWxwaGlhIGFyZWEgc2luY2UgMjAxNS4gSXQgaGFzIDE1MjQzIG9ic2VydmF0aW9ucyBhbmQgMTkgdmFyaWFibGVzLiBTb21lIG9mIHRoZSB2YXJpYWJsZXMgaW5jbHVkZTogcmFjZSwgc2V4LCBkYXRlIG9mIGNyaW1lLCBmYXRhbCBjcmltZXMsIHN0cmVldCBuYW1lLCBibG9jayBudW1iZXIsIHppcCBjb2RlIGFuZCBzbyBvbi4NCg0KVGhlIGRhdGFzZXRzIGNhbiBiZSBmb3VuZCBoZXJlOg0KDQpHYXMgU3RhdGlvbiBEYXRhc2V0OiBodHRwczovL2dpdGh1Yi5jb20vY2hpbndleC9TVEE1NTMvcmF3L21haW4vdzA3L1BPQy5jc3YNCg0KUGhpbGx5IENyaW1lIERhdGFzZXQ6aHR0cHM6Ly9naXRodWIuY29tL2NoaW53ZXgvU1RBNTUzL3Jhdy9tYWluL3cwNy9QaGlsbHlDcmltZVNpbmNlMjAxNS5jc3YNCg0KIyBHYXMgU3RhdGlvbiBEYXRhDQpUaGUgdGFibGUgYmVsb3cgZ2l2ZXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGZpcnN0IHNpeCBnYXMgc3RhdGlvbnMgaW4gdGhlIGRhdGFzZXQuDQpgYGB7cn0NCmR0IDwtIHJlYWQuY3N2KGZpbGU9Imh0dHBzOi8vZ2l0aHViLmNvbS9jaGlud2V4L1NUQTU1My9yYXcvbWFpbi93MDcvUE9DLmNzdiIpWywtMV0NCmthYmxlKGhlYWQoZHQpKQ0KYGBgDQoNCiMjIE1hcCBTaG93aW5nIERpZmZlcmVudCBHYXMgU3RhdGlvbiBMb2NhdGlvbnMNCkEgcmFuZG9tIHNhbXBsZSBvZiA1MDAgZ2FzIHN0YXRpb25zIHdlcmUgdGFrZW4gZnJvbSB0aGUgZGF0YXNldCB0byBwbG90IG9uIHRoZSBtYXAuDQpgYGB7cn0NCnNldC5zZWVkKDEwMCkgIA0KZHQ1MDAgPC0gZHRbc2FtcGxlKG5yb3coZHQpLCBzaXplID0gNTAwKSwgXQ0KYGBgDQoNCg0KYGBge3IgZmlnLndpZHRoPTcsIGZpZy5oZWlnaHQ9NSwgZmlnLmNhcCA9ICJBIE1hcCBvZiA1MDAgR2FzIFN0YXRpb25zIGluIHRoZSBVUyJ9DQp0aXRsZTEgPC0gdGFncyRkaXYoIEhUTUwoJzxmb250IGNvbG9yID0gImRhcmtyZWQiIHNpemUgPTU+PGI+QSBNYXAgb2YgNTAwIEdhcyBTdGF0aW9ucyBpbiB0aGUgVVM8L2I+PC9mb250PicpKQ0KDQpsZWFmbGV0KGR0NTAwKSAlPiUgDQogIGFkZFRpbGVzKCkgJT4lDQogIHNldFZpZXcobG5nID0gLTc1LjU5NzgsIGxhdD0zOS45NTIyLCB6b29tID0gOSkgJT4lDQogIGFkZE1hcmtlcnMofnhjb29yZCwgfnljb29yZCwgcG9wdXAgPSB+cGFzdGUoIlN0YXRlOiAiLFNUQVRFLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxicj5Db3VudHk6ICIsIGNvdW50eSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxicj5BZGRyZXNzOiAiLCBBRERSRVNTLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPGJyPlppcGNvZGU6ICIsIFpJUG5ldykpJT4lDQogYWRkQ29udHJvbCh0aXRsZTEsIHBvc2l0aW9uID0gInRvcHJpZ2h0IiwgY2xhc3NOYW1lID0gIm1hcC10aXRsZSIpDQpgYGANCg0KIyBQaGlsbHkgQ3JpbWUgRGF0YQ0KVGhlIHRhYmxlIGJlbG93IHNob3dzIHRoZSBmaXJzdCA2IGNyaW1lIGNhc2VzIGluIHRoZSBkYXRhc2V0Lg0KYGBge3J9DQpwaGlseSA8LSBuYS5vbWl0KHJlYWQuY3N2KGZpbGUgPSAiaHR0cHM6Ly9naXRodWIuY29tL2NoaW53ZXgvU1RBNTUzL3Jhdy9tYWluL3cwNy9QaGlsbHlDcmltZVNpbmNlMjAxNS5jc3YiKSkNCmthYmxlKGhlYWQocGhpbHkpKQ0KYGBgDQoNCiMjIE1hcCBTaG93aW5nIHRoZSAyMDIzIFBoaWxseSBDcmltZSBEYXRhIA0KQWxsIDIwMjMgY3JpbWUgY2FzZXMgd2hlcmUgZmlsdGVyZWQgZnJvbSB0aGUgZGF0YXNldCBhbmQgc2hvd24gaW4gdGhlIG1hcCBiZWxvdy4NCmBgYHtyfQ0KcGhpbHkkeWVhciA8LSBmb3JtYXQoYXMuRGF0ZShwaGlseSRkYXRlLCBmb3JtYXQgPSAiJW0vJWQvJVkiKSwgIiVZIikNCnBoaWx5MjAyMyA8LSBmaWx0ZXIocGhpbHksIHllYXIgPT0gMjAyMykNCmBgYA0KDQpgYGB7ciBmaWcud2lkdGg9NywgZmlnLmhlaWdodD01LCBmaWcuY2FwID0gIkEgTWFwIG9mIFBoaWxseSBDcmltZSBMb2NhdGlvbnMgaW4gMjAyMyJ9DQoNCnBoaWxjb2xvciA8LSByZXAoIiMwMDcyQjIiLCBsZW5ndGgocGhpbHkyMDIzJGZhdGFsKSkNCnBoaWxjb2xvclt3aGljaChwaGlseTIwMjMkZmF0YWwgPT0gIkZhdGFsIildIDwtICIjRDU1RTAwIg0KDQpsYWJlbHMgPC0gIHBhc3RlKCJTdHJlZXQgTmFtZTogIixwaGlseTIwMjMkc3RyZWV0X25hbWUsIA0KICAgICAgICAgICAgICI8YnI+QmxvY2sgTnVtYmVyOiAiLCBwaGlseTIwMjMkYmxvY2tfbnVtYmVyLA0KICAgICAgICAgICAgICI8YnI+TmVpZ2hib3Job29kOiAiLCBwaGlseTIwMjMkbmVpZ2hib3Job29kLA0KICAgICAgICAgICAgICI8YnI+WmlwY29kZTogIiwgcGhpbHkyMDIzJHppcF9jb2RlKSU+JSANCiAgICAgICAgICAgICAgICAgICAgICBsYXBwbHkoaHRtbHRvb2xzOjpIVE1MKQ0KDQp0aXRsZSA8LSB0YWdzJGRpdiggSFRNTCgnPGZvbnQgY29sb3IgPSAicHVycGxlIiBzaXplID01PjxiPjIwMjMgUGhpbGx5IENyaW1lIExvY2F0aW9uczwvYj48L2ZvbnQ+JykpDQoNCiBBbm5vdGF0IDwtIHRhZ3MkZGl2KEhUTUwoJzxjZW50ZXI+PGZvbnQgY29sb3IgPSAiYmx1ZSIgc2l6ZSA9Mz5UaGUgY2lyY2xlIHNpemVzIGFyZSBwcm9wb3J0aW9uYWwgdG8gdGhlIGFnZXM8L2ZvbnQ+JykpDQoNCg0KbGVhZmxldChwaGlseTIwMjMpICU+JQ0KICBhZGRUaWxlcygpICU+JSANCiAgc2V0VmlldyhsbmcgPSBtZWFuKHBoaWx5MjAyMyRsbmcpLCBsYXQ9bWVhbihwaGlseTIwMjMkbGF0KSwgem9vbSA9IDE1KSAlPiUNCiAgYWRkQ2lyY2xlTWFya2VycygNCiAgICAgICAgICAgIH5sbmcsIA0KICAgICAgICAgICAgfmxhdCwNCiAgICAgICAgICAgIGNvbG9yID0gcGhpbGNvbG9yLA0KICAgICAgICAgICAgZmlsbENvbG9yID0gaWZlbHNlKHBoaWx5MjAyMyRmYXRhbCA9PSAiTm9uZmF0YWwiLCAiI2ZmZmY2NiIsICIjZmY5OWZmIiksDQogICAgICAgICAgICByYWRpdXMgPSB+KHBoaWx5MjAyMyRhZ2UvMTApKjIsDQogICAgICAgICAgICBvcGFjaXR5ID0gMSwNCiAgICAgICAgICAgIyBzdHJva2UgPSBGQUxTRSwgDQogICAgICAgICAgIGZpbGxPcGFjaXR5ID0gMC4yNSwNCiAgICAgICAgICAgIGxhYmVsID0gfmxhYmVscyApICU+JQ0KICANCiAgYWRkTGVnZW5kKHBvc2l0aW9uID0gImJvdHRvbXJpZ2h0IiwgDQogICAgICAgICAgICBjb2xvcnMgPSBjKCIjMDA3MkIyIiwgIiNENTVFMDAiKSwNCiAgICAgICAgICAgIGxhYmVscz0gYygiTm9uZmF0YWwiLCAiRmF0YWwiKSwNCiAgICAgICAgICAgIHRpdGxlPSAiQ3JpbWUgVHlwZSIsDQogICAgICAgICAgICBvcGFjaXR5ID0gMC41KSU+JQ0KIGFkZENvbnRyb2wodGl0bGUsIHBvc2l0aW9uID0gInRvcHJpZ2h0IiwgY2xhc3NOYW1lID0gIm1hcC10aXRsZSIpJT4lDQogIGFkZENvbnRyb2woQW5ub3RhdCwgcG9zaXRpb24gPSAiYm90dG9tbGVmdCIpJT4lDQoNCmFkZExlZ2VuZFNpemUocG9zaXRpb24gPSAnYm90dG9tcmlnaHQnLCANCiAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IChwaGlseTIwMjMkYWdlLzEwKSoyLA0KICAgICAgICAgICAgICAgICAgIGNvbG9yID0gJ2dyYXknLA0KICAgICAgICAgICAgICAgZmlsbENvbG9yID0gJ2dyYXknLA0KICAgICAgICAgICAgICAgICBvcGFjaXR5ID0gLjUsDQogICAgICAgICAgICAgICAgICAgdGl0bGUgPSAnQWdlJywNCiAgICAgICAgICAgICAgICAgICBzaGFwZSA9ICdjaXJjbGUnLA0KICAgICAgICAgICAgIG9yaWVudGF0aW9uID0gJ3ZlcnRpY2FsJywNCiAgICAgICAgICAgICAgICAgIGJyZWFrcyA9IDQpDQoNCmBgYA0KDQojIyBNYXAgSW50ZXJwcmV0YXRpb24NClRoZSBtYXAgYWJvdmUgc2hvd3MgdmFyaW91cyBjcmltZSBsb2NhdGlvbnMgaW4gUGhpbGFkZWxwaGlhIHdpdGggb3JhbmdlIGNpcmNsZXMgcmVwcmVzZW50aW5nIGZhdGFsIGNyaW1lcyBhbmQgYmx1ZSBjaXJjbGVzIHJlcHJlc2VudGluZyBub25mYXRhbCBjcmltZXMuIEZyb20gdGhlIHBsb3QsIGl0IGlzIGNsZWFyIHRoYXQgaW4gMjAyMywgdGhlcmUgd2VyZSBtb3JlIG5vbmZhdGFsIGNhc2VzIHRoYW4gZmF0YWwgb25lcy4gVGhlIGNpcmNsZSBzaXplcyBhcmUgcHJvcG9ydGlvbmFsIHRvIHRoZSBhZ2VzIG9uIHRoZSBkYXRhc2V0LiBNb3N0IG9mIHRoZSBmYXRhbCBjcmltZXMgYXJlIGFzc29jaWF0ZWQgd2l0aCB5b3VuZ2VyIGFnZXMuIE1ham9yaXR5IG9mIGNyaW1lIGNhc2VzIGFyZSBzZWVuIGluIE5vcnRoIFBoaWxhZGVscGhpYS4NCg0KDQoNCg0KDQoNCg0KDQoNCg0K