library(tidyverse)
library(openintro)

##head shows a summary similar to glimpse
head(fastfood)
## # A tibble: 6 x 17
##   restaurant item       calories cal_fat total_fat sat_fat trans_fat cholesterol
##   <chr>      <chr>         <dbl>   <dbl>     <dbl>   <dbl>     <dbl>       <dbl>
## 1 Mcdonalds  Artisan G~      380      60         7       2       0            95
## 2 Mcdonalds  Single Ba~      840     410        45      17       1.5         130
## 3 Mcdonalds  Double Ba~     1130     600        67      27       3           220
## 4 Mcdonalds  Grilled B~      750     280        31      10       0.5         155
## 5 Mcdonalds  Crispy Ba~      920     410        45      12       0.5         120
## 6 Mcdonalds  Big Mac         540     250        28      10       1            80
## # ... with 9 more variables: sodium <dbl>, total_carb <dbl>, fiber <dbl>,
## #   sugar <dbl>, protein <dbl>, vit_a <dbl>, vit_c <dbl>, calcium <dbl>,
## #   salad <chr>
#There are 17 measurements because there are 17 columns but for this part only the restaurants, calories, calories from fat are taken from McDonalds and Dairy Queen.

mcdonalds <- fastfood %>%
  filter (restaurant == "Mcdonalds")
dairy_queen <- fastfood %>%
  filter (restaurant == "Dairy Queen")

Exercise 1

Make a plot (or plots) to visualize the distributions of the amount of calories from fat of the options from these two restaurants. How do their centers, shapes, and spreads compare?

Based on the histograms below the centers of the plots are on similar places which is something over 200. The shape of the McDonalds histogram shows an extreme right skew and for Dairy Queen, while it is also right skewed it is not as skewed as the Mcdonalds graph. The spread for the Dairy Queen data is tighter because it only goes from 0 to 700 but in the McDonalds data it is 0 to 1400.
#Making histograms for the data
#histogram of McDonalds
hist(mcdonalds$cal_fat)

boxplot(mcdonalds$cal_fat, horizontal=TRUE) 

#histogram of dairy queen
hist(dairy_queen$cal_fat)

boxplot(dairy_queen$cal_fat, horizontal=TRUE) 

Exercise 2

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

While the data points don’t fall into the normal curve perfectly the data does have a bell shape, where the ends get closer to zero and in the middle there is a peak.
#This adds mean and sd for dairy queen so it is easier to access them when they are named
dqmean <- mean(dairy_queen$cal_fat)
dqsd<- sd(dairy_queen$cal_fat)

#Adding a density histogram and overlaying a curve on the histogram to see if it is relatively normal.
#the stat function adds the normal line on the curve using the same mean and sq and colors it to red
ggplot(data=dairy_queen, aes(x = cal_fat)) +
  geom_blank() +
  geom_histogram(aes(y=..density..)) +
  stat_function(fun= dnorm, args = c(mean=dqmean, sd=dqsd), col = "tomato")
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

#adding a bins part to change the amount of bins on the histogram which gives another look into the data
ggplot(data=dairy_queen, aes(x = cal_fat)) +
  geom_blank() +
  geom_histogram(aes(y=..density..), bins=20) +
  stat_function(fun= dnorm, args = c(mean=dqmean, sd=dqsd), col = "blue")

Exercise 3

Make a normal probability plot of sim_norm. Do all of the points fall on the line? How does this plot compare to the probability plot for the real data? (Since sim_norm is not a dataframe, it can be put directly into the sample argument and the data argument can be dropped.)

All points do not fall on the line and compared to the real data it is very similar to each other. The data could be relatively normal using the qqplot and comparing the simulated data to the actual data.
#This makes a qq plot to see if the graph is normal or not but unable to determine how close it really is
ggplot(data = dairy_queen, aes(sample = cal_fat)) + 
  geom_line(stat = "qq")

#this will make a simulated normal plot to compare the dairy queen data to and then gg plot with graph it
sim_norm <- rnorm(n = nrow(dairy_queen), mean = dqmean, sd = dqsd)

ggplot(data =NULL , aes(sample = sim_norm)) +
  geom_line(stat="qq")

Exercise 4

Does the normal probability plot for the calories from fat look similar to the plots created for the simulated data? That is, do the plots provide evidence that the calories from fat are nearly normal?

Comparing the two plots (real vs simulated) it shows that it is very similar to each other for the most part and since the plot of the simulated data shows that it is relatively normal that means that the actual dairy queen data is relatively normal.

Exercise 5

Using the same technique, determine whether or not the calories from McDonald’s menu appear to come from a normal distribution.

Comparing the two qqplots of McDonalds calories and the simulated graph clearly show that the Mcdonalds calories data is not relatively normal. The qqplot data of the McDonalds calories shows a right skew in the data.
#In this chunk of code it is going to look at the mcdonalds data of calories and plotting a qqplot from it
ggplot(data = mcdonalds, aes(sample = calories)) + 
  geom_line(stat = "qq")

#In this chunk it is going to simulate the data using the mean and sd from the mcdonalds data for calories
mcmean<- mean(mcdonalds$calories)
mcsd<- sd(mcdonalds$calories)

sim1_norm<- rnorm(n =nrow(mcdonalds), mean= mcmean, sd =mcsd )

ggplot(data = NULL, aes(sample = sim1_norm)) + 
  geom_line(stat = "qq")

Exercise 6

Write out two probability questions that you would like to answer about any of the restaurants in this dataset. Calculate those probabilities using both the theoretical normal distribution as well as the empirical distribution (four probabilities in all). Which one had a closer agreement between the two methods?

In the first question where it ask for the sodium content less than 1000 the numbers for pnorm and using the empirical method are fairly close to each other at 0.33. In the second question, the numbers are still fairly close at 0.113 compared to 0.119 which could indicate that this distribution is relatively normal.

Question 1

What is the probability that a McDonald’s menu item has sodium content less than 1000?

#this would check the mean and standard deviation in sodium of mcdonalds item
mean(mcdonalds$sodium)
## [1] 1437.895
sd(mcdonalds$sodium)
## [1] 1036.172
#Using pnorm to find the probability
pnorm(1000, 1437.895, 1036.172)
## [1] 0.3362905
#Using empirical method
mcdonalds %>%
  filter(sodium<1000) %>%
  summarise(percent = n() / nrow(mcdonalds))
## # A tibble: 1 x 1
##   percent
##     <dbl>
## 1   0.333

Question 2

What is the probability that an item in Dairy Queen has total fat above 50?

#show mean and sd of total fat for dq items
mean(dairy_queen$total_fat)
## [1] 28.85714
sd(dairy_queen$total_fat)
## [1] 17.51873
#using pnorm to find the probability
1- pnorm(50,28.857, 17.518)
## [1] 0.1137295
#using empirical method to find probability
dairy_queen %>%
    filter(total_fat>50) %>%
  summarise(percent = n() / nrow(dairy_queen))
## # A tibble: 1 x 1
##   percent
##     <dbl>
## 1   0.119
#showing how to use pnorm to find the area/probability that a Dairy Queen item has more than 600 calories from fat (1- is being used because it looking at the right side of the data)
1 - pnorm(q = 600, mean = dqmean, sd = dqsd)
## [1] 0.01501523
#this other way is the empirical version but seems way more complicated to code compared to just putting pnorm but it is like checking how many data points are more than 600 then dividing that by sample size

#The data is not reasonably close it is 1% compared to 5% 

dairy_queen %>% 
  filter(cal_fat > 600) %>%
  summarise(percent = n() / nrow(dairy_queen))
## # A tibble: 1 x 1
##   percent
##     <dbl>
## 1  0.0476

Exercise 7

Now let’s consider some of the other variables in the dataset. Out of all the different restaurants, which ones’ distribution is the closest to normal for sodium?

Burger King seems to have the closest to normal for sodium.

Insert any text here.

#Plotting a qqplot for all the restaurants sodium level and seeing which one is the most normal
qqnorm(mcdonalds$sodium, main = "McDonalds")

qqnorm(dairy_queen$sodium, main = "Dairy Queen")

#This basically looks at fast food and looks for arbys in the restaurants and then the 

arbys<- fastfood %>%
  filter(restaurant == "Arbys")
  qqnorm(arbys$sodium, main="Arbys")

burger_king<- fastfood %>%
  filter(restaurant == "Burger King")
  qqnorm(burger_king$sodium, main="Burger King")

taco_bell<- fastfood %>%
  filter(restaurant == "Taco Bell")
  qqnorm(taco_bell$sodium, main="Taco Bell")

subway<- fastfood %>%
  filter(restaurant == "Subway")
  qqnorm(subway$sodium, main="Subway")

sonic<- fastfood %>%
  filter(restaurant == "Sonic")
  qqnorm(sonic$sodium, main="Sonic")

chickfila<- fastfood %>%
  filter(restaurant == "Chick Fil-A")
  qqnorm(chickfila$sodium, main="Chick Fil-A")

Exercise 8

Note that some of the normal probability plots for sodium distributions seem to have a stepwise pattern. why do you think this might be the case?

There is a stepwise to some of the plots because of the diverse menu choices from these places from fries to drinks to burgers which could cause the pattern.

Exercise 9

As you can see, normal probability plots can be used both to assess normality and visualize skewness. Make a normal probability plot for the total carbohydrates from a restaurant of your choice. Based on this normal probability plot, is this variable left skewed, symmetric, or right skewed? Use a histogram to confirm your findings.

Based on the normal probability plot it could be symmetric because nothing really shoots up or down that much and based on the histogram the points tend to be all around the same frequency but on the right side it is much lower.
#I am going to use taco bell for total carbohydrates
qqnorm(taco_bell$total_carb, main="Taco Bell")

hist(taco_bell$total_carb)

LS0tDQp0aXRsZTogIkxhYiA0OiBUaGUgbm9ybWFsIGRpc3RyaWJ1dGlvbiINCmF1dGhvcjogIkxhbmNlIE51aXF1ZSINCmRhdGU6ICJgciBTeXMuRGF0ZSgpYCINCm91dHB1dDogb3BlbmludHJvOjpsYWJfcmVwb3J0DQotLS0NCg0KYGBge3IgbG9hZC1wYWNrYWdlcywgbWVzc2FnZT1GQUxTRX0NCmxpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeShvcGVuaW50cm8pDQoNCiMjaGVhZCBzaG93cyBhIHN1bW1hcnkgc2ltaWxhciB0byBnbGltcHNlDQpoZWFkKGZhc3Rmb29kKQ0KDQoNCmBgYA0KDQpgYGB7cn0NCiNUaGVyZSBhcmUgMTcgbWVhc3VyZW1lbnRzIGJlY2F1c2UgdGhlcmUgYXJlIDE3IGNvbHVtbnMgYnV0IGZvciB0aGlzIHBhcnQgb25seSB0aGUgcmVzdGF1cmFudHMsIGNhbG9yaWVzLCBjYWxvcmllcyBmcm9tIGZhdCBhcmUgdGFrZW4gZnJvbSBNY0RvbmFsZHMgYW5kIERhaXJ5IFF1ZWVuLg0KDQptY2RvbmFsZHMgPC0gZmFzdGZvb2QgJT4lDQogIGZpbHRlciAocmVzdGF1cmFudCA9PSAiTWNkb25hbGRzIikNCmRhaXJ5X3F1ZWVuIDwtIGZhc3Rmb29kICU+JQ0KICBmaWx0ZXIgKHJlc3RhdXJhbnQgPT0gIkRhaXJ5IFF1ZWVuIikNCg0KYGBgDQoNCg0KDQojIyMgRXhlcmNpc2UgMQ0KDQojIyMjIE1ha2UgYSBwbG90IChvciBwbG90cykgdG8gdmlzdWFsaXplIHRoZSBkaXN0cmlidXRpb25zIG9mIHRoZSBhbW91bnQgb2YgY2Fsb3JpZXMgZnJvbSBmYXQgb2YgdGhlIG9wdGlvbnMgZnJvbSB0aGVzZSB0d28gcmVzdGF1cmFudHMuIEhvdyBkbyB0aGVpciBjZW50ZXJzLCBzaGFwZXMsIGFuZCBzcHJlYWRzIGNvbXBhcmU/DQoNCiMjIyMjIEJhc2VkIG9uIHRoZSBoaXN0b2dyYW1zIGJlbG93IHRoZSBjZW50ZXJzIG9mIHRoZSBwbG90cyBhcmUgb24gc2ltaWxhciBwbGFjZXMgd2hpY2ggaXMgc29tZXRoaW5nIG92ZXIgMjAwLiBUaGUgc2hhcGUgb2YgdGhlIE1jRG9uYWxkcyBoaXN0b2dyYW0gc2hvd3MgYW4gZXh0cmVtZSByaWdodCBza2V3IGFuZCBmb3IgRGFpcnkgUXVlZW4sIHdoaWxlIGl0IGlzIGFsc28gcmlnaHQgc2tld2VkIGl0IGlzIG5vdCBhcyBza2V3ZWQgYXMgdGhlIE1jZG9uYWxkcyBncmFwaC4gVGhlIHNwcmVhZCBmb3IgdGhlIERhaXJ5IFF1ZWVuIGRhdGEgaXMgdGlnaHRlciBiZWNhdXNlIGl0IG9ubHkgZ29lcyBmcm9tIDAgdG8gNzAwIGJ1dCBpbiB0aGUgTWNEb25hbGRzIGRhdGEgaXQgaXMgMCB0byAxNDAwLg0KDQpgYGB7cn0NCiNNYWtpbmcgaGlzdG9ncmFtcyBmb3IgdGhlIGRhdGENCiNoaXN0b2dyYW0gb2YgTWNEb25hbGRzDQpoaXN0KG1jZG9uYWxkcyRjYWxfZmF0KQ0KYm94cGxvdChtY2RvbmFsZHMkY2FsX2ZhdCwgaG9yaXpvbnRhbD1UUlVFKSANCg0KI2hpc3RvZ3JhbSBvZiBkYWlyeSBxdWVlbg0KaGlzdChkYWlyeV9xdWVlbiRjYWxfZmF0KQ0KYm94cGxvdChkYWlyeV9xdWVlbiRjYWxfZmF0LCBob3Jpem9udGFsPVRSVUUpIA0KDQoNCmBgYA0KDQoNCg0KDQojIyMgRXhlcmNpc2UgMg0KDQojIyMjIEJhc2VkIG9uIHRoZSB0aGlzIHBsb3QsIGRvZXMgaXQgYXBwZWFyIHRoYXQgdGhlIGRhdGEgZm9sbG93IGEgbmVhcmx5IG5vcm1hbCBkaXN0cmlidXRpb24/DQoNCiMjIyMjIFdoaWxlIHRoZSBkYXRhIHBvaW50cyBkb24ndCBmYWxsIGludG8gdGhlIG5vcm1hbCBjdXJ2ZSBwZXJmZWN0bHkgdGhlIGRhdGEgZG9lcyBoYXZlIGEgYmVsbCBzaGFwZSwgd2hlcmUgdGhlIGVuZHMgZ2V0IGNsb3NlciB0byB6ZXJvIGFuZCBpbiB0aGUgbWlkZGxlIHRoZXJlIGlzIGEgcGVhay4gDQoNCmBgYHtyfQ0KI1RoaXMgYWRkcyBtZWFuIGFuZCBzZCBmb3IgZGFpcnkgcXVlZW4gc28gaXQgaXMgZWFzaWVyIHRvIGFjY2VzcyB0aGVtIHdoZW4gdGhleSBhcmUgbmFtZWQNCmRxbWVhbiA8LSBtZWFuKGRhaXJ5X3F1ZWVuJGNhbF9mYXQpDQpkcXNkPC0gc2QoZGFpcnlfcXVlZW4kY2FsX2ZhdCkNCg0KI0FkZGluZyBhIGRlbnNpdHkgaGlzdG9ncmFtIGFuZCBvdmVybGF5aW5nIGEgY3VydmUgb24gdGhlIGhpc3RvZ3JhbSB0byBzZWUgaWYgaXQgaXMgcmVsYXRpdmVseSBub3JtYWwuDQojdGhlIHN0YXQgZnVuY3Rpb24gYWRkcyB0aGUgbm9ybWFsIGxpbmUgb24gdGhlIGN1cnZlIHVzaW5nIHRoZSBzYW1lIG1lYW4gYW5kIHNxIGFuZCBjb2xvcnMgaXQgdG8gcmVkDQpnZ3Bsb3QoZGF0YT1kYWlyeV9xdWVlbiwgYWVzKHggPSBjYWxfZmF0KSkgKw0KICBnZW9tX2JsYW5rKCkgKw0KICBnZW9tX2hpc3RvZ3JhbShhZXMoeT0uLmRlbnNpdHkuLikpICsNCiAgc3RhdF9mdW5jdGlvbihmdW49IGRub3JtLCBhcmdzID0gYyhtZWFuPWRxbWVhbiwgc2Q9ZHFzZCksIGNvbCA9ICJ0b21hdG8iKQ0KDQojYWRkaW5nIGEgYmlucyBwYXJ0IHRvIGNoYW5nZSB0aGUgYW1vdW50IG9mIGJpbnMgb24gdGhlIGhpc3RvZ3JhbSB3aGljaCBnaXZlcyBhbm90aGVyIGxvb2sgaW50byB0aGUgZGF0YQ0KZ2dwbG90KGRhdGE9ZGFpcnlfcXVlZW4sIGFlcyh4ID0gY2FsX2ZhdCkpICsNCiAgZ2VvbV9ibGFuaygpICsNCiAgZ2VvbV9oaXN0b2dyYW0oYWVzKHk9Li5kZW5zaXR5Li4pLCBiaW5zPTIwKSArDQogIHN0YXRfZnVuY3Rpb24oZnVuPSBkbm9ybSwgYXJncyA9IGMobWVhbj1kcW1lYW4sIHNkPWRxc2QpLCBjb2wgPSAiYmx1ZSIpDQoNCmBgYA0KDQoNCg0KIyMjIEV4ZXJjaXNlIDMNCg0KIyMjIyBNYWtlIGEgbm9ybWFsIHByb2JhYmlsaXR5IHBsb3Qgb2Ygc2ltX25vcm0uIERvIGFsbCBvZiB0aGUgcG9pbnRzIGZhbGwgb24gdGhlIGxpbmU/IEhvdyBkb2VzIHRoaXMgcGxvdCBjb21wYXJlIHRvIHRoZSBwcm9iYWJpbGl0eSBwbG90IGZvciB0aGUgcmVhbCBkYXRhPyAoU2luY2Ugc2ltX25vcm0gaXMgbm90IGEgZGF0YWZyYW1lLCBpdCBjYW4gYmUgcHV0IGRpcmVjdGx5IGludG8gdGhlIHNhbXBsZSBhcmd1bWVudCBhbmQgdGhlIGRhdGEgYXJndW1lbnQgY2FuIGJlIGRyb3BwZWQuKQ0KDQojIyMjIyBBbGwgcG9pbnRzIGRvIG5vdCBmYWxsIG9uIHRoZSBsaW5lIGFuZCBjb21wYXJlZCB0byB0aGUgcmVhbCBkYXRhIGl0IGlzIHZlcnkgc2ltaWxhciB0byBlYWNoIG90aGVyLiBUaGUgZGF0YSBjb3VsZCBiZSByZWxhdGl2ZWx5IG5vcm1hbCB1c2luZyB0aGUgcXFwbG90IGFuZCBjb21wYXJpbmcgdGhlIHNpbXVsYXRlZCBkYXRhIHRvIHRoZSBhY3R1YWwgZGF0YS4NCg0KYGBge3J9DQojVGhpcyBtYWtlcyBhIHFxIHBsb3QgdG8gc2VlIGlmIHRoZSBncmFwaCBpcyBub3JtYWwgb3Igbm90IGJ1dCB1bmFibGUgdG8gZGV0ZXJtaW5lIGhvdyBjbG9zZSBpdCByZWFsbHkgaXMNCmdncGxvdChkYXRhID0gZGFpcnlfcXVlZW4sIGFlcyhzYW1wbGUgPSBjYWxfZmF0KSkgKyANCiAgZ2VvbV9saW5lKHN0YXQgPSAicXEiKQ0KDQojdGhpcyB3aWxsIG1ha2UgYSBzaW11bGF0ZWQgbm9ybWFsIHBsb3QgdG8gY29tcGFyZSB0aGUgZGFpcnkgcXVlZW4gZGF0YSB0byBhbmQgdGhlbiBnZyBwbG90IHdpdGggZ3JhcGggaXQNCnNpbV9ub3JtIDwtIHJub3JtKG4gPSBucm93KGRhaXJ5X3F1ZWVuKSwgbWVhbiA9IGRxbWVhbiwgc2QgPSBkcXNkKQ0KDQpnZ3Bsb3QoZGF0YSA9TlVMTCAsIGFlcyhzYW1wbGUgPSBzaW1fbm9ybSkpICsNCiAgZ2VvbV9saW5lKHN0YXQ9InFxIikNCmBgYA0KDQoNCg0KIyMjIEV4ZXJjaXNlIDQNCg0KIyMjIyBEb2VzIHRoZSBub3JtYWwgcHJvYmFiaWxpdHkgcGxvdCBmb3IgdGhlIGNhbG9yaWVzIGZyb20gZmF0IGxvb2sgc2ltaWxhciB0byB0aGUgcGxvdHMgY3JlYXRlZCBmb3IgdGhlIHNpbXVsYXRlZCBkYXRhPyBUaGF0IGlzLCBkbyB0aGUgcGxvdHMgcHJvdmlkZSBldmlkZW5jZSB0aGF0IHRoZSBjYWxvcmllcyBmcm9tIGZhdCBhcmUgbmVhcmx5IG5vcm1hbD8NCg0KIyMjIyMgQ29tcGFyaW5nIHRoZSB0d28gcGxvdHMgKHJlYWwgdnMgc2ltdWxhdGVkKSBpdCBzaG93cyB0aGF0IGl0IGlzIHZlcnkgc2ltaWxhciB0byBlYWNoIG90aGVyIGZvciB0aGUgbW9zdCBwYXJ0IGFuZCBzaW5jZSB0aGUgcGxvdCBvZiB0aGUgc2ltdWxhdGVkIGRhdGEgc2hvd3MgdGhhdCBpdCBpcyByZWxhdGl2ZWx5IG5vcm1hbCB0aGF0IG1lYW5zIHRoYXQgdGhlIGFjdHVhbCBkYWlyeSBxdWVlbiBkYXRhIGlzIHJlbGF0aXZlbHkgbm9ybWFsLg0KDQojIyMgRXhlcmNpc2UgNQ0KDQojIyMjIFVzaW5nIHRoZSBzYW1lIHRlY2huaXF1ZSwgZGV0ZXJtaW5lIHdoZXRoZXIgb3Igbm90IHRoZSBjYWxvcmllcyBmcm9tIE1jRG9uYWxk4oCZcyBtZW51IGFwcGVhciB0byBjb21lIGZyb20gYSBub3JtYWwgZGlzdHJpYnV0aW9uLg0KDQojIyMjIyBDb21wYXJpbmcgdGhlIHR3byBxcXBsb3RzIG9mIE1jRG9uYWxkcyBjYWxvcmllcyBhbmQgdGhlIHNpbXVsYXRlZCBncmFwaCBjbGVhcmx5IHNob3cgdGhhdCB0aGUgTWNkb25hbGRzIGNhbG9yaWVzIGRhdGEgaXMgbm90IHJlbGF0aXZlbHkgbm9ybWFsLiBUaGUgcXFwbG90IGRhdGEgb2YgdGhlIE1jRG9uYWxkcyBjYWxvcmllcyBzaG93cyBhIHJpZ2h0IHNrZXcgaW4gdGhlIGRhdGEuIA0KDQpgYGB7cn0NCiNJbiB0aGlzIGNodW5rIG9mIGNvZGUgaXQgaXMgZ29pbmcgdG8gbG9vayBhdCB0aGUgbWNkb25hbGRzIGRhdGEgb2YgY2Fsb3JpZXMgYW5kIHBsb3R0aW5nIGEgcXFwbG90IGZyb20gaXQNCmdncGxvdChkYXRhID0gbWNkb25hbGRzLCBhZXMoc2FtcGxlID0gY2Fsb3JpZXMpKSArIA0KICBnZW9tX2xpbmUoc3RhdCA9ICJxcSIpDQoNCiNJbiB0aGlzIGNodW5rIGl0IGlzIGdvaW5nIHRvIHNpbXVsYXRlIHRoZSBkYXRhIHVzaW5nIHRoZSBtZWFuIGFuZCBzZCBmcm9tIHRoZSBtY2RvbmFsZHMgZGF0YSBmb3IgY2Fsb3JpZXMNCm1jbWVhbjwtIG1lYW4obWNkb25hbGRzJGNhbG9yaWVzKQ0KbWNzZDwtIHNkKG1jZG9uYWxkcyRjYWxvcmllcykNCg0Kc2ltMV9ub3JtPC0gcm5vcm0obiA9bnJvdyhtY2RvbmFsZHMpLCBtZWFuPSBtY21lYW4sIHNkID1tY3NkICkNCg0KZ2dwbG90KGRhdGEgPSBOVUxMLCBhZXMoc2FtcGxlID0gc2ltMV9ub3JtKSkgKyANCiAgZ2VvbV9saW5lKHN0YXQgPSAicXEiKQ0KDQoNCmBgYA0KDQoNCg0KIyMjIEV4ZXJjaXNlIDYNCg0KIyMjIyBXcml0ZSBvdXQgdHdvIHByb2JhYmlsaXR5IHF1ZXN0aW9ucyB0aGF0IHlvdSB3b3VsZCBsaWtlIHRvIGFuc3dlciBhYm91dCBhbnkgb2YgdGhlIHJlc3RhdXJhbnRzIGluIHRoaXMgZGF0YXNldC4gQ2FsY3VsYXRlIHRob3NlIHByb2JhYmlsaXRpZXMgdXNpbmcgYm90aCB0aGUgdGhlb3JldGljYWwgbm9ybWFsIGRpc3RyaWJ1dGlvbiBhcyB3ZWxsIGFzIHRoZSBlbXBpcmljYWwgZGlzdHJpYnV0aW9uIChmb3VyIHByb2JhYmlsaXRpZXMgaW4gYWxsKS4gV2hpY2ggb25lIGhhZCBhIGNsb3NlciBhZ3JlZW1lbnQgYmV0d2VlbiB0aGUgdHdvIG1ldGhvZHM/DQoNCiMjIyMjIEluIHRoZSBmaXJzdCBxdWVzdGlvbiB3aGVyZSBpdCBhc2sgZm9yIHRoZSBzb2RpdW0gY29udGVudCBsZXNzIHRoYW4gMTAwMCB0aGUgbnVtYmVycyBmb3IgcG5vcm0gYW5kIHVzaW5nIHRoZSBlbXBpcmljYWwgbWV0aG9kIGFyZSBmYWlybHkgY2xvc2UgdG8gZWFjaCBvdGhlciBhdCAwLjMzLiBJbiB0aGUgc2Vjb25kIHF1ZXN0aW9uLCB0aGUgbnVtYmVycyBhcmUgc3RpbGwgZmFpcmx5IGNsb3NlIGF0IDAuMTEzIGNvbXBhcmVkIHRvIDAuMTE5IHdoaWNoIGNvdWxkIGluZGljYXRlIHRoYXQgdGhpcyBkaXN0cmlidXRpb24gaXMgcmVsYXRpdmVseSBub3JtYWwuDQoNCg0KIyMjIFF1ZXN0aW9uIDENCg0KIyMjIyBXaGF0IGlzIHRoZSBwcm9iYWJpbGl0eSB0aGF0IGEgTWNEb25hbGQncyBtZW51IGl0ZW0gaGFzIHNvZGl1bSBjb250ZW50IGxlc3MgdGhhbiAxMDAwPw0KDQpgYGB7cn0NCiN0aGlzIHdvdWxkIGNoZWNrIHRoZSBtZWFuIGFuZCBzdGFuZGFyZCBkZXZpYXRpb24gaW4gc29kaXVtIG9mIG1jZG9uYWxkcyBpdGVtDQptZWFuKG1jZG9uYWxkcyRzb2RpdW0pDQpzZChtY2RvbmFsZHMkc29kaXVtKQ0KDQojVXNpbmcgcG5vcm0gdG8gZmluZCB0aGUgcHJvYmFiaWxpdHkNCnBub3JtKDEwMDAsIDE0MzcuODk1LCAxMDM2LjE3MikNCg0KI1VzaW5nIGVtcGlyaWNhbCBtZXRob2QNCm1jZG9uYWxkcyAlPiUNCiAgZmlsdGVyKHNvZGl1bTwxMDAwKSAlPiUNCiAgc3VtbWFyaXNlKHBlcmNlbnQgPSBuKCkgLyBucm93KG1jZG9uYWxkcykpDQpgYGANCg0KIyMjIFF1ZXN0aW9uIDINCg0KIyMjIyBXaGF0IGlzIHRoZSBwcm9iYWJpbGl0eSB0aGF0IGFuIGl0ZW0gaW4gRGFpcnkgUXVlZW4gaGFzIHRvdGFsIGZhdCBhYm92ZSA1MD8NCg0KYGBge3J9DQojc2hvdyBtZWFuIGFuZCBzZCBvZiB0b3RhbCBmYXQgZm9yIGRxIGl0ZW1zDQptZWFuKGRhaXJ5X3F1ZWVuJHRvdGFsX2ZhdCkNCnNkKGRhaXJ5X3F1ZWVuJHRvdGFsX2ZhdCkNCg0KI3VzaW5nIHBub3JtIHRvIGZpbmQgdGhlIHByb2JhYmlsaXR5DQoxLSBwbm9ybSg1MCwyOC44NTcsIDE3LjUxOCkNCg0KI3VzaW5nIGVtcGlyaWNhbCBtZXRob2QgdG8gZmluZCBwcm9iYWJpbGl0eQ0KZGFpcnlfcXVlZW4gJT4lDQogICAgZmlsdGVyKHRvdGFsX2ZhdD41MCkgJT4lDQogIHN1bW1hcmlzZShwZXJjZW50ID0gbigpIC8gbnJvdyhkYWlyeV9xdWVlbikpDQpgYGANCg0KDQoNCg0KYGBge3J9DQojc2hvd2luZyBob3cgdG8gdXNlIHBub3JtIHRvIGZpbmQgdGhlIGFyZWEvcHJvYmFiaWxpdHkgdGhhdCBhIERhaXJ5IFF1ZWVuIGl0ZW0gaGFzIG1vcmUgdGhhbiA2MDAgY2Fsb3JpZXMgZnJvbSBmYXQgKDEtIGlzIGJlaW5nIHVzZWQgYmVjYXVzZSBpdCBsb29raW5nIGF0IHRoZSByaWdodCBzaWRlIG9mIHRoZSBkYXRhKQ0KMSAtIHBub3JtKHEgPSA2MDAsIG1lYW4gPSBkcW1lYW4sIHNkID0gZHFzZCkNCg0KI3RoaXMgb3RoZXIgd2F5IGlzIHRoZSBlbXBpcmljYWwgdmVyc2lvbiBidXQgc2VlbXMgd2F5IG1vcmUgY29tcGxpY2F0ZWQgdG8gY29kZSBjb21wYXJlZCB0byBqdXN0IHB1dHRpbmcgcG5vcm0gYnV0IGl0IGlzIGxpa2UgY2hlY2tpbmcgaG93IG1hbnkgZGF0YSBwb2ludHMgYXJlIG1vcmUgdGhhbiA2MDAgdGhlbiBkaXZpZGluZyB0aGF0IGJ5IHNhbXBsZSBzaXplDQoNCiNUaGUgZGF0YSBpcyBub3QgcmVhc29uYWJseSBjbG9zZSBpdCBpcyAxJSBjb21wYXJlZCB0byA1JSANCg0KZGFpcnlfcXVlZW4gJT4lIA0KICBmaWx0ZXIoY2FsX2ZhdCA+IDYwMCkgJT4lDQogIHN1bW1hcmlzZShwZXJjZW50ID0gbigpIC8gbnJvdyhkYWlyeV9xdWVlbikpDQpgYGANCg0KDQoNCg0KIyMjIEV4ZXJjaXNlIDcNCg0KIyMjIyBOb3cgbGV04oCZcyBjb25zaWRlciBzb21lIG9mIHRoZSBvdGhlciB2YXJpYWJsZXMgaW4gdGhlIGRhdGFzZXQuIE91dCBvZiBhbGwgdGhlIGRpZmZlcmVudCByZXN0YXVyYW50cywgd2hpY2ggb25lc+KAmSBkaXN0cmlidXRpb24gaXMgdGhlIGNsb3Nlc3QgdG8gbm9ybWFsIGZvciBzb2RpdW0/DQoNCiMjIyMjIEJ1cmdlciBLaW5nIHNlZW1zIHRvIGhhdmUgdGhlIGNsb3Nlc3QgdG8gbm9ybWFsIGZvciBzb2RpdW0uIA0KDQpJbnNlcnQgYW55IHRleHQgaGVyZS4NCmBgYHtyfQ0KI1Bsb3R0aW5nIGEgcXFwbG90IGZvciBhbGwgdGhlIHJlc3RhdXJhbnRzIHNvZGl1bSBsZXZlbCBhbmQgc2VlaW5nIHdoaWNoIG9uZSBpcyB0aGUgbW9zdCBub3JtYWwNCnFxbm9ybShtY2RvbmFsZHMkc29kaXVtLCBtYWluID0gIk1jRG9uYWxkcyIpDQoNCnFxbm9ybShkYWlyeV9xdWVlbiRzb2RpdW0sIG1haW4gPSAiRGFpcnkgUXVlZW4iKQ0KDQojVGhpcyBiYXNpY2FsbHkgbG9va3MgYXQgZmFzdCBmb29kIGFuZCBsb29rcyBmb3IgYXJieXMgaW4gdGhlIHJlc3RhdXJhbnRzIGFuZCB0aGVuIHRoZSANCg0KYXJieXM8LSBmYXN0Zm9vZCAlPiUNCiAgZmlsdGVyKHJlc3RhdXJhbnQgPT0gIkFyYnlzIikNCiAgcXFub3JtKGFyYnlzJHNvZGl1bSwgbWFpbj0iQXJieXMiKQ0KICANCmJ1cmdlcl9raW5nPC0gZmFzdGZvb2QgJT4lDQogIGZpbHRlcihyZXN0YXVyYW50ID09ICJCdXJnZXIgS2luZyIpDQogIHFxbm9ybShidXJnZXJfa2luZyRzb2RpdW0sIG1haW49IkJ1cmdlciBLaW5nIikNCiAgDQp0YWNvX2JlbGw8LSBmYXN0Zm9vZCAlPiUNCiAgZmlsdGVyKHJlc3RhdXJhbnQgPT0gIlRhY28gQmVsbCIpDQogIHFxbm9ybSh0YWNvX2JlbGwkc29kaXVtLCBtYWluPSJUYWNvIEJlbGwiKQ0KICANCnN1YndheTwtIGZhc3Rmb29kICU+JQ0KICBmaWx0ZXIocmVzdGF1cmFudCA9PSAiU3Vid2F5IikNCiAgcXFub3JtKHN1YndheSRzb2RpdW0sIG1haW49IlN1YndheSIpDQogIA0Kc29uaWM8LSBmYXN0Zm9vZCAlPiUNCiAgZmlsdGVyKHJlc3RhdXJhbnQgPT0gIlNvbmljIikNCiAgcXFub3JtKHNvbmljJHNvZGl1bSwgbWFpbj0iU29uaWMiKQ0KDQpjaGlja2ZpbGE8LSBmYXN0Zm9vZCAlPiUNCiAgZmlsdGVyKHJlc3RhdXJhbnQgPT0gIkNoaWNrIEZpbC1BIikNCiAgcXFub3JtKGNoaWNrZmlsYSRzb2RpdW0sIG1haW49IkNoaWNrIEZpbC1BIikNCiAgDQoNCmBgYA0KDQojIyMgRXhlcmNpc2UgOA0KDQojIyMjIE5vdGUgdGhhdCBzb21lIG9mIHRoZSBub3JtYWwgcHJvYmFiaWxpdHkgcGxvdHMgZm9yIHNvZGl1bSBkaXN0cmlidXRpb25zIHNlZW0gdG8gaGF2ZSBhIHN0ZXB3aXNlIHBhdHRlcm4uIHdoeSBkbyB5b3UgdGhpbmsgdGhpcyBtaWdodCBiZSB0aGUgY2FzZT8NCg0KIyMjIyMgVGhlcmUgaXMgYSBzdGVwd2lzZSB0byBzb21lIG9mIHRoZSBwbG90cyBiZWNhdXNlIG9mIHRoZSBkaXZlcnNlIG1lbnUgY2hvaWNlcyBmcm9tIHRoZXNlIHBsYWNlcyBmcm9tIGZyaWVzIHRvIGRyaW5rcyB0byBidXJnZXJzIHdoaWNoIGNvdWxkIGNhdXNlIHRoZSBwYXR0ZXJuLg0KDQojIyMgRXhlcmNpc2UgOQ0KDQojIyMjIEFzIHlvdSBjYW4gc2VlLCBub3JtYWwgcHJvYmFiaWxpdHkgcGxvdHMgY2FuIGJlIHVzZWQgYm90aCB0byBhc3Nlc3Mgbm9ybWFsaXR5IGFuZCB2aXN1YWxpemUgc2tld25lc3MuIE1ha2UgYSBub3JtYWwgcHJvYmFiaWxpdHkgcGxvdCBmb3IgdGhlIHRvdGFsIGNhcmJvaHlkcmF0ZXMgZnJvbSBhIHJlc3RhdXJhbnQgb2YgeW91ciBjaG9pY2UuIEJhc2VkIG9uIHRoaXMgbm9ybWFsIHByb2JhYmlsaXR5IHBsb3QsIGlzIHRoaXMgdmFyaWFibGUgbGVmdCBza2V3ZWQsIHN5bW1ldHJpYywgb3IgcmlnaHQgc2tld2VkPyBVc2UgYSBoaXN0b2dyYW0gdG8gY29uZmlybSB5b3VyIGZpbmRpbmdzLg0KDQojIyMjIyBCYXNlZCBvbiB0aGUgbm9ybWFsIHByb2JhYmlsaXR5IHBsb3QgaXQgY291bGQgYmUgc3ltbWV0cmljIGJlY2F1c2Ugbm90aGluZyByZWFsbHkgc2hvb3RzIHVwIG9yIGRvd24gdGhhdCBtdWNoIGFuZCBiYXNlZCBvbiB0aGUgaGlzdG9ncmFtIHRoZSBwb2ludHMgdGVuZCB0byBiZSBhbGwgYXJvdW5kIHRoZSBzYW1lIGZyZXF1ZW5jeSBidXQgb24gdGhlIHJpZ2h0IHNpZGUgaXQgaXMgbXVjaCBsb3dlci4NCg0KYGBge3J9DQojSSBhbSBnb2luZyB0byB1c2UgdGFjbyBiZWxsIGZvciB0b3RhbCBjYXJib2h5ZHJhdGVzDQpxcW5vcm0odGFjb19iZWxsJHRvdGFsX2NhcmIsIG1haW49IlRhY28gQmVsbCIpDQoNCmhpc3QodGFjb19iZWxsJHRvdGFsX2NhcmIpDQpgYGANCg0K