A stock market is where buyers and sellers trade shares of a company, and is one of the most popular ways for individuals and companies to invest money. The size of the world stock market is now estimated to be in the trillions. The largest stock market in the world is the New York Stock Exchange (NYSE), located in New York City. About 2,800 companies are listed on the NSYE. In this problem, we’ll look at the monthly stock prices of five of these companies: IBM, General Electric (GE), Procter and Gamble, Coca Cola, and Boeing. The data used in this problem comes from Infochimps.

Download and read the following files into R, using the read.csv function: IBMStock.csv, GEStock.csv, ProcterGambleStock.csv, CocaColaStock.csv, and BoeingStock.csv. (Do not open these files in any spreadsheet software before completing this problem because it might change the format of the Date field.)

Call the data frames “IBM”, “GE”, “ProcterGamble”, “CocaCola”, and “Boeing”, respectively. Each data frame has two variables, described as follows:

Date: the date of the stock price, always given as the first of the month. StockPrice: the average stock price of the company in the given month. In this problem, we’ll take a look at how the stock dynamics of these companies have changed over time.

Section 1 - Summary Statistics

1.1

Before working with these data sets, we need to convert the dates into a format that R can understand. Take a look at the structure of one of the datasets using the str function. Right now, the date variable is stored as a factor. We can convert this to a “Date” object in R by using the following five commands (one for each data set):

IBM$Date = as.Date(IBM$Date, "%m/%d/%y")

GE$Date = as.Date(GE$Date, "%m/%d/%y")

CocaCola$Date = as.Date(CocaCola$Date, "%m/%d/%y")

ProcterGamble$Date = as.Date(ProcterGamble$Date, "%m/%d/%y")

Boeing$Date = as.Date(Boeing$Date, "%m/%d/%y")

The first argument to the as.Date function is the variable we want to convert, and the second argument is the format of the Date variable. We can just overwrite the original Date variable values with the output of this function. Now, answer the following questions using the str and summary functions.

Our five datasets all have the same number of observations. How many observations are there in each data set?

str(IBM) #ans:480
'data.frame':   480 obs. of  2 variables:
 $ Date      : Date, format: "1970-01-01" "1970-02-01" ...
 $ StockPrice: num  360 347 327 320 270 ...

1.2

What is the earliest year in our datasets?

summary(IBM) #ans: 1970
      Date              StockPrice    
 Min.   :1970-01-01   Min.   : 43.40  
 1st Qu.:1979-12-24   1st Qu.: 88.34  
 Median :1989-12-16   Median :112.11  
 Mean   :1989-12-15   Mean   :144.38  
 3rd Qu.:1999-12-08   3rd Qu.:165.41  
 Max.   :2009-12-01   Max.   :438.90  

1.3

What is the latest year in our datasets?

summary(IBM) #ans: 2009
      Date              StockPrice    
 Min.   :1970-01-01   Min.   : 43.40  
 1st Qu.:1979-12-24   1st Qu.: 88.34  
 Median :1989-12-16   Median :112.11  
 Mean   :1989-12-15   Mean   :144.38  
 3rd Qu.:1999-12-08   3rd Qu.:165.41  
 Max.   :2009-12-01   Max.   :438.90  

1.4

What is the mean stock price of IBM over this time period?

#ans: 144.38

1.5

What is the minimum stock price of General Electric (GE) over this time period?

summary(GE) #ans: 9.294
      Date              StockPrice     
 Min.   :1970-01-01   Min.   :  9.294  
 1st Qu.:1979-12-24   1st Qu.: 44.214  
 Median :1989-12-16   Median : 55.812  
 Mean   :1989-12-15   Mean   : 59.303  
 3rd Qu.:1999-12-08   3rd Qu.: 72.226  
 Max.   :2009-12-01   Max.   :156.844  

1.6

What is the maximum stock price of Coca-Cola over this time period?

summary(CocaCola) #146.58
      Date              StockPrice    
 Min.   :1970-01-01   Min.   : 30.06  
 1st Qu.:1979-12-24   1st Qu.: 42.76  
 Median :1989-12-16   Median : 51.44  
 Mean   :1989-12-15   Mean   : 60.03  
 3rd Qu.:1999-12-08   3rd Qu.: 69.62  
 Max.   :2009-12-01   Max.   :146.58  

1.7

What is the median stock price of Boeing over this time period?

summary(Boeing)
      Date              StockPrice    
 Min.   :1970-01-01   Min.   : 12.74  
 1st Qu.:1979-12-24   1st Qu.: 34.64  
 Median :1989-12-16   Median : 44.88  
 Mean   :1989-12-15   Mean   : 46.59  
 3rd Qu.:1999-12-08   3rd Qu.: 57.21  
 Max.   :2009-12-01   Max.   :107.28  

1.8

What is the standard deviation of the stock price of Procter & Gamble over this time period?

sd(ProcterGamble$StockPrice)
[1] 18.19414

Section 2 - Visualizing Stock Dynamics

Let’s plot the stock prices to see if we can visualize trends in stock prices during this time period. Using the plot function, plot the Date on the x-axis and the StockPrice on the y-axis, for Coca-Cola.

This plots our observations as points, but we would really like to see a line instead, since this is a continuous time period. To do this, add the argument type=“l” to your plot command, and re-generate the plot (the character is quotes is the letter l, for line). You should now see a line plot of the Coca-Cola stock price.

2.1

Around what year did Coca-Cola has its highest stock price in this time period?

  • 1973
  • 1980
  • 1985
  • 1995
  • 2008
plot(CocaCola$Date,CocaCola$StockPrice,type="l") #type="l" 將點換為line #ans: 1973

Around what year did Coca-Cola has its lowest stock price in this time period?

#ans: 1980

2.2

Now, let’s add the line for Procter & Gamble too. You can add a line to a plot in R by using the lines function instead of the plot function. Keeping the plot for Coca-Cola open, type in your R console:

lines(ProcterGamble$Date, ProcterGamble$StockPrice)

Unfortunately, it’s hard to tell which line is which. Let’s fix this by giving each line a color. First, re-run the plot command for Coca-Cola, but add the argument col=“red”. You should see the plot for Coca-Cola show up again, but this time in red. Now, let’s add the Procter & Gamble line (using the lines function like we did before), adding the argument col=“blue”. You should now see in your plot the Coca-Cola stock price in red, and the Procter & Gamble stock price in blue.

As an alternative choice to changing the colors, you could instead change the line type of the Procter & Gamble line by adding the argument lty=2. This will make the Procter & Gamble line dashed.

Using this plot, answer the following questions.

In March of 2000, the technology bubble burst, and a stock market crash occurred. According to this plot, which company’s stock dropped more?

  • Coca-Cola
  • Procter and Gamble
plot(CocaCola$Date,CocaCola$StockPrice,type="l",col="red")
lines(ProcterGamble$Date, ProcterGamble$StockPrice,col="blue",lty=2) #lty=2 虛線 #plot和lines兩個funtion要一起執行
#Procter and Gamble dropped more
abline(v=as.Date(c("2000-03-01")), lwd=2) #劃一條垂直實線

To answer this question and the ones that follow, you may find it useful to draw a vertical line at a certain date. To do this, type the command

abline(v=as.Date(c("2000-03-01")), lwd=2)

in your R console, with the plot still open. This generates a vertical line at the date March 1, 2000. The argument lwd=2 makes the line a little thicker. You can change the date in this command to generate the vertical line in different locations.

2.3

Answer these questions using the plot you generated in the previous problem.

Around 1983, the stock for one of these companies (Coca-Cola or Procter and Gamble) was going up, while the other was going down. Which one was going up?

  • Coca-Cola
  • Procter and Gamble
#Procter and Gamble

2.4

In the time period shown in the plot, which stock generally has lower values?

  • Coca-Cola
  • Procter and Gamble
#ans: Coca-Cola

Section 3 - Visualizing Stock Dynamics 1995-2005

Let’s take a look at how the stock prices changed from 1995-2005 for all five companies. In your R console, start by typing the following plot command:

plot(CocaCola$Date[301:432], CocaCola$StockPrice[301:432], type="l",    
col="red", ylim=c(0,210))

This will plot the CocaCola stock prices from 1995 through 2005, which are the observations numbered from 301 to 432. The additional argument, ylim=c(0,210), makes the y-axis range from 0 to 210. This will allow us to see all of the stock values when we add in the other companies.

Now, use the lines function to add in the other four companies, remembering to only plot the observations from 1995 to 2005, or [301:432]. You don’t need the “type” or “ylim” arguments for the lines function, but remember to make each company a different color so that you can tell them apart. Some color options are “red”, “blue”, “green”, “purple”, “orange”, and “black”. To see all of the color options in R, type colors() in your R console.

(If you prefer to change the type of the line instead of the color, here are some options for changing the line type: lty=2 will make the line dashed, lty=3 will make the line dotted, lty=4 will make the line alternate between dashes and dots, and lty=5 will make the line long-dashed.)

Use this plot to answer the following four questions.

plot(CocaCola$Date[301:432], CocaCola$StockPrice[301:432], type="l",    
col="red", ylim=c(0,210))
lines(Boeing$Date[301:432], Boeing$StockPrice[301:432],col="blue")
lines(GE$Date[301:432], GE$StockPrice[301:432],col="green")
lines(IBM$Date[301:432], IBM$StockPrice[301:432],col="purple")
lines(ProcterGamble$Date[301:432], ProcterGamble$StockPrice[301:432],col="orange")
abline(v=as.Date(c("2000-03-01")), lwd=2)
abline(v=as.Date(c("1997-09-01")), lwd=2)
abline(v=as.Date(c("1997-11-01")), lwd=2)

3.1

Which stock fell the most right after the technology bubble burst in March 2000?

  • Coca-Cola
  • Procter and Gamble
  • IBM
  • General Electric (GE)
  • Boeing
#ans: GE

3.2

Which stock reaches the highest value in the time period 1995-2005?

  • Coca-Cola
  • Procter and Gamble
  • IBM
  • General Electric (GE)
  • Boeing
#ans: IBM

3.3

In October of 1997, there was a global stock market crash that was caused by an economic crisis in Asia. Comparing September 1997 to November 1997, which companies saw a decreasing trend in their stock price? (Select all that apply.)

  • Coca-Cola
  • Procter and Gamble
  • IBM
  • General Electric (GE)
  • Boeing
#ans: Procter and Gamble,Boeing

3.4

In the last two years of this time period (2004 and 2005) which stock seems to be performing the best, in terms of increasing stock price?

  • Coca-Cola
  • Procter and Gamble
  • IBM
  • General Electric (GE)
  • Boeing
#ans IBM
LS0tCnRpdGxlOiAiQVMxLTIgU3RvY2sgRHluYW1pY3MiCmF1dGhvcjogIumZs+mfu+WNiSBCMDM0MDIwMDI3IgpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sKLS0tCgotIC0gLQpBIHN0b2NrIG1hcmtldCBpcyB3aGVyZSBidXllcnMgYW5kIHNlbGxlcnMgdHJhZGUgc2hhcmVzIG9mIGEgY29tcGFueSwgYW5kIGlzIG9uZSBvZiB0aGUgbW9zdCBwb3B1bGFyIHdheXMgZm9yIGluZGl2aWR1YWxzIGFuZCBjb21wYW5pZXMgdG8gaW52ZXN0IG1vbmV5LiBUaGUgc2l6ZSBvZiB0aGUgd29ybGQgc3RvY2sgbWFya2V0ICBpcyBub3cgZXN0aW1hdGVkIHRvIGJlIGluIHRoZSB0cmlsbGlvbnMuIFRoZSBsYXJnZXN0IHN0b2NrIG1hcmtldCBpbiB0aGUgd29ybGQgaXMgdGhlIE5ldyBZb3JrIFN0b2NrIEV4Y2hhbmdlIChOWVNFKSwgbG9jYXRlZCBpbiBOZXcgWW9yayBDaXR5LiBBYm91dCAyLDgwMCBjb21wYW5pZXMgYXJlIGxpc3RlZCBvbiB0aGUgTlNZRS4gSW4gdGhpcyBwcm9ibGVtLCB3ZSdsbCBsb29rIGF0IHRoZSBtb250aGx5IHN0b2NrIHByaWNlcyBvZiBmaXZlIG9mIHRoZXNlIGNvbXBhbmllczogSUJNLCBHZW5lcmFsIEVsZWN0cmljIChHRSksIFByb2N0ZXIgYW5kIEdhbWJsZSwgQ29jYSBDb2xhLCBhbmQgQm9laW5nLiBUaGUgZGF0YSB1c2VkIGluIHRoaXMgcHJvYmxlbSBjb21lcyBmcm9tIEluZm9jaGltcHMuCgpEb3dubG9hZCBhbmQgcmVhZCB0aGUgZm9sbG93aW5nIGZpbGVzIGludG8gUiwgdXNpbmcgdGhlIHJlYWQuY3N2IGZ1bmN0aW9uOiBJQk1TdG9jay5jc3YsIEdFU3RvY2suY3N2LCBQcm9jdGVyR2FtYmxlU3RvY2suY3N2LCBDb2NhQ29sYVN0b2NrLmNzdiwgYW5kIEJvZWluZ1N0b2NrLmNzdi4gKERvIG5vdCBvcGVuIHRoZXNlIGZpbGVzIGluIGFueSBzcHJlYWRzaGVldCBzb2Z0d2FyZSBiZWZvcmUgY29tcGxldGluZyB0aGlzIHByb2JsZW0gYmVjYXVzZSBpdCBtaWdodCBjaGFuZ2UgdGhlIGZvcm1hdCBvZiB0aGUgRGF0ZSBmaWVsZC4pCgpDYWxsIHRoZSBkYXRhIGZyYW1lcyAiSUJNIiwgIkdFIiwgIlByb2N0ZXJHYW1ibGUiLCAiQ29jYUNvbGEiLCBhbmQgIkJvZWluZyIsIHJlc3BlY3RpdmVseS4gRWFjaCBkYXRhIGZyYW1lIGhhcyB0d28gdmFyaWFibGVzLCBkZXNjcmliZWQgYXMgZm9sbG93czoKCkRhdGU6IHRoZSBkYXRlIG9mIHRoZSBzdG9jayBwcmljZSwgYWx3YXlzIGdpdmVuIGFzIHRoZSBmaXJzdCBvZiB0aGUgbW9udGguClN0b2NrUHJpY2U6IHRoZSBhdmVyYWdlIHN0b2NrIHByaWNlIG9mIHRoZSBjb21wYW55IGluIHRoZSBnaXZlbiBtb250aC4KSW4gdGhpcyBwcm9ibGVtLCB3ZSdsbCB0YWtlIGEgbG9vayBhdCBob3cgdGhlIHN0b2NrIGR5bmFtaWNzIG9mIHRoZXNlIGNvbXBhbmllcyBoYXZlIGNoYW5nZWQgb3ZlciB0aW1lLgoKCiMjIyBTZWN0aW9uIDEgLSBTdW1tYXJ5IFN0YXRpc3RpY3MKCiMjIyMgMS4xIApCZWZvcmUgd29ya2luZyB3aXRoIHRoZXNlIGRhdGEgc2V0cywgd2UgbmVlZCB0byBjb252ZXJ0IHRoZSBkYXRlcyBpbnRvIGEgZm9ybWF0IHRoYXQgUiBjYW4gdW5kZXJzdGFuZC4gVGFrZSBhIGxvb2sgYXQgdGhlIHN0cnVjdHVyZSBvZiBvbmUgb2YgdGhlIGRhdGFzZXRzIHVzaW5nIHRoZSBzdHIgZnVuY3Rpb24uIFJpZ2h0IG5vdywgdGhlIGRhdGUgdmFyaWFibGUgaXMgc3RvcmVkIGFzIGEgZmFjdG9yLiBXZSBjYW4gY29udmVydCB0aGlzIHRvIGEgIkRhdGUiIG9iamVjdCBpbiBSIGJ5IHVzaW5nIHRoZSBmb2xsb3dpbmcgZml2ZSBjb21tYW5kcyAob25lIGZvciBlYWNoIGRhdGEgc2V0KToKCiAgICBJQk0kRGF0ZSA9IGFzLkRhdGUoSUJNJERhdGUsICIlbS8lZC8leSIpCgogICAgR0UkRGF0ZSA9IGFzLkRhdGUoR0UkRGF0ZSwgIiVtLyVkLyV5IikKCiAgICBDb2NhQ29sYSREYXRlID0gYXMuRGF0ZShDb2NhQ29sYSREYXRlLCAiJW0vJWQvJXkiKQoKICAgIFByb2N0ZXJHYW1ibGUkRGF0ZSA9IGFzLkRhdGUoUHJvY3RlckdhbWJsZSREYXRlLCAiJW0vJWQvJXkiKQoKICAgIEJvZWluZyREYXRlID0gYXMuRGF0ZShCb2VpbmckRGF0ZSwgIiVtLyVkLyV5IikKClRoZSBmaXJzdCBhcmd1bWVudCB0byB0aGUgYXMuRGF0ZSBmdW5jdGlvbiBpcyB0aGUgdmFyaWFibGUgd2Ugd2FudCB0byBjb252ZXJ0LCBhbmQgdGhlIHNlY29uZCBhcmd1bWVudCBpcyB0aGUgZm9ybWF0IG9mIHRoZSBEYXRlIHZhcmlhYmxlLiBXZSBjYW4ganVzdCBvdmVyd3JpdGUgdGhlIG9yaWdpbmFsIERhdGUgdmFyaWFibGUgdmFsdWVzIHdpdGggdGhlIG91dHB1dCBvZiB0aGlzIGZ1bmN0aW9uLiBOb3csIGFuc3dlciB0aGUgZm9sbG93aW5nIHF1ZXN0aW9ucyB1c2luZyB0aGUgc3RyIGFuZCBzdW1tYXJ5IGZ1bmN0aW9ucy4KCk91ciBmaXZlIGRhdGFzZXRzIGFsbCBoYXZlIHRoZSBzYW1lIG51bWJlciBvZiBvYnNlcnZhdGlvbnMuIEhvdyBtYW55IG9ic2VydmF0aW9ucyBhcmUgdGhlcmUgaW4gZWFjaCBkYXRhIHNldD8KCmBgYHtyfQpJQk0gPSByZWFkLmNzdigiZGF0YS9JQk1TdG9jay5jc3YiKQpHRSA9IHJlYWQuY3N2KCJkYXRhL0dFU3RvY2suY3N2IikKQ29jYUNvbGEgPSByZWFkLmNzdigiZGF0YS9Db2NhQ29sYVN0b2NrLmNzdiIpClByb2N0ZXJHYW1ibGUgPSByZWFkLmNzdigiZGF0YS9Qcm9jdGVyR2FtYmxlU3RvY2suY3N2IikKQm9laW5nID0gcmVhZC5jc3YoImRhdGEvQm9laW5nU3RvY2suY3N2IikKCklCTSREYXRlID0gYXMuRGF0ZShJQk0kRGF0ZSwgIiVtLyVkLyV5IikKR0UkRGF0ZSA9IGFzLkRhdGUoR0UkRGF0ZSwgIiVtLyVkLyV5IikKQ29jYUNvbGEkRGF0ZSA9IGFzLkRhdGUoQ29jYUNvbGEkRGF0ZSwgIiVtLyVkLyV5IikKUHJvY3RlckdhbWJsZSREYXRlID0gYXMuRGF0ZShQcm9jdGVyR2FtYmxlJERhdGUsICIlbS8lZC8leSIpCkJvZWluZyREYXRlID0gYXMuRGF0ZShCb2VpbmckRGF0ZSwgIiVtLyVkLyV5IikKCnN0cihJQk0pICNhbnM6NDgwCmBgYAoKCiMjIyMgMS4yIApXaGF0IGlzIHRoZSBlYXJsaWVzdCB5ZWFyIGluIG91ciBkYXRhc2V0cz8KYGBge3J9CnN1bW1hcnkoSUJNKSAjYW5zOiAxOTcwCmBgYAoKCiMjIyMgMS4zIApXaGF0IGlzIHRoZSBsYXRlc3QgeWVhciBpbiBvdXIgZGF0YXNldHM/CgpgYGB7cn0Kc3VtbWFyeShJQk0pICNhbnM6IDIwMDkKYGBgCgojIyMjIDEuNCAKV2hhdCBpcyB0aGUgbWVhbiBzdG9jayBwcmljZSBvZiBJQk0gb3ZlciB0aGlzIHRpbWUgcGVyaW9kPwpgYGB7cn0KI2FuczogMTQ0LjM4CmBgYAoKIyMjIyAxLjUgCldoYXQgaXMgdGhlIG1pbmltdW0gc3RvY2sgcHJpY2Ugb2YgR2VuZXJhbCBFbGVjdHJpYyAoR0UpIG92ZXIgdGhpcyB0aW1lIHBlcmlvZD8KCmBgYHtyfQpzdW1tYXJ5KEdFKSAjYW5zOiA5LjI5NAoKYGBgCgojIyMjIDEuNiAKV2hhdCBpcyB0aGUgbWF4aW11bSBzdG9jayBwcmljZSBvZiBDb2NhLUNvbGEgb3ZlciB0aGlzIHRpbWUgcGVyaW9kPwoKYGBge3J9CnN1bW1hcnkoQ29jYUNvbGEpICMxNDYuNTgKYGBgCgojIyMjIDEuNyAKV2hhdCBpcyB0aGUgbWVkaWFuIHN0b2NrIHByaWNlIG9mIEJvZWluZyBvdmVyIHRoaXMgdGltZSBwZXJpb2Q/CgpgYGB7cn0Kc3VtbWFyeShCb2VpbmcpICNhbnM6IDQ0Ljg4CgpgYGAKCiMjIyMgMS44CldoYXQgaXMgdGhlIHN0YW5kYXJkIGRldmlhdGlvbiBvZiB0aGUgc3RvY2sgcHJpY2Ugb2YgUHJvY3RlciAmIEdhbWJsZSBvdmVyIHRoaXMgdGltZSBwZXJpb2Q/CgpgYGB7cn0Kc2QoUHJvY3RlckdhbWJsZSRTdG9ja1ByaWNlKQoKYGBgCgojIyMgU2VjdGlvbiAyIC0gVmlzdWFsaXppbmcgU3RvY2sgRHluYW1pY3MKCgpMZXQncyBwbG90IHRoZSBzdG9jayBwcmljZXMgdG8gc2VlIGlmIHdlIGNhbiB2aXN1YWxpemUgdHJlbmRzIGluIHN0b2NrIHByaWNlcyBkdXJpbmcgdGhpcyB0aW1lIHBlcmlvZC4gVXNpbmcgdGhlIHBsb3QgZnVuY3Rpb24sIHBsb3QgdGhlIERhdGUgb24gdGhlIHgtYXhpcyBhbmQgdGhlIFN0b2NrUHJpY2Ugb24gdGhlIHktYXhpcywgZm9yIENvY2EtQ29sYS4KClRoaXMgcGxvdHMgb3VyIG9ic2VydmF0aW9ucyBhcyBwb2ludHMsIGJ1dCB3ZSB3b3VsZCByZWFsbHkgbGlrZSB0byBzZWUgYSBsaW5lIGluc3RlYWQsIHNpbmNlIHRoaXMgaXMgYSBjb250aW51b3VzIHRpbWUgcGVyaW9kLiBUbyBkbyB0aGlzLCBhZGQgdGhlIGFyZ3VtZW50IHR5cGU9ImwiIHRvIHlvdXIgcGxvdCBjb21tYW5kLCBhbmQgcmUtZ2VuZXJhdGUgdGhlIHBsb3QgKHRoZSBjaGFyYWN0ZXIgaXMgcXVvdGVzIGlzIHRoZSBsZXR0ZXIgbCwgZm9yIGxpbmUpLiBZb3Ugc2hvdWxkIG5vdyBzZWUgYSBsaW5lIHBsb3Qgb2YgdGhlIENvY2EtQ29sYSBzdG9jayBwcmljZS4KCiMjIyMgMi4xIApBcm91bmQgd2hhdCB5ZWFyIGRpZCBDb2NhLUNvbGEgaGFzIGl0cyBoaWdoZXN0IHN0b2NrIHByaWNlIGluIHRoaXMgdGltZSBwZXJpb2Q/CgorIDE5NzMKKyAxOTgwCisgMTk4NQorIDE5OTUKKyAyMDA4CgpgYGB7cn0KcGxvdChDb2NhQ29sYSREYXRlLENvY2FDb2xhJFN0b2NrUHJpY2UsdHlwZT0ibCIpICN0eXBlPSJsIiDlsIfpu57mj5vngrpsaW5lICNhbnM6IDE5NzMKYGBgCgpBcm91bmQgd2hhdCB5ZWFyIGRpZCBDb2NhLUNvbGEgaGFzIGl0cyBsb3dlc3Qgc3RvY2sgcHJpY2UgaW4gdGhpcyB0aW1lIHBlcmlvZD8KCmBgYHtyfQojYW5zOiAxOTgwCgpgYGAKCgojIyMjIDIuMiAKCk5vdywgbGV0J3MgYWRkIHRoZSBsaW5lIGZvciBQcm9jdGVyICYgR2FtYmxlIHRvby4gWW91IGNhbiBhZGQgYSBsaW5lIHRvIGEgcGxvdCBpbiBSIGJ5IHVzaW5nIHRoZSBsaW5lcyBmdW5jdGlvbiBpbnN0ZWFkIG9mIHRoZSBwbG90IGZ1bmN0aW9uLiBLZWVwaW5nIHRoZSBwbG90IGZvciBDb2NhLUNvbGEgb3BlbiwgdHlwZSBpbiB5b3VyIFIgY29uc29sZToKCiAgICBsaW5lcyhQcm9jdGVyR2FtYmxlJERhdGUsIFByb2N0ZXJHYW1ibGUkU3RvY2tQcmljZSkKClVuZm9ydHVuYXRlbHksIGl0J3MgaGFyZCB0byB0ZWxsIHdoaWNoIGxpbmUgaXMgd2hpY2guIExldCdzIGZpeCB0aGlzIGJ5IGdpdmluZyBlYWNoIGxpbmUgYSBjb2xvci4gRmlyc3QsIHJlLXJ1biB0aGUgcGxvdCBjb21tYW5kIGZvciBDb2NhLUNvbGEsIGJ1dCBhZGQgdGhlIGFyZ3VtZW50IGNvbD0icmVkIi4gWW91IHNob3VsZCBzZWUgdGhlIHBsb3QgZm9yIENvY2EtQ29sYSBzaG93IHVwIGFnYWluLCBidXQgdGhpcyB0aW1lIGluIHJlZC4gTm93LCBsZXQncyBhZGQgdGhlIFByb2N0ZXIgJiBHYW1ibGUgbGluZSAodXNpbmcgdGhlIGxpbmVzIGZ1bmN0aW9uIGxpa2Ugd2UgZGlkIGJlZm9yZSksIGFkZGluZyB0aGUgYXJndW1lbnQgY29sPSJibHVlIi4gWW91IHNob3VsZCBub3cgc2VlIGluIHlvdXIgcGxvdCB0aGUgQ29jYS1Db2xhIHN0b2NrIHByaWNlIGluIHJlZCwgYW5kIHRoZSBQcm9jdGVyICYgR2FtYmxlIHN0b2NrIHByaWNlIGluIGJsdWUuCgpBcyBhbiBhbHRlcm5hdGl2ZSBjaG9pY2UgdG8gY2hhbmdpbmcgdGhlIGNvbG9ycywgeW91IGNvdWxkIGluc3RlYWQgY2hhbmdlIHRoZSBsaW5lIHR5cGUgb2YgdGhlIFByb2N0ZXIgJiBHYW1ibGUgbGluZSBieSBhZGRpbmcgdGhlIGFyZ3VtZW50IGx0eT0yLiBUaGlzIHdpbGwgbWFrZSB0aGUgUHJvY3RlciAmIEdhbWJsZSBsaW5lIGRhc2hlZC4KClVzaW5nIHRoaXMgcGxvdCwgYW5zd2VyIHRoZSBmb2xsb3dpbmcgcXVlc3Rpb25zLgoKSW4gTWFyY2ggb2YgMjAwMCwgdGhlIHRlY2hub2xvZ3kgYnViYmxlIGJ1cnN0LCBhbmQgYSBzdG9jayBtYXJrZXQgY3Jhc2ggb2NjdXJyZWQuIEFjY29yZGluZyB0byB0aGlzIHBsb3QsIHdoaWNoIGNvbXBhbnkncyBzdG9jayBkcm9wcGVkIG1vcmU/CgorIENvY2EtQ29sYQorIFByb2N0ZXIgYW5kIEdhbWJsZQoKYGBge3J9CnBsb3QoQ29jYUNvbGEkRGF0ZSxDb2NhQ29sYSRTdG9ja1ByaWNlLHR5cGU9ImwiLGNvbD0icmVkIikKbGluZXMoUHJvY3RlckdhbWJsZSREYXRlLCBQcm9jdGVyR2FtYmxlJFN0b2NrUHJpY2UsY29sPSJibHVlIixsdHk9MikgI2x0eT0yIOiZm+e3miAjcGxvdOWSjGxpbmVz5YWp5YCLZnVudGlvbuimgeS4gOi1t+Wft+ihjAojUHJvY3RlciBhbmQgR2FtYmxlIGRyb3BwZWQgbW9yZQphYmxpbmUodj1hcy5EYXRlKGMoIjIwMDAtMDMtMDEiKSksIGx3ZD0yKSAj5YqD5LiA5qKd5Z6C55u05a+m57eaCmBgYAoKVG8gYW5zd2VyIHRoaXMgcXVlc3Rpb24gYW5kIHRoZSBvbmVzIHRoYXQgZm9sbG93LCB5b3UgbWF5IGZpbmQgaXQgdXNlZnVsIHRvIGRyYXcgYSB2ZXJ0aWNhbCBsaW5lIGF0IGEgY2VydGFpbiBkYXRlLiBUbyBkbyB0aGlzLCB0eXBlIHRoZSBjb21tYW5kCgogICAgYWJsaW5lKHY9YXMuRGF0ZShjKCIyMDAwLTAzLTAxIikpLCBsd2Q9MikKCmluIHlvdXIgUiBjb25zb2xlLCB3aXRoIHRoZSBwbG90IHN0aWxsIG9wZW4uIFRoaXMgZ2VuZXJhdGVzIGEgdmVydGljYWwgbGluZSBhdCB0aGUgZGF0ZSBNYXJjaCAxLCAyMDAwLiBUaGUgYXJndW1lbnQgbHdkPTIgbWFrZXMgdGhlIGxpbmUgYSBsaXR0bGUgdGhpY2tlci4gWW91IGNhbiBjaGFuZ2UgdGhlIGRhdGUgaW4gdGhpcyBjb21tYW5kIHRvIGdlbmVyYXRlIHRoZSB2ZXJ0aWNhbCBsaW5lIGluIGRpZmZlcmVudCBsb2NhdGlvbnMuCgoKCgojIyMjIDIuMwpBbnN3ZXIgdGhlc2UgcXVlc3Rpb25zIHVzaW5nIHRoZSBwbG90IHlvdSBnZW5lcmF0ZWQgaW4gdGhlIHByZXZpb3VzIHByb2JsZW0uCgpBcm91bmQgMTk4MywgdGhlIHN0b2NrIGZvciBvbmUgb2YgdGhlc2UgY29tcGFuaWVzIChDb2NhLUNvbGEgb3IgUHJvY3RlciBhbmQgR2FtYmxlKSB3YXMgZ29pbmcgdXAsIHdoaWxlIHRoZSBvdGhlciB3YXMgZ29pbmcgZG93bi4gV2hpY2ggb25lIHdhcyBnb2luZyB1cD8KCisgQ29jYS1Db2xhCisgUHJvY3RlciBhbmQgR2FtYmxlCgpgYGB7cn0KI2FuczogUHJvY3RlciBhbmQgR2FtYmxlCmBgYAoKIyMjIyAyLjQgCkluIHRoZSB0aW1lIHBlcmlvZCBzaG93biBpbiB0aGUgcGxvdCwgd2hpY2ggc3RvY2sgZ2VuZXJhbGx5IGhhcyBsb3dlciB2YWx1ZXM/CgorIENvY2EtQ29sYQorIFByb2N0ZXIgYW5kIEdhbWJsZQoKYGBge3J9CiNhbnM6IENvY2EtQ29sYQpgYGAKCgojIyMgU2VjdGlvbiAzIC0gVmlzdWFsaXppbmcgU3RvY2sgRHluYW1pY3MgMTk5NS0yMDA1CgpMZXQncyB0YWtlIGEgbG9vayBhdCBob3cgdGhlIHN0b2NrIHByaWNlcyBjaGFuZ2VkIGZyb20gMTk5NS0yMDA1IGZvciBhbGwgZml2ZSBjb21wYW5pZXMuIEluIHlvdXIgUiBjb25zb2xlLCBzdGFydCBieSB0eXBpbmcgdGhlIGZvbGxvd2luZyBwbG90IGNvbW1hbmQ6CgogICAgcGxvdChDb2NhQ29sYSREYXRlWzMwMTo0MzJdLCBDb2NhQ29sYSRTdG9ja1ByaWNlWzMwMTo0MzJdLCB0eXBlPSJsIiwgICAgCiAgICBjb2w9InJlZCIsIHlsaW09YygwLDIxMCkpCgpUaGlzIHdpbGwgcGxvdCB0aGUgQ29jYUNvbGEgc3RvY2sgcHJpY2VzIGZyb20gMTk5NSB0aHJvdWdoIDIwMDUsIHdoaWNoIGFyZSB0aGUgb2JzZXJ2YXRpb25zIG51bWJlcmVkIGZyb20gMzAxIHRvIDQzMi4gVGhlIGFkZGl0aW9uYWwgYXJndW1lbnQsIHlsaW09YygwLDIxMCksIG1ha2VzIHRoZSB5LWF4aXMgcmFuZ2UgZnJvbSAwIHRvIDIxMC4gVGhpcyB3aWxsIGFsbG93IHVzIHRvIHNlZSBhbGwgb2YgdGhlIHN0b2NrIHZhbHVlcyB3aGVuIHdlIGFkZCBpbiB0aGUgb3RoZXIgY29tcGFuaWVzLgoKTm93LCB1c2UgdGhlIGxpbmVzIGZ1bmN0aW9uIHRvIGFkZCBpbiB0aGUgb3RoZXIgZm91ciBjb21wYW5pZXMsIHJlbWVtYmVyaW5nIHRvIG9ubHkgcGxvdCB0aGUgb2JzZXJ2YXRpb25zIGZyb20gMTk5NSB0byAyMDA1LCBvciBbMzAxOjQzMl0uIFlvdSBkb24ndCBuZWVkIHRoZSAidHlwZSIgb3IgInlsaW0iIGFyZ3VtZW50cyBmb3IgdGhlIGxpbmVzIGZ1bmN0aW9uLCBidXQgcmVtZW1iZXIgdG8gbWFrZSBlYWNoIGNvbXBhbnkgYSBkaWZmZXJlbnQgY29sb3Igc28gdGhhdCB5b3UgY2FuIHRlbGwgdGhlbSBhcGFydC4gU29tZSBjb2xvciBvcHRpb25zIGFyZSAicmVkIiwgImJsdWUiLCAiZ3JlZW4iLCAicHVycGxlIiwgIm9yYW5nZSIsIGFuZCAiYmxhY2siLiBUbyBzZWUgYWxsIG9mIHRoZSBjb2xvciBvcHRpb25zIGluIFIsIHR5cGUgY29sb3JzKCkgaW4geW91ciBSIGNvbnNvbGUuCgooSWYgeW91IHByZWZlciB0byBjaGFuZ2UgdGhlIHR5cGUgb2YgdGhlIGxpbmUgaW5zdGVhZCBvZiB0aGUgY29sb3IsIGhlcmUgYXJlIHNvbWUgb3B0aW9ucyBmb3IgY2hhbmdpbmcgdGhlIGxpbmUgdHlwZTogbHR5PTIgd2lsbCBtYWtlIHRoZSBsaW5lIGRhc2hlZCwgbHR5PTMgd2lsbCBtYWtlIHRoZSBsaW5lIGRvdHRlZCwgbHR5PTQgd2lsbCBtYWtlIHRoZSBsaW5lIGFsdGVybmF0ZSBiZXR3ZWVuIGRhc2hlcyBhbmQgZG90cywgYW5kIGx0eT01IHdpbGwgbWFrZSB0aGUgbGluZSBsb25nLWRhc2hlZC4pCgpVc2UgdGhpcyBwbG90IHRvIGFuc3dlciB0aGUgZm9sbG93aW5nIGZvdXIgcXVlc3Rpb25zLgoKYGBge3J9CnBsb3QoQ29jYUNvbGEkRGF0ZVszMDE6NDMyXSwgQ29jYUNvbGEkU3RvY2tQcmljZVszMDE6NDMyXSwgdHlwZT0ibCIsICAgIApjb2w9InJlZCIsIHlsaW09YygwLDIxMCkpCmxpbmVzKEJvZWluZyREYXRlWzMwMTo0MzJdLCBCb2VpbmckU3RvY2tQcmljZVszMDE6NDMyXSxjb2w9ImJsdWUiKQpsaW5lcyhHRSREYXRlWzMwMTo0MzJdLCBHRSRTdG9ja1ByaWNlWzMwMTo0MzJdLGNvbD0iZ3JlZW4iKQpsaW5lcyhJQk0kRGF0ZVszMDE6NDMyXSwgSUJNJFN0b2NrUHJpY2VbMzAxOjQzMl0sY29sPSJwdXJwbGUiKQpsaW5lcyhQcm9jdGVyR2FtYmxlJERhdGVbMzAxOjQzMl0sIFByb2N0ZXJHYW1ibGUkU3RvY2tQcmljZVszMDE6NDMyXSxjb2w9Im9yYW5nZSIpCmFibGluZSh2PWFzLkRhdGUoYygiMjAwMC0wMy0wMSIpKSwgbHdkPTIpCmFibGluZSh2PWFzLkRhdGUoYygiMTk5Ny0wOS0wMSIpKSwgbHdkPTIpCmFibGluZSh2PWFzLkRhdGUoYygiMTk5Ny0xMS0wMSIpKSwgbHdkPTIpCmBgYAoKCgojIyMjIDMuMQoKV2hpY2ggc3RvY2sgZmVsbCB0aGUgbW9zdCByaWdodCBhZnRlciB0aGUgdGVjaG5vbG9neSBidWJibGUgYnVyc3QgaW4gTWFyY2ggMjAwMD8KCisgQ29jYS1Db2xhCisgUHJvY3RlciBhbmQgR2FtYmxlCisgSUJNCisgR2VuZXJhbCBFbGVjdHJpYyAoR0UpCisgQm9laW5nCgpgYGB7cn0KI2FuczogR0UKYGBgCgoKIyMjIyAzLjIKV2hpY2ggc3RvY2sgcmVhY2hlcyB0aGUgaGlnaGVzdCB2YWx1ZSBpbiB0aGUgdGltZSBwZXJpb2QgMTk5NS0yMDA1PwoKKyBDb2NhLUNvbGEKKyBQcm9jdGVyIGFuZCBHYW1ibGUKKyBJQk0KKyBHZW5lcmFsIEVsZWN0cmljIChHRSkKKyBCb2VpbmcKCgpgYGB7cn0KI2FuczogSUJNCmBgYAoKCiMjIyMgMy4zCkluIE9jdG9iZXIgb2YgMTk5NywgdGhlcmUgd2FzIGEgZ2xvYmFsIHN0b2NrIG1hcmtldCBjcmFzaCB0aGF0IHdhcyBjYXVzZWQgYnkgYW4gZWNvbm9taWMgY3Jpc2lzIGluIEFzaWEuIENvbXBhcmluZyBTZXB0ZW1iZXIgMTk5NyB0byBOb3ZlbWJlciAxOTk3LCB3aGljaCBjb21wYW5pZXMgc2F3IGEgZGVjcmVhc2luZyB0cmVuZCBpbiB0aGVpciBzdG9jayBwcmljZT8gKFNlbGVjdCBhbGwgdGhhdCBhcHBseS4pCgorIENvY2EtQ29sYQorIFByb2N0ZXIgYW5kIEdhbWJsZQorIElCTQorIEdlbmVyYWwgRWxlY3RyaWMgKEdFKQorIEJvZWluZwoKYGBge3J9CiNhbnM6IFByb2N0ZXIgYW5kIEdhbWJsZSxCb2VpbmcKCmBgYAoKIyMjIyAzLjQKSW4gdGhlIGxhc3QgdHdvIHllYXJzIG9mIHRoaXMgdGltZSBwZXJpb2QgKDIwMDQgYW5kIDIwMDUpIHdoaWNoIHN0b2NrIHNlZW1zIHRvIGJlIHBlcmZvcm1pbmcgdGhlIGJlc3QsIGluIHRlcm1zIG9mIGluY3JlYXNpbmcgc3RvY2sgcHJpY2U/CgorIENvY2EtQ29sYQorIFByb2N0ZXIgYW5kIEdhbWJsZQorIElCTQorIEdlbmVyYWwgRWxlY3RyaWMgKEdFKQorIEJvZWluZwoKYGBge3J9CiNhbnMgSUJNCmBgYAoKIyMjIFNlY3Rpb24gNCAtIE1vbnRobHkgVHJlbmRzCgpMYXN0bHksIGxldCdzIHNlZSBpZiBzdG9ja3MgdGVuZCB0byBiZSBoaWdoZXIgb3IgbG93ZXIgZHVyaW5nIGNlcnRhaW4gbW9udGhzLiBVc2UgdGhlIHRhcHBseSBjb21tYW5kIHRvIGNhbGN1bGF0ZSB0aGUgbWVhbiBzdG9jayBwcmljZSBvZiBJQk0sIHNvcnRlZCBieSBtb250aHMuIFRvIHNvcnQgYnkgbW9udGhzLCB1c2UKCiAgICBtb250aHMoSUJNJERhdGUpCgphcyB0aGUgc2Vjb25kIGFyZ3VtZW50IG9mIHRoZSB0YXBwbHkgZnVuY3Rpb24uCgpgYGB7cn0KdGFwcGx5KElCTSRTdG9ja1ByaWNlLG1vbnRocyhJQk0kRGF0ZSksbWVhbikgI+aykuaciXNvcnQgYnkgbW9udGg/CmBgYAoKCiMjIyMgNC4xCkZvciBJQk0sIGNvbXBhcmUgdGhlIG1vbnRobHkgYXZlcmFnZXMgdG8gdGhlIG92ZXJhbGwgYXZlcmFnZSBzdG9jayBwcmljZS4gSW4gd2hpY2ggbW9udGhzIGhhcyBJQk0gaGlzdG9yaWNhbGx5IGhhZCBhIGhpZ2hlciBzdG9jayBwcmljZSAob24gYXZlcmFnZSk/IFNlbGVjdCBhbGwgdGhhdCBhcHBseS4oSmFudWFyeX5EZWNlbWJlcikKCmBgYHtyfQpzdW1tYXJ5KElCTSRTdG9ja1ByaWNlKSAjbWVhbjogMTQ0LjM4CiNhbnM6IEFwcmlsLEZlYnJ1YXJ5LEphbnVhcnksTWFyY2gsTWF5LCAKYGBgCgojIyMjIDQuMiAKUmVwZWF0IHRoZSB0YXBwbHkgZnVuY3Rpb24gZnJvbSB0aGUgcHJldmlvdXMgcHJvYmxlbSBmb3IgZWFjaCBvZiB0aGUgb3RoZXIgZm91ciBjb21wYW5pZXMsIGFuZCB1c2UgdGhlIG91dHB1dCB0byBhbnN3ZXIgdGhlIHJlbWFpbmluZyBxdWVzdGlvbnMuCgpgYGB7cn0KI0JvZWluZwp0YXBwbHkoQm9laW5nJFN0b2NrUHJpY2UsbW9udGhzKEJvZWluZyREYXRlKSxtZWFuKQojQ29jYUNvbGEKdGFwcGx5KENvY2FDb2xhJFN0b2NrUHJpY2UsbW9udGhzKENvY2FDb2xhJERhdGUpLG1lYW4pCiNHRQp0YXBwbHkoR0UkU3RvY2tQcmljZSxtb250aHMoR0UkRGF0ZSksbWVhbikKI1BHCnRhcHBseShQcm9jdGVyR2FtYmxlJFN0b2NrUHJpY2UsbW9udGhzKFByb2N0ZXJHYW1ibGUkRGF0ZSksbWVhbikKYGBgCgpHZW5lcmFsIEVsZWN0cmljIGFuZCBDb2NhLUNvbGEgYm90aCBoYXZlIHRoZWlyIGhpZ2hlc3QgYXZlcmFnZSBzdG9jayBwcmljZSBpbiB0aGUgc2FtZSBtb250aC4gV2hpY2ggbW9udGggaXMgdGhpcz8KCmBgYHtyfQojYW5zOiBBcHJpbApgYGAKCiMjIyMgNC4zCkZvciB0aGUgbW9udGhzIG9mIERlY2VtYmVyIGFuZCBKYW51YXJ5LCBldmVyeSBjb21wYW55J3MgYXZlcmFnZSBzdG9jayBpcyBoaWdoZXIgaW4gb25lIG1vbnRoIGFuZCBsb3dlciBpbiB0aGUgb3RoZXIuIEluIHdoaWNoIG1vbnRoIGFyZSB0aGUgc3RvY2sgcHJpY2VzIGxvd2VyPwoKKyBEZWNlbWJlcgorIEphbnVhcnkKCgpgYGB7cn0KI2FuczogSmFudWFyeQpgYGAKCgpBZnRlciBzZWVpbmcgdGhlc2UgdHJlbmRzLCB3ZSBhcmUgcmVhZHkgdG8gYnV5IHN0b2NrIGluIGNlcnRhaW4gbW9udGhzIGFuZCBzZWxsIGl0IGluIG90aGVycyEgQnV0LCB3ZSBzaG91bGQgYmUgY2FyZWZ1bCwgYmVjYXVzZSBvbmUgcmVhbGx5IGdvb2Qgb3IgcmVhbGx5IGJhZCB5ZWFyIGNvdWxkIHNrZXcgdGhlIGF2ZXJhZ2UgdG8gc2hvdyBhIHRyZW5kIHRoYXQgaXMgbm90IHJlYWxseSB0aGVyZSBpbiBnZW5lcmFsLgoKCgoK