Ao longo deste notebook iremos explorar dados financeiros de ações blue chips e small caps. Nosso objetivo é analisar as propriedades estatísticas das entropias de Shannon produzidas por padrões ordinais de bandt-pompe. Apresentaremos uma possível aplicação de teste de hipótese em que séries temporais produzem padrões ordinais com mesma entropia.

require(ggplot2)
require(ggthemes)
require(dplyr)
require(magrittr)
require(ggpubr)

source("InformationTheory.R")
source("Bandt-Pompe.R")

Média e variância da distribuição assintótica

AsymptoticMean <- function(p, k){
  return(-sum(p*log(p))/log(k))
}

AsymptoticVariance <- function(p, n) {
  k <- length(p)
  p.nonzero <- p[p >0]
  
  acc <- 0
  for(j in 1:(k-1)) {
    for(i in (j+1):k) {
      acc <- acc + p.nonzero[j]*p.nonzero[i]*(log(p.nonzero[j])+1)*(log(p.nonzero[i])+1)
    }
  }
  
  return(sum(p.nonzero*(1-p.nonzero)*(log(p.nonzero)+1)^2)/n -
    acc*2/n)
}

Hiper-parâmetros

D = 3
Tau = 1
k = factorial(D)

Analisando diferentes ações da mesma empresa (Usiminas - blue chip)

usim3 = read.csv("../../Data/R/stock markets/USIM3.SA.csv")
usim5 = read.csv("../../Data/R/stock markets/USIM5.SA.csv") 
usim_3 = usim3[2729:2977,]
usim_5 = usim5[2729:2977,]
n_usim = dim(usim_5)[1]

p_usim3 <- bandt.pompe(unlist(usim_3["Close"]), D, Tau)
H_usim_3 <- shannon.entropy.normalized(p_usim3)
  
p_usim5 <- bandt.pompe(unlist(usim_5["Close"]), D, Tau)
H_usim_5 <- shannon.entropy.normalized(p_usim5)

AsymptoticMean_usim3 <- AsymptoticMean(p_usim3, k)
AsymptoticSTD_usim3 <- sqrt(AsymptoticVariance(p_usim3, n_usim))/log(k)
x_usim3 = rnorm(n = 10000, mean = AsymptoticMean_usim3, sd = AsymptoticSTD_usim3)

AsymptoticMean_usim5 <- AsymptoticMean(p_usim5, k)
AsymptoticSTD_usim5 <- sqrt(AsymptoticVariance(p_usim5, n_usim))/log(k)
x_usim5 = rnorm(n = 10000, mean = AsymptoticMean_usim5, sd = AsymptoticSTD_usim5)

ggplot() +
  geom_density(aes(x = x_usim3), kernel="epanechnikov", alpha=.3, color = "blue", fill = "blue") +
  geom_density(aes(x = x_usim5), kernel="epanechnikov", alpha=.3, color = "red", fill = "red") +
  geom_vline(aes(xintercept=H_usim_3, color = "blue")) +
  geom_vline(aes(xintercept=H_usim_5, color = "red")) +
  xlab(expression(italic(H))) + ylab("") +
  ggtitle(paste0("N = ", n_usim)) +
  scale_color_manual(name = "Ações", values = c("blue", "red"), labels=c("USIM3", "USIM5")) +
  theme_few(base_size = 12, base_family = "serif")  + 
  theme(plot.title = element_text(hjust = 0.5))

Analisando ações em diferentes anos (Usiminas - blue chip)


usim_3_1 = usim3[2729:2977,]
usim_3_2 = usim5[1987:2232,]
n_usim = dim(usim_3_2)[1]

p_usim_3_1 <- bandt.pompe(unlist(usim_3_1["Close"]), D, Tau)
H_usim_3_1 <- shannon.entropy.normalized(p_usim_3_1)
  
p_usim_3_2 <- bandt.pompe(unlist(usim_5["Close"]), D, Tau)
H_usim_3_2 <- shannon.entropy.normalized(p_usim_3_2)

AsymptoticMean_usim_3_1 <- AsymptoticMean(p_usim_3_1, k)
AsymptoticSTD_usim_3_1 <- sqrt(AsymptoticVariance(p_usim_3_1, n_usim))/log(k)
x_usim_3_1 = rnorm(n = 10000, mean = AsymptoticMean_usim_3_1, sd = AsymptoticSTD_usim_3_1)

AsymptoticMean_usim_3_2 <- AsymptoticMean(p_usim_3_2, k)
AsymptoticSTD_usim_3_2 <- sqrt(AsymptoticVariance(p_usim_3_2, n_usim))/log(k)
x_usim_3_2 = rnorm(n = 10000, mean = AsymptoticMean_usim_3_2, sd = AsymptoticSTD_usim_3_2)

ggplot() +
  geom_density(aes(x = x_usim_3_1), kernel="epanechnikov", alpha=.3, color = "blue", fill = "blue") +
  geom_density(aes(x = x_usim_3_2), kernel="epanechnikov", alpha=.3, color = "red", fill = "red") +
  geom_vline(aes(xintercept=H_usim_3_1, color = "blue")) +
  geom_vline(aes(xintercept=H_usim_3_2, color = "red")) +
  xlab(expression(italic(H))) + ylab("") +
  scale_color_manual(name = "Ações", values = c("blue", "red"), labels=c("USIM3 (2021-2022)", "USIM3 (2018-2019)")) +
  theme_few(base_size = 12, base_family = "serif")  + 
  theme(plot.title = element_text(hjust = 0.5))

usim_3_1 = usim3[2729:2977,]
usim_3_2 = usim5[2481:2728,]
n_usim = dim(usim_3_2)[1]

p_usim_3_1 <- bandt.pompe(unlist(usim_3_1["Close"]), D, Tau)
H_usim_3_1 <- shannon.entropy.normalized(p_usim_3_1)
  
p_usim_3_2 <- bandt.pompe(unlist(usim_5["Close"]), D, Tau)
H_usim_3_2 <- shannon.entropy.normalized(p_usim_3_2)

AsymptoticMean_usim_3_1 <- AsymptoticMean(p_usim_3_1, k)
AsymptoticSTD_usim_3_1 <- sqrt(AsymptoticVariance(p_usim_3_1, n_usim))/log(k)
x_usim_3_1 = rnorm(n = 10000, mean = AsymptoticMean_usim_3_1, sd = AsymptoticSTD_usim_3_1)

AsymptoticMean_usim_3_2 <- AsymptoticMean(p_usim_3_2, k)
AsymptoticSTD_usim_3_2 <- sqrt(AsymptoticVariance(p_usim_3_2, n_usim))/log(k)
x_usim_3_2 = rnorm(n = 10000, mean = AsymptoticMean_usim_3_2, sd = AsymptoticSTD_usim_3_2)

ggplot() +
  geom_density(aes(x = x_usim_3_1), kernel="epanechnikov", alpha=.3, color = "blue", fill = "blue") +
  geom_density(aes(x = x_usim_3_2), kernel="epanechnikov", alpha=.3, color = "red", fill = "red") +
  geom_vline(aes(xintercept=H_usim_3_1, color = "blue")) +
  geom_vline(aes(xintercept=H_usim_3_2, color = "red")) +
  xlab(expression(italic(H))) + ylab("") +
  scale_color_manual(name = "Ações", values = c("blue", "red"), labels=c("USIM3 (2021-2022)", "USIM3 (2020-2021)")) +
  theme_few(base_size = 12, base_family = "serif")  + 
  theme(plot.title = element_text(hjust = 0.5))

Análise de sequências do setor financeiro (blue chips)

bbas3 = read.csv("../../Data/R/stock markets/BBAS3.SA.csv")
bbdc4 = read.csv("../../Data/R/stock markets/BBDC4.SA.csv")
itub4 = read.csv("../../Data/R/stock markets/ITUB4.SA.csv")
bbas3 = bbas3[2729:2977,]
bbdc4 = bbdc4[2729:2977,]
itub4 = itub4[2729:2977,]
n = dim(itub4)[1]

p_bbas3 <- bandt.pompe(unlist(bbas3["Close"]), D, Tau)
H_bbas3 <- shannon.entropy.normalized(p_bbas3)

p_bbdc4 <- bandt.pompe(unlist(bbdc4["Close"]), D, Tau)
H_bbdc4 <- shannon.entropy.normalized(p_bbdc4)

p_itub4 <- bandt.pompe(unlist(itub4["Close"]), D, Tau)
H_itub4 <- shannon.entropy.normalized(p_itub4)

AsymptoticMean_bbas3 <- AsymptoticMean(p_bbas3, k)
AsymptoticSTD_bbas3 <- sqrt(AsymptoticVariance(p_bbas3, n))/log(k)
x_bbas3 = rnorm(n = 10000, mean = AsymptoticMean_bbas3, sd = AsymptoticSTD_bbas3)

AsymptoticMean_bbdc4 <- AsymptoticMean(p_bbdc4, k)
AsymptoticSTD_bbdc4 <- sqrt(AsymptoticVariance(p_bbdc4, n))/log(k)
x_bbdc4 = rnorm(n = 10000, mean = AsymptoticMean_bbdc4, sd = AsymptoticSTD_bbdc4)

AsymptoticMean_itub4 <- AsymptoticMean(p_itub4, k)
AsymptoticSTD_itub4 <- sqrt(AsymptoticVariance(p_itub4, n))/log(k)
x_itub4 = rnorm(n = 10000, mean = AsymptoticMean_itub4, sd = AsymptoticSTD_itub4)

ggplot() +
  geom_density(aes(x = x_bbas3), kernel="epanechnikov", alpha=.3, color = "blue", fill = "blue") +
  geom_density(aes(x = x_bbdc4), kernel="epanechnikov", alpha=.3, color = "red", fill = "red") +
  geom_density(aes(x = x_itub4), kernel="epanechnikov", alpha=.3, color = "orange", fill = "orange") +
  geom_vline(aes(xintercept=H_bbas3, color = "blue")) +
  geom_vline(aes(xintercept=H_bbdc4, color = "red")) +
  geom_vline(aes(xintercept=H_itub4, color = "orange")) +
  xlab(expression(italic(H))) + ylab("") +
  ggtitle("2021-2022") +
  scale_color_manual(name = "Ações", values = c("blue", "red", "orange"), labels=c("bbas3", "bbdc4", "itub4")) +
  theme_few(base_size = 12, base_family = "serif")  + 
  theme(plot.title = element_text(hjust = 0.5))

Análise de sequências do setor financeiro (blue chips & small caps)

bmgb4 = read.csv("../../Data/R/stock markets/BMGB4.SA.csv")[247:494,]
brsr6 = read.csv("../../Data/R/stock markets/BRSR6.SA.csv")[2729:2977,]
n = dim(brsr6)[1]

Análise de ações de diferente setores (blue chips)

Análise de sequências do setor de companhia áerea (Small Caps)

LS0tCnRpdGxlOiAiSHlwb3RoZXNpcyB0ZXN0cyBhbmQgYXBwbGljYXRpb25zIgpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sKLS0tCgpBbyBsb25nbyBkZXN0ZSBub3RlYm9vayBpcmVtb3MgZXhwbG9yYXIgZGFkb3MgZmluYW5jZWlyb3MgZGUgYcOnw7VlcyBibHVlIGNoaXBzIGUgc21hbGwgY2Fwcy4gCk5vc3NvIG9iamV0aXZvIMOpIGFuYWxpc2FyIGFzIHByb3ByaWVkYWRlcyBlc3RhdMOtc3RpY2FzIGRhcyBlbnRyb3BpYXMgZGUgU2hhbm5vbiBwcm9kdXppZGFzIHBvciBwYWRyw7VlcyBvcmRpbmFpcyBkZSBiYW5kdC1wb21wZS4KQXByZXNlbnRhcmVtb3MgdW1hIHBvc3PDrXZlbCBhcGxpY2HDp8OjbyBkZSB0ZXN0ZSBkZSBoaXDDs3Rlc2UgZW0gcXVlIHPDqXJpZXMgdGVtcG9yYWlzIHByb2R1emVtIHBhZHLDtWVzIG9yZGluYWlzIGNvbSBtZXNtYSBlbnRyb3BpYS4gCgpgYGB7cn0KcmVxdWlyZShnZ3Bsb3QyKQpyZXF1aXJlKGdndGhlbWVzKQpyZXF1aXJlKGRwbHlyKQpyZXF1aXJlKG1hZ3JpdHRyKQpyZXF1aXJlKGdncHVicikKCnNvdXJjZSgiSW5mb3JtYXRpb25UaGVvcnkuUiIpCnNvdXJjZSgiQmFuZHQtUG9tcGUuUiIpCmBgYAoKIyMjIyBNw6lkaWEgZSB2YXJpw6JuY2lhIGRhIGRpc3RyaWJ1acOnw6NvIGFzc2ludMOzdGljYQoKYGBge3J9CkFzeW1wdG90aWNNZWFuIDwtIGZ1bmN0aW9uKHAsIGspewogIHJldHVybigtc3VtKHAqbG9nKHApKS9sb2coaykpCn0KCkFzeW1wdG90aWNWYXJpYW5jZSA8LSBmdW5jdGlvbihwLCBuKSB7CiAgayA8LSBsZW5ndGgocCkKICBwLm5vbnplcm8gPC0gcFtwID4wXQogIAogIGFjYyA8LSAwCiAgZm9yKGogaW4gMTooay0xKSkgewogICAgZm9yKGkgaW4gKGorMSk6aykgewogICAgICBhY2MgPC0gYWNjICsgcC5ub256ZXJvW2pdKnAubm9uemVyb1tpXSoobG9nKHAubm9uemVyb1tqXSkrMSkqKGxvZyhwLm5vbnplcm9baV0pKzEpCiAgICB9CiAgfQogIAogIHJldHVybihzdW0ocC5ub256ZXJvKigxLXAubm9uemVybykqKGxvZyhwLm5vbnplcm8pKzEpXjIpL24gLQogICAgYWNjKjIvbikKfQpgYGAKCiMjIyMgSGlwZXItcGFyw6JtZXRyb3MKCmBgYHtyfQpEID0gMwpUYXUgPSAxCmsgPSBmYWN0b3JpYWwoRCkKYGBgCgoKIyMjIyBBbmFsaXNhbmRvIGRpZmVyZW50ZXMgYcOnw7VlcyBkYSBtZXNtYSBlbXByZXNhIChVc2ltaW5hcyAtIGJsdWUgY2hpcCkKCmBgYHtyfQp1c2ltMyA9IHJlYWQuY3N2KCIuLi8uLi9EYXRhL1Ivc3RvY2sgbWFya2V0cy9VU0lNMy5TQS5jc3YiKQp1c2ltNSA9IHJlYWQuY3N2KCIuLi8uLi9EYXRhL1Ivc3RvY2sgbWFya2V0cy9VU0lNNS5TQS5jc3YiKSAKYGBgCgpgYGB7cn0KdXNpbV8zID0gdXNpbTNbMjcyOToyOTc3LF0KdXNpbV81ID0gdXNpbTVbMjcyOToyOTc3LF0Kbl91c2ltID0gZGltKHVzaW1fNSlbMV0KCnBfdXNpbTMgPC0gYmFuZHQucG9tcGUodW5saXN0KHVzaW1fM1siQ2xvc2UiXSksIEQsIFRhdSkKSF91c2ltXzMgPC0gc2hhbm5vbi5lbnRyb3B5Lm5vcm1hbGl6ZWQocF91c2ltMykKICAKcF91c2ltNSA8LSBiYW5kdC5wb21wZSh1bmxpc3QodXNpbV81WyJDbG9zZSJdKSwgRCwgVGF1KQpIX3VzaW1fNSA8LSBzaGFubm9uLmVudHJvcHkubm9ybWFsaXplZChwX3VzaW01KQoKQXN5bXB0b3RpY01lYW5fdXNpbTMgPC0gQXN5bXB0b3RpY01lYW4ocF91c2ltMywgaykKQXN5bXB0b3RpY1NURF91c2ltMyA8LSBzcXJ0KEFzeW1wdG90aWNWYXJpYW5jZShwX3VzaW0zLCBuX3VzaW0pKS9sb2coaykKeF91c2ltMyA9IHJub3JtKG4gPSAxMDAwMCwgbWVhbiA9IEFzeW1wdG90aWNNZWFuX3VzaW0zLCBzZCA9IEFzeW1wdG90aWNTVERfdXNpbTMpCgpBc3ltcHRvdGljTWVhbl91c2ltNSA8LSBBc3ltcHRvdGljTWVhbihwX3VzaW01LCBrKQpBc3ltcHRvdGljU1REX3VzaW01IDwtIHNxcnQoQXN5bXB0b3RpY1ZhcmlhbmNlKHBfdXNpbTUsIG5fdXNpbSkpL2xvZyhrKQp4X3VzaW01ID0gcm5vcm0obiA9IDEwMDAwLCBtZWFuID0gQXN5bXB0b3RpY01lYW5fdXNpbTUsIHNkID0gQXN5bXB0b3RpY1NURF91c2ltNSkKCmdncGxvdCgpICsKICBnZW9tX2RlbnNpdHkoYWVzKHggPSB4X3VzaW0zKSwga2VybmVsPSJlcGFuZWNobmlrb3YiLCBhbHBoYT0uMywgY29sb3IgPSAiYmx1ZSIsIGZpbGwgPSAiYmx1ZSIpICsKICBnZW9tX2RlbnNpdHkoYWVzKHggPSB4X3VzaW01KSwga2VybmVsPSJlcGFuZWNobmlrb3YiLCBhbHBoYT0uMywgY29sb3IgPSAicmVkIiwgZmlsbCA9ICJyZWQiKSArCiAgZ2VvbV92bGluZShhZXMoeGludGVyY2VwdD1IX3VzaW1fMywgY29sb3IgPSAiYmx1ZSIpKSArCiAgZ2VvbV92bGluZShhZXMoeGludGVyY2VwdD1IX3VzaW1fNSwgY29sb3IgPSAicmVkIikpICsKICB4bGFiKGV4cHJlc3Npb24oaXRhbGljKEgpKSkgKyB5bGFiKCIiKSArCiAgZ2d0aXRsZShwYXN0ZTAoIk4gPSAiLCBuX3VzaW0pKSArCiAgc2NhbGVfY29sb3JfbWFudWFsKG5hbWUgPSAiQcOnw7VlcyIsIHZhbHVlcyA9IGMoImJsdWUiLCAicmVkIiksIGxhYmVscz1jKCJVU0lNMyIsICJVU0lNNSIpKSArCiAgdGhlbWVfZmV3KGJhc2Vfc2l6ZSA9IDEyLCBiYXNlX2ZhbWlseSA9ICJzZXJpZiIpICArIAogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpKQpgYGAKCiMjIyMgQW5hbGlzYW5kbyBhw6fDtWVzIGVtIGRpZmVyZW50ZXMgYW5vcyAoVXNpbWluYXMgLSBibHVlIGNoaXApCgpgYGB7cn0KdXNpbV8zXzEgPSB1c2ltM1syNzI5OjI5NzcsXQp1c2ltXzNfMiA9IHVzaW01WzE5ODc6MjIzMixdCm5fdXNpbSA9IGRpbSh1c2ltXzNfMilbMV0KCnBfdXNpbV8zXzEgPC0gYmFuZHQucG9tcGUodW5saXN0KHVzaW1fM18xWyJDbG9zZSJdKSwgRCwgVGF1KQpIX3VzaW1fM18xIDwtIHNoYW5ub24uZW50cm9weS5ub3JtYWxpemVkKHBfdXNpbV8zXzEpCiAgCnBfdXNpbV8zXzIgPC0gYmFuZHQucG9tcGUodW5saXN0KHVzaW1fNVsiQ2xvc2UiXSksIEQsIFRhdSkKSF91c2ltXzNfMiA8LSBzaGFubm9uLmVudHJvcHkubm9ybWFsaXplZChwX3VzaW1fM18yKQoKQXN5bXB0b3RpY01lYW5fdXNpbV8zXzEgPC0gQXN5bXB0b3RpY01lYW4ocF91c2ltXzNfMSwgaykKQXN5bXB0b3RpY1NURF91c2ltXzNfMSA8LSBzcXJ0KEFzeW1wdG90aWNWYXJpYW5jZShwX3VzaW1fM18xLCBuX3VzaW0pKS9sb2coaykKeF91c2ltXzNfMSA9IHJub3JtKG4gPSAxMDAwMCwgbWVhbiA9IEFzeW1wdG90aWNNZWFuX3VzaW1fM18xLCBzZCA9IEFzeW1wdG90aWNTVERfdXNpbV8zXzEpCgpBc3ltcHRvdGljTWVhbl91c2ltXzNfMiA8LSBBc3ltcHRvdGljTWVhbihwX3VzaW1fM18yLCBrKQpBc3ltcHRvdGljU1REX3VzaW1fM18yIDwtIHNxcnQoQXN5bXB0b3RpY1ZhcmlhbmNlKHBfdXNpbV8zXzIsIG5fdXNpbSkpL2xvZyhrKQp4X3VzaW1fM18yID0gcm5vcm0obiA9IDEwMDAwLCBtZWFuID0gQXN5bXB0b3RpY01lYW5fdXNpbV8zXzIsIHNkID0gQXN5bXB0b3RpY1NURF91c2ltXzNfMikKCmdncGxvdCgpICsKICBnZW9tX2RlbnNpdHkoYWVzKHggPSB4X3VzaW1fM18xKSwga2VybmVsPSJlcGFuZWNobmlrb3YiLCBhbHBoYT0uMywgY29sb3IgPSAiYmx1ZSIsIGZpbGwgPSAiYmx1ZSIpICsKICBnZW9tX2RlbnNpdHkoYWVzKHggPSB4X3VzaW1fM18yKSwga2VybmVsPSJlcGFuZWNobmlrb3YiLCBhbHBoYT0uMywgY29sb3IgPSAicmVkIiwgZmlsbCA9ICJyZWQiKSArCiAgZ2VvbV92bGluZShhZXMoeGludGVyY2VwdD1IX3VzaW1fM18xLCBjb2xvciA9ICJibHVlIikpICsKICBnZW9tX3ZsaW5lKGFlcyh4aW50ZXJjZXB0PUhfdXNpbV8zXzIsIGNvbG9yID0gInJlZCIpKSArCiAgeGxhYihleHByZXNzaW9uKGl0YWxpYyhIKSkpICsgeWxhYigiIikgKwogIHNjYWxlX2NvbG9yX21hbnVhbChuYW1lID0gIkHDp8O1ZXMiLCB2YWx1ZXMgPSBjKCJibHVlIiwgInJlZCIpLCBsYWJlbHM9YygiVVNJTTMgKDIwMjEtMjAyMikiLCAiVVNJTTMgKDIwMTgtMjAxOSkiKSkgKwogIHRoZW1lX2ZldyhiYXNlX3NpemUgPSAxMiwgYmFzZV9mYW1pbHkgPSAic2VyaWYiKSAgKyAKICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkKYGBgCmBgYHtyfQp1c2ltXzNfMSA9IHVzaW0zWzI3Mjk6Mjk3NyxdCnVzaW1fM18yID0gdXNpbTVbMjQ4MToyNzI4LF0Kbl91c2ltID0gZGltKHVzaW1fM18yKVsxXQoKcF91c2ltXzNfMSA8LSBiYW5kdC5wb21wZSh1bmxpc3QodXNpbV8zXzFbIkNsb3NlIl0pLCBELCBUYXUpCkhfdXNpbV8zXzEgPC0gc2hhbm5vbi5lbnRyb3B5Lm5vcm1hbGl6ZWQocF91c2ltXzNfMSkKICAKcF91c2ltXzNfMiA8LSBiYW5kdC5wb21wZSh1bmxpc3QodXNpbV81WyJDbG9zZSJdKSwgRCwgVGF1KQpIX3VzaW1fM18yIDwtIHNoYW5ub24uZW50cm9weS5ub3JtYWxpemVkKHBfdXNpbV8zXzIpCgpBc3ltcHRvdGljTWVhbl91c2ltXzNfMSA8LSBBc3ltcHRvdGljTWVhbihwX3VzaW1fM18xLCBrKQpBc3ltcHRvdGljU1REX3VzaW1fM18xIDwtIHNxcnQoQXN5bXB0b3RpY1ZhcmlhbmNlKHBfdXNpbV8zXzEsIG5fdXNpbSkpL2xvZyhrKQp4X3VzaW1fM18xID0gcm5vcm0obiA9IDEwMDAwLCBtZWFuID0gQXN5bXB0b3RpY01lYW5fdXNpbV8zXzEsIHNkID0gQXN5bXB0b3RpY1NURF91c2ltXzNfMSkKCkFzeW1wdG90aWNNZWFuX3VzaW1fM18yIDwtIEFzeW1wdG90aWNNZWFuKHBfdXNpbV8zXzIsIGspCkFzeW1wdG90aWNTVERfdXNpbV8zXzIgPC0gc3FydChBc3ltcHRvdGljVmFyaWFuY2UocF91c2ltXzNfMiwgbl91c2ltKSkvbG9nKGspCnhfdXNpbV8zXzIgPSBybm9ybShuID0gMTAwMDAsIG1lYW4gPSBBc3ltcHRvdGljTWVhbl91c2ltXzNfMiwgc2QgPSBBc3ltcHRvdGljU1REX3VzaW1fM18yKQoKZ2dwbG90KCkgKwogIGdlb21fZGVuc2l0eShhZXMoeCA9IHhfdXNpbV8zXzEpLCBrZXJuZWw9ImVwYW5lY2huaWtvdiIsIGFscGhhPS4zLCBjb2xvciA9ICJibHVlIiwgZmlsbCA9ICJibHVlIikgKwogIGdlb21fZGVuc2l0eShhZXMoeCA9IHhfdXNpbV8zXzIpLCBrZXJuZWw9ImVwYW5lY2huaWtvdiIsIGFscGhhPS4zLCBjb2xvciA9ICJyZWQiLCBmaWxsID0gInJlZCIpICsKICBnZW9tX3ZsaW5lKGFlcyh4aW50ZXJjZXB0PUhfdXNpbV8zXzEsIGNvbG9yID0gImJsdWUiKSkgKwogIGdlb21fdmxpbmUoYWVzKHhpbnRlcmNlcHQ9SF91c2ltXzNfMiwgY29sb3IgPSAicmVkIikpICsKICB4bGFiKGV4cHJlc3Npb24oaXRhbGljKEgpKSkgKyB5bGFiKCIiKSArCiAgc2NhbGVfY29sb3JfbWFudWFsKG5hbWUgPSAiQcOnw7VlcyIsIHZhbHVlcyA9IGMoImJsdWUiLCAicmVkIiksIGxhYmVscz1jKCJVU0lNMyAoMjAyMS0yMDIyKSIsICJVU0lNMyAoMjAyMC0yMDIxKSIpKSArCiAgdGhlbWVfZmV3KGJhc2Vfc2l6ZSA9IDEyLCBiYXNlX2ZhbWlseSA9ICJzZXJpZiIpICArIAogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpKQpgYGAKCgojIyMgQW7DoWxpc2UgZGUgc2VxdcOqbmNpYXMgZG8gc2V0b3IgZmluYW5jZWlybyAoYmx1ZSBjaGlwcykKCmBgYHtyfQpiYmFzMyA9IHJlYWQuY3N2KCIuLi8uLi9EYXRhL1Ivc3RvY2sgbWFya2V0cy9CQkFTMy5TQS5jc3YiKQpiYmRjNCA9IHJlYWQuY3N2KCIuLi8uLi9EYXRhL1Ivc3RvY2sgbWFya2V0cy9CQkRDNC5TQS5jc3YiKQppdHViNCA9IHJlYWQuY3N2KCIuLi8uLi9EYXRhL1Ivc3RvY2sgbWFya2V0cy9JVFVCNC5TQS5jc3YiKQpgYGAKCmBgYHtyfQpiYmFzMyA9IGJiYXMzWzI3Mjk6Mjk3NyxdCmJiZGM0ID0gYmJkYzRbMjcyOToyOTc3LF0KaXR1YjQgPSBpdHViNFsyNzI5OjI5NzcsXQpuID0gZGltKGl0dWI0KVsxXQoKcF9iYmFzMyA8LSBiYW5kdC5wb21wZSh1bmxpc3QoYmJhczNbIkNsb3NlIl0pLCBELCBUYXUpCkhfYmJhczMgPC0gc2hhbm5vbi5lbnRyb3B5Lm5vcm1hbGl6ZWQocF9iYmFzMykKCnBfYmJkYzQgPC0gYmFuZHQucG9tcGUodW5saXN0KGJiZGM0WyJDbG9zZSJdKSwgRCwgVGF1KQpIX2JiZGM0IDwtIHNoYW5ub24uZW50cm9weS5ub3JtYWxpemVkKHBfYmJkYzQpCgpwX2l0dWI0IDwtIGJhbmR0LnBvbXBlKHVubGlzdChpdHViNFsiQ2xvc2UiXSksIEQsIFRhdSkKSF9pdHViNCA8LSBzaGFubm9uLmVudHJvcHkubm9ybWFsaXplZChwX2l0dWI0KQoKQXN5bXB0b3RpY01lYW5fYmJhczMgPC0gQXN5bXB0b3RpY01lYW4ocF9iYmFzMywgaykKQXN5bXB0b3RpY1NURF9iYmFzMyA8LSBzcXJ0KEFzeW1wdG90aWNWYXJpYW5jZShwX2JiYXMzLCBuKSkvbG9nKGspCnhfYmJhczMgPSBybm9ybShuID0gMTAwMDAsIG1lYW4gPSBBc3ltcHRvdGljTWVhbl9iYmFzMywgc2QgPSBBc3ltcHRvdGljU1REX2JiYXMzKQoKQXN5bXB0b3RpY01lYW5fYmJkYzQgPC0gQXN5bXB0b3RpY01lYW4ocF9iYmRjNCwgaykKQXN5bXB0b3RpY1NURF9iYmRjNCA8LSBzcXJ0KEFzeW1wdG90aWNWYXJpYW5jZShwX2JiZGM0LCBuKSkvbG9nKGspCnhfYmJkYzQgPSBybm9ybShuID0gMTAwMDAsIG1lYW4gPSBBc3ltcHRvdGljTWVhbl9iYmRjNCwgc2QgPSBBc3ltcHRvdGljU1REX2JiZGM0KQoKQXN5bXB0b3RpY01lYW5faXR1YjQgPC0gQXN5bXB0b3RpY01lYW4ocF9pdHViNCwgaykKQXN5bXB0b3RpY1NURF9pdHViNCA8LSBzcXJ0KEFzeW1wdG90aWNWYXJpYW5jZShwX2l0dWI0LCBuKSkvbG9nKGspCnhfaXR1YjQgPSBybm9ybShuID0gMTAwMDAsIG1lYW4gPSBBc3ltcHRvdGljTWVhbl9pdHViNCwgc2QgPSBBc3ltcHRvdGljU1REX2l0dWI0KQoKZ2dwbG90KCkgKwogIGdlb21fZGVuc2l0eShhZXMoeCA9IHhfYmJhczMpLCBrZXJuZWw9ImVwYW5lY2huaWtvdiIsIGFscGhhPS4zLCBjb2xvciA9ICJibHVlIiwgZmlsbCA9ICJibHVlIikgKwogIGdlb21fZGVuc2l0eShhZXMoeCA9IHhfYmJkYzQpLCBrZXJuZWw9ImVwYW5lY2huaWtvdiIsIGFscGhhPS4zLCBjb2xvciA9ICJyZWQiLCBmaWxsID0gInJlZCIpICsKICBnZW9tX2RlbnNpdHkoYWVzKHggPSB4X2l0dWI0KSwga2VybmVsPSJlcGFuZWNobmlrb3YiLCBhbHBoYT0uMywgY29sb3IgPSAib3JhbmdlIiwgZmlsbCA9ICJvcmFuZ2UiKSArCiAgZ2VvbV92bGluZShhZXMoeGludGVyY2VwdD1IX2JiYXMzLCBjb2xvciA9ICJibHVlIikpICsKICBnZW9tX3ZsaW5lKGFlcyh4aW50ZXJjZXB0PUhfYmJkYzQsIGNvbG9yID0gInJlZCIpKSArCiAgZ2VvbV92bGluZShhZXMoeGludGVyY2VwdD1IX2l0dWI0LCBjb2xvciA9ICJvcmFuZ2UiKSkgKwogIHhsYWIoZXhwcmVzc2lvbihpdGFsaWMoSCkpKSArIHlsYWIoIiIpICsKICBnZ3RpdGxlKCIyMDIxLTIwMjIiKSArCiAgc2NhbGVfY29sb3JfbWFudWFsKG5hbWUgPSAiQcOnw7VlcyIsIHZhbHVlcyA9IGMoImJsdWUiLCAicmVkIiwgIm9yYW5nZSIpLCBsYWJlbHM9YygiYmJhczMiLCAiYmJkYzQiLCAiaXR1YjQiKSkgKwogIHRoZW1lX2ZldyhiYXNlX3NpemUgPSAxMiwgYmFzZV9mYW1pbHkgPSAic2VyaWYiKSAgKyAKICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkKCmBgYAoKIyMjIEFuw6FsaXNlIGRlIHNlcXXDqm5jaWFzIGRvIHNldG9yIGZpbmFuY2Vpcm8gKGJsdWUgY2hpcHMgJiBzbWFsbCBjYXBzKQoKYGBge3J9CmJtZ2I0ID0gcmVhZC5jc3YoIi4uLy4uL0RhdGEvUi9zdG9jayBtYXJrZXRzL0JNR0I0LlNBLmNzdiIpWzI0Nzo0OTQsXQpicnNyNiA9IHJlYWQuY3N2KCIuLi8uLi9EYXRhL1Ivc3RvY2sgbWFya2V0cy9CUlNSNi5TQS5jc3YiKVsyNzI5OjI5NzcsXQpuID0gZGltKGJyc3I2KVsxXQpgYGAKCmBgYHtyfQpwX2JtZ2I0IDwtIGJhbmR0LnBvbXBlKHVubGlzdChibWdiNFsiQ2xvc2UiXSksIEQsIFRhdSkKSF9ibWdiNCA8LSBzaGFubm9uLmVudHJvcHkubm9ybWFsaXplZChwX2JtZ2I0KQoKcF9icnNyNiA8LSBiYW5kdC5wb21wZSh1bmxpc3QoYnJzcjZbIkNsb3NlIl0pLCBELCBUYXUpCkhfYnJzcjYgPC0gc2hhbm5vbi5lbnRyb3B5Lm5vcm1hbGl6ZWQocF9icnNyNikKCkFzeW1wdG90aWNNZWFuX2JtZ2I0IDwtIEFzeW1wdG90aWNNZWFuKHBfYm1nYjQsIGspCkFzeW1wdG90aWNTVERfYm1nYjQgPC0gc3FydChBc3ltcHRvdGljVmFyaWFuY2UocF9ibWdiNCwgbikpL2xvZyhrKQp4X2JtZ2I0ID0gcm5vcm0obiA9IDEwMDAwLCBtZWFuID0gQXN5bXB0b3RpY01lYW5fYm1nYjQsIHNkID0gQXN5bXB0b3RpY1NURF9ibWdiNCkKCkFzeW1wdG90aWNNZWFuX2Jyc3I2IDwtIEFzeW1wdG90aWNNZWFuKHBfYnJzcjYsIGspCkFzeW1wdG90aWNTVERfYnJzcjYgPC0gc3FydChBc3ltcHRvdGljVmFyaWFuY2UocF9icnNyNiwgbikpL2xvZyhrKQp4X2Jyc3I2ID0gcm5vcm0obiA9IDEwMDAwLCBtZWFuID0gQXN5bXB0b3RpY01lYW5fYnJzcjYsIHNkID0gQXN5bXB0b3RpY1NURF9icnNyNikKCmdncGxvdCgpICsKICBnZW9tX2RlbnNpdHkoYWVzKHggPSB4X2JtZ2I0KSwga2VybmVsPSJlcGFuZWNobmlrb3YiLCBhbHBoYT0uMywgY29sb3IgPSAiYmx1ZSIsIGZpbGwgPSAiYmx1ZSIpICsKICBnZW9tX2RlbnNpdHkoYWVzKHggPSB4X2Jyc3I2KSwga2VybmVsPSJlcGFuZWNobmlrb3YiLCBhbHBoYT0uMywgY29sb3IgPSAiZ3JheSIsIGZpbGwgPSAiZ3JheSIpICsKICBnZW9tX2RlbnNpdHkoYWVzKHggPSB4X2JiYXMzKSwga2VybmVsPSJlcGFuZWNobmlrb3YiLCBhbHBoYT0uMywgY29sb3IgPSAiZ3JlZW4iLCBmaWxsID0gImdyZWVuIikgKwogIGdlb21fZGVuc2l0eShhZXMoeCA9IHhfYmJkYzQpLCBrZXJuZWw9ImVwYW5lY2huaWtvdiIsIGFscGhhPS4zLCBjb2xvciA9ICJyZWQiLCBmaWxsID0gInJlZCIpICsKICBnZW9tX2RlbnNpdHkoYWVzKHggPSB4X2l0dWI0KSwga2VybmVsPSJlcGFuZWNobmlrb3YiLCBhbHBoYT0uMywgY29sb3IgPSAib3JhbmdlIiwgZmlsbCA9ICJvcmFuZ2UiKSArCiAgZ2VvbV92bGluZShhZXMoeGludGVyY2VwdD1IX2JiYXMzLCBjb2xvciA9ICJibHVlIikpICsKICBnZW9tX3ZsaW5lKGFlcyh4aW50ZXJjZXB0PUhfYmJkYzQsIGNvbG9yID0gImdyYXkiKSkgKwogIGdlb21fdmxpbmUoYWVzKHhpbnRlcmNlcHQ9SF9ibWdiNCwgY29sb3IgPSAiZ3JlZW4iKSkgKwogIGdlb21fdmxpbmUoYWVzKHhpbnRlcmNlcHQ9SF9icnNyNiwgY29sb3IgPSAicmVkIikpICsKICBnZW9tX3ZsaW5lKGFlcyh4aW50ZXJjZXB0PUhfaXR1YjQsIGNvbG9yID0gIm9yYW5nZSIpKSArCiAgeGxhYihleHByZXNzaW9uKGl0YWxpYyhIKSkpICsgeWxhYigiIikgKwogIGdndGl0bGUoIjIwMjEtMjAyMiIpICsKICBzY2FsZV9jb2xvcl9tYW51YWwobmFtZSA9ICJBw6fDtWVzIiwgdmFsdWVzID0gYygiYmx1ZSIsICJncmF5IiwgImdyZWVuIiwgInJlZCIsICJvcmFuZ2UiKSwgbGFiZWxzPWMoImJtZ2I0IiwgImJyc3I2IiwgImJiYXMzIiwgImJiZGM0IiwgIml0dWI0IikpICsKICB0aGVtZV9mZXcoYmFzZV9zaXplID0gMTIsIGJhc2VfZmFtaWx5ID0gInNlcmlmIikgICsgCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpCmBgYAoKIyMjIEFuw6FsaXNlIGRlIGHDp8O1ZXMgZGUgZGlmZXJlbnRlIHNldG9yZXMgKGJsdWUgY2hpcHMpCgpgYGB7cn0KZ2dwbG90KCkgKwogIGdlb21fZGVuc2l0eShhZXMoeCA9IHhfdXNpbTMpLCBrZXJuZWw9ImVwYW5lY2huaWtvdiIsIGFscGhhPS4zLCBjb2xvciA9ICJncmF5IiwgZmlsbCA9ICJncmF5IikgKwogIGdlb21fZGVuc2l0eShhZXMoeCA9IHhfdXNpbTUpLCBrZXJuZWw9ImVwYW5lY2huaWtvdiIsIGFscGhhPS4zLCBjb2xvciA9ICJibHVlIiwgZmlsbCA9ICJibHVlIikgKwogIGdlb21fdmxpbmUoYWVzKHhpbnRlcmNlcHQ9SF91c2ltXzMsIGNvbG9yID0gImdyYXkiKSkgKwogIGdlb21fdmxpbmUoYWVzKHhpbnRlcmNlcHQ9SF91c2ltXzUsIGNvbG9yID0gImJsdWUiKSkgKwogIAogIGdlb21fZGVuc2l0eShhZXMoeCA9IHhfYmJhczMpLCBrZXJuZWw9ImVwYW5lY2huaWtvdiIsIGFscGhhPS4zLCBjb2xvciA9ICJncmVlbiIsIGZpbGwgPSAiZ3JlZW4iKSArCiAgZ2VvbV9kZW5zaXR5KGFlcyh4ID0geF9iYmRjNCksIGtlcm5lbD0iZXBhbmVjaG5pa292IiwgYWxwaGE9LjMsIGNvbG9yID0gInJlZCIsIGZpbGwgPSAicmVkIikgKwogIGdlb21fZGVuc2l0eShhZXMoeCA9IHhfaXR1YjQpLCBrZXJuZWw9ImVwYW5lY2huaWtvdiIsIGFscGhhPS4zLCBjb2xvciA9ICJvcmFuZ2UiLCBmaWxsID0gIm9yYW5nZSIpICsKICBnZW9tX3ZsaW5lKGFlcyh4aW50ZXJjZXB0PUhfYmJhczMsIGNvbG9yID0gImdyZWVuIikpICsKICBnZW9tX3ZsaW5lKGFlcyh4aW50ZXJjZXB0PUhfYmJkYzQsIGNvbG9yID0gInJlZCIpKSArCiAgZ2VvbV92bGluZShhZXMoeGludGVyY2VwdD1IX2l0dWI0LCBjb2xvciA9ICJvcmFuZ2UiKSkgKwogIAogIHhsYWIoZXhwcmVzc2lvbihpdGFsaWMoSCkpKSArIHlsYWIoIiIpICsKICBnZ3RpdGxlKHBhc3RlMCgiTiA9ICIsIG4pKSArCiAgc2NhbGVfY29sb3JfbWFudWFsKG5hbWUgPSAiQcOnw7VlcyIsIHZhbHVlcyA9IGMoImJsdWUiLCAiZ3JheSIsICJncmVlbiIsICJyZWQiLCAib3JhbmdlIiksIGxhYmVscz1jKCJ1c2ltNSIsICJ1c2ltMyIsICJiYmFzMyIsICJiYmRjNCIsICJpdHViNCIpKSArCiAgdGhlbWVfZmV3KGJhc2Vfc2l6ZSA9IDEyLCBiYXNlX2ZhbWlseSA9ICJzZXJpZiIpICArIAogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpKQpgYGAKCiMjIyBBbsOhbGlzZSBkZSBzZXF1w6puY2lhcyBkbyBzZXRvciBkZSBjb21wYW5oaWEgw6FlcmVhIChTbWFsbCBDYXBzKQoKYGBge3J9CmdvbGw0ID0gcmVhZC5jc3YoIi4uLy4uL0RhdGEvUi9zdG9jayBtYXJrZXRzL0dPTEw0LlNBLmNzdiIpWzI3Mjk6Mjk3NyxdCmF6dWw0ID0gcmVhZC5jc3YoIi4uLy4uL0RhdGEvUi9zdG9jayBtYXJrZXRzL0FaVUw0LlNBLmNzdiIpWzk5NjoxMjQ0LF0KCnBfZ29sbDQgPC0gYmFuZHQucG9tcGUodW5saXN0KGdvbGw0WyJDbG9zZSJdKSwgRCwgVGF1KQpIX2dvbGw0IDwtIHNoYW5ub24uZW50cm9weS5ub3JtYWxpemVkKHBfZ29sbDQpCgpwX2F6dWw0IDwtIGJhbmR0LnBvbXBlKHVubGlzdChhenVsNFsiQ2xvc2UiXSksIEQsIFRhdSkKSF9henVsNCA8LSBzaGFubm9uLmVudHJvcHkubm9ybWFsaXplZChwX2F6dWw0KQoKQXN5bXB0b3RpY01lYW5fZ29sbDQgPC0gQXN5bXB0b3RpY01lYW4ocF9nb2xsNCwgaykKQXN5bXB0b3RpY1NURF9nb2xsNCA8LSBzcXJ0KEFzeW1wdG90aWNWYXJpYW5jZShwX2dvbGw0LCBuKSkvbG9nKGspCnhfZ29sbDQgPSBybm9ybShuID0gMTAwMDAsIG1lYW4gPSBBc3ltcHRvdGljTWVhbl9nb2xsNCwgc2QgPSBBc3ltcHRvdGljU1REX2dvbGw0KQoKQXN5bXB0b3RpY01lYW5fYXp1bDQgPC0gQXN5bXB0b3RpY01lYW4ocF9henVsNCwgaykKQXN5bXB0b3RpY1NURF9henVsNCA8LSBzcXJ0KEFzeW1wdG90aWNWYXJpYW5jZShwX2F6dWw0LCBuKSkvbG9nKGspCnhfYXp1bDQgPSBybm9ybShuID0gMTAwMDAsIG1lYW4gPSBBc3ltcHRvdGljTWVhbl9henVsNCwgc2QgPSBBc3ltcHRvdGljU1REX2F6dWw0KQoKZ2dwbG90KCkgKwogIGdlb21fZGVuc2l0eShhZXMoeCA9IHhfZ29sbDQpLCBrZXJuZWw9ImVwYW5lY2huaWtvdiIsIGFscGhhPS4zLCBjb2xvciA9ICJvcmFuZ2UiLCBmaWxsID0gIm9yYW5nZSIpICsKICBnZW9tX2RlbnNpdHkoYWVzKHggPSB4X2F6dWw0KSwga2VybmVsPSJlcGFuZWNobmlrb3YiLCBhbHBoYT0uMywgY29sb3IgPSAiYmx1ZSIsIGZpbGwgPSAiYmx1ZSIpICsKICBnZW9tX3ZsaW5lKGFlcyh4aW50ZXJjZXB0PUhfZ29sbDQsIGNvbG9yID0gIm9yYW5nZSIpKSArCiAgZ2VvbV92bGluZShhZXMoeGludGVyY2VwdD1IX2F6dWw0LCBjb2xvciA9ICJibHVlIikpICsKICB4bGFiKGV4cHJlc3Npb24oaXRhbGljKEgpKSkgKyB5bGFiKCIiKSArCiAgZ2d0aXRsZSgiMjAyMS0yMDIyIikgKwogIHNjYWxlX2NvbG9yX21hbnVhbChuYW1lID0gIkHDp8O1ZXMiLCB2YWx1ZXMgPSBjKCJvcmFuZ2UiLCAiYmx1ZSIpLCBsYWJlbHM9YygiZ29sbCIsICJhenVsIikpICsKICB0aGVtZV9mZXcoYmFzZV9zaXplID0gMTIsIGJhc2VfZmFtaWx5ID0gInNlcmlmIikgICsgCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpCgpgYGAKCg==