library(tidyverse)
library(openintro)
library(infer)
Exercise 1
Describe the distribution of responses in this sample. How does it compare to the distribution of responses in the population. Hint: Although the sample_n function takes a random sample of observations (i.e. rows) from the data set, you can still refer to the variables in the data set with the same names. Code you presented earlier for visualizing and summarizing the population data will still be useful for the sample, however be careful to not label your proportion p since you’re now calculating a sample statistic, not a population parameters. You can customize the label of the statistics to indicate that it comes from the sample.
# Insert code for Exercise 1 here
global_monitor <- tibble(
scientist_work = c(rep("Benefits", 80000), rep("Doesn't benefit", 20000))
)
global_monitor %>%
count(scientist_work) %>%
mutate(p = n /sum(n))
## # A tibble: 2 x 3
## scientist_work n p
## <chr> <int> <dbl>
## 1 Benefits 80000 0.8
## 2 Doesn't benefit 20000 0.2
set.seed(1)
samp1 <- global_monitor %>%
sample_n(50)
samp1 %>%
count(scientist_work) %>%
mutate(p_hat = n /sum(n))
## # A tibble: 2 x 3
## scientist_work n p_hat
## <chr> <int> <dbl>
## 1 Benefits 38 0.76
## 2 Doesn't benefit 12 0.24
The sample is similar to the population in terms of distribution. When I ran the data I got 76 percent for benefits and 24 percent for don’t benefits. These values are similar to the population values.
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 proportions to be somewhat different or very different? Ask a student team to confirm your answer.
# Insert code for Exercise 2 here
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 x 3
## scientist_work n p
## <chr> <int> <dbl>
## 1 Benefits 80000 0.8
## 2 Doesn't benefit 20000 0.2
samp1 <- global_monitor %>%
sample_n(50)
samp1 %>%
count(scientist_work) %>%
mutate(p_hat = n /sum(n))
## # A tibble: 2 x 3
## scientist_work n p_hat
## <chr> <int> <dbl>
## 1 Benefits 41 0.82
## 2 Doesn't benefit 9 0.18
No, I would not expect it to be the exact same as you are randomly choosing 50 people. It could be a different 50 people in another sample who answered differently.It should be somewhat different, but not very different.
Exercise 3
Take a second sample, also of size 50, and call it samp2. How does the sample proportion of samp2 compare with that of samp1?
# Insert code for Exercise 3 here
set.seed(2)
samp2 <- global_monitor %>%
sample_n(50)
samp2 %>%
count(scientist_work) %>%
mutate(p_hat = n /sum(n))
## # A tibble: 2 x 3
## scientist_work n p_hat
## <chr> <int> <dbl>
## 1 Benefits 42 0.84
## 2 Doesn't benefit 8 0.16
The sample proportion changed from 76 to 84 in benefits and 24 to 16 in doesn’t benefit.However, they are similar in values.
Exercise 3
Suppose we took two more samples, one of size 100 and one of size 1000. Which would you think would provide a more accurate estimate of the population proportion?
set.seed (1)
samp3<- global_monitor %>%
sample_n(100)
samp3%>%
count(scientist_work) %>%
mutate(p_hat = n /sum(n))
samp4<- global_monitor %>%
sample_n(1000)
samp4%>%
count(scientist_work) %>%
mutate(p_hat = n /sum(n))
The bigger the sample proportion, the more accurate the estimation of the population proportion. The 1000 sample size proportion is closer to 80 in benefits and 20 in doesn’t benefit.
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 the distribution in your answer
sample_props50 <- global_monitor %>%
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 samples = 15000"
)
There appears to be 4 columns and 15000 rows. These would include p_hat, n, scientist_work, and replicate. It has bell shape distribution and the center is around 0.2.
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_props_small? What does each observation represent?
sample_props_small <- global_monitor %>%
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: 21 x 4
## # Groups: replicate [21]
## replicate scientist_work n p_hat
## <int> <chr> <int> <dbl>
## 1 1 Doesn't benefit 1 0.1
## 2 2 Doesn't benefit 2 0.2
## 3 3 Doesn't benefit 2 0.2
## 4 4 Doesn't benefit 1 0.1
## 5 5 Doesn't benefit 1 0.1
## 6 6 Doesn't benefit 3 0.3
## 7 8 Doesn't benefit 3 0.3
## 8 9 Doesn't benefit 3 0.3
## 9 10 Doesn't benefit 3 0.3
## 10 11 Doesn't benefit 4 0.4
## # ... with 11 more rows
mean(sample_props_small$p_hat)
## [1] 0.2380952
There are 25 observations. Each observation represents the random sample of size 10.
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? How does the mean, standard error, and shape of the sampling distribution change as the sample size increases? How (if at all) do these values change if you increase the number of simulations? (You do not need to include plots in your answer.)
Each observation in the sampling distribution represents the random sample of a particular size i.e 10,50, and 100.
As I increased the sample size the distribution became more bell shaped.
The sample mean becomes closer to population mean 0.2.
The standard error got smaller as the sample size increased.
According to the central limit theorem that if we have a population with mean μ and standard deviation σ and take sufficiently large random samples from the population with replacement then the distribution of the sample means will be approximately normally distributed.
If we increase the number of simulations the sample means will be closer to population mean and it is the same for standard error.
Exercise 7
Take a sample of size 15 from the 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 proportion of people who think the work scientists do enhances their lives?
# Insert code for Exercise 7 here
set.seed(1)
samp5 <- global_monitor %>%
sample_n(15)
samp5 %>%
count(scientist_work) %>%
mutate(p_hat5 = n /sum(n))
The best point estimate was 93.3%
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 samples of size 15 by taking 2000 samples from the population of size 15 and computing 2000 sample proportions. Store these proportions 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.
# Insert code for Exercise 8 here
sample_props15 <- global_monitor %>%
rep_sample_n(size = 15, reps = 2000, replace = TRUE) %>%
count(scientist_work) %>%
mutate(p_hat = n /sum(n)) %>%
filter(scientist_work == "Benefits")
glimpse(sample_props15)
ggplot(data = sample_props15, aes(x = p_hat)) +
geom_histogram(binwidth = 0.075) +
labs(x = "p_hat (Benefits)",
title = "Sampling distribution of p_hat",
subtitle = "Sample size = 15, Number of samples = 2000"
)
The histogram is skewed to the left. If I were to guess I would say that 70% of the population believes that scientists benefit their lives. The actual proportion is 80%.
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 sampling distribution, what would you guess to be the true proportion of those who think the work scientists do enhances their lives?
# Insert code for Exercise 9 here
sample_props150 <- global_monitor %>%
rep_sample_n(size = 150, reps = 2000, replace = TRUE) %>%
count(scientist_work) %>%
mutate(p_hat = n /sum(n)) %>%
filter(scientist_work == "Benefits")
glimpse(sample_props150)
## Rows: 2,000
## Columns: 4
## Groups: replicate [2,000]
## $ replicate <int> 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 1...
## $ scientist_work <chr> "Benefits", "Benefits", "Benefits", "Benefits", "Ben...
## $ n <int> 117, 126, 129, 113, 123, 109, 126, 122, 114, 110, 11...
## $ p_hat <dbl> 0.7800000, 0.8400000, 0.8600000, 0.7533333, 0.820000...
ggplot(data = sample_props150, aes(x = p_hat)) +
geom_histogram(binwidth = 0.02) +
labs(x = "p_hat (Benefits)",
title = "Sampling distribution of p_hat",
subtitle = "Sample size = 150, Number of samples = 2000"
)
It would be about 80% of people that say that scientists enhance their lives. The shape is more bell shaped and compared to the sample size of 15 graph.
Exercise 10
Of the sampling distributions from 2 and 3, which has a smaller spread? If you’re concerned with making estimates that are more often close to the true value, would you prefer a sampling distribution with a large or small spread?
# Insert code for Exercise 10 here
sample_props15 <- global_monitor %>%
rep_sample_n(size = 15, reps = 2000, replace = TRUE) %>%
count(scientist_work) %>%
mutate(p_hat = n /sum(n)) %>%
filter(scientist_work == "Benefits")
glimpse(sample_props15)
global_monitor %>%
count(scientist_work) %>%
mutate(p = n /sum(n))
ggplot(data = sample_props15, aes(x = p_hat)) +
geom_histogram(binwidth = 0.075) +
labs(x = "p_hat (Benefits)",
title = "Sampling distribution of p_hat",
subtitle = "Sample size = 15, Number of samples = 2000"
)
sample_props150 <- global_monitor %>%
rep_sample_n(size = 150, reps = 2000, replace = TRUE) %>%
count(scientist_work) %>%
mutate(p_hat = n /sum(n)) %>%
filter(scientist_work == "Benefits")
glimpse(sample_props150)
ggplot(data = sample_props150, aes(x = p_hat)) +
geom_histogram(binwidth = 0.02) +
labs(x = "p_hat (Benefits)",
title = "Sampling distribution of p_hat",
subtitle = "Sample size = 150, Number of samples = 2000"
)
A smaller spread would give you a better approximation and therefore is more desirable for getting close to the true value. I think the graph I just made for #9 had a smaller spread than the graph I made for #8
LS0tDQp0aXRsZTogIkxhYiA1OiBGb3VuZGF0aW9ucyBmb3IgSW5mZXJlbmNlIg0KYXV0aG9yOiAiVGVyZXNhIERvbGV5Ig0KZGF0ZTogImByIFN5cy5EYXRlKDEwLzUvMjAyMCkiDQpvdXRwdXQ6IG9wZW5pbnRybzo6bGFiX3JlcG9ydA0KLS0tDQoNCmBgYHtyIGxvYWQtcGFja2FnZXMsIG1lc3NhZ2U9RkFMU0V9DQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCmxpYnJhcnkob3BlbmludHJvKQ0KbGlicmFyeShpbmZlcikNCmBgYA0KDQojIyMgRXhlcmNpc2UgMQ0KDQpEZXNjcmliZSB0aGUgZGlzdHJpYnV0aW9uIG9mIHJlc3BvbnNlcyBpbiB0aGlzIHNhbXBsZS4gSG93IGRvZXMgaXQgY29tcGFyZSB0byB0aGUgZGlzdHJpYnV0aW9uIG9mIHJlc3BvbnNlcyBpbiB0aGUgcG9wdWxhdGlvbi4gSGludDogQWx0aG91Z2ggdGhlIHNhbXBsZV9uIGZ1bmN0aW9uIHRha2VzIGEgcmFuZG9tIHNhbXBsZSBvZiBvYnNlcnZhdGlvbnMgKGkuZS4gcm93cykgZnJvbSB0aGUgZGF0YSBzZXQsIHlvdSBjYW4gc3RpbGwgcmVmZXIgdG8gdGhlIHZhcmlhYmxlcyBpbiB0aGUgZGF0YSBzZXQgd2l0aCB0aGUgc2FtZSBuYW1lcy4gQ29kZSB5b3UgcHJlc2VudGVkIGVhcmxpZXIgZm9yIHZpc3VhbGl6aW5nIGFuZCBzdW1tYXJpemluZyB0aGUgcG9wdWxhdGlvbiBkYXRhIHdpbGwgc3RpbGwgYmUgdXNlZnVsIGZvciB0aGUgc2FtcGxlLCBob3dldmVyIGJlIGNhcmVmdWwgdG8gbm90IGxhYmVsIHlvdXIgcHJvcG9ydGlvbiBwIHNpbmNlIHlvdeKAmXJlIG5vdyBjYWxjdWxhdGluZyBhIHNhbXBsZSBzdGF0aXN0aWMsIG5vdCBhIHBvcHVsYXRpb24gcGFyYW1ldGVycy4gWW91IGNhbiBjdXN0b21pemUgdGhlIGxhYmVsIG9mIHRoZSBzdGF0aXN0aWNzIHRvIGluZGljYXRlIHRoYXQgaXQgY29tZXMgZnJvbSB0aGUgc2FtcGxlLg0KDQpgYGB7ciB2aWV3LWdpcmxzLWNvdW50c30NCiMgSW5zZXJ0IGNvZGUgZm9yIEV4ZXJjaXNlIDEgaGVyZQ0KDQpnbG9iYWxfbW9uaXRvciA8LSB0aWJibGUoDQogIHNjaWVudGlzdF93b3JrID0gYyhyZXAoIkJlbmVmaXRzIiwgODAwMDApLCByZXAoIkRvZXNuJ3QgYmVuZWZpdCIsIDIwMDAwKSkNCikNCg0KZ2xvYmFsX21vbml0b3IgJT4lDQogIGNvdW50KHNjaWVudGlzdF93b3JrKSAlPiUNCiAgbXV0YXRlKHAgPSBuIC9zdW0obikpDQoNCnNldC5zZWVkKDEpDQpzYW1wMSA8LSBnbG9iYWxfbW9uaXRvciAlPiUNCiAgc2FtcGxlX24oNTApDQpzYW1wMSAlPiUNCiAgY291bnQoc2NpZW50aXN0X3dvcmspICU+JQ0KICBtdXRhdGUocF9oYXQgPSBuIC9zdW0obikpDQpgYGANClRoZSBzYW1wbGUgaXMgc2ltaWxhciB0byB0aGUgcG9wdWxhdGlvbiBpbiB0ZXJtcyBvZiBkaXN0cmlidXRpb24uIFdoZW4gSSByYW4gdGhlIGRhdGEgSSBnb3QgNzYgcGVyY2VudCBmb3IgYmVuZWZpdHMgYW5kIDI0IHBlcmNlbnQgZm9yIGRvbid0IGJlbmVmaXRzLiBUaGVzZSB2YWx1ZXMgYXJlIHNpbWlsYXIgdG8gdGhlIHBvcHVsYXRpb24gdmFsdWVzLg0KDQojIyMgRXhlcmNpc2UgMg0KV291bGQgeW91IGV4cGVjdCB0aGUgc2FtcGxlIHByb3BvcnRpb24gdG8gbWF0Y2ggdGhlIHNhbXBsZSBwcm9wb3J0aW9uIG9mIGFub3RoZXIgc3R1ZGVudOKAmXMgc2FtcGxlPyBXaHksIG9yIHdoeSBub3Q/IElmIHRoZSBhbnN3ZXIgaXMgbm8sIHdvdWxkIHlvdSBleHBlY3QgdGhlIHByb3BvcnRpb25zIHRvIGJlIHNvbWV3aGF0IGRpZmZlcmVudCBvciB2ZXJ5IGRpZmZlcmVudD8gQXNrIGEgc3R1ZGVudCB0ZWFtIHRvIGNvbmZpcm0geW91ciBhbnN3ZXIuDQoNCmBgYHtyIHRyZW5kLWdpcmxzfQ0KIyBJbnNlcnQgY29kZSBmb3IgRXhlcmNpc2UgMiBoZXJlDQpnbG9iYWxfbW9uaXRvciA8LSB0aWJibGUoDQogIHNjaWVudGlzdF93b3JrID0gYyhyZXAoIkJlbmVmaXRzIiwgODAwMDApLCByZXAoIkRvZXNuJ3QgYmVuZWZpdCIsIDIwMDAwKSkNCikNCmdncGxvdChnbG9iYWxfbW9uaXRvciwgYWVzKHggPSBzY2llbnRpc3Rfd29yaykpICsNCiAgZ2VvbV9iYXIoKSArDQogIGxhYnMoDQogICAgeCA9ICIiLCB5ID0gIiIsDQogICAgdGl0bGUgPSAiRG8geW91IGJlbGlldmUgdGhhdCB0aGUgd29yayBzY2llbnRpc3RzIGRvIGJlbmVmaXQgcGVvcGxlIGxpa2UgeW91PyINCiAgKSArDQogIGNvb3JkX2ZsaXAoKSANCmdsb2JhbF9tb25pdG9yICU+JQ0KICBjb3VudChzY2llbnRpc3Rfd29yaykgJT4lDQogIG11dGF0ZShwID0gbiAvc3VtKG4pKQ0Kc2FtcDEgPC0gZ2xvYmFsX21vbml0b3IgJT4lDQogIHNhbXBsZV9uKDUwKQ0Kc2FtcDEgJT4lDQogIGNvdW50KHNjaWVudGlzdF93b3JrKSAlPiUNCiAgbXV0YXRlKHBfaGF0ID0gbiAvc3VtKG4pKQ0KDQpgYGANCk5vLCBJIHdvdWxkIG5vdCBleHBlY3QgaXQgdG8gYmUgdGhlIGV4YWN0IHNhbWUgYXMgeW91IGFyZSByYW5kb21seSBjaG9vc2luZyA1MCBwZW9wbGUuIEl0IGNvdWxkIGJlIGEgZGlmZmVyZW50IDUwIHBlb3BsZSBpbiBhbm90aGVyIHNhbXBsZSB3aG8gYW5zd2VyZWQgZGlmZmVyZW50bHkuSXQgc2hvdWxkIGJlIHNvbWV3aGF0IGRpZmZlcmVudCwgYnV0IG5vdCB2ZXJ5IGRpZmZlcmVudC4NCg0KIyMjIEV4ZXJjaXNlIDMgDQpUYWtlIGEgc2Vjb25kIHNhbXBsZSwgYWxzbyBvZiBzaXplIDUwLCBhbmQgY2FsbCBpdCBzYW1wMi4gSG93IGRvZXMgdGhlIHNhbXBsZSBwcm9wb3J0aW9uIG9mIHNhbXAyIGNvbXBhcmUgd2l0aCB0aGF0IG9mIHNhbXAxPyANCg0KYGBge3IgcGxvdC1wcm9wLWJveXMtYXJidXRobm90fQ0KIyBJbnNlcnQgY29kZSBmb3IgRXhlcmNpc2UgMyBoZXJlDQoNCnNldC5zZWVkKDIpDQoNCnNhbXAyIDwtIGdsb2JhbF9tb25pdG9yICU+JQ0KICBzYW1wbGVfbig1MCkNCnNhbXAyICU+JQ0KICBjb3VudChzY2llbnRpc3Rfd29yaykgJT4lDQogIG11dGF0ZShwX2hhdCA9IG4gL3N1bShuKSkNCmBgYA0KVGhlIHNhbXBsZSBwcm9wb3J0aW9uIGNoYW5nZWQgZnJvbSA3NiB0byA4NCBpbiBiZW5lZml0cyBhbmQgMjQgdG8gMTYgaW4gZG9lc24ndCBiZW5lZml0Lkhvd2V2ZXIsIHRoZXkgYXJlIHNpbWlsYXIgaW4gdmFsdWVzLg0KDQojIyMgRXhlcmNpc2UgMyANClN1cHBvc2Ugd2UgdG9vayB0d28gbW9yZSBzYW1wbGVzLCBvbmUgb2Ygc2l6ZSAxMDAgYW5kIG9uZSBvZiBzaXplIDEwMDAuIFdoaWNoIHdvdWxkIHlvdSB0aGluayB3b3VsZCBwcm92aWRlIGEgbW9yZSBhY2N1cmF0ZSBlc3RpbWF0ZSBvZiB0aGUgcG9wdWxhdGlvbiBwcm9wb3J0aW9uPw0KDQpgYGB7fQ0Kc2V0LnNlZWQgKDEpDQoNCnNhbXAzPC0gZ2xvYmFsX21vbml0b3IgJT4lDQogIHNhbXBsZV9uKDEwMCkNCnNhbXAzJT4lDQogIGNvdW50KHNjaWVudGlzdF93b3JrKSAlPiUNCiAgbXV0YXRlKHBfaGF0ID0gbiAvc3VtKG4pKQ0KDQpzYW1wNDwtIGdsb2JhbF9tb25pdG9yICU+JQ0KICBzYW1wbGVfbigxMDAwKQ0Kc2FtcDQlPiUNCiAgY291bnQoc2NpZW50aXN0X3dvcmspICU+JQ0KICBtdXRhdGUocF9oYXQgPSBuIC9zdW0obikpDQoNCmBgYA0KVGhlIGJpZ2dlciB0aGUgc2FtcGxlIHByb3BvcnRpb24sIHRoZSBtb3JlIGFjY3VyYXRlIHRoZSBlc3RpbWF0aW9uIG9mIHRoZSBwb3B1bGF0aW9uIHByb3BvcnRpb24uIFRoZSAxMDAwIHNhbXBsZSBzaXplIHByb3BvcnRpb24gaXMgY2xvc2VyIHRvIDgwIGluIGJlbmVmaXRzIGFuZCAyMCBpbiBkb2Vzbid0IGJlbmVmaXQuIA0KDQojIyMgRXhlcmNpc2UgNA0KDQpIb3cgbWFueSBlbGVtZW50cyBhcmUgdGhlcmUgaW4gc2FtcGxlX3Byb3BzNTA/IERlc2NyaWJlIHRoZSBzYW1wbGluZyBkaXN0cmlidXRpb24sIGFuZCBiZSBzdXJlIHRvIHNwZWNpZmljYWxseSBub3RlIGl0cyBjZW50ZXIuIE1ha2Ugc3VyZSB0byBpbmNsdWRlIGEgcGxvdCBvZiB0aGUgZGlzdHJpYnV0aW9uIGluIHlvdXIgYW5zd2VyDQoNCmBgYHtyIGRpbS1wcmVzZW50fQ0Kc2FtcGxlX3Byb3BzNTAgPC0gZ2xvYmFsX21vbml0b3IgJT4lDQogICAgICAgICAgICAgICAgICAgIHJlcF9zYW1wbGVfbihzaXplID0gNTAsIHJlcHMgPSAxNTAwMCwgcmVwbGFjZSA9IFRSVUUpICU+JQ0KICAgICAgICAgICAgICAgICAgICBjb3VudChzY2llbnRpc3Rfd29yaykgJT4lDQogICAgICAgICAgICAgICAgICAgIG11dGF0ZShwX2hhdCA9IG4gL3N1bShuKSkgJT4lDQogICAgICAgICAgICAgICAgICAgIGZpbHRlcihzY2llbnRpc3Rfd29yayA9PSAiRG9lc24ndCBiZW5lZml0IikNCmdncGxvdChkYXRhID0gc2FtcGxlX3Byb3BzNTAsIGFlcyh4ID0gcF9oYXQpKSArDQogIGdlb21faGlzdG9ncmFtKGJpbndpZHRoID0gMC4wMikgKw0KICBsYWJzKA0KICAgIHggPSAicF9oYXQgKERvZXNuJ3QgYmVuZWZpdCkiLA0KICAgIHRpdGxlID0gIlNhbXBsaW5nIGRpc3RyaWJ1dGlvbiBvZiBwX2hhdCIsDQogICAgc3VidGl0bGUgPSAiU2FtcGxlIHNpemUgPSA1MCwgTnVtYmVyIG9mIHNhbXBsZXMgPSAxNTAwMCINCiAgKQ0KYGBgDQpUaGVyZSBhcHBlYXJzIHRvIGJlIDQgY29sdW1ucyBhbmQgMTUwMDAgcm93cy4gVGhlc2Ugd291bGQgaW5jbHVkZSBwX2hhdCwgbiwgc2NpZW50aXN0X3dvcmssIGFuZCByZXBsaWNhdGUuIEl0IGhhcyBiZWxsIHNoYXBlIGRpc3RyaWJ1dGlvbiBhbmQgdGhlIGNlbnRlciBpcyBhcm91bmQgMC4yLg0KDQojIyMgRXhlcmNpc2UgNQ0KDQpUbyBtYWtlIHN1cmUgeW91IHVuZGVyc3RhbmQgaG93IHNhbXBsaW5nIGRpc3RyaWJ1dGlvbnMgYXJlIGJ1aWx0LCBhbmQgZXhhY3RseSB3aGF0IHRoZSByZXBfc2FtcGxlX24gZnVuY3Rpb24gZG9lcywgdHJ5IG1vZGlmeWluZyB0aGUgY29kZSB0byBjcmVhdGUgYSBzYW1wbGluZyBkaXN0cmlidXRpb24gb2YgMjUgc2FtcGxlIHByb3BvcnRpb25zIGZyb20gc2FtcGxlcyBvZiBzaXplIDEwLCBhbmQgcHV0IHRoZW0gaW4gYSBkYXRhIGZyYW1lIG5hbWVkIHNhbXBsZV9wcm9wc19zbWFsbC4gUHJpbnQgdGhlIG91dHB1dC4gSG93IG1hbnkgb2JzZXJ2YXRpb25zIGFyZSB0aGVyZSBpbiB0aGlzIG9iamVjdCBjYWxsZWQgc2FtcGxlX3Byb3BzX3NtYWxsPyBXaGF0IGRvZXMgZWFjaCBvYnNlcnZhdGlvbiByZXByZXNlbnQ/DQoNCg0KDQpgYGB7ciBjb3VudC1jb21wYXJlfQ0Kc2FtcGxlX3Byb3BzX3NtYWxsIDwtIGdsb2JhbF9tb25pdG9yICU+JQ0KICByZXBfc2FtcGxlX24oc2l6ZSA9IDEwLCByZXBzID0gMjUsIHJlcGxhY2UgPSBUUlVFKSAlPiUNCiAgY291bnQoc2NpZW50aXN0X3dvcmspICU+JQ0KICBtdXRhdGUocF9oYXQgPSBuIC9zdW0obikpICU+JQ0KICBmaWx0ZXIoc2NpZW50aXN0X3dvcmsgPT0gIkRvZXNuJ3QgYmVuZWZpdCIpDQpzYW1wbGVfcHJvcHNfc21hbGwNCm1lYW4oc2FtcGxlX3Byb3BzX3NtYWxsJHBfaGF0KQ0KYGBgDQoNClRoZXJlIGFyZSAyNSBvYnNlcnZhdGlvbnMuIEVhY2ggb2JzZXJ2YXRpb24gcmVwcmVzZW50cyB0aGUgcmFuZG9tIHNhbXBsZSBvZiBzaXplIDEwLg0KDQojIyMgRXhlcmNpc2UgNg0KDQpVc2UgdGhlIGFwcCBiZWxvdyB0byBjcmVhdGUgc2FtcGxpbmcgZGlzdHJpYnV0aW9ucyBvZiBwcm9wb3J0aW9ucyBvZiBEb2VzbuKAmXQgYmVuZWZpdCBmcm9tIHNhbXBsZXMgb2Ygc2l6ZSAxMCwgNTAsIGFuZCAxMDAuIFVzZSA1LDAwMCBzaW11bGF0aW9ucy4gV2hhdCBkb2VzIGVhY2ggb2JzZXJ2YXRpb24gaW4gdGhlIHNhbXBsaW5nIGRpc3RyaWJ1dGlvbiByZXByZXNlbnQ/IEhvdyBkb2VzIHRoZSBtZWFuLCBzdGFuZGFyZCBlcnJvciwgYW5kIHNoYXBlIG9mIHRoZSBzYW1wbGluZyBkaXN0cmlidXRpb24gY2hhbmdlIGFzIHRoZSBzYW1wbGUgc2l6ZSBpbmNyZWFzZXM/IEhvdyAoaWYgYXQgYWxsKSBkbyB0aGVzZSB2YWx1ZXMgY2hhbmdlIGlmIHlvdSBpbmNyZWFzZSB0aGUgbnVtYmVyIG9mIHNpbXVsYXRpb25zPyAoWW91IGRvIG5vdCBuZWVkIHRvIGluY2x1ZGUgcGxvdHMgaW4geW91ciBhbnN3ZXIuKQ0KDQpFYWNoIG9ic2VydmF0aW9uIGluIHRoZSBzYW1wbGluZyBkaXN0cmlidXRpb24gcmVwcmVzZW50cyANCnRoZSByYW5kb20gc2FtcGxlIG9mIGEgcGFydGljdWxhciBzaXplIGkuZSAxMCw1MCwgYW5kIDEwMC4NCg0KQXMgSSBpbmNyZWFzZWQgdGhlIHNhbXBsZSBzaXplIHRoZSBkaXN0cmlidXRpb24gYmVjYW1lIG1vcmUgYmVsbCBzaGFwZWQuDQoNClRoZSBzYW1wbGUgbWVhbiBiZWNvbWVzIGNsb3NlciB0byBwb3B1bGF0aW9uIG1lYW4gMC4yLg0KDQpUaGUgc3RhbmRhcmQgZXJyb3IgZ290IHNtYWxsZXIgYXMgdGhlIHNhbXBsZSBzaXplIGluY3JlYXNlZC4NCg0KQWNjb3JkaW5nIHRvIHRoZSBjZW50cmFsIGxpbWl0IHRoZW9yZW0gdGhhdCBpZiB3ZSAgaGF2ZSBhIHBvcHVsYXRpb24gd2l0aCBtZWFuIM68IGFuZCBzdGFuZGFyZCBkZXZpYXRpb24gz4MgYW5kIHRha2Ugc3VmZmljaWVudGx5IGxhcmdlIHJhbmRvbSBzYW1wbGVzIGZyb20gdGhlIHBvcHVsYXRpb24gd2l0aCByZXBsYWNlbWVudCB0aGVuIHRoZSBkaXN0cmlidXRpb24gb2YgdGhlIHNhbXBsZSBtZWFucyB3aWxsIGJlIGFwcHJveGltYXRlbHkgbm9ybWFsbHkgZGlzdHJpYnV0ZWQuIA0KDQpJZiB3ZSBpbmNyZWFzZSB0aGUgbnVtYmVyIG9mIHNpbXVsYXRpb25zIHRoZSBzYW1wbGUgbWVhbnMgd2lsbCBiZSBjbG9zZXIgdG8gcG9wdWxhdGlvbiBtZWFuIGFuZCBpdCBpcyB0aGUgc2FtZSBmb3Igc3RhbmRhcmQgZXJyb3IuDQoNCg0KIyMjIEV4ZXJjaXNlIDcNCg0KVGFrZSBhIHNhbXBsZSBvZiBzaXplIDE1IGZyb20gdGhlIHBvcHVsYXRpb24gYW5kIGNhbGN1bGF0ZSB0aGUgcHJvcG9ydGlvbiBvZiBwZW9wbGUgaW4gdGhpcyBzYW1wbGUgd2hvIHRoaW5rIHRoZSB3b3JrIHNjaWVudGlzdHMgZG8gZW5oYW5jZXMgdGhlaXIgbGl2ZXMuIFVzaW5nIHRoaXMgc2FtcGxlLCB3aGF0IGlzIHlvdXIgYmVzdCBwb2ludCBlc3RpbWF0ZSBvZiB0aGUgcG9wdWxhdGlvbiBwcm9wb3J0aW9uIG9mIHBlb3BsZSB3aG8gdGhpbmsgdGhlIHdvcmsgc2NpZW50aXN0cyBkbyBlbmhhbmNlcyB0aGVpciBsaXZlcz8NCg0KDQpgYGB7fQ0KIyBJbnNlcnQgY29kZSBmb3IgRXhlcmNpc2UgNyBoZXJlDQoNCnNldC5zZWVkKDEpDQoNCnNhbXA1IDwtIGdsb2JhbF9tb25pdG9yICU+JQ0KICBzYW1wbGVfbigxNSkNCg0Kc2FtcDUgJT4lDQogIGNvdW50KHNjaWVudGlzdF93b3JrKSAlPiUNCiAgbXV0YXRlKHBfaGF0NSA9IG4gL3N1bShuKSkNCg0KYGBgDQpUaGUgYmVzdCBwb2ludCBlc3RpbWF0ZSB3YXMgOTMuMyUNCg0KIyMjIEV4ZXJjaXNlIDgNCg0KU2luY2UgeW91IGhhdmUgYWNjZXNzIHRvIHRoZSBwb3B1bGF0aW9uLCBzaW11bGF0ZSB0aGUgc2FtcGxpbmcgZGlzdHJpYnV0aW9uIG9mIHByb3BvcnRpb24gb2YgdGhvc2Ugd2hvIHRoaW5rIHRoZSB3b3JrIHNjaWVudGlzdHMgZG8gZW5oYW5jZXMgdGhlaXIgbGl2ZXMgZm9yIHNhbXBsZXMgb2Ygc2l6ZSAxNSBieSB0YWtpbmcgMjAwMCBzYW1wbGVzIGZyb20gdGhlIHBvcHVsYXRpb24gb2Ygc2l6ZSAxNSBhbmQgY29tcHV0aW5nIDIwMDAgc2FtcGxlIHByb3BvcnRpb25zLiBTdG9yZSB0aGVzZSBwcm9wb3J0aW9ucyBpbiBhcyBzYW1wbGVfcHJvcHMxNS4gUGxvdCB0aGUgZGF0YSwgdGhlbiBkZXNjcmliZSB0aGUgc2hhcGUgb2YgdGhpcyBzYW1wbGluZyBkaXN0cmlidXRpb24uIEJhc2VkIG9uIHRoaXMgc2FtcGxpbmcgZGlzdHJpYnV0aW9uLCB3aGF0IHdvdWxkIHlvdSBndWVzcyB0aGUgdHJ1ZSBwcm9wb3J0aW9uIG9mIHRob3NlIHdobyB0aGluayB0aGUgd29yayBzY2llbnRpc3RzIGRvIGVuaGFuY2VzIHRoZWlyIGxpdmVzIHRvIGJlPyBGaW5hbGx5LCBjYWxjdWxhdGUgYW5kIHJlcG9ydCB0aGUgcG9wdWxhdGlvbiBwcm9wb3J0aW9uLg0KDQoNCg0KYGBge30NCiMgSW5zZXJ0IGNvZGUgZm9yIEV4ZXJjaXNlIDggaGVyZQ0Kc2FtcGxlX3Byb3BzMTUgPC0gZ2xvYmFsX21vbml0b3IgJT4lDQogIHJlcF9zYW1wbGVfbihzaXplID0gMTUsIHJlcHMgPSAyMDAwLCByZXBsYWNlID0gVFJVRSkgJT4lDQogIGNvdW50KHNjaWVudGlzdF93b3JrKSAlPiUNCiAgbXV0YXRlKHBfaGF0ID0gbiAvc3VtKG4pKSAlPiUNCiAgZmlsdGVyKHNjaWVudGlzdF93b3JrID09ICJCZW5lZml0cyIpDQpnbGltcHNlKHNhbXBsZV9wcm9wczE1KQ0KZ2dwbG90KGRhdGEgPSBzYW1wbGVfcHJvcHMxNSwgYWVzKHggPSBwX2hhdCkpICsNCiAgZ2VvbV9oaXN0b2dyYW0oYmlud2lkdGggPSAwLjA3NSkgKw0KICBsYWJzKHggPSAicF9oYXQgKEJlbmVmaXRzKSIsDQogICAgdGl0bGUgPSAiU2FtcGxpbmcgZGlzdHJpYnV0aW9uIG9mIHBfaGF0IiwNCiAgICBzdWJ0aXRsZSA9ICJTYW1wbGUgc2l6ZSA9IDE1LCBOdW1iZXIgb2Ygc2FtcGxlcyA9IDIwMDAiDQogICkNCmBgYA0KVGhlIGhpc3RvZ3JhbSBpcyBza2V3ZWQgdG8gdGhlIGxlZnQuIElmIEkgd2VyZSB0byBndWVzcyBJIHdvdWxkIHNheSB0aGF0IDcwJSBvZiB0aGUgcG9wdWxhdGlvbiBiZWxpZXZlcyB0aGF0IHNjaWVudGlzdHMgYmVuZWZpdCB0aGVpciBsaXZlcy4gVGhlIGFjdHVhbCBwcm9wb3J0aW9uIGlzIDgwJS4NCg0KIyMjIEV4ZXJjaXNlIDkNCg0KQ2hhbmdlIHlvdXIgc2FtcGxlIHNpemUgZnJvbSAxNSB0byAxNTAsIHRoZW4gY29tcHV0ZSB0aGUgc2FtcGxpbmcgZGlzdHJpYnV0aW9uIHVzaW5nIHRoZSBzYW1lIG1ldGhvZCBhcyBhYm92ZSwgYW5kIHN0b3JlIHRoZXNlIHByb3BvcnRpb25zIGluIGEgbmV3IG9iamVjdCBjYWxsZWQgc2FtcGxlX3Byb3BzMTUwLiBEZXNjcmliZSB0aGUgc2hhcGUgb2YgdGhpcyBzYW1wbGluZyBkaXN0cmlidXRpb24gYW5kIGNvbXBhcmUgaXQgdG8gdGhlIHNhbXBsaW5nIGRpc3RyaWJ1dGlvbiBmb3IgYSBzYW1wbGUgc2l6ZSBvZiAxNS4gQmFzZWQgb24gdGhpcyBzYW1wbGluZyBkaXN0cmlidXRpb24sIHdoYXQgd291bGQgeW91IGd1ZXNzIHRvIGJlIHRoZSB0cnVlIHByb3BvcnRpb24gb2YgdGhvc2Ugd2hvIHRoaW5rIHRoZSB3b3JrIHNjaWVudGlzdHMgZG8gZW5oYW5jZXMgdGhlaXIgbGl2ZXM/DQoNCg0KYGBge3IgZmluZC1tYXgtdG90YWx9DQojIEluc2VydCBjb2RlIGZvciBFeGVyY2lzZSA5IGhlcmUNCnNhbXBsZV9wcm9wczE1MCA8LSBnbG9iYWxfbW9uaXRvciAlPiUNCiAgcmVwX3NhbXBsZV9uKHNpemUgPSAxNTAsIHJlcHMgPSAyMDAwLCByZXBsYWNlID0gVFJVRSkgJT4lDQogIGNvdW50KHNjaWVudGlzdF93b3JrKSAlPiUNCiAgbXV0YXRlKHBfaGF0ID0gbiAvc3VtKG4pKSAlPiUNCiAgZmlsdGVyKHNjaWVudGlzdF93b3JrID09ICJCZW5lZml0cyIpDQpnbGltcHNlKHNhbXBsZV9wcm9wczE1MCkNCmdncGxvdChkYXRhID0gc2FtcGxlX3Byb3BzMTUwLCBhZXMoeCA9IHBfaGF0KSkgKw0KICBnZW9tX2hpc3RvZ3JhbShiaW53aWR0aCA9IDAuMDIpICsNCiAgbGFicyh4ID0gInBfaGF0IChCZW5lZml0cykiLA0KICAgIHRpdGxlID0gIlNhbXBsaW5nIGRpc3RyaWJ1dGlvbiBvZiBwX2hhdCIsDQogICAgc3VidGl0bGUgPSAiU2FtcGxlIHNpemUgPSAxNTAsIE51bWJlciBvZiBzYW1wbGVzID0gMjAwMCINCiAgKQ0KDQpgYGANCkl0IHdvdWxkIGJlIGFib3V0IDgwJSBvZiBwZW9wbGUgdGhhdCBzYXkgdGhhdCBzY2llbnRpc3RzIGVuaGFuY2UgdGhlaXIgbGl2ZXMuIFRoZSBzaGFwZSBpcyBtb3JlIGJlbGwgc2hhcGVkIGFuZCBjb21wYXJlZCB0byB0aGUgc2FtcGxlIHNpemUgb2YgMTUgZ3JhcGguDQoNCiMjIyBFeGVyY2lzZSAxMA0KDQpPZiB0aGUgc2FtcGxpbmcgZGlzdHJpYnV0aW9ucyBmcm9tIDIgYW5kIDMsIHdoaWNoIGhhcyBhIHNtYWxsZXIgc3ByZWFkPyBJZiB5b3XigJlyZSBjb25jZXJuZWQgd2l0aCBtYWtpbmcgZXN0aW1hdGVzIHRoYXQgYXJlIG1vcmUgb2Z0ZW4gY2xvc2UgdG8gdGhlIHRydWUgdmFsdWUsIHdvdWxkIHlvdSBwcmVmZXIgYSBzYW1wbGluZyBkaXN0cmlidXRpb24gd2l0aCBhIGxhcmdlIG9yIHNtYWxsIHNwcmVhZD8NCg0KYGBge30NCiMgSW5zZXJ0IGNvZGUgZm9yIEV4ZXJjaXNlIDEwIGhlcmUNCg0Kc2FtcGxlX3Byb3BzMTUgPC0gZ2xvYmFsX21vbml0b3IgJT4lDQogIHJlcF9zYW1wbGVfbihzaXplID0gMTUsIHJlcHMgPSAyMDAwLCByZXBsYWNlID0gVFJVRSkgJT4lDQogIGNvdW50KHNjaWVudGlzdF93b3JrKSAlPiUNCiAgbXV0YXRlKHBfaGF0ID0gbiAvc3VtKG4pKSAlPiUNCiAgZmlsdGVyKHNjaWVudGlzdF93b3JrID09ICJCZW5lZml0cyIpDQpnbGltcHNlKHNhbXBsZV9wcm9wczE1KQ0KZ2xvYmFsX21vbml0b3IgJT4lDQogIGNvdW50KHNjaWVudGlzdF93b3JrKSAlPiUNCiAgbXV0YXRlKHAgPSBuIC9zdW0obikpDQpnZ3Bsb3QoZGF0YSA9IHNhbXBsZV9wcm9wczE1LCBhZXMoeCA9IHBfaGF0KSkgKw0KICBnZW9tX2hpc3RvZ3JhbShiaW53aWR0aCA9IDAuMDc1KSArDQogIGxhYnMoeCA9ICJwX2hhdCAoQmVuZWZpdHMpIiwNCiAgICB0aXRsZSA9ICJTYW1wbGluZyBkaXN0cmlidXRpb24gb2YgcF9oYXQiLA0KICAgIHN1YnRpdGxlID0gIlNhbXBsZSBzaXplID0gMTUsIE51bWJlciBvZiBzYW1wbGVzID0gMjAwMCINCiAgKQ0Kc2FtcGxlX3Byb3BzMTUwIDwtIGdsb2JhbF9tb25pdG9yICU+JQ0KICByZXBfc2FtcGxlX24oc2l6ZSA9IDE1MCwgcmVwcyA9IDIwMDAsIHJlcGxhY2UgPSBUUlVFKSAlPiUNCiAgY291bnQoc2NpZW50aXN0X3dvcmspICU+JQ0KICBtdXRhdGUocF9oYXQgPSBuIC9zdW0obikpICU+JQ0KICBmaWx0ZXIoc2NpZW50aXN0X3dvcmsgPT0gIkJlbmVmaXRzIikNCmdsaW1wc2Uoc2FtcGxlX3Byb3BzMTUwKQ0KZ2dwbG90KGRhdGEgPSBzYW1wbGVfcHJvcHMxNTAsIGFlcyh4ID0gcF9oYXQpKSArDQogIGdlb21faGlzdG9ncmFtKGJpbndpZHRoID0gMC4wMikgKw0KICBsYWJzKHggPSAicF9oYXQgKEJlbmVmaXRzKSIsDQogICAgdGl0bGUgPSAiU2FtcGxpbmcgZGlzdHJpYnV0aW9uIG9mIHBfaGF0IiwNCiAgICBzdWJ0aXRsZSA9ICJTYW1wbGUgc2l6ZSA9IDE1MCwgTnVtYmVyIG9mIHNhbXBsZXMgPSAyMDAwIg0KICApDQpgYGANCg0KQSBzbWFsbGVyIHNwcmVhZCB3b3VsZCBnaXZlIHlvdSBhIGJldHRlciBhcHByb3hpbWF0aW9uIGFuZCB0aGVyZWZvcmUgaXMgbW9yZSBkZXNpcmFibGUgZm9yIGdldHRpbmcgY2xvc2UgdG8gdGhlIHRydWUgdmFsdWUuIEkgdGhpbmsgdGhlIGdyYXBoIEkganVzdCBtYWRlIGZvciAjOSBoYWQgYSBzbWFsbGVyIHNwcmVhZCB0aGFuIHRoZSBncmFwaCBJIG1hZGUgZm9yICM4DQo=