1. Introdução
Neste roteiro prático, vamos aplicar os conceitos fundamentais da
econometria de séries temporais para analisar uma proxy mensal do
Produto Interno Bruto (PIB) do Brasil, o Indicador de Atividade
Econômica da FGV (IAE-FGV). Sendo um dado de alta frequência, esta série
exibe características temporais complexas (tendência, sazonalidade
mensal) que a tornam um excelente objeto de estudo. Nosso objetivo é
diagnosticar essas características, entender por que elas são um
“problema” para a modelagem tradicional, e aprender como tratá-las
adequadamente.
2. Preparação do Ambiente
Carregamos os pacotes que nos darão as ferramentas para baixar,
manipular, visualizar e testar os dados.
# Pacote para acessar dados do Banco Central do Brasil
library(rbcb)
# Coleção de pacotes para manipulação e visualização de dados
library(tidyverse)
# Pacote específico para testes de raiz unitária
library(tseries)
3. Aquisição e Análise Inicial dos Dados
Utilizaremos o pacote rbcb para importar a série do PIB
mensal (código 4380 no SGS-BCB) a partir de 1996. Para estabilizar a
variância da série e para que as diferenças possam ser interpretadas
como taxas de crescimento, trabalharemos com o logaritmo natural
da série.
# Código da série PIB mensal (proxy) no SGS-BCB
codigo_pib_mensal <- 4380
# Obter a série histórica a partir de 1996
pib_mensal_df <- rbcb::get_series(c(PIB_Mensal = codigo_pib_mensal), start_date = "1996-01-01")
# Calcular o logaritmo natural
pib_mensal_df <- pib_mensal_df %>%
mutate(log_PIB_Mensal = log(PIB_Mensal))
# Plotar a série do log(PIB_Mensal)
ggplot(pib_mensal_df, aes(x = date, y = log_PIB_Mensal)) +
geom_line(color = "darkblue", size = 1) +
labs(
title = "Logaritmo do PIB Mensal do Brasil (Proxy IAE-FGV)",
subtitle = "Série observada a valores correntes",
x = "Ano",
y = "Log(PIB Mensal)"
) +
theme_minimal()
## Warning: Using `size` aesthetic for lines was deprecated in ggplot2 3.4.0.
## ℹ Please use `linewidth` instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.

O gráfico revela uma clara tendência de crescimento
ao longo do tempo. A série definitivamente não flutua em torno de uma
média constante, o que é um forte indício visual de
não-estacionariedade.
4. Decomposição da Série Temporal
Para entender melhor a estrutura dos dados, vamos decompor a série em
seus componentes. Uma série temporal \(Y_t\) pode ser vista como a soma de uma
tendência (\(T_t\)), um componente
sazonal (\(S_t\)), e um componente
irregular (\(e_t\)).
\(Y_t = T_t + S_t + e_t\)
- Tendência: O movimento de longo prazo da
série.
- Sazonalidade: Flutuações periódicas que ocorrem
dentro de um ano. Com dados mensais, esperamos um padrão que se repete a
cada 12 meses (ex: Dezembro é tipicamente um mês de alta
atividade).
- Irregular (Ruído): Choques não previsíveis.
Para isso, convertemos nossos dados para um objeto ts,
informando ao R que se trata de uma série mensal
(frequency = 12).
# Converter a série para o formato ts, especificando a frequência MENSAL = 12
log_pib_mensal_ts <- ts(pib_mensal_df$log_PIB_Mensal, start = c(1996, 1), frequency = 12)
# Decompor a série
decomposicao <- decompose(log_pib_mensal_ts)
# Plotar a decomposição
plot(decomposicao)

A análise do gráfico de decomposição agora mostra um rico componente
sazonal, com picos e vales que se repetem anualmente,
refletindo o ciclo de atividade econômica ao longo do ano. A
tendência de longo prazo continua evidente.
5. Estacionariedade e o Teste de Raiz Unitária
5.1. A Importância Crucial da Estacionariedade
(Esta explicação teórica se mantém perfeitamente válida) Uma série é
estacionária se suas propriedades estatísticas não
mudam ao longo do tempo. Regredir uma série não-estacionária contra
outra pode levar a uma regressão espúria: encontrar
correlações fortes que são meramente coincidentes, frutos de tendências
independentes. Para evitar conclusões falsas, precisamos trabalhar com
séries estacionárias. O “problema” que impede isso é a chamada
raiz unitária.
5.2. O Teste de Dickey-Fuller Aumentado (ADF)
(Esta explicação teórica se mantém perfeitamente válida) O teste ADF
é nossa ferramenta formal para detectar a raiz unitária. As hipóteses
são:
- \(H_0\) (Hipótese
Nula): A série possui uma raiz unitária (é
não-estacionária).
- \(H_1\) (Hipótese
Alternativa): A série é estacionária.
Aplicamos o teste à nossa série log_pib_mensal_ts.
# Aplicar o teste ADF simplificado à série em nível
teste_adf_nivel <- tseries::adf.test(log_pib_mensal_ts)
# Exibir o resultado do teste
print(teste_adf_nivel)
##
## Augmented Dickey-Fuller Test
##
## data: log_pib_mensal_ts
## Dickey-Fuller = -1.3535, Lag order = 7, p-value = 0.8496
## alternative hypothesis: stationary
Interpretando o Resultado do Teste ADF
O p-value é alto (muito maior que 0.05). Com um p-valor
tão elevado, nós não temos evidências para rejeitar a hipótese
nula. Nossa conclusão, portanto, é a mesma de antes: a série do
log(PIB Mensal) é não-estacionária.
7. Funções de Autocorrelação (ACF e PACF)
Com a série estacionária em mãos, investigamos sua estrutura
de memória ou dependência temporal. Quão forte é a relação
entre o crescimento do PIB hoje e o crescimento em meses passados? Para
isso, usamos os correlogramas da FAC e FACP.
7.1. Função de Autocorrelação (FAC ou ACF)
A ACF mede a correlação “total” (direta e indireta) entre a série e
suas defasagens. Formalmente, a autocorrelação \(\rho_k\) para uma defasagem (lag) \(k\) é a razão entre a autocovariância no
lag \(k\) (\(\gamma_k\)) e a variância da série (\(\gamma_0\)).
\[ \rho_k = \frac{\text{Cov}(Y_t,
Y_{t-k})}{\text{Var}(Y_t)} = \frac{\gamma_k}{\gamma_0} \]
O valor de \(\rho_k\) varia entre -1
e 1. Ele nos diz o quão forte é a associação linear entre uma observação
e outra ocorrida \(k\) períodos no
passado, considerando todos os canais (inclusive o efeito através das
observações intermediárias).
7.2. Função de Autocorrelação Parcial (FACP ou PACF)
A PACF mede a correlação “direta” entre a série e uma defasagem, após
remover (“parcializar”) o efeito das defasagens intermediárias.
A forma mais intuitiva de entender a PACF é através de modelos
autorregressivos. O valor da PACF no lag \(k\), denotado por \(\phi_{kk}\), é o coeficiente estimado para
a \(k\)-ésima defasagem em uma
regressão da série contra suas \(k\)
defasagens:
\[ Y_t = c + \phi_{k1}Y_{t-1} +
\phi_{k2}Y_{t-2} + \dots + \mathbf{\phi_{kk}}Y_{t-k} + \epsilon_t
\]
Assim, \(\phi_{11}\) é simplesmente
a correlação entre \(Y_t\) e \(Y_{t-1}\). Já \(\phi_{22}\) é o coeficiente de \(Y_{t-2}\) em uma regressão de \(Y_t\) contra \(Y_{t-1}\) e \(Y_{t-2}\), capturando a correlação direta
entre \(Y_t\) e \(Y_{t-2}\) que não passa através de \(Y_{t-1}\).
7.3. Análise Gráfica dos Correlogramas
Estas ferramentas são essenciais para identificar a estrutura de
modelos da classe ARIMA, que veremos futuramente. Vamos agora gerar os
gráficos.
# Plotar os correlogramas da série estacionária
par(mfrow = c(1, 2))
acf(log_pib_mensal_diff, main = "ACF do Crescimento do PIB", na.action = na.omit, lag.max = 36)
pacf(log_pib_mensal_diff, main = "PACF do Crescimento do PIB", na.action = na.omit, lag.max = 36)

Interpretando os Correlogramas
As linhas azuis pontilhadas são os limites de significância
estatística.
- Autocorrelação Sazonal: No gráfico ACF, observe se
há picos significantes em lags que são múltiplos de 12 (12, 24, 36).
Isso indica a presença de um padrão sazonal remanescente na série, mesmo
após a diferenciação.
- Padrões de Curto Prazo: Analisamos os lags iniciais
para identificar a estrutura de dependência de curto prazo. Um corte
abrupto no PACF após o lag \(p\) sugere
um componente Autoregressivo de ordem \(p\), AR(\(p\)). Um corte abrupto no ACF após o lag
\(q\) sugere um componente de Média
Móvel de ordem \(q\), MA(\(q\)). Essa análise visual será o ponto de
partida da nossa próxima aula de modelagem.
LS0tDQp0aXRsZTogIkF1bGEgNDogRnVuZGFtZW50b3MgZGUgU8OpcmllcyBUZW1wb3JhaXMiDQpzdWJ0aXRsZTogIkFuw6FsaXNlIGRhIERpbsOibWljYSBkbyBQSUIgTWVuc2FsIEJyYXNpbGVpcm8gKFByb3h5IElBRS1GR1YpIg0KYXV0aG9yOiAiQnJ1bm8gTWVsbyBkZSBPbGl2ZWlyYSBTYW50b3MiDQpkYXRlOiAiMDIvMTAvMjAyNSINCm91dHB1dDoNCiAgaHRtbF9kb2N1bWVudDoNCiAgICB0b2M6IHRydWUNCiAgICB0b2NfZmxvYXQ6IHRydWUNCiAgICB0aGVtZTogY2VydWxlYW4NCiAgICBoaWdobGlnaHQ6IHRhbmdvDQogICAgY29kZV9mb2xkaW5nOiBzaG93DQogICAgY29kZV9kb3dubG9hZDogdHJ1ZSAgDQotLS0NCg0KIyAxLiBJbnRyb2R1w6fDo28NCg0KTmVzdGUgcm90ZWlybyBwcsOhdGljbywgdmFtb3MgYXBsaWNhciBvcyBjb25jZWl0b3MgZnVuZGFtZW50YWlzIGRhIGVjb25vbWV0cmlhIGRlIHPDqXJpZXMgdGVtcG9yYWlzIHBhcmEgYW5hbGlzYXIgdW1hIHByb3h5IG1lbnNhbCBkbyBQcm9kdXRvIEludGVybm8gQnJ1dG8gKFBJQikgZG8gQnJhc2lsLCBvIEluZGljYWRvciBkZSBBdGl2aWRhZGUgRWNvbsO0bWljYSBkYSBGR1YgKElBRS1GR1YpLiBTZW5kbyB1bSBkYWRvIGRlIGFsdGEgZnJlcXXDqm5jaWEsIGVzdGEgc8OpcmllIGV4aWJlIGNhcmFjdGVyw61zdGljYXMgdGVtcG9yYWlzIGNvbXBsZXhhcyAodGVuZMOqbmNpYSwgc2F6b25hbGlkYWRlIG1lbnNhbCkgcXVlIGEgdG9ybmFtIHVtIGV4Y2VsZW50ZSBvYmpldG8gZGUgZXN0dWRvLiBOb3NzbyBvYmpldGl2byDDqSBkaWFnbm9zdGljYXIgZXNzYXMgY2FyYWN0ZXLDrXN0aWNhcywgZW50ZW5kZXIgcG9yIHF1ZSBlbGFzIHPDo28gdW0gInByb2JsZW1hIiBwYXJhIGEgbW9kZWxhZ2VtIHRyYWRpY2lvbmFsLCBlIGFwcmVuZGVyIGNvbW8gdHJhdMOhLWxhcyBhZGVxdWFkYW1lbnRlLg0KDQojIDIuIFByZXBhcmHDp8OjbyBkbyBBbWJpZW50ZQ0KDQpDYXJyZWdhbW9zIG9zIHBhY290ZXMgcXVlIG5vcyBkYXLDo28gYXMgZmVycmFtZW50YXMgcGFyYSBiYWl4YXIsIG1hbmlwdWxhciwgdmlzdWFsaXphciBlIHRlc3RhciBvcyBkYWRvcy4NCg0KYGBge3Igc2V0dXAsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQojIFBhY290ZSBwYXJhIGFjZXNzYXIgZGFkb3MgZG8gQmFuY28gQ2VudHJhbCBkbyBCcmFzaWwNCmxpYnJhcnkocmJjYikNCg0KIyBDb2xlw6fDo28gZGUgcGFjb3RlcyBwYXJhIG1hbmlwdWxhw6fDo28gZSB2aXN1YWxpemHDp8OjbyBkZSBkYWRvcw0KbGlicmFyeSh0aWR5dmVyc2UpDQoNCiMgUGFjb3RlIGVzcGVjw61maWNvIHBhcmEgdGVzdGVzIGRlIHJhaXogdW5pdMOhcmlhDQpsaWJyYXJ5KHRzZXJpZXMpDQpgYGANCg0KIyAzLiBBcXVpc2nDp8OjbyBlIEFuw6FsaXNlIEluaWNpYWwgZG9zIERhZG9zDQoNClV0aWxpemFyZW1vcyBvIHBhY290ZSBgcmJjYmAgcGFyYSBpbXBvcnRhciBhIHPDqXJpZSBkbyBQSUIgbWVuc2FsIChjw7NkaWdvIDQzODAgbm8gU0dTLUJDQikgYSBwYXJ0aXIgZGUgMTk5Ni4gUGFyYSBlc3RhYmlsaXphciBhIHZhcmnDom5jaWEgZGEgc8OpcmllIGUgcGFyYSBxdWUgYXMgZGlmZXJlbsOnYXMgcG9zc2FtIHNlciBpbnRlcnByZXRhZGFzIGNvbW8gdGF4YXMgZGUgY3Jlc2NpbWVudG8sIHRyYWJhbGhhcmVtb3MgY29tIG8gKipsb2dhcml0bW8gbmF0dXJhbCBkYSBzw6lyaWUqKi4NCg0KYGBge3J9DQojIEPDs2RpZ28gZGEgc8OpcmllIFBJQiBtZW5zYWwgKHByb3h5KSBubyBTR1MtQkNCDQpjb2RpZ29fcGliX21lbnNhbCA8LSA0MzgwDQoNCiMgT2J0ZXIgYSBzw6lyaWUgaGlzdMOzcmljYSBhIHBhcnRpciBkZSAxOTk2DQpwaWJfbWVuc2FsX2RmIDwtIHJiY2I6OmdldF9zZXJpZXMoYyhQSUJfTWVuc2FsID0gY29kaWdvX3BpYl9tZW5zYWwpLCBzdGFydF9kYXRlID0gIjE5OTYtMDEtMDEiKQ0KDQojIENhbGN1bGFyIG8gbG9nYXJpdG1vIG5hdHVyYWwNCnBpYl9tZW5zYWxfZGYgPC0gcGliX21lbnNhbF9kZiAlPiUNCiAgbXV0YXRlKGxvZ19QSUJfTWVuc2FsID0gbG9nKFBJQl9NZW5zYWwpKQ0KDQojIFBsb3RhciBhIHPDqXJpZSBkbyBsb2coUElCX01lbnNhbCkNCmdncGxvdChwaWJfbWVuc2FsX2RmLCBhZXMoeCA9IGRhdGUsIHkgPSBsb2dfUElCX01lbnNhbCkpICsNCiAgZ2VvbV9saW5lKGNvbG9yID0gImRhcmtibHVlIiwgc2l6ZSA9IDEpICsNCiAgbGFicygNCiAgICB0aXRsZSA9ICJMb2dhcml0bW8gZG8gUElCIE1lbnNhbCBkbyBCcmFzaWwgKFByb3h5IElBRS1GR1YpIiwNCiAgICBzdWJ0aXRsZSA9ICJTw6lyaWUgb2JzZXJ2YWRhIGEgdmFsb3JlcyBjb3JyZW50ZXMiLA0KICAgIHggPSAiQW5vIiwNCiAgICB5ID0gIkxvZyhQSUIgTWVuc2FsKSINCiAgKSArDQogIHRoZW1lX21pbmltYWwoKQ0KYGBgDQoNCk8gZ3LDoWZpY28gcmV2ZWxhIHVtYSBjbGFyYSAqKnRlbmTDqm5jaWEgZGUgY3Jlc2NpbWVudG8qKiBhbyBsb25nbyBkbyB0ZW1wby4gQSBzw6lyaWUgZGVmaW5pdGl2YW1lbnRlIG7Do28gZmx1dHVhIGVtIHRvcm5vIGRlIHVtYSBtw6lkaWEgY29uc3RhbnRlLCBvIHF1ZSDDqSB1bSBmb3J0ZSBpbmTDrWNpbyB2aXN1YWwgZGUgbsOjby1lc3RhY2lvbmFyaWVkYWRlLg0KDQojIDQuIERlY29tcG9zacOnw6NvIGRhIFPDqXJpZSBUZW1wb3JhbA0KDQpQYXJhIGVudGVuZGVyIG1lbGhvciBhIGVzdHJ1dHVyYSBkb3MgZGFkb3MsIHZhbW9zIGRlY29tcG9yIGEgc8OpcmllIGVtIHNldXMgY29tcG9uZW50ZXMuIFVtYSBzw6lyaWUgdGVtcG9yYWwgJFlfdCQgcG9kZSBzZXIgdmlzdGEgY29tbyBhIHNvbWEgZGUgdW1hIHRlbmTDqm5jaWEgKCRUX3QkKSwgdW0gY29tcG9uZW50ZSBzYXpvbmFsICgkU190JCksIGUgdW0gY29tcG9uZW50ZSBpcnJlZ3VsYXIgKCRlX3QkKS4NCg0KJFlfdCA9IFRfdCArIFNfdCArIGVfdCQNCg0KLSAgICoqVGVuZMOqbmNpYToqKiBPIG1vdmltZW50byBkZSBsb25nbyBwcmF6byBkYSBzw6lyaWUuDQotICAgKipTYXpvbmFsaWRhZGU6KiogRmx1dHVhw6fDtWVzIHBlcmnDs2RpY2FzIHF1ZSBvY29ycmVtIGRlbnRybyBkZSB1bSBhbm8uIENvbSBkYWRvcyBtZW5zYWlzLCBlc3BlcmFtb3MgdW0gcGFkcsOjbyBxdWUgc2UgcmVwZXRlIGEgY2FkYSAxMiBtZXNlcyAoZXg6IERlemVtYnJvIMOpIHRpcGljYW1lbnRlIHVtIG3DqnMgZGUgYWx0YSBhdGl2aWRhZGUpLg0KLSAgICoqSXJyZWd1bGFyIChSdcOtZG8pOioqIENob3F1ZXMgbsOjbyBwcmV2aXPDrXZlaXMuDQoNClBhcmEgaXNzbywgY29udmVydGVtb3Mgbm9zc29zIGRhZG9zIHBhcmEgdW0gb2JqZXRvIGB0c2AsIGluZm9ybWFuZG8gYW8gUiBxdWUgc2UgdHJhdGEgZGUgdW1hIHPDqXJpZSAqKm1lbnNhbCoqIChgZnJlcXVlbmN5ID0gMTJgKS4NCg0KYGBge3J9DQojIENvbnZlcnRlciBhIHPDqXJpZSBwYXJhIG8gZm9ybWF0byB0cywgZXNwZWNpZmljYW5kbyBhIGZyZXF1w6puY2lhIE1FTlNBTCA9IDEyDQpsb2dfcGliX21lbnNhbF90cyA8LSB0cyhwaWJfbWVuc2FsX2RmJGxvZ19QSUJfTWVuc2FsLCBzdGFydCA9IGMoMTk5NiwgMSksIGZyZXF1ZW5jeSA9IDEyKQ0KDQojIERlY29tcG9yIGEgc8OpcmllDQpkZWNvbXBvc2ljYW8gPC0gZGVjb21wb3NlKGxvZ19waWJfbWVuc2FsX3RzKQ0KDQojIFBsb3RhciBhIGRlY29tcG9zacOnw6NvDQpwbG90KGRlY29tcG9zaWNhbykNCmBgYA0KDQpBIGFuw6FsaXNlIGRvIGdyw6FmaWNvIGRlIGRlY29tcG9zacOnw6NvIGFnb3JhIG1vc3RyYSB1bSByaWNvIGNvbXBvbmVudGUgKipzYXpvbmFsKiosIGNvbSBwaWNvcyBlIHZhbGVzIHF1ZSBzZSByZXBldGVtIGFudWFsbWVudGUsIHJlZmxldGluZG8gbyBjaWNsbyBkZSBhdGl2aWRhZGUgZWNvbsO0bWljYSBhbyBsb25nbyBkbyBhbm8uIEEgKip0ZW5kw6puY2lhKiogZGUgbG9uZ28gcHJhem8gY29udGludWEgZXZpZGVudGUuDQoNCiMgNS4gRXN0YWNpb25hcmllZGFkZSBlIG8gVGVzdGUgZGUgUmFpeiBVbml0w6FyaWENCg0KIyMgNS4xLiBBIEltcG9ydMOibmNpYSBDcnVjaWFsIGRhIEVzdGFjaW9uYXJpZWRhZGUNCg0KKEVzdGEgZXhwbGljYcOnw6NvIHRlw7NyaWNhIHNlIG1hbnTDqW0gcGVyZmVpdGFtZW50ZSB2w6FsaWRhKSBVbWEgc8OpcmllIMOpICoqZXN0YWNpb27DoXJpYSoqIHNlIHN1YXMgcHJvcHJpZWRhZGVzIGVzdGF0w61zdGljYXMgbsOjbyBtdWRhbSBhbyBsb25nbyBkbyB0ZW1wby4gUmVncmVkaXIgdW1hIHPDqXJpZSBuw6NvLWVzdGFjaW9uw6FyaWEgY29udHJhIG91dHJhIHBvZGUgbGV2YXIgYSB1bWEgKipyZWdyZXNzw6NvIGVzcMO6cmlhKio6IGVuY29udHJhciBjb3JyZWxhw6fDtWVzIGZvcnRlcyBxdWUgc8OjbyBtZXJhbWVudGUgY29pbmNpZGVudGVzLCBmcnV0b3MgZGUgdGVuZMOqbmNpYXMgaW5kZXBlbmRlbnRlcy4gUGFyYSBldml0YXIgY29uY2x1c8O1ZXMgZmFsc2FzLCBwcmVjaXNhbW9zIHRyYWJhbGhhciBjb20gc8OpcmllcyBlc3RhY2lvbsOhcmlhcy4gTyAicHJvYmxlbWEiIHF1ZSBpbXBlZGUgaXNzbyDDqSBhIGNoYW1hZGEgKipyYWl6IHVuaXTDoXJpYSoqLg0KDQojIyA1LjIuIE8gVGVzdGUgZGUgRGlja2V5LUZ1bGxlciBBdW1lbnRhZG8gKEFERikNCg0KKEVzdGEgZXhwbGljYcOnw6NvIHRlw7NyaWNhIHNlIG1hbnTDqW0gcGVyZmVpdGFtZW50ZSB2w6FsaWRhKSBPIHRlc3RlIEFERiDDqSBub3NzYSBmZXJyYW1lbnRhIGZvcm1hbCBwYXJhIGRldGVjdGFyIGEgcmFpeiB1bml0w6FyaWEuIEFzIGhpcMOzdGVzZXMgc8OjbzoNCg0KLSAgICRIXzAkICoqKEhpcMOzdGVzZSBOdWxhKToqKiBBIHPDqXJpZSBwb3NzdWkgdW1hIHJhaXogdW5pdMOhcmlhICjDqSAqKm7Do28tZXN0YWNpb27DoXJpYSoqKS4NCi0gICAkSF8xJCAqKihIaXDDs3Rlc2UgQWx0ZXJuYXRpdmEpOioqIEEgc8OpcmllIMOpICoqZXN0YWNpb27DoXJpYSoqLg0KDQpBcGxpY2Ftb3MgbyB0ZXN0ZSDDoCBub3NzYSBzw6lyaWUgYGxvZ19waWJfbWVuc2FsX3RzYC4NCg0KYGBge3J9DQojIEFwbGljYXIgbyB0ZXN0ZSBBREYgc2ltcGxpZmljYWRvIMOgIHPDqXJpZSBlbSBuw612ZWwNCnRlc3RlX2FkZl9uaXZlbCA8LSB0c2VyaWVzOjphZGYudGVzdChsb2dfcGliX21lbnNhbF90cykNCg0KIyBFeGliaXIgbyByZXN1bHRhZG8gZG8gdGVzdGUNCnByaW50KHRlc3RlX2FkZl9uaXZlbCkNCmBgYA0KDQojIyMgKipJbnRlcnByZXRhbmRvIG8gUmVzdWx0YWRvIGRvIFRlc3RlIEFERioqDQoNCk8gYHAtdmFsdWVgIMOpIGFsdG8gKG11aXRvIG1haW9yIHF1ZSAwLjA1KS4gQ29tIHVtIHAtdmFsb3IgdMOjbyBlbGV2YWRvLCBuw7NzICoqbsOjbyB0ZW1vcyBldmlkw6puY2lhcyBwYXJhIHJlamVpdGFyIGEgaGlww7N0ZXNlIG51bGEqKi4gTm9zc2EgY29uY2x1c8OjbywgcG9ydGFudG8sIMOpIGEgbWVzbWEgZGUgYW50ZXM6IGEgc8OpcmllIGRvIGxvZyhQSUIgTWVuc2FsKSDDqSAqKm7Do28tZXN0YWNpb27DoXJpYSoqLg0KDQojIDYuIFRyYW5zZm9ybWFuZG8gYSBTw6lyaWUgY29tIERpZmVyZW5jaWHDp8Ojbw0KDQpBIHNvbHXDp8OjbyDDqSBhICoqZGlmZXJlbmNpYcOnw6NvKiouIEEgcHJpbWVpcmEgZGlmZXJlbsOnYSBkbyBsb2dhcml0bW8gZGEgc8OpcmllICRcRGVsdGEgXGxuKFlfdCkgPSBcbG4oWV90KSAtIFxsbihZX3t0LTF9KSQsIHJlcHJlc2VudGEgYSAqKnRheGEgZGUgY3Jlc2NpbWVudG8gbWVuc2FsKiogZGEgYXRpdmlkYWRlIGVjb27DtG1pY2EuDQoNCmBgYHtyfQ0KIyBDYWxjdWxhciBhIHByaW1laXJhIGRpZmVyZW7Dp2EgZGEgc8OpcmllIGRlIGxvZyhQSUIgTWVuc2FsKQ0KbG9nX3BpYl9tZW5zYWxfZGlmZiA8LSBkaWZmKGxvZ19waWJfbWVuc2FsX3RzKQ0KDQojIFBsb3RhciBhIHPDqXJpZSBkaWZlcmVuY2lhZGENCnBsb3QoDQogIGxvZ19waWJfbWVuc2FsX2RpZmYsDQogIG1haW4gPSAiVGF4YSBkZSBDcmVzY2ltZW50byBNZW5zYWwgZG8gUElCIChQcm94eSkiLA0KICB5bGFiID0gIlZhcmlhw6fDo28gZG8gTG9nKFBJQiBNZW5zYWwpIiwNCiAgY29sID0gImRhcmtibHVlIg0KKQ0KYWJsaW5lKGggPSAwLCBjb2wgPSAicmVkIiwgbHR5ID0gMikNCmBgYA0KDQpBIHPDqXJpZSBhZ29yYSBwYXJlY2UgZmx1dHVhciBlbSB0b3JubyBkZSB1bWEgbcOpZGlhIGNvbnN0YW50ZS4gVmFtb3MgYXBsaWNhciBvIHRlc3RlIEFERiBub3ZhbWVudGUgcGFyYSBjb25maXJtYXIuDQoNCmBgYHtyfQ0KIyBBcGxpY2FyIG8gdGVzdGUgQURGIHNpbXBsaWZpY2FkbyDDoCBzw6lyaWUgZGlmZXJlbmNpYWRhDQp0ZXN0ZV9hZGZfZGlmZiA8LSB0c2VyaWVzOjphZGYudGVzdChsb2dfcGliX21lbnNhbF9kaWZmKQ0KDQojIEV4aWJpciBvIHJlc3VsdGFkbw0KcHJpbnQodGVzdGVfYWRmX2RpZmYpDQpgYGANCg0KTyByZXN1bHRhZG8gYWdvcmEgw6kgZHJhc3RpY2FtZW50ZSBkaWZlcmVudGUuIE8gYHAtdmFsdWVgIMOpIGV4dHJlbWFtZW50ZSBiYWl4byAocmVwb3J0YWRvIGNvbW8gMC4wMSBuYSBzYcOtZGEsIG1hcyBuYSB2ZXJkYWRlIMOpIG1lbm9yLCBvIHF1ZSBzaWduaWZpY2EgcCA8IDAuMDEpLiBDb21vIGVzdGUgcC12YWxvciDDqSBtdWl0byBpbmZlcmlvciBhIDAuMDUsIG7Ds3MgKipyZWplaXRhbW9zIGEgaGlww7N0ZXNlIG51bGEqKiBjb20gZm9ydGUgY29udmljw6fDo28uIENvbmNsdcOtbW9zIHF1ZSBhIHPDqXJpZSBkYSB0YXhhIGRlIGNyZXNjaW1lbnRvIMOpICoqZXN0YWNpb27DoXJpYSoqLg0KDQojIDdcLiBGdW7Dp8O1ZXMgZGUgQXV0b2NvcnJlbGHDp8OjbyAoQUNGIGUgUEFDRikNCg0KQ29tIGEgc8OpcmllIGVzdGFjaW9uw6FyaWEgZW0gbcOjb3MsIGludmVzdGlnYW1vcyBzdWEgKiplc3RydXR1cmEgZGUgbWVtw7NyaWEqKiBvdSBkZXBlbmTDqm5jaWEgdGVtcG9yYWwuIFF1w6NvIGZvcnRlIMOpIGEgcmVsYcOnw6NvIGVudHJlIG8gY3Jlc2NpbWVudG8gZG8gUElCIGhvamUgZSBvIGNyZXNjaW1lbnRvIGVtIG1lc2VzIHBhc3NhZG9zPyBQYXJhIGlzc28sIHVzYW1vcyBvcyBjb3JyZWxvZ3JhbWFzIGRhIEZBQyBlIEZBQ1AuDQoNCiMjIyA3LjEuIEZ1bsOnw6NvIGRlIEF1dG9jb3JyZWxhw6fDo28gKEZBQyBvdSBBQ0YpDQoNCkEgQUNGIG1lZGUgYSBjb3JyZWxhw6fDo28gInRvdGFsIiAoZGlyZXRhIGUgaW5kaXJldGEpIGVudHJlIGEgc8OpcmllIGUgc3VhcyBkZWZhc2FnZW5zLiBGb3JtYWxtZW50ZSwgYSBhdXRvY29ycmVsYcOnw6NvICRccmhvX2skIHBhcmEgdW1hIGRlZmFzYWdlbSAobGFnKSAkayQgw6kgYSByYXrDo28gZW50cmUgYSBhdXRvY292YXJpw6JuY2lhIG5vIGxhZyAkayQgKCRcZ2FtbWFfayQpIGUgYSB2YXJpw6JuY2lhIGRhIHPDqXJpZSAoJFxnYW1tYV8wJCkuDQoNCiQkIFxyaG9fayA9IFxmcmFje1x0ZXh0e0Nvdn0oWV90LCBZX3t0LWt9KX17XHRleHR7VmFyfShZX3QpfSA9IFxmcmFje1xnYW1tYV9rfXtcZ2FtbWFfMH0gJCQNCiAgDQogIE8gdmFsb3IgZGUgJFxyaG9fayQgdmFyaWEgZW50cmUgLTEgZSAxLiBFbGUgbm9zIGRpeiBvIHF1w6NvIGZvcnRlIMOpIGEgYXNzb2NpYcOnw6NvIGxpbmVhciBlbnRyZSB1bWEgb2JzZXJ2YcOnw6NvIGUgb3V0cmEgb2NvcnJpZGEgJGskIHBlcsOtb2RvcyBubyBwYXNzYWRvLCBjb25zaWRlcmFuZG8gdG9kb3Mgb3MgY2FuYWlzIChpbmNsdXNpdmUgbyBlZmVpdG8gYXRyYXbDqXMgZGFzIG9ic2VydmHDp8O1ZXMgaW50ZXJtZWRpw6FyaWFzKS4NCg0KIyMjIDcuMi4gRnVuw6fDo28gZGUgQXV0b2NvcnJlbGHDp8OjbyBQYXJjaWFsIChGQUNQIG91IFBBQ0YpDQoNCkEgUEFDRiBtZWRlIGEgY29ycmVsYcOnw6NvICJkaXJldGEiIGVudHJlIGEgc8OpcmllIGUgdW1hIGRlZmFzYWdlbSwgYXDDs3MgcmVtb3ZlciAoInBhcmNpYWxpemFyIikgbyBlZmVpdG8gZGFzIGRlZmFzYWdlbnMgaW50ZXJtZWRpw6FyaWFzLg0KDQpBIGZvcm1hIG1haXMgaW50dWl0aXZhIGRlIGVudGVuZGVyIGEgUEFDRiDDqSBhdHJhdsOpcyBkZSBtb2RlbG9zIGF1dG9ycmVncmVzc2l2b3MuIE8gdmFsb3IgZGEgUEFDRiBubyBsYWcgJGskLCBkZW5vdGFkbyBwb3IgJFxwaGlfe2trfSQsIMOpIG8gY29lZmljaWVudGUgZXN0aW1hZG8gcGFyYSBhICRrJC3DqXNpbWEgZGVmYXNhZ2VtIGVtIHVtYSByZWdyZXNzw6NvIGRhIHPDqXJpZSBjb250cmEgc3VhcyAkayQgZGVmYXNhZ2VuczoNCiAgDQogICQkIFlfdCA9IGMgKyBccGhpX3trMX1ZX3t0LTF9ICsgXHBoaV97azJ9WV97dC0yfSArIFxkb3RzICsgXG1hdGhiZntccGhpX3tra319WV97dC1rfSArIFxlcHNpbG9uX3QgJCQNCiAgDQogIEFzc2ltLCAkXHBoaV97MTF9JCDDqSBzaW1wbGVzbWVudGUgYSBjb3JyZWxhw6fDo28gZW50cmUgJFlfdCQgZSAkWV97dC0xfSQuIErDoSAkXHBoaV97MjJ9JCDDqSBvIGNvZWZpY2llbnRlIGRlICRZX3t0LTJ9JCBlbSB1bWEgcmVncmVzc8OjbyBkZSAkWV90JCBjb250cmEgJFlfe3QtMX0kIGUgJFlfe3QtMn0kLCBjYXB0dXJhbmRvIGEgY29ycmVsYcOnw6NvIGRpcmV0YSBlbnRyZSAkWV90JCBlICRZX3t0LTJ9JCBxdWUgbsOjbyBwYXNzYSBhdHJhdsOpcyBkZSAkWV97dC0xfSQuDQoNCiMjIyA3LjMuIEFuw6FsaXNlIEdyw6FmaWNhIGRvcyBDb3JyZWxvZ3JhbWFzDQoNCkVzdGFzIGZlcnJhbWVudGFzIHPDo28gZXNzZW5jaWFpcyBwYXJhIGlkZW50aWZpY2FyIGEgZXN0cnV0dXJhIGRlIG1vZGVsb3MgZGEgY2xhc3NlIEFSSU1BLCBxdWUgdmVyZW1vcyBmdXR1cmFtZW50ZS4gVmFtb3MgYWdvcmEgZ2VyYXIgb3MgZ3LDoWZpY29zLg0KDQpgYGB7cn0NCiMgUGxvdGFyIG9zIGNvcnJlbG9ncmFtYXMgZGEgc8OpcmllIGVzdGFjaW9uw6FyaWENCnBhcihtZnJvdyA9IGMoMSwgMikpDQphY2YobG9nX3BpYl9tZW5zYWxfZGlmZiwgbWFpbiA9ICJBQ0YgZG8gQ3Jlc2NpbWVudG8gZG8gUElCIiwgbmEuYWN0aW9uID0gbmEub21pdCwgbGFnLm1heCA9IDM2KQ0KcGFjZihsb2dfcGliX21lbnNhbF9kaWZmLCBtYWluID0gIlBBQ0YgZG8gQ3Jlc2NpbWVudG8gZG8gUElCIiwgbmEuYWN0aW9uID0gbmEub21pdCwgbGFnLm1heCA9IDM2KQ0KcGFyKG1mcm93ID0gYygxLCAxKSkNCmBgYA0KDQojIyMgKipJbnRlcnByZXRhbmRvIG9zIENvcnJlbG9ncmFtYXMqKg0KDQpBcyBsaW5oYXMgYXp1aXMgcG9udGlsaGFkYXMgc8OjbyBvcyBsaW1pdGVzIGRlIHNpZ25pZmljw6JuY2lhIGVzdGF0w61zdGljYS4NCg0KKiAqKkF1dG9jb3JyZWxhw6fDo28gU2F6b25hbDoqKiBObyBncsOhZmljbyBBQ0YsIG9ic2VydmUgc2UgaMOhIHBpY29zIHNpZ25pZmljYW50ZXMgZW0gbGFncyBxdWUgc8OjbyBtw7psdGlwbG9zIGRlIDEyICgxMiwgMjQsIDM2KS4gSXNzbyBpbmRpY2EgYSBwcmVzZW7Dp2EgZGUgdW0gcGFkcsOjbyBzYXpvbmFsIHJlbWFuZXNjZW50ZSBuYSBzw6lyaWUsIG1lc21vIGFww7NzIGEgZGlmZXJlbmNpYcOnw6NvLg0KKiAqKlBhZHLDtWVzIGRlIEN1cnRvIFByYXpvOioqIEFuYWxpc2Ftb3Mgb3MgbGFncyBpbmljaWFpcyBwYXJhIGlkZW50aWZpY2FyIGEgZXN0cnV0dXJhIGRlIGRlcGVuZMOqbmNpYSBkZSBjdXJ0byBwcmF6by4gVW0gY29ydGUgYWJydXB0byBubyBQQUNGIGFww7NzIG8gbGFnICRwJCBzdWdlcmUgdW0gY29tcG9uZW50ZSBBdXRvcmVncmVzc2l2byBkZSBvcmRlbSAkcCQsIEFSKCRwJCkuIFVtIGNvcnRlIGFicnVwdG8gbm8gQUNGIGFww7NzIG8gbGFnICRxJCBzdWdlcmUgdW0gY29tcG9uZW50ZSBkZSBNw6lkaWEgTcOzdmVsIGRlIG9yZGVtICRxJCwgTUEoJHEkKS4gRXNzYSBhbsOhbGlzZSB2aXN1YWwgc2Vyw6EgbyBwb250byBkZSBwYXJ0aWRhIGRhIG5vc3NhIHByw7N4aW1hIGF1bGEgZGUgbW9kZWxhZ2VtLg==