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?

IBM=read.csv("C:/bussiness analytics/data/IBMStock.csv")
GE=read.csv("C:/bussiness analytics/data/GEStock.csv")
CocaCola=read.csv("C:/bussiness analytics/data/CocaColaStock.csv")
Boeing=read.csv("C:/bussiness analytics/data/BoeingStock.csv")
ProcterGamble=read.csv("C:/bussiness analytics/data/ProcterGambleStock.csv")
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")
Boeing$Date=as.Date(Boeing$Date , "%m/%d/%y")
ProcterGamble$Date=as.Date(ProcterGamble$Date , "%m/%d/%y")
str(IBM)
'data.frame':   480 obs. of  2 variables:
 $ Date      : Date, format: "1970-01-01" "1970-02-01" ...
 $ StockPrice: num  360 347 327 320 270 ...
nrow(IBM)
[1] 480

1.2

What is the earliest year in our datasets?

min(IBM$Date)
[1] "1970-01-01"

1.3

What is the latest year in our datasets?

max(IBM$Date)
[1] "2009-12-01"

1.4

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

mean(IBM$StockPrice)
[1] 144.375

1.5

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

min(GE$StockPrice)
[1] 9.293636

1.6

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

max(CocaCola$StockPrice)
[1] 146.5843

1.7

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

median(Boeing$StockPrice)
[1] 44.8834

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')  # 1973 1980
abline(v=CocaCola$Date[which.max(CocaCola$StockPrice)], col='green')
abline(v=CocaCola$Date[which.min(CocaCola$StockPrice)], col='red')

plot(CocaCola\(Date, CocaCola\)StockPrice, type=‘l’) 繪圖函數 abline()直線函數,作為時點的區分線 標紅線 或綠色 abline(v=CocaCola\(Date[which.max(CocaCola\)StockPrice)], col=‘green’) abline(v=CocaCola\(Date[which.min(CocaCola\)StockPrice)], col=‘red’)

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

plot(CocaCola$Date, CocaCola$StockPrice, type='l')  
abline(v=CocaCola$Date[which.min(CocaCola$StockPrice)], col='red')

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)
plot(ProcterGamble$Date, ProcterGamble$StockPrice, type='l') 

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', lwd=2)
lines(ProcterGamble$Date, ProcterGamble$StockPrice,type='l' ,col="blue", lwd=2)
abline(v = as.Date("2000-03-01"), lty=3, col='orange')
abline(v = as.Date("1983-07-01"), lty=3, col='orange')
legend("topright",legend=c("Coke","P&G"),col=c('red','blue'),lwd=2)

legend(“topright”,legend=c(“Coke”,“P&G”),col=c(‘blue’,‘green’),lwd=2)在右上角做出標示 topright“, # 表示在右上角 pch = 1, # pch代表點的圖案 col = c(”blue“,”red“,”black“), # col代表顏色 legend = c(”May“,”August“,”Other Month“) # 顏色所對應的名稱 lwd=2 # lwd 代表線的粗細 lines()把資料點用線連接

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
# Coca-Cola

2.4

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

  • Coca-Cola
  • Procter and Gamble
# 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.

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
plot(CocaCola$Date[301:432], CocaCola$StockPrice[301:432], 
     type="l", col="red", ylim=c(0,210))
lines(ProcterGamble$Date[301:432],  ProcterGamble$StockPrice[301:432],  col="blue")
lines(IBM$Date[301:432], IBM$StockPrice[301:432], col="green")
lines(GE$Date[301:432],  GE$StockPrice[301:432],  col="purple")
lines(Boeing$Date[301:432],  Boeing$StockPrice[301:432],  col="orange")
abline(v = as.Date("2000-03-01"), lty=3, col='gray')
abline(v = as.Date("1997-09-01"), lty=3, col='gray')
abline(v = as.Date("1997-11-01"), lty=3, col='gray')
legend("topright",legend=c("Coke","P&G","IBM","GE","BE"),col=c('red','blue','green','purple','orange'),lwd=2)

plot(CocaCola\(Date[301:432], CocaCola\)StockPrice[301:432], type=“l”,
col=“red”, ylim=c(0,210)) ylim()Y的範圍 xlim()X的範圍

3.2

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

  • Coca-Cola
  • Procter and Gamble
  • IBM
  • General Electric (GE)
  • Boeing
#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
# 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
# IBM
LS0tDQp0aXRsZTogIkFTMS0yIFN0b2NrIER5bmFtaWNzIg0KYXV0aG9yOiAiPOmZs+aAoeWuiT4gPE0wNjQxMTIwMTQ+Ig0Kb3V0cHV0OiBodG1sX25vdGVib29rDQotLS0NCg0KLSAtIC0NCkEgc3RvY2sgbWFya2V0IGlzIHdoZXJlIGJ1eWVycyBhbmQgc2VsbGVycyB0cmFkZSBzaGFyZXMgb2YgYSBjb21wYW55LCBhbmQgaXMgb25lIG9mIHRoZSBtb3N0IHBvcHVsYXIgd2F5cyBmb3IgaW5kaXZpZHVhbHMgYW5kIGNvbXBhbmllcyB0byBpbnZlc3QgbW9uZXkuIFRoZSBzaXplIG9mIHRoZSB3b3JsZCBzdG9jayBtYXJrZXQgIGlzIG5vdyBlc3RpbWF0ZWQgdG8gYmUgaW4gdGhlIHRyaWxsaW9ucy4gVGhlIGxhcmdlc3Qgc3RvY2sgbWFya2V0IGluIHRoZSB3b3JsZCBpcyB0aGUgTmV3IFlvcmsgU3RvY2sgRXhjaGFuZ2UgKE5ZU0UpLCBsb2NhdGVkIGluIE5ldyBZb3JrIENpdHkuIEFib3V0IDIsODAwIGNvbXBhbmllcyBhcmUgbGlzdGVkIG9uIHRoZSBOU1lFLiBJbiB0aGlzIHByb2JsZW0sIHdlJ2xsIGxvb2sgYXQgdGhlIG1vbnRobHkgc3RvY2sgcHJpY2VzIG9mIGZpdmUgb2YgdGhlc2UgY29tcGFuaWVzOiBJQk0sIEdlbmVyYWwgRWxlY3RyaWMgKEdFKSwgUHJvY3RlciBhbmQgR2FtYmxlLCBDb2NhIENvbGEsIGFuZCBCb2VpbmcuIFRoZSBkYXRhIHVzZWQgaW4gdGhpcyBwcm9ibGVtIGNvbWVzIGZyb20gSW5mb2NoaW1wcy4NCg0KRG93bmxvYWQgYW5kIHJlYWQgdGhlIGZvbGxvd2luZyBmaWxlcyBpbnRvIFIsIHVzaW5nIHRoZSByZWFkLmNzdiBmdW5jdGlvbjogSUJNU3RvY2suY3N2LCBHRVN0b2NrLmNzdiwgUHJvY3RlckdhbWJsZVN0b2NrLmNzdiwgQ29jYUNvbGFTdG9jay5jc3YsIGFuZCBCb2VpbmdTdG9jay5jc3YuIChEbyBub3Qgb3BlbiB0aGVzZSBmaWxlcyBpbiBhbnkgc3ByZWFkc2hlZXQgc29mdHdhcmUgYmVmb3JlIGNvbXBsZXRpbmcgdGhpcyBwcm9ibGVtIGJlY2F1c2UgaXQgbWlnaHQgY2hhbmdlIHRoZSBmb3JtYXQgb2YgdGhlIERhdGUgZmllbGQuKQ0KDQpDYWxsIHRoZSBkYXRhIGZyYW1lcyAiSUJNIiwgIkdFIiwgIlByb2N0ZXJHYW1ibGUiLCAiQ29jYUNvbGEiLCBhbmQgIkJvZWluZyIsIHJlc3BlY3RpdmVseS4gRWFjaCBkYXRhIGZyYW1lIGhhcyB0d28gdmFyaWFibGVzLCBkZXNjcmliZWQgYXMgZm9sbG93czoNCg0KRGF0ZTogdGhlIGRhdGUgb2YgdGhlIHN0b2NrIHByaWNlLCBhbHdheXMgZ2l2ZW4gYXMgdGhlIGZpcnN0IG9mIHRoZSBtb250aC4NClN0b2NrUHJpY2U6IHRoZSBhdmVyYWdlIHN0b2NrIHByaWNlIG9mIHRoZSBjb21wYW55IGluIHRoZSBnaXZlbiBtb250aC4NCkluIHRoaXMgcHJvYmxlbSwgd2UnbGwgdGFrZSBhIGxvb2sgYXQgaG93IHRoZSBzdG9jayBkeW5hbWljcyBvZiB0aGVzZSBjb21wYW5pZXMgaGF2ZSBjaGFuZ2VkIG92ZXIgdGltZS4NCg0KDQojIyMgU2VjdGlvbiAxIC0gU3VtbWFyeSBTdGF0aXN0aWNzDQoNCiMjIyMgMS4xIA0KQmVmb3JlIHdvcmtpbmcgd2l0aCB0aGVzZSBkYXRhIHNldHMsIHdlIG5lZWQgdG8gY29udmVydCB0aGUgZGF0ZXMgaW50byBhIGZvcm1hdCB0aGF0IFIgY2FuIHVuZGVyc3RhbmQuIFRha2UgYSBsb29rIGF0IHRoZSBzdHJ1Y3R1cmUgb2Ygb25lIG9mIHRoZSBkYXRhc2V0cyB1c2luZyB0aGUgc3RyIGZ1bmN0aW9uLiBSaWdodCBub3csIHRoZSBkYXRlIHZhcmlhYmxlIGlzIHN0b3JlZCBhcyBhIGZhY3Rvci4gV2UgY2FuIGNvbnZlcnQgdGhpcyB0byBhICJEYXRlIiBvYmplY3QgaW4gUiBieSB1c2luZyB0aGUgZm9sbG93aW5nIGZpdmUgY29tbWFuZHMgKG9uZSBmb3IgZWFjaCBkYXRhIHNldCk6DQoNCiAgICBJQk0kRGF0ZSA9IGFzLkRhdGUoSUJNJERhdGUsICIlbS8lZC8leSIpDQoNCiAgICBHRSREYXRlID0gYXMuRGF0ZShHRSREYXRlLCAiJW0vJWQvJXkiKQ0KDQogICAgQ29jYUNvbGEkRGF0ZSA9IGFzLkRhdGUoQ29jYUNvbGEkRGF0ZSwgIiVtLyVkLyV5IikNCg0KICAgIFByb2N0ZXJHYW1ibGUkRGF0ZSA9IGFzLkRhdGUoUHJvY3RlckdhbWJsZSREYXRlLCAiJW0vJWQvJXkiKQ0KDQogICAgQm9laW5nJERhdGUgPSBhcy5EYXRlKEJvZWluZyREYXRlLCAiJW0vJWQvJXkiKQ0KDQpUaGUgZmlyc3QgYXJndW1lbnQgdG8gdGhlIGFzLkRhdGUgZnVuY3Rpb24gaXMgdGhlIHZhcmlhYmxlIHdlIHdhbnQgdG8gY29udmVydCwgYW5kIHRoZSBzZWNvbmQgYXJndW1lbnQgaXMgdGhlIGZvcm1hdCBvZiB0aGUgRGF0ZSB2YXJpYWJsZS4gV2UgY2FuIGp1c3Qgb3ZlcndyaXRlIHRoZSBvcmlnaW5hbCBEYXRlIHZhcmlhYmxlIHZhbHVlcyB3aXRoIHRoZSBvdXRwdXQgb2YgdGhpcyBmdW5jdGlvbi4gTm93LCBhbnN3ZXIgdGhlIGZvbGxvd2luZyBxdWVzdGlvbnMgdXNpbmcgdGhlIHN0ciBhbmQgc3VtbWFyeSBmdW5jdGlvbnMuDQoNCk91ciBmaXZlIGRhdGFzZXRzIGFsbCBoYXZlIHRoZSBzYW1lIG51bWJlciBvZiBvYnNlcnZhdGlvbnMuIEhvdyBtYW55IG9ic2VydmF0aW9ucyBhcmUgdGhlcmUgaW4gZWFjaCBkYXRhIHNldD8NCg0KYGBge3J9DQpJQk09cmVhZC5jc3YoIkM6L2J1c3NpbmVzcyBhbmFseXRpY3MvZGF0YS9JQk1TdG9jay5jc3YiKQ0KR0U9cmVhZC5jc3YoIkM6L2J1c3NpbmVzcyBhbmFseXRpY3MvZGF0YS9HRVN0b2NrLmNzdiIpDQpDb2NhQ29sYT1yZWFkLmNzdigiQzovYnVzc2luZXNzIGFuYWx5dGljcy9kYXRhL0NvY2FDb2xhU3RvY2suY3N2IikNCkJvZWluZz1yZWFkLmNzdigiQzovYnVzc2luZXNzIGFuYWx5dGljcy9kYXRhL0JvZWluZ1N0b2NrLmNzdiIpDQpQcm9jdGVyR2FtYmxlPXJlYWQuY3N2KCJDOi9idXNzaW5lc3MgYW5hbHl0aWNzL2RhdGEvUHJvY3RlckdhbWJsZVN0b2NrLmNzdiIpDQpJQk0kRGF0ZT1hcy5EYXRlKElCTSREYXRlICwgIiVtLyVkLyV5IikNCkdFJERhdGU9YXMuRGF0ZShHRSREYXRlICwgIiVtLyVkLyV5IikNCkNvY2FDb2xhJERhdGU9YXMuRGF0ZShDb2NhQ29sYSREYXRlICwgIiVtLyVkLyV5IikNCkJvZWluZyREYXRlPWFzLkRhdGUoQm9laW5nJERhdGUgLCAiJW0vJWQvJXkiKQ0KUHJvY3RlckdhbWJsZSREYXRlPWFzLkRhdGUoUHJvY3RlckdhbWJsZSREYXRlICwgIiVtLyVkLyV5IikNCg0Kc3RyKElCTSkNCm5yb3coSUJNKQ0KYGBgDQoNCg0KIyMjIyAxLjIgDQpXaGF0IGlzIHRoZSBlYXJsaWVzdCB5ZWFyIGluIG91ciBkYXRhc2V0cz8NCmBgYHtyfQ0KbWluKElCTSREYXRlKQ0KYGBgDQoNCg0KIyMjIyAxLjMgDQpXaGF0IGlzIHRoZSBsYXRlc3QgeWVhciBpbiBvdXIgZGF0YXNldHM/DQoNCmBgYHtyfQ0KbWF4KElCTSREYXRlKQ0KYGBgDQoNCiMjIyMgMS40IA0KV2hhdCBpcyB0aGUgbWVhbiBzdG9jayBwcmljZSBvZiBJQk0gb3ZlciB0aGlzIHRpbWUgcGVyaW9kPw0KYGBge3J9DQptZWFuKElCTSRTdG9ja1ByaWNlKQ0KYGBgDQoNCiMjIyMgMS41IA0KV2hhdCBpcyB0aGUgbWluaW11bSBzdG9jayBwcmljZSBvZiBHZW5lcmFsIEVsZWN0cmljIChHRSkgb3ZlciB0aGlzIHRpbWUgcGVyaW9kPw0KDQpgYGB7cn0NCm1pbihHRSRTdG9ja1ByaWNlKQ0KYGBgDQoNCiMjIyMgMS42IA0KV2hhdCBpcyB0aGUgbWF4aW11bSBzdG9jayBwcmljZSBvZiBDb2NhLUNvbGEgb3ZlciB0aGlzIHRpbWUgcGVyaW9kPw0KDQpgYGB7cn0NCm1heChDb2NhQ29sYSRTdG9ja1ByaWNlKQ0KYGBgDQoNCiMjIyMgMS43IA0KV2hhdCBpcyB0aGUgbWVkaWFuIHN0b2NrIHByaWNlIG9mIEJvZWluZyBvdmVyIHRoaXMgdGltZSBwZXJpb2Q/DQoNCmBgYHtyfQ0KbWVkaWFuKEJvZWluZyRTdG9ja1ByaWNlKQ0KDQpgYGANCg0KIyMjIyAxLjgNCldoYXQgaXMgdGhlIHN0YW5kYXJkIGRldmlhdGlvbiBvZiB0aGUgc3RvY2sgcHJpY2Ugb2YgUHJvY3RlciAmIEdhbWJsZSBvdmVyIHRoaXMgdGltZSBwZXJpb2Q/DQoNCmBgYHtyfQ0Kc2QoUHJvY3RlckdhbWJsZSRTdG9ja1ByaWNlKQ0KYGBgDQoNCiMjIyBTZWN0aW9uIDIgLSBWaXN1YWxpemluZyBTdG9jayBEeW5hbWljcw0KDQoNCkxldCdzIHBsb3QgdGhlIHN0b2NrIHByaWNlcyB0byBzZWUgaWYgd2UgY2FuIHZpc3VhbGl6ZSB0cmVuZHMgaW4gc3RvY2sgcHJpY2VzIGR1cmluZyB0aGlzIHRpbWUgcGVyaW9kLiBVc2luZyB0aGUgcGxvdCBmdW5jdGlvbiwgcGxvdCB0aGUgRGF0ZSBvbiB0aGUgeC1heGlzIGFuZCB0aGUgU3RvY2tQcmljZSBvbiB0aGUgeS1heGlzLCBmb3IgQ29jYS1Db2xhLg0KDQpUaGlzIHBsb3RzIG91ciBvYnNlcnZhdGlvbnMgYXMgcG9pbnRzLCBidXQgd2Ugd291bGQgcmVhbGx5IGxpa2UgdG8gc2VlIGEgbGluZSBpbnN0ZWFkLCBzaW5jZSB0aGlzIGlzIGEgY29udGludW91cyB0aW1lIHBlcmlvZC4gVG8gZG8gdGhpcywgYWRkIHRoZSBhcmd1bWVudCB0eXBlPSJsIiB0byB5b3VyIHBsb3QgY29tbWFuZCwgYW5kIHJlLWdlbmVyYXRlIHRoZSBwbG90ICh0aGUgY2hhcmFjdGVyIGlzIHF1b3RlcyBpcyB0aGUgbGV0dGVyIGwsIGZvciBsaW5lKS4gWW91IHNob3VsZCBub3cgc2VlIGEgbGluZSBwbG90IG9mIHRoZSBDb2NhLUNvbGEgc3RvY2sgcHJpY2UuDQoNCiMjIyMgMi4xIA0KQXJvdW5kIHdoYXQgeWVhciBkaWQgQ29jYS1Db2xhIGhhcyBpdHMgaGlnaGVzdCBzdG9jayBwcmljZSBpbiB0aGlzIHRpbWUgcGVyaW9kPw0KDQorIDE5NzMNCisgMTk4MA0KKyAxOTg1DQorIDE5OTUNCisgMjAwOA0KDQpgYGB7cn0NCnBsb3QoQ29jYUNvbGEkRGF0ZSwgQ29jYUNvbGEkU3RvY2tQcmljZSwgdHlwZT0nbCcpICAjIDE5NzMgMTk4MA0KYWJsaW5lKHY9Q29jYUNvbGEkRGF0ZVt3aGljaC5tYXgoQ29jYUNvbGEkU3RvY2tQcmljZSldLCBjb2w9J2dyZWVuJykNCmFibGluZSh2PUNvY2FDb2xhJERhdGVbd2hpY2gubWluKENvY2FDb2xhJFN0b2NrUHJpY2UpXSwgY29sPSdyZWQnKQ0KYGBgDQpwbG90KENvY2FDb2xhJERhdGUsIENvY2FDb2xhJFN0b2NrUHJpY2UsIHR5cGU9J2wnKSDnuarlnJblh73mlbgNCmFibGluZSgp55u057ea5Ye95pW477yM5L2c54K65pmC6bue55qE5Y2A5YiG57eaDQrmqJnntIXnt5og5oiW57ag6ImyDQphYmxpbmUodj1Db2NhQ29sYSREYXRlW3doaWNoLm1heChDb2NhQ29sYSRTdG9ja1ByaWNlKV0sIGNvbD0nZ3JlZW4nKQ0KYWJsaW5lKHY9Q29jYUNvbGEkRGF0ZVt3aGljaC5taW4oQ29jYUNvbGEkU3RvY2tQcmljZSldLCBjb2w9J3JlZCcpDQoNCg0KDQpBcm91bmQgd2hhdCB5ZWFyIGRpZCBDb2NhLUNvbGEgaGFzIGl0cyBsb3dlc3Qgc3RvY2sgcHJpY2UgaW4gdGhpcyB0aW1lIHBlcmlvZD8NCg0KYGBge3J9DQpwbG90KENvY2FDb2xhJERhdGUsIENvY2FDb2xhJFN0b2NrUHJpY2UsIHR5cGU9J2wnKSAgDQphYmxpbmUodj1Db2NhQ29sYSREYXRlW3doaWNoLm1pbihDb2NhQ29sYSRTdG9ja1ByaWNlKV0sIGNvbD0ncmVkJykNCmBgYA0KDQoNCiMjIyMgMi4yIA0KDQpOb3csIGxldCdzIGFkZCB0aGUgbGluZSBmb3IgUHJvY3RlciAmIEdhbWJsZSB0b28uIFlvdSBjYW4gYWRkIGEgbGluZSB0byBhIHBsb3QgaW4gUiBieSB1c2luZyB0aGUgbGluZXMgZnVuY3Rpb24gaW5zdGVhZCBvZiB0aGUgcGxvdCBmdW5jdGlvbi4gS2VlcGluZyB0aGUgcGxvdCBmb3IgQ29jYS1Db2xhIG9wZW4sIHR5cGUgaW4geW91ciBSIGNvbnNvbGU6DQoNCiAgICBsaW5lcyhQcm9jdGVyR2FtYmxlJERhdGUsIFByb2N0ZXJHYW1ibGUkU3RvY2tQcmljZSkNCmBgYHtyfQ0KcGxvdChQcm9jdGVyR2FtYmxlJERhdGUsIFByb2N0ZXJHYW1ibGUkU3RvY2tQcmljZSwgdHlwZT0nbCcpIA0KDQpgYGANCg0KVW5mb3J0dW5hdGVseSwgaXQncyBoYXJkIHRvIHRlbGwgd2hpY2ggbGluZSBpcyB3aGljaC4gTGV0J3MgZml4IHRoaXMgYnkgZ2l2aW5nIGVhY2ggbGluZSBhIGNvbG9yLiBGaXJzdCwgcmUtcnVuIHRoZSBwbG90IGNvbW1hbmQgZm9yIENvY2EtQ29sYSwgYnV0IGFkZCB0aGUgYXJndW1lbnQgY29sPSJyZWQiLiBZb3Ugc2hvdWxkIHNlZSB0aGUgcGxvdCBmb3IgQ29jYS1Db2xhIHNob3cgdXAgYWdhaW4sIGJ1dCB0aGlzIHRpbWUgaW4gcmVkLiBOb3csIGxldCdzIGFkZCB0aGUgUHJvY3RlciAmIEdhbWJsZSBsaW5lICh1c2luZyB0aGUgbGluZXMgZnVuY3Rpb24gbGlrZSB3ZSBkaWQgYmVmb3JlKSwgYWRkaW5nIHRoZSBhcmd1bWVudCBjb2w9ImJsdWUiLiBZb3Ugc2hvdWxkIG5vdyBzZWUgaW4geW91ciBwbG90IHRoZSBDb2NhLUNvbGEgc3RvY2sgcHJpY2UgaW4gcmVkLCBhbmQgdGhlIFByb2N0ZXIgJiBHYW1ibGUgc3RvY2sgcHJpY2UgaW4gYmx1ZS4NCg0KQXMgYW4gYWx0ZXJuYXRpdmUgY2hvaWNlIHRvIGNoYW5naW5nIHRoZSBjb2xvcnMsIHlvdSBjb3VsZCBpbnN0ZWFkIGNoYW5nZSB0aGUgbGluZSB0eXBlIG9mIHRoZSBQcm9jdGVyICYgR2FtYmxlIGxpbmUgYnkgYWRkaW5nIHRoZSBhcmd1bWVudCBsdHk9Mi4gVGhpcyB3aWxsIG1ha2UgdGhlIFByb2N0ZXIgJiBHYW1ibGUgbGluZSBkYXNoZWQuDQoNClVzaW5nIHRoaXMgcGxvdCwgYW5zd2VyIHRoZSBmb2xsb3dpbmcgcXVlc3Rpb25zLg0KDQpJbiBNYXJjaCBvZiAyMDAwLCB0aGUgdGVjaG5vbG9neSBidWJibGUgYnVyc3QsIGFuZCBhIHN0b2NrIG1hcmtldCBjcmFzaCBvY2N1cnJlZC4gQWNjb3JkaW5nIHRvIHRoaXMgcGxvdCwgd2hpY2ggY29tcGFueSdzIHN0b2NrIGRyb3BwZWQgbW9yZT8NCg0KKyBDb2NhLUNvbGENCisgUHJvY3RlciBhbmQgR2FtYmxlDQoNCmBgYHtyfQ0KcGxvdChDb2NhQ29sYSREYXRlLCBDb2NhQ29sYSRTdG9ja1ByaWNlLCB0eXBlPSdsJywgY29sPSdyZWQnLCBsd2Q9MikNCmxpbmVzKFByb2N0ZXJHYW1ibGUkRGF0ZSwgUHJvY3RlckdhbWJsZSRTdG9ja1ByaWNlLHR5cGU9J2wnICxjb2w9ImJsdWUiLCBsd2Q9MikNCmFibGluZSh2ID0gYXMuRGF0ZSgiMjAwMC0wMy0wMSIpLCBsdHk9MywgY29sPSdvcmFuZ2UnKQ0KYWJsaW5lKHYgPSBhcy5EYXRlKCIxOTgzLTA3LTAxIiksIGx0eT0zLCBjb2w9J29yYW5nZScpDQpsZWdlbmQoInRvcHJpZ2h0IixsZWdlbmQ9YygiQ29rZSIsIlAmRyIpLGNvbD1jKCdyZWQnLCdibHVlJyksbHdkPTIpDQojQ29jYS1Db2xhDQpgYGANCmxlZ2VuZCgidG9wcmlnaHQiLGxlZ2VuZD1jKCJDb2tlIiwiUCZHIiksY29sPWMoJ2JsdWUnLCdncmVlbicpLGx3ZD0yKeWcqOWPs+S4iuinkuWBmuWHuuaomeekug0KdG9wcmlnaHQiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyDooajnpLrlnKjlj7PkuIrop5INCnBjaCA9IDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHBjaOS7o+ihqOm7nueahOWcluahiA0KY29sID0gYygiYmx1ZSIsICJyZWQiLCAiYmxhY2siKSwgICAgICAgICAgICMgY29s5Luj6KGo6aGP6ImyIA0KbGVnZW5kID0gYygiTWF5IiwgIkF1Z3VzdCIsICJPdGhlciBNb250aCIpICMg6aGP6Imy5omA5bCN5oeJ55qE5ZCN56ixDQogbHdkPTIgICAgICMgbHdkIOS7o+ihqOe3mueahOeyl+e0sA0KbGluZXMoKeaKiuizh+aWmem7nueUqOe3mumAo+aOpQ0KDQoNClRvIGFuc3dlciB0aGlzIHF1ZXN0aW9uIGFuZCB0aGUgb25lcyB0aGF0IGZvbGxvdywgeW91IG1heSBmaW5kIGl0IHVzZWZ1bCB0byBkcmF3IGEgdmVydGljYWwgbGluZSBhdCBhIGNlcnRhaW4gZGF0ZS4gVG8gZG8gdGhpcywgdHlwZSB0aGUgY29tbWFuZA0KDQogICAgYWJsaW5lKHY9YXMuRGF0ZShjKCIyMDAwLTAzLTAxIikpLCBsd2Q9MikNCg0KaW4geW91ciBSIGNvbnNvbGUsIHdpdGggdGhlIHBsb3Qgc3RpbGwgb3Blbi4gVGhpcyBnZW5lcmF0ZXMgYSB2ZXJ0aWNhbCBsaW5lIGF0IHRoZSBkYXRlIE1hcmNoIDEsIDIwMDAuIFRoZSBhcmd1bWVudCBsd2Q9MiBtYWtlcyB0aGUgbGluZSBhIGxpdHRsZSB0aGlja2VyLiBZb3UgY2FuIGNoYW5nZSB0aGUgZGF0ZSBpbiB0aGlzIGNvbW1hbmQgdG8gZ2VuZXJhdGUgdGhlIHZlcnRpY2FsIGxpbmUgaW4gZGlmZmVyZW50IGxvY2F0aW9ucy4NCg0KDQojIyMjIDIuMw0KQW5zd2VyIHRoZXNlIHF1ZXN0aW9ucyB1c2luZyB0aGUgcGxvdCB5b3UgZ2VuZXJhdGVkIGluIHRoZSBwcmV2aW91cyBwcm9ibGVtLg0KDQpBcm91bmQgMTk4MywgdGhlIHN0b2NrIGZvciBvbmUgb2YgdGhlc2UgY29tcGFuaWVzIChDb2NhLUNvbGEgb3IgUHJvY3RlciBhbmQgR2FtYmxlKSB3YXMgZ29pbmcgdXAsIHdoaWxlIHRoZSBvdGhlciB3YXMgZ29pbmcgZG93bi4gV2hpY2ggb25lIHdhcyBnb2luZyB1cD8NCg0KKyBDb2NhLUNvbGENCisgUHJvY3RlciBhbmQgR2FtYmxlDQoNCmBgYHtyfQ0KIyBDb2NhLUNvbGENCmBgYA0KDQojIyMjIDIuNCANCkluIHRoZSB0aW1lIHBlcmlvZCBzaG93biBpbiB0aGUgcGxvdCwgd2hpY2ggc3RvY2sgZ2VuZXJhbGx5IGhhcyBsb3dlciB2YWx1ZXM/DQoNCisgQ29jYS1Db2xhDQorIFByb2N0ZXIgYW5kIEdhbWJsZQ0KDQpgYGB7cn0NCiMgQ29jYS1Db2xhDQpgYGANCg0KDQojIyMgU2VjdGlvbiAzIC0gVmlzdWFsaXppbmcgU3RvY2sgRHluYW1pY3MgMTk5NS0yMDA1DQoNCkxldCdzIHRha2UgYSBsb29rIGF0IGhvdyB0aGUgc3RvY2sgcHJpY2VzIGNoYW5nZWQgZnJvbSAxOTk1LTIwMDUgZm9yIGFsbCBmaXZlIGNvbXBhbmllcy4gSW4geW91ciBSIGNvbnNvbGUsIHN0YXJ0IGJ5IHR5cGluZyB0aGUgZm9sbG93aW5nIHBsb3QgY29tbWFuZDoNCg0KICAgIHBsb3QoQ29jYUNvbGEkRGF0ZVszMDE6NDMyXSwgQ29jYUNvbGEkU3RvY2tQcmljZVszMDE6NDMyXSwgdHlwZT0ibCIsICAgIA0KICAgIGNvbD0icmVkIiwgeWxpbT1jKDAsMjEwKSkNCg0KVGhpcyB3aWxsIHBsb3QgdGhlIENvY2FDb2xhIHN0b2NrIHByaWNlcyBmcm9tIDE5OTUgdGhyb3VnaCAyMDA1LCB3aGljaCBhcmUgdGhlIG9ic2VydmF0aW9ucyBudW1iZXJlZCBmcm9tIDMwMSB0byA0MzIuIFRoZSBhZGRpdGlvbmFsIGFyZ3VtZW50LCB5bGltPWMoMCwyMTApLCBtYWtlcyB0aGUgeS1heGlzIHJhbmdlIGZyb20gMCB0byAyMTAuIFRoaXMgd2lsbCBhbGxvdyB1cyB0byBzZWUgYWxsIG9mIHRoZSBzdG9jayB2YWx1ZXMgd2hlbiB3ZSBhZGQgaW4gdGhlIG90aGVyIGNvbXBhbmllcy4NCg0KTm93LCB1c2UgdGhlIGxpbmVzIGZ1bmN0aW9uIHRvIGFkZCBpbiB0aGUgb3RoZXIgZm91ciBjb21wYW5pZXMsIHJlbWVtYmVyaW5nIHRvIG9ubHkgcGxvdCB0aGUgb2JzZXJ2YXRpb25zIGZyb20gMTk5NSB0byAyMDA1LCBvciBbMzAxOjQzMl0uIFlvdSBkb24ndCBuZWVkIHRoZSAidHlwZSIgb3IgInlsaW0iIGFyZ3VtZW50cyBmb3IgdGhlIGxpbmVzIGZ1bmN0aW9uLCBidXQgcmVtZW1iZXIgdG8gbWFrZSBlYWNoIGNvbXBhbnkgYSBkaWZmZXJlbnQgY29sb3Igc28gdGhhdCB5b3UgY2FuIHRlbGwgdGhlbSBhcGFydC4gU29tZSBjb2xvciBvcHRpb25zIGFyZSAicmVkIiwgImJsdWUiLCAiZ3JlZW4iLCAicHVycGxlIiwgIm9yYW5nZSIsIGFuZCAiYmxhY2siLiBUbyBzZWUgYWxsIG9mIHRoZSBjb2xvciBvcHRpb25zIGluIFIsIHR5cGUgY29sb3JzKCkgaW4geW91ciBSIGNvbnNvbGUuDQoNCihJZiB5b3UgcHJlZmVyIHRvIGNoYW5nZSB0aGUgdHlwZSBvZiB0aGUgbGluZSBpbnN0ZWFkIG9mIHRoZSBjb2xvciwgaGVyZSBhcmUgc29tZSBvcHRpb25zIGZvciBjaGFuZ2luZyB0aGUgbGluZSB0eXBlOiBsdHk9MiB3aWxsIG1ha2UgdGhlIGxpbmUgZGFzaGVkLCBsdHk9MyB3aWxsIG1ha2UgdGhlIGxpbmUgZG90dGVkLCBsdHk9NCB3aWxsIG1ha2UgdGhlIGxpbmUgYWx0ZXJuYXRlIGJldHdlZW4gZGFzaGVzIGFuZCBkb3RzLCBhbmQgbHR5PTUgd2lsbCBtYWtlIHRoZSBsaW5lIGxvbmctZGFzaGVkLikNCg0KVXNlIHRoaXMgcGxvdCB0byBhbnN3ZXIgdGhlIGZvbGxvd2luZyBmb3VyIHF1ZXN0aW9ucy4NCg0KDQojIyMjIDMuMQ0KDQpXaGljaCBzdG9jayBmZWxsIHRoZSBtb3N0IHJpZ2h0IGFmdGVyIHRoZSB0ZWNobm9sb2d5IGJ1YmJsZSBidXJzdCBpbiBNYXJjaCAyMDAwPw0KDQorIENvY2EtQ29sYQ0KKyBQcm9jdGVyIGFuZCBHYW1ibGUNCisgSUJNDQorIEdlbmVyYWwgRWxlY3RyaWMgKEdFKQ0KKyBCb2VpbmcNCg0KYGBge3J9DQpwbG90KENvY2FDb2xhJERhdGVbMzAxOjQzMl0sIENvY2FDb2xhJFN0b2NrUHJpY2VbMzAxOjQzMl0sIA0KICAgICB0eXBlPSJsIiwgY29sPSJyZWQiLCB5bGltPWMoMCwyMTApKQ0KbGluZXMoUHJvY3RlckdhbWJsZSREYXRlWzMwMTo0MzJdLCAgUHJvY3RlckdhbWJsZSRTdG9ja1ByaWNlWzMwMTo0MzJdLCAgY29sPSJibHVlIikNCmxpbmVzKElCTSREYXRlWzMwMTo0MzJdLCBJQk0kU3RvY2tQcmljZVszMDE6NDMyXSwgY29sPSJncmVlbiIpDQpsaW5lcyhHRSREYXRlWzMwMTo0MzJdLCAgR0UkU3RvY2tQcmljZVszMDE6NDMyXSwgIGNvbD0icHVycGxlIikNCmxpbmVzKEJvZWluZyREYXRlWzMwMTo0MzJdLCAgQm9laW5nJFN0b2NrUHJpY2VbMzAxOjQzMl0sICBjb2w9Im9yYW5nZSIpDQphYmxpbmUodiA9IGFzLkRhdGUoIjIwMDAtMDMtMDEiKSwgbHR5PTMsIGNvbD0nZ3JheScpDQphYmxpbmUodiA9IGFzLkRhdGUoIjE5OTctMDktMDEiKSwgbHR5PTMsIGNvbD0nZ3JheScpDQphYmxpbmUodiA9IGFzLkRhdGUoIjE5OTctMTEtMDEiKSwgbHR5PTMsIGNvbD0nZ3JheScpDQpsZWdlbmQoInRvcHJpZ2h0IixsZWdlbmQ9YygiQ29rZSIsIlAmRyIsIklCTSIsIkdFIiwiQkUiKSxjb2w9YygncmVkJywnYmx1ZScsJ2dyZWVuJywncHVycGxlJywnb3JhbmdlJyksbHdkPTIpDQpgYGANCnBsb3QoQ29jYUNvbGEkRGF0ZVszMDE6NDMyXSwgQ29jYUNvbGEkU3RvY2tQcmljZVszMDE6NDMyXSwgdHlwZT0ibCIsICAgIA0KICAgIGNvbD0icmVkIiwgeWxpbT1jKDAsMjEwKSkNCnlsaW0oKVnnmoTnr4TlnI0NCnhsaW0oKVjnmoTnr4TlnI0NCg0KYGBgDQoNCmBgYA0KDQojIyMjIDMuMg0KV2hpY2ggc3RvY2sgcmVhY2hlcyB0aGUgaGlnaGVzdCB2YWx1ZSBpbiB0aGUgdGltZSBwZXJpb2QgMTk5NS0yMDA1Pw0KDQorIENvY2EtQ29sYQ0KKyBQcm9jdGVyIGFuZCBHYW1ibGUNCisgSUJNDQorIEdlbmVyYWwgRWxlY3RyaWMgKEdFKQ0KKyBCb2VpbmcNCg0KDQpgYGB7cn0NCiNJQk0NCmBgYA0KDQoNCiMjIyMgMy4zDQpJbiBPY3RvYmVyIG9mIDE5OTcsIHRoZXJlIHdhcyBhIGdsb2JhbCBzdG9jayBtYXJrZXQgY3Jhc2ggdGhhdCB3YXMgY2F1c2VkIGJ5IGFuIGVjb25vbWljIGNyaXNpcyBpbiBBc2lhLiBDb21wYXJpbmcgU2VwdGVtYmVyIDE5OTcgdG8gTm92ZW1iZXIgMTk5Nywgd2hpY2ggY29tcGFuaWVzIHNhdyBhIGRlY3JlYXNpbmcgdHJlbmQgaW4gdGhlaXIgc3RvY2sgcHJpY2U/IChTZWxlY3QgYWxsIHRoYXQgYXBwbHkuKQ0KDQorIENvY2EtQ29sYQ0KKyBQcm9jdGVyIGFuZCBHYW1ibGUNCisgSUJNDQorIEdlbmVyYWwgRWxlY3RyaWMgKEdFKQ0KKyBCb2VpbmcNCg0KYGBge3J9DQojIEJvZWluZw0KYGBgDQoNCiMjIyMgMy40DQpJbiB0aGUgbGFzdCB0d28geWVhcnMgb2YgdGhpcyB0aW1lIHBlcmlvZCAoMjAwNCBhbmQgMjAwNSkgd2hpY2ggc3RvY2sgc2VlbXMgdG8gYmUgcGVyZm9ybWluZyB0aGUgYmVzdCwgaW4gdGVybXMgb2YgaW5jcmVhc2luZyBzdG9jayBwcmljZT8NCg0KKyBDb2NhLUNvbGENCisgUHJvY3RlciBhbmQgR2FtYmxlDQorIElCTQ0KKyBHZW5lcmFsIEVsZWN0cmljIChHRSkNCisgQm9laW5nDQoNCmBgYHtyfQ0KIyBJQk0NCmBgYA0KDQojIyMgU2VjdGlvbiA0IC0gTW9udGhseSBUcmVuZHMNCg0KTGFzdGx5LCBsZXQncyBzZWUgaWYgc3RvY2tzIHRlbmQgdG8gYmUgaGlnaGVyIG9yIGxvd2VyIGR1cmluZyBjZXJ0YWluIG1vbnRocy4gVXNlIHRoZSB0YXBwbHkgY29tbWFuZCB0byBjYWxjdWxhdGUgdGhlIG1lYW4gc3RvY2sgcHJpY2Ugb2YgSUJNLCBzb3J0ZWQgYnkgbW9udGhzLiBUbyBzb3J0IGJ5IG1vbnRocywgdXNlDQoNCiAgICBtb250aHMoSUJNJERhdGUpDQoNCmFzIHRoZSBzZWNvbmQgYXJndW1lbnQgb2YgdGhlIHRhcHBseSBmdW5jdGlvbi4NCg0KIyMjIyA0LjENCkZvciBJQk0sIGNvbXBhcmUgdGhlIG1vbnRobHkgYXZlcmFnZXMgdG8gdGhlIG92ZXJhbGwgYXZlcmFnZSBzdG9jayBwcmljZS4gSW4gd2hpY2ggbW9udGhzIGhhcyBJQk0gaGlzdG9yaWNhbGx5IGhhZCBhIGhpZ2hlciBzdG9jayBwcmljZSAob24gYXZlcmFnZSk/IFNlbGVjdCBhbGwgdGhhdCBhcHBseS4oSmFudWFyeX5EZWNlbWJlcikNCg0KDQpgYGB7cn0NCnRhcHBseShJQk0kU3RvY2tQcmljZSwgZm9ybWF0KElCTSREYXRlLCIlbSIpLCBtZWFuKS1tZWFuKElCTSRTdG9ja1ByaWNlKQ0KDQpgYGANCg0KIyMjIyA0LjIgDQpSZXBlYXQgdGhlIHRhcHBseSBmdW5jdGlvbiBmcm9tIHRoZSBwcmV2aW91cyBwcm9ibGVtIGZvciBlYWNoIG9mIHRoZSBvdGhlciBmb3VyIGNvbXBhbmllcywgYW5kIHVzZSB0aGUgb3V0cHV0IHRvIGFuc3dlciB0aGUgcmVtYWluaW5nIHF1ZXN0aW9ucy4NCg0KR2VuZXJhbCBFbGVjdHJpYyBhbmQgQ29jYS1Db2xhIGJvdGggaGF2ZSB0aGVpciBoaWdoZXN0IGF2ZXJhZ2Ugc3RvY2sgcHJpY2UgaW4gdGhlIHNhbWUgbW9udGguIFdoaWNoIG1vbnRoIGlzIHRoaXM/DQogDQpgYGB7cn0NCnRhcHBseShHRSRTdG9ja1ByaWNlLCBmb3JtYXQoR0UkRGF0ZSwiJW0iKSwgbWVhbikgLSBtZWFuKEdFJFN0b2NrUHJpY2UpDQp0YXBwbHkoQ29jYUNvbGEkU3RvY2tQcmljZSwgZm9ybWF0KENvY2FDb2xhJERhdGUsIiVtIiksIG1lYW4pIC0gbWVhbihDb2NhQ29sYSRTdG9ja1ByaWNlKQ0KIyA05pyIDQpgYGANCuS5n+WPr+S7peaUueaIkA0Kc2FwcGx5KGxpc3QoQkU9Qm9laW5nLENLPUNLLEdFPUdFLElCTT1JQk0sUEc9UEcpLCBmdW5jdGlvbihkZikgew0KICAgdGFwcGx5KGRmJFN0b2NrUHJpY2UsIGZvcm1hdChkZiREYXRlLCIlbSIpLCBtZWFuKSAtIG1lYW4oZGYkU3RvY2spDQogICB9KSANCiAgIA0K5aaC5p6c6KaB5riF6Zmk6Zuc6KiK5oiW6K2m5ZGK77yM6aCI5Zyo5LiL5pa55qGG5Lit5Yqg5YWlDQpTeXMuc2V0bG9jYWxlKCdMQ19BTEwnLCdDJykNCg0KIyMjIyA0LjMNCkZvciB0aGUgbW9udGhzIG9mIERlY2VtYmVyIGFuZCBKYW51YXJ5LCBldmVyeSBjb21wYW55J3MgYXZlcmFnZSBzdG9jayBpcyBoaWdoZXIgaW4gb25lIG1vbnRoIGFuZCBsb3dlciBpbiB0aGUgb3RoZXIuIEluIHdoaWNoIG1vbnRoIGFyZSB0aGUgc3RvY2sgcHJpY2VzIGxvd2VyPw0KDQorIERlY2VtYmVyDQorIEphbnVhcnkNCg0KDQpgYGB7cn0NCnRhcHBseShHRSRTdG9ja1ByaWNlLCBmb3JtYXQoR0UkRGF0ZSwiJW0iKSwgbWVhbikgLSBtZWFuKEdFJFN0b2NrUHJpY2UpDQp0YXBwbHkoQ29jYUNvbGEkU3RvY2tQcmljZSwgZm9ybWF0KENvY2FDb2xhJERhdGUsIiVtIiksIG1lYW4pLW1lYW4oQ29jYUNvbGEkU3RvY2tQcmljZSkNCnRhcHBseShCb2VpbmckU3RvY2tQcmljZSwgZm9ybWF0KEJvZWluZyREYXRlLCIlbSIpLCBtZWFuKS1tZWFuKEJvZWluZyRTdG9ja1ByaWNlKQ0KdGFwcGx5KFByb2N0ZXJHYW1ibGUkU3RvY2tQcmljZSwgYXMuY2hhcmFjdGVyKFByb2N0ZXJHYW1ibGUkRGF0ZSwiJW0iKSwgbWVhbikNCiMgRGVjZW1iZXINCmBgYA0KDQoNCkFmdGVyIHNlZWluZyB0aGVzZSB0cmVuZHMsIHdlIGFyZSByZWFkeSB0byBidXkgc3RvY2sgaW4gY2VydGFpbiBtb250aHMgYW5kIHNlbGwgaXQgaW4gb3RoZXJzISBCdXQsIHdlIHNob3VsZCBiZSBjYXJlZnVsLCBiZWNhdXNlIG9uZSByZWFsbHkgZ29vZCBvciByZWFsbHkgYmFkIHllYXIgY291bGQgc2tldyB0aGUgYXZlcmFnZSB0byBzaG93IGEgdHJlbmQgdGhhdCBpcyBub3QgcmVhbGx5IHRoZXJlIGluIGdlbmVyYWwuDQoNCg0KDQoNCg==