library(tidyverse)
library(openintro)
library(infer)

The Unknown Sampling Distribution

global_monitor <- tibble(
  scientist_work = c(rep("Benefits", 80000), rep("Doesn't benefit", 20000))
)
ggplot(global_monitor, aes(x = scientist_work)) +
  geom_bar() +
  labs(
    x = "", y = "",
    title = "Do you believe that the work scientists do benefit people like you?"
  ) +
  coord_flip() 

global_monitor %>%
  count(scientist_work) %>%
  mutate(p = n /sum(n))
## # A tibble: 2 Ă— 3
##   scientist_work      n     p
##   <chr>           <int> <dbl>
## 1 Benefits        80000   0.8
## 2 Doesn't benefit 20000   0.2
# sample with no replacement
samp1 <- global_monitor %>%
  sample_n(50)
samp1
## # A tibble: 50 Ă— 1
##    scientist_work 
##    <chr>          
##  1 Doesn't benefit
##  2 Doesn't benefit
##  3 Benefits       
##  4 Doesn't benefit
##  5 Doesn't benefit
##  6 Benefits       
##  7 Doesn't benefit
##  8 Doesn't benefit
##  9 Benefits       
## 10 Benefits       
## # … with 40 more rows
table(samp1$scientist_work)
## 
##        Benefits Doesn't benefit 
##              37              13
#find out the sample mean
samp1 %>%
  count(scientist_work) %>%
  mutate(p_hat = n /sum(n))
## # A tibble: 2 Ă— 3
##   scientist_work      n p_hat
##   <chr>           <int> <dbl>
## 1 Benefits           37  0.74
## 2 Doesn't benefit    13  0.26

Exercise 1

Describe the distribution of responses in the sample. How does it compare to the distribution of responses in the population?

samp_monitor <- tibble(samp1 = c(rep("Benefits", 38), rep("Doesn't benefit", 12)))
ggplot(samp_monitor, aes(x = samp1)) +
  geom_bar() +
  labs(
    x = "", y = "",
    title = "Do you believe that the work scientists do benefit people like you?"
  ) +
  coord_flip()

samp_monitor %>%
  count(samp1) %>%
  mutate(p_hat = n / sum(n))
## # A tibble: 2 Ă— 3
##   samp1               n p_hat
##   <chr>           <int> <dbl>
## 1 Benefits           38  0.76
## 2 Doesn't benefit    12  0.24

The sample size is small but the estimation of population mean is quite the same.

Exercise 2

Would you expect the sample proportion to match the sample proportion of another student’s sample? Why or Why not? If the answer is no, would you expect the proportionas to be somewhat different or very different?

Answer. No, Because the sample size 50 from a huge population is significantly small and gets different distrubution responses.

Exercise 3

set.seed(10000)
samp2 <- global_monitor %>%
  sample_n(100)

table(samp2$scientist_work)
## 
##        Benefits Doesn't benefit 
##              82              18
samp2 %>%
  count(scientist_work) %>%
  mutate(p2 = n/sum(n))
## # A tibble: 2 Ă— 3
##   scientist_work      n    p2
##   <chr>           <int> <dbl>
## 1 Benefits           82  0.82
## 2 Doesn't benefit    18  0.18
ggplot(samp2, aes(x = scientist_work)) +
    geom_bar(position = position_dodge(), width = 0.5, fill = "blue" ) +
    coord_flip() + 
    ggtitle("Do you believe that the work scientists do benefit people like you from sample 0f 100?") +
    xlab("Element of study") + ylab("sample2")

The second sample is closely similar to the first one. I would expect the larger sample size to represent accuate distribution of more dense population.

Exercise 4

How many elements are there in sample_props50? Describe the sampling distribution, and be sure to specifically note its center. Make sure to include a plot of distribution in your answer There are 15,000 elements in sample_props50 vector. The sampling distribution is built to find out the proportion of “Doesn’t Benefit” response for each element with size of 50. According to the histogram, the mean sample proportion is by 0.2 that is the same with population 0.18.

sample_props50 <-global_monitor %>%
  infer::rep_sample_n(size = 50, reps = 15000, replace = TRUE) %>%
  count(scientist_work) %>%
  mutate(p_hat = n /sum(n)) %>%
  filter(scientist_work == "Doesn't benefit")
ggplot(data = sample_props50, aes(x = p_hat)) + 
  geom_histogram(binwidth = 0.02) + 
  labs(
    x = "p_hat (Doesn't Benefit) ", 
    title = "Sampling distribution of p_hat", 
    subtitle = "Sample size = 50, Number of sample = 15000"
    )

Exercise 5

To make sure you understand how sampling distributions are built, and exactly what the rep_sample_n function does, try modifying the code to create a sampling distribution of 25 sample proportions from samples of size 10, and put them in a data frame named sample_props_small. Print the output. How many observations are there in this object called sample_porps_small? What does each observation represent?

There are 23 observations in this sample_props_small object. Each of them represents sample proportions of “Doesn’t benefit” from samples size.

sample_props_small <- global_monitor %>%
  infer::rep_sample_n(size = 10, reps = 25, replace = TRUE) %>%
  count(scientist_work)%>%
  mutate(p_hat = n / sum(n)) %>%
  filter(scientist_work == "Doesn't benefit")
sample_props_small
## # A tibble: 23 Ă— 4
## # Groups:   replicate [23]
##    replicate scientist_work      n p_hat
##        <int> <chr>           <int> <dbl>
##  1         1 Doesn't benefit     2   0.2
##  2         2 Doesn't benefit     1   0.1
##  3         3 Doesn't benefit     1   0.1
##  4         4 Doesn't benefit     3   0.3
##  5         5 Doesn't benefit     1   0.1
##  6         6 Doesn't benefit     1   0.1
##  7         7 Doesn't benefit     2   0.2
##  8         9 Doesn't benefit     2   0.2
##  9        10 Doesn't benefit     3   0.3
## 10        11 Doesn't benefit     2   0.2
## # … with 13 more rows

Exercise 6

Use the app below to create sampling distributions of proportions of Doesn’t benefit from samples of size 10, 50, and 100. Use 5,000 simulations. What does each observation in the sampling distribution represent? According to the summary statistics, the mean, standard error and shape of the sampling distribution is generally decreases as the sample size increase. But, the medium value is no change no matter how many times simulation run and the mean remains approximately the same if we increase the number of sample size and simulation times.

ggplot(data = sample_props50, aes(x = p_hat)) +
  geom_histogram(binwidth = 0.02)

sample_props10 <- global_monitor %>%
  infer::rep_sample_n(size = 10, reps = 5000, replace = TRUE) %>%
  count(scientist_work)%>%
  mutate(p_hat = n / sum(n)) %>%
  filter(scientist_work == "Doesn't benefit")
ggplot(data = sample_props10, aes(x = p_hat)) +
  geom_histogram(binwidth = 0.02) + 
  labs(
    x = "p_hat (Doesn't Benefit) ", 
    title = "Sampling distribution of p_hat", 
    subtitle = "Sample size = 10, Number of sample = 5000")

summary(sample_props10)
##    replicate    scientist_work           n             p_hat       
##  Min.   :   1   Length:4469        Min.   :1.000   Min.   :0.1000  
##  1st Qu.:1250   Class :character   1st Qu.:1.000   1st Qu.:0.1000  
##  Median :2498   Mode  :character   Median :2.000   Median :0.2000  
##  Mean   :2497                      Mean   :2.234   Mean   :0.2234  
##  3rd Qu.:3750                      3rd Qu.:3.000   3rd Qu.:0.3000  
##  Max.   :5000                      Max.   :8.000   Max.   :0.8000
sample_props10 <- global_monitor %>%
  infer::rep_sample_n(size = 50, reps = 5000, replace = TRUE) %>%
  count(scientist_work)%>%
  mutate(p_hat = n / sum(n)) %>%
  filter(scientist_work == "Doesn't benefit")
summary(sample_props50)
##    replicate     scientist_work           n              p_hat       
##  Min.   :    1   Length:15000       Min.   : 2.000   Min.   :0.0400  
##  1st Qu.: 3751   Class :character   1st Qu.: 8.000   1st Qu.:0.1600  
##  Median : 7500   Mode  :character   Median :10.000   Median :0.2000  
##  Mean   : 7500                      Mean   : 9.954   Mean   :0.1991  
##  3rd Qu.:11250                      3rd Qu.:12.000   3rd Qu.:0.2400  
##  Max.   :15000                      Max.   :23.000   Max.   :0.4600
sample_props100 <- global_monitor %>%
  infer::rep_sample_n(size = 100, reps = 5000, replace = TRUE) %>%
  count(scientist_work)%>%
  mutate(p_hat = n / sum(n)) %>%
  filter(scientist_work == "Doesn't benefit")
summary(sample_props100)
##    replicate    scientist_work           n             p_hat       
##  Min.   :   1   Length:5000        Min.   : 7.00   Min.   :0.0700  
##  1st Qu.:1251   Class :character   1st Qu.:17.00   1st Qu.:0.1700  
##  Median :2500   Mode  :character   Median :20.00   Median :0.2000  
##  Mean   :2500                      Mean   :19.98   Mean   :0.1998  
##  3rd Qu.:3750                      3rd Qu.:23.00   3rd Qu.:0.2300  
##  Max.   :5000                      Max.   :35.00   Max.   :0.3500

Exercise 7

Take a sample of size 15 from population and calculate the proportion of people in this sample who think the work scientists do enhances their lives. Using this sample, what is your best point estimate of the population of people who think the work scientists do enhances their lives?

The 80 % of population proportion of people think the work scientists do benefit for them.

samp3 <- global_monitor %>%
  sample_n(15)

samp3 %>%
  count(scientist_work) %>%
  mutate(p3 = n /sum(n))
## # A tibble: 2 Ă— 3
##   scientist_work      n    p3
##   <chr>           <int> <dbl>
## 1 Benefits           13 0.867
## 2 Doesn't benefit     2 0.133

Exercise 8

Since you have access to the population, simulate the sampling distribution of proportion of those who think the work scientists do enhances their lives for sample size of 15 by taking 2000 samples from population of size 15 and computing 2000 sample proportions. Store these proporitons in as sample_props15. Plot the data, then describe the shape of this sampling distribution. Based on this sampling distribution, what would you guess the true proportion of those who think the work scientists do enhances their lives to be? Finally, calculate and report the population proportion.

sample_pros15 <- global_monitor %>%
  infer::rep_sample_n(size = 15, reps = 2000, replace = TRUE) %>%
  count(scientist_work) %>%
  mutate(p3 = n / sum(n)) %>%
  filter(scientist_work == "Benefits")
ggplot(data = sample_pros15, aes(x = p3)) +
  geom_histogram(binwidth = 0.02) + 
  labs(
    x = "p3 (Benefits)",
    title = "Sampling distribution of p3",
    subtitle = "Sample Sizse = 15, Number of samples = 2000"
  )

summary(sample_pros15)
##    replicate      scientist_work           n               p3        
##  Min.   :   1.0   Length:2000        Min.   : 6.00   Min.   :0.4000  
##  1st Qu.: 500.8   Class :character   1st Qu.:11.00   1st Qu.:0.7333  
##  Median :1000.5   Mode  :character   Median :12.00   Median :0.8000  
##  Mean   :1000.5                      Mean   :12.01   Mean   :0.8008  
##  3rd Qu.:1500.2                      3rd Qu.:13.00   3rd Qu.:0.8667  
##  Max.   :2000.0                      Max.   :15.00   Max.   :1.0000
mean(sample_pros15$p3)
## [1] 0.8008

Exercise 9

Change your sample size from 15 to 150, then compute the sampling distribution using the same method as above, and store these proportions in a new object called sample_props150. Describe the shape of this sampling distribution and compare it to the sampling distribution for a sample size of 15. Based on this sample distribution, what would you guess to be the true proportion of those who think the work scientists do enhances their lives?

sample_pros150 <- global_monitor %>%
  infer::rep_sample_n(size = 150, reps = 2000, replace = TRUE) %>%
  count(scientist_work) %>%
  mutate(p4 = n / sum(n)) %>%
  filter(scientist_work == "Benefits")
ggplot(data = sample_pros150, aes(x = p4)) +
  geom_histogram(binwidth = 0.02) + 
  labs(
    x = "p4 (Benefits)",
    title = "Sampling distribution of people who believe scientist work benefits",
    subtitle = "Sample Sizse = 150, Number of samples = 2000"
  )

summary(sample_pros150)
##    replicate      scientist_work           n               p4        
##  Min.   :   1.0   Length:2000        Min.   :104.0   Min.   :0.6933  
##  1st Qu.: 500.8   Class :character   1st Qu.:117.0   1st Qu.:0.7800  
##  Median :1000.5   Mode  :character   Median :120.0   Median :0.8000  
##  Mean   :1000.5                      Mean   :120.1   Mean   :0.8010  
##  3rd Qu.:1500.2                      3rd Qu.:124.0   3rd Qu.:0.8267  
##  Max.   :2000.0                      Max.   :137.0   Max.   :0.9133
mean(sample_pros150$p4)
## [1] 0.8009767

Exercise 10

On the sampling distributions from 2 and 3, which has a smaller spread? If you’re connected with making estimates that are more often close to the true value, would you prefer a sampling distribution with a large or small spread?

A larger sample size has a smaller spread of sampling distribution that is much closer to the true value because standard deviation is getting smaller and proportion of population matches to the mean.

LS0tCnRpdGxlOiAiTGFiIDU6IEZvdW5kYXRpb24gZm9yIFN0YXRpc3RpY2FsIGluZmVyZW5jZSAtIFNhbXBsaW5nIGRpc3RyaWJ1dGlvbiIKYXV0aG9yOiAiTHdpbiBOYW5kYXIgU2h3ZSIKZGF0ZTogImBBcHIgMSAyMDIzYCIKb3V0cHV0OiBvcGVuaW50cm86OmxhYl9yZXBvcnQKLS0tCgpgYGB7ciBsb2FkLXBhY2thZ2VzLCBtZXNzYWdlPUZBTFNFfQpsaWJyYXJ5KHRpZHl2ZXJzZSkKbGlicmFyeShvcGVuaW50cm8pCmxpYnJhcnkoaW5mZXIpCmBgYAoKIyMjIFRoZSBVbmtub3duIFNhbXBsaW5nIERpc3RyaWJ1dGlvbgoKYGBge3Igdmlldy1naXJscy1jb3VudHN9Cmdsb2JhbF9tb25pdG9yIDwtIHRpYmJsZSgKICBzY2llbnRpc3Rfd29yayA9IGMocmVwKCJCZW5lZml0cyIsIDgwMDAwKSwgcmVwKCJEb2Vzbid0IGJlbmVmaXQiLCAyMDAwMCkpCikKZ2dwbG90KGdsb2JhbF9tb25pdG9yLCBhZXMoeCA9IHNjaWVudGlzdF93b3JrKSkgKwogIGdlb21fYmFyKCkgKwogIGxhYnMoCiAgICB4ID0gIiIsIHkgPSAiIiwKICAgIHRpdGxlID0gIkRvIHlvdSBiZWxpZXZlIHRoYXQgdGhlIHdvcmsgc2NpZW50aXN0cyBkbyBiZW5lZml0IHBlb3BsZSBsaWtlIHlvdT8iCiAgKSArCiAgY29vcmRfZmxpcCgpIApnbG9iYWxfbW9uaXRvciAlPiUKICBjb3VudChzY2llbnRpc3Rfd29yaykgJT4lCiAgbXV0YXRlKHAgPSBuIC9zdW0obikpCiMgc2FtcGxlIHdpdGggbm8gcmVwbGFjZW1lbnQKc2FtcDEgPC0gZ2xvYmFsX21vbml0b3IgJT4lCiAgc2FtcGxlX24oNTApCnNhbXAxCnRhYmxlKHNhbXAxJHNjaWVudGlzdF93b3JrKQoKI2ZpbmQgb3V0IHRoZSBzYW1wbGUgbWVhbgpzYW1wMSAlPiUKICBjb3VudChzY2llbnRpc3Rfd29yaykgJT4lCiAgbXV0YXRlKHBfaGF0ID0gbiAvc3VtKG4pKQpgYGAKCgojIyMgRXhlcmNpc2UgMQoKRGVzY3JpYmUgdGhlIGRpc3RyaWJ1dGlvbiBvZiByZXNwb25zZXMgaW4gdGhlIHNhbXBsZS4gSG93IGRvZXMgaXQgY29tcGFyZSB0byB0aGUgZGlzdHJpYnV0aW9uIG9mIHJlc3BvbnNlcyBpbiB0aGUgcG9wdWxhdGlvbj8KCmBgYHtyIHZpc3VhbGl6ZS1zYW1wbGUtZGlzdHJpYnV0aW9ufQoKc2FtcF9tb25pdG9yIDwtIHRpYmJsZShzYW1wMSA9IGMocmVwKCJCZW5lZml0cyIsIDM4KSwgcmVwKCJEb2Vzbid0IGJlbmVmaXQiLCAxMikpKQpnZ3Bsb3Qoc2FtcF9tb25pdG9yLCBhZXMoeCA9IHNhbXAxKSkgKwogIGdlb21fYmFyKCkgKwogIGxhYnMoCiAgICB4ID0gIiIsIHkgPSAiIiwKICAgIHRpdGxlID0gIkRvIHlvdSBiZWxpZXZlIHRoYXQgdGhlIHdvcmsgc2NpZW50aXN0cyBkbyBiZW5lZml0IHBlb3BsZSBsaWtlIHlvdT8iCiAgKSArCiAgY29vcmRfZmxpcCgpCnNhbXBfbW9uaXRvciAlPiUKICBjb3VudChzYW1wMSkgJT4lCiAgbXV0YXRlKHBfaGF0ID0gbiAvIHN1bShuKSkKYGBgClRoZSBzYW1wbGUgc2l6ZSBpcyBzbWFsbCBidXQgdGhlIGVzdGltYXRpb24gb2YgcG9wdWxhdGlvbiBtZWFuIGlzIHF1aXRlIHRoZSBzYW1lLgoKIyMjIEV4ZXJjaXNlIDIKCldvdWxkIHlvdSBleHBlY3QgdGhlIHNhbXBsZSBwcm9wb3J0aW9uIHRvIG1hdGNoIHRoZSBzYW1wbGUgcHJvcG9ydGlvbiBvZiBhbm90aGVyIHN0dWRlbnQncyBzYW1wbGU/IFdoeSBvciBXaHkgbm90PyBJZiB0aGUgYW5zd2VyIGlzIG5vLCB3b3VsZCB5b3UgZXhwZWN0IHRoZSBwcm9wb3J0aW9uYXMgdG8gYmUgc29tZXdoYXQgZGlmZmVyZW50IG9yIHZlcnkgZGlmZmVyZW50PwoKQW5zd2VyLiBObywgQmVjYXVzZSB0aGUgc2FtcGxlIHNpemUgNTAgZnJvbSBhIGh1Z2UgcG9wdWxhdGlvbiBpcyBzaWduaWZpY2FudGx5IHNtYWxsIGFuZCBnZXRzIGRpZmZlcmVudCBkaXN0cnVidXRpb24gcmVzcG9uc2VzLgoKIyMjIEV4ZXJjaXNlIDMKCmBgYHtyIHBvcHVsYXRpb24tcHJvcG9ydGlvbn0Kc2V0LnNlZWQoMTAwMDApCnNhbXAyIDwtIGdsb2JhbF9tb25pdG9yICU+JQogIHNhbXBsZV9uKDEwMCkKCnRhYmxlKHNhbXAyJHNjaWVudGlzdF93b3JrKQoKc2FtcDIgJT4lCiAgY291bnQoc2NpZW50aXN0X3dvcmspICU+JQogIG11dGF0ZShwMiA9IG4vc3VtKG4pKQoKZ2dwbG90KHNhbXAyLCBhZXMoeCA9IHNjaWVudGlzdF93b3JrKSkgKwogICAgZ2VvbV9iYXIocG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSgpLCB3aWR0aCA9IDAuNSwgZmlsbCA9ICJibHVlIiApICsKICAgIGNvb3JkX2ZsaXAoKSArIAogICAgZ2d0aXRsZSgiRG8geW91IGJlbGlldmUgdGhhdCB0aGUgd29yayBzY2llbnRpc3RzIGRvIGJlbmVmaXQgcGVvcGxlIGxpa2UgeW91IGZyb20gc2FtcGxlIDBmIDEwMD8iKSArCiAgICB4bGFiKCJFbGVtZW50IG9mIHN0dWR5IikgKyB5bGFiKCJzYW1wbGUyIikKYGBgClRoZSBzZWNvbmQgc2FtcGxlIGlzIGNsb3NlbHkgc2ltaWxhciB0byB0aGUgZmlyc3Qgb25lLiBJIHdvdWxkIGV4cGVjdCB0aGUgbGFyZ2VyIHNhbXBsZSBzaXplIHRvIHJlcHJlc2VudCBhY2N1YXRlIGRpc3RyaWJ1dGlvbiBvZiBtb3JlIGRlbnNlIHBvcHVsYXRpb24uCgojIyMgRXhlcmNpc2UgNAoKSG93IG1hbnkgZWxlbWVudHMgYXJlIHRoZXJlIGluIHNhbXBsZV9wcm9wczUwPyBEZXNjcmliZSB0aGUgc2FtcGxpbmcgZGlzdHJpYnV0aW9uLCBhbmQgYmUgc3VyZSB0byBzcGVjaWZpY2FsbHkgbm90ZSBpdHMgY2VudGVyLiBNYWtlIHN1cmUgdG8gaW5jbHVkZSBhIHBsb3Qgb2YgZGlzdHJpYnV0aW9uIGluIHlvdXIgYW5zd2VyClRoZXJlIGFyZSAxNSwwMDAgZWxlbWVudHMgaW4gc2FtcGxlX3Byb3BzNTAgdmVjdG9yLiBUaGUgc2FtcGxpbmcgZGlzdHJpYnV0aW9uIGlzIGJ1aWx0IHRvIGZpbmQgb3V0IHRoZSBwcm9wb3J0aW9uIG9mICJEb2Vzbid0IEJlbmVmaXQiIHJlc3BvbnNlIGZvciBlYWNoIGVsZW1lbnQgd2l0aCBzaXplIG9mIDUwLiBBY2NvcmRpbmcgdG8gdGhlIGhpc3RvZ3JhbSwgdGhlIG1lYW4gc2FtcGxlIHByb3BvcnRpb24gaXMgYnkgMC4yIHRoYXQgaXMgdGhlIHNhbWUgd2l0aCBwb3B1bGF0aW9uIDAuMTguIAoKYGBge3IgZmluZC1lbGVtZW50c30Kc2FtcGxlX3Byb3BzNTAgPC1nbG9iYWxfbW9uaXRvciAlPiUKICBpbmZlcjo6cmVwX3NhbXBsZV9uKHNpemUgPSA1MCwgcmVwcyA9IDE1MDAwLCByZXBsYWNlID0gVFJVRSkgJT4lCiAgY291bnQoc2NpZW50aXN0X3dvcmspICU+JQogIG11dGF0ZShwX2hhdCA9IG4gL3N1bShuKSkgJT4lCiAgZmlsdGVyKHNjaWVudGlzdF93b3JrID09ICJEb2Vzbid0IGJlbmVmaXQiKQpnZ3Bsb3QoZGF0YSA9IHNhbXBsZV9wcm9wczUwLCBhZXMoeCA9IHBfaGF0KSkgKyAKICBnZW9tX2hpc3RvZ3JhbShiaW53aWR0aCA9IDAuMDIpICsgCiAgbGFicygKICAgIHggPSAicF9oYXQgKERvZXNuJ3QgQmVuZWZpdCkgIiwgCiAgICB0aXRsZSA9ICJTYW1wbGluZyBkaXN0cmlidXRpb24gb2YgcF9oYXQiLCAKICAgIHN1YnRpdGxlID0gIlNhbXBsZSBzaXplID0gNTAsIE51bWJlciBvZiBzYW1wbGUgPSAxNTAwMCIKICAgICkKYGBgCgoKIyMjIEV4ZXJjaXNlIDUKClRvIG1ha2Ugc3VyZSB5b3UgdW5kZXJzdGFuZCBob3cgc2FtcGxpbmcgZGlzdHJpYnV0aW9ucyBhcmUgYnVpbHQsIGFuZCBleGFjdGx5IHdoYXQgdGhlIHJlcF9zYW1wbGVfbiBmdW5jdGlvbiBkb2VzLCB0cnkgbW9kaWZ5aW5nIHRoZSBjb2RlIHRvIGNyZWF0ZSBhIHNhbXBsaW5nIGRpc3RyaWJ1dGlvbiBvZiAyNSBzYW1wbGUgcHJvcG9ydGlvbnMgZnJvbSBzYW1wbGVzIG9mIHNpemUgMTAsIGFuZCBwdXQgdGhlbSBpbiBhIGRhdGEgZnJhbWUgbmFtZWQgc2FtcGxlX3Byb3BzX3NtYWxsLiBQcmludCB0aGUgb3V0cHV0LiBIb3cgbWFueSBvYnNlcnZhdGlvbnMgYXJlIHRoZXJlIGluIHRoaXMgb2JqZWN0IGNhbGxlZCBzYW1wbGVfcG9ycHNfc21hbGw/IFdoYXQgZG9lcyBlYWNoIG9ic2VydmF0aW9uIHJlcHJlc2VudD8KClRoZXJlIGFyZSAyMyBvYnNlcnZhdGlvbnMgaW4gdGhpcyBzYW1wbGVfcHJvcHNfc21hbGwgb2JqZWN0LiBFYWNoIG9mIHRoZW0gcmVwcmVzZW50cyBzYW1wbGUgcHJvcG9ydGlvbnMgb2YgIkRvZXNuJ3QgYmVuZWZpdCIgZnJvbSBzYW1wbGVzIHNpemUuCgpgYGB7ciBpbnRlcmx1ZGUtc2FtcC1kaXN0cmlidXRpb259CnNhbXBsZV9wcm9wc19zbWFsbCA8LSBnbG9iYWxfbW9uaXRvciAlPiUKICBpbmZlcjo6cmVwX3NhbXBsZV9uKHNpemUgPSAxMCwgcmVwcyA9IDI1LCByZXBsYWNlID0gVFJVRSkgJT4lCiAgY291bnQoc2NpZW50aXN0X3dvcmspJT4lCiAgbXV0YXRlKHBfaGF0ID0gbiAvIHN1bShuKSkgJT4lCiAgZmlsdGVyKHNjaWVudGlzdF93b3JrID09ICJEb2Vzbid0IGJlbmVmaXQiKQpzYW1wbGVfcHJvcHNfc21hbGwKYGBgCgoKIyMjIEV4ZXJjaXNlIDYKClVzZSB0aGUgYXBwIGJlbG93IHRvIGNyZWF0ZSBzYW1wbGluZyBkaXN0cmlidXRpb25zIG9mIHByb3BvcnRpb25zIG9mIERvZXNuJ3QgYmVuZWZpdCBmcm9tIHNhbXBsZXMgb2Ygc2l6ZSAxMCwgNTAsIGFuZCAxMDAuIFVzZSA1LDAwMCBzaW11bGF0aW9ucy4gV2hhdCBkb2VzIGVhY2ggb2JzZXJ2YXRpb24gaW4gdGhlIHNhbXBsaW5nIGRpc3RyaWJ1dGlvbiByZXByZXNlbnQ/IApBY2NvcmRpbmcgdG8gdGhlIHN1bW1hcnkgc3RhdGlzdGljcywgdGhlIG1lYW4sIHN0YW5kYXJkIGVycm9yIGFuZCBzaGFwZSBvZiB0aGUgc2FtcGxpbmcgZGlzdHJpYnV0aW9uIGlzIGdlbmVyYWxseSBkZWNyZWFzZXMgYXMgdGhlIHNhbXBsZSBzaXplIGluY3JlYXNlLiBCdXQsIHRoZSBtZWRpdW0gdmFsdWUgaXMgbm8gY2hhbmdlIG5vIG1hdHRlciBob3cgbWFueSB0aW1lcyBzaW11bGF0aW9uIHJ1biBhbmQgdGhlIG1lYW4gcmVtYWlucyBhcHByb3hpbWF0ZWx5IHRoZSBzYW1lIGlmIHdlIGluY3JlYXNlIHRoZSBudW1iZXIgb2Ygc2FtcGxlIHNpemUgYW5kIHNpbXVsYXRpb24gdGltZXMuCgpgYGB7ciBzYW1wbGVfc2l6ZS1kaXN0cmlidXRpb259CmdncGxvdChkYXRhID0gc2FtcGxlX3Byb3BzNTAsIGFlcyh4ID0gcF9oYXQpKSArCiAgZ2VvbV9oaXN0b2dyYW0oYmlud2lkdGggPSAwLjAyKQoKc2FtcGxlX3Byb3BzMTAgPC0gZ2xvYmFsX21vbml0b3IgJT4lCiAgaW5mZXI6OnJlcF9zYW1wbGVfbihzaXplID0gMTAsIHJlcHMgPSA1MDAwLCByZXBsYWNlID0gVFJVRSkgJT4lCiAgY291bnQoc2NpZW50aXN0X3dvcmspJT4lCiAgbXV0YXRlKHBfaGF0ID0gbiAvIHN1bShuKSkgJT4lCiAgZmlsdGVyKHNjaWVudGlzdF93b3JrID09ICJEb2Vzbid0IGJlbmVmaXQiKQpnZ3Bsb3QoZGF0YSA9IHNhbXBsZV9wcm9wczEwLCBhZXMoeCA9IHBfaGF0KSkgKwogIGdlb21faGlzdG9ncmFtKGJpbndpZHRoID0gMC4wMikgKyAKICBsYWJzKAogICAgeCA9ICJwX2hhdCAoRG9lc24ndCBCZW5lZml0KSAiLCAKICAgIHRpdGxlID0gIlNhbXBsaW5nIGRpc3RyaWJ1dGlvbiBvZiBwX2hhdCIsIAogICAgc3VidGl0bGUgPSAiU2FtcGxlIHNpemUgPSAxMCwgTnVtYmVyIG9mIHNhbXBsZSA9IDUwMDAiKQpzdW1tYXJ5KHNhbXBsZV9wcm9wczEwKQoKc2FtcGxlX3Byb3BzMTAgPC0gZ2xvYmFsX21vbml0b3IgJT4lCiAgaW5mZXI6OnJlcF9zYW1wbGVfbihzaXplID0gNTAsIHJlcHMgPSA1MDAwLCByZXBsYWNlID0gVFJVRSkgJT4lCiAgY291bnQoc2NpZW50aXN0X3dvcmspJT4lCiAgbXV0YXRlKHBfaGF0ID0gbiAvIHN1bShuKSkgJT4lCiAgZmlsdGVyKHNjaWVudGlzdF93b3JrID09ICJEb2Vzbid0IGJlbmVmaXQiKQpzdW1tYXJ5KHNhbXBsZV9wcm9wczUwKQoKc2FtcGxlX3Byb3BzMTAwIDwtIGdsb2JhbF9tb25pdG9yICU+JQogIGluZmVyOjpyZXBfc2FtcGxlX24oc2l6ZSA9IDEwMCwgcmVwcyA9IDUwMDAsIHJlcGxhY2UgPSBUUlVFKSAlPiUKICBjb3VudChzY2llbnRpc3Rfd29yayklPiUKICBtdXRhdGUocF9oYXQgPSBuIC8gc3VtKG4pKSAlPiUKICBmaWx0ZXIoc2NpZW50aXN0X3dvcmsgPT0gIkRvZXNuJ3QgYmVuZWZpdCIpCnN1bW1hcnkoc2FtcGxlX3Byb3BzMTAwKQpgYGAKCgojIyMgRXhlcmNpc2UgNwoKVGFrZSBhIHNhbXBsZSBvZiBzaXplIDE1IGZyb20gcG9wdWxhdGlvbiBhbmQgY2FsY3VsYXRlIHRoZSBwcm9wb3J0aW9uIG9mIHBlb3BsZSBpbiB0aGlzIHNhbXBsZSB3aG8gdGhpbmsgdGhlIHdvcmsgc2NpZW50aXN0cyBkbyBlbmhhbmNlcyB0aGVpciBsaXZlcy4gVXNpbmcgdGhpcyBzYW1wbGUsIHdoYXQgaXMgeW91ciBiZXN0IHBvaW50IGVzdGltYXRlIG9mIHRoZSBwb3B1bGF0aW9uIG9mIHBlb3BsZSB3aG8gdGhpbmsgdGhlIHdvcmsgc2NpZW50aXN0cyBkbyBlbmhhbmNlcyB0aGVpciBsaXZlcz8KClRoZSA4MCAlIG9mIHBvcHVsYXRpb24gcHJvcG9ydGlvbiBvZiBwZW9wbGUgdGhpbmsgdGhlIHdvcmsgc2NpZW50aXN0cyBkbyBiZW5lZml0IGZvciB0aGVtLgoKYGBge3IgZmluZC1zY2llbmNlLWJlbmlmaXR9CnNhbXAzIDwtIGdsb2JhbF9tb25pdG9yICU+JQogIHNhbXBsZV9uKDE1KQoKc2FtcDMgJT4lCiAgY291bnQoc2NpZW50aXN0X3dvcmspICU+JQogIG11dGF0ZShwMyA9IG4gL3N1bShuKSkKYGBgCgojIyMgRXhlcmNpc2UgOAoKU2luY2UgeW91IGhhdmUgYWNjZXNzIHRvIHRoZSBwb3B1bGF0aW9uLCBzaW11bGF0ZSB0aGUgc2FtcGxpbmcgZGlzdHJpYnV0aW9uIG9mIHByb3BvcnRpb24gb2YgdGhvc2Ugd2hvIHRoaW5rIHRoZSB3b3JrIHNjaWVudGlzdHMgZG8gZW5oYW5jZXMgdGhlaXIgbGl2ZXMgZm9yIHNhbXBsZSBzaXplIG9mIDE1IGJ5IHRha2luZyAyMDAwIHNhbXBsZXMgZnJvbSBwb3B1bGF0aW9uIG9mIHNpemUgMTUgYW5kIGNvbXB1dGluZyAyMDAwIHNhbXBsZSBwcm9wb3J0aW9ucy4gU3RvcmUgdGhlc2UgcHJvcG9yaXRvbnMgaW4gYXMgc2FtcGxlX3Byb3BzMTUuIFBsb3QgdGhlIGRhdGEsIHRoZW4gZGVzY3JpYmUgdGhlIHNoYXBlIG9mIHRoaXMgc2FtcGxpbmcgZGlzdHJpYnV0aW9uLiBCYXNlZCBvbiB0aGlzIHNhbXBsaW5nIGRpc3RyaWJ1dGlvbiwgd2hhdCB3b3VsZCB5b3UgZ3Vlc3MgdGhlIHRydWUgcHJvcG9ydGlvbiBvZiB0aG9zZSB3aG8gdGhpbmsgdGhlIHdvcmsgc2NpZW50aXN0cyBkbyBlbmhhbmNlcyB0aGVpciBsaXZlcyB0byBiZT8gRmluYWxseSwgY2FsY3VsYXRlIGFuZCByZXBvcnQgdGhlIHBvcHVsYXRpb24gcHJvcG9ydGlvbi4KCmBgYHtyIHNjaWVuY2Utd29ya30Kc2FtcGxlX3Byb3MxNSA8LSBnbG9iYWxfbW9uaXRvciAlPiUKICBpbmZlcjo6cmVwX3NhbXBsZV9uKHNpemUgPSAxNSwgcmVwcyA9IDIwMDAsIHJlcGxhY2UgPSBUUlVFKSAlPiUKICBjb3VudChzY2llbnRpc3Rfd29yaykgJT4lCiAgbXV0YXRlKHAzID0gbiAvIHN1bShuKSkgJT4lCiAgZmlsdGVyKHNjaWVudGlzdF93b3JrID09ICJCZW5lZml0cyIpCmdncGxvdChkYXRhID0gc2FtcGxlX3Byb3MxNSwgYWVzKHggPSBwMykpICsKICBnZW9tX2hpc3RvZ3JhbShiaW53aWR0aCA9IDAuMDIpICsgCiAgbGFicygKICAgIHggPSAicDMgKEJlbmVmaXRzKSIsCiAgICB0aXRsZSA9ICJTYW1wbGluZyBkaXN0cmlidXRpb24gb2YgcDMiLAogICAgc3VidGl0bGUgPSAiU2FtcGxlIFNpenNlID0gMTUsIE51bWJlciBvZiBzYW1wbGVzID0gMjAwMCIKICApCnN1bW1hcnkoc2FtcGxlX3Byb3MxNSkKbWVhbihzYW1wbGVfcHJvczE1JHAzKQpgYGAKCgojIyMgRXhlcmNpc2UgOQoKQ2hhbmdlIHlvdXIgc2FtcGxlIHNpemUgZnJvbSAxNSB0byAxNTAsIHRoZW4gY29tcHV0ZSB0aGUgc2FtcGxpbmcgZGlzdHJpYnV0aW9uIHVzaW5nIHRoZSBzYW1lIG1ldGhvZCBhcyBhYm92ZSwgYW5kIHN0b3JlIHRoZXNlIHByb3BvcnRpb25zIGluIGEgbmV3IG9iamVjdCBjYWxsZWQgc2FtcGxlX3Byb3BzMTUwLiBEZXNjcmliZSB0aGUgc2hhcGUgb2YgdGhpcyBzYW1wbGluZyBkaXN0cmlidXRpb24gYW5kIGNvbXBhcmUgaXQgdG8gdGhlIHNhbXBsaW5nIGRpc3RyaWJ1dGlvbiBmb3IgYSBzYW1wbGUgc2l6ZSBvZiAxNS4gQmFzZWQgb24gdGhpcyBzYW1wbGUgZGlzdHJpYnV0aW9uLCB3aGF0IHdvdWxkIHlvdSBndWVzcyB0byBiZSB0aGUgdHJ1ZSBwcm9wb3J0aW9uIG9mIHRob3NlIHdobyB0aGluayB0aGUgd29yayBzY2llbnRpc3RzIGRvIGVuaGFuY2VzIHRoZWlyIGxpdmVzPwoKYGBge3IgZ3Vlc3MtdHJ1ZS1wcm99CnNhbXBsZV9wcm9zMTUwIDwtIGdsb2JhbF9tb25pdG9yICU+JQogIGluZmVyOjpyZXBfc2FtcGxlX24oc2l6ZSA9IDE1MCwgcmVwcyA9IDIwMDAsIHJlcGxhY2UgPSBUUlVFKSAlPiUKICBjb3VudChzY2llbnRpc3Rfd29yaykgJT4lCiAgbXV0YXRlKHA0ID0gbiAvIHN1bShuKSkgJT4lCiAgZmlsdGVyKHNjaWVudGlzdF93b3JrID09ICJCZW5lZml0cyIpCmdncGxvdChkYXRhID0gc2FtcGxlX3Byb3MxNTAsIGFlcyh4ID0gcDQpKSArCiAgZ2VvbV9oaXN0b2dyYW0oYmlud2lkdGggPSAwLjAyKSArIAogIGxhYnMoCiAgICB4ID0gInA0IChCZW5lZml0cykiLAogICAgdGl0bGUgPSAiU2FtcGxpbmcgZGlzdHJpYnV0aW9uIG9mIHBlb3BsZSB3aG8gYmVsaWV2ZSBzY2llbnRpc3Qgd29yayBiZW5lZml0cyIsCiAgICBzdWJ0aXRsZSA9ICJTYW1wbGUgU2l6c2UgPSAxNTAsIE51bWJlciBvZiBzYW1wbGVzID0gMjAwMCIKICApCnN1bW1hcnkoc2FtcGxlX3Byb3MxNTApCm1lYW4oc2FtcGxlX3Byb3MxNTAkcDQpCgpgYGAKIyMjIEV4ZXJjaXNlIDEwCk9uIHRoZSBzYW1wbGluZyBkaXN0cmlidXRpb25zIGZyb20gMiBhbmQgMywgd2hpY2ggaGFzIGEgc21hbGxlciBzcHJlYWQ/IElmIHlvdSdyZSBjb25uZWN0ZWQgd2l0aCBtYWtpbmcgZXN0aW1hdGVzIHRoYXQgYXJlIG1vcmUgb2Z0ZW4gY2xvc2UgdG8gdGhlIHRydWUgdmFsdWUsIHdvdWxkIHlvdSBwcmVmZXIgYSBzYW1wbGluZyBkaXN0cmlidXRpb24gd2l0aCBhIGxhcmdlIG9yIHNtYWxsIHNwcmVhZD8KCkEgbGFyZ2VyIHNhbXBsZSBzaXplIGhhcyBhIHNtYWxsZXIgc3ByZWFkIG9mIHNhbXBsaW5nIGRpc3RyaWJ1dGlvbiB0aGF0IGlzIG11Y2ggY2xvc2VyIHRvIHRoZSB0cnVlIHZhbHVlIGJlY2F1c2Ugc3RhbmRhcmQgZGV2aWF0aW9uIGlzIGdldHRpbmcgc21hbGxlciBhbmQgcHJvcG9ydGlvbiBvZiBwb3B1bGF0aW9uIG1hdGNoZXMgdG8gdGhlIG1lYW4uCgo=