knitr::opts_chunk$set(eval = TRUE, message = FALSE, warning = FALSE)
library(tidyverse)
library(openintro)
library(infer)

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.

About 61.7% of the adults in the sample think climate change affects their local community.

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

set.seed(1234)

n <- 60
samp <- us_adults %>%
  sample_n(size = n)
new <- samp |> filter(climate_change_affects == "Yes")
length(new$climate_change_affects) / 60 * 100
## [1] 61.66667

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 would expect another student’s sample proportion to be similar but not identical to mine. They likely chose a different seed, so they would have a different sample and thus different proportion. I would expect it to be similar because the samples were pulled from the same population.

Exercise 3

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

95% confidence means were are 95% confident that the population proportion is within the interval we calculated for the sample.

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?

Yes, the confidence interval (copied below) captures the true population proportion of adults who think climate change affects their local community. This is because the actual proportion is 62%, and that value falls within the range of 49.96% to 75.00%.

If I were to repeat this with different seeds, I assume the intervals would continue to capture this value about 95% of the time.

set.seed(1234)
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.500     0.75

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?

I would expect about 95% of the intervals to capture the true population mean. Since the interval is a 95% confidence interval, the probability that the population mean is within the interval is 95%. This also means that 95% of the time, the true mean will fall within the interval.

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.

When I ran the simulation, 56 out of 60 confidence intervals included the true population proportion. This proportion is 0.93. This is not exactly equal to the confidence level. This could have happened because a 95% confidence interval means that about 95% of the time, the true proportion will be within the interval. It is not always 95% of the time. Sometimes, 94% or 96% of the intervals contain the true mean. It is an average percentage and not exact.

I copy and pasted the plot at this url since I’m not sure how to recreate it in R: https://github.com/juliaDataScience-22/cuny-fall-23/blob/stats-and-probability/image-lab-5b.png

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.

I chose a confidence level of 90%. I would expect this to be narrower than the confidence interval of 95%. It is less likely that the mean will be in the range, so it is probably narrower (it will have fewer values, so the probability of it including the mean will be less).

Exercise 8

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.

This confidence interval is a 90% confidence interval. This means I am 90% confident that the mean of 62%, which is the true population proportion, falls within the range of 0.5167 to 0.7167. The mean falls within this range, which makes sense because it is more likely that the mean falls within the range than not. If I were to create a confidence interval 100 times (without setting the seed), about 90 of them would have a range that included 0.62, and about 10 of them would not include 0.62.

set.seed(1234)
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.517    0.717

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?

I chose a 90% confidence interval. 7 of the intervals did not include the mean, and the other 53 intervals did. 53 / 60 = 0.8833. This means 88.33% of the intervals included the mean. That number is very close to 90 as expected.

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.

I will try a confidence level of 50%. I expect the width of this interval to be much smaller than the previous ones I calculated. The interval is seen below. The true population proportion of 0.62 did fall within the range, which was a bit surprising considering I had a 50-50 chance of it happening. It was very close to the bounds though, so that was expected.

When I used the app, the proportion of intervals that captured the true population proportion was 0.45.

set.seed(1234)
samp |>
     specify(response = climate_change_affects, success = "Yes") |>
     generate(reps = 1000, type = "bootstrap") |>
     calculate(stat = "prop") |>
     get_ci(level = 0.50)
## # A tibble: 1 × 2
##   lower_ci upper_ci
##      <dbl>    <dbl>
## 1    0.579    0.667

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

As the sample size increased, the widths of the intervals decreased. As the sample size decreased, the widths of the intervals increased. These two statements were true when the confidence level remained constant.

It was challenging to tell because the widths of the confidence intervals were different in one graph.

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 bootstrap samples affect the standard error?

The width of the intervals seemed to decrease with more bootstrap samples. Again, it was challenging to know for sure because the widths of the confidence intervals were different across one graph.

LS0tDQp0aXRsZTogIkxhYiA1YjogQ29uZmlkZW5jZSBJbnRlcnZhbHMiDQphdXRob3I6ICJKdWxpYSBGZXJyaXMiDQpkYXRlOiAiYHIgU3lzLkRhdGUoKWAiDQpvdXRwdXQ6IG9wZW5pbnRybzo6bGFiX3JlcG9ydA0KLS0tDQoNCmBgYHtyIGxvYWQtcGFja2FnZXMsIG1lc3NhZ2U9RkFMU0V9DQprbml0cjo6b3B0c19jaHVuayRzZXQoZXZhbCA9IFRSVUUsIG1lc3NhZ2UgPSBGQUxTRSwgd2FybmluZyA9IEZBTFNFKQ0KbGlicmFyeSh0aWR5dmVyc2UpDQpsaWJyYXJ5KG9wZW5pbnRybykNCmxpYnJhcnkoaW5mZXIpDQpgYGANCg0KIyMgRXhlcmNpc2UgMQ0KDQojIyMgV2hhdCBwZXJjZW50IG9mIHRoZSBhZHVsdHMgaW4geW91ciBzYW1wbGUgdGhpbmsgY2xpbWF0ZSBjaGFuZ2UgYWZmZWN0cyB0aGVpciBsb2NhbCBjb21tdW5pdHk/ICoqSGludDoqKiBKdXN0IGxpa2Ugd2UgZGlkIHdpdGggdGhlIHBvcHVsYXRpb24sIHdlIGNhbiBjYWxjdWxhdGUgdGhlIHByb3BvcnRpb24gb2YgdGhvc2UgKippbiB0aGlzIHNhbXBsZSoqIHdobyB0aGluayBjbGltYXRlIGNoYW5nZSBhZmZlY3RzIHRoZWlyIGxvY2FsIGNvbW11bml0eS4NCg0KQWJvdXQgNjEuNyUgb2YgdGhlIGFkdWx0cyBpbiB0aGUgc2FtcGxlIHRoaW5rIGNsaW1hdGUgY2hhbmdlIGFmZmVjdHMgdGhlaXIgbG9jYWwgY29tbXVuaXR5Lg0KDQpgYGB7ciBleGVyY2lzZS0xfQ0KDQp1c19hZHVsdHMgPC0gdGliYmxlKA0KICBjbGltYXRlX2NoYW5nZV9hZmZlY3RzID0gYyhyZXAoIlllcyIsIDYyMDAwKSwgcmVwKCJObyIsIDM4MDAwKSkNCikNCg0Kc2V0LnNlZWQoMTIzNCkNCg0KbiA8LSA2MA0Kc2FtcCA8LSB1c19hZHVsdHMgJT4lDQogIHNhbXBsZV9uKHNpemUgPSBuKQ0KbmV3IDwtIHNhbXAgfD4gZmlsdGVyKGNsaW1hdGVfY2hhbmdlX2FmZmVjdHMgPT0gIlllcyIpDQpsZW5ndGgobmV3JGNsaW1hdGVfY2hhbmdlX2FmZmVjdHMpIC8gNjAgKiAxMDANCmBgYA0KDQoNCiMjIEV4ZXJjaXNlIDINCg0KIyMjIFdvdWxkIHlvdSBleHBlY3QgYW5vdGhlciBzdHVkZW50J3Mgc2FtcGxlIHByb3BvcnRpb24gdG8gYmUgaWRlbnRpY2FsIHRvIHlvdXJzPyBXb3VsZCB5b3UgZXhwZWN0IGl0IHRvIGJlIHNpbWlsYXI/IFdoeSBvciB3aHkgbm90Pw0KDQpJIHdvdWxkIGV4cGVjdCBhbm90aGVyIHN0dWRlbnQncyBzYW1wbGUgcHJvcG9ydGlvbiB0byBiZSBzaW1pbGFyIGJ1dCBub3QgaWRlbnRpY2FsIHRvIG1pbmUuIFRoZXkgbGlrZWx5IGNob3NlIGEgZGlmZmVyZW50IHNlZWQsIHNvIHRoZXkgd291bGQgaGF2ZSBhIGRpZmZlcmVudCBzYW1wbGUgYW5kIHRodXMgZGlmZmVyZW50IHByb3BvcnRpb24uIEkgd291bGQgZXhwZWN0IGl0IHRvIGJlIHNpbWlsYXIgYmVjYXVzZSB0aGUgc2FtcGxlcyB3ZXJlIHB1bGxlZCBmcm9tIHRoZSBzYW1lIHBvcHVsYXRpb24uDQoNCg0KDQojIyBFeGVyY2lzZSAzDQoNCiMjIyBJbiB0aGUgaW50ZXJwcmV0YXRpb24gYWJvdmUsIHdlIHVzZWQgdGhlIHBocmFzZSAiOTUlIGNvbmZpZGVudCIuIFdoYXQgZG9lcyAiOTUlIGNvbmZpZGVuY2UiIG1lYW4/DQoNCjk1JSBjb25maWRlbmNlIG1lYW5zIHdlcmUgYXJlIDk1JSBjb25maWRlbnQgdGhhdCB0aGUgcG9wdWxhdGlvbiBwcm9wb3J0aW9uIGlzIHdpdGhpbiB0aGUgaW50ZXJ2YWwgd2UgY2FsY3VsYXRlZCBmb3IgdGhlIHNhbXBsZS4NCg0KDQojIyBFeGVyY2lzZSA0DQoNCiMjIyBEb2VzIHlvdXIgY29uZmlkZW5jZSBpbnRlcnZhbCBjYXB0dXJlIHRoZSB0cnVlIHBvcHVsYXRpb24gcHJvcG9ydGlvbiBvZiBVUyBhZHVsdHMgd2hvIHRoaW5rIGNsaW1hdGUgY2hhbmdlIGFmZmVjdHMgdGhlaXIgbG9jYWwgY29tbXVuaXR5PyBJZiB5b3UgYXJlIHdvcmtpbmcgb24gdGhpcyBsYWIgaW4gYSBjbGFzc3Jvb20sIGRvZXMgeW91ciBuZWlnaGJvcidzIGludGVydmFsIGNhcHR1cmUgdGhpcyB2YWx1ZT8gDQoNClllcywgdGhlIGNvbmZpZGVuY2UgaW50ZXJ2YWwgKGNvcGllZCBiZWxvdykgY2FwdHVyZXMgdGhlIHRydWUgcG9wdWxhdGlvbiBwcm9wb3J0aW9uIG9mIGFkdWx0cyB3aG8gdGhpbmsgY2xpbWF0ZSBjaGFuZ2UgYWZmZWN0cyB0aGVpciBsb2NhbCBjb21tdW5pdHkuIFRoaXMgaXMgYmVjYXVzZSB0aGUgYWN0dWFsIHByb3BvcnRpb24gaXMgNjIlLCBhbmQgdGhhdCB2YWx1ZSBmYWxscyB3aXRoaW4gdGhlIHJhbmdlIG9mIDQ5Ljk2JSB0byA3NS4wMCUuDQoNCklmIEkgd2VyZSB0byByZXBlYXQgdGhpcyB3aXRoIGRpZmZlcmVudCBzZWVkcywgSSBhc3N1bWUgdGhlIGludGVydmFscyB3b3VsZCBjb250aW51ZSB0byBjYXB0dXJlIHRoaXMgdmFsdWUgYWJvdXQgOTUlIG9mIHRoZSB0aW1lLg0KDQpgYGB7ciBleGVyY2lzZS00fQ0Kc2V0LnNlZWQoMTIzNCkNCnNhbXAgfD4NCiAgICAgc3BlY2lmeShyZXNwb25zZSA9IGNsaW1hdGVfY2hhbmdlX2FmZmVjdHMsIHN1Y2Nlc3MgPSAiWWVzIikgfD4NCiAgICAgZ2VuZXJhdGUocmVwcyA9IDEwMDAsIHR5cGUgPSAiYm9vdHN0cmFwIikgfD4NCiAgICAgY2FsY3VsYXRlKHN0YXQgPSAicHJvcCIpIHw+DQogICAgIGdldF9jaShsZXZlbCA9IDAuOTUpDQpgYGANCg0KDQojIyBFeGVyY2lzZSA1DQoNCiMjIyBFYWNoIHN0dWRlbnQgc2hvdWxkIGhhdmUgZ290dGVuIGEgc2xpZ2h0bHkgZGlmZmVyZW50IGNvbmZpZGVuY2UgaW50ZXJ2YWwuIFdoYXQgcHJvcG9ydGlvbiBvZiB0aG9zZSBpbnRlcnZhbHMgd291bGQgeW91IGV4cGVjdCB0byBjYXB0dXJlIHRoZSB0cnVlIHBvcHVsYXRpb24gbWVhbj8gV2h5Pw0KDQpJIHdvdWxkIGV4cGVjdCBhYm91dCA5NSUgb2YgdGhlIGludGVydmFscyB0byBjYXB0dXJlIHRoZSB0cnVlIHBvcHVsYXRpb24gbWVhbi4gU2luY2UgdGhlIGludGVydmFsIGlzIGEgOTUlIGNvbmZpZGVuY2UgaW50ZXJ2YWwsIHRoZSBwcm9iYWJpbGl0eSB0aGF0IHRoZSBwb3B1bGF0aW9uIG1lYW4gaXMgd2l0aGluIHRoZSBpbnRlcnZhbCBpcyA5NSUuIFRoaXMgYWxzbyBtZWFucyB0aGF0IDk1JSBvZiB0aGUgdGltZSwgdGhlIHRydWUgbWVhbiB3aWxsIGZhbGwgd2l0aGluIHRoZSBpbnRlcnZhbC4NCg0KDQoNCiMjIEV4ZXJjaXNlIDYNCg0KIyMjIEdpdmVuIGEgc2FtcGxlIHNpemUgb2YgNjAsIDEwMDAgYm9vdHN0cmFwIHNhbXBsZXMgZm9yIGVhY2ggaW50ZXJ2YWwsIGFuZCA1MCBjb25maWRlbmNlIGludGVydmFscyBjb25zdHJ1Y3RlZCAodGhlIGRlZmF1bHQgdmFsdWVzIGZvciB0aGUgYWJvdmUgYXBwKSwgd2hhdCBwcm9wb3J0aW9uIG9mIHlvdXIgY29uZmlkZW5jZSBpbnRlcnZhbHMgaW5jbHVkZSB0aGUgdHJ1ZSBwb3B1bGF0aW9uIHByb3BvcnRpb24/IElzIHRoaXMgcHJvcG9ydGlvbiBleGFjdGx5IGVxdWFsIHRvIHRoZSBjb25maWRlbmNlIGxldmVsPyBJZiBub3QsIGV4cGxhaW4gd2h5LiBNYWtlIHN1cmUgdG8gaW5jbHVkZSB5b3VyIHBsb3QgaW4geW91ciBhbnN3ZXIuDQoNCldoZW4gSSByYW4gdGhlIHNpbXVsYXRpb24sIDU2IG91dCBvZiA2MCBjb25maWRlbmNlIGludGVydmFscyBpbmNsdWRlZCB0aGUgdHJ1ZSBwb3B1bGF0aW9uIHByb3BvcnRpb24uIFRoaXMgcHJvcG9ydGlvbiBpcyAwLjkzLiBUaGlzIGlzIG5vdCBleGFjdGx5IGVxdWFsIHRvIHRoZSBjb25maWRlbmNlIGxldmVsLiBUaGlzIGNvdWxkIGhhdmUgaGFwcGVuZWQgYmVjYXVzZSBhIDk1JSBjb25maWRlbmNlIGludGVydmFsIG1lYW5zIHRoYXQgYWJvdXQgOTUlIG9mIHRoZSB0aW1lLCB0aGUgdHJ1ZSBwcm9wb3J0aW9uIHdpbGwgYmUgd2l0aGluIHRoZSBpbnRlcnZhbC4gSXQgaXMgbm90IGFsd2F5cyA5NSUgb2YgdGhlIHRpbWUuIFNvbWV0aW1lcywgOTQlIG9yIDk2JSBvZiB0aGUgaW50ZXJ2YWxzIGNvbnRhaW4gdGhlIHRydWUgbWVhbi4gSXQgaXMgYW4gYXZlcmFnZSBwZXJjZW50YWdlIGFuZCBub3QgZXhhY3QuDQoNCkkgY29weSBhbmQgcGFzdGVkIHRoZSBwbG90IGF0IHRoaXMgdXJsIHNpbmNlIEknbSBub3Qgc3VyZSBob3cgdG8gcmVjcmVhdGUgaXQgaW4gUjogaHR0cHM6Ly9naXRodWIuY29tL2p1bGlhRGF0YVNjaWVuY2UtMjIvY3VueS1mYWxsLTIzL2Jsb2Ivc3RhdHMtYW5kLXByb2JhYmlsaXR5L2ltYWdlLWxhYi01Yi5wbmcNCg0KDQojIyBFeGVyY2lzZSA3DQoNCiMjIyBDaG9vc2UgYSBkaWZmZXJlbnQgY29uZmlkZW5jZSBsZXZlbCB0aGFuIDk1JS4gV291bGQgeW91IGV4cGVjdCBhIGNvbmZpZGVuY2UgaW50ZXJ2YWwgYXQgdGhpcyBsZXZlbCB0byBtZSB3aWRlciBvciBuYXJyb3dlciB0aGFuIHRoZSBjb25maWRlbmNlIGludGVydmFsIHlvdSBjYWxjdWxhdGVkIGF0IHRoZSA5NSUgY29uZmlkZW5jZSBsZXZlbD8gRXhwbGFpbiB5b3VyIHJlYXNvbmluZy4NCg0KSSBjaG9zZSBhIGNvbmZpZGVuY2UgbGV2ZWwgb2YgOTAlLiBJIHdvdWxkIGV4cGVjdCB0aGlzIHRvIGJlIG5hcnJvd2VyIHRoYW4gdGhlIGNvbmZpZGVuY2UgaW50ZXJ2YWwgb2YgOTUlLiBJdCBpcyBsZXNzIGxpa2VseSB0aGF0IHRoZSBtZWFuIHdpbGwgYmUgaW4gdGhlIHJhbmdlLCBzbyBpdCBpcyBwcm9iYWJseSBuYXJyb3dlciAoaXQgd2lsbCBoYXZlIGZld2VyIHZhbHVlcywgc28gdGhlIHByb2JhYmlsaXR5IG9mIGl0IGluY2x1ZGluZyB0aGUgbWVhbiB3aWxsIGJlIGxlc3MpLg0KDQojIyBFeGVyY2lzZSA4DQoNCiMjIyBVc2luZyBjb2RlIGZyb20gdGhlICoqaW5mZXIqKiBwYWNrYWdlIGFuZCBkYXRhIGZyb20gdGhlIG9uZSBzYW1wbGUgeW91IGhhdmUgKHNhbXApLCBmaW5kIGEgY29uZmlkZW5jZSBpbnRlcnZhbCBmb3IgdGhlIHByb3BvcnRpb24gb2YgVVMgQWR1bHRzIHdobyB0aGluayBjbGltYXRlIGNoYW5nZSBpcyBhZmZlY3RpbmcgdGhlaXIgbG9jYWwgY29tbXVuaXR5IHdpdGggYSBjb25maWRlbmNlIGxldmVsIG9mIHlvdXIgY2hvb3NpbmcgKG90aGVyIHRoYW4gOTUlKSBhbmQgaW50ZXJwcmV0IGl0Lg0KDQpUaGlzIGNvbmZpZGVuY2UgaW50ZXJ2YWwgaXMgYSA5MCUgY29uZmlkZW5jZSBpbnRlcnZhbC4gVGhpcyBtZWFucyBJIGFtIDkwJSBjb25maWRlbnQgdGhhdCB0aGUgbWVhbiBvZiA2MiUsIHdoaWNoIGlzIHRoZSB0cnVlIHBvcHVsYXRpb24gcHJvcG9ydGlvbiwgZmFsbHMgd2l0aGluIHRoZSByYW5nZSBvZiAwLjUxNjcgdG8gMC43MTY3LiBUaGUgbWVhbiBmYWxscyB3aXRoaW4gdGhpcyByYW5nZSwgd2hpY2ggbWFrZXMgc2Vuc2UgYmVjYXVzZSBpdCBpcyBtb3JlIGxpa2VseSB0aGF0IHRoZSBtZWFuIGZhbGxzIHdpdGhpbiB0aGUgcmFuZ2UgdGhhbiBub3QuIElmIEkgd2VyZSB0byBjcmVhdGUgYSBjb25maWRlbmNlIGludGVydmFsIDEwMCB0aW1lcyAod2l0aG91dCBzZXR0aW5nIHRoZSBzZWVkKSwgYWJvdXQgOTAgb2YgdGhlbSB3b3VsZCBoYXZlIGEgcmFuZ2UgdGhhdCBpbmNsdWRlZCAwLjYyLCBhbmQgYWJvdXQgMTAgb2YgdGhlbSB3b3VsZCBub3QgaW5jbHVkZSAwLjYyLg0KDQpgYGB7cn0NCnNldC5zZWVkKDEyMzQpDQpzYW1wIHw+DQogICAgIHNwZWNpZnkocmVzcG9uc2UgPSBjbGltYXRlX2NoYW5nZV9hZmZlY3RzLCBzdWNjZXNzID0gIlllcyIpIHw+DQogICAgIGdlbmVyYXRlKHJlcHMgPSAxMDAwLCB0eXBlID0gImJvb3RzdHJhcCIpIHw+DQogICAgIGNhbGN1bGF0ZShzdGF0ID0gInByb3AiKSB8Pg0KICAgICBnZXRfY2kobGV2ZWwgPSAwLjkwKQ0KYGBgDQogICAgDQojIyBFeGVyY2lzZSA5DQoNCiMjIyBVc2luZyB0aGUgYXBwLCBjYWxjdWxhdGUgNTAgY29uZmlkZW5jZSBpbnRlcnZhbHMgYXQgdGhlIGNvbmZpZGVuY2UgbGV2ZWwgeW91IGNob3NlIGluIHRoZSBwcmV2aW91cyBxdWVzdGlvbiwgYW5kIHBsb3QgYWxsIGludGVydmFscyBvbiBvbmUgcGxvdCwgYW5kIGNhbGN1bGF0ZSB0aGUgcHJvcG9ydGlvbiBvZiBpbnRlcnZhbHMgdGhhdCBpbmNsdWRlIHRoZSB0cnVlIHBvcHVsYXRpb24gcHJvcG9ydGlvbi4gSG93IGRvZXMgdGhpcyBwZXJjZW50YWdlIGNvbXBhcmUgdG8gdGhlIGNvbmZpZGVuY2UgbGV2ZWwgc2VsZWN0ZWQgZm9yIHRoZSBpbnRlcnZhbHM/DQoNCkkgY2hvc2UgYSA5MCUgY29uZmlkZW5jZSBpbnRlcnZhbC4gNyBvZiB0aGUgaW50ZXJ2YWxzIGRpZCBub3QgaW5jbHVkZSB0aGUgbWVhbiwgYW5kIHRoZSBvdGhlciA1MyBpbnRlcnZhbHMgZGlkLiA1MyAvIDYwID0gMC44ODMzLiBUaGlzIG1lYW5zIDg4LjMzJSBvZiB0aGUgaW50ZXJ2YWxzIGluY2x1ZGVkIHRoZSBtZWFuLiBUaGF0IG51bWJlciBpcyB2ZXJ5IGNsb3NlIHRvIDkwIGFzIGV4cGVjdGVkLg0KDQojIyBFeGVyY2lzZSAxMA0KDQojIyMgTGFzdGx5LCB0cnkgb25lIG1vcmUgKGRpZmZlcmVudCkgY29uZmlkZW5jZSBsZXZlbC4gRmlyc3QsIHN0YXRlIGhvdyB5b3UgZXhwZWN0IHRoZSB3aWR0aCBvZiB0aGlzIGludGVydmFsIHRvIGNvbXBhcmUgdG8gcHJldmlvdXMgb25lcyB5b3UgY2FsY3VsYXRlZC4gVGhlbiwgY2FsY3VsYXRlIHRoZSBib3VuZHMgb2YgdGhlIGludGVydmFsIHVzaW5nIHRoZSAqKmluZmVyKiogcGFja2FnZSBhbmQgZGF0YSBmcm9tIHNhbXAgYW5kIGludGVycHJldCBpdC4gRmluYWxseSwgdXNlIHRoZSBhcHAgdG8gZ2VuZXJhdGUgbWFueSBpbnRlcnZhbHMgYW5kIGNhbGN1bGF0ZSB0aGUgcHJvcG9ydGlvbiBvZiBpbnRlcnZhbHMgdGhhdCBhcmUgY2FwdHVyZSB0aGUgdHJ1ZSBwb3B1bGF0aW9uIHByb3BvcnRpb24uDQoNCkkgd2lsbCB0cnkgYSBjb25maWRlbmNlIGxldmVsIG9mIDUwJS4gSSBleHBlY3QgdGhlIHdpZHRoIG9mIHRoaXMgaW50ZXJ2YWwgdG8gYmUgbXVjaCBzbWFsbGVyIHRoYW4gdGhlIHByZXZpb3VzIG9uZXMgSSBjYWxjdWxhdGVkLiBUaGUgaW50ZXJ2YWwgaXMgc2VlbiBiZWxvdy4gVGhlIHRydWUgcG9wdWxhdGlvbiBwcm9wb3J0aW9uIG9mIDAuNjIgZGlkIGZhbGwgd2l0aGluIHRoZSByYW5nZSwgd2hpY2ggd2FzIGEgYml0IHN1cnByaXNpbmcgY29uc2lkZXJpbmcgSSBoYWQgYSA1MC01MCBjaGFuY2Ugb2YgaXQgaGFwcGVuaW5nLiBJdCB3YXMgdmVyeSBjbG9zZSB0byB0aGUgYm91bmRzIHRob3VnaCwgc28gdGhhdCB3YXMgZXhwZWN0ZWQuIA0KDQpXaGVuIEkgdXNlZCB0aGUgYXBwLCB0aGUgcHJvcG9ydGlvbiBvZiBpbnRlcnZhbHMgdGhhdCBjYXB0dXJlZCB0aGUgdHJ1ZSBwb3B1bGF0aW9uIHByb3BvcnRpb24gd2FzIDAuNDUuDQoNCmBgYHtyfQ0Kc2V0LnNlZWQoMTIzNCkNCnNhbXAgfD4NCiAgICAgc3BlY2lmeShyZXNwb25zZSA9IGNsaW1hdGVfY2hhbmdlX2FmZmVjdHMsIHN1Y2Nlc3MgPSAiWWVzIikgfD4NCiAgICAgZ2VuZXJhdGUocmVwcyA9IDEwMDAsIHR5cGUgPSAiYm9vdHN0cmFwIikgfD4NCiAgICAgY2FsY3VsYXRlKHN0YXQgPSAicHJvcCIpIHw+DQogICAgIGdldF9jaShsZXZlbCA9IDAuNTApDQpgYGANCiAgICANCiMjIEV4ZXJjaXNlIDExDQoNCiMjIyBVc2luZyB0aGUgYXBwLCBleHBlcmltZW50IHdpdGggZGlmZmVyZW50IHNhbXBsZSBzaXplcyBhbmQgY29tbWVudCBvbiBob3cgdGhlIHdpZHRocyBvZiBpbnRlcnZhbHMgY2hhbmdlIGFzIHNhbXBsZSBzaXplIGNoYW5nZXMgKGluY3JlYXNlcyBhbmQgZGVjcmVhc2VzKS4NCg0KQXMgdGhlIHNhbXBsZSBzaXplIGluY3JlYXNlZCwgdGhlIHdpZHRocyBvZiB0aGUgaW50ZXJ2YWxzIGRlY3JlYXNlZC4gQXMgdGhlIHNhbXBsZSBzaXplIGRlY3JlYXNlZCwgdGhlIHdpZHRocyBvZiB0aGUgaW50ZXJ2YWxzIGluY3JlYXNlZC4gVGhlc2UgdHdvIHN0YXRlbWVudHMgd2VyZSB0cnVlIHdoZW4gdGhlIGNvbmZpZGVuY2UgbGV2ZWwgcmVtYWluZWQgY29uc3RhbnQuDQoNCkl0IHdhcyBjaGFsbGVuZ2luZyB0byB0ZWxsIGJlY2F1c2UgdGhlIHdpZHRocyBvZiB0aGUgY29uZmlkZW5jZSBpbnRlcnZhbHMgd2VyZSBkaWZmZXJlbnQgaW4gb25lIGdyYXBoLg0KDQojIyBFeGVyY2lzZSAxMg0KDQojIyMgRmluYWxseSwgZ2l2ZW4gYSBzYW1wbGUgc2l6ZSAoc2F5LCA2MCksIGhvdyBkb2VzIHRoZSB3aWR0aCBvZiB0aGUgaW50ZXJ2YWwgY2hhbmdlIGFzIHlvdSBpbmNyZWFzZSB0aGUgbnVtYmVyIG9mIGJvb3RzdHJhcCBzYW1wbGVzLiAqKkhpbnQ6KiogRG9lcyBjaGFuZ2luZyB0aGUgbnVtYmVyIG9mIGJvb3RzdHJhcCBzYW1wbGVzIGFmZmVjdCB0aGUgc3RhbmRhcmQgZXJyb3I/DQoNClRoZSB3aWR0aCBvZiB0aGUgaW50ZXJ2YWxzIHNlZW1lZCB0byBkZWNyZWFzZSB3aXRoIG1vcmUgYm9vdHN0cmFwIHNhbXBsZXMuIEFnYWluLCBpdCB3YXMgY2hhbGxlbmdpbmcgdG8ga25vdyBmb3Igc3VyZSBiZWNhdXNlIHRoZSB3aWR0aHMgb2YgdGhlIGNvbmZpZGVuY2UgaW50ZXJ2YWxzIHdlcmUgZGlmZmVyZW50IGFjcm9zcyBvbmUgZ3JhcGguDQoNCg0K