1 Í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 <- sum(x) # numero total de vendas
  prop <- x/n # participacoes de mercado
  k <- length(x) # 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 <- sum(x) # total de vendas
  prop <- 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(x) # 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 <- sum(x) # total de vendas
  prop <- x/n # participacoes de mercado
  k <- length(x) # numero de empresas
  
  Hs <- -sum(prop*log(prop), na.rm = T) # 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 <- sum(x) # total de vendas
  prop <- x/n # participacoes de mercado
  k <- length(x) # numero de empresas
  
  Hs <- -sum(prop*log(prop), na.rm = T) # 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}\\ &= \frac{k\sum_{i=1}^kp_i^2 - 1}{(k-1)\sum_{i=1}^kp_i^2} \end{align*}\]

D5 <- function(x){
  n <- sum(x) # total de vendas
  prop <- x/n # participacoes de mercado
  k <- length(x) # numero de empresas
  
  Ihk <- 1/sum(prop^2) # 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 <- sum(x) # total de vendas
  k <- length(x) # numero de empresas
  
  VA <- 1 - ( sum( (x - (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 <- sum(x) # total de vendas
  k <- length(x) # numero de empresas
  
  SDA <- 1 - sqrt( sum( (x - (n/k))^2 )/( ( (n^2)*(k-1) )/k ) ) # estatistica SDA
  
  D7 <- 1 - SDA
  return(D7)
}

2 Relações entre os índices de dominância

Entre os índices que dependem de \(HHI\)

Somente \(D_1, \; D_5, \; D_6\; \text{ e } \; D_7\) dependem de \(HHI\): \[\begin{align*} &D_1 = D_6\\ &D_7 = \sqrt{D_6} = \sqrt{D_1}\\ &D_5 = \frac{D_1}{HHI}= \frac{D_6}{HHI}\\ &D_5 = \frac{D_7^2}{HHI} \end{align*}\]

Entre os índices que dependem de \(H_S\)

Somente \(D_3 \; \text{ e } \; D_4\) dependem de \(H_S\): \[\begin{align*} &D_4 = \frac{k}{k - 1}(1 - e^{1-D_3}) \end{align*}\]

3 Intervalos para os índices de dominância

Sabe-se que \[\begin{align*} HHI &< 0,01 \rightarrow \text{alta competitividade}\\ 0,01 \leq HHI &< 0,15 \rightarrow \text{pouco concentrado}\\ 0,15 \leq HHI &< 0,25 \rightarrow \text{concentração média}\\ HHI &\geq 0.25 \rightarrow \text{alta concentração}. \end{align*}\] Pela relação entre \(HHI\), \(D_1 \; \text{ e } \; D_6\), temos que: \[\begin{align*} D_1 = D_6 &< \frac{0,01k - 1}{k - 1} \rightarrow \text{alta competitividade}\\ \frac{0,01k - 1}{k - 1} \leq D_1 = D_6 &< \frac{0,15k - 1}{k - 1} \rightarrow \text{pouco concentrado}\\ \frac{0,15k - 1}{k - 1} \leq D_1 = D_6 &< \frac{0,25k - 1}{k - 1} \rightarrow \text{concentração média}\\ D_1 = D_6 &\geq \frac{0,25k - 1}{k - 1} \rightarrow \text{alta concentração} \end{align*}\]

Pela relação entre \(D_1\), \(D_6\) e \(D_7\), temos que: \[\begin{align*} D_7 &< \sqrt{\frac{0,01k - 1}{k - 1}} \rightarrow \text{alta competitividade}\\ \sqrt{\frac{0,01k - 1}{k - 1}} \leq D_7 &< \sqrt{\frac{0,15k - 1}{k - 1}} \rightarrow \text{pouco concentrado}\\ \sqrt{\frac{0,15k - 1}{k - 1}} \leq D_7 &< \sqrt{\frac{0,25k - 1}{k - 1}} \rightarrow \text{concentração média}\\ D_7 &\geq \sqrt{\frac{0,25k - 1}{k - 1}} \rightarrow \text{alta concentração} \end{align*}\]

Pela relação entre \(D_5\) e \(HHI\), temos que: \[\begin{align*} D_5 &< \frac{0,01k - 1}{0,01(k - 1)} \rightarrow \text{alta competitividade}\\ \frac{0,01k - 1}{0,01(k - 1)} \leq D_5 &< \frac{0,15k - 1}{0,15(k - 1)} \rightarrow \text{pouco concentrado}\\ \frac{0,15k - 1}{0,15(k - 1)} \leq D_5 &< \frac{0,25k - 1}{0,25(k - 1)} \rightarrow \text{concentração média}\\ D_5 &\geq \frac{0,25k - 1}{0,25(k - 1)} \rightarrow \text{alta concentração} \end{align*}\]

4 Distribuição assintótica

Seja \((\chi, \beta_\chi, P)_{P\in\Delta_M}\) um espaço estatístico, onde \(\chi = \{x_1, ..., x_M\}\), \(\Delta_M = \{P = (p_1, ..., p_M)^t\), \(p_i \geq 0\) e \(\sum_{i=1}^Mp_i = 1\}\) e \(\beta_\chi\) a sigma-álgebra de todos os subconjuntos de \(\chi\). Para algum \(P\in \Delta_M\), a entropia \(H_{h,v}^{\varphi_1, \varphi_2}\) é definida pela seguinte expressão: \[ H_{h,v}^{\varphi_1, \varphi_2}(P) = h\left( \frac{\sum_{i=1}^Mv_i\varphi_1(p_i)}{\sum_{i=1}^Mv_i\varphi_2(p_i)} \right), \] onde \(v_i>0\), \(i = 1, ..., M\), é o peso associado ao elemento \(x_i\) de \(\chi\). Além disso, nós supomos que \(\varphi_1: [0,1) \rightarrow \mathbb{R}\), \(\varphi_2: [0,1) \rightarrow \mathbb{R}\) e \(h: \mathbb{R} \rightarrow \mathbb{R}\) sejam quaisquer dos triplos de funções apresentados na tabela apresentada no artigo. A tabela seguinte mostra algumas dessas funções para as entropias utilizadas nos índices de dominância apresentados anteriormente.

Entropia \(h(x)\) \(\varphi_1(x)\) \(\varphi_2(x)\) \(v_i\)
Shannon \(x\) \(-x \log x\) \(x\) \(v\)
Rényi \((1 - r)^{-1}\log x\) \(x^r\) \(x\) \(v\)
Tsallis \(\ (r-1)^{-1}(1 - x)\) \(x^r\) \(x\) \(v\)

Teorema: Suponha que \(h\in C^1(\mathbb{R})\), \(\varphi_1 \in C^1((0,1))\), \(\varphi_2 \in C^1((0,1))\) e \(p_i>0, \; i = 1, ..., M.\) Se a frequência relativa \(\hat{P}\) é o estimador de \(P=(p_1, ...,, p_M)\) baseado em uma amostra aleatória de tamanho \(n\), então \[\begin{align*} n^{1/2}[H_{h,v}^{\varphi_1, \varphi_2}(\hat{P}) - H_{h,v}^{\varphi_1, \varphi_2}(P)]\overset{D}{\rightarrow}N(0, \sigma^2), \end{align*}\] em que \[\begin{align*} \sigma^2 &= \sum_{i = 1}^Mt_i^2p_i - \bigg(\sum_{i = 1}^Mt_ip_i\bigg)^2\\ t_i &= \frac{d}{dp_i}H_{h,v}^{\varphi_1, \varphi_2}(P). \end{align*}\]

No caso da Entropia de Shannon, Entropia de Tsallis e Entropia de Rényi, temos os seguintes \(t_i's\):

Entropia \(t_i\)
Shannon \(- (1 + \log p_i)\)
Rényi \(\frac{r}{1 - r} \, p_i^{r - 1} \left[\sum_{i = 1}^M p_i^r\right]^{-1}\)
Tsallis \(-\frac{r}{r - 1}p_i^{r - 1}\)

Logo, a distribuição assintótica das entropias é dada por:

Entropia Distribuição assintótica
Shannon \(\hat{H}_s \overset{D}{\to} N\!\left(H_s, \frac{1}{n}\left(\sum_{i=1}^{k} p_i\ln^2 p_i - H_s^2\right)\right)\)
Rényi \(\hat{H}_R \overset{D}{\to} N\!\left(H_R, \frac{1}{n} \Bigg[ \left(\frac{\alpha}{\alpha - 1}\right)^2 \Bigg( \left(\sum_{i=1}^{k} p_i^\alpha\right)^{-2} \left(\sum_{i=1}^{k} p_i^{2\alpha - 1}\right) - \left(\sum_{i=1}^{k} p_i^\alpha\right)^2 \Bigg) \Bigg] \right)\)
Tsallis \(\hat{H}_T \overset{D}{\to} N\!\left(H_T, \frac{1}{n} \Bigg[ \left(\frac{\alpha}{\alpha - 1}\right)^2 \Bigg( \sum_{i=1}^{k} p_i^{2\alpha - 1} - \left(\sum_{i=1}^{k} p_i^\alpha\right)^2 \Bigg) \Bigg] \right)\)

\(D_1\)

\[\begin{align*} \hat{D}_1 \overset{D}{\rightarrow} N\bigg(\frac{k[1 - H_T(2)] - 1}{k - 1}, \bigg[\frac{k}{k-1}\bigg]^2\mathbb{V}ar[\hat{H}_T(2)]\bigg) \end{align*}\]

\(D_3\)

\[\begin{align*} \hat{D}_3 \overset{D}{\rightarrow} N\bigg(1 - \frac{H_s}{\log k}, \frac{\mathbb{V}ar(\hat{H}_s)}{\log^2 k}\bigg) \end{align*}\]

\(D_4\)

Seja \(W = \hat{D}_4\). Logo, temos que a densidade de \(W\) é dada por: \[\begin{align*} f_W(w) = \frac{k - 1}{[k - (k-1)w]\sqrt{2\pi \sigma^2_S}}exp\bigg[-\frac{[\log(k - (k-1)w) - H_s]^2}{2\sigma_S^2}\bigg]\overset{\mathbb{I}(w)}{_{(-\infty, \frac{k}{k-1})}} \end{align*}\]

# fdp de D4 e D5 ----------------------------------------------------------

f1 <- function(x, mu, sigma2, k){
  ( (k - 1)/((k - (k-1)*x)*sqrt(2*pi*sigma2)) )*exp(-((log(k - (k-1)*x) - mu)^2)/(2*sigma2))
}

\(D_5\)

Seja \(V = \hat{D}_5\). Logo, temos que a densidade de \(V\) é dada por: \[\begin{align*} f_V(v) = \frac{k - 1}{[k - (k-1)v]\sqrt{2\pi \sigma^2_R}}exp\bigg[-\frac{[\log(k - (k-1)v) - H_R]^2}{2\sigma_R^2}\bigg]\overset{\mathbb{I}(v)}{_{(-\infty, \frac{k}{k-1})}} \end{align*}\]

# fdp de D4 e D5 ----------------------------------------------------------

f1 <- function(x, mu, sigma2, k){
  ( (k - 1)/((k - (k-1)*x)*sqrt(2*pi*sigma2)) )*exp(-((log(k - (k-1)*x) - mu)^2)/(2*sigma2))
}

\(D_6\)

\[\begin{align*} \hat{D}_6 \overset{D}{\rightarrow} N\bigg(\frac{k[1 - H_T(2)] - 1}{k - 1}, \bigg[\frac{k}{k-1}\bigg]^2\mathbb{V}ar[\hat{H}_T(2)]\bigg) \end{align*}\]

\(D_7\)

Seja \(U = \hat{D}_6\) e \(Y = \hat{D}_7 = \sqrt{U}\). Temos a seguinte densidade que está bem definida somente para \(\mathbb{R^+}\): \[\begin{align*} f_Y(y) = \frac{2y}{\sqrt{2\pi\sigma^2_U}}exp\bigg[-\frac{(y^2-\mu_U)^2}{2\sigma^2_U} \bigg]\overset{\mathbb{I}(y)}{{(0,\infty)}}. \end{align*}\]

# fdp de D7 ---------------------------------------------------------------

f2 <- function(x, mu, sigma2){
  ( (2*x)/sqrt(2*pi*sigma2) )*exp(-(((x^2) - mu)^2)/(2*sigma2))
}

5 Simulação

Configuração 1

Com 1000 amostras:

# Caso 1 ------------------------------------------------------------------

n <- 1000 # tamanho de cada amostra

# N = 1000

N <- 1000 # numero de amostras
p <- c(0.24, 0.26, 0.255, 0.245) # participacoes de mercado

set.seed(123)
a <- rmultinom(N, n, p)
id_c1.1 <- id(a, N)

Com 3000 amostras:

# N = 3000

N <- 3000 # numero de amostras
p <- c(0.24, 0.26, 0.255, 0.245) # participacoes de mercado

set.seed(123)
a <- rmultinom(N, n, p)
id_c1.2 <- id(a, N)

Índices de dominância teóricos

# Calculo do valor teorico dos indices de dominancia

d1.t_c1 <- D1(n*p); d1.t_c1
## [1] 0.0003333333
d2.t_c1 <- D2(n*p); d2.t_c1
## [1] 0.005937235
d3.t_c1 <- D3(n*p); d3.t_c1
## [1] 0.0003607556
d4.t_c1 <- D4(n*p); d4.t_c1
## [1] 0.0006666512
d5.t_c1 <- D5(n*p); d5.t_c1
## [1] 0.001332001
d6.t_c1 <- D6(n*p); d6.t_c1
## [1] 0.0003333333
d7.t_c1 <- D7(n*p); d7.t_c1
## [1] 0.01825742

Entropias e variância das entropias

Hs <- -sum(p*log(p)) # entropia de shannon
Hr <- -log(sum(p^2)) # entropia de renyi com alpha = 2
Ht <- 1 - sum(p^2) # entropia de tsallis com alpha = 2
v_shannon <- ( sum(p*(log(p)^2)) -  (Hs^2) )/n 
v_renyi <- ( 4*( ((sum(p^2)^(-2)) * sum(p^3)) - 1 ) )/n 
v_tsallis <- ( 4*(sum(p^3) - (sum(p^2)^2)) )/n

Variâncias assintóticas de alguns índices de dominância

# Variancia teorica dos indices de dominancia

k <- length(p) # numero de empresas

v1 <- ((k/(k-1))^2) * v_tsallis # variancia do D1
v3 <- v_shannon/(log(k)^2) # variancia do D3
v6 <- ((k/(k-1))^2) * v_tsallis # variancia do D6

v1; v3; v6
## [1] 4.44e-07
## [1] 5.201531e-07
## [1] 4.44e-07

Plotagem

# Histogramas Caso 1 ------------------------------------------------------

# com N = 1000

medias <- c(d1.t_c1, NA, d3.t_c1, Hs, Hr, d6.t_c1, d1.t_c1)
variancias <- c(v1, NA, v3, v_shannon, v_renyi, v6, v1)
plotagem(id_c1.1, medias, variancias, k, 1, p)

# com N = 3000

medias <- c(d1.t_c1, NA, d3.t_c1, Hs, Hr, d6.t_c1, d1.t_c1)
variancias <- c(v1, NA, v3, v_shannon, v_renyi, v6, v1)
plotagem(id_c1.2, medias, variancias, k, 1, p)

Configuração 2

Com 1000 amostras:

n <- 1000 # tamanho de cada amostra

# N = 1000

N <- 1000 # numero de amostras
p <- c(0.85, 0.05, 0.05, 0.05) # participacoes de mercado

set.seed(123)
a <- rmultinom(N, n, p)
id_c2.1 <- id(a, N)

Com 3000 amostras:

# N = 3000

N <- 3000 # numero de amostras
p <- c(0.85, 0.05, 0.05, 0.05) # participacoes de mercado

set.seed(123)
a <- rmultinom(N, n, p)
id_c2.2 <- id(a, N)

Índices de dominância teóricos para essa configuração

# Calculo do valor teorico dos indices de dominancia
d1.t_c2 <- D1(n*p); d1.t_c2
## [1] 0.64
d2.t_c2 <- D2(n*p); d2.t_c2
## [1] 0.5
d3.t_c2 <- D3(n*p); d3.t_c2
## [1] 0.5762077
d4.t_c2 <- D4(n*p); d4.t_c2
## [1] 0.7335047
d5.t_c2 <- D5(n*p); d5.t_c2
## [1] 0.8767123
d6.t_c2 <- D6(n*p); d6.t_c2
## [1] 0.64
d7.t_c2 <- D7(n*p); d7.t_c2
## [1] 0.8

Entropias e variância das entropias

Hs <- -sum(p*log(p)) # entropia de shannon
Hr <- -log(sum(p^2)) # entropia de renyi com alpha = 2
Ht <- 1 - sum(p^2) # entropia de tsallis com alpha = 2
v_shannon <- ( sum(p*(log(p)^2)) -  (Hs^2) )/n 
v_renyi <- ( 4*( ((sum(p^2)^(-2)) * sum(p^3)) - 1 ) )/n  
v_tsallis <- ( 4*(sum(p^3) - (sum(p^2)^2)) )/n

Variâncias assintóticas de alguns índices de dominância

# Variancia teorica dos indices de dominancia

k <- length(p) # numero de empresas

v1 <- ((k/(k-1))^2) * v_tsallis # variancia do D1
v3 <- v_shannon/(log(k)^2) # variancia do D3
v6 <- ((k/(k-1))^2) * v_tsallis # variancia do D6

Plotagem

# Histogramas Caso 2 ------------------------------------------------------

# com N = 1000

medias <- c(d1.t_c2, NA, d3.t_c2, Hs, Hr, d6.t_c2, d1.t_c2)
variancias <- c(v1, NA, v3, v_shannon, v_renyi, v6, v1)
plotagem(id_c2.1, medias, variancias, k, 2, p)

# com N = 3000

medias <- c(d1.t_c2, NA, d3.t_c2, Hs, Hr, d6.t_c2, d1.t_c2)
variancias <- c(v1, NA, v3, v_shannon, v_renyi, v6, v1)
plotagem(id_c2.2, medias, variancias, k, 2, p)

Configuração 3

Com 1000 amostras:

n <- 1000 # tamanho de cada amostra

# N = 1000

N <- 1000 # numero de amostras
p <- c(0.35, 0.45, 0.1, 0.1) # participacoes de mercado

set.seed(123)
a <- rmultinom(N, n, p)
id_c3.1 <- id(a, N)

Com 3000 amostras:

# N = 3000

N <- 3000 # numero de amostras
p <- c(0.35, 0.45, 0.1, 0.1) # participacoes de mercado

set.seed(123)
a <- rmultinom(N, n, p)
id_c3.2 <- id(a, N)

Índices de dominância teóricos para essa configuração

# Calculo do valor teorico dos indices de dominancia
d1.t_c3 <- D1(n*p); d1.t_c3
## [1] 0.1266667
d2.t_c3 <- D2(n*p); d2.t_c3
## [1] 0.1604938
d3.t_c3 <- D3(n*p); d3.t_c3
## [1] 0.1435562
d4.t_c3 <- D4(n*p); d4.t_c3
## [1] 0.2406123
d5.t_c3 <- D5(n*p); d5.t_c3
## [1] 0.3671498
d6.t_c3 <- D6(n*p); d6.t_c3
## [1] 0.1266667
d7.t_c3 <- D7(n*p); d7.t_c3
## [1] 0.3559026

Entropias e variância das entropias

# Entropias teoricas

Hs <- -sum(p*log(p)) # entropia de shannon
Hr <- -log(sum(p^2)) # entropia de renyi com alpha = 2
Ht <- 1 - sum(p^2) # entropia de tsallis com alpha = 2
# variancia teorica das entropias

v_shannon <- ( sum(p*(log(p)^2)) -  (Hs^2) )/n 
v_renyi <- ( 4*( ((sum(p^2)^(-2)) * sum(p^3)) - 1 ) )/n 
v_tsallis <- ( 4*(sum(p^3) - (sum(p^2)^2)) )/n

Variâncias assintóticas de alguns índices de dominância

# Variancia teorica dos indices de dominancia

k <- length(p) # numero de empresas

v1 <- ((k/(k-1))^2) * v_tsallis # variancia do D1
v3 <- v_shannon/(log(k)^2) # variancia do D3
v6 <- ((k/(k-1))^2) * v_tsallis # variancia do D6

v1; v3; v6
## [1] 0.0001207111
## [1] 0.0001682834
## [1] 0.0001207111

Plotagem

# Histogramas Caso 3 ------------------------------------------------------

# com N = 1000

medias <- c(d1.t_c3, NA, d3.t_c3, Hs, Hr, d6.t_c3, d1.t_c3)
variancias <- c(v1, NA, v3, v_shannon, v_renyi, v6, v1)
plotagem(id_c3.1, medias, variancias, k, 3, p)

# com N = 3000

medias <- c(d1.t_c3, NA, d3.t_c3, Hs, Hr, d6.t_c3, d1.t_c3)
variancias <- c(v1, NA, v3, v_shannon, v_renyi, v6, v1)
plotagem(id_c3.2, medias, variancias, k, 3, p)

Configuração 4

Com 1000 amostras:

# Caso 4 ------------------------------------------------------------------

n <- 1000 # tamanho de cada amostra

# N = 1000

N <- 1000 # numero de amostras
p <-c(0.2, 0.2, 0.2, 0.05, 0.15, 0.2) # participacoes de mercado

set.seed(123)
a <- rmultinom(N, n, p)
id_c4.1 <- id(a, N)

Com 3000 amostras:

# N = 3000

N <- 3000 # numero de amostras
p <- c(0.2, 0.2, 0.2, 0.05, 0.15, 0.2) # participacoes de mercado

set.seed(123)
a <- rmultinom(N, n, p)
id_c4.2 <- id(a, N)

Índices de dominância teóricos para essa configuração

# Calculo do valor teorico dos indices de dominancia
d1.t_c4 <- D1(n*p); d1.t_c4
## [1] 0.022
d2.t_c4 <- D2(n*p); d2.t_c4
## [1] 0.03529412
d3.t_c4 <- D3(n*p); d3.t_c4
## [1] 0.03898655
d4.t_c4 <- D4(n*p); d4.t_c4
## [1] 0.08096464
d5.t_c4 <- D5(n*p); d5.t_c4
## [1] 0.1189189
d6.t_c4 <- D6(n*p); d6.t_c4
## [1] 0.022
d7.t_c4 <- D7(n*p); d7.t_c4
## [1] 0.148324

Entropias e variância das entropias

# Entropias teoricas

Hs <- -sum(p*log(p)) # entropia de shannon
Hr <- -log(sum(p^2)) # entropia de renyi com alpha = 2
Ht <- 1 - sum(p^2) # entropia de tsallis com alpha = 2
# variancia teorica das entropias
v_shannon <- ( sum(p*(log(p)^2)) -  (Hs^2) )/n 
v_renyi <- ( 4*( ((sum(p^2)^(-2)) * sum(p^3)) - 1 ) )/n 
v_tsallis <- ( 4*(sum(p^3) - (sum(p^2)^2)) )/n

Variâncias assintóticas de alguns índices de dominância

# Variancia teorica dos indices de dominancia

k <- length(p) # numero de empresas

v1 <- ((k/(k-1))^2) * v_tsallis # variancia do D1
v3 <- v_shannon/(log(k)^2) # variancia do D3
v6 <- ((k/(k-1))^2) * v_tsallis # variancia do D6

v1; v3; v6
## [1] 7.344e-06
## [1] 2.985792e-05
## [1] 7.344e-06

Plotagem

# Histogramas Caso 4 ------------------------------------------------------


# com N = 1000

medias <- c(d1.t_c4, NA, d3.t_c4, Hs, Hr, d6.t_c4, d1.t_c4)
variancias <- c(v1, NA, v3, v_shannon, v_renyi, v6, v1)
plotagem(id_c4.1, medias, variancias, k, 4, p)

# com N = 3000

medias <- c(d1.t_c4, NA, d3.t_c4, Hs, Hr, d6.t_c4, d1.t_c4)
variancias <- c(v1, NA, v3, v_shannon, v_renyi, v6, v1)
plotagem(id_c4.2, medias, variancias, k, 4, p)

Configuração 5

Com 1000 amostras:

# Caso 5 ------------------------------------------------------------------

n <- 1000 # tamanho de cada amostra

# N = 1000

N <- 1000 # numero de amostras
p <- c(0.01, 0.01, 0.01, 0.01, 0.01, 0.95) # participacoes de mercado

set.seed(123)
a <- rmultinom(N, n, p)
id_c5.1 <- id(a, N)

Com 3000 amostras:

# N = 3000

N <- 3000 # numero de amostras
p <- c(0.01, 0.01, 0.01, 0.01, 0.01, 0.95) # participacoes de mercado

set.seed(123)
a <- rmultinom(N, n, p)
id_c5.2 <- id(a, N)

Índices de dominância teóricos para essa configuração

# Calculo do valor teorico dos indices de dominancia
d1.t_c5 <- D1(n*p); d1.t_c5
## [1] 0.8836
d2.t_c5 <- D2(n*p); d2.t_c5
## [1] 0.7230769
d3.t_c5 <- D3(n*p); d3.t_c5
## [1] 0.8442943
d4.t_c5 <- D4(n*p); d4.t_c5
## [1] 0.9356419
d5.t_c5 <- D5(n*p); d5.t_c5
## [1] 0.9785161
d6.t_c5 <- D6(n*p); d6.t_c5
## [1] 0.8836
d7.t_c5 <- D7(n*p); d7.t_c5
## [1] 0.94

Entropias e variância das entropias

# Entropias teoricas

Hs <- -sum(p*log(p)) # entropia de shannon
Hr <- -log(sum(p^2)) # entropia de renyi com alpha = 2
Ht <- 1 - sum(p^2) # entropia de tsallis com alpha = 2
# variancia teorica das entropias

v_shannon <- ( sum(p*(log(p)^2)) -  (Hs^2) )/n 
v_renyi <- ( 4*( ((sum(p^2)^(-2)) * sum(p^3)) - 1 ) )/n 
v_tsallis <- ( 4*(sum(p^3) - (sum(p^2)^2)) )/n

Variâncias assintóticas de alguns índices de dominância

# Variancia teorica dos indices de dominancia

k <- length(p) # numero de empresas

v1 <- ((k/(k-1))^2) * v_tsallis # variancia do D1
v3 <- v_shannon/(log(k)^2) # variancia do D3
v6 <- ((k/(k-1))^2) * v_tsallis # variancia do D6

v1; v3; v6
## [1] 0.000241753
## [1] 0.0003068293
## [1] 0.000241753

Plotagem

# Histogramas Caso 5 ------------------------------------------------------

# com N = 1000

medias <- c(d1.t_c5, NA, d3.t_c5, Hs, Hr, d6.t_c5, d1.t_c5)
variancias <- c(v1, NA, v3, v_shannon, v_renyi, v6, v1)
plotagem(id_c5.1, medias, variancias, k, 5, p)

# com N = 3000

medias <- c(d1.t_c5, NA, d3.t_c5, Hs, Hr, d6.t_c5, d1.t_c5)
variancias <- c(v1, NA, v3, v_shannon, v_renyi, v6, v1)
plotagem(id_c5.2, medias, variancias, k, 5, p)

Configuração 6

Com 1000 amostras:

# Caso 6 ------------------------------------------------------------------

n <- 1000 # tamanho de cada amostra

# N = 1000

N <- 1000 # numero de amostras
p <- c(0.01, 0.01, 0.02, 0.02, 0.47, 0.47) # participacoes de mercado

set.seed(123)
a <- rmultinom(N, n, p)
id_c6.1 <- id(a, N)

Com 3000 amostras:

# N = 3000

N <- 3000 # numero de amostras
p <- c(0.01, 0.01, 0.02, 0.02, 0.47, 0.47) # participacoes de mercado

set.seed(123)
a <- rmultinom(N, n, p)
id_c6.2 <- id(a, N)

Índices de dominância teóricos para essa configuração

# Calculo do valor teorico dos indices de dominancia
d1.t_c6 <- D1(n*p); d1.t_c6
## [1] 0.33136
d2.t_c6 <- D2(n*p); d2.t_c6
## [1] 0.3172414
d3.t_c6 <- D3(n*p); d3.t_c6
## [1] 0.4651595
d4.t_c6 <- D4(n*p); d4.t_c6
## [1] 0.678545
d5.t_c6 <- D5(n*p); d5.t_c6
## [1] 0.7483288
d6.t_c6 <- D6(n*p); d6.t_c6
## [1] 0.33136
d7.t_c6 <- D7(n*p); d7.t_c6
## [1] 0.5756388

Entropias e variância das entropias

# Entropias teoricas

Hs <- -sum(p*log(p)) # entropia de shannon
Hr <- -log(sum(p^2)) # entropia de renyi com alpha = 2
Ht <- 1 - sum(p^2) # entropia de tsallis com alpha = 2
# variancia teorica das entropias

v_shannon <- ( sum(p*(log(p)^2)) -  (Hs^2) )/n 
v_renyi <- ( 4*( ((sum(p^2)^(-2)) * sum(p^3)) - 1 ) )/n  
v_tsallis <- ( 4*(sum(p^3) - (sum(p^2)^2)) )/n

Variâncias assintóticas de alguns índices de dominância

# Variancia teorica dos indices de dominancia

k <- length(p) # numero de empresas

v1 <- ((k/(k-1))^2) * v_tsallis # variancia do D1
v3 <- v_shannon/(log(k)^2) # variancia do D3
v6 <- ((k/(k-1))^2) * v_tsallis # variancia do D6

v1; v3; v6
## [1] 6.677084e-05
## [1] 0.0002036551
## [1] 6.677084e-05

Plotagem

# Histogramas Caso 6 ------------------------------------------------------

# com N = 1000

medias <- c(d1.t_c6, NA, d3.t_c6, Hs, Hr, d6.t_c6, d1.t_c6)
variancias <- c(v1, NA, v3, v_shannon, v_renyi, v6, v1)
plotagem(id_c6.1, medias, variancias, k, 6, p)

# com N = 3000

medias <- c(d1.t_c6, NA, d3.t_c6, Hs, Hr, d6.t_c6, d1.t_c6)
variancias <- c(v1, NA, v3, v_shannon, v_renyi, v6, v1)
plotagem(id_c6.2, medias, variancias, k, 6, p)

Configuração 7

Com 1000 amostras:

# Caso 7 ------------------------------------------------------------------

n <- 1000 # tamanho de cada amostra

# N = 1000

N <- 1000 # numero de amostras
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

set.seed(123)
a <- rmultinom(N, n, p)
id_c7.1 <- id(a, N)

Com 3000 amostras:

# N = 3000

N <- 3000 # numero de amostras
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

set.seed(123)
a <- rmultinom(N, n, p)
id_c7.2 <- id(a, N)

Índices de dominância teóricos para essa configuração

# Calculo do valor teorico dos indices de dominancia
d1.t_c7 <- D1(n*p); d1.t_c7
## [1] 0.001111111
d2.t_c7 <- D2(n*p); d2.t_c7
## [1] 0.005847953
d3.t_c7 <- D3(n*p); d3.t_c7
## [1] 0.002175106
d4.t_c7 <- D4(n*p); d4.t_c7
## [1] 0.00555094
d5.t_c7 <- D5(n*p); d5.t_c7
## [1] 0.0110011
d6.t_c7 <- D6(n*p); d6.t_c7
## [1] 0.001111111
d7.t_c7 <- D7(n*p); d7.t_c7
## [1] 0.03333333

Entropias e variância das entropias

# Entropias teoricas

Hs <- -sum(p*log(p)) # entropia de shannon
Hr <- -log(sum(p^2)) # entropia de renyi com alpha = 2
Ht <- 1 - sum(p^2) # entropia de tsallis com alpha = 2
# variancia teorica das entropias

v_shannon <- ( sum(p*(log(p)^2)) -  (Hs^2) )/n 
v_renyi <- ( 4*( ((sum(p^2)^(-2)) * sum(p^3)) - 1 ) )/n 
v_tsallis <- ( 4*(sum(p^3) - (sum(p^2)^2)) )/n

Variâncias assintóticas de alguns índices de dominância

# Variancia teorica dos indices de dominancia

k <- length(p) # numero de empresas

v1 <- ((k/(k-1))^2) * v_tsallis # variancia do D1
v3 <- v_shannon/(log(k)^2) # variancia do D3
v6 <- ((k/(k-1))^2) * v_tsallis # variancia do D6

Plotagem

# Histogramas Caso 7 ------------------------------------------------------

# com N = 1000

medias <- c(d1.t_c7, NA, d3.t_c7, Hs, Hr, d6.t_c7, d1.t_c7)
variancias <- c(v1, NA, v3, v_shannon, v_renyi, v6, v1)
plotagem(id_c7.1, medias, variancias, k, 7, p)

# com N = 3000

medias <- c(d1.t_c7, NA, d3.t_c7, Hs, Hr, d6.t_c7, d1.t_c7)
variancias <- c(v1, NA, v3, v_shannon, v_renyi, v6, v1)
plotagem(id_c7.2, medias, variancias, k, 7, p)

Configuração 8

Com 1000 amostras:

# Caso 8 ------------------------------------------------------------------

n <- 1000 # tamanho de cada amostra

# N = 1000

N <- 1000 # numero de amostras
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

set.seed(123)
a <- rmultinom(N, n, p)
id_c8.1 <- id(a, N)

Com 3000 amostras:

# N = 3000

N <- 3000 # numero de amostras
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

set.seed(123)
a <- rmultinom(N, n, p)
id_c8.2 <- id(a, N)

Índices de dominância teóricos para essa configuração

# Calculo do valor teorico dos indices de dominancia
d1.t_c8 <- D1(n*p)
d2.t_c8 <- D2(n*p)
d3.t_c8 <- D3(n*p)
d4.t_c8 <- D4(n*p)
d5.t_c8 <- D5(n*p)
d6.t_c8 <- D6(n*p)
d7.t_c8 <- D7(n*p)

Entropias e variância das entropias

# Entropias teoricas

Hs <- -sum(p*log(p)) # entropia de shannon
Hr <- -log(sum(p^2)) # entropia de renyi com alpha = 2
Ht <- 1 - sum(p^2) # entropia de tsallis com alpha = 2
# variancia teorica das entropias

v_shannon <- ( sum(p*(log(p)^2)) -  (Hs^2) )/n 
v_renyi <- ( 4*( ((sum(p^2)^(-2)) * sum(p^3)) - 1 ) )/n
v_tsallis <- ( 4*(sum(p^3) - (sum(p^2)^2)) )/n

Variâncias assintóticas de alguns índices de dominância

# Variancia teorica dos indices de dominancia

k <- length(p) # numero de empresas

v1 <- ((k/(k-1))^2) * v_tsallis # variancia do D1
v3 <- v_shannon/(log(k)^2) # variancia do D3
v6 <- ((k/(k-1))^2) * v_tsallis # variancia do D6

Plotagem

# Histogramas Caso 8 ------------------------------------------------------

# com N = 1000

medias <- c(d1.t_c8, NA, d3.t_c8, Hs, Hr, d6.t_c8, d1.t_c8)
variancias <- c(v1, NA, v3, v_shannon, v_renyi, v6, v1)
plotagem(id_c8.1, medias, variancias, k, 8, p)

# com N = 3000

medias <- c(d1.t_c8, NA, d3.t_c8, Hs, Hr, d6.t_c8, d1.t_c8)
variancias <- c(v1, NA, v3, v_shannon, v_renyi, v6, v1)
plotagem(id_c8.2, medias, variancias, k, 8, p)

Configuração 9

Com 1000 amostras:

# Caso 9 ------------------------------------------------------------------

n <- 1000 # tamanho de cada amostra

# N = 1000

N <- 1000 # numero de amostras
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

set.seed(123)
a <- rmultinom(N, n, p)
id_c9.1 <- id(a, N)

Com 3000 amostras:

# N = 3000

N <- 3000 # numero de amostras
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

set.seed(123)
a <- rmultinom(N, n, p)
id_c9.2 <- id(a, N)

Índices de dominância teóricos para essa configuração

# Calculo do valor teorico dos indices de dominancia
d1.t_c9 <- D1(n*p); d1.t_c9
## [1] 0.3602222
d2.t_c9 <- D2(n*p); d2.t_c9
## [1] 0.2885691
d3.t_c9 <- D3(n*p); d3.t_c9
## [1] 0.5298316
d4.t_c9 <- D4(n*p); d4.t_c9
## [1] 0.7830718
d5.t_c9 <- D5(n*p); d5.t_c9
## [1] 0.8491802
d6.t_c9 <- D6(n*p); d6.t_c9
## [1] 0.3602222
d7.t_c9 <- D7(n*p); d7.t_c9
## [1] 0.6001852

Entropias e variância das entropias

# Entropias teoricas

Hs <- -sum(p*log(p)) # entropia de shannon
Hr <- -log(sum(p^2)) # entropia de renyi com alpha = 2
Ht <- 1 - sum(p^2) # entropia de tsallis com alpha = 2
# variancia teorica das entropias

v_shannon <- ( sum(p*(log(p)^2)) -  (Hs^2) )/n 
v_renyi <- ( 4*( ((sum(p^2)^(-2)) * sum(p^3)) - 1 ) )/n 
v_tsallis <- ( 4*(sum(p^3) - (sum(p^2)^2)) )/n

Variâncias assintóticas de alguns índices de dominância

# Variancia teorica dos indices de dominancia

k <- length(p) # numero de empresas

v1 <- ((k/(k-1))^2) * v_tsallis # variancia do D1
v3 <- v_shannon/(log(k)^2) # variancia do D3
v6 <- ((k/(k-1))^2) * v_tsallis # variancia do D6

Plotagem

# Histogramas Caso 9 ------------------------------------------------------

# com N = 1000

medias <- c(d1.t_c9, NA, d3.t_c9, Hs, Hr, d6.t_c9, d1.t_c9)
variancias <- c(v1, NA, v3, v_shannon, v_renyi, v6, v1)
plotagem(id_c9.1, medias, variancias, k, 9, p)

# com N = 3000

medias <- c(d1.t_c9, NA, d3.t_c9, Hs, Hr, d6.t_c9, d1.t_c9)
variancias <- c(v1, NA, v3, v_shannon, v_renyi, v6, v1)
plotagem(id_c9.2, medias, variancias, k, 9, p)

6 Teste de Normalidade - Jarque-Bera

Cenario D1 D2 D3 D4 D5 D6 D7
1.1 <= 0.01 <= 0.01 <= 0.01 <= 0.01 <= 0.01 <= 0.01 <= 0.01
1.2 <= 0.01 <= 0.01 <= 0.01 <= 0.01 <= 0.01 <= 0.01 <= 0.01
2.1 0.8662 0.0394 0.5733 0.9825 0.3588 0.8662 0.9799
2.2 0.7659 <= 0.01 0.4954 0.4261 <= 0.01 0.7659 0.4553
3.1 0.4336 0.3167 0.2818 0.6137 0.6111 0.4336 0.6648
3.2 0.0978 0.0423 0.1129 0.6525 0.2137 0.0978 0.2769
4.1 0.0234 0.2645 <= 0.01 <= 0.01 0.1041 0.0234 0.3331
4.2 0.0249 0.0568 <= 0.01 <= 0.01 0.2465 0.0249 0.1913
5.1 0.4024 0.1498 0.4453 0.2425 0.061 0.4024 0.2704
5.2 0.1188 0.5659 0.8601 0.0303 <= 0.01 0.1188 0.0296
6.1 0.7695 0.6862 0.8501 0.6228 0.2291 0.7695 0.5441
6.2 0.1057 0.2306 0.3721 0.0842 <= 0.01 0.1057 0.02
7.1 <= 0.01 0.1188 <= 0.01 <= 0.01 <= 0.01 <= 0.01 0.3753
7.2 <= 0.01 <= 0.01 <= 0.01 <= 0.01 <= 0.01 <= 0.01 <= 0.01
8.1 0.4076 <= 0.01 0.1323 0.8805 0.9358 0.4076 0.6641
8.2 0.7186 <= 0.01 0.2427 0.5759 0.1812 0.7186 0.975
9.1 0.1504 0.1821 0.1957 0.1038 0.0379 0.1504 0.1086
9.2 0.1227 <= 0.01 0.1024 0.032 <= 0.01 0.1227 0.0701

7 Erro Quadrático Médio

caso melhor segundo_melhor
1.1 D6 D1
1.2 D6 D1
2.1 D5 D7
2.2 D5 D7
3.1 D6 D1
3.2 D6 D1
4.1 D1 D6
4.2 D1 D6
5.1 D5 D7
5.2 D5 D7
6.1 D5 D7
6.2 D5 D7
7.1 D1 D6
7.2 D1 D6
8.1 D5 D4
8.2 D5 D4
9.1 D5 D7
9.2 D5 D7

8 Coeficiente de variação

caso melhor segundo_melhor
1.1 D7 D2
1.2 D7 D2
2.1 D5 D7
2.2 D5 D7
3.1 D7 D5
3.2 D7 D5
4.1 D7 D2
4.2 D7 D2
5.1 D5 D7
5.2 D5 D7
6.1 D5 D7
6.2 D5 D7
7.1 D7 D2
7.2 D7 D2
8.1 D5 D4
8.2 D5 D4
9.1 D5 D7
9.2 D5 D7
LS0tDQp0aXRsZTogJ1NpbXVsYcOnw6NvIC0gw41uZGljZXMgZGUgZG9taW7Dom5jaWEnDQphdXRob3I6ICcqSm9uYXMgRnJlaXJlIFJpYmVpcm8qJw0KZGF0ZTogImByIGZvcm1hdChTeXMuRGF0ZSgpLCAnKiVkIGRlICVCLCAgJVkqJylgIg0KbGluay1jaXRhdGlvbnM6IHRydWUNCmxhbmc6ICJwdC1iciINCm91dHB1dDoNCiAgaHRtbF9kb2N1bWVudDoNCiAgICB0aGVtZToNCiAgICAgIGJvb3Rzd2F0Y2g6IGZsYXRseQ0KICAgIGhpZ2hsaWdodDogYnJlZXplZGFyaw0KICAgIHRvYzogdHJ1ZQ0KICAgIHRvY19mbG9hdDogdHJ1ZQ0KICAgIHRvY19kZXB0aDogNA0KICAgIG51bWJlcl9zZWN0aW9uczogdHJ1ZQ0KICAgIGFuY2hvcl9zZWN0aW9uczogdHJ1ZQ0KICAgIGNvZGVfZm9sZGluZzogc2hvdw0KICAgIGNvZGVfZG93bmxvYWQ6IHRydWUNCiAgICBmaWdfY2FwdGlvbjogdHJ1ZQ0KICAgIGNpdGF0aW9uX3BhY2thZ2U6IGJpYmxhdGV4DQotLS0NCg0KYGBge3IgaW5jbHVkZT1GQUxTRX0NCiMgcGFjb3Rlcw0KDQpsaWJyYXJ5KHRzZXJpZXMpICMgcHJhIGZhemVyIG8gdGVzdGUgZGUgSmFycXVlLUJlcmENCmxpYnJhcnkoY2FyKSAjIHBybyBxcVBsb3QgY29tIGFzIGJhbmRhcw0KYGBgDQoNCiMgw41uZGljZXMgZGUgRG9taW7Dom5jaWEgey50YWJzZXQgLnRhYnNldC1mYWRlfQ0KIyMgJERfMSQgey51bmxpc3RlZCAudW5udW1iZXJlZH0NCg0Kw41uZGljZSBkZSBkb21pbsOibmNpYSAkRF8xJDoNCiQkRDEgPSBcdGV4dHtOb3JtfShISEkpID0gXGZyYWN7ayBcc3VtX3tpPTF9XntrfSBwX2leMiAtIDF9e2sgLSAxfSQkDQpgYGB7cn0NCkQxIDwtIGZ1bmN0aW9uKHgpew0KICBuIDwtIHN1bSh4KSAjIG51bWVybyB0b3RhbCBkZSB2ZW5kYXMNCiAgcHJvcCA8LSB4L24gIyBwYXJ0aWNpcGFjb2VzIGRlIG1lcmNhZG8NCiAgayA8LSBsZW5ndGgoeCkgIyBudW1lcm8gZGUgZW1wcmVzYXMNCiAgDQogIEhISSA8LSBzdW0ocHJvcF4yKSAjIGluZGljZSBkZSBIZXJmaW5kYWhs4oCTSGlyc2NobWFuDQogIA0KICBEMSA8LSAoaypISEkgLSAxKS8oay0xKQ0KICByZXR1cm4oRDEpDQp9DQpgYGANCg0KIyMgJERfMiQgey51bmxpc3RlZCAudW5udW1iZXJlZH0NCg0Kw41uZGljZSBkZSBSb3NlbmJsdXRo4oCTSGFsbOKAk1RpZGVtYW5uOiANCiQkXGJlZ2lue2FsaWduKn0NCgkJSV97XHRleHR7Um9zfX0gJj0gXGZyYWN7MX17MlxzdW1fe2k9MX1ee2t9IGlcLHBfeyhpKX0gLSAxfSANCglcZW5ke2FsaWduKn0kJA0KCQ0Kw41uZGljZSBkZSBkb21pbsOibmNpYSAkRF8yJDoNCiQkXGJlZ2lue2FsaWduKn0NCgkJRF8yICY9IFxmcmFje0lfe1x0ZXh0e1Jvc319IC0gMS9rfXsxLSBcZnJhY3sxfXtrfX0gXFwNCgkJJj0gXGZyYWN7ayBJX3tcdGV4dHtSb3N9fSAtIDF9e2sgLSAxfS4NCglcZW5ke2FsaWduKn0kJA0KCQ0KYGBge3J9DQpEMiA8LSBmdW5jdGlvbih4KXsNCiAgbiA8LSBzdW0oeCkgIyB0b3RhbCBkZSB2ZW5kYXMNCiAgcHJvcCA8LSB4L24gIyBwYXJ0aWNpcGFjb2VzIGRlIG1lcmNhZG8NCiAgcHJvcF9PIDwtIHNvcnQocHJvcCwgZGVjcmVhc2luZyA9IFQpICMgcGFydGljaXBhY29lcyBkZSBtZXJjYWRvIG9yZGVuYWRhcw0KICBwZXNvcyA8LSBzZXFfYWxvbmcocHJvcF9PKSAjIGluZGljZXMgZGFzIHBhcnRpY2lwYWNvZXMgZGUgbWVyY2FkbyBvcmRlbmFkYXMNCiAgayA8LSBsZW5ndGgoeCkgIyBudW1lcm8gZGUgZW1wcmVzYXMNCiAgDQogIElyb3MgPC0gMS8oMipzdW0ocGVzb3MqcHJvcF9PKSAtIDEpICMgaW5kaWNlIGRlIFJvc2VuYmx1dGjigJNIYWxs4oCTVGlkZW1hbm4NCiAgDQogIEQyIDwtIChrKklyb3MgLSAxKS8oayAtIDEpDQogIHJldHVybihEMikNCn0NCmBgYA0KDQojIyAkRF8zJCB7LnVubGlzdGVkIC51bm51bWJlcmVkfQ0KDQpFbnRyb3BpYSBkZSBTaGFubm9uOg0KJCRcYmVnaW57YWxpZ24qfQ0KCQlIX3MgPSAtXHN1bV97aT0xfV57a31wX2lcbG4gcF9pLg0KCVxlbmR7YWxpZ24qfSAkJA0KDQrDjW5kaWNlIGRlIGRvbWluw6JuY2lhICREXzMkOg0KJCRcYmVnaW57YWxpZ24qfQ0KCQlEXzMgJj0gMSAtIFx0ZXh0e05vcm19KEhfcykgXFwNCgkJJj0gMSAtIFxmcmFje0hfc317XGxuIGt9DQoJXGVuZHthbGlnbip9JCQNCgkNCmBgYHtyfQ0KRDMgPC0gZnVuY3Rpb24oeCl7DQogIG4gPC0gc3VtKHgpICMgdG90YWwgZGUgdmVuZGFzDQogIHByb3AgPC0geC9uICMgcGFydGljaXBhY29lcyBkZSBtZXJjYWRvDQogIGsgPC0gbGVuZ3RoKHgpICMgbnVtZXJvIGRlIGVtcHJlc2FzDQogIA0KICBIcyA8LSAtc3VtKHByb3AqbG9nKHByb3ApLCBuYS5ybSA9IFQpICMgZW50cm9waWEgZGUgc2hhbm5vbg0KICBIc05vcm0gPC0gSHMvbG9nKGspICMgZW50cm9waWEgZGUgc2hhbm5vbiBub3JtYWxpemFkYQ0KICANCiAgRDMgPC0gMSAtIEhzTm9ybQ0KICByZXR1cm4oRDMpDQp9DQpgYGANCg0KDQojIyAkRF80JCB7LnVubGlzdGVkIC51bm51bWJlcmVkfQ0Kw41uZGljZSBkZSBIZWlwOg0KJCRcYmVnaW57YWxpZ24qfQ0KCQlJX3tcdGV4dHtIZWlwfX0gJj0gXGZyYWN7ZV57SF9TfSAtIDF9e2sgLSAxfSwNCglcZW5ke2FsaWduKn0kJA0KDQrDjW5kaWNlIGRlIGRvbWluw6JuY2lhICREXzQkOg0KJCRcYmVnaW57YWxpZ24qfQ0KCQlEXzQgJj0gMSAtIElfe1x0ZXh0e0hlaXB9fSBcXA0KCQkmPSBcZnJhY3trIC0gZV57SF9TfX17ayAtIDF9DQoJXGVuZHthbGlnbip9JCQNCg0KYGBge3J9DQpENCA8LSBmdW5jdGlvbih4KXsNCiAgbiA8LSBzdW0oeCkgIyB0b3RhbCBkZSB2ZW5kYXMNCiAgcHJvcCA8LSB4L24gIyBwYXJ0aWNpcGFjb2VzIGRlIG1lcmNhZG8NCiAgayA8LSBsZW5ndGgoeCkgIyBudW1lcm8gZGUgZW1wcmVzYXMNCiAgDQogIEhzIDwtIC1zdW0ocHJvcCpsb2cocHJvcCksIG5hLnJtID0gVCkgIyBlbnRyb3BpYSBkZSBzaGFubm9uDQogIEloZWlwIDwtIChleHAoSHMpIC0gMSkvKGsgLSAxKSAjIGluZGljZSBkZSBIZWlwDQogIA0KICBENCA8LSAxIC0gSWhlaXANCiAgcmV0dXJuKEQ0KQ0KfQ0KYGBgDQoNCiMjICREXzUkIHsudW5saXN0ZWQgLnVubnVtYmVyZWR9DQoNCsONbmRpY2UgZGUgSGFubmFoLUtheToNCiQkXGJlZ2lue2FsaWduKn0NCgkJSV97SEt9KFxhbHBoYSkgJj0gXGxlZnQoIFxzdW1fe2k9MX1ee2t9IHBfaV5cYWxwaGEgXHJpZ2h0KV57XGZyYWN7MX17MS1cYWxwaGF9fSwgXHF1YWQgXGFscGhhPjAsIFxhbHBoYSBcbmVxIDEuDQoJXGVuZHthbGlnbip9JCQNCg0Kw41uZGljZSBkZSBkb21pbsOibmNpYSAkRF81JDoNCiQkXGJlZ2lue2FsaWduKn0NCgkJRF81ICY9IFxmcmFje2sgLSBJX3tIS30oMil9e2sgLSAxfVxcDQoJCSY9IFxmcmFje2tcc3VtX3tpPTF9XmtwX2leMiAtIDF9eyhrLTEpXHN1bV97aT0xfV5rcF9pXjJ9DQoJCVxlbmR7YWxpZ24qfSQkDQpgYGB7cn0NCkQ1IDwtIGZ1bmN0aW9uKHgpew0KICBuIDwtIHN1bSh4KSAjIHRvdGFsIGRlIHZlbmRhcw0KICBwcm9wIDwtIHgvbiAjIHBhcnRpY2lwYWNvZXMgZGUgbWVyY2Fkbw0KICBrIDwtIGxlbmd0aCh4KSAjIG51bWVybyBkZSBlbXByZXNhcw0KICANCiAgSWhrIDwtIDEvc3VtKHByb3BeMikgIyBpbmRpY2UgZGUgSGFubmFoLUtheQ0KICANCiAgRDUgPC0gKGsgLSBJaGspLyhrLTEpDQogIHJldHVybihENSkNCn0NCmBgYA0KDQojIyAkRF82JCB7LnVubGlzdGVkIC51bm51bWJlcmVkfQ0KDQpFc3RhdMOtc3RpY2EgJFZBJDoNCiQkXGJlZ2lue2FsaWduKn0NCgkJVkEgJj0gMSAtIA0KCQlcZnJhY3tcZGlzcGxheXN0eWxlIFxzdW1fe2k9MX1ee2t9IFxsZWZ0KGZfaSAtIFxmcmFje259e2t9XHJpZ2h0KV4yfQ0KCQl7bl4yIFxmcmFjeyhrLTEpfXtrfX0sDQoJXGVuZHthbGlnbip9JCQNCg0Kw41uZGljZSBkZSBkb21pbsOibmNpYSAkRF82JDoNCiQkXGJlZ2lue2FsaWduKn0NCgkgCURfNiAmPSAxIC0gVkFcXA0KCSAJJj0gXGZyYWN7a317ay0xfSBcbGVmdCggXHN1bV97aT0xfV57a30gcF9pXjIgLSBcZnJhY3sxfXtrfSBccmlnaHQpDQoJIFxlbmR7YWxpZ24qfSQkDQoJIA0KYGBge3J9DQpENiA8LSBmdW5jdGlvbih4KXsNCiAgbiA8LSBzdW0oeCkgIyB0b3RhbCBkZSB2ZW5kYXMNCiAgayA8LSBsZW5ndGgoeCkgIyBudW1lcm8gZGUgZW1wcmVzYXMNCiAgDQogIFZBIDwtIDEgLSAoIHN1bSggKHggLSAobi9rKSleMiApLyggKCAobl4yKSooay0xKSApL2sgKSApICMgZXN0YXRpc3RpY2EgVkENCiAgDQogIEQ2IDwtIDEgLSBWQQ0KICByZXR1cm4oRDYpDQp9DQpgYGANCg0KIyMgJERfNyQgey51bmxpc3RlZCAudW5udW1iZXJlZH0NCg0KRXN0YXTDrXN0aWNhICRTREEkOg0KJCRcYmVnaW57YWxpZ24qfQ0KCQlTREEgJj0gMSAtIA0KCQlcc3FydHtcZnJhY3tcZGlzcGxheXN0eWxlIFxzdW1fe2k9MX1ee2t9IFxsZWZ0KGZfaSAtIFxmcmFje259e2t9XHJpZ2h0KV4yfQ0KCQl7bl4yIFxmcmFjeyhrLTEpfXtrfX19DQoJXGVuZHthbGlnbip9JCQNCg0KSW5kaWNlIGRlIGRvbWluw6JuY2lhICREXzckOg0KJCRcYmVnaW57YWxpZ24qfQ0KCQlEXzcgJj0gMSAtIFNEQSBcXFs2cHRdDQoJCSY9IFxzcXJ0e1xmcmFje2t9e2stMX0gXGxlZnQoXHN1bV97aT0xfV57a30gcF9pXjIgLSBcZnJhY3sxfXtrfVxyaWdodCl9IA0KCVxlbmR7YWxpZ24qfSQkDQoJDQpgYGB7cn0NCkQ3IDwtIGZ1bmN0aW9uKHgpew0KICBuIDwtIHN1bSh4KSAjIHRvdGFsIGRlIHZlbmRhcw0KICBrIDwtIGxlbmd0aCh4KSAjIG51bWVybyBkZSBlbXByZXNhcw0KICANCiAgU0RBIDwtIDEgLSBzcXJ0KCBzdW0oICh4IC0gKG4vaykpXjIgKS8oICggKG5eMikqKGstMSkgKS9rICkgKSAjIGVzdGF0aXN0aWNhIFNEQQ0KICANCiAgRDcgPC0gMSAtIFNEQQ0KICByZXR1cm4oRDcpDQp9DQpgYGANCg0KIyBSZWxhw6fDtWVzIGVudHJlIG9zIMOtbmRpY2VzIGRlIGRvbWluw6JuY2lhDQoNCiMjIEVudHJlIG9zIMOtbmRpY2VzIHF1ZSBkZXBlbmRlbSBkZSAkSEhJJCB7LnVubGlzdGVkIC51bm51bWJlcmVkfQ0KU29tZW50ZSAkRF8xLCBcOyBEXzUsICBcOyBEXzZcOyBcdGV4dHsgZSB9IFw7IERfNyQgZGVwZW5kZW0gZGUgJEhISSQ6DQokJFxiZWdpbnthbGlnbip9DQogICZEXzEgPSBEXzZcXA0KICAmRF83ID0gXHNxcnR7RF82fSA9IFxzcXJ0e0RfMX1cXA0KICAmRF81ID0gXGZyYWN7RF8xfXtISEl9PSBcZnJhY3tEXzZ9e0hISX1cXA0KICAmRF81ID0gXGZyYWN7RF83XjJ9e0hISX0NClxlbmR7YWxpZ24qfSQkDQoNCiMjIEVudHJlIG9zIMOtbmRpY2VzIHF1ZSBkZXBlbmRlbSBkZSAkSF9TJCB7LnVubGlzdGVkIC51bm51bWJlcmVkfQ0KU29tZW50ZSAkRF8zIFw7IFx0ZXh0eyBlIH0gXDsgRF80JCBkZXBlbmRlbSBkZSAkSF9TJDoNCiQkXGJlZ2lue2FsaWduKn0NCiAgJkRfNCA9IFxmcmFje2t9e2sgLSAxfSgxIC0gZV57MS1EXzN9KQ0KXGVuZHthbGlnbip9JCQNCg0KIyBJbnRlcnZhbG9zIHBhcmEgb3Mgw61uZGljZXMgZGUgZG9taW7Dom5jaWENClNhYmUtc2UgcXVlIA0KJCRcYmVnaW57YWxpZ24qfQ0KICBISEkgJjwgMCwwMSBccmlnaHRhcnJvdyBcdGV4dHthbHRhIGNvbXBldGl0aXZpZGFkZX1cXA0KICAwLDAxIFxsZXEgSEhJICY8IDAsMTUgXHJpZ2h0YXJyb3cgXHRleHR7cG91Y28gY29uY2VudHJhZG99XFwNCiAgMCwxNSBcbGVxIEhISSAmPCAwLDI1IFxyaWdodGFycm93IFx0ZXh0e2NvbmNlbnRyYcOnw6NvIG3DqWRpYX1cXA0KICBISEkgJlxnZXEgMC4yNSBccmlnaHRhcnJvdyBcdGV4dHthbHRhIGNvbmNlbnRyYcOnw6NvfS4NClxlbmR7YWxpZ24qfSQkDQpQZWxhIHJlbGHDp8OjbyBlbnRyZSAkSEhJJCwgJERfMSBcOyBcdGV4dHsgZSB9IFw7ICBEXzYkLCB0ZW1vcyBxdWU6DQokJFxiZWdpbnthbGlnbip9DQogIERfMSA9IERfNiAmPCBcZnJhY3swLDAxayAtIDF9e2sgLSAxfSBccmlnaHRhcnJvdyBcdGV4dHthbHRhIGNvbXBldGl0aXZpZGFkZX1cXA0KICBcZnJhY3swLDAxayAtIDF9e2sgLSAxfSBcbGVxIERfMSA9IERfNiAmPCBcZnJhY3swLDE1ayAtIDF9e2sgLSAxfSBccmlnaHRhcnJvdyBcdGV4dHtwb3VjbyBjb25jZW50cmFkb31cXA0KICBcZnJhY3swLDE1ayAtIDF9e2sgLSAxfSBcbGVxIERfMSA9IERfNiAmPCBcZnJhY3swLDI1ayAtIDF9e2sgLSAxfSBccmlnaHRhcnJvdyBcdGV4dHtjb25jZW50cmHDp8OjbyBtw6lkaWF9XFwNCiAgRF8xID0gRF82ICZcZ2VxIFxmcmFjezAsMjVrIC0gMX17ayAtIDF9IFxyaWdodGFycm93IFx0ZXh0e2FsdGEgY29uY2VudHJhw6fDo299DQpcZW5ke2FsaWduKn0kJA0KDQpQZWxhIHJlbGHDp8OjbyBlbnRyZSAkRF8xJCwgJERfNiQgZSAkRF83JCwgdGVtb3MgcXVlOg0KJCRcYmVnaW57YWxpZ24qfQ0KICBEXzcgJjwgXHNxcnR7XGZyYWN7MCwwMWsgLSAxfXtrIC0gMX19IFxyaWdodGFycm93IFx0ZXh0e2FsdGEgY29tcGV0aXRpdmlkYWRlfVxcDQogIFxzcXJ0e1xmcmFjezAsMDFrIC0gMX17ayAtIDF9fSBcbGVxIERfNyAmPCBcc3FydHtcZnJhY3swLDE1ayAtIDF9e2sgLSAxfX0gXHJpZ2h0YXJyb3cgXHRleHR7cG91Y28gY29uY2VudHJhZG99XFwNCiAgXHNxcnR7XGZyYWN7MCwxNWsgLSAxfXtrIC0gMX19IFxsZXEgRF83ICY8IFxzcXJ0e1xmcmFjezAsMjVrIC0gMX17ayAtIDF9fSBccmlnaHRhcnJvdyBcdGV4dHtjb25jZW50cmHDp8OjbyBtw6lkaWF9XFwNCiAgRF83ICZcZ2VxIFxzcXJ0e1xmcmFjezAsMjVrIC0gMX17ayAtIDF9fSBccmlnaHRhcnJvdyBcdGV4dHthbHRhIGNvbmNlbnRyYcOnw6NvfQ0KXGVuZHthbGlnbip9JCQNCg0KUGVsYSByZWxhw6fDo28gZW50cmUgJERfNSQgZSAkSEhJJCwgdGVtb3MgcXVlOg0KJCRcYmVnaW57YWxpZ24qfQ0KICBEXzUgJjwgXGZyYWN7MCwwMWsgLSAxfXswLDAxKGsgLSAxKX0gXHJpZ2h0YXJyb3cgXHRleHR7YWx0YSBjb21wZXRpdGl2aWRhZGV9XFwNCiAgXGZyYWN7MCwwMWsgLSAxfXswLDAxKGsgLSAxKX0gXGxlcSBEXzUgJjwgXGZyYWN7MCwxNWsgLSAxfXswLDE1KGsgLSAxKX0gXHJpZ2h0YXJyb3cgXHRleHR7cG91Y28gY29uY2VudHJhZG99XFwNCiAgXGZyYWN7MCwxNWsgLSAxfXswLDE1KGsgLSAxKX0gXGxlcSBEXzUgJjwgXGZyYWN7MCwyNWsgLSAxfXswLDI1KGsgLSAxKX0gXHJpZ2h0YXJyb3cgXHRleHR7Y29uY2VudHJhw6fDo28gbcOpZGlhfVxcDQogIERfNSAmXGdlcSBcZnJhY3swLDI1ayAtIDF9ezAsMjUoayAtIDEpfSBccmlnaHRhcnJvdyBcdGV4dHthbHRhIGNvbmNlbnRyYcOnw6NvfQ0KXGVuZHthbGlnbip9JCQNCg0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCiMgRnVuY2FvIHBhcmEgY2FsY3VsYXIgdG9kb3Mgb3MgaW5kaWNlcyBkZSBkb21pbmFuY2lhIC0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQppZCA8LSBmdW5jdGlvbih4LCBOKXsgIyB4ID0gbWF0cml6IGNvbSBOIGFtb3N0cmFzDQogICAgICAgICAgICAgICAgICAgICAgIyBOID0gbnVtZXJvIGRlIGFtb3N0cmFzDQogIA0KICBkb21pbmFuY2lhIDwtIG1hdHJpeCgwLCBuY29sID0gNywgbnJvdyA9IE4pICMgbWF0cml6IHF1ZSB2YWkgcmVjZWJlciBvcyBpbmRpY2VzDQogIGNvbG5hbWVzKGRvbWluYW5jaWEpIDwtIGMoIkQxIiwgIkQyIiwgIkQzIiwgIkQ0IiwgIkQ1IiwgIkQ2IiwgIkQ3IikNCiAgDQogIGZvcihpIGluIDE6Til7DQogICAgZG9taW5hbmNpYVtpLCAxXSA8LSBEMSh4WyxpXSkNCiAgICBkb21pbmFuY2lhW2ksIDJdIDwtIEQyKHhbLGldKQ0KICAgIGRvbWluYW5jaWFbaSwgM10gPC0gRDMoeFssaV0pDQogICAgZG9taW5hbmNpYVtpLCA0XSA8LSBENCh4WyxpXSkNCiAgICBkb21pbmFuY2lhW2ksIDVdIDwtIEQ1KHhbLGldKQ0KICAgIGRvbWluYW5jaWFbaSwgNl0gPC0gRDYoeFssaV0pDQogICAgZG9taW5hbmNpYVtpLCA3XSA8LSBENyh4WyxpXSkNCiAgfQ0KICByZXR1cm4oZG9taW5hbmNpYSkNCn0NCmBgYA0KDQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KIyBGdW5jYW8gcGFyYSBwbG90YWdlbSBkZSBoaXN0b2dyYW1hcyBlIGN1cnZhcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCnBsb3RhZ2VtIDwtIGZ1bmN0aW9uKGRhZG9zLCBtZWRpYXMsIHZhcmlhbmNpYXMsIGssIGNhc28sIHApIHsNCiAgcGFyKG1mcm93ID0gYygzLCAzKSwgbWFyID0gYygzLCAzLCAyLCAxKSkNCiAgDQogIHRpcG9zIDwtIGMoIm5vcm0iLCBOQSwgIm5vcm0iLCAiZjEiLCAiZjEiLCAibm9ybSIsICJmMiIpDQogIA0KICBmb3IgKGkgaW4gMTo3KSB7DQogICAgaGlzdChkYWRvc1ssIGldLA0KICAgICAgICAgbWFpbiA9IHBhc3RlMCgiSGlzdG9ncmFtYSBkZSBEIiwgaSksDQogICAgICAgICBjb2wgPSAibGlnaHRncmVlbiIsIHhsYWIgPSBwYXN0ZTAoIkQiLCBpKSwNCiAgICAgICAgIHlsYWIgPSAiRGVuc2lkYWRlIiwgZnJlcSA9IEZBTFNFLCBib3JkZXIgPSAid2hpdGUiKQ0KICAgIA0KICAgICMgY3VydmEgZW1ww61yaWNhDQogICAgbGluZXMoZGVuc2l0eShkYWRvc1ssIGldKSwgbHdkID0gMiwgY29sID0gImJsdWUiKQ0KICAgIA0KICAgICMgY3VydmEgdGXDs3JpY2ENCiAgICBpZiAoIWlzLm5hKHRpcG9zW2ldKSkgew0KICAgICAgaWYgKHRpcG9zW2ldID09ICJub3JtIikgew0KICAgICAgICBjdXJ2ZShkbm9ybSh4LCBtZWRpYXNbaV0sIHNxcnQodmFyaWFuY2lhc1tpXSkpLCBsd2QgPSAyLCBhZGQgPSBULCBjb2wgPSAicmVkIikNCiAgICAgIH0gZWxzZSBpZiAodGlwb3NbaV0gPT0gImYxIikgew0KICAgICAgICBjdXJ2ZShmMSh4LCBtZWRpYXNbaV0sIHZhcmlhbmNpYXNbaV0sIGspLCBsd2QgPSAyLCBhZGQgPSBULCBjb2wgPSAicmVkIikNCiAgICAgIH0gZWxzZSBpZiAodGlwb3NbaV0gPT0gImYyIikgew0KICAgICAgICBjdXJ2ZShmMih4LCBtZWRpYXNbaV0sIHZhcmlhbmNpYXNbaV0pLCBsd2QgPSAyLCBhZGQgPSBULCBjb2wgPSAicmVkIikNCiAgICAgIH0NCiAgICB9DQogIH0NCiAgcGxvdC5uZXcoKQ0KICANCiAgIyBwYWluZWwgZGEgbGVnZW5kYQ0KICBwbG90Lm5ldygpDQogIA0KICBwcm9iIDwtIHBhc3RlMCgiKCIsIHBhc3RlKHAsIGNvbGxhcHNlID0gIiwgIiksICIpIikNCiAgcGFyKHhwZCA9IE5BKQ0KICBsZWdlbmQoImJvdHRvbWxlZnQiLA0KICAgICAgICAgbGVnZW5kID0gYygiQ3VydmEgZW1ww61yaWNhIiwgIkN1cnZhIHRlw7NyaWNhIiwgIiAiLA0KICAgICAgICAgICAgICAgICAgICBwYXN0ZTAoIkNhc28gIiwgY2FzbywgIiBjb20gTiA9ICIsIG5yb3coZGFkb3MpLCAiIGFtb3N0cmFzIiksDQogICAgICAgICAgICAgICAgICAgIGJxdW90ZShzY3JpcHRzdHlsZShib2xkKFApID09IC4ocHJvYiledCkpKSwNCiAgICAgICAgIGNvbCA9IGMoImJsdWUiLCAicmVkIiwgIndoaXRlIiwgIndoaXRlIiwgIndoaXRlIiksDQogICAgICAgICBsd2QgPSAyLCBidHkgPSAibyIsDQogICAgICAgICBjZXggPSAxLjMsIGluc2V0ID0gYygtMS40LCAtMC4xKSkNCiAgcGFyKHhwZCA9IEZBTFNFKQ0KICANCiAgcGFyKG1mcm93ID0gYygxLCAxKSkNCn0NCmBgYA0KDQojIERpc3RyaWJ1acOnw6NvIGFzc2ludMOzdGljYSB7LnRhYnNldCAudGFic2V0LWZhZGV9DQpTZWphICQoXGNoaSwgXGJldGFfXGNoaSwgIFApX3tQXGluXERlbHRhX019JCB1bSBlc3Bhw6dvIGVzdGF0w61zdGljbywgb25kZSAkXGNoaSA9IFx7eF8xLCAuLi4sIHhfTVx9JCwgJFxEZWx0YV9NID0gXHtQID0gKHBfMSwgLi4uLCBwX00pXnQkLCAkcF9pIFxnZXEgMCQgZSAkXHN1bV97aT0xfV5NcF9pID0gMVx9JCBlICRcYmV0YV9cY2hpJCBhIHNpZ21hLcOhbGdlYnJhICBkZSB0b2RvcyBvcyBzdWJjb25qdW50b3MgZGUgJFxjaGkkLiBQYXJhIGFsZ3VtICRQXGluIFxEZWx0YV9NJCwgYSBlbnRyb3BpYSAkSF97aCx2fV57XHZhcnBoaV8xLCBcdmFycGhpXzJ9JCDDqSBkZWZpbmlkYSBwZWxhIHNlZ3VpbnRlIGV4cHJlc3PDo286DQpcWw0KSF97aCx2fV57XHZhcnBoaV8xLCBcdmFycGhpXzJ9KFApID0gaFxsZWZ0KCBcZnJhY3tcc3VtX3tpPTF9Xk12X2lcdmFycGhpXzEocF9pKX17XHN1bV97aT0xfV5Ndl9pXHZhcnBoaV8yKHBfaSl9IFxyaWdodCksDQpcXQ0Kb25kZSAkdl9pPjAkLCAkaSA9IDEsIC4uLiwgTSQsIMOpIG8gcGVzbyBhc3NvY2lhZG8gYW8gZWxlbWVudG8gJHhfaSQgZGUgJFxjaGkkLiBBbMOpbSBkaXNzbywgbsOzcyBzdXBvbW9zIHF1ZSAkXHZhcnBoaV8xOiBbMCwxKSBccmlnaHRhcnJvdyBcbWF0aGJie1J9JCwgJFx2YXJwaGlfMjogWzAsMSkgXHJpZ2h0YXJyb3cgXG1hdGhiYntSfSQgZSAkaDogXG1hdGhiYntSfSBccmlnaHRhcnJvdyBcbWF0aGJie1J9JCBzZWphbSBxdWFpc3F1ZXIgZG9zIHRyaXBsb3MgZGUgZnVuw6fDtWVzIGFwcmVzZW50YWRvcyBuYSB0YWJlbGEgYXByZXNlbnRhZGEgbm8gYXJ0aWdvLiBBIHRhYmVsYSBzZWd1aW50ZSBtb3N0cmEgYWxndW1hcyBkZXNzYXMgZnVuw6fDtWVzIHBhcmEgYXMgZW50cm9waWFzIHV0aWxpemFkYXMgbm9zIMOtbmRpY2VzIGRlIGRvbWluw6JuY2lhIGFwcmVzZW50YWRvcyBhbnRlcmlvcm1lbnRlLg0KDQp8IEVudHJvcGlhIHwgXChoKHgpXCkgICAgICAgICAgICAgICAgICAgICAgICB8IFwoXHZhcnBoaV8xKHgpXCkgICAgICAgICAgIHwgXChcdmFycGhpXzIoeClcKSAgICAgICAgIHwgXCh2X2lcKSB8DQp8Oi0tLS0tLS0tOnw6LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18Oi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18Oi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfDotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwNCnwgU2hhbm5vbiB8IFwoeFwpICAgICAgICAgICAgICAgICB8IFwoLXggXGxvZyB4XCkgICAgICAgICAgICAgICAgICAgICAgfCBcKHhcKSAgICAgICAgICAgICAgICAgICAgfCBcKHZcKSB8DQp8IFLDqW55aSB8IFwoKDEgLSByKV57LTF9XGxvZyB4XCkgfCBcKHheclwpICAgICAgICAgICAgICAgICB8IFwoeFwpICAgICAgICAgICAgICAgICAgfCBcKHZcKSB8DQp8IFRzYWxsaXMgfCBcKFwgKHItMSleey0xfSgxIC0geCkgXCkgfCBcKCB4XnIgXCkgfCBcKCB4IFwpIHwgXCggdiBcKSB8DQoNCj4gKipUZW9yZW1hKio6IFN1cG9uaGEgcXVlICRoXGluIENeMShcbWF0aGJie1J9KSQsICRcdmFycGhpXzEgXGluIENeMSgoMCwxKSkkLCAkXHZhcnBoaV8yIFxpbiBDXjEoKDAsMSkpJCBlICRwX2k+MCwgXDsgaSA9IDEsIC4uLiwgTS4kIFNlIGEgZnJlcXXDqm5jaWEgcmVsYXRpdmEgJFxoYXR7UH0kIMOpIG8gZXN0aW1hZG9yIGRlICRQPShwXzEsIC4uLiwsIHBfTSkkIGJhc2VhZG8gZW0gdW1hIGFtb3N0cmEgYWxlYXTDs3JpYSBkZSB0YW1hbmhvICRuJCwgZW50w6NvDQokJFxiZWdpbnthbGlnbip9DQogIG5eezEvMn1bSF97aCx2fV57XHZhcnBoaV8xLCBcdmFycGhpXzJ9KFxoYXR7UH0pIC0gSF97aCx2fV57XHZhcnBoaV8xLCBcdmFycGhpXzJ9KFApXVxvdmVyc2V0e0R9e1xyaWdodGFycm93fU4oMCwgXHNpZ21hXjIpLA0KXGVuZHthbGlnbip9JCQNCmVtIHF1ZSANCiQkXGJlZ2lue2FsaWduKn0NCiAgXHNpZ21hXjIgJj0gXHN1bV97aSA9IDF9Xk10X2leMnBfaSAtIFxiaWdnKFxzdW1fe2kgPSAxfV5NdF9pcF9pXGJpZ2cpXjJcXA0KICB0X2kgJj0gXGZyYWN7ZH17ZHBfaX1IX3toLHZ9XntcdmFycGhpXzEsIFx2YXJwaGlfMn0oUCkuDQpcZW5ke2FsaWduKn0kJA0KDQpObyBjYXNvIGRhIEVudHJvcGlhIGRlIFNoYW5ub24sIEVudHJvcGlhIGRlIFRzYWxsaXMgZSBFbnRyb3BpYSBkZSBSw6lueWksIHRlbW9zIG9zIHNlZ3VpbnRlcyAkdF9pJ3MkOg0KDQp8IEVudHJvcGlhIHwgXCggdF9pIFwpIHwNCnw6LS0tLS0tLS0tOnw6LS0tLS0tLS0tLXwNCnwgU2hhbm5vbiB8IFwoLSAoMSArIFxsb2cgcF9pKVwpIHwNCnwgUsOpbnlpIHwgXChcZnJhY3tyfXsxIC0gcn0gXCwgcF9pXntyIC0gMX0gXGxlZnRbXHN1bV97aSA9IDF9Xk0gcF9pXnJccmlnaHRdXnstMX1cKSB8DQp8IFRzYWxsaXMgfCBcKCAtXGZyYWN7cn17ciAtIDF9cF9pXntyIC0gMX0gIFwpIHwNCg0KTG9nbywgYSBkaXN0cmlidWnDp8OjbyBhc3NpbnTDs3RpY2EgZGFzIGVudHJvcGlhcyDDqSBkYWRhIHBvcjoNCg0KfCBFbnRyb3BpYSB8IERpc3RyaWJ1acOnw6NvIGFzc2ludMOzdGljYSB8DQp8Oi0tLS0tLS0tLTp8Oi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18DQp8IFNoYW5ub24gfCBcKCBcaGF0e0h9X3MgXG92ZXJzZXR7RH17XHRvfSBOXCFcbGVmdChIX3MsIFxmcmFjezF9e259XGxlZnQoXHN1bV97aT0xfV57a30gcF9pXGxuXjIgcF9pIC0gSF9zXjJccmlnaHQpXHJpZ2h0KSBcKSB8DQp8IFLDqW55aSB8IFwoICBcaGF0e0h9X1IgXG92ZXJzZXR7RH17XHRvfSBOXCFcbGVmdChIX1IsIFxmcmFjezF9e259IA0KICAgICAgICBcQmlnZ1sNCiAgICAgICAgXGxlZnQoXGZyYWN7XGFscGhhfXtcYWxwaGEgLSAxfVxyaWdodCleMiANCiAgICAgICAgXEJpZ2coIA0KICAgICAgICBcbGVmdChcc3VtX3tpPTF9XntrfSBwX2leXGFscGhhXHJpZ2h0KV57LTJ9IFxsZWZ0KFxzdW1fe2k9MX1ee2t9IHBfaV57MlxhbHBoYSAtIDF9XHJpZ2h0KQ0KICAgICAgICAtIFxsZWZ0KFxzdW1fe2k9MX1ee2t9IHBfaV5cYWxwaGFccmlnaHQpXjIgDQogICAgICAgIFxCaWdnKSANCiAgICAgICAgXEJpZ2ddDQogICAgICAgIFxyaWdodCkgXCkgfA0KfCBUc2FsbGlzIHwgXCggIFxoYXR7SH1fVCBcb3ZlcnNldHtEfXtcdG99IE5cIVxsZWZ0KEhfVCwgXGZyYWN7MX17bn0gDQogICAgICAgIFxCaWdnWw0KICAgICAgICBcbGVmdChcZnJhY3tcYWxwaGF9e1xhbHBoYSAtIDF9XHJpZ2h0KV4yIA0KICAgICAgICBcQmlnZygNCiAgICAgICAgXHN1bV97aT0xfV57a30gcF9pXnsyXGFscGhhIC0gMX0NCiAgICAgICAgLSBcbGVmdChcc3VtX3tpPTF9XntrfSBwX2leXGFscGhhXHJpZ2h0KV4yDQogICAgICAgIFxCaWdnKQ0KICAgICAgICBcQmlnZ10NCiAgICAgICAgXHJpZ2h0KSBcKSB8DQoNCg0KIyMgJERfMSQgIHsudW5saXN0ZWQgLnVubnVtYmVyZWR9DQoNCiQkXGJlZ2lue2FsaWduKn0NCiAgXGhhdHtEfV8xIFxvdmVyc2V0e0R9e1xyaWdodGFycm93fSBOXGJpZ2coXGZyYWN7a1sxIC0gSF9UKDIpXSAtIDF9e2sgLSAxfSwgXGJpZ2dbXGZyYWN7a317ay0xfVxiaWdnXV4yXG1hdGhiYntWfWFyW1xoYXR7SH1fVCgyKV1cYmlnZykNClxlbmR7YWxpZ24qfSQkDQoNCiMjICREXzMkICB7LnVubGlzdGVkIC51bm51bWJlcmVkfQ0KJCRcYmVnaW57YWxpZ24qfQ0KICBcaGF0e0R9XzMgXG92ZXJzZXR7RH17XHJpZ2h0YXJyb3d9IE5cYmlnZygxIC0gXGZyYWN7SF9zfXtcbG9nIGt9LCBcZnJhY3tcbWF0aGJie1Z9YXIoXGhhdHtIfV9zKX17XGxvZ14yIGt9XGJpZ2cpDQpcZW5ke2FsaWduKn0kJA0KDQojIyAkRF80JCAgey51bmxpc3RlZCAudW5udW1iZXJlZH0NClNlamEgJFcgPSBcaGF0e0R9XzQkLiBMb2dvLCB0ZW1vcyBxdWUgYSBkZW5zaWRhZGUgZGUgJFckIMOpIGRhZGEgcG9yOg0KJCRcYmVnaW57YWxpZ24qfQ0KICBmX1codykgPSBcZnJhY3trIC0gMX17W2sgLSAoay0xKXddXHNxcnR7MlxwaSBcc2lnbWFeMl9TfX1leHBcYmlnZ1stXGZyYWN7W1xsb2coayAtIChrLTEpdykgLSBIX3NdXjJ9ezJcc2lnbWFfU14yfVxiaWdnXVxvdmVyc2V0e1xtYXRoYmJ7SX0odyl9e197KC1caW5mdHksIFxmcmFje2t9e2stMX0pfX0NClxlbmR7YWxpZ24qfSQkDQoNCmBgYHtyfQ0KIyBmZHAgZGUgRDQgZSBENSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCmYxIDwtIGZ1bmN0aW9uKHgsIG11LCBzaWdtYTIsIGspew0KICAoIChrIC0gMSkvKChrIC0gKGstMSkqeCkqc3FydCgyKnBpKnNpZ21hMikpICkqZXhwKC0oKGxvZyhrIC0gKGstMSkqeCkgLSBtdSleMikvKDIqc2lnbWEyKSkNCn0NCmBgYA0KDQojIyAkRF81JCAgey51bmxpc3RlZCAudW5udW1iZXJlZH0NClNlamEgJFYgPSBcaGF0e0R9XzUkLiBMb2dvLCB0ZW1vcyBxdWUgYSBkZW5zaWRhZGUgZGUgJFYkIMOpIGRhZGEgcG9yOg0KJCRcYmVnaW57YWxpZ24qfQ0KICBmX1YodikgPSBcZnJhY3trIC0gMX17W2sgLSAoay0xKXZdXHNxcnR7MlxwaSBcc2lnbWFeMl9SfX1leHBcYmlnZ1stXGZyYWN7W1xsb2coayAtIChrLTEpdikgLSBIX1JdXjJ9ezJcc2lnbWFfUl4yfVxiaWdnXVxvdmVyc2V0e1xtYXRoYmJ7SX0odil9e197KC1caW5mdHksIFxmcmFje2t9e2stMX0pfX0NClxlbmR7YWxpZ24qfSQkDQoNCmBgYHtyfQ0KIyBmZHAgZGUgRDQgZSBENSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCmYxIDwtIGZ1bmN0aW9uKHgsIG11LCBzaWdtYTIsIGspew0KICAoIChrIC0gMSkvKChrIC0gKGstMSkqeCkqc3FydCgyKnBpKnNpZ21hMikpICkqZXhwKC0oKGxvZyhrIC0gKGstMSkqeCkgLSBtdSleMikvKDIqc2lnbWEyKSkNCn0NCmBgYA0KIyMgJERfNiQgey51bmxpc3RlZCAudW5udW1iZXJlZH0NCiQkXGJlZ2lue2FsaWduKn0NCiAgXGhhdHtEfV82IFxvdmVyc2V0e0R9e1xyaWdodGFycm93fSBOXGJpZ2coXGZyYWN7a1sxIC0gSF9UKDIpXSAtIDF9e2sgLSAxfSwgXGJpZ2dbXGZyYWN7a317ay0xfVxiaWdnXV4yXG1hdGhiYntWfWFyW1xoYXR7SH1fVCgyKV1cYmlnZykNClxlbmR7YWxpZ24qfSQkDQoNCiMjICREXzckICB7LnVubGlzdGVkIC51bm51bWJlcmVkfQ0KU2VqYSAkVSA9IFxoYXR7RH1fNiQgZSAkWSA9IFxoYXR7RH1fNyA9IFxzcXJ0e1V9JC4gVGVtb3MgYSBzZWd1aW50ZSBkZW5zaWRhZGUgcXVlIGVzdMOhIGJlbSBkZWZpbmlkYSBzb21lbnRlIHBhcmEgJFxtYXRoYmJ7Ul4rfSQ6DQokJFxiZWdpbnthbGlnbip9DQogIGZfWSh5KSA9IFxmcmFjezJ5fXtcc3FydHsyXHBpXHNpZ21hXjJfVX19ZXhwXGJpZ2dbLVxmcmFjeyh5XjItXG11X1UpXjJ9ezJcc2lnbWFeMl9VfSBcYmlnZ11cb3ZlcnNldHtcbWF0aGJie0l9KHkpfXt7KDAsXGluZnR5KX19Lg0KXGVuZHthbGlnbip9JCQNCmBgYHtyfQ0KIyBmZHAgZGUgRDcgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCmYyIDwtIGZ1bmN0aW9uKHgsIG11LCBzaWdtYTIpew0KICAoICgyKngpL3NxcnQoMipwaSpzaWdtYTIpICkqZXhwKC0oKCh4XjIpIC0gbXUpXjIpLygyKnNpZ21hMikpDQp9DQoNCmBgYA0KDQojIFNpbXVsYcOnw6NvIHsudGFic2V0IC50YWJzZXQtZmFkZX0NCiMjIENvbmZpZ3VyYcOnw6NvIDEgIHsudW5saXN0ZWQgLnVubnVtYmVyZWR9DQpDb20gMTAwMCBhbW9zdHJhczoNCmBgYHtyfQ0KIyBDYXNvIDEgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCm4gPC0gMTAwMCAjIHRhbWFuaG8gZGUgY2FkYSBhbW9zdHJhDQoNCiMgTiA9IDEwMDANCg0KTiA8LSAxMDAwICMgbnVtZXJvIGRlIGFtb3N0cmFzDQpwIDwtIGMoMC4yNCwgMC4yNiwgMC4yNTUsIDAuMjQ1KSAjIHBhcnRpY2lwYWNvZXMgZGUgbWVyY2Fkbw0KDQpzZXQuc2VlZCgxMjMpDQphIDwtIHJtdWx0aW5vbShOLCBuLCBwKQ0KaWRfYzEuMSA8LSBpZChhLCBOKQ0KYGBgDQoNCkNvbSAzMDAwIGFtb3N0cmFzOg0KYGBge3J9DQojIE4gPSAzMDAwDQoNCk4gPC0gMzAwMCAjIG51bWVybyBkZSBhbW9zdHJhcw0KcCA8LSBjKDAuMjQsIDAuMjYsIDAuMjU1LCAwLjI0NSkgIyBwYXJ0aWNpcGFjb2VzIGRlIG1lcmNhZG8NCg0Kc2V0LnNlZWQoMTIzKQ0KYSA8LSBybXVsdGlub20oTiwgbiwgcCkNCmlkX2MxLjIgPC0gaWQoYSwgTikNCmBgYA0KDQojIyMgw41uZGljZXMgZGUgZG9taW7Dom5jaWEgdGXDs3JpY29zIHsudW5saXN0ZWQgLnVubnVtYmVyZWR9DQpgYGB7ciBjb2xsYXBzZT1UUlVFfQ0KIyBDYWxjdWxvIGRvIHZhbG9yIHRlb3JpY28gZG9zIGluZGljZXMgZGUgZG9taW5hbmNpYQ0KDQpkMS50X2MxIDwtIEQxKG4qcCk7IGQxLnRfYzENCmQyLnRfYzEgPC0gRDIobipwKTsgZDIudF9jMQ0KZDMudF9jMSA8LSBEMyhuKnApOyBkMy50X2MxDQpkNC50X2MxIDwtIEQ0KG4qcCk7IGQ0LnRfYzENCmQ1LnRfYzEgPC0gRDUobipwKTsgZDUudF9jMQ0KZDYudF9jMSA8LSBENihuKnApOyBkNi50X2MxDQpkNy50X2MxIDwtIEQ3KG4qcCk7IGQ3LnRfYzENCmBgYA0KDQojIyMgRW50cm9waWFzIGUgdmFyacOibmNpYSBkYXMgZW50cm9waWFzIHsudW5saXN0ZWQgLnVubnVtYmVyZWR9DQoNCmBgYHtyIGNvbGxhcHNlPVRSVUV9DQpIcyA8LSAtc3VtKHAqbG9nKHApKSAjIGVudHJvcGlhIGRlIHNoYW5ub24NCkhyIDwtIC1sb2coc3VtKHBeMikpICMgZW50cm9waWEgZGUgcmVueWkgY29tIGFscGhhID0gMg0KSHQgPC0gMSAtIHN1bShwXjIpICMgZW50cm9waWEgZGUgdHNhbGxpcyBjb20gYWxwaGEgPSAyDQpgYGANCg0KYGBge3IgY29sbGFwc2U9VFJVRX0NCnZfc2hhbm5vbiA8LSAoIHN1bShwKihsb2cocCleMikpIC0gIChIc14yKSApL24gDQp2X3JlbnlpIDwtICggNCooICgoc3VtKHBeMileKC0yKSkgKiBzdW0ocF4zKSkgLSAxICkgKS9uIA0Kdl90c2FsbGlzIDwtICggNCooc3VtKHBeMykgLSAoc3VtKHBeMileMikpICkvbg0KYGBgDQoNCiMjIyBWYXJpw6JuY2lhcyBhc3NpbnTDs3RpY2FzIGRlIGFsZ3VucyDDrW5kaWNlcyBkZSBkb21pbsOibmNpYSB7LnVubGlzdGVkIC51bm51bWJlcmVkfQ0KYGBge3IgY29sbGFwc2U9VFJVRX0NCiMgVmFyaWFuY2lhIHRlb3JpY2EgZG9zIGluZGljZXMgZGUgZG9taW5hbmNpYQ0KDQprIDwtIGxlbmd0aChwKSAjIG51bWVybyBkZSBlbXByZXNhcw0KDQp2MSA8LSAoKGsvKGstMSkpXjIpICogdl90c2FsbGlzICMgdmFyaWFuY2lhIGRvIEQxDQp2MyA8LSB2X3NoYW5ub24vKGxvZyhrKV4yKSAjIHZhcmlhbmNpYSBkbyBEMw0KdjYgPC0gKChrLyhrLTEpKV4yKSAqIHZfdHNhbGxpcyAjIHZhcmlhbmNpYSBkbyBENg0KDQp2MTsgdjM7IHY2DQpgYGANCg0KIyMjIFBsb3RhZ2VtIHsudW5saXN0ZWQgLnVubnVtYmVyZWR9DQpgYGB7cn0NCiMgSGlzdG9ncmFtYXMgQ2FzbyAxIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQojIGNvbSBOID0gMTAwMA0KDQptZWRpYXMgPC0gYyhkMS50X2MxLCBOQSwgZDMudF9jMSwgSHMsIEhyLCBkNi50X2MxLCBkMS50X2MxKQ0KdmFyaWFuY2lhcyA8LSBjKHYxLCBOQSwgdjMsIHZfc2hhbm5vbiwgdl9yZW55aSwgdjYsIHYxKQ0KcGxvdGFnZW0oaWRfYzEuMSwgbWVkaWFzLCB2YXJpYW5jaWFzLCBrLCAxLCBwKQ0KDQojIGNvbSBOID0gMzAwMA0KDQptZWRpYXMgPC0gYyhkMS50X2MxLCBOQSwgZDMudF9jMSwgSHMsIEhyLCBkNi50X2MxLCBkMS50X2MxKQ0KdmFyaWFuY2lhcyA8LSBjKHYxLCBOQSwgdjMsIHZfc2hhbm5vbiwgdl9yZW55aSwgdjYsIHYxKQ0KcGxvdGFnZW0oaWRfYzEuMiwgbWVkaWFzLCB2YXJpYW5jaWFzLCBrLCAxLCBwKQ0KDQpgYGANCg0KDQoNCiMjIENvbmZpZ3VyYcOnw6NvIDIgIHsudW5saXN0ZWQgLnVubnVtYmVyZWR9DQpDb20gMTAwMCBhbW9zdHJhczoNCmBgYHtyfQ0KbiA8LSAxMDAwICMgdGFtYW5obyBkZSBjYWRhIGFtb3N0cmENCg0KIyBOID0gMTAwMA0KDQpOIDwtIDEwMDAgIyBudW1lcm8gZGUgYW1vc3RyYXMNCnAgPC0gYygwLjg1LCAwLjA1LCAwLjA1LCAwLjA1KSAjIHBhcnRpY2lwYWNvZXMgZGUgbWVyY2Fkbw0KDQpzZXQuc2VlZCgxMjMpDQphIDwtIHJtdWx0aW5vbShOLCBuLCBwKQ0KaWRfYzIuMSA8LSBpZChhLCBOKQ0KYGBgDQoNCkNvbSAzMDAwIGFtb3N0cmFzOg0KYGBge3J9DQojIE4gPSAzMDAwDQoNCk4gPC0gMzAwMCAjIG51bWVybyBkZSBhbW9zdHJhcw0KcCA8LSBjKDAuODUsIDAuMDUsIDAuMDUsIDAuMDUpICMgcGFydGljaXBhY29lcyBkZSBtZXJjYWRvDQoNCnNldC5zZWVkKDEyMykNCmEgPC0gcm11bHRpbm9tKE4sIG4sIHApDQppZF9jMi4yIDwtIGlkKGEsIE4pDQpgYGANCg0KIyMjIMONbmRpY2VzIGRlIGRvbWluw6JuY2lhIHRlw7NyaWNvcyBwYXJhIGVzc2EgY29uZmlndXJhw6fDo28gey51bmxpc3RlZCAudW5udW1iZXJlZH0NCmBgYHtyIGNvbGxhcHNlPVRSVUV9DQojIENhbGN1bG8gZG8gdmFsb3IgdGVvcmljbyBkb3MgaW5kaWNlcyBkZSBkb21pbmFuY2lhDQpkMS50X2MyIDwtIEQxKG4qcCk7IGQxLnRfYzINCmQyLnRfYzIgPC0gRDIobipwKTsgZDIudF9jMg0KZDMudF9jMiA8LSBEMyhuKnApOyBkMy50X2MyDQpkNC50X2MyIDwtIEQ0KG4qcCk7IGQ0LnRfYzINCmQ1LnRfYzIgPC0gRDUobipwKTsgZDUudF9jMg0KZDYudF9jMiA8LSBENihuKnApOyBkNi50X2MyDQpkNy50X2MyIDwtIEQ3KG4qcCk7IGQ3LnRfYzINCmBgYA0KDQojIyMgRW50cm9waWFzIGUgdmFyacOibmNpYSBkYXMgZW50cm9waWFzIHsudW5saXN0ZWQgLnVubnVtYmVyZWR9DQoNCmBgYHtyIGNvbGxhcHNlPVRSVUV9DQpIcyA8LSAtc3VtKHAqbG9nKHApKSAjIGVudHJvcGlhIGRlIHNoYW5ub24NCkhyIDwtIC1sb2coc3VtKHBeMikpICMgZW50cm9waWEgZGUgcmVueWkgY29tIGFscGhhID0gMg0KSHQgPC0gMSAtIHN1bShwXjIpICMgZW50cm9waWEgZGUgdHNhbGxpcyBjb20gYWxwaGEgPSAyDQpgYGANCg0KYGBge3IgY29sbGFwc2U9VFJVRX0NCnZfc2hhbm5vbiA8LSAoIHN1bShwKihsb2cocCleMikpIC0gIChIc14yKSApL24gDQp2X3JlbnlpIDwtICggNCooICgoc3VtKHBeMileKC0yKSkgKiBzdW0ocF4zKSkgLSAxICkgKS9uICANCnZfdHNhbGxpcyA8LSAoIDQqKHN1bShwXjMpIC0gKHN1bShwXjIpXjIpKSApL24NCmBgYA0KDQojIyMgVmFyacOibmNpYXMgYXNzaW50w7N0aWNhcyBkZSBhbGd1bnMgw61uZGljZXMgZGUgZG9taW7Dom5jaWEgey51bmxpc3RlZCAudW5udW1iZXJlZH0NCmBgYHtyIGNvbGxhcHNlPVRSVUV9DQojIFZhcmlhbmNpYSB0ZW9yaWNhIGRvcyBpbmRpY2VzIGRlIGRvbWluYW5jaWENCg0KayA8LSBsZW5ndGgocCkgIyBudW1lcm8gZGUgZW1wcmVzYXMNCg0KdjEgPC0gKChrLyhrLTEpKV4yKSAqIHZfdHNhbGxpcyAjIHZhcmlhbmNpYSBkbyBEMQ0KdjMgPC0gdl9zaGFubm9uLyhsb2coayleMikgIyB2YXJpYW5jaWEgZG8gRDMNCnY2IDwtICgoay8oay0xKSleMikgKiB2X3RzYWxsaXMgIyB2YXJpYW5jaWEgZG8gRDYNCmBgYA0KDQojIyMgUGxvdGFnZW0gey51bmxpc3RlZCAudW5udW1iZXJlZH0NCmBgYHtyfQ0KIyBIaXN0b2dyYW1hcyBDYXNvIDIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCiMgY29tIE4gPSAxMDAwDQoNCm1lZGlhcyA8LSBjKGQxLnRfYzIsIE5BLCBkMy50X2MyLCBIcywgSHIsIGQ2LnRfYzIsIGQxLnRfYzIpDQp2YXJpYW5jaWFzIDwtIGModjEsIE5BLCB2Mywgdl9zaGFubm9uLCB2X3JlbnlpLCB2NiwgdjEpDQpwbG90YWdlbShpZF9jMi4xLCBtZWRpYXMsIHZhcmlhbmNpYXMsIGssIDIsIHApDQoNCiMgY29tIE4gPSAzMDAwDQoNCm1lZGlhcyA8LSBjKGQxLnRfYzIsIE5BLCBkMy50X2MyLCBIcywgSHIsIGQ2LnRfYzIsIGQxLnRfYzIpDQp2YXJpYW5jaWFzIDwtIGModjEsIE5BLCB2Mywgdl9zaGFubm9uLCB2X3JlbnlpLCB2NiwgdjEpDQpwbG90YWdlbShpZF9jMi4yLCBtZWRpYXMsIHZhcmlhbmNpYXMsIGssIDIsIHApDQpgYGANCg0KDQoNCg0KIyMgQ29uZmlndXJhw6fDo28gMyAgey51bmxpc3RlZCAudW5udW1iZXJlZH0NCkNvbSAxMDAwIGFtb3N0cmFzOg0KYGBge3J9DQpuIDwtIDEwMDAgIyB0YW1hbmhvIGRlIGNhZGEgYW1vc3RyYQ0KDQojIE4gPSAxMDAwDQoNCk4gPC0gMTAwMCAjIG51bWVybyBkZSBhbW9zdHJhcw0KcCA8LSBjKDAuMzUsIDAuNDUsIDAuMSwgMC4xKSAjIHBhcnRpY2lwYWNvZXMgZGUgbWVyY2Fkbw0KDQpzZXQuc2VlZCgxMjMpDQphIDwtIHJtdWx0aW5vbShOLCBuLCBwKQ0KaWRfYzMuMSA8LSBpZChhLCBOKQ0KYGBgDQoNCkNvbSAzMDAwIGFtb3N0cmFzOg0KYGBge3J9DQojIE4gPSAzMDAwDQoNCk4gPC0gMzAwMCAjIG51bWVybyBkZSBhbW9zdHJhcw0KcCA8LSBjKDAuMzUsIDAuNDUsIDAuMSwgMC4xKSAjIHBhcnRpY2lwYWNvZXMgZGUgbWVyY2Fkbw0KDQpzZXQuc2VlZCgxMjMpDQphIDwtIHJtdWx0aW5vbShOLCBuLCBwKQ0KaWRfYzMuMiA8LSBpZChhLCBOKQ0KYGBgDQoNCiMjIyDDjW5kaWNlcyBkZSBkb21pbsOibmNpYSB0ZcOzcmljb3MgcGFyYSBlc3NhIGNvbmZpZ3VyYcOnw6NvIHsudW5saXN0ZWQgLnVubnVtYmVyZWR9DQpgYGB7ciBjb2xsYXBzZT1UUlVFfQ0KIyBDYWxjdWxvIGRvIHZhbG9yIHRlb3JpY28gZG9zIGluZGljZXMgZGUgZG9taW5hbmNpYQ0KZDEudF9jMyA8LSBEMShuKnApOyBkMS50X2MzDQpkMi50X2MzIDwtIEQyKG4qcCk7IGQyLnRfYzMNCmQzLnRfYzMgPC0gRDMobipwKTsgZDMudF9jMw0KZDQudF9jMyA8LSBENChuKnApOyBkNC50X2MzDQpkNS50X2MzIDwtIEQ1KG4qcCk7IGQ1LnRfYzMNCmQ2LnRfYzMgPC0gRDYobipwKTsgZDYudF9jMw0KZDcudF9jMyA8LSBENyhuKnApOyBkNy50X2MzDQpgYGANCg0KIyMjIEVudHJvcGlhcyBlIHZhcmnDom5jaWEgZGFzIGVudHJvcGlhcyB7LnVubGlzdGVkIC51bm51bWJlcmVkfQ0KDQpgYGB7ciBjb2xsYXBzZT1UUlVFfQ0KIyBFbnRyb3BpYXMgdGVvcmljYXMNCg0KSHMgPC0gLXN1bShwKmxvZyhwKSkgIyBlbnRyb3BpYSBkZSBzaGFubm9uDQpIciA8LSAtbG9nKHN1bShwXjIpKSAjIGVudHJvcGlhIGRlIHJlbnlpIGNvbSBhbHBoYSA9IDINCkh0IDwtIDEgLSBzdW0ocF4yKSAjIGVudHJvcGlhIGRlIHRzYWxsaXMgY29tIGFscGhhID0gMg0KYGBgDQoNCmBgYHtyIGNvbGxhcHNlPVRSVUV9DQojIHZhcmlhbmNpYSB0ZW9yaWNhIGRhcyBlbnRyb3BpYXMNCg0Kdl9zaGFubm9uIDwtICggc3VtKHAqKGxvZyhwKV4yKSkgLSAgKEhzXjIpICkvbiANCnZfcmVueWkgPC0gKCA0KiggKChzdW0ocF4yKV4oLTIpKSAqIHN1bShwXjMpKSAtIDEgKSApL24gDQp2X3RzYWxsaXMgPC0gKCA0KihzdW0ocF4zKSAtIChzdW0ocF4yKV4yKSkgKS9uDQpgYGANCg0KIyMjIFZhcmnDom5jaWFzIGFzc2ludMOzdGljYXMgZGUgYWxndW5zIMOtbmRpY2VzIGRlIGRvbWluw6JuY2lhIHsudW5saXN0ZWQgLnVubnVtYmVyZWR9DQpgYGB7ciBjb2xsYXBzZT1UUlVFfQ0KIyBWYXJpYW5jaWEgdGVvcmljYSBkb3MgaW5kaWNlcyBkZSBkb21pbmFuY2lhDQoNCmsgPC0gbGVuZ3RoKHApICMgbnVtZXJvIGRlIGVtcHJlc2FzDQoNCnYxIDwtICgoay8oay0xKSleMikgKiB2X3RzYWxsaXMgIyB2YXJpYW5jaWEgZG8gRDENCnYzIDwtIHZfc2hhbm5vbi8obG9nKGspXjIpICMgdmFyaWFuY2lhIGRvIEQzDQp2NiA8LSAoKGsvKGstMSkpXjIpICogdl90c2FsbGlzICMgdmFyaWFuY2lhIGRvIEQ2DQoNCnYxOyB2MzsgdjYNCmBgYA0KDQojIyMgUGxvdGFnZW0gey51bmxpc3RlZCAudW5udW1iZXJlZH0NCmBgYHtyfQ0KIyBIaXN0b2dyYW1hcyBDYXNvIDMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCiMgY29tIE4gPSAxMDAwDQoNCm1lZGlhcyA8LSBjKGQxLnRfYzMsIE5BLCBkMy50X2MzLCBIcywgSHIsIGQ2LnRfYzMsIGQxLnRfYzMpDQp2YXJpYW5jaWFzIDwtIGModjEsIE5BLCB2Mywgdl9zaGFubm9uLCB2X3JlbnlpLCB2NiwgdjEpDQpwbG90YWdlbShpZF9jMy4xLCBtZWRpYXMsIHZhcmlhbmNpYXMsIGssIDMsIHApDQoNCg0KIyBjb20gTiA9IDMwMDANCg0KbWVkaWFzIDwtIGMoZDEudF9jMywgTkEsIGQzLnRfYzMsIEhzLCBIciwgZDYudF9jMywgZDEudF9jMykNCnZhcmlhbmNpYXMgPC0gYyh2MSwgTkEsIHYzLCB2X3NoYW5ub24sIHZfcmVueWksIHY2LCB2MSkNCnBsb3RhZ2VtKGlkX2MzLjIsIG1lZGlhcywgdmFyaWFuY2lhcywgaywgMywgcCkNCmBgYA0KDQojIyBDb25maWd1cmHDp8OjbyA0ICB7LnVubGlzdGVkIC51bm51bWJlcmVkfQ0KDQpDb20gMTAwMCBhbW9zdHJhczoNCmBgYHtyfQ0KIyBDYXNvIDQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCm4gPC0gMTAwMCAjIHRhbWFuaG8gZGUgY2FkYSBhbW9zdHJhDQoNCiMgTiA9IDEwMDANCg0KTiA8LSAxMDAwICMgbnVtZXJvIGRlIGFtb3N0cmFzDQpwIDwtYygwLjIsIDAuMiwgMC4yLCAwLjA1LCAwLjE1LCAwLjIpICMgcGFydGljaXBhY29lcyBkZSBtZXJjYWRvDQoNCnNldC5zZWVkKDEyMykNCmEgPC0gcm11bHRpbm9tKE4sIG4sIHApDQppZF9jNC4xIDwtIGlkKGEsIE4pDQpgYGANCg0KQ29tIDMwMDAgYW1vc3RyYXM6DQpgYGB7cn0NCiMgTiA9IDMwMDANCg0KTiA8LSAzMDAwICMgbnVtZXJvIGRlIGFtb3N0cmFzDQpwIDwtIGMoMC4yLCAwLjIsIDAuMiwgMC4wNSwgMC4xNSwgMC4yKSAjIHBhcnRpY2lwYWNvZXMgZGUgbWVyY2Fkbw0KDQpzZXQuc2VlZCgxMjMpDQphIDwtIHJtdWx0aW5vbShOLCBuLCBwKQ0KaWRfYzQuMiA8LSBpZChhLCBOKQ0KYGBgDQoNCiMjIyDDjW5kaWNlcyBkZSBkb21pbsOibmNpYSB0ZcOzcmljb3MgcGFyYSBlc3NhIGNvbmZpZ3VyYcOnw6NvIHsudW5saXN0ZWQgLnVubnVtYmVyZWR9DQpgYGB7ciBjb2xsYXBzZT1UUlVFfQ0KIyBDYWxjdWxvIGRvIHZhbG9yIHRlb3JpY28gZG9zIGluZGljZXMgZGUgZG9taW5hbmNpYQ0KZDEudF9jNCA8LSBEMShuKnApOyBkMS50X2M0DQpkMi50X2M0IDwtIEQyKG4qcCk7IGQyLnRfYzQNCmQzLnRfYzQgPC0gRDMobipwKTsgZDMudF9jNA0KZDQudF9jNCA8LSBENChuKnApOyBkNC50X2M0DQpkNS50X2M0IDwtIEQ1KG4qcCk7IGQ1LnRfYzQNCmQ2LnRfYzQgPC0gRDYobipwKTsgZDYudF9jNA0KZDcudF9jNCA8LSBENyhuKnApOyBkNy50X2M0DQpgYGANCg0KIyMjIEVudHJvcGlhcyBlIHZhcmnDom5jaWEgZGFzIGVudHJvcGlhcyB7LnVubGlzdGVkIC51bm51bWJlcmVkfQ0KDQpgYGB7ciBjb2xsYXBzZT1UUlVFfQ0KIyBFbnRyb3BpYXMgdGVvcmljYXMNCg0KSHMgPC0gLXN1bShwKmxvZyhwKSkgIyBlbnRyb3BpYSBkZSBzaGFubm9uDQpIciA8LSAtbG9nKHN1bShwXjIpKSAjIGVudHJvcGlhIGRlIHJlbnlpIGNvbSBhbHBoYSA9IDINCkh0IDwtIDEgLSBzdW0ocF4yKSAjIGVudHJvcGlhIGRlIHRzYWxsaXMgY29tIGFscGhhID0gMg0KDQpgYGANCg0KYGBge3IgY29sbGFwc2U9VFJVRX0NCiMgdmFyaWFuY2lhIHRlb3JpY2EgZGFzIGVudHJvcGlhcw0Kdl9zaGFubm9uIDwtICggc3VtKHAqKGxvZyhwKV4yKSkgLSAgKEhzXjIpICkvbiANCnZfcmVueWkgPC0gKCA0KiggKChzdW0ocF4yKV4oLTIpKSAqIHN1bShwXjMpKSAtIDEgKSApL24gDQp2X3RzYWxsaXMgPC0gKCA0KihzdW0ocF4zKSAtIChzdW0ocF4yKV4yKSkgKS9uDQpgYGANCg0KIyMjIFZhcmnDom5jaWFzIGFzc2ludMOzdGljYXMgZGUgYWxndW5zIMOtbmRpY2VzIGRlIGRvbWluw6JuY2lhIHsudW5saXN0ZWQgLnVubnVtYmVyZWR9DQpgYGB7ciBjb2xsYXBzZT1UUlVFfQ0KIyBWYXJpYW5jaWEgdGVvcmljYSBkb3MgaW5kaWNlcyBkZSBkb21pbmFuY2lhDQoNCmsgPC0gbGVuZ3RoKHApICMgbnVtZXJvIGRlIGVtcHJlc2FzDQoNCnYxIDwtICgoay8oay0xKSleMikgKiB2X3RzYWxsaXMgIyB2YXJpYW5jaWEgZG8gRDENCnYzIDwtIHZfc2hhbm5vbi8obG9nKGspXjIpICMgdmFyaWFuY2lhIGRvIEQzDQp2NiA8LSAoKGsvKGstMSkpXjIpICogdl90c2FsbGlzICMgdmFyaWFuY2lhIGRvIEQ2DQoNCnYxOyB2MzsgdjYNCmBgYA0KDQojIyMgUGxvdGFnZW0gey51bmxpc3RlZCAudW5udW1iZXJlZH0NCmBgYHtyfQ0KIyBIaXN0b2dyYW1hcyBDYXNvIDQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCg0KIyBjb20gTiA9IDEwMDANCg0KbWVkaWFzIDwtIGMoZDEudF9jNCwgTkEsIGQzLnRfYzQsIEhzLCBIciwgZDYudF9jNCwgZDEudF9jNCkNCnZhcmlhbmNpYXMgPC0gYyh2MSwgTkEsIHYzLCB2X3NoYW5ub24sIHZfcmVueWksIHY2LCB2MSkNCnBsb3RhZ2VtKGlkX2M0LjEsIG1lZGlhcywgdmFyaWFuY2lhcywgaywgNCwgcCkNCg0KIyBjb20gTiA9IDMwMDANCg0KbWVkaWFzIDwtIGMoZDEudF9jNCwgTkEsIGQzLnRfYzQsIEhzLCBIciwgZDYudF9jNCwgZDEudF9jNCkNCnZhcmlhbmNpYXMgPC0gYyh2MSwgTkEsIHYzLCB2X3NoYW5ub24sIHZfcmVueWksIHY2LCB2MSkNCnBsb3RhZ2VtKGlkX2M0LjIsIG1lZGlhcywgdmFyaWFuY2lhcywgaywgNCwgcCkNCmBgYA0KDQojIyBDb25maWd1cmHDp8OjbyA1ICB7LnVubGlzdGVkIC51bm51bWJlcmVkfQ0KQ29tIDEwMDAgYW1vc3RyYXM6DQpgYGB7cn0NCiMgQ2FzbyA1IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQpuIDwtIDEwMDAgIyB0YW1hbmhvIGRlIGNhZGEgYW1vc3RyYQ0KDQojIE4gPSAxMDAwDQoNCk4gPC0gMTAwMCAjIG51bWVybyBkZSBhbW9zdHJhcw0KcCA8LSBjKDAuMDEsIDAuMDEsIDAuMDEsIDAuMDEsIDAuMDEsIDAuOTUpICMgcGFydGljaXBhY29lcyBkZSBtZXJjYWRvDQoNCnNldC5zZWVkKDEyMykNCmEgPC0gcm11bHRpbm9tKE4sIG4sIHApDQppZF9jNS4xIDwtIGlkKGEsIE4pDQpgYGANCg0KQ29tIDMwMDAgYW1vc3RyYXM6DQpgYGB7cn0NCiMgTiA9IDMwMDANCg0KTiA8LSAzMDAwICMgbnVtZXJvIGRlIGFtb3N0cmFzDQpwIDwtIGMoMC4wMSwgMC4wMSwgMC4wMSwgMC4wMSwgMC4wMSwgMC45NSkgIyBwYXJ0aWNpcGFjb2VzIGRlIG1lcmNhZG8NCg0Kc2V0LnNlZWQoMTIzKQ0KYSA8LSBybXVsdGlub20oTiwgbiwgcCkNCmlkX2M1LjIgPC0gaWQoYSwgTikNCmBgYA0KDQojIyMgw41uZGljZXMgZGUgZG9taW7Dom5jaWEgdGXDs3JpY29zIHBhcmEgZXNzYSBjb25maWd1cmHDp8OjbyB7LnVubGlzdGVkIC51bm51bWJlcmVkfQ0KYGBge3IgY29sbGFwc2U9VFJVRX0NCiMgQ2FsY3VsbyBkbyB2YWxvciB0ZW9yaWNvIGRvcyBpbmRpY2VzIGRlIGRvbWluYW5jaWENCmQxLnRfYzUgPC0gRDEobipwKTsgZDEudF9jNQ0KZDIudF9jNSA8LSBEMihuKnApOyBkMi50X2M1DQpkMy50X2M1IDwtIEQzKG4qcCk7IGQzLnRfYzUNCmQ0LnRfYzUgPC0gRDQobipwKTsgZDQudF9jNQ0KZDUudF9jNSA8LSBENShuKnApOyBkNS50X2M1DQpkNi50X2M1IDwtIEQ2KG4qcCk7IGQ2LnRfYzUNCmQ3LnRfYzUgPC0gRDcobipwKTsgZDcudF9jNQ0KYGBgDQoNCiMjIyBFbnRyb3BpYXMgZSB2YXJpw6JuY2lhIGRhcyBlbnRyb3BpYXMgey51bmxpc3RlZCAudW5udW1iZXJlZH0NCg0KYGBge3IgY29sbGFwc2U9VFJVRX0NCiMgRW50cm9waWFzIHRlb3JpY2FzDQoNCkhzIDwtIC1zdW0ocCpsb2cocCkpICMgZW50cm9waWEgZGUgc2hhbm5vbg0KSHIgPC0gLWxvZyhzdW0ocF4yKSkgIyBlbnRyb3BpYSBkZSByZW55aSBjb20gYWxwaGEgPSAyDQpIdCA8LSAxIC0gc3VtKHBeMikgIyBlbnRyb3BpYSBkZSB0c2FsbGlzIGNvbSBhbHBoYSA9IDINCg0KYGBgDQoNCmBgYHtyIGNvbGxhcHNlPVRSVUV9DQojIHZhcmlhbmNpYSB0ZW9yaWNhIGRhcyBlbnRyb3BpYXMNCg0Kdl9zaGFubm9uIDwtICggc3VtKHAqKGxvZyhwKV4yKSkgLSAgKEhzXjIpICkvbiANCnZfcmVueWkgPC0gKCA0KiggKChzdW0ocF4yKV4oLTIpKSAqIHN1bShwXjMpKSAtIDEgKSApL24gDQp2X3RzYWxsaXMgPC0gKCA0KihzdW0ocF4zKSAtIChzdW0ocF4yKV4yKSkgKS9uDQoNCmBgYA0KDQojIyMgVmFyacOibmNpYXMgYXNzaW50w7N0aWNhcyBkZSBhbGd1bnMgw61uZGljZXMgZGUgZG9taW7Dom5jaWEgey51bmxpc3RlZCAudW5udW1iZXJlZH0NCmBgYHtyIGNvbGxhcHNlPVRSVUV9DQojIFZhcmlhbmNpYSB0ZW9yaWNhIGRvcyBpbmRpY2VzIGRlIGRvbWluYW5jaWENCg0KayA8LSBsZW5ndGgocCkgIyBudW1lcm8gZGUgZW1wcmVzYXMNCg0KdjEgPC0gKChrLyhrLTEpKV4yKSAqIHZfdHNhbGxpcyAjIHZhcmlhbmNpYSBkbyBEMQ0KdjMgPC0gdl9zaGFubm9uLyhsb2coayleMikgIyB2YXJpYW5jaWEgZG8gRDMNCnY2IDwtICgoay8oay0xKSleMikgKiB2X3RzYWxsaXMgIyB2YXJpYW5jaWEgZG8gRDYNCg0KdjE7IHYzOyB2Ng0KYGBgDQoNCiMjIyBQbG90YWdlbSB7LnVubGlzdGVkIC51bm51bWJlcmVkfQ0KYGBge3J9DQojIEhpc3RvZ3JhbWFzIENhc28gNSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KIyBjb20gTiA9IDEwMDANCg0KbWVkaWFzIDwtIGMoZDEudF9jNSwgTkEsIGQzLnRfYzUsIEhzLCBIciwgZDYudF9jNSwgZDEudF9jNSkNCnZhcmlhbmNpYXMgPC0gYyh2MSwgTkEsIHYzLCB2X3NoYW5ub24sIHZfcmVueWksIHY2LCB2MSkNCnBsb3RhZ2VtKGlkX2M1LjEsIG1lZGlhcywgdmFyaWFuY2lhcywgaywgNSwgcCkNCg0KIyBjb20gTiA9IDMwMDANCg0KbWVkaWFzIDwtIGMoZDEudF9jNSwgTkEsIGQzLnRfYzUsIEhzLCBIciwgZDYudF9jNSwgZDEudF9jNSkNCnZhcmlhbmNpYXMgPC0gYyh2MSwgTkEsIHYzLCB2X3NoYW5ub24sIHZfcmVueWksIHY2LCB2MSkNCnBsb3RhZ2VtKGlkX2M1LjIsIG1lZGlhcywgdmFyaWFuY2lhcywgaywgNSwgcCkNCmBgYA0KDQojIyBDb25maWd1cmHDp8OjbyA2ICB7LnVubGlzdGVkIC51bm51bWJlcmVkfQ0KQ29tIDEwMDAgYW1vc3RyYXM6DQpgYGB7cn0NCiMgQ2FzbyA2IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQpuIDwtIDEwMDAgIyB0YW1hbmhvIGRlIGNhZGEgYW1vc3RyYQ0KDQojIE4gPSAxMDAwDQoNCk4gPC0gMTAwMCAjIG51bWVybyBkZSBhbW9zdHJhcw0KcCA8LSBjKDAuMDEsIDAuMDEsIDAuMDIsIDAuMDIsIDAuNDcsIDAuNDcpICMgcGFydGljaXBhY29lcyBkZSBtZXJjYWRvDQoNCnNldC5zZWVkKDEyMykNCmEgPC0gcm11bHRpbm9tKE4sIG4sIHApDQppZF9jNi4xIDwtIGlkKGEsIE4pDQpgYGANCg0KQ29tIDMwMDAgYW1vc3RyYXM6DQpgYGB7cn0NCiMgTiA9IDMwMDANCg0KTiA8LSAzMDAwICMgbnVtZXJvIGRlIGFtb3N0cmFzDQpwIDwtIGMoMC4wMSwgMC4wMSwgMC4wMiwgMC4wMiwgMC40NywgMC40NykgIyBwYXJ0aWNpcGFjb2VzIGRlIG1lcmNhZG8NCg0Kc2V0LnNlZWQoMTIzKQ0KYSA8LSBybXVsdGlub20oTiwgbiwgcCkNCmlkX2M2LjIgPC0gaWQoYSwgTikNCmBgYA0KDQojIyMgw41uZGljZXMgZGUgZG9taW7Dom5jaWEgdGXDs3JpY29zIHBhcmEgZXNzYSBjb25maWd1cmHDp8OjbyB7LnVubGlzdGVkIC51bm51bWJlcmVkfQ0KYGBge3IgY29sbGFwc2U9VFJVRX0NCiMgQ2FsY3VsbyBkbyB2YWxvciB0ZW9yaWNvIGRvcyBpbmRpY2VzIGRlIGRvbWluYW5jaWENCmQxLnRfYzYgPC0gRDEobipwKTsgZDEudF9jNg0KZDIudF9jNiA8LSBEMihuKnApOyBkMi50X2M2DQpkMy50X2M2IDwtIEQzKG4qcCk7IGQzLnRfYzYNCmQ0LnRfYzYgPC0gRDQobipwKTsgZDQudF9jNg0KZDUudF9jNiA8LSBENShuKnApOyBkNS50X2M2DQpkNi50X2M2IDwtIEQ2KG4qcCk7IGQ2LnRfYzYNCmQ3LnRfYzYgPC0gRDcobipwKTsgZDcudF9jNg0KYGBgDQoNCiMjIyBFbnRyb3BpYXMgZSB2YXJpw6JuY2lhIGRhcyBlbnRyb3BpYXMgey51bmxpc3RlZCAudW5udW1iZXJlZH0NCg0KYGBge3IgY29sbGFwc2U9VFJVRX0NCiMgRW50cm9waWFzIHRlb3JpY2FzDQoNCkhzIDwtIC1zdW0ocCpsb2cocCkpICMgZW50cm9waWEgZGUgc2hhbm5vbg0KSHIgPC0gLWxvZyhzdW0ocF4yKSkgIyBlbnRyb3BpYSBkZSByZW55aSBjb20gYWxwaGEgPSAyDQpIdCA8LSAxIC0gc3VtKHBeMikgIyBlbnRyb3BpYSBkZSB0c2FsbGlzIGNvbSBhbHBoYSA9IDINCmBgYA0KDQpgYGB7ciBjb2xsYXBzZT1UUlVFfQ0KIyB2YXJpYW5jaWEgdGVvcmljYSBkYXMgZW50cm9waWFzDQoNCnZfc2hhbm5vbiA8LSAoIHN1bShwKihsb2cocCleMikpIC0gIChIc14yKSApL24gDQp2X3JlbnlpIDwtICggNCooICgoc3VtKHBeMileKC0yKSkgKiBzdW0ocF4zKSkgLSAxICkgKS9uICANCnZfdHNhbGxpcyA8LSAoIDQqKHN1bShwXjMpIC0gKHN1bShwXjIpXjIpKSApL24NCg0KYGBgDQoNCiMjIyBWYXJpw6JuY2lhcyBhc3NpbnTDs3RpY2FzIGRlIGFsZ3VucyDDrW5kaWNlcyBkZSBkb21pbsOibmNpYSB7LnVubGlzdGVkIC51bm51bWJlcmVkfQ0KYGBge3IgY29sbGFwc2U9VFJVRX0NCiMgVmFyaWFuY2lhIHRlb3JpY2EgZG9zIGluZGljZXMgZGUgZG9taW5hbmNpYQ0KDQprIDwtIGxlbmd0aChwKSAjIG51bWVybyBkZSBlbXByZXNhcw0KDQp2MSA8LSAoKGsvKGstMSkpXjIpICogdl90c2FsbGlzICMgdmFyaWFuY2lhIGRvIEQxDQp2MyA8LSB2X3NoYW5ub24vKGxvZyhrKV4yKSAjIHZhcmlhbmNpYSBkbyBEMw0KdjYgPC0gKChrLyhrLTEpKV4yKSAqIHZfdHNhbGxpcyAjIHZhcmlhbmNpYSBkbyBENg0KDQp2MTsgdjM7IHY2DQpgYGANCg0KIyMjIFBsb3RhZ2VtIHsudW5saXN0ZWQgLnVubnVtYmVyZWR9DQpgYGB7cn0NCiMgSGlzdG9ncmFtYXMgQ2FzbyA2IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQojIGNvbSBOID0gMTAwMA0KDQptZWRpYXMgPC0gYyhkMS50X2M2LCBOQSwgZDMudF9jNiwgSHMsIEhyLCBkNi50X2M2LCBkMS50X2M2KQ0KdmFyaWFuY2lhcyA8LSBjKHYxLCBOQSwgdjMsIHZfc2hhbm5vbiwgdl9yZW55aSwgdjYsIHYxKQ0KcGxvdGFnZW0oaWRfYzYuMSwgbWVkaWFzLCB2YXJpYW5jaWFzLCBrLCA2LCBwKQ0KDQojIGNvbSBOID0gMzAwMA0KDQptZWRpYXMgPC0gYyhkMS50X2M2LCBOQSwgZDMudF9jNiwgSHMsIEhyLCBkNi50X2M2LCBkMS50X2M2KQ0KdmFyaWFuY2lhcyA8LSBjKHYxLCBOQSwgdjMsIHZfc2hhbm5vbiwgdl9yZW55aSwgdjYsIHYxKQ0KcGxvdGFnZW0oaWRfYzYuMiwgbWVkaWFzLCB2YXJpYW5jaWFzLCBrLCA2LCBwKQ0KDQpgYGANCg0KIyMgQ29uZmlndXJhw6fDo28gNyAgey51bmxpc3RlZCAudW5udW1iZXJlZH0NCkNvbSAxMDAwIGFtb3N0cmFzOg0KYGBge3J9DQojIENhc28gNyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KbiA8LSAxMDAwICMgdGFtYW5obyBkZSBjYWRhIGFtb3N0cmENCg0KIyBOID0gMTAwMA0KDQpOIDwtIDEwMDAgIyBudW1lcm8gZGUgYW1vc3RyYXMNCnAgPC0gYygwLjA5LCAwLjExLCAwLjA5LCAwLjExLCAwLjA5LCAwLjExLCAwLjA5LCAwLjExLCAwLjA5LCAwLjExKSAjIHBhcnRpY2lwYWNvZXMgZGUgbWVyY2Fkbw0KDQpzZXQuc2VlZCgxMjMpDQphIDwtIHJtdWx0aW5vbShOLCBuLCBwKQ0KaWRfYzcuMSA8LSBpZChhLCBOKQ0KYGBgDQoNCkNvbSAzMDAwIGFtb3N0cmFzOg0KYGBge3J9DQojIE4gPSAzMDAwDQoNCk4gPC0gMzAwMCAjIG51bWVybyBkZSBhbW9zdHJhcw0KcCA8LSBjKDAuMDksIDAuMTEsIDAuMDksIDAuMTEsIDAuMDksIDAuMTEsIDAuMDksIDAuMTEsIDAuMDksIDAuMTEpICMgcGFydGljaXBhY29lcyBkZSBtZXJjYWRvDQoNCnNldC5zZWVkKDEyMykNCmEgPC0gcm11bHRpbm9tKE4sIG4sIHApDQppZF9jNy4yIDwtIGlkKGEsIE4pDQoNCmBgYA0KDQojIyMgw41uZGljZXMgZGUgZG9taW7Dom5jaWEgdGXDs3JpY29zIHBhcmEgZXNzYSBjb25maWd1cmHDp8OjbyB7LnVubGlzdGVkIC51bm51bWJlcmVkfQ0KYGBge3IgY29sbGFwc2U9VFJVRX0NCiMgQ2FsY3VsbyBkbyB2YWxvciB0ZW9yaWNvIGRvcyBpbmRpY2VzIGRlIGRvbWluYW5jaWENCmQxLnRfYzcgPC0gRDEobipwKTsgZDEudF9jNw0KZDIudF9jNyA8LSBEMihuKnApOyBkMi50X2M3DQpkMy50X2M3IDwtIEQzKG4qcCk7IGQzLnRfYzcNCmQ0LnRfYzcgPC0gRDQobipwKTsgZDQudF9jNw0KZDUudF9jNyA8LSBENShuKnApOyBkNS50X2M3DQpkNi50X2M3IDwtIEQ2KG4qcCk7IGQ2LnRfYzcNCmQ3LnRfYzcgPC0gRDcobipwKTsgZDcudF9jNw0KYGBgDQoNCiMjIyBFbnRyb3BpYXMgZSB2YXJpw6JuY2lhIGRhcyBlbnRyb3BpYXMgey51bmxpc3RlZCAudW5udW1iZXJlZH0NCg0KYGBge3IgY29sbGFwc2U9VFJVRX0NCiMgRW50cm9waWFzIHRlb3JpY2FzDQoNCkhzIDwtIC1zdW0ocCpsb2cocCkpICMgZW50cm9waWEgZGUgc2hhbm5vbg0KSHIgPC0gLWxvZyhzdW0ocF4yKSkgIyBlbnRyb3BpYSBkZSByZW55aSBjb20gYWxwaGEgPSAyDQpIdCA8LSAxIC0gc3VtKHBeMikgIyBlbnRyb3BpYSBkZSB0c2FsbGlzIGNvbSBhbHBoYSA9IDINCg0KYGBgDQoNCmBgYHtyIGNvbGxhcHNlPVRSVUV9DQojIHZhcmlhbmNpYSB0ZW9yaWNhIGRhcyBlbnRyb3BpYXMNCg0Kdl9zaGFubm9uIDwtICggc3VtKHAqKGxvZyhwKV4yKSkgLSAgKEhzXjIpICkvbiANCnZfcmVueWkgPC0gKCA0KiggKChzdW0ocF4yKV4oLTIpKSAqIHN1bShwXjMpKSAtIDEgKSApL24gDQp2X3RzYWxsaXMgPC0gKCA0KihzdW0ocF4zKSAtIChzdW0ocF4yKV4yKSkgKS9uDQoNCmBgYA0KDQojIyMgVmFyacOibmNpYXMgYXNzaW50w7N0aWNhcyBkZSBhbGd1bnMgw61uZGljZXMgZGUgZG9taW7Dom5jaWEgey51bmxpc3RlZCAudW5udW1iZXJlZH0NCmBgYHtyIGNvbGxhcHNlPVRSVUV9DQojIFZhcmlhbmNpYSB0ZW9yaWNhIGRvcyBpbmRpY2VzIGRlIGRvbWluYW5jaWENCg0KayA8LSBsZW5ndGgocCkgIyBudW1lcm8gZGUgZW1wcmVzYXMNCg0KdjEgPC0gKChrLyhrLTEpKV4yKSAqIHZfdHNhbGxpcyAjIHZhcmlhbmNpYSBkbyBEMQ0KdjMgPC0gdl9zaGFubm9uLyhsb2coayleMikgIyB2YXJpYW5jaWEgZG8gRDMNCnY2IDwtICgoay8oay0xKSleMikgKiB2X3RzYWxsaXMgIyB2YXJpYW5jaWEgZG8gRDYNCmBgYA0KDQojIyMgUGxvdGFnZW0gey51bmxpc3RlZCAudW5udW1iZXJlZH0NCmBgYHtyfQ0KIyBIaXN0b2dyYW1hcyBDYXNvIDcgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCiMgY29tIE4gPSAxMDAwDQoNCm1lZGlhcyA8LSBjKGQxLnRfYzcsIE5BLCBkMy50X2M3LCBIcywgSHIsIGQ2LnRfYzcsIGQxLnRfYzcpDQp2YXJpYW5jaWFzIDwtIGModjEsIE5BLCB2Mywgdl9zaGFubm9uLCB2X3JlbnlpLCB2NiwgdjEpDQpwbG90YWdlbShpZF9jNy4xLCBtZWRpYXMsIHZhcmlhbmNpYXMsIGssIDcsIHApDQoNCiMgY29tIE4gPSAzMDAwDQoNCm1lZGlhcyA8LSBjKGQxLnRfYzcsIE5BLCBkMy50X2M3LCBIcywgSHIsIGQ2LnRfYzcsIGQxLnRfYzcpDQp2YXJpYW5jaWFzIDwtIGModjEsIE5BLCB2Mywgdl9zaGFubm9uLCB2X3JlbnlpLCB2NiwgdjEpDQpwbG90YWdlbShpZF9jNy4yLCBtZWRpYXMsIHZhcmlhbmNpYXMsIGssIDcsIHApDQpgYGANCg0KIyMgQ29uZmlndXJhw6fDo28gOCAgey51bmxpc3RlZCAudW5udW1iZXJlZH0NCkNvbSAxMDAwIGFtb3N0cmFzOg0KYGBge3J9DQojIENhc28gOCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KbiA8LSAxMDAwICMgdGFtYW5obyBkZSBjYWRhIGFtb3N0cmENCg0KIyBOID0gMTAwMA0KDQpOIDwtIDEwMDAgIyBudW1lcm8gZGUgYW1vc3RyYXMNCnAgPC0gYygwLjkxLCAwLjAxLCAwLjAxLCAwLjAxLCAwLjAxLCAwLjAxLCAwLjAxLCAwLjAxLCAwLjAxLCAwLjAxKSAjIHBhcnRpY2lwYWNvZXMgZGUgbWVyY2Fkbw0KDQpzZXQuc2VlZCgxMjMpDQphIDwtIHJtdWx0aW5vbShOLCBuLCBwKQ0KaWRfYzguMSA8LSBpZChhLCBOKQ0KDQpgYGANCg0KQ29tIDMwMDAgYW1vc3RyYXM6DQpgYGB7cn0NCiMgTiA9IDMwMDANCg0KTiA8LSAzMDAwICMgbnVtZXJvIGRlIGFtb3N0cmFzDQpwIDwtIGMoMC45MSwgMC4wMSwgMC4wMSwgMC4wMSwgMC4wMSwgMC4wMSwgMC4wMSwgMC4wMSwgMC4wMSwgMC4wMSkgIyBwYXJ0aWNpcGFjb2VzIGRlIG1lcmNhZG8NCg0Kc2V0LnNlZWQoMTIzKQ0KYSA8LSBybXVsdGlub20oTiwgbiwgcCkNCmlkX2M4LjIgPC0gaWQoYSwgTikNCmBgYA0KDQojIyMgw41uZGljZXMgZGUgZG9taW7Dom5jaWEgdGXDs3JpY29zIHBhcmEgZXNzYSBjb25maWd1cmHDp8OjbyB7LnVubGlzdGVkIC51bm51bWJlcmVkfQ0KYGBge3IgY29sbGFwc2U9VFJVRX0NCiMgQ2FsY3VsbyBkbyB2YWxvciB0ZW9yaWNvIGRvcyBpbmRpY2VzIGRlIGRvbWluYW5jaWENCmQxLnRfYzggPC0gRDEobipwKQ0KZDIudF9jOCA8LSBEMihuKnApDQpkMy50X2M4IDwtIEQzKG4qcCkNCmQ0LnRfYzggPC0gRDQobipwKQ0KZDUudF9jOCA8LSBENShuKnApDQpkNi50X2M4IDwtIEQ2KG4qcCkNCmQ3LnRfYzggPC0gRDcobipwKQ0KYGBgDQoNCiMjIyBFbnRyb3BpYXMgZSB2YXJpw6JuY2lhIGRhcyBlbnRyb3BpYXMgey51bmxpc3RlZCAudW5udW1iZXJlZH0NCg0KYGBge3IgY29sbGFwc2U9VFJVRX0NCiMgRW50cm9waWFzIHRlb3JpY2FzDQoNCkhzIDwtIC1zdW0ocCpsb2cocCkpICMgZW50cm9waWEgZGUgc2hhbm5vbg0KSHIgPC0gLWxvZyhzdW0ocF4yKSkgIyBlbnRyb3BpYSBkZSByZW55aSBjb20gYWxwaGEgPSAyDQpIdCA8LSAxIC0gc3VtKHBeMikgIyBlbnRyb3BpYSBkZSB0c2FsbGlzIGNvbSBhbHBoYSA9IDINCg0KYGBgDQoNCmBgYHtyIGNvbGxhcHNlPVRSVUV9DQojIHZhcmlhbmNpYSB0ZW9yaWNhIGRhcyBlbnRyb3BpYXMNCg0Kdl9zaGFubm9uIDwtICggc3VtKHAqKGxvZyhwKV4yKSkgLSAgKEhzXjIpICkvbiANCnZfcmVueWkgPC0gKCA0KiggKChzdW0ocF4yKV4oLTIpKSAqIHN1bShwXjMpKSAtIDEgKSApL24NCnZfdHNhbGxpcyA8LSAoIDQqKHN1bShwXjMpIC0gKHN1bShwXjIpXjIpKSApL24NCg0KYGBgDQoNCiMjIyBWYXJpw6JuY2lhcyBhc3NpbnTDs3RpY2FzIGRlIGFsZ3VucyDDrW5kaWNlcyBkZSBkb21pbsOibmNpYSB7LnVubGlzdGVkIC51bm51bWJlcmVkfQ0KYGBge3IgY29sbGFwc2U9VFJVRX0NCiMgVmFyaWFuY2lhIHRlb3JpY2EgZG9zIGluZGljZXMgZGUgZG9taW5hbmNpYQ0KDQprIDwtIGxlbmd0aChwKSAjIG51bWVybyBkZSBlbXByZXNhcw0KDQp2MSA8LSAoKGsvKGstMSkpXjIpICogdl90c2FsbGlzICMgdmFyaWFuY2lhIGRvIEQxDQp2MyA8LSB2X3NoYW5ub24vKGxvZyhrKV4yKSAjIHZhcmlhbmNpYSBkbyBEMw0KdjYgPC0gKChrLyhrLTEpKV4yKSAqIHZfdHNhbGxpcyAjIHZhcmlhbmNpYSBkbyBENg0KYGBgDQoNCiMjIyBQbG90YWdlbSB7LnVubGlzdGVkIC51bm51bWJlcmVkfQ0KYGBge3J9DQojIEhpc3RvZ3JhbWFzIENhc28gOCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KIyBjb20gTiA9IDEwMDANCg0KbWVkaWFzIDwtIGMoZDEudF9jOCwgTkEsIGQzLnRfYzgsIEhzLCBIciwgZDYudF9jOCwgZDEudF9jOCkNCnZhcmlhbmNpYXMgPC0gYyh2MSwgTkEsIHYzLCB2X3NoYW5ub24sIHZfcmVueWksIHY2LCB2MSkNCnBsb3RhZ2VtKGlkX2M4LjEsIG1lZGlhcywgdmFyaWFuY2lhcywgaywgOCwgcCkNCg0KIyBjb20gTiA9IDMwMDANCg0KbWVkaWFzIDwtIGMoZDEudF9jOCwgTkEsIGQzLnRfYzgsIEhzLCBIciwgZDYudF9jOCwgZDEudF9jOCkNCnZhcmlhbmNpYXMgPC0gYyh2MSwgTkEsIHYzLCB2X3NoYW5ub24sIHZfcmVueWksIHY2LCB2MSkNCnBsb3RhZ2VtKGlkX2M4LjIsIG1lZGlhcywgdmFyaWFuY2lhcywgaywgOCwgcCkNCmBgYA0KDQojIyBDb25maWd1cmHDp8OjbyA5ICB7LnVubGlzdGVkIC51bm51bWJlcmVkfQ0KQ29tIDEwMDAgYW1vc3RyYXM6DQpgYGB7cn0NCiMgQ2FzbyA5IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQpuIDwtIDEwMDAgIyB0YW1hbmhvIGRlIGNhZGEgYW1vc3RyYQ0KDQojIE4gPSAxMDAwDQoNCk4gPC0gMTAwMCAjIG51bWVybyBkZSBhbW9zdHJhcw0KcCA8LSBjKDAuNDUsIDAuNDcsIDAuMDEsIDAuMDEsIDAuMDEsIDAuMDEsIDAuMDEsIDAuMDEsIDAuMDEsIDAuMDEpICMgcGFydGljaXBhY29lcyBkZSBtZXJjYWRvDQoNCnNldC5zZWVkKDEyMykNCmEgPC0gcm11bHRpbm9tKE4sIG4sIHApDQppZF9jOS4xIDwtIGlkKGEsIE4pDQoNCmBgYA0KDQpDb20gMzAwMCBhbW9zdHJhczoNCmBgYHtyfQ0KIyBOID0gMzAwMA0KDQpOIDwtIDMwMDAgIyBudW1lcm8gZGUgYW1vc3RyYXMNCnAgPC0gYygwLjQ1LCAwLjQ3LCAwLjAxLCAwLjAxLCAwLjAxLCAwLjAxLCAwLjAxLCAwLjAxLCAwLjAxLCAwLjAxKSAjIHBhcnRpY2lwYWNvZXMgZGUgbWVyY2Fkbw0KDQpzZXQuc2VlZCgxMjMpDQphIDwtIHJtdWx0aW5vbShOLCBuLCBwKQ0KaWRfYzkuMiA8LSBpZChhLCBOKQ0KYGBgDQoNCiMjIyDDjW5kaWNlcyBkZSBkb21pbsOibmNpYSB0ZcOzcmljb3MgcGFyYSBlc3NhIGNvbmZpZ3VyYcOnw6NvIHsudW5saXN0ZWQgLnVubnVtYmVyZWR9DQpgYGB7ciBjb2xsYXBzZT1UUlVFfQ0KIyBDYWxjdWxvIGRvIHZhbG9yIHRlb3JpY28gZG9zIGluZGljZXMgZGUgZG9taW5hbmNpYQ0KZDEudF9jOSA8LSBEMShuKnApOyBkMS50X2M5DQpkMi50X2M5IDwtIEQyKG4qcCk7IGQyLnRfYzkNCmQzLnRfYzkgPC0gRDMobipwKTsgZDMudF9jOQ0KZDQudF9jOSA8LSBENChuKnApOyBkNC50X2M5DQpkNS50X2M5IDwtIEQ1KG4qcCk7IGQ1LnRfYzkNCmQ2LnRfYzkgPC0gRDYobipwKTsgZDYudF9jOQ0KZDcudF9jOSA8LSBENyhuKnApOyBkNy50X2M5DQpgYGANCg0KIyMjIEVudHJvcGlhcyBlIHZhcmnDom5jaWEgZGFzIGVudHJvcGlhcyB7LnVubGlzdGVkIC51bm51bWJlcmVkfQ0KDQpgYGB7ciBjb2xsYXBzZT1UUlVFfQ0KIyBFbnRyb3BpYXMgdGVvcmljYXMNCg0KSHMgPC0gLXN1bShwKmxvZyhwKSkgIyBlbnRyb3BpYSBkZSBzaGFubm9uDQpIciA8LSAtbG9nKHN1bShwXjIpKSAjIGVudHJvcGlhIGRlIHJlbnlpIGNvbSBhbHBoYSA9IDINCkh0IDwtIDEgLSBzdW0ocF4yKSAjIGVudHJvcGlhIGRlIHRzYWxsaXMgY29tIGFscGhhID0gMg0KYGBgDQoNCmBgYHtyIGNvbGxhcHNlPVRSVUV9DQojIHZhcmlhbmNpYSB0ZW9yaWNhIGRhcyBlbnRyb3BpYXMNCg0Kdl9zaGFubm9uIDwtICggc3VtKHAqKGxvZyhwKV4yKSkgLSAgKEhzXjIpICkvbiANCnZfcmVueWkgPC0gKCA0KiggKChzdW0ocF4yKV4oLTIpKSAqIHN1bShwXjMpKSAtIDEgKSApL24gDQp2X3RzYWxsaXMgPC0gKCA0KihzdW0ocF4zKSAtIChzdW0ocF4yKV4yKSkgKS9uDQpgYGANCg0KIyMjIFZhcmnDom5jaWFzIGFzc2ludMOzdGljYXMgZGUgYWxndW5zIMOtbmRpY2VzIGRlIGRvbWluw6JuY2lhIHsudW5saXN0ZWQgLnVubnVtYmVyZWR9DQpgYGB7ciBjb2xsYXBzZT1UUlVFfQ0KIyBWYXJpYW5jaWEgdGVvcmljYSBkb3MgaW5kaWNlcyBkZSBkb21pbmFuY2lhDQoNCmsgPC0gbGVuZ3RoKHApICMgbnVtZXJvIGRlIGVtcHJlc2FzDQoNCnYxIDwtICgoay8oay0xKSleMikgKiB2X3RzYWxsaXMgIyB2YXJpYW5jaWEgZG8gRDENCnYzIDwtIHZfc2hhbm5vbi8obG9nKGspXjIpICMgdmFyaWFuY2lhIGRvIEQzDQp2NiA8LSAoKGsvKGstMSkpXjIpICogdl90c2FsbGlzICMgdmFyaWFuY2lhIGRvIEQ2DQpgYGANCg0KIyMjIFBsb3RhZ2VtIHsudW5saXN0ZWQgLnVubnVtYmVyZWR9DQpgYGB7cn0NCiMgSGlzdG9ncmFtYXMgQ2FzbyA5IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQojIGNvbSBOID0gMTAwMA0KDQptZWRpYXMgPC0gYyhkMS50X2M5LCBOQSwgZDMudF9jOSwgSHMsIEhyLCBkNi50X2M5LCBkMS50X2M5KQ0KdmFyaWFuY2lhcyA8LSBjKHYxLCBOQSwgdjMsIHZfc2hhbm5vbiwgdl9yZW55aSwgdjYsIHYxKQ0KcGxvdGFnZW0oaWRfYzkuMSwgbWVkaWFzLCB2YXJpYW5jaWFzLCBrLCA5LCBwKQ0KDQojIGNvbSBOID0gMzAwMA0KDQptZWRpYXMgPC0gYyhkMS50X2M5LCBOQSwgZDMudF9jOSwgSHMsIEhyLCBkNi50X2M5LCBkMS50X2M5KQ0KdmFyaWFuY2lhcyA8LSBjKHYxLCBOQSwgdjMsIHZfc2hhbm5vbiwgdl9yZW55aSwgdjYsIHYxKQ0KcGxvdGFnZW0oaWRfYzkuMiwgbWVkaWFzLCB2YXJpYW5jaWFzLCBrLCA5LCBwKQ0KYGBgDQoNCiMgVGVzdGUgZGUgTm9ybWFsaWRhZGUgLSBKYXJxdWUtQmVyYQ0KYGBge3IsIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpsaWJyYXJ5KHRzZXJpZXMpDQpsaWJyYXJ5KGtuaXRyKQ0KbGlicmFyeShkcGx5cikNCmxpYnJhcnkoa2FibGVFeHRyYSkNCg0KIyBJZGVudGlmaWNhIHRvZGFzIGFzIG1hdHJpemVzIGlkX2MxLjEgYXTDqSBpZF9jOS4yDQpub21lc19tYXRyaXplcyA8LSBscyhwYXR0ZXJuID0gIl5pZF9jWzEtOV1cXC5bMTJdJCIpICMgcGVnYSB0b2RvcyBvcyBub21lcyBuZXNzZSBwYWRyw6NvDQoNCiMgTGlzdGEgcGFyYSBhcm1hemVuYXIgcmVzdWx0YWRvcw0KbGlzdGFfcmVzdWx0YWRvcyA8LSBsaXN0KCkNCg0KZm9yIChub21lIGluIG5vbWVzX21hdHJpemVzKSB7DQogIGRhZG9zIDwtIGdldChub21lKQ0KICANCiAgIyBGdW5jYW8gcGFyYSB0ZXN0YXIgbm9ybWFsaWRhZGUNCiAgdGVzdGUgPC0gZnVuY3Rpb24oY29sdW5hKSB7DQogICAgdGVzdGUgPC0gamFycXVlLmJlcmEudGVzdChjb2x1bmEpDQogICAgcCA8LSB0ZXN0ZSRwLnZhbHVlDQogICAgaWYgKHAgPD0gMC4wMSkgew0KICAgICAgIjw9IDAuMDEiDQogICAgfSBlbHNlIHsNCiAgICAgIHJvdW5kKHAsIDQpfQ0KICAgIH0NCiAgDQogICMgQXBsaWNhbmRvIG8gdGVzdGUgcG9yIGNvbHVuYQ0KICBwX3ZhbHMgPC0gYXBwbHkoZGFkb3MsIDIsIHRlc3RlKQ0KICANCiAgIyBSZW1vdmUgbyBwcmVmaXhvICJpZF9jIg0KICBub21lX2N1cnRvIDwtIHN1YigiXmlkX2MiLCAiIiwgbm9tZSkNCiAgDQogICMgQ3JpYSBsaW5oYSBkYSB0YWJlbGENCiAgbGlzdGFfcmVzdWx0YWRvc1tbbm9tZV1dIDwtIGRhdGEuZnJhbWUoDQogICAgQ2VuYXJpbyA9IG5vbWVfY3VydG8sDQogICAgdChwX3ZhbHMpLA0KICAgIHJvdy5uYW1lcyA9IE5VTEwNCiAgKQ0KfQ0KDQojIEp1bnRhIHRvZGFzIGFzIGxpbmhhcw0KdGFiZWxhX2ZpbmFsIDwtIGRvLmNhbGwocmJpbmQsIGxpc3RhX3Jlc3VsdGFkb3MpDQpyb3cubmFtZXModGFiZWxhX2ZpbmFsKSA8LSBOVUxMDQoNCiMgQ29sb3JpciB2YWxvcmVzICI8PSAwLjAxIiBlbSB2ZXJtZWxobw0KdGFiZWxhX2NvbG9yaWRhIDwtIHRhYmVsYV9maW5hbCAlPiUNCiAgbXV0YXRlKGFjcm9zcygNCiAgICAtQ2VuYXJpbywNCiAgICB+IHsNCiAgICAgIHggPC0gYXMuY2hhcmFjdGVyKC54KQ0KICAgICAgaWZlbHNlKHggPT0gIjw9IDAuMDEiLA0KICAgICAgICAgICAgIGNlbGxfc3BlYyh4LCBmb3JtYXQgPSAiaHRtbCIsIGNvbG9yID0gInJlZCIpLA0KICAgICAgICAgICAgIHgpDQogICAgfQ0KICApKQ0KDQojIFJlbmRlcml6YXIgdGFiZWxhDQprYWJsZSh0YWJlbGFfY29sb3JpZGEsDQogICAgICBmb3JtYXQgPSAiaHRtbCIsDQogICAgICBlc2NhcGUgPSBGQUxTRSkgJT4lDQogIGthYmxlX3N0eWxpbmcoDQogICAgZnVsbF93aWR0aCA9IFRSVUUsDQogICAgYm9vdHN0cmFwX29wdGlvbnMgPSBjKCJzdHJpcGVkIiwgImhvdmVyIiwgImNvbmRlbnNlZCIsICJyZXNwb25zaXZlIikNCiAgKQ0KYGBgDQoNCiMgRXJybyBRdWFkcsOhdGljbyBNw6lkaW8NCg0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCiMgRXJybyBxdWFkcsOhdGljbyBtw6lkaW8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCmNhc29zIDwtIDE6OQ0KZHMgPC0gMTo3DQoNCiMgQ29udmVydGUgMyAtPiAiRDMiDQpub21lX2QgPC0gZnVuY3Rpb24oaikgcGFzdGUwKCJEIiwgaikNCg0KIyBGdW7Dp8OjbyBxdWUgY2FsY3VsYSBwYXJhIGlkX2NYLlkNCnByb2Nlc3Nhcl9zdWJjYXNvIDwtIGZ1bmN0aW9uKGNhc28sIHN1Yikgew0KICANCiAgIyBvYmpldG8gaWRfY1guWSAgKFkgPSAxIG91IDIpDQogIGlkX21hdCA8LSBnZXQocGFzdGUwKCJpZF9jIiwgY2FzbywgIi4iLCBzdWIpKQ0KICANCiAgZXFtIDwtIG51bWVyaWMobGVuZ3RoKGRzKSkNCiAgDQogIGZvciAoaiBpbiBkcykgew0KICAgIGRfdmVjIDwtIGdldChwYXN0ZTAoImQiLCBqLCAiLnRfYyIsIGNhc28pKQ0KICAgIGVxbVtqXSA8LSBtZWFuKChpZF9tYXRbLCBqXSAtIGRfdmVjKV4yKQ0KICB9DQogIA0KICBvcmRlbSA8LSBvcmRlcihlcW0pDQogIA0KICBkYXRhLmZyYW1lKA0KICAgIGNhc28gPSBwYXN0ZTAoY2FzbywgIi4iLCBzdWIpLA0KICAgIG1lbGhvciA9IG5vbWVfZChvcmRlbVsxXSksDQogICAgc2VndW5kb19tZWxob3IgPSBub21lX2Qob3JkZW1bMl0pDQogICkNCn0NCg0KIyBBcGxpY2EgcGFyYSB0b2RvcyBvcyBjYXNvcyAxLjEsIDEuMiwgMi4xLCAyLjIsIC4uLiwgOS4yDQpyZXN1bHRhZG8gPC0gZG8uY2FsbCgNCiAgcmJpbmQsDQogIGxhcHBseShjYXNvcywgZnVuY3Rpb24oY2Fzbykgew0KICAgIHJiaW5kKA0KICAgICAgcHJvY2Vzc2FyX3N1YmNhc28oY2FzbywgMSksDQogICAgICBwcm9jZXNzYXJfc3ViY2FzbyhjYXNvLCAyKQ0KICAgICkNCiAgfSkNCikNCg0KIyBSZW5kZXJpemFyIHRhYmVsYQ0Ka2FibGUocmVzdWx0YWRvKSAlPiUNCiAga2FibGVfc3R5bGluZygNCiAgICBmdWxsX3dpZHRoID0gVFJVRSwNCiAgICBib290c3RyYXBfb3B0aW9ucyA9IGMoInN0cmlwZWQiLCAiaG92ZXIiLCAiY29uZGVuc2VkIiwgInJlc3BvbnNpdmUiKQ0KICApDQpgYGANCg0KIyBDb2VmaWNpZW50ZSBkZSB2YXJpYcOnw6NvDQoNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQojIENvZWZpY2llbnRlIGRlIHZhcmlhw6fDo28gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQpjYXNvcyA8LSAxOjkNCmRzIDwtIDE6Nw0KDQojIENvbnZlcnRlIDMgLT4gIkQzIg0Kbm9tZV9kIDwtIGZ1bmN0aW9uKGopIHBhc3RlMCgiRCIsIGopDQoNCiMgRnVuw6fDo28gY29lZmljaWVudGUgZGUgdmFyaWHDp8OjbyBkaXJldG8gZGEgYW1vc3RyYQ0KY29lZl92YXIgPC0gZnVuY3Rpb24oeCkgew0KICBtIDwtIG1lYW4oeCkNCiAgcyA8LSBzZCh4KQ0KICBpZiAobSA9PSAwKSByZXR1cm4oSW5mKSAgICMgZXZpdGEgZGl2aXPDo28gcG9yIHplcm8NCiAgcyAvIG0NCn0NCg0KIyBGdW7Dp8OjbyBwYXJhIHByb2Nlc3NhciBjYWRhIHN1YmNhc28gWC5ZDQpwcm9jZXNzYXJfc3ViY2Fzb19jdl9hbW9zdHJhIDwtIGZ1bmN0aW9uKGNhc28sIHN1Yikgew0KICANCiAgIyBvYmpldG8gaWRfY1guWQ0KICBpZF9tYXQgPC0gZ2V0KHBhc3RlMCgiaWRfYyIsIGNhc28sICIuIiwgc3ViKSkNCiAgDQogIGN2IDwtIG51bWVyaWMobGVuZ3RoKGRzKSkNCiAgDQogIGZvciAoaiBpbiBkcykgew0KICAgIGFtb3N0cmEgPC0gaWRfbWF0Wywgal0NCiAgICBjdltqXSA8LSBjb2VmX3ZhcihhbW9zdHJhKQ0KICB9DQogIA0KICBvcmRlbSA8LSBvcmRlcihjdikNCiAgDQogIGRhdGEuZnJhbWUoDQogICAgY2FzbyA9IHBhc3RlMChjYXNvLCAiLiIsIHN1YiksDQogICAgbWVsaG9yID0gbm9tZV9kKG9yZGVtWzFdKSwNCiAgICBzZWd1bmRvX21lbGhvciA9IG5vbWVfZChvcmRlbVsyXSkNCiAgKQ0KfQ0KDQojIFRhYmVsYSBmaW5hbDogMS4xLCAxLjIsIC4uLiwgOS4yDQpyZXN1bHRhZG9fY3ZfYW1vc3RyYSA8LSBkby5jYWxsKA0KICByYmluZCwNCiAgbGFwcGx5KGNhc29zLCBmdW5jdGlvbihjYXNvKSB7DQogICAgcmJpbmQoDQogICAgICBwcm9jZXNzYXJfc3ViY2Fzb19jdl9hbW9zdHJhKGNhc28sIDEpLA0KICAgICAgcHJvY2Vzc2FyX3N1YmNhc29fY3ZfYW1vc3RyYShjYXNvLCAyKQ0KICAgICkNCiAgfSkNCikNCg0KIyBSZW5kZXJpemFyIHRhYmVsYQ0Ka2FibGUocmVzdWx0YWRvX2N2X2Ftb3N0cmEpICU+JQ0KICBrYWJsZV9zdHlsaW5nKA0KICAgIGZ1bGxfd2lkdGggPSBUUlVFLA0KICAgIGJvb3RzdHJhcF9vcHRpb25zID0gYygic3RyaXBlZCIsICJob3ZlciIsICJjb25kZW5zZWQiLCAicmVzcG9uc2l2ZSIpDQogICkNCg0KYGBgDQoNCg0KDQo=