Create a free account
in github
Go to https://github.com/ and sign
up
- choose the email address you want to use (it does not need to be
your university address email; you can use a permanent personal email
address, if you want. This will allow you to keep access to your account
should you leave the university)
- choose a strong password - you can remember (note this somewhere
safe)
Create a ssh key on
your computer
- this is done using git bash
- launch git bash (from the windows menu)
- you get a window like that - its called a terminal
- you will write instructions in the terminal - and the computer will
execute those
#
are comments - they are not executed
- type the instructions bellow; note: you need to use the same
email address than the one you used to create the github account. So:
replace
"your_email@example.com"
by your
email.
- press enter between each line.
# show which directory you are on the computer - copy this path in a notepad file
pwd
# if you are working on a windows computer please write this command
git config --global core.autocrlf true # its an additional configuration for the end of lines
# creates a ssh key
ssh-keygen -t ed25519 -C "your_email@example.com"
# press enter at all questions
# do not fill anything, that will be too complicated for a start
This will create a directory called .ssh
# entering the directory
cd .ssh
# list the files in the directory
ls -la
You have now two files in the directory - files functioning as pair
to allow ssh key to authenticate you on cloud services
id_ed25519
which is a private key. You should
NEVER give this key to anyone else, and NEVER upload it anywhere - its
stays on your computer
id_ed25519.pub
is a public key. We can upload the
content of the public key to github.
Those to keys will help identifying you in github, and while using R,
without you having to type passwords all the time.
The principle of usage is that if you provide a public key to a cloud
service (eg. github), it will use this information to authenticate
you.
A caricature is that: the cloud service will ask your
computer if its you trying to authenticate. Because your computer
possesses the private key that is associated to the public key the cloud
services has information about, the computer will answer YES. So the
cloud service will let you in.
(This is why you never give your private key to anybody, its stays on
your computer. If you share it, people will be able to identify as you,
and you do not want that)
Add the SSH public key
to your github account
You will put the information from the public key in the github
account you just created
In git bash get the information of the public key
cat id_ed25519.pub
# it provides text starting by ssh-ed ... and finishing by your email
- logging to your github account
- got to
Settings (your profile > settings)
- then go to
SSH and GPG keys > SSH keys
- click
new ssh key
- give a name to the ssh key
- paste the text that is given by git bash for your public key
(above)
- click add ssh key
- confirm if requested using your password
- Testing if the ssh key works : in git bash type :
say yes … the last line of text should say something like - your
username should be written - then you know it works
Hi <username>! You have successfully authenticated, but GitHub does not provide
shell access.
- creating a configuration file (in git bash)
# go to the home directory
cd
# go to ssh directory
cd .ssh
# creating and opening a config file using a simple text editor : nano
nano config
- Now copy and then paste the following lines (right click) in the
file that is open.
- ! if you used a different path and id of the key put that here (it
gives the directory and prefix where your key pair is stored)
Host [github.com](http://github.com/)
Hostname [github.com](http://github.com/)
IdentityFile ~/.ssh/id_ed25519
- NB: The symbol
^
means the touch ctrl
(no
need of capital letters here)
- We save the file using
ctr+O
it ask to write config : this is correct (note this is correct that
there is no extension) - press enter. It said it wrote 3 lines.
- Now we close it using
ctrl+X
- we should return to git
bash window. We have now a file that is called config
NB:
Create a repository on
github
- got back to your main github page
- click on new to create a new repository
- create a new repository (you can choose own name and description -
we will use for the course - do not have space between words in the
repository name) and otherwise use the same options I did use
7. Final setup : Making
git, github and R work together
Create a directory where you will be able to have your R projects on
your PC. Example I created one in Documents
and called it
my_projects
- right click on
my_projects
and open with “git bash
here”
This allows you to open “git bash” in the my_project directory. You
can verify the path using pwd
which is path of the working
(current) directory. (All good. ! )
We will create a directory inside by something that is called
“cloning a github repository” - basically we will create a directory
that allows to link a repository in github (also called remote) to a
directory on your local PC (origin). For now, just let git bash window
open
- go to github and look at the repository you created (I called it
learning_R). It should look like something like that:
- click on the green code button, go to SSH and copy(the two windows
on the right)
- go back to git bash windows that is still opened and type
git clone
then paste (right click paste) the instruction
you just copied for me it give that, and press enter. If it indicates
that it received object its all good.
Now you can look you have a sub-directory in my_projects
- this sub-directory has the name of the github repository
learning_R
… and you will be able to write your code in
this directory with R, and save the code and track changes, and this we
will learn how to synchronize with github for version control.
Go to the directory. It should contain the following files, and a
sub-directory called .git (this is the directory that does the version
tracking).
We will have an brief overview of what those files are during the
course.
- now we will create a R project in this sub-directory, so you can
write the code during the course. Go back to Rstudio, and do
File > New project
then choose
Existing Directory
and in the explorer choose the directory
we just created from github learning_R
for me.
- The click create project.
- Now you can see that you are in the project with this panel
- if you click on README.md you will
see it contains the description that we entered into github.
- You can now close Rstudio for now.
If you managed to reach this stage, well, you already have done the
most difficult and most boring part alone.
If not, do not worry, please tell me where you stopped so we can have a
look during the meeting online.
Back to Index
LS0tDQp0aXRsZTogImByIHBhcmFtcyR0aXRsZWAiDQpkYXRlOiAiYHIgZm9ybWF0KFN5cy50aW1lKCksICclZCAlQiwgJVknKWAiDQphdXRob3I6IEV2ZSBaZXlsIEZpc2tlYmVjaw0KcGFyYW1zOg0KICB0aXRsZTogIkdpdCwgR2l0aHViLCBTU0ggYW5kIHNldHVwIFItZ2l0aHViIiANCiAgcHJvamVjdF9wYXRoOiAiYHIgaGVyZTo6aGVyZSgpYCINCiAgDQprbml0OiAoZnVuY3Rpb24oaW5wdXRGaWxlLCBlbmNvZGluZykgew0KICBybWFya2Rvd246OnJlbmRlcihpbnB1dEZpbGUsIGVuY29kaW5nID0gZW5jb2RpbmcsIG91dHB1dF9kaXIgPSAiLi4vLi4vZG9jcyIpIH0pDQogIA0Kb3V0cHV0OiANCiAgcm1kZm9ybWF0czo6cmVhZHRoZWRvd246DQogICAgICBjc3M6IC4uL3N0eWxlcy9zdHlsZS5jc3MNCiAgICAgIHNlbGZfY29udGFpbmVkOiB0cnVlDQogICAgICBjb2RlX2Rvd25sb2FkOiB0cnVlDQogICAgICB0b2NfZGVwdGg6IDQNCiAgICAgIGRmX3ByaW50OiBwYWdlZA0KICAgICAgY29kZV9mb2xkaW5nOiBzaG93DQogICAgICBhdXRob3I6IHBhcmFtcyRhdXRob3INCiAgICAgIGhpZ2hsaWdodDogZXNwcmVzc28NCiAgICAgIG51bWJlcl9zZWN0aW9uczogdHJ1ZQ0KDQogIA0KZWRpdG9yX29wdGlvbnM6IA0KICBtYXJrZG93bjogDQogICAgd3JhcDogNzINCi0tLQ0KDQojIERvd25sb2FkIGFuZCBpbnN0YWxsIGdpdC1iYXNoDQoNCkF0IFtodHRwczovL2dpdC1zY20uY29tL10oaHR0cHM6Ly9naXQtc2NtLmNvbS8pIGFuZCANCmZvbGxvdyB0aGUgaW5zdHJ1Y3Rpb25zIGZvciBpbnN0YWxsYXRpb24gDQoNCi0tLQ0KDQojIENyZWF0ZSBhIGZyZWUgYWNjb3VudCBpbiBnaXRodWINCg0KR28gdG8gW2h0dHBzOi8vZ2l0aHViLmNvbS9dKGh0dHBzOi8vZ2l0aHViLmNvbS8pIGFuZCBzaWduIHVwICANCg0KLSBjaG9vc2UgdGhlIGVtYWlsIGFkZHJlc3MgeW91IHdhbnQgdG8gdXNlIChpdCBkb2VzIG5vdCBuZWVkIHRvIGJlIHlvdXIgdW5pdmVyc2l0eSANCmFkZHJlc3MgZW1haWw7IHlvdSBjYW4gdXNlIGEgcGVybWFuZW50IHBlcnNvbmFsIGVtYWlsIGFkZHJlc3MsIGlmIHlvdSB3YW50LiBUaGlzIA0Kd2lsbCBhbGxvdyB5b3UgdG8ga2VlcCBhY2Nlc3MgdG8geW91ciBhY2NvdW50IHNob3VsZCB5b3UgbGVhdmUgdGhlIHVuaXZlcnNpdHkpDQotIGNob29zZSBhIHN0cm9uZyBwYXNzd29yZCAtIHlvdSBjYW4gcmVtZW1iZXIgKG5vdGUgdGhpcyBzb21ld2hlcmUgc2FmZSkNCg0KLS0tDQoNCiMgQ3JlYXRlIGEgc3NoIGtleSBvbiB5b3VyIGNvbXB1dGVyDQoNCi0gdGhpcyBpcyBkb25lIHVzaW5nIGdpdCBiYXNoDQogICAgLSBsYXVuY2ggZ2l0IGJhc2ggKGZyb20gdGhlIHdpbmRvd3MgbWVudSkNCg0KIVtdKC4vaW1hZ2VzL2ltYWdlLnBuZykNCg0KICAtIHlvdSBnZXQgYSB3aW5kb3cgbGlrZSB0aGF0IC0gaXRzIGNhbGxlZCBhIHRlcm1pbmFsDQogICAgDQohW10oLi9pbWFnZXMvaW1hZ2UxLnBuZykNCiAgICANCiAgLSB5b3Ugd2lsbCB3cml0ZSBpbnN0cnVjdGlvbnMgaW4gdGhlIHRlcm1pbmFsIC0gYW5kIHRoZSBjb21wdXRlciB3aWxsIGV4ZWN1dGUgdGhvc2UNCiAgLSBgI2AgIGFyZSBjb21tZW50cyAtIHRoZXkgYXJlIG5vdCBleGVjdXRlZA0KICAtICoqdHlwZSB0aGUgaW5zdHJ1Y3Rpb25zIGJlbGxvdzsgbm90ZTogeW91IG5lZWQgdG8gdXNlIHRoZSBzYW1lIGVtYWlsIGFkZHJlc3MgDQogIHRoYW4gdGhlIG9uZSB5b3UgdXNlZCB0byBjcmVhdGUgdGhlIGdpdGh1YiBhY2NvdW50LiBTbzogcmVwbGFjZSoqIA0KICAgIGAieW91cl9lbWFpbEBleGFtcGxlLmNvbSJgIGJ5IHlvdXIgZW1haWwuDQogIC0gKipwcmVzcyBlbnRlciBiZXR3ZWVuIGVhY2ggbGluZS4qKg0KDQpgYGBiYXNoDQojIHNob3cgd2hpY2ggZGlyZWN0b3J5IHlvdSBhcmUgb24gdGhlIGNvbXB1dGVyIC0gY29weSB0aGlzIHBhdGggaW4gYSBub3RlcGFkIGZpbGUNCnB3ZCANCg0KIyBpZiB5b3UgYXJlIHdvcmtpbmcgb24gYSB3aW5kb3dzIGNvbXB1dGVyIHBsZWFzZSB3cml0ZSB0aGlzIGNvbW1hbmQgDQpnaXQgY29uZmlnIC0tZ2xvYmFsIGNvcmUuYXV0b2NybGYgdHJ1ZSAjIGl0cyBhbiBhZGRpdGlvbmFsIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBlbmQgb2YgbGluZXMNCg0KIyBjcmVhdGVzIGEgc3NoIGtleQ0Kc3NoLWtleWdlbiAtdCBlZDI1NTE5IC1DICJ5b3VyX2VtYWlsQGV4YW1wbGUuY29tIg0KDQojIHByZXNzIGVudGVyIGF0IGFsbCBxdWVzdGlvbnMgDQojIGRvIG5vdCBmaWxsIGFueXRoaW5nLCB0aGF0IHdpbGwgYmUgdG9vIGNvbXBsaWNhdGVkIGZvciBhIHN0YXJ0DQpgYGANCg0KVGhpcyB3aWxsIGNyZWF0ZSBhIGRpcmVjdG9yeSBjYWxsZWQgYC5zc2hgIA0KDQpgYGBiYXNoDQojIGVudGVyaW5nIHRoZSBkaXJlY3RvcnkgDQpjZCAuc3NoDQoNCiMgbGlzdCB0aGUgZmlsZXMgaW4gdGhlIGRpcmVjdG9yeQ0KbHMgLWxhIA0KYGBgDQoNCllvdSBoYXZlIG5vdyB0d28gZmlsZXMgaW4gdGhlIGRpcmVjdG9yeSAtIGZpbGVzIGZ1bmN0aW9uaW5nIGFzIHBhaXIgdG8gYWxsb3cgc3NoIA0Ka2V5IHRvIGF1dGhlbnRpY2F0ZSB5b3Ugb24gY2xvdWQgc2VydmljZXMNCg0KLSBgaWRfZWQyNTUxOWAgIHdoaWNoIGlzIGEgcHJpdmF0ZSBrZXkuICAqKllvdSBzaG91bGQgTkVWRVIgZ2l2ZSB0aGlzIGtleSB0byANCmFueW9uZSBlbHNlLCBhbmQgTkVWRVIgdXBsb2FkIGl0IGFueXdoZXJlIC0gaXRzIHN0YXlzIG9uIHlvdXIgY29tcHV0ZXIqKg0KLSBgaWRfZWQyNTUxOS5wdWJgIGlzIGEgcHVibGljIGtleS4gV2UgY2FuIHVwbG9hZCB0aGUgY29udGVudCBvZiB0aGUgcHVibGljIGtleSANCnRvIGdpdGh1Yi4NCg0KVGhvc2UgdG8ga2V5cyB3aWxsIGhlbHAgaWRlbnRpZnlpbmcgeW91IGluIGdpdGh1YiwgYW5kIHdoaWxlIHVzaW5nIFIsIHdpdGhvdXQgDQp5b3UgaGF2aW5nIHRvIHR5cGUgcGFzc3dvcmRzIGFsbCB0aGUgdGltZS4gDQoNClRoZSBwcmluY2lwbGUgb2YgdXNhZ2UgaXMgdGhhdCBpZiB5b3UgcHJvdmlkZSBhIHB1YmxpYyBrZXkgdG8gYSBjbG91ZCBzZXJ2aWNlIA0KKGVnLiBnaXRodWIpLCBpdCB3aWxsIHVzZSB0aGlzIGluZm9ybWF0aW9uIHRvIGF1dGhlbnRpY2F0ZSB5b3UuIA0KDQoqKkEgY2FyaWNhdHVyZSBpcyB0aGF0OiB0aGUgY2xvdWQgc2VydmljZSB3aWxsIGFzayB5b3VyIGNvbXB1dGVyIGlmIGl0cyB5b3UgDQp0cnlpbmcgdG8gYXV0aGVudGljYXRlLiBCZWNhdXNlIHlvdXIgY29tcHV0ZXIgcG9zc2Vzc2VzIHRoZSBwcml2YXRlIGtleSB0aGF0IGlzIA0KYXNzb2NpYXRlZCB0byB0aGUgcHVibGljIGtleSB0aGUgY2xvdWQgc2VydmljZXMgaGFzIGluZm9ybWF0aW9uIGFib3V0LCB0aGUgDQpjb21wdXRlciB3aWxsIGFuc3dlciBZRVMuIFNvIHRoZSBjbG91ZCBzZXJ2aWNlIHdpbGwgbGV0IHlvdSBpbi4qKiANCg0KKFRoaXMgaXMgd2h5IHlvdSBuZXZlciBnaXZlIHlvdXIgcHJpdmF0ZSBrZXkgdG8gYW55Ym9keSwgaXRzIHN0YXlzIG9uIHlvdXIgDQpjb21wdXRlci4gSWYgeW91IHNoYXJlIGl0LCBwZW9wbGUgd2lsbCBiZSBhYmxlIHRvIGlkZW50aWZ5IGFzIHlvdSwgYW5kIHlvdSBkbyANCm5vdCB3YW50IHRoYXQpICAgDQoNCi0tLQ0KDQojIEFkZCB0aGUgU1NIIHB1YmxpYyBrZXkgdG8geW91ciBnaXRodWIgYWNjb3VudA0KDQpZb3Ugd2lsbCBwdXQgdGhlIGluZm9ybWF0aW9uIGZyb20gdGhlIHB1YmxpYyBrZXkgaW4gdGhlIGdpdGh1YiBhY2NvdW50IHlvdSBqdXN0IA0KY3JlYXRlZCANCg0KSW4gZ2l0IGJhc2ggZ2V0IHRoZSBpbmZvcm1hdGlvbiBvZiB0aGUgcHVibGljIGtleQ0KDQpgYGBiYXNoDQpjYXQgaWRfZWQyNTUxOS5wdWINCiMgaXQgcHJvdmlkZXMgdGV4dCBzdGFydGluZyBieSBzc2gtZWQgLi4uIGFuZCBmaW5pc2hpbmcgYnkgeW91ciBlbWFpbA0KYGBgDQoNCi0gbG9nZ2luZyB0byB5b3VyIGdpdGh1YiBhY2NvdW50DQotIGdvdCB0byBgU2V0dGluZ3MgKHlvdXIgcHJvZmlsZSA+IHNldHRpbmdzKWANCg0KIVtdKC4vaW1hZ2VzL2ltYWdlMi5wbmcpDQoNCi0gdGhlbiBnbyB0byBgU1NIIGFuZCBHUEcga2V5cyA+IFNTSCBrZXlzYA0KDQohW10oLi9pbWFnZXMvaW1hZ2UzLnBuZykNCg0KLSBjbGljayBgbmV3IHNzaCBrZXlgDQogICAgLSBnaXZlIGEgbmFtZSB0byB0aGUgc3NoIGtleQ0KICAgIC0gcGFzdGUgdGhlIHRleHQgdGhhdCBpcyBnaXZlbiBieSBnaXQgYmFzaCBmb3IgeW91ciBwdWJsaWMga2V5IChhYm92ZSkNCiAgICAtIGNsaWNrIGFkZCBzc2gga2V5DQogICAgLSBjb25maXJtIGlmIHJlcXVlc3RlZCB1c2luZyB5b3VyIHBhc3N3b3JkDQogICAgDQoNCiFbXSguL2ltYWdlcy9pbWFnZTQucG5nKQ0KICAgIA0KLSBUZXN0aW5nIGlmIHRoZSBzc2gga2V5IHdvcmtzIDogaW4gZ2l0IGJhc2ggdHlwZSA6DQoNCmBgYGJhc2gNCnNzaCAtVCBnaXRAZ2l0aHViLmNvbQ0KYGBgDQoNCnNheSB5ZXMg4oCmIHRoZSBsYXN0IGxpbmUgb2YgdGV4dCBzaG91bGQgc2F5IHNvbWV0aGluZyBsaWtlICAtIHlvdXIgdXNlcm5hbWUgDQpzaG91bGQgYmUgd3JpdHRlbiAtIHRoZW4geW91IGtub3cgaXQgd29ya3MNCg0KYGBgYmFzaA0KSGkgPHVzZXJuYW1lPiEgWW91IGhhdmUgc3VjY2Vzc2Z1bGx5IGF1dGhlbnRpY2F0ZWQsIGJ1dCBHaXRIdWIgZG9lcyBub3QgcHJvdmlkZSANCnNoZWxsIGFjY2Vzcy4NCmBgYA0KDQotLS0NCg0KLSBjcmVhdGluZyBhIGNvbmZpZ3VyYXRpb24gZmlsZSAoaW4gZ2l0IGJhc2gpDQogICAgDQpgYGBiYXNoDQojIGdvIHRvIHRoZSBob21lIGRpcmVjdG9yeQ0KY2QgDQojIGdvIHRvIHNzaCBkaXJlY3RvcnkNCmNkIC5zc2gNCiMgY3JlYXRpbmcgYW5kIG9wZW5pbmcgYSBjb25maWcgZmlsZSB1c2luZyBhIHNpbXBsZSB0ZXh0IGVkaXRvciA6IG5hbm8NCm5hbm8gY29uZmlnIA0KYGBgDQoNCi0gTm93IGNvcHkgYW5kIHRoZW4gcGFzdGUgdGhlIGZvbGxvd2luZyBsaW5lcyAocmlnaHQgY2xpY2spIGluIHRoZSBmaWxlIHRoYXQgaXMgDQpvcGVuLg0KICAgIC0gISBpZiB5b3UgdXNlZCBhIGRpZmZlcmVudCBwYXRoIGFuZCBpZCBvZiB0aGUga2V5IHB1dCB0aGF0IGhlcmUgKGl0IGdpdmVzIA0KICAgIHRoZSBkaXJlY3RvcnkgYW5kIHByZWZpeCB3aGVyZSB5b3VyIGtleSBwYWlyIGlzIHN0b3JlZCkNCg0KYGBgYmFzaA0KSG9zdCBbZ2l0aHViLmNvbV0oaHR0cDovL2dpdGh1Yi5jb20vKQ0KSG9zdG5hbWUgW2dpdGh1Yi5jb21dKGh0dHA6Ly9naXRodWIuY29tLykNCklkZW50aXR5RmlsZSB+Ly5zc2gvaWRfZWQyNTUxOSANCmBgYA0KDQohW10oLi9pbWFnZXMvaW1hZ2U1LnBuZykNCg0KLSBOQjogVGhlIHN5bWJvbCBgXmAgbWVhbnMgdGhlIHRvdWNoIGBjdHJsYCAobm8gbmVlZCBvZiBjYXBpdGFsIGxldHRlcnMgaGVyZSkNCi0gV2Ugc2F2ZSB0aGUgZmlsZSB1c2luZyBgY3RyK09gDQogICAgDQohW10oLi9pbWFnZXMvaW1hZ2U2LnBuZykNCiAgICANCg0KaXQgYXNrIHRvIHdyaXRlIGNvbmZpZyAgOiB0aGlzIGlzIGNvcnJlY3QgKG5vdGUgdGhpcyBpcyBjb3JyZWN0IHRoYXQgdGhlcmUgaXMgDQpubyBleHRlbnNpb24pIC0gcHJlc3MgZW50ZXIuIEl0IHNhaWQgaXQgd3JvdGUgMyBsaW5lcy4gDQoNCiFbXSguL2ltYWdlcy9pbWFnZTcucG5nKQ0KDQotIE5vdyB3ZSBjbG9zZSBpdCB1c2luZyAgYGN0cmwrWGAgLSB3ZSBzaG91bGQgcmV0dXJuIHRvIGdpdCBiYXNoIHdpbmRvdy4gV2UgaGF2ZSANCm5vdyBhIGZpbGUgdGhhdCBpcyBjYWxsZWQgY29uZmlnDQoNCiFbXSguL2ltYWdlcy9pbWFnZTgucG5nKQ0KDQotLS0NCg0KTkI6IA0KDQotIElmIHlvdSB3aXNoLCB5b3UgY2FuIGVnLiByZWFkIG1vcmUgb24gaG93IHNzaC1rZXlzIHdvcmsgaGVyZSA6ICBbaHR0cHM6Ly93d3cuc2VjdGlnby5jb20vcmVzb3VyY2UtbGlicmFyeS93aGF0LWlzLWFuLXNzaC1rZXldKGh0dHBzOi8vd3d3LnNlY3RpZ28uY29tL3Jlc291cmNlLWxpYnJhcnkvd2hhdC1pcy1hbi1zc2gta2V5KQ0KLSBUaGlzIHR1dG9yaWFsIGlzIGFuIGV4dHJhY3Qgb2YgdGhlIGd1aWRlbGluZXMgcHJvdmlkZWQgaGVyZTogW2h0dHBzOi8vZG9jcy5naXRodWIuY29tL2VuL2F1dGhlbnRpY2F0aW9uL2Nvbm5lY3RpbmctdG8tZ2l0aHViLXdpdGgtc3NoL2dlbmVyYXRpbmctYS1uZXctc3NoLWtleS1hbmQtYWRkaW5nLWl0LXRvLXRoZS1zc2gtYWdlbnRdKGh0dHBzOi8vZG9jcy5naXRodWIuY29tL2VuL2F1dGhlbnRpY2F0aW9uL2Nvbm5lY3RpbmctdG8tZ2l0aHViLXdpdGgtc3NoL2dlbmVyYXRpbmctYS1uZXctc3NoLWtleS1hbmQtYWRkaW5nLWl0LXRvLXRoZS1zc2gtYWdlbnQpDQoNCi0tLQ0KDQojIENyZWF0ZSBhIHJlcG9zaXRvcnkgb24gZ2l0aHViDQoNCi0gZ290IGJhY2sgdG8geW91ciBtYWluIGdpdGh1YiBwYWdlDQoNCiFbXSguL2ltYWdlcy9pbWFnZTkucG5nKQ0KDQotIGNsaWNrIG9uIG5ldyB0byBjcmVhdGUgYSBuZXcgcmVwb3NpdG9yeQ0KLSBjcmVhdGUgYSBuZXcgcmVwb3NpdG9yeSAoeW91IGNhbiBjaG9vc2Ugb3duIG5hbWUgYW5kIGRlc2NyaXB0aW9uIC0gDQp3ZSB3aWxsIHVzZSBmb3IgdGhlIGNvdXJzZSAtIGRvIG5vdCBoYXZlIHNwYWNlIGJldHdlZW4gd29yZHMgaW4gdGhlIHJlcG9zaXRvcnkgDQpuYW1lKSBhbmQgb3RoZXJ3aXNlIHVzZSB0aGUgc2FtZSBvcHRpb25zIEkgZGlkIHVzZQ0KDQohW10oLi9pbWFnZXMvaW1hZ2UxMC5wbmcpDQoNCi0tLQ0KDQojIENvbmZpZ3VyZSBSIHRvIHVzZSB5b3VyIFNTSCBrZXkgYW5kIGdpdGh1Yg0KDQotIGFmdGVyIGhhdmluZyBpbnN0YWxsZWQgUiBhbmQgUnN0dWRpbyAoaWYgeW91IGRpZCBub3QgeWV0LCBkbyBzbykgYW5kIHRoZSANCnByZXZpb3VzIGFjdGlvbnMgYWJvdmUNCi0gbGF1bmNoIFJzdHVkaW8NCi0gZ28gdG8gYFRvb2xzID4gR2xvYmFsIE9wdGlvbnMgPiBHaXQvU1ZOYA0KICAgIC0gdmVyaWZ5IHRoYXQgdGhlIHBhdGggaW4g4oCcR2l0IGV4ZWN1dGFibGUgaXMgY29ycmVjdOKAnSAobWluZSBpcyANCiAgICBgQzovUHJvZ3JhbSBGaWxlcy9HaXQvYmluL2dpdC5leGUpYA0KICAgIC0gdmVyaWZ5IHRoYXQgdGhlIHNzaCBrZXkgcGF0aCBpcyBjb3JyZWN0KG1pbmUgaXMgDQogICAgYEM6L1VzZXJzL3VzZXJuYW1lLy5zc2gvaWRfZWQyNTUxOWAgICksIHRoaXMgY29ycmVzcG9uZHMgdG8gdGhlIHBhdGggDQogICAgc2hvd24gaW4gZ2l0IGJhc2gNCiAgICANCmBgYGJhc2gNCnB3ZA0KL2MvVXNlcnMvdXNlcm5hbWUvLnNzaA0KYGBgDQogICAgDQotIHByZXNzIGFwcGx5IGlmIHlvdSBjaGFuZ2VkIHNvbWV0aGluZywgb3RoZXJ3aXNlIDogY2FuY2VsDQoNCk5COiBIZXJlIGlzIHRoZSBuZXcgbGluayBvZiBSIGFuZCB2ZXJzaW9uIGNvbnRyb2wgdXNhZ2UgKGluIGNhc2UpIFtodHRwczovL2RvY3MucG9zaXQuY28vaWRlL3VzZXIvaWRlL2d1aWRlL3Rvb2xzL3ZlcnNpb24tY29udHJvbC5odG1sXShodHRwczovL2RvY3MucG9zaXQuY28vaWRlL3VzZXIvaWRlL2d1aWRlL3Rvb2xzL3ZlcnNpb24tY29udHJvbC5odG1sKQ0KDQotLS0NCg0KIyA3LiBGaW5hbCBzZXR1cCA6IE1ha2luZyBnaXQsIGdpdGh1YiBhbmQgUiB3b3JrIHRvZ2V0aGVyDQoNCkNyZWF0ZSBhIGRpcmVjdG9yeSB3aGVyZSB5b3Ugd2lsbCBiZSBhYmxlIHRvIGhhdmUgeW91ciBSIHByb2plY3RzIG9uIHlvdXIgUEMuIA0KRXhhbXBsZSBJIGNyZWF0ZWQgb25lIGluIGBEb2N1bWVudHNgIGFuZCBjYWxsZWQgaXQgYG15X3Byb2plY3RzYA0KDQotIHJpZ2h0IGNsaWNrIG9uIGBteV9wcm9qZWN0c2AgYW5kIG9wZW4gd2l0aCDigJxnaXQgYmFzaCBoZXJl4oCdDQoNCiFbXSguL2ltYWdlcy9pbWFnZTExLnBuZykNCg0KVGhpcyBhbGxvd3MgeW91IHRvIG9wZW4g4oCcZ2l0IGJhc2jigJ0gaW4gdGhlIG15X3Byb2plY3QgZGlyZWN0b3J5LiBZb3UgY2FuIHZlcmlmeSANCnRoZSBwYXRoIHVzaW5nIGBwd2RgIHdoaWNoIGlzIHBhdGggb2YgdGhlIHdvcmtpbmcgKGN1cnJlbnQpIGRpcmVjdG9yeS4gDQooQWxsIGdvb2QuICEgKQ0KDQohW10oLi9pbWFnZXMvaW1hZ2UxMi5wbmcpDQoNCldlIHdpbGwgY3JlYXRlIGEgZGlyZWN0b3J5IGluc2lkZSBieSBzb21ldGhpbmcgdGhhdCBpcyBjYWxsZWQg4oCcY2xvbmluZyBhIGdpdGh1YiANCnJlcG9zaXRvcnnigJ0gIC0gYmFzaWNhbGx5IHdlIHdpbGwgY3JlYXRlIGEgZGlyZWN0b3J5IHRoYXQgYWxsb3dzIHRvIGxpbmsgYSANCnJlcG9zaXRvcnkgaW4gZ2l0aHViIChhbHNvIGNhbGxlZCByZW1vdGUpIHRvIGEgZGlyZWN0b3J5IG9uIHlvdXIgbG9jYWwgUEMgDQoob3JpZ2luKS4gDQpGb3Igbm93LCBqdXN0IGxldCBnaXQgYmFzaCB3aW5kb3cgb3Blbg0KDQotIGdvIHRvIGdpdGh1YiBhbmQgbG9vayBhdCB0aGUgcmVwb3NpdG9yeSB5b3UgY3JlYXRlZCAoSSBjYWxsZWQgaXQgbGVhcm5pbmdfUikuIA0KSXQgc2hvdWxkIGxvb2sgbGlrZSBzb21ldGhpbmcgbGlrZSB0aGF0OiANCg0KIVtdKC4vaW1hZ2VzL2ltYWdlMTMucG5nKQ0KDQotIGNsaWNrIG9uIHRoZSBncmVlbiBjb2RlIGJ1dHRvbiwgZ28gdG8gU1NIIGFuZCBjb3B5KHRoZSB0d28gd2luZG93cyBvbiB0aGUgcmlnaHQpDQoNCiFbXSguL2ltYWdlcy9pbWFnZTE0LnBuZykNCg0KLSBnbyBiYWNrIHRvIGdpdCBiYXNoIHdpbmRvd3MgdGhhdCBpcyBzdGlsbCBvcGVuZWQgYW5kIHR5cGUgYGdpdCBjbG9uZWAgdGhlbiANCnBhc3RlIChyaWdodCBjbGljayBwYXN0ZSkgdGhlIGluc3RydWN0aW9uIHlvdSBqdXN0IGNvcGllZCBmb3IgbWUgaXQgZ2l2ZSB0aGF0LCANCmFuZCBwcmVzcyBlbnRlci4gSWYgaXQgaW5kaWNhdGVzIHRoYXQgaXQgcmVjZWl2ZWQgb2JqZWN0IGl0cyBhbGwgZ29vZC4NCg0KIVtdKC4vaW1hZ2VzL2ltYWdlMTUucG5nKQ0KDQpOb3cgeW91IGNhbiBsb29rIHlvdSBoYXZlIGEgc3ViLWRpcmVjdG9yeSBpbiBgbXlfcHJvamVjdHNgIC0gdGhpcyBzdWItZGlyZWN0b3J5IA0KaGFzIHRoZSBuYW1lIG9mIHRoZSBnaXRodWIgcmVwb3NpdG9yeSBgbGVhcm5pbmdfUmAg4oCmIGFuZCB5b3Ugd2lsbCBiZSBhYmxlIHRvIA0Kd3JpdGUgeW91ciBjb2RlIGluIHRoaXMgZGlyZWN0b3J5IHdpdGggUiwgYW5kIHNhdmUgdGhlIGNvZGUgYW5kIHRyYWNrIGNoYW5nZXMsIA0KYW5kIHRoaXMgd2Ugd2lsbCBsZWFybiBob3cgdG8gc3luY2hyb25pemUgd2l0aCBnaXRodWIgZm9yIHZlcnNpb24gY29udHJvbC4NCg0KR28gdG8gdGhlIGRpcmVjdG9yeS4gSXQgc2hvdWxkIGNvbnRhaW4gdGhlIGZvbGxvd2luZyBmaWxlcywgYW5kIGEgc3ViLWRpcmVjdG9yeSANCmNhbGxlZCAuZ2l0ICh0aGlzIGlzIHRoZSBkaXJlY3RvcnkgdGhhdCBkb2VzIHRoZSB2ZXJzaW9uIHRyYWNraW5nKS4gDQoNCiFbXSguL2ltYWdlcy9pbWFnZTE2LnBuZykNCg0KV2Ugd2lsbCBoYXZlIGFuIGJyaWVmIG92ZXJ2aWV3IG9mIHdoYXQgdGhvc2UgZmlsZXMgYXJlIGR1cmluZyB0aGUgY291cnNlLiANCg0KLSBub3cgd2Ugd2lsbCBjcmVhdGUgYSBSIHByb2plY3QgaW4gdGhpcyBzdWItZGlyZWN0b3J5LCBzbyB5b3UgY2FuIHdyaXRlIHRoZSBjb2RlIA0KZHVyaW5nIHRoZSBjb3Vyc2UuIEdvIGJhY2sgdG8gUnN0dWRpbywgYW5kIGRvICBgRmlsZSA+IE5ldyBwcm9qZWN0YCB0aGVuIA0KY2hvb3NlIGBFeGlzdGluZyBEaXJlY3RvcnlgICBhbmQgaW4gdGhlIGV4cGxvcmVyIGNob29zZSB0aGUgZGlyZWN0b3J5IHdlIGp1c3QgDQpjcmVhdGVkIGZyb20gZ2l0aHViIGBsZWFybmluZ19SYCBmb3IgbWUuDQoNCiFbXSguL2ltYWdlcy9pbWFnZTE3LnBuZykNCg0KLSBUaGUgY2xpY2sgY3JlYXRlIHByb2plY3QuDQotIE5vdyB5b3UgY2FuIHNlZSB0aGF0IHlvdSBhcmUgaW4gdGhlIHByb2plY3Qgd2l0aCB0aGlzIHBhbmVsDQoNCiFbXSguL2ltYWdlcy9pbWFnZTE4LnBuZykNCg0KLSBpZiB5b3UgY2xpY2sgb24gW1JFQURNRS5tZF0oaHR0cDovL1JFQURNRS5tZCkgeW91IHdpbGwgc2VlIGl0IGNvbnRhaW5zIHRoZSANCmRlc2NyaXB0aW9uIHRoYXQgd2UgZW50ZXJlZCBpbnRvIGdpdGh1Yi4NCi0gWW91IGNhbiBub3cgY2xvc2UgUnN0dWRpbyBmb3Igbm93Lg0KDQpJZiB5b3UgbWFuYWdlZCB0byByZWFjaCB0aGlzIHN0YWdlLCB3ZWxsLCB5b3UgYWxyZWFkeSBoYXZlIGRvbmUgdGhlIG1vc3QgDQpkaWZmaWN1bHQgYW5kIG1vc3QgYm9yaW5nIHBhcnQgYWxvbmUuICANCklmIG5vdCwgZG8gbm90IHdvcnJ5LCBwbGVhc2UgdGVsbCBtZSB3aGVyZSB5b3Ugc3RvcHBlZCBzbyB3ZSBjYW4gaGF2ZSBhIGxvb2sgDQpkdXJpbmcgdGhlIG1lZXRpbmcgb25saW5lLg0KDQpCYWNrIHRvIFtJbmRleF0oaW5kZXguaHRtbCk=