Predicting Math Anxiety

Outcome (Numerical): (Math anxiety) score_AMAS_total (Outcome Variable)

Dichotomous Predictor: sex (Covariate)

Multi-categorical Predictor: sample (Moderator)

Predictor 1: (General trait anxiety) score_GAD (Mediator)

Predictor 2: (Math self-concept) score_SDQ_M (Focal Predictor)

Predictor 3: (Neuroticism) score_BFI_N (Covariate)

# install.packages("readr")
# install.packages("psych")
# install.packages("dplyr")
# install.packages("tidyr")
# install.packages("car")
# install.packages("lm.beta")
# install.packages("interactions")
# install.packages("emmeans")
# install.packages("ggeffects")
# install.packages("mediation")
# load the following packages
library(readr)
library(psych)
library(dplyr)
library(tidyr)
library(car)
library(lm.beta)
#library(emmeans)
#library(ggeffects)
library(interactions)
library(mediation)

Descripitive Statisitics

# turn off scientific notation 
options(scipen = 999)
# examine the dataset
AMATUS_dataset_processed
# Data frame

Anxiety_data <- AMATUS_dataset_processed %>% 
  dplyr::select(
  score_AMAS_total,
  sex,
  sample,
  score_GAD,
  score_SDQ_M,
  score_BFI_N
)  %>%
  
  drop_na("score_AMAS_total",
                            "score_GAD",
                            "score_SDQ_M",
                            "score_BFI_N",
                            "sex",
                            "sample") %>%
  
  dplyr::mutate(
    sex_d = dplyr::recode(sex, 'f' = 0,
                        'm' =1),
    ger_stu = if_else(sample == "german_students", 1, 0),
    ger_tea = if_else(sample == "german_teachers", 1, 0),
    bel_tea = if_else(sample == "belgian_teachers", 1, 0),
  )
Anxiety_data$sample <- relevel(as.factor(Anxiety_data$sample), ref = "german_students")
Anxiety_data
describe(Anxiety_data[, c("score_AMAS_total",
                            "score_GAD",
                            "score_SDQ_M",
                            "score_BFI_N",
                            "sex_d",
                            "sample")])
describe(Anxiety_data)
table(Anxiety_data$sex)

  f   m 
820 286 
table(Anxiety_data$sample)

 german_students belgian_teachers  german_teachers 
             848              127              131 
#Bivariate cor. between num. variables.
cor(Anxiety_data$score_AMAS_total, Anxiety_data$score_GAD)
[1] 0.349942
cor(Anxiety_data$score_AMAS_total, Anxiety_data$score_SDQ_M)
[1] -0.6429761
cor(Anxiety_data$score_AMAS_total, Anxiety_data$score_BFI_N)
[1] 0.3432629
prop.table(table(Anxiety_data$sample))*100

 german_students belgian_teachers  german_teachers 
        76.67269         11.48282         11.84448 
prop.table(table(Anxiety_data$sex))*100

       f        m 
74.14105 25.85895 
Anxiety_data %>% 
  group_by(sex) %>%
  summarise(mean_anxiety = mean(score_AMAS_total))
Anxiety_data %>% 
  group_by(sample) %>%
  summarise(mean_anxiety = mean(score_AMAS_total))

Multiple Linear Regressions models

# Multi-categorical predictor model, German student as reference group.

Anxiety_lm_GAD_sex_sample <- lm(score_AMAS_total ~  score_GAD + 
                                      score_SDQ_M + 
                                      score_BFI_N +
                                      sex_d + 
                                      ger_tea + 
                                      bel_tea, 
                 data = Anxiety_data)
summary(Anxiety_lm_GAD_sex_sample)

Call:
lm(formula = score_AMAS_total ~ score_GAD + score_SDQ_M + score_BFI_N + 
    sex_d + ger_tea + bel_tea, data = Anxiety_data)

Residuals:
     Min       1Q   Median       3Q      Max 
-17.2076  -3.4000  -0.3279   3.0469  23.3077 

Coefficients:
            Estimate Std. Error t value             Pr(>|t|)    
(Intercept) 27.23036    0.93261  29.198 < 0.0000000000000002 ***
score_GAD    0.24500    0.04541   5.396         0.0000000836 ***
score_SDQ_M -1.26723    0.04843 -26.168 < 0.0000000000000002 ***
score_BFI_N  0.14165    0.03144   4.505         0.0000073394 ***
sex_d       -1.69373    0.35113  -4.824         0.0000016079 ***
ger_tea      1.28745    0.46584   2.764              0.00581 ** 
bel_tea      0.46216    0.47624   0.970              0.33204    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 4.903 on 1099 degrees of freedom
Multiple R-squared:  0.4943,    Adjusted R-squared:  0.4916 
F-statistic: 179.1 on 6 and 1099 DF,  p-value: < 0.00000000000000022
anova(Anxiety_lm_GAD_sex_sample)
Analysis of Variance Table

Response: score_AMAS_total
              Df  Sum Sq Mean Sq  F value                Pr(>F)    
score_GAD      1  6399.3  6399.3 266.1468 < 0.00000000000000022 ***
score_SDQ_M    1 17865.7 17865.7 743.0358 < 0.00000000000000022 ***
score_BFI_N    1   683.7   683.7  28.4362          0.0000001175 ***
sex_d          1   691.7   691.7  28.7686          0.0000000994 ***
ger_tea        1   168.7   168.7   7.0182              0.008184 ** 
bel_tea        1    22.6    22.6   0.9417              0.332044    
Residuals   1099 26424.6    24.0                                   
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
lm.beta(Anxiety_lm_GAD_sex_sample)

Call:
lm(formula = score_AMAS_total ~ score_GAD + score_SDQ_M + score_BFI_N + 
    sex_d + ger_tea + bel_tea, data = Anxiety_data)

Standardized Coefficients::
(Intercept)   score_GAD score_SDQ_M score_BFI_N       sex_d     ger_tea     bel_tea 
         NA  0.14747323 -0.57697605  0.12464582 -0.10789144  0.06052326  0.02143577 
# Model without focal predictor

Anxiety_lm_sex_sample <- lm(score_AMAS_total ~ score_GAD + 
                              score_BFI_N+ 
                              sex_d + 
                              ger_tea + 
                              bel_tea, 
                 data = Anxiety_data)

summary(Anxiety_lm_sex_sample)

Call:
lm(formula = score_AMAS_total ~ score_GAD + score_BFI_N + sex_d + 
    ger_tea + bel_tea, data = Anxiety_data)

Residuals:
     Min       1Q   Median       3Q      Max 
-16.4700  -4.6780  -0.7561   4.1943  24.3665 

Coefficients:
            Estimate Std. Error t value             Pr(>|t|)    
(Intercept)  9.90479    0.83640  11.842 < 0.0000000000000002 ***
score_GAD    0.37458    0.05748   6.517       0.000000000109 ***
score_BFI_N  0.20359    0.03992   5.099       0.000000401321 ***
sex_d       -2.37219    0.44592  -5.320       0.000000125792 ***
ger_tea      1.32295    0.59321   2.230               0.0259 *  
bel_tea      0.52973    0.60645   0.874               0.3826    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 6.244 on 1100 degrees of freedom
Multiple R-squared:  0.1793,    Adjusted R-squared:  0.1755 
F-statistic: 48.05 on 5 and 1100 DF,  p-value: < 0.00000000000000022
summary(Anxiety_lm_GAD_sex_sample)$r.squared - summary(Anxiety_lm_sex_sample)$r.squared 
[1] 0.3150722
anova(Anxiety_lm_GAD_sex_sample, Anxiety_lm_sex_sample)
Analysis of Variance Table

Model 1: score_AMAS_total ~ score_GAD + score_SDQ_M + score_BFI_N + sex_d + 
    ger_tea + bel_tea
Model 2: score_AMAS_total ~ score_GAD + score_BFI_N + sex_d + ger_tea + 
    bel_tea
  Res.Df   RSS Df Sum of Sq      F                Pr(>F)    
1   1099 26425                                              
2   1100 42889 -1    -16465 684.76 < 0.00000000000000022 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Nonlinear

# Quadratic Model with squared score
# Math self-concept

Anxiety_lm_GAD_sex_sample_quad <- lm(score_AMAS_total ~ score_SDQ_M + I(score_SDQ_M^2) +
                                      score_GAD + 
                                      score_BFI_N + 
                                      sex_d + 
                                      ger_tea + 
                                      bel_tea, 
                 data = Anxiety_data)



summary(Anxiety_lm_GAD_sex_sample_quad)

Call:
lm(formula = score_AMAS_total ~ score_SDQ_M + I(score_SDQ_M^2) + 
    score_GAD + score_BFI_N + sex_d + ger_tea + bel_tea, data = Anxiety_data)

Residuals:
     Min       1Q   Median       3Q      Max 
-16.8534  -3.4056  -0.3035   3.0707  23.1467 

Coefficients:
                 Estimate Std. Error t value             Pr(>|t|)    
(Intercept)      25.51715    1.80617  14.128 < 0.0000000000000002 ***
score_SDQ_M      -0.92319    0.31438  -2.937              0.00339 ** 
I(score_SDQ_M^2) -0.01585    0.01431  -1.108              0.26829    
score_GAD         0.24765    0.04547   5.447         0.0000000632 ***
score_BFI_N       0.14071    0.03145   4.474         0.0000084766 ***
sex_d            -1.70638    0.35128  -4.858         0.0000013604 ***
ger_tea           1.26188    0.46636   2.706              0.00692 ** 
bel_tea           0.45788    0.47621   0.962              0.33651    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 4.903 on 1098 degrees of freedom
Multiple R-squared:  0.4949,    Adjusted R-squared:  0.4917 
F-statistic: 153.7 on 7 and 1098 DF,  p-value: < 0.00000000000000022
summary(Anxiety_lm_GAD_sex_sample_quad)$r.squared - summary(Anxiety_lm_GAD_sex_sample)$r.squared
[1] 0.0005643132
anova(Anxiety_lm_GAD_sex_sample ,Anxiety_lm_GAD_sex_sample_quad)
Analysis of Variance Table

Model 1: score_AMAS_total ~ score_GAD + score_SDQ_M + score_BFI_N + sex_d + 
    ger_tea + bel_tea
Model 2: score_AMAS_total ~ score_SDQ_M + I(score_SDQ_M^2) + score_GAD + 
    score_BFI_N + sex_d + ger_tea + bel_tea
  Res.Df   RSS Df Sum of Sq      F Pr(>F)
1   1099 26425                           
2   1098 26395  1    29.489 1.2267 0.2683

Moderation

#
#

Anxiety_lm_GAD_sex_sample_mod <- lm(score_AMAS_total ~ score_SDQ_M +
                                      score_GAD + 
                                      score_BFI_N + 
                                      sex_d + 
                                      sample +
                                      score_SDQ_M*sample, 
                 data = Anxiety_data)

summary(Anxiety_lm_GAD_sex_sample_mod)

Call:
lm(formula = score_AMAS_total ~ score_SDQ_M + score_GAD + score_BFI_N + 
    sex_d + sample + score_SDQ_M * sample, data = Anxiety_data)

Residuals:
     Min       1Q   Median       3Q      Max 
-17.2146  -3.3878  -0.3429   3.1310  23.3755 

Coefficients:
                                   Estimate Std. Error t value             Pr(>|t|)    
(Intercept)                        26.67077    0.97209  27.436 < 0.0000000000000002 ***
score_SDQ_M                        -1.21727    0.05455 -22.316 < 0.0000000000000002 ***
score_GAD                           0.24611    0.04539   5.422         0.0000000726 ***
score_BFI_N                         0.14078    0.03141   4.482         0.0000081837 ***
sex_d                              -1.70208    0.35087  -4.851         0.0000014059 ***
samplebelgian_teachers              3.57646    1.69805   2.106               0.0354 *  
samplegerman_teachers               3.08981    1.82727   1.691               0.0911 .  
score_SDQ_M:samplebelgian_teachers -0.27873    0.14605  -1.908               0.0566 .  
score_SDQ_M:samplegerman_teachers  -0.15911    0.15616  -1.019               0.3085    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 4.898 on 1097 degrees of freedom
Multiple R-squared:  0.4963,    Adjusted R-squared:  0.4926 
F-statistic: 135.1 on 8 and 1097 DF,  p-value: < 0.00000000000000022
summary(Anxiety_lm_GAD_sex_sample_mod)$r.squared - summary(Anxiety_lm_GAD_sex_sample)$r.squared
[1] 0.001957103
anova(Anxiety_lm_GAD_sex_sample ,Anxiety_lm_GAD_sex_sample_mod)
Analysis of Variance Table

Model 1: score_AMAS_total ~ score_GAD + score_SDQ_M + score_BFI_N + sex_d + 
    ger_tea + bel_tea
Model 2: score_AMAS_total ~ score_SDQ_M + score_GAD + score_BFI_N + sex_d + 
    sample + score_SDQ_M * sample
  Res.Df   RSS Df Sum of Sq      F Pr(>F)
1   1099 26425                           
2   1097 26322  2    102.27 2.1311 0.1192
sim_slopes(Anxiety_lm_GAD_sex_sample_mod, 
           pred = score_SDQ_M, 
           modx = sample)
SIMPLE SLOPES ANALYSIS

Slope of score_SDQ_M when sample = german_students: 

   Est.   S.E.   t val.      p
------- ------ -------- ------
  -1.22   0.05   -22.32   0.00

Slope of score_SDQ_M when sample = belgian_teachers: 

   Est.   S.E.   t val.      p
------- ------ -------- ------
  -1.50   0.14   -10.98   0.00

Slope of score_SDQ_M when sample = german_teachers: 

   Est.   S.E.   t val.      p
------- ------ -------- ------
  -1.38   0.15    -9.34   0.00
interact_plot(Anxiety_lm_GAD_sex_sample_mod, 
           pred = score_SDQ_M, 
           modx = sample,
           interval = TRUE)

Mediation

# Outcome Variable:score_AMAS_total (Math anxiety) 
# Mediator: score_GAD (General trait anxiety)
# Focal Predictor: score_SDQ_M (Math self-concept)
# Moderator: sample
# Covariate: score_BFI_N (Neuroticism) 
# Covariate: sex
Anxiety_lm_TE <- lm(score_AMAS_total ~ score_SDQ_M + 
                                      score_BFI_N +
                                      sex_d + 
                                      ger_tea + 
                                      bel_tea, 
                 data = Anxiety_data)

Anxiety_lm_TE

Call:
lm(formula = score_AMAS_total ~ score_SDQ_M + score_BFI_N + sex_d + 
    ger_tea + bel_tea, data = Anxiety_data)

Coefficients:
(Intercept)  score_SDQ_M  score_BFI_N        sex_d      ger_tea      bel_tea  
    28.2663      -1.2957       0.2414      -1.5992       1.3309       0.8816  
summary(Anxiety_lm_TE)

Call:
lm(formula = score_AMAS_total ~ score_SDQ_M + score_BFI_N + sex_d + 
    ger_tea + bel_tea, data = Anxiety_data)

Residuals:
     Min       1Q   Median       3Q      Max 
-16.5668  -3.4082  -0.3589   3.2188  25.0138 

Coefficients:
            Estimate Std. Error t value             Pr(>|t|)    
(Intercept) 28.26634    0.92422  30.584 < 0.0000000000000002 ***
score_SDQ_M -1.29572    0.04875 -26.579 < 0.0000000000000002 ***
score_BFI_N  0.24140    0.02576   9.373 < 0.0000000000000002 ***
sex_d       -1.59925    0.35515  -4.503           0.00000741 ***
ger_tea      1.33094    0.47169   2.822              0.00486 ** 
bel_tea      0.88159    0.47582   1.853              0.06418 .  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 4.966 on 1100 degrees of freedom
Multiple R-squared:  0.4809,    Adjusted R-squared:  0.4786 
F-statistic: 203.8 on 5 and 1100 DF,  p-value: < 0.00000000000000022
Anxiety_lm_DE <- lm(score_AMAS_total ~ score_GAD+ 
                                      score_SDQ_M + 
                                      score_BFI_N +
                                      sex_d + 
                                      ger_tea + 
                                      bel_tea, 
                 data = Anxiety_data)

Anxiety_lm_DE

Call:
lm(formula = score_AMAS_total ~ score_GAD + score_SDQ_M + score_BFI_N + 
    sex_d + ger_tea + bel_tea, data = Anxiety_data)

Coefficients:
(Intercept)    score_GAD  score_SDQ_M  score_BFI_N        sex_d      ger_tea      bel_tea  
    27.2304       0.2450      -1.2672       0.1417      -1.6937       1.2875       0.4622  
summary(Anxiety_lm_DE)

Call:
lm(formula = score_AMAS_total ~ score_GAD + score_SDQ_M + score_BFI_N + 
    sex_d + ger_tea + bel_tea, data = Anxiety_data)

Residuals:
     Min       1Q   Median       3Q      Max 
-17.2076  -3.4000  -0.3279   3.0469  23.3077 

Coefficients:
            Estimate Std. Error t value             Pr(>|t|)    
(Intercept) 27.23036    0.93261  29.198 < 0.0000000000000002 ***
score_GAD    0.24500    0.04541   5.396         0.0000000836 ***
score_SDQ_M -1.26723    0.04843 -26.168 < 0.0000000000000002 ***
score_BFI_N  0.14165    0.03144   4.505         0.0000073394 ***
sex_d       -1.69373    0.35113  -4.824         0.0000016079 ***
ger_tea      1.28745    0.46584   2.764              0.00581 ** 
bel_tea      0.46216    0.47624   0.970              0.33204    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 4.903 on 1099 degrees of freedom
Multiple R-squared:  0.4943,    Adjusted R-squared:  0.4916 
F-statistic: 179.1 on 6 and 1099 DF,  p-value: < 0.00000000000000022
GAD_lm_SDQ <- lm(score_GAD ~ +  score_SDQ_M + 
                                      score_BFI_N +
                                      sex_d + 
                                      ger_tea + 
                                      bel_tea, 
                 data = Anxiety_data)

GAD_lm_SDQ

Call:
lm(formula = score_GAD ~ +score_SDQ_M + score_BFI_N + sex_d + 
    ger_tea + bel_tea, data = Anxiety_data)

Coefficients:
(Intercept)  score_SDQ_M  score_BFI_N        sex_d      ger_tea      bel_tea  
     4.2285      -0.1163       0.4071       0.3856       0.1775       1.7120  
summary(GAD_lm_SDQ)

Call:
lm(formula = score_GAD ~ +score_SDQ_M + score_BFI_N + sex_d + 
    ger_tea + bel_tea, data = Anxiety_data)

Residuals:
    Min      1Q  Median      3Q     Max 
-7.4540 -2.1361 -0.4019  1.6516 13.0460 

Coefficients:
            Estimate Std. Error t value             Pr(>|t|)    
(Intercept)  4.22848    0.60601   6.978     0.00000000000518 ***
score_SDQ_M -0.11631    0.03196  -3.639             0.000287 ***
score_BFI_N  0.40713    0.01689  24.108 < 0.0000000000000002 ***
sex_d        0.38565    0.23287   1.656             0.097995 .  
ger_tea      0.17748    0.30928   0.574             0.566200    
bel_tea      1.71196    0.31200   5.487     0.00000005068829 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 3.256 on 1100 degrees of freedom
Multiple R-squared:  0.3841,    Adjusted R-squared:  0.3813 
F-statistic: 137.2 on 5 and 1100 DF,  p-value: < 0.00000000000000022
Anxiety_mediation <- mediate(model.m = GAD_lm_SDQ,
                          model.y = Anxiety_lm_DE,
                          treat = "score_SDQ_M",
                          mediator = "score_GAD",
                          boot = TRUE,
                          sims = 1000)
summary(Anxiety_mediation) 

Causal Mediation Analysis 

Nonparametric Bootstrap Confidence Intervals with the Percentile Method

                 Estimate 95% CI Lower 95% CI Upper               p-value    
ACME           -0.0284949   -0.0528058   -0.0103261 < 0.00000000000000022 ***
ADE            -1.2672256   -1.3690575   -1.1687130 < 0.00000000000000022 ***
Total Effect   -1.2957205   -1.3957466   -1.1960217 < 0.00000000000000022 ***
Prop. Mediated  0.0219915    0.0078397    0.0412136 < 0.00000000000000022 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Sample Size Used: 1106 


Simulations: 1000 

Regression Diagnostics

Anxiety_lm_diag <-Anxiety_data %>%
  mutate(
    Anxiety_pred = fitted(Anxiety_lm_GAD_sex_sample),
    res = residuals(Anxiety_lm_GAD_sex_sample),
    h = hatvalues(Anxiety_lm_GAD_sex_sample),
    tres = rstudent(Anxiety_lm_GAD_sex_sample),
    Cook = cooks.distance(Anxiety_lm_GAD_sex_sample),
    DB_b0 = influence(Anxiety_lm_GAD_sex_sample)$coef[, 1],
    DB_GAD = influence(Anxiety_lm_GAD_sex_sample)$coef[, 2],
    DB_SDQ = influence(Anxiety_lm_GAD_sex_sample)$coef[, 3],
    DB_BFI = influence(Anxiety_lm_GAD_sex_sample)$coef[, 4],
    DB_sex = influence(Anxiety_lm_GAD_sex_sample)$coef[, 5],
    DB_ger_tea = influence(Anxiety_lm_GAD_sex_sample)$coef[, 6],
    DB_bel_tea = influence(Anxiety_lm_GAD_sex_sample)$coef[, 7]
  )


Anxiety_lm_diag
residualPlots(Anxiety_lm_GAD_sex_sample)
            Test stat Pr(>|Test stat|)
score_GAD     -0.7358           0.4620
score_SDQ_M   -1.1076           0.2683
score_BFI_N   -0.8373           0.4026
sex_d         -0.9117           0.3621
ger_tea        0.3200           0.7490
bel_tea       -1.0502           0.2939
Tukey test     0.3533           0.7239

qqPlot(Anxiety_lm_GAD_sex_sample)
[1]  78 736

outlierTest(Anxiety_lm_GAD_sex_sample)
LS0tDQp0aXRsZTogIlIgTm90ZWJvb2siDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KUHJlZGljdGluZyBNYXRoIEFueGlldHkNCg0KT3V0Y29tZSAoTnVtZXJpY2FsKTogKE1hdGggYW54aWV0eSkgc2NvcmVfQU1BU190b3RhbCAoT3V0Y29tZSBWYXJpYWJsZSkNCg0KRGljaG90b21vdXMgUHJlZGljdG9yOiBzZXggKENvdmFyaWF0ZSkNCg0KTXVsdGktY2F0ZWdvcmljYWwgUHJlZGljdG9yOiBzYW1wbGUgKE1vZGVyYXRvcikNCg0KUHJlZGljdG9yIDE6IChHZW5lcmFsIHRyYWl0IGFueGlldHkpIHNjb3JlX0dBRCAoTWVkaWF0b3IpDQoNClByZWRpY3RvciAyOiAoTWF0aCBzZWxmLWNvbmNlcHQpIHNjb3JlX1NEUV9NIChGb2NhbCBQcmVkaWN0b3IpDQoNClByZWRpY3RvciAzOiAoTmV1cm90aWNpc20pIHNjb3JlX0JGSV9OIChDb3ZhcmlhdGUpDQoNCg0KYGBge3J9DQojIGluc3RhbGwucGFja2FnZXMoInJlYWRyIikNCiMgaW5zdGFsbC5wYWNrYWdlcygicHN5Y2giKQ0KIyBpbnN0YWxsLnBhY2thZ2VzKCJkcGx5ciIpDQojIGluc3RhbGwucGFja2FnZXMoInRpZHlyIikNCiMgaW5zdGFsbC5wYWNrYWdlcygiY2FyIikNCiMgaW5zdGFsbC5wYWNrYWdlcygibG0uYmV0YSIpDQojIGluc3RhbGwucGFja2FnZXMoImludGVyYWN0aW9ucyIpDQojIGluc3RhbGwucGFja2FnZXMoImVtbWVhbnMiKQ0KIyBpbnN0YWxsLnBhY2thZ2VzKCJnZ2VmZmVjdHMiKQ0KIyBpbnN0YWxsLnBhY2thZ2VzKCJtZWRpYXRpb24iKQ0KDQpgYGANCg0KYGBge3J9DQojIGxvYWQgdGhlIGZvbGxvd2luZyBwYWNrYWdlcw0KbGlicmFyeShyZWFkcikNCmxpYnJhcnkocHN5Y2gpDQpsaWJyYXJ5KGRwbHlyKQ0KbGlicmFyeSh0aWR5cikNCmxpYnJhcnkoY2FyKQ0KbGlicmFyeShsbS5iZXRhKQ0KI2xpYnJhcnkoZW1tZWFucykNCiNsaWJyYXJ5KGdnZWZmZWN0cykNCmxpYnJhcnkoaW50ZXJhY3Rpb25zKQ0KbGlicmFyeShtZWRpYXRpb24pDQpgYGANCg0KRGVzY3JpcGl0aXZlIFN0YXRpc2l0aWNzDQoNCmBgYHtyfQ0KIyB0dXJuIG9mZiBzY2llbnRpZmljIG5vdGF0aW9uIA0Kb3B0aW9ucyhzY2lwZW4gPSA5OTkpDQpgYGANCg0KYGBge3J9DQojIGV4YW1pbmUgdGhlIGRhdGFzZXQNCkFNQVRVU19kYXRhc2V0X3Byb2Nlc3NlZA0KYGBgDQpgYGB7cn0NCiMgRGF0YSBmcmFtZQ0KDQpBbnhpZXR5X2RhdGEgPC0gQU1BVFVTX2RhdGFzZXRfcHJvY2Vzc2VkICU+JSANCiAgZHBseXI6OnNlbGVjdCgNCiAgc2NvcmVfQU1BU190b3RhbCwNCiAgc2V4LA0KICBzYW1wbGUsDQogIHNjb3JlX0dBRCwNCiAgc2NvcmVfU0RRX00sDQogIHNjb3JlX0JGSV9ODQopICAlPiUNCiAgDQogIGRyb3BfbmEoInNjb3JlX0FNQVNfdG90YWwiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzY29yZV9HQUQiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzY29yZV9TRFFfTSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgInNjb3JlX0JGSV9OIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2V4IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2FtcGxlIikgJT4lDQogIA0KICBkcGx5cjo6bXV0YXRlKA0KICAgIHNleF9kID0gZHBseXI6OnJlY29kZShzZXgsICdmJyA9IDAsDQogICAgICAgICAgICAgICAgICAgICAgICAnbScgPTEpLA0KICAgIGdlcl9zdHUgPSBpZl9lbHNlKHNhbXBsZSA9PSAiZ2VybWFuX3N0dWRlbnRzIiwgMSwgMCksDQogICAgZ2VyX3RlYSA9IGlmX2Vsc2Uoc2FtcGxlID09ICJnZXJtYW5fdGVhY2hlcnMiLCAxLCAwKSwNCiAgICBiZWxfdGVhID0gaWZfZWxzZShzYW1wbGUgPT0gImJlbGdpYW5fdGVhY2hlcnMiLCAxLCAwKSwNCiAgKQ0KQW54aWV0eV9kYXRhJHNhbXBsZSA8LSByZWxldmVsKGFzLmZhY3RvcihBbnhpZXR5X2RhdGEkc2FtcGxlKSwgcmVmID0gImdlcm1hbl9zdHVkZW50cyIpDQoNCkFueGlldHlfZGF0YQ0KYGBgDQoNCmBgYHtyfQ0KZGVzY3JpYmUoQW54aWV0eV9kYXRhWywgYygic2NvcmVfQU1BU190b3RhbCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgInNjb3JlX0dBRCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgInNjb3JlX1NEUV9NIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2NvcmVfQkZJX04iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzZXhfZCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgInNhbXBsZSIpXSkNCmBgYA0KYGBge3J9DQpkZXNjcmliZShBbnhpZXR5X2RhdGEpDQpgYGANCg0KYGBge3J9DQp0YWJsZShBbnhpZXR5X2RhdGEkc2V4KQ0KYGBgDQoNCg0KDQpgYGB7cn0NCnRhYmxlKEFueGlldHlfZGF0YSRzYW1wbGUpDQpgYGANCmBgYHtyfQ0KI0JpdmFyaWF0ZSBjb3IuIGJldHdlZW4gbnVtLiB2YXJpYWJsZXMuDQpjb3IoQW54aWV0eV9kYXRhJHNjb3JlX0FNQVNfdG90YWwsIEFueGlldHlfZGF0YSRzY29yZV9HQUQpDQoNCmNvcihBbnhpZXR5X2RhdGEkc2NvcmVfQU1BU190b3RhbCwgQW54aWV0eV9kYXRhJHNjb3JlX1NEUV9NKQ0KDQpjb3IoQW54aWV0eV9kYXRhJHNjb3JlX0FNQVNfdG90YWwsIEFueGlldHlfZGF0YSRzY29yZV9CRklfTikNCmBgYA0KYGBge3J9DQpwcm9wLnRhYmxlKHRhYmxlKEFueGlldHlfZGF0YSRzYW1wbGUpKSoxMDANCmBgYA0KYGBge3J9DQpwcm9wLnRhYmxlKHRhYmxlKEFueGlldHlfZGF0YSRzZXgpKSoxMDANCmBgYA0KYGBge3J9DQpBbnhpZXR5X2RhdGEgJT4lIA0KICBncm91cF9ieShzZXgpICU+JQ0KICBzdW1tYXJpc2UobWVhbl9hbnhpZXR5ID0gbWVhbihzY29yZV9BTUFTX3RvdGFsKSkNCmBgYA0KYGBge3J9DQpBbnhpZXR5X2RhdGEgJT4lIA0KICBncm91cF9ieShzYW1wbGUpICU+JQ0KICBzdW1tYXJpc2UobWVhbl9hbnhpZXR5ID0gbWVhbihzY29yZV9BTUFTX3RvdGFsKSkNCmBgYA0KDQoNCk11bHRpcGxlIExpbmVhciBSZWdyZXNzaW9ucyBtb2RlbHMNCg0KDQpgYGB7cn0NCiMgTXVsdGktY2F0ZWdvcmljYWwgcHJlZGljdG9yIG1vZGVsLCBHZXJtYW4gc3R1ZGVudCBhcyByZWZlcmVuY2UgZ3JvdXAuDQoNCkFueGlldHlfbG1fR0FEX3NleF9zYW1wbGUgPC0gbG0oc2NvcmVfQU1BU190b3RhbCB+ICBzY29yZV9HQUQgKyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NvcmVfU0RRX00gKyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NvcmVfQkZJX04gKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXhfZCArIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXJfdGVhICsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlbF90ZWEsIA0KICAgICAgICAgICAgICAgICBkYXRhID0gQW54aWV0eV9kYXRhKQ0KYGBgDQoNCmBgYHtyfQ0Kc3VtbWFyeShBbnhpZXR5X2xtX0dBRF9zZXhfc2FtcGxlKQ0KYGBgDQoNCmBgYHtyfQ0KYW5vdmEoQW54aWV0eV9sbV9HQURfc2V4X3NhbXBsZSkNCmBgYA0KDQpgYGB7cn0NCmxtLmJldGEoQW54aWV0eV9sbV9HQURfc2V4X3NhbXBsZSkNCmBgYA0KDQpgYGB7cn0NCiMgTW9kZWwgd2l0aG91dCBmb2NhbCBwcmVkaWN0b3INCg0KQW54aWV0eV9sbV9zZXhfc2FtcGxlIDwtIGxtKHNjb3JlX0FNQVNfdG90YWwgfiBzY29yZV9HQUQgKyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjb3JlX0JGSV9OKyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNleF9kICsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXJfdGVhICsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZWxfdGVhLCANCiAgICAgICAgICAgICAgICAgZGF0YSA9IEFueGlldHlfZGF0YSkNCg0Kc3VtbWFyeShBbnhpZXR5X2xtX3NleF9zYW1wbGUpDQpgYGANCg0KYGBge3J9DQpzdW1tYXJ5KEFueGlldHlfbG1fR0FEX3NleF9zYW1wbGUpJHIuc3F1YXJlZCAtIHN1bW1hcnkoQW54aWV0eV9sbV9zZXhfc2FtcGxlKSRyLnNxdWFyZWQgDQpgYGANCg0KYGBge3J9DQphbm92YShBbnhpZXR5X2xtX0dBRF9zZXhfc2FtcGxlLCBBbnhpZXR5X2xtX3NleF9zYW1wbGUpDQpgYGANCk5vbmxpbmVhcg0KDQpgYGB7cn0NCiMgUXVhZHJhdGljIE1vZGVsIHdpdGggc3F1YXJlZCBzY29yZQ0KIyBNYXRoIHNlbGYtY29uY2VwdA0KDQpBbnhpZXR5X2xtX0dBRF9zZXhfc2FtcGxlX3F1YWQgPC0gbG0oc2NvcmVfQU1BU190b3RhbCB+IHNjb3JlX1NEUV9NICsgSShzY29yZV9TRFFfTV4yKSArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjb3JlX0dBRCArIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY29yZV9CRklfTiArIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXhfZCArIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXJfdGVhICsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlbF90ZWEsIA0KICAgICAgICAgICAgICAgICBkYXRhID0gQW54aWV0eV9kYXRhKQ0KDQoNCg0Kc3VtbWFyeShBbnhpZXR5X2xtX0dBRF9zZXhfc2FtcGxlX3F1YWQpDQoNCmBgYA0KDQpgYGB7cn0NCnN1bW1hcnkoQW54aWV0eV9sbV9HQURfc2V4X3NhbXBsZV9xdWFkKSRyLnNxdWFyZWQgLSBzdW1tYXJ5KEFueGlldHlfbG1fR0FEX3NleF9zYW1wbGUpJHIuc3F1YXJlZA0KYGBgDQpgYGB7cn0NCmFub3ZhKEFueGlldHlfbG1fR0FEX3NleF9zYW1wbGUgLEFueGlldHlfbG1fR0FEX3NleF9zYW1wbGVfcXVhZCkNCmBgYA0KTW9kZXJhdGlvbg0KDQpgYGB7cn0NCiMNCiMNCg0KQW54aWV0eV9sbV9HQURfc2V4X3NhbXBsZV9tb2QgPC0gbG0oc2NvcmVfQU1BU190b3RhbCB+IHNjb3JlX1NEUV9NICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NvcmVfR0FEICsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjb3JlX0JGSV9OICsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNleF9kICsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZSArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjb3JlX1NEUV9NKnNhbXBsZSwgDQogICAgICAgICAgICAgICAgIGRhdGEgPSBBbnhpZXR5X2RhdGEpDQoNCnN1bW1hcnkoQW54aWV0eV9sbV9HQURfc2V4X3NhbXBsZV9tb2QpDQpgYGANCg0KYGBge3J9DQpzdW1tYXJ5KEFueGlldHlfbG1fR0FEX3NleF9zYW1wbGVfbW9kKSRyLnNxdWFyZWQgLSBzdW1tYXJ5KEFueGlldHlfbG1fR0FEX3NleF9zYW1wbGUpJHIuc3F1YXJlZA0KYGBgDQoNCmBgYHtyfQ0KYW5vdmEoQW54aWV0eV9sbV9HQURfc2V4X3NhbXBsZSAsQW54aWV0eV9sbV9HQURfc2V4X3NhbXBsZV9tb2QpDQpgYGANCg0KYGBge3J9DQpzaW1fc2xvcGVzKEFueGlldHlfbG1fR0FEX3NleF9zYW1wbGVfbW9kLCANCiAgICAgICAgICAgcHJlZCA9IHNjb3JlX1NEUV9NLCANCiAgICAgICAgICAgbW9keCA9IHNhbXBsZSkNCmBgYA0KDQpgYGB7cn0NCmludGVyYWN0X3Bsb3QoQW54aWV0eV9sbV9HQURfc2V4X3NhbXBsZV9tb2QsIA0KICAgICAgICAgICBwcmVkID0gc2NvcmVfU0RRX00sIA0KICAgICAgICAgICBtb2R4ID0gc2FtcGxlLA0KICAgICAgICAgICBpbnRlcnZhbCA9IFRSVUUpDQpgYGANCk1lZGlhdGlvbg0KDQpgYGB7cn0NCiMgT3V0Y29tZSBWYXJpYWJsZTpzY29yZV9BTUFTX3RvdGFsIChNYXRoIGFueGlldHkpIA0KIyBNZWRpYXRvcjogc2NvcmVfR0FEIChHZW5lcmFsIHRyYWl0IGFueGlldHkpDQojIEZvY2FsIFByZWRpY3Rvcjogc2NvcmVfU0RRX00gKE1hdGggc2VsZi1jb25jZXB0KQ0KIyBNb2RlcmF0b3I6IHNhbXBsZQ0KIyBDb3ZhcmlhdGU6IHNjb3JlX0JGSV9OIChOZXVyb3RpY2lzbSkgDQojIENvdmFyaWF0ZTogc2V4DQoNCmBgYA0KDQpgYGB7cn0NCkFueGlldHlfbG1fVEUgPC0gbG0oc2NvcmVfQU1BU190b3RhbCB+IHNjb3JlX1NEUV9NICsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjb3JlX0JGSV9OICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V4X2QgKyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VyX3RlYSArIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZWxfdGVhLCANCiAgICAgICAgICAgICAgICAgZGF0YSA9IEFueGlldHlfZGF0YSkNCg0KQW54aWV0eV9sbV9URQ0KYGBgDQpgYGB7cn0NCnN1bW1hcnkoQW54aWV0eV9sbV9URSkNCmBgYA0KDQpgYGB7cn0NCkFueGlldHlfbG1fREUgPC0gbG0oc2NvcmVfQU1BU190b3RhbCB+IHNjb3JlX0dBRCsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjb3JlX1NEUV9NICsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjb3JlX0JGSV9OICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V4X2QgKyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VyX3RlYSArIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZWxfdGVhLCANCiAgICAgICAgICAgICAgICAgZGF0YSA9IEFueGlldHlfZGF0YSkNCg0KQW54aWV0eV9sbV9ERQ0KYGBgDQpgYGB7cn0NCnN1bW1hcnkoQW54aWV0eV9sbV9ERSkNCmBgYA0KDQpgYGB7cn0NCkdBRF9sbV9TRFEgPC0gbG0oc2NvcmVfR0FEIH4gKyAgc2NvcmVfU0RRX00gKyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NvcmVfQkZJX04gKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXhfZCArIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXJfdGVhICsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlbF90ZWEsIA0KICAgICAgICAgICAgICAgICBkYXRhID0gQW54aWV0eV9kYXRhKQ0KDQpHQURfbG1fU0RRDQpgYGANCg0KYGBge3J9DQpzdW1tYXJ5KEdBRF9sbV9TRFEpDQpgYGANCg0KDQpgYGB7cn0NCkFueGlldHlfbWVkaWF0aW9uIDwtIG1lZGlhdGUobW9kZWwubSA9IEdBRF9sbV9TRFEsDQogICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsLnkgPSBBbnhpZXR5X2xtX0RFLA0KICAgICAgICAgICAgICAgICAgICAgICAgICB0cmVhdCA9ICJzY29yZV9TRFFfTSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhdG9yID0gInNjb3JlX0dBRCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgIGJvb3QgPSBUUlVFLA0KICAgICAgICAgICAgICAgICAgICAgICAgICBzaW1zID0gMTAwMCkNCg0KYGBgDQoNCmBgYHtyfQ0Kc3VtbWFyeShBbnhpZXR5X21lZGlhdGlvbikgDQpgYGANClJlZ3Jlc3Npb24gRGlhZ25vc3RpY3MNCg0KDQpgYGB7cn0NCkFueGlldHlfbG1fZGlhZyA8LUFueGlldHlfZGF0YSAlPiUNCiAgbXV0YXRlKA0KICAgIEFueGlldHlfcHJlZCA9IGZpdHRlZChBbnhpZXR5X2xtX0dBRF9zZXhfc2FtcGxlKSwNCiAgICByZXMgPSByZXNpZHVhbHMoQW54aWV0eV9sbV9HQURfc2V4X3NhbXBsZSksDQogICAgaCA9IGhhdHZhbHVlcyhBbnhpZXR5X2xtX0dBRF9zZXhfc2FtcGxlKSwNCiAgICB0cmVzID0gcnN0dWRlbnQoQW54aWV0eV9sbV9HQURfc2V4X3NhbXBsZSksDQogICAgQ29vayA9IGNvb2tzLmRpc3RhbmNlKEFueGlldHlfbG1fR0FEX3NleF9zYW1wbGUpLA0KICAgIERCX2IwID0gaW5mbHVlbmNlKEFueGlldHlfbG1fR0FEX3NleF9zYW1wbGUpJGNvZWZbLCAxXSwNCiAgICBEQl9HQUQgPSBpbmZsdWVuY2UoQW54aWV0eV9sbV9HQURfc2V4X3NhbXBsZSkkY29lZlssIDJdLA0KICAgIERCX1NEUSA9IGluZmx1ZW5jZShBbnhpZXR5X2xtX0dBRF9zZXhfc2FtcGxlKSRjb2VmWywgM10sDQogICAgREJfQkZJID0gaW5mbHVlbmNlKEFueGlldHlfbG1fR0FEX3NleF9zYW1wbGUpJGNvZWZbLCA0XSwNCiAgICBEQl9zZXggPSBpbmZsdWVuY2UoQW54aWV0eV9sbV9HQURfc2V4X3NhbXBsZSkkY29lZlssIDVdLA0KICAgIERCX2dlcl90ZWEgPSBpbmZsdWVuY2UoQW54aWV0eV9sbV9HQURfc2V4X3NhbXBsZSkkY29lZlssIDZdLA0KICAgIERCX2JlbF90ZWEgPSBpbmZsdWVuY2UoQW54aWV0eV9sbV9HQURfc2V4X3NhbXBsZSkkY29lZlssIDddDQogICkNCg0KDQpBbnhpZXR5X2xtX2RpYWcNCmBgYA0KDQoNCmBgYHtyfQ0KcmVzaWR1YWxQbG90cyhBbnhpZXR5X2xtX0dBRF9zZXhfc2FtcGxlKQ0KYGBgDQpgYGB7cn0NCnFxUGxvdChBbnhpZXR5X2xtX0dBRF9zZXhfc2FtcGxlKQ0KYGBgDQpgYGB7cn0NCm91dGxpZXJUZXN0KEFueGlldHlfbG1fR0FEX3NleF9zYW1wbGUpDQpgYGANCg0KDQo=