library(dplyr)

Anexando pacote: ‘dplyr’

Os seguintes objetos são mascarados por ‘package:stats’:

    filter, lag

Os seguintes objetos são mascarados por ‘package:base’:

    intersect, setdiff, setequal, union
getwd()
[1] "C:/Users/joao_/Desktop/tela/Pós DS/Ciclo de Vida e Introdução à Linguagem r/aula3"
#entrada de dados
limpos <- read_excel("dirty_data.xlsx")
New names:
mode(limpos)
[1] "list"
str(limpos)
tibble [14 × 11] (S3: tbl_df/tbl/data.frame)
 $ Data most recently refreshed on:: chr [1:14] "First Name" "Jason" "Jason" "Alicia" ...
 $ ...2                            : chr [1:14] "Last Name" "Bourne" "Bourne" "Keys" ...
 $ ...3                            : chr [1:14] "Employee Status" "Teacher" "Teacher" "Teacher" ...
 $ Dec-27 2020                     : chr [1:14] "Subject" "PE" "Drafting" "Music" ...
 $ ...5                            : chr [1:14] "Hire Date" "39690" "43479" "37118" ...
 $ ...6                            : chr [1:14] "% Allocated" "0.75" "0.25" "1" ...
 $ ...7                            : chr [1:14] "Full time?" "Yes" "Yes" "Yes" ...
 $ ...8                            : chr [1:14] "do not edit! --->" NA NA NA ...
 $ ...9                            : chr [1:14] "Certification" "Physical ed" "Physical ed" "Instr. music" ...
 $ ...10                           : chr [1:14] "Certification" "Theater" "Theater" "Vocal music" ...
 $ ...11                           : chr [1:14] "Active?" "YES" "YES" "YES" ...
#Corrigindo os nomes das colunas
#exibe os nomes e os tipos das variáveis
glimpse(limpos)
Rows: 14
Columns: 11
$ `Data most recently refreshed on:` <chr> "First Name", "Jason", "Jason", "Alicia",…
$ ...2                               <chr> "Last Name", "Bourne", "Bourne", "Keys", …
$ ...3                               <chr> "Employee Status", "Teacher", "Teacher", …
$ `Dec-27 2020`                      <chr> "Subject", "PE", "Drafting", "Music", NA,…
$ ...5                               <chr> "Hire Date", "39690", "43479", "37118", "…
$ ...6                               <chr> "% Allocated", "0.75", "0.25", "1", "1", …
$ ...7                               <chr> "Full time?", "Yes", "Yes", "Yes", "Yes",…
$ ...8                               <chr> "do not edit! --->", NA, NA, NA, NA, NA, …
$ ...9                               <chr> "Certification", "Physical ed", "Physical…
$ ...10                              <chr> "Certification", "Theater", "Theater", "V…
$ ...11                              <chr> "Active?", "YES", "YES", "YES", "YES", "Y…
#corrigindo os nomes das colunas
limpos <- limpos %>%
  row_to_names(row_number = 1) %>%
  clean_names() #retira espaços e coloca em minúsculas
Aviso: Row 1 does not provide unique names. Consider running clean_names() after row_to_names().
#Tabela cruzada - conta o total por sobrenome para verificar duplicações
limpos %>% tabyl(last_name, employee_status)
 last_name Administration Coach Teacher
    Boozer              0     2       0
    Bourne              0     0       2
     Joyce              0     0       1
      Keys              0     0       1
    Lamarr              0     0       1
    Larsen              0     0       1
  Lovelace              0     0       1
      Nice              1     0       0
        Wu              0     0       2
#Ocorrências válidas
#% de ocorrências geral e válidas (sem NA)
limpos %>%
  tabyl(subject)
    subject n    percent valid_percent
 Basketball 1 0.08333333           0.1
  Chemistry 1 0.08333333           0.1
       Dean 1 0.08333333           0.1
   Drafting 1 0.08333333           0.1
    English 2 0.16666667           0.2
      Music 1 0.08333333           0.1
         PE 1 0.08333333           0.1
    Physics 1 0.08333333           0.1
    Science 1 0.08333333           0.1
       <NA> 2 0.16666667            NA
#o R tem a seguinte abordagem com a função table():
table(limpos $subject)

Basketball  Chemistry       Dean   Drafting    English      Music         PE 
         1          1          1          1          2          1          1 
   Physics    Science 
         1          1 
#Ocorrências válidas – 2 variáveis
limpos %>%
  filter(employee_status != is.na(employee_status)) %>%
  tabyl(employee_status, full_time)
 employee_status No Yes
  Administration  0   1
           Coach  2   0
         Teacher  3   6
#Ocorrências válidas – 3 variáveis
limpos %>%
  tabyl(full_time, subject, employee_status, show_missing_levels = FALSE)
$Administration
 full_time Dean
       Yes    1

$Coach
 full_time Basketball NA_
        No          1   1

$Teacher
 full_time Chemistry Drafting English Music PE Physics Science NA_
        No         0        0       2     0  0       0       1   0
       Yes         1        1       0     1  1       1       0   1
#Tabela resumo
limpos %>%
  tabyl(employee_status, full_time) %>%
  adorn_totals("row") %>%
  adorn_percentages("row") %>%
  adorn_pct_formatting() %>%
  adorn_ns() %>%
  adorn_title("combined")
 employee_status/full_time         No        Yes
            Administration   0.0% (0) 100.0% (1)
                     Coach 100.0% (2)   0.0% (0)
                   Teacher  33.3% (3)  66.7% (6)
                     Total  41.7% (5)  58.3% (7)
#Datas seriais
excel_numeric_to_date(as.numeric(as.character (limpos$hire_date)), date_system = "modern")
 [1] "2008-08-30" "2019-01-14" "2001-08-15" "2005-08-08" "2017-02-25" "1930-03-20"
 [7] "1930-03-20" "1999-09-20" "1976-06-08" "2015-08-05" "1995-01-01" "2009-09-15"
library(magrittr) #permite o uso de um operador de canal, %>%, para encadear o código 

Anexando pacote: ‘magrittr’

O seguinte objeto é mascarado por ‘package:purrr’:

    set_names

O seguinte objeto é mascarado por ‘package:tidyr’:

    extract
#entrada de dados
gettysburg <- readr::read_csv("gettysburg.csv")
Rows: 590 Columns: 26── Column specification ──────────────────────────────────────────────────────────────
Delimiter: ","
chr  (9): type, state, regiment_or_battery, brigade, division, corps, army, july1_...
dbl (17): men, killed, wounded, captured, missing, total_casualties, 3inch_rifles,...
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
#exibe o total de duplicados - 3 duplicados
table(dupes)
dupes
FALSE  TRUE 
  587     3 
dupes
  [1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
 [14] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
 [27] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
 [40] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
 [53] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
 [66] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
 [79] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
 [92] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[105] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[118] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[131] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[144] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[157] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[170] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[183] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[196] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[209] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[222] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[235] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[248] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[261] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[274] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[287] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[300] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[313] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[326] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[339] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[352] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[365] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[378] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[391] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[404] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[417] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[430] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[443] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[456] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[469] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[482] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[495] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[508] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[521] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[534] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[547] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[560] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[573] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[586] FALSE FALSE  TRUE  TRUE  TRUE
#exibe quais são os duplicados
which(dupes == "TRUE")
[1] 588 589 590
#identificando as linhas duplicadas
dim(gettysburg) #590 26
[1] 590  26
dim(gettysburg) #587 26
[1] 587  26
#estatística descritiva
summary(gettysburg)
     type              state           regiment_or_battery   brigade         
 Length:587         Length:587         Length:587          Length:587        
 Class :character   Class :character   Class :character    Class :character  
 Mode  :character   Mode  :character   Mode  :character    Mode  :character  
                                                                             
                                                                             
                                                                             
                                                                             
   division            corps               army           july1_Commander   
 Length:587         Length:587         Length:587         Length:587        
 Class :character   Class :character   Class :character   Class :character  
 Mode  :character   Mode  :character   Mode  :character   Mode  :character  
                                                                            
                                                                            
                                                                            
                                                                            
 Cdr_casualty            men            killed          wounded      
 Length:587         Min.   : 33.0   Min.   :  0.00   Min.   :  0.00  
 Class :character   1st Qu.:144.5   1st Qu.:  2.00   1st Qu.:  7.00  
 Mode  :character   Median :275.0   Median : 10.00   Median : 29.00  
                    Mean   :269.4   Mean   : 17.06   Mean   : 43.61  
                    3rd Qu.:356.0   3rd Qu.: 25.00   3rd Qu.: 68.00  
                    Max.   :843.0   Max.   :172.00   Max.   :443.00  
                                    NA's   :6        NA's   :6       
    captured          missing       total_casualties  3inch_rifles    4.5inch_rifles
 Min.   :  0.000   Min.   :  0.00   Min.   :  0.00   Min.   :0.0000   Min.   :0     
 1st Qu.:  0.000   1st Qu.:  0.00   1st Qu.: 12.00   1st Qu.:0.0000   1st Qu.:0     
 Median :  0.000   Median :  4.00   Median : 48.00   Median :0.0000   Median :0     
 Mean   :  2.455   Mean   : 16.52   Mean   : 79.17   Mean   :0.3578   Mean   :0     
 3rd Qu.:  0.000   3rd Qu.: 21.00   3rd Qu.:127.50   3rd Qu.:0.0000   3rd Qu.:0     
 Max.   :174.000   Max.   :164.00   Max.   :687.00   Max.   :6.0000   Max.   :0     
 NA's   :7         NA's   :17       NA's   :8                                       
  10lb_parrots    12lb_howitzers   12lb_napoleons   6lb_howitzers     
 Min.   :0.0000   Min.   :0.0000   Min.   :0.0000   Min.   :0.000000  
 1st Qu.:0.0000   1st Qu.:0.0000   1st Qu.:0.0000   1st Qu.:0.000000  
 Median :0.0000   Median :0.0000   Median :0.0000   Median :0.000000  
 Mean   :0.1704   Mean   :0.0477   Mean   :0.4242   Mean   :0.001704  
 3rd Qu.:0.0000   3rd Qu.:0.0000   3rd Qu.:0.0000   3rd Qu.:0.000000  
 Max.   :6.0000   Max.   :4.0000   Max.   :6.0000   Max.   :1.000000  
                                                                      
 24lb_howitzers      20lb_parrots     12lb_whitworths     14lb_rifles      
 Min.   :0.000000   Min.   :0.00000   Min.   :0.000000   Min.   :0.000000  
 1st Qu.:0.000000   1st Qu.:0.00000   1st Qu.:0.000000   1st Qu.:0.000000  
 Median :0.000000   Median :0.00000   Median :0.000000   Median :0.000000  
 Mean   :0.006814   Mean   :0.02726   Mean   :0.003407   Mean   :0.006814  
 3rd Qu.:0.000000   3rd Qu.:0.00000   3rd Qu.:0.000000   3rd Qu.:0.000000  
 Max.   :4.000000   Max.   :6.00000   Max.   :2.000000   Max.   :4.000000  
                                                                           
   total_guns   
 Min.   :0.000  
 1st Qu.:0.000  
 Median :0.000  
 Mean   :1.046  
 3rd Qu.:0.000  
 Max.   :6.000  
                
#somente de uma coluna - caso necessário
summary(gettysburg$total_guns)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
  0.000   0.000   0.000   1.046   0.000   6.000 
#Contando (group by) de todas as variáveis categóricas
gettysburg_cat %>% dplyr::summarise_all(dplyr::funs(dplyr::n_distinct(.)))
Aviso: `funs()` was deprecated in dplyr 0.8.0.
Please use a list of either functions or lambdas: 

  # Simple named list: 
  list(mean = mean, median = median)

  # Auto named with `tibble::lst()`: 
  tibble::lst(mean, median)

  # Using lambdas
  list(~ mean(., trim = .2), ~ median(., na.rm = TRUE))
#comparação de baixas de Exércitos. Observe que há uma contagem para cada causa de mortalidade!
gettysburg_cat %>% janitor::tabyl(army, Cdr_casualty)
        army captured killed mortally wounded  no wounded wounded-captured
 Confederate        2     15               13 165      44               17
       Union        4     14               11 240      60                2
View(feature_variance)
which(feature_variance$zeroVar == 'TRUE')
[1] 17
#Quais?
row.names(feature_variance[17, ])
[1] "4.5inch_rifles"
#Ou indicando os registros que tem nzv
which(feature_variance$nzv == 'TRUE')
 [1] 16 17 18 19 20 21 22 23 24 25
LS0tDQp0aXRsZTogImNvbWFuZG9zX2F1bGFfMyINCm91dHB1dDogaHRtbF9ub3RlYm9vaw0KLS0tDQoNCmBgYHtyfQ0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQojQVZBTElBw4fDg08gREEgUVVBTElEQURFIERFIERBRE9TDQojSmFuaXRvciBlc3R1ZG8gZGUgY2Fzbw0KbGlicmFyeShyZWFkeGwpDQojaW5zdGFsbC5wYWNrYWdlcygiamFuaXRvciIpDQpsaWJyYXJ5KGphbml0b3IpDQpsaWJyYXJ5KGRwbHlyKQ0KYGBgDQoNCmBgYHtyfQ0KI2RpcmV0w7NyaW8gY29ycmVudGUNCnNldHdkKCJDOi9Vc2Vycy9qb2FvXy9EZXNrdG9wL3RlbGEvUMOzcyBEUy9DaWNsbyBkZSBWaWRhIGUgSW50cm9kdcOnw6NvIMOgIExpbmd1YWdlbSByL2F1bGEzIikgIyBzZXR3ZCgiQzovcG9zX3VuZXNhIikNCmBgYA0KDQpgYGB7cn0NCmdldHdkKCkNCmBgYA0KDQpgYGB7cn0NCiNlbnRyYWRhIGRlIGRhZG9zDQpsaW1wb3MgPC0gcmVhZF9leGNlbCgiZGlydHlfZGF0YS54bHN4IikNCmBgYA0KDQpgYGB7cn0NCm1vZGUobGltcG9zKQ0KYGBgDQoNCmBgYHtyfQ0KVmlldyhsaW1wb3MpDQpgYGANCg0KYGBge3J9DQpzdHIobGltcG9zKQ0KYGBgDQoNCmBgYHtyfQ0KI0NvcnJpZ2luZG8gb3Mgbm9tZXMgZGFzIGNvbHVuYXMNCiNleGliZSBvcyBub21lcyBlIG9zIHRpcG9zIGRhcyB2YXJpw6F2ZWlzDQpnbGltcHNlKGxpbXBvcykNCmBgYA0KDQpgYGB7cn0NCiNjb3JyaWdpbmRvIG9zIG5vbWVzIGRhcyBjb2x1bmFzDQpsaW1wb3MgPC0gbGltcG9zICU+JQ0KICByb3dfdG9fbmFtZXMocm93X251bWJlciA9IDEpICU+JQ0KICBjbGVhbl9uYW1lcygpICNyZXRpcmEgZXNwYcOnb3MgZSBjb2xvY2EgZW0gbWluw7pzY3VsYXMNCmBgYA0KDQpgYGB7cn0NClZpZXcobGltcG9zKQ0KYGBgDQoNCmBgYHtyfQ0KI2VsaW1pbmFuZG8gY29sdW5hcyB2YXppYXMNCmxpbXBvcyA9IHJlbW92ZV9lbXB0eShsaW1wb3MsIHdoaWNoID0gYygicm93cyIsImNvbHMiKSkNCmBgYA0KDQpgYGB7cn0NClZpZXcobGltcG9zKQ0KYGBgDQoNCmBgYHtyfQ0KI1RhYmVsYSBjcnV6YWRhIC0gY29udGEgbyB0b3RhbCBwb3Igc29icmVub21lIHBhcmEgdmVyaWZpY2FyIGR1cGxpY2HDp8O1ZXMNCmxpbXBvcyAlPiUgdGFieWwobGFzdF9uYW1lLCBlbXBsb3llZV9zdGF0dXMpDQpgYGANCg0KYGBge3J9DQojVmVyaWZpY2FuZG8gYXMgZHVwbGljYcOnw7Vlcw0KbGltcG9zICU+JSBnZXRfZHVwZXMoY29udGFpbnMoIm5hbWUiKSkNCmBgYA0KDQpgYGB7cn0NCiNJZGVudGlmaWNhbmRvIHRvdGFsIHBvciBhc3N1bnRvDQojY29sdW5hIHNlbSByZXBldGljYW8NCmRpc3RpbmN0KGxpbXBvcywgc3ViamVjdCkNCmBgYA0KDQpgYGB7cn0NCiNhZ3J1cGFuZG86DQpsaWJyYXJ5KHNxbGRmKQ0Kc3FsZGYoIlNFTEVDVCBzdWJqZWN0LGNvdW50KCopIGFzIHRvdGFsIA0KICAgICAgRlJPTSBsaW1wb3MNCiAgICAgIEdST1VQIEJZIDEiKQ0KYGBgDQoNCmBgYHtyfQ0KI09jb3Jyw6puY2lhcyB2w6FsaWRhcw0KIyUgZGUgb2NvcnLDqm5jaWFzIGdlcmFsIGUgdsOhbGlkYXMgKHNlbSBOQSkNCmxpbXBvcyAlPiUNCiAgdGFieWwoc3ViamVjdCkNCmBgYA0KDQpgYGB7cn0NCiNvIFIgdGVtIGEgc2VndWludGUgYWJvcmRhZ2VtIGNvbSBhIGZ1bsOnw6NvIHRhYmxlKCk6DQp0YWJsZShsaW1wb3MgJHN1YmplY3QpDQpgYGANCg0KYGBge3J9DQojT2NvcnLDqm5jaWFzIHbDoWxpZGFzIOKAkyAyIHZhcmnDoXZlaXMNCmxpbXBvcyAlPiUNCiAgZmlsdGVyKGVtcGxveWVlX3N0YXR1cyAhPSBpcy5uYShlbXBsb3llZV9zdGF0dXMpKSAlPiUNCiAgdGFieWwoZW1wbG95ZWVfc3RhdHVzLCBmdWxsX3RpbWUpDQpgYGANCg0KYGBge3J9DQojT2NvcnLDqm5jaWFzIHbDoWxpZGFzIOKAkyAzIHZhcmnDoXZlaXMNCmxpbXBvcyAlPiUNCiAgdGFieWwoZnVsbF90aW1lLCBzdWJqZWN0LCBlbXBsb3llZV9zdGF0dXMsIHNob3dfbWlzc2luZ19sZXZlbHMgPSBGQUxTRSkNCmBgYA0KDQpgYGB7cn0NCiNUYWJlbGEgcmVzdW1vDQpsaW1wb3MgJT4lDQogIHRhYnlsKGVtcGxveWVlX3N0YXR1cywgZnVsbF90aW1lKSAlPiUNCiAgYWRvcm5fdG90YWxzKCJyb3ciKSAlPiUNCiAgYWRvcm5fcGVyY2VudGFnZXMoInJvdyIpICU+JQ0KICBhZG9ybl9wY3RfZm9ybWF0dGluZygpICU+JQ0KICBhZG9ybl9ucygpICU+JQ0KICBhZG9ybl90aXRsZSgiY29tYmluZWQiKQ0KYGBgDQoNCmBgYHtyfQ0KI0RhdGFzIHNlcmlhaXMNCmV4Y2VsX251bWVyaWNfdG9fZGF0ZShhcy5udW1lcmljKGFzLmNoYXJhY3RlciAobGltcG9zJGhpcmVfZGF0ZSkpLCBkYXRlX3N5c3RlbSA9ICJtb2Rlcm4iKQ0KYGBgDQoNCmBgYHtyfQ0KI2FjZXJ0YW5kbyBhcyBkYXRhcw0KbGltcG9zJGhpcmVfZGF0ZSA8LSBleGNlbF9udW1lcmljX3RvX2RhdGUoYXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIgKGxpbXBvcyRoaXJlX2RhdGUpKSwgZGF0ZV9zeXN0ZW0gPSAibW9kZXJuIikNCmBgYA0KDQpgYGB7cn0NClZpZXcobGltcG9zKQ0KYGBgDQoNCmBgYHtyfQ0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQojRVNUVURPIERFIENBU08gIC0gR2V0dHlzYnVyZzoNCiNpbnN0YWxsLnBhY2thZ2VzKCJjYXJldCIpDQpsaWJyYXJ5KGNhcmV0KSAgI2Z1bsOnw7VlcyBxdWUgdGVudGEgYWdpbGl6YXIgbyBwcm9jZXNzbyBkZSBjcmlhw6fDo28gZGUgbW9kZWxvcyBwcmVkaXRpdm9zDQpsaWJyYXJ5KGphbml0b3IpIA0KbGlicmFyeShyZWFkcikgIA0KI2luc3RhbGwucGFja2FnZXMoInNqbWlzYyIpDQpsaWJyYXJ5KHNqbWlzYykgI0Z1bsOnw7VlcyBkZSB0cmFuc2Zvcm1hw6fDo28gZGUgZGFkb3MgZSB2YXJpw6F2ZWlzDQojaW5zdGFsbC5wYWNrYWdlcygic2tpbXIiKQ0KbGlicmFyeShza2ltcikgICNSZXN1bW9zIGRlIGRhZG9zDQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCiNpbnN0YWxsLnBhY2thZ2VzKCJ2dHJlYXQiKQ0KbGlicmFyeSh2dHJlYXQpICAjcHJlcGFyYSBkYWRvcyBwYXJhIG1vZGVsYWdlbSBwcmVkaXRpdmENCmxpYnJhcnkobWFncml0dHIpICNwZXJtaXRlIG8gdXNvIGRlIHVtIG9wZXJhZG9yIGRlIGNhbmFsLCAlPiUsIHBhcmEgZW5jYWRlYXIgbyBjw7NkaWdvIA0KbGlicmFyeShkcGx5cikNCmBgYA0KDQpgYGB7cn0NCiNlbnRyYWRhIGRlIGRhZG9zDQpnZXR0eXNidXJnIDwtIHJlYWRyOjpyZWFkX2NzdigiZ2V0dHlzYnVyZy5jc3YiKQ0KYGBgDQoNCmBgYHtyfQ0KI3ZlcmlmaWNhbmRvIGR1cGxpY2HDp8O1ZXMNCmR1cGVzIDwtIGR1cGxpY2F0ZWQoZ2V0dHlzYnVyZykNCmBgYA0KDQpgYGB7cn0NCiNleGliZSBvIHRvdGFsIGRlIGR1cGxpY2Fkb3MgLSAzIGR1cGxpY2Fkb3MNCnRhYmxlKGR1cGVzKQ0KYGBgDQoNCmBgYHtyfQ0KZHVwZXMNCmBgYA0KDQpgYGB7cn0NCiNleGliZSBxdWFpcyBzw6NvIG9zIGR1cGxpY2Fkb3MNCndoaWNoKGR1cGVzID09ICJUUlVFIikNCmBgYA0KDQpgYGB7cn0NCiN2ZXJpZmljYW5kbyBkdXBsaWNhw6fDtWVzIGNvbSBvIHNxbGRmKCkNCmxpYnJhcnkoc3FsZGYpDQpgYGANCg0KYGBge3J9DQojdmVyaWZpY2FuZG8gYXMgZHVwbGljYcOnw7VlcyBjb20gU1FMDQpzcWxkZigiU0VMRUNUIHR5cGUsIHN0YXRlLCByZWdpbWVudF9vcl9iYXR0ZXJ5LA0KICAgICAgY291bnQoKikgYXMgdG90YWwgDQogICAgICBGUk9NIGdldHR5c2J1cmcgDQogICAgICBHUk9VUCBCWSAxLDIsMw0KICAgICAgSEFWSU5HIGNvdW50KCopID4gMSIpDQpgYGANCg0KYGBge3J9DQojaWRlbnRpZmljYW5kbyBhcyBsaW5oYXMgZHVwbGljYWRhcw0KZGltKGdldHR5c2J1cmcpICM1OTAgMjYNCmBgYA0KDQpgYGB7cn0NCmRmX2R1cGVzIDwtIGphbml0b3I6OmdldF9kdXBlcyhnZXR0eXNidXJnKQ0KDQpkZl9kdXBlcw0KYGBgDQoNCmBgYHtyfQ0KI2VsaW1pbmFuZG8gYXMgZHVwbGljYXRhcyEhISENCmdldHR5c2J1cmcgPC0gZHBseXI6OmRpc3RpbmN0KGdldHR5c2J1cmcsIC5rZWVwX2FsbCA9IFRSVUUpDQpgYGANCg0KYGBge3J9DQpkaW0oZ2V0dHlzYnVyZykgIzU4NyAyNg0KYGBgDQoNCmBgYHtyfQ0KI2VzdGF0w61zdGljYSBkZXNjcml0aXZhDQpzdW1tYXJ5KGdldHR5c2J1cmcpDQpgYGANCg0KYGBge3J9DQojc29tZW50ZSBkZSB1bWEgY29sdW5hIC0gY2FzbyBuZWNlc3PDoXJpbw0Kc3VtbWFyeShnZXR0eXNidXJnJHRvdGFsX2d1bnMpDQpgYGANCg0KYGBge3J9DQpnZXR0eXNidXJnICU+JQ0KICBkcGx5cjo6ZmlsdGVyKGFybXkgPT0gIkNvbmZlZGVyYXRlIiAmIHR5cGUgPT0gIkluZmFudHJ5IikgJT4lDQogIHNqbWlzYzo6ZGVzY3IoKSAtPiBkZXNjcl9zdGF0cw0KYGBgDQoNCmBgYHtyfQ0KI2NyaWEgdW1hIHRhYmVsYSBjb20gZXN0YXTDrXN0aWNhcyBkZSBhY29yZG8gY29tIHVtIGZpbHRybyBhbnRlcmlvcg0KcmVhZHI6OndyaXRlX2NzdihkZXNjcl9zdGF0cywgJ2Rlc2NyX3N0YXRzLmNzdicpDQojY2xpY2FyIG5vIGRhdGEuZnJhbWUgZGVzY3Jfc3RhdHMNCmBgYA0KDQpgYGB7cn0NCiN2YXJpw6F2ZWlzIGNhdGVnw7NyaWNhcw0KZ2V0dHlzYnVyZ19jYXQgPC0gZ2V0dHlzYnVyZ1ssIHNhcHBseShnZXR0eXNidXJnLCBjbGFzcykgPT0gJ2NoYXJhY3RlciddDQpgYGANCg0KYGBge3J9DQpWaWV3KGdldHR5c2J1cmdfY2F0KQ0KYGBgDQoNCmBgYHtyfQ0KI0NvbnRhbmRvIChncm91cCBieSkgZGUgdG9kYXMgYXMgdmFyacOhdmVpcyBjYXRlZ8OzcmljYXMNCmdldHR5c2J1cmdfY2F0ICU+JSBkcGx5cjo6c3VtbWFyaXNlX2FsbChkcGx5cjo6ZnVucyhkcGx5cjo6bl9kaXN0aW5jdCguKSkpDQpgYGANCg0KYGBge3J9DQojcmVhbGl6YW5kbyB1bSBhZ3J1cGFtZW50byBjb20gdW1hIGRhcyB2YXJpw6F2ZWlzDQpnZXR0eXNidXJnX2NhdCAlPiUgDQogIGRwbHlyOjpncm91cF9ieShDZHJfY2FzdWFsdHkpICU+JQ0KICBkcGx5cjo6c3VtbWFyaXplKG51bV9yb3dzID0gbigpKQ0KYGBgDQoNCmBgYHtyfQ0KI2NvbXBhcmHDp8OjbyBkZSBiYWl4YXMgZGUgRXjDqXJjaXRvcy4gT2JzZXJ2ZSBxdWUgaMOhIHVtYSBjb250YWdlbSBwYXJhIGNhZGEgY2F1c2EgZGUgbW9ydGFsaWRhZGUhDQpnZXR0eXNidXJnX2NhdCAlPiUgamFuaXRvcjo6dGFieWwoYXJteSwgQ2RyX2Nhc3VhbHR5KQ0KYGBgDQoNCmBgYHtyfQ0KI0VtIFNRTA0Kc3FsZGYoIlNFTEVDVCBDZHJfY2FzdWFsdHksIGNvdW50KCopIGFzIHRvdGFsIA0KICAgICAgRlJPTSBnZXR0eXNidXJnX2NhdCANCiAgICAgIEdST1VQIEJZIDEiKQ0KYGBgDQoNCmBgYHtyfQ0KI291IGNvbXBhcmFuZG8gY29tIGEgb3JkZW0gZGEgbWFpb3IgcGFyYSBhIG1lbm9yIGNhdXNhOg0Kc3FsZGYoIlNFTEVDVCBhcm15LCBDZHJfY2FzdWFsdHksIGNvdW50KCopIHRvdGFsIA0KICAgICAgRlJPTSBnZXR0eXNidXJnX2NhdCANCiAgICAgIEdST1VQIEJZIDEsMg0KICAgICAgT1JERVIgIEJZIDEsIDMgZGVzYyIpDQpgYGANCg0KYGBge3J9DQojZGFkb3MgYXVzZW50ZXMgLSBjb250YSBvIE5BDQpuYV9jb3VudCA8LQ0KICBzYXBwbHkoZ2V0dHlzYnVyZywgZnVuY3Rpb24oeSkNCiAgICBzdW0obGVuZ3RoKHdoaWNoKGlzLm5hKHkpKSkpKQ0KbmFfZGYgPC0gZGF0YS5mcmFtZShuYV9jb3VudCkNCmBgYA0KDQpgYGB7cn0NClZpZXcobmFfZGYpDQpgYGANCg0KYGBge3J9DQpzcWxkZigiU0VMRUNUIGtpbGxlZCwgY291bnQoKikgdG90YWwgDQogICAgICBGUk9NIGdldHR5c2J1cmcNCiAgICAgIEdST1VQIEJZIDENCiAgICAgIE9SREVSICBCWSAxIGRlc2MiKQ0KYGBgDQoNCmBgYHtyfQ0KI1ZhcmnDom5jaWEgLSBsZW1icmFkbyBuenYgLSBuZWFyIHplcm8gdmFyDQpmZWF0dXJlX3ZhcmlhbmNlIDwtIGNhcmV0OjpuZWFyWmVyb1ZhcihnZXR0eXNidXJnLCBzYXZlTWV0cmljcyA9IFRSVUUpDQpgYGANCg0KYGBge3J9DQpWaWV3KGZlYXR1cmVfdmFyaWFuY2UpDQpgYGANCg0KYGBge3J9DQp3aGljaChmZWF0dXJlX3ZhcmlhbmNlJHplcm9WYXIgPT0gJ1RSVUUnKQ0KYGBgDQoNCmBgYHtyfQ0KI1F1YWlzPw0Kcm93Lm5hbWVzKGZlYXR1cmVfdmFyaWFuY2VbMTcsIF0pDQpgYGANCg0KYGBge3J9DQojT3UgaW5kaWNhbmRvIG9zIHJlZ2lzdHJvcyBxdWUgdGVtIG56dg0Kd2hpY2goZmVhdHVyZV92YXJpYW5jZSRuenYgPT0gJ1RSVUUnKQ0KYGBgDQoNCmBgYHtyfQ0KZ2V0dHlzYnVyZ19mbHRyZCA8LSBnZXR0eXNidXJnWywgZmVhdHVyZV92YXJpYW5jZSR6ZXJvVmFyID09ICdGQUxTRSddDQpgYGANCg0KYGBge3J9DQpWaWV3KGdldHR5c2J1cmdfZmx0cmQpDQpgYGANCg==