In this handout, I use ChatGPT 4.0 and the KeyMate.AI Search plugin to synthesize the information from the textbook, give examples, and create R code. All prompts are exact, but some of the output may be modified for correctness.

Prompt

Synthesize the information in this website. Include all relevant formulas and definitions. https://www.econometrics-with-r.org/2.2-RSATDOSA.html

Content

  1. Random Sampling:
    • A random sample is a subset of data points from a larger population, chosen randomly.
    • In R, the sample() function is used to draw random samples.
  2. Distribution of Sample Averages:
    • The distribution of sample averages is the distribution of the means of different random samples of the same size from the same population.
    • The Central Limit Theorem (CLT) states that, for a sufficiently large sample size, the distribution of the sample average will be approximately normal, regardless of the distribution of the population from which the sample is drawn.
  3. Formulas:
    • Sample Average: \(\bar{X} = \frac{1}{n} \sum_{i=1}^{n} X_i\)
      • Where:
        • \(\bar{X}\) is the sample average.
        • \(n\) is the sample size.
        • \(X_i\) is the value of the i-th observation in the sample.
    • Variance of Sample Average: \(Var(\bar{X}) = \frac{\sigma^2}{n}\)
      • Where:
        • \(Var(\bar{X})\) is the variance of the sample average.
        • \(\sigma^2\) is the population variance.
        • \(n\) is the sample size.
    • Standard Deviation of Sample Average: \(SD(\bar{X}) = \frac{\sigma}{\sqrt{n}}\)
      • Where:
        • \(SD(\bar{X})\) is the standard deviation of the sample average.
        • \(\sigma\) is the population standard deviation.
        • \(n\) is the sample size.
  4. Simulation in R:
    • The website provides R code snippets to simulate the distribution of sample averages and visualize the results. This helps in understanding the Central Limit Theorem in practice.
  5. Key Takeaways:
    • The distribution of sample averages is a fundamental concept in statistics.
    • The Central Limit Theorem is a powerful tool that allows us to make inferences about populations based on sample data.
    • As the sample size increases, the distribution of the sample average becomes more normal and its variance decreases.

This synthesis covers the main concepts, formulas, and takeaways from the website. If you need further details or have any other questions, please let me know!

Prompt

Please give examples of calculating sample average, standard deviation, and variance using these formulas.

1. Sample Average

Formula: \[ \bar{X} = \frac{1}{n} \sum_{i=1}^{n} X_i \]

Example: Suppose we have a sample of 5 observations: 2, 4, 6, 8, 10.

\[ \bar{X} = \frac{1}{5} (2 + 4 + 6 + 8 + 10) \] \[ \bar{X} = \frac{1}{5} (30) \] \[ \bar{X} = 6 \]

The sample average is 6.

2. Variance of Sample Average

Formula: \[ Var(\bar{X}) = \frac{\sigma^2}{n} \]

To calculate the variance of the sample average, we first need to find the population variance (\(\sigma^2\)).

Population Variance Formula: \[ \sigma^2 = \frac{1}{n} \sum_{i=1}^{n} (X_i - \mu)^2 \] Where \(\mu\) is the population mean.

Using the same sample: \[ \mu = 6 \] (from our previous calculation)

\[ \sigma^2 = \frac{1}{5} [(2-6)^2 + (4-6)^2 + (6-6)^2 + (8-6)^2 + (10-6)^2] \] \[ \sigma^2 = \frac{1}{5} [16 + 4 + 0 + 4 + 16] \] \[ \sigma^2 = \frac{1}{5} (40) \] \[ \sigma^2 = 8 \]

Now, using the formula for the variance of the sample average: \[ Var(\bar{X}) = \frac{8}{5} \] \[ Var(\bar{X}) = 1.6 \]

The variance of the sample average is 1.6.

3. Standard Deviation of Sample Average

Formula: \[ SD(\bar{X}) = \frac{\sigma}{\sqrt{n}} \]

Using the population standard deviation (\(\sigma\)) which is the square root of the population variance: \[ \sigma = \sqrt{8} \] \[ \sigma \approx 2.83 \]

Now, using the formula for the standard deviation of the sample average: \[ SD(\bar{X}) = \frac{2.83}{\sqrt{5}} \] \[ SD(\bar{X}) \approx 1.27 \]

The standard deviation of the sample average is approximately 1.27.

Prompt

Go into a bit more detail about the difference between population and samples. Support the discussion with simplified examples.

Population:

  • Definition: A population includes all members of a defined group that we are studying or collecting information on for data-driven decisions. It represents the entire group as a whole.

  • Characteristics:

    • It encompasses the entire group.
    • Parameters like the population mean (μ) and population standard deviation (σ) describe the population.
    • Studying the entire population can be time-consuming, expensive, or even impossible in some cases.
  • Example: Imagine a large pond with 10,000 fish. If we were to measure the average weight of fish in this pond, considering all 10,000 fish would mean we’re dealing with the population.

Sample:

  • Definition: A sample is a subset of the population. It is a small portion drawn from the population that represents the population. We use samples to make inferences or predictions about the population.

  • Characteristics:

    • It’s a fraction or part of the population.
    • Statistics like the sample mean (x̄) and sample standard deviation (s) describe the sample.
    • Sampling is more feasible and cost-effective than studying an entire population.
    • The accuracy of inferences made from a sample depends on the sample’s size and randomness.
  • Example: From the same pond with 10,000 fish, if we were to randomly select 100 fish and measure their average weight, we’re dealing with a sample.

Differences Illustrated with a Simplified Example:

Imagine a big jar filled with red and blue marbles. The entire jar, with all its marbles, represents the population. If you wanted to know the exact proportion of red to blue marbles, you’d have to count each one, which might be tedious if there are thousands of marbles.

Instead, you decide to take a handful of marbles out of the jar. This handful is your sample. By examining the proportion of red to blue marbles in your hand, you can make an educated guess (or inference) about the proportion in the entire jar.

However, there’s a catch:

  1. If you only take marbles from the top of the jar, your sample might not be representative, especially if all the blue marbles settled at the bottom. This is an example of a biased sample.
  2. If you shake the jar and then take a handful, ensuring a random mix, your sample is more likely to be representative of the entire population.

In real-world scenarios, researchers aim to ensure that their samples are as representative as possible of the population to make accurate predictions or inferences. This is why the method of sampling and the sample size are crucial in statistics.

Prompt

Create some examples of how to use R to sample data and calculate the sample average, standard deviation, and variance.

1. Sampling Data in R:

R provides the sample() function to draw random samples from a dataset.

# Create a dataset
data <- c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)

# Draw a random sample of size 5 from the dataset
sample_data <- sample(data, size = 5)
print(sample_data)
[1] 5 4 6 8 1

2. Calculate Sample Average:

To calculate the sample average (mean), you can use the mean() function.

# Calculate the sample average
sample_average <- mean(sample_data)
print(sample_average)
[1] 4.8

3. Calculate Sample Standard Deviation:

The sd() function in R calculates the sample standard deviation.

# Calculate the sample standard deviation
sample_sd <- sd(sample_data)
print(sample_sd)
[1] 2.588436

4. Calculate Sample Variance:

Variance is the square of the standard deviation. While R doesn’t have a direct function to calculate sample variance, you can square the result from sd() or use the var() function.

# Calculate the sample variance using sd() function
sample_variance <- sd(sample_data)^2
print(sample_variance)
[1] 6.7
# Alternatively, using the var() function
sample_variance_alt <- var(sample_data)
print(sample_variance_alt)
[1] 6.7

Full Example:

Combining all the above steps, here’s a full R script:

# Create a dataset
data <- c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)

# Draw a random sample of size 5 from the dataset
sample_data <- sample(data, size = 5)
print(paste("Sampled Data:", toString(sample_data)))
[1] "Sampled Data: 10, 5, 3, 8, 1"
# Calculate the sample average
sample_average <- mean(sample_data)
print(paste("Sample Average:", sample_average))
[1] "Sample Average: 5.4"
# Calculate the sample standard deviation
sample_sd <- sd(sample_data)
print(paste("Sample Standard Deviation:", sample_sd))
[1] "Sample Standard Deviation: 3.64691650576209"
# Calculate the sample variance
sample_variance <- var(sample_data)
print(paste("Sample Variance:", sample_variance))
[1] "Sample Variance: 13.3"

When you run the script, you’ll get different sampled data and statistics each time due to the randomness introduced by the sample() function.

Prompt

Explain how and why to use the set.seed() function in R and give an example of use.

set.seed() in R:

The set.seed() function in R is used to set the starting number (seed) for the random number generator algorithm. This is particularly useful when you want your random processes to be reproducible.

Why use set.seed()?

  1. Reproducibility: In data analysis and research, reproducibility is crucial. If you share your code with someone else or run the same code at a later time, using set.seed() ensures that you get the same results. This is especially important when you’re sampling data, randomizing datasets, or initializing random weights in machine learning algorithms.

  2. Consistency in Results: When debugging or fine-tuning algorithms, having consistent results between runs can help in understanding the changes or impacts of modifications made to the code.

  3. Sharing & Collaboration: If you’re collaborating on a project, using set.seed() ensures that all collaborators will get the same results when they run the code, making discussions and troubleshooting more straightforward.

How to use set.seed():

You simply call the function with an integer argument before any operation that involves randomness.

Example:

Let’s use set.seed() in conjunction with the sample() function:

# Without set.seed()
print(sample(1:10, 5))  # This will produce different results each time you run it
[1]  9 10  5  3  2
# With set.seed()
set.seed(123)  # Setting the seed
print(sample(1:10, 5))  # This will produce the same results every time you run it after setting the seed
[1]  3 10  2  8  6

In the above example, the first sample() call without set.seed() will give different results every time you run the code. However, after setting the seed with set.seed(123), the second sample() call will always produce the same set of numbers, ensuring reproducibility.

LS0tDQp0aXRsZTogIklFUiBDaGFwdGVyIDIuMiBTdW1tYXJqeSINCmF1dGhvcjogIkRyLiBTZWxieS1MZWFjaCINCmRhdGU6ICJgciBTeXMuRGF0ZSgpYCINCm91dHB1dDogaHRtbF9ub3RlYm9vayANCi0tLQ0KDQo8c3R5bGU+DQogICAgLyogU3R5bGluZyBmb3IgaDEgaGVhZGVycyAqLw0KICAgIGgxIHsNCiAgICAgICAgZm9udC13ZWlnaHQ6IGJvbGQ7ICAgICAgIC8qIEJvbGQgKi8NCiAgICAgICAgY29sb3I6IGRhcmtibHVlOyAgICAgICAgLyogRGFyayBibHVlIGNvbG9yICovDQogICAgfQ0KICAgIC8qIFN0eWxpbmcgZm9yIGgyIGhlYWRlcnMgKi8NCiAgICBoMiB7DQogICAgICAgIGZvbnQtd2VpZ2h0OiBib2xkOyANCiAgICB9DQoNCiAgICAvKiBTdHlsaW5nIGZvciBoMyBoZWFkZXJzICovDQogICAgaDMgew0KICAgICAgICBmb250LXN0eWxlOiBpdGFsaWM7ICAgICAvKiBJdGFsaWMgKi8NCiAgICB9DQo8L3N0eWxlPg0KDQoNCkluIHRoaXMgaGFuZG91dCwgSSB1c2UgQ2hhdEdQVCA0LjAgYW5kIHRoZSBLZXlNYXRlLkFJIFNlYXJjaCBwbHVnaW4gdG8gc3ludGhlc2l6ZSB0aGUgaW5mb3JtYXRpb24gZnJvbSB0aGUgdGV4dGJvb2ssIGdpdmUgZXhhbXBsZXMsIGFuZCBjcmVhdGUgUiBjb2RlLiBBbGwgcHJvbXB0cyBhcmUgZXhhY3QsIGJ1dCBzb21lIG9mIHRoZSBvdXRwdXQgbWF5IGJlIG1vZGlmaWVkIGZvciBjb3JyZWN0bmVzcy4gDQoNCiMjIFByb21wdA0KU3ludGhlc2l6ZSB0aGUgaW5mb3JtYXRpb24gaW4gdGhpcyB3ZWJzaXRlLiBJbmNsdWRlIGFsbCByZWxldmFudCBmb3JtdWxhcyBhbmQgZGVmaW5pdGlvbnMuIGh0dHBzOi8vd3d3LmVjb25vbWV0cmljcy13aXRoLXIub3JnLzIuMi1SU0FURE9TQS5odG1sDQoNCg0KIyMjIENvbnRlbnQNCg0KMS4gKipSYW5kb20gU2FtcGxpbmcqKjoNCiAgIC0gQSByYW5kb20gc2FtcGxlIGlzIGEgc3Vic2V0IG9mIGRhdGEgcG9pbnRzIGZyb20gYSBsYXJnZXIgcG9wdWxhdGlvbiwgY2hvc2VuIHJhbmRvbWx5Lg0KICAgLSBJbiBSLCB0aGUgYHNhbXBsZSgpYCBmdW5jdGlvbiBpcyB1c2VkIHRvIGRyYXcgcmFuZG9tIHNhbXBsZXMuDQoNCjIuICoqRGlzdHJpYnV0aW9uIG9mIFNhbXBsZSBBdmVyYWdlcyoqOg0KICAgLSBUaGUgZGlzdHJpYnV0aW9uIG9mIHNhbXBsZSBhdmVyYWdlcyBpcyB0aGUgZGlzdHJpYnV0aW9uIG9mIHRoZSBtZWFucyBvZiBkaWZmZXJlbnQgcmFuZG9tIHNhbXBsZXMgb2YgdGhlIHNhbWUgc2l6ZSBmcm9tIHRoZSBzYW1lIHBvcHVsYXRpb24uDQogICAtIFRoZSBDZW50cmFsIExpbWl0IFRoZW9yZW0gKENMVCkgc3RhdGVzIHRoYXQsIGZvciBhIHN1ZmZpY2llbnRseSBsYXJnZSBzYW1wbGUgc2l6ZSwgdGhlIGRpc3RyaWJ1dGlvbiBvZiB0aGUgc2FtcGxlIGF2ZXJhZ2Ugd2lsbCBiZSBhcHByb3hpbWF0ZWx5IG5vcm1hbCwgcmVnYXJkbGVzcyBvZiB0aGUgZGlzdHJpYnV0aW9uIG9mIHRoZSBwb3B1bGF0aW9uIGZyb20gd2hpY2ggdGhlIHNhbXBsZSBpcyBkcmF3bi4NCg0KMy4gKipGb3JtdWxhcyoqOg0KICAgLSAqKlNhbXBsZSBBdmVyYWdlKio6IFwoIFxiYXJ7WH0gPSBcZnJhY3sxfXtufSBcc3VtX3tpPTF9XntufSBYX2kgXCkNCiAgICAgLSBXaGVyZToNCiAgICAgICAtIFwoIFxiYXJ7WH0gXCkgaXMgdGhlIHNhbXBsZSBhdmVyYWdlLg0KICAgICAgIC0gXCggbiBcKSBpcyB0aGUgc2FtcGxlIHNpemUuDQogICAgICAgLSBcKCBYX2kgXCkgaXMgdGhlIHZhbHVlIG9mIHRoZSBpLXRoIG9ic2VydmF0aW9uIGluIHRoZSBzYW1wbGUuDQoNCiAgIC0gKipWYXJpYW5jZSBvZiBTYW1wbGUgQXZlcmFnZSoqOiBcKCBWYXIoXGJhcntYfSkgPSBcZnJhY3tcc2lnbWFeMn17bn0gXCkNCiAgICAgLSBXaGVyZToNCiAgICAgICAtIFwoIFZhcihcYmFye1h9KSBcKSBpcyB0aGUgdmFyaWFuY2Ugb2YgdGhlIHNhbXBsZSBhdmVyYWdlLg0KICAgICAgIC0gXCggXHNpZ21hXjIgXCkgaXMgdGhlIHBvcHVsYXRpb24gdmFyaWFuY2UuDQogICAgICAgLSBcKCBuIFwpIGlzIHRoZSBzYW1wbGUgc2l6ZS4NCg0KICAgLSAqKlN0YW5kYXJkIERldmlhdGlvbiBvZiBTYW1wbGUgQXZlcmFnZSoqOiBcKCBTRChcYmFye1h9KSA9IFxmcmFje1xzaWdtYX17XHNxcnR7bn19IFwpDQogICAgIC0gV2hlcmU6DQogICAgICAgLSBcKCBTRChcYmFye1h9KSBcKSBpcyB0aGUgc3RhbmRhcmQgZGV2aWF0aW9uIG9mIHRoZSBzYW1wbGUgYXZlcmFnZS4NCiAgICAgICAtIFwoIFxzaWdtYSBcKSBpcyB0aGUgcG9wdWxhdGlvbiBzdGFuZGFyZCBkZXZpYXRpb24uDQogICAgICAgLSBcKCBuIFwpIGlzIHRoZSBzYW1wbGUgc2l6ZS4NCg0KNC4gKipTaW11bGF0aW9uIGluIFIqKjoNCiAgIC0gVGhlIHdlYnNpdGUgcHJvdmlkZXMgUiBjb2RlIHNuaXBwZXRzIHRvIHNpbXVsYXRlIHRoZSBkaXN0cmlidXRpb24gb2Ygc2FtcGxlIGF2ZXJhZ2VzIGFuZCB2aXN1YWxpemUgdGhlIHJlc3VsdHMuIFRoaXMgaGVscHMgaW4gdW5kZXJzdGFuZGluZyB0aGUgQ2VudHJhbCBMaW1pdCBUaGVvcmVtIGluIHByYWN0aWNlLg0KDQo1LiAqKktleSBUYWtlYXdheXMqKjoNCiAgIC0gVGhlIGRpc3RyaWJ1dGlvbiBvZiBzYW1wbGUgYXZlcmFnZXMgaXMgYSBmdW5kYW1lbnRhbCBjb25jZXB0IGluIHN0YXRpc3RpY3MuDQogICAtIFRoZSBDZW50cmFsIExpbWl0IFRoZW9yZW0gaXMgYSBwb3dlcmZ1bCB0b29sIHRoYXQgYWxsb3dzIHVzIHRvIG1ha2UgaW5mZXJlbmNlcyBhYm91dCBwb3B1bGF0aW9ucyBiYXNlZCBvbiBzYW1wbGUgZGF0YS4NCiAgIC0gQXMgdGhlIHNhbXBsZSBzaXplIGluY3JlYXNlcywgdGhlIGRpc3RyaWJ1dGlvbiBvZiB0aGUgc2FtcGxlIGF2ZXJhZ2UgYmVjb21lcyBtb3JlIG5vcm1hbCBhbmQgaXRzIHZhcmlhbmNlIGRlY3JlYXNlcy4NCg0KVGhpcyBzeW50aGVzaXMgY292ZXJzIHRoZSBtYWluIGNvbmNlcHRzLCBmb3JtdWxhcywgYW5kIHRha2Vhd2F5cyBmcm9tIHRoZSB3ZWJzaXRlLiBJZiB5b3UgbmVlZCBmdXJ0aGVyIGRldGFpbHMgb3IgaGF2ZSBhbnkgb3RoZXIgcXVlc3Rpb25zLCBwbGVhc2UgbGV0IG1lIGtub3chDQoNCiMjIFByb21wdA0KUGxlYXNlIGdpdmUgZXhhbXBsZXMgb2YgY2FsY3VsYXRpbmcgc2FtcGxlIGF2ZXJhZ2UsIHN0YW5kYXJkIGRldmlhdGlvbiwgYW5kIHZhcmlhbmNlIHVzaW5nIHRoZXNlIGZvcm11bGFzLiANCg0KIyMjIDEuIFNhbXBsZSBBdmVyYWdlDQoNCioqRm9ybXVsYSoqOiANClxbIFxiYXJ7WH0gPSBcZnJhY3sxfXtufSBcc3VtX3tpPTF9XntufSBYX2kgXF0NCg0KKipFeGFtcGxlKio6DQpTdXBwb3NlIHdlIGhhdmUgYSBzYW1wbGUgb2YgNSBvYnNlcnZhdGlvbnM6IDIsIDQsIDYsIDgsIDEwLg0KDQpcWyBcYmFye1h9ID0gXGZyYWN7MX17NX0gKDIgKyA0ICsgNiArIDggKyAxMCkgXF0NClxbIFxiYXJ7WH0gPSBcZnJhY3sxfXs1fSAoMzApIFxdDQpcWyBcYmFye1h9ID0gNiBcXQ0KDQpUaGUgc2FtcGxlIGF2ZXJhZ2UgaXMgNi4NCg0KIyMjIDIuIFZhcmlhbmNlIG9mIFNhbXBsZSBBdmVyYWdlDQoNCioqRm9ybXVsYSoqOiANClxbIFZhcihcYmFye1h9KSA9IFxmcmFje1xzaWdtYV4yfXtufSBcXQ0KDQpUbyBjYWxjdWxhdGUgdGhlIHZhcmlhbmNlIG9mIHRoZSBzYW1wbGUgYXZlcmFnZSwgd2UgZmlyc3QgbmVlZCB0byBmaW5kIHRoZSBwb3B1bGF0aW9uIHZhcmlhbmNlIChcKCBcc2lnbWFeMiBcKSkuIA0KDQoqKlBvcHVsYXRpb24gVmFyaWFuY2UgRm9ybXVsYSoqOg0KXFsgXHNpZ21hXjIgPSBcZnJhY3sxfXtufSBcc3VtX3tpPTF9XntufSAoWF9pIC0gXG11KV4yIFxdDQpXaGVyZSBcKCBcbXUgXCkgaXMgdGhlIHBvcHVsYXRpb24gbWVhbi4NCg0KVXNpbmcgdGhlIHNhbWUgc2FtcGxlOiANClxbIFxtdSA9IDYgXF0gKGZyb20gb3VyIHByZXZpb3VzIGNhbGN1bGF0aW9uKQ0KDQpcWyBcc2lnbWFeMiA9IFxmcmFjezF9ezV9IFsoMi02KV4yICsgKDQtNileMiArICg2LTYpXjIgKyAoOC02KV4yICsgKDEwLTYpXjJdIFxdDQpcWyBcc2lnbWFeMiA9IFxmcmFjezF9ezV9IFsxNiArIDQgKyAwICsgNCArIDE2XSBcXQ0KXFsgXHNpZ21hXjIgPSBcZnJhY3sxfXs1fSAoNDApIFxdDQpcWyBcc2lnbWFeMiA9IDggXF0NCg0KTm93LCB1c2luZyB0aGUgZm9ybXVsYSBmb3IgdGhlIHZhcmlhbmNlIG9mIHRoZSBzYW1wbGUgYXZlcmFnZToNClxbIFZhcihcYmFye1h9KSA9IFxmcmFjezh9ezV9IFxdDQpcWyBWYXIoXGJhcntYfSkgPSAxLjYgXF0NCg0KVGhlIHZhcmlhbmNlIG9mIHRoZSBzYW1wbGUgYXZlcmFnZSBpcyAxLjYuDQoNCiMjIyAzLiBTdGFuZGFyZCBEZXZpYXRpb24gb2YgU2FtcGxlIEF2ZXJhZ2UNCg0KKipGb3JtdWxhKio6IA0KXFsgU0QoXGJhcntYfSkgPSBcZnJhY3tcc2lnbWF9e1xzcXJ0e259fSBcXQ0KDQpVc2luZyB0aGUgcG9wdWxhdGlvbiBzdGFuZGFyZCBkZXZpYXRpb24gKFwoIFxzaWdtYSBcKSkgd2hpY2ggaXMgdGhlIHNxdWFyZSByb290IG9mIHRoZSBwb3B1bGF0aW9uIHZhcmlhbmNlOg0KXFsgXHNpZ21hID0gXHNxcnR7OH0gXF0NClxbIFxzaWdtYSBcYXBwcm94IDIuODMgXF0NCg0KTm93LCB1c2luZyB0aGUgZm9ybXVsYSBmb3IgdGhlIHN0YW5kYXJkIGRldmlhdGlvbiBvZiB0aGUgc2FtcGxlIGF2ZXJhZ2U6DQpcWyBTRChcYmFye1h9KSA9IFxmcmFjezIuODN9e1xzcXJ0ezV9fSBcXQ0KXFsgU0QoXGJhcntYfSkgXGFwcHJveCAxLjI3IFxdDQoNClRoZSBzdGFuZGFyZCBkZXZpYXRpb24gb2YgdGhlIHNhbXBsZSBhdmVyYWdlIGlzIGFwcHJveGltYXRlbHkgMS4yNy4NCg0KDQojIyBQcm9tcHQgDQpHbyBpbnRvIGEgYml0IG1vcmUgZGV0YWlsIGFib3V0IHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gcG9wdWxhdGlvbiBhbmQgc2FtcGxlcy4gU3VwcG9ydCB0aGUgZGlzY3Vzc2lvbiB3aXRoIHNpbXBsaWZpZWQgZXhhbXBsZXMuIA0KDQojIyMgUG9wdWxhdGlvbjoNCg0KLSAqKkRlZmluaXRpb24qKjogQSBwb3B1bGF0aW9uIGluY2x1ZGVzIGFsbCBtZW1iZXJzIG9mIGEgZGVmaW5lZCBncm91cCB0aGF0IHdlIGFyZSBzdHVkeWluZyBvciBjb2xsZWN0aW5nIGluZm9ybWF0aW9uIG9uIGZvciBkYXRhLWRyaXZlbiBkZWNpc2lvbnMuIEl0IHJlcHJlc2VudHMgdGhlIGVudGlyZSBncm91cCBhcyBhIHdob2xlLg0KICANCi0gKipDaGFyYWN0ZXJpc3RpY3MqKjoNCiAgLSBJdCBlbmNvbXBhc3NlcyB0aGUgZW50aXJlIGdyb3VwLg0KICAtIFBhcmFtZXRlcnMgbGlrZSB0aGUgcG9wdWxhdGlvbiBtZWFuICjOvCkgYW5kIHBvcHVsYXRpb24gc3RhbmRhcmQgZGV2aWF0aW9uICjPgykgZGVzY3JpYmUgdGhlIHBvcHVsYXRpb24uDQogIC0gU3R1ZHlpbmcgdGhlIGVudGlyZSBwb3B1bGF0aW9uIGNhbiBiZSB0aW1lLWNvbnN1bWluZywgZXhwZW5zaXZlLCBvciBldmVuIGltcG9zc2libGUgaW4gc29tZSBjYXNlcy4NCg0KLSAqKkV4YW1wbGUqKjogSW1hZ2luZSBhIGxhcmdlIHBvbmQgd2l0aCAxMCwwMDAgZmlzaC4gSWYgd2Ugd2VyZSB0byBtZWFzdXJlIHRoZSBhdmVyYWdlIHdlaWdodCBvZiBmaXNoIGluIHRoaXMgcG9uZCwgY29uc2lkZXJpbmcgYWxsIDEwLDAwMCBmaXNoIHdvdWxkIG1lYW4gd2UncmUgZGVhbGluZyB3aXRoIHRoZSBwb3B1bGF0aW9uLg0KDQojIyMgU2FtcGxlOg0KDQotICoqRGVmaW5pdGlvbioqOiBBIHNhbXBsZSBpcyBhIHN1YnNldCBvZiB0aGUgcG9wdWxhdGlvbi4gSXQgaXMgYSBzbWFsbCBwb3J0aW9uIGRyYXduIGZyb20gdGhlIHBvcHVsYXRpb24gdGhhdCByZXByZXNlbnRzIHRoZSBwb3B1bGF0aW9uLiBXZSB1c2Ugc2FtcGxlcyB0byBtYWtlIGluZmVyZW5jZXMgb3IgcHJlZGljdGlvbnMgYWJvdXQgdGhlIHBvcHVsYXRpb24uDQoNCi0gKipDaGFyYWN0ZXJpc3RpY3MqKjoNCiAgLSBJdCdzIGEgZnJhY3Rpb24gb3IgcGFydCBvZiB0aGUgcG9wdWxhdGlvbi4NCiAgLSBTdGF0aXN0aWNzIGxpa2UgdGhlIHNhbXBsZSBtZWFuICh4zIQpIGFuZCBzYW1wbGUgc3RhbmRhcmQgZGV2aWF0aW9uIChzKSBkZXNjcmliZSB0aGUgc2FtcGxlLg0KICAtIFNhbXBsaW5nIGlzIG1vcmUgZmVhc2libGUgYW5kIGNvc3QtZWZmZWN0aXZlIHRoYW4gc3R1ZHlpbmcgYW4gZW50aXJlIHBvcHVsYXRpb24uDQogIC0gVGhlIGFjY3VyYWN5IG9mIGluZmVyZW5jZXMgbWFkZSBmcm9tIGEgc2FtcGxlIGRlcGVuZHMgb24gdGhlIHNhbXBsZSdzIHNpemUgYW5kIHJhbmRvbW5lc3MuDQoNCi0gKipFeGFtcGxlKio6IEZyb20gdGhlIHNhbWUgcG9uZCB3aXRoIDEwLDAwMCBmaXNoLCBpZiB3ZSB3ZXJlIHRvIHJhbmRvbWx5IHNlbGVjdCAxMDAgZmlzaCBhbmQgbWVhc3VyZSB0aGVpciBhdmVyYWdlIHdlaWdodCwgd2UncmUgZGVhbGluZyB3aXRoIGEgc2FtcGxlLg0KDQojIyMgRGlmZmVyZW5jZXMgSWxsdXN0cmF0ZWQgd2l0aCBhIFNpbXBsaWZpZWQgRXhhbXBsZToNCg0KSW1hZ2luZSBhIGJpZyBqYXIgZmlsbGVkIHdpdGggcmVkIGFuZCBibHVlIG1hcmJsZXMuIFRoZSBlbnRpcmUgamFyLCB3aXRoIGFsbCBpdHMgbWFyYmxlcywgcmVwcmVzZW50cyB0aGUgKipwb3B1bGF0aW9uKiouIElmIHlvdSB3YW50ZWQgdG8ga25vdyB0aGUgZXhhY3QgcHJvcG9ydGlvbiBvZiByZWQgdG8gYmx1ZSBtYXJibGVzLCB5b3UnZCBoYXZlIHRvIGNvdW50IGVhY2ggb25lLCB3aGljaCBtaWdodCBiZSB0ZWRpb3VzIGlmIHRoZXJlIGFyZSB0aG91c2FuZHMgb2YgbWFyYmxlcy4NCg0KSW5zdGVhZCwgeW91IGRlY2lkZSB0byB0YWtlIGEgaGFuZGZ1bCBvZiBtYXJibGVzIG91dCBvZiB0aGUgamFyLiBUaGlzIGhhbmRmdWwgaXMgeW91ciAqKnNhbXBsZSoqLiBCeSBleGFtaW5pbmcgdGhlIHByb3BvcnRpb24gb2YgcmVkIHRvIGJsdWUgbWFyYmxlcyBpbiB5b3VyIGhhbmQsIHlvdSBjYW4gbWFrZSBhbiBlZHVjYXRlZCBndWVzcyAob3IgaW5mZXJlbmNlKSBhYm91dCB0aGUgcHJvcG9ydGlvbiBpbiB0aGUgZW50aXJlIGphci4NCg0KSG93ZXZlciwgdGhlcmUncyBhIGNhdGNoOg0KDQoxLiBJZiB5b3Ugb25seSB0YWtlIG1hcmJsZXMgZnJvbSB0aGUgdG9wIG9mIHRoZSBqYXIsIHlvdXIgc2FtcGxlIG1pZ2h0IG5vdCBiZSByZXByZXNlbnRhdGl2ZSwgZXNwZWNpYWxseSBpZiBhbGwgdGhlIGJsdWUgbWFyYmxlcyBzZXR0bGVkIGF0IHRoZSBib3R0b20uIFRoaXMgaXMgYW4gZXhhbXBsZSBvZiBhIGJpYXNlZCBzYW1wbGUuDQoyLiBJZiB5b3Ugc2hha2UgdGhlIGphciBhbmQgdGhlbiB0YWtlIGEgaGFuZGZ1bCwgZW5zdXJpbmcgYSByYW5kb20gbWl4LCB5b3VyIHNhbXBsZSBpcyBtb3JlIGxpa2VseSB0byBiZSByZXByZXNlbnRhdGl2ZSBvZiB0aGUgZW50aXJlIHBvcHVsYXRpb24uDQoNCkluIHJlYWwtd29ybGQgc2NlbmFyaW9zLCByZXNlYXJjaGVycyBhaW0gdG8gZW5zdXJlIHRoYXQgdGhlaXIgc2FtcGxlcyBhcmUgYXMgcmVwcmVzZW50YXRpdmUgYXMgcG9zc2libGUgb2YgdGhlIHBvcHVsYXRpb24gdG8gbWFrZSBhY2N1cmF0ZSBwcmVkaWN0aW9ucyBvciBpbmZlcmVuY2VzLiBUaGlzIGlzIHdoeSB0aGUgbWV0aG9kIG9mIHNhbXBsaW5nIGFuZCB0aGUgc2FtcGxlIHNpemUgYXJlIGNydWNpYWwgaW4gc3RhdGlzdGljcy4NCg0KIyMgUHJvbXB0DQpDcmVhdGUgc29tZSBleGFtcGxlcyBvZiBob3cgdG8gdXNlIFIgdG8gc2FtcGxlIGRhdGEgYW5kIGNhbGN1bGF0ZSB0aGUgc2FtcGxlIGF2ZXJhZ2UsIHN0YW5kYXJkIGRldmlhdGlvbiwgYW5kIHZhcmlhbmNlLiANCg0KIyMjIDEuIFNhbXBsaW5nIERhdGEgaW4gUjoNCg0KUiBwcm92aWRlcyB0aGUgYHNhbXBsZSgpYCBmdW5jdGlvbiB0byBkcmF3IHJhbmRvbSBzYW1wbGVzIGZyb20gYSBkYXRhc2V0Lg0KDQpgYGB7Un0NCiMgQ3JlYXRlIGEgZGF0YXNldA0KZGF0YSA8LSBjKDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwKQ0KDQojIERyYXcgYSByYW5kb20gc2FtcGxlIG9mIHNpemUgNSBmcm9tIHRoZSBkYXRhc2V0DQpzYW1wbGVfZGF0YSA8LSBzYW1wbGUoZGF0YSwgc2l6ZSA9IDUpDQpwcmludChzYW1wbGVfZGF0YSkNCmBgYA0KDQojIyMgMi4gQ2FsY3VsYXRlIFNhbXBsZSBBdmVyYWdlOg0KDQpUbyBjYWxjdWxhdGUgdGhlIHNhbXBsZSBhdmVyYWdlIChtZWFuKSwgeW91IGNhbiB1c2UgdGhlIGBtZWFuKClgIGZ1bmN0aW9uLg0KDQpgYGB7Un0NCiMgQ2FsY3VsYXRlIHRoZSBzYW1wbGUgYXZlcmFnZQ0Kc2FtcGxlX2F2ZXJhZ2UgPC0gbWVhbihzYW1wbGVfZGF0YSkNCnByaW50KHNhbXBsZV9hdmVyYWdlKQ0KYGBgDQoNCiMjIyAzLiBDYWxjdWxhdGUgU2FtcGxlIFN0YW5kYXJkIERldmlhdGlvbjoNCg0KVGhlIGBzZCgpYCBmdW5jdGlvbiBpbiBSIGNhbGN1bGF0ZXMgdGhlIHNhbXBsZSBzdGFuZGFyZCBkZXZpYXRpb24uDQoNCmBgYHtSfQ0KIyBDYWxjdWxhdGUgdGhlIHNhbXBsZSBzdGFuZGFyZCBkZXZpYXRpb24NCnNhbXBsZV9zZCA8LSBzZChzYW1wbGVfZGF0YSkNCnByaW50KHNhbXBsZV9zZCkNCmBgYA0KDQojIyMgNC4gQ2FsY3VsYXRlIFNhbXBsZSBWYXJpYW5jZToNCg0KVmFyaWFuY2UgaXMgdGhlIHNxdWFyZSBvZiB0aGUgc3RhbmRhcmQgZGV2aWF0aW9uLiBXaGlsZSBSIGRvZXNuJ3QgaGF2ZSBhIGRpcmVjdCBmdW5jdGlvbiB0byBjYWxjdWxhdGUgc2FtcGxlIHZhcmlhbmNlLCB5b3UgY2FuIHNxdWFyZSB0aGUgcmVzdWx0IGZyb20gYHNkKClgIG9yIHVzZSB0aGUgYHZhcigpYCBmdW5jdGlvbi4NCg0KYGBge1J9DQojIENhbGN1bGF0ZSB0aGUgc2FtcGxlIHZhcmlhbmNlIHVzaW5nIHNkKCkgZnVuY3Rpb24NCnNhbXBsZV92YXJpYW5jZSA8LSBzZChzYW1wbGVfZGF0YSleMg0KcHJpbnQoc2FtcGxlX3ZhcmlhbmNlKQ0KDQojIEFsdGVybmF0aXZlbHksIHVzaW5nIHRoZSB2YXIoKSBmdW5jdGlvbg0Kc2FtcGxlX3ZhcmlhbmNlX2FsdCA8LSB2YXIoc2FtcGxlX2RhdGEpDQpwcmludChzYW1wbGVfdmFyaWFuY2VfYWx0KQ0KYGBgDQoNCiMjIyBGdWxsIEV4YW1wbGU6DQoNCkNvbWJpbmluZyBhbGwgdGhlIGFib3ZlIHN0ZXBzLCBoZXJlJ3MgYSBmdWxsIFIgc2NyaXB0Og0KDQpgYGB7Un0NCiMgQ3JlYXRlIGEgZGF0YXNldA0KZGF0YSA8LSBjKDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwKQ0KDQojIERyYXcgYSByYW5kb20gc2FtcGxlIG9mIHNpemUgNSBmcm9tIHRoZSBkYXRhc2V0DQpzYW1wbGVfZGF0YSA8LSBzYW1wbGUoZGF0YSwgc2l6ZSA9IDUpDQpwcmludChwYXN0ZSgiU2FtcGxlZCBEYXRhOiIsIHRvU3RyaW5nKHNhbXBsZV9kYXRhKSkpDQoNCiMgQ2FsY3VsYXRlIHRoZSBzYW1wbGUgYXZlcmFnZQ0Kc2FtcGxlX2F2ZXJhZ2UgPC0gbWVhbihzYW1wbGVfZGF0YSkNCnByaW50KHBhc3RlKCJTYW1wbGUgQXZlcmFnZToiLCBzYW1wbGVfYXZlcmFnZSkpDQoNCiMgQ2FsY3VsYXRlIHRoZSBzYW1wbGUgc3RhbmRhcmQgZGV2aWF0aW9uDQpzYW1wbGVfc2QgPC0gc2Qoc2FtcGxlX2RhdGEpDQpwcmludChwYXN0ZSgiU2FtcGxlIFN0YW5kYXJkIERldmlhdGlvbjoiLCBzYW1wbGVfc2QpKQ0KDQojIENhbGN1bGF0ZSB0aGUgc2FtcGxlIHZhcmlhbmNlDQpzYW1wbGVfdmFyaWFuY2UgPC0gdmFyKHNhbXBsZV9kYXRhKQ0KcHJpbnQocGFzdGUoIlNhbXBsZSBWYXJpYW5jZToiLCBzYW1wbGVfdmFyaWFuY2UpKQ0KYGBgDQoNCldoZW4geW91IHJ1biB0aGUgc2NyaXB0LCB5b3UnbGwgZ2V0IGRpZmZlcmVudCBzYW1wbGVkIGRhdGEgYW5kIHN0YXRpc3RpY3MgZWFjaCB0aW1lIGR1ZSB0byB0aGUgcmFuZG9tbmVzcyBpbnRyb2R1Y2VkIGJ5IHRoZSBgc2FtcGxlKClgIGZ1bmN0aW9uLg0KDQojIyBQcm9tcHQNCkV4cGxhaW4gaG93IGFuZCB3aHkgdG8gdXNlIHRoZSBgc2V0LnNlZWQoKWAgZnVuY3Rpb24gaW4gUiBhbmQgZ2l2ZSBhbiBleGFtcGxlIG9mIHVzZS4gDQoNCiMjIyBgc2V0LnNlZWQoKWAgaW4gUjoNCg0KVGhlIGBzZXQuc2VlZCgpYCBmdW5jdGlvbiBpbiBSIGlzIHVzZWQgdG8gc2V0IHRoZSBzdGFydGluZyBudW1iZXIgKHNlZWQpIGZvciB0aGUgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IgYWxnb3JpdGhtLiBUaGlzIGlzIHBhcnRpY3VsYXJseSB1c2VmdWwgd2hlbiB5b3Ugd2FudCB5b3VyIHJhbmRvbSBwcm9jZXNzZXMgdG8gYmUgcmVwcm9kdWNpYmxlLg0KDQojIyMgV2h5IHVzZSBgc2V0LnNlZWQoKWA/DQoNCjEuICoqUmVwcm9kdWNpYmlsaXR5Kio6IEluIGRhdGEgYW5hbHlzaXMgYW5kIHJlc2VhcmNoLCByZXByb2R1Y2liaWxpdHkgaXMgY3J1Y2lhbC4gSWYgeW91IHNoYXJlIHlvdXIgY29kZSB3aXRoIHNvbWVvbmUgZWxzZSBvciBydW4gdGhlIHNhbWUgY29kZSBhdCBhIGxhdGVyIHRpbWUsIHVzaW5nIGBzZXQuc2VlZCgpYCBlbnN1cmVzIHRoYXQgeW91IGdldCB0aGUgc2FtZSByZXN1bHRzLiBUaGlzIGlzIGVzcGVjaWFsbHkgaW1wb3J0YW50IHdoZW4geW91J3JlIHNhbXBsaW5nIGRhdGEsIHJhbmRvbWl6aW5nIGRhdGFzZXRzLCBvciBpbml0aWFsaXppbmcgcmFuZG9tIHdlaWdodHMgaW4gbWFjaGluZSBsZWFybmluZyBhbGdvcml0aG1zLg0KDQoyLiAqKkNvbnNpc3RlbmN5IGluIFJlc3VsdHMqKjogV2hlbiBkZWJ1Z2dpbmcgb3IgZmluZS10dW5pbmcgYWxnb3JpdGhtcywgaGF2aW5nIGNvbnNpc3RlbnQgcmVzdWx0cyBiZXR3ZWVuIHJ1bnMgY2FuIGhlbHAgaW4gdW5kZXJzdGFuZGluZyB0aGUgY2hhbmdlcyBvciBpbXBhY3RzIG9mIG1vZGlmaWNhdGlvbnMgbWFkZSB0byB0aGUgY29kZS4NCg0KMy4gKipTaGFyaW5nICYgQ29sbGFib3JhdGlvbioqOiBJZiB5b3UncmUgY29sbGFib3JhdGluZyBvbiBhIHByb2plY3QsIHVzaW5nIGBzZXQuc2VlZCgpYCBlbnN1cmVzIHRoYXQgYWxsIGNvbGxhYm9yYXRvcnMgd2lsbCBnZXQgdGhlIHNhbWUgcmVzdWx0cyB3aGVuIHRoZXkgcnVuIHRoZSBjb2RlLCBtYWtpbmcgZGlzY3Vzc2lvbnMgYW5kIHRyb3VibGVzaG9vdGluZyBtb3JlIHN0cmFpZ2h0Zm9yd2FyZC4NCg0KIyMjIEhvdyB0byB1c2UgYHNldC5zZWVkKClgOg0KDQpZb3Ugc2ltcGx5IGNhbGwgdGhlIGZ1bmN0aW9uIHdpdGggYW4gaW50ZWdlciBhcmd1bWVudCBiZWZvcmUgYW55IG9wZXJhdGlvbiB0aGF0IGludm9sdmVzIHJhbmRvbW5lc3MuDQoNCiMjIyBFeGFtcGxlOg0KDQpMZXQncyB1c2UgYHNldC5zZWVkKClgIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlIGBzYW1wbGUoKWAgZnVuY3Rpb246DQoNCmBgYHtSfQ0KIyBXaXRob3V0IHNldC5zZWVkKCkNCnByaW50KHNhbXBsZSgxOjEwLCA1KSkgICMgVGhpcyB3aWxsIHByb2R1Y2UgZGlmZmVyZW50IHJlc3VsdHMgZWFjaCB0aW1lIHlvdSBydW4gaXQNCg0KIyBXaXRoIHNldC5zZWVkKCkNCnNldC5zZWVkKDEyMykgICMgU2V0dGluZyB0aGUgc2VlZA0KcHJpbnQoc2FtcGxlKDE6MTAsIDUpKSAgIyBUaGlzIHdpbGwgcHJvZHVjZSB0aGUgc2FtZSByZXN1bHRzIGV2ZXJ5IHRpbWUgeW91IHJ1biBpdCBhZnRlciBzZXR0aW5nIHRoZSBzZWVkDQpgYGANCg0KSW4gdGhlIGFib3ZlIGV4YW1wbGUsIHRoZSBmaXJzdCBgc2FtcGxlKClgIGNhbGwgd2l0aG91dCBgc2V0LnNlZWQoKWAgd2lsbCBnaXZlIGRpZmZlcmVudCByZXN1bHRzIGV2ZXJ5IHRpbWUgeW91IHJ1biB0aGUgY29kZS4gSG93ZXZlciwgYWZ0ZXIgc2V0dGluZyB0aGUgc2VlZCB3aXRoIGBzZXQuc2VlZCgxMjMpYCwgdGhlIHNlY29uZCBgc2FtcGxlKClgIGNhbGwgd2lsbCBhbHdheXMgcHJvZHVjZSB0aGUgc2FtZSBzZXQgb2YgbnVtYmVycywgZW5zdXJpbmcgcmVwcm9kdWNpYmlsaXR5Lg==