#library(tidyverse)
library(openintro)
library(dplyr)
Sampling from Ames, Iowa If you have access to data on an entire population, say the size of every house in Ames, Iowa, it’s straight forward to answer questions like, “How big is the typical house in Ames?” and “How much variation is there in sizes of houses?”. If you have access to only a sample of the population, as is often the case, the task becomes more complicated. What is your best guess for the typical size if you only know the sizes of several dozen houses? This sort of situation requires that you use your sample to make inference on what your population looks like.
#In the previous lab, ``Sampling Distributions’’, we looked at the population data of houses from Ames, Iowa.
#Start by loading that data set.
download.file("http://www.openintro.org/stat/data/ames.RData", destfile = "ames.RData")
load("ames.RData")
In this lab we’ll start with a simple random sample of size 60 from the population. Specifically, this is a simple random sample of size 60. Note that the data set has information on many housing variables, but for the first portion of the lab we’ll focus on the size of the house, represented by the variable Gr.Liv.Area.
population <- ames$Gr.Liv.Area
samp <- sample(population, 60)
Exercise 1
Describe the distribution of your sample. What would you say is the “typical” size within your sample? Also state precisely what you interpreted “typical” to mean.
Answer In this histogram, the mean is 1474; Distribution is skewed to the right beyond the mean of 1474. I would say 1474 is a typical size within the sample as it is the mean and occurs at a greater frequency than the other sizes in the population.
hist(samp,
main ="Histogram - Size of House in Iowa",
border = "Green",
col = "Orange" ,
breaks = 5)

Exercise 2
Would you expect another student’s distribution to be identical to yours? Would you expect it to be similar? Why or why not?
Answer No, another student’s distribution would not be identical because we are testing different samples within the population. I would, however expect it to be similar. I ran the test again, myself, to demonstrate.
In this sample, the mean is 1528. It’s similar, but not identical.
population <- ames$Gr.Liv.Area
samp <- sample(population, 60)
hist(samp,
main ="Histogram - Size of House in Iowa",
border = "Green",
col = "Orange" ,
breaks = 5)

## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 912 1185 1464 1524 1778 2898
One of the most common ways to describe the typical or central value of a distribution is to use the mean. In this case we can calculate the mean of the sample using,
sample_mean <- mean(samp)
sample_mean
## [1] 1524.183
Return for a moment to the question that first motivated this lab: based on this sample, what can we infer about the population? Based only on this single sample, the best estimate of the average living area of houses sold in Ames would be the sample mean, usually denoted as x¯ (here we’re calling it sample_mean). That serves as a good point estimate but it would be useful to also communicate how uncertain we are of that estimate. This can be captured by using a confidence interval.
We can calculate a 95% confidence interval for a sample mean by adding and subtracting 1.96 standard errors to the point estimate (See Section 4.2.3 if you are unfamiliar with this formula).
se <- sd(samp) / sqrt(60)
lower <- sample_mean - 1.96 * se
upper <- sample_mean + 1.96 * se
c(lower, upper)
## [1] 1413.684 1634.683
## [1] 56.37713
## [1] 1524.183
This is an important inference that we’ve just made: even though we don’t know what the full population looks like, we’re 95% confident that the true average size of houses in Ames lies between the values lower and upper. There are a few conditions that must be met for this interval to be valid.
Exercise 3
For the confidence interval to be valid, the sample mean must be normally distributed and have standard error s/n−−√. What conditions must be met for this to be true?
Answer There are three conditions that need to be satisfied before making a one-sample z-interval to estimate a population proportion: the sample observations are random, normal, and independence conditions for these confidence intervals must be valid. In this case, the upper and lower limits are 1362 and 1693 and the standard error is 84.515. The sample size of 60 (greater than 30) has been met, and the population distribution
The sample observations are random, sample size is greater than 30 and population distribution is not supposed to be greatly skewed to one side or the other.
Exercise 4
What does “95% confidence” mean?
Answer A 95% confidence interval is a range of values that you can be 95% confident contains the true mean of the population. Due to natural sampling variability, the sample mean, center of the Confidence Interval, will vary with different samples. The confidence is in the method, not in a particular Confidence Interval. A confidence interval is the probability that a value will fall between an upper and lower bound of a probability distribution.
In this case we have the luxury of knowing the true population mean since we have data on the entire population. This value can be calculated using the following command:
## [1] 1499.69
Exercise 5
Does your confidence interval capture the true average size of houses in Ames? If you are working on this lab in a classroom, does your neighbor’s interval capture this value?
Answer My sample 95% confidence interval is 1362.117 to 1693.416 with a mean of 1527.767 and standard error of 84.51511. The mean of the population is 1499.69, so my confidence interval does capture the true average size of houses in Ames. While another student’s sample mean, the center of the confidence interval, will vary due to natural sampling variability, the confidence remains in the method. Other students’ intervals will vary with their respective samples, but the true average size will be captured.
Exercise 6
Each student in your class should have gotten a slightly different confidence interval. What proportion of those intervals would you expect to capture the true population mean? Why?
Answer 95% of the confidence intervals should capture the true population mean. Confidence intervals, although they are slightly different per sample, have a 95% confidence level.
#1. Obtain a random sample.
#2. Calculate and store the sample’s mean and standard deviation.
#3. Repeat steps (1) and (2) 50 times.
#4. Use these stored statistics to calculate many confidence intervals.
#First create empty vectors for saving the means and standard deviations that will be calculated from each sample. Sample size as n.
samp_mean <- rep(NA, 50)
samp_sd <- rep(NA, 50)
n <- 60
#Create loop - calculate the means and standard deviations of 50 random samples.
for(i in 1:50){
samp <- sample(population, n) # obtain a sample of size n = 60 from the population
samp_mean[i] <- mean(samp) # save sample mean in ith element of samp_mean
samp_sd[i] <- sd(samp) # save sample sd in ith element of samp_sd
}
#construct confidence intervals
lower_vector <- samp_mean - 1.96 * samp_sd / sqrt(n)
upper_vector <- samp_mean + 1.96 * samp_sd / sqrt(n)
#Lower bounds of these 50 confidence intervals are stored in lower_vector, and the upper bounds are in upper_vector. Let’s view the first interval.
c(lower_vector[1], upper_vector[1])
## [1] 1391.316 1652.117
On Your Own Number 1
Using the following function (which was downloaded with the data set), plot all intervals. What proportion of your confidence intervals include the true population mean? Is this proportion exactly equal to the confidence level? If not, explain why.
Answer
47/50 include the true population mean. This is 94%, not 95%, so this proportion is not exactly equal to the confidence level. The sample size is less than 60.
plot_ci(lower_vector, upper_vector, mean(population))

On Your Own Number 2
Pick a confidence level of your choosing, provided it is not 95%. What is the appropriate critical value?
Answer
97% confidence level critical value for this confidence interval is 2.17
for(i in 1:50){
samp <- sample(population, n) # obtain a sample of size n = 60 from the population
samp_mean[i] <- mean(samp) # save sample mean in ith element of samp_mean
samp_sd[i] <- sd(samp) # save sample sd in ith element of samp_sd
}
lower_vector <- samp_mean - qnorm(.97) * samp_sd / sqrt(n)
upper_vector <- samp_mean + qnorm(.97) * samp_sd / sqrt(n)
sd_vector <- samp_sd
interval <- data.frame(lower_vector,upper_vector,sd_vector)
## [1] -2.17009
On Your Own Number 3
Calculate 50 confidence intervals at the confidence level you chose in the previous question. You do not need to obtain new samples, simply calculate new intervals based on the sample means and standard deviations you have already collected. Using the plot_ci function, plot all intervals and calculate the proportion of intervals that include the true population mean. How does this percentage compare to the confidence level selected for the intervals?
Answer 50 confidence intervals at 97% confidence level Proportion of intervals that include the true population mean = 97%
**Something happened to my plot. I changed the code, and plot appears off…. It had multiple red indicators, now it has a single red line.
#construct confidence intervals
samp_mean <- rep(NA, 50)
samp_sd <- rep(NA, 50)
n <- 60
for(i in 1:50){
samp <- sample(population, n) # obtain a sample of size n = 60 from the population
samp_mean[i] <- mean(samp) # save sample mean in ith element of samp_mean
samp_sd[i] <- sd(samp) # save sample sd in ith element of samp_sd
}
cv <--qnorm(.03/2)
lower_vector <- samp_mean - 2.17 * samp_sd / sqrt(n)
upper_vector <- samp_mean + 2.17 * samp_sd / sqrt(n)
#Lower bounds of these 50 confidence intervals are stored in lower_vector, and the upper bounds are in upper_vector.
c(lower_vector[1], upper_vector[1])
## [1] 1395.293 1665.240
plot_ci(lower_vector, upper_vector, mean(population))

LS0tDQp0aXRsZTogIkNvbmZpZGVuY2UgSW50ZXJ2YWxzIg0KYXV0aG9yOiAiQWFyeW4gWmltbWVybWFuIg0KZGF0ZTogImByIFN5cy5EYXRlKClgIg0Kb3V0cHV0OiBvcGVuaW50cm86OmxhYl9yZXBvcnQNCi0tLQ0KDQpgYGB7ciBsb2FkLXBhY2thZ2VzLCBtZXNzYWdlPUZBTFNFfQ0KI2xpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeShvcGVuaW50cm8pDQpsaWJyYXJ5KGRwbHlyKQ0KYGBgDQoNClNhbXBsaW5nIGZyb20gQW1lcywgSW93YQ0KSWYgeW91IGhhdmUgYWNjZXNzIHRvIGRhdGEgb24gYW4gZW50aXJlIHBvcHVsYXRpb24sIHNheSB0aGUgc2l6ZSBvZiBldmVyeSBob3VzZSBpbiBBbWVzLCBJb3dhLCBpdOKAmXMgc3RyYWlnaHQgZm9yd2FyZCB0byBhbnN3ZXIgcXVlc3Rpb25zIGxpa2UsIOKAnEhvdyBiaWcgaXMgdGhlIHR5cGljYWwgaG91c2UgaW4gQW1lcz/igJ0gYW5kIOKAnEhvdyBtdWNoIHZhcmlhdGlvbiBpcyB0aGVyZSBpbiBzaXplcyBvZiBob3VzZXM/4oCdLiBJZiB5b3UgaGF2ZSBhY2Nlc3MgdG8gb25seSBhIHNhbXBsZSBvZiB0aGUgcG9wdWxhdGlvbiwgYXMgaXMgb2Z0ZW4gdGhlIGNhc2UsIHRoZSB0YXNrIGJlY29tZXMgbW9yZSBjb21wbGljYXRlZC4gV2hhdCBpcyB5b3VyIGJlc3QgZ3Vlc3MgZm9yIHRoZSB0eXBpY2FsIHNpemUgaWYgeW91IG9ubHkga25vdyB0aGUgc2l6ZXMgb2Ygc2V2ZXJhbCBkb3plbiBob3VzZXM/IFRoaXMgc29ydCBvZiBzaXR1YXRpb24gcmVxdWlyZXMgdGhhdCB5b3UgdXNlIHlvdXIgc2FtcGxlIHRvIG1ha2UgaW5mZXJlbmNlIG9uIHdoYXQgeW91ciBwb3B1bGF0aW9uIGxvb2tzIGxpa2UuDQoNCg0KYGBge3J9DQojSW4gdGhlIHByZXZpb3VzIGxhYiwgYGBTYW1wbGluZyBEaXN0cmlidXRpb25z4oCZ4oCZLCB3ZSBsb29rZWQgYXQgdGhlIHBvcHVsYXRpb24gZGF0YSBvZiBob3VzZXMgZnJvbSBBbWVzLCBJb3dhLiANCiNTdGFydCBieSBsb2FkaW5nIHRoYXQgZGF0YSBzZXQuDQpkb3dubG9hZC5maWxlKCJodHRwOi8vd3d3Lm9wZW5pbnRyby5vcmcvc3RhdC9kYXRhL2FtZXMuUkRhdGEiLCBkZXN0ZmlsZSA9ICJhbWVzLlJEYXRhIikNCmxvYWQoImFtZXMuUkRhdGEiKQ0KYGBgDQpJbiB0aGlzIGxhYiB3ZeKAmWxsIHN0YXJ0IHdpdGggYSBzaW1wbGUgcmFuZG9tIHNhbXBsZSBvZiBzaXplIDYwIGZyb20gdGhlIHBvcHVsYXRpb24uIFNwZWNpZmljYWxseSwgdGhpcyBpcyBhIHNpbXBsZSByYW5kb20gc2FtcGxlIG9mIHNpemUgNjAuIE5vdGUgdGhhdCB0aGUgZGF0YSBzZXQgaGFzIGluZm9ybWF0aW9uIG9uIG1hbnkgaG91c2luZyB2YXJpYWJsZXMsIGJ1dCBmb3IgdGhlIGZpcnN0IHBvcnRpb24gb2YgdGhlIGxhYiB3ZeKAmWxsIGZvY3VzIG9uIHRoZSBzaXplIG9mIHRoZSBob3VzZSwgcmVwcmVzZW50ZWQgYnkgdGhlIHZhcmlhYmxlIEdyLkxpdi5BcmVhLg0KDQoNCmBgYHtyfQ0KcG9wdWxhdGlvbiA8LSBhbWVzJEdyLkxpdi5BcmVhDQpzYW1wIDwtIHNhbXBsZShwb3B1bGF0aW9uLCA2MCkNCmBgYA0KDQojIyMgRXhlcmNpc2UgMQ0KRGVzY3JpYmUgdGhlIGRpc3RyaWJ1dGlvbiBvZiB5b3VyIHNhbXBsZS4gV2hhdCB3b3VsZCB5b3Ugc2F5IGlzIHRoZSDigJx0eXBpY2Fs4oCdIHNpemUgd2l0aGluIHlvdXIgc2FtcGxlPyBBbHNvIHN0YXRlIHByZWNpc2VseSB3aGF0IHlvdSBpbnRlcnByZXRlZCDigJx0eXBpY2Fs4oCdIHRvIG1lYW4uDQoNCioqQW5zd2VyKiogDQpJbiB0aGlzIGhpc3RvZ3JhbSwgdGhlIG1lYW4gaXMgMTQ3NDsgRGlzdHJpYnV0aW9uIGlzIHNrZXdlZCB0byB0aGUgcmlnaHQgYmV5b25kIHRoZSBtZWFuIG9mIDE0NzQuICBJIHdvdWxkIHNheSAxNDc0IGlzIGEgdHlwaWNhbCBzaXplIHdpdGhpbiB0aGUgc2FtcGxlIGFzIGl0IGlzIHRoZSBtZWFuIGFuZCBvY2N1cnMgYXQgYSBncmVhdGVyIGZyZXF1ZW5jeSB0aGFuIHRoZSBvdGhlciBzaXplcyBpbiB0aGUgcG9wdWxhdGlvbi4gDQpgYGB7cn0NCmhpc3Qoc2FtcCwNCm1haW4gPSJIaXN0b2dyYW0gLSBTaXplIG9mIEhvdXNlIGluIElvd2EiLA0KYm9yZGVyID0gIkdyZWVuIiwNCmNvbCA9ICJPcmFuZ2UiICwNCmJyZWFrcyA9IDUpDQpgYGANCg0KIyMjIEV4ZXJjaXNlIDINCldvdWxkIHlvdSBleHBlY3QgYW5vdGhlciBzdHVkZW504oCZcyBkaXN0cmlidXRpb24gdG8gYmUgaWRlbnRpY2FsIHRvIHlvdXJzPyBXb3VsZCB5b3UgZXhwZWN0IGl0IHRvIGJlIHNpbWlsYXI/IFdoeSBvciB3aHkgbm90Pw0KDQoqKkFuc3dlcioqDQpObywgYW5vdGhlciBzdHVkZW50J3MgZGlzdHJpYnV0aW9uIHdvdWxkIG5vdCBiZSBpZGVudGljYWwgYmVjYXVzZSB3ZSBhcmUgdGVzdGluZyBkaWZmZXJlbnQgc2FtcGxlcyB3aXRoaW4gdGhlIHBvcHVsYXRpb24uICBJIHdvdWxkLCBob3dldmVyIGV4cGVjdCBpdCB0byBiZSBzaW1pbGFyLiAgSSByYW4gdGhlIHRlc3QgYWdhaW4sIG15c2VsZiwgdG8gZGVtb25zdHJhdGUuDQoNCkluIHRoaXMgc2FtcGxlLCB0aGUgbWVhbiBpcyAxNTI4LiAgSXQncyBzaW1pbGFyLCBidXQgbm90IGlkZW50aWNhbC4NCg0KYGBge3J9DQpwb3B1bGF0aW9uIDwtIGFtZXMkR3IuTGl2LkFyZWENCnNhbXAgPC0gc2FtcGxlKHBvcHVsYXRpb24sIDYwKQ0KaGlzdChzYW1wLA0KbWFpbiA9Ikhpc3RvZ3JhbSAtIFNpemUgb2YgSG91c2UgaW4gSW93YSIsDQpib3JkZXIgPSAiR3JlZW4iLA0KY29sID0gIk9yYW5nZSIgLA0KYnJlYWtzID0gNSkNCnN1bW1hcnkoc2FtcCkNCmBgYA0KDQpPbmUgb2YgdGhlIG1vc3QgY29tbW9uIHdheXMgdG8gZGVzY3JpYmUgdGhlIHR5cGljYWwgb3IgY2VudHJhbCB2YWx1ZSBvZiBhIGRpc3RyaWJ1dGlvbiBpcyB0byB1c2UgdGhlIG1lYW4uIEluIHRoaXMgY2FzZSB3ZSBjYW4gY2FsY3VsYXRlIHRoZSBtZWFuIG9mIHRoZSBzYW1wbGUgdXNpbmcsDQoNCmBgYHtyfQ0Kc2FtcGxlX21lYW4gPC0gbWVhbihzYW1wKQ0Kc2FtcGxlX21lYW4NCg0KYGBgDQpSZXR1cm4gZm9yIGEgbW9tZW50IHRvIHRoZSBxdWVzdGlvbiB0aGF0IGZpcnN0IG1vdGl2YXRlZCB0aGlzIGxhYjogYmFzZWQgb24gdGhpcyBzYW1wbGUsIHdoYXQgY2FuIHdlIGluZmVyIGFib3V0IHRoZSBwb3B1bGF0aW9uPyBCYXNlZCBvbmx5IG9uIHRoaXMgc2luZ2xlIHNhbXBsZSwgdGhlIGJlc3QgZXN0aW1hdGUgb2YgdGhlIGF2ZXJhZ2UgbGl2aW5nIGFyZWEgb2YgaG91c2VzIHNvbGQgaW4gQW1lcyB3b3VsZCBiZSB0aGUgc2FtcGxlIG1lYW4sIHVzdWFsbHkgZGVub3RlZCBhcyB4wq8gKGhlcmUgd2XigJlyZSBjYWxsaW5nIGl0IHNhbXBsZV9tZWFuKS4gVGhhdCBzZXJ2ZXMgYXMgYSBnb29kIHBvaW50IGVzdGltYXRlIGJ1dCBpdCB3b3VsZCBiZSB1c2VmdWwgdG8gYWxzbyBjb21tdW5pY2F0ZSBob3cgdW5jZXJ0YWluIHdlIGFyZSBvZiB0aGF0IGVzdGltYXRlLiBUaGlzIGNhbiBiZSBjYXB0dXJlZCBieSB1c2luZyBhIGNvbmZpZGVuY2UgaW50ZXJ2YWwuDQoNCldlIGNhbiBjYWxjdWxhdGUgYSA5NSUgY29uZmlkZW5jZSBpbnRlcnZhbCBmb3IgYSBzYW1wbGUgbWVhbiBieSBhZGRpbmcgYW5kIHN1YnRyYWN0aW5nIDEuOTYgc3RhbmRhcmQgZXJyb3JzIHRvIHRoZSBwb2ludCBlc3RpbWF0ZSAoU2VlIFNlY3Rpb24gNC4yLjMgaWYgeW91IGFyZSB1bmZhbWlsaWFyIHdpdGggdGhpcyBmb3JtdWxhKS4NCg0KYGBge3J9DQpzZSA8LSBzZChzYW1wKSAvIHNxcnQoNjApDQpsb3dlciA8LSBzYW1wbGVfbWVhbiAtIDEuOTYgKiBzZQ0KdXBwZXIgPC0gc2FtcGxlX21lYW4gKyAxLjk2ICogc2UNCmMobG93ZXIsIHVwcGVyKQ0Kc2UNCnNhbXBsZV9tZWFuDQoNCg0KYGBgDQpUaGlzIGlzIGFuIGltcG9ydGFudCBpbmZlcmVuY2UgdGhhdCB3ZeKAmXZlIGp1c3QgbWFkZTogZXZlbiB0aG91Z2ggd2UgZG9u4oCZdCBrbm93IHdoYXQgdGhlIGZ1bGwgcG9wdWxhdGlvbiBsb29rcyBsaWtlLCB3ZeKAmXJlIDk1JSBjb25maWRlbnQgdGhhdCB0aGUgdHJ1ZSBhdmVyYWdlIHNpemUgb2YgaG91c2VzIGluIEFtZXMgbGllcyBiZXR3ZWVuIHRoZSB2YWx1ZXMgbG93ZXIgYW5kIHVwcGVyLiBUaGVyZSBhcmUgYSBmZXcgY29uZGl0aW9ucyB0aGF0IG11c3QgYmUgbWV0IGZvciB0aGlzIGludGVydmFsIHRvIGJlIHZhbGlkLg0KDQoNCiMjIyBFeGVyY2lzZSAzDQoNCkZvciB0aGUgY29uZmlkZW5jZSBpbnRlcnZhbCB0byBiZSB2YWxpZCwgdGhlIHNhbXBsZSBtZWFuIG11c3QgYmUgbm9ybWFsbHkgZGlzdHJpYnV0ZWQgYW5kIGhhdmUgc3RhbmRhcmQgZXJyb3Igcy9u4oiS4oiS4oiaLiBXaGF0IGNvbmRpdGlvbnMgbXVzdCBiZSBtZXQgZm9yIHRoaXMgdG8gYmUgdHJ1ZT8NCg0KKipBbnN3ZXIqKg0KVGhlcmUgYXJlIHRocmVlIGNvbmRpdGlvbnMgdGhhdCBuZWVkIHRvIGJlIHNhdGlzZmllZCBiZWZvcmUgbWFraW5nIGEgb25lLXNhbXBsZSB6LWludGVydmFsIHRvIGVzdGltYXRlIGEgcG9wdWxhdGlvbiBwcm9wb3J0aW9uOiAgdGhlIHNhbXBsZSBvYnNlcnZhdGlvbnMgYXJlIHJhbmRvbSwgbm9ybWFsLCBhbmQgaW5kZXBlbmRlbmNlIGNvbmRpdGlvbnMgZm9yIHRoZXNlIGNvbmZpZGVuY2UgaW50ZXJ2YWxzIG11c3QgYmUgdmFsaWQuICBJbiB0aGlzIGNhc2UsIHRoZSB1cHBlciBhbmQgbG93ZXIgbGltaXRzIGFyZSAxMzYyIGFuZCAxNjkzIGFuZCB0aGUgc3RhbmRhcmQgZXJyb3IgaXMgODQuNTE1LiAgVGhlIHNhbXBsZSBzaXplIG9mIDYwIChncmVhdGVyIHRoYW4gMzApIGhhcyBiZWVuIG1ldCwgYW5kIHRoZSBwb3B1bGF0aW9uIGRpc3RyaWJ1dGlvbiANCg0KDQoNClRoZSBzYW1wbGUgb2JzZXJ2YXRpb25zIGFyZSByYW5kb20sIHNhbXBsZSBzaXplIGlzIGdyZWF0ZXIgdGhhbiAzMCBhbmQgcG9wdWxhdGlvbiBkaXN0cmlidXRpb24gaXMgbm90IHN1cHBvc2VkIHRvIGJlIGdyZWF0bHkgc2tld2VkIHRvIG9uZSBzaWRlIG9yIHRoZSBvdGhlci4gIA0KDQpgYGB7cn0NCg0KYGBgDQoNCiMjIyBFeGVyY2lzZSA0DQpXaGF0IGRvZXMg4oCcOTUlIGNvbmZpZGVuY2XigJ0gbWVhbj8NCg0KKipBbnN3ZXIqKg0KQSA5NSUgY29uZmlkZW5jZSBpbnRlcnZhbCBpcyBhIHJhbmdlIG9mIHZhbHVlcyB0aGF0IHlvdSBjYW4gYmUgOTUlIGNvbmZpZGVudCBjb250YWlucyB0aGUgdHJ1ZSBtZWFuIG9mIHRoZSBwb3B1bGF0aW9uLiBEdWUgdG8gbmF0dXJhbCBzYW1wbGluZyB2YXJpYWJpbGl0eSwgdGhlIHNhbXBsZSBtZWFuLCBjZW50ZXIgb2YgdGhlIENvbmZpZGVuY2UgSW50ZXJ2YWwsIHdpbGwgdmFyeSB3aXRoIGRpZmZlcmVudCBzYW1wbGVzLiBUaGUgY29uZmlkZW5jZSBpcyBpbiB0aGUgbWV0aG9kLCBub3QgaW4gYSBwYXJ0aWN1bGFyIENvbmZpZGVuY2UgSW50ZXJ2YWwuICAgQSBjb25maWRlbmNlIGludGVydmFsIGlzIHRoZSBwcm9iYWJpbGl0eSB0aGF0IGEgdmFsdWUgd2lsbCBmYWxsIGJldHdlZW4gYW4gdXBwZXIgYW5kIGxvd2VyIGJvdW5kIG9mIGEgcHJvYmFiaWxpdHkgZGlzdHJpYnV0aW9uLg0KDQoNCkluIHRoaXMgY2FzZSB3ZSBoYXZlIHRoZSBsdXh1cnkgb2Yga25vd2luZyB0aGUgdHJ1ZSBwb3B1bGF0aW9uIG1lYW4gc2luY2Ugd2UgaGF2ZSBkYXRhIG9uIHRoZSBlbnRpcmUgcG9wdWxhdGlvbi4gVGhpcyB2YWx1ZSBjYW4gYmUgY2FsY3VsYXRlZCB1c2luZyB0aGUgZm9sbG93aW5nIGNvbW1hbmQ6DQpgYGB7cn0NCm1lYW4ocG9wdWxhdGlvbikNCg0KYGBgDQojIyMgRXhlcmNpc2UgNQ0KRG9lcyB5b3VyIGNvbmZpZGVuY2UgaW50ZXJ2YWwgY2FwdHVyZSB0aGUgdHJ1ZSBhdmVyYWdlIHNpemUgb2YgaG91c2VzIGluIEFtZXM/IElmIHlvdSBhcmUgd29ya2luZyBvbiB0aGlzIGxhYiBpbiBhIGNsYXNzcm9vbSwgZG9lcyB5b3VyIG5laWdoYm9y4oCZcyBpbnRlcnZhbCBjYXB0dXJlIHRoaXMgdmFsdWU/DQoNCioqQW5zd2VyKioNCk15IHNhbXBsZSA5NSUgY29uZmlkZW5jZSBpbnRlcnZhbCBpcyAxMzYyLjExNyB0byAxNjkzLjQxNiB3aXRoIGEgbWVhbiBvZiAxNTI3Ljc2NyBhbmQgc3RhbmRhcmQgZXJyb3Igb2YgODQuNTE1MTEuICBUaGUgbWVhbiBvZiB0aGUgcG9wdWxhdGlvbiBpcyAxNDk5LjY5LCBzbyBteSBjb25maWRlbmNlIGludGVydmFsIGRvZXMgY2FwdHVyZSB0aGUgdHJ1ZSBhdmVyYWdlIHNpemUgb2YgaG91c2VzIGluIEFtZXMuICBXaGlsZSBhbm90aGVyIHN0dWRlbnQncyBzYW1wbGUgbWVhbiwgdGhlIGNlbnRlciBvZiB0aGUgY29uZmlkZW5jZSBpbnRlcnZhbCwgd2lsbCB2YXJ5IGR1ZSB0byBuYXR1cmFsIHNhbXBsaW5nIHZhcmlhYmlsaXR5LCB0aGUgY29uZmlkZW5jZSByZW1haW5zIGluIHRoZSBtZXRob2QuICBPdGhlciBzdHVkZW50cycgaW50ZXJ2YWxzIHdpbGwgdmFyeSB3aXRoIHRoZWlyIHJlc3BlY3RpdmUgc2FtcGxlcywgYnV0IHRoZSB0cnVlIGF2ZXJhZ2Ugc2l6ZSB3aWxsIGJlIGNhcHR1cmVkLg0KYGBge3J9DQoNCmBgYA0KDQojIyMgRXhlcmNpc2UgNg0KDQpFYWNoIHN0dWRlbnQgaW4geW91ciBjbGFzcyBzaG91bGQgaGF2ZSBnb3R0ZW4gYSBzbGlnaHRseSBkaWZmZXJlbnQgY29uZmlkZW5jZSBpbnRlcnZhbC4gV2hhdCBwcm9wb3J0aW9uIG9mIHRob3NlIGludGVydmFscyB3b3VsZCB5b3UgZXhwZWN0IHRvIGNhcHR1cmUgdGhlIHRydWUgcG9wdWxhdGlvbiBtZWFuPyBXaHk/IA0KDQoqKkFuc3dlcioqDQo5NSUgb2YgdGhlIGNvbmZpZGVuY2UgaW50ZXJ2YWxzIHNob3VsZCBjYXB0dXJlIHRoZSB0cnVlIHBvcHVsYXRpb24gbWVhbi4gQ29uZmlkZW5jZSBpbnRlcnZhbHMsIGFsdGhvdWdoIHRoZXkgYXJlIHNsaWdodGx5IGRpZmZlcmVudCBwZXIgc2FtcGxlLCBoYXZlIGEgOTUlIGNvbmZpZGVuY2UgbGV2ZWwuICANCg0KDQpgYGB7cn0NCiMxLiAgT2J0YWluIGEgcmFuZG9tIHNhbXBsZS4NCiMyLiAgQ2FsY3VsYXRlIGFuZCBzdG9yZSB0aGUgc2FtcGxl4oCZcyBtZWFuIGFuZCBzdGFuZGFyZCBkZXZpYXRpb24uDQojMy4gIFJlcGVhdCBzdGVwcyAoMSkgYW5kICgyKSA1MCB0aW1lcy4NCiM0LiAgVXNlIHRoZXNlIHN0b3JlZCBzdGF0aXN0aWNzIHRvIGNhbGN1bGF0ZSBtYW55IGNvbmZpZGVuY2UgaW50ZXJ2YWxzLg0KDQojRmlyc3QgY3JlYXRlIGVtcHR5IHZlY3RvcnMgZm9yIHNhdmluZyB0aGUgbWVhbnMgYW5kIHN0YW5kYXJkIGRldmlhdGlvbnMgdGhhdCB3aWxsIGJlIGNhbGN1bGF0ZWQgZnJvbSBlYWNoIHNhbXBsZS4gU2FtcGxlIHNpemUgYXMgbi4NCnNhbXBfbWVhbiA8LSByZXAoTkEsIDUwKQ0Kc2FtcF9zZCA8LSByZXAoTkEsIDUwKQ0KbiA8LSA2MA0KYGBgDQoNCg0KYGBge3J9DQojQ3JlYXRlIGxvb3AgIC0gY2FsY3VsYXRlIHRoZSBtZWFucyBhbmQgc3RhbmRhcmQgZGV2aWF0aW9ucyBvZiA1MCByYW5kb20gc2FtcGxlcy4NCmZvcihpIGluIDE6NTApew0KICBzYW1wIDwtIHNhbXBsZShwb3B1bGF0aW9uLCBuKSAjIG9idGFpbiBhIHNhbXBsZSBvZiBzaXplIG4gPSA2MCBmcm9tIHRoZSBwb3B1bGF0aW9uDQogIHNhbXBfbWVhbltpXSA8LSBtZWFuKHNhbXApICAgICMgc2F2ZSBzYW1wbGUgbWVhbiBpbiBpdGggZWxlbWVudCBvZiBzYW1wX21lYW4NCiAgc2FtcF9zZFtpXSA8LSBzZChzYW1wKSAgICAgICAgIyBzYXZlIHNhbXBsZSBzZCBpbiBpdGggZWxlbWVudCBvZiBzYW1wX3NkDQp9DQoNCmBgYA0KDQoNCg0KYGBge3J9DQojY29uc3RydWN0IGNvbmZpZGVuY2UgaW50ZXJ2YWxzDQoNCmxvd2VyX3ZlY3RvciA8LSBzYW1wX21lYW4gLSAxLjk2ICogc2FtcF9zZCAvIHNxcnQobikgDQp1cHBlcl92ZWN0b3IgPC0gc2FtcF9tZWFuICsgMS45NiAqIHNhbXBfc2QgLyBzcXJ0KG4pDQoNCg0KYGBgDQoNCg0KYGBge3J9DQoNCiNMb3dlciBib3VuZHMgb2YgdGhlc2UgNTAgY29uZmlkZW5jZSBpbnRlcnZhbHMgYXJlIHN0b3JlZCBpbiBsb3dlcl92ZWN0b3IsIGFuZCB0aGUgdXBwZXIgYm91bmRzIGFyZSBpbiB1cHBlcl92ZWN0b3IuIExldOKAmXMgdmlldyB0aGUgZmlyc3QgaW50ZXJ2YWwuDQoNCmMobG93ZXJfdmVjdG9yWzFdLCB1cHBlcl92ZWN0b3JbMV0pDQpgYGANCiMjIyBPbiBZb3VyIE93biBOdW1iZXIgMQ0KDQpVc2luZyB0aGUgZm9sbG93aW5nIGZ1bmN0aW9uICh3aGljaCB3YXMgZG93bmxvYWRlZCB3aXRoIHRoZSBkYXRhIHNldCksIHBsb3QgYWxsIGludGVydmFscy4gV2hhdCBwcm9wb3J0aW9uIG9mIHlvdXIgY29uZmlkZW5jZSBpbnRlcnZhbHMgaW5jbHVkZSB0aGUgdHJ1ZSBwb3B1bGF0aW9uIG1lYW4/IElzIHRoaXMgcHJvcG9ydGlvbiBleGFjdGx5IGVxdWFsIHRvIHRoZSBjb25maWRlbmNlIGxldmVsPyBJZiBub3QsIGV4cGxhaW4gd2h5Lg0KDQoqKkFuc3dlcioqDQoNCjQ3LzUwIGluY2x1ZGUgdGhlIHRydWUgcG9wdWxhdGlvbiBtZWFuLiAgVGhpcyBpcyA5NCUsIG5vdCA5NSUsIHNvIHRoaXMgcHJvcG9ydGlvbiBpcyBub3QgZXhhY3RseSBlcXVhbCB0byB0aGUgY29uZmlkZW5jZSBsZXZlbC4gIFRoZSBzYW1wbGUgc2l6ZSBpcyBsZXNzIHRoYW4gNjAuICANCmBgYHtyfQ0KcGxvdF9jaShsb3dlcl92ZWN0b3IsIHVwcGVyX3ZlY3RvciwgbWVhbihwb3B1bGF0aW9uKSkNCg0KYGBgDQoNCiMjIyBPbiBZb3VyIE93biBOdW1iZXIgMg0KUGljayBhIGNvbmZpZGVuY2UgbGV2ZWwgb2YgeW91ciBjaG9vc2luZywgcHJvdmlkZWQgaXQgaXMgbm90IDk1JS4gV2hhdCBpcyB0aGUgYXBwcm9wcmlhdGUgY3JpdGljYWwgdmFsdWU/DQoNCioqQW5zd2VyKioNCg0KOTclIGNvbmZpZGVuY2UgbGV2ZWwgDQpjcml0aWNhbCB2YWx1ZSBmb3IgdGhpcyBjb25maWRlbmNlIGludGVydmFsIGlzIDIuMTcNCg0KDQpgYGB7cn0NCmZvcihpIGluIDE6NTApew0KICBzYW1wIDwtIHNhbXBsZShwb3B1bGF0aW9uLCBuKSAjIG9idGFpbiBhIHNhbXBsZSBvZiBzaXplIG4gPSA2MCBmcm9tIHRoZSBwb3B1bGF0aW9uDQogIHNhbXBfbWVhbltpXSA8LSBtZWFuKHNhbXApICAgICMgc2F2ZSBzYW1wbGUgbWVhbiBpbiBpdGggZWxlbWVudCBvZiBzYW1wX21lYW4NCiAgc2FtcF9zZFtpXSA8LSBzZChzYW1wKSAgICAgICAgIyBzYXZlIHNhbXBsZSBzZCBpbiBpdGggZWxlbWVudCBvZiBzYW1wX3NkDQp9DQoNCg0KbG93ZXJfdmVjdG9yIDwtIHNhbXBfbWVhbiAtIHFub3JtKC45NykgKiBzYW1wX3NkIC8gc3FydChuKSANCnVwcGVyX3ZlY3RvciA8LSBzYW1wX21lYW4gKyBxbm9ybSguOTcpICogc2FtcF9zZCAvIHNxcnQobikNCnNkX3ZlY3RvciA8LSBzYW1wX3NkDQppbnRlcnZhbCA8LSBkYXRhLmZyYW1lKGxvd2VyX3ZlY3Rvcix1cHBlcl92ZWN0b3Isc2RfdmVjdG9yKQ0KDQoNCmBgYA0KDQoNCg0KDQpgYGB7cn0NCnFub3JtKDAuMDMvMikNCmBgYA0KIyMjIE9uIFlvdXIgT3duIE51bWJlciAzDQpDYWxjdWxhdGUgNTAgY29uZmlkZW5jZSBpbnRlcnZhbHMgYXQgdGhlIGNvbmZpZGVuY2UgbGV2ZWwgeW91IGNob3NlIGluIHRoZSBwcmV2aW91cyBxdWVzdGlvbi4gWW91IGRvIG5vdCBuZWVkIHRvIG9idGFpbiBuZXcgc2FtcGxlcywgc2ltcGx5IGNhbGN1bGF0ZSBuZXcgaW50ZXJ2YWxzIGJhc2VkIG9uIHRoZSBzYW1wbGUgbWVhbnMgYW5kIHN0YW5kYXJkIGRldmlhdGlvbnMgeW91IGhhdmUgYWxyZWFkeSBjb2xsZWN0ZWQuIFVzaW5nIHRoZSBwbG90X2NpIGZ1bmN0aW9uLCBwbG90IGFsbCBpbnRlcnZhbHMgYW5kIGNhbGN1bGF0ZSB0aGUgcHJvcG9ydGlvbiBvZiBpbnRlcnZhbHMgdGhhdCBpbmNsdWRlIHRoZSB0cnVlIHBvcHVsYXRpb24gbWVhbi4gSG93IGRvZXMgdGhpcyBwZXJjZW50YWdlIGNvbXBhcmUgdG8gdGhlIGNvbmZpZGVuY2UgbGV2ZWwgc2VsZWN0ZWQgZm9yIHRoZSBpbnRlcnZhbHM/DQoNCioqQW5zd2VyKioNCjUwIGNvbmZpZGVuY2UgaW50ZXJ2YWxzIGF0IDk3JSBjb25maWRlbmNlIGxldmVsDQpQcm9wb3J0aW9uIG9mIGludGVydmFscyB0aGF0IGluY2x1ZGUgdGhlIHRydWUgcG9wdWxhdGlvbiBtZWFuID0gOTclDQoNCioqU29tZXRoaW5nIGhhcHBlbmVkIHRvIG15IHBsb3QuICBJIGNoYW5nZWQgdGhlIGNvZGUsIGFuZCBwbG90IGFwcGVhcnMgb2ZmLi4uLiBJdCBoYWQgbXVsdGlwbGUgcmVkIGluZGljYXRvcnMsIG5vdyBpdCBoYXMgYSBzaW5nbGUgcmVkIGxpbmUuDQoNCmBgYHtyfQ0KI2NvbnN0cnVjdCBjb25maWRlbmNlIGludGVydmFscw0KDQpzYW1wX21lYW4gPC0gcmVwKE5BLCA1MCkNCnNhbXBfc2QgPC0gcmVwKE5BLCA1MCkNCm4gPC0gNjANCg0KZm9yKGkgaW4gMTo1MCl7DQogIHNhbXAgPC0gc2FtcGxlKHBvcHVsYXRpb24sIG4pICMgb2J0YWluIGEgc2FtcGxlIG9mIHNpemUgbiA9IDYwIGZyb20gdGhlIHBvcHVsYXRpb24NCiAgc2FtcF9tZWFuW2ldIDwtIG1lYW4oc2FtcCkgICAgIyBzYXZlIHNhbXBsZSBtZWFuIGluIGl0aCBlbGVtZW50IG9mIHNhbXBfbWVhbg0KICBzYW1wX3NkW2ldIDwtIHNkKHNhbXApICAgICAgICAjIHNhdmUgc2FtcGxlIHNkIGluIGl0aCBlbGVtZW50IG9mIHNhbXBfc2QNCn0NCmN2IDwtLXFub3JtKC4wMy8yKQ0KbG93ZXJfdmVjdG9yIDwtIHNhbXBfbWVhbiAtIDIuMTcgKiBzYW1wX3NkIC8gc3FydChuKSANCnVwcGVyX3ZlY3RvciA8LSBzYW1wX21lYW4gKyAyLjE3ICogc2FtcF9zZCAvIHNxcnQobikNCg0KI0xvd2VyIGJvdW5kcyBvZiB0aGVzZSA1MCBjb25maWRlbmNlIGludGVydmFscyBhcmUgc3RvcmVkIGluIGxvd2VyX3ZlY3RvciwgYW5kIHRoZSB1cHBlciBib3VuZHMgYXJlIGluIHVwcGVyX3ZlY3Rvci4NCg0KYyhsb3dlcl92ZWN0b3JbMV0sIHVwcGVyX3ZlY3RvclsxXSkNCg0KcGxvdF9jaShsb3dlcl92ZWN0b3IsIHVwcGVyX3ZlY3RvciwgbWVhbihwb3B1bGF0aW9uKSkNCg0KYGBgDQoNCg==