Getting Started

Load packages

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

The data

us_adults <- tibble(
  climate_change_affects = c(rep("Yes", 62000), rep("No", 38000))
)
ggplot(us_adults, aes(x = climate_change_affects)) +
  geom_bar() +
  labs(
    x = "", y = "",
    title = "Do you think climate change is affecting your local community?"
  ) +
  coord_flip()

us_adults %>%
  count(climate_change_affects) %>%
  mutate(p = n /sum(n))
## # A tibble: 2 × 3
##   climate_change_affects     n     p
##   <chr>                  <int> <dbl>
## 1 No                     38000  0.38
## 2 Yes                    62000  0.62

In this lab, you’ll start with a simple random sample of size 60 from the population.

n <- 60
samp <- us_adults %>%
  sample_n(size = n)

Exercise 1

What percent of the adults in your sample think climate change affects their local community? Hint: Just like we did with the population, we can calculate the proportion of those in this sample who think climate change affects their local community.

samp %>%
  count(climate_change_affects) %>%
  mutate(p = n /sum(n))
## # A tibble: 2 × 3
##   climate_change_affects     n     p
##   <chr>                  <int> <dbl>
## 1 No                        27  0.45
## 2 Yes                       33  0.55

Based on the results, 63.33% of the adults think that climate change affects their local community, while 36.67% do not. This means the majority of the sample perceives climate change as having a local impact.

Exercise 2

Would you expect another student’s sample proportion to be identical to yours? Would you expect it to be similar? Why or why not?

I wouldn’t expect another student’s sample proportion to be identical, as random samples can differ. However, I would expect it to be similar, especially if the sample sizes are close. In my sample, 63.33% think climate change affects their local community, so a classmate’s random sample should yield a comparable proportion, though not exactly the same.

Confidence intervals

This code will find the 95 percent confidence interval for proportion of US adults who think climate change affects their local community.

samp %>%
  specify(response = climate_change_affects, success = "Yes") %>%
  generate(reps = 1000, type = "bootstrap") %>%
  calculate(stat = "prop") %>%
  get_ci(level = 0.95)
## # A tibble: 1 × 2
##   lower_ci upper_ci
##      <dbl>    <dbl>
## 1    0.417    0.683

Exercise 3

In the interpretation above, we used the phrase “95% confident”. What does “95% confidence” mean?

We are 95% confident that the true population mean fall within the confidence interval.

Exercise 4

Does your confidence interval capture the true population proportion of US adults who think climate change affects their local community? If you are working on this lab in a classroom, does your neighbor’s interval capture this value?

set.seed(9)
samp %>%
  count(climate_change_affects) %>%
  mutate(p=n/sum(n))
## # A tibble: 2 × 3
##   climate_change_affects     n     p
##   <chr>                  <int> <dbl>
## 1 No                        27  0.45
## 2 Yes                       33  0.55
samp %>%
  specify(response = climate_change_affects, success = "Yes") %>%
  generate(reps = 1000, type = "bootstrap") %>%
  calculate(stat = "prop") %>%
  get_ci(level = 0.95)
## # A tibble: 1 × 2
##   lower_ci upper_ci
##      <dbl>    <dbl>
## 1    0.433    0.667

My confidence interval ranges from 0.5 to 0.75, and it includes the true population proportion. Since we stated that we are 95% confident the true mean falls within this range, and the actual population proportion is 63%, it confirms that the true value is captured by the interval.

Exercise 5

Each student should have gotten a slightly different confidence interval. What proportion of those intervals would you expect to capture the true population mean? Why?

Each student has a slightly different confidence interval, so we expect the proportion of these intervals to fall both slightly above and below 63%.

Exercise 6

Given a sample size of 60, 1000 bootstrap samples for each interval, and 50 confidence intervals constructed (the default values for the above app), what proportion of your confidence intervals include the true population proportion? Is this proportion exactly equal to the confidence level? If not, explain why. Make sure to include your plot in your answer.

set.seed(9999)
#Sample size of 60 entries without replacement.
sampled_entries <- sample_n(samp, size = 60)

#Compute p-hat: count the number that are "Yes," then divide by the sample size.
p_hat <- sum(sampled_entries$climate_change_affects == "Yes") / 1000
p_hat
## [1] 0.033
ggplot(sampled_entries, aes(x = climate_change_affects)) +
  geom_bar() +
  labs(
    x = "", y = "",
    title = "Observation over sample proportion"
  ) +
  coord_flip()

Exercise 7

Choose a different confidence level than 95%. Would you expect a confidence interval at this level to me wider or narrower than the confidence interval you calculated at the 95% confidence level? Explain your reasoning.

If the confidence level is higher than 95%, the interval becomes wider because we need more certainty that the true population value is within the range.

In contrast, a lower confidence level (e.g., 90%) results in a narrower interval since we’re accepting less certainty and a higher chance of error, so the margin for capturing the true value is smaller.

Exercise 8

Using code from the infer package and data fromt the one sample you have (samp), find a confidence interval for the proportion of US Adults who think climate change is affecting their local community with a confidence level of your choosing (other than 95%) and interpret it.

#Calculating the confidence interval
prop <- mean(samp$climate_change_affects == "Yes")  
se <- sqrt(prop * (1 - prop) / nrow(samp))
z_score <- qnorm((1 + 0.85) / 2)
margin_error <- z_score * se

lower <- prop - margin_error
upper <- prop + margin_error
#Printing the confidence interval
cat("Confidence Interval: (", lower, ", ", upper, ")\n")
## Confidence Interval: ( 0.4575444 ,  0.6424556 )

Exercise 9

Using the app, calculate 50 confidence intervals at the confidence level you chose in the previous question, and plot all intervals on one plot, and calculate the proportion of intervals that include the true population proportion. How does this percentage compare to the confidence level selected for the intervals?

An 85% confidence level indicates a lower percentage of intervals that contain the true population proportion. As mentioned earlier, the interval becomes narrower as the confidence level decreases.

Exercise 10

Lastly, try one more (different) confidence level. First, state how you expect the width of this interval to compare to previous ones you calculated. Then, calculate the bounds of the interval using the infer package and data from samp and interpret it. Finally, use the app to generate many intervals and calculate the proportion of intervals that are capture the true population proportion.

set.seed(1)
samp %>%
  count(climate_change_affects) %>%
  mutate(p=n/sum(n))
## # A tibble: 2 × 3
##   climate_change_affects     n     p
##   <chr>                  <int> <dbl>
## 1 No                        27  0.45
## 2 Yes                       33  0.55
samp %>%
  specify(response = climate_change_affects, success = "Yes") %>%
  generate(reps = 1000, type = "bootstrap") %>%
  calculate(stat = "prop") %>%
  get_ci(level = 0.85)
## # A tibble: 1 × 2
##   lower_ci upper_ci
##      <dbl>    <dbl>
## 1     0.45     0.65

Exercise 11

Using the app, experiment with different sample sizes and comment on how the widths of intervals change as sample size changes (increases and decreases).

Larger sample sizes result in narrower confidence intervals, reducing uncertainty and improving precision. In contrast, smaller sample sizes lead to wider intervals, increasing uncertainty and decreasing accuracy. Therefore, sample size greatly influences the precision and width of confidence intervals in statistical analysis.

Exercise 12

Finally, given a sample size (say, 60), how does the width of the interval change as you increase the number of bootstrap samples. Hint: Does changing the number of bootstap samples affect the standard error?

The width of the interval stays consistent as the number of bootstrap samples changes. Increasing the number of bootstrap samples reduces variability, resulting in more reliable standard error estimates.

LS0tDQp0aXRsZTogIkxhYiA1IHBhcnQgSUk6IEZvdW5kYXRpb25zIGZvciBzdGF0aXN0aWNhbCBpbmZlcmVuY2UgLSBDb25maWRlbmNlIGludGVydmFscyINCmF1dGhvcjogIkxhdXJhIEIiDQpkYXRlOiAiYHIgU3lzLkRhdGUoKWAiDQpvdXRwdXQ6IG9wZW5pbnRybzo6bGFiX3JlcG9ydA0KLS0tDQoNCiMjIyBHZXR0aW5nIFN0YXJ0ZWQNCg0KIyMjIyBMb2FkIHBhY2thZ2VzDQoNCmBgYHtyIGxvYWQtcGFja2FnZXMsIG1lc3NhZ2U9RkFMU0V9DQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCmxpYnJhcnkob3BlbmludHJvKQ0KbGlicmFyeShpbmZlcikNCmBgYA0KDQojIyMjIFRoZSBkYXRhDQoNCmBgYHtyfQ0KdXNfYWR1bHRzIDwtIHRpYmJsZSgNCiAgY2xpbWF0ZV9jaGFuZ2VfYWZmZWN0cyA9IGMocmVwKCJZZXMiLCA2MjAwMCksIHJlcCgiTm8iLCAzODAwMCkpDQopDQpgYGANCg0KYGBge3J9DQpnZ3Bsb3QodXNfYWR1bHRzLCBhZXMoeCA9IGNsaW1hdGVfY2hhbmdlX2FmZmVjdHMpKSArDQogIGdlb21fYmFyKCkgKw0KICBsYWJzKA0KICAgIHggPSAiIiwgeSA9ICIiLA0KICAgIHRpdGxlID0gIkRvIHlvdSB0aGluayBjbGltYXRlIGNoYW5nZSBpcyBhZmZlY3RpbmcgeW91ciBsb2NhbCBjb21tdW5pdHk/Ig0KICApICsNCiAgY29vcmRfZmxpcCgpDQpgYGANCg0KYGBge3J9DQp1c19hZHVsdHMgJT4lDQogIGNvdW50KGNsaW1hdGVfY2hhbmdlX2FmZmVjdHMpICU+JQ0KICBtdXRhdGUocCA9IG4gL3N1bShuKSkNCmBgYA0KDQpJbiB0aGlzIGxhYiwgeW914oCZbGwgc3RhcnQgd2l0aCBhIHNpbXBsZSByYW5kb20gc2FtcGxlIG9mIHNpemUgNjAgZnJvbSB0aGUgcG9wdWxhdGlvbi4NCg0KYGBge3J9DQpuIDwtIDYwDQpzYW1wIDwtIHVzX2FkdWx0cyAlPiUNCiAgc2FtcGxlX24oc2l6ZSA9IG4pDQpgYGANCg0KDQoNCiMjIyBFeGVyY2lzZSAxDQoNCldoYXQgcGVyY2VudCBvZiB0aGUgYWR1bHRzIGluIHlvdXIgc2FtcGxlIHRoaW5rIGNsaW1hdGUgY2hhbmdlIGFmZmVjdHMgdGhlaXIgbG9jYWwgY29tbXVuaXR5PyBIaW50OiBKdXN0IGxpa2Ugd2UgZGlkIHdpdGggdGhlIHBvcHVsYXRpb24sIHdlIGNhbiBjYWxjdWxhdGUgdGhlIHByb3BvcnRpb24gb2YgdGhvc2UgaW4gdGhpcyBzYW1wbGUgd2hvIHRoaW5rIGNsaW1hdGUgY2hhbmdlIGFmZmVjdHMgdGhlaXIgbG9jYWwgY29tbXVuaXR5Lg0KDQpgYGB7cn0NCnNhbXAgJT4lDQogIGNvdW50KGNsaW1hdGVfY2hhbmdlX2FmZmVjdHMpICU+JQ0KICBtdXRhdGUocCA9IG4gL3N1bShuKSkNCmBgYA0KDQpCYXNlZCBvbiB0aGUgcmVzdWx0cywgNjMuMzMlIG9mIHRoZSBhZHVsdHMgdGhpbmsgdGhhdCBjbGltYXRlIGNoYW5nZSBhZmZlY3RzIHRoZWlyIGxvY2FsIGNvbW11bml0eSwgd2hpbGUgMzYuNjclIGRvIG5vdC4gVGhpcyBtZWFucyB0aGUgbWFqb3JpdHkgb2YgdGhlIHNhbXBsZSBwZXJjZWl2ZXMgY2xpbWF0ZSBjaGFuZ2UgYXMgaGF2aW5nIGEgbG9jYWwgaW1wYWN0Lg0KDQojIyMgRXhlcmNpc2UgMg0KDQpXb3VsZCB5b3UgZXhwZWN0IGFub3RoZXIgc3R1ZGVudOKAmXMgc2FtcGxlIHByb3BvcnRpb24gdG8gYmUgaWRlbnRpY2FsIHRvIHlvdXJzPyBXb3VsZCB5b3UgZXhwZWN0IGl0IHRvIGJlIHNpbWlsYXI/IFdoeSBvciB3aHkgbm90Pw0KDQpJIHdvdWxkbid0IGV4cGVjdCBhbm90aGVyIHN0dWRlbnQncyBzYW1wbGUgcHJvcG9ydGlvbiB0byBiZSBpZGVudGljYWwsIGFzIHJhbmRvbSBzYW1wbGVzIGNhbiBkaWZmZXIuIEhvd2V2ZXIsIEkgd291bGQgZXhwZWN0IGl0IHRvIGJlIHNpbWlsYXIsIGVzcGVjaWFsbHkgaWYgdGhlIHNhbXBsZSBzaXplcyBhcmUgY2xvc2UuIEluIG15IHNhbXBsZSwgNjMuMzMlIHRoaW5rIGNsaW1hdGUgY2hhbmdlIGFmZmVjdHMgdGhlaXIgbG9jYWwgY29tbXVuaXR5LCBzbyBhIGNsYXNzbWF0ZSdzIHJhbmRvbSBzYW1wbGUgc2hvdWxkIHlpZWxkIGEgY29tcGFyYWJsZSBwcm9wb3J0aW9uLCB0aG91Z2ggbm90IGV4YWN0bHkgdGhlIHNhbWUuDQoNCg0KIyMjIENvbmZpZGVuY2UgaW50ZXJ2YWxzDQoNClRoaXMgY29kZSB3aWxsIGZpbmQgdGhlIDk1IHBlcmNlbnQgY29uZmlkZW5jZSBpbnRlcnZhbCBmb3IgcHJvcG9ydGlvbiBvZiBVUyBhZHVsdHMgd2hvIHRoaW5rIGNsaW1hdGUgY2hhbmdlIGFmZmVjdHMgdGhlaXIgbG9jYWwgY29tbXVuaXR5Lg0KDQpgYGB7cn0NCnNhbXAgJT4lDQogIHNwZWNpZnkocmVzcG9uc2UgPSBjbGltYXRlX2NoYW5nZV9hZmZlY3RzLCBzdWNjZXNzID0gIlllcyIpICU+JQ0KICBnZW5lcmF0ZShyZXBzID0gMTAwMCwgdHlwZSA9ICJib290c3RyYXAiKSAlPiUNCiAgY2FsY3VsYXRlKHN0YXQgPSAicHJvcCIpICU+JQ0KICBnZXRfY2kobGV2ZWwgPSAwLjk1KQ0KYGBgDQoNCg0KIyMjIEV4ZXJjaXNlIDMNCg0KSW4gdGhlIGludGVycHJldGF0aW9uIGFib3ZlLCB3ZSB1c2VkIHRoZSBwaHJhc2Ug4oCcOTUlIGNvbmZpZGVudOKAnS4gV2hhdCBkb2VzIOKAnDk1JSBjb25maWRlbmNl4oCdIG1lYW4/DQoNCldlIGFyZSA5NSUgY29uZmlkZW50IHRoYXQgdGhlIHRydWUgcG9wdWxhdGlvbiBtZWFuIGZhbGwgd2l0aGluIHRoZSBjb25maWRlbmNlIGludGVydmFsLg0KDQojIyMgRXhlcmNpc2UgNA0KDQpEb2VzIHlvdXIgY29uZmlkZW5jZSBpbnRlcnZhbCBjYXB0dXJlIHRoZSB0cnVlIHBvcHVsYXRpb24gcHJvcG9ydGlvbiBvZiBVUyBhZHVsdHMgd2hvIHRoaW5rIGNsaW1hdGUgY2hhbmdlIGFmZmVjdHMgdGhlaXIgbG9jYWwgY29tbXVuaXR5PyBJZiB5b3UgYXJlIHdvcmtpbmcgb24gdGhpcyBsYWIgaW4gYSBjbGFzc3Jvb20sIGRvZXMgeW91ciBuZWlnaGJvcuKAmXMgaW50ZXJ2YWwgY2FwdHVyZSB0aGlzIHZhbHVlPw0KDQpgYGB7cn0NCnNldC5zZWVkKDkpDQpzYW1wICU+JQ0KICBjb3VudChjbGltYXRlX2NoYW5nZV9hZmZlY3RzKSAlPiUNCiAgbXV0YXRlKHA9bi9zdW0obikpDQpgYGANCg0KYGBge3J9DQpzYW1wICU+JQ0KICBzcGVjaWZ5KHJlc3BvbnNlID0gY2xpbWF0ZV9jaGFuZ2VfYWZmZWN0cywgc3VjY2VzcyA9ICJZZXMiKSAlPiUNCiAgZ2VuZXJhdGUocmVwcyA9IDEwMDAsIHR5cGUgPSAiYm9vdHN0cmFwIikgJT4lDQogIGNhbGN1bGF0ZShzdGF0ID0gInByb3AiKSAlPiUNCiAgZ2V0X2NpKGxldmVsID0gMC45NSkNCmBgYA0KDQpNeSBjb25maWRlbmNlIGludGVydmFsIHJhbmdlcyBmcm9tIDAuNSB0byAwLjc1LCBhbmQgaXQgaW5jbHVkZXMgdGhlIHRydWUgcG9wdWxhdGlvbiBwcm9wb3J0aW9uLiBTaW5jZSB3ZSBzdGF0ZWQgdGhhdCB3ZSBhcmUgOTUlIGNvbmZpZGVudCB0aGUgdHJ1ZSBtZWFuIGZhbGxzIHdpdGhpbiB0aGlzIHJhbmdlLCBhbmQgdGhlIGFjdHVhbCBwb3B1bGF0aW9uIHByb3BvcnRpb24gaXMgNjMlLCBpdCBjb25maXJtcyB0aGF0IHRoZSB0cnVlIHZhbHVlIGlzIGNhcHR1cmVkIGJ5IHRoZSBpbnRlcnZhbC4NCg0KIyMjIEV4ZXJjaXNlIDUNCg0KRWFjaCBzdHVkZW50IHNob3VsZCBoYXZlIGdvdHRlbiBhIHNsaWdodGx5IGRpZmZlcmVudCBjb25maWRlbmNlIGludGVydmFsLiBXaGF0IHByb3BvcnRpb24gb2YgdGhvc2UgaW50ZXJ2YWxzIHdvdWxkIHlvdSBleHBlY3QgdG8gY2FwdHVyZSB0aGUgdHJ1ZSBwb3B1bGF0aW9uIG1lYW4/IFdoeT8NCg0KRWFjaCBzdHVkZW50IGhhcyBhIHNsaWdodGx5IGRpZmZlcmVudCBjb25maWRlbmNlIGludGVydmFsLCBzbyB3ZSBleHBlY3QgdGhlIHByb3BvcnRpb24gb2YgdGhlc2UgaW50ZXJ2YWxzIHRvIGZhbGwgYm90aCBzbGlnaHRseSBhYm92ZSBhbmQgYmVsb3cgNjMlLg0KDQojIyMgRXhlcmNpc2UgNg0KDQpHaXZlbiBhIHNhbXBsZSBzaXplIG9mIDYwLCAxMDAwIGJvb3RzdHJhcCBzYW1wbGVzIGZvciBlYWNoIGludGVydmFsLCBhbmQgNTAgY29uZmlkZW5jZSBpbnRlcnZhbHMgY29uc3RydWN0ZWQgKHRoZSBkZWZhdWx0IHZhbHVlcyBmb3IgdGhlIGFib3ZlIGFwcCksIHdoYXQgcHJvcG9ydGlvbiBvZiB5b3VyIGNvbmZpZGVuY2UgaW50ZXJ2YWxzIGluY2x1ZGUgdGhlIHRydWUgcG9wdWxhdGlvbiBwcm9wb3J0aW9uPyBJcyB0aGlzIHByb3BvcnRpb24gZXhhY3RseSBlcXVhbCB0byB0aGUgY29uZmlkZW5jZSBsZXZlbD8gSWYgbm90LCBleHBsYWluIHdoeS4gTWFrZSBzdXJlIHRvIGluY2x1ZGUgeW91ciBwbG90IGluIHlvdXIgYW5zd2VyLg0KDQpgYGB7cn0NCnNldC5zZWVkKDk5OTkpDQojU2FtcGxlIHNpemUgb2YgNjAgZW50cmllcyB3aXRob3V0IHJlcGxhY2VtZW50Lg0Kc2FtcGxlZF9lbnRyaWVzIDwtIHNhbXBsZV9uKHNhbXAsIHNpemUgPSA2MCkNCg0KI0NvbXB1dGUgcC1oYXQ6IGNvdW50IHRoZSBudW1iZXIgdGhhdCBhcmUgIlllcywiIHRoZW4gZGl2aWRlIGJ5IHRoZSBzYW1wbGUgc2l6ZS4NCnBfaGF0IDwtIHN1bShzYW1wbGVkX2VudHJpZXMkY2xpbWF0ZV9jaGFuZ2VfYWZmZWN0cyA9PSAiWWVzIikgLyAxMDAwDQpwX2hhdA0KDQpgYGANCg0KYGBge3J9DQpnZ3Bsb3Qoc2FtcGxlZF9lbnRyaWVzLCBhZXMoeCA9IGNsaW1hdGVfY2hhbmdlX2FmZmVjdHMpKSArDQogIGdlb21fYmFyKCkgKw0KICBsYWJzKA0KICAgIHggPSAiIiwgeSA9ICIiLA0KICAgIHRpdGxlID0gIk9ic2VydmF0aW9uIG92ZXIgc2FtcGxlIHByb3BvcnRpb24iDQogICkgKw0KICBjb29yZF9mbGlwKCkNCmBgYA0KDQoNCiMjIyBFeGVyY2lzZSA3DQoNCkNob29zZSBhIGRpZmZlcmVudCBjb25maWRlbmNlIGxldmVsIHRoYW4gOTUlLiBXb3VsZCB5b3UgZXhwZWN0IGEgY29uZmlkZW5jZSBpbnRlcnZhbCBhdCB0aGlzIGxldmVsIHRvIG1lIHdpZGVyIG9yIG5hcnJvd2VyIHRoYW4gdGhlIGNvbmZpZGVuY2UgaW50ZXJ2YWwgeW91IGNhbGN1bGF0ZWQgYXQgdGhlIDk1JSBjb25maWRlbmNlIGxldmVsPyBFeHBsYWluIHlvdXIgcmVhc29uaW5nLg0KDQpJZiB0aGUgY29uZmlkZW5jZSBsZXZlbCBpcyBoaWdoZXIgdGhhbiA5NSUsIHRoZSBpbnRlcnZhbCBiZWNvbWVzIHdpZGVyIGJlY2F1c2Ugd2UgbmVlZCBtb3JlIGNlcnRhaW50eSB0aGF0IHRoZSB0cnVlIHBvcHVsYXRpb24gdmFsdWUgaXMgd2l0aGluIHRoZSByYW5nZS4NCg0KSW4gY29udHJhc3QsIGEgbG93ZXIgY29uZmlkZW5jZSBsZXZlbCAoZS5nLiwgOTAlKSByZXN1bHRzIGluIGEgbmFycm93ZXIgaW50ZXJ2YWwgc2luY2Ugd2UncmUgYWNjZXB0aW5nIGxlc3MgY2VydGFpbnR5IGFuZCBhIGhpZ2hlciBjaGFuY2Ugb2YgZXJyb3IsIHNvIHRoZSBtYXJnaW4gZm9yIGNhcHR1cmluZyB0aGUgdHJ1ZSB2YWx1ZSBpcyBzbWFsbGVyLg0KDQojIyMgRXhlcmNpc2UgOA0KDQpVc2luZyBjb2RlIGZyb20gdGhlIGluZmVyIHBhY2thZ2UgYW5kIGRhdGEgZnJvbXQgdGhlIG9uZSBzYW1wbGUgeW91IGhhdmUgKHNhbXApLCBmaW5kIGEgY29uZmlkZW5jZSBpbnRlcnZhbCBmb3IgdGhlIHByb3BvcnRpb24gb2YgVVMgQWR1bHRzIHdobyB0aGluayBjbGltYXRlIGNoYW5nZSBpcyBhZmZlY3RpbmcgdGhlaXIgbG9jYWwgY29tbXVuaXR5IHdpdGggYSBjb25maWRlbmNlIGxldmVsIG9mIHlvdXIgY2hvb3NpbmcgKG90aGVyIHRoYW4gOTUlKSBhbmQgaW50ZXJwcmV0IGl0Lg0KDQpgYGB7cn0NCiNDYWxjdWxhdGluZyB0aGUgY29uZmlkZW5jZSBpbnRlcnZhbA0KcHJvcCA8LSBtZWFuKHNhbXAkY2xpbWF0ZV9jaGFuZ2VfYWZmZWN0cyA9PSAiWWVzIikgIA0Kc2UgPC0gc3FydChwcm9wICogKDEgLSBwcm9wKSAvIG5yb3coc2FtcCkpDQp6X3Njb3JlIDwtIHFub3JtKCgxICsgMC44NSkgLyAyKQ0KbWFyZ2luX2Vycm9yIDwtIHpfc2NvcmUgKiBzZQ0KDQpsb3dlciA8LSBwcm9wIC0gbWFyZ2luX2Vycm9yDQp1cHBlciA8LSBwcm9wICsgbWFyZ2luX2Vycm9yDQojUHJpbnRpbmcgdGhlIGNvbmZpZGVuY2UgaW50ZXJ2YWwNCmNhdCgiQ29uZmlkZW5jZSBJbnRlcnZhbDogKCIsIGxvd2VyLCAiLCAiLCB1cHBlciwgIilcbiIpDQpgYGANCg0KDQojIyMgRXhlcmNpc2UgOQ0KDQpVc2luZyB0aGUgYXBwLCBjYWxjdWxhdGUgNTAgY29uZmlkZW5jZSBpbnRlcnZhbHMgYXQgdGhlIGNvbmZpZGVuY2UgbGV2ZWwgeW91IGNob3NlIGluIHRoZSBwcmV2aW91cyBxdWVzdGlvbiwgYW5kIHBsb3QgYWxsIGludGVydmFscyBvbiBvbmUgcGxvdCwgYW5kIGNhbGN1bGF0ZSB0aGUgcHJvcG9ydGlvbiBvZiBpbnRlcnZhbHMgdGhhdCBpbmNsdWRlIHRoZSB0cnVlIHBvcHVsYXRpb24gcHJvcG9ydGlvbi4gSG93IGRvZXMgdGhpcyBwZXJjZW50YWdlIGNvbXBhcmUgdG8gdGhlIGNvbmZpZGVuY2UgbGV2ZWwgc2VsZWN0ZWQgZm9yIHRoZSBpbnRlcnZhbHM/DQoNCkFuIDg1JSBjb25maWRlbmNlIGxldmVsIGluZGljYXRlcyBhIGxvd2VyIHBlcmNlbnRhZ2Ugb2YgaW50ZXJ2YWxzIHRoYXQgY29udGFpbiB0aGUgdHJ1ZSBwb3B1bGF0aW9uIHByb3BvcnRpb24uIEFzIG1lbnRpb25lZCBlYXJsaWVyLCB0aGUgaW50ZXJ2YWwgYmVjb21lcyBuYXJyb3dlciBhcyB0aGUgY29uZmlkZW5jZSBsZXZlbCBkZWNyZWFzZXMuDQoNCiMjIyBFeGVyY2lzZSAxMA0KDQpMYXN0bHksIHRyeSBvbmUgbW9yZSAoZGlmZmVyZW50KSBjb25maWRlbmNlIGxldmVsLiBGaXJzdCwgc3RhdGUgaG93IHlvdSBleHBlY3QgdGhlIHdpZHRoIG9mIHRoaXMgaW50ZXJ2YWwgdG8gY29tcGFyZSB0byBwcmV2aW91cyBvbmVzIHlvdSBjYWxjdWxhdGVkLiBUaGVuLCBjYWxjdWxhdGUgdGhlIGJvdW5kcyBvZiB0aGUgaW50ZXJ2YWwgdXNpbmcgdGhlIGluZmVyIHBhY2thZ2UgYW5kIGRhdGEgZnJvbSBzYW1wIGFuZCBpbnRlcnByZXQgaXQuIEZpbmFsbHksIHVzZSB0aGUgYXBwIHRvIGdlbmVyYXRlIG1hbnkgaW50ZXJ2YWxzIGFuZCBjYWxjdWxhdGUgdGhlIHByb3BvcnRpb24gb2YgaW50ZXJ2YWxzIHRoYXQgYXJlIGNhcHR1cmUgdGhlIHRydWUgcG9wdWxhdGlvbiBwcm9wb3J0aW9uLg0KDQpgYGB7cn0NCnNldC5zZWVkKDEpDQpzYW1wICU+JQ0KICBjb3VudChjbGltYXRlX2NoYW5nZV9hZmZlY3RzKSAlPiUNCiAgbXV0YXRlKHA9bi9zdW0obikpDQpgYGANCg0KYGBge3J9DQpzYW1wICU+JQ0KICBzcGVjaWZ5KHJlc3BvbnNlID0gY2xpbWF0ZV9jaGFuZ2VfYWZmZWN0cywgc3VjY2VzcyA9ICJZZXMiKSAlPiUNCiAgZ2VuZXJhdGUocmVwcyA9IDEwMDAsIHR5cGUgPSAiYm9vdHN0cmFwIikgJT4lDQogIGNhbGN1bGF0ZShzdGF0ID0gInByb3AiKSAlPiUNCiAgZ2V0X2NpKGxldmVsID0gMC44NSkNCmBgYA0KDQoNCiMjIyBFeGVyY2lzZSAxMQ0KDQpVc2luZyB0aGUgYXBwLCBleHBlcmltZW50IHdpdGggZGlmZmVyZW50IHNhbXBsZSBzaXplcyBhbmQgY29tbWVudCBvbiBob3cgdGhlIHdpZHRocyBvZiBpbnRlcnZhbHMgY2hhbmdlIGFzIHNhbXBsZSBzaXplIGNoYW5nZXMgKGluY3JlYXNlcyBhbmQgZGVjcmVhc2VzKS4NCg0KTGFyZ2VyIHNhbXBsZSBzaXplcyByZXN1bHQgaW4gbmFycm93ZXIgY29uZmlkZW5jZSBpbnRlcnZhbHMsIHJlZHVjaW5nIHVuY2VydGFpbnR5IGFuZCBpbXByb3ZpbmcgcHJlY2lzaW9uLiBJbiBjb250cmFzdCwgc21hbGxlciBzYW1wbGUgc2l6ZXMgbGVhZCB0byB3aWRlciBpbnRlcnZhbHMsIGluY3JlYXNpbmcgdW5jZXJ0YWludHkgYW5kIGRlY3JlYXNpbmcgYWNjdXJhY3kuIFRoZXJlZm9yZSwgc2FtcGxlIHNpemUgZ3JlYXRseSBpbmZsdWVuY2VzIHRoZSBwcmVjaXNpb24gYW5kIHdpZHRoIG9mIGNvbmZpZGVuY2UgaW50ZXJ2YWxzIGluIHN0YXRpc3RpY2FsIGFuYWx5c2lzLg0KDQojIyMgRXhlcmNpc2UgMTINCg0KRmluYWxseSwgZ2l2ZW4gYSBzYW1wbGUgc2l6ZSAoc2F5LCA2MCksIGhvdyBkb2VzIHRoZSB3aWR0aCBvZiB0aGUgaW50ZXJ2YWwgY2hhbmdlIGFzIHlvdSBpbmNyZWFzZSB0aGUgbnVtYmVyIG9mIGJvb3RzdHJhcCBzYW1wbGVzLiBIaW50OiBEb2VzIGNoYW5naW5nIHRoZSBudW1iZXIgb2YgYm9vdHN0YXAgc2FtcGxlcyBhZmZlY3QgdGhlIHN0YW5kYXJkIGVycm9yPw0KDQpUaGUgd2lkdGggb2YgdGhlIGludGVydmFsIHN0YXlzIGNvbnNpc3RlbnQgYXMgdGhlIG51bWJlciBvZiBib290c3RyYXAgc2FtcGxlcyBjaGFuZ2VzLiBJbmNyZWFzaW5nIHRoZSBudW1iZXIgb2YgYm9vdHN0cmFwIHNhbXBsZXMgcmVkdWNlcyB2YXJpYWJpbGl0eSwgcmVzdWx0aW5nIGluIG1vcmUgcmVsaWFibGUgc3RhbmRhcmQgZXJyb3IgZXN0aW1hdGVzLg0KDQo=