1 What is GitHub?

GitHub is a git repository hosting service and web-based, collaborative version-control platform for developers. While GitHub offers a suite of features, in this course we will primarily use GitHub for cloud-based hosting of our coding projects. For this exercise, we will learn how to:

  • Create a Github account
  • Create a blank repository
  • Integrate with RStudio
  • Create and commit changes through the RStudio Git tab
  • View Changes on GitHub
  • Create a project webpage in GitHub

GitHub is generally used for version control, working on collaborative projects, creating websites, developing and sharing teaching tools, software development, and code development, but is generally not good for storing or manipulating large datasets.

1.1 Create GitHub Account

To begin, you will need to create an account on GitHub.com. This will allow you to create, fork, share, collaborate, etc. on projects.

github signup

1.2 Create Repository

Once you have created an account you can navigate to repositories and click on the green button for a new repository.

repository bar

Create a name for the repository, for this example we will use GitHub-Basics, provide a description, be sure to make the repository public, uncheck the “Initialize this repository with a README” (for this example; it might be necessary to leave this checked in the future), add a .gitignore file using the R filter in the drop-down menu, and click create repository.

2 Integration with RStudio

Rstudio has integrated version control and allows you to clone a project from any Git repository. For this example we will use the link obtained in the above step to integrate local changes with the GitHub repository we created.

While the following steps will use the GUI interface in RStudio, the majority of these steps can also be completed at the command line.

2.1 New Project

To begin we will create a new project using the File > New Project command. In previous examples the New Directory option was used, but in this exercise we will instead use the Version Control option.

RStudio Version Control

2.1.1 Version Control

This option will provide us the ability to choose between Git and Apache Subversion. We will follow the option for using Git as we learned in the previous exercise.

Version Control

2.1.2 Git for Versioning in RStudio

The version control option will allow you to obtain a project from a version control repository such as GitHub.

If you want to bring an already developed repository into RStudio in a blank project, from the terminal you can use the git command git clone <GitHub Link> in the folder you wish to store the repository and then save as a new project.

2.1.3 Create Project

Before you finalize your project, you will be prompted to including the following information:

Clone Repository

  • Repository URL
    • Here you will paste the link you copied from GitHub: http://github.com/username/repository
  • Project Directory Name
    • This is the folder that will be created to organize the project.
      • Tip: Making this the same as the repository name will help keep you organized between the local and online environment
  • Subdirectory
    • This is the local root directory where the project folder will reside. For example, if you want the project folder to be housed within the Ex-8 folder on the Z drive you would browse to: z:/students/name/Ex-8 and then click create project.

2.2 View Project in RStudio

This will open the typical RStudio Project window you are used to seeing including the project information in the upper-right corner, project files in the files tile, etc. but you will also now see a new Git tab alongside the “Environment-History-Connections” section. It is in this tab that we will control the integration for our local project and online repository.

Project Window

2.2.1 Git Tab

In the Git tab you will notice several options including:

  • Diff which details the difference between versions of a file.
  • Commit which allows us to initial a commit similar to the git commit command in the previous exercise.
  • Blue down arrow for a pull command
  • Green up arrow for a push command
  • Clock to view a history of the commits
  • Gear that allows you to revert to previous stages
  • New branch icon
  • Branch information showing which branch is currently being edited
  • Refresh icon

2.2.1.1 Staged Files

There are two ways to stage files in RStudio. The first is directly from the Git tab. By click on the button in the “Staged” column, you will see the icon in the “Status” column change. The second is by clicking the “commit button” and staging the files from there. Because of the simple interface, files can easily be staged/unstaged from either location.

You could also complete many of these steps via command line from the terminal window.

2.2.1.2 Color-coded Icons

In RStudio as you stage files their icon will change to match their current status. You are most likely to see the following information:

  • Yellow box for newly created/untracked files
  • Blue box for files that have been modified
  • Green box for files that have been added/staged and are ready for a commit
  • Red box for files that have been deleted

Once you have the files appropriately staged, you are ready to commit them to your repository.

2.2.2 Commit and Push to GitHub

In the commit window you can stage files, view differences in the changed files, add a commit message, and push your changes to the remote repository.

It is important to always include a commit message each time you commit files to your repository. As we have seen in the previous exercise, this helps to keep track of each stage of development and informs collaborators of changes made in each update. Because RStudio provides a text box for commits, there is ample room for an appropriate commit message. Check out these suggestions about composing better commit messages: https://chris.beams.io/posts/git-commit/

After staging your files and writing a useful commit message your next step will be to commit that information. Remember even though you have your local and GitHub repositories linked, you are only making this commit to the local repository. In order to sync the two repositories you must Push the changes to GitHub.

2.3 View Changes on GitHub

Once you have completed these steps you can navigate back to your GitHub repository and view the information you have just pushed to the repository.

Updated GitHub Page

2.4 Create a GitHub.io webpage

One excellent feature of GitHub is the ability to create webpages out of content within your repository. This is an extremely easy process and at this point each of the exercises you have completed in the course can be turned into a webpage with very little effort. In the setting menu of your repository, scroll down to the section for GitHub Pages and in the “Source” portion, select master branch as the source.

github settings

This will enable a webpage for your repository that utilizes a consistent url theme:

http://username.github.io/repository name

In order to create a webpage using GitHub Pages, simply create a copy of your *.nb.html and call it index.html. Once the index.html file is created, push it to your master repository and the website will automatically be created.

It may take several minutes before the site appears on your github.io page for the first time.

3 Your Turn!

While there are a number of features an options available in GitHub, here we covered only the basics of creating and maintaining a repository and enabling GitHub Pages. At the end of the semester your final project will be to develop materials based on your thesis research. So for this exercise I want you to create a repository and GitHub webpage for your thesis work. You should create a README.md file for your project that includes:

  • Project Title
  • Project Abstract
  • Link to the Github.io page
  • Repository Description
  • References

This repository and webpage should be periodically updated throughout the remainder of the semester culminating in your final project. You should take a look at the various options and features (such as themes, notifications, social previews, wikis, projects, etc.) available in GitHub Octocat to create a useful repository for sharing and maintaining your project.

3.1 Additional Help

Colt Steele again came through with a new video after presenting this exercise in class. This GitHub tutorial, called Learn Github in 20 Minutes, walks you through many of the steps we discussed in class and covers topics that are slightly more advanced that you might need in the future.

LS0tDQp0aXRsZTogR2l0SHViIEJhc2ljcyA8YnI+PHNtYWxsPkFkdmFuY2VkIERhdGEgQW5hbHl0aWNzPC9zbWFsbD48L2JyPg0KYXV0aG9yOiBCSU9MIDU3MDAsIEZhbGwgMjAxOQ0Kb3V0cHV0Og0KICBodG1sX25vdGVib29rOg0KICAgIGRmX3ByaW50OiBwYWdlZA0KICAgIHJvd3MucHJpbnQ6IDEwDQogICAgdGhlbWU6IGNvc21vDQogICAgaGlnaGxpZ2h0OiBicmVlemVkYXJrDQogICAgbnVtYmVyX3NlY3Rpb25zOiB5ZXMNCiAgICB0b2M6IHRydWUNCiAgICB0b2NfZmxvYXQ6DQogICAgICBjb2xsYXBzZWQ6IGZhbHNlDQogICAgICBzbW9vdGhfc2Nyb2xsOiB0cnVlDQogIHBkZl9kb2N1bWVudDogZGVmYXVsdA0KZWRpdG9yX29wdGlvbnM6IA0KICBjaHVua19vdXRwdXRfdHlwZTogaW5saW5lDQotLS0NCjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+DQoNCmgxLnRpdGxlIHsNCiAgZm9udC1zaXplOiA0MHB4Ow0KICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsNCiAgY29sb3I6IERhcmtCbHVlOw0KICB0ZXh0LWFsaWduOiBjZW50ZXI7DQp9DQpoNC5hdXRob3IgeyAvKiBIZWFkZXIgNCAtIGFuZCB0aGUgYXV0aG9yIGFuZCBkYXRhIGhlYWRlcnMgdXNlIHRoaXMgdG9vICAqLw0KICBmb250LXNpemU6IDIwcHg7DQogIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOw0KICBjb2xvcjogRGFya0JsdWU7DQogIHRleHQtYWxpZ246IGNlbnRlcjsNCn0NCjwvc3R5bGU+DQoNCiMgV2hhdCBpcyBHaXRIdWI/DQoqKkdpdEh1YioqIGlzIGEgZ2l0IHJlcG9zaXRvcnkgaG9zdGluZyBzZXJ2aWNlIGFuZCB3ZWItYmFzZWQsIGNvbGxhYm9yYXRpdmUgdmVyc2lvbi1jb250cm9sIHBsYXRmb3JtIGZvciBkZXZlbG9wZXJzLiBXaGlsZSAqKkdpdEh1YioqIG9mZmVycyBhIHN1aXRlIG9mIGZlYXR1cmVzLCBpbiB0aGlzIGNvdXJzZSB3ZSB3aWxsIHByaW1hcmlseSB1c2UgKipHaXRIdWIqKiBmb3IgY2xvdWQtYmFzZWQgaG9zdGluZyBvZiBvdXIgY29kaW5nIHByb2plY3RzLiBGb3IgdGhpcyBleGVyY2lzZSwgd2Ugd2lsbCBsZWFybiBob3cgdG86DQoNCi0gQ3JlYXRlIGEgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2pvaW4iIHRhcmdldD0iX2JsYW5rIj4gR2l0aHViPC9hPiBhY2NvdW50DQotIENyZWF0ZSBhIGJsYW5rIHJlcG9zaXRvcnkNCi0gSW50ZWdyYXRlIHdpdGggUlN0dWRpbw0KLSBDcmVhdGUgYW5kIGNvbW1pdCBjaGFuZ2VzIHRocm91Z2ggdGhlIFJTdHVkaW8gR2l0IHRhYg0KLSBWaWV3IENoYW5nZXMgb24gR2l0SHViDQotIENyZWF0ZSBhIHByb2plY3Qgd2VicGFnZSBpbiBHaXRIdWINCg0KPHA+R2l0SHViIGlzIGdlbmVyYWxseSB1c2VkIGZvciB2ZXJzaW9uIGNvbnRyb2wsIHdvcmtpbmcgb24gY29sbGFib3JhdGl2ZSBwcm9qZWN0cywgY3JlYXRpbmcgd2Vic2l0ZXMsIGRldmVsb3BpbmcgYW5kIHNoYXJpbmcgdGVhY2hpbmcgdG9vbHMsIHNvZnR3YXJlIGRldmVsb3BtZW50LCBhbmQgY29kZSBkZXZlbG9wbWVudCwgYnV0IGlzIGdlbmVyYWxseSBub3QgZ29vZCBmb3Igc3RvcmluZyBvciBtYW5pcHVsYXRpbmcgbGFyZ2UgZGF0YXNldHMuPC9wPg0KDQojIyBDcmVhdGUgR2l0SHViIEFjY291bnQNClRvIGJlZ2luLCB5b3Ugd2lsbCBuZWVkIHRvIGNyZWF0ZSBhbiBhY2NvdW50IG9uIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9qb2luIiB0YXJnZXQ9Il9ibGFuayI+IEdpdEh1Yi5jb208L2E+LiBUaGlzIHdpbGwgYWxsb3cgeW91IHRvIGNyZWF0ZSwgZm9yaywgc2hhcmUsIGNvbGxhYm9yYXRlLCBldGMuIG9uIHByb2plY3RzLg0KDQo8cCBhbGlnbj0iY2VudGVyIj4NCg0KIVtnaXRodWIgc2lnbnVwXSguL0ltYWdlcy9HaXRIdWItU2lnblVwLlBORyAiR2l0SHViIFNpZ24tVXAgV2luZG93IikNCjwvcD4NCg0KIyMgQ3JlYXRlIFJlcG9zaXRvcnkNCk9uY2UgeW91IGhhdmUgY3JlYXRlZCBhbiBhY2NvdW50IHlvdSBjYW4gbmF2aWdhdGUgdG8gcmVwb3NpdG9yaWVzIGFuZCBjbGljayBvbiB0aGUgZ3JlZW4gYnV0dG9uIGZvciBhIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9uZXciIHRhcmdldD0iX2JsYW5rIj4gbmV3IHJlcG9zaXRvcnk8L2E+Lg0KDQo8cCBhbGlnbj0iY2VudGVyIj4NCg0KIVtyZXBvc2l0b3J5IGJhcl0oLi9JbWFnZXMvcmVwby1iYXIuUE5HICJHaXRIdWIgUmVwb3NpdG9yeSBCYXIiKQ0KPC9wPg0KDQpDcmVhdGUgYSBuYW1lIGZvciB0aGUgcmVwb3NpdG9yeSwgZm9yIHRoaXMgZXhhbXBsZSB3ZSB3aWxsIHVzZSAqR2l0SHViLUJhc2ljcyosIHByb3ZpZGUgYSBkZXNjcmlwdGlvbiwgYmUgc3VyZSB0byBtYWtlIHRoZSByZXBvc2l0b3J5IHB1YmxpYywgdW5jaGVjayB0aGUgIkluaXRpYWxpemUgdGhpcyByZXBvc2l0b3J5IHdpdGggYSBSRUFETUUiIChmb3IgdGhpcyBleGFtcGxlOyBpdCBtaWdodCBiZSBuZWNlc3NhcnkgdG8gbGVhdmUgdGhpcyBjaGVja2VkIGluIHRoZSBmdXR1cmUpLCBhZGQgYSAqLmdpdGlnbm9yZSogZmlsZSB1c2luZyB0aGUgKipSKiogZmlsdGVyIGluIHRoZSBkcm9wLWRvd24gbWVudSwgYW5kIGNsaWNrICpjcmVhdGUgcmVwb3NpdG9yeSouDQoNCiMjIyBDb3B5IFJlcG9zaXRvcnkgTGluaw0KT25jZSB5b3UgY3JlYXRlIHlvdXIgbmV3IHJlcG9zaXRvcnkgeW91IHNob3VsZCBiZSB0YWtlbiB0byB0aGUgaG9tZSBwYWdlIGZvciB0aGUgcmVwby4gDQoNCjxwIGFsaWduPSJjZW50ZXIiPg0KDQohW0NvcHkgTGluayBhbmQgQ2xvbmUgT3B0aW9uXSguL0ltYWdlcy9jb3B5LWxpbmsuUE5HICJDbG9uZSBhbmQgRG93bmxvYWQgTGluayIpDQo8L3A+DQoNClRoaXMgbGluayB3aWxsIGJlIHVzZWQgaW4gKipSU3R1ZGlvKiogdG8gY29ubmVjdCB5b3VyIHByb2plY3QgdG8gdGhlICpHaXRIdWIqIHJlcG9zaXRvcnkuIEF0IHRoaXMgcG9pbnQgeW91IGNhbiBtb3ZlIHRvICoqUlN0dWRpbyoqIGJ1dCBrZWVwIHRoZSAqKkdpdEh1YioqIHdpbmRvdyBvcGVuIHNvIHlvdSBjYW4gcmVmZXIgYmFjayB0byBzZWUgY2hhbmdlcyB5b3UgaGF2ZSBtYWRlIGR1cmluZyB0aGlzIGV4YW1wbGUuIA0KDQojIEludGVncmF0aW9uIHdpdGggUlN0dWRpbw0KDQoqKlJzdHVkaW8qKiBoYXMgaW50ZWdyYXRlZCB2ZXJzaW9uIGNvbnRyb2wgYW5kIGFsbG93cyB5b3UgdG8gY2xvbmUgYSBwcm9qZWN0IGZyb20gYW55ICpHaXQqIHJlcG9zaXRvcnkuIEZvciB0aGlzIGV4YW1wbGUgd2Ugd2lsbCB1c2UgdGhlIGxpbmsgb2J0YWluZWQgaW4gdGhlIGFib3ZlIHN0ZXAgdG8gaW50ZWdyYXRlIGxvY2FsIGNoYW5nZXMgd2l0aCB0aGUgKipHaXRIdWIqKiByZXBvc2l0b3J5IHdlIGNyZWF0ZWQuIA0KDQo+IFdoaWxlIHRoZSBmb2xsb3dpbmcgc3RlcHMgd2lsbCB1c2UgdGhlIEdVSSBpbnRlcmZhY2UgaW4gKipSU3R1ZGlvKiosIHRoZSBtYWpvcml0eSBvZiB0aGVzZSBzdGVwcyBjYW4gYWxzbyBiZSBjb21wbGV0ZWQgYXQgdGhlIGNvbW1hbmQgbGluZS4NCg0KIyMgTmV3IFByb2plY3QNClRvIGJlZ2luIHdlIHdpbGwgY3JlYXRlIGEgbmV3IHByb2plY3QgdXNpbmcgdGhlICpGaWxlID4gTmV3IFByb2plY3QqIGNvbW1hbmQuIEluIHByZXZpb3VzIGV4YW1wbGVzIHRoZSAqTmV3IERpcmVjdG9yeSogb3B0aW9uIHdhcyB1c2VkLCBidXQgaW4gdGhpcyBleGVyY2lzZSB3ZSB3aWxsIGluc3RlYWQgdXNlIHRoZSAqVmVyc2lvbiBDb250cm9sKiBvcHRpb24uIA0KDQo8cCBhbGlnbj0iY2VudGVyIj4NCg0KIVtSU3R1ZGlvIFZlcnNpb24gQ29udHJvbF0oLi9JbWFnZXMvUlMtTmV3LVByb2plY3QucG5nICJOZXcgUHJvamVjdCBXaW5kb3ciKXt3aWR0aD00NSV9DQo8L3A+DQoNCiMjIyBWZXJzaW9uIENvbnRyb2wNClRoaXMgb3B0aW9uIHdpbGwgcHJvdmlkZSB1cyB0aGUgYWJpbGl0eSB0byBjaG9vc2UgYmV0d2VlbiAqKkdpdCoqIGFuZCAqQXBhY2hlIFN1YnZlcnNpb24qLiBXZSB3aWxsIGZvbGxvdyB0aGUgb3B0aW9uIGZvciB1c2luZyAqKkdpdCoqIGFzIHdlIGxlYXJuZWQgaW4gdGhlIHByZXZpb3VzIGV4ZXJjaXNlLg0KDQo8cCBhbGlnbj0iY2VudGVyIj4NCg0KIVtWZXJzaW9uIENvbnRyb2xdKC4vSW1hZ2VzL1JTLVZlcnNpb24tQ29udHJvbC5wbmcgIlZlcnNpb24gQ29udHJvbCBXaW5kb3ciKXt3aWR0aD00NSV9DQo8L3A+DQoNCiMjIyBHaXQgZm9yIFZlcnNpb25pbmcgaW4gUlN0dWRpbw0KVGhlICp2ZXJzaW9uIGNvbnRyb2wqIG9wdGlvbiB3aWxsIGFsbG93IHlvdSB0byBvYnRhaW4gYSBwcm9qZWN0IGZyb20gYSB2ZXJzaW9uIGNvbnRyb2wgcmVwb3NpdG9yeSBzdWNoIGFzICoqR2l0SHViKiouDQoNCj4gSWYgeW91IHdhbnQgdG8gYnJpbmcgYW4gYWxyZWFkeSBkZXZlbG9wZWQgcmVwb3NpdG9yeSBpbnRvICoqUlN0dWRpbyoqIGluIGEgYmxhbmsgcHJvamVjdCwgZnJvbSB0aGUgdGVybWluYWwgeW91IGNhbiB1c2UgdGhlIGdpdCBjb21tYW5kIGBgYGdpdCBjbG9uZSA8R2l0SHViIExpbms+YGBgIGluIHRoZSBmb2xkZXIgeW91IHdpc2ggdG8gc3RvcmUgdGhlIHJlcG9zaXRvcnkgYW5kIHRoZW4gc2F2ZSBhcyBhIG5ldyBwcm9qZWN0Lg0KDQojIyMgQ3JlYXRlIFByb2plY3QNCkJlZm9yZSB5b3UgZmluYWxpemUgeW91ciBwcm9qZWN0LCB5b3Ugd2lsbCBiZSBwcm9tcHRlZCB0byBpbmNsdWRpbmcgdGhlIGZvbGxvd2luZyBpbmZvcm1hdGlvbjoNCg0KPHAgYWxpZ249ImNlbnRlciI+DQoNCiFbQ2xvbmUgUmVwb3NpdG9yeV0oLi9JbWFnZXMvUlMtQ2xvbmUtUmVwby5wbmcgIkNsb25lIFJlcG9zaXRvcnkgV2luZG93Iil7d2lkdGg9NDUlfQ0KPC9wPg0KDQotIFJlcG9zaXRvcnkgVVJMDQogIC0gSGVyZSB5b3Ugd2lsbCBwYXN0ZSB0aGUgbGluayB5b3UgY29waWVkIGZyb20gKipHaXRIdWIqKjogYGBgaHR0cDovL2dpdGh1Yi5jb20vdXNlcm5hbWUvcmVwb3NpdG9yeWBgYA0KLSBQcm9qZWN0IERpcmVjdG9yeSBOYW1lDQogIC0gVGhpcyBpcyB0aGUgZm9sZGVyIHRoYXQgd2lsbCBiZSBjcmVhdGVkIHRvIG9yZ2FuaXplIHRoZSBwcm9qZWN0Lg0KICAgIC0gVGlwOiBNYWtpbmcgdGhpcyB0aGUgc2FtZSBhcyB0aGUgcmVwb3NpdG9yeSBuYW1lIHdpbGwgaGVscCBrZWVwIHlvdSBvcmdhbml6ZWQgYmV0d2VlbiB0aGUgbG9jYWwgYW5kIG9ubGluZSBlbnZpcm9ubWVudA0KLSBTdWJkaXJlY3RvcnkNCiAgLSBUaGlzIGlzIHRoZSBsb2NhbCByb290IGRpcmVjdG9yeSB3aGVyZSB0aGUgcHJvamVjdCBmb2xkZXIgd2lsbCByZXNpZGUuIEZvciBleGFtcGxlLCBpZiB5b3Ugd2FudCB0aGUgcHJvamVjdCBmb2xkZXIgdG8gYmUgaG91c2VkIHdpdGhpbiB0aGUgKkV4LTgqIGZvbGRlciBvbiB0aGUgWiBkcml2ZSB5b3Ugd291bGQgYnJvd3NlIHRvOiB6Oi9zdHVkZW50cy9uYW1lL0V4LTggYW5kIHRoZW4gY2xpY2sgKmNyZWF0ZSBwcm9qZWN0Ki4NCg0KIyMgVmlldyBQcm9qZWN0IGluIFJTdHVkaW8NClRoaXMgd2lsbCBvcGVuIHRoZSB0eXBpY2FsIFJTdHVkaW8gUHJvamVjdCB3aW5kb3cgeW91IGFyZSB1c2VkIHRvIHNlZWluZyBpbmNsdWRpbmcgdGhlIHByb2plY3QgaW5mb3JtYXRpb24gaW4gdGhlIHVwcGVyLXJpZ2h0IGNvcm5lciwgcHJvamVjdCBmaWxlcyBpbiB0aGUgZmlsZXMgdGlsZSwgZXRjLiBidXQgeW91IHdpbGwgYWxzbyBub3cgc2VlIGEgbmV3ICoqR2l0KiogdGFiIGFsb25nc2lkZSB0aGUgIkVudmlyb25tZW50LUhpc3RvcnktQ29ubmVjdGlvbnMiIHNlY3Rpb24uIEl0IGlzIGluIHRoaXMgdGFiIHRoYXQgd2Ugd2lsbCBjb250cm9sIHRoZSBpbnRlZ3JhdGlvbiBmb3Igb3VyIGxvY2FsIHByb2plY3QgYW5kIG9ubGluZSByZXBvc2l0b3J5Lg0KDQo8cCBhbGlnbj0iY2VudGVyIj4NCg0KIVtQcm9qZWN0IFdpbmRvd10oLi9JbWFnZXMvUlMtUHJvamVjdC1XaW5kb3cucG5nICJQcm9qZWN0IFdpbmRvdyIpDQo8L3A+DQoNCiMjIyBHaXQgVGFiDQpJbiB0aGUgKkdpdCogdGFiIHlvdSB3aWxsIG5vdGljZSBzZXZlcmFsIG9wdGlvbnMgaW5jbHVkaW5nOg0KDQotIERpZmYgPGltZyBzcmM9Ii4vSW1hZ2VzL2RpZmZfYnV0dG9uLnBuZyIgdGl0bGU9IkRpZmYgU2VsZWN0ZWQgRmlsZShzKSIvPiB3aGljaCBkZXRhaWxzIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdmVyc2lvbnMgb2YgYSBmaWxlLiANCi0gQ29tbWl0IDxpbWcgc3JjPSIuL0ltYWdlcy9jb21taXRfYnV0dG9uLnBuZyIgdGl0bGU9IkNvbW1pdCBwZW5kaW5nIGNoYW5nZXMiLz4gd2hpY2ggYWxsb3dzIHVzIHRvIGluaXRpYWwgYSBjb21taXQgc2ltaWxhciB0byB0aGUgYGBgZ2l0IGNvbW1pdGBgYCBjb21tYW5kIGluIHRoZSBwcmV2aW91cyBleGVyY2lzZS4NCi0gQmx1ZSBkb3duIGFycm93IDxpbWcgc3JjPSIuL0ltYWdlcy9wdWxsX2J1dHRvbi5wbmciLz4gZm9yIGEgcHVsbCBjb21tYW5kDQotIEdyZWVuIHVwIGFycm93IDxpbWcgc3JjPSIuL0ltYWdlcy9wdXNoX2J1dHRvbi5wbmciLz4gZm9yIGEgcHVzaCBjb21tYW5kDQotIENsb2NrIDxpbWcgc3JjPSJodHRwczovL2dpdGh1Yi5naXRodWJhc3NldHMuY29tL2ltYWdlcy9pY29ucy9lbW9qaS91bmljb2RlLzFmNTUyLnBuZyIgdGl0bGU9IlZpZXcgaGlzdG9yeSBvZiBwcmV2aW91cyBjb21taXRzIiB3aWR0aD0xNSBoZWlnaHQ9MTUvPiB0byB2aWV3IGEgaGlzdG9yeSBvZiB0aGUgY29tbWl0cw0KLSBHZWFyIDxpbWcgc3JjPSJodHRwczovL2dpdGh1Yi5naXRodWJhc3NldHMuY29tL2ltYWdlcy9pY29ucy9lbW9qaS91bmljb2RlLzI2OTkucG5nIiB3aWR0aD0xNSBoZWlnaHQ9MTUvPiB0aGF0IGFsbG93cyB5b3UgdG8gcmV2ZXJ0IHRvIHByZXZpb3VzIHN0YWdlcw0KLSBOZXcgYnJhbmNoIGljb24gPGltZyBzcmM9Ii4vSW1hZ2VzL25ld19icmFuY2gucG5nIi8+DQotIEJyYW5jaCBpbmZvcm1hdGlvbiA8aW1nIHNyYz0iLi9JbWFnZXMvYnJhbmNoX3NlbGVjdC5wbmciIHRpdGxlPSJzd2l0Y2ggYnJhbmNoIi8+IHNob3dpbmcgd2hpY2ggYnJhbmNoIGlzIGN1cnJlbnRseSBiZWluZyBlZGl0ZWQNCi0gUmVmcmVzaCBpY29uIDxpbWcgc3JjPSIuL0ltYWdlcy9yZWZyZXNoX2J1dHRvbi5wbmciLz4NCg0KIyMjIyBTdGFnZWQgRmlsZXMNClRoZXJlIGFyZSB0d28gd2F5cyB0byBzdGFnZSBmaWxlcyBpbiAqKlJTdHVkaW8qKi4gVGhlIGZpcnN0IGlzIGRpcmVjdGx5IGZyb20gdGhlICpHaXQqIHRhYi4gQnkgY2xpY2sgb24gdGhlIGJ1dHRvbiBpbiB0aGUgIlN0YWdlZCIgY29sdW1uLCB5b3Ugd2lsbCBzZWUgdGhlIGljb24gaW4gdGhlICJTdGF0dXMiIGNvbHVtbiBjaGFuZ2UuIFRoZSBzZWNvbmQgaXMgYnkgY2xpY2tpbmcgdGhlICJjb21taXQgYnV0dG9uIiBhbmQgc3RhZ2luZyB0aGUgZmlsZXMgZnJvbSB0aGVyZS4gQmVjYXVzZSBvZiB0aGUgc2ltcGxlIGludGVyZmFjZSwgZmlsZXMgY2FuIGVhc2lseSBiZSBzdGFnZWQvdW5zdGFnZWQgZnJvbSBlaXRoZXIgbG9jYXRpb24uDQoNCj4gWW91IGNvdWxkIGFsc28gY29tcGxldGUgbWFueSBvZiB0aGVzZSBzdGVwcyB2aWEgY29tbWFuZCBsaW5lIGZyb20gdGhlIHRlcm1pbmFsIHdpbmRvdy4NCg0KIyMjIyBDb2xvci1jb2RlZCBJY29ucw0KSW4gKipSU3R1ZGlvKiogYXMgeW91IHN0YWdlIGZpbGVzIHRoZWlyIGljb24gd2lsbCBjaGFuZ2UgdG8gbWF0Y2ggdGhlaXIgY3VycmVudCBzdGF0dXMuIFlvdSBhcmUgbW9zdCBsaWtlbHkgdG8gc2VlIHRoZSBmb2xsb3dpbmcgaW5mb3JtYXRpb246DQoNCi0gWWVsbG93IGJveCA8aW1nIHNyYz0iLi9JbWFnZXMvbmV3LnBuZyIgd2lkdGg9MTUgaGVpZ2h0PTE1Lz4gZm9yIG5ld2x5IGNyZWF0ZWQvdW50cmFja2VkIGZpbGVzDQotIEJsdWUgYm94ICA8aW1nIHNyYz0iLi9JbWFnZXMvbW9kaWZpZWQucG5nIiB3aWR0aD0xNSBoZWlnaHQ9MTUvPiBmb3IgZmlsZXMgdGhhdCBoYXZlIGJlZW4gbW9kaWZpZWQNCi0gR3JlZW4gYm94IDxpbWcgc3JjPSIuL0ltYWdlcy9hZGRlZC5wbmciIHdpZHRoPTE1IGhlaWdodD0xNS8+IGZvciBmaWxlcyB0aGF0IGhhdmUgYmVlbiBhZGRlZC9zdGFnZWQgYW5kIGFyZSByZWFkeSBmb3IgYSBjb21taXQNCi0gUmVkIGJveCA8aW1nIHNyYz0iLi9JbWFnZXMvZGVsZXRlZC5wbmciIHdpZHRoPTE1IGhlaWdodD0xNS8+IGZvciBmaWxlcyB0aGF0IGhhdmUgYmVlbiBkZWxldGVkDQoNCk9uY2UgeW91IGhhdmUgdGhlIGZpbGVzIGFwcHJvcHJpYXRlbHkgc3RhZ2VkLCB5b3UgYXJlIHJlYWR5IHRvIGNvbW1pdCB0aGVtIHRvIHlvdXIgcmVwb3NpdG9yeS4NCg0KIyMjIENvbW1pdCBhbmQgUHVzaCB0byBHaXRIdWINCkluIHRoZSBjb21taXQgd2luZG93IHlvdSBjYW4gc3RhZ2UgZmlsZXMsIHZpZXcgZGlmZmVyZW5jZXMgaW4gdGhlIGNoYW5nZWQgZmlsZXMsIGFkZCBhIGNvbW1pdCBtZXNzYWdlLCBhbmQgcHVzaCB5b3VyIGNoYW5nZXMgdG8gdGhlIHJlbW90ZSByZXBvc2l0b3J5Lg0KDQpJdCBpcyBpbXBvcnRhbnQgdG8gYWx3YXlzIGluY2x1ZGUgYSBjb21taXQgbWVzc2FnZSBlYWNoIHRpbWUgeW91IGNvbW1pdCBmaWxlcyB0byB5b3VyIHJlcG9zaXRvcnkuIEFzIHdlIGhhdmUgc2VlbiBpbiB0aGUgcHJldmlvdXMgZXhlcmNpc2UsIHRoaXMgaGVscHMgdG8ga2VlcCB0cmFjayBvZiBlYWNoIHN0YWdlIG9mIGRldmVsb3BtZW50IGFuZCBpbmZvcm1zIGNvbGxhYm9yYXRvcnMgb2YgY2hhbmdlcyBtYWRlIGluIGVhY2ggdXBkYXRlLiBCZWNhdXNlICoqUlN0dWRpbyoqIHByb3ZpZGVzIGEgdGV4dCBib3ggZm9yIGNvbW1pdHMsIHRoZXJlIGlzIGFtcGxlIHJvb20gZm9yIGFuIGFwcHJvcHJpYXRlIGNvbW1pdCBtZXNzYWdlLiBDaGVjayBvdXQgdGhlc2Ugc3VnZ2VzdGlvbnMgYWJvdXQgY29tcG9zaW5nIGJldHRlciBjb21taXQgbWVzc2FnZXM6IGh0dHBzOi8vY2hyaXMuYmVhbXMuaW8vcG9zdHMvZ2l0LWNvbW1pdC8NCg0KQWZ0ZXIgc3RhZ2luZyB5b3VyIGZpbGVzIGFuZCB3cml0aW5nIGEgdXNlZnVsIGNvbW1pdCBtZXNzYWdlIHlvdXIgbmV4dCBzdGVwIHdpbGwgYmUgdG8gY29tbWl0IHRoYXQgaW5mb3JtYXRpb24uIFJlbWVtYmVyIGV2ZW4gdGhvdWdoIHlvdSBoYXZlIHlvdXIgbG9jYWwgYW5kICoqR2l0SHViKiogcmVwb3NpdG9yaWVzIGxpbmtlZCwgeW91IGFyZSBvbmx5IG1ha2luZyB0aGlzIGNvbW1pdCB0byB0aGUgbG9jYWwgcmVwb3NpdG9yeS4gSW4gb3JkZXIgdG8gc3luYyB0aGUgdHdvIHJlcG9zaXRvcmllcyB5b3UgbXVzdCA8aW1nIHNyYz0iLi9JbWFnZXMvcHVzaF9idXR0b24ucG5nIi8+IFB1c2ggdGhlIGNoYW5nZXMgdG8gKipHaXRIdWIqKi4NCg0KIyMgVmlldyBDaGFuZ2VzIG9uIEdpdEh1Yg0KT25jZSB5b3UgaGF2ZSBjb21wbGV0ZWQgdGhlc2Ugc3RlcHMgeW91IGNhbiBuYXZpZ2F0ZSBiYWNrIHRvIHlvdXIgKipHaXRIdWIqKiByZXBvc2l0b3J5IGFuZCB2aWV3IHRoZSBpbmZvcm1hdGlvbiB5b3UgaGF2ZSBqdXN0IHB1c2hlZCB0byB0aGUgcmVwb3NpdG9yeS4NCg0KPHAgYWxpZ249ImNlbnRlciI+DQoNCiFbVXBkYXRlZCBHaXRIdWIgUGFnZV0oLi9JbWFnZXMvR2l0SHViLXVwZGF0ZXMucG5nICJWaWV3aW5nIFVwZGF0ZXMgb24gR2l0SHViIikNCjwvcD4NCg0KIyMgQ3JlYXRlIGEgR2l0SHViLmlvIHdlYnBhZ2UNCk9uZSBleGNlbGxlbnQgZmVhdHVyZSBvZiAqKkdpdEh1YioqIGlzIHRoZSBhYmlsaXR5IHRvIGNyZWF0ZSB3ZWJwYWdlcyBvdXQgb2YgY29udGVudCB3aXRoaW4geW91ciByZXBvc2l0b3J5LiBUaGlzIGlzIGFuIGV4dHJlbWVseSBlYXN5IHByb2Nlc3MgYW5kIGF0IHRoaXMgcG9pbnQgZWFjaCBvZiB0aGUgZXhlcmNpc2VzIHlvdSBoYXZlIGNvbXBsZXRlZCBpbiB0aGUgY291cnNlIGNhbiBiZSB0dXJuZWQgaW50byBhIHdlYnBhZ2Ugd2l0aCB2ZXJ5IGxpdHRsZSBlZmZvcnQuIEluIHRoZSBzZXR0aW5nIG1lbnUgb2YgeW91ciByZXBvc2l0b3J5LCBzY3JvbGwgZG93biB0byB0aGUgc2VjdGlvbiBmb3IgKkdpdEh1YiBQYWdlcyogYW5kIGluIHRoZSAiU291cmNlIiBwb3J0aW9uLCBzZWxlY3QgbWFzdGVyIGJyYW5jaCBhcyB0aGUgc291cmNlLiANCg0KPHAgYWxpZ249ImNlbnRlciI+DQoNCiFbZ2l0aHViIHNldHRpbmdzXSguL0ltYWdlcy9naXRodWItc2V0dGluZ3MtaW8ucG5nICJHaXRIdWIgU2V0dGluZ3MgZm9yIFBhZ2VzIil7d2lkdGg9NjUlfQ0KPC9wPg0KDQpUaGlzIHdpbGwgZW5hYmxlIGEgd2VicGFnZSBmb3IgeW91ciByZXBvc2l0b3J5IHRoYXQgdXRpbGl6ZXMgYSBjb25zaXN0ZW50IHVybCB0aGVtZTogDQoNCmh0dHA6Ly8qKnVzZXJuYW1lKiouZ2l0aHViLmlvLyoqcmVwb3NpdG9yeSBuYW1lKiogDQoNCkluIG9yZGVyIHRvIGNyZWF0ZSBhIHdlYnBhZ2UgdXNpbmcgKkdpdEh1YiBQYWdlcyosIHNpbXBseSBjcmVhdGUgYSBjb3B5IG9mIHlvdXIgIFwqLm5iLmh0bWwgYW5kIGNhbGwgaXQgKippbmRleC5odG1sKiouIE9uY2UgdGhlIGluZGV4Lmh0bWwgZmlsZSBpcyBjcmVhdGVkLCBwdXNoIGl0IHRvIHlvdXIgbWFzdGVyIHJlcG9zaXRvcnkgYW5kIHRoZSB3ZWJzaXRlIHdpbGwgYXV0b21hdGljYWxseSBiZSBjcmVhdGVkLg0KDQo+IEl0IG1heSB0YWtlIHNldmVyYWwgbWludXRlcyBiZWZvcmUgdGhlIHNpdGUgYXBwZWFycyBvbiB5b3VyICpnaXRodWIuaW8qIHBhZ2UgZm9yIHRoZSBmaXJzdCB0aW1lLiANCg0KIyBZb3VyIFR1cm4hIA0KDQpXaGlsZSB0aGVyZSBhcmUgYSBudW1iZXIgb2YgZmVhdHVyZXMgYW4gb3B0aW9ucyBhdmFpbGFibGUgaW4gKipHaXRIdWIqKiwgaGVyZSB3ZSBjb3ZlcmVkIG9ubHkgdGhlIGJhc2ljcyBvZiBjcmVhdGluZyBhbmQgbWFpbnRhaW5pbmcgYSByZXBvc2l0b3J5IGFuZCBlbmFibGluZyAqR2l0SHViIFBhZ2VzKi4gQXQgdGhlIGVuZCBvZiB0aGUgc2VtZXN0ZXIgeW91ciBmaW5hbCBwcm9qZWN0IHdpbGwgYmUgdG8gZGV2ZWxvcCBtYXRlcmlhbHMgYmFzZWQgb24geW91ciB0aGVzaXMgcmVzZWFyY2guIFNvIGZvciB0aGlzIGV4ZXJjaXNlIEkgd2FudCB5b3UgdG8gY3JlYXRlIGEgcmVwb3NpdG9yeSBhbmQgR2l0SHViIHdlYnBhZ2UgZm9yIHlvdXIgdGhlc2lzIHdvcmsuIFlvdSBzaG91bGQgY3JlYXRlIGEgUkVBRE1FLm1kIGZpbGUgZm9yIHlvdXIgcHJvamVjdCB0aGF0IGluY2x1ZGVzOg0KDQotIFByb2plY3QgVGl0bGUNCi0gUHJvamVjdCBBYnN0cmFjdA0KLSBMaW5rIHRvIHRoZSBHaXRodWIuaW8gcGFnZQ0KLSBSZXBvc2l0b3J5IERlc2NyaXB0aW9uDQotIFJlZmVyZW5jZXMNCg0KVGhpcyByZXBvc2l0b3J5IGFuZCB3ZWJwYWdlIHNob3VsZCBiZSBwZXJpb2RpY2FsbHkgdXBkYXRlZCB0aHJvdWdob3V0IHRoZSByZW1haW5kZXIgb2YgdGhlIHNlbWVzdGVyIGN1bG1pbmF0aW5nIGluIHlvdXIgZmluYWwgcHJvamVjdC4gWW91IHNob3VsZCB0YWtlIGEgbG9vayBhdCB0aGUgdmFyaW91cyBvcHRpb25zIGFuZCBmZWF0dXJlcyAoc3VjaCBhcyB0aGVtZXMsIG5vdGlmaWNhdGlvbnMsIHNvY2lhbCBwcmV2aWV3cywgd2lraXMsIHByb2plY3RzLCBldGMuKSBhdmFpbGFibGUgaW4gPGltZyBzcmM9Imh0dHBzOi8vZ2l0aHViLmdpdGh1YmFzc2V0cy5jb20vaW1hZ2VzL2ljb25zL2Vtb2ppL29jdG9jYXQucG5nIiBhbHQ9IkdpdEh1YiBPY3RvY2F0IiB0aXRsZT0iR2l0SHViIE9jdG9jYXQiIHdpZHRoPTE1IGhlaWdoPTE1Lz4gdG8gY3JlYXRlIGEgdXNlZnVsIHJlcG9zaXRvcnkgZm9yIHNoYXJpbmcgYW5kIG1haW50YWluaW5nIHlvdXIgcHJvamVjdC4gDQoNCiMjIEFkZGl0aW9uYWwgSGVscA0KDQpbQ29sdCBTdGVlbGVdKGh0dHBzOi8vd3d3LnlvdXR1YmUuY29tL2NoYW5uZWwvVUNycUFHVVBQTU9kbzBqZlE2Z3Jpa1p3KSBhZ2FpbiBjYW1lIHRocm91Z2ggd2l0aCBhIG5ldyB2aWRlbyBhZnRlciBwcmVzZW50aW5nIHRoaXMgZXhlcmNpc2UgaW4gY2xhc3MuIFRoaXMgKipHaXRIdWIqKiB0dXRvcmlhbCwgY2FsbGVkIFtMZWFybiBHaXRodWIgaW4gMjAgTWludXRlc10oaHR0cHM6Ly93d3cueW91dHViZS5jb20vd2F0Y2g/dj1uaE5xMmtJdmk5cyksIHdhbGtzIHlvdSB0aHJvdWdoIG1hbnkgb2YgdGhlIHN0ZXBzIHdlIGRpc2N1c3NlZCBpbiBjbGFzcyBhbmQgY292ZXJzIHRvcGljcyB0aGF0IGFyZSBzbGlnaHRseSBtb3JlIGFkdmFuY2VkIHRoYXQgeW91IG1pZ2h0IG5lZWQgaW4gdGhlIGZ1dHVyZS4=