library(tidyverse)
library(openintro)

download.file("http://www.openintro.org/stat/data/bdims.RData", destfile = "bdims.RData")
load("bdims.RData")
head(bdims)
##   bia.di bii.di bit.di che.de che.di elb.di wri.di kne.di ank.di sho.gi che.gi
## 1   42.9   26.0   31.5   17.7   28.0   13.1   10.4   18.8   14.1  106.2   89.5
## 2   43.7   28.5   33.5   16.9   30.8   14.0   11.8   20.6   15.1  110.5   97.0
## 3   40.1   28.2   33.3   20.9   31.7   13.9   10.9   19.7   14.1  115.1   97.5
## 4   44.3   29.9   34.0   18.4   28.2   13.9   11.2   20.9   15.0  104.5   97.0
## 5   42.5   29.9   34.0   21.5   29.4   15.2   11.6   20.7   14.9  107.5   97.5
## 6   43.3   27.0   31.5   19.6   31.3   14.0   11.5   18.8   13.9  119.8   99.9
##   wai.gi nav.gi hip.gi thi.gi bic.gi for.gi kne.gi cal.gi ank.gi wri.gi age
## 1   71.5   74.5   93.5   51.5   32.5   26.0   34.5   36.5   23.5   16.5  21
## 2   79.0   86.5   94.8   51.5   34.4   28.0   36.5   37.5   24.5   17.0  23
## 3   83.2   82.9   95.0   57.3   33.4   28.8   37.0   37.3   21.9   16.9  28
## 4   77.8   78.8   94.0   53.0   31.0   26.2   37.0   34.8   23.0   16.6  23
## 5   80.0   82.5   98.5   55.4   32.0   28.4   37.7   38.6   24.4   18.0  22
## 6   82.5   80.1   95.3   57.5   33.0   28.0   36.6   36.1   23.5   16.9  21
##    wgt   hgt sex
## 1 65.6 174.0   1
## 2 71.8 175.3   1
## 3 80.7 193.5   1
## 4 72.6 186.5   1
## 5 78.8 187.2   1
## 6 74.8 181.5   1
# Isolating the data of focus 

mdims<-subset(bdims,sex==1)
fdims<-subset(bdims, sex==0)
sort(mdims$hgt)
##   [1] 157.2 160.0 163.0 163.8 164.1 164.5 164.5 165.1 165.1 165.1 165.1 166.4
##  [13] 166.4 167.0 167.0 167.0 167.4 167.4 167.6 167.6 167.6 167.6 167.6 167.6
##  [25] 167.6 167.6 167.6 167.6 168.9 168.9 168.9 169.4 169.5 170.0 170.0 170.2
##  [37] 170.2 170.2 170.2 170.2 170.2 170.5 170.5 170.8 171.2 171.4 171.4 171.4
##  [49] 171.4 171.5 171.5 171.8 172.1 172.7 172.7 172.7 172.7 172.7 172.7 172.7
##  [61] 172.7 172.8 173.0 173.0 173.5 174.0 174.0 174.0 174.0 174.0 174.0 174.0
##  [73] 174.0 174.0 174.0 174.0 174.5 175.0 175.0 175.3 175.3 175.3 175.3 175.3
##  [85] 175.3 175.3 175.3 175.3 175.3 175.3 175.3 175.3 175.3 175.3 175.5 175.5
##  [97] 175.5 175.5 175.9 176.0 176.0 176.0 176.0 176.5 176.5 176.5 176.5 176.5
## [109] 176.5 176.5 177.0 177.0 177.0 177.0 177.1 177.2 177.3 177.5 177.8 177.8
## [121] 177.8 177.8 177.8 177.8 177.8 177.8 177.8 177.8 177.8 177.8 177.8 177.8
## [133] 177.8 177.8 177.8 177.8 177.8 177.8 177.8 177.8 177.8 177.8 177.8 177.8
## [145] 178.0 178.1 179.1 179.1 179.1 179.1 179.1 179.1 179.7 179.8 180.0 180.1
## [157] 180.3 180.3 180.3 180.3 180.3 180.3 180.3 180.3 180.3 180.3 180.3 180.3
## [169] 180.3 180.3 180.3 180.5 180.6 180.6 181.1 181.5 181.6 181.6 181.6 181.6
## [181] 182.0 182.0 182.1 182.2 182.4 182.9 182.9 182.9 182.9 182.9 182.9 182.9
## [193] 183.0 183.0 183.5 184.0 184.0 184.0 184.2 184.2 184.2 184.2 184.4 184.5
## [205] 184.9 185.4 185.4 185.4 185.4 185.4 185.4 185.4 186.0 186.5 186.7 186.7
## [217] 186.7 186.7 187.2 188.0 188.0 188.0 188.0 188.0 188.0 188.0 188.0 188.0
## [229] 188.0 188.0 188.0 188.0 189.2 190.5 190.5 190.5 190.5 190.5 190.5 192.0
## [241] 192.0 192.0 192.7 193.0 193.5 197.1 198.1

Data that will be used is now isolated and catigorized under two subset catigories of female and male.

Exercise 1.1- ( Normal Distribution.)

1.1) Store height as an object for later. 1.1a) In accordance to a normal distribution, the curve should have the same mean and standard deviation as the data.

  1. Make a histogram of men’s heights and a histogram of women’s heights.
fhgtmean<-mean(fdims$hgt)
fhgtsd<-sd(fdims$hgt)
mhgtmean<-mean(mdims$hgt)
mhgtsd <-sd(mdims$hgt)

Exercise 1.2 (Density histogram)

1.2 ) Density Histogram with (X=140-190); displaying the entire span of female hight(fheight).

1.2a) The differentiating factor to the frequency histogram the “Y”is set to display the distribution of the female hight in conjunction with the mean and the standard deviation; all of which in area adds up to 1.

  1. How would you compare the various aspects of the two distributions?
hist(fdims$hgt,main = " Density of Female heights",xlab="Female Hight",  probability = TRUE)
x <- 140:190
y <- dnorm(x = x, mean = fhgtmean, sd = fhgtsd)
lines(x = x, y = y, col ="blue")

hist(mdims$hgt,main = " Density of Male heights", xlab = "Male Hight", probability = TRUE)
x <- 157.0:198.5
y <- dnorm(x = x, mean = mhgtmean, sd = mhgtsd)
lines(x = x, y = y, col ="blue")

#### Observation of male and female. 1. Both Male and Females follow a fairly normal distribution.

1a. while the peak of curve for the females data is above the graph the opposite happens for the Male hight distribution graph.

Exercise 2- (Evaluation the normal distribution)

  1. Based on the this plot, does it appear that the data follow a nearly normal distribution?

2.1) Evaluate the curve relation to the Density histogram using a quantile-quantile “Q-Q”plot.

2.1a) To differentiate from a regular histogram the graph will compare to a simulated normally distributed data

#normal distributions made of the height model a line which would be the curve is made using the qqline and qqnorm function. 
qqnorm(fdims$hgt)
qqline(fdims$hgt)

# in relation to a simulated data of same object "what if "
sim_norm <- rnorm(n = length(fdims$hgt), mean = fhgtmean, sd = fhgtsd)

2A. From the -2 to 2 theoretical quantiles and 155 to 180 sample quantiles it seems to be fairly aligned to a normal distribution.

Exercise 3 - (Comapre )

  1. Normal probability plot of simulated data set data( sim_norm)
qqnormsim(fdims$hgt)

3Q. Do all of the points fall on the line? How does this plot compare to the probability plot for the real data? 3A. All the points fall in line for the most part in comparison to to the probability for the real data they coincide with one another.

Exercise 4

Q4.Does the normal probability plot for fdims$hgt look similar to the plots created for the simulated data? That is, do plots provide evidence that the female heights are nearly normal?

A4. The simulated data looks very similar to the plot for fdims$ght. Hence it is appropriate to deduce that there is evidence to suggest that that the female hights are nearly normal.

Exercise 5 . Evaluating Female Weight.

Q5. Using the same technique, determine whether or not female weights appear to come from a normal distribution.

#place in to the objective the mean and standard deviation of isolated data which in this case is wight

fwghtmean<- mean(fdims$wgt)
fwghtsd<-sd(fdims$wgt)

#sort data for the Encompassig min and max of the weight variations.
sort (fdims$wgt)
##   [1]  42.0  43.2  44.8  45.0  45.7  45.8  45.9  46.2  46.4  46.5  46.8  47.0
##  [13]  47.3  47.6  47.6  47.8  48.6  48.6  48.6  48.7  48.8  49.0  49.1  49.2
##  [25]  49.2  49.2  49.8  50.0  50.0  50.0  50.0  50.2  50.2  50.2  50.6  51.6
##  [37]  51.8  51.8  52.1  52.2  52.3  52.7  52.7  52.7  52.8  53.2  53.2  53.2
##  [49]  53.4  53.4  53.4  53.6  53.6  53.6  53.6  53.8  53.9  54.0  54.1  54.2
##  [61]  54.3  54.4  54.4  54.5  54.5  54.5  54.5  54.5  54.5  54.5  54.6  54.7
##  [73]  54.8  54.8  54.8  55.0  55.0  55.0  55.0  55.0  55.2  55.2  55.2  55.4
##  [85]  55.5  55.5  55.5  55.5  55.5  55.6  55.7  55.7  55.9  55.9  55.9  55.9
##  [97]  55.9  55.9  56.0  56.2  56.2  56.4  56.6  56.6  56.6  56.6  56.8  56.8
## [109]  57.2  57.3  57.3  57.7  57.8  57.8  58.0  58.2  58.2  58.2  58.2  58.3
## [121]  58.4  58.5  58.6  58.6  58.6  58.6  58.8  59.0  59.0  59.0  59.0  59.1
## [133]  59.1  59.2  59.3  59.4  59.5  59.8  59.8  59.8  59.8  59.8  60.0  60.0
## [145]  60.0  60.0  60.2  60.3  60.3  60.4  60.5  60.7  60.9  60.9  61.0  61.1
## [157]  61.4  61.4  61.4  61.4  62.0  62.0  62.0  62.0  62.2  62.3  62.3  62.5
## [169]  62.5  62.7  62.7  63.0  63.0  63.0  63.2  63.2  63.4  63.4  63.6  63.6
## [181]  63.6  63.6  63.6  63.6  63.6  63.6  64.1  64.1  64.4  64.5  64.5  64.8
## [193]  65.2  65.5  65.5  65.9  66.4  66.4  66.8  66.8  66.8  67.2  67.2  67.3
## [205]  67.3  67.3  67.3  67.7  67.8  67.9  68.2  68.8  69.0  69.1  69.1  69.2
## [217]  69.4  69.5  69.8  70.5  70.5  70.5  70.6  70.6  70.7  71.6  71.8  72.0
## [229]  72.3  72.3  72.7  72.8  72.9  73.1  73.2  73.2  73.2  73.6  73.6  73.6
## [241]  74.3  75.2  75.5  75.7  75.9  76.4  76.8  77.3  80.0  80.5  80.9  81.8
## [253]  81.8  82.5  83.0  84.5  86.3  87.8 104.1 105.2

Distribution histogram of female weight distribution

hist(fdims$wgt,main = " Density distributionof Female wights ",xlab="Female weight",  probability = TRUE)
x <- 41:106
y <- dnorm(x = x, mean = fwghtmean, sd = fwghtsd)
lines(x = x, y = y, col =" Hot Pink")

A5. Although the curve barely encompasses the the higher wight quartiles it covers the area of majority , for such reasons it is plausable to assume that it somewhat follows/ forms a Normal distribution .

Normal Distributions and probabilities (sample)

Probability by Z score- Normal probaility table

1.pnorm = gives the area under the normal cureve below “q” given the “mean” and “standard deviation”- Theoretical Probability

  1. The closer the to normal the distribution is the more accurate the theoretical probabilities.

Q. what is the probability that someone is taller than 182cm - take one minus the probability

# This is the calcuation for theoretical distribution 
1 - pnorm(q = 182, mean = fhgtmean, sd = fhgtsd)
## [1] 0.004434387
# This is the empherical distribution 
sum(fdims$hgt > 182) / length(fdims$hgt)
## [1] 0.003846154

Exercise 6A- Height probability

Q. what is the probability that someone is shorter than or equal to the mean of the hights ?

# This is the calcuation for theoretical distribution 
1 - pnorm(q = fhgtmean, mean = fhgtmean, sd = fhgtsd)
## [1] 0.5
# This is the empherical distribution 
sum(fdims$hgt <= fhgtmean) / length(fdims$hgt)
## [1] 0.5076923

Exercise 6A- Height probability

Q. what is the probability that someone is greater than or equal to the median wight?

summary(fdims$wgt)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    42.0    54.5    59.0    60.6    65.6   105.2
fwghtmed<-median(fdims$wgt)

# This is the calcuation for theoretical distribution 
1 - pnorm(q = fwghtmed, mean = fwghtmean, sd = fwghtsd)
## [1] 0.5660925
# This is the empherical distribution 
sum(fdims$wgt >= fwghtmed) / length(fdims$hgt)
## [1] 0.5115385

Exercise 7-(Plot to Histogram)

7.1 Q. Now let’s consider some of the other variables in the body dimensions data set. Using the figures at the end of the exercises, match the histogram to its normal probability plot. All of the variables have been standardized (first subtract the mean, then divide by the standard deviation), so the units won’t be of any help. If you are uncertain based on these figures, generate the plots in R to check.

  1. The histogram for female biiliac (pelvic) diameter (bii.di) belongs to normal probability plot letter B.

  2. The histogram for female elbow diameter (elb.di) belongs to normal probability plot letter D.

  3. The histogram for general age (age) belongs to normal probability plot letter A__.

  4. The histogram for female chest depth (che.de) belongs to normal probability plot letter D__.

7.2Q. Note that normal probability plots C and D have a slight step wise pattern. Why do you think this is the case?

7.2A. It is reflective of the skewness of the graph whiles shows a distinct skew c shows a slight one .

Exercise 7B-(Plot to Histogram)

Q. As you can see, normal probability plots can be used both to assess normality and visualize skewness. Make a normal probability plot for female knee diameter (kne.di).

fkne.dimean<- mean(fdims$kne.di)
fkne.disd<-sd(fdims$kne.di)

#normal distributions made of the knee diameter model a line which would be the curve is made using the qqline and qqnorm function. 
qqnorm(fdims$kne.di)
qqline(fdims$kne.di)

# in relation to a simulated data of same object "what if "
sim_norm <- rnorm(n = length(fdims$kne.di), mean = fkne.dimean, sd = fkne.disd)

7.3Q Based on this normal probability plot, is this variable left skewed, symmetric, or right skewed?

7.3A Based on the plot the probability seems to be left skewed.

Use a histogram to confirm your findings.

summary(fdims$kne.di)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    15.7    17.3    18.0    18.1    18.7    24.3
hist(fdims$kne.di,main = " Density distributionof Female Knee dimensions  ",xlab="Female Knee Dimensions",  probability = TRUE)
x <- 15:24
y <- dnorm(x = x, mean = fkne.dimean, sd = fkne.disd)
lines(x = x, y = y, col =" Purple")

LS0tCnRpdGxlOiAiVGhlIG5vcm1hbCBkaXN0cmlidXRpb24iCmF1dGhvcjogIk1ha2RhIERlbWVsYXNoIgpkYXRlOiAiMDkvMjUvMjAyMSIKb3V0cHV0OiBvcGVuaW50cm86OmxhYl9yZXBvcnQKLS0tCgpgYGB7ciBsb2FkLXBhY2thZ2VzLCBtZXNzYWdlPUZBTFNFfQpsaWJyYXJ5KHRpZHl2ZXJzZSkKbGlicmFyeShvcGVuaW50cm8pCgpkb3dubG9hZC5maWxlKCJodHRwOi8vd3d3Lm9wZW5pbnRyby5vcmcvc3RhdC9kYXRhL2JkaW1zLlJEYXRhIiwgZGVzdGZpbGUgPSAiYmRpbXMuUkRhdGEiKQpsb2FkKCJiZGltcy5SRGF0YSIpCmhlYWQoYmRpbXMpCiMgSXNvbGF0aW5nIHRoZSBkYXRhIG9mIGZvY3VzIAoKbWRpbXM8LXN1YnNldChiZGltcyxzZXg9PTEpCmZkaW1zPC1zdWJzZXQoYmRpbXMsIHNleD09MCkKc29ydChtZGltcyRoZ3QpCmBgYAoKRGF0YSB0aGF0IHdpbGwgYmUgdXNlZCBpcyBub3cgaXNvbGF0ZWQgYW5kIGNhdGlnb3JpemVkIHVuZGVyIHR3byBzdWJzZXQgY2F0aWdvcmllcyBvZiBmZW1hbGUgYW5kIG1hbGUuCgojIyMgRXhlcmNpc2UgMS4xLSAoIE5vcm1hbCBEaXN0cmlidXRpb24uKQoxLjEpIFN0b3JlIGhlaWdodCBhcyBhbiBvYmplY3QgZm9yIGxhdGVyLgoxLjFhKSBJbiBhY2NvcmRhbmNlIHRvIGEgbm9ybWFsIGRpc3RyaWJ1dGlvbiwgdGhlIGN1cnZlIHNob3VsZCBoYXZlIHRoZSBzYW1lIG1lYW4gYW5kIHN0YW5kYXJkIGRldmlhdGlvbiBhcyB0aGUgZGF0YS4KClEpIE1ha2UgYSBoaXN0b2dyYW0gb2YgbWVu4oCZcyBoZWlnaHRzIGFuZCBhIGhpc3RvZ3JhbSBvZiB3b21lbuKAmXMgaGVpZ2h0cy4KYGBge3IgfQpmaGd0bWVhbjwtbWVhbihmZGltcyRoZ3QpCmZoZ3RzZDwtc2QoZmRpbXMkaGd0KQptaGd0bWVhbjwtbWVhbihtZGltcyRoZ3QpCm1oZ3RzZCA8LXNkKG1kaW1zJGhndCkKYGBgCgojIyMgRXhlcmNpc2UgMS4yIChEZW5zaXR5IGhpc3RvZ3JhbSkKMS4yICkgRGVuc2l0eSBIaXN0b2dyYW0gd2l0aCAoWD0xNDAtMTkwKTsgZGlzcGxheWluZyB0aGUgZW50aXJlIHNwYW4gb2YgZmVtYWxlIGhpZ2h0KGZoZWlnaHQpLiAKCjEuMmEpIFRoZSBkaWZmZXJlbnRpYXRpbmcgZmFjdG9yIHRvIHRoZSBmcmVxdWVuY3kgaGlzdG9ncmFtIHRoZSAiWSJpcyBzZXQgdG8gZGlzcGxheSB0aGUgZGlzdHJpYnV0aW9uIG9mIHRoZSBmZW1hbGUgaGlnaHQgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgbWVhbiBhbmQgdGhlIHN0YW5kYXJkIGRldmlhdGlvbjsgYWxsIG9mIHdoaWNoIGluIGFyZWEgYWRkcyB1cCB0byAxLiAKClEpIEhvdyB3b3VsZCB5b3UgY29tcGFyZSB0aGUgdmFyaW91cyBhc3BlY3RzIG9mIHRoZSB0d28gZGlzdHJpYnV0aW9ucz8KCgpgYGB7cn0KaGlzdChmZGltcyRoZ3QsbWFpbiA9ICIgRGVuc2l0eSBvZiBGZW1hbGUgaGVpZ2h0cyIseGxhYj0iRmVtYWxlIEhpZ2h0IiwgIHByb2JhYmlsaXR5ID0gVFJVRSkKeCA8LSAxNDA6MTkwCnkgPC0gZG5vcm0oeCA9IHgsIG1lYW4gPSBmaGd0bWVhbiwgc2QgPSBmaGd0c2QpCmxpbmVzKHggPSB4LCB5ID0geSwgY29sID0iYmx1ZSIpCgoKaGlzdChtZGltcyRoZ3QsbWFpbiA9ICIgRGVuc2l0eSBvZiBNYWxlIGhlaWdodHMiLCB4bGFiID0gIk1hbGUgSGlnaHQiLCBwcm9iYWJpbGl0eSA9IFRSVUUpCnggPC0gMTU3LjA6MTk4LjUKeSA8LSBkbm9ybSh4ID0geCwgbWVhbiA9IG1oZ3RtZWFuLCBzZCA9IG1oZ3RzZCkKbGluZXMoeCA9IHgsIHkgPSB5LCBjb2wgPSJibHVlIikKCgoKYGBgCiMjIyMgT2JzZXJ2YXRpb24gb2YgbWFsZSBhbmQgZmVtYWxlLgoxLiBCb3RoIE1hbGUgYW5kIEZlbWFsZXMgZm9sbG93IGEgZmFpcmx5IG5vcm1hbCBkaXN0cmlidXRpb24uCgoxYS4gd2hpbGUgdGhlIHBlYWsgb2YgIGN1cnZlIGZvciB0aGUgZmVtYWxlcyBkYXRhIGlzIGFib3ZlIHRoZSBncmFwaCB0aGUgb3Bwb3NpdGUgaGFwcGVucyBmb3IgdGhlIE1hbGUgaGlnaHQgZGlzdHJpYnV0aW9uIGdyYXBoLgoKCgojIyMgRXhlcmNpc2UgMi0gKEV2YWx1YXRpb24gdGhlIG5vcm1hbCBkaXN0cmlidXRpb24pCgpRKSBCYXNlZCBvbiB0aGUgdGhpcyBwbG90LCBkb2VzIGl0IGFwcGVhciB0aGF0IHRoZSBkYXRhIGZvbGxvdyBhIG5lYXJseSBub3JtYWwgZGlzdHJpYnV0aW9uPwoKMi4xKSBFdmFsdWF0ZSB0aGUgY3VydmUgcmVsYXRpb24gdG8gdGhlIERlbnNpdHkgaGlzdG9ncmFtIHVzaW5nIGEgcXVhbnRpbGUtcXVhbnRpbGUgIlEtUSJwbG90LiAKCjIuMWEpIFRvIGRpZmZlcmVudGlhdGUgZnJvbSBhIHJlZ3VsYXIgaGlzdG9ncmFtIHRoZSBncmFwaCB3aWxsIGNvbXBhcmUgdG8gYSBzaW11bGF0ZWQgbm9ybWFsbHkgZGlzdHJpYnV0ZWQgZGF0YSAgCgpgYGB7cn0KI25vcm1hbCBkaXN0cmlidXRpb25zIG1hZGUgb2YgdGhlIGhlaWdodCBtb2RlbCBhIGxpbmUgd2hpY2ggd291bGQgYmUgdGhlIGN1cnZlIGlzIG1hZGUgdXNpbmcgdGhlIHFxbGluZSBhbmQgcXFub3JtIGZ1bmN0aW9uLiAKcXFub3JtKGZkaW1zJGhndCkKcXFsaW5lKGZkaW1zJGhndCkKCiMgaW4gcmVsYXRpb24gdG8gYSBzaW11bGF0ZWQgZGF0YSBvZiBzYW1lIG9iamVjdCAid2hhdCBpZiAiCnNpbV9ub3JtIDwtIHJub3JtKG4gPSBsZW5ndGgoZmRpbXMkaGd0KSwgbWVhbiA9IGZoZ3RtZWFuLCBzZCA9IGZoZ3RzZCkKCmBgYAoKMkEuIEZyb20gdGhlIC0yIHRvIDIgdGhlb3JldGljYWwgcXVhbnRpbGVzIGFuZCAgMTU1IHRvIDE4MCBzYW1wbGUgcXVhbnRpbGVzICBpdCBzZWVtcyB0byBiZSBmYWlybHkgYWxpZ25lZCB0byBhIG5vcm1hbCBkaXN0cmlidXRpb24uIAoKCiMjIyBFeGVyY2lzZSAzIC0gKENvbWFwcmUgKQozLiBOb3JtYWwgcHJvYmFiaWxpdHkgcGxvdCBvZiBzaW11bGF0ZWQgZGF0YSBzZXQgZGF0YSggc2ltX25vcm0pCgpgYGB7ciB9CgpxcW5vcm1zaW0oZmRpbXMkaGd0KQpgYGAKCjNRLiBEbyBhbGwgb2YgdGhlIHBvaW50cyBmYWxsIG9uIHRoZSBsaW5lPyBIb3cgZG9lcyB0aGlzIHBsb3QgY29tcGFyZSB0byB0aGUgcHJvYmFiaWxpdHkgcGxvdCBmb3IgdGhlIHJlYWwgZGF0YT8KM0EuIEFsbCB0aGUgcG9pbnRzIGZhbGwgaW4gbGluZSBmb3IgdGhlIG1vc3QgcGFydCBpbiBjb21wYXJpc29uIHRvIHRvIHRoZSBwcm9iYWJpbGl0eSBmb3IgdGhlIHJlYWwgZGF0YSB0aGV5IGNvaW5jaWRlIHdpdGggb25lIGFub3RoZXIuIAoKCiMjIyBFeGVyY2lzZSA0ClE0LkRvZXMgdGhlIG5vcm1hbCBwcm9iYWJpbGl0eSBwbG90IGZvciBmZGltcyRoZ3QgbG9vayBzaW1pbGFyIHRvIHRoZSBwbG90cyBjcmVhdGVkIGZvciB0aGUgc2ltdWxhdGVkIGRhdGE/IFRoYXQgaXMsIGRvIHBsb3RzIHByb3ZpZGUgZXZpZGVuY2UgdGhhdCB0aGUgZmVtYWxlIGhlaWdodHMgYXJlIG5lYXJseSBub3JtYWw/CgpBNC4gVGhlIHNpbXVsYXRlZCBkYXRhIGxvb2tzIHZlcnkgc2ltaWxhciB0byB0aGUgcGxvdCBmb3IgZmRpbXMkZ2h0LiBIZW5jZSBpdCBpcyBhcHByb3ByaWF0ZSB0byBkZWR1Y2UgdGhhdCB0aGVyZSBpcyBldmlkZW5jZSB0byBzdWdnZXN0IHRoYXQgdGhhdCB0aGUgZmVtYWxlIGhpZ2h0cyBhcmUgbmVhcmx5IG5vcm1hbC4KCgojIyMgRXhlcmNpc2UgNSAuIEV2YWx1YXRpbmcgRmVtYWxlIFdlaWdodC4KUTUuIFVzaW5nIHRoZSBzYW1lIHRlY2huaXF1ZSwgZGV0ZXJtaW5lIHdoZXRoZXIgb3Igbm90IGZlbWFsZSB3ZWlnaHRzIGFwcGVhciB0byBjb21lIGZyb20gYSBub3JtYWwgZGlzdHJpYnV0aW9uLgoKYGBge3J9CiNwbGFjZSBpbiB0byB0aGUgb2JqZWN0aXZlIHRoZSBtZWFuIGFuZCBzdGFuZGFyZCBkZXZpYXRpb24gb2YgaXNvbGF0ZWQgZGF0YSB3aGljaCBpbiB0aGlzIGNhc2UgaXMgd2lnaHQKCmZ3Z2h0bWVhbjwtIG1lYW4oZmRpbXMkd2d0KQpmd2dodHNkPC1zZChmZGltcyR3Z3QpCgojc29ydCBkYXRhIGZvciB0aGUgRW5jb21wYXNzaWcgbWluIGFuZCBtYXggb2YgdGhlIHdlaWdodCB2YXJpYXRpb25zLgpzb3J0IChmZGltcyR3Z3QpCgpgYGAKIyMjIyBEaXN0cmlidXRpb24gaGlzdG9ncmFtIG9mIGZlbWFsZSB3ZWlnaHQgZGlzdHJpYnV0aW9uIAoKYGBge3J9Cmhpc3QoZmRpbXMkd2d0LG1haW4gPSAiIERlbnNpdHkgZGlzdHJpYnV0aW9ub2YgRmVtYWxlIHdpZ2h0cyAiLHhsYWI9IkZlbWFsZSB3ZWlnaHQiLCAgcHJvYmFiaWxpdHkgPSBUUlVFKQp4IDwtIDQxOjEwNgp5IDwtIGRub3JtKHggPSB4LCBtZWFuID0gZndnaHRtZWFuLCBzZCA9IGZ3Z2h0c2QpCmxpbmVzKHggPSB4LCB5ID0geSwgY29sID0iIEhvdCBQaW5rIikKCmBgYAoKQTUuIEFsdGhvdWdoIHRoZSBjdXJ2ZSBiYXJlbHkgZW5jb21wYXNzZXMgdGhlIHRoZSBoaWdoZXIgd2lnaHQgcXVhcnRpbGVzIGl0IGNvdmVycyB0aGUgYXJlYSBvZiBtYWpvcml0eSAsIGZvciBzdWNoIHJlYXNvbnMgaXQgaXMgcGxhdXNhYmxlIHRvIGFzc3VtZSB0aGF0IGl0IHNvbWV3aGF0IGZvbGxvd3MvIGZvcm1zIGEgTm9ybWFsIGRpc3RyaWJ1dGlvbiAuCgoKIyMjIE5vcm1hbCBEaXN0cmlidXRpb25zIGFuZCBwcm9iYWJpbGl0aWVzIChzYW1wbGUpCgojIyMjIFByb2JhYmlsaXR5IGJ5IFogc2NvcmUtIE5vcm1hbCBwcm9iYWlsaXR5IHRhYmxlIAogCiAxLnBub3JtID0gZ2l2ZXMgdGhlIGFyZWEgdW5kZXIgdGhlIG5vcm1hbCBjdXJldmUgYmVsb3cgInEiIGdpdmVuIHRoZSAibWVhbiIgYW5kICJzdGFuZGFyZCBkZXZpYXRpb24iLSBUaGVvcmV0aWNhbCBQcm9iYWJpbGl0eSAKIAogMi4gVGhlIGNsb3NlciB0aGUgdG8gbm9ybWFsIHRoZSBkaXN0cmlidXRpb24gaXMgdGhlIG1vcmUgYWNjdXJhdGUgdGhlIHRoZW9yZXRpY2FsIHByb2JhYmlsaXRpZXMuIAogCiBRLiB3aGF0IGlzIHRoZSBwcm9iYWJpbGl0eSB0aGF0IHNvbWVvbmUgaXMgdGFsbGVyIHRoYW4gMTgyY20gLSB0YWtlIG9uZSBtaW51cyB0aGUgcHJvYmFiaWxpdHkKIApgYGB7cn0KIyBUaGlzIGlzIHRoZSBjYWxjdWF0aW9uIGZvciB0aGVvcmV0aWNhbCBkaXN0cmlidXRpb24gCjEgLSBwbm9ybShxID0gMTgyLCBtZWFuID0gZmhndG1lYW4sIHNkID0gZmhndHNkKQoKIyBUaGlzIGlzIHRoZSBlbXBoZXJpY2FsIGRpc3RyaWJ1dGlvbiAKc3VtKGZkaW1zJGhndCA+IDE4MikgLyBsZW5ndGgoZmRpbXMkaGd0KQoKYGBgCiAKCiMjIyBFeGVyY2lzZSA2QS0gSGVpZ2h0IHByb2JhYmlsaXR5IAoKIFEuIHdoYXQgaXMgdGhlIHByb2JhYmlsaXR5IHRoYXQgc29tZW9uZSBpcyBzaG9ydGVyIHRoYW4gb3IgZXF1YWwgdG8gdGhlIG1lYW4gb2YgdGhlIGhpZ2h0cyA/CiAKYGBge3IgfQojIFRoaXMgaXMgdGhlIGNhbGN1YXRpb24gZm9yIHRoZW9yZXRpY2FsIGRpc3RyaWJ1dGlvbiAKMSAtIHBub3JtKHEgPSBmaGd0bWVhbiwgbWVhbiA9IGZoZ3RtZWFuLCBzZCA9IGZoZ3RzZCkKCiMgVGhpcyBpcyB0aGUgZW1waGVyaWNhbCBkaXN0cmlidXRpb24gCnN1bShmZGltcyRoZ3QgPD0gZmhndG1lYW4pIC8gbGVuZ3RoKGZkaW1zJGhndCkKCgpgYGAKCiMjIyBFeGVyY2lzZSA2QS0gSGVpZ2h0IHByb2JhYmlsaXR5IAoKIFEuIHdoYXQgaXMgdGhlIHByb2JhYmlsaXR5IHRoYXQgc29tZW9uZSBpcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gdGhlIG1lZGlhbiB3aWdodD8KIApgYGB7ciB9CgpzdW1tYXJ5KGZkaW1zJHdndCkKZndnaHRtZWQ8LW1lZGlhbihmZGltcyR3Z3QpCgojIFRoaXMgaXMgdGhlIGNhbGN1YXRpb24gZm9yIHRoZW9yZXRpY2FsIGRpc3RyaWJ1dGlvbiAKMSAtIHBub3JtKHEgPSBmd2dodG1lZCwgbWVhbiA9IGZ3Z2h0bWVhbiwgc2QgPSBmd2dodHNkKQoKIyBUaGlzIGlzIHRoZSBlbXBoZXJpY2FsIGRpc3RyaWJ1dGlvbiAKc3VtKGZkaW1zJHdndCA+PSBmd2dodG1lZCkgLyBsZW5ndGgoZmRpbXMkaGd0KQoKCmBgYAoKCgoKIyMjIEV4ZXJjaXNlIDctKFBsb3QgdG8gSGlzdG9ncmFtKQoKIDcuMSBRLiBOb3cgbGV04oCZcyBjb25zaWRlciBzb21lIG9mIHRoZSBvdGhlciB2YXJpYWJsZXMgaW4gdGhlIGJvZHkgZGltZW5zaW9ucyBkYXRhIHNldC4gVXNpbmcgdGhlIGZpZ3VyZXMgYXQgdGhlIGVuZCBvZiB0aGUgZXhlcmNpc2VzLCBtYXRjaCB0aGUgaGlzdG9ncmFtIHRvIGl0cyBub3JtYWwgcHJvYmFiaWxpdHkgcGxvdC4gQWxsIG9mIHRoZSB2YXJpYWJsZXMgaGF2ZSBiZWVuIHN0YW5kYXJkaXplZCAoZmlyc3Qgc3VidHJhY3QgdGhlIG1lYW4sIHRoZW4gZGl2aWRlIGJ5IHRoZSBzdGFuZGFyZCBkZXZpYXRpb24pLCBzbyB0aGUgdW5pdHMgd29u4oCZdCBiZSBvZiBhbnkgaGVscC4gSWYgeW91IGFyZSB1bmNlcnRhaW4gYmFzZWQgb24gdGhlc2UgZmlndXJlcywgZ2VuZXJhdGUgdGhlIHBsb3RzIGluIFIgdG8gY2hlY2suCgphLiBUaGUgaGlzdG9ncmFtIGZvciBmZW1hbGUgYmlpbGlhYyAocGVsdmljKSBkaWFtZXRlciAoYmlpLmRpKSBiZWxvbmdzIHRvIG5vcm1hbCBwcm9iYWJpbGl0eSBwbG90IGxldHRlciBfX0JfXy4KCmIuIFRoZSBoaXN0b2dyYW0gZm9yIGZlbWFsZSBlbGJvdyBkaWFtZXRlciAoZWxiLmRpKSBiZWxvbmdzIHRvIG5vcm1hbCBwcm9iYWJpbGl0eSBwbG90IGxldHRlciBfX0RfXy4KCmMuIFRoZSBoaXN0b2dyYW0gZm9yIGdlbmVyYWwgYWdlIChhZ2UpIGJlbG9uZ3MgdG8gbm9ybWFsIHByb2JhYmlsaXR5IHBsb3QgbGV0dGVyIF9BX19fLgoKZC4gVGhlIGhpc3RvZ3JhbSBmb3IgZmVtYWxlIGNoZXN0IGRlcHRoIChjaGUuZGUpIGJlbG9uZ3MgdG8gbm9ybWFsIHByb2JhYmlsaXR5IHBsb3QgbGV0dGVyIF9EX19fLgoKNy4yUS4gTm90ZSB0aGF0IG5vcm1hbCBwcm9iYWJpbGl0eSBwbG90cyBDIGFuZCBEIGhhdmUgYSBzbGlnaHQgc3RlcCB3aXNlIHBhdHRlcm4uCldoeSBkbyB5b3UgdGhpbmsgdGhpcyBpcyB0aGUgY2FzZT8KCiA3LjJBLiBJdCBpcyByZWZsZWN0aXZlIG9mIHRoZSBza2V3bmVzcyBvZiB0aGUgZ3JhcGggd2hpbGVzIHNob3dzIGEgZGlzdGluY3Qgc2tldyBjIHNob3dzIGEgc2xpZ2h0IG9uZSBcLgoKIyMjIEV4ZXJjaXNlIDdCLShQbG90IHRvIEhpc3RvZ3JhbSkKClEuIEFzIHlvdSBjYW4gc2VlLCBub3JtYWwgcHJvYmFiaWxpdHkgcGxvdHMgY2FuIGJlIHVzZWQgYm90aCB0byBhc3Nlc3Mgbm9ybWFsaXR5IGFuZCB2aXN1YWxpemUgc2tld25lc3MuIE1ha2UgYSBub3JtYWwgcHJvYmFiaWxpdHkgcGxvdCBmb3IgZmVtYWxlIGtuZWUgZGlhbWV0ZXIgKGtuZS5kaSkuIApgYGB7cn0KZmtuZS5kaW1lYW48LSBtZWFuKGZkaW1zJGtuZS5kaSkKZmtuZS5kaXNkPC1zZChmZGltcyRrbmUuZGkpCgojbm9ybWFsIGRpc3RyaWJ1dGlvbnMgbWFkZSBvZiB0aGUga25lZSBkaWFtZXRlciBtb2RlbCBhIGxpbmUgd2hpY2ggd291bGQgYmUgdGhlIGN1cnZlIGlzIG1hZGUgdXNpbmcgdGhlIHFxbGluZSBhbmQgcXFub3JtIGZ1bmN0aW9uLiAKcXFub3JtKGZkaW1zJGtuZS5kaSkKcXFsaW5lKGZkaW1zJGtuZS5kaSkKCiMgaW4gcmVsYXRpb24gdG8gYSBzaW11bGF0ZWQgZGF0YSBvZiBzYW1lIG9iamVjdCAid2hhdCBpZiAiCnNpbV9ub3JtIDwtIHJub3JtKG4gPSBsZW5ndGgoZmRpbXMka25lLmRpKSwgbWVhbiA9IGZrbmUuZGltZWFuLCBzZCA9IGZrbmUuZGlzZCkKCmBgYAo3LjNRIEJhc2VkIG9uIHRoaXMgbm9ybWFsIHByb2JhYmlsaXR5IHBsb3QsIGlzIHRoaXMgdmFyaWFibGUgbGVmdCBza2V3ZWQsIHN5bW1ldHJpYywgb3IgcmlnaHQgc2tld2VkPyAKCjcuM0EgQmFzZWQgb24gdGhlIHBsb3QgdGhlIHByb2JhYmlsaXR5IHNlZW1zIHRvIGJlIGxlZnQgc2tld2VkLgoKClVzZSBhIGhpc3RvZ3JhbSB0byBjb25maXJtIHlvdXIgZmluZGluZ3MuCgpgYGB7cn0Kc3VtbWFyeShmZGltcyRrbmUuZGkpCgpoaXN0KGZkaW1zJGtuZS5kaSxtYWluID0gIiBEZW5zaXR5IGRpc3RyaWJ1dGlvbm9mIEZlbWFsZSBLbmVlIGRpbWVuc2lvbnMgICIseGxhYj0iRmVtYWxlIEtuZWUgRGltZW5zaW9ucyIsICBwcm9iYWJpbGl0eSA9IFRSVUUpCnggPC0gMTU6MjQKeSA8LSBkbm9ybSh4ID0geCwgbWVhbiA9IGZrbmUuZGltZWFuLCBzZCA9IGZrbmUuZGlzZCkKbGluZXMoeCA9IHgsIHkgPSB5LCBjb2wgPSIgUHVycGxlIikKCmBgYAoK