About

An R Notebook is an R Markdown document with chunks that can be executed independently and interactively, with output visible immediately beneath the input. R Notebooks are a method of literate programming that allows for direct interaction with R while creating a reproducible document with publication-quality output.

A notebook for this class will consist of comments and directions followed by a chunk of code that can be ran independently in order for students to see the examples and follow along with the lessons.

Setup

To use R Notebooks, first R Studio must be opened. To create an R Notebook in RStudio, go to File -> New File -> R Notebook. In this course though, the notebooks will be created before the start of class and students will edit them throughout the lab.

Typically, a data set or notebook will be downloaded and it is important to set this folder as the working directory for the project prior to any coding. This can be done by going to Session -> Set Working Directory -> To Source File Location

Inserting Chunks of Code

Notebook chunks can be inserted quickly using the keyboard shortcut Ctrl + Alt + I (OS X: Cmd + Option + I), or via the Insert command in the editor toolbar found at the top.

A chunk of empty code looks like this in the notebook before it is published:

It will always begin with they ``` symbol followed by the {r} and ending with the ```. In this light grey box, you can code after the {r} and before the second ``` symbol. You can insert as many chunks of code as you would like as it is user preference. Typically, in an R Notebook, we aspire to have one output per chunk of code. If there will be more than one output, it is best to split the code.

Executing Code

In order to run the code, you have several options.

  1. Use Ctrl + Shift * Enter (OS X: Cmd + Shift + Enter) or the Run Chunk command, , to run the current chunk.

  2. Press Ctrl + Enter (OS X: Cmd + Enter) to run just the current statement. Running a single statement is much like running an entire chunk consisting only of that statement.

  3. Use the Run All and Run Previous commands to run a batch of chunks found at the very top.

Example Executing Code

After downloading a data set, we must read the data in. So, create an R code chunk in the R Notebook and write the code to read in the file. To make sure the file is read correctly, run the chunk. The code should look something like this.

The green triangle with the red square around button is the ‘run’ button. If selected, this button runs the code. If we push it, we should obtain the following result.

This is the output. If the output is not what you want, or if there is an error, you can simply go back to the code chunk, edit the code, and rerun it.

Errors

When coding, there are often small errors that are made. With R Notebooks, the message will display exactly what line your error is on, which allows you to fix it.

In the example below, we see that the error is made because we forgot to set the working directory. This is a very common mistake and as a programmer, we will learn to identify these errors quickly.

Inserting Comments

When working on a lab, it is important to leave comments within your code to understand what you are doing when you refer to it later. A comment is made in the grey code chunk box by putting a “#” symbol in front of text. This is what a comment will look like:

Inserting Images

Throughout the lab sessions, you will be asked to take screenshots of your work and upload them to the lab before submitting your work. Additionally, it may be nice to add images to your notebook to enhance your code or understanding of the project.

To add a picture, use the following command and preview it.

![Caption for the picture.](/path/to/image.png)

Below is an example of how this should look.

![](imgs/img11.jpg)

Submitting Your Work

After completing a lab, you will be submitting a HTML link to Sakai for evaluation. If you are using R online, it is a simple process which involves creating an account on RPubs.

After creating an R Notebook or R Markdown file, it is important to publish your work on RPubs. At the top left, there is a button that says “Preview”. If we click on it, a drop down box should appear. We want to save it as an HTML file, so we click “Knit to HTML”.



This will result in a HTML document. In the top right corner, there will be an option to “Publish” the document.



A window will pop up, following the installation of a few packages. Make sure to publish to “RPubs”.



You will need to hit publish on the screen that looks like this:



That will bring you to the following page:



Follow the directions to “Create an Account”. After doing so, you will be lead to “Step 2 of 2”. Save it as YourNameWorksheet# as the title where # is the number of the worksheet. The URL can be pasted and uploaded to Sakai.


Overall Impact

R Notebooks are revolutionary as they allow students to edit within the file and see the changes that are made with the output immediately without have to run the entire code. Please refer to this guide or the instructor with other questions.

source: http://rmarkdown.rstudio.com/r_notebooks.html

LS0tDQp0aXRsZTogIldvcmtpbmcgd2l0aCBSU3R1ZGlvIE5vdGVib29rcyINCmF1dGhvcjogIkthamFsIENob2tzaGkiDQpkYXRlOiAiU3VtbWVyIDIwMTciDQpvdXRwdXQ6DQogIGh0bWxfbm90ZWJvb2s6IGRlZmF1bHQNCiAgaHRtbF9kb2N1bWVudDogZGVmYXVsdA0KICBwZGZfZG9jdW1lbnQ6IGRlZmF1bHQNCnN1YnRpdGxlOiBDTUUgR3JvdXAgRm91bmRhdGlvbiBCdXNpbmVzcyBBbmFseXRpY3MgTGFiDQotLS0NCg0KYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9DQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUpDQpgYGANCg0KIyMjICBBYm91dA0KDQpBbiBSIE5vdGVib29rIGlzIGFuIFIgTWFya2Rvd24gZG9jdW1lbnQgd2l0aCBjaHVua3MgdGhhdCBjYW4gYmUgZXhlY3V0ZWQgaW5kZXBlbmRlbnRseSBhbmQgaW50ZXJhY3RpdmVseSwgd2l0aCBvdXRwdXQgdmlzaWJsZSBpbW1lZGlhdGVseSBiZW5lYXRoIHRoZSBpbnB1dC4gUiBOb3RlYm9va3MgYXJlIGEgbWV0aG9kIG9mIGxpdGVyYXRlIHByb2dyYW1taW5nIHRoYXQgYWxsb3dzIGZvciBkaXJlY3QgaW50ZXJhY3Rpb24gd2l0aCBSIHdoaWxlIGNyZWF0aW5nIGEgcmVwcm9kdWNpYmxlIGRvY3VtZW50IHdpdGggcHVibGljYXRpb24tcXVhbGl0eSBvdXRwdXQuIA0KDQpBIG5vdGVib29rIGZvciB0aGlzIGNsYXNzIHdpbGwgY29uc2lzdCBvZiBjb21tZW50cyBhbmQgZGlyZWN0aW9ucyBmb2xsb3dlZCBieSBhIGNodW5rIG9mIGNvZGUgdGhhdCBjYW4gYmUgcmFuIGluZGVwZW5kZW50bHkgaW4gb3JkZXIgZm9yIHN0dWRlbnRzIHRvIHNlZSB0aGUgZXhhbXBsZXMgYW5kIGZvbGxvdyBhbG9uZyB3aXRoIHRoZSBsZXNzb25zLg0KDQojIyMgU2V0dXANCg0KVG8gdXNlIFIgTm90ZWJvb2tzLCBmaXJzdCBSIFN0dWRpbyBtdXN0IGJlIG9wZW5lZC4gVG8gY3JlYXRlIGFuIFIgTm90ZWJvb2sgaW4gUlN0dWRpbywgZ28gdG8gRmlsZSAtPiBOZXcgRmlsZSAtPiBSIE5vdGVib29rLiBJbiB0aGlzIGNvdXJzZSB0aG91Z2gsIHRoZSBub3RlYm9va3Mgd2lsbCBiZSBjcmVhdGVkIGJlZm9yZSB0aGUgc3RhcnQgb2YgY2xhc3MgYW5kIHN0dWRlbnRzIHdpbGwgZWRpdCB0aGVtIHRocm91Z2hvdXQgdGhlIGxhYi4NCg0KVHlwaWNhbGx5LCBhIGRhdGEgc2V0IG9yIG5vdGVib29rIHdpbGwgYmUgZG93bmxvYWRlZCBhbmQgaXQgaXMgaW1wb3J0YW50IHRvIHNldCB0aGlzIGZvbGRlciBhcyB0aGUgd29ya2luZyBkaXJlY3RvcnkgZm9yIHRoZSBwcm9qZWN0IHByaW9yIHRvIGFueSBjb2RpbmcuIFRoaXMgY2FuIGJlIGRvbmUgYnkgZ29pbmcgdG8gU2Vzc2lvbiAtPiBTZXQgV29ya2luZyBEaXJlY3RvcnkgLT4gVG8gU291cmNlIEZpbGUgTG9jYXRpb24NCg0KIVtdKGltZ3MvaW1nMDEucG5nKQ0KDQojIyMgSGVhZGVyDQoNClRoZSBoZWFkZXIgaXMgdGhlIHZlcnkgZmlyc3QgZmV3IGxpbmVzIG9mIGNvZGUgdGhhdCBnaXZlIGltcG9ydGFudCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZG9jdW1lbnQuIEl0IGlzIGVzc2VudGlhbCB0byBlZGl0IHRoaXMgaW5mb3JtYXRpb24gZXZlcnl0aW1lIHRvIGVuc3VyZSB5b3UgYXJlIGNyZWRpdGVkIGZvciB5b3VyIHdvcmsgYW5kIHNvIHBlb3BsZSBsb29raW5nIGF0IHlvdXIgY29kZSBrbm93IHdoZW4gYW5kIHdoZXJlIGl0IGlzIGNvbWluZyBmcm9tLiANCg0KIVtdKGltZ3MvaW1nMDIucG5nKQ0KDQojIyMgSW5zZXJ0aW5nIENodW5rcyBvZiBDb2RlDQoNCk5vdGVib29rIGNodW5rcyBjYW4gYmUgaW5zZXJ0ZWQgcXVpY2tseSB1c2luZyB0aGUga2V5Ym9hcmQgc2hvcnRjdXQgQ3RybCArIEFsdCArIEkgKE9TIFg6IENtZCArIE9wdGlvbiArIEkpLCBvciB2aWEgdGhlIEluc2VydCBjb21tYW5kIGluIHRoZSBlZGl0b3IgdG9vbGJhciBmb3VuZCBhdCB0aGUgdG9wLg0KDQohW10oaW1ncy9pbWcwMy5wbmcpDQoNCkEgY2h1bmsgb2YgZW1wdHkgY29kZSBsb29rcyBsaWtlIHRoaXMgaW4gdGhlIG5vdGVib29rIGJlZm9yZSBpdCBpcyBwdWJsaXNoZWQ6DQoNCiFbXShpbWdzL2ltZzA0LnBuZykNCg0KSXQgd2lsbCBhbHdheXMgYmVnaW4gd2l0aCB0aGV5IFxgXGBcYCBzeW1ib2wgZm9sbG93ZWQgYnkgdGhlIGB7cn1gIGFuZCBlbmRpbmcgd2l0aCB0aGUgXGBcYFxgLiBJbiB0aGlzIGxpZ2h0IGdyZXkgYm94LCB5b3UgY2FuIGNvZGUgYWZ0ZXIgdGhlIGB7cn1gIGFuZCBiZWZvcmUgdGhlIHNlY29uZCBcYFxgXGAgc3ltYm9sLiAgWW91IGNhbiBpbnNlcnQgYXMgbWFueSBjaHVua3Mgb2YgY29kZSBhcyB5b3Ugd291bGQgbGlrZSBhcyBpdCBpcyB1c2VyIHByZWZlcmVuY2UuIFR5cGljYWxseSwgaW4gYW4gUiBOb3RlYm9vaywgd2UgYXNwaXJlIHRvIGhhdmUgb25lIG91dHB1dCBwZXIgY2h1bmsgb2YgY29kZS4gSWYgdGhlcmUgd2lsbCBiZSBtb3JlIHRoYW4gb25lIG91dHB1dCwgaXQgaXMgYmVzdCB0byBzcGxpdCB0aGUgY29kZS4gDQoNCiMjIyBFeGVjdXRpbmcgQ29kZQ0KDQpJbiBvcmRlciB0byBydW4gdGhlIGNvZGUsIHlvdSBoYXZlIHNldmVyYWwgb3B0aW9ucy4NCg0KMS4gVXNlIEN0cmwgKyBTaGlmdCAqIEVudGVyIChPUyBYOiBDbWQgKyBTaGlmdCArIEVudGVyKSBvciB0aGUgUnVuIENodW5rIGNvbW1hbmQsICFbXShpbWdzL2ltZzA1LnBuZyksIHRvIHJ1biB0aGUgY3VycmVudCBjaHVuay4NCg0KMi4gUHJlc3MgQ3RybCArIEVudGVyIChPUyBYOiBDbWQgKyBFbnRlcikgdG8gcnVuIGp1c3QgdGhlIGN1cnJlbnQgc3RhdGVtZW50LiBSdW5uaW5nIGEgc2luZ2xlIHN0YXRlbWVudCBpcyBtdWNoIGxpa2UgcnVubmluZyBhbiBlbnRpcmUgY2h1bmsgY29uc2lzdGluZyBvbmx5IG9mIHRoYXQgc3RhdGVtZW50Lg0KDQozLiBVc2UgdGhlIFJ1biBBbGwgYW5kIFJ1biBQcmV2aW91cyBjb21tYW5kcyB0byBydW4gYSBiYXRjaCBvZiBjaHVua3MgZm91bmQgYXQgdGhlIHZlcnkgdG9wLiANCg0KIVtdKGltZ3MvaW1nMDYucG5nKQ0KDQojIyMjIEV4YW1wbGUgRXhlY3V0aW5nIENvZGUNCg0KQWZ0ZXIgZG93bmxvYWRpbmcgYSBkYXRhIHNldCwgd2UgbXVzdCByZWFkIHRoZSBkYXRhIGluLiBTbywgY3JlYXRlIGFuIFIgY29kZSBjaHVuayBpbiB0aGUgUiBOb3RlYm9vayBhbmQgd3JpdGUgdGhlIGNvZGUgdG8gcmVhZCBpbiB0aGUgZmlsZS4gVG8gbWFrZSBzdXJlIHRoZSBmaWxlIGlzIHJlYWQgY29ycmVjdGx5LCBydW4gdGhlIGNodW5rLiBUaGUgY29kZSBzaG91bGQgbG9vayBzb21ldGhpbmcgbGlrZSB0aGlzLiANCg0KIVtdKGltZ3MvaW1nMDcucG5nKQ0KDQpUaGUgZ3JlZW4gdHJpYW5nbGUgd2l0aCB0aGUgcmVkIHNxdWFyZSBhcm91bmQgYnV0dG9uIGlzIHRoZSAncnVuJyBidXR0b24uIElmIHNlbGVjdGVkLCB0aGlzIGJ1dHRvbiBydW5zIHRoZSBjb2RlLiBJZiB3ZSBwdXNoIGl0LCB3ZSBzaG91bGQgb2J0YWluIHRoZSBmb2xsb3dpbmcgcmVzdWx0LiANCg0KIVtdKGltZ3MvaW1nMDgucG5nKQ0KDQpUaGlzIGlzIHRoZSBvdXRwdXQuIElmIHRoZSBvdXRwdXQgaXMgbm90IHdoYXQgeW91IHdhbnQsIG9yIGlmIHRoZXJlIGlzIGFuIGVycm9yLCB5b3UgY2FuIHNpbXBseSBnbyBiYWNrIHRvIHRoZSBjb2RlIGNodW5rLCBlZGl0IHRoZSBjb2RlLCBhbmQgcmVydW4gaXQuIA0KDQojIyMgRXJyb3JzDQoNCldoZW4gY29kaW5nLCB0aGVyZSBhcmUgb2Z0ZW4gc21hbGwgZXJyb3JzIHRoYXQgYXJlIG1hZGUuIFdpdGggUiBOb3RlYm9va3MsIHRoZSBtZXNzYWdlIHdpbGwgZGlzcGxheSBleGFjdGx5IHdoYXQgbGluZSB5b3VyIGVycm9yIGlzIG9uLCB3aGljaCBhbGxvd3MgeW91IHRvIGZpeCBpdC4gDQoNCkluIHRoZSBleGFtcGxlIGJlbG93LCB3ZSBzZWUgdGhhdCB0aGUgZXJyb3IgaXMgbWFkZSBiZWNhdXNlIHdlIGZvcmdvdCB0byBzZXQgdGhlIHdvcmtpbmcgZGlyZWN0b3J5LiBUaGlzIGlzIGEgdmVyeSBjb21tb24gbWlzdGFrZSBhbmQgYXMgYSBwcm9ncmFtbWVyLCB3ZSB3aWxsIGxlYXJuIHRvIGlkZW50aWZ5IHRoZXNlIGVycm9ycyBxdWlja2x5LiANCg0KIVtdKGltZ3MvaW1nMDkucG5nKQ0KDQojIyMgSW5zZXJ0aW5nIENvbW1lbnRzDQoNCldoZW4gd29ya2luZyBvbiBhIGxhYiwgaXQgaXMgaW1wb3J0YW50IHRvIGxlYXZlIGNvbW1lbnRzIHdpdGhpbiB5b3VyIGNvZGUgdG8gdW5kZXJzdGFuZCB3aGF0IHlvdSBhcmUgZG9pbmcgd2hlbiB5b3UgcmVmZXIgdG8gaXQgbGF0ZXIuIEEgY29tbWVudCBpcyBtYWRlIGluIHRoZSBncmV5IGNvZGUgY2h1bmsgYm94IGJ5IHB1dHRpbmcgYSAiXCMiIHN5bWJvbCBpbiBmcm9udCBvZiB0ZXh0LiBUaGlzIGlzIHdoYXQgYSBjb21tZW50IHdpbGwgbG9vayBsaWtlOg0KDQohW10oaW1ncy9pbWcxMC5wbmcpDQoNCiMjIyBJbnNlcnRpbmcgSW1hZ2VzDQoNClRocm91Z2hvdXQgdGhlIGxhYiBzZXNzaW9ucywgeW91IHdpbGwgYmUgYXNrZWQgdG8gdGFrZSBzY3JlZW5zaG90cyBvZiB5b3VyIHdvcmsgYW5kIHVwbG9hZCB0aGVtIHRvIHRoZSBsYWIgYmVmb3JlIHN1Ym1pdHRpbmcgeW91ciB3b3JrLiBBZGRpdGlvbmFsbHksIGl0IG1heSBiZSBuaWNlIHRvIGFkZCBpbWFnZXMgdG8geW91ciBub3RlYm9vayB0byBlbmhhbmNlIHlvdXIgY29kZSBvciB1bmRlcnN0YW5kaW5nIG9mIHRoZSBwcm9qZWN0LiANCg0KVG8gYWRkIGEgcGljdHVyZSwgdXNlIHRoZSBmb2xsb3dpbmcgY29tbWFuZCBhbmQgcHJldmlldyBpdC4NCg0KYGBgDQohW0NhcHRpb24gZm9yIHRoZSBwaWN0dXJlLl0oL3BhdGgvdG8vaW1hZ2UucG5nKQ0KYGBgDQoNCkJlbG93IGlzIGFuIGV4YW1wbGUgb2YgaG93IHRoaXMgc2hvdWxkIGxvb2suDQoNCmBgYA0KIVtdKGltZ3MvaW1nMTEuanBnKQ0KYGBgDQoNCiFbXShpbWdzL2ltZzExLmpwZykNCg0KIyMjIFN1Ym1pdHRpbmcgWW91ciBXb3JrDQoNCkFmdGVyIGNvbXBsZXRpbmcgYSBsYWIsIHlvdSB3aWxsIGJlIHN1Ym1pdHRpbmcgYSBIVE1MIGxpbmsgdG8gU2FrYWkgZm9yIGV2YWx1YXRpb24uIElmIHlvdSBhcmUgdXNpbmcgUiBvbmxpbmUsIGl0IGlzIGEgc2ltcGxlIHByb2Nlc3Mgd2hpY2ggaW52b2x2ZXMgY3JlYXRpbmcgYW4gYWNjb3VudCBvbiBbUlB1YnNdKGh0dHA6Ly9ycHVicy5jb20pLiANCg0KQWZ0ZXIgY3JlYXRpbmcgYW4gUiBOb3RlYm9vayBvciBSIE1hcmtkb3duIGZpbGUsIGl0IGlzIGltcG9ydGFudCB0byBwdWJsaXNoIHlvdXIgd29yayBvbiBSUHVicy4gQXQgdGhlIHRvcCBsZWZ0LCB0aGVyZSBpcyBhIGJ1dHRvbiB0aGF0IHNheXMgIlByZXZpZXciLiBJZiB3ZSBjbGljayBvbiBpdCwgYSBkcm9wIGRvd24gYm94IHNob3VsZCBhcHBlYXIuIFdlIHdhbnQgdG8gc2F2ZSBpdCBhcyBhbiBIVE1MIGZpbGUsIHNvIHdlIGNsaWNrICJLbml0IHRvIEhUTUwiLg0KDQo8YnI+DQoNCiFbXShpbWdzL2ltZzE0LnBuZykNCg0KPGJyPg0KDQpUaGlzIHdpbGwgcmVzdWx0IGluIGEgSFRNTCBkb2N1bWVudC4gSW4gdGhlIHRvcCByaWdodCBjb3JuZXIsIHRoZXJlIHdpbGwgYmUgYW4gb3B0aW9uIHRvICJQdWJsaXNoIiB0aGUgZG9jdW1lbnQuIA0KDQo8YnI+DQoNCiFbXShpbWdzL2ltZzE1LnBuZykNCg0KPGJyPg0KDQoNCkEgd2luZG93IHdpbGwgcG9wIHVwLCBmb2xsb3dpbmcgdGhlIGluc3RhbGxhdGlvbiBvZiBhIGZldyBwYWNrYWdlcy4gTWFrZSBzdXJlIHRvIHB1Ymxpc2ggdG8gIlJQdWJzIi4NCg0KPGJyPg0KDQohW10oaW1ncy9pbWcxNi5wbmcpDQoNCjxicj4NCg0KWW91IHdpbGwgbmVlZCB0byBoaXQgcHVibGlzaCBvbiB0aGUgc2NyZWVuIHRoYXQgbG9va3MgbGlrZSB0aGlzOg0KDQo8YnI+DQoNCiFbXShpbWdzL2ltZzE5LnBuZykNCg0KPGJyPg0KDQpUaGF0IHdpbGwgYnJpbmcgeW91IHRvIHRoZSBmb2xsb3dpbmcgcGFnZToNCg0KPGJyPg0KDQoNCiFbXShpbWdzL2ltZzE3LnBuZykNCg0KPGJyPg0KDQpGb2xsb3cgdGhlIGRpcmVjdGlvbnMgdG8gIkNyZWF0ZSBhbiBBY2NvdW50Ii4gQWZ0ZXIgZG9pbmcgc28sIHlvdSB3aWxsIGJlIGxlYWQgdG8gIlN0ZXAgMiBvZiAyIi4gU2F2ZSBpdCBhcyBZb3VyTmFtZVdvcmtzaGVldCMgYXMgdGhlIHRpdGxlIHdoZXJlICMgaXMgdGhlIG51bWJlciBvZiB0aGUgd29ya3NoZWV0LiBUaGUgVVJMIGNhbiBiZSBwYXN0ZWQgYW5kIHVwbG9hZGVkIHRvIFNha2FpLg0KDQo8YnI+DQoNCiFbXShpbWdzL2ltZzE4LnBuZykNCg0KPCEtLURJUkVDVElPTlMgRk9SIFBERg0KDQojVGhlIGRpcmVjdGlvbnMgZm9yIGEgUERGIGFyZSBzaW1pbGFyDQojIVtdKGltZ3MvaW1nMTIucG5nKQ0KDQojVGhpcyB3aWxsIHJlc3VsdCBpbiBhIFBERiBkb2N1bWVudC4gU2F2ZSBpdCBhcyBZb3VyTmFtZVdvcmtzaGVldCMgYXMgdGhlIHRpdGxlIHdoZXJlICMgaXMgdGhlIG51bWJlciBvZiB0aGUgd29ya3NoZWV0LiBVcGxvYWQgdGhpcyBkb2N1bWVudCB0byBTYWthaS4gDQoNCiNJZiB5b3UgYXJlIG9uIGEgY29tcHV0ZXIgb3V0c2lkZSBvZiB0aGUgbGFiLCBpdCBtYXkgbm90IGhhdmUgdGhlIHByb3BlciBwcm9ncmFtcyBkb3dubG9hZGVkIHRvIHByb2R1Y2UgYSBwZGYuIFRoZSBmb2xsb3dpbmcgbWVzc2FnZSB3aWxsIG9jY3VyIG9uIFIgU3R1ZGlvLCBmb3IgZXhhbXBsZSwgd2hlbiB0cnlpbmcgdG8gcHJvZHVjZSBhIHBkZiB3aXRob3V0IHRoZSBwYWNrYWdlcyByZXF1aXJlZDoNCg0KIyFbXShpbWdzL2ltZzEzLnBuZykNCg0KI1RoZSBlcnJvciBtZXNzYWdlIHRlbGxzIHlvdSBleHBsaWNpdGx5IHdoYXQgd2Vic2l0ZSB0byBnbyB0byBkb3dubG9hZCB0aGUgbmVjZXNzYXJ5IGVxdWlwbWVudC4gRG93bmxvYWRpbmcgdGhpcyB3aWxsIGFsbG93IHN0dWRlbnRzIHRvIHR1cm4gdGhlaXIgbGFicyBpbnRvIFBERnMgYXQgaG9tZS4tLT4gDQoNCiMjIyBPdmVyYWxsIEltcGFjdA0KDQpSIE5vdGVib29rcyBhcmUgcmV2b2x1dGlvbmFyeSBhcyB0aGV5IGFsbG93IHN0dWRlbnRzIHRvIGVkaXQgd2l0aGluIHRoZSBmaWxlIGFuZCBzZWUgdGhlIGNoYW5nZXMgdGhhdCBhcmUgbWFkZSB3aXRoIHRoZSBvdXRwdXQgaW1tZWRpYXRlbHkgd2l0aG91dCBoYXZlIHRvIHJ1biB0aGUgZW50aXJlIGNvZGUuIFBsZWFzZSByZWZlciB0byB0aGlzIGd1aWRlIG9yIHRoZSBpbnN0cnVjdG9yIHdpdGggb3RoZXIgcXVlc3Rpb25zLg0KDQpzb3VyY2U6IFtodHRwOi8vcm1hcmtkb3duLnJzdHVkaW8uY29tL3Jfbm90ZWJvb2tzLmh0bWxdKGh0dHA6Ly9ybWFya2Rvd24ucnN0dWRpby5jb20vcl9ub3RlYm9va3MuaHRtbCkNCg0KDQoNCg0KDQo=