Resumo

Este é um exemplo de documento R Markdown que inclui informações do autor, subtítulo e uma formatação mais elaborada. Você pode personalizar ainda mais este documento de acordo com suas necessidades.

Introdução

Aqui está uma introdução ao seu relatório. Você pode usar formatação em Markdown para enfatizar palavras (itálico ou negrito), criar listas, inserir links como este e muito mais.

Conjunto de dados Ralie Unidade Geradora

summary(ralie_unidade_geradora)
 DatGeracaoConjuntoDados    DatRalie           IdeNucleoCEG      CodCEG          DatEmissaoAto       
 Min.   :2023-09-16      Min.   :2021-06-17   Min.   :  273   Length:4099733     Min.   :1975-06-13  
 1st Qu.:2023-09-16      1st Qu.:2022-09-28   1st Qu.:40775   Class :character   1st Qu.:2021-03-30  
 Median :2023-09-16      Median :2023-02-16   Median :48906   Mode  :character   Median :2022-03-22  
 Mean   :2023-09-16      Mean   :2023-01-17   Mean   :47047                      Mean   :2021-11-20  
 3rd Qu.:2023-09-16      3rd Qu.:2023-06-30   3rd Qu.:51516                      3rd Qu.:2022-10-18  
 Max.   :2023-09-16      Max.   :2023-09-16   Max.   :72955                      Max.   :2023-09-15  
                                                                                 NA's   :1808        
 SigUFPrincipal     DscOrigemCombustivel SigTipoGeracao     NomEmpreendimento    NumUgUsina     MdaPotenciaUnitaria
 Length:4099733     Length:4099733       Length:4099733     Length:4099733     Min.   :  1.00   Min.   :     5955  
 Class :character   Class :character     Class :character   Class :character   1st Qu.:  9.00   1st Qu.:    19842  
 Mode  :character   Mode  :character     Mode  :character   Mode  :character   Median : 30.00   Median :    22500  
                                                                               Mean   : 65.64   Mean   :   140069  
                                                                               3rd Qu.:109.00   3rd Qu.:   163700  
                                                                               Max.   :745.00   Max.   :321428000  
                                                                                                                   
 MdaPotenciaLiberadaTeste NumDespachoTeste   DatDescidaRotorOutorgada DatDescidaRotorRealizada
 Min.   :      29         Length:4099733     Mode:logical             Mode:logical            
 1st Qu.:   17500         Class :character   NA's:4099733             NA's:4099733            
 Median :   19841         Mode  :character                                                    
 Mean   :  156557                                                                             
 3rd Qu.:  137600                                                                             
 Max.   :56550000                                                                             
 NA's   :4024112                                                                              
 DatInicioOpTesteOutorgada DatLiberOpTesteRealizado DatUGInicioOpComerOutorgado DatPrevisaoOpComercialSFG
 Min.   :0202-02-12        Min.   :0202-04-05       Min.   :0202-03-01          Min.   :2021-06-30       
 1st Qu.:2022-12-30        1st Qu.:2022-03-30       1st Qu.:2023-09-15          1st Qu.:2024-11-15       
 Median :2023-11-01        Median :2022-09-09       Median :2025-05-01          Median :2027-04-15       
 Mean   :2023-02-15        Mean   :2022-05-24       Mean   :2023-12-08          Mean   :2026-09-13       
 3rd Qu.:2024-12-01        3rd Qu.:2023-03-23       3rd Qu.:2027-04-13          3rd Qu.:2028-06-10       
 Max.   :2058-12-01        Max.   :2023-09-15       Max.   :2029-12-29          Max.   :2029-12-29       
 NA's   :1884559           NA's   :4023610                                      NA's   :199039           

Análise Exploratória de Dados

Nesta seção, realizaremos uma análise exploratória de dados (EDA) do conjunto de dados mtcars. Vamos verificar vetores, criar resumos estatísticos e criar gráficos descritivos.

Verificar Vetores

Primeiro, vamos verificar os primeiros registros do conjunto de dados e listar os nomes das variáveis (vetores) disponíveis.

skim(ralie_unidade_geradora)
── Data Summary ────────────────────────
                           Values                
Name                       ralie_unidade_geradora
Number of rows             4099733               
Number of columns          19                    
_______________________                          
Column type frequency:                           
  character                6                     
  Date                     7                     
  logical                  2                     
  numeric                  4                     
________________________                         
Group variables            None                  

Reclassificar colunas:

skim(ralie_unidade_geradora)
── Data Summary ────────────────────────
                           Values                
Name                       ralie_unidade_geradora
Number of rows             4099733               
Number of columns          19                    
_______________________                          
Column type frequency:                           
  character                5                     
  Date                     7                     
  factor                   3                     
  logical                  2                     
  numeric                  2                     
________________________                         
Group variables            None                  
ralie_unidade_geradora %>%   select_if(is.numeric) %>% 
  pivot_longer(cols = everything(), names_to = "Variavel", values_to = "Valor") %>% 
  ggplot(aes(y=Valor, x=Variavel))+geom_boxplot()+geom_violin() +
  facet_wrap(~ Variavel, scales = "free") +coord_flip()+
  labs(
    title = "Gráfico de Frequência para Variáveis Numéricas",
    x = "Valor",
    y = "Frequência"
  ) +
  theme_minimal()

ralie_unidade_geradora %>%   select_if(is.factor) %>% 
  pivot_longer(cols = everything(), names_to = "Categoria", values_to = "Valor") %>% 
  ggplot(aes(x = reorder(Valor, -table(Valor)[Valor]))) +coord_flip()+
  geom_bar() +  facet_wrap(~ Categoria, scales = "free") +

  labs(
    title = "Gráfico de Barras da Variável Categórica",
    x = "Categoria",
    y = "Frequência"
  ) +
  theme_minimal()

#variaveis data
ralie_unidade_geradora %>%   select_if(is.Date) %>%  
  pivot_longer(cols = everything(), names_to = "Categoria", values_to = "Data") %>% 
  group_by(Data, Categoria) %>% summarise(n=n()) %>% 
  ggplot(aes(x = Data,n)) +
  geom_line() +  facet_wrap(~ Categoria, scales = "free") +

  labs(
    title = "Gráfico de Linha da Variável Categórica",
    x = "data",
    y = "Frequência"
  ) +
  theme_minimal()
`summarise()` has grouped output by 'Data'. You can override using the `.groups` argument.

Conjunto de dados Abril

X06_InfoHorário_Abr21 <- read_excel("01.InfoHorário_Abr21.xlsx", 
    sheet = "006 Hidráulicas MRE", skip = 14)
Warning: Expecting numeric in B496097 / R496097C2: got 'Topo'Warning: Expecting numeric in B496099 / R496099C2: got 'Nota(1): As informações disponibilizadas nesse relatório consideram o evento de contabilização de cada mês.'Warning: Expecting numeric in B496100 / R496100C2: got 'Nota(2): Esta aba possui 1 tabela.'Warning: Expecting numeric in B496101 / R496101C2: got 'A Câmara de Comercialização de Energia Elétrica - CCEE não se responsabiliza, em qualquer tempo, sob qualquer condição e hipótese, por estudos, projeções e/ou negociações que sejam realizadas com fundamento'Warning: Expecting numeric in B496102 / R496102C2: got 'nos dados constantes do presente relatório.'
X06_InfoHorário_Abr21 <- read_excel("01.InfoHorário_Abr21.xlsx", 
    sheet = "006 Hidráulicas MRE", skip = 14)
Warning: Expecting numeric in B496097 / R496097C2: got 'Topo'Warning: Expecting numeric in B496099 / R496099C2: got 'Nota(1): As informações disponibilizadas nesse relatório consideram o evento de contabilização de cada mês.'Warning: Expecting numeric in B496100 / R496100C2: got 'Nota(2): Esta aba possui 1 tabela.'Warning: Expecting numeric in B496101 / R496101C2: got 'A Câmara de Comercialização de Energia Elétrica - CCEE não se responsabiliza, em qualquer tempo, sob qualquer condição e hipótese, por estudos, projeções e/ou negociações que sejam realizadas com fundamento'Warning: Expecting numeric in B496102 / R496102C2: got 'nos dados constantes do presente relatório.'
X07_InfoHorário_Abr21 <- read_excel("01.InfoHorário_Abr21.xlsx", 
    sheet = "007 Demais usinas", skip = 14)
Warning: Expecting numeric in B139217 / R139217C2: got 'Topo'Warning: Expecting numeric in B139219 / R139219C2: got 'Nota(1): As informações disponibilizadas nesse relatório consideram o evento de contabilização de cada mês.'Warning: Expecting numeric in B139220 / R139220C2: got 'Nota(2): Esta aba possui 1 tabela.'Warning: Expecting numeric in B139221 / R139221C2: got 'A Câmara de Comercialização de Energia Elétrica - CCEE não se responsabiliza, em qualquer tempo, sob qualquer condição e hipótese, por estudos, projeções e/ou negociações que sejam realizadas com fundamento'Warning: Expecting numeric in B139222 / R139222C2: got 'nos dados constantes do presente relatório.'Warning: Expecting numeric in B139223 / R139223C2: got 'OBS: Nesta aba estão presentes os dados das usinas não contempladas nas demais abas.'
rbind(colnames(X01_InfoHorário_Abr21),
      colnames(X02_InfoHorário_Abr21),
      colnames(X03_InfoHorário_Abr21),
      colnames(X04_InfoHorário_Abr21),
      colnames(X05_InfoHorário_Abr21),
      colnames(X06_InfoHorário_Abr21),
      colnames(X07_InfoHorário_Abr21)
      )->A
Warning: number of columns of result is not a multiple of vector length (arg 1)
skim(resultado_final)
── Data Summary ────────────────────────
                           Values         
Name                       resultado_final
Number of rows             1659548        
Number of columns          8              
_______________________                   
Column type frequency:                    
  factor                   3              
  numeric                  4              
  POSIXct                  1              
________________________                  
Group variables            None           
resultado_final %>%   select_if(is.numeric) %>% 
  pivot_longer(cols = everything(), names_to = "Variavel", values_to = "Valor") %>% 
  ggplot(aes(y=Valor, x=Variavel))+geom_boxplot()+geom_violin() +
  facet_wrap(~ Variavel, scales = "free") +coord_flip()+
  labs(
    title = "Gráfico de Frequência para Variáveis Numéricas",
    x = "Valor",
    y = "Frequência"
  ) +
  theme_minimal()

LS0tDQp0aXRsZTogIlJlbGF0w7NyaW8gLSBBbmFsaXNlIEV4cGxvcmF0w7NyaWEgIg0KYXV0aG9yOiAiVGhpYWdvIE4uIEdhcmRpbiBlIERhbmllbCBDLkRhbm5hIg0Kc3VidGl0bGU6ICJBbmFsaXNlIGV4cGxvcmF0w7NyaWEiDQpvdXRwdXQ6IA0KICBodG1sX25vdGVib29rOiANCiAgICBmaWdfaGVpZ2h0OiAxMg0KICAgIGZpZ193aWR0aDogMjINCiAgICB0b2M6IHllcw0KZWRpdG9yX29wdGlvbnM6IA0KICBtYXJrZG93bjogDQogICAgd3JhcDogNzINCi0tLQ0KDQojIFJlc3Vtbw0KDQpFc3RlIMOpIHVtIGV4ZW1wbG8gZGUgZG9jdW1lbnRvIFIgTWFya2Rvd24gcXVlIGluY2x1aSBpbmZvcm1hw6fDtWVzIGRvDQphdXRvciwgc3VidMOtdHVsbyBlIHVtYSBmb3JtYXRhw6fDo28gbWFpcyBlbGFib3JhZGEuIFZvY8OqIHBvZGUgcGVyc29uYWxpemFyDQphaW5kYSBtYWlzIGVzdGUgZG9jdW1lbnRvIGRlIGFjb3JkbyBjb20gc3VhcyBuZWNlc3NpZGFkZXMuDQoNCiMgSW50cm9kdcOnw6NvDQoNCkFxdWkgZXN0w6EgdW1hIGludHJvZHXDp8OjbyBhbyBzZXUgcmVsYXTDs3Jpby4gVm9jw6ogcG9kZSB1c2FyIGZvcm1hdGHDp8OjbyBlbQ0KTWFya2Rvd24gcGFyYSBlbmZhdGl6YXIgcGFsYXZyYXMgKCppdMOhbGljbyogb3UgKipuZWdyaXRvKiopLCBjcmlhcg0KbGlzdGFzLCBpbnNlcmlyIGxpbmtzIFtjb21vIGVzdGVdKGh0dHBzOi8vd3d3LmV4ZW1wbG8uY29tKSBlIG11aXRvIG1haXMuDQoNCiMgQ29uanVudG8gZGUgZGFkb3MgUmFsaWUgVW5pZGFkZSBHZXJhZG9yYQ0KDQpgYGB7cn0NCiMjIEFOTkVMIFRFU1QNCmdjKCkNCmxpYnJhcnkocmVhZHIpDQpyYWxpZV91bmlkYWRlX2dlcmFkb3JhIDwtIHJlYWRfZGVsaW0oInJhbGllLXVuaWRhZGUtZ2VyYWRvcmEuY3N2IiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsaW0gPSAiOyIsIGVzY2FwZV9kb3VibGUgPSBGQUxTRSwgbG9jYWxlID0gbG9jYWxlKGVuY29kaW5nID0gIldJTkRPV1MtMTI1MiIpLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmltX3dzID0gVFJVRSkNCnN1bW1hcnkocmFsaWVfdW5pZGFkZV9nZXJhZG9yYSkNCmBgYA0KDQojIyBBbsOhbGlzZSBFeHBsb3JhdMOzcmlhIGRlIERhZG9zDQoNCk5lc3RhIHNlw6fDo28sIHJlYWxpemFyZW1vcyB1bWEgYW7DoWxpc2UgZXhwbG9yYXTDs3JpYSBkZSBkYWRvcyAoRURBKSBkbyBjb25qdW50byBkZSBkYWRvcyBgbXRjYXJzYC4gVmFtb3MgdmVyaWZpY2FyIHZldG9yZXMsIGNyaWFyIHJlc3Vtb3MgZXN0YXTDrXN0aWNvcyBlIGNyaWFyIGdyw6FmaWNvcyBkZXNjcml0aXZvcy4NCg0KIyMgVmVyaWZpY2FyIFZldG9yZXMNCg0KUHJpbWVpcm8sIHZhbW9zIHZlcmlmaWNhciBvcyBwcmltZWlyb3MgcmVnaXN0cm9zIGRvIGNvbmp1bnRvIGRlIGRhZG9zIGUgbGlzdGFyIG9zIG5vbWVzIGRhcyB2YXJpw6F2ZWlzICh2ZXRvcmVzKSBkaXNwb27DrXZlaXMuDQoNCmBgYHtyfQ0KDQpoZWFkKHJhbGllX3VuaWRhZGVfZ2VyYWRvcmEpDQpgYGANCg0KYGBge3J9DQojIFZpc3VhbGl6YXIgb3MgcHJpbWVpcm9zIHJlZ2lzdHJvcyBkbyBjb25qdW50byBkZSBkYWRvcw0KbGlicmFyeShza2ltcikNCmxpYnJhcnkodGlkeXZlcnNlKQ0KDQpza2ltKHJhbGllX3VuaWRhZGVfZ2VyYWRvcmEpDQpgYGANCg0KDQpSZWNsYXNzaWZpY2FyIGNvbHVuYXM6DQpgYGB7cn0NCmxpYnJhcnkodGlkeXZlcnNlKQ0KI0lkZU51Y2xlb0NFRyBOdW3DqXJpY28gNiBOw7pjbGVvIG51bcOpcmljbyBkbyBjw7NkaWdvIENFRyhDw7NkaWdvIEVtcHJlZW5kaW1lbnRvIEdlcmHDp8OjbykqIHZlcmlmaWNhciBkZW1haXMgbm8gZGljaW9uw6FyaW8NCmNvbHVuYXNfY2hhcmFjdGVyIDwtIGMoIklkZU51Y2xlb0NFRyIsICJOdW1VZ1VzaW5hIiwgIkNvZENFRyIpDQpjb2x1bmFzX2ZhY3RvciA8LSBjKCJTaWdVRlByaW5jaXBhbCIsICJTaWdUaXBvR2VyYWNhbyIsICJEc2NPcmlnZW1Db21idXN0aXZlbCIpDQpyYWxpZV91bmlkYWRlX2dlcmFkb3JhIDwtIHJhbGllX3VuaWRhZGVfZ2VyYWRvcmEgJT4lDQogIG11dGF0ZV9hdCh2YXJzKGNvbHVuYXNfY2hhcmFjdGVyKSwgYXMuY2hhcmFjdGVyKQ0KDQpyYWxpZV91bmlkYWRlX2dlcmFkb3JhIDwtIHJhbGllX3VuaWRhZGVfZ2VyYWRvcmEgJT4lDQogIG11dGF0ZV9hdCh2YXJzKGNvbHVuYXNfZmFjdG9yKSwgYXMuZmFjdG9yKQ0KDQoNCnNraW0ocmFsaWVfdW5pZGFkZV9nZXJhZG9yYSkNCmBgYA0KDQpgYGB7ciBmaWcuaGVpZ2h0PTIsIGZpZy53aWR0aD0xMH0NCnJhbGllX3VuaWRhZGVfZ2VyYWRvcmEgJT4lICAgc2VsZWN0X2lmKGlzLm51bWVyaWMpICU+JSANCiAgcGl2b3RfbG9uZ2VyKGNvbHMgPSBldmVyeXRoaW5nKCksIG5hbWVzX3RvID0gIlZhcmlhdmVsIiwgdmFsdWVzX3RvID0gIlZhbG9yIikgJT4lIA0KICBnZ3Bsb3QoYWVzKHk9VmFsb3IsIHg9VmFyaWF2ZWwpKStnZW9tX2JveHBsb3QoKStnZW9tX3Zpb2xpbigpICsNCiAgZmFjZXRfd3JhcCh+IFZhcmlhdmVsLCBzY2FsZXMgPSAiZnJlZSIpICtjb29yZF9mbGlwKCkrDQogIGxhYnMoDQogICAgdGl0bGUgPSAiR3LDoWZpY28gZGUgRnJlcXXDqm5jaWEgcGFyYSBWYXJpw6F2ZWlzIE51bcOpcmljYXMiLA0KICAgIHggPSAiVmFsb3IiLA0KICAgIHkgPSAiRnJlcXXDqm5jaWEiDQogICkgKw0KICB0aGVtZV9taW5pbWFsKCkNCg0KYGBgDQoNCg0KYGBge3IgZmlnLmhlaWdodD00LCBmaWcud2lkdGg9MTR9DQpyYWxpZV91bmlkYWRlX2dlcmFkb3JhICU+JSAgIHNlbGVjdF9pZihpcy5mYWN0b3IpICU+JSANCiAgcGl2b3RfbG9uZ2VyKGNvbHMgPSBldmVyeXRoaW5nKCksIG5hbWVzX3RvID0gIkNhdGVnb3JpYSIsIHZhbHVlc190byA9ICJWYWxvciIpICU+JSANCiAgZ2dwbG90KGFlcyh4ID0gcmVvcmRlcihWYWxvciwgLXRhYmxlKFZhbG9yKVtWYWxvcl0pKSkgK2Nvb3JkX2ZsaXAoKSsNCiAgZ2VvbV9iYXIoKSArICBmYWNldF93cmFwKH4gQ2F0ZWdvcmlhLCBzY2FsZXMgPSAiZnJlZSIpICsNCg0KICBsYWJzKA0KICAgIHRpdGxlID0gIkdyw6FmaWNvIGRlIEJhcnJhcyBkYSBWYXJpw6F2ZWwgQ2F0ZWfDs3JpY2EiLA0KICAgIHggPSAiQ2F0ZWdvcmlhIiwNCiAgICB5ID0gIkZyZXF1w6puY2lhIg0KICApICsNCiAgdGhlbWVfbWluaW1hbCgpDQpgYGANCg0KYGBge3IgZmlnLmhlaWdodD00LCBmaWcud2lkdGg9MTN9DQojdmFyaWF2ZWlzIGRhdGENCnJhbGllX3VuaWRhZGVfZ2VyYWRvcmEgJT4lICAgc2VsZWN0X2lmKGlzLkRhdGUpICU+JSAgDQogIHBpdm90X2xvbmdlcihjb2xzID0gZXZlcnl0aGluZygpLCBuYW1lc190byA9ICJDYXRlZ29yaWEiLCB2YWx1ZXNfdG8gPSAiRGF0YSIpICU+JSANCiAgZ3JvdXBfYnkoRGF0YSwgQ2F0ZWdvcmlhKSAlPiUgc3VtbWFyaXNlKG49bigpKSAlPiUgDQogIGdncGxvdChhZXMoeCA9IERhdGEsbikpICsNCiAgZ2VvbV9saW5lKCkgKyAgZmFjZXRfd3JhcCh+IENhdGVnb3JpYSwgc2NhbGVzID0gImZyZWUiKSArDQoNCiAgbGFicygNCiAgICB0aXRsZSA9ICJHcsOhZmljbyBkZSBMaW5oYSBkYSBWYXJpw6F2ZWwgQ2F0ZWfDs3JpY2EiLA0KICAgIHggPSAiZGF0YSIsDQogICAgeSA9ICJGcmVxdcOqbmNpYSINCiAgKSArDQogIHRoZW1lX21pbmltYWwoKQ0KDQpgYGANCiMgQ29uanVudG8gZGUgZGFkb3MgQWJyaWwNCg0KYGBge3J9DQpsaWJyYXJ5KHJlYWR4bCkNClgwMV9JbmZvSG9yw6FyaW9fQWJyMjEgPC0gcmVhZF9leGNlbCgiMDEuSW5mb0hvcsOhcmlvX0FicjIxLnhsc3giLCANCiAgICBzaGVldCA9ICIwMDEgRGFkb3MgaG9yw6FyaW9zIiwgc2tpcCA9IDE0KQ0KWDAyX0luZm9Ib3LDoXJpb19BYnIyMSA8LSByZWFkX2V4Y2VsKCIwMS5JbmZvSG9yw6FyaW9fQWJyMjEueGxzeCIsIA0KICAgICAgICBzaGVldCA9ICIwMDIgVXNpbmFzIGNvbSBDVlUiLCBza2lwID0gMTQpDQpYMDNfSW5mb0hvcsOhcmlvX0FicjIxIDwtIHJlYWRfZXhjZWwoIjAxLkluZm9Ib3LDoXJpb19BYnIyMS54bHN4IiwgDQogICAgc2hlZXQgPSAiMDAzIEJpb21hc3NhIiwgc2tpcCA9IDE0KQ0KWDA0X0luZm9Ib3LDoXJpb19BYnIyMSA8LSByZWFkX2V4Y2VsKCIwMS5JbmZvSG9yw6FyaW9fQWJyMjEueGxzeCIsIA0KICAgIHNoZWV0ID0gIjAwNCBFw7NsaWNhcyIsIHNraXAgPSAxNCkNClgwNV9JbmZvSG9yw6FyaW9fQWJyMjEgPC0gcmVhZF9leGNlbCgiMDEuSW5mb0hvcsOhcmlvX0FicjIxLnhsc3giLCANCiAgICBzaGVldCA9ICIwMDUgSGlkcsOhdWxpY2FzIG7Do28gTVJFIiwgc2tpcCA9IDE0KQ0KWDA2X0luZm9Ib3LDoXJpb19BYnIyMSA8LSByZWFkX2V4Y2VsKCIwMS5JbmZvSG9yw6FyaW9fQWJyMjEueGxzeCIsIA0KICAgIHNoZWV0ID0gIjAwNiBIaWRyw6F1bGljYXMgTVJFIiwgc2tpcCA9IDE0KQ0KWDA3X0luZm9Ib3LDoXJpb19BYnIyMSA8LSByZWFkX2V4Y2VsKCIwMS5JbmZvSG9yw6FyaW9fQWJyMjEueGxzeCIsIA0KICAgIHNoZWV0ID0gIjAwNyBEZW1haXMgdXNpbmFzIiwgc2tpcCA9IDE0KQ0KDQpgYGANCg0KDQpgYGB7cn0NCnJiaW5kKGNvbG5hbWVzKFgwMV9JbmZvSG9yw6FyaW9fQWJyMjEpLA0KICAgICAgY29sbmFtZXMoWDAyX0luZm9Ib3LDoXJpb19BYnIyMSksDQogICAgICBjb2xuYW1lcyhYMDNfSW5mb0hvcsOhcmlvX0FicjIxKSwNCiAgICAgIGNvbG5hbWVzKFgwNF9JbmZvSG9yw6FyaW9fQWJyMjEpLA0KICAgICAgY29sbmFtZXMoWDA1X0luZm9Ib3LDoXJpb19BYnIyMSksDQogICAgICBjb2xuYW1lcyhYMDZfSW5mb0hvcsOhcmlvX0FicjIxKSwNCiAgICAgIGNvbG5hbWVzKFgwN19JbmZvSG9yw6FyaW9fQWJyMjEpDQogICAgICApLT5BDQoNCiNBPC1hcy5mYWN0b3IoQSkNCiNBPC1hcy5kYXRhLmZyYW1lKEEpDQojQTwtQSAlPiUgZ3JvdXBfYnkoQSkgJT4lIHN1bW1hcmlzZShuPW4oKSkNCmBgYA0KDQpgYGB7cn0NCiMgY3JpYXIgdmFyaWF2ZWwgZGUgZ2VyYcOnw6NvDQojIDAwMSBEYWRvcyBIb3LDoXJpb3MNCiMwMDIgVXNpbmFzIGNvbSBDVlUNClgwMl9JbmZvSG9yw6FyaW9fQWJyMjEkR2VyYWM8LSIwMDIgVXNpbmFzIGNvbSBDVlUiDQojMDAzIEJpb21hc3NhDQpYMDNfSW5mb0hvcsOhcmlvX0FicjIxJEdlcmFjPC0iMDAzIEJpb21hc3NhIg0KIzAwNCBFw7NsaWNhcw0KWDA0X0luZm9Ib3LDoXJpb19BYnIyMSRHZXJhYzwtICIwMDQgRcOzbGljYXMiDQojMDA1IEhpZHLDoXVsaWNhcyBuw6NvIE1SRQ0KWDA1X0luZm9Ib3LDoXJpb19BYnIyMSRHZXJhYzwtIjAwNSBIaWRyw6F1bGljYXMgbsOjbyBNUkUiDQojMDA2IEhpZHLDoXVsaWNhcyBNUkUNClgwNl9JbmZvSG9yw6FyaW9fQWJyMjEkR2VyYWM8LSIwMDYgSGlkcsOhdWxpY2FzIE1SRSINCiMwMDcgRGVtYWlzIFVzaW5hcw0KWDA3X0luZm9Ib3LDoXJpb19BYnIyMSRHZXJhYzwtIjAwNyBEZW1haXMgVXNpbmFzIg0KDQoNCg0KIyBGdW7Dp8OjbyBwYXJhIGVuY29udHJhciBjb2x1bmFzIGNvbXVucyBlbSB1bWEgbGlzdGEgZGUgZGF0YWZyYW1lcw0KZW5jb250cmFyX2NvbHVuYXNfY29tdW5zIDwtIGZ1bmN0aW9uKGxpc3RhX2RhdGFmcmFtZXMpIHsNCiAgIyBWZXJpZmljYSBzZSBhIGxpc3RhIGRlIGRhdGFmcmFtZXMgbsOjbyBlc3TDoSB2YXppYQ0KICBpZiAobGVuZ3RoKGxpc3RhX2RhdGFmcmFtZXMpID09IDApIHsNCiAgICBzdG9wKCJBIGxpc3RhIGRlIGRhdGFmcmFtZXMgZXN0w6EgdmF6aWEuIikNCiAgfQ0KICANCiAgIyBPYnRlbmhhIG9zIG5vbWVzIGRhcyBjb2x1bmFzIGRvIHByaW1laXJvIGRhdGFmcmFtZSBuYSBsaXN0YQ0KICBjb2x1bmFzX2NvbXVucyA8LSBjb2xuYW1lcyhsaXN0YV9kYXRhZnJhbWVzW1sxXV0pDQogIA0KICAjIEl0ZXJlIHNvYnJlIG9zIGRhdGFmcmFtZXMgcmVzdGFudGVzIGUgZW5jb250cmUgYXMgY29sdW5hcyBlbSBjb211bQ0KICBmb3IgKGkgaW4gMjpsZW5ndGgobGlzdGFfZGF0YWZyYW1lcykpIHsNCiAgICBjb2x1bmFzX2NvbXVucyA8LSBpbnRlcnNlY3QoY29sdW5hc19jb211bnMsIGNvbG5hbWVzKGxpc3RhX2RhdGFmcmFtZXNbW2ldXSkpDQogIH0NCiAgDQogIHJldHVybihjb2x1bmFzX2NvbXVucykNCn0NCg0KIyANCmxpc3RhX2RlX2RhdGFmcmFtZXMgPC0gbGlzdCgNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBYMDJfSW5mb0hvcsOhcmlvX0FicjIxLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFgwM19JbmZvSG9yw6FyaW9fQWJyMjEsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgWDA0X0luZm9Ib3LDoXJpb19BYnIyMSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBYMDVfSW5mb0hvcsOhcmlvX0FicjIxLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFgwNl9JbmZvSG9yw6FyaW9fQWJyMjEsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgWDA3X0luZm9Ib3LDoXJpb19BYnIyMSkNCg0KY29sdW5hc19jb211bnMgPC0gZW5jb250cmFyX2NvbHVuYXNfY29tdW5zKGxpc3RhX2RlX2RhdGFmcmFtZXMpDQpwcmludChjb2x1bmFzX2NvbXVucykNCiMgRnVuw6fDo28gcGFyYSB1bmlyIGRhdGFmcmFtZXMgcG9yIHNldGUgY29sdW5hcw0KdW5pcl9kYXRhZnJhbWVzIDwtIGZ1bmN0aW9uKGRmMSwgZGYyKSB7DQogIGRmMTwtZGYxICU+JSBzZWxlY3QoY29sdW5hc19jb211bnMpDQogIGRmMjwtZGYyICU+JSBzZWxlY3QoY29sdW5hc19jb211bnMpDQogIHJiaW5kKGRmMSwgZGYyKQ0KfQ0KDQojIFVuaXIgb3MgZGF0YWZyYW1lcyBkYSBsaXN0YSB1c2FuZG8gUmVkdWNlDQpyZXN1bHRhZG9fZmluYWwgPC0gdW5pcl9kYXRhZnJhbWVzKFgwMl9JbmZvSG9yw6FyaW9fQWJyMjEsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFgwM19JbmZvSG9yw6FyaW9fQWJyMjEpDQoNCnJlc3VsdGFkb19maW5hbCA8LSB1bmlyX2RhdGFmcmFtZXMocmVzdWx0YWRvX2ZpbmFsLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYMDRfSW5mb0hvcsOhcmlvX0FicjIxKQ0KcmVzdWx0YWRvX2ZpbmFsIDwtIHVuaXJfZGF0YWZyYW1lcyhyZXN1bHRhZG9fZmluYWwsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFgwNV9JbmZvSG9yw6FyaW9fQWJyMjEpDQpyZXN1bHRhZG9fZmluYWwgPC0gdW5pcl9kYXRhZnJhbWVzKHJlc3VsdGFkb19maW5hbCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWDA2X0luZm9Ib3LDoXJpb19BYnIyMSkNCnJlc3VsdGFkb19maW5hbCA8LSB1bmlyX2RhdGFmcmFtZXMocmVzdWx0YWRvX2ZpbmFsLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYMDdfSW5mb0hvcsOhcmlvX0FicjIxKQ0KDQpgYGANCg0KDQoNCg0KYGBge3J9DQpyZXN1bHRhZG9fZmluYWwgJT4lIHNlbGVjdCgpDQpzdW1tYXJ5KHJlc3VsdGFkb19maW5hbCkNCnJlc3VsdGFkb19maW5hbCRGb250ZTwtYXMuZmFjdG9yKHJlc3VsdGFkb19maW5hbCRGb250ZSkNCnJlc3VsdGFkb19maW5hbCRTdWJtZXJjYWRvPC0gYXMuZmFjdG9yKHJlc3VsdGFkb19maW5hbCRTdWJtZXJjYWRvKQ0KcmVzdWx0YWRvX2ZpbmFsJEdlcmFjPC0gYXMuZmFjdG9yKHJlc3VsdGFkb19maW5hbCRHZXJhYykNCnNraW0ocmVzdWx0YWRvX2ZpbmFsKQ0KYGBgDQoNCmBgYHtyIGZpZy5oZWlnaHQ9NiwgZmlnLndpZHRoPTEwfQ0KcmVzdWx0YWRvX2ZpbmFsICU+JSAgIHNlbGVjdF9pZihpcy5udW1lcmljKSAlPiUgDQogIHBpdm90X2xvbmdlcihjb2xzID0gZXZlcnl0aGluZygpLCBuYW1lc190byA9ICJWYXJpYXZlbCIsIHZhbHVlc190byA9ICJWYWxvciIpICU+JSANCiAgZ2dwbG90KGFlcyh5PVZhbG9yLCB4PVZhcmlhdmVsKSkrZ2VvbV9ib3hwbG90KCkrZ2VvbV92aW9saW4oKSArDQogIGZhY2V0X3dyYXAofiBWYXJpYXZlbCwgc2NhbGVzID0gImZyZWUiKSArY29vcmRfZmxpcCgpKw0KICBsYWJzKA0KICAgIHRpdGxlID0gIkdyw6FmaWNvIGRlIEZyZXF1w6puY2lhIHBhcmEgVmFyacOhdmVpcyBOdW3DqXJpY2FzIiwNCiAgICB4ID0gIlZhbG9yIiwNCiAgICB5ID0gIkZyZXF1w6puY2lhIg0KICApICsNCiAgdGhlbWVfbWluaW1hbCgpDQpgYGANCg0KYGBge3IgZmlnLmhlaWdodD00LCBmaWcud2lkdGg9MTR9DQpyZXN1bHRhZG9fZmluYWwgJT4lICAgc2VsZWN0X2lmKGlzLmZhY3RvcikgJT4lIA0KICBwaXZvdF9sb25nZXIoY29scyA9IGV2ZXJ5dGhpbmcoKSwgbmFtZXNfdG8gPSAiQ2F0ZWdvcmlhIiwgdmFsdWVzX3RvID0gIlZhbG9yIikgJT4lIA0KICBnZ3Bsb3QoYWVzKHggPSByZW9yZGVyKFZhbG9yLCAtdGFibGUoVmFsb3IpW1ZhbG9yXSkpKSArY29vcmRfZmxpcCgpKw0KICBnZW9tX2JhcigpICsgIGZhY2V0X3dyYXAofiBDYXRlZ29yaWEsIHNjYWxlcyA9ICJmcmVlIikgKw0KDQogIGxhYnMoDQogICAgdGl0bGUgPSAiR3LDoWZpY28gZGUgQmFycmFzIGRhIFZhcmnDoXZlbCBDYXRlZ8OzcmljYSIsDQogICAgeCA9ICJDYXRlZ29yaWEiLA0KICAgIHkgPSAiRnJlcXXDqm5jaWEiDQogICkgKw0KICB0aGVtZV9taW5pbWFsKCkNCmBgYA0K