1. Volatility changes over time
What is financial risk?
Financial risk has many faces, and we measure it in many ways, but for now, let’s agree that it is a measure of the possible loss on an investment. In financial markets, where we measure prices frequently, volatility (which is analogous to standard deviation) is an obvious choice to measure risk. But in real markets, volatility changes with the market itself.

In the picture above, we see the returns of four very different assets. All of them exhibit alternating regimes of low and high volatilities. The highest volatility is observed around the end of 2008 - the most severe period of the recent financial crisis.
In this notebook, we will build a model to study the nature of volatility in the case of US government bond yields.
# Load the packages
# .... YOUR CODE FOR TASK 1 ....
library(xts)
library(readr)
# Load the data
yc_raw <- read_csv("FED-SVENY.csv")
# Convert the data into xts format
yc_all <- as.xts(x = yc_raw[, -1], order.by = yc_raw$Date)
# Show only the tail of the 1st, 5th, 10th, 20th and 30th columns
yc_all_tail <- tail(yc_all[, c(1, 5, 10, 20, 30)])# .... YOUR CODE FOR TASK 1 ....
yc_all_tail
2. Plotting the evolution of bond yields
In the output table of the previous task, we see the yields for some maturities.
These data include the whole yield curve. The yield of a bond is the price of the money lent. The higher the yield, the more money you receive on your investment. The yield curve has many maturities; in this case, it ranges from 1 year to 30 years. Different maturities have different yields, but yields of neighboring maturities are relatively close to each other and also move together.
Let’s visualize the yields over time. We will see that the long yields (e.g. SVENY30) tend to be more stable in the long term, while the short yields (e.g. SVENY01) vary a lot. These movements are related to the monetary policy of the FED and economic cycles.
library(viridis)
package 㤼㸱viridis㤼㸲 was built under R version 4.0.3Loading required package: viridisLite
# Define plot arguments
yields <- yc_all
plot.type <- "single"
plot.palette <- viridis(30)
asset.names <- colnames(yc_all)
# Plot the time series
plot.zoo(x = yields, plot.type = plot.type, col = plot.palette)
# Add the legend
legend(x = "topleft", legend = asset.names,
col = plot.palette, cex = 0.45, lwd = 3)

3. Make the difference
In the output of the previous task, we see the level of bond yields for some maturities, but to understand how volatility evolves we have to examine the changes in the time series. Currently, we have yield levels; we need to calculate the changes in the yield levels. This is called “differentiation” in time series analysis. Differentiation has the added benefit of making a time series independent of time.
# Differentiate the time series
ycc_all <- diff.xts(yc_all)
# Show the tail of the 1st, 5th, 10th, 20th and 30th columns
ycc_all_tail <- tail(ycc_all[, c(1, 5, 10, 20, 30)])# .... YOUR CODE FOR TASK 3 ....
ycc_all_tail
SVENY01 SVENY05 SVENY10 SVENY20 SVENY30
2019-03-22 -0.0412 -0.1039 -0.0878 -0.0924 -0.0864
2019-03-25 -0.0321 -0.0332 -0.0104 -0.0051 0.0038
2019-03-26 -0.0090 -0.0265 -0.0200 -0.0102 -0.0078
2019-03-27 -0.0251 -0.0085 -0.0229 -0.0416 -0.0353
2019-03-28 0.0041 0.0206 0.0038 -0.0185 -0.0180
2019-03-29 0.0118 0.0261 0.0085 0.0032 -0.0067
4. The US yields are no exceptions, but maturity matters
Now that we have a time series of the changes in US government yields let’s examine it visually.
By taking a look at the time series from the previous plots, we see hints that the returns following each other have some unique properties:
- The direction (positive or negative) of a return is mostly independent of the previous day’s return. In other words, you don’t know if the next day’s return will be positive or negative just by looking at the time series.
- The magnitude of the return is similar to the previous day’s return. That means, if markets are calm today, we expect the same tomorrow. However, in a volatile market (crisis), you should expect a similarly turbulent tomorrow.
# Define the plot parameters
yield.changes <- ycc_all
plot.type <- "multiple"
# Plot the differentiated time series
plot.zoo(x = yield.changes, plot.type = plot.type,
ylim = c(-0.5, 0.5), cex.axis = 0.7,
ylab = 1:30, col = plot.palette)

5. Let’s dive into some statistics
The statistical properties visualized earlier can be measured by analytical tools. The simplest method is to test for autocorrelation. Autocorrelation measures how a datapoint’s past determines the future of a time series.
If the autocorrelation is close to 1, the next day’s value will be very close to today’s value. If the autocorrelation is close to 0, the next day’s value will be unaffected by today’s value. Because we are interested in the recent evolution of bond yields, we will filter the time series for data from 2000 onward.
# Filter for changes in and after 2000
ycc <- ycc_all["2000/"]
# Save the 1-year and 20-year maturity yield changes into separate variables
x_1 <- ycc[,"SVENY01"]
x_20 <- ycc[,"SVENY20"]
# Plot the autocorrelations of the yield changes
par(mfrow=c(2,2))
acf_1 <- acf(x_1)
acf_20 <- acf(x_20)
# Plot the autocorrelations of the absolute changes of yields
acf_abs_1 <- acf(abs(x_1))
acf_abs_20 <- acf(abs(x_20))

6. GARCH in action
A Generalized AutoRegressive Conditional Heteroskedasticity (GARCH) model is the most well known econometric tool to handle changing volatility in financial time series data. It assumes a hidden volatility variable that has a long-run average it tries to return to while the short-run behavior is affected by the past returns.
The most popular form of the GARCH model assumes that the volatility follows this process:
\(σ^2_t = ω + α ⋅ ε^2_{t-1} + β ⋅ σ^2_{t-1}\)
where σ is the current volatility, σt-1 the last day’s volatility and εt-1 is the last day’s return. The estimated parameters are ω, α, and β. For GARCH modeling we will use rugarch package developed by Alexios Ghalanos.
library(rugarch)
package 㤼㸱rugarch㤼㸲 was built under R version 4.0.3Loading required package: parallel
Attaching package: 㤼㸱rugarch㤼㸲
The following object is masked from 㤼㸱package:stats㤼㸲:
sigma
# Specify the GARCH model with the skewed t-distribution
spec <- ugarchspec(distribution.model = "sstd")
# Fit the model
fit_1 <- ugarchfit(x_1, spec = spec)
# Save the volatilities and the rescaled residuals
vol_1 <- sigma(fit_1)
res_1 <- scale(residuals(fit_1, standardize = TRUE)) * sd(x_1) + mean(x_1)
# Plot the yield changes with the estimated volatilities and residuals
merge_1 <- merge.xts(x_1, vol_1, res_1)
plot.zoo(merge_1)

7. Fitting the 20-year maturity
Let’s do the same for the 20-year maturity. As we can see in the plot from Task 6, the bond yields of various maturities show similar but slightly different characteristics. These different characteristics can be the result of multiple factors such as the monetary policy of the FED or the fact that the investors might be different.
Are there differences between the 1-year maturity and 20-year maturity plots?
# Fit the model
fit_20 <- ugarchfit(x_20, spec = spec)
# Save the volatilities and the rescaled residuals
vol_20 <- sigma(fit_20)
res_20 <- scale(residuals(fit_20, standardize = TRUE)) * sd(x_20) + mean(x_20)
# Plot the yield changes with the estimated volatilities and residuals
merge_20 <- merge.xts(x_20, vol_20, res_20)
plot.zoo(merge_20)

8. What about the distributions? (Part 1)
From the plots in Task 6 and Task 7, we can see that the 1-year GARCH model shows a similar but more erratic behavior compared to the 20-year GARCH model. Not only does the 1-year model have greater volatility, but the volatility of its volatility is larger than the 20-year model. That brings us to two statistical facts of financial markets not mentioned yet.
The unconditional (before GARCH) distribution of the yield differences has heavier tails than the normal distribution. The distribution of the yield differences adjusted by the GARCH model has lighter tails than the unconditional distribution, but they are still heavier than the normal distribution. Let’s find out what the fitted GARCH model did with the distribution we examined.
# Calculate the kernel density for the 1-year maturity and residuals
density_x_1 <- density(x_1)
density_res_1 <- density(res_1)
# Plot the density diagram for the 1-year maturity and residuals
plot(density_x_1)
lines(density_res_1, col = "red")
# Add the normal distribution to the plot
norm_dist <- dnorm(seq(-0.4, 0.4, by = .01), mean = mean(x_1), sd = sd(x_1))
lines(seq(-0.4, 0.4, by = .01),
norm_dist,
col = "darkgreen"
)
# Add legend
legend <- c("Before GARCH", "After GARCH", "Normal distribution")
legend("topleft", legend = legend,
col = c("black", "red", "darkgreen"), lty=c(1,1))

- What about the distributions? (Part 2) In the previous plot, we see that the two distributions from the GARCH models are different from the normal distribution of the data, but the tails, where the differences are the most profound, are hard to see. Using a Q-Q plot will help us focus in on the tails.
You can read an excellent summary of Q-Q plots here.
# Define the data to plot: the 1-year maturity yield changes and residuals
data_orig <- x_1
data_res <- res_1
# Define the benchmark distribution
distribution <- qnorm
# Make the Q-Q plot of original data with the line of normal distribution
qqnorm(data_orig, ylim = c(-0.5, 0.5))
qqline(data_orig, distribution = distribution, col = "darkgreen")
# Make the Q-Q plot of GARCH residuals with the line of normal distribution
par(new=TRUE)
qqnorm(data_res * 0.614256270265139, col = "red", ylim = c(-0.5, 0.5))
qqline(data_res * 0.614256270265139, distribution = distribution, col = "darkgreen")
legend("topleft", c("Before GARCH", "After GARCH"), col = c("black", "red"), pch=c(1,1))

- A final quiz
In this project, we fitted a GARCH model to develop a better understanding of how bond volatility evolves and how it affects the probability distribution. In the final task, we will evaluate our model. Did the model succeed, or did it fail?
# Q1: Did GARCH revealed how volatility changed over time? # Yes or No?
(Q1 <- "Yes")
[1] "Yes"
# Q2: Did GARCH bring the residuals closer to normal distribution? Yes or No?
(Q2 <- "Yes")
[1] "Yes"
# Q3: Which time series of yield changes deviates more
# from a normally distributed white noise process? Choose 1 or 20.
(Q3 <- 1)
[1] 1
LS0tDQp0aXRsZTogIk1vZGVsaW5nIHRoZSBWb2xhdGlsaXR5IG9mIFVTIEJvbmQgWWllbGRzIg0Kb3V0cHV0OiBodG1sX25vdGVib29rDQotLS0NCiMgMS4gVm9sYXRpbGl0eSBjaGFuZ2VzIG92ZXIgdGltZQ0KDQpXaGF0IGlzIGZpbmFuY2lhbCByaXNrPw0KDQpGaW5hbmNpYWwgcmlzayBoYXMgbWFueSBmYWNlcywgYW5kIHdlIG1lYXN1cmUgaXQgaW4gbWFueSB3YXlzLCBidXQgZm9yIG5vdywgbGV0J3MgYWdyZWUgdGhhdCBpdCBpcyBhIG1lYXN1cmUgb2YgdGhlIHBvc3NpYmxlIGxvc3Mgb24gYW4gaW52ZXN0bWVudC4gSW4gZmluYW5jaWFsIG1hcmtldHMsIHdoZXJlIHdlIG1lYXN1cmUgcHJpY2VzIGZyZXF1ZW50bHksIHZvbGF0aWxpdHkgKHdoaWNoIGlzIGFuYWxvZ291cyB0byBzdGFuZGFyZCBkZXZpYXRpb24pIGlzIGFuIG9idmlvdXMgY2hvaWNlIHRvIG1lYXN1cmUgcmlzay4gQnV0IGluIHJlYWwgbWFya2V0cywgdm9sYXRpbGl0eSBjaGFuZ2VzIHdpdGggdGhlIG1hcmtldCBpdHNlbGYuDQoNCiFbXShWb2xhQ2x1c3RlcmluZ0Fzc2V0Q2xhc3Nlcy5wbmcpDQoNCkluIHRoZSBwaWN0dXJlIGFib3ZlLCB3ZSBzZWUgdGhlIHJldHVybnMgb2YgZm91ciB2ZXJ5IGRpZmZlcmVudCBhc3NldHMuIEFsbCBvZiB0aGVtIGV4aGliaXQgYWx0ZXJuYXRpbmcgcmVnaW1lcyBvZiBsb3cgYW5kIGhpZ2ggdm9sYXRpbGl0aWVzLiBUaGUgaGlnaGVzdCB2b2xhdGlsaXR5IGlzIG9ic2VydmVkIGFyb3VuZCB0aGUgZW5kIG9mIDIwMDggLSB0aGUgbW9zdCBzZXZlcmUgcGVyaW9kIG9mIHRoZSByZWNlbnQgZmluYW5jaWFsIGNyaXNpcy4NCg0KSW4gdGhpcyBub3RlYm9vaywgd2Ugd2lsbCBidWlsZCBhIG1vZGVsIHRvIHN0dWR5IHRoZSBuYXR1cmUgb2Ygdm9sYXRpbGl0eSBpbiB0aGUgY2FzZSBvZiBVUyBnb3Zlcm5tZW50IGJvbmQgeWllbGRzLg0KYGBge3J9DQojIExvYWQgdGhlIHBhY2thZ2VzDQojIC4uLi4gWU9VUiBDT0RFIEZPUiBUQVNLIDEgLi4uLg0KbGlicmFyeSh4dHMpDQpsaWJyYXJ5KHJlYWRyKQ0KIyBMb2FkIHRoZSBkYXRhDQp5Y19yYXcgPC0gcmVhZF9jc3YoIkZFRC1TVkVOWS5jc3YiKQ0KDQojIENvbnZlcnQgdGhlIGRhdGEgaW50byB4dHMgZm9ybWF0DQp5Y19hbGwgPC0gYXMueHRzKHggPSB5Y19yYXdbLCAtMV0sIG9yZGVyLmJ5ID0geWNfcmF3JERhdGUpDQoNCiMgU2hvdyBvbmx5IHRoZSB0YWlsIG9mIHRoZSAxc3QsIDV0aCwgMTB0aCwgMjB0aCBhbmQgMzB0aCBjb2x1bW5zDQp5Y19hbGxfdGFpbCA8LSB0YWlsKHljX2FsbFssIGMoMSwgNSwgMTAsIDIwLCAzMCldKSMgLi4uLiBZT1VSIENPREUgRk9SIFRBU0sgMSAuLi4uDQp5Y19hbGxfdGFpbA0KYGBgDQojIDIuIFBsb3R0aW5nIHRoZSBldm9sdXRpb24gb2YgYm9uZCB5aWVsZHMNCg0KSW4gdGhlIG91dHB1dCB0YWJsZSBvZiB0aGUgcHJldmlvdXMgdGFzaywgd2Ugc2VlIHRoZSB5aWVsZHMgZm9yIHNvbWUgbWF0dXJpdGllcy4NCg0KVGhlc2UgZGF0YSBpbmNsdWRlIHRoZSB3aG9sZSB5aWVsZCBjdXJ2ZS4gVGhlIHlpZWxkIG9mIGEgYm9uZCBpcyB0aGUgcHJpY2Ugb2YgdGhlIG1vbmV5IGxlbnQuIFRoZSBoaWdoZXIgdGhlIHlpZWxkLCB0aGUgbW9yZSBtb25leSB5b3UgcmVjZWl2ZSBvbiB5b3VyIGludmVzdG1lbnQuIFRoZSB5aWVsZCBjdXJ2ZSBoYXMgbWFueSBtYXR1cml0aWVzOyBpbiB0aGlzIGNhc2UsIGl0IHJhbmdlcyBmcm9tIDEgeWVhciB0byAzMCB5ZWFycy4gRGlmZmVyZW50IG1hdHVyaXRpZXMgaGF2ZSBkaWZmZXJlbnQgeWllbGRzLCBidXQgeWllbGRzIG9mIG5laWdoYm9yaW5nIG1hdHVyaXRpZXMgYXJlIHJlbGF0aXZlbHkgY2xvc2UgdG8gZWFjaCBvdGhlciBhbmQgYWxzbyBtb3ZlIHRvZ2V0aGVyLg0KDQpMZXQncyB2aXN1YWxpemUgdGhlIHlpZWxkcyBvdmVyIHRpbWUuIFdlIHdpbGwgc2VlIHRoYXQgdGhlIGxvbmcgeWllbGRzIChlLmcuIFNWRU5ZMzApIHRlbmQgdG8gYmUgbW9yZSBzdGFibGUgaW4gdGhlIGxvbmcgdGVybSwgd2hpbGUgdGhlIHNob3J0IHlpZWxkcyAoZS5nLiBTVkVOWTAxKSB2YXJ5IGEgbG90LiBUaGVzZSBtb3ZlbWVudHMgYXJlIHJlbGF0ZWQgdG8gdGhlIG1vbmV0YXJ5IHBvbGljeSBvZiB0aGUgRkVEIGFuZCBlY29ub21pYyBjeWNsZXMuDQpgYGB7cn0NCmxpYnJhcnkodmlyaWRpcykNCg0KIyBEZWZpbmUgcGxvdCBhcmd1bWVudHMNCnlpZWxkcyAgPC0geWNfYWxsDQpwbG90LnR5cGUgIDwtICJzaW5nbGUiDQpwbG90LnBhbGV0dGUgPC0gdmlyaWRpcygzMCkNCmFzc2V0Lm5hbWVzICA8LSBjb2xuYW1lcyh5Y19hbGwpDQoNCiMgUGxvdCB0aGUgdGltZSBzZXJpZXMNCnBsb3Quem9vKHggPSB5aWVsZHMsIHBsb3QudHlwZSA9IHBsb3QudHlwZSwgY29sID0gcGxvdC5wYWxldHRlKQ0KDQojIEFkZCB0aGUgbGVnZW5kDQpsZWdlbmQoeCA9ICJ0b3BsZWZ0IiwgbGVnZW5kID0gYXNzZXQubmFtZXMsDQogICAgICAgY29sID0gcGxvdC5wYWxldHRlLCBjZXggPSAwLjQ1LCBsd2QgPSAzKQ0KYGBgDQojIDMuIE1ha2UgdGhlIGRpZmZlcmVuY2UNCg0KSW4gdGhlIG91dHB1dCBvZiB0aGUgcHJldmlvdXMgdGFzaywgd2Ugc2VlIHRoZSBsZXZlbCBvZiBib25kIHlpZWxkcyBmb3Igc29tZSBtYXR1cml0aWVzLCBidXQgdG8gdW5kZXJzdGFuZCBob3cgdm9sYXRpbGl0eSBldm9sdmVzIHdlIGhhdmUgdG8gZXhhbWluZSB0aGUgY2hhbmdlcyBpbiB0aGUgdGltZSBzZXJpZXMuIEN1cnJlbnRseSwgd2UgaGF2ZSB5aWVsZCBsZXZlbHM7IHdlIG5lZWQgdG8gY2FsY3VsYXRlIHRoZSBjaGFuZ2VzIGluIHRoZSB5aWVsZCBsZXZlbHMuIFRoaXMgaXMgY2FsbGVkICJkaWZmZXJlbnRpYXRpb24iIGluIHRpbWUgc2VyaWVzIGFuYWx5c2lzLiBEaWZmZXJlbnRpYXRpb24gaGFzIHRoZSBhZGRlZCBiZW5lZml0IG9mIG1ha2luZyBhIHRpbWUgc2VyaWVzIGluZGVwZW5kZW50IG9mIHRpbWUuDQpgYGB7cn0NCiMgRGlmZmVyZW50aWF0ZSB0aGUgdGltZSBzZXJpZXMgIA0KeWNjX2FsbCA8LSBkaWZmLnh0cyh5Y19hbGwpDQoNCiMgU2hvdyB0aGUgdGFpbCBvZiB0aGUgMXN0LCA1dGgsIDEwdGgsIDIwdGggYW5kIDMwdGggY29sdW1ucw0KeWNjX2FsbF90YWlsIDwtIHRhaWwoeWNjX2FsbFssIGMoMSwgNSwgMTAsIDIwLCAzMCldKSMgLi4uLiBZT1VSIENPREUgRk9SIFRBU0sgMyAuLi4uDQp5Y2NfYWxsX3RhaWwNCmBgYA0KIyA0LiBUaGUgVVMgeWllbGRzIGFyZSBubyBleGNlcHRpb25zLCBidXQgbWF0dXJpdHkgbWF0dGVycw0KDQpOb3cgdGhhdCB3ZSBoYXZlIGEgdGltZSBzZXJpZXMgb2YgdGhlIGNoYW5nZXMgaW4gVVMgZ292ZXJubWVudCB5aWVsZHMgbGV0J3MgZXhhbWluZSBpdCB2aXN1YWxseS4NCg0KQnkgdGFraW5nIGEgbG9vayBhdCB0aGUgdGltZSBzZXJpZXMgZnJvbSB0aGUgcHJldmlvdXMgcGxvdHMsIHdlIHNlZSBoaW50cyB0aGF0IHRoZSByZXR1cm5zIGZvbGxvd2luZyBlYWNoIG90aGVyIGhhdmUgc29tZSB1bmlxdWUgcHJvcGVydGllczoNCg0KLSBUaGUgZGlyZWN0aW9uIChwb3NpdGl2ZSBvciBuZWdhdGl2ZSkgb2YgYSByZXR1cm4gaXMgbW9zdGx5IGluZGVwZW5kZW50IG9mIHRoZSBwcmV2aW91cyBkYXkncyByZXR1cm4uIEluIG90aGVyIHdvcmRzLCB5b3UgZG9uJ3Qga25vdyBpZiB0aGUgbmV4dCBkYXkncyByZXR1cm4gd2lsbCBiZSBwb3NpdGl2ZSBvciBuZWdhdGl2ZSBqdXN0IGJ5IGxvb2tpbmcgYXQgdGhlIHRpbWUgc2VyaWVzLg0KLSBUaGUgbWFnbml0dWRlIG9mIHRoZSByZXR1cm4gaXMgc2ltaWxhciB0byB0aGUgcHJldmlvdXMgZGF5J3MgcmV0dXJuLiBUaGF0IG1lYW5zLCBpZiBtYXJrZXRzIGFyZSBjYWxtIHRvZGF5LCB3ZSBleHBlY3QgdGhlIHNhbWUgdG9tb3Jyb3cuIEhvd2V2ZXIsIGluIGEgdm9sYXRpbGUgbWFya2V0IChjcmlzaXMpLCB5b3Ugc2hvdWxkIGV4cGVjdCBhIHNpbWlsYXJseSB0dXJidWxlbnQgdG9tb3Jyb3cuDQpgYGB7cn0NCiMgRGVmaW5lIHRoZSBwbG90IHBhcmFtZXRlcnMNCnlpZWxkLmNoYW5nZXMgPC0geWNjX2FsbA0KcGxvdC50eXBlIDwtICJtdWx0aXBsZSINCg0KDQojIFBsb3QgdGhlIGRpZmZlcmVudGlhdGVkIHRpbWUgc2VyaWVzDQpwbG90Lnpvbyh4ID0geWllbGQuY2hhbmdlcywgcGxvdC50eXBlID0gcGxvdC50eXBlLCANCiAgICAgeWxpbSA9IGMoLTAuNSwgMC41KSwgY2V4LmF4aXMgPSAwLjcsIA0KICAgICB5bGFiID0gMTozMCwgY29sID0gcGxvdC5wYWxldHRlKQ0KYGBgDQojIDUuIExldCdzIGRpdmUgaW50byBzb21lIHN0YXRpc3RpY3MNCg0KVGhlIHN0YXRpc3RpY2FsIHByb3BlcnRpZXMgdmlzdWFsaXplZCBlYXJsaWVyIGNhbiBiZSBtZWFzdXJlZCBieSBhbmFseXRpY2FsIHRvb2xzLiBUaGUgc2ltcGxlc3QgbWV0aG9kIGlzIHRvIHRlc3QgZm9yIGF1dG9jb3JyZWxhdGlvbi4gQXV0b2NvcnJlbGF0aW9uIG1lYXN1cmVzIGhvdyBhIGRhdGFwb2ludCdzIHBhc3QgZGV0ZXJtaW5lcyB0aGUgZnV0dXJlIG9mIGEgdGltZSBzZXJpZXMuDQoNCklmIHRoZSBhdXRvY29ycmVsYXRpb24gaXMgY2xvc2UgdG8gMSwgdGhlIG5leHQgZGF5J3MgdmFsdWUgd2lsbCBiZSB2ZXJ5IGNsb3NlIHRvIHRvZGF5J3MgdmFsdWUuDQpJZiB0aGUgYXV0b2NvcnJlbGF0aW9uIGlzIGNsb3NlIHRvIDAsIHRoZSBuZXh0IGRheSdzIHZhbHVlIHdpbGwgYmUgdW5hZmZlY3RlZCBieSB0b2RheSdzIHZhbHVlLg0KQmVjYXVzZSB3ZSBhcmUgaW50ZXJlc3RlZCBpbiB0aGUgcmVjZW50IGV2b2x1dGlvbiBvZiBib25kIHlpZWxkcywgd2Ugd2lsbCBmaWx0ZXIgdGhlIHRpbWUgc2VyaWVzIGZvciBkYXRhIGZyb20gMjAwMCBvbndhcmQuDQpgYGB7cn0NCiMgRmlsdGVyIGZvciBjaGFuZ2VzIGluIGFuZCBhZnRlciAyMDAwDQp5Y2MgPC0geWNjX2FsbFsiMjAwMC8iXQ0KDQojIFNhdmUgdGhlIDEteWVhciBhbmQgMjAteWVhciBtYXR1cml0eSB5aWVsZCBjaGFuZ2VzIGludG8gc2VwYXJhdGUgdmFyaWFibGVzDQp4XzEgPC0geWNjWywiU1ZFTlkwMSJdDQp4XzIwIDwtIHljY1ssIlNWRU5ZMjAiXQ0KDQojIFBsb3QgdGhlIGF1dG9jb3JyZWxhdGlvbnMgb2YgdGhlIHlpZWxkIGNoYW5nZXMNCnBhcihtZnJvdz1jKDIsMikpDQphY2ZfMSA8LSBhY2YoeF8xKQ0KYWNmXzIwIDwtIGFjZih4XzIwKQ0KDQojIFBsb3QgdGhlIGF1dG9jb3JyZWxhdGlvbnMgb2YgdGhlIGFic29sdXRlIGNoYW5nZXMgb2YgeWllbGRzDQphY2ZfYWJzXzEgPC0gYWNmKGFicyh4XzEpKQ0KYWNmX2Fic18yMCA8LSBhY2YoYWJzKHhfMjApKQ0KYGBgDQojIDYuIEdBUkNIIGluIGFjdGlvbg0KQSBHZW5lcmFsaXplZCBBdXRvUmVncmVzc2l2ZSBDb25kaXRpb25hbCBIZXRlcm9za2VkYXN0aWNpdHkgKFtHQVJDSF0oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvQXV0b3JlZ3Jlc3NpdmVfY29uZGl0aW9uYWxfaGV0ZXJvc2tlZGFzdGljaXR5KSkgbW9kZWwgaXMgdGhlIG1vc3Qgd2VsbCBrbm93biBlY29ub21ldHJpYyB0b29sIHRvIGhhbmRsZSBjaGFuZ2luZyB2b2xhdGlsaXR5IGluIGZpbmFuY2lhbCB0aW1lIHNlcmllcyBkYXRhLiBJdCBhc3N1bWVzIGEgaGlkZGVuIHZvbGF0aWxpdHkgdmFyaWFibGUgdGhhdCBoYXMgYSBsb25nLXJ1biBhdmVyYWdlIGl0IHRyaWVzIHRvIHJldHVybiB0byB3aGlsZSB0aGUgc2hvcnQtcnVuIGJlaGF2aW9yIGlzIGFmZmVjdGVkIGJ5IHRoZSBwYXN0IHJldHVybnMuDQoNClRoZSBtb3N0IHBvcHVsYXIgZm9ybSBvZiB0aGUgR0FSQ0ggbW9kZWwgYXNzdW1lcyB0aGF0IHRoZSB2b2xhdGlsaXR5IGZvbGxvd3MgdGhpcyBwcm9jZXNzOg0KDQokz4NeMl90ID0gz4kgKyDOsSDii4UgzrVeMl97dC0xfSArIM6yIOKLhSDPg14yX3t0LTF9JA0KDQp3aGVyZSDPgyBpcyB0aGUgY3VycmVudCB2b2xhdGlsaXR5LCDPg3QtMSB0aGUgbGFzdCBkYXkncyB2b2xhdGlsaXR5IGFuZCDOtXQtMSBpcyB0aGUgbGFzdCBkYXkncyByZXR1cm4uIFRoZSBlc3RpbWF0ZWQgcGFyYW1ldGVycyBhcmUgz4ksIM6xLCBhbmQgzrIuDQpGb3IgR0FSQ0ggbW9kZWxpbmcgd2Ugd2lsbCB1c2UgcnVnYXJjaCBwYWNrYWdlIGRldmVsb3BlZCBieSBBbGV4aW9zIEdoYWxhbm9zLg0KYGBge3J9DQpsaWJyYXJ5KHJ1Z2FyY2gpDQoNCiMgU3BlY2lmeSB0aGUgR0FSQ0ggbW9kZWwgd2l0aCB0aGUgc2tld2VkIHQtZGlzdHJpYnV0aW9uDQpzcGVjIDwtIHVnYXJjaHNwZWMoZGlzdHJpYnV0aW9uLm1vZGVsID0gInNzdGQiKQ0KDQojIEZpdCB0aGUgbW9kZWwNCmZpdF8xIDwtIHVnYXJjaGZpdCh4XzEsIHNwZWMgPSBzcGVjKQ0KDQojIFNhdmUgdGhlIHZvbGF0aWxpdGllcyBhbmQgdGhlIHJlc2NhbGVkIHJlc2lkdWFscw0Kdm9sXzEgPC0gc2lnbWEoZml0XzEpDQpyZXNfMSA8LSBzY2FsZShyZXNpZHVhbHMoZml0XzEsIHN0YW5kYXJkaXplID0gVFJVRSkpICogc2QoeF8xKSArIG1lYW4oeF8xKQ0KDQojIFBsb3QgdGhlIHlpZWxkIGNoYW5nZXMgd2l0aCB0aGUgZXN0aW1hdGVkIHZvbGF0aWxpdGllcyBhbmQgcmVzaWR1YWxzDQptZXJnZV8xIDwtIG1lcmdlLnh0cyh4XzEsIHZvbF8xLCByZXNfMSkNCnBsb3Quem9vKG1lcmdlXzEpDQpgYGANCiMgNy4gRml0dGluZyB0aGUgMjAteWVhciBtYXR1cml0eQ0KDQpMZXQncyBkbyB0aGUgc2FtZSBmb3IgdGhlIDIwLXllYXIgbWF0dXJpdHkuIEFzIHdlIGNhbiBzZWUgaW4gdGhlIHBsb3QgZnJvbSBUYXNrIDYsIHRoZSBib25kIHlpZWxkcyBvZiB2YXJpb3VzIG1hdHVyaXRpZXMgc2hvdyBzaW1pbGFyIGJ1dCBzbGlnaHRseSBkaWZmZXJlbnQgY2hhcmFjdGVyaXN0aWNzLiBUaGVzZSBkaWZmZXJlbnQgY2hhcmFjdGVyaXN0aWNzIGNhbiBiZSB0aGUgcmVzdWx0IG9mIG11bHRpcGxlIGZhY3RvcnMgc3VjaCBhcyB0aGUgbW9uZXRhcnkgcG9saWN5IG9mIHRoZSBGRUQgb3IgdGhlIGZhY3QgdGhhdCB0aGUgaW52ZXN0b3JzIG1pZ2h0IGJlIGRpZmZlcmVudC4NCg0KQXJlIHRoZXJlIGRpZmZlcmVuY2VzIGJldHdlZW4gdGhlIDEteWVhciBtYXR1cml0eSBhbmQgMjAteWVhciBtYXR1cml0eSBwbG90cz8NCmBgYHtyfQ0KIyBGaXQgdGhlIG1vZGVsDQpmaXRfMjAgPC0gdWdhcmNoZml0KHhfMjAsIHNwZWMgPSBzcGVjKQ0KDQojIFNhdmUgdGhlIHZvbGF0aWxpdGllcyBhbmQgdGhlIHJlc2NhbGVkIHJlc2lkdWFscw0Kdm9sXzIwIDwtIHNpZ21hKGZpdF8yMCkNCnJlc18yMCA8LSBzY2FsZShyZXNpZHVhbHMoZml0XzIwLCBzdGFuZGFyZGl6ZSA9IFRSVUUpKSAqIHNkKHhfMjApICsgbWVhbih4XzIwKQ0KDQojIFBsb3QgdGhlIHlpZWxkIGNoYW5nZXMgd2l0aCB0aGUgZXN0aW1hdGVkIHZvbGF0aWxpdGllcyBhbmQgcmVzaWR1YWxzDQptZXJnZV8yMCA8LSBtZXJnZS54dHMoeF8yMCwgdm9sXzIwLCByZXNfMjApDQpwbG90LnpvbyhtZXJnZV8yMCkNCmBgYA0KIyA4LiBXaGF0IGFib3V0IHRoZSBkaXN0cmlidXRpb25zPyAoUGFydCAxKQ0KDQpGcm9tIHRoZSBwbG90cyBpbiBUYXNrIDYgYW5kIFRhc2sgNywgd2UgY2FuIHNlZSB0aGF0IHRoZSAxLXllYXIgR0FSQ0ggbW9kZWwgc2hvd3MgYSBzaW1pbGFyIGJ1dCBtb3JlIGVycmF0aWMgYmVoYXZpb3IgY29tcGFyZWQgdG8gdGhlIDIwLXllYXIgR0FSQ0ggbW9kZWwuIE5vdCBvbmx5IGRvZXMgdGhlIDEteWVhciBtb2RlbCBoYXZlIGdyZWF0ZXIgdm9sYXRpbGl0eSwgYnV0IHRoZSB2b2xhdGlsaXR5IG9mIGl0cyB2b2xhdGlsaXR5IGlzIGxhcmdlciB0aGFuIHRoZSAyMC15ZWFyIG1vZGVsLiBUaGF0IGJyaW5ncyB1cyB0byB0d28gc3RhdGlzdGljYWwgZmFjdHMgb2YgZmluYW5jaWFsIG1hcmtldHMgbm90IG1lbnRpb25lZCB5ZXQuDQoNClRoZSB1bmNvbmRpdGlvbmFsIChiZWZvcmUgR0FSQ0gpIGRpc3RyaWJ1dGlvbiBvZiB0aGUgeWllbGQgZGlmZmVyZW5jZXMgaGFzIGhlYXZpZXIgdGFpbHMgdGhhbiB0aGUgbm9ybWFsIGRpc3RyaWJ1dGlvbi4NClRoZSBkaXN0cmlidXRpb24gb2YgdGhlIHlpZWxkIGRpZmZlcmVuY2VzIGFkanVzdGVkIGJ5IHRoZSBHQVJDSCBtb2RlbCBoYXMgbGlnaHRlciB0YWlscyB0aGFuIHRoZSB1bmNvbmRpdGlvbmFsIGRpc3RyaWJ1dGlvbiwgYnV0IHRoZXkgYXJlIHN0aWxsIGhlYXZpZXIgdGhhbiB0aGUgbm9ybWFsIGRpc3RyaWJ1dGlvbi4NCkxldCdzIGZpbmQgb3V0IHdoYXQgdGhlIGZpdHRlZCBHQVJDSCBtb2RlbCBkaWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uIHdlIGV4YW1pbmVkLg0KYGBge3J9DQojIENhbGN1bGF0ZSB0aGUga2VybmVsIGRlbnNpdHkgZm9yIHRoZSAxLXllYXIgbWF0dXJpdHkgYW5kIHJlc2lkdWFscw0KZGVuc2l0eV94XzEgPC0gZGVuc2l0eSh4XzEpDQpkZW5zaXR5X3Jlc18xIDwtIGRlbnNpdHkocmVzXzEpDQoNCiMgUGxvdCB0aGUgZGVuc2l0eSBkaWFncmFtIGZvciB0aGUgMS15ZWFyIG1hdHVyaXR5IGFuZCByZXNpZHVhbHMNCnBsb3QoZGVuc2l0eV94XzEpDQpsaW5lcyhkZW5zaXR5X3Jlc18xLCBjb2wgPSAicmVkIikNCg0KIyBBZGQgdGhlIG5vcm1hbCBkaXN0cmlidXRpb24gdG8gdGhlIHBsb3QNCm5vcm1fZGlzdCA8LSBkbm9ybShzZXEoLTAuNCwgMC40LCBieSA9IC4wMSksIG1lYW4gPSBtZWFuKHhfMSksIHNkID0gc2QoeF8xKSkNCmxpbmVzKHNlcSgtMC40LCAwLjQsIGJ5ID0gLjAxKSwgDQogICAgICBub3JtX2Rpc3QsIA0KICAgICAgY29sID0gImRhcmtncmVlbiINCiAgICAgKQ0KDQojIEFkZCBsZWdlbmQNCmxlZ2VuZCA8LSBjKCJCZWZvcmUgR0FSQ0giLCAiQWZ0ZXIgR0FSQ0giLCAiTm9ybWFsIGRpc3RyaWJ1dGlvbiIpDQpsZWdlbmQoInRvcGxlZnQiLCBsZWdlbmQgPSBsZWdlbmQsIA0KICAgICAgIGNvbCA9IGMoImJsYWNrIiwgInJlZCIsICJkYXJrZ3JlZW4iKSwgbHR5PWMoMSwxKSkNCmBgYA0KOS4gV2hhdCBhYm91dCB0aGUgZGlzdHJpYnV0aW9ucz8gKFBhcnQgMikNCkluIHRoZSBwcmV2aW91cyBwbG90LCB3ZSBzZWUgdGhhdCB0aGUgdHdvIGRpc3RyaWJ1dGlvbnMgZnJvbSB0aGUgR0FSQ0ggbW9kZWxzIGFyZSBkaWZmZXJlbnQgZnJvbSB0aGUgbm9ybWFsIGRpc3RyaWJ1dGlvbiBvZiB0aGUgZGF0YSwgYnV0IHRoZSB0YWlscywgd2hlcmUgdGhlIGRpZmZlcmVuY2VzIGFyZSB0aGUgbW9zdCBwcm9mb3VuZCwgYXJlIGhhcmQgdG8gc2VlLiBVc2luZyBhIFEtUSBwbG90IHdpbGwgaGVscCB1cyBmb2N1cyBpbiBvbiB0aGUgdGFpbHMuDQoNCllvdSBjYW4gcmVhZCBhbiBleGNlbGxlbnQgc3VtbWFyeSBvZiBRLVEgcGxvdHMgW2hlcmVdKGh0dHBzOi8vc3RhdHMuc3RhY2tleGNoYW5nZS5jb20vcXVlc3Rpb25zLzEwMTI3NC9ob3ctdG8taW50ZXJwcmV0LWEtcXEtcGxvdCkuDQpgYGB7cn0NCiMgRGVmaW5lIHRoZSBkYXRhIHRvIHBsb3Q6IHRoZSAxLXllYXIgbWF0dXJpdHkgeWllbGQgY2hhbmdlcyBhbmQgcmVzaWR1YWxzIA0KZGF0YV9vcmlnIDwtIHhfMQ0KZGF0YV9yZXMgPC0gcmVzXzENCg0KIyBEZWZpbmUgdGhlIGJlbmNobWFyayBkaXN0cmlidXRpb24NCmRpc3RyaWJ1dGlvbiA8LSBxbm9ybQ0KDQojIE1ha2UgdGhlIFEtUSBwbG90IG9mIG9yaWdpbmFsIGRhdGEgd2l0aCB0aGUgbGluZSBvZiBub3JtYWwgZGlzdHJpYnV0aW9uDQpxcW5vcm0oZGF0YV9vcmlnLCB5bGltID0gYygtMC41LCAwLjUpKQ0KcXFsaW5lKGRhdGFfb3JpZywgZGlzdHJpYnV0aW9uID0gZGlzdHJpYnV0aW9uLCBjb2wgPSAiZGFya2dyZWVuIikNCg0KIyBNYWtlIHRoZSBRLVEgcGxvdCBvZiBHQVJDSCByZXNpZHVhbHMgd2l0aCB0aGUgbGluZSBvZiBub3JtYWwgZGlzdHJpYnV0aW9uDQpwYXIobmV3PVRSVUUpDQpxcW5vcm0oZGF0YV9yZXMgKiAwLjYxNDI1NjI3MDI2NTEzOSwgY29sID0gInJlZCIsIHlsaW0gPSBjKC0wLjUsIDAuNSkpDQpxcWxpbmUoZGF0YV9yZXMgKiAwLjYxNDI1NjI3MDI2NTEzOSwgZGlzdHJpYnV0aW9uID0gZGlzdHJpYnV0aW9uLCBjb2wgPSAiZGFya2dyZWVuIikNCmxlZ2VuZCgidG9wbGVmdCIsIGMoIkJlZm9yZSBHQVJDSCIsICJBZnRlciBHQVJDSCIpLCBjb2wgPSBjKCJibGFjayIsICJyZWQiKSwgcGNoPWMoMSwxKSkNCmBgYA0KMTAuIEEgZmluYWwgcXVpeg0KDQpJbiB0aGlzIHByb2plY3QsIHdlIGZpdHRlZCBhIEdBUkNIIG1vZGVsIHRvIGRldmVsb3AgYSBiZXR0ZXIgdW5kZXJzdGFuZGluZyBvZiBob3cgYm9uZCB2b2xhdGlsaXR5IGV2b2x2ZXMgYW5kIGhvdyBpdCBhZmZlY3RzIHRoZSBwcm9iYWJpbGl0eSBkaXN0cmlidXRpb24uIEluIHRoZSBmaW5hbCB0YXNrLCB3ZSB3aWxsIGV2YWx1YXRlIG91ciBtb2RlbC4gRGlkIHRoZSBtb2RlbCBzdWNjZWVkLCBvciBkaWQgaXQgZmFpbD8NCmBgYHtyfQ0KIyBRMTogRGlkIEdBUkNIIHJldmVhbGVkIGhvdyB2b2xhdGlsaXR5IGNoYW5nZWQgb3ZlciB0aW1lPyAjIFllcyBvciBObz8NCihRMSA8LSAiWWVzIikNCg0KIyBRMjogRGlkIEdBUkNIIGJyaW5nIHRoZSByZXNpZHVhbHMgY2xvc2VyIHRvIG5vcm1hbCBkaXN0cmlidXRpb24/IFllcyBvciBObz8NCihRMiA8LSAiWWVzIikNCg0KIyBRMzogV2hpY2ggdGltZSBzZXJpZXMgb2YgeWllbGQgY2hhbmdlcyBkZXZpYXRlcyBtb3JlIA0KIyBmcm9tIGEgbm9ybWFsbHkgZGlzdHJpYnV0ZWQgd2hpdGUgbm9pc2UgcHJvY2Vzcz8gQ2hvb3NlIDEgb3IgMjAuDQooUTMgPC0gMSkNCmBgYA0KDQo=