1. Descriptive Statistics: Measures of Central Tendency

Measures of central tendency summarize a dataset by identifying the center of the data distribution.

a. Mean

The mean, or arithmetic average, is one of the most common measures of central tendency. It is calculated by summing all data points and dividing by the total number of points. The formula is: \[ \text{Mean} = \frac{\sum X}{n} \] where \(X\) represents individual data points, and \(n\) is the total number of data points.

Advantages:

  • Easy to calculate and understand.

  • Uses all data points, giving a comprehensive view of the dataset.

Disadvantages:

  • Highly sensitive to outliers.

  • Extreme values can skew the mean significantly.

Applications:

  • Commonly used in fields like economics, engineering, and education to provide an average value, e.g., calculating the average income in a region.

Example:

# Sample data
data <- c(5, 8, 10, 6, 7, 8, 9)

# Calculate mean
mean_value <- mean(data)
mean_value  # Output: 7.571429
[1] 7.571429

b. Median

The median is the middle value in a sorted dataset. If the dataset has an odd number of values, the median is the center value. For an even number of values, the median is the average of the two middle numbers.

Advantages:

  • Less affected by outliers compared to the mean.

  • Provides a better central value for skewed distributions.

Disadvantages:

  • Doesn’t use all data points, which can result in less precision.

Applications:

  • Often used in income data to give a more accurate picture of central tendency in skewed distributions.

Example:

# Calculate median
median_value <- median(data)
median_value  # Output: 8
[1] 8

c. Mode

The mode is the most frequently occurring value in a dataset. A dataset may have one mode (unimodal), more than one mode (bimodal, multimodal), or no mode at all.

Advantages:

  • Useful for categorical data.

  • Can easily highlight the most common value in a dataset.

Disadvantages:

  • May not exist or may not be unique in a dataset with no repeated values.

Applications:

  • Commonly used in marketing to determine the most frequent consumer preferences.

R does not have a built-in function for mode, so we need to create one.

Example:

# Custom function to calculate mode
get_mode <- function(v) {
  uniq_v <- unique(v)
  uniq_v[which.max(tabulate(match(v, uniq_v)))]
}

# Calculate mode
mode_value <- get_mode(data)
mode_value  # Output: 8
[1] 8

2. Measures of Dispersion

These measures describe the spread or variability within a dataset.

a. Standard Deviation

The standard deviation measures the amount of variation in a dataset. It is the square root of the variance, and its formula is: \[ \text{Standard Deviation} = \sqrt{\frac{\sum (X - \text{Mean})^2}{n}} \]

Advantages:

  • Provides insight into how spread out the values are from the mean.

Disadvantages:

  • Can be difficult to interpret without context, especially for skewed distributions.

Applications:

  • Widely used in finance to measure market volatility.

Example:

# Calculate standard deviation
sd_value <- sd(data)
sd_value  # Output: 1.718249
[1] 1.718249

b. Variance

Variance is the average of the squared differences from the mean. It provides a squared measure of dispersion.

Advantages:

  • A comprehensive measure of variability.

Disadvantages:

  • Squaring can distort the perception of scale, making it hard to interpret compared to standard deviation.

Applications:

  • Used in various statistical models, including machine learning algorithms.

Example:

# Calculate variance
variance_value <- var(data)
variance_value  # Output: 2.952381
[1] 2.952381

c. Range

The range is the difference between the maximum and minimum values in the dataset.

Advantages:

  • Simple to calculate and understand.

Disadvantages:

  • Doesn’t account for distribution between the extremes.

Applications:

  • Used in quick assessments of variability, such as stock price analysis.

Example:

# Calculate range
range_value <- range(data)
range_value_diff <- diff(range_value)
range_value_diff  # Output: 5
[1] 5

3. Interquartile Range (IQR)

The Interquartile Range (IQR) measures the spread of the middle 50% of data points. It is calculated as the difference between the third quartile (Q3) 75th percentile and the first quartile (Q1) 25th percentile: \[ \text{IQR} = Q3 - Q1 \] The IQR is a robust measure of spread, particularly for skewed distributions, since it is not affected by outliers.

Advantages:

Disadvantages:

Applications:

Example:

# Calculate IQR
iqr_value <- IQR(data)
iqr_value  # Output: 2.5
[1] 2

4. Sampling Distribution

A sampling distribution refers to the probability distribution of a given statistic based on a random sample from a population. The sampling distribution of the sample mean, for example, describes the spread of sample means if many samples are drawn from the population.

Advantages:

Disadvantages:

Applications:

Example:

# Simulate a sampling distribution of the mean
set.seed(123)
sample_means <- replicate(1000, mean(sample(data, size = 5, replace = TRUE)))

# Plot the sampling distribution
hist(sample_means, main = "Sampling Distribution of the Mean", xlab = "Mean")

5. Probability Distributions

A probability distribution shows all possible values of a random variable and the probabilities associated with those values.

a. Normal Distribution

The Normal Distribution, also known as the Gaussian distribution, is characterized by a bell-shaped curve. Most values cluster around the mean, with symmetrical tails extending in both directions. The probability density function for a normal distribution is: \[ f(x) = \frac{1}{\sigma \sqrt{2\pi}} e^{-\frac{(x - \mu)^2}{2\sigma^2}} \] where \(\mu\) is the mean, and \(\sigma\) is the standard deviation.

Advantages:

  • Many real-world phenomena are normally distributed, making this distribution widely applicable.

Disadvantages:

  • Assumes data are symmetrically distributed, which may not always be the case.

Applications:

  • Used in hypothesis testing, quality control, and in finance for risk assessment.

Example:

# Generate a sample from a normal distribution
normal_data <- rnorm(1000, mean = 0, sd = 1)

# Plot the normal distribution
hist(normal_data, breaks = 30, probability = TRUE, main = "Normal Distribution")
curve(dnorm(x, mean = 0, sd = 1), add = TRUE, col = "red", lwd = 2)

b. Binomial Distribution

The Binomial Distribution represents the number of successes in a fixed number of independent trials, each with the same probability of success. Its probability mass function is: \[ P(X = k) = \binom{n}{k} p^k (1 - p)^{n - k} \] where \(n\) is the number of trials, \(k\) is the number of successes, and \(p\) is the probability of success.

Advantages:

  • Useful for modeling discrete events.

Disadvantages:

  • Assumes independent trials and constant probability, which may not always hold in practice.

Applications:

  • Used in quality control, genetics, and risk modeling.

Example:

# Generate a sample from a binomial distribution
binom_data <- rbinom(1000, size = 10, prob = 0.5)

# Plot the binomial distribution
hist(binom_data, breaks = 10, probability = TRUE, main = "Binomial Distribution")

Summary

These concepts are foundational in statistics and data analysis, helping us summarize and understand data effectively.

LS0tDQp0aXRsZTogIkRlc2NyaXB0aXZlIFN0YXRpY3RpY3MiDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KDQoNCiMjIyAxLiAqKkRlc2NyaXB0aXZlIFN0YXRpc3RpY3M6IE1lYXN1cmVzIG9mIENlbnRyYWwgVGVuZGVuY3kqKg0KTWVhc3VyZXMgb2YgY2VudHJhbCB0ZW5kZW5jeSBzdW1tYXJpemUgYSBkYXRhc2V0IGJ5IGlkZW50aWZ5aW5nIHRoZSBjZW50ZXIgb2YgdGhlIGRhdGEgZGlzdHJpYnV0aW9uLg0KDQojIyMjICoqYS4gTWVhbioqDQpUaGUgKiptZWFuKiosIG9yIGFyaXRobWV0aWMgYXZlcmFnZSwgaXMgb25lIG9mIHRoZSBtb3N0IGNvbW1vbiBtZWFzdXJlcyBvZiBjZW50cmFsIHRlbmRlbmN5LiBJdCBpcyBjYWxjdWxhdGVkIGJ5IHN1bW1pbmcgYWxsIGRhdGEgcG9pbnRzIGFuZCBkaXZpZGluZyBieSB0aGUgdG90YWwgbnVtYmVyIG9mIHBvaW50cy4gVGhlIGZvcm11bGEgaXM6DQpcWw0KXHRleHR7TWVhbn0gPSBcZnJhY3tcc3VtIFh9e259DQpcXQ0Kd2hlcmUgXChYXCkgcmVwcmVzZW50cyBpbmRpdmlkdWFsIGRhdGEgcG9pbnRzLCBhbmQgXChuXCkgaXMgdGhlIHRvdGFsIG51bWJlciBvZiBkYXRhIHBvaW50cy4NCg0KKipBZHZhbnRhZ2VzOioqDQoNCi0gRWFzeSB0byBjYWxjdWxhdGUgYW5kIHVuZGVyc3RhbmQuDQoNCi0gVXNlcyBhbGwgZGF0YSBwb2ludHMsIGdpdmluZyBhIGNvbXByZWhlbnNpdmUgdmlldyBvZiB0aGUgZGF0YXNldC4NCg0KKipEaXNhZHZhbnRhZ2VzOioqDQoNCi0gSGlnaGx5IHNlbnNpdGl2ZSB0byBvdXRsaWVycy4gDQoNCi0gRXh0cmVtZSB2YWx1ZXMgY2FuIHNrZXcgdGhlIG1lYW4gc2lnbmlmaWNhbnRseS4NCiAgDQoqKkFwcGxpY2F0aW9uczoqKg0KDQotIENvbW1vbmx5IHVzZWQgaW4gZmllbGRzIGxpa2UgZWNvbm9taWNzLCBlbmdpbmVlcmluZywgYW5kIGVkdWNhdGlvbiB0byBwcm92aWRlIGFuIGF2ZXJhZ2UgdmFsdWUsIGUuZy4sIGNhbGN1bGF0aW5nIHRoZSBhdmVyYWdlIGluY29tZSBpbiBhIHJlZ2lvbi4NCg0KKipFeGFtcGxlOioqDQoNCmBgYHtyfQ0KIyBTYW1wbGUgZGF0YQ0KZGF0YSA8LSBjKDUsIDgsIDEwLCA2LCA3LCA4LCA5KQ0KDQojIENhbGN1bGF0ZSBtZWFuDQptZWFuX3ZhbHVlIDwtIG1lYW4oZGF0YSkNCm1lYW5fdmFsdWUgICMgT3V0cHV0OiA3LjU3MTQyOQ0KYGBgDQoNCg0KIyMjIyAqKmIuIE1lZGlhbioqDQpUaGUgKiptZWRpYW4qKiBpcyB0aGUgbWlkZGxlIHZhbHVlIGluIGEgc29ydGVkIGRhdGFzZXQuIElmIHRoZSBkYXRhc2V0IGhhcyBhbiBvZGQgbnVtYmVyIG9mIHZhbHVlcywgdGhlIG1lZGlhbiBpcyB0aGUgY2VudGVyIHZhbHVlLiBGb3IgYW4gZXZlbiBudW1iZXIgb2YgdmFsdWVzLCB0aGUgbWVkaWFuIGlzIHRoZSBhdmVyYWdlIG9mIHRoZSB0d28gbWlkZGxlIG51bWJlcnMuDQoNCioqQWR2YW50YWdlczoqKg0KDQotIExlc3MgYWZmZWN0ZWQgYnkgb3V0bGllcnMgY29tcGFyZWQgdG8gdGhlIG1lYW4uDQoNCi0gUHJvdmlkZXMgYSBiZXR0ZXIgY2VudHJhbCB2YWx1ZSBmb3Igc2tld2VkIGRpc3RyaWJ1dGlvbnMuDQoNCioqRGlzYWR2YW50YWdlczoqKg0KDQotIERvZXNu4oCZdCB1c2UgYWxsIGRhdGEgcG9pbnRzLCB3aGljaCBjYW4gcmVzdWx0IGluIGxlc3MgcHJlY2lzaW9uLg0KICANCioqQXBwbGljYXRpb25zOioqDQoNCi0gT2Z0ZW4gdXNlZCBpbiBpbmNvbWUgZGF0YSB0byBnaXZlIGEgbW9yZSBhY2N1cmF0ZSBwaWN0dXJlIG9mIGNlbnRyYWwgdGVuZGVuY3kgaW4gc2tld2VkIGRpc3RyaWJ1dGlvbnMuDQoNCioqRXhhbXBsZToqKg0KDQpgYGB7cn0NCiMgQ2FsY3VsYXRlIG1lZGlhbg0KbWVkaWFuX3ZhbHVlIDwtIG1lZGlhbihkYXRhKQ0KbWVkaWFuX3ZhbHVlICAjIE91dHB1dDogOA0KYGBgDQoNCg0KIyMjIyAqKmMuIE1vZGUqKg0KVGhlICoqbW9kZSoqIGlzIHRoZSBtb3N0IGZyZXF1ZW50bHkgb2NjdXJyaW5nIHZhbHVlIGluIGEgZGF0YXNldC4gQSBkYXRhc2V0IG1heSBoYXZlIG9uZSBtb2RlICh1bmltb2RhbCksIG1vcmUgdGhhbiBvbmUgbW9kZSAoYmltb2RhbCwgbXVsdGltb2RhbCksIG9yIG5vIG1vZGUgYXQgYWxsLg0KDQoqKkFkdmFudGFnZXM6KioNCg0KLSBVc2VmdWwgZm9yIGNhdGVnb3JpY2FsIGRhdGEuDQoNCi0gQ2FuIGVhc2lseSBoaWdobGlnaHQgdGhlIG1vc3QgY29tbW9uIHZhbHVlIGluIGEgZGF0YXNldC4NCg0KKipEaXNhZHZhbnRhZ2VzOioqDQoNCi0gTWF5IG5vdCBleGlzdCBvciBtYXkgbm90IGJlIHVuaXF1ZSBpbiBhIGRhdGFzZXQgd2l0aCBubyByZXBlYXRlZCB2YWx1ZXMuDQogIA0KKipBcHBsaWNhdGlvbnM6KioNCg0KLSBDb21tb25seSB1c2VkIGluIG1hcmtldGluZyB0byBkZXRlcm1pbmUgdGhlIG1vc3QgZnJlcXVlbnQgY29uc3VtZXIgcHJlZmVyZW5jZXMuDQoNClIgZG9lcyBub3QgaGF2ZSBhIGJ1aWx0LWluIGZ1bmN0aW9uIGZvciBtb2RlLCBzbyB3ZSBuZWVkIHRvIGNyZWF0ZSBvbmUuDQoNCioqRXhhbXBsZToqKg0KDQpgYGB7cn0NCiMgQ3VzdG9tIGZ1bmN0aW9uIHRvIGNhbGN1bGF0ZSBtb2RlDQpnZXRfbW9kZSA8LSBmdW5jdGlvbih2KSB7DQogIHVuaXFfdiA8LSB1bmlxdWUodikNCiAgdW5pcV92W3doaWNoLm1heCh0YWJ1bGF0ZShtYXRjaCh2LCB1bmlxX3YpKSldDQp9DQoNCiMgQ2FsY3VsYXRlIG1vZGUNCm1vZGVfdmFsdWUgPC0gZ2V0X21vZGUoZGF0YSkNCm1vZGVfdmFsdWUgICMgT3V0cHV0OiA4DQpgYGANCg0KDQojIyMgMi4gKipNZWFzdXJlcyBvZiBEaXNwZXJzaW9uKioNClRoZXNlIG1lYXN1cmVzIGRlc2NyaWJlIHRoZSBzcHJlYWQgb3IgdmFyaWFiaWxpdHkgd2l0aGluIGEgZGF0YXNldC4NCg0KIyMjIyAqKmEuIFN0YW5kYXJkIERldmlhdGlvbioqDQpUaGUgKipzdGFuZGFyZCBkZXZpYXRpb24qKiBtZWFzdXJlcyB0aGUgYW1vdW50IG9mIHZhcmlhdGlvbiBpbiBhIGRhdGFzZXQuIEl0IGlzIHRoZSBzcXVhcmUgcm9vdCBvZiB0aGUgdmFyaWFuY2UsIGFuZCBpdHMgZm9ybXVsYSBpczoNClxbDQpcdGV4dHtTdGFuZGFyZCBEZXZpYXRpb259ID0gXHNxcnR7XGZyYWN7XHN1bSAoWCAtIFx0ZXh0e01lYW59KV4yfXtufX0NClxdDQoNCioqQWR2YW50YWdlczoqKg0KDQotIFByb3ZpZGVzIGluc2lnaHQgaW50byBob3cgc3ByZWFkIG91dCB0aGUgdmFsdWVzIGFyZSBmcm9tIHRoZSBtZWFuLg0KDQoqKkRpc2FkdmFudGFnZXM6KioNCg0KLSBDYW4gYmUgZGlmZmljdWx0IHRvIGludGVycHJldCB3aXRob3V0IGNvbnRleHQsIGVzcGVjaWFsbHkgZm9yIHNrZXdlZCBkaXN0cmlidXRpb25zLg0KDQoqKkFwcGxpY2F0aW9uczoqKg0KDQotIFdpZGVseSB1c2VkIGluIGZpbmFuY2UgdG8gbWVhc3VyZSBtYXJrZXQgdm9sYXRpbGl0eS4NCg0KKipFeGFtcGxlOioqDQoNCmBgYHtyfQ0KIyBDYWxjdWxhdGUgc3RhbmRhcmQgZGV2aWF0aW9uDQpzZF92YWx1ZSA8LSBzZChkYXRhKQ0Kc2RfdmFsdWUgICMgT3V0cHV0OiAxLjcxODI0OQ0KYGBgDQoNCg0KIyMjIyAqKmIuIFZhcmlhbmNlKioNCioqVmFyaWFuY2UqKiBpcyB0aGUgYXZlcmFnZSBvZiB0aGUgc3F1YXJlZCBkaWZmZXJlbmNlcyBmcm9tIHRoZSBtZWFuLiBJdCBwcm92aWRlcyBhIHNxdWFyZWQgbWVhc3VyZSBvZiBkaXNwZXJzaW9uLg0KDQoqKkFkdmFudGFnZXM6KioNCg0KLSBBIGNvbXByZWhlbnNpdmUgbWVhc3VyZSBvZiB2YXJpYWJpbGl0eS4NCg0KKipEaXNhZHZhbnRhZ2VzOioqDQoNCi0gU3F1YXJpbmcgY2FuIGRpc3RvcnQgdGhlIHBlcmNlcHRpb24gb2Ygc2NhbGUsIG1ha2luZyBpdCBoYXJkIHRvIGludGVycHJldCBjb21wYXJlZCB0byBzdGFuZGFyZCBkZXZpYXRpb24uDQoNCioqQXBwbGljYXRpb25zOioqDQoNCi0gVXNlZCBpbiB2YXJpb3VzIHN0YXRpc3RpY2FsIG1vZGVscywgaW5jbHVkaW5nIG1hY2hpbmUgbGVhcm5pbmcgYWxnb3JpdGhtcy4NCg0KKipFeGFtcGxlOioqDQoNCmBgYHtyfQ0KIyBDYWxjdWxhdGUgdmFyaWFuY2UNCnZhcmlhbmNlX3ZhbHVlIDwtIHZhcihkYXRhKQ0KdmFyaWFuY2VfdmFsdWUgICMgT3V0cHV0OiAyLjk1MjM4MQ0KYGBgDQoNCg0KIyMjIyAqKmMuIFJhbmdlKioNClRoZSAqKnJhbmdlKiogaXMgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgbWF4aW11bSBhbmQgbWluaW11bSB2YWx1ZXMgaW4gdGhlIGRhdGFzZXQuDQoNCioqQWR2YW50YWdlczoqKg0KDQotIFNpbXBsZSB0byBjYWxjdWxhdGUgYW5kIHVuZGVyc3RhbmQuDQoNCioqRGlzYWR2YW50YWdlczoqKg0KDQotIERvZXNu4oCZdCBhY2NvdW50IGZvciBkaXN0cmlidXRpb24gYmV0d2VlbiB0aGUgZXh0cmVtZXMuDQogIA0KKipBcHBsaWNhdGlvbnM6KioNCg0KLSBVc2VkIGluIHF1aWNrIGFzc2Vzc21lbnRzIG9mIHZhcmlhYmlsaXR5LCBzdWNoIGFzIHN0b2NrIHByaWNlIGFuYWx5c2lzLg0KDQoqKkV4YW1wbGU6KioNCg0KYGBge3J9DQojIENhbGN1bGF0ZSByYW5nZQ0KcmFuZ2VfdmFsdWUgPC0gcmFuZ2UoZGF0YSkNCnJhbmdlX3ZhbHVlX2RpZmYgPC0gZGlmZihyYW5nZV92YWx1ZSkNCnJhbmdlX3ZhbHVlX2RpZmYgICMgT3V0cHV0OiA1DQpgYGANCg0KDQojIyMgMy4gKipJbnRlcnF1YXJ0aWxlIFJhbmdlIChJUVIpKioNCg0KVGhlICoqSW50ZXJxdWFydGlsZSBSYW5nZSAoSVFSKSoqIG1lYXN1cmVzIHRoZSBzcHJlYWQgb2YgdGhlIG1pZGRsZSA1MCUgb2YgZGF0YSBwb2ludHMuIEl0IGlzIGNhbGN1bGF0ZWQgYXMgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgdGhpcmQgcXVhcnRpbGUgKFEzKSA3NXRoIHBlcmNlbnRpbGUgYW5kIHRoZSBmaXJzdCBxdWFydGlsZSAoUTEpIDI1dGggcGVyY2VudGlsZToNClxbDQpcdGV4dHtJUVJ9ID0gUTMgLSBRMQ0KXF0NClRoZSBJUVIgaXMgYSByb2J1c3QgbWVhc3VyZSBvZiBzcHJlYWQsIHBhcnRpY3VsYXJseSBmb3Igc2tld2VkIGRpc3RyaWJ1dGlvbnMsIHNpbmNlIGl0IGlzIG5vdCBhZmZlY3RlZCBieSBvdXRsaWVycy4NCg0KKipBZHZhbnRhZ2VzOioqDQoNCi0gUmVzaXN0YW50IHRvIG91dGxpZXJzLCBtYWtpbmcgaXQgaWRlYWwgZm9yIHNrZXdlZCBkYXRhc2V0cy4NCg0KKipEaXNhZHZhbnRhZ2VzOioqDQoNCi0gSWdub3JlcyBleHRyZW1lIHZhbHVlcywgd2hpY2ggbWlnaHQgYmUgaW1wb3J0YW50IGluIHNvbWUgYW5hbHlzZXMuDQoNCioqQXBwbGljYXRpb25zOioqDQoNCi0gQ29tbW9ubHkgdXNlZCBpbiBib3ggcGxvdHMgdG8gaGlnaGxpZ2h0IGRhdGEgZGlzcGVyc2lvbiBhbmQgZGV0ZWN0IG91dGxpZXJzIGluIGZpZWxkcyBsaWtlIGRhdGEgc2NpZW5jZSBhbmQgZWNvbm9taWNzLg0KDQoqKkV4YW1wbGU6KioNCg0KYGBge3J9DQojIENhbGN1bGF0ZSBJUVINCmlxcl92YWx1ZSA8LSBJUVIoZGF0YSkNCmlxcl92YWx1ZSAgIyBPdXRwdXQ6IDINCmBgYA0KDQoNCiMjIyA0LiAqKlNhbXBsaW5nIERpc3RyaWJ1dGlvbioqDQpBICoqc2FtcGxpbmcgZGlzdHJpYnV0aW9uKiogcmVmZXJzIHRvIHRoZSBwcm9iYWJpbGl0eSBkaXN0cmlidXRpb24gb2YgYSBnaXZlbiBzdGF0aXN0aWMgYmFzZWQgb24gYSByYW5kb20gc2FtcGxlIGZyb20gYSBwb3B1bGF0aW9uLiBUaGUgc2FtcGxpbmcgZGlzdHJpYnV0aW9uIG9mIHRoZSBzYW1wbGUgbWVhbiwgZm9yIGV4YW1wbGUsIGRlc2NyaWJlcyB0aGUgc3ByZWFkIG9mIHNhbXBsZSBtZWFucyBpZiBtYW55IHNhbXBsZXMgYXJlIGRyYXduIGZyb20gdGhlIHBvcHVsYXRpb24uDQoNCioqQWR2YW50YWdlczoqKg0KDQotIEFsbG93cyBmb3IgaW5mZXJlbmNlcyBhYm91dCBwb3B1bGF0aW9uIHBhcmFtZXRlcnMuDQogIA0KKipEaXNhZHZhbnRhZ2VzOioqDQoNCi0gUmVxdWlyZXMgYSBsYXJnZSBudW1iZXIgb2Ygc2FtcGxlcyB0byBiZSBlZmZlY3RpdmUuDQoNCioqQXBwbGljYXRpb25zOioqDQoNCi0gRnVuZGFtZW50YWwgaW4gaW5mZXJlbnRpYWwgc3RhdGlzdGljcywgZW5hYmxpbmcgaHlwb3RoZXNpcyB0ZXN0aW5nIGFuZCBjb25maWRlbmNlIGludGVydmFscy4NCg0KDQoqKkV4YW1wbGU6KioNCg0KYGBge3J9DQojIFNpbXVsYXRlIGEgc2FtcGxpbmcgZGlzdHJpYnV0aW9uIG9mIHRoZSBtZWFuDQpzZXQuc2VlZCgxMjMpDQpzYW1wbGVfbWVhbnMgPC0gcmVwbGljYXRlKDEwMDAsIG1lYW4oc2FtcGxlKGRhdGEsIHNpemUgPSA1LCByZXBsYWNlID0gVFJVRSkpKQ0KDQojIFBsb3QgdGhlIHNhbXBsaW5nIGRpc3RyaWJ1dGlvbg0KaGlzdChzYW1wbGVfbWVhbnMsIG1haW4gPSAiU2FtcGxpbmcgRGlzdHJpYnV0aW9uIG9mIHRoZSBNZWFuIiwgeGxhYiA9ICJNZWFuIikNCmBgYA0KDQoNCiMjIyA1LiAqKlByb2JhYmlsaXR5IERpc3RyaWJ1dGlvbnMqKg0KQSBwcm9iYWJpbGl0eSBkaXN0cmlidXRpb24gc2hvd3MgYWxsIHBvc3NpYmxlIHZhbHVlcyBvZiBhIHJhbmRvbSB2YXJpYWJsZSBhbmQgdGhlIHByb2JhYmlsaXRpZXMgYXNzb2NpYXRlZCB3aXRoIHRob3NlIHZhbHVlcy4NCg0KIyMjIyAqKmEuIE5vcm1hbCBEaXN0cmlidXRpb24qKg0KVGhlICoqTm9ybWFsIERpc3RyaWJ1dGlvbioqLCBhbHNvIGtub3duIGFzIHRoZSBHYXVzc2lhbiBkaXN0cmlidXRpb24sIGlzIGNoYXJhY3Rlcml6ZWQgYnkgYSBiZWxsLXNoYXBlZCBjdXJ2ZS4gTW9zdCB2YWx1ZXMgY2x1c3RlciBhcm91bmQgdGhlIG1lYW4sIHdpdGggc3ltbWV0cmljYWwgdGFpbHMgZXh0ZW5kaW5nIGluIGJvdGggZGlyZWN0aW9ucy4gVGhlIHByb2JhYmlsaXR5IGRlbnNpdHkgZnVuY3Rpb24gZm9yIGEgbm9ybWFsIGRpc3RyaWJ1dGlvbiBpczoNClxbDQpmKHgpID0gXGZyYWN7MX17XHNpZ21hIFxzcXJ0ezJccGl9fSBlXnstXGZyYWN7KHggLSBcbXUpXjJ9ezJcc2lnbWFeMn19DQpcXQ0Kd2hlcmUgXChcbXVcKSBpcyB0aGUgbWVhbiwgYW5kIFwoXHNpZ21hXCkgaXMgdGhlIHN0YW5kYXJkIGRldmlhdGlvbi4NCg0KKipBZHZhbnRhZ2VzOioqDQoNCi0gTWFueSByZWFsLXdvcmxkIHBoZW5vbWVuYSBhcmUgbm9ybWFsbHkgZGlzdHJpYnV0ZWQsIG1ha2luZyB0aGlzIGRpc3RyaWJ1dGlvbiB3aWRlbHkgYXBwbGljYWJsZS4NCg0KKipEaXNhZHZhbnRhZ2VzOioqDQoNCi0gQXNzdW1lcyBkYXRhIGFyZSBzeW1tZXRyaWNhbGx5IGRpc3RyaWJ1dGVkLCB3aGljaCBtYXkgbm90IGFsd2F5cyBiZSB0aGUgY2FzZS4NCg0KKipBcHBsaWNhdGlvbnM6KioNCg0KLSBVc2VkIGluIGh5cG90aGVzaXMgdGVzdGluZywgcXVhbGl0eSBjb250cm9sLCBhbmQgaW4gZmluYW5jZSBmb3IgcmlzayBhc3Nlc3NtZW50Lg0KDQoqKkV4YW1wbGU6KioNCg0KYGBge3J9DQojIEdlbmVyYXRlIGEgc2FtcGxlIGZyb20gYSBub3JtYWwgZGlzdHJpYnV0aW9uDQpub3JtYWxfZGF0YSA8LSBybm9ybSgxMDAwLCBtZWFuID0gMCwgc2QgPSAxKQ0KDQojIFBsb3QgdGhlIG5vcm1hbCBkaXN0cmlidXRpb24NCmhpc3Qobm9ybWFsX2RhdGEsIGJyZWFrcyA9IDMwLCBwcm9iYWJpbGl0eSA9IFRSVUUsIG1haW4gPSAiTm9ybWFsIERpc3RyaWJ1dGlvbiIpDQpjdXJ2ZShkbm9ybSh4LCBtZWFuID0gMCwgc2QgPSAxKSwgYWRkID0gVFJVRSwgY29sID0gInJlZCIsIGx3ZCA9IDIpDQpgYGANCg0KDQojIyMjICoqYi4gQmlub21pYWwgRGlzdHJpYnV0aW9uKioNClRoZSAqKkJpbm9taWFsIERpc3RyaWJ1dGlvbioqIHJlcHJlc2VudHMgdGhlIG51bWJlciBvZiBzdWNjZXNzZXMgaW4gYSBmaXhlZCBudW1iZXIgb2YgaW5kZXBlbmRlbnQgdHJpYWxzLCBlYWNoIHdpdGggdGhlIHNhbWUgcHJvYmFiaWxpdHkgb2Ygc3VjY2Vzcy4gSXRzIHByb2JhYmlsaXR5IG1hc3MgZnVuY3Rpb24gaXM6DQpcWw0KUChYID0gaykgPSBcYmlub217bn17a30gcF5rICgxIC0gcClee24gLSBrfQ0KXF0NCndoZXJlIFwoblwpIGlzIHRoZSBudW1iZXIgb2YgdHJpYWxzLCBcKGtcKSBpcyB0aGUgbnVtYmVyIG9mIHN1Y2Nlc3NlcywgYW5kIFwocFwpIGlzIHRoZSBwcm9iYWJpbGl0eSBvZiBzdWNjZXNzLg0KDQoqKkFkdmFudGFnZXM6KioNCg0KLSBVc2VmdWwgZm9yIG1vZGVsaW5nIGRpc2NyZXRlIGV2ZW50cy4NCg0KKipEaXNhZHZhbnRhZ2VzOioqDQoNCi0gQXNzdW1lcyBpbmRlcGVuZGVudCB0cmlhbHMgYW5kIGNvbnN0YW50IHByb2JhYmlsaXR5LCB3aGljaCBtYXkgbm90IGFsd2F5cyBob2xkIGluIHByYWN0aWNlLg0KDQoqKkFwcGxpY2F0aW9uczoqKg0KDQotIFVzZWQgaW4gcXVhbGl0eSBjb250cm9sLCBnZW5ldGljcywgYW5kIHJpc2sgbW9kZWxpbmcuDQoNCg0KKipFeGFtcGxlOioqDQoNCmBgYHtyfQ0KIyBHZW5lcmF0ZSBhIHNhbXBsZSBmcm9tIGEgYmlub21pYWwgZGlzdHJpYnV0aW9uDQpiaW5vbV9kYXRhIDwtIHJiaW5vbSgxMDAwLCBzaXplID0gMTAsIHByb2IgPSAwLjUpDQoNCiMgUGxvdCB0aGUgYmlub21pYWwgZGlzdHJpYnV0aW9uDQpoaXN0KGJpbm9tX2RhdGEsIGJyZWFrcyA9IDEwLCBwcm9iYWJpbGl0eSA9IFRSVUUsIG1haW4gPSAiQmlub21pYWwgRGlzdHJpYnV0aW9uIikNCmBgYA0KDQoNCiMjIyBTdW1tYXJ5DQoNCi0gKipNZWFuLCBNZWRpYW4sIE1vZGUqKjogVGhlc2UgYXJlIG1lYXN1cmVzIG9mIGNlbnRyYWwgdGVuZGVuY3ksIHNob3dpbmcgdGhlICJjZW50ZXIiIG9mIHlvdXIgZGF0YS4NCg0KLSAqKlN0YW5kYXJkIERldmlhdGlvbiwgVmFyaWFuY2UsIFJhbmdlLCBJUVIqKjogVGhlc2UgYXJlIG1lYXN1cmVzIG9mIGRpc3BlcnNpb24sIHNob3dpbmcgaG93IHNwcmVhZCBvdXQgdGhlIGRhdGEgaXMuDQoNCi0gKipTYW1wbGluZyBEaXN0cmlidXRpb24qKjogU2hvd3MgdGhlIGRpc3RyaWJ1dGlvbiBvZiBhIHNhbXBsZSBzdGF0aXN0aWMgKGUuZy4sIHRoZSBtZWFuKSBhY3Jvc3MgbWFueSBzYW1wbGVzLg0KDQotICoqUHJvYmFiaWxpdHkgRGlzdHJpYnV0aW9ucyoqOiBEZXNjcmliZSB0aGUgbGlrZWxpaG9vZCBvZiBkaWZmZXJlbnQgb3V0Y29tZXM7IGV4YW1wbGVzIGluY2x1ZGUgdGhlIG5vcm1hbCBhbmQgYmlub21pYWwgZGlzdHJpYnV0aW9ucy4NCg0KVGhlc2UgY29uY2VwdHMgYXJlIGZvdW5kYXRpb25hbCBpbiBzdGF0aXN0aWNzIGFuZCBkYXRhIGFuYWx5c2lzLCBoZWxwaW5nIHVzIHN1bW1hcml6ZSBhbmQgdW5kZXJzdGFuZCBkYXRhIGVmZmVjdGl2ZWx5Lg==