Importing Data

Recoding the Variables

  1. A binary outcome variable “hlthcare” was defined by dichotomizing “hlthpln1,” a variable from the 2020 BRFSS survey data which measures whether a survey respondent has health care coverage, including health insurance, prepaid plans or government plans.

  2. Does access to healthcare coverage vary on the basis of race/ethnicity or education?

  3. Two categorical predictor variables were recoded and reveled for this analysis: “race_eth” and “educ.”

Logit/Probit Models & Analysis

sub = brfss20 %>%
  select(hlthcare, race_eth, educ, agec,ins, inc, educ, white, black, hispanic, other, mmsawt, ststr) %>%
  filter( complete.cases( . ))

#Writing in our survey design
options(survey.lonely.psu = "adjust")
des<-svydesign(ids= ~1,
               strata= ~ststr,
               weights= ~mmsawt,
               data = sub )
hlthcare_educ = svyby(formula = ~hlthcare,
           by = ~educ,
           design = des,
           FUN = svymean,
           na.rm=T)

svychisq(~hlthcare+educ,
         design = des)
## 
##  Pearson's X^2: Rao & Scott adjustment
## 
## data:  svychisq(~hlthcare + educ, design = des)
## F = 310.53, ndf = 3.5355e+00, ddf = 5.3643e+05, p-value < 2.2e-16

Plot of Estimates with Standard Errors

As demonstrated by the plots generated below, U.S. adults’ access to healthcare increases as level of education increases. Access to healthcare also varies by race/ethnicity such that NH white adults have the greatest access to healthcare followed by NH other, NH multiracial, and NH Black adults. Hispanic adults have the least access to healthcare.

hlthcare_educ %>%
  ggplot()+
  geom_point(aes(x=educ,y=hlthcare))+
  geom_errorbar(aes(x=educ, ymin = hlthcare-1.96*se, 
                    ymax= hlthcare+1.96*se),
                width=.25)+
   labs(title = "Percent % of US Adults with Access to Healthcare by Education", 
        caption = "Source: CDC BRFSS - SMART Data, 2020 \n Calculations by Christina Quintanilla-Muñoz",
       x = "Education",
       y = "%  Access to Healthcare")+
  theme_minimal()

Race*healthcare Cross Tabulation

hlthcare_race = svyby(formula = ~hlthcare,
           by = ~race_eth, 
           design = des, 
           FUN = svymean,
           na.rm=T)

svychisq(~hlthcare+race_eth,
         design = des)
## 
##  Pearson's X^2: Rao & Scott adjustment
## 
## data:  svychisq(~hlthcare + race_eth, design = des)
## F = 388.54, ndf = 3.5731e+00, ddf = 5.4214e+05, p-value < 2.2e-16
hlthcare_race %>%
  ggplot()+
  geom_point(aes(x=race_eth,y=hlthcare))+
  geom_errorbar(aes(x=race_eth, ymin = hlthcare-1.96*se, 
                    ymax= hlthcare+1.96*se),
                width=.25)+
   labs(title = "Percent % of US  with Access to Healthcare by Race/Ethnicity", 
        caption = "Source: CDC BRFSS - SMART Data, 2020 \n Calculations by Christina Quintanilla-Muñoz",
       x = "Race/Ethnicity",
       y = "%  Access to Healthcare")+
  theme_minimal()

Race by Education by Healthcare Cross Tabulation

The cross tabulation generated below indicates U.S. Hispanic adults have the least access to healthcare across the education gradient, while NH white adults have the greatest access. Across all racial/ethnic groups, within group variability decreases. An interesting pattern emerges for the outcome variable across the “Less than HS” and “Some HS” education categories. Across all racial/ethnic groups, there is greater access to healthcare for adults with the lowest education level than those with some years of high school education.

hlthcare_educ_race = svyby(formula = ~hlthcare,
              by = ~race_eth+educ,
              design = des,
              FUN = svymean,
              na.rm=T)

hlthcare_educ_race %>%
  ggplot()+
  geom_errorbar(aes(x=educ,y = hlthcare,
                    ymin = hlthcare-1.96*se, 
                   ymax= hlthcare+1.96*se,
                   color=race_eth,
                   group=race_eth),
                width=.25,
                position="dodge")+
  labs(title = "Percent % of US  with Access to Healthcare by Race/Ethnicity and Education", 
        caption = "Source: CDC BRFSS - SMART Data, 2020 \n Calculations by Christina Quintanilla-Muñoz",
       x = "Education",
       y = "%  Access to Healthcare")+
  theme_minimal()

Fitting the Logistic Regression Model

#Logit model
fit.logit<-svyglm(hlthcare ~ race_eth + educ + agec,
                  design = des,
                  family = binomial)
## Warning in eval(family$initialize): non-integer #successes in a binomial glm!
summary(fit.logit)
## 
## Call:
## svyglm(formula = hlthcare ~ race_eth + educ + agec, design = des, 
##     family = binomial)
## 
## Survey design:
## svydesign(ids = ~1, strata = ~ststr, weights = ~mmsawt, data = sub)
## 
## Coefficients:
##                      Estimate Std. Error t value Pr(>|t|)    
## (Intercept)           0.79284    0.12662   6.262 3.82e-10 ***
## race_ethhispanic     -1.08964    0.05331 -20.438  < 2e-16 ***
## race_ethnh black     -0.59776    0.06569  -9.099  < 2e-16 ***
## race_ethnh multirace -0.18679    0.13343  -1.400 0.161526    
## race_ethnh other     -0.17364    0.09137  -1.900 0.057389 .  
## educSome HS           0.32913    0.12597   2.613 0.008981 ** 
## educHS grad           1.02307    0.10904   9.382  < 2e-16 ***
## educSome college      1.45948    0.11042  13.217  < 2e-16 ***
## educCollege grad      2.28037    0.11212  20.339  < 2e-16 ***
## agec(24,39]          -0.14998    0.07753  -1.934 0.053054 .  
## agec(39,59]           0.28939    0.07757   3.731 0.000191 ***
## agec(59,79]           1.34008    0.10126  13.234  < 2e-16 ***
## agec(79,99]           2.12464    0.22369   9.498  < 2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1.021851)
## 
## Number of Fisher Scoring iterations: 6

Get Odds Ratios and Confidence Intervals for the Estimates

library(sjPlot)
## Learn more about sjPlot with 'browseVignettes("sjPlot")'.
plot_model(fit.logit,
           axis.lim = c(.1, 10),
           title = "Odds ratios for Access to Health Care")

Probit Model

To get the probit model, you use link = "probit" in svyglm

#probit model
fit.probit<-svyglm(hlthcare~race_eth+educ+agec,
                   design=des,
                   family=binomial(link= "probit"))
## Warning in eval(family$initialize): non-integer #successes in a binomial glm!

Present Both Model Coefficients

library(gtsummary)
## #Uighur
require(rlang)
## Loading required package: rlang
## 
## Attaching package: 'rlang'
## The following objects are masked from 'package:purrr':
## 
##     %@%, as_function, flatten, flatten_chr, flatten_dbl, flatten_int,
##     flatten_lgl, flatten_raw, invoke, splice
t1 = fit.logit%>%
  tbl_regression()

t2 = fit.probit%>%
  tbl_regression()

t_all = tbl_merge(tbls = list(t1, t2))
t_all
Characteristic Table 1 Table 2
log(OR)1 95% CI1 p-value Beta 95% CI1 p-value
race_eth
nh white
hispanic -1.1 -1.2, -1.0 <0.001 -0.59 -0.65, -0.54 <0.001
nh black -0.60 -0.73, -0.47 <0.001 -0.31 -0.38, -0.25 <0.001
nh multirace -0.19 -0.45, 0.07 0.2 -0.08 -0.21, 0.05 0.2
nh other -0.17 -0.35, 0.01 0.057 -0.09 -0.18, 0.00 0.064
educ
Less than HS
Some HS 0.33 0.08, 0.58 0.009 0.19 0.04, 0.33 0.011
HS grad 1.0 0.81, 1.2 <0.001 0.59 0.46, 0.71 <0.001
Some college 1.5 1.2, 1.7 <0.001 0.82 0.69, 0.95 <0.001
College grad 2.3 2.1, 2.5 <0.001 1.2 1.1, 1.3 <0.001
agec
(0,24]
(24,39] -0.15 -0.30, 0.00 0.053 -0.08 -0.16, 0.00 0.051
(39,59] 0.29 0.14, 0.44 <0.001 0.16 0.08, 0.24 <0.001
(59,79] 1.3 1.1, 1.5 <0.001 0.67 0.57, 0.77 <0.001
(79,99] 2.1 1.7, 2.6 <0.001 1.0 0.86, 1.2 <0.001

1 OR = Odds Ratio, CI = Confidence Interval

Both of these models show the exact same patterns of effects, with Hispanic, Black, multi-racial, and other race/ethnicity adults showing decreased chances of reporting access to healthcare, when compared to white adults (Reference group).

Similarly, the education variables shows a negative linear trend, with those with more education having higher chances of reporting access to healthcare compared to those with a primary school education (Reference group), and likewise, as people increase in age, they are more likely to report greater access to healthcare, compared to those under age 24 (Reference group).

Fitted Values

library(emmeans)
rg = ref_grid(fit.logit)

marg_logit = emmeans(object = rg,
              specs = c( "race_eth",  "educ", "agec"),
              type="response" )

knitr::kable(marg_logit,  digits = 4)
race_eth educ agec prob SE df asymp.LCL asymp.UCL
nh white Less than HS (0,24] 0.6884 0.0272 Inf 0.6329 0.7390
hispanic Less than HS (0,24] 0.4263 0.0302 Inf 0.3685 0.4863
nh black Less than HS (0,24] 0.5486 0.0344 Inf 0.4808 0.6147
nh multirace Less than HS (0,24] 0.6470 0.0408 Inf 0.5636 0.7224
nh other Less than HS (0,24] 0.6500 0.0329 Inf 0.5831 0.7115
nh white Some HS (0,24] 0.7544 0.0182 Inf 0.7171 0.7882
hispanic Some HS (0,24] 0.5081 0.0259 Inf 0.4574 0.5586
nh black Some HS (0,24] 0.6281 0.0268 Inf 0.5742 0.6791
nh multirace Some HS (0,24] 0.7181 0.0325 Inf 0.6503 0.7773
nh other Some HS (0,24] 0.7208 0.0254 Inf 0.6683 0.7678
nh white HS grad (0,24] 0.8601 0.0089 Inf 0.8417 0.8766
hispanic HS grad (0,24] 0.6740 0.0189 Inf 0.6359 0.7099
nh black HS grad (0,24] 0.7717 0.0158 Inf 0.7393 0.8012
nh multirace HS grad (0,24] 0.8360 0.0202 Inf 0.7925 0.8720
nh other HS grad (0,24] 0.8378 0.0144 Inf 0.8076 0.8641
nh white Some college (0,24] 0.9049 0.0063 Inf 0.8917 0.9165
hispanic Some college (0,24] 0.7618 0.0158 Inf 0.7296 0.7913
nh black Some college (0,24] 0.8395 0.0124 Inf 0.8138 0.8623
nh multirace Some college (0,24] 0.8875 0.0146 Inf 0.8556 0.9131
nh other Some college (0,24] 0.8888 0.0105 Inf 0.8665 0.9078
nh white College grad (0,24] 0.9558 0.0036 Inf 0.9481 0.9624
hispanic College grad (0,24] 0.8791 0.0105 Inf 0.8570 0.8981
nh black College grad (0,24] 0.9224 0.0076 Inf 0.9062 0.9360
nh multirace College grad (0,24] 0.9472 0.0077 Inf 0.9298 0.9604
nh other College grad (0,24] 0.9478 0.0055 Inf 0.9360 0.9576
nh white Less than HS (24,39] 0.6554 0.0252 Inf 0.6044 0.7031
hispanic Less than HS (24,39] 0.3901 0.0249 Inf 0.3426 0.4398
nh black Less than HS (24,39] 0.5113 0.0309 Inf 0.4508 0.5714
nh multirace Less than HS (24,39] 0.6121 0.0401 Inf 0.5313 0.6872
nh other Less than HS (24,39] 0.6152 0.0323 Inf 0.5503 0.6763
nh white Some HS (24,39] 0.7255 0.0163 Inf 0.6924 0.7563
hispanic Some HS (24,39] 0.4706 0.0210 Inf 0.4298 0.5118
nh black Some HS (24,39] 0.5925 0.0240 Inf 0.5447 0.6385
nh multirace Some HS (24,39] 0.6868 0.0326 Inf 0.6196 0.7470
nh other Some HS (24,39] 0.6896 0.0256 Inf 0.6374 0.7374
nh white HS grad (24,39] 0.8410 0.0070 Inf 0.8269 0.8542
hispanic HS grad (24,39] 0.6402 0.0143 Inf 0.6118 0.6677
nh black HS grad (24,39] 0.7442 0.0132 Inf 0.7175 0.7693
nh multirace HS grad (24,39] 0.8144 0.0209 Inf 0.7700 0.8520
nh other HS grad (24,39] 0.8164 0.0147 Inf 0.7857 0.8436
nh white Some college (24,39] 0.8911 0.0050 Inf 0.8810 0.9005
hispanic Some college (24,39] 0.7335 0.0124 Inf 0.7086 0.7571
nh black Some college (24,39] 0.8183 0.0107 Inf 0.7963 0.8384
nh multirace Some college (24,39] 0.8716 0.0153 Inf 0.8386 0.8987
nh other Some college (24,39] 0.8731 0.0109 Inf 0.8501 0.8930
nh white College grad (24,39] 0.9490 0.0026 Inf 0.9437 0.9538
hispanic College grad (24,39] 0.8622 0.0078 Inf 0.8461 0.8768
nh black College grad (24,39] 0.9110 0.0064 Inf 0.8977 0.9227
nh multirace College grad (24,39] 0.9391 0.0079 Inf 0.9216 0.9530
nh other College grad (24,39] 0.9399 0.0053 Inf 0.9285 0.9495
nh white Less than HS (39,59] 0.7469 0.0207 Inf 0.7043 0.7852
hispanic Less than HS (39,59] 0.4981 0.0257 Inf 0.4479 0.5484
nh black Less than HS (39,59] 0.6188 0.0285 Inf 0.5616 0.6729
nh multirace Less than HS (39,59] 0.7100 0.0345 Inf 0.6380 0.7728
nh other Less than HS (39,59] 0.7127 0.0277 Inf 0.6556 0.7638
nh white Some HS (39,59] 0.8040 0.0129 Inf 0.7775 0.8280
hispanic Some HS (39,59] 0.5797 0.0208 Inf 0.5385 0.6199
nh black Some HS (39,59] 0.6929 0.0210 Inf 0.6503 0.7324
nh multirace Some HS (39,59] 0.7729 0.0267 Inf 0.7163 0.8210
nh other Some HS (39,59] 0.7752 0.0210 Inf 0.7315 0.8136
nh white HS grad (39,59] 0.8914 0.0050 Inf 0.8813 0.9008
hispanic HS grad (39,59] 0.7341 0.0123 Inf 0.7093 0.7576
nh black HS grad (39,59] 0.8187 0.0101 Inf 0.7981 0.8376
nh multirace HS grad (39,59] 0.8720 0.0155 Inf 0.8385 0.8993
nh other HS grad (39,59] 0.8734 0.0110 Inf 0.8504 0.8934
nh white Some college (39,59] 0.9270 0.0034 Inf 0.9200 0.9335
hispanic Some college (39,59] 0.8103 0.0099 Inf 0.7901 0.8290
nh black Some college (39,59] 0.8748 0.0077 Inf 0.8588 0.8892
nh multirace Some college (39,59] 0.9133 0.0108 Inf 0.8896 0.9324
nh other Some college (39,59] 0.9144 0.0078 Inf 0.8978 0.9284
nh white College grad (39,59] 0.9665 0.0017 Inf 0.9630 0.9697
hispanic College grad (39,59] 0.9066 0.0057 Inf 0.8947 0.9173
nh black College grad (39,59] 0.9407 0.0043 Inf 0.9317 0.9487
nh multirace College grad (39,59] 0.9599 0.0054 Inf 0.9480 0.9692
nh other College grad (39,59] 0.9604 0.0036 Inf 0.9526 0.9670
nh white Less than HS (59,79] 0.8941 0.0114 Inf 0.8695 0.9145
hispanic Less than HS (59,79] 0.7395 0.0226 Inf 0.6929 0.7812
nh black Less than HS (59,79] 0.8228 0.0206 Inf 0.7788 0.8595
nh multirace Less than HS (59,79] 0.8750 0.0194 Inf 0.8319 0.9083
nh other Less than HS (59,79] 0.8765 0.0163 Inf 0.8409 0.9050
nh white Some HS (59,79] 0.9214 0.0078 Inf 0.9046 0.9355
hispanic Some HS (59,79] 0.7978 0.0183 Inf 0.7596 0.8312
nh black Some HS (59,79] 0.8658 0.0153 Inf 0.8328 0.8931
nh multirace Some HS (59,79] 0.9068 0.0143 Inf 0.8746 0.9314
nh other Some HS (59,79] 0.9079 0.0122 Inf 0.8811 0.9291
nh white HS grad (59,79] 0.9591 0.0030 Inf 0.9529 0.9646
hispanic HS grad (59,79] 0.8876 0.0087 Inf 0.8694 0.9035
nh black HS grad (59,79] 0.9281 0.0068 Inf 0.9136 0.9403
nh multirace HS grad (59,79] 0.9512 0.0070 Inf 0.9354 0.9632
nh other HS grad (59,79] 0.9518 0.0055 Inf 0.9397 0.9615
nh white Some college (59,79] 0.9732 0.0021 Inf 0.9688 0.9770
hispanic Some college (59,79] 0.9243 0.0065 Inf 0.9107 0.9361
nh black Some college (59,79] 0.9523 0.0049 Inf 0.9418 0.9610
nh multirace Some college (59,79] 0.9679 0.0047 Inf 0.9572 0.9760
nh other Some college (59,79] 0.9683 0.0038 Inf 0.9599 0.9750
nh white College grad (59,79] 0.9880 0.0010 Inf 0.9860 0.9898
hispanic College grad (59,79] 0.9652 0.0032 Inf 0.9584 0.9710
nh black College grad (59,79] 0.9784 0.0024 Inf 0.9733 0.9826
nh multirace College grad (59,79] 0.9856 0.0022 Inf 0.9806 0.9893
nh other College grad (59,79] 0.9858 0.0017 Inf 0.9820 0.9888
nh white Less than HS (79,99] 0.9487 0.0114 Inf 0.9211 0.9670
hispanic Less than HS (79,99] 0.8615 0.0280 Inf 0.7969 0.9079
nh black Less than HS (79,99] 0.9105 0.0197 Inf 0.8636 0.9423
nh multirace Less than HS (79,99] 0.9388 0.0154 Inf 0.9006 0.9629
nh other Less than HS (79,99] 0.9396 0.0142 Inf 0.9051 0.9620
nh white Some HS (79,99] 0.9626 0.0079 Inf 0.9435 0.9753
hispanic Some HS (79,99] 0.8963 0.0208 Inf 0.8478 0.9306
nh black Some HS (79,99] 0.9339 0.0141 Inf 0.9004 0.9567
nh multirace Some HS (79,99] 0.9552 0.0110 Inf 0.9281 0.9724
nh other Some HS (79,99] 0.9558 0.0101 Inf 0.9313 0.9718
nh white HS grad (79,99] 0.9809 0.0040 Inf 0.9712 0.9874
hispanic HS grad (79,99] 0.9454 0.0114 Inf 0.9182 0.9639
nh black HS grad (79,99] 0.9659 0.0073 Inf 0.9484 0.9776
nh multirace HS grad (79,99] 0.9771 0.0056 Inf 0.9630 0.9859
nh other HS grad (79,99] 0.9774 0.0051 Inf 0.9648 0.9855
nh white Some college (79,99] 0.9876 0.0026 Inf 0.9812 0.9918
hispanic Some college (79,99] 0.9640 0.0077 Inf 0.9453 0.9764
nh black Some college (79,99] 0.9777 0.0049 Inf 0.9658 0.9855
nh multirace Some college (79,99] 0.9851 0.0037 Inf 0.9758 0.9908
nh other Some college (79,99] 0.9853 0.0034 Inf 0.9769 0.9906
nh white College grad (79,99] 0.9945 0.0012 Inf 0.9916 0.9964
hispanic College grad (79,99] 0.9838 0.0036 Inf 0.9751 0.9895
nh black College grad (79,99] 0.9900 0.0022 Inf 0.9846 0.9936
nh multirace College grad (79,99] 0.9934 0.0017 Inf 0.9891 0.9960
nh other College grad (79,99] 0.9935 0.0015 Inf 0.9897 0.9959

In comparing contrived values to the probit model estimates, they are very similar.

rg = ref_grid(fit.probit)

marg_probit = emmeans(object = rg,
              specs = c( "race_eth", "agec"),
              type="response" )
knitr::kable(marg_probit, digits = 4)
race_eth agec prob SE df asymp.LCL asymp.UCL
nh white (0,24] 0.8516 0.0091 Inf 0.8331 0.8688
hispanic (0,24] 0.6736 0.0163 Inf 0.6411 0.7048
nh black (0,24] 0.7671 0.0153 Inf 0.7361 0.7961
nh multirace (0,24] 0.8318 0.0186 Inf 0.7928 0.8657
nh other (0,24] 0.8308 0.0138 Inf 0.8024 0.8564
nh white (24,39] 0.8321 0.0061 Inf 0.8198 0.8438
hispanic (24,39] 0.6438 0.0109 Inf 0.6222 0.6650
nh black (24,39] 0.7416 0.0123 Inf 0.7169 0.7651
nh multirace (24,39] 0.8106 0.0183 Inf 0.7726 0.8443
nh other (24,39] 0.8095 0.0132 Inf 0.7825 0.8343
nh white (39,59] 0.8852 0.0045 Inf 0.8761 0.8938
hispanic (39,59] 0.7283 0.0097 Inf 0.7090 0.7470
nh black (39,59] 0.8126 0.0099 Inf 0.7926 0.8313
nh multirace (39,59] 0.8685 0.0144 Inf 0.8381 0.8946
nh other (39,59] 0.8676 0.0104 Inf 0.8461 0.8869
nh white (59,79] 0.9567 0.0031 Inf 0.9502 0.9625
hispanic (59,79] 0.8686 0.0085 Inf 0.8512 0.8846
nh black (59,79] 0.9192 0.0076 Inf 0.9033 0.9330
nh multirace (59,79] 0.9486 0.0077 Inf 0.9316 0.9620
nh other (59,79] 0.9482 0.0063 Inf 0.9347 0.9593
nh white (79,99] 0.9816 0.0038 Inf 0.9727 0.9879
hispanic (79,99] 0.9324 0.0115 Inf 0.9069 0.9521
nh black (79,99] 0.9619 0.0074 Inf 0.9450 0.9743
nh multirace (79,99] 0.9775 0.0057 Inf 0.9638 0.9865
nh other (79,99] 0.9773 0.0051 Inf 0.9652 0.9856

The following shows the estimated probability of reporting access to healthcare for each specified type of “typical person” that we generate. Non-Hispanic white adults with a college education are compared Hispanic adults, age 39-59 with a college education:

comps = as.data.frame(marg_logit)

comps[comps$race_eth=="hispanic" & comps$educ == "College grad" , ]
comps[comps$race_eth=="nh white" & comps$educ == "College grad" , ]

Hispanic adults aged 39-59 years demonstrate an estimated probability of reporting access to healthcare of about 90.7%, while the NH white adults of the same age and education level have about a 96.7% chance. This indicates racial/ethnic group has a substantial impact on access to healthcare for U.S. adults.

LS0tDQp0aXRsZTogIkhvbWV3b3JrIDMiDQphdXRob3I6ICJDaHJpc3RpbmEgUXVpbnRhbmlsbGEtTXXDsW96Ig0KZGF0ZTogICJgciBmb3JtYXQoU3lzLnRpbWUoKSwgJyVkICVCLCAlWScpYCINCm91dHB1dDoNCiAgIGh0bWxfZG9jdW1lbnQ6DQogICAgZGZfcHJpbnQ6IHBhZ2VkDQogICAgZmlnX2hlaWdodDogNw0KICAgIGZpZ193aWR0aDogNw0KICAgIHRvYzogeWVzDQogICAgdG9jX2Zsb2F0OiB5ZXMNCiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlDQotLS0NCg0KYGBge3IsIGluY2x1ZGU9RkFMU0V9DQojbG9hZCBsaWJyYXJpZXMNCmxpYnJhcnkoY2FyKQ0KbGlicmFyeShzdGFyZ2F6ZXIpDQpsaWJyYXJ5KHN1cnZleSkNCmxpYnJhcnkocXVlc3Rpb25yKQ0KbGlicmFyeShkcGx5cikNCmxpYnJhcnkodGlkeXZlcnNlKQ0KYGBgDQoNCiMjIEltcG9ydGluZyBEYXRhDQoNCmBgYHtyLCBpbmNsdWRlPUZBTFNFfQ0KI2xvYWQgYnJmc3MNCmJyZnNzMjAgPSByZWFkUkRTKHVybCgiaHR0cHM6Ly9naXRodWIuY29tL2NvcmV5c3BhcmtzL0RFTTcyODMvYmxvYi9tYXN0ZXIvZGF0YS9icmZzczIwc20ucmRzP3Jhdz10cnVlIikpDQoNCiMjIyBGaXggdmFyaWFibGUgbmFtZXMNCm5hbWVzKGJyZnNzMjApID0gdG9sb3dlcihnc3ViKHBhdHRlcm4gPSAiXyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBsYWNlbWVudCA9ICAiIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHggPSAgbmFtZXMoYnJmc3MyMCkpKQ0KYGBgDQoNCiMjIFJlY29kaW5nIHRoZSBWYXJpYWJsZXMNCg0KYSkgQSBiaW5hcnkgb3V0Y29tZSB2YXJpYWJsZSAiaGx0aGNhcmUiIHdhcyBkZWZpbmVkIGJ5IGRpY2hvdG9taXppbmcgImhsdGhwbG4xLCIgYSB2YXJpYWJsZSBmcm9tIHRoZSAyMDIwIEJSRlNTIHN1cnZleSBkYXRhIHdoaWNoIG1lYXN1cmVzIHdoZXRoZXIgYSBzdXJ2ZXkgcmVzcG9uZGVudCBoYXMgaGVhbHRoIGNhcmUgY292ZXJhZ2UsIGluY2x1ZGluZyBoZWFsdGggaW5zdXJhbmNlLCBwcmVwYWlkIHBsYW5zIG9yIGdvdmVybm1lbnQgcGxhbnMuDQoNCmIpIERvZXMgYWNjZXNzIHRvIGhlYWx0aGNhcmUgY292ZXJhZ2UgdmFyeSBvbiB0aGUgYmFzaXMgb2YgcmFjZS9ldGhuaWNpdHkgb3IgZWR1Y2F0aW9uPyANCg0KYykgVHdvIGNhdGVnb3JpY2FsIHByZWRpY3RvciB2YXJpYWJsZXMgd2VyZSByZWNvZGVkIGFuZCByZXZlbGVkIGZvciB0aGlzIGFuYWx5c2lzOiAicmFjZV9ldGgiIGFuZCAiZWR1Yy4iDQoNCmBgYHtyLCBpbmNsdWRlPUZBTFNFfQ0KDQojQWNjZXNzIHRvIGhlYWx0aGNhcmUNCmJyZnNzMjAkaGx0aGNhcmUgPSBSZWNvZGUoYnJmc3MyMCRobHRocGxuMSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgIHJlY29kZXMgPSAiMT0xOyAyPTA7IGVsc2U9TkEiKQ0KDQojUmFjZS9ldGhuaWNpdHkNCmJyZnNzMjAkYmxhY2sgPSBSZWNvZGUoYnJmc3MyMCRyYWNlZ3IzLA0KICAgICAgICAgICAgICAgICAgICAgICByZWNvZGVzPSIyPTE7IDk9TkE7IGVsc2U9MCIpDQoNCmJyZnNzMjAkd2hpdGUgPSBSZWNvZGUoYnJmc3MyMCRyYWNlZ3IzLA0KICAgICAgICAgICAgICAgICAgICAgICByZWNvZGVzPSIxPTE7IDk9TkE7IGVsc2U9MCIpDQoNCmJyZnNzMjAkb3RoZXIgPSBSZWNvZGUoYnJmc3MyMCRyYWNlZ3IzLA0KICAgICAgICAgICAgICAgICAgICAgICByZWNvZGVzPSIzOjQ9MTsgOT1OQTsgZWxzZT0wIikNCg0KYnJmc3MyMCRoaXNwYW5pYyA9IFJlY29kZShicmZzczIwJHJhY2VncjMsDQogICAgICAgICAgICAgICAgICAgICAgICAgIHJlY29kZXM9IjU9MTsgOT1OQTsgZWxzZT0wIikNCg0KYnJmc3MyMCRyYWNlX2V0aCA9IFJlY29kZShicmZzczIwJHJhY2VncjMsDQogICAgICAgICAgICAgICAgICAgICAgICAgIHJlY29kZXM9IjE9J25oIHdoaXRlJzsgMj0nbmggYmxhY2snOyAzPSduaCBvdGhlcic7ND0nbmggbXVsdGlyYWNlJzsgNT0naGlzcGFuaWMnOyBlbHNlPU5BIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgYXMuZmFjdG9yID0gVCkNCg0KYnJmc3MyMCRyYWNlX2V0aCA9IHJlbGV2ZWwoYnJmc3MyMCRyYWNlX2V0aCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZiA9ICJuaCB3aGl0ZSIpDQoNCiNFZHVjYXRpb24gbGV2ZWwNCmJyZnNzMjAkZWR1YyA9IFJlY29kZShicmZzczIwJGVkdWNhLA0KICAgICAgICAgICAgICAgICAgICAgcmVjb2Rlcz0iMToyPSdMZXNzIHRoYW4gSFMnOyANCiAgICAgICAgICAgICAgICAgICAgIDM9J1NvbWUgSFMnOyANCiAgICAgICAgICAgICAgICAgICAgIDQ9J0hTIGdyYWQnOyANCiAgICAgICAgICAgICAgICAgICAgIDU9J1NvbWUgY29sbGVnZSc7IA0KICAgICAgICAgICAgICAgICAgICAgNj0nQ29sbGVnZSBncmFkJzs5PU5BIiwNCiAgICAgICAgICAgICAgICAgICAgIGFzLmZhY3Rvcj1UKQ0KDQpicmZzczIwJGVkdWMgPSBmY3RfcmVsZXZlbChicmZzczIwJGVkdWMsJ0xlc3MgdGhhbiBIUycsJ1NvbWUgSFMnLCdIUyBncmFkJywnU29tZSBjb2xsZWdlJywnQ29sbGVnZSBncmFkJyApIA0KDQojQWdlIGN1dCBpbnRvIGludGVydmFscw0KYnJmc3MyMCRhZ2VjID0gY3V0KGJyZnNzMjAkYWdlODAsIA0KICAgICAgICAgICAgICAgICAgYnJlYWtzPWMoMCwyNCwzOSw1OSw3OSw5OSkpDQoNCiNJbnN1cmFuY2UNCmJyZnNzMjAkaW5zID0gUmVjb2RlKGJyZnNzMjAkaGx0aHBsbjEsDQogICAgICAgICAgICAgICAgICAgICByZWNvZGVzID0iNzo5PU5BOyAxPTE7Mj0wIikNCg0KI0luY29tZSBncm91cGluZw0KYnJmc3MyMCRpbmMgPSBpZmVsc2UoYnJmc3MyMCRpbmNvbWc9PTksDQogICAgICAgICAgICAgICAgICAgICBOQSwNCiAgICAgICAgICAgICAgICAgICAgIGJyZnNzMjAkaW5jb21nKQ0KDQojRmlsdGVyIGNhc2VzDQpicmZzczIwID0gYnJmc3MyMCAlPiUgDQogIGZpbHRlcihpcy5uYShobHRoY2FyZSk9PUYsDQogICAgICAgICBpcy5uYShyYWNlX2V0aCk9PUYsDQogICAgICAgICBpcy5uYShlZHVjKT09RiwNCiAgICAgICAgIGlzLm5hKGFnZWMpPT1GKQ0KYGBgDQoNCiMjIExvZ2l0L1Byb2JpdCBNb2RlbHMgJiBBbmFseXNpcw0KDQpgYGB7cn0NCnN1YiA9IGJyZnNzMjAgJT4lDQogIHNlbGVjdChobHRoY2FyZSwgcmFjZV9ldGgsIGVkdWMsIGFnZWMsaW5zLCBpbmMsIGVkdWMsIHdoaXRlLCBibGFjaywgaGlzcGFuaWMsIG90aGVyLCBtbXNhd3QsIHN0c3RyKSAlPiUNCiAgZmlsdGVyKCBjb21wbGV0ZS5jYXNlcyggLiApKQ0KDQojV3JpdGluZyBpbiBvdXIgc3VydmV5IGRlc2lnbg0Kb3B0aW9ucyhzdXJ2ZXkubG9uZWx5LnBzdSA9ICJhZGp1c3QiKQ0KZGVzPC1zdnlkZXNpZ24oaWRzPSB+MSwNCiAgICAgICAgICAgICAgIHN0cmF0YT0gfnN0c3RyLA0KICAgICAgICAgICAgICAgd2VpZ2h0cz0gfm1tc2F3dCwNCiAgICAgICAgICAgICAgIGRhdGEgPSBzdWIgKQ0KDQpgYGANCg0KDQpgYGB7cn0NCg0KaGx0aGNhcmVfZWR1YyA9IHN2eWJ5KGZvcm11bGEgPSB+aGx0aGNhcmUsDQogICAgICAgICAgIGJ5ID0gfmVkdWMsDQogICAgICAgICAgIGRlc2lnbiA9IGRlcywNCiAgICAgICAgICAgRlVOID0gc3Z5bWVhbiwNCiAgICAgICAgICAgbmEucm09VCkNCg0Kc3Z5Y2hpc3EofmhsdGhjYXJlK2VkdWMsDQogICAgICAgICBkZXNpZ24gPSBkZXMpDQoNCmBgYA0KIyMjIFBsb3Qgb2YgRXN0aW1hdGVzIHdpdGggU3RhbmRhcmQgRXJyb3JzDQoNCkFzIGRlbW9uc3RyYXRlZCBieSB0aGUgcGxvdHMgZ2VuZXJhdGVkIGJlbG93LCBVLlMuIGFkdWx0cycgYWNjZXNzIHRvIGhlYWx0aGNhcmUgaW5jcmVhc2VzIGFzIGxldmVsIG9mIGVkdWNhdGlvbiBpbmNyZWFzZXMuIEFjY2VzcyB0byBoZWFsdGhjYXJlIGFsc28gdmFyaWVzIGJ5IHJhY2UvZXRobmljaXR5IHN1Y2ggdGhhdCBOSCB3aGl0ZSBhZHVsdHMgaGF2ZSB0aGUgZ3JlYXRlc3QgYWNjZXNzIHRvIGhlYWx0aGNhcmUgZm9sbG93ZWQgYnkgTkggb3RoZXIsIE5IIG11bHRpcmFjaWFsLCBhbmQgTkggQmxhY2sgYWR1bHRzLiBIaXNwYW5pYyBhZHVsdHMgaGF2ZSB0aGUgbGVhc3QgYWNjZXNzIHRvIGhlYWx0aGNhcmUuDQoNCmBgYHtyfQ0KaGx0aGNhcmVfZWR1YyAlPiUNCiAgZ2dwbG90KCkrDQogIGdlb21fcG9pbnQoYWVzKHg9ZWR1Yyx5PWhsdGhjYXJlKSkrDQogIGdlb21fZXJyb3JiYXIoYWVzKHg9ZWR1YywgeW1pbiA9IGhsdGhjYXJlLTEuOTYqc2UsIA0KICAgICAgICAgICAgICAgICAgICB5bWF4PSBobHRoY2FyZSsxLjk2KnNlKSwNCiAgICAgICAgICAgICAgICB3aWR0aD0uMjUpKw0KICAgbGFicyh0aXRsZSA9ICJQZXJjZW50ICUgb2YgVVMgQWR1bHRzIHdpdGggQWNjZXNzIHRvIEhlYWx0aGNhcmUgYnkgRWR1Y2F0aW9uIiwgDQogICAgICAgIGNhcHRpb24gPSAiU291cmNlOiBDREMgQlJGU1MgLSBTTUFSVCBEYXRhLCAyMDIwIFxuIENhbGN1bGF0aW9ucyBieSBDaHJpc3RpbmEgUXVpbnRhbmlsbGEtTXXDsW96IiwNCiAgICAgICB4ID0gIkVkdWNhdGlvbiIsDQogICAgICAgeSA9ICIlICBBY2Nlc3MgdG8gSGVhbHRoY2FyZSIpKw0KICB0aGVtZV9taW5pbWFsKCkNCg0KYGBgDQoNCg0KIyMjIFJhY2UqaGVhbHRoY2FyZSBDcm9zcyBUYWJ1bGF0aW9uDQoNCmBgYHtyfQ0KaGx0aGNhcmVfcmFjZSA9IHN2eWJ5KGZvcm11bGEgPSB+aGx0aGNhcmUsDQogICAgICAgICAgIGJ5ID0gfnJhY2VfZXRoLCANCiAgICAgICAgICAgZGVzaWduID0gZGVzLCANCiAgICAgICAgICAgRlVOID0gc3Z5bWVhbiwNCiAgICAgICAgICAgbmEucm09VCkNCg0Kc3Z5Y2hpc3EofmhsdGhjYXJlK3JhY2VfZXRoLA0KICAgICAgICAgZGVzaWduID0gZGVzKQ0KDQoNCmhsdGhjYXJlX3JhY2UgJT4lDQogIGdncGxvdCgpKw0KICBnZW9tX3BvaW50KGFlcyh4PXJhY2VfZXRoLHk9aGx0aGNhcmUpKSsNCiAgZ2VvbV9lcnJvcmJhcihhZXMoeD1yYWNlX2V0aCwgeW1pbiA9IGhsdGhjYXJlLTEuOTYqc2UsIA0KICAgICAgICAgICAgICAgICAgICB5bWF4PSBobHRoY2FyZSsxLjk2KnNlKSwNCiAgICAgICAgICAgICAgICB3aWR0aD0uMjUpKw0KICAgbGFicyh0aXRsZSA9ICJQZXJjZW50ICUgb2YgVVMgIHdpdGggQWNjZXNzIHRvIEhlYWx0aGNhcmUgYnkgUmFjZS9FdGhuaWNpdHkiLCANCiAgICAgICAgY2FwdGlvbiA9ICJTb3VyY2U6IENEQyBCUkZTUyAtIFNNQVJUIERhdGEsIDIwMjAgXG4gQ2FsY3VsYXRpb25zIGJ5IENocmlzdGluYSBRdWludGFuaWxsYS1NdcOxb3oiLA0KICAgICAgIHggPSAiUmFjZS9FdGhuaWNpdHkiLA0KICAgICAgIHkgPSAiJSAgQWNjZXNzIHRvIEhlYWx0aGNhcmUiKSsNCiAgdGhlbWVfbWluaW1hbCgpDQoNCmBgYA0KDQoNCg0KIyMjIFJhY2UgYnkgRWR1Y2F0aW9uIGJ5IEhlYWx0aGNhcmUgQ3Jvc3MgVGFidWxhdGlvbg0KDQpUaGUgY3Jvc3MgdGFidWxhdGlvbiBnZW5lcmF0ZWQgYmVsb3cgaW5kaWNhdGVzIFUuUy4gSGlzcGFuaWMgYWR1bHRzIGhhdmUgdGhlIGxlYXN0IGFjY2VzcyB0byBoZWFsdGhjYXJlIGFjcm9zcyB0aGUgZWR1Y2F0aW9uIGdyYWRpZW50LCB3aGlsZSBOSCB3aGl0ZSBhZHVsdHMgaGF2ZSB0aGUgZ3JlYXRlc3QgYWNjZXNzLiBBY3Jvc3MgYWxsIHJhY2lhbC9ldGhuaWMgZ3JvdXBzLCB3aXRoaW4gZ3JvdXAgdmFyaWFiaWxpdHkgZGVjcmVhc2VzLiBBbiBpbnRlcmVzdGluZyBwYXR0ZXJuIGVtZXJnZXMgZm9yIHRoZSBvdXRjb21lIHZhcmlhYmxlIGFjcm9zcyB0aGUgIkxlc3MgdGhhbiBIUyIgYW5kICJTb21lIEhTIiBlZHVjYXRpb24gY2F0ZWdvcmllcy4gQWNyb3NzIGFsbCByYWNpYWwvZXRobmljIGdyb3VwcywgdGhlcmUgaXMgZ3JlYXRlciBhY2Nlc3MgdG8gaGVhbHRoY2FyZSBmb3IgYWR1bHRzIHdpdGggdGhlIGxvd2VzdCBlZHVjYXRpb24gbGV2ZWwgdGhhbiB0aG9zZSB3aXRoIHNvbWUgeWVhcnMgb2YgaGlnaCBzY2hvb2wgZWR1Y2F0aW9uLg0KDQpgYGB7ciwgZmlnLndpZHRoPTgsIGZpZy5oZWlnaHQ9Nn0NCmhsdGhjYXJlX2VkdWNfcmFjZSA9IHN2eWJ5KGZvcm11bGEgPSB+aGx0aGNhcmUsDQogICAgICAgICAgICAgIGJ5ID0gfnJhY2VfZXRoK2VkdWMsDQogICAgICAgICAgICAgIGRlc2lnbiA9IGRlcywNCiAgICAgICAgICAgICAgRlVOID0gc3Z5bWVhbiwNCiAgICAgICAgICAgICAgbmEucm09VCkNCg0KaGx0aGNhcmVfZWR1Y19yYWNlICU+JQ0KICBnZ3Bsb3QoKSsNCiAgZ2VvbV9lcnJvcmJhcihhZXMoeD1lZHVjLHkgPSBobHRoY2FyZSwNCiAgICAgICAgICAgICAgICAgICAgeW1pbiA9IGhsdGhjYXJlLTEuOTYqc2UsIA0KICAgICAgICAgICAgICAgICAgIHltYXg9IGhsdGhjYXJlKzEuOTYqc2UsDQogICAgICAgICAgICAgICAgICAgY29sb3I9cmFjZV9ldGgsDQogICAgICAgICAgICAgICAgICAgZ3JvdXA9cmFjZV9ldGgpLA0KICAgICAgICAgICAgICAgIHdpZHRoPS4yNSwNCiAgICAgICAgICAgICAgICBwb3NpdGlvbj0iZG9kZ2UiKSsNCiAgbGFicyh0aXRsZSA9ICJQZXJjZW50ICUgb2YgVVMgIHdpdGggQWNjZXNzIHRvIEhlYWx0aGNhcmUgYnkgUmFjZS9FdGhuaWNpdHkgYW5kIEVkdWNhdGlvbiIsIA0KICAgICAgICBjYXB0aW9uID0gIlNvdXJjZTogQ0RDIEJSRlNTIC0gU01BUlQgRGF0YSwgMjAyMCBcbiBDYWxjdWxhdGlvbnMgYnkgQ2hyaXN0aW5hIFF1aW50YW5pbGxhLU11w7FveiIsDQogICAgICAgeCA9ICJFZHVjYXRpb24iLA0KICAgICAgIHkgPSAiJSAgQWNjZXNzIHRvIEhlYWx0aGNhcmUiKSsNCiAgdGhlbWVfbWluaW1hbCgpDQoNCg0KYGBgDQoNCg0KIyMgRml0dGluZyB0aGUgTG9naXN0aWMgUmVncmVzc2lvbiBNb2RlbA0KDQoNCmBgYHtyfQ0KI0xvZ2l0IG1vZGVsDQpmaXQubG9naXQ8LXN2eWdsbShobHRoY2FyZSB+IHJhY2VfZXRoICsgZWR1YyArIGFnZWMsDQogICAgICAgICAgICAgICAgICBkZXNpZ24gPSBkZXMsDQogICAgICAgICAgICAgICAgICBmYW1pbHkgPSBiaW5vbWlhbCkNCg0Kc3VtbWFyeShmaXQubG9naXQpDQpgYGANCg0KIyMjIEdldCBPZGRzIFJhdGlvcyBhbmQgQ29uZmlkZW5jZSBJbnRlcnZhbHMgZm9yIHRoZSBFc3RpbWF0ZXMNCg0KDQpgYGB7cn0NCmxpYnJhcnkoc2pQbG90KQ0KcGxvdF9tb2RlbChmaXQubG9naXQsDQogICAgICAgICAgIGF4aXMubGltID0gYyguMSwgMTApLA0KICAgICAgICAgICB0aXRsZSA9ICJPZGRzIHJhdGlvcyBmb3IgQWNjZXNzIHRvIEhlYWx0aCBDYXJlIikNCmBgYA0KDQoNCiMjIyBQcm9iaXQgTW9kZWwNCg0KVG8gZ2V0IHRoZSBwcm9iaXQgbW9kZWwsIHlvdSB1c2UgYGxpbmsgPSAicHJvYml0ImAgaW4gYHN2eWdsbWANCg0KYGBge3J9DQojcHJvYml0IG1vZGVsDQpmaXQucHJvYml0PC1zdnlnbG0oaGx0aGNhcmV+cmFjZV9ldGgrZWR1YythZ2VjLA0KICAgICAgICAgICAgICAgICAgIGRlc2lnbj1kZXMsDQogICAgICAgICAgICAgICAgICAgZmFtaWx5PWJpbm9taWFsKGxpbms9ICJwcm9iaXQiKSkNCmBgYA0KDQojIFByZXNlbnQgQm90aCBNb2RlbCBDb2VmZmljaWVudHMNCg0KYGBge3J9DQpsaWJyYXJ5KGd0c3VtbWFyeSkNCnJlcXVpcmUocmxhbmcpDQp0MSA9IGZpdC5sb2dpdCU+JQ0KICB0YmxfcmVncmVzc2lvbigpDQoNCnQyID0gZml0LnByb2JpdCU+JQ0KICB0YmxfcmVncmVzc2lvbigpDQoNCnRfYWxsID0gdGJsX21lcmdlKHRibHMgPSBsaXN0KHQxLCB0MikpDQp0X2FsbA0KDQpgYGANCg0KQm90aCBvZiB0aGVzZSBtb2RlbHMgc2hvdyB0aGUgZXhhY3Qgc2FtZSBwYXR0ZXJucyBvZiBlZmZlY3RzLCB3aXRoIEhpc3BhbmljLCBCbGFjaywgbXVsdGktcmFjaWFsLCBhbmQgb3RoZXIgcmFjZS9ldGhuaWNpdHkgYWR1bHRzIHNob3dpbmcgZGVjcmVhc2VkIGNoYW5jZXMgb2YgcmVwb3J0aW5nIGFjY2VzcyB0byBoZWFsdGhjYXJlLCB3aGVuIGNvbXBhcmVkIHRvIHdoaXRlIGFkdWx0cyAoUmVmZXJlbmNlIGdyb3VwKS4gDQoNClNpbWlsYXJseSwgdGhlIGVkdWNhdGlvbiB2YXJpYWJsZXMgc2hvd3MgYSBuZWdhdGl2ZSBsaW5lYXIgdHJlbmQsIHdpdGggdGhvc2Ugd2l0aCBtb3JlIGVkdWNhdGlvbiBoYXZpbmcgaGlnaGVyIGNoYW5jZXMgb2YgcmVwb3J0aW5nIGFjY2VzcyB0byBoZWFsdGhjYXJlIGNvbXBhcmVkIHRvIHRob3NlIHdpdGggYSBwcmltYXJ5IHNjaG9vbCBlZHVjYXRpb24gKFJlZmVyZW5jZSBncm91cCksIGFuZCBsaWtld2lzZSwgYXMgcGVvcGxlIGluY3JlYXNlIGluIGFnZSwgdGhleSBhcmUgbW9yZSBsaWtlbHkgdG8gcmVwb3J0IGdyZWF0ZXIgYWNjZXNzIHRvIGhlYWx0aGNhcmUsIGNvbXBhcmVkIHRvIHRob3NlIHVuZGVyIGFnZSAyNCAoUmVmZXJlbmNlIGdyb3VwKS4NCg0KDQojIyBGaXR0ZWQgVmFsdWVzDQoNCmBgYHtyLCByZXN1bHRzPSdhc2lzJ30NCmxpYnJhcnkoZW1tZWFucykNCnJnID0gcmVmX2dyaWQoZml0LmxvZ2l0KQ0KDQptYXJnX2xvZ2l0ID0gZW1tZWFucyhvYmplY3QgPSByZywNCiAgICAgICAgICAgICAgc3BlY3MgPSBjKCAicmFjZV9ldGgiLCAgImVkdWMiLCAiYWdlYyIpLA0KICAgICAgICAgICAgICB0eXBlPSJyZXNwb25zZSIgKQ0KDQprbml0cjo6a2FibGUobWFyZ19sb2dpdCwgIGRpZ2l0cyA9IDQpDQoNCmBgYA0KSW4gY29tcGFyaW5nIGNvbnRyaXZlZCB2YWx1ZXMgdG8gdGhlIHByb2JpdCBtb2RlbCBlc3RpbWF0ZXMsIHRoZXkgYXJlIHZlcnkgc2ltaWxhci4NCg0KYGBge3J9DQpyZyA9IHJlZl9ncmlkKGZpdC5wcm9iaXQpDQoNCm1hcmdfcHJvYml0ID0gZW1tZWFucyhvYmplY3QgPSByZywNCiAgICAgICAgICAgICAgc3BlY3MgPSBjKCAicmFjZV9ldGgiLCAiYWdlYyIpLA0KICAgICAgICAgICAgICB0eXBlPSJyZXNwb25zZSIgKQ0Ka25pdHI6OmthYmxlKG1hcmdfcHJvYml0LCBkaWdpdHMgPSA0KQ0KDQpgYGANCg0KDQpUaGUgZm9sbG93aW5nIHNob3dzIHRoZSBlc3RpbWF0ZWQgcHJvYmFiaWxpdHkgb2YgcmVwb3J0aW5nIGFjY2VzcyB0byBoZWFsdGhjYXJlIGZvciBlYWNoIHNwZWNpZmllZCB0eXBlIG9mICJ0eXBpY2FsIHBlcnNvbiIgdGhhdCB3ZSBnZW5lcmF0ZS4gTm9uLUhpc3BhbmljIHdoaXRlIGFkdWx0cyB3aXRoIGEgY29sbGVnZSBlZHVjYXRpb24gYXJlIGNvbXBhcmVkIEhpc3BhbmljIGFkdWx0cywgYWdlIDM5LTU5IHdpdGggYSBjb2xsZWdlIGVkdWNhdGlvbjoNCg0KYGBge3J9DQoNCmNvbXBzID0gYXMuZGF0YS5mcmFtZShtYXJnX2xvZ2l0KQ0KDQpjb21wc1tjb21wcyRyYWNlX2V0aD09Imhpc3BhbmljIiAmIGNvbXBzJGVkdWMgPT0gIkNvbGxlZ2UgZ3JhZCIgLCBdDQpjb21wc1tjb21wcyRyYWNlX2V0aD09Im5oIHdoaXRlIiAmIGNvbXBzJGVkdWMgPT0gIkNvbGxlZ2UgZ3JhZCIgLCBdDQpgYGANCg0KDQpIaXNwYW5pYyBhZHVsdHMgYWdlZCAzOS01OSB5ZWFycyBkZW1vbnN0cmF0ZSBhbiBlc3RpbWF0ZWQgcHJvYmFiaWxpdHkgb2YgcmVwb3J0aW5nIGFjY2VzcyB0byBoZWFsdGhjYXJlIG9mIGFib3V0IDkwLjclLCB3aGlsZSB0aGUgTkggd2hpdGUgYWR1bHRzIG9mIHRoZSBzYW1lIGFnZSBhbmQgZWR1Y2F0aW9uIGxldmVsIGhhdmUgYWJvdXQgYSA5Ni43JSBjaGFuY2UuIFRoaXMgaW5kaWNhdGVzIHJhY2lhbC9ldGhuaWMgZ3JvdXAgaGFzIGEgc3Vic3RhbnRpYWwgaW1wYWN0IG9uIGFjY2VzcyB0byBoZWFsdGhjYXJlIGZvciBVLlMuIGFkdWx0cy4NCg0KDQo=