Loading Packages for Assignment

library(tidyverse)
library(knitr)
library(haven)   #needed to pull data from file location
library(ggplot2)
library(broom)
library(skimr)
library(stargazer)
  1. You are (hypothetically) interested in the participants’ hourly wages (wage). You have several working hypotheses: that wages differ according to the participants’ college graduation status (collgrad), their total work experience (ttl_exp), and their age (age). State and R users: rename the variable collgrad to college_grad, rename the variable ttl_exp into total_work_exp, and rename the variable age to age_years. R Users: you will need to change collgrad into a factor variable using the mutate() and as_factor()functions, just like in the example. Use skim (R Users) or codebook (Stata) to check your work.
nlsw <- read_dta("nlsw88.dta")   #pulling in data, using the haven package
glimpse(nlsw) #reviwing data
Rows: 2,246
Columns: 17
$ idcode        <dbl> 1, 2, 3, 4, 6, 7, 9, 12, 13, 14, 15, 16, 18, 19, 20, 22, 23, 24, 25, 36,...
$ age           <dbl> 37, 37, 42, 43, 42, 39, 37, 40, 40, 40, 39, 40, 40, 40, 39, 41, 42, 41, ...
$ race          <dbl+lbl> 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,...
$ married       <dbl+lbl> 0, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1,...
$ never_married <dbl> 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, ...
$ grade         <dbl> 12, 12, 12, 17, 12, 12, 12, 18, 14, 15, 16, 15, 15, 15, 15, 15, 15, 14, ...
$ collgrad      <dbl+lbl> 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 0,...
$ south         <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ...
$ smsa          <dbl+lbl> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1,...
$ c_city        <dbl> 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, ...
$ industry      <dbl+lbl>  5,  4,  4, 11,  4, 11,  5, 11, 11, 11, 11, 11,  6, 11, 11, 11, 11, ...
$ occupation    <dbl+lbl>  6,  5,  3, 13,  6,  3,  2,  2,  3,  1,  1,  1,  5,  1,  1,  1,  1, ...
$ union         <dbl+lbl>  1,  1, NA,  1,  0,  0,  1,  0,  0,  0,  1,  0,  0,  1,  1,  0,  0, ...
$ wage          <dbl> 11.739125, 6.400963, 5.016723, 9.033813, 8.083731, 4.629630, 10.491142, ...
$ hours         <dbl> 48, 40, 40, 42, 48, 30, 40, 45, 8, 50, 16, 40, 40, 40, 4, 32, 45, 24, 40...
$ ttl_exp       <dbl> 10.333334, 13.621795, 17.730770, 13.211537, 17.820513, 7.326923, 19.0448...
$ tenure        <dbl> 5.3333335, 5.2500000, 1.2500000, 1.7500000, 17.7500000, 2.2500000, 19.00...

R users:

a. rename the variable collgrad to college_grad, 
b. rename the variable ttl_exp into total_work_exp, and 
c. rename the variable age to age_years. 
d. change collgrad into a factor variable using the mutate() and as_factor()functions
e. Use skim to check your work.
nlsw.clean <- nlsw %>%
  rename(.,
         college_grad = collgrad,  #rename the variable collgrad to college_grad, 
         total_work_exp = ttl_exp,  #rename the variable ttl_exp into total_work_exp
         age_years = age) %>%       #rename the variable age to age_years
  
  
  
  #change collgrad into a factor variable using the mutate() and as_factor()functions
  mutate(.,college_grad_fac = as_factor(college_grad))
  



glimpse(nlsw.clean)
Rows: 2,246
Columns: 18
$ idcode           <dbl> 1, 2, 3, 4, 6, 7, 9, 12, 13, 14, 15, 16, 18, 19, 20, 22, 23, 24, 25, ...
$ age_years        <dbl> 37, 37, 42, 43, 42, 39, 37, 40, 40, 40, 39, 40, 40, 40, 39, 41, 42, 4...
$ race             <dbl+lbl> 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,...
$ married          <dbl+lbl> 0, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 0, 1,...
$ never_married    <dbl> 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, ...
$ grade            <dbl> 12, 12, 12, 17, 12, 12, 12, 18, 14, 15, 16, 15, 15, 15, 15, 15, 15, 1...
$ college_grad     <dbl+lbl> 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 1,...
$ south            <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ...
$ smsa             <dbl+lbl> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1,...
$ c_city           <dbl> 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, ...
$ industry         <dbl+lbl>  5,  4,  4, 11,  4, 11,  5, 11, 11, 11, 11, 11,  6, 11, 11, 11, 1...
$ occupation       <dbl+lbl>  6,  5,  3, 13,  6,  3,  2,  2,  3,  1,  1,  1,  5,  1,  1,  1,  ...
$ union            <dbl+lbl>  1,  1, NA,  1,  0,  0,  1,  0,  0,  0,  1,  0,  0,  1,  1,  0,  ...
$ wage             <dbl> 11.739125, 6.400963, 5.016723, 9.033813, 8.083731, 4.629630, 10.49114...
$ hours            <dbl> 48, 40, 40, 42, 48, 30, 40, 45, 8, 50, 16, 40, 40, 40, 4, 32, 45, 24,...
$ total_work_exp   <dbl> 10.333334, 13.621795, 17.730770, 13.211537, 17.820513, 7.326923, 19.0...
$ tenure           <dbl> 5.3333335, 5.2500000, 1.2500000, 1.7500000, 17.7500000, 2.2500000, 19...
$ college_grad_fac <fct> not college grad, not college grad, not college grad, college grad, n...
skim(nlsw.clean) #Use skim to check your work.
Couldn't find skimmers for class: haven_labelled, vctrs_vctr, double, numeric; No user-defined `sfl` provided. Falling back to `character`.Couldn't find skimmers for class: haven_labelled, vctrs_vctr, double, numeric; No user-defined `sfl` provided. Falling back to `character`.Couldn't find skimmers for class: haven_labelled, vctrs_vctr, double, numeric; No user-defined `sfl` provided. Falling back to `character`.Couldn't find skimmers for class: haven_labelled, vctrs_vctr, double, numeric; No user-defined `sfl` provided. Falling back to `character`.Couldn't find skimmers for class: haven_labelled, vctrs_vctr, double, numeric; No user-defined `sfl` provided. Falling back to `character`.Couldn't find skimmers for class: haven_labelled, vctrs_vctr, double, numeric; No user-defined `sfl` provided. Falling back to `character`.Couldn't find skimmers for class: haven_labelled, vctrs_vctr, double, numeric; No user-defined `sfl` provided. Falling back to `character`.
-- Data Summary ------------------------
                           Values    
Name                       nlsw.clean
Number of rows             2246      
Number of columns          18        
_______________________              
Column type frequency:               
  character                7         
  factor                   1         
  numeric                  10        
________________________             
Group variables            None      

-- Variable type: character -----------------------------------------------------------------------
# A tibble: 7 x 8
  skim_variable n_missing complete_rate   min   max empty n_unique whitespace
* <chr>             <int>         <dbl> <int> <int> <int>    <int>      <int>
1 race                  0         1         1     1     0        3          0
2 married               0         1         1     1     0        2          0
3 college_grad          0         1         1     1     0        2          0
4 smsa                  0         1         1     1     0        2          0
5 industry             14         0.994     1     2     0       12          0
6 occupation            9         0.996     1     2     0       13          0
7 union               368         0.836     1     1     0        2          0

-- Variable type: factor --------------------------------------------------------------------------
# A tibble: 1 x 6
  skim_variable    n_missing complete_rate ordered n_unique top_counts         
* <chr>                <int>         <dbl> <lgl>      <int> <chr>              
1 college_grad_fac         0             1 FALSE          2 not: 1714, col: 532

-- Variable type: numeric -------------------------------------------------------------------------
# A tibble: 10 x 11
   skim_variable  n_missing complete_rate     mean       sd     p0     p25     p50     p75   p100
 * <chr>              <int>         <dbl>    <dbl>    <dbl>  <dbl>   <dbl>   <dbl>   <dbl>  <dbl>
 1 idcode                 0         1     2613.    1481.     1     1366.   2614    3902.   5159  
 2 age_years              0         1       39.2      3.06  34       36      39      42      46  
 3 never_married          0         1        0.104    0.306  0        0       0       0       1  
 4 grade                  2         0.999   13.1      2.52   0       12      12      15      18  
 5 south                  0         1        0.419    0.494  0        0       0       1       1  
 6 c_city                 0         1        0.292    0.455  0        0       0       1       1  
 7 wage                   0         1        7.77     5.76   1.00     4.26    6.27    9.59   40.7
 8 hours                  4         0.998   37.2     10.5    1       35      40      40      80  
 9 total_work_exp         0         1       12.5      4.61   0.115    9.21   13.1    16.0    28.9
10 tenure                15         0.993    5.98     5.51   0        1.58    3.83    9.33   25.9
   hist 
 * <chr>
 1 ▇▇▇▇▇
 2 ▇▆▇▃▃
 3 ▇▁▁▁▁
 4 ▁▁▁▇▃
 5 ▇▁▁▁▆
 6 ▇▁▁▁▃
 7 ▇▂▁▁▁
 8 ▁▂▇▁▁
 9 ▂▅▇▂▁
10 ▇▃▂▁▁
  1. Run a series of linear regressions with hourly wages (wage) as the outcome and the other variables as predictors. Build up a series of three models, starting with ttl_exp, as the only predictor, then adding in age, then adding in collgrad, and then finally testing an interaction between age and total experience. Include the results table of each regression along the way.
nlswreg1 <- lm(wage ~ total_work_exp, data = nlsw.clean) 
#nlswreg1 <- lm(nlsw.clean$wage ~ nlsw.clean$total_work_exp) is another way to write this. 


summary(nlswreg1)

Call:
lm(formula = wage ~ total_work_exp, data = nlsw.clean)

Residuals:
   Min     1Q Median     3Q    Max 
-8.502 -2.911 -1.295  1.308 35.370 

Coefficients:
               Estimate Std. Error t value Pr(>|t|)    
(Intercept)     3.61249    0.33935   10.64   <2e-16 ***
total_work_exp  0.33143    0.02541   13.04   <2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 5.55 on 2244 degrees of freedom
Multiple R-squared:  0.07048,   Adjusted R-squared:  0.07006 
F-statistic: 170.1 on 1 and 2244 DF,  p-value: < 2.2e-16
nlswreg2 <- lm(wage ~ total_work_exp + age_years, data = nlsw.clean) 
summary(nlswreg2)

Call:
lm(formula = wage ~ total_work_exp + age_years, data = nlsw.clean)

Residuals:
   Min     1Q Median     3Q    Max 
-8.107 -2.926 -1.267  1.337 35.050 

Coefficients:
               Estimate Std. Error t value Pr(>|t|)    
(Intercept)     8.64932    1.50566   5.745 1.05e-08 ***
total_work_exp  0.34233    0.02555  13.401  < 2e-16 ***
age_years      -0.13213    0.03849  -3.433 0.000607 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 5.537 on 2243 degrees of freedom
Multiple R-squared:  0.07534,   Adjusted R-squared:  0.07451 
F-statistic: 91.37 on 2 and 2243 DF,  p-value: < 2.2e-16
nlswreg3 <- lm(wage ~ total_work_exp + age_years +college_grad, data = nlsw.clean) 
summary(nlswreg3)

Call:
lm(formula = wage ~ total_work_exp + age_years + college_grad, 
    data = nlsw.clean)

Residuals:
   Min     1Q Median     3Q    Max 
-9.917 -2.689 -1.021  1.086 35.550 

Coefficients:
               Estimate Std. Error t value Pr(>|t|)    
(Intercept)     7.92690    1.46037   5.428 6.31e-08 ***
total_work_exp  0.30869    0.02491  12.391  < 2e-16 ***
age_years      -0.12252    0.03731  -3.284  0.00104 ** 
college_grad    3.24134    0.26799  12.095  < 2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 5.366 on 2242 degrees of freedom
Multiple R-squared:  0.132, Adjusted R-squared:  0.1308 
F-statistic: 113.6 on 3 and 2242 DF,  p-value: < 2.2e-16
nlswreg4 <- lm(wage ~ total_work_exp + age_years +college_grad +age_years:total_work_exp, data = nlsw.clean) 
summary(nlswreg4)

Call:
lm(formula = wage ~ total_work_exp + age_years + college_grad + 
    age_years:total_work_exp, data = nlsw.clean)

Residuals:
   Min     1Q Median     3Q    Max 
-9.535 -2.646 -1.027  1.064 35.940 

Coefficients:
                          Estimate Std. Error t value Pr(>|t|)    
(Intercept)               1.701472   4.151041   0.410   0.6819    
total_work_exp            0.816992   0.318256   2.567   0.0103 *  
age_years                 0.034692   0.104979   0.330   0.7411    
college_grad              3.229193   0.268005  12.049   <2e-16 ***
total_work_exp:age_years -0.012788   0.007982  -1.602   0.1093    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 5.364 on 2241 degrees of freedom
Multiple R-squared:  0.133, Adjusted R-squared:  0.1314 
F-statistic: 85.92 on 4 and 2241 DF,  p-value: < 2.2e-16
  1. Finally, summarize the results of your four models in one table, and then try to synthesize the results in words. Does total experience matter as a predictor of womens’ hourly wages? Does this change once college status and age are taken into consideration? Overall, how well do these models perform as predictors or wages?

plot(nlsw.clean$total_work_exp, nlsw.clean$age_years)

summary.table <- stargazer(nlswreg1,
                           nlswreg2,
                           nlswreg3,
                           nlswreg4,
                           type = "text",
                           font.size = "normalsize",
                           digits = 2,
                           keep.stat = c("n", "rsq", "adj.rsq"),
                           out = "test.html",
                           star.cutoffs = c(.05, .01, .001))
length of NULL cannot be changedlength of NULL cannot be changedlength of NULL cannot be changedlength of NULL cannot be changedlength of NULL cannot be changednumber of rows of result is not a multiple of vector length (arg 2)number of rows of result is not a multiple of vector length (arg 2)number of rows of result is not a multiple of vector length (arg 2)

=========================================================
                               Dependent variable:       
                         --------------------------------
                                       wage              
                           (1)     (2)      (3)     (4)  
---------------------------------------------------------
total_work_exp           0.33*** 0.34***  0.31***  0.82* 
                         (0.03)   (0.03)  (0.02)  (0.32) 
                                                         
age_years                        -0.13*** -0.12**  0.03  
                                  (0.04)  (0.04)  (0.10) 
                                                         
college_grad                              3.24*** 3.23***
                                          (0.27)  (0.27) 
                                                         
total_work_exp:age_years                           -0.01 
                                                  (0.01) 
                                                         
Constant                 3.61*** 8.65***  7.93***  1.70  
                         (0.34)   (1.51)  (1.46)  (4.15) 
                                                         
---------------------------------------------------------
Observations              2,246   2,246    2,246   2,246 
R2                        0.07     0.08    0.13    0.13  
Adjusted R2               0.07     0.07    0.13    0.13  
=========================================================
Note:                       *p<0.05; **p<0.01; ***p<0.001

According to this model and dataset, total work experience is a signifcant predictor of womens’ hourly wage. When age is taken into consideration, the wage does not change as much. As additional predictor variables are added, age_years becomes less signifcant. However, when college_grad was introduced into the model, age and work_experience did not have as much weight.

Overall, these models are not great predictors of wage. From this analysis you can note a few significant variables; however, the model as whole is weak (note the .13 adjusted R-squared).

LS0tDQp0aXRsZTogIk1vZHVsZSAyIENvbnRlbnQgUmV2aWV3IC0gUmVncmVzc2lvbiINCmF1dGhvcjogIkpha2UgUmV5bm9sZHMgLSBBdWd1c3QgMjksIDIwMjAiDQpvdXRwdXQ6DQogIGh0bWxfbm90ZWJvb2s6IGRlZmF1bHQNCiAgd29yZF9kb2N1bWVudDogZGVmYXVsdA0KICBwZGZfZG9jdW1lbnQ6IGRlZmF1bHQNCi0tLQ0KDQpMb2FkaW5nIFBhY2thZ2VzIGZvciBBc3NpZ25tZW50DQoNCmBgYHtyfQ0KbGlicmFyeSh0aWR5dmVyc2UpDQpsaWJyYXJ5KGtuaXRyKQ0KbGlicmFyeShoYXZlbikgICAjbmVlZGVkIHRvIHB1bGwgZGF0YSBmcm9tIGZpbGUgbG9jYXRpb24NCmxpYnJhcnkoZ2dwbG90MikNCmxpYnJhcnkoYnJvb20pDQpsaWJyYXJ5KHNraW1yKQ0KbGlicmFyeShzdGFyZ2F6ZXIpDQpgYGANCjEuIFlvdSBhcmUgKGh5cG90aGV0aWNhbGx5KSBpbnRlcmVzdGVkIGluIHRoZSBwYXJ0aWNpcGFudHPigJkgaG91cmx5IHdhZ2VzICh3YWdlKS4gIFlvdSBoYXZlIHNldmVyYWwgd29ya2luZyBoeXBvdGhlc2VzOiB0aGF0IHdhZ2VzIGRpZmZlciBhY2NvcmRpbmcgdG8gdGhlIHBhcnRpY2lwYW50c+KAmSBjb2xsZWdlIGdyYWR1YXRpb24gc3RhdHVzIChjb2xsZ3JhZCksIHRoZWlyIHRvdGFsIHdvcmsgZXhwZXJpZW5jZSAodHRsX2V4cCksIGFuZCB0aGVpciBhZ2UgKGFnZSkuICBTdGF0ZSBhbmQgUiB1c2VyczogcmVuYW1lIHRoZSB2YXJpYWJsZSBjb2xsZ3JhZCB0byBjb2xsZWdlX2dyYWQsIHJlbmFtZSB0aGUgdmFyaWFibGUgdHRsX2V4cCBpbnRvIHRvdGFsX3dvcmtfZXhwLCBhbmQgcmVuYW1lIHRoZSB2YXJpYWJsZSBhZ2UgdG8gYWdlX3llYXJzLiBSIFVzZXJzOiB5b3Ugd2lsbCBuZWVkIHRvIGNoYW5nZSBjb2xsZ3JhZCBpbnRvIGEgZmFjdG9yIHZhcmlhYmxlIHVzaW5nIHRoZSBtdXRhdGUoKSBhbmQgYXNfZmFjdG9yKClmdW5jdGlvbnMsIGp1c3QgbGlrZSBpbiB0aGUgZXhhbXBsZS4gVXNlIHNraW0gKFIgVXNlcnMpIG9yIGNvZGVib29rIChTdGF0YSkgdG8gY2hlY2sgeW91ciB3b3JrLg0KDQoNCg0KYGBge3J9DQpubHN3IDwtIHJlYWRfZHRhKCJubHN3ODguZHRhIikgICAjcHVsbGluZyBpbiBkYXRhLCB1c2luZyB0aGUgaGF2ZW4gcGFja2FnZQ0KZ2xpbXBzZShubHN3KSAjcmV2aWV3aW5nIGRhdGENCg0KYGBgDQpSIHVzZXJzOiANCg0KICAgIGEuIHJlbmFtZSB0aGUgdmFyaWFibGUgY29sbGdyYWQgdG8gY29sbGVnZV9ncmFkLCANCiAgICBiLiByZW5hbWUgdGhlIHZhcmlhYmxlIHR0bF9leHAgaW50byB0b3RhbF93b3JrX2V4cCwgYW5kIA0KICAgIGMuIHJlbmFtZSB0aGUgdmFyaWFibGUgYWdlIHRvIGFnZV95ZWFycy4gDQogICAgZC4gY2hhbmdlIGNvbGxncmFkIGludG8gYSBmYWN0b3IgdmFyaWFibGUgdXNpbmcgdGhlIG11dGF0ZSgpIGFuZCBhc19mYWN0b3IoKWZ1bmN0aW9ucw0KICAgIGUuIFVzZSBza2ltIHRvIGNoZWNrIHlvdXIgd29yay4NCiAgICANCmBgYHtyfQ0Kbmxzdy5jbGVhbiA8LSBubHN3ICU+JQ0KICByZW5hbWUoLiwNCiAgICAgICAgIGNvbGxlZ2VfZ3JhZCA9IGNvbGxncmFkLCAgI3JlbmFtZSB0aGUgdmFyaWFibGUgY29sbGdyYWQgdG8gY29sbGVnZV9ncmFkLCANCiAgICAgICAgIHRvdGFsX3dvcmtfZXhwID0gdHRsX2V4cCwgICNyZW5hbWUgdGhlIHZhcmlhYmxlIHR0bF9leHAgaW50byB0b3RhbF93b3JrX2V4cA0KICAgICAgICAgYWdlX3llYXJzID0gYWdlKSAlPiUgICAgICAgI3JlbmFtZSB0aGUgdmFyaWFibGUgYWdlIHRvIGFnZV95ZWFycw0KICANCiAgDQogIA0KICAjY2hhbmdlIGNvbGxncmFkIGludG8gYSBmYWN0b3IgdmFyaWFibGUgdXNpbmcgdGhlIG11dGF0ZSgpIGFuZCBhc19mYWN0b3IoKWZ1bmN0aW9ucw0KICBtdXRhdGUoLixjb2xsZWdlX2dyYWRfZmFjID0gYXNfZmFjdG9yKGNvbGxlZ2VfZ3JhZCkpDQogIA0KDQoNCg0KZ2xpbXBzZShubHN3LmNsZWFuKQ0Kc2tpbShubHN3LmNsZWFuKSAjVXNlIHNraW0gdG8gY2hlY2sgeW91ciB3b3JrLg0KYGBgDQogICAgDQogICAgDQoyLiBSdW4gYSBzZXJpZXMgb2YgbGluZWFyIHJlZ3Jlc3Npb25zIHdpdGggaG91cmx5IHdhZ2VzICh3YWdlKSBhcyB0aGUgb3V0Y29tZSBhbmQgdGhlIG90aGVyIHZhcmlhYmxlcyBhcyBwcmVkaWN0b3JzLiBCdWlsZCB1cCBhIHNlcmllcyBvZiB0aHJlZSBtb2RlbHMsIHN0YXJ0aW5nIHdpdGggdHRsX2V4cCwgYXMgdGhlIG9ubHkgcHJlZGljdG9yLCB0aGVuIGFkZGluZyBpbiBhZ2UsIHRoZW4gYWRkaW5nIGluIGNvbGxncmFkLCBhbmQgdGhlbiBmaW5hbGx5IHRlc3RpbmcgYW4gaW50ZXJhY3Rpb24gYmV0d2VlbiBhZ2UgYW5kIHRvdGFsIGV4cGVyaWVuY2UuIEluY2x1ZGUgdGhlIHJlc3VsdHMgdGFibGUgb2YgZWFjaCByZWdyZXNzaW9uIGFsb25nIHRoZSB3YXkuDQoNCmBgYHtyfQ0Kbmxzd3JlZzEgPC0gbG0od2FnZSB+IHRvdGFsX3dvcmtfZXhwLCBkYXRhID0gbmxzdy5jbGVhbikgDQojbmxzd3JlZzEgPC0gbG0obmxzdy5jbGVhbiR3YWdlIH4gbmxzdy5jbGVhbiR0b3RhbF93b3JrX2V4cCkgaXMgYW5vdGhlciB3YXkgdG8gd3JpdGUgdGhpcy4gDQoNCg0Kc3VtbWFyeShubHN3cmVnMSkNCmBgYA0KDQpgYGB7cn0NCm5sc3dyZWcyIDwtIGxtKHdhZ2UgfiB0b3RhbF93b3JrX2V4cCArIGFnZV95ZWFycywgZGF0YSA9IG5sc3cuY2xlYW4pIA0Kc3VtbWFyeShubHN3cmVnMikNCmBgYA0KYGBge3J9DQpubHN3cmVnMyA8LSBsbSh3YWdlIH4gdG90YWxfd29ya19leHAgKyBhZ2VfeWVhcnMgK2NvbGxlZ2VfZ3JhZCwgZGF0YSA9IG5sc3cuY2xlYW4pIA0Kc3VtbWFyeShubHN3cmVnMykNCmBgYA0KYGBge3J9DQpubHN3cmVnNCA8LSBsbSh3YWdlIH4gdG90YWxfd29ya19leHAgKyBhZ2VfeWVhcnMgK2NvbGxlZ2VfZ3JhZCArYWdlX3llYXJzOnRvdGFsX3dvcmtfZXhwLCBkYXRhID0gbmxzdy5jbGVhbikgDQpzdW1tYXJ5KG5sc3dyZWc0KQ0KYGBgDQozLiBGaW5hbGx5LCBzdW1tYXJpemUgdGhlIHJlc3VsdHMgb2YgeW91ciBmb3VyIG1vZGVscyBpbiBvbmUgdGFibGUsIGFuZCB0aGVuIHRyeSB0byBzeW50aGVzaXplIHRoZSByZXN1bHRzIGluIHdvcmRzLiBEb2VzIHRvdGFsIGV4cGVyaWVuY2UgbWF0dGVyIGFzIGEgcHJlZGljdG9yIG9mIHdvbWVuc+KAmSBob3VybHkgd2FnZXM/IERvZXMgdGhpcyBjaGFuZ2Ugb25jZSBjb2xsZWdlIHN0YXR1cyBhbmQgYWdlIGFyZSB0YWtlbiBpbnRvIGNvbnNpZGVyYXRpb24/IE92ZXJhbGwsIGhvdyB3ZWxsIGRvIHRoZXNlIG1vZGVscyBwZXJmb3JtIGFzIHByZWRpY3RvcnMgb3Igd2FnZXM/DQoNCg0KYGBge3J9DQoNCnBsb3Qobmxzdy5jbGVhbiR0b3RhbF93b3JrX2V4cCwgbmxzdy5jbGVhbiRhZ2VfeWVhcnMpDQoNCmBgYA0KDQpgYGB7cn0NCnN1bW1hcnkudGFibGUgPC0gc3RhcmdhemVyKG5sc3dyZWcxLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgbmxzd3JlZzIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBubHN3cmVnMywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIG5sc3dyZWc0LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSA9ICJ0ZXh0IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbnQuc2l6ZSA9ICJub3JtYWxzaXplIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpZ2l0cyA9IDIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBrZWVwLnN0YXQgPSBjKCJuIiwgInJzcSIsICJhZGoucnNxIiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICBvdXQgPSAidGVzdC5odG1sIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXIuY3V0b2ZmcyA9IGMoLjA1LCAuMDEsIC4wMDEpKQ0KYGBgDQoNCg0KQWNjb3JkaW5nIHRvIHRoaXMgbW9kZWwgYW5kIGRhdGFzZXQsIHRvdGFsIHdvcmsgZXhwZXJpZW5jZSBpcyBhIHNpZ25pZmNhbnQgcHJlZGljdG9yIG9mIHdvbWVucycgaG91cmx5IHdhZ2UuIFdoZW4gYWdlIGlzIHRha2VuIGludG8gY29uc2lkZXJhdGlvbiwgdGhlIHdhZ2UgZG9lcyBub3QgY2hhbmdlIGFzIG11Y2guIEFzIGFkZGl0aW9uYWwgcHJlZGljdG9yIHZhcmlhYmxlcyBhcmUgYWRkZWQsIGFnZV95ZWFycyBiZWNvbWVzIGxlc3Mgc2lnbmlmY2FudC4gSG93ZXZlciwgd2hlbiBjb2xsZWdlX2dyYWQgd2FzIGludHJvZHVjZWQgaW50byB0aGUgbW9kZWwsIGFnZSBhbmQgd29ya19leHBlcmllbmNlIGRpZCBub3QgaGF2ZSBhcyBtdWNoIHdlaWdodC4NCg0KDQpPdmVyYWxsLCB0aGVzZSBtb2RlbHMgYXJlIG5vdCBncmVhdCBwcmVkaWN0b3JzIG9mIHdhZ2UuIEZyb20gdGhpcyBhbmFseXNpcyB5b3UgY2FuIG5vdGUgYSBmZXcgc2lnbmlmaWNhbnQgdmFyaWFibGVzOyBob3dldmVyLCB0aGUgbW9kZWwgYXMgd2hvbGUgaXMgd2VhayAobm90ZSB0aGUgLjEzIGFkanVzdGVkIFItc3F1YXJlZCkuDQoNCg==