1.Variance Recap

When beginning to work with a dataset, one of the first pieces of information you might want to investigate is the spread — is the data close together or far apart? One of the tools in our statistics toolbelt to do this is the descriptive statistic variance:

knitr::include_graphics("C:/Users/kuoan/Desktop/R Code/Standard1.png")

By finding the variance of a dataset, we can get a numeric representation of the spread of the data.

But what does that number really mean? How can we use this number to interpret the spread?

It turns out, using variance isn’t necessarily the best statistic to use to describe spread. Luckily, there is another statistic — standard deviation — that can be used instead.

In this lesson, we’ll be working with two datasets. The first dataset contains the heights (in inches) of a random selection of players from the NBA. The second dataset contains the heights (in inches) of a random selection of users on the dating platform OkCupid.

Introductions

1.Try to answer the following questions:

What does it mean for the OkCupid dataset to have a larger variance than the NBA dataset? What are the units of the mean? Is someone who is 80 inches tall taller than the average of either group? Which group(s)? In this example, the units of variance are inches squared. Can you interpret what it means for the variance of the NBA dataset to be 13.32 inches squared?

knitr::include_graphics("C:/Users/kuoan/Desktop/R Code/Standard2.png")

[1] “The mean of the NBA dataset is 77.984”

[1] “The mean of the OkCupid dataset is 68.414”

[1] “The variance of the NBA dataset is 13.323744”

[1] “The variance of the OkCupid dataset is 15.400604”

Because the OkCupid dataset has a larger variance than the NBA dataset, that means that NBA players are more similar in height to each other. The height of OkCupid users vary more.

Somebody who is 80 inches tall is above the average height of both datasets. We can directly compare 80 inches to the mean because they are in the same units (inches).

It’s a bit hard to wrap your head around how variance and mean are related since they are in different units.

2.Standard Deviation

Variance is a tricky statistic to use because its units are different from both the mean and the data itself. For example, the mean of our NBA dataset is 77.98 inches. Because of this, we can say someone who is 80 inches tall is about two inches taller than the average NBA player.

However, because the formula for variance includes squaring the difference between the data and the mean, the variance is measured in units squared. This means that the variance for our NBA dataset is 13.32 inches squared.

This result is hard to interpret in context with the mean or the data because their units are different. This is where the statistic standard deviation is useful.

Standard deviation is computed by taking the square root of the variance. sigma is the symbol commonly used for standard deviation. Conveniently, sigma squared is the symbol commonly used for variance:

knitr::include_graphics("C:/Users/kuoan/Desktop/R Code/Standard3.png")

In R, you can take the square root of a number using ^ 0.5 or sqrt(), up to you which one you prefer:

num <- 25
num_square_root <- num ^ 0.5

num_square_root
[1] 5

Instructions

1.We’ve written some code that calculates the variance of the NBA dataset and the OkCupid dataset.

The variances are stored in variables named nba_variance and okcupid_variance.

Calculate the standard deviation by taking the square root of nba_variance and store it in the variable nba_standard_deviation. Do the same for the variable okcupid_standard_deviation.

# Importing data and calculating variance
load("lesson_data.Rda")
錯誤發生在 readChar(con, 5L, useBytes = TRUE): 無法開啟連接
# Change these variables to be the standard deviation of each dataset.
nba_standard_deviation <- sqrt(nba_variance)
okcupid_standard_deviation <- sqrt(okcupid_variance)

#IGNORE CODE BELOW HERE
print(paste("The standard deviation of the NBA dataset is ",nba_standard_deviation))
print(paste("The standard deviation of the OkCupid dataset is ", okcupid_standard_deviation))

[1] “The standard deviation of the NBA dataset is 3.65017040698102”

[1] “The standard deviation of the OkCupid dataset is 3.92436033004106”

3.Standard Deviation in R

There is an R function dedicated to finding the standard deviation of a dataset — we can cut out the step of first finding the variance. The R function sd() takes a dataset as a parameter and returns the standard deviation of that dataset:

dataset <- c(4, 8, 15, 16, 23, 42)
standard_deviation <- sd(dataset)

standard_deviation 
[1] 13.49074

Instructions

1.We’ve removed the code that calculated the variance of each dataset. By using sd() we don’t need to take that middle step anymore.

Call sd() using nba_data as a parameter, and store the result in nba_standard_deviation.

Make a similar function call using okcupid_data and store the result in okcupid_standard_deviation.

# Change these variables to be the standard deviation of each dataset.
nba_standard_deviation <- sd(nba_data)
okcupid_standard_deviation <- sd(okcupid_data)

#IGNORE CODE BELOW HERE
print(paste("The standard deviation of the NBA dataset is ",nba_standard_deviation))
print(paste("The standard deviation of the OkCupid dataset is ", okcupid_standard_deviation))

[1] “The standard deviation of the NBA dataset is 3.65199686214009”

[1] “The standard deviation of the OkCupid dataset is 3.92632398306864”

4.Using Standard Deviation

Now that we’re able to compute the standard deviation of a dataset, what can we do with it?

Now that our units match, our measure of spread is easier to interpret. By finding the number of standard deviations a data point is away from the mean, we can begin to investigate how unusual that datapoint truly is. In fact, you can usually expect around 68% of your data to fall within one standard deviation of the mean, 95% of your data to fall within two standard deviations of the mean, and 99.7% of your data to fall within three standard deviations of the mean.

knitr::include_graphics("C:/Users/kuoan/Desktop/R Code/Standard4.png")

If you have a data point that is over three standard deviations away from the mean, that’s an incredibly unusual piece of data!

Instructions

1.Let’s find out how many standard deviations away from the mean NBA great Lebron James is. To begin, let’s find the difference between Lebron’s height (80 inches) and the mean of each dataset.

Set nba_difference equal to 80 minus nba_mean.

Find the difference between Lebron’s height and the OkCupid mean and store it in okcupid_difference. The OkCupid dataset’s mean is stored in okcupid_mean.

# Importing data and calculating variance
load("lesson_data.Rda")
variance <- function(x) mean((x-mean(x))^2)

nba_mean <- mean(nba_data)
okcupid_mean <- mean(okcupid_data)
nba_standard_deviation <- sd(nba_data)
okcupid_standard_deviation <- sd(okcupid_data)

#Step 1: Calcualte the difference between the player's height and the means
nba_difference <- 80 - nba_mean
okcupid_difference <- 80 - okcupid_mean

[1] 2.016

[1] 11.586

2.We now want to find out how many times the standard deviation goes into those differences.

Set num_nba_deviations equal to nba_difference divided by nba_standard_deviation.

Do a similar calculation for num_okcupid_deviations.

What does that first number tell you about how unusual Lebron James is in the NBA? What does the second number tell you about how unusual Lebron James is in the dating pool?


#Step 2: Use the difference between the point and the mean to find how many standard deviations the player is away from the mean.
num_nba_deviations <- nba_difference / nba_standard_deviation
錯誤: 找不到物件 'nba_difference'

[1] 2.016

[1] 11.586

[1] “Your basketball player is 0.552026761276738 standard deviations away from the mean of NBA player heights,”

[1] “Your basketball player is 2.95085175089013 standard deviations away from the mean of OkCupid profile heights”

3.Let’s check another NBA player. Earl Boykins is one of the smaller NBA players in history at 5’5” (65 inches). Replace Lebron James’ 80 inches with Earl Boykins’ 65.

What can you say about how unusual Earl Boykins is with respect to the two different datasets?

We were surprised that Boykins wasn’t more standard deviations away from the mean of the OkCupid dataset. Think about why he isn’t more of an outlier in this dataset.

#Step 1: Calcualte the difference between the player's height and the means
nba_difference <- 65 - nba_mean
okcupid_difference <- 65 - okcupid_mean

nba_difference
okcupid_difference

#Step 2: Use the difference between the point and the mean to find how many standard deviations the player is away from the mean.
num_nba_deviations <- nba_difference / nba_standard_deviation
num_okcupid_deviations <- okcupid_difference / okcupid_standard_deviation

num_nba_deviations
num_okcupid_deviations

#IGNORE CODE BELOW HERE
print(paste("Your basketball player is", num_nba_deviations,"standard deviations away from the mean of NBA player heights,"))
print(paste("Your basketball player is ",num_okcupid_deviations," standard deviations away from the mean of OkCupid profile heights"))

[1]nba_difference : -12.984

[1]okcupid_difference : -3.414

[1]num_nba_deviations : -3.555315

[1]num_okcupid_deviations : -0.8695156

[1] “Your basketball player is -3.5553152125085 standard deviations away from the mean of NBA player heights,”

[1] “Your basketball player is -0.869515611733031 standard deviations away from the mean of OkCupid profile heights”

5.Review

In the last exercise you saw that Lebron James was 0.55 standard deviations above the mean of NBA player heights. He’s taller than average, but compared to the other NBA players, he’s not absurdly tall.

However, compared to the OkCupid dating pool, he is extremely rare! He’s almost three full standard deviations above the mean. You’d expect only about 0.15% of people on OkCupid to be more than 3 standard deviations away from the mean.

This is the power of standard deviation. By taking the square root of the variance, the standard deviation gives you a statistic about spread that can be easily interpreted and compared to the mean.

Instructions

We’ve created a visualization that shows the mean, first, second, and third standard deviations of each dataset.

Compare your height (in inches) to the heights of NBA players and OkCupid daters.

You’re likely below the first standard deviation for the NBA. Are you below the second? How unusual is your height compared to the OkCupid members?

knitr::include_graphics("C:/Users/kuoan/Desktop/R Code/Standard5.png")

LS0tDQp0aXRsZTogIlN0YW5kYXJkIERldmlhdGlvbiBpbiBSIg0KYXV0aG9yOiAiQW5uYWJlbCBLdW8iDQpkYXRlOiAiYHIgZm9ybWF0KFN5cy50aW1lKCksICclWS0lbS0lZCAlSDolTScpYCINCm91dHB1dDogaHRtbF9ub3RlYm9vaw0KLS0tDQoNCiMgMS5WYXJpYW5jZSBSZWNhcA0KDQpXaGVuIGJlZ2lubmluZyB0byB3b3JrIHdpdGggYSBkYXRhc2V0LCBvbmUgb2YgdGhlIGZpcnN0IHBpZWNlcyBvZiBpbmZvcm1hdGlvbiB5b3UgbWlnaHQgd2FudCB0byBpbnZlc3RpZ2F0ZSBpcyB0aGUgc3ByZWFkIOKAlCBpcyB0aGUgZGF0YSBjbG9zZSB0b2dldGhlciBvciBmYXIgYXBhcnQ/IE9uZSBvZiB0aGUgdG9vbHMgaW4gb3VyIHN0YXRpc3RpY3MgdG9vbGJlbHQgdG8gZG8gdGhpcyBpcyB0aGUgZGVzY3JpcHRpdmUgc3RhdGlzdGljIHZhcmlhbmNlOg0KDQpgYGB7ciBTdGFuZGFyZDEsIG91dC53aWR0aD0iNjAlIn0NCmtuaXRyOjppbmNsdWRlX2dyYXBoaWNzKCJDOi9Vc2Vycy9rdW9hbi9EZXNrdG9wL1IgQ29kZS9TdGFuZGFyZDEucG5nIikNCmBgYA0KDQpCeSBmaW5kaW5nIHRoZSB2YXJpYW5jZSBvZiBhIGRhdGFzZXQsIHdlIGNhbiBnZXQgYSBudW1lcmljIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBzcHJlYWQgb2YgdGhlIGRhdGEuDQoNCkJ1dCB3aGF0IGRvZXMgdGhhdCBudW1iZXIgcmVhbGx5IG1lYW4/IEhvdyBjYW4gd2UgdXNlIHRoaXMgbnVtYmVyIHRvIGludGVycHJldCB0aGUgc3ByZWFkPw0KDQpJdCB0dXJucyBvdXQsIHVzaW5nIHZhcmlhbmNlIGlzbuKAmXQgbmVjZXNzYXJpbHkgdGhlIGJlc3Qgc3RhdGlzdGljIHRvIHVzZSB0byBkZXNjcmliZSBzcHJlYWQuIEx1Y2tpbHksIHRoZXJlIGlzIGFub3RoZXIgc3RhdGlzdGljIOKAlCBzdGFuZGFyZCBkZXZpYXRpb24g4oCUIHRoYXQgY2FuIGJlIHVzZWQgaW5zdGVhZC4NCg0KSW4gdGhpcyBsZXNzb24sIHdl4oCZbGwgYmUgd29ya2luZyB3aXRoIHR3byBkYXRhc2V0cy4gVGhlIGZpcnN0IGRhdGFzZXQgY29udGFpbnMgdGhlIGhlaWdodHMgKGluIGluY2hlcykgb2YgYSByYW5kb20gc2VsZWN0aW9uIG9mIHBsYXllcnMgZnJvbSB0aGUgTkJBLiBUaGUgc2Vjb25kIGRhdGFzZXQgY29udGFpbnMgdGhlIGhlaWdodHMgKGluIGluY2hlcykgb2YgYSByYW5kb20gc2VsZWN0aW9uIG9mIHVzZXJzIG9uIHRoZSBkYXRpbmcgcGxhdGZvcm0gT2tDdXBpZC4NCg0KIyMgSW50cm9kdWN0aW9ucw0KDQoxLlRyeSB0byBhbnN3ZXIgdGhlIGZvbGxvd2luZyBxdWVzdGlvbnM6DQoNCldoYXQgZG9lcyBpdCBtZWFuIGZvciB0aGUgT2tDdXBpZCBkYXRhc2V0IHRvIGhhdmUgYSBsYXJnZXIgdmFyaWFuY2UgdGhhbiB0aGUgTkJBIGRhdGFzZXQ/DQpXaGF0IGFyZSB0aGUgdW5pdHMgb2YgdGhlIG1lYW4/IElzIHNvbWVvbmUgd2hvIGlzIDgwIGluY2hlcyB0YWxsIHRhbGxlciB0aGFuIHRoZSBhdmVyYWdlIG9mIGVpdGhlciBncm91cD8gV2hpY2ggZ3JvdXAocyk/DQpJbiB0aGlzIGV4YW1wbGUsIHRoZSB1bml0cyBvZiB2YXJpYW5jZSBhcmUgaW5jaGVzIHNxdWFyZWQuIENhbiB5b3UgaW50ZXJwcmV0IHdoYXQgaXQgbWVhbnMgZm9yIHRoZSB2YXJpYW5jZSBvZiB0aGUgTkJBIGRhdGFzZXQgdG8gYmUgMTMuMzIgaW5jaGVzIHNxdWFyZWQ/DQoNCmBgYHtyIFN0YW5kYXJkMiwgb3V0LndpZHRoPSI2MCUifQ0Ka25pdHI6OmluY2x1ZGVfZ3JhcGhpY3MoIkM6L1VzZXJzL2t1b2FuL0Rlc2t0b3AvUiBDb2RlL1N0YW5kYXJkMi5wbmciKQ0KYGBgDQoNClsxXSAiVGhlIG1lYW4gb2YgdGhlIE5CQSBkYXRhc2V0IGlzICA3Ny45ODQiDQoNClsxXSAiVGhlIG1lYW4gb2YgdGhlIE9rQ3VwaWQgZGF0YXNldCBpcyAgNjguNDE0Ig0KDQpbMV0gIlRoZSB2YXJpYW5jZSBvZiB0aGUgTkJBIGRhdGFzZXQgaXMgIDEzLjMyMzc0NCINCg0KWzFdICJUaGUgdmFyaWFuY2Ugb2YgdGhlIE9rQ3VwaWQgZGF0YXNldCBpcyAgMTUuNDAwNjA0Ig0KDQpCZWNhdXNlIHRoZSBPa0N1cGlkIGRhdGFzZXQgaGFzIGEgbGFyZ2VyIHZhcmlhbmNlIHRoYW4gdGhlIE5CQSBkYXRhc2V0LCB0aGF0IG1lYW5zIHRoYXQgTkJBIHBsYXllcnMgYXJlIG1vcmUgc2ltaWxhciBpbiBoZWlnaHQgdG8gZWFjaCBvdGhlci4gVGhlIGhlaWdodCBvZiBPa0N1cGlkIHVzZXJzIHZhcnkgbW9yZS4NCg0KU29tZWJvZHkgd2hvIGlzIDgwIGluY2hlcyB0YWxsIGlzIGFib3ZlIHRoZSBhdmVyYWdlIGhlaWdodCBvZiBib3RoIGRhdGFzZXRzLiBXZSBjYW4gZGlyZWN0bHkgY29tcGFyZSA4MCBpbmNoZXMgdG8gdGhlIG1lYW4gYmVjYXVzZSB0aGV5IGFyZSBpbiB0aGUgc2FtZSB1bml0cyAoaW5jaGVzKS4NCg0KSXTigJlzIGEgYml0IGhhcmQgdG8gd3JhcCB5b3VyIGhlYWQgYXJvdW5kIGhvdyB2YXJpYW5jZSBhbmQgbWVhbiBhcmUgcmVsYXRlZCBzaW5jZSB0aGV5IGFyZSBpbiBkaWZmZXJlbnQgdW5pdHMuDQoNCg0KIyAyLlN0YW5kYXJkIERldmlhdGlvbg0KDQpWYXJpYW5jZSBpcyBhIHRyaWNreSBzdGF0aXN0aWMgdG8gdXNlIGJlY2F1c2UgaXRzIHVuaXRzIGFyZSBkaWZmZXJlbnQgZnJvbSBib3RoIHRoZSBtZWFuIGFuZCB0aGUgZGF0YSBpdHNlbGYuIEZvciBleGFtcGxlLCB0aGUgbWVhbiBvZiBvdXIgTkJBIGRhdGFzZXQgaXMgNzcuOTggaW5jaGVzLiBCZWNhdXNlIG9mIHRoaXMsIHdlIGNhbiBzYXkgc29tZW9uZSB3aG8gaXMgODAgaW5jaGVzIHRhbGwgaXMgYWJvdXQgdHdvIGluY2hlcyB0YWxsZXIgdGhhbiB0aGUgYXZlcmFnZSBOQkEgcGxheWVyLg0KDQpIb3dldmVyLCBiZWNhdXNlIHRoZSBmb3JtdWxhIGZvciB2YXJpYW5jZSBpbmNsdWRlcyBzcXVhcmluZyB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBkYXRhIGFuZCB0aGUgbWVhbiwgdGhlIHZhcmlhbmNlIGlzIG1lYXN1cmVkIGluIHVuaXRzIHNxdWFyZWQuIFRoaXMgbWVhbnMgdGhhdCB0aGUgdmFyaWFuY2UgZm9yIG91ciBOQkEgZGF0YXNldCBpcyAxMy4zMiBpbmNoZXMgc3F1YXJlZC4NCg0KVGhpcyByZXN1bHQgaXMgaGFyZCB0byBpbnRlcnByZXQgaW4gY29udGV4dCB3aXRoIHRoZSBtZWFuIG9yIHRoZSBkYXRhIGJlY2F1c2UgdGhlaXIgdW5pdHMgYXJlIGRpZmZlcmVudC4gVGhpcyBpcyB3aGVyZSB0aGUgc3RhdGlzdGljIHN0YW5kYXJkIGRldmlhdGlvbiBpcyB1c2VmdWwuDQoNClN0YW5kYXJkIGRldmlhdGlvbiBpcyBjb21wdXRlZCBieSB0YWtpbmcgdGhlIHNxdWFyZSByb290IG9mIHRoZSB2YXJpYW5jZS4gc2lnbWEgaXMgdGhlIHN5bWJvbCBjb21tb25seSB1c2VkIGZvciBzdGFuZGFyZCBkZXZpYXRpb24uIENvbnZlbmllbnRseSwgc2lnbWEgc3F1YXJlZCBpcyB0aGUgc3ltYm9sIGNvbW1vbmx5IHVzZWQgZm9yIHZhcmlhbmNlOg0KYGBge3IgU3RhbmRhcmQzLCBvdXQud2lkdGg9IjYwJSJ9DQprbml0cjo6aW5jbHVkZV9ncmFwaGljcygiQzovVXNlcnMva3VvYW4vRGVza3RvcC9SIENvZGUvU3RhbmRhcmQzLnBuZyIpDQpgYGANCg0KSW4gUiwgeW91IGNhbiB0YWtlIHRoZSBzcXVhcmUgcm9vdCBvZiBhIG51bWJlciB1c2luZyBeIDAuNSBvciBzcXJ0KCksIHVwIHRvIHlvdSB3aGljaCBvbmUgeW91IHByZWZlcjoNCg0KYGBge3J9DQpudW0gPC0gMjUNCm51bV9zcXVhcmVfcm9vdCA8LSBudW0gXiAwLjUNCg0KbnVtX3NxdWFyZV9yb290DQpgYGANCg0KIyMgSW5zdHJ1Y3Rpb25zDQoNCjEuV2XigJl2ZSB3cml0dGVuIHNvbWUgY29kZSB0aGF0IGNhbGN1bGF0ZXMgdGhlIHZhcmlhbmNlIG9mIHRoZSBOQkEgZGF0YXNldCBhbmQgdGhlIE9rQ3VwaWQgZGF0YXNldC4NCg0KVGhlIHZhcmlhbmNlcyBhcmUgc3RvcmVkIGluIHZhcmlhYmxlcyBuYW1lZCBuYmFfdmFyaWFuY2UgYW5kIG9rY3VwaWRfdmFyaWFuY2UuDQoNCkNhbGN1bGF0ZSB0aGUgc3RhbmRhcmQgZGV2aWF0aW9uIGJ5IHRha2luZyB0aGUgc3F1YXJlIHJvb3Qgb2YgbmJhX3ZhcmlhbmNlIGFuZCBzdG9yZSBpdCBpbiB0aGUgdmFyaWFibGUgbmJhX3N0YW5kYXJkX2RldmlhdGlvbi4gRG8gdGhlIHNhbWUgZm9yIHRoZSB2YXJpYWJsZSBva2N1cGlkX3N0YW5kYXJkX2RldmlhdGlvbi4NCmBgYHtyfQ0KIyBJbXBvcnRpbmcgZGF0YSBhbmQgY2FsY3VsYXRpbmcgdmFyaWFuY2UNCmxvYWQoImxlc3Nvbl9kYXRhLlJkYSIpDQp2YXJpYW5jZSA8LSBmdW5jdGlvbih4KSBtZWFuKCh4LW1lYW4oeCkpXjIpDQoNCm5iYV92YXJpYW5jZSA8LSB2YXJpYW5jZShuYmFfZGF0YSkNCm9rY3VwaWRfdmFyaWFuY2UgPC0gdmFyaWFuY2Uob2tjdXBpZF9kYXRhKQ0KYGBgDQpgYGB7cn0NCiMgQ2hhbmdlIHRoZXNlIHZhcmlhYmxlcyB0byBiZSB0aGUgc3RhbmRhcmQgZGV2aWF0aW9uIG9mIGVhY2ggZGF0YXNldC4NCm5iYV9zdGFuZGFyZF9kZXZpYXRpb24gPC0gc3FydChuYmFfdmFyaWFuY2UpDQpva2N1cGlkX3N0YW5kYXJkX2RldmlhdGlvbiA8LSBzcXJ0KG9rY3VwaWRfdmFyaWFuY2UpDQoNCiNJR05PUkUgQ09ERSBCRUxPVyBIRVJFDQpwcmludChwYXN0ZSgiVGhlIHN0YW5kYXJkIGRldmlhdGlvbiBvZiB0aGUgTkJBIGRhdGFzZXQgaXMgIixuYmFfc3RhbmRhcmRfZGV2aWF0aW9uKSkNCnByaW50KHBhc3RlKCJUaGUgc3RhbmRhcmQgZGV2aWF0aW9uIG9mIHRoZSBPa0N1cGlkIGRhdGFzZXQgaXMgIiwgb2tjdXBpZF9zdGFuZGFyZF9kZXZpYXRpb24pKQ0KYGBgDQpbMV0gIlRoZSBzdGFuZGFyZCBkZXZpYXRpb24gb2YgdGhlIE5CQSBkYXRhc2V0IGlzICAzLjY1MDE3MDQwNjk4MTAyIg0KDQpbMV0gIlRoZSBzdGFuZGFyZCBkZXZpYXRpb24gb2YgdGhlIE9rQ3VwaWQgZGF0YXNldCBpcyAgMy45MjQzNjAzMzAwNDEwNiINCg0KIyAzLlN0YW5kYXJkIERldmlhdGlvbiBpbiBSDQoNClRoZXJlIGlzIGFuIFIgZnVuY3Rpb24gZGVkaWNhdGVkIHRvIGZpbmRpbmcgdGhlIHN0YW5kYXJkIGRldmlhdGlvbiBvZiBhIGRhdGFzZXQg4oCUIHdlIGNhbiBjdXQgb3V0IHRoZSBzdGVwIG9mIGZpcnN0IGZpbmRpbmcgdGhlIHZhcmlhbmNlLiBUaGUgUiBmdW5jdGlvbiBzZCgpIHRha2VzIGEgZGF0YXNldCBhcyBhIHBhcmFtZXRlciBhbmQgcmV0dXJucyB0aGUgc3RhbmRhcmQgZGV2aWF0aW9uIG9mIHRoYXQgZGF0YXNldDoNCg0KYGBge3J9DQpkYXRhc2V0IDwtIGMoNCwgOCwgMTUsIDE2LCAyMywgNDIpDQpzdGFuZGFyZF9kZXZpYXRpb24gPC0gc2QoZGF0YXNldCkNCg0Kc3RhbmRhcmRfZGV2aWF0aW9uIA0KYGBgDQoNCiMjIEluc3RydWN0aW9ucw0KDQoxLldl4oCZdmUgcmVtb3ZlZCB0aGUgY29kZSB0aGF0IGNhbGN1bGF0ZWQgdGhlIHZhcmlhbmNlIG9mIGVhY2ggZGF0YXNldC4gQnkgdXNpbmcgc2QoKSB3ZSBkb27igJl0IG5lZWQgdG8gdGFrZSB0aGF0IG1pZGRsZSBzdGVwIGFueW1vcmUuDQoNCkNhbGwgc2QoKSB1c2luZyBuYmFfZGF0YSBhcyBhIHBhcmFtZXRlciwgYW5kIHN0b3JlIHRoZSByZXN1bHQgaW4gbmJhX3N0YW5kYXJkX2RldmlhdGlvbi4NCg0KTWFrZSBhIHNpbWlsYXIgZnVuY3Rpb24gY2FsbCB1c2luZyBva2N1cGlkX2RhdGEgYW5kIHN0b3JlIHRoZSByZXN1bHQgaW4gb2tjdXBpZF9zdGFuZGFyZF9kZXZpYXRpb24uDQpgYGB7cn0NCiMgQ2hhbmdlIHRoZXNlIHZhcmlhYmxlcyB0byBiZSB0aGUgc3RhbmRhcmQgZGV2aWF0aW9uIG9mIGVhY2ggZGF0YXNldC4NCm5iYV9zdGFuZGFyZF9kZXZpYXRpb24gPC0gc2QobmJhX2RhdGEpDQpva2N1cGlkX3N0YW5kYXJkX2RldmlhdGlvbiA8LSBzZChva2N1cGlkX2RhdGEpDQoNCiNJR05PUkUgQ09ERSBCRUxPVyBIRVJFDQpwcmludChwYXN0ZSgiVGhlIHN0YW5kYXJkIGRldmlhdGlvbiBvZiB0aGUgTkJBIGRhdGFzZXQgaXMgIixuYmFfc3RhbmRhcmRfZGV2aWF0aW9uKSkNCnByaW50KHBhc3RlKCJUaGUgc3RhbmRhcmQgZGV2aWF0aW9uIG9mIHRoZSBPa0N1cGlkIGRhdGFzZXQgaXMgIiwgb2tjdXBpZF9zdGFuZGFyZF9kZXZpYXRpb24pKQ0KYGBgDQoNClsxXSAiVGhlIHN0YW5kYXJkIGRldmlhdGlvbiBvZiB0aGUgTkJBIGRhdGFzZXQgaXMgIDMuNjUxOTk2ODYyMTQwMDkiDQoNClsxXSAiVGhlIHN0YW5kYXJkIGRldmlhdGlvbiBvZiB0aGUgT2tDdXBpZCBkYXRhc2V0IGlzICAzLjkyNjMyMzk4MzA2ODY0Ig0KDQojIDQuVXNpbmcgU3RhbmRhcmQgRGV2aWF0aW9uDQoNCk5vdyB0aGF0IHdl4oCZcmUgYWJsZSB0byBjb21wdXRlIHRoZSBzdGFuZGFyZCBkZXZpYXRpb24gb2YgYSBkYXRhc2V0LCB3aGF0IGNhbiB3ZSBkbyB3aXRoIGl0Pw0KDQpOb3cgdGhhdCBvdXIgdW5pdHMgbWF0Y2gsIG91ciBtZWFzdXJlIG9mIHNwcmVhZCBpcyBlYXNpZXIgdG8gaW50ZXJwcmV0LiBCeSBmaW5kaW5nIHRoZSBudW1iZXIgb2Ygc3RhbmRhcmQgZGV2aWF0aW9ucyBhIGRhdGEgcG9pbnQgaXMgYXdheSBmcm9tIHRoZSBtZWFuLCB3ZSBjYW4gYmVnaW4gdG8gaW52ZXN0aWdhdGUgaG93IHVudXN1YWwgdGhhdCBkYXRhcG9pbnQgdHJ1bHkgaXMuIEluIGZhY3QsIHlvdSBjYW4gdXN1YWxseSBleHBlY3QgYXJvdW5kIDY4JSBvZiB5b3VyIGRhdGEgdG8gZmFsbCB3aXRoaW4gb25lIHN0YW5kYXJkIGRldmlhdGlvbiBvZiB0aGUgbWVhbiwgOTUlIG9mIHlvdXIgZGF0YSB0byBmYWxsIHdpdGhpbiB0d28gc3RhbmRhcmQgZGV2aWF0aW9ucyBvZiB0aGUgbWVhbiwgYW5kIDk5LjclIG9mIHlvdXIgZGF0YSB0byBmYWxsIHdpdGhpbiB0aHJlZSBzdGFuZGFyZCBkZXZpYXRpb25zIG9mIHRoZSBtZWFuLg0KDQpgYGB7ciBTdGFuZGFyZDQsIG91dC53aWR0aD0iNjAlIn0NCmtuaXRyOjppbmNsdWRlX2dyYXBoaWNzKCJDOi9Vc2Vycy9rdW9hbi9EZXNrdG9wL1IgQ29kZS9TdGFuZGFyZDQucG5nIikNCmBgYA0KSWYgeW91IGhhdmUgYSBkYXRhIHBvaW50IHRoYXQgaXMgb3ZlciB0aHJlZSBzdGFuZGFyZCBkZXZpYXRpb25zIGF3YXkgZnJvbSB0aGUgbWVhbiwgdGhhdCdzIGFuIGluY3JlZGlibHkgdW51c3VhbCBwaWVjZSBvZiBkYXRhIQ0KDQojIyBJbnN0cnVjdGlvbnMNCg0KMS5MZXTigJlzIGZpbmQgb3V0IGhvdyBtYW55IHN0YW5kYXJkIGRldmlhdGlvbnMgYXdheSBmcm9tIHRoZSBtZWFuIE5CQSBncmVhdCBMZWJyb24gSmFtZXMgaXMuIFRvIGJlZ2luLCBsZXTigJlzIGZpbmQgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBMZWJyb27igJlzIGhlaWdodCAoODAgaW5jaGVzKSBhbmQgdGhlIG1lYW4gb2YgZWFjaCBkYXRhc2V0Lg0KDQpTZXQgbmJhX2RpZmZlcmVuY2UgZXF1YWwgdG8gODAgbWludXMgbmJhX21lYW4uDQoNCkZpbmQgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBMZWJyb27igJlzIGhlaWdodCBhbmQgdGhlIE9rQ3VwaWQgbWVhbiBhbmQgc3RvcmUgaXQgaW4gb2tjdXBpZF9kaWZmZXJlbmNlLiBUaGUgT2tDdXBpZCBkYXRhc2V04oCZcyBtZWFuIGlzIHN0b3JlZCBpbiBva2N1cGlkX21lYW4uDQoNCmBgYHtyfQ0KIyBJbXBvcnRpbmcgZGF0YSBhbmQgY2FsY3VsYXRpbmcgdmFyaWFuY2UNCmxvYWQoImxlc3Nvbl9kYXRhLlJkYSIpDQp2YXJpYW5jZSA8LSBmdW5jdGlvbih4KSBtZWFuKCh4LW1lYW4oeCkpXjIpDQoNCm5iYV9tZWFuIDwtIG1lYW4obmJhX2RhdGEpDQpva2N1cGlkX21lYW4gPC0gbWVhbihva2N1cGlkX2RhdGEpDQpuYmFfc3RhbmRhcmRfZGV2aWF0aW9uIDwtIHNkKG5iYV9kYXRhKQ0Kb2tjdXBpZF9zdGFuZGFyZF9kZXZpYXRpb24gPC0gc2Qob2tjdXBpZF9kYXRhKQ0KDQojU3RlcCAxOiBDYWxjdWFsdGUgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgcGxheWVyJ3MgaGVpZ2h0IGFuZCB0aGUgbWVhbnMNCm5iYV9kaWZmZXJlbmNlIDwtIDgwIC0gbmJhX21lYW4NCm9rY3VwaWRfZGlmZmVyZW5jZSA8LSA4MCAtIG9rY3VwaWRfbWVhbg0KYGBgDQoNClsxXSAyLjAxNg0KDQpbMV0gMTEuNTg2DQoNCjIuV2Ugbm93IHdhbnQgdG8gZmluZCBvdXQgaG93IG1hbnkgdGltZXMgdGhlIHN0YW5kYXJkIGRldmlhdGlvbiBnb2VzIGludG8gdGhvc2UgZGlmZmVyZW5jZXMuDQoNClNldCBudW1fbmJhX2RldmlhdGlvbnMgZXF1YWwgdG8gbmJhX2RpZmZlcmVuY2UgZGl2aWRlZCBieSBuYmFfc3RhbmRhcmRfZGV2aWF0aW9uLg0KDQpEbyBhIHNpbWlsYXIgY2FsY3VsYXRpb24gZm9yIG51bV9va2N1cGlkX2RldmlhdGlvbnMuDQoNCldoYXQgZG9lcyB0aGF0IGZpcnN0IG51bWJlciB0ZWxsIHlvdSBhYm91dCBob3cgdW51c3VhbCBMZWJyb24gSmFtZXMgaXMgaW4gdGhlIE5CQT8gV2hhdCBkb2VzIHRoZSBzZWNvbmQgbnVtYmVyIHRlbGwgeW91IGFib3V0IGhvdyB1bnVzdWFsIExlYnJvbiBKYW1lcyBpcyBpbiB0aGUgZGF0aW5nIHBvb2w/DQoNCg0KDQpgYGB7cn0NCg0KI1N0ZXAgMjogVXNlIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIHBvaW50IGFuZCB0aGUgbWVhbiB0byBmaW5kIGhvdyBtYW55IHN0YW5kYXJkIGRldmlhdGlvbnMgdGhlIHBsYXllciBpcyBhd2F5IGZyb20gdGhlIG1lYW4uDQpudW1fbmJhX2RldmlhdGlvbnMgPC0gbmJhX2RpZmZlcmVuY2UgLyBuYmFfc3RhbmRhcmRfZGV2aWF0aW9uDQpudW1fb2tjdXBpZF9kZXZpYXRpb25zIDwtIG9rY3VwaWRfZGlmZmVyZW5jZSAvIG9rY3VwaWRfc3RhbmRhcmRfZGV2aWF0aW9uDQoNCm51bV9uYmFfZGV2aWF0aW9ucw0KbnVtX29rY3VwaWRfZGV2aWF0aW9ucw0KDQojSUdOT1JFIENPREUgQkVMT1cgSEVSRQ0KcHJpbnQocGFzdGUoIllvdXIgYmFza2V0YmFsbCBwbGF5ZXIgaXMiLCBudW1fbmJhX2RldmlhdGlvbnMsInN0YW5kYXJkIGRldmlhdGlvbnMgYXdheSBmcm9tIHRoZSBtZWFuIG9mIE5CQSBwbGF5ZXIgaGVpZ2h0cywiKSkNCnByaW50KHBhc3RlKCJZb3VyIGJhc2tldGJhbGwgcGxheWVyIGlzICIsbnVtX29rY3VwaWRfZGV2aWF0aW9ucywiIHN0YW5kYXJkIGRldmlhdGlvbnMgYXdheSBmcm9tIHRoZSBtZWFuIG9mIE9rQ3VwaWQgcHJvZmlsZSBoZWlnaHRzIikpDQpgYGANCg0KWzFdIDIuMDE2DQoNClsxXSAxMS41ODYNCg0KWzFdICJZb3VyIGJhc2tldGJhbGwgcGxheWVyIGlzIDAuNTUyMDI2NzYxMjc2NzM4IHN0YW5kYXJkIGRldmlhdGlvbnMgYXdheSBmcm9tIHRoZSBtZWFuIG9mIE5CQSBwbGF5ZXIgaGVpZ2h0cywiDQoNClsxXSAiWW91ciBiYXNrZXRiYWxsIHBsYXllciBpcyAgMi45NTA4NTE3NTA4OTAxMyAgc3RhbmRhcmQgZGV2aWF0aW9ucyBhd2F5IGZyb20gdGhlIG1lYW4gb2YgT2tDdXBpZCBwcm9maWxlIGhlaWdodHMiDQoNCjMuTGV04oCZcyBjaGVjayBhbm90aGVyIE5CQSBwbGF5ZXIuIEVhcmwgQm95a2lucyBpcyBvbmUgb2YgdGhlIHNtYWxsZXIgTkJBIHBsYXllcnMgaW4gaGlzdG9yeSBhdCA14oCZNeKAnSAoNjUgaW5jaGVzKS4gUmVwbGFjZSBMZWJyb24gSmFtZXPigJkgODAgaW5jaGVzIHdpdGggRWFybCBCb3lraW5z4oCZIDY1Lg0KDQpXaGF0IGNhbiB5b3Ugc2F5IGFib3V0IGhvdyB1bnVzdWFsIEVhcmwgQm95a2lucyBpcyB3aXRoIHJlc3BlY3QgdG8gdGhlIHR3byBkaWZmZXJlbnQgZGF0YXNldHM/DQoNCldlIHdlcmUgc3VycHJpc2VkIHRoYXQgQm95a2lucyB3YXNu4oCZdCBtb3JlIHN0YW5kYXJkIGRldmlhdGlvbnMgYXdheSBmcm9tIHRoZSBtZWFuIG9mIHRoZSBPa0N1cGlkIGRhdGFzZXQuIFRoaW5rIGFib3V0IHdoeSBoZSBpc27igJl0IG1vcmUgb2YgYW4gb3V0bGllciBpbiB0aGlzIGRhdGFzZXQuDQpgYGB7cn0NCiNTdGVwIDE6IENhbGN1YWx0ZSB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBwbGF5ZXIncyBoZWlnaHQgYW5kIHRoZSBtZWFucw0KbmJhX2RpZmZlcmVuY2UgPC0gNjUgLSBuYmFfbWVhbg0Kb2tjdXBpZF9kaWZmZXJlbmNlIDwtIDY1IC0gb2tjdXBpZF9tZWFuDQoNCm5iYV9kaWZmZXJlbmNlDQpva2N1cGlkX2RpZmZlcmVuY2UNCg0KI1N0ZXAgMjogVXNlIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIHBvaW50IGFuZCB0aGUgbWVhbiB0byBmaW5kIGhvdyBtYW55IHN0YW5kYXJkIGRldmlhdGlvbnMgdGhlIHBsYXllciBpcyBhd2F5IGZyb20gdGhlIG1lYW4uDQpudW1fbmJhX2RldmlhdGlvbnMgPC0gbmJhX2RpZmZlcmVuY2UgLyBuYmFfc3RhbmRhcmRfZGV2aWF0aW9uDQpudW1fb2tjdXBpZF9kZXZpYXRpb25zIDwtIG9rY3VwaWRfZGlmZmVyZW5jZSAvIG9rY3VwaWRfc3RhbmRhcmRfZGV2aWF0aW9uDQoNCm51bV9uYmFfZGV2aWF0aW9ucw0KbnVtX29rY3VwaWRfZGV2aWF0aW9ucw0KDQojSUdOT1JFIENPREUgQkVMT1cgSEVSRQ0KcHJpbnQocGFzdGUoIllvdXIgYmFza2V0YmFsbCBwbGF5ZXIgaXMiLCBudW1fbmJhX2RldmlhdGlvbnMsInN0YW5kYXJkIGRldmlhdGlvbnMgYXdheSBmcm9tIHRoZSBtZWFuIG9mIE5CQSBwbGF5ZXIgaGVpZ2h0cywiKSkNCnByaW50KHBhc3RlKCJZb3VyIGJhc2tldGJhbGwgcGxheWVyIGlzICIsbnVtX29rY3VwaWRfZGV2aWF0aW9ucywiIHN0YW5kYXJkIGRldmlhdGlvbnMgYXdheSBmcm9tIHRoZSBtZWFuIG9mIE9rQ3VwaWQgcHJvZmlsZSBoZWlnaHRzIikpDQpgYGANCg0KWzFdbmJhX2RpZmZlcmVuY2UgOiAtMTIuOTg0DQoNClsxXW9rY3VwaWRfZGlmZmVyZW5jZSA6IC0zLjQxNA0KDQpbMV1udW1fbmJhX2RldmlhdGlvbnMgOiAtMy41NTUzMTUNCg0KWzFdbnVtX29rY3VwaWRfZGV2aWF0aW9ucyA6IC0wLjg2OTUxNTYNCg0KWzFdICJZb3VyIGJhc2tldGJhbGwgcGxheWVyIGlzIC0zLjU1NTMxNTIxMjUwODUgc3RhbmRhcmQgZGV2aWF0aW9ucyBhd2F5IGZyb20gdGhlIG1lYW4gb2YgTkJBIHBsYXllciBoZWlnaHRzLCINCg0KWzFdICJZb3VyIGJhc2tldGJhbGwgcGxheWVyIGlzICAtMC44Njk1MTU2MTE3MzMwMzEgIHN0YW5kYXJkIGRldmlhdGlvbnMgYXdheSBmcm9tIHRoZSBtZWFuIG9mIE9rQ3VwaWQgcHJvZmlsZSBoZWlnaHRzIg0KDQojIDUuUmV2aWV3DQoNCkluIHRoZSBsYXN0IGV4ZXJjaXNlIHlvdSBzYXcgdGhhdCBMZWJyb24gSmFtZXMgd2FzIDAuNTUgc3RhbmRhcmQgZGV2aWF0aW9ucyBhYm92ZSB0aGUgbWVhbiBvZiBOQkEgcGxheWVyIGhlaWdodHMuIEhl4oCZcyB0YWxsZXIgdGhhbiBhdmVyYWdlLCBidXQgY29tcGFyZWQgdG8gdGhlIG90aGVyIE5CQSBwbGF5ZXJzLCBoZeKAmXMgbm90IGFic3VyZGx5IHRhbGwuDQoNCkhvd2V2ZXIsIGNvbXBhcmVkIHRvIHRoZSBPa0N1cGlkIGRhdGluZyBwb29sLCBoZSBpcyBleHRyZW1lbHkgcmFyZSEgSGXigJlzIGFsbW9zdCB0aHJlZSBmdWxsIHN0YW5kYXJkIGRldmlhdGlvbnMgYWJvdmUgdGhlIG1lYW4uIFlvdeKAmWQgZXhwZWN0IG9ubHkgYWJvdXQgMC4xNSUgb2YgcGVvcGxlIG9uIE9rQ3VwaWQgdG8gYmUgbW9yZSB0aGFuIDMgc3RhbmRhcmQgZGV2aWF0aW9ucyBhd2F5IGZyb20gdGhlIG1lYW4uDQoNClRoaXMgaXMgdGhlIHBvd2VyIG9mIHN0YW5kYXJkIGRldmlhdGlvbi4gQnkgdGFraW5nIHRoZSBzcXVhcmUgcm9vdCBvZiB0aGUgdmFyaWFuY2UsIHRoZSBzdGFuZGFyZCBkZXZpYXRpb24gZ2l2ZXMgeW91IGEgc3RhdGlzdGljIGFib3V0IHNwcmVhZCB0aGF0IGNhbiBiZSBlYXNpbHkgaW50ZXJwcmV0ZWQgYW5kIGNvbXBhcmVkIHRvIHRoZSBtZWFuLg0KDQojIyBJbnN0cnVjdGlvbnMNCg0KV2XigJl2ZSBjcmVhdGVkIGEgdmlzdWFsaXphdGlvbiB0aGF0IHNob3dzIHRoZSBtZWFuLCBmaXJzdCwgc2Vjb25kLCBhbmQgdGhpcmQgc3RhbmRhcmQgZGV2aWF0aW9ucyBvZiBlYWNoIGRhdGFzZXQuDQoNCkNvbXBhcmUgeW91ciBoZWlnaHQgKGluIGluY2hlcykgdG8gdGhlIGhlaWdodHMgb2YgTkJBIHBsYXllcnMgYW5kIE9rQ3VwaWQgZGF0ZXJzLg0KDQpZb3XigJlyZSBsaWtlbHkgYmVsb3cgdGhlIGZpcnN0IHN0YW5kYXJkIGRldmlhdGlvbiBmb3IgdGhlIE5CQS4gQXJlIHlvdSBiZWxvdyB0aGUgc2Vjb25kPyBIb3cgdW51c3VhbCBpcyB5b3VyIGhlaWdodCBjb21wYXJlZCB0byB0aGUgT2tDdXBpZCBtZW1iZXJzPw0KYGBge3IgU3RhbmRhcmQ1LCBvdXQud2lkdGg9IjYwJSJ9DQprbml0cjo6aW5jbHVkZV9ncmFwaGljcygiQzovVXNlcnMva3VvYW4vRGVza3RvcC9SIENvZGUvU3RhbmRhcmQ1LnBuZyIpDQpgYGA=