Announcements

Today’s topics are:

  1. Exploring data frames (in Rmd!)
    • (originally from cm003)
  2. Working locally with git
  3. Collaboration with GitHub
    • (originally from cm002)

To participate in today’s class, you’ll need:

1 Exploring data frames (in Rmd!)

1.1 Learning Objectives

In our R exploration last time, we saw one way to bundle together multiple pieces of information: vectors. Now, we’ll turn to data frames.

By the end of this lesson, students are expected to be able to:

  • Describe common properties of “built-in” R data frames using R
  • Extract columns from a data frame

1.2 Resources

This lesson closely mirrors the stat545.com: care-feeding-data page for exploring data frames.

1.3 Getting Started

We’ll be working with the gapminder data set. To access it, in any R console, run the following:

install.packages('gapminder')

1.4 Demonstration

FIRST, let’s ensure your participation repo is setup.

  1. Go to your github.com profile.
  2. If you have a participation repository, but it’s not called STAT545_participation, I’ll show you how to rename it.
  3. If you DON’T have a participation repository set up, let’s do that (I’ll make one, too).

Now, I’ve started a “cleaned up” version of the Rmd file we were exploring last time. Find it on GitHub!

Let’s build this up, and submit the result to your participation repository for your participation assessment.

2 Working locally with git

2.1 Learning Objectives

The concepts we’ll be touching on here are:

  • clone
  • stage
  • commit (again!)
  • pull/push

By the end of the lesson, students are expected to be able to:

  • Demonstrate the above concepts using RStudio’s git client with your participation GitHub repository.

2.2 Resources

Want to try a similar lesson to today’s, but on your own? Follow along with happygitwithr: rstudio-git-github, which is closely aligned with the goals of this lesson.

Want to learn more, above and beyond what’s done in class? Take a look at these:

  • Excellent resource by GitHub on how to “undo” almost anything (including “going back” to a previous state).

2.3 Getting Started

You’ll need to config your git using the command line.

Your RStudio will probably be able to “find” git. But if it can’t, you’ll encounter errors. See happygitwithr: see-git for help.

Optional (but recommended): After class, you might want to cache your credentials so that you don’t have to keep inserting your password.

2.4 Demonstration

The end product of this demonstration is a locally modified version of our data frame exploration, pushed to GitHub.

  • What are “git clients”?
    • We’ll be using the git client built-in to RStudio.
  • Cloning:
    1. Concept (remember “branches”?)
    2. Practice with your participation repo. I’ll be using the Classroom repo.
      • In RStudio, File -> New Project -> Version Control -> Git.
      • You should see a Git tab in RStudio, upper-right corner window. If not, see happygitwithr: see-git for help.
    3. Take a look at the files you just downloaded!
  • By the way:
    • What’s an RStudio “project”?
    • We don’t need to edit a file with RStudio to use its git client!
    • File doesn’t need to have anything to do with R, either.
  • Staging and committing:
    1. Concept
    2. Modify your Rmd exploration from earlier (just add a new line).
    3. Stage and commit
  • Push/Pull:
    1. Concept
    2. Try pushing!

2.5 Adopting git in your workflow

__Before the world of git:__

Save perpetually.

__After embracing git:__

Save perpetually, commit often, push in case of fire.

Need help?

If you’re encountering problems, try:

The git documentation is not friendly. There’s even a parody on it.

3 Collaboration with GitHub

3.1 Learning Objectives: Collaboration with GitHub

The primary focus here is learning about leveraging GitHub’s version control for collaboration. The concepts are:

  • GitHub Pages
  • Forking
  • Pull Request

Specifically, by the end of today’s class, students are expected to:

  • Be able to make a basic website out of your participation repository using GitHub Pages
  • Know roughly what the above concepts are about

3.2 Resources

The GitHub documentation is perhaps the best place to learn about these outside of class:

PS: You might want to sign up for a free GitHub Student Developer Pack. Amongst other perks, you get to make private repositories for free!

3.3 Demonstration

For participation marks, by the end of this demonstration:

  • you’ll have a GitHub pages website set up for your participation repo
  • you don’t need to have anything for the forking exercise!

Checklist:

  1. Set up a basic “GitHub pages” website with your participation repo:
    1. Go to “settings” on your repo.
    2. Scroll down to “GitHub Pages”
    3. Under “Source”, click the “None” drop-down button, and select the branch you want to turn into a website.
  2. Forking a repo:
    1. Let’s try forking the Classroom repo.
    2. We’ll make a change, and will submit a pull request.

4 If there’s time remaining

LS0tCnRpdGxlOiAiU1RBVCA1NDUgQ2xhc3MgTWVldGluZyAwNDogVGhlIHZlcnNpb24gY29udHJvbCB3b3JrZmxvdyIKb3V0cHV0OgogICAgaHRtbF9ub3RlYm9vazoKICAgICAgICB0b2M6IHRydWUKICAgICAgICB0aGVtZTogY2VydWxlYW4KICAgICAgICBudW1iZXJfc2VjdGlvbnM6IHRydWUKZWRpdG9yX29wdGlvbnM6IAogIGNodW5rX291dHB1dF90eXBlOiBpbmxpbmUKLS0tCgpBbm5vdW5jZW1lbnRzCgotIEdldHRpbmcgaGVscCBkdXJpbmcgb2ZmaWNlIGhvdXJzOgogICAgLSBGZWVsIGZyZWUgdG8gdXNlIHRoaXMgYXMgYSAiU1RBVDU0NS1kZWRpY2F0ZWQgd29ya3NwYWNlIi4KLSBHZXR0aW5nIGhlbHAgZHVyaW5nIGNsYXNzLCBtZSB2cy4geW91ciBUQSdzOgogICAgLSBGZWVsIGZyZWUgdG8gYXNrIFRBJ3MgZm9yIGhlbHAgbGliZXJhbGx5IQogICAgLSBTdGlsbCBicmFpbnN0b3JtaW5nIGlkZWFzIGZvciBkaXN0aW5ndWlzaGluZy4KClRvZGF5J3MgdG9waWNzIGFyZToKCjEuIEV4cGxvcmluZyBkYXRhIGZyYW1lcyAoaW4gUm1kISkKICAgIC0gKG9yaWdpbmFsbHkgZnJvbSBjbTAwMykKMi4gV29ya2luZyBsb2NhbGx5IHdpdGggZ2l0CjMuIENvbGxhYm9yYXRpb24gd2l0aCBHaXRIdWIKICAgIC0gKG9yaWdpbmFsbHkgZnJvbSBjbTAwMikKClRvIHBhcnRpY2lwYXRlIGluIHRvZGF5J3MgY2xhc3MsIHlvdSdsbCBuZWVkOgoKLSBbZ2l0IGluc3RhbGxlZF0oaHR0cDovL2hhcHB5Z2l0d2l0aHIuY29tL2luc3RhbGwtZ2l0Lmh0bWwpCi0gQSBHaXRIdWIgYWNjb3VudAotIFJTdHVkaW8gaW5zdGFsbGVkCi0gQWNjZXNzIHRvIHRoZSBjb21tYW5kIGxpbmUgKGNhbiBkbyB0aHJvdWdoIFJTdHVkaW8pCgojIEV4cGxvcmluZyBkYXRhIGZyYW1lcyAoaW4gUm1kISkKCiMjIExlYXJuaW5nIE9iamVjdGl2ZXMKCkluIG91ciBSIGV4cGxvcmF0aW9uIGxhc3QgdGltZSwgd2Ugc2F3IG9uZSB3YXkgdG8gYnVuZGxlIHRvZ2V0aGVyIG11bHRpcGxlIHBpZWNlcyBvZiBpbmZvcm1hdGlvbjogX3ZlY3RvcnNfLiBOb3csIHdlJ2xsIHR1cm4gdG8gX2RhdGEgZnJhbWVzXy4KCkJ5IHRoZSBlbmQgb2YgdGhpcyBsZXNzb24sIHN0dWRlbnRzIGFyZSBleHBlY3RlZCB0byBiZSBhYmxlIHRvOgoKLSBEZXNjcmliZSBjb21tb24gcHJvcGVydGllcyBvZiAiYnVpbHQtaW4iIFIgZGF0YSBmcmFtZXMgdXNpbmcgUgotIEV4dHJhY3QgY29sdW1ucyBmcm9tIGEgZGF0YSBmcmFtZQoKIyMgUmVzb3VyY2VzCgpUaGlzIGxlc3NvbiBjbG9zZWx5IG1pcnJvcnMgdGhlIFtzdGF0NTQ1LmNvbTogY2FyZS1mZWVkaW5nLWRhdGFdKGh0dHA6Ly9zdGF0NTQ1LmNvbS9ibG9jazAwNl9jYXJlLWZlZWRpbmctZGF0YS5odG1sKSBwYWdlIGZvciBleHBsb3JpbmcgZGF0YSBmcmFtZXMuCgojIyBHZXR0aW5nIFN0YXJ0ZWQKCldlJ2xsIGJlIHdvcmtpbmcgd2l0aCB0aGUgZ2FwbWluZGVyIGRhdGEgc2V0LiBUbyBhY2Nlc3MgaXQsIGluIGFueSBSIGNvbnNvbGUsIHJ1biB0aGUgZm9sbG93aW5nOgoKYGBgCmluc3RhbGwucGFja2FnZXMoJ2dhcG1pbmRlcicpCmBgYAoKIyMgRGVtb25zdHJhdGlvbgoKRklSU1QsIGxldCdzIGVuc3VyZSB5b3VyIFtwYXJ0aWNpcGF0aW9uIHJlcG9dKGh0dHA6Ly9zdGF0NTQ1LmNvbS9DbGFzc3Jvb20vcGFydGljaXBhdGlvbi5odG1sKSBpcyBzZXR1cC4KCjEuIEdvIHRvIHlvdXIgZ2l0aHViLmNvbSBwcm9maWxlLgoyLiBJZiB5b3UgaGF2ZSBhIHBhcnRpY2lwYXRpb24gcmVwb3NpdG9yeSwgYnV0IGl0J3Mgbm90IGNhbGxlZCBgU1RBVDU0NV9wYXJ0aWNpcGF0aW9uYCwgSSdsbCBzaG93IHlvdSBob3cgdG8gcmVuYW1lIGl0LiAKMy4gSWYgeW91IERPTidUIGhhdmUgYSBwYXJ0aWNpcGF0aW9uIHJlcG9zaXRvcnkgc2V0IHVwLCBsZXQncyBkbyB0aGF0IChJJ2xsIG1ha2Ugb25lLCB0b28pLgoKTm93LCBJJ3ZlIHN0YXJ0ZWQgYSAiY2xlYW5lZCB1cCIgdmVyc2lvbiBvZiB0aGUgUm1kIGZpbGUgd2Ugd2VyZSBleHBsb3JpbmcgbGFzdCB0aW1lLiBGaW5kIGl0IFtvbiBHaXRIdWJdKGh0dHBzOi8vZ2l0aHViLmNvbS9TVEFUNTQ1LVVCQy9DbGFzc3Jvb20vYmxvYi9tYXN0ZXIvbm90ZXMvY20wMDQtZXhlcmNpc2UtZGYuUm1kKSEKCkxldCdzIGJ1aWxkIHRoaXMgdXAsIGFuZCBzdWJtaXQgdGhlIHJlc3VsdCB0byB5b3VyIFtwYXJ0aWNpcGF0aW9uIHJlcG9zaXRvcnldKGh0dHA6Ly9zdGF0NTQ1LmNvbS9DbGFzc3Jvb20vcGFydGljaXBhdGlvbi5odG1sKSBmb3IgeW91ciBwYXJ0aWNpcGF0aW9uIGFzc2Vzc21lbnQuIAoKIyBXb3JraW5nIGxvY2FsbHkgd2l0aCBnaXQKCiMjIExlYXJuaW5nIE9iamVjdGl2ZXMKClRoZSBjb25jZXB0cyB3ZSdsbCBiZSB0b3VjaGluZyBvbiBoZXJlIGFyZToKCi0gY2xvbmUKLSBzdGFnZQotIGNvbW1pdCAoYWdhaW4hKQotIHB1bGwvcHVzaAoKQnkgdGhlIGVuZCBvZiB0aGUgbGVzc29uLCBzdHVkZW50cyBhcmUgZXhwZWN0ZWQgdG8gYmUgYWJsZSB0bzoKCi0gRGVtb25zdHJhdGUgdGhlIGFib3ZlIGNvbmNlcHRzIHVzaW5nIFJTdHVkaW8ncyBnaXQgY2xpZW50IHdpdGggeW91ciBwYXJ0aWNpcGF0aW9uIEdpdEh1YiByZXBvc2l0b3J5LgoKIyMgUmVzb3VyY2VzCgpXYW50IHRvIHRyeSBhIHNpbWlsYXIgbGVzc29uIHRvIHRvZGF5J3MsIGJ1dCBvbiB5b3VyIG93bj8gRm9sbG93IGFsb25nIHdpdGggW2hhcHB5Z2l0d2l0aHI6IHJzdHVkaW8tZ2l0LWdpdGh1Yl0oaHR0cDovL2hhcHB5Z2l0d2l0aHIuY29tL3JzdHVkaW8tZ2l0LWdpdGh1Yi5odG1sKSwgd2hpY2ggaXMgY2xvc2VseSBhbGlnbmVkIHdpdGggdGhlIGdvYWxzIG9mIHRoaXMgbGVzc29uLgoKV2FudCB0byBsZWFybiBtb3JlLCBhYm92ZSBhbmQgYmV5b25kIHdoYXQncyBkb25lIGluIGNsYXNzPyBUYWtlIGEgbG9vayBhdCB0aGVzZToKCi0gRXhjZWxsZW50IFtyZXNvdXJjZSBieSBHaXRIdWJdKGh0dHBzOi8vYmxvZy5naXRodWIuY29tLzIwMTUtMDYtMDgtaG93LXRvLXVuZG8tYWxtb3N0LWFueXRoaW5nLXdpdGgtZ2l0Lykgb24gaG93IHRvICJ1bmRvIiBhbG1vc3QgYW55dGhpbmcgKGluY2x1ZGluZyAiZ29pbmcgYmFjayIgdG8gYSBwcmV2aW91cyBzdGF0ZSkuCgojIyBHZXR0aW5nIFN0YXJ0ZWQKCllvdSdsbCBuZWVkIHRvIFtjb25maWcgeW91ciBnaXRdKGh0dHA6Ly9oYXBweWdpdHdpdGhyLmNvbS9oZWxsby1naXQuaHRtbCkgdXNpbmcgdGhlIGNvbW1hbmQgbGluZS4KCllvdXIgUlN0dWRpbyB3aWxsIHByb2JhYmx5IGJlIGFibGUgdG8gImZpbmQiIGdpdC4gQnV0IGlmIGl0IGNhbid0LCB5b3UnbGwgZW5jb3VudGVyIGVycm9ycy4gU2VlIFtoYXBweWdpdHdpdGhyOiBzZWUtZ2l0XShodHRwOi8vaGFwcHlnaXR3aXRoci5jb20vcnN0dWRpby1zZWUtZ2l0Lmh0bWwpIGZvciBoZWxwLiAKCl9fT3B0aW9uYWxfXyAoYnV0IHJlY29tbWVuZGVkKTogQWZ0ZXIgY2xhc3MsIHlvdSBtaWdodCB3YW50IHRvIFtjYWNoZV0oaHR0cDovL2hhcHB5Z2l0d2l0aHIuY29tL2NyZWRlbnRpYWwtY2FjaGluZy5odG1sKSB5b3VyIGNyZWRlbnRpYWxzIHNvIHRoYXQgeW91IGRvbid0IGhhdmUgdG8ga2VlcCBpbnNlcnRpbmcgeW91ciBwYXNzd29yZC4KCiMjIERlbW9uc3RyYXRpb24KClRoZSBlbmQgcHJvZHVjdCBvZiB0aGlzIGRlbW9uc3RyYXRpb24gaXMgYSBsb2NhbGx5IG1vZGlmaWVkIHZlcnNpb24gb2Ygb3VyIGRhdGEgZnJhbWUgZXhwbG9yYXRpb24sIHB1c2hlZCB0byBHaXRIdWIuCgotIFdoYXQgYXJlICJnaXQgY2xpZW50cyI/IAogICAgLSBXZSdsbCBiZSB1c2luZyB0aGUgZ2l0IGNsaWVudCBidWlsdC1pbiB0byBSU3R1ZGlvLgotIENsb25pbmc6IAogICAgMS4gQ29uY2VwdCAocmVtZW1iZXIgImJyYW5jaGVzIj8pCiAgICAyLiBQcmFjdGljZSB3aXRoIHlvdXIgcGFydGljaXBhdGlvbiByZXBvLiBJJ2xsIGJlIHVzaW5nIHRoZSBbQ2xhc3Nyb29tXShodHRwczovL2dpdGh1Yi5jb20vU1RBVDU0NS1VQkMvQ2xhc3Nyb29tKSByZXBvLiAKICAgICAgICAtIEluIFJTdHVkaW8sIEZpbGUgLT4gTmV3IFByb2plY3QgLT4gVmVyc2lvbiBDb250cm9sIC0+IEdpdC4KICAgICAgICAtIFlvdSBzaG91bGQgc2VlIGEgYEdpdGAgdGFiIGluIFJTdHVkaW8sIHVwcGVyLXJpZ2h0IGNvcm5lciB3aW5kb3cuIElmIG5vdCwgc2VlIFtoYXBweWdpdHdpdGhyOiBzZWUtZ2l0XShodHRwOi8vaGFwcHlnaXR3aXRoci5jb20vcnN0dWRpby1zZWUtZ2l0Lmh0bWwpIGZvciBoZWxwLgogICAgMy4gVGFrZSBhIGxvb2sgYXQgdGhlIGZpbGVzIHlvdSBqdXN0IGRvd25sb2FkZWQhCi0gQnkgdGhlIHdheTogICAKICAgIC0gV2hhdCdzIGFuIFJTdHVkaW8gInByb2plY3QiPwogICAgLSBXZSBkb24ndCBuZWVkIHRvIGVkaXQgYSBmaWxlIF93aXRoIFJTdHVkaW9fIHRvIHVzZSBpdHMgZ2l0IGNsaWVudCEKICAgIC0gRmlsZSBkb2Vzbid0IG5lZWQgdG8gaGF2ZSBhbnl0aGluZyB0byBkbyB3aXRoIFIsIGVpdGhlci4KLSBTdGFnaW5nIGFuZCBjb21taXR0aW5nOgogICAgMS4gQ29uY2VwdAogICAgMi4gTW9kaWZ5IHlvdXIgUm1kIGV4cGxvcmF0aW9uIGZyb20gZWFybGllciAoanVzdCBhZGQgYSBuZXcgbGluZSkuCiAgICAzLiBTdGFnZSBhbmQgY29tbWl0Ci0gUHVzaC9QdWxsOgogICAgMS4gQ29uY2VwdAogICAgMi4gVHJ5IHB1c2hpbmchCgojIyBBZG9wdGluZyBnaXQgaW4geW91ciB3b3JrZmxvdwoKX19CZWZvcmUgdGhlIHdvcmxkIG9mIGdpdDpfXwoKX1NhdmVfIHBlcnBldHVhbGx5LgoKX19BZnRlciBlbWJyYWNpbmcgZ2l0Ol9fCgpfU2F2ZV8gcGVycGV0dWFsbHksIF9jb21taXRfIG9mdGVuLCBfcHVzaF8gW2luIGNhc2Ugb2YgZmlyZV0oaHR0cHM6Ly9naXRodWIuY29tL2xvdWltL2luLWNhc2Utb2YtZmlyZS9ibG9iL21hc3Rlci9pbl9jYXNlX29mX2ZpcmUucGRmKS4KCl9fTmVlZCBoZWxwP19fCgpJZiB5b3UncmUgZW5jb3VudGVyaW5nIHByb2JsZW1zLCB0cnk6CgotIEFzIGFsd2F5cywgZ29vZ2xlIHNlYXJjaC4gCi0gW0J1cm4gaXQgYWxsIGRvd25dKGh0dHA6Ly9oYXBweWdpdHdpdGhyLmNvbS9idXJuLmh0bWwpLgogICAgLSBUaGVyZSdzIGV2ZW4gYW4gW3hrY2QgY29taWNdKGh0dHBzOi8veGtjZC5jb20vMTU5Ny8pIG9uIHRoaXMuCgpUaGUgZ2l0IGRvY3VtZW50YXRpb24gaXMgbm90IGZyaWVuZGx5LiBUaGVyZSdzIGV2ZW4gYSBbcGFyb2R5XShodHRwczovL2dpdC1tYW4tcGFnZS1nZW5lcmF0b3IubG9rYWx0b2cubmV0Lykgb24gaXQuCgojIENvbGxhYm9yYXRpb24gd2l0aCBHaXRIdWIKCiMjIExlYXJuaW5nIE9iamVjdGl2ZXM6IENvbGxhYm9yYXRpb24gd2l0aCBHaXRIdWIKClRoZSBwcmltYXJ5IGZvY3VzIGhlcmUgaXMgbGVhcm5pbmcgYWJvdXQgX19sZXZlcmFnaW5nIEdpdEh1YidzIHZlcnNpb24gY29udHJvbCBmb3IgY29sbGFib3JhdGlvbl9fLiBUaGUgY29uY2VwdHMgYXJlOgoKLSBHaXRIdWIgUGFnZXMKLSBGb3JraW5nCi0gUHVsbCBSZXF1ZXN0CgpTcGVjaWZpY2FsbHksIGJ5IHRoZSBlbmQgb2YgdG9kYXkncyBjbGFzcywgc3R1ZGVudHMgYXJlIGV4cGVjdGVkIHRvOgoKLSBCZSBhYmxlIHRvIG1ha2UgYSBiYXNpYyB3ZWJzaXRlIG91dCBvZiB5b3VyIHBhcnRpY2lwYXRpb24gcmVwb3NpdG9yeSB1c2luZyBHaXRIdWIgUGFnZXMKLSBLbm93IHJvdWdobHkgd2hhdCB0aGUgYWJvdmUgY29uY2VwdHMgYXJlIGFib3V0CgojIyBSZXNvdXJjZXMKClRoZSBHaXRIdWIgZG9jdW1lbnRhdGlvbiBpcyBwZXJoYXBzIHRoZSBiZXN0IHBsYWNlIHRvIGxlYXJuIGFib3V0IHRoZXNlIG91dHNpZGUgb2YgY2xhc3M6CgotIFtHaXRIdWIgUGFnZXNdKGh0dHBzOi8vcGFnZXMuZ2l0aHViLmNvbS8pCi0gW0ZvcmtpbmddKGh0dHBzOi8vaGVscC5naXRodWIuY29tL2FydGljbGVzL2ZvcmstYS1yZXBvLykKICAgIC0gW2hhcHB5Z2l0d2l0aHI6IGZvcmtdKGh0dHA6Ly9oYXBweWdpdHdpdGhyLmNvbS9mb3JrLmh0bWwpIGlzIGFsc28gYSBnb29kIHJlc291cmNlLgotIFtQdWxsIFJlcXVlc3RdKGh0dHBzOi8vaGVscC5naXRodWIuY29tL2FydGljbGVzL2Fib3V0LXB1bGwtcmVxdWVzdHMvKQoKUFM6IFlvdSBtaWdodCB3YW50IHRvIHNpZ24gdXAgZm9yIGEgZnJlZSBbR2l0SHViIFN0dWRlbnQgRGV2ZWxvcGVyIFBhY2tdKGh0dHBzOi8vZWR1Y2F0aW9uLmdpdGh1Yi5jb20vcGFjaykuIEFtb25nc3Qgb3RoZXIgcGVya3MsIHlvdSBnZXQgdG8gbWFrZSBwcml2YXRlIHJlcG9zaXRvcmllcyBmb3IgZnJlZSEKCiMjIERlbW9uc3RyYXRpb24KCkZvciBwYXJ0aWNpcGF0aW9uIG1hcmtzLCBieSB0aGUgZW5kIG9mIHRoaXMgZGVtb25zdHJhdGlvbjogCgotIHlvdSdsbCBoYXZlIGEgR2l0SHViIHBhZ2VzIHdlYnNpdGUgc2V0IHVwIGZvciB5b3VyIHBhcnRpY2lwYXRpb24gcmVwbwotIHlvdSBfX2Rvbid0IG5lZWQgdG8gaGF2ZV9fIGFueXRoaW5nIGZvciB0aGUgZm9ya2luZyBleGVyY2lzZSEKCkNoZWNrbGlzdDoKCjEuIFNldCB1cCBhIGJhc2ljICJHaXRIdWIgcGFnZXMiIHdlYnNpdGUgd2l0aCB5b3VyIHBhcnRpY2lwYXRpb24gcmVwbzoKICAgIDEuIEdvIHRvICJzZXR0aW5ncyIgb24geW91ciByZXBvLgogICAgMi4gU2Nyb2xsIGRvd24gdG8gIkdpdEh1YiBQYWdlcyIKICAgIDMuIFVuZGVyICJTb3VyY2UiLCBjbGljayB0aGUgIk5vbmUiIGRyb3AtZG93biBidXR0b24sIGFuZCBzZWxlY3QgdGhlIGJyYW5jaCB5b3Ugd2FudCB0byB0dXJuIGludG8gYSB3ZWJzaXRlLgoyLiBGb3JraW5nIGEgcmVwbzogCiAgICAxLiBMZXQncyB0cnkgZm9ya2luZyB0aGUgYENsYXNzcm9vbWAgcmVwby4KICAgIDIuIFdlJ2xsIG1ha2UgYSBjaGFuZ2UsIGFuZCB3aWxsIHN1Ym1pdCBhIHB1bGwgcmVxdWVzdC4KCiMgSWYgdGhlcmUncyB0aW1lIHJlbWFpbmluZwoKLSBDb25jZXB0cyByZWxhdGVkIHRvIFtnZXR0aW5nIGhlbHBdKGh0dHA6Ly9zdGF0NTQ1LmNvbS9oZWxwLWdlbmVyYWwuaHRtbCkgaW4gUiAob3Igd2l0aCBvdGhlciBjb21wdXRhdGlvbmFsIHByb2JsZW1zKToKICAgIC0gR29vZ2xlIHRoZSBlcnJvciBtZXNzYWdlICh3b3JrcyBtb3N0IG9mIHRoZSB0aW1lKQogICAgLSBXcml0ZSBhIHF1ZXN0aW9uIHVzaW5nIGEgTVdFLiBZb3UnbGwgc29sdmUgaXQgeW91cnNlbGYgbW9zdCBvZiB0aGUgdGltZS4KICAgIC0gUG9zdCBxdWVzdGlvbiB0byB0aHJlYWQgc3VjaCBhcyBTTy4KLSAiTGFiIgo=