Import data with (WF) PM2.5 for California ZIP codes (2006-2021) Subset for Southern California
library(dplyr);
load("~/UCSD-Scripps/R Files 2022/WF sub-chronic/wfpm25_06t021.RData")
length(unique(wfpm25$zip))
wfpm25$wf_pm25_gt0 <- ifelse(wfpm25$wf_pm25_imp > 0, wfpm25$wf_pm25_imp, NA)
wfpm25$smoke_gt0 <- ifelse(wfpm25$smoke_intersect > 0, wfpm25$smoke_intersect, NA)
Calculate moving averages (WF PM2.5) for 3 and 5 years, and 1-year rolling sum of smoke days
library(zoo);
wf_subchronic <- wfpm25 %>%
group_by(zip) %>%
arrange(zip, date) %>%
mutate(smokeday_sum_1yr = zoo::rollapply(smoke_gt0, 365, sum, fill = NA, na.rm = TRUE,
align = "right", partial = TRUE),
wfpm25gt0_mean_3yr = zoo::rollapply(wf_pm25_gt0, 1095, mean, fill = NA, na.rm = TRUE,
align = "right", partial = TRUE),
wfpm25gt0_mean_5yr = zoo::rollapply(wf_pm25_gt0, 1825, mean, fill = NA, na.rm = TRUE,
align = "right", partial = TRUE)) #,
wf_subchronic$wfpm25gt0_mean_5yr[is.na(wf_subchronic$wfpm25gt0_mean_5yr)] = 0
wf_subchronic$wfpm25gt0_mean_5yr[is.na(wf_subchronic$wfpm25gt0_mean_5yr)] = 0
Pick one date as an example: March 19 2020
library(sf);
library(ggplot2);
setwd("C:/Users/Rosana/Documents/UCSD-Scripps/R Files 2022/WF sub-chronic/CAzip")
zipCA <- st_read(dsn = ".", layer = "USPS_zipCA_byESRI")
ca.data <- ggplot2::fortify(zipCA, region='ZIPCODE') # shp to df
region <- st_union(ca.data) # shp for state boundary
Merge ZIP code polygons and Wildfire Data Mean Wildfire PM2.5 for the last 5 years on March 19, 2020
one.date <- wfpm25_5yr[wfpm25_5yr$date == "2020-03-19", ]
ca.map <- merge(ca.data, one.date, by.x = "ZIPCODE", by.y = "zip", all.x = TRUE)
my.col <- c("#FFFE9E", "#F69422", "#C53270", "#611163", "#040404")
zip <- ggplot(ca.map) +
geom_sf(size = 0.1, color = NA, aes(fill= wfpm25gt0_mean_5yr)) +
ggtitle(expression(bold(paste("5-year Mean Wildfire ", PM[2.5], " (",mu, "g ", m^bold("-3"),") for March 19, 2020", )))) +
theme(plot.title = element_text(hjust = 0.5)) + # center title
scale_fill_gradientn(colours = my.col, na.value = "light grey", limits = c(0,45)) +
theme(legend.key.size = unit(0.5, "cm"), legend.key.height= unit(1,"cm") ) +
theme(plot.title = element_text(size=14, face="bold")) +
theme(legend.text=element_text(size=12, face="bold")) +
theme(axis.title.x=element_blank(), axis.title.y=element_blank()) +
theme(legend.position="right") + theme(legend.title = element_blank()) +
labs(subtitle = (expression(bold(paste("(averaged for days when WF " , PM[2.5], "> 0)")))),
caption = "Unpopulated areas shown in gray") +
theme(plot.subtitle=element_text(size=12, hjust=0.5, face="italic", color="black")) +
theme(
# Hide panel borders and remove grid lines
panel.border = element_rect(colour = "black", fill= "NA"),
panel.grid.major = element_blank(),
panel.grid.minor = element_blank(),
panel.background = element_rect(fill = "white", colour = NA)) +
theme(axis.title.x=element_blank(),
axis.text.x=element_blank(),
axis.ticks.x=element_blank()) +
theme(axis.text.y=element_blank(), axis.ticks.y=element_blank()) +
theme(plot.caption = element_text(hjust = 0.5, size = 12, face= "italic"))
zip

Sum of Smoke Days for the last 1 year on October 1, 2008
another.date <- wfpm25_5yr[wfpm25_5yr$date == "2008-10-01", ]
ca.map <- merge(ca.data, another.date, by.x = "ZIPCODE", by.y = "zip", all.x = TRUE)
my.col <- c("#FFFE9E", "#F69422", "#C53270", "#611163", "#040404")
smoke <- ggplot(ca.map) +
geom_sf(size = 0.1, color = NA, aes(fill= smokeday_sum_1yr)) +
ggtitle("1-year Sum of Smoke Days for October 10, 2008") +
theme(plot.title = element_text(hjust = 0.5)) + # center title
scale_fill_gradientn(colours = my.col, na.value = "light grey", limits = c(0,105)) +
theme(legend.key.size = unit(0.5, "cm"), legend.key.height= unit(1,"cm") ) +
theme(plot.title = element_text(size=14, face="bold")) +
theme(legend.text=element_text(size=12, face="bold")) +
theme(axis.title.x=element_blank(), axis.title.y=element_blank()) +
theme(legend.position="right") + theme(legend.title = element_blank()) +
labs(caption = "Unpopulated areas shown in gray") +
theme(plot.subtitle=element_text(size=12, hjust=0.5, face="italic", color="black")) +
theme(
# Hide panel borders and remove grid lines
panel.border = element_rect(colour = "black", fill= "NA"),
panel.grid.major = element_blank(),
panel.grid.minor = element_blank(),
panel.background = element_rect(fill = "white", colour = NA)) +
theme(axis.title.x=element_blank(),
axis.text.x=element_blank(),
axis.ticks.x=element_blank()) +
theme(axis.text.y=element_blank(), axis.ticks.y=element_blank()) +
theme(plot.caption = element_text(hjust = 0.5, size = 12, face= "italic"))
smoke

Mean Wildfire PM2.5 for the last 3 years on September 1, 2012
yet.another.date <- wf_subchronic[wf_subchronic$date == "2012-09-01", ]
ca.map <- merge(ca.data, yet.another.date, by.x = "ZIPCODE", by.y = "zip", all.x = TRUE)
my.col <- c("#FFFE9E", "#F69422", "#C53270", "#611163", "#040404")
wf <- ggplot(ca.map) +
geom_sf(size = 0.1, color = NA, aes(fill= wfpm25gt0_mean_3yr)) +
ggtitle(expression(bold(paste("3-year Mean Wildfire ", PM[2.5], " (",mu, "g ", m^bold("-3"),") for September 1, 2012", )))) +
theme(plot.title = element_text(hjust = 0.5)) + # center title
scale_fill_gradientn(colours = my.col, na.value = "light grey", limits = c(0,10)) +
theme(legend.key.size = unit(0.5, "cm"), legend.key.height= unit(1,"cm") ) +
theme(plot.title = element_text(size=14, face="bold")) +
theme(legend.text=element_text(size=12, face="bold")) +
theme(axis.title.x=element_blank(), axis.title.y=element_blank()) +
theme(legend.position="right") + theme(legend.title = element_blank()) +
labs(subtitle = (expression(bold(paste("(averaged for days when WF " , PM[2.5], "> 0)")))),
caption = "Unpopulated areas shown in gray") +
theme(plot.subtitle=element_text(size=12, hjust=0.5, face="italic", color="black")) +
theme(
# Hide panel borders and remove grid lines
panel.border = element_rect(colour = "black", fill= "NA"),
panel.grid.major = element_blank(),
panel.grid.minor = element_blank(),
panel.background = element_rect(fill = "white", colour = NA)) +
theme(axis.title.x=element_blank(),
axis.text.x=element_blank(),
axis.ticks.x=element_blank()) +
theme(axis.text.y=element_blank(), axis.ticks.y=element_blank()) +
theme(plot.caption = element_text(hjust = 0.5, size = 12, face= "italic"))
wf

LS0tDQp0aXRsZTogIldGIHN1Yi1jaHJvbmljIGV4cG9zdXJlIg0Kb3V0cHV0OiBodG1sX25vdGVib29rDQotLS0NCg0KSW1wb3J0IGRhdGEgd2l0aCAoV0YpIFBNMi41IGZvciBDYWxpZm9ybmlhIFpJUCBjb2RlcyAoMjAwNi0yMDIxKQ0KU3Vic2V0IGZvciBTb3V0aGVybiBDYWxpZm9ybmlhDQoNCmBgYHtyfQ0KbGlicmFyeShkcGx5cik7DQoNCmxvYWQoIn4vVUNTRC1TY3JpcHBzL1IgRmlsZXMgMjAyMi9XRiBzdWItY2hyb25pYy93ZnBtMjVfMDZ0MDIxLlJEYXRhIikNCg0KbGVuZ3RoKHVuaXF1ZSh3ZnBtMjUkemlwKSkNCg0Kd2ZwbTI1JHdmX3BtMjVfZ3QwIDwtIGlmZWxzZSh3ZnBtMjUkd2ZfcG0yNV9pbXAgPiAwLCB3ZnBtMjUkd2ZfcG0yNV9pbXAsIE5BKQ0Kd2ZwbTI1JHNtb2tlX2d0MCA8LSBpZmVsc2Uod2ZwbTI1JHNtb2tlX2ludGVyc2VjdCA+IDAsIHdmcG0yNSRzbW9rZV9pbnRlcnNlY3QsIE5BKQ0KDQpgYGANCg0KQ2FsY3VsYXRlIG1vdmluZyBhdmVyYWdlcyAoV0YgUE0yLjUpIGZvciAzIGFuZCA1IHllYXJzLCBhbmQgMS15ZWFyIHJvbGxpbmcgc3VtIG9mIHNtb2tlIGRheXMNCg0KYGBge3J9DQpsaWJyYXJ5KHpvbyk7DQoNCndmX3N1YmNocm9uaWMgPC0gd2ZwbTI1ICU+JQ0KICAgIGdyb3VwX2J5KHppcCkgJT4lIA0KICAgIGFycmFuZ2UoemlwLCBkYXRlKSAlPiUNCiAgICBtdXRhdGUoc21va2VkYXlfc3VtXzF5ciA9IHpvbzo6cm9sbGFwcGx5KHNtb2tlX2d0MCwgMzY1LCBzdW0sIGZpbGwgPSBOQSwgbmEucm0gPSBUUlVFLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsaWduID0gInJpZ2h0IiwgcGFydGlhbCA9IFRSVUUpLA0KICAgICAgICAgICB3ZnBtMjVndDBfbWVhbl8zeXIgPSB6b286OnJvbGxhcHBseSh3Zl9wbTI1X2d0MCwgMTA5NSwgbWVhbiwgZmlsbCA9IE5BLCBuYS5ybSA9IFRSVUUsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGlnbiA9ICJyaWdodCIsIHBhcnRpYWwgPSBUUlVFKSwNCiAgICAgICAgICAgd2ZwbTI1Z3QwX21lYW5fNXlyID0gem9vOjpyb2xsYXBwbHkod2ZfcG0yNV9ndDAsIDE4MjUsIG1lYW4sIGZpbGwgPSBOQSwgbmEucm0gPSBUUlVFLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxpZ24gPSAicmlnaHQiLCBwYXJ0aWFsID0gVFJVRSkpICMsDQoNCndmX3N1YmNocm9uaWMkd2ZwbTI1Z3QwX21lYW5fNXlyW2lzLm5hKHdmX3N1YmNocm9uaWMkd2ZwbTI1Z3QwX21lYW5fNXlyKV0gPSAwDQp3Zl9zdWJjaHJvbmljJHdmcG0yNWd0MF9tZWFuXzV5cltpcy5uYSh3Zl9zdWJjaHJvbmljJHdmcG0yNWd0MF9tZWFuXzV5cildID0gMA0KDQpgYGANClBpY2sgb25lIGRhdGUgYXMgYW4gZXhhbXBsZToNCk1hcmNoIDE5IDIwMjANCg0KYGBge3J9DQpsaWJyYXJ5KHNmKTsNCmxpYnJhcnkoZ2dwbG90Mik7DQoNCnNldHdkKCJDOi9Vc2Vycy9Sb3NhbmEvRG9jdW1lbnRzL1VDU0QtU2NyaXBwcy9SIEZpbGVzIDIwMjIvV0Ygc3ViLWNocm9uaWMvQ0F6aXAiKQ0KemlwQ0EgPC0gc3RfcmVhZChkc24gPSAiLiIsIGxheWVyID0gIlVTUFNfemlwQ0FfYnlFU1JJIikNCg0KY2EuZGF0YSA8LSBnZ3Bsb3QyOjpmb3J0aWZ5KHppcENBLCByZWdpb249J1pJUENPREUnKSAjIHNocCB0byBkZg0KDQpyZWdpb24gPC0gc3RfdW5pb24oY2EuZGF0YSkgIyBzaHAgZm9yIHN0YXRlIGJvdW5kYXJ5DQpgYGANCg0KTWVyZ2UgWklQIGNvZGUgcG9seWdvbnMgYW5kIFdpbGRmaXJlIERhdGEgDQpNZWFuIFdpbGRmaXJlIFBNMi41IGZvciB0aGUgbGFzdCA1IHllYXJzIG9uIE1hcmNoIDE5LCAyMDIwDQpgYGB7cn0NCg0Kb25lLmRhdGUgPC0gd2Zfc3ViY2hyb25pY1t3Zl9zdWJjaHJvbmljJGRhdGUgPT0gIjIwMjAtMDMtMTkiLCBdDQoNCmNhLm1hcCA8LSBtZXJnZShjYS5kYXRhLCBvbmUuZGF0ZSwgYnkueCA9ICJaSVBDT0RFIiwgYnkueSA9ICJ6aXAiLCBhbGwueCA9IFRSVUUpDQoNCm15LmNvbCA8LSBjKCIjRkZGRTlFIiwgIiNGNjk0MjIiLCAiI0M1MzI3MCIsICIjNjExMTYzIiwgIiMwNDA0MDQiKQ0KDQp6aXAgPC0gZ2dwbG90KGNhLm1hcCkgKw0KICBnZW9tX3NmKHNpemUgPSAwLjEsIGNvbG9yID0gTkEsIGFlcyhmaWxsPSB3ZnBtMjVndDBfbWVhbl81eXIpKSArICANCiAgZ2d0aXRsZShleHByZXNzaW9uKGJvbGQocGFzdGUoIjUteWVhciBNZWFuIFdpbGRmaXJlICIsIFBNWzIuNV0sICIgKCIsbXUsICJnICIsIG1eYm9sZCgiLTMiKSwiKSBmb3IgTWFyY2ggMTksIDIwMjAiLCApKSkpICsgDQogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpKSArICAjIGNlbnRlciB0aXRsZQ0KICBzY2FsZV9maWxsX2dyYWRpZW50bihjb2xvdXJzID0gbXkuY29sLCBuYS52YWx1ZSA9ICJsaWdodCBncmV5IiwgbGltaXRzID0gYygwLDQ1KSkgKw0KICANCiAgdGhlbWUobGVnZW5kLmtleS5zaXplID0gdW5pdCgwLjUsICJjbSIpLCBsZWdlbmQua2V5LmhlaWdodD0gdW5pdCgxLCJjbSIpICkgKw0KICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTQsIGZhY2U9ImJvbGQiKSkgKyANCiAgdGhlbWUobGVnZW5kLnRleHQ9ZWxlbWVudF90ZXh0KHNpemU9MTIsIGZhY2U9ImJvbGQiKSkgKw0KICB0aGVtZShheGlzLnRpdGxlLng9ZWxlbWVudF9ibGFuaygpLCBheGlzLnRpdGxlLnk9ZWxlbWVudF9ibGFuaygpKSArDQogIA0KICB0aGVtZShsZWdlbmQucG9zaXRpb249InJpZ2h0IikgKyB0aGVtZShsZWdlbmQudGl0bGUgPSBlbGVtZW50X2JsYW5rKCkpICsNCiAgbGFicyhzdWJ0aXRsZSA9IChleHByZXNzaW9uKGJvbGQocGFzdGUoIihhdmVyYWdlZCBmb3IgZGF5cyB3aGVuIFdGICIgLCBQTVsyLjVdLCAiPiAwKSIpKSkpLCANCiAgICAgICBjYXB0aW9uID0gIlVucG9wdWxhdGVkIGFyZWFzIHNob3duIGluIGdyYXkiKSArDQogIHRoZW1lKHBsb3Quc3VidGl0bGU9ZWxlbWVudF90ZXh0KHNpemU9MTIsIGhqdXN0PTAuNSwgZmFjZT0iaXRhbGljIiwgY29sb3I9ImJsYWNrIikpICsNCiAgdGhlbWUoDQogICAgIyBIaWRlIHBhbmVsIGJvcmRlcnMgYW5kIHJlbW92ZSBncmlkIGxpbmVzDQogICAgcGFuZWwuYm9yZGVyID0gZWxlbWVudF9yZWN0KGNvbG91ciA9ICJibGFjayIsIGZpbGw9ICJOQSIpLA0KICAgIHBhbmVsLmdyaWQubWFqb3IgPSBlbGVtZW50X2JsYW5rKCksDQogICAgcGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKSwgDQogICAgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gIndoaXRlIiwgY29sb3VyID0gTkEpKSArDQogIHRoZW1lKGF4aXMudGl0bGUueD1lbGVtZW50X2JsYW5rKCksDQogICAgICAgIGF4aXMudGV4dC54PWVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgYXhpcy50aWNrcy54PWVsZW1lbnRfYmxhbmsoKSkgKw0KICB0aGVtZShheGlzLnRleHQueT1lbGVtZW50X2JsYW5rKCksIGF4aXMudGlja3MueT1lbGVtZW50X2JsYW5rKCkpICsNCiAgdGhlbWUocGxvdC5jYXB0aW9uID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41LCBzaXplID0gMTIsIGZhY2U9ICJpdGFsaWMiKSkNCg0KemlwDQpgYGANClN1bSBvZiBTbW9rZSBEYXlzIGZvciB0aGUgbGFzdCAxIHllYXIgb24gT2N0b2JlciAxLCAyMDA4DQpgYGB7cn0NCg0KYW5vdGhlci5kYXRlIDwtIHdmX3N1YmNocm9uaWNbd2Zfc3ViY2hyb25pYyRkYXRlID09ICIyMDA4LTEwLTAxIiwgXQ0KDQpjYS5tYXAgPC0gbWVyZ2UoY2EuZGF0YSwgYW5vdGhlci5kYXRlLCBieS54ID0gIlpJUENPREUiLCBieS55ID0gInppcCIsIGFsbC54ID0gVFJVRSkNCg0KbXkuY29sIDwtIGMoIiNGRkZFOUUiLCAiI0Y2OTQyMiIsICIjQzUzMjcwIiwgIiM2MTExNjMiLCAiIzA0MDQwNCIpDQoNCnNtb2tlIDwtIGdncGxvdChjYS5tYXApICsNCiAgZ2VvbV9zZihzaXplID0gMC4xLCBjb2xvciA9IE5BLCBhZXMoZmlsbD0gc21va2VkYXlfc3VtXzF5cikpICsgIA0KICBnZ3RpdGxlKCIxLXllYXIgU3VtIG9mIFNtb2tlIERheXMgZm9yIE9jdG9iZXIgMTAsIDIwMDgiKSArIA0KICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkgKyAgIyBjZW50ZXIgdGl0bGUNCiAgc2NhbGVfZmlsbF9ncmFkaWVudG4oY29sb3VycyA9IG15LmNvbCwgbmEudmFsdWUgPSAibGlnaHQgZ3JleSIsIGxpbWl0cyA9IGMoMCwxMDUpKSArDQogIA0KICB0aGVtZShsZWdlbmQua2V5LnNpemUgPSB1bml0KDAuNSwgImNtIiksIGxlZ2VuZC5rZXkuaGVpZ2h0PSB1bml0KDEsImNtIikgKSArDQogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0xNCwgZmFjZT0iYm9sZCIpKSArIA0KICB0aGVtZShsZWdlbmQudGV4dD1lbGVtZW50X3RleHQoc2l6ZT0xMiwgZmFjZT0iYm9sZCIpKSArDQogIHRoZW1lKGF4aXMudGl0bGUueD1lbGVtZW50X2JsYW5rKCksIGF4aXMudGl0bGUueT1lbGVtZW50X2JsYW5rKCkpICsNCiAgDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0icmlnaHQiKSArIHRoZW1lKGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfYmxhbmsoKSkgKw0KICBsYWJzKGNhcHRpb24gPSAiVW5wb3B1bGF0ZWQgYXJlYXMgc2hvd24gaW4gZ3JheSIpICsNCiAgdGhlbWUocGxvdC5zdWJ0aXRsZT1lbGVtZW50X3RleHQoc2l6ZT0xMiwgaGp1c3Q9MC41LCBmYWNlPSJpdGFsaWMiLCBjb2xvcj0iYmxhY2siKSkgKw0KICB0aGVtZSgNCiAgICAjIEhpZGUgcGFuZWwgYm9yZGVycyBhbmQgcmVtb3ZlIGdyaWQgbGluZXMNCiAgICBwYW5lbC5ib3JkZXIgPSBlbGVtZW50X3JlY3QoY29sb3VyID0gImJsYWNrIiwgZmlsbD0gIk5BIiksDQogICAgcGFuZWwuZ3JpZC5tYWpvciA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICBwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpLCANCiAgICBwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAid2hpdGUiLCBjb2xvdXIgPSBOQSkpICsNCiAgdGhlbWUoYXhpcy50aXRsZS54PWVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgYXhpcy50ZXh0Lng9ZWxlbWVudF9ibGFuaygpLA0KICAgICAgICBheGlzLnRpY2tzLng9ZWxlbWVudF9ibGFuaygpKSArDQogIHRoZW1lKGF4aXMudGV4dC55PWVsZW1lbnRfYmxhbmsoKSwgYXhpcy50aWNrcy55PWVsZW1lbnRfYmxhbmsoKSkgKw0KICB0aGVtZShwbG90LmNhcHRpb24gPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUsIHNpemUgPSAxMiwgZmFjZT0gIml0YWxpYyIpKQ0KDQpzbW9rZQ0KYGBgDQpNZWFuIFdpbGRmaXJlIFBNMi41IGZvciB0aGUgbGFzdCAzIHllYXJzIG9uIFNlcHRlbWJlciAxLCAyMDEyDQoNCmBgYHtyfQ0KeWV0LmFub3RoZXIuZGF0ZSA8LSB3Zl9zdWJjaHJvbmljW3dmX3N1YmNocm9uaWMkZGF0ZSA9PSAiMjAxMi0wOS0wMSIsIF0NCg0KY2EubWFwIDwtIG1lcmdlKGNhLmRhdGEsIHlldC5hbm90aGVyLmRhdGUsIGJ5LnggPSAiWklQQ09ERSIsIGJ5LnkgPSAiemlwIiwgYWxsLnggPSBUUlVFKQ0KDQpteS5jb2wgPC0gYygiI0ZGRkU5RSIsICIjRjY5NDIyIiwgIiNDNTMyNzAiLCAiIzYxMTE2MyIsICIjMDQwNDA0IikNCg0Kd2YgPC0gZ2dwbG90KGNhLm1hcCkgKw0KICBnZW9tX3NmKHNpemUgPSAwLjEsIGNvbG9yID0gTkEsIGFlcyhmaWxsPSAgd2ZwbTI1Z3QwX21lYW5fM3lyKSkgKyAgDQogIGdndGl0bGUoZXhwcmVzc2lvbihib2xkKHBhc3RlKCIzLXllYXIgTWVhbiBXaWxkZmlyZSAiLCBQTVsyLjVdLCAiICgiLG11LCAiZyAiLCBtXmJvbGQoIi0zIiksIikgZm9yIFNlcHRlbWJlciAxLCAyMDEyIiwgKSkpKSArIA0KICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkgKyAgIyBjZW50ZXIgdGl0bGUNCiAgc2NhbGVfZmlsbF9ncmFkaWVudG4oY29sb3VycyA9IG15LmNvbCwgbmEudmFsdWUgPSAibGlnaHQgZ3JleSIsIGxpbWl0cyA9IGMoMCwxMCkpICsNCiAgDQogIHRoZW1lKGxlZ2VuZC5rZXkuc2l6ZSA9IHVuaXQoMC41LCAiY20iKSwgbGVnZW5kLmtleS5oZWlnaHQ9IHVuaXQoMSwiY20iKSApICsNCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTE0LCBmYWNlPSJib2xkIikpICsgDQogIHRoZW1lKGxlZ2VuZC50ZXh0PWVsZW1lbnRfdGV4dChzaXplPTEyLCBmYWNlPSJib2xkIikpICsNCiAgdGhlbWUoYXhpcy50aXRsZS54PWVsZW1lbnRfYmxhbmsoKSwgYXhpcy50aXRsZS55PWVsZW1lbnRfYmxhbmsoKSkgKw0KICANCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJyaWdodCIpICsgdGhlbWUobGVnZW5kLnRpdGxlID0gZWxlbWVudF9ibGFuaygpKSArDQogIGxhYnMoc3VidGl0bGUgPSAoZXhwcmVzc2lvbihib2xkKHBhc3RlKCIoYXZlcmFnZWQgZm9yIGRheXMgd2hlbiBXRiAiICwgUE1bMi41XSwgIj4gMCkiKSkpKSwgDQogICAgICAgY2FwdGlvbiA9ICJVbnBvcHVsYXRlZCBhcmVhcyBzaG93biBpbiBncmF5IikgKw0KICB0aGVtZShwbG90LnN1YnRpdGxlPWVsZW1lbnRfdGV4dChzaXplPTEyLCBoanVzdD0wLjUsIGZhY2U9Iml0YWxpYyIsIGNvbG9yPSJibGFjayIpKSArDQogIHRoZW1lKA0KICAgICMgSGlkZSBwYW5lbCBib3JkZXJzIGFuZCByZW1vdmUgZ3JpZCBsaW5lcw0KICAgIHBhbmVsLmJvcmRlciA9IGVsZW1lbnRfcmVjdChjb2xvdXIgPSAiYmxhY2siLCBmaWxsPSAiTkEiKSwNCiAgICBwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9ibGFuaygpLA0KICAgIHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2JsYW5rKCksIA0KICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJ3aGl0ZSIsIGNvbG91ciA9IE5BKSkgKw0KICB0aGVtZShheGlzLnRpdGxlLng9ZWxlbWVudF9ibGFuaygpLA0KICAgICAgICBheGlzLnRleHQueD1lbGVtZW50X2JsYW5rKCksDQogICAgICAgIGF4aXMudGlja3MueD1lbGVtZW50X2JsYW5rKCkpICsNCiAgdGhlbWUoYXhpcy50ZXh0Lnk9ZWxlbWVudF9ibGFuaygpLCBheGlzLnRpY2tzLnk9ZWxlbWVudF9ibGFuaygpKSArDQogIHRoZW1lKHBsb3QuY2FwdGlvbiA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSwgc2l6ZSA9IDEyLCBmYWNlPSAiaXRhbGljIikpDQoNCndmDQpgYGANCg0KDQoNCg==