About

This worksheet looks at VaR calculations for the two cases of single and multiple equity asset. This is the last lab worksheet, other than the extra credit assignment.

Setup

Remember to always set your working directory to the source file location. Go to ‘Session’, scroll down to ‘Set Working Directory’, and click ‘To Source File Location’. Read carefully the below and follow the instructions to complete the tasks and answer any questions. Submit your work to RPubs as detailed in previous notes.

Note

Always read carefully the instructions on Sakai. For clarity, tasks/questions to be completed/answered are highlighted in red color (visible in preview) and numbered according to their particular placement in the task section. Quite often you will need to add your own code chunk.

Execute all code chunks, preview, publish, and submit link on Sakai follwoing the naming convention. Make sure to add comments to your code where appropriate. Use own language!


Task 1: VaR Calculations: Single Equity Asset

#Install package quantmod 
install.packages("quantmod")
Error in install.packages : Updating loaded packages
library("quantmod")

Consider the time series of a stock of your choice (other than AAPL and your colleague!) and for the time-period from Jan 1, 2015 to present.

We will first generate the historical time series of daily log returns, and calculate the mean and standard deviation of the time series.

##### 1A) Calculate the historical daily log returns, mean and standard deviation

Given a time series we can generate a histogram and mark the quantile value that corresponds to the 95% confidence level. The quantile value in this case is the critical value for which 95% of the data is on the right (higher) of the critical value as represented by the histogram. The remaining 5% will be on the left. To find the quantile value you will need to use the function quantile() with the proper arguments. For example quantile(xts,probs=0.01) applies to a time series xts and return the critical value correspondng to 99% confidence level.

getSymbols("TWTR",src="yahoo",from="2015-01-01") ##data starts from 2015
[1] "TWTR"
TWTRD = periodReturn(TWTR,period="daily",type="log")
plot(TWTRD, main="TWTR daily log returns")#it says the daily log is not the correct code

mean(TWTRD)
[1] -5.116839e-05
sd(TWTRD)
[1] 0.03357331
quantile(TWTRD,0.05)#the 95% confidence level quantile for Twtr is -4.62%
         5% 
-0.04616212 

##### 1B) Plot a histogram and mark the quantile value that corresponds to 95% confidence level. A mark can be added to a plot by using the function abline().

hist(TWTRD,breaks=50)
abline(v =-0.04619, untf = FALSE)

#we now konw the mean for daily log return is very close to 0, and standard deviation is 0.0336, VaR=-1.645*sigma+mean=-0.055. this result is not strictly match the quantile value but very close since it is not a strict normal distribution.

Given the above, we can calculate a VaR value for a given investment and a time horizon.

##### 1C) Assume $1000 investment in the stock, calculate the 95% VaR for 3 days鈥? time horizon. Explain the meaning of VaR in practical terms.

From the quantile result, the VaR value for daily log return is -4.62%, this means the investor has less than 5% probability of losing 1000x4.62%=$46.2 the next day. For 3 days’ horizon,we need to scale the result with square-root rule. the new VaR=-46.2 x 3^(0.5)=80.02.This means the investor has less than 5% probability of losing more than $80.02 in the coming 3 days. ##### 1D) How does the VaR calculated in 1C changes if we assumed simple returns instead of the log returns.

getSymbols("TWTR",src="yahoo",from="2015-01-01") ##data starts from 2015
[1] "TWTR"
TWTRD1 = periodReturn(TWTR,period="daily")
quantile(TWTRD1,0.05)
         5% 
-0.04513803 
VaR95=exp(-0.04619)-1
VaR95
[1] -0.04513948

in actual historical data the quantile for 95% confidence interval is -4.513% ,but if we use the exp calculation form the result is -4.513% as well.

when we use the simple daily return to replace the daily log return, the new VaR we get is 4.51%, this result is very close to the previous VaR.

Calculations so far have been on the histogram of log returns. We can instead, looking at the histogram, assume a normal distribution of the log returns. The normal return assumption will have a mean and standard deviation equal to those calculated from the histogram, and properly scaled by the horizon time. Note that the mean is linearly scaled with time and volatility with square-root of time.

##### 1E) Repeat the calculation in 1D assuming instead a normal distribution. How the two results compare and why so?

mean(TWTRD1)
[1] 0.0004738883
sd(TWTRD1)
[1] 0.03324971
#assuming normally distributed, we get the mean=0.000474 and standard deviation=0.0332, according to VaR=(z value)*sigma+mean 
#VaR=-1.645*0.0332+0.0000474=-5.414%
#the result has a little diffrence with the actual VaR ,but very close, since the actual distribution is not a strict normal distribution
VaR95=exp(-0.04619)-1
VaR95 #in actual historical data the quantile for 95% confidence interval is -4.513% ,but if we use the exp calculation form the result is -4.513 as well.
[1] -0.04513948

##### 1F) Write down the mathematical representation corresponding to the VaR calculation in 1E. Explain what each variable in the equation represents, and provide the corresponding numerical value. Caption Here

Task 2: VaR Calculations: Multiple Equity Assets

Consider the times series of the three stocks DIS, TWTR, and NFLX for the time-period from Jan 1,2015 to present. Assume an investment of $100,000 equally distributed among all three stocks.

To calculate the portfolio VaR we will follow the methodolgy described by the variance-covariance. First the covariance matrix needs to be computed. We then calculate the variance or volatility of the portolio as expressed in the varaince-covariance method taking into the weights associated with each asset in the portfolio. Fiinally we compute the mean or expected return of the portfolio taking also into account the weights. Given the expected return and volatility we should be able to compute the VaR of the portfolio. The assumption is we have a normal distribution of log returns.

First we calculate the overall portfolio VaR.

##### 2A) Calculate the portfolio 99% VaR for 1 day, and 3 days. Specify whether using log-returns or simple returns.

# Covariance & Correlation
symbols=c('DIS','TWTR','NFLX')
#getSymbols(symbols,src='yahoo',from="2015-01-01")
getSymbols(symbols,src='yahoo',from="2015-01-01") 
[1] "DIS"  "TWTR" "NFLX"
disRd= as.numeric(periodReturn(DIS$DIS.Adjusted,period="daily",type="log"))
twtrRd= as.numeric(periodReturn(TWTR$TWTR.Adjusted,period="daily",type="log"))
nflxRd= as.numeric(periodReturn(NFLX$NFLX.Adjusted,period="daily",type="log"))
M <- cbind(disRd,twtrRd,nflxRd) # create a matrix 
cov(M)
              disRd       twtrRd       nflxRd
disRd  1.459283e-04 8.730401e-05 9.318157e-05
twtrRd 8.730401e-05 1.128636e-03 2.433119e-04
nflxRd 9.318157e-05 2.433119e-04 7.334634e-04
cor(M, method="pearson")
           disRd    twtrRd    nflxRd
disRd  1.0000000 0.2151233 0.2848203
twtrRd 0.2151233 1.0000000 0.2674220
nflxRd 0.2848203 0.2674220 1.0000000
standardofportfolip=0.537# this comes from cor(M) times vector (1/3,1/3,1/3) and the vector's trancope.
mean(disRd)
[1] 0.0002235978
mean(twtrRd)
[1] -9.407216e-05
mean(nflxRd)
[1] 0.001867232

the standard deviation of portfolip=$5343.87 ,this comes from cor(M) times vector (100000,100000,100000) and the vector’s trancope.

the mean for the portfolio is nearly 1/3(0+0+0)=0 The VaR for 1 day is sd(portfolio)x(z value)+mean=-2.3265343.87=$-12430

the VaR for 3 days is -12430x 3^(0.5)=$-21529

We then describe the mathetical formulation useds in the code to perform the calculations

##### 2B) Write down the mathematical representations used in the code to calculate the VaR. Label properly each variable, what it represents, and the numerical value corresponding to in the code. Caption Here

We now calculated individual VaR corresponding to each asst in the portfolio

##### 2C) Calculate the three-individual asset 99% VaR for 1 day.

quantile(disRd,0.01)
         1% 
-0.03774623 
quantile(twtrRd,0.01)
        1% 
-0.1150925 
quantile(nflxRd,0.01)
         1% 
-0.07067303 

# -0.03774623 x100,000=$-3774 , this is VaR for individual Disney, #-0.1150925 x100,000=-$11509 , this is VaR for individual TWTR, #-0.07067303x100,000=-&7067 , this is VaR for individual NFLX。 Finally we compare the overall VaR to the individual VaR calculations

##### 2D) Compare the overall portfolio VaR to the sum of the individual asset VaR for the 1 day case. Share observations. Theoretically, the portfolio consists of multiple assets could reduce the risk ,so the VaR for the combined Portfolio should have a lower absolute VaR Value. The result from my calculation shows that the combined portfolio has a VaR of $-12430 while the individual assets has a VaR of $-22350 in total, this matches the theory. INvesting in a combines portfolio can actually and significantly reduce the risk of losing money. *http://computationalfinance.lsi.upc.edu

LS0tDQp0aXRsZTogIkZJTkM2MjEgV2ludGVyIDIwMTgtMTkgTGFiIFdvcmtzaGVldCAwNyINCmF1dGhvcjogIllvdXIgTmFtZSBIZXJlIg0KZGF0ZTogIkFkZCBEYXRlIEhlcmUiDQpvdXRwdXQ6DQogIGh0bWxfbm90ZWJvb2s6IGRlZmF1bHQNCiAgaHRtbF9kb2N1bWVudDogZGVmYXVsdA0Kc3VidGl0bGU6IFZhciBDYWxjdWxhdGlvbnMgKGZpbmM2MjEtbGFiMDcpDQotLS0NCg0KIyMjIEFib3V0DQoNClRoaXMgd29ya3NoZWV0IGxvb2tzIGF0IFZhUiBjYWxjdWxhdGlvbnMgZm9yIHRoZSB0d28gY2FzZXMgb2Ygc2luZ2xlIGFuZCBtdWx0aXBsZSBlcXVpdHkgYXNzZXQuIFRoaXMgaXMgdGhlIGxhc3QgbGFiIHdvcmtzaGVldCwgb3RoZXIgdGhhbiB0aGUgZXh0cmEgY3JlZGl0IGFzc2lnbm1lbnQuDQoNCiMjIyBTZXR1cA0KDQpSZW1lbWJlciB0byBhbHdheXMgc2V0IHlvdXIgd29ya2luZyBkaXJlY3RvcnkgdG8gdGhlIHNvdXJjZSBmaWxlIGxvY2F0aW9uLiBHbyB0byAnU2Vzc2lvbicsIHNjcm9sbCBkb3duIHRvICdTZXQgV29ya2luZyBEaXJlY3RvcnknLCBhbmQgY2xpY2sgJ1RvIFNvdXJjZSBGaWxlIExvY2F0aW9uJy4gUmVhZCBjYXJlZnVsbHkgdGhlIGJlbG93IGFuZCBmb2xsb3cgdGhlIGluc3RydWN0aW9ucyB0byBjb21wbGV0ZSB0aGUgdGFza3MgYW5kIGFuc3dlciBhbnkgcXVlc3Rpb25zLiAgU3VibWl0IHlvdXIgd29yayB0byBSUHVicyBhcyBkZXRhaWxlZCBpbiBwcmV2aW91cyBub3Rlcy4gDQoNCiMjIyBOb3RlDQoNCkFsd2F5cyByZWFkIGNhcmVmdWxseSB0aGUgaW5zdHJ1Y3Rpb25zIG9uIFNha2FpLiAgRm9yIGNsYXJpdHksIHRhc2tzL3F1ZXN0aW9ucyB0byBiZSBjb21wbGV0ZWQvYW5zd2VyZWQgYXJlIGhpZ2hsaWdodGVkIGluIHJlZCBjb2xvciAodmlzaWJsZSBpbiBwcmV2aWV3KSBhbmQgbnVtYmVyZWQgYWNjb3JkaW5nIHRvIHRoZWlyIHBhcnRpY3VsYXIgcGxhY2VtZW50IGluIHRoZSB0YXNrIHNlY3Rpb24uICBRdWl0ZSBvZnRlbiB5b3Ugd2lsbCBuZWVkIHRvIGFkZCB5b3VyIG93biBjb2RlIGNodW5rLg0KDQpFeGVjdXRlIGFsbCBjb2RlIGNodW5rcywgcHJldmlldywgcHVibGlzaCwgYW5kIHN1Ym1pdCBsaW5rIG9uIFNha2FpIGZvbGx3b2luZyB0aGUgbmFtaW5nIGNvbnZlbnRpb24uIE1ha2Ugc3VyZSB0byBhZGQgY29tbWVudHMgdG8geW91ciBjb2RlIHdoZXJlIGFwcHJvcHJpYXRlLiBVc2Ugb3duIGxhbmd1YWdlIQ0KDQotLS0tLS0tLS0tLS0tLQ0KDQojIyMgVGFzayAxOiBWYVIgQ2FsY3VsYXRpb25zOiBTaW5nbGUgRXF1aXR5IEFzc2V0DQoNCg0KYGBge3J9DQojSW5zdGFsbCBwYWNrYWdlIHF1YW50bW9kIA0KaW5zdGFsbC5wYWNrYWdlcygicXVhbnRtb2QiKQ0KbGlicmFyeSgicXVhbnRtb2QiKQ0KYGBgDQoNCkNvbnNpZGVyIHRoZSB0aW1lIHNlcmllcyBvZiBhIHN0b2NrIG9mIHlvdXIgY2hvaWNlIChvdGhlciB0aGFuIEFBUEwgYW5kIHlvdXIgY29sbGVhZ3VlISkgYW5kIGZvciB0aGUgdGltZS1wZXJpb2QgZnJvbSBKYW4gMSwgMjAxNSB0byBwcmVzZW50LiANCg0KV2Ugd2lsbCBmaXJzdCBnZW5lcmF0ZSB0aGUgaGlzdG9yaWNhbCB0aW1lIHNlcmllcyBvZiBkYWlseSBsb2cgcmV0dXJucywgYW5kIGNhbGN1bGF0ZSB0aGUgbWVhbiBhbmQgc3RhbmRhcmQgZGV2aWF0aW9uIG9mIHRoZSB0aW1lIHNlcmllcy4NCg0KPHNwYW4gc3R5bGU9ImNvbG9yOnJlZCI+DQojIyMjIyAxQSkgQ2FsY3VsYXRlIHRoZSBoaXN0b3JpY2FsIGRhaWx5IGxvZyByZXR1cm5zLCBtZWFuIGFuZCBzdGFuZGFyZCBkZXZpYXRpb24NCjwvc3Bhbj4NCg0KR2l2ZW4gYSB0aW1lIHNlcmllcyB3ZSBjYW4gZ2VuZXJhdGUgYSBoaXN0b2dyYW0gYW5kIG1hcmsgdGhlIHF1YW50aWxlIHZhbHVlIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIDk1JSBjb25maWRlbmNlIGxldmVsLiBUaGUgcXVhbnRpbGUgdmFsdWUgaW4gdGhpcyBjYXNlIGlzIHRoZSBjcml0aWNhbCB2YWx1ZSBmb3Igd2hpY2ggOTUlIG9mIHRoZSBkYXRhIGlzIG9uIHRoZSByaWdodCAoaGlnaGVyKSBvZiB0aGUgY3JpdGljYWwgdmFsdWUgYXMgcmVwcmVzZW50ZWQgYnkgdGhlIGhpc3RvZ3JhbS4gVGhlIHJlbWFpbmluZyA1JSB3aWxsIGJlIG9uIHRoZSBsZWZ0LiBUbyBmaW5kIHRoZSBxdWFudGlsZSB2YWx1ZSB5b3Ugd2lsbCBuZWVkIHRvIHVzZSB0aGUgZnVuY3Rpb24gYHF1YW50aWxlKClgIHdpdGggdGhlIHByb3BlciBhcmd1bWVudHMuIEZvciBleGFtcGxlIGBxdWFudGlsZSh4dHMscHJvYnM9MC4wMSlgICBhcHBsaWVzIHRvIGEgdGltZSBzZXJpZXMgYHh0c2AgYW5kIHJldHVybiB0aGUgY3JpdGljYWwgdmFsdWUgY29ycmVzcG9uZG5nIHRvIGA5OSVgIGNvbmZpZGVuY2UgbGV2ZWwuDQpgYGB7cn0NCmdldFN5bWJvbHMoIlRXVFIiLHNyYz0ieWFob28iLGZyb209IjIwMTUtMDEtMDEiKSAjI2RhdGEgc3RhcnRzIGZyb20gMjAxNQ0KVFdUUkQgPSBwZXJpb2RSZXR1cm4oVFdUUixwZXJpb2Q9ImRhaWx5Iix0eXBlPSJsb2ciKQ0KcGxvdChUV1RSRCwgbWFpbj0iVFdUUiBkYWlseSBsb2cgcmV0dXJucyIpI2l0IHNheXMgdGhlIGRhaWx5IGxvZyBpcyBub3QgdGhlIGNvcnJlY3QgY29kZQ0KbWVhbihUV1RSRCkNCnNkKFRXVFJEKQ0KcXVhbnRpbGUoVFdUUkQsMC4wNSkjdGhlIDk1JSBjb25maWRlbmNlIGxldmVsIHF1YW50aWxlIGZvciBUd3RyIGlzIC00LjYyJQ0KDQoNCmBgYA0KDQoNCjxzcGFuIHN0eWxlPSJjb2xvcjpyZWQiPg0KIyMjIyMgMUIpIFBsb3QgYSBoaXN0b2dyYW0gYW5kIG1hcmsgdGhlIHF1YW50aWxlIHZhbHVlIHRoYXQgY29ycmVzcG9uZHMgdG8gOTUlIGNvbmZpZGVuY2UgbGV2ZWwuIEEgbWFyayBjYW4gYmUgYWRkZWQgdG8gYSBwbG90IGJ5IHVzaW5nIHRoZSBmdW5jdGlvbiBgYWJsaW5lKClgLg0KPC9zcGFuPg0KYGBge3J9DQpoaXN0KFRXVFJELGJyZWFrcz01MCkNCmFibGluZSh2ID0tMC4wNDYxOSwgdW50ZiA9IEZBTFNFKQ0KI3dlIG5vdyBrb253IHRoZSBtZWFuIGZvciBkYWlseSBsb2cgcmV0dXJuIGlzIHZlcnkgY2xvc2UgdG8gMCwgYW5kIHN0YW5kYXJkIGRldmlhdGlvbiBpcyAwLjAzMzYsIFZhUj0tMS42NDUqc2lnbWErbWVhbj0tMC4wNTUuIHRoaXMgcmVzdWx0IGlzIG5vdCBzdHJpY3RseSBtYXRjaCB0aGUgcXVhbnRpbGUgdmFsdWUgYnV0IHZlcnkgY2xvc2Ugc2luY2UgaXQgaXMgbm90IGEgc3RyaWN0IG5vcm1hbCBkaXN0cmlidXRpb24uDQpgYGANCg0KR2l2ZW4gdGhlIGFib3ZlLCB3ZSBjYW4gY2FsY3VsYXRlIGEgVmFSIHZhbHVlIGZvciBhIGdpdmVuIGludmVzdG1lbnQgYW5kIGEgdGltZSBob3Jpem9uLg0KDQo8c3BhbiBzdHlsZT0iY29sb3I6cmVkIj4NCiMjIyMjIDFDKSBBc3N1bWUgJDEwMDAgaW52ZXN0bWVudCBpbiB0aGUgc3RvY2ssIGNhbGN1bGF0ZSB0aGUgOTUlIFZhUiBmb3IgMyBkYXlz4oA/IHRpbWUgaG9yaXpvbi4gIEV4cGxhaW4gdGhlIG1lYW5pbmcgb2YgVmFSIGluIHByYWN0aWNhbCB0ZXJtcy4NCjwvc3Bhbj4NCg0KRnJvbSB0aGUgcXVhbnRpbGUgcmVzdWx0LCB0aGUgVmFSIHZhbHVlIGZvciBkYWlseSBsb2cgcmV0dXJuIGlzIC00LjYyJSwgdGhpcyBtZWFucyB0aGUgaW52ZXN0b3IgaGFzIGxlc3MgdGhhbiA1JSBwcm9iYWJpbGl0eSBvZiBsb3NpbmcgMTAwMHg0LjYyJT0kNDYuMiAgdGhlIG5leHQgZGF5LiBGb3IgMyBkYXlzJyBob3Jpem9uLHdlIG5lZWQgdG8gc2NhbGUgdGhlIHJlc3VsdCB3aXRoIHNxdWFyZS1yb290IHJ1bGUuIHRoZSBuZXcgVmFSPS00Ni4yIHggM14oMC41KT04MC4wMi5UaGlzIG1lYW5zIHRoZSBpbnZlc3RvciBoYXMgbGVzcyB0aGFuIDUlIHByb2JhYmlsaXR5IG9mIGxvc2luZyBtb3JlIHRoYW4gJDgwLjAyIGluIHRoZSBjb21pbmcgMyBkYXlzLiANCjxzcGFuIHN0eWxlPSJjb2xvcjpyZWQiPg0KIyMjIyMgMUQpIEhvdyBkb2VzIHRoZSBWYVIgY2FsY3VsYXRlZCBpbiAxQyBjaGFuZ2VzIGlmIHdlIGFzc3VtZWQgc2ltcGxlIHJldHVybnMgaW5zdGVhZCBvZiB0aGUgbG9nIHJldHVybnMuDQo8L3NwYW4+DQpgYGB7cn0NCmdldFN5bWJvbHMoIlRXVFIiLHNyYz0ieWFob28iLGZyb209IjIwMTUtMDEtMDEiKSAjI2RhdGEgc3RhcnRzIGZyb20gMjAxNQ0KVFdUUkQxID0gcGVyaW9kUmV0dXJuKFRXVFIscGVyaW9kPSJkYWlseSIpDQpxdWFudGlsZShUV1RSRDEsMC4wNSkNClZhUjk1PWV4cCgtMC4wNDYxOSktMQ0KVmFSOTUgI2luIGFjdHVhbCBoaXN0b3JpY2FsIGRhdGEgdGhlIHF1YW50aWxlIGZvciA5NSUgY29uZmlkZW5jZSBpbnRlcnZhbCBpcyAtNC41MTMlICxidXQgaWYgd2UgdXNlIHRoZSBleHAgY2FsY3VsYXRpb24gZm9ybSB0aGUgcmVzdWx0IGlzIC00LjUxMyUgYXMgd2VsbC4NCmBgYA0KaW4gYWN0dWFsIGhpc3RvcmljYWwgZGF0YSB0aGUgcXVhbnRpbGUgZm9yIDk1JSBjb25maWRlbmNlIGludGVydmFsIGlzIC00LjUxMyUgLGJ1dCBpZiB3ZSB1c2UgdGhlIGV4cCBjYWxjdWxhdGlvbiBmb3JtIHRoZSByZXN1bHQgaXMgLTQuNTEzJSBhcyB3ZWxsLg0KDQp3aGVuIHdlIHVzZSB0aGUgc2ltcGxlIGRhaWx5IHJldHVybiB0byByZXBsYWNlIHRoZSBkYWlseSBsb2cgcmV0dXJuLCB0aGUgbmV3IFZhUiB3ZSBnZXQgaXMgNC41MSUsIHRoaXMgcmVzdWx0IGlzIHZlcnkgY2xvc2UgdG8gdGhlIHByZXZpb3VzIFZhUi4NCg0KQ2FsY3VsYXRpb25zIHNvIGZhciBoYXZlIGJlZW4gb24gdGhlIGhpc3RvZ3JhbSBvZiBsb2cgcmV0dXJucy4gV2UgY2FuIGluc3RlYWQsIGxvb2tpbmcgYXQgdGhlIGhpc3RvZ3JhbSwgYXNzdW1lIGEgbm9ybWFsIGRpc3RyaWJ1dGlvbiBvZiB0aGUgbG9nIHJldHVybnMuIFRoZSBub3JtYWwgcmV0dXJuIGFzc3VtcHRpb24gd2lsbCBoYXZlIGEgbWVhbiBhbmQgc3RhbmRhcmQgZGV2aWF0aW9uIGVxdWFsIHRvIHRob3NlIGNhbGN1bGF0ZWQgZnJvbSB0aGUgaGlzdG9ncmFtLCBhbmQgcHJvcGVybHkgc2NhbGVkIGJ5IHRoZSBob3Jpem9uIHRpbWUuICBOb3RlIHRoYXQgdGhlIG1lYW4gaXMgbGluZWFybHkgc2NhbGVkIHdpdGggdGltZSBhbmQgdm9sYXRpbGl0eSB3aXRoIHNxdWFyZS1yb290IG9mIHRpbWUuDQoNCjxzcGFuIHN0eWxlPSJjb2xvcjpyZWQiPg0KIyMjIyMgMUUpIFJlcGVhdCB0aGUgY2FsY3VsYXRpb24gaW4gMUQgYXNzdW1pbmcgaW5zdGVhZCBhIG5vcm1hbCBkaXN0cmlidXRpb24uIEhvdyB0aGUgdHdvIHJlc3VsdHMgY29tcGFyZSBhbmQgd2h5IHNvPw0KPC9zcGFuPg0KYGBge3J9DQptZWFuKFRXVFJEMSkNCnNkKFRXVFJEMSkNCiNhc3N1bWluZyBub3JtYWxseSBkaXN0cmlidXRlZCwgd2UgZ2V0IHRoZSBtZWFuPTAuMDAwNDc0IGFuZCBzdGFuZGFyZCBkZXZpYXRpb249MC4wMzMyLCBhY2NvcmRpbmcgdG8gVmFSPSh6IHZhbHVlKSpzaWdtYSttZWFuIA0KI1ZhUj0tMS42NDUqMC4wMzMyKzAuMDAwMDQ3ND0tNS40MTQlDQojdGhlIHJlc3VsdCBoYXMgYSBsaXR0bGUgZGlmZnJlbmNlIHdpdGggdGhlIGFjdHVhbCBWYVIgLGJ1dCB2ZXJ5IGNsb3NlLCBzaW5jZSB0aGUgYWN0dWFsIGRpc3RyaWJ1dGlvbiBpcyBub3QgYSBzdHJpY3Qgbm9ybWFsIGRpc3RyaWJ1dGlvbg0KVmFSOTU9ZXhwKC0wLjA0NjE5KS0xDQpWYVI5NSAjaW4gYWN0dWFsIGhpc3RvcmljYWwgZGF0YSB0aGUgcXVhbnRpbGUgZm9yIDk1JSBjb25maWRlbmNlIGludGVydmFsIGlzIC00LjUxMyUgLGJ1dCBpZiB3ZSB1c2UgdGhlIGV4cCBjYWxjdWxhdGlvbiBmb3JtIHRoZSByZXN1bHQgaXMgLTQuNTEzIGFzIHdlbGwuDQpgYGANCg0KDQo8c3BhbiBzdHlsZT0iY29sb3I6cmVkIj4NCiMjIyMjIDFGKSBXcml0ZSBkb3duIHRoZSBtYXRoZW1hdGljYWwgcmVwcmVzZW50YXRpb24gY29ycmVzcG9uZGluZyB0byB0aGUgVmFSIGNhbGN1bGF0aW9uIGluIDFFLiBFeHBsYWluIHdoYXQgZWFjaCB2YXJpYWJsZSBpbiB0aGUgZXF1YXRpb24gcmVwcmVzZW50cywgYW5kIHByb3ZpZGUgdGhlIGNvcnJlc3BvbmRpbmcgbnVtZXJpY2FsIHZhbHVlLg0KPC9zcGFuPg0KIVtDYXB0aW9uIEhlcmVdKGhvbWV3b3JrNy5qcGcpDQoNCg0KIyMjIFRhc2sgMjogVmFSIENhbGN1bGF0aW9uczogTXVsdGlwbGUgRXF1aXR5IEFzc2V0cw0KDQpDb25zaWRlciB0aGUgdGltZXMgc2VyaWVzIG9mIHRoZSB0aHJlZSBzdG9ja3MgRElTLCBUV1RSLCBhbmQgTkZMWCBmb3IgdGhlIHRpbWUtcGVyaW9kIGZyb20gSmFuIDEsMjAxNSB0byBwcmVzZW50LiBBc3N1bWUgYW4gaW52ZXN0bWVudCBvZiAkMTAwLDAwMCBlcXVhbGx5IGRpc3RyaWJ1dGVkIGFtb25nIGFsbCB0aHJlZSBzdG9ja3MuIA0KDQpUbyBjYWxjdWxhdGUgdGhlIHBvcnRmb2xpbyBWYVIgd2Ugd2lsbCBmb2xsb3cgdGhlIG1ldGhvZG9sZ3kgZGVzY3JpYmVkIGJ5IHRoZSB2YXJpYW5jZS1jb3ZhcmlhbmNlLiBGaXJzdCB0aGUgY292YXJpYW5jZSBtYXRyaXggbmVlZHMgdG8gYmUgY29tcHV0ZWQuICBXZSB0aGVuIGNhbGN1bGF0ZSB0aGUgdmFyaWFuY2Ugb3Igdm9sYXRpbGl0eSBvZiB0aGUgcG9ydG9saW8gYXMgZXhwcmVzc2VkIGluIHRoZSB2YXJhaW5jZS1jb3ZhcmlhbmNlIG1ldGhvZCB0YWtpbmcgaW50byB0aGUgd2VpZ2h0cyBhc3NvY2lhdGVkIHdpdGggZWFjaCBhc3NldCBpbiB0aGUgcG9ydGZvbGlvLiAgRmlpbmFsbHkgd2UgY29tcHV0ZSB0aGUgbWVhbiBvciBleHBlY3RlZCByZXR1cm4gb2YgdGhlIHBvcnRmb2xpbyB0YWtpbmcgYWxzbyBpbnRvIGFjY291bnQgdGhlIHdlaWdodHMuICBHaXZlbiB0aGUgZXhwZWN0ZWQgcmV0dXJuIGFuZCB2b2xhdGlsaXR5IHdlIHNob3VsZCBiZSBhYmxlIHRvIGNvbXB1dGUgdGhlIFZhUiBvZiB0aGUgcG9ydGZvbGlvLiAgVGhlIGFzc3VtcHRpb24gaXMgd2UgaGF2ZSBhIG5vcm1hbCBkaXN0cmlidXRpb24gb2YgbG9nIHJldHVybnMuDQoNCkZpcnN0IHdlIGNhbGN1bGF0ZSB0aGUgb3ZlcmFsbCBwb3J0Zm9saW8gVmFSLg0KDQo8c3BhbiBzdHlsZT0iY29sb3I6cmVkIj4NCiMjIyMjIDJBKSBDYWxjdWxhdGUgdGhlIHBvcnRmb2xpbyA5OSUgVmFSIGZvciAxIGRheSwgYW5kIDMgZGF5cy4gU3BlY2lmeSB3aGV0aGVyIHVzaW5nIGxvZy1yZXR1cm5zIG9yIHNpbXBsZSByZXR1cm5zLiAgICAgIA0KPC9zcGFuPg0KYGBge3J9DQojIENvdmFyaWFuY2UgJiBDb3JyZWxhdGlvbg0Kc3ltYm9scz1jKCdESVMnLCdUV1RSJywnTkZMWCcpDQojZ2V0U3ltYm9scyhzeW1ib2xzLHNyYz0neWFob28nLGZyb209IjIwMTUtMDEtMDEiKQ0KZ2V0U3ltYm9scyhzeW1ib2xzLHNyYz0neWFob28nLGZyb209IjIwMTUtMDEtMDEiKSANCmRpc1JkPSBhcy5udW1lcmljKHBlcmlvZFJldHVybihESVMkRElTLkFkanVzdGVkLHBlcmlvZD0iZGFpbHkiLHR5cGU9ImxvZyIpKQ0KdHd0clJkPSBhcy5udW1lcmljKHBlcmlvZFJldHVybihUV1RSJFRXVFIuQWRqdXN0ZWQscGVyaW9kPSJkYWlseSIsdHlwZT0ibG9nIikpDQpuZmx4UmQ9IGFzLm51bWVyaWMocGVyaW9kUmV0dXJuKE5GTFgkTkZMWC5BZGp1c3RlZCxwZXJpb2Q9ImRhaWx5Iix0eXBlPSJsb2ciKSkNCg0KTSA8LSBjYmluZChkaXNSZCx0d3RyUmQsbmZseFJkKSAjIGNyZWF0ZSBhIG1hdHJpeCANCmNvdihNKQ0KY29yKE0sIG1ldGhvZD0icGVhcnNvbiIpDQojdGhlIHN0YW5kYXJkIGRldmlhdGlvbiBvZiBwb3J0Zm9saXA9JDUzNDMuODcgLHRoaXMgY29tZXMgZnJvbSBjb3IoTSkgdGltZXMgdmVjdG9yICgxMDAwMDAsMTAwMDAwLDEwMDAwMCkgYW5kIHRoZSB2ZWN0b3IncyB0cmFuY29wZS4NCm1lYW4oZGlzUmQpDQptZWFuKHR3dHJSZCkNCm1lYW4obmZseFJkKQ0KI3RoZSBtZWFuIGZvciB0aGUgcG9ydGZvbGlvIGlzIG5lYXJseSAxLzMqKDArMCswKT0wDQojVGhlIFZhUiBmb3IgMSBkYXkgaXMgIHNkKHBvcnRmb2xpbykqKHogdmFsdWUpK21lYW49LTIuMzI2KjUzNDMuODc9JC0xMjQzMA0KIyB0aGUgVmFSIGZvciAzIGRheXMgaXMgLTEyNDMwKjNeKDAuNSk9JC0yMTUyOQ0KDQoNCmBgYA0KdGhlIHN0YW5kYXJkIGRldmlhdGlvbiBvZiBwb3J0Zm9saXA9JDUzNDMuODcgLHRoaXMgY29tZXMgZnJvbSAgY29yKE0pIHRpbWVzIHZlY3RvciAoMTAwMDAwLDEwMDAwMCwxMDAwMDApIGFuZCB0aGUgdmVjdG9yJ3MgdHJhbmNvcGUuDQoNCnRoZSBtZWFuIGZvciB0aGUgcG9ydGZvbGlvIGlzIG5lYXJseSAxLzMqKDArMCswKT0wDQpUaGUgVmFSIGZvciAxIGRheSBpcyAgc2QocG9ydGZvbGlvKXgoeiB2YWx1ZSkrbWVhbj0tMi4zMjYqNTM0My44Nz0kLTEyNDMwDQoNCnRoZSBWYVIgZm9yIDMgZGF5cyBpcyAtMTI0MzB4IDNeKDAuNSk9JC0yMTUyOQ0KDQpXZSB0aGVuIGRlc2NyaWJlIHRoZSBtYXRoZXRpY2FsIGZvcm11bGF0aW9uIHVzZWRzIGluIHRoZSBjb2RlIHRvIHBlcmZvcm0gdGhlIGNhbGN1bGF0aW9ucw0KDQo8c3BhbiBzdHlsZT0iY29sb3I6cmVkIj4NCiMjIyMjIDJCKSBXcml0ZSBkb3duIHRoZSBtYXRoZW1hdGljYWwgcmVwcmVzZW50YXRpb25zIHVzZWQgaW4gdGhlIGNvZGUgdG8gY2FsY3VsYXRlIHRoZSBWYVIuICBMYWJlbCBwcm9wZXJseSBlYWNoIHZhcmlhYmxlLCB3aGF0IGl0IHJlcHJlc2VudHMsIGFuZCB0aGUgbnVtZXJpY2FsIHZhbHVlIGNvcnJlc3BvbmRpbmcgdG8gaW4gdGhlIGNvZGUuDQo8L3NwYW4+DQohW0NhcHRpb24gSGVyZV0oaG9tZXdvcms3Mi5qcGcpDQoNCldlIG5vdyBjYWxjdWxhdGVkIGluZGl2aWR1YWwgVmFSIGNvcnJlc3BvbmRpbmcgdG8gZWFjaCBhc3N0IGluIHRoZSBwb3J0Zm9saW8NCg0KPHNwYW4gc3R5bGU9ImNvbG9yOnJlZCI+DQojIyMjIyAyQykgQ2FsY3VsYXRlIHRoZSB0aHJlZS1pbmRpdmlkdWFsIGFzc2V0IDk5JSBWYVIgZm9yIDEgZGF5LiAgDQo8L3NwYW4+DQpgYGB7cn0NCnF1YW50aWxlKGRpc1JkLDAuMDEpICAgIyAtMC4wMzc3NDYyMyAqMTAwLDAwMD0kLTM3NzQgICAgdGhpcyBpcyBWYVIgZm9yIGluZGl2aWR1YWwgRGlzbmV5DQpxdWFudGlsZSh0d3RyUmQsMC4wMSkgICMtMC4xMTUwOTI1ICoxMDAsMDAwPS0kMTE1MDkgICB0aGlzIGlzIFZhUiBmb3IgaW5kaXZpZHVhbCBUV1RSDQpxdWFudGlsZShuZmx4UmQsMC4wMSkgICMtMC4wNzA2NzMwMyoxMDAsMDAwPS0mNzA2NyAgdGhpcyBpcyBWYVIgZm9yIGluZGl2aWR1YWwgTkZMWA0KYGBgDQogIyAtMC4wMzc3NDYyMyB4MTAwLDAwMD0kLTM3NzQgIKOsICB0aGlzIGlzIFZhUiBmb3IgaW5kaXZpZHVhbCBEaXNuZXmjrA0KICMtMC4xMTUwOTI1IHgxMDAsMDAwPS0kMTE1MDkgIKOsIHRoaXMgaXMgVmFSIGZvciBpbmRpdmlkdWFsIFRXVFKjrA0KICAjLTAuMDcwNjczMDN4MTAwLDAwMD0tJjcwNjcgo6wgdGhpcyBpcyBWYVIgZm9yIGluZGl2aWR1YWwgTkZMWKGjDQpGaW5hbGx5IHdlIGNvbXBhcmUgdGhlIG92ZXJhbGwgVmFSIHRvIHRoZSBpbmRpdmlkdWFsIFZhUiBjYWxjdWxhdGlvbnMNCg0KPHNwYW4gc3R5bGU9ImNvbG9yOnJlZCI+DQojIyMjIyAyRCkgQ29tcGFyZSB0aGUgb3ZlcmFsbCBwb3J0Zm9saW8gVmFSIHRvIHRoZSBzdW0gb2YgdGhlIGluZGl2aWR1YWwgYXNzZXQgVmFSIGZvciB0aGUgMSBkYXkgY2FzZS4gIFNoYXJlIG9ic2VydmF0aW9ucy4NCjwvc3Bhbj4NClRoZW9yZXRpY2FsbHksIHRoZSBwb3J0Zm9saW8gY29uc2lzdHMgb2YgbXVsdGlwbGUgYXNzZXRzIGNvdWxkIHJlZHVjZSB0aGUgcmlzayAsc28gdGhlIFZhUiBmb3IgdGhlIGNvbWJpbmVkIFBvcnRmb2xpbyBzaG91bGQgaGF2ZSBhIGxvd2VyIGFic29sdXRlIFZhUiBWYWx1ZS4gVGhlIHJlc3VsdCBmcm9tIG15IGNhbGN1bGF0aW9uIHNob3dzIHRoYXQgdGhlIGNvbWJpbmVkIHBvcnRmb2xpbyBoYXMgYSBWYVIgb2YgJC0xMjQzMCB3aGlsZSB0aGUgaW5kaXZpZHVhbCBhc3NldHMgaGFzIGEgVmFSIG9mICQtMjIzNTAgaW4gdG90YWwsIHRoaXMgbWF0Y2hlcyB0aGUgdGhlb3J5LiBJTnZlc3RpbmcgaW4gYSBjb21iaW5lcyBwb3J0Zm9saW8gY2FuIGFjdHVhbGx5IGFuZCBzaWduaWZpY2FudGx5IHJlZHVjZSB0aGUgcmlzayBvZiBsb3NpbmcgbW9uZXkuDQoqW2h0dHA6Ly9jb21wdXRhdGlvbmFsZmluYW5jZS5sc2kudXBjLmVkdSBdKGh0dHA6Ly9jb21wdXRhdGlvbmFsZmluYW5jZS5sc2kudXBjLmVkdSkNCg==