Getting Started with R,Part 2 Let us continue getting started with R as we start discussing important statistical concepts in Sports Analytics.

Case-scenario 1 This is the fourth season of outfielder Luis Robert with the Chicago White Socks. If during the first three seasons he hit 11, 13, and 12 home runs, how many does he need on this season for his overall average to be at least 20?

Solution Given that x1=11,x2=13,x3=12

we want to find x4 such that the mean (average) number of home-runs is x¯>=20

Notice that in this case n=4 .

According to the information above: 20×4=11+13+12+x4

so when x4=44, the home-runs average will be 20.

# Home-runs so far- history - we are going to build a vector with this values
HR_before <- c(11, 13, 12)
# Average Number of Home-runs per season wanted
wanted_HR <- 20
# Number of seasons
n_seasons <- 4
# Needed Home-runs on season 4
x_4 <- n_seasons*wanted_HR - sum(HR_before)
# Minimum number of Home-runs needed by Robert
x_4

Based on the calculations above, Robert needs to hit at least 44 home runs this season to achieve an average of 20 home runs per season.

We could confirm this, by using the function mean() in R

# Division
# Robert's performance we are going to build a vector with 4 values
Robert_HRs <- c(11, 13, 12,44)
# Find mean - for calculating the mean or average of a set of numbers is straightforward
mean(Robert_HRs)

Yes, we confirm that the average is 20.

# Find standard deviation - calculate the standard deviation of a numeric vector using the sd function
sd(Robert_HRs)
# Find the maximum number of home-runs during the four seasons period
#Find the maximum value using the function: max(numbers)
Robert_HRs
max(Robert_HRs)

In this case you can see that the maximum value is 44

# Find the minimum number of home-runs during the four seasons period
#Find the minimum value using using the function min(numbers)
Robert_HRs
min(Robert_HRs)

In this case you can see that the minimum value is 11

We can also use the summary() function to find basic statistics, including the median!

#For numeric vectors, summary provides a quick overview of your data like the minimum, 1st quartile, median, mean, 3rd quartile, and maximum values:
summary(Robert_HRs)

Question 1 Now, you must complete the problem below which represents a similar case scenario. You may use the steps that we executed in Case-scenario 1 as a template for your solution.

This is the sixth season of outfielder Juan Soto in the majors. If during the first five seasons he received 79, 108,41,145, and 135 walks, how many does he need on this season for his overall number of walks received per season to be at least 100?

Solution Given that w1= 79, w2= 108, w3= 41, w4= 145, and w5= 135

we want to find w6 such that the mean (average) number of walks is x>=100

Notice that in this case n=6 .

According to the information above: 100 x 6 = 79 + 108 + 41 + 145 + 135 + w6

so when _w6 = 92__, the overall walks per season to be at least 100.

# Walks so far
Walks_before <- c(79, 108,41,145, 135)
# Average Number of Home-runs per season wanted
wanted_walks <- 100
# Number of seasons
JSn_seasons <- 6
# Needed walks on season 6
w6 <- JSn_seasons*wanted_walks - sum(Walks_before)
# Minimum number of Walks needed by Juan Soto
w6

According to the calculations, Juan Soto must receive 92 walks this season for his average number of walks per season to be at least 100.

Case-scenario 2 The average salary of 10 baseball players is 72,000 dollars a week and the average salary of 4 soccer players is 84,000. Find the mean salary of all 14 professional players.

Solution We can easily find the joined mean by adding both mean and dividing by the total number of people.

Let n1=10 denote the number of baseball players, and y1=72000 their mean salary. Let n2=4 the number of soccer players and y2=84000 their mean salary. Then the mean salary of all 14 individuals is: (n1x1+n2x2)/(n1+n2)

We can compute this in R as follows:

#number of baseball players
n_1 <- 10 
#number of soccer players
n_2 <- 4
#salary of 10 baseball players
y_1 <- 72000
#salary of 4 soccer players
y_2 <- 84000
# Mean salary overall
salary_ave <-  (n_1*y_1 + n_2*y_2)/(n_1+n_2)
salary_ave

Thus, the average salary of all 14 professional players is $75,428.57.

Question 2 The average salary of 7 basketball players is 102,000 dollars a week and the average salary of 9 NFL players is 91,000. Find the mean salary of all 16 professional players.

Solution We can easily find the joined mean by adding both mean and dividing by the total number of people.

Let n3=7 denote the number of basketball players, and y3=102000 their mean salary. Let n4=9 the number of NFL players and y4=91000 their mean salary. Then the mean salary of all 16 individuals is: (n3x3+n4x4)/(n3+n4)

#number of basketball players
n_3 <- 7
#number of NFL players
n_4 <- 9
#salary of 7 basketball players
y_3 <- 102000
#salary of 9 NFL players
y_4 <- 91000
# Mean salary overall
salary_ave_bask_nfl <-  (n_3*y_3 + n_4*y_4)/(n_3+n_4)
salary_ave_bask_nfl

Thus, the average salary of all 16 professional players is $95,812.50.

Case-scenario 3 The frequency distribution below lists the number of active players in the Barclays Premier League and the time left in their contract.

Years Number of players 6 28 5 72 4 201 3 109 2 56 1 34

1.Find the mean,the median and the standard deviation.

2.What percentage of the data lies within one standard deviation of the mean?

3.What percentage of the data lies within two standard deviations of the mean?

4.What percent of the data lies within three standard deviations of the mean?

5.Draw a histogram to illustrate the data.

Solution The allcontracts.csv file contains all the players contracts length. We can read this file in R using the read.csv() function.

#This assigns the resulting data frame to the variable to  contract_length
contract_length <- read.csv("C:/Users/auris/Downloads/allcontracts.csv",header = TRUE, sep = ",")
# This assigns the values of the specified column to the variable contract_years
contract_years <- contract_length$years

1.- To find the mean, mediam and the standard deviation

# Find mean - for calculating the mean or average of a set of numbers is straightforward
contracts_mean  <- mean(contract_years)
contracts_mean

In the Barclays Premier League, the average remaining contract length is 3.46 years.

# Median
#The median is the value that separates the higher half from the lower half of the data set. 
contracts_median <- median(contract_years)
contracts_median

In the Barclays Premier League, the median remaining contract length is 3 years.


# Find number of players
contracts_n <- length(contract_years)
contracts_n
# Find standard deviation
contracts_sd <- sd(contract_years)
contracts_sd

In the Barclays Premier League, with 499 active players, the standard deviation of remaining contract length is 1.69 years.

__2.__What percentage of the data lies within one standard deviation of the mean?

contracts_w1sd <- sum((contract_years - contracts_mean)/contracts_sd < 1)/ contracts_n
# Percentage of observation within one standard deviation of the mean
contracts_w1sd
contracts_w1sd*contracts_n

In the Barclays Premier League, with 499 active players, approximately 84%, or 420 players, lie within one standard deviation of the mean (3.46 years) remaining contract length.

## Difference from empirical 
contracts_w1sd - 0.68

__3.__What percentage of the data lies within two standard deviations of the mean?

## Within 2 sd
contracts_w2sd <- sum((contract_years - contracts_mean)/ contracts_sd < 2)/contracts_n
contracts_w2sd
## Difference from empirical 
contracts_w2sd - 0.95

In the Barclays Premier League, all 499 active players have remaining contract lengths that fall within two standard deviations of the mean of 3.46 years.

__4.__What percent of the data lies within three standard deviations of the mean?

## Within 3 sd 
contracts_w3sd <- sum((contract_years - contracts_mean)/ contracts_sd < 3)/contracts_n
contracts_w3sd
## Difference from empirical 
contracts_w3sd - 0.9973

In the Barclays Premier League, all 499 active players have remaining contract lengths that fall within three standard deviations of the mean of 3.46 years.

__5.__Draw a histogram

# Create histogram
hist(contract_years,xlab = "Years Left in Contract",col = "green",border = "red", xlim = c(0,8), ylim = c(0,225),
   breaks = 5)

From the graphic, it’s evident that in the Barclays Premier League, out of 499 active players, approximately 170 have remaining contract lengths of less than 2 years, about 270 have less than 3 years, approximately 370 have less than 4 years, around 470 have less than 5 years, and all have less than 6 years remaining.

Question 3 Use the skills learned in case scenario number 3 on one the following data sets. You may choose only one dataset. They are both available in Canvas.

Solution The file doubles_hit.csv includes data on the double hits made by players. In R, we can import this file using the read.csv() function.

In the Barclays Premier League, the following frequency distribution lists the number of double hits per active player.

Double hits Number by players 37 4 6 7 9 25 18 11

#This assigns the resulting data frame to the variable to doubles
doubles <- read.csv("C:/Users/auris/Downloads/doubles_hit.csv",header = TRUE, sep = ",")
# This assigns the values of the specified column to the variable contract_years
doubles_hits <- doubles$doubles_hit

1.- To find the mean, mediam and the standard deviation

# Find mean - for calculating the mean or average of a set of numbers is straightforward
# Mean -  Average of the contract
doubles_mean  <- mean(doubles_hits)
doubles_mean

In the Barclays Premier League, the average number of double hits per player is 24.

# Median
#The median is the value that separates the higher half from the lower half of the data set.
doubles_median <- median(doubles_hits)
doubles_median

In the Barclays Premier League, the median number of double hits per player is 24

# Find number of observations
doubles_n <- length(doubles_hits)
doubles_n

In the dataset for double hits, we can observe that there are 100 players registered with double hits in the Barclays Premier League.

# Find standard deviation
doubles_sd <- sd(doubles_hits)
doubles_sd

The standard deviation of double hits is 13.37

__2.__What percentage of the data lies within one standard deviation of the mean?

doubles_w1sd <- sum((doubles_hits - doubles_mean)/doubles_sd < 1)/ doubles_n
# Percentage of observation within one standard deviation of the mean
doubles_w1sd
## Difference from empirical 
doubles_w1sd - 0.68

In the dataset for double hits in the Barclays Premier League, among the 100 players, approximately 79% (79 players) lie within one standard deviation of the mean of 24 double hits

_3. What percentage of the data lies within two standard deviations of the mean?

## Within 2 sd
contracts_w2sd <- sum((doubles_hits - doubles_mean)/ doubles_sd < 2)/doubles_n
contracts_w2sd
## Difference from empirical 
contracts_w2sd - 0.95

In the dataset for double hits in the Barclays Premier League, all 100 players are within two standard deviations of the mean of 24 double hits.

_4.__What percent of the data lies within three standard deviations of the mean?

## Within 3 sd
contracts_w3sd <- sum((doubles_hits - doubles_mean)/ doubles_sd < 3)/doubles_n
contracts_w3sd
## Difference from empirical 
contracts_w3sd - 0.9973

In the dataset for double hits in the Barclays Premier League, all 100 players are within three standard deviations of the mean of 24 double hits.

__5.__Draw a histogram

# Create histogram
hist(doubles_hits,xlab = "Number of Doubles Hits",col = "green",border = "red", xlim = c(0,50), ylim = c(0,28),
   breaks = 5)

From the graphic, it’s evident that in the dataset for double hits in the Barclays Premier League, among 100 players, approximately:

-21 players have between 0 and 10 double hits,

-23 players have between 10 and 20 double hits,

-23 players have between 20 and 30 double hits,

-22 players have between 30 and 40 double hits,

-11 players have between 40 and 50 double hits.

LS0tDQp0aXRsZTogIkluLWNsYXNzIGFjdGl2aXR5ICM1KEhXKTogSW50cm9kdWN0aW9uIHRvIFIgZm9yIFNwb3J0cyBBbmFseXRpY3MsIFBhcnQgMiINCm91dHB1dDogaHRtbF9ub3RlYm9vaw0KLS0tDQoNCl9fX0dldHRpbmcgU3RhcnRlZCB3aXRoIFIsUGFydCAyX19fDQpMZXQgdXMgY29udGludWUgZ2V0dGluZyBzdGFydGVkIHdpdGggUiBhcyB3ZSBzdGFydCBkaXNjdXNzaW5nIGltcG9ydGFudCBzdGF0aXN0aWNhbCBjb25jZXB0cyBpbiBTcG9ydHMgQW5hbHl0aWNzLg0KDQpfX0Nhc2Utc2NlbmFyaW8gMV9fDQpUaGlzIGlzIHRoZSBmb3VydGggc2Vhc29uIG9mIG91dGZpZWxkZXIgKkx1aXMgUm9iZXJ0KiB3aXRoIHRoZSAqQ2hpY2FnbyBXaGl0ZSBTb2NrcyouIElmIGR1cmluZyB0aGUgZmlyc3QgdGhyZWUgc2Vhc29ucyBoZSBoaXQgMTEsIDEzLCBhbmQgMTIgaG9tZSBydW5zLCBob3cgbWFueSBkb2VzIGhlIG5lZWQgb24gdGhpcyBzZWFzb24gZm9yIGhpcyBvdmVyYWxsIGF2ZXJhZ2UgdG8gYmUgYXQgbGVhc3QgMjA/DQoNCl9fU29sdXRpb25fXw0KR2l2ZW4gdGhhdCB4MT0xMSx4Mj0xMyx4Mz0xMg0KDQp3ZSB3YW50IHRvIGZpbmQgeDQgc3VjaCB0aGF0IHRoZSBtZWFuIChhdmVyYWdlKSBudW1iZXIgb2YgaG9tZS1ydW5zIGlzIHjCrz49MjANCg0KTm90aWNlIHRoYXQgaW4gdGhpcyBjYXNlIG49NA0KLg0KDQpBY2NvcmRpbmcgdG8gdGhlIGluZm9ybWF0aW9uIGFib3ZlOiAyMMOXND0xMSsxMysxMit4NA0KDQpzbyB3aGVuIHg0PTQ0LCB0aGUgaG9tZS1ydW5zIGF2ZXJhZ2Ugd2lsbCBiZSAyMC4NCg0KYGBge3J9DQojIEhvbWUtcnVucyBzbyBmYXItIGhpc3RvcnkgLSB3ZSBhcmUgZ29pbmcgdG8gYnVpbGQgYSB2ZWN0b3Igd2l0aCB0aGlzIHZhbHVlcw0KSFJfYmVmb3JlIDwtIGMoMTEsIDEzLCAxMikNCiMgQXZlcmFnZSBOdW1iZXIgb2YgSG9tZS1ydW5zIHBlciBzZWFzb24gd2FudGVkDQp3YW50ZWRfSFIgPC0gMjANCiMgTnVtYmVyIG9mIHNlYXNvbnMNCm5fc2Vhc29ucyA8LSA0DQojIE5lZWRlZCBIb21lLXJ1bnMgb24gc2Vhc29uIDQNCnhfNCA8LSBuX3NlYXNvbnMqd2FudGVkX0hSIC0gc3VtKEhSX2JlZm9yZSkNCiMgTWluaW11bSBudW1iZXIgb2YgSG9tZS1ydW5zIG5lZWRlZCBieSBSb2JlcnQNCnhfNA0KYGBgDQpCYXNlZCBvbiB0aGUgY2FsY3VsYXRpb25zIGFib3ZlLCBSb2JlcnQgbmVlZHMgdG8gaGl0IGF0IGxlYXN0IDQ0IGhvbWUgcnVucyB0aGlzIHNlYXNvbiB0byBhY2hpZXZlIGFuIGF2ZXJhZ2Ugb2YgMjAgaG9tZSBydW5zIHBlciBzZWFzb24uDQoNCldlIGNvdWxkIGNvbmZpcm0gdGhpcywgYnkgdXNpbmcgdGhlIGZ1bmN0aW9uIG1lYW4oKSBpbiBSDQoNCmBgYHtyfQ0KIyBEaXZpc2lvbg0KIyBSb2JlcnQncyBwZXJmb3JtYW5jZSB3ZSBhcmUgZ29pbmcgdG8gYnVpbGQgYSB2ZWN0b3Igd2l0aCA0IHZhbHVlcw0KUm9iZXJ0X0hScyA8LSBjKDExLCAxMywgMTIsNDQpDQojIEZpbmQgbWVhbiAtIGZvciBjYWxjdWxhdGluZyB0aGUgbWVhbiBvciBhdmVyYWdlIG9mIGEgc2V0IG9mIG51bWJlcnMgaXMgc3RyYWlnaHRmb3J3YXJkDQptZWFuKFJvYmVydF9IUnMpDQpgYGANClllcywgd2UgY29uZmlybSB0aGF0IHRoZSBhdmVyYWdlIGlzIDIwLg0KDQpgYGB7cn0NCiMgRmluZCBzdGFuZGFyZCBkZXZpYXRpb24gLSBjYWxjdWxhdGUgdGhlIHN0YW5kYXJkIGRldmlhdGlvbiBvZiBhIG51bWVyaWMgdmVjdG9yIHVzaW5nIHRoZSBzZCBmdW5jdGlvbg0Kc2QoUm9iZXJ0X0hScykNCmBgYA0KYGBge3J9DQojIEZpbmQgdGhlIG1heGltdW0gbnVtYmVyIG9mIGhvbWUtcnVucyBkdXJpbmcgdGhlIGZvdXIgc2Vhc29ucyBwZXJpb2QNCiNGaW5kIHRoZSBtYXhpbXVtIHZhbHVlIHVzaW5nIHRoZSBmdW5jdGlvbjogbWF4KG51bWJlcnMpDQpSb2JlcnRfSFJzDQptYXgoUm9iZXJ0X0hScykNCmBgYA0KSW4gdGhpcyBjYXNlIHlvdSBjYW4gc2VlIHRoYXQgdGhlIG1heGltdW0gdmFsdWUgaXMgNDQNCg0KYGBge3J9DQojIEZpbmQgdGhlIG1pbmltdW0gbnVtYmVyIG9mIGhvbWUtcnVucyBkdXJpbmcgdGhlIGZvdXIgc2Vhc29ucyBwZXJpb2QNCiNGaW5kIHRoZSBtaW5pbXVtIHZhbHVlIHVzaW5nIHVzaW5nIHRoZSBmdW5jdGlvbiBtaW4obnVtYmVycykNClJvYmVydF9IUnMNCm1pbihSb2JlcnRfSFJzKQ0KYGBgDQpJbiB0aGlzIGNhc2UgeW91IGNhbiBzZWUgdGhhdCB0aGUgbWluaW11bSB2YWx1ZSBpcyAxMQ0KDQpXZSBjYW4gYWxzbyB1c2UgdGhlIHN1bW1hcnkoKSBmdW5jdGlvbiB0byBmaW5kIGJhc2ljIHN0YXRpc3RpY3MsIGluY2x1ZGluZyB0aGUgbWVkaWFuIQ0KDQpgYGB7cn0NCiNGb3IgbnVtZXJpYyB2ZWN0b3JzLCBzdW1tYXJ5IHByb3ZpZGVzIGEgcXVpY2sgb3ZlcnZpZXcgb2YgeW91ciBkYXRhIGxpa2UgdGhlIG1pbmltdW0sIDFzdCBxdWFydGlsZSwgbWVkaWFuLCBtZWFuLCAzcmQgcXVhcnRpbGUsIGFuZCBtYXhpbXVtIHZhbHVlczoNCnN1bW1hcnkoUm9iZXJ0X0hScykNCmBgYA0KX19RdWVzdGlvbiAxX18NCk5vdywgeW91IG11c3QgY29tcGxldGUgdGhlIHByb2JsZW0gYmVsb3cgd2hpY2ggcmVwcmVzZW50cyBhIHNpbWlsYXIgY2FzZSBzY2VuYXJpby4gWW91IG1heSB1c2UgdGhlIHN0ZXBzIHRoYXQgd2UgZXhlY3V0ZWQgaW4gQ2FzZS1zY2VuYXJpbyAxIGFzIGEgdGVtcGxhdGUgZm9yIHlvdXIgc29sdXRpb24uDQoNClRoaXMgaXMgdGhlIHNpeHRoIHNlYXNvbiBvZiBvdXRmaWVsZGVyICoqSnVhbiBTb3RvKiogaW4gdGhlIG1ham9ycy4gSWYgZHVyaW5nIHRoZSBmaXJzdCBmaXZlIHNlYXNvbnMgaGUgcmVjZWl2ZWQgNzksIDEwOCw0MSwxNDUsIGFuZCAxMzUgd2Fsa3MsIGhvdyBtYW55IGRvZXMgaGUgbmVlZCBvbiB0aGlzIHNlYXNvbiBmb3IgaGlzIG92ZXJhbGwgbnVtYmVyIG9mIHdhbGtzIHJlY2VpdmVkIHBlciBzZWFzb24gdG8gYmUgYXQgbGVhc3QgMTAwPw0KDQpfU29sdXRpb25fDQpHaXZlbiB0aGF0ICB3MT0gNzksIHcyPSAxMDgsIHczPSA0MSwgdzQ9IDE0NSwgYW5kIHc1PSAxMzUNCg0Kd2Ugd2FudCB0byBmaW5kIHc2IHN1Y2ggdGhhdCB0aGUgbWVhbiAoYXZlcmFnZSkgbnVtYmVyIG9mIHdhbGtzIGlzIHg+PTEwMA0KDQpOb3RpY2UgdGhhdCBpbiB0aGlzIGNhc2Ugbj02DQouDQoNCkFjY29yZGluZyB0byB0aGUgaW5mb3JtYXRpb24gYWJvdmU6IDEwMCB4IDYgPSA3OSArIDEwOCArIDQxICsgMTQ1ICsgMTM1ICsgdzYNCg0Kc28gd2hlbiBfdzYgPSA5Ml9fLCB0aGUgb3ZlcmFsbCB3YWxrcyBwZXIgc2Vhc29uIHRvIGJlIGF0IGxlYXN0IDEwMC4NCg0KDQpgYGB7cn0NCiMgV2Fsa3Mgc28gZmFyDQpXYWxrc19iZWZvcmUgPC0gYyg3OSwgMTA4LDQxLDE0NSwgMTM1KQ0KIyBBdmVyYWdlIE51bWJlciBvZiBIb21lLXJ1bnMgcGVyIHNlYXNvbiB3YW50ZWQNCndhbnRlZF93YWxrcyA8LSAxMDANCiMgTnVtYmVyIG9mIHNlYXNvbnMNCkpTbl9zZWFzb25zIDwtIDYNCiMgTmVlZGVkIHdhbGtzIG9uIHNlYXNvbiA2DQp3NiA8LSBKU25fc2Vhc29ucyp3YW50ZWRfd2Fsa3MgLSBzdW0oV2Fsa3NfYmVmb3JlKQ0KIyBNaW5pbXVtIG51bWJlciBvZiBXYWxrcyBuZWVkZWQgYnkgSnVhbiBTb3RvDQp3Ng0KYGBgDQpBY2NvcmRpbmcgdG8gdGhlIGNhbGN1bGF0aW9ucywgSnVhbiBTb3RvIG11c3QgcmVjZWl2ZSA5MiB3YWxrcyB0aGlzIHNlYXNvbiBmb3IgaGlzIGF2ZXJhZ2UgbnVtYmVyIG9mIHdhbGtzIHBlciBzZWFzb24gdG8gYmUgYXQgbGVhc3QgMTAwLg0KDQpfX0Nhc2Utc2NlbmFyaW8gMl9fIFRoZSBhdmVyYWdlIHNhbGFyeSBvZiAxMCBiYXNlYmFsbCBwbGF5ZXJzIGlzIDcyLDAwMCBkb2xsYXJzIGEgd2VlayBhbmQgdGhlIGF2ZXJhZ2Ugc2FsYXJ5IG9mIDQgc29jY2VyIHBsYXllcnMgaXMgODQsMDAwLiBGaW5kIHRoZSBtZWFuIHNhbGFyeSBvZiBhbGwgMTQgcHJvZmVzc2lvbmFsIHBsYXllcnMuDQoNCl9Tb2x1dGlvbl8gV2UgY2FuIGVhc2lseSBmaW5kIHRoZSBqb2luZWQgbWVhbiBieSBhZGRpbmcgYm90aCBtZWFuIGFuZCBkaXZpZGluZyBieSB0aGUgdG90YWwgbnVtYmVyIG9mIHBlb3BsZS4NCg0KTGV0IG4xPTEwIGRlbm90ZSB0aGUgbnVtYmVyIG9mIGJhc2ViYWxsIHBsYXllcnMsIGFuZCB5MT03MjAwMCB0aGVpciBtZWFuIHNhbGFyeS4gTGV0IG4yPTQgdGhlIG51bWJlciBvZiBzb2NjZXIgcGxheWVycyBhbmQgeTI9ODQwMDAgdGhlaXIgbWVhbiBzYWxhcnkuIFRoZW4gdGhlIG1lYW4gc2FsYXJ5IG9mIGFsbCAxNCBpbmRpdmlkdWFscyBpczogKG4xeDErbjJ4MikvKG4xK24yKQ0KDQpXZSBjYW4gY29tcHV0ZSB0aGlzIGluIFIgYXMgZm9sbG93czoNCg0KYGBge3J9DQojbnVtYmVyIG9mIGJhc2ViYWxsIHBsYXllcnMNCm5fMSA8LSAxMCANCiNudW1iZXIgb2Ygc29jY2VyIHBsYXllcnMNCm5fMiA8LSA0DQojc2FsYXJ5IG9mIDEwIGJhc2ViYWxsIHBsYXllcnMNCnlfMSA8LSA3MjAwMA0KI3NhbGFyeSBvZiA0IHNvY2NlciBwbGF5ZXJzDQp5XzIgPC0gODQwMDANCiMgTWVhbiBzYWxhcnkgb3ZlcmFsbA0Kc2FsYXJ5X2F2ZSA8LSAgKG5fMSp5XzEgKyBuXzIqeV8yKS8obl8xK25fMikNCnNhbGFyeV9hdmUNCmBgYA0KDQpUaHVzLCB0aGUgYXZlcmFnZSBzYWxhcnkgb2YgYWxsIDE0IHByb2Zlc3Npb25hbCBwbGF5ZXJzIGlzICQ3NSw0MjguNTcuDQoNCl9fUXVlc3Rpb24gMl9fIFRoZSBhdmVyYWdlIHNhbGFyeSBvZiA3IGJhc2tldGJhbGwgcGxheWVycyBpcyAxMDIsMDAwIGRvbGxhcnMgYSB3ZWVrIGFuZCB0aGUgYXZlcmFnZSBzYWxhcnkgb2YgOSBORkwgcGxheWVycyBpcyA5MSwwMDAuIEZpbmQgdGhlIG1lYW4gc2FsYXJ5IG9mIGFsbCAxNiBwcm9mZXNzaW9uYWwgcGxheWVycy4NCg0KX1NvbHV0aW9uXyBXZSBjYW4gZWFzaWx5IGZpbmQgdGhlIGpvaW5lZCBtZWFuIGJ5IGFkZGluZyBib3RoIG1lYW4gYW5kIGRpdmlkaW5nIGJ5IHRoZSB0b3RhbCBudW1iZXIgb2YgcGVvcGxlLg0KDQpMZXQgbjM9NyBkZW5vdGUgdGhlIG51bWJlciBvZiBiYXNrZXRiYWxsIHBsYXllcnMsIGFuZCB5Mz0xMDIwMDAgdGhlaXIgbWVhbiBzYWxhcnkuIExldCBuND05IHRoZSBudW1iZXIgb2YgTkZMIHBsYXllcnMgYW5kIHk0PTkxMDAwIHRoZWlyIG1lYW4gc2FsYXJ5LiBUaGVuIHRoZSBtZWFuIHNhbGFyeSBvZiBhbGwgMTYgaW5kaXZpZHVhbHMgaXM6IChuM3gzK240eDQpLyhuMytuNCkNCg0KYGBge3J9DQojbnVtYmVyIG9mIGJhc2tldGJhbGwgcGxheWVycw0Kbl8zIDwtIDcNCiNudW1iZXIgb2YgTkZMIHBsYXllcnMNCm5fNCA8LSA5DQojc2FsYXJ5IG9mIDcgYmFza2V0YmFsbCBwbGF5ZXJzDQp5XzMgPC0gMTAyMDAwDQojc2FsYXJ5IG9mIDkgTkZMIHBsYXllcnMNCnlfNCA8LSA5MTAwMA0KIyBNZWFuIHNhbGFyeSBvdmVyYWxsDQpzYWxhcnlfYXZlX2Jhc2tfbmZsIDwtICAobl8zKnlfMyArIG5fNCp5XzQpLyhuXzMrbl80KQ0Kc2FsYXJ5X2F2ZV9iYXNrX25mbA0KYGBgDQpUaHVzLCB0aGUgYXZlcmFnZSBzYWxhcnkgb2YgYWxsIDE2IHByb2Zlc3Npb25hbCBwbGF5ZXJzIGlzICQ5NSw4MTIuNTAuDQoNCl9fQ2FzZS1zY2VuYXJpbyAzX18gVGhlIGZyZXF1ZW5jeSBkaXN0cmlidXRpb24gYmVsb3cgbGlzdHMgdGhlIG51bWJlciBvZiBhY3RpdmUgcGxheWVycyBpbiB0aGUgQmFyY2xheXMgUHJlbWllciBMZWFndWUgYW5kIHRoZSB0aW1lIGxlZnQgaW4gdGhlaXIgY29udHJhY3QuDQoNClllYXJzIE51bWJlciBvZiBwbGF5ZXJzIDYgMjggNSA3MiA0IDIwMSAzIDEwOSAyIDU2IDEgMzQNCg0KMS5GaW5kIHRoZSBtZWFuLHRoZSBtZWRpYW4gYW5kIHRoZSBzdGFuZGFyZCBkZXZpYXRpb24uDQoNCjIuV2hhdCBwZXJjZW50YWdlIG9mIHRoZSBkYXRhIGxpZXMgd2l0aGluIG9uZSBzdGFuZGFyZCBkZXZpYXRpb24gb2YgdGhlIG1lYW4/DQoNCjMuV2hhdCBwZXJjZW50YWdlIG9mIHRoZSBkYXRhIGxpZXMgd2l0aGluIHR3byBzdGFuZGFyZCBkZXZpYXRpb25zIG9mIHRoZSBtZWFuPw0KDQo0LldoYXQgcGVyY2VudCBvZiB0aGUgZGF0YSBsaWVzIHdpdGhpbiB0aHJlZSBzdGFuZGFyZCBkZXZpYXRpb25zIG9mIHRoZSBtZWFuPw0KDQo1LkRyYXcgYSBoaXN0b2dyYW0gdG8gaWxsdXN0cmF0ZSB0aGUgZGF0YS4NCg0KX19Tb2x1dGlvbl9fIFRoZSBhbGxjb250cmFjdHMuY3N2IGZpbGUgY29udGFpbnMgYWxsIHRoZSBwbGF5ZXJzIGNvbnRyYWN0cyBsZW5ndGguIFdlIGNhbiByZWFkIHRoaXMgZmlsZSBpbiBSIHVzaW5nIHRoZSByZWFkLmNzdigpIGZ1bmN0aW9uLg0KDQpgYGB7cn0NCiNUaGlzIGFzc2lnbnMgdGhlIHJlc3VsdGluZyBkYXRhIGZyYW1lIHRvIHRoZSB2YXJpYWJsZSB0byAgY29udHJhY3RfbGVuZ3RoDQpjb250cmFjdF9sZW5ndGggPC0gcmVhZC5jc3YoIkM6L1VzZXJzL2F1cmlzL0Rvd25sb2Fkcy9hbGxjb250cmFjdHMuY3N2IixoZWFkZXIgPSBUUlVFLCBzZXAgPSAiLCIpDQojIFRoaXMgYXNzaWducyB0aGUgdmFsdWVzIG9mIHRoZSBzcGVjaWZpZWQgY29sdW1uIHRvIHRoZSB2YXJpYWJsZSBjb250cmFjdF95ZWFycw0KY29udHJhY3RfeWVhcnMgPC0gY29udHJhY3RfbGVuZ3RoJHllYXJzDQpgYGANCg0KX18xLi1fXyBUbyBmaW5kIHRoZSBtZWFuLCBtZWRpYW0gIGFuZCB0aGUgc3RhbmRhcmQgZGV2aWF0aW9uDQoNCmBgYHtyfQ0KIyBGaW5kIG1lYW4gLSBmb3IgY2FsY3VsYXRpbmcgdGhlIG1lYW4gb3IgYXZlcmFnZSBvZiBhIHNldCBvZiBudW1iZXJzIGlzIHN0cmFpZ2h0Zm9yd2FyZA0KY29udHJhY3RzX21lYW4gIDwtIG1lYW4oY29udHJhY3RfeWVhcnMpDQpjb250cmFjdHNfbWVhbg0KYGBgDQoNCkluIHRoZSBCYXJjbGF5cyBQcmVtaWVyIExlYWd1ZSwgdGhlIGF2ZXJhZ2UgcmVtYWluaW5nIGNvbnRyYWN0IGxlbmd0aCBpcyAzLjQ2IHllYXJzLg0KDQpgYGB7cn0NCiMgTWVkaWFuDQojVGhlIG1lZGlhbiBpcyB0aGUgdmFsdWUgdGhhdCBzZXBhcmF0ZXMgdGhlIGhpZ2hlciBoYWxmIGZyb20gdGhlIGxvd2VyIGhhbGYgb2YgdGhlIGRhdGEgc2V0LiANCmNvbnRyYWN0c19tZWRpYW4gPC0gbWVkaWFuKGNvbnRyYWN0X3llYXJzKQ0KY29udHJhY3RzX21lZGlhbg0KYGBgDQoNCkluIHRoZSBCYXJjbGF5cyBQcmVtaWVyIExlYWd1ZSwgdGhlIG1lZGlhbiByZW1haW5pbmcgY29udHJhY3QgbGVuZ3RoIGlzIDMgeWVhcnMuDQoNCmBgYHtyfQ0KDQojIEZpbmQgbnVtYmVyIG9mIHBsYXllcnMNCmNvbnRyYWN0c19uIDwtIGxlbmd0aChjb250cmFjdF95ZWFycykNCmNvbnRyYWN0c19uDQojIEZpbmQgc3RhbmRhcmQgZGV2aWF0aW9uDQpjb250cmFjdHNfc2QgPC0gc2QoY29udHJhY3RfeWVhcnMpDQpjb250cmFjdHNfc2QNCmBgYA0KDQpJbiB0aGUgQmFyY2xheXMgUHJlbWllciBMZWFndWUsIHdpdGggNDk5IGFjdGl2ZSBwbGF5ZXJzLCB0aGUgc3RhbmRhcmQgZGV2aWF0aW9uIG9mIHJlbWFpbmluZyBjb250cmFjdCBsZW5ndGggaXMgMS42OSB5ZWFycy4NCg0KX18yLl9fV2hhdCBwZXJjZW50YWdlIG9mIHRoZSBkYXRhIGxpZXMgd2l0aGluIG9uZSBzdGFuZGFyZCBkZXZpYXRpb24gb2YgdGhlIG1lYW4/DQoNCmBgYHtyfQ0KY29udHJhY3RzX3cxc2QgPC0gc3VtKChjb250cmFjdF95ZWFycyAtIGNvbnRyYWN0c19tZWFuKS9jb250cmFjdHNfc2QgPCAxKS8gY29udHJhY3RzX24NCiMgUGVyY2VudGFnZSBvZiBvYnNlcnZhdGlvbiB3aXRoaW4gb25lIHN0YW5kYXJkIGRldmlhdGlvbiBvZiB0aGUgbWVhbg0KY29udHJhY3RzX3cxc2QNCmBgYA0KYGBge3J9DQpjb250cmFjdHNfdzFzZCpjb250cmFjdHNfbg0KYGBgDQoNCg0KSW4gdGhlIEJhcmNsYXlzIFByZW1pZXIgTGVhZ3VlLCB3aXRoIDQ5OSBhY3RpdmUgcGxheWVycywgYXBwcm94aW1hdGVseSA4NCUsIG9yIDQyMCBwbGF5ZXJzLCBsaWUgd2l0aGluIG9uZSBzdGFuZGFyZCBkZXZpYXRpb24gb2YgdGhlIG1lYW4gKDMuNDYgeWVhcnMpIHJlbWFpbmluZyBjb250cmFjdCBsZW5ndGguDQoNCmBgYHtyfQ0KIyMgRGlmZmVyZW5jZSBmcm9tIGVtcGlyaWNhbCANCmNvbnRyYWN0c193MXNkIC0gMC42OA0KYGBgDQpfXzMuX19XaGF0IHBlcmNlbnRhZ2Ugb2YgdGhlIGRhdGEgbGllcyB3aXRoaW4gdHdvIHN0YW5kYXJkIGRldmlhdGlvbnMgb2YgdGhlIG1lYW4/DQoNCmBgYHtyfQ0KIyMgV2l0aGluIDIgc2QNCmNvbnRyYWN0c193MnNkIDwtIHN1bSgoY29udHJhY3RfeWVhcnMgLSBjb250cmFjdHNfbWVhbikvIGNvbnRyYWN0c19zZCA8IDIpL2NvbnRyYWN0c19uDQpjb250cmFjdHNfdzJzZA0KYGBgDQpgYGB7cn0NCiMjIERpZmZlcmVuY2UgZnJvbSBlbXBpcmljYWwgDQpjb250cmFjdHNfdzJzZCAtIDAuOTUNCmBgYA0KSW4gdGhlIEJhcmNsYXlzIFByZW1pZXIgTGVhZ3VlLCBhbGwgNDk5IGFjdGl2ZSBwbGF5ZXJzIGhhdmUgcmVtYWluaW5nIGNvbnRyYWN0IGxlbmd0aHMgdGhhdCBmYWxsIHdpdGhpbiB0d28gc3RhbmRhcmQgZGV2aWF0aW9ucyBvZiB0aGUgbWVhbiBvZiAzLjQ2IHllYXJzLg0KDQpfXzQuX19XaGF0IHBlcmNlbnQgb2YgdGhlIGRhdGEgbGllcyB3aXRoaW4gdGhyZWUgc3RhbmRhcmQgZGV2aWF0aW9ucyBvZiB0aGUgbWVhbj8NCg0KYGBge3J9DQojIyBXaXRoaW4gMyBzZCANCmNvbnRyYWN0c193M3NkIDwtIHN1bSgoY29udHJhY3RfeWVhcnMgLSBjb250cmFjdHNfbWVhbikvIGNvbnRyYWN0c19zZCA8IDMpL2NvbnRyYWN0c19uDQpjb250cmFjdHNfdzNzZA0KYGBgDQoNCg0KYGBge3J9DQojIyBEaWZmZXJlbmNlIGZyb20gZW1waXJpY2FsIA0KY29udHJhY3RzX3czc2QgLSAwLjk5NzMNCmBgYA0KDQpJbiB0aGUgQmFyY2xheXMgUHJlbWllciBMZWFndWUsIGFsbCA0OTkgYWN0aXZlIHBsYXllcnMgaGF2ZSByZW1haW5pbmcgY29udHJhY3QgbGVuZ3RocyB0aGF0IGZhbGwgd2l0aGluIHRocmVlIHN0YW5kYXJkIGRldmlhdGlvbnMgb2YgdGhlIG1lYW4gb2YgMy40NiB5ZWFycy4NCg0KX181Ll9fRHJhdyBhIGhpc3RvZ3JhbQ0KDQpgYGB7cn0NCiMgQ3JlYXRlIGhpc3RvZ3JhbQ0KaGlzdChjb250cmFjdF95ZWFycyx4bGFiID0gIlllYXJzIExlZnQgaW4gQ29udHJhY3QiLGNvbCA9ICJncmVlbiIsYm9yZGVyID0gInJlZCIsIHhsaW0gPSBjKDAsOCksIHlsaW0gPSBjKDAsMjI1KSwNCiAgIGJyZWFrcyA9IDUpDQpgYGANCg0KRnJvbSB0aGUgZ3JhcGhpYywgaXQncyBldmlkZW50IHRoYXQgaW4gdGhlIEJhcmNsYXlzIFByZW1pZXIgTGVhZ3VlLCBvdXQgb2YgNDk5IGFjdGl2ZSBwbGF5ZXJzLCBhcHByb3hpbWF0ZWx5IDE3MCBoYXZlIHJlbWFpbmluZyBjb250cmFjdCBsZW5ndGhzIG9mIGxlc3MgdGhhbiAyIHllYXJzLCBhYm91dCAyNzAgaGF2ZSBsZXNzIHRoYW4gMyB5ZWFycywgYXBwcm94aW1hdGVseSAzNzAgaGF2ZSBsZXNzIHRoYW4gNCB5ZWFycywgYXJvdW5kIDQ3MCBoYXZlIGxlc3MgdGhhbiA1IHllYXJzLCBhbmQgYWxsIGhhdmUgbGVzcyB0aGFuIDYgeWVhcnMgcmVtYWluaW5nLg0KDQoNCl9fUXVlc3Rpb24gM19fIFVzZSB0aGUgc2tpbGxzIGxlYXJuZWQgaW4gY2FzZSBzY2VuYXJpbyBudW1iZXIgMyBvbiBvbmUgdGhlIGZvbGxvd2luZyBkYXRhIHNldHMuIFlvdSBtYXkgY2hvb3NlIG9ubHkgb25lIGRhdGFzZXQuIFRoZXkgYXJlIGJvdGggYXZhaWxhYmxlIGluIENhbnZhcy4NCg0KX19Tb2x1dGlvbl9fIFRoZSBmaWxlIGRvdWJsZXNfaGl0LmNzdiBpbmNsdWRlcyBkYXRhIG9uIHRoZSBkb3VibGUgaGl0cyBtYWRlIGJ5IHBsYXllcnMuIEluIFIsIHdlIGNhbiBpbXBvcnQgdGhpcyBmaWxlIHVzaW5nIHRoZSByZWFkLmNzdigpIGZ1bmN0aW9uLg0KDQpJbiB0aGUgQmFyY2xheXMgUHJlbWllciBMZWFndWUsIHRoZSBmb2xsb3dpbmcgZnJlcXVlbmN5IGRpc3RyaWJ1dGlvbiBsaXN0cyB0aGUgbnVtYmVyIG9mIGRvdWJsZSBoaXRzIHBlciBhY3RpdmUgcGxheWVyLg0KDQpEb3VibGUgaGl0cyBOdW1iZXIgYnkgcGxheWVycyAzNyA0IDYgNyA5IDI1IDE4IDExDQoNCg0KYGBge3J9DQojVGhpcyBhc3NpZ25zIHRoZSByZXN1bHRpbmcgZGF0YSBmcmFtZSB0byB0aGUgdmFyaWFibGUgdG8gZG91Ymxlcw0KZG91YmxlcyA8LSByZWFkLmNzdigiQzovVXNlcnMvYXVyaXMvRG93bmxvYWRzL2RvdWJsZXNfaGl0LmNzdiIsaGVhZGVyID0gVFJVRSwgc2VwID0gIiwiKQ0KIyBUaGlzIGFzc2lnbnMgdGhlIHZhbHVlcyBvZiB0aGUgc3BlY2lmaWVkIGNvbHVtbiB0byB0aGUgdmFyaWFibGUgY29udHJhY3RfeWVhcnMNCmRvdWJsZXNfaGl0cyA8LSBkb3VibGVzJGRvdWJsZXNfaGl0DQpgYGANCg0KX18xLi1fXyBUbyBmaW5kIHRoZSBtZWFuLCBtZWRpYW0gIGFuZCB0aGUgc3RhbmRhcmQgZGV2aWF0aW9uDQoNCmBgYHtyfQ0KIyBGaW5kIG1lYW4gLSBmb3IgY2FsY3VsYXRpbmcgdGhlIG1lYW4gb3IgYXZlcmFnZSBvZiBhIHNldCBvZiBudW1iZXJzIGlzIHN0cmFpZ2h0Zm9yd2FyZA0KIyBNZWFuIC0gIEF2ZXJhZ2Ugb2YgdGhlIGNvbnRyYWN0DQpkb3VibGVzX21lYW4gIDwtIG1lYW4oZG91Ymxlc19oaXRzKQ0KZG91Ymxlc19tZWFuDQpgYGANCkluIHRoZSBCYXJjbGF5cyBQcmVtaWVyIExlYWd1ZSwgdGhlIGF2ZXJhZ2UgbnVtYmVyIG9mIGRvdWJsZSBoaXRzIHBlciBwbGF5ZXIgaXMgMjQuDQoNCmBgYHtyfQ0KIyBNZWRpYW4NCiNUaGUgbWVkaWFuIGlzIHRoZSB2YWx1ZSB0aGF0IHNlcGFyYXRlcyB0aGUgaGlnaGVyIGhhbGYgZnJvbSB0aGUgbG93ZXIgaGFsZiBvZiB0aGUgZGF0YSBzZXQuDQpkb3VibGVzX21lZGlhbiA8LSBtZWRpYW4oZG91Ymxlc19oaXRzKQ0KZG91Ymxlc19tZWRpYW4NCg0KYGBgDQpJbiB0aGUgQmFyY2xheXMgUHJlbWllciBMZWFndWUsIHRoZSBtZWRpYW4gbnVtYmVyIG9mIGRvdWJsZSBoaXRzIHBlciBwbGF5ZXIgaXMgMjQNCg0KYGBge3J9DQojIEZpbmQgbnVtYmVyIG9mIG9ic2VydmF0aW9ucw0KZG91Ymxlc19uIDwtIGxlbmd0aChkb3VibGVzX2hpdHMpDQpkb3VibGVzX24NCg0KYGBgDQpJbiB0aGUgZGF0YXNldCBmb3IgZG91YmxlIGhpdHMsIHdlIGNhbiBvYnNlcnZlIHRoYXQgdGhlcmUgYXJlIDEwMCBwbGF5ZXJzIHJlZ2lzdGVyZWQgd2l0aCBkb3VibGUgaGl0cyBpbiB0aGUgQmFyY2xheXMgUHJlbWllciBMZWFndWUuDQoNCmBgYHtyfQ0KIyBGaW5kIHN0YW5kYXJkIGRldmlhdGlvbg0KZG91Ymxlc19zZCA8LSBzZChkb3VibGVzX2hpdHMpDQpkb3VibGVzX3NkDQpgYGANClRoZSBzdGFuZGFyZCBkZXZpYXRpb24gb2YgZG91YmxlIGhpdHMgaXMgMTMuMzcNCg0KX18yLl9fV2hhdCBwZXJjZW50YWdlIG9mIHRoZSBkYXRhIGxpZXMgd2l0aGluIG9uZSBzdGFuZGFyZCBkZXZpYXRpb24gb2YgdGhlIG1lYW4/DQpgYGB7cn0NCmRvdWJsZXNfdzFzZCA8LSBzdW0oKGRvdWJsZXNfaGl0cyAtIGRvdWJsZXNfbWVhbikvZG91Ymxlc19zZCA8IDEpLyBkb3VibGVzX24NCiMgUGVyY2VudGFnZSBvZiBvYnNlcnZhdGlvbiB3aXRoaW4gb25lIHN0YW5kYXJkIGRldmlhdGlvbiBvZiB0aGUgbWVhbg0KZG91Ymxlc193MXNkDQpgYGANCg0KYGBge3J9DQojIyBEaWZmZXJlbmNlIGZyb20gZW1waXJpY2FsIA0KZG91Ymxlc193MXNkIC0gMC42OA0KYGBgDQoNCkluIHRoZSBkYXRhc2V0IGZvciBkb3VibGUgaGl0cyBpbiB0aGUgQmFyY2xheXMgUHJlbWllciBMZWFndWUsIGFtb25nIHRoZSAxMDAgcGxheWVycywgYXBwcm94aW1hdGVseSA3OSUgKDc5IHBsYXllcnMpIGxpZSB3aXRoaW4gb25lIHN0YW5kYXJkIGRldmlhdGlvbiBvZiB0aGUgbWVhbiBvZiAyNCBkb3VibGUgaGl0cyANCg0KXzMuIFdoYXQgcGVyY2VudGFnZSBvZiB0aGUgZGF0YSBsaWVzIHdpdGhpbiB0d28gc3RhbmRhcmQgZGV2aWF0aW9ucyBvZiB0aGUgbWVhbj8NCg0KYGBge3J9DQojIyBXaXRoaW4gMiBzZA0KY29udHJhY3RzX3cyc2QgPC0gc3VtKChkb3VibGVzX2hpdHMgLSBkb3VibGVzX21lYW4pLyBkb3VibGVzX3NkIDwgMikvZG91Ymxlc19uDQpjb250cmFjdHNfdzJzZA0KYGBgDQpgYGB7cn0NCiMjIERpZmZlcmVuY2UgZnJvbSBlbXBpcmljYWwgDQpjb250cmFjdHNfdzJzZCAtIDAuOTUNCmBgYA0KDQoNCkluIHRoZSBkYXRhc2V0IGZvciBkb3VibGUgaGl0cyBpbiB0aGUgQmFyY2xheXMgUHJlbWllciBMZWFndWUsIGFsbCAxMDAgcGxheWVycyBhcmUgd2l0aGluIHR3byBzdGFuZGFyZCBkZXZpYXRpb25zIG9mIHRoZSBtZWFuIG9mIDI0IGRvdWJsZSBoaXRzLg0KDQpfNC5fX1doYXQgcGVyY2VudCBvZiB0aGUgZGF0YSBsaWVzIHdpdGhpbiB0aHJlZSBzdGFuZGFyZCBkZXZpYXRpb25zIG9mIHRoZSBtZWFuPw0KDQpgYGB7cn0NCiMjIFdpdGhpbiAzIHNkDQpjb250cmFjdHNfdzNzZCA8LSBzdW0oKGRvdWJsZXNfaGl0cyAtIGRvdWJsZXNfbWVhbikvIGRvdWJsZXNfc2QgPCAzKS9kb3VibGVzX24NCmNvbnRyYWN0c193M3NkDQpgYGANCg0KYGBge3J9DQojIyBEaWZmZXJlbmNlIGZyb20gZW1waXJpY2FsIA0KY29udHJhY3RzX3czc2QgLSAwLjk5NzMNCmBgYA0KSW4gdGhlIGRhdGFzZXQgZm9yIGRvdWJsZSBoaXRzIGluIHRoZSBCYXJjbGF5cyBQcmVtaWVyIExlYWd1ZSwgYWxsIDEwMCBwbGF5ZXJzIGFyZSB3aXRoaW4gdGhyZWUgc3RhbmRhcmQgZGV2aWF0aW9ucyBvZiB0aGUgbWVhbiBvZiAyNCBkb3VibGUgaGl0cy4NCg0KX181Ll9fRHJhdyBhIGhpc3RvZ3JhbQ0KDQpgYGB7cn0NCiMgQ3JlYXRlIGhpc3RvZ3JhbQ0KaGlzdChkb3VibGVzX2hpdHMseGxhYiA9ICJOdW1iZXIgb2YgRG91YmxlcyBIaXRzIixjb2wgPSAiZ3JlZW4iLGJvcmRlciA9ICJyZWQiLCB4bGltID0gYygwLDUwKSwgeWxpbSA9IGMoMCwyOCksDQogICBicmVha3MgPSA1KQ0KYGBgDQoNCg0KRnJvbSB0aGUgZ3JhcGhpYywgaXQncyBldmlkZW50IHRoYXQgaW4gdGhlIGRhdGFzZXQgZm9yIGRvdWJsZSBoaXRzIGluIHRoZSBCYXJjbGF5cyBQcmVtaWVyIExlYWd1ZSwgYW1vbmcgMTAwIHBsYXllcnMsIGFwcHJveGltYXRlbHk6DQoNCi0yMSBwbGF5ZXJzIGhhdmUgYmV0d2VlbiAwIGFuZCAxMCBkb3VibGUgaGl0cywNCg0KLTIzIHBsYXllcnMgaGF2ZSBiZXR3ZWVuIDEwIGFuZCAyMCBkb3VibGUgaGl0cywNCg0KLTIzIHBsYXllcnMgaGF2ZSBiZXR3ZWVuIDIwIGFuZCAzMCBkb3VibGUgaGl0cywNCg0KLTIyIHBsYXllcnMgaGF2ZSBiZXR3ZWVuIDMwIGFuZCA0MCBkb3VibGUgaGl0cywNCg0KLTExIHBsYXllcnMgaGF2ZSBiZXR3ZWVuIDQwIGFuZCA1MCBkb3VibGUgaGl0cy4NCg0KDQo=