library(tidyverse)
library(openintro)
library(ggplot2)

Exercise 1

What was the estimated power of the test in the second example above?

pvalueSampling <- function(popA, popB, n=25, REPS=1000) {
  dist <- array(data=NA, dim=REPS)
  for (i in 1:REPS){
    A <- sample(popA, size=n)
    B <- sample(popB, size=n)
    H <- t.test(A, B, alternative="two.sided")    
    dist[i] <- H$p.value
  }
  return(dist)
}

p.less <- function(A, limit=0.05/2) {
  return( length(A[A < limit])/length(A) )
}

pop_Apwr <- rnorm(1000, mean = 10, sd = 2)
pop_Bpwr <- rnorm(1000, mean = 11, sd = 2) 

p_valuepwr <- data.frame(pval = pvalueSampling(pop_Apwr, pop_Bpwr, REPS = 4096))
ALPHA <- 0.05/2

ggplot(data=p_valuepwr, aes(pval)) + 
  geom_histogram(aes(y=..density..), bins=64, 
                 col="orange", fill="green") +
  geom_density(col="red") +
  geom_vline(xintercept=ALPHA, color="red") +
  labs(title="Sampling Distribution of p-values", x = "p-value", y = "frequency") +
  theme_minimal(12)

p_reject <- p.less(p_valuepwr$pval)
names(p_reject) <- "Estimated Power"
p_reject
## Estimated Power 
##       0.3276367

The estimated power is 0.2285156.

Exercise 2

Modify the example to compare sample means when Cohens’s D is 1.0 and 1.5. How does the observed power change?

popA_CD1 <- rnorm(1000, mean = 10, sd = 2)
popB_CD1 <- rnorm(1000, mean = 12, sd = 2) 

pvalue_CD1 <- data.frame(pval = pvalueSampling(popA_CD1, popB_CD1, REPS = 4096))
ALPHA <- 0.05/2

ggplot(data=pvalue_CD1, aes(pval)) + 
  geom_histogram(aes(y=..density..), bins=64, 
                 col="orange", fill="green") +
  geom_density(col="red") +
  geom_vline(xintercept=ALPHA, color="red") +
  labs(title="Sampling Distribution of p-values", x = "p-value", y = "frequency") +
  theme_minimal(12)

preject_CD1 <- p.less(pvalue_CD1$pval)
names(preject_CD1) <- "Observed Power"
preject_CD1
## Observed Power 
##      0.8662109
popA_CD1.5 <- rnorm(1000, mean = 9, sd = 2)
popB_CD1.5 <- rnorm(1000, mean = 12, sd = 2) 

pvalue_CD1.5 <- data.frame(pval = pvalueSampling(popA_CD1.5, popB_CD1.5, REPS = 4096))
ALPHA <- 0.05/2

ggplot(data=pvalue_CD1.5, aes(pval)) + 
  geom_histogram(aes(y=..density..), bins=64, 
                 col="orange", fill="green") +
  geom_density(col="red") +
  geom_vline(xintercept=ALPHA, color="red") +
  labs(title="Sampling Distribution of p-values", x = "p-value", y = "frequency") +
  theme_minimal(12)

preject_CD1.5 <- p.less(pvalue_CD1.5$pval)
names(preject_CD1.5) <- "Observed Power"
preject_CD1.5
## Observed Power 
##      0.9975586

As the Cohen’s D value increases, so does the observed power.

Exercise 3

Reduce the sample sizes to n=9, and compare to one of your previous cases. How does the observed power change?

pvalueSampling <- function(popA, popB, n=9, REPS=1000) {
  dist <- array(data=NA, dim=REPS)
  for (i in 1:REPS){
    A <- sample(popA, size=n)
    B <- sample(popB, size=n)
    H <- t.test(A, B, alternative="two.sided")    
    dist[i] <- H$p.value
  }
  return(dist)
}

p.less <- function(A, limit=0.05/2) {
  return( length(A[A < limit])/length(A) )
}

# Cohen's D = 0.5

pop_a <- rnorm(1000, mean = 10, sd = 2)
pop_b <- rnorm(1000, mean = 11, sd = 2) 

p_value <- data.frame(pval = pvalueSampling(pop_a, pop_b, REPS = 4096))
ALPHA <- 0.05/2

ggplot(data=p_value, aes(pval)) + 
  geom_histogram(aes(y=..density..), bins=64, 
                 col="orange", fill="green") +
  geom_density(col="red") +
  geom_vline(xintercept=ALPHA, color="red") +
  labs(title="Sampling Distribution of p-values", x = "p-value", y = "frequency") +
  theme_minimal(12)

p_reject<- p.less(p_value$pval)
names(p_reject) <- "Observed Power"
p_reject
## Observed Power 
##      0.1013184

Decreasing the sample size decreases the power. With a sample size of 25 the power was .2285156, however decreased to a sample size of 9 decreased the power to .08984375.

Exercise 4

Perform a similar comparison where the underlying populations are not normally distributed. You might try either a uniform distribution( runif(n, min, max)) or a gamma distribution (rgamma(n, shape, rate)).

popA <- rgamma(1000, shape = 4, rate = 1)
popB <- rgamma(1000, shape = 5, rate = 1 ) 

pvalue_1 <- data.frame(pval = pvalueSampling(popA, popB, REPS = 4096))
ALPHA <- 0.05/2

ggplot(data=pvalue_1, aes(pval)) + 
  geom_histogram(aes(y=..density..), bins=64, 
                 col="orange", fill="green") +
  geom_density(col="red") +
  geom_vline(xintercept=ALPHA, color="red") +
  labs(title="Sampling Distribution of p-values", x = "p-value", y = "frequency") +
  theme_minimal(12)

preject1 <- p.less(pvalue_1$pval)
names(preject1) <- "Observed Power"
preject1
## Observed Power 
##     0.08105469
popA2 <- rgamma(1000, shape = 4, rate = 1)
popB2 <- rgamma(1000, shape = 6.5, rate = 1 ) 

pvalue_2 <- data.frame(pval = pvalueSampling(popA2, popB2, REPS = 4096))
ALPHA <- 0.05/2

ggplot(data=pvalue_2, aes(pval)) + 
  geom_histogram(aes(y=..density..), bins=64, 
                 col="orange", fill="green") +
  geom_density(col="red") +
  geom_vline(xintercept=ALPHA, color="red") +
  labs(title="Sampling Distribution of p-values", x = "p-value", y = "frequency") +
  theme_minimal(12)

preject2 <- p.less(pvalue_2$pval)
names(preject2) <- "Observed Power"
preject2
## Observed Power 
##      0.4665527
popA3 <- rgamma(1000, shape = 4, rate = 1)
popB3 <- rgamma(1000, shape = 7.5, rate = 1 ) 

pvalue_3 <- data.frame(pval = pvalueSampling(popA3, popB3, REPS = 4096))
ALPHA <- 0.05/2

ggplot(data=pvalue_3, aes(pval)) + 
  geom_histogram(aes(y=..density..), bins=64, 
                 col="orange", fill="green") +
  geom_density(col="red") +
  geom_vline(xintercept=ALPHA, color="red") +
  labs(title="Sampling Distribution of p-values", x = "p-value", y = "frequency") +
  theme_minimal(12)

preject3 <- p.less(pvalue_3$pval)
names(preject3) <- "Observed Power"
preject3
## Observed Power 
##      0.7233887
pvalueSampling <- function(popA, popB, n=9, REPS=1000) {
  dist <- array(data=NA, dim=REPS)
  for (i in 1:REPS){
    A <- sample(popA, size=n)
    B <- sample(popB, size=n)
    H <- t.test(A, B, alternative="two.sided")    
    dist[i] <- H$p.value
  }
  return(dist)
}

p.less <- function(A, limit=0.05/2) {
  return( length(A[A < limit])/length(A) )
}

popA4 <- rgamma(1000, shape = 4, rate = 1)
popB4 <- rgamma(1000, shape = 5, rate = 1 ) 

pvalue_4 <- data.frame(pval = pvalueSampling(popA4, popB4, REPS = 4096))
ALPHA <- 0.05/2

ggplot(data=pvalue_4, aes(pval)) + 
  geom_histogram(aes(y=..density..), bins=64, 
                 col="orange", fill="green") +
  geom_density(col="red") +
  geom_vline(xintercept=ALPHA, color="red") +
  labs(title="Sampling Distribution of p-values", x = "p-value", y = "frequency") +
  theme_minimal(12)

preject4<- p.less(pvalue_4$pval)
names(preject4) <- "Observed Power"
preject4
## Observed Power 
##     0.08374023

Much like a normal distribution, a gamma distribution also increases as the Cohen’s D value increases. We also see that decreasing sample size, also decreases the observed power. …

LS0tDQp0aXRsZTogIkEgUC1WYWx1ZSBTYW1wbGluZyBEaXN0cmlidXRpb24iDQphdXRob3I6ICJIYWlsZXkgSmVuc2VuIg0KZGF0ZTogIjExLzIwLzIwMjEiDQpvdXRwdXQ6IG9wZW5pbnRybzo6bGFiX3JlcG9ydA0KLS0tDQoNCmBgYHtyIGxvYWQtcGFja2FnZXMsIG1lc3NhZ2U9RkFMU0V9DQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCmxpYnJhcnkob3BlbmludHJvKQ0KbGlicmFyeShnZ3Bsb3QyKQ0KYGBgDQoNCiMjIyBFeGVyY2lzZSAxDQoNCldoYXQgd2FzIHRoZSBlc3RpbWF0ZWQgcG93ZXIgb2YgdGhlIHRlc3QgaW4gdGhlIHNlY29uZCBleGFtcGxlIGFib3ZlPw0KDQpgYGB7ciBjb2RlLWNodW5rLWxhYmVsfQ0KcHZhbHVlU2FtcGxpbmcgPC0gZnVuY3Rpb24ocG9wQSwgcG9wQiwgbj0yNSwgUkVQUz0xMDAwKSB7DQogIGRpc3QgPC0gYXJyYXkoZGF0YT1OQSwgZGltPVJFUFMpDQogIGZvciAoaSBpbiAxOlJFUFMpew0KICAgIEEgPC0gc2FtcGxlKHBvcEEsIHNpemU9bikNCiAgICBCIDwtIHNhbXBsZShwb3BCLCBzaXplPW4pDQogICAgSCA8LSB0LnRlc3QoQSwgQiwgYWx0ZXJuYXRpdmU9InR3by5zaWRlZCIpICAgIA0KICAgIGRpc3RbaV0gPC0gSCRwLnZhbHVlDQogIH0NCiAgcmV0dXJuKGRpc3QpDQp9DQoNCnAubGVzcyA8LSBmdW5jdGlvbihBLCBsaW1pdD0wLjA1LzIpIHsNCiAgcmV0dXJuKCBsZW5ndGgoQVtBIDwgbGltaXRdKS9sZW5ndGgoQSkgKQ0KfQ0KDQpwb3BfQXB3ciA8LSBybm9ybSgxMDAwLCBtZWFuID0gMTAsIHNkID0gMikNCnBvcF9CcHdyIDwtIHJub3JtKDEwMDAsIG1lYW4gPSAxMSwgc2QgPSAyKSANCg0KcF92YWx1ZXB3ciA8LSBkYXRhLmZyYW1lKHB2YWwgPSBwdmFsdWVTYW1wbGluZyhwb3BfQXB3ciwgcG9wX0Jwd3IsIFJFUFMgPSA0MDk2KSkNCkFMUEhBIDwtIDAuMDUvMg0KDQpnZ3Bsb3QoZGF0YT1wX3ZhbHVlcHdyLCBhZXMocHZhbCkpICsgDQogIGdlb21faGlzdG9ncmFtKGFlcyh5PS4uZGVuc2l0eS4uKSwgYmlucz02NCwgDQogICAgICAgICAgICAgICAgIGNvbD0ib3JhbmdlIiwgZmlsbD0iZ3JlZW4iKSArDQogIGdlb21fZGVuc2l0eShjb2w9InJlZCIpICsNCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0PUFMUEhBLCBjb2xvcj0icmVkIikgKw0KICBsYWJzKHRpdGxlPSJTYW1wbGluZyBEaXN0cmlidXRpb24gb2YgcC12YWx1ZXMiLCB4ID0gInAtdmFsdWUiLCB5ID0gImZyZXF1ZW5jeSIpICsNCiAgdGhlbWVfbWluaW1hbCgxMikNCg0KcF9yZWplY3QgPC0gcC5sZXNzKHBfdmFsdWVwd3IkcHZhbCkNCm5hbWVzKHBfcmVqZWN0KSA8LSAiRXN0aW1hdGVkIFBvd2VyIg0KcF9yZWplY3QNCmBgYA0KDQpUaGUgZXN0aW1hdGVkIHBvd2VyIGlzIDAuMjI4NTE1Ni4NCg0KIyMjIEV4ZXJjaXNlIDINCg0KTW9kaWZ5IHRoZSBleGFtcGxlIHRvIGNvbXBhcmUgc2FtcGxlIG1lYW5zIHdoZW4gQ29oZW5z4oCZcyBEIGlzIDEuMCBhbmQgMS41LiBIb3cgZG9lcyB0aGUgb2JzZXJ2ZWQgcG93ZXIgY2hhbmdlPw0KDQpgYGB7cn0NCnBvcEFfQ0QxIDwtIHJub3JtKDEwMDAsIG1lYW4gPSAxMCwgc2QgPSAyKQ0KcG9wQl9DRDEgPC0gcm5vcm0oMTAwMCwgbWVhbiA9IDEyLCBzZCA9IDIpIA0KDQpwdmFsdWVfQ0QxIDwtIGRhdGEuZnJhbWUocHZhbCA9IHB2YWx1ZVNhbXBsaW5nKHBvcEFfQ0QxLCBwb3BCX0NEMSwgUkVQUyA9IDQwOTYpKQ0KQUxQSEEgPC0gMC4wNS8yDQoNCmdncGxvdChkYXRhPXB2YWx1ZV9DRDEsIGFlcyhwdmFsKSkgKyANCiAgZ2VvbV9oaXN0b2dyYW0oYWVzKHk9Li5kZW5zaXR5Li4pLCBiaW5zPTY0LCANCiAgICAgICAgICAgICAgICAgY29sPSJvcmFuZ2UiLCBmaWxsPSJncmVlbiIpICsNCiAgZ2VvbV9kZW5zaXR5KGNvbD0icmVkIikgKw0KICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQ9QUxQSEEsIGNvbG9yPSJyZWQiKSArDQogIGxhYnModGl0bGU9IlNhbXBsaW5nIERpc3RyaWJ1dGlvbiBvZiBwLXZhbHVlcyIsIHggPSAicC12YWx1ZSIsIHkgPSAiZnJlcXVlbmN5IikgKw0KICB0aGVtZV9taW5pbWFsKDEyKQ0KDQpwcmVqZWN0X0NEMSA8LSBwLmxlc3MocHZhbHVlX0NEMSRwdmFsKQ0KbmFtZXMocHJlamVjdF9DRDEpIDwtICJPYnNlcnZlZCBQb3dlciINCnByZWplY3RfQ0QxDQoNCnBvcEFfQ0QxLjUgPC0gcm5vcm0oMTAwMCwgbWVhbiA9IDksIHNkID0gMikNCnBvcEJfQ0QxLjUgPC0gcm5vcm0oMTAwMCwgbWVhbiA9IDEyLCBzZCA9IDIpIA0KDQpwdmFsdWVfQ0QxLjUgPC0gZGF0YS5mcmFtZShwdmFsID0gcHZhbHVlU2FtcGxpbmcocG9wQV9DRDEuNSwgcG9wQl9DRDEuNSwgUkVQUyA9IDQwOTYpKQ0KQUxQSEEgPC0gMC4wNS8yDQoNCmdncGxvdChkYXRhPXB2YWx1ZV9DRDEuNSwgYWVzKHB2YWwpKSArIA0KICBnZW9tX2hpc3RvZ3JhbShhZXMoeT0uLmRlbnNpdHkuLiksIGJpbnM9NjQsIA0KICAgICAgICAgICAgICAgICBjb2w9Im9yYW5nZSIsIGZpbGw9ImdyZWVuIikgKw0KICBnZW9tX2RlbnNpdHkoY29sPSJyZWQiKSArDQogIGdlb21fdmxpbmUoeGludGVyY2VwdD1BTFBIQSwgY29sb3I9InJlZCIpICsNCiAgbGFicyh0aXRsZT0iU2FtcGxpbmcgRGlzdHJpYnV0aW9uIG9mIHAtdmFsdWVzIiwgeCA9ICJwLXZhbHVlIiwgeSA9ICJmcmVxdWVuY3kiKSArDQogIHRoZW1lX21pbmltYWwoMTIpDQoNCnByZWplY3RfQ0QxLjUgPC0gcC5sZXNzKHB2YWx1ZV9DRDEuNSRwdmFsKQ0KbmFtZXMocHJlamVjdF9DRDEuNSkgPC0gIk9ic2VydmVkIFBvd2VyIg0KcHJlamVjdF9DRDEuNQ0KYGBgDQpBcyB0aGUgQ29oZW4ncyBEIHZhbHVlIGluY3JlYXNlcywgc28gZG9lcyB0aGUgb2JzZXJ2ZWQgcG93ZXIuDQoNCiMjIyBFeGVyY2lzZSAzDQoNClJlZHVjZSB0aGUgc2FtcGxlIHNpemVzIHRvIG49OSwgYW5kIGNvbXBhcmUgdG8gb25lIG9mIHlvdXIgcHJldmlvdXMgY2FzZXMuIEhvdyBkb2VzIHRoZSBvYnNlcnZlZCBwb3dlciBjaGFuZ2U/DQoNCmBgYHtyfQ0KcHZhbHVlU2FtcGxpbmcgPC0gZnVuY3Rpb24ocG9wQSwgcG9wQiwgbj05LCBSRVBTPTEwMDApIHsNCiAgZGlzdCA8LSBhcnJheShkYXRhPU5BLCBkaW09UkVQUykNCiAgZm9yIChpIGluIDE6UkVQUyl7DQogICAgQSA8LSBzYW1wbGUocG9wQSwgc2l6ZT1uKQ0KICAgIEIgPC0gc2FtcGxlKHBvcEIsIHNpemU9bikNCiAgICBIIDwtIHQudGVzdChBLCBCLCBhbHRlcm5hdGl2ZT0idHdvLnNpZGVkIikgICAgDQogICAgZGlzdFtpXSA8LSBIJHAudmFsdWUNCiAgfQ0KICByZXR1cm4oZGlzdCkNCn0NCg0KcC5sZXNzIDwtIGZ1bmN0aW9uKEEsIGxpbWl0PTAuMDUvMikgew0KICByZXR1cm4oIGxlbmd0aChBW0EgPCBsaW1pdF0pL2xlbmd0aChBKSApDQp9DQoNCiMgQ29oZW4ncyBEID0gMC41DQoNCnBvcF9hIDwtIHJub3JtKDEwMDAsIG1lYW4gPSAxMCwgc2QgPSAyKQ0KcG9wX2IgPC0gcm5vcm0oMTAwMCwgbWVhbiA9IDExLCBzZCA9IDIpIA0KDQpwX3ZhbHVlIDwtIGRhdGEuZnJhbWUocHZhbCA9IHB2YWx1ZVNhbXBsaW5nKHBvcF9hLCBwb3BfYiwgUkVQUyA9IDQwOTYpKQ0KQUxQSEEgPC0gMC4wNS8yDQoNCmdncGxvdChkYXRhPXBfdmFsdWUsIGFlcyhwdmFsKSkgKyANCiAgZ2VvbV9oaXN0b2dyYW0oYWVzKHk9Li5kZW5zaXR5Li4pLCBiaW5zPTY0LCANCiAgICAgICAgICAgICAgICAgY29sPSJvcmFuZ2UiLCBmaWxsPSJncmVlbiIpICsNCiAgZ2VvbV9kZW5zaXR5KGNvbD0icmVkIikgKw0KICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQ9QUxQSEEsIGNvbG9yPSJyZWQiKSArDQogIGxhYnModGl0bGU9IlNhbXBsaW5nIERpc3RyaWJ1dGlvbiBvZiBwLXZhbHVlcyIsIHggPSAicC12YWx1ZSIsIHkgPSAiZnJlcXVlbmN5IikgKw0KICB0aGVtZV9taW5pbWFsKDEyKQ0KDQpwX3JlamVjdDwtIHAubGVzcyhwX3ZhbHVlJHB2YWwpDQpuYW1lcyhwX3JlamVjdCkgPC0gIk9ic2VydmVkIFBvd2VyIg0KcF9yZWplY3QNCmBgYA0KRGVjcmVhc2luZyB0aGUgc2FtcGxlIHNpemUgZGVjcmVhc2VzIHRoZSBwb3dlci4gV2l0aCBhIHNhbXBsZSBzaXplIG9mIDI1IHRoZSBwb3dlciB3YXMgLjIyODUxNTYsIGhvd2V2ZXIgZGVjcmVhc2VkIHRvIGEgc2FtcGxlIHNpemUgb2YgOSBkZWNyZWFzZWQgdGhlIHBvd2VyIHRvIC4wODk4NDM3NS4NCg0KIyMjIEV4ZXJjaXNlIDQNCg0KUGVyZm9ybSBhIHNpbWlsYXIgY29tcGFyaXNvbiB3aGVyZSB0aGUgdW5kZXJseWluZyBwb3B1bGF0aW9ucyBhcmUgbm90IG5vcm1hbGx5IGRpc3RyaWJ1dGVkLiBZb3UgbWlnaHQgdHJ5IGVpdGhlciBhIHVuaWZvcm0gZGlzdHJpYnV0aW9uKCBydW5pZihuLCBtaW4sIG1heCkpIG9yIGEgZ2FtbWEgZGlzdHJpYnV0aW9uIChyZ2FtbWEobiwgc2hhcGUsIHJhdGUpKS4NCg0KYGBge3J9DQpwb3BBIDwtIHJnYW1tYSgxMDAwLCBzaGFwZSA9IDQsIHJhdGUgPSAxKQ0KcG9wQiA8LSByZ2FtbWEoMTAwMCwgc2hhcGUgPSA1LCByYXRlID0gMSApIA0KDQpwdmFsdWVfMSA8LSBkYXRhLmZyYW1lKHB2YWwgPSBwdmFsdWVTYW1wbGluZyhwb3BBLCBwb3BCLCBSRVBTID0gNDA5NikpDQpBTFBIQSA8LSAwLjA1LzINCg0KZ2dwbG90KGRhdGE9cHZhbHVlXzEsIGFlcyhwdmFsKSkgKyANCiAgZ2VvbV9oaXN0b2dyYW0oYWVzKHk9Li5kZW5zaXR5Li4pLCBiaW5zPTY0LCANCiAgICAgICAgICAgICAgICAgY29sPSJvcmFuZ2UiLCBmaWxsPSJncmVlbiIpICsNCiAgZ2VvbV9kZW5zaXR5KGNvbD0icmVkIikgKw0KICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQ9QUxQSEEsIGNvbG9yPSJyZWQiKSArDQogIGxhYnModGl0bGU9IlNhbXBsaW5nIERpc3RyaWJ1dGlvbiBvZiBwLXZhbHVlcyIsIHggPSAicC12YWx1ZSIsIHkgPSAiZnJlcXVlbmN5IikgKw0KICB0aGVtZV9taW5pbWFsKDEyKQ0KDQpwcmVqZWN0MSA8LSBwLmxlc3MocHZhbHVlXzEkcHZhbCkNCm5hbWVzKHByZWplY3QxKSA8LSAiT2JzZXJ2ZWQgUG93ZXIiDQpwcmVqZWN0MQ0KDQpwb3BBMiA8LSByZ2FtbWEoMTAwMCwgc2hhcGUgPSA0LCByYXRlID0gMSkNCnBvcEIyIDwtIHJnYW1tYSgxMDAwLCBzaGFwZSA9IDYuNSwgcmF0ZSA9IDEgKSANCg0KcHZhbHVlXzIgPC0gZGF0YS5mcmFtZShwdmFsID0gcHZhbHVlU2FtcGxpbmcocG9wQTIsIHBvcEIyLCBSRVBTID0gNDA5NikpDQpBTFBIQSA8LSAwLjA1LzINCg0KZ2dwbG90KGRhdGE9cHZhbHVlXzIsIGFlcyhwdmFsKSkgKyANCiAgZ2VvbV9oaXN0b2dyYW0oYWVzKHk9Li5kZW5zaXR5Li4pLCBiaW5zPTY0LCANCiAgICAgICAgICAgICAgICAgY29sPSJvcmFuZ2UiLCBmaWxsPSJncmVlbiIpICsNCiAgZ2VvbV9kZW5zaXR5KGNvbD0icmVkIikgKw0KICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQ9QUxQSEEsIGNvbG9yPSJyZWQiKSArDQogIGxhYnModGl0bGU9IlNhbXBsaW5nIERpc3RyaWJ1dGlvbiBvZiBwLXZhbHVlcyIsIHggPSAicC12YWx1ZSIsIHkgPSAiZnJlcXVlbmN5IikgKw0KICB0aGVtZV9taW5pbWFsKDEyKQ0KDQpwcmVqZWN0MiA8LSBwLmxlc3MocHZhbHVlXzIkcHZhbCkNCm5hbWVzKHByZWplY3QyKSA8LSAiT2JzZXJ2ZWQgUG93ZXIiDQpwcmVqZWN0Mg0KDQpwb3BBMyA8LSByZ2FtbWEoMTAwMCwgc2hhcGUgPSA0LCByYXRlID0gMSkNCnBvcEIzIDwtIHJnYW1tYSgxMDAwLCBzaGFwZSA9IDcuNSwgcmF0ZSA9IDEgKSANCg0KcHZhbHVlXzMgPC0gZGF0YS5mcmFtZShwdmFsID0gcHZhbHVlU2FtcGxpbmcocG9wQTMsIHBvcEIzLCBSRVBTID0gNDA5NikpDQpBTFBIQSA8LSAwLjA1LzINCg0KZ2dwbG90KGRhdGE9cHZhbHVlXzMsIGFlcyhwdmFsKSkgKyANCiAgZ2VvbV9oaXN0b2dyYW0oYWVzKHk9Li5kZW5zaXR5Li4pLCBiaW5zPTY0LCANCiAgICAgICAgICAgICAgICAgY29sPSJvcmFuZ2UiLCBmaWxsPSJncmVlbiIpICsNCiAgZ2VvbV9kZW5zaXR5KGNvbD0icmVkIikgKw0KICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQ9QUxQSEEsIGNvbG9yPSJyZWQiKSArDQogIGxhYnModGl0bGU9IlNhbXBsaW5nIERpc3RyaWJ1dGlvbiBvZiBwLXZhbHVlcyIsIHggPSAicC12YWx1ZSIsIHkgPSAiZnJlcXVlbmN5IikgKw0KICB0aGVtZV9taW5pbWFsKDEyKQ0KDQpwcmVqZWN0MyA8LSBwLmxlc3MocHZhbHVlXzMkcHZhbCkNCm5hbWVzKHByZWplY3QzKSA8LSAiT2JzZXJ2ZWQgUG93ZXIiDQpwcmVqZWN0Mw0KDQpwdmFsdWVTYW1wbGluZyA8LSBmdW5jdGlvbihwb3BBLCBwb3BCLCBuPTksIFJFUFM9MTAwMCkgew0KICBkaXN0IDwtIGFycmF5KGRhdGE9TkEsIGRpbT1SRVBTKQ0KICBmb3IgKGkgaW4gMTpSRVBTKXsNCiAgICBBIDwtIHNhbXBsZShwb3BBLCBzaXplPW4pDQogICAgQiA8LSBzYW1wbGUocG9wQiwgc2l6ZT1uKQ0KICAgIEggPC0gdC50ZXN0KEEsIEIsIGFsdGVybmF0aXZlPSJ0d28uc2lkZWQiKSAgICANCiAgICBkaXN0W2ldIDwtIEgkcC52YWx1ZQ0KICB9DQogIHJldHVybihkaXN0KQ0KfQ0KDQpwLmxlc3MgPC0gZnVuY3Rpb24oQSwgbGltaXQ9MC4wNS8yKSB7DQogIHJldHVybiggbGVuZ3RoKEFbQSA8IGxpbWl0XSkvbGVuZ3RoKEEpICkNCn0NCg0KcG9wQTQgPC0gcmdhbW1hKDEwMDAsIHNoYXBlID0gNCwgcmF0ZSA9IDEpDQpwb3BCNCA8LSByZ2FtbWEoMTAwMCwgc2hhcGUgPSA1LCByYXRlID0gMSApIA0KDQpwdmFsdWVfNCA8LSBkYXRhLmZyYW1lKHB2YWwgPSBwdmFsdWVTYW1wbGluZyhwb3BBNCwgcG9wQjQsIFJFUFMgPSA0MDk2KSkNCkFMUEhBIDwtIDAuMDUvMg0KDQpnZ3Bsb3QoZGF0YT1wdmFsdWVfNCwgYWVzKHB2YWwpKSArIA0KICBnZW9tX2hpc3RvZ3JhbShhZXMoeT0uLmRlbnNpdHkuLiksIGJpbnM9NjQsIA0KICAgICAgICAgICAgICAgICBjb2w9Im9yYW5nZSIsIGZpbGw9ImdyZWVuIikgKw0KICBnZW9tX2RlbnNpdHkoY29sPSJyZWQiKSArDQogIGdlb21fdmxpbmUoeGludGVyY2VwdD1BTFBIQSwgY29sb3I9InJlZCIpICsNCiAgbGFicyh0aXRsZT0iU2FtcGxpbmcgRGlzdHJpYnV0aW9uIG9mIHAtdmFsdWVzIiwgeCA9ICJwLXZhbHVlIiwgeSA9ICJmcmVxdWVuY3kiKSArDQogIHRoZW1lX21pbmltYWwoMTIpDQoNCnByZWplY3Q0PC0gcC5sZXNzKHB2YWx1ZV80JHB2YWwpDQpuYW1lcyhwcmVqZWN0NCkgPC0gIk9ic2VydmVkIFBvd2VyIg0KcHJlamVjdDQNCmBgYA0KTXVjaCBsaWtlIGEgbm9ybWFsIGRpc3RyaWJ1dGlvbiwgYSBnYW1tYSBkaXN0cmlidXRpb24gYWxzbyBpbmNyZWFzZXMgYXMgdGhlIENvaGVuJ3MgRCB2YWx1ZSBpbmNyZWFzZXMuIFdlIGFsc28gc2VlIHRoYXQgZGVjcmVhc2luZyBzYW1wbGUgc2l6ZSwgYWxzbyBkZWNyZWFzZXMgdGhlIG9ic2VydmVkIHBvd2VyLg0KLi4uDQoNCg==