Read Data
v19_Profile <- load_variables(2019,
"acs5/profile",
cache = TRUE)
v14_Profile <- load_variables(2014,
"acs5/profile",
cache = TRUE)#demographic
#Search for variables by using grep()
v19_Profile[grep(x = v19_Profile$label,
"Educational Attainment",
ignore.case = TRUE),
c("name", "label")]
v19_Profile[grep(x = v19_Profile$label,
"Hispanic and Race",
ignore.case = TRUE),
c("name", "label")]
v19_Profile[grep(x = v19_Profile$label,
"Sex and Age",
ignore.case = TRUE),
c("name", "label")]
v14_Profile[grep(x = v14_Profile$label,
"Educational Attainment",
ignore.case = TRUE),
c("name", "label")]
v14_Profile[grep(x = v14_Profile$label,
"Hispanic and Race",
ignore.case = TRUE),
c("name", "label")]
v14_Profile[grep(x = v14_Profile$label,
"Sex and Age",
ignore.case = TRUE),
c("name", "label")]
educ14<-get_acs(geography = 'county',
state ='TX',
year = 2014,
variables = c(peduc14 = "DP02_0066P",
male = "DP05_0002P",
hispanic = "DP05_0066P",
nh_white = "DP05_0072P",
nh_black = "DP05_0073P"),
geometry = T, output = "wide")
## Getting data from the 2010-2014 5-year ACS
## Downloading feature geometry from the Census website. To cache shapefiles for use in future sessions, set `options(tigris_use_cache = TRUE)`.
## Using the ACS Data Profile
##
|
| | 0%
|
| | 1%
|
|= | 1%
|
|= | 2%
|
|== | 2%
|
|== | 3%
|
|=== | 4%
|
|=== | 5%
|
|==== | 5%
|
|==== | 6%
|
|===== | 7%
|
|===== | 8%
|
|====== | 8%
|
|====== | 9%
|
|======= | 9%
|
|======= | 10%
|
|======= | 11%
|
|======== | 11%
|
|======== | 12%
|
|========= | 12%
|
|========= | 13%
|
|========= | 14%
|
|========== | 14%
|
|========== | 15%
|
|=========== | 15%
|
|=========== | 16%
|
|============ | 16%
|
|============ | 17%
|
|============ | 18%
|
|============= | 18%
|
|============= | 19%
|
|============== | 19%
|
|============== | 20%
|
|============== | 21%
|
|=============== | 21%
|
|=============== | 22%
|
|================ | 22%
|
|================ | 23%
|
|================= | 24%
|
|================= | 25%
|
|================== | 25%
|
|================== | 26%
|
|=================== | 27%
|
|=================== | 28%
|
|==================== | 28%
|
|==================== | 29%
|
|===================== | 29%
|
|===================== | 30%
|
|===================== | 31%
|
|====================== | 31%
|
|====================== | 32%
|
|======================= | 32%
|
|======================= | 33%
|
|======================= | 34%
|
|======================== | 34%
|
|======================== | 35%
|
|========================= | 35%
|
|========================= | 36%
|
|========================== | 36%
|
|========================== | 37%
|
|========================== | 38%
|
|=========================== | 38%
|
|=========================== | 39%
|
|============================ | 39%
|
|============================ | 40%
|
|============================ | 41%
|
|============================= | 41%
|
|============================= | 42%
|
|============================== | 42%
|
|============================== | 43%
|
|=============================== | 44%
|
|=============================== | 45%
|
|================================ | 45%
|
|================================ | 46%
|
|================================= | 46%
|
|================================= | 47%
|
|================================= | 48%
|
|================================== | 48%
|
|================================== | 49%
|
|=================================== | 49%
|
|=================================== | 50%
|
|=================================== | 51%
|
|==================================== | 51%
|
|==================================== | 52%
|
|===================================== | 52%
|
|===================================== | 53%
|
|===================================== | 54%
|
|====================================== | 54%
|
|====================================== | 55%
|
|======================================= | 55%
|
|======================================= | 56%
|
|======================================== | 57%
|
|======================================== | 58%
|
|========================================= | 58%
|
|========================================= | 59%
|
|========================================== | 59%
|
|========================================== | 60%
|
|========================================== | 61%
|
|=========================================== | 61%
|
|=========================================== | 62%
|
|============================================ | 62%
|
|============================================ | 63%
|
|============================================= | 64%
|
|============================================= | 65%
|
|============================================== | 65%
|
|============================================== | 66%
|
|=============================================== | 67%
|
|=============================================== | 68%
|
|================================================ | 68%
|
|================================================ | 69%
|
|================================================= | 69%
|
|================================================= | 70%
|
|================================================== | 71%
|
|================================================== | 72%
|
|=================================================== | 72%
|
|=================================================== | 73%
|
|=================================================== | 74%
|
|==================================================== | 74%
|
|==================================================== | 75%
|
|===================================================== | 75%
|
|===================================================== | 76%
|
|====================================================== | 77%
|
|====================================================== | 78%
|
|======================================================= | 78%
|
|======================================================= | 79%
|
|======================================================== | 79%
|
|======================================================== | 80%
|
|======================================================== | 81%
|
|========================================================= | 81%
|
|========================================================= | 82%
|
|========================================================== | 82%
|
|========================================================== | 83%
|
|========================================================== | 84%
|
|=========================================================== | 84%
|
|=========================================================== | 85%
|
|============================================================ | 85%
|
|============================================================ | 86%
|
|============================================================= | 86%
|
|============================================================= | 87%
|
|============================================================= | 88%
|
|============================================================== | 88%
|
|============================================================== | 89%
|
|=============================================================== | 89%
|
|=============================================================== | 90%
|
|=============================================================== | 91%
|
|================================================================ | 91%
|
|================================================================ | 92%
|
|================================================================= | 92%
|
|================================================================= | 93%
|
|================================================================== | 94%
|
|================================================================== | 95%
|
|=================================================================== | 95%
|
|=================================================================== | 96%
|
|==================================================================== | 97%
|
|==================================================================== | 98%
|
|===================================================================== | 98%
|
|===================================================================== | 99%
|
|======================================================================| 99%
|
|======================================================================| 100%
#rename variables and filter missing cases
educ14 <- educ14%>%
mutate(peduc14 = peduc14E,
peduc14_er = peduc14M/1.645,
peduc14_cv =100* (peduc14_er/peduc14),
male = maleE,
female = 100 - male,
hispanic = hispanicE,
nh_white = nh_whiteE,
nh_black = nh_blackE) %>%
filter(complete.cases(peduc14), is.finite(peduc14_cv)==T)%>%
select(GEOID, NAME, peduc14, peduc14_er,peduc14_cv, male, female, hispanic,nh_white,nh_black)
head(educ14)
educ19<-get_acs(geography = 'county',
state ='TX',
year = 2019,
variables = c(peduc19 = "DP02_0067P",
male = "DP05_0002P",
hispanic = "DP05_0071P",
nh_white = "DP05_0077P",
nh_black = "DP05_0078P"),
geometry = T, output = "wide")
## 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)`.
## Using the ACS Data Profile
##
|
| | 0%
|
| | 1%
|
|= | 1%
|
|= | 2%
|
|== | 2%
|
|== | 3%
|
|== | 4%
|
|=== | 4%
|
|=== | 5%
|
|==== | 5%
|
|==== | 6%
|
|===== | 7%
|
|===== | 8%
|
|====== | 8%
|
|====== | 9%
|
|======= | 9%
|
|======= | 10%
|
|======= | 11%
|
|======== | 11%
|
|======== | 12%
|
|========= | 12%
|
|========= | 13%
|
|========= | 14%
|
|========== | 14%
|
|========== | 15%
|
|=========== | 15%
|
|=========== | 16%
|
|============ | 16%
|
|============ | 17%
|
|============ | 18%
|
|============= | 18%
|
|============= | 19%
|
|============== | 19%
|
|============== | 20%
|
|============== | 21%
|
|=============== | 21%
|
|=============== | 22%
|
|================ | 22%
|
|================ | 23%
|
|================= | 24%
|
|================= | 25%
|
|================== | 25%
|
|================== | 26%
|
|=================== | 26%
|
|=================== | 27%
|
|=================== | 28%
|
|==================== | 28%
|
|==================== | 29%
|
|===================== | 29%
|
|===================== | 30%
|
|===================== | 31%
|
|====================== | 31%
|
|====================== | 32%
|
|======================= | 32%
|
|======================= | 33%
|
|======================= | 34%
|
|======================== | 34%
|
|======================== | 35%
|
|========================= | 35%
|
|========================= | 36%
|
|========================== | 37%
|
|========================== | 38%
|
|=========================== | 38%
|
|=========================== | 39%
|
|============================ | 39%
|
|============================ | 40%
|
|============================ | 41%
|
|============================= | 41%
|
|============================= | 42%
|
|============================== | 42%
|
|============================== | 43%
|
|============================== | 44%
|
|=============================== | 44%
|
|=============================== | 45%
|
|================================ | 45%
|
|================================ | 46%
|
|================================= | 47%
|
|================================= | 48%
|
|================================== | 48%
|
|================================== | 49%
|
|=================================== | 49%
|
|=================================== | 50%
|
|=================================== | 51%
|
|==================================== | 51%
|
|==================================== | 52%
|
|===================================== | 52%
|
|===================================== | 53%
|
|====================================== | 54%
|
|====================================== | 55%
|
|======================================= | 55%
|
|======================================= | 56%
|
|======================================== | 57%
|
|======================================== | 58%
|
|========================================= | 58%
|
|========================================= | 59%
|
|========================================== | 59%
|
|========================================== | 60%
|
|========================================== | 61%
|
|=========================================== | 61%
|
|=========================================== | 62%
|
|============================================ | 62%
|
|============================================ | 63%
|
|============================================= | 64%
|
|============================================= | 65%
|
|============================================== | 65%
|
|============================================== | 66%
|
|=============================================== | 66%
|
|=============================================== | 67%
|
|=============================================== | 68%
|
|================================================ | 68%
|
|================================================ | 69%
|
|================================================= | 69%
|
|================================================= | 70%
|
|================================================= | 71%
|
|================================================== | 71%
|
|================================================== | 72%
|
|=================================================== | 72%
|
|=================================================== | 73%
|
|==================================================== | 74%
|
|==================================================== | 75%
|
|===================================================== | 75%
|
|===================================================== | 76%
|
|====================================================== | 77%
|
|====================================================== | 78%
|
|======================================================= | 78%
|
|======================================================= | 79%
|
|======================================================== | 79%
|
|======================================================== | 80%
|
|======================================================== | 81%
|
|========================================================= | 81%
|
|========================================================= | 82%
|
|========================================================== | 82%
|
|========================================================== | 83%
|
|=========================================================== | 84%
|
|=========================================================== | 85%
|
|============================================================ | 85%
|
|============================================================ | 86%
|
|============================================================= | 86%
|
|============================================================= | 87%
|
|============================================================= | 88%
|
|============================================================== | 88%
|
|============================================================== | 89%
|
|=============================================================== | 89%
|
|=============================================================== | 90%
|
|=============================================================== | 91%
|
|================================================================ | 91%
|
|================================================================ | 92%
|
|================================================================= | 92%
|
|================================================================= | 93%
|
|================================================================= | 94%
|
|================================================================== | 94%
|
|================================================================== | 95%
|
|=================================================================== | 95%
|
|=================================================================== | 96%
|
|==================================================================== | 96%
|
|==================================================================== | 97%
|
|==================================================================== | 98%
|
|===================================================================== | 98%
|
|===================================================================== | 99%
|
|======================================================================| 99%
|
|======================================================================| 100%
#rename variables and filter missing cases
educ19 <- educ19%>%
mutate(peduc19 = peduc19E,
peduc19_er = peduc19M/1.645,
peduc19_cv =100* (peduc19_er/peduc19),
male = maleE,
female = 100 - male,
hispanic = hispanicE,
nh_white = nh_whiteE,
nh_black = nh_blackE) %>%
filter(complete.cases(peduc19), is.finite(peduc19_cv)==T)%>%
select(GEOID, NAME, peduc19, peduc19_er,peduc19_cv, male, female, hispanic,nh_white,nh_black)
head(educ19)
counties <- educ19 %>%
filter(NAME =='Bexar County, Texas'| NAME == 'Dallas County, Texas'| NAME == 'Harris County, Texas'| NAME == 'Tarrant County, Texas'| NAME == 'Travis County, Texas')
counties$NAME <- str_sub(counties$NAME, end=-14)
cts <- educ14 %>%
filter(NAME =='Bexar County, Texas'| NAME == 'Dallas County, Texas'| NAME == 'Harris County, Texas'| NAME == 'Tarrant County, Texas'| NAME == 'Travis County, Texas')
cts$NAME <- str_sub(cts$NAME, end=-14)
p1<-tm_shape(educ14)+
tm_polygons(c("peduc14"),
title=c("% Population with HS degree or higher"),
palette="Reds",
style="quantile",
n=5)+
tm_shape(counties)+
tm_dots(size = 0.3, col = 'blue')+
#tm_format("World", legend.outside=T, title.size =4)+
tm_scale_bar(width = 0.1)+
tm_layout(title="Population percent with HS degree or higher
ACS 2014 : 5 year estimates",
title.size =1.5,
legend.frame = TRUE,
title.position = c('right', 'top'))+
tm_compass()+
tm_format("World",
legend.position = c("left", "bottom"),
main.title.position =c("center"))
p2<-tm_shape(educ14)+
tm_polygons(c("peduc14_cv"),
title=c("CV % pop with HS degree or higher
"),
palette="Reds",
style="quantile",
n=5)+
tm_shape(counties)+
tm_dots(size = 0.3, col = 'blue')+
#tm_format("World", title="San Antonio Poverty Rate CV", legend.outside=T)+
tm_layout(title="CV - Population percent with HS degree or higher
ACS 2014 : 5 year estimates",
title.size =1.5,
legend.frame = TRUE,
title.position = c('right', 'top'))+
tm_scale_bar(width = 0.1)+
tm_compass()+
tm_format("World",
legend.position = c("left", "bottom"),
main.title.position =c("center"))
map14<-tmap_arrange(p1, p2)
map14

bar1 <- ggplot(cts)+
geom_col(aes(NAME,peduc14), fill = 'red')+
labs(x = "Counties", y = "Percent population with HS degree or higher", title = "Percent of population with HS degree or higher across Texas counties", subtitle = "ACS 2010-2014")
bar1

p3<-tm_shape(educ19)+
tm_polygons(c("peduc19"),
title=c("% Population with HS degree or higher"),
palette="Blues",
style="quantile",
n=5)+
tm_shape(counties)+
tm_dots(size = 0.3, col = 'blue')+
#tm_format("World", legend.outside=T, title.size =4)+
tm_scale_bar(width = 0.1)+
tm_layout(title="Population percent with HS degree or higher
ACS 2019 : 5 year estimates",
title.size =1.5,
legend.frame = TRUE,
title.position = c('right', 'top'))+
tm_compass()+
tm_format("World",
legend.position = c("left", "bottom"),
main.title.position =c("center"))
p4<-tm_shape(educ19)+
tm_polygons(c("peduc19_cv"),
title=c("CV % pop with HS degree or higher"),
palette="Blues",
style="quantile",
n=5)+
tm_shape(counties)+
tm_dots(size = 0.3, col = 'blue')+
#tm_format("World", title="San Antonio Poverty Rate CV", legend.outside=T)+
tm_layout(title="CV - Population percent with HS degree or higher
ACS 2019 : 5 year estimates",
title.size =1.5,
legend.frame = TRUE,
title.position = c('right', 'top'))+
tm_scale_bar(width = 0.1)+
tm_compass()+
tm_format("World",
legend.position = c("left", "bottom"),
main.title.position =c("center"))
map19<- tmap_arrange(p3, p4)
map19

bar2<- ggplot(counties)+
geom_col(aes(NAME,peduc19), fill = 'skyblue')+
labs(x = "Counties", y = "Percent population with HS degree or higher", title = "Percent of population with HS degree or higher across Texas counties", subtitle = "ACS 2015-2019")
bar2

acstest<-function(names,geoid, est1, err1, est2, err2, alpha, yr1, yr2, span){
se1<-err1/qnorm(.90)
se2<-err2/qnorm(.90)
yrs1<-seq(yr1, to=yr1-span)
yrs2<-seq(yr2, to=yr2-span)
C<-mean(yrs2%in%yrs1)
diff<- (est1-est2)
test<-(est1-est2) / (sqrt(1-C)*sqrt(se1^2+se2^2))
crit<-qnorm(1-alpha/2)
pval<-1-pnorm(abs(test))
result<-NULL
result[pval > alpha]<-"No Significant Change "
result[pval < alpha & test < 0]<- "Significant Increase"
result[pval < alpha & test > 0]<-"Significant Decrease"
data.frame(name=names,geoid=geoid, est1=est1, est2=est2, se1=se1, se2=se2,difference=diff, test=test, result=result, pval=pval)
}
#merge the two years worth of data
st_geometry(educ19)<-NULL #strip the geometry from the 2019 data
mdat<-left_join(educ14, educ19, by=c("GEOID"="GEOID"))
head(mdat)
diff1419 <- acstest(names = mdat$GEOID,
geoid = mdat$GEOID,
est1 = mdat$peduc14,
est2 = mdat$peduc19,
err1 = mdat$peduc14_er,
err2 = mdat$peduc19_er,
alpha = .1,
yr1 = 2014, yr2=2019,
span = 5)
mdat$signif<- significance(est1=mdat$peduc14,
est2=mdat$peduc19,
moe1=mdat$peduc14_er,
moe2 = mdat$peduc19_er,
clevel = .9)
table(mdat$signif) #
##
## FALSE TRUE
## 105 149
acs_merge<-left_join(mdat, diff1419, by=c("GEOID"="geoid"))
tmap_mode("plot")
## tmap mode set to plotting
p5<-tm_shape(acs_merge)+
tm_polygons(c("peduc14"),
title=c("% in Poverty 2010"),
palette="Blues",
style="quantile",
n=5)+
tm_shape(counties)+
tm_dots(size = 0.3, col = 'red')+
#tm_format("World", legend.outside=T, title.size =4)+
tm_scale_bar(width = 0.1)+
tm_layout(title="San Antonio Poverty Rate Estimates 2010",
title.size =1.5,
legend.frame = TRUE,
title.position = c('right', 'top'))+
tm_compass()+
tm_format("World",
legend.position = c("LEFT", "BOTTOM"),
main.title.position =c("TOP","CENTERr"))
p6<-tm_shape(acs_merge)+
tm_polygons(c("peduc19"),
title=c("% in Poverty 2019"),
palette="Blues",
style="quantile",
n=5)+
tm_shape(counties)+
tm_dots(size = 0.3, col = 'red')+
#tm_format("World", title="San Antonio Poverty Rate CV", legend.outside=T)+
tm_layout(title="San Antonio Poverty Rate Estimate 2019",
title.size =1.5,
legend.frame = TRUE,
title.position = c('right', 'top'))+
tm_scale_bar(width = 0.1)+
tm_compass()+
tm_format("World",
legend.position = c("LEFT", "BOTTOM"),
main.title.position =c("TOP","CENTER"))
p7 <- tm_shape(acs_merge)+
tm_polygons(c("result"),
title=c("Change in % population with HS degree or higher"),
palette = "Set2")+
tm_shape(counties)+
tm_dots(size = 0.3, col = 'blue')+
#tm_format("World", title="San Antonio Poverty Rate CV", legend.outside=T)+
tm_layout(main.title=
"Change in Percentage of Population with HS degree or higher across Texas counties
ACS 2014 and ACS 2019 - 5 year estimates",
main.title.size =0.7,
legend.frame = TRUE,
main.title.position = c('center'))+
tm_scale_bar(width = 0.1)+
tm_compass()+
tm_format("World",
legend.position = c("LEFT", "BOTTOM"),
main.title.position =c("TOP","CENTERr"))
mapdiff<- p7
mapdiff

LS0tDQp0aXRsZTogIkdJUyBCbG9nIFBvc3QgMyINCmF1dGhvcjogIkp5b3RpIE5lcGFsLCBNU1ciDQpkYXRlOiAiYHIgZm9ybWF0KFN5cy50aW1lKCksICclZCAlQiwgJVknKWAiDQpvdXRwdXQ6DQogIGh0bWxfZG9jdW1lbnQ6DQogICAgZGZfcHJpbnQ6IHBhZ2VkDQogICAgZmlnX2hlaWdodDogNw0KICAgIGZpZ193aWR0aDogNw0KICAgIHRvYzogeWVzDQogICAgdG9jX2Zsb2F0OiB5ZXMNCiAgICBjb2RlX2Rvd25sb2FkOiB5ZXMNCiAgd29yZF9kb2N1bWVudDoNCiAgICB0b2M6IHllcw0KLS0tDQoNCg0KYGBge3IsIG1lc3NhZ2U9RkFMU0UsIHF1aWV0bHkgPVQsIGluY2x1ZGU9Rn0NCmxpYnJhcnkoc3VydmV5LCBxdWlldGx5ID0gVCkNCmxpYnJhcnkoZHBseXIsIHF1aWV0bHkgPSBUKQ0KbGlicmFyeShjYXIsIHF1aWV0bHkgPSBUKQ0KbGlicmFyeShnZ3Bsb3QyLCBxdWlldGx5ID0gVCkNCmxpYnJhcnkodGlncmlzLCBxdWlldGx5ID0gVCkNCmxpYnJhcnkoY2xhc3NJbnQsIHF1aWV0bHkgPSBUKQ0KbGlicmFyeShzcnZ5ciwgcXVpZXRseSA9IFQpDQpsaWJyYXJ5KHJlbGRpc3QsIHF1aWV0bHkgPSBUKQ0KbGlicmFyeShzZiwgcXVpZXRseSA9IFQpDQpsaWJyYXJ5KG1hcHZpZXcsIHF1aWV0bHkgPSBUKQ0KbGlicmFyeShqYW5pdG9yLCBxdWlldGx5ID0gVCkNCmxpYnJhcnkodGlkeXZlcnNlLCBxdWlldGx5ID0gVCkNCmxpYnJhcnkodG1hcCwgcXVpZXRseSA9IFQpDQpsaWJyYXJ5KHBhdGNod29yaywgcXVpZXRseSA9IFQpDQpsaWJyYXJ5KHRtYXB0b29scywgcXVpZXRseSA9IFQpDQpsaWJyYXJ5KGdnc24sIHF1aWV0bHkgPSBUKQ0KbGlicmFyeSh0aWR5Y2Vuc3VzLCBxdWlldGx5ID0gVCkNCmxpYnJhcnkoc3RyaW5ncikNCg0KYGBgDQoNCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQ0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFKQ0KYGBgDQoNCiMjIyBSZWFkIERhdGENCmBgYHtyfQ0KDQoNCnYxOV9Qcm9maWxlIDwtIGxvYWRfdmFyaWFibGVzKDIwMTksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWNzNS9wcm9maWxlIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhY2hlID0gVFJVRSkNCg0KdjE0X1Byb2ZpbGUgPC0gbG9hZF92YXJpYWJsZXMoMjAxNCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhY3M1L3Byb2ZpbGUiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FjaGUgPSBUUlVFKSNkZW1vZ3JhcGhpYyANCg0KI1NlYXJjaCBmb3IgdmFyaWFibGVzIGJ5IHVzaW5nIGdyZXAoKQ0KDQoNCnYxOV9Qcm9maWxlW2dyZXAoeCA9IHYxOV9Qcm9maWxlJGxhYmVsLA0KICAgICAgICAgICAgICAgICAiRWR1Y2F0aW9uYWwgQXR0YWlubWVudCIsDQogICAgICAgICAgICAgICAgIGlnbm9yZS5jYXNlID0gVFJVRSksDQogICAgICAgICAgICBjKCJuYW1lIiwgImxhYmVsIildDQoNCnYxOV9Qcm9maWxlW2dyZXAoeCA9IHYxOV9Qcm9maWxlJGxhYmVsLA0KICAgICAgICAgICAgICAgICAiSGlzcGFuaWMgYW5kIFJhY2UiLA0KICAgICAgICAgICAgICAgICBpZ25vcmUuY2FzZSA9IFRSVUUpLA0KICAgICAgICAgICAgYygibmFtZSIsICJsYWJlbCIpXQ0KdjE5X1Byb2ZpbGVbZ3JlcCh4ID0gdjE5X1Byb2ZpbGUkbGFiZWwsDQogICAgICAgICAgICAgICAgICJTZXggYW5kIEFnZSIsDQogICAgICAgICAgICAgICAgIGlnbm9yZS5jYXNlID0gVFJVRSksDQogICAgICAgICAgICBjKCJuYW1lIiwgImxhYmVsIildDQp2MTRfUHJvZmlsZVtncmVwKHggPSB2MTRfUHJvZmlsZSRsYWJlbCwNCiAgICAgICAgICAgICAgICAgIkVkdWNhdGlvbmFsIEF0dGFpbm1lbnQiLA0KICAgICAgICAgICAgICAgICBpZ25vcmUuY2FzZSA9IFRSVUUpLA0KICAgICAgICAgICAgYygibmFtZSIsICJsYWJlbCIpXQ0KDQp2MTRfUHJvZmlsZVtncmVwKHggPSB2MTRfUHJvZmlsZSRsYWJlbCwNCiAgICAgICAgICAgICAgICAgIkhpc3BhbmljIGFuZCBSYWNlIiwNCiAgICAgICAgICAgICAgICAgaWdub3JlLmNhc2UgPSBUUlVFKSwNCiAgICAgICAgICAgIGMoIm5hbWUiLCAibGFiZWwiKV0NCnYxNF9Qcm9maWxlW2dyZXAoeCA9IHYxNF9Qcm9maWxlJGxhYmVsLA0KICAgICAgICAgICAgICAgICAiU2V4IGFuZCBBZ2UiLA0KICAgICAgICAgICAgICAgICBpZ25vcmUuY2FzZSA9IFRSVUUpLA0KICAgICAgICAgICAgYygibmFtZSIsICJsYWJlbCIpXQ0KDQoNCmBgYA0KDQoNCmBgYHtyfQ0KZWR1YzE0PC1nZXRfYWNzKGdlb2dyYXBoeSA9ICdjb3VudHknLA0KICAgICAgICAgICAgICAgIHN0YXRlID0nVFgnLA0KICAgICAgICAgICAgICAgIHllYXIgPSAyMDE0LA0KICAgICAgICAgICAgICAgIHZhcmlhYmxlcyA9IGMocGVkdWMxNCA9ICJEUDAyXzAwNjZQIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hbGUgPSAiRFAwNV8wMDAyUCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaXNwYW5pYyA9ICJEUDA1XzAwNjZQIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5oX3doaXRlID0gIkRQMDVfMDA3MlAiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmhfYmxhY2sgPSAiRFAwNV8wMDczUCIpLCANCiAgICAgICAgICAgICAgZ2VvbWV0cnkgPSBULCBvdXRwdXQgPSAid2lkZSIpDQoNCg0KI3JlbmFtZSB2YXJpYWJsZXMgYW5kIGZpbHRlciBtaXNzaW5nIGNhc2VzDQplZHVjMTQgPC0gZWR1YzE0JT4lDQogIG11dGF0ZShwZWR1YzE0ID0gcGVkdWMxNEUsIA0KICAgICAgICAgcGVkdWMxNF9lciA9IHBlZHVjMTRNLzEuNjQ1LA0KICAgICAgICAgcGVkdWMxNF9jdiA9MTAwKiAocGVkdWMxNF9lci9wZWR1YzE0KSwNCiAgICAgICAgIG1hbGUgPSBtYWxlRSwNCiAgICAgICAgIGZlbWFsZSA9IDEwMCAtIG1hbGUsDQogICAgICAgICBoaXNwYW5pYyA9IGhpc3BhbmljRSwNCiAgICAgICAgIG5oX3doaXRlID0gbmhfd2hpdGVFLA0KICAgICAgICAgbmhfYmxhY2sgPSBuaF9ibGFja0UpICU+JQ0KICBmaWx0ZXIoY29tcGxldGUuY2FzZXMocGVkdWMxNCksIGlzLmZpbml0ZShwZWR1YzE0X2N2KT09VCklPiUNCiAgc2VsZWN0KEdFT0lELCBOQU1FLCBwZWR1YzE0LCBwZWR1YzE0X2VyLHBlZHVjMTRfY3YsIG1hbGUsIGZlbWFsZSwgaGlzcGFuaWMsbmhfd2hpdGUsbmhfYmxhY2spDQoNCmhlYWQoZWR1YzE0KQ0KDQoNCg0KZWR1YzE5PC1nZXRfYWNzKGdlb2dyYXBoeSA9ICdjb3VudHknLA0KICAgICAgICAgICAgICAgIHN0YXRlID0nVFgnLA0KICAgICAgICAgICAgICAgIHllYXIgPSAyMDE5LA0KICAgICAgICAgICAgICAgIHZhcmlhYmxlcyA9IGMocGVkdWMxOSA9ICJEUDAyXzAwNjdQIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hbGUgPSAiRFAwNV8wMDAyUCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaXNwYW5pYyA9ICJEUDA1XzAwNzFQIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5oX3doaXRlID0gIkRQMDVfMDA3N1AiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmhfYmxhY2sgPSAiRFAwNV8wMDc4UCIpLCANCiAgICAgICAgICAgICAgZ2VvbWV0cnkgPSBULCBvdXRwdXQgPSAid2lkZSIpDQoNCg0KI3JlbmFtZSB2YXJpYWJsZXMgYW5kIGZpbHRlciBtaXNzaW5nIGNhc2VzDQplZHVjMTkgPC0gZWR1YzE5JT4lDQogIG11dGF0ZShwZWR1YzE5ID0gcGVkdWMxOUUsIA0KICAgICAgICAgcGVkdWMxOV9lciA9IHBlZHVjMTlNLzEuNjQ1LA0KICAgICAgICAgcGVkdWMxOV9jdiA9MTAwKiAocGVkdWMxOV9lci9wZWR1YzE5KSwNCiAgICAgICAgIG1hbGUgPSBtYWxlRSwNCiAgICAgICAgIGZlbWFsZSA9IDEwMCAtIG1hbGUsDQogICAgICAgICBoaXNwYW5pYyA9IGhpc3BhbmljRSwNCiAgICAgICAgIG5oX3doaXRlID0gbmhfd2hpdGVFLA0KICAgICAgICAgbmhfYmxhY2sgPSBuaF9ibGFja0UpICU+JQ0KICBmaWx0ZXIoY29tcGxldGUuY2FzZXMocGVkdWMxOSksIGlzLmZpbml0ZShwZWR1YzE5X2N2KT09VCklPiUNCiAgc2VsZWN0KEdFT0lELCBOQU1FLCBwZWR1YzE5LCBwZWR1YzE5X2VyLHBlZHVjMTlfY3YsIG1hbGUsIGZlbWFsZSwgaGlzcGFuaWMsbmhfd2hpdGUsbmhfYmxhY2spDQoNCmhlYWQoZWR1YzE5KQ0KDQpgYGANCg0KDQoNCmBgYHtyfQ0KDQpjb3VudGllcyA8LSBlZHVjMTkgJT4lIA0KICANCiAgZmlsdGVyKE5BTUUgPT0nQmV4YXIgQ291bnR5LCBUZXhhcyd8IE5BTUUgPT0gJ0RhbGxhcyBDb3VudHksIFRleGFzJ3wgTkFNRSA9PSAnSGFycmlzIENvdW50eSwgVGV4YXMnfCBOQU1FID09ICdUYXJyYW50IENvdW50eSwgVGV4YXMnfCBOQU1FID09ICdUcmF2aXMgQ291bnR5LCBUZXhhcycpDQoNCmNvdW50aWVzJE5BTUUgPC0gc3RyX3N1Yihjb3VudGllcyROQU1FLCBlbmQ9LTE0KQ0KDQpjdHMgPC0gZWR1YzE0ICU+JSANCiAgDQogIGZpbHRlcihOQU1FID09J0JleGFyIENvdW50eSwgVGV4YXMnfCBOQU1FID09ICdEYWxsYXMgQ291bnR5LCBUZXhhcyd8IE5BTUUgPT0gJ0hhcnJpcyBDb3VudHksIFRleGFzJ3wgTkFNRSA9PSAnVGFycmFudCBDb3VudHksIFRleGFzJ3wgTkFNRSA9PSAnVHJhdmlzIENvdW50eSwgVGV4YXMnKQ0KDQpjdHMkTkFNRSA8LSBzdHJfc3ViKGN0cyROQU1FLCBlbmQ9LTE0KQ0KDQpgYGANCg0KDQpgYGB7cn0NCnAxPC10bV9zaGFwZShlZHVjMTQpKw0KICB0bV9wb2x5Z29ucyhjKCJwZWR1YzE0IiksDQogICAgICAgICAgICAgIHRpdGxlPWMoIiUgUG9wdWxhdGlvbiB3aXRoIEhTIGRlZ3JlZSBvciBoaWdoZXIiKSwNCiAgICAgICAgICAgICAgcGFsZXR0ZT0iUmVkcyIsDQogICAgICAgICAgICAgIHN0eWxlPSJxdWFudGlsZSIsDQogICAgICAgICAgICAgIG49NSkrDQogIHRtX3NoYXBlKGNvdW50aWVzKSsNCiAgdG1fZG90cyhzaXplID0gMC4zLCBjb2wgPSAnYmx1ZScpKw0KICAjdG1fZm9ybWF0KCJXb3JsZCIsIGxlZ2VuZC5vdXRzaWRlPVQsIHRpdGxlLnNpemUgPTQpKw0KICB0bV9zY2FsZV9iYXIod2lkdGggPSAwLjEpKw0KICB0bV9sYXlvdXQodGl0bGU9IlBvcHVsYXRpb24gcGVyY2VudCB3aXRoIEhTIGRlZ3JlZSBvciBoaWdoZXIgDQpBQ1MgMjAxNCA6IDUgeWVhciBlc3RpbWF0ZXMiLA0KICAgICAgICAgICAgdGl0bGUuc2l6ZSA9MS41LCANCiAgICAgICAgICAgIGxlZ2VuZC5mcmFtZSA9IFRSVUUsDQogICAgICAgICAgICB0aXRsZS5wb3NpdGlvbiA9IGMoJ3JpZ2h0JywgJ3RvcCcpKSsNCiAgDQogIHRtX2NvbXBhc3MoKSsNCiAgdG1fZm9ybWF0KCJXb3JsZCIsDQogICAgICAgICAgICBsZWdlbmQucG9zaXRpb24gPSAgYygibGVmdCIsICJib3R0b20iKSwNCiAgICAgICAgICAgIG1haW4udGl0bGUucG9zaXRpb24gPWMoImNlbnRlciIpKQ0KDQoNCnAyPC10bV9zaGFwZShlZHVjMTQpKw0KICB0bV9wb2x5Z29ucyhjKCJwZWR1YzE0X2N2IiksDQogICAgICAgICAgICAgIHRpdGxlPWMoIkNWICUgcG9wIHdpdGggSFMgZGVncmVlIG9yIGhpZ2hlcg0KIiksDQogICAgICAgICAgICAgIHBhbGV0dGU9IlJlZHMiLA0KICAgICAgICAgICAgICBzdHlsZT0icXVhbnRpbGUiLA0KICAgICAgICAgICAgICBuPTUpKw0KICAgdG1fc2hhcGUoY291bnRpZXMpKw0KICB0bV9kb3RzKHNpemUgPSAwLjMsIGNvbCA9ICdibHVlJykrDQogICN0bV9mb3JtYXQoIldvcmxkIiwgdGl0bGU9IlNhbiBBbnRvbmlvIFBvdmVydHkgUmF0ZSBDViIsIGxlZ2VuZC5vdXRzaWRlPVQpKw0KICB0bV9sYXlvdXQodGl0bGU9IkNWIC0gUG9wdWxhdGlvbiBwZXJjZW50IHdpdGggSFMgZGVncmVlIG9yIGhpZ2hlcg0KQUNTIDIwMTQgOiA1IHllYXIgZXN0aW1hdGVzIiwNCiAgICAgICAgICAgIHRpdGxlLnNpemUgPTEuNSwNCiAgICAgICAgICAgIGxlZ2VuZC5mcmFtZSA9IFRSVUUsDQogICAgICAgICAgICB0aXRsZS5wb3NpdGlvbiA9IGMoJ3JpZ2h0JywgJ3RvcCcpKSsNCiAgdG1fc2NhbGVfYmFyKHdpZHRoID0gMC4xKSsNCiAgdG1fY29tcGFzcygpKw0KICB0bV9mb3JtYXQoIldvcmxkIiwNCiAgICAgICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICBjKCJsZWZ0IiwgImJvdHRvbSIpLA0KICAgICAgICAgICAgbWFpbi50aXRsZS5wb3NpdGlvbiA9YygiY2VudGVyIikpDQoNCm1hcDE0PC10bWFwX2FycmFuZ2UocDEsIHAyKQ0KbWFwMTQNCg0KYGBgDQpgYGB7cn0NCmJhcjEgPC0gZ2dwbG90KGN0cykrDQpnZW9tX2NvbChhZXMoTkFNRSxwZWR1YzE0KSwgZmlsbCA9ICdyZWQnKSsNCiAgbGFicyh4ID0gIkNvdW50aWVzIiwgeSA9ICJQZXJjZW50IHBvcHVsYXRpb24gd2l0aCBIUyBkZWdyZWUgb3IgaGlnaGVyIiwgdGl0bGUgPSAiUGVyY2VudCBvZiBwb3B1bGF0aW9uIHdpdGggSFMgZGVncmVlIG9yIGhpZ2hlciBhY3Jvc3MgVGV4YXMgY291bnRpZXMiLCBzdWJ0aXRsZSA9ICJBQ1MgMjAxMC0yMDE0IikNCmJhcjENCmBgYA0KDQoNCg0KYGBge3J9DQoNCnAzPC10bV9zaGFwZShlZHVjMTkpKw0KICB0bV9wb2x5Z29ucyhjKCJwZWR1YzE5IiksDQogICAgICAgICAgICAgIHRpdGxlPWMoIiUgUG9wdWxhdGlvbiB3aXRoIEhTIGRlZ3JlZSBvciBoaWdoZXIiKSwNCiAgICAgICAgICAgICAgcGFsZXR0ZT0iQmx1ZXMiLA0KICAgICAgICAgICAgICBzdHlsZT0icXVhbnRpbGUiLA0KICAgICAgICAgICAgICBuPTUpKw0KICB0bV9zaGFwZShjb3VudGllcykrDQogIHRtX2RvdHMoc2l6ZSA9IDAuMywgY29sID0gJ2JsdWUnKSsNCiAgI3RtX2Zvcm1hdCgiV29ybGQiLCBsZWdlbmQub3V0c2lkZT1ULCB0aXRsZS5zaXplID00KSsNCiAgdG1fc2NhbGVfYmFyKHdpZHRoID0gMC4xKSsNCiAgdG1fbGF5b3V0KHRpdGxlPSJQb3B1bGF0aW9uIHBlcmNlbnQgd2l0aCBIUyBkZWdyZWUgb3IgaGlnaGVyIA0KQUNTIDIwMTkgOiA1IHllYXIgZXN0aW1hdGVzIiwNCiAgICAgICAgICAgIHRpdGxlLnNpemUgPTEuNSwgDQogICAgICAgICAgICBsZWdlbmQuZnJhbWUgPSBUUlVFLA0KICAgICAgICAgICAgdGl0bGUucG9zaXRpb24gPSBjKCdyaWdodCcsICd0b3AnKSkrDQogIA0KICB0bV9jb21wYXNzKCkrDQogIHRtX2Zvcm1hdCgiV29ybGQiLA0KICAgICAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gIGMoImxlZnQiLCAiYm90dG9tIiksDQogICAgICAgICAgICBtYWluLnRpdGxlLnBvc2l0aW9uID1jKCJjZW50ZXIiKSkNCg0KDQpwNDwtdG1fc2hhcGUoZWR1YzE5KSsNCiAgdG1fcG9seWdvbnMoYygicGVkdWMxOV9jdiIpLA0KICAgICAgICAgICAgICB0aXRsZT1jKCJDViAlIHBvcCB3aXRoIEhTIGRlZ3JlZSBvciBoaWdoZXIiKSwNCiAgICAgICAgICAgICAgcGFsZXR0ZT0iQmx1ZXMiLA0KICAgICAgICAgICAgICBzdHlsZT0icXVhbnRpbGUiLA0KICAgICAgICAgICAgICBuPTUpKw0KICAgdG1fc2hhcGUoY291bnRpZXMpKw0KICB0bV9kb3RzKHNpemUgPSAwLjMsIGNvbCA9ICdibHVlJykrDQogICN0bV9mb3JtYXQoIldvcmxkIiwgdGl0bGU9IlNhbiBBbnRvbmlvIFBvdmVydHkgUmF0ZSBDViIsIGxlZ2VuZC5vdXRzaWRlPVQpKw0KICB0bV9sYXlvdXQodGl0bGU9IkNWIC0gUG9wdWxhdGlvbiBwZXJjZW50IHdpdGggSFMgZGVncmVlIG9yIGhpZ2hlcg0KQUNTIDIwMTkgOiA1IHllYXIgZXN0aW1hdGVzIiwNCiAgICAgICAgICAgIHRpdGxlLnNpemUgPTEuNSwNCiAgICAgICAgICAgIGxlZ2VuZC5mcmFtZSA9IFRSVUUsDQogICAgICAgICAgICB0aXRsZS5wb3NpdGlvbiA9IGMoJ3JpZ2h0JywgJ3RvcCcpKSsNCiAgdG1fc2NhbGVfYmFyKHdpZHRoID0gMC4xKSsNCiAgdG1fY29tcGFzcygpKw0KICB0bV9mb3JtYXQoIldvcmxkIiwNCiAgICAgICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICBjKCJsZWZ0IiwgImJvdHRvbSIpLA0KICAgICAgICAgICAgbWFpbi50aXRsZS5wb3NpdGlvbiA9YygiY2VudGVyIikpDQoNCm1hcDE5PC0gdG1hcF9hcnJhbmdlKHAzLCBwNCkNCm1hcDE5DQoNCmBgYA0KDQoNCmBgYHtyfQ0KYmFyMjwtIGdncGxvdChjb3VudGllcykrDQpnZW9tX2NvbChhZXMoTkFNRSxwZWR1YzE5KSwgZmlsbCA9ICdza3libHVlJykrDQogIGxhYnMoeCA9ICJDb3VudGllcyIsIHkgPSAiUGVyY2VudCBwb3B1bGF0aW9uIHdpdGggSFMgZGVncmVlIG9yIGhpZ2hlciIsIHRpdGxlID0gIlBlcmNlbnQgb2YgcG9wdWxhdGlvbiB3aXRoIEhTIGRlZ3JlZSBvciBoaWdoZXIgYWNyb3NzIFRleGFzIGNvdW50aWVzIiwgc3VidGl0bGUgPSAiQUNTIDIwMTUtMjAxOSIpDQpiYXIyDQpgYGANCg0KYGBge3J9DQphY3N0ZXN0PC1mdW5jdGlvbihuYW1lcyxnZW9pZCwgZXN0MSwgZXJyMSwgZXN0MiwgZXJyMiwgYWxwaGEsIHlyMSwgeXIyLCBzcGFuKXsNCiAgDQogIHNlMTwtZXJyMS9xbm9ybSguOTApDQogIHNlMjwtZXJyMi9xbm9ybSguOTApDQogIHlyczE8LXNlcSh5cjEsIHRvPXlyMS1zcGFuKQ0KICB5cnMyPC1zZXEoeXIyLCB0bz15cjItc3BhbikNCg0KICBDPC1tZWFuKHlyczIlaW4leXJzMSkNCiAgZGlmZjwtIChlc3QxLWVzdDIpDQogIHRlc3Q8LShlc3QxLWVzdDIpIC8gKHNxcnQoMS1DKSpzcXJ0KHNlMV4yK3NlMl4yKSkNCiAgY3JpdDwtcW5vcm0oMS1hbHBoYS8yKQ0KICBwdmFsPC0xLXBub3JtKGFicyh0ZXN0KSkNCiAgcmVzdWx0PC1OVUxMDQogIHJlc3VsdFtwdmFsID4gYWxwaGFdPC0iTm8gU2lnbmlmaWNhbnQgQ2hhbmdlICINCiAgcmVzdWx0W3B2YWwgPCBhbHBoYSAmIHRlc3QgPCAwXTwtICJTaWduaWZpY2FudCBJbmNyZWFzZSINCiAgcmVzdWx0W3B2YWwgPCBhbHBoYSAmIHRlc3QgPiAwXTwtIlNpZ25pZmljYW50IERlY3JlYXNlIiANCiAgDQogIGRhdGEuZnJhbWUobmFtZT1uYW1lcyxnZW9pZD1nZW9pZCwgZXN0MT1lc3QxLCBlc3QyPWVzdDIsIHNlMT1zZTEsIHNlMj1zZTIsZGlmZmVyZW5jZT1kaWZmLCB0ZXN0PXRlc3QsIHJlc3VsdD1yZXN1bHQsIHB2YWw9cHZhbCkNCn0NCmBgYA0KDQoNCmBgYHtyfQ0KDQojbWVyZ2UgdGhlIHR3byB5ZWFycyB3b3J0aCBvZiBkYXRhDQpzdF9nZW9tZXRyeShlZHVjMTkpPC1OVUxMICNzdHJpcCB0aGUgZ2VvbWV0cnkgZnJvbSB0aGUgMjAxOSBkYXRhDQoNCm1kYXQ8LWxlZnRfam9pbihlZHVjMTQsIGVkdWMxOSwgYnk9YygiR0VPSUQiPSJHRU9JRCIpKQ0KDQpoZWFkKG1kYXQpDQpgYGANCg0KDQpgYGB7cn0NCmRpZmYxNDE5IDwtIGFjc3Rlc3QobmFtZXMgPSBtZGF0JEdFT0lELA0KICAgICAgICAgICAgICAgICAgICBnZW9pZCA9IG1kYXQkR0VPSUQsDQogICAgICAgICAgICAgICAgICAgIGVzdDEgPSBtZGF0JHBlZHVjMTQsDQogICAgICAgICAgICAgICAgICAgIGVzdDIgPSBtZGF0JHBlZHVjMTksDQogICAgICAgICAgICAgICAgICAgIGVycjEgPSBtZGF0JHBlZHVjMTRfZXIsDQogICAgICAgICAgICAgICAgICAgIGVycjIgPSBtZGF0JHBlZHVjMTlfZXIsDQogICAgICAgICAgICAgICAgICAgIGFscGhhID0gLjEsDQogICAgICAgICAgICAgICAgICAgIHlyMSA9IDIwMTQsIHlyMj0yMDE5LA0KICAgICAgICAgICAgICAgICAgICBzcGFuID0gNSkNCmBgYA0KDQoNCmBgYHtyfQ0KbWRhdCRzaWduaWY8LSBzaWduaWZpY2FuY2UoZXN0MT1tZGF0JHBlZHVjMTQsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBlc3QyPW1kYXQkcGVkdWMxOSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZTE9bWRhdCRwZWR1YzE0X2VyLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9lMiA9IG1kYXQkcGVkdWMxOV9lciwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsZXZlbCA9IC45KQ0KYGBgDQoNCg0KDQpgYGB7cn0NCnRhYmxlKG1kYXQkc2lnbmlmKSAjDQoNCmBgYA0KDQpgYGB7cn0NCmFjc19tZXJnZTwtbGVmdF9qb2luKG1kYXQsIGRpZmYxNDE5LCBieT1jKCJHRU9JRCI9Imdlb2lkIikpDQoNCnRtYXBfbW9kZSgicGxvdCIpDQpwNTwtdG1fc2hhcGUoYWNzX21lcmdlKSsNCiAgdG1fcG9seWdvbnMoYygicGVkdWMxNCIpLA0KICAgICAgICAgICAgICB0aXRsZT1jKCIlIGluIFBvdmVydHkgIDIwMTAiKSwNCiAgICAgICAgICAgICAgcGFsZXR0ZT0iQmx1ZXMiLA0KICAgICAgICAgICAgICBzdHlsZT0icXVhbnRpbGUiLA0KICAgICAgICAgICAgICBuPTUpKw0KICB0bV9zaGFwZShjb3VudGllcykrDQogIHRtX2RvdHMoc2l6ZSA9IDAuMywgY29sID0gJ3JlZCcpKw0KICAjdG1fZm9ybWF0KCJXb3JsZCIsIGxlZ2VuZC5vdXRzaWRlPVQsIHRpdGxlLnNpemUgPTQpKw0KICB0bV9zY2FsZV9iYXIod2lkdGggPSAwLjEpKw0KICB0bV9sYXlvdXQodGl0bGU9IlNhbiBBbnRvbmlvIFBvdmVydHkgUmF0ZSBFc3RpbWF0ZXMgMjAxMCIsDQogICAgICAgICAgICB0aXRsZS5zaXplID0xLjUsDQogICAgICAgICAgICBsZWdlbmQuZnJhbWUgPSBUUlVFLA0KICAgICAgICAgICAgdGl0bGUucG9zaXRpb24gPSBjKCdyaWdodCcsICd0b3AnKSkrDQogIHRtX2NvbXBhc3MoKSsNCiAgdG1fZm9ybWF0KCJXb3JsZCIsDQogICAgICAgICAgICBsZWdlbmQucG9zaXRpb24gPSAgYygiTEVGVCIsICJCT1RUT00iKSwNCiAgICAgICAgICAgIG1haW4udGl0bGUucG9zaXRpb24gPWMoIlRPUCIsIkNFTlRFUnIiKSkNCg0KcDY8LXRtX3NoYXBlKGFjc19tZXJnZSkrDQogIHRtX3BvbHlnb25zKGMoInBlZHVjMTkiKSwNCiAgICAgICAgICAgICAgdGl0bGU9YygiJSBpbiBQb3ZlcnR5IDIwMTkiKSwNCiAgICAgICAgICAgICAgcGFsZXR0ZT0iQmx1ZXMiLCANCiAgICAgICAgICAgICAgc3R5bGU9InF1YW50aWxlIiwNCiAgICAgICAgICAgICAgbj01KSsNCiAgdG1fc2hhcGUoY291bnRpZXMpKw0KICB0bV9kb3RzKHNpemUgPSAwLjMsIGNvbCA9ICdyZWQnKSsNCiAgI3RtX2Zvcm1hdCgiV29ybGQiLCB0aXRsZT0iU2FuIEFudG9uaW8gUG92ZXJ0eSBSYXRlIENWIiwgbGVnZW5kLm91dHNpZGU9VCkrDQogIHRtX2xheW91dCh0aXRsZT0iU2FuIEFudG9uaW8gUG92ZXJ0eSBSYXRlIEVzdGltYXRlIDIwMTkiLA0KICAgICAgICAgICAgdGl0bGUuc2l6ZSA9MS41LA0KICAgICAgICAgICAgbGVnZW5kLmZyYW1lID0gVFJVRSwNCiAgICAgICAgICAgIHRpdGxlLnBvc2l0aW9uID0gYygncmlnaHQnLCAndG9wJykpKw0KICB0bV9zY2FsZV9iYXIod2lkdGggPSAwLjEpKw0KICB0bV9jb21wYXNzKCkrDQogIHRtX2Zvcm1hdCgiV29ybGQiLA0KICAgICAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gIGMoIkxFRlQiLCAiQk9UVE9NIiksDQogICAgICAgICAgICBtYWluLnRpdGxlLnBvc2l0aW9uID1jKCJUT1AiLCJDRU5URVIiKSkNCg0KDQpwNyAgPC0gdG1fc2hhcGUoYWNzX21lcmdlKSsNCiAgdG1fcG9seWdvbnMoYygicmVzdWx0IiksDQogICAgICAgICAgICAgIHRpdGxlPWMoIkNoYW5nZSBpbiAlIHBvcHVsYXRpb24gd2l0aCBIUyBkZWdyZWUgb3IgaGlnaGVyIiksDQogICAgICAgICAgICAgIHBhbGV0dGUgPSAiU2V0MiIpKw0KICB0bV9zaGFwZShjb3VudGllcykrDQogIHRtX2RvdHMoc2l6ZSA9IDAuMywgY29sID0gJ2JsdWUnKSsNCiAgI3RtX2Zvcm1hdCgiV29ybGQiLCB0aXRsZT0iU2FuIEFudG9uaW8gUG92ZXJ0eSBSYXRlIENWIiwgbGVnZW5kLm91dHNpZGU9VCkrDQogIHRtX2xheW91dChtYWluLnRpdGxlPQ0KIkNoYW5nZSBpbiBQZXJjZW50YWdlIG9mIFBvcHVsYXRpb24gd2l0aCBIUyBkZWdyZWUgb3IgaGlnaGVyIGFjcm9zcyBUZXhhcyBjb3VudGllcyANCkFDUyAyMDE0IGFuZCBBQ1MgMjAxOSAtIDUgeWVhciBlc3RpbWF0ZXMiLCANCiAgICAgICAgICAgIG1haW4udGl0bGUuc2l6ZSA9MC43LCANCiAgICAgICAgICAgIGxlZ2VuZC5mcmFtZSA9IFRSVUUsDQogICAgICAgICAgICBtYWluLnRpdGxlLnBvc2l0aW9uID0gYygnY2VudGVyJykpKw0KICB0bV9zY2FsZV9iYXIod2lkdGggPSAwLjEpKw0KICB0bV9jb21wYXNzKCkrDQogIHRtX2Zvcm1hdCgiV29ybGQiLA0KICAgICAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gIGMoIkxFRlQiLCAiQk9UVE9NIiksDQogICAgICAgICAgICBtYWluLnRpdGxlLnBvc2l0aW9uID1jKCJUT1AiLCJDRU5URVJyIikpDQoNCiAgDQoNCm1hcGRpZmY8LSBwNw0KbWFwZGlmZg0KDQpgYGANCg==