library(survey, quietly = T)
library(dplyr, quietly = T)
library(car, quietly = T)
library(ggplot2, quietly = T)
library(tigris, quietly = T)
library(classInt, quietly = T)
library(srvyr, quietly = T)
library(reldist, quietly = T)
## Warning: package 'reldist' was built under R version 4.1.3
library(ipumsr, quietly = T)
## Warning: package 'ipumsr' was built under R version 4.1.3
library(sf, quietly = T)
library(mapview, quietly = T)
library(janitor, quietly = T)
## Warning: package 'janitor' was built under R version 4.1.3
library(survey, quietly = T)
library(tidyverse, quietly = T)
library(car, quietly = T)
library(ggplot2, quietly = T)
library(tigris, quietly = T)
library(classInt, quietly = T)
library(tmap, quietly = T)
## Warning: package 'tmap' was built under R version 4.1.3
library(reldist, quietly = T)

Read Data

library(haven)


ddi <- read_ipums_ddi("C:/Users/spara/OneDrive/Desktop/Gis Project/usa_00005.xml")
data <- read_ipums_micro(ddi)
## Use of data from IPUMS USA is subject to conditions including that users should
## cite the data appropriately. Use command `ipums_conditions()` for more details.
data<- haven::zap_labels(data)

names(data) <- tolower(gsub(pattern = "_",replacement =  "",x =  names(data)))
data<-haven::zap_labels(data) #necessary to avoid problems with "labelled" data class
names(data)<-tolower(names(data))

Filter variables

data2<- data%>%
  filter(age>= 25 & countyfip == 029 | countyfip == 201 |
           countyfip == 113| countyfip == 439| countyfip == 453)
## Prepare variables

#weight variables
data2$pwt <- data2$perwt/100
data2$hwt <- data2$hhwt/100



#Race and ethnicity variables

data2$hisp <- Recode(data2$hispan, recodes = "9=NA; 1:4='Hispanic'; 0='NonHispanic'")
data2$race_rec <- Recode(data2$race, recodes = "1='White'; 2='Black'; 3='Other'; 4:6='Asian'; 7:9='Other'")
data2$race_eth <- interaction(data2$hisp, data2$race_rec, sep = "_")
data2$race_eth  <- as.factor(ifelse(substr(as.character(data2$race_eth),1,8) == "Hispanic", "Hispanic", as.character(data2$race_eth)))
data2$race_eth <- relevel(data2$race_eth, ref = "NonHispanic_White")


#Sex

data2$sex <- Recode(data2$sex, recodes = "1 ='Male'; 2 ='Female'; else=NA", as.factor =T)


#Education 

data2$educ2<- Recode(data2$educd, recodes = "2:61='0' ;62:116='1'; else=NA", as.factor=T)



#Age

data2$agecat<-cut(data2$age, breaks = c(25, 30, 40, 50, 65, 120), include.lowest = T)

Generate survey design object

Here we identify the person weights and the survey design variables.

des<-svydesign(ids=~cluster, strata=~ strata, weights = ~pwt, data=data2)

Estimates for Counties

cos<-counties(cb= T,state = "TX", year =2019)


  cos$countyfip <- as.numeric(cos$COUNTYFP)
cos_est_educ2<-svyby( ~I(educ2==1),
                       by = ~countyfip,
                       design=des,
                       FUN=svymean,
                       na.rm = TRUE ) %>% 
  clean_names() %>% 
  mutate(Pctsh=round((i_educ2_1_true*100),1),Pctnsh=round((i_educ2_1_false*100),1)) %>% 
  rename(propnsh=i_educ2_1_false,
         propsh=i_educ2_1_true,
         Stderr=se_i_educ2_1_true) %>% 
  select(countyfip,Pctsh,Pctnsh,Stderr)
geo3<-left_join(cos, cos_est_educ2, by =c("countyfip"= "countyfip"))

Map for Texas counties

## Figure 1: Educational Attainment in Texas Counties, 2015-2019
tmap_mode("plot")
## tmap mode set to plotting
tm_basemap("OpenStreetMap.Mapnik")+
  tm_shape(geo3)+
  tm_polygons("Pctsh",
              style="kmeans",
              title=c( "% of people with high school or more"),
              palette="Blues",
              n=5,
              legend.hist = TRUE) +
  tm_layout(legend.outside = TRUE,
            title = "Educational Attainment in Texas Counties \n 2015-2019",
            title.size =1.5,
            legend.frame = TRUE,
            ) +  tm_compass(position = c("left","top")) + tm_format("World",
            legend.position =  c("left", "bottom"),
            main.title.position =c("center")) + tm_scale_bar(position = c("left","bottom"))

Descriptive Part

Without survey

library(table1)
## Warning: package 'table1' was built under R version 4.1.3
## 
## Attaching package: 'table1'
## The following objects are masked from 'package:base':
## 
##     units, units<-
label(data2$sex) <- "Sex"
label(data2$race_eth)<-"Race/Ethnicity"
label(data2$agecat)<-"Age"

tbl1<-table1(~ sex + race_eth + agecat | educ2, data=data2, na.rm = T)
tbl1
0
(N=149365)
1
(N=345372)
Overall
(N=510886)
Sex
Female 73513 (49.2%) 180725 (52.3%) 262170 (51.3%)
Male 75852 (50.8%) 164647 (47.7%) 248716 (48.7%)
Race/Ethnicity
NonHispanic_White 35906 (24.0%) 177305 (51.3%) 218609 (42.8%)
Hispanic 82403 (55.2%) 91035 (26.4%) 180415 (35.3%)
NonHispanic_Asian 8474 (5.7%) 22790 (6.6%) 32247 (6.3%)
NonHispanic_Black 18693 (12.5%) 47555 (13.8%) 68312 (13.4%)
NonHispanic_Other 3889 (2.6%) 6687 (1.9%) 11303 (2.2%)
Age
[25,30] 4707 (3.2%) 42339 (12.3%) 47046 (9.2%)
(30,40] 10656 (7.1%) 64025 (18.5%) 74681 (14.6%)
(40,50] 11583 (7.8%) 57435 (16.6%) 69018 (13.5%)
(50,65] 15905 (10.6%) 87360 (25.3%) 103265 (20.2%)
(65,120] 12731 (8.5%) 60151 (17.4%) 72882 (14.3%)
Missing 93783 (62.8%) 34062 (9.9%) 143994 (28.2%)

With survey

library(gtsummary)
## #Uighur
 des %>% tbl_svysummary(by= educ2, 
                       include=c(sex, race_eth,agecat,educ2),
                       label = list(race_eth~ "Race/Ethnicity" ,
                        
                                   agecat~"Age",
                                   
                                   
                                  sex~"Sex" ))%>%
  add_p() %>%
add_overall() %>%
  modify_spanning_header(c("stat_1", "stat_2") ~ "**Educational Attainment in Texas**") %>% 
as_gt() %>%
  # modify with gt functions
  gt::tab_header("Table 2: Weighted Demographic Proporties of People By Educational Attainment, IPUMS, 2015-2019") %>% 
  gt::tab_options(
    table.font.size = "small",
    data_row.padding = gt::px(1))
## 16149 observations missing `educ2` have been removed. To include these observations, use `forcats::fct_explicit_na()` on `educ2` column before passing to `tbl_svysummary()`.
Table 2: Weighted Demographic Proporties of People By Educational Attainment, IPUMS, 2015-2019
Characteristic Overall, N = 113,1681 Educational Attainment in Texas p-value2
0, N = 37,9491 1, N = 75,2191
Sex <0.001
Female 57,316 (51%) 18,508 (49%) 38,808 (52%)
Male 55,852 (49%) 19,441 (51%) 36,411 (48%)
Race/Ethnicity <0.001
NonHispanic_White 39,705 (35%) 7,090 (19%) 32,615 (43%)
Hispanic 45,253 (40%) 22,541 (59%) 22,711 (30%)
NonHispanic_Asian 6,939 (6.1%) 1,892 (5.0%) 5,048 (6.7%)
NonHispanic_Black 18,839 (17%) 5,526 (15%) 13,313 (18%)
NonHispanic_Other 2,432 (2.1%) 900 (2.4%) 1,531 (2.0%)
Age <0.001
[25,30] 12,568 (16%) 1,378 (10%) 11,190 (17%)
(30,40] 18,899 (24%) 3,080 (22%) 15,819 (24%)
(40,50] 16,322 (20%) 3,138 (23%) 13,184 (20%)
(50,65] 20,460 (25%) 3,683 (27%) 16,777 (25%)
(65,120] 12,112 (15%) 2,415 (18%) 9,697 (15%)
Unknown 32,807 24,255 8,552

1 n (%)

2 chi-squared test with Rao & Scott's second-order correction

## Figure 2: Educational Attainment by Race/Ethnicity, 2015-2019

Fig1 <- ggplot(data = data2, aes(x=educ2, fill= race_eth))+
  geom_bar(position = 'fill')+
labs(title="Educational Attainment by Race and Ethnicity in Texas, 2015-2019", 
         x="Education", y = "Population Proportion", fill ="Legend")+
  theme(legend.position="right")
Fig1

LS0tDQp0aXRsZTogIkdJUyBCbG9nIFBvc3QgVHdvIg0KYXV0aG9yOiAiSnlvdGkgTmVwYWwsIE1TVyINCmRhdGU6ICJgciBmb3JtYXQoU3lzLnRpbWUoKSwgJyVkICVCLCAlWScpYCINCm91dHB1dDoNCiAgaHRtbF9kb2N1bWVudDoNCiAgICBkZl9wcmludDogcGFnZWQNCiAgICBmaWdfaGVpZ2h0OiA3DQogICAgZmlnX3dpZHRoOiA3DQogICAgdG9jOiB5ZXMNCiAgICB0b2NfZmxvYXQ6IHllcw0KICAgIGNvZGVfZG93bmxvYWQ6IHllcw0KICB3b3JkX2RvY3VtZW50Og0KICAgIHRvYzogeWVzDQotLS0NCg0KDQpgYGB7ciwgbWVzc2FnZT1GQUxTRX0NCmxpYnJhcnkoc3VydmV5LCBxdWlldGx5ID0gVCkNCmxpYnJhcnkoZHBseXIsIHF1aWV0bHkgPSBUKQ0KbGlicmFyeShjYXIsIHF1aWV0bHkgPSBUKQ0KbGlicmFyeShnZ3Bsb3QyLCBxdWlldGx5ID0gVCkNCmxpYnJhcnkodGlncmlzLCBxdWlldGx5ID0gVCkNCmxpYnJhcnkoY2xhc3NJbnQsIHF1aWV0bHkgPSBUKQ0KbGlicmFyeShzcnZ5ciwgcXVpZXRseSA9IFQpDQpsaWJyYXJ5KHJlbGRpc3QsIHF1aWV0bHkgPSBUKQ0KbGlicmFyeShpcHVtc3IsIHF1aWV0bHkgPSBUKQ0KbGlicmFyeShzZiwgcXVpZXRseSA9IFQpDQpsaWJyYXJ5KG1hcHZpZXcsIHF1aWV0bHkgPSBUKQ0KbGlicmFyeShqYW5pdG9yLCBxdWlldGx5ID0gVCkNCmxpYnJhcnkoc3VydmV5LCBxdWlldGx5ID0gVCkNCmxpYnJhcnkodGlkeXZlcnNlLCBxdWlldGx5ID0gVCkNCmxpYnJhcnkoY2FyLCBxdWlldGx5ID0gVCkNCmxpYnJhcnkoZ2dwbG90MiwgcXVpZXRseSA9IFQpDQpsaWJyYXJ5KHRpZ3JpcywgcXVpZXRseSA9IFQpDQpsaWJyYXJ5KGNsYXNzSW50LCBxdWlldGx5ID0gVCkNCmxpYnJhcnkodG1hcCwgcXVpZXRseSA9IFQpDQpsaWJyYXJ5KHJlbGRpc3QsIHF1aWV0bHkgPSBUKQ0KDQpgYGANCg0KYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9DQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUpDQpgYGANCg0KIyMjIFJlYWQgRGF0YQ0KYGBge3J9DQpsaWJyYXJ5KGhhdmVuKQ0KDQoNCmRkaSA8LSByZWFkX2lwdW1zX2RkaSgiQzovVXNlcnMvc3BhcmEvT25lRHJpdmUvRGVza3RvcC9HaXMgUHJvamVjdC91c2FfMDAwMDUueG1sIikNCmRhdGEgPC0gcmVhZF9pcHVtc19taWNybyhkZGkpDQpkYXRhPC0gaGF2ZW46OnphcF9sYWJlbHMoZGF0YSkNCg0KbmFtZXMoZGF0YSkgPC0gdG9sb3dlcihnc3ViKHBhdHRlcm4gPSAiXyIscmVwbGFjZW1lbnQgPSAgIiIseCA9ICBuYW1lcyhkYXRhKSkpDQoNCmBgYA0KDQoNCmBgYHtyfQ0KZGF0YTwtaGF2ZW46OnphcF9sYWJlbHMoZGF0YSkgI25lY2Vzc2FyeSB0byBhdm9pZCBwcm9ibGVtcyB3aXRoICJsYWJlbGxlZCIgZGF0YSBjbGFzcw0KbmFtZXMoZGF0YSk8LXRvbG93ZXIobmFtZXMoZGF0YSkpDQpgYGANCg0KIyMjIEZpbHRlciB2YXJpYWJsZXMgDQpgYGB7cn0NCg0KZGF0YTI8LSBkYXRhJT4lDQogIGZpbHRlcihhZ2U+PSAyNSAmIGNvdW50eWZpcCA9PSAwMjkgfCBjb3VudHlmaXAgPT0gMjAxIHwNCiAgICAgICAgICAgY291bnR5ZmlwID09IDExM3wgY291bnR5ZmlwID09IDQzOXwgY291bnR5ZmlwID09IDQ1MykNCmBgYA0KDQoNCmBgYHtyfQ0KIyMgUHJlcGFyZSB2YXJpYWJsZXMNCg0KI3dlaWdodCB2YXJpYWJsZXMNCmRhdGEyJHB3dCA8LSBkYXRhMiRwZXJ3dC8xMDANCmRhdGEyJGh3dCA8LSBkYXRhMiRoaHd0LzEwMA0KDQoNCg0KI1JhY2UgYW5kIGV0aG5pY2l0eSB2YXJpYWJsZXMNCg0KZGF0YTIkaGlzcCA8LSBSZWNvZGUoZGF0YTIkaGlzcGFuLCByZWNvZGVzID0gIjk9TkE7IDE6ND0nSGlzcGFuaWMnOyAwPSdOb25IaXNwYW5pYyciKQ0KZGF0YTIkcmFjZV9yZWMgPC0gUmVjb2RlKGRhdGEyJHJhY2UsIHJlY29kZXMgPSAiMT0nV2hpdGUnOyAyPSdCbGFjayc7IDM9J090aGVyJzsgNDo2PSdBc2lhbic7IDc6OT0nT3RoZXInIikNCmRhdGEyJHJhY2VfZXRoIDwtIGludGVyYWN0aW9uKGRhdGEyJGhpc3AsIGRhdGEyJHJhY2VfcmVjLCBzZXAgPSAiXyIpDQpkYXRhMiRyYWNlX2V0aCAgPC0gYXMuZmFjdG9yKGlmZWxzZShzdWJzdHIoYXMuY2hhcmFjdGVyKGRhdGEyJHJhY2VfZXRoKSwxLDgpID09ICJIaXNwYW5pYyIsICJIaXNwYW5pYyIsIGFzLmNoYXJhY3RlcihkYXRhMiRyYWNlX2V0aCkpKQ0KZGF0YTIkcmFjZV9ldGggPC0gcmVsZXZlbChkYXRhMiRyYWNlX2V0aCwgcmVmID0gIk5vbkhpc3BhbmljX1doaXRlIikNCg0KDQojU2V4DQoNCmRhdGEyJHNleCA8LSBSZWNvZGUoZGF0YTIkc2V4LCByZWNvZGVzID0gIjEgPSdNYWxlJzsgMiA9J0ZlbWFsZSc7IGVsc2U9TkEiLCBhcy5mYWN0b3IgPVQpDQoNCg0KI0VkdWNhdGlvbiANCg0KZGF0YTIkZWR1YzI8LSBSZWNvZGUoZGF0YTIkZWR1Y2QsIHJlY29kZXMgPSAiMjo2MT0nMCcgOzYyOjExNj0nMSc7IGVsc2U9TkEiLCBhcy5mYWN0b3I9VCkNCg0KDQoNCiNBZ2UNCg0KZGF0YTIkYWdlY2F0PC1jdXQoZGF0YTIkYWdlLCBicmVha3MgPSBjKDI1LCAzMCwgNDAsIDUwLCA2NSwgMTIwKSwgaW5jbHVkZS5sb3dlc3QgPSBUKQ0KDQoNCmBgYA0KDQoNCiMjIEdlbmVyYXRlIHN1cnZleSBkZXNpZ24gb2JqZWN0DQoNCkhlcmUgd2UgaWRlbnRpZnkgdGhlIHBlcnNvbiB3ZWlnaHRzIGFuZCB0aGUgc3VydmV5IGRlc2lnbiB2YXJpYWJsZXMuDQoNCmBgYHtyfQ0KZGVzPC1zdnlkZXNpZ24oaWRzPX5jbHVzdGVyLCBzdHJhdGE9fiBzdHJhdGEsIHdlaWdodHMgPSB+cHd0LCBkYXRhPWRhdGEyKQ0KYGBgDQoNCiMjIEVzdGltYXRlcyBmb3IgQ291bnRpZXMNCmBgYHtyLCByZXN1bHRzPSdoaWRlJ30gDQpjb3M8LWNvdW50aWVzKGNiPSBULHN0YXRlID0gIlRYIiwgeWVhciA9MjAxOSkNCg0KDQogIGNvcyRjb3VudHlmaXAgPC0gYXMubnVtZXJpYyhjb3MkQ09VTlRZRlApDQpgYGANCg0KDQpgYGAge3J9DQoNCmNvc19lc3RfZWR1YzI8LXN2eWJ5KCB+SShlZHVjMj09MSksDQogICAgICAgICAgICAgICAgICAgICAgIGJ5ID0gfmNvdW50eWZpcCwNCiAgICAgICAgICAgICAgICAgICAgICAgZGVzaWduPWRlcywNCiAgICAgICAgICAgICAgICAgICAgICAgRlVOPXN2eW1lYW4sDQogICAgICAgICAgICAgICAgICAgICAgIG5hLnJtID0gVFJVRSApICU+JSANCiAgY2xlYW5fbmFtZXMoKSAlPiUgDQogIG11dGF0ZShQY3RzaD1yb3VuZCgoaV9lZHVjMl8xX3RydWUqMTAwKSwxKSxQY3Ruc2g9cm91bmQoKGlfZWR1YzJfMV9mYWxzZSoxMDApLDEpKSAlPiUgDQogIHJlbmFtZShwcm9wbnNoPWlfZWR1YzJfMV9mYWxzZSwNCiAgICAgICAgIHByb3BzaD1pX2VkdWMyXzFfdHJ1ZSwNCiAgICAgICAgIFN0ZGVycj1zZV9pX2VkdWMyXzFfdHJ1ZSkgJT4lIA0KICBzZWxlY3QoY291bnR5ZmlwLFBjdHNoLFBjdG5zaCxTdGRlcnIpDQpgYGANCg0KDQpgYGB7ciwgcmVzdWx0cz0naGlkZSd9DQoNCmdlbzM8LWxlZnRfam9pbihjb3MsIGNvc19lc3RfZWR1YzIsIGJ5ID1jKCJjb3VudHlmaXAiPSAiY291bnR5ZmlwIikpDQoNCmBgYA0KDQoNCiMjIyBNYXAgZm9yIFRleGFzIGNvdW50aWVzDQoNCmBgYHtyfQ0KDQojIyBGaWd1cmUgMTogRWR1Y2F0aW9uYWwgQXR0YWlubWVudCBpbiBUZXhhcyBDb3VudGllcywgMjAxNS0yMDE5DQp0bWFwX21vZGUoInBsb3QiKQ0KdG1fYmFzZW1hcCgiT3BlblN0cmVldE1hcC5NYXBuaWsiKSsNCiAgdG1fc2hhcGUoZ2VvMykrDQogIHRtX3BvbHlnb25zKCJQY3RzaCIsDQogICAgICAgICAgICAgIHN0eWxlPSJrbWVhbnMiLA0KICAgICAgICAgICAgICB0aXRsZT1jKCAiJSBvZiBwZW9wbGUgd2l0aCBoaWdoIHNjaG9vbCBvciBtb3JlIiksDQogICAgICAgICAgICAgIHBhbGV0dGU9IkJsdWVzIiwNCiAgICAgICAgICAgICAgbj01LA0KICAgICAgICAgICAgICBsZWdlbmQuaGlzdCA9IFRSVUUpICsNCiAgdG1fbGF5b3V0KGxlZ2VuZC5vdXRzaWRlID0gVFJVRSwNCiAgICAgICAgICAgIHRpdGxlID0gIkVkdWNhdGlvbmFsIEF0dGFpbm1lbnQgaW4gVGV4YXMgQ291bnRpZXMgXG4gMjAxNS0yMDE5IiwNCiAgICAgICAgICAgIHRpdGxlLnNpemUgPTEuNSwNCiAgICAgICAgICAgIGxlZ2VuZC5mcmFtZSA9IFRSVUUsDQogICAgICAgICAgICApICsgIHRtX2NvbXBhc3MocG9zaXRpb24gPSBjKCJsZWZ0IiwidG9wIikpICsgdG1fZm9ybWF0KCJXb3JsZCIsDQogICAgICAgICAgICBsZWdlbmQucG9zaXRpb24gPSAgYygibGVmdCIsICJib3R0b20iKSwNCiAgICAgICAgICAgIG1haW4udGl0bGUucG9zaXRpb24gPWMoImNlbnRlciIpKSArIHRtX3NjYWxlX2Jhcihwb3NpdGlvbiA9IGMoImxlZnQiLCJib3R0b20iKSkNCmBgYA0KDQoNCiMjIyBEZXNjcmlwdGl2ZSBQYXJ0DQoNCg0KIyMgV2l0aG91dCBzdXJ2ZXkgDQoNCg0KYGBge3J9DQpsaWJyYXJ5KHRhYmxlMSkNCg0KbGFiZWwoZGF0YTIkc2V4KSA8LSAiU2V4Ig0KbGFiZWwoZGF0YTIkcmFjZV9ldGgpPC0iUmFjZS9FdGhuaWNpdHkiDQpsYWJlbChkYXRhMiRhZ2VjYXQpPC0iQWdlIg0KDQp0YmwxPC10YWJsZTEofiBzZXggKyByYWNlX2V0aCArIGFnZWNhdCB8IGVkdWMyLCBkYXRhPWRhdGEyLCBuYS5ybSA9IFQpDQp0YmwxDQpgYGANCg0KDQoNCiMjIFdpdGggc3VydmV5IA0KYGBge3J9DQpsaWJyYXJ5KGd0c3VtbWFyeSkNCiBkZXMgJT4lIHRibF9zdnlzdW1tYXJ5KGJ5PSBlZHVjMiwgDQogICAgICAgICAgICAgICAgICAgICAgIGluY2x1ZGU9YyhzZXgsIHJhY2VfZXRoLGFnZWNhdCxlZHVjMiksDQogICAgICAgICAgICAgICAgICAgICAgIGxhYmVsID0gbGlzdChyYWNlX2V0aH4gIlJhY2UvRXRobmljaXR5IiAsDQogICAgICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWdlY2F0fiJBZ2UiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V4fiJTZXgiICkpJT4lDQogIGFkZF9wKCkgJT4lDQphZGRfb3ZlcmFsbCgpICU+JQ0KICBtb2RpZnlfc3Bhbm5pbmdfaGVhZGVyKGMoInN0YXRfMSIsICJzdGF0XzIiKSB+ICIqKkVkdWNhdGlvbmFsIEF0dGFpbm1lbnQgaW4gVGV4YXMqKiIpICU+JSANCmFzX2d0KCkgJT4lDQogICMgbW9kaWZ5IHdpdGggZ3QgZnVuY3Rpb25zDQogIGd0Ojp0YWJfaGVhZGVyKCJUYWJsZSAyOiBXZWlnaHRlZCBEZW1vZ3JhcGhpYyBQcm9wb3J0aWVzIG9mIFBlb3BsZSBCeSBFZHVjYXRpb25hbCBBdHRhaW5tZW50LCBJUFVNUywgMjAxNS0yMDE5IikgJT4lIA0KICBndDo6dGFiX29wdGlvbnMoDQogICAgdGFibGUuZm9udC5zaXplID0gInNtYWxsIiwNCiAgICBkYXRhX3Jvdy5wYWRkaW5nID0gZ3Q6OnB4KDEpKQ0KDQoNCmBgYA0KDQoNCg0KYGBge3J9DQojIyBGaWd1cmUgMjogRWR1Y2F0aW9uYWwgQXR0YWlubWVudCBieSBSYWNlL0V0aG5pY2l0eSwgMjAxNS0yMDE5DQoNCkZpZzEgPC0gZ2dwbG90KGRhdGEgPSBkYXRhMiwgYWVzKHg9ZWR1YzIsIGZpbGw9IHJhY2VfZXRoKSkrDQogIGdlb21fYmFyKHBvc2l0aW9uID0gJ2ZpbGwnKSsNCmxhYnModGl0bGU9IkVkdWNhdGlvbmFsIEF0dGFpbm1lbnQgYnkgUmFjZSBhbmQgRXRobmljaXR5IGluIFRleGFzLCAyMDE1LTIwMTkiLCANCiAgICAgICAgIHg9IkVkdWNhdGlvbiIsIHkgPSAiUG9wdWxhdGlvbiBQcm9wb3J0aW9uIiwgZmlsbCA9IkxlZ2VuZCIpKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb249InJpZ2h0IikNCkZpZzENCmBgYA0KDQoNCg0KDQoNCg0KDQoNCg0KDQo=