1 Funções para calcular os índices de dominância

\(D_1\)

Índice de dominância \(D_1\): \[D1 = \text{Norm}(HHI) = \frac{k \sum_{i=1}^{k} p_i^2 - 1}{k - 1}\]

D1 <- function(x){
  n <- length(x) # numero total de vendas
  prop <- table(x)/n # participacoes de mercado
  k <- length(prop) # numero de empresas
  
  HHI <- sum(prop^2) # indice de Herfindahl–Hirschman
  
  D1 <- (k*HHI - 1)/(k-1)
  return(D1)
}

\(D_2\)

Índice de Rosenbluth–Hall–Tidemann: \[\begin{align*} I_{\text{Ros}} &= \frac{1}{2\sum_{i=1}^{k} i\,p_{(i)} - 1} \end{align*}\]

Índice de dominância \(D_2\): \[\begin{align*} D_2 &= \frac{I_{\text{Ros}} - 1/k}{1- \frac{1}{k}} \\ &= \frac{k I_{\text{Ros}} - 1}{k - 1}. \end{align*}\]

D2 <- function(x){
  n <- length(x) # total de vendas
  prop <- table(x)/n # participacoes de mercado
  prop_O <- sort(prop, decreasing = T) # participacoes de mercado ordenadas
  pesos <- seq_along(prop_O) # indices das participacoes de mercado ordenadas
  k <- length(prop) # numero de empresas
  
  Iros <- 1/(2*sum(pesos*prop_O) - 1) # indice de Rosenbluth–Hall–Tidemann
  
  D2 <- (k*Iros - 1)/(k - 1)
  return(D2)
}

\(D_3\)

Entropia de Shannon: \[\begin{align*} H_s = -\sum_{i=1}^{k}p_i\ln p_i. \end{align*} \]

Índice de dominância \(D_3\): \[\begin{align*} D_3 &= 1 - \text{Norm}(H_s) \\ &= 1 - \frac{H_s}{\ln k} \end{align*}\]

D3 <- function(x){
  n <- length(x) # total de vendas
  prop <- table(x)/n # participacoes de mercado
  k <- length(prop) # numero de empresas
  
  Hs <- -sum(prop*log(prop)) # entropia de shannon
  HsNorm <- Hs/log(k) # entropia de shannon normalizada
  
  D3 <- 1 - HsNorm
  return(D3)
}

\(D_4\)

Índice de Heip: \[\begin{align*} I_{\text{Heip}} &= \frac{e^{H_S} - 1}{k - 1}, \end{align*}\]

Índice de dominância \(D_4\): \[\begin{align*} D_4 &= 1 - I_{\text{Heip}} \\ &= \frac{k - e^{H_S}}{k - 1} \end{align*}\]

D4 <- function(x){
  n <- length(x) # total de vendas
  prop <- table(x)/n # participacoes de mercado
  k <- length(prop) # numero de empresas
  
  Hs <- -sum(prop*log(prop)) # entropia de shannon
  Iheip <- (exp(Hs) - 1)/(k - 1) # indice de Heip
  
  D4 <- 1 - Iheip
  return(D4)
}

\(D_5\)

Índice de Hannah-Kay: \[\begin{align*} I_{HK}(\alpha) &= \left( \sum_{i=1}^{k} p_i^\alpha \right)^{\frac{1}{1-\alpha}}, \quad \alpha>0, \alpha \neq 1. \end{align*}\]

Índice de dominância \(D_5\): \[\begin{align*} D_5 &= \frac{k - I_{HK}(2)}{k - 1} \end{align*}\]

D5 <- function(x){
  n <- length(x) # total de vendas
  prop <- table(x)/n # participacoes de mercado
  k <- length(prop) # numero de empresas
  
  Ihk <- sum(prop^2)^(-1) # indice de Hannah-Kay
  
  D5 <- (k - Ihk)/(k-1)
  return(D5)
}

\(D_6\)

Estatística \(VA\): \[\begin{align*} VA &= 1 - \frac{\displaystyle \sum_{i=1}^{k} \left(f_i - \frac{n}{k}\right)^2} {n^2 \frac{(k-1)}{k}}, \end{align*}\]

Índice de dominância \(D_6\): \[\begin{align*} D_6 &= 1 - VA\\ &= \frac{k}{k-1} \left( \sum_{i=1}^{k} p_i^2 - \frac{1}{k} \right) \end{align*}\]

D6 <- function(x){
  n <- length(x) # total de vendas
  tab <- table(x) # participacoes de mercado
  k <- length(tab) # numero de empresas
  
  VA <- 1 - ( sum( (tab - (n/k))^2 )/( ( (n^2)*(k-1) )/k ) ) # estatistica VA
  
  D6 <- 1 - VA
  return(D6)
}

\(D_7\)

Estatística \(SDA\): \[\begin{align*} SDA &= 1 - \sqrt{\frac{\displaystyle \sum_{i=1}^{k} \left(f_i - \frac{n}{k}\right)^2} {n^2 \frac{(k-1)}{k}}} \end{align*}\]

Indice de dominância \(D_7\): \[\begin{align*} D_7 &= 1 - SDA \\[6pt] &= \sqrt{\frac{k}{k-1} \left(\sum_{i=1}^{k} p_i^2 - \frac{1}{k}\right)} \end{align*}\]

D7 <- function(x){
  n <- length(x) # total de vendas
  tab <- table(x) # participacoes de mercado
  k <- length(tab) # numero de empresas
  
  SDA <- 1 - sqrt( sum( (tab - (n/k))^2 )/( ( (n^2)*(k-1) )/k ) ) # estatistica SDA
  
  D7 <- 1 - SDA
  return(D7)
}

2 Simulação para os 18 casos

Caso 1

Configuração do primeiro caso com \(n=1000\)

emp <- c("1", "2", "3", "4") # empresas
p <- c(0.24, 0.26, 0.255, 0.245) # participacoes de mercado
k <- length(emp) # numero de empresas


n <- 1000 # numero de elementos de cada amostra
N <- 1000 # numero de amostras

Cálculo dos índices de dominância teóricos

# Indices de dominancia teoricos:

D1_T <- (k*sum(p^2) -1)/(k-1) # indice de Herfindahl–Hirschmann normalizado

p_O <- sort(p, decreasing = T)
pesos <- seq_along(p_O)
Iros <- 1/(2*sum(pesos*p_O)-1)
D2_T <- (k*Iros - 1)/(k-1) # indice de Rosenbluth–Hall–Tidemann normalizado

Hs <- -sum(p*log(p))
D3_T <- 1 - Hs/log(k) # indice de Shannon normalizado

Iheip <- (exp(Hs) - 1)/(k - 1)
D4_T <- 1 - Iheip # indice de Heip

Ihk <- sum(p^2)^(-1)
D5_T <- (k - Ihk)/(k-1) # indice de Hannah-Kay

VA <- 1 - ( sum(( (n*p) - (n/k) )^2) / (( (n^2)*(k-1) )/k) )
D6_T <- 1 - VA

SDA <- 1 - sqrt( sum(( (n*p) - (n/k) )^2) / (( (n^2)*(k-1) )/k) )
D7_T <- 1 - SDA

cat(D1_T, D2_T, D3_T, D4_T, D5_T, D6_T, D7_T)
## 0.0003333333 0.005937235 0.0003607556 0.0006666512 0.001332001 0.0003333333 0.01825742

Simulação

# iniciando com n = 1000

m1 <- matrix(0, nrow <- n, ncol <- N) # matiz que vai receber as amostras
d1 <- matrix(0, nrow <- N, ncol <- 7) # guarda os indices de dominancia

set.seed(123)
for (i in 1:N){
  a <- sample(emp, size = n, replace = T, prob = p) # gera uma amostra
  m1[,i] <- a # cada coluna da matriz vai ser uma amostra
  
  d1[i, 1] <- D1(a) # cada coluna de d1 recebe um indice de dominancia
  d1[i, 2] <- D2(a)
  d1[i, 3] <- D3(a)
  d1[i, 4] <- D4(a)
  d1[i, 5] <- D5(a)
  d1[i, 6] <- D6(a)
  d1[i, 7] <- D7(a)
}

Teste de Jarque-Bera para normalidade

Teste de normalidade para cada conjunto dos índices calculados:

install.packages("tseries")
library(tseries) # pra fazer o teste de Jarque-Bera
# Testando normalidade

alpha <- 0.05 # nivel de significancia

result_teste <- matrix(0, ncol = 7, nrow = 1) # vai guardar o resultado dos testes
colnames(result_teste) <- c("D1", "D2", "D3", "D4", "D5", "D6", "D7")

par(mfrow = c(3, 3), mar = c(3, 3, 2, 1))  # margens ajustadas
for (i in 1:7){
  hist(d1[,i], main = paste0("Histograma de D", i), col = i+1,
       xlab = paste0("D", i), ylab = "Frequência")
  teste <- jarque.bera.test(d1[,i]) # teste para normalidade
  result_teste[,i] <-  ifelse(teste$p.value < alpha, "rej", "ñ rej")
}
result_teste
##      D1    D2    D3    D4    D5    D6    D7   
## [1,] "rej" "rej" "rej" "rej" "rej" "rej" "rej"

Cálculo do MAPE e do CV

# Calculando o MAPE (Erro Percentual Absoluto Médio)
MAPE1 <- mean((abs(D1_T - d1[,1])/D1_T)*100)
MAPE2 <- mean((abs(D2_T - d1[,2])/D2_T)*100)
MAPE3 <- mean((abs(D3_T - d1[,3])/D3_T)*100)
MAPE4 <- mean((abs(D4_T - d1[,4])/D4_T)*100)
MAPE5 <- mean((abs(D5_T - d1[,5])/D5_T)*100)
MAPE6 <- mean((abs(D6_T - d1[,6])/D6_T)*100)
MAPE7 <- mean((abs(D7_T - d1[,7])/D7_T)*100)
MAPE <- c(MAPE1, MAPE2, MAPE3, MAPE4, MAPE5, MAPE6, MAPE7)

paste0("Menor MAPE: D", which.min(MAPE), ", min = ", round(min(MAPE), 4))
## [1] "Menor MAPE: D2, min = 88.5607"
paste0("Segundo menor MAPE: D", which.min(MAPE[-which.min(MAPE)]), ", min = ", round(min(MAPE[-which.min(MAPE)]), 4))
## [1] "Segundo menor MAPE: D6, min = 91.9902"
# Calculando o CV
cv1 <- sd(d1[,1])/mean(d1[,1])
cv2 <- sd(d1[,2])/mean(d1[,2])
cv3 <- sd(d1[,3])/mean(d1[,3])
cv4 <- sd(d1[,4])/mean(d1[,4])
cv5 <- sd(d1[,5])/mean(d1[,5])
cv6 <- sd(d1[,6])/mean(d1[,6])
cv7 <- sd(d1[,7])/mean(d1[,7])
CV <- c(cv1, cv2, cv3, cv4, cv5, cv6, cv7)

paste0("Menor CV: D", which.min(CV), ", min = ", round(min(CV), 4))
## [1] "Menor CV: D7, min = 0.3958"
paste0("Segundo menor CV: D", which.min(CV[-which.min(CV)]), ", min = ", round(min(CV[-which.min(CV)]), 4))
## [1] "Segundo menor CV: D2, min = 0.4104"

Configuração do primeiro caso com \(n=3000\)

emp <- c("1", "2", "3", "4") # empresas
p <- c(0.24, 0.26, 0.255, 0.245) # participacoes de mercado
k <- length(emp) # numero de empresas


n <- 3000 # numero de elementos de cada amostra
N <- 1000 # numero de amostras

Cálculo dos índices de dominância teóricos

# Indices de dominancia teoricos:

D1_T <- (k*sum(p^2) -1)/(k-1) # indice de Herfindahl–Hirschmann normalizado

p_O <- sort(p, decreasing = T)
pesos <- seq_along(p_O)
Iros <- 1/(2*sum(pesos*p_O)-1)
D2_T <- (k*Iros - 1)/(k-1) # indice de Rosenbluth–Hall–Tidemann normalizado

Hs <- -sum(p*log(p))
D3_T <- 1 - Hs/log(k) # indice de Shannon normalizado

Iheip <- (exp(Hs) - 1)/(k - 1)
D4_T <- 1 - Iheip # indice de Heip

Ihk <- sum(p^2)^(-1)
D5_T <- (k - Ihk)/(k-1) # indice de Hannah-Kay

VA <- 1 - ( sum(( (n*p) - (n/k) )^2) / (( (n^2)*(k-1) )/k) )
D6_T <- 1 - VA

SDA <- 1 - sqrt( sum(( (n*p) - (n/k) )^2) / (( (n^2)*(k-1) )/k) )
D7_T <- 1 - SDA

cat(D1_T, D2_T, D3_T, D4_T, D5_T, D6_T, D7_T)
## 0.0003333333 0.005937235 0.0003607556 0.0006666512 0.001332001 0.0003333333 0.01825742

Simulação

m1 <- matrix(0, nrow <- n, ncol <- N) # matiz que vai receber as amostras
d1 <- matrix(0, nrow <- N, ncol <- 7) # guarda os indices de dominancia

set.seed(123)
for (i in 1:N){
  a <- sample(emp, size = n, replace = T, prob = p) # gera uma amostra
  m1[,i] <- a # cada coluna da matriz vai ser uma amostra
  
  d1[i, 1] <- D1(a) # cada coluna de d1 recebe um indice de dominancia
  d1[i, 2] <- D2(a)
  d1[i, 3] <- D3(a)
  d1[i, 4] <- D4(a)
  d1[i, 5] <- D5(a)
  d1[i, 6] <- D6(a)
  d1[i, 7] <- D7(a)
}

Teste de Jarque-Bera para normalidade

Teste de normalidade para cada conjunto dos índices calculados:

# Testando normalidade

alpha <- 0.05 # nivel de significancia

result_teste <- matrix(0, ncol = 7, nrow = 1) # vai guardar o resultado dos testes
colnames(result_teste) <- c("D1", "D2", "D3", "D4", "D5", "D6", "D7")

par(mfrow = c(3, 3), mar = c(3, 3, 2, 1))  # margens ajustadas
for (i in 1:7){
  hist(d1[,i], main = paste0("Histograma de D", i), col = i+1,
       xlab = paste0("D", i), ylab = "Frequência")
  teste <- jarque.bera.test(d1[,i]) # teste para normalidade
  result_teste[,i] <-  ifelse(teste$p.value < alpha, "rej", "ñ rej")
}
result_teste
##      D1    D2    D3    D4    D5    D6    D7   
## [1,] "rej" "rej" "rej" "rej" "rej" "rej" "rej"

Cálculo do MAPE e do CV

# Calculando o MAPE (Erro Percentual Absoluto Médio)
MAPE1 <- mean((abs(D1_T - d1[,1])/D1_T)*100)
MAPE2 <- mean((abs(D2_T - d1[,2])/D2_T)*100)
MAPE3 <- mean((abs(D3_T - d1[,3])/D3_T)*100)
MAPE4 <- mean((abs(D4_T - d1[,4])/D4_T)*100)
MAPE5 <- mean((abs(D5_T - d1[,5])/D5_T)*100)
MAPE6 <- mean((abs(D6_T - d1[,6])/D6_T)*100)
MAPE7 <- mean((abs(D7_T - d1[,7])/D7_T)*100)
MAPE <- c(MAPE1, MAPE2, MAPE3, MAPE4, MAPE5, MAPE6, MAPE7)

paste0("Menor MAPE: D", which.min(MAPE), ", min = ", round(min(MAPE), 4))
## [1] "Menor MAPE: D2, min = 44.4572"
paste0("Segundo menor MAPE: D", which.min(MAPE[-which.min(MAPE)]), ", min = ", round(min(MAPE[-which.min(MAPE)]), 4))
## [1] "Segundo menor MAPE: D6, min = 46.5756"
# Calculando o CV
cv1 <- sd(d1[,1])/mean(d1[,1])
cv2 <- sd(d1[,2])/mean(d1[,2])
cv3 <- sd(d1[,3])/mean(d1[,3])
cv4 <- sd(d1[,4])/mean(d1[,4])
cv5 <- sd(d1[,5])/mean(d1[,5])
cv6 <- sd(d1[,6])/mean(d1[,6])
cv7 <- sd(d1[,7])/mean(d1[,7])
CV <- c(cv1, cv2, cv3, cv4, cv5, cv6, cv7)

paste0("Menor CV: D", which.min(CV), ", min = ", round(min(CV), 4))
## [1] "Menor CV: D7, min = 0.3795"
paste0("Segundo menor CV: D", which.min(CV[-which.min(CV)]), ", min = ", round(min(CV[-which.min(CV)]), 4))
## [1] "Segundo menor CV: D2, min = 0.3914"

Caso 2

Configuração do segundo caso com \(n=1000\)

emp <- c("1", "2", "3", "4") # empresas
p <- c(0.85, 0.05, 0.05, 0.05) # participacoes de mercado
k <- length(emp) # numero de empresas


n <- 1000 # numero de elementos de cada amostra
N <- 1000 # numero de amostras

Cálculo dos índices de dominância teóricos

# Indices de dominancia teoricos:

D1_T <- (k*sum(p^2) -1)/(k-1) # indice de Herfindahl–Hirschmann normalizado

p_O <- sort(p, decreasing = T)
pesos <- seq_along(p_O)
Iros <- 1/(2*sum(pesos*p_O)-1)
D2_T <- (k*Iros - 1)/(k-1) # indice de Rosenbluth–Hall–Tidemann normalizado

Hs <- -sum(p*log(p))
D3_T <- 1 - Hs/log(k) # indice de Shannon normalizado

Iheip <- (exp(Hs) - 1)/(k - 1)
D4_T <- 1 - Iheip # indice de Heip

Ihk <- sum(p^2)^(-1)
D5_T <- (k - Ihk)/(k-1) # indice de Hannah-Kay

VA <- 1 - ( sum(( (n*p) - (n/k) )^2) / (( (n^2)*(k-1) )/k) )
D6_T <- 1 - VA

SDA <- 1 - sqrt( sum(( (n*p) - (n/k) )^2) / (( (n^2)*(k-1) )/k) )
D7_T <- 1 - SDA

cat(D1_T, D2_T, D3_T, D4_T, D5_T, D6_T, D7_T)
## 0.64 0.5 0.5762077 0.7335047 0.8767123 0.64 0.8

Simulação

# iniciando com n = 1000

m1 <- matrix(0, nrow <- n, ncol <- N) # matiz que vai receber as amostras
d1 <- matrix(0, nrow <- N, ncol <- 7) # guarda os indices de dominancia

set.seed(123)
for (i in 1:N){
  a <- sample(emp, size = n, replace = T, prob = p) # gera uma amostra
  m1[,i] <- a # cada coluna da matriz vai ser uma amostra
  
  d1[i, 1] <- D1(a) # cada coluna de d1 recebe um indice de dominancia
  d1[i, 2] <- D2(a)
  d1[i, 3] <- D3(a)
  d1[i, 4] <- D4(a)
  d1[i, 5] <- D5(a)
  d1[i, 6] <- D6(a)
  d1[i, 7] <- D7(a)
}

Teste de Jarque-Bera para normalidade

# Testando normalidade

alpha <- 0.05 # nivel de significancia

result_teste <- matrix(0, ncol = 7, nrow = 1) # vai guardar o resultado dos testes
colnames(result_teste) <- c("D1", "D2", "D3", "D4", "D5", "D6", "D7")

par(mfrow = c(3, 3), mar = c(3, 3, 2, 1))  # margens ajustadas
for (i in 1:7){
  hist(d1[,i], main = paste0("Histograma de D", i), col = i+1,
       xlab = paste0("D", i), ylab = "Frequência")
  teste <- jarque.bera.test(d1[,i]) # teste para normalidade
  result_teste[,i] <-  ifelse(teste$p.value < alpha, "rej", "ñ rej")
}
result_teste
##      D1      D2      D3      D4      D5    D6      D7     
## [1,] "ñ rej" "ñ rej" "ñ rej" "ñ rej" "rej" "ñ rej" "ñ rej"

Cálculo do MAPE e do CV

# Calculando o MAPE (Erro Percentual Absoluto Médio)
MAPE1 <- mean((abs(D1_T - d1[,1])/D1_T)*100)
MAPE2 <- mean((abs(D2_T - d1[,2])/D2_T)*100)
MAPE3 <- mean((abs(D3_T - d1[,3])/D3_T)*100)
MAPE4 <- mean((abs(D4_T - d1[,4])/D4_T)*100)
MAPE5 <- mean((abs(D5_T - d1[,5])/D5_T)*100)
MAPE6 <- mean((abs(D6_T - d1[,6])/D6_T)*100)
MAPE7 <- mean((abs(D7_T - d1[,7])/D7_T)*100)
MAPE <- c(MAPE1, MAPE2, MAPE3, MAPE4, MAPE5, MAPE6, MAPE7)

paste0("Menor MAPE: D", which.min(MAPE), ", min = ", round(min(MAPE), 4))
## [1] "Menor MAPE: D5, min = 1.0163"
paste0("Segundo menor MAPE: D", which.min(MAPE[-which.min(MAPE)]), ", min = ", round(min(MAPE[-which.min(MAPE)]), 4))
## [1] "Segundo menor MAPE: D6, min = 1.483"
# Calculando o CV
cv1 <- sd(d1[,1])/mean(d1[,1])
cv2 <- sd(d1[,2])/mean(d1[,2])
cv3 <- sd(d1[,3])/mean(d1[,3])
cv4 <- sd(d1[,4])/mean(d1[,4])
cv5 <- sd(d1[,5])/mean(d1[,5])
cv6 <- sd(d1[,6])/mean(d1[,6])
cv7 <- sd(d1[,7])/mean(d1[,7])
CV <- c(cv1, cv2, cv3, cv4, cv5, cv6, cv7)

paste0("Menor CV: D", which.min(CV), ", min = ", round(min(CV), 4))
## [1] "Menor CV: D5, min = 0.0127"
paste0("Segundo menor CV: D", which.min(CV[-which.min(CV)]), ", min = ", round(min(CV[-which.min(CV)]), 4))
## [1] "Segundo menor CV: D6, min = 0.0185"

Configuração do segundo caso com \(n=3000\)

emp <- c("1", "2", "3", "4") # empresas
p <- c(0.85, 0.05, 0.05, 0.05) # participacoes de mercado
k <- length(emp) # numero de empresas


n <- 3000 # numero de elementos de cada amostra
N <- 1000 # numero de amostras

Cálculo dos índices de dominância teóricos

# Indices de dominancia teoricos:

D1_T <- (k*sum(p^2) -1)/(k-1) # indice de Herfindahl–Hirschmann normalizado

p_O <- sort(p, decreasing = T)
pesos <- seq_along(p_O)
Iros <- 1/(2*sum(pesos*p_O)-1)
D2_T <- (k*Iros - 1)/(k-1) # indice de Rosenbluth–Hall–Tidemann normalizado

Hs <- -sum(p*log(p))
D3_T <- 1 - Hs/log(k) # indice de Shannon normalizado

Iheip <- (exp(Hs) - 1)/(k - 1)
D4_T <- 1 - Iheip # indice de Heip

Ihk <- sum(p^2)^(-1)
D5_T <- (k - Ihk)/(k-1) # indice de Hannah-Kay

VA <- 1 - ( sum(( (n*p) - (n/k) )^2) / (( (n^2)*(k-1) )/k) )
D6_T <- 1 - VA

SDA <- 1 - sqrt( sum(( (n*p) - (n/k) )^2) / (( (n^2)*(k-1) )/k) )
D7_T <- 1 - SDA

cat(D1_T, D2_T, D3_T, D4_T, D5_T, D6_T, D7_T)
## 0.64 0.5 0.5762077 0.7335047 0.8767123 0.64 0.8

Simulação

m1 <- matrix(0, nrow <- n, ncol <- N) # matiz que vai receber as amostras
d1 <- matrix(0, nrow <- N, ncol <- 7) # guarda os indices de dominancia

set.seed(123)
for (i in 1:N){
  a <- sample(emp, size = n, replace = T, prob = p) # gera uma amostra
  m1[,i] <- a # cada coluna da matriz vai ser uma amostra
  
  d1[i, 1] <- D1(a) # cada coluna de d1 recebe um indice de dominancia
  d1[i, 2] <- D2(a)
  d1[i, 3] <- D3(a)
  d1[i, 4] <- D4(a)
  d1[i, 5] <- D5(a)
  d1[i, 6] <- D6(a)
  d1[i, 7] <- D7(a)
}

Teste de Jarque-Bera para normalidade

Teste de normalidade para cada conjunto dos índices calculados:

# Testando normalidade

alpha <- 0.05 # nivel de significancia

result_teste <- matrix(0, ncol = 7, nrow = 1) # vai guardar o resultado dos testes
colnames(result_teste) <- c("D1", "D2", "D3", "D4", "D5", "D6", "D7")

par(mfrow = c(3, 3), mar = c(3, 3, 2, 1))  # margens ajustadas
for (i in 1:7){
  hist(d1[,i], main = paste0("Histograma de D", i), col = i+1,
       xlab = paste0("D", i), ylab = "Frequência")
  teste <- jarque.bera.test(d1[,i]) # teste para normalidade
  result_teste[,i] <-  ifelse(teste$p.value < alpha, "rej", "ñ rej")
}
result_teste
##      D1      D2      D3      D4      D5      D6      D7     
## [1,] "ñ rej" "ñ rej" "ñ rej" "ñ rej" "ñ rej" "ñ rej" "ñ rej"

Cálculo do MAPE e do CV

# Calculando o MAPE (Erro Percentual Absoluto Médio)
MAPE1 <- mean((abs(D1_T - d1[,1])/D1_T)*100)
MAPE2 <- mean((abs(D2_T - d1[,2])/D2_T)*100)
MAPE3 <- mean((abs(D3_T - d1[,3])/D3_T)*100)
MAPE4 <- mean((abs(D4_T - d1[,4])/D4_T)*100)
MAPE5 <- mean((abs(D5_T - d1[,5])/D5_T)*100)
MAPE6 <- mean((abs(D6_T - d1[,6])/D6_T)*100)
MAPE7 <- mean((abs(D7_T - d1[,7])/D7_T)*100)
MAPE <- c(MAPE1, MAPE2, MAPE3, MAPE4, MAPE5, MAPE6, MAPE7)

paste0("Menor MAPE: D", which.min(MAPE), ", min = ", round(min(MAPE), 4))
## [1] "Menor MAPE: D5, min = 0.5898"
paste0("Segundo menor MAPE: D", which.min(MAPE[-which.min(MAPE)]), ", min = ", round(min(MAPE[-which.min(MAPE)]), 4))
## [1] "Segundo menor MAPE: D6, min = 0.8616"
# Calculando o CV
cv1 <- sd(d1[,1])/mean(d1[,1])
cv2 <- sd(d1[,2])/mean(d1[,2])
cv3 <- sd(d1[,3])/mean(d1[,3])
cv4 <- sd(d1[,4])/mean(d1[,4])
cv5 <- sd(d1[,5])/mean(d1[,5])
cv6 <- sd(d1[,6])/mean(d1[,6])
cv7 <- sd(d1[,7])/mean(d1[,7])
CV <- c(cv1, cv2, cv3, cv4, cv5, cv6, cv7)

paste0("Menor CV: D", which.min(CV), ", min = ", round(min(CV), 4))
## [1] "Menor CV: D5, min = 0.0075"
paste0("Segundo menor CV: D", which.min(CV[-which.min(CV)]), ", min = ", round(min(CV[-which.min(CV)]), 4))
## [1] "Segundo menor CV: D6, min = 0.0109"

Caso 3

Configuração do terceiro caso com \(n=1000\)

emp <- c("1", "2", "3", "4") # empresas
p <- c(0.35, 0.45, 0.1, 0.1) # participacoes de mercado
k <- length(emp) # numero de empresas


n <- 1000 # numero de elementos de cada amostra
N <- 1000 # numero de amostras

Cálculo dos índices de dominância teóricos

# Indices de dominancia teoricos:

D1_T <- (k*sum(p^2) -1)/(k-1) # indice de Herfindahl–Hirschmann normalizado

p_O <- sort(p, decreasing = T)
pesos <- seq_along(p_O)
Iros <- 1/(2*sum(pesos*p_O)-1)
D2_T <- (k*Iros - 1)/(k-1) # indice de Rosenbluth–Hall–Tidemann normalizado

Hs <- -sum(p*log(p))
D3_T <- 1 - Hs/log(k) # indice de Shannon normalizado

Iheip <- (exp(Hs) - 1)/(k - 1)
D4_T <- 1 - Iheip # indice de Heip

Ihk <- sum(p^2)^(-1)
D5_T <- (k - Ihk)/(k-1) # indice de Hannah-Kay

VA <- 1 - ( sum(( (n*p) - (n/k) )^2) / (( (n^2)*(k-1) )/k) )
D6_T <- 1 - VA

SDA <- 1 - sqrt( sum(( (n*p) - (n/k) )^2) / (( (n^2)*(k-1) )/k) )
D7_T <- 1 - SDA

cat(D1_T, D2_T, D3_T, D4_T, D5_T, D6_T, D7_T)
## 0.1266667 0.1604938 0.1435562 0.2406123 0.3671498 0.1266667 0.3559026

Simulação

# iniciando com n = 1000

m1 <- matrix(0, nrow <- n, ncol <- N) # matiz que vai receber as amostras
d1 <- matrix(0, nrow <- N, ncol <- 7) # guarda os indices de dominancia

set.seed(123)
for (i in 1:N){
  a <- sample(emp, size = n, replace = T, prob = p) # gera uma amostra
  m1[,i] <- a # cada coluna da matriz vai ser uma amostra
  
  d1[i, 1] <- D1(a) # cada coluna de d1 recebe um indice de dominancia
  d1[i, 2] <- D2(a)
  d1[i, 3] <- D3(a)
  d1[i, 4] <- D4(a)
  d1[i, 5] <- D5(a)
  d1[i, 6] <- D6(a)
  d1[i, 7] <- D7(a)
}

Teste de Jarque-Bera para normalidade

# Testando normalidade

alpha <- 0.05 # nivel de significancia

result_teste <- matrix(0, ncol = 7, nrow = 1) # vai guardar o resultado dos testes
colnames(result_teste) <- c("D1", "D2", "D3", "D4", "D5", "D6", "D7")

par(mfrow = c(3, 3), mar = c(3, 3, 2, 1))  # margens ajustadas
for (i in 1:7){
  hist(d1[,i], main = paste0("Histograma de D", i), col = i+1,
       xlab = paste0("D", i), ylab = "Frequência")
  teste <- jarque.bera.test(d1[,i]) # teste para normalidade
  result_teste[,i] <-  ifelse(teste$p.value < alpha, "rej", "ñ rej")
}
result_teste
##      D1      D2      D3      D4      D5    D6      D7   
## [1,] "ñ rej" "ñ rej" "ñ rej" "ñ rej" "rej" "ñ rej" "rej"

Cálculo do MAPE e do CV

# Calculando o MAPE (Erro Percentual Absoluto Médio)
MAPE1 <- mean((abs(D1_T - d1[,1])/D1_T)*100)
MAPE2 <- mean((abs(D2_T - d1[,2])/D2_T)*100)
MAPE3 <- mean((abs(D3_T - d1[,3])/D3_T)*100)
MAPE4 <- mean((abs(D4_T - d1[,4])/D4_T)*100)
MAPE5 <- mean((abs(D5_T - d1[,5])/D5_T)*100)
MAPE6 <- mean((abs(D6_T - d1[,6])/D6_T)*100)
MAPE7 <- mean((abs(D7_T - d1[,7])/D7_T)*100)
MAPE <- c(MAPE1, MAPE2, MAPE3, MAPE4, MAPE5, MAPE6, MAPE7)

paste0("Menor MAPE: D", which.min(MAPE), ", min = ", round(min(MAPE), 4))
## [1] "Menor MAPE: D7, min = 3.353"
paste0("Segundo menor MAPE: D", which.min(MAPE[-which.min(MAPE)]), ", min = ", round(min(MAPE[-which.min(MAPE)]), 4))
## [1] "Segundo menor MAPE: D5, min = 4.8542"
# Calculando o CV
cv1 <- sd(d1[,1])/mean(d1[,1])
cv2 <- sd(d1[,2])/mean(d1[,2])
cv3 <- sd(d1[,3])/mean(d1[,3])
cv4 <- sd(d1[,4])/mean(d1[,4])
cv5 <- sd(d1[,5])/mean(d1[,5])
cv6 <- sd(d1[,6])/mean(d1[,6])
cv7 <- sd(d1[,7])/mean(d1[,7])
CV <- c(cv1, cv2, cv3, cv4, cv5, cv6, cv7)

paste0("Menor CV: D", which.min(CV), ", min = ", round(min(CV), 4))
## [1] "Menor CV: D7, min = 0.0418"
paste0("Segundo menor CV: D", which.min(CV[-which.min(CV)]), ", min = ", round(min(CV[-which.min(CV)]), 4))
## [1] "Segundo menor CV: D5, min = 0.0604"

Configuração do terceiro caso com \(n=3000\)

emp <- c("1", "2", "3", "4") # empresas
p <- c(0.35, 0.45, 0.1, 0.1) # participacoes de mercado
k <- length(emp) # numero de empresas


n <- 3000 # numero de elementos de cada amostra
N <- 1000 # numero de amostras

Cálculo dos índices de dominância teóricos

# Indices de dominancia teoricos:

D1_T <- (k*sum(p^2) -1)/(k-1) # indice de Herfindahl–Hirschmann normalizado

p_O <- sort(p, decreasing = T)
pesos <- seq_along(p_O)
Iros <- 1/(2*sum(pesos*p_O)-1)
D2_T <- (k*Iros - 1)/(k-1) # indice de Rosenbluth–Hall–Tidemann normalizado

Hs <- -sum(p*log(p))
D3_T <- 1 - Hs/log(k) # indice de Shannon normalizado

Iheip <- (exp(Hs) - 1)/(k - 1)
D4_T <- 1 - Iheip # indice de Heip

Ihk <- sum(p^2)^(-1)
D5_T <- (k - Ihk)/(k-1) # indice de Hannah-Kay

VA <- 1 - ( sum(( (n*p) - (n/k) )^2) / (( (n^2)*(k-1) )/k) )
D6_T <- 1 - VA

SDA <- 1 - sqrt( sum(( (n*p) - (n/k) )^2) / (( (n^2)*(k-1) )/k) )
D7_T <- 1 - SDA

cat(D1_T, D2_T, D3_T, D4_T, D5_T, D6_T, D7_T)
## 0.1266667 0.1604938 0.1435562 0.2406123 0.3671498 0.1266667 0.3559026

Simulação

m1 <- matrix(0, nrow <- n, ncol <- N) # matiz que vai receber as amostras
d1 <- matrix(0, nrow <- N, ncol <- 7) # guarda os indices de dominancia

set.seed(123)
for (i in 1:N){
  a <- sample(emp, size = n, replace = T, prob = p) # gera uma amostra
  m1[,i] <- a # cada coluna da matriz vai ser uma amostra
  
  d1[i, 1] <- D1(a) # cada coluna de d1 recebe um indice de dominancia
  d1[i, 2] <- D2(a)
  d1[i, 3] <- D3(a)
  d1[i, 4] <- D4(a)
  d1[i, 5] <- D5(a)
  d1[i, 6] <- D6(a)
  d1[i, 7] <- D7(a)
}

Teste de Jarque-Bera para normalidade

Teste de normalidade para cada conjunto dos índices calculados:

# Testando normalidade

alpha <- 0.05 # nivel de significancia

result_teste <- matrix(0, ncol = 7, nrow = 1) # vai guardar o resultado dos testes
colnames(result_teste) <- c("D1", "D2", "D3", "D4", "D5", "D6", "D7")

par(mfrow = c(3, 3), mar = c(3, 3, 2, 1))  # margens ajustadas
for (i in 1:7){
  hist(d1[,i], main = paste0("Histograma de D", i), col = i+1,
       xlab = paste0("D", i), ylab = "Frequência")
  teste <- jarque.bera.test(d1[,i]) # teste para normalidade
  result_teste[,i] <-  ifelse(teste$p.value < alpha, "rej", "ñ rej")
}
result_teste
##      D1    D2    D3    D4    D5      D6    D7     
## [1,] "rej" "rej" "rej" "rej" "ñ rej" "rej" "ñ rej"

Cálculo do MAPE e do CV

# Calculando o MAPE (Erro Percentual Absoluto Médio)
MAPE1 <- mean((abs(D1_T - d1[,1])/D1_T)*100)
MAPE2 <- mean((abs(D2_T - d1[,2])/D2_T)*100)
MAPE3 <- mean((abs(D3_T - d1[,3])/D3_T)*100)
MAPE4 <- mean((abs(D4_T - d1[,4])/D4_T)*100)
MAPE5 <- mean((abs(D5_T - d1[,5])/D5_T)*100)
MAPE6 <- mean((abs(D6_T - d1[,6])/D6_T)*100)
MAPE7 <- mean((abs(D7_T - d1[,7])/D7_T)*100)
MAPE <- c(MAPE1, MAPE2, MAPE3, MAPE4, MAPE5, MAPE6, MAPE7)

paste0("Menor MAPE: D", which.min(MAPE), ", min = ", round(min(MAPE), 4))
## [1] "Menor MAPE: D7, min = 1.9669"
paste0("Segundo menor MAPE: D", which.min(MAPE[-which.min(MAPE)]), ", min = ", round(min(MAPE[-which.min(MAPE)]), 4))
## [1] "Segundo menor MAPE: D5, min = 2.8493"
# Calculando o CV
cv1 <- sd(d1[,1])/mean(d1[,1])
cv2 <- sd(d1[,2])/mean(d1[,2])
cv3 <- sd(d1[,3])/mean(d1[,3])
cv4 <- sd(d1[,4])/mean(d1[,4])
cv5 <- sd(d1[,5])/mean(d1[,5])
cv6 <- sd(d1[,6])/mean(d1[,6])
cv7 <- sd(d1[,7])/mean(d1[,7])
CV <- c(cv1, cv2, cv3, cv4, cv5, cv6, cv7)

paste0("Menor CV: D", which.min(CV), ", min = ", round(min(CV), 4))
## [1] "Menor CV: D7, min = 0.025"
paste0("Segundo menor CV: D", which.min(CV[-which.min(CV)]), ", min = ", round(min(CV[-which.min(CV)]), 4))
## [1] "Segundo menor CV: D5, min = 0.0362"

Caso 4

Configuração do quarto caso com \(n=1000\)

emp <- c("1", "2", "3", "4", "5", "6") # empresas
p <- c(0.2, 0.2, 0.2, 0.05, 0.15, 0.2) # participacoes de mercado
k <- length(emp) # numero de empresas


n <- 1000 # numero de elementos de cada amostra
N <- 1000 # numero de amostras

Cálculo dos índices de dominância teóricos

# Indices de dominancia teoricos:

D1_T <- (k*sum(p^2) -1)/(k-1) # indice de Herfindahl–Hirschmann normalizado

p_O <- sort(p, decreasing = T)
pesos <- seq_along(p_O)
Iros <- 1/(2*sum(pesos*p_O)-1)
D2_T <- (k*Iros - 1)/(k-1) # indice de Rosenbluth–Hall–Tidemann normalizado

Hs <- -sum(p*log(p))
D3_T <- 1 - Hs/log(k) # indice de Shannon normalizado

Iheip <- (exp(Hs) - 1)/(k - 1)
D4_T <- 1 - Iheip # indice de Heip

Ihk <- sum(p^2)^(-1)
D5_T <- (k - Ihk)/(k-1) # indice de Hannah-Kay

VA <- 1 - ( sum(( (n*p) - (n/k) )^2) / (( (n^2)*(k-1) )/k) )
D6_T <- 1 - VA

SDA <- 1 - sqrt( sum(( (n*p) - (n/k) )^2) / (( (n^2)*(k-1) )/k) )
D7_T <- 1 - SDA

cat(D1_T, D2_T, D3_T, D4_T, D5_T, D6_T, D7_T)
## 0.022 0.03529412 0.03898655 0.08096464 0.1189189 0.022 0.148324

Simulação

# iniciando com n = 1000

m1 <- matrix(0, nrow <- n, ncol <- N) # matiz que vai receber as amostras
d1 <- matrix(0, nrow <- N, ncol <- 7) # guarda os indices de dominancia

set.seed(123)
for (i in 1:N){
  a <- sample(emp, size = n, replace = T, prob = p) # gera uma amostra
  m1[,i] <- a # cada coluna da matriz vai ser uma amostra
  
  d1[i, 1] <- D1(a) # cada coluna de d1 recebe um indice de dominancia
  d1[i, 2] <- D2(a)
  d1[i, 3] <- D3(a)
  d1[i, 4] <- D4(a)
  d1[i, 5] <- D5(a)
  d1[i, 6] <- D6(a)
  d1[i, 7] <- D7(a)
}

Teste de Jarque-Bera para normalidade

# Testando normalidade

alpha <- 0.05 # nivel de significancia

result_teste <- matrix(0, ncol = 7, nrow = 1) # vai guardar o resultado dos testes
colnames(result_teste) <- c("D1", "D2", "D3", "D4", "D5", "D6", "D7")

par(mfrow = c(3, 3), mar = c(3, 3, 2, 1))  # margens ajustadas
for (i in 1:7){
  hist(d1[,i], main = paste0("Histograma de D", i), col = i+1,
       xlab = paste0("D", i), ylab = "Frequência")
  teste <- jarque.bera.test(d1[,i]) # teste para normalidade
  result_teste[,i] <-  ifelse(teste$p.value < alpha, "rej", "ñ rej")
}
result_teste
##      D1      D2      D3    D4      D5      D6      D7     
## [1,] "ñ rej" "ñ rej" "rej" "ñ rej" "ñ rej" "ñ rej" "ñ rej"

Cálculo do MAPE e do CV

# Calculando o MAPE (Erro Percentual Absoluto Médio)
MAPE1 <- mean((abs(D1_T - d1[,1])/D1_T)*100)
MAPE2 <- mean((abs(D2_T - d1[,2])/D2_T)*100)
MAPE3 <- mean((abs(D3_T - d1[,3])/D3_T)*100)
MAPE4 <- mean((abs(D4_T - d1[,4])/D4_T)*100)
MAPE5 <- mean((abs(D5_T - d1[,5])/D5_T)*100)
MAPE6 <- mean((abs(D6_T - d1[,6])/D6_T)*100)
MAPE7 <- mean((abs(D7_T - d1[,7])/D7_T)*100)
MAPE <- c(MAPE1, MAPE2, MAPE3, MAPE4, MAPE5, MAPE6, MAPE7)

paste0("Menor MAPE: D", which.min(MAPE), ", min = ", round(min(MAPE), 4))
## [1] "Menor MAPE: D7, min = 4.9948"
paste0("Segundo menor MAPE: D", which.min(MAPE[-which.min(MAPE)]), ", min = ", round(min(MAPE[-which.min(MAPE)]), 4))
## [1] "Segundo menor MAPE: D5, min = 9.0993"
# Calculando o CV
cv1 <- sd(d1[,1])/mean(d1[,1])
cv2 <- sd(d1[,2])/mean(d1[,2])
cv3 <- sd(d1[,3])/mean(d1[,3])
cv4 <- sd(d1[,4])/mean(d1[,4])
cv5 <- sd(d1[,5])/mean(d1[,5])
cv6 <- sd(d1[,6])/mean(d1[,6])
cv7 <- sd(d1[,7])/mean(d1[,7])
CV <- c(cv1, cv2, cv3, cv4, cv5, cv6, cv7)

paste0("Menor CV: D", which.min(CV), ", min = ", round(min(CV), 4))
## [1] "Menor CV: D7, min = 0.0565"
paste0("Segundo menor CV: D", which.min(CV[-which.min(CV)]), ", min = ", round(min(CV[-which.min(CV)]), 4))
## [1] "Segundo menor CV: D2, min = 0.0939"

Configuração do quarto caso com \(n=3000\)

emp <- c("1", "2", "3", "4", "5", "6") # empresas
p <- c(0.2, 0.2, 0.2, 0.05, 0.15, 0.2) # participacoes de mercado
k <- length(emp) # numero de empresas


n <- 3000 # numero de elementos de cada amostra
N <- 1000 # numero de amostras

Cálculo dos índices de dominância teóricos

# Indices de dominancia teoricos:

D1_T <- (k*sum(p^2) -1)/(k-1) # indice de Herfindahl–Hirschmann normalizado

p_O <- sort(p, decreasing = T)
pesos <- seq_along(p_O)
Iros <- 1/(2*sum(pesos*p_O)-1)
D2_T <- (k*Iros - 1)/(k-1) # indice de Rosenbluth–Hall–Tidemann normalizado

Hs <- -sum(p*log(p))
D3_T <- 1 - Hs/log(k) # indice de Shannon normalizado

Iheip <- (exp(Hs) - 1)/(k - 1)
D4_T <- 1 - Iheip # indice de Heip

Ihk <- sum(p^2)^(-1)
D5_T <- (k - Ihk)/(k-1) # indice de Hannah-Kay

VA <- 1 - ( sum(( (n*p) - (n/k) )^2) / (( (n^2)*(k-1) )/k) )
D6_T <- 1 - VA

SDA <- 1 - sqrt( sum(( (n*p) - (n/k) )^2) / (( (n^2)*(k-1) )/k) )
D7_T <- 1 - SDA

cat(D1_T, D2_T, D3_T, D4_T, D5_T, D6_T, D7_T)
## 0.022 0.03529412 0.03898655 0.08096464 0.1189189 0.022 0.148324

Simulação

m1 <- matrix(0, nrow <- n, ncol <- N) # matiz que vai receber as amostras
d1 <- matrix(0, nrow <- N, ncol <- 7) # guarda os indices de dominancia

set.seed(123)
for (i in 1:N){
  a <- sample(emp, size = n, replace = T, prob = p) # gera uma amostra
  m1[,i] <- a # cada coluna da matriz vai ser uma amostra
  
  d1[i, 1] <- D1(a) # cada coluna de d1 recebe um indice de dominancia
  d1[i, 2] <- D2(a)
  d1[i, 3] <- D3(a)
  d1[i, 4] <- D4(a)
  d1[i, 5] <- D5(a)
  d1[i, 6] <- D6(a)
  d1[i, 7] <- D7(a)
}

Teste de Jarque-Bera para normalidade

Teste de normalidade para cada conjunto dos índices calculados:

# Testando normalidade

alpha <- 0.05 # nivel de significancia

result_teste <- matrix(0, ncol = 7, nrow = 1) # vai guardar o resultado dos testes
colnames(result_teste) <- c("D1", "D2", "D3", "D4", "D5", "D6", "D7")

par(mfrow = c(3, 3), mar = c(3, 3, 2, 1))  # margens ajustadas
for (i in 1:7){
  hist(d1[,i], main = paste0("Histograma de D", i), col = i+1,
       xlab = paste0("D", i), ylab = "Frequência")
  teste <- jarque.bera.test(d1[,i]) # teste para normalidade
  result_teste[,i] <-  ifelse(teste$p.value < alpha, "rej", "ñ rej")
}
result_teste
##      D1    D2      D3    D4    D5    D6    D7     
## [1,] "rej" "ñ rej" "rej" "rej" "rej" "rej" "ñ rej"

Cálculo do MAPE e do CV

# Calculando o MAPE (Erro Percentual Absoluto Médio)
MAPE1 <- mean((abs(D1_T - d1[,1])/D1_T)*100)
MAPE2 <- mean((abs(D2_T - d1[,2])/D2_T)*100)
MAPE3 <- mean((abs(D3_T - d1[,3])/D3_T)*100)
MAPE4 <- mean((abs(D4_T - d1[,4])/D4_T)*100)
MAPE5 <- mean((abs(D5_T - d1[,5])/D5_T)*100)
MAPE6 <- mean((abs(D6_T - d1[,6])/D6_T)*100)
MAPE7 <- mean((abs(D7_T - d1[,7])/D7_T)*100)
MAPE <- c(MAPE1, MAPE2, MAPE3, MAPE4, MAPE5, MAPE6, MAPE7)

paste0("Menor MAPE: D", which.min(MAPE), ", min = ", round(min(MAPE), 4))
## [1] "Menor MAPE: D7, min = 2.9047"
paste0("Segundo menor MAPE: D", which.min(MAPE[-which.min(MAPE)]), ", min = ", round(min(MAPE[-which.min(MAPE)]), 4))
## [1] "Segundo menor MAPE: D5, min = 5.2569"
# Calculando o CV
cv1 <- sd(d1[,1])/mean(d1[,1])
cv2 <- sd(d1[,2])/mean(d1[,2])
cv3 <- sd(d1[,3])/mean(d1[,3])
cv4 <- sd(d1[,4])/mean(d1[,4])
cv5 <- sd(d1[,5])/mean(d1[,5])
cv6 <- sd(d1[,6])/mean(d1[,6])
cv7 <- sd(d1[,7])/mean(d1[,7])
CV <- c(cv1, cv2, cv3, cv4, cv5, cv6, cv7)

paste0("Menor CV: D", which.min(CV), ", min = ", round(min(CV), 4))
## [1] "Menor CV: D7, min = 0.0356"
paste0("Segundo menor CV: D", which.min(CV[-which.min(CV)]), ", min = ", round(min(CV[-which.min(CV)]), 4))
## [1] "Segundo menor CV: D2, min = 0.0605"

Caso 5

Configuração do quinto caso com \(n=1000\)

emp <- c("1", "2", "3", "4", "5", "6") # empresas
p <- c(0.01, 0.01, 0.01, 0.01, 0.01, 0.95) # participacoes de mercado
k <- length(emp) # numero de empresas


n <- 1000 # numero de elementos de cada amostra
N <- 1000 # numero de amostras

Cálculo dos índices de dominância teóricos

# Indices de dominancia teoricos:

D1_T <- (k*sum(p^2) -1)/(k-1) # indice de Herfindahl–Hirschmann normalizado

p_O <- sort(p, decreasing = T)
pesos <- seq_along(p_O)
Iros <- 1/(2*sum(pesos*p_O)-1)
D2_T <- (k*Iros - 1)/(k-1) # indice de Rosenbluth–Hall–Tidemann normalizado

Hs <- -sum(p*log(p))
D3_T <- 1 - Hs/log(k) # indice de Shannon normalizado

Iheip <- (exp(Hs) - 1)/(k - 1)
D4_T <- 1 - Iheip # indice de Heip

Ihk <- sum(p^2)^(-1)
D5_T <- (k - Ihk)/(k-1) # indice de Hannah-Kay

VA <- 1 - ( sum(( (n*p) - (n/k) )^2) / (( (n^2)*(k-1) )/k) )
D6_T <- 1 - VA

SDA <- 1 - sqrt( sum(( (n*p) - (n/k) )^2) / (( (n^2)*(k-1) )/k) )
D7_T <- 1 - SDA

cat(D1_T, D2_T, D3_T, D4_T, D5_T, D6_T, D7_T)
## 0.8836 0.7230769 0.8442943 0.9356419 0.9785161 0.8836 0.94

Simulação

# iniciando com n = 1000

m1 <- matrix(0, nrow <- n, ncol <- N) # matiz que vai receber as amostras
d1 <- matrix(0, nrow <- N, ncol <- 7) # guarda os indices de dominancia

set.seed(123)
for (i in 1:N){
  a <- sample(emp, size = n, replace = T, prob = p) # gera uma amostra
  m1[,i] <- a # cada coluna da matriz vai ser uma amostra
  
  d1[i, 1] <- D1(a) # cada coluna de d1 recebe um indice de dominancia
  d1[i, 2] <- D2(a)
  d1[i, 3] <- D3(a)
  d1[i, 4] <- D4(a)
  d1[i, 5] <- D5(a)
  d1[i, 6] <- D6(a)
  d1[i, 7] <- D7(a)
}

Teste de Jarque-Bera para normalidade

# Testando normalidade

alpha <- 0.05 # nivel de significancia

result_teste <- matrix(0, ncol = 7, nrow = 1) # vai guardar o resultado dos testes
colnames(result_teste) <- c("D1", "D2", "D3", "D4", "D5", "D6", "D7")

par(mfrow = c(3, 3), mar = c(3, 3, 2, 1))  # margens ajustadas
for (i in 1:7){
  hist(d1[,i], main = paste0("Histograma de D", i), col = i+1,
       xlab = paste0("D", i), ylab = "Frequência")
  teste <- jarque.bera.test(d1[,i]) # teste para normalidade
  result_teste[,i] <-  ifelse(teste$p.value < alpha, "rej", "ñ rej")
}
result_teste
##      D1      D2      D3      D4      D5      D6      D7     
## [1,] "ñ rej" "ñ rej" "ñ rej" "ñ rej" "ñ rej" "ñ rej" "ñ rej"

Cálculo do MAPE e do CV

# Calculando o MAPE (Erro Percentual Absoluto Médio)
MAPE1 <- mean((abs(D1_T - d1[,1])/D1_T)*100)
MAPE2 <- mean((abs(D2_T - d1[,2])/D2_T)*100)
MAPE3 <- mean((abs(D3_T - d1[,3])/D3_T)*100)
MAPE4 <- mean((abs(D4_T - d1[,4])/D4_T)*100)
MAPE5 <- mean((abs(D5_T - d1[,5])/D5_T)*100)
MAPE6 <- mean((abs(D6_T - d1[,6])/D6_T)*100)
MAPE7 <- mean((abs(D7_T - d1[,7])/D7_T)*100)
MAPE <- c(MAPE1, MAPE2, MAPE3, MAPE4, MAPE5, MAPE6, MAPE7)

paste0("Menor MAPE: D", which.min(MAPE), ", min = ", round(min(MAPE), 4))
## [1] "Menor MAPE: D5, min = 0.2491"
paste0("Segundo menor MAPE: D", which.min(MAPE[-which.min(MAPE)]), ", min = ", round(min(MAPE[-which.min(MAPE)]), 4))
## [1] "Segundo menor MAPE: D6, min = 0.675"
# Calculando o CV
cv1 <- sd(d1[,1])/mean(d1[,1])
cv2 <- sd(d1[,2])/mean(d1[,2])
cv3 <- sd(d1[,3])/mean(d1[,3])
cv4 <- sd(d1[,4])/mean(d1[,4])
cv5 <- sd(d1[,5])/mean(d1[,5])
cv6 <- sd(d1[,6])/mean(d1[,6])
cv7 <- sd(d1[,7])/mean(d1[,7])
CV <- c(cv1, cv2, cv3, cv4, cv5, cv6, cv7)

paste0("Menor CV: D", which.min(CV), ", min = ", round(min(CV), 4))
## [1] "Menor CV: D5, min = 0.0031"
paste0("Segundo menor CV: D", which.min(CV[-which.min(CV)]), ", min = ", round(min(CV[-which.min(CV)]), 4))
## [1] "Segundo menor CV: D6, min = 0.0084"

Configuração do quinto caso com \(n=3000\)

emp <- c("1", "2", "3", "4", "5", "6") # empresas
p <- c(0.01, 0.01, 0.01, 0.01, 0.01, 0.95) # participacoes de mercado
k <- length(emp) # numero de empresas


n <- 3000 # numero de elementos de cada amostra
N <- 1000 # numero de amostras

Cálculo dos índices de dominância teóricos

# Indices de dominancia teoricos:

D1_T <- (k*sum(p^2) -1)/(k-1) # indice de Herfindahl–Hirschmann normalizado

p_O <- sort(p, decreasing = T)
pesos <- seq_along(p_O)
Iros <- 1/(2*sum(pesos*p_O)-1)
D2_T <- (k*Iros - 1)/(k-1) # indice de Rosenbluth–Hall–Tidemann normalizado

Hs <- -sum(p*log(p))
D3_T <- 1 - Hs/log(k) # indice de Shannon normalizado

Iheip <- (exp(Hs) - 1)/(k - 1)
D4_T <- 1 - Iheip # indice de Heip

Ihk <- sum(p^2)^(-1)
D5_T <- (k - Ihk)/(k-1) # indice de Hannah-Kay

VA <- 1 - ( sum(( (n*p) - (n/k) )^2) / (( (n^2)*(k-1) )/k) )
D6_T <- 1 - VA

SDA <- 1 - sqrt( sum(( (n*p) - (n/k) )^2) / (( (n^2)*(k-1) )/k) )
D7_T <- 1 - SDA

cat(D1_T, D2_T, D3_T, D4_T, D5_T, D6_T, D7_T)
## 0.8836 0.7230769 0.8442943 0.9356419 0.9785161 0.8836 0.94

Simulação

m1 <- matrix(0, nrow <- n, ncol <- N) # matiz que vai receber as amostras
d1 <- matrix(0, nrow <- N, ncol <- 7) # guarda os indices de dominancia

set.seed(123)
for (i in 1:N){
  a <- sample(emp, size = n, replace = T, prob = p) # gera uma amostra
  m1[,i] <- a # cada coluna da matriz vai ser uma amostra
  
  d1[i, 1] <- D1(a) # cada coluna de d1 recebe um indice de dominancia
  d1[i, 2] <- D2(a)
  d1[i, 3] <- D3(a)
  d1[i, 4] <- D4(a)
  d1[i, 5] <- D5(a)
  d1[i, 6] <- D6(a)
  d1[i, 7] <- D7(a)
}

Teste de Jarque-Bera para normalidade

Teste de normalidade para cada conjunto dos índices calculados:

# Testando normalidade

alpha <- 0.05 # nivel de significancia

result_teste <- matrix(0, ncol = 7, nrow = 1) # vai guardar o resultado dos testes
colnames(result_teste) <- c("D1", "D2", "D3", "D4", "D5", "D6", "D7")

par(mfrow = c(3, 3), mar = c(3, 3, 2, 1))  # margens ajustadas
for (i in 1:7){
  hist(d1[,i], main = paste0("Histograma de D", i), col = i+1,
       xlab = paste0("D", i), ylab = "Frequência")
  teste <- jarque.bera.test(d1[,i]) # teste para normalidade
  result_teste[,i] <-  ifelse(teste$p.value < alpha, "rej", "ñ rej")
}
result_teste
##      D1      D2      D3      D4      D5      D6      D7     
## [1,] "ñ rej" "ñ rej" "ñ rej" "ñ rej" "ñ rej" "ñ rej" "ñ rej"

Cálculo do MAPE e do CV

# Calculando o MAPE (Erro Percentual Absoluto Médio)
MAPE1 <- mean((abs(D1_T - d1[,1])/D1_T)*100)
MAPE2 <- mean((abs(D2_T - d1[,2])/D2_T)*100)
MAPE3 <- mean((abs(D3_T - d1[,3])/D3_T)*100)
MAPE4 <- mean((abs(D4_T - d1[,4])/D4_T)*100)
MAPE5 <- mean((abs(D5_T - d1[,5])/D5_T)*100)
MAPE6 <- mean((abs(D6_T - d1[,6])/D6_T)*100)
MAPE7 <- mean((abs(D7_T - d1[,7])/D7_T)*100)
MAPE <- c(MAPE1, MAPE2, MAPE3, MAPE4, MAPE5, MAPE6, MAPE7)

paste0("Menor MAPE: D", which.min(MAPE), ", min = ", round(min(MAPE), 4))
## [1] "Menor MAPE: D5, min = 0.149"
paste0("Segundo menor MAPE: D", which.min(MAPE[-which.min(MAPE)]), ", min = ", round(min(MAPE[-which.min(MAPE)]), 4))
## [1] "Segundo menor MAPE: D6, min = 0.4037"
# Calculando o CV
cv1 <- sd(d1[,1])/mean(d1[,1])
cv2 <- sd(d1[,2])/mean(d1[,2])
cv3 <- sd(d1[,3])/mean(d1[,3])
cv4 <- sd(d1[,4])/mean(d1[,4])
cv5 <- sd(d1[,5])/mean(d1[,5])
cv6 <- sd(d1[,6])/mean(d1[,6])
cv7 <- sd(d1[,7])/mean(d1[,7])
CV <- c(cv1, cv2, cv3, cv4, cv5, cv6, cv7)

paste0("Menor CV: D", which.min(CV), ", min = ", round(min(CV), 4))
## [1] "Menor CV: D5, min = 0.0019"
paste0("Segundo menor CV: D", which.min(CV[-which.min(CV)]), ", min = ", round(min(CV[-which.min(CV)]), 4))
## [1] "Segundo menor CV: D6, min = 0.005"

Caso 6

Configuração do sexto caso com \(n=1000\)

emp <- c("1", "2", "3", "4", "5", "6") # empresas
p <- c(0.01, 0.01, 0.02, 0.02, 0.47, 0.47) # participacoes de mercado
k <- length(emp) # numero de empresas


n <- 1000 # numero de elementos de cada amostra
N <- 1000 # numero de amostras

Cálculo dos índices de dominância teóricos

# Indices de dominancia teoricos:

D1_T <- (k*sum(p^2) -1)/(k-1) # indice de Herfindahl–Hirschmann normalizado

p_O <- sort(p, decreasing = T)
pesos <- seq_along(p_O)
Iros <- 1/(2*sum(pesos*p_O)-1)
D2_T <- (k*Iros - 1)/(k-1) # indice de Rosenbluth–Hall–Tidemann normalizado

Hs <- -sum(p*log(p))
D3_T <- 1 - Hs/log(k) # indice de Shannon normalizado

Iheip <- (exp(Hs) - 1)/(k - 1)
D4_T <- 1 - Iheip # indice de Heip

Ihk <- sum(p^2)^(-1)
D5_T <- (k - Ihk)/(k-1) # indice de Hannah-Kay

VA <- 1 - ( sum(( (n*p) - (n/k) )^2) / (( (n^2)*(k-1) )/k) )
D6_T <- 1 - VA

SDA <- 1 - sqrt( sum(( (n*p) - (n/k) )^2) / (( (n^2)*(k-1) )/k) )
D7_T <- 1 - SDA

cat(D1_T, D2_T, D3_T, D4_T, D5_T, D6_T, D7_T)
## 0.33136 0.3172414 0.4651595 0.678545 0.7483288 0.33136 0.5756388

Simulação

# iniciando com n = 1000

m1 <- matrix(0, nrow <- n, ncol <- N) # matiz que vai receber as amostras
d1 <- matrix(0, nrow <- N, ncol <- 7) # guarda os indices de dominancia

set.seed(123)
for (i in 1:N){
  a <- sample(emp, size = n, replace = T, prob = p) # gera uma amostra
  m1[,i] <- a # cada coluna da matriz vai ser uma amostra
  
  d1[i, 1] <- D1(a) # cada coluna de d1 recebe um indice de dominancia
  d1[i, 2] <- D2(a)
  d1[i, 3] <- D3(a)
  d1[i, 4] <- D4(a)
  d1[i, 5] <- D5(a)
  d1[i, 6] <- D6(a)
  d1[i, 7] <- D7(a)
}

Teste de Jarque-Bera para normalidade

# Testando normalidade

alpha <- 0.05 # nivel de significancia

result_teste <- matrix(0, ncol = 7, nrow = 1) # vai guardar o resultado dos testes
colnames(result_teste) <- c("D1", "D2", "D3", "D4", "D5", "D6", "D7")

par(mfrow = c(3, 3), mar = c(3, 3, 2, 1))  # margens ajustadas
for (i in 1:7){
  hist(d1[,i], main = paste0("Histograma de D", i), col = i+1,
       xlab = paste0("D", i), ylab = "Frequência")
  teste <- jarque.bera.test(d1[,i]) # teste para normalidade
  result_teste[,i] <-  ifelse(teste$p.value < alpha, "rej", "ñ rej")
}
result_teste
##      D1      D2      D3      D4      D5      D6      D7     
## [1,] "ñ rej" "ñ rej" "ñ rej" "ñ rej" "ñ rej" "ñ rej" "ñ rej"

Cálculo do MAPE e do CV

# Calculando o MAPE (Erro Percentual Absoluto Médio)
MAPE1 <- mean((abs(D1_T - d1[,1])/D1_T)*100)
MAPE2 <- mean((abs(D2_T - d1[,2])/D2_T)*100)
MAPE3 <- mean((abs(D3_T - d1[,3])/D3_T)*100)
MAPE4 <- mean((abs(D4_T - d1[,4])/D4_T)*100)
MAPE5 <- mean((abs(D5_T - d1[,5])/D5_T)*100)
MAPE6 <- mean((abs(D6_T - d1[,6])/D6_T)*100)
MAPE7 <- mean((abs(D7_T - d1[,7])/D7_T)*100)
MAPE <- c(MAPE1, MAPE2, MAPE3, MAPE4, MAPE5, MAPE6, MAPE7)

paste0("Menor MAPE: D", which.min(MAPE), ", min = ", round(min(MAPE), 4))
## [1] "Menor MAPE: D5, min = 0.7063"
paste0("Segundo menor MAPE: D", which.min(MAPE[-which.min(MAPE)]), ", min = ", round(min(MAPE[-which.min(MAPE)]), 4))
## [1] "Segundo menor MAPE: D6, min = 0.9398"
# Calculando o CV
cv1 <- sd(d1[,1])/mean(d1[,1])
cv2 <- sd(d1[,2])/mean(d1[,2])
cv3 <- sd(d1[,3])/mean(d1[,3])
cv4 <- sd(d1[,4])/mean(d1[,4])
cv5 <- sd(d1[,5])/mean(d1[,5])
cv6 <- sd(d1[,6])/mean(d1[,6])
cv7 <- sd(d1[,7])/mean(d1[,7])
CV <- c(cv1, cv2, cv3, cv4, cv5, cv6, cv7)

paste0("Menor CV: D", which.min(CV), ", min = ", round(min(CV), 4))
## [1] "Menor CV: D5, min = 0.0087"
paste0("Segundo menor CV: D", which.min(CV[-which.min(CV)]), ", min = ", round(min(CV[-which.min(CV)]), 4))
## [1] "Segundo menor CV: D6, min = 0.0116"

Configuração do sexto caso com \(n=3000\)

emp <- c("1", "2", "3", "4", "5", "6") # empresas
p <- c(0.01, 0.01, 0.02, 0.02, 0.47, 0.47) # participacoes de mercado
k <- length(emp) # numero de empresas


n <- 3000 # numero de elementos de cada amostra
N <- 1000 # numero de amostras

Cálculo dos índices de dominância teóricos

# Indices de dominancia teoricos:

D1_T <- (k*sum(p^2) -1)/(k-1) # indice de Herfindahl–Hirschmann normalizado

p_O <- sort(p, decreasing = T)
pesos <- seq_along(p_O)
Iros <- 1/(2*sum(pesos*p_O)-1)
D2_T <- (k*Iros - 1)/(k-1) # indice de Rosenbluth–Hall–Tidemann normalizado

Hs <- -sum(p*log(p))
D3_T <- 1 - Hs/log(k) # indice de Shannon normalizado

Iheip <- (exp(Hs) - 1)/(k - 1)
D4_T <- 1 - Iheip # indice de Heip

Ihk <- sum(p^2)^(-1)
D5_T <- (k - Ihk)/(k-1) # indice de Hannah-Kay

VA <- 1 - ( sum(( (n*p) - (n/k) )^2) / (( (n^2)*(k-1) )/k) )
D6_T <- 1 - VA

SDA <- 1 - sqrt( sum(( (n*p) - (n/k) )^2) / (( (n^2)*(k-1) )/k) )
D7_T <- 1 - SDA

cat(D1_T, D2_T, D3_T, D4_T, D5_T, D6_T, D7_T)
## 0.33136 0.3172414 0.4651595 0.678545 0.7483288 0.33136 0.5756388

Simulação

m1 <- matrix(0, nrow <- n, ncol <- N) # matiz que vai receber as amostras
d1 <- matrix(0, nrow <- N, ncol <- 7) # guarda os indices de dominancia

set.seed(123)
for (i in 1:N){
  a <- sample(emp, size = n, replace = T, prob = p) # gera uma amostra
  m1[,i] <- a # cada coluna da matriz vai ser uma amostra
  
  d1[i, 1] <- D1(a) # cada coluna de d1 recebe um indice de dominancia
  d1[i, 2] <- D2(a)
  d1[i, 3] <- D3(a)
  d1[i, 4] <- D4(a)
  d1[i, 5] <- D5(a)
  d1[i, 6] <- D6(a)
  d1[i, 7] <- D7(a)
}

Teste de Jarque-Bera para normalidade

Teste de normalidade para cada conjunto dos índices calculados:

# Testando normalidade

alpha <- 0.05 # nivel de significancia

result_teste <- matrix(0, ncol = 7, nrow = 1) # vai guardar o resultado dos testes
colnames(result_teste) <- c("D1", "D2", "D3", "D4", "D5", "D6", "D7")

par(mfrow = c(3, 3), mar = c(3, 3, 2, 1))  # margens ajustadas
for (i in 1:7){
  hist(d1[,i], main = paste0("Histograma de D", i), col = i+1,
       xlab = paste0("D", i), ylab = "Frequência")
  teste <- jarque.bera.test(d1[,i]) # teste para normalidade
  result_teste[,i] <-  ifelse(teste$p.value < alpha, "rej", "ñ rej")
}
result_teste
##      D1      D2      D3      D4      D5      D6      D7     
## [1,] "ñ rej" "ñ rej" "ñ rej" "ñ rej" "ñ rej" "ñ rej" "ñ rej"

Cálculo do MAPE e do CV

# Calculando o MAPE (Erro Percentual Absoluto Médio)
MAPE1 <- mean((abs(D1_T - d1[,1])/D1_T)*100)
MAPE2 <- mean((abs(D2_T - d1[,2])/D2_T)*100)
MAPE3 <- mean((abs(D3_T - d1[,3])/D3_T)*100)
MAPE4 <- mean((abs(D4_T - d1[,4])/D4_T)*100)
MAPE5 <- mean((abs(D5_T - d1[,5])/D5_T)*100)
MAPE6 <- mean((abs(D6_T - d1[,6])/D6_T)*100)
MAPE7 <- mean((abs(D7_T - d1[,7])/D7_T)*100)
MAPE <- c(MAPE1, MAPE2, MAPE3, MAPE4, MAPE5, MAPE6, MAPE7)

paste0("Menor MAPE: D", which.min(MAPE), ", min = ", round(min(MAPE), 4))
## [1] "Menor MAPE: D5, min = 0.4264"
paste0("Segundo menor MAPE: D", which.min(MAPE[-which.min(MAPE)]), ", min = ", round(min(MAPE[-which.min(MAPE)]), 4))
## [1] "Segundo menor MAPE: D6, min = 0.5669"
# Calculando o CV
cv1 <- sd(d1[,1])/mean(d1[,1])
cv2 <- sd(d1[,2])/mean(d1[,2])
cv3 <- sd(d1[,3])/mean(d1[,3])
cv4 <- sd(d1[,4])/mean(d1[,4])
cv5 <- sd(d1[,5])/mean(d1[,5])
cv6 <- sd(d1[,6])/mean(d1[,6])
cv7 <- sd(d1[,7])/mean(d1[,7])
CV <- c(cv1, cv2, cv3, cv4, cv5, cv6, cv7)

paste0("Menor CV: D", which.min(CV), ", min = ", round(min(CV), 4))
## [1] "Menor CV: D5, min = 0.0053"
paste0("Segundo menor CV: D", which.min(CV[-which.min(CV)]), ", min = ", round(min(CV[-which.min(CV)]), 4))
## [1] "Segundo menor CV: D6, min = 0.007"

Caso 7

Configuração do sétimo caso com \(n=1000\)

emp <- c("1", "2", "3", "4", "5", "6", "7", "8", "9", "10") # empresas
p <- c(0.09, 0.11, 0.09, 0.11, 0.09, 0.11, 0.09, 0.11, 0.09, 0.11) # participacoes de mercado
k <- length(emp) # numero de empresas


n <- 1000 # numero de elementos de cada amostra
N <- 1000 # numero de amostras

Cálculo dos índices de dominância teóricos

# Indices de dominancia teoricos:

D1_T <- (k*sum(p^2) -1)/(k-1) # indice de Herfindahl–Hirschmann normalizado

p_O <- sort(p, decreasing = T)
pesos <- seq_along(p_O)
Iros <- 1/(2*sum(pesos*p_O)-1)
D2_T <- (k*Iros - 1)/(k-1) # indice de Rosenbluth–Hall–Tidemann normalizado

Hs <- -sum(p*log(p))
D3_T <- 1 - Hs/log(k) # indice de Shannon normalizado

Iheip <- (exp(Hs) - 1)/(k - 1)
D4_T <- 1 - Iheip # indice de Heip

Ihk <- sum(p^2)^(-1)
D5_T <- (k - Ihk)/(k-1) # indice de Hannah-Kay

VA <- 1 - ( sum(( (n*p) - (n/k) )^2) / (( (n^2)*(k-1) )/k) )
D6_T <- 1 - VA

SDA <- 1 - sqrt( sum(( (n*p) - (n/k) )^2) / (( (n^2)*(k-1) )/k) )
D7_T <- 1 - SDA

cat(D1_T, D2_T, D3_T, D4_T, D5_T, D6_T, D7_T)
## 0.001111111 0.005847953 0.002175106 0.00555094 0.0110011 0.001111111 0.03333333

Simulação

# iniciando com n = 1000

m1 <- matrix(0, nrow <- n, ncol <- N) # matiz que vai receber as amostras
d1 <- matrix(0, nrow <- N, ncol <- 7) # guarda os indices de dominancia

set.seed(123)
for (i in 1:N){
  a <- sample(emp, size = n, replace = T, prob = p) # gera uma amostra
  m1[,i] <- a # cada coluna da matriz vai ser uma amostra
  
  d1[i, 1] <- D1(a) # cada coluna de d1 recebe um indice de dominancia
  d1[i, 2] <- D2(a)
  d1[i, 3] <- D3(a)
  d1[i, 4] <- D4(a)
  d1[i, 5] <- D5(a)
  d1[i, 6] <- D6(a)
  d1[i, 7] <- D7(a)
}

Teste de Jarque-Bera para normalidade

# Testando normalidade

alpha <- 0.05 # nivel de significancia

result_teste <- matrix(0, ncol = 7, nrow = 1) # vai guardar o resultado dos testes
colnames(result_teste) <- c("D1", "D2", "D3", "D4", "D5", "D6", "D7")

par(mfrow = c(3, 3), mar = c(3, 3, 2, 1))  # margens ajustadas
for (i in 1:7){
  hist(d1[,i], main = paste0("Histograma de D", i), col = i+1,
       xlab = paste0("D", i), ylab = "Frequência")
  teste <- jarque.bera.test(d1[,i]) # teste para normalidade
  result_teste[,i] <-  ifelse(teste$p.value < alpha, "rej", "ñ rej")
}
result_teste
##      D1    D2      D3    D4    D5    D6    D7     
## [1,] "rej" "ñ rej" "rej" "rej" "rej" "rej" "ñ rej"

Cálculo do MAPE e do CV

# Calculando o MAPE (Erro Percentual Absoluto Médio)
MAPE1 <- mean((abs(D1_T - d1[,1])/D1_T)*100)
MAPE2 <- mean((abs(D2_T - d1[,2])/D2_T)*100)
MAPE3 <- mean((abs(D3_T - d1[,3])/D3_T)*100)
MAPE4 <- mean((abs(D4_T - d1[,4])/D4_T)*100)
MAPE5 <- mean((abs(D5_T - d1[,5])/D5_T)*100)
MAPE6 <- mean((abs(D6_T - d1[,6])/D6_T)*100)
MAPE7 <- mean((abs(D7_T - d1[,7])/D7_T)*100)
MAPE <- c(MAPE1, MAPE2, MAPE3, MAPE4, MAPE5, MAPE6, MAPE7)

paste0("Menor MAPE: D", which.min(MAPE), ", min = ", round(min(MAPE), 4))
## [1] "Menor MAPE: D7, min = 37.9476"
paste0("Segundo menor MAPE: D", which.min(MAPE[-which.min(MAPE)]), ", min = ", round(min(MAPE[-which.min(MAPE)]), 4))
## [1] "Segundo menor MAPE: D2, min = 56.5749"
# Calculando o CV
cv1 <- sd(d1[,1])/mean(d1[,1])
cv2 <- sd(d1[,2])/mean(d1[,2])
cv3 <- sd(d1[,3])/mean(d1[,3])
cv4 <- sd(d1[,4])/mean(d1[,4])
cv5 <- sd(d1[,5])/mean(d1[,5])
cv6 <- sd(d1[,6])/mean(d1[,6])
cv7 <- sd(d1[,7])/mean(d1[,7])
CV <- c(cv1, cv2, cv3, cv4, cv5, cv6, cv7)

paste0("Menor CV: D", which.min(CV), ", min = ", round(min(CV), 4))
## [1] "Menor CV: D7, min = 0.2024"
paste0("Segundo menor CV: D", which.min(CV[-which.min(CV)]), ", min = ", round(min(CV[-which.min(CV)]), 4))
## [1] "Segundo menor CV: D2, min = 0.2227"

Configuração do sétimo caso com \(n=3000\)

emp <- c("1", "2", "3", "4", "5", "6", "7", "8", "9", "10") # empresas
p <- c(0.09, 0.11, 0.09, 0.11, 0.09, 0.11, 0.09, 0.11, 0.09, 0.11) # participacoes de mercado
k <- length(emp) # numero de empresas


n <- 3000 # numero de elementos de cada amostra
N <- 1000 # numero de amostras

Cálculo dos índices de dominância teóricos

# Indices de dominancia teoricos:

D1_T <- (k*sum(p^2) -1)/(k-1) # indice de Herfindahl–Hirschmann normalizado

p_O <- sort(p, decreasing = T)
pesos <- seq_along(p_O)
Iros <- 1/(2*sum(pesos*p_O)-1)
D2_T <- (k*Iros - 1)/(k-1) # indice de Rosenbluth–Hall–Tidemann normalizado

Hs <- -sum(p*log(p))
D3_T <- 1 - Hs/log(k) # indice de Shannon normalizado

Iheip <- (exp(Hs) - 1)/(k - 1)
D4_T <- 1 - Iheip # indice de Heip

Ihk <- sum(p^2)^(-1)
D5_T <- (k - Ihk)/(k-1) # indice de Hannah-Kay

VA <- 1 - ( sum(( (n*p) - (n/k) )^2) / (( (n^2)*(k-1) )/k) )
D6_T <- 1 - VA

SDA <- 1 - sqrt( sum(( (n*p) - (n/k) )^2) / (( (n^2)*(k-1) )/k) )
D7_T <- 1 - SDA

cat(D1_T, D2_T, D3_T, D4_T, D5_T, D6_T, D7_T)
## 0.001111111 0.005847953 0.002175106 0.00555094 0.0110011 0.001111111 0.03333333

Simulação

m1 <- matrix(0, nrow <- n, ncol <- N) # matiz que vai receber as amostras
d1 <- matrix(0, nrow <- N, ncol <- 7) # guarda os indices de dominancia

set.seed(123)
for (i in 1:N){
  a <- sample(emp, size = n, replace = T, prob = p) # gera uma amostra
  m1[,i] <- a # cada coluna da matriz vai ser uma amostra
  
  d1[i, 1] <- D1(a) # cada coluna de d1 recebe um indice de dominancia
  d1[i, 2] <- D2(a)
  d1[i, 3] <- D3(a)
  d1[i, 4] <- D4(a)
  d1[i, 5] <- D5(a)
  d1[i, 6] <- D6(a)
  d1[i, 7] <- D7(a)
}

Teste de Jarque-Bera para normalidade

Teste de normalidade para cada conjunto dos índices calculados:

# Testando normalidade

alpha <- 0.05 # nivel de significancia

result_teste <- matrix(0, ncol = 7, nrow = 1) # vai guardar o resultado dos testes
colnames(result_teste) <- c("D1", "D2", "D3", "D4", "D5", "D6", "D7")

par(mfrow = c(3, 3), mar = c(3, 3, 2, 1))  # margens ajustadas
for (i in 1:7){
  hist(d1[,i], main = paste0("Histograma de D", i), col = i+1,
       xlab = paste0("D", i), ylab = "Frequência")
  teste <- jarque.bera.test(d1[,i]) # teste para normalidade
  result_teste[,i] <-  ifelse(teste$p.value < alpha, "rej", "ñ rej")
}
result_teste
##      D1    D2      D3    D4    D5    D6    D7     
## [1,] "rej" "ñ rej" "rej" "rej" "rej" "rej" "ñ rej"

Cálculo do MAPE e do CV

# Calculando o MAPE (Erro Percentual Absoluto Médio)
MAPE1 <- mean((abs(D1_T - d1[,1])/D1_T)*100)
MAPE2 <- mean((abs(D2_T - d1[,2])/D2_T)*100)
MAPE3 <- mean((abs(D3_T - d1[,3])/D3_T)*100)
MAPE4 <- mean((abs(D4_T - d1[,4])/D4_T)*100)
MAPE5 <- mean((abs(D5_T - d1[,5])/D5_T)*100)
MAPE6 <- mean((abs(D6_T - d1[,6])/D6_T)*100)
MAPE7 <- mean((abs(D7_T - d1[,7])/D7_T)*100)
MAPE <- c(MAPE1, MAPE2, MAPE3, MAPE4, MAPE5, MAPE6, MAPE7)

paste0("Menor MAPE: D", which.min(MAPE), ", min = ", round(min(MAPE), 4))
## [1] "Menor MAPE: D7, min = 17.4775"
paste0("Segundo menor MAPE: D", which.min(MAPE[-which.min(MAPE)]), ", min = ", round(min(MAPE[-which.min(MAPE)]), 4))
## [1] "Segundo menor MAPE: D2, min = 29.86"
# Calculando o CV
cv1 <- sd(d1[,1])/mean(d1[,1])
cv2 <- sd(d1[,2])/mean(d1[,2])
cv3 <- sd(d1[,3])/mean(d1[,3])
cv4 <- sd(d1[,4])/mean(d1[,4])
cv5 <- sd(d1[,5])/mean(d1[,5])
cv6 <- sd(d1[,6])/mean(d1[,6])
cv7 <- sd(d1[,7])/mean(d1[,7])
CV <- c(cv1, cv2, cv3, cv4, cv5, cv6, cv7)

paste0("Menor CV: D", which.min(CV), ", min = ", round(min(CV), 4))
## [1] "Menor CV: D7, min = 0.1583"
paste0("Segundo menor CV: D", which.min(CV[-which.min(CV)]), ", min = ", round(min(CV[-which.min(CV)]), 4))
## [1] "Segundo menor CV: D2, min = 0.1686"

Caso 8

Configuração do oitavo caso com \(n=1000\)

emp <- c("1", "2", "3", "4", "5", "6", "7", "8", "9", "10") # empresas
p <- c(0.91, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01) # participacoes de mercado
k <- length(emp) # numero de empresas


n <- 1000 # numero de elementos de cada amostra
N <- 1000 # numero de amostras

Cálculo dos índices de dominância teóricos

# Indices de dominancia teoricos:

D1_T <- (k*sum(p^2) -1)/(k-1) # indice de Herfindahl–Hirschmann normalizado

p_O <- sort(p, decreasing = T)
pesos <- seq_along(p_O)
Iros <- 1/(2*sum(pesos*p_O)-1)
D2_T <- (k*Iros - 1)/(k-1) # indice de Rosenbluth–Hall–Tidemann normalizado

Hs <- -sum(p*log(p))
D3_T <- 1 - Hs/log(k) # indice de Shannon normalizado

Iheip <- (exp(Hs) - 1)/(k - 1)
D4_T <- 1 - Iheip # indice de Heip

Ihk <- sum(p^2)^(-1)
D5_T <- (k - Ihk)/(k-1) # indice de Hannah-Kay

VA <- 1 - ( sum(( (n*p) - (n/k) )^2) / (( (n^2)*(k-1) )/k) )
D6_T <- 1 - VA

SDA <- 1 - sqrt( sum(( (n*p) - (n/k) )^2) / (( (n^2)*(k-1) )/k) )
D7_T <- 1 - SDA

cat(D1_T, D2_T, D3_T, D4_T, D5_T, D6_T, D7_T)
## 0.81 0.4736842 0.7827277 0.9278671 0.9770808 0.81 0.9

Simulação

# iniciando com n = 1000

m1 <- matrix(0, nrow <- n, ncol <- N) # matiz que vai receber as amostras
d1 <- matrix(0, nrow <- N, ncol <- 7) # guarda os indices de dominancia

set.seed(123)
for (i in 1:N){
  a <- sample(emp, size = n, replace = T, prob = p) # gera uma amostra
  m1[,i] <- a # cada coluna da matriz vai ser uma amostra
  
  d1[i, 1] <- D1(a) # cada coluna de d1 recebe um indice de dominancia
  d1[i, 2] <- D2(a)
  d1[i, 3] <- D3(a)
  d1[i, 4] <- D4(a)
  d1[i, 5] <- D5(a)
  d1[i, 6] <- D6(a)
  d1[i, 7] <- D7(a)
}

Teste de Jarque-Bera para normalidade

# Testando normalidade

alpha <- 0.05 # nivel de significancia

result_teste <- matrix(0, ncol = 7, nrow = 1) # vai guardar o resultado dos testes
colnames(result_teste) <- c("D1", "D2", "D3", "D4", "D5", "D6", "D7")

par(mfrow = c(3, 3), mar = c(3, 3, 2, 1))  # margens ajustadas
for (i in 1:7){
  hist(d1[,i], main = paste0("Histograma de D", i), col = i+1,
       xlab = paste0("D", i), ylab = "Frequência")
  teste <- jarque.bera.test(d1[,i]) # teste para normalidade
  result_teste[,i] <-  ifelse(teste$p.value < alpha, "rej", "ñ rej")
}
result_teste
##      D1      D2      D3      D4    D5    D6      D7     
## [1,] "ñ rej" "ñ rej" "ñ rej" "rej" "rej" "ñ rej" "ñ rej"

Cálculo do MAPE e do CV

# Calculando o MAPE (Erro Percentual Absoluto Médio)
MAPE1 <- mean((abs(D1_T - d1[,1])/D1_T)*100)
MAPE2 <- mean((abs(D2_T - d1[,2])/D2_T)*100)
MAPE3 <- mean((abs(D3_T - d1[,3])/D3_T)*100)
MAPE4 <- mean((abs(D4_T - d1[,4])/D4_T)*100)
MAPE5 <- mean((abs(D5_T - d1[,5])/D5_T)*100)
MAPE6 <- mean((abs(D6_T - d1[,6])/D6_T)*100)
MAPE7 <- mean((abs(D7_T - d1[,7])/D7_T)*100)
MAPE <- c(MAPE1, MAPE2, MAPE3, MAPE4, MAPE5, MAPE6, MAPE7)

paste0("Menor MAPE: D", which.min(MAPE), ", min = ", round(min(MAPE), 4))
## [1] "Menor MAPE: D5, min = 0.2132"
paste0("Segundo menor MAPE: D", which.min(MAPE[-which.min(MAPE)]), ", min = ", round(min(MAPE[-which.min(MAPE)]), 4))
## [1] "Segundo menor MAPE: D4, min = 0.644"
# Calculando o CV
cv1 <- sd(d1[,1])/mean(d1[,1])
cv2 <- sd(d1[,2])/mean(d1[,2])
cv3 <- sd(d1[,3])/mean(d1[,3])
cv4 <- sd(d1[,4])/mean(d1[,4])
cv5 <- sd(d1[,5])/mean(d1[,5])
cv6 <- sd(d1[,6])/mean(d1[,6])
cv7 <- sd(d1[,7])/mean(d1[,7])
CV <- c(cv1, cv2, cv3, cv4, cv5, cv6, cv7)

paste0("Menor CV: D", which.min(CV), ", min = ", round(min(CV), 4))
## [1] "Menor CV: D5, min = 0.0027"
paste0("Segundo menor CV: D", which.min(CV[-which.min(CV)]), ", min = ", round(min(CV[-which.min(CV)]), 4))
## [1] "Segundo menor CV: D4, min = 0.008"

Configuração do oitavo caso com \(n=3000\)

emp <- c("1", "2", "3", "4", "5", "6", "7", "8", "9", "10") # empresas
p <- c(0.91, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01) # participacoes de mercado
k <- length(emp) # numero de empresas


n <- 3000 # numero de elementos de cada amostra
N <- 1000 # numero de amostras

Cálculo dos índices de dominância teóricos

# Indices de dominancia teoricos:

D1_T <- (k*sum(p^2) -1)/(k-1) # indice de Herfindahl–Hirschmann normalizado

p_O <- sort(p, decreasing = T)
pesos <- seq_along(p_O)
Iros <- 1/(2*sum(pesos*p_O)-1)
D2_T <- (k*Iros - 1)/(k-1) # indice de Rosenbluth–Hall–Tidemann normalizado

Hs <- -sum(p*log(p))
D3_T <- 1 - Hs/log(k) # indice de Shannon normalizado

Iheip <- (exp(Hs) - 1)/(k - 1)
D4_T <- 1 - Iheip # indice de Heip

Ihk <- sum(p^2)^(-1)
D5_T <- (k - Ihk)/(k-1) # indice de Hannah-Kay

VA <- 1 - ( sum(( (n*p) - (n/k) )^2) / (( (n^2)*(k-1) )/k) )
D6_T <- 1 - VA

SDA <- 1 - sqrt( sum(( (n*p) - (n/k) )^2) / (( (n^2)*(k-1) )/k) )
D7_T <- 1 - SDA

cat(D1_T, D2_T, D3_T, D4_T, D5_T, D6_T, D7_T)
## 0.81 0.4736842 0.7827277 0.9278671 0.9770808 0.81 0.9

Simulação

m1 <- matrix(0, nrow <- n, ncol <- N) # matiz que vai receber as amostras
d1 <- matrix(0, nrow <- N, ncol <- 7) # guarda os indices de dominancia

set.seed(123)
for (i in 1:N){
  a <- sample(emp, size = n, replace = T, prob = p) # gera uma amostra
  m1[,i] <- a # cada coluna da matriz vai ser uma amostra
  
  d1[i, 1] <- D1(a) # cada coluna de d1 recebe um indice de dominancia
  d1[i, 2] <- D2(a)
  d1[i, 3] <- D3(a)
  d1[i, 4] <- D4(a)
  d1[i, 5] <- D5(a)
  d1[i, 6] <- D6(a)
  d1[i, 7] <- D7(a)
}

Teste de Jarque-Bera para normalidade

Teste de normalidade para cada conjunto dos índices calculados:

# Testando normalidade

alpha <- 0.05 # nivel de significancia

result_teste <- matrix(0, ncol = 7, nrow = 1) # vai guardar o resultado dos testes
colnames(result_teste) <- c("D1", "D2", "D3", "D4", "D5", "D6", "D7")

par(mfrow = c(3, 3), mar = c(3, 3, 2, 1))  # margens ajustadas
for (i in 1:7){
  hist(d1[,i], main = paste0("Histograma de D", i), col = i+1,
       xlab = paste0("D", i), ylab = "Frequência")
  teste <- jarque.bera.test(d1[,i]) # teste para normalidade
  result_teste[,i] <-  ifelse(teste$p.value < alpha, "rej", "ñ rej")
}
result_teste
##      D1      D2    D3      D4      D5      D6      D7     
## [1,] "ñ rej" "rej" "ñ rej" "ñ rej" "ñ rej" "ñ rej" "ñ rej"

Cálculo do MAPE e do CV

# Calculando o MAPE (Erro Percentual Absoluto Médio)
MAPE1 <- mean((abs(D1_T - d1[,1])/D1_T)*100)
MAPE2 <- mean((abs(D2_T - d1[,2])/D2_T)*100)
MAPE3 <- mean((abs(D3_T - d1[,3])/D3_T)*100)
MAPE4 <- mean((abs(D4_T - d1[,4])/D4_T)*100)
MAPE5 <- mean((abs(D5_T - d1[,5])/D5_T)*100)
MAPE6 <- mean((abs(D6_T - d1[,6])/D6_T)*100)
MAPE7 <- mean((abs(D7_T - d1[,7])/D7_T)*100)
MAPE <- c(MAPE1, MAPE2, MAPE3, MAPE4, MAPE5, MAPE6, MAPE7)

paste0("Menor MAPE: D", which.min(MAPE), ", min = ", round(min(MAPE), 4))
## [1] "Menor MAPE: D5, min = 0.1219"
paste0("Segundo menor MAPE: D", which.min(MAPE[-which.min(MAPE)]), ", min = ", round(min(MAPE[-which.min(MAPE)]), 4))
## [1] "Segundo menor MAPE: D4, min = 0.3658"
# Calculando o CV
cv1 <- sd(d1[,1])/mean(d1[,1])
cv2 <- sd(d1[,2])/mean(d1[,2])
cv3 <- sd(d1[,3])/mean(d1[,3])
cv4 <- sd(d1[,4])/mean(d1[,4])
cv5 <- sd(d1[,5])/mean(d1[,5])
cv6 <- sd(d1[,6])/mean(d1[,6])
cv7 <- sd(d1[,7])/mean(d1[,7])
CV <- c(cv1, cv2, cv3, cv4, cv5, cv6, cv7)

paste0("Menor CV: D", which.min(CV), ", min = ", round(min(CV), 4))
## [1] "Menor CV: D5, min = 0.0015"
paste0("Segundo menor CV: D", which.min(CV[-which.min(CV)]), ", min = ", round(min(CV[-which.min(CV)]), 4))
## [1] "Segundo menor CV: D4, min = 0.0046"

Caso 9

Configuração do nono caso com \(n=1000\)

emp <- c("1", "2", "3", "4", "5", "6", "7", "8", "9", "10") # empresas
p <- c(0.45, 0.47, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01) # participacoes de mercado
k <- length(emp) # numero de empresas


n <- 1000 # numero de elementos de cada amostra
N <- 1000 # numero de amostras

Cálculo dos índices de dominância teóricos

# Indices de dominancia teoricos:

D1_T <- (k*sum(p^2) -1)/(k-1) # indice de Herfindahl–Hirschmann normalizado

p_O <- sort(p, decreasing = T)
pesos <- seq_along(p_O)
Iros <- 1/(2*sum(pesos*p_O)-1)
D2_T <- (k*Iros - 1)/(k-1) # indice de Rosenbluth–Hall–Tidemann normalizado

Hs <- -sum(p*log(p))
D3_T <- 1 - Hs/log(k) # indice de Shannon normalizado

Iheip <- (exp(Hs) - 1)/(k - 1)
D4_T <- 1 - Iheip # indice de Heip

Ihk <- sum(p^2)^(-1)
D5_T <- (k - Ihk)/(k-1) # indice de Hannah-Kay

VA <- 1 - ( sum(( (n*p) - (n/k) )^2) / (( (n^2)*(k-1) )/k) )
D6_T <- 1 - VA

SDA <- 1 - sqrt( sum(( (n*p) - (n/k) )^2) / (( (n^2)*(k-1) )/k) )
D7_T <- 1 - SDA

cat(D1_T, D2_T, D3_T, D4_T, D5_T, D6_T, D7_T)
## 0.3602222 0.2885691 0.5298316 0.7830718 0.8491802 0.3602222 0.6001852

Simulação

# iniciando com n = 1000

m1 <- matrix(0, nrow <- n, ncol <- N) # matiz que vai receber as amostras
d1 <- matrix(0, nrow <- N, ncol <- 7) # guarda os indices de dominancia

set.seed(123)
for (i in 1:N){
  a <- sample(emp, size = n, replace = T, prob = p) # gera uma amostra
  m1[,i] <- a # cada coluna da matriz vai ser uma amostra
  
  d1[i, 1] <- D1(a) # cada coluna de d1 recebe um indice de dominancia
  d1[i, 2] <- D2(a)
  d1[i, 3] <- D3(a)
  d1[i, 4] <- D4(a)
  d1[i, 5] <- D5(a)
  d1[i, 6] <- D6(a)
  d1[i, 7] <- D7(a)
}

Teste de Jarque-Bera para normalidade

# Testando normalidade

alpha <- 0.05 # nivel de significancia

result_teste <- matrix(0, ncol = 7, nrow = 1) # vai guardar o resultado dos testes
colnames(result_teste) <- c("D1", "D2", "D3", "D4", "D5", "D6", "D7")

par(mfrow = c(3, 3), mar = c(3, 3, 2, 1))  # margens ajustadas
for (i in 1:7){
  hist(d1[,i], main = paste0("Histograma de D", i), col = i+1,
       xlab = paste0("D", i), ylab = "Frequência")
  teste <- jarque.bera.test(d1[,i]) # teste para normalidade
  result_teste[,i] <-  ifelse(teste$p.value < alpha, "rej", "ñ rej")
}
result_teste
##      D1      D2      D3      D4      D5      D6      D7     
## [1,] "ñ rej" "ñ rej" "ñ rej" "ñ rej" "ñ rej" "ñ rej" "ñ rej"

Cálculo do MAPE e do CV

# Calculando o MAPE (Erro Percentual Absoluto Médio)
MAPE1 <- mean((abs(D1_T - d1[,1])/D1_T)*100)
MAPE2 <- mean((abs(D2_T - d1[,2])/D2_T)*100)
MAPE3 <- mean((abs(D3_T - d1[,3])/D3_T)*100)
MAPE4 <- mean((abs(D4_T - d1[,4])/D4_T)*100)
MAPE5 <- mean((abs(D5_T - d1[,5])/D5_T)*100)
MAPE6 <- mean((abs(D6_T - d1[,6])/D6_T)*100)
MAPE7 <- mean((abs(D7_T - d1[,7])/D7_T)*100)
MAPE <- c(MAPE1, MAPE2, MAPE3, MAPE4, MAPE5, MAPE6, MAPE7)

paste0("Menor MAPE: D", which.min(MAPE), ", min = ", round(min(MAPE), 4))
## [1] "Menor MAPE: D5, min = 0.431"
paste0("Segundo menor MAPE: D", which.min(MAPE[-which.min(MAPE)]), ", min = ", round(min(MAPE[-which.min(MAPE)]), 4))
## [1] "Segundo menor MAPE: D6, min = 0.9155"
# Calculando o CV
cv1 <- sd(d1[,1])/mean(d1[,1])
cv2 <- sd(d1[,2])/mean(d1[,2])
cv3 <- sd(d1[,3])/mean(d1[,3])
cv4 <- sd(d1[,4])/mean(d1[,4])
cv5 <- sd(d1[,5])/mean(d1[,5])
cv6 <- sd(d1[,6])/mean(d1[,6])
cv7 <- sd(d1[,7])/mean(d1[,7])
CV <- c(cv1, cv2, cv3, cv4, cv5, cv6, cv7)

paste0("Menor CV: D", which.min(CV), ", min = ", round(min(CV), 4))
## [1] "Menor CV: D5, min = 0.0054"
paste0("Segundo menor CV: D", which.min(CV[-which.min(CV)]), ", min = ", round(min(CV[-which.min(CV)]), 4))
## [1] "Segundo menor CV: D6, min = 0.0114"

Configuração do nono caso com \(n=3000\)

emp <- c("1", "2", "3", "4", "5", "6", "7", "8", "9", "10") # empresas
p <- c(0.45, 0.47, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01) # participacoes de mercado
k <- length(emp) # numero de empresas


n <- 3000 # numero de elementos de cada amostra
N <- 1000 # numero de amostras

Cálculo dos índices de dominância teóricos

# Indices de dominancia teoricos:

D1_T <- (k*sum(p^2) -1)/(k-1) # indice de Herfindahl–Hirschmann normalizado

p_O <- sort(p, decreasing = T)
pesos <- seq_along(p_O)
Iros <- 1/(2*sum(pesos*p_O)-1)
D2_T <- (k*Iros - 1)/(k-1) # indice de Rosenbluth–Hall–Tidemann normalizado

Hs <- -sum(p*log(p))
D3_T <- 1 - Hs/log(k) # indice de Shannon normalizado

Iheip <- (exp(Hs) - 1)/(k - 1)
D4_T <- 1 - Iheip # indice de Heip

Ihk <- sum(p^2)^(-1)
D5_T <- (k - Ihk)/(k-1) # indice de Hannah-Kay

VA <- 1 - ( sum(( (n*p) - (n/k) )^2) / (( (n^2)*(k-1) )/k) )
D6_T <- 1 - VA

SDA <- 1 - sqrt( sum(( (n*p) - (n/k) )^2) / (( (n^2)*(k-1) )/k) )
D7_T <- 1 - SDA

cat(D1_T, D2_T, D3_T, D4_T, D5_T, D6_T, D7_T)
## 0.3602222 0.2885691 0.5298316 0.7830718 0.8491802 0.3602222 0.6001852

Simulação

m1 <- matrix(0, nrow <- n, ncol <- N) # matiz que vai receber as amostras
d1 <- matrix(0, nrow <- N, ncol <- 7) # guarda os indices de dominancia

set.seed(123)
for (i in 1:N){
  a <- sample(emp, size = n, replace = T, prob = p) # gera uma amostra
  m1[,i] <- a # cada coluna da matriz vai ser uma amostra
  
  d1[i, 1] <- D1(a) # cada coluna de d1 recebe um indice de dominancia
  d1[i, 2] <- D2(a)
  d1[i, 3] <- D3(a)
  d1[i, 4] <- D4(a)
  d1[i, 5] <- D5(a)
  d1[i, 6] <- D6(a)
  d1[i, 7] <- D7(a)
}

Teste de Jarque-Bera para normalidade

Teste de normalidade para cada conjunto dos índices calculados:

# Testando normalidade

alpha <- 0.05 # nivel de significancia

result_teste <- matrix(0, ncol = 7, nrow = 1) # vai guardar o resultado dos testes
colnames(result_teste) <- c("D1", "D2", "D3", "D4", "D5", "D6", "D7")

par(mfrow = c(3, 3), mar = c(3, 3, 2, 1))  # margens ajustadas
for (i in 1:7){
  hist(d1[,i], main = paste0("Histograma de D", i), col = i+1,
       xlab = paste0("D", i), ylab = "Frequência")
  teste <- jarque.bera.test(d1[,i]) # teste para normalidade
  result_teste[,i] <-  ifelse(teste$p.value < alpha, "rej", "ñ rej")
}
result_teste
##      D1      D2      D3      D4      D5      D6      D7     
## [1,] "ñ rej" "ñ rej" "ñ rej" "ñ rej" "ñ rej" "ñ rej" "ñ rej"

Cálculo do MAPE e do CV

# Calculando o MAPE (Erro Percentual Absoluto Médio)
MAPE1 <- mean((abs(D1_T - d1[,1])/D1_T)*100)
MAPE2 <- mean((abs(D2_T - d1[,2])/D2_T)*100)
MAPE3 <- mean((abs(D3_T - d1[,3])/D3_T)*100)
MAPE4 <- mean((abs(D4_T - d1[,4])/D4_T)*100)
MAPE5 <- mean((abs(D5_T - d1[,5])/D5_T)*100)
MAPE6 <- mean((abs(D6_T - d1[,6])/D6_T)*100)
MAPE7 <- mean((abs(D7_T - d1[,7])/D7_T)*100)
MAPE <- c(MAPE1, MAPE2, MAPE3, MAPE4, MAPE5, MAPE6, MAPE7)

paste0("Menor MAPE: D", which.min(MAPE), ", min = ", round(min(MAPE), 4))
## [1] "Menor MAPE: D5, min = 0.2537"
paste0("Segundo menor MAPE: D", which.min(MAPE[-which.min(MAPE)]), ", min = ", round(min(MAPE[-which.min(MAPE)]), 4))
## [1] "Segundo menor MAPE: D6, min = 0.5387"
# Calculando o CV
cv1 <- sd(d1[,1])/mean(d1[,1])
cv2 <- sd(d1[,2])/mean(d1[,2])
cv3 <- sd(d1[,3])/mean(d1[,3])
cv4 <- sd(d1[,4])/mean(d1[,4])
cv5 <- sd(d1[,5])/mean(d1[,5])
cv6 <- sd(d1[,6])/mean(d1[,6])
cv7 <- sd(d1[,7])/mean(d1[,7])
CV <- c(cv1, cv2, cv3, cv4, cv5, cv6, cv7)

paste0("Menor CV: D", which.min(CV), ", min = ", round(min(CV), 4))
## [1] "Menor CV: D5, min = 0.0031"
paste0("Segundo menor CV: D", which.min(CV[-which.min(CV)]), ", min = ", round(min(CV[-which.min(CV)]), 4))
## [1] "Segundo menor CV: D6, min = 0.0067"
LS0tDQp0aXRsZTogJ1NpbXVsYcOnw6NvIC0gw41uZGljZXMgZGUgZG9taW7Dom5jaWEnDQphdXRob3I6ICcqSm9uYXMgRnJlaXJlIFJpYmVpcm8qJw0KZGF0ZTogImByIGZvcm1hdChTeXMuRGF0ZSgpLCAnKiVkIGRlICVCLCAgJVkqJylgIg0KbGluay1jaXRhdGlvbnM6IHRydWUNCmxhbmc6ICJwdC1iciINCm91dHB1dDoNCiAgaHRtbF9kb2N1bWVudDoNCiAgICB0aGVtZToNCiAgICAgIGJvb3Rzd2F0Y2g6IGZsYXRseQ0KICAgIGhpZ2hsaWdodDogYnJlZXplZGFyaw0KICAgIHRvYzogdHJ1ZQ0KICAgIHRvY19mbG9hdDogdHJ1ZQ0KICAgIHRvY19kZXB0aDogNA0KICAgIG51bWJlcl9zZWN0aW9uczogdHJ1ZQ0KICAgIGFuY2hvcl9zZWN0aW9uczogdHJ1ZQ0KICAgIGNvZGVfZm9sZGluZzogc2hvdw0KICAgIGNvZGVfZG93bmxvYWQ6IHRydWUNCiAgICBmaWdfY2FwdGlvbjogdHJ1ZQ0KICAgIGNpdGF0aW9uX3BhY2thZ2U6IGJpYmxhdGV4DQotLS0NCg0KIyBGdW7Dp8O1ZXMgcGFyYSBjYWxjdWxhciBvcyDDrW5kaWNlcyBkZSBkb21pbsOibmNpYSB7LnRhYnNldCAudGFic2V0LWZhZGV9DQojIyAkRF8xJCB7LnVubGlzdGVkIC51bm51bWJlcmVkfQ0KDQrDjW5kaWNlIGRlIGRvbWluw6JuY2lhICREXzEkOg0KJCREMSA9IFx0ZXh0e05vcm19KEhISSkgPSBcZnJhY3trIFxzdW1fe2k9MX1ee2t9IHBfaV4yIC0gMX17ayAtIDF9JCQNCg0KYGBge3J9DQpEMSA8LSBmdW5jdGlvbih4KXsNCiAgbiA8LSBsZW5ndGgoeCkgIyBudW1lcm8gdG90YWwgZGUgdmVuZGFzDQogIHByb3AgPC0gdGFibGUoeCkvbiAjIHBhcnRpY2lwYWNvZXMgZGUgbWVyY2Fkbw0KICBrIDwtIGxlbmd0aChwcm9wKSAjIG51bWVybyBkZSBlbXByZXNhcw0KICANCiAgSEhJIDwtIHN1bShwcm9wXjIpICMgaW5kaWNlIGRlIEhlcmZpbmRhaGzigJNIaXJzY2htYW4NCiAgDQogIEQxIDwtIChrKkhISSAtIDEpLyhrLTEpDQogIHJldHVybihEMSkNCn0NCmBgYA0KDQojIyAkRF8yJCB7LnVubGlzdGVkIC51bm51bWJlcmVkfQ0KDQrDjW5kaWNlIGRlIFJvc2VuYmx1dGjigJNIYWxs4oCTVGlkZW1hbm46IA0KJCRcYmVnaW57YWxpZ24qfQ0KCQlJX3tcdGV4dHtSb3N9fSAmPSBcZnJhY3sxfXsyXHN1bV97aT0xfV57a30gaVwscF97KGkpfSAtIDF9IA0KCVxlbmR7YWxpZ24qfSQkDQoNCsONbmRpY2UgZGUgZG9taW7Dom5jaWEgJERfMiQ6DQokJFxiZWdpbnthbGlnbip9DQoJCURfMiAmPSBcZnJhY3tJX3tcdGV4dHtSb3N9fSAtIDEva317MS0gXGZyYWN7MX17a319IFxcDQoJCSY9IFxmcmFje2sgSV97XHRleHR7Um9zfX0gLSAxfXtrIC0gMX0uDQoJXGVuZHthbGlnbip9JCQNCg0KYGBge3J9DQpEMiA8LSBmdW5jdGlvbih4KXsNCiAgbiA8LSBsZW5ndGgoeCkgIyB0b3RhbCBkZSB2ZW5kYXMNCiAgcHJvcCA8LSB0YWJsZSh4KS9uICMgcGFydGljaXBhY29lcyBkZSBtZXJjYWRvDQogIHByb3BfTyA8LSBzb3J0KHByb3AsIGRlY3JlYXNpbmcgPSBUKSAjIHBhcnRpY2lwYWNvZXMgZGUgbWVyY2FkbyBvcmRlbmFkYXMNCiAgcGVzb3MgPC0gc2VxX2Fsb25nKHByb3BfTykgIyBpbmRpY2VzIGRhcyBwYXJ0aWNpcGFjb2VzIGRlIG1lcmNhZG8gb3JkZW5hZGFzDQogIGsgPC0gbGVuZ3RoKHByb3ApICMgbnVtZXJvIGRlIGVtcHJlc2FzDQogIA0KICBJcm9zIDwtIDEvKDIqc3VtKHBlc29zKnByb3BfTykgLSAxKSAjIGluZGljZSBkZSBSb3NlbmJsdXRo4oCTSGFsbOKAk1RpZGVtYW5uDQogIA0KICBEMiA8LSAoaypJcm9zIC0gMSkvKGsgLSAxKQ0KICByZXR1cm4oRDIpDQp9DQpgYGANCg0KIyMgJERfMyQgey51bmxpc3RlZCAudW5udW1iZXJlZH0NCg0KRW50cm9waWEgZGUgU2hhbm5vbjoNCiQkXGJlZ2lue2FsaWduKn0NCgkJSF9zID0gLVxzdW1fe2k9MX1ee2t9cF9pXGxuIHBfaS4NCglcZW5ke2FsaWduKn0gJCQNCg0Kw41uZGljZSBkZSBkb21pbsOibmNpYSAkRF8zJDoNCiQkXGJlZ2lue2FsaWduKn0NCgkJRF8zICY9IDEgLSBcdGV4dHtOb3JtfShIX3MpIFxcDQoJCSY9IDEgLSBcZnJhY3tIX3N9e1xsbiBrfQ0KCVxlbmR7YWxpZ24qfSQkDQoNCmBgYHtyfQ0KRDMgPC0gZnVuY3Rpb24oeCl7DQogIG4gPC0gbGVuZ3RoKHgpICMgdG90YWwgZGUgdmVuZGFzDQogIHByb3AgPC0gdGFibGUoeCkvbiAjIHBhcnRpY2lwYWNvZXMgZGUgbWVyY2Fkbw0KICBrIDwtIGxlbmd0aChwcm9wKSAjIG51bWVybyBkZSBlbXByZXNhcw0KICANCiAgSHMgPC0gLXN1bShwcm9wKmxvZyhwcm9wKSkgIyBlbnRyb3BpYSBkZSBzaGFubm9uDQogIEhzTm9ybSA8LSBIcy9sb2coaykgIyBlbnRyb3BpYSBkZSBzaGFubm9uIG5vcm1hbGl6YWRhDQogIA0KICBEMyA8LSAxIC0gSHNOb3JtDQogIHJldHVybihEMykNCn0NCmBgYA0KDQoNCiMjICREXzQkIHsudW5saXN0ZWQgLnVubnVtYmVyZWR9DQoNCsONbmRpY2UgZGUgSGVpcDoNCiQkXGJlZ2lue2FsaWduKn0NCgkJSV97XHRleHR7SGVpcH19ICY9IFxmcmFje2Vee0hfU30gLSAxfXtrIC0gMX0sDQoJXGVuZHthbGlnbip9JCQNCg0Kw41uZGljZSBkZSBkb21pbsOibmNpYSAkRF80JDoNCiQkXGJlZ2lue2FsaWduKn0NCgkJRF80ICY9IDEgLSBJX3tcdGV4dHtIZWlwfX0gXFwNCgkJJj0gXGZyYWN7ayAtIGVee0hfU319e2sgLSAxfQ0KCVxlbmR7YWxpZ24qfSQkDQoNCmBgYHtyfQ0KRDQgPC0gZnVuY3Rpb24oeCl7DQogIG4gPC0gbGVuZ3RoKHgpICMgdG90YWwgZGUgdmVuZGFzDQogIHByb3AgPC0gdGFibGUoeCkvbiAjIHBhcnRpY2lwYWNvZXMgZGUgbWVyY2Fkbw0KICBrIDwtIGxlbmd0aChwcm9wKSAjIG51bWVybyBkZSBlbXByZXNhcw0KICANCiAgSHMgPC0gLXN1bShwcm9wKmxvZyhwcm9wKSkgIyBlbnRyb3BpYSBkZSBzaGFubm9uDQogIEloZWlwIDwtIChleHAoSHMpIC0gMSkvKGsgLSAxKSAjIGluZGljZSBkZSBIZWlwDQogIA0KICBENCA8LSAxIC0gSWhlaXANCiAgcmV0dXJuKEQ0KQ0KfQ0KYGBgDQoNCiMjICREXzUkIHsudW5saXN0ZWQgLnVubnVtYmVyZWR9DQoNCsONbmRpY2UgZGUgSGFubmFoLUtheToNCiQkXGJlZ2lue2FsaWduKn0NCgkJSV97SEt9KFxhbHBoYSkgJj0gXGxlZnQoIFxzdW1fe2k9MX1ee2t9IHBfaV5cYWxwaGEgXHJpZ2h0KV57XGZyYWN7MX17MS1cYWxwaGF9fSwgXHF1YWQgXGFscGhhPjAsIFxhbHBoYSBcbmVxIDEuDQoJXGVuZHthbGlnbip9JCQNCg0Kw41uZGljZSBkZSBkb21pbsOibmNpYSAkRF81JDoNCiQkXGJlZ2lue2FsaWduKn0NCgkJRF81ICY9IFxmcmFje2sgLSBJX3tIS30oMil9e2sgLSAxfSANCglcZW5ke2FsaWduKn0kJA0KDQpgYGB7cn0NCkQ1IDwtIGZ1bmN0aW9uKHgpew0KICBuIDwtIGxlbmd0aCh4KSAjIHRvdGFsIGRlIHZlbmRhcw0KICBwcm9wIDwtIHRhYmxlKHgpL24gIyBwYXJ0aWNpcGFjb2VzIGRlIG1lcmNhZG8NCiAgayA8LSBsZW5ndGgocHJvcCkgIyBudW1lcm8gZGUgZW1wcmVzYXMNCiAgDQogIEloayA8LSBzdW0ocHJvcF4yKV4oLTEpICMgaW5kaWNlIGRlIEhhbm5haC1LYXkNCiAgDQogIEQ1IDwtIChrIC0gSWhrKS8oay0xKQ0KICByZXR1cm4oRDUpDQp9DQpgYGANCg0KIyMgJERfNiQgey51bmxpc3RlZCAudW5udW1iZXJlZH0NCg0KRXN0YXTDrXN0aWNhICRWQSQ6DQokJFxiZWdpbnthbGlnbip9DQoJCVZBICY9IDEgLSANCgkJXGZyYWN7XGRpc3BsYXlzdHlsZSBcc3VtX3tpPTF9XntrfSBcbGVmdChmX2kgLSBcZnJhY3tufXtrfVxyaWdodCleMn0NCgkJe25eMiBcZnJhY3soay0xKX17a319LA0KCVxlbmR7YWxpZ24qfSQkDQoNCsONbmRpY2UgZGUgZG9taW7Dom5jaWEgJERfNiQ6DQokJFxiZWdpbnthbGlnbip9DQoJIAlEXzYgJj0gMSAtIFZBXFwNCgkgCSY9IFxmcmFje2t9e2stMX0gXGxlZnQoIFxzdW1fe2k9MX1ee2t9IHBfaV4yIC0gXGZyYWN7MX17a30gXHJpZ2h0KQ0KCSBcZW5ke2FsaWduKn0kJA0KDQpgYGB7cn0NCkQ2IDwtIGZ1bmN0aW9uKHgpew0KICBuIDwtIGxlbmd0aCh4KSAjIHRvdGFsIGRlIHZlbmRhcw0KICB0YWIgPC0gdGFibGUoeCkgIyBwYXJ0aWNpcGFjb2VzIGRlIG1lcmNhZG8NCiAgayA8LSBsZW5ndGgodGFiKSAjIG51bWVybyBkZSBlbXByZXNhcw0KICANCiAgVkEgPC0gMSAtICggc3VtKCAodGFiIC0gKG4vaykpXjIgKS8oICggKG5eMikqKGstMSkgKS9rICkgKSAjIGVzdGF0aXN0aWNhIFZBDQogIA0KICBENiA8LSAxIC0gVkENCiAgcmV0dXJuKEQ2KQ0KfQ0KYGBgDQoNCiMjICREXzckIHsudW5saXN0ZWQgLnVubnVtYmVyZWR9DQoNCkVzdGF0w61zdGljYSAkU0RBJDoNCiQkXGJlZ2lue2FsaWduKn0NCgkJU0RBICY9IDEgLSANCgkJXHNxcnR7XGZyYWN7XGRpc3BsYXlzdHlsZSBcc3VtX3tpPTF9XntrfSBcbGVmdChmX2kgLSBcZnJhY3tufXtrfVxyaWdodCleMn0NCgkJe25eMiBcZnJhY3soay0xKX17a319fQ0KCVxlbmR7YWxpZ24qfSQkDQoNCkluZGljZSBkZSBkb21pbsOibmNpYSAkRF83JDoNCiQkXGJlZ2lue2FsaWduKn0NCgkJRF83ICY9IDEgLSBTREEgXFxbNnB0XQ0KCQkmPSBcc3FydHtcZnJhY3trfXtrLTF9IFxsZWZ0KFxzdW1fe2k9MX1ee2t9IHBfaV4yIC0gXGZyYWN7MX17a31ccmlnaHQpfSANCglcZW5ke2FsaWduKn0kJA0KDQpgYGB7cn0NCkQ3IDwtIGZ1bmN0aW9uKHgpew0KICBuIDwtIGxlbmd0aCh4KSAjIHRvdGFsIGRlIHZlbmRhcw0KICB0YWIgPC0gdGFibGUoeCkgIyBwYXJ0aWNpcGFjb2VzIGRlIG1lcmNhZG8NCiAgayA8LSBsZW5ndGgodGFiKSAjIG51bWVybyBkZSBlbXByZXNhcw0KICANCiAgU0RBIDwtIDEgLSBzcXJ0KCBzdW0oICh0YWIgLSAobi9rKSleMiApLyggKCAobl4yKSooay0xKSApL2sgKSApICMgZXN0YXRpc3RpY2EgU0RBDQogIA0KICBENyA8LSAxIC0gU0RBDQogIHJldHVybihENykNCn0NCmBgYA0KDQojIFNpbXVsYcOnw6NvIHBhcmEgb3MgMTggY2Fzb3Mgey50YWJzZXQgLnRhYnNldC1mYWRlfQ0KDQojIyBDYXNvIDEgey51bmxpc3RlZCAudW5udW1iZXJlZH0NCiANCiMjIyBDb25maWd1cmHDp8OjbyBkbyBwcmltZWlybyBjYXNvIGNvbSAkbj0xMDAwJCB7LnVubnVtYmVyZWQgLnVubGlzdGVkfQ0KYGBge3J9DQplbXAgPC0gYygiMSIsICIyIiwgIjMiLCAiNCIpICMgZW1wcmVzYXMNCnAgPC0gYygwLjI0LCAwLjI2LCAwLjI1NSwgMC4yNDUpICMgcGFydGljaXBhY29lcyBkZSBtZXJjYWRvDQprIDwtIGxlbmd0aChlbXApICMgbnVtZXJvIGRlIGVtcHJlc2FzDQoNCg0KbiA8LSAxMDAwICMgbnVtZXJvIGRlIGVsZW1lbnRvcyBkZSBjYWRhIGFtb3N0cmENCk4gPC0gMTAwMCAjIG51bWVybyBkZSBhbW9zdHJhcw0KYGBgDQoNCiMjIyMgQ8OhbGN1bG8gZG9zIMOtbmRpY2VzIGRlIGRvbWluw6JuY2lhIHRlw7NyaWNvcyB7LnVubGlzdGVkIC51bm51bWJlcmVkfQ0KYGBge3J9DQojIEluZGljZXMgZGUgZG9taW5hbmNpYSB0ZW9yaWNvczoNCg0KRDFfVCA8LSAoaypzdW0ocF4yKSAtMSkvKGstMSkgIyBpbmRpY2UgZGUgSGVyZmluZGFobOKAk0hpcnNjaG1hbm4gbm9ybWFsaXphZG8NCg0KcF9PIDwtIHNvcnQocCwgZGVjcmVhc2luZyA9IFQpDQpwZXNvcyA8LSBzZXFfYWxvbmcocF9PKQ0KSXJvcyA8LSAxLygyKnN1bShwZXNvcypwX08pLTEpDQpEMl9UIDwtIChrKklyb3MgLSAxKS8oay0xKSAjIGluZGljZSBkZSBSb3NlbmJsdXRo4oCTSGFsbOKAk1RpZGVtYW5uIG5vcm1hbGl6YWRvDQoNCkhzIDwtIC1zdW0ocCpsb2cocCkpDQpEM19UIDwtIDEgLSBIcy9sb2coaykgIyBpbmRpY2UgZGUgU2hhbm5vbiBub3JtYWxpemFkbw0KDQpJaGVpcCA8LSAoZXhwKEhzKSAtIDEpLyhrIC0gMSkNCkQ0X1QgPC0gMSAtIEloZWlwICMgaW5kaWNlIGRlIEhlaXANCg0KSWhrIDwtIHN1bShwXjIpXigtMSkNCkQ1X1QgPC0gKGsgLSBJaGspLyhrLTEpICMgaW5kaWNlIGRlIEhhbm5haC1LYXkNCg0KVkEgPC0gMSAtICggc3VtKCggKG4qcCkgLSAobi9rKSApXjIpIC8gKCggKG5eMikqKGstMSkgKS9rKSApDQpENl9UIDwtIDEgLSBWQQ0KDQpTREEgPC0gMSAtIHNxcnQoIHN1bSgoIChuKnApIC0gKG4vaykgKV4yKSAvICgoIChuXjIpKihrLTEpICkvaykgKQ0KRDdfVCA8LSAxIC0gU0RBDQoNCmNhdChEMV9ULCBEMl9ULCBEM19ULCBENF9ULCBENV9ULCBENl9ULCBEN19UKQ0KYGBgDQoNCiMjIyMgU2ltdWxhw6fDo28gey51bmxpc3RlZCAudW5udW1iZXJlZH0NCg0KYGBge3J9DQojIGluaWNpYW5kbyBjb20gbiA9IDEwMDANCg0KbTEgPC0gbWF0cml4KDAsIG5yb3cgPC0gbiwgbmNvbCA8LSBOKSAjIG1hdGl6IHF1ZSB2YWkgcmVjZWJlciBhcyBhbW9zdHJhcw0KZDEgPC0gbWF0cml4KDAsIG5yb3cgPC0gTiwgbmNvbCA8LSA3KSAjIGd1YXJkYSBvcyBpbmRpY2VzIGRlIGRvbWluYW5jaWENCg0Kc2V0LnNlZWQoMTIzKQ0KZm9yIChpIGluIDE6Til7DQogIGEgPC0gc2FtcGxlKGVtcCwgc2l6ZSA9IG4sIHJlcGxhY2UgPSBULCBwcm9iID0gcCkgIyBnZXJhIHVtYSBhbW9zdHJhDQogIG0xWyxpXSA8LSBhICMgY2FkYSBjb2x1bmEgZGEgbWF0cml6IHZhaSBzZXIgdW1hIGFtb3N0cmENCiAgDQogIGQxW2ksIDFdIDwtIEQxKGEpICMgY2FkYSBjb2x1bmEgZGUgZDEgcmVjZWJlIHVtIGluZGljZSBkZSBkb21pbmFuY2lhDQogIGQxW2ksIDJdIDwtIEQyKGEpDQogIGQxW2ksIDNdIDwtIEQzKGEpDQogIGQxW2ksIDRdIDwtIEQ0KGEpDQogIGQxW2ksIDVdIDwtIEQ1KGEpDQogIGQxW2ksIDZdIDwtIEQ2KGEpDQogIGQxW2ksIDddIDwtIEQ3KGEpDQp9DQpgYGANCg0KIyMjIyBUZXN0ZSBkZSBKYXJxdWUtQmVyYSBwYXJhIG5vcm1hbGlkYWRlIHsudW5saXN0ZWQgLnVubnVtYmVyZWR9DQoNClRlc3RlIGRlIG5vcm1hbGlkYWRlIHBhcmEgY2FkYSBjb25qdW50byBkb3Mgw61uZGljZXMgY2FsY3VsYWRvczoNCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIHJlc3VsdHM9J2hpZGUnfQ0KaW5zdGFsbC5wYWNrYWdlcygidHNlcmllcyIpDQpsaWJyYXJ5KHRzZXJpZXMpICMgcHJhIGZhemVyIG8gdGVzdGUgZGUgSmFycXVlLUJlcmENCmBgYA0KDQpgYGB7cn0NCiMgVGVzdGFuZG8gbm9ybWFsaWRhZGUNCg0KYWxwaGEgPC0gMC4wNSAjIG5pdmVsIGRlIHNpZ25pZmljYW5jaWENCg0KcmVzdWx0X3Rlc3RlIDwtIG1hdHJpeCgwLCBuY29sID0gNywgbnJvdyA9IDEpICMgdmFpIGd1YXJkYXIgbyByZXN1bHRhZG8gZG9zIHRlc3Rlcw0KY29sbmFtZXMocmVzdWx0X3Rlc3RlKSA8LSBjKCJEMSIsICJEMiIsICJEMyIsICJENCIsICJENSIsICJENiIsICJENyIpDQoNCnBhcihtZnJvdyA9IGMoMywgMyksIG1hciA9IGMoMywgMywgMiwgMSkpICAjIG1hcmdlbnMgYWp1c3RhZGFzDQpmb3IgKGkgaW4gMTo3KXsNCiAgaGlzdChkMVssaV0sIG1haW4gPSBwYXN0ZTAoIkhpc3RvZ3JhbWEgZGUgRCIsIGkpLCBjb2wgPSBpKzEsDQogICAgICAgeGxhYiA9IHBhc3RlMCgiRCIsIGkpLCB5bGFiID0gIkZyZXF1w6puY2lhIikNCiAgdGVzdGUgPC0gamFycXVlLmJlcmEudGVzdChkMVssaV0pICMgdGVzdGUgcGFyYSBub3JtYWxpZGFkZQ0KICByZXN1bHRfdGVzdGVbLGldIDwtICBpZmVsc2UodGVzdGUkcC52YWx1ZSA8IGFscGhhLCAicmVqIiwgIsOxIHJlaiIpDQp9DQpyZXN1bHRfdGVzdGUNCmBgYA0KDQojIyMjIEPDoWxjdWxvIGRvIE1BUEUgZSBkbyBDViAgey51bmxpc3RlZCAudW5udW1iZXJlZH0NCmBgYHtyIGNvbGxhcHNlPVRSVUV9DQojIENhbGN1bGFuZG8gbyBNQVBFIChFcnJvIFBlcmNlbnR1YWwgQWJzb2x1dG8gTcOpZGlvKQ0KTUFQRTEgPC0gbWVhbigoYWJzKEQxX1QgLSBkMVssMV0pL0QxX1QpKjEwMCkNCk1BUEUyIDwtIG1lYW4oKGFicyhEMl9UIC0gZDFbLDJdKS9EMl9UKSoxMDApDQpNQVBFMyA8LSBtZWFuKChhYnMoRDNfVCAtIGQxWywzXSkvRDNfVCkqMTAwKQ0KTUFQRTQgPC0gbWVhbigoYWJzKEQ0X1QgLSBkMVssNF0pL0Q0X1QpKjEwMCkNCk1BUEU1IDwtIG1lYW4oKGFicyhENV9UIC0gZDFbLDVdKS9ENV9UKSoxMDApDQpNQVBFNiA8LSBtZWFuKChhYnMoRDZfVCAtIGQxWyw2XSkvRDZfVCkqMTAwKQ0KTUFQRTcgPC0gbWVhbigoYWJzKEQ3X1QgLSBkMVssN10pL0Q3X1QpKjEwMCkNCk1BUEUgPC0gYyhNQVBFMSwgTUFQRTIsIE1BUEUzLCBNQVBFNCwgTUFQRTUsIE1BUEU2LCBNQVBFNykNCg0KcGFzdGUwKCJNZW5vciBNQVBFOiBEIiwgd2hpY2gubWluKE1BUEUpLCAiLCBtaW4gPSAiLCByb3VuZChtaW4oTUFQRSksIDQpKQ0KcGFzdGUwKCJTZWd1bmRvIG1lbm9yIE1BUEU6IEQiLCB3aGljaC5taW4oTUFQRVstd2hpY2gubWluKE1BUEUpXSksICIsIG1pbiA9ICIsIHJvdW5kKG1pbihNQVBFWy13aGljaC5taW4oTUFQRSldKSwgNCkpDQpgYGANCg0KYGBge3IgY29sbGFwc2U9VFJVRX0NCiMgQ2FsY3VsYW5kbyBvIENWDQpjdjEgPC0gc2QoZDFbLDFdKS9tZWFuKGQxWywxXSkNCmN2MiA8LSBzZChkMVssMl0pL21lYW4oZDFbLDJdKQ0KY3YzIDwtIHNkKGQxWywzXSkvbWVhbihkMVssM10pDQpjdjQgPC0gc2QoZDFbLDRdKS9tZWFuKGQxWyw0XSkNCmN2NSA8LSBzZChkMVssNV0pL21lYW4oZDFbLDVdKQ0KY3Y2IDwtIHNkKGQxWyw2XSkvbWVhbihkMVssNl0pDQpjdjcgPC0gc2QoZDFbLDddKS9tZWFuKGQxWyw3XSkNCkNWIDwtIGMoY3YxLCBjdjIsIGN2MywgY3Y0LCBjdjUsIGN2NiwgY3Y3KQ0KDQpwYXN0ZTAoIk1lbm9yIENWOiBEIiwgd2hpY2gubWluKENWKSwgIiwgbWluID0gIiwgcm91bmQobWluKENWKSwgNCkpDQpwYXN0ZTAoIlNlZ3VuZG8gbWVub3IgQ1Y6IEQiLCB3aGljaC5taW4oQ1ZbLXdoaWNoLm1pbihDVildKSwgIiwgbWluID0gIiwgcm91bmQobWluKENWWy13aGljaC5taW4oQ1YpXSksIDQpKQ0KYGBgDQoNCiMjIyBDb25maWd1cmHDp8OjbyBkbyBwcmltZWlybyBjYXNvIGNvbSAkbj0zMDAwJCB7LnVubnVtYmVyZWQgLnVubGlzdGVkfQ0KYGBge3J9DQplbXAgPC0gYygiMSIsICIyIiwgIjMiLCAiNCIpICMgZW1wcmVzYXMNCnAgPC0gYygwLjI0LCAwLjI2LCAwLjI1NSwgMC4yNDUpICMgcGFydGljaXBhY29lcyBkZSBtZXJjYWRvDQprIDwtIGxlbmd0aChlbXApICMgbnVtZXJvIGRlIGVtcHJlc2FzDQoNCg0KbiA8LSAzMDAwICMgbnVtZXJvIGRlIGVsZW1lbnRvcyBkZSBjYWRhIGFtb3N0cmENCk4gPC0gMTAwMCAjIG51bWVybyBkZSBhbW9zdHJhcw0KYGBgDQoNCiMjIyMgQ8OhbGN1bG8gZG9zIMOtbmRpY2VzIGRlIGRvbWluw6JuY2lhIHRlw7NyaWNvcyB7LnVubGlzdGVkIC51bm51bWJlcmVkfQ0KYGBge3J9DQojIEluZGljZXMgZGUgZG9taW5hbmNpYSB0ZW9yaWNvczoNCg0KRDFfVCA8LSAoaypzdW0ocF4yKSAtMSkvKGstMSkgIyBpbmRpY2UgZGUgSGVyZmluZGFobOKAk0hpcnNjaG1hbm4gbm9ybWFsaXphZG8NCg0KcF9PIDwtIHNvcnQocCwgZGVjcmVhc2luZyA9IFQpDQpwZXNvcyA8LSBzZXFfYWxvbmcocF9PKQ0KSXJvcyA8LSAxLygyKnN1bShwZXNvcypwX08pLTEpDQpEMl9UIDwtIChrKklyb3MgLSAxKS8oay0xKSAjIGluZGljZSBkZSBSb3NlbmJsdXRo4oCTSGFsbOKAk1RpZGVtYW5uIG5vcm1hbGl6YWRvDQoNCkhzIDwtIC1zdW0ocCpsb2cocCkpDQpEM19UIDwtIDEgLSBIcy9sb2coaykgIyBpbmRpY2UgZGUgU2hhbm5vbiBub3JtYWxpemFkbw0KDQpJaGVpcCA8LSAoZXhwKEhzKSAtIDEpLyhrIC0gMSkNCkQ0X1QgPC0gMSAtIEloZWlwICMgaW5kaWNlIGRlIEhlaXANCg0KSWhrIDwtIHN1bShwXjIpXigtMSkNCkQ1X1QgPC0gKGsgLSBJaGspLyhrLTEpICMgaW5kaWNlIGRlIEhhbm5haC1LYXkNCg0KVkEgPC0gMSAtICggc3VtKCggKG4qcCkgLSAobi9rKSApXjIpIC8gKCggKG5eMikqKGstMSkgKS9rKSApDQpENl9UIDwtIDEgLSBWQQ0KDQpTREEgPC0gMSAtIHNxcnQoIHN1bSgoIChuKnApIC0gKG4vaykgKV4yKSAvICgoIChuXjIpKihrLTEpICkvaykgKQ0KRDdfVCA8LSAxIC0gU0RBDQoNCmNhdChEMV9ULCBEMl9ULCBEM19ULCBENF9ULCBENV9ULCBENl9ULCBEN19UKQ0KYGBgDQoNCiMjIyMgU2ltdWxhw6fDo28gey51bmxpc3RlZCAudW5udW1iZXJlZH0NCg0KYGBge3J9DQptMSA8LSBtYXRyaXgoMCwgbnJvdyA8LSBuLCBuY29sIDwtIE4pICMgbWF0aXogcXVlIHZhaSByZWNlYmVyIGFzIGFtb3N0cmFzDQpkMSA8LSBtYXRyaXgoMCwgbnJvdyA8LSBOLCBuY29sIDwtIDcpICMgZ3VhcmRhIG9zIGluZGljZXMgZGUgZG9taW5hbmNpYQ0KDQpzZXQuc2VlZCgxMjMpDQpmb3IgKGkgaW4gMTpOKXsNCiAgYSA8LSBzYW1wbGUoZW1wLCBzaXplID0gbiwgcmVwbGFjZSA9IFQsIHByb2IgPSBwKSAjIGdlcmEgdW1hIGFtb3N0cmENCiAgbTFbLGldIDwtIGEgIyBjYWRhIGNvbHVuYSBkYSBtYXRyaXogdmFpIHNlciB1bWEgYW1vc3RyYQ0KICANCiAgZDFbaSwgMV0gPC0gRDEoYSkgIyBjYWRhIGNvbHVuYSBkZSBkMSByZWNlYmUgdW0gaW5kaWNlIGRlIGRvbWluYW5jaWENCiAgZDFbaSwgMl0gPC0gRDIoYSkNCiAgZDFbaSwgM10gPC0gRDMoYSkNCiAgZDFbaSwgNF0gPC0gRDQoYSkNCiAgZDFbaSwgNV0gPC0gRDUoYSkNCiAgZDFbaSwgNl0gPC0gRDYoYSkNCiAgZDFbaSwgN10gPC0gRDcoYSkNCn0NCmBgYA0KDQojIyMjIFRlc3RlIGRlIEphcnF1ZS1CZXJhIHBhcmEgbm9ybWFsaWRhZGUgey51bmxpc3RlZCAudW5udW1iZXJlZH0NCg0KVGVzdGUgZGUgbm9ybWFsaWRhZGUgcGFyYSBjYWRhIGNvbmp1bnRvIGRvcyDDrW5kaWNlcyBjYWxjdWxhZG9zOg0KYGBge3J9DQojIFRlc3RhbmRvIG5vcm1hbGlkYWRlDQoNCmFscGhhIDwtIDAuMDUgIyBuaXZlbCBkZSBzaWduaWZpY2FuY2lhDQoNCnJlc3VsdF90ZXN0ZSA8LSBtYXRyaXgoMCwgbmNvbCA9IDcsIG5yb3cgPSAxKSAjIHZhaSBndWFyZGFyIG8gcmVzdWx0YWRvIGRvcyB0ZXN0ZXMNCmNvbG5hbWVzKHJlc3VsdF90ZXN0ZSkgPC0gYygiRDEiLCAiRDIiLCAiRDMiLCAiRDQiLCAiRDUiLCAiRDYiLCAiRDciKQ0KDQpwYXIobWZyb3cgPSBjKDMsIDMpLCBtYXIgPSBjKDMsIDMsIDIsIDEpKSAgIyBtYXJnZW5zIGFqdXN0YWRhcw0KZm9yIChpIGluIDE6Nyl7DQogIGhpc3QoZDFbLGldLCBtYWluID0gcGFzdGUwKCJIaXN0b2dyYW1hIGRlIEQiLCBpKSwgY29sID0gaSsxLA0KICAgICAgIHhsYWIgPSBwYXN0ZTAoIkQiLCBpKSwgeWxhYiA9ICJGcmVxdcOqbmNpYSIpDQogIHRlc3RlIDwtIGphcnF1ZS5iZXJhLnRlc3QoZDFbLGldKSAjIHRlc3RlIHBhcmEgbm9ybWFsaWRhZGUNCiAgcmVzdWx0X3Rlc3RlWyxpXSA8LSAgaWZlbHNlKHRlc3RlJHAudmFsdWUgPCBhbHBoYSwgInJlaiIsICLDsSByZWoiKQ0KfQ0KcmVzdWx0X3Rlc3RlDQpgYGANCg0KIyMjIyBDw6FsY3VsbyBkbyBNQVBFIGUgZG8gQ1YgIHsudW5saXN0ZWQgLnVubnVtYmVyZWR9DQpgYGB7ciBjb2xsYXBzZT1UUlVFfQ0KIyBDYWxjdWxhbmRvIG8gTUFQRSAoRXJybyBQZXJjZW50dWFsIEFic29sdXRvIE3DqWRpbykNCk1BUEUxIDwtIG1lYW4oKGFicyhEMV9UIC0gZDFbLDFdKS9EMV9UKSoxMDApDQpNQVBFMiA8LSBtZWFuKChhYnMoRDJfVCAtIGQxWywyXSkvRDJfVCkqMTAwKQ0KTUFQRTMgPC0gbWVhbigoYWJzKEQzX1QgLSBkMVssM10pL0QzX1QpKjEwMCkNCk1BUEU0IDwtIG1lYW4oKGFicyhENF9UIC0gZDFbLDRdKS9ENF9UKSoxMDApDQpNQVBFNSA8LSBtZWFuKChhYnMoRDVfVCAtIGQxWyw1XSkvRDVfVCkqMTAwKQ0KTUFQRTYgPC0gbWVhbigoYWJzKEQ2X1QgLSBkMVssNl0pL0Q2X1QpKjEwMCkNCk1BUEU3IDwtIG1lYW4oKGFicyhEN19UIC0gZDFbLDddKS9EN19UKSoxMDApDQpNQVBFIDwtIGMoTUFQRTEsIE1BUEUyLCBNQVBFMywgTUFQRTQsIE1BUEU1LCBNQVBFNiwgTUFQRTcpDQoNCnBhc3RlMCgiTWVub3IgTUFQRTogRCIsIHdoaWNoLm1pbihNQVBFKSwgIiwgbWluID0gIiwgcm91bmQobWluKE1BUEUpLCA0KSkNCnBhc3RlMCgiU2VndW5kbyBtZW5vciBNQVBFOiBEIiwgd2hpY2gubWluKE1BUEVbLXdoaWNoLm1pbihNQVBFKV0pLCAiLCBtaW4gPSAiLCByb3VuZChtaW4oTUFQRVstd2hpY2gubWluKE1BUEUpXSksIDQpKQ0KYGBgDQoNCmBgYHtyIGNvbGxhcHNlPVRSVUV9DQojIENhbGN1bGFuZG8gbyBDVg0KY3YxIDwtIHNkKGQxWywxXSkvbWVhbihkMVssMV0pDQpjdjIgPC0gc2QoZDFbLDJdKS9tZWFuKGQxWywyXSkNCmN2MyA8LSBzZChkMVssM10pL21lYW4oZDFbLDNdKQ0KY3Y0IDwtIHNkKGQxWyw0XSkvbWVhbihkMVssNF0pDQpjdjUgPC0gc2QoZDFbLDVdKS9tZWFuKGQxWyw1XSkNCmN2NiA8LSBzZChkMVssNl0pL21lYW4oZDFbLDZdKQ0KY3Y3IDwtIHNkKGQxWyw3XSkvbWVhbihkMVssN10pDQpDViA8LSBjKGN2MSwgY3YyLCBjdjMsIGN2NCwgY3Y1LCBjdjYsIGN2NykNCg0KcGFzdGUwKCJNZW5vciBDVjogRCIsIHdoaWNoLm1pbihDViksICIsIG1pbiA9ICIsIHJvdW5kKG1pbihDViksIDQpKQ0KcGFzdGUwKCJTZWd1bmRvIG1lbm9yIENWOiBEIiwgd2hpY2gubWluKENWWy13aGljaC5taW4oQ1YpXSksICIsIG1pbiA9ICIsIHJvdW5kKG1pbihDVlstd2hpY2gubWluKENWKV0pLCA0KSkNCmBgYA0KDQoNCg0KIyMgQ2FzbyAyIHsudW5saXN0ZWQgLnVubnVtYmVyZWR9DQojIyMgQ29uZmlndXJhw6fDo28gZG8gc2VndW5kbyBjYXNvIGNvbSAkbj0xMDAwJCB7LnVubnVtYmVyZWQgLnVubGlzdGVkfQ0KYGBge3J9DQplbXAgPC0gYygiMSIsICIyIiwgIjMiLCAiNCIpICMgZW1wcmVzYXMNCnAgPC0gYygwLjg1LCAwLjA1LCAwLjA1LCAwLjA1KSAjIHBhcnRpY2lwYWNvZXMgZGUgbWVyY2Fkbw0KayA8LSBsZW5ndGgoZW1wKSAjIG51bWVybyBkZSBlbXByZXNhcw0KDQoNCm4gPC0gMTAwMCAjIG51bWVybyBkZSBlbGVtZW50b3MgZGUgY2FkYSBhbW9zdHJhDQpOIDwtIDEwMDAgIyBudW1lcm8gZGUgYW1vc3RyYXMNCmBgYA0KDQojIyMjIEPDoWxjdWxvIGRvcyDDrW5kaWNlcyBkZSBkb21pbsOibmNpYSB0ZcOzcmljb3Mgey51bmxpc3RlZCAudW5udW1iZXJlZH0NCmBgYHtyfQ0KIyBJbmRpY2VzIGRlIGRvbWluYW5jaWEgdGVvcmljb3M6DQoNCkQxX1QgPC0gKGsqc3VtKHBeMikgLTEpLyhrLTEpICMgaW5kaWNlIGRlIEhlcmZpbmRhaGzigJNIaXJzY2htYW5uIG5vcm1hbGl6YWRvDQoNCnBfTyA8LSBzb3J0KHAsIGRlY3JlYXNpbmcgPSBUKQ0KcGVzb3MgPC0gc2VxX2Fsb25nKHBfTykNCklyb3MgPC0gMS8oMipzdW0ocGVzb3MqcF9PKS0xKQ0KRDJfVCA8LSAoaypJcm9zIC0gMSkvKGstMSkgIyBpbmRpY2UgZGUgUm9zZW5ibHV0aOKAk0hhbGzigJNUaWRlbWFubiBub3JtYWxpemFkbw0KDQpIcyA8LSAtc3VtKHAqbG9nKHApKQ0KRDNfVCA8LSAxIC0gSHMvbG9nKGspICMgaW5kaWNlIGRlIFNoYW5ub24gbm9ybWFsaXphZG8NCg0KSWhlaXAgPC0gKGV4cChIcykgLSAxKS8oayAtIDEpDQpENF9UIDwtIDEgLSBJaGVpcCAjIGluZGljZSBkZSBIZWlwDQoNCkloayA8LSBzdW0ocF4yKV4oLTEpDQpENV9UIDwtIChrIC0gSWhrKS8oay0xKSAjIGluZGljZSBkZSBIYW5uYWgtS2F5DQoNClZBIDwtIDEgLSAoIHN1bSgoIChuKnApIC0gKG4vaykgKV4yKSAvICgoIChuXjIpKihrLTEpICkvaykgKQ0KRDZfVCA8LSAxIC0gVkENCg0KU0RBIDwtIDEgLSBzcXJ0KCBzdW0oKCAobipwKSAtIChuL2spICleMikgLyAoKCAobl4yKSooay0xKSApL2spICkNCkQ3X1QgPC0gMSAtIFNEQQ0KDQpjYXQoRDFfVCwgRDJfVCwgRDNfVCwgRDRfVCwgRDVfVCwgRDZfVCwgRDdfVCkNCmBgYA0KDQojIyMjIFNpbXVsYcOnw6NvIHsudW5saXN0ZWQgLnVubnVtYmVyZWR9DQoNCmBgYHtyfQ0KIyBpbmljaWFuZG8gY29tIG4gPSAxMDAwDQoNCm0xIDwtIG1hdHJpeCgwLCBucm93IDwtIG4sIG5jb2wgPC0gTikgIyBtYXRpeiBxdWUgdmFpIHJlY2ViZXIgYXMgYW1vc3RyYXMNCmQxIDwtIG1hdHJpeCgwLCBucm93IDwtIE4sIG5jb2wgPC0gNykgIyBndWFyZGEgb3MgaW5kaWNlcyBkZSBkb21pbmFuY2lhDQoNCnNldC5zZWVkKDEyMykNCmZvciAoaSBpbiAxOk4pew0KICBhIDwtIHNhbXBsZShlbXAsIHNpemUgPSBuLCByZXBsYWNlID0gVCwgcHJvYiA9IHApICMgZ2VyYSB1bWEgYW1vc3RyYQ0KICBtMVssaV0gPC0gYSAjIGNhZGEgY29sdW5hIGRhIG1hdHJpeiB2YWkgc2VyIHVtYSBhbW9zdHJhDQogIA0KICBkMVtpLCAxXSA8LSBEMShhKSAjIGNhZGEgY29sdW5hIGRlIGQxIHJlY2ViZSB1bSBpbmRpY2UgZGUgZG9taW5hbmNpYQ0KICBkMVtpLCAyXSA8LSBEMihhKQ0KICBkMVtpLCAzXSA8LSBEMyhhKQ0KICBkMVtpLCA0XSA8LSBENChhKQ0KICBkMVtpLCA1XSA8LSBENShhKQ0KICBkMVtpLCA2XSA8LSBENihhKQ0KICBkMVtpLCA3XSA8LSBENyhhKQ0KfQ0KYGBgDQoNCiMjIyMgVGVzdGUgZGUgSmFycXVlLUJlcmEgcGFyYSBub3JtYWxpZGFkZSB7LnVubGlzdGVkIC51bm51bWJlcmVkfQ0KDQpgYGB7cn0NCiMgVGVzdGFuZG8gbm9ybWFsaWRhZGUNCg0KYWxwaGEgPC0gMC4wNSAjIG5pdmVsIGRlIHNpZ25pZmljYW5jaWENCg0KcmVzdWx0X3Rlc3RlIDwtIG1hdHJpeCgwLCBuY29sID0gNywgbnJvdyA9IDEpICMgdmFpIGd1YXJkYXIgbyByZXN1bHRhZG8gZG9zIHRlc3Rlcw0KY29sbmFtZXMocmVzdWx0X3Rlc3RlKSA8LSBjKCJEMSIsICJEMiIsICJEMyIsICJENCIsICJENSIsICJENiIsICJENyIpDQoNCnBhcihtZnJvdyA9IGMoMywgMyksIG1hciA9IGMoMywgMywgMiwgMSkpICAjIG1hcmdlbnMgYWp1c3RhZGFzDQpmb3IgKGkgaW4gMTo3KXsNCiAgaGlzdChkMVssaV0sIG1haW4gPSBwYXN0ZTAoIkhpc3RvZ3JhbWEgZGUgRCIsIGkpLCBjb2wgPSBpKzEsDQogICAgICAgeGxhYiA9IHBhc3RlMCgiRCIsIGkpLCB5bGFiID0gIkZyZXF1w6puY2lhIikNCiAgdGVzdGUgPC0gamFycXVlLmJlcmEudGVzdChkMVssaV0pICMgdGVzdGUgcGFyYSBub3JtYWxpZGFkZQ0KICByZXN1bHRfdGVzdGVbLGldIDwtICBpZmVsc2UodGVzdGUkcC52YWx1ZSA8IGFscGhhLCAicmVqIiwgIsOxIHJlaiIpDQp9DQpyZXN1bHRfdGVzdGUNCmBgYA0KDQojIyMjIEPDoWxjdWxvIGRvIE1BUEUgZSBkbyBDViAgey51bmxpc3RlZCAudW5udW1iZXJlZH0NCmBgYHtyIGNvbGxhcHNlPVRSVUV9DQojIENhbGN1bGFuZG8gbyBNQVBFIChFcnJvIFBlcmNlbnR1YWwgQWJzb2x1dG8gTcOpZGlvKQ0KTUFQRTEgPC0gbWVhbigoYWJzKEQxX1QgLSBkMVssMV0pL0QxX1QpKjEwMCkNCk1BUEUyIDwtIG1lYW4oKGFicyhEMl9UIC0gZDFbLDJdKS9EMl9UKSoxMDApDQpNQVBFMyA8LSBtZWFuKChhYnMoRDNfVCAtIGQxWywzXSkvRDNfVCkqMTAwKQ0KTUFQRTQgPC0gbWVhbigoYWJzKEQ0X1QgLSBkMVssNF0pL0Q0X1QpKjEwMCkNCk1BUEU1IDwtIG1lYW4oKGFicyhENV9UIC0gZDFbLDVdKS9ENV9UKSoxMDApDQpNQVBFNiA8LSBtZWFuKChhYnMoRDZfVCAtIGQxWyw2XSkvRDZfVCkqMTAwKQ0KTUFQRTcgPC0gbWVhbigoYWJzKEQ3X1QgLSBkMVssN10pL0Q3X1QpKjEwMCkNCk1BUEUgPC0gYyhNQVBFMSwgTUFQRTIsIE1BUEUzLCBNQVBFNCwgTUFQRTUsIE1BUEU2LCBNQVBFNykNCg0KcGFzdGUwKCJNZW5vciBNQVBFOiBEIiwgd2hpY2gubWluKE1BUEUpLCAiLCBtaW4gPSAiLCByb3VuZChtaW4oTUFQRSksIDQpKQ0KcGFzdGUwKCJTZWd1bmRvIG1lbm9yIE1BUEU6IEQiLCB3aGljaC5taW4oTUFQRVstd2hpY2gubWluKE1BUEUpXSksICIsIG1pbiA9ICIsIHJvdW5kKG1pbihNQVBFWy13aGljaC5taW4oTUFQRSldKSwgNCkpDQpgYGANCg0KYGBge3IgY29sbGFwc2U9VFJVRX0NCiMgQ2FsY3VsYW5kbyBvIENWDQpjdjEgPC0gc2QoZDFbLDFdKS9tZWFuKGQxWywxXSkNCmN2MiA8LSBzZChkMVssMl0pL21lYW4oZDFbLDJdKQ0KY3YzIDwtIHNkKGQxWywzXSkvbWVhbihkMVssM10pDQpjdjQgPC0gc2QoZDFbLDRdKS9tZWFuKGQxWyw0XSkNCmN2NSA8LSBzZChkMVssNV0pL21lYW4oZDFbLDVdKQ0KY3Y2IDwtIHNkKGQxWyw2XSkvbWVhbihkMVssNl0pDQpjdjcgPC0gc2QoZDFbLDddKS9tZWFuKGQxWyw3XSkNCkNWIDwtIGMoY3YxLCBjdjIsIGN2MywgY3Y0LCBjdjUsIGN2NiwgY3Y3KQ0KDQpwYXN0ZTAoIk1lbm9yIENWOiBEIiwgd2hpY2gubWluKENWKSwgIiwgbWluID0gIiwgcm91bmQobWluKENWKSwgNCkpDQpwYXN0ZTAoIlNlZ3VuZG8gbWVub3IgQ1Y6IEQiLCB3aGljaC5taW4oQ1ZbLXdoaWNoLm1pbihDVildKSwgIiwgbWluID0gIiwgcm91bmQobWluKENWWy13aGljaC5taW4oQ1YpXSksIDQpKQ0KYGBgDQoNCiMjIyBDb25maWd1cmHDp8OjbyBkbyBzZWd1bmRvIGNhc28gY29tICRuPTMwMDAkIHsudW5udW1iZXJlZCAudW5saXN0ZWR9DQpgYGB7cn0NCmVtcCA8LSBjKCIxIiwgIjIiLCAiMyIsICI0IikgIyBlbXByZXNhcw0KcCA8LSBjKDAuODUsIDAuMDUsIDAuMDUsIDAuMDUpICMgcGFydGljaXBhY29lcyBkZSBtZXJjYWRvDQprIDwtIGxlbmd0aChlbXApICMgbnVtZXJvIGRlIGVtcHJlc2FzDQoNCg0KbiA8LSAzMDAwICMgbnVtZXJvIGRlIGVsZW1lbnRvcyBkZSBjYWRhIGFtb3N0cmENCk4gPC0gMTAwMCAjIG51bWVybyBkZSBhbW9zdHJhcw0KYGBgDQoNCiMjIyMgQ8OhbGN1bG8gZG9zIMOtbmRpY2VzIGRlIGRvbWluw6JuY2lhIHRlw7NyaWNvcyB7LnVubGlzdGVkIC51bm51bWJlcmVkfQ0KYGBge3J9DQojIEluZGljZXMgZGUgZG9taW5hbmNpYSB0ZW9yaWNvczoNCg0KRDFfVCA8LSAoaypzdW0ocF4yKSAtMSkvKGstMSkgIyBpbmRpY2UgZGUgSGVyZmluZGFobOKAk0hpcnNjaG1hbm4gbm9ybWFsaXphZG8NCg0KcF9PIDwtIHNvcnQocCwgZGVjcmVhc2luZyA9IFQpDQpwZXNvcyA8LSBzZXFfYWxvbmcocF9PKQ0KSXJvcyA8LSAxLygyKnN1bShwZXNvcypwX08pLTEpDQpEMl9UIDwtIChrKklyb3MgLSAxKS8oay0xKSAjIGluZGljZSBkZSBSb3NlbmJsdXRo4oCTSGFsbOKAk1RpZGVtYW5uIG5vcm1hbGl6YWRvDQoNCkhzIDwtIC1zdW0ocCpsb2cocCkpDQpEM19UIDwtIDEgLSBIcy9sb2coaykgIyBpbmRpY2UgZGUgU2hhbm5vbiBub3JtYWxpemFkbw0KDQpJaGVpcCA8LSAoZXhwKEhzKSAtIDEpLyhrIC0gMSkNCkQ0X1QgPC0gMSAtIEloZWlwICMgaW5kaWNlIGRlIEhlaXANCg0KSWhrIDwtIHN1bShwXjIpXigtMSkNCkQ1X1QgPC0gKGsgLSBJaGspLyhrLTEpICMgaW5kaWNlIGRlIEhhbm5haC1LYXkNCg0KVkEgPC0gMSAtICggc3VtKCggKG4qcCkgLSAobi9rKSApXjIpIC8gKCggKG5eMikqKGstMSkgKS9rKSApDQpENl9UIDwtIDEgLSBWQQ0KDQpTREEgPC0gMSAtIHNxcnQoIHN1bSgoIChuKnApIC0gKG4vaykgKV4yKSAvICgoIChuXjIpKihrLTEpICkvaykgKQ0KRDdfVCA8LSAxIC0gU0RBDQoNCmNhdChEMV9ULCBEMl9ULCBEM19ULCBENF9ULCBENV9ULCBENl9ULCBEN19UKQ0KYGBgDQoNCiMjIyMgU2ltdWxhw6fDo28gey51bmxpc3RlZCAudW5udW1iZXJlZH0NCg0KYGBge3J9DQptMSA8LSBtYXRyaXgoMCwgbnJvdyA8LSBuLCBuY29sIDwtIE4pICMgbWF0aXogcXVlIHZhaSByZWNlYmVyIGFzIGFtb3N0cmFzDQpkMSA8LSBtYXRyaXgoMCwgbnJvdyA8LSBOLCBuY29sIDwtIDcpICMgZ3VhcmRhIG9zIGluZGljZXMgZGUgZG9taW5hbmNpYQ0KDQpzZXQuc2VlZCgxMjMpDQpmb3IgKGkgaW4gMTpOKXsNCiAgYSA8LSBzYW1wbGUoZW1wLCBzaXplID0gbiwgcmVwbGFjZSA9IFQsIHByb2IgPSBwKSAjIGdlcmEgdW1hIGFtb3N0cmENCiAgbTFbLGldIDwtIGEgIyBjYWRhIGNvbHVuYSBkYSBtYXRyaXogdmFpIHNlciB1bWEgYW1vc3RyYQ0KICANCiAgZDFbaSwgMV0gPC0gRDEoYSkgIyBjYWRhIGNvbHVuYSBkZSBkMSByZWNlYmUgdW0gaW5kaWNlIGRlIGRvbWluYW5jaWENCiAgZDFbaSwgMl0gPC0gRDIoYSkNCiAgZDFbaSwgM10gPC0gRDMoYSkNCiAgZDFbaSwgNF0gPC0gRDQoYSkNCiAgZDFbaSwgNV0gPC0gRDUoYSkNCiAgZDFbaSwgNl0gPC0gRDYoYSkNCiAgZDFbaSwgN10gPC0gRDcoYSkNCn0NCmBgYA0KDQojIyMjIFRlc3RlIGRlIEphcnF1ZS1CZXJhIHBhcmEgbm9ybWFsaWRhZGUgey51bmxpc3RlZCAudW5udW1iZXJlZH0NCg0KVGVzdGUgZGUgbm9ybWFsaWRhZGUgcGFyYSBjYWRhIGNvbmp1bnRvIGRvcyDDrW5kaWNlcyBjYWxjdWxhZG9zOg0KYGBge3J9DQojIFRlc3RhbmRvIG5vcm1hbGlkYWRlDQoNCmFscGhhIDwtIDAuMDUgIyBuaXZlbCBkZSBzaWduaWZpY2FuY2lhDQoNCnJlc3VsdF90ZXN0ZSA8LSBtYXRyaXgoMCwgbmNvbCA9IDcsIG5yb3cgPSAxKSAjIHZhaSBndWFyZGFyIG8gcmVzdWx0YWRvIGRvcyB0ZXN0ZXMNCmNvbG5hbWVzKHJlc3VsdF90ZXN0ZSkgPC0gYygiRDEiLCAiRDIiLCAiRDMiLCAiRDQiLCAiRDUiLCAiRDYiLCAiRDciKQ0KDQpwYXIobWZyb3cgPSBjKDMsIDMpLCBtYXIgPSBjKDMsIDMsIDIsIDEpKSAgIyBtYXJnZW5zIGFqdXN0YWRhcw0KZm9yIChpIGluIDE6Nyl7DQogIGhpc3QoZDFbLGldLCBtYWluID0gcGFzdGUwKCJIaXN0b2dyYW1hIGRlIEQiLCBpKSwgY29sID0gaSsxLA0KICAgICAgIHhsYWIgPSBwYXN0ZTAoIkQiLCBpKSwgeWxhYiA9ICJGcmVxdcOqbmNpYSIpDQogIHRlc3RlIDwtIGphcnF1ZS5iZXJhLnRlc3QoZDFbLGldKSAjIHRlc3RlIHBhcmEgbm9ybWFsaWRhZGUNCiAgcmVzdWx0X3Rlc3RlWyxpXSA8LSAgaWZlbHNlKHRlc3RlJHAudmFsdWUgPCBhbHBoYSwgInJlaiIsICLDsSByZWoiKQ0KfQ0KcmVzdWx0X3Rlc3RlDQpgYGANCg0KIyMjIyBDw6FsY3VsbyBkbyBNQVBFIGUgZG8gQ1YgIHsudW5saXN0ZWQgLnVubnVtYmVyZWR9DQpgYGB7ciBjb2xsYXBzZT1UUlVFfQ0KIyBDYWxjdWxhbmRvIG8gTUFQRSAoRXJybyBQZXJjZW50dWFsIEFic29sdXRvIE3DqWRpbykNCk1BUEUxIDwtIG1lYW4oKGFicyhEMV9UIC0gZDFbLDFdKS9EMV9UKSoxMDApDQpNQVBFMiA8LSBtZWFuKChhYnMoRDJfVCAtIGQxWywyXSkvRDJfVCkqMTAwKQ0KTUFQRTMgPC0gbWVhbigoYWJzKEQzX1QgLSBkMVssM10pL0QzX1QpKjEwMCkNCk1BUEU0IDwtIG1lYW4oKGFicyhENF9UIC0gZDFbLDRdKS9ENF9UKSoxMDApDQpNQVBFNSA8LSBtZWFuKChhYnMoRDVfVCAtIGQxWyw1XSkvRDVfVCkqMTAwKQ0KTUFQRTYgPC0gbWVhbigoYWJzKEQ2X1QgLSBkMVssNl0pL0Q2X1QpKjEwMCkNCk1BUEU3IDwtIG1lYW4oKGFicyhEN19UIC0gZDFbLDddKS9EN19UKSoxMDApDQpNQVBFIDwtIGMoTUFQRTEsIE1BUEUyLCBNQVBFMywgTUFQRTQsIE1BUEU1LCBNQVBFNiwgTUFQRTcpDQoNCnBhc3RlMCgiTWVub3IgTUFQRTogRCIsIHdoaWNoLm1pbihNQVBFKSwgIiwgbWluID0gIiwgcm91bmQobWluKE1BUEUpLCA0KSkNCnBhc3RlMCgiU2VndW5kbyBtZW5vciBNQVBFOiBEIiwgd2hpY2gubWluKE1BUEVbLXdoaWNoLm1pbihNQVBFKV0pLCAiLCBtaW4gPSAiLCByb3VuZChtaW4oTUFQRVstd2hpY2gubWluKE1BUEUpXSksIDQpKQ0KYGBgDQoNCmBgYHtyIGNvbGxhcHNlPVRSVUV9DQojIENhbGN1bGFuZG8gbyBDVg0KY3YxIDwtIHNkKGQxWywxXSkvbWVhbihkMVssMV0pDQpjdjIgPC0gc2QoZDFbLDJdKS9tZWFuKGQxWywyXSkNCmN2MyA8LSBzZChkMVssM10pL21lYW4oZDFbLDNdKQ0KY3Y0IDwtIHNkKGQxWyw0XSkvbWVhbihkMVssNF0pDQpjdjUgPC0gc2QoZDFbLDVdKS9tZWFuKGQxWyw1XSkNCmN2NiA8LSBzZChkMVssNl0pL21lYW4oZDFbLDZdKQ0KY3Y3IDwtIHNkKGQxWyw3XSkvbWVhbihkMVssN10pDQpDViA8LSBjKGN2MSwgY3YyLCBjdjMsIGN2NCwgY3Y1LCBjdjYsIGN2NykNCg0KcGFzdGUwKCJNZW5vciBDVjogRCIsIHdoaWNoLm1pbihDViksICIsIG1pbiA9ICIsIHJvdW5kKG1pbihDViksIDQpKQ0KcGFzdGUwKCJTZWd1bmRvIG1lbm9yIENWOiBEIiwgd2hpY2gubWluKENWWy13aGljaC5taW4oQ1YpXSksICIsIG1pbiA9ICIsIHJvdW5kKG1pbihDVlstd2hpY2gubWluKENWKV0pLCA0KSkNCmBgYA0KDQojIyBDYXNvIDMgey51bmxpc3RlZCAudW5udW1iZXJlZH0NCiMjIyBDb25maWd1cmHDp8OjbyBkbyB0ZXJjZWlybyBjYXNvIGNvbSAkbj0xMDAwJCB7LnVubnVtYmVyZWQgLnVubGlzdGVkfQ0KYGBge3J9DQplbXAgPC0gYygiMSIsICIyIiwgIjMiLCAiNCIpICMgZW1wcmVzYXMNCnAgPC0gYygwLjM1LCAwLjQ1LCAwLjEsIDAuMSkgIyBwYXJ0aWNpcGFjb2VzIGRlIG1lcmNhZG8NCmsgPC0gbGVuZ3RoKGVtcCkgIyBudW1lcm8gZGUgZW1wcmVzYXMNCg0KDQpuIDwtIDEwMDAgIyBudW1lcm8gZGUgZWxlbWVudG9zIGRlIGNhZGEgYW1vc3RyYQ0KTiA8LSAxMDAwICMgbnVtZXJvIGRlIGFtb3N0cmFzDQpgYGANCg0KIyMjIyBDw6FsY3VsbyBkb3Mgw61uZGljZXMgZGUgZG9taW7Dom5jaWEgdGXDs3JpY29zIHsudW5saXN0ZWQgLnVubnVtYmVyZWR9DQpgYGB7cn0NCiMgSW5kaWNlcyBkZSBkb21pbmFuY2lhIHRlb3JpY29zOg0KDQpEMV9UIDwtIChrKnN1bShwXjIpIC0xKS8oay0xKSAjIGluZGljZSBkZSBIZXJmaW5kYWhs4oCTSGlyc2NobWFubiBub3JtYWxpemFkbw0KDQpwX08gPC0gc29ydChwLCBkZWNyZWFzaW5nID0gVCkNCnBlc29zIDwtIHNlcV9hbG9uZyhwX08pDQpJcm9zIDwtIDEvKDIqc3VtKHBlc29zKnBfTyktMSkNCkQyX1QgPC0gKGsqSXJvcyAtIDEpLyhrLTEpICMgaW5kaWNlIGRlIFJvc2VuYmx1dGjigJNIYWxs4oCTVGlkZW1hbm4gbm9ybWFsaXphZG8NCg0KSHMgPC0gLXN1bShwKmxvZyhwKSkNCkQzX1QgPC0gMSAtIEhzL2xvZyhrKSAjIGluZGljZSBkZSBTaGFubm9uIG5vcm1hbGl6YWRvDQoNCkloZWlwIDwtIChleHAoSHMpIC0gMSkvKGsgLSAxKQ0KRDRfVCA8LSAxIC0gSWhlaXAgIyBpbmRpY2UgZGUgSGVpcA0KDQpJaGsgPC0gc3VtKHBeMileKC0xKQ0KRDVfVCA8LSAoayAtIEloaykvKGstMSkgIyBpbmRpY2UgZGUgSGFubmFoLUtheQ0KDQpWQSA8LSAxIC0gKCBzdW0oKCAobipwKSAtIChuL2spICleMikgLyAoKCAobl4yKSooay0xKSApL2spICkNCkQ2X1QgPC0gMSAtIFZBDQoNClNEQSA8LSAxIC0gc3FydCggc3VtKCggKG4qcCkgLSAobi9rKSApXjIpIC8gKCggKG5eMikqKGstMSkgKS9rKSApDQpEN19UIDwtIDEgLSBTREENCg0KY2F0KEQxX1QsIEQyX1QsIEQzX1QsIEQ0X1QsIEQ1X1QsIEQ2X1QsIEQ3X1QpDQpgYGANCg0KIyMjIyBTaW11bGHDp8OjbyB7LnVubGlzdGVkIC51bm51bWJlcmVkfQ0KDQpgYGB7cn0NCiMgaW5pY2lhbmRvIGNvbSBuID0gMTAwMA0KDQptMSA8LSBtYXRyaXgoMCwgbnJvdyA8LSBuLCBuY29sIDwtIE4pICMgbWF0aXogcXVlIHZhaSByZWNlYmVyIGFzIGFtb3N0cmFzDQpkMSA8LSBtYXRyaXgoMCwgbnJvdyA8LSBOLCBuY29sIDwtIDcpICMgZ3VhcmRhIG9zIGluZGljZXMgZGUgZG9taW5hbmNpYQ0KDQpzZXQuc2VlZCgxMjMpDQpmb3IgKGkgaW4gMTpOKXsNCiAgYSA8LSBzYW1wbGUoZW1wLCBzaXplID0gbiwgcmVwbGFjZSA9IFQsIHByb2IgPSBwKSAjIGdlcmEgdW1hIGFtb3N0cmENCiAgbTFbLGldIDwtIGEgIyBjYWRhIGNvbHVuYSBkYSBtYXRyaXogdmFpIHNlciB1bWEgYW1vc3RyYQ0KICANCiAgZDFbaSwgMV0gPC0gRDEoYSkgIyBjYWRhIGNvbHVuYSBkZSBkMSByZWNlYmUgdW0gaW5kaWNlIGRlIGRvbWluYW5jaWENCiAgZDFbaSwgMl0gPC0gRDIoYSkNCiAgZDFbaSwgM10gPC0gRDMoYSkNCiAgZDFbaSwgNF0gPC0gRDQoYSkNCiAgZDFbaSwgNV0gPC0gRDUoYSkNCiAgZDFbaSwgNl0gPC0gRDYoYSkNCiAgZDFbaSwgN10gPC0gRDcoYSkNCn0NCmBgYA0KDQojIyMjIFRlc3RlIGRlIEphcnF1ZS1CZXJhIHBhcmEgbm9ybWFsaWRhZGUgey51bmxpc3RlZCAudW5udW1iZXJlZH0NCg0KYGBge3J9DQojIFRlc3RhbmRvIG5vcm1hbGlkYWRlDQoNCmFscGhhIDwtIDAuMDUgIyBuaXZlbCBkZSBzaWduaWZpY2FuY2lhDQoNCnJlc3VsdF90ZXN0ZSA8LSBtYXRyaXgoMCwgbmNvbCA9IDcsIG5yb3cgPSAxKSAjIHZhaSBndWFyZGFyIG8gcmVzdWx0YWRvIGRvcyB0ZXN0ZXMNCmNvbG5hbWVzKHJlc3VsdF90ZXN0ZSkgPC0gYygiRDEiLCAiRDIiLCAiRDMiLCAiRDQiLCAiRDUiLCAiRDYiLCAiRDciKQ0KDQpwYXIobWZyb3cgPSBjKDMsIDMpLCBtYXIgPSBjKDMsIDMsIDIsIDEpKSAgIyBtYXJnZW5zIGFqdXN0YWRhcw0KZm9yIChpIGluIDE6Nyl7DQogIGhpc3QoZDFbLGldLCBtYWluID0gcGFzdGUwKCJIaXN0b2dyYW1hIGRlIEQiLCBpKSwgY29sID0gaSsxLA0KICAgICAgIHhsYWIgPSBwYXN0ZTAoIkQiLCBpKSwgeWxhYiA9ICJGcmVxdcOqbmNpYSIpDQogIHRlc3RlIDwtIGphcnF1ZS5iZXJhLnRlc3QoZDFbLGldKSAjIHRlc3RlIHBhcmEgbm9ybWFsaWRhZGUNCiAgcmVzdWx0X3Rlc3RlWyxpXSA8LSAgaWZlbHNlKHRlc3RlJHAudmFsdWUgPCBhbHBoYSwgInJlaiIsICLDsSByZWoiKQ0KfQ0KcmVzdWx0X3Rlc3RlDQpgYGANCg0KIyMjIyBDw6FsY3VsbyBkbyBNQVBFIGUgZG8gQ1YgIHsudW5saXN0ZWQgLnVubnVtYmVyZWR9DQpgYGB7ciBjb2xsYXBzZT1UUlVFfQ0KIyBDYWxjdWxhbmRvIG8gTUFQRSAoRXJybyBQZXJjZW50dWFsIEFic29sdXRvIE3DqWRpbykNCk1BUEUxIDwtIG1lYW4oKGFicyhEMV9UIC0gZDFbLDFdKS9EMV9UKSoxMDApDQpNQVBFMiA8LSBtZWFuKChhYnMoRDJfVCAtIGQxWywyXSkvRDJfVCkqMTAwKQ0KTUFQRTMgPC0gbWVhbigoYWJzKEQzX1QgLSBkMVssM10pL0QzX1QpKjEwMCkNCk1BUEU0IDwtIG1lYW4oKGFicyhENF9UIC0gZDFbLDRdKS9ENF9UKSoxMDApDQpNQVBFNSA8LSBtZWFuKChhYnMoRDVfVCAtIGQxWyw1XSkvRDVfVCkqMTAwKQ0KTUFQRTYgPC0gbWVhbigoYWJzKEQ2X1QgLSBkMVssNl0pL0Q2X1QpKjEwMCkNCk1BUEU3IDwtIG1lYW4oKGFicyhEN19UIC0gZDFbLDddKS9EN19UKSoxMDApDQpNQVBFIDwtIGMoTUFQRTEsIE1BUEUyLCBNQVBFMywgTUFQRTQsIE1BUEU1LCBNQVBFNiwgTUFQRTcpDQoNCnBhc3RlMCgiTWVub3IgTUFQRTogRCIsIHdoaWNoLm1pbihNQVBFKSwgIiwgbWluID0gIiwgcm91bmQobWluKE1BUEUpLCA0KSkNCnBhc3RlMCgiU2VndW5kbyBtZW5vciBNQVBFOiBEIiwgd2hpY2gubWluKE1BUEVbLXdoaWNoLm1pbihNQVBFKV0pLCAiLCBtaW4gPSAiLCByb3VuZChtaW4oTUFQRVstd2hpY2gubWluKE1BUEUpXSksIDQpKQ0KYGBgDQoNCmBgYHtyIGNvbGxhcHNlPVRSVUV9DQojIENhbGN1bGFuZG8gbyBDVg0KY3YxIDwtIHNkKGQxWywxXSkvbWVhbihkMVssMV0pDQpjdjIgPC0gc2QoZDFbLDJdKS9tZWFuKGQxWywyXSkNCmN2MyA8LSBzZChkMVssM10pL21lYW4oZDFbLDNdKQ0KY3Y0IDwtIHNkKGQxWyw0XSkvbWVhbihkMVssNF0pDQpjdjUgPC0gc2QoZDFbLDVdKS9tZWFuKGQxWyw1XSkNCmN2NiA8LSBzZChkMVssNl0pL21lYW4oZDFbLDZdKQ0KY3Y3IDwtIHNkKGQxWyw3XSkvbWVhbihkMVssN10pDQpDViA8LSBjKGN2MSwgY3YyLCBjdjMsIGN2NCwgY3Y1LCBjdjYsIGN2NykNCg0KcGFzdGUwKCJNZW5vciBDVjogRCIsIHdoaWNoLm1pbihDViksICIsIG1pbiA9ICIsIHJvdW5kKG1pbihDViksIDQpKQ0KcGFzdGUwKCJTZWd1bmRvIG1lbm9yIENWOiBEIiwgd2hpY2gubWluKENWWy13aGljaC5taW4oQ1YpXSksICIsIG1pbiA9ICIsIHJvdW5kKG1pbihDVlstd2hpY2gubWluKENWKV0pLCA0KSkNCmBgYA0KDQojIyMgQ29uZmlndXJhw6fDo28gZG8gdGVyY2Vpcm8gY2FzbyBjb20gJG49MzAwMCQgey51bm51bWJlcmVkIC51bmxpc3RlZH0NCmBgYHtyfQ0KZW1wIDwtIGMoIjEiLCAiMiIsICIzIiwgIjQiKSAjIGVtcHJlc2FzDQpwIDwtIGMoMC4zNSwgMC40NSwgMC4xLCAwLjEpICMgcGFydGljaXBhY29lcyBkZSBtZXJjYWRvDQprIDwtIGxlbmd0aChlbXApICMgbnVtZXJvIGRlIGVtcHJlc2FzDQoNCg0KbiA8LSAzMDAwICMgbnVtZXJvIGRlIGVsZW1lbnRvcyBkZSBjYWRhIGFtb3N0cmENCk4gPC0gMTAwMCAjIG51bWVybyBkZSBhbW9zdHJhcw0KYGBgDQoNCiMjIyMgQ8OhbGN1bG8gZG9zIMOtbmRpY2VzIGRlIGRvbWluw6JuY2lhIHRlw7NyaWNvcyB7LnVubGlzdGVkIC51bm51bWJlcmVkfQ0KYGBge3J9DQojIEluZGljZXMgZGUgZG9taW5hbmNpYSB0ZW9yaWNvczoNCg0KRDFfVCA8LSAoaypzdW0ocF4yKSAtMSkvKGstMSkgIyBpbmRpY2UgZGUgSGVyZmluZGFobOKAk0hpcnNjaG1hbm4gbm9ybWFsaXphZG8NCg0KcF9PIDwtIHNvcnQocCwgZGVjcmVhc2luZyA9IFQpDQpwZXNvcyA8LSBzZXFfYWxvbmcocF9PKQ0KSXJvcyA8LSAxLygyKnN1bShwZXNvcypwX08pLTEpDQpEMl9UIDwtIChrKklyb3MgLSAxKS8oay0xKSAjIGluZGljZSBkZSBSb3NlbmJsdXRo4oCTSGFsbOKAk1RpZGVtYW5uIG5vcm1hbGl6YWRvDQoNCkhzIDwtIC1zdW0ocCpsb2cocCkpDQpEM19UIDwtIDEgLSBIcy9sb2coaykgIyBpbmRpY2UgZGUgU2hhbm5vbiBub3JtYWxpemFkbw0KDQpJaGVpcCA8LSAoZXhwKEhzKSAtIDEpLyhrIC0gMSkNCkQ0X1QgPC0gMSAtIEloZWlwICMgaW5kaWNlIGRlIEhlaXANCg0KSWhrIDwtIHN1bShwXjIpXigtMSkNCkQ1X1QgPC0gKGsgLSBJaGspLyhrLTEpICMgaW5kaWNlIGRlIEhhbm5haC1LYXkNCg0KVkEgPC0gMSAtICggc3VtKCggKG4qcCkgLSAobi9rKSApXjIpIC8gKCggKG5eMikqKGstMSkgKS9rKSApDQpENl9UIDwtIDEgLSBWQQ0KDQpTREEgPC0gMSAtIHNxcnQoIHN1bSgoIChuKnApIC0gKG4vaykgKV4yKSAvICgoIChuXjIpKihrLTEpICkvaykgKQ0KRDdfVCA8LSAxIC0gU0RBDQoNCmNhdChEMV9ULCBEMl9ULCBEM19ULCBENF9ULCBENV9ULCBENl9ULCBEN19UKQ0KYGBgDQoNCiMjIyMgU2ltdWxhw6fDo28gey51bmxpc3RlZCAudW5udW1iZXJlZH0NCg0KYGBge3J9DQptMSA8LSBtYXRyaXgoMCwgbnJvdyA8LSBuLCBuY29sIDwtIE4pICMgbWF0aXogcXVlIHZhaSByZWNlYmVyIGFzIGFtb3N0cmFzDQpkMSA8LSBtYXRyaXgoMCwgbnJvdyA8LSBOLCBuY29sIDwtIDcpICMgZ3VhcmRhIG9zIGluZGljZXMgZGUgZG9taW5hbmNpYQ0KDQpzZXQuc2VlZCgxMjMpDQpmb3IgKGkgaW4gMTpOKXsNCiAgYSA8LSBzYW1wbGUoZW1wLCBzaXplID0gbiwgcmVwbGFjZSA9IFQsIHByb2IgPSBwKSAjIGdlcmEgdW1hIGFtb3N0cmENCiAgbTFbLGldIDwtIGEgIyBjYWRhIGNvbHVuYSBkYSBtYXRyaXogdmFpIHNlciB1bWEgYW1vc3RyYQ0KICANCiAgZDFbaSwgMV0gPC0gRDEoYSkgIyBjYWRhIGNvbHVuYSBkZSBkMSByZWNlYmUgdW0gaW5kaWNlIGRlIGRvbWluYW5jaWENCiAgZDFbaSwgMl0gPC0gRDIoYSkNCiAgZDFbaSwgM10gPC0gRDMoYSkNCiAgZDFbaSwgNF0gPC0gRDQoYSkNCiAgZDFbaSwgNV0gPC0gRDUoYSkNCiAgZDFbaSwgNl0gPC0gRDYoYSkNCiAgZDFbaSwgN10gPC0gRDcoYSkNCn0NCmBgYA0KDQojIyMjIFRlc3RlIGRlIEphcnF1ZS1CZXJhIHBhcmEgbm9ybWFsaWRhZGUgey51bmxpc3RlZCAudW5udW1iZXJlZH0NCg0KVGVzdGUgZGUgbm9ybWFsaWRhZGUgcGFyYSBjYWRhIGNvbmp1bnRvIGRvcyDDrW5kaWNlcyBjYWxjdWxhZG9zOg0KYGBge3J9DQojIFRlc3RhbmRvIG5vcm1hbGlkYWRlDQoNCmFscGhhIDwtIDAuMDUgIyBuaXZlbCBkZSBzaWduaWZpY2FuY2lhDQoNCnJlc3VsdF90ZXN0ZSA8LSBtYXRyaXgoMCwgbmNvbCA9IDcsIG5yb3cgPSAxKSAjIHZhaSBndWFyZGFyIG8gcmVzdWx0YWRvIGRvcyB0ZXN0ZXMNCmNvbG5hbWVzKHJlc3VsdF90ZXN0ZSkgPC0gYygiRDEiLCAiRDIiLCAiRDMiLCAiRDQiLCAiRDUiLCAiRDYiLCAiRDciKQ0KDQpwYXIobWZyb3cgPSBjKDMsIDMpLCBtYXIgPSBjKDMsIDMsIDIsIDEpKSAgIyBtYXJnZW5zIGFqdXN0YWRhcw0KZm9yIChpIGluIDE6Nyl7DQogIGhpc3QoZDFbLGldLCBtYWluID0gcGFzdGUwKCJIaXN0b2dyYW1hIGRlIEQiLCBpKSwgY29sID0gaSsxLA0KICAgICAgIHhsYWIgPSBwYXN0ZTAoIkQiLCBpKSwgeWxhYiA9ICJGcmVxdcOqbmNpYSIpDQogIHRlc3RlIDwtIGphcnF1ZS5iZXJhLnRlc3QoZDFbLGldKSAjIHRlc3RlIHBhcmEgbm9ybWFsaWRhZGUNCiAgcmVzdWx0X3Rlc3RlWyxpXSA8LSAgaWZlbHNlKHRlc3RlJHAudmFsdWUgPCBhbHBoYSwgInJlaiIsICLDsSByZWoiKQ0KfQ0KcmVzdWx0X3Rlc3RlDQpgYGANCg0KIyMjIyBDw6FsY3VsbyBkbyBNQVBFIGUgZG8gQ1YgIHsudW5saXN0ZWQgLnVubnVtYmVyZWR9DQpgYGB7ciBjb2xsYXBzZT1UUlVFfQ0KIyBDYWxjdWxhbmRvIG8gTUFQRSAoRXJybyBQZXJjZW50dWFsIEFic29sdXRvIE3DqWRpbykNCk1BUEUxIDwtIG1lYW4oKGFicyhEMV9UIC0gZDFbLDFdKS9EMV9UKSoxMDApDQpNQVBFMiA8LSBtZWFuKChhYnMoRDJfVCAtIGQxWywyXSkvRDJfVCkqMTAwKQ0KTUFQRTMgPC0gbWVhbigoYWJzKEQzX1QgLSBkMVssM10pL0QzX1QpKjEwMCkNCk1BUEU0IDwtIG1lYW4oKGFicyhENF9UIC0gZDFbLDRdKS9ENF9UKSoxMDApDQpNQVBFNSA8LSBtZWFuKChhYnMoRDVfVCAtIGQxWyw1XSkvRDVfVCkqMTAwKQ0KTUFQRTYgPC0gbWVhbigoYWJzKEQ2X1QgLSBkMVssNl0pL0Q2X1QpKjEwMCkNCk1BUEU3IDwtIG1lYW4oKGFicyhEN19UIC0gZDFbLDddKS9EN19UKSoxMDApDQpNQVBFIDwtIGMoTUFQRTEsIE1BUEUyLCBNQVBFMywgTUFQRTQsIE1BUEU1LCBNQVBFNiwgTUFQRTcpDQoNCnBhc3RlMCgiTWVub3IgTUFQRTogRCIsIHdoaWNoLm1pbihNQVBFKSwgIiwgbWluID0gIiwgcm91bmQobWluKE1BUEUpLCA0KSkNCnBhc3RlMCgiU2VndW5kbyBtZW5vciBNQVBFOiBEIiwgd2hpY2gubWluKE1BUEVbLXdoaWNoLm1pbihNQVBFKV0pLCAiLCBtaW4gPSAiLCByb3VuZChtaW4oTUFQRVstd2hpY2gubWluKE1BUEUpXSksIDQpKQ0KYGBgDQoNCmBgYHtyIGNvbGxhcHNlPVRSVUV9DQojIENhbGN1bGFuZG8gbyBDVg0KY3YxIDwtIHNkKGQxWywxXSkvbWVhbihkMVssMV0pDQpjdjIgPC0gc2QoZDFbLDJdKS9tZWFuKGQxWywyXSkNCmN2MyA8LSBzZChkMVssM10pL21lYW4oZDFbLDNdKQ0KY3Y0IDwtIHNkKGQxWyw0XSkvbWVhbihkMVssNF0pDQpjdjUgPC0gc2QoZDFbLDVdKS9tZWFuKGQxWyw1XSkNCmN2NiA8LSBzZChkMVssNl0pL21lYW4oZDFbLDZdKQ0KY3Y3IDwtIHNkKGQxWyw3XSkvbWVhbihkMVssN10pDQpDViA8LSBjKGN2MSwgY3YyLCBjdjMsIGN2NCwgY3Y1LCBjdjYsIGN2NykNCg0KcGFzdGUwKCJNZW5vciBDVjogRCIsIHdoaWNoLm1pbihDViksICIsIG1pbiA9ICIsIHJvdW5kKG1pbihDViksIDQpKQ0KcGFzdGUwKCJTZWd1bmRvIG1lbm9yIENWOiBEIiwgd2hpY2gubWluKENWWy13aGljaC5taW4oQ1YpXSksICIsIG1pbiA9ICIsIHJvdW5kKG1pbihDVlstd2hpY2gubWluKENWKV0pLCA0KSkNCmBgYA0KDQojIyBDYXNvIDQgey51bmxpc3RlZCAudW5udW1iZXJlZH0NCiMjIyBDb25maWd1cmHDp8OjbyBkbyBxdWFydG8gY2FzbyBjb20gJG49MTAwMCQgey51bm51bWJlcmVkIC51bmxpc3RlZH0NCmBgYHtyfQ0KZW1wIDwtIGMoIjEiLCAiMiIsICIzIiwgIjQiLCAiNSIsICI2IikgIyBlbXByZXNhcw0KcCA8LSBjKDAuMiwgMC4yLCAwLjIsIDAuMDUsIDAuMTUsIDAuMikgIyBwYXJ0aWNpcGFjb2VzIGRlIG1lcmNhZG8NCmsgPC0gbGVuZ3RoKGVtcCkgIyBudW1lcm8gZGUgZW1wcmVzYXMNCg0KDQpuIDwtIDEwMDAgIyBudW1lcm8gZGUgZWxlbWVudG9zIGRlIGNhZGEgYW1vc3RyYQ0KTiA8LSAxMDAwICMgbnVtZXJvIGRlIGFtb3N0cmFzDQpgYGANCg0KIyMjIyBDw6FsY3VsbyBkb3Mgw61uZGljZXMgZGUgZG9taW7Dom5jaWEgdGXDs3JpY29zIHsudW5saXN0ZWQgLnVubnVtYmVyZWR9DQpgYGB7cn0NCiMgSW5kaWNlcyBkZSBkb21pbmFuY2lhIHRlb3JpY29zOg0KDQpEMV9UIDwtIChrKnN1bShwXjIpIC0xKS8oay0xKSAjIGluZGljZSBkZSBIZXJmaW5kYWhs4oCTSGlyc2NobWFubiBub3JtYWxpemFkbw0KDQpwX08gPC0gc29ydChwLCBkZWNyZWFzaW5nID0gVCkNCnBlc29zIDwtIHNlcV9hbG9uZyhwX08pDQpJcm9zIDwtIDEvKDIqc3VtKHBlc29zKnBfTyktMSkNCkQyX1QgPC0gKGsqSXJvcyAtIDEpLyhrLTEpICMgaW5kaWNlIGRlIFJvc2VuYmx1dGjigJNIYWxs4oCTVGlkZW1hbm4gbm9ybWFsaXphZG8NCg0KSHMgPC0gLXN1bShwKmxvZyhwKSkNCkQzX1QgPC0gMSAtIEhzL2xvZyhrKSAjIGluZGljZSBkZSBTaGFubm9uIG5vcm1hbGl6YWRvDQoNCkloZWlwIDwtIChleHAoSHMpIC0gMSkvKGsgLSAxKQ0KRDRfVCA8LSAxIC0gSWhlaXAgIyBpbmRpY2UgZGUgSGVpcA0KDQpJaGsgPC0gc3VtKHBeMileKC0xKQ0KRDVfVCA8LSAoayAtIEloaykvKGstMSkgIyBpbmRpY2UgZGUgSGFubmFoLUtheQ0KDQpWQSA8LSAxIC0gKCBzdW0oKCAobipwKSAtIChuL2spICleMikgLyAoKCAobl4yKSooay0xKSApL2spICkNCkQ2X1QgPC0gMSAtIFZBDQoNClNEQSA8LSAxIC0gc3FydCggc3VtKCggKG4qcCkgLSAobi9rKSApXjIpIC8gKCggKG5eMikqKGstMSkgKS9rKSApDQpEN19UIDwtIDEgLSBTREENCg0KY2F0KEQxX1QsIEQyX1QsIEQzX1QsIEQ0X1QsIEQ1X1QsIEQ2X1QsIEQ3X1QpDQpgYGANCg0KIyMjIyBTaW11bGHDp8OjbyB7LnVubGlzdGVkIC51bm51bWJlcmVkfQ0KDQpgYGB7cn0NCiMgaW5pY2lhbmRvIGNvbSBuID0gMTAwMA0KDQptMSA8LSBtYXRyaXgoMCwgbnJvdyA8LSBuLCBuY29sIDwtIE4pICMgbWF0aXogcXVlIHZhaSByZWNlYmVyIGFzIGFtb3N0cmFzDQpkMSA8LSBtYXRyaXgoMCwgbnJvdyA8LSBOLCBuY29sIDwtIDcpICMgZ3VhcmRhIG9zIGluZGljZXMgZGUgZG9taW5hbmNpYQ0KDQpzZXQuc2VlZCgxMjMpDQpmb3IgKGkgaW4gMTpOKXsNCiAgYSA8LSBzYW1wbGUoZW1wLCBzaXplID0gbiwgcmVwbGFjZSA9IFQsIHByb2IgPSBwKSAjIGdlcmEgdW1hIGFtb3N0cmENCiAgbTFbLGldIDwtIGEgIyBjYWRhIGNvbHVuYSBkYSBtYXRyaXogdmFpIHNlciB1bWEgYW1vc3RyYQ0KICANCiAgZDFbaSwgMV0gPC0gRDEoYSkgIyBjYWRhIGNvbHVuYSBkZSBkMSByZWNlYmUgdW0gaW5kaWNlIGRlIGRvbWluYW5jaWENCiAgZDFbaSwgMl0gPC0gRDIoYSkNCiAgZDFbaSwgM10gPC0gRDMoYSkNCiAgZDFbaSwgNF0gPC0gRDQoYSkNCiAgZDFbaSwgNV0gPC0gRDUoYSkNCiAgZDFbaSwgNl0gPC0gRDYoYSkNCiAgZDFbaSwgN10gPC0gRDcoYSkNCn0NCmBgYA0KDQojIyMjIFRlc3RlIGRlIEphcnF1ZS1CZXJhIHBhcmEgbm9ybWFsaWRhZGUgey51bmxpc3RlZCAudW5udW1iZXJlZH0NCg0KYGBge3J9DQojIFRlc3RhbmRvIG5vcm1hbGlkYWRlDQoNCmFscGhhIDwtIDAuMDUgIyBuaXZlbCBkZSBzaWduaWZpY2FuY2lhDQoNCnJlc3VsdF90ZXN0ZSA8LSBtYXRyaXgoMCwgbmNvbCA9IDcsIG5yb3cgPSAxKSAjIHZhaSBndWFyZGFyIG8gcmVzdWx0YWRvIGRvcyB0ZXN0ZXMNCmNvbG5hbWVzKHJlc3VsdF90ZXN0ZSkgPC0gYygiRDEiLCAiRDIiLCAiRDMiLCAiRDQiLCAiRDUiLCAiRDYiLCAiRDciKQ0KDQpwYXIobWZyb3cgPSBjKDMsIDMpLCBtYXIgPSBjKDMsIDMsIDIsIDEpKSAgIyBtYXJnZW5zIGFqdXN0YWRhcw0KZm9yIChpIGluIDE6Nyl7DQogIGhpc3QoZDFbLGldLCBtYWluID0gcGFzdGUwKCJIaXN0b2dyYW1hIGRlIEQiLCBpKSwgY29sID0gaSsxLA0KICAgICAgIHhsYWIgPSBwYXN0ZTAoIkQiLCBpKSwgeWxhYiA9ICJGcmVxdcOqbmNpYSIpDQogIHRlc3RlIDwtIGphcnF1ZS5iZXJhLnRlc3QoZDFbLGldKSAjIHRlc3RlIHBhcmEgbm9ybWFsaWRhZGUNCiAgcmVzdWx0X3Rlc3RlWyxpXSA8LSAgaWZlbHNlKHRlc3RlJHAudmFsdWUgPCBhbHBoYSwgInJlaiIsICLDsSByZWoiKQ0KfQ0KcmVzdWx0X3Rlc3RlDQpgYGANCg0KIyMjIyBDw6FsY3VsbyBkbyBNQVBFIGUgZG8gQ1YgIHsudW5saXN0ZWQgLnVubnVtYmVyZWR9DQpgYGB7ciBjb2xsYXBzZT1UUlVFfQ0KIyBDYWxjdWxhbmRvIG8gTUFQRSAoRXJybyBQZXJjZW50dWFsIEFic29sdXRvIE3DqWRpbykNCk1BUEUxIDwtIG1lYW4oKGFicyhEMV9UIC0gZDFbLDFdKS9EMV9UKSoxMDApDQpNQVBFMiA8LSBtZWFuKChhYnMoRDJfVCAtIGQxWywyXSkvRDJfVCkqMTAwKQ0KTUFQRTMgPC0gbWVhbigoYWJzKEQzX1QgLSBkMVssM10pL0QzX1QpKjEwMCkNCk1BUEU0IDwtIG1lYW4oKGFicyhENF9UIC0gZDFbLDRdKS9ENF9UKSoxMDApDQpNQVBFNSA8LSBtZWFuKChhYnMoRDVfVCAtIGQxWyw1XSkvRDVfVCkqMTAwKQ0KTUFQRTYgPC0gbWVhbigoYWJzKEQ2X1QgLSBkMVssNl0pL0Q2X1QpKjEwMCkNCk1BUEU3IDwtIG1lYW4oKGFicyhEN19UIC0gZDFbLDddKS9EN19UKSoxMDApDQpNQVBFIDwtIGMoTUFQRTEsIE1BUEUyLCBNQVBFMywgTUFQRTQsIE1BUEU1LCBNQVBFNiwgTUFQRTcpDQoNCnBhc3RlMCgiTWVub3IgTUFQRTogRCIsIHdoaWNoLm1pbihNQVBFKSwgIiwgbWluID0gIiwgcm91bmQobWluKE1BUEUpLCA0KSkNCnBhc3RlMCgiU2VndW5kbyBtZW5vciBNQVBFOiBEIiwgd2hpY2gubWluKE1BUEVbLXdoaWNoLm1pbihNQVBFKV0pLCAiLCBtaW4gPSAiLCByb3VuZChtaW4oTUFQRVstd2hpY2gubWluKE1BUEUpXSksIDQpKQ0KYGBgDQoNCmBgYHtyIGNvbGxhcHNlPVRSVUV9DQojIENhbGN1bGFuZG8gbyBDVg0KY3YxIDwtIHNkKGQxWywxXSkvbWVhbihkMVssMV0pDQpjdjIgPC0gc2QoZDFbLDJdKS9tZWFuKGQxWywyXSkNCmN2MyA8LSBzZChkMVssM10pL21lYW4oZDFbLDNdKQ0KY3Y0IDwtIHNkKGQxWyw0XSkvbWVhbihkMVssNF0pDQpjdjUgPC0gc2QoZDFbLDVdKS9tZWFuKGQxWyw1XSkNCmN2NiA8LSBzZChkMVssNl0pL21lYW4oZDFbLDZdKQ0KY3Y3IDwtIHNkKGQxWyw3XSkvbWVhbihkMVssN10pDQpDViA8LSBjKGN2MSwgY3YyLCBjdjMsIGN2NCwgY3Y1LCBjdjYsIGN2NykNCg0KcGFzdGUwKCJNZW5vciBDVjogRCIsIHdoaWNoLm1pbihDViksICIsIG1pbiA9ICIsIHJvdW5kKG1pbihDViksIDQpKQ0KcGFzdGUwKCJTZWd1bmRvIG1lbm9yIENWOiBEIiwgd2hpY2gubWluKENWWy13aGljaC5taW4oQ1YpXSksICIsIG1pbiA9ICIsIHJvdW5kKG1pbihDVlstd2hpY2gubWluKENWKV0pLCA0KSkNCmBgYA0KDQojIyMgQ29uZmlndXJhw6fDo28gZG8gcXVhcnRvIGNhc28gY29tICRuPTMwMDAkIHsudW5udW1iZXJlZCAudW5saXN0ZWR9DQpgYGB7cn0NCmVtcCA8LSBjKCIxIiwgIjIiLCAiMyIsICI0IiwgIjUiLCAiNiIpICMgZW1wcmVzYXMNCnAgPC0gYygwLjIsIDAuMiwgMC4yLCAwLjA1LCAwLjE1LCAwLjIpICMgcGFydGljaXBhY29lcyBkZSBtZXJjYWRvDQprIDwtIGxlbmd0aChlbXApICMgbnVtZXJvIGRlIGVtcHJlc2FzDQoNCg0KbiA8LSAzMDAwICMgbnVtZXJvIGRlIGVsZW1lbnRvcyBkZSBjYWRhIGFtb3N0cmENCk4gPC0gMTAwMCAjIG51bWVybyBkZSBhbW9zdHJhcw0KYGBgDQoNCiMjIyMgQ8OhbGN1bG8gZG9zIMOtbmRpY2VzIGRlIGRvbWluw6JuY2lhIHRlw7NyaWNvcyB7LnVubGlzdGVkIC51bm51bWJlcmVkfQ0KYGBge3J9DQojIEluZGljZXMgZGUgZG9taW5hbmNpYSB0ZW9yaWNvczoNCg0KRDFfVCA8LSAoaypzdW0ocF4yKSAtMSkvKGstMSkgIyBpbmRpY2UgZGUgSGVyZmluZGFobOKAk0hpcnNjaG1hbm4gbm9ybWFsaXphZG8NCg0KcF9PIDwtIHNvcnQocCwgZGVjcmVhc2luZyA9IFQpDQpwZXNvcyA8LSBzZXFfYWxvbmcocF9PKQ0KSXJvcyA8LSAxLygyKnN1bShwZXNvcypwX08pLTEpDQpEMl9UIDwtIChrKklyb3MgLSAxKS8oay0xKSAjIGluZGljZSBkZSBSb3NlbmJsdXRo4oCTSGFsbOKAk1RpZGVtYW5uIG5vcm1hbGl6YWRvDQoNCkhzIDwtIC1zdW0ocCpsb2cocCkpDQpEM19UIDwtIDEgLSBIcy9sb2coaykgIyBpbmRpY2UgZGUgU2hhbm5vbiBub3JtYWxpemFkbw0KDQpJaGVpcCA8LSAoZXhwKEhzKSAtIDEpLyhrIC0gMSkNCkQ0X1QgPC0gMSAtIEloZWlwICMgaW5kaWNlIGRlIEhlaXANCg0KSWhrIDwtIHN1bShwXjIpXigtMSkNCkQ1X1QgPC0gKGsgLSBJaGspLyhrLTEpICMgaW5kaWNlIGRlIEhhbm5haC1LYXkNCg0KVkEgPC0gMSAtICggc3VtKCggKG4qcCkgLSAobi9rKSApXjIpIC8gKCggKG5eMikqKGstMSkgKS9rKSApDQpENl9UIDwtIDEgLSBWQQ0KDQpTREEgPC0gMSAtIHNxcnQoIHN1bSgoIChuKnApIC0gKG4vaykgKV4yKSAvICgoIChuXjIpKihrLTEpICkvaykgKQ0KRDdfVCA8LSAxIC0gU0RBDQoNCmNhdChEMV9ULCBEMl9ULCBEM19ULCBENF9ULCBENV9ULCBENl9ULCBEN19UKQ0KYGBgDQoNCiMjIyMgU2ltdWxhw6fDo28gey51bmxpc3RlZCAudW5udW1iZXJlZH0NCg0KYGBge3J9DQptMSA8LSBtYXRyaXgoMCwgbnJvdyA8LSBuLCBuY29sIDwtIE4pICMgbWF0aXogcXVlIHZhaSByZWNlYmVyIGFzIGFtb3N0cmFzDQpkMSA8LSBtYXRyaXgoMCwgbnJvdyA8LSBOLCBuY29sIDwtIDcpICMgZ3VhcmRhIG9zIGluZGljZXMgZGUgZG9taW5hbmNpYQ0KDQpzZXQuc2VlZCgxMjMpDQpmb3IgKGkgaW4gMTpOKXsNCiAgYSA8LSBzYW1wbGUoZW1wLCBzaXplID0gbiwgcmVwbGFjZSA9IFQsIHByb2IgPSBwKSAjIGdlcmEgdW1hIGFtb3N0cmENCiAgbTFbLGldIDwtIGEgIyBjYWRhIGNvbHVuYSBkYSBtYXRyaXogdmFpIHNlciB1bWEgYW1vc3RyYQ0KICANCiAgZDFbaSwgMV0gPC0gRDEoYSkgIyBjYWRhIGNvbHVuYSBkZSBkMSByZWNlYmUgdW0gaW5kaWNlIGRlIGRvbWluYW5jaWENCiAgZDFbaSwgMl0gPC0gRDIoYSkNCiAgZDFbaSwgM10gPC0gRDMoYSkNCiAgZDFbaSwgNF0gPC0gRDQoYSkNCiAgZDFbaSwgNV0gPC0gRDUoYSkNCiAgZDFbaSwgNl0gPC0gRDYoYSkNCiAgZDFbaSwgN10gPC0gRDcoYSkNCn0NCmBgYA0KDQojIyMjIFRlc3RlIGRlIEphcnF1ZS1CZXJhIHBhcmEgbm9ybWFsaWRhZGUgey51bmxpc3RlZCAudW5udW1iZXJlZH0NCg0KVGVzdGUgZGUgbm9ybWFsaWRhZGUgcGFyYSBjYWRhIGNvbmp1bnRvIGRvcyDDrW5kaWNlcyBjYWxjdWxhZG9zOg0KYGBge3J9DQojIFRlc3RhbmRvIG5vcm1hbGlkYWRlDQoNCmFscGhhIDwtIDAuMDUgIyBuaXZlbCBkZSBzaWduaWZpY2FuY2lhDQoNCnJlc3VsdF90ZXN0ZSA8LSBtYXRyaXgoMCwgbmNvbCA9IDcsIG5yb3cgPSAxKSAjIHZhaSBndWFyZGFyIG8gcmVzdWx0YWRvIGRvcyB0ZXN0ZXMNCmNvbG5hbWVzKHJlc3VsdF90ZXN0ZSkgPC0gYygiRDEiLCAiRDIiLCAiRDMiLCAiRDQiLCAiRDUiLCAiRDYiLCAiRDciKQ0KDQpwYXIobWZyb3cgPSBjKDMsIDMpLCBtYXIgPSBjKDMsIDMsIDIsIDEpKSAgIyBtYXJnZW5zIGFqdXN0YWRhcw0KZm9yIChpIGluIDE6Nyl7DQogIGhpc3QoZDFbLGldLCBtYWluID0gcGFzdGUwKCJIaXN0b2dyYW1hIGRlIEQiLCBpKSwgY29sID0gaSsxLA0KICAgICAgIHhsYWIgPSBwYXN0ZTAoIkQiLCBpKSwgeWxhYiA9ICJGcmVxdcOqbmNpYSIpDQogIHRlc3RlIDwtIGphcnF1ZS5iZXJhLnRlc3QoZDFbLGldKSAjIHRlc3RlIHBhcmEgbm9ybWFsaWRhZGUNCiAgcmVzdWx0X3Rlc3RlWyxpXSA8LSAgaWZlbHNlKHRlc3RlJHAudmFsdWUgPCBhbHBoYSwgInJlaiIsICLDsSByZWoiKQ0KfQ0KcmVzdWx0X3Rlc3RlDQpgYGANCg0KIyMjIyBDw6FsY3VsbyBkbyBNQVBFIGUgZG8gQ1YgIHsudW5saXN0ZWQgLnVubnVtYmVyZWR9DQpgYGB7ciBjb2xsYXBzZT1UUlVFfQ0KIyBDYWxjdWxhbmRvIG8gTUFQRSAoRXJybyBQZXJjZW50dWFsIEFic29sdXRvIE3DqWRpbykNCk1BUEUxIDwtIG1lYW4oKGFicyhEMV9UIC0gZDFbLDFdKS9EMV9UKSoxMDApDQpNQVBFMiA8LSBtZWFuKChhYnMoRDJfVCAtIGQxWywyXSkvRDJfVCkqMTAwKQ0KTUFQRTMgPC0gbWVhbigoYWJzKEQzX1QgLSBkMVssM10pL0QzX1QpKjEwMCkNCk1BUEU0IDwtIG1lYW4oKGFicyhENF9UIC0gZDFbLDRdKS9ENF9UKSoxMDApDQpNQVBFNSA8LSBtZWFuKChhYnMoRDVfVCAtIGQxWyw1XSkvRDVfVCkqMTAwKQ0KTUFQRTYgPC0gbWVhbigoYWJzKEQ2X1QgLSBkMVssNl0pL0Q2X1QpKjEwMCkNCk1BUEU3IDwtIG1lYW4oKGFicyhEN19UIC0gZDFbLDddKS9EN19UKSoxMDApDQpNQVBFIDwtIGMoTUFQRTEsIE1BUEUyLCBNQVBFMywgTUFQRTQsIE1BUEU1LCBNQVBFNiwgTUFQRTcpDQoNCnBhc3RlMCgiTWVub3IgTUFQRTogRCIsIHdoaWNoLm1pbihNQVBFKSwgIiwgbWluID0gIiwgcm91bmQobWluKE1BUEUpLCA0KSkNCnBhc3RlMCgiU2VndW5kbyBtZW5vciBNQVBFOiBEIiwgd2hpY2gubWluKE1BUEVbLXdoaWNoLm1pbihNQVBFKV0pLCAiLCBtaW4gPSAiLCByb3VuZChtaW4oTUFQRVstd2hpY2gubWluKE1BUEUpXSksIDQpKQ0KYGBgDQoNCmBgYHtyIGNvbGxhcHNlPVRSVUV9DQojIENhbGN1bGFuZG8gbyBDVg0KY3YxIDwtIHNkKGQxWywxXSkvbWVhbihkMVssMV0pDQpjdjIgPC0gc2QoZDFbLDJdKS9tZWFuKGQxWywyXSkNCmN2MyA8LSBzZChkMVssM10pL21lYW4oZDFbLDNdKQ0KY3Y0IDwtIHNkKGQxWyw0XSkvbWVhbihkMVssNF0pDQpjdjUgPC0gc2QoZDFbLDVdKS9tZWFuKGQxWyw1XSkNCmN2NiA8LSBzZChkMVssNl0pL21lYW4oZDFbLDZdKQ0KY3Y3IDwtIHNkKGQxWyw3XSkvbWVhbihkMVssN10pDQpDViA8LSBjKGN2MSwgY3YyLCBjdjMsIGN2NCwgY3Y1LCBjdjYsIGN2NykNCg0KcGFzdGUwKCJNZW5vciBDVjogRCIsIHdoaWNoLm1pbihDViksICIsIG1pbiA9ICIsIHJvdW5kKG1pbihDViksIDQpKQ0KcGFzdGUwKCJTZWd1bmRvIG1lbm9yIENWOiBEIiwgd2hpY2gubWluKENWWy13aGljaC5taW4oQ1YpXSksICIsIG1pbiA9ICIsIHJvdW5kKG1pbihDVlstd2hpY2gubWluKENWKV0pLCA0KSkNCmBgYA0KDQojIyBDYXNvIDUgey51bmxpc3RlZCAudW5udW1iZXJlZH0NCiMjIyBDb25maWd1cmHDp8OjbyBkbyBxdWludG8gY2FzbyBjb20gJG49MTAwMCQgey51bm51bWJlcmVkIC51bmxpc3RlZH0NCmBgYHtyfQ0KZW1wIDwtIGMoIjEiLCAiMiIsICIzIiwgIjQiLCAiNSIsICI2IikgIyBlbXByZXNhcw0KcCA8LSBjKDAuMDEsIDAuMDEsIDAuMDEsIDAuMDEsIDAuMDEsIDAuOTUpICMgcGFydGljaXBhY29lcyBkZSBtZXJjYWRvDQprIDwtIGxlbmd0aChlbXApICMgbnVtZXJvIGRlIGVtcHJlc2FzDQoNCg0KbiA8LSAxMDAwICMgbnVtZXJvIGRlIGVsZW1lbnRvcyBkZSBjYWRhIGFtb3N0cmENCk4gPC0gMTAwMCAjIG51bWVybyBkZSBhbW9zdHJhcw0KYGBgDQoNCiMjIyMgQ8OhbGN1bG8gZG9zIMOtbmRpY2VzIGRlIGRvbWluw6JuY2lhIHRlw7NyaWNvcyB7LnVubGlzdGVkIC51bm51bWJlcmVkfQ0KYGBge3J9DQojIEluZGljZXMgZGUgZG9taW5hbmNpYSB0ZW9yaWNvczoNCg0KRDFfVCA8LSAoaypzdW0ocF4yKSAtMSkvKGstMSkgIyBpbmRpY2UgZGUgSGVyZmluZGFobOKAk0hpcnNjaG1hbm4gbm9ybWFsaXphZG8NCg0KcF9PIDwtIHNvcnQocCwgZGVjcmVhc2luZyA9IFQpDQpwZXNvcyA8LSBzZXFfYWxvbmcocF9PKQ0KSXJvcyA8LSAxLygyKnN1bShwZXNvcypwX08pLTEpDQpEMl9UIDwtIChrKklyb3MgLSAxKS8oay0xKSAjIGluZGljZSBkZSBSb3NlbmJsdXRo4oCTSGFsbOKAk1RpZGVtYW5uIG5vcm1hbGl6YWRvDQoNCkhzIDwtIC1zdW0ocCpsb2cocCkpDQpEM19UIDwtIDEgLSBIcy9sb2coaykgIyBpbmRpY2UgZGUgU2hhbm5vbiBub3JtYWxpemFkbw0KDQpJaGVpcCA8LSAoZXhwKEhzKSAtIDEpLyhrIC0gMSkNCkQ0X1QgPC0gMSAtIEloZWlwICMgaW5kaWNlIGRlIEhlaXANCg0KSWhrIDwtIHN1bShwXjIpXigtMSkNCkQ1X1QgPC0gKGsgLSBJaGspLyhrLTEpICMgaW5kaWNlIGRlIEhhbm5haC1LYXkNCg0KVkEgPC0gMSAtICggc3VtKCggKG4qcCkgLSAobi9rKSApXjIpIC8gKCggKG5eMikqKGstMSkgKS9rKSApDQpENl9UIDwtIDEgLSBWQQ0KDQpTREEgPC0gMSAtIHNxcnQoIHN1bSgoIChuKnApIC0gKG4vaykgKV4yKSAvICgoIChuXjIpKihrLTEpICkvaykgKQ0KRDdfVCA8LSAxIC0gU0RBDQoNCmNhdChEMV9ULCBEMl9ULCBEM19ULCBENF9ULCBENV9ULCBENl9ULCBEN19UKQ0KYGBgDQoNCiMjIyMgU2ltdWxhw6fDo28gey51bmxpc3RlZCAudW5udW1iZXJlZH0NCg0KYGBge3J9DQojIGluaWNpYW5kbyBjb20gbiA9IDEwMDANCg0KbTEgPC0gbWF0cml4KDAsIG5yb3cgPC0gbiwgbmNvbCA8LSBOKSAjIG1hdGl6IHF1ZSB2YWkgcmVjZWJlciBhcyBhbW9zdHJhcw0KZDEgPC0gbWF0cml4KDAsIG5yb3cgPC0gTiwgbmNvbCA8LSA3KSAjIGd1YXJkYSBvcyBpbmRpY2VzIGRlIGRvbWluYW5jaWENCg0Kc2V0LnNlZWQoMTIzKQ0KZm9yIChpIGluIDE6Til7DQogIGEgPC0gc2FtcGxlKGVtcCwgc2l6ZSA9IG4sIHJlcGxhY2UgPSBULCBwcm9iID0gcCkgIyBnZXJhIHVtYSBhbW9zdHJhDQogIG0xWyxpXSA8LSBhICMgY2FkYSBjb2x1bmEgZGEgbWF0cml6IHZhaSBzZXIgdW1hIGFtb3N0cmENCiAgDQogIGQxW2ksIDFdIDwtIEQxKGEpICMgY2FkYSBjb2x1bmEgZGUgZDEgcmVjZWJlIHVtIGluZGljZSBkZSBkb21pbmFuY2lhDQogIGQxW2ksIDJdIDwtIEQyKGEpDQogIGQxW2ksIDNdIDwtIEQzKGEpDQogIGQxW2ksIDRdIDwtIEQ0KGEpDQogIGQxW2ksIDVdIDwtIEQ1KGEpDQogIGQxW2ksIDZdIDwtIEQ2KGEpDQogIGQxW2ksIDddIDwtIEQ3KGEpDQp9DQpgYGANCg0KIyMjIyBUZXN0ZSBkZSBKYXJxdWUtQmVyYSBwYXJhIG5vcm1hbGlkYWRlIHsudW5saXN0ZWQgLnVubnVtYmVyZWR9DQoNCmBgYHtyfQ0KIyBUZXN0YW5kbyBub3JtYWxpZGFkZQ0KDQphbHBoYSA8LSAwLjA1ICMgbml2ZWwgZGUgc2lnbmlmaWNhbmNpYQ0KDQpyZXN1bHRfdGVzdGUgPC0gbWF0cml4KDAsIG5jb2wgPSA3LCBucm93ID0gMSkgIyB2YWkgZ3VhcmRhciBvIHJlc3VsdGFkbyBkb3MgdGVzdGVzDQpjb2xuYW1lcyhyZXN1bHRfdGVzdGUpIDwtIGMoIkQxIiwgIkQyIiwgIkQzIiwgIkQ0IiwgIkQ1IiwgIkQ2IiwgIkQ3IikNCg0KcGFyKG1mcm93ID0gYygzLCAzKSwgbWFyID0gYygzLCAzLCAyLCAxKSkgICMgbWFyZ2VucyBhanVzdGFkYXMNCmZvciAoaSBpbiAxOjcpew0KICBoaXN0KGQxWyxpXSwgbWFpbiA9IHBhc3RlMCgiSGlzdG9ncmFtYSBkZSBEIiwgaSksIGNvbCA9IGkrMSwNCiAgICAgICB4bGFiID0gcGFzdGUwKCJEIiwgaSksIHlsYWIgPSAiRnJlcXXDqm5jaWEiKQ0KICB0ZXN0ZSA8LSBqYXJxdWUuYmVyYS50ZXN0KGQxWyxpXSkgIyB0ZXN0ZSBwYXJhIG5vcm1hbGlkYWRlDQogIHJlc3VsdF90ZXN0ZVssaV0gPC0gIGlmZWxzZSh0ZXN0ZSRwLnZhbHVlIDwgYWxwaGEsICJyZWoiLCAiw7EgcmVqIikNCn0NCnJlc3VsdF90ZXN0ZQ0KYGBgDQoNCiMjIyMgQ8OhbGN1bG8gZG8gTUFQRSBlIGRvIENWICB7LnVubGlzdGVkIC51bm51bWJlcmVkfQ0KYGBge3IgY29sbGFwc2U9VFJVRX0NCiMgQ2FsY3VsYW5kbyBvIE1BUEUgKEVycm8gUGVyY2VudHVhbCBBYnNvbHV0byBNw6lkaW8pDQpNQVBFMSA8LSBtZWFuKChhYnMoRDFfVCAtIGQxWywxXSkvRDFfVCkqMTAwKQ0KTUFQRTIgPC0gbWVhbigoYWJzKEQyX1QgLSBkMVssMl0pL0QyX1QpKjEwMCkNCk1BUEUzIDwtIG1lYW4oKGFicyhEM19UIC0gZDFbLDNdKS9EM19UKSoxMDApDQpNQVBFNCA8LSBtZWFuKChhYnMoRDRfVCAtIGQxWyw0XSkvRDRfVCkqMTAwKQ0KTUFQRTUgPC0gbWVhbigoYWJzKEQ1X1QgLSBkMVssNV0pL0Q1X1QpKjEwMCkNCk1BUEU2IDwtIG1lYW4oKGFicyhENl9UIC0gZDFbLDZdKS9ENl9UKSoxMDApDQpNQVBFNyA8LSBtZWFuKChhYnMoRDdfVCAtIGQxWyw3XSkvRDdfVCkqMTAwKQ0KTUFQRSA8LSBjKE1BUEUxLCBNQVBFMiwgTUFQRTMsIE1BUEU0LCBNQVBFNSwgTUFQRTYsIE1BUEU3KQ0KDQpwYXN0ZTAoIk1lbm9yIE1BUEU6IEQiLCB3aGljaC5taW4oTUFQRSksICIsIG1pbiA9ICIsIHJvdW5kKG1pbihNQVBFKSwgNCkpDQpwYXN0ZTAoIlNlZ3VuZG8gbWVub3IgTUFQRTogRCIsIHdoaWNoLm1pbihNQVBFWy13aGljaC5taW4oTUFQRSldKSwgIiwgbWluID0gIiwgcm91bmQobWluKE1BUEVbLXdoaWNoLm1pbihNQVBFKV0pLCA0KSkNCmBgYA0KDQpgYGB7ciBjb2xsYXBzZT1UUlVFfQ0KIyBDYWxjdWxhbmRvIG8gQ1YNCmN2MSA8LSBzZChkMVssMV0pL21lYW4oZDFbLDFdKQ0KY3YyIDwtIHNkKGQxWywyXSkvbWVhbihkMVssMl0pDQpjdjMgPC0gc2QoZDFbLDNdKS9tZWFuKGQxWywzXSkNCmN2NCA8LSBzZChkMVssNF0pL21lYW4oZDFbLDRdKQ0KY3Y1IDwtIHNkKGQxWyw1XSkvbWVhbihkMVssNV0pDQpjdjYgPC0gc2QoZDFbLDZdKS9tZWFuKGQxWyw2XSkNCmN2NyA8LSBzZChkMVssN10pL21lYW4oZDFbLDddKQ0KQ1YgPC0gYyhjdjEsIGN2MiwgY3YzLCBjdjQsIGN2NSwgY3Y2LCBjdjcpDQoNCnBhc3RlMCgiTWVub3IgQ1Y6IEQiLCB3aGljaC5taW4oQ1YpLCAiLCBtaW4gPSAiLCByb3VuZChtaW4oQ1YpLCA0KSkNCnBhc3RlMCgiU2VndW5kbyBtZW5vciBDVjogRCIsIHdoaWNoLm1pbihDVlstd2hpY2gubWluKENWKV0pLCAiLCBtaW4gPSAiLCByb3VuZChtaW4oQ1ZbLXdoaWNoLm1pbihDVildKSwgNCkpDQpgYGANCg0KIyMjIENvbmZpZ3VyYcOnw6NvIGRvIHF1aW50byBjYXNvIGNvbSAkbj0zMDAwJCB7LnVubnVtYmVyZWQgLnVubGlzdGVkfQ0KYGBge3J9DQplbXAgPC0gYygiMSIsICIyIiwgIjMiLCAiNCIsICI1IiwgIjYiKSAjIGVtcHJlc2FzDQpwIDwtIGMoMC4wMSwgMC4wMSwgMC4wMSwgMC4wMSwgMC4wMSwgMC45NSkgIyBwYXJ0aWNpcGFjb2VzIGRlIG1lcmNhZG8NCmsgPC0gbGVuZ3RoKGVtcCkgIyBudW1lcm8gZGUgZW1wcmVzYXMNCg0KDQpuIDwtIDMwMDAgIyBudW1lcm8gZGUgZWxlbWVudG9zIGRlIGNhZGEgYW1vc3RyYQ0KTiA8LSAxMDAwICMgbnVtZXJvIGRlIGFtb3N0cmFzDQpgYGANCg0KIyMjIyBDw6FsY3VsbyBkb3Mgw61uZGljZXMgZGUgZG9taW7Dom5jaWEgdGXDs3JpY29zIHsudW5saXN0ZWQgLnVubnVtYmVyZWR9DQpgYGB7cn0NCiMgSW5kaWNlcyBkZSBkb21pbmFuY2lhIHRlb3JpY29zOg0KDQpEMV9UIDwtIChrKnN1bShwXjIpIC0xKS8oay0xKSAjIGluZGljZSBkZSBIZXJmaW5kYWhs4oCTSGlyc2NobWFubiBub3JtYWxpemFkbw0KDQpwX08gPC0gc29ydChwLCBkZWNyZWFzaW5nID0gVCkNCnBlc29zIDwtIHNlcV9hbG9uZyhwX08pDQpJcm9zIDwtIDEvKDIqc3VtKHBlc29zKnBfTyktMSkNCkQyX1QgPC0gKGsqSXJvcyAtIDEpLyhrLTEpICMgaW5kaWNlIGRlIFJvc2VuYmx1dGjigJNIYWxs4oCTVGlkZW1hbm4gbm9ybWFsaXphZG8NCg0KSHMgPC0gLXN1bShwKmxvZyhwKSkNCkQzX1QgPC0gMSAtIEhzL2xvZyhrKSAjIGluZGljZSBkZSBTaGFubm9uIG5vcm1hbGl6YWRvDQoNCkloZWlwIDwtIChleHAoSHMpIC0gMSkvKGsgLSAxKQ0KRDRfVCA8LSAxIC0gSWhlaXAgIyBpbmRpY2UgZGUgSGVpcA0KDQpJaGsgPC0gc3VtKHBeMileKC0xKQ0KRDVfVCA8LSAoayAtIEloaykvKGstMSkgIyBpbmRpY2UgZGUgSGFubmFoLUtheQ0KDQpWQSA8LSAxIC0gKCBzdW0oKCAobipwKSAtIChuL2spICleMikgLyAoKCAobl4yKSooay0xKSApL2spICkNCkQ2X1QgPC0gMSAtIFZBDQoNClNEQSA8LSAxIC0gc3FydCggc3VtKCggKG4qcCkgLSAobi9rKSApXjIpIC8gKCggKG5eMikqKGstMSkgKS9rKSApDQpEN19UIDwtIDEgLSBTREENCg0KY2F0KEQxX1QsIEQyX1QsIEQzX1QsIEQ0X1QsIEQ1X1QsIEQ2X1QsIEQ3X1QpDQpgYGANCg0KIyMjIyBTaW11bGHDp8OjbyB7LnVubGlzdGVkIC51bm51bWJlcmVkfQ0KDQpgYGB7cn0NCm0xIDwtIG1hdHJpeCgwLCBucm93IDwtIG4sIG5jb2wgPC0gTikgIyBtYXRpeiBxdWUgdmFpIHJlY2ViZXIgYXMgYW1vc3RyYXMNCmQxIDwtIG1hdHJpeCgwLCBucm93IDwtIE4sIG5jb2wgPC0gNykgIyBndWFyZGEgb3MgaW5kaWNlcyBkZSBkb21pbmFuY2lhDQoNCnNldC5zZWVkKDEyMykNCmZvciAoaSBpbiAxOk4pew0KICBhIDwtIHNhbXBsZShlbXAsIHNpemUgPSBuLCByZXBsYWNlID0gVCwgcHJvYiA9IHApICMgZ2VyYSB1bWEgYW1vc3RyYQ0KICBtMVssaV0gPC0gYSAjIGNhZGEgY29sdW5hIGRhIG1hdHJpeiB2YWkgc2VyIHVtYSBhbW9zdHJhDQogIA0KICBkMVtpLCAxXSA8LSBEMShhKSAjIGNhZGEgY29sdW5hIGRlIGQxIHJlY2ViZSB1bSBpbmRpY2UgZGUgZG9taW5hbmNpYQ0KICBkMVtpLCAyXSA8LSBEMihhKQ0KICBkMVtpLCAzXSA8LSBEMyhhKQ0KICBkMVtpLCA0XSA8LSBENChhKQ0KICBkMVtpLCA1XSA8LSBENShhKQ0KICBkMVtpLCA2XSA8LSBENihhKQ0KICBkMVtpLCA3XSA8LSBENyhhKQ0KfQ0KYGBgDQoNCiMjIyMgVGVzdGUgZGUgSmFycXVlLUJlcmEgcGFyYSBub3JtYWxpZGFkZSB7LnVubGlzdGVkIC51bm51bWJlcmVkfQ0KDQpUZXN0ZSBkZSBub3JtYWxpZGFkZSBwYXJhIGNhZGEgY29uanVudG8gZG9zIMOtbmRpY2VzIGNhbGN1bGFkb3M6DQpgYGB7cn0NCiMgVGVzdGFuZG8gbm9ybWFsaWRhZGUNCg0KYWxwaGEgPC0gMC4wNSAjIG5pdmVsIGRlIHNpZ25pZmljYW5jaWENCg0KcmVzdWx0X3Rlc3RlIDwtIG1hdHJpeCgwLCBuY29sID0gNywgbnJvdyA9IDEpICMgdmFpIGd1YXJkYXIgbyByZXN1bHRhZG8gZG9zIHRlc3Rlcw0KY29sbmFtZXMocmVzdWx0X3Rlc3RlKSA8LSBjKCJEMSIsICJEMiIsICJEMyIsICJENCIsICJENSIsICJENiIsICJENyIpDQoNCnBhcihtZnJvdyA9IGMoMywgMyksIG1hciA9IGMoMywgMywgMiwgMSkpICAjIG1hcmdlbnMgYWp1c3RhZGFzDQpmb3IgKGkgaW4gMTo3KXsNCiAgaGlzdChkMVssaV0sIG1haW4gPSBwYXN0ZTAoIkhpc3RvZ3JhbWEgZGUgRCIsIGkpLCBjb2wgPSBpKzEsDQogICAgICAgeGxhYiA9IHBhc3RlMCgiRCIsIGkpLCB5bGFiID0gIkZyZXF1w6puY2lhIikNCiAgdGVzdGUgPC0gamFycXVlLmJlcmEudGVzdChkMVssaV0pICMgdGVzdGUgcGFyYSBub3JtYWxpZGFkZQ0KICByZXN1bHRfdGVzdGVbLGldIDwtICBpZmVsc2UodGVzdGUkcC52YWx1ZSA8IGFscGhhLCAicmVqIiwgIsOxIHJlaiIpDQp9DQpyZXN1bHRfdGVzdGUNCmBgYA0KDQojIyMjIEPDoWxjdWxvIGRvIE1BUEUgZSBkbyBDViAgey51bmxpc3RlZCAudW5udW1iZXJlZH0NCmBgYHtyIGNvbGxhcHNlPVRSVUV9DQojIENhbGN1bGFuZG8gbyBNQVBFIChFcnJvIFBlcmNlbnR1YWwgQWJzb2x1dG8gTcOpZGlvKQ0KTUFQRTEgPC0gbWVhbigoYWJzKEQxX1QgLSBkMVssMV0pL0QxX1QpKjEwMCkNCk1BUEUyIDwtIG1lYW4oKGFicyhEMl9UIC0gZDFbLDJdKS9EMl9UKSoxMDApDQpNQVBFMyA8LSBtZWFuKChhYnMoRDNfVCAtIGQxWywzXSkvRDNfVCkqMTAwKQ0KTUFQRTQgPC0gbWVhbigoYWJzKEQ0X1QgLSBkMVssNF0pL0Q0X1QpKjEwMCkNCk1BUEU1IDwtIG1lYW4oKGFicyhENV9UIC0gZDFbLDVdKS9ENV9UKSoxMDApDQpNQVBFNiA8LSBtZWFuKChhYnMoRDZfVCAtIGQxWyw2XSkvRDZfVCkqMTAwKQ0KTUFQRTcgPC0gbWVhbigoYWJzKEQ3X1QgLSBkMVssN10pL0Q3X1QpKjEwMCkNCk1BUEUgPC0gYyhNQVBFMSwgTUFQRTIsIE1BUEUzLCBNQVBFNCwgTUFQRTUsIE1BUEU2LCBNQVBFNykNCg0KcGFzdGUwKCJNZW5vciBNQVBFOiBEIiwgd2hpY2gubWluKE1BUEUpLCAiLCBtaW4gPSAiLCByb3VuZChtaW4oTUFQRSksIDQpKQ0KcGFzdGUwKCJTZWd1bmRvIG1lbm9yIE1BUEU6IEQiLCB3aGljaC5taW4oTUFQRVstd2hpY2gubWluKE1BUEUpXSksICIsIG1pbiA9ICIsIHJvdW5kKG1pbihNQVBFWy13aGljaC5taW4oTUFQRSldKSwgNCkpDQpgYGANCg0KYGBge3IgY29sbGFwc2U9VFJVRX0NCiMgQ2FsY3VsYW5kbyBvIENWDQpjdjEgPC0gc2QoZDFbLDFdKS9tZWFuKGQxWywxXSkNCmN2MiA8LSBzZChkMVssMl0pL21lYW4oZDFbLDJdKQ0KY3YzIDwtIHNkKGQxWywzXSkvbWVhbihkMVssM10pDQpjdjQgPC0gc2QoZDFbLDRdKS9tZWFuKGQxWyw0XSkNCmN2NSA8LSBzZChkMVssNV0pL21lYW4oZDFbLDVdKQ0KY3Y2IDwtIHNkKGQxWyw2XSkvbWVhbihkMVssNl0pDQpjdjcgPC0gc2QoZDFbLDddKS9tZWFuKGQxWyw3XSkNCkNWIDwtIGMoY3YxLCBjdjIsIGN2MywgY3Y0LCBjdjUsIGN2NiwgY3Y3KQ0KDQpwYXN0ZTAoIk1lbm9yIENWOiBEIiwgd2hpY2gubWluKENWKSwgIiwgbWluID0gIiwgcm91bmQobWluKENWKSwgNCkpDQpwYXN0ZTAoIlNlZ3VuZG8gbWVub3IgQ1Y6IEQiLCB3aGljaC5taW4oQ1ZbLXdoaWNoLm1pbihDVildKSwgIiwgbWluID0gIiwgcm91bmQobWluKENWWy13aGljaC5taW4oQ1YpXSksIDQpKQ0KYGBgDQoNCiMjIENhc28gNiB7LnVubGlzdGVkIC51bm51bWJlcmVkfQ0KIyMjIENvbmZpZ3VyYcOnw6NvIGRvIHNleHRvIGNhc28gY29tICRuPTEwMDAkIHsudW5udW1iZXJlZCAudW5saXN0ZWR9DQpgYGB7cn0NCmVtcCA8LSBjKCIxIiwgIjIiLCAiMyIsICI0IiwgIjUiLCAiNiIpICMgZW1wcmVzYXMNCnAgPC0gYygwLjAxLCAwLjAxLCAwLjAyLCAwLjAyLCAwLjQ3LCAwLjQ3KSAjIHBhcnRpY2lwYWNvZXMgZGUgbWVyY2Fkbw0KayA8LSBsZW5ndGgoZW1wKSAjIG51bWVybyBkZSBlbXByZXNhcw0KDQoNCm4gPC0gMTAwMCAjIG51bWVybyBkZSBlbGVtZW50b3MgZGUgY2FkYSBhbW9zdHJhDQpOIDwtIDEwMDAgIyBudW1lcm8gZGUgYW1vc3RyYXMNCmBgYA0KDQojIyMjIEPDoWxjdWxvIGRvcyDDrW5kaWNlcyBkZSBkb21pbsOibmNpYSB0ZcOzcmljb3Mgey51bmxpc3RlZCAudW5udW1iZXJlZH0NCmBgYHtyfQ0KIyBJbmRpY2VzIGRlIGRvbWluYW5jaWEgdGVvcmljb3M6DQoNCkQxX1QgPC0gKGsqc3VtKHBeMikgLTEpLyhrLTEpICMgaW5kaWNlIGRlIEhlcmZpbmRhaGzigJNIaXJzY2htYW5uIG5vcm1hbGl6YWRvDQoNCnBfTyA8LSBzb3J0KHAsIGRlY3JlYXNpbmcgPSBUKQ0KcGVzb3MgPC0gc2VxX2Fsb25nKHBfTykNCklyb3MgPC0gMS8oMipzdW0ocGVzb3MqcF9PKS0xKQ0KRDJfVCA8LSAoaypJcm9zIC0gMSkvKGstMSkgIyBpbmRpY2UgZGUgUm9zZW5ibHV0aOKAk0hhbGzigJNUaWRlbWFubiBub3JtYWxpemFkbw0KDQpIcyA8LSAtc3VtKHAqbG9nKHApKQ0KRDNfVCA8LSAxIC0gSHMvbG9nKGspICMgaW5kaWNlIGRlIFNoYW5ub24gbm9ybWFsaXphZG8NCg0KSWhlaXAgPC0gKGV4cChIcykgLSAxKS8oayAtIDEpDQpENF9UIDwtIDEgLSBJaGVpcCAjIGluZGljZSBkZSBIZWlwDQoNCkloayA8LSBzdW0ocF4yKV4oLTEpDQpENV9UIDwtIChrIC0gSWhrKS8oay0xKSAjIGluZGljZSBkZSBIYW5uYWgtS2F5DQoNClZBIDwtIDEgLSAoIHN1bSgoIChuKnApIC0gKG4vaykgKV4yKSAvICgoIChuXjIpKihrLTEpICkvaykgKQ0KRDZfVCA8LSAxIC0gVkENCg0KU0RBIDwtIDEgLSBzcXJ0KCBzdW0oKCAobipwKSAtIChuL2spICleMikgLyAoKCAobl4yKSooay0xKSApL2spICkNCkQ3X1QgPC0gMSAtIFNEQQ0KDQpjYXQoRDFfVCwgRDJfVCwgRDNfVCwgRDRfVCwgRDVfVCwgRDZfVCwgRDdfVCkNCmBgYA0KDQojIyMjIFNpbXVsYcOnw6NvIHsudW5saXN0ZWQgLnVubnVtYmVyZWR9DQoNCmBgYHtyfQ0KIyBpbmljaWFuZG8gY29tIG4gPSAxMDAwDQoNCm0xIDwtIG1hdHJpeCgwLCBucm93IDwtIG4sIG5jb2wgPC0gTikgIyBtYXRpeiBxdWUgdmFpIHJlY2ViZXIgYXMgYW1vc3RyYXMNCmQxIDwtIG1hdHJpeCgwLCBucm93IDwtIE4sIG5jb2wgPC0gNykgIyBndWFyZGEgb3MgaW5kaWNlcyBkZSBkb21pbmFuY2lhDQoNCnNldC5zZWVkKDEyMykNCmZvciAoaSBpbiAxOk4pew0KICBhIDwtIHNhbXBsZShlbXAsIHNpemUgPSBuLCByZXBsYWNlID0gVCwgcHJvYiA9IHApICMgZ2VyYSB1bWEgYW1vc3RyYQ0KICBtMVssaV0gPC0gYSAjIGNhZGEgY29sdW5hIGRhIG1hdHJpeiB2YWkgc2VyIHVtYSBhbW9zdHJhDQogIA0KICBkMVtpLCAxXSA8LSBEMShhKSAjIGNhZGEgY29sdW5hIGRlIGQxIHJlY2ViZSB1bSBpbmRpY2UgZGUgZG9taW5hbmNpYQ0KICBkMVtpLCAyXSA8LSBEMihhKQ0KICBkMVtpLCAzXSA8LSBEMyhhKQ0KICBkMVtpLCA0XSA8LSBENChhKQ0KICBkMVtpLCA1XSA8LSBENShhKQ0KICBkMVtpLCA2XSA8LSBENihhKQ0KICBkMVtpLCA3XSA8LSBENyhhKQ0KfQ0KYGBgDQoNCiMjIyMgVGVzdGUgZGUgSmFycXVlLUJlcmEgcGFyYSBub3JtYWxpZGFkZSB7LnVubGlzdGVkIC51bm51bWJlcmVkfQ0KDQpgYGB7cn0NCiMgVGVzdGFuZG8gbm9ybWFsaWRhZGUNCg0KYWxwaGEgPC0gMC4wNSAjIG5pdmVsIGRlIHNpZ25pZmljYW5jaWENCg0KcmVzdWx0X3Rlc3RlIDwtIG1hdHJpeCgwLCBuY29sID0gNywgbnJvdyA9IDEpICMgdmFpIGd1YXJkYXIgbyByZXN1bHRhZG8gZG9zIHRlc3Rlcw0KY29sbmFtZXMocmVzdWx0X3Rlc3RlKSA8LSBjKCJEMSIsICJEMiIsICJEMyIsICJENCIsICJENSIsICJENiIsICJENyIpDQoNCnBhcihtZnJvdyA9IGMoMywgMyksIG1hciA9IGMoMywgMywgMiwgMSkpICAjIG1hcmdlbnMgYWp1c3RhZGFzDQpmb3IgKGkgaW4gMTo3KXsNCiAgaGlzdChkMVssaV0sIG1haW4gPSBwYXN0ZTAoIkhpc3RvZ3JhbWEgZGUgRCIsIGkpLCBjb2wgPSBpKzEsDQogICAgICAgeGxhYiA9IHBhc3RlMCgiRCIsIGkpLCB5bGFiID0gIkZyZXF1w6puY2lhIikNCiAgdGVzdGUgPC0gamFycXVlLmJlcmEudGVzdChkMVssaV0pICMgdGVzdGUgcGFyYSBub3JtYWxpZGFkZQ0KICByZXN1bHRfdGVzdGVbLGldIDwtICBpZmVsc2UodGVzdGUkcC52YWx1ZSA8IGFscGhhLCAicmVqIiwgIsOxIHJlaiIpDQp9DQpyZXN1bHRfdGVzdGUNCmBgYA0KDQojIyMjIEPDoWxjdWxvIGRvIE1BUEUgZSBkbyBDViAgey51bmxpc3RlZCAudW5udW1iZXJlZH0NCmBgYHtyIGNvbGxhcHNlPVRSVUV9DQojIENhbGN1bGFuZG8gbyBNQVBFIChFcnJvIFBlcmNlbnR1YWwgQWJzb2x1dG8gTcOpZGlvKQ0KTUFQRTEgPC0gbWVhbigoYWJzKEQxX1QgLSBkMVssMV0pL0QxX1QpKjEwMCkNCk1BUEUyIDwtIG1lYW4oKGFicyhEMl9UIC0gZDFbLDJdKS9EMl9UKSoxMDApDQpNQVBFMyA8LSBtZWFuKChhYnMoRDNfVCAtIGQxWywzXSkvRDNfVCkqMTAwKQ0KTUFQRTQgPC0gbWVhbigoYWJzKEQ0X1QgLSBkMVssNF0pL0Q0X1QpKjEwMCkNCk1BUEU1IDwtIG1lYW4oKGFicyhENV9UIC0gZDFbLDVdKS9ENV9UKSoxMDApDQpNQVBFNiA8LSBtZWFuKChhYnMoRDZfVCAtIGQxWyw2XSkvRDZfVCkqMTAwKQ0KTUFQRTcgPC0gbWVhbigoYWJzKEQ3X1QgLSBkMVssN10pL0Q3X1QpKjEwMCkNCk1BUEUgPC0gYyhNQVBFMSwgTUFQRTIsIE1BUEUzLCBNQVBFNCwgTUFQRTUsIE1BUEU2LCBNQVBFNykNCg0KcGFzdGUwKCJNZW5vciBNQVBFOiBEIiwgd2hpY2gubWluKE1BUEUpLCAiLCBtaW4gPSAiLCByb3VuZChtaW4oTUFQRSksIDQpKQ0KcGFzdGUwKCJTZWd1bmRvIG1lbm9yIE1BUEU6IEQiLCB3aGljaC5taW4oTUFQRVstd2hpY2gubWluKE1BUEUpXSksICIsIG1pbiA9ICIsIHJvdW5kKG1pbihNQVBFWy13aGljaC5taW4oTUFQRSldKSwgNCkpDQpgYGANCg0KYGBge3IgY29sbGFwc2U9VFJVRX0NCiMgQ2FsY3VsYW5kbyBvIENWDQpjdjEgPC0gc2QoZDFbLDFdKS9tZWFuKGQxWywxXSkNCmN2MiA8LSBzZChkMVssMl0pL21lYW4oZDFbLDJdKQ0KY3YzIDwtIHNkKGQxWywzXSkvbWVhbihkMVssM10pDQpjdjQgPC0gc2QoZDFbLDRdKS9tZWFuKGQxWyw0XSkNCmN2NSA8LSBzZChkMVssNV0pL21lYW4oZDFbLDVdKQ0KY3Y2IDwtIHNkKGQxWyw2XSkvbWVhbihkMVssNl0pDQpjdjcgPC0gc2QoZDFbLDddKS9tZWFuKGQxWyw3XSkNCkNWIDwtIGMoY3YxLCBjdjIsIGN2MywgY3Y0LCBjdjUsIGN2NiwgY3Y3KQ0KDQpwYXN0ZTAoIk1lbm9yIENWOiBEIiwgd2hpY2gubWluKENWKSwgIiwgbWluID0gIiwgcm91bmQobWluKENWKSwgNCkpDQpwYXN0ZTAoIlNlZ3VuZG8gbWVub3IgQ1Y6IEQiLCB3aGljaC5taW4oQ1ZbLXdoaWNoLm1pbihDVildKSwgIiwgbWluID0gIiwgcm91bmQobWluKENWWy13aGljaC5taW4oQ1YpXSksIDQpKQ0KYGBgDQoNCiMjIyBDb25maWd1cmHDp8OjbyBkbyBzZXh0byBjYXNvIGNvbSAkbj0zMDAwJCB7LnVubnVtYmVyZWQgLnVubGlzdGVkfQ0KYGBge3J9DQplbXAgPC0gYygiMSIsICIyIiwgIjMiLCAiNCIsICI1IiwgIjYiKSAjIGVtcHJlc2FzDQpwIDwtIGMoMC4wMSwgMC4wMSwgMC4wMiwgMC4wMiwgMC40NywgMC40NykgIyBwYXJ0aWNpcGFjb2VzIGRlIG1lcmNhZG8NCmsgPC0gbGVuZ3RoKGVtcCkgIyBudW1lcm8gZGUgZW1wcmVzYXMNCg0KDQpuIDwtIDMwMDAgIyBudW1lcm8gZGUgZWxlbWVudG9zIGRlIGNhZGEgYW1vc3RyYQ0KTiA8LSAxMDAwICMgbnVtZXJvIGRlIGFtb3N0cmFzDQpgYGANCg0KIyMjIyBDw6FsY3VsbyBkb3Mgw61uZGljZXMgZGUgZG9taW7Dom5jaWEgdGXDs3JpY29zIHsudW5saXN0ZWQgLnVubnVtYmVyZWR9DQpgYGB7cn0NCiMgSW5kaWNlcyBkZSBkb21pbmFuY2lhIHRlb3JpY29zOg0KDQpEMV9UIDwtIChrKnN1bShwXjIpIC0xKS8oay0xKSAjIGluZGljZSBkZSBIZXJmaW5kYWhs4oCTSGlyc2NobWFubiBub3JtYWxpemFkbw0KDQpwX08gPC0gc29ydChwLCBkZWNyZWFzaW5nID0gVCkNCnBlc29zIDwtIHNlcV9hbG9uZyhwX08pDQpJcm9zIDwtIDEvKDIqc3VtKHBlc29zKnBfTyktMSkNCkQyX1QgPC0gKGsqSXJvcyAtIDEpLyhrLTEpICMgaW5kaWNlIGRlIFJvc2VuYmx1dGjigJNIYWxs4oCTVGlkZW1hbm4gbm9ybWFsaXphZG8NCg0KSHMgPC0gLXN1bShwKmxvZyhwKSkNCkQzX1QgPC0gMSAtIEhzL2xvZyhrKSAjIGluZGljZSBkZSBTaGFubm9uIG5vcm1hbGl6YWRvDQoNCkloZWlwIDwtIChleHAoSHMpIC0gMSkvKGsgLSAxKQ0KRDRfVCA8LSAxIC0gSWhlaXAgIyBpbmRpY2UgZGUgSGVpcA0KDQpJaGsgPC0gc3VtKHBeMileKC0xKQ0KRDVfVCA8LSAoayAtIEloaykvKGstMSkgIyBpbmRpY2UgZGUgSGFubmFoLUtheQ0KDQpWQSA8LSAxIC0gKCBzdW0oKCAobipwKSAtIChuL2spICleMikgLyAoKCAobl4yKSooay0xKSApL2spICkNCkQ2X1QgPC0gMSAtIFZBDQoNClNEQSA8LSAxIC0gc3FydCggc3VtKCggKG4qcCkgLSAobi9rKSApXjIpIC8gKCggKG5eMikqKGstMSkgKS9rKSApDQpEN19UIDwtIDEgLSBTREENCg0KY2F0KEQxX1QsIEQyX1QsIEQzX1QsIEQ0X1QsIEQ1X1QsIEQ2X1QsIEQ3X1QpDQpgYGANCg0KIyMjIyBTaW11bGHDp8OjbyB7LnVubGlzdGVkIC51bm51bWJlcmVkfQ0KDQpgYGB7cn0NCm0xIDwtIG1hdHJpeCgwLCBucm93IDwtIG4sIG5jb2wgPC0gTikgIyBtYXRpeiBxdWUgdmFpIHJlY2ViZXIgYXMgYW1vc3RyYXMNCmQxIDwtIG1hdHJpeCgwLCBucm93IDwtIE4sIG5jb2wgPC0gNykgIyBndWFyZGEgb3MgaW5kaWNlcyBkZSBkb21pbmFuY2lhDQoNCnNldC5zZWVkKDEyMykNCmZvciAoaSBpbiAxOk4pew0KICBhIDwtIHNhbXBsZShlbXAsIHNpemUgPSBuLCByZXBsYWNlID0gVCwgcHJvYiA9IHApICMgZ2VyYSB1bWEgYW1vc3RyYQ0KICBtMVssaV0gPC0gYSAjIGNhZGEgY29sdW5hIGRhIG1hdHJpeiB2YWkgc2VyIHVtYSBhbW9zdHJhDQogIA0KICBkMVtpLCAxXSA8LSBEMShhKSAjIGNhZGEgY29sdW5hIGRlIGQxIHJlY2ViZSB1bSBpbmRpY2UgZGUgZG9taW5hbmNpYQ0KICBkMVtpLCAyXSA8LSBEMihhKQ0KICBkMVtpLCAzXSA8LSBEMyhhKQ0KICBkMVtpLCA0XSA8LSBENChhKQ0KICBkMVtpLCA1XSA8LSBENShhKQ0KICBkMVtpLCA2XSA8LSBENihhKQ0KICBkMVtpLCA3XSA8LSBENyhhKQ0KfQ0KYGBgDQoNCiMjIyMgVGVzdGUgZGUgSmFycXVlLUJlcmEgcGFyYSBub3JtYWxpZGFkZSB7LnVubGlzdGVkIC51bm51bWJlcmVkfQ0KDQpUZXN0ZSBkZSBub3JtYWxpZGFkZSBwYXJhIGNhZGEgY29uanVudG8gZG9zIMOtbmRpY2VzIGNhbGN1bGFkb3M6DQpgYGB7cn0NCiMgVGVzdGFuZG8gbm9ybWFsaWRhZGUNCg0KYWxwaGEgPC0gMC4wNSAjIG5pdmVsIGRlIHNpZ25pZmljYW5jaWENCg0KcmVzdWx0X3Rlc3RlIDwtIG1hdHJpeCgwLCBuY29sID0gNywgbnJvdyA9IDEpICMgdmFpIGd1YXJkYXIgbyByZXN1bHRhZG8gZG9zIHRlc3Rlcw0KY29sbmFtZXMocmVzdWx0X3Rlc3RlKSA8LSBjKCJEMSIsICJEMiIsICJEMyIsICJENCIsICJENSIsICJENiIsICJENyIpDQoNCnBhcihtZnJvdyA9IGMoMywgMyksIG1hciA9IGMoMywgMywgMiwgMSkpICAjIG1hcmdlbnMgYWp1c3RhZGFzDQpmb3IgKGkgaW4gMTo3KXsNCiAgaGlzdChkMVssaV0sIG1haW4gPSBwYXN0ZTAoIkhpc3RvZ3JhbWEgZGUgRCIsIGkpLCBjb2wgPSBpKzEsDQogICAgICAgeGxhYiA9IHBhc3RlMCgiRCIsIGkpLCB5bGFiID0gIkZyZXF1w6puY2lhIikNCiAgdGVzdGUgPC0gamFycXVlLmJlcmEudGVzdChkMVssaV0pICMgdGVzdGUgcGFyYSBub3JtYWxpZGFkZQ0KICByZXN1bHRfdGVzdGVbLGldIDwtICBpZmVsc2UodGVzdGUkcC52YWx1ZSA8IGFscGhhLCAicmVqIiwgIsOxIHJlaiIpDQp9DQpyZXN1bHRfdGVzdGUNCmBgYA0KDQojIyMjIEPDoWxjdWxvIGRvIE1BUEUgZSBkbyBDViAgey51bmxpc3RlZCAudW5udW1iZXJlZH0NCmBgYHtyIGNvbGxhcHNlPVRSVUV9DQojIENhbGN1bGFuZG8gbyBNQVBFIChFcnJvIFBlcmNlbnR1YWwgQWJzb2x1dG8gTcOpZGlvKQ0KTUFQRTEgPC0gbWVhbigoYWJzKEQxX1QgLSBkMVssMV0pL0QxX1QpKjEwMCkNCk1BUEUyIDwtIG1lYW4oKGFicyhEMl9UIC0gZDFbLDJdKS9EMl9UKSoxMDApDQpNQVBFMyA8LSBtZWFuKChhYnMoRDNfVCAtIGQxWywzXSkvRDNfVCkqMTAwKQ0KTUFQRTQgPC0gbWVhbigoYWJzKEQ0X1QgLSBkMVssNF0pL0Q0X1QpKjEwMCkNCk1BUEU1IDwtIG1lYW4oKGFicyhENV9UIC0gZDFbLDVdKS9ENV9UKSoxMDApDQpNQVBFNiA8LSBtZWFuKChhYnMoRDZfVCAtIGQxWyw2XSkvRDZfVCkqMTAwKQ0KTUFQRTcgPC0gbWVhbigoYWJzKEQ3X1QgLSBkMVssN10pL0Q3X1QpKjEwMCkNCk1BUEUgPC0gYyhNQVBFMSwgTUFQRTIsIE1BUEUzLCBNQVBFNCwgTUFQRTUsIE1BUEU2LCBNQVBFNykNCg0KcGFzdGUwKCJNZW5vciBNQVBFOiBEIiwgd2hpY2gubWluKE1BUEUpLCAiLCBtaW4gPSAiLCByb3VuZChtaW4oTUFQRSksIDQpKQ0KcGFzdGUwKCJTZWd1bmRvIG1lbm9yIE1BUEU6IEQiLCB3aGljaC5taW4oTUFQRVstd2hpY2gubWluKE1BUEUpXSksICIsIG1pbiA9ICIsIHJvdW5kKG1pbihNQVBFWy13aGljaC5taW4oTUFQRSldKSwgNCkpDQpgYGANCg0KYGBge3IgY29sbGFwc2U9VFJVRX0NCiMgQ2FsY3VsYW5kbyBvIENWDQpjdjEgPC0gc2QoZDFbLDFdKS9tZWFuKGQxWywxXSkNCmN2MiA8LSBzZChkMVssMl0pL21lYW4oZDFbLDJdKQ0KY3YzIDwtIHNkKGQxWywzXSkvbWVhbihkMVssM10pDQpjdjQgPC0gc2QoZDFbLDRdKS9tZWFuKGQxWyw0XSkNCmN2NSA8LSBzZChkMVssNV0pL21lYW4oZDFbLDVdKQ0KY3Y2IDwtIHNkKGQxWyw2XSkvbWVhbihkMVssNl0pDQpjdjcgPC0gc2QoZDFbLDddKS9tZWFuKGQxWyw3XSkNCkNWIDwtIGMoY3YxLCBjdjIsIGN2MywgY3Y0LCBjdjUsIGN2NiwgY3Y3KQ0KDQpwYXN0ZTAoIk1lbm9yIENWOiBEIiwgd2hpY2gubWluKENWKSwgIiwgbWluID0gIiwgcm91bmQobWluKENWKSwgNCkpDQpwYXN0ZTAoIlNlZ3VuZG8gbWVub3IgQ1Y6IEQiLCB3aGljaC5taW4oQ1ZbLXdoaWNoLm1pbihDVildKSwgIiwgbWluID0gIiwgcm91bmQobWluKENWWy13aGljaC5taW4oQ1YpXSksIDQpKQ0KYGBgDQoNCiMjIENhc28gNyB7LnVubGlzdGVkIC51bm51bWJlcmVkfQ0KIyMjIENvbmZpZ3VyYcOnw6NvIGRvIHPDqXRpbW8gY2FzbyBjb20gJG49MTAwMCQgey51bm51bWJlcmVkIC51bmxpc3RlZH0NCmBgYHtyfQ0KZW1wIDwtIGMoIjEiLCAiMiIsICIzIiwgIjQiLCAiNSIsICI2IiwgIjciLCAiOCIsICI5IiwgIjEwIikgIyBlbXByZXNhcw0KcCA8LSBjKDAuMDksIDAuMTEsIDAuMDksIDAuMTEsIDAuMDksIDAuMTEsIDAuMDksIDAuMTEsIDAuMDksIDAuMTEpICMgcGFydGljaXBhY29lcyBkZSBtZXJjYWRvDQprIDwtIGxlbmd0aChlbXApICMgbnVtZXJvIGRlIGVtcHJlc2FzDQoNCg0KbiA8LSAxMDAwICMgbnVtZXJvIGRlIGVsZW1lbnRvcyBkZSBjYWRhIGFtb3N0cmENCk4gPC0gMTAwMCAjIG51bWVybyBkZSBhbW9zdHJhcw0KYGBgDQoNCiMjIyMgQ8OhbGN1bG8gZG9zIMOtbmRpY2VzIGRlIGRvbWluw6JuY2lhIHRlw7NyaWNvcyB7LnVubGlzdGVkIC51bm51bWJlcmVkfQ0KYGBge3J9DQojIEluZGljZXMgZGUgZG9taW5hbmNpYSB0ZW9yaWNvczoNCg0KRDFfVCA8LSAoaypzdW0ocF4yKSAtMSkvKGstMSkgIyBpbmRpY2UgZGUgSGVyZmluZGFobOKAk0hpcnNjaG1hbm4gbm9ybWFsaXphZG8NCg0KcF9PIDwtIHNvcnQocCwgZGVjcmVhc2luZyA9IFQpDQpwZXNvcyA8LSBzZXFfYWxvbmcocF9PKQ0KSXJvcyA8LSAxLygyKnN1bShwZXNvcypwX08pLTEpDQpEMl9UIDwtIChrKklyb3MgLSAxKS8oay0xKSAjIGluZGljZSBkZSBSb3NlbmJsdXRo4oCTSGFsbOKAk1RpZGVtYW5uIG5vcm1hbGl6YWRvDQoNCkhzIDwtIC1zdW0ocCpsb2cocCkpDQpEM19UIDwtIDEgLSBIcy9sb2coaykgIyBpbmRpY2UgZGUgU2hhbm5vbiBub3JtYWxpemFkbw0KDQpJaGVpcCA8LSAoZXhwKEhzKSAtIDEpLyhrIC0gMSkNCkQ0X1QgPC0gMSAtIEloZWlwICMgaW5kaWNlIGRlIEhlaXANCg0KSWhrIDwtIHN1bShwXjIpXigtMSkNCkQ1X1QgPC0gKGsgLSBJaGspLyhrLTEpICMgaW5kaWNlIGRlIEhhbm5haC1LYXkNCg0KVkEgPC0gMSAtICggc3VtKCggKG4qcCkgLSAobi9rKSApXjIpIC8gKCggKG5eMikqKGstMSkgKS9rKSApDQpENl9UIDwtIDEgLSBWQQ0KDQpTREEgPC0gMSAtIHNxcnQoIHN1bSgoIChuKnApIC0gKG4vaykgKV4yKSAvICgoIChuXjIpKihrLTEpICkvaykgKQ0KRDdfVCA8LSAxIC0gU0RBDQoNCmNhdChEMV9ULCBEMl9ULCBEM19ULCBENF9ULCBENV9ULCBENl9ULCBEN19UKQ0KYGBgDQoNCiMjIyMgU2ltdWxhw6fDo28gey51bmxpc3RlZCAudW5udW1iZXJlZH0NCg0KYGBge3J9DQojIGluaWNpYW5kbyBjb20gbiA9IDEwMDANCg0KbTEgPC0gbWF0cml4KDAsIG5yb3cgPC0gbiwgbmNvbCA8LSBOKSAjIG1hdGl6IHF1ZSB2YWkgcmVjZWJlciBhcyBhbW9zdHJhcw0KZDEgPC0gbWF0cml4KDAsIG5yb3cgPC0gTiwgbmNvbCA8LSA3KSAjIGd1YXJkYSBvcyBpbmRpY2VzIGRlIGRvbWluYW5jaWENCg0Kc2V0LnNlZWQoMTIzKQ0KZm9yIChpIGluIDE6Til7DQogIGEgPC0gc2FtcGxlKGVtcCwgc2l6ZSA9IG4sIHJlcGxhY2UgPSBULCBwcm9iID0gcCkgIyBnZXJhIHVtYSBhbW9zdHJhDQogIG0xWyxpXSA8LSBhICMgY2FkYSBjb2x1bmEgZGEgbWF0cml6IHZhaSBzZXIgdW1hIGFtb3N0cmENCiAgDQogIGQxW2ksIDFdIDwtIEQxKGEpICMgY2FkYSBjb2x1bmEgZGUgZDEgcmVjZWJlIHVtIGluZGljZSBkZSBkb21pbmFuY2lhDQogIGQxW2ksIDJdIDwtIEQyKGEpDQogIGQxW2ksIDNdIDwtIEQzKGEpDQogIGQxW2ksIDRdIDwtIEQ0KGEpDQogIGQxW2ksIDVdIDwtIEQ1KGEpDQogIGQxW2ksIDZdIDwtIEQ2KGEpDQogIGQxW2ksIDddIDwtIEQ3KGEpDQp9DQpgYGANCg0KIyMjIyBUZXN0ZSBkZSBKYXJxdWUtQmVyYSBwYXJhIG5vcm1hbGlkYWRlIHsudW5saXN0ZWQgLnVubnVtYmVyZWR9DQoNCmBgYHtyfQ0KIyBUZXN0YW5kbyBub3JtYWxpZGFkZQ0KDQphbHBoYSA8LSAwLjA1ICMgbml2ZWwgZGUgc2lnbmlmaWNhbmNpYQ0KDQpyZXN1bHRfdGVzdGUgPC0gbWF0cml4KDAsIG5jb2wgPSA3LCBucm93ID0gMSkgIyB2YWkgZ3VhcmRhciBvIHJlc3VsdGFkbyBkb3MgdGVzdGVzDQpjb2xuYW1lcyhyZXN1bHRfdGVzdGUpIDwtIGMoIkQxIiwgIkQyIiwgIkQzIiwgIkQ0IiwgIkQ1IiwgIkQ2IiwgIkQ3IikNCg0KcGFyKG1mcm93ID0gYygzLCAzKSwgbWFyID0gYygzLCAzLCAyLCAxKSkgICMgbWFyZ2VucyBhanVzdGFkYXMNCmZvciAoaSBpbiAxOjcpew0KICBoaXN0KGQxWyxpXSwgbWFpbiA9IHBhc3RlMCgiSGlzdG9ncmFtYSBkZSBEIiwgaSksIGNvbCA9IGkrMSwNCiAgICAgICB4bGFiID0gcGFzdGUwKCJEIiwgaSksIHlsYWIgPSAiRnJlcXXDqm5jaWEiKQ0KICB0ZXN0ZSA8LSBqYXJxdWUuYmVyYS50ZXN0KGQxWyxpXSkgIyB0ZXN0ZSBwYXJhIG5vcm1hbGlkYWRlDQogIHJlc3VsdF90ZXN0ZVssaV0gPC0gIGlmZWxzZSh0ZXN0ZSRwLnZhbHVlIDwgYWxwaGEsICJyZWoiLCAiw7EgcmVqIikNCn0NCnJlc3VsdF90ZXN0ZQ0KYGBgDQoNCiMjIyMgQ8OhbGN1bG8gZG8gTUFQRSBlIGRvIENWICB7LnVubGlzdGVkIC51bm51bWJlcmVkfQ0KYGBge3IgY29sbGFwc2U9VFJVRX0NCiMgQ2FsY3VsYW5kbyBvIE1BUEUgKEVycm8gUGVyY2VudHVhbCBBYnNvbHV0byBNw6lkaW8pDQpNQVBFMSA8LSBtZWFuKChhYnMoRDFfVCAtIGQxWywxXSkvRDFfVCkqMTAwKQ0KTUFQRTIgPC0gbWVhbigoYWJzKEQyX1QgLSBkMVssMl0pL0QyX1QpKjEwMCkNCk1BUEUzIDwtIG1lYW4oKGFicyhEM19UIC0gZDFbLDNdKS9EM19UKSoxMDApDQpNQVBFNCA8LSBtZWFuKChhYnMoRDRfVCAtIGQxWyw0XSkvRDRfVCkqMTAwKQ0KTUFQRTUgPC0gbWVhbigoYWJzKEQ1X1QgLSBkMVssNV0pL0Q1X1QpKjEwMCkNCk1BUEU2IDwtIG1lYW4oKGFicyhENl9UIC0gZDFbLDZdKS9ENl9UKSoxMDApDQpNQVBFNyA8LSBtZWFuKChhYnMoRDdfVCAtIGQxWyw3XSkvRDdfVCkqMTAwKQ0KTUFQRSA8LSBjKE1BUEUxLCBNQVBFMiwgTUFQRTMsIE1BUEU0LCBNQVBFNSwgTUFQRTYsIE1BUEU3KQ0KDQpwYXN0ZTAoIk1lbm9yIE1BUEU6IEQiLCB3aGljaC5taW4oTUFQRSksICIsIG1pbiA9ICIsIHJvdW5kKG1pbihNQVBFKSwgNCkpDQpwYXN0ZTAoIlNlZ3VuZG8gbWVub3IgTUFQRTogRCIsIHdoaWNoLm1pbihNQVBFWy13aGljaC5taW4oTUFQRSldKSwgIiwgbWluID0gIiwgcm91bmQobWluKE1BUEVbLXdoaWNoLm1pbihNQVBFKV0pLCA0KSkNCmBgYA0KDQpgYGB7ciBjb2xsYXBzZT1UUlVFfQ0KIyBDYWxjdWxhbmRvIG8gQ1YNCmN2MSA8LSBzZChkMVssMV0pL21lYW4oZDFbLDFdKQ0KY3YyIDwtIHNkKGQxWywyXSkvbWVhbihkMVssMl0pDQpjdjMgPC0gc2QoZDFbLDNdKS9tZWFuKGQxWywzXSkNCmN2NCA8LSBzZChkMVssNF0pL21lYW4oZDFbLDRdKQ0KY3Y1IDwtIHNkKGQxWyw1XSkvbWVhbihkMVssNV0pDQpjdjYgPC0gc2QoZDFbLDZdKS9tZWFuKGQxWyw2XSkNCmN2NyA8LSBzZChkMVssN10pL21lYW4oZDFbLDddKQ0KQ1YgPC0gYyhjdjEsIGN2MiwgY3YzLCBjdjQsIGN2NSwgY3Y2LCBjdjcpDQoNCnBhc3RlMCgiTWVub3IgQ1Y6IEQiLCB3aGljaC5taW4oQ1YpLCAiLCBtaW4gPSAiLCByb3VuZChtaW4oQ1YpLCA0KSkNCnBhc3RlMCgiU2VndW5kbyBtZW5vciBDVjogRCIsIHdoaWNoLm1pbihDVlstd2hpY2gubWluKENWKV0pLCAiLCBtaW4gPSAiLCByb3VuZChtaW4oQ1ZbLXdoaWNoLm1pbihDVildKSwgNCkpDQpgYGANCg0KIyMjIENvbmZpZ3VyYcOnw6NvIGRvIHPDqXRpbW8gY2FzbyBjb20gJG49MzAwMCQgey51bm51bWJlcmVkIC51bmxpc3RlZH0NCmBgYHtyfQ0KZW1wIDwtIGMoIjEiLCAiMiIsICIzIiwgIjQiLCAiNSIsICI2IiwgIjciLCAiOCIsICI5IiwgIjEwIikgIyBlbXByZXNhcw0KcCA8LSBjKDAuMDksIDAuMTEsIDAuMDksIDAuMTEsIDAuMDksIDAuMTEsIDAuMDksIDAuMTEsIDAuMDksIDAuMTEpICMgcGFydGljaXBhY29lcyBkZSBtZXJjYWRvDQprIDwtIGxlbmd0aChlbXApICMgbnVtZXJvIGRlIGVtcHJlc2FzDQoNCg0KbiA8LSAzMDAwICMgbnVtZXJvIGRlIGVsZW1lbnRvcyBkZSBjYWRhIGFtb3N0cmENCk4gPC0gMTAwMCAjIG51bWVybyBkZSBhbW9zdHJhcw0KYGBgDQoNCiMjIyMgQ8OhbGN1bG8gZG9zIMOtbmRpY2VzIGRlIGRvbWluw6JuY2lhIHRlw7NyaWNvcyB7LnVubGlzdGVkIC51bm51bWJlcmVkfQ0KYGBge3J9DQojIEluZGljZXMgZGUgZG9taW5hbmNpYSB0ZW9yaWNvczoNCg0KRDFfVCA8LSAoaypzdW0ocF4yKSAtMSkvKGstMSkgIyBpbmRpY2UgZGUgSGVyZmluZGFobOKAk0hpcnNjaG1hbm4gbm9ybWFsaXphZG8NCg0KcF9PIDwtIHNvcnQocCwgZGVjcmVhc2luZyA9IFQpDQpwZXNvcyA8LSBzZXFfYWxvbmcocF9PKQ0KSXJvcyA8LSAxLygyKnN1bShwZXNvcypwX08pLTEpDQpEMl9UIDwtIChrKklyb3MgLSAxKS8oay0xKSAjIGluZGljZSBkZSBSb3NlbmJsdXRo4oCTSGFsbOKAk1RpZGVtYW5uIG5vcm1hbGl6YWRvDQoNCkhzIDwtIC1zdW0ocCpsb2cocCkpDQpEM19UIDwtIDEgLSBIcy9sb2coaykgIyBpbmRpY2UgZGUgU2hhbm5vbiBub3JtYWxpemFkbw0KDQpJaGVpcCA8LSAoZXhwKEhzKSAtIDEpLyhrIC0gMSkNCkQ0X1QgPC0gMSAtIEloZWlwICMgaW5kaWNlIGRlIEhlaXANCg0KSWhrIDwtIHN1bShwXjIpXigtMSkNCkQ1X1QgPC0gKGsgLSBJaGspLyhrLTEpICMgaW5kaWNlIGRlIEhhbm5haC1LYXkNCg0KVkEgPC0gMSAtICggc3VtKCggKG4qcCkgLSAobi9rKSApXjIpIC8gKCggKG5eMikqKGstMSkgKS9rKSApDQpENl9UIDwtIDEgLSBWQQ0KDQpTREEgPC0gMSAtIHNxcnQoIHN1bSgoIChuKnApIC0gKG4vaykgKV4yKSAvICgoIChuXjIpKihrLTEpICkvaykgKQ0KRDdfVCA8LSAxIC0gU0RBDQoNCmNhdChEMV9ULCBEMl9ULCBEM19ULCBENF9ULCBENV9ULCBENl9ULCBEN19UKQ0KYGBgDQoNCiMjIyMgU2ltdWxhw6fDo28gey51bmxpc3RlZCAudW5udW1iZXJlZH0NCg0KYGBge3J9DQptMSA8LSBtYXRyaXgoMCwgbnJvdyA8LSBuLCBuY29sIDwtIE4pICMgbWF0aXogcXVlIHZhaSByZWNlYmVyIGFzIGFtb3N0cmFzDQpkMSA8LSBtYXRyaXgoMCwgbnJvdyA8LSBOLCBuY29sIDwtIDcpICMgZ3VhcmRhIG9zIGluZGljZXMgZGUgZG9taW5hbmNpYQ0KDQpzZXQuc2VlZCgxMjMpDQpmb3IgKGkgaW4gMTpOKXsNCiAgYSA8LSBzYW1wbGUoZW1wLCBzaXplID0gbiwgcmVwbGFjZSA9IFQsIHByb2IgPSBwKSAjIGdlcmEgdW1hIGFtb3N0cmENCiAgbTFbLGldIDwtIGEgIyBjYWRhIGNvbHVuYSBkYSBtYXRyaXogdmFpIHNlciB1bWEgYW1vc3RyYQ0KICANCiAgZDFbaSwgMV0gPC0gRDEoYSkgIyBjYWRhIGNvbHVuYSBkZSBkMSByZWNlYmUgdW0gaW5kaWNlIGRlIGRvbWluYW5jaWENCiAgZDFbaSwgMl0gPC0gRDIoYSkNCiAgZDFbaSwgM10gPC0gRDMoYSkNCiAgZDFbaSwgNF0gPC0gRDQoYSkNCiAgZDFbaSwgNV0gPC0gRDUoYSkNCiAgZDFbaSwgNl0gPC0gRDYoYSkNCiAgZDFbaSwgN10gPC0gRDcoYSkNCn0NCmBgYA0KDQojIyMjIFRlc3RlIGRlIEphcnF1ZS1CZXJhIHBhcmEgbm9ybWFsaWRhZGUgey51bmxpc3RlZCAudW5udW1iZXJlZH0NCg0KVGVzdGUgZGUgbm9ybWFsaWRhZGUgcGFyYSBjYWRhIGNvbmp1bnRvIGRvcyDDrW5kaWNlcyBjYWxjdWxhZG9zOg0KYGBge3J9DQojIFRlc3RhbmRvIG5vcm1hbGlkYWRlDQoNCmFscGhhIDwtIDAuMDUgIyBuaXZlbCBkZSBzaWduaWZpY2FuY2lhDQoNCnJlc3VsdF90ZXN0ZSA8LSBtYXRyaXgoMCwgbmNvbCA9IDcsIG5yb3cgPSAxKSAjIHZhaSBndWFyZGFyIG8gcmVzdWx0YWRvIGRvcyB0ZXN0ZXMNCmNvbG5hbWVzKHJlc3VsdF90ZXN0ZSkgPC0gYygiRDEiLCAiRDIiLCAiRDMiLCAiRDQiLCAiRDUiLCAiRDYiLCAiRDciKQ0KDQpwYXIobWZyb3cgPSBjKDMsIDMpLCBtYXIgPSBjKDMsIDMsIDIsIDEpKSAgIyBtYXJnZW5zIGFqdXN0YWRhcw0KZm9yIChpIGluIDE6Nyl7DQogIGhpc3QoZDFbLGldLCBtYWluID0gcGFzdGUwKCJIaXN0b2dyYW1hIGRlIEQiLCBpKSwgY29sID0gaSsxLA0KICAgICAgIHhsYWIgPSBwYXN0ZTAoIkQiLCBpKSwgeWxhYiA9ICJGcmVxdcOqbmNpYSIpDQogIHRlc3RlIDwtIGphcnF1ZS5iZXJhLnRlc3QoZDFbLGldKSAjIHRlc3RlIHBhcmEgbm9ybWFsaWRhZGUNCiAgcmVzdWx0X3Rlc3RlWyxpXSA8LSAgaWZlbHNlKHRlc3RlJHAudmFsdWUgPCBhbHBoYSwgInJlaiIsICLDsSByZWoiKQ0KfQ0KcmVzdWx0X3Rlc3RlDQpgYGANCg0KIyMjIyBDw6FsY3VsbyBkbyBNQVBFIGUgZG8gQ1YgIHsudW5saXN0ZWQgLnVubnVtYmVyZWR9DQpgYGB7ciBjb2xsYXBzZT1UUlVFfQ0KIyBDYWxjdWxhbmRvIG8gTUFQRSAoRXJybyBQZXJjZW50dWFsIEFic29sdXRvIE3DqWRpbykNCk1BUEUxIDwtIG1lYW4oKGFicyhEMV9UIC0gZDFbLDFdKS9EMV9UKSoxMDApDQpNQVBFMiA8LSBtZWFuKChhYnMoRDJfVCAtIGQxWywyXSkvRDJfVCkqMTAwKQ0KTUFQRTMgPC0gbWVhbigoYWJzKEQzX1QgLSBkMVssM10pL0QzX1QpKjEwMCkNCk1BUEU0IDwtIG1lYW4oKGFicyhENF9UIC0gZDFbLDRdKS9ENF9UKSoxMDApDQpNQVBFNSA8LSBtZWFuKChhYnMoRDVfVCAtIGQxWyw1XSkvRDVfVCkqMTAwKQ0KTUFQRTYgPC0gbWVhbigoYWJzKEQ2X1QgLSBkMVssNl0pL0Q2X1QpKjEwMCkNCk1BUEU3IDwtIG1lYW4oKGFicyhEN19UIC0gZDFbLDddKS9EN19UKSoxMDApDQpNQVBFIDwtIGMoTUFQRTEsIE1BUEUyLCBNQVBFMywgTUFQRTQsIE1BUEU1LCBNQVBFNiwgTUFQRTcpDQoNCnBhc3RlMCgiTWVub3IgTUFQRTogRCIsIHdoaWNoLm1pbihNQVBFKSwgIiwgbWluID0gIiwgcm91bmQobWluKE1BUEUpLCA0KSkNCnBhc3RlMCgiU2VndW5kbyBtZW5vciBNQVBFOiBEIiwgd2hpY2gubWluKE1BUEVbLXdoaWNoLm1pbihNQVBFKV0pLCAiLCBtaW4gPSAiLCByb3VuZChtaW4oTUFQRVstd2hpY2gubWluKE1BUEUpXSksIDQpKQ0KYGBgDQoNCmBgYHtyIGNvbGxhcHNlPVRSVUV9DQojIENhbGN1bGFuZG8gbyBDVg0KY3YxIDwtIHNkKGQxWywxXSkvbWVhbihkMVssMV0pDQpjdjIgPC0gc2QoZDFbLDJdKS9tZWFuKGQxWywyXSkNCmN2MyA8LSBzZChkMVssM10pL21lYW4oZDFbLDNdKQ0KY3Y0IDwtIHNkKGQxWyw0XSkvbWVhbihkMVssNF0pDQpjdjUgPC0gc2QoZDFbLDVdKS9tZWFuKGQxWyw1XSkNCmN2NiA8LSBzZChkMVssNl0pL21lYW4oZDFbLDZdKQ0KY3Y3IDwtIHNkKGQxWyw3XSkvbWVhbihkMVssN10pDQpDViA8LSBjKGN2MSwgY3YyLCBjdjMsIGN2NCwgY3Y1LCBjdjYsIGN2NykNCg0KcGFzdGUwKCJNZW5vciBDVjogRCIsIHdoaWNoLm1pbihDViksICIsIG1pbiA9ICIsIHJvdW5kKG1pbihDViksIDQpKQ0KcGFzdGUwKCJTZWd1bmRvIG1lbm9yIENWOiBEIiwgd2hpY2gubWluKENWWy13aGljaC5taW4oQ1YpXSksICIsIG1pbiA9ICIsIHJvdW5kKG1pbihDVlstd2hpY2gubWluKENWKV0pLCA0KSkNCmBgYA0KDQojIyBDYXNvIDggey51bmxpc3RlZCAudW5udW1iZXJlZH0NCiMjIyBDb25maWd1cmHDp8OjbyBkbyBvaXRhdm8gY2FzbyBjb20gJG49MTAwMCQgey51bm51bWJlcmVkIC51bmxpc3RlZH0NCmBgYHtyfQ0KZW1wIDwtIGMoIjEiLCAiMiIsICIzIiwgIjQiLCAiNSIsICI2IiwgIjciLCAiOCIsICI5IiwgIjEwIikgIyBlbXByZXNhcw0KcCA8LSBjKDAuOTEsIDAuMDEsIDAuMDEsIDAuMDEsIDAuMDEsIDAuMDEsIDAuMDEsIDAuMDEsIDAuMDEsIDAuMDEpICMgcGFydGljaXBhY29lcyBkZSBtZXJjYWRvDQprIDwtIGxlbmd0aChlbXApICMgbnVtZXJvIGRlIGVtcHJlc2FzDQoNCg0KbiA8LSAxMDAwICMgbnVtZXJvIGRlIGVsZW1lbnRvcyBkZSBjYWRhIGFtb3N0cmENCk4gPC0gMTAwMCAjIG51bWVybyBkZSBhbW9zdHJhcw0KYGBgDQoNCiMjIyMgQ8OhbGN1bG8gZG9zIMOtbmRpY2VzIGRlIGRvbWluw6JuY2lhIHRlw7NyaWNvcyB7LnVubGlzdGVkIC51bm51bWJlcmVkfQ0KYGBge3J9DQojIEluZGljZXMgZGUgZG9taW5hbmNpYSB0ZW9yaWNvczoNCg0KRDFfVCA8LSAoaypzdW0ocF4yKSAtMSkvKGstMSkgIyBpbmRpY2UgZGUgSGVyZmluZGFobOKAk0hpcnNjaG1hbm4gbm9ybWFsaXphZG8NCg0KcF9PIDwtIHNvcnQocCwgZGVjcmVhc2luZyA9IFQpDQpwZXNvcyA8LSBzZXFfYWxvbmcocF9PKQ0KSXJvcyA8LSAxLygyKnN1bShwZXNvcypwX08pLTEpDQpEMl9UIDwtIChrKklyb3MgLSAxKS8oay0xKSAjIGluZGljZSBkZSBSb3NlbmJsdXRo4oCTSGFsbOKAk1RpZGVtYW5uIG5vcm1hbGl6YWRvDQoNCkhzIDwtIC1zdW0ocCpsb2cocCkpDQpEM19UIDwtIDEgLSBIcy9sb2coaykgIyBpbmRpY2UgZGUgU2hhbm5vbiBub3JtYWxpemFkbw0KDQpJaGVpcCA8LSAoZXhwKEhzKSAtIDEpLyhrIC0gMSkNCkQ0X1QgPC0gMSAtIEloZWlwICMgaW5kaWNlIGRlIEhlaXANCg0KSWhrIDwtIHN1bShwXjIpXigtMSkNCkQ1X1QgPC0gKGsgLSBJaGspLyhrLTEpICMgaW5kaWNlIGRlIEhhbm5haC1LYXkNCg0KVkEgPC0gMSAtICggc3VtKCggKG4qcCkgLSAobi9rKSApXjIpIC8gKCggKG5eMikqKGstMSkgKS9rKSApDQpENl9UIDwtIDEgLSBWQQ0KDQpTREEgPC0gMSAtIHNxcnQoIHN1bSgoIChuKnApIC0gKG4vaykgKV4yKSAvICgoIChuXjIpKihrLTEpICkvaykgKQ0KRDdfVCA8LSAxIC0gU0RBDQoNCmNhdChEMV9ULCBEMl9ULCBEM19ULCBENF9ULCBENV9ULCBENl9ULCBEN19UKQ0KYGBgDQoNCiMjIyMgU2ltdWxhw6fDo28gey51bmxpc3RlZCAudW5udW1iZXJlZH0NCg0KYGBge3J9DQojIGluaWNpYW5kbyBjb20gbiA9IDEwMDANCg0KbTEgPC0gbWF0cml4KDAsIG5yb3cgPC0gbiwgbmNvbCA8LSBOKSAjIG1hdGl6IHF1ZSB2YWkgcmVjZWJlciBhcyBhbW9zdHJhcw0KZDEgPC0gbWF0cml4KDAsIG5yb3cgPC0gTiwgbmNvbCA8LSA3KSAjIGd1YXJkYSBvcyBpbmRpY2VzIGRlIGRvbWluYW5jaWENCg0Kc2V0LnNlZWQoMTIzKQ0KZm9yIChpIGluIDE6Til7DQogIGEgPC0gc2FtcGxlKGVtcCwgc2l6ZSA9IG4sIHJlcGxhY2UgPSBULCBwcm9iID0gcCkgIyBnZXJhIHVtYSBhbW9zdHJhDQogIG0xWyxpXSA8LSBhICMgY2FkYSBjb2x1bmEgZGEgbWF0cml6IHZhaSBzZXIgdW1hIGFtb3N0cmENCiAgDQogIGQxW2ksIDFdIDwtIEQxKGEpICMgY2FkYSBjb2x1bmEgZGUgZDEgcmVjZWJlIHVtIGluZGljZSBkZSBkb21pbmFuY2lhDQogIGQxW2ksIDJdIDwtIEQyKGEpDQogIGQxW2ksIDNdIDwtIEQzKGEpDQogIGQxW2ksIDRdIDwtIEQ0KGEpDQogIGQxW2ksIDVdIDwtIEQ1KGEpDQogIGQxW2ksIDZdIDwtIEQ2KGEpDQogIGQxW2ksIDddIDwtIEQ3KGEpDQp9DQpgYGANCg0KIyMjIyBUZXN0ZSBkZSBKYXJxdWUtQmVyYSBwYXJhIG5vcm1hbGlkYWRlIHsudW5saXN0ZWQgLnVubnVtYmVyZWR9DQoNCmBgYHtyfQ0KIyBUZXN0YW5kbyBub3JtYWxpZGFkZQ0KDQphbHBoYSA8LSAwLjA1ICMgbml2ZWwgZGUgc2lnbmlmaWNhbmNpYQ0KDQpyZXN1bHRfdGVzdGUgPC0gbWF0cml4KDAsIG5jb2wgPSA3LCBucm93ID0gMSkgIyB2YWkgZ3VhcmRhciBvIHJlc3VsdGFkbyBkb3MgdGVzdGVzDQpjb2xuYW1lcyhyZXN1bHRfdGVzdGUpIDwtIGMoIkQxIiwgIkQyIiwgIkQzIiwgIkQ0IiwgIkQ1IiwgIkQ2IiwgIkQ3IikNCg0KcGFyKG1mcm93ID0gYygzLCAzKSwgbWFyID0gYygzLCAzLCAyLCAxKSkgICMgbWFyZ2VucyBhanVzdGFkYXMNCmZvciAoaSBpbiAxOjcpew0KICBoaXN0KGQxWyxpXSwgbWFpbiA9IHBhc3RlMCgiSGlzdG9ncmFtYSBkZSBEIiwgaSksIGNvbCA9IGkrMSwNCiAgICAgICB4bGFiID0gcGFzdGUwKCJEIiwgaSksIHlsYWIgPSAiRnJlcXXDqm5jaWEiKQ0KICB0ZXN0ZSA8LSBqYXJxdWUuYmVyYS50ZXN0KGQxWyxpXSkgIyB0ZXN0ZSBwYXJhIG5vcm1hbGlkYWRlDQogIHJlc3VsdF90ZXN0ZVssaV0gPC0gIGlmZWxzZSh0ZXN0ZSRwLnZhbHVlIDwgYWxwaGEsICJyZWoiLCAiw7EgcmVqIikNCn0NCnJlc3VsdF90ZXN0ZQ0KYGBgDQoNCiMjIyMgQ8OhbGN1bG8gZG8gTUFQRSBlIGRvIENWICB7LnVubGlzdGVkIC51bm51bWJlcmVkfQ0KYGBge3IgY29sbGFwc2U9VFJVRX0NCiMgQ2FsY3VsYW5kbyBvIE1BUEUgKEVycm8gUGVyY2VudHVhbCBBYnNvbHV0byBNw6lkaW8pDQpNQVBFMSA8LSBtZWFuKChhYnMoRDFfVCAtIGQxWywxXSkvRDFfVCkqMTAwKQ0KTUFQRTIgPC0gbWVhbigoYWJzKEQyX1QgLSBkMVssMl0pL0QyX1QpKjEwMCkNCk1BUEUzIDwtIG1lYW4oKGFicyhEM19UIC0gZDFbLDNdKS9EM19UKSoxMDApDQpNQVBFNCA8LSBtZWFuKChhYnMoRDRfVCAtIGQxWyw0XSkvRDRfVCkqMTAwKQ0KTUFQRTUgPC0gbWVhbigoYWJzKEQ1X1QgLSBkMVssNV0pL0Q1X1QpKjEwMCkNCk1BUEU2IDwtIG1lYW4oKGFicyhENl9UIC0gZDFbLDZdKS9ENl9UKSoxMDApDQpNQVBFNyA8LSBtZWFuKChhYnMoRDdfVCAtIGQxWyw3XSkvRDdfVCkqMTAwKQ0KTUFQRSA8LSBjKE1BUEUxLCBNQVBFMiwgTUFQRTMsIE1BUEU0LCBNQVBFNSwgTUFQRTYsIE1BUEU3KQ0KDQpwYXN0ZTAoIk1lbm9yIE1BUEU6IEQiLCB3aGljaC5taW4oTUFQRSksICIsIG1pbiA9ICIsIHJvdW5kKG1pbihNQVBFKSwgNCkpDQpwYXN0ZTAoIlNlZ3VuZG8gbWVub3IgTUFQRTogRCIsIHdoaWNoLm1pbihNQVBFWy13aGljaC5taW4oTUFQRSldKSwgIiwgbWluID0gIiwgcm91bmQobWluKE1BUEVbLXdoaWNoLm1pbihNQVBFKV0pLCA0KSkNCmBgYA0KDQpgYGB7ciBjb2xsYXBzZT1UUlVFfQ0KIyBDYWxjdWxhbmRvIG8gQ1YNCmN2MSA8LSBzZChkMVssMV0pL21lYW4oZDFbLDFdKQ0KY3YyIDwtIHNkKGQxWywyXSkvbWVhbihkMVssMl0pDQpjdjMgPC0gc2QoZDFbLDNdKS9tZWFuKGQxWywzXSkNCmN2NCA8LSBzZChkMVssNF0pL21lYW4oZDFbLDRdKQ0KY3Y1IDwtIHNkKGQxWyw1XSkvbWVhbihkMVssNV0pDQpjdjYgPC0gc2QoZDFbLDZdKS9tZWFuKGQxWyw2XSkNCmN2NyA8LSBzZChkMVssN10pL21lYW4oZDFbLDddKQ0KQ1YgPC0gYyhjdjEsIGN2MiwgY3YzLCBjdjQsIGN2NSwgY3Y2LCBjdjcpDQoNCnBhc3RlMCgiTWVub3IgQ1Y6IEQiLCB3aGljaC5taW4oQ1YpLCAiLCBtaW4gPSAiLCByb3VuZChtaW4oQ1YpLCA0KSkNCnBhc3RlMCgiU2VndW5kbyBtZW5vciBDVjogRCIsIHdoaWNoLm1pbihDVlstd2hpY2gubWluKENWKV0pLCAiLCBtaW4gPSAiLCByb3VuZChtaW4oQ1ZbLXdoaWNoLm1pbihDVildKSwgNCkpDQpgYGANCg0KIyMjIENvbmZpZ3VyYcOnw6NvIGRvIG9pdGF2byBjYXNvIGNvbSAkbj0zMDAwJCB7LnVubnVtYmVyZWQgLnVubGlzdGVkfQ0KYGBge3J9DQplbXAgPC0gYygiMSIsICIyIiwgIjMiLCAiNCIsICI1IiwgIjYiLCAiNyIsICI4IiwgIjkiLCAiMTAiKSAjIGVtcHJlc2FzDQpwIDwtIGMoMC45MSwgMC4wMSwgMC4wMSwgMC4wMSwgMC4wMSwgMC4wMSwgMC4wMSwgMC4wMSwgMC4wMSwgMC4wMSkgIyBwYXJ0aWNpcGFjb2VzIGRlIG1lcmNhZG8NCmsgPC0gbGVuZ3RoKGVtcCkgIyBudW1lcm8gZGUgZW1wcmVzYXMNCg0KDQpuIDwtIDMwMDAgIyBudW1lcm8gZGUgZWxlbWVudG9zIGRlIGNhZGEgYW1vc3RyYQ0KTiA8LSAxMDAwICMgbnVtZXJvIGRlIGFtb3N0cmFzDQpgYGANCg0KIyMjIyBDw6FsY3VsbyBkb3Mgw61uZGljZXMgZGUgZG9taW7Dom5jaWEgdGXDs3JpY29zIHsudW5saXN0ZWQgLnVubnVtYmVyZWR9DQpgYGB7cn0NCiMgSW5kaWNlcyBkZSBkb21pbmFuY2lhIHRlb3JpY29zOg0KDQpEMV9UIDwtIChrKnN1bShwXjIpIC0xKS8oay0xKSAjIGluZGljZSBkZSBIZXJmaW5kYWhs4oCTSGlyc2NobWFubiBub3JtYWxpemFkbw0KDQpwX08gPC0gc29ydChwLCBkZWNyZWFzaW5nID0gVCkNCnBlc29zIDwtIHNlcV9hbG9uZyhwX08pDQpJcm9zIDwtIDEvKDIqc3VtKHBlc29zKnBfTyktMSkNCkQyX1QgPC0gKGsqSXJvcyAtIDEpLyhrLTEpICMgaW5kaWNlIGRlIFJvc2VuYmx1dGjigJNIYWxs4oCTVGlkZW1hbm4gbm9ybWFsaXphZG8NCg0KSHMgPC0gLXN1bShwKmxvZyhwKSkNCkQzX1QgPC0gMSAtIEhzL2xvZyhrKSAjIGluZGljZSBkZSBTaGFubm9uIG5vcm1hbGl6YWRvDQoNCkloZWlwIDwtIChleHAoSHMpIC0gMSkvKGsgLSAxKQ0KRDRfVCA8LSAxIC0gSWhlaXAgIyBpbmRpY2UgZGUgSGVpcA0KDQpJaGsgPC0gc3VtKHBeMileKC0xKQ0KRDVfVCA8LSAoayAtIEloaykvKGstMSkgIyBpbmRpY2UgZGUgSGFubmFoLUtheQ0KDQpWQSA8LSAxIC0gKCBzdW0oKCAobipwKSAtIChuL2spICleMikgLyAoKCAobl4yKSooay0xKSApL2spICkNCkQ2X1QgPC0gMSAtIFZBDQoNClNEQSA8LSAxIC0gc3FydCggc3VtKCggKG4qcCkgLSAobi9rKSApXjIpIC8gKCggKG5eMikqKGstMSkgKS9rKSApDQpEN19UIDwtIDEgLSBTREENCg0KY2F0KEQxX1QsIEQyX1QsIEQzX1QsIEQ0X1QsIEQ1X1QsIEQ2X1QsIEQ3X1QpDQpgYGANCg0KIyMjIyBTaW11bGHDp8OjbyB7LnVubGlzdGVkIC51bm51bWJlcmVkfQ0KDQpgYGB7cn0NCm0xIDwtIG1hdHJpeCgwLCBucm93IDwtIG4sIG5jb2wgPC0gTikgIyBtYXRpeiBxdWUgdmFpIHJlY2ViZXIgYXMgYW1vc3RyYXMNCmQxIDwtIG1hdHJpeCgwLCBucm93IDwtIE4sIG5jb2wgPC0gNykgIyBndWFyZGEgb3MgaW5kaWNlcyBkZSBkb21pbmFuY2lhDQoNCnNldC5zZWVkKDEyMykNCmZvciAoaSBpbiAxOk4pew0KICBhIDwtIHNhbXBsZShlbXAsIHNpemUgPSBuLCByZXBsYWNlID0gVCwgcHJvYiA9IHApICMgZ2VyYSB1bWEgYW1vc3RyYQ0KICBtMVssaV0gPC0gYSAjIGNhZGEgY29sdW5hIGRhIG1hdHJpeiB2YWkgc2VyIHVtYSBhbW9zdHJhDQogIA0KICBkMVtpLCAxXSA8LSBEMShhKSAjIGNhZGEgY29sdW5hIGRlIGQxIHJlY2ViZSB1bSBpbmRpY2UgZGUgZG9taW5hbmNpYQ0KICBkMVtpLCAyXSA8LSBEMihhKQ0KICBkMVtpLCAzXSA8LSBEMyhhKQ0KICBkMVtpLCA0XSA8LSBENChhKQ0KICBkMVtpLCA1XSA8LSBENShhKQ0KICBkMVtpLCA2XSA8LSBENihhKQ0KICBkMVtpLCA3XSA8LSBENyhhKQ0KfQ0KYGBgDQoNCiMjIyMgVGVzdGUgZGUgSmFycXVlLUJlcmEgcGFyYSBub3JtYWxpZGFkZSB7LnVubGlzdGVkIC51bm51bWJlcmVkfQ0KDQpUZXN0ZSBkZSBub3JtYWxpZGFkZSBwYXJhIGNhZGEgY29uanVudG8gZG9zIMOtbmRpY2VzIGNhbGN1bGFkb3M6DQpgYGB7cn0NCiMgVGVzdGFuZG8gbm9ybWFsaWRhZGUNCg0KYWxwaGEgPC0gMC4wNSAjIG5pdmVsIGRlIHNpZ25pZmljYW5jaWENCg0KcmVzdWx0X3Rlc3RlIDwtIG1hdHJpeCgwLCBuY29sID0gNywgbnJvdyA9IDEpICMgdmFpIGd1YXJkYXIgbyByZXN1bHRhZG8gZG9zIHRlc3Rlcw0KY29sbmFtZXMocmVzdWx0X3Rlc3RlKSA8LSBjKCJEMSIsICJEMiIsICJEMyIsICJENCIsICJENSIsICJENiIsICJENyIpDQoNCnBhcihtZnJvdyA9IGMoMywgMyksIG1hciA9IGMoMywgMywgMiwgMSkpICAjIG1hcmdlbnMgYWp1c3RhZGFzDQpmb3IgKGkgaW4gMTo3KXsNCiAgaGlzdChkMVssaV0sIG1haW4gPSBwYXN0ZTAoIkhpc3RvZ3JhbWEgZGUgRCIsIGkpLCBjb2wgPSBpKzEsDQogICAgICAgeGxhYiA9IHBhc3RlMCgiRCIsIGkpLCB5bGFiID0gIkZyZXF1w6puY2lhIikNCiAgdGVzdGUgPC0gamFycXVlLmJlcmEudGVzdChkMVssaV0pICMgdGVzdGUgcGFyYSBub3JtYWxpZGFkZQ0KICByZXN1bHRfdGVzdGVbLGldIDwtICBpZmVsc2UodGVzdGUkcC52YWx1ZSA8IGFscGhhLCAicmVqIiwgIsOxIHJlaiIpDQp9DQpyZXN1bHRfdGVzdGUNCmBgYA0KDQojIyMjIEPDoWxjdWxvIGRvIE1BUEUgZSBkbyBDViAgey51bmxpc3RlZCAudW5udW1iZXJlZH0NCmBgYHtyIGNvbGxhcHNlPVRSVUV9DQojIENhbGN1bGFuZG8gbyBNQVBFIChFcnJvIFBlcmNlbnR1YWwgQWJzb2x1dG8gTcOpZGlvKQ0KTUFQRTEgPC0gbWVhbigoYWJzKEQxX1QgLSBkMVssMV0pL0QxX1QpKjEwMCkNCk1BUEUyIDwtIG1lYW4oKGFicyhEMl9UIC0gZDFbLDJdKS9EMl9UKSoxMDApDQpNQVBFMyA8LSBtZWFuKChhYnMoRDNfVCAtIGQxWywzXSkvRDNfVCkqMTAwKQ0KTUFQRTQgPC0gbWVhbigoYWJzKEQ0X1QgLSBkMVssNF0pL0Q0X1QpKjEwMCkNCk1BUEU1IDwtIG1lYW4oKGFicyhENV9UIC0gZDFbLDVdKS9ENV9UKSoxMDApDQpNQVBFNiA8LSBtZWFuKChhYnMoRDZfVCAtIGQxWyw2XSkvRDZfVCkqMTAwKQ0KTUFQRTcgPC0gbWVhbigoYWJzKEQ3X1QgLSBkMVssN10pL0Q3X1QpKjEwMCkNCk1BUEUgPC0gYyhNQVBFMSwgTUFQRTIsIE1BUEUzLCBNQVBFNCwgTUFQRTUsIE1BUEU2LCBNQVBFNykNCg0KcGFzdGUwKCJNZW5vciBNQVBFOiBEIiwgd2hpY2gubWluKE1BUEUpLCAiLCBtaW4gPSAiLCByb3VuZChtaW4oTUFQRSksIDQpKQ0KcGFzdGUwKCJTZWd1bmRvIG1lbm9yIE1BUEU6IEQiLCB3aGljaC5taW4oTUFQRVstd2hpY2gubWluKE1BUEUpXSksICIsIG1pbiA9ICIsIHJvdW5kKG1pbihNQVBFWy13aGljaC5taW4oTUFQRSldKSwgNCkpDQpgYGANCg0KYGBge3IgY29sbGFwc2U9VFJVRX0NCiMgQ2FsY3VsYW5kbyBvIENWDQpjdjEgPC0gc2QoZDFbLDFdKS9tZWFuKGQxWywxXSkNCmN2MiA8LSBzZChkMVssMl0pL21lYW4oZDFbLDJdKQ0KY3YzIDwtIHNkKGQxWywzXSkvbWVhbihkMVssM10pDQpjdjQgPC0gc2QoZDFbLDRdKS9tZWFuKGQxWyw0XSkNCmN2NSA8LSBzZChkMVssNV0pL21lYW4oZDFbLDVdKQ0KY3Y2IDwtIHNkKGQxWyw2XSkvbWVhbihkMVssNl0pDQpjdjcgPC0gc2QoZDFbLDddKS9tZWFuKGQxWyw3XSkNCkNWIDwtIGMoY3YxLCBjdjIsIGN2MywgY3Y0LCBjdjUsIGN2NiwgY3Y3KQ0KDQpwYXN0ZTAoIk1lbm9yIENWOiBEIiwgd2hpY2gubWluKENWKSwgIiwgbWluID0gIiwgcm91bmQobWluKENWKSwgNCkpDQpwYXN0ZTAoIlNlZ3VuZG8gbWVub3IgQ1Y6IEQiLCB3aGljaC5taW4oQ1ZbLXdoaWNoLm1pbihDVildKSwgIiwgbWluID0gIiwgcm91bmQobWluKENWWy13aGljaC5taW4oQ1YpXSksIDQpKQ0KYGBgDQoNCiMjIENhc28gOSB7LnVubGlzdGVkIC51bm51bWJlcmVkfQ0KIyMjIENvbmZpZ3VyYcOnw6NvIGRvIG5vbm8gY2FzbyBjb20gJG49MTAwMCQgey51bm51bWJlcmVkIC51bmxpc3RlZH0NCmBgYHtyfQ0KZW1wIDwtIGMoIjEiLCAiMiIsICIzIiwgIjQiLCAiNSIsICI2IiwgIjciLCAiOCIsICI5IiwgIjEwIikgIyBlbXByZXNhcw0KcCA8LSBjKDAuNDUsIDAuNDcsIDAuMDEsIDAuMDEsIDAuMDEsIDAuMDEsIDAuMDEsIDAuMDEsIDAuMDEsIDAuMDEpICMgcGFydGljaXBhY29lcyBkZSBtZXJjYWRvDQprIDwtIGxlbmd0aChlbXApICMgbnVtZXJvIGRlIGVtcHJlc2FzDQoNCg0KbiA8LSAxMDAwICMgbnVtZXJvIGRlIGVsZW1lbnRvcyBkZSBjYWRhIGFtb3N0cmENCk4gPC0gMTAwMCAjIG51bWVybyBkZSBhbW9zdHJhcw0KYGBgDQoNCiMjIyMgQ8OhbGN1bG8gZG9zIMOtbmRpY2VzIGRlIGRvbWluw6JuY2lhIHRlw7NyaWNvcyB7LnVubGlzdGVkIC51bm51bWJlcmVkfQ0KYGBge3J9DQojIEluZGljZXMgZGUgZG9taW5hbmNpYSB0ZW9yaWNvczoNCg0KRDFfVCA8LSAoaypzdW0ocF4yKSAtMSkvKGstMSkgIyBpbmRpY2UgZGUgSGVyZmluZGFobOKAk0hpcnNjaG1hbm4gbm9ybWFsaXphZG8NCg0KcF9PIDwtIHNvcnQocCwgZGVjcmVhc2luZyA9IFQpDQpwZXNvcyA8LSBzZXFfYWxvbmcocF9PKQ0KSXJvcyA8LSAxLygyKnN1bShwZXNvcypwX08pLTEpDQpEMl9UIDwtIChrKklyb3MgLSAxKS8oay0xKSAjIGluZGljZSBkZSBSb3NlbmJsdXRo4oCTSGFsbOKAk1RpZGVtYW5uIG5vcm1hbGl6YWRvDQoNCkhzIDwtIC1zdW0ocCpsb2cocCkpDQpEM19UIDwtIDEgLSBIcy9sb2coaykgIyBpbmRpY2UgZGUgU2hhbm5vbiBub3JtYWxpemFkbw0KDQpJaGVpcCA8LSAoZXhwKEhzKSAtIDEpLyhrIC0gMSkNCkQ0X1QgPC0gMSAtIEloZWlwICMgaW5kaWNlIGRlIEhlaXANCg0KSWhrIDwtIHN1bShwXjIpXigtMSkNCkQ1X1QgPC0gKGsgLSBJaGspLyhrLTEpICMgaW5kaWNlIGRlIEhhbm5haC1LYXkNCg0KVkEgPC0gMSAtICggc3VtKCggKG4qcCkgLSAobi9rKSApXjIpIC8gKCggKG5eMikqKGstMSkgKS9rKSApDQpENl9UIDwtIDEgLSBWQQ0KDQpTREEgPC0gMSAtIHNxcnQoIHN1bSgoIChuKnApIC0gKG4vaykgKV4yKSAvICgoIChuXjIpKihrLTEpICkvaykgKQ0KRDdfVCA8LSAxIC0gU0RBDQoNCmNhdChEMV9ULCBEMl9ULCBEM19ULCBENF9ULCBENV9ULCBENl9ULCBEN19UKQ0KYGBgDQoNCiMjIyMgU2ltdWxhw6fDo28gey51bmxpc3RlZCAudW5udW1iZXJlZH0NCg0KYGBge3J9DQojIGluaWNpYW5kbyBjb20gbiA9IDEwMDANCg0KbTEgPC0gbWF0cml4KDAsIG5yb3cgPC0gbiwgbmNvbCA8LSBOKSAjIG1hdGl6IHF1ZSB2YWkgcmVjZWJlciBhcyBhbW9zdHJhcw0KZDEgPC0gbWF0cml4KDAsIG5yb3cgPC0gTiwgbmNvbCA8LSA3KSAjIGd1YXJkYSBvcyBpbmRpY2VzIGRlIGRvbWluYW5jaWENCg0Kc2V0LnNlZWQoMTIzKQ0KZm9yIChpIGluIDE6Til7DQogIGEgPC0gc2FtcGxlKGVtcCwgc2l6ZSA9IG4sIHJlcGxhY2UgPSBULCBwcm9iID0gcCkgIyBnZXJhIHVtYSBhbW9zdHJhDQogIG0xWyxpXSA8LSBhICMgY2FkYSBjb2x1bmEgZGEgbWF0cml6IHZhaSBzZXIgdW1hIGFtb3N0cmENCiAgDQogIGQxW2ksIDFdIDwtIEQxKGEpICMgY2FkYSBjb2x1bmEgZGUgZDEgcmVjZWJlIHVtIGluZGljZSBkZSBkb21pbmFuY2lhDQogIGQxW2ksIDJdIDwtIEQyKGEpDQogIGQxW2ksIDNdIDwtIEQzKGEpDQogIGQxW2ksIDRdIDwtIEQ0KGEpDQogIGQxW2ksIDVdIDwtIEQ1KGEpDQogIGQxW2ksIDZdIDwtIEQ2KGEpDQogIGQxW2ksIDddIDwtIEQ3KGEpDQp9DQpgYGANCg0KIyMjIyBUZXN0ZSBkZSBKYXJxdWUtQmVyYSBwYXJhIG5vcm1hbGlkYWRlIHsudW5saXN0ZWQgLnVubnVtYmVyZWR9DQoNCmBgYHtyfQ0KIyBUZXN0YW5kbyBub3JtYWxpZGFkZQ0KDQphbHBoYSA8LSAwLjA1ICMgbml2ZWwgZGUgc2lnbmlmaWNhbmNpYQ0KDQpyZXN1bHRfdGVzdGUgPC0gbWF0cml4KDAsIG5jb2wgPSA3LCBucm93ID0gMSkgIyB2YWkgZ3VhcmRhciBvIHJlc3VsdGFkbyBkb3MgdGVzdGVzDQpjb2xuYW1lcyhyZXN1bHRfdGVzdGUpIDwtIGMoIkQxIiwgIkQyIiwgIkQzIiwgIkQ0IiwgIkQ1IiwgIkQ2IiwgIkQ3IikNCg0KcGFyKG1mcm93ID0gYygzLCAzKSwgbWFyID0gYygzLCAzLCAyLCAxKSkgICMgbWFyZ2VucyBhanVzdGFkYXMNCmZvciAoaSBpbiAxOjcpew0KICBoaXN0KGQxWyxpXSwgbWFpbiA9IHBhc3RlMCgiSGlzdG9ncmFtYSBkZSBEIiwgaSksIGNvbCA9IGkrMSwNCiAgICAgICB4bGFiID0gcGFzdGUwKCJEIiwgaSksIHlsYWIgPSAiRnJlcXXDqm5jaWEiKQ0KICB0ZXN0ZSA8LSBqYXJxdWUuYmVyYS50ZXN0KGQxWyxpXSkgIyB0ZXN0ZSBwYXJhIG5vcm1hbGlkYWRlDQogIHJlc3VsdF90ZXN0ZVssaV0gPC0gIGlmZWxzZSh0ZXN0ZSRwLnZhbHVlIDwgYWxwaGEsICJyZWoiLCAiw7EgcmVqIikNCn0NCnJlc3VsdF90ZXN0ZQ0KYGBgDQoNCiMjIyMgQ8OhbGN1bG8gZG8gTUFQRSBlIGRvIENWICB7LnVubGlzdGVkIC51bm51bWJlcmVkfQ0KYGBge3IgY29sbGFwc2U9VFJVRX0NCiMgQ2FsY3VsYW5kbyBvIE1BUEUgKEVycm8gUGVyY2VudHVhbCBBYnNvbHV0byBNw6lkaW8pDQpNQVBFMSA8LSBtZWFuKChhYnMoRDFfVCAtIGQxWywxXSkvRDFfVCkqMTAwKQ0KTUFQRTIgPC0gbWVhbigoYWJzKEQyX1QgLSBkMVssMl0pL0QyX1QpKjEwMCkNCk1BUEUzIDwtIG1lYW4oKGFicyhEM19UIC0gZDFbLDNdKS9EM19UKSoxMDApDQpNQVBFNCA8LSBtZWFuKChhYnMoRDRfVCAtIGQxWyw0XSkvRDRfVCkqMTAwKQ0KTUFQRTUgPC0gbWVhbigoYWJzKEQ1X1QgLSBkMVssNV0pL0Q1X1QpKjEwMCkNCk1BUEU2IDwtIG1lYW4oKGFicyhENl9UIC0gZDFbLDZdKS9ENl9UKSoxMDApDQpNQVBFNyA8LSBtZWFuKChhYnMoRDdfVCAtIGQxWyw3XSkvRDdfVCkqMTAwKQ0KTUFQRSA8LSBjKE1BUEUxLCBNQVBFMiwgTUFQRTMsIE1BUEU0LCBNQVBFNSwgTUFQRTYsIE1BUEU3KQ0KDQpwYXN0ZTAoIk1lbm9yIE1BUEU6IEQiLCB3aGljaC5taW4oTUFQRSksICIsIG1pbiA9ICIsIHJvdW5kKG1pbihNQVBFKSwgNCkpDQpwYXN0ZTAoIlNlZ3VuZG8gbWVub3IgTUFQRTogRCIsIHdoaWNoLm1pbihNQVBFWy13aGljaC5taW4oTUFQRSldKSwgIiwgbWluID0gIiwgcm91bmQobWluKE1BUEVbLXdoaWNoLm1pbihNQVBFKV0pLCA0KSkNCmBgYA0KDQpgYGB7ciBjb2xsYXBzZT1UUlVFfQ0KIyBDYWxjdWxhbmRvIG8gQ1YNCmN2MSA8LSBzZChkMVssMV0pL21lYW4oZDFbLDFdKQ0KY3YyIDwtIHNkKGQxWywyXSkvbWVhbihkMVssMl0pDQpjdjMgPC0gc2QoZDFbLDNdKS9tZWFuKGQxWywzXSkNCmN2NCA8LSBzZChkMVssNF0pL21lYW4oZDFbLDRdKQ0KY3Y1IDwtIHNkKGQxWyw1XSkvbWVhbihkMVssNV0pDQpjdjYgPC0gc2QoZDFbLDZdKS9tZWFuKGQxWyw2XSkNCmN2NyA8LSBzZChkMVssN10pL21lYW4oZDFbLDddKQ0KQ1YgPC0gYyhjdjEsIGN2MiwgY3YzLCBjdjQsIGN2NSwgY3Y2LCBjdjcpDQoNCnBhc3RlMCgiTWVub3IgQ1Y6IEQiLCB3aGljaC5taW4oQ1YpLCAiLCBtaW4gPSAiLCByb3VuZChtaW4oQ1YpLCA0KSkNCnBhc3RlMCgiU2VndW5kbyBtZW5vciBDVjogRCIsIHdoaWNoLm1pbihDVlstd2hpY2gubWluKENWKV0pLCAiLCBtaW4gPSAiLCByb3VuZChtaW4oQ1ZbLXdoaWNoLm1pbihDVildKSwgNCkpDQpgYGANCg0KIyMjIENvbmZpZ3VyYcOnw6NvIGRvIG5vbm8gY2FzbyBjb20gJG49MzAwMCQgey51bm51bWJlcmVkIC51bmxpc3RlZH0NCmBgYHtyfQ0KZW1wIDwtIGMoIjEiLCAiMiIsICIzIiwgIjQiLCAiNSIsICI2IiwgIjciLCAiOCIsICI5IiwgIjEwIikgIyBlbXByZXNhcw0KcCA8LSBjKDAuNDUsIDAuNDcsIDAuMDEsIDAuMDEsIDAuMDEsIDAuMDEsIDAuMDEsIDAuMDEsIDAuMDEsIDAuMDEpICMgcGFydGljaXBhY29lcyBkZSBtZXJjYWRvDQprIDwtIGxlbmd0aChlbXApICMgbnVtZXJvIGRlIGVtcHJlc2FzDQoNCg0KbiA8LSAzMDAwICMgbnVtZXJvIGRlIGVsZW1lbnRvcyBkZSBjYWRhIGFtb3N0cmENCk4gPC0gMTAwMCAjIG51bWVybyBkZSBhbW9zdHJhcw0KYGBgDQoNCiMjIyMgQ8OhbGN1bG8gZG9zIMOtbmRpY2VzIGRlIGRvbWluw6JuY2lhIHRlw7NyaWNvcyB7LnVubGlzdGVkIC51bm51bWJlcmVkfQ0KYGBge3J9DQojIEluZGljZXMgZGUgZG9taW5hbmNpYSB0ZW9yaWNvczoNCg0KRDFfVCA8LSAoaypzdW0ocF4yKSAtMSkvKGstMSkgIyBpbmRpY2UgZGUgSGVyZmluZGFobOKAk0hpcnNjaG1hbm4gbm9ybWFsaXphZG8NCg0KcF9PIDwtIHNvcnQocCwgZGVjcmVhc2luZyA9IFQpDQpwZXNvcyA8LSBzZXFfYWxvbmcocF9PKQ0KSXJvcyA8LSAxLygyKnN1bShwZXNvcypwX08pLTEpDQpEMl9UIDwtIChrKklyb3MgLSAxKS8oay0xKSAjIGluZGljZSBkZSBSb3NlbmJsdXRo4oCTSGFsbOKAk1RpZGVtYW5uIG5vcm1hbGl6YWRvDQoNCkhzIDwtIC1zdW0ocCpsb2cocCkpDQpEM19UIDwtIDEgLSBIcy9sb2coaykgIyBpbmRpY2UgZGUgU2hhbm5vbiBub3JtYWxpemFkbw0KDQpJaGVpcCA8LSAoZXhwKEhzKSAtIDEpLyhrIC0gMSkNCkQ0X1QgPC0gMSAtIEloZWlwICMgaW5kaWNlIGRlIEhlaXANCg0KSWhrIDwtIHN1bShwXjIpXigtMSkNCkQ1X1QgPC0gKGsgLSBJaGspLyhrLTEpICMgaW5kaWNlIGRlIEhhbm5haC1LYXkNCg0KVkEgPC0gMSAtICggc3VtKCggKG4qcCkgLSAobi9rKSApXjIpIC8gKCggKG5eMikqKGstMSkgKS9rKSApDQpENl9UIDwtIDEgLSBWQQ0KDQpTREEgPC0gMSAtIHNxcnQoIHN1bSgoIChuKnApIC0gKG4vaykgKV4yKSAvICgoIChuXjIpKihrLTEpICkvaykgKQ0KRDdfVCA8LSAxIC0gU0RBDQoNCmNhdChEMV9ULCBEMl9ULCBEM19ULCBENF9ULCBENV9ULCBENl9ULCBEN19UKQ0KYGBgDQoNCiMjIyMgU2ltdWxhw6fDo28gey51bmxpc3RlZCAudW5udW1iZXJlZH0NCg0KYGBge3J9DQptMSA8LSBtYXRyaXgoMCwgbnJvdyA8LSBuLCBuY29sIDwtIE4pICMgbWF0aXogcXVlIHZhaSByZWNlYmVyIGFzIGFtb3N0cmFzDQpkMSA8LSBtYXRyaXgoMCwgbnJvdyA8LSBOLCBuY29sIDwtIDcpICMgZ3VhcmRhIG9zIGluZGljZXMgZGUgZG9taW5hbmNpYQ0KDQpzZXQuc2VlZCgxMjMpDQpmb3IgKGkgaW4gMTpOKXsNCiAgYSA8LSBzYW1wbGUoZW1wLCBzaXplID0gbiwgcmVwbGFjZSA9IFQsIHByb2IgPSBwKSAjIGdlcmEgdW1hIGFtb3N0cmENCiAgbTFbLGldIDwtIGEgIyBjYWRhIGNvbHVuYSBkYSBtYXRyaXogdmFpIHNlciB1bWEgYW1vc3RyYQ0KICANCiAgZDFbaSwgMV0gPC0gRDEoYSkgIyBjYWRhIGNvbHVuYSBkZSBkMSByZWNlYmUgdW0gaW5kaWNlIGRlIGRvbWluYW5jaWENCiAgZDFbaSwgMl0gPC0gRDIoYSkNCiAgZDFbaSwgM10gPC0gRDMoYSkNCiAgZDFbaSwgNF0gPC0gRDQoYSkNCiAgZDFbaSwgNV0gPC0gRDUoYSkNCiAgZDFbaSwgNl0gPC0gRDYoYSkNCiAgZDFbaSwgN10gPC0gRDcoYSkNCn0NCmBgYA0KDQojIyMjIFRlc3RlIGRlIEphcnF1ZS1CZXJhIHBhcmEgbm9ybWFsaWRhZGUgey51bmxpc3RlZCAudW5udW1iZXJlZH0NCg0KVGVzdGUgZGUgbm9ybWFsaWRhZGUgcGFyYSBjYWRhIGNvbmp1bnRvIGRvcyDDrW5kaWNlcyBjYWxjdWxhZG9zOg0KYGBge3J9DQojIFRlc3RhbmRvIG5vcm1hbGlkYWRlDQoNCmFscGhhIDwtIDAuMDUgIyBuaXZlbCBkZSBzaWduaWZpY2FuY2lhDQoNCnJlc3VsdF90ZXN0ZSA8LSBtYXRyaXgoMCwgbmNvbCA9IDcsIG5yb3cgPSAxKSAjIHZhaSBndWFyZGFyIG8gcmVzdWx0YWRvIGRvcyB0ZXN0ZXMNCmNvbG5hbWVzKHJlc3VsdF90ZXN0ZSkgPC0gYygiRDEiLCAiRDIiLCAiRDMiLCAiRDQiLCAiRDUiLCAiRDYiLCAiRDciKQ0KDQpwYXIobWZyb3cgPSBjKDMsIDMpLCBtYXIgPSBjKDMsIDMsIDIsIDEpKSAgIyBtYXJnZW5zIGFqdXN0YWRhcw0KZm9yIChpIGluIDE6Nyl7DQogIGhpc3QoZDFbLGldLCBtYWluID0gcGFzdGUwKCJIaXN0b2dyYW1hIGRlIEQiLCBpKSwgY29sID0gaSsxLA0KICAgICAgIHhsYWIgPSBwYXN0ZTAoIkQiLCBpKSwgeWxhYiA9ICJGcmVxdcOqbmNpYSIpDQogIHRlc3RlIDwtIGphcnF1ZS5iZXJhLnRlc3QoZDFbLGldKSAjIHRlc3RlIHBhcmEgbm9ybWFsaWRhZGUNCiAgcmVzdWx0X3Rlc3RlWyxpXSA8LSAgaWZlbHNlKHRlc3RlJHAudmFsdWUgPCBhbHBoYSwgInJlaiIsICLDsSByZWoiKQ0KfQ0KcmVzdWx0X3Rlc3RlDQpgYGANCg0KIyMjIyBDw6FsY3VsbyBkbyBNQVBFIGUgZG8gQ1YgIHsudW5saXN0ZWQgLnVubnVtYmVyZWR9DQpgYGB7ciBjb2xsYXBzZT1UUlVFfQ0KIyBDYWxjdWxhbmRvIG8gTUFQRSAoRXJybyBQZXJjZW50dWFsIEFic29sdXRvIE3DqWRpbykNCk1BUEUxIDwtIG1lYW4oKGFicyhEMV9UIC0gZDFbLDFdKS9EMV9UKSoxMDApDQpNQVBFMiA8LSBtZWFuKChhYnMoRDJfVCAtIGQxWywyXSkvRDJfVCkqMTAwKQ0KTUFQRTMgPC0gbWVhbigoYWJzKEQzX1QgLSBkMVssM10pL0QzX1QpKjEwMCkNCk1BUEU0IDwtIG1lYW4oKGFicyhENF9UIC0gZDFbLDRdKS9ENF9UKSoxMDApDQpNQVBFNSA8LSBtZWFuKChhYnMoRDVfVCAtIGQxWyw1XSkvRDVfVCkqMTAwKQ0KTUFQRTYgPC0gbWVhbigoYWJzKEQ2X1QgLSBkMVssNl0pL0Q2X1QpKjEwMCkNCk1BUEU3IDwtIG1lYW4oKGFicyhEN19UIC0gZDFbLDddKS9EN19UKSoxMDApDQpNQVBFIDwtIGMoTUFQRTEsIE1BUEUyLCBNQVBFMywgTUFQRTQsIE1BUEU1LCBNQVBFNiwgTUFQRTcpDQoNCnBhc3RlMCgiTWVub3IgTUFQRTogRCIsIHdoaWNoLm1pbihNQVBFKSwgIiwgbWluID0gIiwgcm91bmQobWluKE1BUEUpLCA0KSkNCnBhc3RlMCgiU2VndW5kbyBtZW5vciBNQVBFOiBEIiwgd2hpY2gubWluKE1BUEVbLXdoaWNoLm1pbihNQVBFKV0pLCAiLCBtaW4gPSAiLCByb3VuZChtaW4oTUFQRVstd2hpY2gubWluKE1BUEUpXSksIDQpKQ0KYGBgDQoNCmBgYHtyIGNvbGxhcHNlPVRSVUV9DQojIENhbGN1bGFuZG8gbyBDVg0KY3YxIDwtIHNkKGQxWywxXSkvbWVhbihkMVssMV0pDQpjdjIgPC0gc2QoZDFbLDJdKS9tZWFuKGQxWywyXSkNCmN2MyA8LSBzZChkMVssM10pL21lYW4oZDFbLDNdKQ0KY3Y0IDwtIHNkKGQxWyw0XSkvbWVhbihkMVssNF0pDQpjdjUgPC0gc2QoZDFbLDVdKS9tZWFuKGQxWyw1XSkNCmN2NiA8LSBzZChkMVssNl0pL21lYW4oZDFbLDZdKQ0KY3Y3IDwtIHNkKGQxWyw3XSkvbWVhbihkMVssN10pDQpDViA8LSBjKGN2MSwgY3YyLCBjdjMsIGN2NCwgY3Y1LCBjdjYsIGN2NykNCg0KcGFzdGUwKCJNZW5vciBDVjogRCIsIHdoaWNoLm1pbihDViksICIsIG1pbiA9ICIsIHJvdW5kKG1pbihDViksIDQpKQ0KcGFzdGUwKCJTZWd1bmRvIG1lbm9yIENWOiBEIiwgd2hpY2gubWluKENWWy13aGljaC5taW4oQ1YpXSksICIsIG1pbiA9ICIsIHJvdW5kKG1pbihDVlstd2hpY2gubWluKENWKV0pLCA0KSkNCmBgYA==