library(ipumsr)
## Warning: package 'ipumsr' was built under R version 4.1.3
nhgis_ddi <- read_ipums_codebook("C:/Users/drayr/Downloads/nhgis0002_csv.zip")

nhgis <- read_nhgis(data_file = "C:/Users/drayr/Downloads/nhgis0002_csv.zip")
## Use of data from NHGIS is subject to conditions including that users should
## cite the data appropriately. Use command `ipums_conditions()` for more details.
## 
## 
## Reading data file...
nhgis<-haven::zap_labels(nhgis) 
names(nhgis)<-tolower(names(nhgis))

library(sf)
## Linking to GEOS 3.9.1, GDAL 3.2.1, PROJ 7.2.1; sf_use_s2() is TRUE
holc <- st_read("C:/Users/drayr/Downloads/TXSanAntonio19XX/cartodb-query.shp")
## Reading layer `cartodb-query' from data source 
##   `C:\Users\drayr\Downloads\TXSanAntonio19XX\cartodb-query.shp' 
##   using driver `ESRI Shapefile'
## Simple feature collection with 20 features and 3 fields
## Geometry type: MULTIPOLYGON
## Dimension:     XY
## Bounding box:  xmin: -98.57493 ymin: 29.35626 xmax: -98.43542 ymax: 29.49135
## Geodetic CRS:  WGS 84

Load some other packages

library(survey, quietly = T)
## Warning: package 'survey' was built under R version 4.1.3
library(tidyverse, quietly = T)
library(car, quietly = T)
## Warning: package 'car' was built under R version 4.1.3
## Warning: package 'carData' was built under R version 4.1.3
library(ggplot2, quietly = T)
library(tigris, quietly = T)
library(classInt, quietly = T)
library(tmap, quietly = T)
library(raster)

Download geographic data for Census Tracts

options(tigris_class = "sf")
tract<-tracts(state = "TX",
              county = 029,
             year = 2020,
             c = T)
## 
  |                                                                            
  |                                                                      |   0%
  |                                                                            
  |=                                                                     |   1%
  |                                                                            
  |=                                                                     |   2%
  |                                                                            
  |==                                                                    |   2%
  |                                                                            
  |==                                                                    |   3%
  |                                                                            
  |===                                                                   |   4%
  |                                                                            
  |===                                                                   |   5%
  |                                                                            
  |====                                                                  |   5%
  |                                                                            
  |====                                                                  |   6%
  |                                                                            
  |=====                                                                 |   7%
  |                                                                            
  |=====                                                                 |   8%
  |                                                                            
  |======                                                                |   8%
  |                                                                            
  |======                                                                |   9%
  |                                                                            
  |=======                                                               |  10%
  |                                                                            
  |=======                                                               |  11%
  |                                                                            
  |========                                                              |  11%
  |                                                                            
  |========                                                              |  12%
  |                                                                            
  |=========                                                             |  12%
  |                                                                            
  |=========                                                             |  13%
  |                                                                            
  |==========                                                            |  14%
  |                                                                            
  |==========                                                            |  15%
  |                                                                            
  |===========                                                           |  15%
  |                                                                            
  |===========                                                           |  16%
  |                                                                            
  |============                                                          |  17%
  |                                                                            
  |============                                                          |  18%
  |                                                                            
  |=============                                                         |  18%
  |                                                                            
  |=============                                                         |  19%
  |                                                                            
  |==============                                                        |  19%
  |                                                                            
  |==============                                                        |  20%
  |                                                                            
  |===============                                                       |  21%
  |                                                                            
  |===============                                                       |  22%
  |                                                                            
  |================                                                      |  23%
  |                                                                            
  |================                                                      |  24%
  |                                                                            
  |=================                                                     |  24%
  |                                                                            
  |=================                                                     |  25%
  |                                                                            
  |==================                                                    |  26%
  |                                                                            
  |===================                                                   |  27%
  |                                                                            
  |===================                                                   |  28%
  |                                                                            
  |====================                                                  |  28%
  |                                                                            
  |====================                                                  |  29%
  |                                                                            
  |=====================                                                 |  29%
  |                                                                            
  |=====================                                                 |  30%
  |                                                                            
  |======================                                                |  31%
  |                                                                            
  |======================                                                |  32%
  |                                                                            
  |=======================                                               |  32%
  |                                                                            
  |=======================                                               |  33%
  |                                                                            
  |=======================                                               |  34%
  |                                                                            
  |========================                                              |  34%
  |                                                                            
  |========================                                              |  35%
  |                                                                            
  |=========================                                             |  35%
  |                                                                            
  |=========================                                             |  36%
  |                                                                            
  |==========================                                            |  37%
  |                                                                            
  |===========================                                           |  38%
  |                                                                            
  |===========================                                           |  39%
  |                                                                            
  |============================                                          |  40%
  |                                                                            
  |=============================                                         |  41%
  |                                                                            
  |=============================                                         |  42%
  |                                                                            
  |==============================                                        |  42%
  |                                                                            
  |==============================                                        |  43%
  |                                                                            
  |===============================                                       |  44%
  |                                                                            
  |===============================                                       |  45%
  |                                                                            
  |================================                                      |  45%
  |                                                                            
  |================================                                      |  46%
  |                                                                            
  |=================================                                     |  47%
  |                                                                            
  |==================================                                    |  48%
  |                                                                            
  |===================================                                   |  49%
  |                                                                            
  |===================================                                   |  50%
  |                                                                            
  |===================================                                   |  51%
  |                                                                            
  |====================================                                  |  51%
  |                                                                            
  |====================================                                  |  52%
  |                                                                            
  |=====================================                                 |  53%
  |                                                                            
  |======================================                                |  54%
  |                                                                            
  |======================================                                |  55%
  |                                                                            
  |=======================================                               |  55%
  |                                                                            
  |=======================================                               |  56%
  |                                                                            
  |========================================                              |  57%
  |                                                                            
  |========================================                              |  58%
  |                                                                            
  |=========================================                             |  58%
  |                                                                            
  |=========================================                             |  59%
  |                                                                            
  |==========================================                            |  60%
  |                                                                            
  |===========================================                           |  61%
  |                                                                            
  |===========================================                           |  62%
  |                                                                            
  |============================================                          |  62%
  |                                                                            
  |============================================                          |  63%
  |                                                                            
  |============================================                          |  64%
  |                                                                            
  |=============================================                         |  64%
  |                                                                            
  |=============================================                         |  65%
  |                                                                            
  |==============================================                        |  65%
  |                                                                            
  |==============================================                        |  66%
  |                                                                            
  |===============================================                       |  66%
  |                                                                            
  |===============================================                       |  67%
  |                                                                            
  |===============================================                       |  68%
  |                                                                            
  |================================================                      |  69%
  |                                                                            
  |=================================================                     |  70%
  |                                                                            
  |=================================================                     |  71%
  |                                                                            
  |==================================================                    |  71%
  |                                                                            
  |==================================================                    |  72%
  |                                                                            
  |===================================================                   |  72%
  |                                                                            
  |===================================================                   |  73%
  |                                                                            
  |====================================================                  |  74%
  |                                                                            
  |====================================================                  |  75%
  |                                                                            
  |=====================================================                 |  75%
  |                                                                            
  |=====================================================                 |  76%
  |                                                                            
  |======================================================                |  76%
  |                                                                            
  |======================================================                |  77%
  |                                                                            
  |======================================================                |  78%
  |                                                                            
  |=======================================================               |  78%
  |                                                                            
  |=======================================================               |  79%
  |                                                                            
  |========================================================              |  80%
  |                                                                            
  |========================================================              |  81%
  |                                                                            
  |=========================================================             |  81%
  |                                                                            
  |=========================================================             |  82%
  |                                                                            
  |==========================================================            |  82%
  |                                                                            
  |==========================================================            |  83%
  |                                                                            
  |===========================================================           |  84%
  |                                                                            
  |===========================================================           |  85%
  |                                                                            
  |============================================================          |  85%
  |                                                                            
  |============================================================          |  86%
  |                                                                            
  |=============================================================         |  87%
  |                                                                            
  |=============================================================         |  88%
  |                                                                            
  |==============================================================        |  88%
  |                                                                            
  |==============================================================        |  89%
  |                                                                            
  |===============================================================       |  89%
  |                                                                            
  |===============================================================       |  90%
  |                                                                            
  |===============================================================       |  91%
  |                                                                            
  |================================================================      |  91%
  |                                                                            
  |=================================================================     |  92%
  |                                                                            
  |=================================================================     |  93%
  |                                                                            
  |==================================================================    |  94%
  |                                                                            
  |===================================================================   |  95%
  |                                                                            
  |===================================================================   |  96%
  |                                                                            
  |====================================================================  |  97%
  |                                                                            
  |====================================================================  |  98%
  |                                                                            
  |===================================================================== |  98%
  |                                                                            
  |===================================================================== |  99%
  |                                                                            
  |======================================================================| 100%
plot(tract["GEOID"],
     main = "Census Tracts in San Antonio")

plot(holc["holc_grade"],
     main = "HOLC graded areas: San Antonio 1935")

Prepare variables

nhgis2 <- nhgis %>%
  mutate( tot=u7e001,
    hisp=u7e002,
    nh=u7e003,
    nhblk=u7e006,
    nhwht=u7e005,
    GEOID=geocode,
    cofips=countya) %>%
  filter(statea=="48" & countya=="029")%>%
   dplyr:: select(GEOID, tot, hisp, nh,nhblk,nhwht,cofips)


#We need the county-level totals for the total population and each race group
codat<-nhgis2%>%
  summarise(co_total=sum(tot), co_wht=sum(nhwht), co_blk=sum(nhblk), cohisp=sum(hisp))
codat$cofips="029"

#we merge the county data back to the tract data by the county FIPS code
merged<-left_join(x=nhgis2,y=codat, by="cofips")
#have a look and make sure it looks ok
head(merged)
#isolation index
tr.iso<-merged%>%
  mutate(isoh=(hisp/cohisp * hisp/tot),
         isob=(nhblk/co_blk * nhblk/tot),
         isow=(nhwht/co_wht * nhwht/tot))%>%
  group_by(cofips)#%>%
  #summarise(iso_b= sum(isob, na.rm=T))

knitr::kable(head(nhgis2))
GEOID tot hisp nh nhblk nhwht cofips
48029110100 3628 1639 1989 270 1400 029
48029110300 1950 1232 718 86 540 029
48029110500 1451 1191 260 80 139 029
48029110600 6664 4202 2462 811 1597 029
48029110700 1007 746 261 50 185 029
48029111000 2044 1135 909 115 668 029

join to geography

geo1<-left_join(tract, tr.iso, by=c("GEOID"= "GEOID"))
head(geo1)
geo2<-geo1%>%
   mutate( 
    area=st_area(.))   

geo2<-st_transform(geo2, crs=2278)
holc<-st_transform(holc, crs=2278)

Map layout

tmap_mode("view")
## tmap mode set to interactive viewing
holctract<-st_intersection(holc,geo2)
## Warning: attribute variables are assumed to be spatially constant throughout all
## geometries
holcAB<-holc%>%
  filter(holc_grade== "A" | holc_grade=="B" )
holctractAB<-st_intersection(holcAB,geo2)
## Warning: attribute variables are assumed to be spatially constant throughout all
## geometries
holcCD<-holc%>%
  filter(holc_grade== "C" | holc_grade=="D" )
holctractCD<-st_intersection(holcCD,geo2)
## Warning: attribute variables are assumed to be spatially constant throughout all
## geometries
holcA<-holc%>%
  filter(holc_grade=="A")
holctractA<-st_intersection(holcA,geo2)
## Warning: attribute variables are assumed to be spatially constant throughout all
## geometries
holcB<-holc%>%
  filter(holc_grade=="B")
holctractB<-st_intersection(holcB,geo2)
## Warning: attribute variables are assumed to be spatially constant throughout all
## geometries
holcC<-holc%>%
  filter(holc_grade=="C")
holctractC<-st_intersection(holcC,geo2)
## Warning: attribute variables are assumed to be spatially constant throughout all
## geometries
holcD<-holc%>%
  filter(holc_grade=="D")
holctractD<-st_intersection(holcD,geo2)
## Warning: attribute variables are assumed to be spatially constant throughout all
## geometries
#tmaptools::palette_explorer()
tmap_mode("view")
## tmap mode set to interactive viewing
#Hispanic isolation

tm_shape(holctract)+
  tm_polygons(alpha=0, palette = "-viridis", n = 10, contrast = c(0.42, 1))+
  tm_shape(holc)+
  tm_polygons("holc_grade", alpha = .5, border.col = "red", lty= "solid")+
  tm_layout(title="HOLC grades Layered on SA 2020 Census Tracts",
            title.size =1.5,
            legend.frame = TRUE,
            title.position = c('right', 'top'))
# tm_shape(holctract)+
#    tm_polygons("isoh", palette = "-viridis", n = 10, contrast = c(0, 0.52))+
#   tm_shape(holcCD)+
#   tm_polygons("holc_grade",palette = "black", alpha = .3, border.col = "red", lty= "solid", ltw = 100)
# 
# 
# tm_shape(holctractAB)+
#   tm_polygons("isoh")+
#   tm_shape(holcAB)+
#   tm_polygons("holc_grade", alpha = 0, border.col = "red", lty= "solid")
# 
# tm_shape(holctractCD)+
#   tm_polygons("isoh")+
#   tm_shape(holcCD)+
#   tm_polygons("holc_grade", alpha = 0, border.col = "red", lty= "solid")
# 
# #White isolation
# tm_shape(holctract)+
#    tm_polygons("isow", palette = "-viridis", n = 10, contrast = c(0, 0.52))+
#   tm_shape(holcAB)+
#   tm_polygons("holc_grade",palette = "black", alpha = .3, border.col = "red", lty= "solid", ltw = 100)
# 
# 
# tm_shape(holctractAB)+
#   tm_polygons("isow")+
#   tm_shape(holcAB)+
#   tm_polygons("holc_grade", alpha = 0, border.col = "red", lty= "solid")
# 
# tm_shape(holctractCD)+
#   tm_polygons("isow")+
#   tm_shape(holcCD)+
#   tm_polygons("holc_grade", alpha = 0, border.col = "red", lty= "solid")
# 
# tm_shape(holctractD)+
#   tm_polygons("hisp")+
#   tm_shape(holcD)+
#   tm_polygons("holc_grade", alpha = 0, border.col = "red", lty= "solid")

Make a map layout

#tmaptools::palette_explorer()
#Hispanic isolation

tmap_mode("plot")
## tmap mode set to plotting
p1<-tm_shape(holctract)+
  tm_polygons(c("isoh"),
              title=c("Hispanic Isolation "),
              palette="Blues",
              style="quantile",
              n=5)+
  tm_scale_bar()+
  tm_layout(title="Hispanic Isolation Index by Census Tract 2020",
            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"))+
    tm_shape(holcCD)+
  tm_polygons("holc_grade",palette = "red", alpha = .3, border.col = "red", lty= "solid", ltw = 100)


p2<-tm_shape(holctract)+
  tm_polygons(c("isow"),
              title=c("White Isolation "),
              palette="Greens",
              style="quantile",
              n=5)+
  tm_scale_bar()+
  tm_layout(title="White Isolation Index by Census Tract 2020",
            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"))+
    tm_shape(holcAB)+
  tm_polygons("holc_grade",palette = "red", alpha = .3, border.col = "red", lty= "solid", ltw = 100)


tmap_arrange(p1,p2, nrow=1)

LS0tDQp0aXRsZTogIkZpbmFsIFByb2plY3QgY29kZSBERU0gNzA5MyINCmF1dGhvcjogIkRhdmlkIFJvZHJpZ3VleiINCmRhdGU6ICJgciBmb3JtYXQoU3lzLnRpbWUoKSwgJyVkICVCLCAlWScpYCINCm91dHB1dDoNCiAgIGh0bWxfZG9jdW1lbnQ6DQogICAgZGZfcHJpbnQ6IHBhZ2VkDQogICAgZmlnX2hlaWdodDogNw0KICAgIGZpZ193aWR0aDogNw0KICAgIHRvYzogeWVzDQogICAgdG9jX2Zsb2F0OiB5ZXMNCiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlDQotLS0NCg0KYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9DQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUpDQpgYGANCg0KYGBge3J9DQpsaWJyYXJ5KGlwdW1zcikNCg0KbmhnaXNfZGRpIDwtIHJlYWRfaXB1bXNfY29kZWJvb2soIkM6L1VzZXJzL2RyYXlyL0Rvd25sb2Fkcy9uaGdpczAwMDJfY3N2LnppcCIpDQoNCm5oZ2lzIDwtIHJlYWRfbmhnaXMoZGF0YV9maWxlID0gIkM6L1VzZXJzL2RyYXlyL0Rvd25sb2Fkcy9uaGdpczAwMDJfY3N2LnppcCIpDQpuaGdpczwtaGF2ZW46OnphcF9sYWJlbHMobmhnaXMpIA0KbmFtZXMobmhnaXMpPC10b2xvd2VyKG5hbWVzKG5oZ2lzKSkNCg0KbGlicmFyeShzZikNCmhvbGMgPC0gc3RfcmVhZCgiQzovVXNlcnMvZHJheXIvRG93bmxvYWRzL1RYU2FuQW50b25pbzE5WFgvY2FydG9kYi1xdWVyeS5zaHAiKQ0KDQoNCmBgYA0KDQojIyBMb2FkIHNvbWUgb3RoZXIgcGFja2FnZXMNCmBgYHtyLCBtZXNzYWdlPUZBTFNFfQ0KbGlicmFyeShzdXJ2ZXksIHF1aWV0bHkgPSBUKQ0KbGlicmFyeSh0aWR5dmVyc2UsIHF1aWV0bHkgPSBUKQ0KbGlicmFyeShjYXIsIHF1aWV0bHkgPSBUKQ0KbGlicmFyeShnZ3Bsb3QyLCBxdWlldGx5ID0gVCkNCmxpYnJhcnkodGlncmlzLCBxdWlldGx5ID0gVCkNCmxpYnJhcnkoY2xhc3NJbnQsIHF1aWV0bHkgPSBUKQ0KbGlicmFyeSh0bWFwLCBxdWlldGx5ID0gVCkNCmxpYnJhcnkocmFzdGVyKQ0KDQpgYGANCg0KDQojIyMgRG93bmxvYWQgZ2VvZ3JhcGhpYyBkYXRhIGZvciBDZW5zdXMgVHJhY3RzDQoNCmBgYHtyfQ0Kb3B0aW9ucyh0aWdyaXNfY2xhc3MgPSAic2YiKQ0KdHJhY3Q8LXRyYWN0cyhzdGF0ZSA9ICJUWCIsDQogICAgICAgICAgICAgIGNvdW50eSA9IDAyOSwNCiAgICAgICAgICAgICB5ZWFyID0gMjAyMCwNCiAgICAgICAgICAgICBjID0gVCkNCg0KDQpwbG90KHRyYWN0WyJHRU9JRCJdLA0KICAgICBtYWluID0gIkNlbnN1cyBUcmFjdHMgaW4gU2FuIEFudG9uaW8iKQ0KDQoNCnBsb3QoaG9sY1siaG9sY19ncmFkZSJdLA0KICAgICBtYWluID0gIkhPTEMgZ3JhZGVkIGFyZWFzOiBTYW4gQW50b25pbyAxOTM1IikNCg0KYGBgDQoNCg0KIyMgUHJlcGFyZSB2YXJpYWJsZXMNCg0KYGBge3J9DQpuaGdpczIgPC0gbmhnaXMgJT4lDQogIG11dGF0ZSggdG90PXU3ZTAwMSwNCiAgICBoaXNwPXU3ZTAwMiwNCiAgICBuaD11N2UwMDMsDQogICAgbmhibGs9dTdlMDA2LA0KICAgIG5od2h0PXU3ZTAwNSwNCiAgICBHRU9JRD1nZW9jb2RlLA0KICAgIGNvZmlwcz1jb3VudHlhKSAlPiUNCiAgZmlsdGVyKHN0YXRlYT09IjQ4IiAmIGNvdW50eWE9PSIwMjkiKSU+JQ0KICAgZHBseXI6OiBzZWxlY3QoR0VPSUQsIHRvdCwgaGlzcCwgbmgsbmhibGssbmh3aHQsY29maXBzKQ0KDQoNCiNXZSBuZWVkIHRoZSBjb3VudHktbGV2ZWwgdG90YWxzIGZvciB0aGUgdG90YWwgcG9wdWxhdGlvbiBhbmQgZWFjaCByYWNlIGdyb3VwDQpjb2RhdDwtbmhnaXMyJT4lDQogIHN1bW1hcmlzZShjb190b3RhbD1zdW0odG90KSwgY29fd2h0PXN1bShuaHdodCksIGNvX2Jsaz1zdW0obmhibGspLCBjb2hpc3A9c3VtKGhpc3ApKQ0KY29kYXQkY29maXBzPSIwMjkiDQoNCiN3ZSBtZXJnZSB0aGUgY291bnR5IGRhdGEgYmFjayB0byB0aGUgdHJhY3QgZGF0YSBieSB0aGUgY291bnR5IEZJUFMgY29kZQ0KbWVyZ2VkPC1sZWZ0X2pvaW4oeD1uaGdpczIseT1jb2RhdCwgYnk9ImNvZmlwcyIpDQojaGF2ZSBhIGxvb2sgYW5kIG1ha2Ugc3VyZSBpdCBsb29rcyBvaw0KaGVhZChtZXJnZWQpDQoNCiNpc29sYXRpb24gaW5kZXgNCnRyLmlzbzwtbWVyZ2VkJT4lDQogIG11dGF0ZShpc29oPShoaXNwL2NvaGlzcCAqIGhpc3AvdG90KSwNCiAgICAgICAgIGlzb2I9KG5oYmxrL2NvX2JsayAqIG5oYmxrL3RvdCksDQogICAgICAgICBpc293PShuaHdodC9jb193aHQgKiBuaHdodC90b3QpKSU+JQ0KICBncm91cF9ieShjb2ZpcHMpIyU+JQ0KICAjc3VtbWFyaXNlKGlzb19iPSBzdW0oaXNvYiwgbmEucm09VCkpDQoNCmtuaXRyOjprYWJsZShoZWFkKG5oZ2lzMikpDQoNCmBgYA0KDQoNCiMjIGpvaW4gdG8gZ2VvZ3JhcGh5DQoNCmBgYHtyfQ0KDQpnZW8xPC1sZWZ0X2pvaW4odHJhY3QsIHRyLmlzbywgYnk9YygiR0VPSUQiPSAiR0VPSUQiKSkNCmhlYWQoZ2VvMSkNCg0KZ2VvMjwtZ2VvMSU+JQ0KICAgbXV0YXRlKCANCiAgICBhcmVhPXN0X2FyZWEoLikpICAgDQoNCmdlbzI8LXN0X3RyYW5zZm9ybShnZW8yLCBjcnM9MjI3OCkNCmhvbGM8LXN0X3RyYW5zZm9ybShob2xjLCBjcnM9MjI3OCkNCmBgYA0KDQojIyBNYXAgbGF5b3V0DQoNCmBgYHtyfQ0KdG1hcF9tb2RlKCJ2aWV3IikNCg0KaG9sY3RyYWN0PC1zdF9pbnRlcnNlY3Rpb24oaG9sYyxnZW8yKQ0KDQpob2xjQUI8LWhvbGMlPiUNCiAgZmlsdGVyKGhvbGNfZ3JhZGU9PSAiQSIgfCBob2xjX2dyYWRlPT0iQiIgKQ0KaG9sY3RyYWN0QUI8LXN0X2ludGVyc2VjdGlvbihob2xjQUIsZ2VvMikNCg0KaG9sY0NEPC1ob2xjJT4lDQogIGZpbHRlcihob2xjX2dyYWRlPT0gIkMiIHwgaG9sY19ncmFkZT09IkQiICkNCmhvbGN0cmFjdENEPC1zdF9pbnRlcnNlY3Rpb24oaG9sY0NELGdlbzIpDQoNCg0KDQpob2xjQTwtaG9sYyU+JQ0KICBmaWx0ZXIoaG9sY19ncmFkZT09IkEiKQ0KaG9sY3RyYWN0QTwtc3RfaW50ZXJzZWN0aW9uKGhvbGNBLGdlbzIpDQoNCmhvbGNCPC1ob2xjJT4lDQogIGZpbHRlcihob2xjX2dyYWRlPT0iQiIpDQpob2xjdHJhY3RCPC1zdF9pbnRlcnNlY3Rpb24oaG9sY0IsZ2VvMikNCg0KaG9sY0M8LWhvbGMlPiUNCiAgZmlsdGVyKGhvbGNfZ3JhZGU9PSJDIikNCmhvbGN0cmFjdEM8LXN0X2ludGVyc2VjdGlvbihob2xjQyxnZW8yKQ0KDQpob2xjRDwtaG9sYyU+JQ0KICBmaWx0ZXIoaG9sY19ncmFkZT09IkQiKQ0KaG9sY3RyYWN0RDwtc3RfaW50ZXJzZWN0aW9uKGhvbGNELGdlbzIpDQoNCg0KYGBgDQoNCg0KYGBge3J9DQoNCiN0bWFwdG9vbHM6OnBhbGV0dGVfZXhwbG9yZXIoKQ0KdG1hcF9tb2RlKCJ2aWV3IikNCiNIaXNwYW5pYyBpc29sYXRpb24NCg0KdG1fc2hhcGUoaG9sY3RyYWN0KSsNCiAgdG1fcG9seWdvbnMoYWxwaGE9MCwgcGFsZXR0ZSA9ICItdmlyaWRpcyIsIG4gPSAxMCwgY29udHJhc3QgPSBjKDAuNDIsIDEpKSsNCiAgdG1fc2hhcGUoaG9sYykrDQogIHRtX3BvbHlnb25zKCJob2xjX2dyYWRlIiwgYWxwaGEgPSAuNSwgYm9yZGVyLmNvbCA9ICJyZWQiLCBsdHk9ICJzb2xpZCIpKw0KICB0bV9sYXlvdXQodGl0bGU9IkhPTEMgZ3JhZGVzIExheWVyZWQgb24gU0EgMjAyMCBDZW5zdXMgVHJhY3RzIiwNCiAgICAgICAgICAgIHRpdGxlLnNpemUgPTEuNSwNCiAgICAgICAgICAgIGxlZ2VuZC5mcmFtZSA9IFRSVUUsDQogICAgICAgICAgICB0aXRsZS5wb3NpdGlvbiA9IGMoJ3JpZ2h0JywgJ3RvcCcpKQ0KDQojIHRtX3NoYXBlKGhvbGN0cmFjdCkrDQojICAgIHRtX3BvbHlnb25zKCJpc29oIiwgcGFsZXR0ZSA9ICItdmlyaWRpcyIsIG4gPSAxMCwgY29udHJhc3QgPSBjKDAsIDAuNTIpKSsNCiMgICB0bV9zaGFwZShob2xjQ0QpKw0KIyAgIHRtX3BvbHlnb25zKCJob2xjX2dyYWRlIixwYWxldHRlID0gImJsYWNrIiwgYWxwaGEgPSAuMywgYm9yZGVyLmNvbCA9ICJyZWQiLCBsdHk9ICJzb2xpZCIsIGx0dyA9IDEwMCkNCiMgDQojIA0KIyB0bV9zaGFwZShob2xjdHJhY3RBQikrDQojICAgdG1fcG9seWdvbnMoImlzb2giKSsNCiMgICB0bV9zaGFwZShob2xjQUIpKw0KIyAgIHRtX3BvbHlnb25zKCJob2xjX2dyYWRlIiwgYWxwaGEgPSAwLCBib3JkZXIuY29sID0gInJlZCIsIGx0eT0gInNvbGlkIikNCiMgDQojIHRtX3NoYXBlKGhvbGN0cmFjdENEKSsNCiMgICB0bV9wb2x5Z29ucygiaXNvaCIpKw0KIyAgIHRtX3NoYXBlKGhvbGNDRCkrDQojICAgdG1fcG9seWdvbnMoImhvbGNfZ3JhZGUiLCBhbHBoYSA9IDAsIGJvcmRlci5jb2wgPSAicmVkIiwgbHR5PSAic29saWQiKQ0KIyANCiMgI1doaXRlIGlzb2xhdGlvbg0KIyB0bV9zaGFwZShob2xjdHJhY3QpKw0KIyAgICB0bV9wb2x5Z29ucygiaXNvdyIsIHBhbGV0dGUgPSAiLXZpcmlkaXMiLCBuID0gMTAsIGNvbnRyYXN0ID0gYygwLCAwLjUyKSkrDQojICAgdG1fc2hhcGUoaG9sY0FCKSsNCiMgICB0bV9wb2x5Z29ucygiaG9sY19ncmFkZSIscGFsZXR0ZSA9ICJibGFjayIsIGFscGhhID0gLjMsIGJvcmRlci5jb2wgPSAicmVkIiwgbHR5PSAic29saWQiLCBsdHcgPSAxMDApDQojIA0KIyANCiMgdG1fc2hhcGUoaG9sY3RyYWN0QUIpKw0KIyAgIHRtX3BvbHlnb25zKCJpc293IikrDQojICAgdG1fc2hhcGUoaG9sY0FCKSsNCiMgICB0bV9wb2x5Z29ucygiaG9sY19ncmFkZSIsIGFscGhhID0gMCwgYm9yZGVyLmNvbCA9ICJyZWQiLCBsdHk9ICJzb2xpZCIpDQojIA0KIyB0bV9zaGFwZShob2xjdHJhY3RDRCkrDQojICAgdG1fcG9seWdvbnMoImlzb3ciKSsNCiMgICB0bV9zaGFwZShob2xjQ0QpKw0KIyAgIHRtX3BvbHlnb25zKCJob2xjX2dyYWRlIiwgYWxwaGEgPSAwLCBib3JkZXIuY29sID0gInJlZCIsIGx0eT0gInNvbGlkIikNCiMgDQojIHRtX3NoYXBlKGhvbGN0cmFjdEQpKw0KIyAgIHRtX3BvbHlnb25zKCJoaXNwIikrDQojICAgdG1fc2hhcGUoaG9sY0QpKw0KIyAgIHRtX3BvbHlnb25zKCJob2xjX2dyYWRlIiwgYWxwaGEgPSAwLCBib3JkZXIuY29sID0gInJlZCIsIGx0eT0gInNvbGlkIikNCg0KYGBgDQoNCiMjIE1ha2UgYSBtYXAgbGF5b3V0DQoNCmBgYHtyLCBmaWcuaGVpZ2h0PTEwLCBmaWcud2lkdGg9MTJ9DQoNCg0KI3RtYXB0b29sczo6cGFsZXR0ZV9leHBsb3JlcigpDQojSGlzcGFuaWMgaXNvbGF0aW9uDQoNCnRtYXBfbW9kZSgicGxvdCIpDQpwMTwtdG1fc2hhcGUoaG9sY3RyYWN0KSsNCiAgdG1fcG9seWdvbnMoYygiaXNvaCIpLA0KICAgICAgICAgICAgICB0aXRsZT1jKCJIaXNwYW5pYyBJc29sYXRpb24gIiksDQogICAgICAgICAgICAgIHBhbGV0dGU9IkJsdWVzIiwNCiAgICAgICAgICAgICAgc3R5bGU9InF1YW50aWxlIiwNCiAgICAgICAgICAgICAgbj01KSsNCiAgdG1fc2NhbGVfYmFyKCkrDQogIHRtX2xheW91dCh0aXRsZT0iSGlzcGFuaWMgSXNvbGF0aW9uIEluZGV4IGJ5IENlbnN1cyBUcmFjdCAyMDIwIiwNCiAgICAgICAgICAgIHRpdGxlLnNpemUgPTEuNSwNCiAgICAgICAgICAgIGxlZ2VuZC5mcmFtZSA9IFRSVUUsDQogICAgICAgICAgICB0aXRsZS5wb3NpdGlvbiA9IGMoJ3JpZ2h0JywgJ3RvcCcpKSsNCiAgdG1fY29tcGFzcygpKw0KICB0bV9mb3JtYXQoIldvcmxkIiwNCiAgICAgICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICBjKCJsZWZ0IiwgImJvdHRvbSIpLA0KICAgICAgICAgICAgbWFpbi50aXRsZS5wb3NpdGlvbiA9YygiY2VudGVyIikpKw0KICAgIHRtX3NoYXBlKGhvbGNDRCkrDQogIHRtX3BvbHlnb25zKCJob2xjX2dyYWRlIixwYWxldHRlID0gInJlZCIsIGFscGhhID0gLjMsIGJvcmRlci5jb2wgPSAicmVkIiwgbHR5PSAic29saWQiLCBsdHcgPSAxMDApDQoNCg0KcDI8LXRtX3NoYXBlKGhvbGN0cmFjdCkrDQogIHRtX3BvbHlnb25zKGMoImlzb3ciKSwNCiAgICAgICAgICAgICAgdGl0bGU9YygiV2hpdGUgSXNvbGF0aW9uICIpLA0KICAgICAgICAgICAgICBwYWxldHRlPSJHcmVlbnMiLA0KICAgICAgICAgICAgICBzdHlsZT0icXVhbnRpbGUiLA0KICAgICAgICAgICAgICBuPTUpKw0KICB0bV9zY2FsZV9iYXIoKSsNCiAgdG1fbGF5b3V0KHRpdGxlPSJXaGl0ZSBJc29sYXRpb24gSW5kZXggYnkgQ2Vuc3VzIFRyYWN0IDIwMjAiLA0KICAgICAgICAgICAgdGl0bGUuc2l6ZSA9MS41LA0KICAgICAgICAgICAgbGVnZW5kLmZyYW1lID0gVFJVRSwNCiAgICAgICAgICAgIHRpdGxlLnBvc2l0aW9uID0gYygncmlnaHQnLCAndG9wJykpKw0KICB0bV9jb21wYXNzKCkrDQogIHRtX2Zvcm1hdCgiV29ybGQiLA0KICAgICAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gIGMoImxlZnQiLCAiYm90dG9tIiksDQogICAgICAgICAgICBtYWluLnRpdGxlLnBvc2l0aW9uID1jKCJjZW50ZXIiKSkrDQogICAgdG1fc2hhcGUoaG9sY0FCKSsNCiAgdG1fcG9seWdvbnMoImhvbGNfZ3JhZGUiLHBhbGV0dGUgPSAicmVkIiwgYWxwaGEgPSAuMywgYm9yZGVyLmNvbCA9ICJyZWQiLCBsdHk9ICJzb2xpZCIsIGx0dyA9IDEwMCkNCg0KDQp0bWFwX2FycmFuZ2UocDEscDIsIG5yb3c9MSkNCg0KDQpgYGANCg0KDQoNCg0K