calculate_var <- function(rendimientos, rport, pv, n, conf_levels, weights, cov_portafolio) {
var_results <- list()
alpha.p <- (1 - conf_levels)/2
sd_portafolio <- apply(rendimientos, 2, sd)
varpn <- sd_portafolio * qnorm(alpha.p) * sqrt(1) * pv
varpn_port <- sqrt(t(weights) %*% cov_portafolio %*% weights) * qnorm(alpha.p) * sqrt(1) * pv
var_results$varpn <- varpn
var_results$varpn_port <- varpn_port
alpha.h <- 1 - conf_levels
varh <- apply(rendimientos, 2, quantile, alpha.h) * sqrt(1) * pv
varh_port <- quantile(rport, alpha.h) * sqrt(1) * pv
var_results$varh <- varh
var_results$varh_port <- varh_port
return(var_results)
}
5 años
ALFA2 <- ALFA["2018-05-31/"]
rendimientos <- na.omit(Return.calculate(ALFA2), method = "log")
sd_portafolio <- apply(rendimientos, 2, sd)
cor_portafolio <- cor(rendimientos, use = "complete.obs", method = "pearson")
cov_portafolio <- diag(sd_portafolio) %*% cor_portafolio %*% diag(sd_portafolio)
weights <- c(0.06, 0.09, 0.14, 0.11, 0.14, 0.07, 0.05, 0.08, 0.08, 0.13, 0.05, 0)
volport <- sqrt(t(as.matrix(weights)) %*% cov_portafolio %*% as.matrix(weights))
rport <- rendimientos %*% as.matrix(weights)
var_results <- calculate_var(rendimientos, rport, pv = 1000000, n = 13, conf_levels = c(0.9, 0.95, 0.99), weights = weights, cov_portafolio = cov_portafolio)
varh_port <- var_results$varh_port
varh <- var_results$varh
varpn_port <- var_results$varpn_port
varpn <- var_results$varpn
#Activos
varh_tbl <- data.frame(Value = varh)
kable(varh_tbl, format = "html", col.names = c("ARCA", "AMÉRICA MÓVIL", "BIMBO", "CEMEX", "FEMSA", "INBURSA", "BANORTE", "G.MEXICO", "COCA COLA", "WALMART", "KIMBERLY", "IPC")) %>%
kable_styling() %>%
add_header_above(c("VaR histórico a 5 años" = 13))
VaR histórico a 5 años |
| |
ARCA |
AMÉRICA MÓVIL |
BIMBO |
CEMEX |
FEMSA |
INBURSA |
BANORTE |
G.MEXICO |
COCA COLA |
WALMART |
KIMBERLY |
IPC |
| 10% |
-19413.88 |
-22280.21 |
-26185.37 |
-32774.27 |
-19645.89 |
-28135.90 |
-31056.72 |
-32597.75 |
-19355.99 |
-22949.21 |
-25084.28 |
-17651.91 |
| 5% |
-25941.05 |
-29401.30 |
-34357.47 |
-45389.25 |
-25450.17 |
-38880.08 |
-43688.83 |
-44153.54 |
-27169.38 |
-30134.62 |
-34295.97 |
-24251.76 |
| 1% |
-44636.50 |
-50117.54 |
-59009.80 |
-73434.51 |
-47732.33 |
-64113.26 |
-77136.30 |
-60366.57 |
-45817.64 |
-51901.83 |
-53018.90 |
-45205.97 |
# Portafolio
portfolio_var_table <- data.frame(
"Portfolio",
Historical = var_results$varh_port,
Parametric = var_results$varpn_port
)
portfolio_var_table %>%
select(2) %>%
kable(align = "c", col.names = c("VaR"), caption = "VaR Histórico portafolio a 5 años") %>%
kable_styling()
VaR Histórico portafolio a 5 años
| |
VaR |
| 10% |
-17660.57 |
| 5% |
-24847.48 |
| 1% |
-47208.72 |
NA
NA
3 años
ALFA2 <- ALFA["2021-05-31/"]
rendimientos <- na.omit(Return.calculate(ALFA2), method = "log")
sd_portafolio <- apply(rendimientos, 2, sd)
cor_portafolio <- cor(rendimientos, use = "complete.obs", method = "pearson")
cov_portafolio <- diag(sd_portafolio) %*% cor_portafolio %*% diag(sd_portafolio)
weights <- c(0.06, 0.09, 0.14, 0.11, 0.14, 0.07, 0.05, 0.08, 0.08, 0.13, 0.05, 0)
volport <- sqrt(t(as.matrix(weights)) %*% cov_portafolio %*% as.matrix(weights))
rport <- rendimientos %*% as.matrix(weights)
var_results <- calculate_var(rendimientos, rport, pv = 1000000, n = 13, conf_levels = c(0.9, 0.95, 0.99), weights = weights, cov_portafolio = cov_portafolio)
varh_port <- var_results$varh_port
varh <- var_results$varh
varpn_port <- var_results$varpn_port
varpn <- var_results$varpn
#Activos
varh_tbl <- data.frame(Value = varh)
kable(varh_tbl, format = "html", col.names = c("ARCA", "AMÉRICA MÓVIL", "BIMBO", "CEMEX", "FEMSA", "INBURSA", "BANORTE", "G.MEXICO", "COCA COLA", "WALMART", "KIMBERLY", "IPC")) %>%
kable_styling() %>%
add_header_above(c("VaR histórico a 3 años" = 13))
VaR histórico a 3 años |
| |
ARCA |
AMÉRICA MÓVIL |
BIMBO |
CEMEX |
FEMSA |
INBURSA |
BANORTE |
G.MEXICO |
COCA COLA |
WALMART |
KIMBERLY |
IPC |
| 10% |
-17983.59 |
-20872.93 |
-25868.65 |
-32125.34 |
-18964.15 |
-25545.86 |
-28673.95 |
-35244.42 |
-16568.96 |
-21964.14 |
-23493.91 |
-16967.82 |
| 5% |
-22295.72 |
-28439.86 |
-32419.29 |
-42428.07 |
-24146.27 |
-33504.05 |
-37771.26 |
-45741.27 |
-23492.11 |
-27744.81 |
-31088.82 |
-21633.34 |
| 1% |
-33562.36 |
-40178.09 |
-48922.96 |
-59171.36 |
-36743.37 |
-51690.70 |
-54453.63 |
-56068.26 |
-33756.69 |
-36207.01 |
-43213.41 |
-30476.03 |
# Portafolio
portfolio_var_table <- data.frame(
"Portfolio",
Historical = var_results$varh_port,
Parametric = var_results$varpn_port
)
portfolio_var_table %>%
select(2) %>%
kable(align = "c", col.names = c("VaR"), caption = "VaR Histórico 3 años portafolio") %>%
kable_styling()
VaR Histórico 3 años portafolio
| |
VaR |
| 10% |
-15595.33 |
| 5% |
-22677.79 |
| 1% |
-28959.80 |
NA
NA
1 año
ALFA2 <- ALFA["2021-05-31/"]
rendimientos <- na.omit(Return.calculate(ALFA2), method = "log")
sd_portafolio <- apply(rendimientos, 2, sd)
cor_portafolio <- cor(rendimientos, use = "complete.obs", method = "pearson")
cov_portafolio <- diag(sd_portafolio) %*% cor_portafolio %*% diag(sd_portafolio)
weights <- c(0.06, 0.09, 0.14, 0.11, 0.14, 0.07, 0.05, 0.08, 0.08, 0.13, 0.05, 0)
volport <- sqrt(t(as.matrix(weights)) %*% cov_portafolio %*% as.matrix(weights))
rport <- rendimientos %*% as.matrix(weights)
var_results <- calculate_var(rendimientos, rport, pv = 1000000, n = 13, conf_levels = c(0.9, 0.95, 0.99), weights = weights, cov_portafolio = cov_portafolio)
varh_port <- var_results$varh_port
varh <- var_results$varh
varpn_port <- var_results$varpn_port
varpn <- var_results$varpn
#Activos
varh_tbl <- data.frame(Value = varh)
kable(varh_tbl, format = "html", col.names = c("ARCA", "AMÉRICA MÓVIL", "BIMBO", "CEMEX", "FEMSA", "INBURSA", "BANORTE", "G.MEXICO", "COCA COLA", "WALMART", "KIMBERLY", "IPC")) %>%
kable_styling() %>%
add_header_above(c("VaR histórico a 1 año" = 13))
VaR histórico a 1 año |
| |
ARCA |
AMÉRICA MÓVIL |
BIMBO |
CEMEX |
FEMSA |
INBURSA |
BANORTE |
G.MEXICO |
COCA COLA |
WALMART |
KIMBERLY |
IPC |
| 10% |
-17983.59 |
-20872.93 |
-25868.65 |
-32125.34 |
-18964.15 |
-25545.86 |
-28673.95 |
-35244.42 |
-16568.96 |
-21964.14 |
-23493.91 |
-16967.82 |
| 5% |
-22295.72 |
-28439.86 |
-32419.29 |
-42428.07 |
-24146.27 |
-33504.05 |
-37771.26 |
-45741.27 |
-23492.11 |
-27744.81 |
-31088.82 |
-21633.34 |
| 1% |
-33562.36 |
-40178.09 |
-48922.96 |
-59171.36 |
-36743.37 |
-51690.70 |
-54453.63 |
-56068.26 |
-33756.69 |
-36207.01 |
-43213.41 |
-30476.03 |
# Portafolio
portfolio_var_table <- data.frame(
"Portfolio",
Historical = var_results$varh_port,
Parametric = var_results$varpn_port
)
portfolio_var_table %>%
select(2) %>%
kable(align = "c", col.names = c("VaR"), caption = "VaR histórico a 1 año portafolio") %>%
kable_styling()
VaR histórico a 1 año portafolio
| |
VaR |
| 10% |
-15595.33 |
| 5% |
-22677.79 |
| 1% |
-28959.80 |
NA
NA
LS0tCnRpdGxlOiAiQ8OhbGN1bG8gZGVsIFZhUiIKYXV0aG9yOiAiRXF1aXBvIE5hY2lvbmFsIC0gUG9ydGFmb2xpbyBBTEZBIgpvdXRwdXQ6CiAgaHRtbF9ub3RlYm9vazoKICAgIHRvYzogeWVzCiAgICB0b2NfZmxvYXQ6IHllcwogICAgZGZfcHJpbnQ6IHBhZ2VkCiAgaHRtbF9kb2N1bWVudDoKICAgIHRvYzogeWVzCiAgICBkZl9wcmludDogcGFnZWQKLS0tCgoKYGBge3IsIGluY2x1ZGU9RkFMU0V9CmxpYnJhcnkocmVhZHhsKQpsaWJyYXJ5KHh0cykKbGlicmFyeShkcGx5cikKbGlicmFyeShQZXJmb3JtYW5jZUFuYWx5dGljcykKbGlicmFyeShrYWJsZUV4dHJhKQpsaWJyYXJ5KGZvcm1hdHRhYmxlKQpsaWJyYXJ5KGtuaXRyKQpsaWJyYXJ5KHNjYWxlcykKCgpwcmVjaW9zIDwtIHJlYWRfZXhjZWwoIn4vRGVza3RvcC9SL1ByZWNpb3NIaXN0b3JpY29zLnhsc3giKQoKcHJlY2lvcyA8LSBwcmVjaW9zICU+JSAgCiAgbXV0YXRlKERhdGUgPSBhcy5EYXRlKERhdGUsIGZvcm1hdCA9ICIlbS8lZC8lWSIpKQoKQUxGQSA8LSB4dHMocHJlY2lvc1ssIDI6MTNdLCBvcmRlci5ieSA9IHByZWNpb3MkRGF0ZSkKCmBgYAoKCgpgYGB7cn0KCgpjYWxjdWxhdGVfdmFyIDwtIGZ1bmN0aW9uKHJlbmRpbWllbnRvcywgcnBvcnQsIHB2LCBuLCBjb25mX2xldmVscywgd2VpZ2h0cywgY292X3BvcnRhZm9saW8pIHsKICB2YXJfcmVzdWx0cyA8LSBsaXN0KCkKICAKICAKICBhbHBoYS5wIDwtICgxIC0gY29uZl9sZXZlbHMpLzIKICBzZF9wb3J0YWZvbGlvIDwtIGFwcGx5KHJlbmRpbWllbnRvcywgMiwgc2QpCiAgdmFycG4gPC0gc2RfcG9ydGFmb2xpbyAqIHFub3JtKGFscGhhLnApICogc3FydCgxKSAqIHB2CiAgdmFycG5fcG9ydCA8LSBzcXJ0KHQod2VpZ2h0cykgJSolIGNvdl9wb3J0YWZvbGlvICUqJSB3ZWlnaHRzKSAqIHFub3JtKGFscGhhLnApICogc3FydCgxKSAqIHB2CiAgCiAgdmFyX3Jlc3VsdHMkdmFycG4gPC0gdmFycG4KICB2YXJfcmVzdWx0cyR2YXJwbl9wb3J0IDwtIHZhcnBuX3BvcnQKICAKICAKICBhbHBoYS5oIDwtIDEgLSBjb25mX2xldmVscwogIHZhcmggPC0gYXBwbHkocmVuZGltaWVudG9zLCAyLCBxdWFudGlsZSwgYWxwaGEuaCkgKiBzcXJ0KDEpICogcHYKICB2YXJoX3BvcnQgPC0gcXVhbnRpbGUocnBvcnQsIGFscGhhLmgpICogc3FydCgxKSAqIHB2CiAgCiAgdmFyX3Jlc3VsdHMkdmFyaCA8LSB2YXJoCiAgdmFyX3Jlc3VsdHMkdmFyaF9wb3J0IDwtIHZhcmhfcG9ydAogIAogIHJldHVybih2YXJfcmVzdWx0cykKfQpgYGAKCiMjIDUgYcOxb3MKCmBgYHtyLCB3YXJuaW5nPUZBTFNFfQoKQUxGQTIgPC0gQUxGQVsiMjAxOC0wNS0zMS8iXQoKCnJlbmRpbWllbnRvcyA8LSBuYS5vbWl0KFJldHVybi5jYWxjdWxhdGUoQUxGQTIpLCBtZXRob2QgPSAibG9nIikKCgpzZF9wb3J0YWZvbGlvIDwtIGFwcGx5KHJlbmRpbWllbnRvcywgMiwgc2QpCmNvcl9wb3J0YWZvbGlvIDwtIGNvcihyZW5kaW1pZW50b3MsIHVzZSA9ICJjb21wbGV0ZS5vYnMiLCBtZXRob2QgPSAicGVhcnNvbiIpCmNvdl9wb3J0YWZvbGlvIDwtIGRpYWcoc2RfcG9ydGFmb2xpbykgJSolIGNvcl9wb3J0YWZvbGlvICUqJSBkaWFnKHNkX3BvcnRhZm9saW8pCgoKd2VpZ2h0cyA8LSBjKDAuMDYsIDAuMDksIDAuMTQsIDAuMTEsIDAuMTQsIDAuMDcsIDAuMDUsIDAuMDgsIDAuMDgsIDAuMTMsIDAuMDUsIDApCgoKdm9scG9ydCA8LSBzcXJ0KHQoYXMubWF0cml4KHdlaWdodHMpKSAlKiUgY292X3BvcnRhZm9saW8gJSolIGFzLm1hdHJpeCh3ZWlnaHRzKSkKcnBvcnQgPC0gcmVuZGltaWVudG9zICUqJSBhcy5tYXRyaXgod2VpZ2h0cykKCgp2YXJfcmVzdWx0cyA8LSBjYWxjdWxhdGVfdmFyKHJlbmRpbWllbnRvcywgcnBvcnQsIHB2ID0gMTAwMDAwMCwgbiA9IDEzLCBjb25mX2xldmVscyA9IGMoMC45LCAwLjk1LCAwLjk5KSwgd2VpZ2h0cyA9IHdlaWdodHMsIGNvdl9wb3J0YWZvbGlvID0gY292X3BvcnRhZm9saW8pCgoKCnZhcmhfcG9ydCA8LSB2YXJfcmVzdWx0cyR2YXJoX3BvcnQKdmFyaCA8LSB2YXJfcmVzdWx0cyR2YXJoCnZhcnBuX3BvcnQgPC0gdmFyX3Jlc3VsdHMkdmFycG5fcG9ydAp2YXJwbiA8LSB2YXJfcmVzdWx0cyR2YXJwbgoKCiNBY3Rpdm9zCgp2YXJoX3RibCA8LSBkYXRhLmZyYW1lKFZhbHVlID0gdmFyaCkKCmthYmxlKHZhcmhfdGJsLCBmb3JtYXQgPSAiaHRtbCIsIGNvbC5uYW1lcyA9IGMoIkFSQ0EiLCAiQU3DiVJJQ0EgTcOTVklMIiwgIkJJTUJPIiwgIkNFTUVYIiwgIkZFTVNBIiwgIklOQlVSU0EiLCAiQkFOT1JURSIsICJHLk1FWElDTyIsICJDT0NBIENPTEEiLCAiV0FMTUFSVCIsICJLSU1CRVJMWSIsICJJUEMiKSkgJT4lCiAga2FibGVfc3R5bGluZygpICU+JSAKICBhZGRfaGVhZGVyX2Fib3ZlKGMoIlZhUiBoaXN0w7NyaWNvIGEgNSBhw7FvcyIgPSAxMykpCgojIFBvcnRhZm9saW8KcG9ydGZvbGlvX3Zhcl90YWJsZSA8LSBkYXRhLmZyYW1lKAogICJQb3J0Zm9saW8iLAogIEhpc3RvcmljYWwgPSB2YXJfcmVzdWx0cyR2YXJoX3BvcnQsCiAgUGFyYW1ldHJpYyA9IHZhcl9yZXN1bHRzJHZhcnBuX3BvcnQKKQpwb3J0Zm9saW9fdmFyX3RhYmxlICU+JQogICAgc2VsZWN0KDIpICU+JQogICAga2FibGUoYWxpZ24gPSAiYyIsIGNvbC5uYW1lcyA9IGMoIlZhUiIpLCBjYXB0aW9uID0gIlZhUiBIaXN0w7NyaWNvIHBvcnRhZm9saW8gYSA1IGHDsW9zIikgJT4lCiAgICBrYWJsZV9zdHlsaW5nKCkKCgpgYGAKCiMjIDMgYcOxb3MKCgoKCmBgYHtyLCB3YXJuaW5nPUZBTFNFfQoKQUxGQTIgPC0gQUxGQVsiMjAyMS0wNS0zMS8iXQoKCnJlbmRpbWllbnRvcyA8LSBuYS5vbWl0KFJldHVybi5jYWxjdWxhdGUoQUxGQTIpLCBtZXRob2QgPSAibG9nIikKCgpzZF9wb3J0YWZvbGlvIDwtIGFwcGx5KHJlbmRpbWllbnRvcywgMiwgc2QpCmNvcl9wb3J0YWZvbGlvIDwtIGNvcihyZW5kaW1pZW50b3MsIHVzZSA9ICJjb21wbGV0ZS5vYnMiLCBtZXRob2QgPSAicGVhcnNvbiIpCmNvdl9wb3J0YWZvbGlvIDwtIGRpYWcoc2RfcG9ydGFmb2xpbykgJSolIGNvcl9wb3J0YWZvbGlvICUqJSBkaWFnKHNkX3BvcnRhZm9saW8pCgp3ZWlnaHRzIDwtIGMoMC4wNiwgMC4wOSwgMC4xNCwgMC4xMSwgMC4xNCwgMC4wNywgMC4wNSwgMC4wOCwgMC4wOCwgMC4xMywgMC4wNSwgMCkKCnZvbHBvcnQgPC0gc3FydCh0KGFzLm1hdHJpeCh3ZWlnaHRzKSkgJSolIGNvdl9wb3J0YWZvbGlvICUqJSBhcy5tYXRyaXgod2VpZ2h0cykpCnJwb3J0IDwtIHJlbmRpbWllbnRvcyAlKiUgYXMubWF0cml4KHdlaWdodHMpCgp2YXJfcmVzdWx0cyA8LSBjYWxjdWxhdGVfdmFyKHJlbmRpbWllbnRvcywgcnBvcnQsIHB2ID0gMTAwMDAwMCwgbiA9IDEzLCBjb25mX2xldmVscyA9IGMoMC45LCAwLjk1LCAwLjk5KSwgd2VpZ2h0cyA9IHdlaWdodHMsIGNvdl9wb3J0YWZvbGlvID0gY292X3BvcnRhZm9saW8pCgoKdmFyaF9wb3J0IDwtIHZhcl9yZXN1bHRzJHZhcmhfcG9ydAp2YXJoIDwtIHZhcl9yZXN1bHRzJHZhcmgKdmFycG5fcG9ydCA8LSB2YXJfcmVzdWx0cyR2YXJwbl9wb3J0CnZhcnBuIDwtIHZhcl9yZXN1bHRzJHZhcnBuCgoKI0FjdGl2b3MKCnZhcmhfdGJsIDwtIGRhdGEuZnJhbWUoVmFsdWUgPSB2YXJoKQoKa2FibGUodmFyaF90YmwsIGZvcm1hdCA9ICJodG1sIiwgY29sLm5hbWVzID0gYygiQVJDQSIsICJBTcOJUklDQSBNw5NWSUwiLCAiQklNQk8iLCAiQ0VNRVgiLCAiRkVNU0EiLCAiSU5CVVJTQSIsICJCQU5PUlRFIiwgIkcuTUVYSUNPIiwgIkNPQ0EgQ09MQSIsICJXQUxNQVJUIiwgIktJTUJFUkxZIiwgIklQQyIpKSAlPiUKICBrYWJsZV9zdHlsaW5nKCkgJT4lIAogIGFkZF9oZWFkZXJfYWJvdmUoYygiVmFSIGhpc3TDs3JpY28gYSAzIGHDsW9zIiA9IDEzKSkKCiMgUG9ydGFmb2xpbwpwb3J0Zm9saW9fdmFyX3RhYmxlIDwtIGRhdGEuZnJhbWUoCiAgIlBvcnRmb2xpbyIsCiAgSGlzdG9yaWNhbCA9IHZhcl9yZXN1bHRzJHZhcmhfcG9ydCwKICBQYXJhbWV0cmljID0gdmFyX3Jlc3VsdHMkdmFycG5fcG9ydAopCnBvcnRmb2xpb192YXJfdGFibGUgJT4lCiAgICBzZWxlY3QoMikgJT4lCiAgICBrYWJsZShhbGlnbiA9ICJjIiwgY29sLm5hbWVzID0gYygiVmFSIiksIGNhcHRpb24gPSAiVmFSIEhpc3TDs3JpY28gMyBhw7FvcyBwb3J0YWZvbGlvIikgJT4lCiAgICBrYWJsZV9zdHlsaW5nKCkKCgpgYGAKCgoKIyMgMSBhw7FvCgoKYGBge3IsIHdhcm5pbmc9RkFMU0V9CkFMRkEyIDwtIEFMRkFbIjIwMjEtMDUtMzEvIl0KCnJlbmRpbWllbnRvcyA8LSBuYS5vbWl0KFJldHVybi5jYWxjdWxhdGUoQUxGQTIpLCBtZXRob2QgPSAibG9nIikKCnNkX3BvcnRhZm9saW8gPC0gYXBwbHkocmVuZGltaWVudG9zLCAyLCBzZCkKY29yX3BvcnRhZm9saW8gPC0gY29yKHJlbmRpbWllbnRvcywgdXNlID0gImNvbXBsZXRlLm9icyIsIG1ldGhvZCA9ICJwZWFyc29uIikKY292X3BvcnRhZm9saW8gPC0gZGlhZyhzZF9wb3J0YWZvbGlvKSAlKiUgY29yX3BvcnRhZm9saW8gJSolIGRpYWcoc2RfcG9ydGFmb2xpbykKCndlaWdodHMgPC0gYygwLjA2LCAwLjA5LCAwLjE0LCAwLjExLCAwLjE0LCAwLjA3LCAwLjA1LCAwLjA4LCAwLjA4LCAwLjEzLCAwLjA1LCAwKQoKdm9scG9ydCA8LSBzcXJ0KHQoYXMubWF0cml4KHdlaWdodHMpKSAlKiUgY292X3BvcnRhZm9saW8gJSolIGFzLm1hdHJpeCh3ZWlnaHRzKSkKcnBvcnQgPC0gcmVuZGltaWVudG9zICUqJSBhcy5tYXRyaXgod2VpZ2h0cykKCnZhcl9yZXN1bHRzIDwtIGNhbGN1bGF0ZV92YXIocmVuZGltaWVudG9zLCBycG9ydCwgcHYgPSAxMDAwMDAwLCBuID0gMTMsIGNvbmZfbGV2ZWxzID0gYygwLjksIDAuOTUsIDAuOTkpLCB3ZWlnaHRzID0gd2VpZ2h0cywgY292X3BvcnRhZm9saW8gPSBjb3ZfcG9ydGFmb2xpbykKCgp2YXJoX3BvcnQgPC0gdmFyX3Jlc3VsdHMkdmFyaF9wb3J0CnZhcmggPC0gdmFyX3Jlc3VsdHMkdmFyaAp2YXJwbl9wb3J0IDwtIHZhcl9yZXN1bHRzJHZhcnBuX3BvcnQKdmFycG4gPC0gdmFyX3Jlc3VsdHMkdmFycG4KCgojQWN0aXZvcwoKdmFyaF90YmwgPC0gZGF0YS5mcmFtZShWYWx1ZSA9IHZhcmgpCgprYWJsZSh2YXJoX3RibCwgZm9ybWF0ID0gImh0bWwiLCBjb2wubmFtZXMgPSBjKCJBUkNBIiwgIkFNw4lSSUNBIE3Dk1ZJTCIsICJCSU1CTyIsICJDRU1FWCIsICJGRU1TQSIsICJJTkJVUlNBIiwgIkJBTk9SVEUiLCAiRy5NRVhJQ08iLCAiQ09DQSBDT0xBIiwgIldBTE1BUlQiLCAiS0lNQkVSTFkiLCAiSVBDIikpICU+JQogIGthYmxlX3N0eWxpbmcoKSAlPiUgCiAgYWRkX2hlYWRlcl9hYm92ZShjKCJWYVIgaGlzdMOzcmljbyBhIDEgYcOxbyIgPSAxMykpCgojIFBvcnRhZm9saW8KcG9ydGZvbGlvX3Zhcl90YWJsZSA8LSBkYXRhLmZyYW1lKAogICJQb3J0Zm9saW8iLAogIEhpc3RvcmljYWwgPSB2YXJfcmVzdWx0cyR2YXJoX3BvcnQsCiAgUGFyYW1ldHJpYyA9IHZhcl9yZXN1bHRzJHZhcnBuX3BvcnQKKQpwb3J0Zm9saW9fdmFyX3RhYmxlICU+JQogICAgc2VsZWN0KDIpICU+JQogICAga2FibGUoYWxpZ24gPSAiYyIsIGNvbC5uYW1lcyA9IGMoIlZhUiIpLCBjYXB0aW9uID0gIlZhUiBoaXN0w7NyaWNvIGEgMSBhw7FvIHBvcnRhZm9saW8iKSAlPiUKICAgIGthYmxlX3N0eWxpbmcoKQoKCmBgYAo=