Welcome to your first lab! Each lab consists of two parts: (1) this instruction/walk-through page, and (2) a .rmd template that can be found on moodle. Your workflow should generally look like:
- Open the lab page through the course website
- In another tab, go to moodle and download the .rmd file along with any datasets that are included
- Edit the .rmd file as you work through the instructions on this page
- Knit to PDF and submit the resulting file to moodle
Part 1: Getting comfy with R commands
For the first two labs, we’ll do a combination of tutorials hosted on the web and making graphs on your own computer. The hosted tutorials are helpful for reacquainting yourself with R syntax and commands, without the startup of getting everything running on your own computer. Over the next few days, we’ll start doing more and more on our own computers.
For today, you should work through the following primers:
- Data Visualization Basics
- Exploratory Data Analysis
- Bar Charts
1 and 2 were also linked in an earlier email, so you may have already done them! If you are pretty confident with your R skills and the primers feel too slow of a pace, you are welcome to skip through them. This practice is for you! Being comfortable with the basics of graphing in R will make later tasks go much more smoothly.
Part 2: Meet the toolkit!
You have two options for completing coursework this January: use Swarthmore’s RStudio Server, or downloading R and RStudio locally on your own computer. I strongly encourage you to try downloading R and RStudio locally for this course. The server is super convenient, since you don’t need to install anything, but it’s not designed to handle larger datasets, complicated analyses, or fancier graphics. You will need to log into the VPN in order to access the server, and it can sometimes be slow when many users are accessing it at the same time. It’s also tricky to customize fonts, which we’ll start doing at the end of the first week. That being said, it’s always there for you if you are having any problems with your local setup.
The rest of this section is a walk-through on how to get up and running on your own computer. If you are already comfortable with your setup, feel free to skip to the last section. (But come back here if you run into any issues!)
R
If coding is a car, we’ll think of R as the engine. This needs to be installed before anything else.
- Head to the CRAN website: https://cran.r-project.org/
- Click on “Download R for X”, where X is your operating system
- If you use macOS, scroll down to the first .pkg file in the list of files (the current version is currently 4.0.3) and download it.
- If you use Windows, click “base” (or click on the bolded “install R for the first time” link) and download it.
- Double click on the downloaded file (check your
Downloads folder). Click yes through all the prompts to install like any other program.
- If you use macOS, download and install XQuartz. You do not need to do this on Windows
RStudio
In this car metaphor, RStudio is the dashboard. It’s a nicer user interface for interacting with R, and once we install it, we won’t ever use R by itself.
Go to the free download location on RStudio’s website: https://www.rstudio.com/products/rstudio/download/#download
The website should automatically detect your operating system (macOS or Windows) and show a big download button for it:
If not, scroll down a little to the large table and choose the version of RStudio that matches your operating system.
- Double click on the downloaded file (again, check your Downloads folder). Click yes through all the prompts to install like any other program.
Double click on RStudio to run it (check your applications folder or start menu).
Tidyverse
There are many different approaches to visualization and many different approaches to coding. In this class, we’re going to use an approach called the tidyverse. If you’ve seen SQL before, the syntax is very similar. The tidyverse was built specifically to analyze and visualize data. This makes it different than “base R” or python which are more general-purpose coding languages. Most of the packages used in the tidyverse are developed or maintained by RStudio employees, so it works very well for our purposes as a class.
Key packages:
The basic philosophy is simple: in tidy data, every column corresponds to a variable and every row corresponds to an observation.
To install the tidyverse, select the packages panel, click on “Install”, type the name of the package you want to install (in this case, tidyverse), and press enter. (The tidyverse consists of a bunch of packages, so this might take a while)
R Markdown
This is an R Markdown document. Markdown is a simple formatting syntax for authoring HTML, PDF, and MS Word documents. For more details on using R Markdown see http://rmarkdown.rstudio.com.
When you click the Knit button a document will be generated that includes both content as well as the output of any embedded R code chunks within the document. You can embed an R code chunk like this:
summary(cars)
## speed dist
## Min. : 4.0 Min. : 2.00
## 1st Qu.:12.0 1st Qu.: 26.00
## Median :15.0 Median : 36.00
## Mean :15.4 Mean : 42.98
## 3rd Qu.:19.0 3rd Qu.: 56.00
## Max. :25.0 Max. :120.00
TinyTex
When you knit to PDF, R uses a special scientific typesetting program named LaTeX (pronounced “lay-tek” or “lah-tek”)
LaTeX is neat and makes pretty documents, but it’s a huge program—the macOS version, for instance, is nearly 4 GB! To make life easier, there’s an R package named tinytex that installs a minimal LaTeX program and that automatically deals with differences between macOS and Windows.
Here’s how to install tinytex so you can knit to pretty PDFs:
- Use the Packages in panel in RStudio to install tinytex like you did above with tidyverse. Alternatively, run install.packages(“tinytex”) in the console.
- Run tinytex::install_tinytex() in the console.
- Wait for a bit while R downloads and installs everything you need.
- The end! You should now be able to knit to PDF.
Part 3: Try knitting an rmarkdown document
Finally, you’ll put it all together and knit an Rmarkdown document from your own computer!
- Download “LASTNAME-Lab01.Rmd” from moodle
- Download “DATASET NAME” from moodle
- Create a new folder on your computer for this class, and a sub-folder called “lab01”. Save both files there, and change ‘LASTNAME’ in the .rmd file to your last name. Here’s an image of how your folder system might look:
- Open the .rmd file in RStudio
- Make sure it knits – you should be able to click the “knit” button in RStudio and see the following:
- Follow the directions in the .rmd file to change the graph, answer the survey questions, and upload your knitted .pdf file to moodle
Bonus: you’ll notice in my screenshots that I use dark theme – if you want to feel like a Cool Coder ™ too (aka give your eyes a break) you can customize yours by clicking on “RStudio” then “preferences”. Here’s my theme:
LS0tCnRpdGxlOiAiTGFiMDE6IE1lZXQgVGhlIFRvb2xraXQiCm91dHB1dDogCiAgaHRtbF9kb2N1bWVudDogCiAgICB0b2M6IHRydWUKICAgIHRvY19mbG9hdDogdHJ1ZQogICAgY29kZV9kb3dubG9hZDogdHJ1ZQogICAgY3NzOiBzdGF0NDEtbGFiLXRoZW1lLmNzcwotLS0KCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUpCmxpYnJhcnkodGlkeXZlcnNlKQpgYGAKCgpXZWxjb21lIHRvIHlvdXIgZmlyc3QgbGFiISBFYWNoIGxhYiBjb25zaXN0cyBvZiB0d28gcGFydHM6ICgxKSB0aGlzIGluc3RydWN0aW9uL3dhbGstdGhyb3VnaCBwYWdlLCBhbmQgKDIpIGEgLnJtZCB0ZW1wbGF0ZSB0aGF0IGNhbiBiZSBmb3VuZCBvbiBtb29kbGUuIFlvdXIgd29ya2Zsb3cgc2hvdWxkIGdlbmVyYWxseSBsb29rIGxpa2U6IAoKMS4gT3BlbiB0aGUgbGFiIHBhZ2UgdGhyb3VnaCB0aGUgY291cnNlIHdlYnNpdGUKMi4gSW4gYW5vdGhlciB0YWIsIGdvIHRvIG1vb2RsZSBhbmQgZG93bmxvYWQgdGhlIC5ybWQgZmlsZSBhbG9uZyB3aXRoIGFueSBkYXRhc2V0cyB0aGF0IGFyZSBpbmNsdWRlZAozLiBFZGl0IHRoZSAucm1kIGZpbGUgYXMgeW91IHdvcmsgdGhyb3VnaCB0aGUgaW5zdHJ1Y3Rpb25zIG9uIHRoaXMgcGFnZQo0LiBLbml0IHRvIFBERiBhbmQgc3VibWl0IHRoZSByZXN1bHRpbmcgZmlsZSB0byBtb29kbGUKCiMgUGFydCAxOiBHZXR0aW5nIGNvbWZ5IHdpdGggUiBjb21tYW5kcwoKRm9yIHRoZSBmaXJzdCB0d28gbGFicywgd2UnbGwgZG8gYSBjb21iaW5hdGlvbiBvZiB0dXRvcmlhbHMgaG9zdGVkIG9uIHRoZSB3ZWIgYW5kIG1ha2luZyBncmFwaHMgb24geW91ciBvd24gY29tcHV0ZXIuIFRoZSBob3N0ZWQgdHV0b3JpYWxzIGFyZSBoZWxwZnVsIGZvciByZWFjcXVhaW50aW5nIHlvdXJzZWxmIHdpdGggUiBzeW50YXggYW5kIGNvbW1hbmRzLCB3aXRob3V0IHRoZSBzdGFydHVwIG9mIGdldHRpbmcgZXZlcnl0aGluZyBydW5uaW5nIG9uIHlvdXIgb3duIGNvbXB1dGVyLiBPdmVyIHRoZSBuZXh0IGZldyBkYXlzLCB3ZSdsbCBzdGFydCBkb2luZyBtb3JlIGFuZCBtb3JlIG9uIG91ciBvd24gY29tcHV0ZXJzLiAgCgpGb3IgdG9kYXksIHlvdSBzaG91bGQgd29yayB0aHJvdWdoIHRoZSBmb2xsb3dpbmcgcHJpbWVyczogCgoxLiBbRGF0YSBWaXN1YWxpemF0aW9uIEJhc2ljc10oaHR0cHM6Ly9yc3R1ZGlvLmNsb3VkL2xlYXJuL3ByaW1lcnMvMS4xKQoyLiBbRXhwbG9yYXRvcnkgRGF0YSBBbmFseXNpc10oaHR0cHM6Ly9yc3R1ZGlvLmNsb3VkL2xlYXJuL3ByaW1lcnMvMy4xKQozLiBbQmFyIENoYXJ0c10oaHR0cHM6Ly9yc3R1ZGlvLmNsb3VkL2xlYXJuL3ByaW1lcnMvMy4yKQoKMSBhbmQgMiB3ZXJlIGFsc28gbGlua2VkIGluIGFuIGVhcmxpZXIgZW1haWwsIHNvIHlvdSBtYXkgaGF2ZSBhbHJlYWR5IGRvbmUgdGhlbSEgSWYgeW91IGFyZSBwcmV0dHkgY29uZmlkZW50IHdpdGggeW91ciBSIHNraWxscyBhbmQgdGhlIHByaW1lcnMgZmVlbCB0b28gc2xvdyBvZiBhIHBhY2UsIHlvdSBhcmUgd2VsY29tZSB0byBza2lwIHRocm91Z2ggdGhlbS4gVGhpcyBwcmFjdGljZSBpcyBmb3IgeW91ISBCZWluZyBjb21mb3J0YWJsZSB3aXRoIHRoZSBiYXNpY3Mgb2YgZ3JhcGhpbmcgaW4gUiB3aWxsIG1ha2UgbGF0ZXIgdGFza3MgZ28gbXVjaCBtb3JlIHNtb290aGx5LgoKIyBQYXJ0IDI6IE1lZXQgdGhlIHRvb2xraXQhIAoKWW91IGhhdmUgdHdvIG9wdGlvbnMgZm9yIGNvbXBsZXRpbmcgY291cnNld29yayB0aGlzIEphbnVhcnk6IHVzZSBbU3dhcnRobW9yZSdzIFJTdHVkaW8gU2VydmVyXShyc3R1ZGlvLnN3YXJ0aG1vcmUuZWR1KSwgb3IgZG93bmxvYWRpbmcgUiBhbmQgUlN0dWRpbyBsb2NhbGx5IG9uIHlvdXIgb3duIGNvbXB1dGVyLiBJICoqc3Ryb25nbHkgZW5jb3VyYWdlKiogeW91IHRvIHRyeSBkb3dubG9hZGluZyBSIGFuZCBSU3R1ZGlvIGxvY2FsbHkgZm9yIHRoaXMgY291cnNlLiBUaGUgc2VydmVyIGlzICpzdXBlciogY29udmVuaWVudCwgc2luY2UgeW91IGRvbid0IG5lZWQgdG8gaW5zdGFsbCBhbnl0aGluZywgYnV0IGl0J3Mgbm90IGRlc2lnbmVkIHRvIGhhbmRsZSBsYXJnZXIgZGF0YXNldHMsIGNvbXBsaWNhdGVkIGFuYWx5c2VzLCBvciBmYW5jaWVyIGdyYXBoaWNzLiBZb3Ugd2lsbCBuZWVkIHRvIGxvZyBpbnRvIHRoZSBWUE4gaW4gb3JkZXIgdG8gYWNjZXNzIHRoZSBzZXJ2ZXIsIGFuZCBpdCBjYW4gc29tZXRpbWVzIGJlIHNsb3cgd2hlbiBtYW55IHVzZXJzIGFyZSBhY2Nlc3NpbmcgaXQgYXQgdGhlIHNhbWUgdGltZS4gSXQncyBhbHNvIHRyaWNreSB0byBjdXN0b21pemUgZm9udHMsIHdoaWNoIHdlJ2xsIHN0YXJ0IGRvaW5nIGF0IHRoZSBlbmQgb2YgdGhlIGZpcnN0IHdlZWsuIFRoYXQgYmVpbmcgc2FpZCwgaXQncyAqKmFsd2F5cyB0aGVyZSBmb3IgeW91KiogaWYgeW91IGFyZSBoYXZpbmcgYW55IHByb2JsZW1zIHdpdGggeW91ciBsb2NhbCBzZXR1cC4gCgpUaGUgcmVzdCBvZiB0aGlzIHNlY3Rpb24gaXMgYSB3YWxrLXRocm91Z2ggb24gaG93IHRvIGdldCB1cCBhbmQgcnVubmluZyBvbiB5b3VyIG93biBjb21wdXRlci4gSWYgeW91IGFyZSBhbHJlYWR5IGNvbWZvcnRhYmxlIHdpdGggeW91ciBzZXR1cCwgZmVlbCBmcmVlIHRvIHNraXAgdG8gdGhlIGxhc3Qgc2VjdGlvbi4gKEJ1dCBjb21lIGJhY2sgaGVyZSBpZiB5b3UgcnVuIGludG8gYW55IGlzc3VlcyEpIAoKIyMgUiAKCklmIGNvZGluZyBpcyBhIGNhciwgd2UnbGwgdGhpbmsgb2YgUiBhcyB0aGUgKmVuZ2luZSouIFRoaXMgbmVlZHMgdG8gYmUgaW5zdGFsbGVkIGJlZm9yZSBhbnl0aGluZyBlbHNlLiAKCjEuIEhlYWQgdG8gdGhlIENSQU4gd2Vic2l0ZTogaHR0cHM6Ly9jcmFuLnItcHJvamVjdC5vcmcvCjIuIENsaWNrIG9uICJEb3dubG9hZCBSIGZvciBYIiwgd2hlcmUgWCBpcyB5b3VyIG9wZXJhdGluZyBzeXN0ZW0KCiFbciBkb3dubG9hZF0oaW1hZ2VzL3ItZG93bmxvYWQucG5nKXsjaWQgLmNsYXNzIHdpZHRoPTUwJSBoZWlnaHQ9NTAlfQoKICArIElmIHlvdSB1c2UgbWFjT1MsIHNjcm9sbCBkb3duIHRvIHRoZSBmaXJzdCAucGtnIGZpbGUgaW4gdGhlIGxpc3Qgb2YgZmlsZXMgKHRoZSBjdXJyZW50IHZlcnNpb24gaXMgY3VycmVudGx5IDQuMC4zKSBhbmQgZG93bmxvYWQgaXQuCiAgKyBJZiB5b3UgdXNlIFdpbmRvd3MsIGNsaWNrIOKAnGJhc2XigJ0gKG9yIGNsaWNrIG9uIHRoZSBib2xkZWQg4oCcaW5zdGFsbCBSIGZvciB0aGUgZmlyc3QgdGltZeKAnSBsaW5rKSBhbmQgZG93bmxvYWQgaXQuCiAgCjMuIERvdWJsZSBjbGljayBvbiB0aGUgZG93bmxvYWRlZCBmaWxlIChjaGVjayB5b3VyIGBEb3dubG9hZHNgIGZvbGRlcikuIENsaWNrIHllcyB0aHJvdWdoIGFsbCB0aGUgcHJvbXB0cyB0byBpbnN0YWxsIGxpa2UgYW55IG90aGVyIHByb2dyYW0uCjQuIElmIHlvdSB1c2UgbWFjT1MsIGRvd25sb2FkIGFuZCBpbnN0YWxsIFtYUXVhcnR6XShodHRwczovL3d3dy54cXVhcnR6Lm9yZy8pLiBZb3UgZG8gbm90IG5lZWQgdG8gZG8gdGhpcyBvbiBXaW5kb3dzCgojIyBSU3R1ZGlvIAoKSW4gdGhpcyBjYXIgbWV0YXBob3IsIFJTdHVkaW8gaXMgdGhlIGRhc2hib2FyZC4gSXQncyBhIG5pY2VyIHVzZXIgaW50ZXJmYWNlIGZvciBpbnRlcmFjdGluZyB3aXRoIFIsIGFuZCBvbmNlIHdlIGluc3RhbGwgaXQsIHdlIHdvbid0IGV2ZXIgdXNlIFIgYnkgaXRzZWxmLgoKMS4gR28gdG8gdGhlIGZyZWUgZG93bmxvYWQgbG9jYXRpb24gb24gUlN0dWRpb+KAmXMgd2Vic2l0ZTogaHR0cHM6Ly93d3cucnN0dWRpby5jb20vcHJvZHVjdHMvcnN0dWRpby9kb3dubG9hZC8jZG93bmxvYWQKCjIuIFRoZSB3ZWJzaXRlIHNob3VsZCBhdXRvbWF0aWNhbGx5IGRldGVjdCB5b3VyIG9wZXJhdGluZyBzeXN0ZW0gKG1hY09TIG9yIFdpbmRvd3MpIGFuZCBzaG93IGEgYmlnIGRvd25sb2FkIGJ1dHRvbiBmb3IgaXQ6CgohW3JzdHVkaW8gZG93bmxvYWRdKGltYWdlcy9yc3R1ZGlvLWRvd25sb2FkLnBuZyl7I2lkIC5jbGFzcyB3aWR0aD01MCUgaGVpZ2h0PTUwJX0KCklmIG5vdCwgc2Nyb2xsIGRvd24gYSBsaXR0bGUgdG8gdGhlIGxhcmdlIHRhYmxlIGFuZCBjaG9vc2UgdGhlIHZlcnNpb24gb2YgUlN0dWRpbyB0aGF0IG1hdGNoZXMgeW91ciBvcGVyYXRpbmcgc3lzdGVtLgoKMy4gRG91YmxlIGNsaWNrIG9uIHRoZSBkb3dubG9hZGVkIGZpbGUgKGFnYWluLCBjaGVjayB5b3VyIERvd25sb2FkcyBmb2xkZXIpLiBDbGljayB5ZXMgdGhyb3VnaCBhbGwgdGhlIHByb21wdHMgdG8gaW5zdGFsbCBsaWtlIGFueSBvdGhlciBwcm9ncmFtLgoKRG91YmxlIGNsaWNrIG9uIFJTdHVkaW8gdG8gcnVuIGl0IChjaGVjayB5b3VyIGFwcGxpY2F0aW9ucyBmb2xkZXIgb3Igc3RhcnQgbWVudSkuCgojIyBUaWR5dmVyc2UKClRoZXJlIGFyZSAqKm1hbnkqKiBkaWZmZXJlbnQgYXBwcm9hY2hlcyB0byB2aXN1YWxpemF0aW9uIGFuZCAqKm1hbnkqKiBkaWZmZXJlbnQgYXBwcm9hY2hlcyB0byBjb2RpbmcuIEluIHRoaXMgY2xhc3MsIHdlJ3JlIGdvaW5nIHRvIHVzZSBhbiBhcHByb2FjaCBjYWxsZWQgdGhlIGB0aWR5dmVyc2VgLiBJZiB5b3UndmUgc2VlbiBTUUwgYmVmb3JlLCB0aGUgc3ludGF4IGlzIHZlcnkgc2ltaWxhci4gVGhlIGB0aWR5dmVyc2VgIHdhcyBidWlsdCBzcGVjaWZpY2FsbHkgdG8gYW5hbHl6ZSBhbmQgdmlzdWFsaXplIGRhdGEuIFRoaXMgbWFrZXMgaXQgZGlmZmVyZW50IHRoYW4gImJhc2UgUiIgb3IgcHl0aG9uIHdoaWNoIGFyZSBtb3JlIGdlbmVyYWwtcHVycG9zZSBjb2RpbmcgbGFuZ3VhZ2VzLiBNb3N0IG9mIHRoZSBwYWNrYWdlcyB1c2VkIGluIHRoZSBgdGlkeXZlcnNlYCBhcmUgZGV2ZWxvcGVkIG9yIG1haW50YWluZWQgYnkgUlN0dWRpbyBlbXBsb3llZXMsIHNvIGl0IHdvcmtzIHZlcnkgd2VsbCBmb3Igb3VyIHB1cnBvc2VzIGFzIGEgY2xhc3MuIAoKS2V5IHBhY2thZ2VzOiAKCiAgKyB0aWR5cgogICsgZHBseXIKICArIGdncGxvdDIKICAKVGhlIGJhc2ljIHBoaWxvc29waHkgaXMgc2ltcGxlOiBpbiB0aWR5IGRhdGEsIGV2ZXJ5IGNvbHVtbiBjb3JyZXNwb25kcyB0byBhIHZhcmlhYmxlIGFuZCBldmVyeSByb3cgY29ycmVzcG9uZHMgdG8gYW4gb2JzZXJ2YXRpb24uIAoKVG8gaW5zdGFsbCB0aGUgdGlkeXZlcnNlLCBzZWxlY3QgdGhlIGBwYWNrYWdlc2AgcGFuZWwsIGNsaWNrIG9uICJJbnN0YWxsIiwgdHlwZSB0aGUgbmFtZSBvZiB0aGUgcGFja2FnZSB5b3Ugd2FudCB0byBpbnN0YWxsIChpbiB0aGlzIGNhc2UsIGB0aWR5dmVyc2VgKSwgYW5kIHByZXNzIGVudGVyLiAoVGhlIGB0aWR5dmVyc2VgIGNvbnNpc3RzIG9mIGEgYnVuY2ggb2YgcGFja2FnZXMsIHNvIHRoaXMgbWlnaHQgdGFrZSBhIHdoaWxlKQoKIyMgUiBNYXJrZG93bgoKVGhpcyBpcyBhbiBSIE1hcmtkb3duIGRvY3VtZW50LiBNYXJrZG93biBpcyBhIHNpbXBsZSBmb3JtYXR0aW5nIHN5bnRheCBmb3IgYXV0aG9yaW5nIEhUTUwsIFBERiwgYW5kIE1TIFdvcmQgZG9jdW1lbnRzLiBGb3IgbW9yZSBkZXRhaWxzIG9uIHVzaW5nIFIgTWFya2Rvd24gc2VlIDxodHRwOi8vcm1hcmtkb3duLnJzdHVkaW8uY29tPi4KCldoZW4geW91IGNsaWNrIHRoZSAqKktuaXQqKiBidXR0b24gYSBkb2N1bWVudCB3aWxsIGJlIGdlbmVyYXRlZCB0aGF0IGluY2x1ZGVzIGJvdGggY29udGVudCBhcyB3ZWxsIGFzIHRoZSBvdXRwdXQgb2YgYW55IGVtYmVkZGVkIFIgY29kZSBjaHVua3Mgd2l0aGluIHRoZSBkb2N1bWVudC4gWW91IGNhbiBlbWJlZCBhbiBSIGNvZGUgY2h1bmsgbGlrZSB0aGlzOgoKYGBge3J9CnN1bW1hcnkoY2FycykKYGBgCgojIyBUaW55VGV4CgpXaGVuIHlvdSBrbml0IHRvIFBERiwgUiB1c2VzIGEgc3BlY2lhbCBzY2llbnRpZmljIHR5cGVzZXR0aW5nIHByb2dyYW0gbmFtZWQgTGFUZVggKHByb25vdW5jZWQg4oCcbGF5LXRla+KAnSBvciDigJxsYWgtdGVr4oCdKQoKTGFUZVggaXMgbmVhdCBhbmQgbWFrZXMgcHJldHR5IGRvY3VtZW50cywgYnV0IGl04oCZcyBhIGh1Z2UgcHJvZ3JhbeKAlHRoZSBtYWNPUyB2ZXJzaW9uLCBmb3IgaW5zdGFuY2UsIGlzIG5lYXJseSA0IEdCISBUbyBtYWtlIGxpZmUgZWFzaWVyLCB0aGVyZeKAmXMgYW4gUiBwYWNrYWdlIG5hbWVkIHRpbnl0ZXggdGhhdCBpbnN0YWxscyBhIG1pbmltYWwgTGFUZVggcHJvZ3JhbSBhbmQgdGhhdCBhdXRvbWF0aWNhbGx5IGRlYWxzIHdpdGggZGlmZmVyZW5jZXMgYmV0d2VlbiBtYWNPUyBhbmQgV2luZG93cy4KCkhlcmXigJlzIGhvdyB0byBpbnN0YWxsIHRpbnl0ZXggc28geW91IGNhbiBrbml0IHRvIHByZXR0eSBQREZzOgoKMS4gVXNlIHRoZSBQYWNrYWdlcyBpbiBwYW5lbCBpbiBSU3R1ZGlvIHRvIGluc3RhbGwgdGlueXRleCBsaWtlIHlvdSBkaWQgYWJvdmUgd2l0aCB0aWR5dmVyc2UuIEFsdGVybmF0aXZlbHksIHJ1biBpbnN0YWxsLnBhY2thZ2VzKCJ0aW55dGV4IikgaW4gdGhlIGNvbnNvbGUuCjIuIFJ1biB0aW55dGV4OjppbnN0YWxsX3Rpbnl0ZXgoKSBpbiB0aGUgY29uc29sZS4KMy4gV2FpdCBmb3IgYSBiaXQgd2hpbGUgUiBkb3dubG9hZHMgYW5kIGluc3RhbGxzIGV2ZXJ5dGhpbmcgeW91IG5lZWQuCjQuIFRoZSBlbmQhIFlvdSBzaG91bGQgbm93IGJlIGFibGUgdG8ga25pdCB0byBQREYuCgoKIyBQYXJ0IDM6IFRyeSBrbml0dGluZyBhbiBybWFya2Rvd24gZG9jdW1lbnQKCkZpbmFsbHksIHlvdSdsbCBwdXQgaXQgYWxsIHRvZ2V0aGVyIGFuZCBrbml0IGFuIFJtYXJrZG93biBkb2N1bWVudCBmcm9tIHlvdXIgb3duIGNvbXB1dGVyISAKCiAgMS4gRG93bmxvYWQgIkxBU1ROQU1FLUxhYjAxLlJtZCIgZnJvbSBtb29kbGUKICAyLiBEb3dubG9hZCAiREFUQVNFVCBOQU1FIiBmcm9tIG1vb2RsZQogIDMuIENyZWF0ZSBhIG5ldyBmb2xkZXIgb24geW91ciBjb21wdXRlciBmb3IgdGhpcyBjbGFzcywgYW5kIGEgc3ViLWZvbGRlciBjYWxsZWQgImxhYjAxIi4gU2F2ZSBib3RoIGZpbGVzIHRoZXJlLCBhbmQgY2hhbmdlICdMQVNUTkFNRScgaW4gdGhlIC5ybWQgZmlsZSB0byB5b3VyIGxhc3QgbmFtZS4gSGVyZSdzIGFuIGltYWdlIG9mIGhvdyB5b3VyIGZvbGRlciBzeXN0ZW0gbWlnaHQgbG9vazogCiAgCiAgICFbZmlsZSBmb2xkZXIgZXhhbXBsZV0oaW1hZ2VzL2ZpbGUtZm9sZGVyLWV4YW1wbGUucG5nKXsjaWQgLmNsYXNzIHdpZHRoPTUwJSBoZWlnaHQ9NTAlfQogICAKICA0LiBPcGVuIHRoZSAucm1kIGZpbGUgaW4gUlN0dWRpbwogIDUuIE1ha2Ugc3VyZSBpdCBrbml0cyAtLSB5b3Ugc2hvdWxkIGJlIGFibGUgdG8gY2xpY2sgdGhlICJrbml0IiBidXR0b24gaW4gUlN0dWRpbyBhbmQgc2VlIHRoZSBmb2xsb3dpbmc6IAogIAogICFba25pdHRlZCBsYWIwMSB0ZW1wbGF0ZV0oaW1hZ2VzL2xhYjAxLWtuaXR0ZWQucG5nKXsjaWQgLmNsYXNzIHdpZHRoPTUwJSBoZWlnaHQ9NTAlfQogIAogIDYuIEZvbGxvdyB0aGUgZGlyZWN0aW9ucyBpbiB0aGUgLnJtZCBmaWxlIHRvIGNoYW5nZSB0aGUgZ3JhcGgsIGFuc3dlciB0aGUgc3VydmV5IHF1ZXN0aW9ucywgYW5kIHVwbG9hZCB5b3VyIGtuaXR0ZWQgLnBkZiBmaWxlIHRvIG1vb2RsZQogIAoqKkJvbnVzOioqIHlvdSdsbCBub3RpY2UgaW4gbXkgc2NyZWVuc2hvdHMgdGhhdCBJIHVzZSBkYXJrIHRoZW1lIC0tIGlmIHlvdSB3YW50IHRvIGZlZWwgbGlrZSBhIENvb2wgQ29kZXIgJnRyYWRlOyB0b28gKGFrYSBnaXZlIHlvdXIgZXllcyBhIGJyZWFrKSB5b3UgY2FuIGN1c3RvbWl6ZSB5b3VycyBieSBjbGlja2luZyBvbiAiUlN0dWRpbyIgdGhlbiAicHJlZmVyZW5jZXMiLiBIZXJlJ3MgbXkgdGhlbWU6IAoKIVt0aGVtZSBvcHRpb25zXShpbWFnZXMvdGhlbWUtb3B0aW9ucy5wbmcpeyNpZCAuY2xhc3Mgd2lkdGg9NTAlIGhlaWdodD01MCV9Cg==