Directions: Complete two (2) of the 3 Tasks listed in the project.

  1. Complete either Task 1 or Task 2
  1. Complete Task 3

Note: If you Rmd file submission knits you will receive total of (5 points)

# load the packages needed
library(PASWR2)
library(ggplot2)
library(dplyr)
library(lattice)

1. (5 points) How many packages were loaded?

Answer:

Task 1: This is problem 8 on page 196 in the text w/t added questions

Note: Problem 8/p. 196 is modified

Some claim that the final hours aboard the Titanic were marked by class warfare;other claim it was characterized by male chivalry. The data frame TITANIC3 from the PASWR2 package contains information pertaining to class status pclass,survival of passengers survived, and gender sex, among others. Based on the information in the data frame:

Load and Access the Data from the package

A description of the variables can be found by running the code:

help("TITANIC3")
data("TITANIC3")

2. (5 points) How many observations and variables are in the TITANIC3 data?

Hint: Use the function dim(), glimpse() or str().

titanicRow <- function(x) dim(TITANIC3)[1]
titanicCol <- function(y) dim(TITANIC3)[2]
titanicRow()
[1] 1309
titanicCol()
[1] 14

Answer: There are 1309 rows and 14 columns in TITANIC3.

3. (5 points) Write code to show the first (or last) 6 observation in the TITANIC3 data?

TITANIC3 %>% select(1:6)

4. (5 points) Using the survived variable in the TITANIC3 data, which is of type integer (0/1) mutate it to a factor variable by running the code below and create new data frame TITANIC.

What are the new levels of survived and its type?

```{r}
Error: attempt to use zero-length variable name

Answer: No and Yes

5. (5 points) The code below produces summary for the TITANIC Data. Write code using the pipe %>% operator the produces the same result.

summary(TITANIC)

YOUR CODE HERE:


TITANIC %>% summary
 pclass    survived                               name          sex           age              sibsp            parch            ticket    
 1st:323   No :809   Connolly, Miss. Kate           :   2   female:466   Min.   : 0.1667   Min.   :0.0000   Min.   :0.000   CA. 2343:  11  
 2nd:277   Yes:500   Kelly, Mr. James               :   2   male  :843   1st Qu.:21.0000   1st Qu.:0.0000   1st Qu.:0.000   1601    :   8  
 3rd:709             Abbing, Mr. Anthony            :   1                Median :28.0000   Median :0.0000   Median :0.000   CA 2144 :   8  
                     Abbott, Master. Eugene Joseph  :   1                Mean   :29.8811   Mean   :0.4989   Mean   :0.385   3101295 :   7  
                     Abbott, Mr. Rossmore Edward    :   1                3rd Qu.:39.0000   3rd Qu.:1.0000   3rd Qu.:0.000   347077  :   7  
                     Abbott, Mrs. Stanton (Rosa Hunt:   1                Max.   :80.0000   Max.   :8.0000   Max.   :9.000   347082  :   7  
                     (Other)                        :1301                NA's   :263                                        (Other) :1261  
      fare                     cabin             embarked        boat          body                      home.dest  
 Min.   :  0.000                  :1014              :  2          :823   Min.   :  1.0                       :564  
 1st Qu.:  7.896   B57 B59 B63 B66:   5   Cherbourg  :270   13     : 39   1st Qu.: 72.0   New York, NY        : 64  
 Median : 14.454   C23 C25 C27    :   5   Queenstown :123   C      : 38   Median :155.0   London              : 14  
 Mean   : 33.295   G6             :   5   Southampton:914   15     : 37   Mean   :160.8   Montreal, PQ        : 10  
 3rd Qu.: 31.275   B96 B98        :   4                     14     : 33   3rd Qu.:256.0   Cornwall / Akron, OH:  9  
 Max.   :512.329   C22 C26        :   4                     4      : 31   Max.   :328.0   Paris, France       :  9  
 NA's   :1         (Other)        : 272                     (Other):308   NA's   :1188    (Other)             :639  

a) (5 points) Determine the fraction of survivors (survived) according to class (pclass).

Hint: Uncomment one of the first 3 lines n the code chunk below and then use the prop.table function.

T1 <- xtabs(~survived + pclass, data = TITANIC)

T1 <- table(TITANIC$survived,TITANIC$pclass)

T1 <- TITANIC %>% select(survived, pclass) %>% table()

T1
        pclass
survived 1st 2nd 3rd
     No  123 158 528
     Yes 200 119 181
prop.table(T1, margin = 2) # to produce the proportion per column (2), per row would be margin = 1
        pclass
survived       1st       2nd       3rd
     No  0.3808050 0.5703971 0.7447109
     Yes 0.6191950 0.4296029 0.2552891

Answer: In 1st class percent survived is 200 2nd class 119, 3rd class 181

b) (10 points) Compute the fraction of survivors according to class and gender. Did men in the first class or women in the third class have a higher survival rate?

Hint: Use the code below that creates 3-way table and then use prop.table() similarly to part a).

T2 <- TITANIC %>% select(pclass, sex, survived) %>% table()

T2
, , survived = No

      sex
pclass female male
   1st      5  118
   2nd     12  146
   3rd    110  418

, , survived = Yes

      sex
pclass female male
   1st    139   61
   2nd     94   25
   3rd    106   75
prop.table(T2)
, , survived = No

      sex
pclass      female        male
   1st 0.003819710 0.090145149
   2nd 0.009167303 0.111535523
   3rd 0.084033613 0.319327731

, , survived = Yes

      sex
pclass      female        male
   1st 0.106187930 0.046600458
   2nd 0.071810542 0.019098549
   3rd 0.080977846 0.057295646

Answer: 8.0977846 % of women in third class survived while 4.6600458 % of men in first class survived.

c) (10 points) How would you characterize the distribution of age(e.g., is it symmetric,positively/negatively skewed, unimodal, multimodal)?

Hint: Run the code below that produces some summary statistics and the density distribution. The commented code is old style of R programming, it is shown as it may resemble the textbook examples.

TITANIC %>% summarise(mean = mean(age, na.rm = TRUE), meadian = median(age, na.rm = TRUE))


# IQR(TITANIC$age, na.rm = TRUE) 

TITANIC %>% pull(age) %>% IQR(na.rm = TRUE) # pull() does extract the column from the data frame as vector object
[1] 18
# look at the density function to see if it is uni or bi-modal distribution
ggplot(data = TITANIC, aes(x = age)) +
geom_density(fill = "lightgreen") +
theme_bw()

Answer: Positively skewed

d) (5 points) Were the median and mean ages for females who survived higher or lower than for females who did not survive? Report the median and mean ages as well as an appropriate measure of spread for each statistic.

Hint: Using the dplyr package functions and the pipes operator %>% elegant code can produce summaries for each statistics - mean, median, sd, IRQ.

Without considering the pclass variable, namely regardless of passenger class:
Mean Summaries
TITANIC %>% group_by(sex, survived) %>% summarise(avg = mean(age, na.rm = TRUE))
`summarise()` has grouped output by 'sex'. You can override using the `.groups` argument.
NA
Standard deviation Summarries
TITANIC %>% group_by(sex, survived) %>% summarise(stdev = sd(age, na.rm = TRUE))
`summarise()` has grouped output by 'sex'. You can override using the `.groups` argument.

Median Summarries

TITANIC %>% group_by(sex, survived) %>% summarise(med = median(age, na.rm = TRUE))
`summarise()` has grouped output by 'sex'. You can override using the `.groups` argument.

IQR Summarries

TITANIC %>% group_by(sex, survived) %>% summarise(IQR = IQR(age, na.rm = TRUE))
`summarise()` has grouped output by 'sex'. You can override using the `.groups` argument.

Based on the summaries, answer the question below:

d-1)

For those who survived, the mean age for females is higher than the mean age for males?

d-2) For those who survived, the median age for females is higher than the median age for males?

Answer: _ _ _

6. (10 points) Now Consider the survived variable in the TITANIC data too, create similar summary statistics and answer the question below.

For those who survived, which class the mean age for females is *less** than the mean age for males? 3rd class

For those who survived, which class the median age for females is greater than the median age for males? 2nd class

Write your code in the chunk below:

TITANIC %>% group_by(pclass, sex, survived) %>% summarise(avg = median(age, na.rm = TRUE))
`summarise()` has grouped output by 'pclass', 'sex'. You can override using the `.groups` argument.

e) (5 points) Were the median and mean ages for males who survived higher or lower than for males who did not survive? Report the median and mean ages as well as an appropriate measure of spread for each statistic.

Hint: Read the output of the code in part d)

Answer: Mean Survived: 26.97778. Mean Did Not Survive: 31.51641. Mean Did Not SUrvive is higher. Median Survived: 27. Median Did Not Survive: 29. Mean Did Not Survive higher.

f) (5 points) What was the age of the youngest female in the first class who survived? 14

Hint: Complete the code below by specify which variable you want to be arranged.

Arranging in descending order is achieved by specifying in the arrange() function desc(var_name).

7. (5 points) What was the age of the oldest female (male) in the first class who survived?

YOUR CODE HERE:

Answer:

Oldest female in 1st class survived was 76 years of age.

Oldest male in 1st class survived was 80 years of age.

g) (10 points) Do the data suggest that the final hours aboard the Titanic were characterized by class warfare, male chivalry, some combination of both, or neither? Justify your answer based on computations above, or based on other explorations of the data. It seems that the answer is that is was dominated by classes and male chivalry. Many more men than women died and a good amount more first class survived than the other two classes accoording to the charts below.

Hint: Review and explain the exploratory graphs created by the code chunk. How they support you justification?

Task 3 (10 points) Create a map with leaflet package, by completing the code below, that displays 5 UNC system schools using their geographic locations. Draw circles with radius proportionate to the school size using the addCircles() function.

Try: E.g. addCircles(weight = 1, radius = sqrt(UNC_schools$size)*100)

set.seed(2020-02-01)

library(leaflet)

# The code below will create list of 5 UNC university data points with lat & lng, name and school size
# Create data frame with column variables name (of UNC school), students (size), lat, lng)
UNC_schools <- data.frame(name = c("NC State", "UNC Chapel Hill", "FSU", "ECU", "UNC Charlotte"),
                        size = c(30130, 28136, 6000, 25990, 25990),
                        lat = c(36.0373638, 35.9050353, 35.0726, 35.6073769, 35.2036325),
                        lng = c(-79.0355663, -79.0477533, -78.8924739, -77.3671566, -80.8401145))


# Use the data frame to draw map and circles proportional to the school sizes of the cities
UNC_schools %>%
  leaflet() %>%
  addTiles() %>%
  addCircles(weight = 1, radius = sqrt(UNC_schools$size)*150) # try adjusting the radius by multiplying with 50 instead of 100. What do you notice?
Assuming "lng" and "lat" are longitude and latitude, respectively

Task 3 (Extra Credit, 5 pts): Add at least two more UNC schools, using their location data and enrollment numbers. Modify the code above and update the map for all schools included.

LS0tDQp0aXRsZTogIlNUQVQyNzAgLSBQcm9qZWN0IDEiDQphdXRob3I6ICJNYXR0aGV3IERhbW1lciINCmRhdGU6ICdgciBTeXMuRGF0ZSgpYCcNCm91dHB1dDogaHRtbF9ub3RlYm9vaw0KLS0tDQoNCg0KYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9DQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUpDQpgYGANCg0KIyMjIERpcmVjdGlvbnM6IENvbXBsZXRlIHR3byAoMikgb2YgdGhlIDMgVGFza3MgbGlzdGVkIGluIHRoZSBwcm9qZWN0Lg0KDQo+IDEuIENvbXBsZXRlIGVpdGhlciBUYXNrIDEgb3IgVGFzayAyDQoNCj4gMi4gQ29tcGxldGUgVGFzayAzIA0KDQoqKk5vdGU6KiogSWYgeW91IGBSbWRgIGZpbGUgc3VibWlzc2lvbiBrbml0cyB5b3Ugd2lsbCByZWNlaXZlIHRvdGFsIG9mICoqKDUgcG9pbnRzKSoqDQoNCmBgYHtyIHBhY2thZ2VzLCBlY2hvID0gVFJVRSwgbWVzc2FnZSA9IEZBTFNFfQ0KIyBsb2FkIHRoZSBwYWNrYWdlcyBuZWVkZWQNCmxpYnJhcnkoUEFTV1IyKQ0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeShkcGx5cikNCmxpYnJhcnkobGF0dGljZSkNCmBgYA0KDQojIyMjICoqMS4gKDUgcG9pbnRzKSoqIEhvdyBtYW55IHBhY2thZ2VzIHdlcmUgbG9hZGVkPw0KDQpBbnN3ZXI6IA0KDQoNCiMjIFRhc2sgMTogKipUaGlzIGlzIHByb2JsZW0gOCBvbiBwYWdlIDE5NiBpbiB0aGUgdGV4dCoqIHcvdCBhZGRlZCBxdWVzdGlvbnMNCg0KTm90ZTogKipQcm9ibGVtIDgvcC4gMTk2IGlzIG1vZGlmaWVkKiogDQoNClNvbWUgY2xhaW0gdGhhdCB0aGUgZmluYWwgaG91cnMgYWJvYXJkIHRoZSBUaXRhbmljIHdlcmUgbWFya2VkIGJ5IGNsYXNzIHdhcmZhcmU7b3RoZXIgIGNsYWltICBpdCAgd2FzICBjaGFyYWN0ZXJpemVkICBieSBtYWxlIGNoaXZhbHJ5LiAgIFRoZSAgZGF0YSAgZnJhbWUgYFRJVEFOSUMzYCBmcm9tIHRoZSBgUEFTV1IyYCBwYWNrYWdlIGNvbnRhaW5zIGluZm9ybWF0aW9uIHBlcnRhaW5pbmcgdG8gY2xhc3Mgc3RhdHVzIGBwY2xhc3NgLHN1cnZpdmFsIG9mIHBhc3NlbmdlcnMgYHN1cnZpdmVkYCwgIGFuZCBnZW5kZXIgYHNleGAsICBhbW9uZyBvdGhlcnMuICBCYXNlZCBvbiB0aGUgaW5mb3JtYXRpb24gaW4gdGhlIGRhdGEgZnJhbWU6DQoNCiMjIyBMb2FkIGFuZCBBY2Nlc3MgdGhlIERhdGEgZnJvbSB0aGUgcGFja2FnZSAgDQoNCkEgZGVzY3JpcHRpb24gb2YgdGhlIHZhcmlhYmxlcyBjYW4gYmUgZm91bmQgYnkgcnVubmluZyB0aGUgY29kZToNCg0KYGBge3IgZGF0YSBkZXNjcmlwdGlvbn0NCmhlbHAoIlRJVEFOSUMzIikNCmRhdGEoIlRJVEFOSUMzIikNCmBgYA0KDQojIyMjICoqMi4gKDUgcG9pbnRzKSoqIEhvdyBtYW55IG9ic2VydmF0aW9ucyBhbmQgdmFyaWFibGVzIGFyZSBpbiB0aGUgYFRJVEFOSUMzYCBkYXRhPyANCkhpbnQ6IFVzZSB0aGUgZnVuY3Rpb24gYGRpbSgpYCwgYGdsaW1wc2UoKWAgb3IgYHN0cigpYC4gDQoNCg0KYGBge3IgZGltZW50aW9uc30NCnRpdGFuaWNSb3cgPC0gZnVuY3Rpb24oeCkgZGltKFRJVEFOSUMzKVsxXQ0KdGl0YW5pY0NvbCA8LSBmdW5jdGlvbih5KSBkaW0oVElUQU5JQzMpWzJdDQp0aXRhbmljUm93KCkNCnRpdGFuaWNDb2woKQ0KDQpgYGANCg0KKipBbnN3ZXI6KiogVGhlcmUgYXJlIDEzMDkgIHJvd3MgYW5kIDE0IGNvbHVtbnMgaW4gYFRJVEFOSUMzYC4NCg0KIyMjIyAqKjMuICg1IHBvaW50cykqKiBXcml0ZSBjb2RlIHRvIHNob3cgdGhlIGZpcnN0IChvciBsYXN0KSA2IG9ic2VydmF0aW9uIGluIHRoZSBgVElUQU5JQzNgIGRhdGE/IA0KDQpgYGB7cn0NClRJVEFOSUMzICU+JSBzZWxlY3QoMTo2KQ0KDQoNCmBgYA0KDQojIyMjICoqNC4gKDUgcG9pbnRzKSoqIFVzaW5nIHRoZSBgc3Vydml2ZWRgIHZhcmlhYmxlIGluIHRoZSBgVElUQU5JQzNgIGRhdGEsIHdoaWNoIGlzIG9mIHR5cGUgaW50ZWdlciBgKDAvMSlgIG11dGF0ZSBpdCB0byBhIGZhY3RvciB2YXJpYWJsZSBieSBydW5uaW5nIHRoZSBjb2RlIGJlbG93IGFuZCBjcmVhdGUgKipuZXcqKiBkYXRhIGZyYW1lIGBUSVRBTklDYC4NCg0KV2hhdCBhcmUgdGhlIG5ldyBsZXZlbHMgb2YgYHN1cnZpdmVkYCBhbmQgaXRzIHR5cGU/IA0KDQpgYGB7cn0NClRJVEFOSUMgPC0gVElUQU5JQzMgJT4lIG11dGF0ZShzdXJ2aXZlZCA9IGZhY3RvcihzdXJ2aXZlZCwgbGV2ZWxzID0gMDoxLCBsYWJlbHMgPSBjKCJObyIsICJZZXMiKSkpDQpgYGANCg0KKipBbnN3ZXI6KiogDQpObyBhbmQgWWVzDQoNCiMjIyMgKio1LiAoNSBwb2ludHMpKiogVGhlIGNvZGUgYmVsb3cgcHJvZHVjZXMgc3VtbWFyeSBmb3IgdGhlIGBUSVRBTklDYCBEYXRhLiBXcml0ZSBjb2RlIHVzaW5nIHRoZSBwaXBlICU+JSBvcGVyYXRvciB0aGUgcHJvZHVjZXMgdGhlIHNhbWUgcmVzdWx0LiANCg0KDQoNCmBgYHtyfQ0Kc3VtbWFyeShUSVRBTklDKQ0KDQpgYGANCg0KWU9VUiBDT0RFIEhFUkU6DQpgYGB7cn0NCg0KVElUQU5JQyAlPiUgc3VtbWFyeQ0KDQoNCmBgYA0KDQoNCg0KIyMjIyAqKmEpICg1IHBvaW50cykqKiBEZXRlcm1pbmUgdGhlIGZyYWN0aW9uIG9mIHN1cnZpdm9ycyAoYHN1cnZpdmVkYCkgYWNjb3JkaW5nIHRvIGNsYXNzIChgcGNsYXNzYCkuDQoNCioqSGludDoqKiBVbmNvbW1lbnQgb25lIG9mIHRoZSBmaXJzdCAzIGxpbmVzIG4gdGhlIGNvZGUgY2h1bmsgYmVsb3cgYW5kIHRoZW4gdXNlIHRoZSBgcHJvcC50YWJsZWAgZnVuY3Rpb24uIA0KDQpgYGB7ciBwYXJ0LWF9DQpUMSA8LSB4dGFicyh+c3Vydml2ZWQgKyBwY2xhc3MsIGRhdGEgPSBUSVRBTklDKQ0KDQpUMSA8LSB0YWJsZShUSVRBTklDJHN1cnZpdmVkLFRJVEFOSUMkcGNsYXNzKQ0KDQpUMSA8LSBUSVRBTklDICU+JSBzZWxlY3Qoc3Vydml2ZWQsIHBjbGFzcykgJT4lIHRhYmxlKCkNCg0KVDENCg0KcHJvcC50YWJsZShUMSwgbWFyZ2luID0gMikgIyB0byBwcm9kdWNlIHRoZSBwcm9wb3J0aW9uIHBlciBjb2x1bW4gKDIpLCBwZXIgcm93IHdvdWxkIGJlIG1hcmdpbiA9IDENCmBgYA0KDQoNCioqQW5zd2VyOioqIEluIDFzdCBjbGFzcyBwZXJjZW50IHN1cnZpdmVkIGlzIDIwMCAybmQgY2xhc3MgMTE5LCAzcmQgY2xhc3MgMTgxDQoNCg0KIyMjIyAqKmIpICgxMCBwb2ludHMpKiogQ29tcHV0ZSB0aGUgZnJhY3Rpb24gb2Ygc3Vydml2b3JzIGFjY29yZGluZyB0byBjbGFzcyBhbmQgZ2VuZGVyLiAgRGlkIG1lbiBpbiB0aGUgZmlyc3QgY2xhc3Mgb3Igd29tZW4gaW4gdGhlIHRoaXJkIGNsYXNzIGhhdmUgYSBoaWdoZXIgc3Vydml2YWwgcmF0ZT8NCg0KSGludDogVXNlIHRoZSBjb2RlIGJlbG93IHRoYXQgY3JlYXRlcyAzLXdheSB0YWJsZSBhbmQgdGhlbiB1c2UgYHByb3AudGFibGUoKWAgc2ltaWxhcmx5IHRvIHBhcnQgYSkuDQoNCmBgYHtyIHBhcnQtYn0NClQyIDwtIFRJVEFOSUMgJT4lIHNlbGVjdChwY2xhc3MsIHNleCwgc3Vydml2ZWQpICU+JSB0YWJsZSgpDQoNClQyDQoNCnByb3AudGFibGUoVDIpDQoNCmBgYA0KDQoqKkFuc3dlcjoqKiA4LjA5Nzc4NDYgJSBvZiB3b21lbiBpbiB0aGlyZCBjbGFzcyBzdXJ2aXZlZCB3aGlsZSA0LjY2MDA0NTggJSBvZiBtZW4gaW4gZmlyc3QgY2xhc3Mgc3Vydml2ZWQuDQoNCg0KIyMjIyAqKmMpICgxMCBwb2ludHMpKiogSG93ICB3b3VsZCAgeW91ICBjaGFyYWN0ZXJpemUgIHRoZSAgZGlzdHJpYnV0aW9uICBvZiBhZ2UoZS5nLiwgIGlzICBpdCBzeW1tZXRyaWMscG9zaXRpdmVseS9uZWdhdGl2ZWx5IHNrZXdlZCwgdW5pbW9kYWwsIG11bHRpbW9kYWwpPw0KDQpIaW50OiBSdW4gdGhlIGNvZGUgYmVsb3cgdGhhdCBwcm9kdWNlcyBzb21lIHN1bW1hcnkgc3RhdGlzdGljcyBhbmQgdGhlIGRlbnNpdHkgZGlzdHJpYnV0aW9uLg0KVGhlIGNvbW1lbnRlZCBjb2RlIGlzIG9sZCBzdHlsZSBvZiBSIHByb2dyYW1taW5nLCBpdCBpcyBzaG93biBhcyBpdCBtYXkgcmVzZW1ibGUgdGhlIHRleHRib29rIGV4YW1wbGVzLg0KDQpgYGB7ciBwYXJ0LWN9DQojIEZpbmRpbmcgc3VtbWFyeSBzdGF0aXN0aWNzDQoNCiNtZWRpYW4oVElUQU5JQyRhZ2UsIG5hLnJtID0gVFJVRSkgIyBvbGQgc3R5bGUgDQojbWVhbihUSVRBTklDJGFnZSwgbmEucm0gPSBUUlVFKSAjIG9sZCBzdHlsZQ0KDQojIGRwbHlyIHN0eWxlDQpUSVRBTklDICU+JSBzdW1tYXJpc2UobWVhbiA9IG1lYW4oYWdlLCBuYS5ybSA9IFRSVUUpLCBtZWFkaWFuID0gbWVkaWFuKGFnZSwgbmEucm0gPSBUUlVFKSkNCg0KIyBJUVIoVElUQU5JQyRhZ2UsIG5hLnJtID0gVFJVRSkgDQoNClRJVEFOSUMgJT4lIHB1bGwoYWdlKSAlPiUgSVFSKG5hLnJtID0gVFJVRSkgIyBwdWxsKCkgZG9lcyBleHRyYWN0IHRoZSBjb2x1bW4gZnJvbSB0aGUgZGF0YSBmcmFtZSBhcyB2ZWN0b3Igb2JqZWN0DQoNCiMgbG9vayBhdCB0aGUgZGVuc2l0eSBmdW5jdGlvbiB0byBzZWUgaWYgaXQgaXMgdW5pIG9yIGJpLW1vZGFsIGRpc3RyaWJ1dGlvbg0KZ2dwbG90KGRhdGEgPSBUSVRBTklDLCBhZXMoeCA9IGFnZSkpICsNCmdlb21fZGVuc2l0eShmaWxsID0gImxpZ2h0Z3JlZW4iKSArDQp0aGVtZV9idygpDQoNCmBgYA0KDQoqKkFuc3dlcjoqKiBQb3NpdGl2ZWx5IHNrZXdlZA0KDQoNCiMjIyMgKipkKSAoNSBwb2ludHMpKiogV2VyZSB0aGUgbWVkaWFuIGFuZCBtZWFuIGFnZXMgZm9yIGZlbWFsZXMgd2hvIHN1cnZpdmVkIGhpZ2hlciBvciBsb3dlciB0aGFuIGZvciBmZW1hbGVzIHdobyBkaWQgbm90IHN1cnZpdmU/ICBSZXBvcnQgdGhlIG1lZGlhbiBhbmQgbWVhbiBhZ2VzIGFzIHdlbGwgYXMgYW4gYXBwcm9wcmlhdGUgbWVhc3VyZSBvZiBzcHJlYWQgZm9yIGVhY2ggc3RhdGlzdGljLg0KDQoqKkhpbnQ6KiogVXNpbmcgdGhlIGBkcGx5cmAgcGFja2FnZSBmdW5jdGlvbnMgYW5kIHRoZSBwaXBlcyBvcGVyYXRvciBgICU+JSBgIGVsZWdhbnQgY29kZSBjYW4gcHJvZHVjZSBzdW1tYXJpZXMgZm9yIGVhY2ggc3RhdGlzdGljcyAtIG1lYW4sIG1lZGlhbiwgc2QsIElSUS4NCg0KDQojIyMjIyBXaXRob3V0IGNvbnNpZGVyaW5nIHRoZSBgcGNsYXNzYCB2YXJpYWJsZSwgbmFtZWx5IHJlZ2FyZGxlc3Mgb2YgcGFzc2VuZ2VyIGNsYXNzOg0KDQojIyMjIyBNZWFuIFN1bW1hcmllcw0KYGBge3J9DQojIG1lYW4gc3VtbWFyaWVzDQpUSVRBTklDICU+JSBncm91cF9ieShzZXgsIHN1cnZpdmVkKSAlPiUgc3VtbWFyaXNlKGF2ZyA9IG1lYW4oYWdlLCBuYS5ybSA9IFRSVUUpKQ0KDQpgYGANCg0KIyMjIyMgU3RhbmRhcmQgZGV2aWF0aW9uIFN1bW1hcnJpZXMgDQpgYGB7cn0NCiMgc2Qgc3VtbWFyaWVzDQpUSVRBTklDICU+JSBncm91cF9ieShzZXgsIHN1cnZpdmVkKSAlPiUgc3VtbWFyaXNlKHN0ZGV2ID0gc2QoYWdlLCBuYS5ybSA9IFRSVUUpKQ0KDQpgYGANCg0KIyMjIyBNZWRpYW4gU3VtbWFycmllcyANCg0KYGBge3J9DQojIG1lZGlhbiBzdW1tYXJpZXMNClRJVEFOSUMgJT4lIGdyb3VwX2J5KHNleCwgc3Vydml2ZWQpICU+JSBzdW1tYXJpc2UobWVkID0gbWVkaWFuKGFnZSwgbmEucm0gPSBUUlVFKSkNCg0KYGBgDQoNCiMjIyMgSVFSIFN1bW1hcnJpZXMgDQoNCmBgYHtyfQ0KIyBJUVIgc3VtbWFyaWVzDQpUSVRBTklDICU+JSBncm91cF9ieShzZXgsIHN1cnZpdmVkKSAlPiUgc3VtbWFyaXNlKElRUiA9IElRUihhZ2UsIG5hLnJtID0gVFJVRSkpDQoNCmBgYA0KDQpCYXNlZCBvbiB0aGUgc3VtbWFyaWVzLCBhbnN3ZXIgdGhlIHF1ZXN0aW9uIGJlbG93Og0KDQoqKmQtMSkqKg0KDQpGb3IgdGhvc2Ugd2hvIHN1cnZpdmVkLCB0aGUgbWVhbiBhZ2UgZm9yIGZlbWFsZXMgaXMgaGlnaGVyIHRoYW4gdGhlIG1lYW4gYWdlIGZvciBtYWxlcz8gDQoNCioqZC0yKSoqDQpGb3IgdGhvc2Ugd2hvIHN1cnZpdmVkLCB0aGUgbWVkaWFuIGFnZSBmb3IgZmVtYWxlcyBpcyBoaWdoZXIgdGhhbiB0aGUgbWVkaWFuIGFnZSBmb3IgbWFsZXM/DQoNCg0KDQoqKkFuc3dlcjoqKiBfIF8gXw0KDQoNCiMjIyMgKio2LiAoMTAgcG9pbnRzKSoqIE5vdyBDb25zaWRlciB0aGUgYHN1cnZpdmVkYCB2YXJpYWJsZSBpbiB0aGUgYFRJVEFOSUNgIGRhdGEgdG9vLCBjcmVhdGUgc2ltaWxhciBzdW1tYXJ5IHN0YXRpc3RpY3MgYW5kIGFuc3dlciB0aGUgcXVlc3Rpb24gYmVsb3cuDQoNCkZvciB0aG9zZSB3aG8gc3Vydml2ZWQsIHdoaWNoIGNsYXNzIHRoZSBtZWFuIGFnZSBmb3IgZmVtYWxlcyBpcyAqbGVzcyoqIHRoYW4gdGhlIG1lYW4gYWdlIGZvciBtYWxlcz8gM3JkIGNsYXNzDQoNCkZvciB0aG9zZSB3aG8gc3Vydml2ZWQsIHdoaWNoIGNsYXNzIHRoZSBtZWRpYW4gYWdlIGZvciBmZW1hbGVzIGlzICoqZ3JlYXRlcioqIHRoYW4gdGhlIG1lZGlhbiBhZ2UgZm9yIG1hbGVzPyAybmQgY2xhc3MNCg0KDQpXcml0ZSB5b3VyIGNvZGUgaW4gdGhlIGNodW5rIGJlbG93Og0KDQpgYGB7cn0NCiMgbWVhbiBzdW1tYXJpZXMNClRJVEFOSUMgJT4lIGdyb3VwX2J5KHBjbGFzcywgc2V4LCBzdXJ2aXZlZCkgJT4lIHN1bW1hcmlzZShhdmcgPSBtZWFuKGFnZSwgbmEucm0gPSBUUlVFKSkNCg0KIyBtZWRpYW4gc3VtbWFyaWVzDQojIHdyaXRlIHlvdXIgY29kZSBoZXJlDQpUSVRBTklDICU+JSBncm91cF9ieShwY2xhc3MsIHNleCwgc3Vydml2ZWQpICU+JSBzdW1tYXJpc2UoYXZnID0gbWVkaWFuKGFnZSwgbmEucm0gPSBUUlVFKSkNCmBgYA0KDQoNCiMjIyMgKiplKSAoNSBwb2ludHMpKiogIFdlcmUgdGhlIG1lZGlhbiBhbmQgbWVhbiBhZ2VzIGZvciBtYWxlcyB3aG8gc3Vydml2ZWQgaGlnaGVyIG9yIGxvd2VyIHRoYW4gZm9yIG1hbGVzIHdobyBkaWQgbm90IHN1cnZpdmU/ICBSZXBvcnQgdGhlIG1lZGlhbiBhbmQgbWVhbiBhZ2VzIGFzIHdlbGwgYXMgYW4gYXBwcm9wcmlhdGUgbWVhc3VyZSBvZiBzcHJlYWQgZm9yIGVhY2ggc3RhdGlzdGljLg0KDQoqKkhpbnQ6KiogUmVhZCB0aGUgb3V0cHV0IG9mIHRoZSBjb2RlIGluIHBhcnQgZCkNCg0KKipBbnN3ZXI6KiogTWVhbiBTdXJ2aXZlZDogMjYuOTc3NzguIE1lYW4gRGlkIE5vdCBTdXJ2aXZlOiAzMS41MTY0MS4gTWVhbiBEaWQgTm90IFNVcnZpdmUgaXMgaGlnaGVyLiBNZWRpYW4gU3Vydml2ZWQ6IDI3LiAgTWVkaWFuIERpZCBOb3QgU3Vydml2ZTogMjkuIE1lYW4gRGlkIE5vdCBTdXJ2aXZlIGhpZ2hlci4NCg0KDQojIyMjICoqZikgKDUgcG9pbnRzKSoqICBXaGF0IHdhcyB0aGUgYWdlIG9mIHRoZSB5b3VuZ2VzdCBmZW1hbGUgaW4gdGhlIGZpcnN0IGNsYXNzIHdobyBzdXJ2aXZlZD8gMTQNCg0KKipIaW50OioqIENvbXBsZXRlIHRoZSBjb2RlIGJlbG93IGJ5IHNwZWNpZnkgd2hpY2ggdmFyaWFibGUgeW91IHdhbnQgdG8gYmUgYXJyYW5nZWQuDQoNCmBgYHtyfQ0KVElUQU5JQyAlPiUgZmlsdGVyIChzZXggPT0iZmVtYWxlIiAmIHN1cnZpdmVkID09IlllcyIgJiBwY2xhc3MgPT0gIjFzdCIpICU+JSBhcnJhbmdlKGFnZSkNCmBgYA0KDQpBcnJhbmdpbmcgaW4gZGVzY2VuZGluZyBvcmRlciBpcyBhY2hpZXZlZCBieSBzcGVjaWZ5aW5nIGluIHRoZSBgYXJyYW5nZSgpYCBmdW5jdGlvbiBgZGVzYyh2YXJfbmFtZSlgLg0KDQojIyMjICoqNy4gKDUgcG9pbnRzKSoqIFdoYXQgd2FzIHRoZSBhZ2Ugb2YgdGhlIG9sZGVzdCBmZW1hbGUgKG1hbGUpIGluIHRoZSBmaXJzdCBjbGFzcyB3aG8gc3Vydml2ZWQ/IA0KDQpZT1VSIENPREUgSEVSRToNCmBgYHtyfQ0KVElUQU5JQyAlPiUgZmlsdGVyIChzZXggPT0iZmVtYWxlIiAmIHN1cnZpdmVkID09IlllcyIgJiBwY2xhc3MgPT0gIjFzdCIpICU+JSBhcnJhbmdlKGRlc2MoYWdlKSkNCg0KVElUQU5JQyAlPiUgZmlsdGVyIChzZXggPT0ibWFsZSIgJiBzdXJ2aXZlZCA9PSJZZXMiICYgcGNsYXNzID09ICIxc3QiKSAlPiUgYXJyYW5nZShkZXNjKGFnZSkpDQpgYGANCg0KKipBbnN3ZXI6KiogDQoNCk9sZGVzdCBmZW1hbGUgaW4gMXN0IGNsYXNzIHN1cnZpdmVkIHdhcyA3NiB5ZWFycyBvZiBhZ2UuDQoNCk9sZGVzdCBtYWxlIGluIDFzdCBjbGFzcyBzdXJ2aXZlZCB3YXMgODAgeWVhcnMgb2YgYWdlLg0KDQojIyMjICoqZykgKDEwIHBvaW50cykqKiBEbyB0aGUgZGF0YSBzdWdnZXN0IHRoYXQgdGhlIGZpbmFsIGhvdXJzIGFib2FyZCB0aGUgVGl0YW5pYyB3ZXJlIGNoYXJhY3Rlcml6ZWQgYnkgY2xhc3Mgd2FyZmFyZSwgbWFsZSBjaGl2YWxyeSwgc29tZSBjb21iaW5hdGlvbiBvZiBib3RoLCBvciBuZWl0aGVyPyBKdXN0aWZ5IHlvdXIgYW5zd2VyIGJhc2VkIG9uIGNvbXB1dGF0aW9ucyBhYm92ZSwgb3IgYmFzZWQgb24gb3RoZXIgZXhwbG9yYXRpb25zIG9mIHRoZSBkYXRhLiBJdCBzZWVtcyB0aGF0IHRoZSBhbnN3ZXIgaXMgdGhhdCBpcyB3YXMgZG9taW5hdGVkIGJ5IGNsYXNzZXMgYW5kIG1hbGUgY2hpdmFscnkuIE1hbnkgbW9yZSBtZW4gdGhhbiB3b21lbiBkaWVkIGFuZCBhIGdvb2QgYW1vdW50IG1vcmUgZmlyc3QgY2xhc3Mgc3Vydml2ZWQgdGhhbiB0aGUgb3RoZXIgdHdvIGNsYXNzZXMgYWNjb29yZGluZyB0byB0aGUgY2hhcnRzIGJlbG93Lg0KDQoqKkhpbnQ6KiogUmV2aWV3IGFuZCBleHBsYWluIHRoZSBleHBsb3JhdG9yeSBncmFwaHMgY3JlYXRlZCBieSB0aGUgY29kZSBjaHVuay4gSG93IHRoZXkgc3VwcG9ydCB5b3UganVzdGlmaWNhdGlvbj8NCg0KYGBge3IgcGFydCBleHRyYX0NCg0KVElUQU5JQyAlPiUgIGdncGxvdChhZXMoeCA9IHN1cnZpdmVkKSkgKw0KICBnZW9tX2JhcihhZXMoZmlsbCA9IHNleCksIHN0YXQgPSAiY291bnQiLCBwb3NpdGlvbiA9ICJzdGFjayIgKSArDQogIHRoZW1lX2J3KCkNCg0KVElUQU5JQyAlPiUgIGdncGxvdChhZXMoeCA9IHN1cnZpdmVkKSkgKw0KICBnZW9tX2JhcihhZXMoZmlsbCA9IHBjbGFzcyksIHN0YXQgPSAiY291bnQiLCBwb3NpdGlvbiA9ICJzdGFjayIgKSArDQogIHRoZW1lX2J3KCkNCg0KYGBgDQoNCg0KDQoNCg0KDQoNCg0KDQojIyBUYXNrIDMgKiooMTAgcG9pbnRzKSoqIENyZWF0ZSBhIG1hcCB3aXRoIGxlYWZsZXQgcGFja2FnZSwgYnkgY29tcGxldGluZyB0aGUgY29kZSBiZWxvdywgdGhhdCBkaXNwbGF5cyA1IFVOQyBzeXN0ZW0gc2Nob29scyB1c2luZyB0aGVpciBnZW9ncmFwaGljIGxvY2F0aW9ucy4gRHJhdyBjaXJjbGVzIHdpdGggcmFkaXVzIHByb3BvcnRpb25hdGUgdG8gdGhlIHNjaG9vbCBzaXplIHVzaW5nIHRoZSBgYWRkQ2lyY2xlcygpYCBmdW5jdGlvbi4gDQoNClRyeTogRS5nLiBgYWRkQ2lyY2xlcyh3ZWlnaHQgPSAxLCByYWRpdXMgPSBzcXJ0KFVOQ19zY2hvb2xzJHNpemUpKjEwMClgDQoNCmBgYHtyfQ0Kc2V0LnNlZWQoMjAyMC0wMi0wMSkNCg0KbGlicmFyeShsZWFmbGV0KQ0KDQojIFRoZSBjb2RlIGJlbG93IHdpbGwgY3JlYXRlIGxpc3Qgb2YgNSBVTkMgdW5pdmVyc2l0eSBkYXRhIHBvaW50cyB3aXRoIGxhdCAmIGxuZywgbmFtZSBhbmQgc2Nob29sIHNpemUNCiMgQ3JlYXRlIGRhdGEgZnJhbWUgd2l0aCBjb2x1bW4gdmFyaWFibGVzIG5hbWUgKG9mIFVOQyBzY2hvb2wpLCBzdHVkZW50cyAoc2l6ZSksIGxhdCwgbG5nKQ0KVU5DX3NjaG9vbHMgPC0gZGF0YS5mcmFtZShuYW1lID0gYygiTkMgU3RhdGUiLCAiVU5DIENoYXBlbCBIaWxsIiwgIkZTVSIsICJFQ1UiLCAiVU5DIENoYXJsb3R0ZSIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IGMoMzAxMzAsIDI4MTM2LCA2MDAwLCAyNTk5MCwgMjU5OTApLA0KICAgICAgICAgICAgICAgICAgICAgICAgbGF0ID0gYygzNi4wMzczNjM4LCAzNS45MDUwMzUzLCAzNS4wNzI2LCAzNS42MDczNzY5LCAzNS4yMDM2MzI1KSwNCiAgICAgICAgICAgICAgICAgICAgICAgIGxuZyA9IGMoLTc5LjAzNTU2NjMsIC03OS4wNDc3NTMzLCAtNzguODkyNDczOSwgLTc3LjM2NzE1NjYsIC04MC44NDAxMTQ1KSkNCg0KDQojIFVzZSB0aGUgZGF0YSBmcmFtZSB0byBkcmF3IG1hcCBhbmQgY2lyY2xlcyBwcm9wb3J0aW9uYWwgdG8gdGhlIHNjaG9vbCBzaXplcyBvZiB0aGUgY2l0aWVzDQpVTkNfc2Nob29scyAlPiUNCiAgbGVhZmxldCgpICU+JQ0KICBhZGRUaWxlcygpICU+JQ0KICBhZGRDaXJjbGVzKHdlaWdodCA9IDEsIHJhZGl1cyA9IHNxcnQoVU5DX3NjaG9vbHMkc2l6ZSkqNTApICMgdHJ5IGFkanVzdGluZyB0aGUgcmFkaXVzIGJ5IG11bHRpcGx5aW5nIHdpdGggNTAgaW5zdGVhZCBvZiAxMDAuIFdoYXQgZG8geW91IG5vdGljZT8NCmBgYA0KDQoNCiMjIFRhc2sgMyAoRXh0cmEgQ3JlZGl0LCA1IHB0cyk6IEFkZCBhdCBsZWFzdCB0d28gbW9yZSBVTkMgc2Nob29scywgdXNpbmcgdGhlaXIgbG9jYXRpb24gZGF0YSBhbmQgZW5yb2xsbWVudCBudW1iZXJzLiBNb2RpZnkgdGhlIGNvZGUgYWJvdmUgYW5kIHVwZGF0ZSB0aGUgbWFwIGZvciBhbGwgc2Nob29scyBpbmNsdWRlZC4NCg0KDQpgYGB7ciwgZWNobz1GQUxTRX0NCiMjIERPIE5PVCBDSEFOR0UgQU5ZVEhJTkcgSU4gVEhJUyBDT0RFIENIVU5LIQ0KZGF0ZSgpDQpzZXNzaW9uSW5mbygpDQpSLlZlcnNpb24oKQ0KYGBgDQoNCg==