About
In this worksheet we look at different variance, covariance, volatility, and causality calculations. We finish with a short matematical proof (no R required).
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
For clarity, tasks/questions to be completed/answered are highlighted in red color (color visible only in preview mode) and numbered according to their particular placement in the task section. Type your answers outside the red color tags!
Quite often you will need to add your own code chunk. Execute sequentially all code chunks, preview, publish, and submit link on Sakai following the naming convention. Make sure to add comments to your code where appropriate. Use own language!
Any sign of plagiarism, will result in dissmissal of work!
Task 1: Variance, Covariance, and Volatility
This task follows the two examples in the book R Example 2.5/p. 58 and R Example 2.6/p. 66
# Require will load the package only if not installed
# Dependencies = TRUE makes sure that dependencies are install
if(!require("quantmod",quietly = TRUE))
install.packages("quantmod",dependencies = TRUE, repos = "https://cloud.r-project.org")
##### 1A) Calculate the correlation and covariance matrix of the adjusted daily log returns for four different stocks of your choice. Explain your observations in terms of potential relationships.
symbols = c('NKE','ADDYY','SKX', 'UAA')
getSymbols(symbols,src="yahoo")
[1] "NKE" "ADDYY" "SKX" "UAA"
NikeLog = periodReturn(NKE, period = "daily", type = "log")
AdidasLog = periodReturn(ADDYY, period = "daily", type = "log")
SkechersLog = periodReturn(SKX, period = "daily", type = "log")
UALog = periodReturn(UAA, period = "daily", type = "log")
M <- cbind(NikeLog,AdidasLog,SkechersLog,UALog)
colnames(M) <- c("NKE","ADDYY","SKX","UAA")
cov(M)
NKE ADDYY SKX UAA
NKE 0.0003049668 0.0001540662 0.0002209870 0.0002739733
ADDYY 0.0001540662 0.0004488069 0.0001768652 0.0001954422
SKX 0.0002209870 0.0001768652 0.0010815882 0.0003759568
UAA 0.0002739733 0.0001954422 0.0003759568 0.0009590296
cor(M, method="pearson")
NKE ADDYY SKX UAA
NKE 1.0000000 0.4164390 0.3847774 0.5066008
ADDYY 0.4164390 1.0000000 0.2538527 0.2979014
SKX 0.3847774 0.2538527 1.0000000 0.3691398
UAA 0.5066008 0.2979014 0.3691398 1.0000000
There are positive covariances between the daily log returns for all four stocks, Nike, Adidas, Skechers, and Under Armour. They all show weak to moderate positive correlation with each other. These are all competitors in the athletic wear market that have been successful recently, so I wouldn’t expect any single company to have a large effect on another.
# Once you have obtained the adjusted daily log returns for your stocks, omitting the time index, you will need to combine them to create a matrix. Below is an example. For more details see the Help command in R on cbind, cov, and cor.
# M <- cbind(A,B,C) # create a matrix where each column is an array/vector of numerical values
# cov(M) # compute the covariance matrix
# cor(M, method="pearson") # compute the correlation matrix based on the Pearson method
##### 1B) Calculate the three types of volatility for a particular stock of your choice. Consider a time window extending one year back from most recent obtainable closing day price. Order the three estimates from low to high volatility and explain how the ordering makes sense.
library(quantmod)
nke = NKE['2017-11/2018-11']; m = length(nke$NKE.Close);
ohlc <-nke[,c("NKE.Open","NKE.High","NKE.Low","NKE.Close")]
vGK <- volatility(ohlc, n = m, calc="garman",N=252)
vClose <- volatility(ohlc, n = m, calc="close",N = 252)
vParkinson <- volatility(ohlc, n = m, calc="parkinson", N = 252)
vGK[m];vParkinson[m];vClose[m]
[,1]
2018-11-30 0.1959917
[,1]
2018-11-30 0.1992922
[,1]
2018-11-30 0.2526894
The Garman-Klass estimator has the lowest volatility, as it uses the most data, and will be less susceptible to jumps in value because it will be able to capture incremental changes. The next is the Parkinson estimator, which uses the difference between the high and low prices of the day. The most volatile is the Close-to-Close estimator.
# For this task make sure you understand well what the variables n,m represent in the book's referenced example.
Task 2: Auto-Correlation and Auto-Regression
Follow the example in the book R Example 3.2/p. 74 and R Example 4.1/p. 115
##### 2A) Calculate the ACF for a stock of your choice. Consider both the log return and squared log return. Interpret your results in terms of possible existence of autocorrelation.
acf(na.omit(NikeLog),main="acf of NKE",ylim=c(-0.2,0.2))

There does not appear to be any meaningful autocorrelations in the log returns for Nike. Lag 10 is slightly above the limit, but not at a value that is statistically significant.
##### 2B) Plot the exchange rate for USD versus another currency of your choice. Interpret your results in terms of behavior.
getFX("JPY/USD") #download JPY/USD rates from oanda.com
[1] "JPYUSD"
plot(JPYUSD)

Within this relatively small scale, there is a lot of volatility in the relation between the Japanese Yen and the US Dollar. Instead of a linear increase or decrease, it exhibits spiky behavior.
##### 2C) Test for the possible existence of an underlying AR(1) – Markov process in your exchange rate currency pair. To this end, plot the ACF and the partial ACF (PACF). Interpret your results. Clearly refer to the lags, and their impacts in determining the order.
getFX("JPY/USD") #download JPY/USD rates from oanda.com
[1] "JPYUSD"
acf(JPYUSD)

pacf(JPYUSD)

The lags of the ACF plot decay exponentially so it appears that there is an underlying AR(1) Markov process.
Task 3: Granger Causality Test
To conduct this test the package lmtest will be required, as already done in the code chunk below.
# Require will load the package only if not installed
# Dependencies = TRUE makes sure that dependencies are install
if(!require("lmtest",quietly = TRUE))
install.packages("lmtest",dependencies = TRUE, repos = "https://cloud.r-project.org")
##### 3A) Include below the code chunk to solve for 3.5.7 R Lab/p. 106. Write your conclusions.
library(lmtest)
#chickens cause eggs
grangertest(egg ~ chicken, order = 3, data = ChickEgg)
Granger causality test
Model 1: egg ~ Lags(egg, 1:3) + Lags(chicken, 1:3)
Model 2: egg ~ Lags(egg, 1:3)
Res.Df Df F Pr(>F)
1 44
2 47 -3 0.5916 0.6238
#eggs cause chickens
grangertest(chicken ~ egg, order = 3, data = ChickEgg)
Granger causality test
Model 1: chicken ~ Lags(chicken, 1:3) + Lags(egg, 1:3)
Model 2: chicken ~ Lags(chicken, 1:3)
Res.Df Df F Pr(>F)
1 44
2 47 -3 5.405 0.002966 **
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
ChickEgg
Time Series:
Start = 1930
End = 1983
Frequency = 1
chicken egg
1930 468491 3581
1931 449743 3532
1932 436815 3327
1933 444523 3255
1934 433937 3156
1935 389958 3081
1936 403446 3166
1937 423921 3443
1938 389624 3424
1939 418591 3561
1940 438288 3640
1941 422841 3840
1942 476935 4456
1943 542047 5000
1944 582197 5366
1945 516497 5154
1946 523227 5130
1947 467217 5077
1948 499644 5032
1949 430876 5148
1950 456549 5404
1951 430988 5322
1952 426555 5323
1953 398156 5307
1954 396776 5402
1955 390708 5407
1956 383690 5500
1957 391363 5442
1958 374281 5442
1959 387002 5542
1960 369484 5339
1961 366082 5358
1962 377392 5403
1963 375575 5345
1964 382262 5435
1965 394118 5474
1966 393019 5540
1967 428746 5836
1968 425158 5777
1969 422096 5629
1970 433280 5704
1971 421763 5806
1972 404191 5742
1973 408769 5502
1974 394101 5461
1975 379754 5382
1976 378361 5377
1977 386518 5408
1978 396933 5608
1979 400585 5777
1980 392110 5825
1981 384838 5625
1982 378609 5800
1983 364584 5656
The results show no significance for chickens causing eggs, but there is a .001 significance level for eggs causing chicken so it would appear that it is proven true.
# More information about the data used in testing for causality can be obtained by typing the name of the data set `ChickEgg` in the R Help menu.
##### 3B) Briefly describe the data in terms of time range and variables. Similar to the linear autoegressive model described in class, write the mathematical regression model solved in each Granger test, including the proper order. Use naming conventions, and notations more reflective of the data set considered for ChickEgg.
From 1930 to 1983, the data shows the number of commercial chickens on December 1 and the annual egg production in millions.
Task 4: Mathematical Proof
##### 4A) Prove the two results in Eq (2.32)/p. 53. No R-coding is needed here. Clearly show your steps. Hint: Use the definition of \(E(X^n)\) for X-log normally distributed. Observe also that \(Var(X) = E(X^2)-E^2(X)\) for any random variable X.
*http://computationalfinance.lsi.upc.edu
LS0tCnRpdGxlOiAiRklOQzYyMSBXaW50ZXIgMjAxOC0xOSBMYWIgV29ya3NoZWV0IDAzIgphdXRob3I6ICJEZWlvbiBGb3N0ZXIiCmRhdGU6ICIxMi81LzIwMTgiCm91dHB1dDoKICBodG1sX25vdGVib29rOiBkZWZhdWx0CiAgaHRtbF9kb2N1bWVudDogZGVmYXVsdApzdWJ0aXRsZTogVmFyaWFuY2UsIENvdmFyaWFuY2UsIENvcnJlbGF0aW9uICYgQ2F1c2FsaXR5IChmaW5jNjIxLWxhYjAzKQotLS0KCiMjIyBBYm91dAoKSW4gdGhpcyB3b3Jrc2hlZXQgd2UgbG9vayBhdCBkaWZmZXJlbnQgdmFyaWFuY2UsIGNvdmFyaWFuY2UsIHZvbGF0aWxpdHksIGFuZCBjYXVzYWxpdHkgY2FsY3VsYXRpb25zLiBXZSBmaW5pc2ggd2l0aCBhIHNob3J0IG1hdGVtYXRpY2FsIHByb29mIChubyBSIHJlcXVpcmVkKS4gIAoKIyMjIFNldHVwCgpSZW1lbWJlciB0byBhbHdheXMgc2V0IHlvdXIgd29ya2luZyBkaXJlY3RvcnkgdG8gdGhlIHNvdXJjZSBmaWxlIGxvY2F0aW9uLiBHbyB0byAnU2Vzc2lvbicsIHNjcm9sbCBkb3duIHRvICdTZXQgV29ya2luZyBEaXJlY3RvcnknLCBhbmQgY2xpY2sgJ1RvIFNvdXJjZSBGaWxlIExvY2F0aW9uJy4gUmVhZCBjYXJlZnVsbHkgdGhlIGJlbG93IGFuZCBmb2xsb3cgdGhlIGluc3RydWN0aW9ucyB0byBjb21wbGV0ZSB0aGUgdGFza3MgYW5kIGFuc3dlciBhbnkgcXVlc3Rpb25zLiAgU3VibWl0IHlvdXIgd29yayB0byBSUHVicyBhcyBkZXRhaWxlZCBpbiBwcmV2aW91cyBub3Rlcy4gCgojIyMgTm90ZQoKRm9yIGNsYXJpdHksIHRhc2tzL3F1ZXN0aW9ucyB0byBiZSBjb21wbGV0ZWQvYW5zd2VyZWQgYXJlIGhpZ2hsaWdodGVkIGluIHJlZCBjb2xvciAoY29sb3IgdmlzaWJsZSBvbmx5IGluIHByZXZpZXcgbW9kZSkgYW5kIG51bWJlcmVkIGFjY29yZGluZyB0byB0aGVpciBwYXJ0aWN1bGFyIHBsYWNlbWVudCBpbiB0aGUgdGFzayBzZWN0aW9uLiAgVHlwZSB5b3VyIGFuc3dlcnMgb3V0c2lkZSB0aGUgcmVkIGNvbG9yIHRhZ3MhCgpRdWl0ZSBvZnRlbiB5b3Ugd2lsbCBuZWVkIHRvIGFkZCB5b3VyIG93biBjb2RlIGNodW5rLiBFeGVjdXRlIHNlcXVlbnRpYWxseSBhbGwgY29kZSBjaHVua3MsIHByZXZpZXcsIHB1Ymxpc2gsIGFuZCBzdWJtaXQgbGluayBvbiBTYWthaSBmb2xsb3dpbmcgdGhlIG5hbWluZyBjb252ZW50aW9uLiBNYWtlIHN1cmUgdG8gYWRkIGNvbW1lbnRzIHRvIHlvdXIgY29kZSB3aGVyZSBhcHByb3ByaWF0ZS4gVXNlIG93biBsYW5ndWFnZSEKCioqQW55IHNpZ24gb2YgcGxhZ2lhcmlzbSwgd2lsbCByZXN1bHQgaW4gZGlzc21pc3NhbCBvZiB3b3JrISoqCgotLS0tLS0tLS0tLS0tLQoKIyMjIFRhc2sgMTogVmFyaWFuY2UsIENvdmFyaWFuY2UsIGFuZCBWb2xhdGlsaXR5CgpUaGlzIHRhc2sgZm9sbG93cyB0aGUgdHdvIGV4YW1wbGVzIGluIHRoZSBib29rIGBSIEV4YW1wbGUgMi41L3AuIDU4YCBhbmQgYFIgRXhhbXBsZSAyLjYvcC4gNjZgIAoKYGBge3J9CiMgUmVxdWlyZSB3aWxsIGxvYWQgdGhlIHBhY2thZ2Ugb25seSBpZiBub3QgaW5zdGFsbGVkIAojIERlcGVuZGVuY2llcyA9IFRSVUUgbWFrZXMgc3VyZSB0aGF0IGRlcGVuZGVuY2llcyBhcmUgaW5zdGFsbAppZighcmVxdWlyZSgicXVhbnRtb2QiLHF1aWV0bHkgPSBUUlVFKSkKICBpbnN0YWxsLnBhY2thZ2VzKCJxdWFudG1vZCIsZGVwZW5kZW5jaWVzID0gVFJVRSwgcmVwb3MgPSAiaHR0cHM6Ly9jbG91ZC5yLXByb2plY3Qub3JnIikKYGBgCgo8c3BhbiBzdHlsZT0iY29sb3I6cmVkIj4KIyMjIyMgMUEpIENhbGN1bGF0ZSB0aGUgY29ycmVsYXRpb24gYW5kIGNvdmFyaWFuY2UgbWF0cml4IG9mIHRoZSBhZGp1c3RlZCBkYWlseSBsb2cgcmV0dXJucyBmb3IgZm91ciBkaWZmZXJlbnQgc3RvY2tzIG9mIHlvdXIgY2hvaWNlLiBFeHBsYWluIHlvdXIgb2JzZXJ2YXRpb25zIGluIHRlcm1zIG9mIHBvdGVudGlhbCByZWxhdGlvbnNoaXBzLgo8L3NwYW4+CmBgYHtyfQpzeW1ib2xzID0gYygnTktFJywnQUREWVknLCdTS1gnLCAnVUFBJykKZ2V0U3ltYm9scyhzeW1ib2xzLHNyYz0ieWFob28iKSAKTmlrZUxvZyA9IHBlcmlvZFJldHVybihOS0UsIHBlcmlvZCA9ICJkYWlseSIsIHR5cGUgPSAibG9nIikKQWRpZGFzTG9nID0gcGVyaW9kUmV0dXJuKEFERFlZLCBwZXJpb2QgPSAiZGFpbHkiLCB0eXBlID0gImxvZyIpClNrZWNoZXJzTG9nID0gcGVyaW9kUmV0dXJuKFNLWCwgcGVyaW9kID0gImRhaWx5IiwgdHlwZSA9ICJsb2ciKQpVQUxvZyA9IHBlcmlvZFJldHVybihVQUEsIHBlcmlvZCA9ICJkYWlseSIsIHR5cGUgPSAibG9nIikKTSA8LSBjYmluZChOaWtlTG9nLEFkaWRhc0xvZyxTa2VjaGVyc0xvZyxVQUxvZykKY29sbmFtZXMoTSkgPC0gYygiTktFIiwiQUREWVkiLCJTS1giLCJVQUEiKQpjb3YoTSkKY29yKE0sIG1ldGhvZD0icGVhcnNvbiIpCmBgYAo8c3BhbiBzdHlsZT0iY29sb3I6Ymx1ZSI+ClRoZXJlIGFyZSBwb3NpdGl2ZSBjb3ZhcmlhbmNlcyBiZXR3ZWVuIHRoZSBkYWlseSBsb2cgcmV0dXJucyBmb3IgYWxsIGZvdXIgc3RvY2tzLCBOaWtlLCBBZGlkYXMsIFNrZWNoZXJzLCBhbmQgVW5kZXIgQXJtb3VyLiBUaGV5IGFsbCBzaG93IHdlYWsgdG8gbW9kZXJhdGUgcG9zaXRpdmUgY29ycmVsYXRpb24gd2l0aCBlYWNoIG90aGVyLiBUaGVzZSBhcmUgYWxsIGNvbXBldGl0b3JzIGluIHRoZSBhdGhsZXRpYyB3ZWFyIG1hcmtldCB0aGF0IGhhdmUgYmVlbiBzdWNjZXNzZnVsIHJlY2VudGx5LCBzbyBJIHdvdWxkbid0IGV4cGVjdCBhbnkgc2luZ2xlIGNvbXBhbnkgdG8gaGF2ZSBhIGxhcmdlIGVmZmVjdCBvbiBhbm90aGVyLgo8L3NwYW4+CmBgYHtyfQojIE9uY2UgeW91IGhhdmUgb2J0YWluZWQgdGhlIGFkanVzdGVkIGRhaWx5IGxvZyByZXR1cm5zIGZvciB5b3VyIHN0b2Nrcywgb21pdHRpbmcgdGhlIHRpbWUgaW5kZXgsIHlvdSB3aWxsIG5lZWQgdG8gY29tYmluZSB0aGVtIHRvIGNyZWF0ZSBhIG1hdHJpeC4gQmVsb3cgaXMgYW4gZXhhbXBsZS4gIEZvciBtb3JlIGRldGFpbHMgc2VlIHRoZSBIZWxwIGNvbW1hbmQgaW4gUiBvbiBjYmluZCwgY292LCBhbmQgY29yLgojIE0gPC0gY2JpbmQoQSxCLEMpICMgY3JlYXRlIGEgbWF0cml4IHdoZXJlIGVhY2ggY29sdW1uIGlzIGFuIGFycmF5L3ZlY3RvciBvZiBudW1lcmljYWwgdmFsdWVzIAojIGNvdihNKSAjIGNvbXB1dGUgdGhlIGNvdmFyaWFuY2UgbWF0cml4CiMgY29yKE0sIG1ldGhvZD0icGVhcnNvbiIpICMgY29tcHV0ZSB0aGUgY29ycmVsYXRpb24gbWF0cml4IGJhc2VkIG9uIHRoZSBQZWFyc29uIG1ldGhvZApgYGAKCjxzcGFuIHN0eWxlPSJjb2xvcjpyZWQiPgojIyMjIyAxQikgQ2FsY3VsYXRlIHRoZSB0aHJlZSB0eXBlcyBvZiB2b2xhdGlsaXR5IGZvciBhIHBhcnRpY3VsYXIgc3RvY2sgb2YgeW91ciBjaG9pY2UuIENvbnNpZGVyIGEgdGltZSB3aW5kb3cgZXh0ZW5kaW5nIG9uZSB5ZWFyIGJhY2sgZnJvbSBtb3N0IHJlY2VudCBvYnRhaW5hYmxlIGNsb3NpbmcgZGF5IHByaWNlLiBPcmRlciB0aGUgdGhyZWUgZXN0aW1hdGVzIGZyb20gbG93IHRvIGhpZ2ggdm9sYXRpbGl0eSBhbmQgZXhwbGFpbiBob3cgdGhlIG9yZGVyaW5nIG1ha2VzIHNlbnNlLgo8L3NwYW4+CgpgYGB7cn0KbGlicmFyeShxdWFudG1vZCkKbmtlID0gTktFWycyMDE3LTExLzIwMTgtMTEnXTsgbSA9IGxlbmd0aChua2UkTktFLkNsb3NlKTsKb2hsYyA8LW5rZVssYygiTktFLk9wZW4iLCJOS0UuSGlnaCIsIk5LRS5Mb3ciLCJOS0UuQ2xvc2UiKV0KdkdLIDwtIHZvbGF0aWxpdHkob2hsYywgbiA9IG0sIGNhbGM9Imdhcm1hbiIsTj0yNTIpCnZDbG9zZSA8LSB2b2xhdGlsaXR5KG9obGMsIG4gPSBtLCBjYWxjPSJjbG9zZSIsTiA9IDI1MikKdlBhcmtpbnNvbiA8LSB2b2xhdGlsaXR5KG9obGMsIG4gPSBtLCBjYWxjPSJwYXJraW5zb24iLCBOID0gMjUyKQp2R0tbbV07dlBhcmtpbnNvblttXTt2Q2xvc2VbbV0KYGBgCjxzcGFuIHN0eWxlPSJjb2xvcjpibHVlIj4KVGhlIEdhcm1hbi1LbGFzcyBlc3RpbWF0b3IgaGFzIHRoZSBsb3dlc3Qgdm9sYXRpbGl0eSwgYXMgaXQgdXNlcyB0aGUgbW9zdCBkYXRhLCBhbmQgd2lsbCBiZSBsZXNzIHN1c2NlcHRpYmxlIHRvIGp1bXBzIGluIHZhbHVlIGJlY2F1c2UgaXQgd2lsbCBiZSBhYmxlIHRvIGNhcHR1cmUgaW5jcmVtZW50YWwgY2hhbmdlcy4gVGhlIG5leHQgaXMgdGhlIFBhcmtpbnNvbiBlc3RpbWF0b3IsIHdoaWNoIHVzZXMgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgaGlnaCBhbmQgbG93IHByaWNlcyBvZiB0aGUgZGF5LiBUaGUgbW9zdCB2b2xhdGlsZSBpcyB0aGUgQ2xvc2UtdG8tQ2xvc2UgZXN0aW1hdG9yLgo8L3NwYW4+CgpgYGB7cn0KIyBGb3IgdGhpcyB0YXNrIG1ha2Ugc3VyZSB5b3UgdW5kZXJzdGFuZCB3ZWxsIHdoYXQgdGhlIHZhcmlhYmxlcyBuLG0gcmVwcmVzZW50IGluIHRoZSBib29rJ3MgcmVmZXJlbmNlZCBleGFtcGxlLgpgYGAKCgojIyMgVGFzayAyOiBBdXRvLUNvcnJlbGF0aW9uIGFuZCBBdXRvLVJlZ3Jlc3Npb24KCkZvbGxvdyB0aGUgZXhhbXBsZSBpbiB0aGUgYm9vayAgYFIgRXhhbXBsZSAzLjIvcC4gNzRgIGFuZCBgUiBFeGFtcGxlIDQuMS9wLiAxMTVgCgo8c3BhbiBzdHlsZT0iY29sb3I6cmVkIj4KIyMjIyMgMkEpIENhbGN1bGF0ZSB0aGUgQUNGIGZvciBhIHN0b2NrIG9mIHlvdXIgY2hvaWNlLiBDb25zaWRlciBib3RoIHRoZSBsb2cgcmV0dXJuIGFuZCBzcXVhcmVkIGxvZyByZXR1cm4uIEludGVycHJldCB5b3VyIHJlc3VsdHMgaW4gdGVybXMgb2YgcG9zc2libGUgZXhpc3RlbmNlIG9mIGF1dG9jb3JyZWxhdGlvbi4gIAo8L3NwYW4+CgpgYGB7cn0KYWNmKG5hLm9taXQoTmlrZUxvZyksbWFpbj0iYWNmIG9mIE5LRSIseWxpbT1jKC0wLjIsMC4yKSkKYGBgCjxzcGFuIHN0eWxlPSJjb2xvcjpibHVlIj4KVGhlcmUgZG9lcyBub3QgYXBwZWFyIHRvIGJlIGFueSBtZWFuaW5nZnVsIGF1dG9jb3JyZWxhdGlvbnMgaW4gdGhlIGxvZyByZXR1cm5zIGZvciBOaWtlLiBMYWcgMTAgaXMgc2xpZ2h0bHkgYWJvdmUgdGhlIGxpbWl0LCBidXQgbm90IGF0IGEgdmFsdWUgdGhhdCBpcyBzdGF0aXN0aWNhbGx5IHNpZ25pZmljYW50Lgo8L3NwYW4+Cgo8c3BhbiBzdHlsZT0iY29sb3I6cmVkIj4KIyMjIyMgMkIpIFBsb3QgdGhlIGV4Y2hhbmdlIHJhdGUgZm9yIFVTRCB2ZXJzdXMgYW5vdGhlciBjdXJyZW5jeSBvZiB5b3VyIGNob2ljZS4gSW50ZXJwcmV0IHlvdXIgcmVzdWx0cyBpbiB0ZXJtcyBvZiBiZWhhdmlvci4KPC9zcGFuPgoKYGBge3J9CmdldEZYKCJKUFkvVVNEIikgI2Rvd25sb2FkIEpQWS9VU0QgcmF0ZXMgZnJvbSBvYW5kYS5jb20KcGxvdChKUFlVU0QpCmBgYAo8c3BhbiBzdHlsZT0iY29sb3I6Ymx1ZSI+CldpdGhpbiB0aGlzIHJlbGF0aXZlbHkgc21hbGwgc2NhbGUsIHRoZXJlIGlzIGEgbG90IG9mIHZvbGF0aWxpdHkgaW4gdGhlIHJlbGF0aW9uIGJldHdlZW4gdGhlIEphcGFuZXNlIFllbiBhbmQgdGhlIFVTIERvbGxhci4gSW5zdGVhZCBvZiBhIGxpbmVhciBpbmNyZWFzZSBvciBkZWNyZWFzZSwgaXQgZXhoaWJpdHMgc3Bpa3kgYmVoYXZpb3IuCjwvc3Bhbj4KICAgICAgCjxzcGFuIHN0eWxlPSJjb2xvcjpyZWQiPgojIyMjIyAyQykgVGVzdCBmb3IgdGhlIHBvc3NpYmxlIGV4aXN0ZW5jZSBvZiBhbiB1bmRlcmx5aW5nIEFSKDEpIOKAkyBNYXJrb3YgcHJvY2VzcyBpbiB5b3VyIGV4Y2hhbmdlIHJhdGUgY3VycmVuY3kgcGFpci4gVG8gdGhpcyBlbmQsIHBsb3QgdGhlIEFDRiBhbmQgdGhlIHBhcnRpYWwgQUNGIChQQUNGKS4gSW50ZXJwcmV0IHlvdXIgcmVzdWx0cy4gIENsZWFybHkgcmVmZXIgdG8gdGhlIGxhZ3MsIGFuZCB0aGVpciBpbXBhY3RzIGluIGRldGVybWluaW5nIHRoZSBvcmRlci4KPC9zcGFuPgoKYGBge3J9CmdldEZYKCJKUFkvVVNEIikgI2Rvd25sb2FkIEpQWS9VU0QgcmF0ZXMgZnJvbSBvYW5kYS5jb20KYWNmKEpQWVVTRCkKcGFjZihKUFlVU0QpCmBgYAoKPHNwYW4gc3R5bGU9ImNvbG9yOmJsdWUiPgpUaGUgbGFncyBvZiB0aGUgQUNGIHBsb3QgZGVjYXkgZXhwb25lbnRpYWxseSBzbyBpdCBhcHBlYXJzIHRoYXQgdGhlcmUgaXMgYW4gdW5kZXJseWluZyBBUigxKSBNYXJrb3YgcHJvY2Vzcy4KPC9zcGFuPgoKIyMjIFRhc2sgMzogR3JhbmdlciBDYXVzYWxpdHkgVGVzdAoKVG8gY29uZHVjdCB0aGlzIHRlc3QgdGhlIHBhY2thZ2UgYGxtdGVzdGAgd2lsbCBiZSByZXF1aXJlZCwgYXMgYWxyZWFkeSBkb25lIGluIHRoZSBjb2RlIGNodW5rIGJlbG93LgoKYGBge3J9CiMgUmVxdWlyZSB3aWxsIGxvYWQgdGhlIHBhY2thZ2Ugb25seSBpZiBub3QgaW5zdGFsbGVkIAojIERlcGVuZGVuY2llcyA9IFRSVUUgbWFrZXMgc3VyZSB0aGF0IGRlcGVuZGVuY2llcyBhcmUgaW5zdGFsbAppZighcmVxdWlyZSgibG10ZXN0IixxdWlldGx5ID0gVFJVRSkpCiAgaW5zdGFsbC5wYWNrYWdlcygibG10ZXN0IixkZXBlbmRlbmNpZXMgPSBUUlVFLCByZXBvcyA9ICJodHRwczovL2Nsb3VkLnItcHJvamVjdC5vcmciKQpgYGAKCjxzcGFuIHN0eWxlPSJjb2xvcjpyZWQiPgojIyMjIyAzQSkgSW5jbHVkZSBiZWxvdyB0aGUgY29kZSBjaHVuayB0byBzb2x2ZSBmb3IgMy41LjcgUiBMYWIvcC4gMTA2LiAgV3JpdGUgeW91ciBjb25jbHVzaW9ucy4KPC9zcGFuPgoKYGBge3J9CmxpYnJhcnkobG10ZXN0KQojY2hpY2tlbnMgY2F1c2UgZWdncwpncmFuZ2VydGVzdChlZ2cgfiBjaGlja2VuLCBvcmRlciA9IDMsIGRhdGEgPSBDaGlja0VnZykKI2VnZ3MgY2F1c2UgY2hpY2tlbnMKZ3JhbmdlcnRlc3QoY2hpY2tlbiB+IGVnZywgb3JkZXIgPSAzLCBkYXRhID0gQ2hpY2tFZ2cpCkNoaWNrRWdnCmBgYAo8c3BhbiBzdHlsZT0iY29sb3I6Ymx1ZSI+ClRoZSByZXN1bHRzIHNob3cgbm8gc2lnbmlmaWNhbmNlIGZvciBjaGlja2VucyBjYXVzaW5nIGVnZ3MsIGJ1dCB0aGVyZSBpcyBhIC4wMDEgc2lnbmlmaWNhbmNlIGxldmVsIGZvciBlZ2dzIGNhdXNpbmcgY2hpY2tlbiBzbyBpdCB3b3VsZCBhcHBlYXIgdGhhdCBpdCBpcyBwcm92ZW4gdHJ1ZS4KPC9zcGFuPgpgYGB7cn0KIyBNb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBkYXRhIHVzZWQgaW4gdGVzdGluZyBmb3IgY2F1c2FsaXR5IGNhbiBiZSBvYnRhaW5lZCBieSB0eXBpbmcgdGhlIG5hbWUgb2YgdGhlIGRhdGEgc2V0IGBDaGlja0VnZ2AgaW4gdGhlIFIgSGVscCBtZW51LgpgYGAKCjxzcGFuIHN0eWxlPSJjb2xvcjpyZWQiPgojIyMjIyAzQikgQnJpZWZseSBkZXNjcmliZSB0aGUgZGF0YSBpbiB0ZXJtcyBvZiB0aW1lIHJhbmdlIGFuZCB2YXJpYWJsZXMuIFNpbWlsYXIgdG8gdGhlIGxpbmVhciBhdXRvZWdyZXNzaXZlIG1vZGVsIGRlc2NyaWJlZCBpbiBjbGFzcywgd3JpdGUgdGhlIG1hdGhlbWF0aWNhbCByZWdyZXNzaW9uIG1vZGVsIHNvbHZlZCBpbiBlYWNoIEdyYW5nZXIgdGVzdCwgaW5jbHVkaW5nIHRoZSBwcm9wZXIgb3JkZXIuIFVzZSBuYW1pbmcgY29udmVudGlvbnMsIGFuZCBub3RhdGlvbnMgbW9yZSByZWZsZWN0aXZlIG9mIHRoZSBkYXRhIHNldCBjb25zaWRlcmVkIGZvciAgYENoaWNrRWdnYC4KPC9zcGFuPgoKPHNwYW4gc3R5bGU9ImNvbG9yOmJsdWUiPgpGcm9tIDE5MzAgdG8gMTk4MywgdGhlIGRhdGEgc2hvd3MgdGhlIG51bWJlciBvZiBjb21tZXJjaWFsIGNoaWNrZW5zIG9uIERlY2VtYmVyIDEgYW5kIHRoZSBhbm51YWwgZWdnIHByb2R1Y3Rpb24gaW4gbWlsbGlvbnMuCjwvc3Bhbj4KCiMjIyBUYXNrIDQ6IE1hdGhlbWF0aWNhbCBQcm9vZgoKPHNwYW4gc3R5bGU9ImNvbG9yOnJlZCI+CiMjIyMjIDRBKSBQcm92ZSB0aGUgdHdvIHJlc3VsdHMgaW4gRXEgKDIuMzIpL3AuIDUzLiAgTm8gUi1jb2RpbmcgaXMgbmVlZGVkIGhlcmUuICBDbGVhcmx5IHNob3cgeW91ciBzdGVwcy4gSGludDogVXNlIHRoZSBkZWZpbml0aW9uIG9mICRFKFhebikkIGZvciBYLWxvZyBub3JtYWxseSBkaXN0cmlidXRlZC4gICBPYnNlcnZlIGFsc28gdGhhdCAkVmFyKFgpID0gRShYXjIpLUVeMihYKSQgZm9yIGFueSByYW5kb20gdmFyaWFibGUgWC4KPC9zcGFuPgoKCgoKCipbaHR0cDovL2NvbXB1dGF0aW9uYWxmaW5hbmNlLmxzaS51cGMuZWR1IF0oaHR0cDovL2NvbXB1dGF0aW9uYWxmaW5hbmNlLmxzaS51cGMuZWR1KQo=