How to use this document. Run the code along with me. Comments start with #. Each section mirrors the live lab; code chunks show the command and its output together.

Today’s plan

  1. Clean environment + setup
  2. Import & understand Life Expectancy data
  3. Working with categorical variables
  4. One-sample t-test (Life Expectancy)
  5. Two-sample t-test (Developed vs. Developing)
  6. Quick practice
  7. Wrap-up

1 Clean Environment + Setup

rm(list = ls())   # clean environment

# Load the packages
library(dplyr)
library(ggplot2)
library(stats)

In the live session we set the working directory with setwd(...). In this document the data file Life Expectancy Data.csv sits next to the .Rmd, so no setwd() is needed.

2 Import & Understand Data

The dataset is the WHO Life Expectancy data.

data <- read.csv("Life Expectancy Data.csv")

# In RStudio you would run View(data); here we preview the first rows.
knitr::kable(head(data), caption = "First rows of the Life Expectancy data")
First rows of the Life Expectancy data
Country Year Status Life.expectancy Adult.Mortality infant.deaths Alcohol percentage.expenditure Hepatitis.B Measles BMI under.five.deaths Polio Total.expenditure Diphtheria HIV.AIDS GDP Population thinness..1.19.years thinness.5.9.years Income.composition.of.resources Schooling
Afghanistan 2015 Developing 65.0 263 62 0.01 71.279624 65 1154 19.1 83 6 8.16 65 0.1 584.25921 33736494 17.2 17.3 0.479 10.1
Afghanistan 2014 Developing 59.9 271 64 0.01 73.523582 62 492 18.6 86 58 8.18 62 0.1 612.69651 327582 17.5 17.5 0.476 10.0
Afghanistan 2013 Developing 59.9 268 66 0.01 73.219243 64 430 18.1 89 62 8.13 64 0.1 631.74498 31731688 17.7 17.7 0.470 9.9
Afghanistan 2012 Developing 59.5 272 69 0.01 78.184215 67 2787 17.6 93 67 8.52 67 0.1 669.95900 3696958 17.9 18.0 0.463 9.8
Afghanistan 2011 Developing 59.2 275 71 0.01 7.097109 68 3013 17.2 97 68 7.87 68 0.1 63.53723 2978599 18.2 18.2 0.454 9.5
Afghanistan 2010 Developing 58.8 279 74 0.01 79.679367 66 1989 16.7 102 66 9.20 66 0.1 553.32894 2883167 18.4 18.4 0.448 9.2
summary(data)
#>    Country               Year         Status          Life.expectancy
#>  Length:2938        Min.   :2000   Length:2938        Min.   :36.30  
#>  Class :character   1st Qu.:2004   Class :character   1st Qu.:63.10  
#>  Mode  :character   Median :2008   Mode  :character   Median :72.10  
#>                     Mean   :2008                      Mean   :69.22  
#>                     3rd Qu.:2012                      3rd Qu.:75.70  
#>                     Max.   :2015                      Max.   :89.00  
#>                                                       NA's   :10     
#>  Adult.Mortality infant.deaths       Alcohol        percentage.expenditure
#>  Min.   :  1.0   Min.   :   0.0   Min.   : 0.0100   Min.   :    0.000     
#>  1st Qu.: 74.0   1st Qu.:   0.0   1st Qu.: 0.8775   1st Qu.:    4.685     
#>  Median :144.0   Median :   3.0   Median : 3.7550   Median :   64.913     
#>  Mean   :164.8   Mean   :  30.3   Mean   : 4.6029   Mean   :  738.251     
#>  3rd Qu.:228.0   3rd Qu.:  22.0   3rd Qu.: 7.7025   3rd Qu.:  441.534     
#>  Max.   :723.0   Max.   :1800.0   Max.   :17.8700   Max.   :19479.912     
#>  NA's   :10                       NA's   :194                             
#>   Hepatitis.B       Measles              BMI        under.five.deaths
#>  Min.   : 1.00   Min.   :     0.0   Min.   : 1.00   Min.   :   0.00  
#>  1st Qu.:77.00   1st Qu.:     0.0   1st Qu.:19.30   1st Qu.:   0.00  
#>  Median :92.00   Median :    17.0   Median :43.50   Median :   4.00  
#>  Mean   :80.94   Mean   :  2419.6   Mean   :38.32   Mean   :  42.04  
#>  3rd Qu.:97.00   3rd Qu.:   360.2   3rd Qu.:56.20   3rd Qu.:  28.00  
#>  Max.   :99.00   Max.   :212183.0   Max.   :87.30   Max.   :2500.00  
#>  NA's   :553                        NA's   :34                       
#>      Polio       Total.expenditure   Diphtheria       HIV.AIDS     
#>  Min.   : 3.00   Min.   : 0.370    Min.   : 2.00   Min.   : 0.100  
#>  1st Qu.:78.00   1st Qu.: 4.260    1st Qu.:78.00   1st Qu.: 0.100  
#>  Median :93.00   Median : 5.755    Median :93.00   Median : 0.100  
#>  Mean   :82.55   Mean   : 5.938    Mean   :82.32   Mean   : 1.742  
#>  3rd Qu.:97.00   3rd Qu.: 7.492    3rd Qu.:97.00   3rd Qu.: 0.800  
#>  Max.   :99.00   Max.   :17.600    Max.   :99.00   Max.   :50.600  
#>  NA's   :19      NA's   :226       NA's   :19                      
#>       GDP              Population        thinness..1.19.years
#>  Min.   :     1.68   Min.   :3.400e+01   Min.   : 0.10       
#>  1st Qu.:   463.94   1st Qu.:1.958e+05   1st Qu.: 1.60       
#>  Median :  1766.95   Median :1.387e+06   Median : 3.30       
#>  Mean   :  7483.16   Mean   :1.275e+07   Mean   : 4.84       
#>  3rd Qu.:  5910.81   3rd Qu.:7.420e+06   3rd Qu.: 7.20       
#>  Max.   :119172.74   Max.   :1.294e+09   Max.   :27.70       
#>  NA's   :448         NA's   :652         NA's   :34          
#>  thinness.5.9.years Income.composition.of.resources   Schooling    
#>  Min.   : 0.10      Min.   :0.0000                  Min.   : 0.00  
#>  1st Qu.: 1.50      1st Qu.:0.4930                  1st Qu.:10.10  
#>  Median : 3.30      Median :0.6770                  Median :12.30  
#>  Mean   : 4.87      Mean   :0.6276                  Mean   :11.99  
#>  3rd Qu.: 7.20      3rd Qu.:0.7790                  3rd Qu.:14.30  
#>  Max.   :28.60      Max.   :0.9480                  Max.   :20.70  
#>  NA's   :34         NA's   :167                     NA's   :163

3 Categorical Variables

What is recoding / encoding? Converting categorical variables (text) into numeric values — for example, "Developed" → 1 and "Developing" → 0.

Why do we recode?

  • Regression models need numeric predictors.
  • It makes categorical data usable in statistical tests.

Create a dummy variable. Use ifelse() for binary variables.

data$is_developed <- ifelse(data$Status == "Developed", 1, 0)
head(data$is_developed)
#> [1] 0 0 0 0 0 0

Simple regression with a binary predictor. Predict life expectancy from developed/developing status.

model1 <- lm(Life.expectancy ~ is_developed, data = data)
summary(model1)
#> 
#> Call:
#> lm(formula = Life.expectancy ~ is_developed, data = data)
#> 
#> Residuals:
#>     Min      1Q  Median      3Q     Max 
#> -30.811  -4.912   1.288   6.489  21.889 
#> 
#> Coefficients:
#>              Estimate Std. Error t value Pr(>|t|)    
#> (Intercept)   67.1115     0.1698  395.28   <2e-16 ***
#> is_developed  12.0864     0.4060   29.77   <2e-16 ***
#> ---
#> Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
#> 
#> Residual standard error: 8.345 on 2926 degrees of freedom
#>   (10 observations deleted due to missingness)
#> Multiple R-squared:  0.2325, Adjusted R-squared:  0.2322 
#> F-statistic: 886.2 on 1 and 2926 DF,  p-value: < 2.2e-16
  • Intercept = mean life expectancy for Developing countries (the reference group).
  • is_developed = difference in mean life expectancy (Developed − Developing).

4 One-Sample t-test (Life Expectancy)

We test \(H_0: \mu = 70\) against \(H_1: \mu \neq 70\).

Step 1 — Sample mean.

mean(data$Life.expectancy, na.rm = TRUE)
#> [1] 69.22493

Step 2 — One-sample t-test.

t.test(data$Life.expectancy, mu = 70)
#> 
#>  One Sample t-test
#> 
#> data:  data$Life.expectancy
#> t = -4.4036, df = 2927, p-value = 1.103e-05
#> alternative hypothesis: true mean is not equal to 70
#> 95 percent confidence interval:
#>  68.87982 69.57004
#> sample estimates:
#> mean of x 
#>  69.22493

Step 3 — Extract the 95% CI bounds (for plotting).

ci_life <- t.test(data$Life.expectancy, conf.level = 0.95)$conf.int
ci_life
#> [1] 68.87982 69.57004
#> attr(,"conf.level")
#> [1] 0.95

Step 4 — Visualize the distribution with CI lines.

ggplot(data, aes(x = Life.expectancy)) +
  geom_histogram(binwidth = 2, fill = "steelblue", color = "black") +
  geom_vline(xintercept = ci_life, linetype = "dashed", color = "red") +
  labs(
    title = "Life Expectancy Distribution (95% CI)",
    x = "Life Expectancy (years)",
    y = "Count"
  )

5 Two-Sample t-test (Developed vs. Developing)

We test \(H_0: \mu_{\text{developed}} = \mu_{\text{developing}}\) against \(H_1: \mu_{\text{developed}} \neq \mu_{\text{developing}}\).

t.test(Life.expectancy ~ Status, data = data)
#> 
#>  Welch Two Sample t-test
#> 
#> data:  Life.expectancy by Status
#> t = 47.868, df = 1807, p-value < 2.2e-16
#> alternative hypothesis: true difference in means between group Developed and group Developing is not equal to 0
#> 95 percent confidence interval:
#>  11.59118 12.58159
#> sample estimates:
#>  mean in group Developed mean in group Developing 
#>                 79.19785                 67.11147

In t.test(y ~ x, data = ...):

  • y = numeric variable (the thing you’re measuring)
  • x = categorical variable (the grouping factor, must have 2 levels)

Visualize.

ggplot(data, aes(x = Status, y = Life.expectancy)) +
  geom_boxplot(fill = "lightblue", color = "black") +
  labs(
    title = "Life Expectancy by Country Status",
    x = "Country Status",
    y = "Life Expectancy (years)"
  )

6 Quick Practice

P1) One-sample t-test: is average GDP different from 5000?

t.test(data$GDP, mu = 5000)
#> 
#>  One Sample t-test
#> 
#> data:  data$GDP
#> t = 8.6831, df = 2489, p-value < 2.2e-16
#> alternative hypothesis: true mean is not equal to 5000
#> 95 percent confidence interval:
#>  6922.383 8043.934
#> sample estimates:
#> mean of x 
#>  7483.158

P2) One-sample t-test: is average Schooling different from 10? Create a histogram with the 95% CI.

t.test(data$Schooling, mu = 10)
#> 
#>  One Sample t-test
#> 
#> data:  data$Schooling
#> t = 31.253, df = 2774, p-value < 2.2e-16
#> alternative hypothesis: true mean is not equal to 10
#> 95 percent confidence interval:
#>  11.86777 12.11782
#> sample estimates:
#> mean of x 
#>  11.99279
ci_schooling <- t.test(data$Schooling, conf.level = 0.95)$conf.int

ggplot(data, aes(x = Schooling)) +
  geom_histogram(binwidth = 1, fill = "skyblue", color = "black") +
  geom_vline(xintercept = ci_schooling, linetype = "dashed", color = "red") +
  labs(
    title = "Schooling Distribution (95% CI)",
    x = "Years of Schooling",
    y = "Count"
  )

P3) Two-sample t-test: compare Adult.Mortality between Developed and Developing. Create boxplots by group.

t.test(Adult.Mortality ~ Status, data = data)
#> 
#>  Welch Two Sample t-test
#> 
#> data:  Adult.Mortality by Status
#> t = -30.745, df = 2174.9, p-value < 2.2e-16
#> alternative hypothesis: true difference in means between group Developed and group Developing is not equal to 0
#> 95 percent confidence interval:
#>  -109.72693  -96.56836
#> sample estimates:
#>  mean in group Developed mean in group Developing 
#>                 79.68555                182.83320
ggplot(data, aes(x = Status, y = Adult.Mortality)) +
  geom_boxplot(fill = "lightgreen", color = "black") +
  labs(
    title = "Adult Mortality by Country Status",
    x = "Country Status",
    y = "Adult Mortality Rate"
  )

7 Wrap-up

Key takeaways

  • Use ifelse() to create binary (dummy) variables.
  • Use t.test(x, mu = value) for a one-sample test.
  • Use t.test(y ~ x, data) for two independent samples.
  • Extract the CI with $conf.int, then draw vertical lines on histograms.
  • Visualize distributions and group comparisons with ggplot2.
LS0tCnRpdGxlOiAiTGFiIDgg4oCUIHQtdGVzdHMgJiBDYXRlZ29yaWNhbCBWYXJpYWJsZXMiCnN1YnRpdGxlOiAiUXVhbnRpdGF0aXZlIFJlYXNvbmluZyDCtyBMQUIgNDEzIgphdXRob3I6ICJJbnN0cnVjdG9yOiBTdWJpbiBOYSIKZGF0ZTogIk9jdG9iZXIgMjksIDIwMjUiCm91dHB1dDoKICBodG1sX2RvY3VtZW50OgogICAgdGhlbWU6IGZsYXRseQogICAgaGlnaGxpZ2h0OiB0YW5nbwogICAgdG9jOiB0cnVlCiAgICB0b2NfZmxvYXQ6IHRydWUKICAgIHRvY19kZXB0aDogMgogICAgbnVtYmVyX3NlY3Rpb25zOiB0cnVlCiAgICBkZl9wcmludDogcGFnZWQKICAgIGNvZGVfZG93bmxvYWQ6IHRydWUKLS0tCgpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KAogIGVjaG8gPSBUUlVFLCBtZXNzYWdlID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRSwKICBmaWcuYWxpZ24gPSAiY2VudGVyIiwgZmlnLndpZHRoID0gNywgZmlnLmhlaWdodCA9IDQuMiwKICBjb21tZW50ID0gIiM+IgopCmBgYAoKPiAqKkhvdyB0byB1c2UgdGhpcyBkb2N1bWVudC4qKiBSdW4gdGhlIGNvZGUgYWxvbmcgd2l0aCBtZS4gQ29tbWVudHMgc3RhcnQgd2l0aCBgI2AuCj4gRWFjaCBzZWN0aW9uIG1pcnJvcnMgdGhlIGxpdmUgbGFiOyBjb2RlIGNodW5rcyBzaG93IHRoZSBjb21tYW5kIGFuZCBpdHMgb3V0cHV0IHRvZ2V0aGVyLgoKKipUb2RheSdzIHBsYW4qKgoKMS4gQ2xlYW4gZW52aXJvbm1lbnQgKyBzZXR1cAoyLiBJbXBvcnQgJiB1bmRlcnN0YW5kIExpZmUgRXhwZWN0YW5jeSBkYXRhCjMuIFdvcmtpbmcgd2l0aCBjYXRlZ29yaWNhbCB2YXJpYWJsZXMKNC4gT25lLXNhbXBsZSAqdCotdGVzdCAoTGlmZSBFeHBlY3RhbmN5KQo1LiBUd28tc2FtcGxlICp0Ki10ZXN0IChEZXZlbG9wZWQgdnMuIERldmVsb3BpbmcpCjYuIFF1aWNrIHByYWN0aWNlCjcuIFdyYXAtdXAKCi0tLQoKIyBDbGVhbiBFbnZpcm9ubWVudCArIFNldHVwCgpgYGB7ciBjbGVhbi1zZXR1cH0Kcm0obGlzdCA9IGxzKCkpICAgIyBjbGVhbiBlbnZpcm9ubWVudAoKIyBMb2FkIHRoZSBwYWNrYWdlcwpsaWJyYXJ5KGRwbHlyKQpsaWJyYXJ5KGdncGxvdDIpCmxpYnJhcnkoc3RhdHMpCmBgYAoKPiBJbiB0aGUgbGl2ZSBzZXNzaW9uIHdlIHNldCB0aGUgd29ya2luZyBkaXJlY3Rvcnkgd2l0aCBgc2V0d2QoLi4uKWAuIEluIHRoaXMKPiBkb2N1bWVudCB0aGUgZGF0YSBmaWxlIGBMaWZlIEV4cGVjdGFuY3kgRGF0YS5jc3ZgIHNpdHMgbmV4dCB0byB0aGUgYC5SbWRgLCBzbyBubwo+IGBzZXR3ZCgpYCBpcyBuZWVkZWQuCgojIEltcG9ydCAmIFVuZGVyc3RhbmQgRGF0YQoKVGhlIGRhdGFzZXQgaXMgdGhlIFdITyAqKkxpZmUgRXhwZWN0YW5jeSoqIGRhdGEuCgpgYGB7ciBpbXBvcnR9CmRhdGEgPC0gcmVhZC5jc3YoIkxpZmUgRXhwZWN0YW5jeSBEYXRhLmNzdiIpCgojIEluIFJTdHVkaW8geW91IHdvdWxkIHJ1biBWaWV3KGRhdGEpOyBoZXJlIHdlIHByZXZpZXcgdGhlIGZpcnN0IHJvd3MuCmtuaXRyOjprYWJsZShoZWFkKGRhdGEpLCBjYXB0aW9uID0gIkZpcnN0IHJvd3Mgb2YgdGhlIExpZmUgRXhwZWN0YW5jeSBkYXRhIikKYGBgCgpgYGB7ciBleHBsb3JlfQpzdW1tYXJ5KGRhdGEpCmBgYAoKIyBDYXRlZ29yaWNhbCBWYXJpYWJsZXMKCioqV2hhdCBpcyByZWNvZGluZyAvIGVuY29kaW5nPyoqIENvbnZlcnRpbmcgY2F0ZWdvcmljYWwgdmFyaWFibGVzICh0ZXh0KSBpbnRvCm51bWVyaWMgdmFsdWVzIOKAlCBmb3IgZXhhbXBsZSwgYCJEZXZlbG9wZWQiYCDihpIgMSBhbmQgYCJEZXZlbG9waW5nImAg4oaSIDAuCgoqKldoeSBkbyB3ZSByZWNvZGU/KioKCi0gUmVncmVzc2lvbiBtb2RlbHMgbmVlZCBudW1lcmljIHByZWRpY3RvcnMuCi0gSXQgbWFrZXMgY2F0ZWdvcmljYWwgZGF0YSB1c2FibGUgaW4gc3RhdGlzdGljYWwgdGVzdHMuCgoqKkNyZWF0ZSBhIGR1bW15IHZhcmlhYmxlLioqIFVzZSBgaWZlbHNlKClgIGZvciBiaW5hcnkgdmFyaWFibGVzLgoKYGBge3IgZHVtbXl9CmRhdGEkaXNfZGV2ZWxvcGVkIDwtIGlmZWxzZShkYXRhJFN0YXR1cyA9PSAiRGV2ZWxvcGVkIiwgMSwgMCkKaGVhZChkYXRhJGlzX2RldmVsb3BlZCkKYGBgCgoqKlNpbXBsZSByZWdyZXNzaW9uIHdpdGggYSBiaW5hcnkgcHJlZGljdG9yLioqIFByZWRpY3QgbGlmZSBleHBlY3RhbmN5IGZyb20KZGV2ZWxvcGVkL2RldmVsb3Bpbmcgc3RhdHVzLgoKYGBge3IgcmVnfQptb2RlbDEgPC0gbG0oTGlmZS5leHBlY3RhbmN5IH4gaXNfZGV2ZWxvcGVkLCBkYXRhID0gZGF0YSkKc3VtbWFyeShtb2RlbDEpCmBgYAoKPiAtICoqSW50ZXJjZXB0KiogPSBtZWFuIGxpZmUgZXhwZWN0YW5jeSBmb3IgRGV2ZWxvcGluZyBjb3VudHJpZXMgKHRoZSByZWZlcmVuY2UgZ3JvdXApLgo+IC0gKipgaXNfZGV2ZWxvcGVkYCoqID0gZGlmZmVyZW5jZSBpbiBtZWFuIGxpZmUgZXhwZWN0YW5jeSAoRGV2ZWxvcGVkIOKIkiBEZXZlbG9waW5nKS4KCiMgT25lLVNhbXBsZSB0LXRlc3QgKExpZmUgRXhwZWN0YW5jeSkKCldlIHRlc3QgJEhfMDogXG11ID0gNzAkIGFnYWluc3QgJEhfMTogXG11IFxuZXEgNzAkLgoKKipTdGVwIDEg4oCUIFNhbXBsZSBtZWFuLioqCgpgYGB7ciBsaWZlLW1lYW59Cm1lYW4oZGF0YSRMaWZlLmV4cGVjdGFuY3ksIG5hLnJtID0gVFJVRSkKYGBgCgoqKlN0ZXAgMiDigJQgT25lLXNhbXBsZSAqdCotdGVzdC4qKgoKYGBge3IgbGlmZS10dGVzdH0KdC50ZXN0KGRhdGEkTGlmZS5leHBlY3RhbmN5LCBtdSA9IDcwKQpgYGAKCioqU3RlcCAzIOKAlCBFeHRyYWN0IHRoZSA5NSUgQ0kgYm91bmRzKiogKGZvciBwbG90dGluZykuCgpgYGB7ciBsaWZlLWNpfQpjaV9saWZlIDwtIHQudGVzdChkYXRhJExpZmUuZXhwZWN0YW5jeSwgY29uZi5sZXZlbCA9IDAuOTUpJGNvbmYuaW50CmNpX2xpZmUKYGBgCgoqKlN0ZXAgNCDigJQgVmlzdWFsaXplIHRoZSBkaXN0cmlidXRpb24gd2l0aCBDSSBsaW5lcy4qKgoKYGBge3IgbGlmZS1wbG90fQpnZ3Bsb3QoZGF0YSwgYWVzKHggPSBMaWZlLmV4cGVjdGFuY3kpKSArCiAgZ2VvbV9oaXN0b2dyYW0oYmlud2lkdGggPSAyLCBmaWxsID0gInN0ZWVsYmx1ZSIsIGNvbG9yID0gImJsYWNrIikgKwogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IGNpX2xpZmUsIGxpbmV0eXBlID0gImRhc2hlZCIsIGNvbG9yID0gInJlZCIpICsKICBsYWJzKAogICAgdGl0bGUgPSAiTGlmZSBFeHBlY3RhbmN5IERpc3RyaWJ1dGlvbiAoOTUlIENJKSIsCiAgICB4ID0gIkxpZmUgRXhwZWN0YW5jeSAoeWVhcnMpIiwKICAgIHkgPSAiQ291bnQiCiAgKQpgYGAKCiMgVHdvLVNhbXBsZSB0LXRlc3QgKERldmVsb3BlZCB2cy4gRGV2ZWxvcGluZykKCldlIHRlc3QgJEhfMDogXG11X3tcdGV4dHtkZXZlbG9wZWR9fSA9IFxtdV97XHRleHR7ZGV2ZWxvcGluZ319JCBhZ2FpbnN0CiRIXzE6IFxtdV97XHRleHR7ZGV2ZWxvcGVkfX0gXG5lcSBcbXVfe1x0ZXh0e2RldmVsb3Bpbmd9fSQuCgpgYGB7ciB0d28tdHRlc3R9CnQudGVzdChMaWZlLmV4cGVjdGFuY3kgfiBTdGF0dXMsIGRhdGEgPSBkYXRhKQpgYGAKCj4gSW4gYHQudGVzdCh5IH4geCwgZGF0YSA9IC4uLilgOgo+Cj4gLSBgeWAgPSBudW1lcmljIHZhcmlhYmxlICh0aGUgdGhpbmcgeW91J3JlIG1lYXN1cmluZykKPiAtIGB4YCA9IGNhdGVnb3JpY2FsIHZhcmlhYmxlICh0aGUgZ3JvdXBpbmcgZmFjdG9yLCBtdXN0IGhhdmUgMiBsZXZlbHMpCgoqKlZpc3VhbGl6ZS4qKgoKYGBge3IgdHdvLXBsb3R9CmdncGxvdChkYXRhLCBhZXMoeCA9IFN0YXR1cywgeSA9IExpZmUuZXhwZWN0YW5jeSkpICsKICBnZW9tX2JveHBsb3QoZmlsbCA9ICJsaWdodGJsdWUiLCBjb2xvciA9ICJibGFjayIpICsKICBsYWJzKAogICAgdGl0bGUgPSAiTGlmZSBFeHBlY3RhbmN5IGJ5IENvdW50cnkgU3RhdHVzIiwKICAgIHggPSAiQ291bnRyeSBTdGF0dXMiLAogICAgeSA9ICJMaWZlIEV4cGVjdGFuY3kgKHllYXJzKSIKICApCmBgYAoKIyBRdWljayBQcmFjdGljZQoKKipQMSkgT25lLXNhbXBsZSAqdCotdGVzdDogaXMgYXZlcmFnZSBHRFAgZGlmZmVyZW50IGZyb20gNTAwMD8qKgoKYGBge3IgcDF9CnQudGVzdChkYXRhJEdEUCwgbXUgPSA1MDAwKQpgYGAKCioqUDIpIE9uZS1zYW1wbGUgKnQqLXRlc3Q6IGlzIGF2ZXJhZ2UgYFNjaG9vbGluZ2AgZGlmZmVyZW50IGZyb20gMTA/KioKQ3JlYXRlIGEgaGlzdG9ncmFtIHdpdGggdGhlIDk1JSBDSS4KCmBgYHtyIHAyfQp0LnRlc3QoZGF0YSRTY2hvb2xpbmcsIG11ID0gMTApCgpjaV9zY2hvb2xpbmcgPC0gdC50ZXN0KGRhdGEkU2Nob29saW5nLCBjb25mLmxldmVsID0gMC45NSkkY29uZi5pbnQKCmdncGxvdChkYXRhLCBhZXMoeCA9IFNjaG9vbGluZykpICsKICBnZW9tX2hpc3RvZ3JhbShiaW53aWR0aCA9IDEsIGZpbGwgPSAic2t5Ymx1ZSIsIGNvbG9yID0gImJsYWNrIikgKwogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IGNpX3NjaG9vbGluZywgbGluZXR5cGUgPSAiZGFzaGVkIiwgY29sb3IgPSAicmVkIikgKwogIGxhYnMoCiAgICB0aXRsZSA9ICJTY2hvb2xpbmcgRGlzdHJpYnV0aW9uICg5NSUgQ0kpIiwKICAgIHggPSAiWWVhcnMgb2YgU2Nob29saW5nIiwKICAgIHkgPSAiQ291bnQiCiAgKQpgYGAKCioqUDMpIFR3by1zYW1wbGUgKnQqLXRlc3Q6IGNvbXBhcmUgYEFkdWx0Lk1vcnRhbGl0eWAgYmV0d2VlbiBEZXZlbG9wZWQgYW5kIERldmVsb3BpbmcuKioKQ3JlYXRlIGJveHBsb3RzIGJ5IGdyb3VwLgoKYGBge3IgcDN9CnQudGVzdChBZHVsdC5Nb3J0YWxpdHkgfiBTdGF0dXMsIGRhdGEgPSBkYXRhKQoKZ2dwbG90KGRhdGEsIGFlcyh4ID0gU3RhdHVzLCB5ID0gQWR1bHQuTW9ydGFsaXR5KSkgKwogIGdlb21fYm94cGxvdChmaWxsID0gImxpZ2h0Z3JlZW4iLCBjb2xvciA9ICJibGFjayIpICsKICBsYWJzKAogICAgdGl0bGUgPSAiQWR1bHQgTW9ydGFsaXR5IGJ5IENvdW50cnkgU3RhdHVzIiwKICAgIHggPSAiQ291bnRyeSBTdGF0dXMiLAogICAgeSA9ICJBZHVsdCBNb3J0YWxpdHkgUmF0ZSIKICApCmBgYAoKIyBXcmFwLXVwCgoqKktleSB0YWtlYXdheXMqKgoKLSBVc2UgYGlmZWxzZSgpYCB0byBjcmVhdGUgYmluYXJ5IChkdW1teSkgdmFyaWFibGVzLgotIFVzZSBgdC50ZXN0KHgsIG11ID0gdmFsdWUpYCBmb3IgYSBvbmUtc2FtcGxlIHRlc3QuCi0gVXNlIGB0LnRlc3QoeSB+IHgsIGRhdGEpYCBmb3IgdHdvIGluZGVwZW5kZW50IHNhbXBsZXMuCi0gRXh0cmFjdCB0aGUgQ0kgd2l0aCBgJGNvbmYuaW50YCwgdGhlbiBkcmF3IHZlcnRpY2FsIGxpbmVzIG9uIGhpc3RvZ3JhbXMuCi0gVmlzdWFsaXplIGRpc3RyaWJ1dGlvbnMgYW5kIGdyb3VwIGNvbXBhcmlzb25zIHdpdGggKipnZ3Bsb3QyKiouCg==