Objectives:

For this lab you should…

Part 1: Samples from a population

For this part of the lab you must work in a small group. There are several bins of beads in the classroom. Right now, join a group around one of the beads (aim for the same amount of students in each group), and introduce yourself. You will be working together for part 1.

Premise

The bin of beads represents a small town, with each bead representing a person in town with a specific opinion. The green beads support a ballot initiative to increase sales tax to fund bicycle trails, and the white beads oppose the initiative. Your group of students are pollsters - you want to determine how much support the initiative has in your town.

The sampling paddle is your tool to take simple random samples from the town’s population.

TASK 1.1 What is the population parameter you are interested in learning about? Use correct notation.

**Response** The proportion of citizens in the town that support the bill.

TASK 1.2 Using the sampling paddle, take a sample of the population and answer the below questions. Each person in the group must take their own sample.

**Response**
- What is n, the sample size? 40
- What is your sample statistic, both notation and value? 17/40=.425 (p^).

TASK 1.3 With your group, discuss the differences between your individual sample estimates. Summarize your conversation in a sentence or two here.

**Response** Half of our group had a sample statistic that was greater than .5 within .03 (.5-.53), and the other half had a sample statistic that was less than .5 within .125 (.375-.5).

TASK 1.4 Working together, take at least 30 samples (more if you’d like!) and make a vector of the sample statistics in R. Make a dotplot of your sample statistics and discuss the center and spread of the dotplot.

**Response** The range of the dotplot goes from 3.25-.575 and the center is around .5.
SampleStatistics <- c(.375, .425, .51, .53, .45, .5, .475, .45, .55, .575, .475, .475, .5, .525, 22/40, 19/40, 21/40, 23/40, 20/40, 22/40, 18/40, 21/40, 20/40, 20/40, 13/40, 17/40, 22/40, 20/40, 17/40, 23/40)

gf_dotplot( ~ SampleStatistics)

TASK 1.5 Based on everything you’ve done so far, what do you think is the best guess for the population parameter in your town? Write a sentence justifying your answer.

**Response** Based on our sample statistics, our best guess is that the population parameter is .5 because our sample distribution is a normal curve centered about .5.

TASK 1.6 Calculate the standard deviation of your sample statistics. The specific name for this value is the standard error. Whenever we discuss the standard error of a statistic, it describes the how variable statistics are when they are calculated from different samples drawn from the same population.

**Response** SE = .05902488
sd(~SampleStatistics)

Part 2: Baseball Player Salaries

We can also create sampling distributions for the rest of the ‘big 5’ parameters. In this section, you will create several sampling distributions for means of different populations and of different sizes.

Sampling Distribution

To create a sampling distribution from simple random samples, we must have access to the entire population. For this section we have access to all opening day salaries for major league baseball players in 2019 (in millions of dollar). We can load the dataset, called BaseballSalaries2019, from our textbook using the code below:

data("BaseballSalaries2019")

head(BaseballSalaries2019)

TASK 2.1 Find the mean and standard deviation of salary in the population. Recall that the commands mean(~Y, data = DataSetName) and sd(~Y, data = DataSetName) can help you accomplish this task. include proper notation for each quantity

**Response** Mu = 4.509924 and Sigma = 6.334217
mean(~Salary, data = BaseballSalaries2019)
sd(~Salary, data = BaseballSalaries2019)

TASK 2.2 Create a histogram of the salaries and describe the shape of the distribution. Hint: remember gf_histogram()

**Response** The histogram is asymmetric and skewed right.
gf_histogram(~Salary, data = BaseballSalaries2019)

TASK 2.3 Use the code below to generate 2000 samples of size 100, saving the sample mean salary for each sample, and creating a histogram. What does an observation plotted in the histogram represent?

**Response** The mean salary (x bar) of a random sample of 100 players.
# save space for the means
SalaryMeans <- rep(NA, 2000)

# generate 200 samples, saving the mean of each one
for(i in 1:2000){
  # take a sample
  TemporarySample <- sample_n(BaseballSalaries2019, 100)
  # save the mean
  SalaryMeans[i] <- mean(~Salary, data = TemporarySample)
}

gf_histogram(~SalaryMeans)

TASK 2.4 Describe the shape of your sampling distribution, and compare it to the shape of the population.

**Response** The sampling distribution is symmetric and centered around 4.5, and the sampling distribution is a normal curve while the population was completely skewed right.

TASK 2.5 Calculate the center of your sampling distribution, as measured by the mean of the vector of sample means. How does this value compare to the population mean?

**Response** x bar = 4.503148 is within less than 7 one thousandths of mu.
mean(SalaryMeans)

TASK 2.6 Calculate the standard error of the sample mean using your vector of sample means. Recall that the standard error of a statistic is the standard deviation of the sampling distribution.

**Response** s = 0.6054506
sd(SalaryMeans)

TASK 2.7 Hopefully the standard error you calculated in 2.6 roughly matches the standard error you could estimate from the histogram in 2.3. Explain how you could estimate the SE from the histogram, and show how it is roughly the same.

**Response** You can estimate the SE from the histogram by eyeballing the range in which 95% of the samples fall and dividing that range by 4. For instance, if I take 5.75(approximate upper bound for the 95th percentile) and subtract 3.25 (approximate 5th percentile) then divide the difference by 4, I get .625. This value is quite close to the true standard deviation of the population which is 6.334217.

Confidence intervals

TASK 2.8 Directions For each of the sample means below (assumed to be means for samples of baseball player salaries) calculate the corresponding 95% confidence interval. You will need to use the standard error you calculated from 2.6. Indicate whether the confidence interval successfully captures the true population mean salary.

TASK 2.8.1 \(\bar{X}\)= 4

  • Confidence Interval [2.7891, 5.2109]

  • Captured mu? Yes

TASK 2.8.2 \(\bar{X}\)= 3.1

  • Confidence Interval [1.8891, 4.3109]

  • Captured mu? No

TASK 2.8.3 \(\bar{X}\)= 5.2

  • Confidence Interval [3.9891, 6.4109]

  • Captured mu? Yes

Part 3: Sample size and confidence intervals

For this activity we will use the dataset ‘AllCountries’ from the Lock5Data package. These data consist of measurements from all countries. We will study the variable ‘FemaleLabor’, which provides the percentage of females aged 15-64 that participate in the countries workforce. Our goal will be to build sampling distributions from samples of various sizes for the mean of this variable.

TASK 3.0 Modify the code below to generate a sampling distribution of the mean with 2000 samples, using a sample size of n=10.

# load the dataset
data("AllCountries")

# wrangle the data a little bit to select only a couple variables and to remove missing (NA) values
AllCountries <- AllCountries %>% 
  dplyr::select(Country,FemaleLabor,LifeExpectancy) %>%
  na.omit()

# allocate space to store your sample means
SampleMeans <- rep(NA, 2000)

# draw the correct number of samples, and for each of them save the sample mean
for(i in 1:2000){
  TemporarySample <- sample_n(AllCountries, size = 10)
  SampleMeans[i] <- mean(~FemaleLabor, data = TemporarySample)
}

TASK 3.1 Use your vector of sample means to create a histogram of your sampling distribution, and to calculate the standard error of the sample mean. Answer the questions below.

sd(SampleMeans)
mean(SampleMeans)

A. Where is the center of the distribution?

**Response** 58.12275

B. What is the standard error?

**Response** 5.329335
  1. If we were to build a 95% confidence interval using one of the sample means, how wide would it be?
**Response** [47.4641, 68.7841]

TASK 3.2 Now generate a sampling distribution for the mean using samples of size n=50. Again, you’ll need to calculate the means for 2000 samples and save them as a vector. Then produce the histogram, calculate the standard error, and answer the questions below. You should copy and paste the code from 3-1, changing the relative numbers.

# load the dataset
data("AllCountries")

# wrangle the data a little bit to select only a couple variables and to remove missing (NA) values
AllCountries <- AllCountries %>% 
  dplyr::select(Country,FemaleLabor,LifeExpectancy) %>%
  na.omit()

# allocate space to store your sample means
SampleMeans <- rep(NA, 2000)

# draw the correct number of samples, and for each of them save the sample mean
for(i in 1:2000){
  TemporarySample <- sample_n(AllCountries, size = 50)
  SampleMeans[i] <- mean(~FemaleLabor, data = TemporarySample)
}

gf_histogram(~SampleMeans)

mean(SampleMeans)
sd(SampleMeans)

A. Where is the center of the distribution?

**Response** 57.98732

B. What is the standard error?

**Response** 2.03178
  1. If we were to build a 95% confidence interval using one of the sample means, how wide would it be?
**Response** [53.9238, 62.0509]

TASK 3.3 Finally, generate a sampling distribution for the mean using samples of size n=100. Again, you’ll need to calculate the means for 2000 samples and save them as a vector. Then produce the histogram, calculate the standard error, and answer the questions below.

# load the dataset
data("AllCountries")

# wrangle the data a little bit to select only a couple variables and to remove missing (NA) values
AllCountries <- AllCountries %>% 
  dplyr::select(Country,FemaleLabor,LifeExpectancy) %>%
  na.omit()

# allocate space to store your sample means
SampleMeans <- rep(NA, 2000)

# draw the correct number of samples, and for each of them save the sample mean
for(i in 1:2000){
  TemporarySample <- sample_n(AllCountries, size = 100)
  SampleMeans[i] <- mean(~FemaleLabor, data = TemporarySample)
}

gf_histogram(~SampleMeans)

mean(SampleMeans)
sd(SampleMeans)

A. Where is the center of the distribution?

**Response** 57.9323

B. What is the standard error?

**Response** 1.169775
  1. If we were to build a 95% confidence interval using one of the sample means, how wide would it be?
**Response** [55.5928,60.2719]

TASK 3.4 What happens to the center of the distribution as the sample size increases?

**Response** It remains nearly unchanged.

TASK 3.5 What happens to the standard error, and the width of confidence intervals as the sample size increases?

**Response** The standard error decreases significantly and the range of the confidence interval narrows as the size increases.

Part 4: Interpreting a confidence interval.

Using a sample of 24 deliveries described in “Diary of a Pizza Girl” on the Slice website, we find a 95% confidence interval for the mean tip given for a pizza delivery to be $2.18 to $3.90. Which of the following is a correct interpretation of this interval?
5t23 a. I am 95% sure that all pizza delivery tips will be between $2.18 and $3.90. b. 95% of all pizza delivery tips will be between $2.18 and $3.90. c. I am 95% sure that the mean pizza delivery tip for this sample will be between $2.18 and $3.90. d. I am 95% sure that the mean tip for all pizza deliveries in this area will be between $2.18 and $3.90. e. I am 95% sure that the confidence interval for the mean pizza delivery tip will be between $2.18 and $3.90.

**Response** The answer is a, because the population must be all pizza diliveries because the location is unrestricted and a confidence interval yields a certain level of confidence that the statistic within the population will fall within a certain interval. D almost makes sense, however the "area" is not defined.
LS0tDQp0aXRsZTogIkxhYiAxLTI6IFNhbXBsaW5nIGFuZCAgZXhwZXJpbWVudHMiDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KDQpgYGB7ciwgZWNobyA9IEYsIG1lc3NhZ2UgPSBGfQ0KIyBDbGVhciB3b3Jrc3BhY2UNCnJtKGxpc3QgPSBscygpKSANCg0KIyB5b3VyIGNvZGUgd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUgaHRtbCBmb3IgdGhpcyBhc3NpZ25tZW50DQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobz1UUlVFKSANCg0KIyBsb2FkIHBhY2thZ2VzIHdlIG5lZWQgZm9yIHRoaXMgbGFiDQpsaWJyYXJ5KG1vc2FpYywgd2Fybi5jb25mbGljdHMgPSBGQUxTRSkgDQpsaWJyYXJ5KGdnZm9ybXVsYSwgd2Fybi5jb25mbGljdHMgPSBGQUxTRSkNCmxpYnJhcnkoTG9jazVEYXRhLCB3YXJuLmNvbmZsaWN0cyA9IEZBTFNFKQ0KbGlicmFyeShkcGx5ciwgd2Fybi5jb25mbGljdHMgPSBGQUxTRSkNCg0KYGBgDQoNCiMjIyBPYmplY3RpdmVzOg0KDQpGb3IgdGhpcyBsYWIgeW91IHNob3VsZC4uLg0KDQotICAgVXNlIG1hbmlwdWxhdGl2ZXMgdG8gZXhwbG9yZSBzYW1wbGluZyB2YXJpYWJpbGl0eSBhbmQgY3JlYXRlIGEgc2FtcGxpbmcgZGlzdHJpYnV0aW9uDQotICAgVXNlIHRlY2hub2xvZ3kgdG8gY3JlYXRlIGEgc2FtcGxpbmcgZGlzdHJpYnV0aW9uDQotICAgQ2FsY3VsYXRlIHN0YW5kYXJkIGVycm9yIG9mIGEgc3RhdGlzdGljIGZyb20gYSBzYW1wbGluZyBkaXN0cmlidXRpb24NCi0gICBCdWlsZCBhbmQgaW50ZXJwcmV0IGNvbmZpZGVuY2UgaW50ZXJ2YWxzIHVzaW5nIHRoZSBzdGFuZGFyZCBlcnJvciBmcm9tIGEgc2FtcGxpbmcgZGlzdHJpYnV0aW9uLg0KLSAgIFVzZSBjb25maWRlbmNlIGludGVydmFscyB0byBtYWtlIGNvbmNsdXNpb25zIGFib3V0IGEgcG9wdWxhdGlvbiBwYXJhbWV0ZXIuDQoNCiMgUGFydCAxOiBTYW1wbGVzIGZyb20gYSBwb3B1bGF0aW9uDQoNCkZvciB0aGlzIHBhcnQgb2YgdGhlIGxhYiAqeW91IG11c3Qgd29yayBpbiBhIHNtYWxsIGdyb3VwKi4gVGhlcmUgYXJlIHNldmVyYWwgYmlucyBvZiBiZWFkcyBpbiB0aGUgY2xhc3Nyb29tLiBSaWdodCBub3csIGpvaW4gYSBncm91cCBhcm91bmQgb25lIG9mIHRoZSBiZWFkcyAoYWltIGZvciB0aGUgc2FtZSBhbW91bnQgb2Ygc3R1ZGVudHMgaW4gZWFjaCBncm91cCksIGFuZCBpbnRyb2R1Y2UgeW91cnNlbGYuIFlvdSB3aWxsIGJlIHdvcmtpbmcgdG9nZXRoZXIgZm9yIHBhcnQgMS4NCg0KIyMjIFByZW1pc2UNCg0KVGhlIGJpbiBvZiBiZWFkcyByZXByZXNlbnRzIGEgc21hbGwgdG93biwgd2l0aCBlYWNoIGJlYWQgcmVwcmVzZW50aW5nIGEgcGVyc29uIGluIHRvd24gd2l0aCBhIHNwZWNpZmljIG9waW5pb24uIFRoZSBncmVlbiBiZWFkcyBzdXBwb3J0IGEgYmFsbG90IGluaXRpYXRpdmUgdG8gaW5jcmVhc2Ugc2FsZXMgdGF4IHRvIGZ1bmQgYmljeWNsZSB0cmFpbHMsIGFuZCB0aGUgd2hpdGUgYmVhZHMgb3Bwb3NlIHRoZSBpbml0aWF0aXZlLiBZb3VyIGdyb3VwIG9mIHN0dWRlbnRzIGFyZSBwb2xsc3RlcnMgLSB5b3Ugd2FudCB0byBkZXRlcm1pbmUgaG93IG11Y2ggc3VwcG9ydCB0aGUgaW5pdGlhdGl2ZSBoYXMgaW4geW91ciB0b3duLg0KDQpUaGUgc2FtcGxpbmcgcGFkZGxlIGlzIHlvdXIgdG9vbCB0byB0YWtlIHNpbXBsZSByYW5kb20gc2FtcGxlcyBmcm9tIHRoZSB0b3duJ3MgcG9wdWxhdGlvbi4NCg0KKipUQVNLIDEuMSoqIFdoYXQgaXMgdGhlIHBvcHVsYXRpb24gcGFyYW1ldGVyIHlvdSBhcmUgaW50ZXJlc3RlZCBpbiBsZWFybmluZyBhYm91dD8gVXNlIGNvcnJlY3Qgbm90YXRpb24uDQoNCiAgICAqKlJlc3BvbnNlKiogVGhlIHByb3BvcnRpb24gb2YgY2l0aXplbnMgaW4gdGhlIHRvd24gdGhhdCBzdXBwb3J0IHRoZSBiaWxsLg0KDQoqKlRBU0sgMS4yKiogVXNpbmcgdGhlIHNhbXBsaW5nIHBhZGRsZSwgdGFrZSBhIHNhbXBsZSBvZiB0aGUgcG9wdWxhdGlvbiBhbmQgYW5zd2VyIHRoZSBiZWxvdyBxdWVzdGlvbnMuICpFYWNoIHBlcnNvbiBpbiB0aGUgZ3JvdXAgbXVzdCB0YWtlIHRoZWlyIG93biBzYW1wbGUqLg0KDQogICAgKipSZXNwb25zZSoqDQogICAgLSBXaGF0IGlzIG4sIHRoZSBzYW1wbGUgc2l6ZT8gNDANCiAgICAtIFdoYXQgaXMgeW91ciBzYW1wbGUgc3RhdGlzdGljLCBib3RoIG5vdGF0aW9uIGFuZCB2YWx1ZT8gMTcvNDA9LjQyNSAocF4pLg0KDQoqKlRBU0sgMS4zKiogV2l0aCB5b3VyIGdyb3VwLCBkaXNjdXNzIHRoZSBkaWZmZXJlbmNlcyBiZXR3ZWVuIHlvdXIgaW5kaXZpZHVhbCBzYW1wbGUgZXN0aW1hdGVzLiBTdW1tYXJpemUgeW91ciBjb252ZXJzYXRpb24gaW4gYSBzZW50ZW5jZSBvciB0d28gaGVyZS4NCg0KICAgICoqUmVzcG9uc2UqKiBIYWxmIG9mIG91ciBncm91cCBoYWQgYSBzYW1wbGUgc3RhdGlzdGljIHRoYXQgd2FzIGdyZWF0ZXIgdGhhbiAuNSB3aXRoaW4gLjAzICguNS0uNTMpLCBhbmQgdGhlIG90aGVyIGhhbGYgaGFkIGEgc2FtcGxlIHN0YXRpc3RpYyB0aGF0IHdhcyBsZXNzIHRoYW4gLjUgd2l0aGluIC4xMjUgKC4zNzUtLjUpLg0KDQoqKlRBU0sgMS40KiogV29ya2luZyB0b2dldGhlciwgdGFrZSBhdCBsZWFzdCAzMCBzYW1wbGVzIChtb3JlIGlmIHlvdSdkIGxpa2UhKSBhbmQgbWFrZSBhIHZlY3RvciBvZiB0aGUgc2FtcGxlIHN0YXRpc3RpY3MgaW4gUi4gTWFrZSBhIGRvdHBsb3Qgb2YgeW91ciBzYW1wbGUgc3RhdGlzdGljcyBhbmQgZGlzY3VzcyB0aGUgY2VudGVyIGFuZCBzcHJlYWQgb2YgdGhlIGRvdHBsb3QuDQoNCiAgICAqKlJlc3BvbnNlKiogVGhlIHJhbmdlIG9mIHRoZSBkb3RwbG90IGdvZXMgZnJvbSAzLjI1LS41NzUgYW5kIHRoZSBjZW50ZXIgaXMgYXJvdW5kIC41Lg0KDQpgYGB7cn0NClNhbXBsZVN0YXRpc3RpY3MgPC0gYyguMzc1LCAuNDI1LCAuNTEsIC41MywgLjQ1LCAuNSwgLjQ3NSwgLjQ1LCAuNTUsIC41NzUsIC40NzUsIC40NzUsIC41LCAuNTI1LCAyMi80MCwgMTkvNDAsIDIxLzQwLCAyMy80MCwgMjAvNDAsIDIyLzQwLCAxOC80MCwgMjEvNDAsIDIwLzQwLCAyMC80MCwgMTMvNDAsIDE3LzQwLCAyMi80MCwgMjAvNDAsIDE3LzQwLCAyMy80MCkNCg0KZ2ZfZG90cGxvdCggfiBTYW1wbGVTdGF0aXN0aWNzKQ0KYGBgDQoNCioqVEFTSyAxLjUqKiBCYXNlZCBvbiBldmVyeXRoaW5nIHlvdSd2ZSBkb25lIHNvIGZhciwgd2hhdCBkbyB5b3UgdGhpbmsgaXMgdGhlIGJlc3QgZ3Vlc3MgZm9yIHRoZSBwb3B1bGF0aW9uIHBhcmFtZXRlciBpbiB5b3VyIHRvd24/IFdyaXRlIGEgc2VudGVuY2UganVzdGlmeWluZyB5b3VyIGFuc3dlci4NCg0KICAgICoqUmVzcG9uc2UqKiBCYXNlZCBvbiBvdXIgc2FtcGxlIHN0YXRpc3RpY3MsIG91ciBiZXN0IGd1ZXNzIGlzIHRoYXQgdGhlIHBvcHVsYXRpb24gcGFyYW1ldGVyIGlzIC41IGJlY2F1c2Ugb3VyIHNhbXBsZSBkaXN0cmlidXRpb24gaXMgYSBub3JtYWwgY3VydmUgY2VudGVyZWQgYWJvdXQgLjUuDQoNCioqVEFTSyAxLjYqKiBDYWxjdWxhdGUgdGhlIHN0YW5kYXJkIGRldmlhdGlvbiBvZiB5b3VyIHNhbXBsZSBzdGF0aXN0aWNzLiBUaGUgc3BlY2lmaWMgbmFtZSBmb3IgdGhpcyB2YWx1ZSBpcyB0aGUgKnN0YW5kYXJkIGVycm9yKi4gV2hlbmV2ZXIgd2UgZGlzY3VzcyB0aGUgc3RhbmRhcmQgZXJyb3Igb2YgYSBzdGF0aXN0aWMsIGl0IGRlc2NyaWJlcyB0aGUgaG93IHZhcmlhYmxlIHN0YXRpc3RpY3MgYXJlIHdoZW4gdGhleSBhcmUgY2FsY3VsYXRlZCBmcm9tIGRpZmZlcmVudCBzYW1wbGVzIGRyYXduIGZyb20gdGhlIHNhbWUgcG9wdWxhdGlvbi4NCg0KICAgICoqUmVzcG9uc2UqKiBTRSA9IC4wNTkwMjQ4OA0KDQpgYGB7cn0NCnNkKH5TYW1wbGVTdGF0aXN0aWNzKQ0KYGBgDQoNCiMgUGFydCAyOiBCYXNlYmFsbCBQbGF5ZXIgU2FsYXJpZXMNCg0KV2UgY2FuIGFsc28gY3JlYXRlIHNhbXBsaW5nIGRpc3RyaWJ1dGlvbnMgZm9yIHRoZSByZXN0IG9mIHRoZSAnYmlnIDUnIHBhcmFtZXRlcnMuIEluIHRoaXMgc2VjdGlvbiwgeW91IHdpbGwgY3JlYXRlIHNldmVyYWwgc2FtcGxpbmcgZGlzdHJpYnV0aW9ucyBmb3IgbWVhbnMgb2YgZGlmZmVyZW50IHBvcHVsYXRpb25zIGFuZCBvZiBkaWZmZXJlbnQgc2l6ZXMuDQoNCiMjIyBTYW1wbGluZyBEaXN0cmlidXRpb24NCg0KVG8gY3JlYXRlIGEgc2FtcGxpbmcgZGlzdHJpYnV0aW9uIGZyb20gc2ltcGxlIHJhbmRvbSBzYW1wbGVzLCB3ZSBtdXN0IGhhdmUgYWNjZXNzIHRvIHRoZSBlbnRpcmUgcG9wdWxhdGlvbi4gRm9yIHRoaXMgc2VjdGlvbiB3ZSBoYXZlIGFjY2VzcyB0byBhbGwgb3BlbmluZyBkYXkgc2FsYXJpZXMgZm9yIG1ham9yIGxlYWd1ZSBiYXNlYmFsbCBwbGF5ZXJzIGluIDIwMTkgKGluIG1pbGxpb25zIG9mIGRvbGxhcikuIFdlIGNhbiBsb2FkIHRoZSBkYXRhc2V0LCBjYWxsZWQgQmFzZWJhbGxTYWxhcmllczIwMTksIGZyb20gb3VyIHRleHRib29rIHVzaW5nIHRoZSBjb2RlIGJlbG93Og0KDQpgYGB7cn0NCmRhdGEoIkJhc2ViYWxsU2FsYXJpZXMyMDE5IikNCg0KaGVhZChCYXNlYmFsbFNhbGFyaWVzMjAxOSkNCmBgYA0KDQoqKlRBU0sgMi4xKiogRmluZCB0aGUgbWVhbiBhbmQgc3RhbmRhcmQgZGV2aWF0aW9uIG9mIHNhbGFyeSBpbiB0aGUgcG9wdWxhdGlvbi4gUmVjYWxsIHRoYXQgdGhlIGNvbW1hbmRzIG1lYW4oXH5ZLCBkYXRhID0gRGF0YVNldE5hbWUpIGFuZCBzZChcflksIGRhdGEgPSBEYXRhU2V0TmFtZSkgY2FuIGhlbHAgeW91IGFjY29tcGxpc2ggdGhpcyB0YXNrLiAqaW5jbHVkZSBwcm9wZXIgbm90YXRpb24gZm9yIGVhY2ggcXVhbnRpdHkqDQoNCiAgICAqKlJlc3BvbnNlKiogTXUgPSA0LjUwOTkyNCBhbmQgU2lnbWEgPSA2LjMzNDIxNw0KDQpgYGB7cn0NCm1lYW4oflNhbGFyeSwgZGF0YSA9IEJhc2ViYWxsU2FsYXJpZXMyMDE5KQ0Kc2QoflNhbGFyeSwgZGF0YSA9IEJhc2ViYWxsU2FsYXJpZXMyMDE5KQ0KDQpgYGANCg0KKipUQVNLIDIuMioqIENyZWF0ZSBhIGhpc3RvZ3JhbSBvZiB0aGUgc2FsYXJpZXMgYW5kIGRlc2NyaWJlIHRoZSBzaGFwZSBvZiB0aGUgZGlzdHJpYnV0aW9uLiBIaW50OiByZW1lbWJlciBnZl9oaXN0b2dyYW0oKQ0KDQogICAgKipSZXNwb25zZSoqIFRoZSBoaXN0b2dyYW0gaXMgYXN5bW1ldHJpYyBhbmQgc2tld2VkIHJpZ2h0Lg0KDQpgYGB7cn0NCmdmX2hpc3RvZ3JhbSh+U2FsYXJ5LCBkYXRhID0gQmFzZWJhbGxTYWxhcmllczIwMTkpDQoNCmBgYA0KDQoqKlRBU0sgMi4zKiogVXNlIHRoZSBjb2RlIGJlbG93IHRvIGdlbmVyYXRlIDIwMDAgc2FtcGxlcyBvZiBzaXplIDEwMCwgc2F2aW5nIHRoZSBzYW1wbGUgbWVhbiBzYWxhcnkgZm9yIGVhY2ggc2FtcGxlLCBhbmQgY3JlYXRpbmcgYSBoaXN0b2dyYW0uIFdoYXQgZG9lcyBhbiBvYnNlcnZhdGlvbiBwbG90dGVkIGluIHRoZSBoaXN0b2dyYW0gcmVwcmVzZW50Pw0KDQogICAgKipSZXNwb25zZSoqIFRoZSBtZWFuIHNhbGFyeSAoeCBiYXIpIG9mIGEgcmFuZG9tIHNhbXBsZSBvZiAxMDAgcGxheWVycy4NCg0KYGBge3J9DQojIHNhdmUgc3BhY2UgZm9yIHRoZSBtZWFucw0KU2FsYXJ5TWVhbnMgPC0gcmVwKE5BLCAyMDAwKQ0KDQojIGdlbmVyYXRlIDIwMCBzYW1wbGVzLCBzYXZpbmcgdGhlIG1lYW4gb2YgZWFjaCBvbmUNCmZvcihpIGluIDE6MjAwMCl7DQogICMgdGFrZSBhIHNhbXBsZQ0KICBUZW1wb3JhcnlTYW1wbGUgPC0gc2FtcGxlX24oQmFzZWJhbGxTYWxhcmllczIwMTksIDEwMCkNCiAgIyBzYXZlIHRoZSBtZWFuDQogIFNhbGFyeU1lYW5zW2ldIDwtIG1lYW4oflNhbGFyeSwgZGF0YSA9IFRlbXBvcmFyeVNhbXBsZSkNCn0NCg0KZ2ZfaGlzdG9ncmFtKH5TYWxhcnlNZWFucykNCmBgYA0KDQoqKlRBU0sgMi40KiogRGVzY3JpYmUgdGhlIHNoYXBlIG9mIHlvdXIgc2FtcGxpbmcgZGlzdHJpYnV0aW9uLCBhbmQgY29tcGFyZSBpdCB0byB0aGUgc2hhcGUgb2YgdGhlIHBvcHVsYXRpb24uDQoNCiAgICAqKlJlc3BvbnNlKiogVGhlIHNhbXBsaW5nIGRpc3RyaWJ1dGlvbiBpcyBzeW1tZXRyaWMgYW5kIGNlbnRlcmVkIGFyb3VuZCA0LjUsIGFuZCB0aGUgc2FtcGxpbmcgZGlzdHJpYnV0aW9uIGlzIGEgbm9ybWFsIGN1cnZlIHdoaWxlIHRoZSBwb3B1bGF0aW9uIHdhcyBjb21wbGV0ZWx5IHNrZXdlZCByaWdodC4NCg0KKipUQVNLIDIuNSoqIENhbGN1bGF0ZSB0aGUgY2VudGVyIG9mIHlvdXIgc2FtcGxpbmcgZGlzdHJpYnV0aW9uLCBhcyBtZWFzdXJlZCBieSB0aGUgbWVhbiBvZiB0aGUgdmVjdG9yIG9mIHNhbXBsZSBtZWFucy4gSG93IGRvZXMgdGhpcyB2YWx1ZSBjb21wYXJlIHRvIHRoZSBwb3B1bGF0aW9uIG1lYW4/DQoNCiAgICAqKlJlc3BvbnNlKiogeCBiYXIgPSA0LjUwMzE0OCBpcyB3aXRoaW4gbGVzcyB0aGFuIDcgb25lIHRob3VzYW5kdGhzIG9mIG11Lg0KDQpgYGB7cn0NCm1lYW4oU2FsYXJ5TWVhbnMpDQoNCmBgYA0KDQoqKlRBU0sgMi42KiogQ2FsY3VsYXRlIHRoZSBzdGFuZGFyZCBlcnJvciBvZiB0aGUgc2FtcGxlIG1lYW4gdXNpbmcgeW91ciB2ZWN0b3Igb2Ygc2FtcGxlIG1lYW5zLiBSZWNhbGwgdGhhdCB0aGUgc3RhbmRhcmQgZXJyb3Igb2YgYSBzdGF0aXN0aWMgaXMgdGhlIHN0YW5kYXJkIGRldmlhdGlvbiBvZiB0aGUgc2FtcGxpbmcgZGlzdHJpYnV0aW9uLg0KDQogICAgKipSZXNwb25zZSoqIHMgPSAwLjYwNTQ1MDYNCg0KYGBge3J9DQpzZChTYWxhcnlNZWFucykNCg0KYGBgDQoNCioqVEFTSyAyLjcqKiBIb3BlZnVsbHkgdGhlIHN0YW5kYXJkIGVycm9yIHlvdSBjYWxjdWxhdGVkIGluIDIuNiByb3VnaGx5IG1hdGNoZXMgdGhlIHN0YW5kYXJkIGVycm9yIHlvdSBjb3VsZCBlc3RpbWF0ZSBmcm9tIHRoZSBoaXN0b2dyYW0gaW4gMi4zLiBFeHBsYWluIGhvdyB5b3UgY291bGQgZXN0aW1hdGUgdGhlIFNFIGZyb20gdGhlIGhpc3RvZ3JhbSwgYW5kIHNob3cgaG93IGl0IGlzIHJvdWdobHkgdGhlIHNhbWUuDQoNCiAgICAqKlJlc3BvbnNlKiogWW91IGNhbiBlc3RpbWF0ZSB0aGUgU0UgZnJvbSB0aGUgaGlzdG9ncmFtIGJ5IGV5ZWJhbGxpbmcgdGhlIHJhbmdlIGluIHdoaWNoIDk1JSBvZiB0aGUgc2FtcGxlcyBmYWxsIGFuZCBkaXZpZGluZyB0aGF0IHJhbmdlIGJ5IDQuIEZvciBpbnN0YW5jZSwgaWYgSSB0YWtlIDUuNzUoYXBwcm94aW1hdGUgdXBwZXIgYm91bmQgZm9yIHRoZSA5NXRoIHBlcmNlbnRpbGUpIGFuZCBzdWJ0cmFjdCAzLjI1IChhcHByb3hpbWF0ZSA1dGggcGVyY2VudGlsZSkgdGhlbiBkaXZpZGUgdGhlIGRpZmZlcmVuY2UgYnkgNCwgSSBnZXQgLjYyNS4gVGhpcyB2YWx1ZSBpcyBxdWl0ZSBjbG9zZSB0byB0aGUgdHJ1ZSBzdGFuZGFyZCBkZXZpYXRpb24gb2YgdGhlIHBvcHVsYXRpb24gd2hpY2ggaXMgNi4zMzQyMTcuDQoNCiMjIyBDb25maWRlbmNlIGludGVydmFscw0KDQoqKlRBU0sgMi44IERpcmVjdGlvbnMqKiBGb3IgZWFjaCBvZiB0aGUgc2FtcGxlIG1lYW5zIGJlbG93IChhc3N1bWVkIHRvIGJlIG1lYW5zIGZvciBzYW1wbGVzIG9mIGJhc2ViYWxsIHBsYXllciBzYWxhcmllcykgY2FsY3VsYXRlIHRoZSBjb3JyZXNwb25kaW5nIDk1JSBjb25maWRlbmNlIGludGVydmFsLiBZb3Ugd2lsbCBuZWVkIHRvIHVzZSB0aGUgc3RhbmRhcmQgZXJyb3IgeW91IGNhbGN1bGF0ZWQgZnJvbSAyLjYuIEluZGljYXRlIHdoZXRoZXIgdGhlIGNvbmZpZGVuY2UgaW50ZXJ2YWwgc3VjY2Vzc2Z1bGx5IGNhcHR1cmVzIHRoZSB0cnVlIHBvcHVsYXRpb24gbWVhbiBzYWxhcnkuDQoNCioqVEFTSyAyLjguMSoqICRcYmFye1h9JD0gNA0KDQotICAgKipDb25maWRlbmNlIEludGVydmFsKiogWzIuNzg5MSwgNS4yMTA5XQ0KDQotICAgKipDYXB0dXJlZCBtdT8qKiBZZXMNCg0KKipUQVNLIDIuOC4yKiogJFxiYXJ7WH0kPSAzLjENCg0KLSAgICoqQ29uZmlkZW5jZSBJbnRlcnZhbCoqIFsxLjg4OTEsIDQuMzEwOV0NCg0KLSAgICoqQ2FwdHVyZWQgbXU/KiogTm8NCg0KKipUQVNLIDIuOC4zKiogJFxiYXJ7WH0kPSA1LjINCg0KLSAgICoqQ29uZmlkZW5jZSBJbnRlcnZhbCoqIFszLjk4OTEsIDYuNDEwOV0NCg0KLSAgICoqQ2FwdHVyZWQgbXU/KiogWWVzDQoNCiMgUGFydCAzOiBTYW1wbGUgc2l6ZSBhbmQgY29uZmlkZW5jZSBpbnRlcnZhbHMNCg0KRm9yIHRoaXMgYWN0aXZpdHkgd2Ugd2lsbCB1c2UgdGhlIGRhdGFzZXQgJ0FsbENvdW50cmllcycgZnJvbSB0aGUgTG9jazVEYXRhIHBhY2thZ2UuIFRoZXNlIGRhdGEgY29uc2lzdCBvZiBtZWFzdXJlbWVudHMgZnJvbSBhbGwgY291bnRyaWVzLiBXZSB3aWxsIHN0dWR5IHRoZSB2YXJpYWJsZSAnRmVtYWxlTGFib3InLCB3aGljaCBwcm92aWRlcyB0aGUgcGVyY2VudGFnZSBvZiBmZW1hbGVzIGFnZWQgMTUtNjQgdGhhdCBwYXJ0aWNpcGF0ZSBpbiB0aGUgY291bnRyaWVzIHdvcmtmb3JjZS4gT3VyIGdvYWwgd2lsbCBiZSB0byBidWlsZCBzYW1wbGluZyBkaXN0cmlidXRpb25zIGZyb20gc2FtcGxlcyBvZiB2YXJpb3VzIHNpemVzIGZvciB0aGUgbWVhbiBvZiB0aGlzIHZhcmlhYmxlLg0KDQoqKlRBU0sgMy4wKiogTW9kaWZ5IHRoZSBjb2RlIGJlbG93IHRvIGdlbmVyYXRlIGEgc2FtcGxpbmcgZGlzdHJpYnV0aW9uIG9mIHRoZSBtZWFuIHdpdGggMjAwMCBzYW1wbGVzLCB1c2luZyBhIHNhbXBsZSBzaXplIG9mIG49MTAuDQoNCmBgYHtyfQ0KIyBsb2FkIHRoZSBkYXRhc2V0DQpkYXRhKCJBbGxDb3VudHJpZXMiKQ0KDQojIHdyYW5nbGUgdGhlIGRhdGEgYSBsaXR0bGUgYml0IHRvIHNlbGVjdCBvbmx5IGEgY291cGxlIHZhcmlhYmxlcyBhbmQgdG8gcmVtb3ZlIG1pc3NpbmcgKE5BKSB2YWx1ZXMNCkFsbENvdW50cmllcyA8LSBBbGxDb3VudHJpZXMgJT4lIA0KICBkcGx5cjo6c2VsZWN0KENvdW50cnksRmVtYWxlTGFib3IsTGlmZUV4cGVjdGFuY3kpICU+JQ0KICBuYS5vbWl0KCkNCg0KIyBhbGxvY2F0ZSBzcGFjZSB0byBzdG9yZSB5b3VyIHNhbXBsZSBtZWFucw0KU2FtcGxlTWVhbnMgPC0gcmVwKE5BLCAyMDAwKQ0KDQojIGRyYXcgdGhlIGNvcnJlY3QgbnVtYmVyIG9mIHNhbXBsZXMsIGFuZCBmb3IgZWFjaCBvZiB0aGVtIHNhdmUgdGhlIHNhbXBsZSBtZWFuDQpmb3IoaSBpbiAxOjIwMDApew0KICBUZW1wb3JhcnlTYW1wbGUgPC0gc2FtcGxlX24oQWxsQ291bnRyaWVzLCBzaXplID0gMTApDQogIFNhbXBsZU1lYW5zW2ldIDwtIG1lYW4ofkZlbWFsZUxhYm9yLCBkYXRhID0gVGVtcG9yYXJ5U2FtcGxlKQ0KfQ0KYGBgDQoNCioqVEFTSyAzLjEqKiBVc2UgeW91ciB2ZWN0b3Igb2Ygc2FtcGxlIG1lYW5zIHRvIGNyZWF0ZSBhIGhpc3RvZ3JhbSBvZiB5b3VyIHNhbXBsaW5nIGRpc3RyaWJ1dGlvbiwgYW5kIHRvIGNhbGN1bGF0ZSB0aGUgc3RhbmRhcmQgZXJyb3Igb2YgdGhlIHNhbXBsZSBtZWFuLiBBbnN3ZXIgdGhlIHF1ZXN0aW9ucyBiZWxvdy4NCg0KYGBge3J9DQpzZChTYW1wbGVNZWFucykNCm1lYW4oU2FtcGxlTWVhbnMpDQpgYGANCg0KQS4gV2hlcmUgaXMgdGhlIGNlbnRlciBvZiB0aGUgZGlzdHJpYnV0aW9uPw0KDQogICAgKipSZXNwb25zZSoqIDU4LjEyMjc1DQoNCkIuIFdoYXQgaXMgdGhlIHN0YW5kYXJkIGVycm9yPw0KDQogICAgKipSZXNwb25zZSoqIDUuMzI5MzM1DQoNCkMuICBJZiB3ZSB3ZXJlIHRvIGJ1aWxkIGEgOTUlIGNvbmZpZGVuY2UgaW50ZXJ2YWwgdXNpbmcgb25lIG9mIHRoZSBzYW1wbGUgbWVhbnMsIGhvdyB3aWRlIHdvdWxkIGl0IGJlPw0KDQpgYGB7PWh0bWx9DQo8IS0tIC0tPg0KYGBgDQogICAgKipSZXNwb25zZSoqIFs0Ny40NjQxLCA2OC43ODQxXQ0KDQoqKlRBU0sgMy4yKiogTm93IGdlbmVyYXRlIGEgc2FtcGxpbmcgZGlzdHJpYnV0aW9uIGZvciB0aGUgbWVhbiB1c2luZyBzYW1wbGVzIG9mIHNpemUgbj01MC4gQWdhaW4sIHlvdSdsbCBuZWVkIHRvIGNhbGN1bGF0ZSB0aGUgbWVhbnMgZm9yIDIwMDAgc2FtcGxlcyBhbmQgc2F2ZSB0aGVtIGFzIGEgdmVjdG9yLiBUaGVuIHByb2R1Y2UgdGhlIGhpc3RvZ3JhbSwgY2FsY3VsYXRlIHRoZSBzdGFuZGFyZCBlcnJvciwgYW5kIGFuc3dlciB0aGUgcXVlc3Rpb25zIGJlbG93LiBZb3Ugc2hvdWxkIGNvcHkgYW5kIHBhc3RlIHRoZSBjb2RlIGZyb20gMy0xLCBjaGFuZ2luZyB0aGUgcmVsYXRpdmUgbnVtYmVycy4NCg0KYGBge3J9DQojIGxvYWQgdGhlIGRhdGFzZXQNCmRhdGEoIkFsbENvdW50cmllcyIpDQoNCiMgd3JhbmdsZSB0aGUgZGF0YSBhIGxpdHRsZSBiaXQgdG8gc2VsZWN0IG9ubHkgYSBjb3VwbGUgdmFyaWFibGVzIGFuZCB0byByZW1vdmUgbWlzc2luZyAoTkEpIHZhbHVlcw0KQWxsQ291bnRyaWVzIDwtIEFsbENvdW50cmllcyAlPiUgDQogIGRwbHlyOjpzZWxlY3QoQ291bnRyeSxGZW1hbGVMYWJvcixMaWZlRXhwZWN0YW5jeSkgJT4lDQogIG5hLm9taXQoKQ0KDQojIGFsbG9jYXRlIHNwYWNlIHRvIHN0b3JlIHlvdXIgc2FtcGxlIG1lYW5zDQpTYW1wbGVNZWFucyA8LSByZXAoTkEsIDIwMDApDQoNCiMgZHJhdyB0aGUgY29ycmVjdCBudW1iZXIgb2Ygc2FtcGxlcywgYW5kIGZvciBlYWNoIG9mIHRoZW0gc2F2ZSB0aGUgc2FtcGxlIG1lYW4NCmZvcihpIGluIDE6MjAwMCl7DQogIFRlbXBvcmFyeVNhbXBsZSA8LSBzYW1wbGVfbihBbGxDb3VudHJpZXMsIHNpemUgPSA1MCkNCiAgU2FtcGxlTWVhbnNbaV0gPC0gbWVhbih+RmVtYWxlTGFib3IsIGRhdGEgPSBUZW1wb3JhcnlTYW1wbGUpDQp9DQoNCmdmX2hpc3RvZ3JhbSh+U2FtcGxlTWVhbnMpDQoNCm1lYW4oU2FtcGxlTWVhbnMpDQpzZChTYW1wbGVNZWFucykNCmBgYA0KDQpBLiBXaGVyZSBpcyB0aGUgY2VudGVyIG9mIHRoZSBkaXN0cmlidXRpb24/DQoNCiAgICAqKlJlc3BvbnNlKiogNTcuOTg3MzINCg0KQi4gV2hhdCBpcyB0aGUgc3RhbmRhcmQgZXJyb3I/DQoNCiAgICAqKlJlc3BvbnNlKiogMi4wMzE3OA0KDQpDLiAgSWYgd2Ugd2VyZSB0byBidWlsZCBhIDk1JSBjb25maWRlbmNlIGludGVydmFsIHVzaW5nIG9uZSBvZiB0aGUgc2FtcGxlIG1lYW5zLCBob3cgd2lkZSB3b3VsZCBpdCBiZT8NCg0KYGBgez1odG1sfQ0KPCEtLSAtLT4NCmBgYA0KICAgICoqUmVzcG9uc2UqKiBbNTMuOTIzOCwgNjIuMDUwOV0NCg0KKipUQVNLIDMuMyoqIEZpbmFsbHksIGdlbmVyYXRlIGEgc2FtcGxpbmcgZGlzdHJpYnV0aW9uIGZvciB0aGUgbWVhbiB1c2luZyBzYW1wbGVzIG9mIHNpemUgbj0xMDAuIEFnYWluLCB5b3UnbGwgbmVlZCB0byBjYWxjdWxhdGUgdGhlIG1lYW5zIGZvciAyMDAwIHNhbXBsZXMgYW5kIHNhdmUgdGhlbSBhcyBhIHZlY3Rvci4gVGhlbiBwcm9kdWNlIHRoZSBoaXN0b2dyYW0sIGNhbGN1bGF0ZSB0aGUgc3RhbmRhcmQgZXJyb3IsIGFuZCBhbnN3ZXIgdGhlIHF1ZXN0aW9ucyBiZWxvdy4NCg0KYGBge3J9DQojIGxvYWQgdGhlIGRhdGFzZXQNCmRhdGEoIkFsbENvdW50cmllcyIpDQoNCiMgd3JhbmdsZSB0aGUgZGF0YSBhIGxpdHRsZSBiaXQgdG8gc2VsZWN0IG9ubHkgYSBjb3VwbGUgdmFyaWFibGVzIGFuZCB0byByZW1vdmUgbWlzc2luZyAoTkEpIHZhbHVlcw0KQWxsQ291bnRyaWVzIDwtIEFsbENvdW50cmllcyAlPiUgDQogIGRwbHlyOjpzZWxlY3QoQ291bnRyeSxGZW1hbGVMYWJvcixMaWZlRXhwZWN0YW5jeSkgJT4lDQogIG5hLm9taXQoKQ0KDQojIGFsbG9jYXRlIHNwYWNlIHRvIHN0b3JlIHlvdXIgc2FtcGxlIG1lYW5zDQpTYW1wbGVNZWFucyA8LSByZXAoTkEsIDIwMDApDQoNCiMgZHJhdyB0aGUgY29ycmVjdCBudW1iZXIgb2Ygc2FtcGxlcywgYW5kIGZvciBlYWNoIG9mIHRoZW0gc2F2ZSB0aGUgc2FtcGxlIG1lYW4NCmZvcihpIGluIDE6MjAwMCl7DQogIFRlbXBvcmFyeVNhbXBsZSA8LSBzYW1wbGVfbihBbGxDb3VudHJpZXMsIHNpemUgPSAxMDApDQogIFNhbXBsZU1lYW5zW2ldIDwtIG1lYW4ofkZlbWFsZUxhYm9yLCBkYXRhID0gVGVtcG9yYXJ5U2FtcGxlKQ0KfQ0KDQpnZl9oaXN0b2dyYW0oflNhbXBsZU1lYW5zKQ0KDQptZWFuKFNhbXBsZU1lYW5zKQ0Kc2QoU2FtcGxlTWVhbnMpDQoNCmBgYA0KDQpBLiBXaGVyZSBpcyB0aGUgY2VudGVyIG9mIHRoZSBkaXN0cmlidXRpb24/DQoNCiAgICAqKlJlc3BvbnNlKiogNTcuOTMyMw0KDQpCLiBXaGF0IGlzIHRoZSBzdGFuZGFyZCBlcnJvcj8NCg0KICAgICoqUmVzcG9uc2UqKiAxLjE2OTc3NQ0KDQpDLiAgSWYgd2Ugd2VyZSB0byBidWlsZCBhIDk1JSBjb25maWRlbmNlIGludGVydmFsIHVzaW5nIG9uZSBvZiB0aGUgc2FtcGxlIG1lYW5zLCBob3cgd2lkZSB3b3VsZCBpdCBiZT8NCg0KYGBgez1odG1sfQ0KPCEtLSAtLT4NCmBgYA0KICAgICoqUmVzcG9uc2UqKiBbNTUuNTkyOCw2MC4yNzE5XQ0KDQoqKlRBU0sgMy40KiogV2hhdCBoYXBwZW5zIHRvIHRoZSBjZW50ZXIgb2YgdGhlIGRpc3RyaWJ1dGlvbiBhcyB0aGUgc2FtcGxlIHNpemUgaW5jcmVhc2VzPw0KDQogICAgKipSZXNwb25zZSoqIEl0IHJlbWFpbnMgbmVhcmx5IHVuY2hhbmdlZC4NCg0KKipUQVNLIDMuNSoqIFdoYXQgaGFwcGVucyB0byB0aGUgc3RhbmRhcmQgZXJyb3IsIGFuZCB0aGUgd2lkdGggb2YgY29uZmlkZW5jZSBpbnRlcnZhbHMgYXMgdGhlIHNhbXBsZSBzaXplIGluY3JlYXNlcz8NCg0KICAgICoqUmVzcG9uc2UqKiBUaGUgc3RhbmRhcmQgZXJyb3IgZGVjcmVhc2VzIHNpZ25pZmljYW50bHkgYW5kIHRoZSByYW5nZSBvZiB0aGUgY29uZmlkZW5jZSBpbnRlcnZhbCBuYXJyb3dzIGFzIHRoZSBzaXplIGluY3JlYXNlcy4NCg0KIyBQYXJ0IDQ6IEludGVycHJldGluZyBhIGNvbmZpZGVuY2UgaW50ZXJ2YWwuDQoNClVzaW5nIGEgc2FtcGxlIG9mIDI0IGRlbGl2ZXJpZXMgZGVzY3JpYmVkIGluICJEaWFyeSBvZiBhIFBpenphIEdpcmwiIG9uIHRoZSBTbGljZSB3ZWJzaXRlLCB3ZSBmaW5kIGEgOTUlIGNvbmZpZGVuY2UgaW50ZXJ2YWwgZm9yIHRoZSBtZWFuIHRpcCBnaXZlbiBmb3IgYSBwaXp6YSBkZWxpdmVyeSB0byBiZSBcJDIuMTggdG8gXCQzLjkwLiBXaGljaCBvZiB0aGUgZm9sbG93aW5nIGlzIGEgY29ycmVjdCBpbnRlcnByZXRhdGlvbiBvZiB0aGlzIGludGVydmFsP1wNCjV0MjMgYS4gSSBhbSA5NSUgc3VyZSB0aGF0IGFsbCBwaXp6YSBkZWxpdmVyeSB0aXBzIHdpbGwgYmUgYmV0d2VlbiBcJDIuMTggYW5kIFwkMy45MC4gYi4gOTUlIG9mIGFsbCBwaXp6YSBkZWxpdmVyeSB0aXBzIHdpbGwgYmUgYmV0d2VlbiBcJDIuMTggYW5kIFwkMy45MC4gYy4gSSBhbSA5NSUgc3VyZSB0aGF0IHRoZSBtZWFuIHBpenphIGRlbGl2ZXJ5IHRpcCBmb3IgdGhpcyBzYW1wbGUgd2lsbCBiZSBiZXR3ZWVuIFwkMi4xOCBhbmQgXCQzLjkwLiBkLiBJIGFtIDk1JSBzdXJlIHRoYXQgdGhlIG1lYW4gdGlwIGZvciBhbGwgcGl6emEgZGVsaXZlcmllcyBpbiB0aGlzIGFyZWEgd2lsbCBiZSBiZXR3ZWVuIFwkMi4xOCBhbmQgXCQzLjkwLiBlLiBJIGFtIDk1JSBzdXJlIHRoYXQgdGhlIGNvbmZpZGVuY2UgaW50ZXJ2YWwgZm9yIHRoZSBtZWFuIHBpenphIGRlbGl2ZXJ5IHRpcCB3aWxsIGJlIGJldHdlZW4gXCQyLjE4IGFuZCBcJDMuOTAuDQoNCiAgICAqKlJlc3BvbnNlKiogVGhlIGFuc3dlciBpcyBhLCBiZWNhdXNlIHRoZSBwb3B1bGF0aW9uIG11c3QgYmUgYWxsIHBpenphIGRpbGl2ZXJpZXMgYmVjYXVzZSB0aGUgbG9jYXRpb24gaXMgdW5yZXN0cmljdGVkIGFuZCBhIGNvbmZpZGVuY2UgaW50ZXJ2YWwgeWllbGRzIGEgY2VydGFpbiBsZXZlbCBvZiBjb25maWRlbmNlIHRoYXQgdGhlIHN0YXRpc3RpYyB3aXRoaW4gdGhlIHBvcHVsYXRpb24gd2lsbCBmYWxsIHdpdGhpbiBhIGNlcnRhaW4gaW50ZXJ2YWwuIEQgYWxtb3N0IG1ha2VzIHNlbnNlLCBob3dldmVyIHRoZSAiYXJlYSIgaXMgbm90IGRlZmluZWQuDQo=