O QUE É R?
O R é uma linguagem e ambiente voltados para estatística computacional e gráficos. Aberto e gratuito, é compatível com Windows, UNIX e MacOS. Atualmente o R se encontra em sua versão 3.4.3.
Apenas para evitar a confusão, o R pode se referir as duas coisas: ao software utilizado para executar o código escrito na linguagem R e à linguagem em si. Para mais informações, podemos visitar o site do Projeto R
Bibliografia indicada
- R in a Nutshell: A Desktop Quick Reference (Adler 2012)
- Learning R: A Step-by-Step Function Guide to Data Analysis (Cotton 2013)
- R for Data Science: Import, Tidy, Transform, Visualize, and Model Data (Wickham and Grolemund 2016)
- 25 Recipes for Getting Started with R (Teetor 2011a)
- R Cookbook: Proven Recipes for Data Analysis, Statistics, and Graphics (Teetor 2011b)
- The Essential R Reference (Gardener 2012)
INICIANDO O USO DO R
Instalando o R
Para instalar o R, basta seguir os seguintes passos:
- Visite um dos CRAN Mirros fazer o download do software. Sugerimos: (https://vps.fmvz.usp.br/CRAN/);
- Escolha a versão para o seu sistema operacional (Linux, Mac OS ou Windows);
- Na página seguinte, escolha a versão base;
- Baixe o arquivo disponível no link e instale!
Instalando o RStudio
O RStudio é um ambiente de interface gráfica para o R, ou melhor, um IDE (Integrated Development Environment). Atualmente o RStudio é considerado o melhor IDE para quem programa em R. Além de uma interface mais amigável, possui diversas funcionalidades que facilitam o aprendizado e a produtividade. O RStudio possui uma versão para desktop grátis e para baixar e instalar, basta seguir os seguintes passos:
- Ir até a página de download do RStudio;
- Clicar em download para a versão grátis;
- Escolher o instalador de acordo com o seu sistema operacional (Windows, Mac OS, Linux);
- Após o download, realizar a instalação.
Preparando o ambiente de trabalho
Uma das primeiras coisas a se fazer antes de começarmos a utilizar o RStudio é definirmos o nosso diretório de trabalho. Para verificar o diretório atual, podemos executar o comando getwd()
no console.
OPERAÇÕES BÁSICA UTILIZANDO R
Tipos numéricos
Recorrentemente lidamos com diferentes classes numéricas no R. Podemos nos deparar com números inteiros (integer), números decimais (numeric ou double) ou números complexos (complex). Para verificarmos a classe de um número, basta usarmos a função class()
no número ou na variável que desejamos testar. Vejamos os exemplos a seguir:
class(3L) #Um número inteiro pode também ser representado acompanhado de um L
[1] "integer"
integer
class(3.435)
[1] "numeric"
numeric
class(3 + 3i)
[1] "complex"
complex
NOTA: Para representar o infinito, o R utiliza Inf
e -Inf
. Faça o teste realizando a seguinte operação no console: 1 / 0
Operações lógicas
As operações lógicas são frequentemente utilizadas no R, principalmente na construção de funções. Diversas linguagens de programação utilizam a lógica booleana em que os valores lógicos podem ser TRUE ou FALSE. No R, além dos estados TRUE
ou FALSE
, há também um terceiro para indicar valor ausente (missing value) identificado por NA
. Tais valores são reservados no R, o que indica que você não poderá criar variáveis com tais nomes. É importante destacar que o R é case sensitive, o que indica que existe a diferenciação entre letras maiúsculas e minúsculas. Portanto, quando formos representar os estados TRUE
, FALSE
ou NA
, sempre temos que escrever com todas as letras maiúsculas.
Também podemos representar TRUE
e FALSE
digitando apenas a primeira letra maiúscula. Faça os exemplos abaixo e analise os resultados do console.
3 > 5
48 != 10
TRUE == T
39 > 100
(30 > 10) & (4 < 3)
F == TRUE
TRUE + TRUE
FALSE / 2
NA + 3
TRUE + NA
class(TRUE)
NOTA: Devemos ter bastante cuidado com os valores ausentes (NA
). Caso não haja o tratamento correto, tais valores podem interferir sensivelmente no código executado. Veremos isso com mais clareza ao longo do nosso curso.
Criando variáveis
Até então realizamos algumas operações sem a necessidade de armazenar dados. No entanto, em operações mais complexas é praticamente impossível não utilizarmos variáveis. Com a criação de uma variável, podemos facilmente reusá-la ao longo de nosso código. Vejamos um exemplo.
x <- 3
x + 10
[1] 13
No exemplo anterior, criamos uma variável x
para armazenar o valor numérico 3. Ao realizarmos a operação x + 10
, automaticamente o valor atribuído a x
é recuperado. Para criarmos uma variável, utilizamos o símbolo <-
ou =
. No entanto, a notação <-
é a mais utilizada e será a adotada ao longo do nosso curso. Faça o exemplo seguinte e analise os resultados.
x <- 25
x = 30
31 -> x
x <- x + 1
Os nomes das variáveis podem conter letras, números, pontos e sublinha (_
), mas não podem iniciar com um número ou um ponto seguido de número.
NOTA: Por questão de estética e praticidade, é recomendável que você mantenha os nomes das variáveis apenas com letras minúsculas. As variáveis devem ter nomes curtos e revelar um pouco da informação que guarda. Isso facilitará a leitura do código!
Outra forma de criarmos variáveis é utilizando a função assign()
, apesar de menos usual. Vejamos um exemplo a seguir.
assign("x", 99) #Note que é necessária a utilização de aspas para indicar o nome da variável
x
[1] 99
Outras classes de variáveis
LS0tCnRpdGxlOiAiSW50cm9kdcOnw6NvIGFvIFIiCmF1dGhvcjogCiAgLSBuYW1lOiBXZXZlcnRvbiBMaXNib2EgZGUgU2VuYQogIC0gbmFtZTogTHVpeiBIZW5yaXF1ZQpkYXRlOiAiSmFuZWlybyBkZSAyMDE4IgpvdXRwdXQ6CiAgaHRtbF9ub3RlYm9vazoKICAgIGRmX3ByaW50OiBwYWdlZAogICAgbnVtYmVyX3NlY3Rpb25zOiB5ZXMKICAgIHRvYzogeWVzCiAgICB0b2NfZGVwdGg6IDMKICBodG1sX2RvY3VtZW50OgogICAgZGZfcHJpbnQ6IHBhZ2VkCiAgICB0b2M6IHllcwogICAgdG9jX2RlcHRoOiAnMycKICBwZGZfZG9jdW1lbnQ6CiAgICBrZWVwX3RleDogeWVzCiAgICB0b2M6IHllcwpsaW5rLWNpdGF0aW9uczogeWVzCnN1YnRpdGxlOiBDdXJzbyBCw6FzaWNvIGRlIExpbmd1YWdlbSBSCmJpYmxpb2dyYXBoeTogYmliX2N1cnNvX3IuYmliCi0tLQoKCgojTyBRVUUgw4kgUj8KCk8gUiDDqSB1bWEgbGluZ3VhZ2VtIGUgYW1iaWVudGUgdm9sdGFkb3MgcGFyYSBlc3RhdMOtc3RpY2EgY29tcHV0YWNpb25hbCBlIGdyw6FmaWNvcy4gQWJlcnRvIGUgZ3JhdHVpdG8sCsOpIGNvbXBhdMOtdmVsIGNvbSBXaW5kb3dzLCBVTklYIGUgTWFjT1MuIEF0dWFsbWVudGUgbyBSIHNlIGVuY29udHJhIGVtIHN1YSB2ZXJzw6NvIDMuNC4zLgoKQXBlbmFzIHBhcmEgZXZpdGFyIGEgY29uZnVzw6NvLCBvIFIgcG9kZSBzZSByZWZlcmlyIGFzIGR1YXMgY29pc2FzOiBhbyAqc29mdHdhcmUqIHV0aWxpemFkbyBwYXJhIGV4ZWN1dGFyIG8gY8OzZGlnbyBlc2NyaXRvIG5hIGxpbmd1YWdlbSBSIGUgw6AgbGluZ3VhZ2VtIGVtIHNpLiBQYXJhIG1haXMgaW5mb3JtYcOnw7VlcywgcG9kZW1vcyB2aXNpdGFyIG8gW3NpdGUgZG8gUHJvamV0byBSXShodHRwczovL3d3dy5yLXByb2plY3Qub3JnKQoKIyNCaWJsaW9ncmFmaWEgaW5kaWNhZGEKCiAqIFIgaW4gYSBOdXRzaGVsbDogQSBEZXNrdG9wIFF1aWNrIFJlZmVyZW5jZSBbQGFkbGVyMjAxMnJdCiAqIExlYXJuaW5nIFI6IEEgU3RlcC1ieS1TdGVwIEZ1bmN0aW9uIEd1aWRlIHRvIERhdGEgQW5hbHlzaXMgW0Bjb3R0b24yMDEzbGVhcm5pbmddCiAqIFIgZm9yIERhdGEgU2NpZW5jZTogSW1wb3J0LCBUaWR5LCBUcmFuc2Zvcm0sIFZpc3VhbGl6ZSwgYW5kIE1vZGVsIERhdGEgW0B3aWNraGFtMjAxNnJdCiAqIDI1IFJlY2lwZXMgZm9yIEdldHRpbmcgU3RhcnRlZCB3aXRoIFIgW0B0ZWV0b3IyMDExMjVdCiAqIFIgQ29va2Jvb2s6IFByb3ZlbiBSZWNpcGVzIGZvciBEYXRhIEFuYWx5c2lzLCBTdGF0aXN0aWNzLCBhbmQgR3JhcGhpY3MgW0B0ZWV0b3IyMDExcl0KICogVGhlIEVzc2VudGlhbCBSIFJlZmVyZW5jZSBbQGdhcmRlbmVyMjAxMmVzc2VudGlhbF0KCiNJTklDSUFORE8gTyBVU08gRE8gUgoKIyNJbnN0YWxhbmRvIG8gUgoKUGFyYSBpbnN0YWxhciBvIFIsIGJhc3RhIHNlZ3VpciBvcyBzZWd1aW50ZXMgcGFzc29zOgoKICAqIFZpc2l0ZSB1bSBkb3MgKkNSQU4gTWlycm9zKiBmYXplciBvIGRvd25sb2FkIGRvIHNvZnR3YXJlLiBTdWdlcmltb3M6IChodHRwczovL3Zwcy5mbXZ6LnVzcC5ici9DUkFOLyk7CiAgKiBFc2NvbGhhIGEgdmVyc8OjbyBwYXJhIG8gc2V1IHNpc3RlbWEgb3BlcmFjaW9uYWwgKExpbnV4LCBNYWMgT1Mgb3UgV2luZG93cyk7CiAgKiBOYSBww6FnaW5hIHNlZ3VpbnRlLCBlc2NvbGhhIGEgdmVyc8OjbyAqKmJhc2UqKjsKICAqIEJhaXhlIG8gYXJxdWl2byBkaXNwb27DrXZlbCBubyBsaW5rIGUgaW5zdGFsZSEKCiMjSW5zdGFsYW5kbyBvIFJTdHVkaW8KCk8gUlN0dWRpbyDDqSB1bSBhbWJpZW50ZSBkZSBpbnRlcmZhY2UgZ3LDoWZpY2EgcGFyYSBvIFIsIG91IG1lbGhvciwgdW0gSURFICgqSW50ZWdyYXRlZCBEZXZlbG9wbWVudCBFbnZpcm9ubWVudCopLiBBdHVhbG1lbnRlIG8gUlN0dWRpbyDDqSBjb25zaWRlcmFkbyBvIG1lbGhvciBJREUgcGFyYSBxdWVtIHByb2dyYW1hIGVtIFIuIEFsw6ltIGRlIHVtYSBpbnRlcmZhY2UgbWFpcyBhbWlnw6F2ZWwsIHBvc3N1aSBkaXZlcnNhcyBmdW5jaW9uYWxpZGFkZXMgcXVlIGZhY2lsaXRhbSBvIGFwcmVuZGl6YWRvIGUgYSBwcm9kdXRpdmlkYWRlLiBPIFJTdHVkaW8gcG9zc3VpIHVtYSB2ZXJzw6NvIHBhcmEgZGVza3RvcCBncsOhdGlzIGUgcGFyYSBiYWl4YXIgZSBpbnN0YWxhciwgYmFzdGEgc2VndWlyIG9zIHNlZ3VpbnRlcyBwYXNzb3M6CgogICogSXIgYXTDqSBhIFtww6FnaW5hIGRlIGRvd25sb2FkIGRvIFJTdHVkaW9dKGh0dHBzOi8vd3d3LnJzdHVkaW8uY29tL3Byb2R1Y3RzL3JzdHVkaW8vZG93bmxvYWQpOwogICogQ2xpY2FyIGVtIGRvd25sb2FkIHBhcmEgYSB2ZXJzw6NvIGdyw6F0aXM7CiAgKiBFc2NvbGhlciBvIGluc3RhbGFkb3IgZGUgYWNvcmRvIGNvbSBvIHNldSBzaXN0ZW1hIG9wZXJhY2lvbmFsIChXaW5kb3dzLCBNYWMgT1MsIExpbnV4KTsKICAqIEFww7NzIG8gZG93bmxvYWQsIHJlYWxpemFyIGEgaW5zdGFsYcOnw6NvLgoKIyNQcmVwYXJhbmRvIG8gYW1iaWVudGUgZGUgdHJhYmFsaG8KCgpVbWEgZGFzIHByaW1laXJhcyBjb2lzYXMgYSBzZSBmYXplciBhbnRlcyBkZSBjb21lw6dhcm1vcyBhIHV0aWxpemFyIG8gUlN0dWRpbyDDqSBkZWZpbmlybW9zIG8gbm9zc28gZGlyZXTDs3JpbyBkZSB0cmFiYWxoby4gUGFyYSB2ZXJpZmljYXIgbyBkaXJldMOzcmlvIGF0dWFsLCBwb2RlbW9zIGV4ZWN1dGFyIG8gY29tYW5kbyBgYGBnZXR3ZCgpYGBgbm8gY29uc29sZS4KCiNPUEVSQcOHw5VFUyBCw4FTSUNBIFVUSUxJWkFORE8gUgoKIyNQcmluY2lwYWlzIG9wZXJhw6fDtWVzIGFyaXRtw6l0aWNhcyBlIGzDs2dpY2FzIGNvbSBSCkFudGVzIGRlIGluaWNpYXJtb3MgYXMgcHJpbWVpcmFzIG9wZXJhw6fDtWVzIGNvbSBvIFIsIMOpIG5lY2Vzc8OhcmlvIGNvbmhlY2VyIG9zIHByaW5jaXBhaXMgb3BlcmFkb3JlcyBhcml0bcOpdGljb3MgZSBsw7NnaWNvcy4gU2VndWUgdGFiZWxhIGNvbSBvcyBwcmluY2lwYWlzIG9wZXJhZG9yZXMgZSB1bWEgYnJldmUgZGVzY3Jpw6fDo28gZGUgY2FkYSB1bS4KCk9wZXJhZG9yICAgIERlc2NyacOnw6NvICAgIAotLS0tLS0tICAgICAtLS0tLS0tLS0tLS0tLSAKYGBgK2BgYCAgICAgIE9wZXJhZG9yIGRlIGFkacOnw6NvICAgICAKYGBgLWBgYCAgICAgIE9wZXJhZG9yIGRlIHN1YnRyYcOnw6NvICAgICAgCmBgYCpgYGAgICAgICBPcGVyYWRvciBkZSBtdWx0aXBsaWNhw6fDo28gICAKYGBgL2BgYCAgICAgIE9wZXJhZG9yIGRlIGRpdmlzw6NvCmBgYDpgYGAgICAgICBPcGVyYWRvciBkZSBzZXF1w6puY2lhCmBgYF5gYGAgICAgICBPcGVyYWRvciBleHBvbmVuY2lhbApgYGAlJWBgYCAgICAgT3BlcmFkb3IgZGUgbcOzZHVsbwpgYGA9PWBgYCAgICAgT3BlcmFkb3IgZGUgaWd1YWxkYWRlCmBgYD5gYGAgICAgICBPcGVyYWRvciAibWFpb3IgcXVlIgpgYGA8YGBgICAgICAgT3BlcmFkb3IgIm1lbm9yIHF1ZSIKYGBgPD1gYGAgICAgIE9wZXJhZG9yICJtZW5vciBvdSBpZ3VhbCIKYGBgJmBgYCAgICAgIE9wZXJhZG9yIGzDs2dpY28gIkUiCmBgYHxgYGAgICAgICBPcGVyYWRvciBsw7NnaWNvICJPVSIKClRhYmxlOiBQcmluY2lwYWlzIG9wZXJhZG9yZXMgYXJpdG3DqXRpY29zIGUgbMOzZ2ljb3MKCkNvbmhlY2lkbyB0YWlzIG9wZXJhZG9yZXMsIHBvZGVtb3MgcmVhbGl6YXIgbm9zc2FzIHByaW1laXJhcyBvcGVyYcOnw7VlcyBubyBjb25zb2xlIGRvIFIuIFNlZ3VlIGFsZ3VucyBleGVtcGxvcyBjb20gb3MgcmVzcGVjdGl2b3MgcmVzdWx0YWRvcwoKYGBge3IgT3BlcmHDp8O1ZXMgYsOhc2ljYXN9CiNFeGVtcGxvIGRlIHNvbWEKMzQ3ICsgMzI4CiNFeGVtcGxvIGRlIHN1YnRyYcOnw6NvCjU2NyAtIDM0NQojRXhlbXBsbyBkZSBtdWx0aXBsaWNhw6fDo28KNDU3ICogMzIKYGBgCgojI1RpcG9zIG51bcOpcmljb3MKClJlY29ycmVudGVtZW50ZSBsaWRhbW9zIGNvbSBkaWZlcmVudGVzIGNsYXNzZXMgbnVtw6lyaWNhcyBubyBSLiBQb2RlbW9zIG5vcyBkZXBhcmFyIGNvbSBuw7ptZXJvcyBpbnRlaXJvcyAqKGludGVnZXIpKiwgbsO6bWVyb3MgZGVjaW1haXMgKihudW1lcmljIG91IGRvdWJsZSkqIG91IG7Dum1lcm9zIGNvbXBsZXhvcyAqKGNvbXBsZXgpKi4gUGFyYSB2ZXJpZmljYXJtb3MgYSBjbGFzc2UgZGUgdW0gbsO6bWVybywgYmFzdGEgdXNhcm1vcyBhIGZ1bsOnw6NvIGBgYGNsYXNzKClgYGBubyBuw7ptZXJvIG91IG5hIHZhcmnDoXZlbCBxdWUgZGVzZWphbW9zIHRlc3Rhci4gVmVqYW1vcyBvcyBleGVtcGxvcyBhIHNlZ3VpcjoKCmBgYHtyfQpjbGFzcygzTCkgI1VtIG7Dum1lcm8gaW50ZWlybyBwb2RlIHRhbWLDqW0gc2VyIHJlcHJlc2VudGFkbyBhY29tcGFuaGFkbyBkZSB1bSBMCgpjbGFzcygzLjQzNSkKCmNsYXNzKDMgKyAzaSkKCmBgYAoKCj4qKk5PVEE6KiogKlBhcmEgcmVwcmVzZW50YXIgbyBpbmZpbml0bywgbyBSIHV0aWxpemEgYGBgSW5mYGBgIGUgYGBgLUluZmBgYC4gRmHDp2EgbyB0ZXN0ZSByZWFsaXphbmRvIGEgc2VndWludGUgb3BlcmHDp8OjbyBubyBjb25zb2xlOiBgYGAxIC8gMCBgYGAqCgojI09wZXJhw6fDtWVzIGzDs2dpY2FzCgpBcyBvcGVyYcOnw7VlcyBsw7NnaWNhcyBzw6NvIGZyZXF1ZW50ZW1lbnRlIHV0aWxpemFkYXMgbm8gUiwgcHJpbmNpcGFsbWVudGUgbmEgY29uc3RydcOnw6NvIGRlIGZ1bsOnw7Vlcy4gRGl2ZXJzYXMgbGluZ3VhZ2VucyBkZSBwcm9ncmFtYcOnw6NvIHV0aWxpemFtIGEgbMOzZ2ljYSBib29sZWFuYSBlbSBxdWUgb3MgdmFsb3JlcyBsw7NnaWNvcyBwb2RlbSBzZXIgVFJVRSBvdSBGQUxTRS4gTm8gUiwgYWzDqW0gZG9zIGVzdGFkb3MgYGBgVFJVRWBgYCBvdSBgYGBGQUxTRWBgYCwgaMOhIHRhbWLDqW0gdW0gdGVyY2Vpcm8gcGFyYSBpbmRpY2FyIHZhbG9yIGF1c2VudGUgKihtaXNzaW5nIHZhbHVlKSogaWRlbnRpZmljYWRvIHBvciBgYGBOQWBgYC4gVGFpcyB2YWxvcmVzIHPDo28gcmVzZXJ2YWRvcyBubyBSLCBvIHF1ZSBpbmRpY2EgcXVlIHZvY8OqIG7Do28gcG9kZXLDoSBjcmlhciB2YXJpw6F2ZWlzIGNvbSB0YWlzIG5vbWVzLiDDiSBpbXBvcnRhbnRlIGRlc3RhY2FyIHF1ZSBvIFIgw6kgKmNhc2Ugc2Vuc2l0aXZlKiwgbyBxdWUgaW5kaWNhIHF1ZSBleGlzdGUgYSBkaWZlcmVuY2lhw6fDo28gZW50cmUgbGV0cmFzIG1hacO6c2N1bGFzIGUgbWluw7pzY3VsYXMuIFBvcnRhbnRvLCBxdWFuZG8gZm9ybW9zIHJlcHJlc2VudGFyIG9zIGVzdGFkb3MgYGBgVFJVRWBgYCwgYGBgRkFMU0VgYGAgb3UgYGBgTkFgYGAsIHNlbXByZSB0ZW1vcyBxdWUgZXNjcmV2ZXIgY29tIHRvZGFzIGFzIGxldHJhcyAqKm1hacO6c2N1bGFzKiouIAoKVGFtYsOpbSBwb2RlbW9zIHJlcHJlc2VudGFyIGBgYFRSVUVgYGAgZSBgYGBGQUxTRWBgYCBkaWdpdGFuZG8gYXBlbmFzIGEgcHJpbWVpcmEgbGV0cmEgbWFpw7pzY3VsYS4gRmHDp2Egb3MgZXhlbXBsb3MgYWJhaXhvIGUgYW5hbGlzZSBvcyByZXN1bHRhZG9zIGRvIGNvbnNvbGUuCgpgYGB7ciwgZXZhbD1GQUxTRX0KMyA+IDUKCjQ4ICE9IDEwCgpUUlVFID09IFQKCjM5ID4gMTAwCgooMzAgPiAxMCkgJiAoNCA8IDMpCgpGID09IFRSVUUKClRSVUUgKyBUUlVFCgpGQUxTRSAvIDIKCk5BICsgMwoKVFJVRSArIE5BCgpjbGFzcyhUUlVFKQpgYGAKCj4qKk5PVEE6KiogKkRldmVtb3MgdGVyIGJhc3RhbnRlIGN1aWRhZG8gY29tIG9zIHZhbG9yZXMgYXVzZW50ZXMgKGBgYE5BYGBgKS4gQ2FzbyBuw6NvIGhhamEgbyB0cmF0YW1lbnRvIGNvcnJldG8sIHRhaXMgdmFsb3JlcyBwb2RlbSBpbnRlcmZlcmlyIHNlbnNpdmVsbWVudGUgbm8gY8OzZGlnbyBleGVjdXRhZG8uIFZlcmVtb3MgaXNzbyBjb20gbWFpcyBjbGFyZXphIGFvIGxvbmdvIGRvIG5vc3NvIGN1cnNvLioKCiMjQ3JpYW5kbyB2YXJpw6F2ZWlzCgpBdMOpIGVudMOjbyByZWFsaXphbW9zIGFsZ3VtYXMgb3BlcmHDp8O1ZXMgc2VtIGEgbmVjZXNzaWRhZGUgZGUgYXJtYXplbmFyIGRhZG9zLiBObyBlbnRhbnRvLCBlbSBvcGVyYcOnw7VlcyBtYWlzIGNvbXBsZXhhcyDDqSBwcmF0aWNhbWVudGUgaW1wb3Nzw612ZWwgbsOjbyB1dGlsaXphcm1vcyB2YXJpw6F2ZWlzLiBDb20gYSBjcmlhw6fDo28gZGUgdW1hIHZhcmnDoXZlbCwgcG9kZW1vcyBmYWNpbG1lbnRlIHJldXPDoS1sYSBhbyBsb25nbyBkZSBub3NzbyBjw7NkaWdvLiBWZWphbW9zIHVtIGV4ZW1wbG8uCgpgYGB7cn0KeCA8LSAzCgp4ICsgMTAKYGBgCgpObyBleGVtcGxvIGFudGVyaW9yLCBjcmlhbW9zIHVtYSB2YXJpw6F2ZWwgYGBgeGBgYCBwYXJhIGFybWF6ZW5hciBvIHZhbG9yIG51bcOpcmljbyAzLiBBbyByZWFsaXphcm1vcyBhIG9wZXJhw6fDo28gYGBgeCArIDEwYGBgLCBhdXRvbWF0aWNhbWVudGUgbyB2YWxvciBhdHJpYnXDrWRvIGEgYGBgeGBgYMOpIHJlY3VwZXJhZG8uIFBhcmEgY3JpYXJtb3MgdW1hIHZhcmnDoXZlbCwgdXRpbGl6YW1vcyBvIHPDrW1ib2xvIGBgYDwtYGBgb3UgYGBgPWBgYC4gTm8gZW50YW50bywgYSBub3Rhw6fDo28gYGBgPC1gYGAgw6kgYSBtYWlzIHV0aWxpemFkYSBlIHNlcsOhIGEgYWRvdGFkYSBhbyBsb25nbyBkbyBub3NzbyBjdXJzby4gRmHDp2EgbyBleGVtcGxvIHNlZ3VpbnRlIGUgYW5hbGlzZSBvcyByZXN1bHRhZG9zLiAKCmBgYHtyLCBldmFsPUZBTFNFfQp4IDwtIDI1Cgp4ID0gMzAKCjMxIC0+IHgKCnggPC0geCArIDEKCmBgYAoKT3Mgbm9tZXMgZGFzIHZhcmnDoXZlaXMgcG9kZW0gY29udGVyIGxldHJhcywgbsO6bWVyb3MsIHBvbnRvcyBlIHN1YmxpbmhhIChgYGBfYGBgKSwgbWFzIG7Do28gcG9kZW0gaW5pY2lhciBjb20gdW0gbsO6bWVybyBvdSB1bSBwb250byBzZWd1aWRvIGRlIG7Dum1lcm8uCgo+KipOT1RBOioqICpQb3IgcXVlc3TDo28gZGUgZXN0w6l0aWNhIGUgcHJhdGljaWRhZGUsIMOpIHJlY29tZW5kw6F2ZWwgcXVlIHZvY8OqIG1hbnRlbmhhIG9zIG5vbWVzIGRhcyB2YXJpw6F2ZWlzIGFwZW5hcyBjb20gbGV0cmFzIG1pbsO6c2N1bGFzLiBBcyB2YXJpw6F2ZWlzIGRldmVtIHRlciBub21lcyBjdXJ0b3MgZSByZXZlbGFyIHVtIHBvdWNvIGRhIGluZm9ybWHDp8OjbyBxdWUgZ3VhcmRhLiBJc3NvIGZhY2lsaXRhcsOhIGEgbGVpdHVyYSBkbyBjw7NkaWdvISoKCk91dHJhIGZvcm1hIGRlIGNyaWFybW9zIHZhcmnDoXZlaXMgw6kgdXRpbGl6YW5kbyBhIGZ1bsOnw6NvIGBgYXNzaWduKClgYCwgYXBlc2FyIGRlIG1lbm9zIHVzdWFsLiBWZWphbW9zIHVtIGV4ZW1wbG8gYSBzZWd1aXIuCgpgYGB7cn0KYXNzaWduKCJ4IiwgOTkpICNOb3RlIHF1ZSDDqSBuZWNlc3PDoXJpYSBhIHV0aWxpemHDp8OjbyBkZSBhc3BhcyBwYXJhIGluZGljYXIgbyBub21lIGRhIHZhcmnDoXZlbAoKeApgYGAKCiMjT3V0cmFzIGNsYXNzZXMgZGUgdmFyacOhdmVpcwoKCgoKI1ZFVE9SRVMKCgoKCiNSRUZFUsOKTkNJQVM=