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==