This is an R Markdown Notebook. When you execute code within the notebook, the results appear beneath the code.

Try executing this chunk by clicking the Run button within the chunk or by placing your cursor inside it and pressing Ctrl+Shift+Enter.

plot(cars)
library(tidyverse)
Registered S3 methods overwritten by 'dbplyr':
  method         from
  print.tbl_lazy     
  print.tbl_sql      
-- Attaching packages --------------------------------------- tidyverse 1.3.0 --
v ggplot2 3.3.2     v purrr   0.3.4
v tibble  3.0.3     v dplyr   1.0.2
v tidyr   1.1.1     v stringr 1.4.0
v readr   1.3.1     v forcats 0.5.0
-- Conflicts ------------------------------------------ tidyverse_conflicts() --
x dplyr::filter() masks stats::filter()
x dplyr::lag()    masks stats::lag()
library(Hmisc)
Loading required package: lattice
Loading required package: survival
Loading required package: Formula
Registered S3 method overwritten by 'htmlwidgets':
  method           from         
  print.htmlwidget tools:rstudio
Registered S3 method overwritten by 'data.table':
  method           from
  print.data.table     

Attaching package: 㤼㸱Hmisc㤼㸲

The following objects are masked from 㤼㸱package:dplyr㤼㸲:

    src, summarize

The following objects are masked from 㤼㸱package:base㤼㸲:

    format.pval, units
library(lme4)
Loading required package: Matrix

Attaching package: 㤼㸱Matrix㤼㸲

The following objects are masked from 㤼㸱package:tidyr㤼㸲:

    expand, pack, unpack
scotland <- read_dta("EDUS 651/scotland.dta")
Hmisc::describe(scotland)
scotland 

 11  Variables      2310  Observations
---------------------------------------------------------------------
neighid  Format:%12.0g 
       n  missing distinct     Info     Mean      Gmd      .05 
    2310        0      524        1    495.3    305.5     61.0 
     .10      .25      .50      .75      .90      .95 
   143.9    240.2    530.0    707.0    808.0    861.0 

lowest :   26   27   29   30   31, highest: 1092 1095 1096 1097 1098
---------------------------------------------------------------------
schid  Format:%12.0g 
       n  missing distinct     Info     Mean      Gmd      .05 
    2310        0       17    0.995    10.01    7.174        0 
     .10      .25      .50      .75      .90      .95 
       2        5        9       16       19       20 

lowest :  0  1  2  3  5, highest: 16 17 18 19 20
                                                                
Value          0     1     2     3     5     6     7     8     9
Frequency    146    22   146   159   155   101   286   112   136
Proportion 0.063 0.010 0.063 0.069 0.067 0.044 0.124 0.048 0.059
                                                          
Value         10    13    15    16    17    18    19    20
Frequency    133    92   190   111   154    91   102   174
Proportion 0.058 0.040 0.082 0.048 0.067 0.039 0.044 0.075
---------------------------------------------------------------------
attain  Format:%12.0g 
       n  missing distinct     Info     Mean      Gmd      .05 
    2310        0       14    0.987   0.0934    1.124  -1.3276 
     .10      .25      .50      .75      .90      .95 
 -1.3276  -0.5812   0.1582   0.7350   1.5177   1.5177 

lowest : -1.3276 -0.5812 -0.3600 -0.1325  0.0293
highest:  0.7350  0.9127  1.1405  1.5177  2.4151
---------------------------------------------------------------------
p7vrq  Format:%12.0g 
       n  missing distinct     Info     Mean      Gmd      .05 
    2310        0       68    0.999   0.5058    11.95  -17.028 
     .10      .25      .50      .75      .90      .95 
 -13.028   -7.028   -0.028    7.972   13.972   16.972 

lowest : -27.028 -26.028 -25.028 -24.028 -23.028
highest:  35.972  36.972  40.972  41.972  42.972
---------------------------------------------------------------------
p7read  Format:%12.0g 
       n  missing distinct     Info     Mean      Gmd      .05 
    2310        0       61        1 -0.04435     15.8  -23.866 
     .10      .25      .50      .75      .90      .95 
 -17.866   -9.866   -0.866    9.134   19.134   24.134 

lowest : -31.866 -30.866 -29.866 -28.866 -27.866
highest:  24.134  25.134  26.134  27.134  28.134
---------------------------------------------------------------------
dadocc  Format:%12.0g 
       n  missing distinct     Info     Mean      Gmd 
    2310        0        7    0.933  -0.4642    12.33 

lowest : -23.454 -11.494  -9.094  -3.454   2.316
highest:  -9.094  -3.454   2.316  16.196  29.226
                                                                  
Value      -23.454 -11.494  -9.094  -3.454   2.316  16.196  29.226
Frequency       91     285     303     884     242     397     108
Proportion   0.039   0.123   0.131   0.383   0.105   0.172   0.047
---------------------------------------------------------------------
dadunemp  Format:%12.0g 
       n  missing distinct     Info      Sum     Mean      Gmd 
    2310        0        2    0.292      252   0.1091   0.1945 

---------------------------------------------------------------------
daded  Format:%12.0g 
       n  missing distinct     Info      Sum     Mean      Gmd 
    2310        0        2    0.507      497   0.2152   0.3379 

---------------------------------------------------------------------
momed  Format:%12.0g 
       n  missing distinct     Info      Sum     Mean      Gmd 
    2310        0        2     0.56      574   0.2485   0.3736 

---------------------------------------------------------------------
male  Format:%12.0g 
       n  missing distinct     Info      Sum     Mean      Gmd 
    2310        0        2    0.749     1109   0.4801   0.4994 

---------------------------------------------------------------------
deprive  Format:%12.0g 
       n  missing distinct     Info     Mean      Gmd      .05 
    2310        0      458        1  0.02167   0.6664  -0.8250 
     .10      .25      .50      .75      .90      .95 
 -0.6930  -0.3970  -0.0620   0.2957   0.8410   1.1400 

lowest : -1.082 -1.048 -1.030 -0.983 -0.975
highest:  2.330  2.419  2.438  2.498  2.959
---------------------------------------------------------------------
scotland.clean <- scotland %>% 
mutate(.,
       schid = as_factor(schid),
       neighid = as_factor(neighid),
       momed = as_factor(momed),
       daded = as_factor(daded))
glimpse(scotland.clean)
Rows: 2,310
Columns: 11
$ neighid  <fct> 26, 26, 26, 26, 26, 27, 29, 29, 29, 29, 29, 29,...
$ schid    <fct> 20, 20, 20, 20, 20, 20, 18, 20, 20, 20, 20, 20,...
$ attain   <dbl> 1.5177, -1.3276, 0.5610, 1.5177, -1.3276, -0.13...
$ p7vrq    <dbl> 17.972, -10.028, 2.972, 1.972, -1.028, 3.972, 8...
$ p7read   <dbl> 17.134, -27.866, 6.134, 11.134, -0.866, -0.866,...
$ dadocc   <dbl> 16.196, -3.454, 2.316, -9.094, -3.454, -3.454, ...
$ dadunemp <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,...
$ daded    <fct> 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1,...
$ momed    <fct> 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,...
$ male     <dbl> 1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 1,...
$ deprive  <dbl> -0.551, -0.551, -0.551, -0.551, -0.551, 0.147, ...
  1. Using reading score (p7read) as the outcome, run and interpret three separate null models, one for school (schid), one for neighborhood (neighid), and one additive null model combining school and neighborhood.
model.null.schid <- lmer(p7read ~ (1|schid), REML = FALSE, data = scotland.clean)
summary(model.null.schid)
Linear mixed model fit by maximum likelihood  ['lmerMod']
Formula: p7read ~ (1 | schid)
   Data: scotland.clean

     AIC      BIC   logLik deviance df.resid 
 18558.8  18576.0  -9276.4  18552.8     2307 

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-2.7611 -0.6895 -0.0027  0.6854  2.5664 

Random effects:
 Groups   Name        Variance Std.Dev.
 schid    (Intercept)  18.75    4.33   
 Residual             176.64   13.29   
Number of obs: 2310, groups:  schid, 17

Fixed effects:
            Estimate Std. Error t value
(Intercept)  -0.2912     1.0951  -0.266
ICC.null.schid <- 18.75/(18.75 + 176.64)

From this null model and ICC we can see that 9% of the variablility is between schools.

model.null.neighid <- lmer(p7read ~ (1|neighid), REML = FALSE, data = scotland.clean)
summary(model.null.neighid)
Linear mixed model fit by maximum likelihood  ['lmerMod']
Formula: p7read ~ (1 | neighid)
   Data: scotland.clean

     AIC      BIC   logLik deviance df.resid 
 18606.3  18623.5  -9300.1  18600.3     2307 

Scaled residuals: 
     Min       1Q   Median       3Q      Max 
-2.65885 -0.67581 -0.01035  0.67042  2.51256 

Random effects:
 Groups   Name        Variance Std.Dev.
 neighid  (Intercept)  32.89    5.735  
 Residual             160.37   12.664  
Number of obs: 2310, groups:  neighid, 524

Fixed effects:
            Estimate Std. Error t value
(Intercept)  -0.2407     0.3816  -0.631
ICC.null.neighid <-  32.89/( 32.89 + 160.37)

From this null model and ICC we can see that 17% of the variablility is between neighborhoods.

model.null.crossed <- lmer(p7read ~ (1|schid) + (1|neighid), REML = FALSE, data = scotland.clean)
summary(model.null.crossed)
Linear mixed model fit by maximum likelihood  ['lmerMod']
Formula: p7read ~ (1 | schid) + (1 | neighid)
   Data: scotland.clean

     AIC      BIC   logLik deviance df.resid 
 18524.9  18547.8  -9258.4  18516.9     2306 

Scaled residuals: 
     Min       1Q   Median       3Q      Max 
-2.61239 -0.66099  0.01158  0.66532  2.55698 

Random effects:
 Groups   Name        Variance Std.Dev.
 neighid  (Intercept)  17.21    4.148  
 schid    (Intercept)  16.59    4.074  
 Residual             160.36   12.663  
Number of obs: 2310, groups:  neighid, 524; schid, 17

Fixed effects:
            Estimate Std. Error t value
(Intercept)  -0.3701     1.0522  -0.352
ICC.schid.crossed <- 16.59/(17.21 + 16.59 + 160.36)
ICC.schid.crossed
[1] 0.08544499
ICC.neighid.crossed <- 17.21/(17.21 + 16.59 + 160.36)
ICC.neighid.crossed
[1] 0.08863824

When we account for nesting within neighborhoods and schools, 9% of the variability of reading scores is bewteen schools and 9% of the variability in reading scores is between neighborhoods. We should run crossed models.

  1. Using the model-building approach of your choice, add a series of predictors to the model: at the student level, add momed and daded; at the school level, add dadocc; and at the neighborhood level, add deprive. Interpret the results and use AIC and BIC to select the best-fitting model.
model.1 <- lmer(p7read ~ momed + daded + (1|schid) + (1|neighid), REML = FALSE, data = scotland.clean)
summary(model.1)
Linear mixed model fit by maximum likelihood  ['lmerMod']
Formula: p7read ~ momed + daded + (1 | schid) + (1 | neighid)
   Data: scotland.clean

     AIC      BIC   logLik deviance df.resid 
 18424.4  18458.9  -9206.2  18412.4     2304 

Scaled residuals: 
     Min       1Q   Median       3Q      Max 
-2.99961 -0.66409  0.01792  0.66336  2.63998 

Random effects:
 Groups   Name        Variance Std.Dev.
 neighid  (Intercept)  13.24    3.639  
 schid    (Intercept)  13.06    3.614  
 Residual             155.66   12.476  
Number of obs: 2310, groups:  neighid, 524; schid, 17

Fixed effects:
            Estimate Std. Error t value
(Intercept)  -2.1132     0.9580  -2.206
momed1        2.4043     0.7069   3.401
daded1        5.3704     0.7504   7.157

Correlation of Fixed Effects:
       (Intr) momed1
momed1 -0.110       
daded1 -0.083 -0.460

Both of the variables are significant and the AIC and BIC have gone down showing this model with individual level predictors fit better. For both mom and dad’s if they have more education it predicts an increase in students reading scores.

model.2 <- lmer(p7read ~ momed + daded + dadocc + (1|schid) + (1|neighid), REML = FALSE, data = scotland.clean)
summary(model.2)
Linear mixed model fit by maximum likelihood  ['lmerMod']
Formula: 
p7read ~ momed + daded + dadocc + (1 | schid) + (1 | neighid)
   Data: scotland.clean

     AIC      BIC   logLik deviance df.resid 
 18310.2  18350.5  -9148.1  18296.2     2303 

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-3.2651 -0.6765  0.0008  0.6506  2.6851 

Random effects:
 Groups   Name        Variance Std.Dev.
 neighid  (Intercept)   7.921   2.814  
 schid    (Intercept)   9.900   3.146  
 Residual             151.718  12.317  
Number of obs: 2310, groups:  neighid, 524; schid, 17

Fixed effects:
            Estimate Std. Error t value
(Intercept) -1.38112    0.84752  -1.630
momed1       1.83651    0.69334   2.649
daded1       3.47317    0.75559   4.597
dadocc       0.26808    0.02425  11.057

Correlation of Fixed Effects:
       (Intr) momed1 daded1
momed1 -0.127              
daded1 -0.107 -0.428       
dadocc  0.078 -0.079 -0.242

After adding the measure of dad’s occupancy both AIC and BIC have decreased showing a greater model fit. Dad’s occupancy is significant and shows as prestige increases it predicts a slight increase in reading scores.

model.3 <- lmer(p7read ~ momed + daded + dadocc + deprive + (1|schid) + (1|neighid), REML = FALSE, data = scotland.clean)
summary(model.3)
Linear mixed model fit by maximum likelihood  ['lmerMod']
Formula: 
p7read ~ momed + daded + dadocc + deprive + (1 | schid) + (1 |  
    neighid)
   Data: scotland.clean

     AIC      BIC   logLik deviance df.resid 
 18253.9  18299.9  -9119.0  18237.9     2302 

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-3.3799 -0.6834  0.0091  0.6557  3.1614 

Random effects:
 Groups   Name        Variance Std.Dev.
 neighid  (Intercept)   3.716   1.928  
 schid    (Intercept)   6.381   2.526  
 Residual             151.646  12.314  
Number of obs: 2310, groups:  neighid, 524; schid, 17

Fixed effects:
            Estimate Std. Error t value
(Intercept) -1.15892    0.70581  -1.642
momed1       1.66801    0.68663   2.429
daded1       3.31275    0.74800   4.429
dadocc       0.23752    0.02435   9.752
deprive     -3.84492    0.48529  -7.923

Correlation of Fixed Effects:
        (Intr) momed1 daded1 dadocc
momed1  -0.151                     
daded1  -0.128 -0.427              
dadocc   0.085 -0.075 -0.232       
deprive -0.033  0.032  0.039  0.197

Both AIC and BIC have decreased showing this model has better fit. Deprive is significant along with momed, daded, dadocc. An increase in the deprive factors in a neighborhood predicts a decrease in reading scoress. This model shows the best fit.

  1. Test a model that includes an interaction between momed and daded. Interpret the results (you don’t need to visualize). What research question is this interaction testing?
model.4 <- lmer(p7read ~ momed + daded + dadocc + deprive + momed:daded + (1|schid) + (1|neighid), REML = FALSE, data = scotland.clean)
summary(model.4)
Linear mixed model fit by maximum likelihood  ['lmerMod']
Formula: 
p7read ~ momed + daded + dadocc + deprive + momed:daded + (1 |  
    schid) + (1 | neighid)
   Data: scotland.clean

     AIC      BIC   logLik deviance df.resid 
 18247.3  18299.0  -9114.6  18229.3     2301 

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-3.3143 -0.6715  0.0026  0.6539  3.1707 

Random effects:
 Groups   Name        Variance Std.Dev.
 neighid  (Intercept)   3.513   1.874  
 schid    (Intercept)   6.506   2.551  
 Residual             151.222  12.297  
Number of obs: 2310, groups:  neighid, 524; schid, 17

Fixed effects:
              Estimate Std. Error t value
(Intercept)   -1.37684    0.71429  -1.928
momed1         3.12965    0.84626   3.698
daded1         5.34180    1.01514   5.262
dadocc         0.23530    0.02432   9.676
deprive       -3.75830    0.48407  -7.764
momed1:daded1 -4.24203    1.43861  -2.949

Correlation of Fixed Effects:
            (Intr) momed1 daded1 dadocc depriv
momed1      -0.181                            
daded1      -0.163  0.143                     
dadocc       0.087 -0.079 -0.192              
deprive     -0.039  0.059  0.067  0.195       
momed1:ddd1  0.103 -0.587 -0.678  0.032 -0.057

The interaction between mom’s education and dad’s education is significant. If the mom has a low level of education then the dad’s level of education has a greater impact on student’s reading scores. The interaction is answering a research question about the impact of mom’s education on the impact dad’s education makes on student’s reading scores.

LS0tDQp0aXRsZTogIlIgTm90ZWJvb2siDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KDQpUaGlzIGlzIGFuIFtSIE1hcmtkb3duXShodHRwOi8vcm1hcmtkb3duLnJzdHVkaW8uY29tKSBOb3RlYm9vay4gV2hlbiB5b3UgZXhlY3V0ZSBjb2RlIHdpdGhpbiB0aGUgbm90ZWJvb2ssIHRoZSByZXN1bHRzIGFwcGVhciBiZW5lYXRoIHRoZSBjb2RlLiANCg0KVHJ5IGV4ZWN1dGluZyB0aGlzIGNodW5rIGJ5IGNsaWNraW5nIHRoZSAqUnVuKiBidXR0b24gd2l0aGluIHRoZSBjaHVuayBvciBieSBwbGFjaW5nIHlvdXIgY3Vyc29yIGluc2lkZSBpdCBhbmQgcHJlc3NpbmcgKkN0cmwrU2hpZnQrRW50ZXIqLiANCg0KYGBge3J9DQpwbG90KGNhcnMpDQpgYGANCg0KDQpgYGB7cn0NCmxpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeShIbWlzYykNCmxpYnJhcnkobG1lNCkNCmBgYA0KDQpgYGB7cn0NCnNjb3RsYW5kIDwtIHJlYWRfZHRhKCJFRFVTIDY1MS9zY290bGFuZC5kdGEiKQ0KSG1pc2M6OmRlc2NyaWJlKHNjb3RsYW5kKQ0KYGBgDQpgYGB7cn0NCnNjb3RsYW5kLmNsZWFuIDwtIHNjb3RsYW5kICU+JSANCm11dGF0ZSguLA0KICAgICAgIHNjaGlkID0gYXNfZmFjdG9yKHNjaGlkKSwNCiAgICAgICBuZWlnaGlkID0gYXNfZmFjdG9yKG5laWdoaWQpLA0KICAgICAgIG1vbWVkID0gYXNfZmFjdG9yKG1vbWVkKSwNCiAgICAgICBkYWRlZCA9IGFzX2ZhY3RvcihkYWRlZCkpDQpnbGltcHNlKHNjb3RsYW5kLmNsZWFuKQ0KYGBgDQoNCg0KDQoNCjEuIFVzaW5nIHJlYWRpbmcgc2NvcmUgKHA3cmVhZCkgYXMgdGhlIG91dGNvbWUsIHJ1biBhbmQgaW50ZXJwcmV0IHRocmVlIHNlcGFyYXRlIG51bGwgbW9kZWxzLCBvbmUgZm9yIHNjaG9vbCAoc2NoaWQpLCBvbmUgZm9yIG5laWdoYm9yaG9vZCAobmVpZ2hpZCksIGFuZCBvbmUgYWRkaXRpdmUgbnVsbCBtb2RlbCBjb21iaW5pbmcgc2Nob29sIGFuZCBuZWlnaGJvcmhvb2QuDQpgYGB7cn0NCm1vZGVsLm51bGwuc2NoaWQgPC0gbG1lcihwN3JlYWQgfiAoMXxzY2hpZCksIFJFTUwgPSBGQUxTRSwgZGF0YSA9IHNjb3RsYW5kLmNsZWFuKQ0Kc3VtbWFyeShtb2RlbC5udWxsLnNjaGlkKQ0KYGBgDQoNCmBgYHtyfQ0KSUNDLm51bGwuc2NoaWQgPC0gMTguNzUvKDE4Ljc1ICsgMTc2LjY0KQ0KYGBgDQoNCkZyb20gdGhpcyBudWxsIG1vZGVsIGFuZCBJQ0Mgd2UgY2FuIHNlZSB0aGF0IDklIG9mIHRoZSB2YXJpYWJsaWxpdHkgaXMgYmV0d2VlbiBzY2hvb2xzLiANCg0KDQpgYGB7cn0NCm1vZGVsLm51bGwubmVpZ2hpZCA8LSBsbWVyKHA3cmVhZCB+ICgxfG5laWdoaWQpLCBSRU1MID0gRkFMU0UsIGRhdGEgPSBzY290bGFuZC5jbGVhbikNCnN1bW1hcnkobW9kZWwubnVsbC5uZWlnaGlkKQ0KYGBgDQoNCmBgYHtyfQ0KSUNDLm51bGwubmVpZ2hpZCA8LSAgMzIuODkvKCAzMi44OSArIDE2MC4zNykNCmBgYA0KDQpGcm9tIHRoaXMgbnVsbCBtb2RlbCBhbmQgSUNDIHdlIGNhbiBzZWUgdGhhdCAxNyUgb2YgdGhlIHZhcmlhYmxpbGl0eSBpcyBiZXR3ZWVuIG5laWdoYm9yaG9vZHMuICANCg0KYGBge3J9DQptb2RlbC5udWxsLmNyb3NzZWQgPC0gbG1lcihwN3JlYWQgfiAoMXxzY2hpZCkgKyAoMXxuZWlnaGlkKSwgUkVNTCA9IEZBTFNFLCBkYXRhID0gc2NvdGxhbmQuY2xlYW4pDQpzdW1tYXJ5KG1vZGVsLm51bGwuY3Jvc3NlZCkNCmBgYA0KYGBge3J9DQpJQ0Muc2NoaWQuY3Jvc3NlZCA8LSAxNi41OS8oMTcuMjEgKyAxNi41OSArIDE2MC4zNikNCklDQy5zY2hpZC5jcm9zc2VkDQpgYGANCmBgYHtyfQ0KSUNDLm5laWdoaWQuY3Jvc3NlZCA8LSAxNy4yMS8oMTcuMjEgKyAxNi41OSArIDE2MC4zNikNCklDQy5uZWlnaGlkLmNyb3NzZWQNCmBgYA0KV2hlbiB3ZSBhY2NvdW50IGZvciBuZXN0aW5nIHdpdGhpbiBuZWlnaGJvcmhvb2RzIGFuZCBzY2hvb2xzLCA5JSBvZiB0aGUgdmFyaWFiaWxpdHkgb2YgcmVhZGluZyBzY29yZXMgaXMgYmV3dGVlbiBzY2hvb2xzIGFuZCA5JSBvZiB0aGUgdmFyaWFiaWxpdHkgaW4gcmVhZGluZyBzY29yZXMgaXMgYmV0d2VlbiBuZWlnaGJvcmhvb2RzLiBXZSBzaG91bGQgcnVuIGNyb3NzZWQgbW9kZWxzLiANCg0KMi4gVXNpbmcgdGhlIG1vZGVsLWJ1aWxkaW5nIGFwcHJvYWNoIG9mIHlvdXIgY2hvaWNlLCBhZGQgYSBzZXJpZXMgb2YgcHJlZGljdG9ycyB0byB0aGUgbW9kZWw6IGF0IHRoZSBzdHVkZW50IGxldmVsLCBhZGQgbW9tZWQgYW5kIGRhZGVkOyBhdCB0aGUgc2Nob29sIGxldmVsLCBhZGQgZGFkb2NjOyBhbmQgYXQgdGhlIG5laWdoYm9yaG9vZCBsZXZlbCwgYWRkIGRlcHJpdmUuIEludGVycHJldCB0aGUgcmVzdWx0cyBhbmQgdXNlIEFJQyBhbmQgQklDIHRvIHNlbGVjdCB0aGUgYmVzdC1maXR0aW5nIG1vZGVsLg0KDQpgYGB7cn0NCm1vZGVsLjEgPC0gbG1lcihwN3JlYWQgfiBtb21lZCArIGRhZGVkICsgKDF8c2NoaWQpICsgKDF8bmVpZ2hpZCksIFJFTUwgPSBGQUxTRSwgZGF0YSA9IHNjb3RsYW5kLmNsZWFuKQ0Kc3VtbWFyeShtb2RlbC4xKQ0KYGBgDQpCb3RoIG9mIHRoZSB2YXJpYWJsZXMgYXJlIHNpZ25pZmljYW50IGFuZCB0aGUgQUlDIGFuZCBCSUMgaGF2ZSBnb25lIGRvd24gc2hvd2luZyB0aGlzIG1vZGVsIHdpdGggaW5kaXZpZHVhbCBsZXZlbCBwcmVkaWN0b3JzIGZpdCBiZXR0ZXIuIEZvciBib3RoIG1vbSBhbmQgZGFkJ3MgaWYgdGhleSBoYXZlIG1vcmUgZWR1Y2F0aW9uIGl0IHByZWRpY3RzIGFuIGluY3JlYXNlIGluIHN0dWRlbnRzIHJlYWRpbmcgc2NvcmVzLiANCg0KYGBge3J9DQptb2RlbC4yIDwtIGxtZXIocDdyZWFkIH4gbW9tZWQgKyBkYWRlZCArIGRhZG9jYyArICgxfHNjaGlkKSArICgxfG5laWdoaWQpLCBSRU1MID0gRkFMU0UsIGRhdGEgPSBzY290bGFuZC5jbGVhbikNCnN1bW1hcnkobW9kZWwuMikNCmBgYA0KQWZ0ZXIgYWRkaW5nIHRoZSBtZWFzdXJlIG9mIGRhZCdzIG9jY3VwYW5jeSBib3RoIEFJQyBhbmQgQklDIGhhdmUgZGVjcmVhc2VkIHNob3dpbmcgYSBncmVhdGVyIG1vZGVsIGZpdC4gRGFkJ3Mgb2NjdXBhbmN5IGlzIHNpZ25pZmljYW50IGFuZCBzaG93cyBhcyBwcmVzdGlnZSBpbmNyZWFzZXMgaXQgcHJlZGljdHMgYSBzbGlnaHQgaW5jcmVhc2UgaW4gcmVhZGluZyBzY29yZXMuIA0KYGBge3J9DQptb2RlbC4zIDwtIGxtZXIocDdyZWFkIH4gbW9tZWQgKyBkYWRlZCArIGRhZG9jYyArIGRlcHJpdmUgKyAoMXxzY2hpZCkgKyAoMXxuZWlnaGlkKSwgUkVNTCA9IEZBTFNFLCBkYXRhID0gc2NvdGxhbmQuY2xlYW4pDQpzdW1tYXJ5KG1vZGVsLjMpDQpgYGANCkJvdGggQUlDIGFuZCBCSUMgaGF2ZSBkZWNyZWFzZWQgc2hvd2luZyB0aGlzIG1vZGVsIGhhcyBiZXR0ZXIgZml0LiBEZXByaXZlIGlzIHNpZ25pZmljYW50IGFsb25nIHdpdGggbW9tZWQsIGRhZGVkLCBkYWRvY2MuIEFuIGluY3JlYXNlIGluIHRoZSBkZXByaXZlIGZhY3RvcnMgaW4gYSBuZWlnaGJvcmhvb2QgcHJlZGljdHMgYSBkZWNyZWFzZSBpbiByZWFkaW5nIHNjb3Jlc3MuIFRoaXMgbW9kZWwgc2hvd3MgdGhlIGJlc3QgZml0LiANCg0KMy4gVGVzdCBhIG1vZGVsIHRoYXQgaW5jbHVkZXMgYW4gaW50ZXJhY3Rpb24gYmV0d2VlbiBtb21lZCBhbmQgZGFkZWQuIEludGVycHJldCB0aGUgcmVzdWx0cyAoeW91IGRvbuKAmXQgbmVlZCB0byB2aXN1YWxpemUpLiBXaGF0IHJlc2VhcmNoIHF1ZXN0aW9uIGlzIHRoaXMgaW50ZXJhY3Rpb24gdGVzdGluZz8NCg0KYGBge3J9DQptb2RlbC40IDwtIGxtZXIocDdyZWFkIH4gbW9tZWQgKyBkYWRlZCArIGRhZG9jYyArIGRlcHJpdmUgKyBtb21lZDpkYWRlZCArICgxfHNjaGlkKSArICgxfG5laWdoaWQpLCBSRU1MID0gRkFMU0UsIGRhdGEgPSBzY290bGFuZC5jbGVhbikNCnN1bW1hcnkobW9kZWwuNCkNCmBgYA0KDQoNClRoZSBpbnRlcmFjdGlvbiBiZXR3ZWVuIG1vbSdzIGVkdWNhdGlvbiBhbmQgZGFkJ3MgZWR1Y2F0aW9uIGlzIHNpZ25pZmljYW50LiBJZiB0aGUgbW9tIGhhcyBhIGxvdyBsZXZlbCBvZiBlZHVjYXRpb24gdGhlbiB0aGUgZGFkJ3MgbGV2ZWwgb2YgZWR1Y2F0aW9uIGhhcyBhIGdyZWF0ZXIgaW1wYWN0IG9uIHN0dWRlbnQncyByZWFkaW5nIHNjb3Jlcy4gVGhlIGludGVyYWN0aW9uIGlzIGFuc3dlcmluZyBhIHJlc2VhcmNoIHF1ZXN0aW9uIGFib3V0IHRoZSBpbXBhY3Qgb2YgbW9tJ3MgZWR1Y2F0aW9uIG9uIHRoZSBpbXBhY3QgZGFkJ3MgZWR1Y2F0aW9uIG1ha2VzIG9uIHN0dWRlbnQncyByZWFkaW5nIHNjb3Jlcy4NCg0KDQoNCg==