Data Manipulations

# Get US county socio-economic variables from Area resource file 2019-2020

arf2020<-import("ahrf2020.sas7bdat") 
 arf2020<-arf2020%>%
  mutate(cofips=as.factor(f00004), 
         coname=f00010,
         state = f00011,
         medhouvl=f1461314,
         pctcrpop= round(100*(f1492010/f0453010),2),
         medhinc= f1434514,
         pctctyunemp=round(100*(f1451214/f1451014),2),
         ctypopdes= (f0453010/f1387410),  
         rucc= as.numeric(f0002013),
         pctperpov= f1332118,
         obgyn10_pc= 1000*(f1168410/ f0453010) )%>%
  dplyr::select(medhouvl, pctcrpop,medhinc, pctctyunemp,state, cofips, coname, ctypopdes, rucc, obgyn10_pc,pctperpov)%>%
    mutate(rurality= car::Recode(rucc, recodes ="1:7 ='Urban';8:9='Rural'"))


# Get other  US county socioeconomic variables from the 5 year (2015-2019) ASC data source.

 US_county <- get_acs(geography = 'county',variables = c(totPop19 = "B03003_001", 
                                                   hispanic ="B03003_003", 
                                                   afrAm = "B03002_004",
                                                   white="B03002_003",
                                                   gini="B19083_001"), 
                    year = 2019, geometry = TRUE, shift_geo = TRUE) %>% 
            dplyr::select(GEOID, NAME, variable, estimate) %>% 
            spread(variable, estimate) %>% 
            mutate(pcthispPr19  = round((hispanic/totPop19)*100),1, 
                   pctnhblackpr19 = round((afrAm/totPop19)*100),1 , pctnhpwhite19=round((white/totPop19)*100),1, cofips=as.factor(GEOID)) %>%
            dplyr::select(cofips,totPop19,pcthispPr19, pctnhblackpr19, pctnhpwhite19,gini)


#Merge the socioeconomic variables from the Area resource file 2019-2020 with the other socioeconomic variables from the 5 year (2015-2019) ACS estimates.

 sevar <- geo_join( US_county, arf2020, by_sp="cofips", by_df="cofips",how="left") 

 #load and calculate maternal mortality rates for counties in US for  a 5year period (2015-2019)
alldat<-readRDS("~/OneDrive - University of Texas at San Antonio/maternalmortality/aggregate/alldat.rds") 
 countyMMR <-  alldat %>% 
  group_by(cofips)%>%
  summarise(nbir=sum(nbirths, na.rm = T), ndea = sum(ndeaths, na.rm = T))  %>% 
  mutate(mmrate =round(100000*(ndea/nbir),2))
 
  #Merge the socioeconomic variables with US counties maternal mortality rates for a 5- years period(2015-2019)
MMRdata<- geo_join( sevar, countyMMR, by_sp="cofips", by_df="cofips",how="left") %>% 
  mutate(rmmrate=ifelse(mmrate>=1,mmrate,NA)) %>% 
  filter(!is.na(ndea), mmrate!=Inf) 

Descriptive Maps

Defining Outcome and Predictor Variables

The dependent variable in this analysis is maternal mortality rates in US counties. Predictors for this analysis include; percentage of county population that is rural; the median household income in the county; the county’s median house value; the population density per square mile in the county. The per capital number of OB-GYN in the county; gini coefficient as a relative measure of income inequality; percentage of non Hispanic black population in the counties. All variables were Z scored

Estimating Linear Regression

Table 1: Regression Analysis Modeling US County Maternal Mortality Rates, 2015-2019
Characteristic Beta 95% CI1 p-value
Rurality 0.002
Rural
Urban 0.12 0.05, 0.20
Median Household Income -0.12 -0.16, -0.08 <0.001
Median House Value 0.03 0.00, 0.07 0.081
Percent of Rural Population 0.08 0.04, 0.12 <0.001
Population Density 0.82 0.79, 0.84 <0.001
Per Capita OB-GYN -0.08 -0.11, -0.05 <0.001
Percent of Non-Hispanic Black -0.03 -0.06, -0.01 0.008
Gini Coefficient -0.05 -0.07, -0.02 0.002
R² = 0.598; AIC = 5,996; Adjusted R² = 0.597; Degrees of Freedom = 8

1 CI = Confidence Interval

Urban areas have higher maternal mortality rates than rural areas, based on the first coefficient in the model . County characteristics associated with higher maternal mortality rates include: Percentage of county rural population, and The county population density.

County characteristics associated with lower maternal mortality rates are: the median household income, per capital number of OB-GYN in the county ,proportion of the county population that are non-Hispanic black, and the county Gini coefficient .

Median house value was not significantly related to maternal mortality.

Testing for Non-Stationarity

Non-Stationarity Test
Res.DF RSS DF SumSq Statistic P.Value
3059 1259.68 NA NA NA NA
3058 1257.91 1 1.77 4.3 0.04

The test from above shows that the regression effects are not constant between the regimes(Rural and Urban). This is because the F test is significant(p-value 0.03855). This indicate non-stationarity in the models

Urban Model

Table 2: Regression Analysis Modeling Urban County Maternal Mortality Rates, 2015-2019
Characteristic Beta 95% CI1 p-value
Median Household Income -0.16 -0.21, -0.11 <0.001
Median House Value 0.06 0.01, 0.10 0.020
Percent of Rural Population 0.07 0.03, 0.11 <0.001
Population Density 0.82 0.79, 0.84 <0.001
Per Capita OB-GYN -0.08 -0.12, -0.05 <0.001
Percent of Non-Hispanic Black -0.04 -0.07, 0.00 0.028
Gini Coefficient -0.07 -0.11, -0.03 0.001
R² = 0.600; AIC = 5,319; Adjusted R² = 0.599; Degrees of Freedom = 7

1 CI = Confidence Interval

For the Urban counties, the overall interpretation is similar to what it was for the pooled data. However, compared to the pooled data model, the urban data shows that the Median house value is significantly related to Maternal mortality.

County characteristics associated with higher maternal mortality rates include:County median house value, Percentage of county rural population, and the county population density.

County characteristics associated with lower maternal mortality rates are: the median household income, per capital number of OB-GYN in the county ,proportion of the county population that are non-Hispanic black, and the county Gini coefficient .

Rural Model

Table 3: Regression Analysis Modeling Rural County Maternal Mortality Rates, 2015-2019
Characteristic Beta 95% CI1 p-value
Median Household Income 0.00 0.00, 0.00 0.058
Median House Value 0.00 0.00, 0.00 0.9
Percent of Rural Population 0.00 -0.01, 0.00 0.4
Population Density -0.01 -0.09, 0.06 0.7
Per Capita OB-GYN 0.00 0.00, 0.00 0.4
Percent of Non-Hispanic Black 0.00 0.00, 0.00 0.8
Gini Coefficient 0.00 0.00, 0.00 0.2
R² = 0.010; AIC = -3,647; Adjusted R² = -0.001; Degrees of Freedom = 7

1 CI = Confidence Interval

For the Rural counties, the overall interpretation is different from what it was for the pooled data. In fact, non of the predictors were significantly associated with maternal mortality rates.

LS0tCnRpdGxlOiAiU3BhdGlhbCBEZW1vZ3JhcGh5IC0gSG9tZXdrIDMgLVNwYXRpYWwgUmVnaW1lcyIKYXV0aG9yOiAiU2Ftc29uIEEuIE9sb3dvbGFqdSwgTVBIIgpkYXRlOiAiMTEgT2N0b2JlciwgMjAyMSIKb3V0cHV0OgogICBodG1sX2RvY3VtZW50OgogICAgZGZfcHJpbnQ6IHBhZ2VkCiAgICBmaWdfaGVpZ2h0OiA3CiAgICBmaWdfd2lkdGg6IDcKICAgIHRvYzogeWVzCiAgICB0b2NfZmxvYXQ6IHllcwogICAgY29kZV9kb3dubG9hZDogdHJ1ZQotLS0KCgpgYGB7ciBsb2FkbGlicywgd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRSxlY2hvPUZBTFNFfQpsaWJyYXJ5KG5vcnRlc3QpCmxpYnJhcnkoY2FyKQpsaWJyYXJ5KGxtdGVzdCkKbGlicmFyeShjbGFzc0ludCkKbGlicmFyeShzYW5kd2ljaCkKbGlicmFyeSh0aWR5dmVyc2UpCmxpYnJhcnkoc3BkZXApCmxpYnJhcnkocmlvKQpsaWJyYXJ5KGthYmxlRXh0cmEpCmxpYnJhcnkoYnJvb20pCmxpYnJhcnkodGlkeWNlbnN1cykKbGlicmFyeShzZikKbGlicmFyeSh0aWdyaXMpCmxpYnJhcnkoc3BhdGlhbHJlZykKbGlicmFyeShtYXB2aWV3KQpsaWJyYXJ5KGdyaWRFeHRyYSkKbGlicmFyeShndHN1bW1hcnkpCmBgYAoKIyMjIERhdGEgTWFuaXB1bGF0aW9ucwpgYGB7cix3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFfQojIEdldCBVUyBjb3VudHkgc29jaW8tZWNvbm9taWMgdmFyaWFibGVzIGZyb20gQXJlYSByZXNvdXJjZSBmaWxlIDIwMTktMjAyMAoKYXJmMjAyMDwtaW1wb3J0KCJhaHJmMjAyMC5zYXM3YmRhdCIpIAogYXJmMjAyMDwtYXJmMjAyMCU+JQogIG11dGF0ZShjb2ZpcHM9YXMuZmFjdG9yKGYwMDAwNCksIAogICAgICAgICBjb25hbWU9ZjAwMDEwLAogICAgICAgICBzdGF0ZSA9IGYwMDAxMSwKICAgICAgICAgbWVkaG91dmw9ZjE0NjEzMTQsCiAgICAgICAgIHBjdGNycG9wPSByb3VuZCgxMDAqKGYxNDkyMDEwL2YwNDUzMDEwKSwyKSwKICAgICAgICAgbWVkaGluYz0gZjE0MzQ1MTQsCiAgICAgICAgIHBjdGN0eXVuZW1wPXJvdW5kKDEwMCooZjE0NTEyMTQvZjE0NTEwMTQpLDIpLAogICAgICAgICBjdHlwb3BkZXM9IChmMDQ1MzAxMC9mMTM4NzQxMCksICAKICAgICAgICAgcnVjYz0gYXMubnVtZXJpYyhmMDAwMjAxMyksCiAgICAgICAgIHBjdHBlcnBvdj0gZjEzMzIxMTgsCiAgICAgICAgIG9iZ3luMTBfcGM9IDEwMDAqKGYxMTY4NDEwLyBmMDQ1MzAxMCkgKSU+JQogIGRwbHlyOjpzZWxlY3QobWVkaG91dmwsIHBjdGNycG9wLG1lZGhpbmMsIHBjdGN0eXVuZW1wLHN0YXRlLCBjb2ZpcHMsIGNvbmFtZSwgY3R5cG9wZGVzLCBydWNjLCBvYmd5bjEwX3BjLHBjdHBlcnBvdiklPiUKICAgIG11dGF0ZShydXJhbGl0eT0gY2FyOjpSZWNvZGUocnVjYywgcmVjb2RlcyA9IjE6NyA9J1VyYmFuJzs4Ojk9J1J1cmFsJyIpKQoKCiMgR2V0IG90aGVyICBVUyBjb3VudHkgc29jaW9lY29ub21pYyB2YXJpYWJsZXMgZnJvbSB0aGUgNSB5ZWFyICgyMDE1LTIwMTkpIEFTQyBkYXRhIHNvdXJjZS4KCiBVU19jb3VudHkgPC0gZ2V0X2FjcyhnZW9ncmFwaHkgPSAnY291bnR5Jyx2YXJpYWJsZXMgPSBjKHRvdFBvcDE5ID0gIkIwMzAwM18wMDEiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGlzcGFuaWMgPSJCMDMwMDNfMDAzIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFmckFtID0gIkIwMzAwMl8wMDQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGl0ZT0iQjAzMDAyXzAwMyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdpbmk9IkIxOTA4M18wMDEiKSwgCiAgICAgICAgICAgICAgICAgICAgeWVhciA9IDIwMTksIGdlb21ldHJ5ID0gVFJVRSwgc2hpZnRfZ2VvID0gVFJVRSkgJT4lIAogICAgICAgICAgICBkcGx5cjo6c2VsZWN0KEdFT0lELCBOQU1FLCB2YXJpYWJsZSwgZXN0aW1hdGUpICU+JSAKICAgICAgICAgICAgc3ByZWFkKHZhcmlhYmxlLCBlc3RpbWF0ZSkgJT4lIAogICAgICAgICAgICBtdXRhdGUocGN0aGlzcFByMTkgID0gcm91bmQoKGhpc3BhbmljL3RvdFBvcDE5KSoxMDApLDEsIAogICAgICAgICAgICAgICAgICAgcGN0bmhibGFja3ByMTkgPSByb3VuZCgoYWZyQW0vdG90UG9wMTkpKjEwMCksMSAsIHBjdG5ocHdoaXRlMTk9cm91bmQoKHdoaXRlL3RvdFBvcDE5KSoxMDApLDEsIGNvZmlwcz1hcy5mYWN0b3IoR0VPSUQpKSAlPiUKICAgICAgICAgICAgZHBseXI6OnNlbGVjdChjb2ZpcHMsdG90UG9wMTkscGN0aGlzcFByMTksIHBjdG5oYmxhY2twcjE5LCBwY3RuaHB3aGl0ZTE5LGdpbmkpCgoKI01lcmdlIHRoZSBzb2Npb2Vjb25vbWljIHZhcmlhYmxlcyBmcm9tIHRoZSBBcmVhIHJlc291cmNlIGZpbGUgMjAxOS0yMDIwIHdpdGggdGhlIG90aGVyIHNvY2lvZWNvbm9taWMgdmFyaWFibGVzIGZyb20gdGhlIDUgeWVhciAoMjAxNS0yMDE5KSBBQ1MgZXN0aW1hdGVzLgoKIHNldmFyIDwtIGdlb19qb2luKCBVU19jb3VudHksIGFyZjIwMjAsIGJ5X3NwPSJjb2ZpcHMiLCBieV9kZj0iY29maXBzIixob3c9ImxlZnQiKSAKCiAjbG9hZCBhbmQgY2FsY3VsYXRlIG1hdGVybmFsIG1vcnRhbGl0eSByYXRlcyBmb3IgY291bnRpZXMgaW4gVVMgZm9yICBhIDV5ZWFyIHBlcmlvZCAoMjAxNS0yMDE5KQphbGxkYXQ8LXJlYWRSRFMoIn4vT25lRHJpdmUgLSBVbml2ZXJzaXR5IG9mIFRleGFzIGF0IFNhbiBBbnRvbmlvL21hdGVybmFsbW9ydGFsaXR5L2FnZ3JlZ2F0ZS9hbGxkYXQucmRzIikgCiBjb3VudHlNTVIgPC0gIGFsbGRhdCAlPiUgCiAgZ3JvdXBfYnkoY29maXBzKSU+JQogIHN1bW1hcmlzZShuYmlyPXN1bShuYmlydGhzLCBuYS5ybSA9IFQpLCBuZGVhID0gc3VtKG5kZWF0aHMsIG5hLnJtID0gVCkpICAlPiUgCiAgbXV0YXRlKG1tcmF0ZSA9cm91bmQoMTAwMDAwKihuZGVhL25iaXIpLDIpKQogCiAgI01lcmdlIHRoZSBzb2Npb2Vjb25vbWljIHZhcmlhYmxlcyB3aXRoIFVTIGNvdW50aWVzIG1hdGVybmFsIG1vcnRhbGl0eSByYXRlcyBmb3IgYSA1LSB5ZWFycyBwZXJpb2QoMjAxNS0yMDE5KQpNTVJkYXRhPC0gZ2VvX2pvaW4oIHNldmFyLCBjb3VudHlNTVIsIGJ5X3NwPSJjb2ZpcHMiLCBieV9kZj0iY29maXBzIixob3c9ImxlZnQiKSAlPiUgCiAgbXV0YXRlKHJtbXJhdGU9aWZlbHNlKG1tcmF0ZT49MSxtbXJhdGUsTkEpKSAlPiUgCiAgZmlsdGVyKCFpcy5uYShuZGVhKSwgbW1yYXRlIT1JbmYpIApgYGAKCgpgYGB7ciwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSxlY2hvPUZBTFNFfQoKIyBBc3NpZ24gQ1JTICB0byB0aGUgZGF0YXNldCBmb3IgcHJvcGVyIG1hcCBwcm9qZWN0aW9uLAp1c2N0eW1tcjwtIHN0X3RyYW5zZm9ybShNTVJkYXRhLCAzMDgzKQoKIyBNYWtlIFVTIGNvdW50eSBNYXRlcm5hbCBNb3J0YWxpdHkgUmF0ZSBNYXAKVVNtbXIgPC0gdXNjdHltbXIlPiUKICBtdXRhdGUoTU1SX2dyb3VwID0gY3V0KHJtbXJhdGUsIGJyZWFrcz1xdWFudGlsZShybW1yYXRlLCBuYS5ybT1UUlVFKSwgaW5jbHVkZS5sb3dlc3Q9VCApKSU+JQogIGdncGxvdCgpKwogIGdlb21fc2YoYWVzKGZpbGw9TU1SX2dyb3VwKSkrCiAgc2NhbGVfZmlsbF9icmV3ZXIobmFtZT0iTWF0ZXJuYWwgTW9ydGFsaXR5IFJhdGUiLCBwYWxldHRlID0gIllsR24iCiAgICAgICAgICAgICAgICAgICAgKSsKICBnZ3RpdGxlKCJVUyBDb3VudGllcyBNYXRlcm5hbCBNb3J0YWxpdHkgUmF0ZSBQZXIgMTAwLDAwMCwgMjAxNS0yMDE5IikrCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTEwLCBoanVzdCA9IDAuMikpICsKICB0aGVtZSgKICAgICAgICBsZWdlbmQua2V5LndpZHRoID0gdW5pdCgwLjI1LCAiaW4iKSwKICAgICAgICBsZWdlbmQua2V5LmhlaWdodCA9IHVuaXQoMC4yLCAiaW4iKSwKICAgICAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplPTgpLAogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGF4aXMudGlja3MgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gIndoaXRlIiwgY29sb3IgPSBOQSkpCgojTWFrZSBtYXAgZm9yIHRoZSBTcGF0aWFsIFJlZ2ltZSAKc3BhcmVnIDwtdXNjdHltbXIgJT4lIApnZ3Bsb3QoKSsKICBnZW9tX3NmKGFlcyhmaWxsPXJ1cmFsaXR5KSkrCiAgc2NhbGVfZmlsbF9icmV3ZXIobmFtZT0iQ291bnR5IFR5cGUiLCBwYWxldHRlID0gIllsR24iCiAgICAgICAgICAgICAgICAgICAgKSsKICBnZ3RpdGxlKCJVUyBDb3VudHkgUmVnaW1lIC0gVXJiYW4gJiBSdXJhbCIpKwogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0xMCwgaGp1c3QgPSAwLjIpKSArCiAgdGhlbWUoCiAgICAgICAgbGVnZW5kLmtleS53aWR0aCA9IHVuaXQoMC4yNSwgImluIiksCiAgICAgICAgbGVnZW5kLmtleS5oZWlnaHQgPSB1bml0KDAuMiwgImluIiksCiAgICAgICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZT04KSwKICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBheGlzLnRpY2tzID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJ3aGl0ZSIsIGNvbG9yID0gTkEpKQpgYGAKCiMjIyBEZXNjcmlwdGl2ZSBNYXBzCmBgYHtyLCBlY2hvPUZBTFNFfQpncmlkLmFycmFuZ2UoVVNtbXIsc3BhcmVnLCBucm93ID0gMikKYGBgCgoKIyMjIERlZmluaW5nIE91dGNvbWUgYW5kIFByZWRpY3RvciBWYXJpYWJsZXMKVGhlIGRlcGVuZGVudCB2YXJpYWJsZSBpbiB0aGlzIGFuYWx5c2lzIGlzIG1hdGVybmFsIG1vcnRhbGl0eSByYXRlcyBpbiBVUyBjb3VudGllcy4gUHJlZGljdG9ycyBmb3IgdGhpcyBhbmFseXNpcyBpbmNsdWRlOyAKcGVyY2VudGFnZSBvZiBjb3VudHkgcG9wdWxhdGlvbiB0aGF0IGlzIHJ1cmFsOyB0aGUgbWVkaWFuIGhvdXNlaG9sZCBpbmNvbWUgaW4gdGhlIGNvdW50eTsgdGhlIGNvdW50eeKAmXMgbWVkaWFuIGhvdXNlIHZhbHVlOyB0aGUgcG9wdWxhdGlvbiBkZW5zaXR5IHBlciBzcXVhcmUgbWlsZSBpbiB0aGUgY291bnR5LiBUaGUgcGVyIGNhcGl0YWwgbnVtYmVyIG9mIE9CLUdZTiBpbiB0aGUgY291bnR5OyBnaW5pIGNvZWZmaWNpZW50IGFzIGEgcmVsYXRpdmUgbWVhc3VyZSBvZiBpbmNvbWUgaW5lcXVhbGl0eTsgcGVyY2VudGFnZSBvZiBub24gSGlzcGFuaWMgYmxhY2sgcG9wdWxhdGlvbiBpbiB0aGUgY291bnRpZXMuIEFsbCB2YXJpYWJsZXMgd2VyZSBaIHNjb3JlZCAKCmBgYHtyLHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIGVjaG89RkFMU0V9CiMgWiBzY29yZSBhbGwgdmFyaWFibGVzIAp1c2N0eW1tciRtbXJhdGV6PC1hcy5udW1lcmljKHNjYWxlKHVzY3R5bW1yJG1tcmF0ZSwgY2VudGVyPVQsIHNjYWxlPVQpKQp1c2N0eW1tciRtZWRoaW5jejwtYXMubnVtZXJpYyhzY2FsZSh1c2N0eW1tciRtZWRoaW5jLCBjZW50ZXI9VCwgc2NhbGU9VCkpCnVzY3R5bW1yJG1lZGhvdXZsejwtYXMubnVtZXJpYyhzY2FsZSh1c2N0eW1tciRtZWRob3V2bCwgY2VudGVyPVQsIHNjYWxlPVQpKQp1c2N0eW1tciRwY3RjcnBvcHo8LWFzLm51bWVyaWMoc2NhbGUodXNjdHltbXIkcGN0Y3Jwb3AsIGNlbnRlcj1ULCBzY2FsZT1UKSkKdXNjdHltbXIkcGN0cGVycG92ejwtYXMubnVtZXJpYyhzY2FsZSh1c2N0eW1tciRwY3RwZXJwb3YsIGNlbnRlcj1ULCBzY2FsZT1UKSkKdXNjdHltbXIkY3R5cG9wZGVzejwtYXMubnVtZXJpYyhzY2FsZSh1c2N0eW1tciRjdHlwb3BkZXMsIGNlbnRlcj1ULCBzY2FsZT1UKSkKdXNjdHltbXIkb2JneW4xMF9wY3o8LWFzLm51bWVyaWMoc2NhbGUodXNjdHltbXIkb2JneW4xMF9wYywgY2VudGVyPVQsIHNjYWxlPVQpKQp1c2N0eW1tciRwY3RjdHl1bmVtcHo8LWFzLm51bWVyaWMoc2NhbGUodXNjdHltbXIkcGN0Y3R5dW5lbXAsIGNlbnRlcj1ULCBzY2FsZT1UKSkKdXNjdHltbXIkcnVjY3o8LWFzLm51bWVyaWMoc2NhbGUodXNjdHltbXIkcnVjYywgY2VudGVyPVQsIHNjYWxlPVQpKQp1c2N0eW1tciRwY3RoaXNwUHIxOXo8LWFzLm51bWVyaWMoc2NhbGUodXNjdHltbXIkcGN0aGlzcFByMTksIGNlbnRlcj1ULCBzY2FsZT1UKSkKdXNjdHltbXIkcGN0bmhibGFja3ByMTl6PC1hcy5udW1lcmljKHNjYWxlKHVzY3R5bW1yJHBjdG5oYmxhY2twcjE5LCBjZW50ZXI9VCwgc2NhbGU9VCkpCnVzY3R5bW1yJHBjdG5ocHdoaXRlMTl6PC1hcy5udW1lcmljKHNjYWxlKHVzY3R5bW1yJHBjdG5ocHdoaXRlMTksIGNlbnRlcj1ULCBzY2FsZT1UKSkKdXNjdHltbXIkZ2luaXo8LWFzLm51bWVyaWMoc2NhbGUodXNjdHltbXIkZ2luaSwgY2VudGVyPVQsIHNjYWxlPVQpKQpgYGAKCiMjIyBFc3RpbWF0aW5nIExpbmVhciBSZWdyZXNzaW9uCmBgYHtyLHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIGVjaG89RkFMU0V9CiNmaXQgdGhlIE9MUyBtb2RlbCAKZml0Lm9scyA8LSBsbSggbW1yYXRleiB+cnVyYWxpdHkgKyBtZWRoaW5jeiArIG1lZGhvdXZseisgcGN0Y3Jwb3B6ICsgY3R5cG9wZGVzeiArIG9iZ3luMTBfcGN6ICsgcGN0bmhibGFja3ByMTl6K2dpbml6LAogICAgICAgICAgIGRhdGE9dXNjdHltbXIpJT4lIAogICB0YmxfcmVncmVzc2lvbiggZXhwPUZBTFNFLGxhYmVsPWxpc3QocnVyYWxpdHl+ICJSdXJhbGl0eSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWRoaW5jen4gIk1lZGlhbiBIb3VzZWhvbGQgSW5jb21lIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGhvdXZsen4iTWVkaWFuIEhvdXNlIFZhbHVlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBjdGNycG9weiB+ICJQZXJjZW50IG9mIFJ1cmFsIFBvcHVsYXRpb24iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R5cG9wZGVzen4gIlBvcHVsYXRpb24gRGVuc2l0eSIgLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JneW4xMF9wY3ogfiJQZXIgQ2FwaXRhIE9CLUdZTiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwY3RuaGJsYWNrcHIxOXp+IlBlcmNlbnQgb2YgTm9uLUhpc3BhbmljIEJsYWNrIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdpbml6fiJHaW5pIENvZWZmaWNpZW50IikpICU+JQogIAogIGFkZF9nbG9iYWxfcCgpICU+JSAKYWRkX2dsYW5jZV9zb3VyY2Vfbm90ZSgKICAgIGxhYmVsID0gbGlzdChkZiB+IkRlZ3JlZXMgb2YgRnJlZWRvbSIpLAogICAgZm10X2Z1biA9IGRmIH4gc3R5bGVfbnVtYmVyLAogICAgaW5jbHVkZSA9IGMoci5zcXVhcmVkLCBBSUMsIGFkai5yLnNxdWFyZWQsIGRmKQogICklPiUgCmJvbGRfbGFiZWxzKCklPiUgCiAgaXRhbGljaXplX2xldmVscygpJT4lIAogIGFzX2d0KCkgJT4lCiAgIyBtb2RpZnkgd2l0aCBndCBmdW5jdGlvbnMKICBndDo6dGFiX2hlYWRlcigiVGFibGUgMTogUmVncmVzc2lvbiBBbmFseXNpcyBNb2RlbGluZyBVUyBDb3VudHkgTWF0ZXJuYWwgTW9ydGFsaXR5IFJhdGVzLCAyMDE1LTIwMTkiKSAlPiUgCiAgZ3Q6OnRhYl9vcHRpb25zKAogICAgdGFibGUuZm9udC5zaXplID0gInNtYWxsIiwKICAgIGRhdGFfcm93LnBhZGRpbmcgPSBndDo6cHgoMSkpCmZpdC5vbHMKYGBgCgpVcmJhbiBhcmVhcyBoYXZlIGhpZ2hlciBtYXRlcm5hbCBtb3J0YWxpdHkgcmF0ZXMgdGhhbiBydXJhbCBhcmVhcywgYmFzZWQgb24gdGhlIGZpcnN0IGNvZWZmaWNpZW50IGluIHRoZSBtb2RlbCAgICBgciBjb2VmKGZpdC5vbHMpWzJdYC4gQ291bnR5IGNoYXJhY3RlcmlzdGljcyBhc3NvY2lhdGVkIHdpdGggaGlnaGVyIG1hdGVybmFsIG1vcnRhbGl0eSByYXRlcyBpbmNsdWRlOiBQZXJjZW50YWdlIG9mIGNvdW50eSBydXJhbCBwb3B1bGF0aW9uLCBhbmQgVGhlIGNvdW50eSBwb3B1bGF0aW9uIGRlbnNpdHkuIAoKQ291bnR5IGNoYXJhY3RlcmlzdGljcyBhc3NvY2lhdGVkIHdpdGggbG93ZXIgbWF0ZXJuYWwgbW9ydGFsaXR5IHJhdGVzIGFyZTogdGhlIG1lZGlhbiBob3VzZWhvbGQgaW5jb21lLCBwZXIgY2FwaXRhbCBudW1iZXIgb2YgT0ItR1lOIGluIHRoZSBjb3VudHkgLHByb3BvcnRpb24gb2YgdGhlIGNvdW50eSBwb3B1bGF0aW9uIHRoYXQgYXJlIG5vbi1IaXNwYW5pYyBibGFjaywgYW5kICB0aGUgY291bnR5IEdpbmkgY29lZmZpY2llbnQgLiAKCk1lZGlhbiBob3VzZSB2YWx1ZSB3YXMgbm90IHNpZ25pZmljYW50bHkgcmVsYXRlZCB0byBtYXRlcm5hbCBtb3J0YWxpdHkuIAoKIyMjIFRlc3RpbmcgZm9yIE5vbi1TdGF0aW9uYXJpdHkgCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLGVjaG89RkFMU0V9CmZpdC5hPC0gbG0oIG1tcmF0ZXogfnJ1cmFsaXR5ICsgbWVkaGluY3ogKyBtZWRob3V2bHorIHBjdGNycG9weiArIGN0eXBvcGRlc3ogKyBvYmd5bjEwX3BjeiArIHBjdG5oYmxhY2twcjE5eitnaW5peiwKICAgICAgICAgICBkYXRhPXVzY3R5bW1yKQpmaXQuYiA8LSBsbSggbW1yYXRleiB+cnVyYWxpdHkvIG1lZGhpbmN6ICsgbWVkaG91dmx6KyBwY3RjcnBvcHogKyBjdHlwb3BkZXN6ICsgb2JneW4xMF9wY3ogKyBwY3RuaGJsYWNrcHIxOXorZ2luaXosCiAgICAgICAgICAgZGF0YT11c2N0eW1tcikKIGFub3ZhKGZpdC5hLCBmaXQuYiwgdGVzdD0iRiIpICU+JSAKICB0aWR5ICgpICU+JSAKICAgcmVuYW1lKFJlcy5ERj1yZXMuZGYsCiAgICAgICAgICBSU1M9cnNzLAogICAgICAgICAgREY9ZGYsCiAgICAgICAgIFN1bVNxPXN1bXNxLAogICAgICAgICBTdGF0aXN0aWM9c3RhdGlzdGljLAogICAgICAgICBQLlZhbHVlPXAudmFsdWUpICU+JSAKICBrYmwgKGRpZ2l0ID0gMiwgY2FwdGlvbiA9ICJOb24tU3RhdGlvbmFyaXR5IFRlc3QiKSAlPiUgCiAga2FibGVfc3R5bGluZyggcG9zaXRpb24gPSAiYyIsIGZvbnRfc2l6ZSA9IDE0KSU+JSAKICBrYWJsZV9jbGFzc2ljKGZ1bGxfd2lkdGggPSBULCBodG1sX2ZvbnQgPSAiQ2FtYnJpYSIpIAoKYGBgCgoKVGhlIHRlc3QgZnJvbSBhYm92ZSBzaG93cyB0aGF0IHRoZSByZWdyZXNzaW9uIGVmZmVjdHMgYXJlIG5vdCBjb25zdGFudCBiZXR3ZWVuIHRoZSByZWdpbWVzKFJ1cmFsIGFuZCBVcmJhbikuIFRoaXMgaXMgYmVjYXVzZSB0aGUgRiB0ZXN0IGlzIHNpZ25pZmljYW50KHAtdmFsdWUgMC4wMzg1NSkuIFRoaXMgaW5kaWNhdGUgbm9uLXN0YXRpb25hcml0eSBpbiB0aGUgbW9kZWxzIAoKIyMjIFVyYmFuIE1vZGVsCmBgYHtyLHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIGVjaG89RkFMU0V9CmZpdC51PC0gbG0oIG1tcmF0ZXogfm1lZGhpbmN6ICsgbWVkaG91dmx6KyBwY3RjcnBvcHogKyBjdHlwb3BkZXN6ICsgb2JneW4xMF9wY3ogKyBwY3RuaGJsYWNrcHIxOXorZ2luaXosCiAgICAgICAgICAgZGF0YT11c2N0eW1tciwgc3Vic2V0PXJ1cmFsaXR5PT0iVXJiYW4iICklPiUgCiAgIHRibF9yZWdyZXNzaW9uKCBleHA9RkFMU0UsbGFiZWw9bGlzdChtZWRoaW5jen4gIk1lZGlhbiBIb3VzZWhvbGQgSW5jb21lIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGhvdXZsen4iTWVkaWFuIEhvdXNlIFZhbHVlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBjdGNycG9weiB+ICJQZXJjZW50IG9mIFJ1cmFsIFBvcHVsYXRpb24iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R5cG9wZGVzen4gIlBvcHVsYXRpb24gRGVuc2l0eSIgLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JneW4xMF9wY3ogfiJQZXIgQ2FwaXRhIE9CLUdZTiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwY3RuaGJsYWNrcHIxOXp+IlBlcmNlbnQgb2YgTm9uLUhpc3BhbmljIEJsYWNrIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdpbml6fiJHaW5pIENvZWZmaWNpZW50IikpICU+JQogIAogIGFkZF9nbG9iYWxfcCgpICU+JSAKYWRkX2dsYW5jZV9zb3VyY2Vfbm90ZSgKICAgIGxhYmVsID0gbGlzdChkZiB+IkRlZ3JlZXMgb2YgRnJlZWRvbSIpLAogICAgZm10X2Z1biA9IGRmIH4gc3R5bGVfbnVtYmVyLAogICAgaW5jbHVkZSA9IGMoci5zcXVhcmVkLCBBSUMsIGFkai5yLnNxdWFyZWQsIGRmKQogICklPiUgCmJvbGRfbGFiZWxzKCklPiUgCiAgaXRhbGljaXplX2xldmVscygpJT4lIAogIGFzX2d0KCkgJT4lCiAgIyBtb2RpZnkgd2l0aCBndCBmdW5jdGlvbnMKICBndDo6dGFiX2hlYWRlcigiVGFibGUgMjogUmVncmVzc2lvbiBBbmFseXNpcyBNb2RlbGluZyBVcmJhbiBDb3VudHkgTWF0ZXJuYWwgTW9ydGFsaXR5IFJhdGVzLCAyMDE1LTIwMTkiKSAlPiUgCiAgZ3Q6OnRhYl9vcHRpb25zKAogICAgdGFibGUuZm9udC5zaXplID0gInNtYWxsIiwKICAgIGRhdGFfcm93LnBhZGRpbmcgPSBndDo6cHgoMSkpCmZpdC51CmBgYAoKRm9yIHRoZSBVcmJhbiBjb3VudGllcywgdGhlIG92ZXJhbGwgaW50ZXJwcmV0YXRpb24gaXMgc2ltaWxhciB0byB3aGF0IGl0IHdhcyBmb3IgdGhlIHBvb2xlZCBkYXRhLiBIb3dldmVyLCBjb21wYXJlZCB0byB0aGUgcG9vbGVkIGRhdGEgbW9kZWwsIHRoZSB1cmJhbiBkYXRhIHNob3dzIHRoYXQgdGhlIE1lZGlhbiBob3VzZSB2YWx1ZSBpcyBzaWduaWZpY2FudGx5IHJlbGF0ZWQgdG8gTWF0ZXJuYWwgbW9ydGFsaXR5LgoKQ291bnR5IGNoYXJhY3RlcmlzdGljcyBhc3NvY2lhdGVkIHdpdGggaGlnaGVyIG1hdGVybmFsICBtb3J0YWxpdHkgcmF0ZXMgaW5jbHVkZTpDb3VudHkgbWVkaWFuIGhvdXNlIHZhbHVlLCBQZXJjZW50YWdlIG9mIGNvdW50eSBydXJhbCBwb3B1bGF0aW9uLCBhbmQgdGhlIGNvdW50eSBwb3B1bGF0aW9uIGRlbnNpdHkuIAoKQ291bnR5IGNoYXJhY3RlcmlzdGljcyBhc3NvY2lhdGVkIHdpdGggbG93ZXIgbWF0ZXJuYWwgIG1vcnRhbGl0eSByYXRlcyBhcmU6IHRoZSBtZWRpYW4gaG91c2Vob2xkIGluY29tZSwgcGVyIGNhcGl0YWwgbnVtYmVyIG9mIE9CLUdZTiBpbiB0aGUgY291bnR5ICxwcm9wb3J0aW9uIG9mIHRoZSBjb3VudHkgcG9wdWxhdGlvbiB0aGF0IGFyZSBub24tSGlzcGFuaWMgYmxhY2ssIGFuZCAgdGhlIGNvdW50eSBHaW5pIGNvZWZmaWNpZW50IC4gCgojIyMgUnVyYWwgTW9kZWwKYGBge3Isd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgZWNobz1GQUxTRX0KZml0LnI8LSBsbSggbW1yYXRleiB+bWVkaGluY3ogKyBtZWRob3V2bHorIHBjdGNycG9weiArIGN0eXBvcGRlc3ogKyBvYmd5bjEwX3BjeiArIHBjdG5oYmxhY2twcjE5eitnaW5peiwKICAgICAgICAgICBkYXRhPXVzY3R5bW1yLCBzdWJzZXQ9cnVyYWxpdHk9PSJSdXJhbCIpJT4lIAogICB0YmxfcmVncmVzc2lvbiggZXhwPUZBTFNFLGxhYmVsPWxpc3QobWVkaGluY3p+ICJNZWRpYW4gSG91c2Vob2xkIEluY29tZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWRob3V2bHp+Ik1lZGlhbiBIb3VzZSBWYWx1ZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwY3RjcnBvcHogfiAiUGVyY2VudCBvZiBSdXJhbCBQb3B1bGF0aW9uIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eXBvcGRlc3p+ICJQb3B1bGF0aW9uIERlbnNpdHkiICwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iZ3luMTBfcGN6IH4iUGVyIENhcGl0YSBPQi1HWU4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGN0bmhibGFja3ByMTl6fiJQZXJjZW50IG9mIE5vbi1IaXNwYW5pYyBCbGFjayIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnaW5pen4iR2luaSBDb2VmZmljaWVudCIpKSAlPiUKICAKICBhZGRfZ2xvYmFsX3AoKSAlPiUgCmFkZF9nbGFuY2Vfc291cmNlX25vdGUoCiAgICBsYWJlbCA9IGxpc3QoZGYgfiJEZWdyZWVzIG9mIEZyZWVkb20iKSwKICAgIGZtdF9mdW4gPSBkZiB+IHN0eWxlX251bWJlciwKICAgIGluY2x1ZGUgPSBjKHIuc3F1YXJlZCwgQUlDLCBhZGouci5zcXVhcmVkLCBkZikKICApJT4lIApib2xkX2xhYmVscygpJT4lIAogIGl0YWxpY2l6ZV9sZXZlbHMoKSU+JSAKICBhc19ndCgpICU+JQogICMgbW9kaWZ5IHdpdGggZ3QgZnVuY3Rpb25zCiAgZ3Q6OnRhYl9oZWFkZXIoIlRhYmxlIDM6IFJlZ3Jlc3Npb24gQW5hbHlzaXMgTW9kZWxpbmcgUnVyYWwgQ291bnR5IE1hdGVybmFsIE1vcnRhbGl0eSBSYXRlcywgMjAxNS0yMDE5IikgJT4lIAogIGd0Ojp0YWJfb3B0aW9ucygKICAgIHRhYmxlLmZvbnQuc2l6ZSA9ICJzbWFsbCIsCiAgICBkYXRhX3Jvdy5wYWRkaW5nID0gZ3Q6OnB4KDEpKQoKZml0LnIKCmBgYApGb3IgdGhlIFJ1cmFsIGNvdW50aWVzLCB0aGUgb3ZlcmFsbCBpbnRlcnByZXRhdGlvbiBpcyBkaWZmZXJlbnQgZnJvbSB3aGF0IGl0IHdhcyBmb3IgdGhlIHBvb2xlZCBkYXRhLiBJbiBmYWN0LCBub24gb2YgdGhlIHByZWRpY3RvcnMgd2VyZSBzaWduaWZpY2FudGx5IGFzc29jaWF0ZWQgd2l0aCBtYXRlcm5hbCBtb3J0YWxpdHkgcmF0ZXMu