1. This exercise relates to the College data set, which can be found in the file College.csv . It contains a number of variables for 777 different universities and colleges in the US. The variables are
    • Private : Public/private indicator
    • Apps : Number of applications received
    • Accept : Number of applicants accepted
    • Enroll : Number of new students enrolled
    • Top10perc : New students from top 10 % of high school class
    • Top25perc : New students from top 25 % of high school class
    • F.Undergrad : Number of full-time undergraduates
    • P.Undergrad : Number of part-time undergraduates
    • Outstate : Out-of-state tuition
    • Room.Board : Room and board costs
    • Books : Estimated book costs
    • Personal : Estimated personal spending
    • PhD : Percent of faculty with Ph.D.’s
    • Terminal : Percent of faculty with terminal degree
    • S.F.Ratio : Student/faculty ratio
    • perc.alumni : Percent of alumni who donate
    • Expend : Instructional expenditure per student
    • Grad.Rate : Graduation rate
    Before reading the data into R , it can be viewed in Excel or a text editor.
  1. Use the read.csv() function to read the data into R . Call the loaded data college . Make sure that you have the directory set to the correct location for the data.
  2. Look at the data using the fix() function. You should notice that the first column is just the name of each university. We don’t really want R to treat this as data. However, it may be handy to have these names for later.
# (a)
college = read.csv("College.csv")
rownames(college) = college[ ,1]
fix(college)

Try the following commands
>rownames ( college ) = college [ ,1]
>fix ( college )

You should see that there is now a row.names column with the name of each university recorded. This means that R has given each row a name corresponding to the appropriate university. R will not try to perform calculations on the row names. However, we still need to eliminate the first column in the data where the names are stored. Try

college = college[ ,-1]
fix(college)

college = college [ , -1]
fix ( college )

Now you should see that the first data column is Private . Note that another column labeled row.names now appears before the Private column. However, this is not a data column but rather the name that R is giving to each row.
(c)
i. Use the summary() function to produce a numerical summary of the variables in the data set.

summary(college)
 Private        Apps           Accept          Enroll       Top10perc       Top25perc      F.Undergrad     P.Undergrad     
 No :212   Min.   :   81   Min.   :   72   Min.   :  35   Min.   : 1.00   Min.   :  9.0   Min.   :  139   Min.   :    1.0  
 Yes:565   1st Qu.:  776   1st Qu.:  604   1st Qu.: 242   1st Qu.:15.00   1st Qu.: 41.0   1st Qu.:  992   1st Qu.:   95.0  
           Median : 1558   Median : 1110   Median : 434   Median :23.00   Median : 54.0   Median : 1707   Median :  353.0  
           Mean   : 3002   Mean   : 2019   Mean   : 780   Mean   :27.56   Mean   : 55.8   Mean   : 3700   Mean   :  855.3  
           3rd Qu.: 3624   3rd Qu.: 2424   3rd Qu.: 902   3rd Qu.:35.00   3rd Qu.: 69.0   3rd Qu.: 4005   3rd Qu.:  967.0  
           Max.   :48094   Max.   :26330   Max.   :6392   Max.   :96.00   Max.   :100.0   Max.   :31643   Max.   :21836.0  
    Outstate       Room.Board       Books           Personal         PhD            Terminal       S.F.Ratio    
 Min.   : 2340   Min.   :1780   Min.   :  96.0   Min.   : 250   Min.   :  8.00   Min.   : 24.0   Min.   : 2.50  
 1st Qu.: 7320   1st Qu.:3597   1st Qu.: 470.0   1st Qu.: 850   1st Qu.: 62.00   1st Qu.: 71.0   1st Qu.:11.50  
 Median : 9990   Median :4200   Median : 500.0   Median :1200   Median : 75.00   Median : 82.0   Median :13.60  
 Mean   :10441   Mean   :4358   Mean   : 549.4   Mean   :1341   Mean   : 72.66   Mean   : 79.7   Mean   :14.09  
 3rd Qu.:12925   3rd Qu.:5050   3rd Qu.: 600.0   3rd Qu.:1700   3rd Qu.: 85.00   3rd Qu.: 92.0   3rd Qu.:16.50  
 Max.   :21700   Max.   :8124   Max.   :2340.0   Max.   :6800   Max.   :103.00   Max.   :100.0   Max.   :39.80  
  perc.alumni        Expend        Grad.Rate     
 Min.   : 0.00   Min.   : 3186   Min.   : 10.00  
 1st Qu.:13.00   1st Qu.: 6751   1st Qu.: 53.00  
 Median :21.00   Median : 8377   Median : 65.00  
 Mean   :22.74   Mean   : 9660   Mean   : 65.46  
 3rd Qu.:31.00   3rd Qu.:10830   3rd Qu.: 78.00  
 Max.   :64.00   Max.   :56233   Max.   :118.00  
  1. Use the pairs() function to produce a scatterplot matrix of the first ten columns or variables of the data. Recall that you can reference the first ten columns of a matrix A using A[,1:10] .
pairs(college[ ,1:10])

  1. Use the plot() function to produce side-by-side boxplots of Outstate versus Private .
attach(college)
The following objects are masked from college (pos = 3):

    Accept, Apps, Books, Enroll, Expend, F.Undergrad, Grad.Rate, Outstate, P.Undergrad, perc.alumni, Personal,
    PhD, Private, Room.Board, S.F.Ratio, Terminal, Top10perc, Top25perc

The following objects are masked from college (pos = 4):

    Accept, Apps, Books, Enroll, Expend, F.Undergrad, Grad.Rate, Outstate, P.Undergrad, perc.alumni, Personal,
    PhD, Private, Room.Board, S.F.Ratio, Terminal, Top10perc, Top25perc

The following objects are masked from college (pos = 5):

    Accept, Apps, Books, Enroll, Expend, F.Undergrad, Grad.Rate, Outstate, P.Undergrad, perc.alumni, Personal,
    PhD, Private, Room.Board, S.F.Ratio, Terminal, Top10perc, Top25perc

The following objects are masked from college (pos = 6):

    Accept, Apps, Books, Enroll, Expend, F.Undergrad, Grad.Rate, Outstate, P.Undergrad, perc.alumni, Personal,
    PhD, Private, Room.Board, S.F.Ratio, Terminal, Top10perc, Top25perc

The following objects are masked from college (pos = 7):

    Accept, Apps, Books, Enroll, Expend, F.Undergrad, Grad.Rate, Outstate, P.Undergrad, perc.alumni, Personal,
    PhD, Private, Room.Board, S.F.Ratio, Terminal, Top10perc, Top25perc

The following objects are masked from college (pos = 8):

    Accept, Apps, Books, Enroll, Expend, F.Undergrad, Grad.Rate, Outstate, P.Undergrad, perc.alumni, Personal,
    PhD, Private, Room.Board, S.F.Ratio, Terminal, Top10perc, Top25perc

The following objects are masked from college (pos = 9):

    Accept, Apps, Books, Enroll, Expend, F.Undergrad, Grad.Rate, Outstate, P.Undergrad, perc.alumni, Personal,
    PhD, Private, Room.Board, S.F.Ratio, Terminal, Top10perc, Top25perc
plot(Private, Outstate)

  1. Create a new qualitative variable, called Elite , by binning the Top10perc variable. We are going to divide universities into two groups based on whether or not the proportion of students coming from the top 10 % of their high school classes exceeds 50 %.
Top10perc = as.factor(Top10perc)

Elite = rep (" No " , nrow ( college ) )
Elite [ college$Top1 0 pe rc >50]=" Yes "
Elite = as . factor ( Elite )
college = data . frame ( college , Elite )

Elite = rep("No", nrow(college))
Elite[college$Top10perc > 50] = "Yes"
Elite = as.factor(Elite)
college = data.frame(college, Elite)
# Entendi nada...
# Ok, acho que entendi. Primeiro aquela função rep() vai escrever todas as linhas da college como não nessa nova variável
# Elite.
# Depois, vai escrever um "Yes" em cada linha que Top10perc for maior que 50%
# Finalmente vai transformar Elite em qualitativo e vai criar um data frame college, incluindo a coluna Elite.

Use the summary() function to see how many elite univer- sities there are. Now use the plot() function to produce side-by-side boxplots of Outstate versus Elite .

summary(Elite)
 No Yes 
699  78 
  1. Use the hist() function to produce some histograms with differing numbers of bins for a few of the quantitative vari- ables. You may find the command par(mfrow=c(2,2)) useful: it will divide the print window into four regions so that four plots can be made simultaneously. Modifying the arguments to this function will divide the screen in other ways.
par(mfrow=c(2,2))
hist(Apps)
hist(Enroll)
hist(Personal)
hist(PhD)

  1. Continue exploring the data, and provide a brief summary of what you discover.

Ok, deu pra pegar a ideia

  1. This exercise involves the Auto data set studied in the lab. Make sure that the missing values have been removed from the data.
Auto = read.table("Auto.data", header=T, na.strings="?")
Auto = na.omit(Auto)
summary(Auto)
      mpg          cylinders      displacement     horsepower        weight      acceleration        year      
 Min.   : 9,00   Min.   :3,000   Min.   : 68,0   Min.   : 46,0   Min.   :1613   Min.   : 8,00   Min.   :70,00  
 1st Qu.:17,00   1st Qu.:4,000   1st Qu.:105,0   1st Qu.: 75,0   1st Qu.:2225   1st Qu.:13,78   1st Qu.:73,00  
 Median :22,75   Median :4,000   Median :151,0   Median : 93,5   Median :2804   Median :15,50   Median :76,00  
 Mean   :23,45   Mean   :5,472   Mean   :194,4   Mean   :104,5   Mean   :2978   Mean   :15,54   Mean   :75,98  
 3rd Qu.:29,00   3rd Qu.:8,000   3rd Qu.:275,8   3rd Qu.:126,0   3rd Qu.:3615   3rd Qu.:17,02   3rd Qu.:79,00  
 Max.   :46,60   Max.   :8,000   Max.   :455,0   Max.   :230,0   Max.   :5140   Max.   :24,80   Max.   :82,00  
                                                                                                               
     origin                      name    
 Min.   :1,000   amc matador       :  5  
 1st Qu.:1,000   ford pinto        :  5  
 Median :1,000   toyota corolla    :  5  
 Mean   :1,577   amc gremlin       :  4  
 3rd Qu.:2,000   amc hornet        :  4  
 Max.   :3,000   chevrolet chevette:  4  
                 (Other)           :365  
  1. Which of the predictors are quantitative, and which are quali- tative?

We have one qualitative column and 8 quantitative column

  1. What is the range of each quantitative predictor? You can an- swer this using the range() function.
attach(Auto)
The following objects are masked from Auto (pos = 3):

    acceleration, cylinders, displacement, horsepower, mpg, name, origin, weight, year

The following objects are masked from Auto (pos = 4):

    acceleration, cylinders, displacement, horsepower, mpg, name, origin, weight, year

The following objects are masked from Auto (pos = 5):

    acceleration, cylinders, displacement, horsepower, mpg, name, origin, weight, year

The following objects are masked from Auto (pos = 6):

    acceleration, cylinders, displacement, horsepower, mpg, name, origin, weight, year
range(mpg)
[1]  9,0 46,6
range(cylinders)
[1] 3 8
range(acceleration)
[1]  8,0 24,8
range(displacement)
[1]  68 455
range(horsepower)
[1]  46 230
range(origin)
[1] 1 3
range(weight)
[1] 1613 5140
range(year)
[1] 70 82
  1. What is the mean and standard deviation of each quantitative predictor?
mean(mpg)
[1] 23,44592
mean(cylinders)
[1] 5,471939
mean(acceleration)
[1] 15,54133
mean(displacement)
[1] 194,412
mean(horsepower)
[1] 104,4694
mean(origin)
[1] 1,576531
mean(weight)
[1] 2977,584
mean(year)
[1] 75,97959
sd(mpg)
[1] 7,805007
sd(cylinders)
[1] 1,705783
sd(acceleration)
[1] 2,758864
sd(displacement)
[1] 104,644
sd(horsepower)
[1] 38,49116
sd(origin)
[1] 0,8055182
sd(weight)
[1] 849,4026
sd(year)
[1] 3,683737
  1. Now remove the 10th through 85th observations. What is the range, mean, and standard deviation of each predictor in the subset of the data that remains?
Auto = Auto[-(10:84),]
attach(Auto)
The following objects are masked from Auto (pos = 3):

    acceleration, cylinders, displacement, horsepower, mpg, name, origin, weight, year

The following objects are masked from Auto (pos = 4):

    acceleration, cylinders, displacement, horsepower, mpg, name, origin, weight, year

The following objects are masked from Auto (pos = 5):

    acceleration, cylinders, displacement, horsepower, mpg, name, origin, weight, year

The following objects are masked from Auto (pos = 6):

    acceleration, cylinders, displacement, horsepower, mpg, name, origin, weight, year

The following objects are masked from Auto (pos = 7):

    acceleration, cylinders, displacement, horsepower, mpg, name, origin, weight, year
mean(mpg)
[1] 27,9509
mean(cylinders)
[1] 5
mean(acceleration)
[1] 15,89222
mean(displacement)
[1] 164,2695
mean(horsepower)
[1] 93,52695
mean(origin)
[1] 1,712575
mean(weight)
[1] 2727,91
mean(year)
[1] 79,23952
sd(mpg)
[1] 7,657203
sd(cylinders)
[1] 1,509009
sd(acceleration)
[1] 2,767126
sd(displacement)
[1] 87,60023
sd(horsepower)
[1] 31,88776
sd(origin)
[1] 0,8788122
sd(weight)
[1] 651,5159
sd(year)
[1] 2,68465
  1. Using the full data set, investigate the predictors graphically, using scatterplots or other tools of your choice. Create some plots highlighting the relationships among the predictors. Comment on your findings.

Não sei fazer

  1. Suppose that we wish to predict gas mileage ( mpg ) on the basis of the other variables. Do your plots suggest that any of the other variables might be useful in predicting mpg ? Justify your answer.

Sei não senhor

  1. This exercise involves the Boston housing data set.
  1. To begin, load in the Boston data set. The Boston data set is part of the MASS library in R .
    > library ( MASS )

Now the data set is contained in the object Boston.

Boston

Read about the data set:
> ? Boston

How many rows are in this data set? How many columns? What do the rows and columns represent?
(b) Make some pairwise scatterplots of the predictors (columns) in this data set. Describe your findings.
(c) Are any of the predictors associated with per capita crime rate? If so, explain the relationship.
(d) Do any of the suburbs of Boston appear to have particularly high crime rates? Tax rates? Pupil-teacher ratios? Comment on the range of each predictor.
(e) How many of the suburbs in this data set bound the Charles river?
(f) What is the median pupil-teacher ratio among the towns in this data set?
(g) Which suburb of Boston has lowest median value of owner- occupied homes? What are the values of the other predictors for that suburb, and how do those values compare to the overall ranges for those predictors? Comment on your findings.
(h) In this data set, how many of the suburbs average more than seven rooms per dwelling? More than eight rooms per dwelling? Comment on the suburbs that average more than eight rooms per dwelling.

LS0tCnRpdGxlOiAiRXhlcmNpc2VzIGZvciBSIgpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sKLS0tCgo4LiBUaGlzIGV4ZXJjaXNlIHJlbGF0ZXMgdG8gdGhlIENvbGxlZ2UgZGF0YSBzZXQsIHdoaWNoIGNhbiBiZSBmb3VuZCBpbgp0aGUgZmlsZSBDb2xsZWdlLmNzdiAuIEl0IGNvbnRhaW5zIGEgbnVtYmVyIG9mIHZhcmlhYmxlcyBmb3IgNzc3IGRpZmZlcmVudAp1bml2ZXJzaXRpZXMgYW5kIGNvbGxlZ2VzIGluIHRoZSBVUy4gVGhlIHZhcmlhYmxlcyBhcmUgPGJyPgrigKIgUHJpdmF0ZSA6IFB1YmxpYy9wcml2YXRlIGluZGljYXRvciA8YnI+CuKAoiBBcHBzIDogTnVtYmVyIG9mIGFwcGxpY2F0aW9ucyByZWNlaXZlZCA8YnI+CuKAoiBBY2NlcHQgOiBOdW1iZXIgb2YgYXBwbGljYW50cyBhY2NlcHRlZCA8YnI+CuKAoiBFbnJvbGwgOiBOdW1iZXIgb2YgbmV3IHN0dWRlbnRzIGVucm9sbGVkIDxicj4K4oCiIFRvcDEwcGVyYyA6IE5ldyBzdHVkZW50cyBmcm9tIHRvcCAxMCAlIG9mIGhpZ2ggc2Nob29sIGNsYXNzIDxicj4K4oCiIFRvcDI1cGVyYyA6IE5ldyBzdHVkZW50cyBmcm9tIHRvcCAyNSAlIG9mIGhpZ2ggc2Nob29sIGNsYXNzIDxicj4K4oCiIEYuVW5kZXJncmFkIDogTnVtYmVyIG9mIGZ1bGwtdGltZSB1bmRlcmdyYWR1YXRlcyA8YnI+CuKAoiBQLlVuZGVyZ3JhZCA6IE51bWJlciBvZiBwYXJ0LXRpbWUgdW5kZXJncmFkdWF0ZXMgPGJyPgrigKIgT3V0c3RhdGUgOiBPdXQtb2Ytc3RhdGUgdHVpdGlvbiA8YnI+CuKAoiBSb29tLkJvYXJkIDogUm9vbSBhbmQgYm9hcmQgY29zdHMgPGJyPgrigKIgQm9va3MgOiBFc3RpbWF0ZWQgYm9vayBjb3N0cyA8YnI+CuKAoiBQZXJzb25hbCA6IEVzdGltYXRlZCBwZXJzb25hbCBzcGVuZGluZyA8YnI+CuKAoiBQaEQgOiBQZXJjZW50IG9mIGZhY3VsdHkgd2l0aCBQaC5ELuKAmXMgPGJyPgrigKIgVGVybWluYWwgOiBQZXJjZW50IG9mIGZhY3VsdHkgd2l0aCB0ZXJtaW5hbCBkZWdyZWUgPGJyPgrigKIgUy5GLlJhdGlvIDogU3R1ZGVudC9mYWN1bHR5IHJhdGlvIDxicj4K4oCiIHBlcmMuYWx1bW5pIDogUGVyY2VudCBvZiBhbHVtbmkgd2hvIGRvbmF0ZSA8YnI+CuKAoiBFeHBlbmQgOiBJbnN0cnVjdGlvbmFsIGV4cGVuZGl0dXJlIHBlciBzdHVkZW50IDxicj4K4oCiIEdyYWQuUmF0ZSA6IEdyYWR1YXRpb24gcmF0ZTxicj4KQmVmb3JlIHJlYWRpbmcgdGhlIGRhdGEgaW50byBSICwgaXQgY2FuIGJlIHZpZXdlZCBpbiBFeGNlbCBvciBhIHRleHQKZWRpdG9yLjxicj4KKGEpIFVzZSB0aGUgcmVhZC5jc3YoKSBmdW5jdGlvbiB0byByZWFkIHRoZSBkYXRhIGludG8gUiAuIENhbGwgdGhlCmxvYWRlZCBkYXRhIGNvbGxlZ2UgLiBNYWtlIHN1cmUgdGhhdCB5b3UgaGF2ZSB0aGUgZGlyZWN0b3J5IHNldAp0byB0aGUgY29ycmVjdCBsb2NhdGlvbiBmb3IgdGhlIGRhdGEuPGJyPgooYikgTG9vayBhdCB0aGUgZGF0YSB1c2luZyB0aGUgZml4KCkgZnVuY3Rpb24uIFlvdSBzaG91bGQgbm90aWNlCnRoYXQgdGhlIGZpcnN0IGNvbHVtbiBpcyBqdXN0IHRoZSBuYW1lIG9mIGVhY2ggdW5pdmVyc2l0eS4gV2UgZG9u4oCZdApyZWFsbHkgd2FudCBSIHRvIHRyZWF0IHRoaXMgYXMgZGF0YS4gSG93ZXZlciwgaXQgbWF5IGJlIGhhbmR5IHRvCmhhdmUgdGhlc2UgbmFtZXMgZm9yIGxhdGVyLjxicj4KCmBgYHtyfQojIChhKQpjb2xsZWdlID0gcmVhZC5jc3YoIkNvbGxlZ2UuY3N2IikKcm93bmFtZXMoY29sbGVnZSkgPSBjb2xsZWdlWyAsMV0KZml4KGNvbGxlZ2UpCmBgYAoKClRyeSB0aGUgZm9sbG93aW5nIGNvbW1hbmRzPGJyPgo+cm93bmFtZXMgKCBjb2xsZWdlICkgPSBjb2xsZWdlIFsgLDFdPGJyPgo+Zml4ICggY29sbGVnZSApPGJyPgoKWW91IHNob3VsZCBzZWUgdGhhdCB0aGVyZSBpcyBub3cgYSByb3cubmFtZXMgY29sdW1uIHdpdGggdGhlCm5hbWUgb2YgZWFjaCB1bml2ZXJzaXR5IHJlY29yZGVkLiBUaGlzIG1lYW5zIHRoYXQgUiBoYXMgZ2l2ZW4KZWFjaCByb3cgYSBuYW1lIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGFwcHJvcHJpYXRlIHVuaXZlcnNpdHkuIFIKd2lsbCBub3QgdHJ5IHRvIHBlcmZvcm0gY2FsY3VsYXRpb25zIG9uIHRoZSByb3cgbmFtZXMuIEhvd2V2ZXIsCndlIHN0aWxsIG5lZWQgdG8gZWxpbWluYXRlIHRoZSBmaXJzdCBjb2x1bW4gaW4gdGhlIGRhdGEgd2hlcmUgdGhlCm5hbWVzIGFyZSBzdG9yZWQuIFRyeTxicj4KCmBgYHtyfQpjb2xsZWdlID0gY29sbGVnZVsgLC0xXQpmaXgoY29sbGVnZSkKYGBgCgoKPiBjb2xsZWdlID0gY29sbGVnZSBbICwgLTFdPGJyPgo+IGZpeCAoIGNvbGxlZ2UgKTxicj4KCk5vdyB5b3Ugc2hvdWxkIHNlZSB0aGF0IHRoZSBmaXJzdCBkYXRhIGNvbHVtbiBpcyBQcml2YXRlIC4gTm90ZQp0aGF0IGFub3RoZXIgY29sdW1uIGxhYmVsZWQgcm93Lm5hbWVzIG5vdyBhcHBlYXJzIGJlZm9yZSB0aGUKUHJpdmF0ZSBjb2x1bW4uIEhvd2V2ZXIsIHRoaXMgaXMgbm90IGEgZGF0YSBjb2x1bW4gYnV0IHJhdGhlcgp0aGUgbmFtZSB0aGF0IFIgaXMgZ2l2aW5nIHRvIGVhY2ggcm93Ljxicj4KKGMpPGJyPgppLiBVc2UgdGhlIHN1bW1hcnkoKSBmdW5jdGlvbiB0byBwcm9kdWNlIGEgbnVtZXJpY2FsIHN1bW1hcnkKb2YgdGhlIHZhcmlhYmxlcyBpbiB0aGUgZGF0YSBzZXQuPGJyPgoKYGBge3J9CnN1bW1hcnkoY29sbGVnZSkKYGBgCgoKaWkuIFVzZSB0aGUgcGFpcnMoKSBmdW5jdGlvbiB0byBwcm9kdWNlIGEgc2NhdHRlcnBsb3QgbWF0cml4IG9mCnRoZSBmaXJzdCB0ZW4gY29sdW1ucyBvciB2YXJpYWJsZXMgb2YgdGhlIGRhdGEuIFJlY2FsbCB0aGF0CnlvdSBjYW4gcmVmZXJlbmNlIHRoZSBmaXJzdCB0ZW4gY29sdW1ucyBvZiBhIG1hdHJpeCBBIHVzaW5nCkFbLDE6MTBdIC48YnI+CgpgYGB7cn0KcGFpcnMoY29sbGVnZVsgLDE6MTBdKQpgYGAKCgppaWkuIFVzZSB0aGUgcGxvdCgpIGZ1bmN0aW9uIHRvIHByb2R1Y2Ugc2lkZS1ieS1zaWRlIGJveHBsb3RzIG9mCk91dHN0YXRlIHZlcnN1cyBQcml2YXRlIC48YnI+CgpgYGB7cn0KYXR0YWNoKGNvbGxlZ2UpCnBsb3QoUHJpdmF0ZSwgT3V0c3RhdGUpCmBgYAoKCml2LiBDcmVhdGUgYSBuZXcgcXVhbGl0YXRpdmUgdmFyaWFibGUsIGNhbGxlZCBFbGl0ZSAsIGJ5IGJpbm5pbmcKdGhlIFRvcDEwcGVyYyB2YXJpYWJsZS4gV2UgYXJlIGdvaW5nIHRvIGRpdmlkZSB1bml2ZXJzaXRpZXMKaW50byB0d28gZ3JvdXBzIGJhc2VkIG9uIHdoZXRoZXIgb3Igbm90IHRoZSBwcm9wb3J0aW9uCm9mIHN0dWRlbnRzIGNvbWluZyBmcm9tIHRoZSB0b3AgMTAgJSBvZiB0aGVpciBoaWdoIHNjaG9vbApjbGFzc2VzIGV4Y2VlZHMgNTAgJS48YnI+CgpgYGB7cn0KVG9wMTBwZXJjID0gYXMuZmFjdG9yKFRvcDEwcGVyYykKYGBgCgoKRWxpdGUgPSByZXAgKCIgTm8gIiAsIG5yb3cgKCBjb2xsZWdlICkgKTxicj4KRWxpdGUgWyBjb2xsZWdlJFRvcDEgMCBwZSByYyA+NTBdPSIgWWVzICI8YnI+CkVsaXRlID0gYXMgLiBmYWN0b3IgKCBFbGl0ZSApPGJyPgpjb2xsZWdlID0gZGF0YSAuIGZyYW1lICggY29sbGVnZSAsIEVsaXRlICk8YnI+CgpgYGB7cn0KRWxpdGUgPSByZXAoIk5vIiwgbnJvdyhjb2xsZWdlKSkKRWxpdGVbY29sbGVnZSRUb3AxMHBlcmMgPiA1MF0gPSAiWWVzIgpFbGl0ZSA9IGFzLmZhY3RvcihFbGl0ZSkKY29sbGVnZSA9IGRhdGEuZnJhbWUoY29sbGVnZSwgRWxpdGUpCiMgRW50ZW5kaSBuYWRhLi4uCiMgT2ssIGFjaG8gcXVlIGVudGVuZGkuIFByaW1laXJvIGFxdWVsYSBmdW7Dp8OjbyByZXAoKSB2YWkgZXNjcmV2ZXIgdG9kYXMgYXMgbGluaGFzIGRhIGNvbGxlZ2UgY29tbyBuw6NvIG5lc3NhIG5vdmEgdmFyacOhdmVsCiMgRWxpdGUuCiMgRGVwb2lzLCB2YWkgZXNjcmV2ZXIgdW0gIlllcyIgZW0gY2FkYSBsaW5oYSBxdWUgVG9wMTBwZXJjIGZvciBtYWlvciBxdWUgNTAlCiMgRmluYWxtZW50ZSB2YWkgdHJhbnNmb3JtYXIgRWxpdGUgZW0gcXVhbGl0YXRpdm8gZSB2YWkgY3JpYXIgdW0gZGF0YSBmcmFtZSBjb2xsZWdlLCBpbmNsdWluZG8gYSBjb2x1bmEgRWxpdGUuCmBgYAoKCgpVc2UgdGhlIHN1bW1hcnkoKSBmdW5jdGlvbiB0byBzZWUgaG93IG1hbnkgZWxpdGUgdW5pdmVyLQpzaXRpZXMgdGhlcmUgYXJlLiBOb3cgdXNlIHRoZSBwbG90KCkgZnVuY3Rpb24gdG8gcHJvZHVjZQpzaWRlLWJ5LXNpZGUgYm94cGxvdHMgb2YgT3V0c3RhdGUgdmVyc3VzIEVsaXRlIC48YnI+CgpgYGB7cn0Kc3VtbWFyeShFbGl0ZSkKYGBgCgoKdi4gVXNlIHRoZSBoaXN0KCkgZnVuY3Rpb24gdG8gcHJvZHVjZSBzb21lIGhpc3RvZ3JhbXMgd2l0aApkaWZmZXJpbmcgbnVtYmVycyBvZiBiaW5zIGZvciBhIGZldyBvZiB0aGUgcXVhbnRpdGF0aXZlIHZhcmktCmFibGVzLiBZb3UgbWF5IGZpbmQgdGhlIGNvbW1hbmQgcGFyKG1mcm93PWMoMiwyKSkgdXNlZnVsOgppdCB3aWxsIGRpdmlkZSB0aGUgcHJpbnQgd2luZG93IGludG8gZm91ciByZWdpb25zIHNvIHRoYXQgZm91cgpwbG90cyBjYW4gYmUgbWFkZSBzaW11bHRhbmVvdXNseS4gTW9kaWZ5aW5nIHRoZSBhcmd1bWVudHMKdG8gdGhpcyBmdW5jdGlvbiB3aWxsIGRpdmlkZSB0aGUgc2NyZWVuIGluIG90aGVyIHdheXMuPGJyPgoKYGBge3J9CnBhcihtZnJvdz1jKDIsMikpCmhpc3QoQXBwcykKaGlzdChFbnJvbGwpCmhpc3QoUGVyc29uYWwpCmhpc3QoUGhEKQpgYGAKCgp2aS4gQ29udGludWUgZXhwbG9yaW5nIHRoZSBkYXRhLCBhbmQgcHJvdmlkZSBhIGJyaWVmIHN1bW1hcnkKb2Ygd2hhdCB5b3UgZGlzY292ZXIuPGJyPgoKKk9rLCBkZXUgcHJhIHBlZ2FyIGEgaWRlaWEqCgo5LiBUaGlzIGV4ZXJjaXNlIGludm9sdmVzIHRoZSBBdXRvIGRhdGEgc2V0IHN0dWRpZWQgaW4gdGhlIGxhYi4gTWFrZSBzdXJlCnRoYXQgdGhlIG1pc3NpbmcgdmFsdWVzIGhhdmUgYmVlbiByZW1vdmVkIGZyb20gdGhlIGRhdGEuPGJyPgoKYGBge3J9CkF1dG8gPSByZWFkLnRhYmxlKCJBdXRvLmRhdGEiLCBoZWFkZXI9VCwgbmEuc3RyaW5ncz0iPyIpCkF1dG8gPSBuYS5vbWl0KEF1dG8pCnN1bW1hcnkoQXV0bykKCmBgYAoKCihhKSBXaGljaCBvZiB0aGUgcHJlZGljdG9ycyBhcmUgcXVhbnRpdGF0aXZlLCBhbmQgd2hpY2ggYXJlIHF1YWxpLQp0YXRpdmU/PGJyPgoKKldlIGhhdmUgb25lIHF1YWxpdGF0aXZlIGNvbHVtbiBhbmQgOCBxdWFudGl0YXRpdmUgY29sdW1uKgoKKGIpIFdoYXQgaXMgdGhlIHJhbmdlIG9mIGVhY2ggcXVhbnRpdGF0aXZlIHByZWRpY3Rvcj8gWW91IGNhbiBhbi0Kc3dlciB0aGlzIHVzaW5nIHRoZSByYW5nZSgpIGZ1bmN0aW9uLjxicj4KCgpgYGB7cn0KYXR0YWNoKEF1dG8pCnJhbmdlKG1wZykKcmFuZ2UoY3lsaW5kZXJzKQpyYW5nZShhY2NlbGVyYXRpb24pCnJhbmdlKGRpc3BsYWNlbWVudCkKcmFuZ2UoaG9yc2Vwb3dlcikKcmFuZ2Uob3JpZ2luKQpyYW5nZSh3ZWlnaHQpCnJhbmdlKHllYXIpCmBgYAoKKGMpIFdoYXQgaXMgdGhlIG1lYW4gYW5kIHN0YW5kYXJkIGRldmlhdGlvbiBvZiBlYWNoIHF1YW50aXRhdGl2ZQpwcmVkaWN0b3I/PGJyPgoKYGBge3J9Cm1lYW4obXBnKQptZWFuKGN5bGluZGVycykKbWVhbihhY2NlbGVyYXRpb24pCm1lYW4oZGlzcGxhY2VtZW50KQptZWFuKGhvcnNlcG93ZXIpCm1lYW4ob3JpZ2luKQptZWFuKHdlaWdodCkKbWVhbih5ZWFyKQpgYGAKCmBgYHtyfQpzZChtcGcpCnNkKGN5bGluZGVycykKc2QoYWNjZWxlcmF0aW9uKQpzZChkaXNwbGFjZW1lbnQpCnNkKGhvcnNlcG93ZXIpCnNkKG9yaWdpbikKc2Qod2VpZ2h0KQpzZCh5ZWFyKQpgYGAKCgooZCkgTm93IHJlbW92ZSB0aGUgMTB0aCB0aHJvdWdoIDg1dGggb2JzZXJ2YXRpb25zLiBXaGF0IGlzIHRoZQpyYW5nZSwgbWVhbiwgYW5kIHN0YW5kYXJkIGRldmlhdGlvbiBvZiBlYWNoIHByZWRpY3RvciBpbiB0aGUKc3Vic2V0IG9mIHRoZSBkYXRhIHRoYXQgcmVtYWlucz88YnI+CgpgYGB7cn0KQXV0byA9IEF1dG9bLSgxMDo4NCksXQphdHRhY2goQXV0bykKbWVhbihtcGcpCm1lYW4oY3lsaW5kZXJzKQptZWFuKGFjY2VsZXJhdGlvbikKbWVhbihkaXNwbGFjZW1lbnQpCm1lYW4oaG9yc2Vwb3dlcikKbWVhbihvcmlnaW4pCm1lYW4od2VpZ2h0KQptZWFuKHllYXIpCmBgYAoKYGBge3J9CnNkKG1wZykKc2QoY3lsaW5kZXJzKQpzZChhY2NlbGVyYXRpb24pCnNkKGRpc3BsYWNlbWVudCkKc2QoaG9yc2Vwb3dlcikKc2Qob3JpZ2luKQpzZCh3ZWlnaHQpCnNkKHllYXIpCmBgYAoKCgooZSkgVXNpbmcgdGhlIGZ1bGwgZGF0YSBzZXQsIGludmVzdGlnYXRlIHRoZSBwcmVkaWN0b3JzIGdyYXBoaWNhbGx5LAp1c2luZyBzY2F0dGVycGxvdHMgb3Igb3RoZXIgdG9vbHMgb2YgeW91ciBjaG9pY2UuIENyZWF0ZSBzb21lIHBsb3RzCmhpZ2hsaWdodGluZyB0aGUgcmVsYXRpb25zaGlwcyBhbW9uZyB0aGUgcHJlZGljdG9ycy4gQ29tbWVudApvbiB5b3VyIGZpbmRpbmdzLjxicj4KCipOw6NvIHNlaSBmYXplcioKCihmKSBTdXBwb3NlIHRoYXQgd2Ugd2lzaCB0byBwcmVkaWN0IGdhcyBtaWxlYWdlICggbXBnICkgb24gdGhlIGJhc2lzCm9mIHRoZSBvdGhlciB2YXJpYWJsZXMuIERvIHlvdXIgcGxvdHMgc3VnZ2VzdCB0aGF0IGFueSBvZiB0aGUKb3RoZXIgdmFyaWFibGVzIG1pZ2h0IGJlIHVzZWZ1bCBpbiBwcmVkaWN0aW5nIG1wZyA/IEp1c3RpZnkgeW91cgphbnN3ZXIuPGJyPgoKKlNlaSBuw6NvIHNlbmhvcioKCjEwLiBUaGlzIGV4ZXJjaXNlIGludm9sdmVzIHRoZSBCb3N0b24gaG91c2luZyBkYXRhIHNldC4KKGEpIFRvIGJlZ2luLCBsb2FkIGluIHRoZSBCb3N0b24gZGF0YSBzZXQuIFRoZSBCb3N0b24gZGF0YSBzZXQgaXMKcGFydCBvZiB0aGUgTUFTUyBsaWJyYXJ5IGluIFIgLjxicj4KPiBsaWJyYXJ5ICggTUFTUyApPGJyPgoKTm93IHRoZSBkYXRhIHNldCBpcyBjb250YWluZWQgaW4gdGhlIG9iamVjdCBCb3N0b24uIDxicj4KCj4gQm9zdG9uPGJyPgoKUmVhZCBhYm91dCB0aGUgZGF0YSBzZXQ6PGJyPgo+ID8gQm9zdG9uPGJyPgoKSG93IG1hbnkgcm93cyBhcmUgaW4gdGhpcyBkYXRhIHNldD8gSG93IG1hbnkgY29sdW1ucz8gV2hhdApkbyB0aGUgcm93cyBhbmQgY29sdW1ucyByZXByZXNlbnQ/PGJyPgooYikgTWFrZSBzb21lIHBhaXJ3aXNlIHNjYXR0ZXJwbG90cyBvZiB0aGUgcHJlZGljdG9ycyAoY29sdW1ucykgaW4KdGhpcyBkYXRhIHNldC4gRGVzY3JpYmUgeW91ciBmaW5kaW5ncy48YnI+CihjKSBBcmUgYW55IG9mIHRoZSBwcmVkaWN0b3JzIGFzc29jaWF0ZWQgd2l0aCBwZXIgY2FwaXRhIGNyaW1lIHJhdGU/CklmIHNvLCBleHBsYWluIHRoZSByZWxhdGlvbnNoaXAuPGJyPgooZCkgRG8gYW55IG9mIHRoZSBzdWJ1cmJzIG9mIEJvc3RvbiBhcHBlYXIgdG8gaGF2ZSBwYXJ0aWN1bGFybHkKaGlnaCBjcmltZSByYXRlcz8gVGF4IHJhdGVzPyBQdXBpbC10ZWFjaGVyIHJhdGlvcz8gQ29tbWVudCBvbgp0aGUgcmFuZ2Ugb2YgZWFjaCBwcmVkaWN0b3IuPGJyPgooZSkgSG93IG1hbnkgb2YgdGhlIHN1YnVyYnMgaW4gdGhpcyBkYXRhIHNldCBib3VuZCB0aGUgQ2hhcmxlcwpyaXZlcj88YnI+CihmKSBXaGF0IGlzIHRoZSBtZWRpYW4gcHVwaWwtdGVhY2hlciByYXRpbyBhbW9uZyB0aGUgdG93bnMgaW4gdGhpcwpkYXRhIHNldD88YnI+CihnKSBXaGljaCBzdWJ1cmIgb2YgQm9zdG9uIGhhcyBsb3dlc3QgbWVkaWFuIHZhbHVlIG9mIG93bmVyLQpvY2N1cGllZCBob21lcz8gV2hhdCBhcmUgdGhlIHZhbHVlcyBvZiB0aGUgb3RoZXIgcHJlZGljdG9ycwpmb3IgdGhhdCBzdWJ1cmIsIGFuZCBob3cgZG8gdGhvc2UgdmFsdWVzIGNvbXBhcmUgdG8gdGhlIG92ZXJhbGwKcmFuZ2VzIGZvciB0aG9zZSBwcmVkaWN0b3JzPyBDb21tZW50IG9uIHlvdXIgZmluZGluZ3MuPGJyPgooaCkgSW4gdGhpcyBkYXRhIHNldCwgaG93IG1hbnkgb2YgdGhlIHN1YnVyYnMgYXZlcmFnZSBtb3JlIHRoYW4Kc2V2ZW4gcm9vbXMgcGVyIGR3ZWxsaW5nPyBNb3JlIHRoYW4gZWlnaHQgcm9vbXMgcGVyIGR3ZWxsaW5nPwpDb21tZW50IG9uIHRoZSBzdWJ1cmJzIHRoYXQgYXZlcmFnZSBtb3JlIHRoYW4gZWlnaHQgcm9vbXMKcGVyIGR3ZWxsaW5nLgoK