Getting Started

Loading packages

library(tidyverse)
library(openintro)
library(infer)
set.seed(99)

Creating the data

We will assume a total population size of 100,000 even though that’s much smaller than the population of all US adults to keep our computations simple. The proportion of interest is: Roughly six-in-ten U.S adults (62%) say climate change in currently affecting their local community either a great deal or some, according to a new Pew Research Center survey.

us_adults <- tibble(
  climate_change_affects = c(rep("Yes", 62000), rep("No", 38000))
)

Visualization of distribution of responses:

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()

Obtaining summary statistics:

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

Starting with sample size of 60

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

1. What percent of the adults in your sample 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                        21  0.35
## 2 Yes                       39  0.65

About 55% of adults in this sample think climate change affects their local community.

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 would expect it to be similar, but not identical. We are pulling data from the same source but through the repeated sampling process, our samples should be around the population proportion of 62%.

Confidence Intervals

Finding the 95% 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.533    0.767

Confidence levels

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

We are 95% confident that the true proportion of U.S. adults that think that climate change is affecting their local community is between 0.417 and 0.667. 95% confidence means that 95% of the times we gather samples and plot their means, it will fall between these parameters.

2. 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?

Yes, it will capture the true population proportion of US adults who think climate change affects their local community 95% of the time. If we are in a classroom, we can expect our neighbor’s interval to capture this value.

3. 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?

I would expect 95% of these intervals to capture the true population proportion since that is what we were aiming for from the beginning and was integrated in our calculations.

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.

In this simulation, 48 out of 50 of the confidence intervals constructed included the true population proportion. This is consistent with our 95% confidence level. While not exactly the same value, this is expected due to the nature of this process.

More Practice

1. If we chose a confidence level lower than 95%, it would narrow the interval. This is because there is more uncertainty as we go down in confidence, and the true proportion will be captured at a lesser rate than 95%.

2. Using code from the infer package and data from 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.

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

We are 90% confident that the true proportion of US adults that think that climate change is affecting their local communities is between 0.433 and 0.650

3. 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?

I utilized a 90% confidence level. The proportion of intervals that that included the true proportion was 44/50 which 0.88, or 88%. This is very close to our confidence level.

4. 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.

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

Our app is consistent with our bootstrapping simulation, in which 41 out of 50 confidence intervals captured the true population proportion.

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

We notice that as we increase the sample size, the width of the intervals decreases. The contrary occurs when we decrease sample size.

6. Finally, given a sample size (say, 60), how does the width of the interval change as you increase the number of bootstrap samples.

Widths do not seem to change as adjust the number of bootstrap samples.

LS0tCnRpdGxlOiAiTUFUSDIxNyBMYWIgSHciCmF1dGhvcjogIklicmFoaW0gUGluem9uIFBlcmV6IgpkYXRlOiAiYHIgU3lzLkRhdGUoKWAiCm91dHB1dDogb3BlbmludHJvOjpsYWJfcmVwb3J0Ci0tLQoKIyMgR2V0dGluZyBTdGFydGVkCgojIyMgTG9hZGluZyBwYWNrYWdlcwoKYGBge3IsIG1lc3NhZ2U9RkFMU0V9CmxpYnJhcnkodGlkeXZlcnNlKQpsaWJyYXJ5KG9wZW5pbnRybykKbGlicmFyeShpbmZlcikKc2V0LnNlZWQoOTkpCmBgYAoKIyMjIENyZWF0aW5nIHRoZSBkYXRhCgpXZSB3aWxsIGFzc3VtZSBhIHRvdGFsIHBvcHVsYXRpb24gc2l6ZSBvZiAxMDAsMDAwIGV2ZW4gdGhvdWdoIHRoYXQncyBtdWNoIHNtYWxsZXIgdGhhbiB0aGUgcG9wdWxhdGlvbiBvZiBhbGwgVVMgYWR1bHRzIHRvIGtlZXAgb3VyIGNvbXB1dGF0aW9ucyBzaW1wbGUuIFRoZSBwcm9wb3J0aW9uIG9mIGludGVyZXN0IGlzOiBSb3VnaGx5IHNpeC1pbi10ZW4gVS5TIGFkdWx0cyAoNjIlKSBzYXkgY2xpbWF0ZSBjaGFuZ2UgaW4gY3VycmVudGx5IGFmZmVjdGluZyB0aGVpciBsb2NhbCBjb21tdW5pdHkgZWl0aGVyIGEgZ3JlYXQgZGVhbCBvciBzb21lLCBhY2NvcmRpbmcgdG8gYSBuZXcgUGV3IFJlc2VhcmNoIENlbnRlciBzdXJ2ZXkuIAoKYGBge3J9CnVzX2FkdWx0cyA8LSB0aWJibGUoCiAgY2xpbWF0ZV9jaGFuZ2VfYWZmZWN0cyA9IGMocmVwKCJZZXMiLCA2MjAwMCksIHJlcCgiTm8iLCAzODAwMCkpCikKYGBgCgpWaXN1YWxpemF0aW9uIG9mIGRpc3RyaWJ1dGlvbiBvZiByZXNwb25zZXM6IAoKYGBge3J9CmdncGxvdCh1c19hZHVsdHMsIGFlcyh4ID0gY2xpbWF0ZV9jaGFuZ2VfYWZmZWN0cykpICsKICBnZW9tX2JhcigpICsKICBsYWJzKAogICAgeCA9ICIiLCB5ID0iIiwKICAgIHRpdGxlID0gIkRvIHlvdSB0aGluayBjbGltYXRlIGNoYW5nZSBpcyBhZmZlY3RpbmcgeW91ciBsb2NhbCBjb21tdW5pdHk/IgogICkgKwogIGNvb3JkX2ZsaXAoKQpgYGAKCk9idGFpbmluZyBzdW1tYXJ5IHN0YXRpc3RpY3M6IAoKYGBge3J9CnVzX2FkdWx0cyAlPiUgY291bnQoY2xpbWF0ZV9jaGFuZ2VfYWZmZWN0cykgJT4lIG11dGF0ZSAocCA9IG4vc3VtKG4pKQpgYGAKClN0YXJ0aW5nIHdpdGggc2FtcGxlIHNpemUgb2YgNjAKCmBgYHtyfQpuIDwtIDYwCnNhbXAgPC0gdXNfYWR1bHRzICU+JQogIHNhbXBsZV9uKHNpemUgPSBuKQpgYGAKCiMjIyMgMS4gV2hhdCBwZXJjZW50IG9mIHRoZSBhZHVsdHMgaW4geW91ciBzYW1wbGUgdGhpbmsgY2xpbWF0ZSBjaGFuZ2UgYWZmZWN0cyB0aGVpciBsb2NhbCBjb21tdW5pdHk/CgpgYGB7cn0Kc2FtcCAlPiUgY291bnQoY2xpbWF0ZV9jaGFuZ2VfYWZmZWN0cykgJT4lIG11dGF0ZShwID0gbi9zdW0obikpCmBgYAoKQWJvdXQgNTUlIG9mIGFkdWx0cyBpbiB0aGlzIHNhbXBsZSB0aGluayBjbGltYXRlIGNoYW5nZSBhZmZlY3RzIHRoZWlyIGxvY2FsIGNvbW11bml0eS4KCiMjIyMgMi4gV291bGQgeW91IGV4cGVjdCBhbm90aGVyIHN0dWRlbnTigJlzIHNhbXBsZSBwcm9wb3J0aW9uIHRvIGJlIGlkZW50aWNhbCB0byB5b3Vycz8gV291bGQgeW91IGV4cGVjdCBpdCB0byBiZSBzaW1pbGFyPyBXaHkgb3Igd2h5IG5vdD8KCkkgd291bGQgZXhwZWN0IGl0IHRvIGJlIHNpbWlsYXIsIGJ1dCBub3QgaWRlbnRpY2FsLiBXZSBhcmUgcHVsbGluZyBkYXRhIGZyb20gdGhlIHNhbWUgc291cmNlIGJ1dCB0aHJvdWdoIHRoZSByZXBlYXRlZCBzYW1wbGluZyBwcm9jZXNzLCBvdXIgc2FtcGxlcyBzaG91bGQgYmUgYXJvdW5kIHRoZSBwb3B1bGF0aW9uIHByb3BvcnRpb24gb2YgNjIlLiAKCiMjIENvbmZpZGVuY2UgSW50ZXJ2YWxzCgpGaW5kaW5nIHRoZSA5NSUgY29uZmlkZW5jZSBpbnRlcnZhbCBmb3IgcHJvcG9ydGlvbiBvZiBVUyBhZHVsdHMgd2hvIHRoaW5rIGNsaW1hdGUgY2hhbmdlIGFmZmVjdHMgdGhlaXIgbG9jYWwgY29tbXVuaXR5CgpgYGB7cn0Kc2FtcCAlPiUKICBzcGVjaWZ5KHJlc3BvbnNlID0gY2xpbWF0ZV9jaGFuZ2VfYWZmZWN0cywgc3VjY2VzcyA9ICJZZXMiKSAlPiUgCiAgZ2VuZXJhdGUocmVwcyA9IDEwMDAsIHR5cGUgPSAiYm9vdHN0cmFwIikgJT4lIAogIGNhbGN1bGF0ZShzdGF0ID0gInByb3AiKSAlPiUKICBnZXRfY2kobGV2ZWwgPSAwLjk1KQpgYGAKCiMjIyBDb25maWRlbmNlIGxldmVscwoKIyMjIyAxLiBJbiB0aGUgaW50ZXJwcmV0YXRpb24gYWJvdmUsIHdlIHVzZWQgdGhlIHBocmFzZSDigJw5NSUgY29uZmlkZW504oCdLiBXaGF0IGRvZXMg4oCcOTUlIGNvbmZpZGVuY2XigJ0gbWVhbj8KCldlIGFyZSA5NSUgY29uZmlkZW50IHRoYXQgdGhlIHRydWUgcHJvcG9ydGlvbiBvZiBVLlMuIGFkdWx0cyB0aGF0IHRoaW5rIHRoYXQgY2xpbWF0ZSBjaGFuZ2UgaXMgYWZmZWN0aW5nIHRoZWlyIGxvY2FsIGNvbW11bml0eSBpcyBiZXR3ZWVuIDAuNDE3IGFuZCAwLjY2Ny4gOTUlIGNvbmZpZGVuY2UgbWVhbnMgdGhhdCA5NSUgb2YgdGhlIHRpbWVzIHdlIGdhdGhlciBzYW1wbGVzIGFuZCBwbG90IHRoZWlyIG1lYW5zLCBpdCB3aWxsIGZhbGwgYmV0d2VlbiB0aGVzZSBwYXJhbWV0ZXJzLiAgIAoKIyMjIyAyLiBEb2VzIHlvdXIgY29uZmlkZW5jZSBpbnRlcnZhbCBjYXB0dXJlIHRoZSB0cnVlIHBvcHVsYXRpb24gcHJvcG9ydGlvbiBvZiBVUyBhZHVsdHMgd2hvIHRoaW5rIGNsaW1hdGUgY2hhbmdlIGFmZmVjdHMgdGhlaXIgbG9jYWwgY29tbXVuaXR5PyBJZiB5b3UgYXJlIHdvcmtpbmcgb24gdGhpcyBsYWIgaW4gYSBjbGFzc3Jvb20sIGRvZXMgeW91ciBuZWlnaGJvcuKAmXMgaW50ZXJ2YWwgY2FwdHVyZSB0aGlzIHZhbHVlPwoKWWVzLCBpdCB3aWxsIGNhcHR1cmUgdGhlIHRydWUgcG9wdWxhdGlvbiBwcm9wb3J0aW9uIG9mIFVTIGFkdWx0cyB3aG8gdGhpbmsgY2xpbWF0ZSBjaGFuZ2UgYWZmZWN0cyB0aGVpciBsb2NhbCBjb21tdW5pdHkgOTUlIG9mIHRoZSB0aW1lLiBJZiB3ZSBhcmUgaW4gYSBjbGFzc3Jvb20sIHdlIGNhbiBleHBlY3Qgb3VyIG5laWdoYm9yJ3MgaW50ZXJ2YWwgdG8gY2FwdHVyZSB0aGlzIHZhbHVlLiAKCiMjIyMgMy4gRWFjaCBzdHVkZW50IHNob3VsZCBoYXZlIGdvdHRlbiBhIHNsaWdodGx5IGRpZmZlcmVudCBjb25maWRlbmNlIGludGVydmFsLiBXaGF0IHByb3BvcnRpb24gb2YgdGhvc2UgaW50ZXJ2YWxzIHdvdWxkIHlvdSBleHBlY3QgdG8gY2FwdHVyZSB0aGUgdHJ1ZSBwb3B1bGF0aW9uIG1lYW4/IFdoeT8KCkkgd291bGQgZXhwZWN0IDk1JSBvZiB0aGVzZSBpbnRlcnZhbHMgdG8gY2FwdHVyZSB0aGUgdHJ1ZSBwb3B1bGF0aW9uIHByb3BvcnRpb24gc2luY2UgdGhhdCBpcyB3aGF0IHdlIHdlcmUgYWltaW5nIGZvciBmcm9tIHRoZSBiZWdpbm5pbmcgYW5kIHdhcyBpbnRlZ3JhdGVkIGluIG91ciBjYWxjdWxhdGlvbnMuIAoKIyMjIyBHaXZlbiBhIHNhbXBsZSBzaXplIG9mIDYwLCAxMDAwIGJvb3RzdHJhcCBzYW1wbGVzIGZvciBlYWNoIGludGVydmFsLCBhbmQgNTAgY29uZmlkZW5jZSBpbnRlcnZhbHMgY29uc3RydWN0ZWQgKHRoZSBkZWZhdWx0IHZhbHVlcyBmb3IgdGhlIGFib3ZlIGFwcCksIHdoYXQgcHJvcG9ydGlvbiBvZiB5b3VyIGNvbmZpZGVuY2UgaW50ZXJ2YWxzIGluY2x1ZGUgdGhlIHRydWUgcG9wdWxhdGlvbiBwcm9wb3J0aW9uPyBJcyB0aGlzIHByb3BvcnRpb24gZXhhY3RseSBlcXVhbCB0byB0aGUgY29uZmlkZW5jZSBsZXZlbD8gSWYgbm90LCBleHBsYWluIHdoeS4gTWFrZSBzdXJlIHRvIGluY2x1ZGUgeW91ciBwbG90IGluIHlvdXIgYW5zd2VyLgoKYGBge3IsIGVjaG8gPSBGQUxTRX0Ka25pdHI6OmluY2x1ZGVfZ3JhcGhpY3MoIi9Vc2Vycy9pYnJhaGltcGluem9uL0Rlc2t0b3AvQ0lfTWF0aDIxNy5wbmciKQpgYGAKCkluIHRoaXMgc2ltdWxhdGlvbiwgNDggb3V0IG9mIDUwIG9mIHRoZSBjb25maWRlbmNlIGludGVydmFscyBjb25zdHJ1Y3RlZCBpbmNsdWRlZCB0aGUgdHJ1ZSBwb3B1bGF0aW9uIHByb3BvcnRpb24uIFRoaXMgaXMgY29uc2lzdGVudCB3aXRoIG91ciA5NSUgY29uZmlkZW5jZSBsZXZlbC4gV2hpbGUgbm90IGV4YWN0bHkgdGhlIHNhbWUgdmFsdWUsIHRoaXMgaXMgZXhwZWN0ZWQgZHVlIHRvIHRoZSBuYXR1cmUgb2YgdGhpcyBwcm9jZXNzLiAKCiMjIE1vcmUgUHJhY3RpY2UKCiMjIyMgMS4gSWYgd2UgY2hvc2UgYSBjb25maWRlbmNlIGxldmVsIGxvd2VyIHRoYW4gOTUlLCBpdCB3b3VsZCBuYXJyb3cgdGhlIGludGVydmFsLiBUaGlzIGlzIGJlY2F1c2UgdGhlcmUgaXMgbW9yZSB1bmNlcnRhaW50eSBhcyB3ZSBnbyBkb3duIGluIGNvbmZpZGVuY2UsIGFuZCB0aGUgdHJ1ZSBwcm9wb3J0aW9uIHdpbGwgYmUgY2FwdHVyZWQgYXQgYSBsZXNzZXIgcmF0ZSB0aGFuIDk1JS4gCgojIyMjIDIuIFVzaW5nIGNvZGUgZnJvbSB0aGUgaW5mZXIgcGFja2FnZSBhbmQgZGF0YSBmcm9tIHRoZSBvbmUgc2FtcGxlIHlvdSBoYXZlIChzYW1wKSwgZmluZCBhIGNvbmZpZGVuY2UgaW50ZXJ2YWwgZm9yIHRoZSBwcm9wb3J0aW9uIG9mIFVTIEFkdWx0cyB3aG8gdGhpbmsgY2xpbWF0ZSBjaGFuZ2UgaXMgYWZmZWN0aW5nIHRoZWlyIGxvY2FsIGNvbW11bml0eSB3aXRoIGEgY29uZmlkZW5jZSBsZXZlbCBvZiB5b3VyIGNob29zaW5nIChvdGhlciB0aGFuIDk1JSkgYW5kIGludGVycHJldCBpdC4KCmBgYHtyfQpzYW1wICU+JQogIHNwZWNpZnkocmVzcG9uc2UgPSBjbGltYXRlX2NoYW5nZV9hZmZlY3RzLCBzdWNjZXNzID0gIlllcyIpICU+JSAKICBnZW5lcmF0ZShyZXBzID0gMTAwMCwgdHlwZSA9ICJib290c3RyYXAiKSAlPiUgCiAgY2FsY3VsYXRlKHN0YXQgPSAicHJvcCIpICU+JQogIGdldF9jaShsZXZlbCA9IDAuOTApCmBgYAoKV2UgYXJlIDkwJSBjb25maWRlbnQgdGhhdCB0aGUgdHJ1ZSBwcm9wb3J0aW9uIG9mIFVTIGFkdWx0cyB0aGF0IHRoaW5rIHRoYXQgY2xpbWF0ZSBjaGFuZ2UgaXMgYWZmZWN0aW5nIHRoZWlyIGxvY2FsIGNvbW11bml0aWVzIGlzIGJldHdlZW4gMC40MzMgYW5kIDAuNjUwCgojIyMjIDMuIFVzaW5nIHRoZSBhcHAsIGNhbGN1bGF0ZSA1MCBjb25maWRlbmNlIGludGVydmFscyBhdCB0aGUgY29uZmlkZW5jZSBsZXZlbCB5b3UgY2hvc2UgaW4gdGhlIHByZXZpb3VzIHF1ZXN0aW9uLCBhbmQgcGxvdCBhbGwgaW50ZXJ2YWxzIG9uIG9uZSBwbG90LCBhbmQgY2FsY3VsYXRlIHRoZSBwcm9wb3J0aW9uIG9mIGludGVydmFscyB0aGF0IGluY2x1ZGUgdGhlIHRydWUgcG9wdWxhdGlvbiBwcm9wb3J0aW9uLiBIb3cgZG9lcyB0aGlzIHBlcmNlbnRhZ2UgY29tcGFyZSB0byB0aGUgY29uZmlkZW5jZSBsZXZlbCBzZWxlY3RlZCBmb3IgdGhlIGludGVydmFscz8KCkkgdXRpbGl6ZWQgYSA5MCUgY29uZmlkZW5jZSBsZXZlbC4gVGhlIHByb3BvcnRpb24gb2YgaW50ZXJ2YWxzIHRoYXQgdGhhdCBpbmNsdWRlZCB0aGUgdHJ1ZSBwcm9wb3J0aW9uIHdhcyA0NC81MCB3aGljaCAwLjg4LCBvciA4OCUuIFRoaXMgaXMgdmVyeSBjbG9zZSB0byBvdXIgY29uZmlkZW5jZSBsZXZlbC4gCgojIyMjIDQuIExhc3RseSwgdHJ5IG9uZSBtb3JlIChkaWZmZXJlbnQpIGNvbmZpZGVuY2UgbGV2ZWwuIEZpcnN0LCBzdGF0ZSBob3cgeW91IGV4cGVjdCB0aGUgd2lkdGggb2YgdGhpcyBpbnRlcnZhbCB0byBjb21wYXJlIHRvIHByZXZpb3VzIG9uZXMgeW91IGNhbGN1bGF0ZWQuIFRoZW4sIGNhbGN1bGF0ZSB0aGUgYm91bmRzIG9mIHRoZSBpbnRlcnZhbCB1c2luZyB0aGUgaW5mZXIgcGFja2FnZSBhbmQgZGF0YSBmcm9tIHNhbXAgYW5kIGludGVycHJldCBpdC4gRmluYWxseSwgdXNlIHRoZSBhcHAgdG8gZ2VuZXJhdGUgbWFueSBpbnRlcnZhbHMgYW5kIGNhbGN1bGF0ZSB0aGUgcHJvcG9ydGlvbiBvZiBpbnRlcnZhbHMgdGhhdCBhcmUgY2FwdHVyZSB0aGUgdHJ1ZSBwb3B1bGF0aW9uIHByb3BvcnRpb24uCgpgYGB7cn0Kc2FtcCAlPiUKICBzcGVjaWZ5KHJlc3BvbnNlID0gY2xpbWF0ZV9jaGFuZ2VfYWZmZWN0cywgc3VjY2VzcyA9ICJZZXMiKSAlPiUgCiAgZ2VuZXJhdGUocmVwcyA9IDEwMDAsIHR5cGUgPSAiYm9vdHN0cmFwIikgJT4lIAogIGNhbGN1bGF0ZShzdGF0ID0gInByb3AiKSAlPiUKICBnZXRfY2kobGV2ZWwgPSAwLjgwKQpgYGAKCk91ciBhcHAgaXMgY29uc2lzdGVudCB3aXRoIG91ciBib290c3RyYXBwaW5nIHNpbXVsYXRpb24sIGluIHdoaWNoIDQxIG91dCBvZiA1MCBjb25maWRlbmNlIGludGVydmFscyBjYXB0dXJlZCB0aGUgdHJ1ZSBwb3B1bGF0aW9uIHByb3BvcnRpb24uIAoKIyMjIyA1LiBVc2luZyB0aGUgYXBwLCBleHBlcmltZW50IHdpdGggZGlmZmVyZW50IHNhbXBsZSBzaXplcyBhbmQgY29tbWVudCBvbiBob3cgdGhlIHdpZHRocyBvZiBpbnRlcnZhbHMgY2hhbmdlIGFzIHNhbXBsZSBzaXplIGNoYW5nZXMgKGluY3JlYXNlcyBhbmQgZGVjcmVhc2VzKS4KCldlIG5vdGljZSB0aGF0IGFzIHdlIGluY3JlYXNlIHRoZSBzYW1wbGUgc2l6ZSwgdGhlIHdpZHRoIG9mIHRoZSBpbnRlcnZhbHMgZGVjcmVhc2VzLiBUaGUgY29udHJhcnkgb2NjdXJzIHdoZW4gd2UgZGVjcmVhc2Ugc2FtcGxlIHNpemUuIAoKIyMjIyA2LiBGaW5hbGx5LCBnaXZlbiBhIHNhbXBsZSBzaXplIChzYXksIDYwKSwgaG93IGRvZXMgdGhlIHdpZHRoIG9mIHRoZSBpbnRlcnZhbCBjaGFuZ2UgYXMgeW91IGluY3JlYXNlIHRoZSBudW1iZXIgb2YgYm9vdHN0cmFwIHNhbXBsZXMuCgpXaWR0aHMgZG8gbm90IHNlZW0gdG8gY2hhbmdlIGFzIGFkanVzdCB0aGUgbnVtYmVyIG9mIGJvb3RzdHJhcCBzYW1wbGVzLiA=