1 Principais características

  • O R vem com as configurações mínimas ao ser instalado. Para realizar tarefas mais específicas pode ser necessário instalar pacotes adicionais (packages), clicando em “pacotes>>instalar pacotes”;

  • É necessário escolher o CRAN (Comprehensive R Archive Network), que são arquivos disponibilizados na rede por diversas IES do mundo inteiro, inclusive do Brasil.

  • O R é case-sensitive, isto é, ele diferencia letras minúsculas de maiúsculas;

  • O separador de casas decimais é o “.”;

  • A vírgula é usada para separar argumentos;

  • O prompt do R é o sinal de maior “>”;

  • Após instalarmos algum pacote sempre será necessário carregá-lo com o comando: library("nome do pacote");

  • Para verificar como citar o pacote instalado digite: citation("nome do pacote");

  • Para obter ajuda dos arquivos do R use o comando help(nome da função).

2 Primeiros comandos

Exemplos:

# help(sqrt) #ajuda sobre a função raiz quadrada
# help(lm) # ajuda sobre a função linear models
# citation("ggplot2") # mostra como o pacote deve ser citado
  • Algumas demonstrações gráficas
#demo(graphics) #pressione Enter 
#demo(persp)
#demo(image)

Um pacote amplamente utilizado para contrução de gráficos é o ggplot

  • Continhas
# soma
 2+2-(2+6)+(2)
## [1] -2
# multiplicação
6 + (6*78)
## [1] 474
# Divisão
4/(3+2)
## [1] 0.8
# potência
2**3
## [1] 8
2^3
## [1] 8
2^(3)
## [1] 8

2.1 Funções no R

  • nome da função ( )

\(\rightarrow\) dentro dos parênteses colocamos os argumentos da função.

\(\rightarrow\) os argumentos são separados por vírgula.

Exemplos:

mean(...): calcula a média aritmética.

sd(...): calcula o desvio padrão.

lm(...): estima os parâmetros de um modelo de regressão linear.

2.2 Criando objetos/vetores com valores numéricos

Vamos crias um vetor de notas de 10 alunos da turma. A função length(notas) fornece o número de observações (n) dentro do objeto.

OBS: o comando <- significa assinalar; o comando c significa concatenar (colocar junto).

notas = c(9,6,8,5,7,8,6,9,10,6)
print(notas)
##  [1]  9  6  8  5  7  8  6  9 10  6
length(notas)
## [1] 10

Para objetos com letras (variáveis qualitativas), basta colocar cada observação entre aspas.

Para listar quais objetos temos salvo utiliza-se a função ls().

Para remover um objeto: rm("nome do objeto").

letras<-c("a","b","c","d")
print(letras)
## [1] "a" "b" "c" "d"
ls()
## [1] "letras" "notas"

2.3 Condicionantes

Imagine que queremos saber qual o maior número entre dois objetos n1 e n2. Uma condicionante interessante no R é o ifelse.

1<5 # menor
## [1] TRUE
2==2 # igual
## [1] TRUE
sqrt(25) != 6 # diferente
## [1] TRUE
n1 = 8
n2 = 8.1
teste = n1>n2
teste
## [1] FALSE
ifelse(teste, "n1 maior que n2","n2 é maior que n1")
## [1] "n2 é maior que n1"

Quando não há uma função pronta no R podemos fazer uma a partir da função function(...).

maior <- function(n1,n2){
  teste1 <- n1 > n2
  ifelse(teste1,"n1 é maior","n2 é maior")
}

Agora podemos usar essa nova função com seus respectivos argumentos (n1 e n2) e o resultado retornará o maior número.

maior(5,6)
## [1] "n2 é maior"
maior(7,0)
## [1] "n1 é maior"
maior(2^4, sqrt(100))
## [1] "n1 é maior"

2.4 Loop

# queremos ver todos os números de 1 a 1000
# que são divisíveis por 13 e por 7 ao mesmo tempo.

for (i in 1:1000 ) {
  if((i %% 13 == 0) & (i %% 7 == 0))
    print(i)
}
## [1] 91
## [1] 182
## [1] 273
## [1] 364
## [1] 455
## [1] 546
## [1] 637
## [1] 728
## [1] 819
## [1] 910

O while executa as tarefas repetidamente até que uma condição seja satisfeita, não percorrendo um vetor.

i <- 1
while(i <= 5){
  print(i)
  i = i + 1
}
## [1] 1
## [1] 2
## [1] 3
## [1] 4
## [1] 5

3 Banco de dados (BD)

  • data.table: extensão do data.frame

  • Sintaxe: DT[ i , j , by ]

    • i : subconjunto de linhas.
    • j : subconjunto de colunas.
    • by : agrupar por.

Vamos fazer algumas manipulações no bando de dados iris.

library(data.table) # carregando o pacote já instalado
data("iris") # carregando o banco de dados iris do R base
iris_dt <- as.data.table(iris) # atribuindo o BD a um objeto DT
str(iris_dt)
## Classes 'data.table' and 'data.frame':   150 obs. of  5 variables:
##  $ Sepal.Length: num  5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9 ...
##  $ Sepal.Width : num  3.5 3 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1 ...
##  $ Petal.Length: num  1.4 1.4 1.3 1.5 1.4 1.7 1.4 1.5 1.4 1.5 ...
##  $ Petal.Width : num  0.2 0.2 0.2 0.2 0.2 0.4 0.3 0.2 0.2 0.1 ...
##  $ Species     : Factor w/ 3 levels "setosa","versicolor",..: 1 1 1 1 1 1 1 1 1 1 ...
##  - attr(*, ".internal.selfref")=<externalptr>

3.1 Selecionando linhas e colunas

# dataframe
iris[1:3,]
##   Sepal.Length Sepal.Width Petal.Length Petal.Width Species
## 1          5.1         3.5          1.4         0.2  setosa
## 2          4.9         3.0          1.4         0.2  setosa
## 3          4.7         3.2          1.3         0.2  setosa
# datatable
iris_dt[1:3]
##    Sepal.Length Sepal.Width Petal.Length Petal.Width Species
## 1:          5.1         3.5          1.4         0.2  setosa
## 2:          4.9         3.0          1.4         0.2  setosa
## 3:          4.7         3.2          1.3         0.2  setosa
# encontrar linhas onde Species=="setosa"
# dataframe
iris[iris$Species=="setosa",]
##    Sepal.Length Sepal.Width Petal.Length Petal.Width Species
## 1           5.1         3.5          1.4         0.2  setosa
## 2           4.9         3.0          1.4         0.2  setosa
## 3           4.7         3.2          1.3         0.2  setosa
## 4           4.6         3.1          1.5         0.2  setosa
## 5           5.0         3.6          1.4         0.2  setosa
## 6           5.4         3.9          1.7         0.4  setosa
## 7           4.6         3.4          1.4         0.3  setosa
## 8           5.0         3.4          1.5         0.2  setosa
## 9           4.4         2.9          1.4         0.2  setosa
## 10          4.9         3.1          1.5         0.1  setosa
## 11          5.4         3.7          1.5         0.2  setosa
## 12          4.8         3.4          1.6         0.2  setosa
## 13          4.8         3.0          1.4         0.1  setosa
## 14          4.3         3.0          1.1         0.1  setosa
## 15          5.8         4.0          1.2         0.2  setosa
## 16          5.7         4.4          1.5         0.4  setosa
## 17          5.4         3.9          1.3         0.4  setosa
## 18          5.1         3.5          1.4         0.3  setosa
## 19          5.7         3.8          1.7         0.3  setosa
## 20          5.1         3.8          1.5         0.3  setosa
## 21          5.4         3.4          1.7         0.2  setosa
## 22          5.1         3.7          1.5         0.4  setosa
## 23          4.6         3.6          1.0         0.2  setosa
## 24          5.1         3.3          1.7         0.5  setosa
## 25          4.8         3.4          1.9         0.2  setosa
## 26          5.0         3.0          1.6         0.2  setosa
## 27          5.0         3.4          1.6         0.4  setosa
## 28          5.2         3.5          1.5         0.2  setosa
## 29          5.2         3.4          1.4         0.2  setosa
## 30          4.7         3.2          1.6         0.2  setosa
## 31          4.8         3.1          1.6         0.2  setosa
## 32          5.4         3.4          1.5         0.4  setosa
## 33          5.2         4.1          1.5         0.1  setosa
## 34          5.5         4.2          1.4         0.2  setosa
## 35          4.9         3.1          1.5         0.2  setosa
## 36          5.0         3.2          1.2         0.2  setosa
## 37          5.5         3.5          1.3         0.2  setosa
## 38          4.9         3.6          1.4         0.1  setosa
## 39          4.4         3.0          1.3         0.2  setosa
## 40          5.1         3.4          1.5         0.2  setosa
## 41          5.0         3.5          1.3         0.3  setosa
## 42          4.5         2.3          1.3         0.3  setosa
## 43          4.4         3.2          1.3         0.2  setosa
## 44          5.0         3.5          1.6         0.6  setosa
## 45          5.1         3.8          1.9         0.4  setosa
## 46          4.8         3.0          1.4         0.3  setosa
## 47          5.1         3.8          1.6         0.2  setosa
## 48          4.6         3.2          1.4         0.2  setosa
## 49          5.3         3.7          1.5         0.2  setosa
## 50          5.0         3.3          1.4         0.2  setosa
#datatable
iris_dt[Species=="setosa"]
##     Sepal.Length Sepal.Width Petal.Length Petal.Width Species
##  1:          5.1         3.5          1.4         0.2  setosa
##  2:          4.9         3.0          1.4         0.2  setosa
##  3:          4.7         3.2          1.3         0.2  setosa
##  4:          4.6         3.1          1.5         0.2  setosa
##  5:          5.0         3.6          1.4         0.2  setosa
##  6:          5.4         3.9          1.7         0.4  setosa
##  7:          4.6         3.4          1.4         0.3  setosa
##  8:          5.0         3.4          1.5         0.2  setosa
##  9:          4.4         2.9          1.4         0.2  setosa
## 10:          4.9         3.1          1.5         0.1  setosa
## 11:          5.4         3.7          1.5         0.2  setosa
## 12:          4.8         3.4          1.6         0.2  setosa
## 13:          4.8         3.0          1.4         0.1  setosa
## 14:          4.3         3.0          1.1         0.1  setosa
## 15:          5.8         4.0          1.2         0.2  setosa
## 16:          5.7         4.4          1.5         0.4  setosa
## 17:          5.4         3.9          1.3         0.4  setosa
## 18:          5.1         3.5          1.4         0.3  setosa
## 19:          5.7         3.8          1.7         0.3  setosa
## 20:          5.1         3.8          1.5         0.3  setosa
## 21:          5.4         3.4          1.7         0.2  setosa
## 22:          5.1         3.7          1.5         0.4  setosa
## 23:          4.6         3.6          1.0         0.2  setosa
## 24:          5.1         3.3          1.7         0.5  setosa
## 25:          4.8         3.4          1.9         0.2  setosa
## 26:          5.0         3.0          1.6         0.2  setosa
## 27:          5.0         3.4          1.6         0.4  setosa
## 28:          5.2         3.5          1.5         0.2  setosa
## 29:          5.2         3.4          1.4         0.2  setosa
## 30:          4.7         3.2          1.6         0.2  setosa
## 31:          4.8         3.1          1.6         0.2  setosa
## 32:          5.4         3.4          1.5         0.4  setosa
## 33:          5.2         4.1          1.5         0.1  setosa
## 34:          5.5         4.2          1.4         0.2  setosa
## 35:          4.9         3.1          1.5         0.2  setosa
## 36:          5.0         3.2          1.2         0.2  setosa
## 37:          5.5         3.5          1.3         0.2  setosa
## 38:          4.9         3.6          1.4         0.1  setosa
## 39:          4.4         3.0          1.3         0.2  setosa
## 40:          5.1         3.4          1.5         0.2  setosa
## 41:          5.0         3.5          1.3         0.3  setosa
## 42:          4.5         2.3          1.3         0.3  setosa
## 43:          4.4         3.2          1.3         0.2  setosa
## 44:          5.0         3.5          1.6         0.6  setosa
## 45:          5.1         3.8          1.9         0.4  setosa
## 46:          4.8         3.0          1.4         0.3  setosa
## 47:          5.1         3.8          1.6         0.2  setosa
## 48:          4.6         3.2          1.4         0.2  setosa
## 49:          5.3         3.7          1.5         0.2  setosa
## 50:          5.0         3.3          1.4         0.2  setosa
##     Sepal.Length Sepal.Width Petal.Length Petal.Width Species
# encontrar linhas onde Species=="setosa" e Sepal.Length==5
#dataframe
iris[iris$Species=="setosa" & iris$Sepal.Length==5,]
##    Sepal.Length Sepal.Width Petal.Length Petal.Width Species
## 5             5         3.6          1.4         0.2  setosa
## 8             5         3.4          1.5         0.2  setosa
## 26            5         3.0          1.6         0.2  setosa
## 27            5         3.4          1.6         0.4  setosa
## 36            5         3.2          1.2         0.2  setosa
## 41            5         3.5          1.3         0.3  setosa
## 44            5         3.5          1.6         0.6  setosa
## 50            5         3.3          1.4         0.2  setosa
#datatable
iris_dt[Species=="setosa" & Sepal.Length==5]
##    Sepal.Length Sepal.Width Petal.Length Petal.Width Species
## 1:            5         3.6          1.4         0.2  setosa
## 2:            5         3.4          1.5         0.2  setosa
## 3:            5         3.0          1.6         0.2  setosa
## 4:            5         3.4          1.6         0.4  setosa
## 5:            5         3.2          1.2         0.2  setosa
## 6:            5         3.5          1.3         0.3  setosa
## 7:            5         3.5          1.6         0.6  setosa
## 8:            5         3.3          1.4         0.2  setosa

3.2 Manipulando colunas e agrupando

iris[, c("Species", "Petal.Width", "Petal.Length")]
##        Species Petal.Width Petal.Length
## 1       setosa         0.2          1.4
## 2       setosa         0.2          1.4
## 3       setosa         0.2          1.3
## 4       setosa         0.2          1.5
## 5       setosa         0.2          1.4
## 6       setosa         0.4          1.7
## 7       setosa         0.3          1.4
## 8       setosa         0.2          1.5
## 9       setosa         0.2          1.4
## 10      setosa         0.1          1.5
## 11      setosa         0.2          1.5
## 12      setosa         0.2          1.6
## 13      setosa         0.1          1.4
## 14      setosa         0.1          1.1
## 15      setosa         0.2          1.2
## 16      setosa         0.4          1.5
## 17      setosa         0.4          1.3
## 18      setosa         0.3          1.4
## 19      setosa         0.3          1.7
## 20      setosa         0.3          1.5
## 21      setosa         0.2          1.7
## 22      setosa         0.4          1.5
## 23      setosa         0.2          1.0
## 24      setosa         0.5          1.7
## 25      setosa         0.2          1.9
## 26      setosa         0.2          1.6
## 27      setosa         0.4          1.6
## 28      setosa         0.2          1.5
## 29      setosa         0.2          1.4
## 30      setosa         0.2          1.6
## 31      setosa         0.2          1.6
## 32      setosa         0.4          1.5
## 33      setosa         0.1          1.5
## 34      setosa         0.2          1.4
## 35      setosa         0.2          1.5
## 36      setosa         0.2          1.2
## 37      setosa         0.2          1.3
## 38      setosa         0.1          1.4
## 39      setosa         0.2          1.3
## 40      setosa         0.2          1.5
## 41      setosa         0.3          1.3
## 42      setosa         0.3          1.3
## 43      setosa         0.2          1.3
## 44      setosa         0.6          1.6
## 45      setosa         0.4          1.9
## 46      setosa         0.3          1.4
## 47      setosa         0.2          1.6
## 48      setosa         0.2          1.4
## 49      setosa         0.2          1.5
## 50      setosa         0.2          1.4
## 51  versicolor         1.4          4.7
## 52  versicolor         1.5          4.5
## 53  versicolor         1.5          4.9
## 54  versicolor         1.3          4.0
## 55  versicolor         1.5          4.6
## 56  versicolor         1.3          4.5
## 57  versicolor         1.6          4.7
## 58  versicolor         1.0          3.3
## 59  versicolor         1.3          4.6
## 60  versicolor         1.4          3.9
## 61  versicolor         1.0          3.5
## 62  versicolor         1.5          4.2
## 63  versicolor         1.0          4.0
## 64  versicolor         1.4          4.7
## 65  versicolor         1.3          3.6
## 66  versicolor         1.4          4.4
## 67  versicolor         1.5          4.5
## 68  versicolor         1.0          4.1
## 69  versicolor         1.5          4.5
## 70  versicolor         1.1          3.9
## 71  versicolor         1.8          4.8
## 72  versicolor         1.3          4.0
## 73  versicolor         1.5          4.9
## 74  versicolor         1.2          4.7
## 75  versicolor         1.3          4.3
## 76  versicolor         1.4          4.4
## 77  versicolor         1.4          4.8
## 78  versicolor         1.7          5.0
## 79  versicolor         1.5          4.5
## 80  versicolor         1.0          3.5
## 81  versicolor         1.1          3.8
## 82  versicolor         1.0          3.7
## 83  versicolor         1.2          3.9
## 84  versicolor         1.6          5.1
## 85  versicolor         1.5          4.5
## 86  versicolor         1.6          4.5
## 87  versicolor         1.5          4.7
## 88  versicolor         1.3          4.4
## 89  versicolor         1.3          4.1
## 90  versicolor         1.3          4.0
## 91  versicolor         1.2          4.4
## 92  versicolor         1.4          4.6
## 93  versicolor         1.2          4.0
## 94  versicolor         1.0          3.3
## 95  versicolor         1.3          4.2
## 96  versicolor         1.2          4.2
## 97  versicolor         1.3          4.2
## 98  versicolor         1.3          4.3
## 99  versicolor         1.1          3.0
## 100 versicolor         1.3          4.1
## 101  virginica         2.5          6.0
## 102  virginica         1.9          5.1
## 103  virginica         2.1          5.9
## 104  virginica         1.8          5.6
## 105  virginica         2.2          5.8
## 106  virginica         2.1          6.6
## 107  virginica         1.7          4.5
## 108  virginica         1.8          6.3
## 109  virginica         1.8          5.8
## 110  virginica         2.5          6.1
## 111  virginica         2.0          5.1
## 112  virginica         1.9          5.3
## 113  virginica         2.1          5.5
## 114  virginica         2.0          5.0
## 115  virginica         2.4          5.1
## 116  virginica         2.3          5.3
## 117  virginica         1.8          5.5
## 118  virginica         2.2          6.7
## 119  virginica         2.3          6.9
## 120  virginica         1.5          5.0
## 121  virginica         2.3          5.7
## 122  virginica         2.0          4.9
## 123  virginica         2.0          6.7
## 124  virginica         1.8          4.9
## 125  virginica         2.1          5.7
## 126  virginica         1.8          6.0
## 127  virginica         1.8          4.8
## 128  virginica         1.8          4.9
## 129  virginica         2.1          5.6
## 130  virginica         1.6          5.8
## 131  virginica         1.9          6.1
## 132  virginica         2.0          6.4
## 133  virginica         2.2          5.6
## 134  virginica         1.5          5.1
## 135  virginica         1.4          5.6
## 136  virginica         2.3          6.1
## 137  virginica         2.4          5.6
## 138  virginica         1.8          5.5
## 139  virginica         1.8          4.8
## 140  virginica         2.1          5.4
## 141  virginica         2.4          5.6
## 142  virginica         2.3          5.1
## 143  virginica         1.9          5.1
## 144  virginica         2.3          5.9
## 145  virginica         2.5          5.7
## 146  virginica         2.3          5.2
## 147  virginica         1.9          5.0
## 148  virginica         2.0          5.2
## 149  virginica         2.3          5.4
## 150  virginica         1.8          5.1
#datatable
iris_dt[,.(Species,Petal.Width,Petal.Length)]
##        Species Petal.Width Petal.Length
##   1:    setosa         0.2          1.4
##   2:    setosa         0.2          1.4
##   3:    setosa         0.2          1.3
##   4:    setosa         0.2          1.5
##   5:    setosa         0.2          1.4
##  ---                                   
## 146: virginica         2.3          5.2
## 147: virginica         1.9          5.0
## 148: virginica         2.0          5.2
## 149: virginica         2.3          5.4
## 150: virginica         1.8          5.1
# Número de observações por Species
#dataframe
table(iris$Species)
## 
##     setosa versicolor  virginica 
##         50         50         50
data.frame(table(iris$Species))
##         Var1 Freq
## 1     setosa   50
## 2 versicolor   50
## 3  virginica   50
#datatable
iris_dt[,.N,Species]
##       Species  N
## 1:     setosa 50
## 2: versicolor 50
## 3:  virginica 50

3.2.1 Agrupando por medidas descritivas

### Calculando a méda de Sepal.Length
#dataframe
mean(iris$Sepal.Length)
## [1] 5.843333
#datatable
iris_dt[,mean(Sepal.Length)]
## [1] 5.843333
# Calculando a média de Sepal.Length por Species
#dataframe
aggregate(Sepal.Length ~ Species, iris, mean)
##      Species Sepal.Length
## 1     setosa        5.006
## 2 versicolor        5.936
## 3  virginica        6.588
#datatable
iris_dt[,mean(Sepal.Length),.(Species)]
##       Species    V1
## 1:     setosa 5.006
## 2: versicolor 5.936
## 3:  virginica 6.588
# calculando a média Sepal.Length por Species onde Sepal.Width >= 3
#dataframe
aggregate(Sepal.Length ~ Species, iris[iris$Sepal.Width>=3,],mean)
##      Species Sepal.Length
## 1     setosa     5.029167
## 2 versicolor     6.218750
## 3  virginica     6.768966
#datable
iris_dt[Sepal.Width>=3,mean(Sepal.Length),Species]
##       Species       V1
## 1:     setosa 5.029167
## 2: versicolor 6.218750
## 3:  virginica 6.768966
# Calculando a média de sepal length por Sepal.Width > 3 e Sepal.Width <= 3
iris_dt[,mean(Sepal.Length),.(width_maior_3=Sepal.Width>3)]
##    width_maior_3       V1
## 1:          TRUE 5.683582
## 2:         FALSE 5.972289
# criando novas variáveis 
iris_dt[,razao := Petal.Width/Petal.Length]
head(iris_dt)
##    Sepal.Length Sepal.Width Petal.Length Petal.Width Species     razao
## 1:          5.1         3.5          1.4         0.2  setosa 0.1428571
## 2:          4.9         3.0          1.4         0.2  setosa 0.1428571
## 3:          4.7         3.2          1.3         0.2  setosa 0.1538462
## 4:          4.6         3.1          1.5         0.2  setosa 0.1333333
## 5:          5.0         3.6          1.4         0.2  setosa 0.1428571
## 6:          5.4         3.9          1.7         0.4  setosa 0.2352941
LS0tDQp0aXRsZTogJ1Byb2JhYmlsaWRhZGUgZSBFc3RhdMOtc3RpY2EgLSBub3RhcyBkbyBjYXDDrXR1bG8gMScNCmF1dGhvcjoNCi0gbmFtZTogVW5pdmVyc2lkYWRlIEZlZGVyYWwgZG8gT2VzdGUgZG8gUGFyw6ENCi0gbmFtZTogSW5zdGl0dXRvIGRlIEZvcm1hw6fDo28gSW50ZXJkaXNjaXBsaW5hcyBlIEludGVyY3VsdHVyYWwNCi0gbmFtZTogUHJvZi4gRHIuIERlbm5pc29uIENhcnZhbGhvDQpkYXRlOiAiIg0Kb3V0cHV0Og0KICBodG1sX2RvY3VtZW50Og0KICAgIGNvZGVfZG93bmxvYWQ6IHllcw0KICAgIGhpZ2hsaWdodDogdGV4dG1hdGUNCiAgICBudW1iZXJfc2VjdGlvbnM6IHllcw0KICAgIHRoZW1lOiBjZXJ1bGVhbg0KICAgIHRvYzogeWVzDQogICAgdG9jX2RlcHRoOiA2DQogICAgdG9jX2Zsb2F0Og0KICAgICAgY29sbGFwc2VkOiBubw0KICAgICAgc21vb3RoX3Njcm9sbDogeWVzDQogICAga2VlcF9tZDogeWVzDQogIHdvcmRfZG9jdW1lbnQ6DQogICAgdG9jOiB5ZXMNCiAgICB0b2NfZGVwdGg6ICc2Jw0KICBwZGZfZG9jdW1lbnQ6DQogICAgdG9jOiB5ZXMNCiAgICB0b2NfZGVwdGg6ICc2Jw0KICAgIGJpYmxpb2dyYXBoeTogcmVmX211bHQuYmliDQogICAgbGFuZzogInB0LUJSIg0KICAgIGNpdGVjb2xvcjogcmVkDQogICAgbGluay1jaXRhdGlvbnM6IHllcw0KICAgIGxpbmtjb2xvcjogYmx1ZQ0KLS0tDQoNCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQ0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFKQ0KYGBgDQoNCjxzdHlsZT4NCmJvZHl7dGV4dC1hbGlnbjoganVzdGlmeX0NCjwvc3R5bGU+DQoNCjxkaXYgY2xhc3MgPSAicHJvZ3Jlc3MiPg0KICA8ZGl2IGNsYXNzID0gInByb2dyZXNzLWJhciIgc3R5bGUgPSAid2lkdGg6IDEwMCU7Ij4gPC9kaXY+DQo8L2Rpdj4NCg0KIyBQcmluY2lwYWlzIGNhcmFjdGVyw61zdGljYXMNCg0KLSAgIE8gYFJgIHZlbSBjb20gYXMgY29uZmlndXJhw6fDtWVzIG3DrW5pbWFzIGFvIHNlciBpbnN0YWxhZG8uIFBhcmEgcmVhbGl6YXIgdGFyZWZhcyBtYWlzIGVzcGVjw61maWNhcyBwb2RlIHNlciBuZWNlc3PDoXJpbyBpbnN0YWxhciBwYWNvdGVzIGFkaWNpb25haXMgKHBhY2thZ2VzKSwgY2xpY2FuZG8gZW0gInBhY290ZXM+Pmluc3RhbGFyIHBhY290ZXMiOw0KDQotICAgw4kgbmVjZXNzw6FyaW8gZXNjb2xoZXIgbyBDUkFOIChDb21wcmVoZW5zaXZlIFIgQXJjaGl2ZSBOZXR3b3JrKSwgcXVlIHPDo28gYXJxdWl2b3MgZGlzcG9uaWJpbGl6YWRvcyBuYSByZWRlIHBvciBkaXZlcnNhcyBJRVMgZG8gbXVuZG8gaW50ZWlybywgaW5jbHVzaXZlIGRvIEJyYXNpbC4NCg0KLSAgIE8gUiDDqSBjYXNlLXNlbnNpdGl2ZSwgaXN0byDDqSwgZWxlIGRpZmVyZW5jaWEgbGV0cmFzIG1pbsO6c2N1bGFzIGRlIG1hacO6c2N1bGFzOw0KDQotICAgTyBzZXBhcmFkb3IgZGUgY2FzYXMgZGVjaW1haXMgw6kgbyAiLiI7DQoNCi0gICBBIHbDrXJndWxhIMOpIHVzYWRhIHBhcmEgc2VwYXJhciBhcmd1bWVudG9zOw0KDQotICAgTyBwcm9tcHQgZG8gYFJgIMOpIG8gc2luYWwgZGUgbWFpb3IgIj4iOw0KDQotICAgQXDDs3MgaW5zdGFsYXJtb3MgYWxndW0gcGFjb3RlIHNlbXByZSBzZXLDoSBuZWNlc3PDoXJpbyBjYXJyZWfDoS1sbyBjb20gbyBjb21hbmRvOiBgbGlicmFyeSgibm9tZSBkbyBwYWNvdGUiKWA7DQoNCi0gICBQYXJhIHZlcmlmaWNhciBjb21vIGNpdGFyIG8gcGFjb3RlIGluc3RhbGFkbyBkaWdpdGU6IGBjaXRhdGlvbigibm9tZSBkbyBwYWNvdGUiKWA7DQoNCi0gICBQYXJhIG9idGVyIGFqdWRhIGRvcyBhcnF1aXZvcyBkbyBgUmAgdXNlIG8gY29tYW5kbyBgaGVscChub21lIGRhIGZ1bsOnw6NvKWAuDQoNCiMgUHJpbWVpcm9zIGNvbWFuZG9zDQoNCioqRXhlbXBsb3M6KioNCg0KYGBge3J9DQojIGhlbHAoc3FydCkgI2FqdWRhIHNvYnJlIGEgZnVuw6fDo28gcmFpeiBxdWFkcmFkYQ0KIyBoZWxwKGxtKSAjIGFqdWRhIHNvYnJlIGEgZnVuw6fDo28gbGluZWFyIG1vZGVscw0KIyBjaXRhdGlvbigiZ2dwbG90MiIpICMgbW9zdHJhIGNvbW8gbyBwYWNvdGUgZGV2ZSBzZXIgY2l0YWRvDQpgYGANCg0KLSAgIEFsZ3VtYXMgZGVtb25zdHJhw6fDtWVzIGdyw6FmaWNhcw0KDQpgYGB7cn0NCiNkZW1vKGdyYXBoaWNzKSAjcHJlc3Npb25lIEVudGVyIA0KI2RlbW8ocGVyc3ApDQojZGVtbyhpbWFnZSkNCmBgYA0KDQoqKlVtIHBhY290ZSBhbXBsYW1lbnRlIHV0aWxpemFkbyBwYXJhIGNvbnRydcOnw6NvIGRlIGdyw6FmaWNvcyDDqSBvIGBnZ3Bsb3RgKioNCg0KLSAgIENvbnRpbmhhcw0KDQpgYGB7cn0NCiMgc29tYQ0KIDIrMi0oMis2KSsoMikNCg0KIyBtdWx0aXBsaWNhw6fDo28NCjYgKyAoNio3OCkNCg0KIyBEaXZpc8Ojbw0KNC8oMysyKQ0KDQojIHBvdMOqbmNpYQ0KMioqMw0KMl4zDQoyXigzKQ0KYGBgDQoNCiMjIEZ1bsOnw7VlcyBubyBgUmANCg0KKiBgbm9tZSBkYSBmdW7Dp8OjbyAoICAgIClgDQoNCiRccmlnaHRhcnJvdyQgZGVudHJvIGRvcyBwYXLDqm50ZXNlcyBjb2xvY2Ftb3Mgb3MgYXJndW1lbnRvcyBkYSBmdW7Dp8Ojby4NCg0KJFxyaWdodGFycm93JCBvcyBhcmd1bWVudG9zIHPDo28gc2VwYXJhZG9zIHBvciB2w61yZ3VsYS4NCg0KRXhlbXBsb3M6DQoNCmBtZWFuKC4uLilgOiBjYWxjdWxhIGEgbcOpZGlhIGFyaXRtw6l0aWNhLg0KDQpgc2QoLi4uKWA6IGNhbGN1bGEgbyBkZXN2aW8gcGFkcsOjby4NCg0KYGxtKC4uLilgOiBlc3RpbWEgb3MgcGFyw6JtZXRyb3MgZGUgdW0gbW9kZWxvIGRlIHJlZ3Jlc3PDo28gbGluZWFyLg0KDQojIyBDcmlhbmRvIG9iamV0b3MvdmV0b3JlcyBjb20gdmFsb3JlcyBudW3DqXJpY29zDQoNClZhbW9zIGNyaWFzIHVtIHZldG9yIGRlIG5vdGFzIGRlIDEwIGFsdW5vcyBkYSB0dXJtYS4gQSBmdW7Dp8OjbyBgbGVuZ3RoKG5vdGFzKWAgZm9ybmVjZSBvIG7Dum1lcm8gZGUgb2JzZXJ2YcOnw7VlcyAobikgZGVudHJvIGRvIG9iamV0by4NCg0KKipPQlM6IG8gY29tYW5kbyBgPC1gIHNpZ25pZmljYSBhc3NpbmFsYXI7IG8gY29tYW5kbyBgY2Agc2lnbmlmaWNhIGNvbmNhdGVuYXIgKGNvbG9jYXIganVudG8pLioqDQoNCmBgYHtyfQ0Kbm90YXMgPSBjKDksNiw4LDUsNyw4LDYsOSwxMCw2KQ0KcHJpbnQobm90YXMpDQpsZW5ndGgobm90YXMpDQpgYGANCg0KUGFyYSBvYmpldG9zIGNvbSBsZXRyYXMgKHZhcmnDoXZlaXMgcXVhbGl0YXRpdmFzKSwgYmFzdGEgY29sb2NhciBjYWRhIG9ic2VydmHDp8OjbyBlbnRyZSBhc3Bhcy4NCg0KUGFyYSBsaXN0YXIgcXVhaXMgb2JqZXRvcyB0ZW1vcyBzYWx2byB1dGlsaXphLXNlIGEgZnVuw6fDo28gYGxzKClgLg0KDQpQYXJhIHJlbW92ZXIgdW0gb2JqZXRvOiBgcm0oIm5vbWUgZG8gb2JqZXRvIilgLg0KDQpgYGB7cn0NCmxldHJhczwtYygiYSIsImIiLCJjIiwiZCIpDQpwcmludChsZXRyYXMpDQpscygpDQpgYGANCg0KIyMgQ29uZGljaW9uYW50ZXMNCg0KSW1hZ2luZSBxdWUgcXVlcmVtb3Mgc2FiZXIgcXVhbCBvIG1haW9yIG7Dum1lcm8gZW50cmUgZG9pcyBvYmpldG9zIGBuMWAgZSBgbjJgLiBVbWEgY29uZGljaW9uYW50ZSBpbnRlcmVzc2FudGUgbm8gYFJgIMOpIG8gYGlmZWxzZWAuDQoNCmBgYHtyfQ0KMTw1ICMgbWVub3INCjI9PTIgIyBpZ3VhbA0Kc3FydCgyNSkgIT0gNiAjIGRpZmVyZW50ZQ0KYGBgDQoNCmBgYHtyfQ0KbjEgPSA4DQpuMiA9IDguMQ0KdGVzdGUgPSBuMT5uMg0KdGVzdGUNCg0KaWZlbHNlKHRlc3RlLCAibjEgbWFpb3IgcXVlIG4yIiwibjIgw6kgbWFpb3IgcXVlIG4xIikNCmBgYA0KDQpRdWFuZG8gbsOjbyBow6EgdW1hIGZ1bsOnw6NvIHByb250YSBubyBgUmAgcG9kZW1vcyBmYXplciB1bWEgYSBwYXJ0aXIgZGEgZnVuw6fDo28gYGZ1bmN0aW9uKC4uLilgLg0KDQpgYGB7cn0NCm1haW9yIDwtIGZ1bmN0aW9uKG4xLG4yKXsNCiAgdGVzdGUxIDwtIG4xID4gbjINCiAgaWZlbHNlKHRlc3RlMSwibjEgw6kgbWFpb3IiLCJuMiDDqSBtYWlvciIpDQp9DQpgYGANCg0KQWdvcmEgcG9kZW1vcyB1c2FyIGVzc2Egbm92YSBmdW7Dp8OjbyBjb20gc2V1cyByZXNwZWN0aXZvcyBhcmd1bWVudG9zIChuMSBlIG4yKSBlIG8gcmVzdWx0YWRvIHJldG9ybmFyw6EgbyBtYWlvciBuw7ptZXJvLg0KDQpgYGB7cn0NCm1haW9yKDUsNikNCg0KbWFpb3IoNywwKQ0KDQptYWlvcigyXjQsIHNxcnQoMTAwKSkNCmBgYA0KDQoNCmBgYHtyfQ0KDQpgYGANCg0KDQojIyBMb29wDQoNCmBgYHtyfQ0KIyBxdWVyZW1vcyB2ZXIgdG9kb3Mgb3MgbsO6bWVyb3MgZGUgMSBhIDEwMDANCiMgcXVlIHPDo28gZGl2aXPDrXZlaXMgcG9yIDEzIGUgcG9yIDcgYW8gbWVzbW8gdGVtcG8uDQoNCmZvciAoaSBpbiAxOjEwMDAgKSB7DQogIGlmKChpICUlIDEzID09IDApICYgKGkgJSUgNyA9PSAwKSkNCiAgICBwcmludChpKQ0KfQ0KYGBgDQoNCiBPIHdoaWxlIGV4ZWN1dGEgYXMgdGFyZWZhcyByZXBldGlkYW1lbnRlIGF0w6kgcXVlIHVtYSBjb25kacOnw6NvIHNlamEgc2F0aXNmZWl0YSwgbsOjbyBwZXJjb3JyZW5kbyB1bSB2ZXRvci4NCg0KDQpgYGB7cn0NCmkgPC0gMQ0Kd2hpbGUoaSA8PSA1KXsNCiAgcHJpbnQoaSkNCiAgaSA9IGkgKyAxDQp9DQpgYGANCg0KDQojIEJhbmNvIGRlIGRhZG9zIChCRCkNCg0KKiBgZGF0YS50YWJsZWA6IGV4dGVuc8OjbyBkbyBgZGF0YS5mcmFtZWANCg0KKiBTaW50YXhlOiBEVFs8c3BhbiBzdHlsZT0iY29sb3I6cmVkIj4gaSA8L3NwYW4+LDxzcGFuIHN0eWxlPSJjb2xvcjpibHVlIj4gaiA8L3NwYW4+LDxzcGFuIHN0eWxlPSJjb2xvcjpncmVlbiI+IGJ5IDwvc3Bhbj5dDQogIC0gPHNwYW4gc3R5bGU9ImNvbG9yOnJlZCI+IGkgPC9zcGFuPjogc3ViY29uanVudG8gZGUgbGluaGFzLg0KICAtIDxzcGFuIHN0eWxlPSJjb2xvcjpibHVlIj4gaiA8L3NwYW4+OiBzdWJjb25qdW50byBkZSBjb2x1bmFzLg0KICAtIDxzcGFuIHN0eWxlPSJjb2xvcjpncmVlbiI+IGJ5IDwvc3Bhbj46IGFncnVwYXIgcG9yLg0KICANClZhbW9zIGZhemVyIGFsZ3VtYXMgbWFuaXB1bGHDp8O1ZXMgbm8gYmFuZG8gZGUgZGFkb3MgYGlyaXNgLiAgDQogIA0KYGBge3J9DQpsaWJyYXJ5KGRhdGEudGFibGUpICMgY2FycmVnYW5kbyBvIHBhY290ZSBqw6EgaW5zdGFsYWRvDQpkYXRhKCJpcmlzIikgIyBjYXJyZWdhbmRvIG8gYmFuY28gZGUgZGFkb3MgaXJpcyBkbyBSIGJhc2UNCmlyaXNfZHQgPC0gYXMuZGF0YS50YWJsZShpcmlzKSAjIGF0cmlidWluZG8gbyBCRCBhIHVtIG9iamV0byBEVA0Kc3RyKGlyaXNfZHQpDQpgYGANCiANCiMjIFNlbGVjaW9uYW5kbyBsaW5oYXMgZSBjb2x1bmFzIA0KIA0KYGBge3J9DQojIGRhdGFmcmFtZQ0KaXJpc1sxOjMsXQ0KDQojIGRhdGF0YWJsZQ0KaXJpc19kdFsxOjNdDQoNCiMgZW5jb250cmFyIGxpbmhhcyBvbmRlIFNwZWNpZXM9PSJzZXRvc2EiDQojIGRhdGFmcmFtZQ0KaXJpc1tpcmlzJFNwZWNpZXM9PSJzZXRvc2EiLF0NCg0KI2RhdGF0YWJsZQ0KaXJpc19kdFtTcGVjaWVzPT0ic2V0b3NhIl0NCg0KIyBlbmNvbnRyYXIgbGluaGFzIG9uZGUgU3BlY2llcz09InNldG9zYSIgZSBTZXBhbC5MZW5ndGg9PTUNCiNkYXRhZnJhbWUNCmlyaXNbaXJpcyRTcGVjaWVzPT0ic2V0b3NhIiAmIGlyaXMkU2VwYWwuTGVuZ3RoPT01LF0NCg0KI2RhdGF0YWJsZQ0KaXJpc19kdFtTcGVjaWVzPT0ic2V0b3NhIiAmIFNlcGFsLkxlbmd0aD09NV0NCmBgYA0KDQojIyBNYW5pcHVsYW5kbyBjb2x1bmFzIGUgYWdydXBhbmRvDQoNCmBgYHtyfQ0KaXJpc1ssIGMoIlNwZWNpZXMiLCAiUGV0YWwuV2lkdGgiLCAiUGV0YWwuTGVuZ3RoIildDQoNCiNkYXRhdGFibGUNCmlyaXNfZHRbLC4oU3BlY2llcyxQZXRhbC5XaWR0aCxQZXRhbC5MZW5ndGgpXQ0KDQojIE7Dum1lcm8gZGUgb2JzZXJ2YcOnw7VlcyBwb3IgU3BlY2llcw0KI2RhdGFmcmFtZQ0KdGFibGUoaXJpcyRTcGVjaWVzKQ0KZGF0YS5mcmFtZSh0YWJsZShpcmlzJFNwZWNpZXMpKQ0KDQojZGF0YXRhYmxlDQppcmlzX2R0WywuTixTcGVjaWVzXQ0KYGBgDQoNCiMjIyBBZ3J1cGFuZG8gcG9yIG1lZGlkYXMgZGVzY3JpdGl2YXMNCg0KYGBge3J9DQojIyMgQ2FsY3VsYW5kbyBhIG3DqWRhIGRlIFNlcGFsLkxlbmd0aA0KI2RhdGFmcmFtZQ0KbWVhbihpcmlzJFNlcGFsLkxlbmd0aCkNCg0KI2RhdGF0YWJsZQ0KaXJpc19kdFssbWVhbihTZXBhbC5MZW5ndGgpXQ0KDQojIENhbGN1bGFuZG8gYSBtw6lkaWEgZGUgU2VwYWwuTGVuZ3RoIHBvciBTcGVjaWVzDQojZGF0YWZyYW1lDQphZ2dyZWdhdGUoU2VwYWwuTGVuZ3RoIH4gU3BlY2llcywgaXJpcywgbWVhbikNCg0KI2RhdGF0YWJsZQ0KaXJpc19kdFssbWVhbihTZXBhbC5MZW5ndGgpLC4oU3BlY2llcyldDQoNCiMgY2FsY3VsYW5kbyBhIG3DqWRpYSBTZXBhbC5MZW5ndGggcG9yIFNwZWNpZXMgb25kZSBTZXBhbC5XaWR0aCA+PSAzDQojZGF0YWZyYW1lDQphZ2dyZWdhdGUoU2VwYWwuTGVuZ3RoIH4gU3BlY2llcywgaXJpc1tpcmlzJFNlcGFsLldpZHRoPj0zLF0sbWVhbikNCg0KI2RhdGFibGUNCmlyaXNfZHRbU2VwYWwuV2lkdGg+PTMsbWVhbihTZXBhbC5MZW5ndGgpLFNwZWNpZXNdDQoNCiMgQ2FsY3VsYW5kbyBhIG3DqWRpYSBkZSBzZXBhbCBsZW5ndGggcG9yIFNlcGFsLldpZHRoID4gMyBlIFNlcGFsLldpZHRoIDw9IDMNCmlyaXNfZHRbLG1lYW4oU2VwYWwuTGVuZ3RoKSwuKHdpZHRoX21haW9yXzM9U2VwYWwuV2lkdGg+MyldDQoNCiMgY3JpYW5kbyBub3ZhcyB2YXJpw6F2ZWlzIA0KaXJpc19kdFsscmF6YW8gOj0gUGV0YWwuV2lkdGgvUGV0YWwuTGVuZ3RoXQ0KaGVhZChpcmlzX2R0KQ0KYGBgDQoNCiAgDQogIA0KICANCiAgDQogIA0KICANCiAgDQogIA0KICANCiAgDQogIA0KICANCiAgDQogIA0KICANCiAg