Marriage Rate and Population by U.S. County: Are people less likely to commit in areas with more options for partners?
This week’s homework uses spatial mapping to explore how population size might compare with marriage rates across the United States. Do higher concentrations of people affect the decision to commit to marriage? Using Social Explorer, I retrieved my data from the American Community Survey (5-Year Estimates). For this analysis, “Marriage Rate” refers to those who made the decision to get married, including both currently married as well as formerly married individuals (e.g. widows, divorcées..etc.).
Using the Tigris Package to Retrieve County-Level Shapefiles:
library(sf)
library(tigris)
options(tigris_class="sf")
t_county<-counties(cb=TRUE)
names(t_county)
[1] "STATEFP" "COUNTYFP" "COUNTYNS" "AFFGEOID" "GEOID" "NAME" "LSAD"
[8] "ALAND" "AWATER" "geometry"
Merging the Data:
comb_data<-t_county%>%
left_join(acsdata, by="GEOID")
Excluding Peripheral States:
t_comb_data_sub<-comb_data%>%
filter(STATEFP.x !="02")%>%
filter(STATEFP.x !="15")%>%
filter(STATEFP.x !="60")%>%
filter(STATEFP.x !="66")%>%
filter(STATEFP.x !="69")%>%
filter(STATEFP.x !="72")%>%
filter(STATEFP.x !="78")
Map #1: Population by U.S. County:
library(tmap)
library(tmaptools)
library(RColorBrewer)
us_states<-t_comb_data_sub%>%
aggregate_map(by="STATEFP.x")
USPopulationRate<-tm_shape(t_comb_data_sub, projection=2163) +tm_fill("PopOver15", title="Population", breaks=c(74,11214,25848,66608,10105722), style="fixed", palette="PuBu", border.col="grey", border.alpha=.4)+tm_shape(us_states)+tm_borders(lwd=.36, col="black", alpha=1) +tm_layout(panel.labels="Population By U.S. County", legend.outside = TRUE, legend.outside.position = "bottom")
USPopulationRate

Due to the large range of population sizes across the country, I manually included legend breaks using the minimum, 1st quartile, median, 3rd quartile, and maximum values.
Map #2: Marriage Rate by U.S. County:
MarriageRate<-tm_shape(t_comb_data_sub, projection = 2163)+tm_fill("Marriage_Rate", title="Marriage_Rate", breaks=c(32.12, 68.36, 73.57, 77.16, 89.86), style="fixed", palette="Reds", border.col="grey", border.alpha=.4)+tm_shape(us_states)+tm_borders(lwd=.36, col="black", alpha=1)+tm_layout(panel.labels="Marriage Rate by U.S. County", legend.outside=TRUE, legend.outside.position = "bottom")
MarriageRate

Once again, I created legend breaks using the minimum, 1st quartile, median, 3rd quartile, and maximum values.
library(grid)
grid.newpage()
pushViewport(viewport(layout=grid.layout(1,2)))
print(USPopulationRate, vp=viewport(layout.pos.col=1))
print(MarriageRate, vp=viewport(layout.pos.col=2))

As one can see from the maps above, there seems to be an inverse relationship between population size and the decision to get married, though this relationship is not perfect. Unsurprisingly, population size is largest along the coast and arond major cities. Marriage rates, on the other hand, appear to be lower in more populated states, such as California and New York. This may suggest that people are less likley to commit when more options for partners are available. However, my analysis is limited as I have not controlled for other factors such as migration and age.
Example of cb=TRUE vs. cb=FALSE:
When “Cb” (cartographic boundary shapefiles) is set to true, the map is more detailed and precise, whereas “cb”= FALSE produces a less detailed map (see both versions below). The most obvious differences between the below maps is the presence or absence of negative space. When cb=FALSE, certain details, such as lakes and other bodies of water, become non-existent, whereas cb=TRUE is able to differentiate between land and water in areas that are unclear.
t_county2<-counties(cb=FALSE)
names(t_county2)
[1] "STATEFP" "COUNTYFP" "COUNTYNS" "GEOID" "NAME" "NAMELSAD" "LSAD"
[8] "CLASSFP" "MTFCC" "CSAFP" "CBSAFP" "METDIVFP" "FUNCSTAT" "ALAND"
[15] "AWATER" "INTPTLAT" "INTPTLON" "geometry"
comb_data2<-t_county2%>%
left_join(acsdata, by="GEOID")
t_comb_data_sub2<-comb_data2%>%
filter(STATEFP.x !="02")%>%
filter(STATEFP.x !="15")%>%
filter(STATEFP.x !="60")%>%
filter(STATEFP.x !="66")%>%
filter(STATEFP.x !="69")%>%
filter(STATEFP.x !="72")%>%
filter(STATEFP.x !="78")
us_states2<-t_comb_data_sub2%>%
aggregate_map(by="STATEFP.x")
#cb=TRUE
tm_shape(t_comb_data_sub, projection = 2163)+tm_fill("Marriage_Rate", title="Marriage Rate", breaks=c(32.12, 68.36, 73.57, 77.16, 89.86), style="fixed", palette="Reds", border.col="grey", border.alpha=.4)+tm_shape(us_states)+tm_borders(lwd=.36, col="black", alpha=1)+tm_layout(panel.labels="cb=TRUE")

#cb=FALSE
tm_shape(t_comb_data_sub2, projection=2163) +tm_fill("Marriage_Rate", title="Marriage Rate", breaks=c(32.12, 68.36, 73.57, 77.16, 89.86), style="fixed", palette="Reds", border.col="grey", border.alpha=.4)+tm_shape(us_states2)+tm_borders(lwd=.36, col="black", alpha=1) +tm_layout(panel.labels="cb=FALSE")

LS0tCnRpdGxlOiAiU29jIDcxMjogSG9tZXdvcmsgMTAiCm91dHB1dDogaHRtbF9ub3RlYm9vawotLS0KKkplbm5pZmVyIEdhbmVsZXMqCjxici8+KjUvNS8xOSoKCiNNYXJyaWFnZSBSYXRlIGFuZCBQb3B1bGF0aW9uIGJ5IFUuUy4gQ291bnR5OiBBcmUgcGVvcGxlIGxlc3MgbGlrZWx5IHRvIGNvbW1pdCBpbiBhcmVhcyB3aXRoIG1vcmUgb3B0aW9ucyBmb3IgcGFydG5lcnM/CgpUaGlzIHdlZWsncyBob21ld29yayB1c2VzIHNwYXRpYWwgbWFwcGluZyB0byBleHBsb3JlIGhvdyBwb3B1bGF0aW9uIHNpemUgbWlnaHQgY29tcGFyZSB3aXRoIG1hcnJpYWdlIHJhdGVzIGFjcm9zcyB0aGUgVW5pdGVkIFN0YXRlcy4gRG8gaGlnaGVyIGNvbmNlbnRyYXRpb25zIG9mIHBlb3BsZSBhZmZlY3QgdGhlIGRlY2lzaW9uIHRvIGNvbW1pdCB0byBtYXJyaWFnZT8gVXNpbmcgU29jaWFsIEV4cGxvcmVyLCBJIHJldHJpZXZlZCBteSBkYXRhIGZyb20gdGhlIEFtZXJpY2FuIENvbW11bml0eSBTdXJ2ZXkgKDUtWWVhciBFc3RpbWF0ZXMpLiBGb3IgdGhpcyBhbmFseXNpcywgIk1hcnJpYWdlIFJhdGUiIHJlZmVycyB0byB0aG9zZSB3aG8gbWFkZSB0aGUgZGVjaXNpb24gdG8gZ2V0IG1hcnJpZWQsIGluY2x1ZGluZyBib3RoIGN1cnJlbnRseSBtYXJyaWVkIGFzIHdlbGwgYXMgZm9ybWVybHkgbWFycmllZCBpbmRpdmlkdWFscyAoZS5nLiB3aWRvd3MsIGRpdm9yY8OpZXMuLmV0Yy4pLiAKCiMjI1VzaW5nIFNvY2lhbCBFeHBsb3JlciB0byByZXRyaWV2ZSBjb3VudHktbGV2ZWwgaW5mb3JtYXRpb246Ck1hcnJpYWdlIHJhdGUgd2FzIGNhbGN1bGF0ZWQgYnkgZGl2aWRpbmcgKnRoZSB0b3RhbCBudW1iZXIgb2YgcGVvcGxlIGluIGVhY2ggY291bnR5IHdobyBoYXZlIG1hZGUgdGhlIGRlY2lzaW9uIHRvIGdldCBtYXJyaWVkKiBieSAqdGhlIHRvdGFsIHBvcHVsYXRpb24gaW4gZWFjaCBjb3VudHkgb2YgdGhvc2Ugb3ZlciB0aGUgYWdlIG9mIDE1Ki4KYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KbGlicmFyeShyZWFkcikKbGlicmFyeShkcGx5cikKbGlicmFyeShtYWdyaXR0cikKCmFjc2RhdGE8LXJlYWRfY3N2KCIvVXNlcnMvamVubmlmZXJnYW5lbGVzL0Rvd25sb2Fkcy9SMTIxNDIyODZfU0wwNTAuY3N2IiklPiUKICAgIHJlbmFtZShUb3RhbF9Qb3A9U0VfQTAwMDAxXzAwMSwKICAgICAgICAgU1RBVEVGUD1HZW9fU1RBVEUsCiAgICAgICAgIENPVU5UWUZQPUdlb19DT1VOVFksCiAgICAgICAgIEdFT0lEPUdlb19GSVBTLAogICAgICAgICBQb3BPdmVyMTU9U0VfQTExMDAxXzAwMSwKICAgICAgICAgTmV2ZXJfTWFycmllZD1TRV9BMTEwMDFfMDAyLAogICAgICAgICBNYXJyaWVkPVNFX0ExMTAwMV8wMDMsCiAgICAgICAgIFNlcGFyYXRlZD1TRV9BMTEwMDFfMDA0LAogICAgICAgICBXaWRvd2VkPVNFX0ExMTAwMV8wMDUsCiAgICAgICAgIERpdm9yY2VkPVNFX0ExMTAwMV8wMDYpJT4lCiAgbXV0YXRlKE5NX1JhdGU9TmV2ZXJfTWFycmllZC9Qb3BPdmVyMTUqMTAwLAogICAgICAgICBIYXNfQmVlbl9NYXJyaWVkPU1hcnJpZWQrU2VwYXJhdGVkK1dpZG93ZWQrRGl2b3JjZWQsCiAgICAgICAgIE1hcnJpYWdlX1JhdGU9SGFzX0JlZW5fTWFycmllZC9Qb3BPdmVyMTUqMTAwKSU+JQogICAgICBzZWxlY3QoU1RBVEVGUCwgQ09VTlRZRlAsIEdFT0lELCBOZXZlcl9NYXJyaWVkLCBIYXNfQmVlbl9NYXJyaWVkLCBQb3BPdmVyMTUsIE5NX1JhdGUsIE1hcnJpYWdlX1JhdGUpCiAgIApoZWFkKGFjc2RhdGEpCnN1bW1hcnkoYWNzZGF0YSkKYGBgCgoKCgojIyNVc2luZyB0aGUgVGlncmlzIFBhY2thZ2UgdG8gUmV0cmlldmUgQ291bnR5LUxldmVsIFNoYXBlZmlsZXM6CmBgYHtyIG1lc3NhZ2U9RkFMU0V9CmxpYnJhcnkoc2YpCmxpYnJhcnkodGlncmlzKQpvcHRpb25zKHRpZ3Jpc19jbGFzcz0ic2YiKQp0X2NvdW50eTwtY291bnRpZXMoY2I9VFJVRSkKbmFtZXModF9jb3VudHkpCmBgYAojIyNNZXJnaW5nIHRoZSBEYXRhOgpgYGB7cn0KY29tYl9kYXRhPC10X2NvdW50eSU+JQogIGxlZnRfam9pbihhY3NkYXRhLCBieT0iR0VPSUQiKQpgYGAKCiMjI0V4Y2x1ZGluZyBQZXJpcGhlcmFsIFN0YXRlczoKYGBge3J9CnRfY29tYl9kYXRhX3N1YjwtY29tYl9kYXRhJT4lCiAgZmlsdGVyKFNUQVRFRlAueCAhPSIwMiIpJT4lCiAgZmlsdGVyKFNUQVRFRlAueCAhPSIxNSIpJT4lCiAgZmlsdGVyKFNUQVRFRlAueCAhPSI2MCIpJT4lCiAgZmlsdGVyKFNUQVRFRlAueCAhPSI2NiIpJT4lCiAgZmlsdGVyKFNUQVRFRlAueCAhPSI2OSIpJT4lCiAgZmlsdGVyKFNUQVRFRlAueCAhPSI3MiIpJT4lCiAgZmlsdGVyKFNUQVRFRlAueCAhPSI3OCIpCmBgYAoKCiMjIyBNYXAgIzE6IFBvcHVsYXRpb24gYnkgVS5TLiBDb3VudHk6CgpgYGB7ciB3YXJuaW5nPUZBTFNFfQpsaWJyYXJ5KHRtYXApCmxpYnJhcnkodG1hcHRvb2xzKQpsaWJyYXJ5KFJDb2xvckJyZXdlcikKdXNfc3RhdGVzPC10X2NvbWJfZGF0YV9zdWIlPiUKICBhZ2dyZWdhdGVfbWFwKGJ5PSJTVEFURUZQLngiKQpVU1BvcHVsYXRpb25SYXRlPC10bV9zaGFwZSh0X2NvbWJfZGF0YV9zdWIsIHByb2plY3Rpb249MjE2MykgK3RtX2ZpbGwoIlBvcE92ZXIxNSIsIHRpdGxlPSJQb3B1bGF0aW9uIiwgYnJlYWtzPWMoNzQsMTEyMTQsMjU4NDgsNjY2MDgsMTAxMDU3MjIpLCBzdHlsZT0iZml4ZWQiLCBwYWxldHRlPSJQdUJ1IiwgYm9yZGVyLmNvbD0iZ3JleSIsIGJvcmRlci5hbHBoYT0uNCkrdG1fc2hhcGUodXNfc3RhdGVzKSt0bV9ib3JkZXJzKGx3ZD0uMzYsIGNvbD0iYmxhY2siLCBhbHBoYT0xKSArdG1fbGF5b3V0KHBhbmVsLmxhYmVscz0iUG9wdWxhdGlvbiBCeSBVLlMuIENvdW50eSIsIGxlZ2VuZC5vdXRzaWRlID0gVFJVRSwgbGVnZW5kLm91dHNpZGUucG9zaXRpb24gPSAiYm90dG9tIikKVVNQb3B1bGF0aW9uUmF0ZQpgYGAKRHVlIHRvIHRoZSBsYXJnZSByYW5nZSBvZiBwb3B1bGF0aW9uIHNpemVzIGFjcm9zcyB0aGUgY291bnRyeSwgSSBtYW51YWxseSBpbmNsdWRlZCBsZWdlbmQgYnJlYWtzIHVzaW5nIHRoZSBtaW5pbXVtLCAxc3QgcXVhcnRpbGUsIG1lZGlhbiwgM3JkIHF1YXJ0aWxlLCBhbmQgbWF4aW11bSB2YWx1ZXMuIAoKIyMjTWFwICMyOiBNYXJyaWFnZSBSYXRlIGJ5IFUuUy4gQ291bnR5OgoKYGBge3J9Ck1hcnJpYWdlUmF0ZTwtdG1fc2hhcGUodF9jb21iX2RhdGFfc3ViLCBwcm9qZWN0aW9uID0gMjE2MykrdG1fZmlsbCgiTWFycmlhZ2VfUmF0ZSIsIHRpdGxlPSJNYXJyaWFnZV9SYXRlIiwgYnJlYWtzPWMoMzIuMTIsIDY4LjM2LCA3My41NywgNzcuMTYsIDg5Ljg2KSwgc3R5bGU9ImZpeGVkIiwgcGFsZXR0ZT0iUmVkcyIsIGJvcmRlci5jb2w9ImdyZXkiLCBib3JkZXIuYWxwaGE9LjQpK3RtX3NoYXBlKHVzX3N0YXRlcykrdG1fYm9yZGVycyhsd2Q9LjM2LCBjb2w9ImJsYWNrIiwgYWxwaGE9MSkrdG1fbGF5b3V0KHBhbmVsLmxhYmVscz0iTWFycmlhZ2UgUmF0ZSBieSBVLlMuIENvdW50eSIsIGxlZ2VuZC5vdXRzaWRlPVRSVUUsIGxlZ2VuZC5vdXRzaWRlLnBvc2l0aW9uID0gImJvdHRvbSIpCk1hcnJpYWdlUmF0ZQpgYGAKT25jZSBhZ2FpbiwgSSBjcmVhdGVkIGxlZ2VuZCBicmVha3MgdXNpbmcgdGhlIG1pbmltdW0sIDFzdCBxdWFydGlsZSwgbWVkaWFuLCAzcmQgcXVhcnRpbGUsIGFuZCBtYXhpbXVtIHZhbHVlcy4KCmBgYHtyIG1lc3NhZ2U9RkFMU0V9CmxpYnJhcnkoZ3JpZCkKZ3JpZC5uZXdwYWdlKCkKcHVzaFZpZXdwb3J0KHZpZXdwb3J0KGxheW91dD1ncmlkLmxheW91dCgxLDIpKSkKcHJpbnQoVVNQb3B1bGF0aW9uUmF0ZSwgdnA9dmlld3BvcnQobGF5b3V0LnBvcy5jb2w9MSkpCnByaW50KE1hcnJpYWdlUmF0ZSwgdnA9dmlld3BvcnQobGF5b3V0LnBvcy5jb2w9MikpCmBgYAoKQXMgb25lIGNhbiBzZWUgZnJvbSB0aGUgbWFwcyBhYm92ZSwgdGhlcmUgc2VlbXMgdG8gYmUgYW4gaW52ZXJzZSByZWxhdGlvbnNoaXAgYmV0d2VlbiBwb3B1bGF0aW9uIHNpemUgYW5kIHRoZSBkZWNpc2lvbiB0byBnZXQgbWFycmllZCwgdGhvdWdoIHRoaXMgcmVsYXRpb25zaGlwIGlzIG5vdCBwZXJmZWN0LiBVbnN1cnByaXNpbmdseSwgcG9wdWxhdGlvbiBzaXplIGlzIGxhcmdlc3QgYWxvbmcgdGhlIGNvYXN0IGFuZCBhcm9uZCBtYWpvciBjaXRpZXMuIE1hcnJpYWdlIHJhdGVzLCBvbiB0aGUgb3RoZXIgaGFuZCwgYXBwZWFyIHRvIGJlIGxvd2VyIGluIG1vcmUgcG9wdWxhdGVkIHN0YXRlcywgc3VjaCBhcyBDYWxpZm9ybmlhIGFuZCBOZXcgWW9yay4gVGhpcyBtYXkgc3VnZ2VzdCB0aGF0IHBlb3BsZSBhcmUgbGVzcyBsaWtsZXkgdG8gY29tbWl0IHdoZW4gbW9yZSBvcHRpb25zIGZvciBwYXJ0bmVycyBhcmUgYXZhaWxhYmxlLiBIb3dldmVyLCBteSBhbmFseXNpcyBpcyBsaW1pdGVkIGFzIEkgaGF2ZSBub3QgY29udHJvbGxlZCBmb3Igb3RoZXIgZmFjdG9ycyBzdWNoIGFzIG1pZ3JhdGlvbiBhbmQgYWdlLiAKCiMjI05vbi1TcGF0aWFsIENvdW50eS1MZXZlbCBJbmZvcm1hdGlvbjogCmBgYHtyfQpsaWJyYXJ5KGdncGxvdDIpCmxpYnJhcnkoZ2d0aGVtZXMpCmdncGxvdChkYXRhPWFjc2RhdGEsIGFlcyhNYXJyaWFnZV9SYXRlKSkrZ2VvbV9oaXN0b2dyYW0oYWVzKGZpbGw9IlJlZCIpKSt0aGVtZV90dWZ0ZSgpKyBsYWJzKHg9Ik1hcnJpYWdlIFJhdGUiLCB5PSJOdW1iZXIgb2YgVS5TLiBDb3VudGllcyIpK3RoZW1lKGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIpCmBgYApBcyB0aGUgaGlzdG9ncmFtIGFib3ZlIHNob3dzLCBjb3VudHkgbWFycmlhZ2UgcmF0ZXMgcmFuZ2UgZnJvbSBhcm91bmQgMzIlIHRvIGFib3V0IDkwJSB3aXRoIHRoZSBoaWdoZXN0IG51bWJlciBvZiBjb3VudGllcyBoYXZpbmcgYSBtYXJyaWFnZSByYXRlIG9mIGFib3V0IDczJS4KCmBgYHtyfQpnZ3Bsb3QoZGF0YT1hY3NkYXRhLCBhZXMoeD1Qb3BPdmVyMTUseT1NYXJyaWFnZV9SYXRlKSkrCiAgZ2VvbV9wb2ludCgpK3N0YXRfc21vb3RoKG1ldGhvZD0ibG0iKSsgdGhlbWVfdHVmdGUoKStsYWJzKHg9IlBvcHVsYXRpb24iLCB5PSJNYXJyaWFnZSBSYXRlIikKYGBgClRoZSBhYm92ZSBsaW5lYXIgbW9kZWwgZ3JhcGggc3VnZ2VzdHMgdGhhdCBhcyBjb3VudHkgcG9wdWxhdGlvbnMgaW5jcmVhc2UsIG1hcnJpYWdlIHJhdGVzIHRlbmQgdG8gZGVjcmVhc2UuIAoKIyMjU3BhdGlhbCB2cy4gTm9uLVNwYXRpYWwgSW5mb3JtYXRpb246ClNwYXRpYWwgbWFwcGluZyBkZXNjcmliZXMgdGhlIGFic29sdXRlIGFuZCByZWxhdGl2ZSBsb2NhdGlvbiBvZiBnZW9ncmFwaGljIGZlYXR1cmVzLCB3aGVyZWFzIG5vbi1zcGF0aWFsIGRhdGEgY2FuIG9ubHkgZGVzY3JpYmUgdGhlIGNoYXJhY3RlcmlzdGljcyBvZiBhIGdlb2dyYXBoaWNhbCBmZWF0dXJlIHVzaW5nIG51bWJlcnMsIGNoYXJhY3RlcnMsIG9yIGxvZ2ljYWwgc3RhdGVtZW50cy4gTm9uLXNwYXRpYWwgZGF0YSBpcyBvZnRlbnRpbWVzIHByZXNlbnRlZCBpbiBhIHdheSB0aGF0IGlzIGRpZmZpY3VsdCBmb3IgdGhlIGxheW1hbiB0byBjb21wcmVoZW5kIG9yIGNvbmNlcHR1YWxpemUuIFdoZW4gcmVzZWFyY2ggaXMgY2VudGVyZWQgYXJvdW5kIHBhdHRlcm5zIGNvbm5lY3RlZCB0byBsb2NhdGlvbiAoZS5nLiB0aGUgc3VpdGFiaWxpdHkgb2YgYSBwbGFjZSBmb3IgYSBzcGVjaWZpYyBhY3Rpdml0eSBvciBldmVudCksIHNwYXRpYWwgbWFwcGluZyBwcm92aWRlcyBhIG1vcmUgdW5kZXJzdGFuZGFibGUgdmlzdWFsaXphdGlvbiBvZiBjb21wbGV4IHNwYXRpYWwgaXNzdWVzLiAgSG93ZXZlciwgc3BhdGlhbCBtYXBwaW5nIGNhbm5vdCBhbHdheXMgcHJvdmlkZSB0aGUgbGV2ZWwgb2Ygc3BlY2lmaWNpdHkgbmVlZGVkIGZvciBjZXJ0YWluIGFuYWx5c2VzLiBOb24tc3BhdGlhbCBzdGF0aXN0aWNhbCBhbmFseXNpcyBpcyB0aGVyZWZvcmUgbmVlZGVkIGFzIHdlbGwuIEluIG15IGNhc2UsIHNwYXRpYWwgbWFwcGluZyBwcm92aWRlZCB1bmRlcnN0YW5kYWJsZSBhbmQgaW50cmlndWluZyBpbmZvcm1hdGlvbiByZWdhcmRpbmcgbG9jYXRpb24sIHBvcHVsYXRpb24gc2l6ZSwgYW5kIHRoZSB0ZW5kZW5jeSB0byBnZXQgbWFycmllZCwgYnV0IEkgdXNlZCBub24tc3BhdGlhbCBkYXRhLCBzdWNoIGFzIHN1bW1hcnkgc3RhdGlzdGljcywgaW4gb3JkZXIgdG8gaGVscCBjcmVhdGUgdGhlIG1hcHMgaW4gYSB3YXkgdGhhdCBwcmVzZW50ZWQgdGhlIG1vc3QgaW5mb3JtYXRpb24uIAoKCiMjI0V4YW1wbGUgb2YgY2I9VFJVRSB2cy4gY2I9RkFMU0U6IApXaGVuICJDYiIgKGNhcnRvZ3JhcGhpYyBib3VuZGFyeSBzaGFwZWZpbGVzKSBpcyBzZXQgdG8gdHJ1ZSwgdGhlIG1hcCBpcyBtb3JlIGRldGFpbGVkIGFuZCBwcmVjaXNlLCB3aGVyZWFzICJjYiI9IEZBTFNFIHByb2R1Y2VzIGEgbGVzcyBkZXRhaWxlZCBtYXAgKHNlZSBib3RoIHZlcnNpb25zIGJlbG93KS4gVGhlIG1vc3Qgb2J2aW91cyBkaWZmZXJlbmNlcyBiZXR3ZWVuIHRoZSBiZWxvdyBtYXBzIGlzIHRoZSBwcmVzZW5jZSBvciBhYnNlbmNlIG9mIG5lZ2F0aXZlIHNwYWNlLiBXaGVuIGNiPUZBTFNFLCBjZXJ0YWluIGRldGFpbHMsIHN1Y2ggYXMgbGFrZXMgYW5kIG90aGVyIGJvZGllcyBvZiB3YXRlciwgYmVjb21lIG5vbi1leGlzdGVudCwgd2hlcmVhcyBjYj1UUlVFIGlzIGFibGUgdG8gZGlmZmVyZW50aWF0ZSBiZXR3ZWVuIGxhbmQgYW5kIHdhdGVyIGluIGFyZWFzIHRoYXQgYXJlIHVuY2xlYXIuCmBgYHtyIG1lc3NhZ2U9RkFMU0V9CnRfY291bnR5MjwtY291bnRpZXMoY2I9RkFMU0UpCm5hbWVzKHRfY291bnR5MikKYGBgCgpgYGB7cn0KY29tYl9kYXRhMjwtdF9jb3VudHkyJT4lCiAgbGVmdF9qb2luKGFjc2RhdGEsIGJ5PSJHRU9JRCIpCmBgYApgYGB7cn0KdF9jb21iX2RhdGFfc3ViMjwtY29tYl9kYXRhMiU+JQogIGZpbHRlcihTVEFURUZQLnggIT0iMDIiKSU+JQogIGZpbHRlcihTVEFURUZQLnggIT0iMTUiKSU+JQogIGZpbHRlcihTVEFURUZQLnggIT0iNjAiKSU+JQogIGZpbHRlcihTVEFURUZQLnggIT0iNjYiKSU+JQogIGZpbHRlcihTVEFURUZQLnggIT0iNjkiKSU+JQogIGZpbHRlcihTVEFURUZQLnggIT0iNzIiKSU+JQogIGZpbHRlcihTVEFURUZQLnggIT0iNzgiKQpgYGAKCmBgYHtyfQp1c19zdGF0ZXMyPC10X2NvbWJfZGF0YV9zdWIyJT4lCiAgYWdncmVnYXRlX21hcChieT0iU1RBVEVGUC54IikKYGBgIAoKYGBge3J9CiNjYj1UUlVFCnRtX3NoYXBlKHRfY29tYl9kYXRhX3N1YiwgcHJvamVjdGlvbiA9IDIxNjMpK3RtX2ZpbGwoIk1hcnJpYWdlX1JhdGUiLCB0aXRsZT0iTWFycmlhZ2UgUmF0ZSIsIGJyZWFrcz1jKDMyLjEyLCA2OC4zNiwgNzMuNTcsIDc3LjE2LCA4OS44NiksIHN0eWxlPSJmaXhlZCIsIHBhbGV0dGU9IlJlZHMiLCBib3JkZXIuY29sPSJncmV5IiwgYm9yZGVyLmFscGhhPS40KSt0bV9zaGFwZSh1c19zdGF0ZXMpK3RtX2JvcmRlcnMobHdkPS4zNiwgY29sPSJibGFjayIsIGFscGhhPTEpK3RtX2xheW91dChwYW5lbC5sYWJlbHM9ImNiPVRSVUUiKQojY2I9RkFMU0UKdG1fc2hhcGUodF9jb21iX2RhdGFfc3ViMiwgcHJvamVjdGlvbj0yMTYzKSArdG1fZmlsbCgiTWFycmlhZ2VfUmF0ZSIsIHRpdGxlPSJNYXJyaWFnZSBSYXRlIiwgYnJlYWtzPWMoMzIuMTIsIDY4LjM2LCA3My41NywgNzcuMTYsIDg5Ljg2KSwgc3R5bGU9ImZpeGVkIiwgcGFsZXR0ZT0iUmVkcyIsIGJvcmRlci5jb2w9ImdyZXkiLCBib3JkZXIuYWxwaGE9LjQpK3RtX3NoYXBlKHVzX3N0YXRlczIpK3RtX2JvcmRlcnMobHdkPS4zNiwgY29sPSJibGFjayIsIGFscGhhPTEpICt0bV9sYXlvdXQocGFuZWwubGFiZWxzPSJjYj1GQUxTRSIpCmBgYAoK